From 7c35cde66af952b27bde0ba9200420ba6138bde2 Mon Sep 17 00:00:00 2001 From: Jamie Folsom Date: Tue, 2 Apr 2013 14:41:51 -0400 Subject: [PATCH 01/18] Add config. --- config.js | 12 ++++++++++++ config.sample.js | 12 ++++++++++++ web.js | 30 +++++++++++------------------- 3 files changed, 35 insertions(+), 19 deletions(-) create mode 100644 config.js create mode 100644 config.sample.js diff --git a/config.js b/config.js new file mode 100644 index 0000000..ecee84f --- /dev/null +++ b/config.js @@ -0,0 +1,12 @@ +var config = {} + +config.secret = 'your-secret'; +config.consumer = 'annotationstudio'; +config.api = {}; +config.api.version = '1.0'; +config.mongodb = {}; +config.mongodb.live = 'mongodb://heroku_app5176464:1e86dpt7qi3folobb3t63kqrlq@ds033907.mongolab.com:33907/heroku_app5176464'; +config.mongodb.local = 'mongodb://localhost/annotationdb'; +config.mongodb.staging = 'mongodb://heroku_app6335855:ajc6b1a5f3aqkbv7dlrbebv4t1@ds035607.mongolab.com:35607/heroku_app6335855'; + +module.exports = config; diff --git a/config.sample.js b/config.sample.js new file mode 100644 index 0000000..fbdbef0 --- /dev/null +++ b/config.sample.js @@ -0,0 +1,12 @@ +var config = {} + +config.secret = 'your-secret'; +config.consumer = 'your-app-name'; +config.api = {}; +config.api.version = '1.0'; +config.mongodb = {}; +config.mongodb.live = 'mongodb://user:pass@host.domain.com:port/dbname' +config.mongodb.local = 'mongodb://localhost/dbname' +config.mongodb.staging = 'mongodb://user:pass@host.domain.com:port/staging-dbname' + +module.exports = config; diff --git a/web.js b/web.js index 9688ce2..c9b9c19 100644 --- a/web.js +++ b/web.js @@ -1,16 +1,15 @@ +// Setup var application_root = __dirname, + config = require("./config"), express = require("express"), path = require("path"), - mongoose = require('mongoose'); - -var lessMiddleware = require('less-middleware'); - -var express = require("express"); -var app = express(); + mongoose = require('mongoose'), + lessMiddleware = require('less-middleware'), + jwt = require('jwt-simple'), + secret = config.secret, + app = express(); // Authentication -var jwt = require('jwt-simple'); -var secret = 'secretgoeshere'; function tokenOK (req, res, next) { try { var decoded = jwt.decode(req.header('x-annotator-auth-token'), secret); @@ -54,15 +53,8 @@ var allowCrossDomain = function(req, res, next) { } }; -// database -// local -// mongoose.connect('mongodb://localhost/annotationdb'); -// live -mongoose.connect('mongodb://heroku_app5176464:1e86dpt7qi3folobb3t63kqrlq@ds033907.mongolab.com:33907/heroku_app5176464'); - -// staging -// mongoose.connect('mongodb://heroku_app6335855:ajc6b1a5f3aqkbv7dlrbebv4t1@ds035607.mongolab.com:35607/heroku_app6335855'); - +// DB +mongoose.connect(config.mongodb.live); // config app.configure(function () { @@ -93,8 +85,8 @@ var Ranges = new Schema({ // Annotation Model var Annotation = new Schema({ id: { type: String, required: false }, - consumer: { type: String, default: "annotationstudio" }, - annotator_schema_version: { type: String, required: false, default: "v1.0" }, + consumer: { type: String, default: config.consumer }, + annotator_schema_version: { type: String, required: false, default: config.api.version }, created: { type: Date, default: Date.now() }, updated: { type: Date, default: Date.now() }, user: { type: String, required: false }, From a27e4228d9276a9240f12de2a6fe5faaba449174 Mon Sep 17 00:00:00 2001 From: Jamie Folsom Date: Tue, 2 Apr 2013 14:42:11 -0400 Subject: [PATCH 02/18] Remove unused page. --- public/frontend.html | 167 ------------------------------------------- 1 file changed, 167 deletions(-) delete mode 100644 public/frontend.html diff --git a/public/frontend.html b/public/frontend.html deleted file mode 100644 index 69b1983..0000000 --- a/public/frontend.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - annotat.io - - - - - - - - - - - - - - -
- -
-
-
-

All Annotations

-

- To render the annotation list use the route '#list' following the url for this page -

-
- - - - - - - - - -
-
...
-
-
- - From d43dd684ea2767d5a07e44c72169c70276db4982 Mon Sep 17 00:00:00 2001 From: Jamie Folsom Date: Tue, 2 Apr 2013 14:42:26 -0400 Subject: [PATCH 03/18] Add GPL2 license. --- LICENSE.txt | 339 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 339 insertions(+) create mode 100644 LICENSE.txt diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. From aa2d13a06e4f7ff18303dc203a359b394ee28e15 Mon Sep 17 00:00:00 2001 From: Jamie Folsom Date: Tue, 2 Apr 2013 14:42:44 -0400 Subject: [PATCH 04/18] Update readme. --- README.md | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 0e0f50a..1809abc 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,14 @@ -## Margin Walker -MIT Hyperstudio Data Store for Annotation Studio +# MIT Annotation Data Store +Data Store and RESTful web API for Annotation Studio, compatible with OKFN Annotator. See: https://github.com/okfn/annotator ## Derivation -### Based on this great tutorial by Bill Heaton -http://pixelhandler.com/blog/2012/02/09/develop-a-restful-api-using-node-js-with-express-and-mongoose/ - -### Will eventually be an alternative to annotator-store +### An alternative to OKFN annotator-store https://github.com/okfn/annotator-store ## Dependencies ### OKFN Annotator https://github.com/okfn/annotator/ -### Backbone -http://backbone.js - ### NodeJS http://nodejs.org @@ -27,14 +21,24 @@ http://mongoosejs.com ### MongoDB http://www.mongodb.org -## Heroku Installation -http://heroku.com +## Other +See package.json + +## Installation +```mkdir annotation-api``` +```cd annotation-api``` +```git clone git@github.com:hyperstudio/annotation-api.git``` +```npm install``` +```foreman start``` + +Configure, set up OKFN annotator, with this API as the storage endpoint. ## Author -- Jamie Folsom -- MIT HyperStudio +- Lab: MIT HyperStudio - http://hyperstudio.mit.edu/ +- Developer: Jamie Folsom - jfolsom@mit.edu ## License -© MIT 2012 +GPL2 +© MIT 2013 From 586ff152a6e4e64b9948efad9a674b43fdd3ddb5 Mon Sep 17 00:00:00 2001 From: Jamie Folsom Date: Tue, 2 Apr 2013 14:43:11 -0400 Subject: [PATCH 05/18] Update commentary, logging, remove unused routes. --- web.js | 68 +++++----------------------------------------------------- 1 file changed, 5 insertions(+), 63 deletions(-) diff --git a/web.js b/web.js index c9b9c19..3b85c00 100644 --- a/web.js +++ b/web.js @@ -1,7 +1,7 @@ // Setup var application_root = __dirname, config = require("./config"), - express = require("express"), + express = require("express"), path = require("path"), mongoose = require('mongoose'), lessMiddleware = require('less-middleware'), @@ -37,6 +37,7 @@ function inWindow (decoded, next) { return ((result > 0) ? true : false); } +// CORS var allowCrossDomain = function(req, res, next) { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Expose-Headers', 'Content-Length, Content-Type, Location'); @@ -58,7 +59,6 @@ mongoose.connect(config.mongodb.live); // config app.configure(function () { - // app.use(tokenOK); app.use(allowCrossDomain); app.use(express.bodyParser()); app.use(express.methodOverride()); @@ -72,9 +72,10 @@ app.configure(function () { app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); }); -var Schema = mongoose.Schema; //Schema.ObjectId +var Schema = mongoose.Schema; // Schemas +// Annotator Ranges var Ranges = new Schema({ start: { type: String, required: true }, end: { type: String, required: true}, @@ -120,7 +121,6 @@ app.get('/api', function (req, res) { }); // Search annotations -// Auth: Token required to search app.get('/api/search', tokenOK, function (req, res) { var query = AnnotationModel.find({'uri': req.query.uri }); @@ -140,7 +140,6 @@ app.get('/api/search', tokenOK, function (req, res) { } if (req.query.sidebar) { - // console.log("Sidebar request: "+ JSON.stringify(req.query)); query.exec(function (err, annotations) { if (!err) { return res.send(annotations); @@ -150,7 +149,6 @@ app.get('/api/search', tokenOK, function (req, res) { }); } else { - // console.log("Non-sidebar request: "+ JSON.stringify(req.query)); query.exec(function (err, annotations) { if (!err) { return res.send({'rows': annotations }); @@ -159,13 +157,10 @@ app.get('/api/search', tokenOK, function (req, res) { } }); } - // if (req.query.permissions[read]) {}; }); // GET to READ // List annotations -// Auth: Anyone can see all annotations (no check for token) -// Why? app.get('/api/annotations', tokenOK, function (req, res) { return AnnotationModel.find(function (err, annotations) { if (!err) { @@ -177,8 +172,6 @@ app.get('/api/annotations', tokenOK, function (req, res) { }); // Single annotation -// Auth: Anyone can see a single annotation (no check for token) -// Why? app.get('/api/annotations/:id', tokenOK, function (req, res) { return AnnotationModel.findById(req.params.id, function (err, annotation) { if (!err) { @@ -190,7 +183,6 @@ app.get('/api/annotations/:id', tokenOK, function (req, res) { }); // POST to CREATE -// Auth: Token required to post an annotation app.post('/api/annotations', tokenOK, function (req, res) { var annotation; console.log("POST: "); @@ -212,7 +204,6 @@ app.post('/api/annotations', tokenOK, function (req, res) { ranges: req.body.ranges, permissions: req.body.permissions }); - // console.log(annotation.permissions.read); annotation.save(function (err) { if (!err) { @@ -226,38 +217,7 @@ app.post('/api/annotations', tokenOK, function (req, res) { }); // PUT to UPDATE -// Bulk update: we won't really be doing this will we? -// Auth: Token required to update all annotations -// Permissions: users can update only their own annotations (handled by annotator) -app.put('/api/annotations', tokenOK, function (req, res) { - var i, len = 0; - console.log("is Array req.body.annotations"); - console.log(Array.isArray(req.body.annotations)); - console.log("PUT: (annotations)"); - console.log(req.body.annotations); - if (Array.isArray(req.body.annotations)) { - len = req.body.annotations.length; - } - for (i = 0; i < len; i++) { - console.log("UPDATE annotation by id:"); - for (var id in req.body.annotations[i]) { - console.log(id); - } - AnnotationModel.update({ "_id": id }, req.body.annotations[i][id], function (err, numAffected) { - if (err) { - console.log("Error on update"); - console.log(err); - } else { - console.log("updated num: " + numAffected); - } - }); - } - return res.send(req.body.annotations); -}); - -// Single update: This is much more likely -// Auth: Token required to update one annotation -// Permissions: users can update only their own annotations (handled by annotator) +// Single update app.put('/api/annotations/:id', tokenOK, function (req, res) { return AnnotationModel.findById(req.params.id, function (err, annotation) { annotation._id = req.body._id; @@ -290,25 +250,7 @@ app.put('/api/annotations/:id', tokenOK, function (req, res) { }); // DELETE to DESTROY -// Bulk destroy all annotations -// Auth: Token required to delete all annotations -// NOTE: Can't think of a good use case -- commenting out. jF 09/06/2010 -// Permissions: user can delete only own annotations (handled by annotator) -// app.delete('/api/annotations', tokenOK, function (req, res) { -// AnnotationModel.remove(function (err) { -// if (!err) { -// console.log("removed"); -// return res.send(''); -// } else { -// console.log(err); -// } -// }); -// }); - - // Remove a single annotation -// Auth: Token required to delete one annotation -// Permissions: user can delete only own annotations (handled by annotator) app.delete('/api/annotations/:id', tokenOK, function (req, res) { return AnnotationModel.findById(req.params.id, function (err, annotation) { return annotation.remove(function (err) { From 2b6aa9eaac197aceeca0f6328b57c485f6591f3a Mon Sep 17 00:00:00 2001 From: Jamie Folsom Date: Tue, 2 Apr 2013 14:44:54 -0400 Subject: [PATCH 06/18] Update .gitignore. --- .gitignore | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index c520c36..d66aeab 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,10 @@ .DS_Store # node noise -# node_modules \ No newline at end of file +# node_modules + +# live config +config.js + +# backups +backups From aee93bfd17d3136e297d7e26a13211bf217983a4 Mon Sep 17 00:00:00 2001 From: Jamie Folsom Date: Tue, 2 Apr 2013 14:47:42 -0400 Subject: [PATCH 07/18] Stop tracking live config. --- config.js | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 config.js diff --git a/config.js b/config.js deleted file mode 100644 index ecee84f..0000000 --- a/config.js +++ /dev/null @@ -1,12 +0,0 @@ -var config = {} - -config.secret = 'your-secret'; -config.consumer = 'annotationstudio'; -config.api = {}; -config.api.version = '1.0'; -config.mongodb = {}; -config.mongodb.live = 'mongodb://heroku_app5176464:1e86dpt7qi3folobb3t63kqrlq@ds033907.mongolab.com:33907/heroku_app5176464'; -config.mongodb.local = 'mongodb://localhost/annotationdb'; -config.mongodb.staging = 'mongodb://heroku_app6335855:ajc6b1a5f3aqkbv7dlrbebv4t1@ds035607.mongolab.com:35607/heroku_app6335855'; - -module.exports = config; From 243c7e1195f3c1e350181eefb13791a26e5ee5f5 Mon Sep 17 00:00:00 2001 From: Jamie Folsom Date: Thu, 4 Apr 2013 11:56:48 -0400 Subject: [PATCH 08/18] Cleanup, fix permissions queries for testing. --- web.js | 250 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 126 insertions(+), 124 deletions(-) diff --git a/web.js b/web.js index 3b85c00..034fb53 100644 --- a/web.js +++ b/web.js @@ -1,41 +1,14 @@ // Setup var application_root = __dirname, - config = require("./config"), - express = require("express"), + config = require("./config"), + express = require("express"), path = require("path"), mongoose = require('mongoose'), - lessMiddleware = require('less-middleware'), - jwt = require('jwt-simple'), - secret = config.secret, - app = express(); - -// Authentication -function tokenOK (req, res, next) { - try { - var decoded = jwt.decode(req.header('x-annotator-auth-token'), secret); - if (inWindow(decoded)) { - console.log("Token in time window"); - } - else { - console.log("Token not in in time window."); - } - next(); - } catch (err) { - console.log("Error decoding token:"); - console.log(err); - return res.send("There was a problem with your authentication token"); - } -}; - -function inWindow (decoded, next) { - var issuedAt = decoded.issuedAt; - var ttl = decoded.ttl; - var issuedSeconds = new Date(issuedAt) / 1000; - var nowSeconds = new Date().getTime() / 1000; - var diff = ((nowSeconds - issuedSeconds)); - var result = (ttl - diff); console.log("Time left on token: about " + Math.floor(result/(60*60)) + " hours."); - return ((result > 0) ? true : false); -} + lessMiddleware = require('less-middleware'), + jwt = require('jwt-simple'), + secret = config.secret, + app = express(), + port = config.port; // CORS var allowCrossDomain = function(req, res, next) { @@ -44,38 +17,20 @@ var allowCrossDomain = function(req, res, next) { res.header('Access-Control-Allow-Headers', 'Content-Length, Content-Type, X-Annotator-Auth-Token, X-Requested-With'); res.header('Access-Control-Allow-Methods', 'GET,POST,PUT,DELETE,OPTIONS'); res.header('Access-Control-Max-Age', '86400'); - + // intercept OPTIONS method if ('OPTIONS' == req.method) { - res.send(200); + res.send(200); } else { - next(); + next(); } }; -// DB -mongoose.connect(config.mongodb.live); - -// config -app.configure(function () { - app.use(allowCrossDomain); - app.use(express.bodyParser()); - app.use(express.methodOverride()); - app.use(app.router); - app.use(lessMiddleware({ - src: __dirname + '/public', - compress: true - })); - - app.use(express.static(path.join(application_root, "public"))); - app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); -}); - +// Schemas var Schema = mongoose.Schema; -// Schemas -// Annotator Ranges +// Annotation Ranges var Ranges = new Schema({ start: { type: String, required: true }, end: { type: String, required: true}, @@ -85,27 +40,47 @@ var Ranges = new Schema({ // Annotation Model var Annotation = new Schema({ - id: { type: String, required: false }, + id: { type: String, required: false }, consumer: { type: String, default: config.consumer }, annotator_schema_version: { type: String, required: false, default: config.api.version }, created: { type: Date, default: Date.now() }, updated: { type: Date, default: Date.now() }, user: { type: String, required: false }, username: { type: String, required: false }, - text: { type: String, required: false }, + text: { type: String, required: false }, quote: { type: String, required: false }, uri: { type: String, required: false }, uuid: { type: String, required: false }, - groups: [String], - subgroups: [String], + groups: [String], + subgroups: [String], ranges: [Ranges], tags: [String], permissions: { - read: [String], - admin: [String], - update: [String], - delete: [String] - } + read: [String], + admin: [String], + update: [String], + delete: [String] + } +}); + +var AnnotationModel = mongoose.model('Annotation', Annotation); + +// DB +mongoose.connect(config.mongodb.live); + +// config +app.configure(function () { + app.use(allowCrossDomain); + app.use(express.bodyParser()); + app.use(express.methodOverride()); + app.use(app.router); + app.use(lessMiddleware({ + src: __dirname + '/public', + compress: true + })); + + app.use(express.static(path.join(application_root, "public"))); + app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); }); Annotation.pre('save', function(next) { @@ -113,61 +88,62 @@ Annotation.pre('save', function(next) { next(); }); -var AnnotationModel = mongoose.model('Annotation', Annotation); - -// REST API root route +// ROUTES app.get('/api', function (req, res) { res.send('Annotations API is running'); }); // Search annotations app.get('/api/search', tokenOK, function (req, res) { - var query = AnnotationModel.find({'uri': req.query.uri }); + var query = AnnotationModel.find({'uri': req.query.uri }); + + switch (req.query.mode) { + case 'user': + query.where('user').equals(req.query.user); + break; + case 'group': + query.where('subgroups').in(req.query.subgroups).$where('this.permissions.read.length < 1'); + break; + case 'class': + query.where('groups').in(req.query.groups).$where('this.permissions.read.length < 1'); + break; + case 'admin': + break; + } - if (req.query.mode === 'user') { - query.where('user').equals(req.query.user); - } - else if (req.query.mode === 'group') { - query.where('subgroups').in(req.query.subgroups); - query.$where('this.permissions.read.length === 0'); - } - else if (req.query.mode === 'class') { - query.where('groups').in(req.query.groups); - query.$where('this.permissions.read.length === 0'); - } - else if (req.query.mode === 'admin') { - // No conditions. - } + //console.log("this: " + this.); - if (req.query.sidebar) { - query.exec(function (err, annotations) { - if (!err) { - return res.send(annotations); - } else { - return console.log(err); - } + if (req.query.sidebar) { + query.exec(function (err, annotations) { + if (!err) { + return res.send(annotations); + } + else { + return console.log(err); + } }); - } - else { + } + else { query.exec(function (err, annotations) { - if (!err) { - return res.send({'rows': annotations }); - } else { - return console.log(err); - } - }); - } + if (!err) { + return res.send({'rows': annotations }); + } + else { + return console.log(err); + } + }); + } }); // GET to READ // List annotations app.get('/api/annotations', tokenOK, function (req, res) { return AnnotationModel.find(function (err, annotations) { - if (!err) { - return res.send(annotations); - } else { - return console.log(err); - } + if (!err) { + return res.send(annotations); + } else { + return console.log(err); + } }); }); @@ -175,9 +151,9 @@ app.get('/api/annotations', tokenOK, function (req, res) { app.get('/api/annotations/:id', tokenOK, function (req, res) { return AnnotationModel.findById(req.params.id, function (err, annotation) { if (!err) { - return res.send(annotation); + return res.send(annotation); } else { - return console.log(err); + return console.log(err); } }); }); @@ -207,9 +183,9 @@ app.post('/api/annotations', tokenOK, function (req, res) { annotation.save(function (err) { if (!err) { - return console.log("Created annotation with uuid: "+ req.body.uuid); + return console.log("Created annotation with uuid: "+ req.body.uuid); } else { - return console.log(err); + return console.log(err); } }); annotation.id = annotation._id; @@ -239,33 +215,59 @@ app.put('/api/annotations/:id', tokenOK, function (req, res) { annotation.permissions = req.body.permissions; return annotation.save(function (err) { - if (!err) { - console.log("updated"); - } else { - console.log(err); - } - return res.send(annotation); + if (!err) { + console.log("updated"); + } else { + console.log(err); + } + return res.send(annotation); }); }); }); -// DELETE to DESTROY -// Remove a single annotation +// Remove an annotation app.delete('/api/annotations/:id', tokenOK, function (req, res) { return AnnotationModel.findById(req.params.id, function (err, annotation) { return annotation.remove(function (err) { - if (!err) { - console.log("removed"); - return res.send(''); - } else { - console.log(err); - } + if (!err) { + console.log("removed"); + return res.send(''); + } else { + console.log(err); + } }); }); }); // launch server -var port = process.env.PORT || 5000; app.listen(port, function() { console.log("Listening on " + port); }); + +// Authentication +function tokenOK (req, res, next) { + try { + var decoded = jwt.decode(req.header('x-annotator-auth-token'), secret); + if (inWindow(decoded)) { + console.log("Token in time window"); + } + else { + console.log("Token not in in time window."); + } + next(); + } catch (err) { + console.log("Error decoding token:"); + console.log(err); + return res.send("There was a problem with your authentication token"); + } +}; + +function inWindow (decoded, next) { + var issuedAt = decoded.issuedAt; + var ttl = decoded.ttl; + var issuedSeconds = new Date(issuedAt) / 1000; + var nowSeconds = new Date().getTime() / 1000; + var diff = ((nowSeconds - issuedSeconds)); + var result = (ttl - diff); console.log("Time left on token: about " + Math.floor(result/(60*60)) + " hours."); + return ((result > 0) ? true : false); +} From 59de51f3ae996277cb56bd189b163b696488c049 Mon Sep 17 00:00:00 2001 From: Jamie Folsom Date: Fri, 5 Apr 2013 16:21:37 -0400 Subject: [PATCH 09/18] Update node modules, clean up config. --- .gitignore | 1 + config.sample.js | 12 - node_modules/express/.travis.yml | 2 +- node_modules/express/History.md | 9 + node_modules/express/Readme.md | 9 +- node_modules/express/bin/express | 32 +- node_modules/express/lib/application.js | 5 +- node_modules/express/lib/express.js | 2 +- node_modules/express/lib/request.js | 5 +- node_modules/express/lib/response.js | 8 +- node_modules/express/lib/utils.js | 8 +- node_modules/express/lib/view.js | 8 +- .../node_modules/buffer-crc32/README.md | 16 +- .../node_modules/buffer-crc32/index.js | 14 +- .../node_modules/buffer-crc32/package.json | 16 +- .../buffer-crc32/tests/crc.test.js | 41 +- .../node_modules/commander/package.json | 3 - .../node_modules/connect/lib-cov/cache.js | 68 - .../node_modules/connect/lib-cov/connect.js | 93 - .../node_modules/connect/lib-cov/index.js | 6 - .../connect/lib-cov/middleware/basicAuth.js | 128 -- .../connect/lib-cov/middleware/bodyParser.js | 43 - .../connect/lib-cov/middleware/compress.js | 159 -- .../lib-cov/middleware/cookieParser.js | 70 - .../lib-cov/middleware/cookieSession.js | 132 -- .../connect/lib-cov/middleware/csrf.js | 51 - .../connect/lib-cov/middleware/directory.js | 256 --- .../lib-cov/middleware/errorHandler.js | 104 - .../connect/lib-cov/middleware/favicon.js | 60 - .../connect/lib-cov/middleware/json.js | 117 - .../connect/lib-cov/middleware/limit.js | 63 - .../connect/lib-cov/middleware/logger.js | 312 --- .../lib-cov/middleware/methodOverride.js | 42 - .../connect/lib-cov/middleware/multipart.js | 183 -- .../connect/lib-cov/middleware/query.js | 27 - .../lib-cov/middleware/responseTime.js | 39 - .../connect/lib-cov/middleware/session.js | 321 --- .../lib-cov/middleware/session/cookie.js | 65 - .../lib-cov/middleware/session/memory.js | 128 -- .../lib-cov/middleware/session/session.js | 108 - .../lib-cov/middleware/session/store.js | 90 - .../connect/lib-cov/middleware/static.js | 92 - .../connect/lib-cov/middleware/staticCache.js | 276 --- .../connect/lib-cov/middleware/timeout.js | 66 - .../connect/lib-cov/middleware/urlencoded.js | 98 - .../connect/lib-cov/middleware/vhost.js | 59 - .../node_modules/connect/lib-cov/patch.js | 85 - .../node_modules/connect/lib-cov/proto.js | 285 --- .../connect/lib-cov/public/directory.html | 75 - .../connect/lib-cov/public/error.html | 13 - .../connect/lib-cov/public/favicon.ico | Bin 1406 -> 0 bytes .../connect/lib-cov/public/icons/page.png | Bin 635 -> 0 bytes .../connect/lib-cov/public/icons/page_add.png | Bin 739 -> 0 bytes .../lib-cov/public/icons/page_attach.png | Bin 794 -> 0 bytes .../lib-cov/public/icons/page_code.png | Bin 818 -> 0 bytes .../lib-cov/public/icons/page_copy.png | Bin 663 -> 0 bytes .../lib-cov/public/icons/page_delete.png | Bin 740 -> 0 bytes .../lib-cov/public/icons/page_edit.png | Bin 807 -> 0 bytes .../lib-cov/public/icons/page_error.png | Bin 793 -> 0 bytes .../lib-cov/public/icons/page_excel.png | Bin 817 -> 0 bytes .../lib-cov/public/icons/page_find.png | Bin 879 -> 0 bytes .../lib-cov/public/icons/page_gear.png | Bin 833 -> 0 bytes .../connect/lib-cov/public/icons/page_go.png | Bin 779 -> 0 bytes .../lib-cov/public/icons/page_green.png | Bin 621 -> 0 bytes .../connect/lib-cov/public/icons/page_key.png | Bin 801 -> 0 bytes .../lib-cov/public/icons/page_lightning.png | Bin 839 -> 0 bytes .../lib-cov/public/icons/page_link.png | Bin 830 -> 0 bytes .../lib-cov/public/icons/page_paintbrush.png | Bin 813 -> 0 bytes .../lib-cov/public/icons/page_paste.png | Bin 703 -> 0 bytes .../connect/lib-cov/public/icons/page_red.png | Bin 641 -> 0 bytes .../lib-cov/public/icons/page_refresh.png | Bin 858 -> 0 bytes .../lib-cov/public/icons/page_save.png | Bin 774 -> 0 bytes .../lib-cov/public/icons/page_white.png | Bin 294 -> 0 bytes .../public/icons/page_white_acrobat.png | Bin 591 -> 0 bytes .../public/icons/page_white_actionscript.png | Bin 664 -> 0 bytes .../lib-cov/public/icons/page_white_add.png | Bin 512 -> 0 bytes .../lib-cov/public/icons/page_white_c.png | Bin 587 -> 0 bytes .../public/icons/page_white_camera.png | Bin 656 -> 0 bytes .../lib-cov/public/icons/page_white_cd.png | Bin 666 -> 0 bytes .../lib-cov/public/icons/page_white_code.png | Bin 603 -> 0 bytes .../public/icons/page_white_code_red.png | Bin 587 -> 0 bytes .../public/icons/page_white_coldfusion.png | Bin 592 -> 0 bytes .../public/icons/page_white_compressed.png | Bin 724 -> 0 bytes .../lib-cov/public/icons/page_white_copy.png | Bin 309 -> 0 bytes .../public/icons/page_white_cplusplus.png | Bin 621 -> 0 bytes .../public/icons/page_white_csharp.png | Bin 700 -> 0 bytes .../lib-cov/public/icons/page_white_cup.png | Bin 639 -> 0 bytes .../public/icons/page_white_database.png | Bin 579 -> 0 bytes .../public/icons/page_white_delete.png | Bin 536 -> 0 bytes .../lib-cov/public/icons/page_white_dvd.png | Bin 638 -> 0 bytes .../lib-cov/public/icons/page_white_edit.png | Bin 618 -> 0 bytes .../lib-cov/public/icons/page_white_error.png | Bin 623 -> 0 bytes .../lib-cov/public/icons/page_white_excel.png | Bin 663 -> 0 bytes .../lib-cov/public/icons/page_white_find.png | Bin 676 -> 0 bytes .../lib-cov/public/icons/page_white_flash.png | Bin 582 -> 0 bytes .../public/icons/page_white_freehand.png | Bin 639 -> 0 bytes .../lib-cov/public/icons/page_white_gear.png | Bin 402 -> 0 bytes .../lib-cov/public/icons/page_white_get.png | Bin 516 -> 0 bytes .../lib-cov/public/icons/page_white_go.png | Bin 612 -> 0 bytes .../lib-cov/public/icons/page_white_h.png | Bin 603 -> 0 bytes .../public/icons/page_white_horizontal.png | Bin 296 -> 0 bytes .../lib-cov/public/icons/page_white_key.png | Bin 616 -> 0 bytes .../public/icons/page_white_lightning.png | Bin 669 -> 0 bytes .../lib-cov/public/icons/page_white_link.png | Bin 614 -> 0 bytes .../public/icons/page_white_magnify.png | Bin 554 -> 0 bytes .../lib-cov/public/icons/page_white_medal.png | Bin 706 -> 0 bytes .../public/icons/page_white_office.png | Bin 779 -> 0 bytes .../lib-cov/public/icons/page_white_paint.png | Bin 688 -> 0 bytes .../public/icons/page_white_paintbrush.png | Bin 618 -> 0 bytes .../lib-cov/public/icons/page_white_paste.png | Bin 620 -> 0 bytes .../lib-cov/public/icons/page_white_php.png | Bin 538 -> 0 bytes .../public/icons/page_white_picture.png | Bin 650 -> 0 bytes .../public/icons/page_white_powerpoint.png | Bin 588 -> 0 bytes .../lib-cov/public/icons/page_white_put.png | Bin 523 -> 0 bytes .../lib-cov/public/icons/page_white_ruby.png | Bin 626 -> 0 bytes .../lib-cov/public/icons/page_white_stack.png | Bin 317 -> 0 bytes .../lib-cov/public/icons/page_white_star.png | Bin 565 -> 0 bytes .../public/icons/page_white_swoosh.png | Bin 634 -> 0 bytes .../lib-cov/public/icons/page_white_text.png | Bin 342 -> 0 bytes .../public/icons/page_white_text_width.png | Bin 315 -> 0 bytes .../lib-cov/public/icons/page_white_tux.png | Bin 668 -> 0 bytes .../public/icons/page_white_vector.png | Bin 644 -> 0 bytes .../public/icons/page_white_visualstudio.png | Bin 702 -> 0 bytes .../lib-cov/public/icons/page_white_width.png | Bin 309 -> 0 bytes .../lib-cov/public/icons/page_white_word.png | Bin 651 -> 0 bytes .../lib-cov/public/icons/page_white_world.png | Bin 734 -> 0 bytes .../public/icons/page_white_wrench.png | Bin 613 -> 0 bytes .../lib-cov/public/icons/page_white_zip.png | Bin 386 -> 0 bytes .../lib-cov/public/icons/page_word.png | Bin 777 -> 0 bytes .../lib-cov/public/icons/page_world.png | Bin 903 -> 0 bytes .../connect/lib-cov/public/style.css | 141 -- .../node_modules/connect/lib-cov/utils.js | 282 --- .../node_modules/connect/lib/connect.js | 5 +- .../connect/lib/middleware/basicAuth.js | 4 +- .../connect/lib/middleware/compress.js | 11 +- .../connect/lib/middleware/cookieSession.js | 2 + .../connect/lib/middleware/csrf.js | 2 +- .../connect/lib/middleware/directory.js | 7 +- .../connect/lib/middleware/favicon.js | 3 +- .../connect/lib/middleware/json.js | 10 +- .../connect/lib/middleware/limit.js | 2 +- .../connect/lib/middleware/session.js | 18 +- .../connect/lib/middleware/session/cookie.js | 20 +- .../connect/lib/middleware/static.js | 3 +- .../connect/lib/middleware/timeout.js | 3 +- .../connect/lib/middleware/vhost.js | 6 +- .../express/node_modules/connect/lib/proto.js | 11 +- .../express/node_modules/connect/lib/utils.js | 22 +- .../node_modules/buffer-crc32/.npmignore | 1 + .../node_modules/buffer-crc32/.travis.yml | 8 + .../node_modules/buffer-crc32/README.md | 33 + .../node_modules/buffer-crc32/index.js | 84 + .../node_modules/buffer-crc32/package.json | 30 + .../buffer-crc32/tests/crc.test.js | 52 + .../connect/node_modules/bytes/History.md | 5 + .../connect/node_modules/bytes/index.js | 8 +- .../connect/node_modules/bytes/package.json | 14 +- .../node_modules/formidable/package.json | 3 - .../connect/node_modules/pause/package.json | 3 - .../connect/node_modules/qs/package.json | 3 - .../express/node_modules/connect/package.json | 11 +- .../express/node_modules/connect/test.js | 37 +- .../cookie-signature/package.json | 3 - .../express/node_modules/cookie/package.json | 3 - .../express/node_modules/debug/package.json | 3 - .../express/node_modules/fresh/package.json | 3 - .../express/node_modules/methods/package.json | 3 - .../node_modules/mkdirp/.gitignore.rej | 5 - .../express/node_modules/mkdirp/.travis.yml | 3 +- .../node_modules/mkdirp/README.markdown | 50 +- .../node_modules/mkdirp/examples/pow.js.orig | 6 - .../node_modules/mkdirp/examples/pow.js.rej | 19 - .../express/node_modules/mkdirp/index.js | 28 +- .../express/node_modules/mkdirp/package.json | 18 +- .../node_modules/range-parser/package.json | 3 - .../send/node_modules/mime/package.json | 3 - .../express/node_modules/send/package.json | 3 - node_modules/express/package.json | 17 +- node_modules/express/test.js | 32 +- .../less-middleware/lib/determine-imports.js | 83 + .../less-middleware/lib/middleware.js | 63 +- node_modules/less-middleware/license | 22 + .../less/node_modules/ycssmin/package.json | 3 - .../node_modules/less/package.json | 5 +- .../node_modules/mkdirp/package.json | 5 +- node_modules/less-middleware/package.json | 13 +- node_modules/less-middleware/readme.md | 143 ++ .../less-middleware/test/parse-test.js | 0 node_modules/mongoose/.travis.yml | 1 + node_modules/mongoose/CONTRIBUTING.md | 13 +- node_modules/mongoose/History.md | 228 ++ node_modules/mongoose/examples/README.md | 42 + node_modules/mongoose/examples/doc-methods.js | 70 + .../population-across-three-collections.js | 135 ++ .../mongoose/examples/population-basic.js | 95 + .../examples/population-of-existing-doc.js | 101 + .../population-of-multiple-existing-docs.js | 112 + .../mongoose/examples/population-options.js | 124 ++ .../examples/population-plain-objects.js | 96 + node_modules/mongoose/lib/collection.js | 21 +- node_modules/mongoose/lib/connection.js | 30 +- node_modules/mongoose/lib/document.js | 461 ++-- node_modules/mongoose/lib/drivers/SPEC.md | 4 + .../drivers/node-mongodb-native/collection.js | 9 +- .../drivers/node-mongodb-native/connection.js | 14 +- node_modules/mongoose/lib/error.js | 5 +- .../mongoose/lib/errors/divergentArray.js | 40 + .../mongoose/lib/errors/validation.js | 12 +- node_modules/mongoose/lib/errors/validator.js | 10 +- node_modules/mongoose/lib/index.js | 121 +- node_modules/mongoose/lib/internal.js | 30 + node_modules/mongoose/lib/model.js | 956 +++++--- node_modules/mongoose/lib/promise.js | 237 +- node_modules/mongoose/lib/query.js | 545 +++-- node_modules/mongoose/lib/queryhelpers.js | 35 + node_modules/mongoose/lib/querystream.js | 97 +- node_modules/mongoose/lib/schema.js | 105 +- node_modules/mongoose/lib/schema/array.js | 55 +- node_modules/mongoose/lib/schema/boolean.js | 11 +- node_modules/mongoose/lib/schema/buffer.js | 46 +- node_modules/mongoose/lib/schema/date.js | 47 +- .../mongoose/lib/schema/documentarray.js | 4 +- node_modules/mongoose/lib/schema/mixed.js | 20 +- node_modules/mongoose/lib/schema/number.js | 58 +- node_modules/mongoose/lib/schema/objectid.js | 43 +- node_modules/mongoose/lib/schema/string.js | 54 +- node_modules/mongoose/lib/schematype.js | 110 +- node_modules/mongoose/lib/types/array.js | 144 +- .../mongoose/lib/types/documentarray.js | 22 +- node_modules/mongoose/lib/types/embedded.js | 75 +- node_modules/mongoose/lib/utils.js | 210 +- .../mongoose/node_modules/hooks/package.json | 3 - .../mongoose/node_modules/mongodb/.travis.yml | 2 +- .../mongoose/node_modules/mongodb/Makefile | 56 +- .../lib/mongodb/connection/connection.js | 24 +- .../lib/mongodb/connection/connection_pool.js | 17 +- .../lib/mongodb/connection/repl_set.js | 50 +- .../mongodb/lib/mongodb/connection/server.js | 9 +- .../lib/mongodb/connection/url_parser.js | 2 + .../mongodb/lib/mongodb/cursor.js | 59 +- .../mongodb/lib/mongodb/cursorstream.js | 27 +- .../node_modules/mongodb/lib/mongodb/db.js | 34 +- .../mongodb/lib/mongodb/gridfs/gridstore.js | 16 +- .../mongodb/lib/mongodb/gridfs/readstream.js | 9 +- .../lib/mongodb/responses/mongo_reply.js | 9 +- .../node_modules/bson/build/Release/bson.node | Bin 49508 -> 49508 bytes .../node_modules/bson/build/config.gypi | 6 +- .../mongodb/node_modules/bson/package.json | 3 - .../node_modules/mongodb/package.json | 15 +- .../node_modules/mpath/.npmignore} | 2 +- .../mongoose/node_modules/mpath/.travis.yml | 4 + .../mongoose/node_modules/mpath/History.md | 16 + .../mongoose/node_modules/mpath/LICENSE | 22 + .../mongoose/node_modules/mpath/Makefile | 5 + .../mongoose/node_modules/mpath/README.md | 278 +++ .../mongoose/node_modules/mpath/index.js | 1 + .../mongoose/node_modules/mpath/lib/index.js | 183 ++ .../mongoose/node_modules/mpath/package.json | 30 + .../mongoose/node_modules/mpath/test/index.js | 1630 ++++++++++++++ .../mongoose/node_modules/mpromise/.npmignore | 2 + .../node_modules/mpromise/.travis.yml | 4 + .../mongoose/node_modules/mpromise/History.md | 24 + .../mongoose/node_modules/mpromise/LICENSE | 22 + .../mongoose/node_modules/mpromise/Makefile | 12 + .../mongoose/node_modules/mpromise/README.md | 200 ++ .../mongoose/node_modules/mpromise/index.js | 1 + .../node_modules/mpromise/lib/promise.js | 268 +++ .../mpromise/node_modules/sliced/.npmignore | 2 + .../mpromise/node_modules/sliced/.travis.yml | 4 + .../mpromise/node_modules/sliced/History.md | 23 + .../mpromise/node_modules/sliced/LICENSE | 22 + .../mpromise/node_modules/sliced/Makefile | 5 + .../mpromise/node_modules/sliced/README.md | 62 + .../mpromise/node_modules/sliced/bench.js | 95 + .../node_modules/sliced/component.json | 13 + .../mpromise/node_modules/sliced/index.js | 1 + .../node_modules/sliced/lib/sliced.js | 37 + .../mpromise/node_modules/sliced/package.json | 30 + .../node_modules/sliced/test/index.js | 80 + .../node_modules/mpromise/package.json | 35 + .../mpromise/test/promise.test.js | 201 ++ .../node_modules/mpromise/test/promises-A.js | 35 + .../mongoose/node_modules/ms/package.json | 3 - .../mongoose/node_modules/muri/package.json | 3 - .../mongoose/node_modules/sliced/package.json | 3 - node_modules/mongoose/package.json | 20 +- node_modules/mongoose/static.js | 1 + node_modules/nodetime/.npmignore | 5 - node_modules/nodetime/LICENSE | 19 - node_modules/nodetime/README.md | 11 - node_modules/nodetime/index.js | 1 - .../nodetime/lib/addons/dtrace-provider.js | 63 - .../nodetime/lib/addons/stdout-writer.js | 45 - node_modules/nodetime/lib/core/agent.js | 359 --- node_modules/nodetime/lib/core/logger.js | 34 - node_modules/nodetime/lib/core/proxy.js | 201 -- node_modules/nodetime/lib/core/system.js | 57 - node_modules/nodetime/lib/core/thread.js | 41 - node_modules/nodetime/lib/core/time.js | 90 - node_modules/nodetime/lib/core/timers.js | 99 - node_modules/nodetime/lib/core/utils.js | 20 - node_modules/nodetime/lib/metrics/metric.js | 187 -- .../nodetime/lib/metrics/metrics-manager.js | 126 -- .../nodetime/lib/monitors/mongodb-monitor.js | 384 ---- .../nodetime/lib/monitors/redis-monitor.js | 161 -- .../lib/probes/cassandra-client-probe.js | 114 - .../nodetime/lib/probes/cassandra-probe.js | 71 - node_modules/nodetime/lib/probes/fs-probe.js | 114 - .../nodetime/lib/probes/global-probe.js | 24 - .../nodetime/lib/probes/http-probe.js | 162 -- .../nodetime/lib/probes/memcache-probe.js | 126 -- .../nodetime/lib/probes/memcached-probe.js | 88 - .../nodetime/lib/probes/mongodb-probe.js | 129 -- .../nodetime/lib/probes/mysql-probe.js | 64 - node_modules/nodetime/lib/probes/net-probe.js | 58 - node_modules/nodetime/lib/probes/pg-probe.js | 132 -- .../nodetime/lib/probes/process-probe.js | 70 - .../nodetime/lib/probes/redis-probe.js | 198 -- .../nodetime/lib/probes/socket.io-probe.js | 77 - .../nodetime/lib/process/disk-stats.js | 74 - .../nodetime/lib/process/process-info.js | 139 -- .../nodetime/lib/process/process-state.js | 20 - .../nodetime/lib/process/process-stats.js | 69 - .../lib/profiler/call-metrics-groups.js | 69 - .../nodetime/lib/profiler/call-metrics.js | 55 - .../lib/profiler/custom-transaction.js | 26 - .../profiler/filter/filter-key-extractor.js | 92 - .../lib/profiler/filter/predicate-filter.js | 111 - .../lib/profiler/named-transactions.js | 61 - .../nodetime/lib/profiler/profiler.js | 363 --- node_modules/nodetime/lib/profiler/sample.js | 43 - .../nodetime/lib/profiler/skip-counter.js | 45 - .../nodetime/lib/profiler/time-promise.js | 32 - node_modules/nodetime/lib/saas/data-sender.js | 129 -- .../nodetime/lib/saas/gzip-request.js | 47 - node_modules/nodetime/lib/saas/saas-client.js | 194 -- node_modules/nodetime/lib/v8/cpu-profiler.js | 170 -- node_modules/nodetime/lib/v8/gc-stats.js | 50 - node_modules/nodetime/lib/v8/heap-profiler.js | 466 ---- node_modules/nodetime/lib/v8/heap-stats.js | 46 - .../nodetime/node_modules/request/LICENSE | 55 - .../nodetime/node_modules/request/README.md | 310 --- .../nodetime/node_modules/request/aws.js | 191 -- .../nodetime/node_modules/request/forever.js | 103 - .../nodetime/node_modules/request/main.js | 1123 ---------- .../request/node_modules/form-data/.npmignore | 5 - .../request/node_modules/form-data/Makefile | 7 - .../request/node_modules/form-data/Readme.md | 86 - .../node_modules/form-data/lib/form_data.js | 237 -- .../form-data/node-form-data.sublime-project | 8 - .../node-form-data.sublime-workspace | 508 ----- .../form-data/node_modules/async/.gitmodules | 9 - .../form-data/node_modules/async/LICENSE | 19 - .../form-data/node_modules/async/Makefile | 21 - .../form-data/node_modules/async/README.md | 970 -------- .../node_modules/async/async.min.js.gzip | Bin 1859 -> 0 bytes .../node_modules/async/deps/nodeunit.css | 70 - .../node_modules/async/deps/nodeunit.js | 1966 ----------------- .../node_modules/async/dist/async.min.js | 1 - .../form-data/node_modules/async/index.js | 3 - .../form-data/node_modules/async/lib/async.js | 632 ------ .../form-data/node_modules/async/nodelint.cfg | 4 - .../form-data/node_modules/async/package.json | 41 - .../form-data/node_modules/async/test/.swp | Bin 12288 -> 0 bytes .../node_modules/async/test/test-async.js | 1367 ------------ .../node_modules/async/test/test.html | 24 - .../node_modules/combined-stream/.npmignore | 3 - .../node_modules/combined-stream/License | 19 - .../node_modules/combined-stream/Makefile | 7 - .../node_modules/combined-stream/Readme.md | 132 -- .../combined-stream/lib/combined_stream.js | 183 -- .../node_modules/delayed-stream/.npmignore | 2 - .../node_modules/delayed-stream/License | 19 - .../node_modules/delayed-stream/Makefile | 7 - .../node_modules/delayed-stream/Readme.md | 154 -- .../delayed-stream/lib/delayed_stream.js | 99 - .../node_modules/delayed-stream/package.json | 38 - .../delayed-stream/test/common.js | 6 - .../integration/test-delayed-http-upload.js | 38 - .../test-delayed-stream-auto-pause.js | 21 - .../integration/test-delayed-stream-pause.js | 14 - .../test/integration/test-delayed-stream.js | 48 - .../integration/test-handle-source-errors.js | 15 - .../test/integration/test-max-data-size.js | 18 - .../test/integration/test-pipe-resumes.js | 13 - .../test/integration/test-proxy-readable.js | 13 - .../node_modules/delayed-stream/test/run.js | 7 - .../node_modules/combined-stream/package.json | 39 - .../combined-stream/test/common.js | 12 - .../combined-stream/test/fixture/file1.txt | 256 --- .../combined-stream/test/fixture/file2.txt | 256 --- .../test/integration/test-callback-streams.js | 27 - .../test/integration/test-data-size.js | 34 - ...delayed-streams-and-buffers-and-strings.js | 38 - .../test/integration/test-delayed-streams.js | 35 - .../test/integration/test-max-data-size.js | 24 - .../test/integration/test-unpaused-streams.js | 30 - .../node_modules/combined-stream/test/run.js | 7 - .../node_modules/form-data/package.json | 43 - .../node_modules/form-data/test/common.js | 14 - .../form-data/test/fixture/bacon.txt | 1 - .../form-data/test/fixture/unicycle.jpg | Bin 19806 -> 0 bytes .../test/integration/test-form-get-length.js | 93 - .../test/integration/test-get-boundary.js | 18 - .../test/integration/test-http-response.js | 121 - .../form-data/test/integration/test-pipe.js | 111 - .../form-data/test/integration/test-submit.js | 107 - .../node_modules/form-data/test/run.js | 7 - .../request/node_modules/mime/LICENSE | 19 - .../request/node_modules/mime/README.md | 63 - .../request/node_modules/mime/mime.js | 104 - .../request/node_modules/mime/package.json | 42 - .../request/node_modules/mime/test.js | 55 - .../node_modules/mime/types/mime.types | 1588 ------------- .../node_modules/mime/types/node.types | 59 - .../nodetime/node_modules/request/oauth.js | 43 - .../node_modules/request/package.json | 43 - .../request/tests/googledoodle.png | Bin 38510 -> 0 bytes .../node_modules/request/tests/run.js | 45 - .../node_modules/request/tests/server.js | 90 - .../node_modules/request/tests/squid.conf | 77 - .../node_modules/request/tests/ssl/ca/ca.cnf | 20 - .../node_modules/request/tests/ssl/ca/ca.crl | 0 .../node_modules/request/tests/ssl/ca/ca.crt | 17 - .../node_modules/request/tests/ssl/ca/ca.csr | 13 - .../node_modules/request/tests/ssl/ca/ca.key | 18 - .../node_modules/request/tests/ssl/ca/ca.srl | 1 - .../request/tests/ssl/ca/server.cnf | 19 - .../request/tests/ssl/ca/server.crt | 16 - .../request/tests/ssl/ca/server.csr | 11 - .../request/tests/ssl/ca/server.js | 28 - .../request/tests/ssl/ca/server.key | 9 - .../node_modules/request/tests/ssl/npm-ca.crt | 16 - .../node_modules/request/tests/ssl/test.crt | 15 - .../node_modules/request/tests/ssl/test.key | 15 - .../node_modules/request/tests/test-body.js | 117 - .../node_modules/request/tests/test-cookie.js | 29 - .../request/tests/test-cookiejar.js | 90 - .../request/tests/test-defaults.js | 114 - .../node_modules/request/tests/test-errors.js | 37 - .../request/tests/test-follow-all-303.js | 30 - .../request/tests/test-follow-all.js | 35 - .../node_modules/request/tests/test-form.js | 79 - .../request/tests/test-headers.js | 52 - .../request/tests/test-httpModule.js | 94 - .../request/tests/test-https-strict.js | 97 - .../node_modules/request/tests/test-https.js | 86 - .../node_modules/request/tests/test-oauth.js | 117 - .../node_modules/request/tests/test-params.js | 92 - .../request/tests/test-piped-redirect.js | 52 - .../node_modules/request/tests/test-pipes.js | 216 -- .../node_modules/request/tests/test-pool.js | 16 - .../tests/test-protocol-changing-redirect.js | 60 - .../node_modules/request/tests/test-proxy.js | 39 - .../node_modules/request/tests/test-qs.js | 28 - .../request/tests/test-redirect.js | 154 -- .../node_modules/request/tests/test-s3.js | 13 - .../request/tests/test-timeout.js | 87 - .../node_modules/request/tests/test-toJSON.js | 14 - .../node_modules/request/tests/test-tunnel.js | 63 - .../node_modules/request/tests/unicycle.jpg | Bin 19806 -> 0 bytes .../nodetime/node_modules/request/tunnel.js | 227 -- .../nodetime/node_modules/request/uuid.js | 19 - .../request/vendor/cookie/index.js | 65 - .../node_modules/request/vendor/cookie/jar.js | 72 - .../nodetime/node_modules/timekit/.npmignore | 7 - .../nodetime/node_modules/timekit/LICENSE | 19 - .../nodetime/node_modules/timekit/README.md | 32 - .../nodetime/node_modules/timekit/binding.gyp | 19 - .../node_modules/timekit/build/Makefile | 359 --- .../obj.target/timekit/src/timekit_posix.o.d | 29 - .../Release/.deps/Release/timekit.node.d | 1 - .../timekit/build/Release/linker.lock | 0 .../obj.target/timekit/src/timekit_posix.o | Bin 46692 -> 0 bytes .../timekit/build/Release/timekit.node | Bin 9888 -> 0 bytes .../timekit/build/binding.Makefile | 6 - .../node_modules/timekit/build/config.gypi | 104 - .../node_modules/timekit/build/gyp-mac-tool | 210 -- .../timekit/build/timekit.target.mk | 133 -- .../nodetime/node_modules/timekit/index.js | 24 - .../timekit/node_modules/bindings/README.md | 97 - .../timekit/node_modules/bindings/bindings.js | 151 -- .../node_modules/bindings/package.json | 28 - .../node_modules/timekit/package.json | 46 - .../node_modules/timekit/src/timekit_posix.cc | 69 - .../node_modules/timekit/src/timekit_win.cc | 76 - .../nodetime/node_modules/timekit/timekit.cc | 74 - .../nodetime/node_modules/timekit/wscript | 16 - .../nodetime/node_modules/v8tools/.npmignore | 7 - .../nodetime/node_modules/v8tools/LICENSE | 19 - .../nodetime/node_modules/v8tools/README.md | 37 - .../nodetime/node_modules/v8tools/binding.gyp | 14 - .../node_modules/v8tools/build/Makefile | 359 --- .../Release/obj.target/v8tools/src/gc.o.d | 30 - .../obj.target/v8tools/src/profiler.o.d | 11 - .../obj.target/v8tools/src/v8tools.o.d | 32 - .../Release/.deps/Release/v8tools.node.d | 1 - .../v8tools/build/Release/linker.lock | 0 .../build/Release/obj.target/v8tools/src/gc.o | Bin 70984 -> 0 bytes .../Release/obj.target/v8tools/src/profiler.o | Bin 56856 -> 0 bytes .../Release/obj.target/v8tools/src/v8tools.o | Bin 40312 -> 0 bytes .../v8tools/build/Release/v8tools.node | Bin 18212 -> 0 bytes .../v8tools/build/binding.Makefile | 6 - .../node_modules/v8tools/build/config.gypi | 104 - .../node_modules/v8tools/build/gyp-mac-tool | 210 -- .../v8tools/build/v8tools.target.mk | 135 -- .../nodetime/node_modules/v8tools/index.js | 24 - .../v8tools/node_modules/bindings/README.md | 97 - .../v8tools/node_modules/bindings/bindings.js | 151 -- .../node_modules/bindings/package.json | 28 - .../node_modules/v8tools/package.json | 47 - .../nodetime/node_modules/v8tools/src/gc.cc | 102 - .../nodetime/node_modules/v8tools/src/gc.h | 13 - .../node_modules/v8tools/src/profiler.cc | 124 -- .../node_modules/v8tools/src/profiler.h | 13 - .../node_modules/v8tools/src/v8tools.cc | 21 - .../nodetime/node_modules/v8tools/v8tools.cc | 246 --- .../nodetime/node_modules/v8tools/wscript | 16 - node_modules/nodetime/package.json | 75 - node_modules/timekit/.npmignore | 7 - node_modules/timekit/LICENSE | 19 - node_modules/timekit/README.md | 32 - node_modules/timekit/binding.gyp | 19 - node_modules/timekit/build/Makefile | 359 --- .../obj.target/timekit/src/timekit_posix.o.d | 29 - .../Release/.deps/Release/timekit.node.d | 1 - .../timekit/build/Release/linker.lock | 0 .../obj.target/timekit/src/timekit_posix.o | Bin 46668 -> 0 bytes .../timekit/build/Release/timekit.node | Bin 9848 -> 9848 bytes node_modules/timekit/build/binding.Makefile | 6 - node_modules/timekit/build/config.gypi | 6 +- node_modules/timekit/build/gyp-mac-tool | 210 -- node_modules/timekit/build/timekit.target.mk | 133 -- node_modules/timekit/index.js | 24 - .../timekit/node_modules/bindings/README.md | 97 - .../timekit/node_modules/bindings/bindings.js | 10 +- .../node_modules/bindings/package.json | 4 +- node_modules/timekit/package.json | 3 - node_modules/timekit/src/timekit_posix.cc | 69 - node_modules/timekit/src/timekit_win.cc | 76 - node_modules/timekit/timekit.cc | 74 - node_modules/timekit/wscript | 16 - node_modules/v8tools/README.md | 2 +- .../v8tools/build/Release/v8tools.node | Bin 18124 -> 18124 bytes node_modules/v8tools/build/config.gypi | 6 +- .../v8tools/node_modules/bindings/bindings.js | 10 +- .../node_modules/bindings/package.json | 4 +- node_modules/v8tools/package.json | 11 +- node_modules/v8tools/src/gc.cc | 2 +- package.json | 15 +- web.js | 27 +- 551 files changed, 8060 insertions(+), 30429 deletions(-) delete mode 100644 config.sample.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/cache.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/connect.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/index.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/basicAuth.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/bodyParser.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/compress.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/cookieParser.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/cookieSession.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/csrf.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/directory.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/errorHandler.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/favicon.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/json.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/limit.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/logger.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/methodOverride.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/multipart.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/query.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/responseTime.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/session.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/session/cookie.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/session/memory.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/session/session.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/session/store.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/static.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/staticCache.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/timeout.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/urlencoded.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/vhost.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/patch.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/proto.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/directory.html delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/error.html delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/favicon.ico delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_add.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_attach.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_code.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_copy.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_delete.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_edit.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_error.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_excel.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_find.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_gear.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_go.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_green.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_key.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_lightning.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_link.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_paintbrush.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_paste.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_red.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_refresh.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_save.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_acrobat.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_actionscript.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_add.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_c.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_camera.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_cd.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_code.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_code_red.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_coldfusion.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_compressed.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_copy.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_cplusplus.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_csharp.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_cup.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_database.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_delete.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_dvd.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_edit.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_error.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_excel.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_find.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_flash.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_freehand.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_gear.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_get.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_go.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_h.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_horizontal.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_key.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_lightning.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_link.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_magnify.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_medal.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_office.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_paint.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_paintbrush.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_paste.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_php.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_picture.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_powerpoint.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_put.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_ruby.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_stack.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_star.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_swoosh.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_text.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_text_width.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_tux.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_vector.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_visualstudio.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_width.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_word.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_world.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_wrench.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_zip.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_word.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_world.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/style.css delete mode 100644 node_modules/express/node_modules/connect/lib-cov/utils.js create mode 100644 node_modules/express/node_modules/connect/node_modules/buffer-crc32/.npmignore create mode 100644 node_modules/express/node_modules/connect/node_modules/buffer-crc32/.travis.yml create mode 100644 node_modules/express/node_modules/connect/node_modules/buffer-crc32/README.md create mode 100644 node_modules/express/node_modules/connect/node_modules/buffer-crc32/index.js create mode 100644 node_modules/express/node_modules/connect/node_modules/buffer-crc32/package.json create mode 100644 node_modules/express/node_modules/connect/node_modules/buffer-crc32/tests/crc.test.js delete mode 100644 node_modules/express/node_modules/mkdirp/.gitignore.rej delete mode 100644 node_modules/express/node_modules/mkdirp/examples/pow.js.orig delete mode 100644 node_modules/express/node_modules/mkdirp/examples/pow.js.rej create mode 100644 node_modules/less-middleware/lib/determine-imports.js create mode 100644 node_modules/less-middleware/license delete mode 100644 node_modules/less-middleware/test/parse-test.js create mode 100644 node_modules/mongoose/examples/README.md create mode 100644 node_modules/mongoose/examples/doc-methods.js create mode 100644 node_modules/mongoose/examples/population-across-three-collections.js create mode 100644 node_modules/mongoose/examples/population-basic.js create mode 100644 node_modules/mongoose/examples/population-of-existing-doc.js create mode 100644 node_modules/mongoose/examples/population-of-multiple-existing-docs.js create mode 100644 node_modules/mongoose/examples/population-options.js create mode 100644 node_modules/mongoose/examples/population-plain-objects.js create mode 100644 node_modules/mongoose/lib/drivers/SPEC.md create mode 100644 node_modules/mongoose/lib/errors/divergentArray.js create mode 100644 node_modules/mongoose/lib/internal.js create mode 100644 node_modules/mongoose/lib/queryhelpers.js rename node_modules/{express/node_modules/mkdirp/.gitignore.orig => mongoose/node_modules/mpath/.npmignore} (51%) create mode 100644 node_modules/mongoose/node_modules/mpath/.travis.yml create mode 100644 node_modules/mongoose/node_modules/mpath/History.md create mode 100644 node_modules/mongoose/node_modules/mpath/LICENSE create mode 100644 node_modules/mongoose/node_modules/mpath/Makefile create mode 100644 node_modules/mongoose/node_modules/mpath/README.md create mode 100644 node_modules/mongoose/node_modules/mpath/index.js create mode 100644 node_modules/mongoose/node_modules/mpath/lib/index.js create mode 100644 node_modules/mongoose/node_modules/mpath/package.json create mode 100644 node_modules/mongoose/node_modules/mpath/test/index.js create mode 100644 node_modules/mongoose/node_modules/mpromise/.npmignore create mode 100644 node_modules/mongoose/node_modules/mpromise/.travis.yml create mode 100644 node_modules/mongoose/node_modules/mpromise/History.md create mode 100644 node_modules/mongoose/node_modules/mpromise/LICENSE create mode 100644 node_modules/mongoose/node_modules/mpromise/Makefile create mode 100644 node_modules/mongoose/node_modules/mpromise/README.md create mode 100644 node_modules/mongoose/node_modules/mpromise/index.js create mode 100644 node_modules/mongoose/node_modules/mpromise/lib/promise.js create mode 100644 node_modules/mongoose/node_modules/mpromise/node_modules/sliced/.npmignore create mode 100644 node_modules/mongoose/node_modules/mpromise/node_modules/sliced/.travis.yml create mode 100644 node_modules/mongoose/node_modules/mpromise/node_modules/sliced/History.md create mode 100644 node_modules/mongoose/node_modules/mpromise/node_modules/sliced/LICENSE create mode 100644 node_modules/mongoose/node_modules/mpromise/node_modules/sliced/Makefile create mode 100644 node_modules/mongoose/node_modules/mpromise/node_modules/sliced/README.md create mode 100644 node_modules/mongoose/node_modules/mpromise/node_modules/sliced/bench.js create mode 100644 node_modules/mongoose/node_modules/mpromise/node_modules/sliced/component.json create mode 100644 node_modules/mongoose/node_modules/mpromise/node_modules/sliced/index.js create mode 100644 node_modules/mongoose/node_modules/mpromise/node_modules/sliced/lib/sliced.js create mode 100644 node_modules/mongoose/node_modules/mpromise/node_modules/sliced/package.json create mode 100644 node_modules/mongoose/node_modules/mpromise/node_modules/sliced/test/index.js create mode 100644 node_modules/mongoose/node_modules/mpromise/package.json create mode 100644 node_modules/mongoose/node_modules/mpromise/test/promise.test.js create mode 100644 node_modules/mongoose/node_modules/mpromise/test/promises-A.js delete mode 100644 node_modules/nodetime/.npmignore delete mode 100644 node_modules/nodetime/LICENSE delete mode 100644 node_modules/nodetime/README.md delete mode 100644 node_modules/nodetime/index.js delete mode 100644 node_modules/nodetime/lib/addons/dtrace-provider.js delete mode 100644 node_modules/nodetime/lib/addons/stdout-writer.js delete mode 100644 node_modules/nodetime/lib/core/agent.js delete mode 100644 node_modules/nodetime/lib/core/logger.js delete mode 100644 node_modules/nodetime/lib/core/proxy.js delete mode 100644 node_modules/nodetime/lib/core/system.js delete mode 100644 node_modules/nodetime/lib/core/thread.js delete mode 100644 node_modules/nodetime/lib/core/time.js delete mode 100644 node_modules/nodetime/lib/core/timers.js delete mode 100644 node_modules/nodetime/lib/core/utils.js delete mode 100644 node_modules/nodetime/lib/metrics/metric.js delete mode 100644 node_modules/nodetime/lib/metrics/metrics-manager.js delete mode 100644 node_modules/nodetime/lib/monitors/mongodb-monitor.js delete mode 100644 node_modules/nodetime/lib/monitors/redis-monitor.js delete mode 100644 node_modules/nodetime/lib/probes/cassandra-client-probe.js delete mode 100644 node_modules/nodetime/lib/probes/cassandra-probe.js delete mode 100644 node_modules/nodetime/lib/probes/fs-probe.js delete mode 100644 node_modules/nodetime/lib/probes/global-probe.js delete mode 100644 node_modules/nodetime/lib/probes/http-probe.js delete mode 100644 node_modules/nodetime/lib/probes/memcache-probe.js delete mode 100644 node_modules/nodetime/lib/probes/memcached-probe.js delete mode 100644 node_modules/nodetime/lib/probes/mongodb-probe.js delete mode 100644 node_modules/nodetime/lib/probes/mysql-probe.js delete mode 100644 node_modules/nodetime/lib/probes/net-probe.js delete mode 100644 node_modules/nodetime/lib/probes/pg-probe.js delete mode 100644 node_modules/nodetime/lib/probes/process-probe.js delete mode 100644 node_modules/nodetime/lib/probes/redis-probe.js delete mode 100644 node_modules/nodetime/lib/probes/socket.io-probe.js delete mode 100644 node_modules/nodetime/lib/process/disk-stats.js delete mode 100644 node_modules/nodetime/lib/process/process-info.js delete mode 100644 node_modules/nodetime/lib/process/process-state.js delete mode 100644 node_modules/nodetime/lib/process/process-stats.js delete mode 100644 node_modules/nodetime/lib/profiler/call-metrics-groups.js delete mode 100644 node_modules/nodetime/lib/profiler/call-metrics.js delete mode 100644 node_modules/nodetime/lib/profiler/custom-transaction.js delete mode 100644 node_modules/nodetime/lib/profiler/filter/filter-key-extractor.js delete mode 100644 node_modules/nodetime/lib/profiler/filter/predicate-filter.js delete mode 100644 node_modules/nodetime/lib/profiler/named-transactions.js delete mode 100644 node_modules/nodetime/lib/profiler/profiler.js delete mode 100644 node_modules/nodetime/lib/profiler/sample.js delete mode 100644 node_modules/nodetime/lib/profiler/skip-counter.js delete mode 100644 node_modules/nodetime/lib/profiler/time-promise.js delete mode 100644 node_modules/nodetime/lib/saas/data-sender.js delete mode 100644 node_modules/nodetime/lib/saas/gzip-request.js delete mode 100644 node_modules/nodetime/lib/saas/saas-client.js delete mode 100644 node_modules/nodetime/lib/v8/cpu-profiler.js delete mode 100644 node_modules/nodetime/lib/v8/gc-stats.js delete mode 100644 node_modules/nodetime/lib/v8/heap-profiler.js delete mode 100644 node_modules/nodetime/lib/v8/heap-stats.js delete mode 100644 node_modules/nodetime/node_modules/request/LICENSE delete mode 100644 node_modules/nodetime/node_modules/request/README.md delete mode 100644 node_modules/nodetime/node_modules/request/aws.js delete mode 100644 node_modules/nodetime/node_modules/request/forever.js delete mode 100644 node_modules/nodetime/node_modules/request/main.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/.npmignore delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/Makefile delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/Readme.md delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/lib/form_data.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node-form-data.sublime-project delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/.gitmodules delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/LICENSE delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/Makefile delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/README.md delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/async.min.js.gzip delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.css delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/dist/async.min.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/index.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/lib/async.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/nodelint.cfg delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/package.json delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/.swp delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/test-async.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/test.html delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/.npmignore delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/License delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/Makefile delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js delete mode 100755 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/common.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file1.txt delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file2.txt delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-callback-streams.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-data-size.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams-and-buffers-and-strings.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-max-data-size.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-unpaused-streams.js delete mode 100755 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/run.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/package.json delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/test/common.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/test/fixture/bacon.txt delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/test/fixture/unicycle.jpg delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-form-get-length.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-get-boundary.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-http-response.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-pipe.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-submit.js delete mode 100755 node_modules/nodetime/node_modules/request/node_modules/form-data/test/run.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/mime/LICENSE delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/mime/README.md delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/mime/mime.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/mime/package.json delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/mime/test.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/mime/types/mime.types delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/mime/types/node.types delete mode 100644 node_modules/nodetime/node_modules/request/oauth.js delete mode 100644 node_modules/nodetime/node_modules/request/package.json delete mode 100644 node_modules/nodetime/node_modules/request/tests/googledoodle.png delete mode 100644 node_modules/nodetime/node_modules/request/tests/run.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/server.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/squid.conf delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.cnf delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.crl delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.crt delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.csr delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.key delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.srl delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/server.cnf delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/server.crt delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/server.csr delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/server.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/server.key delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/npm-ca.crt delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/test.crt delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/test.key delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-body.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-cookie.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-cookiejar.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-defaults.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-errors.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-follow-all-303.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-follow-all.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-form.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-headers.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-httpModule.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-https-strict.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-https.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-oauth.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-params.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-piped-redirect.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-pipes.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-pool.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-protocol-changing-redirect.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-proxy.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-qs.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-redirect.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-s3.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-timeout.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-toJSON.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-tunnel.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/unicycle.jpg delete mode 100644 node_modules/nodetime/node_modules/request/tunnel.js delete mode 100644 node_modules/nodetime/node_modules/request/uuid.js delete mode 100644 node_modules/nodetime/node_modules/request/vendor/cookie/index.js delete mode 100644 node_modules/nodetime/node_modules/request/vendor/cookie/jar.js delete mode 100644 node_modules/nodetime/node_modules/timekit/.npmignore delete mode 100644 node_modules/nodetime/node_modules/timekit/LICENSE delete mode 100644 node_modules/nodetime/node_modules/timekit/README.md delete mode 100644 node_modules/nodetime/node_modules/timekit/binding.gyp delete mode 100644 node_modules/nodetime/node_modules/timekit/build/Makefile delete mode 100644 node_modules/nodetime/node_modules/timekit/build/Release/.deps/Release/obj.target/timekit/src/timekit_posix.o.d delete mode 100644 node_modules/nodetime/node_modules/timekit/build/Release/.deps/Release/timekit.node.d delete mode 100644 node_modules/nodetime/node_modules/timekit/build/Release/linker.lock delete mode 100644 node_modules/nodetime/node_modules/timekit/build/Release/obj.target/timekit/src/timekit_posix.o delete mode 100755 node_modules/nodetime/node_modules/timekit/build/Release/timekit.node delete mode 100644 node_modules/nodetime/node_modules/timekit/build/binding.Makefile delete mode 100644 node_modules/nodetime/node_modules/timekit/build/config.gypi delete mode 100755 node_modules/nodetime/node_modules/timekit/build/gyp-mac-tool delete mode 100644 node_modules/nodetime/node_modules/timekit/build/timekit.target.mk delete mode 100644 node_modules/nodetime/node_modules/timekit/index.js delete mode 100644 node_modules/nodetime/node_modules/timekit/node_modules/bindings/README.md delete mode 100644 node_modules/nodetime/node_modules/timekit/node_modules/bindings/bindings.js delete mode 100644 node_modules/nodetime/node_modules/timekit/node_modules/bindings/package.json delete mode 100644 node_modules/nodetime/node_modules/timekit/package.json delete mode 100644 node_modules/nodetime/node_modules/timekit/src/timekit_posix.cc delete mode 100644 node_modules/nodetime/node_modules/timekit/src/timekit_win.cc delete mode 100644 node_modules/nodetime/node_modules/timekit/timekit.cc delete mode 100644 node_modules/nodetime/node_modules/timekit/wscript delete mode 100644 node_modules/nodetime/node_modules/v8tools/.npmignore delete mode 100644 node_modules/nodetime/node_modules/v8tools/LICENSE delete mode 100644 node_modules/nodetime/node_modules/v8tools/README.md delete mode 100644 node_modules/nodetime/node_modules/v8tools/binding.gyp delete mode 100644 node_modules/nodetime/node_modules/v8tools/build/Makefile delete mode 100644 node_modules/nodetime/node_modules/v8tools/build/Release/.deps/Release/obj.target/v8tools/src/gc.o.d delete mode 100644 node_modules/nodetime/node_modules/v8tools/build/Release/.deps/Release/obj.target/v8tools/src/profiler.o.d delete mode 100644 node_modules/nodetime/node_modules/v8tools/build/Release/.deps/Release/obj.target/v8tools/src/v8tools.o.d delete mode 100644 node_modules/nodetime/node_modules/v8tools/build/Release/.deps/Release/v8tools.node.d delete mode 100644 node_modules/nodetime/node_modules/v8tools/build/Release/linker.lock delete mode 100644 node_modules/nodetime/node_modules/v8tools/build/Release/obj.target/v8tools/src/gc.o delete mode 100644 node_modules/nodetime/node_modules/v8tools/build/Release/obj.target/v8tools/src/profiler.o delete mode 100644 node_modules/nodetime/node_modules/v8tools/build/Release/obj.target/v8tools/src/v8tools.o delete mode 100755 node_modules/nodetime/node_modules/v8tools/build/Release/v8tools.node delete mode 100644 node_modules/nodetime/node_modules/v8tools/build/binding.Makefile delete mode 100644 node_modules/nodetime/node_modules/v8tools/build/config.gypi delete mode 100755 node_modules/nodetime/node_modules/v8tools/build/gyp-mac-tool delete mode 100644 node_modules/nodetime/node_modules/v8tools/build/v8tools.target.mk delete mode 100644 node_modules/nodetime/node_modules/v8tools/index.js delete mode 100644 node_modules/nodetime/node_modules/v8tools/node_modules/bindings/README.md delete mode 100644 node_modules/nodetime/node_modules/v8tools/node_modules/bindings/bindings.js delete mode 100644 node_modules/nodetime/node_modules/v8tools/node_modules/bindings/package.json delete mode 100644 node_modules/nodetime/node_modules/v8tools/package.json delete mode 100644 node_modules/nodetime/node_modules/v8tools/src/gc.cc delete mode 100644 node_modules/nodetime/node_modules/v8tools/src/gc.h delete mode 100644 node_modules/nodetime/node_modules/v8tools/src/profiler.cc delete mode 100644 node_modules/nodetime/node_modules/v8tools/src/profiler.h delete mode 100644 node_modules/nodetime/node_modules/v8tools/src/v8tools.cc delete mode 100644 node_modules/nodetime/node_modules/v8tools/v8tools.cc delete mode 100644 node_modules/nodetime/node_modules/v8tools/wscript delete mode 100644 node_modules/nodetime/package.json delete mode 100644 node_modules/timekit/.npmignore delete mode 100644 node_modules/timekit/LICENSE delete mode 100644 node_modules/timekit/README.md delete mode 100644 node_modules/timekit/binding.gyp delete mode 100644 node_modules/timekit/build/Makefile delete mode 100644 node_modules/timekit/build/Release/.deps/Release/obj.target/timekit/src/timekit_posix.o.d delete mode 100644 node_modules/timekit/build/Release/.deps/Release/timekit.node.d delete mode 100644 node_modules/timekit/build/Release/linker.lock delete mode 100644 node_modules/timekit/build/Release/obj.target/timekit/src/timekit_posix.o delete mode 100644 node_modules/timekit/build/binding.Makefile delete mode 100755 node_modules/timekit/build/gyp-mac-tool delete mode 100644 node_modules/timekit/build/timekit.target.mk delete mode 100644 node_modules/timekit/index.js delete mode 100644 node_modules/timekit/node_modules/bindings/README.md delete mode 100644 node_modules/timekit/src/timekit_posix.cc delete mode 100644 node_modules/timekit/src/timekit_win.cc delete mode 100644 node_modules/timekit/timekit.cc delete mode 100644 node_modules/timekit/wscript diff --git a/.gitignore b/.gitignore index d66aeab..01ae8f7 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ # live config config.js +.env # backups backups diff --git a/config.sample.js b/config.sample.js deleted file mode 100644 index fbdbef0..0000000 --- a/config.sample.js +++ /dev/null @@ -1,12 +0,0 @@ -var config = {} - -config.secret = 'your-secret'; -config.consumer = 'your-app-name'; -config.api = {}; -config.api.version = '1.0'; -config.mongodb = {}; -config.mongodb.live = 'mongodb://user:pass@host.domain.com:port/dbname' -config.mongodb.local = 'mongodb://localhost/dbname' -config.mongodb.staging = 'mongodb://user:pass@host.domain.com:port/staging-dbname' - -module.exports = config; diff --git a/node_modules/express/.travis.yml b/node_modules/express/.travis.yml index 895dbd3..09d3ef3 100644 --- a/node_modules/express/.travis.yml +++ b/node_modules/express/.travis.yml @@ -1,4 +1,4 @@ language: node_js node_js: - - 0.6 - 0.8 + - 0.10 diff --git a/node_modules/express/History.md b/node_modules/express/History.md index 1a2b171..880242d 100644 --- a/node_modules/express/History.md +++ b/node_modules/express/History.md @@ -1,4 +1,13 @@ +3.1.1 / 2013-04-01 +================== + + * add X-Forwarded-Host support to `req.host` + * fix relative redirects + * update mkdirp + * update buffer-crc32 + * remove legacy app.configure() method from app template. + 3.1.0 / 2013-01-25 ================== diff --git a/node_modules/express/Readme.md b/node_modules/express/Readme.md index 6bb8b95..f83e5a8 100644 --- a/node_modules/express/Readme.md +++ b/node_modules/express/Readme.md @@ -1,6 +1,6 @@ ![express logo](http://f.cl.ly/items/0V2S1n0K1i3y1c122g04/Screen%20Shot%202012-04-11%20at%209.59.42%20AM.png) - Fast, unopinionated, minimalist web framework for [node](http://nodejs.org). [![Build Status](https://secure.travis-ci.org/visionmedia/express.png)](http://travis-ci.org/visionmedia/express) + Fast, unopinionated, minimalist web framework for [node](http://nodejs.org). [![Build Status](https://secure.travis-ci.org/visionmedia/express.png)](http://travis-ci.org/visionmedia/express) [![Dependency Status](https://gemnasium.com/visionmedia/express.png)](https://gemnasium.com/visionmedia/express) ```js var express = require('express'); @@ -51,7 +51,7 @@ app.listen(3000); The Express philosophy is to provide small, robust tooling for HTTP servers. Making it a great solution for single page applications, web sites, hybrids, or public HTTP APIs. - + Built on Connect you can use _only_ what you need, and nothing more, applications can be as big or as small as you like, even a single file. Express does not force you to use any specific ORM or template engine. With support for over @@ -66,6 +66,7 @@ app.listen(3000); * Visit the [Wiki](http://github.com/visionmedia/express/wiki) * [日本語ドキュメンテーション](http://hideyukisaito.com/doc/expressjs/) by [hideyukisaito](https://github.com/hideyukisaito) * [Русскоязычная документация](http://express-js.ru/) + * Run express examples [online](https://runnable.com/express) ## Viewing Examples @@ -96,7 +97,7 @@ project: express commits: 3559 active : 468 days files : 237 -authors: +authors: 1891 Tj Holowaychuk 53.1% 1285 visionmedia 36.1% 182 TJ Holowaychuk 5.1% @@ -153,7 +154,7 @@ authors: 1 Masahiro Hayashi 0.0% ``` -## License +## License (The MIT License) diff --git a/node_modules/express/bin/express b/node_modules/express/bin/express index 3c0090c..337c74e 100755 --- a/node_modules/express/bin/express +++ b/node_modules/express/bin/express @@ -30,7 +30,7 @@ var path = program.args.shift() || '.'; // end-of-line code -var eol = 'win32' == os.platform() ? '\r\n' : '\n' +var eol = os.EOL // Template engine @@ -216,27 +216,27 @@ var app = [ , '' , 'var app = express();' , '' - , 'app.configure(function(){' - , ' app.set(\'port\', process.env.PORT || 3000);' - , ' app.set(\'views\', __dirname + \'/views\');' - , ' app.set(\'view engine\', \':TEMPLATE\');' - , ' app.use(express.favicon());' - , ' app.use(express.logger(\'dev\'));' - , ' app.use(express.bodyParser());' - , ' app.use(express.methodOverride());{sess}' - , ' app.use(app.router);{css}' - , ' app.use(express.static(path.join(__dirname, \'public\')));' - , '});' + , '// all environments' + , 'app.set(\'port\', process.env.PORT || 3000);' + , 'app.set(\'views\', __dirname + \'/views\');' + , 'app.set(\'view engine\', \':TEMPLATE\');' + , 'app.use(express.favicon());' + , 'app.use(express.logger(\'dev\'));' + , 'app.use(express.bodyParser());' + , 'app.use(express.methodOverride());{sess}' + , 'app.use(app.router);{css}' + , 'app.use(express.static(path.join(__dirname, \'public\')));' , '' - , 'app.configure(\'development\', function(){' + , '// development only' + , 'if (\'development\' == app.get(\'env\')) {' , ' app.use(express.errorHandler());' - , '});' + , '}' , '' , 'app.get(\'/\', routes.index);' , 'app.get(\'/users\', user.list);' , '' , 'http.createServer(app).listen(app.get(\'port\'), function(){' - , ' console.log("Express server listening on port " + app.get(\'port\'));' + , ' console.log(\'Express server listening on port \' + app.get(\'port\'));' , '});' , '' ].join(eol); @@ -345,7 +345,7 @@ function createApplicationAt(path) { name: 'application-name' , version: '0.0.1' , private: true - , scripts: { start: 'node app' } + , scripts: { start: 'node app.js' } , dependencies: { express: version } diff --git a/node_modules/express/lib/application.js b/node_modules/express/lib/application.js index 7ebc6f6..902d574 100644 --- a/node_modules/express/lib/application.js +++ b/node_modules/express/lib/application.js @@ -34,7 +34,6 @@ app.init = function(){ this.cache = {}; this.settings = {}; this.engines = {}; - this.viewCallbacks = []; this.defaultConfiguration(); }; @@ -161,7 +160,7 @@ app.use = function(route, fn){ * [Consolidate.js](https://github.com/visionmedia/consolidate.js) * library was created to map all of node's popular template * engines to follow this convention, thus allowing them to - * work seeessly within Express. + * work seamlessly within Express. * * @param {String} ext * @param {Function} fn @@ -405,7 +404,7 @@ methods.forEach(function(method){ app[method] = function(path){ if ('get' == method && 1 == arguments.length) return this.set(path); - // if no router attacked yet, attach the router + // if no router attached yet, attach the router if (!this._usedRouter) this.use(this.router); // setup route diff --git a/node_modules/express/lib/express.js b/node_modules/express/lib/express.js index 2a704b2..43dc28e 100644 --- a/node_modules/express/lib/express.js +++ b/node_modules/express/lib/express.js @@ -20,7 +20,7 @@ exports = module.exports = createApplication; * Framework version. */ -exports.version = '3.1.0'; +exports.version = '3.1.1'; /** * Expose mime. diff --git a/node_modules/express/lib/request.js b/node_modules/express/lib/request.js index 1c6048d..a60bdf6 100644 --- a/node_modules/express/lib/request.js +++ b/node_modules/express/lib/request.js @@ -440,7 +440,10 @@ req.__defineGetter__('path', function(){ */ req.__defineGetter__('host', function(){ - return this.get('Host').split(':')[0]; + var trustProxy = this.app.get('trust proxy'); + var host = trustProxy && this.get('X-Forwarded-Host'); + host = host || this.get('Host'); + return host.split(':')[0]; }); /** diff --git a/node_modules/express/lib/response.js b/node_modules/express/lib/response.js index 2b66c88..63d8955 100644 --- a/node_modules/express/lib/response.js +++ b/node_modules/express/lib/response.js @@ -634,13 +634,15 @@ res.location = function(url){ // relative if (!~url.indexOf('://') && 0 != url.indexOf('//')) { - var path = app.path(); + var path // relative to path if ('.' == url[0]) { - url = req.path + '/' + url; - // relative to mount-point + path = req.originalUrl.split('?')[0] + url = path + ('/' == path[path.length - 1] ? '' : '/') + url; + // relative to mount-point } else if ('/' != url[0]) { + path = app.path(); url = path + '/' + url; } } diff --git a/node_modules/express/lib/utils.js b/node_modules/express/lib/utils.js index 8b1da1a..cad3a65 100644 --- a/node_modules/express/lib/utils.js +++ b/node_modules/express/lib/utils.js @@ -20,8 +20,8 @@ exports.etag = function(body){ /** * Make `locals()` bound to the given `obj`. - * - * This is used for `app.locals` and `res.locals`. + * + * This is used for `app.locals` and `res.locals`. * * @param {Object} obj * @return {Function} @@ -29,8 +29,6 @@ exports.etag = function(body){ */ exports.locals = function(obj){ - obj.viewCallbacks = obj.viewCallbacks || []; - function locals(obj){ for (var key in obj) locals[key] = obj[key]; return obj; @@ -279,4 +277,4 @@ exports.pathRegexp = function(path, keys, sensitive, strict) { .replace(/([\/.])/g, '\\$1') .replace(/\*/g, '(.*)'); return new RegExp('^' + path + '$', sensitive ? '' : 'i'); -} \ No newline at end of file +} diff --git a/node_modules/express/lib/view.js b/node_modules/express/lib/view.js index c7399a4..ae20b17 100644 --- a/node_modules/express/lib/view.js +++ b/node_modules/express/lib/view.js @@ -8,7 +8,7 @@ var path = require('path') , dirname = path.dirname , basename = path.basename , extname = path.extname - , exists = fs.existsSync || path.existsSync + , exists = fs.existsSync || path.existsSync , join = path.join; /** @@ -22,9 +22,9 @@ module.exports = View; * * Options: * - * - `defaultEngine` the default template engine name - * - `engines` template engine require() cache - * - `root` root path for view lookup + * - `defaultEngine` the default template engine name + * - `engines` template engine require() cache + * - `root` root path for view lookup * * @param {String} name * @param {Object} options diff --git a/node_modules/express/node_modules/buffer-crc32/README.md b/node_modules/express/node_modules/buffer-crc32/README.md index 4ad5d64..0d9d8b8 100644 --- a/node_modules/express/node_modules/buffer-crc32/README.md +++ b/node_modules/express/node_modules/buffer-crc32/README.md @@ -16,7 +16,7 @@ npm install buffer-crc32 ```js var crc32 = require('buffer-crc32'); // works with buffers -var buf = Buffer([[0x00, 0x73, 0x75, 0x70, 0x20, 0x62, 0x72, 0x6f, 0x00]) +var buf = Buffer([0x00, 0x73, 0x75, 0x70, 0x20, 0x62, 0x72, 0x6f, 0x00]) crc32(buf) // -> // has convenience methods for getting signed or unsigned ints @@ -26,8 +26,22 @@ crc32.unsigned(buf) // -> 2488970058 // will cast to buffer if given a string, so you can // directly use foreign characters safely crc32('自動販売機') // -> + +// and works in append mode too +var partialCrc = crc32('hey'); +var partialCrc = crc32(' ', partialCrc); +var partialCrc = crc32('sup', partialCrc); +var partialCrc = crc32(' ', partialCrc); +var finalCrc = crc32('bros', partialCrc); // -> ``` # tests This was tested against the output of zlib's crc32 method. You can run the tests with`npm test` (requires tap) + +# see also +https://github.com/alexgorbatchev/node-crc, `crc.buffer.crc32` also +supports buffer inputs and return unsigned ints (thanks @tjholowaychuk). + +# license +MIT/X11 diff --git a/node_modules/express/node_modules/buffer-crc32/index.js b/node_modules/express/node_modules/buffer-crc32/index.js index ab0e19e..e29ce3e 100644 --- a/node_modules/express/node_modules/buffer-crc32/index.js +++ b/node_modules/express/node_modules/buffer-crc32/index.js @@ -61,14 +61,18 @@ function bufferizeInt(num) { return tmp; } -function _crc32(buf) { - if (!Buffer.isBuffer(buf)) +function _crc32(buf, previous) { + if (!Buffer.isBuffer(buf)) { buf = Buffer(buf); - var crc = 0xffffffff; + } + if (Buffer.isBuffer(previous)) { + previous = previous.readUInt32BE(0); + } + var crc = ~~previous ^ -1; for (var n = 0; n < buf.length; n++) { crc = CRC_TABLE[(crc ^ buf[n]) & 0xff] ^ (crc >>> 8); } - return (crc ^ 0xffffffff); + return (crc ^ -1); } function crc32() { @@ -78,7 +82,7 @@ crc32.signed = function () { return _crc32.apply(null, arguments); }; crc32.unsigned = function () { - return crc32.apply(null, arguments).readUInt32BE(0); + return _crc32.apply(null, arguments) >>> 0; }; module.exports = crc32; diff --git a/node_modules/express/node_modules/buffer-crc32/package.json b/node_modules/express/node_modules/buffer-crc32/package.json index 218b7f0..e01c98d 100644 --- a/node_modules/express/node_modules/buffer-crc32/package.json +++ b/node_modules/express/node_modules/buffer-crc32/package.json @@ -6,7 +6,12 @@ }, "name": "buffer-crc32", "description": "A pure javascript CRC32 algorithm that plays nice with binary data", - "version": "0.1.1", + "version": "0.2.1", + "contributors": [ + { + "name": "Vladimir Kuznetsov" + } + ], "homepage": "https://github.com/brianloveswords/buffer-crc32", "repository": { "type": "git", @@ -24,10 +29,7 @@ "engines": { "node": "*" }, - "readme": "# buffer-crc32\n\n[![Build Status](https://secure.travis-ci.org/brianloveswords/buffer-crc32.png?branch=master)](http://travis-ci.org/brianloveswords/buffer-crc32)\n\ncrc32 that works with binary data and fancy character sets, outputs\nbuffer, signed or unsigned data and has tests.\n\nDerived from the sample CRC implementation in the PNG specification: http://www.w3.org/TR/PNG/#D-CRCAppendix\n\n# install\n```\nnpm install buffer-crc32\n```\n\n# example\n```js\nvar crc32 = require('buffer-crc32');\n// works with buffers\nvar buf = Buffer([[0x00, 0x73, 0x75, 0x70, 0x20, 0x62, 0x72, 0x6f, 0x00])\ncrc32(buf) // -> \n\n// has convenience methods for getting signed or unsigned ints\ncrc32.signed(buf) // -> -1805997238\ncrc32.unsigned(buf) // -> 2488970058\n\n// will cast to buffer if given a string, so you can\n// directly use foreign characters safely\ncrc32('自動販売機') // -> \n```\n\n# tests\nThis was tested against the output of zlib's crc32 method. You can run\nthe tests with`npm test` (requires tap)\n", - "_id": "buffer-crc32@0.1.1", - "dist": { - "shasum": "ecc6503bdc28bbaebd6cd3f8a5251f857122b87c" - }, - "_from": "buffer-crc32@0.1.1" + "readme": "# buffer-crc32\n\n[![Build Status](https://secure.travis-ci.org/brianloveswords/buffer-crc32.png?branch=master)](http://travis-ci.org/brianloveswords/buffer-crc32)\n\ncrc32 that works with binary data and fancy character sets, outputs\nbuffer, signed or unsigned data and has tests.\n\nDerived from the sample CRC implementation in the PNG specification: http://www.w3.org/TR/PNG/#D-CRCAppendix\n\n# install\n```\nnpm install buffer-crc32\n```\n\n# example\n```js\nvar crc32 = require('buffer-crc32');\n// works with buffers\nvar buf = Buffer([0x00, 0x73, 0x75, 0x70, 0x20, 0x62, 0x72, 0x6f, 0x00])\ncrc32(buf) // -> \n\n// has convenience methods for getting signed or unsigned ints\ncrc32.signed(buf) // -> -1805997238\ncrc32.unsigned(buf) // -> 2488970058\n\n// will cast to buffer if given a string, so you can\n// directly use foreign characters safely\ncrc32('自動販売機') // -> \n\n// and works in append mode too\nvar partialCrc = crc32('hey');\nvar partialCrc = crc32(' ', partialCrc);\nvar partialCrc = crc32('sup', partialCrc);\nvar partialCrc = crc32(' ', partialCrc);\nvar finalCrc = crc32('bros', partialCrc); // -> \n```\n\n# tests\nThis was tested against the output of zlib's crc32 method. You can run\nthe tests with`npm test` (requires tap)\n\n# see also\nhttps://github.com/alexgorbatchev/node-crc, `crc.buffer.crc32` also\nsupports buffer inputs and return unsigned ints (thanks @tjholowaychuk).\n\n# license\nMIT/X11\n", + "_id": "buffer-crc32@0.2.1", + "_from": "buffer-crc32@~0.2.1" } diff --git a/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js b/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js index d4767e3..bb0f9ef 100644 --- a/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js +++ b/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js @@ -36,17 +36,54 @@ test('casts to buffer if necessary', function (t) { t.end(); }); -test('can do unsigned', function (t) { +test('can do signed', function (t) { var input = 'ham sandwich'; var expected = -1891873021; t.same(crc32.signed(input), expected); t.end(); }); -test('can do signed', function (t) { +test('can do unsigned', function (t) { var input = 'bear sandwich'; var expected = 3711466352; t.same(crc32.unsigned(input), expected); t.end(); }); + +test('simple crc32 in append mode', function (t) { + var input = [Buffer('hey'), Buffer(' '), Buffer('sup'), Buffer(' '), Buffer('bros')]; + var expected = Buffer([0x47, 0xfa, 0x55, 0x70]); + for (var crc = 0, i = 0; i < input.length; i++) { + crc = crc32(input[i], crc); + } + t.same(crc, expected); + t.end(); +}); + + +test('can do signed in append mode', function (t) { + var input1 = 'ham'; + var input2 = ' '; + var input3 = 'sandwich'; + var expected = -1891873021; + + var crc = crc32.signed(input1); + crc = crc32.signed(input2, crc); + crc = crc32.signed(input3, crc); + + t.same(crc, expected); + t.end(); +}); + +test('can do unsigned in append mode', function (t) { + var input1 = 'bear san'; + var input2 = 'dwich'; + var expected = 3711466352; + + var crc = crc32.unsigned(input1); + crc = crc32.unsigned(input2, crc); + t.same(crc, expected); + t.end(); +}); + diff --git a/node_modules/express/node_modules/commander/package.json b/node_modules/express/node_modules/commander/package.json index 84ea1c5..764dece 100644 --- a/node_modules/express/node_modules/commander/package.json +++ b/node_modules/express/node_modules/commander/package.json @@ -30,8 +30,5 @@ }, "readme": "# Commander.js\n\n The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/visionmedia/commander).\n\n [![Build Status](https://secure.travis-ci.org/visionmedia/commander.js.png)](http://travis-ci.org/visionmedia/commander.js)\n\n## Installation\n\n $ npm install commander\n\n## Option parsing\n\n Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options.\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('commander');\n\nprogram\n .version('0.0.1')\n .option('-p, --peppers', 'Add peppers')\n .option('-P, --pineapple', 'Add pineapple')\n .option('-b, --bbq', 'Add bbq sauce')\n .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')\n .parse(process.argv);\n\nconsole.log('you ordered a pizza with:');\nif (program.peppers) console.log(' - peppers');\nif (program.pineapple) console.log(' - pineappe');\nif (program.bbq) console.log(' - bbq');\nconsole.log(' - %s cheese', program.cheese);\n```\n\n Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as \"--template-engine\" are camel-cased, becoming `program.templateEngine` etc.\n\n## Automated --help\n\n The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free:\n\n``` \n $ ./examples/pizza --help\n\n Usage: pizza [options]\n\n Options:\n\n -V, --version output the version number\n -p, --peppers Add peppers\n -P, --pineapple Add pineappe\n -b, --bbq Add bbq sauce\n -c, --cheese Add the specified type of cheese [marble]\n -h, --help output usage information\n\n```\n\n## Coercion\n\n```js\nfunction range(val) {\n return val.split('..').map(Number);\n}\n\nfunction list(val) {\n return val.split(',');\n}\n\nprogram\n .version('0.0.1')\n .usage('[options] ')\n .option('-i, --integer ', 'An integer argument', parseInt)\n .option('-f, --float ', 'A float argument', parseFloat)\n .option('-r, --range ..', 'A range', range)\n .option('-l, --list ', 'A list', list)\n .option('-o, --optional [value]', 'An optional value')\n .parse(process.argv);\n\nconsole.log(' int: %j', program.integer);\nconsole.log(' float: %j', program.float);\nconsole.log(' optional: %j', program.optional);\nprogram.range = program.range || [];\nconsole.log(' range: %j..%j', program.range[0], program.range[1]);\nconsole.log(' list: %j', program.list);\nconsole.log(' args: %j', program.args);\n```\n\n## Custom help\n\n You can display arbitrary `-h, --help` information\n by listening for \"--help\". Commander will automatically\n exit once you are done so that the remainder of your program\n does not execute causing undesired behaviours, for example\n in the following executable \"stuff\" will not output when\n `--help` is used.\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('../');\n\nfunction list(val) {\n return val.split(',').map(Number);\n}\n\nprogram\n .version('0.0.1')\n .option('-f, --foo', 'enable some foo')\n .option('-b, --bar', 'enable some bar')\n .option('-B, --baz', 'enable some baz');\n\n// must be before .parse() since\n// node's emit() is immediate\n\nprogram.on('--help', function(){\n console.log(' Examples:');\n console.log('');\n console.log(' $ custom-help --help');\n console.log(' $ custom-help -h');\n console.log('');\n});\n\nprogram.parse(process.argv);\n\nconsole.log('stuff');\n```\n\nyielding the following help output:\n\n```\n\nUsage: custom-help [options]\n\nOptions:\n\n -h, --help output usage information\n -V, --version output the version number\n -f, --foo enable some foo\n -b, --bar enable some bar\n -B, --baz enable some baz\n\nExamples:\n\n $ custom-help --help\n $ custom-help -h\n\n```\n\n## .prompt(msg, fn)\n\n Single-line prompt:\n\n```js\nprogram.prompt('name: ', function(name){\n console.log('hi %s', name);\n});\n```\n\n Multi-line prompt:\n\n```js\nprogram.prompt('description:', function(name){\n console.log('hi %s', name);\n});\n```\n\n Coercion:\n\n```js\nprogram.prompt('Age: ', Number, function(age){\n console.log('age: %j', age);\n});\n```\n\n```js\nprogram.prompt('Birthdate: ', Date, function(date){\n console.log('date: %s', date);\n});\n```\n\n## .password(msg[, mask], fn)\n\nPrompt for password without echoing:\n\n```js\nprogram.password('Password: ', function(pass){\n console.log('got \"%s\"', pass);\n process.stdin.destroy();\n});\n```\n\nPrompt for password with mask char \"*\":\n\n```js\nprogram.password('Password: ', '*', function(pass){\n console.log('got \"%s\"', pass);\n process.stdin.destroy();\n});\n```\n\n## .confirm(msg, fn)\n\n Confirm with the given `msg`:\n\n```js\nprogram.confirm('continue? ', function(ok){\n console.log(' got %j', ok);\n});\n```\n\n## .choose(list, fn)\n\n Let the user choose from a `list`:\n\n```js\nvar list = ['tobi', 'loki', 'jane', 'manny', 'luna'];\n\nconsole.log('Choose the coolest pet:');\nprogram.choose(list, function(i){\n console.log('you chose %d \"%s\"', i, list[i]);\n});\n```\n\n## Links\n\n - [API documentation](http://visionmedia.github.com/commander.js/)\n - [ascii tables](https://github.com/LearnBoost/cli-table)\n - [progress bars](https://github.com/visionmedia/node-progress)\n - [more progress bars](https://github.com/substack/node-multimeter)\n - [examples](https://github.com/visionmedia/commander.js/tree/master/examples)\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", "_id": "commander@0.6.1", - "dist": { - "shasum": "170a6ea831bb599b1a126e9612ca17abe65873c9" - }, "_from": "commander@0.6.1" } diff --git a/node_modules/express/node_modules/connect/lib-cov/cache.js b/node_modules/express/node_modules/connect/lib-cov/cache.js deleted file mode 100644 index af6cd2f..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/cache.js +++ /dev/null @@ -1,68 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['cache.js']) { - _$jscoverage['cache.js'] = []; - _$jscoverage['cache.js'][12] = 0; - _$jscoverage['cache.js'][21] = 0; - _$jscoverage['cache.js'][22] = 0; - _$jscoverage['cache.js'][23] = 0; - _$jscoverage['cache.js'][24] = 0; - _$jscoverage['cache.js'][35] = 0; - _$jscoverage['cache.js'][36] = 0; - _$jscoverage['cache.js'][37] = 0; - _$jscoverage['cache.js'][47] = 0; - _$jscoverage['cache.js'][48] = 0; - _$jscoverage['cache.js'][59] = 0; - _$jscoverage['cache.js'][60] = 0; - _$jscoverage['cache.js'][71] = 0; - _$jscoverage['cache.js'][73] = 0; - _$jscoverage['cache.js'][76] = 0; - _$jscoverage['cache.js'][78] = 0; - _$jscoverage['cache.js'][79] = 0; - _$jscoverage['cache.js'][80] = 0; -} -_$jscoverage['cache.js'][12]++; -module.exports = Cache; -_$jscoverage['cache.js'][21]++; -function Cache(limit) { - _$jscoverage['cache.js'][22]++; - this.store = {}; - _$jscoverage['cache.js'][23]++; - this.keys = []; - _$jscoverage['cache.js'][24]++; - this.limit = limit; -} -_$jscoverage['cache.js'][35]++; -Cache.prototype.touch = (function (key, i) { - _$jscoverage['cache.js'][36]++; - this.keys.splice(i, 1); - _$jscoverage['cache.js'][37]++; - this.keys.push(key); -}); -_$jscoverage['cache.js'][47]++; -Cache.prototype.remove = (function (key) { - _$jscoverage['cache.js'][48]++; - delete this.store[key]; -}); -_$jscoverage['cache.js'][59]++; -Cache.prototype.get = (function (key) { - _$jscoverage['cache.js'][60]++; - return this.store[key]; -}); -_$jscoverage['cache.js'][71]++; -Cache.prototype.add = (function (key) { - _$jscoverage['cache.js'][73]++; - var len = this.keys.push(key); - _$jscoverage['cache.js'][76]++; - if (len > this.limit) { - _$jscoverage['cache.js'][76]++; - this.remove(this.keys.shift()); - } - _$jscoverage['cache.js'][78]++; - var arr = this.store[key] = []; - _$jscoverage['cache.js'][79]++; - arr.createdAt = new Date(); - _$jscoverage['cache.js'][80]++; - return arr; -}); -_$jscoverage['cache.js'].source = ["","/*!"," * Connect - Cache"," * Copyright(c) 2011 Sencha Inc."," * MIT Licensed"," */","","/**"," * Expose `Cache`."," */","","module.exports = Cache;","","/**"," * LRU cache store."," *"," * @param {Number} limit"," * @api private"," */","","function Cache(limit) {"," this.store = {};"," this.keys = [];"," this.limit = limit;","}","","/**"," * Touch `key`, promoting the object."," *"," * @param {String} key"," * @param {Number} i"," * @api private"," */","","Cache.prototype.touch = function(key, i){"," this.keys.splice(i,1);"," this.keys.push(key);","};","","/**"," * Remove `key`."," *"," * @param {String} key"," * @api private"," */","","Cache.prototype.remove = function(key){"," delete this.store[key];","};","","/**"," * Get the object stored for `key`."," *"," * @param {String} key"," * @return {Array}"," * @api private"," */","","Cache.prototype.get = function(key){"," return this.store[key];","};","","/**"," * Add a cache `key`."," *"," * @param {String} key"," * @return {Array}"," * @api private"," */","","Cache.prototype.add = function(key){"," // initialize store"," var len = this.keys.push(key);",""," // limit reached, invalidate LRU"," if (len > this.limit) this.remove(this.keys.shift());",""," var arr = this.store[key] = [];"," arr.createdAt = new Date;"," return arr;","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/connect.js b/node_modules/express/node_modules/connect/lib-cov/connect.js deleted file mode 100644 index f811bb8..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/connect.js +++ /dev/null @@ -1,93 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['connect.js']) { - _$jscoverage['connect.js'] = []; - _$jscoverage['connect.js'][13] = 0; - _$jscoverage['connect.js'][22] = 0; - _$jscoverage['connect.js'][26] = 0; - _$jscoverage['connect.js'][32] = 0; - _$jscoverage['connect.js'][38] = 0; - _$jscoverage['connect.js'][44] = 0; - _$jscoverage['connect.js'][50] = 0; - _$jscoverage['connect.js'][56] = 0; - _$jscoverage['connect.js'][65] = 0; - _$jscoverage['connect.js'][66] = 0; - _$jscoverage['connect.js'][67] = 0; - _$jscoverage['connect.js'][68] = 0; - _$jscoverage['connect.js'][69] = 0; - _$jscoverage['connect.js'][70] = 0; - _$jscoverage['connect.js'][71] = 0; - _$jscoverage['connect.js'][72] = 0; - _$jscoverage['connect.js'][74] = 0; - _$jscoverage['connect.js'][75] = 0; - _$jscoverage['connect.js'][81] = 0; - _$jscoverage['connect.js'][87] = 0; - _$jscoverage['connect.js'][88] = 0; - _$jscoverage['connect.js'][89] = 0; - _$jscoverage['connect.js'][90] = 0; - _$jscoverage['connect.js'][91] = 0; - _$jscoverage['connect.js'][92] = 0; -} -_$jscoverage['connect.js'][13]++; -var EventEmitter = require("events").EventEmitter, proto = require("./proto"), utils = require("./utils"), path = require("path"), basename = path.basename, fs = require("fs"); -_$jscoverage['connect.js'][22]++; -require("./patch"); -_$jscoverage['connect.js'][26]++; -exports = module.exports = createServer; -_$jscoverage['connect.js'][32]++; -exports.version = "2.6.1"; -_$jscoverage['connect.js'][38]++; -exports.mime = require("./middleware/static").mime; -_$jscoverage['connect.js'][44]++; -exports.proto = proto; -_$jscoverage['connect.js'][50]++; -exports.middleware = {}; -_$jscoverage['connect.js'][56]++; -exports.utils = utils; -_$jscoverage['connect.js'][65]++; -function createServer() { - _$jscoverage['connect.js'][66]++; - function app(req, res) { - _$jscoverage['connect.js'][66]++; - app.handle(req, res); -} - _$jscoverage['connect.js'][67]++; - utils.merge(app, proto); - _$jscoverage['connect.js'][68]++; - utils.merge(app, EventEmitter.prototype); - _$jscoverage['connect.js'][69]++; - app.route = "/"; - _$jscoverage['connect.js'][70]++; - app.stack = []; - _$jscoverage['connect.js'][71]++; - for (var i = 0; i < arguments.length; ++i) { - _$jscoverage['connect.js'][72]++; - app.use(arguments[i]); -} - _$jscoverage['connect.js'][74]++; - return app; -} -_$jscoverage['connect.js'][75]++; -; -_$jscoverage['connect.js'][81]++; -createServer.createServer = createServer; -_$jscoverage['connect.js'][87]++; -fs.readdirSync(__dirname + "/middleware").forEach((function (filename) { - _$jscoverage['connect.js'][88]++; - if (! /\.js$/.test(filename)) { - _$jscoverage['connect.js'][88]++; - return; - } - _$jscoverage['connect.js'][89]++; - var name = basename(filename, ".js"); - _$jscoverage['connect.js'][90]++; - function load() { - _$jscoverage['connect.js'][90]++; - return require("./middleware/" + name); -} - _$jscoverage['connect.js'][91]++; - exports.middleware.__defineGetter__(name, load); - _$jscoverage['connect.js'][92]++; - exports.__defineGetter__(name, load); -})); -_$jscoverage['connect.js'].source = ["","/*!"," * Connect"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var EventEmitter = require('events').EventEmitter"," , proto = require('./proto')"," , utils = require('./utils')"," , path = require('path')"," , basename = path.basename"," , fs = require('fs');","","// node patches","","require('./patch');","","// expose createServer() as the module","","exports = module.exports = createServer;","","/**"," * Framework version."," */","","exports.version = '2.6.1';","","/**"," * Expose mime module."," */","","exports.mime = require('./middleware/static').mime;","","/**"," * Expose the prototype."," */","","exports.proto = proto;","","/**"," * Auto-load middleware getters."," */","","exports.middleware = {};","","/**"," * Expose utilities."," */","","exports.utils = utils;","","/**"," * Create a new connect server."," *"," * @return {Function}"," * @api public"," */","","function createServer() {"," function app(req, res){ app.handle(req, res); }"," utils.merge(app, proto);"," utils.merge(app, EventEmitter.prototype);"," app.route = '/';"," app.stack = [];"," for (var i = 0; i < arguments.length; ++i) {"," app.use(arguments[i]);"," }"," return app;","};","","/**"," * Support old `.createServer()` method."," */","","createServer.createServer = createServer;","","/**"," * Auto-load bundled middleware with getters."," */","","fs.readdirSync(__dirname + '/middleware').forEach(function(filename){"," if (!/\\.js$/.test(filename)) return;"," var name = basename(filename, '.js');"," function load(){ return require('./middleware/' + name); }"," exports.middleware.__defineGetter__(name, load);"," exports.__defineGetter__(name, load);","});"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/index.js b/node_modules/express/node_modules/connect/lib-cov/index.js deleted file mode 100644 index e6bb1c7..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/index.js +++ /dev/null @@ -1,6 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['index.js']) { - _$jscoverage['index.js'] = []; -} -_$jscoverage['index.js'].source = ["","/**"," * Connect is a middleware framework for node,"," * shipping with over 18 bundled middleware and a rich selection of"," * 3rd-party middleware."," *"," * var app = connect()"," * .use(connect.logger('dev'))"," * .use(connect.static('public'))"," * .use(function(req, res){"," * res.end('hello world\\n');"," * })"," * .listen(3000);"," * "," * Installation:"," * "," * $ npm install connect"," *"," * Middleware:"," *"," * - [logger](logger.html) request logger with custom format support"," * - [csrf](csrf.html) Cross-site request forgery protection"," * - [compress](compress.html) Gzip compression middleware"," * - [basicAuth](basicAuth.html) basic http authentication"," * - [bodyParser](bodyParser.html) extensible request body parser"," * - [json](json.html) application/json parser"," * - [urlencoded](urlencoded.html) application/x-www-form-urlencoded parser"," * - [multipart](multipart.html) multipart/form-data parser"," * - [timeout](timeout.html) request timeouts"," * - [cookieParser](cookieParser.html) cookie parser"," * - [session](session.html) session management support with bundled MemoryStore"," * - [cookieSession](cookieSession.html) cookie-based session support"," * - [methodOverride](methodOverride.html) faux HTTP method support"," * - [responseTime](responseTime.html) calculates response-time and exposes via X-Response-Time"," * - [staticCache](staticCache.html) memory cache layer for the static() middleware"," * - [static](static.html) streaming static file server supporting `Range` and more"," * - [directory](directory.html) directory listing middleware"," * - [vhost](vhost.html) virtual host sub-domain mapping middleware"," * - [favicon](favicon.html) efficient favicon server (with default icon)"," * - [limit](limit.html) limit the bytesize of request bodies"," * - [query](query.html) automatic querystring parser, populating `req.query`"," * - [errorHandler](errorHandler.html) flexible error handler"," *"," * Links:"," * "," * - list of [3rd-party](https://github.com/senchalabs/connect/wiki) middleware"," * - GitHub [repository](http://github.com/senchalabs/connect)"," * - [test documentation](https://github.com/senchalabs/connect/blob/gh-pages/tests.md)"," * "," */"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/basicAuth.js b/node_modules/express/node_modules/connect/lib-cov/middleware/basicAuth.js deleted file mode 100644 index c9e7d63..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/basicAuth.js +++ /dev/null @@ -1,128 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/basicAuth.js']) { - _$jscoverage['middleware/basicAuth.js'] = []; - _$jscoverage['middleware/basicAuth.js'][13] = 0; - _$jscoverage['middleware/basicAuth.js'][48] = 0; - _$jscoverage['middleware/basicAuth.js'][49] = 0; - _$jscoverage['middleware/basicAuth.js'][52] = 0; - _$jscoverage['middleware/basicAuth.js'][53] = 0; - _$jscoverage['middleware/basicAuth.js'][54] = 0; - _$jscoverage['middleware/basicAuth.js'][55] = 0; - _$jscoverage['middleware/basicAuth.js'][56] = 0; - _$jscoverage['middleware/basicAuth.js'][57] = 0; - _$jscoverage['middleware/basicAuth.js'][58] = 0; - _$jscoverage['middleware/basicAuth.js'][62] = 0; - _$jscoverage['middleware/basicAuth.js'][64] = 0; - _$jscoverage['middleware/basicAuth.js'][65] = 0; - _$jscoverage['middleware/basicAuth.js'][67] = 0; - _$jscoverage['middleware/basicAuth.js'][68] = 0; - _$jscoverage['middleware/basicAuth.js'][70] = 0; - _$jscoverage['middleware/basicAuth.js'][72] = 0; - _$jscoverage['middleware/basicAuth.js'][74] = 0; - _$jscoverage['middleware/basicAuth.js'][78] = 0; - _$jscoverage['middleware/basicAuth.js'][80] = 0; - _$jscoverage['middleware/basicAuth.js'][84] = 0; - _$jscoverage['middleware/basicAuth.js'][85] = 0; - _$jscoverage['middleware/basicAuth.js'][86] = 0; - _$jscoverage['middleware/basicAuth.js'][87] = 0; - _$jscoverage['middleware/basicAuth.js'][88] = 0; - _$jscoverage['middleware/basicAuth.js'][89] = 0; - _$jscoverage['middleware/basicAuth.js'][90] = 0; - _$jscoverage['middleware/basicAuth.js'][94] = 0; - _$jscoverage['middleware/basicAuth.js'][95] = 0; - _$jscoverage['middleware/basicAuth.js'][96] = 0; - _$jscoverage['middleware/basicAuth.js'][98] = 0; -} -_$jscoverage['middleware/basicAuth.js'][13]++; -var utils = require("../utils"), unauthorized = utils.unauthorized; -_$jscoverage['middleware/basicAuth.js'][48]++; -module.exports = (function basicAuth(callback, realm) { - _$jscoverage['middleware/basicAuth.js'][49]++; - var username, password; - _$jscoverage['middleware/basicAuth.js'][52]++; - if ("string" == typeof callback) { - _$jscoverage['middleware/basicAuth.js'][53]++; - username = callback; - _$jscoverage['middleware/basicAuth.js'][54]++; - password = realm; - _$jscoverage['middleware/basicAuth.js'][55]++; - if ("string" != typeof password) { - _$jscoverage['middleware/basicAuth.js'][55]++; - throw new Error("password argument required"); - } - _$jscoverage['middleware/basicAuth.js'][56]++; - realm = arguments[2]; - _$jscoverage['middleware/basicAuth.js'][57]++; - callback = (function (user, pass) { - _$jscoverage['middleware/basicAuth.js'][58]++; - return user == username && pass == password; -}); - } - _$jscoverage['middleware/basicAuth.js'][62]++; - realm = realm || "Authorization Required"; - _$jscoverage['middleware/basicAuth.js'][64]++; - return (function (req, res, next) { - _$jscoverage['middleware/basicAuth.js'][65]++; - var authorization = req.headers.authorization; - _$jscoverage['middleware/basicAuth.js'][67]++; - if (req.user) { - _$jscoverage['middleware/basicAuth.js'][67]++; - return next(); - } - _$jscoverage['middleware/basicAuth.js'][68]++; - if (! authorization) { - _$jscoverage['middleware/basicAuth.js'][68]++; - return unauthorized(res, realm); - } - _$jscoverage['middleware/basicAuth.js'][70]++; - var parts = authorization.split(" "); - _$jscoverage['middleware/basicAuth.js'][72]++; - if (parts.length !== 2) { - _$jscoverage['middleware/basicAuth.js'][72]++; - return next(utils.error(400)); - } - _$jscoverage['middleware/basicAuth.js'][74]++; - var scheme = parts[0], credentials = new Buffer(parts[1], "base64").toString(), index = credentials.indexOf(":"); - _$jscoverage['middleware/basicAuth.js'][78]++; - if ("Basic" != scheme || index < 0) { - _$jscoverage['middleware/basicAuth.js'][78]++; - return next(utils.error(400)); - } - _$jscoverage['middleware/basicAuth.js'][80]++; - var user = credentials.slice(0, index), pass = credentials.slice(index + 1); - _$jscoverage['middleware/basicAuth.js'][84]++; - if (callback.length >= 3) { - _$jscoverage['middleware/basicAuth.js'][85]++; - var pause = utils.pause(req); - _$jscoverage['middleware/basicAuth.js'][86]++; - callback(user, pass, (function (err, user) { - _$jscoverage['middleware/basicAuth.js'][87]++; - if (err || ! user) { - _$jscoverage['middleware/basicAuth.js'][87]++; - return unauthorized(res, realm); - } - _$jscoverage['middleware/basicAuth.js'][88]++; - req.user = req.remoteUser = user; - _$jscoverage['middleware/basicAuth.js'][89]++; - next(); - _$jscoverage['middleware/basicAuth.js'][90]++; - pause.resume(); -})); - } - else { - _$jscoverage['middleware/basicAuth.js'][94]++; - if (callback(user, pass)) { - _$jscoverage['middleware/basicAuth.js'][95]++; - req.user = req.remoteUser = user; - _$jscoverage['middleware/basicAuth.js'][96]++; - next(); - } - else { - _$jscoverage['middleware/basicAuth.js'][98]++; - unauthorized(res, realm); - } - } -}); -}); -_$jscoverage['middleware/basicAuth.js'].source = ["","/*!"," * Connect - basicAuth"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils')"," , unauthorized = utils.unauthorized;","","/**"," * Basic Auth:"," *"," * Enfore basic authentication by providing a `callback(user, pass)`,"," * which must return `true` in order to gain access. Alternatively an async"," * method is provided as well, invoking `callback(user, pass, callback)`. Populates"," * `req.user`. The final alternative is simply passing username / password"," * strings."," *"," * Simple username and password"," *"," * connect(connect.basicAuth('username', 'password'));"," *"," * Callback verification"," *"," * connect()"," * .use(connect.basicAuth(function(user, pass){"," * return 'tj' == user & 'wahoo' == pass;"," * }))"," *"," * Async callback verification, accepting `fn(err, user)`."," *"," * connect()"," * .use(connect.basicAuth(function(user, pass, fn){"," * User.authenticate({ user: user, pass: pass }, fn);"," * }))"," *"," * @param {Function|String} callback or username"," * @param {String} realm"," * @api public"," */","","module.exports = function basicAuth(callback, realm) {"," var username, password;",""," // user / pass strings"," if ('string' == typeof callback) {"," username = callback;"," password = realm;"," if ('string' != typeof password) throw new Error('password argument required');"," realm = arguments[2];"," callback = function(user, pass){"," return user == username && pass == password;"," }"," }",""," realm = realm || 'Authorization Required';",""," return function(req, res, next) {"," var authorization = req.headers.authorization;",""," if (req.user) return next();"," if (!authorization) return unauthorized(res, realm);",""," var parts = authorization.split(' ');",""," if (parts.length !== 2) return next(utils.error(400));",""," var scheme = parts[0]"," , credentials = new Buffer(parts[1], 'base64').toString()"," , index = credentials.indexOf(':');",""," if ('Basic' != scheme || index < 0) return next(utils.error(400));"," "," var user = credentials.slice(0, index)"," , pass = credentials.slice(index + 1);",""," // async"," if (callback.length >= 3) {"," var pause = utils.pause(req);"," callback(user, pass, function(err, user){"," if (err || !user) return unauthorized(res, realm);"," req.user = req.remoteUser = user;"," next();"," pause.resume();"," });"," // sync"," } else {"," if (callback(user, pass)) {"," req.user = req.remoteUser = user;"," next();"," } else {"," unauthorized(res, realm);"," }"," }"," }","};",""]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/bodyParser.js b/node_modules/express/node_modules/connect/lib-cov/middleware/bodyParser.js deleted file mode 100644 index a108b97..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/bodyParser.js +++ /dev/null @@ -1,43 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/bodyParser.js']) { - _$jscoverage['middleware/bodyParser.js'] = []; - _$jscoverage['middleware/bodyParser.js'][13] = 0; - _$jscoverage['middleware/bodyParser.js'][47] = 0; - _$jscoverage['middleware/bodyParser.js'][48] = 0; - _$jscoverage['middleware/bodyParser.js'][52] = 0; - _$jscoverage['middleware/bodyParser.js'][53] = 0; - _$jscoverage['middleware/bodyParser.js'][54] = 0; - _$jscoverage['middleware/bodyParser.js'][55] = 0; - _$jscoverage['middleware/bodyParser.js'][56] = 0; - _$jscoverage['middleware/bodyParser.js'][57] = 0; -} -_$jscoverage['middleware/bodyParser.js'][13]++; -var multipart = require("./multipart"), urlencoded = require("./urlencoded"), json = require("./json"); -_$jscoverage['middleware/bodyParser.js'][47]++; -exports = module.exports = (function bodyParser(options) { - _$jscoverage['middleware/bodyParser.js'][48]++; - var _urlencoded = urlencoded(options), _multipart = multipart(options), _json = json(options); - _$jscoverage['middleware/bodyParser.js'][52]++; - return (function bodyParser(req, res, next) { - _$jscoverage['middleware/bodyParser.js'][53]++; - _json(req, res, (function (err) { - _$jscoverage['middleware/bodyParser.js'][54]++; - if (err) { - _$jscoverage['middleware/bodyParser.js'][54]++; - return next(err); - } - _$jscoverage['middleware/bodyParser.js'][55]++; - _urlencoded(req, res, (function (err) { - _$jscoverage['middleware/bodyParser.js'][56]++; - if (err) { - _$jscoverage['middleware/bodyParser.js'][56]++; - return next(err); - } - _$jscoverage['middleware/bodyParser.js'][57]++; - _multipart(req, res, next); -})); -})); -}); -}); -_$jscoverage['middleware/bodyParser.js'].source = ["","/*!"," * Connect - bodyParser"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var multipart = require('./multipart')"," , urlencoded = require('./urlencoded')"," , json = require('./json');","","/**"," * Body parser:"," * "," * Parse request bodies, supports _application/json_,"," * _application/x-www-form-urlencoded_, and _multipart/form-data_."," *"," * This is equivalent to: "," *"," * app.use(connect.json());"," * app.use(connect.urlencoded());"," * app.use(connect.multipart());"," *"," * Examples:"," *"," * connect()"," * .use(connect.bodyParser())"," * .use(function(req, res) {"," * res.end('viewing user ' + req.body.user.name);"," * });"," *"," * $ curl -d 'user[name]=tj' http://local/"," * $ curl -d '{\"user\":{\"name\":\"tj\"}}' -H \"Content-Type: application/json\" http://local/"," *"," * View [json](json.html), [urlencoded](urlencoded.html), and [multipart](multipart.html) for more info."," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function bodyParser(options){"," var _urlencoded = urlencoded(options)"," , _multipart = multipart(options)"," , _json = json(options);",""," return function bodyParser(req, res, next) {"," _json(req, res, function(err){"," if (err) return next(err);"," _urlencoded(req, res, function(err){"," if (err) return next(err);"," _multipart(req, res, next);"," });"," });"," }","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/compress.js b/node_modules/express/node_modules/connect/lib-cov/middleware/compress.js deleted file mode 100644 index aebd5f1..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/compress.js +++ /dev/null @@ -1,159 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/compress.js']) { - _$jscoverage['middleware/compress.js'] = []; - _$jscoverage['middleware/compress.js'][12] = 0; - _$jscoverage['middleware/compress.js'][18] = 0; - _$jscoverage['middleware/compress.js'][27] = 0; - _$jscoverage['middleware/compress.js'][28] = 0; - _$jscoverage['middleware/compress.js'][61] = 0; - _$jscoverage['middleware/compress.js'][62] = 0; - _$jscoverage['middleware/compress.js'][63] = 0; - _$jscoverage['middleware/compress.js'][66] = 0; - _$jscoverage['middleware/compress.js'][67] = 0; - _$jscoverage['middleware/compress.js'][74] = 0; - _$jscoverage['middleware/compress.js'][78] = 0; - _$jscoverage['middleware/compress.js'][79] = 0; - _$jscoverage['middleware/compress.js'][80] = 0; - _$jscoverage['middleware/compress.js'][85] = 0; - _$jscoverage['middleware/compress.js'][86] = 0; - _$jscoverage['middleware/compress.js'][87] = 0; - _$jscoverage['middleware/compress.js'][92] = 0; - _$jscoverage['middleware/compress.js'][93] = 0; - _$jscoverage['middleware/compress.js'][96] = 0; - _$jscoverage['middleware/compress.js'][99] = 0; - _$jscoverage['middleware/compress.js'][102] = 0; - _$jscoverage['middleware/compress.js'][105] = 0; - _$jscoverage['middleware/compress.js'][108] = 0; - _$jscoverage['middleware/compress.js'][111] = 0; - _$jscoverage['middleware/compress.js'][112] = 0; - _$jscoverage['middleware/compress.js'][113] = 0; - _$jscoverage['middleware/compress.js'][114] = 0; - _$jscoverage['middleware/compress.js'][115] = 0; - _$jscoverage['middleware/compress.js'][121] = 0; - _$jscoverage['middleware/compress.js'][124] = 0; - _$jscoverage['middleware/compress.js'][127] = 0; - _$jscoverage['middleware/compress.js'][128] = 0; - _$jscoverage['middleware/compress.js'][132] = 0; - _$jscoverage['middleware/compress.js'][133] = 0; - _$jscoverage['middleware/compress.js'][136] = 0; - _$jscoverage['middleware/compress.js'][137] = 0; - _$jscoverage['middleware/compress.js'][140] = 0; - _$jscoverage['middleware/compress.js'][141] = 0; - _$jscoverage['middleware/compress.js'][145] = 0; -} -_$jscoverage['middleware/compress.js'][12]++; -var zlib = require("zlib"); -_$jscoverage['middleware/compress.js'][18]++; -exports.methods = {gzip: zlib.createGzip, deflate: zlib.createDeflate}; -_$jscoverage['middleware/compress.js'][27]++; -exports.filter = (function (req, res) { - _$jscoverage['middleware/compress.js'][28]++; - return /json|text|javascript/.test(res.getHeader("Content-Type")); -}); -_$jscoverage['middleware/compress.js'][61]++; -module.exports = (function compress(options) { - _$jscoverage['middleware/compress.js'][62]++; - options = options || {}; - _$jscoverage['middleware/compress.js'][63]++; - var names = Object.keys(exports.methods), filter = options.filter || exports.filter; - _$jscoverage['middleware/compress.js'][66]++; - return (function (req, res, next) { - _$jscoverage['middleware/compress.js'][67]++; - var accept = req.headers["accept-encoding"], write = res.write, end = res.end, stream, method; - _$jscoverage['middleware/compress.js'][74]++; - res.setHeader("Vary", "Accept-Encoding"); - _$jscoverage['middleware/compress.js'][78]++; - res.write = (function (chunk, encoding) { - _$jscoverage['middleware/compress.js'][79]++; - if (! this.headerSent) { - _$jscoverage['middleware/compress.js'][79]++; - this._implicitHeader(); - } - _$jscoverage['middleware/compress.js'][80]++; - return stream? stream.write(new Buffer(chunk, encoding)): write.call(res, chunk, encoding); -}); - _$jscoverage['middleware/compress.js'][85]++; - res.end = (function (chunk, encoding) { - _$jscoverage['middleware/compress.js'][86]++; - if (chunk) { - _$jscoverage['middleware/compress.js'][86]++; - this.write(chunk, encoding); - } - _$jscoverage['middleware/compress.js'][87]++; - return stream? stream.end(): end.call(res); -}); - _$jscoverage['middleware/compress.js'][92]++; - res.on("header", (function () { - _$jscoverage['middleware/compress.js'][93]++; - var encoding = res.getHeader("Content-Encoding") || "identity"; - _$jscoverage['middleware/compress.js'][96]++; - if ("identity" != encoding) { - _$jscoverage['middleware/compress.js'][96]++; - return; - } - _$jscoverage['middleware/compress.js'][99]++; - if (! filter(req, res)) { - _$jscoverage['middleware/compress.js'][99]++; - return; - } - _$jscoverage['middleware/compress.js'][102]++; - if (! accept) { - _$jscoverage['middleware/compress.js'][102]++; - return; - } - _$jscoverage['middleware/compress.js'][105]++; - if ("HEAD" == req.method) { - _$jscoverage['middleware/compress.js'][105]++; - return; - } - _$jscoverage['middleware/compress.js'][108]++; - if ("*" == accept.trim()) { - _$jscoverage['middleware/compress.js'][108]++; - method = "gzip"; - } - _$jscoverage['middleware/compress.js'][111]++; - if (! method) { - _$jscoverage['middleware/compress.js'][112]++; - for (var i = 0, len = names.length; i < len; ++i) { - _$jscoverage['middleware/compress.js'][113]++; - if (~ accept.indexOf(names[i])) { - _$jscoverage['middleware/compress.js'][114]++; - method = names[i]; - _$jscoverage['middleware/compress.js'][115]++; - break; - } -} - } - _$jscoverage['middleware/compress.js'][121]++; - if (! method) { - _$jscoverage['middleware/compress.js'][121]++; - return; - } - _$jscoverage['middleware/compress.js'][124]++; - stream = exports.methods[method](options); - _$jscoverage['middleware/compress.js'][127]++; - res.setHeader("Content-Encoding", method); - _$jscoverage['middleware/compress.js'][128]++; - res.removeHeader("Content-Length"); - _$jscoverage['middleware/compress.js'][132]++; - stream.on("data", (function (chunk) { - _$jscoverage['middleware/compress.js'][133]++; - write.call(res, chunk); -})); - _$jscoverage['middleware/compress.js'][136]++; - stream.on("end", (function () { - _$jscoverage['middleware/compress.js'][137]++; - end.call(res); -})); - _$jscoverage['middleware/compress.js'][140]++; - stream.on("drain", (function () { - _$jscoverage['middleware/compress.js'][141]++; - res.emit("drain"); -})); -})); - _$jscoverage['middleware/compress.js'][145]++; - next(); -}); -}); -_$jscoverage['middleware/compress.js'].source = ["/*!"," * Connect - compress"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var zlib = require('zlib');","","/**"," * Supported content-encoding methods."," */","","exports.methods = {"," gzip: zlib.createGzip"," , deflate: zlib.createDeflate","};","","/**"," * Default filter function."," */","","exports.filter = function(req, res){"," return /json|text|javascript/.test(res.getHeader('Content-Type'));","};","","/**"," * Compress:"," *"," * Compress response data with gzip/deflate."," *"," * Filter:"," *"," * A `filter` callback function may be passed to"," * replace the default logic of:"," *"," * exports.filter = function(req, res){"," * return /json|text|javascript/.test(res.getHeader('Content-Type'));"," * };"," *"," * Options:"," *"," * All remaining options are passed to the gzip/deflate"," * creation functions. Consult node's docs for additional details."," *"," * - `chunkSize` (default: 16*1024)"," * - `windowBits`"," * - `level`: 0-9 where 0 is no compression, and 9 is slow but best compression"," * - `memLevel`: 1-9 low is slower but uses less memory, high is fast but uses more"," * - `strategy`: compression strategy"," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","module.exports = function compress(options) {"," options = options || {};"," var names = Object.keys(exports.methods)"," , filter = options.filter || exports.filter;",""," return function(req, res, next){"," var accept = req.headers['accept-encoding']"," , write = res.write"," , end = res.end"," , stream"," , method;",""," // vary"," res.setHeader('Vary', 'Accept-Encoding');",""," // proxy",""," res.write = function(chunk, encoding){"," if (!this.headerSent) this._implicitHeader();"," return stream"," ? stream.write(new Buffer(chunk, encoding))"," : write.call(res, chunk, encoding);"," };",""," res.end = function(chunk, encoding){"," if (chunk) this.write(chunk, encoding);"," return stream"," ? stream.end()"," : end.call(res);"," };",""," res.on('header', function(){"," var encoding = res.getHeader('Content-Encoding') || 'identity';",""," // already encoded"," if ('identity' != encoding) return; ",""," // default request filter"," if (!filter(req, res)) return;",""," // SHOULD use identity"," if (!accept) return;",""," // head"," if ('HEAD' == req.method) return;",""," // default to gzip"," if ('*' == accept.trim()) method = 'gzip';",""," // compression method"," if (!method) {"," for (var i = 0, len = names.length; i < len; ++i) {"," if (~accept.indexOf(names[i])) {"," method = names[i];"," break;"," }"," }"," }",""," // compression method"," if (!method) return;",""," // compression stream"," stream = exports.methods[method](options);",""," // header fields"," res.setHeader('Content-Encoding', method);"," res.removeHeader('Content-Length');",""," // compression",""," stream.on('data', function(chunk){"," write.call(res, chunk);"," });",""," stream.on('end', function(){"," end.call(res);"," });",""," stream.on('drain', function() {"," res.emit('drain');"," });"," });",""," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/cookieParser.js b/node_modules/express/node_modules/connect/lib-cov/middleware/cookieParser.js deleted file mode 100644 index 7f462d1..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/cookieParser.js +++ /dev/null @@ -1,70 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/cookieParser.js']) { - _$jscoverage['middleware/cookieParser.js'] = []; - _$jscoverage['middleware/cookieParser.js'][13] = 0; - _$jscoverage['middleware/cookieParser.js'][38] = 0; - _$jscoverage['middleware/cookieParser.js'][39] = 0; - _$jscoverage['middleware/cookieParser.js'][40] = 0; - _$jscoverage['middleware/cookieParser.js'][41] = 0; - _$jscoverage['middleware/cookieParser.js'][43] = 0; - _$jscoverage['middleware/cookieParser.js'][44] = 0; - _$jscoverage['middleware/cookieParser.js'][45] = 0; - _$jscoverage['middleware/cookieParser.js'][47] = 0; - _$jscoverage['middleware/cookieParser.js'][48] = 0; - _$jscoverage['middleware/cookieParser.js'][49] = 0; - _$jscoverage['middleware/cookieParser.js'][50] = 0; - _$jscoverage['middleware/cookieParser.js'][51] = 0; - _$jscoverage['middleware/cookieParser.js'][52] = 0; - _$jscoverage['middleware/cookieParser.js'][54] = 0; - _$jscoverage['middleware/cookieParser.js'][56] = 0; - _$jscoverage['middleware/cookieParser.js'][57] = 0; - _$jscoverage['middleware/cookieParser.js'][60] = 0; -} -_$jscoverage['middleware/cookieParser.js'][13]++; -var utils = require("./../utils"), cookie = require("cookie"); -_$jscoverage['middleware/cookieParser.js'][38]++; -module.exports = (function cookieParser(secret) { - _$jscoverage['middleware/cookieParser.js'][39]++; - return (function cookieParser(req, res, next) { - _$jscoverage['middleware/cookieParser.js'][40]++; - if (req.cookies) { - _$jscoverage['middleware/cookieParser.js'][40]++; - return next(); - } - _$jscoverage['middleware/cookieParser.js'][41]++; - var cookies = req.headers.cookie; - _$jscoverage['middleware/cookieParser.js'][43]++; - req.secret = secret; - _$jscoverage['middleware/cookieParser.js'][44]++; - req.cookies = {}; - _$jscoverage['middleware/cookieParser.js'][45]++; - req.signedCookies = {}; - _$jscoverage['middleware/cookieParser.js'][47]++; - if (cookies) { - _$jscoverage['middleware/cookieParser.js'][48]++; - try { - _$jscoverage['middleware/cookieParser.js'][49]++; - req.cookies = cookie.parse(cookies); - _$jscoverage['middleware/cookieParser.js'][50]++; - if (secret) { - _$jscoverage['middleware/cookieParser.js'][51]++; - req.signedCookies = utils.parseSignedCookies(req.cookies, secret); - _$jscoverage['middleware/cookieParser.js'][52]++; - req.signedCookies = utils.parseJSONCookies(req.signedCookies); - } - _$jscoverage['middleware/cookieParser.js'][54]++; - req.cookies = utils.parseJSONCookies(req.cookies); - } - catch (err) { - _$jscoverage['middleware/cookieParser.js'][56]++; - err.status = 400; - _$jscoverage['middleware/cookieParser.js'][57]++; - return next(err); - } - } - _$jscoverage['middleware/cookieParser.js'][60]++; - next(); -}); -}); -_$jscoverage['middleware/cookieParser.js'].source = ["","/*!"," * Connect - cookieParser"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('./../utils')"," , cookie = require('cookie');","","/**"," * Cookie parser:"," *"," * Parse _Cookie_ header and populate `req.cookies`"," * with an object keyed by the cookie names. Optionally"," * you may enabled signed cookie support by passing"," * a `secret` string, which assigns `req.secret` so"," * it may be used by other middleware."," *"," * Examples:"," *"," * connect()"," * .use(connect.cookieParser('optional secret string'))"," * .use(function(req, res, next){"," * res.end(JSON.stringify(req.cookies));"," * })"," *"," * @param {String} secret"," * @return {Function}"," * @api public"," */","","module.exports = function cookieParser(secret){"," return function cookieParser(req, res, next) {"," if (req.cookies) return next();"," var cookies = req.headers.cookie;",""," req.secret = secret;"," req.cookies = {};"," req.signedCookies = {};",""," if (cookies) {"," try {"," req.cookies = cookie.parse(cookies);"," if (secret) {"," req.signedCookies = utils.parseSignedCookies(req.cookies, secret);"," req.signedCookies = utils.parseJSONCookies(req.signedCookies);"," }"," req.cookies = utils.parseJSONCookies(req.cookies);"," } catch (err) {"," err.status = 400;"," return next(err);"," }"," }"," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/cookieSession.js b/node_modules/express/node_modules/connect/lib-cov/middleware/cookieSession.js deleted file mode 100644 index e54fa47..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/cookieSession.js +++ /dev/null @@ -1,132 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/cookieSession.js']) { - _$jscoverage['middleware/cookieSession.js'] = []; - _$jscoverage['middleware/cookieSession.js'][12] = 0; - _$jscoverage['middleware/cookieSession.js'][46] = 0; - _$jscoverage['middleware/cookieSession.js'][48] = 0; - _$jscoverage['middleware/cookieSession.js'][49] = 0; - _$jscoverage['middleware/cookieSession.js'][52] = 0; - _$jscoverage['middleware/cookieSession.js'][55] = 0; - _$jscoverage['middleware/cookieSession.js'][56] = 0; - _$jscoverage['middleware/cookieSession.js'][59] = 0; - _$jscoverage['middleware/cookieSession.js'][60] = 0; - _$jscoverage['middleware/cookieSession.js'][63] = 0; - _$jscoverage['middleware/cookieSession.js'][66] = 0; - _$jscoverage['middleware/cookieSession.js'][67] = 0; - _$jscoverage['middleware/cookieSession.js'][70] = 0; - _$jscoverage['middleware/cookieSession.js'][71] = 0; - _$jscoverage['middleware/cookieSession.js'][72] = 0; - _$jscoverage['middleware/cookieSession.js'][73] = 0; - _$jscoverage['middleware/cookieSession.js'][74] = 0; - _$jscoverage['middleware/cookieSession.js'][75] = 0; - _$jscoverage['middleware/cookieSession.js'][80] = 0; - _$jscoverage['middleware/cookieSession.js'][82] = 0; - _$jscoverage['middleware/cookieSession.js'][83] = 0; - _$jscoverage['middleware/cookieSession.js'][84] = 0; - _$jscoverage['middleware/cookieSession.js'][85] = 0; - _$jscoverage['middleware/cookieSession.js'][86] = 0; - _$jscoverage['middleware/cookieSession.js'][89] = 0; - _$jscoverage['middleware/cookieSession.js'][92] = 0; - _$jscoverage['middleware/cookieSession.js'][97] = 0; - _$jscoverage['middleware/cookieSession.js'][100] = 0; - _$jscoverage['middleware/cookieSession.js'][101] = 0; - _$jscoverage['middleware/cookieSession.js'][104] = 0; - _$jscoverage['middleware/cookieSession.js'][107] = 0; - _$jscoverage['middleware/cookieSession.js'][108] = 0; - _$jscoverage['middleware/cookieSession.js'][109] = 0; - _$jscoverage['middleware/cookieSession.js'][110] = 0; - _$jscoverage['middleware/cookieSession.js'][113] = 0; -} -_$jscoverage['middleware/cookieSession.js'][12]++; -var utils = require("./../utils"), Cookie = require("./session/cookie"), debug = require("debug")("connect:cookieSession"), signature = require("cookie-signature"), crc16 = require("crc").crc16; -_$jscoverage['middleware/cookieSession.js'][46]++; -module.exports = (function cookieSession(options) { - _$jscoverage['middleware/cookieSession.js'][48]++; - options = options || {}; - _$jscoverage['middleware/cookieSession.js'][49]++; - var key = options.key || "connect.sess", trustProxy = options.proxy; - _$jscoverage['middleware/cookieSession.js'][52]++; - return (function cookieSession(req, res, next) { - _$jscoverage['middleware/cookieSession.js'][55]++; - var secret = options.secret || req.secret; - _$jscoverage['middleware/cookieSession.js'][56]++; - if (! secret) { - _$jscoverage['middleware/cookieSession.js'][56]++; - throw new Error("`secret` option required for cookie sessions"); - } - _$jscoverage['middleware/cookieSession.js'][59]++; - req.session = {}; - _$jscoverage['middleware/cookieSession.js'][60]++; - var cookie = req.session.cookie = new Cookie(options.cookie); - _$jscoverage['middleware/cookieSession.js'][63]++; - if (0 != req.originalUrl.indexOf(cookie.path)) { - _$jscoverage['middleware/cookieSession.js'][63]++; - return next(); - } - _$jscoverage['middleware/cookieSession.js'][66]++; - if (! options.secret && req.secret) { - _$jscoverage['middleware/cookieSession.js'][67]++; - req.session = req.signedCookies[key] || {}; - } - else { - _$jscoverage['middleware/cookieSession.js'][70]++; - var rawCookie = req.cookies[key]; - _$jscoverage['middleware/cookieSession.js'][71]++; - if (rawCookie) { - _$jscoverage['middleware/cookieSession.js'][72]++; - var unsigned = utils.parseSignedCookie(rawCookie, secret); - _$jscoverage['middleware/cookieSession.js'][73]++; - if (unsigned) { - _$jscoverage['middleware/cookieSession.js'][74]++; - var originalHash = crc16(unsigned); - _$jscoverage['middleware/cookieSession.js'][75]++; - req.session = utils.parseJSONCookie(unsigned) || {}; - } - } - } - _$jscoverage['middleware/cookieSession.js'][80]++; - res.on("header", (function () { - _$jscoverage['middleware/cookieSession.js'][82]++; - if (! req.session) { - _$jscoverage['middleware/cookieSession.js'][83]++; - debug("clear session"); - _$jscoverage['middleware/cookieSession.js'][84]++; - cookie.expires = new Date(0); - _$jscoverage['middleware/cookieSession.js'][85]++; - res.setHeader("Set-Cookie", cookie.serialize(key, "")); - _$jscoverage['middleware/cookieSession.js'][86]++; - return; - } - _$jscoverage['middleware/cookieSession.js'][89]++; - delete req.session.cookie; - _$jscoverage['middleware/cookieSession.js'][92]++; - var proto = (req.headers["x-forwarded-proto"] || "").toLowerCase(), tls = req.connection.encrypted || (trustProxy && "https" == proto), secured = cookie.secure && tls; - _$jscoverage['middleware/cookieSession.js'][97]++; - if (cookie.secure && ! secured) { - _$jscoverage['middleware/cookieSession.js'][97]++; - return debug("not secured"); - } - _$jscoverage['middleware/cookieSession.js'][100]++; - debug("serializing %j", req.session); - _$jscoverage['middleware/cookieSession.js'][101]++; - var val = "j:" + JSON.stringify(req.session); - _$jscoverage['middleware/cookieSession.js'][104]++; - if (originalHash == crc16(val)) { - _$jscoverage['middleware/cookieSession.js'][104]++; - return debug("unmodified session"); - } - _$jscoverage['middleware/cookieSession.js'][107]++; - val = "s:" + signature.sign(val, secret); - _$jscoverage['middleware/cookieSession.js'][108]++; - val = cookie.serialize(key, val); - _$jscoverage['middleware/cookieSession.js'][109]++; - debug("set-cookie %j", cookie); - _$jscoverage['middleware/cookieSession.js'][110]++; - res.setHeader("Set-Cookie", val); -})); - _$jscoverage['middleware/cookieSession.js'][113]++; - next(); -}); -}); -_$jscoverage['middleware/cookieSession.js'].source = ["","/*!"," * Connect - cookieSession"," * Copyright(c) 2011 Sencha Inc."," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('./../utils')"," , Cookie = require('./session/cookie')"," , debug = require('debug')('connect:cookieSession')"," , signature = require('cookie-signature')"," , crc16 = require('crc').crc16;","","/**"," * Cookie Session:"," *"," * Cookie session middleware."," *"," * var app = connect();"," * app.use(connect.cookieParser());"," * app.use(connect.cookieSession({ secret: 'tobo!', cookie: { maxAge: 60 * 60 * 1000 }}));"," *"," * Options:"," *"," * - `key` cookie name defaulting to `connect.sess`"," * - `secret` prevents cookie tampering"," * - `cookie` session cookie settings, defaulting to `{ path: '/', httpOnly: true, maxAge: null }`"," * - `proxy` trust the reverse proxy when setting secure cookies (via \"x-forwarded-proto\")"," *"," * Clearing sessions:"," *"," * To clear the session simply set its value to `null`,"," * `cookieSession()` will then respond with a 1970 Set-Cookie."," *"," * req.session = null;"," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","module.exports = function cookieSession(options){"," // TODO: utilize Session/Cookie to unify API"," options = options || {};"," var key = options.key || 'connect.sess'"," , trustProxy = options.proxy;",""," return function cookieSession(req, res, next) {",""," // req.secret is for backwards compatibility"," var secret = options.secret || req.secret;"," if (!secret) throw new Error('`secret` option required for cookie sessions');",""," // default session"," req.session = {};"," var cookie = req.session.cookie = new Cookie(options.cookie);",""," // pathname mismatch"," if (0 != req.originalUrl.indexOf(cookie.path)) return next();",""," // cookieParser secret"," if (!options.secret && req.secret) {"," req.session = req.signedCookies[key] || {};"," } else {"," // TODO: refactor"," var rawCookie = req.cookies[key];"," if (rawCookie) {"," var unsigned = utils.parseSignedCookie(rawCookie, secret);"," if (unsigned) {"," var originalHash = crc16(unsigned);"," req.session = utils.parseJSONCookie(unsigned) || {};"," }"," }"," }",""," res.on('header', function(){"," // removed"," if (!req.session) {"," debug('clear session');"," cookie.expires = new Date(0);"," res.setHeader('Set-Cookie', cookie.serialize(key, ''));"," return;"," }",""," delete req.session.cookie;",""," // check security"," var proto = (req.headers['x-forwarded-proto'] || '').toLowerCase()"," , tls = req.connection.encrypted || (trustProxy && 'https' == proto)"," , secured = cookie.secure && tls;",""," // only send secure cookies via https"," if (cookie.secure && !secured) return debug('not secured');",""," // serialize"," debug('serializing %j', req.session);"," var val = 'j:' + JSON.stringify(req.session);",""," // compare hashes, no need to set-cookie if unchanged"," if (originalHash == crc16(val)) return debug('unmodified session');",""," // set-cookie"," val = 's:' + signature.sign(val, secret);"," val = cookie.serialize(key, val);"," debug('set-cookie %j', cookie);"," res.setHeader('Set-Cookie', val);"," });",""," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/csrf.js b/node_modules/express/node_modules/connect/lib-cov/middleware/csrf.js deleted file mode 100644 index f3919ed..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/csrf.js +++ /dev/null @@ -1,51 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/csrf.js']) { - _$jscoverage['middleware/csrf.js'] = []; - _$jscoverage['middleware/csrf.js'][11] = 0; - _$jscoverage['middleware/csrf.js'][39] = 0; - _$jscoverage['middleware/csrf.js'][40] = 0; - _$jscoverage['middleware/csrf.js'][41] = 0; - _$jscoverage['middleware/csrf.js'][43] = 0; - _$jscoverage['middleware/csrf.js'][45] = 0; - _$jscoverage['middleware/csrf.js'][48] = 0; - _$jscoverage['middleware/csrf.js'][51] = 0; - _$jscoverage['middleware/csrf.js'][54] = 0; - _$jscoverage['middleware/csrf.js'][56] = 0; - _$jscoverage['middleware/csrf.js'][69] = 0; - _$jscoverage['middleware/csrf.js'][70] = 0; -} -_$jscoverage['middleware/csrf.js'][11]++; -var utils = require("../utils"); -_$jscoverage['middleware/csrf.js'][39]++; -module.exports = (function csrf(options) { - _$jscoverage['middleware/csrf.js'][40]++; - options = options || {}; - _$jscoverage['middleware/csrf.js'][41]++; - var value = options.value || defaultValue; - _$jscoverage['middleware/csrf.js'][43]++; - return (function (req, res, next) { - _$jscoverage['middleware/csrf.js'][45]++; - var token = req.session._csrf || (req.session._csrf = utils.uid(24)); - _$jscoverage['middleware/csrf.js'][48]++; - if ("GET" == req.method || "HEAD" == req.method || "OPTIONS" == req.method) { - _$jscoverage['middleware/csrf.js'][48]++; - return next(); - } - _$jscoverage['middleware/csrf.js'][51]++; - var val = value(req); - _$jscoverage['middleware/csrf.js'][54]++; - if (val != token) { - _$jscoverage['middleware/csrf.js'][54]++; - return next(utils.error(403)); - } - _$jscoverage['middleware/csrf.js'][56]++; - next(); -}); -}); -_$jscoverage['middleware/csrf.js'][69]++; -function defaultValue(req) { - _$jscoverage['middleware/csrf.js'][70]++; - return (req.body && req.body._csrf) || (req.query && req.query._csrf) || req.headers["x-csrf-token"]; -} -_$jscoverage['middleware/csrf.js'].source = ["/*!"," * Connect - csrf"," * Copyright(c) 2011 Sencha Inc."," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils');","","/**"," * Anti CSRF:"," *"," * CRSF protection middleware."," *"," * By default this middleware generates a token named \"_csrf\""," * which should be added to requests which mutate"," * state, within a hidden form field, query-string etc. This"," * token is validated against the visitor's `req.session._csrf`"," * property."," *"," * The default `value` function checks `req.body` generated"," * by the `bodyParser()` middleware, `req.query` generated"," * by `query()`, and the \"X-CSRF-Token\" header field."," *"," * This middleware requires session support, thus should be added"," * somewhere _below_ `session()` and `cookieParser()`."," *"," * Options:"," *"," * - `value` a function accepting the request, returning the token "," *"," * @param {Object} options"," * @api public"," */","","module.exports = function csrf(options) {"," options = options || {};"," var value = options.value || defaultValue;",""," return function(req, res, next){"," // generate CSRF token"," var token = req.session._csrf || (req.session._csrf = utils.uid(24));",""," // ignore these methods"," if ('GET' == req.method || 'HEAD' == req.method || 'OPTIONS' == req.method) return next();",""," // determine value"," var val = value(req);",""," // check"," if (val != token) return next(utils.error(403));"," "," next();"," }","};","","/**"," * Default value function, checking the `req.body`"," * and `req.query` for the CSRF token."," *"," * @param {IncomingMessage} req"," * @return {String}"," * @api private"," */","","function defaultValue(req) {"," return (req.body && req.body._csrf)"," || (req.query && req.query._csrf)"," || (req.headers['x-csrf-token']);","}"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/directory.js b/node_modules/express/node_modules/connect/lib-cov/middleware/directory.js deleted file mode 100644 index bc86b60..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/directory.js +++ /dev/null @@ -1,256 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/directory.js']) { - _$jscoverage['middleware/directory.js'] = []; - _$jscoverage['middleware/directory.js'][17] = 0; - _$jscoverage['middleware/directory.js'][29] = 0; - _$jscoverage['middleware/directory.js'][48] = 0; - _$jscoverage['middleware/directory.js'][49] = 0; - _$jscoverage['middleware/directory.js'][52] = 0; - _$jscoverage['middleware/directory.js'][53] = 0; - _$jscoverage['middleware/directory.js'][58] = 0; - _$jscoverage['middleware/directory.js'][59] = 0; - _$jscoverage['middleware/directory.js'][61] = 0; - _$jscoverage['middleware/directory.js'][70] = 0; - _$jscoverage['middleware/directory.js'][73] = 0; - _$jscoverage['middleware/directory.js'][76] = 0; - _$jscoverage['middleware/directory.js'][77] = 0; - _$jscoverage['middleware/directory.js'][81] = 0; - _$jscoverage['middleware/directory.js'][84] = 0; - _$jscoverage['middleware/directory.js'][85] = 0; - _$jscoverage['middleware/directory.js'][86] = 0; - _$jscoverage['middleware/directory.js'][87] = 0; - _$jscoverage['middleware/directory.js'][88] = 0; - _$jscoverage['middleware/directory.js'][91] = 0; - _$jscoverage['middleware/directory.js'][92] = 0; - _$jscoverage['middleware/directory.js'][93] = 0; - _$jscoverage['middleware/directory.js'][94] = 0; - _$jscoverage['middleware/directory.js'][99] = 0; - _$jscoverage['middleware/directory.js'][109] = 0; - _$jscoverage['middleware/directory.js'][110] = 0; - _$jscoverage['middleware/directory.js'][111] = 0; - _$jscoverage['middleware/directory.js'][112] = 0; - _$jscoverage['middleware/directory.js'][113] = 0; - _$jscoverage['middleware/directory.js'][114] = 0; - _$jscoverage['middleware/directory.js'][115] = 0; - _$jscoverage['middleware/directory.js'][120] = 0; - _$jscoverage['middleware/directory.js'][121] = 0; - _$jscoverage['middleware/directory.js'][122] = 0; - _$jscoverage['middleware/directory.js'][131] = 0; - _$jscoverage['middleware/directory.js'][132] = 0; - _$jscoverage['middleware/directory.js'][133] = 0; - _$jscoverage['middleware/directory.js'][134] = 0; - _$jscoverage['middleware/directory.js'][135] = 0; - _$jscoverage['middleware/directory.js'][142] = 0; - _$jscoverage['middleware/directory.js'][143] = 0; - _$jscoverage['middleware/directory.js'][144] = 0; - _$jscoverage['middleware/directory.js'][145] = 0; - _$jscoverage['middleware/directory.js'][146] = 0; - _$jscoverage['middleware/directory.js'][153] = 0; - _$jscoverage['middleware/directory.js'][154] = 0; - _$jscoverage['middleware/directory.js'][155] = 0; - _$jscoverage['middleware/directory.js'][156] = 0; - _$jscoverage['middleware/directory.js'][157] = 0; - _$jscoverage['middleware/directory.js'][165] = 0; - _$jscoverage['middleware/directory.js'][166] = 0; - _$jscoverage['middleware/directory.js'][167] = 0; - _$jscoverage['middleware/directory.js'][170] = 0; - _$jscoverage['middleware/directory.js'][171] = 0; - _$jscoverage['middleware/directory.js'][172] = 0; - _$jscoverage['middleware/directory.js'][173] = 0; - _$jscoverage['middleware/directory.js'][176] = 0; - _$jscoverage['middleware/directory.js'][194] = 0; - _$jscoverage['middleware/directory.js'][195] = 0; - _$jscoverage['middleware/directory.js'][196] = 0; - _$jscoverage['middleware/directory.js'][208] = 0; - _$jscoverage['middleware/directory.js'][209] = 0; - _$jscoverage['middleware/directory.js'][210] = 0; - _$jscoverage['middleware/directory.js'][218] = 0; -} -_$jscoverage['middleware/directory.js'][17]++; -var fs = require("fs"), parse = require("url").parse, utils = require("../utils"), path = require("path"), normalize = path.normalize, extname = path.extname, join = path.join; -_$jscoverage['middleware/directory.js'][29]++; -var cache = {}; -_$jscoverage['middleware/directory.js'][48]++; -exports = module.exports = (function directory(root, options) { - _$jscoverage['middleware/directory.js'][49]++; - options = options || {}; - _$jscoverage['middleware/directory.js'][52]++; - if (! root) { - _$jscoverage['middleware/directory.js'][52]++; - throw new Error("directory() root path required"); - } - _$jscoverage['middleware/directory.js'][53]++; - var hidden = options.hidden, icons = options.icons, filter = options.filter, root = normalize(root); - _$jscoverage['middleware/directory.js'][58]++; - return (function directory(req, res, next) { - _$jscoverage['middleware/directory.js'][59]++; - if ("GET" != req.method && "HEAD" != req.method) { - _$jscoverage['middleware/directory.js'][59]++; - return next(); - } - _$jscoverage['middleware/directory.js'][61]++; - var accept = req.headers.accept || "text/plain", url = parse(req.url), dir = decodeURIComponent(url.pathname), path = normalize(join(root, dir)), originalUrl = parse(req.originalUrl), originalDir = decodeURIComponent(originalUrl.pathname), showUp = path != root && path != root + "/"; - _$jscoverage['middleware/directory.js'][70]++; - if (~ path.indexOf("\u0000")) { - _$jscoverage['middleware/directory.js'][70]++; - return next(utils.error(400)); - } - _$jscoverage['middleware/directory.js'][73]++; - if (0 != path.indexOf(root)) { - _$jscoverage['middleware/directory.js'][73]++; - return next(utils.error(403)); - } - _$jscoverage['middleware/directory.js'][76]++; - fs.stat(path, (function (err, stat) { - _$jscoverage['middleware/directory.js'][77]++; - if (err) { - _$jscoverage['middleware/directory.js'][77]++; - return "ENOENT" == err.code? next(): next(err); - } - _$jscoverage['middleware/directory.js'][81]++; - if (! stat.isDirectory()) { - _$jscoverage['middleware/directory.js'][81]++; - return next(); - } - _$jscoverage['middleware/directory.js'][84]++; - fs.readdir(path, (function (err, files) { - _$jscoverage['middleware/directory.js'][85]++; - if (err) { - _$jscoverage['middleware/directory.js'][85]++; - return next(err); - } - _$jscoverage['middleware/directory.js'][86]++; - if (! hidden) { - _$jscoverage['middleware/directory.js'][86]++; - files = removeHidden(files); - } - _$jscoverage['middleware/directory.js'][87]++; - if (filter) { - _$jscoverage['middleware/directory.js'][87]++; - files = files.filter(filter); - } - _$jscoverage['middleware/directory.js'][88]++; - files.sort(); - _$jscoverage['middleware/directory.js'][91]++; - for (var key in exports) { - _$jscoverage['middleware/directory.js'][92]++; - if (~ accept.indexOf(key) || ~ accept.indexOf("*/*")) { - _$jscoverage['middleware/directory.js'][93]++; - exports[key](req, res, files, next, originalDir, showUp, icons); - _$jscoverage['middleware/directory.js'][94]++; - return; - } -} - _$jscoverage['middleware/directory.js'][99]++; - next(utils.error(406)); -})); -})); -}); -}); -_$jscoverage['middleware/directory.js'][109]++; -exports.html = (function (req, res, files, next, dir, showUp, icons) { - _$jscoverage['middleware/directory.js'][110]++; - fs.readFile(__dirname + "/../public/directory.html", "utf8", (function (err, str) { - _$jscoverage['middleware/directory.js'][111]++; - if (err) { - _$jscoverage['middleware/directory.js'][111]++; - return next(err); - } - _$jscoverage['middleware/directory.js'][112]++; - fs.readFile(__dirname + "/../public/style.css", "utf8", (function (err, style) { - _$jscoverage['middleware/directory.js'][113]++; - if (err) { - _$jscoverage['middleware/directory.js'][113]++; - return next(err); - } - _$jscoverage['middleware/directory.js'][114]++; - if (showUp) { - _$jscoverage['middleware/directory.js'][114]++; - files.unshift(".."); - } - _$jscoverage['middleware/directory.js'][115]++; - str = str.replace("{style}", style).replace("{files}", html(files, dir, icons)).replace("{directory}", dir).replace("{linked-path}", htmlPath(dir)); - _$jscoverage['middleware/directory.js'][120]++; - res.setHeader("Content-Type", "text/html"); - _$jscoverage['middleware/directory.js'][121]++; - res.setHeader("Content-Length", str.length); - _$jscoverage['middleware/directory.js'][122]++; - res.end(str); -})); -})); -}); -_$jscoverage['middleware/directory.js'][131]++; -exports.json = (function (req, res, files) { - _$jscoverage['middleware/directory.js'][132]++; - files = JSON.stringify(files); - _$jscoverage['middleware/directory.js'][133]++; - res.setHeader("Content-Type", "application/json"); - _$jscoverage['middleware/directory.js'][134]++; - res.setHeader("Content-Length", files.length); - _$jscoverage['middleware/directory.js'][135]++; - res.end(files); -}); -_$jscoverage['middleware/directory.js'][142]++; -exports.plain = (function (req, res, files) { - _$jscoverage['middleware/directory.js'][143]++; - files = files.join("\n") + "\n"; - _$jscoverage['middleware/directory.js'][144]++; - res.setHeader("Content-Type", "text/plain"); - _$jscoverage['middleware/directory.js'][145]++; - res.setHeader("Content-Length", files.length); - _$jscoverage['middleware/directory.js'][146]++; - res.end(files); -}); -_$jscoverage['middleware/directory.js'][153]++; -function htmlPath(dir) { - _$jscoverage['middleware/directory.js'][154]++; - var curr = []; - _$jscoverage['middleware/directory.js'][155]++; - return dir.split("/").map((function (part) { - _$jscoverage['middleware/directory.js'][156]++; - curr.push(part); - _$jscoverage['middleware/directory.js'][157]++; - return "" + part + ""; -})).join(" / "); -} -_$jscoverage['middleware/directory.js'][165]++; -function html(files, dir, useIcons) { - _$jscoverage['middleware/directory.js'][166]++; - return "
    " + files.map((function (file) { - _$jscoverage['middleware/directory.js'][167]++; - var icon = "", classes = []; - _$jscoverage['middleware/directory.js'][170]++; - if (useIcons && ".." != file) { - _$jscoverage['middleware/directory.js'][171]++; - icon = icons[extname(file)] || icons["default"]; - _$jscoverage['middleware/directory.js'][172]++; - icon = ""; - _$jscoverage['middleware/directory.js'][173]++; - classes.push("icon"); - } - _$jscoverage['middleware/directory.js'][176]++; - return "
  • " + icon + file + "
  • "; -})).join("\n") + "
"; -} -_$jscoverage['middleware/directory.js'][194]++; -function load(icon) { - _$jscoverage['middleware/directory.js'][195]++; - if (cache[icon]) { - _$jscoverage['middleware/directory.js'][195]++; - return cache[icon]; - } - _$jscoverage['middleware/directory.js'][196]++; - return cache[icon] = fs.readFileSync(__dirname + "/../public/icons/" + icon, "base64"); -} -_$jscoverage['middleware/directory.js'][208]++; -function removeHidden(files) { - _$jscoverage['middleware/directory.js'][209]++; - return files.filter((function (file) { - _$jscoverage['middleware/directory.js'][210]++; - return "." != file[0]; -})); -} -_$jscoverage['middleware/directory.js'][218]++; -var icons = {".js": "page_white_code_red.png", ".c": "page_white_c.png", ".h": "page_white_h.png", ".cc": "page_white_cplusplus.png", ".php": "page_white_php.png", ".rb": "page_white_ruby.png", ".cpp": "page_white_cplusplus.png", ".swf": "page_white_flash.png", ".pdf": "page_white_acrobat.png", "default": "page_white.png"}; -_$jscoverage['middleware/directory.js'].source = ["","/*!"," * Connect - directory"," * Copyright(c) 2011 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","// TODO: icon / style for directories","// TODO: arrow key navigation","// TODO: make icons extensible","","/**"," * Module dependencies."," */","","var fs = require('fs')"," , parse = require('url').parse"," , utils = require('../utils')"," , path = require('path')"," , normalize = path.normalize"," , extname = path.extname"," , join = path.join;","","/*!"," * Icon cache."," */","","var cache = {};","","/**"," * Directory:"," *"," * Serve directory listings with the given `root` path."," *"," * Options:"," *"," * - `hidden` display hidden (dot) files. Defaults to false."," * - `icons` display icons. Defaults to false."," * - `filter` Apply this filter function to files. Defaults to false."," *"," * @param {String} root"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function directory(root, options){"," options = options || {};",""," // root required"," if (!root) throw new Error('directory() root path required');"," var hidden = options.hidden"," , icons = options.icons"," , filter = options.filter"," , root = normalize(root);",""," return function directory(req, res, next) {"," if ('GET' != req.method && 'HEAD' != req.method) return next();",""," var accept = req.headers.accept || 'text/plain'"," , url = parse(req.url)"," , dir = decodeURIComponent(url.pathname)"," , path = normalize(join(root, dir))"," , originalUrl = parse(req.originalUrl)"," , originalDir = decodeURIComponent(originalUrl.pathname)"," , showUp = path != root && path != root + '/';",""," // null byte(s), bad request"," if (~path.indexOf('\\0')) return next(utils.error(400));",""," // malicious path, forbidden"," if (0 != path.indexOf(root)) return next(utils.error(403));",""," // check if we have a directory"," fs.stat(path, function(err, stat){"," if (err) return 'ENOENT' == err.code"," ? next()"," : next(err);",""," if (!stat.isDirectory()) return next();",""," // fetch files"," fs.readdir(path, function(err, files){"," if (err) return next(err);"," if (!hidden) files = removeHidden(files);"," if (filter) files = files.filter(filter);"," files.sort();",""," // content-negotiation"," for (var key in exports) {"," if (~accept.indexOf(key) || ~accept.indexOf('*/*')) {"," exports[key](req, res, files, next, originalDir, showUp, icons);"," return;"," }"," }",""," // not acceptable"," next(utils.error(406));"," });"," });"," };","};","","/**"," * Respond with text/html."," */","","exports.html = function(req, res, files, next, dir, showUp, icons){"," fs.readFile(__dirname + '/../public/directory.html', 'utf8', function(err, str){"," if (err) return next(err);"," fs.readFile(__dirname + '/../public/style.css', 'utf8', function(err, style){"," if (err) return next(err);"," if (showUp) files.unshift('..');"," str = str"," .replace('{style}', style)"," .replace('{files}', html(files, dir, icons))"," .replace('{directory}', dir)"," .replace('{linked-path}', htmlPath(dir));"," res.setHeader('Content-Type', 'text/html');"," res.setHeader('Content-Length', str.length);"," res.end(str);"," });"," });","};","","/**"," * Respond with application/json."," */","","exports.json = function(req, res, files){"," files = JSON.stringify(files);"," res.setHeader('Content-Type', 'application/json');"," res.setHeader('Content-Length', files.length);"," res.end(files);","};","","/**"," * Respond with text/plain."," */","","exports.plain = function(req, res, files){"," files = files.join('\\n') + '\\n';"," res.setHeader('Content-Type', 'text/plain');"," res.setHeader('Content-Length', files.length);"," res.end(files);","};","","/**"," * Map html `dir`, returning a linked path."," */","","function htmlPath(dir) {"," var curr = [];"," return dir.split('/').map(function(part){"," curr.push(part);"," return '<a href=\"' + curr.join('/') + '\">' + part + '</a>';"," }).join(' / ');","}","","/**"," * Map html `files`, returning an html unordered list."," */","","function html(files, dir, useIcons) {"," return '<ul id=\"files\">' + files.map(function(file){"," var icon = ''"," , classes = [];",""," if (useIcons && '..' != file) {"," icon = icons[extname(file)] || icons.default;"," icon = '<img src=\"data:image/png;base64,' + load(icon) + '\" />';"," classes.push('icon');"," }",""," return '<li><a href=\"'"," + join(dir, file)"," + '\" class=\"'"," + classes.join(' ') + '\"'"," + ' title=\"' + file + '\">'"," + icon + file + '</a></li>';",""," }).join('\\n') + '</ul>';","}","","/**"," * Load and cache the given `icon`."," *"," * @param {String} icon"," * @return {String}"," * @api private"," */","","function load(icon) {"," if (cache[icon]) return cache[icon];"," return cache[icon] = fs.readFileSync(__dirname + '/../public/icons/' + icon, 'base64');","}","","/**"," * Filter \"hidden\" `files`, aka files"," * beginning with a `.`."," *"," * @param {Array} files"," * @return {Array}"," * @api private"," */","","function removeHidden(files) {"," return files.filter(function(file){"," return '.' != file[0];"," });","}","","/**"," * Icon map."," */","","var icons = {"," '.js': 'page_white_code_red.png'"," , '.c': 'page_white_c.png'"," , '.h': 'page_white_h.png'"," , '.cc': 'page_white_cplusplus.png'"," , '.php': 'page_white_php.png'"," , '.rb': 'page_white_ruby.png'"," , '.cpp': 'page_white_cplusplus.png'"," , '.swf': 'page_white_flash.png'"," , '.pdf': 'page_white_acrobat.png'"," , 'default': 'page_white.png'","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/errorHandler.js b/node_modules/express/node_modules/connect/lib-cov/middleware/errorHandler.js deleted file mode 100644 index 9a87bfa..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/errorHandler.js +++ /dev/null @@ -1,104 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/errorHandler.js']) { - _$jscoverage['middleware/errorHandler.js'] = []; - _$jscoverage['middleware/errorHandler.js'][12] = 0; - _$jscoverage['middleware/errorHandler.js'][17] = 0; - _$jscoverage['middleware/errorHandler.js'][44] = 0; - _$jscoverage['middleware/errorHandler.js'][45] = 0; - _$jscoverage['middleware/errorHandler.js'][46] = 0; - _$jscoverage['middleware/errorHandler.js'][47] = 0; - _$jscoverage['middleware/errorHandler.js'][48] = 0; - _$jscoverage['middleware/errorHandler.js'][49] = 0; - _$jscoverage['middleware/errorHandler.js'][51] = 0; - _$jscoverage['middleware/errorHandler.js'][52] = 0; - _$jscoverage['middleware/errorHandler.js'][53] = 0; - _$jscoverage['middleware/errorHandler.js'][54] = 0; - _$jscoverage['middleware/errorHandler.js'][56] = 0; - _$jscoverage['middleware/errorHandler.js'][57] = 0; - _$jscoverage['middleware/errorHandler.js'][63] = 0; - _$jscoverage['middleware/errorHandler.js'][64] = 0; - _$jscoverage['middleware/errorHandler.js'][68] = 0; - _$jscoverage['middleware/errorHandler.js'][69] = 0; - _$jscoverage['middleware/errorHandler.js'][70] = 0; - _$jscoverage['middleware/errorHandler.js'][71] = 0; - _$jscoverage['middleware/errorHandler.js'][72] = 0; - _$jscoverage['middleware/errorHandler.js'][73] = 0; - _$jscoverage['middleware/errorHandler.js'][76] = 0; - _$jscoverage['middleware/errorHandler.js'][77] = 0; - _$jscoverage['middleware/errorHandler.js'][86] = 0; -} -_$jscoverage['middleware/errorHandler.js'][12]++; -var utils = require("../utils"), fs = require("fs"); -_$jscoverage['middleware/errorHandler.js'][17]++; -var env = process.env.NODE_ENV || "development"; -_$jscoverage['middleware/errorHandler.js'][44]++; -exports = module.exports = (function errorHandler() { - _$jscoverage['middleware/errorHandler.js'][45]++; - return (function errorHandler(err, req, res, next) { - _$jscoverage['middleware/errorHandler.js'][46]++; - if (err.status) { - _$jscoverage['middleware/errorHandler.js'][46]++; - res.statusCode = err.status; - } - _$jscoverage['middleware/errorHandler.js'][47]++; - if (res.statusCode < 400) { - _$jscoverage['middleware/errorHandler.js'][47]++; - res.statusCode = 500; - } - _$jscoverage['middleware/errorHandler.js'][48]++; - if ("test" != env) { - _$jscoverage['middleware/errorHandler.js'][48]++; - console.error(err.stack); - } - _$jscoverage['middleware/errorHandler.js'][49]++; - var accept = req.headers.accept || ""; - _$jscoverage['middleware/errorHandler.js'][51]++; - if (~ accept.indexOf("html")) { - _$jscoverage['middleware/errorHandler.js'][52]++; - fs.readFile(__dirname + "/../public/style.css", "utf8", (function (e, style) { - _$jscoverage['middleware/errorHandler.js'][53]++; - fs.readFile(__dirname + "/../public/error.html", "utf8", (function (e, html) { - _$jscoverage['middleware/errorHandler.js'][54]++; - var stack = (err.stack || "").split("\n").slice(1).map((function (v) { - _$jscoverage['middleware/errorHandler.js'][56]++; - return "
  • " + v + "
  • "; -})).join(""); - _$jscoverage['middleware/errorHandler.js'][57]++; - html = html.replace("{style}", style).replace("{stack}", stack).replace("{title}", exports.title).replace("{statusCode}", res.statusCode).replace(/\{error\}/g, utils.escape(err.toString())); - _$jscoverage['middleware/errorHandler.js'][63]++; - res.setHeader("Content-Type", "text/html; charset=utf-8"); - _$jscoverage['middleware/errorHandler.js'][64]++; - res.end(html); -})); -})); - } - else { - _$jscoverage['middleware/errorHandler.js'][68]++; - if (~ accept.indexOf("json")) { - _$jscoverage['middleware/errorHandler.js'][69]++; - var error = {message: err.message, stack: err.stack}; - _$jscoverage['middleware/errorHandler.js'][70]++; - for (var prop in err) { - _$jscoverage['middleware/errorHandler.js'][70]++; - error[prop] = err[prop]; -} - _$jscoverage['middleware/errorHandler.js'][71]++; - var json = JSON.stringify({error: error}); - _$jscoverage['middleware/errorHandler.js'][72]++; - res.setHeader("Content-Type", "application/json"); - _$jscoverage['middleware/errorHandler.js'][73]++; - res.end(json); - } - else { - _$jscoverage['middleware/errorHandler.js'][76]++; - res.writeHead(res.statusCode, {"Content-Type": "text/plain"}); - _$jscoverage['middleware/errorHandler.js'][77]++; - res.end(err.stack); - } - } -}); -}); -_$jscoverage['middleware/errorHandler.js'][86]++; -exports.title = "Connect"; -_$jscoverage['middleware/errorHandler.js'].source = ["/*!"," * Connect - errorHandler"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils')"," , fs = require('fs');","","// environment","","var env = process.env.NODE_ENV || 'development';","","/**"," * Error handler:"," *"," * Development error handler, providing stack traces"," * and error message responses for requests accepting text, html,"," * or json."," *"," * Text:"," *"," * By default, and when _text/plain_ is accepted a simple stack trace"," * or error message will be returned."," *"," * JSON:"," *"," * When _application/json_ is accepted, connect will respond with"," * an object in the form of `{ \"error\": error }`."," *"," * HTML:"," *"," * When accepted connect will output a nice html stack trace."," *"," * @return {Function}"," * @api public"," */","","exports = module.exports = function errorHandler(){"," return function errorHandler(err, req, res, next){"," if (err.status) res.statusCode = err.status;"," if (res.statusCode < 400) res.statusCode = 500;"," if ('test' != env) console.error(err.stack);"," var accept = req.headers.accept || '';"," // html"," if (~accept.indexOf('html')) {"," fs.readFile(__dirname + '/../public/style.css', 'utf8', function(e, style){"," fs.readFile(__dirname + '/../public/error.html', 'utf8', function(e, html){"," var stack = (err.stack || '')"," .split('\\n').slice(1)"," .map(function(v){ return '<li>' + v + '</li>'; }).join('');"," html = html"," .replace('{style}', style)"," .replace('{stack}', stack)"," .replace('{title}', exports.title)"," .replace('{statusCode}', res.statusCode)"," .replace(/\\{error\\}/g, utils.escape(err.toString()));"," res.setHeader('Content-Type', 'text/html; charset=utf-8');"," res.end(html);"," });"," });"," // json"," } else if (~accept.indexOf('json')) {"," var error = { message: err.message, stack: err.stack };"," for (var prop in err) error[prop] = err[prop];"," var json = JSON.stringify({ error: error });"," res.setHeader('Content-Type', 'application/json');"," res.end(json);"," // plain text"," } else {"," res.writeHead(res.statusCode, { 'Content-Type': 'text/plain' });"," res.end(err.stack);"," }"," };","};","","/**"," * Template title, framework authors may override this value."," */","","exports.title = 'Connect';"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/favicon.js b/node_modules/express/node_modules/connect/lib-cov/middleware/favicon.js deleted file mode 100644 index 6228079..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/favicon.js +++ /dev/null @@ -1,60 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/favicon.js']) { - _$jscoverage['middleware/favicon.js'] = []; - _$jscoverage['middleware/favicon.js'][13] = 0; - _$jscoverage['middleware/favicon.js'][50] = 0; - _$jscoverage['middleware/favicon.js'][51] = 0; - _$jscoverage['middleware/favicon.js'][56] = 0; - _$jscoverage['middleware/favicon.js'][57] = 0; - _$jscoverage['middleware/favicon.js'][58] = 0; - _$jscoverage['middleware/favicon.js'][59] = 0; - _$jscoverage['middleware/favicon.js'][60] = 0; - _$jscoverage['middleware/favicon.js'][62] = 0; - _$jscoverage['middleware/favicon.js'][63] = 0; - _$jscoverage['middleware/favicon.js'][64] = 0; - _$jscoverage['middleware/favicon.js'][73] = 0; - _$jscoverage['middleware/favicon.js'][74] = 0; - _$jscoverage['middleware/favicon.js'][78] = 0; -} -_$jscoverage['middleware/favicon.js'][13]++; -var fs = require("fs"), utils = require("../utils"); -_$jscoverage['middleware/favicon.js'][50]++; -module.exports = (function favicon(path, options) { - _$jscoverage['middleware/favicon.js'][51]++; - var options = options || {}, path = path || __dirname + "/../public/favicon.ico", maxAge = options.maxAge || 86400000, icon; - _$jscoverage['middleware/favicon.js'][56]++; - return (function favicon(req, res, next) { - _$jscoverage['middleware/favicon.js'][57]++; - if ("/favicon.ico" == req.url) { - _$jscoverage['middleware/favicon.js'][58]++; - if (icon) { - _$jscoverage['middleware/favicon.js'][59]++; - res.writeHead(200, icon.headers); - _$jscoverage['middleware/favicon.js'][60]++; - res.end(icon.body); - } - else { - _$jscoverage['middleware/favicon.js'][62]++; - fs.readFile(path, (function (err, buf) { - _$jscoverage['middleware/favicon.js'][63]++; - if (err) { - _$jscoverage['middleware/favicon.js'][63]++; - return next(err); - } - _$jscoverage['middleware/favicon.js'][64]++; - icon = {headers: {"Content-Type": "image/x-icon", "Content-Length": buf.length, "ETag": "\"" + utils.md5(buf) + "\"", "Cache-Control": "public, max-age=" + (maxAge / 1000)}, body: buf}; - _$jscoverage['middleware/favicon.js'][73]++; - res.writeHead(200, icon.headers); - _$jscoverage['middleware/favicon.js'][74]++; - res.end(icon.body); -})); - } - } - else { - _$jscoverage['middleware/favicon.js'][78]++; - next(); - } -}); -}); -_$jscoverage['middleware/favicon.js'].source = ["","/*!"," * Connect - favicon"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var fs = require('fs')"," , utils = require('../utils');","","/**"," * Favicon:"," *"," * By default serves the connect favicon, or the favicon"," * located by the given `path`."," *"," * Options:"," *"," * - `maxAge` cache-control max-age directive, defaulting to 1 day"," *"," * Examples:"," *"," * Serve default favicon:"," *"," * connect()"," * .use(connect.favicon())"," *"," * Serve favicon before logging for brevity:"," *"," * connect()"," * .use(connect.favicon())"," * .use(connect.logger('dev'))"," *"," * Serve custom favicon:"," *"," * connect()"," * .use(connect.favicon('public/favicon.ico))"," *"," * @param {String} path"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","module.exports = function favicon(path, options){"," var options = options || {}"," , path = path || __dirname + '/../public/favicon.ico'"," , maxAge = options.maxAge || 86400000"," , icon; // favicon cache",""," return function favicon(req, res, next){"," if ('/favicon.ico' == req.url) {"," if (icon) {"," res.writeHead(200, icon.headers);"," res.end(icon.body);"," } else {"," fs.readFile(path, function(err, buf){"," if (err) return next(err);"," icon = {"," headers: {"," 'Content-Type': 'image/x-icon'"," , 'Content-Length': buf.length"," , 'ETag': '\"' + utils.md5(buf) + '\"'"," , 'Cache-Control': 'public, max-age=' + (maxAge / 1000)"," },"," body: buf"," };"," res.writeHead(200, icon.headers);"," res.end(icon.body);"," });"," }"," } else {"," next();"," }"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/json.js b/node_modules/express/node_modules/connect/lib-cov/middleware/json.js deleted file mode 100644 index 87236cf..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/json.js +++ /dev/null @@ -1,117 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/json.js']) { - _$jscoverage['middleware/json.js'] = []; - _$jscoverage['middleware/json.js'][13] = 0; - _$jscoverage['middleware/json.js'][20] = 0; - _$jscoverage['middleware/json.js'][21] = 0; - _$jscoverage['middleware/json.js'][41] = 0; - _$jscoverage['middleware/json.js'][42] = 0; - _$jscoverage['middleware/json.js'][45] = 0; - _$jscoverage['middleware/json.js'][49] = 0; - _$jscoverage['middleware/json.js'][50] = 0; - _$jscoverage['middleware/json.js'][51] = 0; - _$jscoverage['middleware/json.js'][53] = 0; - _$jscoverage['middleware/json.js'][56] = 0; - _$jscoverage['middleware/json.js'][59] = 0; - _$jscoverage['middleware/json.js'][62] = 0; - _$jscoverage['middleware/json.js'][63] = 0; - _$jscoverage['middleware/json.js'][64] = 0; - _$jscoverage['middleware/json.js'][65] = 0; - _$jscoverage['middleware/json.js'][66] = 0; - _$jscoverage['middleware/json.js'][67] = 0; - _$jscoverage['middleware/json.js'][68] = 0; - _$jscoverage['middleware/json.js'][70] = 0; - _$jscoverage['middleware/json.js'][71] = 0; - _$jscoverage['middleware/json.js'][74] = 0; - _$jscoverage['middleware/json.js'][75] = 0; - _$jscoverage['middleware/json.js'][76] = 0; - _$jscoverage['middleware/json.js'][77] = 0; - _$jscoverage['middleware/json.js'][79] = 0; - _$jscoverage['middleware/json.js'][80] = 0; - _$jscoverage['middleware/json.js'][81] = 0; -} -_$jscoverage['middleware/json.js'][13]++; -var utils = require("../utils"), _limit = require("./limit"); -_$jscoverage['middleware/json.js'][20]++; -function noop(req, res, next) { - _$jscoverage['middleware/json.js'][21]++; - next(); -} -_$jscoverage['middleware/json.js'][41]++; -exports = module.exports = (function (options) { - _$jscoverage['middleware/json.js'][42]++; - var options = options || {}, strict = options.strict !== false; - _$jscoverage['middleware/json.js'][45]++; - var limit = options.limit? _limit(options.limit): noop; - _$jscoverage['middleware/json.js'][49]++; - return (function json(req, res, next) { - _$jscoverage['middleware/json.js'][50]++; - if (req._body) { - _$jscoverage['middleware/json.js'][50]++; - return next(); - } - _$jscoverage['middleware/json.js'][51]++; - req.body = req.body || {}; - _$jscoverage['middleware/json.js'][53]++; - if (! utils.hasBody(req)) { - _$jscoverage['middleware/json.js'][53]++; - return next(); - } - _$jscoverage['middleware/json.js'][56]++; - if ("application/json" != utils.mime(req)) { - _$jscoverage['middleware/json.js'][56]++; - return next(); - } - _$jscoverage['middleware/json.js'][59]++; - req._body = true; - _$jscoverage['middleware/json.js'][62]++; - limit(req, res, (function (err) { - _$jscoverage['middleware/json.js'][63]++; - if (err) { - _$jscoverage['middleware/json.js'][63]++; - return next(err); - } - _$jscoverage['middleware/json.js'][64]++; - var buf = ""; - _$jscoverage['middleware/json.js'][65]++; - req.setEncoding("utf8"); - _$jscoverage['middleware/json.js'][66]++; - req.on("data", (function (chunk) { - _$jscoverage['middleware/json.js'][66]++; - buf += chunk; -})); - _$jscoverage['middleware/json.js'][67]++; - req.on("end", (function () { - _$jscoverage['middleware/json.js'][68]++; - var first = buf.trim()[0]; - _$jscoverage['middleware/json.js'][70]++; - if (0 == buf.length) { - _$jscoverage['middleware/json.js'][71]++; - return next(utils.error(400, "invalid json, empty body")); - } - _$jscoverage['middleware/json.js'][74]++; - if (strict && "{" != first && "[" != first) { - _$jscoverage['middleware/json.js'][74]++; - return next(utils.error(400, "invalid json")); - } - _$jscoverage['middleware/json.js'][75]++; - try { - _$jscoverage['middleware/json.js'][76]++; - req.body = JSON.parse(buf, options.reviver); - _$jscoverage['middleware/json.js'][77]++; - next(); - } - catch (err) { - _$jscoverage['middleware/json.js'][79]++; - err.body = buf; - _$jscoverage['middleware/json.js'][80]++; - err.status = 400; - _$jscoverage['middleware/json.js'][81]++; - next(err); - } -})); -})); -}); -}); -_$jscoverage['middleware/json.js'].source = ["","/*!"," * Connect - json"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils')"," , _limit = require('./limit');","","/**"," * noop middleware."," */","","function noop(req, res, next) {"," next();","}","","/**"," * JSON:"," *"," * Parse JSON request bodies, providing the"," * parsed object as `req.body`."," *"," * Options:"," *"," * - `strict` when `false` anything `JSON.parse()` accepts will be parsed"," * - `reviver` used as the second \"reviver\" argument for JSON.parse"," * - `limit` byte limit disabled by default"," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function(options){"," var options = options || {}"," , strict = options.strict !== false;",""," var limit = options.limit"," ? _limit(options.limit)"," : noop;",""," return function json(req, res, next) {"," if (req._body) return next();"," req.body = req.body || {};",""," if (!utils.hasBody(req)) return next();",""," // check Content-Type"," if ('application/json' != utils.mime(req)) return next();",""," // flag as parsed"," req._body = true;",""," // parse"," limit(req, res, function(err){"," if (err) return next(err);"," var buf = '';"," req.setEncoding('utf8');"," req.on('data', function(chunk){ buf += chunk });"," req.on('end', function(){"," var first = buf.trim()[0];",""," if (0 == buf.length) {"," return next(utils.error(400, 'invalid json, empty body'));"," }"," "," if (strict && '{' != first && '[' != first) return next(utils.error(400, 'invalid json'));"," try {"," req.body = JSON.parse(buf, options.reviver);"," next();"," } catch (err){"," err.body = buf;"," err.status = 400;"," next(err);"," }"," });"," });"," }","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/limit.js b/node_modules/express/node_modules/connect/lib-cov/middleware/limit.js deleted file mode 100644 index fa8ea34..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/limit.js +++ /dev/null @@ -1,63 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/limit.js']) { - _$jscoverage['middleware/limit.js'] = []; - _$jscoverage['middleware/limit.js'][12] = 0; - _$jscoverage['middleware/limit.js'][31] = 0; - _$jscoverage['middleware/limit.js'][32] = 0; - _$jscoverage['middleware/limit.js'][33] = 0; - _$jscoverage['middleware/limit.js'][34] = 0; - _$jscoverage['middleware/limit.js'][35] = 0; - _$jscoverage['middleware/limit.js'][41] = 0; - _$jscoverage['middleware/limit.js'][42] = 0; - _$jscoverage['middleware/limit.js'][45] = 0; - _$jscoverage['middleware/limit.js'][48] = 0; - _$jscoverage['middleware/limit.js'][49] = 0; - _$jscoverage['middleware/limit.js'][50] = 0; - _$jscoverage['middleware/limit.js'][53] = 0; -} -_$jscoverage['middleware/limit.js'][12]++; -var utils = require("../utils"); -_$jscoverage['middleware/limit.js'][31]++; -module.exports = (function limit(bytes) { - _$jscoverage['middleware/limit.js'][32]++; - if ("string" == typeof bytes) { - _$jscoverage['middleware/limit.js'][32]++; - bytes = utils.parseBytes(bytes); - } - _$jscoverage['middleware/limit.js'][33]++; - if ("number" != typeof bytes) { - _$jscoverage['middleware/limit.js'][33]++; - throw new Error("limit() bytes required"); - } - _$jscoverage['middleware/limit.js'][34]++; - return (function limit(req, res, next) { - _$jscoverage['middleware/limit.js'][35]++; - var received = 0, len = req.headers["content-length"]? parseInt(req.headers["content-length"], 10): null; - _$jscoverage['middleware/limit.js'][41]++; - if (req._limit) { - _$jscoverage['middleware/limit.js'][41]++; - return next(); - } - _$jscoverage['middleware/limit.js'][42]++; - req._limit = true; - _$jscoverage['middleware/limit.js'][45]++; - if (len && len > bytes) { - _$jscoverage['middleware/limit.js'][45]++; - return next(utils.error(413)); - } - _$jscoverage['middleware/limit.js'][48]++; - req.on("data", (function (chunk) { - _$jscoverage['middleware/limit.js'][49]++; - received += chunk.length; - _$jscoverage['middleware/limit.js'][50]++; - if (received > bytes) { - _$jscoverage['middleware/limit.js'][50]++; - req.destroy(); - } -})); - _$jscoverage['middleware/limit.js'][53]++; - next(); -}); -}); -_$jscoverage['middleware/limit.js'].source = ["","/*!"," * Connect - limit"," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils');","","/**"," * Limit:"," *"," * Limit request bodies to the given size in `bytes`."," *"," * A string representation of the bytesize may also be passed,"," * for example \"5mb\", \"200kb\", \"1gb\", etc."," *"," * connect()"," * .use(connect.limit('5.5mb'))"," * .use(handleImageUpload)"," *"," * @param {Number|String} bytes"," * @return {Function}"," * @api public"," */","","module.exports = function limit(bytes){"," if ('string' == typeof bytes) bytes = utils.parseBytes(bytes);"," if ('number' != typeof bytes) throw new Error('limit() bytes required');"," return function limit(req, res, next){"," var received = 0"," , len = req.headers['content-length']"," ? parseInt(req.headers['content-length'], 10)"," : null;",""," // self-awareness"," if (req._limit) return next();"," req._limit = true;",""," // limit by content-length"," if (len && len > bytes) return next(utils.error(413));",""," // limit"," req.on('data', function(chunk){"," received += chunk.length;"," if (received > bytes) req.destroy();"," });",""," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/logger.js b/node_modules/express/node_modules/connect/lib-cov/middleware/logger.js deleted file mode 100644 index 75c7a00..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/logger.js +++ /dev/null @@ -1,312 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/logger.js']) { - _$jscoverage['middleware/logger.js'] = []; - _$jscoverage['middleware/logger.js'][12] = 0; - _$jscoverage['middleware/logger.js'][18] = 0; - _$jscoverage['middleware/logger.js'][24] = 0; - _$jscoverage['middleware/logger.js'][90] = 0; - _$jscoverage['middleware/logger.js'][91] = 0; - _$jscoverage['middleware/logger.js'][92] = 0; - _$jscoverage['middleware/logger.js'][93] = 0; - _$jscoverage['middleware/logger.js'][94] = 0; - _$jscoverage['middleware/logger.js'][96] = 0; - _$jscoverage['middleware/logger.js'][100] = 0; - _$jscoverage['middleware/logger.js'][103] = 0; - _$jscoverage['middleware/logger.js'][106] = 0; - _$jscoverage['middleware/logger.js'][109] = 0; - _$jscoverage['middleware/logger.js'][113] = 0; - _$jscoverage['middleware/logger.js'][114] = 0; - _$jscoverage['middleware/logger.js'][120] = 0; - _$jscoverage['middleware/logger.js'][121] = 0; - _$jscoverage['middleware/logger.js'][122] = 0; - _$jscoverage['middleware/logger.js'][123] = 0; - _$jscoverage['middleware/logger.js'][128] = 0; - _$jscoverage['middleware/logger.js'][130] = 0; - _$jscoverage['middleware/logger.js'][135] = 0; - _$jscoverage['middleware/logger.js'][136] = 0; - _$jscoverage['middleware/logger.js'][139] = 0; - _$jscoverage['middleware/logger.js'][140] = 0; - _$jscoverage['middleware/logger.js'][141] = 0; - _$jscoverage['middleware/logger.js'][142] = 0; - _$jscoverage['middleware/logger.js'][145] = 0; - _$jscoverage['middleware/logger.js'][146] = 0; - _$jscoverage['middleware/logger.js'][147] = 0; - _$jscoverage['middleware/logger.js'][148] = 0; - _$jscoverage['middleware/logger.js'][149] = 0; - _$jscoverage['middleware/logger.js'][150] = 0; - _$jscoverage['middleware/logger.js'][151] = 0; - _$jscoverage['middleware/logger.js'][156] = 0; - _$jscoverage['middleware/logger.js'][168] = 0; - _$jscoverage['middleware/logger.js'][169] = 0; - _$jscoverage['middleware/logger.js'][170] = 0; - _$jscoverage['middleware/logger.js'][171] = 0; - _$jscoverage['middleware/logger.js'][173] = 0; - _$jscoverage['middleware/logger.js'][174] = 0; - _$jscoverage['middleware/logger.js'][186] = 0; - _$jscoverage['middleware/logger.js'][187] = 0; - _$jscoverage['middleware/logger.js'][188] = 0; - _$jscoverage['middleware/logger.js'][200] = 0; - _$jscoverage['middleware/logger.js'][201] = 0; - _$jscoverage['middleware/logger.js'][202] = 0; - _$jscoverage['middleware/logger.js'][209] = 0; - _$jscoverage['middleware/logger.js'][215] = 0; - _$jscoverage['middleware/logger.js'][221] = 0; - _$jscoverage['middleware/logger.js'][227] = 0; - _$jscoverage['middleware/logger.js'][228] = 0; - _$jscoverage['middleware/logger.js'][232] = 0; - _$jscoverage['middleware/logger.js'][233] = 0; - _$jscoverage['middleware/logger.js'][234] = 0; - _$jscoverage['middleware/logger.js'][236] = 0; - _$jscoverage['middleware/logger.js'][240] = 0; - _$jscoverage['middleware/logger.js'][253] = 0; - _$jscoverage['middleware/logger.js'][254] = 0; - _$jscoverage['middleware/logger.js'][261] = 0; - _$jscoverage['middleware/logger.js'][262] = 0; - _$jscoverage['middleware/logger.js'][269] = 0; - _$jscoverage['middleware/logger.js'][270] = 0; - _$jscoverage['middleware/logger.js'][277] = 0; - _$jscoverage['middleware/logger.js'][278] = 0; - _$jscoverage['middleware/logger.js'][285] = 0; - _$jscoverage['middleware/logger.js'][286] = 0; - _$jscoverage['middleware/logger.js'][293] = 0; - _$jscoverage['middleware/logger.js'][294] = 0; - _$jscoverage['middleware/logger.js'][301] = 0; - _$jscoverage['middleware/logger.js'][302] = 0; - _$jscoverage['middleware/logger.js'][303] = 0; - _$jscoverage['middleware/logger.js'][304] = 0; - _$jscoverage['middleware/logger.js'][305] = 0; - _$jscoverage['middleware/logger.js'][312] = 0; - _$jscoverage['middleware/logger.js'][313] = 0; - _$jscoverage['middleware/logger.js'][320] = 0; - _$jscoverage['middleware/logger.js'][321] = 0; - _$jscoverage['middleware/logger.js'][328] = 0; - _$jscoverage['middleware/logger.js'][329] = 0; - _$jscoverage['middleware/logger.js'][336] = 0; - _$jscoverage['middleware/logger.js'][337] = 0; -} -_$jscoverage['middleware/logger.js'][12]++; -var bytes = require("bytes"); -_$jscoverage['middleware/logger.js'][18]++; -var buf = []; -_$jscoverage['middleware/logger.js'][24]++; -var defaultBufferDuration = 1000; -_$jscoverage['middleware/logger.js'][90]++; -exports = module.exports = (function logger(options) { - _$jscoverage['middleware/logger.js'][91]++; - if ("object" == typeof options) { - _$jscoverage['middleware/logger.js'][92]++; - options = options || {}; - } - else { - _$jscoverage['middleware/logger.js'][93]++; - if (options) { - _$jscoverage['middleware/logger.js'][94]++; - options = {format: options}; - } - else { - _$jscoverage['middleware/logger.js'][96]++; - options = {}; - } - } - _$jscoverage['middleware/logger.js'][100]++; - var immediate = options.immediate; - _$jscoverage['middleware/logger.js'][103]++; - var fmt = exports[options.format] || options.format || exports["default"]; - _$jscoverage['middleware/logger.js'][106]++; - if ("function" != typeof fmt) { - _$jscoverage['middleware/logger.js'][106]++; - fmt = compile(fmt); - } - _$jscoverage['middleware/logger.js'][109]++; - var stream = options.stream || process.stdout, buffer = options.buffer; - _$jscoverage['middleware/logger.js'][113]++; - if (buffer) { - _$jscoverage['middleware/logger.js'][114]++; - var realStream = stream, interval = "number" == typeof buffer? buffer: defaultBufferDuration; - _$jscoverage['middleware/logger.js'][120]++; - setInterval((function () { - _$jscoverage['middleware/logger.js'][121]++; - if (buf.length) { - _$jscoverage['middleware/logger.js'][122]++; - realStream.write(buf.join("")); - _$jscoverage['middleware/logger.js'][123]++; - buf.length = 0; - } -}), interval); - _$jscoverage['middleware/logger.js'][128]++; - stream = {write: (function (str) { - _$jscoverage['middleware/logger.js'][130]++; - buf.push(str); -})}; - } - _$jscoverage['middleware/logger.js'][135]++; - return (function logger(req, res, next) { - _$jscoverage['middleware/logger.js'][136]++; - req._startTime = new Date(); - _$jscoverage['middleware/logger.js'][139]++; - if (immediate) { - _$jscoverage['middleware/logger.js'][140]++; - var line = fmt(exports, req, res); - _$jscoverage['middleware/logger.js'][141]++; - if (null == line) { - _$jscoverage['middleware/logger.js'][141]++; - return; - } - _$jscoverage['middleware/logger.js'][142]++; - stream.write(line + "\n"); - } - else { - _$jscoverage['middleware/logger.js'][145]++; - var end = res.end; - _$jscoverage['middleware/logger.js'][146]++; - res.end = (function (chunk, encoding) { - _$jscoverage['middleware/logger.js'][147]++; - res.end = end; - _$jscoverage['middleware/logger.js'][148]++; - res.end(chunk, encoding); - _$jscoverage['middleware/logger.js'][149]++; - var line = fmt(exports, req, res); - _$jscoverage['middleware/logger.js'][150]++; - if (null == line) { - _$jscoverage['middleware/logger.js'][150]++; - return; - } - _$jscoverage['middleware/logger.js'][151]++; - stream.write(line + "\n"); -}); - } - _$jscoverage['middleware/logger.js'][156]++; - next(); -}); -}); -_$jscoverage['middleware/logger.js'][168]++; -function compile(fmt) { - _$jscoverage['middleware/logger.js'][169]++; - fmt = fmt.replace(/"/g, "\\\""); - _$jscoverage['middleware/logger.js'][170]++; - var js = " return \"" + fmt.replace(/:([-\w]{2,})(?:\[([^\]]+)\])?/g, (function (_, name, arg) { - _$jscoverage['middleware/logger.js'][171]++; - return "\"\n + (tokens[\"" + name + "\"](req, res, \"" + arg + "\") || \"-\") + \""; -})) + "\";"; - _$jscoverage['middleware/logger.js'][173]++; - return new Function("tokens, req, res", js); -} -_$jscoverage['middleware/logger.js'][174]++; -; -_$jscoverage['middleware/logger.js'][186]++; -exports.token = (function (name, fn) { - _$jscoverage['middleware/logger.js'][187]++; - exports[name] = fn; - _$jscoverage['middleware/logger.js'][188]++; - return this; -}); -_$jscoverage['middleware/logger.js'][200]++; -exports.format = (function (name, str) { - _$jscoverage['middleware/logger.js'][201]++; - exports[name] = str; - _$jscoverage['middleware/logger.js'][202]++; - return this; -}); -_$jscoverage['middleware/logger.js'][209]++; -exports.format("default", ":remote-addr - - [:date] \":method :url HTTP/:http-version\" :status :res[content-length] \":referrer\" \":user-agent\""); -_$jscoverage['middleware/logger.js'][215]++; -exports.format("short", ":remote-addr - :method :url HTTP/:http-version :status :res[content-length] - :response-time ms"); -_$jscoverage['middleware/logger.js'][221]++; -exports.format("tiny", ":method :url :status :res[content-length] - :response-time ms"); -_$jscoverage['middleware/logger.js'][227]++; -exports.format("dev", (function (tokens, req, res) { - _$jscoverage['middleware/logger.js'][228]++; - var status = res.statusCode, len = parseInt(res.getHeader("Content-Length"), 10), color = 32; - _$jscoverage['middleware/logger.js'][232]++; - if (status >= 500) { - _$jscoverage['middleware/logger.js'][232]++; - color = 31; - } - else { - _$jscoverage['middleware/logger.js'][233]++; - if (status >= 400) { - _$jscoverage['middleware/logger.js'][233]++; - color = 33; - } - else { - _$jscoverage['middleware/logger.js'][234]++; - if (status >= 300) { - _$jscoverage['middleware/logger.js'][234]++; - color = 36; - } - } - } - _$jscoverage['middleware/logger.js'][236]++; - len = isNaN(len)? "": len = " - " + bytes(len); - _$jscoverage['middleware/logger.js'][240]++; - return "\u001b[90m" + req.method + " " + req.originalUrl + " " + "\u001b[" + color + "m" + res.statusCode + " \u001b[90m" + (new Date() - req._startTime) + "ms" + len + "\u001b[0m"; -})); -_$jscoverage['middleware/logger.js'][253]++; -exports.token("url", (function (req) { - _$jscoverage['middleware/logger.js'][254]++; - return req.originalUrl || req.url; -})); -_$jscoverage['middleware/logger.js'][261]++; -exports.token("method", (function (req) { - _$jscoverage['middleware/logger.js'][262]++; - return req.method; -})); -_$jscoverage['middleware/logger.js'][269]++; -exports.token("response-time", (function (req) { - _$jscoverage['middleware/logger.js'][270]++; - return new Date() - req._startTime; -})); -_$jscoverage['middleware/logger.js'][277]++; -exports.token("date", (function () { - _$jscoverage['middleware/logger.js'][278]++; - return new Date().toUTCString(); -})); -_$jscoverage['middleware/logger.js'][285]++; -exports.token("status", (function (req, res) { - _$jscoverage['middleware/logger.js'][286]++; - return res.statusCode; -})); -_$jscoverage['middleware/logger.js'][293]++; -exports.token("referrer", (function (req) { - _$jscoverage['middleware/logger.js'][294]++; - return req.headers.referer || req.headers.referrer; -})); -_$jscoverage['middleware/logger.js'][301]++; -exports.token("remote-addr", (function (req) { - _$jscoverage['middleware/logger.js'][302]++; - if (req.ip) { - _$jscoverage['middleware/logger.js'][302]++; - return req.ip; - } - _$jscoverage['middleware/logger.js'][303]++; - var sock = req.socket; - _$jscoverage['middleware/logger.js'][304]++; - if (sock.socket) { - _$jscoverage['middleware/logger.js'][304]++; - return sock.socket.remoteAddress; - } - _$jscoverage['middleware/logger.js'][305]++; - return sock.remoteAddress; -})); -_$jscoverage['middleware/logger.js'][312]++; -exports.token("http-version", (function (req) { - _$jscoverage['middleware/logger.js'][313]++; - return req.httpVersionMajor + "." + req.httpVersionMinor; -})); -_$jscoverage['middleware/logger.js'][320]++; -exports.token("user-agent", (function (req) { - _$jscoverage['middleware/logger.js'][321]++; - return req.headers["user-agent"]; -})); -_$jscoverage['middleware/logger.js'][328]++; -exports.token("req", (function (req, res, field) { - _$jscoverage['middleware/logger.js'][329]++; - return req.headers[field.toLowerCase()]; -})); -_$jscoverage['middleware/logger.js'][336]++; -exports.token("res", (function (req, res, field) { - _$jscoverage['middleware/logger.js'][337]++; - return (res._headers || {})[field.toLowerCase()]; -})); -_$jscoverage['middleware/logger.js'].source = ["/*!"," * Connect - logger"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var bytes = require('bytes');","","/*!"," * Log buffer."," */","","var buf = [];","","/*!"," * Default log buffer duration."," */","","var defaultBufferDuration = 1000;","","/**"," * Logger:"," *"," * Log requests with the given `options` or a `format` string."," *"," * Options:"," *"," * - `format` Format string, see below for tokens"," * - `stream` Output stream, defaults to _stdout_"," * - `buffer` Buffer duration, defaults to 1000ms when _true_"," * - `immediate` Write log line on request instead of response (for response times)"," *"," * Tokens:"," *"," * - `:req[header]` ex: `:req[Accept]`"," * - `:res[header]` ex: `:res[Content-Length]`"," * - `:http-version`"," * - `:response-time`"," * - `:remote-addr`"," * - `:date`"," * - `:method`"," * - `:url`"," * - `:referrer`"," * - `:user-agent`"," * - `:status`"," *"," * Formats:"," *"," * Pre-defined formats that ship with connect:"," *"," * - `default` ':remote-addr - - [:date] \":method :url HTTP/:http-version\" :status :res[content-length] \":referrer\" \":user-agent\"'"," * - `short` ':remote-addr - :method :url HTTP/:http-version :status :res[content-length] - :response-time ms'"," * - `tiny` ':method :url :status :res[content-length] - :response-time ms'"," * - `dev` concise output colored by response status for development use"," *"," * Examples:"," *"," * connect.logger() // default"," * connect.logger('short')"," * connect.logger('tiny')"," * connect.logger({ immediate: true, format: 'dev' })"," * connect.logger(':method :url - :referrer')"," * connect.logger(':req[content-type] -> :res[content-type]')"," * connect.logger(function(tokens, req, res){ return 'some format string' })"," *"," * Defining Tokens:"," *"," * To define a token, simply invoke `connect.logger.token()` with the"," * name and a callback function. The value returned is then available"," * as \":type\" in this case."," *"," * connect.logger.token('type', function(req, res){ return req.headers['content-type']; })"," *"," * Defining Formats:"," *"," * All default formats are defined this way, however it's public API as well:"," *"," * connect.logger.format('name', 'string or function')"," *"," * @param {String|Function|Object} format or options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function logger(options) {"," if ('object' == typeof options) {"," options = options || {};"," } else if (options) {"," options = { format: options };"," } else {"," options = {};"," }",""," // output on request instead of response"," var immediate = options.immediate;",""," // format name"," var fmt = exports[options.format] || options.format || exports.default;",""," // compile format"," if ('function' != typeof fmt) fmt = compile(fmt);",""," // options"," var stream = options.stream || process.stdout"," , buffer = options.buffer;",""," // buffering support"," if (buffer) {"," var realStream = stream"," , interval = 'number' == typeof buffer"," ? buffer"," : defaultBufferDuration;",""," // flush interval"," setInterval(function(){"," if (buf.length) {"," realStream.write(buf.join(''));"," buf.length = 0;"," }"," }, interval); ",""," // swap the stream"," stream = {"," write: function(str){"," buf.push(str);"," }"," };"," }",""," return function logger(req, res, next) {"," req._startTime = new Date;",""," // immediate"," if (immediate) {"," var line = fmt(exports, req, res);"," if (null == line) return;"," stream.write(line + '\\n');"," // proxy end to output logging"," } else {"," var end = res.end;"," res.end = function(chunk, encoding){"," res.end = end;"," res.end(chunk, encoding);"," var line = fmt(exports, req, res);"," if (null == line) return;"," stream.write(line + '\\n');"," };"," }","",""," next();"," };","};","","/**"," * Compile `fmt` into a function."," *"," * @param {String} fmt"," * @return {Function}"," * @api private"," */","","function compile(fmt) {"," fmt = fmt.replace(/\"/g, '\\\\\"');"," var js = ' return \"' + fmt.replace(/:([-\\w]{2,})(?:\\[([^\\]]+)\\])?/g, function(_, name, arg){"," return '\"\\n + (tokens[\"' + name + '\"](req, res, \"' + arg + '\") || \"-\") + \"';"," }) + '\";'"," return new Function('tokens, req, res', js);","};","","/**"," * Define a token function with the given `name`,"," * and callback `fn(req, res)`."," *"," * @param {String} name"," * @param {Function} fn"," * @return {Object} exports for chaining"," * @api public"," */","","exports.token = function(name, fn) {"," exports[name] = fn;"," return this;","};","","/**"," * Define a `fmt` with the given `name`."," *"," * @param {String} name"," * @param {String|Function} fmt"," * @return {Object} exports for chaining"," * @api public"," */","","exports.format = function(name, str){"," exports[name] = str;"," return this;","};","","/**"," * Default format."," */","","exports.format('default', ':remote-addr - - [:date] \":method :url HTTP/:http-version\" :status :res[content-length] \":referrer\" \":user-agent\"');","","/**"," * Short format."," */","","exports.format('short', ':remote-addr - :method :url HTTP/:http-version :status :res[content-length] - :response-time ms');","","/**"," * Tiny format."," */","","exports.format('tiny', ':method :url :status :res[content-length] - :response-time ms');","","/**"," * dev (colored)"," */","","exports.format('dev', function(tokens, req, res){"," var status = res.statusCode"," , len = parseInt(res.getHeader('Content-Length'), 10)"," , color = 32;",""," if (status >= 500) color = 31"," else if (status >= 400) color = 33"," else if (status >= 300) color = 36;",""," len = isNaN(len)"," ? ''"," : len = ' - ' + bytes(len);",""," return '\\033[90m' + req.method"," + ' ' + req.originalUrl + ' '"," + '\\033[' + color + 'm' + res.statusCode"," + ' \\033[90m'"," + (new Date - req._startTime)"," + 'ms' + len"," + '\\033[0m';","});","","/**"," * request url"," */","","exports.token('url', function(req){"," return req.originalUrl || req.url;","});","","/**"," * request method"," */","","exports.token('method', function(req){"," return req.method;","});","","/**"," * response time in milliseconds"," */","","exports.token('response-time', function(req){"," return new Date - req._startTime;","});","","/**"," * UTC date"," */","","exports.token('date', function(){"," return new Date().toUTCString();","});","","/**"," * response status code"," */","","exports.token('status', function(req, res){"," return res.statusCode;","});","","/**"," * normalized referrer"," */","","exports.token('referrer', function(req){"," return req.headers['referer'] || req.headers['referrer'];","});","","/**"," * remote address"," */","","exports.token('remote-addr', function(req){"," if (req.ip) return req.ip;"," var sock = req.socket;"," if (sock.socket) return sock.socket.remoteAddress;"," return sock.remoteAddress;","});","","/**"," * HTTP version"," */","","exports.token('http-version', function(req){"," return req.httpVersionMajor + '.' + req.httpVersionMinor;","});","","/**"," * UA string"," */","","exports.token('user-agent', function(req){"," return req.headers['user-agent'];","});","","/**"," * request header"," */","","exports.token('req', function(req, res, field){"," return req.headers[field.toLowerCase()];","});","","/**"," * response header"," */","","exports.token('res', function(req, res, field){"," return (res._headers || {})[field.toLowerCase()];","});",""]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/methodOverride.js b/node_modules/express/node_modules/connect/lib-cov/middleware/methodOverride.js deleted file mode 100644 index 0a9118c..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/methodOverride.js +++ /dev/null @@ -1,42 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/methodOverride.js']) { - _$jscoverage['middleware/methodOverride.js'] = []; - _$jscoverage['middleware/methodOverride.js'][23] = 0; - _$jscoverage['middleware/methodOverride.js'][24] = 0; - _$jscoverage['middleware/methodOverride.js'][25] = 0; - _$jscoverage['middleware/methodOverride.js'][26] = 0; - _$jscoverage['middleware/methodOverride.js'][29] = 0; - _$jscoverage['middleware/methodOverride.js'][30] = 0; - _$jscoverage['middleware/methodOverride.js'][31] = 0; - _$jscoverage['middleware/methodOverride.js'][33] = 0; - _$jscoverage['middleware/methodOverride.js'][34] = 0; - _$jscoverage['middleware/methodOverride.js'][37] = 0; -} -_$jscoverage['middleware/methodOverride.js'][23]++; -module.exports = (function methodOverride(key) { - _$jscoverage['middleware/methodOverride.js'][24]++; - key = key || "_method"; - _$jscoverage['middleware/methodOverride.js'][25]++; - return (function methodOverride(req, res, next) { - _$jscoverage['middleware/methodOverride.js'][26]++; - req.originalMethod = req.originalMethod || req.method; - _$jscoverage['middleware/methodOverride.js'][29]++; - if (req.body && key in req.body) { - _$jscoverage['middleware/methodOverride.js'][30]++; - req.method = req.body[key].toUpperCase(); - _$jscoverage['middleware/methodOverride.js'][31]++; - delete req.body[key]; - } - else { - _$jscoverage['middleware/methodOverride.js'][33]++; - if (req.headers["x-http-method-override"]) { - _$jscoverage['middleware/methodOverride.js'][34]++; - req.method = req.headers["x-http-method-override"].toUpperCase(); - } - } - _$jscoverage['middleware/methodOverride.js'][37]++; - next(); -}); -}); -_$jscoverage['middleware/methodOverride.js'].source = ["","/*!"," * Connect - methodOverride"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Method Override:"," * "," * Provides faux HTTP method support."," * "," * Pass an optional `key` to use when checking for"," * a method override, othewise defaults to _\\_method_."," * The original method is available via `req.originalMethod`."," *"," * @param {String} key"," * @return {Function}"," * @api public"," */","","module.exports = function methodOverride(key){"," key = key || \"_method\";"," return function methodOverride(req, res, next) {"," req.originalMethod = req.originalMethod || req.method;",""," // req.body"," if (req.body && key in req.body) {"," req.method = req.body[key].toUpperCase();"," delete req.body[key];"," // check X-HTTP-Method-Override"," } else if (req.headers['x-http-method-override']) {"," req.method = req.headers['x-http-method-override'].toUpperCase();"," }"," "," next();"," };","};",""]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/multipart.js b/node_modules/express/node_modules/connect/lib-cov/middleware/multipart.js deleted file mode 100644 index dfcde09..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/multipart.js +++ /dev/null @@ -1,183 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/multipart.js']) { - _$jscoverage['middleware/multipart.js'] = []; - _$jscoverage['middleware/multipart.js'][12] = 0; - _$jscoverage['middleware/multipart.js'][21] = 0; - _$jscoverage['middleware/multipart.js'][22] = 0; - _$jscoverage['middleware/multipart.js'][52] = 0; - _$jscoverage['middleware/multipart.js'][53] = 0; - _$jscoverage['middleware/multipart.js'][55] = 0; - _$jscoverage['middleware/multipart.js'][59] = 0; - _$jscoverage['middleware/multipart.js'][60] = 0; - _$jscoverage['middleware/multipart.js'][61] = 0; - _$jscoverage['middleware/multipart.js'][62] = 0; - _$jscoverage['middleware/multipart.js'][64] = 0; - _$jscoverage['middleware/multipart.js'][67] = 0; - _$jscoverage['middleware/multipart.js'][70] = 0; - _$jscoverage['middleware/multipart.js'][73] = 0; - _$jscoverage['middleware/multipart.js'][76] = 0; - _$jscoverage['middleware/multipart.js'][77] = 0; - _$jscoverage['middleware/multipart.js'][79] = 0; - _$jscoverage['middleware/multipart.js'][84] = 0; - _$jscoverage['middleware/multipart.js'][85] = 0; - _$jscoverage['middleware/multipart.js'][88] = 0; - _$jscoverage['middleware/multipart.js'][89] = 0; - _$jscoverage['middleware/multipart.js'][90] = 0; - _$jscoverage['middleware/multipart.js'][91] = 0; - _$jscoverage['middleware/multipart.js'][92] = 0; - _$jscoverage['middleware/multipart.js'][94] = 0; - _$jscoverage['middleware/multipart.js'][98] = 0; - _$jscoverage['middleware/multipart.js'][99] = 0; - _$jscoverage['middleware/multipart.js'][102] = 0; - _$jscoverage['middleware/multipart.js'][103] = 0; - _$jscoverage['middleware/multipart.js'][106] = 0; - _$jscoverage['middleware/multipart.js'][107] = 0; - _$jscoverage['middleware/multipart.js'][108] = 0; - _$jscoverage['middleware/multipart.js'][109] = 0; - _$jscoverage['middleware/multipart.js'][111] = 0; - _$jscoverage['middleware/multipart.js'][114] = 0; - _$jscoverage['middleware/multipart.js'][115] = 0; - _$jscoverage['middleware/multipart.js'][116] = 0; - _$jscoverage['middleware/multipart.js'][117] = 0; - _$jscoverage['middleware/multipart.js'][118] = 0; - _$jscoverage['middleware/multipart.js'][119] = 0; - _$jscoverage['middleware/multipart.js'][121] = 0; - _$jscoverage['middleware/multipart.js'][125] = 0; - _$jscoverage['middleware/multipart.js'][127] = 0; - _$jscoverage['middleware/multipart.js'][128] = 0; - _$jscoverage['middleware/multipart.js'][129] = 0; -} -_$jscoverage['middleware/multipart.js'][12]++; -var formidable = require("formidable"), _limit = require("./limit"), utils = require("../utils"), qs = require("qs"); -_$jscoverage['middleware/multipart.js'][21]++; -function noop(req, res, next) { - _$jscoverage['middleware/multipart.js'][22]++; - next(); -} -_$jscoverage['middleware/multipart.js'][52]++; -exports = module.exports = (function (options) { - _$jscoverage['middleware/multipart.js'][53]++; - options = options || {}; - _$jscoverage['middleware/multipart.js'][55]++; - var limit = options.limit? _limit(options.limit): noop; - _$jscoverage['middleware/multipart.js'][59]++; - return (function multipart(req, res, next) { - _$jscoverage['middleware/multipart.js'][60]++; - if (req._body) { - _$jscoverage['middleware/multipart.js'][60]++; - return next(); - } - _$jscoverage['middleware/multipart.js'][61]++; - req.body = req.body || {}; - _$jscoverage['middleware/multipart.js'][62]++; - req.files = req.files || {}; - _$jscoverage['middleware/multipart.js'][64]++; - if (! utils.hasBody(req)) { - _$jscoverage['middleware/multipart.js'][64]++; - return next(); - } - _$jscoverage['middleware/multipart.js'][67]++; - if ("GET" == req.method || "HEAD" == req.method) { - _$jscoverage['middleware/multipart.js'][67]++; - return next(); - } - _$jscoverage['middleware/multipart.js'][70]++; - if ("multipart/form-data" != utils.mime(req)) { - _$jscoverage['middleware/multipart.js'][70]++; - return next(); - } - _$jscoverage['middleware/multipart.js'][73]++; - req._body = true; - _$jscoverage['middleware/multipart.js'][76]++; - limit(req, res, (function (err) { - _$jscoverage['middleware/multipart.js'][77]++; - if (err) { - _$jscoverage['middleware/multipart.js'][77]++; - return next(err); - } - _$jscoverage['middleware/multipart.js'][79]++; - var form = new formidable.IncomingForm(), data = {}, files = {}, done; - _$jscoverage['middleware/multipart.js'][84]++; - Object.keys(options).forEach((function (key) { - _$jscoverage['middleware/multipart.js'][85]++; - form[key] = options[key]; -})); - _$jscoverage['middleware/multipart.js'][88]++; - function ondata(name, val, data) { - _$jscoverage['middleware/multipart.js'][89]++; - if (Array.isArray(data[name])) { - _$jscoverage['middleware/multipart.js'][90]++; - data[name].push(val); - } - else { - _$jscoverage['middleware/multipart.js'][91]++; - if (data[name]) { - _$jscoverage['middleware/multipart.js'][92]++; - data[name] = [data[name], val]; - } - else { - _$jscoverage['middleware/multipart.js'][94]++; - data[name] = val; - } - } -} - _$jscoverage['middleware/multipart.js'][98]++; - form.on("field", (function (name, val) { - _$jscoverage['middleware/multipart.js'][99]++; - ondata(name, val, data); -})); - _$jscoverage['middleware/multipart.js'][102]++; - form.on("file", (function (name, val) { - _$jscoverage['middleware/multipart.js'][103]++; - ondata(name, val, files); -})); - _$jscoverage['middleware/multipart.js'][106]++; - form.on("error", (function (err) { - _$jscoverage['middleware/multipart.js'][107]++; - if (! options.defer) { - _$jscoverage['middleware/multipart.js'][108]++; - err.status = 400; - _$jscoverage['middleware/multipart.js'][109]++; - next(err); - } - _$jscoverage['middleware/multipart.js'][111]++; - done = true; -})); - _$jscoverage['middleware/multipart.js'][114]++; - form.on("end", (function () { - _$jscoverage['middleware/multipart.js'][115]++; - if (done) { - _$jscoverage['middleware/multipart.js'][115]++; - return; - } - _$jscoverage['middleware/multipart.js'][116]++; - try { - _$jscoverage['middleware/multipart.js'][117]++; - req.body = qs.parse(data); - _$jscoverage['middleware/multipart.js'][118]++; - req.files = qs.parse(files); - _$jscoverage['middleware/multipart.js'][119]++; - if (! options.defer) { - _$jscoverage['middleware/multipart.js'][119]++; - next(); - } - } - catch (err) { - _$jscoverage['middleware/multipart.js'][121]++; - form.emit("error", err); - } -})); - _$jscoverage['middleware/multipart.js'][125]++; - form.parse(req); - _$jscoverage['middleware/multipart.js'][127]++; - if (options.defer) { - _$jscoverage['middleware/multipart.js'][128]++; - req.form = form; - _$jscoverage['middleware/multipart.js'][129]++; - next(); - } -})); -}); -}); -_$jscoverage['middleware/multipart.js'].source = ["/*!"," * Connect - multipart"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var formidable = require('formidable')"," , _limit = require('./limit')"," , utils = require('../utils')"," , qs = require('qs');","","/**"," * noop middleware."," */","","function noop(req, res, next) {"," next();","}","","/**"," * Multipart:"," * "," * Parse multipart/form-data request bodies,"," * providing the parsed object as `req.body`"," * and `req.files`."," *"," * Configuration:"," *"," * The options passed are merged with [formidable](https://github.com/felixge/node-formidable)'s"," * `IncomingForm` object, allowing you to configure the upload directory,"," * size limits, etc. For example if you wish to change the upload dir do the following."," *"," * app.use(connect.multipart({ uploadDir: path }));"," *"," * Options:"," *"," * - `limit` byte limit defaulting to none"," * - `defer` defers processing and exposes the Formidable form object as `req.form`."," * `next()` is called without waiting for the form's \"end\" event."," * This option is useful if you need to bind to the \"progress\" event, for example."," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function(options){"," options = options || {};",""," var limit = options.limit"," ? _limit(options.limit)"," : noop;",""," return function multipart(req, res, next) {"," if (req._body) return next();"," req.body = req.body || {};"," req.files = req.files || {};",""," if (!utils.hasBody(req)) return next();",""," // ignore GET"," if ('GET' == req.method || 'HEAD' == req.method) return next();",""," // check Content-Type"," if ('multipart/form-data' != utils.mime(req)) return next();",""," // flag as parsed"," req._body = true;",""," // parse"," limit(req, res, function(err){"," if (err) return next(err);",""," var form = new formidable.IncomingForm"," , data = {}"," , files = {}"," , done;",""," Object.keys(options).forEach(function(key){"," form[key] = options[key];"," });",""," function ondata(name, val, data){"," if (Array.isArray(data[name])) {"," data[name].push(val);"," } else if (data[name]) {"," data[name] = [data[name], val];"," } else {"," data[name] = val;"," }"," }",""," form.on('field', function(name, val){"," ondata(name, val, data);"," });",""," form.on('file', function(name, val){"," ondata(name, val, files);"," });",""," form.on('error', function(err){"," if (!options.defer) {"," err.status = 400;"," next(err);"," }"," done = true;"," });",""," form.on('end', function(){"," if (done) return;"," try {"," req.body = qs.parse(data);"," req.files = qs.parse(files);"," if (!options.defer) next();"," } catch (err) {"," form.emit('error', err);"," }"," });",""," form.parse(req);",""," if (options.defer) {"," req.form = form;"," next();"," }"," });"," }","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/query.js b/node_modules/express/node_modules/connect/lib-cov/middleware/query.js deleted file mode 100644 index bd27ff6..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/query.js +++ /dev/null @@ -1,27 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/query.js']) { - _$jscoverage['middleware/query.js'] = []; - _$jscoverage['middleware/query.js'][12] = 0; - _$jscoverage['middleware/query.js'][36] = 0; - _$jscoverage['middleware/query.js'][37] = 0; - _$jscoverage['middleware/query.js'][38] = 0; - _$jscoverage['middleware/query.js'][39] = 0; - _$jscoverage['middleware/query.js'][44] = 0; -} -_$jscoverage['middleware/query.js'][12]++; -var qs = require("qs"), parse = require("../utils").parseUrl; -_$jscoverage['middleware/query.js'][36]++; -module.exports = (function query(options) { - _$jscoverage['middleware/query.js'][37]++; - return (function query(req, res, next) { - _$jscoverage['middleware/query.js'][38]++; - if (! req.query) { - _$jscoverage['middleware/query.js'][39]++; - req.query = ~ req.url.indexOf("?")? qs.parse(parse(req).query, options): {}; - } - _$jscoverage['middleware/query.js'][44]++; - next(); -}); -}); -_$jscoverage['middleware/query.js'].source = ["/*!"," * Connect - query"," * Copyright(c) 2011 TJ Holowaychuk"," * Copyright(c) 2011 Sencha Inc."," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var qs = require('qs')"," , parse = require('../utils').parseUrl;","","/**"," * Query:"," *"," * Automatically parse the query-string when available,"," * populating the `req.query` object."," *"," * Examples:"," *"," * connect()"," * .use(connect.query())"," * .use(function(req, res){"," * res.end(JSON.stringify(req.query));"," * });"," *"," * The `options` passed are provided to qs.parse function."," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","module.exports = function query(options){"," return function query(req, res, next){"," if (!req.query) {"," req.query = ~req.url.indexOf('?')"," ? qs.parse(parse(req).query, options)"," : {};"," }",""," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/responseTime.js b/node_modules/express/node_modules/connect/lib-cov/middleware/responseTime.js deleted file mode 100644 index 954e040..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/responseTime.js +++ /dev/null @@ -1,39 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/responseTime.js']) { - _$jscoverage['middleware/responseTime.js'] = []; - _$jscoverage['middleware/responseTime.js'][18] = 0; - _$jscoverage['middleware/responseTime.js'][19] = 0; - _$jscoverage['middleware/responseTime.js'][20] = 0; - _$jscoverage['middleware/responseTime.js'][22] = 0; - _$jscoverage['middleware/responseTime.js'][23] = 0; - _$jscoverage['middleware/responseTime.js'][25] = 0; - _$jscoverage['middleware/responseTime.js'][26] = 0; - _$jscoverage['middleware/responseTime.js'][27] = 0; - _$jscoverage['middleware/responseTime.js'][30] = 0; -} -_$jscoverage['middleware/responseTime.js'][18]++; -module.exports = (function responseTime() { - _$jscoverage['middleware/responseTime.js'][19]++; - return (function (req, res, next) { - _$jscoverage['middleware/responseTime.js'][20]++; - var start = new Date(); - _$jscoverage['middleware/responseTime.js'][22]++; - if (res._responseTime) { - _$jscoverage['middleware/responseTime.js'][22]++; - return next(); - } - _$jscoverage['middleware/responseTime.js'][23]++; - res._responseTime = true; - _$jscoverage['middleware/responseTime.js'][25]++; - res.on("header", (function () { - _$jscoverage['middleware/responseTime.js'][26]++; - var duration = new Date() - start; - _$jscoverage['middleware/responseTime.js'][27]++; - res.setHeader("X-Response-Time", duration + "ms"); -})); - _$jscoverage['middleware/responseTime.js'][30]++; - next(); -}); -}); -_$jscoverage['middleware/responseTime.js'].source = ["","/*!"," * Connect - responseTime"," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Reponse time:"," *"," * Adds the `X-Response-Time` header displaying the response"," * duration in milliseconds."," *"," * @return {Function}"," * @api public"," */","","module.exports = function responseTime(){"," return function(req, res, next){"," var start = new Date;",""," if (res._responseTime) return next();"," res._responseTime = true;",""," res.on('header', function(){"," var duration = new Date - start;"," res.setHeader('X-Response-Time', duration + 'ms');"," });",""," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/session.js b/node_modules/express/node_modules/connect/lib-cov/middleware/session.js deleted file mode 100644 index 5ff99f8..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/session.js +++ /dev/null @@ -1,321 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/session.js']) { - _$jscoverage['middleware/session.js'] = []; - _$jscoverage['middleware/session.js'][13] = 0; - _$jscoverage['middleware/session.js'][25] = 0; - _$jscoverage['middleware/session.js'][31] = 0; - _$jscoverage['middleware/session.js'][37] = 0; - _$jscoverage['middleware/session.js'][38] = 0; - _$jscoverage['middleware/session.js'][39] = 0; - _$jscoverage['middleware/session.js'][40] = 0; - _$jscoverage['middleware/session.js'][46] = 0; - _$jscoverage['middleware/session.js'][188] = 0; - _$jscoverage['middleware/session.js'][189] = 0; - _$jscoverage['middleware/session.js'][198] = 0; - _$jscoverage['middleware/session.js'][199] = 0; - _$jscoverage['middleware/session.js'][203] = 0; - _$jscoverage['middleware/session.js'][204] = 0; - _$jscoverage['middleware/session.js'][205] = 0; - _$jscoverage['middleware/session.js'][206] = 0; - _$jscoverage['middleware/session.js'][209] = 0; - _$jscoverage['middleware/session.js'][210] = 0; - _$jscoverage['middleware/session.js'][212] = 0; - _$jscoverage['middleware/session.js'][214] = 0; - _$jscoverage['middleware/session.js'][218] = 0; - _$jscoverage['middleware/session.js'][221] = 0; - _$jscoverage['middleware/session.js'][225] = 0; - _$jscoverage['middleware/session.js'][228] = 0; - _$jscoverage['middleware/session.js'][231] = 0; - _$jscoverage['middleware/session.js'][235] = 0; - _$jscoverage['middleware/session.js'][238] = 0; - _$jscoverage['middleware/session.js'][241] = 0; - _$jscoverage['middleware/session.js'][243] = 0; - _$jscoverage['middleware/session.js'][244] = 0; - _$jscoverage['middleware/session.js'][248] = 0; - _$jscoverage['middleware/session.js'][249] = 0; - _$jscoverage['middleware/session.js'][250] = 0; - _$jscoverage['middleware/session.js'][257] = 0; - _$jscoverage['middleware/session.js'][260] = 0; - _$jscoverage['middleware/session.js'][261] = 0; - _$jscoverage['middleware/session.js'][263] = 0; - _$jscoverage['middleware/session.js'][264] = 0; - _$jscoverage['middleware/session.js'][267] = 0; - _$jscoverage['middleware/session.js'][268] = 0; - _$jscoverage['middleware/session.js'][269] = 0; - _$jscoverage['middleware/session.js'][270] = 0; - _$jscoverage['middleware/session.js'][274] = 0; - _$jscoverage['middleware/session.js'][275] = 0; - _$jscoverage['middleware/session.js'][276] = 0; - _$jscoverage['middleware/session.js'][277] = 0; - _$jscoverage['middleware/session.js'][278] = 0; - _$jscoverage['middleware/session.js'][279] = 0; - _$jscoverage['middleware/session.js'][280] = 0; - _$jscoverage['middleware/session.js'][281] = 0; - _$jscoverage['middleware/session.js'][282] = 0; - _$jscoverage['middleware/session.js'][287] = 0; - _$jscoverage['middleware/session.js'][288] = 0; - _$jscoverage['middleware/session.js'][292] = 0; - _$jscoverage['middleware/session.js'][295] = 0; - _$jscoverage['middleware/session.js'][296] = 0; - _$jscoverage['middleware/session.js'][297] = 0; - _$jscoverage['middleware/session.js'][298] = 0; - _$jscoverage['middleware/session.js'][299] = 0; - _$jscoverage['middleware/session.js'][303] = 0; - _$jscoverage['middleware/session.js'][304] = 0; - _$jscoverage['middleware/session.js'][305] = 0; - _$jscoverage['middleware/session.js'][307] = 0; - _$jscoverage['middleware/session.js'][308] = 0; - _$jscoverage['middleware/session.js'][309] = 0; - _$jscoverage['middleware/session.js'][310] = 0; - _$jscoverage['middleware/session.js'][314] = 0; - _$jscoverage['middleware/session.js'][315] = 0; - _$jscoverage['middleware/session.js'][316] = 0; - _$jscoverage['middleware/session.js'][317] = 0; - _$jscoverage['middleware/session.js'][318] = 0; - _$jscoverage['middleware/session.js'][320] = 0; - _$jscoverage['middleware/session.js'][323] = 0; - _$jscoverage['middleware/session.js'][324] = 0; - _$jscoverage['middleware/session.js'][325] = 0; - _$jscoverage['middleware/session.js'][326] = 0; - _$jscoverage['middleware/session.js'][329] = 0; - _$jscoverage['middleware/session.js'][330] = 0; - _$jscoverage['middleware/session.js'][331] = 0; - _$jscoverage['middleware/session.js'][332] = 0; - _$jscoverage['middleware/session.js'][333] = 0; - _$jscoverage['middleware/session.js'][337] = 0; - _$jscoverage['middleware/session.js'][348] = 0; - _$jscoverage['middleware/session.js'][349] = 0; - _$jscoverage['middleware/session.js'][350] = 0; -} -_$jscoverage['middleware/session.js'][13]++; -var Session = require("./session/session"), debug = require("debug")("connect:session"), MemoryStore = require("./session/memory"), signature = require("cookie-signature"), Cookie = require("./session/cookie"), Store = require("./session/store"), utils = require("./../utils"), parse = utils.parseUrl, crc16 = require("crc").crc16; -_$jscoverage['middleware/session.js'][25]++; -var env = process.env.NODE_ENV; -_$jscoverage['middleware/session.js'][31]++; -exports = module.exports = session; -_$jscoverage['middleware/session.js'][37]++; -exports.Store = Store; -_$jscoverage['middleware/session.js'][38]++; -exports.Cookie = Cookie; -_$jscoverage['middleware/session.js'][39]++; -exports.Session = Session; -_$jscoverage['middleware/session.js'][40]++; -exports.MemoryStore = MemoryStore; -_$jscoverage['middleware/session.js'][46]++; -var warning = "Warning: connection.session() MemoryStore is not\ndesigned for a production environment, as it will leak\nmemory, and will not scale past a single process."; -_$jscoverage['middleware/session.js'][188]++; -function session(options) { - _$jscoverage['middleware/session.js'][189]++; - var options = options || {}, key = options.key || "connect.sid", store = options.store || new MemoryStore(), cookie = options.cookie || {}, trustProxy = options.proxy, storeReady = true; - _$jscoverage['middleware/session.js'][198]++; - if ("production" == env && store instanceof MemoryStore) { - _$jscoverage['middleware/session.js'][199]++; - console.warn(warning); - } - _$jscoverage['middleware/session.js'][203]++; - store.generate = (function (req) { - _$jscoverage['middleware/session.js'][204]++; - req.sessionID = utils.uid(24); - _$jscoverage['middleware/session.js'][205]++; - req.session = new Session(req); - _$jscoverage['middleware/session.js'][206]++; - req.session.cookie = new Cookie(cookie); -}); - _$jscoverage['middleware/session.js'][209]++; - store.on("disconnect", (function () { - _$jscoverage['middleware/session.js'][209]++; - storeReady = false; -})); - _$jscoverage['middleware/session.js'][210]++; - store.on("connect", (function () { - _$jscoverage['middleware/session.js'][210]++; - storeReady = true; -})); - _$jscoverage['middleware/session.js'][212]++; - return (function session(req, res, next) { - _$jscoverage['middleware/session.js'][214]++; - if (req.session) { - _$jscoverage['middleware/session.js'][214]++; - return next(); - } - _$jscoverage['middleware/session.js'][218]++; - if (! storeReady) { - _$jscoverage['middleware/session.js'][218]++; - return debug("store is disconnected"), next(); - } - _$jscoverage['middleware/session.js'][221]++; - if (0 != req.originalUrl.indexOf(cookie.path || "/")) { - _$jscoverage['middleware/session.js'][221]++; - return next(); - } - _$jscoverage['middleware/session.js'][225]++; - var secret = options.secret || req.secret; - _$jscoverage['middleware/session.js'][228]++; - if (! secret) { - _$jscoverage['middleware/session.js'][228]++; - throw new Error("`secret` option required for sessions"); - } - _$jscoverage['middleware/session.js'][231]++; - var originalHash, originalId; - _$jscoverage['middleware/session.js'][235]++; - req.sessionStore = store; - _$jscoverage['middleware/session.js'][238]++; - var rawCookie = req.cookies[key]; - _$jscoverage['middleware/session.js'][241]++; - var unsignedCookie = req.signedCookies[key]; - _$jscoverage['middleware/session.js'][243]++; - if (! unsignedCookie && rawCookie) { - _$jscoverage['middleware/session.js'][244]++; - unsignedCookie = utils.parseSignedCookie(rawCookie, secret); - } - _$jscoverage['middleware/session.js'][248]++; - res.on("header", (function () { - _$jscoverage['middleware/session.js'][249]++; - if (! req.session) { - _$jscoverage['middleware/session.js'][249]++; - return; - } - _$jscoverage['middleware/session.js'][250]++; - var cookie = req.session.cookie, proto = (req.headers["x-forwarded-proto"] || "").toLowerCase(), tls = req.connection.encrypted || (trustProxy && "https" == proto), secured = cookie.secure && tls, isNew = unsignedCookie != req.sessionID; - _$jscoverage['middleware/session.js'][257]++; - if (cookie.secure && ! secured) { - _$jscoverage['middleware/session.js'][257]++; - return debug("not secured"); - } - _$jscoverage['middleware/session.js'][260]++; - if (null == cookie.expires) { - _$jscoverage['middleware/session.js'][261]++; - if (! isNew) { - _$jscoverage['middleware/session.js'][261]++; - return debug("already set browser-session cookie"); - } - } - else { - _$jscoverage['middleware/session.js'][263]++; - if (originalHash == hash(req.session) && originalId == req.session.id) { - _$jscoverage['middleware/session.js'][264]++; - return debug("unmodified session"); - } - } - _$jscoverage['middleware/session.js'][267]++; - var val = "s:" + signature.sign(req.sessionID, secret); - _$jscoverage['middleware/session.js'][268]++; - val = cookie.serialize(key, val); - _$jscoverage['middleware/session.js'][269]++; - debug("set-cookie %s", val); - _$jscoverage['middleware/session.js'][270]++; - res.setHeader("Set-Cookie", val); -})); - _$jscoverage['middleware/session.js'][274]++; - var end = res.end; - _$jscoverage['middleware/session.js'][275]++; - res.end = (function (data, encoding) { - _$jscoverage['middleware/session.js'][276]++; - res.end = end; - _$jscoverage['middleware/session.js'][277]++; - if (! req.session) { - _$jscoverage['middleware/session.js'][277]++; - return res.end(data, encoding); - } - _$jscoverage['middleware/session.js'][278]++; - debug("saving"); - _$jscoverage['middleware/session.js'][279]++; - req.session.resetMaxAge(); - _$jscoverage['middleware/session.js'][280]++; - req.session.save((function () { - _$jscoverage['middleware/session.js'][281]++; - debug("saved"); - _$jscoverage['middleware/session.js'][282]++; - res.end(data, encoding); -})); -}); - _$jscoverage['middleware/session.js'][287]++; - function generate() { - _$jscoverage['middleware/session.js'][288]++; - store.generate(req); -} - _$jscoverage['middleware/session.js'][292]++; - req.sessionID = unsignedCookie; - _$jscoverage['middleware/session.js'][295]++; - if (! req.sessionID) { - _$jscoverage['middleware/session.js'][296]++; - debug("no SID sent, generating session"); - _$jscoverage['middleware/session.js'][297]++; - generate(); - _$jscoverage['middleware/session.js'][298]++; - next(); - _$jscoverage['middleware/session.js'][299]++; - return; - } - _$jscoverage['middleware/session.js'][303]++; - var pause = utils.pause(req); - _$jscoverage['middleware/session.js'][304]++; - debug("fetching %s", req.sessionID); - _$jscoverage['middleware/session.js'][305]++; - store.get(req.sessionID, (function (err, sess) { - _$jscoverage['middleware/session.js'][307]++; - var _next = next; - _$jscoverage['middleware/session.js'][308]++; - next = (function (err) { - _$jscoverage['middleware/session.js'][309]++; - _next(err); - _$jscoverage['middleware/session.js'][310]++; - pause.resume(); -}); - _$jscoverage['middleware/session.js'][314]++; - if (err) { - _$jscoverage['middleware/session.js'][315]++; - debug("error"); - _$jscoverage['middleware/session.js'][316]++; - if ("ENOENT" == err.code) { - _$jscoverage['middleware/session.js'][317]++; - generate(); - _$jscoverage['middleware/session.js'][318]++; - next(); - } - else { - _$jscoverage['middleware/session.js'][320]++; - next(err); - } - } - else { - _$jscoverage['middleware/session.js'][323]++; - if (! sess) { - _$jscoverage['middleware/session.js'][324]++; - debug("no session found"); - _$jscoverage['middleware/session.js'][325]++; - generate(); - _$jscoverage['middleware/session.js'][326]++; - next(); - } - else { - _$jscoverage['middleware/session.js'][329]++; - debug("session found"); - _$jscoverage['middleware/session.js'][330]++; - store.createSession(req, sess); - _$jscoverage['middleware/session.js'][331]++; - originalId = req.sessionID; - _$jscoverage['middleware/session.js'][332]++; - originalHash = hash(sess); - _$jscoverage['middleware/session.js'][333]++; - next(); - } - } -})); -}); -} -_$jscoverage['middleware/session.js'][337]++; -; -_$jscoverage['middleware/session.js'][348]++; -function hash(sess) { - _$jscoverage['middleware/session.js'][349]++; - return crc16(JSON.stringify(sess, (function (key, val) { - _$jscoverage['middleware/session.js'][350]++; - if ("cookie" != key) { - _$jscoverage['middleware/session.js'][350]++; - return val; - } -}))); -} -_$jscoverage['middleware/session.js'].source = ["","/*!"," * Connect - session"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var Session = require('./session/session')"," , debug = require('debug')('connect:session')"," , MemoryStore = require('./session/memory')"," , signature = require('cookie-signature')"," , Cookie = require('./session/cookie')"," , Store = require('./session/store')"," , utils = require('./../utils')"," , parse = utils.parseUrl"," , crc16 = require('crc').crc16;","","// environment","","var env = process.env.NODE_ENV;","","/**"," * Expose the middleware."," */","","exports = module.exports = session;","","/**"," * Expose constructors."," */","","exports.Store = Store;","exports.Cookie = Cookie;","exports.Session = Session;","exports.MemoryStore = MemoryStore;","","/**"," * Warning message for `MemoryStore` usage in production."," */","","var warning = 'Warning: connection.session() MemoryStore is not\\n'"," + 'designed for a production environment, as it will leak\\n'"," + 'memory, and will not scale past a single process.';","","/**"," * Session:"," * "," * Setup session store with the given `options`."," *"," * Session data is _not_ saved in the cookie itself, however"," * cookies are used, so we must use the [cookieParser()](cookieParser.html)"," * middleware _before_ `session()`."," *"," * Examples:"," *"," * connect()"," * .use(connect.cookieParser())"," * .use(connect.session({ secret: 'keyboard cat', key: 'sid', cookie: { secure: true }}))"," *"," * Options:"," *"," * - `key` cookie name defaulting to `connect.sid`"," * - `store` session store instance"," * - `secret` session cookie is signed with this secret to prevent tampering"," * - `cookie` session cookie settings, defaulting to `{ path: '/', httpOnly: true, maxAge: null }`"," * - `proxy` trust the reverse proxy when setting secure cookies (via \"x-forwarded-proto\")"," *"," * Cookie option:"," *"," * By default `cookie.maxAge` is `null`, meaning no \"expires\" parameter is set"," * so the cookie becomes a browser-session cookie. When the user closes the "," * browser the cookie (and session) will be removed."," *"," * ## req.session"," *"," * To store or access session data, simply use the request property `req.session`,"," * which is (generally) serialized as JSON by the store, so nested objects "," * are typically fine. For example below is a user-specific view counter:"," *"," * connect()"," * .use(connect.favicon())"," * .use(connect.cookieParser())"," * .use(connect.session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }}))"," * .use(function(req, res, next){"," * var sess = req.session;"," * if (sess.views) {"," * res.setHeader('Content-Type', 'text/html');"," * res.write('<p>views: ' + sess.views + '</p>');"," * res.write('<p>expires in: ' + (sess.cookie.maxAge / 1000) + 's</p>');"," * res.end();"," * sess.views++;"," * } else {"," * sess.views = 1;"," * res.end('welcome to the session demo. refresh!');"," * }"," * }"," * )).listen(3000);"," *"," * ## Session#regenerate()"," *"," * To regenerate the session simply invoke the method, once complete"," * a new SID and `Session` instance will be initialized at `req.session`."," *"," * req.session.regenerate(function(err){"," * // will have a new session here"," * });"," *"," * ## Session#destroy()"," *"," * Destroys the session, removing `req.session`, will be re-generated next request."," *"," * req.session.destroy(function(err){"," * // cannot access session here"," * });"," * "," * ## Session#reload()"," *"," * Reloads the session data."," *"," * req.session.reload(function(err){"," * // session updated"," * });"," *"," * ## Session#save()"," *"," * Save the session."," *"," * req.session.save(function(err){"," * // session saved"," * });"," *"," * ## Session#touch()"," *"," * Updates the `.maxAge` property. Typically this is"," * not necessary to call, as the session middleware does this for you."," *"," * ## Session#cookie"," *"," * Each session has a unique cookie object accompany it. This allows"," * you to alter the session cookie per visitor. For example we can"," * set `req.session.cookie.expires` to `false` to enable the cookie"," * to remain for only the duration of the user-agent."," *"," * ## Session#maxAge"," *"," * Alternatively `req.session.cookie.maxAge` will return the time"," * remaining in milliseconds, which we may also re-assign a new value"," * to adjust the `.expires` property appropriately. The following"," * are essentially equivalent"," *"," * var hour = 3600000;"," * req.session.cookie.expires = new Date(Date.now() + hour);"," * req.session.cookie.maxAge = hour;"," *"," * For example when `maxAge` is set to `60000` (one minute), and 30 seconds"," * has elapsed it will return `30000` until the current request has completed,"," * at which time `req.session.touch()` is called to reset `req.session.maxAge`"," * to its original value."," *"," * req.session.cookie.maxAge;"," * // => 30000"," *"," * Session Store Implementation:"," *"," * Every session store _must_ implement the following methods"," *"," * - `.get(sid, callback)`"," * - `.set(sid, session, callback)`"," * - `.destroy(sid, callback)`"," *"," * Recommended methods include, but are not limited to:"," *"," * - `.length(callback)`"," * - `.clear(callback)`"," *"," * For an example implementation view the [connect-redis](http://github.com/visionmedia/connect-redis) repo."," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","function session(options){"," var options = options || {}"," , key = options.key || 'connect.sid'"," , store = options.store || new MemoryStore"," , cookie = options.cookie || {}"," , trustProxy = options.proxy"," , storeReady = true;",""," // notify user that this store is not"," // meant for a production environment"," if ('production' == env && store instanceof MemoryStore) {"," console.warn(warning);"," }",""," // generates the new session"," store.generate = function(req){"," req.sessionID = utils.uid(24);"," req.session = new Session(req);"," req.session.cookie = new Cookie(cookie);"," };",""," store.on('disconnect', function(){ storeReady = false; });"," store.on('connect', function(){ storeReady = true; });",""," return function session(req, res, next) {"," // self-awareness"," if (req.session) return next();",""," // Handle connection as if there is no session if"," // the store has temporarily disconnected etc"," if (!storeReady) return debug('store is disconnected'), next();",""," // pathname mismatch"," if (0 != req.originalUrl.indexOf(cookie.path || '/')) return next();",""," // backwards compatibility for signed cookies"," // req.secret is passed from the cookie parser middleware"," var secret = options.secret || req.secret;",""," // ensure secret is available or bail"," if (!secret) throw new Error('`secret` option required for sessions');",""," // parse url"," var originalHash"," , originalId;",""," // expose store"," req.sessionStore = store;",""," // grab the session cookie value and check the signature"," var rawCookie = req.cookies[key];",""," // get signedCookies for backwards compat with signed cookies"," var unsignedCookie = req.signedCookies[key];",""," if (!unsignedCookie && rawCookie) {"," unsignedCookie = utils.parseSignedCookie(rawCookie, secret);"," }",""," // set-cookie"," res.on('header', function(){"," if (!req.session) return;"," var cookie = req.session.cookie"," , proto = (req.headers['x-forwarded-proto'] || '').toLowerCase()"," , tls = req.connection.encrypted || (trustProxy && 'https' == proto)"," , secured = cookie.secure && tls"," , isNew = unsignedCookie != req.sessionID;",""," // only send secure cookies via https"," if (cookie.secure && !secured) return debug('not secured');",""," // browser-session length cookie"," if (null == cookie.expires) {"," if (!isNew) return debug('already set browser-session cookie');"," // compare hashes and ids"," } else if (originalHash == hash(req.session) && originalId == req.session.id) {"," return debug('unmodified session');"," }",""," var val = 's:' + signature.sign(req.sessionID, secret);"," val = cookie.serialize(key, val);"," debug('set-cookie %s', val);"," res.setHeader('Set-Cookie', val);"," });",""," // proxy end() to commit the session"," var end = res.end;"," res.end = function(data, encoding){"," res.end = end;"," if (!req.session) return res.end(data, encoding);"," debug('saving');"," req.session.resetMaxAge();"," req.session.save(function(){"," debug('saved');"," res.end(data, encoding);"," });"," };",""," // generate the session"," function generate() {"," store.generate(req);"," }",""," // get the sessionID from the cookie"," req.sessionID = unsignedCookie;",""," // generate a session if the browser doesn't send a sessionID"," if (!req.sessionID) {"," debug('no SID sent, generating session');"," generate();"," next();"," return;"," }",""," // generate the session object"," var pause = utils.pause(req);"," debug('fetching %s', req.sessionID);"," store.get(req.sessionID, function(err, sess){"," // proxy to resume() events"," var _next = next;"," next = function(err){"," _next(err);"," pause.resume();"," };",""," // error handling"," if (err) {"," debug('error');"," if ('ENOENT' == err.code) {"," generate();"," next();"," } else {"," next(err);"," }"," // no session"," } else if (!sess) {"," debug('no session found');"," generate();"," next();"," // populate req.session"," } else {"," debug('session found');"," store.createSession(req, sess);"," originalId = req.sessionID;"," originalHash = hash(sess);"," next();"," }"," });"," };","};","","/**"," * Hash the given `sess` object omitting changes"," * to `.cookie`."," *"," * @param {Object} sess"," * @return {String}"," * @api private"," */","","function hash(sess) {"," return crc16(JSON.stringify(sess, function(key, val){"," if ('cookie' != key) return val;"," }));","}"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/session/cookie.js b/node_modules/express/node_modules/connect/lib-cov/middleware/session/cookie.js deleted file mode 100644 index 279afe5..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/session/cookie.js +++ /dev/null @@ -1,65 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/session/cookie.js']) { - _$jscoverage['middleware/session/cookie.js'] = []; - _$jscoverage['middleware/session/cookie.js'][13] = 0; - _$jscoverage['middleware/session/cookie.js'][24] = 0; - _$jscoverage['middleware/session/cookie.js'][25] = 0; - _$jscoverage['middleware/session/cookie.js'][26] = 0; - _$jscoverage['middleware/session/cookie.js'][27] = 0; - _$jscoverage['middleware/session/cookie.js'][28] = 0; - _$jscoverage['middleware/session/cookie.js'][29] = 0; - _$jscoverage['middleware/session/cookie.js'][38] = 0; - _$jscoverage['middleware/session/cookie.js'][48] = 0; - _$jscoverage['middleware/session/cookie.js'][49] = 0; - _$jscoverage['middleware/session/cookie.js'][60] = 0; - _$jscoverage['middleware/session/cookie.js'][71] = 0; - _$jscoverage['middleware/session/cookie.js'][84] = 0; - _$jscoverage['middleware/session/cookie.js'][97] = 0; - _$jscoverage['middleware/session/cookie.js'][115] = 0; - _$jscoverage['middleware/session/cookie.js'][126] = 0; -} -_$jscoverage['middleware/session/cookie.js'][13]++; -var utils = require("../../utils"), cookie = require("cookie"); -_$jscoverage['middleware/session/cookie.js'][24]++; -var Cookie = module.exports = (function Cookie(options) { - _$jscoverage['middleware/session/cookie.js'][25]++; - this.path = "/"; - _$jscoverage['middleware/session/cookie.js'][26]++; - this.maxAge = null; - _$jscoverage['middleware/session/cookie.js'][27]++; - this.httpOnly = true; - _$jscoverage['middleware/session/cookie.js'][28]++; - if (options) { - _$jscoverage['middleware/session/cookie.js'][28]++; - utils.merge(this, options); - } - _$jscoverage['middleware/session/cookie.js'][29]++; - this.originalMaxAge = undefined == this.originalMaxAge? this.maxAge: this.originalMaxAge; -}); -_$jscoverage['middleware/session/cookie.js'][38]++; -Cookie.prototype = {set expires (date) { - _$jscoverage['middleware/session/cookie.js'][48]++; - this._expires = date; - _$jscoverage['middleware/session/cookie.js'][49]++; - this.originalMaxAge = this.maxAge; -}, get expires () { - _$jscoverage['middleware/session/cookie.js'][60]++; - return this._expires; -}, set maxAge (ms) { - _$jscoverage['middleware/session/cookie.js'][71]++; - this.expires = "number" == typeof ms? new Date(Date.now() + ms): ms; -}, get maxAge () { - _$jscoverage['middleware/session/cookie.js'][84]++; - return this.expires instanceof Date? this.expires.valueOf() - Date.now(): this.expires; -}, get data () { - _$jscoverage['middleware/session/cookie.js'][97]++; - return ({originalMaxAge: this.originalMaxAge, expires: this._expires, secure: this.secure, httpOnly: this.httpOnly, domain: this.domain, path: this.path}); -}, serialize: (function (name, val) { - _$jscoverage['middleware/session/cookie.js'][115]++; - return cookie.serialize(name, val, this.data); -}), toJSON: (function () { - _$jscoverage['middleware/session/cookie.js'][126]++; - return this.data; -})}; -_$jscoverage['middleware/session/cookie.js'].source = ["","/*!"," * Connect - session - Cookie"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../../utils')"," , cookie = require('cookie');","","/**"," * Initialize a new `Cookie` with the given `options`."," *"," * @param {IncomingMessage} req"," * @param {Object} options"," * @api private"," */","","var Cookie = module.exports = function Cookie(options) {"," this.path = '/';"," this.maxAge = null;"," this.httpOnly = true;"," if (options) utils.merge(this, options);"," this.originalMaxAge = undefined == this.originalMaxAge"," ? this.maxAge"," : this.originalMaxAge;","};","","/*!"," * Prototype."," */","","Cookie.prototype = {",""," /**"," * Set expires `date`."," *"," * @param {Date} date"," * @api public"," */"," "," set expires(date) {"," this._expires = date;"," this.originalMaxAge = this.maxAge;"," },",""," /**"," * Get expires `date`."," *"," * @return {Date}"," * @api public"," */",""," get expires() {"," return this._expires;"," },"," "," /**"," * Set expires via max-age in `ms`."," *"," * @param {Number} ms"," * @api public"," */"," "," set maxAge(ms) {"," this.expires = 'number' == typeof ms"," ? new Date(Date.now() + ms)"," : ms;"," },",""," /**"," * Get expires max-age in `ms`."," *"," * @return {Number}"," * @api public"," */",""," get maxAge() {"," return this.expires instanceof Date"," ? this.expires.valueOf() - Date.now()"," : this.expires;"," },",""," /**"," * Return cookie data object."," *"," * @return {Object}"," * @api private"," */",""," get data() {"," return {"," originalMaxAge: this.originalMaxAge"," , expires: this._expires"," , secure: this.secure"," , httpOnly: this.httpOnly"," , domain: this.domain"," , path: this.path"," }"," },",""," /**"," * Return a serialized cookie string."," *"," * @return {String}"," * @api public"," */",""," serialize: function(name, val){"," return cookie.serialize(name, val, this.data);"," },",""," /**"," * Return JSON representation of this cookie."," *"," * @return {Object}"," * @api private"," */"," "," toJSON: function(){"," return this.data;"," }","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/session/memory.js b/node_modules/express/node_modules/connect/lib-cov/middleware/session/memory.js deleted file mode 100644 index f140187..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/session/memory.js +++ /dev/null @@ -1,128 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/session/memory.js']) { - _$jscoverage['middleware/session/memory.js'] = []; - _$jscoverage['middleware/session/memory.js'][13] = 0; - _$jscoverage['middleware/session/memory.js'][21] = 0; - _$jscoverage['middleware/session/memory.js'][22] = 0; - _$jscoverage['middleware/session/memory.js'][29] = 0; - _$jscoverage['middleware/session/memory.js'][39] = 0; - _$jscoverage['middleware/session/memory.js'][40] = 0; - _$jscoverage['middleware/session/memory.js'][41] = 0; - _$jscoverage['middleware/session/memory.js'][42] = 0; - _$jscoverage['middleware/session/memory.js'][44] = 0; - _$jscoverage['middleware/session/memory.js'][45] = 0; - _$jscoverage['middleware/session/memory.js'][46] = 0; - _$jscoverage['middleware/session/memory.js'][49] = 0; - _$jscoverage['middleware/session/memory.js'][50] = 0; - _$jscoverage['middleware/session/memory.js'][52] = 0; - _$jscoverage['middleware/session/memory.js'][55] = 0; - _$jscoverage['middleware/session/memory.js'][69] = 0; - _$jscoverage['middleware/session/memory.js'][70] = 0; - _$jscoverage['middleware/session/memory.js'][71] = 0; - _$jscoverage['middleware/session/memory.js'][72] = 0; - _$jscoverage['middleware/session/memory.js'][73] = 0; - _$jscoverage['middleware/session/memory.js'][84] = 0; - _$jscoverage['middleware/session/memory.js'][85] = 0; - _$jscoverage['middleware/session/memory.js'][86] = 0; - _$jscoverage['middleware/session/memory.js'][87] = 0; - _$jscoverage['middleware/session/memory.js'][88] = 0; - _$jscoverage['middleware/session/memory.js'][99] = 0; - _$jscoverage['middleware/session/memory.js'][100] = 0; - _$jscoverage['middleware/session/memory.js'][102] = 0; - _$jscoverage['middleware/session/memory.js'][103] = 0; - _$jscoverage['middleware/session/memory.js'][105] = 0; - _$jscoverage['middleware/session/memory.js'][115] = 0; - _$jscoverage['middleware/session/memory.js'][116] = 0; - _$jscoverage['middleware/session/memory.js'][117] = 0; - _$jscoverage['middleware/session/memory.js'][127] = 0; - _$jscoverage['middleware/session/memory.js'][128] = 0; -} -_$jscoverage['middleware/session/memory.js'][13]++; -var Store = require("./store"); -_$jscoverage['middleware/session/memory.js'][21]++; -var MemoryStore = module.exports = (function MemoryStore() { - _$jscoverage['middleware/session/memory.js'][22]++; - this.sessions = {}; -}); -_$jscoverage['middleware/session/memory.js'][29]++; -MemoryStore.prototype.__proto__ = Store.prototype; -_$jscoverage['middleware/session/memory.js'][39]++; -MemoryStore.prototype.get = (function (sid, fn) { - _$jscoverage['middleware/session/memory.js'][40]++; - var self = this; - _$jscoverage['middleware/session/memory.js'][41]++; - process.nextTick((function () { - _$jscoverage['middleware/session/memory.js'][42]++; - var expires, sess = self.sessions[sid]; - _$jscoverage['middleware/session/memory.js'][44]++; - if (sess) { - _$jscoverage['middleware/session/memory.js'][45]++; - sess = JSON.parse(sess); - _$jscoverage['middleware/session/memory.js'][46]++; - expires = "string" == typeof sess.cookie.expires? new Date(sess.cookie.expires): sess.cookie.expires; - _$jscoverage['middleware/session/memory.js'][49]++; - if (! expires || new Date() < expires) { - _$jscoverage['middleware/session/memory.js'][50]++; - fn(null, sess); - } - else { - _$jscoverage['middleware/session/memory.js'][52]++; - self.destroy(sid, fn); - } - } - else { - _$jscoverage['middleware/session/memory.js'][55]++; - fn(); - } -})); -}); -_$jscoverage['middleware/session/memory.js'][69]++; -MemoryStore.prototype.set = (function (sid, sess, fn) { - _$jscoverage['middleware/session/memory.js'][70]++; - var self = this; - _$jscoverage['middleware/session/memory.js'][71]++; - process.nextTick((function () { - _$jscoverage['middleware/session/memory.js'][72]++; - self.sessions[sid] = JSON.stringify(sess); - _$jscoverage['middleware/session/memory.js'][73]++; - fn && fn(); -})); -}); -_$jscoverage['middleware/session/memory.js'][84]++; -MemoryStore.prototype.destroy = (function (sid, fn) { - _$jscoverage['middleware/session/memory.js'][85]++; - var self = this; - _$jscoverage['middleware/session/memory.js'][86]++; - process.nextTick((function () { - _$jscoverage['middleware/session/memory.js'][87]++; - delete self.sessions[sid]; - _$jscoverage['middleware/session/memory.js'][88]++; - fn && fn(); -})); -}); -_$jscoverage['middleware/session/memory.js'][99]++; -MemoryStore.prototype.all = (function (fn) { - _$jscoverage['middleware/session/memory.js'][100]++; - var arr = [], keys = Object.keys(this.sessions); - _$jscoverage['middleware/session/memory.js'][102]++; - for (var i = 0, len = keys.length; i < len; ++i) { - _$jscoverage['middleware/session/memory.js'][103]++; - arr.push(this.sessions[keys[i]]); -} - _$jscoverage['middleware/session/memory.js'][105]++; - fn(null, arr); -}); -_$jscoverage['middleware/session/memory.js'][115]++; -MemoryStore.prototype.clear = (function (fn) { - _$jscoverage['middleware/session/memory.js'][116]++; - this.sessions = {}; - _$jscoverage['middleware/session/memory.js'][117]++; - fn && fn(); -}); -_$jscoverage['middleware/session/memory.js'][127]++; -MemoryStore.prototype.length = (function (fn) { - _$jscoverage['middleware/session/memory.js'][128]++; - fn(null, Object.keys(this.sessions).length); -}); -_$jscoverage['middleware/session/memory.js'].source = ["","/*!"," * Connect - session - MemoryStore"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var Store = require('./store');","","/**"," * Initialize a new `MemoryStore`."," *"," * @api public"," */","","var MemoryStore = module.exports = function MemoryStore() {"," this.sessions = {};","};","","/**"," * Inherit from `Store.prototype`."," */","","MemoryStore.prototype.__proto__ = Store.prototype;","","/**"," * Attempt to fetch session by the given `sid`."," *"," * @param {String} sid"," * @param {Function} fn"," * @api public"," */","","MemoryStore.prototype.get = function(sid, fn){"," var self = this;"," process.nextTick(function(){"," var expires"," , sess = self.sessions[sid];"," if (sess) {"," sess = JSON.parse(sess);"," expires = 'string' == typeof sess.cookie.expires"," ? new Date(sess.cookie.expires)"," : sess.cookie.expires;"," if (!expires || new Date < expires) {"," fn(null, sess);"," } else {"," self.destroy(sid, fn);"," }"," } else {"," fn();"," }"," });","};","","/**"," * Commit the given `sess` object associated with the given `sid`."," *"," * @param {String} sid"," * @param {Session} sess"," * @param {Function} fn"," * @api public"," */","","MemoryStore.prototype.set = function(sid, sess, fn){"," var self = this;"," process.nextTick(function(){"," self.sessions[sid] = JSON.stringify(sess);"," fn && fn();"," });","};","","/**"," * Destroy the session associated with the given `sid`."," *"," * @param {String} sid"," * @api public"," */","","MemoryStore.prototype.destroy = function(sid, fn){"," var self = this;"," process.nextTick(function(){"," delete self.sessions[sid];"," fn && fn();"," });","};","","/**"," * Invoke the given callback `fn` with all active sessions."," *"," * @param {Function} fn"," * @api public"," */","","MemoryStore.prototype.all = function(fn){"," var arr = []"," , keys = Object.keys(this.sessions);"," for (var i = 0, len = keys.length; i < len; ++i) {"," arr.push(this.sessions[keys[i]]);"," }"," fn(null, arr);","};","","/**"," * Clear all sessions."," *"," * @param {Function} fn"," * @api public"," */","","MemoryStore.prototype.clear = function(fn){"," this.sessions = {};"," fn && fn();","};","","/**"," * Fetch number of sessions."," *"," * @param {Function} fn"," * @api public"," */","","MemoryStore.prototype.length = function(fn){"," fn(null, Object.keys(this.sessions).length);","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/session/session.js b/node_modules/express/node_modules/connect/lib-cov/middleware/session/session.js deleted file mode 100644 index 73e85e0..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/session/session.js +++ /dev/null @@ -1,108 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/session/session.js']) { - _$jscoverage['middleware/session/session.js'] = []; - _$jscoverage['middleware/session/session.js'][13] = 0; - _$jscoverage['middleware/session/session.js'][23] = 0; - _$jscoverage['middleware/session/session.js'][24] = 0; - _$jscoverage['middleware/session/session.js'][25] = 0; - _$jscoverage['middleware/session/session.js'][26] = 0; - _$jscoverage['middleware/session/session.js'][38] = 0; - _$jscoverage['middleware/session/session.js'][39] = 0; - _$jscoverage['middleware/session/session.js'][49] = 0; - _$jscoverage['middleware/session/session.js'][50] = 0; - _$jscoverage['middleware/session/session.js'][51] = 0; - _$jscoverage['middleware/session/session.js'][62] = 0; - _$jscoverage['middleware/session/session.js'][63] = 0; - _$jscoverage['middleware/session/session.js'][64] = 0; - _$jscoverage['middleware/session/session.js'][79] = 0; - _$jscoverage['middleware/session/session.js'][80] = 0; - _$jscoverage['middleware/session/session.js'][82] = 0; - _$jscoverage['middleware/session/session.js'][83] = 0; - _$jscoverage['middleware/session/session.js'][84] = 0; - _$jscoverage['middleware/session/session.js'][85] = 0; - _$jscoverage['middleware/session/session.js'][86] = 0; - _$jscoverage['middleware/session/session.js'][88] = 0; - _$jscoverage['middleware/session/session.js'][99] = 0; - _$jscoverage['middleware/session/session.js'][100] = 0; - _$jscoverage['middleware/session/session.js'][101] = 0; - _$jscoverage['middleware/session/session.js'][102] = 0; - _$jscoverage['middleware/session/session.js'][113] = 0; - _$jscoverage['middleware/session/session.js'][114] = 0; - _$jscoverage['middleware/session/session.js'][115] = 0; -} -_$jscoverage['middleware/session/session.js'][13]++; -var utils = require("../../utils"); -_$jscoverage['middleware/session/session.js'][23]++; -var Session = module.exports = (function Session(req, data) { - _$jscoverage['middleware/session/session.js'][24]++; - Object.defineProperty(this, "req", {value: req}); - _$jscoverage['middleware/session/session.js'][25]++; - Object.defineProperty(this, "id", {value: req.sessionID}); - _$jscoverage['middleware/session/session.js'][26]++; - if ("object" == typeof data) { - _$jscoverage['middleware/session/session.js'][26]++; - utils.merge(this, data); - } -}); -_$jscoverage['middleware/session/session.js'][38]++; -Session.prototype.touch = (function () { - _$jscoverage['middleware/session/session.js'][39]++; - return this.resetMaxAge(); -}); -_$jscoverage['middleware/session/session.js'][49]++; -Session.prototype.resetMaxAge = (function () { - _$jscoverage['middleware/session/session.js'][50]++; - this.cookie.maxAge = this.cookie.originalMaxAge; - _$jscoverage['middleware/session/session.js'][51]++; - return this; -}); -_$jscoverage['middleware/session/session.js'][62]++; -Session.prototype.save = (function (fn) { - _$jscoverage['middleware/session/session.js'][63]++; - this.req.sessionStore.set(this.id, this, fn || (function () { -})); - _$jscoverage['middleware/session/session.js'][64]++; - return this; -}); -_$jscoverage['middleware/session/session.js'][79]++; -Session.prototype.reload = (function (fn) { - _$jscoverage['middleware/session/session.js'][80]++; - var req = this.req, store = this.req.sessionStore; - _$jscoverage['middleware/session/session.js'][82]++; - store.get(this.id, (function (err, sess) { - _$jscoverage['middleware/session/session.js'][83]++; - if (err) { - _$jscoverage['middleware/session/session.js'][83]++; - return fn(err); - } - _$jscoverage['middleware/session/session.js'][84]++; - if (! sess) { - _$jscoverage['middleware/session/session.js'][84]++; - return fn(new Error("failed to load session")); - } - _$jscoverage['middleware/session/session.js'][85]++; - store.createSession(req, sess); - _$jscoverage['middleware/session/session.js'][86]++; - fn(); -})); - _$jscoverage['middleware/session/session.js'][88]++; - return this; -}); -_$jscoverage['middleware/session/session.js'][99]++; -Session.prototype.destroy = (function (fn) { - _$jscoverage['middleware/session/session.js'][100]++; - delete this.req.session; - _$jscoverage['middleware/session/session.js'][101]++; - this.req.sessionStore.destroy(this.id, fn); - _$jscoverage['middleware/session/session.js'][102]++; - return this; -}); -_$jscoverage['middleware/session/session.js'][113]++; -Session.prototype.regenerate = (function (fn) { - _$jscoverage['middleware/session/session.js'][114]++; - this.req.sessionStore.regenerate(this.req, fn); - _$jscoverage['middleware/session/session.js'][115]++; - return this; -}); -_$jscoverage['middleware/session/session.js'].source = ["","/*!"," * Connect - session - Session"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../../utils');","","/**"," * Create a new `Session` with the given request and `data`."," *"," * @param {IncomingRequest} req"," * @param {Object} data"," * @api private"," */","","var Session = module.exports = function Session(req, data) {"," Object.defineProperty(this, 'req', { value: req });"," Object.defineProperty(this, 'id', { value: req.sessionID });"," if ('object' == typeof data) utils.merge(this, data);","};","","/**"," * Update reset `.cookie.maxAge` to prevent"," * the cookie from expiring when the"," * session is still active."," *"," * @return {Session} for chaining"," * @api public"," */","","Session.prototype.touch = function(){"," return this.resetMaxAge();","};","","/**"," * Reset `.maxAge` to `.originalMaxAge`."," *"," * @return {Session} for chaining"," * @api public"," */","","Session.prototype.resetMaxAge = function(){"," this.cookie.maxAge = this.cookie.originalMaxAge;"," return this;","};","","/**"," * Save the session data with optional callback `fn(err)`."," *"," * @param {Function} fn"," * @return {Session} for chaining"," * @api public"," */","","Session.prototype.save = function(fn){"," this.req.sessionStore.set(this.id, this, fn || function(){});"," return this;","};","","/**"," * Re-loads the session data _without_ altering"," * the maxAge properties. Invokes the callback `fn(err)`,"," * after which time if no exception has occurred the"," * `req.session` property will be a new `Session` object,"," * although representing the same session."," *"," * @param {Function} fn"," * @return {Session} for chaining"," * @api public"," */","","Session.prototype.reload = function(fn){"," var req = this.req"," , store = this.req.sessionStore;"," store.get(this.id, function(err, sess){"," if (err) return fn(err);"," if (!sess) return fn(new Error('failed to load session'));"," store.createSession(req, sess);"," fn();"," });"," return this;","};","","/**"," * Destroy `this` session."," *"," * @param {Function} fn"," * @return {Session} for chaining"," * @api public"," */","","Session.prototype.destroy = function(fn){"," delete this.req.session;"," this.req.sessionStore.destroy(this.id, fn);"," return this;","};","","/**"," * Regenerate this request's session."," *"," * @param {Function} fn"," * @return {Session} for chaining"," * @api public"," */","","Session.prototype.regenerate = function(fn){"," this.req.sessionStore.regenerate(this.req, fn);"," return this;","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/session/store.js b/node_modules/express/node_modules/connect/lib-cov/middleware/session/store.js deleted file mode 100644 index 2d79aa2..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/session/store.js +++ /dev/null @@ -1,90 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/session/store.js']) { - _$jscoverage['middleware/session/store.js'] = []; - _$jscoverage['middleware/session/store.js'][13] = 0; - _$jscoverage['middleware/session/store.js'][23] = 0; - _$jscoverage['middleware/session/store.js'][29] = 0; - _$jscoverage['middleware/session/store.js'][39] = 0; - _$jscoverage['middleware/session/store.js'][40] = 0; - _$jscoverage['middleware/session/store.js'][41] = 0; - _$jscoverage['middleware/session/store.js'][42] = 0; - _$jscoverage['middleware/session/store.js'][43] = 0; - _$jscoverage['middleware/session/store.js'][56] = 0; - _$jscoverage['middleware/session/store.js'][57] = 0; - _$jscoverage['middleware/session/store.js'][58] = 0; - _$jscoverage['middleware/session/store.js'][59] = 0; - _$jscoverage['middleware/session/store.js'][60] = 0; - _$jscoverage['middleware/session/store.js'][61] = 0; - _$jscoverage['middleware/session/store.js'][62] = 0; - _$jscoverage['middleware/session/store.js'][63] = 0; - _$jscoverage['middleware/session/store.js'][76] = 0; - _$jscoverage['middleware/session/store.js'][77] = 0; - _$jscoverage['middleware/session/store.js'][79] = 0; - _$jscoverage['middleware/session/store.js'][80] = 0; - _$jscoverage['middleware/session/store.js'][81] = 0; - _$jscoverage['middleware/session/store.js'][82] = 0; - _$jscoverage['middleware/session/store.js'][83] = 0; -} -_$jscoverage['middleware/session/store.js'][13]++; -var EventEmitter = require("events").EventEmitter, Session = require("./session"), Cookie = require("./cookie"); -_$jscoverage['middleware/session/store.js'][23]++; -var Store = module.exports = (function Store(options) { -}); -_$jscoverage['middleware/session/store.js'][29]++; -Store.prototype.__proto__ = EventEmitter.prototype; -_$jscoverage['middleware/session/store.js'][39]++; -Store.prototype.regenerate = (function (req, fn) { - _$jscoverage['middleware/session/store.js'][40]++; - var self = this; - _$jscoverage['middleware/session/store.js'][41]++; - this.destroy(req.sessionID, (function (err) { - _$jscoverage['middleware/session/store.js'][42]++; - self.generate(req); - _$jscoverage['middleware/session/store.js'][43]++; - fn(err); -})); -}); -_$jscoverage['middleware/session/store.js'][56]++; -Store.prototype.load = (function (sid, fn) { - _$jscoverage['middleware/session/store.js'][57]++; - var self = this; - _$jscoverage['middleware/session/store.js'][58]++; - this.get(sid, (function (err, sess) { - _$jscoverage['middleware/session/store.js'][59]++; - if (err) { - _$jscoverage['middleware/session/store.js'][59]++; - return fn(err); - } - _$jscoverage['middleware/session/store.js'][60]++; - if (! sess) { - _$jscoverage['middleware/session/store.js'][60]++; - return fn(); - } - _$jscoverage['middleware/session/store.js'][61]++; - var req = {sessionID: sid, sessionStore: self}; - _$jscoverage['middleware/session/store.js'][62]++; - sess = self.createSession(req, sess); - _$jscoverage['middleware/session/store.js'][63]++; - fn(null, sess); -})); -}); -_$jscoverage['middleware/session/store.js'][76]++; -Store.prototype.createSession = (function (req, sess) { - _$jscoverage['middleware/session/store.js'][77]++; - var expires = sess.cookie.expires, orig = sess.cookie.originalMaxAge; - _$jscoverage['middleware/session/store.js'][79]++; - sess.cookie = new Cookie(sess.cookie); - _$jscoverage['middleware/session/store.js'][80]++; - if ("string" == typeof expires) { - _$jscoverage['middleware/session/store.js'][80]++; - sess.cookie.expires = new Date(expires); - } - _$jscoverage['middleware/session/store.js'][81]++; - sess.cookie.originalMaxAge = orig; - _$jscoverage['middleware/session/store.js'][82]++; - req.session = new Session(req, sess); - _$jscoverage['middleware/session/store.js'][83]++; - return req.session; -}); -_$jscoverage['middleware/session/store.js'].source = ["","/*!"," * Connect - session - Store"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var EventEmitter = require('events').EventEmitter"," , Session = require('./session')"," , Cookie = require('./cookie');","","/**"," * Initialize abstract `Store`."," *"," * @api private"," */","","var Store = module.exports = function Store(options){};","","/**"," * Inherit from `EventEmitter.prototype`."," */","","Store.prototype.__proto__ = EventEmitter.prototype;","","/**"," * Re-generate the given requests's session."," *"," * @param {IncomingRequest} req"," * @return {Function} fn"," * @api public"," */","","Store.prototype.regenerate = function(req, fn){"," var self = this;"," this.destroy(req.sessionID, function(err){"," self.generate(req);"," fn(err);"," });","};","","/**"," * Load a `Session` instance via the given `sid`"," * and invoke the callback `fn(err, sess)`."," *"," * @param {String} sid"," * @param {Function} fn"," * @api public"," */","","Store.prototype.load = function(sid, fn){"," var self = this;"," this.get(sid, function(err, sess){"," if (err) return fn(err);"," if (!sess) return fn();"," var req = { sessionID: sid, sessionStore: self };"," sess = self.createSession(req, sess);"," fn(null, sess);"," });","};","","/**"," * Create session from JSON `sess` data."," *"," * @param {IncomingRequest} req"," * @param {Object} sess"," * @return {Session}"," * @api private"," */","","Store.prototype.createSession = function(req, sess){"," var expires = sess.cookie.expires"," , orig = sess.cookie.originalMaxAge;"," sess.cookie = new Cookie(sess.cookie);"," if ('string' == typeof expires) sess.cookie.expires = new Date(expires);"," sess.cookie.originalMaxAge = orig;"," req.session = new Session(req, sess);"," return req.session;","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/static.js b/node_modules/express/node_modules/connect/lib-cov/middleware/static.js deleted file mode 100644 index c52b1c0..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/static.js +++ /dev/null @@ -1,92 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/static.js']) { - _$jscoverage['middleware/static.js'] = []; - _$jscoverage['middleware/static.js'][13] = 0; - _$jscoverage['middleware/static.js'][45] = 0; - _$jscoverage['middleware/static.js'][46] = 0; - _$jscoverage['middleware/static.js'][49] = 0; - _$jscoverage['middleware/static.js'][52] = 0; - _$jscoverage['middleware/static.js'][54] = 0; - _$jscoverage['middleware/static.js'][55] = 0; - _$jscoverage['middleware/static.js'][56] = 0; - _$jscoverage['middleware/static.js'][57] = 0; - _$jscoverage['middleware/static.js'][59] = 0; - _$jscoverage['middleware/static.js'][60] = 0; - _$jscoverage['middleware/static.js'][61] = 0; - _$jscoverage['middleware/static.js'][64] = 0; - _$jscoverage['middleware/static.js'][65] = 0; - _$jscoverage['middleware/static.js'][66] = 0; - _$jscoverage['middleware/static.js'][67] = 0; - _$jscoverage['middleware/static.js'][68] = 0; - _$jscoverage['middleware/static.js'][69] = 0; - _$jscoverage['middleware/static.js'][72] = 0; - _$jscoverage['middleware/static.js'][73] = 0; - _$jscoverage['middleware/static.js'][74] = 0; - _$jscoverage['middleware/static.js'][77] = 0; - _$jscoverage['middleware/static.js'][94] = 0; -} -_$jscoverage['middleware/static.js'][13]++; -var send = require("send"), utils = require("../utils"), parse = utils.parseUrl, url = require("url"); -_$jscoverage['middleware/static.js'][45]++; -exports = module.exports = (function static(root, options) { - _$jscoverage['middleware/static.js'][46]++; - options = options || {}; - _$jscoverage['middleware/static.js'][49]++; - if (! root) { - _$jscoverage['middleware/static.js'][49]++; - throw new Error("static() root path required"); - } - _$jscoverage['middleware/static.js'][52]++; - var redirect = false !== options.redirect; - _$jscoverage['middleware/static.js'][54]++; - return (function static(req, res, next) { - _$jscoverage['middleware/static.js'][55]++; - if ("GET" != req.method && "HEAD" != req.method) { - _$jscoverage['middleware/static.js'][55]++; - return next(); - } - _$jscoverage['middleware/static.js'][56]++; - var path = parse(req).pathname; - _$jscoverage['middleware/static.js'][57]++; - var pause = utils.pause(req); - _$jscoverage['middleware/static.js'][59]++; - function resume() { - _$jscoverage['middleware/static.js'][60]++; - next(); - _$jscoverage['middleware/static.js'][61]++; - pause.resume(); -} - _$jscoverage['middleware/static.js'][64]++; - function directory() { - _$jscoverage['middleware/static.js'][65]++; - if (! redirect) { - _$jscoverage['middleware/static.js'][65]++; - return resume(); - } - _$jscoverage['middleware/static.js'][66]++; - var pathname = url.parse(req.originalUrl).pathname; - _$jscoverage['middleware/static.js'][67]++; - res.statusCode = 301; - _$jscoverage['middleware/static.js'][68]++; - res.setHeader("Location", pathname + "/"); - _$jscoverage['middleware/static.js'][69]++; - res.end("Redirecting to " + utils.escape(pathname) + "/"); -} - _$jscoverage['middleware/static.js'][72]++; - function error(err) { - _$jscoverage['middleware/static.js'][73]++; - if (404 == err.status) { - _$jscoverage['middleware/static.js'][73]++; - return resume(); - } - _$jscoverage['middleware/static.js'][74]++; - next(err); -} - _$jscoverage['middleware/static.js'][77]++; - send(req, path).maxage(options.maxAge || 0).root(root).hidden(options.hidden).on("error", error).on("directory", directory).pipe(res); -}); -}); -_$jscoverage['middleware/static.js'][94]++; -exports.mime = send.mime; -_$jscoverage['middleware/static.js'].source = ["","/*!"," * Connect - static"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var send = require('send')"," , utils = require('../utils')"," , parse = utils.parseUrl"," , url = require('url');","","/**"," * Static:"," *"," * Static file server with the given `root` path."," *"," * Examples:"," *"," * var oneDay = 86400000;"," *"," * connect()"," * .use(connect.static(__dirname + '/public'))"," *"," * connect()"," * .use(connect.static(__dirname + '/public', { maxAge: oneDay }))"," *"," * Options:"," *"," * - `maxAge` Browser cache maxAge in milliseconds. defaults to 0"," * - `hidden` Allow transfer of hidden files. defaults to false"," * - `redirect` Redirect to trailing \"/\" when the pathname is a dir. defaults to true"," *"," * @param {String} root"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function static(root, options){"," options = options || {};",""," // root required"," if (!root) throw new Error('static() root path required');",""," // default redirect"," var redirect = false !== options.redirect;",""," return function static(req, res, next) {"," if ('GET' != req.method && 'HEAD' != req.method) return next();"," var path = parse(req).pathname;"," var pause = utils.pause(req);",""," function resume() {"," next();"," pause.resume();"," }",""," function directory() {"," if (!redirect) return resume();"," var pathname = url.parse(req.originalUrl).pathname;"," res.statusCode = 301;"," res.setHeader('Location', pathname + '/');"," res.end('Redirecting to ' + utils.escape(pathname) + '/');"," }",""," function error(err) {"," if (404 == err.status) return resume();"," next(err);"," }",""," send(req, path)"," .maxage(options.maxAge || 0)"," .root(root)"," .hidden(options.hidden)"," .on('error', error)"," .on('directory', directory)"," .pipe(res);"," };","};","","/**"," * Expose mime module."," * "," * If you wish to extend the mime table use this"," * reference to the \"mime\" module in the npm registry."," */","","exports.mime = send.mime;"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/staticCache.js b/node_modules/express/node_modules/connect/lib-cov/middleware/staticCache.js deleted file mode 100644 index e8c2940..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/staticCache.js +++ /dev/null @@ -1,276 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/staticCache.js']) { - _$jscoverage['middleware/staticCache.js'] = []; - _$jscoverage['middleware/staticCache.js'][12] = 0; - _$jscoverage['middleware/staticCache.js'][51] = 0; - _$jscoverage['middleware/staticCache.js'][52] = 0; - _$jscoverage['middleware/staticCache.js'][56] = 0; - _$jscoverage['middleware/staticCache.js'][57] = 0; - _$jscoverage['middleware/staticCache.js'][59] = 0; - _$jscoverage['middleware/staticCache.js'][60] = 0; - _$jscoverage['middleware/staticCache.js'][68] = 0; - _$jscoverage['middleware/staticCache.js'][69] = 0; - _$jscoverage['middleware/staticCache.js'][75] = 0; - _$jscoverage['middleware/staticCache.js'][78] = 0; - _$jscoverage['middleware/staticCache.js'][81] = 0; - _$jscoverage['middleware/staticCache.js'][84] = 0; - _$jscoverage['middleware/staticCache.js'][88] = 0; - _$jscoverage['middleware/staticCache.js'][91] = 0; - _$jscoverage['middleware/staticCache.js'][94] = 0; - _$jscoverage['middleware/staticCache.js'][95] = 0; - _$jscoverage['middleware/staticCache.js'][96] = 0; - _$jscoverage['middleware/staticCache.js'][97] = 0; - _$jscoverage['middleware/staticCache.js'][99] = 0; - _$jscoverage['middleware/staticCache.js'][104] = 0; - _$jscoverage['middleware/staticCache.js'][107] = 0; - _$jscoverage['middleware/staticCache.js'][110] = 0; - _$jscoverage['middleware/staticCache.js'][111] = 0; - _$jscoverage['middleware/staticCache.js'][115] = 0; - _$jscoverage['middleware/staticCache.js'][116] = 0; - _$jscoverage['middleware/staticCache.js'][117] = 0; - _$jscoverage['middleware/staticCache.js'][118] = 0; - _$jscoverage['middleware/staticCache.js'][119] = 0; - _$jscoverage['middleware/staticCache.js'][120] = 0; - _$jscoverage['middleware/staticCache.js'][124] = 0; - _$jscoverage['middleware/staticCache.js'][125] = 0; - _$jscoverage['middleware/staticCache.js'][126] = 0; - _$jscoverage['middleware/staticCache.js'][127] = 0; - _$jscoverage['middleware/staticCache.js'][128] = 0; - _$jscoverage['middleware/staticCache.js'][129] = 0; - _$jscoverage['middleware/staticCache.js'][131] = 0; - _$jscoverage['middleware/staticCache.js'][132] = 0; - _$jscoverage['middleware/staticCache.js'][135] = 0; - _$jscoverage['middleware/staticCache.js'][151] = 0; - _$jscoverage['middleware/staticCache.js'][152] = 0; - _$jscoverage['middleware/staticCache.js'][156] = 0; - _$jscoverage['middleware/staticCache.js'][158] = 0; - _$jscoverage['middleware/staticCache.js'][160] = 0; - _$jscoverage['middleware/staticCache.js'][161] = 0; - _$jscoverage['middleware/staticCache.js'][162] = 0; - _$jscoverage['middleware/staticCache.js'][164] = 0; - _$jscoverage['middleware/staticCache.js'][165] = 0; - _$jscoverage['middleware/staticCache.js'][166] = 0; - _$jscoverage['middleware/staticCache.js'][167] = 0; - _$jscoverage['middleware/staticCache.js'][169] = 0; - _$jscoverage['middleware/staticCache.js'][171] = 0; - _$jscoverage['middleware/staticCache.js'][172] = 0; - _$jscoverage['middleware/staticCache.js'][173] = 0; - _$jscoverage['middleware/staticCache.js'][174] = 0; - _$jscoverage['middleware/staticCache.js'][175] = 0; - _$jscoverage['middleware/staticCache.js'][178] = 0; - _$jscoverage['middleware/staticCache.js'][181] = 0; - _$jscoverage['middleware/staticCache.js'][183] = 0; - _$jscoverage['middleware/staticCache.js'][186] = 0; - _$jscoverage['middleware/staticCache.js'][187] = 0; - _$jscoverage['middleware/staticCache.js'][200] = 0; - _$jscoverage['middleware/staticCache.js'][201] = 0; - _$jscoverage['middleware/staticCache.js'][206] = 0; - _$jscoverage['middleware/staticCache.js'][208] = 0; - _$jscoverage['middleware/staticCache.js'][210] = 0; - _$jscoverage['middleware/staticCache.js'][212] = 0; - _$jscoverage['middleware/staticCache.js'][214] = 0; - _$jscoverage['middleware/staticCache.js'][216] = 0; - _$jscoverage['middleware/staticCache.js'][229] = 0; - _$jscoverage['middleware/staticCache.js'][230] = 0; -} -_$jscoverage['middleware/staticCache.js'][12]++; -var utils = require("../utils"), Cache = require("../cache"), fresh = require("fresh"); -_$jscoverage['middleware/staticCache.js'][51]++; -module.exports = (function staticCache(options) { - _$jscoverage['middleware/staticCache.js'][52]++; - var options = options || {}, cache = new Cache(options.maxObjects || 128), maxlen = options.maxLength || 262144; - _$jscoverage['middleware/staticCache.js'][56]++; - console.warn("connect.staticCache() is deprecated and will be removed in 3.0"); - _$jscoverage['middleware/staticCache.js'][57]++; - console.warn("use varnish or similar reverse proxy caches."); - _$jscoverage['middleware/staticCache.js'][59]++; - return (function staticCache(req, res, next) { - _$jscoverage['middleware/staticCache.js'][60]++; - var key = cacheKey(req), ranges = req.headers.range, hasCookies = req.headers.cookie, hit = cache.get(key); - _$jscoverage['middleware/staticCache.js'][68]++; - req.on("static", (function (stream) { - _$jscoverage['middleware/staticCache.js'][69]++; - var headers = res._headers, cc = utils.parseCacheControl(headers["cache-control"] || ""), contentLength = headers["content-length"], hit; - _$jscoverage['middleware/staticCache.js'][75]++; - if (headers["set-cookie"]) { - _$jscoverage['middleware/staticCache.js'][75]++; - return hasCookies = true; - } - _$jscoverage['middleware/staticCache.js'][78]++; - if (hasCookies) { - _$jscoverage['middleware/staticCache.js'][78]++; - return; - } - _$jscoverage['middleware/staticCache.js'][81]++; - if (! contentLength || contentLength > maxlen) { - _$jscoverage['middleware/staticCache.js'][81]++; - return; - } - _$jscoverage['middleware/staticCache.js'][84]++; - if (headers["content-range"]) { - _$jscoverage['middleware/staticCache.js'][84]++; - return; - } - _$jscoverage['middleware/staticCache.js'][88]++; - if (cc["no-cache"] || cc["no-store"] || cc["private"] || cc["must-revalidate"]) { - _$jscoverage['middleware/staticCache.js'][91]++; - return; - } - _$jscoverage['middleware/staticCache.js'][94]++; - if (hit = cache.get(key)) { - _$jscoverage['middleware/staticCache.js'][95]++; - if (headers.etag == hit[0].etag) { - _$jscoverage['middleware/staticCache.js'][96]++; - hit[0].date = new Date(); - _$jscoverage['middleware/staticCache.js'][97]++; - return; - } - else { - _$jscoverage['middleware/staticCache.js'][99]++; - cache.remove(key); - } - } - _$jscoverage['middleware/staticCache.js'][104]++; - if (null == stream) { - _$jscoverage['middleware/staticCache.js'][104]++; - return; - } - _$jscoverage['middleware/staticCache.js'][107]++; - var arr = []; - _$jscoverage['middleware/staticCache.js'][110]++; - stream.on("data", (function (chunk) { - _$jscoverage['middleware/staticCache.js'][111]++; - arr.push(chunk); -})); - _$jscoverage['middleware/staticCache.js'][115]++; - stream.on("end", (function () { - _$jscoverage['middleware/staticCache.js'][116]++; - var cacheEntry = cache.add(key); - _$jscoverage['middleware/staticCache.js'][117]++; - delete headers["x-cache"]; - _$jscoverage['middleware/staticCache.js'][118]++; - cacheEntry.push(200); - _$jscoverage['middleware/staticCache.js'][119]++; - cacheEntry.push(headers); - _$jscoverage['middleware/staticCache.js'][120]++; - cacheEntry.push.apply(cacheEntry, arr); -})); -})); - _$jscoverage['middleware/staticCache.js'][124]++; - if (req.method == "GET" || req.method == "HEAD") { - _$jscoverage['middleware/staticCache.js'][125]++; - if (ranges) { - _$jscoverage['middleware/staticCache.js'][126]++; - next(); - } - else { - _$jscoverage['middleware/staticCache.js'][127]++; - if (! hasCookies && hit && ! mustRevalidate(req, hit)) { - _$jscoverage['middleware/staticCache.js'][128]++; - res.setHeader("X-Cache", "HIT"); - _$jscoverage['middleware/staticCache.js'][129]++; - respondFromCache(req, res, hit); - } - else { - _$jscoverage['middleware/staticCache.js'][131]++; - res.setHeader("X-Cache", "MISS"); - _$jscoverage['middleware/staticCache.js'][132]++; - next(); - } - } - } - else { - _$jscoverage['middleware/staticCache.js'][135]++; - next(); - } -}); -}); -_$jscoverage['middleware/staticCache.js'][151]++; -function respondFromCache(req, res, cacheEntry) { - _$jscoverage['middleware/staticCache.js'][152]++; - var status = cacheEntry[0], headers = utils.merge({}, cacheEntry[1]), content = cacheEntry.slice(2); - _$jscoverage['middleware/staticCache.js'][156]++; - headers.age = (new Date() - new Date(headers.date)) / 1000 || 0; - _$jscoverage['middleware/staticCache.js'][158]++; - switch (req.method) { - case "HEAD": - _$jscoverage['middleware/staticCache.js'][160]++; - res.writeHead(status, headers); - _$jscoverage['middleware/staticCache.js'][161]++; - res.end(); - _$jscoverage['middleware/staticCache.js'][162]++; - break; - case "GET": - _$jscoverage['middleware/staticCache.js'][164]++; - if (utils.conditionalGET(req) && fresh(req.headers, headers)) { - _$jscoverage['middleware/staticCache.js'][165]++; - headers["content-length"] = 0; - _$jscoverage['middleware/staticCache.js'][166]++; - res.writeHead(304, headers); - _$jscoverage['middleware/staticCache.js'][167]++; - res.end(); - } - else { - _$jscoverage['middleware/staticCache.js'][169]++; - res.writeHead(status, headers); - _$jscoverage['middleware/staticCache.js'][171]++; - function write() { - _$jscoverage['middleware/staticCache.js'][172]++; - while (content.length) { - _$jscoverage['middleware/staticCache.js'][173]++; - if (false === res.write(content.shift())) { - _$jscoverage['middleware/staticCache.js'][174]++; - res.once("drain", write); - _$jscoverage['middleware/staticCache.js'][175]++; - return; - } -} - _$jscoverage['middleware/staticCache.js'][178]++; - res.end(); -} - _$jscoverage['middleware/staticCache.js'][181]++; - write(); - } - _$jscoverage['middleware/staticCache.js'][183]++; - break; - default: - _$jscoverage['middleware/staticCache.js'][186]++; - res.writeHead(500, ""); - _$jscoverage['middleware/staticCache.js'][187]++; - res.end(); - } -} -_$jscoverage['middleware/staticCache.js'][200]++; -function mustRevalidate(req, cacheEntry) { - _$jscoverage['middleware/staticCache.js'][201]++; - var cacheHeaders = cacheEntry[1], reqCC = utils.parseCacheControl(req.headers["cache-control"] || ""), cacheCC = utils.parseCacheControl(cacheHeaders["cache-control"] || ""), cacheAge = (new Date() - new Date(cacheHeaders.date)) / 1000 || 0; - _$jscoverage['middleware/staticCache.js'][206]++; - if (cacheCC["no-cache"] || cacheCC["must-revalidate"] || cacheCC["proxy-revalidate"]) { - _$jscoverage['middleware/staticCache.js'][208]++; - return true; - } - _$jscoverage['middleware/staticCache.js'][210]++; - if (reqCC["no-cache"]) { - _$jscoverage['middleware/staticCache.js'][210]++; - return true; - } - _$jscoverage['middleware/staticCache.js'][212]++; - if (null != reqCC["max-age"]) { - _$jscoverage['middleware/staticCache.js'][212]++; - return reqCC["max-age"] < cacheAge; - } - _$jscoverage['middleware/staticCache.js'][214]++; - if (null != cacheCC["max-age"]) { - _$jscoverage['middleware/staticCache.js'][214]++; - return cacheCC["max-age"] < cacheAge; - } - _$jscoverage['middleware/staticCache.js'][216]++; - return false; -} -_$jscoverage['middleware/staticCache.js'][229]++; -function cacheKey(req) { - _$jscoverage['middleware/staticCache.js'][230]++; - return utils.parseUrl(req).path; -} -_$jscoverage['middleware/staticCache.js'].source = ["","/*!"," * Connect - staticCache"," * Copyright(c) 2011 Sencha Inc."," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils')"," , Cache = require('../cache')"," , fresh = require('fresh');","","/**"," * Static cache:"," *"," * Enables a memory cache layer on top of"," * the `static()` middleware, serving popular"," * static files."," *"," * By default a maximum of 128 objects are"," * held in cache, with a max of 256k each,"," * totalling ~32mb."," *"," * A Least-Recently-Used (LRU) cache algo"," * is implemented through the `Cache` object,"," * simply rotating cache objects as they are"," * hit. This means that increasingly popular"," * objects maintain their positions while"," * others get shoved out of the stack and"," * garbage collected."," *"," * Benchmarks:"," *"," * static(): 2700 rps"," * node-static: 5300 rps"," * static() + staticCache(): 7500 rps"," *"," * Options:"," *"," * - `maxObjects` max cache objects [128]"," * - `maxLength` max cache object length 256kb"," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","module.exports = function staticCache(options){"," var options = options || {}"," , cache = new Cache(options.maxObjects || 128)"," , maxlen = options.maxLength || 1024 * 256;",""," console.warn('connect.staticCache() is deprecated and will be removed in 3.0');"," console.warn('use varnish or similar reverse proxy caches.');",""," return function staticCache(req, res, next){"," var key = cacheKey(req)"," , ranges = req.headers.range"," , hasCookies = req.headers.cookie"," , hit = cache.get(key);",""," // cache static"," // TODO: change from staticCache() -> cache()"," // and make this work for any request"," req.on('static', function(stream){"," var headers = res._headers"," , cc = utils.parseCacheControl(headers['cache-control'] || '')"," , contentLength = headers['content-length']"," , hit;",""," // dont cache set-cookie responses"," if (headers['set-cookie']) return hasCookies = true;",""," // dont cache when cookies are present"," if (hasCookies) return;",""," // ignore larger files"," if (!contentLength || contentLength > maxlen) return;",""," // don't cache partial files"," if (headers['content-range']) return;",""," // dont cache items we shouldn't be"," // TODO: real support for must-revalidate / no-cache"," if ( cc['no-cache']"," || cc['no-store']"," || cc['private']"," || cc['must-revalidate']) return;",""," // if already in cache then validate"," if (hit = cache.get(key)){"," if (headers.etag == hit[0].etag) {"," hit[0].date = new Date;"," return;"," } else {"," cache.remove(key);"," }"," }",""," // validation notifiactions don't contain a steam"," if (null == stream) return;",""," // add the cache object"," var arr = [];",""," // store the chunks"," stream.on('data', function(chunk){"," arr.push(chunk);"," });",""," // flag it as complete"," stream.on('end', function(){"," var cacheEntry = cache.add(key);"," delete headers['x-cache']; // Clean up (TODO: others)"," cacheEntry.push(200);"," cacheEntry.push(headers);"," cacheEntry.push.apply(cacheEntry, arr);"," });"," });",""," if (req.method == 'GET' || req.method == 'HEAD') {"," if (ranges) {"," next();"," } else if (!hasCookies && hit && !mustRevalidate(req, hit)) {"," res.setHeader('X-Cache', 'HIT');"," respondFromCache(req, res, hit);"," } else {"," res.setHeader('X-Cache', 'MISS');"," next();"," }"," } else {"," next();"," }"," }","};","","/**"," * Respond with the provided cached value."," * TODO: Assume 200 code, that's iffy."," *"," * @param {Object} req"," * @param {Object} res"," * @param {Object} cacheEntry"," * @return {String}"," * @api private"," */","","function respondFromCache(req, res, cacheEntry) {"," var status = cacheEntry[0]"," , headers = utils.merge({}, cacheEntry[1])"," , content = cacheEntry.slice(2);",""," headers.age = (new Date - new Date(headers.date)) / 1000 || 0;",""," switch (req.method) {"," case 'HEAD':"," res.writeHead(status, headers);"," res.end();"," break;"," case 'GET':"," if (utils.conditionalGET(req) && fresh(req.headers, headers)) {"," headers['content-length'] = 0;"," res.writeHead(304, headers);"," res.end();"," } else {"," res.writeHead(status, headers);",""," function write() {"," while (content.length) {"," if (false === res.write(content.shift())) {"," res.once('drain', write);"," return;"," }"," }"," res.end();"," }",""," write();"," }"," break;"," default:"," // This should never happen."," res.writeHead(500, '');"," res.end();"," }","}","","/**"," * Determine whether or not a cached value must be revalidated."," *"," * @param {Object} req"," * @param {Object} cacheEntry"," * @return {String}"," * @api private"," */","","function mustRevalidate(req, cacheEntry) {"," var cacheHeaders = cacheEntry[1]"," , reqCC = utils.parseCacheControl(req.headers['cache-control'] || '')"," , cacheCC = utils.parseCacheControl(cacheHeaders['cache-control'] || '')"," , cacheAge = (new Date - new Date(cacheHeaders.date)) / 1000 || 0;",""," if ( cacheCC['no-cache']"," || cacheCC['must-revalidate']"," || cacheCC['proxy-revalidate']) return true;",""," if (reqCC['no-cache']) return true;",""," if (null != reqCC['max-age']) return reqCC['max-age'] < cacheAge;",""," if (null != cacheCC['max-age']) return cacheCC['max-age'] < cacheAge;",""," return false;","}","","/**"," * The key to use in the cache. For now, this is the URL path and query."," *"," * 'http://example.com?key=value' -> '/?key=value'"," *"," * @param {Object} req"," * @return {String}"," * @api private"," */","","function cacheKey(req) {"," return utils.parseUrl(req).path;","}"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/timeout.js b/node_modules/express/node_modules/connect/lib-cov/middleware/timeout.js deleted file mode 100644 index de0e573..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/timeout.js +++ /dev/null @@ -1,66 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/timeout.js']) { - _$jscoverage['middleware/timeout.js'] = []; - _$jscoverage['middleware/timeout.js'][12] = 0; - _$jscoverage['middleware/timeout.js'][30] = 0; - _$jscoverage['middleware/timeout.js'][31] = 0; - _$jscoverage['middleware/timeout.js'][33] = 0; - _$jscoverage['middleware/timeout.js'][34] = 0; - _$jscoverage['middleware/timeout.js'][35] = 0; - _$jscoverage['middleware/timeout.js'][38] = 0; - _$jscoverage['middleware/timeout.js'][39] = 0; - _$jscoverage['middleware/timeout.js'][40] = 0; - _$jscoverage['middleware/timeout.js'][41] = 0; - _$jscoverage['middleware/timeout.js'][42] = 0; - _$jscoverage['middleware/timeout.js'][43] = 0; - _$jscoverage['middleware/timeout.js'][46] = 0; - _$jscoverage['middleware/timeout.js'][47] = 0; - _$jscoverage['middleware/timeout.js'][50] = 0; - _$jscoverage['middleware/timeout.js'][51] = 0; - _$jscoverage['middleware/timeout.js'][54] = 0; -} -_$jscoverage['middleware/timeout.js'][12]++; -var debug = require("debug")("connect:timeout"); -_$jscoverage['middleware/timeout.js'][30]++; -module.exports = (function timeout(ms) { - _$jscoverage['middleware/timeout.js'][31]++; - ms = ms || 5000; - _$jscoverage['middleware/timeout.js'][33]++; - return (function (req, res, next) { - _$jscoverage['middleware/timeout.js'][34]++; - var id = setTimeout((function () { - _$jscoverage['middleware/timeout.js'][35]++; - req.emit("timeout", ms); -}), ms); - _$jscoverage['middleware/timeout.js'][38]++; - req.on("timeout", (function () { - _$jscoverage['middleware/timeout.js'][39]++; - if (req.headerSent) { - _$jscoverage['middleware/timeout.js'][39]++; - return debug("response started, cannot timeout"); - } - _$jscoverage['middleware/timeout.js'][40]++; - var err = new Error("Request timeout"); - _$jscoverage['middleware/timeout.js'][41]++; - err.timeout = ms; - _$jscoverage['middleware/timeout.js'][42]++; - err.status = 408; - _$jscoverage['middleware/timeout.js'][43]++; - next(err); -})); - _$jscoverage['middleware/timeout.js'][46]++; - req.clearTimeout = (function () { - _$jscoverage['middleware/timeout.js'][47]++; - clearTimeout(id); -}); - _$jscoverage['middleware/timeout.js'][50]++; - res.on("header", (function () { - _$jscoverage['middleware/timeout.js'][51]++; - clearTimeout(id); -})); - _$jscoverage['middleware/timeout.js'][54]++; - next(); -}); -}); -_$jscoverage['middleware/timeout.js'].source = ["","/*!"," * Connect - timeout"," * Ported from https://github.com/LearnBoost/connect-timeout"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var debug = require('debug')('connect:timeout');","","/**"," * Timeout:"," *"," * Times out the request in `ms`, defaulting to `5000`. The"," * method `req.clearTimeout()` is added to revert this behaviour"," * programmatically within your application's middleware, routes, etc."," *"," * The timeout error is passed to `next()` so that you may customize"," * the response behaviour. This error has the `.timeout` property as"," * well as `.status == 408`."," *"," * @param {Number} ms"," * @return {Function}"," * @api public"," */","","module.exports = function timeout(ms) {"," ms = ms || 5000;",""," return function(req, res, next) {"," var id = setTimeout(function(){"," req.emit('timeout', ms);"," }, ms);",""," req.on('timeout', function(){"," if (req.headerSent) return debug('response started, cannot timeout');"," var err = new Error('Request timeout');"," err.timeout = ms;"," err.status = 408;"," next(err);"," });",""," req.clearTimeout = function(){"," clearTimeout(id);"," };",""," res.on('header', function(){"," clearTimeout(id);"," });",""," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/urlencoded.js b/node_modules/express/node_modules/connect/lib-cov/middleware/urlencoded.js deleted file mode 100644 index c8dbcef..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/urlencoded.js +++ /dev/null @@ -1,98 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/urlencoded.js']) { - _$jscoverage['middleware/urlencoded.js'] = []; - _$jscoverage['middleware/urlencoded.js'][13] = 0; - _$jscoverage['middleware/urlencoded.js'][21] = 0; - _$jscoverage['middleware/urlencoded.js'][22] = 0; - _$jscoverage['middleware/urlencoded.js'][40] = 0; - _$jscoverage['middleware/urlencoded.js'][41] = 0; - _$jscoverage['middleware/urlencoded.js'][43] = 0; - _$jscoverage['middleware/urlencoded.js'][47] = 0; - _$jscoverage['middleware/urlencoded.js'][48] = 0; - _$jscoverage['middleware/urlencoded.js'][49] = 0; - _$jscoverage['middleware/urlencoded.js'][51] = 0; - _$jscoverage['middleware/urlencoded.js'][54] = 0; - _$jscoverage['middleware/urlencoded.js'][57] = 0; - _$jscoverage['middleware/urlencoded.js'][60] = 0; - _$jscoverage['middleware/urlencoded.js'][61] = 0; - _$jscoverage['middleware/urlencoded.js'][62] = 0; - _$jscoverage['middleware/urlencoded.js'][63] = 0; - _$jscoverage['middleware/urlencoded.js'][64] = 0; - _$jscoverage['middleware/urlencoded.js'][65] = 0; - _$jscoverage['middleware/urlencoded.js'][66] = 0; - _$jscoverage['middleware/urlencoded.js'][67] = 0; - _$jscoverage['middleware/urlencoded.js'][70] = 0; - _$jscoverage['middleware/urlencoded.js'][72] = 0; - _$jscoverage['middleware/urlencoded.js'][73] = 0; -} -_$jscoverage['middleware/urlencoded.js'][13]++; -var utils = require("../utils"), _limit = require("./limit"), qs = require("qs"); -_$jscoverage['middleware/urlencoded.js'][21]++; -function noop(req, res, next) { - _$jscoverage['middleware/urlencoded.js'][22]++; - next(); -} -_$jscoverage['middleware/urlencoded.js'][40]++; -exports = module.exports = (function (options) { - _$jscoverage['middleware/urlencoded.js'][41]++; - options = options || {}; - _$jscoverage['middleware/urlencoded.js'][43]++; - var limit = options.limit? _limit(options.limit): noop; - _$jscoverage['middleware/urlencoded.js'][47]++; - return (function urlencoded(req, res, next) { - _$jscoverage['middleware/urlencoded.js'][48]++; - if (req._body) { - _$jscoverage['middleware/urlencoded.js'][48]++; - return next(); - } - _$jscoverage['middleware/urlencoded.js'][49]++; - req.body = req.body || {}; - _$jscoverage['middleware/urlencoded.js'][51]++; - if (! utils.hasBody(req)) { - _$jscoverage['middleware/urlencoded.js'][51]++; - return next(); - } - _$jscoverage['middleware/urlencoded.js'][54]++; - if ("application/x-www-form-urlencoded" != utils.mime(req)) { - _$jscoverage['middleware/urlencoded.js'][54]++; - return next(); - } - _$jscoverage['middleware/urlencoded.js'][57]++; - req._body = true; - _$jscoverage['middleware/urlencoded.js'][60]++; - limit(req, res, (function (err) { - _$jscoverage['middleware/urlencoded.js'][61]++; - if (err) { - _$jscoverage['middleware/urlencoded.js'][61]++; - return next(err); - } - _$jscoverage['middleware/urlencoded.js'][62]++; - var buf = ""; - _$jscoverage['middleware/urlencoded.js'][63]++; - req.setEncoding("utf8"); - _$jscoverage['middleware/urlencoded.js'][64]++; - req.on("data", (function (chunk) { - _$jscoverage['middleware/urlencoded.js'][64]++; - buf += chunk; -})); - _$jscoverage['middleware/urlencoded.js'][65]++; - req.on("end", (function () { - _$jscoverage['middleware/urlencoded.js'][66]++; - try { - _$jscoverage['middleware/urlencoded.js'][67]++; - req.body = buf.length? qs.parse(buf, options): {}; - _$jscoverage['middleware/urlencoded.js'][70]++; - next(); - } - catch (err) { - _$jscoverage['middleware/urlencoded.js'][72]++; - err.body = buf; - _$jscoverage['middleware/urlencoded.js'][73]++; - next(err); - } -})); -})); -}); -}); -_$jscoverage['middleware/urlencoded.js'].source = ["","/*!"," * Connect - urlencoded"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils')"," , _limit = require('./limit')"," , qs = require('qs');","","/**"," * noop middleware."," */","","function noop(req, res, next) {"," next();","}","","/**"," * Urlencoded:"," * "," * Parse x-ww-form-urlencoded request bodies,"," * providing the parsed object as `req.body`."," *"," * Options:"," *"," * - `limit` byte limit disabled by default"," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function(options){"," options = options || {};",""," var limit = options.limit"," ? _limit(options.limit)"," : noop;",""," return function urlencoded(req, res, next) {"," if (req._body) return next();"," req.body = req.body || {};",""," if (!utils.hasBody(req)) return next();",""," // check Content-Type"," if ('application/x-www-form-urlencoded' != utils.mime(req)) return next();",""," // flag as parsed"," req._body = true;",""," // parse"," limit(req, res, function(err){"," if (err) return next(err);"," var buf = '';"," req.setEncoding('utf8');"," req.on('data', function(chunk){ buf += chunk });"," req.on('end', function(){"," try {"," req.body = buf.length"," ? qs.parse(buf, options)"," : {};"," next();"," } catch (err){"," err.body = buf;"," next(err);"," }"," });"," });"," }","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/vhost.js b/node_modules/express/node_modules/connect/lib-cov/middleware/vhost.js deleted file mode 100644 index b069e5c..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/vhost.js +++ /dev/null @@ -1,59 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/vhost.js']) { - _$jscoverage['middleware/vhost.js'] = []; - _$jscoverage['middleware/vhost.js'][28] = 0; - _$jscoverage['middleware/vhost.js'][29] = 0; - _$jscoverage['middleware/vhost.js'][30] = 0; - _$jscoverage['middleware/vhost.js'][31] = 0; - _$jscoverage['middleware/vhost.js'][32] = 0; - _$jscoverage['middleware/vhost.js'][33] = 0; - _$jscoverage['middleware/vhost.js'][34] = 0; - _$jscoverage['middleware/vhost.js'][35] = 0; - _$jscoverage['middleware/vhost.js'][36] = 0; - _$jscoverage['middleware/vhost.js'][37] = 0; - _$jscoverage['middleware/vhost.js'][38] = 0; -} -_$jscoverage['middleware/vhost.js'][28]++; -module.exports = (function vhost(hostname, server) { - _$jscoverage['middleware/vhost.js'][29]++; - if (! hostname) { - _$jscoverage['middleware/vhost.js'][29]++; - throw new Error("vhost hostname required"); - } - _$jscoverage['middleware/vhost.js'][30]++; - if (! server) { - _$jscoverage['middleware/vhost.js'][30]++; - throw new Error("vhost server required"); - } - _$jscoverage['middleware/vhost.js'][31]++; - var regexp = new RegExp("^" + hostname.replace(/[*]/g, "(.*?)") + "$", "i"); - _$jscoverage['middleware/vhost.js'][32]++; - if (server.onvhost) { - _$jscoverage['middleware/vhost.js'][32]++; - server.onvhost(hostname); - } - _$jscoverage['middleware/vhost.js'][33]++; - return (function vhost(req, res, next) { - _$jscoverage['middleware/vhost.js'][34]++; - if (! req.headers.host) { - _$jscoverage['middleware/vhost.js'][34]++; - return next(); - } - _$jscoverage['middleware/vhost.js'][35]++; - var host = req.headers.host.split(":")[0]; - _$jscoverage['middleware/vhost.js'][36]++; - if (! regexp.test(host)) { - _$jscoverage['middleware/vhost.js'][36]++; - return next(); - } - _$jscoverage['middleware/vhost.js'][37]++; - if ("function" == typeof server) { - _$jscoverage['middleware/vhost.js'][37]++; - return server(req, res, next); - } - _$jscoverage['middleware/vhost.js'][38]++; - server.emit("request", req, res); -}); -}); -_$jscoverage['middleware/vhost.js'].source = ["","/*!"," * Connect - vhost"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Vhost:"," * "," * Setup vhost for the given `hostname` and `server`."," *"," * connect()"," * .use(connect.vhost('foo.com', fooApp))"," * .use(connect.vhost('bar.com', barApp))"," * .use(connect.vhost('*.com', mainApp))"," *"," * The `server` may be a Connect server or"," * a regular Node `http.Server`. "," *"," * @param {String} hostname"," * @param {Server} server"," * @return {Function}"," * @api public"," */","","module.exports = function vhost(hostname, server){"," if (!hostname) throw new Error('vhost hostname required');"," if (!server) throw new Error('vhost server required');"," var regexp = new RegExp('^' + hostname.replace(/[*]/g, '(.*?)') + '$', 'i');"," if (server.onvhost) server.onvhost(hostname);"," return function vhost(req, res, next){"," if (!req.headers.host) return next();"," var host = req.headers.host.split(':')[0];"," if (!regexp.test(host)) return next();"," if ('function' == typeof server) return server(req, res, next);"," server.emit('request', req, res);"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/patch.js b/node_modules/express/node_modules/connect/lib-cov/patch.js deleted file mode 100644 index 7d59643..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/patch.js +++ /dev/null @@ -1,85 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['patch.js']) { - _$jscoverage['patch.js'] = []; - _$jscoverage['patch.js'][12] = 0; - _$jscoverage['patch.js'][20] = 0; - _$jscoverage['patch.js'][30] = 0; - _$jscoverage['patch.js'][31] = 0; - _$jscoverage['patch.js'][43] = 0; - _$jscoverage['patch.js'][44] = 0; - _$jscoverage['patch.js'][48] = 0; - _$jscoverage['patch.js'][49] = 0; - _$jscoverage['patch.js'][50] = 0; - _$jscoverage['patch.js'][55] = 0; - _$jscoverage['patch.js'][56] = 0; - _$jscoverage['patch.js'][59] = 0; - _$jscoverage['patch.js'][66] = 0; - _$jscoverage['patch.js'][67] = 0; - _$jscoverage['patch.js'][68] = 0; - _$jscoverage['patch.js'][69] = 0; - _$jscoverage['patch.js'][72] = 0; - _$jscoverage['patch.js'][73] = 0; - _$jscoverage['patch.js'][74] = 0; - _$jscoverage['patch.js'][75] = 0; - _$jscoverage['patch.js'][78] = 0; -} -_$jscoverage['patch.js'][12]++; -var http = require("http"), res = http.ServerResponse.prototype, setHeader = res.setHeader, _renderHeaders = res._renderHeaders, writeHead = res.writeHead; -_$jscoverage['patch.js'][20]++; -if (! res._hasConnectPatch) { - _$jscoverage['patch.js'][30]++; - res.__defineGetter__("headerSent", (function () { - _$jscoverage['patch.js'][31]++; - return this._header; -})); - _$jscoverage['patch.js'][43]++; - res.setHeader = (function (field, val) { - _$jscoverage['patch.js'][44]++; - var key = field.toLowerCase(), prev; - _$jscoverage['patch.js'][48]++; - if (this._headers && "set-cookie" == key) { - _$jscoverage['patch.js'][49]++; - if (prev = this.getHeader(field)) { - _$jscoverage['patch.js'][50]++; - val = Array.isArray(prev)? prev.concat(val): [prev, val]; - } - } - else { - _$jscoverage['patch.js'][55]++; - if ("content-type" == key && this.charset) { - _$jscoverage['patch.js'][56]++; - val += "; charset=" + this.charset; - } - } - _$jscoverage['patch.js'][59]++; - return setHeader.call(this, field, val); -}); - _$jscoverage['patch.js'][66]++; - res._renderHeaders = (function () { - _$jscoverage['patch.js'][67]++; - if (! this._emittedHeader) { - _$jscoverage['patch.js'][67]++; - this.emit("header"); - } - _$jscoverage['patch.js'][68]++; - this._emittedHeader = true; - _$jscoverage['patch.js'][69]++; - return _renderHeaders.call(this); -}); - _$jscoverage['patch.js'][72]++; - res.writeHead = (function () { - _$jscoverage['patch.js'][73]++; - if (! this._emittedHeader) { - _$jscoverage['patch.js'][73]++; - this.emit("header"); - } - _$jscoverage['patch.js'][74]++; - this._emittedHeader = true; - _$jscoverage['patch.js'][75]++; - return writeHead.apply(this, arguments); -}); - _$jscoverage['patch.js'][78]++; - res._hasConnectPatch = true; -} -_$jscoverage['patch.js'].source = ["","/*!"," * Connect"," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var http = require('http')"," , res = http.ServerResponse.prototype"," , setHeader = res.setHeader"," , _renderHeaders = res._renderHeaders"," , writeHead = res.writeHead;","","// apply only once","","if (!res._hasConnectPatch) {",""," /**"," * Provide a public \"header sent\" flag"," * until node does."," *"," * @return {Boolean}"," * @api public"," */",""," res.__defineGetter__('headerSent', function(){"," return this._header;"," });",""," /**"," * Set header `field` to `val`, special-casing"," * the `Set-Cookie` field for multiple support."," *"," * @param {String} field"," * @param {String} val"," * @api public"," */",""," res.setHeader = function(field, val){"," var key = field.toLowerCase()"," , prev;",""," // special-case Set-Cookie"," if (this._headers && 'set-cookie' == key) {"," if (prev = this.getHeader(field)) {"," val = Array.isArray(prev)"," ? prev.concat(val)"," : [prev, val];"," }"," // charset"," } else if ('content-type' == key && this.charset) {"," val += '; charset=' + this.charset;"," }",""," return setHeader.call(this, field, val);"," };",""," /**"," * Proxy to emit \"header\" event."," */",""," res._renderHeaders = function(){"," if (!this._emittedHeader) this.emit('header');"," this._emittedHeader = true;"," return _renderHeaders.call(this);"," };",""," res.writeHead = function(){"," if (!this._emittedHeader) this.emit('header');"," this._emittedHeader = true;"," return writeHead.apply(this, arguments);"," };",""," res._hasConnectPatch = true;","}"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/proto.js b/node_modules/express/node_modules/connect/lib-cov/proto.js deleted file mode 100644 index e8ecb99..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/proto.js +++ /dev/null @@ -1,285 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['proto.js']) { - _$jscoverage['proto.js'] = []; - _$jscoverage['proto.js'][13] = 0; - _$jscoverage['proto.js'][19] = 0; - _$jscoverage['proto.js'][23] = 0; - _$jscoverage['proto.js'][62] = 0; - _$jscoverage['proto.js'][64] = 0; - _$jscoverage['proto.js'][65] = 0; - _$jscoverage['proto.js'][66] = 0; - _$jscoverage['proto.js'][70] = 0; - _$jscoverage['proto.js'][71] = 0; - _$jscoverage['proto.js'][72] = 0; - _$jscoverage['proto.js'][73] = 0; - _$jscoverage['proto.js'][74] = 0; - _$jscoverage['proto.js'][79] = 0; - _$jscoverage['proto.js'][80] = 0; - _$jscoverage['proto.js'][84] = 0; - _$jscoverage['proto.js'][85] = 0; - _$jscoverage['proto.js'][89] = 0; - _$jscoverage['proto.js'][90] = 0; - _$jscoverage['proto.js'][92] = 0; - _$jscoverage['proto.js'][102] = 0; - _$jscoverage['proto.js'][103] = 0; - _$jscoverage['proto.js'][109] = 0; - _$jscoverage['proto.js'][110] = 0; - _$jscoverage['proto.js'][112] = 0; - _$jscoverage['proto.js'][113] = 0; - _$jscoverage['proto.js'][114] = 0; - _$jscoverage['proto.js'][117] = 0; - _$jscoverage['proto.js'][118] = 0; - _$jscoverage['proto.js'][119] = 0; - _$jscoverage['proto.js'][122] = 0; - _$jscoverage['proto.js'][125] = 0; - _$jscoverage['proto.js'][127] = 0; - _$jscoverage['proto.js'][130] = 0; - _$jscoverage['proto.js'][132] = 0; - _$jscoverage['proto.js'][133] = 0; - _$jscoverage['proto.js'][136] = 0; - _$jscoverage['proto.js'][139] = 0; - _$jscoverage['proto.js'][144] = 0; - _$jscoverage['proto.js'][145] = 0; - _$jscoverage['proto.js'][146] = 0; - _$jscoverage['proto.js'][147] = 0; - _$jscoverage['proto.js'][148] = 0; - _$jscoverage['proto.js'][149] = 0; - _$jscoverage['proto.js'][151] = 0; - _$jscoverage['proto.js'][152] = 0; - _$jscoverage['proto.js'][153] = 0; - _$jscoverage['proto.js'][154] = 0; - _$jscoverage['proto.js'][155] = 0; - _$jscoverage['proto.js'][157] = 0; - _$jscoverage['proto.js'][160] = 0; - _$jscoverage['proto.js'][161] = 0; - _$jscoverage['proto.js'][162] = 0; - _$jscoverage['proto.js'][165] = 0; - _$jscoverage['proto.js'][167] = 0; - _$jscoverage['proto.js'][168] = 0; - _$jscoverage['proto.js'][172] = 0; - _$jscoverage['proto.js'][173] = 0; - _$jscoverage['proto.js'][176] = 0; - _$jscoverage['proto.js'][177] = 0; - _$jscoverage['proto.js'][178] = 0; - _$jscoverage['proto.js'][181] = 0; - _$jscoverage['proto.js'][182] = 0; - _$jscoverage['proto.js'][183] = 0; - _$jscoverage['proto.js'][184] = 0; - _$jscoverage['proto.js'][185] = 0; - _$jscoverage['proto.js'][187] = 0; - _$jscoverage['proto.js'][189] = 0; - _$jscoverage['proto.js'][190] = 0; - _$jscoverage['proto.js'][192] = 0; - _$jscoverage['proto.js'][195] = 0; - _$jscoverage['proto.js'][198] = 0; - _$jscoverage['proto.js'][227] = 0; - _$jscoverage['proto.js'][228] = 0; - _$jscoverage['proto.js'][229] = 0; -} -_$jscoverage['proto.js'][13]++; -var http = require("http"), utils = require("./utils"), debug = require("debug")("connect:dispatcher"); -_$jscoverage['proto.js'][19]++; -var app = module.exports = {}; -_$jscoverage['proto.js'][23]++; -var env = process.env.NODE_ENV || "development"; -_$jscoverage['proto.js'][62]++; -app.use = (function (route, fn) { - _$jscoverage['proto.js'][64]++; - if ("string" != typeof route) { - _$jscoverage['proto.js'][65]++; - fn = route; - _$jscoverage['proto.js'][66]++; - route = "/"; - } - _$jscoverage['proto.js'][70]++; - if ("function" == typeof fn.handle) { - _$jscoverage['proto.js'][71]++; - var server = fn; - _$jscoverage['proto.js'][72]++; - fn.route = route; - _$jscoverage['proto.js'][73]++; - fn = (function (req, res, next) { - _$jscoverage['proto.js'][74]++; - server.handle(req, res, next); -}); - } - _$jscoverage['proto.js'][79]++; - if (fn instanceof http.Server) { - _$jscoverage['proto.js'][80]++; - fn = fn.listeners("request")[0]; - } - _$jscoverage['proto.js'][84]++; - if ("/" == route[route.length - 1]) { - _$jscoverage['proto.js'][85]++; - route = route.slice(0, -1); - } - _$jscoverage['proto.js'][89]++; - debug("use %s %s", route || "/", fn.name || "anonymous"); - _$jscoverage['proto.js'][90]++; - this.stack.push({route: route, handle: fn}); - _$jscoverage['proto.js'][92]++; - return this; -}); -_$jscoverage['proto.js'][102]++; -app.handle = (function (req, res, out) { - _$jscoverage['proto.js'][103]++; - var stack = this.stack, fqdn = ~ req.url.indexOf("://"), removed = "", slashAdded = false, index = 0; - _$jscoverage['proto.js'][109]++; - function next(err) { - _$jscoverage['proto.js'][110]++; - var layer, path, status, c; - _$jscoverage['proto.js'][112]++; - if (slashAdded) { - _$jscoverage['proto.js'][113]++; - req.url = req.url.substr(1); - _$jscoverage['proto.js'][114]++; - slashAdded = false; - } - _$jscoverage['proto.js'][117]++; - req.url = removed + req.url; - _$jscoverage['proto.js'][118]++; - req.originalUrl = req.originalUrl || req.url; - _$jscoverage['proto.js'][119]++; - removed = ""; - _$jscoverage['proto.js'][122]++; - layer = stack[index++]; - _$jscoverage['proto.js'][125]++; - if (! layer || res.headerSent) { - _$jscoverage['proto.js'][127]++; - if (out) { - _$jscoverage['proto.js'][127]++; - return out(err); - } - _$jscoverage['proto.js'][130]++; - if (err) { - _$jscoverage['proto.js'][132]++; - if (res.statusCode < 400) { - _$jscoverage['proto.js'][132]++; - res.statusCode = 500; - } - _$jscoverage['proto.js'][133]++; - debug("default %s", res.statusCode); - _$jscoverage['proto.js'][136]++; - if (err.status) { - _$jscoverage['proto.js'][136]++; - res.statusCode = err.status; - } - _$jscoverage['proto.js'][139]++; - var msg = "production" == env? http.STATUS_CODES[res.statusCode]: err.stack || err.toString(); - _$jscoverage['proto.js'][144]++; - if ("test" != env) { - _$jscoverage['proto.js'][144]++; - console.error(err.stack || err.toString()); - } - _$jscoverage['proto.js'][145]++; - if (res.headerSent) { - _$jscoverage['proto.js'][145]++; - return req.socket.destroy(); - } - _$jscoverage['proto.js'][146]++; - res.setHeader("Content-Type", "text/plain"); - _$jscoverage['proto.js'][147]++; - res.setHeader("Content-Length", Buffer.byteLength(msg)); - _$jscoverage['proto.js'][148]++; - if ("HEAD" == req.method) { - _$jscoverage['proto.js'][148]++; - return res.end(); - } - _$jscoverage['proto.js'][149]++; - res.end(msg); - } - else { - _$jscoverage['proto.js'][151]++; - debug("default 404"); - _$jscoverage['proto.js'][152]++; - res.statusCode = 404; - _$jscoverage['proto.js'][153]++; - res.setHeader("Content-Type", "text/plain"); - _$jscoverage['proto.js'][154]++; - if ("HEAD" == req.method) { - _$jscoverage['proto.js'][154]++; - return res.end(); - } - _$jscoverage['proto.js'][155]++; - res.end("Cannot " + req.method + " " + utils.escape(req.originalUrl)); - } - _$jscoverage['proto.js'][157]++; - return; - } - _$jscoverage['proto.js'][160]++; - try { - _$jscoverage['proto.js'][161]++; - path = utils.parseUrl(req).pathname; - _$jscoverage['proto.js'][162]++; - if (undefined == path) { - _$jscoverage['proto.js'][162]++; - path = "/"; - } - _$jscoverage['proto.js'][165]++; - if (0 != path.toLowerCase().indexOf(layer.route.toLowerCase())) { - _$jscoverage['proto.js'][165]++; - return next(err); - } - _$jscoverage['proto.js'][167]++; - c = path[layer.route.length]; - _$jscoverage['proto.js'][168]++; - if (c && "/" != c && "." != c) { - _$jscoverage['proto.js'][168]++; - return next(err); - } - _$jscoverage['proto.js'][172]++; - removed = layer.route; - _$jscoverage['proto.js'][173]++; - req.url = req.url.substr(removed.length); - _$jscoverage['proto.js'][176]++; - if (! fqdn && "/" != req.url[0]) { - _$jscoverage['proto.js'][177]++; - req.url = "/" + req.url; - _$jscoverage['proto.js'][178]++; - slashAdded = true; - } - _$jscoverage['proto.js'][181]++; - debug("%s", layer.handle.name || "anonymous"); - _$jscoverage['proto.js'][182]++; - var arity = layer.handle.length; - _$jscoverage['proto.js'][183]++; - if (err) { - _$jscoverage['proto.js'][184]++; - if (arity === 4) { - _$jscoverage['proto.js'][185]++; - layer.handle(err, req, res, next); - } - else { - _$jscoverage['proto.js'][187]++; - next(err); - } - } - else { - _$jscoverage['proto.js'][189]++; - if (arity < 4) { - _$jscoverage['proto.js'][190]++; - layer.handle(req, res, next); - } - else { - _$jscoverage['proto.js'][192]++; - next(); - } - } - } - catch (e) { - _$jscoverage['proto.js'][195]++; - next(e); - } -} - _$jscoverage['proto.js'][198]++; - next(); -}); -_$jscoverage['proto.js'][227]++; -app.listen = (function () { - _$jscoverage['proto.js'][228]++; - var server = http.createServer(this); - _$jscoverage['proto.js'][229]++; - return server.listen.apply(server, arguments); -}); -_$jscoverage['proto.js'].source = ["","/*!"," * Connect - HTTPServer"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var http = require('http')"," , utils = require('./utils')"," , debug = require('debug')('connect:dispatcher');","","// prototype","","var app = module.exports = {};","","// environment","","var env = process.env.NODE_ENV || 'development';","","/**"," * Utilize the given middleware `handle` to the given `route`,"," * defaulting to _/_. This \"route\" is the mount-point for the"," * middleware, when given a value other than _/_ the middleware"," * is only effective when that segment is present in the request's"," * pathname."," *"," * For example if we were to mount a function at _/admin_, it would"," * be invoked on _/admin_, and _/admin/settings_, however it would"," * not be invoked for _/_, or _/posts_."," *"," * Examples:"," *"," * var app = connect();"," * app.use(connect.favicon());"," * app.use(connect.logger());"," * app.use(connect.static(__dirname + '/public'));"," *"," * If we wanted to prefix static files with _/public_, we could"," * \"mount\" the `static()` middleware:"," *"," * app.use('/public', connect.static(__dirname + '/public'));"," *"," * This api is chainable, so the following is valid:"," *"," * connect()"," * .use(connect.favicon())"," * .use(connect.logger())"," * .use(connect.static(__dirname + '/public'))"," * .listen(3000);"," *"," * @param {String|Function|Server} route, callback or server"," * @param {Function|Server} callback or server"," * @return {Server} for chaining"," * @api public"," */","","app.use = function(route, fn){"," // default route to '/'"," if ('string' != typeof route) {"," fn = route;"," route = '/';"," }",""," // wrap sub-apps"," if ('function' == typeof fn.handle) {"," var server = fn;"," fn.route = route;"," fn = function(req, res, next){"," server.handle(req, res, next);"," };"," }",""," // wrap vanilla http.Servers"," if (fn instanceof http.Server) {"," fn = fn.listeners('request')[0];"," }",""," // strip trailing slash"," if ('/' == route[route.length - 1]) {"," route = route.slice(0, -1);"," }",""," // add the middleware"," debug('use %s %s', route || '/', fn.name || 'anonymous');"," this.stack.push({ route: route, handle: fn });",""," return this;","};","","/**"," * Handle server requests, punting them down"," * the middleware stack."," *"," * @api private"," */","","app.handle = function(req, res, out) {"," var stack = this.stack"," , fqdn = ~req.url.indexOf('://')"," , removed = ''"," , slashAdded = false"," , index = 0;",""," function next(err) {"," var layer, path, status, c;",""," if (slashAdded) {"," req.url = req.url.substr(1);"," slashAdded = false;"," }",""," req.url = removed + req.url;"," req.originalUrl = req.originalUrl || req.url;"," removed = '';",""," // next callback"," layer = stack[index++];",""," // all done"," if (!layer || res.headerSent) {"," // delegate to parent"," if (out) return out(err);",""," // unhandled error"," if (err) {"," // default to 500"," if (res.statusCode < 400) res.statusCode = 500;"," debug('default %s', res.statusCode);",""," // respect err.status"," if (err.status) res.statusCode = err.status;",""," // production gets a basic error message"," var msg = 'production' == env"," ? http.STATUS_CODES[res.statusCode]"," : err.stack || err.toString();",""," // log to stderr in a non-test env"," if ('test' != env) console.error(err.stack || err.toString());"," if (res.headerSent) return req.socket.destroy();"," res.setHeader('Content-Type', 'text/plain');"," res.setHeader('Content-Length', Buffer.byteLength(msg));"," if ('HEAD' == req.method) return res.end();"," res.end(msg);"," } else {"," debug('default 404');"," res.statusCode = 404;"," res.setHeader('Content-Type', 'text/plain');"," if ('HEAD' == req.method) return res.end();"," res.end('Cannot ' + req.method + ' ' + utils.escape(req.originalUrl));"," }"," return;"," }",""," try {"," path = utils.parseUrl(req).pathname;"," if (undefined == path) path = '/';",""," // skip this layer if the route doesn't match."," if (0 != path.toLowerCase().indexOf(layer.route.toLowerCase())) return next(err);",""," c = path[layer.route.length];"," if (c && '/' != c && '.' != c) return next(err);",""," // Call the layer handler"," // Trim off the part of the url that matches the route"," removed = layer.route;"," req.url = req.url.substr(removed.length);",""," // Ensure leading slash"," if (!fqdn && '/' != req.url[0]) {"," req.url = '/' + req.url;"," slashAdded = true;"," }",""," debug('%s', layer.handle.name || 'anonymous');"," var arity = layer.handle.length;"," if (err) {"," if (arity === 4) {"," layer.handle(err, req, res, next);"," } else {"," next(err);"," }"," } else if (arity < 4) {"," layer.handle(req, res, next);"," } else {"," next();"," }"," } catch (e) {"," next(e);"," }"," }"," next();","};","","/**"," * Listen for connections."," *"," * This method takes the same arguments"," * as node's `http.Server#listen()`. "," *"," * HTTP and HTTPS:"," *"," * If you run your application both as HTTP"," * and HTTPS you may wrap them individually,"," * since your Connect \"server\" is really just"," * a JavaScript `Function`."," *"," * var connect = require('connect')"," * , http = require('http')"," * , https = require('https');"," * "," * var app = connect();"," * "," * http.createServer(app).listen(80);"," * https.createServer(options, app).listen(443);"," *"," * @return {http.Server}"," * @api public"," */","","app.listen = function(){"," var server = http.createServer(this);"," return server.listen.apply(server, arguments);","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/public/directory.html b/node_modules/express/node_modules/connect/lib-cov/public/directory.html deleted file mode 100644 index 15164bb..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/public/directory.html +++ /dev/null @@ -1,75 +0,0 @@ - - - listing directory {directory} - - - - - -
    -

    {linked-path}

    - {files} -
    - - \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/lib-cov/public/error.html b/node_modules/express/node_modules/connect/lib-cov/public/error.html deleted file mode 100644 index c5ae73a..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/public/error.html +++ /dev/null @@ -1,13 +0,0 @@ - - - {error} - - - -
    -

    {title}

    -

    {statusCode} {error}

    -
      {stack}
    -
    - - diff --git a/node_modules/express/node_modules/connect/lib-cov/public/favicon.ico b/node_modules/express/node_modules/connect/lib-cov/public/favicon.ico deleted file mode 100644 index 895fc96a76b68b4924f1c51d022e1b82fa0f461f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1406 zcmZQzU<5(|0R}M0U}azs1F|%L7$l?s#Ec9aKoZP=&}i&OouUjIY8@C}uZw4x5z5N2 zvEG^C^vXtt_xtJ?p3O32c(KTx;lsgZhW%5M85Sf}k-mf`L80)|7ga~M{a znlL=>m1Q`#uoPkbC~GtXMnhnDh5$DU1D6mx+;2QAKt3ZQFH}H~1y~00GcqzVg9QXw z_<%(a7y$V|wJgF=E>MgE#Aid|14}IyCM5MhEnxFF;pTzOK(>#80puP=gnOXwAd33` mpMe2}f66m3eB@_fcnmb^7!b1nO#opK8zcsj1F30)+jEP);68^d)m`eN0o>(5%D`Q(1;j>g@G;xlf`0VBQ`PFY?6)!N&f?*K}$p; zB!U=NBn{eB8${1}&-2_L*HuZp@ZP1@clS@cHp)4iM1ewzw59vko7eMM{e9z|%NNdX z0V;`?KKSzTCvTm5bc{L^CIKLUxc2X{i{ISz$8Sgf{q)1nXTP{`{s?9mQ$4&hPiKC- zY8q7(Y1Xu5iCf33=O4Vy(+|zQ?rW#gkKB0f%}?+6{G*qT22|DQB-73`YzA{N4W^=s zq0kQYcbtFfz zLz)H<&|z(Y4kBG67=JY6c|L1R-#TR>fC$3^Y%QEnYO1xHsf)+GU`3F<{J0kR(;pbF3)zyg$H+idfnl-wl5Wkh!vUH z4Z32YP=l_}1rZd1W_D&^$A($A+&a0e&P?xx0!ctY2}*<#p+qPVN*B(YzvAWXa*%bzq z7Fz41LKILT(GWohi9|LgIzSZBhb*Zf6R6O}WYQ4GOi&71s9lmll0x6;8&ILOl$j(c z0Z1T(6Tg09{?wd{moFHNN6PS?$|e>1MxSJ(0Z7o2)J-Zv|>acY@f`(Y@g7GwsEj5NLQo+q|HsxQ5}XSX_d@*^A9ZT9=A{W~j+$GyI1 zc4oqTHx@1FlRjw4XWyPN5i2~l_F3@aBk!0yu^aoRDvXy}8@HCjUVQUsuSH4$T5|r< zzZOn^?Wfa6y|Q($Hx4{ws+)wX6-HP4zo!S?4KJ@7PG@G3G{CjXs(p*kIrj6rHs7_y z+=<-=Q62s9FuWa^X~WKgJIAAZJR&XBB002ovPDHLkV1jCMPILeO diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_attach.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_attach.png deleted file mode 100644 index 89ee2da0753040d1ba0a3487473a715a8fe89322..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 794 zcmV+#1LgdQP)i_t#ewV_0K6;=bl;e_Jt7$~$sQ)q$+ia<4Ec+jeaGt9oWH@O|2`W6&O0t!k{B9sUvLWxkCaPsd9W(`fa z;j-|^ZI^2XnzhgZWYRW-kP&J>DWPo`%;JaBX}or79k=+Jo@h%4Eo72tqev+cB?PjP zO<|ByL#>Tehyq$jR74O$B9WDW1`tK`LzYyL3A9iAcRxLkJ`I)n}v%Od-3H>j$OTBtk>(k-9o?8PqI=0 zB&f-+KOXVnjyKJlf4iHOtnuiE_4+ZVJ$dHjU<^o^YCjQ-wt^!;rPpBv(@pFO{9rdw98 z_s@3+yta93oyfL>7AD5}r=|`zS3Gm$_|(iSl8XBd9k%=91J0j2=ivT5cJ18ZmDjh{ z$-RMd{jQ#X79#Sc diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_code.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_code.png deleted file mode 100644 index f7ea90419d950f9e69d977a1f5847456d96a5f0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 818 zcmV-21I_%2P)@LCln44|RX7Ti z0HI3&7jPq){odH{?_{%nYVq_;n_c4WbUpvU(&Cvnj!vq|kVC-vpF6vp^;;e0mm6HW z+WPzA`AZ|;pPp$&dNjzrc??4rt`k%Q1l*u-BPD0MQ}Fbm8jnsyezNt7+u{23>t7Em zJtETY?ja9KrVs^!LJ$xEMF3-bAZO;-IQJavE60KA7fO$VY_%N)R6s>g5mW>fL4&aR z*EVgKKTBXm!=L?S0?xM zYqL@C$|EDF2q*3zWW7;PDZ}SK*IE8;i!3U62=qn80C&*I1Le7WwNP5EcX;_oh2dJn zf#HgBe4@r$GcjHjmj2vAfT%(YN?}kK=(*+1*DkNNc1H5R++vfBMhACi<5uFUU+N4+ z<&U*CPmWi}REa7C6-t>2im1CWv5Jkefxa6>)dEj-CAW wWa{_}BJ!}~75?MkfaCnj>Dn=~vkLS70Pk`;z)@TQj{pDw07*qoM6N<$f@imYHUIzs diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_copy.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_copy.png deleted file mode 100644 index 195dc6d6c365d298e466026b37c1959d96119ea7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 663 zcmV;I0%-k-P)^@R5;6Z z(>-WZK@^7J_sq=QY_e{46@P+~LNG}sRzZsxQHvCsN*h5ir6^j7pq-$xu$N#V1gx}9 zClV7;5)7zih-s3DB)G=7|99>ji@So7-P24n=VQ(@GctDX!^_@$bj%oviY6e4Dh;od zooe%Wvs8LEKQ&&bL&@bwi=STIAI@!-gB2jC5+?y?VR~VkrNxam-`6*8&po|RZ5LpS zNKdJ%c4bTX`XjKsnecf%W>1%6WT?pKNdLLq{=(f(Col?P1+oq@R>)W(n=x!|*BIIh z6DJGw_w`)u6yN|vAhMteYK5#b%r5^v+VCFl1IGssaclZZMS{vs-LJ2$)n7DAr6==K z<29#%AXsBsDoO}SBaXR#_Ap!JKx)(1)3O2pj0_dYWz5By*X74fRT01$Fk%P_RzOMDtV?GU{nsYq#K8iy zb6qzLYDj`_f5$BwC*WE(t0m#xYJ*=jC2|HQYHh=pf#QG7oowi`h!L!{DB$8|qY{~X zu8@sU1tWq;n$XThR0%;45mdqXM892|{CJ@0DS*}>?ami06Q_^tvM~Y3K(_-`#m!8f z8f!QIrH4y#61;0Ym0cCoLl8{IPombPHtnn7%SbTdI&G-d>ZQo!_wBMF9nzX!g8HVY xYTJPGciz9XMh3w2fmZ(7v{)r*QZD48?mrio{~IaoqP z|1Ep}yDQG09bP~E^Dk?@JiKQJ z6-pO(3~IOP)IYisL6D6;oAEd;E%zR}{U$rMRNuD6nQV7nesKS>)yLo7JuDCrD>Abi zbj3uW23?^GA}9jQ{M^8v?ejL?HaT7AX5WPZNkBmfN`w-jL?{tT7ykZt$%Yln?p_m~ z-?>&d(LD(jAd}h=LPltPQbO$*Wbyl@G-_k5jXbb#qffHY03>M1jfEqoPJQ6Mr=Byp=^jfzePZV1 zLjCmNi31hdIJHa%e;5g=1(`u3BRzfeExY%=VCu{loOr{`%2hUR*x>tL^W_TTaj);0 zpPR6CUD1+0>4TQ6zVfH3TQ;%l6#(_%yspK@3gcmG#Q4!WCPyLU93nMKk7E2pcA=l45({2jNho>sdF*A~bA zxX?-cp~y_z_kFf+yqu3m#QiB}03?Z&9vvR5TNgj<)($Vm)xq5G>|o2sFMag&6aNF+ WAT1?sQBYt20000iHtsh1EzPArg^Q zIZrOk#rNsfjaSbMAL;<4h;Z=jvu8dzyz8N&Nb7=z03ZUw?9z%8KQEa6yM5=kUnka& z3?FJk2}L7q>na=T#;<7U*P91xfF`;`6%pVgWgRy0?1ZryL@%z52=-!fGXWGEn4M351L4<+7eDgwo|moqXT+s1&Kmn>-uQQ8mL7XY)w5Zk*(g+<3Y3tmkR!bL zOUKaUtj_pX26sH+=Iorwu}MGd`_%O-_sS}8VpG#fJA)Fcs#ezwtZf?q?Ac70mDv`rVs{$od?VPKeqf<-kUjNtS6ecB*mq<&M97K^6IVsDO zt2$Ru!b+>2S<}_H>$RcInusU_8PMNdf(W{sNlJ3FkrwMJPeBPO#d}Y^a{9TH(#{Y) l0D?dWAV4eUJX#h`!2gmISk&ZKd4B)^002ovPDHLkV1g&sd|Lnj diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_error.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_error.png deleted file mode 100644 index f07f449a44ff2761bfc7b752db3d08d0e1238b02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 793 zcmV+!1LpjRP)lHwhvrAu0-@MQwt}+5~MQTtu}C0%;W( z1<{R?aHBz*g;pk%AyQVBR_Zu5m~;ES_vxI-O!vIF|H*|T{l`n#garr?$RMk>)?Y48 z(ZF2yTneKb};DNWF+jK)IF`6_IfJ{i|F3o%Q+l&4_HGBD|ACE8na_6>L z=s{^>-C(a7J$6=8A_%h5W!1K6dcL!D?XX+Ndk)oei?UundDpX_E&1Y&`)3P8#Ny0s z2Ag7_&ZPhyGj%)g&S6V2LNun1;iBQm#Fwlfv zgyESZR$X}2P;=RW!2zid1r$hBL{K7>2qi*f7>pT1=RdT3@-anEoH{ z={KFOO;Dh#bV*jaN>}M>RZqQd`S=6O9C3KpI~I>l%QFYfo;jqQYe5fcn`)+)zMm6P z4X&L(>gnN0!%J4^rhX->?$S5bY<=GEU%jc!KLL8sww-Eg;h z`H-yBHa)yfojYT}&G*GFc$<(Yja_q=lZvj66DC^O5%$B)|Z(CeD=n`|eM04SP; z>-=-l+xdJjA~vR6^xB#o{ehf~tSM`iwaQv$O<8NIHA}W_WOw*~ XD^gE}t;YAo00000NkvXXu0mjfl6ZQ> diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_excel.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_excel.png deleted file mode 100644 index eb6158eb5ca9c4b64c81e70e0fd894dbc8e2bed9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 817 zcmV-11J3-3P)hdKqhFO_H1|Vn1E?(=|cjAh_&P}y{{^`u< zcYD@PK?$)4i~7o9*6F_$F$4lR(d4AAvrez^(88Hk+)+B7E)M3jc=Ewl4$S^`_qwSF zA%qz@=c2EOsz@0qB1IqsqJU)HaG&+}%`-OM8YqW{K85hqj@4&V9vz!Cm_n0-W#f;# zeEpJde%vdgRn5?(+PY=W*z~|lT2-mtown({ll8&3S5+lWz5K}LTRW{k{eJn3Qz!SU zQ`@qI_n2;K?RG~pYJ9=dj-RWgG;P&wEuoAxL~Q)<>x0b=dED^Outj&xQ^rA;u3pw| zca_ClTh_d9cxXg_U!lLRl0`xU@$=UXO|_dRdtXfKwPawmnf(LC7u}-U>8k6}3u|{8 zs9LHr>MIJZGD^r9h|q2yF24Wuh+PM^yMN9GP1$khlDkdyCY}D{kg}jEf-(kW5jBY> z0rB29ZhG-r=i_R{;+1k0?A-sBM;AP6(k1i9ZuixR4?MqXOvphQgCYj~RnXKKL~J9Q zIDNz~XMfO{ZhUg&BTtMyXJqDVqc<x643?SvKHx004lTvR=0a5$dUw z>Xb470000$S;ka1sfH4I-R8njUol7M4dtApOahDylptpYswf1hD#CwFoz6oEA>(SIECU&IQ%a}GXdnC!9$70`0uH1B00000NkvXXu0mjf!8w72 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_find.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_find.png deleted file mode 100644 index 2f193889f7ea091c292acdd684c595dcb206b5c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 879 zcmV-#1CacQP)@+1&aazfGU7ezSm^v zpACwO+tu0su66!(dT=`e05DeeCnCFJW(8|RKtKa{4LGONnx2V85A4m%PEQ?MEtR-esdM$pB-`H542D0)N2zSC6Imf)4L8?>%ZrW+H>xCKi$unm zvGZq-*Q%Aahx;C*=l+K%-?>XB)6TB$-L$r*`RUvlA`xP1NG2?)ge8@TQ4EN|Jks0u zcDg;oFC#-#R`YbWB`D?Q`1#y7l$LXhjSLf8AvQuB84}i#j0^!#g{VE#(K7h@5pFHy zSenl=@XBEdxp`h2Ji>CR%=qXJ7!e|?paKet-~;#ok#jETyeB(5&Bkhp;!+;51~G=) zH?L7xmDUu_h+a$+xuWom;AWW!mS$%%+436Rjc@}y?l1134kgD0AOf$OmjOR zstUlshZk$ZC!bAyIg{Y29z#&@3SJ;6D4+_eFume9^#TmMccC5u0J!ZCTnO6m$lnD| z5JeFHf`Xs~1vP>RLKI1GKDY<~pjr2&bi(fX;6Nj-ss@Ds0CcoO0H{JsEQkm{q03skAA);_bv3q{k31qwVo&s-q`Z?_e+j^w(WL? zl+uETs5+~xBU2};OqEE9ETLGwsMGe1%iTRNue)9}|0~E4B*@5#oRXZ9oRXZ9TqRep zPrGZuoOON4n@=uPbyP1y4G=+HktC6l(gZoFD>@_lXDrN?wo+zozGt3P=Qh+3L7+}q z2!WK7geXLnO3Vw;o12Skp%_E#+N#9;DDWP?Q-VS3B$v~Ha)dDzWn0zG~O(^_1!n0HYp-( z+;wPIdoFgQlpYV!10V>5@a)1LyGBMvoa}miyp(bxbMTM-FYNyx;V@TfYddyT00000 LNkvXXu0mjf90!wr diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_go.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_go.png deleted file mode 100644 index 80fe1ed0cc75fbb67e9398ae686641f8fb287238..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 779 zcmV+m1N8ifP)JNR2Ufr z!Apo%Wf%b9=l#x^8AolrB&K9H?Pg_|78WA8(M3toqE%3B#7*srcF`i*xhupr27%Nr ziguah1+mN)U5GNmyEfQ3-e%_i&-vb-Co#(>FJ+EhQEwjRYVQ(&UYy{U@%vbY||>@4x=B^vIqabI?L* z;-S&DS^V3-ni4^fl|HMkOEbgX)(390>A}|VIypb5Xee4g;7ck zwKh^A3Mi1Mh@eC$5lV!}Fw%sP623U`g3pd_Hr5sunLvTskx4}&Gm%Q6L}(l4x}jCe z*81q1_4-O*ffi~_nMslo?EQ8t*&Ec(pzEw$vc}pKn_Qp0>D7Jr>ATNC3w@9f|Y+U&+)#!t7l&wKp+nP{PQsb+fb=Yf!Fu&5j8vpRj{FT>jD z>d>$sx;A&+`n$HcF}&sYKSyR;=(=9tvvOj@hUG;~4qTYk^_@E=?$*^_pVh_bGnOt~ z;pEw)j{SK$XVc;qy181rT655gW9NG{(yeablViIL>cDI_ux8m>Pp{tY$J0lgo4#ax za?j0EA3s0S!f>{~ykN9h_RhM&g3K(E`q(dE(Rd49+%xMeR9{qlWnmd{s#(SQ>PmFtSQqUjAtB;_Vvt6}AS_5YgM`Uqu`yva+H8^=4U$e4gHb}u zAQ2N{V3A%pO|?Pv?tb6z=jC}SiRa$G^v3q?*6XcYz$p|cq{uLj@#~Fi`J(>5{@&&N zy%T^+;>8cXx%|o77anP?&W1?1A(>-T49z9pyeCl@7YI+Si zKti7=B~``}TImz(G{0PnlQA3P#MAd}sorMjkP!50B7$nAkU^%#nl{Q9lW0@}9fE-> zN(q7tRuiC_T1r|BBtVBTlQ2+70$Rf;eF`Z;lx46Cpu-rEgb)EBKq(b^W8l<^We(`D z43?0=01z<3G6+UUv6`CsWCk6^93!#+<;ws7007{zS3k2k9-zZKFO~(k`>s0y006+1 zgF_jyIhsL-`FMf~JL~C=cV75(CrJ|q;MVO961G=O zm9d)YpJg5g(4i_HKL75eSE}mq$Y}r}hyVdcV~p>6a}oXr80q`oj%+s700000NkvXX Hu0mjfPs|!l diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_key.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_key.png deleted file mode 100644 index d6626cb09eb11a298b90a8a27b0d8eab41f49a82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 801 zcmV++1K#|JP)$lC4gU2-`f*>nhR-;k6IP7e>YO!0^w)WK%3$w02v-#>5Ep64PCP| zJihT#O|N+nT7XR2h7dAB?UEAOhJF^mol1i`QtQB`HSY}RE7=r! z)zaVIHr5?>v2Gz&fdYw&2ug$!p+txby(aWZ7(4QT)l2`jX7eMQ{>)lG6ev(fWKxmH zOr%mM5$6B%u~qGtCf40#`mbGj3s!n+^%wnJ&#rl>g<4Z)lB5J6f!?|AP275)Zswr* z%T}4~{;_(?waU!#?JabbF3Cy-kf0{R{z}6$e=5yMQKt3BPcl2>zoTPMqMwF;3!_n|>sT?~bK_-2O_m+o>GJ6h zt=+g$4n7y%1qVJI7*5Yw(hqM=JusY{d}*?U(Oj*gT655eZ>Ksn(qrd7v3}DX1}C>` z+X+8@+4-pVq_fxG zlU}~Ye!0+%>J+pPk+0wV{GM$QaYM?5ux)w2z59=S&H2+K?;gH$bZGzL&g5>G ft+noNiyiPkP9r@8gT|RZ00000NkvXXu0mjfuqTIu diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_lightning.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_lightning.png deleted file mode 100644 index 7e568703d6432c530224e443771a04fc1e2e59c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 839 zcmV-N1GxN&P)73{`^;G#xwAtHz%LU)4b zqTRU=ve1RNa3QT=ZM7C`iJ~QFQ*9t7<~pX$d^7W%^M8FFCkcQj-~0ZRTBCB(J0^iD z-~e!d9LR`f3#|=(>$bPvx_D-~2jC%pJ=n_e_OK zeJ_2b-KdDDh@@UlzBSMC;EPygH_MwjWBnPGQegihBV73D?-x9PlHL9A=(Vg=8^d<4 z<9r=UkxuIm)*CO=9e###7PztDxUv}e?$0)rQicmYhV`pQ%S!g@;K(?TVfhM#E?bM| z=B0gfb6h@a8bf5FVT-SV~6}?X}9lK@@Yynoty&1zdZP@?RfODsl=2XzzU% zS8gIN43How+9%bK2S@Xbc`O>`z5`%^;pXGy8^4f>9^3!Sp@|O&)m;dOa3q6d;4P-l zca|=H_{G&m?D_+&-}r{u-J$5T=(X4R&)q|O^gN8cgv;s#@5sEPT5_Z)oFo9Ac>l+I zc4ng5zHpps|9)<_Rw>5bKzE(M1j)dFWI_%OH$BJSz0?T+02W0)_a>#vFqb!*d|5wB zzBUN|M&ty51O@=i?kiDrjQ{{}e|^rU?OS|RdxxP1p5mAw36cX72#`R6UsoeCQFI~! z0ATITp!vfeYyQ?Dr=^5BAshfEa0nB~JG?nUa2Aur006MC*<9`)86SPS(W^`H2n+xi ztOWohsFfVfVWrI7PSKW}BmkyPoj(-|J?ES|BGd-}fIxr{00@ANnO*ZR`#)pee4I5T Rmm>fG002ovPDHLkV1i|Hc$okI diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_link.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_link.png deleted file mode 100644 index 312eab0914ab59271384686255d1be913a6b3add..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 830 zcmV-E1Ht@>P)VWgGzD=Y79#JI$lhEn`|2MpRa?Bt#-nSD~P0P(mbVe{KrOBoKnSsk>m|ML{6l zBosu@om4j#WzNLRAk+{k1JRvL(MfE&vvbb->v>W{*z*1_uMP}0cIRX*?mz+wk%*#O z%0D-+$B*g1nRkvI+_3E8Pr1NC6@5M&4vWaLCnNlr;lNlr4i91z&)eBGqL{L{GNu;Fof}GS9{gM5BJuH;2QWk8yuOZdB3pGR#s8bd~ zAmt<>3Q=YH$t5YJ5;7@+8Uh6=ktBgY6#6Pa%2F?h910?U8cLT43KAj$Z1*==ra&gILO{WkHfs(--F=bly9l~${z@AT>V$oat!YAD@M zBE0v_F{`g#^wOSP-u~!wvlmXdd*uqFqoZ0^{&nEMDU+=!>({S0wrQhFmoB}Yq1)~0 z^{A)L8Xjzdr(W4_exYO6u3a{4*kIeXZMJUR>Q=ksjW_p!rAwDKYUs90>6Q|C>56o@ zbrSq^Xk7Gq#>dAsn@un`Hz$?w$;Ss`%jV7L%9ShgHFV~C)6M>B`Tp%|nqPc&G*A3| z)Qe+}vT4-x^t1~XE@(6wR;^lPWMo9n*~E!cy~)YRsT2{`?fqeIw-e7N@mOA%UcCIq z_kH(_EK7|>pM*1Wt2^DaDAp|cvp*@(ZZDKpYkKC^?97(`0sb&XTXy7N#sB~S07*qo IM6N<$f;YmCWB>pF diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_paintbrush.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_paintbrush.png deleted file mode 100644 index 246a2f0b426faa0c7f5ba009e32b1deaf88d1288..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 813 zcmV+|1JeA7P)otxGRZMDZ!_a~nK|b_-`n%VosaL{KDuPV10`(1LIen8kX2Xff$3BE zah#djvFGJ&eE^89Pk*-O^+&d>FC~^GjRYVQ(uuPJyS|-v?9lxA-+tM5>1Qu*n+Ir1 z6KhA>X4$XDH6?-|E5oe1E?pQ5-M;2xw_ex!x}I2+b=}mPFW$U%^;o(Zg*LP!K^1kP%8ynsD^= z1y^6xD1#GLjO{VLdh@0GKY7;d$+NGukV)GRLPn^=q=dF%B#XaJrNP`0E6=}e&Gj3d zKJbQre*WXt!60_DnIzgMQc6S#fvjXxsE1v7;T;njHkdy2miIqAS(nX~o%cO+q+b#h z5tIleLWvL=dQE8OC#{%y*Tnku&K`Tuub&_ELI0t_ea{@3f>Jv&sYqld(%}3_GY3Dm z;O{3*Y?v^A`a|D;^qrM=ykI)U6QHd%WhO~VF!SGjGn0GOZrc3mGZudNl9{Q#X5&-F zuGwVReFLBjE5jr!!^-5*L%!I%PkYH#Hs5rMrEBl^)9)9XTD;xjHFxVZMc3~Dw6#k$ z(-S}RE$bgMHv6Z`mS5|u$$78sp4G-8b@lVkl`HtEv+MGn!F&bKcHPi$$oP_;=BrPf z$(~b3&p3CsuQxhoV$%jIR;`lB-s7FDX)xCTXuJ7ZyIQk96uIR=HBt%-P?N*bp`)EF zq14c}QM+O70NTOa@V~_)&GMZ$^cQDlkyOCa(H3Mf+6xhCuZh`VSN{cQBl5Ys9{cp( rh`2H3A^=GuC6HjQ*7|*0>;m{7QlnX3z3MSD00000NkvXXu0mjfR5FYo diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_paste.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_paste.png deleted file mode 100644 index 968f073fdddc1cc0f0800b1ac4001cd9a55f053d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 703 zcmV;w0zmzVP)AVs!l4K}n~L(tL`6d4Up4iSWnZ3Qg~4n+_J zDGk-qQdogO5JUtO-d5pRp7Nd7_r1^a|M&Zq%mn9Oe((|e0sw%Ur!K7T1pojj=U#f? zQM`qbQrM^DPkwa?DK_be^~z<~RgSMIa<`xP_4P7gg2jCwJ{9^k!fsU=#Ti|%I3p;>90Qd+7|~0h&mIklA#nb>ATL2+v$&u)OBgB z;nsHb)I&QRKeX40H~~cIZxCd}5C} z=79lXoXK%6YlyLtsV$~bSm?Upq|DJh#{|*a7XMm`4QJWZ>s6nL2R1|&J z0VPEwJ9?!n`o5PKAjc->P1Gi8BY*%!5&FVp=#)$mMJYul1Jton}gujiUf??eOy!x&!tsjxy;=Q3_DdcXx=a^OBhW0N~`A@4xB0a*%F? l+@c^sQA%W+?pa#c`9H5UNfS6T{e=Jk002ovPDHLkV1grvM=byV diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_red.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_red.png deleted file mode 100644 index 0b18247da5850f3c2486373a3e179acd2772e8aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 641 zcmV-{0)G98P);68^@7JE5sw#jpE*579S@TLkU(6yap1yN*Zuy>-hV%Q_v4Ar&!63c8OBr(ZRhFu z_kWs36-AmgZCT>x!RqM;Zu9tqvoHI~k@UmYo_g(*J3c%2{N8}7I+|qKPQzv}7t>%W zsu&9G)UmCzkDYSw{fBnuW4j;1fKV_nicw`$8C6D=F_qu`zUiK$2Oc?5UVY+D(`I@R zW`KlwqLftWHH3Z2_XVNfKn>VgT~k=@- z+N>c>0|@A_HbI9Jn`v0~7cfIF(TS69zaomDS1QtgvaBBfGEPLHccO2~3jc>n^6}^HAEh-2#VxC7YYcDXv!L9X= z-R*SOUvIs;n`8(LxP4~^2|JsiN^hq6cU}5dn4v1~Kl{eT7pm&f$PoY`hyVe%y8G*S bxB&kH@RuR86sIAS00000NkvXXu0mjfZBi!% diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_refresh.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_refresh.png deleted file mode 100644 index cf347c7d4685128a4a447abb9fb8e939417644f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 858 zcmV-g1Eu_lP)`6pHR2Ufr z!EI=jWf;Km|8+n2IrHqe<9xxFVk)&(Nh?w$Xk`TAyvb=#e=0aySC z00NkRDM597_LiNIJ2M^qhuTvB004REvvU8@of{r?P8tmo3;+Pk0F0@*jAMhdOkS&1 zhJPPfQa;pP0|4+Yk%#j>X}o-s#EF1_DMV93FsfPP`G*>Ks>L&)Q}w2g%slu0kBfW1 z+*$*0BC^oTl6>OGIq(9BgG4|C90Dk-N_mPazGrQ7uHZ|>BLD!-KmZ)z1e^#?1Sf(M z!6m}K(^b|i%$TcA5bC}r$tAA?0C)g1@CgWliJ;NAk&ZF+-w#}$`-3nZ32C6IVKrHp zr+(!L2hRfF&AsTw>_@ z1y23;E%Oz}?q^Q2d($ayO;-sON2t7$w(Z|o0Pw1YnSp^}0PI+I5HnDNsFCA?oorkG z5sUIGIq=FSyxcj+xlhkm0en=52Bx3@02o12gdAU$_i?v6iyFMuc7P9#zQ-Hf; zVuV$t9P5`m)F2w1?t6{<8%wk{w-PP#Sj#%1MbsjrSI6n;D_@8q9`~W98dNQf$j=iI z6~hpgww&be%X_HI50Hhx@W==u4TLPB;ei-J-1}G8wH}|{i#Lk-WZAyfv}k4y0|fvU zZTy^$u6L>2nWo(NDSV2@MRD}JQ4(c%G%=dG@_vxH?>gcH#*Ue2HC}9sapf8X?R$Z;XEnm&g zW99mh)5jNw008mK8)r^`_{yH0rNn%u1|SpC(tjf#om=+r#lh+?Kb>DVb9`|C0Bvbv zN3U(>f4-tAC1hosRoA7p(b(hL*V}(j>ug<`&U)|l$6o$)!>PBQ9RQSwn9asj2p*|xhU*R^vq?*Twb0t!lm5}`yW5lRy-U0ZYK?8to!;o!r!XeOE$ z0HB3T+6EEoI4PlR=wonwqJ+TvCoWh&$?CAPVYcU= zD{DS0?AkOtb@-hh^ZLq~FMjxYf19X?pa_YqtgZGvv2TaxcF#KT?O%=_*a-kW_;N|D zakkWsOe!)HsT5WRBiC+p;N-c>0Qwy(1D2MDBC595oXSiR07)sKNk-%9*rDBOO^HUD zZW#;)R&EZpqha<(HK$(tZYU#V29<@0qCXgU{gXeGpc_|pTqQD-WO|}%yKZbeX7k*H z2W~CK$v8NBAq~czrc5A(v51g0Wma7`G8}f=ZcuAiYYxZan@gP(;Ku66M6?bquGiHe z3Q0ya)%Lvk@kLixZfZyU@#UFbv+>pYhcj8TRKSr_sWG8i^X~UA**LvbD3(_Lba3xm ziYcpup*A9qJ$?AA=Og05lndxfwr`!C+O~h|B~4 z01q8H`StcY);%&mId7_+)76ovRpeNWRp&4M?#jx@|E-)x%P*A6t^fc407*qoM6N<$ Ef@ddc(f|Me diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white.png deleted file mode 100644 index 8b8b1ca0000bc8fa8d0379926736029f8fabe364..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-&H;pyTSqH(@-Vl>|&1p(LP>kg~E zYiz5X^`c$+%8#zC{u)yfe-5 zmgid={Z3k(ERKCKrE7DF;=x4^O+ pzO8rLO8p|Ip=x)jHOtWj`bJBmKdh_V<`47(gQu&X%Q~loCIFbEay|e6 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_acrobat.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_acrobat.png deleted file mode 100644 index 8f8095e46fa4965700afe1f9d065d8a37b101676..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 591 zcmV-V0~O9lw>B8WRlD)Gm}Jrz31u-X&&gn2lvjs=i{7nIaL6v2==uw+8Lcs(8j27 z;|c`rmSv@Lx!heopGP^^Ieb3f=R!%Lpp$}iMS-&P3EJ)s48wrJ_Ni0~k|c47D2nj= z{jS6bt|kFpFf|p5cM`_&0Zh|`rfEp0(}=}lT#(6RpzAsUfxv^LSYX>WlAaN$>)*J5 z0#sE+JRUD8iT9*fz{)_^7@6P&!sEjTcD+I9Z4YjT1`wH@fV{cEvneYGFU%maIEU2s55&K(LixD|{p-uiS@?KNj zk-Go8G$hH6g002ovPDHLkV1hVj1#|!a diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_actionscript.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_actionscript.png deleted file mode 100644 index 159b24075191fc259cfd80c797a1b0d74c168422..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 664 zcmV;J0%!e+P)7Z7t2}reCh0o`+ zAlt$F2tW%oO@m<=(B8a-_VgLl#~yUMUDWG!0qFPppd^03e+x1WpkO1NhIaKD2A)-@ z=Py8(Wi%R%JtYZG#sTKH@6Z+&!S3Edf8jFJJNKuva#KJQD3X^7;H^fd2di znEN&c58aUG>`>P{Vqq$kLb+TP{?I!d4(|o59X_%|nVEZq2Rk60n7072SWJ{64CV?3 zgS!EB=eYxwQ>P2&$}(iT6UMvuFgHHIEdNA29!EBtg=v~X!DxxEH~}L2zn|52%xalaq@DTdhh{EVwv0IaQ=!?daer zTKp4I`l8SDt;d{8Q`5Ko;BXUi&oAG1l4}59P-{|^S(Rmord5s6qsh<&m@Ab^wqCD) zHyRD}lKLDzpYN&@q5&*47mGzGiqcXpmqR9#K|CH8kXS4RNs`(iEF%HjP%f8ItyaZK z6$%Apvsok(2>~dTO5jTZfq;N?0ch4l01f$k9?4{~Youl-#x{UDMr#AFIkz@SDwPtQ z$gQ^$2|*(Ps9LQiav_8o8Ne<=Zx1*M*syo80sEO1tB%>5 zfdHB`1z+!R@?ghPRKmL)hWEvZE$=*54ose*0JiUNTM_)cMDXhxEKg(?-pD=y<)L4J zT0dSyD0&NhJ$^_8Ko9uom%-ZM4BTM{Tw$9qyPj=-9W;N(Wi@3*-Q4pq`Gcp}^vvNr zyd&PsmG>fpCSZz?K}UIEd;HGgG%0MG>ymxKPwy{>wy(m*Atq7)0000~7 zMNw2LQirBVQoa8G3P(rY+l;L4iy+JwSqmy$9JlSkk z&*$^Eg+c)@!R|v4gdc8+TTn&eWHO0VD&>$!B%o;;WLf4CNs=Inq9d`xA4otCWHK38 zmc{pkX`0Y=9g3oGK{}lVy~OYL|C5lQ&U^l;wrg|7w=BcA9L4-r411?K7f`@348&rw zXD#uW)DK;H`hxO}u%=@Cj{;#u#_;bb1_KgUOT2Hp6;)MvC6P$vQP3=g1O5#aU%I!K zZ1dc@f}YvG&*Spnplm2rIp^VdA^HydZ0X1axdms2!RKi5x-SFA4p@ zC@N|PI$ryHL@t-(!zBsf2-+sYAukhDHU7Lxm88-p zDk^c;sHj}OKUc4lGZU}6umlGVNAJx0%sKDOFwQx|V2pVvxhYKe|L9TNk!~md3BVrm zYPDL8Hk*yU-ER3~LGwJ7N`0ZV&nOhBI{~~A;@ND*=kxg?#^W&`4u`zk?Mg_e)8XlK z`T#M+OaR1!<#Nf_>$S`xrqd}OjYhoJ>q)?3vEX8pY&I()ERjfjrXM$k7e+-Qs3Ihj zNyOuEQ2EGYG7ro!o6VOBQEwuV2z)*tR8>WxP{616FY)p1Pn1d}#9}cxolZC$4n(6- z35hJq0;FlHC{ zp*iF(lgUK(E`($(s9pJ8Kn?(M734H_63WHtf}6SQQ_MXEP!#0|&@>J8dL5TfG&tBw z#tYn{TCGZvAr>cca%YYn^!t73tg8OOJ2FvJ(`YpCyVZi*?Ur+1uUA$hAg8-aK)c;e zQ<)!XwHh|n&ND=$@^)>aF-`~n}#*WMkD*M|f8r$i*z7+W! qF|A!t*4fE(R`<_YIkN&?Jng?3oQ|aAqClPi0000t>5xmo{nArfL4CJwMMm+N`pQ3p^Le$?rMud6Rbxz!-yG7bz2z$^USP5(;udf(gfQ zG~f68y^)EvcNWp#bUoDt2=h+^%o-?-|mo~iieWqLNP<0m@2PTB7ftyb= z@H`K$>v9Pr5X`L|rw&CEN2(9SB7A2SE;d|j9@*F}sd(@*2l|P*fWfK>1drZUrtUA7 zNXO~pKn1cjf~~TLbje1g>EPPzN2GH#UIBxJ{}S9=E`{zs-w#hO?vcH+hJxroI5v?j zD!4lP0WXq8zUx3RAP@|Gq$}6wXCjFLZY^YSWBxN9#&g)ro$%5}aYn#y=tJ_aIT%4d z5d4u`rlp!};XGmbZkJE*kYJoi&N0pd*yxY{0${xD;;Q1h^8f$<07*qoM6N<$f(}t7 Ae*gdg diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_code.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_code.png deleted file mode 100644 index 0c76bd1297751b66230f74719504b2adb02b1615..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 603 zcmV-h0;K(kP)^~*-1fljz_B$LUvK}k?BNXe#Y!m=zM!!V#}8bncK5m;8VP zw86G*RI63?Cd%b9bX|ueNlZ|wR6rj|r_)VIP@r2imh3?SN+^{|kY%~8B{maJ@F*OK z&VH9LwOeGt#DRjj0~v~8`>iO7!Ybi;zE$va`A^T#yW`y44;k^#O~K5*jD=qcUhPSc zvyy~q;5H_1WT1l~cqje9yfa+l!hu6xjdOJ8s;8E^+=QQ$tw p?%p!Hy#YapB=@+^9(46X{{RQg%9y;OKjr`c002ovPDHLkV1g7l326WT diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_code_red.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_code_red.png deleted file mode 100644 index 87a69145075afd8f8fd8b391c5da1249ec8b2889..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 587 zcmV-R0<`^!P)LWh{^|hy<@Q*xw+qo|KpY<+vaXbbW{L4q( zTsjXEJvb}e%bgb=o%W0h?4u1;^bWTqH8}5Th002ovPDHLkV1nrS0P+9; diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_coldfusion.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_coldfusion.png deleted file mode 100644 index c66011fb0fbdcbf210483d676b7131542a0e282b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 592 zcmV-W0k7R5;6x zlV4BMP#DI+Z{WQcKZBTk0lfkj5F$ztWhP#lcuyb@0@rA^#Kpu5KLA&Rgc}o#aSmis zrZC__xY^&#cI&!!{c|4Q_tcec*#b>|Y15wPcY2=o3;-Bl=(t4;6Ok*pL)-{*A;GX^ zS(@WGp6j~k1wBVR9)BB_gar`}HyRBXh7nM!)u5^>N~MyN6bc0-5{W?44iB<`2biXb zR;wk?jIQg@G!5l)SqhrXCU}x$GU-dY1sra}0uCq@153FUULT=jNwSk}0WBjKz}Jdu z<5gB*<^XtpAmp3m^ZEXQZWd1krhft}CoYaF4cSMvTJ01}X3X37KYdx-D0$c{doUe8 ztY{vlGr-e*;N!WAV%_hgUawyYrhegW>^F)pv%uUTFslHn; zvJ)l{%w(~{!O4`KTmK{Q{zCYltLfs&4?nz|6IdlqHCvX;|HGv~!QW?8P~_d#e0$v$ z)5XHEz{3>qMiH`1+qNYf?huS+@L`J9_$cjJF)Hf?@pu;)`9}BXwGUM{2!{y-4|Z{L zG>z?O%Cp8P5T#j1DID7u_*(Jg?7iss8AZQ+&;u_J{FmILf((9eoiL5nGUe>Fgq*U$z0000 zJ3A|*qoWOonz+4ZQ0KNhDB07SX1?#FrNy8%K)_l}y&kh`*KYdy`Y99&tgNgMLSSrc z?B?+B@HO@P-jS~z2Rgc6yy~Y~%>oJpBxsb$5<&nRLqiuR7K=@0SZj~jTs|sv_jWVX zGe?WflejOaq|Vec=s9+ahmXbyJ|T)Sl*?s82sr2H?Ce~HD5WI+Sz&tmWrN()wI2}+ zKqg92t*l^-#ae~;9%KFlWkmwnY=-UK`_|%ICZ#P1gdjK<2n38VXsuC7{WiU!fZFmm zW~Sda9(Qi@pxO}$ARY+;t##Ao27usOqNt7Hwq6K7G1il@xitj=LIM&{N&#SuX;x4x zmG6FhCg-$PI;hQ=;1iZ>F>^~@)IPi;l}fX?SZ!QiO=X<|pSVkNpJuLHzW(FT_~W-v z?vFpkyE>8ee4d=7wKauH5~dd_M7d2Aa=ICC{Nj7Blqv&DQEP#j_VeWV&WXL>c=LLK zsmYg^_JiDb;%U!UxO%qjFAvsDFj-kzT2$GbV(ZopPM$i$z`!7jvEk07BcC=6FMt4` z*0u3Sy`0b~%#(0000K diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_copy.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_copy.png deleted file mode 100644 index a9f31a278e17993d8d4e13beac2f9d5f7b42d08f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 309 zcmV-50m}Y~P)sF~CC`eaI+m%Y8jfzomMvZQaNUIT3LIrJ$h)_W{ zwF|LDNlB-g`Hb_G$;>3F$9JF3WYR|3fy2C+_wH}*xp!_4fF2UN4lt#d26oXwru}hT z0+0%Vz-l&|Tdh_L-Ng1G2*RBtBncRx;99K)&+}s0whhxXp{go}$g&Jk6k|vfypI5M z!1sNGVaV?!*L7i87Bo%cfO@?S`bajL{R<($@$|PtgBRcCGIJ_2a|&kO>G-s2aR3E4 zjssoScUa;zIdOeGHBnH13G)W-zt$kUQgNfG;96b=v&4NzRt&@7nN%v3HsG`<<+F$cumMs448N!W3r&2Z*b~D5^$^d6Jxn@SFK5Q8*uKSR7x{I|H-_N1f+AD zSYC5@2K4OKL$==F9U@CH;ONNL(W}oZICHn;d?~pw?GRIsH*x-68Oy6SuK`)`{E)46 z9^3(-HXa#X89SBv?u_YP)WjsQrp;}0X?Bxrvf12IKW8>3t`e~W9|JS<{btTNbNT@EQIWBSNJTX8AMGXD z-SsH|s#>j9Xf~VMtyT-YMD}5^SWHTY5->o`k|d#AE_YQd79j`%GMS7FNvG3b7^Vy9 zn0HYCJy5MyQLoqKnW|JOp-?D*<2V^msZ>BOv0ANd2n7t@{=V;sZrQ>3c})5_%ms4z z7!qXwHHe~!QFj8aR~&*-3F?O|;#(ESIXP~Os%|~y^7c15*q5`gz2-5ol!fU92NIGT z_ves+>+Tf3gfcL?!nimYmR}cw*|BGULzI^7!;k#3K^YO#;!+vM@N~(99+<;fdqr zYPJm+pXYFYk;neQyXXEcTQDNQx57i`Okp9A#n?<7!{#tnKJdsF>utb@JH7dU01gfL zEK2hoPZAnO5+je3&^i*hWM`qCW^vLK!O*?U-#IvXV?#6koWqrwnD{j&K`7N>^tR3G z8zr1(qVOzcF#nF1&0MZ5C$l8*E^Uth0000zE0Ay_3@1Z_7#f-XWL#E{8Al7>L$ z0Rx7lnddoqAyfT%&#`$;v0@*5YdW3w z7mLNoa=FAshK% zDiy@zakyMAxr-H?iQDZi^!t5;Eno2A=?>mMx`Vg(Z!?<53LHLvfTPa`$mjDcX*Qdv zR;ylN4OH+m)fVX&Z#yZpUae;ss@a$K&})gHovkhr@w#xyPVlfVgXti1_357y%I-UHDvRWYvPEX+#g+j4Q9ayba zh7uQN1j%HQgA=Fp9DfODAU^*3*FCs^6IpO7xg`RUXyP)(;=d!ly=#I^l3e0Cub`{H Z`5PU3+D2e&<<>s`J(VpX#y^kqzQ;#=2x({YMw9Q&ndHT&`BD$#%Ql?{+)-OuSA`r}MWJ zVg+2Gc(GW}a=BERPNy^;kEz$|38dTYlFQ{%5S!g@|8f8D_!Nu9_Ni2glF1}xG8xi! zorc39&F6EPOeWOt_XS`W2H_Bo$MXugy}SEctJQj=(TLXTHL(jRXfzs>NF=0SHk;94 zF!&HjdZNX(3U3;LY64IMX__Xv%_wjLC!J2`0Jw?X=zPK$C$`&dYPDKaC={e16bcE@ zgun^<0k;ak*=xLE)@(Lqu~MmsFoMCLY&0Qog`NO(h@kyxaA%EbwJLy8sU*Vi`~52K zX0wrqW;_LmMq@evX4iAM9Od(Q0eHP$1%L|xAh@vrqB`HPQLon}f3aAka=9!3hr=O- z5F9`#J_7Jhah=U(4RjaRhkS4Xkk98kDz-`i!r|~~AQ1TFcDw(@<8g{aBE)l)PNxNE zI(RPyc>9e{@WGSMU%i7*v{!&P$WLz25)0oc=Dl-yy%xYZAm4b-rttL7UjR#%`#j_F R;_m(?iiXTHIMmcoLoO94I8;j@ zv^2DJ5#orqydFJX|Gm$_Bi_vyew+j6{r}$Qc@D1%fQqeAhJj)1!z4pP83k2MV2~s! zSt^w(<#HLFVBg_#xz1W8ioi(WY&Hu~6zil?DI^jJgu`K35(hkP)H%@Imesbg#5!Ps_$Ni*SiR8&sKb9?M`0-mH)gtg&YgRX#*TXz@Z+| z;|2H@xzE0TfuORhuO2k6#K8#sW^J`mQ0+E@$K`QkFV+DTlI$w{GJ;zid{*v9xeIe_ z$|Bp`@iKkgoFK3{4Z)#DWKV~W4K@5WZN+Ql_7%YxNqSx7%cWud&cX>)_PvD*UzxZg a%Kia9Rjz_59@~-t0000)l$0ECbfb-0$}>7z|u>IvuoHEmW&j4lzv=KA+EpIObc7e7{sGA)QVmnM@*^ z%|h38^m;wC+ilpk%>l#V5LCqP_y2_Cayd^XlX;j*r54R*lW!zbqtSpQNyz8(JVmWm zyV4S$2{Uhyc{Cb0QQbf{ZGT{Kr zvJi{K_&f+q^Pv4MK$hhS4TgFj_FD*rLOePdE-E^T7ZzTFCRUB`*?9&h(a#C!-v8lWG#k3AOJQaUey6Oasked^kDPe=Khg@7s584 zg`XfS1)&u*_c;I76#%`kkBfiZgKKo@0)9d6vZw=ExQUtV?eW{Y1Xv}=4X(2zy85d> Y0C^(qLv?Ui{{R3007*qoM6N<$f-gW7od5s; diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_edit.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_edit.png deleted file mode 100644 index b93e77600def75c9a144d3d0a5088a62c02cbb0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmV-w0+s!VP)$>5Y&axjp2O=VLu>*f>1L;s0)kkvKC!*u?s6CVL=HJ6oP~pNfZc; zsKr=bq;7MITw8NXw{SZm%59TId2x_9BQ zV86`NuvGI!>o^V!Na!=$7GJE{Cq`b+XwknM{UcGHFTTfmuS+ zm-zYC!P3+zmY;SG$?!fYkOih`QYaLxyF}A86h$GGN}kFj)_o*0e zjPMP%zTG7FYMAfO2Nn1D`D0Cj?Wl>5q%@CE10nX)KxpNmwk+!IWkzywiYD( zqUXiYYIq3qcRyMGJ;IY`(Gz~E$J$zu2+R{)xGlE*88b3WK6V*J>}2iPY1HH|tER0W z_+^^FdppY?o)Gt5M2`%xwRDH@R3G}^i1l4|6uchm0X0f!@&YdVLB5K&dd7Rv{)DXX zt^&vP;}kqj3f>94j+4xd93>s|Q!Ezi>?r8(Il$P}PFxSqu{d*!Y%*#cX(R0f|Juz# z3o0_xI14Al->1uky@W-rCI_%l&>PK^TXNSN{byMk2AI5vbwp!K-%-@!-vPR3iikL1L7HA!^!~ChCFU#lnGzp88=I z67V8PHBo4(l$u?-AKmT8?#_0rKW9dUNRbpLc`}piywAM9$xZ-3fR1C75T(BjCn-l* zjUcci2oXXo-}iqun@#)+`W@kL_-U&|2>MxZy~3IdmRm&8b)9!2%ksg3R)nNnT*TJOC=6{2hG86Dz+<^p6qfG5$i^UNUh+u)CD7O2 zK>Ioazn;U|+X0x$=feveYZL1W*Fm%e5P1sajd#eW#^5(ddx76*pt$^)b}$Q4oPabL zLc^HF>Z{8za;f$LtN0P$6C?1{X*jtXkRJ8IEeyiSzencvH3Ux_y>y^}wfJrRCQN#9 z?&e+C>sSAfrE%mZD5RfZ`gSndD)=P?+nG5Oq$zmY&-v+gc7R6c0u8^Ke#|XOq?gF@othF3zFpM8Il<8BJrWqBtF>b#_ye4{0)Xbu6j&@UIhRE002ov JPDHLkV1nWI9dZBw diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_excel.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_excel.png deleted file mode 100644 index b977d7e52e2446ea01201c5c7209ac3a05f12c9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 663 zcmV;I0%-k-P)^@R5;6x zlTS!gQ5431_q{u#M2 zg&W%y6a}>qj1Z|7Vu&-DW6d~k-n;jnHsjb-q#u0C^W!_5^C=MlKq<8oNCQ6qS00!X z5eI;XP=g!^f}j{hku}E1zZ?XCjE;`p19k(Rh%^AQQ54xysU+ocx$c#f61Z4HnT#3u~FR(3>BnZniMIF4DouI8Hi4u>cAK%EN)5PO(ip3(% zIgBx+QYirR){Z8QwV$9Z(Mpt=L-Or3#bf-G@66}txq0yc*T(zNTBDT0T8rO^JeNbSI-Tzf5!pBioy4NwAN^?iN#{;fH1Jke4Xa`^fR8m z%h6dq%xX)S?7`zae))(Xst^Scp6B8FejQW?RLTM8@0=vnnntuRGBM2dpo>gbCnTD= z^<;=JuqdSf@O>Z8^XdR?s+KEfhDdB_#ahFj^giCtzT(s8kA$AViyTqaAR;KGaLzUU z<=GqA4bRwpX|IG~*x>pZ!@zLr`XQ`od>m(`;jz|M_*1GDO#$7;n74ppb8=eiqh760 x0yt}J1#p`gw$`o!R{d7zU9~!Un@nJV{4bstt4Au+Up@c;002ovPDHLkV1kWhGjjj{ diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_find.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_find.png deleted file mode 100644 index 581843637079359a6a58fcdccf0763690c67b063..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 676 zcmV;V0$crwP)_k3`4d{s8lK_6bi^@vq&To98fNoK}7)fx$e2^Y&@<^jR_Ee+8}KG;X`@ z@bCyiolqX>bb1ZIs%QGnjzFU~L8H~d?e;*XP(h(S262}XyZ3a0h07r{KV?E70l+e- zE`%3x|M5#q+;HOC(h@A^M)7Rn13dm0&>K$j%k_F4wOWlsNCIH+!c_#{eS&TL8v4yc zcpnPEY`cQzZ$ILq{U-MA6Z6Z|1p!FZjQ}tXSb25J@HphEqX-6Hqo?-_Zn@{d#>2Ml zJGhxTAd&emK$lV-QK&VM&ix0Xy{GyS3Wp(+E1^8BhD3T0a)m-Lw@Lu4zQRrP)9(3F z^>$hh@N>OAXrmPYunLi|fJ$_*5i`46;M>~*5D{bp>-OL3{+!MJa`3kv~Q#QfQ%c z)1s}QE<_XaYBG;IuRF=td#+}fi4h(6HgoUyJLi0t(*dA^B)%@8kkG&bdM5P5^Z5WF z%d%>m^SbN0XeV)wbUOXn5Ag#A$gJx+7-OCkMM1S%MWIlTkbFLmOeW(&n&wUd&;`>p zVcRy$Z{K0=?SpNnP^;BYEEXleFbq(UY&LrXX$6qkJ~)8+b{=jj3HEXds;Z(?D%}}L zX3`39&dy=Zyar!ehA}e>w)(*vrCct{PI9^2Jpj&OZS8<3-@{0(gNv%1{)zAiLY+_^ zl}e>Ofd4&#Irj#7>=o=Uhv5IJ@?sN0^J|(WL2Uun$4}si6}TG-s3T#p&6GE<<2W)O zf{^Y2HlO#*QDvTp3v&d@;8*}aUC4lisG9(w7@d5Y8y)}U#FwCkqp*Mcgme4{&gGRf zlBfd`nF9cQBKB2_L{F8G2)7pAf$i)Ds`|}-c>pc^LRW{w4SQ)3N^BbZx)6BlCZts! zKph%`(m#xg-q3I7=(us;9<)*2%iuQ1J`oV3gU6V~T}^JU5714JN33&GwEEru0d}Uo U{MPL+lmGw#07*qoM6N<$f^vibe*gdg diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_freehand.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_freehand.png deleted file mode 100644 index 8d719df5205f7415ce657e5c277db4533c82f346..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 639 zcmV-_0)YLAP)p{{sC7)XB-g4w*W1a1)XtvxrMYa1o?wn&v~3 zHnC|#(>B_M1d`_7gfzLiHy=0c<2kQQdXu*33(xYN_xYW39(cz9jEVT%VokB8|DoF~ z8u%Q5sdl@4VB7X#uh+v_;yOGY&pRi?378ghv)P1cngiAAb<}D#l*?rWDV0j_dc6Zk z-|P~AJZQCA=yWcQjG8fYnimzj*3KqTfN0Cy!G^$7)+bQ$+mHVd1J zvwOR^5Lm<|R+uyB1Nu4vL?d4qa3tn?9H7SZH@~u=fFHEDfSH|bHU6kh0O3%cLdyny z{`9S2Sw~WMy0MPy!64i`jdk4Z3>^+KIL_fN2V_d&ywBt`^IJpxUI$=YAph~5`;xCe Z{s%Y0vkUXDnO6V+002ovPDHLkV1loX8z=w( diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_gear.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_gear.png deleted file mode 100644 index 106f5aa3611a4807ec8c21701c631730275089a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 402 zcmV;D0d4+?P)<@FR}JvtGRKa0_WfK^c7uXaFH3q@Y!Hnl8VySc`OtkPN3;#l*y*l23+99h*9JzA00}rAC!#M1dZ#v9YOBH|eC*${MmzzYjBu!!-< zK8tujf&(6i)1biy*F>4{f*Kd(IU-JsG&#b_@NgTnx@40)2@2%c;*=?-2Za=}O}7&( w%_K#(S>e1j&gfY?mR})n>>0+8p`iTe2d1K2h8#$+)&Kwi07*qoM6N<$f(2cptN;K2 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_get.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_get.png deleted file mode 100644 index e4a1ecba1b60e54f3777717ed105cdde745b7184..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 516 zcmV+f0{i`mP)o)wchR-92qq~y6`XqbKmElbB3z{pkZs0VPF`CFvS?7jDn^mFo>d9Y&06* z&1MsS!M-CH3ee+h_sy)Ms%B*ec3R0RpVi9?*mU84yoq(Bw8 z<4(999dJJE!V%pWT~HGRIAb;(#O%2K3?uRpz}AfgE8e9q&OSdr^e^}lC$QXZz;S2A z)w>^oHy>?v)q--`!pmuBe96PxP0u*inQvyFW(llfv9 zXV1s*Jh`y2H%B3ZTA(AzpsQ?hb6_PyZ=c1?_B4fbl>G%!@ubJln=!)x0000#DY{xaiib^#X=YT4@yE_&2#eBulEdzjE`u&@G%2(&u{J-<}d(^uY4W_kMfEX z@!X)AR9F&FL?RJyJRUzvBoeqN{5kY`z3wcM0+du73~_0|*lac! z42Dw(Eg1o{Ash}P8jXrqN+1w`*XxDD;ShmPCZC7#4;wWbHoMvBl$=zF-`?*9j*Nbjd=v@OWt_BgKxP-3wd zy37?ATx&$b+&zRM!K;BD%Okw`Sb@&Pak8$KRX19jWZmC0&n*Ggv%j8nvSPDFw zEkV65AGOoBQ8kf`R|}Px*&INNS%osq9b{Fq2I(x6@xM>tg=vRLF?I`0rWzHyRc>}g~)F_Qn`A>)C_iwK%Z zrIJ;xR)UI1Y4Ozts|-Nho;q zVk9-bX)%F~!;63iu$Fk=VJn3~fmb5S@@)ZqjBT2{f`vT`b2}zxb0$o;EF@G3&BHK^ zc)`1kUzo^Qkk$?KFKHNBD?nP-MJ3b@&4fg;g5l2wMi^g?9qj+~@b;62o_U1_S1J`g z7m^UMg25FX1MJ5AQxAJ5F5WDt=$=-@JV-!LHA2vuxl9kN>PS8x??^AINH6LjF*#nbk4}=n3gfWp$kEX5IpHS zYiQ{@d7Nl&d$#+7-TckP&Q}N91e-C#5QQ<|d}62BjvZR2H60wE-&H<>}%WqH(_V;zPbB1rgSSSC(0? zWlQ#?N3UgnJ9m2C29w!SwoOo5_2Iq!<8vCyEoDoj@#oV($oJEg6Bj@;nD|2g8 s%L|>IZ381yx9RvPhV4J)*SeoEV4lyr#k*`nfWBbxboFyt=akR{0DpOPi2wiq diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_key.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_key.png deleted file mode 100644 index d61648452284da1bc28b10385f95b5d2bf027901..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 616 zcmV-u0+;=XP)-tZUVHjYHp;RjQ0M0pRlXN=mLv{hk9Ebp9&~+Wj-T9IkpzWPWd#fZ)d=zV^~S`;LE*!&u-?g42^wwN&Xr1~#d5ifl_2*B1OoS}CDno^8a50ArfE8;stQF>AP54J@H~%T zFz84s;dO!QJKD36(~!QOg!t_^gfFcSKDU4yK0+Ypg$NT^mIYcQ6bk*3P(lBLh7Df_ zTu=2xC#+-_%)|{Cv8zz0t|0y4D5M`xAc{gwOKc`ou<*&VjUREFHs1qd<_xSkKeTBt zgyCi=@jj;&Ns^GsWWaIUl0Y2azcDlF@u{(P*!+EH;lnU~b|Lv{4|4Hdkh!qoQHiE$ zY#y>KFA0QEw=4Z|uV{0A^`Y=D}hB$GP&<$bi8q(u;p^0(my3Rz7fP}|# zGZ&#uor4@c3q9r|f?H6-UZmfgKx(iV(MQ`MPWB>iC~SxnN5H*zb*A3#zWwgu&c|}3 zn^g87H{pdeasl%Lhmab&jC?lES}7C?4BFDNA<}20hoY@w_IU%i*T;}}wh!589}7~7 z#Ug`-R~4j&+K_y4kW@X7qLr-)S5qVKU)tO;+kXJ++{vPI@{hVK|PhMVVx_`)vx~zUs}c9O-Ok{00000NkvXXu0mjf DS5_-g diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_link.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_link.png deleted file mode 100644 index bf7bd1c9bfd78d689c73ba67cf914182933ee68c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 614 zcmV-s0-61ZP)OOAS;jTeL{ZSdz-%)SMH9tDF;N4B6%j=d15J&5qy`F#vB?Ar zqS1nH@%ny_XSI*Y>) z1f5QYdmzT>YciP<3WehS<{GovEaLGv27>{*-7f0&I$yJ^L%ZGPv1YT$V|u;*+ZCWz ztHI~CDVsuy($SfR6-`N~K?9GTB#l%%0h7 z-q`K-y~E)+s8lMyTrPL8^_pUo)9G|SluG5pPqw6!LJB_PzyJUM07*qoM6N<$f^=yZ AYybcN diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_magnify.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_magnify.png deleted file mode 100644 index f6b74cc40f82fc83e4dfa6e9647ccc1b34e6ed7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 554 zcmV+_0@eMAP)Vb2f>2}Fa82O3m(Ob=t*sniin`NpInLyMJgI`saru@YOPfh zy4g0#G*cV!#N%;Gq9_VH9?v%kjS3Rb1j8^;C={$Gp=lbj z*(?%?geA!5^Pok%UauwjA)v4g2`HedDw4_Mk4hhBQt?e7YJ5(hcj|3dNu^TOPGnjB zTTsqd3GIZ=Bb`n=7no)dflv&K(lsWw?lH6T1Yht0F9qgIuzh}ym0%n<3d3EBWB*pg z+G!I0lbAEXyd>k|QNuwr4=KX1D+tLPv)j@C1=N4sA4NF9A>HcO3G47*Y6!+SrUH-7 z1hb;^#S=r|`aMh>J#dWruAEf}gcR(DRUC`ZUev&$Sbh0SgLiTXeeHEU<$_YV;9281 zym`igIE%Sm8DpDw7@71Tv^EB5xSdUR*0$Mqp+Wq8OoaZtOg52&)zZ;;M=7#C1Yd6x svjx>8ad4e2x|*xHHwRjcjs6zA0XLDUqKT6dS^xk507*qoM6N<$f*wetruo^Ag2=LamM1T#~4RmC^m`_ zs}H7d&XJ}mg+hU?tu0noRvyjI&o2SRAeYZFesYkts79I^jJ7!A7%6nJwq8O?iT55M z1OQ` zbL{!Cp5o*IRmE9PInMCSPjTwfT~J+EYkz}tjxY=fg5Yf6EQ@DG$0kMJ9h^&$W}9BU zP1oj2;?MWVkKIEl)r=Y;L^Cx2q|>!)qJJ8zE7-V*-Cf7V8_2#1c0N975t~+&QUpQJ z5(uo(-O_`%Rj@U@t>JYAgd!>L?0Idxtd#oW2gc!jinsAEva8|kF4#Ic**mmml_{d^$s}Q5Q)KCys4sfck5bP1SyeHwh2`A<@N&t2j0^lgHC_^(pAAPCNjwl+>AN%C4Ll>_8Hjda%9 oS~i=#*e)>KsPlg0=2)Qg6BCqJ=F8HdGXMYp07*qoM6N<$f@i)wr~m)} diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_office.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_office.png deleted file mode 100644 index a65bcb3e1e9613cd9e4950850db43d7025a5fdf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 779 zcmV+m1N8ifP)JNR5;6x zll@CmQ5eTZ^k*a#RQf}fVOdd`5NJh6S(>6Cf$wEW#f&JyAR#GAn9>Gml;nOf3WCDa z5({5&UB$(IF?G#$x4X@Ickg!Y-HU!Z_rzX=qAq-XI_LS^=lOCT0|0{#{kBkYDS7{3 zD`iu%E=`cDX_^#^#n$5SIQ|4Zhsk8>N|zXHXG@*41$i-7`Jr{8`3S_OEcmY|RF48wXkk?WpdVM4OePBSbfh z#4_=eXJg@3epx~gi>QbUmO}Bm(ENN3+@c?jWiKvSrm(o|W}Ud*?vy~fn1!V~Cl4kB zI-;c!8f~-v)jX82%EG($>?;KSD$64f2&4qQ#=Yyrcpy$57RAVuV#vKMP)0hT$r6m# zc^F^XaJ8R9Q|}x^NoJYIvYZkq-z}Tnj@UJK2l2H zG}p+VvtjP2Z%bsb$~7QLJ9#pC0dKi`ppOd^_V;ME6tdzC0PtV|r=@e@37O`%0k^=5^`%cf$eu00N17Ro!{^30krz>a%3j34C?*{Mt2^a4~ zK=P+Qq%|f;Tc&+9ps;@Mw`EE%rgs&#y=j6BUGg96oIqdwj9-fiy*N(|@o)eD002ov JPDHLkV1j#pUPb@_ diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_paint.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_paint.png deleted file mode 100644 index 23a37b891c2f5faa3b8128d45373ceab794ca609..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 688 zcmV;h0#E&kP)PK^TXt2QS_@2qt2T|9~baC-vaPn=ziepcfAwB$0!O2Q)E}1e8!q+9)KT5JVKU z7HNY}h##OS-BxWHWjD0wrPDeEfUClHs%Q6&2u@FTOJkKMQN|_Rlw6rQz$gPzqGNtj z#ruSeFeh835JJFiM6vp@6M5bXj%k7CMt%SIwfbF_fD-3*Os`9Ly_Q3WQ_SX33E{pX z9_WIeeTCGQ3wYALpBcK+P-iuw;3i&7xCua37k5# z`>c`M@sGeC7cdsdz`aE9lOz!hPholbyz%T85LYf6O*@SA+9&+^7k>+4M8$A8iNQq{ zQvn8k?-+dU`Z@gK0z$EtPV#+`^OH`R@cE-cuE&_!D)SZGxmQxeobP_Zwq zMEgi6ePN45N`|V1so0uE8^}1xw8s;VM%Ai@7} z2-&Cyvez_-O4?6uv{zTaj|YeYEk34i~K@`8YW2g{x* zc;7z3lItpVy_et{Z-ZZ)<@*%{l7Ao8mu@V7*gz<_1##mwW*%LEwCdzNsVLYx2*T-J z#HeQ*_a=R~KDdVNk$EVgAIRl$oQi_(`_IrdJciDpH|Xe{K-YsMtc!cRnFi$qzsr4z z5*$;ecov%3->1{YNy6-Gf(Ecy&_I$CjI#laeuE+S120^|Vjsf)W&i*H07*qoM6N<$ Ef)^4A_ab^avY?n0hpS-#mn_4{O$e%cm-@NH=3`90Wq+3`~HKArSdfX`&Z12 z(CY$VW-MNtXX4xy%yUeE?}*~0-|iByA@ZrwXgph4S*bhcc5{HB!DFVm_v}P*g7+Q~K}7K0lcp(^N@X>U zV`{ZpeIf${R6Hgg4FL^`X$Eu75k(PE6ycl$AW0Ic)#@rR7Z(7;V?i-dR1K935Jgcx zPfkwK>2wGokf!Nih^ARp6-6arYFG#(9Ta!x93nFEjoA==z(g?#sDg?Owk?Mg7K+>l zWYsf(<`#+$h9Sp6gFOg_dd+80SkUpk&xM7h0`Sov9W73spU;GP073|VfZ&Gd$J$*0<~TV5aPS|qWH57|VJz+d0000vYep8SaFV10Q$h+;hIUPX_=v5b}%>Tm<(&j1&5;I!55C)oN0s(P%ZB zP3Q#ahfpXKWF@S?jm4U#fv)QovMhrriclyNs6-G12#3R##4PSZ0VY(dRWJ;Lwuq{# zAW0Gwi$yA^R4RZ!;W+L`f&%x{=D^VK#BBWL4Ys{;*!A7Q;!=dN<&D8*GzGaF4`hV4 zDbY0{NrMX>ZqF=0((gR5-zL$kC*b)!fwu{Euru|XrG<$^n#@)7i_>rCmRxnDq>$Y%gJaCkRd|tE*a2x05Pe!I^e13o69#&RQZ36s0 zB=O|K2Yi(jsMqThn}9t?f5E-)L^naZ+db$&%M$!bCdm=jv7?t_lB?3&%Ltq(>ESw? c;MI421LCcoDG!2@;{X5v07*qoM6N<$f`UZt7XSbN diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_picture.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_picture.png deleted file mode 100644 index 134b6693687b2fa5fe36d48a9c0b8001f937c741..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 650 zcmV;50(Jd~P)VHAd+bMNh~)LLRqN>D)-jd9UvB%+hyKX5U|&4t0)fzgD-MPpQ$nHU%yoz=vI zMGb>1Xu!6Hw$NT~@Au<4P-+{9;Uw?&oj31uzH>xX0T7Xkz!(tn|Ed9-s_FqyReC13 z(ll)vW1O{Ck5ihay12Ob2ABc@RUI;zHpaMiyRDs0r>|D4rHw{ItJSJnYjt~jTbGuW z`X(~}?!&86q40R8<4zYw;$qi0^3ec=c&<&H;r`8W%H=Xymf^i;Wo6~<+}zx2UMzpC z*6MZN?(FMv`n|KO3(KFiUaucP0;Z!@LcUNa%8#vGK5aZ>wDgB0Gi=t*argWJcdlMQ z2#MpEX0wU+9&0U?N(F#OgpviU_Y{jYMsj65U3|PjwUOY}lUYj?MTiK_Il}NCVx-Eh zDx-TzMk7se+M#W_>?A1-x}ZXw3kkyz5kW)_hkjsi@RhKadN#H$Hq)$07*qoM6N<$f}lhwPXGV_ diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_powerpoint.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_powerpoint.png deleted file mode 100644 index c4eff0387d5888c638ba09473ba6d2369f7b56f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 588 zcmV-S0<-;zP)HU2HvUSp%6 z*n}iP63IK?dpo;h@sj9~pcxo;VVTc-XLiP@DgefqE#NE=@oyUd-&HjLpsLIuSFXV-EMck)oQ(A`s%*^&wf0(rNiNHsU%=0Rw;WC z(kbc37l6fo`-0uR!pYkYv8U^3?nsh^@pw!K0TH3uYyx1_2>|JbXPmfskJ|1YAw9w! z9`N)1^Aesr;y5Nr5-ODn)oOL|CGi}f9!&iVwpK$khlIX10X$H6^A_stBJqvLhU$?V`QXqKme*s~gVDJ4A;LTs_e15jhc1;By a82kqHEPVYFAD2!50000JNR5;6( zlS@kiVHAe7MZY2;Xi-5)WxDDgv@tCUl*&p14T@Z~3ThM5LP4tuQfLu@EnG;nXc<8S z6&3BN?fx-cv-Kp6>HRiNTHE>$X( zD&=w+?GWC>?RLAGC6Yix;an~UmSt)tSf}1VS6N1N2ONORdD? zaj}w6DAZZdOud9Ep?M?{iQWbE5^9HLLZZF|1kdy0Tu4InEuboP9@nvbZ-P0n4AZTy zyMRIxRDmUE#LdqYuD=-Qz4N^bC`_#S7vcLn1M}{J(Wl3#c4VWczu&)AjUlh(11>gp>f`wv{KnjF%!aA*Jk N002ovPDHLkV1kkt*XsZP diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_ruby.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_ruby.png deleted file mode 100644 index f59b7c4365fa1720af1aa04eb47167ddaa6eeed4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 626 zcmV-&0*(ENP)ZS(e|#C2>JN4>y}l*tQ*E7zP@R2CCJnkW?xa6bgk%(hgtZ z0=~d?U3i`+Mvi4!&~+WPT1^NX#{u6&QIx+DE(oR{&T5&-ovF?@wGw)P&AtpHZa|G%V*GUUqL@@!d4V$`8=##4)ytY959JG zdc&Kho)&AL70^i z!PEmeeDWCB-UbK(*4JST44^tV2z_J(dn~+vBMJT97_7rzFio=~XczIv?PQ5$v%u~y zu(bteXb5I1h2zCV{Jc2~V{{yzZipgsP6;k264$*#5q?GzCm|CPa9CKqm4b116h3Pu z?+%Cm52plC8|5P0@igf2GV1KkCfk{Zecu=G@VNrf>s%g9c5D%@cfxVb6$nY`1IW=4 zt10QqSps_2JLp0f3I0j0u>#qA;v!+T))KEbCg|mo3q0pG{OR}p0fPds8+K~d>Hq)$ M07*qoM6N<$g1S2e3jhEB diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_stack.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_stack.png deleted file mode 100644 index 44084add79b9a0fc3354d16bbd4b4b5ff8095da7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$R@9E+gqH(@-qA%AW0|7U8+xDRI z0k`B18}ImRw2g{jTGP$Pmx3yI6F_2s&$|`cJ!i0UN zB3H;=r{#{FwLaNVJ&hZl9+MTHGx1T^-A=Q0?hRb#8a~x50X%;`b6ik3cw=#XdxWy= zgrpBoDjpwP&g9<9h3x!k_B!?vuTJVkmIJ-U N;OXk;vd$@?2>|rNdMN+^ diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_star.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_star.png deleted file mode 100644 index 3a1441c9a12062a4bb3d706000d3ca14399aebca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmV-50?Pe~P)SCZIX8XZzY2l?gCw6LlgWJ5Avz#QX4|&mI8LN)w~J1vgL=KLAhlWz*=#m~gyvxa z&;iC6gb?aZvMdXxX`<0+D1hs_pqJ!wxqlEH;CJ)je~uL(gpi@v>!I0f_Kl=E(E+Tq z26na*9gribxx-Oft(HnstyXUUy!39&E-cI%J5Rsy;(PGZH{g{ty!HVC&yGPT3H8x# zw{^gBPW)O0FMoh{k%l<`1a|To_Wl&u&-GXm8izU|&<&utILc4wc6s@u1bmTz6x{qg zTw@7=FQRcg&r`h+gcR$*Jbv+*DPk7v)B@e0o2 z6IlBXW&8xh@9)YKiV~2>+z&XKd24JT55YWz&JtfvCg4r^~bLP79-yS@n$OW00000NkvXXu0mjf DStt2z diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_swoosh.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_swoosh.png deleted file mode 100644 index e7708292adabf4821612bfca032cbd019c63180b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 634 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 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_width.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_width.png deleted file mode 100644 index 1eb880947ddf3e745c29e8d9dc90f09c7e6e323c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$R?&;zfqH(@;q9b3Efq-lM(nr^( z=EYR73-9e)UYMWsXy%?aZsD68Yyv^2$~6QgEcljw%kx>O(f-gQ?@fOOx3A-0+Qw?O zRx~W)kn~Qe2d6f9nMG#g9Q04Mk==M~N!Dglvxk!fgVh#w@ZV$IY1+Xc`d{d2UcaP~ zfWp)_Ivqj}l2SPy^9ZWy6rG9Yx4v67_uA&&9|XA~5-#3)W3%em1peD8RWH^#O%XoM zxMPud%}GTj#~*+7JMxTd!`{^Q+>(D3*|@KV`*G2;{QnANOxu1$r2xIe;OXk;vd$@? F2>@zac~<}c diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_word.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_word.png deleted file mode 100644 index ae8ecbf47672a874c0958d0d113a56162c2bd364..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 651 zcmV;60(AX}P)hkjP zNW|QGv-YFNLN^qH@tJycPNG5ti6B7;r4mEr#lr@*T8*M85D`{ZR^BWwF23T<%MYIh zdC)S*p=|xk^!~H=+HSZ183~y8v4|mYmZxt&)5{{~>J`>E223Q5>T$=~mtA71q-jdG z+eJhOAyBW^0k9Gk1+rX8)zFx((CG^&tDY>6XaS~Fy!WJON|Gdujg5^~Vzt@o%BcYLiNiTQSD`zL^ociBz_>bDlpw3kriQ@Z`bVsGz-_6N>$&gTDiKDTKR^ z-hB*tHa^>!oD~5TK^0UK5rZ}RBm50Bv}S-yA%s=Ha5RYb{)!z2N&$&64gfhybBu8p lh~_|?8^bu;BRYt{<}Yrwd83Y=s?Goa002ovPDHLkV1l%3CP4rI diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_world.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_world.png deleted file mode 100644 index 6ed2490ed1432d5d667a76235360824a1088e928..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 734 zcmV<40wMj0P)JT{hN;C#tgf#9krG=I>5!<*aE1_(spcgF}<`n4i zJi-}^6UUeU4jUFwdCiVPDm%`Zx^UBa8J(mnR6wEgz^}o8;)M*Y(@l_!Kfv)}4+NuM zaPXE50z)r)9=D=SR|RIqfQ^j}Hu!fzMeQBo+@PZk1G8hOw|vBTvkx`HM)Xe9q3xao z@`p0`NO!2904FHSLA6E@Y-O6zH$DQzvq@aHsz}}<(!v(Z_+EodX%R&NZW75g+nENo zV0020rxE^;7d!067AN>6*+&YLp$9uH6F-=In`XC{Cn%+o|5)b&boEPr02w@|P*oGm QmjD0&07*qoM6N<$g78X0Q~&?~ diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_wrench.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_wrench.png deleted file mode 100644 index fecadd08afed92536be91ab12d8e37b6bf410d5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 613 zcmV-r0-F7aP)wK%m(L+9IV|s|#(WRl-O^4GvaQsnHq|OstfO zIJ3}3<01}YGARE4m!7=)QisvlHUo!Qymx-@-t*p_129Ko-#pVI)6#!*kLj-AGXWNR zyA_{wKii_amK7^YT-v z6#plaNm#8`-kz@OvjIt^4%IN{@J3bR zRI}ME1Mv85p|%;RK>ViR>APPLB4;;BpCtqE@P+*7!G>I4UjNx~e>r3HA^tWCQ@S)l z{BslcSwL-CxQ&_ZZSv_g0Tu{yi*X){Mt|W7)lbE`SQxFP00000NkvXXu0mjf;)M*S diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_zip.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_zip.png deleted file mode 100644 index fd4bbccdf1643f4ff5022fbc59b82546e259317e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 386 zcmV-|0e$|7P)_QM!1S$Bhw4w+iRuFWf;tfR6D%SMJrb+tx zC9R6{2>Ou6#juIy6u(I?|;&Owi$sRB4^20apB5xE2 z#B9XekY66S6lzfCL!eEQRgo0LokTA55@Y#%_wN!TXPw^Q4IIXsG~v#u_4t;x_HM16EQ@QRY+rut&97&UefsPmLrQ5P zBC2kcbux9L%2bJz$P$XV$*zSxb2e@6_3O#;&!FD<&hLjGn%~%en;7)djE^d6!t$lW7GyIOKlQ46hr`Z zjLNuRDP_53dNoN?wd&HMgL^m1DXFU<5dQsrceN>fSz00000)O9XRTN^$%%`*Fg>ryDtc(lF@?b>dE!20r+y z#Q*>(wbV5H`-E4Do={CJp7=ERhw15hgZi)?jRG88 zzVz(5;g?Td1izJyO33bhjg2Qc7FVY@f9!o)Gu?DII~vm-Dc?}3M!fsgjP?F(7`rgg z+xOk8XD)e?Zl=5+un`5!7kr?F=eq)K-5uqr%yU$1hLv){Vlm=)*5~`lwMciiXFu*g z)*Jkz6AF>#zb(Vx`Iv{bdGZHtlW)v(y5k^|xgSUc9%0}S20nrYrO}78ofk?bV!5)4 z=Ngz@+$9N1>>mA%IWx`Fqa240bWkiW;2TZgd8CZS0U}@mknC;!2;wi$eI@`h0y2JS`Eae0CW}q(2(%!m8 zWq$`PDU>LT1_y*bBv#P5<@q0@ttz$hIH}YMDvAigCc=y*)jY-VOpTd;A8@3t7Xh4r z0KTWOk;N2Ox4!&&^4B*no$WtTX!BXB)rg!y8dvGgKBQKLJNXRRp0}Bsjd1|LNQX~c zbC~fjrk2iL@4dYF*vt;}dFn(%h)n_-vzEIHMOKRkdF%3Lq|zBgKm_h>TEq!))nWjq zzn;B!?!(dQcHu$#=JF`cS&W~C`WHFW^B!~MI#k)>1Vk&eQy8P1O`J6V04{D@|7d6^ zyBABnh-d^H0FX&L07M||E0n_dp4v&Q%PSE9p#R#Hq)`5I_(B5CE#q dxjPz0{s-<+c#AC!i7@~G002ovPDHLkV1iPlpuqqD diff --git a/node_modules/express/node_modules/connect/lib-cov/public/style.css b/node_modules/express/node_modules/connect/lib-cov/public/style.css deleted file mode 100644 index 32b6507..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/public/style.css +++ /dev/null @@ -1,141 +0,0 @@ -body { - margin: 0; - padding: 80px 100px; - font: 13px "Helvetica Neue", "Lucida Grande", "Arial"; - background: #ECE9E9 -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fff), to(#ECE9E9)); - background: #ECE9E9 -moz-linear-gradient(top, #fff, #ECE9E9); - background-repeat: no-repeat; - color: #555; - -webkit-font-smoothing: antialiased; -} -h1, h2, h3 { - margin: 0; - font-size: 22px; - color: #343434; -} -h1 em, h2 em { - padding: 0 5px; - font-weight: normal; -} -h1 { - font-size: 60px; -} -h2 { - margin-top: 10px; -} -h3 { - margin: 5px 0 10px 0; - padding-bottom: 5px; - border-bottom: 1px solid #eee; - font-size: 18px; -} -ul { - margin: 0; - padding: 0; -} -ul li { - margin: 5px 0; - padding: 3px 8px; - list-style: none; -} -ul li:hover { - cursor: pointer; - color: #2e2e2e; -} -ul li .path { - padding-left: 5px; - font-weight: bold; -} -ul li .line { - padding-right: 5px; - font-style: italic; -} -ul li:first-child .path { - padding-left: 0; -} -p { - line-height: 1.5; -} -a { - color: #555; - text-decoration: none; -} -a:hover { - color: #303030; -} -#stacktrace { - margin-top: 15px; -} -.directory h1 { - margin-bottom: 15px; - font-size: 18px; -} -ul#files { - width: 100%; - height: 500px; -} -ul#files li { - padding: 0; -} -ul#files li img { - position: absolute; - top: 5px; - left: 5px; -} -ul#files li a { - position: relative; - display: block; - margin: 1px; - width: 30%; - height: 25px; - line-height: 25px; - text-indent: 8px; - float: left; - border: 1px solid transparent; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - overflow: hidden; - text-overflow: ellipsis; -} -ul#files li a.icon { - text-indent: 25px; -} -ul#files li a:focus, -ul#files li a:hover { - outline: none; - background: rgba(255,255,255,0.65); - border: 1px solid #ececec; -} -ul#files li a.highlight { - -webkit-transition: background .4s ease-in-out; - background: #ffff4f; - border-color: #E9DC51; -} -#search { - display: block; - position: fixed; - top: 20px; - right: 20px; - width: 90px; - -webkit-transition: width ease 0.2s, opacity ease 0.4s; - -moz-transition: width ease 0.2s, opacity ease 0.4s; - -webkit-border-radius: 32px; - -moz-border-radius: 32px; - -webkit-box-shadow: inset 0px 0px 3px rgba(0, 0, 0, 0.25), inset 0px 1px 3px rgba(0, 0, 0, 0.7), 0px 1px 0px rgba(255, 255, 255, 0.03); - -moz-box-shadow: inset 0px 0px 3px rgba(0, 0, 0, 0.25), inset 0px 1px 3px rgba(0, 0, 0, 0.7), 0px 1px 0px rgba(255, 255, 255, 0.03); - -webkit-font-smoothing: antialiased; - text-align: left; - font: 13px "Helvetica Neue", Arial, sans-serif; - padding: 4px 10px; - border: none; - background: transparent; - margin-bottom: 0; - outline: none; - opacity: 0.7; - color: #888; -} -#search:focus { - width: 120px; - opacity: 1.0; -} diff --git a/node_modules/express/node_modules/connect/lib-cov/utils.js b/node_modules/express/node_modules/connect/lib-cov/utils.js deleted file mode 100644 index 2200dce..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/utils.js +++ /dev/null @@ -1,282 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['utils.js']) { - _$jscoverage['utils.js'] = []; - _$jscoverage['utils.js'][13] = 0; - _$jscoverage['utils.js'][26] = 0; - _$jscoverage['utils.js'][27] = 0; - _$jscoverage['utils.js'][39] = 0; - _$jscoverage['utils.js'][40] = 0; - _$jscoverage['utils.js'][41] = 0; - _$jscoverage['utils.js'][54] = 0; - _$jscoverage['utils.js'][55] = 0; - _$jscoverage['utils.js'][56] = 0; - _$jscoverage['utils.js'][57] = 0; - _$jscoverage['utils.js'][73] = 0; - _$jscoverage['utils.js'][74] = 0; - _$jscoverage['utils.js'][95] = 0; - _$jscoverage['utils.js'][96] = 0; - _$jscoverage['utils.js'][97] = 0; - _$jscoverage['utils.js'][98] = 0; - _$jscoverage['utils.js'][101] = 0; - _$jscoverage['utils.js'][112] = 0; - _$jscoverage['utils.js'][113] = 0; - _$jscoverage['utils.js'][132] = 0; - _$jscoverage['utils.js'][133] = 0; - _$jscoverage['utils.js'][147] = 0; - _$jscoverage['utils.js'][148] = 0; - _$jscoverage['utils.js'][149] = 0; - _$jscoverage['utils.js'][166] = 0; - _$jscoverage['utils.js'][167] = 0; - _$jscoverage['utils.js'][168] = 0; - _$jscoverage['utils.js'][169] = 0; - _$jscoverage['utils.js'][184] = 0; - _$jscoverage['utils.js'][185] = 0; - _$jscoverage['utils.js'][186] = 0; - _$jscoverage['utils.js'][187] = 0; - _$jscoverage['utils.js'][188] = 0; - _$jscoverage['utils.js'][189] = 0; - _$jscoverage['utils.js'][190] = 0; - _$jscoverage['utils.js'][191] = 0; - _$jscoverage['utils.js'][192] = 0; - _$jscoverage['utils.js'][196] = 0; - _$jscoverage['utils.js'][208] = 0; - _$jscoverage['utils.js'][209] = 0; - _$jscoverage['utils.js'][222] = 0; - _$jscoverage['utils.js'][223] = 0; - _$jscoverage['utils.js'][224] = 0; - _$jscoverage['utils.js'][225] = 0; - _$jscoverage['utils.js'][226] = 0; - _$jscoverage['utils.js'][228] = 0; - _$jscoverage['utils.js'][239] = 0; - _$jscoverage['utils.js'][240] = 0; - _$jscoverage['utils.js'][241] = 0; - _$jscoverage['utils.js'][242] = 0; - _$jscoverage['utils.js'][267] = 0; - _$jscoverage['utils.js'][276] = 0; - _$jscoverage['utils.js'][277] = 0; - _$jscoverage['utils.js'][278] = 0; - _$jscoverage['utils.js'][279] = 0; - _$jscoverage['utils.js'][292] = 0; - _$jscoverage['utils.js'][293] = 0; - _$jscoverage['utils.js'][305] = 0; - _$jscoverage['utils.js'][306] = 0; - _$jscoverage['utils.js'][307] = 0; - _$jscoverage['utils.js'][308] = 0; - _$jscoverage['utils.js'][319] = 0; - _$jscoverage['utils.js'][320] = 0; - _$jscoverage['utils.js'][321] = 0; - _$jscoverage['utils.js'][322] = 0; - _$jscoverage['utils.js'][334] = 0; - _$jscoverage['utils.js'][335] = 0; - _$jscoverage['utils.js'][346] = 0; - _$jscoverage['utils.js'][347] = 0; - _$jscoverage['utils.js'][350] = 0; - _$jscoverage['utils.js'][351] = 0; - _$jscoverage['utils.js'][355] = 0; - _$jscoverage['utils.js'][358] = 0; - _$jscoverage['utils.js'][369] = 0; - _$jscoverage['utils.js'][370] = 0; - _$jscoverage['utils.js'][371] = 0; - _$jscoverage['utils.js'][372] = 0; - _$jscoverage['utils.js'][374] = 0; - _$jscoverage['utils.js'][386] = 0; -} -_$jscoverage['utils.js'][13]++; -var http = require("http"), crypto = require("crypto"), parse = require("url").parse, signature = require("cookie-signature"); -_$jscoverage['utils.js'][26]++; -exports.hasBody = (function (req) { - _$jscoverage['utils.js'][27]++; - return "transfer-encoding" in req.headers || "content-length" in req.headers; -}); -_$jscoverage['utils.js'][39]++; -exports.mime = (function (req) { - _$jscoverage['utils.js'][40]++; - var str = req.headers["content-type"] || ""; - _$jscoverage['utils.js'][41]++; - return str.split(";")[0]; -}); -_$jscoverage['utils.js'][54]++; -exports.error = (function (code, msg) { - _$jscoverage['utils.js'][55]++; - var err = new Error(msg || http.STATUS_CODES[code]); - _$jscoverage['utils.js'][56]++; - err.status = code; - _$jscoverage['utils.js'][57]++; - return err; -}); -_$jscoverage['utils.js'][73]++; -exports.md5 = (function (str, encoding) { - _$jscoverage['utils.js'][74]++; - return crypto.createHash("md5").update(str).digest(encoding || "hex"); -}); -_$jscoverage['utils.js'][95]++; -exports.merge = (function (a, b) { - _$jscoverage['utils.js'][96]++; - if (a && b) { - _$jscoverage['utils.js'][97]++; - for (var key in b) { - _$jscoverage['utils.js'][98]++; - a[key] = b[key]; -} - } - _$jscoverage['utils.js'][101]++; - return a; -}); -_$jscoverage['utils.js'][112]++; -exports.escape = (function (html) { - _$jscoverage['utils.js'][113]++; - return String(html).replace(/&(?!\w+;)/g, "&").replace(//g, ">").replace(/"/g, """); -}); -_$jscoverage['utils.js'][132]++; -exports.uid = (function (len) { - _$jscoverage['utils.js'][133]++; - return crypto.randomBytes(Math.ceil(len * 3 / 4)).toString("base64").slice(0, len); -}); -_$jscoverage['utils.js'][147]++; -exports.sign = (function (val, secret) { - _$jscoverage['utils.js'][148]++; - console.warn("do not use utils.sign(), use https://github.com/visionmedia/node-cookie-signature"); - _$jscoverage['utils.js'][149]++; - return val + "." + crypto.createHmac("sha256", secret).update(val).digest("base64").replace(/=+$/, ""); -}); -_$jscoverage['utils.js'][166]++; -exports.unsign = (function (val, secret) { - _$jscoverage['utils.js'][167]++; - console.warn("do not use utils.unsign(), use https://github.com/visionmedia/node-cookie-signature"); - _$jscoverage['utils.js'][168]++; - var str = val.slice(0, val.lastIndexOf(".")); - _$jscoverage['utils.js'][169]++; - return exports.sign(str, secret) == val? str: false; -}); -_$jscoverage['utils.js'][184]++; -exports.parseSignedCookies = (function (obj, secret) { - _$jscoverage['utils.js'][185]++; - var ret = {}; - _$jscoverage['utils.js'][186]++; - Object.keys(obj).forEach((function (key) { - _$jscoverage['utils.js'][187]++; - var val = obj[key]; - _$jscoverage['utils.js'][188]++; - if (0 == val.indexOf("s:")) { - _$jscoverage['utils.js'][189]++; - val = signature.unsign(val.slice(2), secret); - _$jscoverage['utils.js'][190]++; - if (val) { - _$jscoverage['utils.js'][191]++; - ret[key] = val; - _$jscoverage['utils.js'][192]++; - delete obj[key]; - } - } -})); - _$jscoverage['utils.js'][196]++; - return ret; -}); -_$jscoverage['utils.js'][208]++; -exports.parseSignedCookie = (function (str, secret) { - _$jscoverage['utils.js'][209]++; - return 0 == str.indexOf("s:")? signature.unsign(str.slice(2), secret): str; -}); -_$jscoverage['utils.js'][222]++; -exports.parseJSONCookies = (function (obj) { - _$jscoverage['utils.js'][223]++; - Object.keys(obj).forEach((function (key) { - _$jscoverage['utils.js'][224]++; - var val = obj[key]; - _$jscoverage['utils.js'][225]++; - var res = exports.parseJSONCookie(val); - _$jscoverage['utils.js'][226]++; - if (res) { - _$jscoverage['utils.js'][226]++; - obj[key] = res; - } -})); - _$jscoverage['utils.js'][228]++; - return obj; -}); -_$jscoverage['utils.js'][239]++; -exports.parseJSONCookie = (function (str) { - _$jscoverage['utils.js'][240]++; - if (0 == str.indexOf("j:")) { - _$jscoverage['utils.js'][241]++; - try { - _$jscoverage['utils.js'][242]++; - return JSON.parse(str.slice(2)); - } - catch (err) { - } - } -}); -_$jscoverage['utils.js'][267]++; -exports.pause = require("pause"); -_$jscoverage['utils.js'][276]++; -exports.removeContentHeaders = (function (res) { - _$jscoverage['utils.js'][277]++; - Object.keys(res._headers).forEach((function (field) { - _$jscoverage['utils.js'][278]++; - if (0 == field.indexOf("content")) { - _$jscoverage['utils.js'][279]++; - res.removeHeader(field); - } -})); -}); -_$jscoverage['utils.js'][292]++; -exports.conditionalGET = (function (req) { - _$jscoverage['utils.js'][293]++; - return req.headers["if-modified-since"] || req.headers["if-none-match"]; -}); -_$jscoverage['utils.js'][305]++; -exports.unauthorized = (function (res, realm) { - _$jscoverage['utils.js'][306]++; - res.statusCode = 401; - _$jscoverage['utils.js'][307]++; - res.setHeader("WWW-Authenticate", "Basic realm=\"" + realm + "\""); - _$jscoverage['utils.js'][308]++; - res.end("Unauthorized"); -}); -_$jscoverage['utils.js'][319]++; -exports.notModified = (function (res) { - _$jscoverage['utils.js'][320]++; - exports.removeContentHeaders(res); - _$jscoverage['utils.js'][321]++; - res.statusCode = 304; - _$jscoverage['utils.js'][322]++; - res.end(); -}); -_$jscoverage['utils.js'][334]++; -exports.etag = (function (stat) { - _$jscoverage['utils.js'][335]++; - return "\"" + stat.size + "-" + Number(stat.mtime) + "\""; -}); -_$jscoverage['utils.js'][346]++; -exports.parseCacheControl = (function (str) { - _$jscoverage['utils.js'][347]++; - var directives = str.split(","), obj = {}; - _$jscoverage['utils.js'][350]++; - for (var i = 0, len = directives.length; i < len; i++) { - _$jscoverage['utils.js'][351]++; - var parts = directives[i].split("="), key = parts.shift().trim(), val = parseInt(parts.shift(), 10); - _$jscoverage['utils.js'][355]++; - obj[key] = isNaN(val)? true: val; -} - _$jscoverage['utils.js'][358]++; - return obj; -}); -_$jscoverage['utils.js'][369]++; -exports.parseUrl = (function (req) { - _$jscoverage['utils.js'][370]++; - var parsed = req._parsedUrl; - _$jscoverage['utils.js'][371]++; - if (parsed && parsed.href == req.url) { - _$jscoverage['utils.js'][372]++; - return parsed; - } - else { - _$jscoverage['utils.js'][374]++; - return req._parsedUrl = parse(req.url); - } -}); -_$jscoverage['utils.js'][386]++; -exports.parseBytes = require("bytes"); -_$jscoverage['utils.js'].source = ["","/*!"," * Connect - utils"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var http = require('http')"," , crypto = require('crypto')"," , parse = require('url').parse"," , signature = require('cookie-signature');","","/**"," * Return `true` if the request has a body, otherwise return `false`."," *"," * @param {IncomingMessage} req"," * @return {Boolean}"," * @api private"," */","","exports.hasBody = function(req) {"," return 'transfer-encoding' in req.headers || 'content-length' in req.headers;","};","","/**"," * Extract the mime type from the given request's"," * _Content-Type_ header."," *"," * @param {IncomingMessage} req"," * @return {String}"," * @api private"," */","","exports.mime = function(req) {"," var str = req.headers['content-type'] || '';"," return str.split(';')[0];","};","","/**"," * Generate an `Error` from the given status `code`"," * and optional `msg`."," *"," * @param {Number} code"," * @param {String} msg"," * @return {Error}"," * @api private"," */","","exports.error = function(code, msg){"," var err = new Error(msg || http.STATUS_CODES[code]);"," err.status = code;"," return err;","};","","/**"," * Return md5 hash of the given string and optional encoding,"," * defaulting to hex."," *"," * utils.md5('wahoo');"," * // => \"e493298061761236c96b02ea6aa8a2ad\""," *"," * @param {String} str"," * @param {String} encoding"," * @return {String}"," * @api private"," */","","exports.md5 = function(str, encoding){"," return crypto"," .createHash('md5')"," .update(str)"," .digest(encoding || 'hex');","};","","/**"," * Merge object b with object a."," *"," * var a = { foo: 'bar' }"," * , b = { bar: 'baz' };"," * "," * utils.merge(a, b);"," * // => { foo: 'bar', bar: 'baz' }"," *"," * @param {Object} a"," * @param {Object} b"," * @return {Object}"," * @api private"," */","","exports.merge = function(a, b){"," if (a && b) {"," for (var key in b) {"," a[key] = b[key];"," }"," }"," return a;","};","","/**"," * Escape the given string of `html`."," *"," * @param {String} html"," * @return {String}"," * @api private"," */","","exports.escape = function(html){"," return String(html)"," .replace(/&(?!\\w+;)/g, '&amp;')"," .replace(/</g, '&lt;')"," .replace(/>/g, '&gt;')"," .replace(/\"/g, '&quot;');","};","","","/**"," * Return a unique identifier with the given `len`."," *"," * utils.uid(10);"," * // => \"FDaS435D2z\""," *"," * @param {Number} len"," * @return {String}"," * @api private"," */","","exports.uid = function(len) {"," return crypto.randomBytes(Math.ceil(len * 3 / 4))"," .toString('base64')"," .slice(0, len);","};","","/**"," * Sign the given `val` with `secret`."," *"," * @param {String} val"," * @param {String} secret"," * @return {String}"," * @api private"," */","","exports.sign = function(val, secret){"," console.warn('do not use utils.sign(), use https://github.com/visionmedia/node-cookie-signature')"," return val + '.' + crypto"," .createHmac('sha256', secret)"," .update(val)"," .digest('base64')"," .replace(/=+$/, '');","};","","/**"," * Unsign and decode the given `val` with `secret`,"," * returning `false` if the signature is invalid."," *"," * @param {String} val"," * @param {String} secret"," * @return {String|Boolean}"," * @api private"," */","","exports.unsign = function(val, secret){"," console.warn('do not use utils.unsign(), use https://github.com/visionmedia/node-cookie-signature')"," var str = val.slice(0, val.lastIndexOf('.'));"," return exports.sign(str, secret) == val"," ? str"," : false;","};","","/**"," * Parse signed cookies, returning an object"," * containing the decoded key/value pairs,"," * while removing the signed key from `obj`."," *"," * @param {Object} obj"," * @return {Object}"," * @api private"," */","","exports.parseSignedCookies = function(obj, secret){"," var ret = {};"," Object.keys(obj).forEach(function(key){"," var val = obj[key];"," if (0 == val.indexOf('s:')) {"," val = signature.unsign(val.slice(2), secret);"," if (val) {"," ret[key] = val;"," delete obj[key];"," }"," }"," });"," return ret;","};","","/**"," * Parse a signed cookie string, return the decoded value"," *"," * @param {String} str signed cookie string"," * @param {String} secret"," * @return {String} decoded value"," * @api private"," */","","exports.parseSignedCookie = function(str, secret){"," return 0 == str.indexOf('s:')"," ? signature.unsign(str.slice(2), secret)"," : str;","};","","/**"," * Parse JSON cookies."," *"," * @param {Object} obj"," * @return {Object}"," * @api private"," */","","exports.parseJSONCookies = function(obj){"," Object.keys(obj).forEach(function(key){"," var val = obj[key];"," var res = exports.parseJSONCookie(val);"," if (res) obj[key] = res;"," });"," return obj;","};","","/**"," * Parse JSON cookie string"," *"," * @param {String} str"," * @return {Object} Parsed object or null if not json cookie"," * @api private"," */","","exports.parseJSONCookie = function(str) {"," if (0 == str.indexOf('j:')) {"," try {"," return JSON.parse(str.slice(2));"," } catch (err) {"," // no op"," }"," }","};","","/**"," * Pause `data` and `end` events on the given `obj`."," * Middleware performing async tasks _should_ utilize"," * this utility (or similar), to re-emit data once"," * the async operation has completed, otherwise these"," * events may be lost."," *"," * var pause = utils.pause(req);"," * fs.readFile(path, function(){"," * next();"," * pause.resume();"," * });"," *"," * @param {Object} obj"," * @return {Object}"," * @api private"," */","","exports.pause = require('pause');","","/**"," * Strip `Content-*` headers from `res`."," *"," * @param {ServerResponse} res"," * @api private"," */","","exports.removeContentHeaders = function(res){"," Object.keys(res._headers).forEach(function(field){"," if (0 == field.indexOf('content')) {"," res.removeHeader(field);"," }"," });","};","","/**"," * Check if `req` is a conditional GET request."," *"," * @param {IncomingMessage} req"," * @return {Boolean}"," * @api private"," */","","exports.conditionalGET = function(req) {"," return req.headers['if-modified-since']"," || req.headers['if-none-match'];","};","","/**"," * Respond with 401 \"Unauthorized\"."," *"," * @param {ServerResponse} res"," * @param {String} realm"," * @api private"," */","","exports.unauthorized = function(res, realm) {"," res.statusCode = 401;"," res.setHeader('WWW-Authenticate', 'Basic realm=\"' + realm + '\"');"," res.end('Unauthorized');","};","","/**"," * Respond with 304 \"Not Modified\"."," *"," * @param {ServerResponse} res"," * @param {Object} headers"," * @api private"," */","","exports.notModified = function(res) {"," exports.removeContentHeaders(res);"," res.statusCode = 304;"," res.end();","};","","/**"," * Return an ETag in the form of `\"<size>-<mtime>\"`"," * from the given `stat`."," *"," * @param {Object} stat"," * @return {String}"," * @api private"," */","","exports.etag = function(stat) {"," return '\"' + stat.size + '-' + Number(stat.mtime) + '\"';","};","","/**"," * Parse the given Cache-Control `str`."," *"," * @param {String} str"," * @return {Object}"," * @api private"," */","","exports.parseCacheControl = function(str){"," var directives = str.split(',')"," , obj = {};",""," for(var i = 0, len = directives.length; i < len; i++) {"," var parts = directives[i].split('=')"," , key = parts.shift().trim()"," , val = parseInt(parts.shift(), 10);",""," obj[key] = isNaN(val) ? true : val;"," }",""," return obj;","};","","/**"," * Parse the `req` url with memoization."," *"," * @param {ServerRequest} req"," * @return {Object}"," * @api private"," */","","exports.parseUrl = function(req){"," var parsed = req._parsedUrl;"," if (parsed && parsed.href == req.url) {"," return parsed;"," } else {"," return req._parsedUrl = parse(req.url);"," }","};","","/**"," * Parse byte `size` string."," *"," * @param {String} size"," * @return {Number}"," * @api private"," */","","exports.parseBytes = require('bytes');"]; diff --git a/node_modules/express/node_modules/connect/lib/connect.js b/node_modules/express/node_modules/connect/lib/connect.js index a067e24..d588ad2 100644 --- a/node_modules/express/node_modules/connect/lib/connect.js +++ b/node_modules/express/node_modules/connect/lib/connect.js @@ -1,4 +1,3 @@ - /*! * Connect * Copyright(c) 2010 Sencha Inc. @@ -29,7 +28,7 @@ exports = module.exports = createServer; * Framework version. */ -exports.version = '2.7.2'; +exports.version = '2.7.4'; /** * Expose mime module. @@ -63,7 +62,7 @@ exports.utils = utils; */ function createServer() { - function app(req, res){ app.handle(req, res); } + function app(req, res, next){ app.handle(req, res, next); } utils.merge(app, proto); utils.merge(app, EventEmitter.prototype); app.route = '/'; diff --git a/node_modules/express/node_modules/connect/lib/middleware/basicAuth.js b/node_modules/express/node_modules/connect/lib/middleware/basicAuth.js index 0205812..bc7ec97 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/basicAuth.js +++ b/node_modules/express/node_modules/connect/lib/middleware/basicAuth.js @@ -69,13 +69,13 @@ module.exports = function basicAuth(callback, realm) { var parts = authorization.split(' '); - if (parts.length !== 2) return next(400); + if (parts.length !== 2) return next(utils.error(400)); var scheme = parts[0] , credentials = new Buffer(parts[1], 'base64').toString() , index = credentials.indexOf(':'); - if ('Basic' != scheme || index < 0) return next(400); + if ('Basic' != scheme || index < 0) return next(utils.error(400)); var user = credentials.slice(0, index) , pass = credentials.slice(index + 1); diff --git a/node_modules/express/node_modules/connect/lib/middleware/compress.js b/node_modules/express/node_modules/connect/lib/middleware/compress.js index 2dc6437..e71ea8c 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/compress.js +++ b/node_modules/express/node_modules/connect/lib/middleware/compress.js @@ -63,15 +63,20 @@ module.exports = function compress(options) { var names = Object.keys(exports.methods) , filter = options.filter || exports.filter; - return function(req, res, next){ + return function compress(req, res, next){ var accept = req.headers['accept-encoding'] + , vary = res.getHeader('Vary') , write = res.write , end = res.end , stream , method; // vary - res.setHeader('Vary', 'Accept-Encoding'); + if (!vary) { + res.setHeader('Vary', 'Accept-Encoding'); + } else if (!~vary.indexOf('Accept-Encoding')) { + res.setHeader('Vary', vary + ', Accept-Encoding'); + } // proxy @@ -93,7 +98,7 @@ module.exports = function compress(options) { var encoding = res.getHeader('Content-Encoding') || 'identity'; // already encoded - if ('identity' != encoding) return; + if ('identity' != encoding) return; // default request filter if (!filter(req, res)) return; diff --git a/node_modules/express/node_modules/connect/lib/middleware/cookieSession.js b/node_modules/express/node_modules/connect/lib/middleware/cookieSession.js index 1a23d57..402fd55 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/cookieSession.js +++ b/node_modules/express/node_modules/connect/lib/middleware/cookieSession.js @@ -65,6 +65,7 @@ module.exports = function cookieSession(options){ // cookieParser secret if (!options.secret && req.secret) { req.session = req.signedCookies[key] || {}; + req.session.cookie = cookie; } else { // TODO: refactor var rawCookie = req.cookies[key]; @@ -73,6 +74,7 @@ module.exports = function cookieSession(options){ if (unsigned) { var originalHash = crc32.signed(unsigned); req.session = utils.parseJSONCookie(unsigned) || {}; + req.session.cookie = cookie; } } } diff --git a/node_modules/express/node_modules/connect/lib/middleware/csrf.js b/node_modules/express/node_modules/connect/lib/middleware/csrf.js index 5d5e7c6..e3c353e 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/csrf.js +++ b/node_modules/express/node_modules/connect/lib/middleware/csrf.js @@ -51,7 +51,7 @@ module.exports = function csrf(options) { var val = value(req); // check - if (val != token) return next(403); + if (val != token) return next(utils.error(403)); next(); } diff --git a/node_modules/express/node_modules/connect/lib/middleware/directory.js b/node_modules/express/node_modules/connect/lib/middleware/directory.js index 8fa008c..1c925a7 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/directory.js +++ b/node_modules/express/node_modules/connect/lib/middleware/directory.js @@ -16,6 +16,7 @@ var fs = require('fs') , parse = require('url').parse + , utils = require('../utils') , path = require('path') , normalize = path.normalize , extname = path.extname @@ -66,10 +67,10 @@ exports = module.exports = function directory(root, options){ , showUp = path != root && path != root + '/'; // null byte(s), bad request - if (~path.indexOf('\0')) return next(400); + if (~path.indexOf('\0')) return next(utils.error(400)); // malicious path, forbidden - if (0 != path.indexOf(root)) return next(403); + if (0 != path.indexOf(root)) return next(utils.error(403)); // check if we have a directory fs.stat(path, function(err, stat){ @@ -95,7 +96,7 @@ exports = module.exports = function directory(root, options){ } // not acceptable - next(406); + next(utils.error(406)); }); }); }; diff --git a/node_modules/express/node_modules/connect/lib/middleware/favicon.js b/node_modules/express/node_modules/connect/lib/middleware/favicon.js index c57bf34..ef54354 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/favicon.js +++ b/node_modules/express/node_modules/connect/lib/middleware/favicon.js @@ -1,4 +1,3 @@ - /*! * Connect - favicon * Copyright(c) 2010 Sencha Inc. @@ -39,7 +38,7 @@ var fs = require('fs') * Serve custom favicon: * * connect() - * .use(connect.favicon('public/favicon.ico)) + * .use(connect.favicon('public/favicon.ico')) * * @param {String} path * @param {Object} options diff --git a/node_modules/express/node_modules/connect/lib/middleware/json.js b/node_modules/express/node_modules/connect/lib/middleware/json.js index 200006b..17e5918 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/json.js +++ b/node_modules/express/node_modules/connect/lib/middleware/json.js @@ -68,19 +68,19 @@ exports = module.exports = function(options){ var first = buf.trim()[0]; if (0 == buf.length) { - return next(400, 'invalid json, empty body'); + return next(utils.error(400, 'invalid json, empty body')); } - if (strict && '{' != first && '[' != first) return next(400, 'invalid json'); + if (strict && '{' != first && '[' != first) return next(utils.error(400, 'invalid json')); try { req.body = JSON.parse(buf, options.reviver); - next(); } catch (err){ err.body = buf; err.status = 400; - next(err); + return next(err); } + next(); }); }); - } + }; }; diff --git a/node_modules/express/node_modules/connect/lib/middleware/limit.js b/node_modules/express/node_modules/connect/lib/middleware/limit.js index 614787d..8233b4d 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/limit.js +++ b/node_modules/express/node_modules/connect/lib/middleware/limit.js @@ -42,7 +42,7 @@ module.exports = function limit(bytes){ req._limit = true; // limit by content-length - if (len && len > bytes) return next(413); + if (len && len > bytes) return next(utils.error(413)); // limit req.on('data', function(chunk){ diff --git a/node_modules/express/node_modules/connect/lib/middleware/session.js b/node_modules/express/node_modules/connect/lib/middleware/session.js index f97b8d6..9be6c8b 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/session.js +++ b/node_modules/express/node_modules/connect/lib/middleware/session.js @@ -49,7 +49,7 @@ var warning = 'Warning: connection.session() MemoryStore is not\n' /** * Session: - * + * * Setup session store with the given `options`. * * Session data is _not_ saved in the cookie itself, however @@ -73,13 +73,13 @@ var warning = 'Warning: connection.session() MemoryStore is not\n' * Cookie option: * * By default `cookie.maxAge` is `null`, meaning no "expires" parameter is set - * so the cookie becomes a browser-session cookie. When the user closes the + * so the cookie becomes a browser-session cookie. When the user closes the * browser the cookie (and session) will be removed. * * ## req.session * * To store or access session data, simply use the request property `req.session`, - * which is (generally) serialized as JSON by the store, so nested objects + * which is (generally) serialized as JSON by the store, so nested objects * are typically fine. For example below is a user-specific view counter: * * connect() @@ -117,7 +117,7 @@ var warning = 'Warning: connection.session() MemoryStore is not\n' * req.session.destroy(function(err){ * // cannot access session here * }); - * + * * ## Session#reload() * * Reloads the session data. @@ -248,7 +248,7 @@ function session(options){ res.on('header', function(){ if (!req.session) return; var cookie = req.session.cookie - , proto = (req.headers['x-forwarded-proto'] || '').toLowerCase() + , proto = (req.headers['x-forwarded-proto'] || '').split(',')[0].toLowerCase().trim() , tls = req.connection.encrypted || (trustProxy && 'https' == proto) , secured = cookie.secure && tls , isNew = unsignedCookie != req.sessionID; @@ -256,6 +256,9 @@ function session(options){ // only send secure cookies via https if (cookie.secure && !secured) return debug('not secured'); + // long expires, handle expiry server-side + if (!isNew && cookie.hasLongExpires) return debug('already set cookie'); + // browser-session length cookie if (null == cookie.expires) { if (!isNew) return debug('already set browser-session cookie'); @@ -277,7 +280,8 @@ function session(options){ if (!req.session) return res.end(data, encoding); debug('saving'); req.session.resetMaxAge(); - req.session.save(function(){ + req.session.save(function(err){ + if (err) console.error(err.stack); debug('saved'); res.end(data, encoding); }); @@ -312,7 +316,7 @@ function session(options){ // error handling if (err) { - debug('error'); + debug('error %j', err); if ('ENOENT' == err.code) { generate(); next(); diff --git a/node_modules/express/node_modules/connect/lib/middleware/session/cookie.js b/node_modules/express/node_modules/connect/lib/middleware/session/cookie.js index e8ff862..cdce2a5 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/session/cookie.js +++ b/node_modules/express/node_modules/connect/lib/middleware/session/cookie.js @@ -43,7 +43,7 @@ Cookie.prototype = { * @param {Date} date * @api public */ - + set expires(date) { this._expires = date; this.originalMaxAge = this.maxAge; @@ -59,14 +59,14 @@ Cookie.prototype = { get expires() { return this._expires; }, - + /** * Set expires via max-age in `ms`. * * @param {Number} ms * @api public */ - + set maxAge(ms) { this.expires = 'number' == typeof ms ? new Date(Date.now() + ms) @@ -104,6 +104,18 @@ Cookie.prototype = { } }, + /** + * Check if the cookie has a reasonably large max-age. + * + * @return {Boolean} + * @api private + */ + + get hasLongExpires() { + var week = 604800000; + return this.maxAge > (4 * week); + }, + /** * Return a serialized cookie string. * @@ -121,7 +133,7 @@ Cookie.prototype = { * @return {Object} * @api private */ - + toJSON: function(){ return this.data; } diff --git a/node_modules/express/node_modules/connect/lib/middleware/static.js b/node_modules/express/node_modules/connect/lib/middleware/static.js index bb29d07..f69b58e 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/static.js +++ b/node_modules/express/node_modules/connect/lib/middleware/static.js @@ -1,4 +1,3 @@ - /*! * Connect - static * Copyright(c) 2010 Sencha Inc. @@ -35,6 +34,7 @@ var send = require('send') * - `maxAge` Browser cache maxAge in milliseconds. defaults to 0 * - `hidden` Allow transfer of hidden files. defaults to false * - `redirect` Redirect to trailing "/" when the pathname is a dir. defaults to true + * - `index` Default file name, defaults to 'index.html' * * @param {String} root * @param {Object} options @@ -77,6 +77,7 @@ exports = module.exports = function static(root, options){ send(req, path) .maxage(options.maxAge || 0) .root(root) + .index(options.index || 'index.html') .hidden(options.hidden) .on('error', error) .on('directory', directory) diff --git a/node_modules/express/node_modules/connect/lib/middleware/timeout.js b/node_modules/express/node_modules/connect/lib/middleware/timeout.js index a6dc087..dba4654 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/timeout.js +++ b/node_modules/express/node_modules/connect/lib/middleware/timeout.js @@ -1,4 +1,3 @@ - /*! * Connect - timeout * Ported from https://github.com/LearnBoost/connect-timeout @@ -36,7 +35,7 @@ module.exports = function timeout(ms) { }, ms); req.on('timeout', function(){ - if (req.headerSent) return debug('response started, cannot timeout'); + if (res.headerSent) return debug('response started, cannot timeout'); var err = new Error('Response timeout'); err.timeout = ms; err.status = 503; diff --git a/node_modules/express/node_modules/connect/lib/middleware/vhost.js b/node_modules/express/node_modules/connect/lib/middleware/vhost.js index 897a9d8..abbb050 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/vhost.js +++ b/node_modules/express/node_modules/connect/lib/middleware/vhost.js @@ -8,7 +8,7 @@ /** * Vhost: - * + * * Setup vhost for the given `hostname` and `server`. * * connect() @@ -17,7 +17,7 @@ * .use(connect.vhost('*.com', mainApp)) * * The `server` may be a Connect server or - * a regular Node `http.Server`. + * a regular Node `http.Server`. * * @param {String} hostname * @param {Server} server @@ -28,7 +28,7 @@ module.exports = function vhost(hostname, server){ if (!hostname) throw new Error('vhost hostname required'); if (!server) throw new Error('vhost server required'); - var regexp = new RegExp('^' + hostname.replace(/[*]/g, '(.*?)') + '$', 'i'); + var regexp = new RegExp('^' + hostname.replace(/[^*\w]/g, '\\$&').replace(/[*]/g, '(?:.*?)') + '$', 'i'); if (server.onvhost) server.onvhost(hostname); return function vhost(req, res, next){ if (!req.headers.host) return next(); diff --git a/node_modules/express/node_modules/connect/lib/proto.js b/node_modules/express/node_modules/connect/lib/proto.js index 889c237..b304cf7 100644 --- a/node_modules/express/node_modules/connect/lib/proto.js +++ b/node_modules/express/node_modules/connect/lib/proto.js @@ -106,7 +106,7 @@ app.handle = function(req, res, out) { , slashAdded = false , index = 0; - function next(err, msg) { + function next(err) { var layer, path, status, c; if (slashAdded) { @@ -118,15 +118,6 @@ app.handle = function(req, res, out) { req.originalUrl = req.originalUrl || req.url; removed = ''; - // next(status, msg) support - if (typeof err === 'number') { - var status = err; - var name = http.STATUS_CODES[status]; - err = new Error(msg || name); - err.name = name; - err.status = status; - } - // next callback layer = stack[index++]; diff --git a/node_modules/express/node_modules/connect/lib/utils.js b/node_modules/express/node_modules/connect/lib/utils.js index 47b30e0..2c03c28 100644 --- a/node_modules/express/node_modules/connect/lib/utils.js +++ b/node_modules/express/node_modules/connect/lib/utils.js @@ -41,6 +41,22 @@ exports.mime = function(req) { return str.split(';')[0]; }; +/** + * Generate an `Error` from the given status `code` + * and optional `msg`. + * + * @param {Number} code + * @param {String} msg + * @return {Error} + * @api private + */ + +exports.error = function(code, msg){ + var err = new Error(msg || http.STATUS_CODES[code]); + err.status = code; + return err; +}; + /** * Return md5 hash of the given string and optional encoding, * defaulting to hex. @@ -66,7 +82,7 @@ exports.md5 = function(str, encoding){ * * var a = { foo: 'bar' } * , b = { bar: 'baz' }; - * + * * utils.merge(a, b); * // => { foo: 'bar', bar: 'baz' } * @@ -116,7 +132,9 @@ exports.escape = function(html){ exports.uid = function(len) { return crypto.randomBytes(Math.ceil(len * 3 / 4)) .toString('base64') - .slice(0, len); + .slice(0, len) + .replace(/\//g, '-') + .replace(/\+/g, '_'); }; /** diff --git a/node_modules/express/node_modules/connect/node_modules/buffer-crc32/.npmignore b/node_modules/express/node_modules/connect/node_modules/buffer-crc32/.npmignore new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/buffer-crc32/.npmignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/buffer-crc32/.travis.yml b/node_modules/express/node_modules/connect/node_modules/buffer-crc32/.travis.yml new file mode 100644 index 0000000..7a902e8 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/buffer-crc32/.travis.yml @@ -0,0 +1,8 @@ +language: node_js +node_js: + - 0.6 + - 0.8 +notifications: + email: + recipients: + - brianloveswords@gmail.com \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/buffer-crc32/README.md b/node_modules/express/node_modules/connect/node_modules/buffer-crc32/README.md new file mode 100644 index 0000000..4ad5d64 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/buffer-crc32/README.md @@ -0,0 +1,33 @@ +# buffer-crc32 + +[![Build Status](https://secure.travis-ci.org/brianloveswords/buffer-crc32.png?branch=master)](http://travis-ci.org/brianloveswords/buffer-crc32) + +crc32 that works with binary data and fancy character sets, outputs +buffer, signed or unsigned data and has tests. + +Derived from the sample CRC implementation in the PNG specification: http://www.w3.org/TR/PNG/#D-CRCAppendix + +# install +``` +npm install buffer-crc32 +``` + +# example +```js +var crc32 = require('buffer-crc32'); +// works with buffers +var buf = Buffer([[0x00, 0x73, 0x75, 0x70, 0x20, 0x62, 0x72, 0x6f, 0x00]) +crc32(buf) // -> + +// has convenience methods for getting signed or unsigned ints +crc32.signed(buf) // -> -1805997238 +crc32.unsigned(buf) // -> 2488970058 + +// will cast to buffer if given a string, so you can +// directly use foreign characters safely +crc32('自動販売機') // -> +``` + +# tests +This was tested against the output of zlib's crc32 method. You can run +the tests with`npm test` (requires tap) diff --git a/node_modules/express/node_modules/connect/node_modules/buffer-crc32/index.js b/node_modules/express/node_modules/connect/node_modules/buffer-crc32/index.js new file mode 100644 index 0000000..ab0e19e --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/buffer-crc32/index.js @@ -0,0 +1,84 @@ +var Buffer = require('buffer').Buffer; + +var CRC_TABLE = [ + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, + 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, + 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, + 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, + 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, + 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, + 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, + 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, + 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, + 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, + 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, + 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, + 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, + 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, + 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, + 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, + 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, + 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, + 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, + 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, + 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, + 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, + 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, + 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, + 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, + 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, + 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, + 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, + 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, + 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, + 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, + 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, + 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, + 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, + 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, + 0x2d02ef8d +]; + +function bufferizeInt(num) { + var tmp = Buffer(4); + tmp.writeInt32BE(num, 0); + return tmp; +} + +function _crc32(buf) { + if (!Buffer.isBuffer(buf)) + buf = Buffer(buf); + var crc = 0xffffffff; + for (var n = 0; n < buf.length; n++) { + crc = CRC_TABLE[(crc ^ buf[n]) & 0xff] ^ (crc >>> 8); + } + return (crc ^ 0xffffffff); +} + +function crc32() { + return bufferizeInt(_crc32.apply(null, arguments)); +} +crc32.signed = function () { + return _crc32.apply(null, arguments); +}; +crc32.unsigned = function () { + return crc32.apply(null, arguments).readUInt32BE(0); +}; + +module.exports = crc32; diff --git a/node_modules/express/node_modules/connect/node_modules/buffer-crc32/package.json b/node_modules/express/node_modules/connect/node_modules/buffer-crc32/package.json new file mode 100644 index 0000000..d9b0b51 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/buffer-crc32/package.json @@ -0,0 +1,30 @@ +{ + "author": { + "name": "Brian J. Brennan", + "email": "brianloveswords@gmail.com", + "url": "http://bjb.io" + }, + "name": "buffer-crc32", + "description": "A pure javascript CRC32 algorithm that plays nice with binary data", + "version": "0.1.1", + "homepage": "https://github.com/brianloveswords/buffer-crc32", + "repository": { + "type": "git", + "url": "git://github.com/brianloveswords/buffer-crc32.git" + }, + "main": "index.js", + "scripts": { + "test": "./node_modules/.bin/tap tests/*.test.js" + }, + "dependencies": {}, + "devDependencies": { + "tap": "~0.2.5" + }, + "optionalDependencies": {}, + "engines": { + "node": "*" + }, + "readme": "# buffer-crc32\n\n[![Build Status](https://secure.travis-ci.org/brianloveswords/buffer-crc32.png?branch=master)](http://travis-ci.org/brianloveswords/buffer-crc32)\n\ncrc32 that works with binary data and fancy character sets, outputs\nbuffer, signed or unsigned data and has tests.\n\nDerived from the sample CRC implementation in the PNG specification: http://www.w3.org/TR/PNG/#D-CRCAppendix\n\n# install\n```\nnpm install buffer-crc32\n```\n\n# example\n```js\nvar crc32 = require('buffer-crc32');\n// works with buffers\nvar buf = Buffer([[0x00, 0x73, 0x75, 0x70, 0x20, 0x62, 0x72, 0x6f, 0x00])\ncrc32(buf) // -> \n\n// has convenience methods for getting signed or unsigned ints\ncrc32.signed(buf) // -> -1805997238\ncrc32.unsigned(buf) // -> 2488970058\n\n// will cast to buffer if given a string, so you can\n// directly use foreign characters safely\ncrc32('自動販売機') // -> \n```\n\n# tests\nThis was tested against the output of zlib's crc32 method. You can run\nthe tests with`npm test` (requires tap)\n", + "_id": "buffer-crc32@0.1.1", + "_from": "buffer-crc32@0.1.1" +} diff --git a/node_modules/express/node_modules/connect/node_modules/buffer-crc32/tests/crc.test.js b/node_modules/express/node_modules/connect/node_modules/buffer-crc32/tests/crc.test.js new file mode 100644 index 0000000..d4767e3 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/buffer-crc32/tests/crc.test.js @@ -0,0 +1,52 @@ +var crc32 = require('..'); +var test = require('tap').test; + +test('simple crc32 is no problem', function (t) { + var input = Buffer('hey sup bros'); + var expected = Buffer([0x47, 0xfa, 0x55, 0x70]); + t.same(crc32(input), expected); + t.end(); +}); + +test('another simple one', function (t) { + var input = Buffer('IEND'); + var expected = Buffer([0xae, 0x42, 0x60, 0x82]); + t.same(crc32(input), expected); + t.end(); +}); + +test('slightly more complex', function (t) { + var input = Buffer([0x00, 0x00, 0x00]); + var expected = Buffer([0xff, 0x41, 0xd9, 0x12]); + t.same(crc32(input), expected); + t.end(); +}); + +test('complex crc32 gets calculated like a champ', function (t) { + var input = Buffer('शीर्षक'); + var expected = Buffer([0x17, 0xb8, 0xaf, 0xf1]); + t.same(crc32(input), expected); + t.end(); +}); + +test('casts to buffer if necessary', function (t) { + var input = 'शीर्षक'; + var expected = Buffer([0x17, 0xb8, 0xaf, 0xf1]); + t.same(crc32(input), expected); + t.end(); +}); + +test('can do unsigned', function (t) { + var input = 'ham sandwich'; + var expected = -1891873021; + t.same(crc32.signed(input), expected); + t.end(); +}); + +test('can do signed', function (t) { + var input = 'bear sandwich'; + var expected = 3711466352; + t.same(crc32.unsigned(input), expected); + t.end(); +}); + diff --git a/node_modules/express/node_modules/connect/node_modules/bytes/History.md b/node_modules/express/node_modules/connect/node_modules/bytes/History.md index db1f759..1332808 100644 --- a/node_modules/express/node_modules/connect/node_modules/bytes/History.md +++ b/node_modules/express/node_modules/connect/node_modules/bytes/History.md @@ -1,4 +1,9 @@ +0.2.0 / 2012-10-28 +================== + + * bytes(200).should.eql('200b') + 0.1.0 / 2012-07-04 ================== diff --git a/node_modules/express/node_modules/connect/node_modules/bytes/index.js b/node_modules/express/node_modules/connect/node_modules/bytes/index.js index 3eaafc7..70b2e01 100644 --- a/node_modules/express/node_modules/connect/node_modules/bytes/index.js +++ b/node_modules/express/node_modules/connect/node_modules/bytes/index.js @@ -24,9 +24,9 @@ module.exports = function(size) { /** * convert bytes into string. - * + * * @param {Number} b - bytes to convert - * @return {String}i + * @return {String} * @api public */ @@ -35,5 +35,5 @@ function convert (b) { if (b >= gb) return (Math.round(b / gb * 100) / 100) + 'gb'; if (b >= mb) return (Math.round(b / mb * 100) / 100) + 'mb'; if (b >= kb) return (Math.round(b / kb * 100) / 100) + 'kb'; - return b; -} \ No newline at end of file + return b + 'b'; +} diff --git a/node_modules/express/node_modules/connect/node_modules/bytes/package.json b/node_modules/express/node_modules/connect/node_modules/bytes/package.json index 342d3d4..bd73098 100644 --- a/node_modules/express/node_modules/connect/node_modules/bytes/package.json +++ b/node_modules/express/node_modules/connect/node_modules/bytes/package.json @@ -6,22 +6,14 @@ "url": "http://tjholowaychuk.com" }, "description": "byte size string parser / serializer", - "version": "0.1.0", + "version": "0.2.0", "main": "index.js", "dependencies": {}, "devDependencies": { "mocha": "*", "should": "*" }, - "component": { - "scripts": { - "bytes": "index.js" - } - }, "readme": "# node-bytes\n\n Byte string parser / formatter.\n\n## Example:\n\n```js\nbytes('1kb')\n// => 1024\n\nbytes('2mb')\n// => 2097152\n\nbytes('1gb')\n// => 1073741824\n\nbytes(1073741824)\n// => 1gb\n```\n\n## Installation\n\n```\n$ npm install bytes\n$ component install visionmedia/bytes.js\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", - "_id": "bytes@0.1.0", - "dist": { - "shasum": "f77db4d8451430b81ac28de286a31ceb026a4067" - }, - "_from": "bytes@0.1.0" + "_id": "bytes@0.2.0", + "_from": "bytes@0.2.0" } diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/package.json b/node_modules/express/node_modules/connect/node_modules/formidable/package.json index ffa544c..6d368f3 100644 --- a/node_modules/express/node_modules/connect/node_modules/formidable/package.json +++ b/node_modules/express/node_modules/connect/node_modules/formidable/package.json @@ -23,8 +23,5 @@ "readme": "# Formidable\n\n[![Build Status](https://secure.travis-ci.org/felixge/node-formidable.png?branch=master)](http://travis-ci.org/felixge/node-formidable)\n\n## Purpose\n\nA node.js module for parsing form data, especially file uploads.\n\n## Current status\n\nThis module was developed for [Transloadit](http://transloadit.com/), a service focused on uploading\nand encoding images and videos. It has been battle-tested against hundreds of GB of file uploads from\na large variety of clients and is considered production-ready.\n\n## Features\n\n* Fast (~500mb/sec), non-buffering multipart parser\n* Automatically writing file uploads to disk\n* Low memory footprint\n* Graceful error handling\n* Very high test coverage\n\n## Changelog\n\n### v1.0.9\n\n* Emit progress when content length header parsed (Tim Koschützki)\n* Fix Readme syntax due to GitHub changes (goob)\n* Replace references to old 'sys' module in Readme with 'util' (Peter Sugihara)\n\n### v1.0.8\n\n* Strip potentially unsafe characters when using `keepExtensions: true`.\n* Switch to utest / urun for testing\n* Add travis build\n\n### v1.0.7\n\n* Remove file from package that was causing problems when installing on windows. (#102)\n* Fix typos in Readme (Jason Davies).\n\n### v1.0.6\n\n* Do not default to the default to the field name for file uploads where\n filename=\"\".\n\n### v1.0.5\n\n* Support filename=\"\" in multipart parts\n* Explain unexpected end() errors in parser better\n\n**Note:** Starting with this version, formidable emits 'file' events for empty\nfile input fields. Previously those were incorrectly emitted as regular file\ninput fields with value = \"\".\n\n### v1.0.4\n\n* Detect a good default tmp directory regardless of platform. (#88)\n\n### v1.0.3\n\n* Fix problems with utf8 characters (#84) / semicolons in filenames (#58)\n* Small performance improvements\n* New test suite and fixture system\n\n### v1.0.2\n\n* Exclude node\\_modules folder from git\n* Implement new `'aborted'` event\n* Fix files in example folder to work with recent node versions\n* Make gently a devDependency\n\n[See Commits](https://github.com/felixge/node-formidable/compare/v1.0.1...v1.0.2)\n\n### v1.0.1\n\n* Fix package.json to refer to proper main directory. (#68, Dean Landolt)\n\n[See Commits](https://github.com/felixge/node-formidable/compare/v1.0.0...v1.0.1)\n\n### v1.0.0\n\n* Add support for multipart boundaries that are quoted strings. (Jeff Craig)\n\nThis marks the beginning of development on version 2.0 which will include\nseveral architectural improvements.\n\n[See Commits](https://github.com/felixge/node-formidable/compare/v0.9.11...v1.0.0)\n\n### v0.9.11\n\n* Emit `'progress'` event when receiving data, regardless of parsing it. (Tim Koschützki)\n* Use [W3C FileAPI Draft](http://dev.w3.org/2006/webapi/FileAPI/) properties for File class\n\n**Important:** The old property names of the File class will be removed in a\nfuture release.\n\n[See Commits](https://github.com/felixge/node-formidable/compare/v0.9.10...v0.9.11)\n\n### Older releases\n\nThese releases were done before starting to maintain the above Changelog:\n\n* [v0.9.10](https://github.com/felixge/node-formidable/compare/v0.9.9...v0.9.10)\n* [v0.9.9](https://github.com/felixge/node-formidable/compare/v0.9.8...v0.9.9)\n* [v0.9.8](https://github.com/felixge/node-formidable/compare/v0.9.7...v0.9.8)\n* [v0.9.7](https://github.com/felixge/node-formidable/compare/v0.9.6...v0.9.7)\n* [v0.9.6](https://github.com/felixge/node-formidable/compare/v0.9.5...v0.9.6)\n* [v0.9.5](https://github.com/felixge/node-formidable/compare/v0.9.4...v0.9.5)\n* [v0.9.4](https://github.com/felixge/node-formidable/compare/v0.9.3...v0.9.4)\n* [v0.9.3](https://github.com/felixge/node-formidable/compare/v0.9.2...v0.9.3)\n* [v0.9.2](https://github.com/felixge/node-formidable/compare/v0.9.1...v0.9.2)\n* [v0.9.1](https://github.com/felixge/node-formidable/compare/v0.9.0...v0.9.1)\n* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0)\n* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0)\n* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0)\n* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0)\n* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0)\n* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0)\n* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0)\n* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0)\n* [v0.1.0](https://github.com/felixge/node-formidable/commits/v0.1.0)\n\n## Installation\n\nVia [npm](http://github.com/isaacs/npm):\n\n npm install formidable@latest\n\nManually:\n\n git clone git://github.com/felixge/node-formidable.git formidable\n vim my.js\n # var formidable = require('./formidable');\n\nNote: Formidable requires [gently](http://github.com/felixge/node-gently) to run the unit tests, but you won't need it for just using the library.\n\n## Example\n\nParse an incoming file upload.\n\n var formidable = require('formidable'),\n http = require('http'),\n\n util = require('util');\n\n http.createServer(function(req, res) {\n if (req.url == '/upload' && req.method.toLowerCase() == 'post') {\n // parse a file upload\n var form = new formidable.IncomingForm();\n form.parse(req, function(err, fields, files) {\n res.writeHead(200, {'content-type': 'text/plain'});\n res.write('received upload:\\n\\n');\n res.end(util.inspect({fields: fields, files: files}));\n });\n return;\n }\n\n // show a file upload form\n res.writeHead(200, {'content-type': 'text/html'});\n res.end(\n '
    '+\n '
    '+\n '
    '+\n ''+\n '
    '\n );\n }).listen(80);\n\n## API\n\n### formidable.IncomingForm\n\n__new formidable.IncomingForm()__\n\nCreates a new incoming form.\n\n__incomingForm.encoding = 'utf-8'__\n\nThe encoding to use for incoming form fields.\n\n__incomingForm.uploadDir = process.env.TMP || '/tmp' || process.cwd()__\n\nThe directory for placing file uploads in. You can move them later on using\n`fs.rename()`. The default directory is picked at module load time depending on\nthe first existing directory from those listed above.\n\n__incomingForm.keepExtensions = false__\n\nIf you want the files written to `incomingForm.uploadDir` to include the extensions of the original files, set this property to `true`.\n\n__incomingForm.type__\n\nEither 'multipart' or 'urlencoded' depending on the incoming request.\n\n__incomingForm.maxFieldsSize = 2 * 1024 * 1024__\n\nLimits the amount of memory a field (not file) can allocate in bytes.\nIf this value is exceeded, an `'error'` event is emitted. The default\nsize is 2MB.\n\n__incomingForm.hash = false__\n\nIf you want checksums calculated for incoming files, set this to either `'sha1'` or `'md5'`.\n\n__incomingForm.bytesReceived__\n\nThe amount of bytes received for this form so far.\n\n__incomingForm.bytesExpected__\n\nThe expected number of bytes in this form.\n\n__incomingForm.parse(request, [cb])__\n\nParses an incoming node.js `request` containing form data. If `cb` is provided, all fields an files are collected and passed to the callback:\n\n incomingForm.parse(req, function(err, fields, files) {\n // ...\n });\n\n__incomingForm.onPart(part)__\n\nYou may overwrite this method if you are interested in directly accessing the multipart stream. Doing so will disable any `'field'` / `'file'` events processing which would occur otherwise, making you fully responsible for handling the processing.\n\n incomingForm.onPart = function(part) {\n part.addListener('data', function() {\n // ...\n });\n }\n\nIf you want to use formidable to only handle certain parts for you, you can do so:\n\n incomingForm.onPart = function(part) {\n if (!part.filename) {\n // let formidable handle all non-file parts\n incomingForm.handlePart(part);\n }\n }\n\nCheck the code in this method for further inspiration.\n\n__Event: 'progress' (bytesReceived, bytesExpected)__\n\nEmitted after each incoming chunk of data that has been parsed. Can be used to roll your own progress bar.\n\n__Event: 'field' (name, value)__\n\nEmitted whenever a field / value pair has been received.\n\n__Event: 'fileBegin' (name, file)__\n\nEmitted whenever a new file is detected in the upload stream. Use this even if\nyou want to stream the file to somewhere else while buffering the upload on\nthe file system.\n\n__Event: 'file' (name, file)__\n\nEmitted whenever a field / file pair has been received. `file` is an instance of `File`.\n\n__Event: 'error' (err)__\n\nEmitted when there is an error processing the incoming form. A request that experiences an error is automatically paused, you will have to manually call `request.resume()` if you want the request to continue firing `'data'` events.\n\n__Event: 'aborted'__\n\nEmitted when the request was aborted by the user. Right now this can be due to a 'timeout' or 'close' event on the socket. In the future there will be a separate 'timeout' event (needs a change in the node core).\n\n__Event: 'end' ()__\n\nEmitted when the entire request has been received, and all contained files have finished flushing to disk. This is a great place for you to send your response.\n\n### formidable.File\n\n__file.size = 0__\n\nThe size of the uploaded file in bytes. If the file is still being uploaded (see `'fileBegin'` event), this property says how many bytes of the file have been written to disk yet.\n\n__file.path = null__\n\nThe path this file is being written to. You can modify this in the `'fileBegin'` event in\ncase you are unhappy with the way formidable generates a temporary path for your files.\n\n__file.name = null__\n\nThe name this file had according to the uploading client.\n\n__file.type = null__\n\nThe mime type of this file, according to the uploading client.\n\n__file.lastModifiedDate = null__\n\nA date object (or `null`) containing the time this file was last written to. Mostly\nhere for compatibility with the [W3C File API Draft](http://dev.w3.org/2006/webapi/FileAPI/).\n\n__file.hash = null__\n\nIf hash calculation was set, you can read the hex digest out of this var.\n\n## License\n\nFormidable is licensed under the MIT license.\n\n## Ports\n\n* [multipart-parser](http://github.com/FooBarWidget/multipart-parser): a C++ parser based on formidable\n\n## Credits\n\n* [Ryan Dahl](http://twitter.com/ryah) for his work on [http-parser](http://github.com/ry/http-parser) which heavily inspired multipart_parser.js\n", "_id": "formidable@1.0.11", "description": "[![Build Status](https://secure.travis-ci.org/felixge/node-formidable.png?branch=master)](http://travis-ci.org/felixge/node-formidable)", - "dist": { - "shasum": "ad0f4d5e15a21c0e87105b7073ea60c733d4a63b" - }, "_from": "formidable@1.0.11" } diff --git a/node_modules/express/node_modules/connect/node_modules/pause/package.json b/node_modules/express/node_modules/connect/node_modules/pause/package.json index 45b627f..1b66942 100644 --- a/node_modules/express/node_modules/connect/node_modules/pause/package.json +++ b/node_modules/express/node_modules/connect/node_modules/pause/package.json @@ -15,8 +15,5 @@ "main": "index", "readme": "\n# pause\n\n Pause streams...\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", "_id": "pause@0.0.1", - "dist": { - "shasum": "123a6498b6db7f27a7b6c6a0e506c555912e52bc" - }, "_from": "pause@0.0.1" } diff --git a/node_modules/express/node_modules/connect/node_modules/qs/package.json b/node_modules/express/node_modules/connect/node_modules/qs/package.json index 2b6117f..ebf4cc3 100644 --- a/node_modules/express/node_modules/connect/node_modules/qs/package.json +++ b/node_modules/express/node_modules/connect/node_modules/qs/package.json @@ -31,8 +31,5 @@ }, "readme": "# node-querystring\n\n query string parser for node and the browser supporting nesting, as it was removed from `0.3.x`, so this library provides the previous and commonly desired behaviour (and twice as fast). Used by [express](http://expressjs.com), [connect](http://senchalabs.github.com/connect) and others.\n\n## Installation\n\n $ npm install qs\n\n## Examples\n\n```js\nvar qs = require('qs');\n\nqs.parse('user[name][first]=Tobi&user[email]=tobi@learnboost.com');\n// => { user: { name: { first: 'Tobi' }, email: 'tobi@learnboost.com' } }\n\nqs.stringify({ user: { name: 'Tobi', email: 'tobi@learnboost.com' }})\n// => user[name]=Tobi&user[email]=tobi%40learnboost.com\n```\n\n## Testing\n\nInstall dev dependencies:\n\n $ npm install -d\n\nand execute:\n\n $ make test\n\nbrowser:\n\n $ open test/browser/index.html\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2010 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", "_id": "qs@0.5.1", - "dist": { - "shasum": "1a24b45e707f643afd6f530459c8c4dcb5904593" - }, "_from": "qs@0.5.1" } diff --git a/node_modules/express/node_modules/connect/package.json b/node_modules/express/node_modules/connect/package.json index dc7c736..ce1beac 100644 --- a/node_modules/express/node_modules/connect/package.json +++ b/node_modules/express/node_modules/connect/package.json @@ -1,6 +1,6 @@ { "name": "connect", - "version": "2.7.2", + "version": "2.7.4", "description": "High performance middleware framework", "keywords": [ "framework", @@ -24,8 +24,8 @@ "cookie-signature": "0.0.1", "buffer-crc32": "0.1.1", "cookie": "0.0.5", - "bytes": "0.1.0", "send": "0.1.0", + "bytes": "0.2.0", "fresh": "0.1.0", "pause": "0.0.1", "debug": "*" @@ -44,9 +44,6 @@ "test": "make" }, "readme": "[![build status](https://secure.travis-ci.org/senchalabs/connect.png)](http://travis-ci.org/senchalabs/connect)\n# Connect\n\n Connect is an extensible HTTP server framework for [node](http://nodejs.org), providing high performance \"plugins\" known as _middleware_.\n\n Connect is bundled with over _20_ commonly used middleware, including\n a logger, session support, cookie parser, and [more](http://senchalabs.github.com/connect). Be sure to view the 2.x [documentation](http://senchalabs.github.com/connect/).\n\n```js\nvar connect = require('connect')\n , http = require('http');\n\nvar app = connect()\n .use(connect.favicon())\n .use(connect.logger('dev'))\n .use(connect.static('public'))\n .use(connect.directory('public'))\n .use(connect.cookieParser())\n .use(connect.session({ secret: 'my secret here' }))\n .use(function(req, res){\n res.end('Hello from Connect!\\n');\n });\n\nhttp.createServer(app).listen(3000);\n```\n\n## Middleware\n\n - [csrf](http://www.senchalabs.org/connect/csrf.html)\n - [basicAuth](http://www.senchalabs.org/connect/basicAuth.html)\n - [bodyParser](http://www.senchalabs.org/connect/bodyParser.html)\n - [json](http://www.senchalabs.org/connect/json.html)\n - [multipart](http://www.senchalabs.org/connect/multipart.html)\n - [urlencoded](http://www.senchalabs.org/connect/urlencoded.html)\n - [cookieParser](http://www.senchalabs.org/connect/cookieParser.html)\n - [directory](http://www.senchalabs.org/connect/directory.html)\n - [compress](http://www.senchalabs.org/connect/compress.html)\n - [errorHandler](http://www.senchalabs.org/connect/errorHandler.html)\n - [favicon](http://www.senchalabs.org/connect/favicon.html)\n - [limit](http://www.senchalabs.org/connect/limit.html)\n - [logger](http://www.senchalabs.org/connect/logger.html)\n - [methodOverride](http://www.senchalabs.org/connect/methodOverride.html)\n - [query](http://www.senchalabs.org/connect/query.html)\n - [responseTime](http://www.senchalabs.org/connect/responseTime.html)\n - [session](http://www.senchalabs.org/connect/session.html)\n - [static](http://www.senchalabs.org/connect/static.html)\n - [staticCache](http://www.senchalabs.org/connect/staticCache.html)\n - [vhost](http://www.senchalabs.org/connect/vhost.html)\n - [subdomains](http://www.senchalabs.org/connect/subdomains.html)\n - [cookieSession](http://www.senchalabs.org/connect/cookieSession.html)\n\n## Running Tests\n\nfirst:\n\n $ npm install -d\n\nthen:\n\n $ make test\n\n## Authors\n\n Below is the output from [git-summary](http://github.com/visionmedia/git-extras).\n\n\n project: connect\n commits: 2033\n active : 301 days\n files : 171\n authors: \n 1414\tTj Holowaychuk 69.6%\n 298\tvisionmedia 14.7%\n 191\tTim Caswell 9.4%\n 51\tTJ Holowaychuk 2.5%\n 10\tRyan Olds 0.5%\n 8\tAstro 0.4%\n 5\tNathan Rajlich 0.2%\n 5\tJakub Nešetřil 0.2%\n 3\tDaniel Dickison 0.1%\n 3\tDavid Rio Deiros 0.1%\n 3\tAlexander Simmerl 0.1%\n 3\tAndreas Lind Petersen 0.1%\n 2\tAaron Heckmann 0.1%\n 2\tJacques Crocker 0.1%\n 2\tFabian Jakobs 0.1%\n 2\tBrian J Brennan 0.1%\n 2\tAdam Malcontenti-Wilson 0.1%\n 2\tGlen Mailer 0.1%\n 2\tJames Campos 0.1%\n 1\tTrent Mick 0.0%\n 1\tTroy Kruthoff 0.0%\n 1\tWei Zhu 0.0%\n 1\tcomerc 0.0%\n 1\tdarobin 0.0%\n 1\tnateps 0.0%\n 1\tMarco Sanson 0.0%\n 1\tArthur Taylor 0.0%\n 1\tAseem Kishore 0.0%\n 1\tBart Teeuwisse 0.0%\n 1\tCameron Howey 0.0%\n 1\tChad Weider 0.0%\n 1\tCraig Barnes 0.0%\n 1\tEran Hammer-Lahav 0.0%\n 1\tGregory McWhirter 0.0%\n 1\tGuillermo Rauch 0.0%\n 1\tJae Kwon 0.0%\n 1\tJakub Nesetril 0.0%\n 1\tJoshua Peek 0.0%\n 1\tJxck 0.0%\n 1\tAJ ONeal 0.0%\n 1\tMichael Hemesath 0.0%\n 1\tMorten Siebuhr 0.0%\n 1\tSamori Gorse 0.0%\n 1\tTom Jensen 0.0%\n\n## Node Compatibility\n\n Connect `< 1.x` is compatible with node 0.2.x\n\n\n Connect `1.x` is compatible with node 0.4.x\n\n\n Connect (_master_) `2.x` is compatible with node 0.6.x\n\n## CLA\n\n [http://sencha.com/cla](http://sencha.com/cla)\n\n## License\n\nView the [LICENSE](https://github.com/senchalabs/connect/blob/master/LICENSE) file. The [Silk](http://www.famfamfam.com/lab/icons/silk/) icons used by the `directory` middleware created by/copyright of [FAMFAMFAM](http://www.famfamfam.com/).\n", - "_id": "connect@2.7.2", - "dist": { - "shasum": "f42f5de3f331f5ba9fc4ab4373f7b665044f7eba" - }, - "_from": "connect@2.7.2" + "_id": "connect@2.7.4", + "_from": "connect@2.7.4" } diff --git a/node_modules/express/node_modules/connect/test.js b/node_modules/express/node_modules/connect/test.js index 142e9f2..92b7003 100644 --- a/node_modules/express/node_modules/connect/test.js +++ b/node_modules/express/node_modules/connect/test.js @@ -2,6 +2,39 @@ var connect = require('./'); var app = connect(); -app.use(connect.directory('.')); +app.use(connect.logger('dev')); +app.use(connect.bodyParser()); -app.listen(3000) \ No newline at end of file +app.use(function(req, res, next){ + if (req.checkContinue) { + res.writeContinue(); + } + res.end('hello'); +}); + +var server = app.listen(3000); + +server.on('checkContinue', function(req, res){ + req.checkContinue = true; + app(req, res); +}); + + +// var http = require('http'); + +// var app = http.createServer(function(req, res){ +// console.log(req.headers); +// }); + +// app.on('checkContinue', function(req, res){ +// if ('application/json' == req.headers['content-type']) { +// res.writeContinue(); +// console.log('ok'); +// res.end('thanks') +// } else { +// res.writeHead(400); +// res.end('bad request, json only'); +// } +// }); + +// app.listen(3000); diff --git a/node_modules/express/node_modules/cookie-signature/package.json b/node_modules/express/node_modules/cookie-signature/package.json index af97b3a..c750818 100644 --- a/node_modules/express/node_modules/cookie-signature/package.json +++ b/node_modules/express/node_modules/cookie-signature/package.json @@ -19,8 +19,5 @@ "main": "index", "readme": "\n# cookie-signature\n\n Sign and unsign cookies.\n\n## Example\n\n```js\nvar cookie = require('cookie-signature');\n\nvar val = cookie.sign('hello', 'tobiiscool');\nval.should.equal('hello.DGDUkGlIkCzPz+C0B064FNgHdEjox7ch8tOBGslZ5QI');\n\nvar val = cookie.sign('hello', 'tobiiscool');\ncookie.unsign(val, 'tobiiscool').should.equal('hello');\ncookie.unsign(val, 'luna').should.be.false;\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2012 LearnBoost <tj@learnboost.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", "_id": "cookie-signature@0.0.1", - "dist": { - "shasum": "2a3f58894fa067a047eb1d2503658e1f525b867b" - }, "_from": "cookie-signature@0.0.1" } diff --git a/node_modules/express/node_modules/cookie/package.json b/node_modules/express/node_modules/cookie/package.json index 98eaa8b..209dd28 100644 --- a/node_modules/express/node_modules/cookie/package.json +++ b/node_modules/express/node_modules/cookie/package.json @@ -28,8 +28,5 @@ }, "readme": "# cookie [![Build Status](https://secure.travis-ci.org/shtylman/node-cookie.png?branch=master)](http://travis-ci.org/shtylman/node-cookie) #\n\ncookie is a basic cookie parser and serializer. It doesn't make assumptions about how you are going to deal with your cookies. It basically just provides a way to read and write the HTTP cookie headers.\n\nSee [RFC6265](http://tools.ietf.org/html/rfc6265) for details about the http header for cookies.\n\n## how?\n\n```\nnpm install cookie\n```\n\n```javascript\nvar cookie = require('cookie');\n\nvar hdr = cookie.serialize('foo', 'bar');\n// hdr = 'foo=bar';\n\nvar cookies = cookie.parse('foo=bar; cat=meow; dog=ruff');\n// cookies = { foo: 'bar', cat: 'meow', dog: 'ruff' };\n```\n\n## more\n\nThe serialize function takes a third parameter, an object, to set cookie options. See the RFC for valid values.\n\n### path\n> cookie path\n\n### expires\n> absolute expiration date for the cookie (Date object)\n\n### maxAge\n> relative max age of the cookie from when the client receives it (seconds)\n\n### domain\n> domain for the cookie\n\n### secure\n> true or false\n\n### httpOnly\n> true or false\n\n", "_id": "cookie@0.0.5", - "dist": { - "shasum": "35227c1bbb219bc1ed9c04aad76353bf787d2053" - }, "_from": "cookie@0.0.5" } diff --git a/node_modules/express/node_modules/debug/package.json b/node_modules/express/node_modules/debug/package.json index 45cc845..2f6302d 100644 --- a/node_modules/express/node_modules/debug/package.json +++ b/node_modules/express/node_modules/debug/package.json @@ -32,8 +32,5 @@ }, "readme": "\n# debug\n\n tiny node.js debugging utility modelled after node core's debugging technique.\n\n## Installation\n\n```\n$ npm install debug\n```\n\n## Usage\n\n With `debug` you simply invoke the exported function to generate your debug function, passing it a name which will determine if a noop function is returned, or a decorated `console.error`, so all of the `console` format string goodies you're used to work fine. A unique color is selected per-function for visibility.\n \nExample _app.js_:\n\n```js\nvar debug = require('debug')('http')\n , http = require('http')\n , name = 'My App';\n\n// fake app\n\ndebug('booting %s', name);\n\nhttp.createServer(function(req, res){\n debug(req.method + ' ' + req.url);\n res.end('hello\\n');\n}).listen(3000, function(){\n debug('listening');\n});\n\n// fake worker of some kind\n\nrequire('./worker');\n```\n\nExample _worker.js_:\n\n```js\nvar debug = require('debug')('worker');\n\nsetInterval(function(){\n debug('doing some work');\n}, 1000);\n```\n\n The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples:\n\n ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png)\n\n ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png)\n\n## Millisecond diff\n\n When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the \"+NNNms\" will show you how much time was spent between calls.\n\n ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png)\n\n When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below:\n \n ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png)\n\n## Conventions\n\n If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use \":\" to separate features. For example \"bodyParser\" from Connect would then be \"connect:bodyParser\". \n\n## Wildcards\n\n The \"*\" character may be used as a wildcard. Suppose for example your library has debuggers named \"connect:bodyParser\", \"connect:compress\", \"connect:session\", instead of listing all three with `DEBUG=connect:bodyParser,connect.compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`.\n\n You can also exclude specific debuggers by prefixing them with a \"-\" character. For example, `DEBUG=* -connect:*` would include all debuggers except those starting with \"connect:\".\n\n## Browser support\n\n Debug works in the browser as well, currently persisted by `localStorage`. For example if you have `worker:a` and `worker:b` as shown below, and wish to debug both type `debug.enable('worker:*')` in the console and refresh the page, this will remain until you disable with `debug.disable()`. \n\n```js\na = debug('worker:a');\nb = debug('worker:b');\n\nsetInterval(function(){\n a('doing some work');\n}, 1000);\n\nsetInterval(function(){\n a('doing some work');\n}, 1200);\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", "_id": "debug@0.7.2", - "dist": { - "shasum": "a2a34d7d6d572e94b58fb3e99e5900232b6683da" - }, "_from": "debug@*" } diff --git a/node_modules/express/node_modules/fresh/package.json b/node_modules/express/node_modules/fresh/package.json index 79ffced..e1f985e 100644 --- a/node_modules/express/node_modules/fresh/package.json +++ b/node_modules/express/node_modules/fresh/package.json @@ -15,8 +15,5 @@ }, "readme": "\n# node-fresh\n\n HTTP response freshness testing\n\n## fresh(req, res)\n\n Check freshness of `req` and `res` headers.\n\n When the cache is \"fresh\" __true__ is returned,\n otherwise __false__ is returned to indicate that\n the cache is now stale.\n\n## Example:\n\n```js\nvar req = { 'if-none-match': 'tobi' };\nvar res = { 'etag': 'luna' };\nfresh(req, res);\n// => false\n\nvar req = { 'if-none-match': 'tobi' };\nvar res = { 'etag': 'tobi' };\nfresh(req, res);\n// => true\n```\n\n## Installation\n\n```\n$ npm install fresh\n```", "_id": "fresh@0.1.0", - "dist": { - "shasum": "06aa96c6ce440000a19f0cb7d47bef2c5996b242" - }, "_from": "fresh@0.1.0" } diff --git a/node_modules/express/node_modules/methods/package.json b/node_modules/express/node_modules/methods/package.json index bb5fb15..341b226 100644 --- a/node_modules/express/node_modules/methods/package.json +++ b/node_modules/express/node_modules/methods/package.json @@ -16,8 +16,5 @@ "license": "MIT", "_id": "methods@0.0.1", "readme": "ERROR: No README.md file found!", - "dist": { - "shasum": "c8850f8513a489f0de5c73ca86e7766d55f643ac" - }, "_from": "methods@0.0.1" } diff --git a/node_modules/express/node_modules/mkdirp/.gitignore.rej b/node_modules/express/node_modules/mkdirp/.gitignore.rej deleted file mode 100644 index 69244ff..0000000 --- a/node_modules/express/node_modules/mkdirp/.gitignore.rej +++ /dev/null @@ -1,5 +0,0 @@ ---- /dev/null -+++ .gitignore -@@ -0,0 +1,2 @@ -+node_modules/ -+npm-debug.log \ No newline at end of file diff --git a/node_modules/express/node_modules/mkdirp/.travis.yml b/node_modules/express/node_modules/mkdirp/.travis.yml index f1d0f13..84fd7ca 100644 --- a/node_modules/express/node_modules/mkdirp/.travis.yml +++ b/node_modules/express/node_modules/mkdirp/.travis.yml @@ -1,4 +1,5 @@ language: node_js node_js: - - 0.4 - 0.6 + - 0.8 + - 0.9 diff --git a/node_modules/express/node_modules/mkdirp/README.markdown b/node_modules/express/node_modules/mkdirp/README.markdown index 40de04f..83b0216 100644 --- a/node_modules/express/node_modules/mkdirp/README.markdown +++ b/node_modules/express/node_modules/mkdirp/README.markdown @@ -1,34 +1,37 @@ -mkdirp -====== +# mkdirp Like `mkdir -p`, but in node.js! [![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](http://travis-ci.org/substack/node-mkdirp) -example -======= +# example -pow.js ------- - var mkdirp = require('mkdirp'); +## pow.js + +```js +var mkdirp = require('mkdirp'); - mkdirp('/tmp/foo/bar/baz', function (err) { - if (err) console.error(err) - else console.log('pow!') - }); +mkdirp('/tmp/foo/bar/baz', function (err) { + if (err) console.error(err) + else console.log('pow!') +}); +``` Output - pow! + +``` +pow! +``` And now /tmp/foo/bar/baz exists, huzzah! -methods -======= +# methods +```js var mkdirp = require('mkdirp'); +``` -mkdirp(dir, mode, cb) ---------------------- +## mkdirp(dir, mode, cb) Create a new directory and any necessary subdirectories at `dir` with octal permission string `mode`. @@ -38,8 +41,7 @@ If `mode` isn't specified, it defaults to `0777 & (~process.umask())`. `cb(err, made)` fires with the error or the first directory `made` that had to be created, if any. -mkdirp.sync(dir, mode) ----------------------- +## mkdirp.sync(dir, mode) Synchronously create a new directory and any necessary subdirectories at `dir` with octal permission string `mode`. @@ -48,14 +50,14 @@ If `mode` isn't specified, it defaults to `0777 & (~process.umask())`. Returns the first directory that had to be created, if any. -install -======= +# install With [npm](http://npmjs.org) do: - npm install mkdirp +``` +npm install mkdirp +``` -license -======= +# license -MIT/X11 +MIT diff --git a/node_modules/express/node_modules/mkdirp/examples/pow.js.orig b/node_modules/express/node_modules/mkdirp/examples/pow.js.orig deleted file mode 100644 index 7741462..0000000 --- a/node_modules/express/node_modules/mkdirp/examples/pow.js.orig +++ /dev/null @@ -1,6 +0,0 @@ -var mkdirp = require('mkdirp'); - -mkdirp('/tmp/foo/bar/baz', 0755, function (err) { - if (err) console.error(err) - else console.log('pow!') -}); diff --git a/node_modules/express/node_modules/mkdirp/examples/pow.js.rej b/node_modules/express/node_modules/mkdirp/examples/pow.js.rej deleted file mode 100644 index 81e7f43..0000000 --- a/node_modules/express/node_modules/mkdirp/examples/pow.js.rej +++ /dev/null @@ -1,19 +0,0 @@ ---- examples/pow.js -+++ examples/pow.js -@@ -1,6 +1,15 @@ --var mkdirp = require('mkdirp').mkdirp; -+var mkdirp = require('../').mkdirp, -+ mkdirpSync = require('../').mkdirpSync; - - mkdirp('/tmp/foo/bar/baz', 0755, function (err) { - if (err) console.error(err) - else console.log('pow!') - }); -+ -+try { -+ mkdirpSync('/tmp/bar/foo/baz', 0755); -+ console.log('double pow!'); -+} -+catch (ex) { -+ console.log(ex); -+} \ No newline at end of file diff --git a/node_modules/express/node_modules/mkdirp/index.js b/node_modules/express/node_modules/mkdirp/index.js index 874b310..fda6de8 100644 --- a/node_modules/express/node_modules/mkdirp/index.js +++ b/node_modules/express/node_modules/mkdirp/index.js @@ -27,18 +27,10 @@ function mkdirP (p, mode, f, made) { }); break; - case 'EISDIR': - case 'EPERM': - // Operation not permitted or already is a dir. - // This is the error you get when trying to mkdir('c:/') - // on windows, or mkdir('/') on unix. Make sure it's a - // dir by falling through to the EEXIST case. - case 'EROFS': - // a read-only file system. - // However, the dir could already exist, in which case - // the EROFS error will be obscuring a EEXIST! - // Fallthrough to that case. - case 'EEXIST': + // In the case of any other error, just see if there's a dir + // there already. If so, then hooray! If not, then something + // is borked. + default: fs.stat(p, function (er2, stat) { // if the stat fails, then that's super weird. // let the original error be the failure reason. @@ -46,10 +38,6 @@ function mkdirP (p, mode, f, made) { else cb(null, made); }); break; - - default: - cb(er, made); - break; } }); } @@ -74,7 +62,10 @@ mkdirP.sync = function sync (p, mode, made) { sync(p, mode, made); break; - case 'EEXIST' : + // In the case of any other error, just see if there's a dir + // there already. If so, then hooray! If not, then something + // is borked. + default: var stat; try { stat = fs.statSync(p); @@ -84,9 +75,6 @@ mkdirP.sync = function sync (p, mode, made) { } if (!stat.isDirectory()) throw err0; break; - default : - throw err0 - break; } } diff --git a/node_modules/express/node_modules/mkdirp/package.json b/node_modules/express/node_modules/mkdirp/package.json index 7e3c355..1f2736d 100644 --- a/node_modules/express/node_modules/mkdirp/package.json +++ b/node_modules/express/node_modules/mkdirp/package.json @@ -1,7 +1,7 @@ { "name": "mkdirp", "description": "Recursively mkdir, like `mkdir -p`", - "version": "0.3.3", + "version": "0.3.5", "author": { "name": "James Halliday", "email": "mail@substack.net", @@ -20,16 +20,10 @@ "test": "tap test/*.js" }, "devDependencies": { - "tap": "~0.2.4" + "tap": "~0.4.0" }, - "license": "MIT/X11", - "engines": { - "node": "*" - }, - "readme": "mkdirp\n======\n\nLike `mkdir -p`, but in node.js!\n\n[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](http://travis-ci.org/substack/node-mkdirp)\n\nexample\n=======\n\npow.js\n------\n var mkdirp = require('mkdirp');\n \n mkdirp('/tmp/foo/bar/baz', function (err) {\n if (err) console.error(err)\n else console.log('pow!')\n });\n\nOutput\n pow!\n\nAnd now /tmp/foo/bar/baz exists, huzzah!\n\nmethods\n=======\n\nvar mkdirp = require('mkdirp');\n\nmkdirp(dir, mode, cb)\n---------------------\n\nCreate a new directory and any necessary subdirectories at `dir` with octal\npermission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\n`cb(err, made)` fires with the error or the first directory `made`\nthat had to be created, if any.\n\nmkdirp.sync(dir, mode)\n----------------------\n\nSynchronously create a new directory and any necessary subdirectories at `dir`\nwith octal permission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\nReturns the first directory that had to be created, if any.\n\ninstall\n=======\n\nWith [npm](http://npmjs.org) do:\n\n npm install mkdirp\n\nlicense\n=======\n\nMIT/X11\n", - "_id": "mkdirp@0.3.3", - "dist": { - "shasum": "f5865fc8d6cf062f6c13c15d25818ab758ab735a" - }, - "_from": "mkdirp@0.3.3" + "license": "MIT", + "readme": "# mkdirp\n\nLike `mkdir -p`, but in node.js!\n\n[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](http://travis-ci.org/substack/node-mkdirp)\n\n# example\n\n## pow.js\n\n```js\nvar mkdirp = require('mkdirp');\n \nmkdirp('/tmp/foo/bar/baz', function (err) {\n if (err) console.error(err)\n else console.log('pow!')\n});\n```\n\nOutput\n\n```\npow!\n```\n\nAnd now /tmp/foo/bar/baz exists, huzzah!\n\n# methods\n\n```js\nvar mkdirp = require('mkdirp');\n```\n\n## mkdirp(dir, mode, cb)\n\nCreate a new directory and any necessary subdirectories at `dir` with octal\npermission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\n`cb(err, made)` fires with the error or the first directory `made`\nthat had to be created, if any.\n\n## mkdirp.sync(dir, mode)\n\nSynchronously create a new directory and any necessary subdirectories at `dir`\nwith octal permission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\nReturns the first directory that had to be created, if any.\n\n# install\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm install mkdirp\n```\n\n# license\n\nMIT\n", + "_id": "mkdirp@0.3.5", + "_from": "mkdirp@>= 0.3.1" } diff --git a/node_modules/express/node_modules/range-parser/package.json b/node_modules/express/node_modules/range-parser/package.json index c48e100..8ff3a32 100644 --- a/node_modules/express/node_modules/range-parser/package.json +++ b/node_modules/express/node_modules/range-parser/package.json @@ -15,8 +15,5 @@ }, "readme": "\n# node-range-parser\n\n Range header field parser.\n\n## Example:\n\n```js\nassert(-1 == parse(200, 'bytes=500-20'));\nassert(-2 == parse(200, 'bytes=malformed'));\nparse(200, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 199 }]));\nparse(1000, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 499 }]));\nparse(1000, 'bytes=40-80').should.eql(arr('bytes', [{ start: 40, end: 80 }]));\nparse(1000, 'bytes=-500').should.eql(arr('bytes', [{ start: 500, end: 999 }]));\nparse(1000, 'bytes=-400').should.eql(arr('bytes', [{ start: 600, end: 999 }]));\nparse(1000, 'bytes=500-').should.eql(arr('bytes', [{ start: 500, end: 999 }]));\nparse(1000, 'bytes=400-').should.eql(arr('bytes', [{ start: 400, end: 999 }]));\nparse(1000, 'bytes=0-0').should.eql(arr('bytes', [{ start: 0, end: 0 }]));\nparse(1000, 'bytes=-1').should.eql(arr('bytes', [{ start: 999, end: 999 }]));\nparse(1000, 'items=0-5').should.eql(arr('items', [{ start: 0, end: 5 }]));\nparse(1000, 'bytes=40-80,-1').should.eql(arr('bytes', [{ start: 40, end: 80 }, { start: 999, end: 999 }]));\n```\n\n## Installation\n\n```\n$ npm install range-parser\n```", "_id": "range-parser@0.0.4", - "dist": { - "shasum": "cf09d056ce8f66bd622f67dc33de61b22cbd9166" - }, "_from": "range-parser@0.0.4" } diff --git a/node_modules/express/node_modules/send/node_modules/mime/package.json b/node_modules/express/node_modules/send/node_modules/mime/package.json index d724aee..a265300 100644 --- a/node_modules/express/node_modules/send/node_modules/mime/package.json +++ b/node_modules/express/node_modules/send/node_modules/mime/package.json @@ -27,8 +27,5 @@ "version": "1.2.6", "readme": "# mime\n\nComprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community.\n\n## Install\n\nInstall with [npm](http://github.com/isaacs/npm):\n\n npm install mime\n\n## API - Queries\n\n### mime.lookup(path)\nGet the mime type associated with a file. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g.\n\n var mime = require('mime');\n\n mime.lookup('/path/to/file.txt'); // => 'text/plain'\n mime.lookup('file.txt'); // => 'text/plain'\n mime.lookup('.TXT'); // => 'text/plain'\n mime.lookup('htm'); // => 'text/html'\n\n### mime.extension(type)\nGet the default extension for `type`\n\n mime.extension('text/html'); // => 'html'\n mime.extension('application/octet-stream'); // => 'bin'\n\n### mime.charsets.lookup()\n\nMap mime-type to charset\n\n mime.charsets.lookup('text/plain'); // => 'UTF-8'\n\n(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.)\n\n## API - Defining Custom Types\n\nThe following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/bentomas/node-mime/wiki/Requesting-New-Types).\n\n### mime.define()\n\nAdd custom mime/extension mappings\n\n mime.define({\n 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'],\n 'application/x-my-type': ['x-mt', 'x-mtt'],\n // etc ...\n });\n\n mime.lookup('x-sft'); // => 'text/x-some-format'\n\nThe first entry in the extensions array is returned by `mime.extension()`. E.g.\n\n mime.extension('text/x-some-format'); // => 'x-sf'\n\n### mime.load(filepath)\n\nLoad mappings from an Apache \".types\" format file\n\n mime.load('./my_project.types');\n\nThe .types file format is simple - See the `types` dir for examples.\n", "_id": "mime@1.2.6", - "dist": { - "shasum": "031ab2644fc6f04dcf9297fa6c99e85a48c43998" - }, "_from": "mime@1.2.6" } diff --git a/node_modules/express/node_modules/send/package.json b/node_modules/express/node_modules/send/package.json index 3da1394..78fadcb 100644 --- a/node_modules/express/node_modules/send/package.json +++ b/node_modules/express/node_modules/send/package.json @@ -29,8 +29,5 @@ "main": "index", "readme": "\n# send\n\n Send is Connect's `static()` extracted for generalized use, a streaming static file\n server supporting partial responses (Ranges), conditional-GET negotiation, high test coverage, and granular events which may be leveraged to take appropriate actions in your application or framework.\n\n## Installation\n\n $ npm install send\n\n## Examples\n\n Small:\n\n```js\nvar http = require('http');\nvar send = require('send');\n\nvar app = http.createServer(function(req, res){\n send(req, req.url).pipe(res);\n});\n```\n\n Serving from a root directory with custom error-handling:\n\n```js\nvar http = require('http');\nvar send = require('send');\n\nvar app = http.createServer(function(req, res){\n // your custom error-handling logic:\n function error(err) {\n res.statusCode = err.status || 500;\n res.end(err.message);\n }\n\n // your custom directory handling logic:\n function redirect() {\n res.statusCode = 301;\n res.setHeader('Location', req.url + '/');\n res.end('Redirecting to ' + req.url + '/');\n }\n\n // transfer arbitrary files from within\n // /www/example.com/public/*\n send(req, url.parse(req.url).pathname)\n .root('/www/example.com/public')\n .on('error', error)\n .on('directory', redirect)\n .pipe(res);\n});\n```\n\n## API\n\n### Events\n\n - `error` an error occurred `(err)`\n - `directory` a directory was requested\n - `stream` file streaming has started `(stream)`\n - `end` streaming has completed\n\n### .root(dir)\n\n Serve files relative to `path`. Aliased as `.from(dir)`.\n\n### .index(path)\n\n By default send supports \"index.html\" files, to disable this\n invoke `.index(false)` or to supply a new index pass a string.\n\n### .maxage(ms)\n\n Provide a max-age in milliseconds for http caching, defaults to 0.\n\n## Error-handling\n\n By default when no `error` listeners are present an automatic response will be made, otherwise you have full control over the response, aka you may show a 5xx page etc.\n\n## Caching\n\n It does _not_ perform internal caching, you should use a reverse proxy cache such\n as Varnish for this, or those fancy things called CDNs. If your application is small enough that it would benefit from single-node memory caching, it's small enough that it does not need caching at all ;).\n\n## Debugging\n\n To enable `debug()` instrumentation output export __DEBUG__:\n\n```\n$ DEBUG=send node app\n```\n\n## Running tests\n\n```\n$ npm install\n$ make test\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", "_id": "send@0.1.0", - "dist": { - "shasum": "702af3e6cccc3df450aa018fc26dec5b483c6976" - }, "_from": "send@0.1.0" } diff --git a/node_modules/express/package.json b/node_modules/express/package.json index c609ecb..a87ed1c 100644 --- a/node_modules/express/package.json +++ b/node_modules/express/package.json @@ -1,7 +1,7 @@ { "name": "express", "description": "Sinatra inspired web development framework", - "version": "3.1.0", + "version": "3.1.1", "author": { "name": "TJ Holowaychuk", "email": "tj@vision-media.ca" @@ -25,12 +25,12 @@ } ], "dependencies": { - "connect": "2.7.2", + "connect": "2.7.4", "commander": "0.6.1", "range-parser": "0.0.4", - "mkdirp": "0.3.3", + "mkdirp": "~0.3.4", "cookie": "0.0.5", - "buffer-crc32": "0.1.1", + "buffer-crc32": "~0.2.1", "fresh": "0.1.0", "methods": "0.0.1", "send": "0.1.0", @@ -74,10 +74,7 @@ "engines": { "node": "*" }, - "readme": "![express logo](http://f.cl.ly/items/0V2S1n0K1i3y1c122g04/Screen%20Shot%202012-04-11%20at%209.59.42%20AM.png)\n\n Fast, unopinionated, minimalist web framework for [node](http://nodejs.org). [![Build Status](https://secure.travis-ci.org/visionmedia/express.png)](http://travis-ci.org/visionmedia/express)\n\n```js\nvar express = require('express');\nvar app = express();\n\napp.get('/', function(req, res){\n res.send('Hello World');\n});\n\napp.listen(3000);\n```\n\n## Installation\n\n $ npm install -g express\n\n## Quick Start\n\n The quickest way to get started with express is to utilize the executable `express(1)` to generate an application as shown below:\n\n Create the app:\n\n $ npm install -g express\n $ express /tmp/foo && cd /tmp/foo\n\n Install dependencies:\n\n $ npm install\n\n Start the server:\n\n $ node app\n\n## Features\n\n * Built on [Connect](http://github.com/senchalabs/connect)\n * Robust routing\n * HTTP helpers (redirection, caching, etc)\n * View system supporting 14+ template engines\n * Content negotiation\n * Focus on high performance\n * Environment based configuration\n * Executable for generating applications quickly\n * High test coverage\n\n## Philosophy\n\n The Express philosophy is to provide small, robust tooling for HTTP servers. Making\n it a great solution for single page applications, web sites, hybrids, or public\n HTTP APIs.\n \n Built on Connect you can use _only_ what you need, and nothing more, applications\n can be as big or as small as you like, even a single file. Express does\n not force you to use any specific ORM or template engine. With support for over\n 14 template engines via [Consolidate.js](http://github.com/visionmedia/consolidate.js)\n you can quickly craft your perfect framework.\n\n## More Information\n\n * Join #express on freenode\n * [Google Group](http://groups.google.com/group/express-js) for discussion\n * Follow [tjholowaychuk](http://twitter.com/tjholowaychuk) on twitter for updates\n * Visit the [Wiki](http://github.com/visionmedia/express/wiki)\n * [日本語ドキュメンテーション](http://hideyukisaito.com/doc/expressjs/) by [hideyukisaito](https://github.com/hideyukisaito)\n * [Русскоязычная документация](http://express-js.ru/)\n\n## Viewing Examples\n\nClone the Express repo, then install the dev dependencies to install all the example / test suite deps:\n\n $ git clone git://github.com/visionmedia/express.git --depth 1\n $ cd express\n $ npm install\n\nthen run whichever tests you want:\n\n $ node examples/content-negotiation\n\n## Running Tests\n\nTo run the test suite first invoke the following command within the repo, installing the development dependencies:\n\n $ npm install\n\nthen run the tests:\n\n $ make test\n\n## Contributors\n\n```\nproject: express\ncommits: 3559\nactive : 468 days\nfiles : 237\nauthors: \n 1891\tTj Holowaychuk 53.1%\n 1285\tvisionmedia 36.1%\n 182\tTJ Holowaychuk 5.1%\n 54\tAaron Heckmann 1.5%\n 34\tcsausdev 1.0%\n 26\tciaranj 0.7%\n 21\tRobert Sköld 0.6%\n 6\tGuillermo Rauch 0.2%\n 3\tDav Glass 0.1%\n 3\tNick Poulden 0.1%\n 2\tRandy Merrill 0.1%\n 2\tBenny Wong 0.1%\n 2\tHunter Loftis 0.1%\n 2\tJake Gordon 0.1%\n 2\tBrian McKinney 0.1%\n 2\tRoman Shtylman 0.1%\n 2\tBen Weaver 0.1%\n 2\tDave Hoover 0.1%\n 2\tEivind Fjeldstad 0.1%\n 2\tDaniel Shaw 0.1%\n 1\tMatt Colyer 0.0%\n 1\tPau Ramon 0.0%\n 1\tPero Pejovic 0.0%\n 1\tPeter Rekdal Sunde 0.0%\n 1\tRaynos 0.0%\n 1\tTeng Siong Ong 0.0%\n 1\tViktor Kelemen 0.0%\n 1\tctide 0.0%\n 1\t8bitDesigner 0.0%\n 1\tisaacs 0.0%\n 1\tmgutz 0.0%\n 1\tpikeas 0.0%\n 1\tshuwatto 0.0%\n 1\ttstrimple 0.0%\n 1\tewoudj 0.0%\n 1\tAdam Sanderson 0.0%\n 1\tAndrii Kostenko 0.0%\n 1\tAndy Hiew 0.0%\n 1\tArpad Borsos 0.0%\n 1\tAshwin Purohit 0.0%\n 1\tBenjen 0.0%\n 1\tDarren Torpey 0.0%\n 1\tGreg Ritter 0.0%\n 1\tGregory Ritter 0.0%\n 1\tJames Herdman 0.0%\n 1\tJim Snodgrass 0.0%\n 1\tJoe McCann 0.0%\n 1\tJonathan Dumaine 0.0%\n 1\tJonathan Palardy 0.0%\n 1\tJonathan Zacsh 0.0%\n 1\tJustin Lilly 0.0%\n 1\tKen Sato 0.0%\n 1\tMaciej Małecki 0.0%\n 1\tMasahiro Hayashi 0.0%\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2009-2012 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", - "_id": "express@3.1.0", - "dist": { - "shasum": "f253e19027fd830e022688720d6f8555688e06d1" - }, - "_from": "express@3.1.0" + "readme": "![express logo](http://f.cl.ly/items/0V2S1n0K1i3y1c122g04/Screen%20Shot%202012-04-11%20at%209.59.42%20AM.png)\n\n Fast, unopinionated, minimalist web framework for [node](http://nodejs.org). [![Build Status](https://secure.travis-ci.org/visionmedia/express.png)](http://travis-ci.org/visionmedia/express) [![Dependency Status](https://gemnasium.com/visionmedia/express.png)](https://gemnasium.com/visionmedia/express)\n\n```js\nvar express = require('express');\nvar app = express();\n\napp.get('/', function(req, res){\n res.send('Hello World');\n});\n\napp.listen(3000);\n```\n\n## Installation\n\n $ npm install -g express\n\n## Quick Start\n\n The quickest way to get started with express is to utilize the executable `express(1)` to generate an application as shown below:\n\n Create the app:\n\n $ npm install -g express\n $ express /tmp/foo && cd /tmp/foo\n\n Install dependencies:\n\n $ npm install\n\n Start the server:\n\n $ node app\n\n## Features\n\n * Built on [Connect](http://github.com/senchalabs/connect)\n * Robust routing\n * HTTP helpers (redirection, caching, etc)\n * View system supporting 14+ template engines\n * Content negotiation\n * Focus on high performance\n * Environment based configuration\n * Executable for generating applications quickly\n * High test coverage\n\n## Philosophy\n\n The Express philosophy is to provide small, robust tooling for HTTP servers. Making\n it a great solution for single page applications, web sites, hybrids, or public\n HTTP APIs.\n\n Built on Connect you can use _only_ what you need, and nothing more, applications\n can be as big or as small as you like, even a single file. Express does\n not force you to use any specific ORM or template engine. With support for over\n 14 template engines via [Consolidate.js](http://github.com/visionmedia/consolidate.js)\n you can quickly craft your perfect framework.\n\n## More Information\n\n * Join #express on freenode\n * [Google Group](http://groups.google.com/group/express-js) for discussion\n * Follow [tjholowaychuk](http://twitter.com/tjholowaychuk) on twitter for updates\n * Visit the [Wiki](http://github.com/visionmedia/express/wiki)\n * [日本語ドキュメンテーション](http://hideyukisaito.com/doc/expressjs/) by [hideyukisaito](https://github.com/hideyukisaito)\n * [Русскоязычная документация](http://express-js.ru/)\n * Run express examples [online](https://runnable.com/express)\n\n## Viewing Examples\n\nClone the Express repo, then install the dev dependencies to install all the example / test suite deps:\n\n $ git clone git://github.com/visionmedia/express.git --depth 1\n $ cd express\n $ npm install\n\nthen run whichever tests you want:\n\n $ node examples/content-negotiation\n\n## Running Tests\n\nTo run the test suite first invoke the following command within the repo, installing the development dependencies:\n\n $ npm install\n\nthen run the tests:\n\n $ make test\n\n## Contributors\n\n```\nproject: express\ncommits: 3559\nactive : 468 days\nfiles : 237\nauthors:\n 1891\tTj Holowaychuk 53.1%\n 1285\tvisionmedia 36.1%\n 182\tTJ Holowaychuk 5.1%\n 54\tAaron Heckmann 1.5%\n 34\tcsausdev 1.0%\n 26\tciaranj 0.7%\n 21\tRobert Sköld 0.6%\n 6\tGuillermo Rauch 0.2%\n 3\tDav Glass 0.1%\n 3\tNick Poulden 0.1%\n 2\tRandy Merrill 0.1%\n 2\tBenny Wong 0.1%\n 2\tHunter Loftis 0.1%\n 2\tJake Gordon 0.1%\n 2\tBrian McKinney 0.1%\n 2\tRoman Shtylman 0.1%\n 2\tBen Weaver 0.1%\n 2\tDave Hoover 0.1%\n 2\tEivind Fjeldstad 0.1%\n 2\tDaniel Shaw 0.1%\n 1\tMatt Colyer 0.0%\n 1\tPau Ramon 0.0%\n 1\tPero Pejovic 0.0%\n 1\tPeter Rekdal Sunde 0.0%\n 1\tRaynos 0.0%\n 1\tTeng Siong Ong 0.0%\n 1\tViktor Kelemen 0.0%\n 1\tctide 0.0%\n 1\t8bitDesigner 0.0%\n 1\tisaacs 0.0%\n 1\tmgutz 0.0%\n 1\tpikeas 0.0%\n 1\tshuwatto 0.0%\n 1\ttstrimple 0.0%\n 1\tewoudj 0.0%\n 1\tAdam Sanderson 0.0%\n 1\tAndrii Kostenko 0.0%\n 1\tAndy Hiew 0.0%\n 1\tArpad Borsos 0.0%\n 1\tAshwin Purohit 0.0%\n 1\tBenjen 0.0%\n 1\tDarren Torpey 0.0%\n 1\tGreg Ritter 0.0%\n 1\tGregory Ritter 0.0%\n 1\tJames Herdman 0.0%\n 1\tJim Snodgrass 0.0%\n 1\tJoe McCann 0.0%\n 1\tJonathan Dumaine 0.0%\n 1\tJonathan Palardy 0.0%\n 1\tJonathan Zacsh 0.0%\n 1\tJustin Lilly 0.0%\n 1\tKen Sato 0.0%\n 1\tMaciej Małecki 0.0%\n 1\tMasahiro Hayashi 0.0%\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2009-2012 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", + "_id": "express@3.1.1", + "_from": "express@3.1.1" } diff --git a/node_modules/express/test.js b/node_modules/express/test.js index 112ee0a..50cf320 100644 --- a/node_modules/express/test.js +++ b/node_modules/express/test.js @@ -6,9 +6,33 @@ var express = require('./') , app = express() -app.get('/', function(req, res){ - console.log(req.query); +var users = ['foo', 'bar', 'baz']; + +app.use(express.bodyParser()); + +app.get('/api/users', function(req, res){ + res.send(users); +}); + +app.del('/api/users', function(req, res){ + users = []; + res.send(200); +}); + +app.post('/api/users', function(req, res){ + users.push(req.body.name); + res.send(201); +}); + +app.get('/api/user/:id', function(req, res){ + var id = req.params.id; + res.send(users[id]); +}); + +app.use('/api', function(req, res, next){ + var err = new Error('Method Not Allowed'); + err.status = 405; }); -app.listen(3000); -console.log('listening on 3000'); +app.listen(5555); +console.log('listening on 5555'); diff --git a/node_modules/less-middleware/lib/determine-imports.js b/node_modules/less-middleware/lib/determine-imports.js new file mode 100644 index 0000000..05fd0f2 --- /dev/null +++ b/node_modules/less-middleware/lib/determine-imports.js @@ -0,0 +1,83 @@ +var fs = require('fs'), + path = require('path'); + +module.exports = function (tree, lessPath, additional_import_paths) { + additional_import_paths = additional_import_paths || []; + + var less_root_dir = path.dirname(lessPath); + var result = new ImportSet(); + + process_tree_node(tree, less_root_dir, less_root_dir, additional_import_paths, result); + + return result.items; +}; + +// Process each less file node, with a list of rules +var process_tree_node = module.exports.process_tree_node = function (node, current_dir, root_dir, additional_import_paths, imports) { + var import_rules = node.rules + .filter(function (rule) { + return rule.path && !rule.css; + }); + + import_rules.forEach(function (import_rule) { + process_import_rule(import_rule, current_dir, root_dir, additional_import_paths, imports); + }); +}; + +// Process an import rule, with a path and a single less file node +var process_import_rule = module.exports.process_import_rule = function process_import_rule(import_rule, current_dir, root_dir, additional_import_paths, imports) { + var found_path = locate(import_rule.path, current_dir, root_dir, additional_import_paths); + var this_import = { + mtime: Date.now(), + path: found_path + }; + imports.add(this_import); + var new_current_dir = path.dirname(found_path); + process_tree_node(import_rule.root, new_current_dir, root_dir, additional_import_paths, imports); +}; + +// Less imports check for the path first in the local directory of the file, +// and then again in the directory of the top level less file being imported. +var locate = module.exports.locate = function (filename, current_dir, root_dir, additional_import_paths) { + var i, import_path, from_import_path; + var from_current_path = path.join(current_dir, filename); + var from_root_path = path.join(root_dir, filename); + + if (fs.existsSync(from_current_path)) { + return from_current_path; + } + + if (fs.existsSync(from_root_path)){ + return from_root_path; + } + + for(i = 0; i < additional_import_paths.length; i++){ + import_path = additional_import_paths[i]; + from_import_path = path.join(import_path, filename); + if (fs.existsSync(from_import_path)) { + return from_import_path; + } + } + + throw new Error("'"+filename+"' wasn't found."); +}; + + +// It's quick to check here for duplicate items, +// and it avoids an fs call in the middleware proper +var ImportSet = module.exports.ImportSet = function(){ + this.items = []; +}; + +ImportSet.prototype.add = function(item){ + var that = this; + if (!already_in(item)){ + this.items.push(item); + } + + function already_in(item){ + return that.items.some(function(element){ + return element.path === item.path; + }); + } +}; diff --git a/node_modules/less-middleware/lib/middleware.js b/node_modules/less-middleware/lib/middleware.js index 6928b7d..5c8c8a6 100644 --- a/node_modules/less-middleware/lib/middleware.js +++ b/node_modules/less-middleware/lib/middleware.js @@ -1,7 +1,7 @@ /*! * Less - middleware (adapted from the stylus middleware) * - * Original Copyright(c) 2010 LearnBoost + * Copyright(c) 2013 Randy Merrill * MIT Licensed */ @@ -9,7 +9,8 @@ var less = require('less'), fs = require('fs'), url = require('url'), path = require('path'), - mkdirp = require('mkdirp'); + mkdirp = require('mkdirp'), + determine_imports = require('./determine-imports.js'); // Import map var imports = {}; @@ -29,6 +30,7 @@ var imports = {}; * `compress` Whether the output .css files should be compressed * `yuicompress` Same as `compress`, but uses YUI Compressor * `optimization` The desired value of the less optimization option (0, 1, or 2. 0 is default) + * `dumpLineNumbers` Add line tracking to the compiled css. ('comments' or 'mediaquery') * * Examples: * @@ -65,7 +67,7 @@ module.exports = less.middleware = function(options){ // Only log if in debug mode var log = function(key, val, type) { - if(options.debug) { + if(options.debug || type === 'error') { switch(type) { case 'log': case 'info': @@ -106,20 +108,23 @@ module.exports = less.middleware = function(options){ --pending || next(changed); }); }); - } + }; // Once option options.once = options.once || false; // Compress option options.compress = typeof options.compress === 'undefined' ? 'auto' : options.compress; - + // YUI Compress option options.yuicompress = typeof options.yuicompress === 'undefined' ? false : options.yuicompress; // Optimization option options.optimization = options.optimization || 0; + // Line Number Tracking + options.dumpLineNumbers = options.dumpLineNumbers || 0; + // Source dir required var src = options.src; if (!src) { throw new Error('less.middleware() requires "src" directory'); } @@ -127,33 +132,45 @@ module.exports = less.middleware = function(options){ // Default dest dir to source var dest = options.dest ? options.dest : src; + if (options.paths){ + if (!(options.paths instanceof Array)) { + options.paths = [options.paths]; + } + } else { + options.paths = []; + } + // Default compile callback options.render = options.render || function(str, lessPath, cssPath, callback) { + + var paths = [ path.dirname(lessPath) ]; + options.paths.forEach(function(p){ paths.push(p); }); + var parser = new less.Parser({ - paths: [path.dirname(lessPath)], + paths: paths, filename: lessPath, - optimization: options.optimization + optimization: options.optimization, + dumpLineNumbers: options.dumpLineNumbers }); parser.parse(str, function(err, tree) { - var css = tree.toCSS({ - compress: (options.compress == 'auto' ? regex.compress.test(cssPath) : options.compress), - yuicompress: options.yuicompress - }); + if(err) { + return callback(err); + } - // Store the less import paths - imports[lessPath] = tree.rules - .filter(function(rule) { - return rule.path; - }) - .map(function(rule) { - return { - mtime : Date.now(), - path : path.join(path.dirname(lessPath), rule.path) - }; - }); + try { + var css = tree.toCSS({ + compress: (options.compress == 'auto' ? regex.compress.test(cssPath) : options.compress), + yuicompress: options.yuicompress + }); + + // Store the less import paths + imports[lessPath] = determine_imports(tree, lessPath, options.paths); - callback(err, css); + callback(err, css); + } catch(parseError) { + callback(parseError, null); + } }); }; diff --git a/node_modules/less-middleware/license b/node_modules/less-middleware/license new file mode 100644 index 0000000..5103e09 --- /dev/null +++ b/node_modules/less-middleware/license @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2013 Randy Merrill + +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. diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/package.json b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/package.json index e243d0c..4e5115f 100755 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/package.json +++ b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/package.json @@ -57,8 +57,5 @@ ], "readme": "CSSMin\n======\n\nThis project is a fork of [jbleuzen/node-cssmin](https://github.com/jbleuzen/node-cssmin).\n\nIt was originally based on the javascript for of the css minification tool used inside of \n[YUICompressor](https://github.com/yui/yuicompressor) based on code from Stoyan Stefanov and Isaac Schlueter.\n\nWe forked this project in order to maintain and up keep it on a regular basis.\n\n\nInstallation\n------------\n\nYou can either download the plugin and unzip it into to your project folder or you can use npm to install the `ycssmin` package.\n\n`npm -g i ycssmin`\n\nBuild Status\n------------\n\n[![Build Status](https://secure.travis-ci.org/yui/ycssmin.png)](http://travis-ci.org/yui/ycssmin)\n\nTesting\n-------\n\nClone this repo:\n\n`npm test`\n\nCode Coverage\n-------------\n\nWe are using [istanbul](https://github.com/gotwarlost/istanbul) to provide code coverage, to view the report:\n\n`npm test`\n\nThen open `./coverage/lcov-report`\n\nWe also publish the [latest here](http://yui.github.com/ycssmin/).\n\nWe ask that all patches have a test attached and full coverage.\n\nUsage\n-----\n\nThe module exports the cssmin function, so you can use it with: \n\n`var cssmin = require('ycssmin').cssmin;`\n\nThe function cssmin takes two arguments:\n* `input` : the CSS content you want to minimize.\n* `linebreakpos` : the number of characters before the end of the line. If empty, the output will have only one line.\n\t\nExample :\n\n```javascript\nvar fs = require('fs'),\n cssmin = require('ycssmin').cssmin,\n css = fs.readFileSync(\"/Any/Random/CSS/File.css\", encoding='utf8'),\n min = cssmin(css);\n\nconsole.log(min);\n```\n\nLicense\n-------\n\n Copyright 2012 Yahoo! Inc.\n All rights reserved.\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * Neither the name of the Yahoo! Inc. nor the\n names of its contributors may be used to endorse or promote products\n derived from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL YAHOO! INC. BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nThanks\n------\n\nThanks to Johan BLEUZEN for originally porting this to node.js\n", "_id": "ycssmin@1.0.1", - "dist": { - "shasum": "0acdd8710a141f976e1d9576b92c874f2d7ccc4e" - }, "_from": "ycssmin@>=1.0.1" } diff --git a/node_modules/less-middleware/node_modules/less/package.json b/node_modules/less-middleware/node_modules/less/package.json index 1257364..8b8d08c 100644 --- a/node_modules/less-middleware/node_modules/less/package.json +++ b/node_modules/less-middleware/node_modules/less/package.json @@ -45,8 +45,5 @@ "dependencies": { "ycssmin": ">=1.0.1" }, - "dist": { - "shasum": "b3e2f0bfa5389f50dd3c5a4175cbd4c14e89119c" - }, - "_from": "less@1.3.3" + "_from": "less@>= 1.3.3" } diff --git a/node_modules/less-middleware/node_modules/mkdirp/package.json b/node_modules/less-middleware/node_modules/mkdirp/package.json index 7ae42f7..1f2736d 100644 --- a/node_modules/less-middleware/node_modules/mkdirp/package.json +++ b/node_modules/less-middleware/node_modules/mkdirp/package.json @@ -25,8 +25,5 @@ "license": "MIT", "readme": "# mkdirp\n\nLike `mkdir -p`, but in node.js!\n\n[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](http://travis-ci.org/substack/node-mkdirp)\n\n# example\n\n## pow.js\n\n```js\nvar mkdirp = require('mkdirp');\n \nmkdirp('/tmp/foo/bar/baz', function (err) {\n if (err) console.error(err)\n else console.log('pow!')\n});\n```\n\nOutput\n\n```\npow!\n```\n\nAnd now /tmp/foo/bar/baz exists, huzzah!\n\n# methods\n\n```js\nvar mkdirp = require('mkdirp');\n```\n\n## mkdirp(dir, mode, cb)\n\nCreate a new directory and any necessary subdirectories at `dir` with octal\npermission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\n`cb(err, made)` fires with the error or the first directory `made`\nthat had to be created, if any.\n\n## mkdirp.sync(dir, mode)\n\nSynchronously create a new directory and any necessary subdirectories at `dir`\nwith octal permission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\nReturns the first directory that had to be created, if any.\n\n# install\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm install mkdirp\n```\n\n# license\n\nMIT\n", "_id": "mkdirp@0.3.5", - "dist": { - "shasum": "16451cc5a652df2e33930ba62bfdb67eb816b58a" - }, - "_from": "mkdirp@0.3.5" + "_from": "mkdirp@>= 0.3.1" } diff --git a/node_modules/less-middleware/package.json b/node_modules/less-middleware/package.json index 91d346d..98d95e1 100644 --- a/node_modules/less-middleware/package.json +++ b/node_modules/less-middleware/package.json @@ -6,14 +6,14 @@ }, "name": "less-middleware", "description": "LESS.js middleware for connect.", - "version": "0.1.6", + "version": "0.1.11", "repository": { "type": "git", "url": "git://github.com/emberfeather/less.js-middleware.git" }, "main": "lib/middleware.js", "dependencies": { - "less": ">= 1.3.0", + "less": ">= 1.3.3", "mkdirp": ">= 0.3.1" }, "devDependencies": {}, @@ -21,10 +21,7 @@ "engines": { "node": "*" }, - "readme": "## Installation\n\n sudo npm install less-middleware\n\n## Options\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    OptionDescriptionDefault
    forceAlways re-compile less files on each request.false
    onceOnly check for need to recompile once after each server restart. Useful for reducing disk i/o on production.false
    debugOutput any debugging messages to the console.false
    srcSource directory containing the .less files. Required.
    destDesitnation directory to output the compiled .css files.<src>
    prefixPath which should be stripped from the public pathname.
    compressCompress the output being written to the *.css files. When set to 'auto' compression will only happen when the css file ends with .min.css or -min.css.auto
    optimizationDesired level of LESS optimization. Optionally 0, 1, or 20
    \n\n## Examples\n\n### Connect\n\n var lessMiddleware = require('less-middleware');\n\n var server = connect.createServer(\n lessMiddleware({\n src: __dirname + '/public',\n compress: true\n }),\n connect.staticProvider(__dirname + '/public')\n );\n\n### Express\n\n var lessMiddleware = require('less-middleware');\n\n var app = express.createServer();\n\n app.configure(function () {\n // Other configuration here...\n\n app.use(lessMiddleware({\n src: __dirname + '/public',\n compress: true\n }));\n\n app.use(express.static(__dirname + '/public'));\n });\n\n### Express - Different `src` and `dest`\n\nWhen using a different `src` and `dest` you can use the `prefix` option to make the directory structure cleaner.\n\nRequests for static assets (like stylesheets) made to the express server use a `pathname` to look up the file. So if the request is for `http://localhost/stylesheets/styles.css` the `pathname` will be `/stylesheets/styles.css`.\n\nThe less middleware uses that path to determine where to look for less files. In the original example it looks for the less file at `/public/stylesheets/styles.less` and compiles it to `/public/stylesheets/styles.css`.\n\nIf you are using a different `src` and `dest` options it causes for more complex directories structures unless you use the `prefix` option. For example, without the `prefix`, and with a `src` of `/src/less` and a `dest` of `/public` it would look for the less file at `/src/less/stylesheets/styles.less` and compile it to `/public/stylesheets/styles.css`. To make it cleaner you can use the `prefix` option:\n\n var lessMiddleware = require('less-middleware');\n\n var app = express.createServer();\n\n app.configure(function () {\n // Other configuration here...\n\n app.use(lessMiddleware({\n dest: __dirname + '/public/stylesheets',\n src: __dirname + '/src/less',\n prefix: '/stylesheets',\n compress: true\n }));\n\n app.use(express.static(__dirname + '/public'));\n });\n\nUsing the `prefix` it changes the `pathname` from `/stylesheets/styles.css` to `/styles.css`. With that prefix removed from the `pathname` it makes things cleaner. With the `prefix` removed it would look for the less file at `/src/less/styles.less` and compile it to `/public/stylesheets/styles.css`.\n", - "_id": "less-middleware@0.1.6", - "dist": { - "shasum": "0ff4ee3fd3dc3f1635800f35af571fc0b7596c6e" - }, - "_from": "less-middleware@0.1.6" + "readme": "## Installation\n\n sudo npm install less-middleware\n\n## Options\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n
    OptionDescriptionDefault
    forceAlways re-compile less files on each request.false
    onceOnly check for need to recompile once after each server restart. Useful for reducing disk i/o on production.false
    debugOutput any debugging messages to the console.false
    srcSource directory containing the .less files. Required.
    destDesitnation directory to output the compiled .css files.<src>
    pathsSpecify search paths for @import directivesThe dirname of <src>
    prefixPath which should be stripped from the public pathname.
    compressCompress the output being written to the *.css files. When set to 'auto' compression will only happen when the css file ends with .min.css or -min.css.auto
    optimizationDesired level of LESS optimization. Optionally 0, 1, or 20
    dumpLineNumbersAdd line tracking to the compiled css. Optionally 0, 'comments', or 'mediaquery'0
    \n\n## Examples\n\n### Connect\n\n var lessMiddleware = require('less-middleware');\n\n var server = connect.createServer(\n lessMiddleware({\n src: __dirname + '/public',\n compress: true\n }),\n connect.staticProvider(__dirname + '/public')\n );\n\n### Express\n\n var lessMiddleware = require('less-middleware');\n\n var app = express.createServer();\n\n app.configure(function () {\n // Other configuration here...\n\n app.use(lessMiddleware({\n src: __dirname + '/public',\n compress: true\n }));\n\n app.use(express.static(__dirname + '/public'));\n });\n\n### Express - Different `src` and `dest`\n\nWhen using a different `src` and `dest` you can use the `prefix` option to make the directory structure cleaner.\n\nRequests for static assets (like stylesheets) made to the express server use a `pathname` to look up the file. So if the request is for `http://localhost/stylesheets/styles.css` the `pathname` will be `/stylesheets/styles.css`.\n\nThe less middleware uses that path to determine where to look for less files. In the original example it looks for the less file at `/public/stylesheets/styles.less` and compiles it to `/public/stylesheets/styles.css`.\n\nIf you are using a different `src` and `dest` options it causes for more complex directories structures unless you use the `prefix` option. For example, without the `prefix`, and with a `src` of `/src/less` and a `dest` of `/public` it would look for the less file at `/src/less/stylesheets/styles.less` and compile it to `/public/stylesheets/styles.css`. To make it cleaner you can use the `prefix` option:\n\n var lessMiddleware = require('less-middleware');\n\n var app = express.createServer();\n\n app.configure(function () {\n // Other configuration here...\n\n app.use(lessMiddleware({\n dest: __dirname + '/public/stylesheets',\n src: __dirname + '/src/less',\n prefix: '/stylesheets',\n compress: true\n }));\n\n app.use(express.static(__dirname + '/public'));\n });\n\nUsing the `prefix` it changes the `pathname` from `/stylesheets/styles.css` to `/styles.css`. With that prefix removed from the `pathname` it makes things cleaner. With the `prefix` removed it would look for the less file at `/src/less/styles.less` and compile it to `/public/stylesheets/styles.css`.\n\n### Express - Using a temp directory for `dest`\n\nSince less middleware relies on static content to be served by express.static, using temp directories just requires that you inform express about where generated files are built:\n\n var lessMiddleware = require('less-middleware'),\n os = require('os');\n\n var app = express.createServer();\n\n app.configure(function () {\n // Other configuration here...\n\n var tmpDir = os.tmpDir();\n app.use(lessMiddleware({\n src: __dirname + '/public/stylesheets',\n dest: tmpDir,\n compress: true\n }));\n\n app.use(express.static(__dirname + '/public'));\n app.use(express.static(tmpDir));\n });\n\nUsing a temp directory is useful for read-only file systems, such as a Heroku deployment. By using a temp directory the css files can still be written and served.\n\n### Importing less\n\nBy default the directory in which the compiled files live in is already set as an import directive:\n\n```css\n// file1.less\n\n@import 'file2.less';\n\nbody {\n color: @bodyColor;\n}\n```\n\n```css\n// file2.less\n\n@bodyColor: #333333;\n```\n\nHowever, you can use the `paths` option if you need to specify other directories in which to search for importable less files.\n\n```js\nvar less = require('less-middleware'),\n path = require('path');\n\n lessMiddleware({\n src: path.join(__dirname, 'public'),\n paths: [path.join(__dirname, 'module', 'less')]\n });\n```\n\n```css\n// public/base.css\n\n@import 'colors';\n\nbody {\n color: @bodyColor;\n}\n```\n\n```css\n// module/less/colors.less\n\n@bodyColor: #333333;\n```\n\n### Using bootstrap\n\nHere's an example on how to use Twitter's bootstrap within an Express.js set-up:\n\n```js\n// package.json\n{\n \"name\": \"my-module\",\n // ...\n \"dependencies\": {\n \"less-middleware\": \"*\",\n \"bootstrap\": \"git+https://github.com/twitter/bootstrap.git#v2.2.2\",\n \"express\": \"3.0\"\n }\n}\n```\n\n```js\n// app.js\nvar express = require('express')\n , path = require('path')\n , app = express()\n , less = require('less-middleware');\n\napp.configure(function(){\n // ...\n var bootstrapPath = path.join(__dirname, 'node_modules', 'bootstrap');\n app.use(express.bodyParser());\n app.use(express.methodOverride());\n app.use('/img', express['static'](path.join(bootstrapPath, 'img')));\n app.use(app.router);\n app.use(less({\n src : path.join(__dirname, 'assets', 'less'),\n paths : [path.join(bootstrapPath, 'less')],\n dest : path.join(__dirname, 'public', 'stylesheets'),\n prefix : '/stylesheets'\n }));\n app.use(express['static'](path.join(__dirname, 'public')));\n // ...\n});\n\n// ...\n```\n\n```css\n// assets/less/base.less\n\n@import 'bootstrap';\n@import 'responsive';\n\n@bodyBackground: #FAF7EC;\n@navbarBrandColor: #989CAE;\n\n.brand {\n font-family: @monoFontFamily;\n}\n```\n\n", + "_id": "less-middleware@0.1.11", + "_from": "less-middleware@0.1.11" } diff --git a/node_modules/less-middleware/readme.md b/node_modules/less-middleware/readme.md index 8149f28..c28b1d4 100644 --- a/node_modules/less-middleware/readme.md +++ b/node_modules/less-middleware/readme.md @@ -38,6 +38,11 @@ Desitnation directory to output the compiled .css files. <src> + + paths + Specify search paths for @import directives + The dirname of <src> + prefix Path which should be stripped from the public pathname. @@ -53,6 +58,12 @@ Desired level of LESS optimization. Optionally 0, 1, or 2 0 + + dumpLineNumbers + Add line tracking to the compiled css. Optionally 0, 'comments', or 'mediaquery' + 0 + + @@ -115,3 +126,135 @@ If you are using a different `src` and `dest` options it causes for more complex }); Using the `prefix` it changes the `pathname` from `/stylesheets/styles.css` to `/styles.css`. With that prefix removed from the `pathname` it makes things cleaner. With the `prefix` removed it would look for the less file at `/src/less/styles.less` and compile it to `/public/stylesheets/styles.css`. + +### Express - Using a temp directory for `dest` + +Since less middleware relies on static content to be served by express.static, using temp directories just requires that you inform express about where generated files are built: + + var lessMiddleware = require('less-middleware'), + os = require('os'); + + var app = express.createServer(); + + app.configure(function () { + // Other configuration here... + + var tmpDir = os.tmpDir(); + app.use(lessMiddleware({ + src: __dirname + '/public/stylesheets', + dest: tmpDir, + compress: true + })); + + app.use(express.static(__dirname + '/public')); + app.use(express.static(tmpDir)); + }); + +Using a temp directory is useful for read-only file systems, such as a Heroku deployment. By using a temp directory the css files can still be written and served. + +### Importing less + +By default the directory in which the compiled files live in is already set as an import directive: + +```css +// file1.less + +@import 'file2.less'; + +body { + color: @bodyColor; +} +``` + +```css +// file2.less + +@bodyColor: #333333; +``` + +However, you can use the `paths` option if you need to specify other directories in which to search for importable less files. + +```js +var less = require('less-middleware'), + path = require('path'); + + lessMiddleware({ + src: path.join(__dirname, 'public'), + paths: [path.join(__dirname, 'module', 'less')] + }); +``` + +```css +// public/base.css + +@import 'colors'; + +body { + color: @bodyColor; +} +``` + +```css +// module/less/colors.less + +@bodyColor: #333333; +``` + +### Using bootstrap + +Here's an example on how to use Twitter's bootstrap within an Express.js set-up: + +```js +// package.json +{ + "name": "my-module", + // ... + "dependencies": { + "less-middleware": "*", + "bootstrap": "git+https://github.com/twitter/bootstrap.git#v2.2.2", + "express": "3.0" + } +} +``` + +```js +// app.js +var express = require('express') + , path = require('path') + , app = express() + , less = require('less-middleware'); + +app.configure(function(){ + // ... + var bootstrapPath = path.join(__dirname, 'node_modules', 'bootstrap'); + app.use(express.bodyParser()); + app.use(express.methodOverride()); + app.use('/img', express['static'](path.join(bootstrapPath, 'img'))); + app.use(app.router); + app.use(less({ + src : path.join(__dirname, 'assets', 'less'), + paths : [path.join(bootstrapPath, 'less')], + dest : path.join(__dirname, 'public', 'stylesheets'), + prefix : '/stylesheets' + })); + app.use(express['static'](path.join(__dirname, 'public'))); + // ... +}); + +// ... +``` + +```css +// assets/less/base.less + +@import 'bootstrap'; +@import 'responsive'; + +@bodyBackground: #FAF7EC; +@navbarBrandColor: #989CAE; + +.brand { + font-family: @monoFontFamily; +} +``` + diff --git a/node_modules/less-middleware/test/parse-test.js b/node_modules/less-middleware/test/parse-test.js deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/mongoose/.travis.yml b/node_modules/mongoose/.travis.yml index ce393d5..ab51641 100644 --- a/node_modules/mongoose/.travis.yml +++ b/node_modules/mongoose/.travis.yml @@ -2,5 +2,6 @@ language: node_js node_js: - 0.6 - 0.8 + - 0.10 services: - mongodb diff --git a/node_modules/mongoose/CONTRIBUTING.md b/node_modules/mongoose/CONTRIBUTING.md index 7a90c4e..f32a3eb 100644 --- a/node_modules/mongoose/CONTRIBUTING.md +++ b/node_modules/mongoose/CONTRIBUTING.md @@ -1,5 +1,9 @@ ## Contributing to Mongoose +### STOP! + +If you have a question about Mongoose (not a bug report) please post it to either [StackOverflow](http://stackoverflow.com/questions/tagged/mongoose), our [Google Group](http://groups.google.com/group/mongoose-orm), or on the #mongoosejs irc channel on freenode. + ### Reporting bugs - Before opening a new issue, look for existing [issues](https://github.com/learnboost/mongoose/issues) to avoid duplication. If the issue does not yet exist, [create one](https://github.com/learnboost/mongoose/issues/new). @@ -23,7 +27,14 @@ - `for (..) {` - `while (..) {` - `function (err) {` -- Write tests and make sure they pass (execute `make test` from the command line to run the test suite). +- Write tests and make sure they pass (tests are in the [test](https://github.com/LearnBoost/mongoose/tree/master/test) directory). + +### Running the tests +- Open a terminal and navigate to the root of the project +- execute `npm install` to install the necessary dependencies +- execute `make test` to run the tests (we're using [mocha](http://visionmedia.github.com/mocha/)) + - or to execute a single test `T="-g 'some regexp that matches the test description'" make test` + - any mocha flags can be specified with T="..." ### Documentation diff --git a/node_modules/mongoose/History.md b/node_modules/mongoose/History.md index 2b17f0c..9172e63 100644 --- a/node_modules/mongoose/History.md +++ b/node_modules/mongoose/History.md @@ -1,4 +1,203 @@ +3.6.4 / 2013-04-03 +================== + + * fixed; +field conflict with $slice #1370 + * fixed; nested deselection conflict #1333 + * fixed; RangeError in ValidationError.toString() #1296 + * fixed; do not save user defined transforms #1415 + * tests; fix race condition + +3.6.3 / 2013-04-02 +================== + + * fixed; setting subdocuments deeply nested fields #1394 + * fixed; regression: populated streams #1411 + * docs; mention hooks/validation with findAndModify + * docs; mention auth + * docs; add more links + * examples; add document methods example + * website; display "see" links for properties + * website; clean up homepage + +3.5.10 / 2013-04-02 +================== + + * fixed; setting subdocuments deeply nested fields #1394 + * fixed; do not alter schema arguments #1364 + +3.6.2 / 2013-03-29 +================== + + * fixed; corrupted sub-doc array #1408 + * fixed; document#update returns a Query #1397 + * docs; readpref strategy + +3.6.1 / 2013-03-27 +================== + + * added; populate support to findAndModify varients #1395 + * added; text index type to schematypes + * expose allowed index types as Schema.indexTypes + * fixed; use of `setMaxListeners` as path + * fixed; regression in node 0.6 on docs with > 10 arrays + * fixed; do not alter schema arguments #1364 + * fixed; subdoc#ownerDocument() #1385 + * website; change search id + * website; add search from google [jackdbernier](https://github.com/jackdbernier) + * website; fix link + * website; add 3.5.x docs release + * website; fix link + * docs; fix geometry + * docs; hide internal constructor + * docs; aggregation does not cast arguments #1399 + * docs; querystream options + * examples; added for population + +3.6.0 / 2013-03-18 +================== + + * changed; cast 'true'/'false' to boolean #1282 [mgrach](https://github.com/mgrach) + * changed; Buffer arrays can now contain nulls + * added; QueryStream transform option + * added; support for authSource driver option + * added; {mongoose,db}.modelNames() + * added; $push w/ $slice,$sort support (MongoDB 2.4) + * added; hashed index type (MongoDB 2.4) + * added; support for mongodb 2.4 geojson (MongoDB 2.4) + * added; value at time of validation error + * added; support for object literal schemas + * added; bufferCommands schema option + * added; allow auth option in connections #1360 [geoah](https://github.com/geoah) + * added; performance improvements to populate() [263ece9](https://github.com/LearnBoost/mongoose/commit/263ece9) + * added; allow adding uncasted docs to populated arrays and properties #570 + * added; doc#populated(path) stores original populated _ids + * added; lean population #1260 + * added; query.populate() now accepts an options object + * added; document#populate(opts, callback) + * added; Model.populate(docs, opts, callback) + * added; support for rich nested path population + * added; doc.array.remove(value) subdoc with _id value support #1278 + * added; optionally allow non-strict sets and updates + * added; promises/A+ comformancy with [mpromise](https://github.com/aheckmann/mpromise) + * added; promise#then + * added; promise#end + * fixed; use of `model` as doc property + * fixed; lean population #1382 + * fixed; empty object mixed defaults #1380 + * fixed; populate w/ deselected _id using string syntax + * fixed; attempted save of divergent populated arrays #1334 related + * fixed; better error msg when attempting toObject as property name + * fixed; non population buffer casting from doc + * fixed; setting populated paths #570 + * fixed; casting when added docs to populated arrays #570 + * fixed; prohibit updating arrays selected with $elemMatch #1334 + * fixed; pull / set subdoc combination #1303 + * fixed; multiple bg index creation #1365 + * fixed; manual reconnection to single mongod + * fixed; Constructor / version exposure #1124 + * fixed; CastError race condition + * fixed; no longer swallowing misuse of subdoc#invalidate() + * fixed; utils.clone retains RegExp opts + * fixed; population of non-schema property + * fixed; allow updating versionKey #1265 + * fixed; add EventEmitter props to reserved paths #1338 + * fixed; can now deselect populated doc _ids #1331 + * fixed; properly pass subtype to Binary in MongooseBuffer + * fixed; casting _id from document with non-ObjectId _id + * fixed; specifying schema type edge case { path: [{type: "String" }] } + * fixed; typo in schemdate #1329 [jplock](https://github.com/jplock) + * updated; driver to 1.2.14 + * updated; muri to 0.3.1 + * updated; mpromise to 0.2.1 + * updated; mocha 1.8.1 + * updated; mpath to 0.1.1 + * deprecated; pluralization will die in 4.x + * refactor; rename private methods to something unusable as doc properties + * refactor MongooseArray#remove + * refactor; move expires index to SchemaDate #1328 + * refactor; internal document properties #1171 #1184 + * tests; added + * docs; indexes + * docs; validation + * docs; populate + * docs; populate + * docs; add note about stream compatibility with node 0.8 + * docs; fix for private names + * docs; Buffer -> mongodb.Binary #1363 + * docs; auth options + * docs; improved + * website; update FAQ + * website; add more api links + * website; add 3.5.x docs to prior releases + * website; Change mongoose-types to an active repo [jackdbernier](https://github.com/jackdbernier) + * website; compat with node 0.10 + * website; add news section + * website; use T for generic type + * benchmark; make adjustable + +3.5.9 / 2013-03-15 +================== + + * updated; driver to 1.2.14 + * added; support for authSource driver option (mongodb 2.4) + * added; QueryStream transform option (node 0.10 helper) + * fixed; backport for saving required populated buffers + * fixed; pull / set subdoc combination #1303 + * fixed; multiple bg index creation #1365 + * test; added for saveable required populated buffers + * test; added for #1365 + * test; add authSource test + +3.6.0rc1 / 2013-03-12 +====================== + + * refactor; rename private methods to something unusable as doc properties + * added; {mongoose,db}.modelNames() + * added; $push w/ $slice,$sort support (MongoDB 2.4) + * added; hashed index type (MongoDB 2.4) + * added; support for mongodb 2.4 geojson (MongoDB 2.4) + * added; value at time of validation error + * added; support for object literal schemas + * added; bufferCommands schema option + * added; allow auth option in connections #1360 [geoah](https://github.com/geoah) + * fixed; lean population #1382 + * fixed; empty object mixed defaults #1380 + * fixed; populate w/ deselected _id using string syntax + * fixed; attempted save of divergent populated arrays #1334 related + * fixed; better error msg when attempting toObject as property name + * fixed; non population buffer casting from doc + * fixed; setting populated paths #570 + * fixed; casting when added docs to populated arrays #570 + * fixed; prohibit updating arrays selected with $elemMatch #1334 + * fixed; pull / set subdoc combination #1303 + * fixed; multiple bg index creation #1365 + * fixed; manual reconnection to single mongod + * fixed; Constructor / version exposure #1124 + * fixed; CastError race condition + * fixed; no longer swallowing misuse of subdoc#invalidate() + * fixed; utils.clone retains RegExp opts + * fixed; population of non-schema property + * fixed; allow updating versionKey #1265 + * fixed; add EventEmitter props to reserved paths #1338 + * fixed; can now deselect populated doc _ids #1331 + * updated; muri to 0.3.1 + * updated; driver to 1.2.12 + * updated; mpromise to 0.2.1 + * deprecated; pluralization will die in 4.x + * docs; Buffer -> mongodb.Binary #1363 + * docs; auth options + * docs; improved + * website; add news section + * benchmark; make adjustable + +3.5.8 / 2013-03-12 +================== + + * added; auth option in connection [geoah](https://github.com/geoah) + * fixed; CastError race condition + * docs; add note about stream compatibility with node 0.8 + 3.5.7 / 2013-02-22 ================== @@ -30,6 +229,35 @@ * docs; README * docs; CONTRIBUTING.md +3.6.0rc0 / 2013-02-03 +====================== + + * changed; cast 'true'/'false' to boolean #1282 [mgrach](https://github.com/mgrach) + * changed; Buffer arrays can now contain nulls + * fixed; properly pass subtype to Binary in MongooseBuffer + * fixed; casting _id from document with non-ObjectId _id + * fixed; specifying schema type edge case { path: [{type: "String" }] } + * fixed; typo in schemdate #1329 [jplock](https://github.com/jplock) + * refactor; move expires index to SchemaDate #1328 + * refactor; internal document properties #1171 #1184 + * added; performance improvements to populate() [263ece9](https://github.com/LearnBoost/mongoose/commit/263ece9) + * added; allow adding uncasted docs to populated arrays and properties #570 + * added; doc#populated(path) stores original populated _ids + * added; lean population #1260 + * added; query.populate() now accepts an options object + * added; document#populate(opts, callback) + * added; Model.populate(docs, opts, callback) + * added; support for rich nested path population + * added; doc.array.remove(value) subdoc with _id value support #1278 + * added; optionally allow non-strict sets and updates + * added; promises/A+ comformancy with [mpromise](https://github.com/aheckmann/mpromise) + * added; promise#then + * added; promise#end + * updated; mocha 1.8.1 + * updated; muri to 0.3.0 + * updated; mpath to 0.1.1 + * updated; docs + 3.5.5 / 2013-01-29 ================== diff --git a/node_modules/mongoose/examples/README.md b/node_modules/mongoose/examples/README.md new file mode 100644 index 0000000..89728d9 --- /dev/null +++ b/node_modules/mongoose/examples/README.md @@ -0,0 +1,42 @@ + +This directory contains runnable sample mongoose programs. + +To run: + + - first install [Node.js](http://nodejs.org/) + - from the command line, execute: `node example.js`, replacing "example.js" with the name of a program. + + +Goal is to show: + +- global schemas +- GeoJSON schemas / use (with crs) +- text search +- storing schemas as json +- lean querires +- statics +- methods and statics on subdocs +- custom types +- querybuilder +- promises +- express + mongoose +- accessing driver collection, db +- connecting to replica sets +- connecting to sharded clusters +- enabling a fail fast mode +- on the fly schemas +- storing files +- map reduce +- aggregation +- advanced hooks +- using $elemMatch to return a subset of an array +- query casting +- upserts +- pagination +- express + mongoose session handling +- group by (use aggregation) +- authentication +- schema migration techniques +- converting documents to plain objects (show transforms) +- how to $unset + diff --git a/node_modules/mongoose/examples/doc-methods.js b/node_modules/mongoose/examples/doc-methods.js new file mode 100644 index 0000000..373a46b --- /dev/null +++ b/node_modules/mongoose/examples/doc-methods.js @@ -0,0 +1,70 @@ + +var mongoose = require('mongoose') +var Schema = mongoose.Schema; + +console.log('Running mongoose version %s', mongoose.version); + +/** + * Schema + */ + +var CharacterSchema = Schema({ + name: { type: String, required: true } + , health: { type: Number, min: 0, max: 100 } +}) + +/** + * Methods + */ + +CharacterSchema.methods.attack = function () { + console.log('%s is attacking', this.name); +} + +/** + * Character model + */ + +var Character = mongoose.model('Character', CharacterSchema); + +/** + * Connect to the database on localhost with + * the default port (27017) + */ + +var dbname = 'mongoose-example-doc-methods-' + ((Math.random()*10000)|0); +var uri = 'mongodb://localhost/' + dbname; + +console.log('connecting to %s', uri); + +mongoose.connect(uri, function (err) { + // if we failed to connect, abort + if (err) throw err; + + // we connected ok + example(); +}) + +/** + * Use case + */ + +function example () { + Character.create({ name: 'Link', health: 100 }, function (err, link) { + if (err) return done(err); + console.log('found', link); + link.attack(); // 'Link is attacking' + done(); + }) +} + +/** + * Clean up + */ + +function done (err) { + if (err) console.error(err); + mongoose.connection.db.dropDatabase(function () { + mongoose.disconnect(); + }) +} diff --git a/node_modules/mongoose/examples/population-across-three-collections.js b/node_modules/mongoose/examples/population-across-three-collections.js new file mode 100644 index 0000000..4bec928 --- /dev/null +++ b/node_modules/mongoose/examples/population-across-three-collections.js @@ -0,0 +1,135 @@ + +var assert = require('assert') +var mongoose = require('../'); +var Schema = mongoose.Schema; +var ObjectId = mongoose.Types.ObjectId; + +/** + * Connect to the db + */ + +var dbname = 'testing_populateAdInfinitum_' + require('../lib/utils').random() +mongoose.connect('localhost', dbname); +mongoose.connection.on('error', function() { + console.error('connection error', arguments); +}); + +/** + * Schemas + */ + +var user = new Schema({ + name: String, + friends: [{ + type: Schema.ObjectId, + ref: 'User' + }] +}); +var User = mongoose.model('User', user); + +var blogpost = Schema({ + title: String, + tags: [String], + author: { + type: Schema.ObjectId, + ref: 'User' + } +}) +var BlogPost = mongoose.model('BlogPost', blogpost); + +/** + * example + */ + +mongoose.connection.on('open', function() { + + /** + * Generate data + */ + + var userIds = [new ObjectId, new ObjectId, new ObjectId, new ObjectId]; + var users = []; + + users.push({ + _id: userIds[0], + name: 'mary', + friends: [userIds[1], userIds[2], userIds[3]] + }); + users.push({ + _id: userIds[1], + name: 'bob', + friends: [userIds[0], userIds[2], userIds[3]] + }); + users.push({ + _id: userIds[2], + name: 'joe', + friends: [userIds[0], userIds[1], userIds[3]] + }); + users.push({ + _id: userIds[3], + name: 'sally', + friends: [userIds[0], userIds[1], userIds[2]] + }); + + User.create(users, function(err, docs) { + assert.ifError(err); + + var blogposts = []; + blogposts.push({ + title: 'blog 1', + tags: ['fun', 'cool'], + author: userIds[3] + }) + blogposts.push({ + title: 'blog 2', + tags: ['cool'], + author: userIds[1] + }) + blogposts.push({ + title: 'blog 3', + tags: ['fun', 'odd'], + author: userIds[2] + }) + + BlogPost.create(blogposts, function(err, docs) { + assert.ifError(err); + + /** + * Population + */ + + BlogPost + .find({ tags: 'fun' }) + .lean() + .populate('author') + .exec(function(err, docs) { + assert.ifError(err); + + /** + * Populate the populated documents + */ + + var opts = { + path: 'author.friends', + select: 'name', + options: { limit: 2 } + } + + BlogPost.populate(docs, opts, function(err, docs) { + assert.ifError(err); + console.log('populated'); + var s = require('util').inspect(docs, { depth: null }) + console.log(s); + done(); + }) + }) + }) + }) +}); + +function done(err) { + if (err) console.error(err.stack); + mongoose.connection.db.dropDatabase(function() { + mongoose.connection.close(); + }); +} diff --git a/node_modules/mongoose/examples/population-basic.js b/node_modules/mongoose/examples/population-basic.js new file mode 100644 index 0000000..c1d6a70 --- /dev/null +++ b/node_modules/mongoose/examples/population-basic.js @@ -0,0 +1,95 @@ + +var mongoose = require('mongoose') +var Schema = mongoose.Schema; + +console.log('Running mongoose version %s', mongoose.version); + +/** + * Console schema + */ + +var consoleSchema = Schema({ + name: String + , manufacturer: String + , released: Date +}) +var Console = mongoose.model('Console', consoleSchema); + +/** + * Game schema + */ + +var gameSchema = Schema({ + name: String + , developer: String + , released: Date + , consoles: [{ type: Schema.Types.ObjectId, ref: 'Console' }] +}) +var Game = mongoose.model('Game', gameSchema); + +/** + * Connect to the console database on localhost with + * the default port (27017) + */ + +mongoose.connect('mongodb://localhost/console', function (err) { + // if we failed to connect, abort + if (err) throw err; + + // we connected ok + createData(); +}) + +/** + * Data generation + */ + +function createData () { + Console.create({ + name: 'Nintendo 64' + , manufacturer: 'Nintendo' + , released: 'September 29, 1996' + }, function (err, nintendo64) { + if (err) return done(err); + + Game.create({ + name: 'Legend of Zelda: Ocarina of Time' + , developer: 'Nintendo' + , released: new Date('November 21, 1998') + , consoles: [nintendo64] + }, function (err) { + if (err) return done(err); + example(); + }) + }) +} + +/** + * Population + */ + +function example () { + Game + .findOne({ name: /^Legend of Zelda/ }) + .populate('consoles') + .exec(function (err, ocinara) { + if (err) return done(err); + + console.log( + '"%s" was released for the %s on %s' + , ocinara.name + , ocinara.consoles[0].name + , ocinara.released.toLocaleDateString()); + + done(); + }) +} + +function done (err) { + if (err) console.error(err); + Console.remove(function () { + Game.remove(function () { + mongoose.disconnect(); + }) + }) +} diff --git a/node_modules/mongoose/examples/population-of-existing-doc.js b/node_modules/mongoose/examples/population-of-existing-doc.js new file mode 100644 index 0000000..6d48fdc --- /dev/null +++ b/node_modules/mongoose/examples/population-of-existing-doc.js @@ -0,0 +1,101 @@ + +var mongoose = require('mongoose') +var Schema = mongoose.Schema; + +console.log('Running mongoose version %s', mongoose.version); + +/** + * Console schema + */ + +var consoleSchema = Schema({ + name: String + , manufacturer: String + , released: Date +}) +var Console = mongoose.model('Console', consoleSchema); + +/** + * Game schema + */ + +var gameSchema = Schema({ + name: String + , developer: String + , released: Date + , consoles: [{ type: Schema.Types.ObjectId, ref: 'Console' }] +}) +var Game = mongoose.model('Game', gameSchema); + +/** + * Connect to the console database on localhost with + * the default port (27017) + */ + +mongoose.connect('mongodb://localhost/console', function (err) { + // if we failed to connect, abort + if (err) throw err; + + // we connected ok + createData(); +}) + +/** + * Data generation + */ + +function createData () { + Console.create({ + name: 'Nintendo 64' + , manufacturer: 'Nintendo' + , released: 'September 29, 1996' + }, function (err, nintendo64) { + if (err) return done(err); + + Game.create({ + name: 'Legend of Zelda: Ocarina of Time' + , developer: 'Nintendo' + , released: new Date('November 21, 1998') + , consoles: [nintendo64] + }, function (err) { + if (err) return done(err); + example(); + }) + }) +} + +/** + * Population + */ + +function example () { + Game + .findOne({ name: /^Legend of Zelda/ }) + .exec(function (err, ocinara) { + if (err) return done(err); + + console.log('"%s" console _id: %s', ocinara.name, ocinara.consoles[0]); + + // population of existing document + ocinara.populate('consoles', function (err) { + if (err) return done(err); + + console.log( + '"%s" was released for the %s on %s' + , ocinara.name + , ocinara.consoles[0].name + , ocinara.released.toLocaleDateString()); + + done(); + }) + }) +} + +function done (err) { + if (err) console.error(err); + Console.remove(function () { + Game.remove(function () { + mongoose.disconnect(); + }) + }) +} diff --git a/node_modules/mongoose/examples/population-of-multiple-existing-docs.js b/node_modules/mongoose/examples/population-of-multiple-existing-docs.js new file mode 100644 index 0000000..6d918ff --- /dev/null +++ b/node_modules/mongoose/examples/population-of-multiple-existing-docs.js @@ -0,0 +1,112 @@ + +var mongoose = require('mongoose') +var Schema = mongoose.Schema; + +console.log('Running mongoose version %s', mongoose.version); + +/** + * Console schema + */ + +var consoleSchema = Schema({ + name: String + , manufacturer: String + , released: Date +}) +var Console = mongoose.model('Console', consoleSchema); + +/** + * Game schema + */ + +var gameSchema = Schema({ + name: String + , developer: String + , released: Date + , consoles: [{ type: Schema.Types.ObjectId, ref: 'Console' }] +}) +var Game = mongoose.model('Game', gameSchema); + +/** + * Connect to the console database on localhost with + * the default port (27017) + */ + +mongoose.connect('mongodb://localhost/console', function (err) { + // if we failed to connect, abort + if (err) throw err; + + // we connected ok + createData(); +}) + +/** + * Data generation + */ + +function createData () { + Console.create({ + name: 'Nintendo 64' + , manufacturer: 'Nintendo' + , released: 'September 29, 1996' + }, { + name: 'Super Nintendo' + , manufacturer: 'Nintendo' + , released: 'August 23, 1991' + }, function (err, nintendo64, superNintendo) { + if (err) return done(err); + + Game.create({ + name: 'Legend of Zelda: Ocarina of Time' + , developer: 'Nintendo' + , released: new Date('November 21, 1998') + , consoles: [nintendo64] + }, { + name: 'Mario Kart' + , developer: 'Nintendo' + , released: 'September 1, 1992' + , consoles: [superNintendo] + }, function (err) { + if (err) return done(err); + example(); + }) + }) +} + +/** + * Population + */ + +function example () { + Game + .find({}) + .exec(function (err, games) { + if (err) return done(err); + + console.log('found %d games', games.length); + + var options = { path: 'consoles', select: 'name released -_id' }; + Game.populate(games, options, function (err, games) { + if (err) return done(err); + + games.forEach(function (game) { + console.log( + '"%s" was released for the %s on %s' + , game.name + , game.consoles[0].name + , game.released.toLocaleDateString()); + }) + + done() + }) + }) +} + +function done (err) { + if (err) console.error(err); + Console.remove(function () { + Game.remove(function () { + mongoose.disconnect(); + }) + }) +} diff --git a/node_modules/mongoose/examples/population-options.js b/node_modules/mongoose/examples/population-options.js new file mode 100644 index 0000000..7387b3b --- /dev/null +++ b/node_modules/mongoose/examples/population-options.js @@ -0,0 +1,124 @@ + +var mongoose = require('mongoose') +var Schema = mongoose.Schema; + +console.log('Running mongoose version %s', mongoose.version); + +/** + * Console schema + */ + +var consoleSchema = Schema({ + name: String + , manufacturer: String + , released: Date +}) +var Console = mongoose.model('Console', consoleSchema); + +/** + * Game schema + */ + +var gameSchema = Schema({ + name: String + , developer: String + , released: Date + , consoles: [{ type: Schema.Types.ObjectId, ref: 'Console' }] +}) +var Game = mongoose.model('Game', gameSchema); + +/** + * Connect to the console database on localhost with + * the default port (27017) + */ + +mongoose.connect('mongodb://localhost/console', function (err) { + // if we failed to connect, abort + if (err) throw err; + + // we connected ok + createData(); +}) + +/** + * Data generation + */ + +function createData () { + Console.create({ + name: 'Nintendo 64' + , manufacturer: 'Nintendo' + , released: 'September 29, 1996' + }, { + name: 'Super Nintendo' + , manufacturer: 'Nintendo' + , released: 'August 23, 1991' + }, { + name: 'XBOX 360' + , manufacturer: 'Microsoft' + , released: 'November 22, 2005' + }, function (err, nintendo64, superNintendo, xbox360) { + if (err) return done(err); + + Game.create({ + name: 'Legend of Zelda: Ocarina of Time' + , developer: 'Nintendo' + , released: new Date('November 21, 1998') + , consoles: [nintendo64] + }, { + name: 'Mario Kart' + , developer: 'Nintendo' + , released: 'September 1, 1992' + , consoles: [superNintendo] + }, { + name: 'Perfect Dark Zero' + , developer: 'Rare' + , released: 'November 17, 2005' + , consoles: [xbox360] + }, function (err) { + if (err) return done(err); + example(); + }) + }) +} + +/** + * Population + */ + +function example () { + Game + .find({}) + .populate({ + path: 'consoles' + , match: { manufacturer: 'Nintendo' } + , select: 'name' + , options: { comment: 'population' } + }) + .exec(function (err, games) { + if (err) return done(err); + + games.forEach(function (game) { + console.log( + '"%s" was released for the %s on %s' + , game.name + , game.consoles.length ? game.consoles[0].name : '??' + , game.released.toLocaleDateString()); + }) + + return done(); + }) +} + +/** + * Clean up + */ + +function done (err) { + if (err) console.error(err); + Console.remove(function () { + Game.remove(function () { + mongoose.disconnect(); + }) + }) +} diff --git a/node_modules/mongoose/examples/population-plain-objects.js b/node_modules/mongoose/examples/population-plain-objects.js new file mode 100644 index 0000000..50fc9fa --- /dev/null +++ b/node_modules/mongoose/examples/population-plain-objects.js @@ -0,0 +1,96 @@ + +var mongoose = require('mongoose') +var Schema = mongoose.Schema; + +console.log('Running mongoose version %s', mongoose.version); + +/** + * Console schema + */ + +var consoleSchema = Schema({ + name: String + , manufacturer: String + , released: Date +}) +var Console = mongoose.model('Console', consoleSchema); + +/** + * Game schema + */ + +var gameSchema = Schema({ + name: String + , developer: String + , released: Date + , consoles: [{ type: Schema.Types.ObjectId, ref: 'Console' }] +}) +var Game = mongoose.model('Game', gameSchema); + +/** + * Connect to the console database on localhost with + * the default port (27017) + */ + +mongoose.connect('mongodb://localhost/console', function (err) { + // if we failed to connect, abort + if (err) throw err; + + // we connected ok + createData(); +}) + +/** + * Data generation + */ + +function createData () { + Console.create({ + name: 'Nintendo 64' + , manufacturer: 'Nintendo' + , released: 'September 29, 1996' + }, function (err, nintendo64) { + if (err) return done(err); + + Game.create({ + name: 'Legend of Zelda: Ocarina of Time' + , developer: 'Nintendo' + , released: new Date('November 21, 1998') + , consoles: [nintendo64] + }, function (err) { + if (err) return done(err); + example(); + }) + }) +} + +/** + * Population + */ + +function example () { + Game + .findOne({ name: /^Legend of Zelda/ }) + .populate('consoles') + .lean() // just return plain objects, not documents wrapped by mongoose + .exec(function (err, ocinara) { + if (err) return done(err); + + console.log( + '"%s" was released for the %s on %s' + , ocinara.name + , ocinara.consoles[0].name + , ocinara.released.toLocaleDateString()); + + done(); + }) +} + +function done (err) { + if (err) console.error(err); + Console.remove(function () { + Game.remove(function () { + mongoose.disconnect(); + }) + }) +} diff --git a/node_modules/mongoose/lib/collection.js b/node_modules/mongoose/lib/collection.js index 1c2ab7d..1c38286 100644 --- a/node_modules/mongoose/lib/collection.js +++ b/node_modules/mongoose/lib/collection.js @@ -17,13 +17,22 @@ var STATES = require('./connectionstate') */ function Collection (name, conn, opts) { + if (undefined === opts) opts = {}; + if (undefined === opts.capped) opts.capped = {}; + + opts.bufferCommands = undefined === opts.bufferCommands + ? true + : opts.bufferCommands; + + if ('number' == typeof opts.capped) { + opts.capped = { size: opts.capped }; + } + + this.opts = opts; this.name = name; this.conn = conn; - this.buffer = true; this.queue = []; - - if ('number' == typeof opts) opts = { size: opts }; - this.opts = opts || {}; + this.buffer = this.opts.bufferCommands; if (STATES.connected == this.conn.readyState) { this.onOpen(); @@ -67,7 +76,9 @@ Collection.prototype.onOpen = function () { */ Collection.prototype.onClose = function () { - this.buffer = true; + if (this.opts.bufferCommands) { + this.buffer = true; + } }; /** diff --git a/node_modules/mongoose/lib/connection.js b/node_modules/mongoose/lib/connection.js index 7a32990..ef4595f 100644 --- a/node_modules/mongoose/lib/connection.js +++ b/node_modules/mongoose/lib/connection.js @@ -127,6 +127,7 @@ Connection.prototype.db; * replset - passed to the connection ReplSet instance * user - username for authentication * pass - password for authentication + * auth - options for authentication (see http://mongodb.github.com/node-mongodb-native/api-generated/db.html#authenticate) * * ####Notes: * @@ -142,6 +143,7 @@ Connection.prototype.db; * @param {Object} [options] options * @param {Function} [callback] * @see node-mongodb-native https://github.com/mongodb/node-mongodb-native + * @see http://mongodb.github.com/node-mongodb-native/api-generated/db.html#authenticate * @api public */ @@ -246,7 +248,7 @@ Connection.prototype.open = function (host, database, port, options, callback) { }; /** - * Connects to a replica set. + * Opens the connection to a replica set. * * ####Example: * @@ -263,14 +265,22 @@ Connection.prototype.open = function (host, database, port, options, callback) { * replset - passed to the connection ReplSetServer instance * user - username for authentication * pass - password for authentication + * auth - options for authentication (see http://mongodb.github.com/node-mongodb-native/api-generated/db.html#authenticate) * * _Options passed take precedence over options included in connection strings._ * + * ####Notes: + * + * Mongoose forces the db option `forceServerObjectId` false and cannot be overridden. + * Mongoose defaults the server `auto_reconnect` options to true which can be overridden. + * See the node-mongodb-native driver instance for options that it understands. + * * @param {String} uris comma-separated mongodb:// `URI`s * @param {String} [database] database name if not included in `uris` * @param {Object} [options] passed to the internal driver * @param {Function} [callback] * @see node-mongodb-native https://github.com/mongodb/node-mongodb-native + * @see http://mongodb.github.com/node-mongodb-native/api-generated/db.html#authenticate * @api public */ @@ -433,7 +443,7 @@ Connection.prototype.onOpen = function (callback) { // re-authenticate if (self.user && self.pass) { - self.db.authenticate(self.user, self.pass, open); + self.db.authenticate(self.user, self.pass, self.options.auth, open); } else open(); @@ -505,6 +515,8 @@ Connection.prototype.onClose = function () { /** * Retrieves a collection, creating it if not cached. * + * Not typically needed by applications. Just talk to your collection through your model. + * * @param {String} name of the collection * @param {Object} [options] optional collection options * @return {Collection} collection instance @@ -556,6 +568,10 @@ Connection.prototype.model = function (name, schema, collection) { schema = false; } + if (utils.isObject(schema) && !(schema instanceof Schema)) { + schema = new Schema(schema); + } + if (this.models[name] && !collection) { // model exists but we are not subclassing with custom collection if (schema instanceof Schema && schema != this.models[name].schema) { @@ -613,6 +629,16 @@ Connection.prototype.model = function (name, schema, collection) { return this.models[name] = model.__subclass(this, schema, collection); } +/** + * Returns an array of model names created on this connection. + * @api public + * @return {Array} + */ + +Connection.prototype.modelNames = function () { + return Object.keys(this.models); +} + /** * Set profiling level. * diff --git a/node_modules/mongoose/lib/document.js b/node_modules/mongoose/lib/document.js index fef4e63..df88fc0 100644 --- a/node_modules/mongoose/lib/document.js +++ b/node_modules/mongoose/lib/document.js @@ -3,6 +3,7 @@ */ var EventEmitter = require('events').EventEmitter + , setMaxListeners = EventEmitter.prototype.setMaxListeners , MongooseError = require('./error') , MixedSchema = require('./schema/mixed') , Schema = require('./schema') @@ -11,20 +12,21 @@ var EventEmitter = require('events').EventEmitter , clone = utils.clone , isMongooseObject = utils.isMongooseObject , inspect = require('util').inspect - , StateMachine = require('./statemachine') - , ActiveRoster = StateMachine.ctor('require', 'modify', 'init', 'default') - , ValidationError = require('./errors/validation') - , DocumentError = require('./errors/document') + , ElemMatchError = MongooseError.ElemMatchError + , ValidationError = MongooseError.ValidationError + , DocumentError = MongooseError.DocumentError + , InternalCache = require('./internal') , deepEqual = utils.deepEqual , hooks = require('hooks') , DocumentArray , MongooseArray + , Embedded /** * Document constructor. * * @param {Object} obj the values to set - * @param {Object} [fields] the fields which were selected in the query returning this document + * @param {Object} [opts] optional object containing the fields which were selected in the query returning this document and any populated paths data * @param {Boolean} [skipId] bool, should we auto create an ObjectId _id * @inherits NodeJS EventEmitter http://nodejs.org/api/events.html#events_class_events_eventemitter * @event `init`: Emitted on a document after it has was retreived from the db and fully hydrated by Mongoose. @@ -33,39 +35,34 @@ var EventEmitter = require('events').EventEmitter */ function Document (obj, fields, skipId) { - this.setMaxListeners(0); + this.$__ = new InternalCache; + this.isNew = true; + this.errors = undefined; + + var schema = this.schema; if ('boolean' === typeof fields) { - this._strictMode = fields; - this._selected = fields = undefined; + this.$__.strictMode = fields; + fields = undefined; } else { - this._strictMode = this.schema.options && this.schema.options.strict; - this._selected = fields; + this.$__.strictMode = schema.options && schema.options.strict; + this.$__.selected = fields; } - this.isNew = true; - this.errors = undefined; - this._shardval = undefined; - this._saveError = undefined; - this._validationError = undefined; - this._adhocPaths = undefined; - this._removing = undefined; - this._inserting = undefined; - this.__version = undefined; - this.__getters = {}; - this.__id = undefined; - - this._activePaths = new ActiveRoster; - - var required = this.schema.requiredPaths(); + var required = schema.requiredPaths(); for (var i = 0; i < required.length; ++i) { - this._activePaths.require(required[i]); + this.$__.activePaths.require(required[i]); } - this._doc = this._buildDoc(obj, fields, skipId); - if (obj) this.set(obj, undefined, true); - this._registerHooks(); -}; + setMaxListeners.call(this, 0); + this._doc = this.$__buildDoc(obj, fields, skipId); + + if (obj) { + this.set(obj, undefined, true); + } + + this.$__registerHooks(); +} /*! * Inherit from EventEmitter. @@ -124,9 +121,11 @@ Document.prototype.errors; * @param {Boolean} [skipId] * @return {Object} * @api private + * @method $__buildDoc + * @memberOf Document */ -Document.prototype._buildDoc = function (obj, fields, skipId) { +Document.prototype.$__buildDoc = function (obj, fields, skipId) { var doc = {} , self = this , exclude @@ -180,7 +179,7 @@ Document.prototype._buildDoc = function (obj, fields, skipId) { def = type.getDefault(self, true); if ('undefined' !== typeof def) { doc_[piece] = def; - self._activePaths.default(p); + self.$__.activePaths.default(p); } } else if (p in fields) { @@ -188,14 +187,14 @@ Document.prototype._buildDoc = function (obj, fields, skipId) { def = type.getDefault(self, true); if ('undefined' !== typeof def) { doc_[piece] = def; - self._activePaths.default(p); + self.$__.activePaths.default(p); } } } else { def = type.getDefault(self, true); if ('undefined' !== typeof def) { doc_[piece] = def; - self._activePaths.default(p); + self.$__.activePaths.default(p); } } } else { @@ -217,11 +216,28 @@ Document.prototype._buildDoc = function (obj, fields, skipId) { * @api private */ -Document.prototype.init = function (doc, fn) { +Document.prototype.init = function (doc, opts, fn) { + // do not prefix this method with $__ since its + // used by public hooks + + if ('function' == typeof opts) { + fn = opts; + opts = null; + } + this.isNew = false; + // handle docs with populated paths + if (doc._id && opts && opts.populated && opts.populated.length) { + var id = String(doc._id); + for (var i = 0; i < opts.populated.length; ++i) { + var item = opts.populated[i]; + this.populated(item.path, item._docs[id], item); + } + } + init(this, doc, this._doc); - this._storeShard(); + this.$__storeShard(); this.emit('init', this); if (fn) fn(null); @@ -253,16 +269,14 @@ function init (self, obj, doc, prefix) { if (!schema && obj[i] && 'Object' === obj[i].constructor.name) { // assume nested object - if (!doc[i]) { - doc[i] = {}; - } + if (!doc[i]) doc[i] = {}; init(self, obj[i], doc[i], path + '.'); } else { if (obj[i] === null) { doc[i] = null; } else if (obj[i] !== undefined) { if (schema) { - self.try(function(){ + self.$__try(function(){ doc[i] = schema.cast(obj[i], self, true); }); } else { @@ -270,7 +284,7 @@ function init (self, obj, doc, prefix) { } } // mark as hydrated - self._activePaths.init(path); + self.$__.activePaths.init(path); } } }; @@ -283,14 +297,16 @@ function init (self, obj, doc, prefix) { * _Shard key values do not / are not allowed to change._ * * @api private + * @method $__storeShard + * @memberOf Document */ -Document.prototype._storeShard = function _storeShard () { +Document.prototype.$__storeShard = function () { // backwards compat var key = this.schema.options.shardKey || this.schema.options.shardkey; if (!(key && 'Object' == key.constructor.name)) return; - var orig = this._shardval = {} + var orig = this.$__.shardval = {} , paths = Object.keys(key) , len = paths.length , val @@ -337,7 +353,7 @@ for (var k in hooks) { Document.prototype.update = function update () { var args = utils.args(arguments); args.unshift({_id: this._id}); - this.constructor.update.apply(this.constructor, args); + return this.constructor.update.apply(this.constructor, args); } /** @@ -362,6 +378,9 @@ Document.prototype.update = function update () { * // only-the-fly cast to string * doc.set(path, value, String) * + * // changing strict mode behavior + * doc.set(path, value, { strict: false }); + * * @param {String|Object} path path or object of key/vals to set * @param {Any} val the value to set * @param {Schema|String|Number|Buffer|etc..} [type] optionally specify a type for "on-the-fly" attributes @@ -380,8 +399,12 @@ Document.prototype.set = function (path, val, type, options) { , constructing = true === type , adhocs + var strict = options && 'strict' in options + ? options.strict + : this.$__.strictMode; + if (adhoc) { - adhocs = this._adhocPaths || (this._adhocPaths = {}); + adhocs = this.$__.adhocPaths || (this.$__.adhocPaths = {}); adhocs[path] = Schema.interpretAsType(path, type); } @@ -411,12 +434,12 @@ Document.prototype.set = function (path, val, type, options) { if (null != path[key] && 'Object' == path[key].constructor.name && 'virtual' != pathtype - && !(this._path(prefix + key) instanceof MixedSchema)) { + && !(this.$__path(prefix + key) instanceof MixedSchema)) { this.set(path[key], prefix + key, constructing); - } else if (this._strictMode) { + } else if (strict) { if ('real' === pathtype || 'virtual' === pathtype) { this.set(prefix + key, path[key], constructing); - } else if ('throw' == this._strictMode) { + } else if ('throw' == strict) { throw new Error("Field `" + key + "` is not in schema."); } } else if (undefined !== path[key]) { @@ -439,14 +462,14 @@ Document.prototype.set = function (path, val, type, options) { } var schema; - if ('adhocOrUndefined' == pathType && this._strictMode) { + if ('adhocOrUndefined' == pathType && strict) { return this; } else if ('virtual' == pathType) { schema = this.schema.virtualpath(path); schema.applySetters(val, this); return this; } else { - schema = this._path(path); + schema = this.$__path(path); } var parts = path.split('.') @@ -473,7 +496,7 @@ Document.prototype.set = function (path, val, type, options) { } if (!schema || null === val || undefined === val) { - this._set(pathToMark, path, constructing, parts, schema, val); + this.$__set(pathToMark, path, constructing, parts, schema, val); return this; } @@ -485,12 +508,12 @@ Document.prototype.set = function (path, val, type, options) { ? undefined : this.get(path); - var shouldSet = this.try(function(){ + var shouldSet = this.$__try(function(){ val = schema.applySetters(val, self, false, priorVal); }); if (shouldSet) { - this._set(pathToMark, path, constructing, parts, schema, val, priorVal); + this.$__set(pathToMark, path, constructing, parts, schema, val, priorVal); } return this; @@ -501,9 +524,11 @@ Document.prototype.set = function (path, val, type, options) { * * @return {Boolean} * @api private + * @method $__shouldModify + * @memberOf Document */ -Document.prototype._shouldModify = function ( +Document.prototype.$__shouldModify = function ( pathToMark, path, constructing, parts, schema, val, priorVal) { if (this.isNew) return true; @@ -515,7 +540,7 @@ Document.prototype._shouldModify = function ( return true; } - if (undefined === val && path in this._activePaths.states.default) { + if (undefined === val && path in this.$__.activePaths.states.default) { // we're just unsetting the default value which was never saved return false; } @@ -526,7 +551,7 @@ Document.prototype._shouldModify = function ( if (!constructing && null != val && - path in this._activePaths.states.default && + path in this.$__.activePaths.states.default && deepEqual(val, schema.getDefault(this, constructing))) { // a path with a default was $unset on the server // and the user is setting it to the same value again @@ -540,12 +565,14 @@ Document.prototype._shouldModify = function ( * Handles the actual setting of the value and marking the path modified if appropriate. * * @api private + * @method $__set + * @memberOf Document */ -Document.prototype._set = function ( +Document.prototype.$__set = function ( pathToMark, path, constructing, parts, schema, val, priorVal) { - var shouldModify = this._shouldModify.apply(this, arguments); + var shouldModify = this.$__shouldModify.apply(this, arguments); if (shouldModify) { this.markModified(pathToMark, val); @@ -587,19 +614,7 @@ Document.prototype._set = function ( */ Document.prototype.getValue = function (path) { - var parts = path.split('.') - , obj = this._doc - , part; - - for (var i = 0, l = parts.length; i < l; i++) { - part = parts[i]; - obj = obj.getValue - ? obj.getValue(part) // If we have an embedded array document member - : obj[part]; - if (!obj) return obj; - } - - return obj; + return utils.getValue(path, this._doc); } /** @@ -611,16 +626,9 @@ Document.prototype.getValue = function (path) { */ Document.prototype.setValue = function (path, val) { - var parts = path.split('.') - , obj = this._doc; - - for (var i = 0, len = parts.length-1; i < len; i++) { - obj = obj[parts[i]]; - } - - obj[parts[len]] = val; + utils.setValue(path, val, this._doc); return this; -}; +} /** * Returns the value of a path. @@ -641,11 +649,11 @@ Document.prototype.setValue = function (path, val) { Document.prototype.get = function (path, type) { var adhocs; if (type) { - adhocs = this._adhocPaths || (this._adhocPaths = {}); + adhocs = this.$__.adhocPaths || (this.$__.adhocPaths = {}); adhocs[path] = Schema.interpretAsType(path, type); } - var schema = this._path(path) || this.schema.virtualpath(path) + var schema = this.$__path(path) || this.schema.virtualpath(path) , pieces = path.split('.') , obj = this._doc; @@ -665,10 +673,12 @@ Document.prototype.get = function (path, type) { * * @param {String} path * @api private + * @method $__path + * @memberOf Document */ -Document.prototype._path = function (path) { - var adhocs = this._adhocPaths +Document.prototype.$__path = function (path) { + var adhocs = this.$__.adhocPaths , adhocType = adhocs && adhocs[path]; if (adhocType) { @@ -694,7 +704,7 @@ Document.prototype._path = function (path) { */ Document.prototype.markModified = function (path) { - this._activePaths.modify(path); + this.$__.activePaths.modify(path); } /** @@ -703,15 +713,17 @@ Document.prototype.markModified = function (path) { * @param {Function} fn function to execute * @param {Object} scope the scope with which to call fn * @api private + * @method $__try + * @memberOf Document */ -Document.prototype.try = function (fn, scope) { +Document.prototype.$__try = function (fn, scope) { var res; try { fn.call(scope); res = true; } catch (e) { - this._error(e); + this.$__error(e); res = false; } return res; @@ -725,7 +737,7 @@ Document.prototype.try = function (fn, scope) { */ Document.prototype.modifiedPaths = function () { - var directModifiedPaths = Object.keys(this._activePaths.states.modify); + var directModifiedPaths = Object.keys(this.$__.activePaths.states.modify); return directModifiedPaths.reduce(function (list, path) { var parts = path.split('.'); @@ -756,7 +768,7 @@ Document.prototype.modifiedPaths = function () { Document.prototype.isModified = function (path) { return path ? !!~this.modifiedPaths().indexOf(path) - : this._activePaths.some('modify'); + : this.$__.activePaths.some('modify'); }; /** @@ -774,7 +786,7 @@ Document.prototype.isModified = function (path) { */ Document.prototype.isDirectModified = function (path) { - return (path in this._activePaths.states.modify); + return (path in this.$__.activePaths.states.modify); }; /** @@ -786,7 +798,7 @@ Document.prototype.isDirectModified = function (path) { */ Document.prototype.isInit = function (path) { - return (path in this._activePaths.states.init); + return (path in this.$__.activePaths.states.init); }; /** @@ -805,30 +817,30 @@ Document.prototype.isInit = function (path) { */ Document.prototype.isSelected = function isSelected (path) { - if (this._selected) { + if (this.$__.selected) { if ('_id' === path) { - return 0 !== this._selected._id; + return 0 !== this.$__.selected._id; } - var paths = Object.keys(this._selected) + var paths = Object.keys(this.$__.selected) , i = paths.length , inclusive = false , cur if (1 === i && '_id' === paths[0]) { // only _id was selected. - return 0 === this._selected._id; + return 0 === this.$__.selected._id; } while (i--) { cur = paths[i]; if ('_id' == cur) continue; - inclusive = !! this._selected[cur]; + inclusive = !! this.$__.selected[cur]; break; } - if (path in this._selected) { + if (path in this.$__.selected) { return inclusive; } @@ -876,14 +888,14 @@ Document.prototype.validate = function (cb) { var self = this // only validate required fields when necessary - var paths = Object.keys(this._activePaths.states.require).filter(function (path) { + var paths = Object.keys(this.$__.activePaths.states.require).filter(function (path) { if (!self.isSelected(path) && !self.isModified(path)) return false; return true; }); - paths = paths.concat(Object.keys(this._activePaths.states.init)); - paths = paths.concat(Object.keys(this._activePaths.states.modify)); - paths = paths.concat(Object.keys(this._activePaths.states.default)); + paths = paths.concat(Object.keys(this.$__.activePaths.states.init)); + paths = paths.concat(Object.keys(this.$__.activePaths.states.modify)); + paths = paths.concat(Object.keys(this.$__.activePaths.states.default)); if (0 === paths.length) { complete(); @@ -906,16 +918,24 @@ Document.prototype.validate = function (cb) { var p = self.schema.path(path); if (!p) return --total || complete(); - p.doValidate(self.getValue(path), function (err) { - if (err) self.invalidate(path, err, true); + var val = self.getValue(path); + p.doValidate(val, function (err) { + if (err) { + self.invalidate( + path + , err + , undefined + , true // embedded docs + ); + } --total || complete(); }, self); }); } function complete () { - var err = self._validationError; - self._validationError = undefined; + var err = self.$__.validationError; + self.$__.validationError = undefined; self.emit('validate', self); cb(err); } @@ -926,19 +946,25 @@ Document.prototype.validate = function (cb) { * * @param {String} path the field to invalidate * @param {String|Error} err the error which states the reason `path` was invalid + * @param {Object|String|Number|any} value optional invalid value * @api public */ -Document.prototype.invalidate = function (path, err) { - if (!this._validationError) { - this._validationError = new ValidationError(this); +Document.prototype.invalidate = function (path, err, val) { + if (!this.$__.validationError) { + this.$__.validationError = new ValidationError(this); } if (!err || 'string' === typeof err) { - err = new ValidatorError(path, err); + // sniffing arguments: + // need to handle case where user does not pass value + // so our error message is cleaner + err = 2 < arguments.length + ? new ValidatorError(path, err, val) + : new ValidatorError(path, err) } - this._validationError.errors[path] = err; + this.$__.validationError.errors[path] = err; } /** @@ -946,13 +972,15 @@ Document.prototype.invalidate = function (path, err) { * * @api private * @return {Document} + * @method $__reset + * @memberOf Document */ -Document.prototype._reset = function reset () { +Document.prototype.$__reset = function reset () { var self = this; DocumentArray || (DocumentArray = require('./types/documentarray')); - this._activePaths + this.$__.activePaths .map('init', 'modify', function (i) { return self.getValue(i); }) @@ -964,12 +992,12 @@ Document.prototype._reset = function reset () { while (i--) { var doc = array[i]; if (!doc) continue; - doc._reset(); + doc.$__reset(); } }); // clear atomics - this._dirty().forEach(function (dirt) { + this.$__dirty().forEach(function (dirt) { var type = dirt.value; if (type && type._atomics) { type._atomics = {}; @@ -977,12 +1005,12 @@ Document.prototype._reset = function reset () { }); // Clear 'modify'('dirty') cache - this._activePaths.clear('modify'); - this._validationError = undefined; + this.$__.activePaths.clear('modify'); + this.$__.validationError = undefined; this.errors = undefined; var self = this; this.schema.requiredPaths().forEach(function (path) { - self._activePaths.require(path); + self.$__.activePaths.require(path); }); return this; @@ -992,15 +1020,17 @@ Document.prototype._reset = function reset () { * Returns this documents dirty paths / vals. * * @api private + * @method $__dirty + * @memberOf Document */ -Document.prototype._dirty = function _dirty () { +Document.prototype.$__dirty = function () { var self = this; - var all = this._activePaths.map('modify', function (path) { + var all = this.$__.activePaths.map('modify', function (path) { return { path: path , value: self.getValue(path) - , schema: self._path(path) }; + , schema: self.$__path(path) }; }); // Sort dirty paths in a flat hierarchy. @@ -1019,10 +1049,8 @@ Document.prototype._dirty = function _dirty () { minimal.push(item); top = item; } else { - if (!(item.value && top.value)) return; - // special case for top level MongooseArrays - if (top.value._atomics && top.value.hasAtomics()) { + if (top.value && top.value._atomics && top.value.hasAtomics()) { // the `top` array itself and a sub path of `top` are being modified. // the only way to honor all of both modifications is through a $set // of entire array. @@ -1075,14 +1103,14 @@ function define (prop, subprops, prototype, prefix, keys) { Object.defineProperty(prototype, prop, { enumerable: true , get: function () { - if (!this.__getters) - this.__getters = {}; + if (!this.$__.getters) + this.$__.getters = {}; - if (!this.__getters[path]) { + if (!this.$__.getters[path]) { var nested = Object.create(this); // save scope for nested getters/setters - if (!prefix) nested._scope = this; + if (!prefix) nested.$__.scope = this; // shadow inherited getters from sub-objects so // thing.nested.nested.nested... doesn't occur (gh-366) @@ -1104,14 +1132,14 @@ function define (prop, subprops, prototype, prefix, keys) { }; compile(subprops, nested, path); - this.__getters[path] = nested; + this.$__.getters[path] = nested; } - return this.__getters[path]; + return this.$__.getters[path]; } , set: function (v) { if (v instanceof Document) v = v.toObject(); - return this.set(path, v); + return (this.$__.scope || this).set(path, v); } }); @@ -1119,8 +1147,8 @@ function define (prop, subprops, prototype, prefix, keys) { Object.defineProperty(prototype, prop, { enumerable: true - , get: function ( ) { return this.get.call(this._scope || this, path); } - , set: function (v) { return this.set.call(this._scope || this, path, v); } + , get: function ( ) { return this.get.call(this.$__.scope || this, path); } + , set: function (v) { return this.set.call(this.$__.scope || this, path, v); } }); } }; @@ -1130,9 +1158,11 @@ function define (prop, subprops, prototype, prefix, keys) { * * @param {Schema} schema * @api private + * @method $__setSchema + * @memberOf Document */ -Document.prototype._setSchema = function (schema) { +Document.prototype.$__setSchema = function (schema) { compile(schema.tree, this); this.schema = schema; } @@ -1141,14 +1171,17 @@ Document.prototype._setSchema = function (schema) { * Register default hooks * * @api private + * @method $__registerHooks + * @memberOf Document */ -Document.prototype._registerHooks = function _registerHooks () { +Document.prototype.$__registerHooks = function () { if (!this.save) return; DocumentArray || (DocumentArray = require('./types/documentarray')); this.pre('save', function (next) { + // validate all document arrays. // we keep the error semaphore to make sure we don't // call `save` unnecessarily (we only need 1 error) var subdocs = 0 @@ -1156,7 +1189,7 @@ Document.prototype._registerHooks = function _registerHooks () { , self = this; // check for DocumentArrays - var arrays = this._activePaths + var arrays = this.$__.activePaths .map('init', 'modify', function (i) { return self.getValue(i); }) @@ -1193,7 +1226,7 @@ Document.prototype._registerHooks = function _registerHooks () { if (error) return; if (err) { - self._validationError = undefined; + self.$__.validationError = undefined; return next(error = err); } @@ -1215,9 +1248,10 @@ Document.prototype._registerHooks = function _registerHooks () { } }).pre('save', function checkForExistingErrors (next) { // if any doc.set() calls failed - if (this._saveError) { - next(this._saveError); - this._saveError = null; + var err = this.$__.saveError; + if (err) { + this.$__.saveError = null; + next(err); } else { next(); } @@ -1226,7 +1260,7 @@ Document.prototype._registerHooks = function _registerHooks () { }); // add user defined queues - this._doQueue(); + this.$__doQueue(); }; /** @@ -1234,10 +1268,12 @@ Document.prototype._registerHooks = function _registerHooks () { * * @param {Error} err * @api private + * @method $__error + * @memberOf Document */ -Document.prototype._error = function (err) { - this._saveError = err; +Document.prototype.$__error = function (err) { + this.$__.saveError = err; return this; }; @@ -1245,9 +1281,11 @@ Document.prototype._error = function (err) { * Executes methods queued from the Schema definition * * @api private + * @method $__doQueue + * @memberOf Document */ -Document.prototype._doQueue = function () { +Document.prototype.$__doQueue = function () { var q = this.schema && this.schema.callQueue; if (q) { for (var i = 0, l = q.length; i < l; i++) { @@ -1258,7 +1296,9 @@ Document.prototype._doQueue = function () { }; /** - * Converts this document into a plain javascript object + * Converts this document into a plain javascript object, ready for storage in MongoDB. + * + * Buffers are converted to instances of [mongodb.Binary](http://mongodb.github.com/node-mongodb-native/api-bson-generated/binary.html) for proper storage. * * ####Options: * @@ -1362,10 +1402,19 @@ Document.prototype._doQueue = function () { * * @param {Object} [options] * @return {Object} js object + * @see mongodb.Binary http://mongodb.github.com/node-mongodb-native/api-bson-generated/binary.html * @api public */ Document.prototype.toObject = function (options) { + if (options && options.convertToId) { + // populated paths that we set to a document? + Embedded || (Embedded = require('./types/embedded')); + if (!(this instanceof Embedded)) { + return clone(this._id, options); + } + } + // When internally saving this document we always pass options, // bypassing the custom schema options. if (!(options && 'Object' == options.constructor.name)) { @@ -1508,7 +1557,129 @@ Document.prototype.equals = function (doc) { return tid.equals ? tid.equals(docid) : tid === docid; -}; +} + +/** + * Populates document references, executing the `callback` when complete. + * + * ####Example: + * + * doc + * .populate('company') + * .populate({ + * path: 'notes', + * match: /airline/, + * select: 'text', + * match: 'modelName' + * options: opts + * }, function (err, user) { + * assert(doc._id == user._id) // the document itself is passed + * }) + * + * // summary + * doc.populate(path) // not executed + * doc.populate(options); // not executed + * doc.populate(path, callback) // executed + * doc.populate(options, callback); // executed + * doc.populate(callback); // executed + * + * + * ####NOTE: + * + * Population does not occur unless a `callback` is passed. + * Passing the same path a second time will overwrite the previous path options. + * See [Model.populate()](#model_Model.populate) for explaination of options. + * + * @see Model.populate #model_Model.populate + * @param {String|Object} [path] The path to populate or an options object + * @param {Function} [callback] When passed, population is invoked + * @api public + * @return {Document} this + */ + +Document.prototype.populate = function populate () { + if (0 === arguments.length) return this; + + var pop = this.$__.populate || (this.$__.populate = {}); + var args = utils.args(arguments); + var fn; + + if ('function' == typeof args[args.length-1]) { + fn = args.pop(); + } + + // allow `doc.populate(callback)` + if (args.length) { + // use hash to remove duplicate paths + var res = utils.populate.apply(null, args); + for (var i = 0; i < res.length; ++i) { + pop[res[i].path] = res[i]; + } + } + + if (fn) { + var paths = utils.object.vals(pop); + this.$__.populate = undefined; + this.constructor.populate(this, paths, fn); + } + + return this; +} + + +/** + * Gets _id(s) used during population of the given `path`. + * + * ####Example: + * + * Model.findOne().populate('author').exec(function (err, doc) { + * console.log(doc.author.name) // Dr.Seuss + * console.log(doc.populated('author')) // '5144cf8050f071d979c118a7' + * }) + * + * If the path was not populated, undefined is returned. + * + * @param {String} path + * @return {Array|ObjectId|Number|Buffer|String|undefined} + * @api public + */ + +Document.prototype.populated = function (path, val, options) { + // val and options are internal + + if (null == val) { + if (!this.$__.populated) return undefined; + var v = this.$__.populated[path]; + if (v) return v.value; + return undefined; + } + + // internal + + if (true === val) { + if (!this.$__.populated) return undefined; + return this.$__.populated[path]; + } + + this.$__.populated || (this.$__.populated = {}); + this.$__.populated[path] = { value: val, options: options }; + return val; +} + +/** + * Returns the full path to this document. + * + * @param {String} [path] + * @return {String} + * @api private + * @method $__fullPath + * @memberOf Document + */ + +Document.prototype.$__fullPath = function (path) { + // overridden in SubDocuments + return path || ''; +} /*! * Module exports. diff --git a/node_modules/mongoose/lib/drivers/SPEC.md b/node_modules/mongoose/lib/drivers/SPEC.md new file mode 100644 index 0000000..6464693 --- /dev/null +++ b/node_modules/mongoose/lib/drivers/SPEC.md @@ -0,0 +1,4 @@ + +# Driver Spec + +TODO diff --git a/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js b/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js index a53857f..da0f6e7 100644 --- a/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js +++ b/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js @@ -37,11 +37,10 @@ NativeCollection.prototype.__proto__ = MongooseCollection.prototype; NativeCollection.prototype.onOpen = function () { var self = this; - if (this.collection) { - return MongooseCollection.prototype.onOpen.call(self); - } + // always get a new collection in case the user changed host:port + // of parent db instance when re-opening the connection. - if (!self.opts.size) { + if (!self.opts.capped.size) { // non-capped return self.conn.db.collection(self.name, callback); } @@ -67,7 +66,7 @@ NativeCollection.prototype.onOpen = function () { } } else { // create - var opts = utils.clone(self.opts); + var opts = utils.clone(self.opts.capped); opts.capped = true; self.conn.db.createCollection(self.name, opts, callback); } diff --git a/node_modules/mongoose/lib/drivers/node-mongodb-native/connection.js b/node_modules/mongoose/lib/drivers/node-mongodb-native/connection.js index aa46ff1..fb894fc 100644 --- a/node_modules/mongoose/lib/drivers/node-mongodb-native/connection.js +++ b/node_modules/mongoose/lib/drivers/node-mongodb-native/connection.js @@ -45,14 +45,13 @@ NativeConnection.prototype.doOpen = function (fn) { var self = this; this.db.open(function (err) { if (err) return fn(err); - fn(); listen(self); + fn(); }); return this; }; - /*! * Register listeners for important events and bubble appropriately. */ @@ -170,6 +169,7 @@ NativeConnection.prototype.doClose = function (fn) { NativeConnection.prototype.parseOptions = function (passed, connStrOpts) { var o = passed || {}; o.db || (o.db = {}); + o.auth || (o.auth = {}); o.server || (o.server = {}); o.replset || (o.replset = {}); o.server.socketOptions || (o.server.socketOptions = {}); @@ -200,6 +200,16 @@ NativeConnection.prototype.parseOptions = function (passed, connStrOpts) { o.server.socketOptions[name] = o.replset.socketOptions[name] = opts[name]; } break; + case 'authdb': + if ('undefined' == typeof o.auth.authdb) { + o.auth.authdb = opts[name]; + } + break; + case 'authSource': + if ('undefined' == typeof o.auth.authSource) { + o.auth.authSource = opts[name]; + } + break; case 'retries': case 'reconnectWait': case 'rs_name': diff --git a/node_modules/mongoose/lib/error.js b/node_modules/mongoose/lib/error.js index 9216cd9..6d00f80 100644 --- a/node_modules/mongoose/lib/error.js +++ b/node_modules/mongoose/lib/error.js @@ -1,8 +1,8 @@ /** - * Mongoose error + * MongooseError constructor * - * @api private + * @param {String} msg Error message * @inherits Error https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error */ @@ -36,3 +36,4 @@ MongooseError.ValidatorError = require('./errors/validator') MongooseError.VersionError =require('./errors/version') MongooseError.OverwriteModelError = require('./errors/overwriteModel') MongooseError.MissingSchemaError = require('./errors/missingSchema') +MongooseError.DivergentArrayError = require('./errors/divergentArray') diff --git a/node_modules/mongoose/lib/errors/divergentArray.js b/node_modules/mongoose/lib/errors/divergentArray.js new file mode 100644 index 0000000..45809bc --- /dev/null +++ b/node_modules/mongoose/lib/errors/divergentArray.js @@ -0,0 +1,40 @@ + +/*! + * Module dependencies. + */ + +var MongooseError = require('../error'); + +/*! + * DivergentArrayError constructor. + * + * @inherits MongooseError + */ + +function DivergentArrayError (paths) { + var msg = 'For your own good, using `document.save()` to update an array ' + + 'which was selected using an $elemMatch projection OR ' + + 'populated using skip, limit, query conditions, or exclusion of ' + + 'the _id field when the operation results in a $pop or $set of ' + + 'the entire array is not supported. The following ' + + 'path(s) would have been modified unsafely:\n' + + ' ' + paths.join('\n ') + '\n' + + 'Use Model.update() to update these arrays instead.' + // TODO write up a docs page (FAQ) and link to it + + MongooseError.call(this, msg); + Error.captureStackTrace(this, arguments.callee); + this.name = 'DivergentArrayError'; +}; + +/*! + * Inherits from MongooseError. + */ + +DivergentArrayError.prototype.__proto__ = MongooseError.prototype; + +/*! + * exports + */ + +module.exports = DivergentArrayError; diff --git a/node_modules/mongoose/lib/errors/validation.js b/node_modules/mongoose/lib/errors/validation.js index 08f2aaa..1679849 100644 --- a/node_modules/mongoose/lib/errors/validation.js +++ b/node_modules/mongoose/lib/errors/validation.js @@ -25,9 +25,15 @@ function ValidationError (instance) { */ ValidationError.prototype.toString = function () { - return this.name + ': ' + Object.keys(this.errors).map(function (key) { - return String(this.errors[key]); - }, this).join(', '); + var ret = this.name + ': '; + var msgs = []; + + Object.keys(this.errors).forEach(function (key) { + if (this == this.errors[key]) return; + msgs.push(String(this.errors[key])); + }, this) + + return ret + msgs.join(', '); }; /*! diff --git a/node_modules/mongoose/lib/errors/validator.js b/node_modules/mongoose/lib/errors/validator.js index 5499bee..2498b05 100644 --- a/node_modules/mongoose/lib/errors/validator.js +++ b/node_modules/mongoose/lib/errors/validator.js @@ -9,19 +9,25 @@ var MongooseError = require('../error'); * * @param {String} path * @param {String} msg + * @param {String|Number|any} val * @inherits MongooseError * @api private */ -function ValidatorError (path, type) { +function ValidatorError (path, type, val) { var msg = type ? '"' + type + '" ' : ''; - MongooseError.call(this, 'Validator ' + msg + 'failed for path ' + path); + + var message = 'Validator ' + msg + 'failed for path ' + path + if (2 < arguments.length) message += ' with value `' + String(val) + '`'; + + MongooseError.call(this, message); Error.captureStackTrace(this, arguments.callee); this.name = 'ValidatorError'; this.path = path; this.type = type; + this.value = val; }; /*! diff --git a/node_modules/mongoose/lib/index.js b/node_modules/mongoose/lib/index.js index b0c0ed3..ca4cfa0 100644 --- a/node_modules/mongoose/lib/index.js +++ b/node_modules/mongoose/lib/index.js @@ -42,6 +42,8 @@ function Mongoose () { * * mongoose.set('test', value) // sets the 'test' option to `value` * + * mongoose.set('debug', true) // enable logging collection methods + arguments to the console + * * @param {String} key * @param {String} value * @api public @@ -227,11 +229,15 @@ Mongoose.prototype.disconnect = function (fn) { */ Mongoose.prototype.model = function (name, schema, collection, skipInit) { - if (!(schema instanceof Schema)) { + if ('string' == typeof schema) { collection = schema; schema = false; } + if (utils.isObject(schema) && !(schema instanceof Schema)) { + schema = new Schema(schema); + } + if ('boolean' === typeof collection) { skipInit = collection; collection = null; @@ -310,6 +316,22 @@ Mongoose.prototype.model = function (name, schema, collection, skipInit) { return this.models[name] = model; } +/** + * Returns an array of model names created on this instance of Mongoose. + * + * ####Note: + * + * _Does not include names of models created using `connection.model()`._ + * + * @api public + * @return {Array} + */ + +Mongoose.prototype.modelNames = function () { + var names = Object.keys(this.models); + return names; +} + /** * Applies global plugins to `schema`. * @@ -378,40 +400,32 @@ var Connection = require(driver + '/connection'); var Collection = require(driver + '/collection'); -/** - * The exports object is an instance of Mongoose. - * - * @api public - */ - -module.exports = exports = new Mongoose; -var mongoose = module.exports; - /** * The Mongoose Collection constructor * + * @method Collection * @api public */ -mongoose.Collection = Collection; +Mongoose.prototype.Collection = Collection; /** - * The Mongoose Connection constructor + * The Mongoose [Connection](#connection_Connection) constructor * + * @method Connection * @api public */ -mongoose.Connection = Connection; +Mongoose.prototype.Connection = Connection; /** - * Mongoose version + * The Mongoose version * + * @property version * @api public */ -mongoose.version = JSON.parse( - require('fs').readFileSync(__dirname + '/../package.json', 'utf8') -).version; +Mongoose.prototype.version = require(__dirname + '/../package.json').version; /** * The Mongoose constructor @@ -423,13 +437,14 @@ mongoose.version = JSON.parse( * var mongoose = require('mongoose'); * var mongoose2 = new mongoose.Mongoose(); * + * @method Mongoose * @api public */ -mongoose.Mongoose = Mongoose; +Mongoose.prototype.Mongoose = Mongoose; /** - * The Mongoose Schema constructor + * The Mongoose [Schema](#schema_Schema) constructor * * ####Example: * @@ -437,18 +452,20 @@ mongoose.Mongoose = Mongoose; * var Schema = mongoose.Schema; * var CatSchema = new Schema(..); * + * @method Schema * @api public */ -mongoose.Schema = Schema; +Mongoose.prototype.Schema = Schema; /** - * The Mongoose SchemaType constructor. + * The Mongoose [SchemaType](#schematype_SchemaType) constructor * + * @method SchemaType * @api public */ -mongoose.SchemaType = SchemaType; +Mongoose.prototype.SchemaType = SchemaType; /** * The various Mongoose SchemaTypes. @@ -457,19 +474,21 @@ mongoose.SchemaType = SchemaType; * * _Alias of mongoose.Schema.Types for backwards compatibility._ * + * @property SchemaTypes * @see Schema.SchemaTypes #schema_Schema.Types * @api public */ -mongoose.SchemaTypes = Schema.Types; +Mongoose.prototype.SchemaTypes = Schema.Types; /** - * The Mongoose VirtualType constructor. + * The Mongoose [VirtualType](#virtualtype_VirtualType) constructor * + * @method VirtualType * @api public */ -mongoose.VirtualType = VirtualType; +Mongoose.prototype.VirtualType = VirtualType; /** * The various Mongoose Types. @@ -481,67 +500,81 @@ mongoose.VirtualType = VirtualType; * * ####Types: * - * - Array - * - Buffer - * - Document - * - Embedded - * - DocumentArray - * - ObjectId + * - [ObjectId](#types-objectid-js) + * - [Buffer](#types-buffer-js) + * - [SubDocument](#types-embedded-js) + * - [Array](#types-array-js) + * - [DocumentArray](#types-documentarray-js) * * Using this exposed access to the `ObjectId` type, we can construct ids on demand. * * var ObjectId = mongoose.Types.ObjectId; * var id1 = new ObjectId; * + * @property Types * @api public */ -mongoose.Types = Types; +Mongoose.prototype.Types = Types; /** - * The Mongoose Query constructor. + * The Mongoose [Query](#query_Query) constructor. * + * @method Query * @api public */ -mongoose.Query = Query; +Mongoose.prototype.Query = Query; /** - * The Mongoose Promise constructor. + * The Mongoose [Promise](#promise_Promise) constructor. * + * @method Promise * @api public */ -mongoose.Promise = Promise; +Mongoose.prototype.Promise = Promise; /** - * The Mongoose Model constructor. + * The Mongoose [Model](#model_Model) constructor. * + * @method Model * @api public */ -mongoose.Model = Model; +Mongoose.prototype.Model = Model; /** - * The Mongoose Document constructor. + * The Mongoose [Document](#document-js) constructor. * + * @method Document * @api public */ -mongoose.Document = Document; +Mongoose.prototype.Document = Document; /** - * The MongooseError constructor. + * The [MongooseError](#error_MongooseError) constructor. * + * @method Error * @api public */ -mongoose.Error = require('./error'); +Mongoose.prototype.Error = require('./error'); /** - * The node-mongodb-native driver Mongoose uses. + * The [node-mongodb-native](https://github.com/mongodb/node-mongodb-native) driver Mongoose uses. + * + * @property mongo + * @api public + */ + +Mongoose.prototype.mongo = require('mongodb'); + +/*! + * The exports object is an instance of Mongoose. * * @api public */ -mongoose.mongo = require('mongodb'); +var mongoose = module.exports = exports = new Mongoose; diff --git a/node_modules/mongoose/lib/internal.js b/node_modules/mongoose/lib/internal.js new file mode 100644 index 0000000..6b33fb9 --- /dev/null +++ b/node_modules/mongoose/lib/internal.js @@ -0,0 +1,30 @@ +/*! + * Dependencies + */ + +var StateMachine = require('./statemachine') +var ActiveRoster = StateMachine.ctor('require', 'modify', 'init', 'default') + +module.exports = exports = InternalCache; + +function InternalCache () { + this.strictMode = undefined; + this.selected = undefined; + this.shardval = undefined; + this.saveError = undefined; + this.validationError = undefined; + this.adhocPaths = undefined; + this.removing = undefined; + this.inserting = undefined; + this.version = undefined; + this.getters = {}; + this._id = undefined; + this.populate = undefined; + this.populated = undefined; + this.scope = undefined; + this.activePaths = new ActiveRoster; + + // embedded docs + this.ownerDocument = undefined; + this.fullPath = undefined; +} diff --git a/node_modules/mongoose/lib/model.js b/node_modules/mongoose/lib/model.js index e84a65d..2b60ac9 100644 --- a/node_modules/mongoose/lib/model.js +++ b/node_modules/mongoose/lib/model.js @@ -6,14 +6,18 @@ var Document = require('./document') , MongooseArray = require('./types/array') , MongooseBuffer = require('./types/buffer') , MongooseError = require('./error') - , VersionError = require('./errors/version') + , VersionError = MongooseError.VersionError + , DivergentArrayError = MongooseError.DivergentArrayError , Query = require('./query') , Schema = require('./schema') + , Types = require('./schema/index') , utils = require('./utils') + , hasOwnProperty = utils.object.hasOwnProperty , isMongooseObject = utils.isMongooseObject , EventEmitter = require('events').EventEmitter , merge = utils.merge , Promise = require('./promise') + , assert = require('assert') , tick = utils.tick var VERSION_WHERE = 1 @@ -70,217 +74,6 @@ Model.prototype.collection; Model.prototype.modelName; -/** - * Returns what paths can be populated - * - * @param {Query} query object - * @return {Object|undefined} population paths - * @api private - */ - -Model.prototype._getPopulationKeys = function getPopulationKeys (query) { - if (!(query && query.options.populate)) return; - - var names = Object.keys(query.options.populate) - , n = names.length - , name - , paths = {} - , hasKeys - , schema - - while (n--) { - name = names[n]; - schema = this.schema.path(name); - hasKeys = true; - - if (!schema) { - // if the path is not recognized, it's potentially embedded docs - // walk path atoms from right to left to find a matching path - var pieces = name.split('.') - , i = pieces.length; - - while (i--) { - var path = pieces.slice(0, i).join('.') - , pathSchema = this.schema.path(path); - - // loop until we find an array schema - if (pathSchema && pathSchema.caster) { - if (!paths[path]) { - paths[path] = { sub: {} }; - } - - paths[path].sub[pieces.slice(i).join('.')] = query.options.populate[name]; - hasKeys || (hasKeys = true); - break; - } - } - } else { - paths[name] = query.options.populate[name]; - hasKeys || (hasKeys = true); - } - } - - return hasKeys && paths; -}; - -/** - * Populates an object - * - * @param {SchemaType} schema type for the oid - * @param {Object} oid object id or array of object ids - * @param {Object} query object specifying query conditions, fields, and options - * @param {Function} fn - * @api private - */ - -Model.prototype._populate = function populate (schema, oid, query, fn) { - if (!Array.isArray(oid)) { - var conditions = query.conditions || {}; - conditions._id = oid; - - return this - .db.model(query.model || schema.options.ref) - .findOne(conditions, query.fields, query.options, fn); - } - - if (!oid.length) { - return fn(null, oid); - } - - var model = this.db.model(query.model || schema.caster.options.ref) - , conditions = query && query.conditions || {}; - - conditions._id || (conditions._id = { $in: oid }); - - model.find(conditions, query.fields, query.options, function (err, docs) { - if (err) return fn(err); - - // user specified sort order? - if (query.options && query.options.sort) { - return fn(null, docs); - } - - // put back in original id order (using a hash reduces complexity from n*n to 2n) - var docHash = {}; - docs.forEach(function (doc) { - docHash[doc._id] = doc; - }); - - var arr = []; - oid.forEach(function (id) { - if (id in docHash) arr.push(docHash[id]); - }); - - fn(null, arr); - }); -}; - -/** - * Performs auto-population of relations. - * - * @param {Object} doc document returned by mongo - * @param {Query} query query that originated the initialization - * @param {Function} fn - * @api private - */ - -Model.prototype.init = function init (doc, query, fn) { - if ('function' == typeof query) { - fn = query; - query = null; - } - - var populate = this._getPopulationKeys(query); - - if (!populate) { - return Document.prototype.init.call(this, doc, fn); - } - - // population from other models is necessary - var self = this; - - init(doc, '', function (err) { - if (err) return fn(err); - Document.prototype.init.call(self, doc, fn); - }); - - return this; - - function init (obj, prefix, fn) { - prefix = prefix || ''; - - var keys = Object.keys(obj) - , len = keys.length; - - return next(); - - function next () { - if (--len < 0) return fn(); - - var i = keys[len] - , path = prefix + i - , schema = self.schema.path(path) - , total = 0 - , inline = false - , poppath - - if (!schema && obj[i] && 'Object' === obj[i].constructor.name) { - // assume nested object - return init(obj[i], path + '.', next); - } - - if (!(obj[i] && schema && populate[path])) return next(); - - // this query object is re-used and passed around. we clone - // it to prevent query condition contamination between - // one populate call to the next. - poppath = utils.clone(populate[path]); - - if (poppath.sub) { - obj[i].forEach(function (subobj) { - inline = true; - - var pkeys = Object.keys(poppath.sub) - , pi = pkeys.length - , key - - while (pi--) { - key = pkeys[pi]; - - if (subobj[key]) (function (key) { - total++; - self._populate(schema.schema.path(key), subobj[key], poppath.sub[key], done); - function done (err, doc) { - if (err) return error(err); - subobj[key] = doc; - if (--total < 1 && !inline) { - next(); - } - } - })(key); - } - }); - - inline = false; - - if (0 === total) return next(); - - } else { - self._populate(schema, obj[i], poppath, function (err, doc) { - if (err) return error(err); - obj[i] = doc; - next(); - }); - } - }; - }; - - function error (err) { - if (error.err) return; - fn(error.err = err); - } -}; - /*! * Handles doc.save() callbacks */ @@ -290,7 +83,7 @@ function handleSave (promise, self) { if (err) { // If the initial insert fails provide a second chance. // (If we did this all the time we would break updates) - if (self._inserting) { + if (self.$__.inserting) { self.isNew = true; self.emit('isNew', true); } @@ -299,7 +92,7 @@ function handleSave (promise, self) { return; } - self._storeShard(); + self.$__storeShard(); var numAffected; if (result) { @@ -312,9 +105,9 @@ function handleSave (promise, self) { } // was this an update that required a version bump? - if (self.__version && !self._inserting) { - var doIncrement = VERSION_INC === (VERSION_INC & self.__version); - self.__version = undefined; + if (self.$__.version && !self.$__.inserting) { + var doIncrement = VERSION_INC === (VERSION_INC & self.$__.version); + self.$__.version = undefined; // increment version if was successful if (numAffected > 0) { @@ -376,30 +169,30 @@ Model.prototype.save = function save (fn) { if (this.isNew) { // send entire doc var obj = this.toObject({ depopulate: 1 }); - this._version(true, obj); + this.$__version(true, obj); this.collection.insert(obj, options, complete); - this._reset(); + this.$__reset(); this.isNew = false; this.emit('isNew', false); // Make it possible to retry the insert - this._inserting = true; + this.$__.inserting = true; } else { // Make sure we don't treat it as a new object on error, // since it already exists - this._inserting = false; + this.$__.inserting = false; - var delta = this._delta(); + var delta = this.$__delta(); if (delta) { - var where = this._where(delta[0]); + if (delta instanceof Error) return complete(delta); + var where = this.$__where(delta[0]); + this.$__reset(); this.collection.update(where, delta[1], options, complete); } else { - process.nextTick(function () { - complete(null); - }) + this.$__reset(); + complete(null); } - this._reset(); this.emit('isNew', false); } }; @@ -426,7 +219,7 @@ function operand (self, where, delta, data, val, op) { if (false === self.schema.options.versionKey) return; // already marked for versioning? - if (VERSION_ALL === (VERSION_ALL & self.__version)) return; + if (VERSION_ALL === (VERSION_ALL & self.$__.version)) return; switch (op) { case '$set': @@ -449,7 +242,7 @@ function operand (self, where, delta, data, val, op) { // modifying elements of an array is ok if position does not change. if ('$push' == op || '$pushAll' == op || '$addToSet' == op) { - self.__version = VERSION_INC; + self.$__.version = VERSION_INC; } else if (/^\$p/.test(op)) { // potentially changing array positions @@ -462,7 +255,7 @@ function operand (self, where, delta, data, val, op) { // now handling $set, $unset else if (/\.\d+/.test(data.path)) { // subpath of array - self.__version = VERSION_WHERE; + self.$__.version = VERSION_WHERE; } } @@ -473,19 +266,28 @@ function operand (self, where, delta, data, val, op) { * @param {Object} where * @param {Object} delta * @param {Object} data - * @param {Array} val + * @param {Array} value */ -function handleAtomics (self, where, delta, data, val) { +function handleAtomics (self, where, delta, data, value) { if (delta.$set && delta.$set[data.path]) { // $set has precedence over other atomics return; } - var atomics = val._atomics + if ('function' == typeof value.$__getAtomics) { + value.$__getAtomics().forEach(function (atomic) { + var op = atomic[0]; + var val = atomic[1]; + operand(self, where, delta, data, val, op); + }) + return; + } + + // legacy support for plugins + + var atomics = value._atomics , ops = Object.keys(atomics) - , schema = data.schema - , path = data.path , i = ops.length , val , op; @@ -493,18 +295,19 @@ function handleAtomics (self, where, delta, data, val) { if (0 === i) { // $set - if (isMongooseObject(val)) { - val = val.toObject({ depopulate: 1 }); - } else if (val.valueOf) { - val = val.valueOf(); + if (isMongooseObject(value)) { + value = value.toObject({ depopulate: 1 }); + } else if (value.valueOf) { + value = value.valueOf(); } - return operand(self, where, delta, data, val); + return operand(self, where, delta, data, value); } while (i--) { op = ops[i]; val = atomics[op]; + if (isMongooseObject(val)) { val = val.toObject({ depopulate: 1 }) } else if (Array.isArray(val)) { @@ -528,16 +331,18 @@ function handleAtomics (self, where, delta, data, val) { * Produces a special query document of the modified properties used in updates. * * @api private + * @method $__delta + * @memberOf Model */ -Model.prototype._delta = function _delta () { - var dirty = this._dirty(); +Model.prototype.$__delta = function () { + var dirty = this.$__dirty(); if (!dirty.length) return; - var self = this - , where = {} + var where = {} , delta = {} , len = dirty.length + , divergent = [] , d = 0 , val , obj @@ -547,41 +352,104 @@ Model.prototype._delta = function _delta () { var value = data.value var schema = data.schema + var match = checkDivergentArray(this, data.path, value); + if (match) { + divergent.push(match); + continue; + } + + if (divergent.length) continue; + if (undefined === value) { - operand(self, where, delta, data, 1, '$unset'); + operand(this, where, delta, data, 1, '$unset'); } else if (null === value) { - operand(self, where, delta, data, null); + operand(this, where, delta, data, null); } else if (value._path && value._atomics) { // arrays and other custom types (support plugins etc) - handleAtomics(self, where, delta, data, value); + handleAtomics(this, where, delta, data, value); } else if (value._path && Buffer.isBuffer(value)) { // MongooseBuffer value = value.toObject(); - operand(self, where, delta, data, value); + operand(this, where, delta, data, value); } else { - value = utils.clone(value); - operand(self, where, delta, data, value); + value = utils.clone(value, { convertToId: 1 }); + operand(this, where, delta, data, value); } } - if (this.__version) { - this._version(where, delta); + if (divergent.length) { + return new DivergentArrayError(divergent); + } + + if (this.$__.version) { + this.$__version(where, delta); } return [where, delta]; } +/*! + * Determine if array was populated with some form of filter and is now + * being updated in a manner which could overwrite data unintentionally. + * + * @see https://github.com/LearnBoost/mongoose/issues/1334 + * @param {Document} doc + * @param {String} path + * @return {String|undefined} + */ + +function checkDivergentArray (doc, path, array) { + // see if we populated this path + var pop = doc.populated(path, true); + + if (!pop && doc.$__.selected) { + // If any array was selected using an $elemMatch projection, we deny the update. + // NOTE: MongoDB only supports projected $elemMatch on top level array. + var top = path.split('.')[0]; + if (doc.$__.selected[top] && doc.$__.selected[top].$elemMatch) { + return top; + } + } + + if (!(pop && array instanceof MongooseArray)) return; + + // If the array was populated using options that prevented all + // documents from being returned (match, skip, limit) or they + // deselected the _id field, $pop and $set of the array are + // not safe operations. If _id was deselected, we do not know + // how to remove elements. $pop will pop off the _id from the end + // of the array in the db which is not guaranteed to be the + // same as the last element we have here. $set of the entire array + // would be similarily destructive as we never received all + // elements of the array and potentially would overwrite data. + var check = pop.options.match || + pop.options.options && hasOwnProperty(pop.options.options, 'limit') || // 0 is not permitted + pop.options.options && pop.options.options.skip || // 0 is permitted + pop.options.select && // deselected _id? + (0 === pop.options.select._id || + /\s?-_id\s?/.test(pop.options.select)) + + if (check) { + var atomics = array._atomics; + if (0 === Object.keys(atomics).length || atomics.$set || atomics.$pop) { + return path; + } + } +} + /** * Appends versioning to the where and update clauses. * * @api private + * @method $__version + * @memberOf Model */ -Model.prototype._version = function _version (where, delta) { +Model.prototype.$__version = function (where, delta) { var key = this.schema.options.versionKey; if (true === where) { @@ -596,17 +464,16 @@ Model.prototype._version = function _version (where, delta) { // there is no way to select the correct version. we could fail // fast here and force them to include the versionKey but // thats a bit intrusive. can we do this automatically? - // TODO fail fast option? if (!this.isSelected(key)) { return; } // $push $addToSet don't need the where clause set - if (VERSION_WHERE === (VERSION_WHERE & this.__version)) { + if (VERSION_WHERE === (VERSION_WHERE & this.$__.version)) { where[key] = this.getValue(key); } - if (VERSION_INC === (VERSION_INC & this.__version)) { + if (VERSION_INC === (VERSION_INC & this.$__.version)) { delta.$inc || (delta.$inc = {}); delta.$inc[key] = 1; } @@ -620,7 +487,7 @@ Model.prototype._version = function _version (where, delta) { */ Model.prototype.increment = function increment () { - this.__version = VERSION_ALL; + this.$__.version = VERSION_ALL; return this; } @@ -628,20 +495,22 @@ Model.prototype.increment = function increment () { * Returns a query object which applies shardkeys if they exist. * * @api private + * @method $__where + * @memberOf Model */ -Model.prototype._where = function _where (where) { +Model.prototype.$__where = function _where (where) { where || (where = {}); var paths , len - if (this._shardval) { - paths = Object.keys(this._shardval) + if (this.$__.shardval) { + paths = Object.keys(this.$__.shardval) len = paths.length for (var i = 0; i < len; ++i) { - where[paths[i]] = this._shardval[paths[i]]; + where[paths[i]] = this.$__.shardval[paths[i]]; } } @@ -666,13 +535,13 @@ Model.prototype._where = function _where (where) { */ Model.prototype.remove = function remove (fn) { - if (this._removing) { - this._removing.addBack(fn); + if (this.$__.removing) { + this.$__.removing.addBack(fn); return this; } - var promise = this._removing = new Promise(fn) - , where = this._where() + var promise = this.$__.removing = new Promise(fn) + , where = this.$__where() , self = this , options = {} @@ -683,7 +552,7 @@ Model.prototype.remove = function remove (fn) { this.collection.remove(where, options, tick(function (err) { if (err) { promise.error(err); - promise = self = self._removing = where = options = null; + promise = self = self.$__.removing = where = options = null; return; } self.emit('remove', self); @@ -694,16 +563,6 @@ Model.prototype.remove = function remove (fn) { return this; }; -/** - * Register hooks override - * - * @api private - */ - -Model.prototype._registerHooks = function registerHooks () { - Document.prototype._registerHooks.call(this); -}; - /** * Returns another Model instance. * @@ -765,6 +624,8 @@ Model.init = function init () { * * _NOTE: It is not recommended that you run this in production. Index creation may impact database performance depending on your load. Use with caution._ * + * The `ensureIndex` commands are not sent in parallel. This is to avoid the `MongoError: cannot add index with a background operation in progress` error. See [this ticket](https://github.com/LearnBoost/mongoose/issues/1365) for more information. + * * @param {Function} [cb] optional callback * @api public */ @@ -772,25 +633,33 @@ Model.init = function init () { Model.ensureIndexes = function ensureIndexes (cb) { var indexes = this.schema.indexes(); if (!indexes.length) { - return cb && cb(); + return cb && process.nextTick(cb); } + // Indexes are created one-by-one to support how MongoDB < 2.4 deals + // with background indexes. + var self = this , safe = self.schema.options.safe - , count = indexes.length - , error - indexes.forEach(function (index) { + function done (err) { + self.emit('index', err); + cb && cb(err); + } + + function create () { + var index = indexes.shift(); + if (!index) return done(); + var options = index[1]; options.safe = safe; self.collection.ensureIndex(index[0], options, tick(function (err) { - if (err) error = err; - if (--count) return; - - self.emit('index', error); - cb && cb(error); + if (err) return done(err); + create(); })); - }); + } + + create(); } /** @@ -1500,9 +1369,6 @@ Model.create = function create (doc, fn) { --count || fn.apply(null, docs); }); }); - - // TODO - // utilize collection.insertAll for batch processing? }; /** @@ -1522,6 +1388,7 @@ Model.create = function create (doc, fn) { * - `safe` (boolean) safe mode (defaults to value set in schema (true)) * - `upsert` (boolean) whether to create the doc if it doesn't match (false) * - `multi` (boolean) whether multiple documents should be updated (false) + * - `strict` (boolean) overrides the `strict` option for this update * * All `update` values are cast to their appropriate SchemaTypes before being sent. * @@ -1568,6 +1435,7 @@ Model.create = function create (doc, fn) { * doc.save(callback); * }) * + * @see strict schemas http://mongoosejs.com/docs/guide.html#strict * @param {Object} conditions * @param {Object} update * @param {Object} [options] @@ -1711,9 +1579,11 @@ Model.mapReduce = function mapReduce (o, callback) { * console.log(res); // [ { maxAge: 98 } ] * }); * - * _NOTE: the documents returned are plain javascript objects, not mongoose documents cast to this models schema definition (since any shape of document can be returned)._ + * ####NOTE: * - * _NOTE: this requires running MongoDB >= 2.1_ + * - At this time, arguments are not cast to the schema because $project operators allow redefining the "shape" of the documents at any stage of the pipeline. + * - The documents returned are plain javascript objects, not mongoose documents cast to this models schema definition (since any shape of document can be returned). + * - Requires MongoDB >= 2.1 * * @param {Array} array an array of pipeline commands * @param {Object} [options] @@ -1727,6 +1597,474 @@ Model.aggregate = function aggregate () { return this.collection.aggregate.apply(this.collection, arguments); } +/** + * Populates document references. + * + * ####Available options: + * + * - path: space delimited path(s) to populate + * - select: optional fields to select + * - match: optional query conditions to match + * - model: optional name of the model to use for population + * - options: optional query options like sort, limit, etc + * + * ####Examples: + * + * // populates a single object + * User.findById(id, function (err, user) { + * var opts = [ + * { path: 'company', match: { x: 1 }, select: 'name' } + * , { path: 'notes', options: { limit: 10 }, model: 'override' } + * ] + * + * User.populate(user, opts, function (err, user) { + * console.log(user); + * }) + * }) + * + * // populates an array of objects + * User.find(match, function (err, users) { + * var opts = [{ path: 'company', match: { x: 1 }, select: 'name' }] + * + * User.populate(users, opts, function (err, user) { + * console.log(user); + * }) + * }) + * + * // imagine a Weapon model exists with two saved documents: + * // { _id: 389, name: 'whip' } + * // { _id: 8921, name: 'boomerang' } + * + * var user = { name: 'Indiana Jones', weapon: 389 } + * Weapon.populate(user, { path: 'weapon', model: 'Weapon' }, function (err, user) { + * console.log(user.weapon.name) // whip + * }) + * + * // populate many plain objects + * var users = [{ name: 'Indiana Jones', weapon: 389 }] + * users.push({ name: 'Batman', weapon: 8921 }) + * Weapon.populate(users, { path: 'weapon' }, function (err, users) { + * users.forEach(function (user) { + * console.log('%s uses a %s', users.name, user.weapon.name) + * // Indiana Jones uses a whip + * // Batman uses a boomerang + * }) + * }) + * // Note that we didn't need to specify the Weapon model because + * // we were already using it's populate() method. + * + * @param {Document|Array} docs Either a single document or array of documents to populate. + * @param {Object} options A hash of key/val (path, options) used for population. + * @param {Function} cb(err,doc) A callback, executed upon completion. Receives `err` and the `doc(s)`. + * @api public + */ + +Model.populate = function (docs, paths, cb) { + assert.equal('function', typeof cb); + + // always callback on nextTick for consistent async behavior + function callback () { + var args = utils.args(arguments); + process.nextTick(function () { + cb.apply(null, args); + }); + } + + // normalized paths + var paths = utils.populate(paths); + var pending = paths.length; + + if (0 === pending) { + return callback(null, docs); + } + + // each path has its own query options and must be executed separately + var i = pending; + var path; + while (i--) { + path = paths[i]; + populate(this, docs, path, next); + } + + function next (err) { + if (next.err) return; + if (err) return callback(next.err = err); + if (--pending) return; + callback(null, docs); + } +} + +/*! + * Populates `docs` + */ + +function populate (model, docs, options, cb) { + var select = options.select + , match = options.match + , path = options.path + + var schema = model._getSchema(path); + var subpath; + + // handle document arrays + if (schema && schema.caster) { + schema = schema.caster; + } + + // model name for the populate query + var modelName = options.model && options.model.modelName + || options.model // query options + || schema && schema.options.ref // declared in schema + || model.modelName // an ad-hoc structure + + var Model = model.db.model(modelName); + + // expose the model used + options.model = Model; + + // normalize single / multiple docs passed + if (!Array.isArray(docs)) { + docs = [docs]; + } + + if (0 === docs.length || docs.every(utils.isNullOrUndefined)) { + return cb(); + } + + // get all ids for all docs for a given path + var rawIds = docs.map(function (doc) { + if (!doc) return doc; + + var isDocument = !! doc.$__; + var ret; + + if (isDocument && !doc.isModified(path)) { + // it is possible a previously populated path is being + // populated again. because users can specify matcher + // clauses in their populate arguments we use the cached + // _ids from the original populate call to ensure all _ids + // are looked up, but only if the path wasn't modified which + // signifies the users intent of the state of the path. + ret = doc.populated(path); + } + + if (!ret || Array.isArray(ret) && 0 === ret.length) { + ret = utils.getValue(path, doc); + } + + options._docs[doc._id] = Array.isArray(ret) + ? ret.slice() + : ret; + + if (isDocument) { + // cache original populated _ids and model used + doc.populated(path, options._docs[doc._id], options); + } + + return ret; + }); + + var ids = utils.array.flatten(rawIds, function (item) { + // no need to include undefined values in our query + return undefined !== item; + }); + + if (0 === ids.length || ids.every(utils.isNullOrUndefined)) { + return cb(); + } + + // preserve original match conditions by copying + if (match) { + match = utils.object.shallowCopy(match); + } else { + match = {}; + } + + match._id || (match._id = { $in: ids }); + + var assignmentOpts = {}; + assignmentOpts.sort = options.options && options.options.sort || undefined; + assignmentOpts.excludeId = /\s?-_id\s?/.test(select) || (select && 0 === select._id); + + if (assignmentOpts.excludeId) { + // override the exclusion from the query so we can use the _id + // for document matching during assignment. we'll delete the + // _id back off before returning the result. + if ('string' == typeof select) { + select = null; + } else { + // preserve original select conditions by copying + select = utils.object.shallowCopy(select); + delete select._id; + } + } + + Model.find(match, select, options.options, function (err, vals) { + if (err) return cb(err); + + assignVals({ + rawIds: rawIds + , rawDocs: vals + , docs: docs + , path: path + , options: assignmentOpts + }) + + cb(); + }); +} + +/*! + * Assigns documents returned from a population query back + * to the original document path. + */ + +function assignVals (opts) { + var rawIds = opts.rawIds; + var rawDocs = opts.rawDocs; + var docs = opts.docs; + var path = opts.path; + var options = opts.options; + + assignRawDocsToIdStructure(rawIds, rawDocs, options); + + for (var i = 0; i < docs.length; ++i) { + utils.setValue(path, rawIds[i], docs[i], function (val) { + return valueFilter(val, options); + }); + } +} + +/*! + * 1) Apply backwards compatible find/findOne behavior to sub documents + * + * find logic: + * a) filter out non-documents + * b) remove _id from sub docs when user specified + * + * findOne + * a) if no doc found, set to null + * b) remove _id from sub docs when user specified + * + * 2) Remove _ids when specified by users query. + * + * background: + * _ids are left in the query even when user excludes them so + * that population mapping can occur. + */ + +function valueFilter (val, assignmentOpts) { + if (Array.isArray(val)) { + // find logic + var ret = []; + for (var i = 0; i < val.length; ++i) { + var subdoc = val[i]; + if (!isDoc(subdoc)) continue; + maybeRemoveId(subdoc, assignmentOpts); + ret.push(subdoc); + } + return ret; + } + + // findOne + if (isDoc(val)) { + maybeRemoveId(val, assignmentOpts); + return val; + } + return null; +} + +/*! + * Remove _id from `subdoc` if user specified "lean" query option + */ + +function maybeRemoveId (subdoc, assignmentOpts) { + if (assignmentOpts.excludeId) { + if ('function' == typeof subdoc.setValue) { + subdoc.setValue('_id', undefined); + } else { + delete subdoc._id; + } + } +} + +/*! + * Determine if `doc` is a document returned + * by a populate query. + */ + +function isDoc (doc) { + if (null == doc) + return false; + + var type = typeof doc; + if ('string' == type) + return false; + + if ('number' == type) + return false; + + if (Buffer.isBuffer(doc)) + return false; + + if ('ObjectID' == doc.constructor.name) + return false; + + // only docs + return true; +} + +/*! + * Assign `vals` returned by mongo query to the `rawIds` + * structure returned from utils.getVals() honoring + * query sort order if specified by user. + * + * This can be optimized. + * + * Rules: + * + * if the value of the path is not an array, use findOne rules, else find. + * for findOne the results are assigned directly to doc path (including null results). + * for find, if user specified sort order, results are assigned directly + * else documents are put back in original order of array if found in results + * + * @param {Array} rawIds + * @param {Array} vals + * @param {Boolean} sort + * @api private + */ + +function assignRawDocsToIdStructure (rawIds, vals, options, recursed) { + // honor user specified sort order + var newOrder = []; + var sorting = options.sort && rawIds.length > 1; + var found; + var doc; + var sid; + var id; + + for (var i = 0; i < rawIds.length; ++i) { + id = rawIds[i]; + + if (Array.isArray(id)) { + // handle [ [id0, id2], [id3] ] + assignRawDocsToIdStructure(id, vals, options, true); + newOrder.push(id); + continue; + } + + if (null === id && !sorting) { + // keep nulls for findOne unless sorting, which always + // removes them (backward compat) + newOrder.push(id); + continue; + } + + sid = String(id); + found = false; + + if (recursed) { + // apply find behavior + + // assign matching documents in original order unless sorting + for (var f = 0; f < vals.length; ++f) { + if (sid == String(vals[f]._id)) { + found = true; + if (sorting) { + newOrder[f] = vals[f]; + } else { + newOrder.push(vals[f]); + } + break; + } + } + + if (!found) { + newOrder.push(id); + } + + } else { + // apply findOne behavior - if document in results, assign, else assign null + + doc = null; + for (var f = 0; f < vals.length; ++f) { + if (sid == String(vals[f]._id)) { + doc = vals[f]; + break; + } + } + + newOrder[i] = doc; + } + } + + rawIds.length = 0; + if (newOrder.length) { + // reassign the documents based on corrected order + + // forEach skips over sparse entries in arrays so we + // can safely use this to our advantage dealing with sorted + // result sets too. + newOrder.forEach(function (doc, i) { + rawIds[i] = doc; + }); + } +} + +/** + * Finds the schema for `path`. This is different than + * calling `schema.path` as it also resolves paths with + * positional selectors (something.$.another.$.path). + * + * @param {String} path + * @return {Schema} + * @api private + */ + +Model._getSchema = function _getSchema (path) { + var schema = this.schema + , pathschema = schema.path(path); + + if (pathschema) + return pathschema; + + // look for arrays + return (function search (parts, schema) { + var p = parts.length + 1 + , foundschema + , trypath + + while (p--) { + trypath = parts.slice(0, p).join('.'); + foundschema = schema.path(trypath); + if (foundschema) { + if (foundschema.caster) { + + // array of Mixed? + if (foundschema.caster instanceof Types.Mixed) { + return foundschema.caster; + } + + // Now that we found the array, we need to check if there + // are remaining document paths to look up for casting. + // Also we need to handle array.$.path since schema.path + // doesn't work for that. + if (p !== parts.length) { + if ('$' === parts[p]) { + // comments.$.comments.$.title + return search(parts.slice(p+1), foundschema.schema); + } else { + // this is the last path of the selector + return search(parts.slice(p), foundschema.schema); + } + } + } + return foundschema; + } + } + })(path.split('.'), schema) +} + /*! * Compiler utility. * @@ -1738,6 +2076,15 @@ Model.aggregate = function aggregate () { */ Model.compile = function compile (name, schema, collectionName, connection, base) { + var versioningEnabled = false !== schema.options.versionKey; + + if (versioningEnabled && !schema.paths[schema.options.versionKey]) { + // add versioning to top level documents only + var o = {}; + o[schema.options.versionKey] = Number; + schema.add(o); + } + // generate new class function model (doc, fields, skipId) { if (!(this instanceof model)) @@ -1745,14 +2092,23 @@ Model.compile = function compile (name, schema, collectionName, connection, base Model.call(this, doc, fields, skipId); }; + model.base = base; model.modelName = name; model.__proto__ = Model; model.prototype.__proto__ = Model.prototype; - model.prototype.db = connection; - model.prototype._setSchema(schema); + model.model = Model.prototype.model; + model.db = model.prototype.db = connection; + + model.prototype.$__setSchema(schema); + + var collectionOptions = { + bufferCommands: schema.options.bufferCommands + , capped: schema.options.capped + }; + model.prototype.collection = connection.collection( collectionName - , schema.options.capped + , collectionOptions ); // apply methods @@ -1766,12 +2122,9 @@ Model.compile = function compile (name, schema, collectionName, connection, base // apply named scopes if (schema.namedScopes) schema.namedScopes.compile(model); - model.model = model.prototype.model; - model.options = model.prototype.options; - model.db = model.prototype.db; model.schema = model.prototype.schema; + model.options = model.prototype.options; model.collection = model.prototype.collection; - model.base = base; return model; }; @@ -1809,7 +2162,12 @@ Model.__subclass = function subclass (conn, schema, collection) { || utils.toCollectionName(model.modelName); } - Model.prototype.collection = conn.collection(collection, s && s.options.capped); + var collectionOptions = { + bufferCommands: s ? s.options.bufferCommands : true + , capped: s && s.options.capped + }; + + Model.prototype.collection = conn.collection(collection, collectionOptions); Model.collection = Model.prototype.collection; Model.init(); return Model; diff --git a/node_modules/mongoose/lib/promise.js b/node_modules/mongoose/lib/promise.js index 1768e62..20ab42a 100644 --- a/node_modules/mongoose/lib/promise.js +++ b/node_modules/mongoose/lib/promise.js @@ -1,158 +1,231 @@ /*! - * Module dependencies. + * Module dependencies */ -var util = require('./utils'); -var EventEmitter = require('events').EventEmitter; +var MPromise = require('mpromise'); /** * Promise constructor. * - * @param {Function} back a callback+errback that accepts `fn(err, ...){}` as signature + * Promises are returned from executed queries. Example: + * + * var query = Candy.find({ bar: true }); + * var promise = query.exec(); + * + * @param {Function} fn a function which will be called when the promise is resolved that accepts `fn(err, ...){}` as signature + * @inherits mpromise https://github.com/aheckmann/mpromise * @inherits NodeJS EventEmitter http://nodejs.org/api/events.html#events_class_events_eventemitter - * @event `err`: Emits when the promise resolves to an error. - * @event `complete`: Emits when the promise resolves sucessfully. + * @event `err`: Emits when the promise is rejected + * @event `complete`: Emits when the promise is fulfilled * @api public */ -function Promise (back) { - this.emitted = {}; - if ('function' == typeof back) - this.addBack(back); -}; +function Promise (fn) { + MPromise.call(this, fn); +} + +/*! + * Inherit from mpromise + */ + +Promise.prototype = Object.create(MPromise.prototype, { + constructor: { + value: Promise + , enumerable: false + , writable: true + , configurable: true + } +}); /*! - * Inherits from EventEmitter. + * Override event names for backward compatibility. */ -Promise.prototype.__proto__ = EventEmitter.prototype; +Promise.SUCCESS = 'complete'; +Promise.FAILURE = 'err'; /** * Adds `listener` to the `event`. * - * If `event` is either `error` or `complete` and the event has already been emitted, the`listener` is called immediately and passed the results of the original emitted event. + * If `event` is either the success or failure event and the event has already been emitted, the`listener` is called immediately and passed the results of the original emitted event. * + * @see mpromise#on https://github.com/aheckmann/mpromise#on + * @method on + * @memberOf Promise * @param {String} event - * @param {Function} callback + * @param {Function} listener * @return {Promise} this * @api public */ -Promise.prototype.on = function (event, callback) { - if (this.emitted[event]) - callback.apply(this, this.emitted[event]); - else - EventEmitter.prototype.on.call(this, event, callback); - - return this; -}; - /** - * Keeps track of emitted events to run them on `on`. + * Rejects this promise with `reason`. * - * @api private + * If the promise has already been fulfilled or rejected, not action is taken. + * + * @see mpromise#reject https://github.com/aheckmann/mpromise#reject + * @method reject + * @memberOf Promise + * @param {Object|String|Error} reason + * @return {Promise} this + * @api public */ -Promise.prototype.emit = function (event) { - // ensures a promise can't be complete() or error() twice - if (event == 'err' || event == 'complete'){ - if (this.emitted.err || this.emitted.complete) { - return this; - } - this.emitted[event] = util.args(arguments, 1); - } +/** + * Rejects this promise with `err`. + * + * If the promise has already been fulfilled or rejected, not action is taken. + * + * Differs from [#reject](#promise_Promise-reject) by first casting `err` to an `Error` if it is not `instanceof Error`. + * + * @api public + * @param {Error|String} err + * @return {Promise} this + */ - return EventEmitter.prototype.emit.apply(this, arguments); -}; +Promise.prototype.error = function (err) { + if (!(err instanceof Error)) err = new Error(err); + return this.reject(err); +} /** - * Shortcut for emitting the `complete` event. + * Resolves this promise to a rejected state if `err` is passed or a fulfilled state if no `err` is passed. + * + * If the promise has already been fulfilled or rejected, not action is taken. + * + * `err` will be cast to an Error if not already instanceof Error. * + * _NOTE: overrides [mpromise#resolve](https://github.com/aheckmann/mpromise#resolve) to provide error casting._ + * + * @param {Error} [err] error or null + * @param {Object} [val] value to fulfill the promise with * @api public */ -Promise.prototype.complete = function () { - var args = util.args(arguments); - return this.emit.apply(this, ['complete'].concat(args)); -}; +Promise.prototype.resolve = function (err, val) { + if (err) return this.error(err); + return this.fulfill(val); +} + +/** + * Adds a single function as a listener to both err and complete. + * + * It will be executed with traditional node.js argument position when the promise is resolved. + * + * promise.addBack(function (err, args...) { + * if (err) return handleError(err); + * console.log('success'); + * }) + * + * Alias of [mpromise#onResolve](https://github.com/aheckmann/mpromise#onresolve). + * + * @method addBack + * @param {Function} listener + * @return {Promise} this + */ + +Promise.prototype.addBack = Promise.prototype.onResolve; /** - * Shortcut for emitting the `err` event. + * Fulfills this promise with passed arguments. * - * If `err` is not instanceof Error, it is cast to Error before rejecting. + * Alias of [mpromise#fulfill](https://github.com/aheckmann/mpromise#fulfill). * + * @method complete + * @param {any} args * @api public - * @return {Promise} */ -Promise.prototype.error = function (err) { - if (!(err instanceof Error)) err = new Error(err); - return this.emit('err', err); -}; +Promise.prototype.complete = MPromise.prototype.fulfill; /** * Adds a listener to the `complete` (success) event. * + * Alias of [mpromise#onFulfill](https://github.com/aheckmann/mpromise#onfulfill). + * + * @method addCallback + * @param {Function} listener * @return {Promise} this * @api public */ -Promise.prototype.addCallback = function (fn) { - return this.on('complete', fn); -}; +Promise.prototype.addCallback = Promise.prototype.onFulfill; /** * Adds a listener to the `err` (rejected) event. * + * Alias of [mpromise#onReject](https://github.com/aheckmann/mpromise#onreject). + * + * @method addErrback + * @param {Function} listener * @return {Promise} this * @api public */ -Promise.prototype.addErrback = function (fn) { - return this.on('err', fn); -}; +Promise.prototype.addErrback = Promise.prototype.onReject; /** - * Adds a single function as both a callback and errback. + * Creates a new promise and returns it. If `onFulfill` or `onReject` are passed, they are added as SUCCESS/ERROR callbacks to this promise after the nextTick. * - * It will be executed with traditional node.js argument position: - * function (err, args...) {} + * Conforms to [promises/A+](https://github.com/promises-aplus/promises-spec) specification. * - * @param {Function} fn - * @return {Promise} this + * ####Example: + * + * var promise = Meetups.find({ tags: 'javascript' }).select('_id').exec(); + * promise.then(function (meetups) { + * var ids = meetups.map(function (m) { + * return m._id; + * }); + * return People.find({ meetups: { $in: ids }).exec(); + * }).then(function (people) { + * if (people.length < 10000) { + * throw new Error('Too few people!!!'); + * } else { + * throw new Error('Still need more people!!!'); + * } + * }).then(null, function (err) { + * assert.ok(err instanceof Error); + * }); + * + * @see promises-A+ https://github.com/promises-aplus/promises-spec + * @see mpromise#then https://github.com/aheckmann/mpromise#then + * @method then + * @memberOf Promise + * @param {Function} onFulFill + * @param {Function} onReject + * @return {Promise} newPromise */ -Promise.prototype.addBack = function (fn) { - this.on('err', function(err){ - fn.call(this, err); - }); - - this.on('complete', function(){ - var args = util.args(arguments); - fn.apply(this, [null].concat(args)); - }); - - return this; -}; - /** - * Resolves this promise to an error state if `err` is passed or success state when no `err` is passed. + * Signifies that this promise was the last in a chain of `then()s`: if a handler passed to the call to `then` which produced this promise throws, the exception will go uncaught. * - * `err` will be cast to an Error if not already instanceof Error. + * ####Example: + * + * var p = new Promise; + * p.then(function(){ throw new Error('shucks') }); + * setTimeout(function () { + * p.fulfill(); + * // error was caught and swallowed by the promise returned from + * // p.then(). we either have to always register handlers on + * // the returned promises or we can do the following... + * }, 10); + * + * // this time we use .end() which prevents catching thrown errors + * var p = new Promise; + * var p2 = p.then(function(){ throw new Error('shucks') }).end(); // <-- + * setTimeout(function () { + * p.fulfill(); // throws "shucks" + * }, 10); * - * @param {Error} [err] error or null - * @param {Object} [val] value to complete the promise with * @api public + * @see mpromise#end https://github.com/aheckmann/mpromise#end + * @method end + * @memberOf Promise */ -Promise.prototype.resolve = function (err, val) { - if (err) return this.error(err); - return this.complete(val); -}; - /*! - * Module exports. + * expose */ module.exports = Promise; diff --git a/node_modules/mongoose/lib/query.js b/node_modules/mongoose/lib/query.js index bb97798..84b98e3 100644 --- a/node_modules/mongoose/lib/query.js +++ b/node_modules/mongoose/lib/query.js @@ -10,6 +10,7 @@ var utils = require('./utils') , inGroupsOf = utils.inGroupsOf , tick = utils.tick , QueryStream = require('./querystream') + , helpers = require('./queryhelpers') , ReadPref = require('mongodb').ReadPreference /** @@ -30,6 +31,7 @@ function Query (criteria, options) { this._conditions = {}; this._updateArg = {}; this._fields = undefined; + this._geoComparison = undefined; if (criteria) this.find(criteria); } @@ -61,18 +63,10 @@ Query.prototype.setOptions = function (options, overwrite) { // overwrite is internal use only if (overwrite) { options = this.options = options || {}; - this.safe = options.safe - - // normalize population options - var pop = this.options.populate; - this.options.populate = {}; - - if (pop && Array.isArray(pop)) { - for (var i = 0, l = pop.length; i < l; i++) { - this.options.populate[pop[i]] = {}; - } + this.safe = options.safe; + if ('populate' in options) { + this.populate(this.options.populate); } - return this; } @@ -100,6 +94,7 @@ Query.prototype.setOptions = function (options, overwrite) { this.options[method] = options[method]; } } + return this; } @@ -308,7 +303,8 @@ Query.prototype.cast = function (model, obj) { var geo = val.$near ? '$near' : val.$nearSphere ? '$nearSphere' : - val.$within ? '$within' : ''; + val.$within ? '$within' : + val.$geoIntersects ? '$geoIntersects' : ''; if (!geo) { continue; @@ -322,13 +318,27 @@ Query.prototype.cast = function (model, obj) { } if ('$within' == geo) { - // find $center, $centerSphere, $box, $polygon - var withinType = value.$center || value.$centerSphere || value.$box || value.$polygon; + var withinType = value.$center + || value.$centerSphere + || value.$box + || value.$polygon; + if (!withinType) { throw new Error('Bad $within paramater: ' + JSON.stringify(val)); } value = withinType; + + } else if ('$near' == geo && + 'string' == typeof value.type && Array.isArray(value.coordinates)) { + // geojson; cast the coordinates + value = value.coordinates; + + } else if (('$near' == geo || '$geoIntersects' == geo) && + value.$geometry && 'string' == typeof value.$geometry.type && + Array.isArray(value.$geometry.coordinates)) { + // geojson; cast the coordinates + value = value.$geometry.coordinates; } ;(function _cast (val) { @@ -484,48 +494,60 @@ Query.prototype._applyPaths = function applyPaths () { schema.eachPath(function (path, type) { if (prefix) path = prefix + '.' + path; + analyzePath(path, type); + // array of subdocs? if (type.schema) { analyzeSchema(type.schema, path); } - analyzePath(path, type); }); } function analyzePath (path, type) { if ('boolean' != typeof type.selected) return; - if (fields && ('+' + path) in fields) { + var plusPath = '+' + path; + if (fields && plusPath in fields) { // forced inclusion - delete fields['+' + path]; + delete fields[plusPath]; // if there are other fields being included, add this one // if no other included fields, leave this out (implied inclusion) - if (false === exclude && keys.length > 1) { + if (false === exclude && keys.length > 1 && !~keys.indexOf(path)) { fields[path] = 1; } return }; + // check for parent exclusions + var root = path.split('.')[0]; + if (~excluded.indexOf(root)) return; + ;(type.selected ? selected : excluded).push(path); } } /** - * Specifies a `$where` condition - * - * Use `$where` when you need to select documents using a JavaScript expression. + * Specifies a javascript function or expression to pass to MongoDBs query system. * * ####Example * * query.$where('this.comments.length > 10 || this.name.length > 5') * + * // or + * * query.$where(function () { * return this.comments.length > 10 || this.name.length > 5; * }) * + * ####NOTE: + * + * Only use `$where` when you have a condition that cannot be met using other MongoDB operators like `$lt`. + * **Be sure to read about all of [its caveats](http://docs.mongodb.org/manual/reference/operator/where/) before using.** + * + * @see $where http://docs.mongodb.org/manual/reference/operator/where/ * @param {String|Function} js javascript string or function * @return {Query} this * @memberOf Query @@ -609,6 +631,7 @@ Query.prototype.equals = function equals (val) { * * query.or([{ color: 'red' }, { status: 'emergency' }]) * + * @see $or http://docs.mongodb.org/manual/reference/operator/or/ * @param {Array} array array of conditions * @return {Query} this * @api public @@ -628,6 +651,7 @@ Query.prototype.or = function or (array) { * * query.nor([{ color: 'green' }, { status: 'ok' }]) * + * @see $nor http://docs.mongodb.org/manual/reference/operator/nor/ * @param {Array} array array of conditions * @return {Query} this * @api public @@ -647,6 +671,7 @@ Query.prototype.nor = function nor (array) { * * query.and([{ color: 'green' }, { status: 'ok' }]) * + * @see $and http://docs.mongodb.org/manual/reference/operator/and/ * @param {Array} array array of conditions * @return {Query} this * @api public @@ -671,6 +696,7 @@ Query.prototype.and = function and (array) { * // or * Thing.find().gt('age', 21) * + * @see $gt http://docs.mongodb.org/manual/reference/operator/gt/ * @method gt * @memberOf Query * @param {String} path @@ -683,6 +709,7 @@ Query.prototype.and = function and (array) { * * When called with one argument, the most recent path passed to `where()` is used. * + * @see $gte http://docs.mongodb.org/manual/reference/operator/gte/ * @method gte * @memberOf Query * @param {String} path @@ -695,6 +722,7 @@ Query.prototype.and = function and (array) { * * When called with one argument, the most recent path passed to `where()` is used. * + * @see $lt http://docs.mongodb.org/manual/reference/operator/lt/ * @method lt * @memberOf Query * @param {String} path @@ -707,6 +735,7 @@ Query.prototype.and = function and (array) { * * When called with one argument, the most recent path passed to `where()` is used. * + * @see $lte http://docs.mongodb.org/manual/reference/operator/lte/ * @method lte * @memberOf Query * @param {String} path @@ -719,6 +748,7 @@ Query.prototype.and = function and (array) { * * When called with one argument, the most recent path passed to `where()` is used. * + * @see $ne http://docs.mongodb.org/manual/reference/operator/ne/ * @method ne * @memberOf Query * @param {String} path @@ -731,6 +761,7 @@ Query.prototype.and = function and (array) { * * When called with one argument, the most recent path passed to `where()` is used. * + * @see $in http://docs.mongodb.org/manual/reference/operator/in/ * @method in * @memberOf Query * @param {String} path @@ -743,6 +774,7 @@ Query.prototype.and = function and (array) { * * When called with one argument, the most recent path passed to `where()` is used. * + * @see $nin http://docs.mongodb.org/manual/reference/operator/nin/ * @method nin * @memberOf Query * @param {String} path @@ -755,6 +787,7 @@ Query.prototype.and = function and (array) { * * When called with one argument, the most recent path passed to `where()` is used. * + * @see $all http://docs.mongodb.org/manual/reference/operator/all/ * @method all * @memberOf Query * @param {String} path @@ -767,6 +800,7 @@ Query.prototype.and = function and (array) { * * When called with one argument, the most recent path passed to `where()` is used. * + * @see $size http://docs.mongodb.org/manual/reference/operator/size/ * @method size * @memberOf Query * @param {String} path @@ -779,6 +813,7 @@ Query.prototype.and = function and (array) { * * When called with one argument, the most recent path passed to `where()` is used. * + * @see $regex http://docs.mongodb.org/manual/reference/operator/regex/ * @method regex * @memberOf Query * @param {String} path @@ -791,6 +826,7 @@ Query.prototype.and = function and (array) { * * When called with one argument, the most recent path passed to `where()` is used. * + * @see $maxDistance http://docs.mongodb.org/manual/reference/operator/maxDistance/ * @method maxDistance * @memberOf Query * @param {String} path @@ -823,6 +859,7 @@ Query.prototype.and = function and (array) { * @param {Number} val * @return {Query} this * @see http://www.mongodb.org/display/DOCS/Geospatial+Indexing + * @see $near http://docs.mongodb.org/manual/reference/operator/near/ * @api public */ @@ -848,6 +885,7 @@ Query.prototype.near = function (path, val) { * @param {Object} val * @return {Query} this * @see http://www.mongodb.org/display/DOCS/Geospatial+Indexing + * @see $nearSphere http://docs.mongodb.org/manual/reference/operator/nearSphere/ * @api public */ @@ -872,6 +910,7 @@ Query.prototype.nearSphere = function (path, val) { * @param {String} path * @param {Number} val * @return {Query} this + * @see $mod http://docs.mongodb.org/manual/reference/operator/mod/ * @api public */ @@ -896,6 +935,7 @@ Query.prototype.mod = function (path, val) { * @param {String} path * @param {Number} val * @return {Query} this + * @see $exists http://docs.mongodb.org/manual/reference/operator/exists/ * @api public */ @@ -938,6 +978,7 @@ Query.prototype.exists = function (path, val) { * @param {String|Object|Function} path * @param {Object|Function} criteria * @return {Query} this + * @see $elemMatch http://docs.mongodb.org/manual/reference/operator/elemMatch/ * @api public */ @@ -969,21 +1010,57 @@ Query.prototype.elemMatch = function (path, criteria) { // Spatial queries /** - * Syntax sugar for expressive queries. + * Defines a $within query for `box()`, `center()`, etc * * ####Example * * query.within.box() * query.within.center() + * query.within.geometry() * * @property within * @memberOf Query + * @see Query#box #query_Query-box + * @see Query#center #query_Query-center + * @see Query#centerSphere #query_Query-centerSphere + * @see Query#polygon #query_Query-polygon + * @see Query#geometry #query_Query-geometry + * @see $geoWithin http://docs.mongodb.org/manual/reference/operator/within/ * @return {Query} this * @api public */ Object.defineProperty(Query.prototype, 'within', { - get: function () { return this } + get: function () { + this._geoComparison = '$within'; + return this + } +}); + +/** + * Declares an intersects query for `geometry()`. + * + * ####Example + * + * query.intersects.geometry({ + * type: 'LineString' + * , coordinates: [[180.0, 11.0], [180, 9.0]] + * }) + * + * @property intersects + * @see Query#geometry #query_Query-geometry + * @see $geometry http://docs.mongodb.org/manual/reference/operator/geometry/ + * @see geoIntersects http://docs.mongodb.org/manual/reference/operator/geoIntersects/ + * @memberOf Query + * @return {Query} this + * @api public + */ + +Object.defineProperty(Query.prototype, 'intersects', { + get: function () { + this._geoComparison = '$geoIntersects'; + return this + } }); /** @@ -997,6 +1074,7 @@ Object.defineProperty(Query.prototype, 'within', { * * @see http://www.mongodb.org/display/DOCS/Geospatial+Indexing * @see Query#within #query_Query-within + * @see $box http://docs.mongodb.org/manual/reference/operator/box/ * @param {String} path * @param {Object} val * @return {Query} this @@ -1026,6 +1104,7 @@ Query.prototype.box = function (path, val) { * @param {Object} [opts] options e.g. { $uniqueDocs: true } * @return {Query} this * @see http://www.mongodb.org/display/DOCS/Geospatial+Indexing + * @see $center http://docs.mongodb.org/manual/reference/operator/center/ * @api public */ @@ -1053,10 +1132,11 @@ Query.prototype.center = function (path, val, opts) { * var area = { center: [50, 50], radius: 10 } * query.where('loc').within.centerSphere(area) * - * @param {String} path + * @param {String} [path] * @param {Object} val * @return {Query} this * @see http://www.mongodb.org/display/DOCS/Geospatial+Indexing + * @see $centerSphere http://docs.mongodb.org/manual/reference/operator/centerSphere/ * @api public */ @@ -1082,10 +1162,11 @@ Query.prototype.centerSphere = function (path, val) { * var polyB = { a : { x : 10, y : 20 }, b : { x : 15, y : 25 }, c : { x : 20, y : 20 } } * query.where('loc').within.polygon(polyB) * - * @param {String} path + * @param {String} [path] * @param {Array|Object} val * @return {Query} this * @see http://www.mongodb.org/display/DOCS/Geospatial+Indexing + * @see $polygon http://docs.mongodb.org/manual/reference/operator/polygon/ * @api public */ @@ -1099,6 +1180,61 @@ Query.prototype.polygon = function (path, val) { return this; }; +/** + * Specifies a $geometry condition + * + * ####Example + * + * var polyA = [[[ 10, 20 ], [ 10, 40 ], [ 30, 40 ], [ 30, 20 ]]] + * query.where('loc').within.geometry({ type: 'Polygon', coordinates: polyA }) + * + * // or + * var polyB = [[ 0, 0 ], [ 1, 1 ]] + * query.where('loc').within.geometry({ type: 'LineString', coordinates: polyB }) + * + * // or + * var polyC = [ 0, 0 ] + * query.where('loc').within.geometry({ type: 'Point', coordinates: polyC }) + * + * // or + * var polyC = [ 0, 0 ] + * query.where('loc').intersects.geometry({ type: 'Point', coordinates: polyC }) + * + * ####NOTE: + * + * `geometry()` **must** come after either `intersects` or `within`. + * + * The `object` argument must contain `type` and `coordinates` properties. + * - type {String} + * - coordinates {Array} + * + * When called with one argument, the most recent path passed to `where()` is used. + * + * @param {String} [path] Optional name of a path to match against + * @param {Object} object Must contain a `type` property which is a String and a `coordinates` property which is an Array. See the example. + * @return {Query} this + * @see http://docs.mongodb.org/manual/release-notes/2.4/#new-geospatial-indexes-with-geojson-and-improved-spherical-geometry + * @see http://www.mongodb.org/display/DOCS/Geospatial+Indexing + * @see $geometry http://docs.mongodb.org/manual/reference/operator/geometry/ + * @api public + */ + +Query.prototype.geometry = function (path, val) { + if (arguments.length === 1) { + val = path; + path = this._currPath; + } + + var conds = this._conditions[path] || (this._conditions[path] = {}); + + if (!this._geoComparison) { + throw new Error('query.geometry() must come after either `within` or `intersects`'); + } + + conds[this._geoComparison] = { $geometry: val }; + return this; +}; + /** * Specifies which document fields to include or exclude * @@ -1150,7 +1286,7 @@ Query.prototype.select = function select (arg) { }; /** - * Specifies a $slice condition + * Specifies a $slice projection for an array. * * ####Example * @@ -1164,6 +1300,7 @@ Query.prototype.select = function select (arg) { * @param {Number} val number of elements to slice * @return {Query} this * @see mongodb http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields#RetrievingaSubsetofFields-RetrievingaSubrangeofArrayElements + * @see $slice http://docs.mongodb.org/manual/reference/projection/slice/#prj._S_slice * @api public */ @@ -1187,18 +1324,21 @@ Query.prototype.slice = function (path, val) { /** * Sets the sort order * - * If an object is passed, values allowed are 'asc', 'desc', 'ascending', 'descending', 1, and -1. + * If an object is passed, values allowed are `asc`, `desc`, `ascending`, `descending`, `1`, and `-1`. * * If a string is passed, it must be a space delimited list of path names. The sort order of each path is ascending unless the path name is prefixed with `-` which will be treated as descending. * * ####Example * - * // these are equivalent + * // sort by "field" ascending and "test" descending * query.sort({ field: 'asc', test: -1 }); + * + * // equivalent * query.sort('field -test'); * * @param {Object|String} arg * @return {Query} this + * @see cursor.sort http://docs.mongodb.org/manual/reference/method/cursor.sort/ * @api public */ @@ -1239,20 +1379,19 @@ function push (arr, field, value) { } /** - * Specifies the limit option. + * Specifies the maximum number of documents the query will return. * * ####Example * - * Kitten.find().limit(20) + * Kitten.find().limit(20).exec(callback) * * @method limit * @memberOf Query * @param {Number} val - * @see mongodb http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%7B%7Blimit%28%29%7D%7D * @api public */ /** - * Specifies the skip option. + * Specifies the number of documents to skip. * * ####Example * @@ -1261,7 +1400,7 @@ function push (arr, field, value) { * @method skip * @memberOf Query * @param {Number} val - * @see mongodb http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%7B%7Bskip%28%29%7D%7D + * @see cursor.skip http://docs.mongodb.org/manual/reference/method/cursor.skip/ * @api public */ /** @@ -1274,7 +1413,7 @@ function push (arr, field, value) { * @method maxscan * @memberOf Query * @param {Number} val - * @see mongodb http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24maxScan + * @see maxScan http://docs.mongodb.org/manual/reference/operator/maxScan/ * @api public */ /** @@ -1287,7 +1426,7 @@ function push (arr, field, value) { * @method batchSize * @memberOf Query * @param {Number} val - * @see mongodb http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%7B%7BbatchSize%28%29%7D%7D + * @see batchSize http://docs.mongodb.org/manual/reference/method/cursor.batchSize/ * @api public */ /** @@ -1300,7 +1439,7 @@ function push (arr, field, value) { * @method comment * @memberOf Query * @param {Number} val - * @see mongodb http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24comment + * @see comment http://docs.mongodb.org/manual/reference/operator/comment/ * @api public */ @@ -1326,7 +1465,7 @@ function push (arr, field, value) { * * Kitten.find().snapshot() * - * @see mongodb http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%7B%7Bsnapshot%28%29%7D%7D + * @see snapshot http://docs.mongodb.org/manual/reference/operator/snapshot/ * @return {Query} this * @api public */ @@ -1345,7 +1484,7 @@ Query.prototype.snapshot = function () { * * @param {Object} val a hint object * @return {Query} this - * @see mongodb http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24hint + * @see $hint http://docs.mongodb.org/manual/reference/operator/hint/ * @api public */ @@ -1367,7 +1506,7 @@ Query.prototype.hint = function (val) { }; /** - * Sets the slaveOk option. + * Sets the slaveOk option. _Deprecated_ in MongoDB 2.2 in favor of [read preferences](#query_Query-read). * * ####Example: * @@ -1377,6 +1516,7 @@ Query.prototype.hint = function (val) { * * @param {Boolean} v defaults to true * @see mongodb http://docs.mongodb.org/manual/applications/replication/#read-preference + * @see slaveOk http://docs.mongodb.org/manual/reference/method/rs.slaveOk/ * @return {Query} this * @api public */ @@ -1387,7 +1527,23 @@ Query.prototype.slaveOk = function (v) { } /** - * Sets the readPreference option for the query. + * Determines the MongoDB nodes from which to read. + * + * ####Preferences: + * + * primary - (default) Read from primary only. Operations will produce an error if primary is unavailable. Cannot be combined with tags. + * secondary Read from secondary if available, otherwise error. + * primaryPreferred Read from primary if available, otherwise a secondary. + * secondaryPreferred Read from a secondary if available, otherwise read from the primary. + * nearest All operations read from among the nearest candidates, but unlike other modes, this option will include both the primary and all secondaries in the selection. + * + * Aliases + * + * p primary + * pp primaryPreferred + * s secondary + * sp secondaryPreferred + * n nearest * * ####Example: * @@ -1406,28 +1562,12 @@ Query.prototype.slaveOk = function (v) { * new Query().read('nearest') * new Query().read('n') // same as nearest * - * // with tags - * new Query().read('s', [{ dc:'sf', s: 1 },{ dc:'ma', s: 2 }]) - * - * ####Preferences: - * - * primary - (default) Read from primary only. Operations will produce an error if primary is unavailable. Cannot be combined with tags. - * secondary Read from secondary if available, otherwise error. - * primaryPreferred Read from primary if available, otherwise a secondary. - * secondaryPreferred Read from a secondary if available, otherwise read from the primary. - * nearest All operations read from among the nearest candidates, but unlike other modes, this option will include both the primary and all secondaries in the random selection. - * - * Aliases - * - * p primary - * pp primaryPreferred - * s secondary - * sp secondaryPreferred - * n nearest + * // read from secondaries with matching tags + * new Query().read('secondary', [{ dc:'sf', s: 1 },{ dc:'ma', s: 2 }]) * * Read more about how to use read preferrences [here](http://docs.mongodb.org/manual/applications/replication/#read-preference) and [here](http://mongodb.github.com/node-mongodb-native/driver-articles/anintroductionto1_1and2_2.html#read-preferences). * - * @param {String} pref one of the listed preference options or their aliases + * @param {String} pref one of the listed preference options or aliases * @param {Array} [tags] optional tags for this query * @see mongodb http://docs.mongodb.org/manual/applications/replication/#read-preference * @see driver http://mongodb.github.com/node-mongodb-native/driver-articles/anintroductionto1_1and2_2.html#read-preferences @@ -1443,9 +1583,7 @@ Query.prototype.read = function (pref, tags) { /** * Sets the lean option. * - * Documents returned from queries with the `lean` option enabled are plain javascript objects, not [MongooseDocuments](#document-js). They have no `save` method, getters/setters or any other Mongoose magic applied. - * - * This is a [great](https://groups.google.com/forum/#!topic/mongoose-orm/u2_DzDydcnA/discussion) option in high-performance read-only scenarios, especially when combined with the [stream](#query_Query-stream) option. + * Documents returned from queries with the `lean` option enabled are plain javascript objects, not [MongooseDocuments](#document-js). They have no `save` method, getters/setters or other Mongoose magic applied. * * ####Example: * @@ -1453,11 +1591,13 @@ Query.prototype.read = function (pref, tags) { * new Query().lean(true) * new Query().lean(false) * - * Model.find().lean().exec(); + * Model.find().lean().exec(function (err, docs) { + * docs[0] instanceof mongoose.Document // false + * }); * - * var leanStream = Model.find().lean().stream(); + * This is a [great](https://groups.google.com/forum/#!topic/mongoose-orm/u2_DzDydcnA/discussion) option in high-performance read-only scenarios, especially when combined with [stream](#query_Query-stream). * - * @param {Boolean} v defaults to true + * @param {Boolean} bool defaults to true * @return {Query} this * @api public */ @@ -1468,16 +1608,16 @@ Query.prototype.lean = function (v) { } /** - * Sets tailable option. + * Sets the tailable option (for use with capped collections). * * ####Example * - * Kitten.find().tailable() <== true + * Kitten.find().tailable() // true * Kitten.find().tailable(true) * Kitten.find().tailable(false) * - * @param {Boolean} v defaults to true - * @see mongodb http://www.mongodb.org/display/DOCS/Tailable+Cursors + * @param {Boolean} bool defaults to true + * @see tailable http://docs.mongodb.org/manual/tutorial/create-tailable-cursor/ * @api public */ @@ -1527,32 +1667,65 @@ Query.prototype.execFind = function (callback) { function cb (err, docs) { if (err) return promise.error(err); - if (true === options.lean) + if (0 === docs.length) { return promise.complete(docs); + } - var arr = [] - , count = docs.length; - - if (!count) return promise.complete([]); - - for (var i = 0, l = docs.length; i < l; i++) { - arr[i] = new model(undefined, fields, true); - arr[i].init(docs[i], self, function (err) { - if (err) return promise.error(err); - --count || promise.complete(arr); - }); + if (!self.options.populate) { + return true === options.lean + ? promise.complete(docs) + : completeMany(model, docs, fields, self, null, promise); } + + var pop = helpers.preparePopulationOptions(self, options); + model.populate(docs, pop, function (err, docs) { + if (err) return promise.error(err); + return true === options.lean + ? promise.complete(docs) + : completeMany(model, docs, fields, self, pop, promise); + }); } return this; -}; +} + +/*! + * hydrates many documents + * + * @param {Model} model + * @param {Array} docs + * @param {Object} fields + * @param {Query} self + * @param {Array} [pop] array of paths used in population + * @param {Promise} promise + */ + +function completeMany (model, docs, fields, self, pop, promise) { + var arr = []; + var count = docs.length; + var len = count; + var i = 0; + var opts = pop ? + { populated: pop } + : undefined; + + for (; i < len; ++i) { + arr[i] = new model(undefined, fields, true); + arr[i].init(docs[i], opts, function (err) { + if (err) return promise.error(err); + --count || promise.complete(arr); + }); + } +} /** - * Executes the query as a findOne() operation. + * Executes the query as a findOne() operation, passing the first found document to the callback. * * ####Example * - * Kitten.where('color', 'white').findOne(function (err, kitten) { + * var query = Kitten.find({ color: 'white'}); + * + * query.findOne(function (err, kitten) { * if (err) return handleError(err); * * // kitten may be null if no document matched @@ -1563,6 +1736,7 @@ Query.prototype.execFind = function (callback) { * * @param {Function} callback * @return {Query} this + * @see findOne http://docs.mongodb.org/manual/reference/method/db.collection.findOne/ * @api public */ @@ -1599,17 +1773,46 @@ Query.prototype.findOne = function (callback) { if (err) return promise.error(err); if (!doc) return promise.complete(null); - if (true === options.lean) return promise.complete(doc); + if (!self.options.populate) { + return true === options.lean + ? promise.complete(doc) + : completeOne(model, doc, fields, self, null, promise); + } - var casted = new model(undefined, fields, true); - casted.init(doc, self, function (err) { + var pop = helpers.preparePopulationOptions(self, options); + model.populate(doc, pop, function (err, doc) { if (err) return promise.error(err); - promise.complete(casted); - }); + return true === options.lean + ? promise.complete(doc) + : completeOne(model, doc, fields, self, pop, promise); + }) })); return this; -}; +} + +/*! + * hydrates a document + * + * @param {Model} model + * @param {Document} doc + * @param {Object} fields + * @param {Query} self + * @param {Array} [pop] array of paths used in population + * @param {Promise} promise + */ + +function completeOne (model, doc, fields, self, pop, promise) { + var opts = pop ? + { populated: pop } + : undefined; + + var casted = new model(undefined, fields, true); + casted.init(doc, opts, function (err) { + if (err) return promise.error(err); + promise.complete(casted); + }); +} /** * Exectues the query as a count() operation. @@ -1623,7 +1826,7 @@ Query.prototype.findOne = function (callback) { * * @param {Function} callback * @return {Query} this - * @see mongodb http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Count + * @see count http://docs.mongodb.org/manual/reference/method/db.collection.count/ * @api public */ @@ -1649,7 +1852,7 @@ Query.prototype.count = function (callback) { * @param {String} field * @param {Function} callback * @return {Query} this - * @see mongodb http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Distinct + * @see distinct http://docs.mongodb.org/manual/reference/method/db.collection.distinct/ * @api public */ @@ -1701,7 +1904,7 @@ var numberOps = { * * Model.update({..}, { title: 'remove words' }, ...) * - * becomes + * // becomes * * Model.update({..}, { $set: { title: 'remove words' }}, ...) * @@ -1713,6 +1916,8 @@ var numberOps = { * @param {Function} callback * @return {Query} this * @api public + * @see Model.update http://localhost:8088/docs/api.html#model_Model.update + * @see update http://docs.mongodb.org/manual/reference/method/db.collection.update/ */ Query.prototype.update = function update (doc, callback) { @@ -1824,8 +2029,7 @@ Query.prototype._castUpdate = function _castUpdate (obj) { */ Query.prototype._walkUpdatePath = function _walkUpdatePath (obj, op, pref) { - var strict = this.model.schema.options.strict - , prefix = pref ? pref + '.' : '' + var prefix = pref ? pref + '.' : '' , keys = Object.keys(obj) , i = keys.length , hasKeys = false @@ -1833,6 +2037,10 @@ Query.prototype._walkUpdatePath = function _walkUpdatePath (obj, op, pref) { , key , val + var strict = 'strict' in this.options + ? this.options.strict + : this.model.schema.options.strict; + while (i--) { key = keys[i]; val = obj[key]; @@ -1853,10 +2061,20 @@ Query.prototype._walkUpdatePath = function _walkUpdatePath (obj, op, pref) { } } else { hasKeys = true; + if ('$each' in val) { obj[key] = { $each: this._castUpdateVal(schema, val.$each, op) } + + if (val.$slice) { + obj[key].$slice = val.$slice | 0; + } + + if (val.$sort) { + obj[key].$sort = val.$sort; + } + } else { obj[key] = this._castUpdateVal(schema, val, op); } @@ -1934,47 +2152,7 @@ Query.prototype._castUpdateVal = function _castUpdateVal (schema, val, op, $cond */ Query.prototype._getSchema = function _getSchema (path) { - var schema = this.model.schema - , pathschema = schema.path(path); - - if (pathschema) - return pathschema; - - // look for arrays - return (function search (parts, schema) { - var p = parts.length + 1 - , foundschema - , trypath - - while (p--) { - trypath = parts.slice(0, p).join('.'); - foundschema = schema.path(trypath); - if (foundschema) { - if (foundschema.caster) { - - // array of Mixed? - if (foundschema.caster instanceof Types.Mixed) { - return foundschema.caster; - } - - // Now that we found the array, we need to check if there - // are remaining document paths to look up for casting. - // Also we need to handle array.$.path since schema.path - // doesn't work for that. - if (p !== parts.length) { - if ('$' === parts[p]) { - // comments.$.comments.$.title - return search(parts.slice(p+1), foundschema.schema); - } else { - // this is the last path of the selector - return search(parts.slice(p), foundschema.schema); - } - } - } - return foundschema; - } - } - })(path.split('.'), schema) + return this.model._getSchema(path); } /** @@ -2040,6 +2218,7 @@ Query.prototype._castFields = function _castFields (fields) { * * @param {Function} callback * @api public + * @see remove http://docs.mongodb.org/manual/reference/method/db.collection.remove/ */ Query.prototype.remove = function (callback) { @@ -2266,15 +2445,19 @@ Query.prototype._findAndModify = function (type, callback) { if (err) return promise.error(err); if (!doc) return promise.complete(null); - if (true === opts.lean) { - return promise.complete(doc); + if (!self.options.populate) { + return true === opts.lean + ? promise.complete(doc) + : completeOne(model, doc, fields, self, null, promise); } - var casted = new model(undefined, fields, true); - casted.init(doc, self, function (err) { + var pop = helpers.preparePopulationOptions(self, opts); + model.populate(doc, pop, function (err, doc) { if (err) return promise.error(err); - promise.complete(casted); - }); + return true === opts.lean + ? promise.complete(doc) + : completeOne(model, doc, fields, self, pop, promise); + }) })); return promise; @@ -2283,60 +2466,61 @@ Query.prototype._findAndModify = function (type, callback) { /** * Specifies paths which should be populated with other documents. * - * Paths are populated after the query executes and a response is received. A separate query is then executed for each path specified for population. After a response for each query has also been returned, the results are passed to the callback. - * * ####Example: * * Kitten.findOne().populate('owner').exec(function (err, kitten) { * console.log(kitten.owner.name) // Max * }) * - * @param {String} path - * @param {Object|String} [fields] Field selection for the population query + * Kitten.find().populate({ + * path: 'owner' + * , select: 'name' + * , match: { color: 'black' } + * , options: { sort: { name: -1 }} + * }).exec(function (err, kittens) { + * console.log(kittens[0].owner.name) // Zoopa + * }) + * + * // alternatively + * Kitten.find().populate('owner', 'name', null, {sort: { name: -1 }}).exec(function (err, kittens) { + * console.log(kittens[0].owner.name) // Zoopa + * }) + * + * Paths are populated after the query executes and a response is received. A separate query is then executed for each path specified for population. After a response for each query has also been returned, the results are passed to the callback. + * + * @param {Object|String} path either the path to populate or an object specifying all parameters + * @param {Object|String} [select] Field selection for the population query * @param {Model} [model] The name of the model you wish to use for population. If not specified, the name is looked up from the Schema ref. - * @param {Object} [conditions] Conditions for the population query + * @param {Object} [match] Conditions for the population query * @param {Object} [options] Options for the population query (sort, etc) * @see population ./populate.html * @see Query#select #query_Query-select + * @see Model.populate #model_Model.populate * @return {Query} this * @api public */ -Query.prototype.populate = function (path, fields, model, conditions, options) { - if ('string' !== typeof model) { - options = conditions; - conditions = model; - model = undefined; - } - // The order of fields/conditions args is opposite Model.find but - // necessary to keep backward compatibility (fields could be - // an array, string, or object literal). - this.options.populate[path] = - new PopulateOptions(fields, conditions, options, model); +Query.prototype.populate = function populate () { + var res = utils.populate.apply(null, arguments); + var opts = this.options; - return this; -}; + if (!utils.isObject(opts.populate)) { + opts.populate = {}; + } -/*! - * Populate options constructor - */ + for (var i = 0; i < res.length; ++i) { + opts.populate[res[i].path] = res[i]; + } -function PopulateOptions (fields, conditions, options, model) { - this.conditions = conditions; - this.fields = fields; - this.options = options; - this.model = model; + return this; } -// make it compatible with utils.clone -PopulateOptions.prototype.constructor = Object; - /** - * Returns a stream interface + * Returns a Node.js 0.8 style [read stream](http://nodejs.org/docs/v0.8.21/api/stream.html#stream_readable_stream) interface. * * ####Example * - * // follows the nodejs stream api + * // follows the nodejs 0.8 stream api * Thing.find({ name: /^hello/ }).stream().pipe(res) * * // manual streaming @@ -2350,13 +2534,24 @@ PopulateOptions.prototype.constructor = Object; * // the stream is closed * }); * + * ####Valid options + * + * - `transform`: optional function which accepts a mongoose document. The return value of the function will be emitted on `data`. + * + * ####Example + * + * // JSON.stringify all documents before emitting + * var stream = Thing.find().stream({ transform: JSON.stringify }); + * stream.pipe(writeStream); + * * @return {QueryStream} + * @param {Object} [options] * @see QueryStream * @api public */ -Query.prototype.stream = function stream () { - return new QueryStream(this); +Query.prototype.stream = function stream (opts) { + return new QueryStream(this, opts); } // helpers diff --git a/node_modules/mongoose/lib/queryhelpers.js b/node_modules/mongoose/lib/queryhelpers.js new file mode 100644 index 0000000..4637fad --- /dev/null +++ b/node_modules/mongoose/lib/queryhelpers.js @@ -0,0 +1,35 @@ + +/*! + * Module dependencies + */ + +var utils = require('./utils') + +/*! + * Prepare a set of path options for query population. + * + * @param {Query} query + * @param {Object} options + * @return {Array} + */ + +exports.preparePopulationOptions = function preparePopulationOptions (query, options) { + var pop = utils.object.vals(query.options.populate); + + // lean options should trickle through all queries + if (options.lean) pop.forEach(makeLean); + + return pop; +} + +/*! + * Set each path query option to lean + * + * @param {Object} option + */ + +function makeLean (option) { + option.options || (option.options = {}); + option.options.lean = true; +} + diff --git a/node_modules/mongoose/lib/querystream.js b/node_modules/mongoose/lib/querystream.js index 69726c4..6db7570 100644 --- a/node_modules/mongoose/lib/querystream.js +++ b/node_modules/mongoose/lib/querystream.js @@ -5,9 +5,11 @@ var Stream = require('stream').Stream var utils = require('./utils') +var helpers = require('./queryhelpers') +var K = function(k){ return k } /** - * Provides a [ReadStream](http://nodejs.org/api/stream.html#stream_readable_stream) interface for Queries. + * Provides a Node.js 0.8 style [ReadStream](http://nodejs.org/docs/v0.8.21/api/stream.html#stream_readable_stream) interface for Queries. * * var stream = Model.find().stream(); * @@ -20,21 +22,34 @@ var utils = require('./utils') * }); * * - * The stream interface allows us to simply "plug-in" to other Node.js write streams (fs.createWriteStream) so everything "just works" out of the box. + * The stream interface allows us to simply "plug-in" to other _Node.js 0.8_ style write streams. * * Model.where('created').gte(twoWeeksAgo).stream().pipe(writeStream); * + * ####Valid options + * + * - `transform`: optional function which accepts a mongoose document. The return value of the function will be emitted on `data`. + * + * ####Example + * + * // JSON.stringify all documents before emitting + * var stream = Thing.find().stream({ transform: JSON.stringify }); + * stream.pipe(writeStream); + * * _NOTE: plugging into an HTTP response will *not* work out of the box. Those streams expect only strings or buffers to be emitted, so first formatting our documents as strings/buffers is necessary._ * + * _NOTE: these streams are Node.js 0.8 style read streams which differ from Node.js 0.10 style. Node.js 0.10 streams are not well tested yet and are not guaranteed to work._ + * * @param {Query} query - * @inherits NodeJS Stream http://nodejs.org/api/stream.html + * @param {Object} [options] + * @inherits NodeJS Stream http://nodejs.org/docs/v0.8.21/api/stream.html#stream_readable_stream * @event `data`: emits a single Mongoose document * @event `error`: emits when an error occurs during streaming. This will emit _before_ the `close` event. * @event `close`: emits when the stream reaches the end of the cursor or an error occurs, or the stream is manually `destroy`ed. After this event, no more events are emitted. * @api public */ -function QueryStream (query) { +function QueryStream (query, options) { Stream.call(this); this.query = query; @@ -46,6 +61,9 @@ function QueryStream (query) { this._buffer = null; this._inline = T_INIT; this._running = false; + this._transform = options && 'function' == typeof options.transform + ? options.transform + : K; // give time to hook up events var self = this; @@ -194,39 +212,51 @@ QueryStream.prototype._onNextObject = function _onNextObject (err, doc) { return this.destroy(); } - if (this.query.options && true === this.query.options.lean) { - this.emit('data', doc); - - // trampoline management - if (T_IDLE === this._inline) { - // no longer in trampoline. restart it. - this._next(); - } else { - // in a trampoline. tell __next that its - // ok to continue jumping. - this._inline = T_CONT; - } - return; - } + var opts = this.query.options; - var instance = new this.query.model(undefined, this._fields, true); + if (!opts.populate) { + return true === opts.lean + ? emit(this, doc) + : createAndEmit(this, doc); + } var self = this; - instance.init(doc, this.query, function (err) { + var pop = helpers.preparePopulationOptions(self.query, self.query.options); + + self.query.model.populate(doc, pop, function (err, doc) { + if (err) return self.destroy(err); + return true === opts.lean + ? emit(self, doc) + : createAndEmit(self, doc); + }) +} + +function createAndEmit (self, doc) { + var instance = new self.query.model(undefined, self._fields, true); + instance.init(doc, function (err) { if (err) return self.destroy(err); - self.emit('data', instance); - - // trampoline management - if (T_IDLE === self._inline) { - // no longer in trampoline. restart it. - self._next(); - } else - // in a trampoline. tell __next that its - // ok to continue jumping. - self._inline = T_CONT; + emit(self, instance); }); } +/*! + * Emit a data event and manage the trampoline state + */ + +function emit (self, doc) { + self.emit('data', self._transform(doc)); + + // trampoline management + if (T_IDLE === self._inline) { + // no longer in trampoline. restart it. + self._next(); + } else { + // in a trampoline. tell __next that its + // ok to continue jumping. + self._inline = T_CONT; + } +} + /** * Pauses this stream. * @@ -293,13 +323,6 @@ QueryStream.prototype.destroy = function (err) { * * query.stream().pipe(writeStream [, options]) * - * This could be particularily useful if you are, for example, setting up an API for a service and want to stream out the docs based on some criteria. We could first pipe the QueryStream into a sort of filter that formats the stream as an array before passing on the document to an http response. - * - * var format = new ArrayFormatter; - * Events.find().stream().pipe(format).pipe(res); - * - * As long as ArrayFormat implements the WriteStream API we can stream large formatted result sets out to the client. See this [gist](https://gist.github.com/1403797) for a hacked example. - * * @method pipe * @memberOf QueryStream * @see NodeJS http://nodejs.org/api/stream.html diff --git a/node_modules/mongoose/lib/schema.js b/node_modules/mongoose/lib/schema.js index cc455ab..b4bdcfa 100644 --- a/node_modules/mongoose/lib/schema.js +++ b/node_modules/mongoose/lib/schema.js @@ -24,10 +24,12 @@ var EventEmitter = require('events').EventEmitter * ####Options: * * - [autoIndex](/docs/guide.html#autoIndex): bool - defaults to true + * - [bufferCommands](/docs/guide.html#bufferCommands): bool - defaults to true * - [capped](/docs/guide.html#capped): bool - defaults to false * - [collection](/docs/guide.html#collection): string - no default * - [id](/docs/guide.html#id): bool - defaults to true * - [_id](/docs/guide.html#_id): bool - defaults to true + * - `minimize`: bool - controls [document#toObject](#document_Document-toObject) behavior when called manually - defaults to true * - [read](/docs/guide.html#read): string * - [safe](/docs/guide.html#safe): bool - defaults to true. * - [shardKey](/docs/guide.html#shardKey): bool - defaults to `null` @@ -35,7 +37,6 @@ var EventEmitter = require('events').EventEmitter * - [toJSON](/docs/guide.html#toJSON) - object - no default * - [toObject](/docs/guide.html#toObject) - object - no default * - [versionKey](/docs/guide.html#versionKey): bool - defaults to "__v" - * - `minimize`: bool - controls [document#toObject](#document_Document-toObject) behavior when called manually - defaults to true * * ####Note: * @@ -81,21 +82,18 @@ function Schema (obj, options) { if (autoid) { this.virtual('id').get(idGetter); } - - // versioning not directly added to schema b/c we only want - // it in the top level document, not embedded ones. -}; +} /*! * Returns this documents _id cast to a string. */ function idGetter () { - if (this.__id) { - return this.__id; + if (this.$__._id) { + return this.$__._id; } - return this.__id = null == this._id + return this.$__._id = null == this._id ? null : String(this._id); } @@ -153,6 +151,7 @@ Schema.prototype.defaultOptions = function (options) { options = utils.options({ strict: true + , bufferCommands: true , capped: false // { size, max, autoIndexId } , versionKey: '__v' , minimize: true @@ -211,7 +210,7 @@ Schema.prototype.add = function add (obj, prefix) { * * Keys in this object are names that are rejected in schema declarations b/c they conflict with mongoose functionality. Using these key name will throw an error. * - * on, emit, _events, db, init, isNew, errors, schema, options, modelName, collection, _pres, _posts + * on, emit, _events, db, init, isNew, errors, schema, options, modelName, collection, _pres, _posts, toObject * * _NOTE:_ Use of these terms as method names is permitted, but play at your own risk, as they may be existing mongoose document methods you are stomping on. * @@ -230,6 +229,7 @@ reserved.schema = reserved.options = reserved.modelName = reserved.collection = +reserved.toObject = reserved.emit = // EventEmitter reserved._events = // EventEmitter reserved._pres = reserved._posts = 1 // hooks.js @@ -670,6 +670,21 @@ Schema.prototype.get = function (key) { return this.options[key]; } +/** + * The allowed index types + * + * @static indexTypes + * @receiver Schema + * @api public + */ + +var indexTypes = '2d 2dsphere hashed text'.split(' '); + +Object.defineProperty(Schema, 'indexTypes', { + get: function () { return indexTypes } + , set: function () { throw new Error('Cannot overwrite Schema.indexTypes') } +}) + /** * Compiles indexes from fields and schema-level indexes * @@ -677,35 +692,51 @@ Schema.prototype.get = function (key) { */ Schema.prototype.indexes = function () { - var indexes = [] - , seenSchemas = []; + 'use strict'; + var indexes = [] + , seenSchemas = [] collectIndexes(this); - return indexes; function collectIndexes (schema, prefix) { if (~seenSchemas.indexOf(schema)) return; seenSchemas.push(schema); - var index; - var paths = schema.paths; prefix = prefix || ''; - for (var i in paths) { - if (paths[i]) { - if (paths[i] instanceof Types.DocumentArray) { - collectIndexes(paths[i].schema, i + '.'); - } else { - index = paths[i]._index; - - if (index !== false && index !== null){ - var field = {}; - field[prefix + i] = '2d' === index ? index : 1; - var options = 'Object' === index.constructor.name ? index : {}; - if (!('background' in options)) options.background = true; - indexes.push([field, options]); + var key, path, index, field, isObject, options, type; + var keys = Object.keys(schema.paths); + + for (var i = 0; i < keys.length; ++i) { + key = keys[i]; + path = schema.paths[key]; + + if (path instanceof Types.DocumentArray) { + collectIndexes(path.schema, key + '.'); + } else { + index = path._index; + + if (false !== index && null != index) { + field = {}; + isObject = utils.isObject(index); + options = isObject ? index : {}; + type = 'string' == typeof index ? index : + isObject ? index.type : + false; + + if (type && ~Schema.indexTypes.indexOf(type)) { + field[prefix + key] = type; + } else { + field[prefix + key] = 1; } + + delete options.type; + if (!('background' in options)) { + options.background = true; + } + + indexes.push([field, options]); } } } @@ -830,9 +861,7 @@ module.exports = exports = Schema; // require down here because of reference issues /** - * The various Mongoose Schema Types. - * - * ####Example: + * The various built-in Mongoose Schema Types. * * ####Example: * @@ -841,14 +870,14 @@ module.exports = exports = Schema; * * ####Types: * - * - String - * - Number - * - Boolean | Bool - * - Array - * - Buffer - * - Date - * - ObjectId | Oid - * - Mixed + * - [String](#schema-string-js) + * - [Number](#schema-number-js) + * - [Boolean](#schema-boolean-js) | Bool + * - [Array](#schema-array-js) + * - [Buffer](#schema-buffer-js) + * - [Date](#schema-date-js) + * - [ObjectId](#schema-objectid-js) | Oid + * - [Mixed](#schema-mixed-js) * * Using this exposed access to the `Mixed` SchemaType, we can use them in our schema. * diff --git a/node_modules/mongoose/lib/schema/array.js b/node_modules/mongoose/lib/schema/array.js index 83455ed..749a906 100644 --- a/node_modules/mongoose/lib/schema/array.js +++ b/node_modules/mongoose/lib/schema/array.js @@ -17,7 +17,8 @@ var SchemaType = require('../schematype') , EmbeddedDoc = require('../types').Embedded , Mixed = require('./mixed') , Query = require('../query') - , isMongooseObject = require('../utils').isMongooseObject + , utils = require('../utils') + , isMongooseObject = utils.isMongooseObject /** * Array SchemaType constructor @@ -36,15 +37,23 @@ function SchemaArray (key, cast, options) { if ('Object' === cast.constructor.name) { if (cast.type) { // support { type: Woot } - castOptions = cast; - cast = cast.type; + castOptions = utils.clone(cast); // do not alter user arguments delete castOptions.type; + cast = cast.type; } else { cast = Mixed; } } - var caster = cast.name in Types ? Types[cast.name] : cast; + // support { type: 'String' } + var name = 'string' == typeof cast + ? cast + : cast.name; + + var caster = name in Types + ? Types[name] + : cast; + this.casterConstructor = caster; this.caster = new caster(null, castOptions); if (!(this.caster instanceof EmbeddedDoc)) { @@ -182,6 +191,18 @@ function castToNumber (val) { return Types.Number.prototype.cast.call(this, val); } +function castArray (arr, self) { + self || (self = this); + + arr.forEach(function (v, i) { + if (Array.isArray(v)) { + castArray(v, self); + } else { + arr[i] = castToNumber.call(self, v); + } + }); +} + SchemaArray.prototype.$conditionalHandlers = { '$all': function handle$all (val) { if (!Array.isArray(val)) { @@ -252,10 +273,36 @@ SchemaArray.prototype.$conditionalHandlers = { val[type][i] = castToNumber.call(this, item); } }) + } else if (val.$geometry) { + switch (val.$geometry.type) { + case 'Polygon': + case 'LineString': + case 'Point': + val.$geometry.coordinates.forEach(castArray); + break; + default: + // ignore unknowns + break; + } } return val; } + , '$geoIntersects': function (val) { + var geo = val.$geometry; + if (!geo) return; + + switch (val.$geometry.type) { + case 'Polygon': + case 'LineString': + case 'Point': + val.$geometry.coordinates.forEach(castArray); + break; + default: + // ignore unknowns + break; + } + } , '$maxDistance': castToNumber }; diff --git a/node_modules/mongoose/lib/schema/boolean.js b/node_modules/mongoose/lib/schema/boolean.js index 05635bc..cc16b7a 100644 --- a/node_modules/mongoose/lib/schema/boolean.js +++ b/node_modules/mongoose/lib/schema/boolean.js @@ -1,4 +1,3 @@ - /*! * Module dependencies. */ @@ -41,10 +40,12 @@ SchemaBoolean.prototype.checkRequired = function (value) { */ SchemaBoolean.prototype.cast = function (value) { - if (value === null) return value; - if (value === '0') return false; - return !!value; -}; + if (null === value) return value; + if ('0' === value) return false; + if ('true' === value) return true; + if ('false' === value) return false; + return !! value; +} /*! * ignore diff --git a/node_modules/mongoose/lib/schema/buffer.js b/node_modules/mongoose/lib/schema/buffer.js index 64321f5..ca89864 100644 --- a/node_modules/mongoose/lib/schema/buffer.js +++ b/node_modules/mongoose/lib/schema/buffer.js @@ -6,7 +6,9 @@ var SchemaType = require('../schematype') , CastError = SchemaType.CastError , MongooseBuffer = require('../types').Buffer , Binary = MongooseBuffer.Binary - , Query = require('../query'); + , Query = require('../query') + , utils = require('../utils') + , Document /** * Buffer SchemaType constructor @@ -33,8 +35,12 @@ SchemaBuffer.prototype.__proto__ = SchemaType.prototype; * @api private */ -SchemaBuffer.prototype.checkRequired = function (value) { - return !!(value && value.length); +SchemaBuffer.prototype.checkRequired = function (value, doc) { + if (SchemaType._isRef(this, value, doc, true)) { + return null != value; + } else { + return !!(value && value.length); + } }; /** @@ -47,7 +53,37 @@ SchemaBuffer.prototype.checkRequired = function (value) { */ SchemaBuffer.prototype.cast = function (value, doc, init) { - if (SchemaType._isRef(this, value, init)) return value; + if (SchemaType._isRef(this, value, doc, init)) { + // wait! we may need to cast this to a document + + // lazy load + Document || (Document = require('./../document')); + + if (value instanceof Document || null == value) { + return value; + } + + // setting a populated path + if (Buffer.isBuffer(value)) { + return value; + } else if (!utils.isObject(value)) { + throw new CastError('buffer', value, this.path); + } + + // Handle the case where user directly sets a populated + // path to a plain object; cast to the Model used in + // the population query. + var path = doc.$__fullPath(this.path); + var owner = doc.ownerDocument ? doc.ownerDocument() : doc; + var pop = owner.populated(path, true); + var ret = new pop.options.model(value); + return ret; + } + + // documents + if (value && value._id) { + value = value._id; + } if (Buffer.isBuffer(value)) { if (!(value instanceof MongooseBuffer)) { @@ -59,6 +95,8 @@ SchemaBuffer.prototype.cast = function (value, doc, init) { return new MongooseBuffer(value.value(true), [this.path, doc]); } + if (null === value) return value; + var type = typeof value; if ('string' == type || 'number' == type || Array.isArray(value)) { return new MongooseBuffer(value, [this.path, doc]); diff --git a/node_modules/mongoose/lib/schema/date.js b/node_modules/mongoose/lib/schema/date.js index fecd7d9..86e4062 100644 --- a/node_modules/mongoose/lib/schema/date.js +++ b/node_modules/mongoose/lib/schema/date.js @@ -1,10 +1,10 @@ - /*! * Module requirements. */ -var SchemaType = require('../schematype') - , CastError = SchemaType.CastError; +var SchemaType = require('../schematype'); +var CastError = SchemaType.CastError; +var utils = require('../utils'); /** * Date SchemaType constructor. @@ -25,6 +25,47 @@ function SchemaDate (key, options) { SchemaDate.prototype.__proto__ = SchemaType.prototype; +/** + * Declares a TTL index (rounded to the nearest second) for _Date_ types only. + * + * This sets the `expiresAfterSeconds` index option available in MongoDB >= 2.1.2. + * This index type is only compatible with Date types. + * + * ####Example: + * + * // expire in 24 hours + * new Schema({ createdAt: { type: Date, expires: 60*60*24 }}); + * + * `expires` utilizes the `ms` module from [guille](https://github.com/guille/) allowing us to use a friendlier syntax: + * + * ####Example: + * + * // expire in 24 hours + * new Schema({ createdAt: { type: Date, expires: '24h' }}); + * + * // expire in 1.5 hours + * new Schema({ createdAt: { type: Date, expires: '1.5h' }}); + * + * // expire in 7 days + * var schema = new Schema({ createdAt: Date }); + * schema.path('createdAt').expires('7d'); + * + * @param {Number|String} when + * @added 3.0.0 + * @return {SchemaType} this + * @api public + */ + +SchemaDate.prototype.expires = function (when) { + if (!this._index || 'Object' !== this._index.constructor.name) { + this._index = {}; + } + + this._index.expires = when; + utils.expires(this._index); + return this; +}; + /** * Required validator for date * diff --git a/node_modules/mongoose/lib/schema/documentarray.js b/node_modules/mongoose/lib/schema/documentarray.js index 93f2455..3b02887 100644 --- a/node_modules/mongoose/lib/schema/documentarray.js +++ b/node_modules/mongoose/lib/schema/documentarray.js @@ -27,7 +27,7 @@ function DocumentArray (key, schema, options) { } EmbeddedDocument.prototype.__proto__ = Subdocument.prototype; - EmbeddedDocument.prototype._setSchema(schema); + EmbeddedDocument.prototype.$__setSchema(schema); EmbeddedDocument.schema = schema; // apply methods @@ -130,7 +130,7 @@ DocumentArray.prototype.cast = function (value, doc, init, prev) { while (i--) { if (!(value[i] instanceof Subdocument) && value[i]) { if (init) { - selected || (selected = scopePaths(this, doc._selected, init)); + selected || (selected = scopePaths(this, doc.$__.selected, init)); subdoc = new this.casterConstructor(null, value, true, selected); value[i] = subdoc.init(value[i]); } else { diff --git a/node_modules/mongoose/lib/schema/mixed.js b/node_modules/mongoose/lib/schema/mixed.js index f22ebb9..6e2e4d3 100644 --- a/node_modules/mongoose/lib/schema/mixed.js +++ b/node_modules/mongoose/lib/schema/mixed.js @@ -4,6 +4,7 @@ */ var SchemaType = require('../schematype'); +var utils = require('../utils'); /** * Mixed SchemaType constructor. @@ -15,12 +16,19 @@ var SchemaType = require('../schematype'); */ function Mixed (path, options) { - // make sure empty array defaults are handled - if (options && - options.default && - Array.isArray(options.default) && - 0 === options.default.length) { - options.default = Array; + if (options && options.default) { + var def = options.default; + if (Array.isArray(def) && 0 === def.length) { + // make sure empty array defaults are handled + options.default = Array; + } else if (!options.shared && + utils.isObject(def) && + 0 === Object.keys(def).length) { + // prevent odd "shared" objects between documents + options.default = function () { + return {} + } + } } SchemaType.call(this, path, options); diff --git a/node_modules/mongoose/lib/schema/number.js b/node_modules/mongoose/lib/schema/number.js index 0ac633c..d80f2e8 100644 --- a/node_modules/mongoose/lib/schema/number.js +++ b/node_modules/mongoose/lib/schema/number.js @@ -4,6 +4,8 @@ var SchemaType = require('../schematype') , CastError = SchemaType.CastError + , utils = require('../utils') + , Document /** * Number SchemaType constructor. @@ -30,8 +32,8 @@ SchemaNumber.prototype.__proto__ = SchemaType.prototype; * @api private */ -SchemaNumber.prototype.checkRequired = function checkRequired (value) { - if (SchemaType._isRef(this, value, true)) { +SchemaNumber.prototype.checkRequired = function checkRequired (value, doc) { + if (SchemaType._isRef(this, value, doc, true)) { return null != value; } else { return typeof value == 'number' || value instanceof Number; @@ -110,17 +112,45 @@ SchemaNumber.prototype.max = function (value, message) { */ SchemaNumber.prototype.cast = function (value, doc, init) { - if (SchemaType._isRef(this, value, init)) return value; - - if (!isNaN(value)){ - if (null === value) return value; - if ('' === value) return null; - if ('string' == typeof value) value = Number(value); - if (value instanceof Number) return value - if ('number' == typeof value) return value; - if (value.toString && !Array.isArray(value) && - value.toString() == Number(value)) { - return new Number(value) + if (SchemaType._isRef(this, value, doc, init)) { + // wait! we may need to cast this to a document + + // lazy load + Document || (Document = require('./../document')); + + if (value instanceof Document || null == value) { + return value; + } + + // setting a populated path + if ('number' == typeof value) { + return value; + } else if (Buffer.isBuffer(value) || !utils.isObject(value)) { + throw new CastError('number', value, this.path); + } + + // Handle the case where user directly sets a populated + // path to a plain object; cast to the Model used in + // the population query. + var path = doc.$__fullPath(this.path); + var owner = doc.ownerDocument ? doc.ownerDocument() : doc; + var pop = owner.populated(path, true); + return new pop.options.model(value); + } + + var val = value && value._id + ? value._id // documents + : value; + + if (!isNaN(val)){ + if (null === val) return val; + if ('' === val) return null; + if ('string' == typeof val) val = Number(val); + if (val instanceof Number) return val + if ('number' == typeof val) return val; + if (val.toString && !Array.isArray(val) && + val.toString() == Number(val)) { + return new Number(val) } } @@ -137,7 +167,7 @@ function handleSingle (val) { function handleArray (val) { var self = this; - return val.map( function (m) { + return val.map(function (m) { return self.cast(m) }); } diff --git a/node_modules/mongoose/lib/schema/objectid.js b/node_modules/mongoose/lib/schema/objectid.js index 05762fe..9dadd31 100644 --- a/node_modules/mongoose/lib/schema/objectid.js +++ b/node_modules/mongoose/lib/schema/objectid.js @@ -5,8 +5,9 @@ var SchemaType = require('../schematype') , CastError = SchemaType.CastError , driver = global.MONGOOSE_DRIVER_PATH || './../drivers/node-mongodb-native' - , oid = require('../types/objectid'); - + , oid = require('../types/objectid') + , utils = require('../utils') + , Document /** * ObjectId SchemaType constructor. @@ -33,8 +34,8 @@ ObjectId.prototype.__proto__ = SchemaType.prototype; * @api private */ -ObjectId.prototype.checkRequired = function checkRequired (value) { - if (SchemaType._isRef(this, value, true)) { +ObjectId.prototype.checkRequired = function checkRequired (value, doc) { + if (SchemaType._isRef(this, value, doc, true)) { return null != value; } else { return value instanceof oid; @@ -45,13 +46,37 @@ ObjectId.prototype.checkRequired = function checkRequired (value) { * Casts to ObjectId * * @param {Object} value - * @param {Object} scope + * @param {Object} doc * @param {Boolean} init whether this is an initialization cast * @api private */ -ObjectId.prototype.cast = function (value, scope, init) { - if (SchemaType._isRef(this, value, init)) return value; +ObjectId.prototype.cast = function (value, doc, init) { + if (SchemaType._isRef(this, value, doc, init)) { + // wait! we may need to cast this to a document + + // lazy load + Document || (Document = require('./../document')); + + if (value instanceof Document || null == value) { + return value; + } + + // setting a populated path + if (value instanceof oid) { + return value; + } else if (Buffer.isBuffer(value) || !utils.isObject(value)) { + throw new CastError('ObjectId', value, this.path); + } + + // Handle the case where user directly sets a populated + // path to a plain object; cast to the Model used in + // the population query. + var path = doc.$__fullPath(this.path); + var owner = doc.ownerDocument ? doc.ownerDocument() : doc; + var pop = owner.populated(path, true); + return new pop.options.model(value); + } if (value === null) return value; @@ -121,7 +146,7 @@ ObjectId.prototype.castForQuery = function ($conditional, val) { /** * Adds an auto-generated ObjectId default if turnOn is true. * @param {Boolean} turnOn auto generated ObjectId defaults - * @api private + * @api public */ ObjectId.prototype.auto = function (turnOn) { @@ -140,7 +165,7 @@ function defaultId () { }; function resetId (v) { - this.__id = null; + this.$__._id = null; return v; } diff --git a/node_modules/mongoose/lib/schema/string.js b/node_modules/mongoose/lib/schema/string.js index d1bef26..c4eb39a 100644 --- a/node_modules/mongoose/lib/schema/string.js +++ b/node_modules/mongoose/lib/schema/string.js @@ -4,7 +4,9 @@ */ var SchemaType = require('../schematype') - , CastError = SchemaType.CastError; + , CastError = SchemaType.CastError + , utils = require('../utils') + , Document /** * String SchemaType constructor. @@ -177,8 +179,8 @@ SchemaString.prototype.match = function match (regExp) { * @api private */ -SchemaString.prototype.checkRequired = function checkRequired (value) { - if (SchemaType._isRef(this, value, true)) { +SchemaString.prototype.checkRequired = function checkRequired (value, doc) { + if (SchemaType._isRef(this, value, doc, true)) { return null != value; } else { return (value instanceof String || typeof value == 'string') && value.length; @@ -191,10 +193,48 @@ SchemaString.prototype.checkRequired = function checkRequired (value) { * @api private */ -SchemaString.prototype.cast = function (value, scope, init) { - if (SchemaType._isRef(this, value, init)) return value; - if (value === null) return value; - if ('undefined' !== typeof value && value.toString) return value.toString(); +SchemaString.prototype.cast = function (value, doc, init) { + if (SchemaType._isRef(this, value, doc, init)) { + // wait! we may need to cast this to a document + + // lazy load + Document || (Document = require('./../document')); + + if (value instanceof Document || null == value) { + return value; + } + + // setting a populated path + if ('string' == typeof value) { + return value; + } else if (Buffer.isBuffer(value) || !utils.isObject(value)) { + throw new CastError('string', value, this.path); + } + + // Handle the case where user directly sets a populated + // path to a plain object; cast to the Model used in + // the population query. + var path = doc.$__fullPath(this.path); + var owner = doc.ownerDocument ? doc.ownerDocument() : doc; + var pop = owner.populated(path, true); + return new pop.options.model(value); + } + + if (value === null) { + return value; + } + + if ('undefined' !== typeof value) { + // handle documents being passed + if (value._id && 'string' == typeof value._id) { + return value._id; + } + if (value.toString) { + return value.toString(); + } + } + + throw new CastError('string', value, this.path); }; diff --git a/node_modules/mongoose/lib/schematype.js b/node_modules/mongoose/lib/schematype.js index 9a1edb9..55ed4f1 100644 --- a/node_modules/mongoose/lib/schematype.js +++ b/node_modules/mongoose/lib/schematype.js @@ -98,6 +98,9 @@ SchemaType.prototype.default = function (val) { * ####Example: * * var s = new Schema({ name: { type: String, index: true }) + * var s = new Schema({ loc: { type: [Number], index: 'hashed' }) + * var s = new Schema({ loc: { type: [Number], index: '2d', sparse: true }) + * var s = new Schema({ loc: { type: [Number], index: { type: '2dsphere', sparse: true }}) * var s = new Schema({ date: { type: Date, index: { unique: true, expires: '1d' }}) * Schema.path('my.path').index(true); * Schema.path('my.date').index({ expires: 60 }); @@ -109,7 +112,7 @@ SchemaType.prototype.default = function (val) { * * [Direction doesn't matter for single key indexes](http://www.mongodb.org/display/DOCS/Indexes#Indexes-CompoundKeysIndexes) * - * @param {Object|Boolean} options + * @param {Object|Boolean|String} options * @return {SchemaType} this * @api public */ @@ -136,8 +139,10 @@ SchemaType.prototype.index = function (options) { */ SchemaType.prototype.unique = function (bool) { - if (!this._index || 'Object' !== this._index.constructor.name) { + if (null == this._index || 'boolean' == typeof this._index) { this._index = {}; + } else if ('string' == typeof this._index) { + this._index = { type: this._index }; } this._index.unique = bool; @@ -158,55 +163,16 @@ SchemaType.prototype.unique = function (bool) { */ SchemaType.prototype.sparse = function (bool) { - if (!this._index || 'Object' !== this._index.constructor.name) { + if (null == this._index || 'boolean' == typeof this._index) { this._index = {}; + } else if ('string' == typeof this._index) { + this._index = { type: this._index }; } this._index.sparse = bool; return this; }; -/** - * Declares a TTL index (rounded to the nearest second) for _Date_ types only. - * - * This sets the `expiresAfterSeconds` index option available in MongoDB >= 2.1.2. - * This index type is only compatible with Date types. - * - * ####Example: - * - * // expire in 24 hours - * new Schema({ createdAt: { type: Date, expires: 60*60*24 }}); - * - * `expires` utilizes the `ms` module from [guille](https://github.com/guille/) allowing us to use a friendlier syntax: - * - * ####Example: - * - * // expire in 24 hours - * new Schema({ createdAt: { type: Date, expires: '24h' }}); - * - * // expire in 1.5 hours - * new Schema({ createdAt: { type: Date, expires: '1.5h' }}); - * - * // expire in 7 days - * var schema = new Schema({ createdAt: Date }); - * schema.path('createdAt').expires('7d'); - * - * @param {Number|String} when - * @added 3.0.0 - * @return {SchemaType} this - * @api public - */ - -SchemaType.prototype.expires = function (when) { - if (!this._index || 'Object' !== this._index.constructor.name) { - this._index = {}; - } - - this._index.expires = when; - utils.expires(this._index); - return this; -}; - /** * Adds a setter to this schematype. * @@ -282,7 +248,7 @@ SchemaType.prototype.expires = function (when) { SchemaType.prototype.set = function (fn) { if ('function' != typeof fn) - throw new Error('A setter must be a function.'); + throw new TypeError('A setter must be a function.'); this.setters.push(fn); return this; }; @@ -351,7 +317,7 @@ SchemaType.prototype.set = function (fn) { SchemaType.prototype.get = function (fn) { if ('function' != typeof fn) - throw new Error('A getter must be a function.'); + throw new TypeError('A getter must be a function.'); this.getters.push(fn); return this; }; @@ -467,7 +433,7 @@ SchemaType.prototype.required = function (required) { if ('isSelected' in this && !this.isSelected(self.path) && !this.isModified(self.path)) return true; - return self.checkRequired(v); + return self.checkRequired(v, this); } if (false === required) { @@ -513,7 +479,11 @@ SchemaType.prototype.getDefault = function (scope, init) { */ SchemaType.prototype.applySetters = function (value, scope, init, priorVal) { - if (SchemaType._isRef(this, value, init)) return value; + if (SchemaType._isRef(this, value, scope, init)) { + return init + ? value + : this.cast(value, scope, init, priorVal); + } var v = value , setters = this.setters @@ -521,9 +491,7 @@ SchemaType.prototype.applySetters = function (value, scope, init, priorVal) { if (!len) { if (null === v || undefined === v) return v; - return init - ? v // if we just initialized we dont recast - : this.cast(v, scope, init, priorVal) + return this.cast(v, scope, init, priorVal) } while (len--) { @@ -547,7 +515,7 @@ SchemaType.prototype.applySetters = function (value, scope, init, priorVal) { */ SchemaType.prototype.applyGetters = function (value, scope) { - if (SchemaType._isRef(this, value, true)) return value; + if (SchemaType._isRef(this, value, scope, true)) return value; var v = value , getters = this.getters @@ -600,12 +568,12 @@ SchemaType.prototype.doValidate = function (value, fn, scope) { if (!count) return fn(null); - function validate (val, msg) { + function validate (ok, msg, val) { if (err) return; - if (val === undefined || val) { + if (ok === undefined || ok) { --count || fn(null); } else { - fn(err = new ValidatorError(path, msg)); + fn(err = new ValidatorError(path, msg, val)); } } @@ -614,14 +582,14 @@ SchemaType.prototype.doValidate = function (value, fn, scope) { , message = v[1]; if (validator instanceof RegExp) { - validate(validator.test(value), message); + validate(validator.test(value), message, value); } else if ('function' === typeof validator) { if (2 === validator.length) { - validator.call(scope, value, function (val) { - validate(val, message); + validator.call(scope, value, function (ok) { + validate(ok, message, value); }); } else { - validate(validator.call(scope, value), message); + validate(validator.call(scope, value), message, value); } } }); @@ -632,15 +600,33 @@ SchemaType.prototype.doValidate = function (value, fn, scope) { * * @param {SchemaType} self * @param {Object} value + * @param {Document} doc * @param {Boolean} init * @return {Boolean} * @api private */ -SchemaType._isRef = function (self, value, init) { - if (init && self.options && self.options.ref) { +SchemaType._isRef = function (self, value, doc, init) { + // fast path + var ref = init && self.options && self.options.ref; + + if (!ref && doc && doc.$__fullPath) { + // checks for + // - this populated with adhoc model and no ref was set in schema OR + // - setting / pushing values after population + var path = doc.$__fullPath(self.path); + var owner = doc.ownerDocument ? doc.ownerDocument() : doc; + ref = owner.populated(path); + } + + if (ref) { if (null == value) return true; - if (value._id && value._id.constructor.name === self.instance) return true; + if (!Buffer.isBuffer(value) && // buffers are objects too + 'Binary' != value._bsontype // raw binary value from the db + && utils.isObject(value) // might have deselected _id in population query + ) { + return true; + } } return false; diff --git a/node_modules/mongoose/lib/types/array.js b/node_modules/mongoose/lib/types/array.js index 294c989..f45f0b4 100644 --- a/node_modules/mongoose/lib/types/array.js +++ b/node_modules/mongoose/lib/types/array.js @@ -6,6 +6,8 @@ var EmbeddedDocument = require('./embedded'); var Document = require('../document'); var ObjectId = require('./objectid'); +var utils = require('../utils'); +var isMongooseObject = utils.isMongooseObject; /** * Mongoose Array constructor. @@ -72,11 +74,39 @@ MongooseArray.prototype._parent; */ MongooseArray.prototype._cast = function (value) { - var cast = this._schema.caster.cast - , doc = this._parent; + var owner = this._owner; + var populated = false; + var Model; + + if (this._parent) { + // if a populated array, we must cast to the same model + // instance as specified in the original query. + if (!owner) { + owner = this._owner = this._parent.ownerDocument + ? this._parent.ownerDocument() + : this._parent; + } - return cast.call(null, value, doc); -}; + populated = owner.populated(this._path, true); + } + + if (populated && null != value) { + // cast to the populated Models schema + var Model = populated.options.model; + + // only objects are permitted so we can safely assume that + // non-objects are to be interpreted as _id + if (Buffer.isBuffer(value) || + value instanceof ObjectId || !utils.isObject(value)) { + value = { _id: value }; + } + + value = new Model(value); + return this._schema.caster.cast(value, this._parent, true) + } + + return this._schema.caster.cast(value, this._parent, false) +} /** * Marks this array as modified. @@ -103,7 +133,6 @@ MongooseArray.prototype._markModified = function (elem, embeddedPath) { // directly set an index dirtyPath = dirtyPath + '.' + elem; } - } parent.markModified(dirtyPath); } @@ -161,6 +190,52 @@ MongooseArray.prototype._registerAtomic = function (op, val) { return this; }; +/** + * Depopulates stored atomic operation values as necessary for direct insertion to MongoDB. + * + * If no atomics exist, we return all array values after conversion. + * + * @return {Array} + * @method $__getAtomics + * @memberOf MongooseArray + * @api private + */ + +MongooseArray.prototype.$__getAtomics = function () { + var ret = []; + var keys = Object.keys(this._atomics); + var i = keys.length; + + if (0 === i) { + ret[0] = ['$set', this.toObject({ depopulate: 1 })]; + return ret; + } + + while (i--) { + var op = keys[i]; + var val = this._atomics[op]; + + // the atomic values which are arrays are not MongooseArrays. we + // need to convert their elements as if they were MongooseArrays + // to handle populated arrays versus DocumentArrays properly. + if (isMongooseObject(val)) { + val = val.toObject({ depopulate: 1 }); + } else if (Array.isArray(val)) { + val = this.toObject.call(val, { depopulate: 1 }); + } else if (val.valueOf) { + val = val.valueOf(); + } + + if ('$addToSet' == op) { + val = { $each: val } + } + + ret.push([op, val]); + } + + return ret; +} + /** * Returns the number of pending atomic operations to send to the db for this array. * @@ -344,29 +419,24 @@ MongooseArray.prototype.shift = function () { }; /** - * Removes items from an array atomically + * Pulls items from the array atomically. * * ####Examples: * - * doc.array.remove(ObjectId) - * doc.array.remove('tag 1', 'tag 2') + * doc.array.pull(ObjectId) + * doc.array.pull({ _id: 'someId' }) + * doc.array.pull(36) + * doc.array.pull('tag 1', 'tag 2') * - * @param {Object} [args...] values to remove - * @see mongodb http://www.mongodb.org/display/DOCS/Updating/#Updating-%24pull - * @api public - */ - -MongooseArray.prototype.remove = function () { - var args = [].map.call(arguments, this._cast, this); - if (args.length == 1) - this.pull(args[0]); - else - this.pull.apply(this, args); - return args; -}; - -/** - * Pulls items from the array atomically. + * To remove a document from a subdocument array we may pass an object with a matching `_id`. + * + * doc.subdocs.push({ _id: 4815162342 }) + * doc.subdocs.pull({ _id: 4815162342 }) // removed + * + * Or we may passing the _id directly and let mongoose take care of it. + * + * doc.subdocs.push({ _id: 4815162342 }) + * doc.subdocs.pull(4815162342); // works * * @param {any} [args...] * @see mongodb http://www.mongodb.org/display/DOCS/Updating/#Updating-%24pull @@ -400,6 +470,18 @@ MongooseArray.prototype.pull = function () { return this; }; +/** + * Alias of [pull](#types_array_MongooseArray-pull) + * + * @see MongooseArray#pull #types_array_MongooseArray-pull + * @see mongodb http://www.mongodb.org/display/DOCS/Updating/#Updating-%24pull + * @api public + * @memberOf MongooseArray + * @method remove + */ + +MongooseArray.prototype.remove = MongooseArray.prototype.pull; + /** * Wraps [`Array#splice`](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/splice) with proper change tracking and casting. * @@ -550,17 +632,17 @@ MongooseArray.prototype.set = function set (i, val) { */ MongooseArray.prototype.toObject = function (options) { - if (options && options.depopulate && this[0] instanceof Document) { + if (options && options.depopulate) { return this.map(function (doc) { - return doc._id; + // this is called on populated arrays too + return doc instanceof Document + ? doc._id + : doc }); } - // return this.slice()? - return this.map(function (doc) { - return doc; - }); -}; + return this.slice() +} /** * Helper for console.log diff --git a/node_modules/mongoose/lib/types/documentarray.js b/node_modules/mongoose/lib/types/documentarray.js index b888965..1820a6e 100644 --- a/node_modules/mongoose/lib/types/documentarray.js +++ b/node_modules/mongoose/lib/types/documentarray.js @@ -7,6 +7,7 @@ var MongooseArray = require('./array') , driver = global.MONGOOSE_DRIVER_PATH || '../drivers/node-mongodb-native' , ObjectId = require(driver + '/objectid') , ObjectIdSchema = require('../schema/objectid') + , utils = require('../utils') , util = require('util') /** @@ -56,8 +57,22 @@ MongooseDocumentArray.prototype.__proto__ = MongooseArray.prototype; */ MongooseDocumentArray.prototype._cast = function (value) { - if (value instanceof this._schema.casterConstructor) + if (value instanceof this._schema.casterConstructor) { + if (!(value.__parent && value.__parentArray)) { + // value may have been created using array.create() + value.__parent = this._parent; + value.__parentArray = this; + } return value; + } + + // handle cast('string') or cast(ObjectId) etc. + // only objects are permitted so we can safely assume that + // non-objects are to be interpreted as _id + if (Buffer.isBuffer(value) || + value instanceof ObjectId || !utils.isObject(value)) { + value = { _id: value }; + } return new this._schema.casterConstructor(value, this); }; @@ -105,13 +120,14 @@ MongooseDocumentArray.prototype.id = function (id) { * * _Each sub-document is converted to a plain object by calling its `#toObject` method._ * + * @param {Object} [options] optional options to pass to each documents `toObject` method call during conversion * @return {Array} * @api public */ -MongooseDocumentArray.prototype.toObject = function () { +MongooseDocumentArray.prototype.toObject = function (options) { return this.map(function (doc) { - return doc && doc.toObject() || null; + return doc && doc.toObject(options) || null; }); }; diff --git a/node_modules/mongoose/lib/types/embedded.js b/node_modules/mongoose/lib/types/embedded.js index 3ebc842..6de36e6 100644 --- a/node_modules/mongoose/lib/types/embedded.js +++ b/node_modules/mongoose/lib/types/embedded.js @@ -54,7 +54,7 @@ EmbeddedDocument.prototype.__proto__ = Document.prototype; EmbeddedDocument.prototype.markModified = function (path) { if (!this.__parentArray) return; - this._activePaths.modify(path); + this.$__.activePaths.modify(path); if (this.isNew) { // Mark the WHOLE parent array as modified @@ -97,7 +97,7 @@ EmbeddedDocument.prototype.remove = function (fn) { if (!this.willRemove) { _id = this._doc._id; if (!_id) { - throw new Error('For your own good, Mongoose does not know ' + + throw new Error('For your own good, Mongoose does not know ' + 'how to remove an EmbeddedDocument that has no _id'); } this.__parentArray.pull({ _id: _id }); @@ -138,14 +138,27 @@ EmbeddedDocument.prototype.inspect = function () { * @api public */ -EmbeddedDocument.prototype.invalidate = function (path, err, first) { - if (!this.__parent) return false; +EmbeddedDocument.prototype.invalidate = function (path, err, val, first) { + if (!this.__parent) { + var msg = 'Unable to invalidate a subdocument that has not been added to an array.' + throw new Error(msg); + } + var index = this.__parentArray.indexOf(this); var parentPath = this.__parentArray._path; var fullPath = [parentPath, index, path].join('.'); - this.__parent.invalidate(fullPath, err); + + // sniffing arguments: + // need to check if user passed a value to keep + // our error message clean. + if (2 < arguments.length) { + this.__parent.invalidate(fullPath, err, val); + } else { + this.__parent.invalidate(fullPath, err); + } + if (first) - this._validationError = ownerDocument(this)._validationError; + this.$__.validationError = this.ownerDocument().$__.validationError; return true; } @@ -156,20 +169,52 @@ EmbeddedDocument.prototype.invalidate = function (path, err, first) { */ EmbeddedDocument.prototype.ownerDocument = function () { - return ownerDocument(this); + if (this.$__.ownerDocument) { + return this.$__.ownerDocument; + } + + var parent = this.__parent; + if (!parent) return this; + + while (parent.__parent) { + parent = parent.__parent; + } + + return this.$__.ownerDocument = parent; } -/*! - * Returns the top level document of this sub-document. +/** + * Returns the full path to this document. If optional `path` is passed, it is appended to the full path. * - * @return {Document} + * @param {String} [path] + * @return {String} + * @api private + * @method $__fullPath + * @memberOf EmbeddedDocument */ -function ownerDocument (self) { - var parent = self.__parent; - while (parent.__parent) - parent = parent.__parent; - return parent; +EmbeddedDocument.prototype.$__fullPath = function (path) { + if (!this.$__.fullPath) { + var parent = this; + if (!parent.__parent) return path; + + var paths = []; + while (parent.__parent) { + paths.unshift(parent.__parentArray._path); + parent = parent.__parent; + } + + this.$__.fullPath = paths.join('.'); + + if (!this.$__.ownerDocument) { + // optimization + this.$__.ownerDocument = parent; + } + } + + return path + ? this.$__.fullPath + '.' + path + : this.$__.fullPath; } /** diff --git a/node_modules/mongoose/lib/utils.js b/node_modules/mongoose/lib/utils.js index 1f9b14a..461c418 100644 --- a/node_modules/mongoose/lib/utils.js +++ b/node_modules/mongoose/lib/utils.js @@ -6,11 +6,12 @@ var ReadPref = require('mongodb').ReadPreference , ObjectId = require('./types/objectid') , ms = require('ms') , sliced = require('sliced') + , mpath = require('mpath') , MongooseBuffer , MongooseArray , Document -/** +/*! * Produces a collection name from model `name`. * * @param {String} name a model name @@ -28,6 +29,8 @@ exports.toCollectionName = function (name) { * Pluralization rules. * * These rules are applied while processing the argument to `toCollectionName`. + * + * @deprecated remove in 4.x gh-1350 */ exports.pluralization = [ @@ -58,6 +61,7 @@ var rules = exports.pluralization; * Uncountable words. * * These words are applied while processing the argument to `toCollectionName`. + * @api public */ exports.uncountables = [ @@ -110,7 +114,7 @@ function pluralize (str) { return str; }; -/** +/*! * Determines if `a` and `b` are deep equal. * * Modified from node/lib/assert.js @@ -196,7 +200,7 @@ exports.deepEqual = function deepEqual (a, b) { return true; }; -/** +/*! * Object clone with Mongoose natives support. * * If options.minimize is true, creates a minimal data object. Empty objects and undefined values will not be cloned. This makes the data payload sent to MongoDB as small as possible. @@ -298,9 +302,8 @@ function cloneArray (arr, options) { return ret; }; - -/** - * Copies and merges options with defaults. +/*! + * Shallow copies defaults into options. * * @param {Object} defaults * @param {Object} options @@ -325,7 +328,7 @@ exports.options = function (defaults, options) { return options; }; -/** +/*! * Generates a random string * * @api private @@ -335,7 +338,7 @@ exports.random = function () { return Math.random().toString().substr(3); }; -/** +/*! * Merges `from` into `to` without overwriting existing properties. * * @param {Object} to @@ -368,10 +371,11 @@ exports.merge = function merge (to, from) { var toString = Object.prototype.toString; -/** +/*! * Determines if `arg` is an object. * * @param {Object|Array|String|Function|RegExp|any} arg + * @api private * @return {Boolean} */ @@ -379,14 +383,14 @@ exports.isObject = function (arg) { return '[object Object]' == toString.call(arg); } -/** +/*! * A faster Array.prototype.slice.call(arguments) alternative * @api private */ exports.args = sliced; -/** +/*! * process.nextTick helper. * * Wraps `callback` in a try/catch + nextTick. @@ -412,7 +416,7 @@ exports.tick = function tick (callback) { } } -/** +/*! * Returns if `v` is a mongoose object that has a `toObject()` method we can use. * * This is for compatibility with libs like Date.js which do foolish things to Natives. @@ -432,7 +436,7 @@ exports.isMongooseObject = function (v) { } var isMongooseObject = exports.isMongooseObject; -/** +/*! * Converts `expires` options of index objects to `expiresAfterSeconds` options for MongoDB. * * @param {Object} object @@ -453,6 +457,15 @@ exports.expires = function expires (object) { delete object.expires; } +/*! + * Converts arguments to ReadPrefs the driver + * can understand. + * + * @TODO move this into the driver layer + * @param {String|Array} pref + * @param {Array} [tags] + */ + exports.readPref = function readPref (pref, tags) { if (Array.isArray(pref)) { tags = pref[1]; @@ -479,3 +492,174 @@ exports.readPref = function readPref (pref, tags) { return new ReadPref(pref, tags); } + +/*! + * Populate options constructor + */ + +function PopulateOptions (path, select, match, options, model) { + this.path = path; + this.match = match; + this.select = select; + this.options = options; + this.model = model; + this._docs = {}; +} + +// make it compatible with utils.clone +PopulateOptions.prototype.constructor = Object; + +// expose +exports.PopulateOptions = PopulateOptions; + +/*! + * populate helper + */ + +exports.populate = function populate (path, select, model, match, options) { + // The order of select/conditions args is opposite Model.find but + // necessary to keep backward compatibility (select could be + // an array, string, or object literal). + + // might have passed an object specifying all arguments + if (1 === arguments.length) { + if (path instanceof PopulateOptions) { + return [path]; + } + + if (Array.isArray(path)) { + return path.map(function(o){ + return exports.populate(o)[0]; + }); + } + + if (exports.isObject(path)) { + match = path.match; + options = path.options; + select = path.select; + model = path.model; + path = path.path; + } + } else if ('string' !== typeof model) { + options = match; + match = model; + model = undefined; + } + + if ('string' != typeof path) { + throw new TypeError('utils.populate: invalid path. Expected string. Got typeof `' + typeof path + '`'); + } + + var ret = []; + var paths = path.split(' '); + for (var i = 0; i < paths.length; ++i) { + ret.push(new PopulateOptions(paths[i], select, match, options, model)); + } + + return ret; +} + +/*! + * Return the value of `obj` at the given `path`. + * + * @param {String} path + * @param {Object} obj + */ + +exports.getValue = function (path, obj, map) { + return mpath.get(path, obj, '_doc', map); +} + +/*! + * Sets the value of `obj` at the given `path`. + * + * @param {String} path + * @param {Anything} val + * @param {Object} obj + */ + +exports.setValue = function (path, val, obj, map) { + mpath.set(path, val, obj, '_doc', map); +} + +/*! + * Returns an array of values from object `o`. + * + * @param {Object} o + * @return {Array} + * @private + */ + +exports.object = {}; +exports.object.vals = function vals (o) { + var keys = Object.keys(o) + , i = keys.length + , ret = []; + + while (i--) { + ret.push(o[keys[i]]); + } + + return ret; +} + +/*! + * @see exports.options + */ + +exports.object.shallowCopy = exports.options; + +/*! + * Safer helper for hasOwnProperty checks + * + * @param {Object} obj + * @param {String} prop + */ + +exports.object.hasOwnProperty = function (obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +/*! + * Determine if `val` is null or undefined + * + * @return {Boolean} + */ + +exports.isNullOrUndefined = function (val) { + return null == val +} + +/*! + * ignore + */ + +exports.array = {}; + +/*! + * Flattens an array. + * + * [ 1, [ 2, 3, [4] ]] -> [1,2,3,4] + * + * @param {Array} arr + * @param {Function} [filter] If passed, will be invoked with each item in the array. If `filter` returns a falsey value, the item will not be included in the results. + * @return {Array} + * @private + */ + +exports.array.flatten = function flatten (arr, filter, ret) { + ret || (ret = []); + + arr.forEach(function (item) { + if (Array.isArray(item)) { + flatten(item, filter, ret); + } else { + if (!filter || filter(item)) { + ret.push(item); + } + } + }); + + return ret; +} + diff --git a/node_modules/mongoose/node_modules/hooks/package.json b/node_modules/mongoose/node_modules/hooks/package.json index 45181fb..9300f23 100644 --- a/node_modules/mongoose/node_modules/hooks/package.json +++ b/node_modules/mongoose/node_modules/hooks/package.json @@ -41,8 +41,5 @@ "optionalDependencies": {}, "readme": "hooks\n============\n\nAdd pre and post middleware hooks to your JavaScript methods.\n\n## Installation\n npm install hooks\n\n## Motivation\nSuppose you have a JavaScript object with a `save` method.\n\nIt would be nice to be able to declare code that runs before `save` and after `save`.\nFor example, you might want to run validation code before every `save`,\nand you might want to dispatch a job to a background job queue after `save`.\n\nOne might have an urge to hard code this all into `save`, but that turns out to\ncouple all these pieces of functionality (validation, save, and job creation) more\ntightly than is necessary. For example, what if someone does not want to do background\njob creation after the logical save? \n\nIt is nicer to tack on functionality using what we call `pre` and `post` hooks. These\nare functions that you define and that you direct to execute before or after particular\nmethods.\n\n## Example\nWe can use `hooks` to add validation and background jobs in the following way:\n\n var hooks = require('hooks')\n , Document = require('./path/to/some/document/constructor');\n\n // Add hooks' methods: `hook`, `pre`, and `post` \n for (var k in hooks) {\n Document[k] = hooks[k];\n }\n\n // Define a new method that is able to invoke pre and post middleware\n Document.hook('save', Document.prototype.save);\n\n // Define a middleware function to be invoked before 'save'\n Document.pre('save', function validate (next) {\n // The `this` context inside of `pre` and `post` functions\n // is the Document instance\n if (this.isValid()) next(); // next() passes control to the next middleware\n // or to the target method itself\n else next(new Error(\"Invalid\")); // next(error) invokes an error callback\n });\n\n // Define a middleware function to be invoked after 'save'\n Document.post('save', function createJob () {\n this.sendToBackgroundQueue();\n });\n\nIf you already have defined `Document.prototype` methods for which you want pres and posts,\nthen you do not need to explicitly invoke `Document.hook(...)`. Invoking `Document.pre(methodName, fn)`\nor `Document.post(methodName, fn)` will automatically and lazily change `Document.prototype[methodName]`\nso that it plays well with `hooks`. An equivalent way to implement the previous example is:\n\n```javascript\nvar hooks = require('hooks')\n , Document = require('./path/to/some/document/constructor');\n\n// Add hooks' methods: `hook`, `pre`, and `post` \nfor (var k in hooks) {\n Document[k] = hooks[k];\n}\n\nDocument.prototype.save = function () {\n // ...\n};\n\n// Define a middleware function to be invoked before 'save'\nDocument.pre('save', function validate (next) {\n // The `this` context inside of `pre` and `post` functions\n // is the Document instance\n if (this.isValid()) next(); // next() passes control to the next middleware\n // or to the target method itself\n else next(new Error(\"Invalid\")); // next(error) invokes an error callback\n});\n\n// Define a middleware function to be invoked after 'save'\nDocument.post('save', function createJob () {\n this.sendToBackgroundQueue();\n});\n```\n\n## Pres and Posts as Middleware\nWe structure pres and posts as middleware to give you maximum flexibility:\n\n1. You can define **multiple** pres (or posts) for a single method.\n2. These pres (or posts) are then executed as a chain of methods.\n3. Any functions in this middleware chain can choose to halt the chain's execution by `next`ing an Error from that middleware function. If this occurs, then none of the other middleware in the chain will execute, and the main method (e.g., `save`) will not execute. This is nice, for example, when we don't want a document to save if it is invalid.\n\n## Defining multiple pres (or posts)\n`pre` is chainable, so you can define multiple pres via:\n Document.pre('save', function (next, halt) {\n console.log(\"hello\");\n }).pre('save', function (next, halt) {\n console.log(\"world\");\n });\n\nAs soon as one pre finishes executing, the next one will be invoked, and so on.\n\n## Error Handling\nYou can define a default error handler by passing a 2nd function as the 3rd argument to `hook`:\n Document.hook('set', function (path, val) {\n this[path] = val;\n }, function (err) {\n // Handler the error here\n console.error(err);\n });\n\nThen, we can pass errors to this handler from a pre or post middleware function:\n Document.pre('set', function (next, path, val) {\n next(new Error());\n });\n\nIf you do not set up a default handler, then `hooks` makes the default handler that just throws the `Error`.\n\nThe default error handler can be over-rided on a per method invocation basis.\n\nIf the main method that you are surrounding with pre and post middleware expects its last argument to be a function\nwith callback signature `function (error, ...)`, then that callback becomes the error handler, over-riding the default\nerror handler you may have set up.\n \n```javascript\nDocument.hook('save', function (callback) {\n // Save logic goes here\n ...\n});\n\nvar doc = new Document();\ndoc.save( function (err, saved) {\n // We can pass err via `next` in any of our pre or post middleware functions\n if (err) console.error(err);\n \n // Rest of callback logic follows ...\n});\n```\n\n## Mutating Arguments via Middleware\n`pre` and `post` middleware can also accept the intended arguments for the method\nthey augment. This is useful if you want to mutate the arguments before passing\nthem along to the next middleware and eventually pass a mutated arguments list to\nthe main method itself.\n\nAs a simple example, let's define a method `set` that just sets a key, value pair.\nIf we want to namespace the key, we can do so by adding a `pre` middleware hook\nthat runs before `set`, alters the arguments by namespacing the `key` argument, and passes them onto `set`:\n\n Document.hook('set', function (key, val) {\n this[key] = val;\n });\n Document.pre('set', function (next, key, val) {\n next('namespace-' + key, val);\n });\n var doc = new Document();\n doc.set('hello', 'world');\n console.log(doc.hello); // undefined\n console.log(doc['namespace-hello']); // 'world'\n\nAs you can see above, we pass arguments via `next`.\n\nIf you are not mutating the arguments, then you can pass zero arguments\nto `next`, and the next middleware function will still have access\nto the arguments.\n\n Document.hook('set', function (key, val) {\n this[key] = val;\n });\n Document.pre('set', function (next, key, val) {\n // I have access to key and val here\n next(); // We don't need to pass anything to next\n });\n Document.pre('set', function (next, key, val) {\n // And I still have access to the original key and val here\n next();\n });\n\nFinally, you can add arguments that downstream middleware can also see:\n\n // Note that in the definition of `set`, there is no 3rd argument, options\n Document.hook('set', function (key, val) {\n // But...\n var options = arguments[2]; // ...I have access to an options argument\n // because of pre function pre2 (defined below)\n console.log(options); // '{debug: true}'\n this[key] = val;\n });\n Document.pre('set', function pre1 (next, key, val) {\n // I only have access to key and val arguments\n console.log(arguments.length); // 3\n next(key, val, {debug: true});\n });\n Document.pre('set', function pre2 (next, key, val, options) {\n console.log(arguments.length); // 4\n console.log(options); // '{ debug: true}'\n next();\n });\n Document.pre('set', function pre3 (next, key, val, options) {\n // I still have access to key, val, AND the options argument introduced via the preceding middleware\n console.log(arguments.length); // 4\n console.log(options); // '{ debug: true}'\n next();\n });\n \n var doc = new Document()\n doc.set('hey', 'there');\n\n## Parallel `pre` middleware\n\nAll middleware up to this point has been \"serial\" middleware -- i.e., middleware whose logic\nis executed as a serial chain.\n\nSome scenarios call for parallel middleware -- i.e., middleware that can wait for several\nasynchronous services at once to respond.\n\nFor instance, you may only want to save a Document only after you have checked\nthat the Document is valid according to two different remote services.\n\nWe accomplish asynchronous middleware by adding a second kind of flow control callback\n(the only flow control callback so far has been `next`), called `done`.\n\n- `next` passes control to the next middleware in the chain\n- `done` keeps track of how many parallel middleware have invoked `done` and passes\n control to the target method when ALL parallel middleware have invoked `done`. If\n you pass an `Error` to `done`, then the error is handled, and the main method that is\n wrapped by pres and posts will not get invoked.\n\nWe declare pre middleware that is parallel by passing a 3rd boolean argument to our `pre`\ndefinition method.\n\nWe illustrate via the parallel validation example mentioned above:\n\n Document.hook('save', function targetFn (callback) {\n // Save logic goes here\n // ...\n // This only gets run once the two `done`s are both invoked via preOne and preTwo.\n });\n\n // true marks this as parallel middleware\n Document.pre('save', true, function preOne (next, doneOne, callback) {\n remoteServiceOne.validate(this.serialize(), function (err, isValid) {\n // The code in here will probably be run after the `next` below this block\n // and could possibly be run after the console.log(\"Hola\") in `preTwo\n if (err) return doneOne(err);\n if (isValid) doneOne();\n });\n next(); // Pass control to the next middleware\n });\n \n // We will suppose that we need 2 different remote services to validate our document\n Document.pre('save', true, function preTwo (next, doneTwo, callback) {\n remoteServiceTwo.validate(this.serialize(), function (err, isValid) {\n if (err) return doneTwo(err);\n if (isValid) doneTwo();\n });\n next();\n });\n \n // While preOne and preTwo are parallel, preThree is a serial pre middleware\n Document.pre('save', function preThree (next, callback) {\n next();\n });\n \n var doc = new Document();\n doc.save( function (err, doc) {\n // Do stuff with the saved doc here...\n });\n\nIn the above example, flow control may happen in the following way:\n\n(1) doc.save -> (2) preOne --(next)--> (3) preTwo --(next)--> (4) preThree --(next)--> (wait for dones to invoke) -> (5) doneTwo -> (6) doneOne -> (7) targetFn\n\nSo what's happening is that:\n\n1. You call `doc.save(...)`\n2. First, your preOne middleware gets executed. It makes a remote call to the validation service and `next()`s to the preTwo middleware.\n3. Now, your preTwo middleware gets executed. It makes a remote call to another validation service and `next()`s to the preThree middleware.\n4. Your preThree middleware gets executed. It immediately `next()`s. But nothing else gets executing until both `doneOne` and `doneTwo` are invoked inside the callbacks handling the response from the two valiation services.\n5. We will suppose that validation remoteServiceTwo returns a response to us first. In this case, we call `doneTwo` inside the callback to remoteServiceTwo.\n6. Some fractions of a second later, remoteServiceOne returns a response to us. In this case, we call `doneOne` inside the callback to remoteServiceOne.\n7. `hooks` implementation keeps track of how many parallel middleware has been defined per target function. It detects that both asynchronous pre middlewares (`preOne` and `preTwo`) have finally called their `done` functions (`doneOne` and `doneTwo`), so the implementation finally invokes our `targetFn` (i.e., our core `save` business logic).\n\n## Removing Pres\n\nYou can remove a particular pre associated with a hook:\n\n Document.pre('set', someFn);\n Document.removePre('set', someFn);\n\nAnd you can also remove all pres associated with a hook:\n Document.removePre('set'); // Removes all declared `pre`s on the hook 'set'\n\n## Tests\nTo run the tests:\n make test\n\n### Contributors\n- [Brian Noguchi](https://github.com/bnoguchi)\n\n### License\nMIT License\n\n---\n### Author\nBrian Noguchi\n", "_id": "hooks@0.2.1", - "dist": { - "shasum": "312be2846369060edcadd97b271c2ae6378b0e1b" - }, "_from": "hooks@0.2.1" } diff --git a/node_modules/mongoose/node_modules/mongodb/.travis.yml b/node_modules/mongoose/node_modules/mongodb/.travis.yml index 94740d0..0140117 100644 --- a/node_modules/mongoose/node_modules/mongodb/.travis.yml +++ b/node_modules/mongoose/node_modules/mongodb/.travis.yml @@ -2,4 +2,4 @@ language: node_js node_js: - 0.6 - 0.8 - - 0.9 # development version of 0.8, may be unstable \ No newline at end of file + - 0.10 # development version of 0.8, may be unstable \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/Makefile b/node_modules/mongoose/node_modules/mongodb/Makefile index ac55626..59d2bfe 100644 --- a/node_modules/mongoose/node_modules/mongodb/Makefile +++ b/node_modules/mongoose/node_modules/mongodb/Makefile @@ -6,56 +6,20 @@ name = all total: build_native -test-coverage: - rm -rf lib-cov/ - jscoverage lib/ lib-cov/ - @TEST_COVERAGE=true nodeunit test/ test/gridstore test/connection +test_functional: + node test/runner.js -t functional -build_native: +test_ssl: + node test/runner.js -t ssl -test: build_native - @echo "\n == Run All tests minus replicaset tests==" - $(NODE) dev/tools/test_all.js --noreplicaset --boot +test_replicaset: + node test/runner.js -t replicaset -test_pure: build_native - @echo "\n == Run All tests minus replicaset tests==" - $(NODE) dev/tools/test_all.js --noreplicaset --boot --nonative +test_sharded: + node test/runner.js -t sharded -test_junit: build_native - @echo "\n == Run All tests minus replicaset tests==" - $(NODE) dev/tools/test_all.js --junit --noreplicaset --nokill - -jenkins: build_native - @echo "\n == Run All tests minus replicaset tests==" - $(NODE) dev/tools/test_all.js --junit --noreplicaset --nokill - -test_nodeunit_pure: - @echo "\n == Execute Test Suite using Pure JS BSON Parser == " - @$(NODEUNIT) test/ test/gridstore test/bson - -test_nodeunit_replicaset_pure: - @echo "\n == Execute Test Suite using Pure JS BSON Parser == " - @$(NODEUNIT) test/replicaset - -test_nodeunit_native: - @echo "\n == Execute Test Suite using Native BSON Parser == " - @TEST_NATIVE=TRUE $(NODEUNIT) test/ test/gridstore test/bson - -test_nodeunit_replicaset_native: - @echo "\n == Execute Test Suite using Native BSON Parser == " - @TEST_NATIVE=TRUE $(NODEUNIT) test/replicaset - -test_all: build_native - @echo "\n == Run All tests ==" - $(NODE) dev/tools/test_all.js --boot - -test_all_junit: build_native - @echo "\n == Run All tests ==" - $(NODE) dev/tools/test_all.js --junit --boot - -clean: - rm ./external-libs/bson/bson.node - rm -r ./external-libs/bson/build +test_auth: + node test/runner.js -t auth generate_docs: $(NODE) dev/tools/build-docs.js diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection.js index 14cbeee..41647a3 100644 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection.js +++ b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection.js @@ -24,6 +24,7 @@ var Connection = exports.Connection = function(id, socketOptions) { // Connection parsing state // this.maxBsonSize = socketOptions.maxBsonSize ? socketOptions.maxBsonSize : Connection.DEFAULT_MAX_BSON_SIZE; + this.maxMessageSizeBytes = socketOptions.maxMessageSizeBytes ? socketOptions.maxMessageSizeBytes : Connection.DEFAULT_MAX_MESSAGE_SIZE; // Contains the current message bytes this.buffer = null; // Contains the current message size @@ -42,6 +43,8 @@ var Connection = exports.Connection = function(id, socketOptions) { // Set max bson size Connection.DEFAULT_MAX_BSON_SIZE = 1024 * 1024 * 4; +// Set default to max bson to avoid overflow or bad guesses +Connection.DEFAULT_MAX_MESSAGE_SIZE = Connection.DEFAULT_MAX_BSON_SIZE; // Inherit event emitter so we can emit stuff wohoo inherits(Connection, EventEmitter); @@ -91,10 +94,6 @@ Connection.prototype.start = function() { if(this.socketOptions.sslCert) { tls_options.cert = this.socketOptions.sslCert; tls_options.key = this.socketOptions.sslKey; - // Allow for a combined cert/key pem file being passed in as cert parameter - // if(tls_options.key == null) { - // tls_options.key = this.socketOptions.ssl_cert; - // } } // If the driver has been provided a private key password @@ -187,8 +186,14 @@ Connection.prototype.write = function(command, callback) { if(Array.isArray(command)) { for(var i = 0; i < command.length; i++) { var binaryCommand = command[i].toBinary() + if(!this.socketOptions['disableDriverBSONSizeCheck'] && binaryCommand.length > this.maxBsonSize) - return callback(new Error("Document exceeds maximal allowed bson size of " + this.maxBsonSize + " bytes")); + return callback(new Error("Document exceeds maximum allowed bson size of " + this.maxBsonSize + " bytes")); + + if(this.socketOptions['disableDriverBSONSizeCheck'] && binaryCommand.length > this.maxMessageSizeBytes) { + return callback(new Error("Command exceeds maximum message size of " + this.maxMessageSizeBytes + " bytes")); + } + if(this.logger != null && this.logger.doDebug) this.logger.debug("writing command to mongodb", {binary: binaryCommand, json: command[i]}); @@ -196,8 +201,13 @@ Connection.prototype.write = function(command, callback) { } } else { var binaryCommand = command.toBinary() + if(!this.socketOptions['disableDriverBSONSizeCheck'] && binaryCommand.length > this.maxBsonSize) - return callback(new Error("Document exceeds maximal allowed bson size of " + this.maxBsonSize + " bytes")); + return callback(new Error("Document exceeds maximum allowed bson size of " + this.maxBsonSize + " bytes")); + + if(this.socketOptions['disableDriverBSONSizeCheck'] && binaryCommand.length > this.maxMessageSizeBytes) { + return callback(new Error("Command exceeds maximum message size of " + this.maxMessageSizeBytes + " bytes")); + } if(this.logger != null && this.logger.doDebug) this.logger.debug("writing command to mongodb", {binary: binaryCommand, json: command}); @@ -288,7 +298,7 @@ var createDataHandler = exports.Connection.createDataHandler = function(self) { // Emit the buffer self.emit("message", emitBuffer, self); } catch(err) { - var errorObject = {err:"socketHandler", trace:err, bin:buffer, parseState:{ + var errorObject = {err:"socketHandler", trace:err, bin:self.buffer, parseState:{ sizeOfMessage:self.sizeOfMessage, bytesRead:self.bytesRead, stubBuffer:self.stubBuffer}}; diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection_pool.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection_pool.js index 8e6f3ee..0ca433f 100644 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection_pool.js +++ b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection_pool.js @@ -1,11 +1,16 @@ var utils = require('./connection_utils'), inherits = require('util').inherits, net = require('net'), + timers = require('timers'), EventEmitter = require('events').EventEmitter, inherits = require('util').inherits, MongoReply = require("../responses/mongo_reply").MongoReply, Connection = require("./connection").Connection; +// Set processor, setImmediate if 0.10 otherwise nextTick +var processor = timers.setImmediate ? timers.setImmediate : process.nextTick; +processor = process.nextTick + var ConnectionPool = exports.ConnectionPool = function(host, port, poolSize, bson, socketOptions) { if(typeof host !== 'string') { throw new Error("host must be specified [" + host + "]"); @@ -76,6 +81,16 @@ ConnectionPool.prototype.setMaxBsonSize = function(maxBsonSize) { } } +ConnectionPool.prototype.setMaxMessageSizeBytes = function(maxMessageSizeBytes) { + if(maxMessageSizeBytes == null){ + maxMessageSizeBytes = Connection.DEFAULT_MAX_MESSAGE_SIZE; + } + + for(var i = 0; i < this.openConnections.length; i++) { + this.openConnections[i].maxMessageSizeBytes = maxMessageSizeBytes; + } +} + // Start a function var _connect = function(_self) { // return new function() { @@ -104,7 +119,7 @@ var _connect = function(_self) { } }, _self._timeToWait); } else { - process.nextTick(function() { + processor(function() { // If we are still connecting (no close events fired in between start another connection) if(_self._poolState == 'connecting') { _connect(_self); diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/repl_set.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/repl_set.js index 860c9fe..92171a6 100644 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/repl_set.js +++ b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/repl_set.js @@ -105,6 +105,8 @@ var ReplSet = exports.ReplSet = function(servers, options) { this._serverState = 'disconnected'; // Read preference this._readPreference = null; + // HA running + this._haRunning = false; // Do we record server stats or not this.recordQueryStats = false; // Update health try server @@ -132,6 +134,9 @@ var ReplSet = exports.ReplSet = function(servers, options) { || this._readPreference == false || this._readPreference == null ? false : true; + // Ensure correct slave set + if(this.readSecondary) this.slaveOk = true; + // Strategy for picking a secondary this.secondaryAcceptableLatencyMS = this.options['secondaryAcceptableLatencyMS'] == null ? 15 : this.options['secondaryAcceptableLatencyMS']; this.strategy = this.options['strategy']; @@ -237,8 +242,10 @@ inherits(ReplSet, Base); ReplSet.prototype.setReadPreference = function(preference) { // Set read preference this._readPreference = preference; - // Ensure slaveOk is correct for secodnaries read preference and tags - if((this._readPreference == ReadPreference.SECONDARY_PREFERRED || this._readPreference == ReadPreference.SECONDARY) + // Ensure slaveOk is correct for secondaries read preference and tags + if((this._readPreference == ReadPreference.SECONDARY_PREFERRED + || this._readPreference == ReadPreference.SECONDARY + || this._readPreference == ReadPreference.NEAREST) || (this._readPreference != null && typeof this._readPreference == 'object')) { this.slaveOk = true; } @@ -338,6 +345,7 @@ ReplSet.prototype.allServerInstances = function() { */ ReplSet.prototype._enableHA = function () { var self = this; + self._haRunning = true; return check(); function ping () { @@ -390,17 +398,17 @@ ReplSet.prototype._enableHA = function () { self._haServer._callBackStore = self._callBackStore; // Add error handlers - self.on("close", function() { + self._haServer.on("close", function() { if(self._haServer) self._haServer.close(); self._haServer = null; }); - self.on("error", function() { + self._haServer.on("error", function() { if(self._haServer) self._haServer.close(); self._haServer = null; }); - self.on("timeout", function() { + self._haServer.on("timeout", function() { if(self._haServer) self._haServer.close(); self._haServer = null; }); @@ -409,12 +417,13 @@ ReplSet.prototype._enableHA = function () { // behavior on any errors we could possibly run into self._haServer.connect(db, function(err, result, _server) { if("disconnected" == self._serverState) { - if(_server.close) _server.close(); + if(_server && _server.close) _server.close(); + self._haRunning = false; return; } if(err) { - if(_server.close) _server.close(); + if(_server && _server.close) _server.close(); return check(); } @@ -433,11 +442,17 @@ ReplSet.prototype._enableHA = function () { // Execute is master command db._executeQueryCommand(cmd, {failFast:true, connection: _server.checkoutReader()}, function(err, res) { if("disconnected" == self._serverState) { - if(_server.close) _server.close(); + if(_server && _server.close) _server.close(); + self._haRunning = false; + self._haServer = null; return; } // If error let's set perform another check - if(err) return check(); + if(err) { + // Force new server selection + self._haServer = null; + return check(); + } // Validate the replicaset self._validateReplicaset(res, db.auths, function() { check(); @@ -505,7 +520,7 @@ ReplSet.prototype._validateReplicaset = function(result, auths, cb) { * @param {Function} cb * @ignore */ -function connectTo (hosts, auths, replset, cb) { +function connectTo(hosts, auths, replset, cb) { var pending = hosts.length; if (!pending) return cb(); @@ -529,7 +544,7 @@ function connectTo (hosts, auths, replset, cb) { * @param {Function} cb * @ignore */ -function connectToHost (host, auths, replset, cb) { +function connectToHost(host, auths, replset, cb) { var server = createServer(host, replset); var options = { @@ -603,7 +618,7 @@ function connectToHost (host, auths, replset, cb) { * @return {Server} * @ignore */ -function createServer (host, replset) { +function createServer(host, replset) { // copy existing socket options to new server var socketOptions = {} if(replset.socketOptions) { @@ -822,6 +837,7 @@ var _connectHandler = function(self, candidateServers, instanceServer) { } delete addresses[server.host + ":" + server.port]; } + addresses[server.host + ":" + server.port] = server; // Connect server.connect(self.db, {returnIsMasterResults: true, eventReceiver:server}, _connectHandler(self, candidateServers, server)); @@ -840,18 +856,20 @@ var _connectHandler = function(self, candidateServers, instanceServer) { return self.emit("connectionError", new Error("no primary server found in set")) } else{ - if (self.strategyInstance) { + if(self.strategyInstance) { self.strategyInstance.start(); } for(var i = 0; i < self.dbInstances.length; i++) self.dbInstances[i]._state = 'connected'; self.emit("fullsetup", null, self.db, self); - self.emit("open", null, self.db, self); + self.emit("open", null, self.db, self); } } } } +var _fullsetup_emitted = false; + /** * Interval state object constructor * @@ -949,7 +967,8 @@ ReplSet.prototype.connect = function(parent, options, callback) { returnIsMasterResults: true, eventReceiver: server } - server.connect(parent, opts, _connectHandler(this, candidateServers, server)); + + server.connect(parent, opts, _connectHandler(self, candidateServers, server)); } /** @@ -967,6 +986,7 @@ ReplSet.prototype._handleOnFullSetup = function (parent) { parent.emit("fullsetup", null, this.db, this); if(!this.haEnabled) return; + if(this._haRunning) return; this._enableHA(); } diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js index c4ae952..20392fa 100644 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js +++ b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js @@ -6,8 +6,13 @@ var Connection = require('./connection').Connection, EventEmitter = require('events').EventEmitter, Base = require('./base').Base, utils = require('../utils'), + timers = require('timers'), inherits = require('util').inherits; +// Set processor, setImmediate if 0.10 otherwise nextTick +var processor = timers.setImmediate ? timers.setImmediate : process.nextTick; +processor = process.nextTick + /** * Class representing a single MongoDB Server connection * @@ -19,7 +24,6 @@ var Connection = require('./connection').Connection, * - **sslCert** {Buffer/String, default:null}, String or buffer containing the certificate we wish to present (needs to have a mongod server with ssl support, 2.4 or higher) * - **sslKey** {Buffer/String, default:null}, String or buffer containing the certificate private key we wish to present (needs to have a mongod server with ssl support, 2.4 or higher) * - **sslPass** {Buffer/String, default:null}, String or buffer containing the certificate password (needs to have a mongod server with ssl support, 2.4 or higher) - * - **slaveOk** {Boolean, default:false}, legacy option allowing reads from secondary, use **readPrefrence** instead. * - **poolSize** {Number, default:5}, number of connections in the connection pool, set to 5 as default for legacy reasons. * - **socketOptions** {Object, default:null}, an object containing socket options to use (noDelay:(boolean), keepAlive:(number), connectTimeoutMS:(number), socketTimeoutMS:(number)) * - **logger** {Object, default:null}, an object representing a logger that you want to use, needs to support functions debug, log, error **({error:function(message, object) {}, log:function(message, object) {}, debug:function(message, object) {}})**. @@ -318,6 +322,7 @@ Server.prototype.connect = function(dbInstance, options, callback) { if(err != null) return internalCallback(err, null, server); server.master = reply.documents[0].ismaster == 1 ? true : false; server.connectionPool.setMaxBsonSize(reply.documents[0].maxBsonObjectSize); + server.connectionPool.setMaxMessageSizeBytes(reply.documents[0].maxMessageSizeBytes); // Set server as connected server.connected = true; // Save document returned so we can query it @@ -520,7 +525,7 @@ Server.prototype.connect = function(dbInstance, options, callback) { } } catch (err) { // Throw error in next tick - process.nextTick(function() { + processor(function() { throw err; }) } diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/url_parser.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/url_parser.js index d31e8a0..4c13d0c 100644 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/url_parser.js +++ b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/url_parser.js @@ -172,6 +172,8 @@ exports.parse = function(url, options) { case 'w': dbOptions.w = parseInt(value, 10); break; + case 'authSource': + dbOptions.authSource = value; case 'wtimeoutMS': dbOptions.wtimeoutMS = parseInt(value, 10); break; diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursor.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursor.js index c4d417b..f7aa556 100644 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursor.js +++ b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursor.js @@ -4,8 +4,12 @@ var QueryCommand = require('./commands/query_command').QueryCommand, Long = require('bson').Long, ReadPreference = require('./connection/read_preference').ReadPreference, CursorStream = require('./cursorstream'), + timers = require('timers'), utils = require('./utils'); +// Set processor, setImmediate if 0.10 otherwise nextTick +var processor = timers.setImmediate ? timers.setImmediate : process.nextTick; + /** * Constructor for a cursor object that handles all the operations on query result * using find. This cursor object is unidirectional and cannot traverse backwards. Clients should not be creating a cursor directly, @@ -250,7 +254,7 @@ Cursor.prototype.each = function(callback) { // from the server. var eachExhaust = function(self, callback) { //FIX: stack overflow (on deep callback) (cred: https://github.com/limp/node-mongodb-native/commit/27da7e4b2af02035847f262b29837a94bbbf6ce2) - process.nextTick(function(){ + processor(function(){ // Fetch the next object until there is no more objects self.nextObject(function(err, item) { if(err != null) return callback(err, null); @@ -697,14 +701,16 @@ var getMore = function(self, options, callback) { // Execute the command self.db._executeQueryCommand(getMoreCommand, command_options, function(err, result) { + var cbValue; + // Get more done self.state = Cursor.OPEN; - try { - if(err != null) { - return callback(utils.toError(err), null); - } + if(err != null) { + return callback(utils.toError(err), null); + } + try { var isDead = 1 === result.responseFlag && result.cursorId.isZero(); self.cursorId = result.cursorId; @@ -729,10 +735,9 @@ var getMore = function(self, options, callback) { // Don's shift a document out as we need it for toArray if(options.noReturn) { - return callback(null, true); - callback(null, true); + cbValue = true; } else { - callback(null, self.items.shift()); + cbValue = self.items.shift(); } } else if(self.tailable && !isDead && self.awaitdata) { // Excute the tailable cursor once more, will timeout after ~4 sec if awaitdata used @@ -754,6 +759,7 @@ var getMore = function(self, options, callback) { } catch(err) { callback(utils.toError(err), null); } + if (cbValue != null) callback(null, cbValue); }); getMoreCommand = null; @@ -780,36 +786,6 @@ var getMore = function(self, options, callback) { Cursor.prototype.explain = function(callback) { var limit = (-1)*Math.abs(this.limitValue); - // * - **skip** {Number} skip number of documents to skip. - // * - **limit** {Number}, limit the number of results to return. -1 has a special meaning and is used by Db.eval. A value of 1 will also be treated as if it were -1. - // * - **hint** {Object}, hint force the query to use a specific index. - // * - **explain** {Boolean}, explain return the explaination of the query. - // * - **slaveOk** {Boolean}, slaveOk, sets the slaveOk flag on the query wire protocol for secondaries. - // * - **snapshot** {Boolean}, snapshot Snapshot mode assures no duplicates are returned. - // * - **timeout** {Boolean}, timeout allow the query to timeout. - // * - **tailable** {Boolean}, tailable allow the cursor to be tailable. - // * - **awaitdata** {Boolean}, awaitdata allow the cursor to wait for data, only applicable for tailable cursor. - // * - **batchSize** {Number}, batchSize the number of the subset of results to request the database to return for every request. This should initially be greater than 1 otherwise the database will automatically close the cursor. The batch size can be set to 1 with cursorInstance.batchSize after performing the initial query to the database. - // * - **raw** {Boolean}, raw return all query documents as raw buffers (default false). - // * - **read** {Boolean}, read specify override of read from source (primary/secondary). - // * - **returnKey** {Boolean}, returnKey only return the index key. - // * - **maxScan** {Number}, maxScan limit the number of items to scan. - // * - **min** {Number}, min set index bounds. - // * - **max** {Number}, max set index bounds. - // * - **showDiskLoc** {Boolean}, showDiskLoc show disk location of results. - // * - **comment** {String}, comment you can put a $comment field on a query to make looking in the profiler logs simpler. - // * - **numberOfRetries** {Number}, numberOfRetries if using awaidata specifies the number of times to retry on timeout. - // * - **dbName** {String}, dbName override the default dbName. - // * - **tailableRetryInterval** {Number}, tailableRetryInterval specify the miliseconds between getMores on tailable cursor. - // * - **exhaust** {Boolean}, exhaust have the server send all the documents at once as getMore packets. - // * - **partial** {Boolean}, partial have the sharded system return a partial result from mongos. - - // * - **sort** {Array | Object}, set to sort the documents coming back from the query. Array of indexes, [['a', 1]] etc. - -// function Cursor(db, collection, selector, fields, skip, limit -// - , sort, hint, explain, snapshot, timeout, tailable, batchSize, slaveOk, raw, read -// - , returnKey, maxScan, min, max, showDiskLoc, comment, awaitdata, numberOfRetries, dbName, tailableRetry - // Create a new cursor and fetch the plan var cursor = new Cursor(this.db, this.collection, this.selector, this.fields, { skip: this.skipValue @@ -923,11 +899,14 @@ Cursor.prototype.streamRecords = function(options) { /** * Returns a Node ReadStream interface for this cursor. * + * Options + * - **transform** {Function} function of type function(object) { return transformed }, allows for transformation of data before emitting. + * * @return {CursorStream} returns a stream object. * @api public */ -Cursor.prototype.stream = function stream () { - return new CursorStream(this); +Cursor.prototype.stream = function stream(options) { + return new CursorStream(this, options); } /** diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursorstream.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursorstream.js index ee0cd80..2752091 100644 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursorstream.js +++ b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursorstream.js @@ -1,3 +1,8 @@ +var timers = require('timers'); + +// Set processor, setImmediate if 0.10 otherwise nextTick +var processor = timers.setImmediate ? timers.setImmediate : process.nextTick; + /** * Module dependecies. */ @@ -8,6 +13,9 @@ var Stream = require('stream').Stream; * * Returns a stream interface for the **cursor**. * + * Options + * - **transform** {Function} function of type function(object) { return transformed }, allows for transformation of data before emitting. + * * Events * - **data** {function(item) {}} the data event triggers when a document is ready. * - **error** {function(err) {}} the error event triggers if an error happens. @@ -17,8 +25,9 @@ var Stream = require('stream').Stream; * @param {Cursor} cursor a cursor object that the stream wraps. * @return {Stream} */ -function CursorStream(cursor) { +function CursorStream(cursor, options) { if(!(this instanceof CursorStream)) return new CursorStream(cursor); + options = options ? options : {}; Stream.call(this); @@ -26,11 +35,12 @@ function CursorStream(cursor) { this.paused = false; this._cursor = cursor; this._destroyed = null; + this.options = options; // give time to hook up events var self = this; - process.nextTick(function () { - self._init(); + process.nextTick(function() { + self._init(); }); } @@ -67,11 +77,13 @@ CursorStream.prototype._init = function () { * @api private */ CursorStream.prototype._next = function () { - if (this.paused || this._destroyed) return; + if(this.paused || this._destroyed) return; var self = this; // Get the next object - process.nextTick(function() { + processor(function() { + if(self.paused || self._destroyed) return; + self._cursor.nextObject(function (err, doc) { self._onNextObject(err, doc); }); @@ -91,7 +103,8 @@ CursorStream.prototype._onNextObject = function (err, doc) { this.emit('end') return this.destroy(); } else if(doc) { - this.emit('data', doc); + var data = typeof this.options.transform == 'function' ? this.options.transform(doc) : doc; + this.emit('data', data); this._next(); } } @@ -137,7 +150,7 @@ CursorStream.prototype.destroy = function (err) { this._cursor.close(); - if (err) { + if(err) { this.emit('error', err); } diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/db.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/db.js index 76635ec..957e436 100644 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/db.js +++ b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/db.js @@ -15,9 +15,14 @@ var QueryCommand = require('./commands/query_command').QueryCommand, EventEmitter = require('events').EventEmitter, inherits = require('util').inherits, crypto = require('crypto'), + timers = require('timers'), utils = require('./utils'), parse = require('./connection/url_parser').parse; +// Set processor, setImmediate if 0.10 otherwise nextTick +var processor = timers.setImmediate ? timers.setImmediate : process.nextTick; +processor = process.nextTick + /** * Create a new Db instance. * @@ -238,7 +243,7 @@ Db.prototype.open = function(callback) { // Execute any baked up commands var _execute_queued_command = function(self) { // Execute any backed up commands - process.nextTick(function() { + processor(function() { // Execute any backed up commands while(self.commands.length > 0) { // Fetch the command @@ -421,7 +426,8 @@ Db.prototype.collectionNames = function(collectionName, options, callback) { }; /** - * Fetch a specific collection (containing the actual collection information) + * Fetch a specific collection (containing the actual collection information). If the application does not use strict mode you can + * can use it without a callback in the following way. var collection = db.collection('mycollection'); * * Options * - **w**, {Number/String, > -1 || 'majority' || tag name} the write concern for the operation where < 1 is no acknowlegement of write and w >= 1, w = 'majority' or tag acknowledges the write @@ -432,12 +438,11 @@ Db.prototype.collectionNames = function(collectionName, options, callback) { * - **raw** {Boolean, default:false}, perform all operations using raw bson objects. * - **pkFactory** {Object}, object overriding the basic ObjectID primary key generation. * - **readPreference** {String}, the prefered read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). - * - **strict**, (Boolean, default:false) throws and error if collection already exists + * - **strict**, (Boolean, default:false) throws and error if the collection does not exist * * Deprecated Options * - **safe** {true | {w:n, wtimeout:n} | {fsync:true}, default:false}, executes with a getLastError command returning the results of the command on MongoDB. * - * * @param {String} collectionName the collection name we wish to access. * @param {Object} [options] returns option results. * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the collection or null if an error occured. @@ -620,8 +625,9 @@ Db.prototype.logout = function(options, callback) { * Authenticate a user against the server. * * Options - * - **authdb** {String}, The database that the credentials are for, + * - **authSource** {String}, The database that the credentials are for, * different from the name of the current DB, for example admin + * * @param {String} username username. * @param {String} password password. * @param {Object} [options] the options @@ -639,6 +645,7 @@ Db.prototype.authenticate = function(username, password, options, callback) { // the default db to authenticate against is 'this' // if authententicate is called from a retry context, it may be another one, like admin var authdb = options.authdb ? options.authdb : self.databaseName; + authdb = options.authSource ? options.authSource : authdb; // Push the new auth if we have no previous record var numberOfConnections = 0; @@ -1604,7 +1611,7 @@ var __retryCommandOnFailure = function(self, retryInMilliseconds, numberOfTimes, // Execute command command(_self, _db_command, _options, _callback); - process.nextTick(function() { + processor(function() { // Execute any backed up commands while(_self.commands.length > 0) { // Fetch the command @@ -1667,7 +1674,7 @@ Db.prototype._executeQueryCommand = function(db_command, options, callback) { var config = this.serverConfig; // If the pool is not connected, attemp to reconnect to send the message if(this._state == 'connecting' && config.autoReconnect && !failFast) { - return process.nextTick(function() { + return processor(function() { self.commands.push({ type: 'query', db_command: db_command, @@ -1699,7 +1706,7 @@ Db.prototype._executeQueryCommand = function(db_command, options, callback) { } __executeQueryCommand(self, db_command, options, function (err, result, conn) { - callback(err, result, conn); + if(callback) callback(err, result, conn); }); }; @@ -1787,7 +1794,7 @@ Db.prototype._executeInsertCommand = function(db_command, options, callback) { // If the pool is not connected, attemp to reconnect to send the message if(self._state == 'connecting' && this.serverConfig.autoReconnect) { - process.nextTick(function() { + processor(function() { self.commands.push({type:'insert', 'db_command':db_command, 'options':options, 'callback':callback}); }) } else if(!this.serverConfig.isConnected() && this.serverConfig.autoReconnect) { @@ -2031,7 +2038,14 @@ var _finishConnecting = function(serverConfig, object, options, callback) { // Open the db db.open(function(err, db){ if(err == null && object.auth){ - db.authenticate(object.auth.user, object.auth.password, function(err, success){ + // What db to authenticate against + var authentication_db = db; + if(object.db_options && object.db_options.authSource) { + authentication_db = db.db(object.db_options.authSource); + } + + // Authenticate + authentication_db.authenticate(object.auth.user, object.auth.password, function(err, success){ if(success){ callback(null, db); } else { diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/gridstore.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/gridstore.js index e9ddb97..615b22e 100644 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/gridstore.js +++ b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/gridstore.js @@ -11,11 +11,16 @@ var Chunk = require('./chunk').Chunk, ObjectID = require('bson').ObjectID, Buffer = require('buffer').Buffer, fs = require('fs'), + timers = require('timers'), util = require('util'), inherits = util.inherits, ReadStream = require('./readstream').ReadStream, Stream = require('stream'); +// Set processor, setImmediate if 0.10 otherwise nextTick +var processor = timers.setImmediate ? timers.setImmediate : process.nextTick; +processor = process.nextTick + var REFERENCE_BY_FILENAME = 0, REFERENCE_BY_ID = 1; @@ -326,7 +331,7 @@ GridStore.prototype.writeFile = function (file, callback) { fs.close(file); self.close(callback); } else { - return process.nextTick(writeChunk); + return processor(writeChunk); } }); }); @@ -334,7 +339,7 @@ GridStore.prototype.writeFile = function (file, callback) { } // Process the first write - process.nextTick(writeChunk); + processor(writeChunk); }); }); }; @@ -746,7 +751,7 @@ GridStore.prototype.read = function(length, buffer, callback) { // Copy content to final buffer slice.copy(finalBuffer, finalBuffer._index); // Update internal position - self.position = finalBuffer.length; + self.position = self.position + finalBuffer.length; // Check if we don't have a file at all if(finalLength == 0 && finalBuffer.length == 0) return callback(new Error("File does not exist"), null); // Else return data @@ -813,6 +818,10 @@ GridStore.prototype.seek = function(position, seekLocation, callback) { var seekLocationFinal = seekLocation == null ? exports.GridStore.IO_SEEK_SET : seekLocation; var finalPosition = position; var targetPosition = 0; + + // console.dir(targetPosition) + + // Calculate the position if(seekLocationFinal == exports.GridStore.IO_SEEK_CUR) { targetPosition = self.position + finalPosition; } else if(seekLocationFinal == exports.GridStore.IO_SEEK_END) { @@ -821,6 +830,7 @@ GridStore.prototype.seek = function(position, seekLocation, callback) { targetPosition = finalPosition; } + // Get the chunk var newChunkNumber = Math.floor(targetPosition/self.chunkSize); if(newChunkNumber != self.currentChunk.chunkNumber) { var seekChunk = function() { diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/readstream.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/readstream.js index ebb09bd..8ff9973 100644 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/readstream.js +++ b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/readstream.js @@ -1,6 +1,11 @@ var Stream = require('stream').Stream, + timers = require('timers'), util = require('util'); +// Set processor, setImmediate if 0.10 otherwise nextTick +var processor = timers.setImmediate ? timers.setImmediate : process.nextTick; +processor = process.nextTick + /** * ReadStream * @@ -40,7 +45,7 @@ function ReadStream(autoclose, gstore) { this.seekStartPosition = gstore.position - (this.currentChunkNumber * gstore.chunkSize); var self = this; - process.nextTick(function() { + processor(function() { self._execute(); }); }; @@ -180,7 +185,7 @@ ReadStream.prototype.resume = function() { this.paused = false; var self = this; - process.nextTick(function() { + processor(function() { self._execute(); }); }; diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js index b129dc6..743618f 100644 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js +++ b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js @@ -1,4 +1,9 @@ -var Long = require('bson').Long; +var Long = require('bson').Long + , timers = require('timers'); + +// Set processor, setImmediate if 0.10 otherwise nextTick +var processor = timers.setImmediate ? timers.setImmediate : process.nextTick; +processor = process.nextTick /** Reply message from mongo db @@ -93,7 +98,7 @@ MongoReply.prototype.parseBody = function(binary_reply, bson, raw, callback) { // If we hav more documents process NextTick if(object_index < _numberReturned) { - process.nextTick(processFunction); + processor(processFunction); } else { callback(null); } diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/Release/bson.node b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/Release/bson.node index f19736775d9133e0f554b3cf093c16510e1d96d6..22d7d536fe17e72b2d6c7e23c8c114d2e01fcd6e 100755 GIT binary patch delta 18 ZcmaFT#Qda*dBcNdW=^B{&5xTKZ2?kO2wDID delta 18 acmaFT#Qda*dBcNdW|eC?n;$nf+5!Mpc?jkJ diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/config.gypi b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/config.gypi index cc73905..a0a5c0c 100644 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/config.gypi +++ b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/config.gypi @@ -60,7 +60,7 @@ "userconfig": "/Users/jfolsom/.npmrc", "npaturl": "http://npat.npmjs.org/", "node_version": "v0.8.8", - "user": "", + "user": "501", "editor": "vi", "save": "", "tag": "latest", @@ -96,8 +96,8 @@ "git": "git", "init_author_name": "", "onload_script": "", - "tmp": "/var/folders/fq/xzvjbs0n3ks26691bqfx1fjc0000gn/T/", - "unsafe_perm": "true", + "tmp": "/Users/jfolsom/tmp", + "unsafe_perm": "", "link": "", "prefix": "/usr/local" } diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/package.json b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/package.json index 3495bc2..c832fb8 100644 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/package.json +++ b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/package.json @@ -47,8 +47,5 @@ ], "readme": "A JS/C++ Bson parser for node, used in the MongoDB Native driver", "_id": "bson@0.1.8", - "dist": { - "shasum": "3871c63fe917b0c82cc62488b3675bac2ffc15de" - }, "_from": "bson@0.1.8" } diff --git a/node_modules/mongoose/node_modules/mongodb/package.json b/node_modules/mongoose/node_modules/mongodb/package.json index f280267..84deb0f 100755 --- a/node_modules/mongoose/node_modules/mongodb/package.json +++ b/node_modules/mongoose/node_modules/mongodb/package.json @@ -7,7 +7,7 @@ "driver", "db" ], - "version": "1.2.13", + "version": "1.2.14", "author": { "name": "Christian Amor Kvalheim", "email": "christkv@gmail.com" @@ -190,7 +190,9 @@ "markdown": "0.3.1", "gleak": "0.2.3", "step": "0.0.5", - "async": "0.1.22" + "async": "0.1.22", + "integra": "0.0.1", + "optimist": "latest" }, "config": { "native": false @@ -204,7 +206,7 @@ "node": ">=0.6.19" }, "scripts": { - "test": "make test_pure" + "test": "make test_functional" }, "licenses": [ { @@ -213,9 +215,6 @@ } ], "readme": "Up to date documentation\n========================\n\n[Documentation](http://mongodb.github.com/node-mongodb-native/)\n\nInstall\n=======\n\nTo install the most recent release from npm, run:\n\n npm install mongodb\n\nThat may give you a warning telling you that bugs['web'] should be bugs['url'], it would be safe to ignore it (this has been fixed in the development version)\n\nTo install the latest from the repository, run::\n\n npm install path/to/node-mongodb-native\n\nCommunity\n=========\nCheck out the google group [node-mongodb-native](http://groups.google.com/group/node-mongodb-native) for questions/answers from users of the driver.\n\nTry it live\n============\n\n\nIntroduction\n============\n\nThis is a node.js driver for MongoDB. It's a port (or close to a port) of the library for ruby at http://github.com/mongodb/mongo-ruby-driver/.\n\nA simple example of inserting a document.\n\n```javascript\n var client = new Db('test', new Server(\"127.0.0.1\", 27017, {}), {w: 1}),\n test = function (err, collection) {\n collection.insert({a:2}, function(err, docs) {\n\n collection.count(function(err, count) {\n test.assertEquals(1, count);\n });\n\n // Locate all the entries using find\n collection.find().toArray(function(err, results) {\n test.assertEquals(1, results.length);\n test.assertTrue(results[0].a === 2);\n\n // Let's close the db\n client.close();\n });\n });\n };\n\n client.open(function(err, p_client) {\n client.collection('test_insert', test);\n });\n```\n\nData types\n==========\n\nTo store and retrieve the non-JSON MongoDb primitives ([ObjectID](http://www.mongodb.org/display/DOCS/Object+IDs), Long, Binary, [Timestamp](http://www.mongodb.org/display/DOCS/Timestamp+data+type), [DBRef](http://www.mongodb.org/display/DOCS/Database+References#DatabaseReferences-DBRef), Code).\n\nIn particular, every document has a unique `_id` which can be almost any type, and by default a 12-byte ObjectID is created. ObjectIDs can be represented as 24-digit hexadecimal strings, but you must convert the string back into an ObjectID before you can use it in the database. For example:\n\n```javascript\n // Get the objectID type\n var ObjectID = require('mongodb').ObjectID;\n\n var idString = '4e4e1638c85e808431000003';\n collection.findOne({_id: new ObjectID(idString)}, console.log) // ok\n collection.findOne({_id: idString}, console.log) // wrong! callback gets undefined\n```\n\nHere are the constructors the non-Javascript BSON primitive types:\n\n```javascript\n // Fetch the library\n var mongo = require('mongodb');\n // Create new instances of BSON types\n new mongo.Long(numberString)\n new mongo.ObjectID(hexString)\n new mongo.Timestamp() // the actual unique number is generated on insert.\n new mongo.DBRef(collectionName, id, dbName)\n new mongo.Binary(buffer) // takes a string or Buffer\n new mongo.Code(code, [context])\n new mongo.Symbol(string)\n new mongo.MinKey()\n new mongo.MaxKey()\n new mongo.Double(number)\t// Force double storage\n```\n\nThe C/C++ bson parser/serializer\n--------------------------------\n\nIf you are running a version of this library has the C/C++ parser compiled, to enable the driver to use the C/C++ bson parser pass it the option native_parser:true like below\n\n```javascript\n // using native_parser:\n var client = new Db('integration_tests_20',\n new Server(\"127.0.0.1\", 27017),\n {native_parser:true});\n```\n\nThe C++ parser uses the js objects both for serialization and deserialization.\n\nGitHub information\n==================\n\nThe source code is available at http://github.com/mongodb/node-mongodb-native.\nYou can either clone the repository or download a tarball of the latest release.\n\nOnce you have the source you can test the driver by running\n\n $ make test\n\nin the main directory. You will need to have a mongo instance running on localhost for the integration tests to pass.\n\nExamples\n========\n\nFor examples look in the examples/ directory. You can execute the examples using node.\n\n $ cd examples\n $ node queries.js\n\nGridStore\n=========\n\nThe GridStore class allows for storage of binary files in mongoDB using the mongoDB defined files and chunks collection definition.\n\nFor more information have a look at [Gridstore](https://github.com/mongodb/node-mongodb-native/blob/master/docs/gridfs.md)\n\nReplicasets\n===========\nFor more information about how to connect to a replicaset have a look at [Replicasets](https://github.com/mongodb/node-mongodb-native/blob/master/docs/replicaset.md)\n\nPrimary Key Factories\n---------------------\n\nDefining your own primary key factory allows you to generate your own series of id's\n(this could f.ex be to use something like ISBN numbers). The generated the id needs to be a 12 byte long \"string\".\n\nSimple example below\n\n```javascript\n // Custom factory (need to provide a 12 byte array);\n CustomPKFactory = function() {}\n CustomPKFactory.prototype = new Object();\n CustomPKFactory.createPk = function() {\n return new ObjectID(\"aaaaaaaaaaaa\");\n }\n\n var p_client = new Db('integration_tests_20', new Server(\"127.0.0.1\", 27017, {}), {'pk':CustomPKFactory});\n p_client.open(function(err, p_client) {\n p_client.dropDatabase(function(err, done) {\n p_client.createCollection('test_custom_key', function(err, collection) {\n collection.insert({'a':1}, function(err, docs) {\n collection.find({'_id':new ObjectID(\"aaaaaaaaaaaa\")}, function(err, cursor) {\n cursor.toArray(function(err, items) {\n test.assertEquals(1, items.length);\n\n // Let's close the db\n p_client.close();\n });\n });\n });\n });\n });\n });\n```\n\nStrict mode\n-----------\n\nEach database has an optional strict mode. If it is set then asking for a collection\nthat does not exist will return an Error object in the callback. Similarly if you\nattempt to create a collection that already exists. Strict is provided for convenience.\n\n```javascript\n var error_client = new Db('integration_tests_', new Server(\"127.0.0.1\", 27017, {auto_reconnect: false}), {strict:true});\n test.assertEquals(true, error_client.strict);\n\n error_client.open(function(err, error_client) {\n error_client.collection('does-not-exist', function(err, collection) {\n test.assertTrue(err instanceof Error);\n test.assertEquals(\"Collection does-not-exist does not exist. Currently in strict mode.\", err.message);\n });\n\n error_client.createCollection('test_strict_access_collection', function(err, collection) {\n error_client.collection('test_strict_access_collection', function(err, collection) {\n test.assertTrue(collection instanceof Collection);\n // Let's close the db\n error_client.close();\n });\n });\n });\n```\n\nDocumentation\n=============\n\nIf this document doesn't answer your questions, see the source of\n[Collection](https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/collection.js)\nor [Cursor](https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/cursor.js),\nor the documentation at MongoDB for query and update formats.\n\nFind\n----\n\nThe find method is actually a factory method to create\nCursor objects. A Cursor lazily uses the connection the first time\nyou call `nextObject`, `each`, or `toArray`.\n\nThe basic operation on a cursor is the `nextObject` method\nthat fetches the next matching document from the database. The convenience\nmethods `each` and `toArray` call `nextObject` until the cursor is exhausted.\n\nSignatures:\n\n```javascript\n var cursor = collection.find(query, [fields], options);\n cursor.sort(fields).limit(n).skip(m).\n\n cursor.nextObject(function(err, doc) {});\n cursor.each(function(err, doc) {});\n cursor.toArray(function(err, docs) {});\n\n cursor.rewind() // reset the cursor to its initial state.\n```\n\nUseful chainable methods of cursor. These can optionally be options of `find` instead of method calls:\n\n* `.limit(n).skip(m)` to control paging.\n* `.sort(fields)` Order by the given fields. There are several equivalent syntaxes:\n * `.sort({field1: -1, field2: 1})` descending by field1, then ascending by field2.\n * `.sort([['field1', 'desc'], ['field2', 'asc']])` same as above\n * `.sort([['field1', 'desc'], 'field2'])` same as above\n * `.sort('field1')` ascending by field1\n\nOther options of `find`:\n\n* `fields` the fields to fetch (to avoid transferring the entire document)\n* `tailable` if true, makes the cursor [tailable](http://www.mongodb.org/display/DOCS/Tailable+Cursors).\n* `batchSize` The number of the subset of results to request the database\nto return for every request. This should initially be greater than 1 otherwise\nthe database will automatically close the cursor. The batch size can be set to 1\nwith `batchSize(n, function(err){})` after performing the initial query to the database.\n* `hint` See [Optimization: hint](http://www.mongodb.org/display/DOCS/Optimization#Optimization-Hint).\n* `explain` turns this into an explain query. You can also call\n`explain()` on any cursor to fetch the explanation.\n* `snapshot` prevents documents that are updated while the query is active\nfrom being returned multiple times. See more\n[details about query snapshots](http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database).\n* `timeout` if false, asks MongoDb not to time out this cursor after an\ninactivity period.\n\n\nFor information on how to create queries, see the\n[MongoDB section on querying](http://www.mongodb.org/display/DOCS/Querying).\n\n```javascript\n var mongodb = require('mongodb');\n var server = new mongodb.Server(\"127.0.0.1\", 27017, {});\n new mongodb.Db('test', server, {}).open(function (error, client) {\n if (error) throw error;\n var collection = new mongodb.Collection(client, 'test_collection');\n collection.find({}, {limit:10}).toArray(function(err, docs) {\n console.dir(docs);\n });\n });\n```\n\nInsert\n------\n\nSignature:\n\n```javascript\n collection.insert(docs, options, [callback]);\n```\n\nwhere `docs` can be a single document or an array of documents.\n\nUseful options:\n\n* `safe:true` Should always set if you have a callback.\n\nSee also: [MongoDB docs for insert](http://www.mongodb.org/display/DOCS/Inserting).\n\n```javascript\n var mongodb = require('mongodb');\n var server = new mongodb.Server(\"127.0.0.1\", 27017, {});\n new mongodb.Db('test', server, {w: 1}).open(function (error, client) {\n if (error) throw error;\n var collection = new mongodb.Collection(client, 'test_collection');\n collection.insert({hello: 'world'}, {safe:true},\n function(err, objects) {\n if (err) console.warn(err.message);\n if (err && err.message.indexOf('E11000 ') !== -1) {\n // this _id was already inserted in the database\n }\n });\n });\n```\n\nNote that there's no reason to pass a callback to the insert or update commands\nunless you use the `safe:true` option. If you don't specify `safe:true`, then\nyour callback will be called immediately.\n\nUpdate; update and insert (upsert)\n----------------------------------\n\nThe update operation will update the first document that matches your query\n(or all documents that match if you use `multi:true`).\nIf `safe:true`, `upsert` is not set, and no documents match, your callback will return 0 documents updated.\n\nSee the [MongoDB docs](http://www.mongodb.org/display/DOCS/Updating) for\nthe modifier (`$inc`, `$set`, `$push`, etc.) formats.\n\nSignature:\n\n```javascript\n collection.update(criteria, objNew, options, [callback]);\n```\n\nUseful options:\n\n* `safe:true` Should always set if you have a callback.\n* `multi:true` If set, all matching documents are updated, not just the first.\n* `upsert:true` Atomically inserts the document if no documents matched.\n\nExample for `update`:\n\n```javascript\n var mongodb = require('mongodb');\n var server = new mongodb.Server(\"127.0.0.1\", 27017, {});\n new mongodb.Db('test', server, {w: 1}).open(function (error, client) {\n if (error) throw error;\n var collection = new mongodb.Collection(client, 'test_collection');\n collection.update({hi: 'here'}, {$set: {hi: 'there'}}, {safe:true},\n function(err) {\n if (err) console.warn(err.message);\n else console.log('successfully updated');\n });\n });\n```\n\nFind and modify\n---------------\n\n`findAndModify` is like `update`, but it also gives the updated document to\nyour callback. But there are a few key differences between findAndModify and\nupdate:\n\n 1. The signatures differ.\n 2. You can only findAndModify a single item, not multiple items.\n\nSignature:\n\n```javascript\n collection.findAndModify(query, sort, update, options, callback)\n```\n\nThe sort parameter is used to specify which object to operate on, if more than\none document matches. It takes the same format as the cursor sort (see\nConnection.find above).\n\nSee the\n[MongoDB docs for findAndModify](http://www.mongodb.org/display/DOCS/findAndModify+Command)\nfor more details.\n\nUseful options:\n\n* `remove:true` set to a true to remove the object before returning\n* `new:true` set to true if you want to return the modified object rather than the original. Ignored for remove.\n* `upsert:true` Atomically inserts the document if no documents matched.\n\nExample for `findAndModify`:\n\n```javascript\n var mongodb = require('mongodb');\n var server = new mongodb.Server(\"127.0.0.1\", 27017, {});\n new mongodb.Db('test', server, {w: 1}).open(function (error, client) {\n if (error) throw error;\n var collection = new mongodb.Collection(client, 'test_collection');\n collection.findAndModify({hello: 'world'}, [['_id','asc']], {$set: {hi: 'there'}}, {},\n function(err, object) {\n if (err) console.warn(err.message);\n else console.dir(object); // undefined if no matching object exists.\n });\n });\n```\n\nSave\n----\n\nThe `save` method is a shorthand for upsert if the document contains an\n`_id`, or an insert if there is no `_id`.\n\nSponsors\n========\nJust as Felix Geisendörfer I'm also working on the driver for my own startup and this driver is a big project that also benefits other companies who are using MongoDB.\n\nIf your company could benefit from a even better-engineered node.js mongodb driver I would appreciate any type of sponsorship you may be able to provide. All the sponsors will get a lifetime display in this readme, priority support and help on problems and votes on the roadmap decisions for the driver. If you are interested contact me on [christkv AT g m a i l.com](mailto:christkv@gmail.com) for details.\n\nAnd I'm very thankful for code contributions. If you are interested in working on features please contact me so we can discuss API design and testing.\n\nRelease Notes\n=============\n\nSee HISTORY\n\nCredits\n=======\n\n1. [10gen](http://github.com/mongodb/mongo-ruby-driver/)\n2. [Google Closure Library](http://code.google.com/closure/library/)\n3. [Jonas Raoni Soares Silva](http://jsfromhell.com/classes/binary-parser)\n\nContributors\n============\n\nAaron Heckmann, Christoph Pojer, Pau Ramon Revilla, Nathan White, Emmerman, Seth LaForge, Boris Filipov, Stefan Schärmeli, Tedde Lundgren, renctan, Sergey Ukustov, Ciaran Jessup, kuno, srimonti, Erik Abele, Pratik Daga, Slobodan Utvic, Kristina Chodorow, Yonathan Randolph, Brian Noguchi, Sam Epstein, James Harrison Fisher, Vladimir Dronnikov, Ben Hockey, Henrik Johansson, Simon Weare, Alex Gorbatchev, Shimon Doodkin, Kyle Mueller, Eran Hammer-Lahav, Marcin Ciszak, François de Metz, Vinay Pulim, nstielau, Adam Wiggins, entrinzikyl, Jeremy Selier, Ian Millington, Public Keating, andrewjstone, Christopher Stott, Corey Jewett, brettkiefer, Rob Holland, Senmiao Liu, heroic, gitfy\n\nLicense\n=======\n\n Copyright 2009 - 2012 Christian Amor Kvalheim.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n", - "_id": "mongodb@1.2.13", - "dist": { - "shasum": "582c87e7fa570e6841c3bb4634f732ba100718ba" - }, - "_from": "mongodb@1.2.13" + "_id": "mongodb@1.2.14", + "_from": "mongodb@1.2.14" } diff --git a/node_modules/express/node_modules/mkdirp/.gitignore.orig b/node_modules/mongoose/node_modules/mpath/.npmignore similarity index 51% rename from node_modules/express/node_modules/mkdirp/.gitignore.orig rename to node_modules/mongoose/node_modules/mpath/.npmignore index 9303c34..be106ca 100644 --- a/node_modules/express/node_modules/mkdirp/.gitignore.orig +++ b/node_modules/mongoose/node_modules/mpath/.npmignore @@ -1,2 +1,2 @@ +*.sw* node_modules/ -npm-debug.log \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mpath/.travis.yml b/node_modules/mongoose/node_modules/mpath/.travis.yml new file mode 100644 index 0000000..09c230f --- /dev/null +++ b/node_modules/mongoose/node_modules/mpath/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - 0.6 + - 0.8 diff --git a/node_modules/mongoose/node_modules/mpath/History.md b/node_modules/mongoose/node_modules/mpath/History.md new file mode 100644 index 0000000..4fbf338 --- /dev/null +++ b/node_modules/mongoose/node_modules/mpath/History.md @@ -0,0 +1,16 @@ + +0.1.1 / 2012-12-21 +================== + + * added; map support + +0.1.0 / 2012-12-13 +================== + + * added; set('array.property', val, object) support + * added; get('array.property', object) support + +0.0.1 / 2012-11-03 +================== + + * initial release diff --git a/node_modules/mongoose/node_modules/mpath/LICENSE b/node_modules/mongoose/node_modules/mpath/LICENSE new file mode 100644 index 0000000..38c529d --- /dev/null +++ b/node_modules/mongoose/node_modules/mpath/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2012 [Aaron Heckmann](aaron.heckmann+github@gmail.com) + +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. diff --git a/node_modules/mongoose/node_modules/mpath/Makefile b/node_modules/mongoose/node_modules/mpath/Makefile new file mode 100644 index 0000000..b0bb081 --- /dev/null +++ b/node_modules/mongoose/node_modules/mpath/Makefile @@ -0,0 +1,5 @@ + +test: + @node_modules/mocha/bin/mocha -A $(T) + +.PHONY: test diff --git a/node_modules/mongoose/node_modules/mpath/README.md b/node_modules/mongoose/node_modules/mpath/README.md new file mode 100644 index 0000000..9831dd0 --- /dev/null +++ b/node_modules/mongoose/node_modules/mpath/README.md @@ -0,0 +1,278 @@ +#mpath + +{G,S}et javascript object values using MongoDB-like path notation. + +###Getting + +```js +var mpath = require('mpath'); + +var obj = { + comments: [ + { title: 'funny' }, + { title: 'exciting!' } + ] +} + +mpath.get('comments.1.title', obj) // 'exciting!' +``` + +`mpath.get` supports array property notation as well. + +```js +var obj = { + comments: [ + { title: 'funny' }, + { title: 'exciting!' } + ] +} + +mpath.get('comments.title', obj) // ['funny', 'exciting!'] +``` + +Array property and indexing syntax, when used together, are very powerful. + +```js +var obj = { + array: [ + { o: { array: [{x: {b: [4,6,8]}}, { y: 10} ] }} + , { o: { array: [{x: {b: [1,2,3]}}, { x: {z: 10 }}, { x: 'Turkey Day' }] }} + , { o: { array: [{x: {b: null }}, { x: { b: [null, 1]}}] }} + , { o: { array: [{x: null }] }} + , { o: { array: [{y: 3 }] }} + , { o: { array: [3, 0, null] }} + , { o: { name: 'ha' }} + ]; +} + +var found = mpath.get('array.o.array.x.b.1', obj); + +console.log(found); // prints.. + + [ [6, undefined] + , [2, undefined, undefined] + , [null, 1] + , [null] + , [undefined] + , [undefined, undefined, undefined] + , undefined + ] + +``` + +#####Field selection rules: + +The following rules are iteratively applied to each `segment` in the passed `path`. For example: + +```js +var path = 'one.two.14'; // path +'one' // segment 0 +'two' // segment 1 +14 // segment 2 +``` + +- 1) when value of the segment parent is not an array, return the value of `parent.segment` +- 2) when value of the segment parent is an array + - a) if the segment is an integer, replace the parent array with the value at `parent[segment]` + - b) if not an integer, keep the array but replace each array `item` with the value returned from calling `get(remainingSegments, item)` or undefined if falsey. + +#####Maps + +`mpath.get` also accepts an optional `map` argument which receives each individual found value. The value returned from the `map` function will be used in the original found values place. + +```js +var obj = { + comments: [ + { title: 'funny' }, + { title: 'exciting!' } + ] +} + +mpath.get('comments.title', obj, function (val) { + return 'funny' == val + ? 'amusing' + : val; +}); +// ['amusing', 'exciting!'] +``` + +###Setting + +```js +var obj = { + comments: [ + { title: 'funny' }, + { title: 'exciting!' } + ] +} + +mpath.set('comments.1.title', 'hilarious', obj) +console.log(obj.comments[1].title) // 'hilarious' +``` + +`mpath.set` supports the same array property notation as `mpath.get`. + +```js +var obj = { + comments: [ + { title: 'funny' }, + { title: 'exciting!' } + ] +} + +mpath.set('comments.title', ['hilarious', 'fruity'], obj); + +console.log(obj); // prints.. + + { comments: [ + { title: 'hilarious' }, + { title: 'fruity' } + ]} +``` + +Array property and indexing syntax can be used together also when setting. + +```js +var obj = { + array: [ + { o: { array: [{x: {b: [4,6,8]}}, { y: 10} ] }} + , { o: { array: [{x: {b: [1,2,3]}}, { x: {z: 10 }}, { x: 'Turkey Day' }] }} + , { o: { array: [{x: {b: null }}, { x: { b: [null, 1]}}] }} + , { o: { array: [{x: null }] }} + , { o: { array: [{y: 3 }] }} + , { o: { array: [3, 0, null] }} + , { o: { name: 'ha' }} + ] +} + +mpath.set('array.1.o', 'this was changed', obj); + +console.log(require('util').inspect(obj, false, 1000)); // prints.. + +{ + array: [ + { o: { array: [{x: {b: [4,6,8]}}, { y: 10} ] }} + , { o: 'this was changed' } + , { o: { array: [{x: {b: null }}, { x: { b: [null, 1]}}] }} + , { o: { array: [{x: null }] }} + , { o: { array: [{y: 3 }] }} + , { o: { array: [3, 0, null] }} + , { o: { name: 'ha' }} + ]; +} + +mpath.set('array.o.array.x', 'this was changed too', obj); + +console.log(require('util').inspect(obj, false, 1000)); // prints.. + +{ + array: [ + { o: { array: [{x: 'this was changed too'}, { y: 10, x: 'this was changed too'} ] }} + , { o: 'this was changed' } + , { o: { array: [{x: 'this was changed too'}, { x: 'this was changed too'}] }} + , { o: { array: [{x: 'this was changed too'}] }} + , { o: { array: [{x: 'this was changed too', y: 3 }] }} + , { o: { array: [3, 0, null] }} + , { o: { name: 'ha' }} + ]; +} +``` + +####Setting arrays + +By default, setting a property within an array to another array results in each element of the new array being set to the item in the destination array at the matching index. An example is helpful. + +```js +var obj = { + comments: [ + { title: 'funny' }, + { title: 'exciting!' } + ] +} + +mpath.set('comments.title', ['hilarious', 'fruity'], obj); + +console.log(obj); // prints.. + + { comments: [ + { title: 'hilarious' }, + { title: 'fruity' } + ]} +``` + +If we do not desire this destructuring-like assignment behavior we may instead specify the `$` operator in the path being set to force the array to be copied directly. + +```js +var obj = { + comments: [ + { title: 'funny' }, + { title: 'exciting!' } + ] +} + +mpath.set('comments.$.title', ['hilarious', 'fruity'], obj); + +console.log(obj); // prints.. + + { comments: [ + { title: ['hilarious', 'fruity'] }, + { title: ['hilarious', 'fruity'] } + ]} +``` + +####Field assignment rules + +The rules utilized mirror those used on `mpath.get`, meaning we can take values returned from `mpath.get`, update them, and reassign them using `mpath.set`. Note that setting nested arrays of arrays can get unweildy quickly. Check out the [tests](https://github.com/aheckmann/mpath/blob/master/test/index.js) for more extreme examples. + +#####Maps + +`mpath.set` also accepts an optional `map` argument which receives each individual value being set. The value returned from the `map` function will be used in the original values place. + +```js +var obj = { + comments: [ + { title: 'funny' }, + { title: 'exciting!' } + ] +} + +mpath.set('comments.title', ['hilarious', 'fruity'], obj, function (val) { + return val.length; +}); + +console.log(obj); // prints.. + + { comments: [ + { title: 9 }, + { title: 6 } + ]} +``` + +### Custom object types + +Sometimes you may want to enact the same functionality on custom object types that store all their real data internally, say for an ODM type object. No fear, `mpath` has you covered. Simply pass the name of the property being used to store the internal data and it will be traversed instead: + +```js +var mpath = require('mpath'); + +var obj = { + comments: [ + { title: 'exciting!', _doc: { title: 'great!' }} + ] +} + +mpath.get('comments.0.title', obj, '_doc') // 'great!' +mpath.set('comments.0.title', 'nov 3rd', obj, '_doc') +mpath.get('comments.0.title', obj, '_doc') // 'nov 3rd' +mpath.get('comments.0.title', obj) // 'exciting' +``` + +When used with a `map`, the `map` argument comes last. + +```js +mpath.get(path, obj, '_doc', map); +mpath.set(path, val, obj, '_doc', map); +``` + +[LICENSE](https://github.com/aheckmann/mpath/blob/master/LICENSE) + diff --git a/node_modules/mongoose/node_modules/mpath/index.js b/node_modules/mongoose/node_modules/mpath/index.js new file mode 100644 index 0000000..f7b65dd --- /dev/null +++ b/node_modules/mongoose/node_modules/mpath/index.js @@ -0,0 +1 @@ +module.exports = exports = require('./lib'); diff --git a/node_modules/mongoose/node_modules/mpath/lib/index.js b/node_modules/mongoose/node_modules/mpath/lib/index.js new file mode 100644 index 0000000..24e1e83 --- /dev/null +++ b/node_modules/mongoose/node_modules/mpath/lib/index.js @@ -0,0 +1,183 @@ + +/** + * Returns the value of object `o` at the given `path`. + * + * ####Example: + * + * var obj = { + * comments: [ + * { title: 'exciting!', _doc: { title: 'great!' }} + * , { title: 'number dos' } + * ] + * } + * + * mpath.get('comments.0.title', o) // 'exciting!' + * mpath.get('comments.0.title', o, '_doc') // 'great!' + * mpath.get('comments.title', o) // ['exciting!', 'number dos'] + * + * // summary + * mpath.get(path, o) + * mpath.get(path, o, special) + * mpath.get(path, o, map) + * mpath.get(path, o, special, map) + * + * @param {String} path + * @param {Object} o + * @param {String} [special] When this property name is present on any object in the path, walking will continue on the value of this property. + * @param {Function} [map] Optional function which receives each individual found value. The value returned from `map` is used in the original values place. + */ + +exports.get = function (path, o, special, map) { + if ('function' == typeof special) { + map = special; + special = undefined; + } + + map || (map = K); + + var parts = 'string' == typeof path + ? path.split('.') + : path + + if (!Array.isArray(parts)) { + throw new TypeError('Invalid `path`. Must be either string or array'); + } + + var obj = o + , part; + + for (var i = 0; i < parts.length; ++i) { + part = parts[i]; + + if (Array.isArray(obj) && !/^\d+$/.test(part)) { + // reading a property from the array items + var paths = parts.slice(i); + + return obj.map(function (item) { + return item + ? exports.get(paths, item, special, map) + : map(undefined); + }); + } + + obj = special && obj[special] + ? obj[special][part] + : obj[part]; + + if (!obj) return map(obj); + } + + return map(obj); +} + +/** + * Sets the `val` at the given `path` of object `o`. + * + * @param {String} path + * @param {Anything} val + * @param {Object} o + * @param {String} [special] When this property name is present on any object in the path, walking will continue on the value of this property. + * @param {Function} [map] Optional function which is passed each individual value before setting it. The value returned from `map` is used in the original values place. + + */ + +exports.set = function (path, val, o, special, map, _copying) { + if ('function' == typeof special) { + map = special; + special = undefined; + } + + map || (map = K); + + var parts = 'string' == typeof path + ? path.split('.') + : path + + if (!Array.isArray(parts)) { + throw new TypeError('Invalid `path`. Must be either string or array'); + } + + if (null == o) return; + + // the existance of $ in a path tells us if the user desires + // the copying of an array instead of setting each value of + // the array to the one by one to matching positions of the + // current array. + var copy = _copying || /\$/.test(path) + , obj = o + , part + + for (var i = 0, len = parts.length - 1; i < len; ++i) { + part = parts[i]; + + if ('$' == part) { + if (i == len - 1) { + break; + } else { + continue; + } + } + + if (Array.isArray(obj) && !/^\d+$/.test(part)) { + var paths = parts.slice(i); + if (!copy && Array.isArray(val)) { + for (var j = 0; j < obj.length && j < val.length; ++j) { + // assignment of single values of array + exports.set(paths, val[j], obj[j], special, map, copy); + } + } else { + for (var j = 0; j < obj.length; ++j) { + // assignment of entire value + exports.set(paths, val, obj[j], special, map, copy); + } + } + return; + } + + obj = special && obj[special] + ? obj[special][part] + : obj[part]; + + if (!obj) return; + } + + // process the last property of the path + + part = parts[len]; + + // use the special property if exists + if (special && obj[special]) { + obj = obj[special]; + } + + // set the value on the last branch + if (Array.isArray(obj) && !/^\d+$/.test(part)) { + if (!copy && Array.isArray(val)) { + for (var item, j = 0; j < obj.length && j < val.length; ++j) { + item = obj[j]; + if (item) { + if (item[special]) item = item[special]; + item[part] = map(val[j]); + } + } + } else { + for (var j = 0; j < obj.length; ++j) { + item = obj[j]; + if (item) { + if (item[special]) item = item[special]; + item[part] = map(val); + } + } + } + } else { + obj[part] = map(val); + } +} + +/*! + * Returns the value passed to it. + */ + +function K (v) { + return v; +} diff --git a/node_modules/mongoose/node_modules/mpath/package.json b/node_modules/mongoose/node_modules/mpath/package.json new file mode 100644 index 0000000..5f86d07 --- /dev/null +++ b/node_modules/mongoose/node_modules/mpath/package.json @@ -0,0 +1,30 @@ +{ + "name": "mpath", + "version": "0.1.1", + "description": "{G,S}et object values using MongoDB path notation", + "main": "index.js", + "scripts": { + "test": "make test" + }, + "repository": { + "type": "git", + "url": "git://github.com/aheckmann/mpath.git" + }, + "keywords": [ + "mongodb", + "path", + "get", + "set" + ], + "author": { + "name": "Aaron Heckmann", + "email": "aaron.heckmann+github@gmail.com" + }, + "license": "MIT", + "devDependencies": { + "mocha": "1.6.0" + }, + "readme": "#mpath\n\n{G,S}et javascript object values using MongoDB-like path notation.\n\n###Getting\n\n```js\nvar mpath = require('mpath');\n\nvar obj = {\n comments: [\n { title: 'funny' },\n { title: 'exciting!' }\n ]\n}\n\nmpath.get('comments.1.title', obj) // 'exciting!'\n```\n\n`mpath.get` supports array property notation as well.\n\n```js\nvar obj = {\n comments: [\n { title: 'funny' },\n { title: 'exciting!' }\n ]\n}\n\nmpath.get('comments.title', obj) // ['funny', 'exciting!']\n```\n\nArray property and indexing syntax, when used together, are very powerful.\n\n```js\nvar obj = {\n array: [\n { o: { array: [{x: {b: [4,6,8]}}, { y: 10} ] }}\n , { o: { array: [{x: {b: [1,2,3]}}, { x: {z: 10 }}, { x: 'Turkey Day' }] }}\n , { o: { array: [{x: {b: null }}, { x: { b: [null, 1]}}] }}\n , { o: { array: [{x: null }] }}\n , { o: { array: [{y: 3 }] }}\n , { o: { array: [3, 0, null] }}\n , { o: { name: 'ha' }}\n ];\n}\n\nvar found = mpath.get('array.o.array.x.b.1', obj);\n\nconsole.log(found); // prints..\n\n [ [6, undefined]\n , [2, undefined, undefined]\n , [null, 1]\n , [null]\n , [undefined]\n , [undefined, undefined, undefined]\n , undefined\n ]\n\n```\n\n#####Field selection rules:\n\nThe following rules are iteratively applied to each `segment` in the passed `path`. For example:\n\n```js\nvar path = 'one.two.14'; // path\n'one' // segment 0\n'two' // segment 1\n14 // segment 2\n```\n\n- 1) when value of the segment parent is not an array, return the value of `parent.segment`\n- 2) when value of the segment parent is an array\n - a) if the segment is an integer, replace the parent array with the value at `parent[segment]`\n - b) if not an integer, keep the array but replace each array `item` with the value returned from calling `get(remainingSegments, item)` or undefined if falsey.\n\n#####Maps\n\n`mpath.get` also accepts an optional `map` argument which receives each individual found value. The value returned from the `map` function will be used in the original found values place.\n\n```js\nvar obj = {\n comments: [\n { title: 'funny' },\n { title: 'exciting!' }\n ]\n}\n\nmpath.get('comments.title', obj, function (val) {\n return 'funny' == val\n ? 'amusing'\n : val;\n});\n// ['amusing', 'exciting!']\n```\n\n###Setting\n\n```js\nvar obj = {\n comments: [\n { title: 'funny' },\n { title: 'exciting!' }\n ]\n}\n\nmpath.set('comments.1.title', 'hilarious', obj)\nconsole.log(obj.comments[1].title) // 'hilarious'\n```\n\n`mpath.set` supports the same array property notation as `mpath.get`.\n\n```js\nvar obj = {\n comments: [\n { title: 'funny' },\n { title: 'exciting!' }\n ]\n}\n\nmpath.set('comments.title', ['hilarious', 'fruity'], obj);\n\nconsole.log(obj); // prints..\n\n { comments: [\n { title: 'hilarious' },\n { title: 'fruity' }\n ]}\n```\n\nArray property and indexing syntax can be used together also when setting.\n\n```js\nvar obj = {\n array: [\n { o: { array: [{x: {b: [4,6,8]}}, { y: 10} ] }}\n , { o: { array: [{x: {b: [1,2,3]}}, { x: {z: 10 }}, { x: 'Turkey Day' }] }}\n , { o: { array: [{x: {b: null }}, { x: { b: [null, 1]}}] }}\n , { o: { array: [{x: null }] }}\n , { o: { array: [{y: 3 }] }}\n , { o: { array: [3, 0, null] }}\n , { o: { name: 'ha' }}\n ]\n}\n\nmpath.set('array.1.o', 'this was changed', obj);\n\nconsole.log(require('util').inspect(obj, false, 1000)); // prints..\n\n{\n array: [\n { o: { array: [{x: {b: [4,6,8]}}, { y: 10} ] }}\n , { o: 'this was changed' }\n , { o: { array: [{x: {b: null }}, { x: { b: [null, 1]}}] }}\n , { o: { array: [{x: null }] }}\n , { o: { array: [{y: 3 }] }}\n , { o: { array: [3, 0, null] }}\n , { o: { name: 'ha' }}\n ];\n}\n\nmpath.set('array.o.array.x', 'this was changed too', obj);\n\nconsole.log(require('util').inspect(obj, false, 1000)); // prints..\n\n{\n array: [\n { o: { array: [{x: 'this was changed too'}, { y: 10, x: 'this was changed too'} ] }}\n , { o: 'this was changed' }\n , { o: { array: [{x: 'this was changed too'}, { x: 'this was changed too'}] }}\n , { o: { array: [{x: 'this was changed too'}] }}\n , { o: { array: [{x: 'this was changed too', y: 3 }] }}\n , { o: { array: [3, 0, null] }}\n , { o: { name: 'ha' }}\n ];\n}\n```\n\n####Setting arrays\n\nBy default, setting a property within an array to another array results in each element of the new array being set to the item in the destination array at the matching index. An example is helpful.\n\n```js\nvar obj = {\n comments: [\n { title: 'funny' },\n { title: 'exciting!' }\n ]\n}\n\nmpath.set('comments.title', ['hilarious', 'fruity'], obj);\n\nconsole.log(obj); // prints..\n\n { comments: [\n { title: 'hilarious' },\n { title: 'fruity' }\n ]}\n```\n\nIf we do not desire this destructuring-like assignment behavior we may instead specify the `$` operator in the path being set to force the array to be copied directly.\n\n```js\nvar obj = {\n comments: [\n { title: 'funny' },\n { title: 'exciting!' }\n ]\n}\n\nmpath.set('comments.$.title', ['hilarious', 'fruity'], obj);\n\nconsole.log(obj); // prints..\n\n { comments: [\n { title: ['hilarious', 'fruity'] },\n { title: ['hilarious', 'fruity'] }\n ]}\n```\n\n####Field assignment rules\n\nThe rules utilized mirror those used on `mpath.get`, meaning we can take values returned from `mpath.get`, update them, and reassign them using `mpath.set`. Note that setting nested arrays of arrays can get unweildy quickly. Check out the [tests](https://github.com/aheckmann/mpath/blob/master/test/index.js) for more extreme examples.\n\n#####Maps\n\n`mpath.set` also accepts an optional `map` argument which receives each individual value being set. The value returned from the `map` function will be used in the original values place.\n\n```js\nvar obj = {\n comments: [\n { title: 'funny' },\n { title: 'exciting!' }\n ]\n}\n\nmpath.set('comments.title', ['hilarious', 'fruity'], obj, function (val) {\n return val.length;\n});\n\nconsole.log(obj); // prints..\n\n { comments: [\n { title: 9 },\n { title: 6 }\n ]}\n```\n\n### Custom object types\n\nSometimes you may want to enact the same functionality on custom object types that store all their real data internally, say for an ODM type object. No fear, `mpath` has you covered. Simply pass the name of the property being used to store the internal data and it will be traversed instead:\n\n```js\nvar mpath = require('mpath');\n\nvar obj = {\n comments: [\n { title: 'exciting!', _doc: { title: 'great!' }}\n ]\n}\n\nmpath.get('comments.0.title', obj, '_doc') // 'great!'\nmpath.set('comments.0.title', 'nov 3rd', obj, '_doc')\nmpath.get('comments.0.title', obj, '_doc') // 'nov 3rd'\nmpath.get('comments.0.title', obj) // 'exciting'\n```\n\nWhen used with a `map`, the `map` argument comes last.\n\n```js\nmpath.get(path, obj, '_doc', map);\nmpath.set(path, val, obj, '_doc', map);\n```\n\n[LICENSE](https://github.com/aheckmann/mpath/blob/master/LICENSE)\n\n", + "_id": "mpath@0.1.1", + "_from": "mpath@0.1.1" +} diff --git a/node_modules/mongoose/node_modules/mpath/test/index.js b/node_modules/mongoose/node_modules/mpath/test/index.js new file mode 100644 index 0000000..98e119a --- /dev/null +++ b/node_modules/mongoose/node_modules/mpath/test/index.js @@ -0,0 +1,1630 @@ + +/** + * Test dependencies. + */ + +var mpath = require('../') +var assert = require('assert') + +/** + * logging helper + */ + +function log (o) { + console.log(); + console.log(require('util').inspect(o, false, 1000)); +} + +/** + * special path for override tests + */ + +var special = '_doc'; + +/** + * Tests + */ + +describe('mpath', function(){ + + /** + * test doc creator + */ + + function doc () { + var o = { first: { second: { third: [3,{ name: 'aaron' }, 9] }}}; + o.comments = [ + { name: 'one' } + , { name: 'two', _doc: { name: '2' }} + , { name: 'three' + , comments: [{},{ comments: [{val: 'twoo'}]}] + , _doc: { name: '3', comments: [{},{ _doc: { comments: [{ val: 2 }] }}] }} + ]; + o.name = 'jiro'; + o.array = [ + { o: { array: [{x: {b: [4,6,8]}}, { y: 10} ] }} + , { o: { array: [{x: {b: [1,2,3]}}, { x: {z: 10 }}, { x: {b: 'hi'}}] }} + , { o: { array: [{x: {b: null }}, { x: { b: [null, 1]}}] }} + , { o: { array: [{x: null }] }} + , { o: { array: [{y: 3 }] }} + , { o: { array: [3, 0, null] }} + , { o: { name: 'ha' }} + ]; + o.arr = [ + { arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } + , { yep: true } + ] + return o; + } + + describe('get', function(){ + var o = doc(); + + it('`path` must be a string or array', function(done){ + assert.throws(function () { + mpath.get({}, o); + }, /Must be either string or array/); + assert.throws(function () { + mpath.get(4, o); + }, /Must be either string or array/); + assert.throws(function () { + mpath.get(function(){}, o); + }, /Must be either string or array/); + assert.throws(function () { + mpath.get(/asdf/, o); + }, /Must be either string or array/); + assert.throws(function () { + mpath.get(Math, o); + }, /Must be either string or array/); + assert.throws(function () { + mpath.get(Buffer, o); + }, /Must be either string or array/); + assert.doesNotThrow(function () { + mpath.get('string', o); + }); + assert.doesNotThrow(function () { + mpath.get([], o); + }); + done(); + }) + + describe('without `special`', function(){ + it('works', function(done){ + assert.equal('jiro', mpath.get('name', o)); + + assert.deepEqual( + { second: { third: [3,{ name: 'aaron' }, 9] }} + , mpath.get('first', o) + ); + + assert.deepEqual( + { third: [3,{ name: 'aaron' }, 9] } + , mpath.get('first.second', o) + ); + + assert.deepEqual( + [3,{ name: 'aaron' }, 9] + , mpath.get('first.second.third', o) + ); + + assert.deepEqual( + 3 + , mpath.get('first.second.third.0', o) + ); + + assert.deepEqual( + 9 + , mpath.get('first.second.third.2', o) + ); + + assert.deepEqual( + { name: 'aaron' } + , mpath.get('first.second.third.1', o) + ); + + assert.deepEqual( + 'aaron' + , mpath.get('first.second.third.1.name', o) + ); + + assert.deepEqual([ + { name: 'one' } + , { name: 'two', _doc: { name: '2' }} + , { name: 'three' + , comments: [{},{ comments: [{val: 'twoo'}]}] + , _doc: { name: '3', comments: [{},{ _doc: { comments: [{ val: 2 }] }}]}}], + mpath.get('comments', o)); + + assert.deepEqual({ name: 'one' }, mpath.get('comments.0', o)); + assert.deepEqual('one', mpath.get('comments.0.name', o)); + assert.deepEqual('two', mpath.get('comments.1.name', o)); + assert.deepEqual('three', mpath.get('comments.2.name', o)); + + assert.deepEqual([{},{ comments: [{val: 'twoo'}]}] + , mpath.get('comments.2.comments', o)); + + assert.deepEqual({ comments: [{val: 'twoo'}]} + , mpath.get('comments.2.comments.1', o)); + + assert.deepEqual('twoo', mpath.get('comments.2.comments.1.comments.0.val', o)); + + done(); + }) + + it('handles array.property dot-notation', function(done){ + assert.deepEqual( + ['one', 'two', 'three'] + , mpath.get('comments.name', o) + ); + done(); + }) + + it('handles array.array notation', function(done){ + assert.deepEqual( + [undefined, undefined, [{}, {comments:[{val:'twoo'}]}]] + , mpath.get('comments.comments', o) + ); + done(); + }) + + it('handles prop.prop.prop.arrayProperty notation', function(done){ + assert.deepEqual( + [undefined, 'aaron', undefined] + , mpath.get('first.second.third.name', o) + ); + assert.deepEqual( + [1, 'aaron', 1] + , mpath.get('first.second.third.name', o, function (v) { + return undefined === v ? 1 : v; + }) + ); + done(); + }) + + it('handles array.prop.array', function(done){ + assert.deepEqual( + [ [{x: {b: [4,6,8]}}, { y: 10} ] + , [{x: {b: [1,2,3]}}, { x: {z: 10 }}, { x: {b: 'hi'}}] + , [{x: {b: null }}, { x: { b: [null, 1]}}] + , [{x: null }] + , [{y: 3 }] + , [3, 0, null] + , undefined + ] + , mpath.get('array.o.array', o) + ); + done(); + }) + + it('handles array.prop.array.index', function(done){ + assert.deepEqual( + [ {x: {b: [4,6,8]}} + , {x: {b: [1,2,3]}} + , {x: {b: null }} + , {x: null } + , {y: 3 } + , 3 + , undefined + ] + , mpath.get('array.o.array.0', o) + ); + done(); + }) + + it('handles array.prop.array.index.prop', function(done){ + assert.deepEqual( + [ {b: [4,6,8]} + , {b: [1,2,3]} + , {b: null } + , null + , undefined + , undefined + , undefined + ] + , mpath.get('array.o.array.0.x', o) + ); + done(); + }) + + it('handles array.prop.array.prop', function(done){ + assert.deepEqual( + [ [undefined, 10 ] + , [undefined, undefined, undefined] + , [undefined, undefined] + , [undefined] + , [3] + , [undefined, undefined, undefined] + , undefined + ] + , mpath.get('array.o.array.y', o) + ); + assert.deepEqual( + [ [{b: [4,6,8]}, undefined] + , [{b: [1,2,3]}, {z: 10 }, {b: 'hi'}] + , [{b: null }, { b: [null, 1]}] + , [null] + , [undefined] + , [undefined, undefined, undefined] + , undefined + ] + , mpath.get('array.o.array.x', o) + ); + done(); + }) + + it('handles array.prop.array.prop.prop', function(done){ + assert.deepEqual( + [ [[4,6,8], undefined] + , [[1,2,3], undefined, 'hi'] + , [null, [null, 1]] + , [null] + , [undefined] + , [undefined, undefined, undefined] + , undefined + ] + , mpath.get('array.o.array.x.b', o) + ); + done(); + }) + + it('handles array.prop.array.prop.prop.index', function(done){ + assert.deepEqual( + [ [6, undefined] + , [2, undefined, 'i'] // undocumented feature (string indexing) + , [null, 1] + , [null] + , [undefined] + , [undefined, undefined, undefined] + , undefined + ] + , mpath.get('array.o.array.x.b.1', o) + ); + assert.deepEqual( + [ [6, 0] + , [2, 0, 'i'] // undocumented feature (string indexing) + , [null, 1] + , [null] + , [0] + , [0, 0, 0] + , 0 + ] + , mpath.get('array.o.array.x.b.1', o, function (v) { + return undefined === v ? 0 : v; + }) + ); + done(); + }) + + it('handles array.index.prop.prop', function(done){ + assert.deepEqual( + [{x: {b: [1,2,3]}}, { x: {z: 10 }}, { x: {b: 'hi'}}] + , mpath.get('array.1.o.array', o) + ); + assert.deepEqual( + ['hi','hi','hi'] + , mpath.get('array.1.o.array', o, function (v) { + if (Array.isArray(v)) { + return v.map(function (val) { + return 'hi'; + }) + } + return v; + }) + ); + done(); + }) + + it('handles array.array.index', function(done){ + assert.deepEqual( + [{ a: { c: 48 }}, undefined] + , mpath.get('arr.arr.1', o) + ); + assert.deepEqual( + ['woot', undefined] + , mpath.get('arr.arr.1', o, function (v) { + if (v && v.a && v.a.c) return 'woot'; + return v; + }) + ); + done(); + }) + + it('handles array.array.index.prop', function(done){ + assert.deepEqual( + [{ c: 48 }, 'woot'] + , mpath.get('arr.arr.1.a', o, function (v) { + if (undefined === v) return 'woot'; + return v; + }) + ); + assert.deepEqual( + [{ c: 48 }, undefined] + , mpath.get('arr.arr.1.a', o) + ); + mpath.set('arr.arr.1.a', [{c:49},undefined], o) + assert.deepEqual( + [{ c: 49 }, undefined] + , mpath.get('arr.arr.1.a', o) + ); + mpath.set('arr.arr.1.a', [{c:48},undefined], o) + done(); + }) + + it('handles array.array.index.prop.prop', function(done){ + assert.deepEqual( + [48, undefined] + , mpath.get('arr.arr.1.a.c', o) + ); + assert.deepEqual( + [48, 'woot'] + , mpath.get('arr.arr.1.a.c', o, function (v) { + if (undefined === v) return 'woot'; + return v; + }) + ); + done(); + }) + + }) + + describe('with `special`', function(){ + it('works', function(done){ + assert.equal('jiro', mpath.get('name', o, special)); + + assert.deepEqual( + { second: { third: [3,{ name: 'aaron' }, 9] }} + , mpath.get('first', o, special) + ); + + assert.deepEqual( + { third: [3,{ name: 'aaron' }, 9] } + , mpath.get('first.second', o, special) + ); + + assert.deepEqual( + [3,{ name: 'aaron' }, 9] + , mpath.get('first.second.third', o, special) + ); + + assert.deepEqual( + 3 + , mpath.get('first.second.third.0', o, special) + ); + + assert.deepEqual( + 4 + , mpath.get('first.second.third.0', o, special, function (v) { + return 3 === v ? 4 : v; + }) + ); + + assert.deepEqual( + 9 + , mpath.get('first.second.third.2', o, special) + ); + + assert.deepEqual( + { name: 'aaron' } + , mpath.get('first.second.third.1', o, special) + ); + + assert.deepEqual( + 'aaron' + , mpath.get('first.second.third.1.name', o, special) + ); + + assert.deepEqual([ + { name: 'one' } + , { name: 'two', _doc: { name: '2' }} + , { name: 'three' + , comments: [{},{ comments: [{val: 'twoo'}]}] + , _doc: { name: '3', comments: [{},{ _doc: { comments: [{ val: 2 }] }}]}}], + mpath.get('comments', o, special)); + + assert.deepEqual({ name: 'one' }, mpath.get('comments.0', o, special)); + assert.deepEqual('one', mpath.get('comments.0.name', o, special)); + assert.deepEqual('2', mpath.get('comments.1.name', o, special)); + assert.deepEqual('3', mpath.get('comments.2.name', o, special)); + assert.deepEqual('nice', mpath.get('comments.2.name', o, special, function (v) { + return '3' === v ? 'nice' : v; + })); + + assert.deepEqual([{},{ _doc: { comments: [{ val: 2 }] }}] + , mpath.get('comments.2.comments', o, special)); + + assert.deepEqual({ _doc: { comments: [{val: 2}]}} + , mpath.get('comments.2.comments.1', o, special)); + + assert.deepEqual(2, mpath.get('comments.2.comments.1.comments.0.val', o, special)); + done(); + }) + + it('handles array.property dot-notation', function(done){ + assert.deepEqual( + ['one', '2', '3'] + , mpath.get('comments.name', o, special) + ); + assert.deepEqual( + ['one', 2, '3'] + , mpath.get('comments.name', o, special, function (v) { + return '2' === v ? 2 : v + }) + ); + done(); + }) + + it('handles array.array notation', function(done){ + assert.deepEqual( + [undefined, undefined, [{}, {_doc: { comments:[{val:2}]}}]] + , mpath.get('comments.comments', o, special) + ); + done(); + }) + + it('handles array.array.index.array', function(done){ + assert.deepEqual( + [undefined, undefined, [{val:2}]] + , mpath.get('comments.comments.1.comments', o, special) + ); + done(); + }) + + it('handles array.array.index.array.prop', function(done){ + assert.deepEqual( + [undefined, undefined, [2]] + , mpath.get('comments.comments.1.comments.val', o, special) + ); + assert.deepEqual( + ['nil', 'nil', [2]] + , mpath.get('comments.comments.1.comments.val', o, special, function (v) { + return undefined === v ? 'nil' : v; + }) + ); + done(); + }) + }) + + }) + + describe('set', function(){ + describe('without `special`', function(){ + var o = doc(); + + it('works', function(done){ + mpath.set('name', 'a new val', o, function (v) { + return 'a new val' === v ? 'changed' : v; + }); + assert.deepEqual('changed', o.name); + + mpath.set('name', 'changed', o); + assert.deepEqual('changed', o.name); + + mpath.set('first.second.third', [1,{name:'x'},9], o); + assert.deepEqual([1,{name:'x'},9], o.first.second.third); + + mpath.set('first.second.third.1.name', 'y', o) + assert.deepEqual([1,{name:'y'},9], o.first.second.third); + + mpath.set('comments.1.name', 'ttwwoo', o); + assert.deepEqual({ name: 'ttwwoo', _doc: { name: '2' }}, o.comments[1]); + + mpath.set('comments.2.comments.1.comments.0.expand', 'added', o); + assert.deepEqual( + { val: 'twoo', expand: 'added'} + , o.comments[2].comments[1].comments[0]); + + mpath.set('comments.2.comments.1.comments.2', 'added', o); + assert.equal(3, o.comments[2].comments[1].comments.length); + assert.deepEqual( + { val: 'twoo', expand: 'added'} + , o.comments[2].comments[1].comments[0]); + assert.deepEqual( + undefined + , o.comments[2].comments[1].comments[1]); + assert.deepEqual( + 'added' + , o.comments[2].comments[1].comments[2]); + + done(); + }) + + describe('array.path', function(){ + describe('with single non-array value', function(){ + it('works', function(done){ + mpath.set('arr.yep', false, o, function (v) { + return false === v ? true: v; + }); + assert.deepEqual([ + { yep: true, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } + , { yep: true } + ], o.arr); + + mpath.set('arr.yep', false, o); + + assert.deepEqual([ + { yep: false, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } + , { yep: false } + ], o.arr); + + done(); + }) + }) + describe('with array of values', function(){ + it('that are equal in length', function(done){ + mpath.set('arr.yep', ['one',2], o, function (v) { + return 'one' === v ? 1 : v; + }); + assert.deepEqual([ + { yep: 1, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } + , { yep: 2 } + ], o.arr); + mpath.set('arr.yep', ['one',2], o); + + assert.deepEqual([ + { yep: 'one', arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } + , { yep: 2 } + ], o.arr); + + done(); + }) + + it('that is less than length', function(done){ + mpath.set('arr.yep', [47], o, function (v) { + return 47 === v ? 4 : v; + }); + assert.deepEqual([ + { yep: 4, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } + , { yep: 2 } + ], o.arr); + + mpath.set('arr.yep', [47], o); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } + , { yep: 2 } + ], o.arr); + + done(); + }) + + it('that is greater than length', function(done){ + mpath.set('arr.yep', [5,6,7], o, function (v) { + return 5 === v ? 'five' : v; + }); + assert.deepEqual([ + { yep: 'five', arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } + , { yep: 6 } + ], o.arr); + + mpath.set('arr.yep', [5,6,7], o); + assert.deepEqual([ + { yep: 5, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } + , { yep: 6 } + ], o.arr); + + done(); + }) + }) + }) + + describe('array.$.path', function(){ + describe('with single non-array value', function(){ + it('copies the value to each item in array', function(done){ + mpath.set('arr.$.yep', {xtra: 'double good'}, o, function (v) { + return v && v.xtra ? 'hi' : v; + }); + assert.deepEqual([ + { yep: 'hi', arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } + , { yep: 'hi'} + ], o.arr); + + mpath.set('arr.$.yep', {xtra: 'double good'}, o); + assert.deepEqual([ + { yep: {xtra:'double good'}, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } + , { yep: {xtra:'double good'}} + ], o.arr); + + done(); + }) + }) + describe('with array of values', function(){ + it('copies the value to each item in array', function(done){ + mpath.set('arr.$.yep', [15], o, function (v) { + return v.length === 1 ? [] : v; + }); + assert.deepEqual([ + { yep: [], arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } + , { yep: []} + ], o.arr); + + mpath.set('arr.$.yep', [15], o); + assert.deepEqual([ + { yep: [15], arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } + , { yep: [15]} + ], o.arr); + + done(); + }) + }) + }) + + describe('array.index.path', function(){ + it('works', function(done){ + mpath.set('arr.1.yep', 0, o, function (v) { + return 0 === v ? 'zero' : v; + }); + assert.deepEqual([ + { yep: [15] , arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } + , { yep: 'zero' } + ], o.arr); + + mpath.set('arr.1.yep', 0, o); + assert.deepEqual([ + { yep: [15] , arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } + , { yep: 0 } + ], o.arr); + + done(); + }) + }) + + describe('array.index.array.path', function(){ + it('with single value', function(done){ + mpath.set('arr.0.arr.e', 35, o, function (v) { + return 35 === v ? 3 : v; + }); + assert.deepEqual([ + { yep: [15], arr: [{ a: { b: 47 }, e: 3}, { a: { c: 48 }, e: 3}, { d: 'yep', e: 3 }] } + , { yep: 0 } + ], o.arr); + + mpath.set('arr.0.arr.e', 35, o); + assert.deepEqual([ + { yep: [15], arr: [{ a: { b: 47 }, e: 35}, { a: { c: 48 }, e: 35}, { d: 'yep', e: 35 }] } + , { yep: 0 } + ], o.arr); + + done(); + }) + it('with array', function(done){ + mpath.set('arr.0.arr.e', ['a','b'], o, function (v) { + return 'a' === v ? 'x' : v; + }); + assert.deepEqual([ + { yep: [15], arr: [{ a: { b: 47 }, e: 'x'}, { a: { c: 48 }, e: 'b'}, { d: 'yep', e: 35 }] } + , { yep: 0 } + ], o.arr); + + mpath.set('arr.0.arr.e', ['a','b'], o); + assert.deepEqual([ + { yep: [15], arr: [{ a: { b: 47 }, e: 'a'}, { a: { c: 48 }, e: 'b'}, { d: 'yep', e: 35 }] } + , { yep: 0 } + ], o.arr); + + done(); + }) + }) + + describe('array.index.array.path.path', function(){ + it('with single value', function(done){ + mpath.set('arr.0.arr.a.b', 36, o, function (v) { + return 36 === v ? 3 : v; + }); + assert.deepEqual([ + { yep: [15], arr: [{ a: { b: 3 }, e: 'a'}, { a: { c: 48, b: 3 }, e: 'b'}, { d: 'yep', e: 35 }] } + , { yep: 0 } + ], o.arr); + + mpath.set('arr.0.arr.a.b', 36, o); + assert.deepEqual([ + { yep: [15], arr: [{ a: { b: 36 }, e: 'a'}, { a: { c: 48, b: 36 }, e: 'b'}, { d: 'yep', e: 35 }] } + , { yep: 0 } + ], o.arr); + + done(); + }) + it('with array', function(done){ + mpath.set('arr.0.arr.a.b', [1,2,3,4], o, function (v) { + return 2 === v ? 'two' : v; + }); + assert.deepEqual([ + { yep: [15], arr: [{ a: { b: 1 }, e: 'a'}, { a: { c: 48, b: 'two' }, e: 'b'}, { d: 'yep', e: 35 }] } + , { yep: 0 } + ], o.arr); + + mpath.set('arr.0.arr.a.b', [1,2,3,4], o); + assert.deepEqual([ + { yep: [15], arr: [{ a: { b: 1 }, e: 'a'}, { a: { c: 48, b: 2 }, e: 'b'}, { d: 'yep', e: 35 }] } + , { yep: 0 } + ], o.arr); + + done(); + }) + }) + + describe('array.index.array.$.path.path', function(){ + it('with single value', function(done){ + mpath.set('arr.0.arr.$.a.b', '$', o, function (v) { + return '$' === v ? 'dolla billz' : v; + }); + assert.deepEqual([ + { yep: [15], arr: [{ a: { b: 'dolla billz' }, e: 'a'}, { a: { c: 48, b: 'dolla billz' }, e: 'b'}, { d: 'yep', e: 35 }] } + , { yep: 0 } + ], o.arr); + + mpath.set('arr.0.arr.$.a.b', '$', o); + assert.deepEqual([ + { yep: [15], arr: [{ a: { b: '$' }, e: 'a'}, { a: { c: 48, b: '$' }, e: 'b'}, { d: 'yep', e: 35 }] } + , { yep: 0 } + ], o.arr); + + done(); + }) + it('with array', function(done){ + mpath.set('arr.0.arr.$.a.b', [1], o, function (v) { + return Array.isArray(v) ? {} : v; + }); + assert.deepEqual([ + { yep: [15], arr: [{ a: { b: {} }, e: 'a'}, { a: { c: 48, b: {} }, e: 'b'}, { d: 'yep', e: 35 }] } + , { yep: 0 } + ], o.arr); + + mpath.set('arr.0.arr.$.a.b', [1], o); + assert.deepEqual([ + { yep: [15], arr: [{ a: { b: [1] }, e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } + , { yep: 0 } + ], o.arr); + + done(); + }) + }) + + describe('array.array.index.path', function(){ + it('with single value', function(done){ + mpath.set('arr.arr.0.a', 'single', o, function (v) { + return 'single' === v ? 'double' : v; + }); + assert.deepEqual([ + { yep: [15], arr: [{ a: 'double', e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } + , { yep: 0 } + ], o.arr); + + mpath.set('arr.arr.0.a', 'single', o); + assert.deepEqual([ + { yep: [15], arr: [{ a: 'single', e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } + , { yep: 0 } + ], o.arr); + + done(); + }) + it('with array', function(done){ + mpath.set('arr.arr.0.a', [4,8,15,16,23,42], o, function (v) { + return 4 === v ? 3 : v; + }); + assert.deepEqual([ + { yep: [15], arr: [{ a: 3, e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } + , { yep: false } + ], o.arr); + + mpath.set('arr.arr.0.a', [4,8,15,16,23,42], o); + assert.deepEqual([ + { yep: [15], arr: [{ a: 4, e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } + , { yep: false } + ], o.arr); + + done(); + }) + }) + + describe('array.array.$.index.path', function(){ + it('with single value', function(done){ + mpath.set('arr.arr.$.0.a', 'singles', o, function (v) { + return 0; + }); + assert.deepEqual([ + { yep: [15], arr: [{ a: 0, e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } + , { yep: 0 } + ], o.arr); + + mpath.set('arr.arr.$.0.a', 'singles', o); + assert.deepEqual([ + { yep: [15], arr: [{ a: 'singles', e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } + , { yep: 0 } + ], o.arr); + + mpath.set('$.arr.arr.0.a', 'single', o); + assert.deepEqual([ + { yep: [15], arr: [{ a: 'single', e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } + , { yep: 0 } + ], o.arr); + + done(); + }) + it('with array', function(done){ + mpath.set('arr.arr.$.0.a', [4,8,15,16,23,42], o, function (v) { + return 'nope' + }); + assert.deepEqual([ + { yep: [15], arr: [{ a: 'nope', e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } + , { yep: 0} + ], o.arr); + + mpath.set('arr.arr.$.0.a', [4,8,15,16,23,42], o); + assert.deepEqual([ + { yep: [15], arr: [{ a: [4,8,15,16,23,42], e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } + , { yep: 0} + ], o.arr); + + mpath.set('arr.$.arr.0.a', [4,8,15,16,23,42,108], o); + assert.deepEqual([ + { yep: [15], arr: [{ a: [4,8,15,16,23,42,108], e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } + , { yep: 0} + ], o.arr); + + done(); + }) + }) + + describe('array.array.path.index', function(){ + it('with single value', function(done){ + mpath.set('arr.arr.a.7', 47, o, function (v) { + return 1 + }); + assert.deepEqual([ + { yep: [15], arr: [{ a: [4,8,15,16,23,42,108,1], e: 'a'}, { a: { c: 48, b: [1], '7': 1 }, e: 'b'}, { d: 'yep', e: 35 }] } + , { yep: 0} + ], o.arr); + + mpath.set('arr.arr.a.7', 47, o); + assert.deepEqual([ + { yep: [15], arr: [{ a: [4,8,15,16,23,42,108,47], e: 'a'}, { a: { c: 48, b: [1], '7': 47 }, e: 'b'}, { d: 'yep', e: 35 }] } + , { yep: 0} + ], o.arr); + + done(); + }) + it('with array', function(done){ + o.arr[1].arr = [{ a: [] }, { a: [] }, { a: null }]; + mpath.set('arr.arr.a.7', [[null,46], [undefined, 'woot']], o); + + var a1 = []; + var a2 = []; + a1[7] = undefined; + a2[7] = 'woot'; + + assert.deepEqual([ + { yep: [15], arr: [{ a: [4,8,15,16,23,42,108,null], e: 'a'}, { a: { c: 48, b: [1], '7': 46 }, e: 'b'}, { d: 'yep', e: 35 }] } + , { yep: 0, arr: [{a:a1},{a:a2},{a:null}] } + ], o.arr); + + done(); + }) + }) + + describe('handles array.array.path', function(){ + it('with single', function(done){ + o.arr[1].arr = [{},{}]; + assert.deepEqual([{},{}], o.arr[1].arr); + o.arr.push({ arr: 'something else' }); + o.arr.push({ arr: ['something else'] }); + o.arr.push({ arr: [[]] }); + o.arr.push({ arr: [5] }); + + var weird = []; + weird.e = 'xmas'; + + // test + mpath.set('arr.arr.e', 47, o, function (v) { + return 'xmas' + }); + assert.deepEqual([ + { yep: [15], arr: [ + { a: [4,8,15,16,23,42,108,null], e: 'xmas'} + , { a: { c: 48, b: [1], '7': 46 }, e: 'xmas'} + , { d: 'yep', e: 'xmas' } + ] + } + , { yep: 0, arr: [{e: 'xmas'}, {e:'xmas'}] } + , { arr: 'something else' } + , { arr: ['something else'] } + , { arr: [weird] } + , { arr: [5] } + ] + , o.arr); + + weird.e = 47; + + mpath.set('arr.arr.e', 47, o); + assert.deepEqual([ + { yep: [15], arr: [ + { a: [4,8,15,16,23,42,108,null], e: 47} + , { a: { c: 48, b: [1], '7': 46 }, e: 47} + , { d: 'yep', e: 47 } + ] + } + , { yep: 0, arr: [{e: 47}, {e:47}] } + , { arr: 'something else' } + , { arr: ['something else'] } + , { arr: [weird] } + , { arr: [5] } + ] + , o.arr); + + done(); + }) + it('with arrays', function(done){ + mpath.set('arr.arr.e', [[1,2,3],[4,5],null,[],[6], [7,8,9]], o, function (v) { + return 10; + }); + + var weird = []; + weird.e = 10; + + assert.deepEqual([ + { yep: [15], arr: [ + { a: [4,8,15,16,23,42,108,null], e: 10} + , { a: { c: 48, b: [1], '7': 46 }, e: 10} + , { d: 'yep', e: 10 } + ] + } + , { yep: 0, arr: [{e: 10}, {e:10}] } + , { arr: 'something else' } + , { arr: ['something else'] } + , { arr: [weird] } + , { arr: [5] } + ] + , o.arr); + + mpath.set('arr.arr.e', [[1,2,3],[4,5],null,[],[6], [7,8,9]], o); + + weird.e = 6; + + assert.deepEqual([ + { yep: [15], arr: [ + { a: [4,8,15,16,23,42,108,null], e: 1} + , { a: { c: 48, b: [1], '7': 46 }, e: 2} + , { d: 'yep', e: 3 } + ] + } + , { yep: 0, arr: [{e: 4}, {e:5}] } + , { arr: 'something else' } + , { arr: ['something else'] } + , { arr: [weird] } + , { arr: [5] } + ] + , o.arr); + + done(); + }) + }) + }) + + describe('with `special`', function(){ + var o = doc(); + + it('works', function(done){ + mpath.set('name', 'chan', o, special, function (v) { + return 'hi'; + }); + assert.deepEqual('hi', o.name); + + mpath.set('name', 'changer', o, special); + assert.deepEqual('changer', o.name); + + mpath.set('first.second.third', [1,{name:'y'},9], o, special); + assert.deepEqual([1,{name:'y'},9], o.first.second.third); + + mpath.set('first.second.third.1.name', 'z', o, special) + assert.deepEqual([1,{name:'z'},9], o.first.second.third); + + mpath.set('comments.1.name', 'ttwwoo', o, special); + assert.deepEqual({ name: 'two', _doc: { name: 'ttwwoo' }}, o.comments[1]); + + mpath.set('comments.2.comments.1.comments.0.expander', 'adder', o, special, function (v) { + return 'super' + }); + assert.deepEqual( + { val: 2, expander: 'super'} + , o.comments[2]._doc.comments[1]._doc.comments[0]); + + mpath.set('comments.2.comments.1.comments.0.expander', 'adder', o, special); + assert.deepEqual( + { val: 2, expander: 'adder'} + , o.comments[2]._doc.comments[1]._doc.comments[0]); + + mpath.set('comments.2.comments.1.comments.2', 'set', o, special); + assert.equal(3, o.comments[2]._doc.comments[1]._doc.comments.length); + assert.deepEqual( + { val: 2, expander: 'adder'} + , o.comments[2]._doc.comments[1]._doc.comments[0]); + assert.deepEqual( + undefined + , o.comments[2]._doc.comments[1]._doc.comments[1]); + assert.deepEqual( + 'set' + , o.comments[2]._doc.comments[1]._doc.comments[2]); + done(); + }) + + describe('array.path', function(){ + describe('with single non-array value', function(){ + it('works', function(done){ + o.arr[1]._doc = { special: true } + + mpath.set('arr.yep', false, o, special, function (v) { + return 'yes'; + }); + assert.deepEqual([ + { yep: 'yes', arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } + , { yep: true, _doc: { special: true, yep: 'yes'}} + ], o.arr); + + mpath.set('arr.yep', false, o, special); + assert.deepEqual([ + { yep: false, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } + , { yep: true, _doc: { special: true, yep: false }} + ], o.arr); + + done(); + }) + }) + describe('with array of values', function(){ + it('that are equal in length', function(done){ + mpath.set('arr.yep', ['one',2], o, special, function (v) { + return 2 === v ? 20 : v; + }); + assert.deepEqual([ + { yep: 'one', arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } + , { yep: true, _doc: { special: true, yep: 20}} + ], o.arr); + + mpath.set('arr.yep', ['one',2], o, special); + assert.deepEqual([ + { yep: 'one', arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } + , { yep: true, _doc: { special: true, yep: 2}} + ], o.arr); + + done(); + }) + + it('that is less than length', function(done){ + mpath.set('arr.yep', [47], o, special, function (v) { + return 80; + }); + assert.deepEqual([ + { yep: 80, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } + , { yep: true, _doc: { special: true, yep: 2}} + ], o.arr); + + mpath.set('arr.yep', [47], o, special); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } + , { yep: true, _doc: { special: true, yep: 2}} + ], o.arr); + + // add _doc to first element + o.arr[0]._doc = { yep: 46, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } + + mpath.set('arr.yep', [20], o, special); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }], _doc: { yep: 20, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } } + , { yep: true, _doc: { special: true, yep: 2}} + ], o.arr); + + done(); + }) + + it('that is greater than length', function(done){ + mpath.set('arr.yep', [5,6,7], o, special, function () { + return 'x'; + }); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }], _doc: { yep: 'x', arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } } + , { yep: true, _doc: { special: true, yep: 'x'}} + ], o.arr); + + mpath.set('arr.yep', [5,6,7], o, special); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }], _doc: { yep: 5, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } } + , { yep: true, _doc: { special: true, yep: 6}} + ], o.arr); + + done(); + }) + }) + }) + + describe('array.$.path', function(){ + describe('with single non-array value', function(){ + it('copies the value to each item in array', function(done){ + mpath.set('arr.$.yep', {xtra: 'double good'}, o, special, function (v) { + return 9; + }); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: 9, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } } + , { yep: true, _doc: { special: true, yep: 9}} + ], o.arr); + + mpath.set('arr.$.yep', {xtra: 'double good'}, o, special); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: {xtra:'double good'}, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } } + , { yep: true, _doc: { special: true, yep: {xtra:'double good'}}} + ], o.arr); + + done(); + }) + }) + describe('with array of values', function(){ + it('copies the value to each item in array', function(done){ + mpath.set('arr.$.yep', [15], o, special, function (v) { + return 'array' + }); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: 'array', arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } } + , { yep: true, _doc: { special: true, yep: 'array'}} + ], o.arr); + + mpath.set('arr.$.yep', [15], o, special); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } } + , { yep: true, _doc: { special: true, yep: [15]}} + ], o.arr); + + done(); + }) + }) + }) + + describe('array.index.path', function(){ + it('works', function(done){ + mpath.set('arr.1.yep', 0, o, special, function (v) { + return 1; + }); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } } + , { yep: true, _doc: { special: true, yep: 1}} + ], o.arr); + + mpath.set('arr.1.yep', 0, o, special); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } } + , { yep: true, _doc: { special: true, yep: 0}} + ], o.arr); + + done(); + }) + }) + + describe('array.index.array.path', function(){ + it('with single value', function(done){ + mpath.set('arr.0.arr.e', 35, o, special, function (v) { + return 30 + }); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: { b: 47 }, e: 30}, { a: { c: 48 }, e: 30}, { d: 'yep', e: 30 }] } } + , { yep: true, _doc: { special: true, yep: 0}} + ], o.arr); + + mpath.set('arr.0.arr.e', 35, o, special); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: { b: 47 }, e: 35}, { a: { c: 48 }, e: 35}, { d: 'yep', e: 35 }] } } + , { yep: true, _doc: { special: true, yep: 0}} + ], o.arr); + + done(); + }) + it('with array', function(done){ + mpath.set('arr.0.arr.e', ['a','b'], o, special, function (v) { + return 'a' === v ? 'A' : v; + }); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: { b: 47 }, e: 'A'}, { a: { c: 48 }, e: 'b'}, { d: 'yep', e: 35 }] } } + , { yep: true, _doc: { special: true, yep: 0}} + ], o.arr); + + mpath.set('arr.0.arr.e', ['a','b'], o, special); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: { b: 47 }, e: 'a'}, { a: { c: 48 }, e: 'b'}, { d: 'yep', e: 35 }] } } + , { yep: true, _doc: { special: true, yep: 0}} + ], o.arr); + + done(); + }) + }) + + describe('array.index.array.path.path', function(){ + it('with single value', function(done){ + mpath.set('arr.0.arr.a.b', 36, o, special, function (v) { + return 20 + }); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: { b: 20 }, e: 'a'}, { a: { c: 48, b: 20 }, e: 'b'}, { d: 'yep', e: 35 }] } } + , { yep: true, _doc: { special: true, yep: 0}} + ], o.arr); + + mpath.set('arr.0.arr.a.b', 36, o, special); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: { b: 36 }, e: 'a'}, { a: { c: 48, b: 36 }, e: 'b'}, { d: 'yep', e: 35 }] } } + , { yep: true, _doc: { special: true, yep: 0}} + ], o.arr); + + done(); + }) + it('with array', function(done){ + mpath.set('arr.0.arr.a.b', [1,2,3,4], o, special, function (v) { + return v*2; + }); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: { b: 2 }, e: 'a'}, { a: { c: 48, b: 4 }, e: 'b'}, { d: 'yep', e: 35 }] } } + , { yep: true, _doc: { special: true, yep: 0}} + ], o.arr); + + mpath.set('arr.0.arr.a.b', [1,2,3,4], o, special); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: { b: 1 }, e: 'a'}, { a: { c: 48, b: 2 }, e: 'b'}, { d: 'yep', e: 35 }] } } + , { yep: true, _doc: { special: true, yep: 0}} + ], o.arr); + + done(); + }) + }) + + describe('array.index.array.$.path.path', function(){ + it('with single value', function(done){ + mpath.set('arr.0.arr.$.a.b', '$', o, special, function (v) { + return 'dollaz' + }); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: { b: 'dollaz' }, e: 'a'}, { a: { c: 48, b: 'dollaz' }, e: 'b'}, { d: 'yep', e: 35 }] } } + , { yep: true, _doc: { special: true, yep: 0}} + ], o.arr); + + mpath.set('arr.0.arr.$.a.b', '$', o, special); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: { b: '$' }, e: 'a'}, { a: { c: 48, b: '$' }, e: 'b'}, { d: 'yep', e: 35 }] } } + , { yep: true, _doc: { special: true, yep: 0}} + ], o.arr); + + done(); + }) + it('with array', function(done){ + mpath.set('arr.0.arr.$.a.b', [1], o, special, function (v) { + return {}; + }); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: { b: {} }, e: 'a'}, { a: { c: 48, b: {} }, e: 'b'}, { d: 'yep', e: 35 }] } } + , { yep: true, _doc: { special: true, yep: 0}} + ], o.arr); + + mpath.set('arr.0.arr.$.a.b', [1], o, special); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: { b: [1] }, e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } } + , { yep: true, _doc: { special: true, yep: 0}} + ], o.arr); + + done(); + }) + }) + + describe('array.array.index.path', function(){ + it('with single value', function(done){ + mpath.set('arr.arr.0.a', 'single', o, special, function (v) { + return 88; + }); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: 88, e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } } + , { yep: true, _doc: { special: true, yep: 0}} + ], o.arr); + + mpath.set('arr.arr.0.a', 'single', o, special); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: 'single', e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } } + , { yep: true, _doc: { special: true, yep: 0}} + ], o.arr); + + done(); + }) + it('with array', function(done){ + mpath.set('arr.arr.0.a', [4,8,15,16,23,42], o, special, function (v) { + return v*2; + }); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: 8, e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } } + , { yep: true, _doc: { special: true, yep: 0}} + ], o.arr); + + mpath.set('arr.arr.0.a', [4,8,15,16,23,42], o, special); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: 4, e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } } + , { yep: true, _doc: { special: true, yep: 0}} + ], o.arr); + + done(); + }) + }) + + describe('array.array.$.index.path', function(){ + it('with single value', function(done){ + mpath.set('arr.arr.$.0.a', 'singles', o, special, function (v) { + return v.toUpperCase(); + }); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: 'SINGLES', e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } } + , { yep: true, _doc: { special: true, yep: 0}} + ], o.arr); + + mpath.set('arr.arr.$.0.a', 'singles', o, special); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: 'singles', e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } } + , { yep: true, _doc: { special: true, yep: 0}} + ], o.arr); + + mpath.set('$.arr.arr.0.a', 'single', o, special); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: 'single', e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } } + , { yep: true, _doc: { special: true, yep: 0}} + ], o.arr); + + done(); + }) + it('with array', function(done){ + mpath.set('arr.arr.$.0.a', [4,8,15,16,23,42], o, special, function (v) { + return Array + }); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: Array, e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } } + , { yep: true, _doc: { special: true, yep: 0}} + ], o.arr); + + mpath.set('arr.arr.$.0.a', [4,8,15,16,23,42], o, special); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: [4,8,15,16,23,42], e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } } + , { yep: true, _doc: { special: true, yep: 0}} + ], o.arr); + + mpath.set('arr.$.arr.0.a', [4,8,15,16,23,42,108], o, special); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: [4,8,15,16,23,42,108], e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } } + , { yep: true, _doc: { special: true, yep: 0}} + ], o.arr); + + done(); + }) + }) + + describe('array.array.path.index', function(){ + it('with single value', function(done){ + mpath.set('arr.arr.a.7', 47, o, special, function (v) { + return Object; + }); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: [4,8,15,16,23,42,108,Object], e: 'a'}, { a: { c: 48, b: [1], '7': Object }, e: 'b'}, { d: 'yep', e: 35 }] } } + , { yep: true, _doc: { special: true, yep: 0}} + ], o.arr); + + mpath.set('arr.arr.a.7', 47, o, special); + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: [4,8,15,16,23,42,108,47], e: 'a'}, { a: { c: 48, b: [1], '7': 47 }, e: 'b'}, { d: 'yep', e: 35 }] } } + , { yep: true, _doc: { special: true, yep: 0}} + ], o.arr); + + done(); + }) + it('with array', function(done){ + o.arr[1]._doc.arr = [{ a: [] }, { a: [] }, { a: null }]; + mpath.set('arr.arr.a.7', [[null,46], [undefined, 'woot']], o, special, function (v) { + return undefined === v ? 'nope' : v; + }); + + var a1 = []; + var a2 = []; + a1[7] = 'nope'; + a2[7] = 'woot'; + + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: [4,8,15,16,23,42,108,null], e: 'a'}, { a: { c: 48, b: [1], '7': 46 }, e: 'b'}, { d: 'yep', e: 35 }] } } + , { yep: true, _doc: { arr: [{a:a1},{a:a2},{a:null}], special: true, yep: 0}} + ], o.arr); + + mpath.set('arr.arr.a.7', [[null,46], [undefined, 'woot']], o, special); + + a1[7] = undefined; + + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { yep: [15], arr: [{ a: [4,8,15,16,23,42,108,null], e: 'a'}, { a: { c: 48, b: [1], '7': 46 }, e: 'b'}, { d: 'yep', e: 35 }] } } + , { yep: true, _doc: { arr: [{a:a1},{a:a2},{a:null}], special: true, yep: 0}} + ], o.arr); + + done(); + }) + }) + + describe('handles array.array.path', function(){ + it('with single', function(done){ + o.arr[1]._doc.arr = [{},{}]; + assert.deepEqual([{},{}], o.arr[1]._doc.arr); + o.arr.push({ _doc: { arr: 'something else' }}); + o.arr.push({ _doc: { arr: ['something else'] }}); + o.arr.push({ _doc: { arr: [[]] }}); + o.arr.push({ _doc: { arr: [5] }}); + + // test + mpath.set('arr.arr.e', 47, o, special); + + var weird = []; + weird.e = 47; + + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { + yep: [15] + , arr: [ + { a: [4,8,15,16,23,42,108,null], e: 47} + , { a: { c: 48, b: [1], '7': 46 }, e: 47} + , { d: 'yep', e: 47 } + ] + } + } + , { yep: true + , _doc: { + arr: [ + {e:47} + , {e:47} + ] + , special: true + , yep: 0 + } + } + , { _doc: { arr: 'something else' }} + , { _doc: { arr: ['something else'] }} + , { _doc: { arr: [weird] }} + , { _doc: { arr: [5] }} + ] + , o.arr); + + done(); + }) + it('with arrays', function(done){ + mpath.set('arr.arr.e', [[1,2,3],[4,5],null,[],[6], [7,8,9]], o, special); + + var weird = []; + weird.e = 6; + + assert.deepEqual([ + { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] + , _doc: { + yep: [15] + , arr: [ + { a: [4,8,15,16,23,42,108,null], e: 1} + , { a: { c: 48, b: [1], '7': 46 }, e: 2} + , { d: 'yep', e: 3 } + ] + } + } + , { yep: true + , _doc: { + arr: [ + {e:4} + , {e:5} + ] + , special: true + , yep: 0 + } + } + , { _doc: { arr: 'something else' }} + , { _doc: { arr: ['something else'] }} + , { _doc: { arr: [weird] }} + , { _doc: { arr: [5] }} + ] + , o.arr); + + done(); + }) + }) + + }) + + describe('get/set integration', function(){ + var o = doc(); + + it('works', function(done){ + var vals = mpath.get('array.o.array.x.b', o); + + vals[0][0][2] = 10; + vals[1][0][1] = 0; + vals[1][1] = 'Rambaldi'; + vals[1][2] = [12,14]; + vals[2] = [{changed:true}, [null, ['changed','to','array']]]; + + mpath.set('array.o.array.x.b', vals, o); + + var t = [ + { o: { array: [{x: {b: [4,6,10]}}, { y: 10} ] }} + , { o: { array: [{x: {b: [1,0,3]}}, { x: {b:'Rambaldi',z: 10 }}, { x: {b: [12,14]}}] }} + , { o: { array: [{x: {b: {changed:true}}}, { x: { b: [null, ['changed','to','array']]}}]}} + , { o: { array: [{x: null }] }} + , { o: { array: [{y: 3 }] }} + , { o: { array: [3, 0, null] }} + , { o: { name: 'ha' }} + ]; + assert.deepEqual(t, o.array); + done(); + }) + + it('array.prop', function(done){ + mpath.set('comments.name', ['this', 'was', 'changed'], o); + + assert.deepEqual([ + { name: 'this' } + , { name: 'was', _doc: { name: '2' }} + , { name: 'changed' + , comments: [{},{ comments: [{val: 'twoo'}]}] + , _doc: { name: '3', comments: [{},{ _doc: { comments: [{ val: 2 }] }}] }} + ], o.comments); + + mpath.set('comments.name', ['also', 'changed', 'this'], o, special); + + assert.deepEqual([ + { name: 'also' } + , { name: 'was', _doc: { name: 'changed' }} + , { name: 'changed' + , comments: [{},{ comments: [{val: 'twoo'}]}] + , _doc: { name: 'this', comments: [{},{ _doc: { comments: [{ val: 2 }] }}] }} + ], o.comments); + + done(); + }) + + }) + + describe('multiple $ use', function(){ + var o = doc(); + it('is ok', function(done){ + assert.doesNotThrow(function () { + mpath.set('arr.$.arr.$.a', 35, o); + }); + done(); + }) + }) + + it('ignores setting a nested path that doesnt exist', function(done){ + var o = doc(); + assert.doesNotThrow(function(){ + mpath.set('thing.that.is.new', 10, o); + }) + done(); + }) + }) + +}) diff --git a/node_modules/mongoose/node_modules/mpromise/.npmignore b/node_modules/mongoose/node_modules/mpromise/.npmignore new file mode 100644 index 0000000..be106ca --- /dev/null +++ b/node_modules/mongoose/node_modules/mpromise/.npmignore @@ -0,0 +1,2 @@ +*.sw* +node_modules/ diff --git a/node_modules/mongoose/node_modules/mpromise/.travis.yml b/node_modules/mongoose/node_modules/mpromise/.travis.yml new file mode 100644 index 0000000..09c230f --- /dev/null +++ b/node_modules/mongoose/node_modules/mpromise/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - 0.6 + - 0.8 diff --git a/node_modules/mongoose/node_modules/mpromise/History.md b/node_modules/mongoose/node_modules/mpromise/History.md new file mode 100644 index 0000000..f157b69 --- /dev/null +++ b/node_modules/mongoose/node_modules/mpromise/History.md @@ -0,0 +1,24 @@ + +0.2.1 / 2013-02-09 +================== + + * fixed; conformancy with A+ 1.2 + +0.2.0 / 2013-01-09 +================== + + * added; .end() + * fixed; only catch handler executions + +0.1.0 / 2013-01-08 +================== + + * cleaned up API + * customizable event names + * docs + +0.0.1 / 2013-01-07 +================== + + * original release + diff --git a/node_modules/mongoose/node_modules/mpromise/LICENSE b/node_modules/mongoose/node_modules/mpromise/LICENSE new file mode 100644 index 0000000..38c529d --- /dev/null +++ b/node_modules/mongoose/node_modules/mpromise/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2012 [Aaron Heckmann](aaron.heckmann+github@gmail.com) + +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. diff --git a/node_modules/mongoose/node_modules/mpromise/Makefile b/node_modules/mongoose/node_modules/mpromise/Makefile new file mode 100644 index 0000000..717a796 --- /dev/null +++ b/node_modules/mongoose/node_modules/mpromise/Makefile @@ -0,0 +1,12 @@ +TESTS = $(shell find test/ -name '*.test.js') + +test: + @make test-unit && echo "testing promises-A+ implementation ..." && make test-promises-A + +test-unit: + @./node_modules/.bin/mocha $(T) --async-only $(TESTS) + +test-promises-A: + @node test/promises-A.js + +.PHONY: test test-unit test-promises-A diff --git a/node_modules/mongoose/node_modules/mpromise/README.md b/node_modules/mongoose/node_modules/mpromise/README.md new file mode 100644 index 0000000..7da2725 --- /dev/null +++ b/node_modules/mongoose/node_modules/mpromise/README.md @@ -0,0 +1,200 @@ +#mpromise +========== + +A [promises/A+](https://github.com/promises-aplus/promises-spec) conformant implementation, written for [mongoose](http://mongoosejs.com). + +## installation + +``` +$ npm install mpromise +``` + +## docs + +An `mpromise` can be in any of three states, pending, fulfilled (success), or rejected (error). Once it is either fulfilled or rejected it's state can no longer be changed. + +The exports object is the Promise constructor. + +```js +var Promise = require('mpromise'); +``` + +The constructor accepts an optional function which is executed when the promise is first resolved (either fulfilled or rejected). + +```js +var promise = new Promise(fn); +``` + +This is the same as passing the `fn` to `onResolve` directly. + +```js +var promise = new Promise; +promise.onResolve(function (err, args..) { + ... +}); +``` + +### Methods + +####fulfill + +Fulfilling a promise with values: + +```js +var promise = new Promise; +promise.fulfill(args...); +``` + +If the promise has already been fulfilled or rejected, no action is taken. + +####reject + +Rejecting a promise with a reason: + +```js +var promise = new Promise; +promise.reject(reason); +``` + +If the promise has already been fulfilled or rejected, no action is taken. + +####resolve + +Node.js callback style promise resolution `(err, args...)`: + +```js +var promise = new Promise; +promise.resolve([reason], [arg1, arg2, ...]); +``` + +If the promise has already been fulfilled or rejected, no action is taken. + +####onFulfill + +To register a function for execution when the promise is fulfilled, pass it to `onFulfill`. When executed it will receive the arguments passed to `fulfill()`. + +```js +var promise = new Promise; +promise.onFulfill(function (a, b) { + assert.equal(3, a + b); +}); +promise.fulfill(1, 2); +``` + +The function will only be called once when the promise is fulfilled, never when rejected. + +Registering a function with `onFulfill` after the promise has already been fulfilled results in the immediate execution of the function with the original arguments used to fulfill the promise. + +```js +var promise = new Promise; +promise.fulfill(" :D "); +promise.onFulfill(function (arg) { + console.log(arg); // logs " :D " +}) +``` + +####onReject + +To register a function for execution when the promise is rejected, pass it to `onReject`. When executed it will receive the argument passed to `reject()`. + +```js +var promise = new Promise; +promise.onReject(function (reason) { + assert.equal('sad', reason); +}); +promise.reject('sad'); +``` + +The function will only be called once when the promise is rejected, never when fulfilled. + +Registering a function with `onReject` after the promise has already been rejected results in the immediate execution of the function with the original argument used to reject the promise. + +```js +var promise = new Promise; +promise.reject(" :( "); +promise.onReject(function (reason) { + console.log(reason); // logs " :( " +}) +``` + +####onResolve + +Allows registration of node.js style callbacks `(err, args..)` to handle either promise resolution type (fulfill or reject). + +```js +// fulfillment +var promise = new Promise; +promise.onResolve(function (err, a, b) { + console.log(a + b); // logs 3 +}); +promise.fulfill(1, 2); + +// rejection +var promise = new Promise; +promise.onResolve(function (err) { + if (err) { + console.log(err.message); // logs "failed" + } +}); +promise.reject(new Error('failed')); +``` + +####then + +Creates a new promise and returns it. If `onFulfill` or `onReject` are passed, they are added as SUCCESS/ERROR callbacks to this promise after the nextTick. + +Conforms to [promises/A+](https://github.com/promises-aplus/promises-spec) specification and passes its [tests](https://github.com/promises-aplus/promises-tests). + +```js +// promise.then(onFulfill, onReject); + +var p = new Promise; + +p.then(function (arg) { + return arg + 1; +}).then(function (arg) { + throw new Error(arg + ' is an error!'); +}).then(null, function (err) { + assert.ok(err instanceof Error); + assert.equal('2 is an error', err.message); +}); +p.complete(1); +``` + +####end + +Signifies that this promise was the last in a chain of `then()s`: if a handler passed to the call to `then` which produced this promise throws, the exception will go uncaught. + +```js +var p = new Promise; +p.then(function(){ throw new Error('shucks') }); +setTimeout(function () { + p.fulfill(); + // error was caught and swallowed by the promise returned from + // p.then(). we either have to always register handlers on + // the returned promises or we can do the following... +}, 10); + +// this time we use .end() which prevents catching thrown errors +var p = new Promise; +var p2 = p.then(function(){ throw new Error('shucks') }).end(); // <-- +setTimeout(function () { + p.fulfill(); // throws "shucks" +}, 10); +``` + +###Event names + +If you'd like to alter this implementations event names used to signify success and failure you may do so by setting `Promise.SUCCESS` or `Promise.FAILURE` respectively. + +```js +Promise.SUCCESS = 'complete'; +Promise.FAILURE = 'err'; +``` + +###Luke, use the Source +For more ideas read the [source](https://github.com/aheckmann/mpromise/blob/master/lib), [tests](https://github.com/aheckmann/mpromise/blob/master/test), or the [mongoose implementation](https://github.com/LearnBoost/mongoose/blob/3.6x/lib/promise.js). + +## license + +[MIT](https://github.com/aheckmann/mpromise/blob/master/LICENSE) diff --git a/node_modules/mongoose/node_modules/mpromise/index.js b/node_modules/mongoose/node_modules/mpromise/index.js new file mode 100644 index 0000000..0b3669d --- /dev/null +++ b/node_modules/mongoose/node_modules/mpromise/index.js @@ -0,0 +1 @@ +module.exports = exports = require('./lib/promise'); diff --git a/node_modules/mongoose/node_modules/mpromise/lib/promise.js b/node_modules/mongoose/node_modules/mpromise/lib/promise.js new file mode 100644 index 0000000..be992c3 --- /dev/null +++ b/node_modules/mongoose/node_modules/mpromise/lib/promise.js @@ -0,0 +1,268 @@ + +/*! + * Module dependencies. + */ + +var slice = require('sliced'); +var EventEmitter = require('events').EventEmitter; + +/** + * Promise constructor. + * + * _NOTE: The success and failure event names can be overridden by setting `Promise.SUCCESS` and `Promise.FAILURE` respectively._ + * + * @param {Function} back a function that accepts `fn(err, ...){}` as signature + * @inherits NodeJS EventEmitter http://nodejs.org/api/events.html#events_class_events_eventemitter + * @event `reject`: Emits when the promise is rejected (event name may be overridden) + * @event `fulfill`: Emits when the promise is fulfilled (event name may be overridden) + * @api public + */ + +function Promise (back) { + this.emitted = {}; + this.ended = false; + if ('function' == typeof back) + this.onResolve(back); +} + +/*! + * event names + */ + +Promise.SUCCESS = 'fulfill'; +Promise.FAILURE = 'reject'; + +/*! + * Inherits from EventEmitter. + */ + +Promise.prototype.__proto__ = EventEmitter.prototype; + +/** + * Adds `listener` to the `event`. + * + * If `event` is either the success or failure event and the event has already been emitted, the`listener` is called immediately and passed the results of the original emitted event. + * + * @param {String} event + * @param {Function} callback + * @return {Promise} this + * @api public + */ + +Promise.prototype.on = function (event, callback) { + if (this.emitted[event]) + callback.apply(this, this.emitted[event]); + else + EventEmitter.prototype.on.call(this, event, callback); + + return this; +} + +/** + * Keeps track of emitted events to run them on `on`. + * + * @api private + */ + +Promise.prototype.emit = function (event) { + // ensures a promise can't be fulfill() or reject() more than once + var success = this.constructor.SUCCESS; + var failure = this.constructor.FAILURE; + + if (event == success || event == failure) { + if (this.emitted[success] || this.emitted[failure]) { + return this; + } + this.emitted[event] = slice(arguments, 1); + } + + return EventEmitter.prototype.emit.apply(this, arguments); +} + +/** + * Fulfills this promise with passed arguments. + * + * If this promise has already been fulfilled or rejected, no action is taken. + * + * @api public + */ + +Promise.prototype.fulfill = function () { + var args = slice(arguments); + return this.emit.apply(this, [this.constructor.SUCCESS].concat(args)); +} + +/** + * Rejects this promise with `reason`. + * + * If this promise has already been fulfilled or rejected, no action is taken. + * + * @api public + * @param {Object|String} reason + * @return {Promise} this + */ + +Promise.prototype.reject = function (reason) { + return this.emit(this.constructor.FAILURE, reason); +} + +/** + * Resolves this promise to a rejected state if `err` is passed or + * fulfilled state if no `err` is passed. + * + * @param {Error} [err] error or null + * @param {Object} [val] value to fulfill the promise with + * @api public + */ + +Promise.prototype.resolve = function (err, val) { + if (err) return this.reject(err); + return this.fulfill(val); +} + +/** + * Adds a listener to the SUCCESS event. + * + * @return {Promise} this + * @api public + */ + +Promise.prototype.onFulfill = function (fn) { + return this.on(this.constructor.SUCCESS, fn); +} + +/** + * Adds a listener to the FAILURE event. + * + * @return {Promise} this + * @api public + */ + +Promise.prototype.onReject = function (fn) { + return this.on(this.constructor.FAILURE, fn); +} + +/** + * Adds a single function as a listener to both SUCCESS and FAILURE. + * + * It will be executed with traditional node.js argument position: + * function (err, args...) {} + * + * @param {Function} fn + * @return {Promise} this + */ + +Promise.prototype.onResolve = function (fn) { + this.on(this.constructor.FAILURE, function(err){ + fn.call(this, err); + }); + + this.on(this.constructor.SUCCESS, function(){ + var args = slice(arguments); + fn.apply(this, [null].concat(args)); + }); + + return this; +} + +/** + * Creates a new promise and returns it. If `onFulfill` or + * `onReject` are passed, they are added as SUCCESS/ERROR callbacks + * to this promise after the nextTick. + * + * Conforms to [promises/A+](https://github.com/promises-aplus/promises-spec) specification. Read for more detail how to use this method. + * + * ####Example: + * + * var p = new Promise; + * p.then(function (arg) { + * return arg + 1; + * }).then(function (arg) { + * throw new Error(arg + ' is an error!'); + * }).then(null, function (err) { + * assert.ok(err instanceof Error); + * assert.equal('2 is an error', err.message); + * }); + * p.complete(1); + * + * @see promises-A+ https://github.com/promises-aplus/promises-spec + * @param {Function} onFulFill + * @param {Function} onReject + * @return {Promise} newPromise + */ + +Promise.prototype.then = function (onFulfill, onReject) { + var self = this + , retPromise = new Promise; + + function handler (fn) { + return function handle (arg) { + var val; + + try { + val = fn(arg); + } catch (err) { + if (retPromise.ended) throw err; + return retPromise.reject(err); + } + + if (val && 'function' == typeof val.then) { + val.then( + retPromise.fulfill.bind(retPromise) + , retPromise.reject.bind(retPromise)) + } else { + retPromise.fulfill(val); + } + } + } + + process.nextTick(function () { + if ('function' == typeof onReject) { + self.onReject(handler(onReject)); + } else { + self.onReject(retPromise.reject.bind(retPromise)); + } + + if ('function' == typeof onFulfill) { + self.onFulfill(handler(onFulfill)); + } else { + self.onFulfill(retPromise.fulfill.bind(retPromise)); + } + }) + + return retPromise; +} + +/** + * Signifies that this promise was the last in a chain of `then()s`: if a handler passed to the call to `then` which produced this promise throws, the exception will go uncaught. + * + * ####Example: + * + * var p = new Promise; + * p.then(function(){ throw new Error('shucks') }); + * setTimeout(function () { + * p.fulfill(); + * // error was caught and swallowed by the promise returned from + * // p.then(). we either have to always register handlers on + * // the returned promises or we can do the following... + * }, 10); + * + * // this time we use .end() which prevents catching thrown errors + * var p = new Promise; + * var p2 = p.then(function(){ throw new Error('shucks') }).end(); // <-- + * setTimeout(function () { + * p.fulfill(); // throws "shucks" + * }, 10); + * + * @api public + */ + +Promise.prototype.end = function () { + this.ended = true; +} + +/*! + * Module exports. + */ + +module.exports = Promise; diff --git a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/.npmignore b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/.npmignore new file mode 100644 index 0000000..be106ca --- /dev/null +++ b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/.npmignore @@ -0,0 +1,2 @@ +*.sw* +node_modules/ diff --git a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/.travis.yml b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/.travis.yml new file mode 100644 index 0000000..895dbd3 --- /dev/null +++ b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - 0.6 + - 0.8 diff --git a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/History.md b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/History.md new file mode 100644 index 0000000..8132c95 --- /dev/null +++ b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/History.md @@ -0,0 +1,23 @@ + +0.0.4 / 2013-01-07 +================== + + * added component.json #1 [jkroso](https://github.com/jkroso) + * reversed array loop #1 [jkroso](https://github.com/jkroso) + * remove fn params + +0.0.3 / 2012-09-29 +================== + + * faster with negative start args + +0.0.2 / 2012-09-29 +================== + + * support full [].slice semantics + +0.0.1 / 2012-09-29 +=================== + + * initial release + diff --git a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/LICENSE b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/LICENSE new file mode 100644 index 0000000..38c529d --- /dev/null +++ b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2012 [Aaron Heckmann](aaron.heckmann+github@gmail.com) + +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. diff --git a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/Makefile b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/Makefile new file mode 100644 index 0000000..3dd8a2d --- /dev/null +++ b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/Makefile @@ -0,0 +1,5 @@ + +test: + @time ./node_modules/.bin/mocha $(T) $(TESTS) + +.PHONY: test diff --git a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/README.md b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/README.md new file mode 100644 index 0000000..6605c39 --- /dev/null +++ b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/README.md @@ -0,0 +1,62 @@ +#sliced +========== + +A faster alternative to `[].slice.call(arguments)`. + +[![Build Status](https://secure.travis-ci.org/aheckmann/sliced.png)](http://travis-ci.org/aheckmann/sliced) + +Example output from [benchmark.js](https://github.com/bestiejs/benchmark.js) + + Array.prototype.slice.call x 1,320,205 ops/sec ±2.35% (92 runs sampled) + [].slice.call x 1,314,605 ops/sec ±1.60% (95 runs sampled) + cached slice.call x 10,468,380 ops/sec ±1.45% (95 runs sampled) + sliced x 16,608,237 ops/sec ±1.40% (92 runs sampled) + fastest is sliced + + Array.prototype.slice.call(arguments, 1) x 1,383,584 ops/sec ±1.73% (97 runs sampled) + [].slice.call(arguments, 1) x 1,494,735 ops/sec ±1.33% (95 runs sampled) + cached slice.call(arguments, 1) x 10,085,270 ops/sec ±1.51% (97 runs sampled) + sliced(arguments, 1) x 16,620,480 ops/sec ±1.29% (95 runs sampled) + fastest is sliced(arguments, 1) + + Array.prototype.slice.call(arguments, -1) x 1,303,262 ops/sec ±1.62% (94 runs sampled) + [].slice.call(arguments, -1) x 1,325,615 ops/sec ±1.36% (97 runs sampled) + cached slice.call(arguments, -1) x 9,673,603 ops/sec ±1.70% (96 runs sampled) + sliced(arguments, -1) x 16,384,575 ops/sec ±1.06% (91 runs sampled) + fastest is sliced(arguments, -1) + + Array.prototype.slice.call(arguments, -2, -10) x 1,404,390 ops/sec ±1.61% (95 runs sampled) + [].slice.call(arguments, -2, -10) x 1,514,367 ops/sec ±1.21% (96 runs sampled) + cached slice.call(arguments, -2, -10) x 9,836,017 ops/sec ±1.21% (95 runs sampled) + sliced(arguments, -2, -10) x 18,544,882 ops/sec ±1.30% (91 runs sampled) + fastest is sliced(arguments, -2, -10) + + Array.prototype.slice.call(arguments, -2, -1) x 1,458,604 ops/sec ±1.41% (97 runs sampled) + [].slice.call(arguments, -2, -1) x 1,536,547 ops/sec ±1.63% (99 runs sampled) + cached slice.call(arguments, -2, -1) x 10,060,633 ops/sec ±1.37% (96 runs sampled) + sliced(arguments, -2, -1) x 18,608,712 ops/sec ±1.08% (93 runs sampled) + fastest is sliced(arguments, -2, -1) + +_Benchmark [source](https://github.com/aheckmann/sliced/blob/master/bench.js)._ + +##Usage + +`sliced` accepts the same arguments as `Array#slice` so you can easily swap it out. + +```js +function zing () { + var slow = [].slice.call(arguments, 1, 8); + var args = slice(arguments, 1, 8); + + var slow = Array.prototype.slice.call(arguments); + var args = slice(arguments); + // etc +} +``` + +## install + + npm install sliced + + +[LICENSE](https://github.com/aheckmann/sliced/blob/master/LICENSE) diff --git a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/bench.js b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/bench.js new file mode 100644 index 0000000..f201d16 --- /dev/null +++ b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/bench.js @@ -0,0 +1,95 @@ + +var sliced = require('./') +var Bench = require('benchmark'); +var s = new Bench.Suite; +var slice = [].slice; + +s.add('Array.prototype.slice.call', function () { + Array.prototype.slice.call(arguments); +}).add('[].slice.call', function () { + [].slice.call(arguments); +}).add('cached slice.call', function () { + slice.call(arguments) +}).add('sliced', function () { + sliced(arguments) +}).on('cycle', function (evt) { + console.log(String(evt.target)); +}).on('complete', function () { + console.log('fastest is %s', this.filter('fastest').pluck('name')); +}) +.run(); + +var s = new Bench.Suite; +s.add('Array.prototype.slice.call(arguments, 1)', function () { + Array.prototype.slice.call(arguments, 1); +}).add('[].slice.call(arguments, 1)', function () { + [].slice.call(arguments, 1); +}).add('cached slice.call(arguments, 1)', function () { + slice.call(arguments, 1) +}).add('sliced(arguments, 1)', function () { + sliced(arguments, 1) +}).on('cycle', function (evt) { + console.log(String(evt.target)); +}).on('complete', function () { + console.log('fastest is %s', this.filter('fastest').pluck('name')); +}) +.run(); + +var s = new Bench.Suite; +s.add('Array.prototype.slice.call(arguments, -1)', function () { + Array.prototype.slice.call(arguments, -1); +}).add('[].slice.call(arguments, -1)', function () { + [].slice.call(arguments, -1); +}).add('cached slice.call(arguments, -1)', function () { + slice.call(arguments, -1) +}).add('sliced(arguments, -1)', function () { + sliced(arguments, -1) +}).on('cycle', function (evt) { + console.log(String(evt.target)); +}).on('complete', function () { + console.log('fastest is %s', this.filter('fastest').pluck('name')); +}) +.run(); + +var s = new Bench.Suite; +s.add('Array.prototype.slice.call(arguments, -2, -10)', function () { + Array.prototype.slice.call(arguments, -2, -10); +}).add('[].slice.call(arguments, -2, -10)', function () { + [].slice.call(arguments, -2, -10); +}).add('cached slice.call(arguments, -2, -10)', function () { + slice.call(arguments, -2, -10) +}).add('sliced(arguments, -2, -10)', function () { + sliced(arguments, -2, -10) +}).on('cycle', function (evt) { + console.log(String(evt.target)); +}).on('complete', function () { + console.log('fastest is %s', this.filter('fastest').pluck('name')); +}) +.run(); + +var s = new Bench.Suite; +s.add('Array.prototype.slice.call(arguments, -2, -1)', function () { + Array.prototype.slice.call(arguments, -2, -1); +}).add('[].slice.call(arguments, -2, -1)', function () { + [].slice.call(arguments, -2, -1); +}).add('cached slice.call(arguments, -2, -1)', function () { + slice.call(arguments, -2, -1) +}).add('sliced(arguments, -2, -1)', function () { + sliced(arguments, -2, -1) +}).on('cycle', function (evt) { + console.log(String(evt.target)); +}).on('complete', function () { + console.log('fastest is %s', this.filter('fastest').pluck('name')); +}) +.run(); + +/** + * Output: + * + * Array.prototype.slice.call x 1,289,592 ops/sec ±2.88% (87 runs sampled) + * [].slice.call x 1,345,451 ops/sec ±1.68% (97 runs sampled) + * cached slice.call x 10,719,886 ops/sec ±1.04% (99 runs sampled) + * sliced x 15,809,545 ops/sec ±1.46% (93 runs sampled) + * fastest is sliced + * + */ diff --git a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/component.json b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/component.json new file mode 100644 index 0000000..a7ac7f2 --- /dev/null +++ b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/component.json @@ -0,0 +1,13 @@ +{ + "name": "sliced", + "version": "0.0.3", + "description": "A faster Node.js alternative to Array.prototype.slice.call(arguments)", + "repo" : "aheckmann/sliced", + "keywords": [ + "arguments", + "slice", + "array" + ], + "author": "Aaron Heckmann ", + "license": "MIT" +} diff --git a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/index.js b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/index.js new file mode 100644 index 0000000..3b90ae7 --- /dev/null +++ b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/index.js @@ -0,0 +1 @@ +module.exports = exports = require('./lib/sliced'); diff --git a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/lib/sliced.js b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/lib/sliced.js new file mode 100644 index 0000000..d8c15bc --- /dev/null +++ b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/lib/sliced.js @@ -0,0 +1,37 @@ + +/** + * An Array.prototype.slice.call(arguments) alternative + * + * @param {Object} args something with a length + * @param {Number} slice + * @param {Number} sliceEnd + * @api public + */ + +module.exports = function () { + var args = arguments[0]; + var slice = arguments[1]; + var sliceEnd = arguments[2]; + + var ret = []; + var len = args.length; + + if (0 === len) return ret; + + var start = slice < 0 + ? Math.max(0, slice + len) + : slice || 0; + + var end = 3 === arguments.length + ? sliceEnd < 0 + ? sliceEnd + len + : sliceEnd + : len; + + while (end-- > start) { + ret[end - start] = args[end]; + } + + return ret; +} + diff --git a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/package.json b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/package.json new file mode 100644 index 0000000..c5af598 --- /dev/null +++ b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/package.json @@ -0,0 +1,30 @@ +{ + "name": "sliced", + "version": "0.0.4", + "description": "A faster Node.js alternative to Array.prototype.slice.call(arguments)", + "main": "index.js", + "scripts": { + "test": "make test" + }, + "repository": { + "type": "git", + "url": "git://github.com/aheckmann/sliced" + }, + "keywords": [ + "arguments", + "slice", + "array" + ], + "author": { + "name": "Aaron Heckmann", + "email": "aaron.heckmann+github@gmail.com" + }, + "license": "MIT", + "devDependencies": { + "mocha": "1.5.0", + "benchmark": "~1.0.0" + }, + "readme": "#sliced\n==========\n\nA faster alternative to `[].slice.call(arguments)`.\n\n[![Build Status](https://secure.travis-ci.org/aheckmann/sliced.png)](http://travis-ci.org/aheckmann/sliced)\n\nExample output from [benchmark.js](https://github.com/bestiejs/benchmark.js)\n\n Array.prototype.slice.call x 1,320,205 ops/sec ±2.35% (92 runs sampled)\n [].slice.call x 1,314,605 ops/sec ±1.60% (95 runs sampled)\n cached slice.call x 10,468,380 ops/sec ±1.45% (95 runs sampled)\n sliced x 16,608,237 ops/sec ±1.40% (92 runs sampled)\n fastest is sliced\n\n Array.prototype.slice.call(arguments, 1) x 1,383,584 ops/sec ±1.73% (97 runs sampled)\n [].slice.call(arguments, 1) x 1,494,735 ops/sec ±1.33% (95 runs sampled)\n cached slice.call(arguments, 1) x 10,085,270 ops/sec ±1.51% (97 runs sampled)\n sliced(arguments, 1) x 16,620,480 ops/sec ±1.29% (95 runs sampled)\n fastest is sliced(arguments, 1)\n\n Array.prototype.slice.call(arguments, -1) x 1,303,262 ops/sec ±1.62% (94 runs sampled)\n [].slice.call(arguments, -1) x 1,325,615 ops/sec ±1.36% (97 runs sampled)\n cached slice.call(arguments, -1) x 9,673,603 ops/sec ±1.70% (96 runs sampled)\n sliced(arguments, -1) x 16,384,575 ops/sec ±1.06% (91 runs sampled)\n fastest is sliced(arguments, -1)\n\n Array.prototype.slice.call(arguments, -2, -10) x 1,404,390 ops/sec ±1.61% (95 runs sampled)\n [].slice.call(arguments, -2, -10) x 1,514,367 ops/sec ±1.21% (96 runs sampled)\n cached slice.call(arguments, -2, -10) x 9,836,017 ops/sec ±1.21% (95 runs sampled)\n sliced(arguments, -2, -10) x 18,544,882 ops/sec ±1.30% (91 runs sampled)\n fastest is sliced(arguments, -2, -10)\n\n Array.prototype.slice.call(arguments, -2, -1) x 1,458,604 ops/sec ±1.41% (97 runs sampled)\n [].slice.call(arguments, -2, -1) x 1,536,547 ops/sec ±1.63% (99 runs sampled)\n cached slice.call(arguments, -2, -1) x 10,060,633 ops/sec ±1.37% (96 runs sampled)\n sliced(arguments, -2, -1) x 18,608,712 ops/sec ±1.08% (93 runs sampled)\n fastest is sliced(arguments, -2, -1)\n\n_Benchmark [source](https://github.com/aheckmann/sliced/blob/master/bench.js)._\n\n##Usage\n\n`sliced` accepts the same arguments as `Array#slice` so you can easily swap it out.\n\n```js\nfunction zing () {\n var slow = [].slice.call(arguments, 1, 8);\n var args = slice(arguments, 1, 8);\n\n var slow = Array.prototype.slice.call(arguments);\n var args = slice(arguments);\n // etc\n}\n```\n\n## install\n\n npm install sliced\n\n\n[LICENSE](https://github.com/aheckmann/sliced/blob/master/LICENSE)\n", + "_id": "sliced@0.0.4", + "_from": "sliced@0.0.4" +} diff --git a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/test/index.js b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/test/index.js new file mode 100644 index 0000000..33d36a1 --- /dev/null +++ b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/test/index.js @@ -0,0 +1,80 @@ + +var sliced = require('../') +var assert = require('assert') + +describe('sliced', function(){ + it('exports a function', function(){ + assert.equal('function', typeof sliced); + }) + describe('with 1 arg', function(){ + it('returns an array of the arg', function(){ + var o = [3, "4", {}]; + var r = sliced(o); + assert.equal(3, r.length); + assert.equal(o[0], r[0]); + assert.equal(o[1], r[1]); + assert.equal(o[1], r[1]); + }) + }) + describe('with 2 args', function(){ + it('returns an array of the arg starting at the 2nd arg', function(){ + var o = [3, "4", 5, null]; + var r = sliced(o, 2); + assert.equal(2, r.length); + assert.equal(o[2], r[0]); + assert.equal(o[3], r[1]); + }) + }) + describe('with 3 args', function(){ + it('returns an array of the arg from the 2nd to the 3rd arg', function(){ + var o = [3, "4", 5, null]; + var r = sliced(o, 1, 2); + assert.equal(1, r.length); + assert.equal(o[1], r[0]); + }) + }) + describe('with negative start and no end', function(){ + it('begins at an offset from the end and includes all following elements', function(){ + var o = [3, "4", 5, null]; + var r = sliced(o, -2); + assert.equal(2, r.length); + assert.equal(o[2], r[0]); + assert.equal(o[3], r[1]); + + var r = sliced(o, -12); + assert.equal(4, r.length); + assert.equal(o[0], r[0]); + assert.equal(o[1], r[1]); + }) + }) + describe('with negative start and positive end', function(){ + it('begins at an offset from the end and includes `end` elements', function(){ + var o = [3, "4", {x:1}, null]; + + var r = sliced(o, -2, 1); + assert.equal(0, r.length); + + var r = sliced(o, -2, 2); + assert.equal(0, r.length); + + var r = sliced(o, -2, 3); + assert.equal(1, r.length); + assert.equal(o[2], r[0]); + }) + }) + describe('with negative start and negative end', function(){ + it('begins at `start` offset from the end and includes all elements up to `end` offset from the end', function(){ + var o = [3, "4", {x:1}, null]; + var r = sliced(o, -3, -1); + assert.equal(2, r.length); + assert.equal(o[1], r[0]); + assert.equal(o[2], r[1]); + + var r = sliced(o, -3, -3); + assert.equal(0, r.length); + + var r = sliced(o, -3, -4); + assert.equal(0, r.length); + }) + }) +}) diff --git a/node_modules/mongoose/node_modules/mpromise/package.json b/node_modules/mongoose/node_modules/mpromise/package.json new file mode 100644 index 0000000..bbda943 --- /dev/null +++ b/node_modules/mongoose/node_modules/mpromise/package.json @@ -0,0 +1,35 @@ +{ + "name": "mpromise", + "version": "0.2.1", + "description": "Promises A+ conformant implementation", + "main": "index.js", + "scripts": { + "test": "make test" + }, + "dependencies": { + "sliced": "0.0.4" + }, + "devDependencies": { + "mocha": "1.7.4", + "promises-aplus-tests": ">= 1.2" + }, + "repository": { + "type": "git", + "url": "git://github.com/aheckmann/mpromise" + }, + "keywords": [ + "promise", + "mongoose", + "aplus", + "a+", + "plus" + ], + "author": { + "name": "Aaron Heckmann", + "email": "aaron.heckmann+github@gmail.com" + }, + "license": "MIT", + "readme": "#mpromise\n==========\n\nA [promises/A+](https://github.com/promises-aplus/promises-spec) conformant implementation, written for [mongoose](http://mongoosejs.com).\n\n## installation\n\n```\n$ npm install mpromise\n```\n\n## docs\n\nAn `mpromise` can be in any of three states, pending, fulfilled (success), or rejected (error). Once it is either fulfilled or rejected it's state can no longer be changed.\n\nThe exports object is the Promise constructor.\n\n```js\nvar Promise = require('mpromise');\n```\n\nThe constructor accepts an optional function which is executed when the promise is first resolved (either fulfilled or rejected).\n\n```js\nvar promise = new Promise(fn);\n```\n\nThis is the same as passing the `fn` to `onResolve` directly.\n\n```js\nvar promise = new Promise;\npromise.onResolve(function (err, args..) {\n ...\n});\n```\n\n### Methods\n\n####fulfill\n\nFulfilling a promise with values:\n\n```js\nvar promise = new Promise;\npromise.fulfill(args...);\n```\n\nIf the promise has already been fulfilled or rejected, no action is taken.\n\n####reject\n\nRejecting a promise with a reason:\n\n```js\nvar promise = new Promise;\npromise.reject(reason);\n```\n\nIf the promise has already been fulfilled or rejected, no action is taken.\n\n####resolve\n\nNode.js callback style promise resolution `(err, args...)`:\n\n```js\nvar promise = new Promise;\npromise.resolve([reason], [arg1, arg2, ...]);\n```\n\nIf the promise has already been fulfilled or rejected, no action is taken.\n\n####onFulfill\n\nTo register a function for execution when the promise is fulfilled, pass it to `onFulfill`. When executed it will receive the arguments passed to `fulfill()`.\n\n```js\nvar promise = new Promise;\npromise.onFulfill(function (a, b) {\n assert.equal(3, a + b);\n});\npromise.fulfill(1, 2);\n```\n\nThe function will only be called once when the promise is fulfilled, never when rejected.\n\nRegistering a function with `onFulfill` after the promise has already been fulfilled results in the immediate execution of the function with the original arguments used to fulfill the promise.\n\n```js\nvar promise = new Promise;\npromise.fulfill(\" :D \");\npromise.onFulfill(function (arg) {\n console.log(arg); // logs \" :D \"\n})\n```\n\n####onReject\n\nTo register a function for execution when the promise is rejected, pass it to `onReject`. When executed it will receive the argument passed to `reject()`.\n\n```js\nvar promise = new Promise;\npromise.onReject(function (reason) {\n assert.equal('sad', reason);\n});\npromise.reject('sad');\n```\n\nThe function will only be called once when the promise is rejected, never when fulfilled.\n\nRegistering a function with `onReject` after the promise has already been rejected results in the immediate execution of the function with the original argument used to reject the promise.\n\n```js\nvar promise = new Promise;\npromise.reject(\" :( \");\npromise.onReject(function (reason) {\n console.log(reason); // logs \" :( \"\n})\n```\n\n####onResolve\n\nAllows registration of node.js style callbacks `(err, args..)` to handle either promise resolution type (fulfill or reject).\n\n```js\n// fulfillment\nvar promise = new Promise;\npromise.onResolve(function (err, a, b) {\n console.log(a + b); // logs 3\n});\npromise.fulfill(1, 2);\n\n// rejection\nvar promise = new Promise;\npromise.onResolve(function (err) {\n if (err) {\n console.log(err.message); // logs \"failed\"\n }\n});\npromise.reject(new Error('failed'));\n```\n\n####then\n\nCreates a new promise and returns it. If `onFulfill` or `onReject` are passed, they are added as SUCCESS/ERROR callbacks to this promise after the nextTick.\n\nConforms to [promises/A+](https://github.com/promises-aplus/promises-spec) specification and passes its [tests](https://github.com/promises-aplus/promises-tests).\n\n```js\n// promise.then(onFulfill, onReject);\n\nvar p = new Promise;\n\np.then(function (arg) {\n return arg + 1;\n}).then(function (arg) {\n throw new Error(arg + ' is an error!');\n}).then(null, function (err) {\n assert.ok(err instanceof Error);\n assert.equal('2 is an error', err.message);\n});\np.complete(1);\n```\n\n####end\n\nSignifies that this promise was the last in a chain of `then()s`: if a handler passed to the call to `then` which produced this promise throws, the exception will go uncaught.\n\n```js\nvar p = new Promise;\np.then(function(){ throw new Error('shucks') });\nsetTimeout(function () {\n p.fulfill();\n // error was caught and swallowed by the promise returned from\n // p.then(). we either have to always register handlers on\n // the returned promises or we can do the following...\n}, 10);\n\n// this time we use .end() which prevents catching thrown errors\nvar p = new Promise;\nvar p2 = p.then(function(){ throw new Error('shucks') }).end(); // <--\nsetTimeout(function () {\n p.fulfill(); // throws \"shucks\"\n}, 10);\n```\n\n###Event names\n\nIf you'd like to alter this implementations event names used to signify success and failure you may do so by setting `Promise.SUCCESS` or `Promise.FAILURE` respectively.\n\n```js\nPromise.SUCCESS = 'complete';\nPromise.FAILURE = 'err';\n```\n\n###Luke, use the Source\nFor more ideas read the [source](https://github.com/aheckmann/mpromise/blob/master/lib), [tests](https://github.com/aheckmann/mpromise/blob/master/test), or the [mongoose implementation](https://github.com/LearnBoost/mongoose/blob/3.6x/lib/promise.js).\n\n## license\n\n[MIT](https://github.com/aheckmann/mpromise/blob/master/LICENSE)\n", + "_id": "mpromise@0.2.1", + "_from": "mpromise@0.2.1" +} diff --git a/node_modules/mongoose/node_modules/mpromise/test/promise.test.js b/node_modules/mongoose/node_modules/mpromise/test/promise.test.js new file mode 100644 index 0000000..45f6e29 --- /dev/null +++ b/node_modules/mongoose/node_modules/mpromise/test/promise.test.js @@ -0,0 +1,201 @@ + +/** + * Module dependencies. + */ + +var assert = require('assert') +var Promise = require('../lib/promise'); + +/** + * Test. + */ + +describe('promise', function(){ + it('events fire right after fulfill()', function(done){ + var promise = new Promise() + , called = 0; + + promise.on('fulfill', function (a, b) { + assert.equal(a, '1'); + assert.equal(b, '2'); + called++; + }); + + promise.fulfill('1', '2'); + + promise.on('fulfill', function (a, b) { + assert.equal(a, '1'); + assert.equal(b, '2'); + called++; + }); + + assert.equal(2, called); + done(); + }); + + it('events fire right after reject()', function(done){ + var promise = new Promise() + , called = 0; + + promise.on('reject', function (err) { + assert.ok(err instanceof Error); + called++; + }); + + promise.reject(new Error('booyah')); + + promise.on('reject', function (err) { + assert.ok(err instanceof Error); + called++; + }); + + assert.equal(2, called); + done() + }); + + describe('onResolve()', function(){ + it('from constructor works', function(done){ + var called = 0; + + var promise = new Promise(function (err) { + assert.ok(err instanceof Error); + called++; + }) + + promise.reject(new Error('dawg')); + + assert.equal(1, called); + done(); + }); + + it('after fulfill()', function(done){ + var promise = new Promise() + , called = 0; + + promise.fulfill('woot'); + + promise.onResolve(function (err, data){ + assert.equal(data,'woot'); + called++; + }); + + promise.onResolve(function (err, data){ + assert.strictEqual(err, null); + called++; + }); + + assert.equal(2, called); + done(); + }) + }); + + describe('onFulfill shortcut', function(){ + it('works', function(done){ + var promise = new Promise() + , called = 0; + + promise.onFulfill(function (woot) { + assert.strictEqual(woot, undefined); + called++; + }); + + promise.fulfill(); + + assert.equal(1, called); + done(); + }) + }) + + describe('onReject shortcut', function(){ + it('works', function(done){ + var promise = new Promise() + , called = 0; + + promise.onReject(function (err) { + assert.ok(err instanceof Error); + called++; + }); + + promise.reject(new Error); + assert.equal(1, called); + done(); + }) + }); + + describe('return values', function(){ + it('on()', function(done){ + var promise = new Promise() + assert.ok(promise.on('jump', function(){}) instanceof Promise); + done() + }); + + it('onFulfill()', function(done){ + var promise = new Promise() + assert.ok(promise.onFulfill(function(){}) instanceof Promise); + done(); + }) + it('onReject()', function(done){ + var promise = new Promise() + assert.ok(promise.onReject(function(){}) instanceof Promise); + done(); + }) + it('onResolve()', function(done){ + var promise = new Promise() + assert.ok(promise.onResolve(function(){}) instanceof Promise); + done(); + }) + }) + + describe('casting errors', function(){ + describe('reject()', function(){ + it('does not cast arguments to Error', function(done){ + var p = new Promise(function (err, arg) { + assert.equal(3, err); + done(); + }); + + p.reject(3); + }) + }) + }) + + describe('then catching', function(){ + it('should not catch returned promise fulfillments', function(done){ + var p1 = new Promise; + + var p2 = p1.then(function () { return 'step 1' }) + + p2.onFulfill(function () { throw new Error('fulfill threw me') }) + p2.reject = assert.ifError.bind(assert, new Error('reject should not have been called')); + + setTimeout(function () { + assert.throws(function () { + p1.fulfill(); + }, /fulfill threw me/) + done(); + }, 10); + + }) + + it('can be disabled using .end()', function(done){ + var p = new Promise; + + var p2 = p.then(function () { throw new Error('shucks') }) + p2.end(); + + setTimeout(function () { + try { + p.fulfill(); + } catch (err) { + assert.ok(/shucks/.test(err)) + done(); + } + + setTimeout(function () { + done(new Error('error was swallowed')); + }, 10); + + }, 10); + }) + }) +}) diff --git a/node_modules/mongoose/node_modules/mpromise/test/promises-A.js b/node_modules/mongoose/node_modules/mpromise/test/promises-A.js new file mode 100644 index 0000000..ebb4626 --- /dev/null +++ b/node_modules/mongoose/node_modules/mpromise/test/promises-A.js @@ -0,0 +1,35 @@ + +/** + * Module dependencies. + */ + +var assert = require('assert') +var Promise = require('../lib/promise'); +var aplus = require('promises-aplus-tests'); + +// tests + +var adapter = {}; +adapter.fulfilled = function (value) { + var p = new Promise; + p.fulfill(value); + return p; +}; +adapter.rejected = function (reason) { + var p = new Promise; + p.reject(reason); + return p; +} +adapter.pending = function () { + var p = new Promise; + return { + promise: p + , fulfill: p.fulfill.bind(p) + , reject: p.reject.bind(p) + } +} + +aplus(adapter, function (err) { + assert.ifError(err); +}); + diff --git a/node_modules/mongoose/node_modules/ms/package.json b/node_modules/mongoose/node_modules/ms/package.json index 5589661..9ede799 100644 --- a/node_modules/mongoose/node_modules/ms/package.json +++ b/node_modules/mongoose/node_modules/ms/package.json @@ -10,8 +10,5 @@ }, "readme": "\n# ms.js\n\nEver find yourself doing math in your head or writing `1000 * 60 * 60 …`?\nDon't want to add obstrusive `Number` prototype extensions to your reusable\n/ distributable modules and projects?\n\n`ms` is a tiny utility that you can leverage when your application needs to\naccept a number of miliseconds as a parameter.\n\nIf a number is supplied to `ms`, it returns it immediately (e.g:\nIf a string that contains the number is supplied, it returns it immediately as\na number (e.g: it returns `100` for `'100'`).\n\nHowever, if you pass a string with a number and a valid unit, hte number of\nequivalent ms is returned.\n\n```js\nms('1d') // 86400000\nms('10h') // 36000000\nms('2h') // 7200000\nms('1m') // 60000\nms('5ms') // 5000\nms('100') // '100'\nms(100) // 100\n```\n\n## How to use\n\n### Node\n\n```js\nrequire('ms')\n```\n\n### Browser\n\n```html\n\n```\n\n## Credits\n\n(The MIT License)\n\nCopyright (c) 2011 Guillermo Rauch <guillermo@learnboost.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", "_id": "ms@0.1.0", - "dist": { - "shasum": "183ab5a22f6d962cba8a360fa730d339c6a64bd0" - }, "_from": "ms@0.1.0" } diff --git a/node_modules/mongoose/node_modules/muri/package.json b/node_modules/mongoose/node_modules/muri/package.json index 50342ee..e4e87da 100644 --- a/node_modules/mongoose/node_modules/muri/package.json +++ b/node_modules/mongoose/node_modules/muri/package.json @@ -25,8 +25,5 @@ }, "readme": "#Meet Muri!\n\nMuri is your friendly neighborhood [MongoDB URI](http://www.mongodb.org/display/DOCS/Connections) parser for Node.js.\n\n\n###Install\n\n $ npm install muri\n\n###Use\n\n```js\n var muri = require('muri');\n var o = muri('mongodb://user:pass@local,remote:27018,japan:27019/neatdb?replicaSet=myreplset&journal=true&w=2&wtimeoutMS=50');\n\n console.log(o);\n\n { hosts: [ { host: 'local', port: 27017 },\n { host: 'remote', port: 27018 },\n { host: 'japan', port: 27019 } ],\n db: 'neatdb',\n options: {\n replicaSet: 'myreplset',\n journal: true,\n w: 2,\n wtimeoutMS: 50\n },\n auth: {\n user: 'user',\n pass: 'pass'\n }\n }\n```\n\n### Details\n\nThe returned object contains the following properties:\n\n- db: the name of the database. defaults to \"admin\" if not specified\n- auth: if auth is specified, this object will exist `{ user: 'username', pass: 'password' }`\n- hosts: array of host/port objects, one for each specified `[{ host: 'local', port: 27107 }, { host: '..', port: port }]`\n - if a port is not specified for a given host, the default port (27017) is used\n - if a unix domain socket is passed, host/port will be undefined and `ipc` will be set to the value specified `[{ ipc: '/tmp/mongodb-27017' }]`\n- options: this is a hash of all options specified in the querystring\n\n[LICENSE](https://github.com/aheckmann/muri/blob/master/LICENSE)\n", "_id": "muri@0.3.1", - "dist": { - "shasum": "7e43fde365829845784c843a16905e69a5259e79" - }, "_from": "muri@0.3.1" } diff --git a/node_modules/mongoose/node_modules/sliced/package.json b/node_modules/mongoose/node_modules/sliced/package.json index 0a46440..ae347e5 100644 --- a/node_modules/mongoose/node_modules/sliced/package.json +++ b/node_modules/mongoose/node_modules/sliced/package.json @@ -26,8 +26,5 @@ }, "readme": "#sliced\n==========\n\nA faster alternative to `[].slice.call(arguments)`.\n\n[![Build Status](https://secure.travis-ci.org/aheckmann/sliced.png)](http://travis-ci.org/aheckmann/sliced)\n\nExample output from [benchmark.js](https://github.com/bestiejs/benchmark.js)\n\n Array.prototype.slice.call x 1,320,205 ops/sec ±2.35% (92 runs sampled)\n [].slice.call x 1,314,605 ops/sec ±1.60% (95 runs sampled)\n cached slice.call x 10,468,380 ops/sec ±1.45% (95 runs sampled)\n sliced x 16,608,237 ops/sec ±1.40% (92 runs sampled)\n fastest is sliced\n\n Array.prototype.slice.call(arguments, 1) x 1,383,584 ops/sec ±1.73% (97 runs sampled)\n [].slice.call(arguments, 1) x 1,494,735 ops/sec ±1.33% (95 runs sampled)\n cached slice.call(arguments, 1) x 10,085,270 ops/sec ±1.51% (97 runs sampled)\n sliced(arguments, 1) x 16,620,480 ops/sec ±1.29% (95 runs sampled)\n fastest is sliced(arguments, 1)\n\n Array.prototype.slice.call(arguments, -1) x 1,303,262 ops/sec ±1.62% (94 runs sampled)\n [].slice.call(arguments, -1) x 1,325,615 ops/sec ±1.36% (97 runs sampled)\n cached slice.call(arguments, -1) x 9,673,603 ops/sec ±1.70% (96 runs sampled)\n sliced(arguments, -1) x 16,384,575 ops/sec ±1.06% (91 runs sampled)\n fastest is sliced(arguments, -1)\n\n Array.prototype.slice.call(arguments, -2, -10) x 1,404,390 ops/sec ±1.61% (95 runs sampled)\n [].slice.call(arguments, -2, -10) x 1,514,367 ops/sec ±1.21% (96 runs sampled)\n cached slice.call(arguments, -2, -10) x 9,836,017 ops/sec ±1.21% (95 runs sampled)\n sliced(arguments, -2, -10) x 18,544,882 ops/sec ±1.30% (91 runs sampled)\n fastest is sliced(arguments, -2, -10)\n\n Array.prototype.slice.call(arguments, -2, -1) x 1,458,604 ops/sec ±1.41% (97 runs sampled)\n [].slice.call(arguments, -2, -1) x 1,536,547 ops/sec ±1.63% (99 runs sampled)\n cached slice.call(arguments, -2, -1) x 10,060,633 ops/sec ±1.37% (96 runs sampled)\n sliced(arguments, -2, -1) x 18,608,712 ops/sec ±1.08% (93 runs sampled)\n fastest is sliced(arguments, -2, -1)\n\n_Benchmark [source](https://github.com/aheckmann/sliced/blob/master/bench.js)._\n\n##Usage\n\n`sliced` accepts the same arguments as `Array#slice` so you can easily swap it out.\n\n```js\nfunction zing () {\n var slow = [].slice.call(arguments, 1, 8);\n var args = slice(arguments, 1, 8);\n\n var slow = Array.prototype.slice.call(arguments);\n var args = slice(arguments);\n // etc\n}\n```\n\n## install\n\n npm install sliced\n\n\n[LICENSE](https://github.com/aheckmann/sliced/blob/master/LICENSE)\n", "_id": "sliced@0.0.3", - "dist": { - "shasum": "4f0bac2171eb17162c3ba6df81f5cf040f7c7e50" - }, "_from": "sliced@0.0.3" } diff --git a/node_modules/mongoose/package.json b/node_modules/mongoose/package.json index 18f2465..d427b14 100644 --- a/node_modules/mongoose/package.json +++ b/node_modules/mongoose/package.json @@ -1,7 +1,7 @@ { "name": "mongoose", "description": "Mongoose MongoDB ODM", - "version": "3.5.7", + "version": "3.6.4", "author": { "name": "Guillermo Rauch", "email": "guillermo@learnboost.com" @@ -20,18 +20,21 @@ ], "dependencies": { "hooks": "0.2.1", - "mongodb": "1.2.13", + "mongodb": "1.2.14", "ms": "0.1.0", "sliced": "0.0.3", - "muri": "0.3.1" + "muri": "0.3.1", + "mpromise": "0.2.1", + "mpath": "0.1.1" }, "devDependencies": { - "mocha": "1.7.4", + "mocha": "1.8.1", "node-static": "0.5.9", "dox": "0.3.1", "jade": "0.26.3", "highlight.js": "7.0.1", - "markdown": "0.3.1" + "markdown": "0.3.1", + "promises-aplus-tests": ">= 1.0.2" }, "directories": { "lib": "./lib/mongoose" @@ -53,9 +56,6 @@ }, "homepage": "http://mongoosejs.com", "readme": "## What's Mongoose?\n\nMongoose is a [MongoDB](http://www.mongodb.org/) object modeling tool designed to work in an asynchronous environment.\n\n## Documentation\n\n[mongoosejs.com](http://mongoosejs.com/)\n\n## Try it live\n\n\n## Support\n\n - [Stack Overflow](http://stackoverflow.com/questions/tagged/mongoose)\n - [bug reports](https://github.com/learnboost/mongoose/issues/)\n - [help forum](http://groups.google.com/group/mongoose-orm)\n - [10gen support](http://www.mongodb.org/display/DOCS/Technical+Support)\n - (irc) #mongoosejs on freenode\n\n## Installation\n\nFirst install [node.js](http://nodejs.org/) and [mongodb](http://www.mongodb.org/downloads).\n\n $ npm install mongoose\n\n## Plugins\n\nCheck out the [plugins search site](http://plugins.mongoosejs.com/) to see hundreds of related modules from the community.\n\n## Contributors\n\nView all 80+ [contributors](https://github.com/learnboost/mongoose/graphs/contributors).\n\n## Get Involved\n\nStand up and be counted as a [contributor](https://github.com/LearnBoost/mongoose/blob/master/CONTRIBUTING.md) to mongoose too!\n\n## Overview\n\n### Connecting to MongoDB\n\nFirst, we need to define a connection. If your app uses only one database, you should use `mongose.connect`. If you need to create additional connections, use `mongoose.createConnection`.\n\nBoth `connect` and `createConnection` take a `mongodb://` URI, or the parameters `host, database, port, options`.\n\n var mongoose = require('mongoose');\n\n mongoose.connect('mongodb://localhost/my_database');\n\nOnce connected, the `open` event is fired on the `Connection` instance. If you're using `mongoose.connect`, the `Connection` is `mongoose.connection`. Otherwise, `mongoose.createConnection` return value is a `Connection`.\n\n**Important!** Mongoose buffers all the commands until it's connected to the database. This means that you don't have to wait until it connects to MongoDB in order to define models, run queries, etc.\n\n### Defining a Model\n\nModels are defined through the `Schema` interface. \n\n var Schema = mongoose.Schema\n , ObjectId = Schema.ObjectId;\n\n var BlogPost = new Schema({\n author : ObjectId\n , title : String\n , body : String\n , date : Date\n });\n\nAside from defining the structure of your documents and the types of data you're storing, a Schema handles the definition of:\n\n* [Validators](http://mongoosejs.com/docs/validation.html) (async and sync)\n* [Defaults](http://mongoosejs.com/docs/api.html#schematype_SchemaType-default)\n* [Getters](http://mongoosejs.com/docs/api.html#schematype_SchemaType-get)\n* [Setters](http://mongoosejs.com/docs/api.html#schematype_SchemaType-set)\n* [Indexes](http://mongoosejs.com/docs/guide.html#indexes)\n* [Middleware](http://mongoosejs.com/docs/middleware.html)\n* [Methods](http://mongoosejs.com/docs/guide.html#methods) definition\n* [Statics](http://mongoosejs.com/docs/guide.html#statics) definition\n* [Plugins](http://mongoosejs.com/docs/plugins.html)\n* [pseudo-JOINs](http://mongoosejs.com/docs/populate.html)\n\nThe following example shows some of these features:\n\n var Comment = new Schema({\n name : { type: String, default: 'hahaha' }\n , age : { type: Number, min: 18, index: true }\n , bio : { type: String, match: /[a-z]/ }\n , date : { type: Date, default: Date.now }\n , buff : Buffer\n });\n\n // a setter\n Comment.path('name').set(function (v) {\n return capitalize(v);\n });\n\n // middleware\n Comment.pre('save', function (next) {\n notify(this.get('email'));\n next();\n });\n\nTake a look at the example in `examples/schema.js` for an end-to-end example of a typical setup.\n\n### Accessing a Model\n\nOnce we define a model through `mongoose.model('ModelName', mySchema)`, we can access it through the same function\n\n var myModel = mongoose.model('ModelName');\n\nOr just do it all at once\n\n var MyModel = mongoose.model('ModelName', mySchema);\n\nWe can then instantiate it, and save it:\n\n var instance = new MyModel();\n instance.my.key = 'hello';\n instance.save(function (err) {\n //\n });\n\nOr we can find documents from the same collection\n\n MyModel.find({}, function (err, docs) {\n // docs.forEach\n });\n\nYou can also `findOne`, `findById`, `update`, etc. For more details check out [the docs](http://mongoosejs.com/docs/queries.html).\n\n**Important!** If you opened a separate connection using `mongoose.createConnection()` but attempt to access the model through `mongoose.model('ModelName')` it will not work as expected since it is not hooked up to an active db connection. In this case access your model through the connection you created:\n\n var conn = mongoose.createConnection('your connection string');\n var MyModel = conn.model('ModelName', schema);\n var m = new MyModel;\n m.save() // works\n\n vs\n\n var conn = mongoose.createConnection('your connection string');\n var MyModel = mongoose.model('ModelName', schema);\n var m = new MyModel;\n m.save() // does not work b/c the default connection object was never connected\n\n### Embedded Documents\n\nIn the first example snippet, we defined a key in the Schema that looks like:\n\n comments: [Comments]\n\nWhere `Comments` is a `Schema` we created. This means that creating embedded documents is as simple as:\n\n // retrieve my model\n var BlogPost = mongoose.model('BlogPost');\n\n // create a blog post\n var post = new BlogPost();\n\n // create a comment\n post.comments.push({ title: 'My comment' });\n\n post.save(function (err) {\n if (!err) console.log('Success!');\n });\n\nThe same goes for removing them:\n\n BlogPost.findById(myId, function (err, post) {\n if (!err) {\n post.comments[0].remove();\n post.save(function (err) {\n // do something\n });\n }\n });\n\nEmbedded documents enjoy all the same features as your models. Defaults, validators, middleware. Whenever an error occurs, it's bubbled to the `save()` error callback, so error handling is a snap!\n\nMongoose interacts with your embedded documents in arrays _atomically_, out of the box.\n\n### Middleware\n\nSee the [docs](http://mongoosejs.com/docs/middleware.html) page.\n\n#### Intercepting and mutating method arguments\n\nYou can intercept method arguments via middleware.\n\nFor example, this would allow you to broadcast changes about your Documents every time someone `set`s a path in your Document to a new value:\n\n schema.pre('set', function (next, path, val, typel) {\n // `this` is the current Document\n this.emit('set', path, val);\n\n // Pass control to the next pre\n next();\n });\n\nMoreover, you can mutate the incoming `method` arguments so that subsequent middleware see different values for those arguments. To do so, just pass the new values to `next`:\n\n .pre(method, function firstPre (next, methodArg1, methodArg2) {\n // Mutate methodArg1\n next(\"altered-\" + methodArg1.toString(), methodArg2);\n })\n\n // pre declaration is chainable\n .pre(method, function secondPre (next, methodArg1, methodArg2) {\n console.log(methodArg1);\n // => 'altered-originalValOfMethodArg1' \n \n console.log(methodArg2);\n // => 'originalValOfMethodArg2' \n \n // Passing no arguments to `next` automatically passes along the current argument values\n // i.e., the following `next()` is equivalent to `next(methodArg1, methodArg2)`\n // and also equivalent to, with the example method arg \n // values, `next('altered-originalValOfMethodArg1', 'originalValOfMethodArg2')`\n next();\n })\n\n#### Schema gotcha\n\n`type`, when used in a schema has special meaning within Mongoose. If your schema requires using `type` as a nested property you must use object notation:\n\n new Schema({\n broken: { type: Boolean }\n , asset : {\n name: String\n , type: String // uh oh, it broke. asset will be interpreted as String\n }\n });\n\n new Schema({\n works: { type: Boolean }\n , asset : {\n name: String\n , type: { type: String } // works. asset is an object with a type property\n }\n });\n\n### Driver access\n\nThe driver being used defaults to [node-mongodb-native](https://github.com/mongodb/node-mongodb-native) and is directly accessible through `YourModel.collection`. **Note**: using the driver directly bypasses all Mongoose power-tools like validation, getters, setters, hooks, etc.\n\n## API Docs\n\nFind the API docs [here](http://mongoosejs.com/docs/api.html), generated by [dox](http://github.com/visionmedia/dox).\n\n## License\n\nCopyright (c) 2010 LearnBoost <dev@learnboost.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", - "_id": "mongoose@3.5.7", - "dist": { - "shasum": "10154512e52455844c0380a364d72f470c97de43" - }, - "_from": "mongoose@3.5.7" + "_id": "mongoose@3.6.4", + "_from": "mongoose@3.6.4" } diff --git a/node_modules/mongoose/static.js b/node_modules/mongoose/static.js index fc0e722..8eab8ad 100644 --- a/node_modules/mongoose/static.js +++ b/node_modules/mongoose/static.js @@ -12,6 +12,7 @@ require('http').createServer(function (req, res) { } }); }); + req.resume(); }).listen(8088); console.error('now listening on localhost:8088'); diff --git a/node_modules/nodetime/.npmignore b/node_modules/nodetime/.npmignore deleted file mode 100644 index 067cc80..0000000 --- a/node_modules/nodetime/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -.git* -test/ -.DS_Store -node_modules/ -npm-debug.log diff --git a/node_modules/nodetime/LICENSE b/node_modules/nodetime/LICENSE deleted file mode 100644 index d3f3199..0000000 --- a/node_modules/nodetime/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2012 Rapidlogix UG - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to use, copy and distribute the Software. It is strictly prohibited to -modify, merge, publish, sublicense and/or sell copies of the Software, -including substantial modification of the execution flow of the Software -at run-time by means other than documented. - -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. diff --git a/node_modules/nodetime/README.md b/node_modules/nodetime/README.md deleted file mode 100644 index bdb782e..0000000 --- a/node_modules/nodetime/README.md +++ /dev/null @@ -1,11 +0,0 @@ -Nodetime - Performance Profiler and Monitor for Node.js Applications -=========================================== -Nodetime reveals response time and other internals of HTTP requests and underlying HTTP, database, file system and other API calls in your Node.js application. Coupled with related process and OS state information, real-time and historical metrics, monitoring as well as CPU and memory profiling it enables tracing performance problems down to the root cause. Nodetime supports multiple APIs including native HTTP client, file system, cluster and sockets, Socket.io, Redis, MongoDB, MySQL, PostgreSQL, Memcached and Cassandra. HTTP based data stores like CouchDB and Riak are supported via HTTP API. - -This repository contains the source code of Nodetime agent. Agent runs within the application and securely sends profiling data and metrics to Nodetime server, where they are made available via web console at nodetime.com. - -Full documentation at [nodetime.com](http://nodetime.com) [Docs section](http://nodetime.com/docs). - -For questions or technical issues please contact our [support team](http://support.nodetime.com). - - diff --git a/node_modules/nodetime/index.js b/node_modules/nodetime/index.js deleted file mode 100644 index b359588..0000000 --- a/node_modules/nodetime/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lib/core/agent'); diff --git a/node_modules/nodetime/lib/addons/dtrace-provider.js b/node_modules/nodetime/lib/addons/dtrace-provider.js deleted file mode 100644 index af7aff5..0000000 --- a/node_modules/nodetime/lib/addons/dtrace-provider.js +++ /dev/null @@ -1,63 +0,0 @@ -'use strict'; - - -/* - * Deprecated. - */ - -function DTraceProvider(agent) { - this.agent = agent; - this.spaceRegexp = /\s/g; -} -exports.DTraceProvider = DTraceProvider; - -DTraceProvider.prototype.init = function() { - var self = this; - - // trying to initialize dtrace provider - var dtp = undefined; - try { - var d = require("dtrace-provider"); - dtp = d.createDTraceProvider("nodetime"); - dtp.addProbe("api-call-start", "int", "char *", "char *"); - dtp.addProbe("api-call-done", "int", "char *", "char *"); - dtp.enable(); - } - catch(err) { - this.agent.logger.error(err) - } - - - // firing dtrace events on calls - - if(!dtp) return; - - this.agent.on('call-start', function(time) { - try { - var scope = time.scope.replace(self.spaceRegexp, '-').toLowerCase(); - var command = time.group.replace(self.spaceRegexp, '-').toLowerCase(); - dtp.fire('api-call-start', function() { - return [time.id, scope, command]; - }); - } - catch(err) { - this.agent.logger.error(err) - } - }); - - this.agent.on('call-done', function(time) { - try { - var scope = time.scope.replace(self.spaceRegexp, '-').toLowerCase(); - var command = time.group.replace(self.spaceRegexp, '-').toLowerCase(); - dtp.fire('api-call-done', function() { - return [time.id, scope, command]; - }); - } - catch(err) { - this.agent.logger.error(err) - } - }); - -}; - - diff --git a/node_modules/nodetime/lib/addons/stdout-writer.js b/node_modules/nodetime/lib/addons/stdout-writer.js deleted file mode 100644 index 2824db4..0000000 --- a/node_modules/nodetime/lib/addons/stdout-writer.js +++ /dev/null @@ -1,45 +0,0 @@ -'use strict'; - - -function StdoutWriter(agent) { - this.agent = agent; -} -exports.StdoutWriter = StdoutWriter; - -StdoutWriter.prototype.init = function(_nt) { - var self = this; - - self.agent.on('sample', function(sample) { - console.log(self.indent({sample: sample})); - }); -}; - - -StdoutWriter.prototype.indent = function(obj, depth) { - if(!depth) depth = 0; - if(depth > 20) return ''; - - var tab = ''; - for(var i = 0; i < depth; i++) tab += "\t"; - - var str = '' - var arr = Array.isArray(obj); - - for(var prop in obj) { - var val = obj[prop]; - if(val == undefined || prop.match(/^_/)) continue; - - var label = val._label || (arr ? ('[' + prop + ']') : prop); - - if(typeof val === 'string' || typeof val === 'number') { - str += tab + label + ': \u001b[33m' + val + '\u001b[0m\n'; - } - else if(typeof val === 'object') { - str += tab + '\u001b[1m' + label + '\u001b[0m\n'; - str += indent(val, depth + 1); - } - } - - return str; -} - diff --git a/node_modules/nodetime/lib/core/agent.js b/node_modules/nodetime/lib/core/agent.js deleted file mode 100644 index cbf26da..0000000 --- a/node_modules/nodetime/lib/core/agent.js +++ /dev/null @@ -1,359 +0,0 @@ -'use strict'; - -var fs = require('fs'); -var util = require('util'); -var path = require('path'); -var cluster = require('cluster'); -var EventEmitter = require('events').EventEmitter; - -var Logger = require('./logger').Logger; -var Timers = require('./timers').Timers; -var System = require('./system').System; -var Proxy = require('./proxy').Proxy; -var Thread = require('./thread').Thread; -var Utils = require('./utils').Utils; -var MetricsManager = require('../metrics/metrics-manager').MetricsManager; -var ProcessState = require('../process/process-state').ProcessState; -var ProcessInfo = require('../process/process-info').ProcessInfo; -var ProcessStats = require('../process/process-stats').ProcessStats; -var DiskStats = require('../process/disk-stats').DiskStats; -var SaasClient = require('../saas/saas-client').SaasClient; -var DataSender = require('../saas/data-sender').DataSender; -var Profiler = require('../profiler/profiler').Profiler; -var NamedTransactions = require('../profiler/named-transactions').NamedTransactions; -var CustomTransaction = require('../profiler/custom-transaction').CustomTransaction; -var GCStats = require('../v8/gc-stats').GCStats; -var CpuProfiler = require('../v8/cpu-profiler').CpuProfiler; -var HeapProfiler = require('../v8/heap-profiler').HeapProfiler; -var HeapStats = require('../v8/heap-stats').HeapStats; -var StdoutWriter = require('../addons/stdout-writer').StdoutWriter; - - -function Agent() { - this.initialized = false; - this.version = '0.8.4'; - this.nextId = Math.round(Math.random() * Math.pow(10, 6)); - this.performanceIndexMetric = undefined; - - // predefine options - this.debug = false; - this.stdout = false; - this.server = undefined; - this.proxyServer = undefined; - this.features = { - transactionProfiler: true, - hostMetrics: false, - redisMetrics: true, - mongodbMetrics: true - }; - - EventEmitter.call(this); - - - // create modules - this.logger = new Logger(this); - this.timers = new Timers(this); - this.system = new System(this); - this.proxy = new Proxy(this); - this.thread = new Thread(this); - this.utils = new Utils(this); - this.metricsManager = new MetricsManager(this); - this.processState = new ProcessState(this); - this.processInfo = new ProcessInfo(this); - this.processStats = new ProcessStats(this); - this.diskStats = new DiskStats(this); - this.saasClient = new SaasClient(this); - this.dataSender = new DataSender(this); - this.profiler = new Profiler(this); - this.namedTransactions = new NamedTransactions(this); - this.customTransaction = new CustomTransaction(this); - this.gcStats = new GCStats(this); - this.cpuProfiler = new CpuProfiler(this); - this.heapProfiler = new HeapProfiler(this); - this.heapStats = new HeapStats(this); - this.stdoutWriter = new StdoutWriter(this); -}; - -util.inherits(Agent, EventEmitter); - - - -Agent.prototype.init = function(opts) { - var self = this; - - if(self.initialized) return; - self.initialized = true; - - opts || (opts = {}); - opts.features || (opts.features = {}); - - // Registered accounts. - self.accountKey = opts.accountKey; - self.appName = opts.appName || 'Default Application'; - if(self.accountKey) { - if(!self.accountKey.match(/^[a-zA-Z0-9]{1,128}$/)) { - throw Error('Nodetime: invalid accountKey format'); - } - - if(!self.appName.match(/^[\s\w\-\.\:]{1,128}$/)) { - throw Error('Nodetime: invalid appName format'); - } - - self.sessionId = 'pro:' + self.accountKey + ':' + self.utils.sha1(self.appName); - } - - self.debug = opts.debug; - self.stdout = opts.stdout; - self.server = opts.server; - self.proxyServer = opts.proxy; - - // compatibility - if(opts.features.transactions === undefined && opts.transactions !== undefined) - opts.features.transactions = opts.transactions; - if(opts.features.redisMetrics === undefined && opts.redisMetrics !== undefined) - opts.features.redisMetrics = opts.redisMetrics; - if(opts.features.mongodbMetrics === undefined && opts.mongodbMetrics !== undefined) - opts.features.mongodbMetrics = opts.mongodbMetrics; - // end compatibility - - self.features.transactionProfiler = - opts.features.transactionProfiler === undefined || opts.features.transactionProfiler; - self.features.hostMetrics = !!opts.features.hostMetrics; - self.features.redisMetrics = - opts.features.redisMetrics === undefined || opts.features.redisMetrics; - self.features.mongodbMetrics = - opts.features.mongodbMetrics === undefined || opts.features.mongodbMetrics; - - - // Initialize core modules first. - self.logger.init(self.debug); - self.timers.init(); - self.system.init(); - self.proxy.init(); - self.thread.init(); - self.utils.init(); - - // Initialize data sender. - self.dataSender.init(); - self.saasClient.init(self.server, self.proxyServer, self.sessionId); - - // Metrics aggregator should be initialize before - // metric senders. - self.metricsManager.init(); - // Predefine performance index metric. - self.performanceIndexMetric = - this.metricsManager.createMetric('Process', 'Performance index', null, 'index'); - - - // Initialize the rest. - self.processState.init(); - self.processInfo.init(); - self.processStats.init(); - if(self.features.hostMetrics) self.diskStats.init(); - self.profiler.init(); - self.namedTransactions.init(opts.namedTransactions); - self.customTransaction.init(); - self.gcStats.init(); - self.cpuProfiler.init(); - self.heapProfiler.init(); - self.heapStats.init(); - if(self.stdout) self.stdoutWriter.init(); - - - // Prepare probes. - self.loadProbes(); - - - // Notify listeners about session. - if(self.sessionId) { - // pro version - try { - self.emit('session', self.sessionId); - } - catch(err) { - self.logger.error(err); - } - } - else { - // Free version. - - // Receiving session id from server. - self.on('command', function(command, args) { - if(command === 'newSession') { - self.sessionId = args; - - // Replace temporary session id with a real free one. - self.saasClient.switchSessionId(self.sessionId); - self.logger.message("profiler console for this instance is at \u001b[33m" + "https://nodetime.com/app/" + self.sessionId + "\u001b[0m"); - - try { - self.emit('session', self.sessionId); - - // Session expires on server after 20 minutes - // destroy the agent. - self.timers.setTimeout(function() { - self.destroy(); - }, 1200000); - } - catch(err) { - self.logger.error(err); - } - } - }); - - // Requesting session id from server. - self.saasClient.sendCommand('createSession'); - } -}; - -Agent.prototype.profile = Agent.prototype.init; - - -Agent.prototype.loadProbes = function() { - var self = this; - - // Dynamic probes. - var probeCons = []; - probeCons.push(require('../probes/cassandra-client-probe').CassandraClientProbe); - probeCons.push(require('../probes/fs-probe').FsProbe); - probeCons.push(require('../probes/http-probe').HttpProbe); - probeCons.push(require('../probes/memcache-probe').MemcacheProbe); - probeCons.push(require('../probes/memcached-probe').MemcachedProbe); - probeCons.push(require('../probes/mongodb-probe').MongodbProbe); - probeCons.push(require('../probes/mysql-probe').MysqlProbe); - probeCons.push(require('../probes/net-probe').NetProbe); - probeCons.push(require('../probes/pg-probe').PgProbe); - probeCons.push(require('../probes/redis-probe').RedisProbe); - probeCons.push(require('../probes/socket.io-probe').SocketioProbe); - - var packageProbes = {}; - probeCons.forEach(function(probeCon) { - var probe = new probeCon(self); - probe.packages.forEach(function(pkg) { - packageProbes[pkg] = probe; - }); - }); - - // Preattaching probles, works, but not well tested - // because require may load from different paths. - // This removes the requirement to require nodetime - // before everything else. - /*for(var name in packageProbes) { - var ret; - try { - ret = require.call(this, name); - } - catch(err) { - // ignore exceptions - } - - if(ret) { - self.logger.log('found ' + name + ' module'); - packageProbes[name].attach(ret); - } - }*/ - - // on demand probe attaching - self.proxy.after(module.__proto__, 'require', function(obj, args, ret) { - var probe = packageProbes[args[0]]; - if(probe) { - probe.attach(ret); - } - }); - - - // Explicit probes. - var ProcessProbe = require('../probes/process-probe').ProcessProbe; - new ProcessProbe(self).attach(process); - var GlobalProbe = require('../probes/global-probe').GlobalProbe; - new GlobalProbe(self).attach(global); -}; - - -Agent.prototype.getNextId = function() { - return this.nextId++ -}; - - -Agent.prototype.switchApp = function(appName) { - if(!this.initialized) return; - - this.appName = appName; - if(this.accountKey) { - this.sessionId = 'pro:' + this.accountKey + ':' + this.utils.sha1(this.appName); - this.saasClient.switchSessionId(this.sessionId); - } - - // Resend info, so that the server can see the new application name. - try { - this.processInfo.sendInfo(); - } - catch(err) { - this.logger.error(err); - } -}; - - -Agent.prototype.destroy = function() { - try { - this.emit('destroy'); - } - catch(err) { - this.logger.error(err); - } - - this.removeAllListeners(); -}; - - -Agent.prototype.time = function(scope, label, context) { - if(!this.initialized) return; - - return this.customTransaction.start(scope, label, context) -}; - - -Agent.prototype.metric = function(scope, name, value, unit, op) { - if(!this.initialized) return; - - this.metricsManager.addMetric(scope, name, value, unit, op); -}; - - -Agent.prototype.expressErrorHandler = function() { - return function(err, req, res, next) { - res.__caughtException__ = err; - next(err); - }; -}; - - -var Nodetime = function() { - var self = this; - - var agent = new Agent(); - ['profile', - 'switchApp', - 'destroy', - 'time', - 'metric', - 'expressErrorHandler' - ].forEach(function(meth) { - self[meth] = function() { - return agent[meth].apply(agent, arguments); - }; - }); - - ['on', - 'addListener', - 'pause', - 'resume' - ].forEach(function(meth) { - self[meth] = function() { - // deprecated - }; - }); -}; - -exports = module.exports = new Nodetime(); - diff --git a/node_modules/nodetime/lib/core/logger.js b/node_modules/nodetime/lib/core/logger.js deleted file mode 100644 index ac78f14..0000000 --- a/node_modules/nodetime/lib/core/logger.js +++ /dev/null @@ -1,34 +0,0 @@ -'use strict'; - -var util = require('util'); - - -function Logger(agent) { - this.agent = agent; -} -exports.Logger = Logger; - - -Logger.prototype.init = function(debug) { - this.debug = debug; -}; - - -Logger.prototype.log = function(msg) { - if(this.debug && msg) console.log('nodetime v' + this.agent.version + ':', msg); -}; - - -Logger.prototype.error = function(err) { - if(this.debug && err) console.error('nodetime v' + this.agent.version + ' error:', err, err.stack); -}; - - -Logger.prototype.dump = function(obj) { - if(this.debug) console.log(util.inspect(obj, false, 10, true)); -}; - - -Logger.prototype.message = function(msg) { - util.log("\u001b[1;31mNodetime:\u001b[0m " + msg); -}; diff --git a/node_modules/nodetime/lib/core/proxy.js b/node_modules/nodetime/lib/core/proxy.js deleted file mode 100644 index 37ce020..0000000 --- a/node_modules/nodetime/lib/core/proxy.js +++ /dev/null @@ -1,201 +0,0 @@ -'use strict'; - -var EventEmitter = require('events').EventEmitter; - -function Proxy(agent) { - this.agent = agent; -} -exports.Proxy = Proxy; - - -Proxy.prototype.init = function() { - // removeListener compairs objects, so the original callback - // should be passed instead of the proxy - this.before(EventEmitter.prototype, 'removeListener', function(obj, args) { - if(args.length > 1 && args[1] && args[1].__nodetimeProxy__) { - args[1] = args[1].__nodetimeProxy__; - } - }); -}; - -var Locals = function() { - this.time = undefined; - this.stackTrace = undefined; - this.params = undefined; -} - - -Proxy.prototype.before = function(obj, meths, hook) { - var self = this; - - if(!Array.isArray(meths)) meths = [meths]; - - meths.forEach(function(meth) { - var orig = obj[meth]; - if(!orig) return; - - obj[meth] = function() { - try { - hook(this, arguments); - } - catch(e) { - self.logError(e); - } - - return orig.apply(this, arguments); - }; - }); -}; - - -Proxy.prototype.after = function(obj, meths, hook) { - var self = this; - - if(!Array.isArray(meths)) meths = [meths]; - - meths.forEach(function(meth) { - var orig = obj[meth]; - if(!orig) return; - - obj[meth] = function() { - var ret = orig.apply(this, arguments); - - var hookRet; - try { - hookRet = hook(this, arguments, ret); - } - catch(e) { - self.logError(e) - } - - return hookRet || ret; - }; - }); -}; - - -Proxy.prototype.around = function(obj, meths, hookBefore, hookAfter) { - var self = this; - - if(!Array.isArray(meths)) meths = [meths]; - - meths.forEach(function(meth) { - var orig = obj[meth]; - if(!orig) return; - - obj[meth] = function() { - var locals = new Locals(); - - try { - hookBefore(this, arguments, locals); - } - catch(e) { - self.logError(e) - } - - var ret = orig.apply(this, arguments); - - var hookRet; - try { - hookRet = hookAfter(this, arguments, ret, locals); - } - catch(e) { - self.logError(e) - } - - return hookRet || ret; - }; - }); -}; - - -Proxy.prototype.callback = function(args, pos, hookBefore, hookAfter) { - var self = this; - - if(args.length <= pos) return false; - if(pos === -1) pos = args.length - 1; - - var orig = (typeof args[pos] === 'function') ? args[pos] : undefined; - if(!orig) return; - - args[pos] = function() { - if(hookBefore) { - try { - hookBefore(this, arguments); - } - catch(e) { - self.logError(e); - } - } - - var ret = orig.apply(this, arguments); - - if(hookAfter) { - try { - hookAfter(this, arguments); - } - catch(e) { - self.logError(e); - } - } - return ret; - }; - - // this is need for removeListener - orig.__nodetimeProxy__ = args[pos]; -}; - - -Proxy.prototype.getter = function(obj, props, hook) { - var self = this; - - if(!Array.isArray(props)) props = [props]; - - props.forEach(function(prop) { - var orig = obj.__lookupGetter__(prop); - if(!orig) return; - - obj.__defineGetter__(prop, function() { - var ret = orig.apply(this, arguments); - - try { - hook(this, ret); - } - catch(e) { - self.logError(e) - } - - return ret; - }); - }); -}; - - -Proxy.prototype.hasError = function(args) { - return (args && args.length > 0 && args[0]); -}; - - -Proxy.prototype.getErrorMessage = function(args) { - if(args && args.length > 0 && args[0]) { - if(args[0] && typeof(args[0]) === 'object' && args[0].message) { - return args[0].message; - } - else if(typeof(args[0]) === 'string') { - return args[0]; - } - else { - return 'unspecified'; - } - } - - return undefined; -}; - - -Proxy.prototype.logError = function(err) { - this.agent.logger.error(err); -} - - - diff --git a/node_modules/nodetime/lib/core/system.js b/node_modules/nodetime/lib/core/system.js deleted file mode 100644 index 46e0f53..0000000 --- a/node_modules/nodetime/lib/core/system.js +++ /dev/null @@ -1,57 +0,0 @@ -'use strict'; - -function System(agent) { - this.agent = agent; - - this.hasHrtime = true; - this.timekit = undefined; -} -exports.System = System; - - -System.prototype.init = function() { - var self = this; - - // make sure hrtime is available - self.hasHrtime = process.hasOwnProperty('hrtime'); - - // try to load timekit - try { - self.timekit = require('timekit'); - if(!self.timekit.time() || !self.timekit.cputime()) throw new Error('timekit broken'); - } - catch(err) { - self.timekit = undefined; - self.agent.logger.error(err); - } -}; - - -System.prototype.hrtime = function() { - if(this.timekit) { - return this.timekit.time(); - } - else if(this.hasHrtime) { - var ht = process.hrtime(); - return ht[0] * 1000000 + Math.round(ht[1] / 1000); - } - else { - return Date.now() * 1000; - } -}; - - -System.prototype.micros = function() { - return this.timekit ? this.timekit.time() : Date.now() * 1000; -}; - - -System.prototype.millis = function() { - return this.timekit ? this.timekit.time() / 1000 : Date.now(); -}; - - -System.prototype.cputime = function() { - return this.timekit ? this.timekit.cputime() : undefined; -}; - diff --git a/node_modules/nodetime/lib/core/thread.js b/node_modules/nodetime/lib/core/thread.js deleted file mode 100644 index 6e69a25..0000000 --- a/node_modules/nodetime/lib/core/thread.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict'; - -/* - * Thread class simulates thread model, which allows to trace - * nested operations. - */ - -function Thread(agent) { - this.agent = agent; - this.nextId = 1; - this.threadId = undefined; -} - -exports.Thread = Thread; - - -Thread.prototype.init = function() { -}; - - -Thread.prototype.enter = function() { - this.threadId = this.nextId++; // no way this runs out - return this.threadId; -}; - - -Thread.prototype.exit = function() { - this.threadId = undefined; -}; - - -Thread.prototype.current = function() { - return this.threadId; -}; - - -Thread.prototype.resume = function(threadId) { - this.threadId = threadId; -}; - - diff --git a/node_modules/nodetime/lib/core/time.js b/node_modules/nodetime/lib/core/time.js deleted file mode 100644 index 7d44169..0000000 --- a/node_modules/nodetime/lib/core/time.js +++ /dev/null @@ -1,90 +0,0 @@ -'use strict'; - -/* - * The Time class is used to calculate execution time and CPU time - * of a call. It also emits call-start and call-done events. - */ - -function Time(agent, scope, group, isRoot) { - this.agent = agent; - - this.scope = scope; - this.group = group; - this.isRoot = isRoot; - - this.id = agent.getNextId(); - - this._begin = undefined; - this._cputime = undefined; - - this.begin = undefined; - this.end = undefined; - this.ms = undefined; - this.cputime = undefined; - - this.hasError = undefined; - - this._bytesRead = undefined; - this._bytesWritten = undefined; - - this.threadId = undefined; -}; -exports.Time = Time; - - -Time.prototype.start = function() { - var self = this; - - var system = self.agent.system; - var thread = self.agent.thread; - var processState = self.agent.processState; - - self.begin = system.millis(); - self._cputime = system.cputime(); - self._begin = system.hrtime(); - - self._bytesRead = processState.bytesRead; - self._bytesWritten = processState.bytesWritten; - - // threads - if(self.isRoot) { - self.threadId = thread.enter(); - } - else { - self.threadId = thread.current(); - } -}; - - -Time.prototype.done = function(hasError) { - var self = this; - - if(self.ms !== undefined) return false; - - var system = self.agent.system; - var thread = self.agent.thread; - var processState = self.agent.processState; - - self.ms = (system.hrtime() - self._begin) / 1000; - self.end = self.begin + self.ms; - if(self._cputime !== undefined) { - self.cputime = (system.cputime() - self._cputime) / 1000; - } - - self.hasError = hasError; - - self.bytesRead = processState.bytesRead - self._bytesRead; - self.bytesWritten = processState.bytesWritten - self._bytesWritten; - - // threads - if(self.isRoot) { - thread.exit(); - } - else { - thread.resume(self.threadId); - } - - return true; -}; - - diff --git a/node_modules/nodetime/lib/core/timers.js b/node_modules/nodetime/lib/core/timers.js deleted file mode 100644 index 712c3f2..0000000 --- a/node_modules/nodetime/lib/core/timers.js +++ /dev/null @@ -1,99 +0,0 @@ -'use strict'; - -function Timers(agent) { - this.agent = agent; - - this.timeoutIds = []; - this.intervalIds = []; -} -exports.Timers = Timers; - - -Timers.prototype.init = function() { - var self = this; - - self.agent.on('destroy', function() { - self.timeoutIds.forEach(function(timeoutId) { - clearTimeout(timeoutId); - }); - self.timeoutIds = []; - - self.intervalIds.forEach(function(intervalId) { - clearInterval(intervalId); - }); - self.intervalIds = []; - }); -}; - - -Timers.prototype.setTimeout = function(func, ms) { - var self = this; - - var context = {timeoutId: undefined}; - - var funcWrap = function() { - try { - func.apply(this, arguments); - } - catch(err) { - self.agent.logger.error(err); - } - - self.deleteTimeout(context.timeoutId); - }; - - context.timeoutId = setTimeout(funcWrap, ms); - this.timeoutIds.push(context.timeoutId); - - return context.timeoutId; -}; - - -Timers.prototype.setInterval = function(func, ms) { - var self = this; - - var funcWrap = function() { - try { - func(); - } - catch(err) { - self.agent.logger.error(err); - } - }; - - var intervalId = setInterval(funcWrap, ms); - self.intervalIds.push(intervalId); - return intervalId; -}; - - -Timers.prototype.clearTimeout = function(timeoutId) { - this.deleteTimeout(timeoutId); - clearTimeout(timeoutId); -}; - - -Timers.prototype.clearInterval = function(intervalId) { - this.deleteInterval(intervalId); - clearTimeout(intervalId); -}; - - -Timers.prototype.deleteTimeout = function(timeoutId) { - for (var i = 0; i < this.timeoutIds.length; i++) { - if(this.timeoutIds[i] === timeoutId) { - this.timeoutIds.splice(i, 1); - break; - } - } -}; - - -Timers.prototype.deleteInterval = function(intervalId) { - for (var i = 0; i < this.intervalIds.length; i++) { - if(this.intervalIds[i] === intervalId) { - this.intervalIds.splice(i, 1); - break; - } - } -}; diff --git a/node_modules/nodetime/lib/core/utils.js b/node_modules/nodetime/lib/core/utils.js deleted file mode 100644 index 51879c9..0000000 --- a/node_modules/nodetime/lib/core/utils.js +++ /dev/null @@ -1,20 +0,0 @@ -'use strict'; - -var crypto = require('crypto'); - - -function Utils(agent) { - this.agent = agent; -} -exports.Utils = Utils; - - -Utils.prototype.init = function(str) { -} - - -Utils.prototype.sha1 = function(str) { - var hash = crypto.createHash('sha1'); - hash.update(str); - return hash.digest('hex'); -}; diff --git a/node_modules/nodetime/lib/metrics/metric.js b/node_modules/nodetime/lib/metrics/metric.js deleted file mode 100644 index d04a093..0000000 --- a/node_modules/nodetime/lib/metrics/metric.js +++ /dev/null @@ -1,187 +0,0 @@ -'use strict'; - -/* - * Metric object used for aggregating values and trasfering - * the aggregated metric to data sender. It can have three states: - * - created/resetted - * - initialized, i.e. accumulating values - * - aggregated - */ - - -function Metric(scope, name, unit, op) { - this.scope = scope; - this.name = name; - this.value = undefined; - this.unit = unit; - this.op = op || 'avg'; - - this.source = undefined; - this._ns = undefined; - this._id = undefined; - this._ts = undefined; - - // used for aggregation only - this._sum = undefined; - this._count = undefined; - this._values = undefined; - this._bins = undefined; -} - -exports.Metric = Metric; - - - -Metric.prototype.init = function() { - var self = this; - - self.value = 0; - - if(self.op === 'avg') { - self._sum = 0; - self._count = 0; - } - if(self.op === 'sum') { - self._sum = 0; - } - else if(self.op === '95th') { - self._values = []; - } - else if(self.op === 'index') { - // prefill bins - self._bins = { - 1: 0, - 10: 0, - 100: 0, - 1000: 0, - 10000: 0, - 100000: 0, - 1000000: 0 - }; - } - /*else { - // gauge, gaugex - }*/ -}; - - -Metric.prototype.isInitialized = function() { - return (this.value !== undefined) -}; - - -Metric.prototype.reset = function() { - var self = this; - - self.value = undefined; - - if(self.op === 'avg') { - self._sum = undefined; - self._count = undefined; - } - if(self.op === 'sum') { - self._sum = 0; - self.init(); - } - else if(self.op === '95th') { - self._values = undefined; - } - else if(self.op === 'index') { - self._bins = undefined; - } -}; - - -Metric.prototype.addValue = function(value) { - var self = this; - - if(typeof(value) !== 'number') return; - - if(self.value === undefined) { - self.init(); - } - - switch(self.op) { - case 'avg': - self._sum += value; - self._count++; - break; - case 'sum': - self._sum += value; - break; - case 'gauge': - case 'gaugex': - self.value = value; - break; - case '95th': - if(self._values.length < 250) { - self._values.push(value); - } - break; - case 'index': - var bin = value < 1 ? 1 : Math.pow(10, Math.floor(Math.log(value) / Math.LN10) + 1); - if(self._bins[bin]) { - self._bins[bin]++; - } - else { - self._bins[bin] = 1; - } - break; - } -}; - - -Metric.prototype.aggregate = function() { - var self = this; - - if(self.op === 'avg') { - self.value = self._sum / self._count; - } - else if(self.op === 'sum') { - self.value = self._sum; - } - else if(self.op === '95th') { - if(self._values.length > 0) { - self._values = self._values.sort(function(a, b) { return a - b}); - var n = Math.floor(self._values.length * 0.95 + 0.5); - self.value = self._values[n - 1]; - } - else { - self.value = 0; - } - } - else if(self.op === 'index') { - var total = 0; - for(var bin in self._bins) { - total += self._bins[bin]; - } - - if(total !== 0) { - self.value = 0; - for(var bin in self._bins) { - self.value += - Math.round(1 / (Math.log(bin) / Math.LN10 + 1) * - (self._bins[bin] / total * 100)); - } - } - - self.value = 100 - self.value; - } -}; - - -Metric.prototype.clone = function() { - var cln = new Metric( - this.scope, - this.name, - this.unit, - this.op - ); - cln.value = this.value; - - return cln; -}; - - - - diff --git a/node_modules/nodetime/lib/metrics/metrics-manager.js b/node_modules/nodetime/lib/metrics/metrics-manager.js deleted file mode 100644 index 050f2ab..0000000 --- a/node_modules/nodetime/lib/metrics/metrics-manager.js +++ /dev/null @@ -1,126 +0,0 @@ -'use strict'; - -var os = require('os'); -var Metric = require('./metric').Metric; - - -/* - * MetricsManager managemes metric lifecycle, i.e. keeps list - * and map of metrics, aggregates and emits every minute, etc. - * It also emits all possible metris once on agent start, to make sure - * the server gets something to start with. - */ - -function MetricsManager(agent) { - this.agent = agent; - - this.metrics = []; - this.metricMap = {}; -} -exports.MetricsManager = MetricsManager; - - -MetricsManager.prototype.init = function() { - var self = this; - - self.agent.timers.setTimeout(function() { - self.agent.timers.setInterval(function() { - self.flush(); - }, 60000); - }, 2000); - - //send any initial values - self.agent.on('session', function() { - self.flushPartial(); - }); -}; - - -MetricsManager.prototype.createMetric = function(scope, name, unit, op) { - if(this.metrics.length == 5000) { - throw new Error('too many metrics'); - } - - if(!scope || !name) { - throw new Error('parameter(s) missing or invalid'); - } - - var metric = new Metric(scope, name, unit, op); - this.metrics.push(metric); - this.metricMap[scope + '/' + name] = metric; - - return metric; -} - - -MetricsManager.prototype.findMetric = function(scope, name) { - return this.metricMap[scope + '/' + name]; -} - - -MetricsManager.prototype.addMetric = function(scope, name, value, unit, op) { - var metric = this.findMetric(scope, name); - if(!metric) { - metric = this.createMetric(scope, name, unit, op); - } - - metric.addValue(value); - - return metric; -} - - -MetricsManager.prototype.emit = function(metric) { - var self = this; - - try { - // index metric is not recognized by the server - if(metric.op === 'index') { - metric.op = 'avg'; - } - - metric.source = os.hostname() + '[' + process.pid + ']'; - metric._ns = 'metrics'; - metric._id = self.agent.getNextId(); - metric._ts = Date.now(); - - self.agent.emit('metric', metric); - } - catch(err) { - self.agent.logger.error(err); - } -}; - - -MetricsManager.prototype.flushPartial = function() { - var self = this; - - self.metrics.forEach(function(metric) { - if(!metric.isInitialized()) return; - - if(metric.op === 'avg' || - metric.op === 'gauge' || - metric.op === 'gaugex') - { - metric.aggregate(); - self.emit(metric.clone()); - } - }); -}; - - -MetricsManager.prototype.flush = function() { - var self = this; - - self.metrics.forEach(function(metric) { - if(!metric.isInitialized()) return; - - metric.aggregate(); - - if(metric.value !== undefined) { - self.emit(metric.clone()); - metric.reset(); - } - }); -}; - diff --git a/node_modules/nodetime/lib/monitors/mongodb-monitor.js b/node_modules/nodetime/lib/monitors/mongodb-monitor.js deleted file mode 100644 index d9a833b..0000000 --- a/node_modules/nodetime/lib/monitors/mongodb-monitor.js +++ /dev/null @@ -1,384 +0,0 @@ -'use strict'; - - - -/* - * MongoDB server and collection stats. - */ - -function MongoDBMonitor(agent) { - this.agent = agent; - - this.serversCount = 0; - this.servers = {}; - - this.collsCount = 0; - this.colls = {}; - this.collNameRegex = /[^\.\$]+\.([^\.\$]+)/; -} -exports.MongoDBMonitor = MongoDBMonitor; - - - -MongoDBMonitor.prototype.init = function(mongodb) { - var self = this; - - self.mongodb = mongodb; - - - self.agent.timers.setInterval(function() { - for(address in self.servers) { - try { - self.loadServerStatus(self.servers[address]); - } - catch(err) { - self.agent.logger.error(err); - } - } - - for(var address in self.colls) { - try { - self.loadCollStats(self.colls[address]); - } - catch(err) { - self.agent.logger.error(err); - } - } - }, 60000); -}; - - -MongoDBMonitor.prototype.monitorServer = function(host, port, dbName, auth) { - var self = this; - - var address = host + ':' + port; - var server = self.servers[address]; - - if(server || ++self.serversCount > 25) return; - - self.servers[address] = { - host: host, - port: port, - dbName: dbName, - auth: auth, - lastValues: {} - }; -} - - -MongoDBMonitor.prototype.monitorCollection = function(host, port, dbName, collName, auth) { - var self = this; - - if(!self.agent.features.mongodbMetrics) return; - - // start querying for server status - if(auth && auth.authdb === 'admin') { - self.monitorServer(host, port, dbName, auth); - } - - var m = self.collNameRegex.exec(collName); - if(!m || !m[1]) return; - collName = m[1]; - - var address = host + ':' + port + ':' + dbName + ':' + collName; - var coll = self.colls[address]; - - // add auth to existing collection - if(coll && auth) { - coll.auth = auth; - } - - if(coll || ++self.collsCount > 50) return; - - self.colls[address] = { - host: host, - port: port, - dbName: dbName, - collName: collName, - auth: auth, - lastValues: {} - }; -} - - -function getValue(stats, key) { - var props = key.split('.'); - - for(var i = 0; i < props.length; i++) { - stats = stats[props[i]]; - if(!stats) return; - } - - return parseFloat(stats); -} - - -MongoDBMonitor.prototype.metric = function(client, stats, scope, name, key, unit, isRelative, scale) { - var self = this; - - var numVal = getValue(stats, key); - if(typeof(numVal) !== 'number') return; - - if(scale) { - numVal = numVal * scale; - } - - if(isRelative) { - if(client.lastValues[key]) { - self.agent.metric( - scope, - name, - numVal - client.lastValues[key], - unit, - 'gauge'); - } - - client.lastValues[key] = numVal; - } - else { - self.agent.metric( - scope, - name, - numVal, - unit, - 'gauge'); - } -}; - - -MongoDBMonitor.prototype.done = function(db, err) { - var self = this; - - try { - if(db) db.close() - } - catch(err2) { - self.agent.logger.error(err2); - } - - if(err) { - self.agent.logger.error(err); - } -}; - - -MongoDBMonitor.prototype.loadServerStatus = function(server) { - var self = this; - - var db = new self.mongodb.Db( - server.dbName, - new self.mongodb.Server(server.host, server.port, {'auto_reconnect': false, 'poolSize': 1}), - {safe: false}); - - db.open(function(err) { - if(err) return self.done(db, err); - - try { - db.admin(function(err, adminDb) { - if(err) return self.done(db, err); - if(!adminDb) return; - - try { - adminDb.authenticate(server.auth.username, server.auth.password, function(err, result) { - if(err) return self.done(db, err); - if(!result) return self.done(db, 'mongodb server auth failed'); - - try { - adminDb.serverStatus(function(err, serverStatus) { - if(err) return self.done(db, err); - if(!serverStatus) return self.done(db, 'mongodb serverStatus empty'); - - try { - self.extractServerMetrics(server, serverStatus); - - self.done(db); - } - catch(err) { - self.done(db, err); - } - }); - } - catch(err) { - self.done(db, err); - } - }); - } - catch(err) { - self.done(db, err); - } - }); - } - catch(err) { - self.done(db, err); - } - }); -}; - - - -MongoDBMonitor.prototype.extractServerMetrics = function(server, serverStatus) { - var self = this; - - var scope = - 'MongoDB Server/' + - server.host + ':' + server.port; - - self.metric(server, serverStatus, scope, 'Global lock/Total time', 'globalLock.totalTime', 'ms/minute', true, 1/1024); - self.metric(server, serverStatus, scope, 'Global lock/Lock time', 'globalLock.lockTime', 'ms/minute', true, 1/1024); - self.metric(server, serverStatus, scope, 'Global lock/Current queue/Total', 'globalLock.currentQueue.total', null, false); - self.metric(server, serverStatus, scope, 'Global lock/Current queue/Readers', 'globalLock.currentQueue.readers', null, false); - self.metric(server, serverStatus, scope, 'Global lock/Current queue/Writers', 'globalLock.currentQueue.writers', null, false); - self.metric(server, serverStatus, scope, 'Global lock/Active clients/Total', 'globalLock.activeClients.total', null, false); - self.metric(server, serverStatus, scope, 'Global lock/Active clients/Readers', 'globalLock.activeClients.readers', null, false); - self.metric(server, serverStatus, scope, 'Global lock/Active clients/Writers', 'globalLock.activeClients.writers', null, false); - self.metric(server, serverStatus, scope, 'Memory/Resident', 'mem.resident', 'MB', false); - self.metric(server, serverStatus, scope, 'Memory/Virtual', 'mem.virtual', 'MB', false); - self.metric(server, serverStatus, scope, 'Memory/Mapped', 'mem.mapped', 'MB', false); - self.metric(server, serverStatus, scope, 'Memory/Mapped with journal', 'mem.mappedWithJournal', 'MB', false); - self.metric(server, serverStatus, scope, 'Connections/Current', 'connections.current', null, false); - self.metric(server, serverStatus, scope, 'Connections/Available', 'connections.available', null, false); - self.metric(server, serverStatus, scope, 'Extra info/Heap usage', 'extra_info.heap_usage_bytes', 'MB', false, 1/1048576); - self.metric(server, serverStatus, scope, 'Extra info/Page faults', 'extra_info.page_faults', 'count/minute', true); - self.metric(server, serverStatus, scope, 'Index counters/BTree/Accesses', 'indexCounters.btree.accesses', 'count/minute', true); - self.metric(server, serverStatus, scope, 'Index counters/BTree/Hits', 'indexCounters.btree.hits', 'count/minute', true); - self.metric(server, serverStatus, scope, 'Index counters/BTree/Misses', 'indexCounters.btree.misses', 'count/minute', true); - self.metric(server, serverStatus, scope, 'Index counters/BTree/Resets', 'indexCounters.btree.resets', 'count/minute', true); - self.metric(server, serverStatus, scope, 'Index counters/BTree/Miss ratio', 'indexCounters.btree.missRatio', null, false); - self.metric(server, serverStatus, scope, 'Background flushing/Flushes', 'backgroundFlushing.flushes', 'count/minute', true); - self.metric(server, serverStatus, scope, 'Background flushing/Time', 'backgroundFlushing.total_ms', 'ms/minute', true); - self.metric(server, serverStatus, scope, 'Background flushing/Average time', 'backgroundFlushing.average_ms', 'ms', false); - self.metric(server, serverStatus, scope, 'Cursors/Total open', 'cursors.totalOpen', null, false); - self.metric(server, serverStatus, scope, 'Cursors/Timed out', 'cursors.timedOut', 'count/minute', true); - self.metric(server, serverStatus, scope, 'Network/Bytes in', 'network.bytesIn', 'Bytes/minute', true); - self.metric(server, serverStatus, scope, 'Network/Bytes out', 'network.bytesOut', 'Bytes/minute', true); - self.metric(server, serverStatus, scope, 'Network/Number of requests', 'network.numRequests', 'count/minute', true); - self.metric(server, serverStatus, scope, 'Operation counters/insert', 'opcounters.insert', 'count/minute', true); - self.metric(server, serverStatus, scope, 'Operation counters/query', 'opcounters.query', 'count/minute', true); - self.metric(server, serverStatus, scope, 'Operation counters/update', 'opcounters.update', 'count/minute', true); - self.metric(server, serverStatus, scope, 'Operation counters/delete', 'opcounters.delete', 'count/minute', true); - self.metric(server, serverStatus, scope, 'Operation counters/getmore', 'opcounters.getmore', 'count/minute', true); - self.metric(server, serverStatus, scope, 'Operation counters/command', 'opcounters.command', 'count/minute', true); - - // Journaling stats have intervals smaller than a minute - /* - self.metric(server, serverStatus, scope, '', 'dur.commits', , ); - self.metric(server, serverStatus, scope, '', 'dur.journaledMB', , ); - self.metric(server, serverStatus, scope, '', 'dur.writeToDataFilesMB', , ); - self.metric(server, serverStatus, scope, '', 'dur.compression', , ); - self.metric(server, serverStatus, scope, '', 'dur.commitsInWriteLock', , ); - self.metric(server, serverStatus, scope, '', 'dur.earlyCommits', , ); - self.metric(server, serverStatus, scope, '', 'dur.timeMs.dt', , ); - self.metric(server, serverStatus, scope, '', 'dur.timeMs.prepLogBuffer', , ); - self.metric(server, serverStatus, scope, '', 'dur.timeMs.writeToJournal', , ); - self.metric(server, serverStatus, scope, '', 'dur.timeMs.writeToDataFiles', , ); - self.metric(server, serverStatus, scope, '', 'dur.timeMs.remapPrivateView', , ); - */ -}; - - - -MongoDBMonitor.prototype.loadCollStats = function(coll) { - var self = this; - - var db = new self.mongodb.Db( - coll.dbName, - new self.mongodb.Server(coll.host, coll.port, {'auto_reconnect': false, 'poolSize': 1}), - {safe: false}); - - db.open(function(err) { - if(err) return self.done(db, err); - - if(coll.auth) { - if(coll.auth.authdb === 'admin') { - try { - db.admin(function(err, adminDb) { - if(err) return self.done(db, err); - if(!adminDb) return; - - try { - adminDb.authenticate(coll.auth.username, coll.auth.password, function(err, result) { - if(err) return self.done(db, err); - if(!result) return self.done(db, 'mongodb server auth failed'); - - loadStats(); - }); - } - catch(err) { - self.done(db, err); - } - }); - } - catch(err) { - self.done(db, err); - } - } - else { - try { - db.authenticate(coll.auth.username, coll.auth.password, function(err, result) { - if(err) return self.done(db, err); - if(!result) return self.done(db, 'mongodb server auth failed'); - - loadStats(); - }); - } - catch(err) { - self.done(db, err); - } - } - } - else { - loadStats(); - } - - - function loadStats() { - try { - db.collection(coll.collName, function(err, collection) { - if(err) return self.done(db, err); - - try { - collection.stats(function(err, stats) { - if(err) return self.done(db, err); - if(!stats) return self.done(db); - - try { - self.extractCollMetrics(coll, stats) - - self.done(db); - } - catch(err) { - self.done(db, err); - } - }); - } - catch(err) { - self.done(db, err); - } - }); - } - catch(err) { - self.done(db, err); - } - } - }); -}; - - - -MongoDBMonitor.prototype.extractCollMetrics = function(coll, stats) { - var self = this; - - var scope = - 'MongoDB Collection/' + - coll.host + ':' + coll.port + '/' + - coll.dbName + '/' + - coll.collName; - - self.metric(coll, stats, scope, 'Object count', 'count', null, false); - self.metric(coll, stats, scope, 'Collection size', 'size' ,'_KB', false); - self.metric(coll, stats, scope, 'Average object size', 'avgObjSize', '_KB', false); - self.metric(coll, stats, scope, 'Storage size', 'storageSize', '_KB', false); - self.metric(coll, stats, scope, 'Index size', 'totalIndexSize', '_KB', false); - self.metric(coll, stats, scope, 'Padding factor', 'paddingFactor', null, false); -}; - diff --git a/node_modules/nodetime/lib/monitors/redis-monitor.js b/node_modules/nodetime/lib/monitors/redis-monitor.js deleted file mode 100644 index 8ca4f85..0000000 --- a/node_modules/nodetime/lib/monitors/redis-monitor.js +++ /dev/null @@ -1,161 +0,0 @@ -'use strict'; - - - -/* - * Redis server stats. - */ - -function RedisMonitor(agent) { - this.agent = agent; - - this.redis = undefined; - - this.clientsCount = 0; - this.clients = {}; -} -exports.RedisMonitor = RedisMonitor; - - - -RedisMonitor.prototype.init = function(redis) { - var self = this; - - self.redis = redis; - - self.agent.timers.setInterval(function() { - for(var address in self.clients) { - try { - self.loadInfo(self.clients[address]); - } - catch(err) { - self.agent.logger.error(err); - } - } - }, 60000); -} - - - -RedisMonitor.prototype.monitorServer = function(host, port, password) { - var self = this; - - if(!self.agent.features.redisMetrics) return; - - var address = host + ':' + port; - if(self.clients[address]) { - if(password) { - self.clients[address].password = password; - } - } - else if(++self.clientsCount <= 10) { - self.clients[address] = { - host: host, - port: port, - password: password, - lastValues: {} - }; - } -} - - -RedisMonitor.prototype.metric = function(client, info, scope, name, key, unit, isRelative, scale) { - var self = this; - - var numVal = parseFloat(info[key]); - if(typeof(numVal) !== 'number') return; - - if(scale) { - numVal = numVal * scale; - } - - if(isRelative) { - if(client.lastValues[key]) { - self.agent.metric( - scope, - name, - numVal - client.lastValues[key], - unit, - 'gauge'); - } - - client.lastValues[key] = numVal; - } - else { - self.agent.metric( - scope, - name, - numVal, - unit, - 'gauge'); - } -}; - - -RedisMonitor.prototype.done = function(rClient, err) { - var self = this; - - try { - rClient.quit(); - } - catch(err2) { - try { - rClient.end(); - } - catch(err3) { - self.agent.logger.error(err3); - } - - self.agent.logger.error(err2); - } - - self.agent.logger.error(err); -}; - - -RedisMonitor.prototype.loadInfo = function(client) { - var self = this; - - var rClient = self.redis.createClient(client.port, client.host); - - rClient.on('error', function(err) { - self.done(rClient, err); - }); - - if(client.password) { - rClient.auth(client.password, function(err) { - if(err) self.done(rClient, err); - }); - } - - rClient.on('ready', function() { - try { - var info = rClient.server_info; - var scope = 'Redis Server/' + client.host + ':' + client.port; - - self.metric(client, info, scope, 'Used CPU sys' ,'used_cpu_sys' , null, true); - self.metric(client, info, scope, 'Used CPU user' ,'used_cpu_user' , null, true); - self.metric(client, info, scope, 'Connected clients' ,'connected_clients' , null, false); - self.metric(client, info, scope, 'Connected slaves' ,'connected_slaves' , null, false); - self.metric(client, info, scope, 'Blocked clients' ,'blocked_clients' , null, false); - self.metric(client, info, scope, 'Expired keys', 'expired_keys' , null, true); - self.metric(client, info, scope, 'Evicted keys' ,'evicted_keys' , null, true); - self.metric(client, info, scope, 'Keyspace hits' ,'keyspace_hits' , null, true); - self.metric(client, info, scope, 'Keyspace misses' ,'keyspace_misses' , null, true); - self.metric(client, info, scope, 'Connections received' ,'total_connections_received' , null, true); - self.metric(client, info, scope, 'Commands processed' ,'total_commands_processed' , null, true); - self.metric(client, info, scope, 'Rejected connections' ,'rejected_connections' , null, true); - self.metric(client, info, scope, 'Used memory', 'used_memory', 'KB', false, 1/1024); - self.metric(client, info, scope, 'Used memory RSS' , 'used_memory_rss', 'KB', false); - self.metric(client, info, scope, 'Memory fragmentation ratio' , 'mem_fragmentation_ratio', null, false); - self.metric(client, info, scope, 'PubSub channels' ,'pubsub_channels' , null, false); - - self.done(rClient); - } - catch(err) { - self.done(rClient, err); - } - }); -}; - - diff --git a/node_modules/nodetime/lib/probes/cassandra-client-probe.js b/node_modules/nodetime/lib/probes/cassandra-client-probe.js deleted file mode 100644 index d23c4a5..0000000 --- a/node_modules/nodetime/lib/probes/cassandra-client-probe.js +++ /dev/null @@ -1,114 +0,0 @@ -'use strict'; - -function CassandraClientProbe(agent) { - this.agent = agent; - - this.packages = ['cassandra']; -} -exports.CassandraClientProbe = CassandraClientProbe; - - -CassandraClientProbe.prototype.attach = function(obj) { - var self = this; - - if(obj.__nodetimeProbeAttached__) return; - obj.__nodetimeProbeAttached__ = true; - - var proxy = self.agent.proxy; - var profiler = self.agent.profiler; - var counter = profiler.createSkipCounter(); - var metrics = profiler.createCallMetricsGroups(); - var type = 'Cassandra'; - - // connect - [obj.Connection.prototype, obj.PooledConnection.prototype].forEach(function(proto) { - proxy.before(proto, 'connect', function(obj, args) { - var client = obj; - var trace = profiler.stackTrace(); - var time = profiler.time(type, 'connect'); - metrics.callStart(type, null, time); - metrics.callStart(type, 'connect', time); - - proxy.callback(args, -1, function(obj, args) { - if(!time.done(proxy.hasError(args))) return; - metrics.callDone(type, null, time); - metrics.callDone(type, command, time); - if(counter.skip(time)) return; - - var error = proxy.getErrorMessage(args); - var sample = profiler.createSample(); - sample['Type'] = type; - sample['Connection'] = connection(client); - sample['Command'] = 'connect'; - sample['Stack trace'] = trace; - sample['Error'] = error; - sample._group = type + ': connect'; - sample._label = type + ': connect'; - - profiler.addSample(time, sample); - }); - }); - }); - - - // execute - [obj.Connection.prototype, obj.PooledConnection.prototype].forEach(function(proto) { - proxy.before(proto, 'execute', function(obj, args) { - var client = obj; - var trace = profiler.stackTrace(); - var command = args.length > 0 ? args[0] : undefined; - var params = args.length > 1 && Array.isArray(args[1]) ? args[1] : undefined; - var time = profiler.time(type, 'execute'); - metrics.callStart(type, null, time); - metrics.callStart(type, 'execute', time); - - proxy.callback(args, -1, function(obj, args) { - if(!time.done()) return; - metrics.callDone(type, null, time); - metrics.callDone(type, 'execute', time); - if(counter.skip(time)) return; - - var error = args.length > 0 ? (args[0] ? args[0].message : undefined) : undefined; - var sample = profiler.createSample(); - sample['Type'] = type; - sample['Connection'] = connection(client); - sample['Command'] = command; - sample['Arguments'] = profiler.truncate(params); - sample['Stack trace'] = trace; - sample['Error'] = error; - sample._group = type + ': ' + command; - sample._label = type + ': ' + command; - - profiler.addSample(time, sample); - }); - }); - }); -}; - - -var connection = function(client) { - var connection = undefined; - - if(client.connectionInfo) { - connection = { - host: client.connectionInfo.host, - port: client.connectionInfo.port, - keyspace: client.connectionInfo.keyspace, - user: client.connectionInfo.user - }; - } - else if(client.connections && client.connections.length > 0) { - connection = []; - conn.connections.forEach(function(conn) { - connection.push({ - host: conn.host, - port: conn.port, - keyspace: conn.keyspace, - user: conn.user - }); - }); - } - - return connection; -}; - diff --git a/node_modules/nodetime/lib/probes/cassandra-probe.js b/node_modules/nodetime/lib/probes/cassandra-probe.js deleted file mode 100644 index 0b20472..0000000 --- a/node_modules/nodetime/lib/probes/cassandra-probe.js +++ /dev/null @@ -1,71 +0,0 @@ -'use strict'; - - -var commands = [ - 'get', - 'count', - 'set', - 'remove', - 'truncate', - 'use', - 'addKeySpace', - 'dropKeySpace' -]; - - -/* - * This probe is not used. Should be revisited. - */ - -function CassandraProbe(agent) { - this.agent = agent; - - this.packages = ['cassandra']; -} -exports.CassandraProbe = CassandraProbe; - - -CassandraProbe.prototype.attach = function(obj) { - var self = this; - - if(obj.__nodetimeProbeAttached__) return; - obj.__nodetimeProbeAttached__ = true; - - var proxy = self.agent.proxy; - var profiler = self.agent.profiler; - var counter = profiler.createSkipCounter(); - var metrics = profiler.createCallMetricsGroups(); - var type = 'Cassandra'; - - commands.forEach(function(command) { - proxy.before(obj.ColumnFamily.prototype, command, function(obj, args) { - var cf = obj; - var trace = profiler.stackTrace(); - var params = args.length > 1 && Array.isArray(args[1]) ? args[1] : undefined; - var time = profiler.time(type, command); - metrics.callStart(type, null, time); - metrics.callStart(type, command, time); - - proxy.callback(args, -1, function(obj, args) { - if(!time.done(proxy.hasError(args)))) return; - metrics.callDone(type, null, time); - metrics.callDone(type, command, time); - if(counter.skip(time)) return; - - var error = proxy.getErrorMessage(args); - var sample = profiler.createSample(); - sample['Type'] = type; - sample['Connection'] = {host: cf.client_.host, port: cf.client_.port, keyspace: cf.client_.keyspace, columnFamily: cf.name}; - sample['Command'] = command; - sample['Arguments'] = profiler.truncate(params); - sample['Stack trace'] = trace; - sample['Error'] = error; - sample._group = type + ': ' + command; - sample._label = type + ': ' + command; - - profiler.addSample(time, sample); - }); - }); - }); -}; - diff --git a/node_modules/nodetime/lib/probes/fs-probe.js b/node_modules/nodetime/lib/probes/fs-probe.js deleted file mode 100644 index 3ac42f3..0000000 --- a/node_modules/nodetime/lib/probes/fs-probe.js +++ /dev/null @@ -1,114 +0,0 @@ -'use strict'; - - -var commands = [ - 'rename', - 'truncate', - 'chown', - 'fchown', - 'lchown', - 'chmod', - 'fchmod', - 'lchmod', - 'stat', - 'lstat', - 'fstat', - 'link', - 'symlink', - 'readlink', - 'realpath', - 'unlink', - 'rmdir', - 'mkdir', - 'readdir', - 'close', - 'open', - 'utimes', - 'futimes', - 'fsync', - 'write', - 'read', - 'readFile', - 'writeFile', - 'appendFile', - 'exists' -]; - - -function FsProbe(agent) { - this.agent = agent; - - this.packages = ['fs']; -} -exports.FsProbe = FsProbe; - - - -FsProbe.prototype.attach = function(obj) { - var self = this; - - if(obj.__nodetimeProbeAttached__) return; - obj.__nodetimeProbeAttached__ = true; - - var proxy = self.agent.proxy; - var profiler = self.agent.profiler; - var counter = profiler.createSkipCounter(); - var metrics = profiler.createCallMetricsGroups(); - var type = 'File System'; - - commands.forEach(function(command) { - proxy.before(obj, command, function(obj, args) { - var trace = profiler.stackTrace(); - var params = args; - var time = profiler.time(type, command); - metrics.callStart(type, null, time); - metrics.callStart(type, command, time); - - proxy.callback(args, -1, function(obj, args) { - if(!time.done(proxy.hasError(args))) return; - metrics.callDone(type, null, time); - metrics.callDone(type, command, time); - if(counter.skip(time)) return; - - var error = proxy.getErrorMessage(args); - var sample = profiler.createSample(); - sample['Type'] = type; - sample['Command'] = command; - sample['Arguments'] = profiler.truncate(params); - sample['Stack trace'] = trace; - sample['Error'] = error; - sample._group = type + ': ' + command; - sample._label = type + ': ' + command; - - profiler.addSample(time, sample); - }); - }); - - - var commandSync = command + 'Sync'; - proxy.around(obj, commandSync, function(obj, args, locals) { - locals.stackTrace = profiler.stackTrace(); - locals.params = args; - locals.time = profiler.time(type, commandSync); - metrics.callStart(type, null, locals.time); - metrics.callStart(type, commandSync, locals.time); - - }, function(obj, args, ret, locals) { - if(!locals.time.done()) return; - metrics.callDone(type, null, locals.time); - metrics.callDone(type, commandSync, locals.time); - if(counter.skip(locals.time)) return; - - var sample = profiler.createSample(); - sample['Type'] = type; - sample['Command'] = commandSync; - sample['Arguments'] = profiler.truncate(locals.params); - sample['Stack trace'] = locals.stackTrace; - sample._group = type + ': ' + commandSync; - sample._label = type + ': ' + commandSync; - - profiler.addSample(locals.time, sample); - }); - }); -}; - diff --git a/node_modules/nodetime/lib/probes/global-probe.js b/node_modules/nodetime/lib/probes/global-probe.js deleted file mode 100644 index 4d3c248..0000000 --- a/node_modules/nodetime/lib/probes/global-probe.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict'; - - -function GlobalProbe(agent) { - this.agent = agent; -} -exports.GlobalProbe = GlobalProbe; - - - -GlobalProbe.prototype.attach = function(obj) { - var self = this; - - var proxy = self.agent.proxy; - var thread = self.agent.thread; - - // we need these for thread simulation - proxy.before(obj, ['setTimeout', 'setInterval'], function(obj, args) { - var threadId = thread.current(); - proxy.callback(args, 0, function(obj, args) { - thread.resume(threadId); - }); - }); -}; \ No newline at end of file diff --git a/node_modules/nodetime/lib/probes/http-probe.js b/node_modules/nodetime/lib/probes/http-probe.js deleted file mode 100644 index be1a21d..0000000 --- a/node_modules/nodetime/lib/probes/http-probe.js +++ /dev/null @@ -1,162 +0,0 @@ -'use strict'; - - -function HttpProbe(agent) { - this.agent = agent; - - this.packages = ['http', 'https']; -} -exports.HttpProbe = HttpProbe; - - - -HttpProbe.prototype.attach = function(obj) { - var self = this; - - if(obj.__nodetimeProbeAttached__) return; - obj.__nodetimeProbeAttached__ = true; - - var proxy = self.agent.proxy; - var profiler = self.agent.profiler; - var counter = profiler.createSkipCounter(); - var serverMetrics = profiler.createCallMetricsGroups(); - var clientMetrics = profiler.createCallMetricsGroups(); - - var typeServer = 'HTTP Server'; - var typeClient = 'HTTP Client'; - - - // server probe - proxy.before(obj.Server.prototype, ['on', 'addListener'], function(obj, args) { - if(args[0] !== 'request') return; - - if(obj.__httpProbe__) return; - obj.__httpProbe__ = true; - - proxy.callback(args, -1, function(obj, args) { - var req = args[0]; - var res = args[1]; - var group = self.agent.namedTransactions.matchRequest(req); - var time = profiler.time(typeServer, group, true); - serverMetrics.callStart(typeServer, null, time); - if(group) serverMetrics.callStart(typeServer, group, time); - - var skipSample = counter.skip(time); - if(!skipSample) { - profiler.startTransaction(time); - } - - proxy.after(res, 'end', function(obj, args) { - var error = res.__caughtException__; - if(error) res.__caughtException__ = undefined; - - if(!time.done(error ? true : false)) return; - serverMetrics.callDone(typeServer, null, time); - if(group) serverMetrics.callDone(typeServer, group, time); - if(skipSample) return; - - var sample = profiler.createSample(); - sample['Type'] = typeServer; - sample['Method'] = req.method; - sample['URL'] = req.url; - sample['Request headers'] = req.headers; - sample['Status code'] = res.statusCode; - sample['Stack trace'] = profiler.formatStackTrace(error); - sample['Error'] = (error ? (error.message || 'Uncaught exeption') : undefined); - sample._group = typeServer; - sample._label = req.url; - - profiler.addSample(time, sample); - }); - }); - }); - - - // client error probe - proxy.after(obj, 'request', function(obj, args, ret) { - var time = undefined; - var trace = profiler.stackTrace(); - var opts = args[0]; - var group = (opts.method || 'GET'); - - // exclude api communication - if(opts && opts.headers && opts.headers['X-Agent-Version']) return; - - proxy.before(ret, 'end', function(obj, args) { - time = opts.__time__ = !opts.__time__ ? profiler.time(typeClient, opts.method || 'GET') : undefined; - clientMetrics.callStart(typeClient, null, time); - clientMetrics.callStart(typeClient, group, time); - }); - - proxy.before(ret, ['on', 'addListener'], function(obj, args) { - if(args[0] !== 'error') return; - - proxy.callback(args, -1, function(obj, args) { - if(!time || !time.done(proxy.hasError(args))) return; - clientMetrics.callDone(typeClient, null, time); - clientMetrics.callDone(typeClient, group, time); - if(counter.skip(time)) return; - - var error = proxy.getErrorMessage(args); - var sample = profiler.createSample(); - sample['Type'] = typeClient; - sample['Method'] = opts.method; - sample['URL'] = - (opts.hostname || opts.host) + - (opts.port ? ':' + opts.port : '') + - (opts.path || '/'); - sample['Request headers'] = opts.headers; - sample['Stack trace'] = trace; - sample['Error'] = error; - sample._group = typeClient + ': ' + group; - sample._label = typeClient + ': ' + sample.URL; - - profiler.addSample(time, sample); - }); - }); - }); - - - // client probe - proxy.before(obj, 'request', function(obj, args) { - var trace = profiler.stackTrace(); - var opts = args[0]; - var group = (opts.method || 'GET'); - - // exclude api communication - if(opts && opts.headers && opts.headers['X-Agent-Version']) return; - - proxy.callback(args, -1, function(obj, args) { - var res = args[0]; - proxy.before(res, ['on', 'addListener'], function(obj, args) { - if(args[0] !== 'end') return; - - proxy.callback(args, -1, function(obj, args) { - var time = opts.__time__; - if(!time || !time.done()) return; - clientMetrics.callDone(typeClient, null, time); - clientMetrics.callDone(typeClient, group, time); - if(counter.skip(time)) return; - - var sample = profiler.createSample(); - sample['Type'] = typeClient; - sample['Method'] = opts.method; - sample['URL'] = - (opts.hostname || opts.host) + - (opts.port ? ':' + opts.port : '') + - (opts.path || '/'); - sample['Request headers'] = opts.headers; - sample['Response headers'] = res.headers; - sample['Status code'] = res.statusCode; - sample['Stack trace'] = trace; - sample._group = typeClient + ': ' + group; - sample._label = typeClient + ': ' + sample.URL; - - profiler.addSample(time, sample); - }); - }); - }); - }); -}; - - diff --git a/node_modules/nodetime/lib/probes/memcache-probe.js b/node_modules/nodetime/lib/probes/memcache-probe.js deleted file mode 100644 index 9c27ae1..0000000 --- a/node_modules/nodetime/lib/probes/memcache-probe.js +++ /dev/null @@ -1,126 +0,0 @@ -'use strict'; - - -var commands = [ - 'get', - 'set', - 'delete', - 'add', - 'replace', - 'append', - 'prepend', - 'cas', - 'increment', - 'decrement', - 'stats' -]; - - - -function MemcacheProbe(agent) { - this.agent = agent; - - this.packages = ['memcache']; -} -exports.MemcacheProbe = MemcacheProbe; - - - -MemcacheProbe.prototype.attach = function(obj) { - var self = this; - - if(obj.__nodetimeProbeAttached__) return; - obj.__nodetimeProbeAttached__ = true; - - var proxy = self.agent.proxy; - var profiler = self.agent.profiler; - var counter = profiler.createSkipCounter(); - var metrics = profiler.createCallMetricsGroups(); - var type = 'Memcached'; - - // connect - proxy.after(obj.Client.prototype, 'connect', function(obj, args, ret) { - obj.__trace__ = profiler.stackTrace(); - obj.__time__ = profiler.time(type, 'connect'); - metrics.callStart(type, null, obj.__time__); - metrics.callStart(type, 'connect', obj.__time__); - }); - - proxy.before(obj.Client.prototype, 'on', function(obj, args) { - var client = obj; - var event = args[0]; - if(event !== 'connect' && event !== 'timeout' && event !== 'error') return; - - proxy.callback(args, -1, function(obj, args) { - var time = client.__time__; - if(!time || !time.done(proxy.hasError(args))) return; - metrics.callDone(type, null, time); - metrics.callDone(type, 'connect', time); - if(counter.skip(time)) return; - - var error = undefined; - if(event === 'timeout') { - error = 'socket timeout'; - } - else if(event === 'error') { - error = proxy.getErrorMessage(args); - } - - var command = 'connect'; - var sample = profiler.createSample(); - sample['Type'] = type; - sample['Connection'] = {host: client.host, port: client.port}; - sample['Command'] = command; - sample['Stack trace'] = client.__trace__; - sample['Error'] = error; - sample._group = type + ': ' + command; - sample._label = type + ': ' + command; - - profiler.addSample(time, sample); - }); - }); - - - // commands - commands.forEach(function(command) { - proxy.before(obj.Client.prototype, command, function(obj, args) { - var client = obj; - var trace = profiler.stackTrace(); - var params = args; - var time = profiler.time(type, command); - metrics.callStart(type, null, time); - metrics.callStart(type, command, time); - - // there might be args after callback, need to do extra callback search - var pos = findCallback(args); - if(pos == undefined) return; - - proxy.callback(args, pos, function(obj, args) { - if(!time.done(proxy.hasError(args))) return; - metrics.callDone(type, null, time); - metrics.callDone(type, command, time); - if(counter.skip(time)) return; - - var error = proxy.getErrorMessage(args); - var sample = profiler.createSample(); - sample['Type'] = 'Memcached'; - sample['Connection'] = {host: client.host, port: client.port}; - sample['Command'] = command; - sample['Arguments'] = profiler.truncate(params); - sample['Stack trace'] = trace; - sample['Error'] = error; - sample._group = type + ': ' + command; - sample._label = type + ': ' + command; - - profiler.addSample(time, sample); - }); - }); - }); -}; - -var findCallback = function(args) { - for(var i = 0; i < args.length; i++) - if(typeof args[i] === 'function') return i; -}; - - diff --git a/node_modules/nodetime/lib/probes/memcached-probe.js b/node_modules/nodetime/lib/probes/memcached-probe.js deleted file mode 100644 index 8fc39bb..0000000 --- a/node_modules/nodetime/lib/probes/memcached-probe.js +++ /dev/null @@ -1,88 +0,0 @@ -'use strict'; - - -var commands = [ - 'get', - 'gets', - 'getMulti', - 'set', - 'replace', - 'add', - 'cas', - 'append', - 'prepend', - 'increment', - 'decrement', - 'incr', - 'decr', - 'del', - 'delete', - 'version', - 'flush', - 'samples', - 'slabs', - 'items', - 'flushAll', - 'statsSettings', - 'statsSlabs', - 'statsItems', - 'cachedump' -]; - - -function MemcachedProbe(agent) { - this.agent = agent; - - this.packages = ['memcached']; -} -exports.MemcachedProbe = MemcachedProbe; - - - -MemcachedProbe.prototype.attach = function(obj) { - var self = this; - - if(obj.__nodetimeProbeAttached__) return; - obj.__nodetimeProbeAttached__ = true; - - var proxy = self.agent.proxy; - var profiler = self.agent.profiler; - var counter = profiler.createSkipCounter(); - var metrics = profiler.createCallMetricsGroups(); - var type = 'Memcached'; - - commands.forEach(function(command) { - proxy.before(obj.prototype, command, function(obj, args) { - // ignore, getMulti will be called - if(command === 'get' && Array.isArray(args[0])) return; - - var client = obj; - var trace = profiler.stackTrace(); - var params = args; - var time = profiler.time(type, command); - metrics.callStart(type, null, time); - metrics.callStart(type, command, time); - - proxy.callback(args, -1, function(obj, args) { - if(!time.done(proxy.hasError(args))) return; - metrics.callDone(type, null, time); - metrics.callDone(type, command, time); - if(counter.skip(time)) return; - - var error = proxy.getErrorMessage(args); - var sample = profiler.createSample(); - sample['Type'] = type; - sample['Servers'] = client.servers; - sample['Command'] = command; - sample['Arguments'] = profiler.truncate(params); - sample['Stack trace'] = trace; - sample['Error'] = error; - sample._group = type + ': ' + command; - sample._label = type + ': ' + command; - - profiler.addSample(time, sample); - }); - }); - }); -}; - diff --git a/node_modules/nodetime/lib/probes/mongodb-probe.js b/node_modules/nodetime/lib/probes/mongodb-probe.js deleted file mode 100644 index 6e56934..0000000 --- a/node_modules/nodetime/lib/probes/mongodb-probe.js +++ /dev/null @@ -1,129 +0,0 @@ -'use strict'; - -var MongoDBMonitor = require('../monitors/mongodb-monitor').MongoDBMonitor; - - - -var internalCommands = [ - '_executeQueryCommand', - '_executeInsertCommand', - '_executeUpdateCommand', - '_executeRemoveCommand' -]; - -var commandMap = { - '_executeQueryCommand': 'find', - '_executeInsertCommand': 'insert', - '_executeUpdateCommand': 'update', - '_executeRemoveCommand': 'remove' -}; - - - -function MongodbProbe(agent) { - this.agent = agent; - - this.packages = ['mongodb']; -} -exports.MongodbProbe = MongodbProbe; - - - -MongodbProbe.prototype.attach = function(obj) { - var self = this; - - if(obj.__nodetimeProbeAttached__) return; - obj.__nodetimeProbeAttached__ = true; - - var proxy = self.agent.proxy; - var profiler = self.agent.profiler; - var counter = profiler.createSkipCounter(); - var metrics = profiler.createCallMetricsGroups(); - var type = 'MongoDB'; - - - var mongodbMonitor = new MongoDBMonitor(self.agent); - mongodbMonitor.init(obj); - - - internalCommands.forEach(function(internalCommand) { - var commandName = commandMap[internalCommand] || internalCommand; - - proxy.before(obj.Db.prototype, internalCommand, function(obj, args) { - var trace = profiler.stackTrace(); - var command = (args && args.length > 0) ? args[0] : undefined; - - var time = profiler.time(type, commandName); - metrics.callStart(type, null, time); - metrics.callStart(type, commandName, time); - - proxy.callback(args, -1, function(obj, args) { - if(!time.done()) return; - metrics.callDone(type, null, time); - metrics.callDone(type, commandName, time); - if(counter.skip(time)) return; - - var conn = {}; - if(command && command.db) { - var auth; - if(command.db.auths && command.db.auths.length > 0) { - auth = command.db.auths[0]; - } - - var servers = command.db.serverConfig; - if(servers) { - if(Array.isArray(servers)) { - conn.servers = []; - servers.forEach(function(server) { - conn.servers.push({host: server.host, port: server.port}); - - mongodbMonitor.monitorCollection( - server.host, - server.port, - command.db.databaseName, - command.collectionName, - auth - ); - }); - } - else { - conn.host = servers.host; - conn.port = servers.port; - - mongodbMonitor.monitorCollection( - servers.host, - servers.port, - command.db.databaseName, - command.collectionName, - auth - ); - } - } - - conn.database = command.db.databaseName; - } - - var query = command.query ? profiler.truncate(JSON.stringify(command.query)) : '{}'; - var error = proxy.getErrorMessage(args); - - var sample = profiler.createSample(); - sample['Type'] = type; - sample['Connection'] = conn; - sample['Command'] = { - collectionName: command.collectionName, - commandName: commandName, - query: query, - queryOptions: command.queryOptions, - numberToSkip: command.numberToSkip, - numberToReturn: command.numberToReturn}; - sample['Stack trace'] = trace; - sample['Error'] = error; - sample._group = type + ': ' + commandName; - sample._label = type + ': ' + commandName; - - profiler.addSample(time, sample); - }); - }); - }); -}; - diff --git a/node_modules/nodetime/lib/probes/mysql-probe.js b/node_modules/nodetime/lib/probes/mysql-probe.js deleted file mode 100644 index a58c666..0000000 --- a/node_modules/nodetime/lib/probes/mysql-probe.js +++ /dev/null @@ -1,64 +0,0 @@ -'use strict'; - - -function MysqlProbe(agent) { - this.agent = agent; - - this.packages = ['mysql']; -} -exports.MysqlProbe = MysqlProbe; - - - -MysqlProbe.prototype.attach = function(obj) { - var self = this; - - if(obj.__nodetimeProbeAttached__) return; - obj.__nodetimeProbeAttached__ = true; - - var proxy = self.agent.proxy; - var profiler = self.agent.profiler; - var counter = profiler.createSkipCounter(); - var metrics = profiler.createCallMetricsGroups(); - var type = 'MySQL'; - - ['createClient', 'createConnection'].forEach(function(createCmd) { - proxy.after(obj, createCmd, function(obj, args, ret) { - var client = ret; - var config = (createCmd === 'createClient' ? client : client.config); - if(!config) return; - - proxy.before(client, 'query', function(obj, args) { - var trace = profiler.stackTrace(); - var command = args.length > 0 ? args[0] : undefined; - var params = args.length > 1 && Array.isArray(args[1]) ? args[1] : undefined; - var time = profiler.time(type, "query"); - metrics.callStart(type, null, time); - - proxy.callback(args, -1, function(obj, args) { - if(!time.done(proxy.hasError(args))) return; - metrics.callDone(type, null, time); - if(counter.skip(time)) return; - - var error = proxy.getErrorMessage(args); - var sample = profiler.createSample(); - sample['Type'] = type; - sample['Connection'] = { - host: config.host, - port: config.port, - user: config.user, - database: config.database !== '' ? config.database : undefined}; - sample['Command'] = profiler.truncate(command); - sample['Arguments'] = profiler.truncate(params); - sample['Stack trace'] = trace; - sample['Error'] = error; - sample._group = type + ': ' + 'query'; - sample._label = type + ': ' + sample['Command']; - - profiler.addSample(time, sample); - }); - }); - }); - }); -}; - diff --git a/node_modules/nodetime/lib/probes/net-probe.js b/node_modules/nodetime/lib/probes/net-probe.js deleted file mode 100644 index d55bd39..0000000 --- a/node_modules/nodetime/lib/probes/net-probe.js +++ /dev/null @@ -1,58 +0,0 @@ -'use strict'; - - -function NetProbe(agent) { - this.agent = agent; - - this.packages = ['net']; -} -exports.NetProbe = NetProbe; - - - -NetProbe.prototype.attach = function(obj) { - var self = this; - - if(obj.__nodetimeProbeAttached__) return; - obj.__nodetimeProbeAttached__ = true; - - var proxy = self.agent.proxy; - - var bytesWritten = 0; - var bytesRead = 0; - - self.agent.timers.setInterval(function() { - self.agent.metric('Network', 'Data sent per minute', bytesWritten / 1024, 'KB', 'avg'); - self.agent.metric('Network', 'Data received per minute', bytesRead / 1024, 'KB', 'avg'); - - bytesWritten = bytesRead = 0; - }, 60000); - - - proxy.after(obj, ['connect', 'createConnection'], function(obj, args, ret) { - var socket = ret; - var lastBytesWritten = 0; - var lastBytesRead = 0; - var currentBytesWritten = 0; - var currentBytesRead = 0; - - proxy.before(ret, ['write', 'end'], function(obj, args) { - currentBytesWritten = socket.bytesWritten || 0; - bytesWritten += currentBytesWritten - lastBytesWritten; - self.agent.processState.bytesWritten += currentBytesWritten - lastBytesWritten; - lastBytesWritten = currentBytesWritten; - }); - - proxy.before(ret, 'on', function(obj, args) { - if(args.length < 1 || args[0] !== 'data') return; - - proxy.callback(args, -1, function(obj, args) { - currentBytesRead = socket.bytesRead || 0; - bytesRead += currentBytesRead - lastBytesRead; - self.agent.processState.bytesRead += currentBytesRead - lastBytesRead; - lastBytesRead = currentBytesRead; - }); - }); - }); -}; - diff --git a/node_modules/nodetime/lib/probes/pg-probe.js b/node_modules/nodetime/lib/probes/pg-probe.js deleted file mode 100644 index eac6cd9..0000000 --- a/node_modules/nodetime/lib/probes/pg-probe.js +++ /dev/null @@ -1,132 +0,0 @@ -'use strict'; - - -function PgProbe(agent) { - this.agent = agent; - - this.packages = ['pg']; -} -exports.PgProbe = PgProbe; - - - -PgProbe.prototype.attach = function(obj) { - var self = this; - - if(obj.__nodetimeProbeAttached__) return; - obj.__nodetimeProbeAttached__ = true; - - var proxy = self.agent.proxy; - var profiler = self.agent.profiler; - var counter = profiler.createSkipCounter(); - var metrics = profiler.createCallMetricsGroups(); - var type = 'PostgreSQL'; - - - function probe(obj) { - if(obj.__nodetimeProbeAttached__) return; - obj.__nodetimeProbeAttached__ = true; - - // Callback API - proxy.before(obj, 'query', function(obj, args, ret) { - var client = obj; - var trace = profiler.stackTrace(); - var command = args.length > 0 ? args[0] : undefined; - var params = args.length > 1 && Array.isArray(args[1]) ? args[1] : undefined; - var time = profiler.time(type, "query"); - metrics.callStart(type, null, time); - - proxy.callback(args, -1, function(obj, args) { - if(!time.done(proxy.hasError(args))) return; - metrics.callDone(type, null, time); - if(counter.skip(time)) return; - - var error = proxy.getErrorMessage(args); - var sample = profiler.createSample(); - sample['Type'] = type; - sample['Connection'] = { - host: client.host, - port: client.port, - user: client.user, - database: client.database ? client.database : undefined}; - sample['Command'] = truncate(profile, command); - sample['Arguments'] = profiler.truncate(params); - sample['Stack trace'] = trace; - sample['Error'] = error; - sample._group = type + ': query'; - sample._label = type + ': ' + sample['Command']; - - profiler.addSample(time, sample); - }); - }); - - - // Evented API - proxy.after(obj, 'query', function(obj, args, ret) { - // If has a callback, ignore - if(args.length > 0 && typeof args[args.length - 1] === 'function') return; - - var client = obj; - var trace = profiler.stackTrace(); - var command = args.length > 0 ? args[0] : undefined; - var params = args.length > 1 && Array.isArray(args[1]) ? args[1] : undefined; - var time = profiler.time(type, "query"); - var error; - metrics.callStart(type, null, time); - - proxy.before(ret, 'on', function(obj, args) { - var event = args[0]; - - if(event !== 'end' && event !== 'error') return; - - proxy.callback(args, -1, function(obj, args) { - if(event === 'error') { - error = proxy.getErrorMessage(args); - return; - } - - if(!time.done(proxy.hasError(args))) return; - metrics.callDone(type, null, time); - if(counter.skip(time)) return; - - var sample = profiler.createSample(); - sample['Type'] = type; - sample['Connection'] = { - host: client.host, - port: client.port, - user: client.user, - database: client.database ? client.database : undefined}; - sample['Command'] = truncate(profiler, command); - sample['Arguments'] = profiler.truncate(params); - sample['Stack trace'] = trace; - sample['Error'] = error; - sample._group = type + ': query'; - sample._label = type + ': ' + sample['Command']; - - profiler.addSample(time, sample); - }); - }); - }); - } - - - // Native, reinitialize probe - proxy.getter(obj, 'native', function(obj, ret) { - proxy.after(ret, 'Client', function(obj, args, ret) { - probe(ret.__proto__); - }); - }); - - probe(obj.Client.prototype); -}; - - -function truncate(profiler, str) { - if(str && typeof(str) === 'object') { - str = str.text; - } - - return profiler.truncate(str); -} - - diff --git a/node_modules/nodetime/lib/probes/process-probe.js b/node_modules/nodetime/lib/probes/process-probe.js deleted file mode 100644 index 058f3dc..0000000 --- a/node_modules/nodetime/lib/probes/process-probe.js +++ /dev/null @@ -1,70 +0,0 @@ -'use strict'; - - -function ProcessProbe(agent) { - this.agent = agent; -} -exports.ProcessProbe = ProcessProbe; - - - -ProcessProbe.prototype.attach = function(obj) { - var self = this; - - var proxy = self.agent.proxy; - var thread = self.agent.thread; - - var bytesToStdout = 0; - var bytesToStderr = 0; - var uncaughtExceptions = undefined; - - self.agent.timers.setInterval(function() { - self.agent.metric('Process', 'Data written to STDOUT per minute', bytesToStdout / 1024, 'KB', 'avg'); - self.agent.metric('Process', 'Data written to STDERR per minute', bytesToStderr / 1024, 'KB', 'avg'); - bytesToStdout = bytesToStderr = 0; - - if(uncaughtExceptions !== undefined) { - self.agent.metric('Process', 'Uncaught exceptions', uncaughtExceptions, undefined, 'avg'); - uncaughtExceptions = 0; - } - }, 60000); - - proxy.before(obj.stdout, ['write', 'end'], function(obj, args) { - bytesToStdout += calculateSize(args[0]); - }); - - if(obj.stdout !== obj.stderr) { - proxy.before(obj.stderr, ['write', 'end'], function(obj, args) { - bytesToStderr += calculateSize(args[0]); - }); - } - - proxy.before(obj, ['on', 'addListener'], function(obj, args) { - if(args[0] !== 'uncaughtException') return; - - if(uncaughtExceptions === undefined) { - uncaughtExceptions = 0; - } - - proxy.callback(args, -1, function(obj, args) { - uncaughtExceptions++; - }); - }); - - - // we need nextThick for thread simulation - proxy.before(obj, ['nextTick'], function(obj, args) { - var threadId = thread.current(); - proxy.callback(args, -1, function(obj, args) { - thread.resume(threadId); - }); - }); -}; - - -function calculateSize(args) { - if(args.length < 1) return 0; - - return args[0].length || 0; // approximate for strings -} - diff --git a/node_modules/nodetime/lib/probes/redis-probe.js b/node_modules/nodetime/lib/probes/redis-probe.js deleted file mode 100644 index de7ccaf..0000000 --- a/node_modules/nodetime/lib/probes/redis-probe.js +++ /dev/null @@ -1,198 +0,0 @@ -'use strict'; - - -var RedisMonitor = require('../monitors/redis-monitor').RedisMonitor; - - -var commands = [ - "append", - "auth", - "bgrewriteaof", - "bgsave", - "blpop", - "brpop", - "brpoplpush", - "config", - "dbsize", - "debug", - "decr", - "decrby", - "del", - "discard", - "echo", - "exec", - "exists", - "expire", - "expireat", - "flushall", - "flushdb", - "get", - "getbit", - "getrange", - "getset", - "hdel", - "hexists", - "hget", - "hgetall", - "hincrby", - "hkeys", - "hlen", - "hmget", - "hmset", - "hset", - "hsetnx", - "hvals", - "incr", - "incrby", - "info", - "keys", - "lastsave", - "lindex", - "linsert", - "llen", - "lpop", - "lpush", - "lpushx", - "lrange", - "lrem", - "lset", - "ltrim", - "mget", - "monitor", - "move", - "mset", - "msetnx", - "multi", - "object", - "persist", - "ping", - "psubscribe", - "publish", - "punsubscribe", - "quit", - "randomkey", - "rename", - "renamenx", - "rpop", - "rpoplpush", - "rpush", - "rpushx", - "sadd", - "save", - "scard", - "sdiff", - "sdiffstore", - "select", - "set", - "setbit", - "setex", - "setnx", - "setrange", - "shutdown", - "sinter", - "sinterstore", - "sismember", - "slaveof", - "smembers", - "smove", - "sort", - "spop", - "srandmember", - "srem", - "strlen", - "subscribe", - "sunion", - "sunionstore", - "sync", - "ttl", - "type", - "unsubscribe", - "unwatch", - "watch", - "zadd", - "zcard", - "zcount", - "zincrby", - "zinterstore", - "zrange", - "zrangebyscore", - "zrank", - "zrem", - "zremrangebyrank", - "zremrangebyscore", - "zrevrange", - "zrevrangebyscore", - "zrevrank", - "zscore", - "zunionstore" -]; - - -function RedisProbe(agent) { - this.agent = agent; - - this.packages = ['redis']; -} -exports.RedisProbe = RedisProbe; - - - -RedisProbe.prototype.attach = function(obj) { - var self = this; - - if(obj.__nodetimeProbeAttached__) return; - obj.__nodetimeProbeAttached__ = true; - - var logger = self.agent.logger; - var proxy = self.agent.proxy; - var profiler = self.agent.profiler; - var counter = profiler.createSkipCounter(); - var metrics = profiler.createCallMetricsGroups(); - var type = 'Redis'; - - - var redisMonitor = new RedisMonitor(self.agent); - redisMonitor.init(obj); - - - proxy.after(obj, 'createClient', function(obj, args, ret) { - var client = ret; - - redisMonitor.monitorServer(client.host, client.port); - - commands.forEach(function(command) { - proxy.before(ret, command, function(obj, args) { - var trace = profiler.stackTrace(); - var time = profiler.time(type, command); - metrics.callStart(type, null, time); - metrics.callStart(type, command, time); - var params = args; - - if(command === 'auth' && args.length > 0) { - redisMonitor.monitorServer(client.host, client.port, args[0]); - } - - proxy.callback(args, -1, function(obj, args) { - if(!time.done(proxy.hasError(args))) return; - metrics.callDone(type, null, time); - metrics.callDone(type, command, time); - if(counter.skip(time)) return; - - var error = proxy.getErrorMessage(args); - var sample = profiler.createSample(); - sample['Type'] = type; - sample['Connection'] = {host: client.host, port: client.port}; - sample['Command'] = command; - sample['Arguments'] = profiler.truncate(params); - sample['Stack trace'] = trace; - sample['Error'] = error; - sample._group = type + ': ' + command; - sample._label = type + ': ' + command; - - profiler.addSample(time, sample); - }); - }); - }); - }); -}; - diff --git a/node_modules/nodetime/lib/probes/socket.io-probe.js b/node_modules/nodetime/lib/probes/socket.io-probe.js deleted file mode 100644 index 811e891..0000000 --- a/node_modules/nodetime/lib/probes/socket.io-probe.js +++ /dev/null @@ -1,77 +0,0 @@ -'use strict'; - - -function SocketioProbe(agent) { - this.agent = agent; - - this.packages = ['socket.io']; - this.attached = false; -} -exports.SocketioProbe = SocketioProbe; - - - -SocketioProbe.prototype.attach = function(obj) { - var self = this; - - if(obj.__nodetimeProbeAttached__) return; - obj.__nodetimeProbeAttached__ = true; - - var proxy = self.agent.proxy; - var profiler = self.agent.profiler; - var metricsManager = self.agent.metricsManager; - - var connectCount = undefined; - - var connectCountMetric = metricsManager.createMetric('Socket.io', 'Socket count', null, 'avg'); - var sentCountMetric = metricsManager.createMetric('Socket.io', 'Messages sent per minute', null, 'sum'); - var receivedCountMetric = metricsManager.createMetric('Socket.io', 'Messages received per minute', null, 'sum'); - - self.agent.timers.setInterval(function() { - if(connectCount !== undefined) { - connectCountMetric.addValue(connectCount); - } - }, 60000); - - - proxy.after(obj, 'listen', function(obj, args, ret) { - if(!ret.sockets) return; - - if(connectCount === undefined) { - connectCount = 0; - } - - proxy.before(ret.sockets, ['on', 'addListener'], function(obj, args) { - if(args[0] !== 'connection') return; - - proxy.callback(args, -1, function(obj, args) { - if(!args[0]) return; - - var socket = args[0]; - - // conenctions - connectCount++; - socket.on('disconnect', function() { - connectCount--; - }); - - // sent messages - proxy.before(socket, ['emit', 'send'], function(obj, args) { - // ignore internal events - if(args[0] === 'newListener') return; - - sentCountMetric.addValue(1); - }); - - // received messages - proxy.before(socket, ['on', 'addListener'], function(obj, args) { - // ignore internal events - if(args[0] === 'disconnect') return; - - receivedCountMetric.addValue(1); - }); - }); - }); - }); -}; - diff --git a/node_modules/nodetime/lib/process/disk-stats.js b/node_modules/nodetime/lib/process/disk-stats.js deleted file mode 100644 index 4b48707..0000000 --- a/node_modules/nodetime/lib/process/disk-stats.js +++ /dev/null @@ -1,74 +0,0 @@ -'use strict'; - - -var os = require('os'); -var childProcess = require('child_process'); - -/* - * Sending process related data as metrics. - */ - -function DiskStats(agent) { - this.agent = agent; - - this.headerRegexLinux = undefined; - this.mountRegexLinux = undefined; - - this.headerRegexOSX = undefined; - this.mountRegexOSX = undefined; -} -exports.DiskStats = DiskStats; - - -DiskStats.prototype.init = function() { - var self = this; - - self.headerRegex = /^(Filesystem)\s+(\w+-blocks)\s+(Used)\s+(Available)\s/; - self.mountRegex = /^\/dev\/([^\s]+)\s+(\d+)\s+(\d+)\s+(\d+)\s+/; - - self.agent.timers.setInterval(function() { - self.collectMetrics(); - }, 60000); - - self.collectMetrics(); -}; - - -DiskStats.prototype.collectMetrics = function() { - var self = this; - - var hostname = os.hostname(); - - childProcess.exec('df -k', function(err, stdout, stderr) { - try { - if(err) return self.agent.logger.error(err); - - var lines = stdout.split('\n'); - if(lines.length == 0) return; - - if(!self.headerRegex.exec(lines[0])) return; - - for(var i = 1; i < lines.length; i++) { - var mount = {}; - - var mountMatch = self.mountRegex.exec(lines[i]); - if(mountMatch && mountMatch.length == 5) { - mount.device = mountMatch[1]; - mount.used = parseInt(mountMatch[3]) / 1024; - mount.available = parseInt(mountMatch[4]) / 1024; - } - - if(mount.device && mount.used !== undefined && mount.available !== undefined) { - var total = mount.used + mount.available; - - self.agent.metric('Disks/' + hostname + '/' + mount.device, 'Total space', total, 'MB', 'gauge'); - self.agent.metric('Disks/' + hostname + '/' + mount.device, 'Used space', mount.used, 'MB', 'gauge'); - } - } - } - catch(err) { - self.agent.logger.error(err); - } - }); -}; - diff --git a/node_modules/nodetime/lib/process/process-info.js b/node_modules/nodetime/lib/process/process-info.js deleted file mode 100644 index 066fe42..0000000 --- a/node_modules/nodetime/lib/process/process-info.js +++ /dev/null @@ -1,139 +0,0 @@ -'use strict'; - - -var os = require('os'); - -/* - * Sends process information to the server every minute - */ - -function ProcessInfo(agent) { - this.agent = agent; -} - -exports.ProcessInfo = ProcessInfo; - - -ProcessInfo.prototype.init = function() { - var self = this; - - self.agent.timers.setInterval(function() { - self.sendInfo(); - }, 60000); - - self.agent.on('session', function() { - self.sendInfo(); - }); -}; - - -ProcessInfo.prototype.sendInfo = function() { - var self = this; - - var info = {}; - info._ts = self.agent.system.millis(); - info._ns = 'info'; - info['Application name'] = self.agent.appName; - - try { - info['Hostname'] = os.hostname(); - } catch(err) { - self.logError(err) - } - - try { - info['OS type'] = os.type(); - } - catch(err) { - self.logError(err) - } - - try { - info['Platform'] = os.platform(); - } - catch(err) { - self.logError(err) - } - - try { - info['Total memory (MB)'] = os.totalmem() / 1048576; - } - catch(err) { - self.logError(err) - } - - try { - var cpus = os.cpus(); info['CPU'] = { - architecture: os.arch(), - model: cpus[0].model, - speed: cpus[0].speed, - cores: cpus.length - }; - } - catch(err) { - self.logError(err) - } - - try { - info['Interfaces'] = os.networkInterfaces(); - } - catch(err) { - self.logError(err) - } - - try { - info['OS uptime (Hours)'] = Math.floor(os.uptime() / 3600); - } - catch(err) { - self.logError(err) - } - - try { - info['Node arguments'] = process.argv; - } - catch(err) { - self.logError(err) - } - - try { - info['Node PID'] = process.pid; - } - catch(err) { - self.logError(err) - } - - try { - info['Node uptime (Hours)'] = Math.floor(process.uptime() / 3600); - } - catch(err) { - self.logError(err) - } - - try { - info['Node versions'] = process.versions; - } - catch(err) { - self.logError(err) - } - - info['Nodetime version'] = self.agent.version; - info['Nodetime options'] = { - debug: self.agent.debug, - features: self.agent.features, - transactionFilter: self.agent.profiler.filterOptions - }; - - try { - self.agent.emit('info', info); - } - catch(err) { - self.logError(err); - } -} - - -ProcessInfo.prototype.logError = function(err) { - this.agent.logger.error(err); -} - - diff --git a/node_modules/nodetime/lib/process/process-state.js b/node_modules/nodetime/lib/process/process-state.js deleted file mode 100644 index e4bff27..0000000 --- a/node_modules/nodetime/lib/process/process-state.js +++ /dev/null @@ -1,20 +0,0 @@ -'use strict'; - - -/* - * ProcessState is responsible for keeping process related state. - * Certain probes are regularly updating the state. - */ - -function ProcessState(agent) { - this.agent = agent; - - this.bytesRead = 0; - this.bytesWritten = 0; -}; -exports.ProcessState = ProcessState; - - -ProcessState.prototype.init = function(str) { -} - diff --git a/node_modules/nodetime/lib/process/process-stats.js b/node_modules/nodetime/lib/process/process-stats.js deleted file mode 100644 index 1307793..0000000 --- a/node_modules/nodetime/lib/process/process-stats.js +++ /dev/null @@ -1,69 +0,0 @@ -'use strict'; - - -var os = require('os'); - - -/* - * Sending process related data as metrics. - */ - -function ProcessStats(agent) { - this.agent = agent; - - this.lastCpuTime = undefined; -} -exports.ProcessStats = ProcessStats; - - -ProcessStats.prototype.init = function() { - var self = this; - - self.agent.timers.setInterval(function() { - self.collectMetrics(); - }, 60000); - - self.collectMetrics(); -}; - - -ProcessStats.prototype.collectMetrics = function() { - var self = this; - - try { - self.agent.metric('OS', 'Load average', os.loadavg()[0], null, 'avg'); - self.agent.metric('OS', 'Total memory', os.totalmem() / 1048576, 'MB', 'avg'); - self.agent.metric('OS', 'Free memory', os.freemem() / 1048576, 'MB', 'avg'); - - if(self.agent.features.hostMetrics) { - var host = os.hostname(); - self.agent.metric('OS/' + host, 'Load average', os.loadavg()[0], null, 'avg'); - self.agent.metric('OS/' + host, 'Total memory', os.totalmem() / 1048576, 'MB', 'avg'); - self.agent.metric('OS/' + host, 'Free memory', os.freemem() / 1048576, 'MB', 'avg'); - } - } - catch(err) { - self.agent.logger.error(err); - } - - try { - var mem = process.memoryUsage(); - self.agent.metric('Process', 'Node RSS', mem.rss / 1048576, 'MB', 'avg'); - self.agent.metric('Process', 'V8 heap used', mem.heapUsed / 1048576, 'MB', 'avg'); - self.agent.metric('Process', 'V8 heap total', mem.heapTotal / 1048576, 'MB', 'avg'); - } - catch(err) { - self.agent.logger.error(err); - } - - var cpuTime = self.agent.system.cputime(); - if(cpuTime !== undefined && self.lastCpuTime !== undefined) { - var cpuTimePerMinute = (cpuTime - self.lastCpuTime) / 1000; - self.agent.metric('Process', 'CPU time', cpuTimePerMinute, 'ms', 'avg'); - self.agent.metric('Process', 'CPU usage', cpuTimePerMinute / 60000 * 100, 'percent', 'avg'); - } - if(cpuTime !== undefined) { - self.lastCpuTime = cpuTime; - } -}; - diff --git a/node_modules/nodetime/lib/profiler/call-metrics-groups.js b/node_modules/nodetime/lib/profiler/call-metrics-groups.js deleted file mode 100644 index 095ca36..0000000 --- a/node_modules/nodetime/lib/profiler/call-metrics-groups.js +++ /dev/null @@ -1,69 +0,0 @@ -'use strict'; - -var CallMetrics = require('./call-metrics').CallMetrics; - - -/* - * Manages groups of metric calls. See call-metrics.js - */ - -function CallMetricsGroups(agent) { - this.agent = agent; - - this.callMetrics = undefined; - this.callMetricsGroups = {}; -} -exports.CallMetricsGroups = CallMetricsGroups; - - - -CallMetricsGroups.prototype.init = function(scope, groups) { - var self = this; - - groups.forEach(function(group) { - var callMetrics = new CallMetrics(this.agent); - callMetrics.init(scope, group); - self.callMetricsGroups[group] = callMetrics; - }); -}; - - -CallMetricsGroups.prototype.callStart = function(scope, group, time) { - if(group) { - var callMetrics = this.callMetricsGroups[group]; - if(callMetrics) { - callMetrics.callStart(time); - } - else { - callMetrics = new CallMetrics(this.agent); - callMetrics.init(scope, group); - this.callMetricsGroups[group] = callMetrics; - - callMetrics.callStart(time); - } - } - else { - if(this.callMetrics) { - this.callMetrics.callStart(time); - } - else { - this.callMetrics = new CallMetrics(this.agent); - this.callMetrics.init(scope, group); - this.callMetrics.callStart(time); - } - } -}; - - -CallMetricsGroups.prototype.callDone = function(scope, group, time) { - if(group) { - var callMetrics = this.callMetricsGroups[group]; - if(callMetrics) { - callMetrics.callDone(time); - } - } - else { - this.callMetrics.callDone(time); - } -}; - diff --git a/node_modules/nodetime/lib/profiler/call-metrics.js b/node_modules/nodetime/lib/profiler/call-metrics.js deleted file mode 100644 index aaa1e95..0000000 --- a/node_modules/nodetime/lib/profiler/call-metrics.js +++ /dev/null @@ -1,55 +0,0 @@ -'use strict'; - - -/* - * To hold a set of metrics associated with a call in closure context. - */ - -function CallMetrics(agent) { - this.agent = agent; - - this.rpm = undefined; - - this.epm = undefined; - this.art = undefined; - this.rtp = undefined; - this.act = undefined; - - // Predefined performance index metric. - this.pi = this.agent.performanceIndexMetric; -} -exports.CallMetrics = CallMetrics; - - -CallMetrics.prototype.init = function(scope, group) { - var mm = this.agent.metricsManager; - - if(group) { - scope = scope + '/' + group; - } - - this.rpm = mm.createMetric(scope, 'Requests per minute', null, 'sum'); - - this.epm = mm.createMetric(scope, 'Errors per minute', null, 'sum'); - this.art = mm.createMetric(scope, 'Average response time', 'ms', 'avg'); - this.rtp = mm.createMetric(scope, 'Response time 95th percentile', 'ms', '95th'); - this.act = mm.createMetric(scope, 'Average CPU time', 'ms', 'avg'); -}; - - -CallMetrics.prototype.callStart = function(time) { - this.rpm.addValue(1); -}; - - -CallMetrics.prototype.callDone = function(time) { - this.epm.addValue(time.hasError ? 1 : 0); - this.art.addValue(time.ms); - this.rtp.addValue(time.ms); - if(time.cputime) { - this.act.addValue(time.cputime); - } - - this.pi.addValue(time.ms); -}; - diff --git a/node_modules/nodetime/lib/profiler/custom-transaction.js b/node_modules/nodetime/lib/profiler/custom-transaction.js deleted file mode 100644 index e9a033e..0000000 --- a/node_modules/nodetime/lib/profiler/custom-transaction.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict'; - - -var TimePromise = require('./time-promise').TimePromise; - - -function CustomTransaction(agent) { - this.agent = agent; -} -exports.CustomTransaction = CustomTransaction; - - -CustomTransaction.prototype.init = function() { -}; - - -CustomTransaction.prototype.start = function(scope, label, context) { - var self = this; - var profiler = self.agent.profiler; - - return new TimePromise( - self.agent, - profiler.time(scope, label, true), - profiler.stackTrace(), - context); -}; diff --git a/node_modules/nodetime/lib/profiler/filter/filter-key-extractor.js b/node_modules/nodetime/lib/profiler/filter/filter-key-extractor.js deleted file mode 100644 index 2536913..0000000 --- a/node_modules/nodetime/lib/profiler/filter/filter-key-extractor.js +++ /dev/null @@ -1,92 +0,0 @@ -'use strict'; - - -/* - * Extracts sample objec field names and emits them. DataSender - * sends them to server for displaying on the transaction profiler page. - */ - - -function FilterKeyExtractor(agent) { - this.agent = agent; - - this.filterKeys = {}; - this.sampleNum = 0; -} -exports.FilterKeyExtractor = FilterKeyExtractor; - - -FilterKeyExtractor.prototype.init = function() { - var self = this; - var profiler = self.agent.profiler; - - self.agent.on('sample', function(sample) { - if(self.agent.sessionId && !profiler.paused) { - self.collectKeys(undefined, sample, 0); - - // collect keys only from the first 25 samples - if(self.sampleNum++ < 25) { - self.collectKeys(undefined, sample, 0); - } - - // send keys only on first and tenth sample - if(self.sampleNum === 1 || self.sampleNum === 10) { - self.sendKeys(); - } - } - }); - - // send keys on transaction profiler resume - self.agent.on('resume', function() { - self.sendKeys(); - }) -}; - - -FilterKeyExtractor.prototype.collectKeys = function(key, obj, depth) { - var self = this; - - if(depth > 20) return 0; - - var isArray = Array.isArray(obj); - for(var prop in obj) { - if(prop.match(/^\_/)) continue; - - if(typeof obj[prop] === 'object') { - self.collectKeys(prop, obj[prop], depth + 1); - } - else { - if(!isArray) { - self.filterKeys[prop] = true; - } - else { - self.filterKeys[key] = true; - } - } - } -}; - - -FilterKeyExtractor.prototype.sendKeys = function() { - var self = this; - - var keys = []; - for(var prop in this.filterKeys) { - keys.push(prop); - } - - keys = keys.sort(function(a, b) { - a = a.toLowerCase(); - b = b.toLowerCase(); - - if(a > b) return 1; - if(a < b) return -1; - return 0; - }); - - if(keys.length > 0) { - self.agent.emit('filterKeys', keys); - } -}; - - diff --git a/node_modules/nodetime/lib/profiler/filter/predicate-filter.js b/node_modules/nodetime/lib/profiler/filter/predicate-filter.js deleted file mode 100644 index 9834229..0000000 --- a/node_modules/nodetime/lib/profiler/filter/predicate-filter.js +++ /dev/null @@ -1,111 +0,0 @@ -'use strict'; - - -var PredicateFilter = function() { -} - -exports.PredicateFilter = PredicateFilter; - - -PredicateFilter.prototype.preparePredicates = function(preds) { - var self = this; - - var parsedPreds = []; - preds.forEach(function(pred) { - var parsedPred = {}; - parsedPreds.push(parsedPred); - - parsedPred.key = pred.key; - parsedPred.op = pred.op; - parsedPred.val = pred.val; - - try{ - parsedPred.valNum = parseFloat(pred.val) - } - catch(err) { - } - - try{ - if(pred.op === 'match') parsedPred.valRe = new RegExp(pred.val); - if(typeof pred.val === 'string') parsedPred.valLc = pred.val.toLowerCase(); - } - catch(err) { - return self.agent.logger.error(err); - } - }); - - this.preds = parsedPreds; - - return true; -} - - -PredicateFilter.prototype.filter = function(sample) { - var matched = 0; - - this.preds.forEach(function(pred) { - matched += walk(pred, sample, 0); - }); - - return (matched > 0); -}; - - -function walk(pred, obj, depth) { - if(depth > 20) return 0; - - var matched = 0; - - for(var prop in obj) { - var val = obj[prop]; - - if(val === undefined || val === null) { - continue; - } - else if(typeof val === 'object') { - matched += walk(pred, val, depth + 1); - } - else if((pred.key === '*' || pred.key === prop) && test(pred, val)) { - matched++; - } - - if(matched) break; - } - - return matched; -} - - -function test(pred, val) { - var ret = false; - - if(typeof val === 'number') { - if(pred.valNum !== NaN) { - if (pred.op === '==') { - ret = (val == pred.valNum); - } - else if (pred.op === '!=') { - ret = (val != pred.valNum); - } - else if (pred.op === '<') { - ret = (val < pred.valNum); - } - else if (pred.op === '>') { - ret = (val > pred.valNum); - } - } - } - else if(typeof val === 'string') { - if(pred.op === 'match' && pred.valRe) { - ret = pred.valRe.exec(val); - } - else if (pred.op === '==') { - ret = (val.toLowerCase() == pred.valLc); - } - else if (pred.op === '!=') { - ret = (val.toLowerCase() != pred.valLc); - } - } - - return ret; -} diff --git a/node_modules/nodetime/lib/profiler/named-transactions.js b/node_modules/nodetime/lib/profiler/named-transactions.js deleted file mode 100644 index 2a511dc..0000000 --- a/node_modules/nodetime/lib/profiler/named-transactions.js +++ /dev/null @@ -1,61 +0,0 @@ -'use strict'; - - -function NamedTransactions(agent) { - this.agent = agent; - - this.namedTransactions = undefined; -} -exports.NamedTransactions = NamedTransactions; - - - -NamedTransactions.prototype.init = function(config) { - var self = this; - - self.namedTransactions = {}; - - var count = 0; - for(var name in config) { - count++; - - name = name.trim(); - var pattern = config[name]; - - if(!name.match(/^[a-zA-Z0-9\_\-\ ]{1,25}$/)) { - throw new Error('Nodetime: invalid name for a named transation'); - } - - if(typeof(pattern) === 'string') { - pattern = new RegExp('^' + pattern); - } - else if(!(pattern instanceof RegExp)) { - throw new Error('Nodetime: named transaction pattern should be string or RegExp'); - } - - self.namedTransactions[name] = pattern; - } - - if(count > 10) { - throw new Error('Nodetime: max (10) number of named transactions exceeded'); - } - - if(count == 0) { - self.namedTransactions = undefined; - } -}; - - -NamedTransactions.prototype.matchRequest = function(req) { - if(this.namedTransactions) { - for(var name in this.namedTransactions) { - var pattern = this.namedTransactions[name]; - if(pattern.exec(req.url)) { - return name; - } - } - } - - return undefined; -}; - diff --git a/node_modules/nodetime/lib/profiler/profiler.js b/node_modules/nodetime/lib/profiler/profiler.js deleted file mode 100644 index f81b197..0000000 --- a/node_modules/nodetime/lib/profiler/profiler.js +++ /dev/null @@ -1,363 +0,0 @@ -'use strict'; - - -var Time = require('../core/time').Time; -var Sample = require('./sample').Sample; -var SkipCounter = require('./skip-counter').SkipCounter; -var CallMetrics = require('./call-metrics').CallMetrics; -var CallMetricsGroups = require('./call-metrics-groups').CallMetricsGroups; -var PredicateFilter = require('./filter/predicate-filter').PredicateFilter; -var FilterKeyExtractor = require('./filter/filter-key-extractor').FilterKeyExtractor; - -/* - * Trasaction profiler is responsible for managing the sampling process: - * pausing and resuming sampling, finding related operations, - * emitting samples and providing api for probes to create samples. - */ - -function Profiler(agent) { - this.agent = agent; - - this.paused = true; - this.pauseAt = undefined; - this.filterFunc = undefined; - this.filterOptions = undefined; - - this.info = undefined; - this.state = {}; - this.transactions = {}; - this.stackTraceCalls = 0; - this.stackTraceFilter = /nodetime/; - - this.filterKeyExtractor = new FilterKeyExtractor(this.agent); -} -exports.Profiler = Profiler; - - -Profiler.prototype.init = function() { - var self = this; - - self.agent.on('info', function(info) { - self.info = info; - }); - - self.agent.on('metric', function(metric) { - if(!self.state[metric.scope]) self.state[metric.scope] = {}; - self.state[metric.scope][metric.name + (metric.unit ? ' (' + metric.unit + ')' : '')] = metric.value; - }); - - - // cleanup transactions - self.agent.timers.setInterval(function() { - // expire transactions older than 5 minunes, which have not ended - var now = Date.now(); - for(var threadId in self.transactions) { - if(self.transactions[threadId].started + 300000 < now) { - delete self.transactions[threadId]; - } - } - }, 5000); - - - // init sample field sender - self.filterKeyExtractor.init(); - - - // listen for server commands - self.agent.on('command', function(command, args) { - switch(command) { - case 'pause': - self.pause(); - break; - - case 'resume': - self.resume(); - break; - - case 'filter': - self.filter(args) - break; - } - }); - - - // pause profiler when destroyed - self.agent.on('destroy', function() { - if(!self.paused) { - self.pause(); - } - }); - - - // autopause profiler if not paused explicitly - self.agent.timers.setInterval(function() { - if(!self.paused && Date.now() > self.pauseAt) - self.pause(); - }, 1000); -} - - - -Profiler.prototype.pause = function(keepState) { - var self = this; - - this.paused = true; - - if(!keepState) { - self.pauseAt = undefined; - self.filterFunc = undefined; - self.filterOptions = undefined; - } - - try { - self.agent.emit('pause'); - self.agent.logger.log('profiler paused'); - } - catch(err) { - self.agent.logger.error(err); - } -}; - - - -Profiler.prototype.resume = function(seconds) { - if(!seconds) seconds = 180; - - this.pauseAt = Date.now() + seconds * 1000; - this.paused = false; - - try { - this.agent.emit('resume', seconds); - this.agent.logger.log('profiler resumed for ' + seconds + ' seconds'); - } - catch(err) { - self.agent.logger.error(err); - } -}; - - - -Profiler.prototype.filter = function(filterOptions) { - var self = this; - - if(filterOptions) { - var pf = new PredicateFilter(); - if(pf.preparePredicates(filterOptions)) { - self.filterFunc = function(sample) { - return pf.filter(sample); - }; - self.filterOptions = filterOptions; - } - } - else { - self.filterFunc = undefined; - self.filterOptions = undefined; - } -}; - - -Profiler.prototype.createCallMetrics = function(scope, group) { - var callMetrics = new CallMetrics(this.agent); - callMetrics.init(scope, group); - - return callMetrics; -}; - - -Profiler.prototype.createCallMetricsGroups = function(scope, groups) { - return new CallMetricsGroups(this.agent); -}; - - -Profiler.prototype.time = function(scope, group, isRoot) { - var t = new Time(this.agent, scope, group, isRoot); - t.start(); - - return t; -}; - - -Profiler.prototype.stackTrace = function() { - if(this.paused || this.stackTraceCalls++ > 1000) { - return undefined; - } - - var err = new Error(); - Error.captureStackTrace(err); - - return this.formatStackTrace(err); -}; - - -Profiler.prototype.formatStackTrace = function(err) { - var self = this; - - if(err && err.stack) { - var lines = err.stack.split("\n"); - lines.shift(); - lines = lines.filter(function(line) { - return !self.stackTraceFilter.exec(line) - }); - - return lines; - } - - return undefined; -}; - - -Profiler.prototype.createSample = function() { - return new Sample(); -}; - - -Profiler.prototype.createSkipCounter = function() { - var skipCounter = new SkipCounter(this.agent); - skipCounter.init(); - return skipCounter; -}; - - -Profiler.prototype.startTransaction = function(time) { - var self = this; - - self.transactions[time.threadId] = { - operations: [], - started: Date.now() - }; -} - - -Profiler.prototype.endTransaction = function(time) { - delete this.transactions[time.threadId]; -} - - - -Profiler.prototype.addSample = function(time, sample) { - var self = this; - - process.nextTick(function() { - try { - self._addSample(time, sample); - } - catch(err) { - self.agent.logger.error(err); - } - }); -}; - - -Profiler.prototype._addSample = function(time, sample) { - var self = this; - - sample._version = self.agent.version; - sample._ns = 'samples'; - sample._id = time.id; - sample._isRoot = time.isRoot; - sample._begin = time.begin; - sample._end = time.end; - sample._ms = time.ms; - sample._ts = time.begin; - sample._cputime = time.cputime; - sample._threadId = time.threadId; - - if(sample._label.length > 80) sample._label = sample._label.substring(0, 80) + '...'; - - sample['Response time (ms)'] = sample._ms; - sample['Timestamp (ms)'] = sample._ts; - if(sample._cputime !== undefined) sample['CPU time (ms)'] = sample._cputime; - if(!sample._isRoot) { - sample['Bytes read (KB)'] = time.bytesRead / 1024; - sample['Bytes written (KB)'] = time.bytesWritten / 1024; - } - - if(sample._isRoot) { - var transaction = self.transactions[sample._threadId]; - if(transaction) { - // sort nested operations, slowest first - transaction.operations = transaction.operations.sort(function(a, b) { - return b._ms - a._ms; - }); - - sample['Operations'] = transaction.operations.splice(0, 50); - } - sample['Node state'] = self.state; - sample['Node information'] = self.info; - - try { - if(!self.filterFunc || self.filterFunc(sample)) { - sample._filtered = true; - } - - self.agent.emit('sample', sample); - } - catch(err) { - self.agent.logger.error(err); - } - - self.endTransaction(time); - } - else { - // if there is a started request, buffer its nested operations - var transaction = self.transactions[sample._threadId]; - if(transaction) { - transaction.operations.push(sample); - } - - try { - if(!self.filterFunc || self.filterFunc(sample)) { - sample._filtered = true; - } - - self.agent.emit('sample', sample); - } - catch(err) { - self.agent.logger.error(err); - } - } -}; - - -Profiler.prototype.truncate = function(args) { - if(!args) return undefined; - - if(typeof args === 'string') { - return (args.length > 80 ? (args.substr(0, 80) + '...') : args); - } - - if(!args.length) return undefined; - - var arr = []; - var argsLen = (args.length > 10 ? 10 : args.length); - for(var i = 0; i < argsLen; i++) { - if(typeof args[i] === 'string') { - if(args[i].length > 80) { - arr.push(args[i].substr(0, 80) + '...'); - } - else { - arr.push(args[i]); - } - } - else if(typeof args[i] === 'number') { - arr.push(args[i]); - } - else if(args[i] === undefined) { - arr.push('[undefined]'); - } - else if(args[i] === null) { - arr.push('[null]'); - } - else if(typeof args[i] === 'object') { - arr.push('[object]'); - } - if(typeof args[i] === 'function') { - arr.push('[function]'); - } - } - - if(argsLen < args.length) arr.push('...'); - - return arr; -}; - diff --git a/node_modules/nodetime/lib/profiler/sample.js b/node_modules/nodetime/lib/profiler/sample.js deleted file mode 100644 index 8c8682c..0000000 --- a/node_modules/nodetime/lib/profiler/sample.js +++ /dev/null @@ -1,43 +0,0 @@ -'use strict'; - - -function Sample() { - this['Type'] = undefined; - this['Connection'] = undefined; - this['Command'] = undefined; - this['Arguments'] = undefined; - this['Stack trace'] = undefined; - this['Error'] = undefined; - this['URL'] = undefined; - this['Method'] = undefined; - this['Request headers'] = undefined; - this['Response headers'] = undefined; - this['Status code'] = undefined; - this._group = undefined; - this._version = undefined; - this._ns = undefined; - this._id = undefined; - this._isRoot = undefined; - this._begin = undefined; - this._end = undefined; - this._ms = undefined; - this._ts = undefined; - this._cputime = undefined; - this._threadId = undefined; - this['Response time (ms)'] = undefined; - this['Timestamp (ms)'] = undefined; - this['CPU time (ms)'] = undefined; - this['Bytes read (KB)'] = undefined; - this['Bytes written (KB)'] = undefined; - this['Start context'] = undefined; - this['End context'] = undefined; - this['Operations'] = undefined; - this['Node state'] = undefined; - this['Node information'] = undefined; - this._filtered = undefined; - this._realtime = undefined; - this._slow = undefined; -} - -exports.Sample = Sample; - diff --git a/node_modules/nodetime/lib/profiler/skip-counter.js b/node_modules/nodetime/lib/profiler/skip-counter.js deleted file mode 100644 index 62eb890..0000000 --- a/node_modules/nodetime/lib/profiler/skip-counter.js +++ /dev/null @@ -1,45 +0,0 @@ -'use strict'; - - -function SkipCounter(agent) { - this.agent = agent; - - this.counter = undefined; - this.groupCounter = undefined; -}; -exports.SkipCounter = SkipCounter; - - -SkipCounter.prototype.init = function() { - var self = this; - - self.counter = 0; - self.groupCounter = {}; - - self.agent.timers.setInterval(function() { - self.counter = 0; - self.groupCounter = {}; - }, 10000); -} - - -SkipCounter.prototype.skip = function(time) { - var group = time.group; - - if(group) { - var count = this.groupCounter[group]; - - if(!count) { - this.groupCounter[group] = 1; - return false; - } - else { - this.groupCounter[group] = ++count; - return (count > 10); - } - } - else { - return (++this.counter > 10); - } -} - \ No newline at end of file diff --git a/node_modules/nodetime/lib/profiler/time-promise.js b/node_modules/nodetime/lib/profiler/time-promise.js deleted file mode 100644 index 1a2ed81..0000000 --- a/node_modules/nodetime/lib/profiler/time-promise.js +++ /dev/null @@ -1,32 +0,0 @@ -'use strict'; - - -function TimePromise(agent, time, stackTrace, context) { - this.agent = agent; - - this.type = 'Custom'; - this.time = time; - this.stackTrace = stackTrace; - this.context = context; - - this.agent.profiler.startTransaction(this.time); -}; -exports.TimePromise = TimePromise; - - -TimePromise.prototype.end = function(context) { - var profiler = this.agent.profiler; - - if(!this.time.done()) return; - if(profiler.skipSample(this.time)) return; - - var sample = profiler.createSample(); - sample['Type'] = this.type; - sample['Start context'] = this.context; - sample['End context'] = context; - sample['Stack trace'] = this.stackTrace; - sample._group = this.type; - sample._label = this.type + ': ' + this.time.group; - - profiler.addSample(this.time, sample); -}; \ No newline at end of file diff --git a/node_modules/nodetime/lib/saas/data-sender.js b/node_modules/nodetime/lib/saas/data-sender.js deleted file mode 100644 index e317b2f..0000000 --- a/node_modules/nodetime/lib/saas/data-sender.js +++ /dev/null @@ -1,129 +0,0 @@ -'use strict'; - - -function DataSender(agent) { - this.agent = agent; - this.infoBuffer = undefined; - this.metricsBuffer = []; - this.samplesBuffer = {}; - this.slowSamplesBuffer = {}; -} -exports.DataSender = DataSender; - - -DataSender.prototype.init = function() { - var self = this; - var saasClient = self.agent.saasClient; - - self.agent.on('session', function() { - self.agent.on('info', function(info) { - self.infoBuffer = info; - }); - - self.agent.on('metric', function(metric) { - self.metricsBuffer.push(metric); - }); - - self.agent.on('sample', function(sample) { - // only send if profiler is active and sample was also filtered - // by profiler and not only emitted as historically slowest samples - if(!self.agent.profiler.paused && sample._filtered) { - self.samplesBuffer[sample._group] || (self.samplesBuffer[sample._group] = []); - self.samplesBuffer[sample._group].push(sample); - } - - // only send for registered accounts - if(self.agent.accountKey) { - self.slowSamplesBuffer[sample._group] || (self.slowSamplesBuffer[sample._group] = []); - self.slowSamplesBuffer[sample._group].push(sample); - } - }); - - self.agent.on('cpuProfile', function(cpuProfile) { - saasClient.sendCommand('updateData', cpuProfile); - }); - - self.agent.on('heapSnapshot', function(heapSnapshot) { - saasClient.sendCommand('updateData', heapSnapshot); - }); - - self.agent.on('filterKeys', function(filterKeys) { - saasClient.sendCommand('updateFilterKeys', filterKeys); - }); - - - // send info and metrics and empty the buffers - self.agent.timers.setInterval(function() { - self.sendInfo(); - self.sendMetrics(); - }, 2000); - - // send samples and empty the buffer - self.agent.timers.setInterval(function() { - self.sendSamples(); - }, 5000); - - // send slow samples and empty the buffer - self.agent.timers.setInterval(function() { - self.sendSlowSamples(); - }, 60000); - }); -}; - - -DataSender.prototype.sendInfo = function() { - var self = this; - - if(self.infoBuffer) { - self.agent.saasClient.sendCommand('updateData', self.infoBuffer); - self.infoBuffer = undefined; - } -}; - - -DataSender.prototype.sendMetrics = function() { - var self = this; - - self.metricsBuffer.forEach(function(metric) { - self.agent.saasClient.sendCommand('updateData', metric); - }); - - self.metricsBuffer = []; -}; - - -DataSender.prototype.sendSamples = function() { - var self = this; - - for(var group in self.samplesBuffer) { - var samples = self.samplesBuffer[group].sort(function(a, b) { - return b._ms - a._ms; - }); - - for(var i = 0; i < (samples.length < 5 ? samples.length : 5); i++) { - self.agent.saasClient.sendCommand('updateData', samples[i]); - } - } - - self.samplesBuffer = {}; -}; - - -DataSender.prototype.sendSlowSamples = function() { - var self = this; - - for(var group in self.slowSamplesBuffer) { - var samples = self.slowSamplesBuffer[group].sort(function(a, b) { - return b._ms - a._ms; - }); - - for(var i = 0; i < (samples.length < 5 ? samples.length : 5); i++) { - samples[i]._slow = true; - self.agent.saasClient.sendCommand('updateData', samples[i]); - } - } - - self.slowSamplesBuffer = {}; -}; - - diff --git a/node_modules/nodetime/lib/saas/gzip-request.js b/node_modules/nodetime/lib/saas/gzip-request.js deleted file mode 100644 index dc73a73..0000000 --- a/node_modules/nodetime/lib/saas/gzip-request.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; - - -var request = require('request'); -var zlib = require('zlib'); - - -module.exports = function(options, callback) { - if(!options.json) { - return request(options, callback); - } - - var gzipRequest = {}; - - options.headers || (options.headers = {}); - zlib.gzip(JSON.stringify(options.json), function(err, buf) { - if(err) return callback(err); - - options.body = buf; - options.headers['Content-type'] = 'application/json'; - options.headers['Content-encoding'] = 'gzip'; - delete options.json; - - var req = request(options, function(err, response, body) { - if(err) return callback(err); - - if(response.headers['content-encoding'] === 'gzip') { - zlib.gunzip(body, function(err, buf) { - if(err) return callback(err); - - if(options.encoding) { - callback(err, response, buf.toString(options.encoding)); - } - }); - } - else { - callback(err, response, body); - } - }); - - for(var prop in req) { - gzipRequest[prop] = req[prop]; - } - }); - - return gzipRequest; -}; diff --git a/node_modules/nodetime/lib/saas/saas-client.js b/node_modules/nodetime/lib/saas/saas-client.js deleted file mode 100644 index c70fc3d..0000000 --- a/node_modules/nodetime/lib/saas/saas-client.js +++ /dev/null @@ -1,194 +0,0 @@ -'use strict'; - - -var os = require("os"); -var util = require("util"); -var request = require("request"); -var gzipRequest = require("./gzip-request"); - - -function SaasClient(agent) { - this.agent = agent; - - this.sessionId = undefined; - this.agentId = os.hostname() + ':' + process.pid; - this.headers = { - 'X-Agent-Version': this.agent.version - }; - - this.retry = 2; - - this._lastTimestamp = 0; - this._pollFailed = 0; - this._pollOngoing = false; - this._pushFailed = 0; - this._pushOngoing = false; - this._pushBuffer = []; -} -exports.SaasClient = SaasClient; - - -SaasClient.prototype.init = function(server, proxyServer, sessionId) { - var self = this; - - this.server = server || 'https://api.nodetime.com'; - self.proxyServer = proxyServer; - self.sessionId = sessionId || uuid(); - - self.agent.timers.setInterval(function() { - if(!self._pushOngoing) self._push(); - }, 1000); - - self.agent.timers.setInterval(function() { - if(!self._pollOngoing) self._poll(); - }, 1000); - - - self.agent.on('destroy', function() { - self.destroy(); - }); -}; - -exports.SaasClient = SaasClient; - - -SaasClient.prototype.switchSessionId = function(sessionId) { - this.sessionId = sessionId; -} - - -SaasClient.prototype.destroy = function() { - if(this._deferTimeoutId) clearTimeout(this._deferTimeoutId); - - if(this._pollRequest) { - this._pollRequest.abort(); - if(this._pollRequest.timeoutTimer) { - clearTimeout(this._pollRequest.timeoutTimer); - } - } - - if(this._pushRequest) { - this._pushRequest.abort(); - if(this._pushRequest.timeoutTimer) { - clearTimeout(this._pushRequest.timeoutTimer); - } - } -} - - -SaasClient.prototype.sendCommand = function(cmd, args) { - this._pushBuffer.push({ - payload: { - cmd: cmd, - args: args - }, - ts: new Date().getTime() - }); -}; - - -SaasClient.prototype._push = function() { - var self = this; - - if(self._pushBuffer.length == 0) return; - - self._pushOngoing = true; - var buf = this._pushBuffer; - self._pushBuffer = []; - self._pushRequest = gzipRequest({ - method: "POST", - url: self.server + '/agent/push/' + - '?session_id=' + self.sessionId + - '&agent_id=' + self.agentId, - proxy: self.proxyServer, - json: buf, - timeout: 10000, - headers: self.headers - }, function(err, response, body) { - if(err || response.statusCode != 200) { - if(++self._pushFailed == self.retry) { - self._pushFailed = 0; - } - else { - // put back - self._pushBuffer = buf.concat(self._pushBuffer); - } - - self.agent.logger.error(err || "error pushung message(s)"); - } - else { - self._pushFailed = 0; - - self.agent.logger.log("sent message(s) to server"); - } - - self._pushOngoing = false; - }); -}; - - -SaasClient.prototype._poll = function() { - var self = this; - - self._pollOngoing = true; - self._pollRequest = request({ - url: self.server + '/agent/poll/' + - '?session_id=' + self.sessionId + - '&agent_id=' + self.agentId + - '&since=' + (self._lastTimestamp || ''), - proxy: self.proxyServer, - encoding: "utf8", - timeout: 70000, - headers: self.headers - }, function(err, response, body) { - if(err || response.statusCode != 200) { - self._deferPoll(); - return self.agent.logger.error(err || 'poll request error'); - } - - try { - var msgs = JSON.parse(body); - msgs = msgs || []; - - msgs.forEach(function(msg) { - if(msg && msg.ts && msg.payload && msg.payload.cmd) { - self.agent.logger.log("message(s) received from server"); - self._lastTimestamp = msg.ts; - - self.agent.emit("command", msg.payload.cmd, msg.payload.args); - } - else { - self.agent.logger.error("invalid message for client " + self.group); - } - }); - } - catch(err) { - self._deferPoll(); - return self.agent.logger.error(err); - } - - self._pollFailed = 0; - self._pollOngoing = false; - }); -}; - - -SaasClient.prototype._deferPoll = function() { - var self = this; - - if(++self._pollFailed == self.retry) { - self._deferTimeoutId = setTimeout(function() { - self._pollFailed = 0; - self._pollOngoing = false; - }, 60000); - } - else { - self._pollOngoing = false; - } -} - - -function uuid() { - return (new Date().getTime() + ':' + Math.round(Math.random() * Math.pow(10, 16))); -} - diff --git a/node_modules/nodetime/lib/v8/cpu-profiler.js b/node_modules/nodetime/lib/v8/cpu-profiler.js deleted file mode 100644 index 04dda18..0000000 --- a/node_modules/nodetime/lib/v8/cpu-profiler.js +++ /dev/null @@ -1,170 +0,0 @@ -'use strict'; - - -var os = require('os'); - - -function CpuProfiler(agent) { - this.agent = agent; - - this.v8tools = undefined; - this.active = false; - this.origPaused; -} -exports.CpuProfiler = CpuProfiler; - - - -CpuProfiler.prototype.init = function() { - var self = this; - - try { - self.v8tools = require('v8tools'); - } - catch(err) { - self.agent.logger.error(err); - } - - // if paused during CPU profiling, do not resume automatically - self.agent.on('pause', function() { - self.origPaused = true; - }); - - // listening for command - self.agent.on('command', function(command, args) { - if(command === 'profileCpu') { - try { - if(typeof args === 'number' && args > 0 && args <= 60) { - self.startCpuProfiler(args); - } - } - catch(err) { - self.agent.logger.error(err); - self.active = false; - } - } - }); -} - - -CpuProfiler.prototype.sendError = function(msg) { - var self = this; - - var obj = {}; - obj._id = self.agent.getNextId(); - obj._label = os.hostname() + ' [' + process.pid + ']'; - obj._ts = self.agent.system.millis(); - obj._ns = 'cpu-profiles'; - obj['Error'] = msg; - - try { - self.agent.emit('cpuProfle', obj); - } - catch(err) { - self.agent.logger.error(err); - } -} - - - -CpuProfiler.prototype.startCpuProfiler = function(seconds) { - var self = this; - - if(!self.v8tools) { - return self.sendError("v8tools package was not loaded. Please make sure it is properly installed."); - } - - if(self.active) { - return self.sendError("CPU profiler is already active."); - } - - self.active = true; - - seconds || (seconds = 10); - - var paused = self.agent.profiler.paused; - if(!paused) { - self.agent.profiler.pause(true); - self.origPaused = paused; - } - - - self.v8tools.startV8Profiler(); - self.agent.logger.log("V8 CPU profiler started"); - - // stop v8 profiler automatically after 10 seconds - self.agent.timers.setTimeout(function() { - self.stopCpuProfiler(); - }, seconds * 1000); - - self.agent.on('destroy', function() { - self.stopCpuProfiler(); - }); -}; - - -CpuProfiler.prototype.stopCpuProfiler = function() { - var self = this; - - if(!self.v8tools || !self.active) return; - - var nodes = {}; - var root = undefined; - var rootSamplesCount = undefined; - - self.v8tools.stopV8Profiler(function(parentCallUid, callUid, totalSamplesCount, functionName, scriptResourceName, lineNumber) { - if(rootSamplesCount === undefined) - rootSamplesCount = totalSamplesCount; - - var cpuUsage = ((totalSamplesCount * 100) / rootSamplesCount || 1); - var obj = { - _totalSamplesCount: totalSamplesCount, - _functionName: functionName, - _scriptResourceName: scriptResourceName, - _lineNumber: lineNumber, - _cpuUsage: cpuUsage, - _id: self.agent.getNextId(), - _target: [], - _label: cpuUsage.toFixed(2) + "% - " + functionName - }; - - if(scriptResourceName && lineNumber) - obj._label += " (" + scriptResourceName + ":" + lineNumber + ")"; - - nodes[callUid] = obj; - if(root === undefined) { - root = obj; - } - - if(parentCallUid) { - var parentNode = nodes[parentCallUid]; - if(parentNode) parentNode._target.push(obj); - } - }); - - self.agent.logger.log("V8 CPU profiler stopped"); - - if(root) { - var profile = {}; - profile._id = self.agent.getNextId(); - profile._label = os.hostname() + ' [' + process.pid + ']'; - profile._ts = self.agent.system.millis(); - profile._ns = 'cpu-profiles'; - profile.root = root; - - try { - self.agent.emit('cpuProfile', profile); - } - catch(err) { - self.agent.logger.error(err); - } - } - - - if(!self.origPaused) { - self.agent.profiler.resume(); - } - - self.active = false; -}; - diff --git a/node_modules/nodetime/lib/v8/gc-stats.js b/node_modules/nodetime/lib/v8/gc-stats.js deleted file mode 100644 index 886c554..0000000 --- a/node_modules/nodetime/lib/v8/gc-stats.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict'; - - - -function GCStats(agent) { - this.agent = agent; - - this.v8tools = undefined; -} -exports.GCStats = GCStats; - - - -GCStats.prototype.init = function() { - var self = this; - - try { - self.v8tools = require('v8tools'); - } - catch(err) { - self.agent.logger.error(err); - return; - } - - if(!self.v8tools.afterGC) { - self.agent.logger.error('old v8tools version, please update v8tools package'); - return; - } - - var mm = self.agent.metricsManager; - - var numFullGC = mm.createMetric('Garbage Collection', 'Full GCs per minute', null, 'sum'); - var numIncGC = mm.createMetric('Garbage Collection', 'Incremental GCs per minute', null, 'sum'); - var sizeChange = mm.createMetric('Garbage Collection', 'Used heap size change per minute', 'MB', 'sum'); - var lastUsedHeapSize = undefined; - - self.v8tools.afterGC(function(gcType, gcFlags, usedHeapSize) { - if(gcType === 'kGCTypeMarkSweepCompact') { - numFullGC.addValue(1); - } - else if(gcType === 'kGCTypeScavenge') { - numIncGC.addValue(1); - } - - if(lastUsedHeapSize !== undefined) { - sizeChange.addValue((usedHeapSize - lastUsedHeapSize) / 1048576); - } - lastUsedHeapSize = usedHeapSize; - }); -}; diff --git a/node_modules/nodetime/lib/v8/heap-profiler.js b/node_modules/nodetime/lib/v8/heap-profiler.js deleted file mode 100644 index 2bd64f2..0000000 --- a/node_modules/nodetime/lib/v8/heap-profiler.js +++ /dev/null @@ -1,466 +0,0 @@ -'use strict'; - - -var os = require('os'); -var EventEmitter = require('events').EventEmitter; - - -function HeapProfiler(agent) { - this.agent = agent; - - this.v8tools = undefined; - this.active = false; -} -exports.HeapProfiler = HeapProfiler; - - -HeapProfiler.prototype.init = function() { - var self = this; - - try { - self.v8tools = require('v8tools'); - } - catch(err) { - self.agent.logger.error(err); - } - - - // if paused during CPU profiling, do not resume automatically - self.agent.on('pause', function() { - self.origPaused = true; - }); - - - // listening for command - self.agent.on('command', function(command, args) { - if(command === 'takeHeapSnapshot') { - try { - self.takeHeapSnapshot(); - } - catch(err) { - self.agent.logger.error(err); - self.active = false; - } - } - }); -} - - - -HeapProfiler.prototype.sendError = function(msg) { - var self = this; - - var obj = {}; - obj._id = self.agent.getNextId(); - obj._label = os.hostname() + ' [' + process.pid + ']'; - obj._ts = self.agent.system.millis(); - obj._ns = 'heap-snapshots'; - obj['Error'] = msg; - - try { - self.agent.emit('heapSnapshot', obj); - } - catch(err) { - self.agent.logger.error(err); - } -} - - - -HeapProfiler.prototype.takeHeapSnapshot = function() { - var self = this; - - if(!self.v8tools) { - return self.sendError("v8tools package was not loaded. Please make sure it is properly installed."); - } - - if(self.active) { - return self.sendError("Heap profiler is already active."); - } - - self.active = true; - - self.agent.logger.log("V8 heap profiler starting..."); - - var snapshot = {}; - var nodeEmitter = new EventEmitter(); - - self.buildRetainerGroups(nodeEmitter, snapshot); - self.buildObjectGroups(nodeEmitter, snapshot); - - var nodes = {}; - self.v8tools.takeHeapSnapshot(function(parentNodeUid, nodeUid, name, type, selfSize, retainerName, retainerType) { - if(retainerType === 5) return; - - if(!nodes[nodeUid]) { - nodes[nodeUid] = true; - - var node = { - nodeUid: nodeUid, - name: ((type === 2 || type == 6) && name && name.length > 25) ? - name.substring(0, 25) + '...' : - name, - type: type, - selfSize: selfSize, - retainerName: retainerName, - retainerType: retainerType, - parents: {}, - children: [] - }; - - nodeEmitter.emit('node', node); - } - }); - - - self.agent.logger.log("V8 heap profiler stopped"); - - snapshot._id = self.agent.getNextId(); - snapshot._label = os.hostname() + ' [' + process.pid + ']'; - snapshot._ts = self.agent.system.millis(); - snapshot._ns = 'heap-snapshots'; - snapshot['Retainers'] = undefined; - snapshot['Objects'] = undefined; - - nodeEmitter.emit('done'); - nodeEmitter.removeAllListeners(); - - try { - self.agent.emit('heapSnapshot', snapshot); - } - catch(err) { - self.agent.logger.error(err); - } - - self.active = false; -}; - - - -HeapProfiler.prototype.buildRetainerGroups = function(nodeEmitter, snapshot) { - var self = this; - - var groups = {}; - var totalSize = 0; - var totalCount = 0; - - nodeEmitter.on('node', function(node) { - var key = genRetainerKey(node); - var obj = groups[key]; - if(!obj) { - obj = groups[key] = { - _id: self.agent.getNextId(), - _label: genRetainerLabel(node), - _size: 0, - _count: 0, - _largestInstances: [], - _minInstanceSize: 0, - _randomInstances: [] - }; - } - - if(!obj._largestInstances) { - return; // something is wrong here - } - - obj._size += node.selfSize; - obj._count++; - - var large = (node.selfSize > obj._minInstanceSize || obj._largestInstances.length < 10); - var random = (obj._count % Math.pow(10, Math.floor(Math.log(obj._count) / Math.LN10)) == 0); - if(large || random) { - var instance = { - _id: self.agent.getNextId(), - _label: genNodeLabel(node), - _selfSize: node.selfSize, - 'Name': node.name, - 'Type': nodeTypeToString(node.type), - 'Size (KB)': (node.selfSize / 1024).toFixed(3) - }; - - if(large) { - obj._largestInstances.push(instance); - - obj._largestInstances = obj._largestInstances.sort(function(a, b) { - return b._selfSize - a._selfSize; - }); - - obj._largestInstances.splice(10); - obj._minInstanceSize = obj._largestInstances[obj._largestInstances.length - 1]._selfSize; - } - - if(random) { - obj._randomInstances.unshift(instance); - obj._randomInstances.splice(10); - } - } - - totalSize += node.selfSize; - totalCount++; - }); - - - nodeEmitter.on('done', function() { - // sort groups - var groupsOrdered = []; - for(var key in groups) { - groupsOrdered.push(groups[key]); - } - groupsOrdered = groupsOrdered.sort(function(a, b) { - return b._size - a._size; - }); - groupsOrdered.splice(25); - - - // prepare for rendering - for(var key in groups) { - var obj = groups[key]; - - obj['Size (KB)'] = (obj._size / 1024).toFixed(3); - if(totalSize > 0) obj['Size (%)'] = Math.round((obj._size / totalSize) * 100); - obj._label = obj['Size (%)'] + "% - " + obj._label; - - obj['Count'] = obj._count; - if(totalCount > 0) obj['Count (%)'] = Math.round((obj._count / totalCount) * 100); - - obj['Largest instances'] = obj._largestInstances; - obj['Random instances'] = obj._randomInstances; - - delete obj._size; - delete obj._count; - delete obj._largestInstances; - delete obj._minInstanceSize; - delete obj._randomInstances; - } - - snapshot['Retainers'] = groupsOrdered; - }); -} - - -HeapProfiler.prototype.buildObjectGroups = function(nodeEmitter, snapshot) { - var self = this; - - var groups = {}; - var totalSize = 0; - var totalCount = 0; - - nodeEmitter.on('node', function(node) { - var key = genObjectKey(node); - var obj = groups[key]; - if(!obj) { - obj = groups[key] = { - _id: self.agent.getNextId(), - _label: key, - _size: 0, - _count: 0, - _largestInstances: [], - _minInstanceSize: 0, - _randomInstances: [] - }; - } - - if(!obj._largestInstances) { - return; // something is wrong here - } - - obj._size += node.selfSize; - obj._count++; - - var large = (node.selfSize > obj._minInstanceSize || obj._largestInstances.length < 10); - var random = (obj._count % Math.pow(10, Math.floor(Math.log(obj._count) / Math.LN10)) == 0); - if(large || random) { - var instance = { - _id: self.agent.getNextId(), - _label: genNodeLabel(node), - _selfSize: node.selfSize, - 'Name': node.name, - 'Type': nodeTypeToString(node.type), - 'Size (KB)': (node.selfSize / 1024).toFixed(3) - }; - - if(large) { - obj._largestInstances.push(instance); - - obj._largestInstances = obj._largestInstances.sort(function(a, b) { - return b._selfSize - a._selfSize; - }); - - obj._largestInstances.splice(10); - obj._minInstanceSize = obj._largestInstances[obj._largestInstances.length - 1]._selfSize; - } - - if(random) { - obj._randomInstances.unshift(instance); - obj._randomInstances.splice(10); - } - } - - totalSize += node.selfSize; - totalCount++; - }); - - - nodeEmitter.on('done', function() { - // sort groups - var groupsOrdered = []; - for(var key in groups) { - groupsOrdered.push(groups[key]); - } - groupsOrdered = groupsOrdered.sort(function(a, b) { - return b._size - a._size; - }); - groupsOrdered.splice(25); - - - // prepare for rendering - for(var key in groups) { - var obj = groups[key]; - - obj['Size (KB)'] = (obj._size / 1024).toFixed(3); - if(totalSize > 0) obj['Size (%)'] = Math.round((obj._size / totalSize) * 100); - obj._name = obj._label; - obj._label = obj['Size (%)'] + "% - " + obj._label; - - obj['Count'] = obj._count; - if(totalCount > 0) obj['Count (%)'] = Math.round((obj._count / totalCount) * 100); - - obj['Largest instances'] = obj._largestInstances; - obj['Random instances'] = obj._randomInstances; - - delete obj._size; - delete obj._count; - delete obj._largestInstances; - delete obj._minInstanceSize; - delete obj._randomInstances; - } - - snapshot['Objects'] = groupsOrdered; - }); -} - - - -function genObjectKey(node) { - switch(node.type) { - case 1: - return 'Array'; - case 2: - return 'String'; - case 3: - return node.name; - case 4: - return 'compiled code'; - case 5: - return 'Function'; - case 6: - return 'RegExp'; - case 7: - return 'Number'; - case 8: - return node.name; - default: - return 'other'; - } -} - - -function genRetainerKey(node) { - if(node.retainerType == 0 || node.retainerType == 2) { - return edgeTypeToString(node.retainerType) + ':' + node.retainerName; - } - else { - return edgeTypeToString(node.retainerType); - } -} - - -function genRetainerLabel(node) { - switch(node.retainerType) { - case 0: - return 'Variable: ' + node.retainerName; - case 1: - return 'Array elements'; - case 2: - return 'Property: ' + node.retainerName; - case 4: - return 'Hidden links'; - case 6: - return 'Weak references'; - default: - return 'Other'; - } -} - - -function truncate(obj, len) { - if(!obj) return undefined; - - if(typeof(obj) === 'string') { - if(obj.length > len) { - return obj.substring(0, len) + '...'; - } - else { - return obj; - } - } - else if(typeof(obj) === 'number') { - return obj; - } -} - - -function genNodeLabel(node) { - var name = truncate(node.name, 25); - return nodeTypeToString(node.type) + (name ? (": " + name) : ""); -} - - - -function edgeTypeToString(type) { - switch(type) { - case 0: - return 'variable'; - case 1: - return 'element'; - case 2: - return 'property'; - case 3: - return 'internal'; - case 4: - return 'hidden'; - case 5: - return 'shortcut'; - case 6: - return 'weak'; - default: - return 'other'; - } -} - -function nodeTypeToString(type) { - switch(type) { - case 0: - return 'hidden'; - case 1: - return 'array'; - case 2: - return 'string'; - case 3: - return 'object'; - case 4: - return 'compiled code'; - case 5: - return 'function clojure'; - case 6: - return 'regexp'; - case 7: - return 'heap number'; - case 8: - return 'native object'; - default: - return 'other'; - } -} - - diff --git a/node_modules/nodetime/lib/v8/heap-stats.js b/node_modules/nodetime/lib/v8/heap-stats.js deleted file mode 100644 index f77cc5b..0000000 --- a/node_modules/nodetime/lib/v8/heap-stats.js +++ /dev/null @@ -1,46 +0,0 @@ -'use strict'; - - -function HeapStats(agent) { - this.agent = agent; -} -exports.HeapStats = HeapStats; - - -HeapStats.prototype.init = function() { - var self = this; - - self.agent.on('heapSnapshot', function(heapSnapshot) { - var objs = heapSnapshot['Objects']; - if(!objs || !Array.isArray(objs)) return; - - var len = objs.length < 6 ? objs.length : 6; - for(var i = 0; i < len; i++) { - var obj = objs[i]; - - if(obj._name === 'other') { - continue; - } - - var objSize = parseFloat(obj['Size (KB)']); - if(objSize) { - self.agent.metric( - 'Heap Snapshot', - obj._name + '/Size', - objSize, - 'KB', - 'gaugex'); - } - - var objCount = parseInt(obj['Count']) - if(objCount) { - self.agent.metric( - 'Heap Snapshot', - obj._name + '/Count', - objCount, - null, - 'gaugex'); - } - } - }); -}; \ No newline at end of file diff --git a/node_modules/nodetime/node_modules/request/LICENSE b/node_modules/nodetime/node_modules/request/LICENSE deleted file mode 100644 index a4a9aee..0000000 --- a/node_modules/nodetime/node_modules/request/LICENSE +++ /dev/null @@ -1,55 +0,0 @@ -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and - -You must cause any modified files to carry prominent notices stating that You changed the files; and - -You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - -If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/node_modules/nodetime/node_modules/request/README.md b/node_modules/nodetime/node_modules/request/README.md deleted file mode 100644 index d1f5c56..0000000 --- a/node_modules/nodetime/node_modules/request/README.md +++ /dev/null @@ -1,310 +0,0 @@ -# Request -- Simplified HTTP request method - -## Install - -
    -  npm install request
    -
    - -Or from source: - -
    -  git clone git://github.com/mikeal/request.git 
    -  cd request
    -  npm link
    -
    - -## Super simple to use - -Request is designed to be the simplest way possible to make http calls. It supports HTTPS and follows redirects by default. - -```javascript -var request = require('request'); -request('http://www.google.com', function (error, response, body) { - if (!error && response.statusCode == 200) { - console.log(body) // Print the google web page. - } -}) -``` - -## Streaming - -You can stream any response to a file stream. - -```javascript -request('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png')) -``` - -You can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types, in this case `application/json`, and use the proper content-type in the PUT request if one is not already provided in the headers. - -```javascript -fs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json')) -``` - -Request can also pipe to itself. When doing so the content-type and content-length will be preserved in the PUT headers. - -```javascript -request.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png')) -``` - -Now let's get fancy. - -```javascript -http.createServer(function (req, resp) { - if (req.url === '/doodle.png') { - if (req.method === 'PUT') { - req.pipe(request.put('http://mysite.com/doodle.png')) - } else if (req.method === 'GET' || req.method === 'HEAD') { - request.get('http://mysite.com/doodle.png').pipe(resp) - } - } -}) -``` - -You can also pipe() from a http.ServerRequest instance and to a http.ServerResponse instance. The HTTP method and headers will be sent as well as the entity-body data. Which means that, if you don't really care about security, you can do: - -```javascript -http.createServer(function (req, resp) { - if (req.url === '/doodle.png') { - var x = request('http://mysite.com/doodle.png') - req.pipe(x) - x.pipe(resp) - } -}) -``` - -And since pipe() returns the destination stream in node 0.5.x you can do one line proxying :) - -```javascript -req.pipe(request('http://mysite.com/doodle.png')).pipe(resp) -``` - -Also, none of this new functionality conflicts with requests previous features, it just expands them. - -```javascript -var r = request.defaults({'proxy':'http://localproxy.com'}) - -http.createServer(function (req, resp) { - if (req.url === '/doodle.png') { - r.get('http://google.com/doodle.png').pipe(resp) - } -}) -``` -You can still use intermediate proxies, the requests will still follow HTTP forwards, etc. - -## Forms - -`request` supports `application/x-www-form-urlencoded` and `multipart/form-data` form uploads. For `multipart/related` refer to the `multipart` API. - -Url encoded forms are simple - -```javascript -request.post('http://service.com/upload', {form:{key:'value'}}) -// or -request.post('http://service.com/upload').form({key:'value'}) -``` - -For `multipart/form-data` we use the [form-data](https://github.com/felixge/node-form-data) library by [@felixge](https://github.com/felixge). You don't need to worry about piping the form object or setting the headers, `request` will handle that for you. - -```javascript -var r = request.post('http://service.com/upload') -var form = r.form() -form.append('my_field', 'my_value') -form.append('my_buffer', new Buffer([1, 2, 3])) -form.append('my_file', fs.createReadStream(path.join(__dirname, 'doodle.png')) -form.append('remote_file', request('http://google.com/doodle.png')) -``` - -## OAuth Signing - -```javascript -// Twitter OAuth -var qs = require('querystring') - , oauth = - { callback: 'http://mysite.com/callback/' - , consumer_key: CONSUMER_KEY - , consumer_secret: CONSUMER_SECRET - } - , url = 'https://api.twitter.com/oauth/request_token' - ; -request.post({url:url, oauth:oauth}, function (e, r, body) { - // Assume by some stretch of magic you aquired the verifier - var access_token = qs.parse(body) - , oauth = - { consumer_key: CONSUMER_KEY - , consumer_secret: CONSUMER_SECRET - , token: access_token.oauth_token - , verifier: VERIFIER - , token_secret: access_token.oauth_token_secret - } - , url = 'https://api.twitter.com/oauth/access_token' - ; - request.post({url:url, oauth:oauth}, function (e, r, body) { - var perm_token = qs.parse(body) - , oauth = - { consumer_key: CONSUMER_KEY - , consumer_secret: CONSUMER_SECRET - , token: perm_token.oauth_token - , token_secret: perm_token.oauth_token_secret - } - , url = 'https://api.twitter.com/1/users/show.json?' - , params = - { screen_name: perm_token.screen_name - , user_id: perm_token.user_id - } - ; - url += qs.stringify(params) - request.get({url:url, oauth:oauth, json:true}, function (e, r, user) { - console.log(user) - }) - }) -}) -``` - - - -### request(options, callback) - -The first argument can be either a url or an options object. The only required option is uri, all others are optional. - -* `uri` || `url` - fully qualified uri or a parsed url object from url.parse() -* `qs` - object containing querystring values to be appended to the uri -* `method` - http method, defaults to GET -* `headers` - http headers, defaults to {} -* `body` - entity body for POST and PUT requests. Must be buffer or string. -* `form` - when passed an object this will set `body` but to a querystring representation of value and adds `Content-type: application/x-www-form-urlencoded; charset=utf-8` header. When passed no option a FormData instance is returned that will be piped to request. -* `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header. Additionally, parses the response body as json. -* `multipart` - (experimental) array of objects which contains their own headers and `body` attribute. Sends `multipart/related` request. See example below. -* `followRedirect` - follow HTTP 3xx responses as redirects. defaults to true. -* `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects. defaults to false. -* `maxRedirects` - the maximum number of redirects to follow, defaults to 10. -* `encoding` - Encoding to be used on `setEncoding` of response data. If set to `null`, the body is returned as a Buffer. -* `pool` - A hash object containing the agents for these requests. If omitted this request will use the global pool which is set to node's default maxSockets. -* `pool.maxSockets` - Integer containing the maximum amount of sockets in the pool. -* `timeout` - Integer containing the number of milliseconds to wait for a request to respond before aborting the request -* `proxy` - An HTTP proxy to be used. Support proxy Auth with Basic Auth the same way it's supported with the `url` parameter by embedding the auth info in the uri. -* `oauth` - Options for OAuth HMAC-SHA1 signing, see documentation above. -* `strictSSL` - Set to `true` to require that SSL certificates be valid. Note: to use your own certificate authority, you need to specify an agent that was created with that ca as an option. -* `jar` - Set to `false` if you don't want cookies to be remembered for future use or define your custom cookie jar (see examples section) -* `aws` - object containing aws signing information, should have the properties `key` and `secret` as well as `bucket` unless you're specifying your bucket as part of the path, or you are making a request that doesn't use a bucket (i.e. GET Services) - - -The callback argument gets 3 arguments. The first is an error when applicable (usually from the http.Client option not the http.ClientRequest object). The second in an http.ClientResponse object. The third is the response body String or Buffer. - -## Convenience methods - -There are also shorthand methods for different HTTP METHODs and some other conveniences. - -### request.defaults(options) - -This method returns a wrapper around the normal request API that defaults to whatever options you pass in to it. - -### request.put - -Same as request() but defaults to `method: "PUT"`. - -```javascript -request.put(url) -``` - -### request.post - -Same as request() but defaults to `method: "POST"`. - -```javascript -request.post(url) -``` - -### request.head - -Same as request() but defaults to `method: "HEAD"`. - -```javascript -request.head(url) -``` - -### request.del - -Same as request() but defaults to `method: "DELETE"`. - -```javascript -request.del(url) -``` - -### request.get - -Alias to normal request method for uniformity. - -```javascript -request.get(url) -``` -### request.cookie - -Function that creates a new cookie. - -```javascript -request.cookie('cookie_string_here') -``` -### request.jar - -Function that creates a new cookie jar. - -```javascript -request.jar() -``` - - -## Examples: - -```javascript - var request = require('request') - , rand = Math.floor(Math.random()*100000000).toString() - ; - request( - { method: 'PUT' - , uri: 'http://mikeal.iriscouch.com/testjs/' + rand - , multipart: - [ { 'content-type': 'application/json' - , body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}}) - } - , { body: 'I am an attachment' } - ] - } - , function (error, response, body) { - if(response.statusCode == 201){ - console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand) - } else { - console.log('error: '+ response.statusCode) - console.log(body) - } - } - ) -``` -Cookies are enabled by default (so they can be used in subsequent requests). To disable cookies set jar to false (either in defaults or in the options sent). - -```javascript -var request = request.defaults({jar: false}) -request('http://www.google.com', function () { - request('http://images.google.com') -}) -``` - -If you to use a custom cookie jar (instead of letting request use its own global cookie jar) you do so by setting the jar default or by specifying it as an option: - -```javascript -var j = request.jar() -var request = request.defaults({jar:j}) -request('http://www.google.com', function () { - request('http://images.google.com') -}) -``` -OR - -```javascript -var j = request.jar() -var cookie = request.cookie('your_cookie_here') -j.add(cookie) -request({url: 'http://www.google.com', jar: j}, function () { - request('http://images.google.com') -}) -``` diff --git a/node_modules/nodetime/node_modules/request/aws.js b/node_modules/nodetime/node_modules/request/aws.js deleted file mode 100644 index 4d8d950..0000000 --- a/node_modules/nodetime/node_modules/request/aws.js +++ /dev/null @@ -1,191 +0,0 @@ - -/*! - * knox - auth - * Copyright(c) 2010 LearnBoost - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var crypto = require('crypto') - , parse = require('url').parse - ; - -/** - * Valid keys. - */ - -var keys = - [ 'acl' - , 'location' - , 'logging' - , 'notification' - , 'partNumber' - , 'policy' - , 'requestPayment' - , 'torrent' - , 'uploadId' - , 'uploads' - , 'versionId' - , 'versioning' - , 'versions' - , 'website' - ] - -/** - * Return an "Authorization" header value with the given `options` - * in the form of "AWS :" - * - * @param {Object} options - * @return {String} - * @api private - */ - -exports.authorization = function(options){ - return 'AWS ' + options.key + ':' + exports.sign(options) -} - -/** - * Simple HMAC-SHA1 Wrapper - * - * @param {Object} options - * @return {String} - * @api private - */ - -exports.hmacSha1 = function(options){ - return crypto.createHmac('sha1', options.secret).update(options.message).digest('base64') -} - -/** - * Create a base64 sha1 HMAC for `options`. - * - * @param {Object} options - * @return {String} - * @api private - */ - -exports.sign = function(options){ - options.message = exports.stringToSign(options) - return exports.hmacSha1(options) -} - -/** - * Create a base64 sha1 HMAC for `options`. - * - * Specifically to be used with S3 presigned URLs - * - * @param {Object} options - * @return {String} - * @api private - */ - -exports.signQuery = function(options){ - options.message = exports.queryStringToSign(options) - return exports.hmacSha1(options) -} - -/** - * Return a string for sign() with the given `options`. - * - * Spec: - * - * \n - * \n - * \n - * \n - * [headers\n] - * - * - * @param {Object} options - * @return {String} - * @api private - */ - -exports.stringToSign = function(options){ - var headers = options.amazonHeaders || '' - if (headers) headers += '\n' - var r = - [ options.verb - , options.md5 - , options.contentType - , options.date.toUTCString() - , headers + options.resource - ] - return r.join('\n') -} - -/** - * Return a string for sign() with the given `options`, but is meant exclusively - * for S3 presigned URLs - * - * Spec: - * - * \n - * - * - * @param {Object} options - * @return {String} - * @api private - */ - -exports.queryStringToSign = function(options){ - return 'GET\n\n\n' + options.date + '\n' + options.resource -}; - -/** - * Perform the following: - * - * - ignore non-amazon headers - * - lowercase fields - * - sort lexicographically - * - trim whitespace between ":" - * - join with newline - * - * @param {Object} headers - * @return {String} - * @api private - */ - -exports.canonicalizeHeaders = function(headers){ - var buf = [] - , fields = Object.keys(headers) - ; - for (var i = 0, len = fields.length; i < len; ++i) { - var field = fields[i] - , val = headers[field] - , field = field.toLowerCase() - ; - if (0 !== field.indexOf('x-amz')) continue - buf.push(field + ':' + val) - } - return buf.sort().join('\n') -}; - -/** - * Perform the following: - * - * - ignore non sub-resources - * - sort lexicographically - * - * @param {String} resource - * @return {String} - * @api private - */ - -exports.canonicalizeResource = function(resource){ - var url = parse(resource, true) - , path = url.pathname - , buf = [] - ; - - Object.keys(url.query).forEach(function(key){ - if (!~keys.indexOf(key)) return - var val = '' == url.query[key] ? '' : '=' + encodeURIComponent(url.query[key]) - buf.push(key + val) - }) - - return path + (buf.length ? '?' + buf.sort().join('&') : '') -}; diff --git a/node_modules/nodetime/node_modules/request/forever.js b/node_modules/nodetime/node_modules/request/forever.js deleted file mode 100644 index 1e1d4b9..0000000 --- a/node_modules/nodetime/node_modules/request/forever.js +++ /dev/null @@ -1,103 +0,0 @@ -module.exports = ForeverAgent -ForeverAgent.SSL = ForeverAgentSSL - -var util = require('util') - , Agent = require('http').Agent - , net = require('net') - , tls = require('tls') - , AgentSSL = require('https').Agent - -function ForeverAgent(options) { - var self = this - self.options = options || {} - self.requests = {} - self.sockets = {} - self.freeSockets = {} - self.maxSockets = self.options.maxSockets || Agent.defaultMaxSockets - self.minSockets = self.options.minSockets || ForeverAgent.defaultMinSockets - self.on('free', function(socket, host, port) { - var name = host + ':' + port - if (self.requests[name] && self.requests[name].length) { - self.requests[name].shift().onSocket(socket) - } else if (self.sockets[name].length < self.minSockets) { - if (!self.freeSockets[name]) self.freeSockets[name] = [] - self.freeSockets[name].push(socket) - - // if an error happens while we don't use the socket anyway, meh, throw the socket away - function onIdleError() { - socket.destroy() - } - socket._onIdleError = onIdleError - socket.on('error', onIdleError) - } else { - // If there are no pending requests just destroy the - // socket and it will get removed from the pool. This - // gets us out of timeout issues and allows us to - // default to Connection:keep-alive. - socket.destroy() - } - }) - -} -util.inherits(ForeverAgent, Agent) - -ForeverAgent.defaultMinSockets = 5 - - -ForeverAgent.prototype.createConnection = net.createConnection -ForeverAgent.prototype.addRequestNoreuse = Agent.prototype.addRequest -ForeverAgent.prototype.addRequest = function(req, host, port) { - var name = host + ':' + port - if (this.freeSockets[name] && this.freeSockets[name].length > 0 && !req.useChunkedEncodingByDefault) { - var idleSocket = this.freeSockets[name].pop() - idleSocket.removeListener('error', idleSocket._onIdleError) - delete idleSocket._onIdleError - req._reusedSocket = true - req.onSocket(idleSocket) - } else { - this.addRequestNoreuse(req, host, port) - } -} - -ForeverAgent.prototype.removeSocket = function(s, name, host, port) { - if (this.sockets[name]) { - var index = this.sockets[name].indexOf(s) - if (index !== -1) { - this.sockets[name].splice(index, 1) - } - } else if (this.sockets[name] && this.sockets[name].length === 0) { - // don't leak - delete this.sockets[name] - delete this.requests[name] - } - - if (this.freeSockets[name]) { - var index = this.freeSockets[name].indexOf(s) - if (index !== -1) { - this.freeSockets[name].splice(index, 1) - if (this.freeSockets[name].length === 0) { - delete this.freeSockets[name] - } - } - } - - if (this.requests[name] && this.requests[name].length) { - // If we have pending requests and a socket gets closed a new one - // needs to be created to take over in the pool for the one that closed. - this.createSocket(name, host, port).emit('free') - } -} - -function ForeverAgentSSL (options) { - ForeverAgent.call(this, options) -} -util.inherits(ForeverAgentSSL, ForeverAgent) - -ForeverAgentSSL.prototype.createConnection = createConnectionSSL -ForeverAgentSSL.prototype.addRequestNoreuse = AgentSSL.prototype.addRequest - -function createConnectionSSL (port, host, options) { - options.port = port - options.host = host - return tls.connect(options) -} diff --git a/node_modules/nodetime/node_modules/request/main.js b/node_modules/nodetime/node_modules/request/main.js deleted file mode 100644 index 27b470b..0000000 --- a/node_modules/nodetime/node_modules/request/main.js +++ /dev/null @@ -1,1123 +0,0 @@ -// Copyright 2010-2012 Mikeal Rogers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -var http = require('http') - , https = false - , tls = false - , url = require('url') - , util = require('util') - , stream = require('stream') - , qs = require('querystring') - , oauth = require('./oauth') - , uuid = require('./uuid') - , ForeverAgent = require('./forever') - , Cookie = require('./vendor/cookie') - , CookieJar = require('./vendor/cookie/jar') - , cookieJar = new CookieJar - , tunnel = require('./tunnel') - , aws = require('./aws') - - , mime = require('mime') - , FormData = require('form-data') - ; - -if (process.logging) { - var log = process.logging('request') -} - -try { - https = require('https') -} catch (e) {} - -try { - tls = require('tls') -} catch (e) {} - -function toBase64 (str) { - return (new Buffer(str || "", "ascii")).toString("base64") -} - -// Hacky fix for pre-0.4.4 https -if (https && !https.Agent) { - https.Agent = function (options) { - http.Agent.call(this, options) - } - util.inherits(https.Agent, http.Agent) - https.Agent.prototype._getConnection = function (host, port, cb) { - var s = tls.connect(port, host, this.options, function () { - // do other checks here? - if (cb) cb() - }) - return s - } -} - -function isReadStream (rs) { - if (rs.readable && rs.path && rs.mode) { - return true - } -} - -function copy (obj) { - var o = {} - Object.keys(obj).forEach(function (i) { - o[i] = obj[i] - }) - return o -} - -var isUrl = /^https?:/ - -var globalPool = {} - -function Request (options) { - stream.Stream.call(this) - this.readable = true - this.writable = true - - if (typeof options === 'string') { - options = {uri:options} - } - - var reserved = Object.keys(Request.prototype) - for (var i in options) { - if (reserved.indexOf(i) === -1) { - this[i] = options[i] - } else { - if (typeof options[i] === 'function') { - delete options[i] - } - } - } - options = copy(options) - - this.init(options) -} -util.inherits(Request, stream.Stream) -Request.prototype.init = function (options) { - var self = this - - if (!options) options = {} - if (process.env.NODE_DEBUG && /request/.test(process.env.NODE_DEBUG)) console.error('REQUEST', options) - if (!self.pool && self.pool !== false) self.pool = globalPool - self.dests = [] - self.__isRequestRequest = true - - // Protect against double callback - if (!self._callback && self.callback) { - self._callback = self.callback - self.callback = function () { - if (self._callbackCalled) return // Print a warning maybe? - self._callback.apply(self, arguments) - self._callbackCalled = true - } - self.on('error', self.callback.bind()) - self.on('complete', self.callback.bind(self, null)) - } - - if (self.url) { - // People use this property instead all the time so why not just support it. - self.uri = self.url - delete self.url - } - - if (!self.uri) { - // this will throw if unhandled but is handleable when in a redirect - return self.emit('error', new Error("options.uri is a required argument")) - } else { - if (typeof self.uri == "string") self.uri = url.parse(self.uri) - } - if (self.proxy) { - if (typeof self.proxy == 'string') self.proxy = url.parse(self.proxy) - - // do the HTTP CONNECT dance using koichik/node-tunnel - if (http.globalAgent && self.uri.protocol === "https:") { - var tunnelFn = self.proxy.protocol === "http:" - ? tunnel.httpsOverHttp : tunnel.httpsOverHttps - - var tunnelOptions = { proxy: { host: self.proxy.hostname - , port: +self.proxy.port - , proxyAuth: self.proxy.auth } - , ca: this.ca } - - self.agent = tunnelFn(tunnelOptions) - self.tunnel = true - } - } - - if (!self.uri.host || !self.uri.pathname) { - // Invalid URI: it may generate lot of bad errors, like "TypeError: Cannot call method 'indexOf' of undefined" in CookieJar - // Detect and reject it as soon as possible - var faultyUri = url.format(self.uri) - var message = 'Invalid URI "' + faultyUri + '"' - if (Object.keys(options).length === 0) { - // No option ? This can be the sign of a redirect - // As this is a case where the user cannot do anything (he didn't call request directly with this URL) - // he should be warned that it can be caused by a redirection (can save some hair) - message += '. This can be caused by a crappy redirection.' - } - self.emit('error', new Error(message)) - return // This error was fatal - } - - self._redirectsFollowed = self._redirectsFollowed || 0 - self.maxRedirects = (self.maxRedirects !== undefined) ? self.maxRedirects : 10 - self.followRedirect = (self.followRedirect !== undefined) ? self.followRedirect : true - self.followAllRedirects = (self.followAllRedirects !== undefined) ? self.followAllRedirects : false - if (self.followRedirect || self.followAllRedirects) - self.redirects = self.redirects || [] - - self.headers = self.headers ? copy(self.headers) : {} - - self.setHost = false - if (!self.headers.host) { - self.headers.host = self.uri.hostname - if (self.uri.port) { - if ( !(self.uri.port === 80 && self.uri.protocol === 'http:') && - !(self.uri.port === 443 && self.uri.protocol === 'https:') ) - self.headers.host += (':'+self.uri.port) - } - self.setHost = true - } - - self.jar(self._jar || options.jar) - - if (!self.uri.pathname) {self.uri.pathname = '/'} - if (!self.uri.port) { - if (self.uri.protocol == 'http:') {self.uri.port = 80} - else if (self.uri.protocol == 'https:') {self.uri.port = 443} - } - - if (self.proxy && !self.tunnel) { - self.port = self.proxy.port - self.host = self.proxy.hostname - } else { - self.port = self.uri.port - self.host = self.uri.hostname - } - - self.clientErrorHandler = function (error) { - if (self._aborted) return - - if (self.setHost) delete self.headers.host - if (self.req._reusedSocket && error.code === 'ECONNRESET' - && self.agent.addRequestNoreuse) { - self.agent = { addRequest: self.agent.addRequestNoreuse.bind(self.agent) } - self.start() - self.req.end() - return - } - if (self.timeout && self.timeoutTimer) { - clearTimeout(self.timeoutTimer) - self.timeoutTimer = null - } - self.emit('error', error) - } - - self._parserErrorHandler = function (error) { - if (this.res) { - if (this.res.request) { - this.res.request.emit('error', error) - } else { - this.res.emit('error', error) - } - } else { - this._httpMessage.emit('error', error) - } - } - - if (options.form) { - self.form(options.form) - } - - if (options.oauth) { - self.oauth(options.oauth) - } - - if (options.aws) { - self.aws(options.aws) - } - - if (self.uri.auth && !self.headers.authorization) { - self.headers.authorization = "Basic " + toBase64(self.uri.auth.split(':').map(function(item){ return qs.unescape(item)}).join(':')) - } - if (self.proxy && self.proxy.auth && !self.headers['proxy-authorization'] && !self.tunnel) { - self.headers['proxy-authorization'] = "Basic " + toBase64(self.proxy.auth.split(':').map(function(item){ return qs.unescape(item)}).join(':')) - } - - if (options.qs) self.qs(options.qs) - - if (self.uri.path) { - self.path = self.uri.path - } else { - self.path = self.uri.pathname + (self.uri.search || "") - } - - if (self.path.length === 0) self.path = '/' - - if (self.proxy && !self.tunnel) self.path = (self.uri.protocol + '//' + self.uri.host + self.path) - - if (options.json) { - self.json(options.json) - } else if (options.multipart) { - self.boundary = uuid() - self.multipart(options.multipart) - } - - if (self.body) { - var length = 0 - if (!Buffer.isBuffer(self.body)) { - if (Array.isArray(self.body)) { - for (var i = 0; i < self.body.length; i++) { - length += self.body[i].length - } - } else { - self.body = new Buffer(self.body) - length = self.body.length - } - } else { - length = self.body.length - } - if (length) { - if(!self.headers['content-length'] && !self.headers['Content-Length']) - self.headers['content-length'] = length - } else { - throw new Error('Argument error, options.body.') - } - } - - var protocol = self.proxy && !self.tunnel ? self.proxy.protocol : self.uri.protocol - , defaultModules = {'http:':http, 'https:':https} - , httpModules = self.httpModules || {} - ; - self.httpModule = httpModules[protocol] || defaultModules[protocol] - - if (!self.httpModule) return this.emit('error', new Error("Invalid protocol")) - - if (options.ca) self.ca = options.ca - - if (!self.agent) { - if (options.agentOptions) self.agentOptions = options.agentOptions - - if (options.agentClass) { - self.agentClass = options.agentClass - } else if (options.forever) { - self.agentClass = protocol === 'http:' ? ForeverAgent : ForeverAgent.SSL - } else { - self.agentClass = self.httpModule.Agent - } - } - - if (self.pool === false) { - self.agent = false - } else { - self.agent = self.agent || self.getAgent() - if (self.maxSockets) { - // Don't use our pooling if node has the refactored client - self.agent.maxSockets = self.maxSockets - } - if (self.pool.maxSockets) { - // Don't use our pooling if node has the refactored client - self.agent.maxSockets = self.pool.maxSockets - } - } - - self.once('pipe', function (src) { - if (self.ntick && self._started) throw new Error("You cannot pipe to this stream after the outbound request has started.") - self.src = src - if (isReadStream(src)) { - if (!self.headers['content-type'] && !self.headers['Content-Type']) - self.headers['content-type'] = mime.lookup(src.path) - } else { - if (src.headers) { - for (var i in src.headers) { - if (!self.headers[i]) { - self.headers[i] = src.headers[i] - } - } - } - if (self._json && !self.headers['content-type'] && !self.headers['Content-Type']) - self.headers['content-type'] = 'application/json' - if (src.method && !self.method) { - self.method = src.method - } - } - - self.on('pipe', function () { - console.error("You have already piped to this stream. Pipeing twice is likely to break the request.") - }) - }) - - process.nextTick(function () { - if (self._aborted) return - - if (self._form) { - self.setHeaders(self._form.getHeaders()) - self._form.pipe(self) - } - if (self.body) { - if (Array.isArray(self.body)) { - self.body.forEach(function (part) { - self.write(part) - }) - } else { - self.write(self.body) - } - self.end() - } else if (self.requestBodyStream) { - console.warn("options.requestBodyStream is deprecated, please pass the request object to stream.pipe.") - self.requestBodyStream.pipe(self) - } else if (!self.src) { - if (self.method !== 'GET' && typeof self.method !== 'undefined') { - self.headers['content-length'] = 0 - } - self.end() - } - self.ntick = true - }) -} - -// Must call this when following a redirect from https to http or vice versa -// Attempts to keep everything as identical as possible, but update the -// httpModule, Tunneling agent, and/or Forever Agent in use. -Request.prototype._updateProtocol = function () { - var self = this - var protocol = self.uri.protocol - - if (protocol === 'https:') { - // previously was doing http, now doing https - // if it's https, then we might need to tunnel now. - if (self.proxy) { - self.tunnel = true - var tunnelFn = self.proxy.protocol === 'http:' - ? tunnel.httpsOverHttp : tunnel.httpsOverHttps - var tunnelOptions = { proxy: { host: self.proxy.hostname - , post: +self.proxy.port - , proxyAuth: self.proxy.auth } - , ca: self.ca } - self.agent = tunnelFn(tunnelOptions) - return - } - - self.httpModule = https - switch (self.agentClass) { - case ForeverAgent: - self.agentClass = ForeverAgent.SSL - break - case http.Agent: - self.agentClass = https.Agent - break - default: - // nothing we can do. Just hope for the best. - return - } - - // if there's an agent, we need to get a new one. - if (self.agent) self.agent = self.getAgent() - - } else { - if (log) log('previously https, now http') - // previously was doing https, now doing http - // stop any tunneling. - if (self.tunnel) self.tunnel = false - self.httpModule = http - switch (self.agentClass) { - case ForeverAgent.SSL: - self.agentClass = ForeverAgent - break - case https.Agent: - self.agentClass = http.Agent - break - default: - // nothing we can do. just hope for the best - return - } - - // if there's an agent, then get a new one. - if (self.agent) { - self.agent = null - self.agent = self.getAgent() - } - } -} - -Request.prototype.getAgent = function () { - var Agent = this.agentClass - var options = {} - if (this.agentOptions) { - for (var i in this.agentOptions) { - options[i] = this.agentOptions[i] - } - } - if (this.ca) options.ca = this.ca - - var poolKey = '' - - // different types of agents are in different pools - if (Agent !== this.httpModule.Agent) { - poolKey += Agent.name - } - - if (!this.httpModule.globalAgent) { - // node 0.4.x - options.host = this.host - options.port = this.port - if (poolKey) poolKey += ':' - poolKey += this.host + ':' + this.port - } - - // ca option is only relevant if proxy or destination are https - var proxy = this.proxy - if (typeof proxy === 'string') proxy = url.parse(proxy) - var caRelevant = (proxy && proxy.protocol === 'https:') || this.uri.protocol === 'https:' - if (options.ca && caRelevant) { - if (poolKey) poolKey += ':' - poolKey += options.ca - } - - if (!poolKey && Agent === this.httpModule.Agent && this.httpModule.globalAgent) { - // not doing anything special. Use the globalAgent - return this.httpModule.globalAgent - } - - // we're using a stored agent. Make sure it's protocol-specific - poolKey = this.uri.protocol + poolKey - - // already generated an agent for this setting - if (this.pool[poolKey]) return this.pool[poolKey] - - return this.pool[poolKey] = new Agent(options) -} - -Request.prototype.start = function () { - var self = this - - if (self._aborted) return - - self._started = true - self.method = self.method || 'GET' - self.href = self.uri.href - if (log) log('%method %href', self) - - if (self.src && self.src.stat && self.src.stat.size && !self.headers['content-length'] && !self.headers['Content-Length']) { - self.headers['content-length'] = self.src.stat.size - } - if (self._aws) { - self.aws(self._aws, true) - } - self.req = self.httpModule.request(self, function (response) { - if (response.connection.listeners('error').indexOf(self._parserErrorHandler) === -1) { - response.connection.once('error', self._parserErrorHandler) - } - if (self._aborted) return - if (self._paused) response.pause() - - self.response = response - response.request = self - response.toJSON = toJSON - - if (self.httpModule === https && - self.strictSSL && - !response.client.authorized) { - var sslErr = response.client.authorizationError - self.emit('error', new Error('SSL Error: '+ sslErr)) - return - } - - if (self.setHost) delete self.headers.host - if (self.timeout && self.timeoutTimer) { - clearTimeout(self.timeoutTimer) - self.timeoutTimer = null - } - - var addCookie = function (cookie) { - if (self._jar) self._jar.add(new Cookie(cookie)) - else cookieJar.add(new Cookie(cookie)) - } - - if (response.headers['set-cookie'] && (!self._disableCookies)) { - if (Array.isArray(response.headers['set-cookie'])) response.headers['set-cookie'].forEach(addCookie) - else addCookie(response.headers['set-cookie']) - } - - if (response.statusCode >= 300 && response.statusCode < 400 && - (self.followAllRedirects || - (self.followRedirect && (self.method !== 'PUT' && self.method !== 'POST' && self.method !== 'DELETE'))) && - response.headers.location) { - if (self._redirectsFollowed >= self.maxRedirects) { - self.emit('error', new Error("Exceeded maxRedirects. Probably stuck in a redirect loop "+self.uri.href)) - return - } - self._redirectsFollowed += 1 - - if (!isUrl.test(response.headers.location)) { - response.headers.location = url.resolve(self.uri.href, response.headers.location) - } - - var uriPrev = self.uri - self.uri = url.parse(response.headers.location) - - // handle the case where we change protocol from https to http or vice versa - if (self.uri.protocol !== uriPrev.protocol) { - self._updateProtocol() - } - - self.redirects.push( - { statusCode : response.statusCode - , redirectUri: response.headers.location - } - ) - if (self.followAllRedirects) self.method = 'GET' - // self.method = 'GET' // Force all redirects to use GET || commented out fixes #215 - delete self.src - delete self.req - delete self.agent - delete self._started - delete self.body - delete self._form - if (self.headers) { - delete self.headers.host - delete self.headers['content-type'] - delete self.headers['content-length'] - } - if (log) log('Redirect to %uri', self) - self.init() - return // Ignore the rest of the response - } else { - self._redirectsFollowed = self._redirectsFollowed || 0 - // Be a good stream and emit end when the response is finished. - // Hack to emit end on close because of a core bug that never fires end - response.on('close', function () { - if (!self._ended) self.response.emit('end') - }) - - if (self.encoding) { - if (self.dests.length !== 0) { - console.error("Ingoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.") - } else { - response.setEncoding(self.encoding) - } - } - - self.dests.forEach(function (dest) { - self.pipeDest(dest) - }) - - response.on("data", function (chunk) { - self._destdata = true - self.emit("data", chunk) - }) - response.on("end", function (chunk) { - self._ended = true - self.emit("end", chunk) - }) - response.on("close", function () {self.emit("close")}) - - self.emit('response', response) - - if (self.callback) { - var buffer = [] - var bodyLen = 0 - self.on("data", function (chunk) { - buffer.push(chunk) - bodyLen += chunk.length - }) - self.on("end", function () { - if (self._aborted) return - - if (buffer.length && Buffer.isBuffer(buffer[0])) { - var body = new Buffer(bodyLen) - var i = 0 - buffer.forEach(function (chunk) { - chunk.copy(body, i, 0, chunk.length) - i += chunk.length - }) - if (self.encoding === null) { - response.body = body - } else { - response.body = body.toString(self.encoding) - } - } else if (buffer.length) { - response.body = buffer.join('') - } - - if (self._json) { - try { - response.body = JSON.parse(response.body) - } catch (e) {} - } - - self.emit('complete', response, response.body) - }) - } - } - }) - - if (self.timeout && !self.timeoutTimer) { - self.timeoutTimer = setTimeout(function () { - self.req.abort() - var e = new Error("ETIMEDOUT") - e.code = "ETIMEDOUT" - self.emit("error", e) - }, self.timeout) - - // Set additional timeout on socket - in case if remote - // server freeze after sending headers - if (self.req.setTimeout) { // only works on node 0.6+ - self.req.setTimeout(self.timeout, function () { - if (self.req) { - self.req.abort() - var e = new Error("ESOCKETTIMEDOUT") - e.code = "ESOCKETTIMEDOUT" - self.emit("error", e) - } - }) - } - } - - self.req.on('error', self.clientErrorHandler) - self.req.on('drain', function() { - self.emit('drain') - }) - self.on('end', function() { - if ( self.req.connection ) self.req.connection.removeListener('error', self._parserErrorHandler) - }) - self.emit('request', self.req) -} - -Request.prototype.abort = function () { - this._aborted = true - - if (this.req) { - this.req.abort() - } - else if (this.response) { - this.response.abort() - } - - this.emit("abort") -} - -Request.prototype.pipeDest = function (dest) { - var response = this.response - // Called after the response is received - if (dest.headers) { - dest.headers['content-type'] = response.headers['content-type'] - if (response.headers['content-length']) { - dest.headers['content-length'] = response.headers['content-length'] - } - } - if (dest.setHeader) { - for (var i in response.headers) { - dest.setHeader(i, response.headers[i]) - } - dest.statusCode = response.statusCode - } - if (this.pipefilter) this.pipefilter(response, dest) -} - -// Composable API -Request.prototype.setHeader = function (name, value, clobber) { - if (clobber === undefined) clobber = true - if (clobber || !this.headers.hasOwnProperty(name)) this.headers[name] = value - else this.headers[name] += ',' + value - return this -} -Request.prototype.setHeaders = function (headers) { - for (var i in headers) {this.setHeader(i, headers[i])} - return this -} -Request.prototype.qs = function (q, clobber) { - var base - if (!clobber && this.uri.query) base = qs.parse(this.uri.query) - else base = {} - - for (var i in q) { - base[i] = q[i] - } - - this.uri = url.parse(this.uri.href.split('?')[0] + '?' + qs.stringify(base)) - this.url = this.uri - - return this -} -Request.prototype.form = function (form) { - if (form) { - this.headers['content-type'] = 'application/x-www-form-urlencoded; charset=utf-8' - this.body = qs.stringify(form).toString('utf8') - return this - } - // create form-data object - this._form = new FormData() - return this._form -} -Request.prototype.multipart = function (multipart) { - var self = this - self.body = [] - - if (!self.headers['content-type']) { - self.headers['content-type'] = 'multipart/related; boundary=' + self.boundary - } else { - self.headers['content-type'] = self.headers['content-type'].split(';')[0] + '; boundary=' + self.boundary - } - - if (!multipart.forEach) throw new Error('Argument error, options.multipart.') - - if (self.preambleCRLF) { - self.body.push(new Buffer('\r\n')) - } - - multipart.forEach(function (part) { - var body = part.body - if(body == null) throw Error('Body attribute missing in multipart.') - delete part.body - var preamble = '--' + self.boundary + '\r\n' - Object.keys(part).forEach(function (key) { - preamble += key + ': ' + part[key] + '\r\n' - }) - preamble += '\r\n' - self.body.push(new Buffer(preamble)) - self.body.push(new Buffer(body)) - self.body.push(new Buffer('\r\n')) - }) - self.body.push(new Buffer('--' + self.boundary + '--')) - return self -} -Request.prototype.json = function (val) { - this.setHeader('accept', 'application/json') - this._json = true - if (typeof val === 'boolean') { - if (typeof this.body === 'object') { - this.setHeader('content-type', 'application/json') - this.body = JSON.stringify(this.body) - } - } else { - this.setHeader('content-type', 'application/json') - this.body = JSON.stringify(val) - } - return this -} -function getHeader(name, headers) { - var result, re, match - Object.keys(headers).forEach(function (key) { - re = new RegExp(name, 'i') - match = key.match(re) - if (match) result = headers[key] - }) - return result -} -Request.prototype.aws = function (opts, now) { - if (!now) { - this._aws = opts - return this - } - var date = new Date() - this.setHeader('date', date.toUTCString()) - var auth = - { key: opts.key - , secret: opts.secret - , verb: this.method.toUpperCase() - , date: date - , contentType: getHeader('content-type', this.headers) || '' - , md5: getHeader('content-md5', this.headers) || '' - , amazonHeaders: aws.canonicalizeHeaders(this.headers) - } - if (opts.bucket && this.path) { - auth.resource = '/' + opts.bucket + this.path - } else if (opts.bucket && !this.path) { - auth.resource = '/' + opts.bucket - } else if (!opts.bucket && this.path) { - auth.resource = this.path - } else if (!opts.bucket && !this.path) { - auth.resource = '/' - } - auth.resource = aws.canonicalizeResource(auth.resource) - this.setHeader('authorization', aws.authorization(auth)) - - return this -} - -Request.prototype.oauth = function (_oauth) { - var form - if (this.headers['content-type'] && - this.headers['content-type'].slice(0, 'application/x-www-form-urlencoded'.length) === - 'application/x-www-form-urlencoded' - ) { - form = qs.parse(this.body) - } - if (this.uri.query) { - form = qs.parse(this.uri.query) - } - if (!form) form = {} - var oa = {} - for (var i in form) oa[i] = form[i] - for (var i in _oauth) oa['oauth_'+i] = _oauth[i] - if (!oa.oauth_version) oa.oauth_version = '1.0' - if (!oa.oauth_timestamp) oa.oauth_timestamp = Math.floor( (new Date()).getTime() / 1000 ).toString() - if (!oa.oauth_nonce) oa.oauth_nonce = uuid().replace(/-/g, '') - - oa.oauth_signature_method = 'HMAC-SHA1' - - var consumer_secret = oa.oauth_consumer_secret - delete oa.oauth_consumer_secret - var token_secret = oa.oauth_token_secret - delete oa.oauth_token_secret - - var baseurl = this.uri.protocol + '//' + this.uri.host + this.uri.pathname - var signature = oauth.hmacsign(this.method, baseurl, oa, consumer_secret, token_secret) - - // oa.oauth_signature = signature - for (var i in form) { - if ( i.slice(0, 'oauth_') in _oauth) { - // skip - } else { - delete oa['oauth_'+i] - if (i !== 'x_auth_mode') delete oa[i] - } - } - this.headers.Authorization = - 'OAuth '+Object.keys(oa).sort().map(function (i) {return i+'="'+oauth.rfc3986(oa[i])+'"'}).join(',') - this.headers.Authorization += ',oauth_signature="' + oauth.rfc3986(signature) + '"' - return this -} -Request.prototype.jar = function (jar) { - var cookies - - if (this._redirectsFollowed === 0) { - this.originalCookieHeader = this.headers.cookie - } - - if (jar === false) { - // disable cookies - cookies = false - this._disableCookies = true - } else if (jar) { - // fetch cookie from the user defined cookie jar - cookies = jar.get({ url: this.uri.href }) - } else { - // fetch cookie from the global cookie jar - cookies = cookieJar.get({ url: this.uri.href }) - } - - if (cookies && cookies.length) { - var cookieString = cookies.map(function (c) { - return c.name + "=" + c.value - }).join("; ") - - if (this.originalCookieHeader) { - // Don't overwrite existing Cookie header - this.headers.cookie = this.originalCookieHeader + '; ' + cookieString - } else { - this.headers.cookie = cookieString - } - } - this._jar = jar - return this -} - - -// Stream API -Request.prototype.pipe = function (dest, opts) { - if (this.response) { - if (this._destdata) { - throw new Error("You cannot pipe after data has been emitted from the response.") - } else if (this._ended) { - throw new Error("You cannot pipe after the response has been ended.") - } else { - stream.Stream.prototype.pipe.call(this, dest, opts) - this.pipeDest(dest) - return dest - } - } else { - this.dests.push(dest) - stream.Stream.prototype.pipe.call(this, dest, opts) - return dest - } -} -Request.prototype.write = function () { - if (!this._started) this.start() - return this.req.write.apply(this.req, arguments) -} -Request.prototype.end = function (chunk) { - if (chunk) this.write(chunk) - if (!this._started) this.start() - this.req.end() -} -Request.prototype.pause = function () { - if (!this.response) this._paused = true - else this.response.pause.apply(this.response, arguments) -} -Request.prototype.resume = function () { - if (!this.response) this._paused = false - else this.response.resume.apply(this.response, arguments) -} -Request.prototype.destroy = function () { - if (!this._ended) this.end() -} - -// organize params for post, put, head, del -function initParams(uri, options, callback) { - if ((typeof options === 'function') && !callback) callback = options - if (options && typeof options === 'object') { - options.uri = uri - } else if (typeof uri === 'string') { - options = {uri:uri} - } else { - options = uri - uri = options.uri - } - return { uri: uri, options: options, callback: callback } -} - -function request (uri, options, callback) { - if (typeof uri === 'undefined') throw new Error('undefined is not a valid uri or options object.') - if ((typeof options === 'function') && !callback) callback = options - if (options && typeof options === 'object') { - options.uri = uri - } else if (typeof uri === 'string') { - options = {uri:uri} - } else { - options = uri - } - - if (callback) options.callback = callback - var r = new Request(options) - return r -} - -module.exports = request - -request.initParams = initParams - -request.defaults = function (options, requester) { - var def = function (method) { - var d = function (uri, opts, callback) { - var params = initParams(uri, opts, callback) - for (var i in options) { - if (params.options[i] === undefined) params.options[i] = options[i] - } - if(typeof requester === 'function') { - if(method === request) { - method = requester - } else { - params.options._requester = requester - } - } - return method(params.options, params.callback) - } - return d - } - var de = def(request) - de.get = def(request.get) - de.post = def(request.post) - de.put = def(request.put) - de.head = def(request.head) - de.del = def(request.del) - de.cookie = def(request.cookie) - de.jar = request.jar - return de -} - -request.forever = function (agentOptions, optionsArg) { - var options = {} - if (optionsArg) { - for (option in optionsArg) { - options[option] = optionsArg[option] - } - } - if (agentOptions) options.agentOptions = agentOptions - options.forever = true - return request.defaults(options) -} - -request.get = request -request.post = function (uri, options, callback) { - var params = initParams(uri, options, callback) - params.options.method = 'POST' - return request(params.uri || null, params.options, params.callback) -} -request.put = function (uri, options, callback) { - var params = initParams(uri, options, callback) - params.options.method = 'PUT' - return request(params.uri || null, params.options, params.callback) -} -request.head = function (uri, options, callback) { - var params = initParams(uri, options, callback) - params.options.method = 'HEAD' - if (params.options.body || - params.options.requestBodyStream || - (params.options.json && typeof params.options.json !== 'boolean') || - params.options.multipart) { - throw new Error("HTTP HEAD requests MUST NOT include a request body.") - } - return request(params.uri || null, params.options, params.callback) -} -request.del = function (uri, options, callback) { - var params = initParams(uri, options, callback) - params.options.method = 'DELETE' - if(typeof params.options._requester === 'function') { - request = params.options._requester - } - return request(params.uri || null, params.options, params.callback) -} -request.jar = function () { - return new CookieJar -} -request.cookie = function (str) { - if (str && str.uri) str = str.uri - if (typeof str !== 'string') throw new Error("The cookie function only accepts STRING as param") - return new Cookie(str) -} - -// Safe toJSON - -function getSafe (self, uuid) { - if (typeof self === 'object' || typeof self === 'function') var safe = {} - if (Array.isArray(self)) var safe = [] - - var recurse = [] - - Object.defineProperty(self, uuid, {}) - - var attrs = Object.keys(self).filter(function (i) { - if (i === uuid) return false - if ( (typeof self[i] !== 'object' && typeof self[i] !== 'function') || self[i] === null) return true - return !(Object.getOwnPropertyDescriptor(self[i], uuid)) - }) - - - for (var i=0;i $(BUILDDIR)/async.min.js - -test: - nodeunit test - -clean: - rm -rf $(BUILDDIR) - -lint: - nodelint --config nodelint.cfg lib/async.js - -.PHONY: test build all diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/README.md b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/README.md deleted file mode 100644 index 039d942..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/README.md +++ /dev/null @@ -1,970 +0,0 @@ -# Async.js - -Async is a utility module which provides straight-forward, powerful functions -for working with asynchronous JavaScript. Although originally designed for -use with [node.js](http://nodejs.org), it can also be used directly in the -browser. - -Async provides around 20 functions that include the usual 'functional' -suspects (map, reduce, filter, forEach…) as well as some common patterns -for asynchronous flow control (parallel, series, waterfall…). All these -functions assume you follow the node.js convention of providing a single -callback as the last argument of your async function. - - -## Quick Examples - - async.map(['file1','file2','file3'], fs.stat, function(err, results){ - // results is now an array of stats for each file - }); - - async.filter(['file1','file2','file3'], path.exists, function(results){ - // results now equals an array of the existing files - }); - - async.parallel([ - function(){ ... }, - function(){ ... } - ], callback); - - async.series([ - function(){ ... }, - function(){ ... } - ]); - -There are many more functions available so take a look at the docs below for a -full list. This module aims to be comprehensive, so if you feel anything is -missing please create a GitHub issue for it. - - -## Download - -Releases are available for download from -[GitHub](http://github.com/caolan/async/downloads). -Alternatively, you can install using Node Package Manager (npm): - - npm install async - - -__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 17.5kb Uncompressed - -__Production:__ [async.min.js](https://github.com/caolan/async/raw/master/dist/async.min.js) - 1.7kb Packed and Gzipped - - -## In the Browser - -So far its been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage: - - - - - -## Documentation - -### Collections - -* [forEach](#forEach) -* [map](#map) -* [filter](#filter) -* [reject](#reject) -* [reduce](#reduce) -* [detect](#detect) -* [sortBy](#sortBy) -* [some](#some) -* [every](#every) -* [concat](#concat) - -### Flow Control - -* [series](#series) -* [parallel](#parallel) -* [whilst](#whilst) -* [until](#until) -* [waterfall](#waterfall) -* [queue](#queue) -* [auto](#auto) -* [iterator](#iterator) -* [apply](#apply) -* [nextTick](#nextTick) - -### Utils - -* [memoize](#memoize) -* [log](#log) -* [dir](#dir) -* [noConflict](#noConflict) - - -## Collections - - -### forEach(arr, iterator, callback) - -Applies an iterator function to each item in an array, in parallel. -The iterator is called with an item from the list and a callback for when it -has finished. If the iterator passes an error to this callback, the main -callback for the forEach function is immediately called with the error. - -Note, that since this function applies the iterator to each item in parallel -there is no guarantee that the iterator functions will complete in order. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed. -* callback(err) - A callback which is called after all the iterator functions - have finished, or an error has occurred. - -__Example__ - - // assuming openFiles is an array of file names and saveFile is a function - // to save the modified contents of that file: - - async.forEach(openFiles, saveFile, function(err){ - // if any of the saves produced an error, err would equal that error - }); - ---------------------------------------- - - -### forEachSeries(arr, iterator, callback) - -The same as forEach only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. This means the iterator functions will complete in order. - - ---------------------------------------- - - -### map(arr, iterator, callback) - -Produces a new array of values by mapping each value in the given array through -the iterator function. The iterator is called with an item from the array and a -callback for when it has finished processing. The callback takes 2 arguments, -an error and the transformed item from the array. If the iterator passes an -error to this callback, the main callback for the map function is immediately -called with the error. - -Note, that since this function applies the iterator to each item in parallel -there is no guarantee that the iterator functions will complete in order, however -the results array will be in the same order as the original array. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed - with an error (which can be null) and a transformed item. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is an array of the - transformed items from the original array. - -__Example__ - - async.map(['file1','file2','file3'], fs.stat, function(err, results){ - // results is now an array of stats for each file - }); - ---------------------------------------- - - -### mapSeries(arr, iterator, callback) - -The same as map only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. The results array will be in the same order as the original. - - ---------------------------------------- - - -### filter(arr, iterator, callback) - -__Alias:__ select - -Returns a new array of all the values which pass an async truth test. -_The callback for each iterator call only accepts a single argument of true or -false, it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like path.exists. This operation is -performed in parallel, but the results array will be in the same order as the -original. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed. -* callback(results) - A callback which is called after all the iterator - functions have finished. - -__Example__ - - async.filter(['file1','file2','file3'], path.exists, function(results){ - // results now equals an array of the existing files - }); - ---------------------------------------- - - -### filterSeries(arr, iterator, callback) - -__alias:__ selectSeries - -The same as filter only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. The results array will be in the same order as the original. - ---------------------------------------- - - -### reject(arr, iterator, callback) - -The opposite of filter. Removes values that pass an async truth test. - ---------------------------------------- - - -### rejectSeries(arr, iterator, callback) - -The same as filter, only the iterator is applied to each item in the array -in series. - - ---------------------------------------- - - -### reduce(arr, memo, iterator, callback) - -__aliases:__ inject, foldl - -Reduces a list of values into a single value using an async iterator to return -each successive step. Memo is the initial state of the reduction. This -function only operates in series. For performance reasons, it may make sense to -split a call to this function into a parallel map, then use the normal -Array.prototype.reduce on the results. This function is for situations where -each step in the reduction needs to be async, if you can get the data before -reducing it then its probably a good idea to do so. - -__Arguments__ - -* arr - An array to iterate over. -* memo - The initial state of the reduction. -* iterator(memo, item, callback) - A function applied to each item in the - array to produce the next step in the reduction. The iterator is passed a - callback which accepts an optional error as its first argument, and the state - of the reduction as the second. If an error is passed to the callback, the - reduction is stopped and the main callback is immediately called with the - error. -* callback(err, result) - A callback which is called after all the iterator - functions have finished. Result is the reduced value. - -__Example__ - - async.reduce([1,2,3], 0, function(memo, item, callback){ - // pointless async: - process.nextTick(function(){ - callback(null, memo + item) - }); - }, function(err, result){ - // result is now equal to the last value of memo, which is 6 - }); - ---------------------------------------- - - -### reduceRight(arr, memo, iterator, callback) - -__Alias:__ foldr - -Same as reduce, only operates on the items in the array in reverse order. - - ---------------------------------------- - - -### detect(arr, iterator, callback) - -Returns the first value in a list that passes an async truth test. The -iterator is applied in parallel, meaning the first iterator to return true will -fire the detect callback with that result. That means the result might not be -the first item in the original array (in terms of order) that passes the test. - -If order within the original array is important then look at detectSeries. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed. -* callback(result) - A callback which is called as soon as any iterator returns - true, or after all the iterator functions have finished. Result will be - the first item in the array that passes the truth test (iterator) or the - value undefined if none passed. - -__Example__ - - async.detect(['file1','file2','file3'], path.exists, function(result){ - // result now equals the first file in the list that exists - }); - ---------------------------------------- - - -### detectSeries(arr, iterator, callback) - -The same as detect, only the iterator is applied to each item in the array -in series. This means the result is always the first in the original array (in -terms of array order) that passes the truth test. - - ---------------------------------------- - - -### sortBy(arr, iterator, callback) - -Sorts a list by the results of running each value through an async iterator. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed - with an error (which can be null) and a value to use as the sort criteria. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is the items from - the original array sorted by the values returned by the iterator calls. - -__Example__ - - async.sortBy(['file1','file2','file3'], function(file, callback){ - fs.stat(file, function(err, stats){ - callback(err, stats.mtime); - }); - }, function(err, results){ - // results is now the original array of files sorted by - // modified date - }); - - ---------------------------------------- - - -### some(arr, iterator, callback) - -__Alias:__ any - -Returns true if at least one element in the array satisfies an async test. -_The callback for each iterator call only accepts a single argument of true or -false, it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like path.exists. Once any iterator -call returns true, the main callback is immediately called. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed. -* callback(result) - A callback which is called as soon as any iterator returns - true, or after all the iterator functions have finished. Result will be - either true or false depending on the values of the async tests. - -__Example__ - - async.some(['file1','file2','file3'], path.exists, function(result){ - // if result is true then at least one of the files exists - }); - ---------------------------------------- - - -### every(arr, iterator, callback) - -__Alias:__ all - -Returns true if every element in the array satisfies an async test. -_The callback for each iterator call only accepts a single argument of true or -false, it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like path.exists. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed. -* callback(result) - A callback which is called after all the iterator - functions have finished. Result will be either true or false depending on - the values of the async tests. - -__Example__ - - async.every(['file1','file2','file3'], path.exists, function(result){ - // if result is true then every file exists - }); - ---------------------------------------- - - -### concat(arr, iterator, callback) - -Applies an iterator to each item in a list, concatenating the results. Returns the -concatenated list. The iterators are called in parallel, and the results are -concatenated as they return. There is no guarantee that the results array will -be returned in the original order of the arguments passed to the iterator function. - -__Arguments__ - -* arr - An array to iterate over -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed - with an error (which can be null) and an array of results. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is an array containing - the concatenated results of the iterator function. - -__Example__ - - async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){ - // files is now a list of filenames that exist in the 3 directories - }); - ---------------------------------------- - - -### concatSeries(arr, iterator, callback) - -Same as async.concat, but executes in series instead of parallel. - - -## Flow Control - - -### series(tasks, [callback]) - -Run an array of functions in series, each one running once the previous -function has completed. If any functions in the series pass an error to its -callback, no more functions are run and the callback for the series is -immediately called with the value of the error. Once the tasks have completed, -the results are passed to the final callback as an array. - -It is also possible to use an object instead of an array. Each property will be -run as a function and the results will be passed to the final callback as an object -instead of an array. This can be a more readable way of handling results from -async.series. - - -__Arguments__ - -* tasks - An array or object containing functions to run, each function is passed - a callback it must call on completion. -* callback(err, results) - An optional callback to run once all the functions - have completed. This function gets an array of all the arguments passed to - the callbacks used in the array. - -__Example__ - - async.series([ - function(callback){ - // do some stuff ... - callback(null, 'one'); - }, - function(callback){ - // do some more stuff ... - callback(null, 'two'); - }, - ], - // optional callback - function(err, results){ - // results is now equal to ['one', 'two'] - }); - - - // an example using an object instead of an array - async.series({ - one: function(callback){ - setTimeout(function(){ - callback(null, 1); - }, 200); - }, - two: function(callback){ - setTimeout(function(){ - callback(null, 2); - }, 100); - }, - }, - function(err, results) { - // results is now equals to: {one: 1, two: 2} - }); - - ---------------------------------------- - - -### parallel(tasks, [callback]) - -Run an array of functions in parallel, without waiting until the previous -function has completed. If any of the functions pass an error to its -callback, the main callback is immediately called with the value of the error. -Once the tasks have completed, the results are passed to the final callback as an -array. - -It is also possible to use an object instead of an array. Each property will be -run as a function and the results will be passed to the final callback as an object -instead of an array. This can be a more readable way of handling results from -async.parallel. - - -__Arguments__ - -* tasks - An array or object containing functions to run, each function is passed a - callback it must call on completion. -* callback(err, results) - An optional callback to run once all the functions - have completed. This function gets an array of all the arguments passed to - the callbacks used in the array. - -__Example__ - - async.parallel([ - function(callback){ - setTimeout(function(){ - callback(null, 'one'); - }, 200); - }, - function(callback){ - setTimeout(function(){ - callback(null, 'two'); - }, 100); - }, - ], - // optional callback - function(err, results){ - // in this case, the results array will equal ['two','one'] - // because the functions were run in parallel and the second - // function had a shorter timeout before calling the callback. - }); - - - // an example using an object instead of an array - async.parallel({ - one: function(callback){ - setTimeout(function(){ - callback(null, 1); - }, 200); - }, - two: function(callback){ - setTimeout(function(){ - callback(null, 2); - }, 100); - }, - }, - function(err, results) { - // results is now equals to: {one: 1, two: 2} - }); - - ---------------------------------------- - - -### whilst(test, fn, callback) - -Repeatedly call fn, while test returns true. Calls the callback when stopped, -or an error occurs. - -__Arguments__ - -* test() - synchronous truth test to perform before each execution of fn. -* fn(callback) - A function to call each time the test passes. The function is - passed a callback which must be called once it has completed with an optional - error as the first argument. -* callback(err) - A callback which is called after the test fails and repeated - execution of fn has stopped. - -__Example__ - - var count = 0; - - async.whilst( - function () { return count < 5; }, - function (callback) { - count++; - setTimeout(callback, 1000); - }, - function (err) { - // 5 seconds have passed - } - }); - - ---------------------------------------- - - -### until(test, fn, callback) - -Repeatedly call fn, until test returns true. Calls the callback when stopped, -or an error occurs. - -The inverse of async.whilst. - - ---------------------------------------- - - -### waterfall(tasks, [callback]) - -Runs an array of functions in series, each passing their results to the next in -the array. However, if any of the functions pass an error to the callback, the -next function is not executed and the main callback is immediately called with -the error. - -__Arguments__ - -* tasks - An array of functions to run, each function is passed a callback it - must call on completion. -* callback(err) - An optional callback to run once all the functions have - completed. This function gets passed any error that may have occurred. - -__Example__ - - async.waterfall([ - function(callback){ - callback(null, 'one', 'two'); - }, - function(arg1, arg2, callback){ - callback(null, 'three'); - }, - function(arg1, callback){ - // arg1 now equals 'three' - callback(null, 'done'); - } - ]); - - ---------------------------------------- - - -### queue(worker, concurrency) - -Creates a queue object with the specified concurrency. Tasks added to the -queue will be processed in parallel (up to the concurrency limit). If all -workers are in progress, the task is queued until one is available. Once -a worker has completed a task, the task's callback is called. - -__Arguments__ - -* worker(task, callback) - An asynchronous function for processing a queued - task. -* concurrency - An integer for determining how many worker functions should be - run in parallel. - -__Queue objects__ - -The queue object returned by this function has the following properties and -methods: - -* length() - a function returning the number of items waiting to be processed. -* concurrency - an integer for determining how many worker functions should be - run in parallel. This property can be changed after a queue is created to - alter the concurrency on-the-fly. -* push(task, [callback]) - add a new task to the queue, the callback is called - once the worker has finished processing the task. -* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued -* empty - a callback that is called when the last item from the queue is given to a worker -* drain - a callback that is called when the last item from the queue has returned from the worker - -__Example__ - - // create a queue object with concurrency 2 - - var q = async.queue(function (task, callback) { - console.log('hello ' + task.name). - callback(); - }, 2); - - - // assign a callback - q.drain = function() { - console.log('all items have been processed'); - } - - // add some items to the queue - - q.push({name: 'foo'}, function (err) { - console.log('finished processing foo'); - }); - q.push({name: 'bar'}, function (err) { - console.log('finished processing bar'); - }); - - ---------------------------------------- - - -### auto(tasks, [callback]) - -Determines the best order for running functions based on their requirements. -Each function can optionally depend on other functions being completed first, -and each function is run as soon as its requirements are satisfied. If any of -the functions pass and error to their callback, that function will not complete -(so any other functions depending on it will not run) and the main callback -will be called immediately with the error. - -__Arguments__ - -* tasks - An object literal containing named functions or an array of - requirements, with the function itself the last item in the array. The key - used for each function or array is used when specifying requirements. The - syntax is easier to understand by looking at the example. -* callback(err) - An optional callback which is called when all the tasks have - been completed. The callback may receive an error as an argument. - -__Example__ - - async.auto({ - get_data: function(callback){ - // async code to get some data - }, - make_folder: function(callback){ - // async code to create a directory to store a file in - // this is run at the same time as getting the data - }, - write_file: ['get_data', 'make_folder', function(callback){ - // once there is some data and the directory exists, - // write the data to a file in the directory - }], - email_link: ['write_file', function(callback){ - // once the file is written let's email a link to it... - }] - }); - -This is a fairly trivial example, but to do this using the basic parallel and -series functions would look like this: - - async.parallel([ - function(callback){ - // async code to get some data - }, - function(callback){ - // async code to create a directory to store a file in - // this is run at the same time as getting the data - } - ], - function(results){ - async.series([ - function(callback){ - // once there is some data and the directory exists, - // write the data to a file in the directory - }, - email_link: ['write_file', function(callback){ - // once the file is written let's email a link to it... - } - ]); - }); - -For a complicated series of async tasks using the auto function makes adding -new tasks much easier and makes the code more readable. - - ---------------------------------------- - - -### iterator(tasks) - -Creates an iterator function which calls the next function in the array, -returning a continuation to call the next one after that. Its also possible to -'peek' the next iterator by doing iterator.next(). - -This function is used internally by the async module but can be useful when -you want to manually control the flow of functions in series. - -__Arguments__ - -* tasks - An array of functions to run, each function is passed a callback it - must call on completion. - -__Example__ - - var iterator = async.iterator([ - function(){ sys.p('one'); }, - function(){ sys.p('two'); }, - function(){ sys.p('three'); } - ]); - - node> var iterator2 = iterator(); - 'one' - node> var iterator3 = iterator2(); - 'two' - node> iterator3(); - 'three' - node> var nextfn = iterator2.next(); - node> nextfn(); - 'three' - - ---------------------------------------- - - -### apply(function, arguments..) - -Creates a continuation function with some arguments already applied, a useful -shorthand when combined with other flow control functions. Any arguments -passed to the returned function are added to the arguments originally passed -to apply. - -__Arguments__ - -* function - The function you want to eventually apply all arguments to. -* arguments... - Any number of arguments to automatically apply when the - continuation is called. - -__Example__ - - // using apply - - async.parallel([ - async.apply(fs.writeFile, 'testfile1', 'test1'), - async.apply(fs.writeFile, 'testfile2', 'test2'), - ]); - - - // the same process without using apply - - async.parallel([ - function(callback){ - fs.writeFile('testfile1', 'test1', callback); - }, - function(callback){ - fs.writeFile('testfile2', 'test2', callback); - }, - ]); - -It's possible to pass any number of additional arguments when calling the -continuation: - - node> var fn = async.apply(sys.puts, 'one'); - node> fn('two', 'three'); - one - two - three - ---------------------------------------- - - -### nextTick(callback) - -Calls the callback on a later loop around the event loop. In node.js this just -calls process.nextTick, in the browser it falls back to setTimeout(callback, 0), -which means other higher priority events may precede the execution of the callback. - -This is used internally for browser-compatibility purposes. - -__Arguments__ - -* callback - The function to call on a later loop around the event loop. - -__Example__ - - var call_order = []; - async.nextTick(function(){ - call_order.push('two'); - // call_order now equals ['one','two] - }); - call_order.push('one') - - -## Utils - - -### memoize(fn, [hasher]) - -Caches the results of an async function. When creating a hash to store function -results against, the callback is omitted from the hash and an optional hash -function can be used. - -__Arguments__ - -* fn - the function you to proxy and cache results from. -* hasher - an optional function for generating a custom hash for storing - results, it has all the arguments applied to it apart from the callback, and - must be synchronous. - -__Example__ - - var slow_fn = function (name, callback) { - // do something - callback(null, result); - }; - var fn = async.memoize(slow_fn); - - // fn can now be used as if it were slow_fn - fn('some name', function () { - // callback - }); - - - -### log(function, arguments) - -Logs the result of an async function to the console. Only works in node.js or -in browsers that support console.log and console.error (such as FF and Chrome). -If multiple arguments are returned from the async function, console.log is -called on each argument in order. - -__Arguments__ - -* function - The function you want to eventually apply all arguments to. -* arguments... - Any number of arguments to apply to the function. - -__Example__ - - var hello = function(name, callback){ - setTimeout(function(){ - callback(null, 'hello ' + name); - }, 1000); - }; - - node> async.log(hello, 'world'); - 'hello world' - - ---------------------------------------- - - -### dir(function, arguments) - -Logs the result of an async function to the console using console.dir to -display the properties of the resulting object. Only works in node.js or -in browsers that support console.dir and console.error (such as FF and Chrome). -If multiple arguments are returned from the async function, console.dir is -called on each argument in order. - -__Arguments__ - -* function - The function you want to eventually apply all arguments to. -* arguments... - Any number of arguments to apply to the function. - -__Example__ - - var hello = function(name, callback){ - setTimeout(function(){ - callback(null, {hello: name}); - }, 1000); - }; - - node> async.dir(hello, 'world'); - {hello: 'world'} - - ---------------------------------------- - - -### noConflict() - -Changes the value of async back to its original value, returning a reference to the -async object. diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/async.min.js.gzip b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/async.min.js.gzip deleted file mode 100644 index e1c32944465c634d9b609622b37972d1ae8e6e7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1859 zcmV-J2fX+niwFpUH4aSx17UM{ZeuQOX>KlRa{$d)OOx9+4E`&dJ!r^8tJqh0RZrV# zZ=H17-aJ0=C0o0)cwe{Z%@F7vMl6BIVG?Up_q$mIcJ^&y2_Vq3=Im_>A)%=wm zRM|H1UCQ!Wg?FMX>M~b$eE0e-N!vm+Sy>Qze$T2qmYlm4KJcX3XLTqN91Adg8<}0$l>2$&!4KwRQ*L(Nw8`Hdo+t}rs${2EMTi7(9>F{v~n`LU|lDFTN#B?dOCp(dzEuskQM+O-E&H1&YCh#iml zi4<*~hnwCB+XzaUU=84sc1HQrH&bpRFk`~=Br2gaYEw)$o?wcPlg8*d>nw?R_@3ph zidomukX@}6kY9SiFs~J)8=Gd^M21i(G+KPvYdq>e>9Uq&(6B4SC&a#o&2hWH4BYlSH>uKEi9n30?Sh3G;4_GGWRFU!ynmh-%Jfljc<1oxAviD z9fi-|tEvWkuKFswvmbX>U6qWq=s4!zI*u?K1gWXCjDq84f~ZIu)zDYToN8BUAGrAi z&2ug>iaTo2kY;(KDgZ=|@i(I$6MC*zxe1YZ+0WQjdNQmxpO8dx`vc8$c5a0wPIM zwTgyv+zsYEtcj(~YgU{RV*v~>15f|OlFNlS@wb_xt+tlrSWUDE+9y@>)0{1u?0q&W zx}>eKxHYTMX-r6? zwy5`6+7QRR$DGWuLJky#KW2^?6i&BCUlFOG+;n>*Rwk&T*a5&i(op1bd=j0*-G$r$dt<7}^7< zmYYGtmh9+CL8_f6<%^zSDb$2#tS-|pw0jF6K^kEn7{E5g%<~h?5L7-xP~q%113&p$ zHm9^WMFsp#*y><@dK1}0G?}n*P5!~6-P*PjiJOblK2pPZ!AH}GC2FG8VRk}S0Y|U~ z0M02T+BZj5fpRr<&9w_)cO3a;4Y3j+0+6aVL+6VXM3@mDcDIvV+`mhL$7BgH25UBp zEkM?+)Z2nGce&X7=u zTF5y4G*cIc%Z7&~w(vJg8l$wXm(f3QvM^l|RnC}wtKY6qpM5*_cEjBX@}@&+f66RB z!LW5Jet}+UP(U2}vnzHKI(t&XW23Ts)2s%*Sz-}1qn>Z-xexm+ucv1;ykwwjL9Xg{ zPlyzr%*?m;6X=c76w9_~vV2w|EQnu}sz2|AqQJjf)v8G;7+;Ur?wTfN++$l+st~7G zgxCP$@rSm5pCxM;99uA0oQdaHbmKk|*_$P>z&^zuEWmF0m`0wqAaF_NZf2EZJ_~>r zB;ZQl#z4p-)E#=#D%V_ph{y=}x~tWg_Zqt;o}^@)-iC>}>SGDSWA z(uz3hq{3lz^YsGl#i70ap59&)zP4{7RaIpb1fwCSi|qsyydW6SLQJgwoi2p5+v*gB zVpHytBe{p4dwo31DjdR(9v;-8%>J3)K%0F*Q6IB$|2ku)su=X%cBf?!E~8_4wAX@Z xGIF@2s}wJS#afNxut~Qx9u+Qm9U5>4tV;&(tNFTZoYVmy`WKn%6PvIY007E|gZuyh diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.css b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.css deleted file mode 100644 index 274434a..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.css +++ /dev/null @@ -1,70 +0,0 @@ -/*! - * Styles taken from qunit.css - */ - -h1#nodeunit-header, h1.nodeunit-header { - padding: 15px; - font-size: large; - background-color: #06b; - color: white; - font-family: 'trebuchet ms', verdana, arial; - margin: 0; -} - -h1#nodeunit-header a { - color: white; -} - -h2#nodeunit-banner { - height: 2em; - border-bottom: 1px solid white; - background-color: #eee; - margin: 0; - font-family: 'trebuchet ms', verdana, arial; -} -h2#nodeunit-banner.pass { - background-color: green; -} -h2#nodeunit-banner.fail { - background-color: red; -} - -h2#nodeunit-userAgent, h2.nodeunit-userAgent { - padding: 10px; - background-color: #eee; - color: black; - margin: 0; - font-size: small; - font-weight: normal; - font-family: 'trebuchet ms', verdana, arial; - font-size: 10pt; -} - -div#nodeunit-testrunner-toolbar { - background: #eee; - border-top: 1px solid black; - padding: 10px; - font-family: 'trebuchet ms', verdana, arial; - margin: 0; - font-size: 10pt; -} - -ol#nodeunit-tests { - font-family: 'trebuchet ms', verdana, arial; - font-size: 10pt; -} -ol#nodeunit-tests li strong { - cursor:pointer; -} -ol#nodeunit-tests .pass { - color: green; -} -ol#nodeunit-tests .fail { - color: red; -} - -p#nodeunit-testresult { - margin-left: 1em; - font-size: 10pt; - font-family: 'trebuchet ms', verdana, arial; -} diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.js deleted file mode 100644 index 5957184..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.js +++ /dev/null @@ -1,1966 +0,0 @@ -/*! - * Nodeunit - * https://github.com/caolan/nodeunit - * Copyright (c) 2010 Caolan McMahon - * MIT Licensed - * - * json2.js - * http://www.JSON.org/json2.js - * Public Domain. - * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. - */ -nodeunit = (function(){ -/* - http://www.JSON.org/json2.js - 2010-11-17 - - Public Domain. - - NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. - - See http://www.JSON.org/js.html - - - This code should be minified before deployment. - See http://javascript.crockford.com/jsmin.html - - USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO - NOT CONTROL. - - - This file creates a global JSON object containing two methods: stringify - and parse. - - JSON.stringify(value, replacer, space) - value any JavaScript value, usually an object or array. - - replacer an optional parameter that determines how object - values are stringified for objects. It can be a - function or an array of strings. - - space an optional parameter that specifies the indentation - of nested structures. If it is omitted, the text will - be packed without extra whitespace. If it is a number, - it will specify the number of spaces to indent at each - level. If it is a string (such as '\t' or ' '), - it contains the characters used to indent at each level. - - This method produces a JSON text from a JavaScript value. - - When an object value is found, if the object contains a toJSON - method, its toJSON method will be called and the result will be - stringified. A toJSON method does not serialize: it returns the - value represented by the name/value pair that should be serialized, - or undefined if nothing should be serialized. The toJSON method - will be passed the key associated with the value, and this will be - bound to the value - - For example, this would serialize Dates as ISO strings. - - Date.prototype.toJSON = function (key) { - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - return this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z'; - }; - - You can provide an optional replacer method. It will be passed the - key and value of each member, with this bound to the containing - object. The value that is returned from your method will be - serialized. If your method returns undefined, then the member will - be excluded from the serialization. - - If the replacer parameter is an array of strings, then it will be - used to select the members to be serialized. It filters the results - such that only members with keys listed in the replacer array are - stringified. - - Values that do not have JSON representations, such as undefined or - functions, will not be serialized. Such values in objects will be - dropped; in arrays they will be replaced with null. You can use - a replacer function to replace those with JSON values. - JSON.stringify(undefined) returns undefined. - - The optional space parameter produces a stringification of the - value that is filled with line breaks and indentation to make it - easier to read. - - If the space parameter is a non-empty string, then that string will - be used for indentation. If the space parameter is a number, then - the indentation will be that many spaces. - - Example: - - text = JSON.stringify(['e', {pluribus: 'unum'}]); - // text is '["e",{"pluribus":"unum"}]' - - - text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); - // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' - - text = JSON.stringify([new Date()], function (key, value) { - return this[key] instanceof Date ? - 'Date(' + this[key] + ')' : value; - }); - // text is '["Date(---current time---)"]' - - - JSON.parse(text, reviver) - This method parses a JSON text to produce an object or array. - It can throw a SyntaxError exception. - - The optional reviver parameter is a function that can filter and - transform the results. It receives each of the keys and values, - and its return value is used instead of the original value. - If it returns what it received, then the structure is not modified. - If it returns undefined then the member is deleted. - - Example: - - // Parse the text. Values that look like ISO date strings will - // be converted to Date objects. - - myData = JSON.parse(text, function (key, value) { - var a; - if (typeof value === 'string') { - a = -/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); - if (a) { - return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], - +a[5], +a[6])); - } - } - return value; - }); - - myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { - var d; - if (typeof value === 'string' && - value.slice(0, 5) === 'Date(' && - value.slice(-1) === ')') { - d = new Date(value.slice(5, -1)); - if (d) { - return d; - } - } - return value; - }); - - - This is a reference implementation. You are free to copy, modify, or - redistribute. -*/ - -/*jslint evil: true, strict: false, regexp: false */ - -/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, - call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, - getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, - lastIndex, length, parse, prototype, push, replace, slice, stringify, - test, toJSON, toString, valueOf -*/ - - -// Create a JSON object only if one does not already exist. We create the -// methods in a closure to avoid creating global variables. - -if (!this.JSON) { - this.JSON = {}; -} - -(function () { - "use strict"; - - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - if (typeof Date.prototype.toJSON !== 'function') { - - Date.prototype.toJSON = function (key) { - - return isFinite(this.valueOf()) ? - this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z' : null; - }; - - String.prototype.toJSON = - Number.prototype.toJSON = - Boolean.prototype.toJSON = function (key) { - return this.valueOf(); - }; - } - - var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - gap, - indent, - meta = { // table of character substitutions - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '"' : '\\"', - '\\': '\\\\' - }, - rep; - - - function quote(string) { - -// If the string contains no control characters, no quote characters, and no -// backslash characters, then we can safely slap some quotes around it. -// Otherwise we must also replace the offending characters with safe escape -// sequences. - - escapable.lastIndex = 0; - return escapable.test(string) ? - '"' + string.replace(escapable, function (a) { - var c = meta[a]; - return typeof c === 'string' ? c : - '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }) + '"' : - '"' + string + '"'; - } - - - function str(key, holder) { - -// Produce a string from holder[key]. - - var i, // The loop counter. - k, // The member key. - v, // The member value. - length, - mind = gap, - partial, - value = holder[key]; - -// If the value has a toJSON method, call it to obtain a replacement value. - - if (value && typeof value === 'object' && - typeof value.toJSON === 'function') { - value = value.toJSON(key); - } - -// If we were called with a replacer function, then call the replacer to -// obtain a replacement value. - - if (typeof rep === 'function') { - value = rep.call(holder, key, value); - } - -// What happens next depends on the value's type. - - switch (typeof value) { - case 'string': - return quote(value); - - case 'number': - -// JSON numbers must be finite. Encode non-finite numbers as null. - - return isFinite(value) ? String(value) : 'null'; - - case 'boolean': - case 'null': - -// If the value is a boolean or null, convert it to a string. Note: -// typeof null does not produce 'null'. The case is included here in -// the remote chance that this gets fixed someday. - - return String(value); - -// If the type is 'object', we might be dealing with an object or an array or -// null. - - case 'object': - -// Due to a specification blunder in ECMAScript, typeof null is 'object', -// so watch out for that case. - - if (!value) { - return 'null'; - } - -// Make an array to hold the partial results of stringifying this object value. - - gap += indent; - partial = []; - -// Is the value an array? - - if (Object.prototype.toString.apply(value) === '[object Array]') { - -// The value is an array. Stringify every element. Use null as a placeholder -// for non-JSON values. - - length = value.length; - for (i = 0; i < length; i += 1) { - partial[i] = str(i, value) || 'null'; - } - -// Join all of the elements together, separated with commas, and wrap them in -// brackets. - - v = partial.length === 0 ? '[]' : - gap ? '[\n' + gap + - partial.join(',\n' + gap) + '\n' + - mind + ']' : - '[' + partial.join(',') + ']'; - gap = mind; - return v; - } - -// If the replacer is an array, use it to select the members to be stringified. - - if (rep && typeof rep === 'object') { - length = rep.length; - for (i = 0; i < length; i += 1) { - k = rep[i]; - if (typeof k === 'string') { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } else { - -// Otherwise, iterate through all of the keys in the object. - - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } - -// Join all of the member texts together, separated with commas, -// and wrap them in braces. - - v = partial.length === 0 ? '{}' : - gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + - mind + '}' : '{' + partial.join(',') + '}'; - gap = mind; - return v; - } - } - -// If the JSON object does not yet have a stringify method, give it one. - - if (typeof JSON.stringify !== 'function') { - JSON.stringify = function (value, replacer, space) { - -// The stringify method takes a value and an optional replacer, and an optional -// space parameter, and returns a JSON text. The replacer can be a function -// that can replace values, or an array of strings that will select the keys. -// A default replacer method can be provided. Use of the space parameter can -// produce text that is more easily readable. - - var i; - gap = ''; - indent = ''; - -// If the space parameter is a number, make an indent string containing that -// many spaces. - - if (typeof space === 'number') { - for (i = 0; i < space; i += 1) { - indent += ' '; - } - -// If the space parameter is a string, it will be used as the indent string. - - } else if (typeof space === 'string') { - indent = space; - } - -// If there is a replacer, it must be a function or an array. -// Otherwise, throw an error. - - rep = replacer; - if (replacer && typeof replacer !== 'function' && - (typeof replacer !== 'object' || - typeof replacer.length !== 'number')) { - throw new Error('JSON.stringify'); - } - -// Make a fake root object containing our value under the key of ''. -// Return the result of stringifying the value. - - return str('', {'': value}); - }; - } - - -// If the JSON object does not yet have a parse method, give it one. - - if (typeof JSON.parse !== 'function') { - JSON.parse = function (text, reviver) { - -// The parse method takes a text and an optional reviver function, and returns -// a JavaScript value if the text is a valid JSON text. - - var j; - - function walk(holder, key) { - -// The walk method is used to recursively walk the resulting structure so -// that modifications can be made. - - var k, v, value = holder[key]; - if (value && typeof value === 'object') { - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = walk(value, k); - if (v !== undefined) { - value[k] = v; - } else { - delete value[k]; - } - } - } - } - return reviver.call(holder, key, value); - } - - -// Parsing happens in four stages. In the first stage, we replace certain -// Unicode characters with escape sequences. JavaScript handles many characters -// incorrectly, either silently deleting them, or treating them as line endings. - - text = String(text); - cx.lastIndex = 0; - if (cx.test(text)) { - text = text.replace(cx, function (a) { - return '\\u' + - ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }); - } - -// In the second stage, we run the text against regular expressions that look -// for non-JSON patterns. We are especially concerned with '()' and 'new' -// because they can cause invocation, and '=' because it can cause mutation. -// But just to be safe, we want to reject all unexpected forms. - -// We split the second stage into 4 regexp operations in order to work around -// crippling inefficiencies in IE's and Safari's regexp engines. First we -// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we -// replace all simple value tokens with ']' characters. Third, we delete all -// open brackets that follow a colon or comma or that begin the text. Finally, -// we look to see that the remaining characters are only whitespace or ']' or -// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. - - if (/^[\],:{}\s]*$/ -.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') -.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') -.replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { - -// In the third stage we use the eval function to compile the text into a -// JavaScript structure. The '{' operator is subject to a syntactic ambiguity -// in JavaScript: it can begin a block or an object literal. We wrap the text -// in parens to eliminate the ambiguity. - - j = eval('(' + text + ')'); - -// In the optional fourth stage, we recursively walk the new structure, passing -// each name/value pair to a reviver function for possible transformation. - - return typeof reviver === 'function' ? - walk({'': j}, '') : j; - } - -// If the text is not JSON parseable, then a SyntaxError is thrown. - - throw new SyntaxError('JSON.parse'); - }; - } -}()); -var assert = this.assert = {}; -var types = {}; -var core = {}; -var nodeunit = {}; -var reporter = {}; -/*global setTimeout: false, console: false */ -(function () { - - var async = {}; - - // global on the server, window in the browser - var root = this, - previous_async = root.async; - - if (typeof module !== 'undefined' && module.exports) { - module.exports = async; - } - else { - root.async = async; - } - - async.noConflict = function () { - root.async = previous_async; - return async; - }; - - //// cross-browser compatiblity functions //// - - var _forEach = function (arr, iterator) { - if (arr.forEach) { - return arr.forEach(iterator); - } - for (var i = 0; i < arr.length; i += 1) { - iterator(arr[i], i, arr); - } - }; - - var _map = function (arr, iterator) { - if (arr.map) { - return arr.map(iterator); - } - var results = []; - _forEach(arr, function (x, i, a) { - results.push(iterator(x, i, a)); - }); - return results; - }; - - var _reduce = function (arr, iterator, memo) { - if (arr.reduce) { - return arr.reduce(iterator, memo); - } - _forEach(arr, function (x, i, a) { - memo = iterator(memo, x, i, a); - }); - return memo; - }; - - var _keys = function (obj) { - if (Object.keys) { - return Object.keys(obj); - } - var keys = []; - for (var k in obj) { - if (obj.hasOwnProperty(k)) { - keys.push(k); - } - } - return keys; - }; - - var _indexOf = function (arr, item) { - if (arr.indexOf) { - return arr.indexOf(item); - } - for (var i = 0; i < arr.length; i += 1) { - if (arr[i] === item) { - return i; - } - } - return -1; - }; - - //// exported async module functions //// - - //// nextTick implementation with browser-compatible fallback //// - async.nextTick = function (fn) { - if (typeof process === 'undefined' || !(process.nextTick)) { - setTimeout(fn, 0); - } - else { - process.nextTick(fn); - } - }; - - async.forEach = function (arr, iterator, callback) { - if (!arr.length) { - return callback(); - } - var completed = 0; - _forEach(arr, function (x) { - iterator(x, function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - if (completed === arr.length) { - callback(); - } - } - }); - }); - }; - - async.forEachSeries = function (arr, iterator, callback) { - if (!arr.length) { - return callback(); - } - var completed = 0; - var iterate = function () { - iterator(arr[completed], function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - if (completed === arr.length) { - callback(); - } - else { - iterate(); - } - } - }); - }; - iterate(); - }; - - - var doParallel = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [async.forEach].concat(args)); - }; - }; - var doSeries = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [async.forEachSeries].concat(args)); - }; - }; - - - var _asyncMap = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (err, v) { - results[x.index] = v; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - }; - async.map = doParallel(_asyncMap); - async.mapSeries = doSeries(_asyncMap); - - - // reduce only has a series version, as doing reduce in parallel won't - // work in many situations. - async.reduce = function (arr, memo, iterator, callback) { - async.forEachSeries(arr, function (x, callback) { - iterator(memo, x, function (err, v) { - memo = v; - callback(err); - }); - }, function (err) { - callback(err, memo); - }); - }; - // inject alias - async.inject = async.reduce; - // foldl alias - async.foldl = async.reduce; - - async.reduceRight = function (arr, memo, iterator, callback) { - var reversed = _map(arr, function (x) { - return x; - }).reverse(); - async.reduce(reversed, memo, iterator, callback); - }; - // foldr alias - async.foldr = async.reduceRight; - - var _filter = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (v) { - if (v) { - results.push(x); - } - callback(); - }); - }, function (err) { - callback(_map(results.sort(function (a, b) { - return a.index - b.index; - }), function (x) { - return x.value; - })); - }); - }; - async.filter = doParallel(_filter); - async.filterSeries = doSeries(_filter); - // select alias - async.select = async.filter; - async.selectSeries = async.filterSeries; - - var _reject = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (v) { - if (!v) { - results.push(x); - } - callback(); - }); - }, function (err) { - callback(_map(results.sort(function (a, b) { - return a.index - b.index; - }), function (x) { - return x.value; - })); - }); - }; - async.reject = doParallel(_reject); - async.rejectSeries = doSeries(_reject); - - var _detect = function (eachfn, arr, iterator, main_callback) { - eachfn(arr, function (x, callback) { - iterator(x, function (result) { - if (result) { - main_callback(x); - } - else { - callback(); - } - }); - }, function (err) { - main_callback(); - }); - }; - async.detect = doParallel(_detect); - async.detectSeries = doSeries(_detect); - - async.some = function (arr, iterator, main_callback) { - async.forEach(arr, function (x, callback) { - iterator(x, function (v) { - if (v) { - main_callback(true); - main_callback = function () {}; - } - callback(); - }); - }, function (err) { - main_callback(false); - }); - }; - // any alias - async.any = async.some; - - async.every = function (arr, iterator, main_callback) { - async.forEach(arr, function (x, callback) { - iterator(x, function (v) { - if (!v) { - main_callback(false); - main_callback = function () {}; - } - callback(); - }); - }, function (err) { - main_callback(true); - }); - }; - // all alias - async.all = async.every; - - async.sortBy = function (arr, iterator, callback) { - async.map(arr, function (x, callback) { - iterator(x, function (err, criteria) { - if (err) { - callback(err); - } - else { - callback(null, {value: x, criteria: criteria}); - } - }); - }, function (err, results) { - if (err) { - return callback(err); - } - else { - var fn = function (left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }; - callback(null, _map(results.sort(fn), function (x) { - return x.value; - })); - } - }); - }; - - async.auto = function (tasks, callback) { - callback = callback || function () {}; - var keys = _keys(tasks); - if (!keys.length) { - return callback(null); - } - - var completed = []; - - var listeners = []; - var addListener = function (fn) { - listeners.unshift(fn); - }; - var removeListener = function (fn) { - for (var i = 0; i < listeners.length; i += 1) { - if (listeners[i] === fn) { - listeners.splice(i, 1); - return; - } - } - }; - var taskComplete = function () { - _forEach(listeners, function (fn) { - fn(); - }); - }; - - addListener(function () { - if (completed.length === keys.length) { - callback(null); - } - }); - - _forEach(keys, function (k) { - var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k]; - var taskCallback = function (err) { - if (err) { - callback(err); - // stop subsequent errors hitting callback multiple times - callback = function () {}; - } - else { - completed.push(k); - taskComplete(); - } - }; - var requires = task.slice(0, Math.abs(task.length - 1)) || []; - var ready = function () { - return _reduce(requires, function (a, x) { - return (a && _indexOf(completed, x) !== -1); - }, true); - }; - if (ready()) { - task[task.length - 1](taskCallback); - } - else { - var listener = function () { - if (ready()) { - removeListener(listener); - task[task.length - 1](taskCallback); - } - }; - addListener(listener); - } - }); - }; - - async.waterfall = function (tasks, callback) { - if (!tasks.length) { - return callback(); - } - callback = callback || function () {}; - var wrapIterator = function (iterator) { - return function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - var args = Array.prototype.slice.call(arguments, 1); - var next = iterator.next(); - if (next) { - args.push(wrapIterator(next)); - } - else { - args.push(callback); - } - async.nextTick(function () { - iterator.apply(null, args); - }); - } - }; - }; - wrapIterator(async.iterator(tasks))(); - }; - - async.parallel = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - async.map(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args || null); - }); - } - }, callback); - } - else { - var results = {}; - async.forEach(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.series = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - async.mapSeries(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args || null); - }); - } - }, callback); - } - else { - var results = {}; - async.forEachSeries(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.iterator = function (tasks) { - var makeCallback = function (index) { - var fn = function () { - if (tasks.length) { - tasks[index].apply(null, arguments); - } - return fn.next(); - }; - fn.next = function () { - return (index < tasks.length - 1) ? makeCallback(index + 1): null; - }; - return fn; - }; - return makeCallback(0); - }; - - async.apply = function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - return function () { - return fn.apply( - null, args.concat(Array.prototype.slice.call(arguments)) - ); - }; - }; - - var _concat = function (eachfn, arr, fn, callback) { - var r = []; - eachfn(arr, function (x, cb) { - fn(x, function (err, y) { - r = r.concat(y || []); - cb(err); - }); - }, function (err) { - callback(err, r); - }); - }; - async.concat = doParallel(_concat); - async.concatSeries = doSeries(_concat); - - async.whilst = function (test, iterator, callback) { - if (test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.whilst(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.until = function (test, iterator, callback) { - if (!test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.until(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.queue = function (worker, concurrency) { - var workers = 0; - var tasks = []; - var q = { - concurrency: concurrency, - push: function (data, callback) { - tasks.push({data: data, callback: callback}); - async.nextTick(q.process); - }, - process: function () { - if (workers < q.concurrency && tasks.length) { - var task = tasks.splice(0, 1)[0]; - workers += 1; - worker(task.data, function () { - workers -= 1; - if (task.callback) { - task.callback.apply(task, arguments); - } - q.process(); - }); - } - }, - length: function () { - return tasks.length; - } - }; - return q; - }; - - var _console_fn = function (name) { - return function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - fn.apply(null, args.concat([function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (typeof console !== 'undefined') { - if (err) { - if (console.error) { - console.error(err); - } - } - else if (console[name]) { - _forEach(args, function (x) { - console[name](x); - }); - } - } - }])); - }; - }; - async.log = _console_fn('log'); - async.dir = _console_fn('dir'); - /*async.info = _console_fn('info'); - async.warn = _console_fn('warn'); - async.error = _console_fn('error');*/ - -}()); -(function(exports){ -/** - * This file is based on the node.js assert module, but with some small - * changes for browser-compatibility - * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! - */ - - -/** - * Added for browser compatibility - */ - -var _keys = function(obj){ - if(Object.keys) return Object.keys(obj); - var keys = []; - for(var k in obj){ - if(obj.hasOwnProperty(k)) keys.push(k); - } - return keys; -}; - - - -// http://wiki.commonjs.org/wiki/Unit_Testing/1.0 -// -// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! -// -// Originally from narwhal.js (http://narwhaljs.org) -// Copyright (c) 2009 Thomas Robinson <280north.com> -// -// 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 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. - - -var pSlice = Array.prototype.slice; - -// 1. The assert module provides functions that throw -// AssertionError's when particular conditions are not met. The -// assert module must conform to the following interface. - -var assert = exports; - -// 2. The AssertionError is defined in assert. -// new assert.AssertionError({message: message, actual: actual, expected: expected}) - -assert.AssertionError = function AssertionError (options) { - this.name = "AssertionError"; - this.message = options.message; - this.actual = options.actual; - this.expected = options.expected; - this.operator = options.operator; - var stackStartFunction = options.stackStartFunction || fail; - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, stackStartFunction); - } -}; -// code from util.inherits in node -assert.AssertionError.super_ = Error; - - -// EDITED FOR BROWSER COMPATIBILITY: replaced Object.create call -// TODO: test what effect this may have -var ctor = function () { this.constructor = assert.AssertionError; }; -ctor.prototype = Error.prototype; -assert.AssertionError.prototype = new ctor(); - - -assert.AssertionError.prototype.toString = function() { - if (this.message) { - return [this.name+":", this.message].join(' '); - } else { - return [ this.name+":" - , JSON.stringify(this.expected ) - , this.operator - , JSON.stringify(this.actual) - ].join(" "); - } -}; - -// assert.AssertionError instanceof Error - -assert.AssertionError.__proto__ = Error.prototype; - -// At present only the three keys mentioned above are used and -// understood by the spec. Implementations or sub modules can pass -// other keys to the AssertionError's constructor - they will be -// ignored. - -// 3. All of the following functions must throw an AssertionError -// when a corresponding condition is not met, with a message that -// may be undefined if not provided. All assertion methods provide -// both the actual and expected values to the assertion error for -// display purposes. - -function fail(actual, expected, message, operator, stackStartFunction) { - throw new assert.AssertionError({ - message: message, - actual: actual, - expected: expected, - operator: operator, - stackStartFunction: stackStartFunction - }); -} - -// EXTENSION! allows for well behaved errors defined elsewhere. -assert.fail = fail; - -// 4. Pure assertion tests whether a value is truthy, as determined -// by !!guard. -// assert.ok(guard, message_opt); -// This statement is equivalent to assert.equal(true, guard, -// message_opt);. To test strictly for the value true, use -// assert.strictEqual(true, guard, message_opt);. - -assert.ok = function ok(value, message) { - if (!!!value) fail(value, true, message, "==", assert.ok); -}; - -// 5. The equality assertion tests shallow, coercive equality with -// ==. -// assert.equal(actual, expected, message_opt); - -assert.equal = function equal(actual, expected, message) { - if (actual != expected) fail(actual, expected, message, "==", assert.equal); -}; - -// 6. The non-equality assertion tests for whether two objects are not equal -// with != assert.notEqual(actual, expected, message_opt); - -assert.notEqual = function notEqual(actual, expected, message) { - if (actual == expected) { - fail(actual, expected, message, "!=", assert.notEqual); - } -}; - -// 7. The equivalence assertion tests a deep equality relation. -// assert.deepEqual(actual, expected, message_opt); - -assert.deepEqual = function deepEqual(actual, expected, message) { - if (!_deepEqual(actual, expected)) { - fail(actual, expected, message, "deepEqual", assert.deepEqual); - } -}; - -function _deepEqual(actual, expected) { - // 7.1. All identical values are equivalent, as determined by ===. - if (actual === expected) { - return true; - // 7.2. If the expected value is a Date object, the actual value is - // equivalent if it is also a Date object that refers to the same time. - } else if (actual instanceof Date && expected instanceof Date) { - return actual.getTime() === expected.getTime(); - - // 7.3. Other pairs that do not both pass typeof value == "object", - // equivalence is determined by ==. - } else if (typeof actual != 'object' && typeof expected != 'object') { - return actual == expected; - - // 7.4. For all other Object pairs, including Array objects, equivalence is - // determined by having the same number of owned properties (as verified - // with Object.prototype.hasOwnProperty.call), the same set of keys - // (although not necessarily the same order), equivalent values for every - // corresponding key, and an identical "prototype" property. Note: this - // accounts for both named and indexed properties on Arrays. - } else { - return objEquiv(actual, expected); - } -} - -function isUndefinedOrNull (value) { - return value === null || value === undefined; -} - -function isArguments (object) { - return Object.prototype.toString.call(object) == '[object Arguments]'; -} - -function objEquiv (a, b) { - if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) - return false; - // an identical "prototype" property. - if (a.prototype !== b.prototype) return false; - //~~~I've managed to break Object.keys through screwy arguments passing. - // Converting to array solves the problem. - if (isArguments(a)) { - if (!isArguments(b)) { - return false; - } - a = pSlice.call(a); - b = pSlice.call(b); - return _deepEqual(a, b); - } - try{ - var ka = _keys(a), - kb = _keys(b), - key, i; - } catch (e) {//happens when one is a string literal and the other isn't - return false; - } - // having the same number of owned properties (keys incorporates hasOwnProperty) - if (ka.length != kb.length) - return false; - //the same set of keys (although not necessarily the same order), - ka.sort(); - kb.sort(); - //~~~cheap key test - for (i = ka.length - 1; i >= 0; i--) { - if (ka[i] != kb[i]) - return false; - } - //equivalent values for every corresponding key, and - //~~~possibly expensive deep test - for (i = ka.length - 1; i >= 0; i--) { - key = ka[i]; - if (!_deepEqual(a[key], b[key] )) - return false; - } - return true; -} - -// 8. The non-equivalence assertion tests for any deep inequality. -// assert.notDeepEqual(actual, expected, message_opt); - -assert.notDeepEqual = function notDeepEqual(actual, expected, message) { - if (_deepEqual(actual, expected)) { - fail(actual, expected, message, "notDeepEqual", assert.notDeepEqual); - } -}; - -// 9. The strict equality assertion tests strict equality, as determined by ===. -// assert.strictEqual(actual, expected, message_opt); - -assert.strictEqual = function strictEqual(actual, expected, message) { - if (actual !== expected) { - fail(actual, expected, message, "===", assert.strictEqual); - } -}; - -// 10. The strict non-equality assertion tests for strict inequality, as determined by !==. -// assert.notStrictEqual(actual, expected, message_opt); - -assert.notStrictEqual = function notStrictEqual(actual, expected, message) { - if (actual === expected) { - fail(actual, expected, message, "!==", assert.notStrictEqual); - } -}; - -function _throws (shouldThrow, block, err, message) { - var exception = null, - threw = false, - typematters = true; - - message = message || ""; - - //handle optional arguments - if (arguments.length == 3) { - if (typeof(err) == "string") { - message = err; - typematters = false; - } - } else if (arguments.length == 2) { - typematters = false; - } - - try { - block(); - } catch (e) { - threw = true; - exception = e; - } - - if (shouldThrow && !threw) { - fail( "Missing expected exception" - + (err && err.name ? " ("+err.name+")." : '.') - + (message ? " " + message : "") - ); - } - if (!shouldThrow && threw && typematters && exception instanceof err) { - fail( "Got unwanted exception" - + (err && err.name ? " ("+err.name+")." : '.') - + (message ? " " + message : "") - ); - } - if ((shouldThrow && threw && typematters && !(exception instanceof err)) || - (!shouldThrow && threw)) { - throw exception; - } -}; - -// 11. Expected to throw an error: -// assert.throws(block, Error_opt, message_opt); - -assert.throws = function(block, /*optional*/error, /*optional*/message) { - _throws.apply(this, [true].concat(pSlice.call(arguments))); -}; - -// EXTENSION! This is annoying to write outside this module. -assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) { - _throws.apply(this, [false].concat(pSlice.call(arguments))); -}; - -assert.ifError = function (err) { if (err) {throw err;}}; -})(assert); -(function(exports){ -/*! - * Nodeunit - * Copyright (c) 2010 Caolan McMahon - * MIT Licensed - * - * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! - * Only code on that line will be removed, its mostly to avoid requiring code - * that is node specific - */ - -/** - * Module dependencies - */ - - - -/** - * Creates assertion objects representing the result of an assert call. - * Accepts an object or AssertionError as its argument. - * - * @param {object} obj - * @api public - */ - -exports.assertion = function (obj) { - return { - method: obj.method || '', - message: obj.message || (obj.error && obj.error.message) || '', - error: obj.error, - passed: function () { - return !this.error; - }, - failed: function () { - return Boolean(this.error); - } - }; -}; - -/** - * Creates an assertion list object representing a group of assertions. - * Accepts an array of assertion objects. - * - * @param {Array} arr - * @param {Number} duration - * @api public - */ - -exports.assertionList = function (arr, duration) { - var that = arr || []; - that.failures = function () { - var failures = 0; - for (var i=0; i(' + - '' + assertions.failures() + ', ' + - '' + assertions.passes() + ', ' + - assertions.length + - ')
    '; - test.className = assertions.failures() ? 'fail': 'pass'; - test.appendChild(strong); - - var aList = document.createElement('ol'); - aList.style.display = 'none'; - test.onclick = function () { - var d = aList.style.display; - aList.style.display = (d == 'none') ? 'block': 'none'; - }; - for (var i=0; i' + (a.error.stack || a.error) + ''; - li.className = 'fail'; - } - else { - li.innerHTML = a.message || a.method || 'no message'; - li.className = 'pass'; - } - aList.appendChild(li); - } - test.appendChild(aList); - tests.appendChild(test); - }, - done: function (assertions) { - var end = new Date().getTime(); - var duration = end - start; - - var failures = assertions.failures(); - banner.className = failures ? 'fail': 'pass'; - - result.innerHTML = 'Tests completed in ' + duration + - ' milliseconds.
    ' + - assertions.passes() + ' assertions of ' + - '' + assertions.length + ' passed, ' + - assertions.failures() + ' failed.'; - } - }); -}; -})(reporter); -nodeunit = core; -nodeunit.assert = assert; -nodeunit.reporter = reporter; -nodeunit.run = reporter.run; -return nodeunit; })(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/dist/async.min.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/dist/async.min.js deleted file mode 100644 index f89741e..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/dist/async.min.js +++ /dev/null @@ -1 +0,0 @@ -/*global setTimeout: false, console: false */(function(){var a={};var b=this,c=b.async;typeof module!=="undefined"&&module.exports?module.exports=a:b.async=a,a.noConflict=function(){b.async=c;return a};var d=function(a,b){if(a.forEach)return a.forEach(b);for(var c=0;cd?1:0};d(null,e(b.sort(c),function(a){return a.value}))})},a.auto=function(a,b){b=b||function(){};var c=g(a);if(!c.length)return b(null);var e=[];var i=[];var j=function(a){i.unshift(a)};var k=function(a){for(var b=0;b b ? 1 : 0; - }; - callback(null, _map(results.sort(fn), function (x) { - return x.value; - })); - } - }); - }; - - async.auto = function (tasks, callback) { - callback = callback || function () {}; - var keys = _keys(tasks); - if (!keys.length) { - return callback(null); - } - - var completed = []; - - var listeners = []; - var addListener = function (fn) { - listeners.unshift(fn); - }; - var removeListener = function (fn) { - for (var i = 0; i < listeners.length; i += 1) { - if (listeners[i] === fn) { - listeners.splice(i, 1); - return; - } - } - }; - var taskComplete = function () { - _forEach(listeners, function (fn) { - fn(); - }); - }; - - addListener(function () { - if (completed.length === keys.length) { - callback(null); - } - }); - - _forEach(keys, function (k) { - var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k]; - var taskCallback = function (err) { - if (err) { - callback(err); - // stop subsequent errors hitting callback multiple times - callback = function () {}; - } - else { - completed.push(k); - taskComplete(); - } - }; - var requires = task.slice(0, Math.abs(task.length - 1)) || []; - var ready = function () { - return _reduce(requires, function (a, x) { - return (a && _indexOf(completed, x) !== -1); - }, true); - }; - if (ready()) { - task[task.length - 1](taskCallback); - } - else { - var listener = function () { - if (ready()) { - removeListener(listener); - task[task.length - 1](taskCallback); - } - }; - addListener(listener); - } - }); - }; - - async.waterfall = function (tasks, callback) { - if (!tasks.length) { - return callback(); - } - callback = callback || function () {}; - var wrapIterator = function (iterator) { - return function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - var args = Array.prototype.slice.call(arguments, 1); - var next = iterator.next(); - if (next) { - args.push(wrapIterator(next)); - } - else { - args.push(callback); - } - async.nextTick(function () { - iterator.apply(null, args); - }); - } - }; - }; - wrapIterator(async.iterator(tasks))(); - }; - - async.parallel = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - async.map(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args); - }); - } - }, callback); - } - else { - var results = {}; - async.forEach(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.series = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - async.mapSeries(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args); - }); - } - }, callback); - } - else { - var results = {}; - async.forEachSeries(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.iterator = function (tasks) { - var makeCallback = function (index) { - var fn = function () { - if (tasks.length) { - tasks[index].apply(null, arguments); - } - return fn.next(); - }; - fn.next = function () { - return (index < tasks.length - 1) ? makeCallback(index + 1): null; - }; - return fn; - }; - return makeCallback(0); - }; - - async.apply = function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - return function () { - return fn.apply( - null, args.concat(Array.prototype.slice.call(arguments)) - ); - }; - }; - - var _concat = function (eachfn, arr, fn, callback) { - var r = []; - eachfn(arr, function (x, cb) { - fn(x, function (err, y) { - r = r.concat(y || []); - cb(err); - }); - }, function (err) { - callback(err, r); - }); - }; - async.concat = doParallel(_concat); - async.concatSeries = doSeries(_concat); - - async.whilst = function (test, iterator, callback) { - if (test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.whilst(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.until = function (test, iterator, callback) { - if (!test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.until(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.queue = function (worker, concurrency) { - var workers = 0; - var tasks = []; - var q = { - concurrency: concurrency, - saturated: null, - empty: null, - drain: null, - push: function (data, callback) { - tasks.push({data: data, callback: callback}); - if(q.saturated && tasks.length == concurrency) q.saturated(); - async.nextTick(q.process); - }, - process: function () { - if (workers < q.concurrency && tasks.length) { - var task = tasks.splice(0, 1)[0]; - if(q.empty && tasks.length == 0) q.empty(); - workers += 1; - worker(task.data, function () { - workers -= 1; - if (task.callback) { - task.callback.apply(task, arguments); - } - if(q.drain && tasks.length + workers == 0) q.drain(); - q.process(); - }); - } - }, - length: function () { - return tasks.length; - }, - running: function () { - return workers; - } - }; - return q; - }; - - var _console_fn = function (name) { - return function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - fn.apply(null, args.concat([function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (typeof console !== 'undefined') { - if (err) { - if (console.error) { - console.error(err); - } - } - else if (console[name]) { - _forEach(args, function (x) { - console[name](x); - }); - } - } - }])); - }; - }; - async.log = _console_fn('log'); - async.dir = _console_fn('dir'); - /*async.info = _console_fn('info'); - async.warn = _console_fn('warn'); - async.error = _console_fn('error');*/ - - async.memoize = function (fn, hasher) { - var memo = {}; - hasher = hasher || function (x) { - return x; - }; - return function () { - var args = Array.prototype.slice.call(arguments); - var callback = args.pop(); - var key = hasher.apply(null, args); - if (key in memo) { - callback.apply(null, memo[key]); - } - else { - fn.apply(null, args.concat([function () { - memo[key] = arguments; - callback.apply(null, arguments); - }])); - } - }; - }; - -}()); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/nodelint.cfg b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/nodelint.cfg deleted file mode 100644 index 457a967..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/nodelint.cfg +++ /dev/null @@ -1,4 +0,0 @@ -var options = { - indent: 4, - onevar: false -}; diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/package.json b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/package.json deleted file mode 100644 index e5646d7..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/package.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "async", - "description": "Higher-order functions and common patterns for asynchronous code", - "main": "./index", - "author": { - "name": "Caolan McMahon" - }, - "version": "0.1.9", - "repository": { - "type": "git", - "url": "git://github.com/caolan/async.git" - }, - "bugs": { - "url": "http://github.com/caolan/async/issues" - }, - "licenses": [ - { - "type": "MIT", - "url": "http://github.com/caolan/async/raw/master/LICENSE" - } - ], - "_npmUser": { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - "_id": "async@0.1.9", - "dependencies": {}, - "devDependencies": {}, - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "_engineSupported": true, - "_npmVersion": "1.1.24", - "_nodeVersion": "v0.8.1", - "_defaultsLoaded": true, - "dist": { - "shasum": "fd9b6aca66495fd0f7e97f86e71c7706ca9ae754" - }, - "_from": "async@0.1.9" -} diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/.swp b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/.swp deleted file mode 100644 index ece9b6bb6a4f01d31a8613468ccc9244e256ea4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2y>1gh5XU!k2=O6!fx#G*1bfd;q(nN!t|DZl1PM@R*c9ixB|hhTd)%IJ+yq_& z3R-G9L;(dAk3r27P#`h8Hj0FhDR2|%Kho^%?9R;1{jOTw_FGTx@6)#25G>b(c>C(Z z{-Njzc}a*kGFg`WCKRNaX>-TxySGFHn-?2hK00ck)1V8`;KmY_l00ck)1pbRatF`szv%4rQ2h}JO z&i%`hkMQef!&#D>HT{)qIkZB`K-8$SMB#Eo565YIOg)_yA?@62cf$csiJIY&p>aV; zS`zJsiOzJTi5`We&Z7~}Y-mkcHTzSdlTe@N*jMYNNtz#pT-S?SSJF;oz2PRsbQbfN z^T_JwW1Yu3q^Bx4tT)t7Y)Y+euPUh$byuyaj_Nj)9PpNm{ZJJ3#yWe(d8R*fCe5FD z*G_m-$$oUq=Ctm6anI2SxelGUw*7iAFe4o-xY}N$2f8XJw40WE>)n)7+DmQ4?=>s* V?{PKv`7hd=TWkEtC4RDw_ysbD&=&vz diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/test-async.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/test-async.js deleted file mode 100644 index 8c2cebd..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/test-async.js +++ /dev/null @@ -1,1367 +0,0 @@ -var async = require('../lib/async'); - - -exports['auto'] = function(test){ - var callOrder = []; - var testdata = [{test: 'test'}]; - async.auto({ - task1: ['task2', function(callback){ - setTimeout(function(){ - callOrder.push('task1'); - callback(); - }, 25); - }], - task2: function(callback){ - setTimeout(function(){ - callOrder.push('task2'); - callback(); - }, 50); - }, - task3: ['task2', function(callback){ - callOrder.push('task3'); - callback(); - }], - task4: ['task1', 'task2', function(callback){ - callOrder.push('task4'); - callback(); - }] - }, - function(err){ - test.same(callOrder, ['task2','task3','task1','task4']); - test.done(); - }); -}; - -exports['auto empty object'] = function(test){ - async.auto({}, function(err){ - test.done(); - }); -}; - -exports['auto error'] = function(test){ - test.expect(1); - async.auto({ - task1: function(callback){ - callback('testerror'); - }, - task2: ['task1', function(callback){ - test.ok(false, 'task2 should not be called'); - callback(); - }], - task3: function(callback){ - callback('testerror2'); - } - }, - function(err){ - test.equals(err, 'testerror'); - }); - setTimeout(test.done, 100); -}; - -exports['auto no callback'] = function(test){ - async.auto({ - task1: function(callback){callback();}, - task2: ['task1', function(callback){callback(); test.done();}] - }); -}; - -exports['waterfall'] = function(test){ - test.expect(6); - var call_order = []; - async.waterfall([ - function(callback){ - call_order.push('fn1'); - setTimeout(function(){callback(null, 'one', 'two');}, 0); - }, - function(arg1, arg2, callback){ - call_order.push('fn2'); - test.equals(arg1, 'one'); - test.equals(arg2, 'two'); - setTimeout(function(){callback(null, arg1, arg2, 'three');}, 25); - }, - function(arg1, arg2, arg3, callback){ - call_order.push('fn3'); - test.equals(arg1, 'one'); - test.equals(arg2, 'two'); - test.equals(arg3, 'three'); - callback(null, 'four'); - }, - function(arg4, callback){ - call_order.push('fn4'); - test.same(call_order, ['fn1','fn2','fn3','fn4']); - callback(null, 'test'); - } - ], function(err){ - test.done(); - }); -}; - -exports['waterfall empty array'] = function(test){ - async.waterfall([], function(err){ - test.done(); - }); -}; - -exports['waterfall no callback'] = function(test){ - async.waterfall([ - function(callback){callback();}, - function(callback){callback(); test.done();} - ]); -}; - -exports['waterfall async'] = function(test){ - var call_order = []; - async.waterfall([ - function(callback){ - call_order.push(1); - callback(); - call_order.push(2); - }, - function(callback){ - call_order.push(3); - callback(); - }, - function(){ - test.same(call_order, [1,2,3]); - test.done(); - } - ]); -}; - -exports['waterfall error'] = function(test){ - test.expect(1); - async.waterfall([ - function(callback){ - callback('error'); - }, - function(callback){ - test.ok(false, 'next function should not be called'); - callback(); - } - ], function(err){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 50); -}; - -exports['waterfall multiple callback calls'] = function(test){ - var call_order = []; - var arr = [ - function(callback){ - call_order.push(1); - // call the callback twice. this should call function 2 twice - callback(null, 'one', 'two'); - callback(null, 'one', 'two'); - }, - function(arg1, arg2, callback){ - call_order.push(2); - callback(null, arg1, arg2, 'three'); - }, - function(arg1, arg2, arg3, callback){ - call_order.push(3); - callback(null, 'four'); - }, - function(arg4){ - call_order.push(4); - arr[3] = function(){ - call_order.push(4); - test.same(call_order, [1,2,2,3,3,4,4]); - test.done(); - }; - } - ]; - async.waterfall(arr); -}; - - -exports['parallel'] = function(test){ - var call_order = []; - async.parallel([ - function(callback){ - setTimeout(function(){ - call_order.push(1); - callback(null, 1); - }, 25); - }, - function(callback){ - setTimeout(function(){ - call_order.push(2); - callback(null, 2); - }, 50); - }, - function(callback){ - setTimeout(function(){ - call_order.push(3); - callback(null, 3,3); - }, 15); - } - ], - function(err, results){ - test.equals(err, null); - test.same(call_order, [3,1,2]); - test.same(results, [1,2,[3,3]]); - test.done(); - }); -}; - -exports['parallel empty array'] = function(test){ - async.parallel([], function(err, results){ - test.equals(err, null); - test.same(results, []); - test.done(); - }); -}; - -exports['parallel error'] = function(test){ - async.parallel([ - function(callback){ - callback('error', 1); - }, - function(callback){ - callback('error2', 2); - } - ], - function(err, results){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 100); -}; - -exports['parallel no callback'] = function(test){ - async.parallel([ - function(callback){callback();}, - function(callback){callback(); test.done();}, - ]); -}; - -exports['parallel object'] = function(test){ - var call_order = []; - async.parallel({ - one: function(callback){ - setTimeout(function(){ - call_order.push(1); - callback(null, 1); - }, 25); - }, - two: function(callback){ - setTimeout(function(){ - call_order.push(2); - callback(null, 2); - }, 50); - }, - three: function(callback){ - setTimeout(function(){ - call_order.push(3); - callback(null, 3,3); - }, 15); - } - }, - function(err, results){ - test.equals(err, null); - test.same(call_order, [3,1,2]); - test.same(results, { - one: 1, - two: 2, - three: [3,3] - }); - test.done(); - }); -}; - -exports['series'] = function(test){ - var call_order = []; - async.series([ - function(callback){ - setTimeout(function(){ - call_order.push(1); - callback(null, 1); - }, 25); - }, - function(callback){ - setTimeout(function(){ - call_order.push(2); - callback(null, 2); - }, 50); - }, - function(callback){ - setTimeout(function(){ - call_order.push(3); - callback(null, 3,3); - }, 15); - } - ], - function(err, results){ - test.equals(err, null); - test.same(results, [1,2,[3,3]]); - test.same(call_order, [1,2,3]); - test.done(); - }); -}; - -exports['series empty array'] = function(test){ - async.series([], function(err, results){ - test.equals(err, null); - test.same(results, []); - test.done(); - }); -}; - -exports['series error'] = function(test){ - test.expect(1); - async.series([ - function(callback){ - callback('error', 1); - }, - function(callback){ - test.ok(false, 'should not be called'); - callback('error2', 2); - } - ], - function(err, results){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 100); -}; - -exports['series no callback'] = function(test){ - async.series([ - function(callback){callback();}, - function(callback){callback(); test.done();}, - ]); -}; - -exports['series object'] = function(test){ - var call_order = []; - async.series({ - one: function(callback){ - setTimeout(function(){ - call_order.push(1); - callback(null, 1); - }, 25); - }, - two: function(callback){ - setTimeout(function(){ - call_order.push(2); - callback(null, 2); - }, 50); - }, - three: function(callback){ - setTimeout(function(){ - call_order.push(3); - callback(null, 3,3); - }, 15); - } - }, - function(err, results){ - test.equals(err, null); - test.same(results, { - one: 1, - two: 2, - three: [3,3] - }); - test.same(call_order, [1,2,3]); - test.done(); - }); -}; - -exports['iterator'] = function(test){ - var call_order = []; - var iterator = async.iterator([ - function(){call_order.push(1);}, - function(arg1){ - test.equals(arg1, 'arg1'); - call_order.push(2); - }, - function(arg1, arg2){ - test.equals(arg1, 'arg1'); - test.equals(arg2, 'arg2'); - call_order.push(3); - } - ]); - iterator(); - test.same(call_order, [1]); - var iterator2 = iterator(); - test.same(call_order, [1,1]); - var iterator3 = iterator2('arg1'); - test.same(call_order, [1,1,2]); - var iterator4 = iterator3('arg1', 'arg2'); - test.same(call_order, [1,1,2,3]); - test.equals(iterator4, undefined); - test.done(); -}; - -exports['iterator empty array'] = function(test){ - var iterator = async.iterator([]); - test.equals(iterator(), undefined); - test.equals(iterator.next(), undefined); - test.done(); -}; - -exports['iterator.next'] = function(test){ - var call_order = []; - var iterator = async.iterator([ - function(){call_order.push(1);}, - function(arg1){ - test.equals(arg1, 'arg1'); - call_order.push(2); - }, - function(arg1, arg2){ - test.equals(arg1, 'arg1'); - test.equals(arg2, 'arg2'); - call_order.push(3); - } - ]); - var fn = iterator.next(); - var iterator2 = fn('arg1'); - test.same(call_order, [2]); - iterator2('arg1','arg2'); - test.same(call_order, [2,3]); - test.equals(iterator2.next(), undefined); - test.done(); -}; - -exports['forEach'] = function(test){ - var args = []; - async.forEach([1,3,2], function(x, callback){ - setTimeout(function(){ - args.push(x); - callback(); - }, x*25); - }, function(err){ - test.same(args, [1,2,3]); - test.done(); - }); -}; - -exports['forEach empty array'] = function(test){ - test.expect(1); - async.forEach([], function(x, callback){ - test.ok(false, 'iterator should not be called'); - callback(); - }, function(err){ - test.ok(true, 'should call callback'); - }); - setTimeout(test.done, 25); -}; - -exports['forEach error'] = function(test){ - test.expect(1); - async.forEach([1,2,3], function(x, callback){ - callback('error'); - }, function(err){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 50); -}; - -exports['forEachSeries'] = function(test){ - var args = []; - async.forEachSeries([1,3,2], function(x, callback){ - setTimeout(function(){ - args.push(x); - callback(); - }, x*25); - }, function(err){ - test.same(args, [1,3,2]); - test.done(); - }); -}; - -exports['forEachSeries empty array'] = function(test){ - test.expect(1); - async.forEachSeries([], function(x, callback){ - test.ok(false, 'iterator should not be called'); - callback(); - }, function(err){ - test.ok(true, 'should call callback'); - }); - setTimeout(test.done, 25); -}; - -exports['forEachSeries error'] = function(test){ - test.expect(2); - var call_order = []; - async.forEachSeries([1,2,3], function(x, callback){ - call_order.push(x); - callback('error'); - }, function(err){ - test.same(call_order, [1]); - test.equals(err, 'error'); - }); - setTimeout(test.done, 50); -}; - -exports['map'] = function(test){ - var call_order = []; - async.map([1,3,2], function(x, callback){ - setTimeout(function(){ - call_order.push(x); - callback(null, x*2); - }, x*25); - }, function(err, results){ - test.same(call_order, [1,2,3]); - test.same(results, [2,6,4]); - test.done(); - }); -}; - -exports['map original untouched'] = function(test){ - var a = [1,2,3]; - async.map(a, function(x, callback){ - callback(null, x*2); - }, function(err, results){ - test.same(results, [2,4,6]); - test.same(a, [1,2,3]); - test.done(); - }); -}; - -exports['map error'] = function(test){ - test.expect(1); - async.map([1,2,3], function(x, callback){ - callback('error'); - }, function(err, results){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 50); -}; - -exports['mapSeries'] = function(test){ - var call_order = []; - async.mapSeries([1,3,2], function(x, callback){ - setTimeout(function(){ - call_order.push(x); - callback(null, x*2); - }, x*25); - }, function(err, results){ - test.same(call_order, [1,3,2]); - test.same(results, [2,6,4]); - test.done(); - }); -}; - -exports['mapSeries error'] = function(test){ - test.expect(1); - async.mapSeries([1,2,3], function(x, callback){ - callback('error'); - }, function(err, results){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 50); -}; - -exports['reduce'] = function(test){ - var call_order = []; - async.reduce([1,2,3], 0, function(a, x, callback){ - call_order.push(x); - callback(null, a + x); - }, function(err, result){ - test.equals(result, 6); - test.same(call_order, [1,2,3]); - test.done(); - }); -}; - -exports['reduce async with non-reference memo'] = function(test){ - async.reduce([1,3,2], 0, function(a, x, callback){ - setTimeout(function(){callback(null, a + x)}, Math.random()*100); - }, function(err, result){ - test.equals(result, 6); - test.done(); - }); -}; - -exports['reduce error'] = function(test){ - test.expect(1); - async.reduce([1,2,3], 0, function(a, x, callback){ - callback('error'); - }, function(err, result){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 50); -}; - -exports['inject alias'] = function(test){ - test.equals(async.inject, async.reduce); - test.done(); -}; - -exports['foldl alias'] = function(test){ - test.equals(async.foldl, async.reduce); - test.done(); -}; - -exports['reduceRight'] = function(test){ - var call_order = []; - var a = [1,2,3]; - async.reduceRight(a, 0, function(a, x, callback){ - call_order.push(x); - callback(null, a + x); - }, function(err, result){ - test.equals(result, 6); - test.same(call_order, [3,2,1]); - test.same(a, [1,2,3]); - test.done(); - }); -}; - -exports['foldr alias'] = function(test){ - test.equals(async.foldr, async.reduceRight); - test.done(); -}; - -exports['filter'] = function(test){ - async.filter([3,1,2], function(x, callback){ - setTimeout(function(){callback(x % 2);}, x*25); - }, function(results){ - test.same(results, [3,1]); - test.done(); - }); -}; - -exports['filter original untouched'] = function(test){ - var a = [3,1,2]; - async.filter(a, function(x, callback){ - callback(x % 2); - }, function(results){ - test.same(results, [3,1]); - test.same(a, [3,1,2]); - test.done(); - }); -}; - -exports['filterSeries'] = function(test){ - async.filterSeries([3,1,2], function(x, callback){ - setTimeout(function(){callback(x % 2);}, x*25); - }, function(results){ - test.same(results, [3,1]); - test.done(); - }); -}; - -exports['select alias'] = function(test){ - test.equals(async.select, async.filter); - test.done(); -}; - -exports['selectSeries alias'] = function(test){ - test.equals(async.selectSeries, async.filterSeries); - test.done(); -}; - -exports['reject'] = function(test){ - async.reject([3,1,2], function(x, callback){ - setTimeout(function(){callback(x % 2);}, x*25); - }, function(results){ - test.same(results, [2]); - test.done(); - }); -}; - -exports['reject original untouched'] = function(test){ - var a = [3,1,2]; - async.reject(a, function(x, callback){ - callback(x % 2); - }, function(results){ - test.same(results, [2]); - test.same(a, [3,1,2]); - test.done(); - }); -}; - -exports['rejectSeries'] = function(test){ - async.rejectSeries([3,1,2], function(x, callback){ - setTimeout(function(){callback(x % 2);}, x*25); - }, function(results){ - test.same(results, [2]); - test.done(); - }); -}; - -exports['some true'] = function(test){ - async.some([3,1,2], function(x, callback){ - setTimeout(function(){callback(x === 1);}, 0); - }, function(result){ - test.equals(result, true); - test.done(); - }); -}; - -exports['some false'] = function(test){ - async.some([3,1,2], function(x, callback){ - setTimeout(function(){callback(x === 10);}, 0); - }, function(result){ - test.equals(result, false); - test.done(); - }); -}; - -exports['some early return'] = function(test){ - var call_order = []; - async.some([1,2,3], function(x, callback){ - setTimeout(function(){ - call_order.push(x); - callback(x === 1); - }, x*25); - }, function(result){ - call_order.push('callback'); - }); - setTimeout(function(){ - test.same(call_order, [1,'callback',2,3]); - test.done(); - }, 100); -}; - -exports['any alias'] = function(test){ - test.equals(async.any, async.some); - test.done(); -}; - -exports['every true'] = function(test){ - async.every([1,2,3], function(x, callback){ - setTimeout(function(){callback(true);}, 0); - }, function(result){ - test.equals(result, true); - test.done(); - }); -}; - -exports['every false'] = function(test){ - async.every([1,2,3], function(x, callback){ - setTimeout(function(){callback(x % 2);}, 0); - }, function(result){ - test.equals(result, false); - test.done(); - }); -}; - -exports['every early return'] = function(test){ - var call_order = []; - async.every([1,2,3], function(x, callback){ - setTimeout(function(){ - call_order.push(x); - callback(x === 1); - }, x*25); - }, function(result){ - call_order.push('callback'); - }); - setTimeout(function(){ - test.same(call_order, [1,2,'callback',3]); - test.done(); - }, 100); -}; - -exports['all alias'] = function(test){ - test.equals(async.all, async.every); - test.done(); -}; - -exports['detect'] = function(test){ - var call_order = []; - async.detect([3,2,1], function(x, callback){ - setTimeout(function(){ - call_order.push(x); - callback(x == 2); - }, x*25); - }, function(result){ - call_order.push('callback'); - test.equals(result, 2); - }); - setTimeout(function(){ - test.same(call_order, [1,2,'callback',3]); - test.done(); - }, 100); -}; - -exports['detectSeries'] = function(test){ - var call_order = []; - async.detectSeries([3,2,1], function(x, callback){ - setTimeout(function(){ - call_order.push(x); - callback(x == 2); - }, x*25); - }, function(result){ - call_order.push('callback'); - test.equals(result, 2); - }); - setTimeout(function(){ - test.same(call_order, [3,2,'callback']); - test.done(); - }, 200); -}; - -exports['sortBy'] = function(test){ - async.sortBy([{a:1},{a:15},{a:6}], function(x, callback){ - setTimeout(function(){callback(null, x.a);}, 0); - }, function(err, result){ - test.same(result, [{a:1},{a:6},{a:15}]); - test.done(); - }); -}; - -exports['apply'] = function(test){ - test.expect(6); - var fn = function(){ - test.same(Array.prototype.slice.call(arguments), [1,2,3,4]) - }; - async.apply(fn, 1, 2, 3, 4)(); - async.apply(fn, 1, 2, 3)(4); - async.apply(fn, 1, 2)(3, 4); - async.apply(fn, 1)(2, 3, 4); - async.apply(fn)(1, 2, 3, 4); - test.equals( - async.apply(function(name){return 'hello ' + name}, 'world')(), - 'hello world' - ); - test.done(); -}; - - -// generates tests for console functions such as async.log -var console_fn_tests = function(name){ - - if (typeof console !== 'undefined') { - exports[name] = function(test){ - test.expect(5); - var fn = function(arg1, callback){ - test.equals(arg1, 'one'); - setTimeout(function(){callback(null, 'test');}, 0); - }; - var fn_err = function(arg1, callback){ - test.equals(arg1, 'one'); - setTimeout(function(){callback('error');}, 0); - }; - var _console_fn = console[name]; - var _error = console.error; - console[name] = function(val){ - test.equals(val, 'test'); - test.equals(arguments.length, 1); - console.error = function(val){ - test.equals(val, 'error'); - console[name] = _console_fn; - console.error = _error; - test.done(); - }; - async[name](fn_err, 'one'); - }; - async[name](fn, 'one'); - }; - - exports[name + ' with multiple result params'] = function(test){ - var fn = function(callback){callback(null,'one','two','three');}; - var _console_fn = console[name]; - var called_with = []; - console[name] = function(x){ - called_with.push(x); - }; - async[name](fn); - test.same(called_with, ['one','two','three']); - console[name] = _console_fn; - test.done(); - }; - } - - // browser-only test - exports[name + ' without console.' + name] = function(test){ - if (typeof window !== 'undefined') { - var _console = window.console; - window.console = undefined; - var fn = function(callback){callback(null, 'val');}; - var fn_err = function(callback){callback('error');}; - async[name](fn); - async[name](fn_err); - window.console = _console; - } - test.done(); - }; - -}; - -console_fn_tests('log'); -console_fn_tests('dir'); -/*console_fn_tests('info'); -console_fn_tests('warn'); -console_fn_tests('error');*/ - -exports['nextTick'] = function(test){ - var call_order = []; - async.nextTick(function(){call_order.push('two');}); - call_order.push('one'); - setTimeout(function(){ - test.same(call_order, ['one','two']); - test.done(); - }, 50); -}; - -exports['nextTick in the browser'] = function(test){ - if (typeof process !== 'undefined') { - // skip this test in node - return test.done(); - } - test.expect(1); - - var call_order = []; - async.nextTick(function(){call_order.push('two');}); - - call_order.push('one'); - setTimeout(function(){ - if (typeof process !== 'undefined') { - process.nextTick = _nextTick; - } - test.same(call_order, ['one','two']); - }, 50); - setTimeout(test.done, 100); -}; - -exports['noConflict - node only'] = function(test){ - if (typeof process !== 'undefined') { - // node only test - test.expect(3); - var fs = require('fs'); - var filename = __dirname + '/../lib/async.js'; - fs.readFile(filename, function(err, content){ - if(err) return test.done(); - var Script = process.binding('evals').Script; - - var s = new Script(content, filename); - var s2 = new Script( - content + 'this.async2 = this.async.noConflict();', - filename - ); - - var sandbox1 = {async: 'oldvalue'}; - s.runInNewContext(sandbox1); - test.ok(sandbox1.async); - - var sandbox2 = {async: 'oldvalue'}; - s2.runInNewContext(sandbox2); - test.equals(sandbox2.async, 'oldvalue'); - test.ok(sandbox2.async2); - - test.done(); - }); - } - else test.done(); -}; - -exports['concat'] = function(test){ - var call_order = []; - var iterator = function (x, cb) { - setTimeout(function(){ - call_order.push(x); - var r = []; - while (x > 0) { - r.push(x); - x--; - } - cb(null, r); - }, x*25); - }; - async.concat([1,3,2], iterator, function(err, results){ - test.same(results, [1,2,1,3,2,1]); - test.same(call_order, [1,2,3]); - test.ok(!err); - test.done(); - }); -}; - -exports['concat error'] = function(test){ - var iterator = function (x, cb) { - cb(new Error('test error')); - }; - async.concat([1,2,3], iterator, function(err, results){ - test.ok(err); - test.done(); - }); -}; - -exports['concatSeries'] = function(test){ - var call_order = []; - var iterator = function (x, cb) { - setTimeout(function(){ - call_order.push(x); - var r = []; - while (x > 0) { - r.push(x); - x--; - } - cb(null, r); - }, x*25); - }; - async.concatSeries([1,3,2], iterator, function(err, results){ - test.same(results, [1,3,2,1,2,1]); - test.same(call_order, [1,3,2]); - test.ok(!err); - test.done(); - }); -}; - -exports['until'] = function (test) { - var call_order = []; - - var count = 0; - async.until( - function () { - call_order.push(['test', count]); - return (count == 5); - }, - function (cb) { - call_order.push(['iterator', count]); - count++; - cb(); - }, - function (err) { - test.same(call_order, [ - ['test', 0], - ['iterator', 0], ['test', 1], - ['iterator', 1], ['test', 2], - ['iterator', 2], ['test', 3], - ['iterator', 3], ['test', 4], - ['iterator', 4], ['test', 5], - ]); - test.equals(count, 5); - test.done(); - } - ); -}; - -exports['whilst'] = function (test) { - var call_order = []; - - var count = 0; - async.whilst( - function () { - call_order.push(['test', count]); - return (count < 5); - }, - function (cb) { - call_order.push(['iterator', count]); - count++; - cb(); - }, - function (err) { - test.same(call_order, [ - ['test', 0], - ['iterator', 0], ['test', 1], - ['iterator', 1], ['test', 2], - ['iterator', 2], ['test', 3], - ['iterator', 3], ['test', 4], - ['iterator', 4], ['test', 5], - ]); - test.equals(count, 5); - test.done(); - } - ); -}; - -exports['queue'] = function (test) { - var call_order = [], - delays = [40,20,60,20]; - - // worker1: --1-4 - // worker2: -2---3 - // order of completion: 2,1,4,3 - - var q = async.queue(function (task, callback) { - setTimeout(function () { - call_order.push('process ' + task); - callback('error', 'arg'); - }, delays.splice(0,1)[0]); - }, 2); - - q.push(1, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 1); - call_order.push('callback ' + 1); - }); - q.push(2, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 2); - call_order.push('callback ' + 2); - }); - q.push(3, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 0); - call_order.push('callback ' + 3); - }); - q.push(4, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 0); - call_order.push('callback ' + 4); - }); - test.equal(q.length(), 4); - test.equal(q.concurrency, 2); - - setTimeout(function () { - test.same(call_order, [ - 'process 2', 'callback 2', - 'process 1', 'callback 1', - 'process 4', 'callback 4', - 'process 3', 'callback 3' - ]); - test.equal(q.concurrency, 2); - test.equal(q.length(), 0); - test.done(); - }, 200); -}; - -exports['queue changing concurrency'] = function (test) { - var call_order = [], - delays = [40,20,60,20]; - - // worker1: --1-2---3-4 - // order of completion: 1,2,3,4 - - var q = async.queue(function (task, callback) { - setTimeout(function () { - call_order.push('process ' + task); - callback('error', 'arg'); - }, delays.splice(0,1)[0]); - }, 2); - - q.push(1, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 3); - call_order.push('callback ' + 1); - }); - q.push(2, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 2); - call_order.push('callback ' + 2); - }); - q.push(3, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 1); - call_order.push('callback ' + 3); - }); - q.push(4, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 0); - call_order.push('callback ' + 4); - }); - test.equal(q.length(), 4); - test.equal(q.concurrency, 2); - q.concurrency = 1; - - setTimeout(function () { - test.same(call_order, [ - 'process 1', 'callback 1', - 'process 2', 'callback 2', - 'process 3', 'callback 3', - 'process 4', 'callback 4' - ]); - test.equal(q.concurrency, 1); - test.equal(q.length(), 0); - test.done(); - }, 250); -}; - -exports['queue push without callback'] = function (test) { - var call_order = [], - delays = [40,20,60,20]; - - // worker1: --1-4 - // worker2: -2---3 - // order of completion: 2,1,4,3 - - var q = async.queue(function (task, callback) { - setTimeout(function () { - call_order.push('process ' + task); - callback('error', 'arg'); - }, delays.splice(0,1)[0]); - }, 2); - - q.push(1); - q.push(2); - q.push(3); - q.push(4); - - setTimeout(function () { - test.same(call_order, [ - 'process 2', - 'process 1', - 'process 4', - 'process 3' - ]); - test.done(); - }, 200); -}; - -exports['memoize'] = function (test) { - test.expect(4); - var call_order = []; - - var fn = function (arg1, arg2, callback) { - call_order.push(['fn', arg1, arg2]); - callback(null, arg1 + arg2); - }; - - var fn2 = async.memoize(fn); - fn2(1, 2, function (err, result) { - test.equal(result, 3); - }); - fn2(1, 2, function (err, result) { - test.equal(result, 3); - }); - fn2(2, 2, function (err, result) { - test.equal(result, 4); - }); - - test.same(call_order, [['fn',1,2], ['fn',2,2]]); - test.done(); -}; - -exports['memoize error'] = function (test) { - test.expect(1); - var testerr = new Error('test'); - var fn = function (arg1, arg2, callback) { - callback(testerr, arg1 + arg2); - }; - async.memoize(fn)(1, 2, function (err, result) { - test.equal(err, testerr); - }); - test.done(); -}; - -exports['memoize custom hash function'] = function (test) { - test.expect(2); - var testerr = new Error('test'); - - var fn = function (arg1, arg2, callback) { - callback(testerr, arg1 + arg2); - }; - var fn2 = async.memoize(fn, function () { - return 'custom hash'; - }); - fn2(1, 2, function (err, result) { - test.equal(result, 3); - }); - fn2(2, 2, function (err, result) { - test.equal(result, 3); - }); - test.done(); -}; - -// Issue 10 on github: https://github.com/caolan/async/issues#issue/10 -exports['falsy return values in series'] = function (test) { - function taskFalse(callback) { - async.nextTick(function() { - callback(null, false); - }); - }; - function taskUndefined(callback) { - async.nextTick(function() { - callback(null, undefined); - }); - }; - function taskEmpty(callback) { - async.nextTick(function() { - callback(null); - }); - }; - function taskNull(callback) { - async.nextTick(function() { - callback(null, null); - }); - }; - async.series( - [taskFalse, taskUndefined, taskEmpty, taskNull], - function(err, results) { - test.same(results, [false, undefined, undefined, null]); - test.strictEqual(results[0], false); - test.strictEqual(results[1], undefined); - test.strictEqual(results[2], undefined); - test.strictEqual(results[3], null); - test.done(); - } - ); -}; - -// Issue 10 on github: https://github.com/caolan/async/issues#issue/10 -exports['falsy return values in parallel'] = function (test) { - function taskFalse(callback) { - async.nextTick(function() { - callback(null, false); - }); - }; - function taskUndefined(callback) { - async.nextTick(function() { - callback(null, undefined); - }); - }; - function taskEmpty(callback) { - async.nextTick(function() { - callback(null); - }); - }; - function taskNull(callback) { - async.nextTick(function() { - callback(null, null); - }); - }; - async.parallel( - [taskFalse, taskUndefined, taskEmpty, taskNull], - function(err, results) { - test.same(results, [false, undefined, undefined, null]); - test.strictEqual(results[0], false); - test.strictEqual(results[1], undefined); - test.strictEqual(results[2], undefined); - test.strictEqual(results[3], null); - test.done(); - } - ); -}; - -exports['queue events'] = function(test) { - var calls = []; - var q = async.queue(function(task, cb) { - // nop - calls.push('process ' + task); - cb(); - }, 3); - - q.saturated = function() { - test.ok(q.length() == 3, 'queue should be saturated now'); - calls.push('saturated'); - }; - q.empty = function() { - test.ok(q.length() == 0, 'queue should be empty now'); - calls.push('empty'); - }; - q.drain = function() { - test.ok( - q.length() == 0 && q.running() == 0, - 'queue should be empty now and no more workers should be running' - ); - calls.push('drain'); - test.same(calls, [ - 'saturated', - 'process foo', - 'foo cb', - 'process bar', - 'bar cb', - 'process zoo', - 'zoo cb', - 'process poo', - 'poo cb', - 'empty', - 'process moo', - 'moo cb', - 'drain', - ]); - test.done(); - }; - q.push('foo', function () {calls.push('foo cb');}); - q.push('bar', function () {calls.push('bar cb');}); - q.push('zoo', function () {calls.push('zoo cb');}); - q.push('poo', function () {calls.push('poo cb');}); - q.push('moo', function () {calls.push('moo cb');}); -}; diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/test.html b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/test.html deleted file mode 100644 index 2450e2d..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/test.html +++ /dev/null @@ -1,24 +0,0 @@ - - - Async.js Test Suite - - - - - - - - -

    Async.js Test Suite

    - - - diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/.npmignore b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/.npmignore deleted file mode 100644 index aba34f0..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -*.un~ -/node_modules -/test/tmp diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/License b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/License deleted file mode 100644 index 4804b7a..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/License +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2011 Debuggable Limited - -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. diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/Makefile b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/Makefile deleted file mode 100644 index b4ff85a..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -SHELL := /bin/bash - -test: - @./test/run.js - -.PHONY: test - diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md deleted file mode 100644 index 1a9999e..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md +++ /dev/null @@ -1,132 +0,0 @@ -# combined-stream - -A stream that emits multiple other streams one after another. - -## Installation - -``` bash -npm install combined-stream -``` - -## Usage - -Here is a simple example that shows how you can use combined-stream to combine -two files into one: - -``` javascript -var CombinedStream = require('combined-stream'); -var fs = require('fs'); - -var combinedStream = CombinedStream.create(); -combinedStream.append(fs.createReadStream('file1.txt')); -combinedStream.append(fs.createReadStream('file2.txt')); - -combinedStream.pipe(fs.createWriteStream('combined.txt')); -``` - -While the example above works great, it will pause all source streams until -they are needed. If you don't want that to happen, you can set `pauseStreams` -to `false`: - -``` javascript -var CombinedStream = require('combined-stream'); -var fs = require('fs'); - -var combinedStream = CombinedStream.create({pauseStreams: false}); -combinedStream.append(fs.createReadStream('file1.txt')); -combinedStream.append(fs.createReadStream('file2.txt')); - -combinedStream.pipe(fs.createWriteStream('combined.txt')); -``` - -However, what if you don't have all the source streams yet, or you don't want -to allocate the resources (file descriptors, memory, etc.) for them right away? -Well, in that case you can simply provide a callback that supplies the stream -by calling a `next()` function: - -``` javascript -var CombinedStream = require('combined-stream'); -var fs = require('fs'); - -var combinedStream = CombinedStream.create(); -combinedStream.append(function(next) { - next(fs.createReadStream('file1.txt')); -}); -combinedStream.append(function(next) { - next(fs.createReadStream('file2.txt')); -}); - -combinedStream.pipe(fs.createWriteStream('combined.txt')); -``` - -## API - -### CombinedStream.create([options]) - -Returns a new combined stream object. Available options are: - -* `maxDataSize` -* `pauseStreams` - -The effect of those options is described below. - -### combinedStream.pauseStreams = true - -Whether to apply back pressure to the underlaying streams. If set to `false`, -the underlaying streams will never be paused. If set to `true`, the -underlaying streams will be paused right after being appended, as well as when -`delayedStream.pipe()` wants to throttle. - -### combinedStream.maxDataSize = 2 * 1024 * 1024 - -The maximum amount of bytes (or characters) to buffer for all source streams. -If this value is exceeded, `combinedStream` emits an `'error'` event. - -### combinedStream.dataSize = 0 - -The amount of bytes (or characters) currently buffered by `combinedStream`. - -### combinedStream.append(stream) - -Appends the given `stream` to the combinedStream object. If `pauseStreams` is -set to `true, this stream will also be paused right away. - -`streams` can also be a function that takes one parameter called `next`. `next` -is a function that must be invoked in order to provide the `next` stream, see -example above. - -Regardless of how the `stream` is appended, combined-stream always attaches an -`'error'` listener to it, so you don't have to do that manually. - -Special case: `stream` can also be a String or Buffer. - -### combinedStream.write(data) - -You should not call this, `combinedStream` takes care of piping the appended -streams into itself for you. - -### combinedStream.resume() - -Causes `combinedStream` to start drain the streams it manages. The function is -idempotent, and also emits a `'resume'` event each time which usually goes to -the stream that is currently being drained. - -### combinedStream.pause(); - -If `combinedStream.pauseStreams` is set to `false`, this does nothing. -Otherwise a `'pause'` event is emitted, this goes to the stream that is -currently being drained, so you can use it to apply back pressure. - -### combinedStream.end(); - -Sets `combinedStream.writable` to false, emits an `'end'` event, and removes -all streams from the queue. - -### combinedStream.destroy(); - -Same as `combinedStream.end()`, except it emits a `'close'` event instead of -`'end'`. - -## License - -combined-stream is licensed under the MIT license. diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js deleted file mode 100644 index 03754e6..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js +++ /dev/null @@ -1,183 +0,0 @@ -var util = require('util'); -var Stream = require('stream').Stream; -var DelayedStream = require('delayed-stream'); - -module.exports = CombinedStream; -function CombinedStream() { - this.writable = false; - this.readable = true; - this.dataSize = 0; - this.maxDataSize = 2 * 1024 * 1024; - this.pauseStreams = true; - - this._released = false; - this._streams = []; - this._currentStream = null; -} -util.inherits(CombinedStream, Stream); - -CombinedStream.create = function(options) { - var combinedStream = new this(); - - options = options || {}; - for (var option in options) { - combinedStream[option] = options[option]; - } - - return combinedStream; -}; - -CombinedStream.isStreamLike = function(stream) { - return (typeof stream !== 'function') - && (typeof stream !== 'string') - && (!Buffer.isBuffer(stream)); -}; - -CombinedStream.prototype.append = function(stream) { - var isStreamLike = CombinedStream.isStreamLike(stream); - - if (isStreamLike) { - if (!(stream instanceof DelayedStream)) { - stream.on('data', this._checkDataSize.bind(this)); - - stream = DelayedStream.create(stream, { - maxDataSize: Infinity, - pauseStream: this.pauseStreams, - }); - } - - this._handleErrors(stream); - - if (this.pauseStreams) { - stream.pause(); - } - } - - this._streams.push(stream); - return this; -}; - -CombinedStream.prototype.pipe = function(dest, options) { - Stream.prototype.pipe.call(this, dest, options); - this.resume(); -}; - -CombinedStream.prototype._getNext = function() { - this._currentStream = null; - var stream = this._streams.shift(); - - - if (!stream) { - this.end(); - return; - } - - if (typeof stream !== 'function') { - this._pipeNext(stream); - return; - } - - var getStream = stream; - getStream(function(stream) { - var isStreamLike = CombinedStream.isStreamLike(stream); - if (isStreamLike) { - stream.on('data', this._checkDataSize.bind(this)); - this._handleErrors(stream); - } - - this._pipeNext(stream); - }.bind(this)); -}; - -CombinedStream.prototype._pipeNext = function(stream) { - this._currentStream = stream; - - var isStreamLike = CombinedStream.isStreamLike(stream); - if (isStreamLike) { - stream.on('end', this._getNext.bind(this)) - stream.pipe(this, {end: false}); - return; - } - - var value = stream; - this.write(value); - this._getNext(); -}; - -CombinedStream.prototype._handleErrors = function(stream) { - var self = this; - stream.on('error', function(err) { - self._emitError(err); - }); -}; - -CombinedStream.prototype.write = function(data) { - this.emit('data', data); -}; - -CombinedStream.prototype.pause = function() { - if (!this.pauseStreams) { - return; - } - - this.emit('pause'); -}; - -CombinedStream.prototype.resume = function() { - if (!this._released) { - this._released = true; - this.writable = true; - this._getNext(); - } - - this.emit('resume'); -}; - -CombinedStream.prototype.end = function() { - this._reset(); - this.emit('end'); -}; - -CombinedStream.prototype.destroy = function() { - this._reset(); - this.emit('close'); -}; - -CombinedStream.prototype._reset = function() { - this.writable = false; - this._streams = []; - this._currentStream = null; -}; - -CombinedStream.prototype._checkDataSize = function() { - this._updateDataSize(); - if (this.dataSize <= this.maxDataSize) { - return; - } - - var message = - 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.' - this._emitError(new Error(message)); -}; - -CombinedStream.prototype._updateDataSize = function() { - this.dataSize = 0; - - var self = this; - this._streams.forEach(function(stream) { - if (!stream.dataSize) { - return; - } - - self.dataSize += stream.dataSize; - }); - - if (this._currentStream && this._currentStream.dataSize) { - this.dataSize += this._currentStream.dataSize; - } -}; - -CombinedStream.prototype._emitError = function(err) { - this._reset(); - this.emit('error', err); -}; diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore deleted file mode 100644 index 2fedb26..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -*.un~ -/node_modules/* diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License deleted file mode 100644 index 4804b7a..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2011 Debuggable Limited - -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. diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile deleted file mode 100644 index b4ff85a..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -SHELL := /bin/bash - -test: - @./test/run.js - -.PHONY: test - diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md deleted file mode 100644 index 5cb5b35..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md +++ /dev/null @@ -1,154 +0,0 @@ -# delayed-stream - -Buffers events from a stream until you are ready to handle them. - -## Installation - -``` bash -npm install delayed-stream -``` - -## Usage - -The following example shows how to write a http echo server that delays its -response by 1000 ms. - -``` javascript -var DelayedStream = require('delayed-stream'); -var http = require('http'); - -http.createServer(function(req, res) { - var delayed = DelayedStream.create(req); - - setTimeout(function() { - res.writeHead(200); - delayed.pipe(res); - }, 1000); -}); -``` - -If you are not using `Stream#pipe`, you can also manually release the buffered -events by calling `delayedStream.resume()`: - -``` javascript -var delayed = DelayedStream.create(req); - -setTimeout(function() { - // Emit all buffered events and resume underlaying source - delayed.resume(); -}, 1000); -``` - -## Implementation - -In order to use this meta stream properly, here are a few things you should -know about the implementation. - -### Event Buffering / Proxying - -All events of the `source` stream are hijacked by overwriting the `source.emit` -method. Until node implements a catch-all event listener, this is the only way. - -However, delayed-stream still continues to emit all events it captures on the -`source`, regardless of whether you have released the delayed stream yet or -not. - -Upon creation, delayed-stream captures all `source` events and stores them in -an internal event buffer. Once `delayedStream.release()` is called, all -buffered events are emitted on the `delayedStream`, and the event buffer is -cleared. After that, delayed-stream merely acts as a proxy for the underlaying -source. - -### Error handling - -Error events on `source` are buffered / proxied just like any other events. -However, `delayedStream.create` attaches a no-op `'error'` listener to the -`source`. This way you only have to handle errors on the `delayedStream` -object, rather than in two places. - -### Buffer limits - -delayed-stream provides a `maxDataSize` property that can be used to limit -the amount of data being buffered. In order to protect you from bad `source` -streams that don't react to `source.pause()`, this feature is enabled by -default. - -## API - -### DelayedStream.create(source, [options]) - -Returns a new `delayedStream`. Available options are: - -* `pauseStream` -* `maxDataSize` - -The description for those properties can be found below. - -### delayedStream.source - -The `source` stream managed by this object. This is useful if you are -passing your `delayedStream` around, and you still want to access properties -on the `source` object. - -### delayedStream.pauseStream = true - -Whether to pause the underlaying `source` when calling -`DelayedStream.create()`. Modifying this property afterwards has no effect. - -### delayedStream.maxDataSize = 1024 * 1024 - -The amount of data to buffer before emitting an `error`. - -If the underlaying source is emitting `Buffer` objects, the `maxDataSize` -refers to bytes. - -If the underlaying source is emitting JavaScript strings, the size refers to -characters. - -If you know what you are doing, you can set this property to `Infinity` to -disable this feature. You can also modify this property during runtime. - -### delayedStream.maxDataSize = 1024 * 1024 - -The amount of data to buffer before emitting an `error`. - -If the underlaying source is emitting `Buffer` objects, the `maxDataSize` -refers to bytes. - -If the underlaying source is emitting JavaScript strings, the size refers to -characters. - -If you know what you are doing, you can set this property to `Infinity` to -disable this feature. - -### delayedStream.dataSize = 0 - -The amount of data buffered so far. - -### delayedStream.readable - -An ECMA5 getter that returns the value of `source.readable`. - -### delayedStream.resume() - -If the `delayedStream` has not been released so far, `delayedStream.release()` -is called. - -In either case, `source.resume()` is called. - -### delayedStream.pause() - -Calls `source.pause()`. - -### delayedStream.pipe(dest) - -Calls `delayedStream.resume()` and then proxies the arguments to `source.pipe`. - -### delayedStream.release() - -Emits and clears all events that have been buffered up so far. This does not -resume the underlaying source, use `delayedStream.resume()` instead. - -## License - -delayed-stream is licensed under the MIT license. diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js deleted file mode 100644 index 7c10d48..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js +++ /dev/null @@ -1,99 +0,0 @@ -var Stream = require('stream').Stream; -var util = require('util'); - -module.exports = DelayedStream; -function DelayedStream() { - this.source = null; - this.dataSize = 0; - this.maxDataSize = 1024 * 1024; - this.pauseStream = true; - - this._maxDataSizeExceeded = false; - this._released = false; - this._bufferedEvents = []; -} -util.inherits(DelayedStream, Stream); - -DelayedStream.create = function(source, options) { - var delayedStream = new this(); - - options = options || {}; - for (var option in options) { - delayedStream[option] = options[option]; - } - - delayedStream.source = source; - - var realEmit = source.emit; - source.emit = function() { - delayedStream._handleEmit(arguments); - return realEmit.apply(source, arguments); - }; - - source.on('error', function() {}); - if (delayedStream.pauseStream) { - source.pause(); - } - - return delayedStream; -}; - -DelayedStream.prototype.__defineGetter__('readable', function() { - return this.source.readable; -}); - -DelayedStream.prototype.resume = function() { - if (!this._released) { - this.release(); - } - - this.source.resume(); -}; - -DelayedStream.prototype.pause = function() { - this.source.pause(); -}; - -DelayedStream.prototype.release = function() { - this._released = true; - - this._bufferedEvents.forEach(function(args) { - this.emit.apply(this, args); - }.bind(this)); - this._bufferedEvents = []; -}; - -DelayedStream.prototype.pipe = function() { - var r = Stream.prototype.pipe.apply(this, arguments); - this.resume(); - return r; -}; - -DelayedStream.prototype._handleEmit = function(args) { - if (this._released) { - this.emit.apply(this, args); - return; - } - - if (args[0] === 'data') { - this.dataSize += args[1].length; - this._checkIfMaxDataSizeExceeded(); - } - - this._bufferedEvents.push(args); -}; - -DelayedStream.prototype._checkIfMaxDataSizeExceeded = function() { - if (this._maxDataSizeExceeded) { - return; - } - - if (this.dataSize <= this.maxDataSize) { - return; - } - - this._maxDataSizeExceeded = true; - var message = - 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.' - this.emit('error', new Error(message)); -}; diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json deleted file mode 100644 index d394b92..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "author": { - "name": "Felix Geisendörfer", - "email": "felix@debuggable.com", - "url": "http://debuggable.com/" - }, - "name": "delayed-stream", - "description": "Buffers events from a stream until you are ready to handle them.", - "version": "0.0.5", - "homepage": "https://github.com/felixge/node-delayed-stream", - "repository": { - "type": "git", - "url": "git://github.com/felixge/node-delayed-stream.git" - }, - "main": "./lib/delayed_stream", - "engines": { - "node": ">=0.4.0" - }, - "dependencies": {}, - "devDependencies": { - "fake": "0.2.0", - "far": "0.0.1" - }, - "_npmUser": { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - "_id": "delayed-stream@0.0.5", - "optionalDependencies": {}, - "_engineSupported": true, - "_npmVersion": "1.1.24", - "_nodeVersion": "v0.8.1", - "_defaultsLoaded": true, - "dist": { - "shasum": "56f46a53506f656e1a549c63d8794c6cf8b6e1fc" - }, - "_from": "delayed-stream@0.0.5" -} diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js deleted file mode 100644 index 4d71b8a..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js +++ /dev/null @@ -1,6 +0,0 @@ -var common = module.exports; - -common.DelayedStream = require('..'); -common.assert = require('assert'); -common.fake = require('fake'); -common.PORT = 49252; diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js deleted file mode 100644 index 9ecad5b..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js +++ /dev/null @@ -1,38 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var DelayedStream = common.DelayedStream; -var http = require('http'); - -var UPLOAD = new Buffer(10 * 1024 * 1024); - -var server = http.createServer(function(req, res) { - var delayed = DelayedStream.create(req, {maxDataSize: UPLOAD.length}); - - setTimeout(function() { - res.writeHead(200); - delayed.pipe(res); - }, 10); -}); -server.listen(common.PORT, function() { - var request = http.request({ - method: 'POST', - port: common.PORT, - }); - - request.write(UPLOAD); - request.end(); - - request.on('response', function(res) { - var received = 0; - res - .on('data', function(chunk) { - received += chunk.length; - }) - .on('end', function() { - assert.equal(received, UPLOAD.length); - server.close(); - }); - }); -}); - - diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js deleted file mode 100644 index 6f417f3..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js +++ /dev/null @@ -1,21 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testAutoPause() { - var source = new Stream(); - - fake.expect(source, 'pause', 1); - var delayedStream = DelayedStream.create(source); - fake.verify(); -})(); - -(function testDisableAutoPause() { - var source = new Stream(); - fake.expect(source, 'pause', 0); - - var delayedStream = DelayedStream.create(source, {pauseStream: false}); - fake.verify(); -})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js deleted file mode 100644 index b50c397..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js +++ /dev/null @@ -1,14 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testDelayEventsUntilResume() { - var source = new Stream(); - var delayedStream = DelayedStream.create(source, {pauseStream: false}); - - fake.expect(source, 'pause'); - delayedStream.pause(); - fake.verify(); -})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js deleted file mode 100644 index fc4047e..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js +++ /dev/null @@ -1,48 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testDelayEventsUntilResume() { - var source = new Stream(); - var delayedStream = DelayedStream.create(source, {pauseStream: false}); - - // delayedStream must not emit until we resume - fake.expect(delayedStream, 'emit', 0); - - // but our original source must emit - var params = []; - source.on('foo', function(param) { - params.push(param); - }); - - source.emit('foo', 1); - source.emit('foo', 2); - - // Make sure delayedStream did not emit, and source did - assert.deepEqual(params, [1, 2]); - fake.verify(); - - // After resume, delayedStream must playback all events - fake - .stub(delayedStream, 'emit') - .times(Infinity) - .withArg(1, 'newListener'); - fake.expect(delayedStream, 'emit', ['foo', 1]); - fake.expect(delayedStream, 'emit', ['foo', 2]); - fake.expect(source, 'resume'); - - delayedStream.resume(); - fake.verify(); - - // Calling resume again will delegate to source - fake.expect(source, 'resume'); - delayedStream.resume(); - fake.verify(); - - // Emitting more events directly leads to them being emitted - fake.expect(delayedStream, 'emit', ['foo', 3]); - source.emit('foo', 3); - fake.verify(); -})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js deleted file mode 100644 index a9d35e7..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js +++ /dev/null @@ -1,15 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testHandleSourceErrors() { - var source = new Stream(); - var delayedStream = DelayedStream.create(source, {pauseStream: false}); - - // We deal with this by attaching a no-op listener to 'error' on the source - // when creating a new DelayedStream. This way error events on the source - // won't throw. - source.emit('error', new Error('something went wrong')); -})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js deleted file mode 100644 index 7638a2b..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js +++ /dev/null @@ -1,18 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testMaxDataSize() { - var source = new Stream(); - var delayedStream = DelayedStream.create(source, {maxDataSize: 1024, pauseStream: false}); - - source.emit('data', new Buffer(1024)); - - fake - .expect(delayedStream, 'emit') - .withArg(1, 'error'); - source.emit('data', new Buffer(1)); - fake.verify(); -})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js deleted file mode 100644 index 7d312ab..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js +++ /dev/null @@ -1,13 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testPipeReleases() { - var source = new Stream(); - var delayedStream = DelayedStream.create(source, {pauseStream: false}); - - fake.expect(delayedStream, 'resume'); - delayedStream.pipe(new Stream()); -})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js deleted file mode 100644 index d436163..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js +++ /dev/null @@ -1,13 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testProxyReadableProperty() { - var source = new Stream(); - var delayedStream = DelayedStream.create(source, {pauseStream: false}); - - source.readable = fake.value('source.readable'); - assert.strictEqual(delayedStream.readable, source.readable); -})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js deleted file mode 100755 index 0bb8e82..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env node -var far = require('far').create(); - -far.add(__dirname); -far.include(/test-.*\.js$/); - -far.execute(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json deleted file mode 100644 index 7bb0fcf..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "author": { - "name": "Felix Geisendörfer", - "email": "felix@debuggable.com", - "url": "http://debuggable.com/" - }, - "name": "combined-stream", - "description": "A stream that emits multiple other streams one after another.", - "version": "0.0.3", - "homepage": "https://github.com/felixge/node-combined-stream", - "repository": { - "type": "git", - "url": "git://github.com/felixge/node-combined-stream.git" - }, - "main": "./lib/combined_stream", - "engines": { - "node": "*" - }, - "dependencies": { - "delayed-stream": "0.0.5" - }, - "devDependencies": { - "far": "0.0.1" - }, - "_npmUser": { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - "_id": "combined-stream@0.0.3", - "optionalDependencies": {}, - "_engineSupported": true, - "_npmVersion": "1.1.24", - "_nodeVersion": "v0.8.1", - "_defaultsLoaded": true, - "dist": { - "shasum": "c41c9899277b587901bb6ce4bf458b94693afafa" - }, - "_from": "combined-stream@0.0.3" -} diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/common.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/common.js deleted file mode 100644 index aa9ab3a..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/common.js +++ /dev/null @@ -1,12 +0,0 @@ -var common = module.exports; - -var path = require('path'); -var root = path.join(__dirname, '..'); - -common.dir = { - fixture: root + '/test/fixture', - tmp: root + '/test/tmp', -}; - -common.CombinedStream = require(root); -common.assert = require('assert'); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file1.txt b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file1.txt deleted file mode 100644 index 50e0218..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file1.txt +++ /dev/null @@ -1,256 +0,0 @@ -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file2.txt b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file2.txt deleted file mode 100644 index da1d821..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file2.txt +++ /dev/null @@ -1,256 +0,0 @@ -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-callback-streams.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-callback-streams.js deleted file mode 100644 index 44ecaba..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-callback-streams.js +++ /dev/null @@ -1,27 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var CombinedStream = common.CombinedStream; -var fs = require('fs'); - -var FILE1 = common.dir.fixture + '/file1.txt'; -var FILE2 = common.dir.fixture + '/file2.txt'; -var EXPECTED = fs.readFileSync(FILE1) + fs.readFileSync(FILE2); - -(function testDelayedStreams() { - var combinedStream = CombinedStream.create(); - combinedStream.append(function(next) { - next(fs.createReadStream(FILE1)); - }); - combinedStream.append(function(next) { - next(fs.createReadStream(FILE2)); - }); - - var tmpFile = common.dir.tmp + '/combined.txt'; - var dest = fs.createWriteStream(tmpFile); - combinedStream.pipe(dest); - - dest.on('end', function() { - var written = fs.readFileSync(tmpFile, 'utf8'); - assert.strictEqual(written, EXPECTED); - }); -})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-data-size.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-data-size.js deleted file mode 100644 index e3fbd18..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-data-size.js +++ /dev/null @@ -1,34 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var CombinedStream = common.CombinedStream; - -(function testDataSizeGetter() { - var combinedStream = CombinedStream.create(); - - assert.strictEqual(combinedStream.dataSize, 0); - - // Test one stream - combinedStream._streams.push({dataSize: 10}); - combinedStream._updateDataSize(); - assert.strictEqual(combinedStream.dataSize, 10); - - // Test two streams - combinedStream._streams.push({dataSize: 23}); - combinedStream._updateDataSize(); - assert.strictEqual(combinedStream.dataSize, 33); - - // Test currentStream - combinedStream._currentStream = {dataSize: 20}; - combinedStream._updateDataSize(); - assert.strictEqual(combinedStream.dataSize, 53); - - // Test currentStream without dataSize - combinedStream._currentStream = {}; - combinedStream._updateDataSize(); - assert.strictEqual(combinedStream.dataSize, 33); - - // Test stream function - combinedStream._streams.push(function() {}); - combinedStream._updateDataSize(); - assert.strictEqual(combinedStream.dataSize, 33); -})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams-and-buffers-and-strings.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams-and-buffers-and-strings.js deleted file mode 100644 index c678575..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams-and-buffers-and-strings.js +++ /dev/null @@ -1,38 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var CombinedStream = common.CombinedStream; -var fs = require('fs'); - -var FILE1 = common.dir.fixture + '/file1.txt'; -var BUFFER = new Buffer('Bacon is delicious'); -var FILE2 = common.dir.fixture + '/file2.txt'; -var STRING = 'The € kicks the $\'s ass!'; - -var EXPECTED = - fs.readFileSync(FILE1) - + BUFFER - + fs.readFileSync(FILE2) - + STRING; -var GOT; - -(function testDelayedStreams() { - var combinedStream = CombinedStream.create(); - combinedStream.append(fs.createReadStream(FILE1)); - combinedStream.append(BUFFER); - combinedStream.append(fs.createReadStream(FILE2)); - combinedStream.append(function(next) { - next(STRING); - }); - - var tmpFile = common.dir.tmp + '/combined-file1-buffer-file2-string.txt'; - var dest = fs.createWriteStream(tmpFile); - combinedStream.pipe(dest); - - dest.on('close', function() { - GOT = fs.readFileSync(tmpFile, 'utf8'); - }); -})(); - -process.on('exit', function() { - assert.strictEqual(GOT, EXPECTED); -}); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams.js deleted file mode 100644 index 263cfdf..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams.js +++ /dev/null @@ -1,35 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var CombinedStream = common.CombinedStream; -var fs = require('fs'); - -var FILE1 = common.dir.fixture + '/file1.txt'; -var FILE2 = common.dir.fixture + '/file2.txt'; -var EXPECTED = fs.readFileSync(FILE1) + fs.readFileSync(FILE2); -var GOT; - -(function testDelayedStreams() { - var combinedStream = CombinedStream.create(); - combinedStream.append(fs.createReadStream(FILE1)); - combinedStream.append(fs.createReadStream(FILE2)); - - var stream1 = combinedStream._streams[0]; - var stream2 = combinedStream._streams[1]; - - stream1.on('end', function() { - assert.equal(stream2.dataSize, 0); - }); - - var tmpFile = common.dir.tmp + '/combined.txt'; - var dest = fs.createWriteStream(tmpFile); - combinedStream.pipe(dest); - - dest.on('close', function() { - GOT = fs.readFileSync(tmpFile, 'utf8'); - }); -})(); - -process.on('exit', function() { - console.error(GOT.length, EXPECTED.length); - assert.strictEqual(GOT, EXPECTED); -}); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-max-data-size.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-max-data-size.js deleted file mode 100644 index 25f47a4..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-max-data-size.js +++ /dev/null @@ -1,24 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var CombinedStream = common.CombinedStream; -var fs = require('fs'); - -var FILE1 = common.dir.fixture + '/file1.txt'; -var FILE2 = common.dir.fixture + '/file2.txt'; -var EXPECTED = fs.readFileSync(FILE1) + fs.readFileSync(FILE2); - -(function testDelayedStreams() { - var combinedStream = CombinedStream.create({pauseStreams: false, maxDataSize: 20736}); - combinedStream.append(fs.createReadStream(FILE1)); - combinedStream.append(fs.createReadStream(FILE2)); - - var gotErr = null; - combinedStream.on('error', function(err) { - gotErr = err; - }); - - process.on('exit', function() { - assert.ok(gotErr); - assert.ok(gotErr.message.match(/bytes/)); - }); -})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-unpaused-streams.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-unpaused-streams.js deleted file mode 100644 index 30a3a6f..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-unpaused-streams.js +++ /dev/null @@ -1,30 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var CombinedStream = common.CombinedStream; -var fs = require('fs'); - -var FILE1 = common.dir.fixture + '/file1.txt'; -var FILE2 = common.dir.fixture + '/file2.txt'; -var EXPECTED = fs.readFileSync(FILE1) + fs.readFileSync(FILE2); - -(function testDelayedStreams() { - var combinedStream = CombinedStream.create({pauseStreams: false}); - combinedStream.append(fs.createReadStream(FILE1)); - combinedStream.append(fs.createReadStream(FILE2)); - - var stream1 = combinedStream._streams[0]; - var stream2 = combinedStream._streams[1]; - - stream1.on('end', function() { - assert.ok(stream2.dataSize > 0); - }); - - var tmpFile = common.dir.tmp + '/combined.txt'; - var dest = fs.createWriteStream(tmpFile); - combinedStream.pipe(dest); - - dest.on('end', function() { - var written = fs.readFileSync(tmpFile, 'utf8'); - assert.strictEqual(written, EXPECTED); - }); -})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/run.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/run.js deleted file mode 100755 index 0bb8e82..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/run.js +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env node -var far = require('far').create(); - -far.add(__dirname); -far.include(/test-.*\.js$/); - -far.execute(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/package.json b/node_modules/nodetime/node_modules/request/node_modules/form-data/package.json deleted file mode 100644 index 1948a5e..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "author": { - "name": "Felix Geisendörfer", - "email": "felix@debuggable.com", - "url": "http://debuggable.com/" - }, - "name": "form-data", - "description": "A module to create readable `\"multipart/form-data\"` streams. Can be used to submit forms and file uploads to other web applications.", - "version": "0.0.3", - "repository": { - "type": "git", - "url": "git://github.com/felixge/node-form-data.git" - }, - "main": "./lib/form_data", - "engines": { - "node": "*" - }, - "dependencies": { - "combined-stream": "0.0.3", - "mime": "~1.2.2", - "async": "~0.1.9" - }, - "devDependencies": { - "fake": "0.2.1", - "far": "0.0.1", - "formidable": "1.0.2", - "request": "~2.9.203" - }, - "_npmUser": { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - "_id": "form-data@0.0.3", - "optionalDependencies": {}, - "_engineSupported": true, - "_npmVersion": "1.1.24", - "_nodeVersion": "v0.8.1", - "_defaultsLoaded": true, - "dist": { - "shasum": "6eea17b45790b42d779a1d581d1b3600fe0c7c0d" - }, - "_from": "form-data" -} diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/common.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/common.js deleted file mode 100644 index 8a26482..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/common.js +++ /dev/null @@ -1,14 +0,0 @@ -var common = module.exports; -var path = require('path'); - -var rootDir = path.join(__dirname, '..'); -common.dir = { - lib: rootDir + '/lib', - fixture: rootDir + '/test/fixture', - tmp: rootDir + '/test/tmp', -}; - -common.assert = require('assert'); -common.fake = require('fake'); - -common.port = 8432; diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/fixture/bacon.txt b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/fixture/bacon.txt deleted file mode 100644 index 9804bbd..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/fixture/bacon.txt +++ /dev/null @@ -1 +0,0 @@ -Bacon is delicious. diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/fixture/unicycle.jpg b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/fixture/unicycle.jpg deleted file mode 100644 index 7cea4dd71dc41cd51c84bfcec6b3e65c15a58507..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19806 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 diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-form-get-length.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-form-get-length.js deleted file mode 100644 index 44d3b4d..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-form-get-length.js +++ /dev/null @@ -1,93 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var FormData = require(common.dir.lib + '/form_data'); -var fake = require('fake').create(); -var fs = require('fs'); - -(function testEmptyForm() { - var form = new FormData(); - var callback = fake.callback(arguments.callee.name + '-getLength'); - var calls = fake.expectAnytime(callback, [null, 0]).calls; - - form.getLength(callback); - - // Make sure our response is async - assert.strictEqual(calls.length, 0); -})(); - -(function testUtf8String() { - var FIELD = 'my_field'; - var VALUE = 'May the € be with you'; - - var form = new FormData(); - form.append(FIELD, VALUE); - var callback = fake.callback(arguments.callee.name + '-getLength'); - - var expectedLength = - form._overheadLength + - Buffer.byteLength(VALUE) + - form._lastBoundary().length; - - fake.expectAnytime(callback, [null, expectedLength]); - form.getLength(callback); -})(); - -(function testBuffer() { - var FIELD = 'my_field'; - var VALUE = new Buffer(23); - - var form = new FormData(); - form.append(FIELD, VALUE); - var callback = fake.callback(arguments.callee.name + '-getLength'); - - var expectedLength = - form._overheadLength + - VALUE.length + - form._lastBoundary().length; - - fake.expectAnytime(callback, [null, expectedLength]); - form.getLength(callback); -})(); - - -(function testStringFileBufferFile() { - var fields = [ - { - name: 'my_field', - value: 'Test 123', - }, - { - name: 'my_image', - value: fs.createReadStream(common.dir.fixture + '/unicycle.jpg'), - }, - { - name: 'my_buffer', - value: new Buffer('123'), - }, - { - name: 'my_txt', - value: fs.createReadStream(common.dir.fixture + '/bacon.txt'), - }, - ]; - - var form = new FormData(); - var expectedLength = 0; - - fields.forEach(function(field) { - form.append(field.name, field.value); - if (field.value.path) { - var stat = fs.statSync(field.value.path); - expectedLength += stat.size; - } else { - expectedLength += field.value.length; - } - }); - - expectedLength += form._overheadLength + form._lastBoundary().length; - - var callback = fake.callback(arguments.callee.name + '-getLength'); - fake.expectAnytime(callback, [null, expectedLength]); - form.getLength(callback); -})(); - - diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-get-boundary.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-get-boundary.js deleted file mode 100644 index 6dc2fb2..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-get-boundary.js +++ /dev/null @@ -1,18 +0,0 @@ -var common = require('../common'); -var assert = common.assert; - -var FormData = require(common.dir.lib + '/form_data'); - -(function testOneBoundaryPerForm() { - var form = new FormData(); - var boundary = form.getBoundary(); - - assert.equal(boundary, form.getBoundary()); - assert.equal(boundary.length, 50); -})(); - -(function testUniqueBoundaryPerForm() { - var formA = new FormData(); - var formB = new FormData(); - assert.notEqual(formA.getBoundary(), formB.getBoundary()); -})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-http-response.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-http-response.js deleted file mode 100644 index 8e183fe..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-http-response.js +++ /dev/null @@ -1,121 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var http = require('http'); -var path = require('path'); -var mime = require('mime'); -var request = require('request'); -var parseUrl = require('url').parse; -var fs = require('fs'); -var FormData = require(common.dir.lib + '/form_data'); -var IncomingForm = require('formidable').IncomingForm; - -var remoteFile = 'http://nodejs.org/images/logo.png'; - -var FIELDS; -var server; - -var parsedUrl = parseUrl(remoteFile) - , options = { - method: 'get', - port: parsedUrl.port || 80, - path: parsedUrl.pathname, - host: parsedUrl.hostname - } - ; - -http.request(options, function(res) { - - FIELDS = [ - {name: 'my_field', value: 'my_value'}, - {name: 'my_buffer', value: new Buffer([1, 2, 3])}, - {name: 'remote_file', value: res } - ]; - - var form = new FormData(); - FIELDS.forEach(function(field) { - form.append(field.name, field.value); - }); - - server.listen(common.port, function() { - - form.submit('http://localhost:' + common.port + '/', function(err, res) { - - if (err) { - throw err; - } - - assert.strictEqual(res.statusCode, 200); - server.close(); - }); - - }); - - -}).end(); - -server = http.createServer(function(req, res) { - - // formidable is broken so let's do it manual way - // - // var form = new IncomingForm(); - // form.uploadDir = common.dir.tmp; - // form.parse(req); - // form - // .on('field', function(name, value) { - // var field = FIELDS.shift(); - // assert.strictEqual(name, field.name); - // assert.strictEqual(value, field.value+''); - // }) - // .on('file', function(name, file) { - // var field = FIELDS.shift(); - // assert.strictEqual(name, field.name); - // assert.strictEqual(file.name, path.basename(field.value.path)); - // // mime.lookup file.NAME == 'my_file' ? - // assert.strictEqual(file.type, mime.lookup(file.name)); - // }) - // .on('end', function() { - // res.writeHead(200); - // res.end('done'); - // }); - - // temp workaround - var data = ''; - req.setEncoding('utf8'); - - req.on('data', function(d) { - data += d; - }); - - req.on('end', function() { - - // check for the fields' traces - - // 1st field : my_field - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 2nd field : my_buffer - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 3rd field : remote_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(remoteFile)+'"') != -1 ); - // check for http://nodejs.org/images/logo.png traces - assert.ok( data.indexOf('ImageReady') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(remoteFile) ) != -1 ); - - res.writeHead(200); - res.end('done'); - - }); - -}); - - -process.on('exit', function() { - assert.strictEqual(FIELDS.length, 0); -}); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-pipe.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-pipe.js deleted file mode 100644 index acc39df..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-pipe.js +++ /dev/null @@ -1,111 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var http = require('http'); -var path = require('path'); -var mime = require('mime'); -var request = require('request'); -var fs = require('fs'); -var FormData = require(common.dir.lib + '/form_data'); -var IncomingForm = require('formidable').IncomingForm; - -var remoteFile = 'http://nodejs.org/images/logo.png'; - -var FIELDS = [ - {name: 'my_field', value: 'my_value'}, - {name: 'my_buffer', value: new Buffer([1, 2, 3])}, - {name: 'my_file', value: fs.createReadStream(common.dir.fixture + '/unicycle.jpg')}, - {name: 'remote_file', value: request(remoteFile) } -]; - -var server = http.createServer(function(req, res) { - - // formidable is broken so let's do it manual way - // - // var form = new IncomingForm(); - // form.uploadDir = common.dir.tmp; - // form.parse(req); - // form - // .on('field', function(name, value) { - // var field = FIELDS.shift(); - // assert.strictEqual(name, field.name); - // assert.strictEqual(value, field.value+''); - // }) - // .on('file', function(name, file) { - // var field = FIELDS.shift(); - // assert.strictEqual(name, field.name); - // assert.strictEqual(file.name, path.basename(field.value.path)); - // assert.strictEqual(file.type, mime.lookup(file.name)); - // }) - // .on('end', function() { - // res.writeHead(200); - // res.end('done'); - // }); - - // temp workaround - var data = ''; - req.setEncoding('utf8'); - - req.on('data', function(d) { - data += d; - }); - - req.on('end', function() { - // check for the fields' traces - - // 1st field : my_field - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 2nd field : my_buffer - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 3rd field : my_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for unicycle.jpg traces - assert.ok( data.indexOf('2005:06:21 01:44:12') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(field.value.path) ) != -1 ); - - // 4th field : remote_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for http://nodejs.org/images/logo.png traces - assert.ok( data.indexOf('ImageReady') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(remoteFile) ) != -1 ); - - res.writeHead(200); - res.end('done'); - - }); - - -}); - -server.listen(common.port, function() { - var form = new FormData(); - FIELDS.forEach(function(field) { - form.append(field.name, field.value); - }); - - var request = http.request({ - method: 'post', - port: common.port, - path: '/upload', - headers: form.getHeaders() - }); - - form.pipe(request); - - request.on('response', function(res) { - server.close(); - }); -}); - -process.on('exit', function() { - assert.strictEqual(FIELDS.length, 0); -}); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-submit.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-submit.js deleted file mode 100644 index c40e88f..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-submit.js +++ /dev/null @@ -1,107 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var http = require('http'); -var path = require('path'); -var mime = require('mime'); -var request = require('request'); -var fs = require('fs'); -var FormData = require(common.dir.lib + '/form_data'); -var IncomingForm = require('formidable').IncomingForm; - -var remoteFile = 'http://nodejs.org/images/logo.png'; - -var FIELDS = [ - {name: 'my_field', value: 'my_value'}, - {name: 'my_buffer', value: new Buffer([1, 2, 3])}, - {name: 'my_file', value: fs.createReadStream(common.dir.fixture + '/unicycle.jpg') }, - {name: 'remote_file', value: request(remoteFile) } -]; - -var server = http.createServer(function(req, res) { - - // formidable is broken so let's do it manual way - // - // var form = new IncomingForm(); - // form.uploadDir = common.dir.tmp; - // form.parse(req); - // form - // .on('field', function(name, value) { - // var field = FIELDS.shift(); - // assert.strictEqual(name, field.name); - // assert.strictEqual(value, field.value+''); - // }) - // .on('file', function(name, file) { - // var field = FIELDS.shift(); - // assert.strictEqual(name, field.name); - // assert.strictEqual(file.name, path.basename(field.value.path)); - // // mime.lookup file.NAME == 'my_file' ? - // assert.strictEqual(file.type, mime.lookup(file.name)); - // }) - // .on('end', function() { - // res.writeHead(200); - // res.end('done'); - // }); - - // temp workaround - var data = ''; - req.setEncoding('utf8'); - req.on('data', function(d) { - data += d; - }); - req.on('end', function() { - // check for the fields' traces - - // 1st field : my_field - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 2nd field : my_buffer - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 3rd field : my_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for unicycle.jpg traces - assert.ok( data.indexOf('2005:06:21 01:44:12') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(field.value.path) ) != -1 ); - - // 4th field : remote_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for http://nodejs.org/images/logo.png traces - assert.ok( data.indexOf('ImageReady') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(remoteFile) ) != -1 ); - - res.writeHead(200); - res.end('done'); - - }); - -}); - -server.listen(common.port, function() { - var form = new FormData(); - FIELDS.forEach(function(field) { - form.append(field.name, field.value); - }); - - form.submit('http://localhost:' + common.port + '/', function(err, res) { - - if (err) { - throw err; - } - - assert.strictEqual(res.statusCode, 200); - server.close(); - }); - -}); - -process.on('exit', function() { - assert.strictEqual(FIELDS.length, 0); -}); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/run.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/run.js deleted file mode 100755 index 0bb8e82..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/run.js +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env node -var far = require('far').create(); - -far.add(__dirname); -far.include(/test-.*\.js$/); - -far.execute(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/mime/LICENSE b/node_modules/nodetime/node_modules/request/node_modules/mime/LICENSE deleted file mode 100644 index 451fc45..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/mime/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2010 Benjamin Thomas, Robert Kieffer - -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. diff --git a/node_modules/nodetime/node_modules/request/node_modules/mime/README.md b/node_modules/nodetime/node_modules/request/node_modules/mime/README.md deleted file mode 100644 index b90552a..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/mime/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# mime - -Comprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community. - -## Install - -Install with [npm](http://github.com/isaacs/npm): - - npm install mime - -## API - Queries - -### mime.lookup(path) -Get the mime type associated with a file. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g. - - var mime = require('mime'); - - mime.lookup('/path/to/file.txt'); // => 'text/plain' - mime.lookup('file.txt'); // => 'text/plain' - mime.lookup('.TXT'); // => 'text/plain' - mime.lookup('htm'); // => 'text/html' - -### mime.extension(type) -Get the default extension for `type` - - mime.extension('text/html'); // => 'html' - mime.extension('application/octet-stream'); // => 'bin' - -### mime.charsets.lookup() - -Map mime-type to charset - - mime.charsets.lookup('text/plain'); // => 'UTF-8' - -(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.) - -## API - Defining Custom Types - -The following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/broofa/node-mime/wiki/Requesting-New-Types). - -### mime.define() - -Add custom mime/extension mappings - - mime.define({ - 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'], - 'application/x-my-type': ['x-mt', 'x-mtt'], - // etc ... - }); - - mime.lookup('x-sft'); // => 'text/x-some-format' - -The first entry in the extensions array is returned by `mime.extension()`. E.g. - - mime.extension('text/x-some-format'); // => 'x-sf' - -### mime.load(filepath) - -Load mappings from an Apache ".types" format file - - mime.load('./my_project.types'); - -The .types file format is simple - See the `types` dir for examples. diff --git a/node_modules/nodetime/node_modules/request/node_modules/mime/mime.js b/node_modules/nodetime/node_modules/request/node_modules/mime/mime.js deleted file mode 100644 index 1e00585..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/mime/mime.js +++ /dev/null @@ -1,104 +0,0 @@ -var path = require('path'); -var fs = require('fs'); - -function Mime() { - // Map of extension -> mime type - this.types = Object.create(null); - - // Map of mime type -> extension - this.extensions = Object.create(null); -} - -/** - * Define mimetype -> extension mappings. Each key is a mime-type that maps - * to an array of extensions associated with the type. The first extension is - * used as the default extension for the type. - * - * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']}); - * - * @param map (Object) type definitions - */ -Mime.prototype.define = function (map) { - for (var type in map) { - var exts = map[type]; - - for (var i = 0; i < exts.length; i++) { - this.types[exts[i]] = type; - } - - // Default extension is the first one we encounter - if (!this.extensions[type]) { - this.extensions[type] = exts[0]; - } - } -}; - -/** - * Load an Apache2-style ".types" file - * - * This may be called multiple times (it's expected). Where files declare - * overlapping types/extensions, the last file wins. - * - * @param file (String) path of file to load. - */ -Mime.prototype.load = function(file) { - // Read file and split into lines - var map = {}, - content = fs.readFileSync(file, 'ascii'), - lines = content.split(/[\r\n]+/); - - lines.forEach(function(line) { - // Clean up whitespace/comments, and split into fields - var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/); - map[fields.shift()] = fields; - }); - - this.define(map); -}; - -/** - * Lookup a mime type based on extension - */ -Mime.prototype.lookup = function(path, fallback) { - var ext = path.replace(/.*[\.\/]/, '').toLowerCase(); - - return this.types[ext] || fallback || this.default_type; -}; - -/** - * Return file extension associated with a mime type - */ -Mime.prototype.extension = function(mimeType) { - return this.extensions[mimeType]; -}; - -// Default instance -var mime = new Mime(); - -// Load local copy of -// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types -mime.load(path.join(__dirname, 'types/mime.types')); - -// Load additional types from node.js community -mime.load(path.join(__dirname, 'types/node.types')); - -// Default type -mime.default_type = mime.lookup('bin'); - -// -// Additional API specific to the default instance -// - -mime.Mime = Mime; - -/** - * Lookup a charset based on mime type. - */ -mime.charsets = { - lookup: function(mimeType, fallback) { - // Assume text types are utf8 - return (/^text\//).test(mimeType) ? 'UTF-8' : fallback; - } -} - -module.exports = mime; diff --git a/node_modules/nodetime/node_modules/request/node_modules/mime/package.json b/node_modules/nodetime/node_modules/request/node_modules/mime/package.json deleted file mode 100644 index 06e2ee5..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/mime/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "author": { - "name": "Robert Kieffer", - "email": "robert@broofa.com", - "url": "http://github.com/broofa" - }, - "contributors": [ - { - "name": "Benjamin Thomas", - "email": "benjamin@benjaminthomas.org", - "url": "http://github.com/bentomas" - } - ], - "dependencies": {}, - "description": "A comprehensive library for mime-type mapping", - "devDependencies": {}, - "keywords": [ - "util", - "mime" - ], - "main": "mime.js", - "name": "mime", - "repository": { - "url": "git://github.com/broofa/node-mime.git", - "type": "git" - }, - "version": "1.2.7", - "_npmUser": { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - "_id": "mime@1.2.7", - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "_engineSupported": true, - "_npmVersion": "1.1.24", - "_nodeVersion": "v0.8.1", - "_defaultsLoaded": true, - "_from": "mime" -} diff --git a/node_modules/nodetime/node_modules/request/node_modules/mime/test.js b/node_modules/nodetime/node_modules/request/node_modules/mime/test.js deleted file mode 100644 index cbad034..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/mime/test.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Usage: node test.js - */ - -var mime = require('./mime'); -var assert = require('assert'); - -function eq(a, b) { - console.log('Test: ' + a + ' === ' + b); - assert.strictEqual.apply(null, arguments); -} - -console.log(Object.keys(mime.extensions).length + ' types'); -console.log(Object.keys(mime.types).length + ' extensions\n'); - -// -// Test mime lookups -// - -eq('text/plain', mime.lookup('text.txt')); -eq('text/plain', mime.lookup('.text.txt')); -eq('text/plain', mime.lookup('.txt')); -eq('text/plain', mime.lookup('txt')); -eq('application/octet-stream', mime.lookup('text.nope')); -eq('fallback', mime.lookup('text.fallback', 'fallback')); -eq('application/octet-stream', mime.lookup('constructor')); -eq('text/plain', mime.lookup('TEXT.TXT')); -eq('text/event-stream', mime.lookup('text/event-stream')); -eq('application/x-web-app-manifest+json', mime.lookup('text.webapp')); - -// -// Test extensions -// - -eq('txt', mime.extension(mime.types.text)); -eq('html', mime.extension(mime.types.htm)); -eq('bin', mime.extension('application/octet-stream')); -eq(undefined, mime.extension('constructor')); - -// -// Test node types -// - -eq('application/octet-stream', mime.lookup('file.buffer')); -eq('audio/mp4', mime.lookup('file.m4a')); - -// -// Test charsets -// - -eq('UTF-8', mime.charsets.lookup('text/plain')); -eq(undefined, mime.charsets.lookup(mime.types.js)); -eq('fallback', mime.charsets.lookup('application/octet-stream', 'fallback')); - -console.log('\nOK'); diff --git a/node_modules/nodetime/node_modules/request/node_modules/mime/types/mime.types b/node_modules/nodetime/node_modules/request/node_modules/mime/types/mime.types deleted file mode 100644 index b90b165..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/mime/types/mime.types +++ /dev/null @@ -1,1588 +0,0 @@ -# This file maps Internet media types to unique file extension(s). -# Although created for httpd, this file is used by many software systems -# and has been placed in the public domain for unlimited redisribution. -# -# The table below contains both registered and (common) unregistered types. -# A type that has no unique extension can be ignored -- they are listed -# here to guide configurations toward known types and to make it easier to -# identify "new" types. File extensions are also commonly used to indicate -# content languages and encodings, so choose them carefully. -# -# Internet media types should be registered as described in RFC 4288. -# The registry is at . -# -# MIME type (lowercased) Extensions -# ============================================ ========== -# application/1d-interleaved-parityfec -# application/3gpp-ims+xml -# application/activemessage -application/andrew-inset ez -# application/applefile -application/applixware aw -application/atom+xml atom -application/atomcat+xml atomcat -# application/atomicmail -application/atomsvc+xml atomsvc -# application/auth-policy+xml -# application/batch-smtp -# application/beep+xml -# application/calendar+xml -# application/cals-1840 -# application/ccmp+xml -application/ccxml+xml ccxml -application/cdmi-capability cdmia -application/cdmi-container cdmic -application/cdmi-domain cdmid -application/cdmi-object cdmio -application/cdmi-queue cdmiq -# application/cea-2018+xml -# application/cellml+xml -# application/cfw -# application/cnrp+xml -# application/commonground -# application/conference-info+xml -# application/cpl+xml -# application/csta+xml -# application/cstadata+xml -application/cu-seeme cu -# application/cybercash -application/davmount+xml davmount -# application/dca-rft -# application/dec-dx -# application/dialog-info+xml -# application/dicom -# application/dns -application/docbook+xml dbk -# application/dskpp+xml -application/dssc+der dssc -application/dssc+xml xdssc -# application/dvcs -application/ecmascript ecma -# application/edi-consent -# application/edi-x12 -# application/edifact -application/emma+xml emma -# application/epp+xml -application/epub+zip epub -# application/eshop -# application/example -application/exi exi -# application/fastinfoset -# application/fastsoap -# application/fits -application/font-tdpfr pfr -# application/framework-attributes+xml -application/gml+xml gml -application/gpx+xml gpx -application/gxf gxf -# application/h224 -# application/held+xml -# application/http -application/hyperstudio stk -# application/ibe-key-request+xml -# application/ibe-pkg-reply+xml -# application/ibe-pp-data -# application/iges -# application/im-iscomposing+xml -# application/index -# application/index.cmd -# application/index.obj -# application/index.response -# application/index.vnd -application/inkml+xml ink inkml -# application/iotp -application/ipfix ipfix -# application/ipp -# application/isup -application/java-archive jar -application/java-serialized-object ser -application/java-vm class -application/javascript js -application/json json -application/jsonml+json jsonml -# application/kpml-request+xml -# application/kpml-response+xml -application/lost+xml lostxml -application/mac-binhex40 hqx -application/mac-compactpro cpt -# application/macwriteii -application/mads+xml mads -application/marc mrc -application/marcxml+xml mrcx -application/mathematica ma nb mb -# application/mathml-content+xml -# application/mathml-presentation+xml -application/mathml+xml mathml -# application/mbms-associated-procedure-description+xml -# application/mbms-deregister+xml -# application/mbms-envelope+xml -# application/mbms-msk+xml -# application/mbms-msk-response+xml -# application/mbms-protection-description+xml -# application/mbms-reception-report+xml -# application/mbms-register+xml -# application/mbms-register-response+xml -# application/mbms-user-service-description+xml -application/mbox mbox -# application/media_control+xml -application/mediaservercontrol+xml mscml -application/metalink+xml metalink -application/metalink4+xml meta4 -application/mets+xml mets -# application/mikey -application/mods+xml mods -# application/moss-keys -# application/moss-signature -# application/mosskey-data -# application/mosskey-request -application/mp21 m21 mp21 -application/mp4 mp4s -# application/mpeg4-generic -# application/mpeg4-iod -# application/mpeg4-iod-xmt -# application/msc-ivr+xml -# application/msc-mixer+xml -application/msword doc dot -application/mxf mxf -# application/nasdata -# application/news-checkgroups -# application/news-groupinfo -# application/news-transmission -# application/nss -# application/ocsp-request -# application/ocsp-response -application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy -application/oda oda -application/oebps-package+xml opf -application/ogg ogx -application/omdoc+xml omdoc -application/onenote onetoc onetoc2 onetmp onepkg -application/oxps oxps -# application/parityfec -application/patch-ops-error+xml xer -application/pdf pdf -application/pgp-encrypted pgp -# application/pgp-keys -application/pgp-signature asc sig -application/pics-rules prf -# application/pidf+xml -# application/pidf-diff+xml -application/pkcs10 p10 -application/pkcs7-mime p7m p7c -application/pkcs7-signature p7s -application/pkcs8 p8 -application/pkix-attr-cert ac -application/pkix-cert cer -application/pkix-crl crl -application/pkix-pkipath pkipath -application/pkixcmp pki -application/pls+xml pls -# application/poc-settings+xml -application/postscript ai eps ps -# application/prs.alvestrand.titrax-sheet -application/prs.cww cww -# application/prs.nprend -# application/prs.plucker -# application/prs.rdf-xml-crypt -# application/prs.xsf+xml -application/pskc+xml pskcxml -# application/qsig -application/rdf+xml rdf -application/reginfo+xml rif -application/relax-ng-compact-syntax rnc -# application/remote-printing -application/resource-lists+xml rl -application/resource-lists-diff+xml rld -# application/riscos -# application/rlmi+xml -application/rls-services+xml rs -application/rpki-ghostbusters gbr -application/rpki-manifest mft -application/rpki-roa roa -# application/rpki-updown -application/rsd+xml rsd -application/rss+xml rss -application/rtf rtf -# application/rtx -# application/samlassertion+xml -# application/samlmetadata+xml -application/sbml+xml sbml -application/scvp-cv-request scq -application/scvp-cv-response scs -application/scvp-vp-request spq -application/scvp-vp-response spp -application/sdp sdp -# application/set-payment -application/set-payment-initiation setpay -# application/set-registration -application/set-registration-initiation setreg -# application/sgml -# application/sgml-open-catalog -application/shf+xml shf -# application/sieve -# application/simple-filter+xml -# application/simple-message-summary -# application/simplesymbolcontainer -# application/slate -# application/smil -application/smil+xml smi smil -# application/soap+fastinfoset -# application/soap+xml -application/sparql-query rq -application/sparql-results+xml srx -# application/spirits-event+xml -application/srgs gram -application/srgs+xml grxml -application/sru+xml sru -application/ssdl+xml ssdl -application/ssml+xml ssml -# application/tamp-apex-update -# application/tamp-apex-update-confirm -# application/tamp-community-update -# application/tamp-community-update-confirm -# application/tamp-error -# application/tamp-sequence-adjust -# application/tamp-sequence-adjust-confirm -# application/tamp-status-query -# application/tamp-status-response -# application/tamp-update -# application/tamp-update-confirm -application/tei+xml tei teicorpus -application/thraud+xml tfi -# application/timestamp-query -# application/timestamp-reply -application/timestamped-data tsd -# application/tve-trigger -# application/ulpfec -# application/vcard+xml -# application/vemmi -# application/vividence.scriptfile -# application/vnd.3gpp.bsf+xml -application/vnd.3gpp.pic-bw-large plb -application/vnd.3gpp.pic-bw-small psb -application/vnd.3gpp.pic-bw-var pvb -# application/vnd.3gpp.sms -# application/vnd.3gpp2.bcmcsinfo+xml -# application/vnd.3gpp2.sms -application/vnd.3gpp2.tcap tcap -application/vnd.3m.post-it-notes pwn -application/vnd.accpac.simply.aso aso -application/vnd.accpac.simply.imp imp -application/vnd.acucobol acu -application/vnd.acucorp atc acutc -application/vnd.adobe.air-application-installer-package+zip air -application/vnd.adobe.formscentral.fcdt fcdt -application/vnd.adobe.fxp fxp fxpl -# application/vnd.adobe.partial-upload -application/vnd.adobe.xdp+xml xdp -application/vnd.adobe.xfdf xfdf -# application/vnd.aether.imp -# application/vnd.ah-barcode -application/vnd.ahead.space ahead -application/vnd.airzip.filesecure.azf azf -application/vnd.airzip.filesecure.azs azs -application/vnd.amazon.ebook azw -application/vnd.americandynamics.acc acc -application/vnd.amiga.ami ami -# application/vnd.amundsen.maze+xml -application/vnd.android.package-archive apk -application/vnd.anser-web-certificate-issue-initiation cii -application/vnd.anser-web-funds-transfer-initiation fti -application/vnd.antix.game-component atx -application/vnd.apple.installer+xml mpkg -application/vnd.apple.mpegurl m3u8 -# application/vnd.arastra.swi -application/vnd.aristanetworks.swi swi -application/vnd.astraea-software.iota iota -application/vnd.audiograph aep -# application/vnd.autopackage -# application/vnd.avistar+xml -application/vnd.blueice.multipass mpm -# application/vnd.bluetooth.ep.oob -application/vnd.bmi bmi -application/vnd.businessobjects rep -# application/vnd.cab-jscript -# application/vnd.canon-cpdl -# application/vnd.canon-lips -# application/vnd.cendio.thinlinc.clientconf -application/vnd.chemdraw+xml cdxml -application/vnd.chipnuts.karaoke-mmd mmd -application/vnd.cinderella cdy -# application/vnd.cirpack.isdn-ext -application/vnd.claymore cla -application/vnd.cloanto.rp9 rp9 -application/vnd.clonk.c4group c4g c4d c4f c4p c4u -application/vnd.cluetrust.cartomobile-config c11amc -application/vnd.cluetrust.cartomobile-config-pkg c11amz -# application/vnd.collection+json -# application/vnd.commerce-battelle -application/vnd.commonspace csp -application/vnd.contact.cmsg cdbcmsg -application/vnd.cosmocaller cmc -application/vnd.crick.clicker clkx -application/vnd.crick.clicker.keyboard clkk -application/vnd.crick.clicker.palette clkp -application/vnd.crick.clicker.template clkt -application/vnd.crick.clicker.wordbank clkw -application/vnd.criticaltools.wbs+xml wbs -application/vnd.ctc-posml pml -# application/vnd.ctct.ws+xml -# application/vnd.cups-pdf -# application/vnd.cups-postscript -application/vnd.cups-ppd ppd -# application/vnd.cups-raster -# application/vnd.cups-raw -# application/vnd.curl -application/vnd.curl.car car -application/vnd.curl.pcurl pcurl -# application/vnd.cybank -application/vnd.dart dart -application/vnd.data-vision.rdz rdz -application/vnd.dece.data uvf uvvf uvd uvvd -application/vnd.dece.ttml+xml uvt uvvt -application/vnd.dece.unspecified uvx uvvx -application/vnd.dece.zip uvz uvvz -application/vnd.denovo.fcselayout-link fe_launch -# application/vnd.dir-bi.plate-dl-nosuffix -application/vnd.dna dna -application/vnd.dolby.mlp mlp -# application/vnd.dolby.mobile.1 -# application/vnd.dolby.mobile.2 -application/vnd.dpgraph dpg -application/vnd.dreamfactory dfac -application/vnd.ds-keypoint kpxx -application/vnd.dvb.ait ait -# application/vnd.dvb.dvbj -# application/vnd.dvb.esgcontainer -# application/vnd.dvb.ipdcdftnotifaccess -# application/vnd.dvb.ipdcesgaccess -# application/vnd.dvb.ipdcesgaccess2 -# application/vnd.dvb.ipdcesgpdd -# application/vnd.dvb.ipdcroaming -# application/vnd.dvb.iptv.alfec-base -# application/vnd.dvb.iptv.alfec-enhancement -# application/vnd.dvb.notif-aggregate-root+xml -# application/vnd.dvb.notif-container+xml -# application/vnd.dvb.notif-generic+xml -# application/vnd.dvb.notif-ia-msglist+xml -# application/vnd.dvb.notif-ia-registration-request+xml -# application/vnd.dvb.notif-ia-registration-response+xml -# application/vnd.dvb.notif-init+xml -# application/vnd.dvb.pfr -application/vnd.dvb.service svc -# application/vnd.dxr -application/vnd.dynageo geo -# application/vnd.easykaraoke.cdgdownload -# application/vnd.ecdis-update -application/vnd.ecowin.chart mag -# application/vnd.ecowin.filerequest -# application/vnd.ecowin.fileupdate -# application/vnd.ecowin.series -# application/vnd.ecowin.seriesrequest -# application/vnd.ecowin.seriesupdate -# application/vnd.emclient.accessrequest+xml -application/vnd.enliven nml -# application/vnd.eprints.data+xml -application/vnd.epson.esf esf -application/vnd.epson.msf msf -application/vnd.epson.quickanime qam -application/vnd.epson.salt slt -application/vnd.epson.ssf ssf -# application/vnd.ericsson.quickcall -application/vnd.eszigno3+xml es3 et3 -# application/vnd.etsi.aoc+xml -# application/vnd.etsi.cug+xml -# application/vnd.etsi.iptvcommand+xml -# application/vnd.etsi.iptvdiscovery+xml -# application/vnd.etsi.iptvprofile+xml -# application/vnd.etsi.iptvsad-bc+xml -# application/vnd.etsi.iptvsad-cod+xml -# application/vnd.etsi.iptvsad-npvr+xml -# application/vnd.etsi.iptvservice+xml -# application/vnd.etsi.iptvsync+xml -# application/vnd.etsi.iptvueprofile+xml -# application/vnd.etsi.mcid+xml -# application/vnd.etsi.overload-control-policy-dataset+xml -# application/vnd.etsi.sci+xml -# application/vnd.etsi.simservs+xml -# application/vnd.etsi.tsl+xml -# application/vnd.etsi.tsl.der -# application/vnd.eudora.data -application/vnd.ezpix-album ez2 -application/vnd.ezpix-package ez3 -# application/vnd.f-secure.mobile -application/vnd.fdf fdf -application/vnd.fdsn.mseed mseed -application/vnd.fdsn.seed seed dataless -# application/vnd.ffsns -# application/vnd.fints -application/vnd.flographit gph -application/vnd.fluxtime.clip ftc -# application/vnd.font-fontforge-sfd -application/vnd.framemaker fm frame maker book -application/vnd.frogans.fnc fnc -application/vnd.frogans.ltf ltf -application/vnd.fsc.weblaunch fsc -application/vnd.fujitsu.oasys oas -application/vnd.fujitsu.oasys2 oa2 -application/vnd.fujitsu.oasys3 oa3 -application/vnd.fujitsu.oasysgp fg5 -application/vnd.fujitsu.oasysprs bh2 -# application/vnd.fujixerox.art-ex -# application/vnd.fujixerox.art4 -# application/vnd.fujixerox.hbpl -application/vnd.fujixerox.ddd ddd -application/vnd.fujixerox.docuworks xdw -application/vnd.fujixerox.docuworks.binder xbd -# application/vnd.fut-misnet -application/vnd.fuzzysheet fzs -application/vnd.genomatix.tuxedo txd -# application/vnd.geocube+xml -application/vnd.geogebra.file ggb -application/vnd.geogebra.tool ggt -application/vnd.geometry-explorer gex gre -application/vnd.geonext gxt -application/vnd.geoplan g2w -application/vnd.geospace g3w -# application/vnd.globalplatform.card-content-mgt -# application/vnd.globalplatform.card-content-mgt-response -application/vnd.gmx gmx -application/vnd.google-earth.kml+xml kml -application/vnd.google-earth.kmz kmz -application/vnd.grafeq gqf gqs -# application/vnd.gridmp -application/vnd.groove-account gac -application/vnd.groove-help ghf -application/vnd.groove-identity-message gim -application/vnd.groove-injector grv -application/vnd.groove-tool-message gtm -application/vnd.groove-tool-template tpl -application/vnd.groove-vcard vcg -# application/vnd.hal+json -application/vnd.hal+xml hal -application/vnd.handheld-entertainment+xml zmm -application/vnd.hbci hbci -# application/vnd.hcl-bireports -application/vnd.hhe.lesson-player les -application/vnd.hp-hpgl hpgl -application/vnd.hp-hpid hpid -application/vnd.hp-hps hps -application/vnd.hp-jlyt jlt -application/vnd.hp-pcl pcl -application/vnd.hp-pclxl pclxl -# application/vnd.httphone -application/vnd.hydrostatix.sof-data sfd-hdstx -# application/vnd.hzn-3d-crossword -# application/vnd.ibm.afplinedata -# application/vnd.ibm.electronic-media -application/vnd.ibm.minipay mpy -application/vnd.ibm.modcap afp listafp list3820 -application/vnd.ibm.rights-management irm -application/vnd.ibm.secure-container sc -application/vnd.iccprofile icc icm -application/vnd.igloader igl -application/vnd.immervision-ivp ivp -application/vnd.immervision-ivu ivu -# application/vnd.informedcontrol.rms+xml -# application/vnd.informix-visionary -# application/vnd.infotech.project -# application/vnd.infotech.project+xml -# application/vnd.innopath.wamp.notification -application/vnd.insors.igm igm -application/vnd.intercon.formnet xpw xpx -application/vnd.intergeo i2g -# application/vnd.intertrust.digibox -# application/vnd.intertrust.nncp -application/vnd.intu.qbo qbo -application/vnd.intu.qfx qfx -# application/vnd.iptc.g2.conceptitem+xml -# application/vnd.iptc.g2.knowledgeitem+xml -# application/vnd.iptc.g2.newsitem+xml -# application/vnd.iptc.g2.newsmessage+xml -# application/vnd.iptc.g2.packageitem+xml -# application/vnd.iptc.g2.planningitem+xml -application/vnd.ipunplugged.rcprofile rcprofile -application/vnd.irepository.package+xml irp -application/vnd.is-xpr xpr -application/vnd.isac.fcs fcs -application/vnd.jam jam -# application/vnd.japannet-directory-service -# application/vnd.japannet-jpnstore-wakeup -# application/vnd.japannet-payment-wakeup -# application/vnd.japannet-registration -# application/vnd.japannet-registration-wakeup -# application/vnd.japannet-setstore-wakeup -# application/vnd.japannet-verification -# application/vnd.japannet-verification-wakeup -application/vnd.jcp.javame.midlet-rms rms -application/vnd.jisp jisp -application/vnd.joost.joda-archive joda -application/vnd.kahootz ktz ktr -application/vnd.kde.karbon karbon -application/vnd.kde.kchart chrt -application/vnd.kde.kformula kfo -application/vnd.kde.kivio flw -application/vnd.kde.kontour kon -application/vnd.kde.kpresenter kpr kpt -application/vnd.kde.kspread ksp -application/vnd.kde.kword kwd kwt -application/vnd.kenameaapp htke -application/vnd.kidspiration kia -application/vnd.kinar kne knp -application/vnd.koan skp skd skt skm -application/vnd.kodak-descriptor sse -application/vnd.las.las+xml lasxml -# application/vnd.liberty-request+xml -application/vnd.llamagraphics.life-balance.desktop lbd -application/vnd.llamagraphics.life-balance.exchange+xml lbe -application/vnd.lotus-1-2-3 123 -application/vnd.lotus-approach apr -application/vnd.lotus-freelance pre -application/vnd.lotus-notes nsf -application/vnd.lotus-organizer org -application/vnd.lotus-screencam scm -application/vnd.lotus-wordpro lwp -application/vnd.macports.portpkg portpkg -# application/vnd.marlin.drm.actiontoken+xml -# application/vnd.marlin.drm.conftoken+xml -# application/vnd.marlin.drm.license+xml -# application/vnd.marlin.drm.mdcf -application/vnd.mcd mcd -application/vnd.medcalcdata mc1 -application/vnd.mediastation.cdkey cdkey -# application/vnd.meridian-slingshot -application/vnd.mfer mwf -application/vnd.mfmp mfm -application/vnd.micrografx.flo flo -application/vnd.micrografx.igx igx -application/vnd.mif mif -# application/vnd.minisoft-hp3000-save -# application/vnd.mitsubishi.misty-guard.trustweb -application/vnd.mobius.daf daf -application/vnd.mobius.dis dis -application/vnd.mobius.mbk mbk -application/vnd.mobius.mqy mqy -application/vnd.mobius.msl msl -application/vnd.mobius.plc plc -application/vnd.mobius.txf txf -application/vnd.mophun.application mpn -application/vnd.mophun.certificate mpc -# application/vnd.motorola.flexsuite -# application/vnd.motorola.flexsuite.adsi -# application/vnd.motorola.flexsuite.fis -# application/vnd.motorola.flexsuite.gotap -# application/vnd.motorola.flexsuite.kmr -# application/vnd.motorola.flexsuite.ttc -# application/vnd.motorola.flexsuite.wem -# application/vnd.motorola.iprm -application/vnd.mozilla.xul+xml xul -application/vnd.ms-artgalry cil -# application/vnd.ms-asf -application/vnd.ms-cab-compressed cab -# application/vnd.ms-color.iccprofile -application/vnd.ms-excel xls xlm xla xlc xlt xlw -application/vnd.ms-excel.addin.macroenabled.12 xlam -application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb -application/vnd.ms-excel.sheet.macroenabled.12 xlsm -application/vnd.ms-excel.template.macroenabled.12 xltm -application/vnd.ms-fontobject eot -application/vnd.ms-htmlhelp chm -application/vnd.ms-ims ims -application/vnd.ms-lrm lrm -# application/vnd.ms-office.activex+xml -application/vnd.ms-officetheme thmx -# application/vnd.ms-opentype -# application/vnd.ms-package.obfuscated-opentype -application/vnd.ms-pki.seccat cat -application/vnd.ms-pki.stl stl -# application/vnd.ms-playready.initiator+xml -application/vnd.ms-powerpoint ppt pps pot -application/vnd.ms-powerpoint.addin.macroenabled.12 ppam -application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm -application/vnd.ms-powerpoint.slide.macroenabled.12 sldm -application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm -application/vnd.ms-powerpoint.template.macroenabled.12 potm -# application/vnd.ms-printing.printticket+xml -application/vnd.ms-project mpp mpt -# application/vnd.ms-tnef -# application/vnd.ms-wmdrm.lic-chlg-req -# application/vnd.ms-wmdrm.lic-resp -# application/vnd.ms-wmdrm.meter-chlg-req -# application/vnd.ms-wmdrm.meter-resp -application/vnd.ms-word.document.macroenabled.12 docm -application/vnd.ms-word.template.macroenabled.12 dotm -application/vnd.ms-works wps wks wcm wdb -application/vnd.ms-wpl wpl -application/vnd.ms-xpsdocument xps -application/vnd.mseq mseq -# application/vnd.msign -# application/vnd.multiad.creator -# application/vnd.multiad.creator.cif -# application/vnd.music-niff -application/vnd.musician mus -application/vnd.muvee.style msty -application/vnd.mynfc taglet -# application/vnd.ncd.control -# application/vnd.ncd.reference -# application/vnd.nervana -# application/vnd.netfpx -application/vnd.neurolanguage.nlu nlu -application/vnd.nitf ntf nitf -application/vnd.noblenet-directory nnd -application/vnd.noblenet-sealer nns -application/vnd.noblenet-web nnw -# application/vnd.nokia.catalogs -# application/vnd.nokia.conml+wbxml -# application/vnd.nokia.conml+xml -# application/vnd.nokia.isds-radio-presets -# application/vnd.nokia.iptv.config+xml -# application/vnd.nokia.landmark+wbxml -# application/vnd.nokia.landmark+xml -# application/vnd.nokia.landmarkcollection+xml -# application/vnd.nokia.n-gage.ac+xml -application/vnd.nokia.n-gage.data ngdat -application/vnd.nokia.n-gage.symbian.install n-gage -# application/vnd.nokia.ncd -# application/vnd.nokia.pcd+wbxml -# application/vnd.nokia.pcd+xml -application/vnd.nokia.radio-preset rpst -application/vnd.nokia.radio-presets rpss -application/vnd.novadigm.edm edm -application/vnd.novadigm.edx edx -application/vnd.novadigm.ext ext -# application/vnd.ntt-local.file-transfer -# application/vnd.ntt-local.sip-ta_remote -# application/vnd.ntt-local.sip-ta_tcp_stream -application/vnd.oasis.opendocument.chart odc -application/vnd.oasis.opendocument.chart-template otc -application/vnd.oasis.opendocument.database odb -application/vnd.oasis.opendocument.formula odf -application/vnd.oasis.opendocument.formula-template odft -application/vnd.oasis.opendocument.graphics odg -application/vnd.oasis.opendocument.graphics-template otg -application/vnd.oasis.opendocument.image odi -application/vnd.oasis.opendocument.image-template oti -application/vnd.oasis.opendocument.presentation odp -application/vnd.oasis.opendocument.presentation-template otp -application/vnd.oasis.opendocument.spreadsheet ods -application/vnd.oasis.opendocument.spreadsheet-template ots -application/vnd.oasis.opendocument.text odt -application/vnd.oasis.opendocument.text-master odm -application/vnd.oasis.opendocument.text-template ott -application/vnd.oasis.opendocument.text-web oth -# application/vnd.obn -# application/vnd.oftn.l10n+json -# application/vnd.oipf.contentaccessdownload+xml -# application/vnd.oipf.contentaccessstreaming+xml -# application/vnd.oipf.cspg-hexbinary -# application/vnd.oipf.dae.svg+xml -# application/vnd.oipf.dae.xhtml+xml -# application/vnd.oipf.mippvcontrolmessage+xml -# application/vnd.oipf.pae.gem -# application/vnd.oipf.spdiscovery+xml -# application/vnd.oipf.spdlist+xml -# application/vnd.oipf.ueprofile+xml -# application/vnd.oipf.userprofile+xml -application/vnd.olpc-sugar xo -# application/vnd.oma-scws-config -# application/vnd.oma-scws-http-request -# application/vnd.oma-scws-http-response -# application/vnd.oma.bcast.associated-procedure-parameter+xml -# application/vnd.oma.bcast.drm-trigger+xml -# application/vnd.oma.bcast.imd+xml -# application/vnd.oma.bcast.ltkm -# application/vnd.oma.bcast.notification+xml -# application/vnd.oma.bcast.provisioningtrigger -# application/vnd.oma.bcast.sgboot -# application/vnd.oma.bcast.sgdd+xml -# application/vnd.oma.bcast.sgdu -# application/vnd.oma.bcast.simple-symbol-container -# application/vnd.oma.bcast.smartcard-trigger+xml -# application/vnd.oma.bcast.sprov+xml -# application/vnd.oma.bcast.stkm -# application/vnd.oma.cab-address-book+xml -# application/vnd.oma.cab-feature-handler+xml -# application/vnd.oma.cab-pcc+xml -# application/vnd.oma.cab-user-prefs+xml -# application/vnd.oma.dcd -# application/vnd.oma.dcdc -application/vnd.oma.dd2+xml dd2 -# application/vnd.oma.drm.risd+xml -# application/vnd.oma.group-usage-list+xml -# application/vnd.oma.pal+xml -# application/vnd.oma.poc.detailed-progress-report+xml -# application/vnd.oma.poc.final-report+xml -# application/vnd.oma.poc.groups+xml -# application/vnd.oma.poc.invocation-descriptor+xml -# application/vnd.oma.poc.optimized-progress-report+xml -# application/vnd.oma.push -# application/vnd.oma.scidm.messages+xml -# application/vnd.oma.xcap-directory+xml -# application/vnd.omads-email+xml -# application/vnd.omads-file+xml -# application/vnd.omads-folder+xml -# application/vnd.omaloc-supl-init -application/vnd.openofficeorg.extension oxt -# application/vnd.openxmlformats-officedocument.custom-properties+xml -# application/vnd.openxmlformats-officedocument.customxmlproperties+xml -# application/vnd.openxmlformats-officedocument.drawing+xml -# application/vnd.openxmlformats-officedocument.drawingml.chart+xml -# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml -# application/vnd.openxmlformats-officedocument.extended-properties+xml -# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml -# application/vnd.openxmlformats-officedocument.presentationml.comments+xml -# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml -application/vnd.openxmlformats-officedocument.presentationml.presentation pptx -# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml -application/vnd.openxmlformats-officedocument.presentationml.slide sldx -# application/vnd.openxmlformats-officedocument.presentationml.slide+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml -application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx -# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml -# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml -# application/vnd.openxmlformats-officedocument.presentationml.tags+xml -application/vnd.openxmlformats-officedocument.presentationml.template potx -# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx -# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml -# application/vnd.openxmlformats-officedocument.theme+xml -# application/vnd.openxmlformats-officedocument.themeoverride+xml -# application/vnd.openxmlformats-officedocument.vmldrawing -# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.document docx -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx -# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml -# application/vnd.openxmlformats-package.core-properties+xml -# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml -# application/vnd.openxmlformats-package.relationships+xml -# application/vnd.quobject-quoxdocument -# application/vnd.osa.netdeploy -application/vnd.osgeo.mapguide.package mgp -# application/vnd.osgi.bundle -application/vnd.osgi.dp dp -application/vnd.osgi.subsystem esa -# application/vnd.otps.ct-kip+xml -application/vnd.palm pdb pqa oprc -# application/vnd.paos.xml -application/vnd.pawaafile paw -application/vnd.pg.format str -application/vnd.pg.osasli ei6 -# application/vnd.piaccess.application-licence -application/vnd.picsel efif -application/vnd.pmi.widget wg -# application/vnd.poc.group-advertisement+xml -application/vnd.pocketlearn plf -application/vnd.powerbuilder6 pbd -# application/vnd.powerbuilder6-s -# application/vnd.powerbuilder7 -# application/vnd.powerbuilder7-s -# application/vnd.powerbuilder75 -# application/vnd.powerbuilder75-s -# application/vnd.preminet -application/vnd.previewsystems.box box -application/vnd.proteus.magazine mgz -application/vnd.publishare-delta-tree qps -application/vnd.pvi.ptid1 ptid -# application/vnd.pwg-multiplexed -# application/vnd.pwg-xhtml-print+xml -# application/vnd.qualcomm.brew-app-res -application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb -# application/vnd.radisys.moml+xml -# application/vnd.radisys.msml+xml -# application/vnd.radisys.msml-audit+xml -# application/vnd.radisys.msml-audit-conf+xml -# application/vnd.radisys.msml-audit-conn+xml -# application/vnd.radisys.msml-audit-dialog+xml -# application/vnd.radisys.msml-audit-stream+xml -# application/vnd.radisys.msml-conf+xml -# application/vnd.radisys.msml-dialog+xml -# application/vnd.radisys.msml-dialog-base+xml -# application/vnd.radisys.msml-dialog-fax-detect+xml -# application/vnd.radisys.msml-dialog-fax-sendrecv+xml -# application/vnd.radisys.msml-dialog-group+xml -# application/vnd.radisys.msml-dialog-speech+xml -# application/vnd.radisys.msml-dialog-transform+xml -# application/vnd.rainstor.data -# application/vnd.rapid -application/vnd.realvnc.bed bed -application/vnd.recordare.musicxml mxl -application/vnd.recordare.musicxml+xml musicxml -# application/vnd.renlearn.rlprint -application/vnd.rig.cryptonote cryptonote -application/vnd.rim.cod cod -application/vnd.rn-realmedia rm -application/vnd.rn-realmedia-vbr rmvb -application/vnd.route66.link66+xml link66 -# application/vnd.rs-274x -# application/vnd.ruckus.download -# application/vnd.s3sms -application/vnd.sailingtracker.track st -# application/vnd.sbm.cid -# application/vnd.sbm.mid2 -# application/vnd.scribus -# application/vnd.sealed.3df -# application/vnd.sealed.csf -# application/vnd.sealed.doc -# application/vnd.sealed.eml -# application/vnd.sealed.mht -# application/vnd.sealed.net -# application/vnd.sealed.ppt -# application/vnd.sealed.tiff -# application/vnd.sealed.xls -# application/vnd.sealedmedia.softseal.html -# application/vnd.sealedmedia.softseal.pdf -application/vnd.seemail see -application/vnd.sema sema -application/vnd.semd semd -application/vnd.semf semf -application/vnd.shana.informed.formdata ifm -application/vnd.shana.informed.formtemplate itp -application/vnd.shana.informed.interchange iif -application/vnd.shana.informed.package ipk -application/vnd.simtech-mindmapper twd twds -application/vnd.smaf mmf -# application/vnd.smart.notebook -application/vnd.smart.teacher teacher -# application/vnd.software602.filler.form+xml -# application/vnd.software602.filler.form-xml-zip -application/vnd.solent.sdkm+xml sdkm sdkd -application/vnd.spotfire.dxp dxp -application/vnd.spotfire.sfs sfs -# application/vnd.sss-cod -# application/vnd.sss-dtf -# application/vnd.sss-ntf -application/vnd.stardivision.calc sdc -application/vnd.stardivision.draw sda -application/vnd.stardivision.impress sdd -application/vnd.stardivision.math smf -application/vnd.stardivision.writer sdw vor -application/vnd.stardivision.writer-global sgl -application/vnd.stepmania.package smzip -application/vnd.stepmania.stepchart sm -# application/vnd.street-stream -application/vnd.sun.xml.calc sxc -application/vnd.sun.xml.calc.template stc -application/vnd.sun.xml.draw sxd -application/vnd.sun.xml.draw.template std -application/vnd.sun.xml.impress sxi -application/vnd.sun.xml.impress.template sti -application/vnd.sun.xml.math sxm -application/vnd.sun.xml.writer sxw -application/vnd.sun.xml.writer.global sxg -application/vnd.sun.xml.writer.template stw -# application/vnd.sun.wadl+xml -application/vnd.sus-calendar sus susp -application/vnd.svd svd -# application/vnd.swiftview-ics -application/vnd.symbian.install sis sisx -application/vnd.syncml+xml xsm -application/vnd.syncml.dm+wbxml bdm -application/vnd.syncml.dm+xml xdm -# application/vnd.syncml.dm.notification -# application/vnd.syncml.ds.notification -application/vnd.tao.intent-module-archive tao -application/vnd.tcpdump.pcap pcap cap dmp -application/vnd.tmobile-livetv tmo -application/vnd.trid.tpt tpt -application/vnd.triscape.mxs mxs -application/vnd.trueapp tra -# application/vnd.truedoc -# application/vnd.ubisoft.webplayer -application/vnd.ufdl ufd ufdl -application/vnd.uiq.theme utz -application/vnd.umajin umj -application/vnd.unity unityweb -application/vnd.uoml+xml uoml -# application/vnd.uplanet.alert -# application/vnd.uplanet.alert-wbxml -# application/vnd.uplanet.bearer-choice -# application/vnd.uplanet.bearer-choice-wbxml -# application/vnd.uplanet.cacheop -# application/vnd.uplanet.cacheop-wbxml -# application/vnd.uplanet.channel -# application/vnd.uplanet.channel-wbxml -# application/vnd.uplanet.list -# application/vnd.uplanet.list-wbxml -# application/vnd.uplanet.listcmd -# application/vnd.uplanet.listcmd-wbxml -# application/vnd.uplanet.signal -application/vnd.vcx vcx -# application/vnd.vd-study -# application/vnd.vectorworks -# application/vnd.verimatrix.vcas -# application/vnd.vidsoft.vidconference -application/vnd.visio vsd vst vss vsw -application/vnd.visionary vis -# application/vnd.vividence.scriptfile -application/vnd.vsf vsf -# application/vnd.wap.sic -# application/vnd.wap.slc -application/vnd.wap.wbxml wbxml -application/vnd.wap.wmlc wmlc -application/vnd.wap.wmlscriptc wmlsc -application/vnd.webturbo wtb -# application/vnd.wfa.wsc -# application/vnd.wmc -# application/vnd.wmf.bootstrap -# application/vnd.wolfram.mathematica -# application/vnd.wolfram.mathematica.package -application/vnd.wolfram.player nbp -application/vnd.wordperfect wpd -application/vnd.wqd wqd -# application/vnd.wrq-hp3000-labelled -application/vnd.wt.stf stf -# application/vnd.wv.csp+wbxml -# application/vnd.wv.csp+xml -# application/vnd.wv.ssp+xml -application/vnd.xara xar -application/vnd.xfdl xfdl -# application/vnd.xfdl.webform -# application/vnd.xmi+xml -# application/vnd.xmpie.cpkg -# application/vnd.xmpie.dpkg -# application/vnd.xmpie.plan -# application/vnd.xmpie.ppkg -# application/vnd.xmpie.xlim -application/vnd.yamaha.hv-dic hvd -application/vnd.yamaha.hv-script hvs -application/vnd.yamaha.hv-voice hvp -application/vnd.yamaha.openscoreformat osf -application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg -# application/vnd.yamaha.remote-setup -application/vnd.yamaha.smaf-audio saf -application/vnd.yamaha.smaf-phrase spf -# application/vnd.yamaha.through-ngn -# application/vnd.yamaha.tunnel-udpencap -application/vnd.yellowriver-custom-menu cmp -application/vnd.zul zir zirz -application/vnd.zzazz.deck+xml zaz -application/voicexml+xml vxml -# application/vq-rtcpxr -# application/watcherinfo+xml -# application/whoispp-query -# application/whoispp-response -application/widget wgt -application/winhlp hlp -# application/wita -# application/wordperfect5.1 -application/wsdl+xml wsdl -application/wspolicy+xml wspolicy -application/x-7z-compressed 7z -application/x-abiword abw -application/x-ace-compressed ace -# application/x-amf -application/x-apple-diskimage dmg -application/x-authorware-bin aab x32 u32 vox -application/x-authorware-map aam -application/x-authorware-seg aas -application/x-bcpio bcpio -application/x-bittorrent torrent -application/x-blorb blb blorb -application/x-bzip bz -application/x-bzip2 bz2 boz -application/x-cbr cbr cba cbt cbz cb7 -application/x-cdlink vcd -application/x-cfs-compressed cfs -application/x-chat chat -application/x-chess-pgn pgn -application/x-conference nsc -# application/x-compress -application/x-cpio cpio -application/x-csh csh -application/x-debian-package deb udeb -application/x-dgc-compressed dgc -application/x-director dir dcr dxr cst cct cxt w3d fgd swa -application/x-doom wad -application/x-dtbncx+xml ncx -application/x-dtbook+xml dtb -application/x-dtbresource+xml res -application/x-dvi dvi -application/x-envoy evy -application/x-eva eva -application/x-font-bdf bdf -# application/x-font-dos -# application/x-font-framemaker -application/x-font-ghostscript gsf -# application/x-font-libgrx -application/x-font-linux-psf psf -application/x-font-otf otf -application/x-font-pcf pcf -application/x-font-snf snf -# application/x-font-speedo -# application/x-font-sunos-news -application/x-font-ttf ttf ttc -application/x-font-type1 pfa pfb pfm afm -application/x-font-woff woff -# application/x-font-vfont -application/x-freearc arc -application/x-futuresplash spl -application/x-gca-compressed gca -application/x-glulx ulx -application/x-gnumeric gnumeric -application/x-gramps-xml gramps -application/x-gtar gtar -# application/x-gzip -application/x-hdf hdf -application/x-install-instructions install -application/x-iso9660-image iso -application/x-java-jnlp-file jnlp -application/x-latex latex -application/x-lzh-compressed lzh lha -application/x-mie mie -application/x-mobipocket-ebook prc mobi -application/x-ms-application application -application/x-ms-shortcut lnk -application/x-ms-wmd wmd -application/x-ms-wmz wmz -application/x-ms-xbap xbap -application/x-msaccess mdb -application/x-msbinder obd -application/x-mscardfile crd -application/x-msclip clp -application/x-msdownload exe dll com bat msi -application/x-msmediaview mvb m13 m14 -application/x-msmetafile wmf wmz emf emz -application/x-msmoney mny -application/x-mspublisher pub -application/x-msschedule scd -application/x-msterminal trm -application/x-mswrite wri -application/x-netcdf nc cdf -application/x-nzb nzb -application/x-pkcs12 p12 pfx -application/x-pkcs7-certificates p7b spc -application/x-pkcs7-certreqresp p7r -application/x-rar-compressed rar -application/x-research-info-systems ris -application/x-sh sh -application/x-shar shar -application/x-shockwave-flash swf -application/x-silverlight-app xap -application/x-sql sql -application/x-stuffit sit -application/x-stuffitx sitx -application/x-subrip srt -application/x-sv4cpio sv4cpio -application/x-sv4crc sv4crc -application/x-t3vm-image t3 -application/x-tads gam -application/x-tar tar -application/x-tcl tcl -application/x-tex tex -application/x-tex-tfm tfm -application/x-texinfo texinfo texi -application/x-tgif obj -application/x-ustar ustar -application/x-wais-source src -application/x-x509-ca-cert der crt -application/x-xfig fig -application/x-xliff+xml xlf -application/x-xpinstall xpi -application/x-xz xz -application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8 -# application/x400-bp -application/xaml+xml xaml -# application/xcap-att+xml -# application/xcap-caps+xml -application/xcap-diff+xml xdf -# application/xcap-el+xml -# application/xcap-error+xml -# application/xcap-ns+xml -# application/xcon-conference-info-diff+xml -# application/xcon-conference-info+xml -application/xenc+xml xenc -application/xhtml+xml xhtml xht -# application/xhtml-voice+xml -application/xml xml xsl -application/xml-dtd dtd -# application/xml-external-parsed-entity -# application/xmpp+xml -application/xop+xml xop -application/xproc+xml xpl -application/xslt+xml xslt -application/xspf+xml xspf -application/xv+xml mxml xhvml xvml xvm -application/yang yang -application/yin+xml yin -application/zip zip -# audio/1d-interleaved-parityfec -# audio/32kadpcm -# audio/3gpp -# audio/3gpp2 -# audio/ac3 -audio/adpcm adp -# audio/amr -# audio/amr-wb -# audio/amr-wb+ -# audio/asc -# audio/atrac-advanced-lossless -# audio/atrac-x -# audio/atrac3 -audio/basic au snd -# audio/bv16 -# audio/bv32 -# audio/clearmode -# audio/cn -# audio/dat12 -# audio/dls -# audio/dsr-es201108 -# audio/dsr-es202050 -# audio/dsr-es202211 -# audio/dsr-es202212 -# audio/dv -# audio/dvi4 -# audio/eac3 -# audio/evrc -# audio/evrc-qcp -# audio/evrc0 -# audio/evrc1 -# audio/evrcb -# audio/evrcb0 -# audio/evrcb1 -# audio/evrcwb -# audio/evrcwb0 -# audio/evrcwb1 -# audio/example -# audio/fwdred -# audio/g719 -# audio/g722 -# audio/g7221 -# audio/g723 -# audio/g726-16 -# audio/g726-24 -# audio/g726-32 -# audio/g726-40 -# audio/g728 -# audio/g729 -# audio/g7291 -# audio/g729d -# audio/g729e -# audio/gsm -# audio/gsm-efr -# audio/gsm-hr-08 -# audio/ilbc -# audio/ip-mr_v2.5 -# audio/isac -# audio/l16 -# audio/l20 -# audio/l24 -# audio/l8 -# audio/lpc -audio/midi mid midi kar rmi -# audio/mobile-xmf -audio/mp4 mp4a -# audio/mp4a-latm -# audio/mpa -# audio/mpa-robust -audio/mpeg mpga mp2 mp2a mp3 m2a m3a -# audio/mpeg4-generic -# audio/musepack -audio/ogg oga ogg spx -# audio/opus -# audio/parityfec -# audio/pcma -# audio/pcma-wb -# audio/pcmu-wb -# audio/pcmu -# audio/prs.sid -# audio/qcelp -# audio/red -# audio/rtp-enc-aescm128 -# audio/rtp-midi -# audio/rtx -audio/s3m s3m -audio/silk sil -# audio/smv -# audio/smv0 -# audio/smv-qcp -# audio/sp-midi -# audio/speex -# audio/t140c -# audio/t38 -# audio/telephone-event -# audio/tone -# audio/uemclip -# audio/ulpfec -# audio/vdvi -# audio/vmr-wb -# audio/vnd.3gpp.iufp -# audio/vnd.4sb -# audio/vnd.audiokoz -# audio/vnd.celp -# audio/vnd.cisco.nse -# audio/vnd.cmles.radio-events -# audio/vnd.cns.anp1 -# audio/vnd.cns.inf1 -audio/vnd.dece.audio uva uvva -audio/vnd.digital-winds eol -# audio/vnd.dlna.adts -# audio/vnd.dolby.heaac.1 -# audio/vnd.dolby.heaac.2 -# audio/vnd.dolby.mlp -# audio/vnd.dolby.mps -# audio/vnd.dolby.pl2 -# audio/vnd.dolby.pl2x -# audio/vnd.dolby.pl2z -# audio/vnd.dolby.pulse.1 -audio/vnd.dra dra -audio/vnd.dts dts -audio/vnd.dts.hd dtshd -# audio/vnd.dvb.file -# audio/vnd.everad.plj -# audio/vnd.hns.audio -audio/vnd.lucent.voice lvp -audio/vnd.ms-playready.media.pya pya -# audio/vnd.nokia.mobile-xmf -# audio/vnd.nortel.vbk -audio/vnd.nuera.ecelp4800 ecelp4800 -audio/vnd.nuera.ecelp7470 ecelp7470 -audio/vnd.nuera.ecelp9600 ecelp9600 -# audio/vnd.octel.sbc -# audio/vnd.qcelp -# audio/vnd.rhetorex.32kadpcm -audio/vnd.rip rip -# audio/vnd.sealedmedia.softseal.mpeg -# audio/vnd.vmx.cvsd -# audio/vorbis -# audio/vorbis-config -audio/webm weba -audio/x-aac aac -audio/x-aiff aif aiff aifc -audio/x-caf caf -audio/x-flac flac -audio/x-matroska mka -audio/x-mpegurl m3u -audio/x-ms-wax wax -audio/x-ms-wma wma -audio/x-pn-realaudio ram ra -audio/x-pn-realaudio-plugin rmp -# audio/x-tta -audio/x-wav wav -audio/xm xm -chemical/x-cdx cdx -chemical/x-cif cif -chemical/x-cmdf cmdf -chemical/x-cml cml -chemical/x-csml csml -# chemical/x-pdb -chemical/x-xyz xyz -image/bmp bmp -image/cgm cgm -# image/example -# image/fits -image/g3fax g3 -image/gif gif -image/ief ief -# image/jp2 -image/jpeg jpeg jpg jpe -# image/jpm -# image/jpx -image/ktx ktx -# image/naplps -image/png png -image/prs.btif btif -# image/prs.pti -image/sgi sgi -image/svg+xml svg svgz -# image/t38 -image/tiff tiff tif -# image/tiff-fx -image/vnd.adobe.photoshop psd -# image/vnd.cns.inf2 -image/vnd.dece.graphic uvi uvvi uvg uvvg -image/vnd.dvb.subtitle sub -image/vnd.djvu djvu djv -image/vnd.dwg dwg -image/vnd.dxf dxf -image/vnd.fastbidsheet fbs -image/vnd.fpx fpx -image/vnd.fst fst -image/vnd.fujixerox.edmics-mmr mmr -image/vnd.fujixerox.edmics-rlc rlc -# image/vnd.globalgraphics.pgb -# image/vnd.microsoft.icon -# image/vnd.mix -image/vnd.ms-modi mdi -image/vnd.ms-photo wdp -image/vnd.net-fpx npx -# image/vnd.radiance -# image/vnd.sealed.png -# image/vnd.sealedmedia.softseal.gif -# image/vnd.sealedmedia.softseal.jpg -# image/vnd.svf -image/vnd.wap.wbmp wbmp -image/vnd.xiff xif -image/webp webp -image/x-3ds 3ds -image/x-cmu-raster ras -image/x-cmx cmx -image/x-freehand fh fhc fh4 fh5 fh7 -image/x-icon ico -image/x-mrsid-image sid -image/x-pcx pcx -image/x-pict pic pct -image/x-portable-anymap pnm -image/x-portable-bitmap pbm -image/x-portable-graymap pgm -image/x-portable-pixmap ppm -image/x-rgb rgb -image/x-tga tga -image/x-xbitmap xbm -image/x-xpixmap xpm -image/x-xwindowdump xwd -# message/cpim -# message/delivery-status -# message/disposition-notification -# message/example -# message/external-body -# message/feedback-report -# message/global -# message/global-delivery-status -# message/global-disposition-notification -# message/global-headers -# message/http -# message/imdn+xml -# message/news -# message/partial -message/rfc822 eml mime -# message/s-http -# message/sip -# message/sipfrag -# message/tracking-status -# message/vnd.si.simp -# model/example -model/iges igs iges -model/mesh msh mesh silo -model/vnd.collada+xml dae -model/vnd.dwf dwf -# model/vnd.flatland.3dml -model/vnd.gdl gdl -# model/vnd.gs-gdl -# model/vnd.gs.gdl -model/vnd.gtw gtw -# model/vnd.moml+xml -model/vnd.mts mts -# model/vnd.parasolid.transmit.binary -# model/vnd.parasolid.transmit.text -model/vnd.vtu vtu -model/vrml wrl vrml -model/x3d+binary x3db x3dbz -model/x3d+vrml x3dv x3dvz -model/x3d+xml x3d x3dz -# multipart/alternative -# multipart/appledouble -# multipart/byteranges -# multipart/digest -# multipart/encrypted -# multipart/example -# multipart/form-data -# multipart/header-set -# multipart/mixed -# multipart/parallel -# multipart/related -# multipart/report -# multipart/signed -# multipart/voice-message -# text/1d-interleaved-parityfec -text/cache-manifest appcache -text/calendar ics ifb -text/css css -text/csv csv -# text/directory -# text/dns -# text/ecmascript -# text/enriched -# text/example -# text/fwdred -text/html html htm -# text/javascript -text/n3 n3 -# text/parityfec -text/plain txt text conf def list log in -# text/prs.fallenstein.rst -text/prs.lines.tag dsc -# text/vnd.radisys.msml-basic-layout -# text/red -# text/rfc822-headers -text/richtext rtx -# text/rtf -# text/rtp-enc-aescm128 -# text/rtx -text/sgml sgml sgm -# text/t140 -text/tab-separated-values tsv -text/troff t tr roff man me ms -text/turtle ttl -# text/ulpfec -text/uri-list uri uris urls -text/vcard vcard -# text/vnd.abc -text/vnd.curl curl -text/vnd.curl.dcurl dcurl -text/vnd.curl.scurl scurl -text/vnd.curl.mcurl mcurl -# text/vnd.dmclientscript -text/vnd.dvb.subtitle sub -# text/vnd.esmertec.theme-descriptor -text/vnd.fly fly -text/vnd.fmi.flexstor flx -text/vnd.graphviz gv -text/vnd.in3d.3dml 3dml -text/vnd.in3d.spot spot -# text/vnd.iptc.newsml -# text/vnd.iptc.nitf -# text/vnd.latex-z -# text/vnd.motorola.reflex -# text/vnd.ms-mediapackage -# text/vnd.net2phone.commcenter.command -# text/vnd.si.uricatalogue -text/vnd.sun.j2me.app-descriptor jad -# text/vnd.trolltech.linguist -# text/vnd.wap.si -# text/vnd.wap.sl -text/vnd.wap.wml wml -text/vnd.wap.wmlscript wmls -text/x-asm s asm -text/x-c c cc cxx cpp h hh dic -text/x-fortran f for f77 f90 -text/x-java-source java -text/x-opml opml -text/x-pascal p pas -text/x-nfo nfo -text/x-setext etx -text/x-sfv sfv -text/x-uuencode uu -text/x-vcalendar vcs -text/x-vcard vcf -# text/xml -# text/xml-external-parsed-entity -# video/1d-interleaved-parityfec -video/3gpp 3gp -# video/3gpp-tt -video/3gpp2 3g2 -# video/bmpeg -# video/bt656 -# video/celb -# video/dv -# video/example -video/h261 h261 -video/h263 h263 -# video/h263-1998 -# video/h263-2000 -video/h264 h264 -# video/h264-rcdo -# video/h264-svc -video/jpeg jpgv -# video/jpeg2000 -video/jpm jpm jpgm -video/mj2 mj2 mjp2 -# video/mp1s -# video/mp2p -# video/mp2t -video/mp4 mp4 mp4v mpg4 -# video/mp4v-es -video/mpeg mpeg mpg mpe m1v m2v -# video/mpeg4-generic -# video/mpv -# video/nv -video/ogg ogv -# video/parityfec -# video/pointer -video/quicktime qt mov -# video/raw -# video/rtp-enc-aescm128 -# video/rtx -# video/smpte292m -# video/ulpfec -# video/vc1 -# video/vnd.cctv -video/vnd.dece.hd uvh uvvh -video/vnd.dece.mobile uvm uvvm -# video/vnd.dece.mp4 -video/vnd.dece.pd uvp uvvp -video/vnd.dece.sd uvs uvvs -video/vnd.dece.video uvv uvvv -# video/vnd.directv.mpeg -# video/vnd.directv.mpeg-tts -# video/vnd.dlna.mpeg-tts -video/vnd.dvb.file dvb -video/vnd.fvt fvt -# video/vnd.hns.video -# video/vnd.iptvforum.1dparityfec-1010 -# video/vnd.iptvforum.1dparityfec-2005 -# video/vnd.iptvforum.2dparityfec-1010 -# video/vnd.iptvforum.2dparityfec-2005 -# video/vnd.iptvforum.ttsavc -# video/vnd.iptvforum.ttsmpeg2 -# video/vnd.motorola.video -# video/vnd.motorola.videop -video/vnd.mpegurl mxu m4u -video/vnd.ms-playready.media.pyv pyv -# video/vnd.nokia.interleaved-multimedia -# video/vnd.nokia.videovoip -# video/vnd.objectvideo -# video/vnd.sealed.mpeg1 -# video/vnd.sealed.mpeg4 -# video/vnd.sealed.swf -# video/vnd.sealedmedia.softseal.mov -video/vnd.uvvu.mp4 uvu uvvu -video/vnd.vivo viv -video/webm webm -video/x-f4v f4v -video/x-fli fli -video/x-flv flv -video/x-m4v m4v -video/x-matroska mkv mk3d mks -video/x-mng mng -video/x-ms-asf asf asx -video/x-ms-vob vob -video/x-ms-wm wm -video/x-ms-wmv wmv -video/x-ms-wmx wmx -video/x-ms-wvx wvx -video/x-msvideo avi -video/x-sgi-movie movie -video/x-smv smv -x-conference/x-cooltalk ice diff --git a/node_modules/nodetime/node_modules/request/node_modules/mime/types/node.types b/node_modules/nodetime/node_modules/request/node_modules/mime/types/node.types deleted file mode 100644 index 9097334..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/mime/types/node.types +++ /dev/null @@ -1,59 +0,0 @@ -# What: Google Chrome Extension -# Why: To allow apps to (work) be served with the right content type header. -# http://codereview.chromium.org/2830017 -# Added by: niftylettuce -application/x-chrome-extension crx - -# What: OTF Message Silencer -# Why: To silence the "Resource interpreted as font but transferred with MIME -# type font/otf" message that occurs in Google Chrome -# Added by: niftylettuce -font/opentype otf - -# What: HTC support -# Why: To properly render .htc files such as CSS3PIE -# Added by: niftylettuce -text/x-component htc - -# What: HTML5 application cache manifest -# Why: De-facto standard. Required by Mozilla browser when serving HTML5 apps -# per https://developer.mozilla.org/en/offline_resources_in_firefox -# Added by: louisremi -text/cache-manifest appcache manifest - -# What: node binary buffer format -# Why: semi-standard extension w/in the node community -# Added by: tootallnate -application/octet-stream buffer - -# What: The "protected" MP-4 formats used by iTunes. -# Why: Required for streaming music to browsers (?) -# Added by: broofa -application/mp4 m4p -audio/mp4 m4a - -# What: Music playlist format (http://en.wikipedia.org/wiki/M3U) -# Why: See https://github.com/bentomas/node-mime/pull/6 -# Added by: mjrusso -application/x-mpegURL m3u8 - -# What: Video format, Part of RFC1890 -# Why: See https://github.com/bentomas/node-mime/pull/6 -# Added by: mjrusso -video/MP2T ts - -# What: The FLAC lossless codec format -# Why: Streaming and serving FLAC audio -# Added by: jacobrask -audio/flac flac - -# What: EventSource mime type -# Why: mime type of Server-Sent Events stream -# http://www.w3.org/TR/eventsource/#text-event-stream -# Added by: francois2metz -text/event-stream event-stream - -# What: Mozilla App manifest mime type -# Why: https://developer.mozilla.org/en/Apps/Manifest#Serving_manifests -# Added by: ednapiranha -application/x-web-app-manifest+json webapp diff --git a/node_modules/nodetime/node_modules/request/oauth.js b/node_modules/nodetime/node_modules/request/oauth.js deleted file mode 100644 index e35bfa6..0000000 --- a/node_modules/nodetime/node_modules/request/oauth.js +++ /dev/null @@ -1,43 +0,0 @@ -var crypto = require('crypto') - , qs = require('querystring') - ; - -function sha1 (key, body) { - return crypto.createHmac('sha1', key).update(body).digest('base64') -} - -function rfc3986 (str) { - return encodeURIComponent(str) - .replace(/!/g,'%21') - .replace(/\*/g,'%2A') - .replace(/\(/g,'%28') - .replace(/\)/g,'%29') - .replace(/'/g,'%27') - ; -} - -function hmacsign (httpMethod, base_uri, params, consumer_secret, token_secret) { - // adapted from https://dev.twitter.com/docs/auth/oauth and - // https://dev.twitter.com/docs/auth/creating-signature - - var querystring = Object.keys(params).sort().map(function(key){ - // big WTF here with the escape + encoding but it's what twitter wants - return escape(rfc3986(key)) + "%3D" + escape(rfc3986(params[key])) - }).join('%26') - - var base = [ - httpMethod ? httpMethod.toUpperCase() : 'GET', - rfc3986(base_uri), - querystring - ].join('&') - - var key = [ - consumer_secret, - token_secret || '' - ].map(rfc3986).join('&') - - return sha1(key, base) -} - -exports.hmacsign = hmacsign -exports.rfc3986 = rfc3986 diff --git a/node_modules/nodetime/node_modules/request/package.json b/node_modules/nodetime/node_modules/request/package.json deleted file mode 100644 index 5c845e3..0000000 --- a/node_modules/nodetime/node_modules/request/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "request", - "description": "Simplified HTTP request client.", - "tags": [ - "http", - "simple", - "util", - "utility" - ], - "version": "2.12.0", - "author": { - "name": "Mikeal Rogers", - "email": "mikeal.rogers@gmail.com" - }, - "repository": { - "type": "git", - "url": "http://github.com/mikeal/request.git" - }, - "bugs": { - "url": "http://github.com/mikeal/request/issues" - }, - "engines": [ - "node >= 0.3.6" - ], - "main": "./main", - "dependencies": { - "form-data": "~0.0.3", - "mime": "~1.2.7" - }, - "bundleDependencies": [ - "form-data", - "mime" - ], - "scripts": { - "test": "node tests/run.js" - }, - "readme": "# Request -- Simplified HTTP request method\n\n## Install\n\n
    \n  npm install request\n
    \n\nOr from source:\n\n
    \n  git clone git://github.com/mikeal/request.git \n  cd request\n  npm link\n
    \n\n## Super simple to use\n\nRequest is designed to be the simplest way possible to make http calls. It supports HTTPS and follows redirects by default.\n\n```javascript\nvar request = require('request');\nrequest('http://www.google.com', function (error, response, body) {\n if (!error && response.statusCode == 200) {\n console.log(body) // Print the google web page.\n }\n})\n```\n\n## Streaming\n\nYou can stream any response to a file stream.\n\n```javascript\nrequest('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png'))\n```\n\nYou can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types, in this case `application/json`, and use the proper content-type in the PUT request if one is not already provided in the headers.\n\n```javascript\nfs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json'))\n```\n\nRequest can also pipe to itself. When doing so the content-type and content-length will be preserved in the PUT headers.\n\n```javascript\nrequest.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png'))\n```\n\nNow let's get fancy.\n\n```javascript\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n if (req.method === 'PUT') {\n req.pipe(request.put('http://mysite.com/doodle.png'))\n } else if (req.method === 'GET' || req.method === 'HEAD') {\n request.get('http://mysite.com/doodle.png').pipe(resp)\n } \n }\n})\n```\n\nYou can also pipe() from a http.ServerRequest instance and to a http.ServerResponse instance. The HTTP method and headers will be sent as well as the entity-body data. Which means that, if you don't really care about security, you can do:\n\n```javascript\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n var x = request('http://mysite.com/doodle.png')\n req.pipe(x)\n x.pipe(resp)\n }\n})\n```\n\nAnd since pipe() returns the destination stream in node 0.5.x you can do one line proxying :)\n\n```javascript\nreq.pipe(request('http://mysite.com/doodle.png')).pipe(resp)\n```\n\nAlso, none of this new functionality conflicts with requests previous features, it just expands them.\n\n```javascript\nvar r = request.defaults({'proxy':'http://localproxy.com'})\n\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n r.get('http://google.com/doodle.png').pipe(resp)\n }\n})\n```\nYou can still use intermediate proxies, the requests will still follow HTTP forwards, etc.\n\n## Forms\n\n`request` supports `application/x-www-form-urlencoded` and `multipart/form-data` form uploads. For `multipart/related` refer to the `multipart` API.\n\nUrl encoded forms are simple\n\n```javascript\nrequest.post('http://service.com/upload', {form:{key:'value'}})\n// or\nrequest.post('http://service.com/upload').form({key:'value'})\n```\n\nFor `multipart/form-data` we use the [form-data](https://github.com/felixge/node-form-data) library by [@felixge](https://github.com/felixge). You don't need to worry about piping the form object or setting the headers, `request` will handle that for you.\n\n```javascript\nvar r = request.post('http://service.com/upload')\nvar form = r.form()\nform.append('my_field', 'my_value')\nform.append('my_buffer', new Buffer([1, 2, 3]))\nform.append('my_file', fs.createReadStream(path.join(__dirname, 'doodle.png'))\nform.append('remote_file', request('http://google.com/doodle.png'))\n```\n\n## OAuth Signing\n\n```javascript\n// Twitter OAuth\nvar qs = require('querystring')\n , oauth =\n { callback: 'http://mysite.com/callback/'\n , consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n }\n , url = 'https://api.twitter.com/oauth/request_token'\n ;\nrequest.post({url:url, oauth:oauth}, function (e, r, body) {\n // Assume by some stretch of magic you aquired the verifier\n var access_token = qs.parse(body)\n , oauth = \n { consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n , token: access_token.oauth_token\n , verifier: VERIFIER\n , token_secret: access_token.oauth_token_secret\n }\n , url = 'https://api.twitter.com/oauth/access_token'\n ;\n request.post({url:url, oauth:oauth}, function (e, r, body) {\n var perm_token = qs.parse(body)\n , oauth = \n { consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n , token: perm_token.oauth_token\n , token_secret: perm_token.oauth_token_secret\n }\n , url = 'https://api.twitter.com/1/users/show.json?'\n , params = \n { screen_name: perm_token.screen_name\n , user_id: perm_token.user_id\n }\n ;\n url += qs.stringify(params)\n request.get({url:url, oauth:oauth, json:true}, function (e, r, user) {\n console.log(user)\n })\n })\n})\n```\n\n\n\n### request(options, callback)\n\nThe first argument can be either a url or an options object. The only required option is uri, all others are optional.\n\n* `uri` || `url` - fully qualified uri or a parsed url object from url.parse()\n* `qs` - object containing querystring values to be appended to the uri\n* `method` - http method, defaults to GET\n* `headers` - http headers, defaults to {}\n* `body` - entity body for POST and PUT requests. Must be buffer or string.\n* `form` - when passed an object this will set `body` but to a querystring representation of value and adds `Content-type: application/x-www-form-urlencoded; charset=utf-8` header. When passed no option a FormData instance is returned that will be piped to request.\n* `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header. Additionally, parses the response body as json.\n* `multipart` - (experimental) array of objects which contains their own headers and `body` attribute. Sends `multipart/related` request. See example below.\n* `followRedirect` - follow HTTP 3xx responses as redirects. defaults to true.\n* `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects. defaults to false.\n* `maxRedirects` - the maximum number of redirects to follow, defaults to 10.\n* `encoding` - Encoding to be used on `setEncoding` of response data. If set to `null`, the body is returned as a Buffer.\n* `pool` - A hash object containing the agents for these requests. If omitted this request will use the global pool which is set to node's default maxSockets.\n* `pool.maxSockets` - Integer containing the maximum amount of sockets in the pool.\n* `timeout` - Integer containing the number of milliseconds to wait for a request to respond before aborting the request\t\n* `proxy` - An HTTP proxy to be used. Support proxy Auth with Basic Auth the same way it's supported with the `url` parameter by embedding the auth info in the uri.\n* `oauth` - Options for OAuth HMAC-SHA1 signing, see documentation above.\n* `strictSSL` - Set to `true` to require that SSL certificates be valid. Note: to use your own certificate authority, you need to specify an agent that was created with that ca as an option.\n* `jar` - Set to `false` if you don't want cookies to be remembered for future use or define your custom cookie jar (see examples section)\n* `aws` - object containing aws signing information, should have the properties `key` and `secret` as well as `bucket` unless you're specifying your bucket as part of the path, or you are making a request that doesn't use a bucket (i.e. GET Services)\n\n\nThe callback argument gets 3 arguments. The first is an error when applicable (usually from the http.Client option not the http.ClientRequest object). The second in an http.ClientResponse object. The third is the response body String or Buffer.\n\n## Convenience methods\n\nThere are also shorthand methods for different HTTP METHODs and some other conveniences.\n\n### request.defaults(options) \n \nThis method returns a wrapper around the normal request API that defaults to whatever options you pass in to it.\n\n### request.put\n\nSame as request() but defaults to `method: \"PUT\"`.\n\n```javascript\nrequest.put(url)\n```\n\n### request.post\n\nSame as request() but defaults to `method: \"POST\"`.\n\n```javascript\nrequest.post(url)\n```\n\n### request.head\n\nSame as request() but defaults to `method: \"HEAD\"`.\n\n```javascript\nrequest.head(url)\n```\n\n### request.del\n\nSame as request() but defaults to `method: \"DELETE\"`.\n\n```javascript\nrequest.del(url)\n```\n\n### request.get\n\nAlias to normal request method for uniformity.\n\n```javascript\nrequest.get(url)\n```\n### request.cookie\n\nFunction that creates a new cookie.\n\n```javascript\nrequest.cookie('cookie_string_here')\n```\n### request.jar\n\nFunction that creates a new cookie jar.\n\n```javascript\nrequest.jar()\n```\n\n\n## Examples:\n\n```javascript\n var request = require('request')\n , rand = Math.floor(Math.random()*100000000).toString()\n ;\n request(\n { method: 'PUT'\n , uri: 'http://mikeal.iriscouch.com/testjs/' + rand\n , multipart: \n [ { 'content-type': 'application/json'\n , body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}})\n }\n , { body: 'I am an attachment' }\n ] \n }\n , function (error, response, body) {\n if(response.statusCode == 201){\n console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand)\n } else {\n console.log('error: '+ response.statusCode)\n console.log(body)\n }\n }\n )\n```\nCookies are enabled by default (so they can be used in subsequent requests). To disable cookies set jar to false (either in defaults or in the options sent).\n\n```javascript\nvar request = request.defaults({jar: false})\nrequest('http://www.google.com', function () {\n request('http://images.google.com')\n})\n```\n\nIf you to use a custom cookie jar (instead of letting request use its own global cookie jar) you do so by setting the jar default or by specifying it as an option:\n\n```javascript\nvar j = request.jar()\nvar request = request.defaults({jar:j})\nrequest('http://www.google.com', function () {\n request('http://images.google.com')\n})\n```\nOR\n\n```javascript\nvar j = request.jar()\nvar cookie = request.cookie('your_cookie_here')\nj.add(cookie)\nrequest({url: 'http://www.google.com', jar: j}, function () {\n request('http://images.google.com')\n})\n```\n", - "_id": "request@2.12.0", - "dist": { - "shasum": "4b34ada987d9f06469e3ee3fd0280f0b669531e7" - }, - "_from": "request@2.12.0" -} diff --git a/node_modules/nodetime/node_modules/request/tests/googledoodle.png b/node_modules/nodetime/node_modules/request/tests/googledoodle.png deleted file mode 100644 index f80c9c52d3c507996535a19ee0bcfe3821de322d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38510 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 diff --git a/node_modules/nodetime/node_modules/request/tests/run.js b/node_modules/nodetime/node_modules/request/tests/run.js deleted file mode 100644 index 538a65c..0000000 --- a/node_modules/nodetime/node_modules/request/tests/run.js +++ /dev/null @@ -1,45 +0,0 @@ -var spawn = require('child_process').spawn - , exitCode = 0 - ; - -var tests = [ - 'test-body.js' - , 'test-cookie.js' - , 'test-cookiejar.js' - , 'test-defaults.js' - , 'test-errors.js' - , 'test-form.js' - , 'test-follow-all-303.js' - , 'test-follow-all.js' - , 'test-headers.js' - , 'test-httpModule.js' - , 'test-https.js' - , 'test-https-strict.js' - , 'test-oauth.js' - , 'test-params.js' - , 'test-pipes.js' - , 'test-pool.js' - , 'test-protocol-changing-redirect.js' - , 'test-proxy.js' - , 'test-piped-redirect.js' - , 'test-qs.js' - , 'test-redirect.js' - , 'test-timeout.js' - , 'test-toJSON.js' - , 'test-tunnel.js' -] - -var next = function () { - if (tests.length === 0) process.exit(exitCode); - - var file = tests.shift() - console.log(file) - var proc = spawn('node', [ 'tests/' + file ]) - proc.stdout.pipe(process.stdout) - proc.stderr.pipe(process.stderr) - proc.on('exit', function (code) { - exitCode += code || 0 - next() - }) -} -next() diff --git a/node_modules/nodetime/node_modules/request/tests/server.js b/node_modules/nodetime/node_modules/request/tests/server.js deleted file mode 100644 index b6eacba..0000000 --- a/node_modules/nodetime/node_modules/request/tests/server.js +++ /dev/null @@ -1,90 +0,0 @@ -var fs = require('fs') - , http = require('http') - , path = require('path') - , https = require('https') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - ; - -exports.createServer = function (port) { - port = port || 6767 - var s = http.createServer(function (req, resp) { - s.emit(req.url, req, resp); - }) - s.port = port - s.url = 'http://localhost:'+port - return s; -} - -exports.createSSLServer = function(port, opts) { - port = port || 16767 - - var options = { 'key' : path.join(__dirname, 'ssl', 'test.key') - , 'cert': path.join(__dirname, 'ssl', 'test.crt') - } - if (opts) { - for (var i in opts) options[i] = opts[i] - } - - for (var i in options) { - options[i] = fs.readFileSync(options[i]) - } - - var s = https.createServer(options, function (req, resp) { - s.emit(req.url, req, resp); - }) - s.port = port - s.url = 'https://localhost:'+port - return s; -} - -exports.createPostStream = function (text) { - var postStream = new stream.Stream(); - postStream.writeable = true; - postStream.readable = true; - setTimeout(function () {postStream.emit('data', new Buffer(text)); postStream.emit('end')}, 0); - return postStream; -} -exports.createPostValidator = function (text, reqContentType) { - var l = function (req, resp) { - var r = ''; - req.on('data', function (chunk) {r += chunk}) - req.on('end', function () { - if (req.headers['content-type'] && req.headers['content-type'].indexOf('boundary=') >= 0) { - var boundary = req.headers['content-type'].split('boundary=')[1]; - text = text.replace(/__BOUNDARY__/g, boundary); - } - if (r !== text) console.log(r, text); - assert.equal(r, text) - if (reqContentType) { - assert.ok(req.headers['content-type']) - assert.ok(~req.headers['content-type'].indexOf(reqContentType)) - } - resp.writeHead(200, {'content-type':'text/plain'}) - resp.write('OK') - resp.end() - }) - } - return l; -} -exports.createGetResponse = function (text, contentType) { - var l = function (req, resp) { - contentType = contentType || 'text/plain' - resp.writeHead(200, {'content-type':contentType}) - resp.write(text) - resp.end() - } - return l; -} -exports.createChunkResponse = function (chunks, contentType) { - var l = function (req, resp) { - contentType = contentType || 'text/plain' - resp.writeHead(200, {'content-type':contentType}) - chunks.forEach(function (chunk) { - resp.write(chunk) - }) - resp.end() - } - return l; -} diff --git a/node_modules/nodetime/node_modules/request/tests/squid.conf b/node_modules/nodetime/node_modules/request/tests/squid.conf deleted file mode 100644 index 0d4a3b6..0000000 --- a/node_modules/nodetime/node_modules/request/tests/squid.conf +++ /dev/null @@ -1,77 +0,0 @@ -# -# Recommended minimum configuration: -# -acl manager proto cache_object -acl localhost src 127.0.0.1/32 ::1 -acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1 - -# Example rule allowing access from your local networks. -# Adapt to list your (internal) IP networks from where browsing -# should be allowed -acl localnet src 10.0.0.0/8 # RFC1918 possible internal network -acl localnet src 172.16.0.0/12 # RFC1918 possible internal network -acl localnet src 192.168.0.0/16 # RFC1918 possible internal network -acl localnet src fc00::/7 # RFC 4193 local private network range -acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines - -acl SSL_ports port 443 -acl Safe_ports port 80 # http -acl Safe_ports port 21 # ftp -acl Safe_ports port 443 # https -acl Safe_ports port 70 # gopher -acl Safe_ports port 210 # wais -acl Safe_ports port 1025-65535 # unregistered ports -acl Safe_ports port 280 # http-mgmt -acl Safe_ports port 488 # gss-http -acl Safe_ports port 591 # filemaker -acl Safe_ports port 777 # multiling http -acl CONNECT method CONNECT - -# -# Recommended minimum Access Permission configuration: -# -# Only allow cachemgr access from localhost -http_access allow manager localhost -http_access deny manager - -# Deny requests to certain unsafe ports -http_access deny !Safe_ports - -# Deny CONNECT to other than secure SSL ports -#http_access deny CONNECT !SSL_ports - -# We strongly recommend the following be uncommented to protect innocent -# web applications running on the proxy server who think the only -# one who can access services on "localhost" is a local user -#http_access deny to_localhost - -# -# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS -# - -# Example rule allowing access from your local networks. -# Adapt localnet in the ACL section to list your (internal) IP networks -# from where browsing should be allowed -http_access allow localnet -http_access allow localhost - -# And finally deny all other access to this proxy -http_access deny all - -# Squid normally listens to port 3128 -http_port 3128 - -# We recommend you to use at least the following line. -hierarchy_stoplist cgi-bin ? - -# Uncomment and adjust the following to add a disk cache directory. -#cache_dir ufs /usr/local/var/cache 100 16 256 - -# Leave coredumps in the first cache dir -coredump_dir /usr/local/var/cache - -# Add any of your own refresh_pattern entries above these. -refresh_pattern ^ftp: 1440 20% 10080 -refresh_pattern ^gopher: 1440 0% 1440 -refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 -refresh_pattern . 0 20% 4320 diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.cnf b/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.cnf deleted file mode 100644 index 425a889..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.cnf +++ /dev/null @@ -1,20 +0,0 @@ -[ req ] -default_bits = 1024 -days = 3650 -distinguished_name = req_distinguished_name -attributes = req_attributes -prompt = no -output_password = password - -[ req_distinguished_name ] -C = US -ST = CA -L = Oakland -O = request -OU = request Certificate Authority -CN = requestCA -emailAddress = mikeal@mikealrogers.com - -[ req_attributes ] -challengePassword = password challenge - diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.crl b/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.crl deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.crt b/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.crt deleted file mode 100644 index b4524e4..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.crt +++ /dev/null @@ -1,17 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICvTCCAiYCCQDn+P/MSbDsWjANBgkqhkiG9w0BAQUFADCBojELMAkGA1UEBhMC -VVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMRAwDgYDVQQKEwdyZXF1 -ZXN0MSYwJAYDVQQLEx1yZXF1ZXN0IENlcnRpZmljYXRlIEF1dGhvcml0eTESMBAG -A1UEAxMJcmVxdWVzdENBMSYwJAYJKoZIhvcNAQkBFhdtaWtlYWxAbWlrZWFscm9n -ZXJzLmNvbTAeFw0xMjAzMDEyMjUwNTZaFw0yMjAyMjcyMjUwNTZaMIGiMQswCQYD -VQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNVBAcTB09ha2xhbmQxEDAOBgNVBAoT -B3JlcXVlc3QxJjAkBgNVBAsTHXJlcXVlc3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -MRIwEAYDVQQDEwlyZXF1ZXN0Q0ExJjAkBgkqhkiG9w0BCQEWF21pa2VhbEBtaWtl -YWxyb2dlcnMuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7t9pQUAK4 -5XJYTI6NrF0n3G2HZsfN+rPYSVzzL8SuVyb1tHXos+vbPm3NKI4E8X1yVAXU8CjJ -5SqXnp4DAypAhaseho81cbhk7LXUhFz78OvAa+OD+xTAEAnNQ8tGUr4VGyplEjfD -xsBVuqV2j8GPNTftr+drOCFlqfAgMrBn4wIDAQABMA0GCSqGSIb3DQEBBQUAA4GB -ADVdTlVAL45R+PACNS7Gs4o81CwSclukBu4FJbxrkd4xGQmurgfRrYYKjtqiopQm -D7ysRamS3HMN9/VKq2T7r3z1PMHPAy7zM4uoXbbaTKwlnX4j/8pGPn8Ca3qHXYlo -88L/OOPc6Di7i7qckS3HFbXQCTiULtxWmy97oEuTwrAj ------END CERTIFICATE----- diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.csr b/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.csr deleted file mode 100644 index e48c56e..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.csr +++ /dev/null @@ -1,13 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIICBjCCAW8CAQAwgaIxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEQMA4GA1UE -BxMHT2FrbGFuZDEQMA4GA1UEChMHcmVxdWVzdDEmMCQGA1UECxMdcmVxdWVzdCBD -ZXJ0aWZpY2F0ZSBBdXRob3JpdHkxEjAQBgNVBAMTCXJlcXVlc3RDQTEmMCQGCSqG -SIb3DQEJARYXbWlrZWFsQG1pa2VhbHJvZ2Vycy5jb20wgZ8wDQYJKoZIhvcNAQEB -BQADgY0AMIGJAoGBALu32lBQArjlclhMjo2sXSfcbYdmx836s9hJXPMvxK5XJvW0 -deiz69s+bc0ojgTxfXJUBdTwKMnlKpeengMDKkCFqx6GjzVxuGTstdSEXPvw68Br -44P7FMAQCc1Dy0ZSvhUbKmUSN8PGwFW6pXaPwY81N+2v52s4IWWp8CAysGfjAgMB -AAGgIzAhBgkqhkiG9w0BCQcxFBMScGFzc3dvcmQgY2hhbGxlbmdlMA0GCSqGSIb3 -DQEBBQUAA4GBAGJO7grHeVHXetjHEK8urIxdnvfB2qeZeObz4GPKIkqUurjr0rfj -bA3EK1kDMR5aeQWR8RunixdM16Q6Ry0lEdLVWkdSwRN9dmirIHT9cypqnD/FYOia -SdezZ0lUzXgmJIwRYRwB1KSMMocIf52ll/xC2bEGg7/ZAEuAyAgcZV3X ------END CERTIFICATE REQUEST----- diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.key b/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.key deleted file mode 100644 index a53e7f7..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.key +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: DES-EDE3-CBC,C8B5887048377F02 - -nyD5ZH0Wup2uWsDvurq5mKDaDrf8lvNn9w0SH/ZkVnfR1/bkwqrFriqJWvZNUG+q -nS0iBYczsWLJnbub9a1zLOTENWUKVD5uqbC3aGHhnoUTNSa27DONgP8gHOn6JgR+ -GAKo01HCSTiVT4LjkwN337QKHnMP2fTzg+IoC/CigvMcq09hRLwU1/guq0GJKGwH -gTxYNuYmQC4Tjh8vdS4liF+Ve/P3qPR2CehZrIOkDT8PHJBGQJRo4xGUIB7Tpk38 -VCk+UZ0JCS2coY8VkY/9tqFJp/ZnnQQVmaNbdRqg7ECKL+bXnNo7yjzmazPZmPe3 -/ShbE0+CTt7LrjCaQAxWbeDzqfo1lQfgN1LulTm8MCXpQaJpv7v1VhIhQ7afjMYb -4thW/ypHPiYS2YJCAkAVlua9Oxzzh1qJoh8Df19iHtpd79Q77X/qf+1JvITlMu0U -gi7yEatmQcmYNws1mtTC1q2DXrO90c+NZ0LK/Alse6NRL/xiUdjug2iHeTf/idOR -Gg/5dSZbnnlj1E5zjSMDkzg6EHAFmHV4jYGSAFLEQgp4V3ZhMVoWZrvvSHgKV/Qh -FqrAK4INr1G2+/QTd09AIRzfy3/j6yD4A9iNaOsEf9Ua7Qh6RcALRCAZTWR5QtEf -dX+iSNJ4E85qXs0PqwkMDkoaxIJ+tmIRJY7y8oeylV8cfGAi8Soubt/i3SlR8IHC -uDMas/2OnwafK3N7ODeE1i7r7wkzQkSHaEz0TrF8XRnP25jAICCSLiMdAAjKfxVb -EvzsFSuAy3Jt6bU3hSLY9o4YVYKE+68ITMv9yNjvTsEiW+T+IbN34w== ------END RSA PRIVATE KEY----- diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.srl b/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.srl deleted file mode 100644 index 17128db..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.srl +++ /dev/null @@ -1 +0,0 @@ -ADF62016AA40C9C3 diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.cnf b/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.cnf deleted file mode 100644 index cd1fd1e..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.cnf +++ /dev/null @@ -1,19 +0,0 @@ -[ req ] -default_bits = 1024 -days = 3650 -distinguished_name = req_distinguished_name -attributes = req_attributes -prompt = no - -[ req_distinguished_name ] -C = US -ST = CA -L = Oakland -O = request -OU = testing -CN = testing.request.mikealrogers.com -emailAddress = mikeal@mikealrogers.com - -[ req_attributes ] -challengePassword = password challenge - diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.crt b/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.crt deleted file mode 100644 index efe96ce..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.crt +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICejCCAeMCCQCt9iAWqkDJwzANBgkqhkiG9w0BAQUFADCBojELMAkGA1UEBhMC -VVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMRAwDgYDVQQKEwdyZXF1 -ZXN0MSYwJAYDVQQLEx1yZXF1ZXN0IENlcnRpZmljYXRlIEF1dGhvcml0eTESMBAG -A1UEAxMJcmVxdWVzdENBMSYwJAYJKoZIhvcNAQkBFhdtaWtlYWxAbWlrZWFscm9n -ZXJzLmNvbTAeFw0xMjAzMDEyMjUwNTZaFw0yMjAyMjcyMjUwNTZaMIGjMQswCQYD -VQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNVBAcTB09ha2xhbmQxEDAOBgNVBAoT -B3JlcXVlc3QxEDAOBgNVBAsTB3Rlc3RpbmcxKTAnBgNVBAMTIHRlc3RpbmcucmVx -dWVzdC5taWtlYWxyb2dlcnMuY29tMSYwJAYJKoZIhvcNAQkBFhdtaWtlYWxAbWlr -ZWFscm9nZXJzLmNvbTBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDgVl0jMumvOpmM -20W5v9yhGgZj8hPhEQF/N7yCBVBn/rWGYm70IHC8T/pR5c0LkWc5gdnCJEvKWQjh -DBKxZD8FAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEABShRkNgFbgs4vUWW9R9deNJj -7HJoiTmvkmoOC7QzcYkjdgHbOxsSq3rBnwxsVjY9PAtPwBn0GRspOeG7KzKRgySB -kb22LyrCFKbEOfKO/+CJc80ioK9zEPVjGsFMyAB+ftYRqM+s/4cQlTg/m89l01wC -yapjN3RxZbInGhWR+jA= ------END CERTIFICATE----- diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.csr b/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.csr deleted file mode 100644 index a8e7595..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.csr +++ /dev/null @@ -1,11 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIIBgjCCASwCAQAwgaMxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEQMA4GA1UE -BxMHT2FrbGFuZDEQMA4GA1UEChMHcmVxdWVzdDEQMA4GA1UECxMHdGVzdGluZzEp -MCcGA1UEAxMgdGVzdGluZy5yZXF1ZXN0Lm1pa2VhbHJvZ2Vycy5jb20xJjAkBgkq -hkiG9w0BCQEWF21pa2VhbEBtaWtlYWxyb2dlcnMuY29tMFwwDQYJKoZIhvcNAQEB -BQADSwAwSAJBAOBWXSMy6a86mYzbRbm/3KEaBmPyE+ERAX83vIIFUGf+tYZibvQg -cLxP+lHlzQuRZzmB2cIkS8pZCOEMErFkPwUCAwEAAaAjMCEGCSqGSIb3DQEJBzEU -ExJwYXNzd29yZCBjaGFsbGVuZ2UwDQYJKoZIhvcNAQEFBQADQQBD3E5WekQzCEJw -7yOcqvtPYIxGaX8gRKkYfLPoj3pm3GF5SGqtJKhylKfi89szHXgktnQgzff9FN+A -HidVJ/3u ------END CERTIFICATE REQUEST----- diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.js b/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.js deleted file mode 100644 index 05e21c1..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.js +++ /dev/null @@ -1,28 +0,0 @@ -var fs = require("fs") -var https = require("https") -var options = { key: fs.readFileSync("./server.key") - , cert: fs.readFileSync("./server.crt") } - -var server = https.createServer(options, function (req, res) { - res.writeHead(200) - res.end() - server.close() -}) -server.listen(1337) - -var ca = fs.readFileSync("./ca.crt") -var agent = new https.Agent({ host: "localhost", port: 1337, ca: ca }) - -https.request({ host: "localhost" - , method: "HEAD" - , port: 1337 - , headers: { host: "testing.request.mikealrogers.com" } - , agent: agent - , ca: [ ca ] - , path: "/" }, function (res) { - if (res.client.authorized) { - console.log("node test: OK") - } else { - throw new Error(res.client.authorizationError) - } -}).end() diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.key b/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.key deleted file mode 100644 index 72d8698..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.key +++ /dev/null @@ -1,9 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIBOwIBAAJBAOBWXSMy6a86mYzbRbm/3KEaBmPyE+ERAX83vIIFUGf+tYZibvQg -cLxP+lHlzQuRZzmB2cIkS8pZCOEMErFkPwUCAwEAAQJAK+r8ZM2sze8s7FRo/ApB -iRBtO9fCaIdJwbwJnXKo4RKwZDt1l2mm+fzZ+/QaQNjY1oTROkIIXmnwRvZWfYlW -gQIhAPKYsG+YSBN9o8Sdp1DMyZ/rUifKX3OE6q9tINkgajDVAiEA7Ltqh01+cnt0 -JEnud/8HHcuehUBLMofeg0G+gCnSbXECIQCqDvkXsWNNLnS/3lgsnvH0Baz4sbeJ -rjIpuVEeg8eM5QIgbu0+9JmOV6ybdmmiMV4yAncoF35R/iKGVHDZCAsQzDECIQDZ -0jGz22tlo5YMcYSqrdD3U4sds1pwiAaWFRbCunoUJw== ------END RSA PRIVATE KEY----- diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/npm-ca.crt b/node_modules/nodetime/node_modules/request/tests/ssl/npm-ca.crt deleted file mode 100644 index fde2fe9..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/npm-ca.crt +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIChzCCAfACCQDauvz/KHp8ejANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMC -VVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMQwwCgYDVQQKEwNucG0x -IjAgBgNVBAsTGW5wbSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxDjAMBgNVBAMTBW5w -bUNBMRcwFQYJKoZIhvcNAQkBFghpQGl6cy5tZTAeFw0xMTA5MDUwMTQ3MTdaFw0y -MTA5MDIwMTQ3MTdaMIGHMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNV -BAcTB09ha2xhbmQxDDAKBgNVBAoTA25wbTEiMCAGA1UECxMZbnBtIENlcnRpZmlj -YXRlIEF1dGhvcml0eTEOMAwGA1UEAxMFbnBtQ0ExFzAVBgkqhkiG9w0BCQEWCGlA -aXpzLm1lMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLI4tIqPpRW+ACw9GE -OgBlJZwK5f8nnKCLK629Pv5yJpQKs3DENExAyOgDcyaF0HD0zk8zTp+ZsLaNdKOz -Gn2U181KGprGKAXP6DU6ByOJDWmTlY6+Ad1laYT0m64fERSpHw/hjD3D+iX4aMOl -y0HdbT5m1ZGh6SJz3ZqxavhHLQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAC4ySDbC -l7W1WpLmtLGEQ/yuMLUf6Jy/vr+CRp4h+UzL+IQpCv8FfxsYE7dhf/bmWTEupBkv -yNL18lipt2jSvR3v6oAHAReotvdjqhxddpe5Holns6EQd1/xEZ7sB1YhQKJtvUrl -ZNufy1Jf1r0ldEGeA+0ISck7s+xSh9rQD2Op ------END CERTIFICATE----- diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/test.crt b/node_modules/nodetime/node_modules/request/tests/ssl/test.crt deleted file mode 100644 index b357f86..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/test.crt +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICQzCCAawCCQCO/XWtRFck1jANBgkqhkiG9w0BAQUFADBmMQswCQYDVQQGEwJU -SDEQMA4GA1UECBMHQmFuZ2tvazEOMAwGA1UEBxMFU2lsb20xGzAZBgNVBAoTElRo -ZSBSZXF1ZXN0IE1vZHVsZTEYMBYGA1UEAxMPcmVxdWVzdC5leGFtcGxlMB4XDTEx -MTIwMzAyMjkyM1oXDTIxMTEzMDAyMjkyM1owZjELMAkGA1UEBhMCVEgxEDAOBgNV -BAgTB0Jhbmdrb2sxDjAMBgNVBAcTBVNpbG9tMRswGQYDVQQKExJUaGUgUmVxdWVz -dCBNb2R1bGUxGDAWBgNVBAMTD3JlcXVlc3QuZXhhbXBsZTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAwmctddZqlA48+NXs0yOy92DijcQV1jf87zMiYAIlNUto -wghVbTWgJU5r0pdKrD16AptnWJTzKanhItEX8XCCPgsNkq1afgTtJP7rNkwu3xcj -eIMkhJg/ay4ZnkbnhYdsii5VTU5prix6AqWRAhbkBgoA+iVyHyof8wvZyKBoFTMC -AwEAATANBgkqhkiG9w0BAQUFAAOBgQB6BybMJbpeiABgihDfEVBcAjDoQ8gUMgwV -l4NulugfKTDmArqnR9aPd4ET5jX5dkMP4bwCHYsvrcYDeWEQy7x5WWuylOdKhua4 -L4cEi2uDCjqEErIG3cc1MCOk6Cl6Ld6tkIzQSf953qfdEACRytOeUqLNQcrXrqeE -c7U8F6MWLQ== ------END CERTIFICATE----- diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/test.key b/node_modules/nodetime/node_modules/request/tests/ssl/test.key deleted file mode 100644 index b85810d..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/test.key +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIICXgIBAAKBgQDCZy111mqUDjz41ezTI7L3YOKNxBXWN/zvMyJgAiU1S2jCCFVt -NaAlTmvSl0qsPXoCm2dYlPMpqeEi0RfxcII+Cw2SrVp+BO0k/us2TC7fFyN4gySE -mD9rLhmeRueFh2yKLlVNTmmuLHoCpZECFuQGCgD6JXIfKh/zC9nIoGgVMwIDAQAB -AoGBALXFwfUf8vHTSmGlrdZS2AGFPvEtuvldyoxi9K5u8xmdFCvxnOcLsF2RsTHt -Mu5QYWhUpNJoG+IGLTPf7RJdj/kNtEs7xXqWy4jR36kt5z5MJzqiK+QIgiO9UFWZ -fjUb6oeDnTIJA9YFBdYi97MDuL89iU/UK3LkJN3hd4rciSbpAkEA+MCkowF5kSFb -rkOTBYBXZfiAG78itDXN6DXmqb9XYY+YBh3BiQM28oxCeQYyFy6pk/nstnd4TXk6 -V/ryA2g5NwJBAMgRKTY9KvxJWbESeMEFe2iBIV0c26/72Amgi7ZKUCLukLfD4tLF -+WSZdmTbbqI1079YtwaiOVfiLm45Q/3B0eUCQAaQ/0eWSGE+Yi8tdXoVszjr4GXb -G81qBi91DMu6U1It+jNfIba+MPsiHLcZJMVb4/oWBNukN7bD1nhwFWdlnu0CQQCf -Is9WHkdvz2RxbZDxb8verz/7kXXJQJhx5+rZf7jIYFxqX3yvTNv3wf2jcctJaWlZ -fVZwB193YSivcgt778xlAkEAprYUz3jczjF5r2hrgbizPzPDR94tM5BTO3ki2v3w -kbf+j2g7FNAx6kZiVN8XwfLc8xEeUGiPKwtq3ddPDFh17w== ------END RSA PRIVATE KEY----- diff --git a/node_modules/nodetime/node_modules/request/tests/test-body.js b/node_modules/nodetime/node_modules/request/tests/test-body.js deleted file mode 100644 index a624397..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-body.js +++ /dev/null @@ -1,117 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , request = require('../main.js') - ; - -var s = server.createServer(); - -var tests = - { testGet : - { resp : server.createGetResponse("TESTING!") - , expectBody: "TESTING!" - } - , testGetChunkBreak : - { resp : server.createChunkResponse( - [ new Buffer([239]) - , new Buffer([163]) - , new Buffer([191]) - , new Buffer([206]) - , new Buffer([169]) - , new Buffer([226]) - , new Buffer([152]) - , new Buffer([131]) - ]) - , expectBody: "Ω☃" - } - , testGetBuffer : - { resp : server.createGetResponse(new Buffer("TESTING!")) - , encoding: null - , expectBody: new Buffer("TESTING!") - } - , testGetEncoding : - { resp : server.createGetResponse(new Buffer('efa3bfcea9e29883', 'hex')) - , encoding: 'hex' - , expectBody: "efa3bfcea9e29883" - } - , testGetJSON : - { resp : server.createGetResponse('{"test":true}', 'application/json') - , json : true - , expectBody: {"test":true} - } - , testPutString : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : "PUTTINGDATA" - } - , testPutBuffer : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : new Buffer("PUTTINGDATA") - } - , testPutJSON : - { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) - , method: "PUT" - , json: {foo: 'bar'} - } - , testPutMultipart : - { resp: server.createPostValidator( - '--__BOUNDARY__\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__\r\n\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__--' - ) - , method: "PUT" - , multipart: - [ {'content-type': 'text/html', 'body': 'Oh hi.'} - , {'body': 'Oh hi.'} - ] - } - , testPutMultipartPreambleCRLF : - { resp: server.createPostValidator( - '\r\n--__BOUNDARY__\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__\r\n\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__--' - ) - , method: "PUT" - , preambleCRLF: true - , multipart: - [ {'content-type': 'text/html', 'body': 'Oh hi.'} - , {'body': 'Oh hi.'} - ] - } - } - -s.listen(s.port, function () { - - var counter = 0 - - for (i in tests) { - (function () { - var test = tests[i] - s.on('/'+i, test.resp) - test.uri = s.url + '/' + i - request(test, function (err, resp, body) { - if (err) throw err - if (test.expectBody) { - assert.deepEqual(test.expectBody, body) - } - counter = counter - 1; - if (counter === 0) { - console.log(Object.keys(tests).length+" tests passed.") - s.close() - } - }) - counter++ - })() - } -}) - diff --git a/node_modules/nodetime/node_modules/request/tests/test-cookie.js b/node_modules/nodetime/node_modules/request/tests/test-cookie.js deleted file mode 100644 index 6c6a7a7..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-cookie.js +++ /dev/null @@ -1,29 +0,0 @@ -var Cookie = require('../vendor/cookie') - , assert = require('assert'); - -var str = 'Sid="s543qactge.wKE61E01Bs%2BKhzmxrwrnug="; Path=/; httpOnly; Expires=Sat, 04 Dec 2010 23:27:28 GMT'; -var cookie = new Cookie(str); - -// test .toString() -assert.equal(cookie.toString(), str); - -// test .path -assert.equal(cookie.path, '/'); - -// test .httpOnly -assert.equal(cookie.httpOnly, true); - -// test .name -assert.equal(cookie.name, 'Sid'); - -// test .value -assert.equal(cookie.value, '"s543qactge.wKE61E01Bs%2BKhzmxrwrnug="'); - -// test .expires -assert.equal(cookie.expires instanceof Date, true); - -// test .path default -var cookie = new Cookie('foo=bar', { url: 'http://foo.com/bar' }); -assert.equal(cookie.path, '/bar'); - -console.log('All tests passed'); diff --git a/node_modules/nodetime/node_modules/request/tests/test-cookiejar.js b/node_modules/nodetime/node_modules/request/tests/test-cookiejar.js deleted file mode 100644 index 76fcd71..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-cookiejar.js +++ /dev/null @@ -1,90 +0,0 @@ -var Cookie = require('../vendor/cookie') - , Jar = require('../vendor/cookie/jar') - , assert = require('assert'); - -function expires(ms) { - return new Date(Date.now() + ms).toUTCString(); -} - -// test .get() expiration -(function() { - var jar = new Jar; - var cookie = new Cookie('sid=1234; path=/; expires=' + expires(1000)); - jar.add(cookie); - setTimeout(function(){ - var cookies = jar.get({ url: 'http://foo.com/foo' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], cookie); - setTimeout(function(){ - var cookies = jar.get({ url: 'http://foo.com/foo' }); - assert.equal(cookies.length, 0); - }, 1000); - }, 5); -})(); - -// test .get() path support -(function() { - var jar = new Jar; - var a = new Cookie('sid=1234; path=/'); - var b = new Cookie('sid=1111; path=/foo/bar'); - var c = new Cookie('sid=2222; path=/'); - jar.add(a); - jar.add(b); - jar.add(c); - - // should remove the duplicates - assert.equal(jar.cookies.length, 2); - - // same name, same path, latter prevails - var cookies = jar.get({ url: 'http://foo.com/' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], c); - - // same name, diff path, path specifity prevails, latter prevails - var cookies = jar.get({ url: 'http://foo.com/foo/bar' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], b); - - var jar = new Jar; - var a = new Cookie('sid=1111; path=/foo/bar'); - var b = new Cookie('sid=1234; path=/'); - jar.add(a); - jar.add(b); - - var cookies = jar.get({ url: 'http://foo.com/foo/bar' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], a); - - var cookies = jar.get({ url: 'http://foo.com/' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], b); - - var jar = new Jar; - var a = new Cookie('sid=1111; path=/foo/bar'); - var b = new Cookie('sid=3333; path=/foo/bar'); - var c = new Cookie('pid=3333; path=/foo/bar'); - var d = new Cookie('sid=2222; path=/foo/'); - var e = new Cookie('sid=1234; path=/'); - jar.add(a); - jar.add(b); - jar.add(c); - jar.add(d); - jar.add(e); - - var cookies = jar.get({ url: 'http://foo.com/foo/bar' }); - assert.equal(cookies.length, 2); - assert.equal(cookies[0], b); - assert.equal(cookies[1], c); - - var cookies = jar.get({ url: 'http://foo.com/foo/' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], d); - - var cookies = jar.get({ url: 'http://foo.com/' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], e); -})(); - -setTimeout(function() { - console.log('All tests passed'); -}, 1200); diff --git a/node_modules/nodetime/node_modules/request/tests/test-defaults.js b/node_modules/nodetime/node_modules/request/tests/test-defaults.js deleted file mode 100644 index ba09418..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-defaults.js +++ /dev/null @@ -1,114 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - ; - -var s = server.createServer(); - -s.listen(s.port, function () { - var counter = 0; - s.on('/get', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.method, 'GET') - resp.writeHead(200, {'Content-Type': 'text/plain'}); - resp.end('TESTING!'); - }); - - // test get(string, function) - request.defaults({headers:{foo:"bar"}})(s.url + '/get', function (e, r, b){ - if (e) throw e; - assert.deepEqual("TESTING!", b); - counter += 1; - }); - - s.on('/post', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.headers['content-type'], null); - assert.equal(req.method, 'POST') - resp.writeHead(200, {'Content-Type': 'application/json'}); - resp.end(JSON.stringify({foo:'bar'})); - }); - - // test post(string, object, function) - request.defaults({headers:{foo:"bar"}}).post(s.url + '/post', {json: true}, function (e, r, b){ - if (e) throw e; - assert.deepEqual('bar', b.foo); - counter += 1; - }); - - s.on('/post-body', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.headers['content-type'], 'application/json'); - assert.equal(req.method, 'POST') - resp.writeHead(200, {'Content-Type': 'application/json'}); - resp.end(JSON.stringify({foo:'bar'})); - }); - - // test post(string, object, function) with body - request.defaults({headers:{foo:"bar"}}).post(s.url + '/post-body', {json: true, body:{bar:"baz"}}, function (e, r, b){ - if (e) throw e; - assert.deepEqual('bar', b.foo); - counter += 1; - }); - - s.on('/del', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.method, 'DELETE') - resp.writeHead(200, {'Content-Type': 'application/json'}); - resp.end(JSON.stringify({foo:'bar'})); - }); - - // test .del(string, function) - request.defaults({headers:{foo:"bar"}, json:true}).del(s.url + '/del', function (e, r, b){ - if (e) throw e; - assert.deepEqual('bar', b.foo); - counter += 1; - }); - - s.on('/head', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.method, 'HEAD') - resp.writeHead(200, {'Content-Type': 'text/plain'}); - resp.end(); - }); - - // test head.(object, function) - request.defaults({headers:{foo:"bar"}}).head({uri: s.url + '/head'}, function (e, r, b){ - if (e) throw e; - counter += 1; - }); - - s.on('/get_custom', function(req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.headers.x, 'y'); - resp.writeHead(200, {'Content-Type': 'text/plain'}); - resp.end(); - }); - - // test custom request handler function - var defaultRequest = request.defaults({ - headers:{foo:"bar"} - , body: 'TESTING!' - }, function(uri, options, callback) { - var params = request.initParams(uri, options, callback); - options = params.options; - options.headers.x = 'y'; - - return request(params.uri, params.options, params.callback); - }); - - var msg = 'defaults test failed. head request should throw earlier'; - assert.throws(function() { - defaultRequest.head(s.url + '/get_custom', function(e, r, b) { - throw new Error(msg); - }); - counter+=1; - }, msg); - - defaultRequest.get(s.url + '/get_custom', function(e, r, b) { - if(e) throw e; - counter += 1; - console.log(counter.toString() + " tests passed."); - s.close(); - }); -}) diff --git a/node_modules/nodetime/node_modules/request/tests/test-errors.js b/node_modules/nodetime/node_modules/request/tests/test-errors.js deleted file mode 100644 index 1986a59..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-errors.js +++ /dev/null @@ -1,37 +0,0 @@ -var server = require('./server') - , events = require('events') - , assert = require('assert') - , request = require('../main.js') - ; - -var local = 'http://localhost:8888/asdf' - -try { - request({uri:local, body:{}}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Argument error, options.body.') -} - -try { - request({uri:local, multipart: 'foo'}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Argument error, options.multipart.') -} - -try { - request({uri:local, multipart: [{}]}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Body attribute missing in multipart.') -} - -try { - request(local, {multipart: [{}]}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Body attribute missing in multipart.') -} - -console.log("All tests passed.") diff --git a/node_modules/nodetime/node_modules/request/tests/test-follow-all-303.js b/node_modules/nodetime/node_modules/request/tests/test-follow-all-303.js deleted file mode 100644 index 3f2162d..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-follow-all-303.js +++ /dev/null @@ -1,30 +0,0 @@ -var request = require('../main'); -var http = require('http'); -var requests = 0; -var assert = require('assert'); - -var server = http.createServer(function (req, res) { - console.error(req.method, req.url); - requests ++; - - if (req.method === 'POST') { - console.error('send 303'); - res.setHeader('location', req.url); - res.statusCode = 303; - res.end('try again, i guess\n'); - } else { - console.error('send 200') - res.end('ok: ' + requests); - } -}); -server.listen(6767); - -request.post({ url: 'http://localhost:6767/foo', - followAllRedirects: true, - form: { foo: 'bar' } }, function (er, req, body) { - if (er) throw er; - assert.equal(body, 'ok: 2'); - assert.equal(requests, 2); - console.error('ok - ' + process.version); - server.close(); -}); diff --git a/node_modules/nodetime/node_modules/request/tests/test-follow-all.js b/node_modules/nodetime/node_modules/request/tests/test-follow-all.js deleted file mode 100644 index b78745b..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-follow-all.js +++ /dev/null @@ -1,35 +0,0 @@ -var request = require('../main'); -var http = require('http'); -var requests = 0; -var assert = require('assert'); - -var server = http.createServer(function (req, res) { - requests ++; - - // redirect everything 3 times, no matter what. - var c = req.headers.cookie; - - if (!c) c = 0; - else c = +c.split('=')[1] || 0; - - if (c > 3) { - res.end('ok: '+requests); - return; - } - - res.setHeader('set-cookie', 'c=' + (c + 1)); - res.setHeader('location', req.url); - res.statusCode = 302; - res.end('try again, i guess\n'); -}); -server.listen(6767); - -request.post({ url: 'http://localhost:6767/foo', - followAllRedirects: true, - form: { foo: 'bar' } }, function (er, req, body) { - if (er) throw er; - assert.equal(body, 'ok: 5'); - assert.equal(requests, 5); - console.error('ok - ' + process.version); - server.close(); -}); diff --git a/node_modules/nodetime/node_modules/request/tests/test-form.js b/node_modules/nodetime/node_modules/request/tests/test-form.js deleted file mode 100644 index aeefd31..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-form.js +++ /dev/null @@ -1,79 +0,0 @@ -var assert = require('assert') -var http = require('http'); -var path = require('path'); -var mime = require('mime'); -var request = require('../main.js'); -var fs = require('fs'); - -var remoteFile = 'http://nodejs.org/images/logo.png'; - -var FIELDS = [ - {name: 'my_field', value: 'my_value'}, - {name: 'my_buffer', value: new Buffer([1, 2, 3])}, - {name: 'my_file', value: fs.createReadStream(__dirname + '/unicycle.jpg')}, - {name: 'remote_file', value: request(remoteFile) } -]; - -var server = http.createServer(function(req, res) { - - // temp workaround - var data = ''; - req.setEncoding('utf8'); - - req.on('data', function(d) { - data += d; - }); - - req.on('end', function() { - // check for the fields' traces - - // 1st field : my_field - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 2nd field : my_buffer - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 3rd field : my_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for unicycle.jpg traces - assert.ok( data.indexOf('2005:06:21 01:44:12') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(field.value.path) ) != -1 ); - - // 4th field : remote_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for http://nodejs.org/images/logo.png traces - assert.ok( data.indexOf('ImageReady') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(remoteFile) ) != -1 ); - - res.writeHead(200); - res.end('done'); - - }); - - -}); - -server.listen(8080, function() { - - var req = request.post('http://localhost:8080/upload', function () { - server.close(); - }) - var form = req.form() - - FIELDS.forEach(function(field) { - form.append(field.name, field.value); - }); - -}); - -process.on('exit', function() { - assert.strictEqual(FIELDS.length, 0); -}); diff --git a/node_modules/nodetime/node_modules/request/tests/test-headers.js b/node_modules/nodetime/node_modules/request/tests/test-headers.js deleted file mode 100644 index 31fe3f4..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-headers.js +++ /dev/null @@ -1,52 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - , Cookie = require('../vendor/cookie') - , Jar = require('../vendor/cookie/jar') - , s = server.createServer() - -s.listen(s.port, function () { - var serverUri = 'http://localhost:' + s.port - , numTests = 0 - , numOutstandingTests = 0 - - function createTest(requestObj, serverAssertFn) { - var testNumber = numTests; - numTests += 1; - numOutstandingTests += 1; - s.on('/' + testNumber, function (req, res) { - serverAssertFn(req, res); - res.writeHead(200); - res.end(); - }); - requestObj.url = serverUri + '/' + testNumber - request(requestObj, function (err, res, body) { - assert.ok(!err) - assert.equal(res.statusCode, 200) - numOutstandingTests -= 1 - if (numOutstandingTests === 0) { - console.log(numTests + ' tests passed.') - s.close() - } - }) - } - - // Issue #125: headers.cookie shouldn't be replaced when a cookie jar isn't specified - createTest({headers: {cookie: 'foo=bar'}}, function (req, res) { - assert.ok(req.headers.cookie) - assert.equal(req.headers.cookie, 'foo=bar') - }) - - // Issue #125: headers.cookie + cookie jar - var jar = new Jar() - jar.add(new Cookie('quux=baz')); - createTest({jar: jar, headers: {cookie: 'foo=bar'}}, function (req, res) { - assert.ok(req.headers.cookie) - assert.equal(req.headers.cookie, 'foo=bar; quux=baz') - }) - - // There should be no cookie header when neither headers.cookie nor a cookie jar is specified - createTest({}, function (req, res) { - assert.ok(!req.headers.cookie) - }) -}) diff --git a/node_modules/nodetime/node_modules/request/tests/test-httpModule.js b/node_modules/nodetime/node_modules/request/tests/test-httpModule.js deleted file mode 100644 index 1866de2..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-httpModule.js +++ /dev/null @@ -1,94 +0,0 @@ -var http = require('http') - , https = require('https') - , server = require('./server') - , assert = require('assert') - , request = require('../main.js') - - -var faux_requests_made = {'http':0, 'https':0} -function wrap_request(name, module) { - // Just like the http or https module, but note when a request is made. - var wrapped = {} - Object.keys(module).forEach(function(key) { - var value = module[key]; - - if(key != 'request') - wrapped[key] = value; - else - wrapped[key] = function(options, callback) { - faux_requests_made[name] += 1 - return value.apply(this, arguments) - } - }) - - return wrapped; -} - - -var faux_http = wrap_request('http', http) - , faux_https = wrap_request('https', https) - , plain_server = server.createServer() - , https_server = server.createSSLServer() - - -plain_server.listen(plain_server.port, function() { - plain_server.on('/plain', function (req, res) { - res.writeHead(200) - res.end('plain') - }) - plain_server.on('/to_https', function (req, res) { - res.writeHead(301, {'location':'https://localhost:'+https_server.port + '/https'}) - res.end() - }) - - https_server.listen(https_server.port, function() { - https_server.on('/https', function (req, res) { - res.writeHead(200) - res.end('https') - }) - https_server.on('/to_plain', function (req, res) { - res.writeHead(302, {'location':'http://localhost:'+plain_server.port + '/plain'}) - res.end() - }) - - run_tests() - run_tests({}) - run_tests({'http:':faux_http}) - run_tests({'https:':faux_https}) - run_tests({'http:':faux_http, 'https:':faux_https}) - }) -}) - -function run_tests(httpModules) { - var to_https = 'http://localhost:'+plain_server.port+'/to_https' - var to_plain = 'https://localhost:'+https_server.port+'/to_plain' - - request(to_https, {'httpModules':httpModules}, function (er, res, body) { - assert.ok(!er, 'Bounce to SSL worked') - assert.equal(body, 'https', 'Received HTTPS server body') - done() - }) - - request(to_plain, {'httpModules':httpModules}, function (er, res, body) { - assert.ok(!er, 'Bounce to plaintext server worked') - assert.equal(body, 'plain', 'Received HTTPS server body') - done() - }) -} - - -var passed = 0; -function done() { - passed += 1 - var expected = 10 - - if(passed == expected) { - plain_server.close() - https_server.close() - - assert.equal(faux_requests_made.http, 4, 'Wrapped http module called appropriately') - assert.equal(faux_requests_made.https, 4, 'Wrapped https module called appropriately') - - console.log((expected+2) + ' tests passed.') - } -} diff --git a/node_modules/nodetime/node_modules/request/tests/test-https-strict.js b/node_modules/nodetime/node_modules/request/tests/test-https-strict.js deleted file mode 100644 index 470b68d..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-https-strict.js +++ /dev/null @@ -1,97 +0,0 @@ -// a test where we validate the siguature of the keys -// otherwise exactly the same as the ssl test - -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - , fs = require('fs') - , path = require('path') - , opts = { key: path.resolve(__dirname, 'ssl/ca/server.key') - , cert: path.resolve(__dirname, 'ssl/ca/server.crt') } - , s = server.createSSLServer(null, opts) - , caFile = path.resolve(__dirname, 'ssl/ca/ca.crt') - , ca = fs.readFileSync(caFile) - -var tests = - { testGet : - { resp : server.createGetResponse("TESTING!") - , expectBody: "TESTING!" - } - , testGetChunkBreak : - { resp : server.createChunkResponse( - [ new Buffer([239]) - , new Buffer([163]) - , new Buffer([191]) - , new Buffer([206]) - , new Buffer([169]) - , new Buffer([226]) - , new Buffer([152]) - , new Buffer([131]) - ]) - , expectBody: "Ω☃" - } - , testGetJSON : - { resp : server.createGetResponse('{"test":true}', 'application/json') - , json : true - , expectBody: {"test":true} - } - , testPutString : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : "PUTTINGDATA" - } - , testPutBuffer : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : new Buffer("PUTTINGDATA") - } - , testPutJSON : - { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) - , method: "PUT" - , json: {foo: 'bar'} - } - , testPutMultipart : - { resp: server.createPostValidator( - '--__BOUNDARY__\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__\r\n\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__--' - ) - , method: "PUT" - , multipart: - [ {'content-type': 'text/html', 'body': 'Oh hi.'} - , {'body': 'Oh hi.'} - ] - } - } - -s.listen(s.port, function () { - - var counter = 0 - - for (i in tests) { - (function () { - var test = tests[i] - s.on('/'+i, test.resp) - test.uri = s.url + '/' + i - test.strictSSL = true - test.ca = ca - test.headers = { host: 'testing.request.mikealrogers.com' } - request(test, function (err, resp, body) { - if (err) throw err - if (test.expectBody) { - assert.deepEqual(test.expectBody, body) - } - counter = counter - 1; - if (counter === 0) { - console.log(Object.keys(tests).length+" tests passed.") - s.close() - } - }) - counter++ - })() - } -}) diff --git a/node_modules/nodetime/node_modules/request/tests/test-https.js b/node_modules/nodetime/node_modules/request/tests/test-https.js deleted file mode 100644 index 58e7db9..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-https.js +++ /dev/null @@ -1,86 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - -var s = server.createSSLServer(); - -var tests = - { testGet : - { resp : server.createGetResponse("TESTING!") - , expectBody: "TESTING!" - } - , testGetChunkBreak : - { resp : server.createChunkResponse( - [ new Buffer([239]) - , new Buffer([163]) - , new Buffer([191]) - , new Buffer([206]) - , new Buffer([169]) - , new Buffer([226]) - , new Buffer([152]) - , new Buffer([131]) - ]) - , expectBody: "Ω☃" - } - , testGetJSON : - { resp : server.createGetResponse('{"test":true}', 'application/json') - , json : true - , expectBody: {"test":true} - } - , testPutString : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : "PUTTINGDATA" - } - , testPutBuffer : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : new Buffer("PUTTINGDATA") - } - , testPutJSON : - { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) - , method: "PUT" - , json: {foo: 'bar'} - } - , testPutMultipart : - { resp: server.createPostValidator( - '--__BOUNDARY__\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__\r\n\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__--' - ) - , method: "PUT" - , multipart: - [ {'content-type': 'text/html', 'body': 'Oh hi.'} - , {'body': 'Oh hi.'} - ] - } - } - -s.listen(s.port, function () { - - var counter = 0 - - for (i in tests) { - (function () { - var test = tests[i] - s.on('/'+i, test.resp) - test.uri = s.url + '/' + i - request(test, function (err, resp, body) { - if (err) throw err - if (test.expectBody) { - assert.deepEqual(test.expectBody, body) - } - counter = counter - 1; - if (counter === 0) { - console.log(Object.keys(tests).length+" tests passed.") - s.close() - } - }) - counter++ - })() - } -}) diff --git a/node_modules/nodetime/node_modules/request/tests/test-oauth.js b/node_modules/nodetime/node_modules/request/tests/test-oauth.js deleted file mode 100644 index 72ca923..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-oauth.js +++ /dev/null @@ -1,117 +0,0 @@ -var hmacsign = require('../oauth').hmacsign - , assert = require('assert') - , qs = require('querystring') - , request = require('../main') - ; - -function getsignature (r) { - var sign - r.headers.Authorization.slice('OAuth '.length).replace(/,\ /g, ',').split(',').forEach(function (v) { - if (v.slice(0, 'oauth_signature="'.length) === 'oauth_signature="') sign = v.slice('oauth_signature="'.length, -1) - }) - return decodeURIComponent(sign) -} - -// Tests from Twitter documentation https://dev.twitter.com/docs/auth/oauth - -var reqsign = hmacsign('POST', 'https://api.twitter.com/oauth/request_token', - { oauth_callback: 'http://localhost:3005/the_dance/process_callback?service_provider_id=11' - , oauth_consumer_key: 'GDdmIQH6jhtmLUypg82g' - , oauth_nonce: 'QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk' - , oauth_signature_method: 'HMAC-SHA1' - , oauth_timestamp: '1272323042' - , oauth_version: '1.0' - }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98") - -console.log(reqsign) -console.log('8wUi7m5HFQy76nowoCThusfgB+Q=') -assert.equal(reqsign, '8wUi7m5HFQy76nowoCThusfgB+Q=') - -var accsign = hmacsign('POST', 'https://api.twitter.com/oauth/access_token', - { oauth_consumer_key: 'GDdmIQH6jhtmLUypg82g' - , oauth_nonce: '9zWH6qe0qG7Lc1telCn7FhUbLyVdjEaL3MO5uHxn8' - , oauth_signature_method: 'HMAC-SHA1' - , oauth_token: '8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc' - , oauth_timestamp: '1272323047' - , oauth_verifier: 'pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY' - , oauth_version: '1.0' - }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98", "x6qpRnlEmW9JbQn4PQVVeVG8ZLPEx6A0TOebgwcuA") - -console.log(accsign) -console.log('PUw/dHA4fnlJYM6RhXk5IU/0fCc=') -assert.equal(accsign, 'PUw/dHA4fnlJYM6RhXk5IU/0fCc=') - -var upsign = hmacsign('POST', 'http://api.twitter.com/1/statuses/update.json', - { oauth_consumer_key: "GDdmIQH6jhtmLUypg82g" - , oauth_nonce: "oElnnMTQIZvqvlfXM56aBLAf5noGD0AQR3Fmi7Q6Y" - , oauth_signature_method: "HMAC-SHA1" - , oauth_token: "819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw" - , oauth_timestamp: "1272325550" - , oauth_version: "1.0" - , status: 'setting up my twitter 私のさえずりを設定する' - }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98", "J6zix3FfA9LofH0awS24M3HcBYXO5nI1iYe8EfBA") - -console.log(upsign) -console.log('yOahq5m0YjDDjfjxHaXEsW9D+X0=') -assert.equal(upsign, 'yOahq5m0YjDDjfjxHaXEsW9D+X0=') - - -var rsign = request.post( - { url: 'https://api.twitter.com/oauth/request_token' - , oauth: - { callback: 'http://localhost:3005/the_dance/process_callback?service_provider_id=11' - , consumer_key: 'GDdmIQH6jhtmLUypg82g' - , nonce: 'QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk' - , timestamp: '1272323042' - , version: '1.0' - , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" - } - }) - -setTimeout(function () { - console.log(getsignature(rsign)) - assert.equal(reqsign, getsignature(rsign)) -}) - -var raccsign = request.post( - { url: 'https://api.twitter.com/oauth/access_token' - , oauth: - { consumer_key: 'GDdmIQH6jhtmLUypg82g' - , nonce: '9zWH6qe0qG7Lc1telCn7FhUbLyVdjEaL3MO5uHxn8' - , signature_method: 'HMAC-SHA1' - , token: '8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc' - , timestamp: '1272323047' - , verifier: 'pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY' - , version: '1.0' - , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" - , token_secret: "x6qpRnlEmW9JbQn4PQVVeVG8ZLPEx6A0TOebgwcuA" - } - }) - -setTimeout(function () { - console.log(getsignature(raccsign)) - assert.equal(accsign, getsignature(raccsign)) -}, 1) - -var rupsign = request.post( - { url: 'http://api.twitter.com/1/statuses/update.json' - , oauth: - { consumer_key: "GDdmIQH6jhtmLUypg82g" - , nonce: "oElnnMTQIZvqvlfXM56aBLAf5noGD0AQR3Fmi7Q6Y" - , signature_method: "HMAC-SHA1" - , token: "819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw" - , timestamp: "1272325550" - , version: "1.0" - , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" - , token_secret: "J6zix3FfA9LofH0awS24M3HcBYXO5nI1iYe8EfBA" - } - , form: {status: 'setting up my twitter 私のさえずりを設定する'} - }) -setTimeout(function () { - console.log(getsignature(rupsign)) - assert.equal(upsign, getsignature(rupsign)) -}, 1) - - - - diff --git a/node_modules/nodetime/node_modules/request/tests/test-params.js b/node_modules/nodetime/node_modules/request/tests/test-params.js deleted file mode 100644 index 5ddb311..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-params.js +++ /dev/null @@ -1,92 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - ; - -var s = server.createServer(); - -var tests = - { testGet : - { resp : server.createGetResponse("TESTING!") - , expectBody: "TESTING!" - } - , testGetChunkBreak : - { resp : server.createChunkResponse( - [ new Buffer([239]) - , new Buffer([163]) - , new Buffer([191]) - , new Buffer([206]) - , new Buffer([169]) - , new Buffer([226]) - , new Buffer([152]) - , new Buffer([131]) - ]) - , expectBody: "Ω☃" - } - , testGetBuffer : - { resp : server.createGetResponse(new Buffer("TESTING!")) - , encoding: null - , expectBody: new Buffer("TESTING!") - } - , testGetJSON : - { resp : server.createGetResponse('{"test":true}', 'application/json') - , json : true - , expectBody: {"test":true} - } - , testPutString : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : "PUTTINGDATA" - } - , testPutBuffer : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : new Buffer("PUTTINGDATA") - } - , testPutJSON : - { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) - , method: "PUT" - , json: {foo: 'bar'} - } - , testPutMultipart : - { resp: server.createPostValidator( - '--__BOUNDARY__\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__\r\n\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__--' - ) - , method: "PUT" - , multipart: - [ {'content-type': 'text/html', 'body': 'Oh hi.'} - , {'body': 'Oh hi.'} - ] - } - } - -s.listen(s.port, function () { - - var counter = 0 - - for (i in tests) { - (function () { - var test = tests[i] - s.on('/'+i, test.resp) - //test.uri = s.url + '/' + i - request(s.url + '/' + i, test, function (err, resp, body) { - if (err) throw err - if (test.expectBody) { - assert.deepEqual(test.expectBody, body) - } - counter = counter - 1; - if (counter === 0) { - console.log(Object.keys(tests).length+" tests passed.") - s.close() - } - }) - counter++ - })() - } -}) diff --git a/node_modules/nodetime/node_modules/request/tests/test-piped-redirect.js b/node_modules/nodetime/node_modules/request/tests/test-piped-redirect.js deleted file mode 100644 index 25bf35d..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-piped-redirect.js +++ /dev/null @@ -1,52 +0,0 @@ -var http = require('http') - , assert = require('assert') - , request = require('../main.js') - ; - -var portOne = 8968 - , portTwo = 8969 - ; - - -// server one -var s1 = http.createServer(function (req, resp) -{ - if (req.url == '/original') - { - resp.writeHeader(302, {'location': '/redirected'}) - resp.end() - } - else if (req.url == '/redirected') - { - resp.writeHeader(200, {'content-type': 'text/plain'}) - resp.write('OK') - resp.end() - } - -}).listen(portOne); - - -// server two -var s2 = http.createServer(function (req, resp) -{ - - var x = request('http://localhost:'+portOne+'/original') - req.pipe(x) - x.pipe(resp) - -}).listen(portTwo, function() -{ - - var r = request('http://localhost:'+portTwo+'/original', function (err, res, body) { - - assert.equal(body, 'OK') - - s1.close() - s2.close() - - }); - - // it hangs, so wait a second :) - r.timeout = 1000; - -}); diff --git a/node_modules/nodetime/node_modules/request/tests/test-pipes.js b/node_modules/nodetime/node_modules/request/tests/test-pipes.js deleted file mode 100644 index 7162981..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-pipes.js +++ /dev/null @@ -1,216 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , fs = require('fs') - , request = require('../main.js') - , path = require('path') - , util = require('util') - ; - -var s = server.createServer(3453); - -function ValidationStream(str) { - this.str = str - this.buf = '' - this.on('data', function (data) { - this.buf += data - }) - this.on('end', function () { - assert.equal(this.str, this.buf) - }) - this.writable = true -} -util.inherits(ValidationStream, stream.Stream) -ValidationStream.prototype.write = function (chunk) { - this.emit('data', chunk) -} -ValidationStream.prototype.end = function (chunk) { - if (chunk) emit('data', chunk) - this.emit('end') -} - -s.listen(s.port, function () { - counter = 0; - - var check = function () { - counter = counter - 1 - if (counter === 0) { - console.log('All tests passed.') - setTimeout(function () { - process.exit(); - }, 500) - } - } - - // Test pipeing to a request object - s.once('/push', server.createPostValidator("mydata")); - - var mydata = new stream.Stream(); - mydata.readable = true - - counter++ - var r1 = request.put({url:'http://localhost:3453/push'}, function () { - check(); - }) - mydata.pipe(r1) - - mydata.emit('data', 'mydata'); - mydata.emit('end'); - - // Test pipeing to a request object with a json body - s.once('/push-json', server.createPostValidator("{\"foo\":\"bar\"}", "application/json")); - - var mybodydata = new stream.Stream(); - mybodydata.readable = true - - counter++ - var r2 = request.put({url:'http://localhost:3453/push-json',json:true}, function () { - check(); - }) - mybodydata.pipe(r2) - - mybodydata.emit('data', JSON.stringify({foo:"bar"})); - mybodydata.emit('end'); - - // Test pipeing from a request object. - s.once('/pull', server.createGetResponse("mypulldata")); - - var mypulldata = new stream.Stream(); - mypulldata.writable = true - - counter++ - request({url:'http://localhost:3453/pull'}).pipe(mypulldata) - - var d = ''; - - mypulldata.write = function (chunk) { - d += chunk; - } - mypulldata.end = function () { - assert.equal(d, 'mypulldata'); - check(); - }; - - - s.on('/cat', function (req, resp) { - if (req.method === "GET") { - resp.writeHead(200, {'content-type':'text/plain-test', 'content-length':4}); - resp.end('asdf') - } else if (req.method === "PUT") { - assert.equal(req.headers['content-type'], 'text/plain-test'); - assert.equal(req.headers['content-length'], 4) - var validate = ''; - - req.on('data', function (chunk) {validate += chunk}) - req.on('end', function () { - resp.writeHead(201); - resp.end(); - assert.equal(validate, 'asdf'); - check(); - }) - } - }) - s.on('/pushjs', function (req, resp) { - if (req.method === "PUT") { - assert.equal(req.headers['content-type'], 'application/javascript'); - check(); - } - }) - s.on('/catresp', function (req, resp) { - request.get('http://localhost:3453/cat').pipe(resp) - }) - s.on('/doodle', function (req, resp) { - if (req.headers['x-oneline-proxy']) { - resp.setHeader('x-oneline-proxy', 'yup') - } - resp.writeHead('200', {'content-type':'image/png'}) - fs.createReadStream(path.join(__dirname, 'googledoodle.png')).pipe(resp) - }) - s.on('/onelineproxy', function (req, resp) { - var x = request('http://localhost:3453/doodle') - req.pipe(x) - x.pipe(resp) - }) - - counter++ - fs.createReadStream(__filename).pipe(request.put('http://localhost:3453/pushjs')) - - counter++ - request.get('http://localhost:3453/cat').pipe(request.put('http://localhost:3453/cat')) - - counter++ - request.get('http://localhost:3453/catresp', function (e, resp, body) { - assert.equal(resp.headers['content-type'], 'text/plain-test'); - assert.equal(resp.headers['content-length'], 4) - check(); - }) - - var doodleWrite = fs.createWriteStream(path.join(__dirname, 'test.png')) - - counter++ - request.get('http://localhost:3453/doodle').pipe(doodleWrite) - - doodleWrite.on('close', function () { - assert.deepEqual(fs.readFileSync(path.join(__dirname, 'googledoodle.png')), fs.readFileSync(path.join(__dirname, 'test.png'))) - check() - }) - - process.on('exit', function () { - fs.unlinkSync(path.join(__dirname, 'test.png')) - }) - - counter++ - request.get({uri:'http://localhost:3453/onelineproxy', headers:{'x-oneline-proxy':'nope'}}, function (err, resp, body) { - assert.equal(resp.headers['x-oneline-proxy'], 'yup') - check() - }) - - s.on('/afterresponse', function (req, resp) { - resp.write('d') - resp.end() - }) - - counter++ - var afterresp = request.post('http://localhost:3453/afterresponse').on('response', function () { - var v = new ValidationStream('d') - afterresp.pipe(v) - v.on('end', check) - }) - - s.on('/forward1', function (req, resp) { - resp.writeHead(302, {location:'/forward2'}) - resp.end() - }) - s.on('/forward2', function (req, resp) { - resp.writeHead('200', {'content-type':'image/png'}) - resp.write('d') - resp.end() - }) - - counter++ - var validateForward = new ValidationStream('d') - validateForward.on('end', check) - request.get('http://localhost:3453/forward1').pipe(validateForward) - - // Test pipe options - s.once('/opts', server.createGetResponse('opts response')); - - var optsStream = new stream.Stream(); - optsStream.writable = true - - var optsData = ''; - optsStream.write = function (buf) { - optsData += buf; - if (optsData === 'opts response') { - setTimeout(check, 10); - } - } - - optsStream.end = function () { - assert.fail('end called') - }; - - counter++ - request({url:'http://localhost:3453/opts'}).pipe(optsStream, { end : false }) -}) diff --git a/node_modules/nodetime/node_modules/request/tests/test-pool.js b/node_modules/nodetime/node_modules/request/tests/test-pool.js deleted file mode 100644 index 1e7d578..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-pool.js +++ /dev/null @@ -1,16 +0,0 @@ -var request = require('../main') - , http = require('http') - , assert = require('assert') - ; - -var s = http.createServer(function (req, resp) { - resp.statusCode = 200; - resp.end('asdf'); -}).listen(8080, function () { - request({'url': 'http://localhost:8080', 'pool': false}, function (e, resp) { - var agent = resp.request.agent; - assert.strictEqual(typeof agent, 'boolean'); - assert.strictEqual(agent, false); - s.close(); - }); -}); \ No newline at end of file diff --git a/node_modules/nodetime/node_modules/request/tests/test-protocol-changing-redirect.js b/node_modules/nodetime/node_modules/request/tests/test-protocol-changing-redirect.js deleted file mode 100644 index f74e196..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-protocol-changing-redirect.js +++ /dev/null @@ -1,60 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - - -var s = server.createServer() -var ss = server.createSSLServer() -var sUrl = 'http://localhost:' + s.port -var ssUrl = 'https://localhost:' + ss.port - -s.listen(s.port, bouncy(s, ssUrl)) -ss.listen(ss.port, bouncy(ss, sUrl)) - -var hits = {} -var expect = {} -var pending = 0 -function bouncy (s, server) { return function () { - - var redirs = { a: 'b' - , b: 'c' - , c: 'd' - , d: 'e' - , e: 'f' - , f: 'g' - , g: 'h' - , h: 'end' } - - var perm = true - Object.keys(redirs).forEach(function (p) { - var t = redirs[p] - - // switch type each time - var type = perm ? 301 : 302 - perm = !perm - s.on('/' + p, function (req, res) { - res.writeHead(type, { location: server + '/' + t }) - res.end() - }) - }) - - s.on('/end', function (req, res) { - var h = req.headers['x-test-key'] - hits[h] = true - pending -- - if (pending === 0) done() - }) -}} - -for (var i = 0; i < 5; i ++) { - pending ++ - var val = 'test_' + i - expect[val] = true - request({ url: (i % 2 ? sUrl : ssUrl) + '/a' - , headers: { 'x-test-key': val } }) -} - -function done () { - assert.deepEqual(hits, expect) - process.exit(0) -} diff --git a/node_modules/nodetime/node_modules/request/tests/test-proxy.js b/node_modules/nodetime/node_modules/request/tests/test-proxy.js deleted file mode 100644 index 647157c..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-proxy.js +++ /dev/null @@ -1,39 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , fs = require('fs') - , request = require('../main.js') - , path = require('path') - , util = require('util') - ; - -var port = 6768 - , called = false - , proxiedHost = 'google.com' - ; - -var s = server.createServer(port) -s.listen(port, function () { - s.on('http://google.com/', function (req, res) { - called = true - assert.equal(req.headers.host, proxiedHost) - res.writeHeader(200) - res.end() - }) - request ({ - url: 'http://'+proxiedHost, - proxy: 'http://localhost:'+port - /* - //should behave as if these arguments where passed: - url: 'http://localhost:'+port, - headers: {host: proxiedHost} - //*/ - }, function (err, res, body) { - s.close() - }) -}) - -process.on('exit', function () { - assert.ok(called, 'the request must be made to the proxy server') -}) diff --git a/node_modules/nodetime/node_modules/request/tests/test-qs.js b/node_modules/nodetime/node_modules/request/tests/test-qs.js deleted file mode 100644 index 1aac22b..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-qs.js +++ /dev/null @@ -1,28 +0,0 @@ -var request = request = require('../main.js') - , assert = require('assert') - ; - - -// Test adding a querystring -var req1 = request.get({ uri: 'http://www.google.com', qs: { q : 'search' }}) -setTimeout(function() { - assert.equal('/?q=search', req1.path) -}, 1) - -// Test replacing a querystring value -var req2 = request.get({ uri: 'http://www.google.com?q=abc', qs: { q : 'search' }}) -setTimeout(function() { - assert.equal('/?q=search', req2.path) -}, 1) - -// Test appending a querystring value to the ones present in the uri -var req3 = request.get({ uri: 'http://www.google.com?x=y', qs: { q : 'search' }}) -setTimeout(function() { - assert.equal('/?x=y&q=search', req3.path) -}, 1) - -// Test leaving a querystring alone -var req4 = request.get({ uri: 'http://www.google.com?x=y'}) -setTimeout(function() { - assert.equal('/?x=y', req4.path) -}, 1) diff --git a/node_modules/nodetime/node_modules/request/tests/test-redirect.js b/node_modules/nodetime/node_modules/request/tests/test-redirect.js deleted file mode 100644 index b84844a..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-redirect.js +++ /dev/null @@ -1,154 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - , Cookie = require('../vendor/cookie') - , Jar = require('../vendor/cookie/jar') - -var s = server.createServer() - -s.listen(s.port, function () { - var server = 'http://localhost:' + s.port; - var hits = {} - var passed = 0; - - bouncer(301, 'temp') - bouncer(302, 'perm') - bouncer(302, 'nope') - - function bouncer(code, label) { - var landing = label+'_landing'; - - s.on('/'+label, function (req, res) { - hits[label] = true; - res.writeHead(code, { - 'location':server + '/'+landing, - 'set-cookie': 'ham=eggs' - }) - res.end() - }) - - s.on('/'+landing, function (req, res) { - if (req.method !== 'GET') { // We should only accept GET redirects - console.error("Got a non-GET request to the redirect destination URL"); - res.writeHead(400); - res.end(); - return; - } - // Make sure the cookie doesn't get included twice, see #139: - // Make sure cookies are set properly after redirect - assert.equal(req.headers.cookie, 'foo=bar; quux=baz; ham=eggs'); - hits[landing] = true; - res.writeHead(200) - res.end(landing) - }) - } - - // Permanent bounce - var jar = new Jar() - jar.add(new Cookie('quux=baz')) - request({uri: server+'/perm', jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode) - assert.ok(hits.perm, 'Original request is to /perm') - assert.ok(hits.perm_landing, 'Forward to permanent landing URL') - assert.equal(body, 'perm_landing', 'Got permanent landing content') - passed += 1 - done() - }) - - // Temporary bounce - request({uri: server+'/temp', jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(hits.temp_landing, 'Forward to temporary landing URL') - assert.equal(body, 'temp_landing', 'Got temporary landing content') - passed += 1 - done() - }) - - // Prevent bouncing. - request({uri:server+'/nope', jar: jar, headers: {cookie: 'foo=bar'}, followRedirect:false}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 302) throw new Error('Status is not 302: '+res.statusCode) - assert.ok(hits.nope, 'Original request to /nope') - assert.ok(!hits.nope_landing, 'No chasing the redirect') - assert.equal(res.statusCode, 302, 'Response is the bounce itself') - passed += 1 - done() - }) - - // Should not follow post redirects by default - request.post(server+'/temp', { jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 301) throw new Error('Status is not 301: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(!hits.temp_landing, 'No chasing the redirect when post') - assert.equal(res.statusCode, 301, 'Response is the bounce itself') - passed += 1 - done() - }) - - // Should follow post redirects when followAllRedirects true - request.post({uri:server+'/temp', followAllRedirects:true, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(hits.temp_landing, 'Forward to temporary landing URL') - assert.equal(body, 'temp_landing', 'Got temporary landing content') - passed += 1 - done() - }) - - request.post({uri:server+'/temp', followAllRedirects:false, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 301) throw new Error('Status is not 301: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(!hits.temp_landing, 'No chasing the redirect') - assert.equal(res.statusCode, 301, 'Response is the bounce itself') - passed += 1 - done() - }) - - // Should not follow delete redirects by default - request.del(server+'/temp', { jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode < 301) throw new Error('Status is not a redirect.') - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(!hits.temp_landing, 'No chasing the redirect when delete') - assert.equal(res.statusCode, 301, 'Response is the bounce itself') - passed += 1 - done() - }) - - // Should not follow delete redirects even if followRedirect is set to true - request.del(server+'/temp', { followRedirect: true, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 301) throw new Error('Status is not 301: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(!hits.temp_landing, 'No chasing the redirect when delete') - assert.equal(res.statusCode, 301, 'Response is the bounce itself') - passed += 1 - done() - }) - - // Should follow delete redirects when followAllRedirects true - request.del(server+'/temp', {followAllRedirects:true, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(hits.temp_landing, 'Forward to temporary landing URL') - assert.equal(body, 'temp_landing', 'Got temporary landing content') - passed += 1 - done() - }) - - var reqs_done = 0; - function done() { - reqs_done += 1; - if(reqs_done == 9) { - console.log(passed + ' tests passed.') - s.close() - } - } -}) diff --git a/node_modules/nodetime/node_modules/request/tests/test-s3.js b/node_modules/nodetime/node_modules/request/tests/test-s3.js deleted file mode 100644 index 5f59c4a..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-s3.js +++ /dev/null @@ -1,13 +0,0 @@ -var request = require('../main') - -var r = request.get('https://log.curlybracecast.com.s3.amazonaws.com/', - { aws: - { key: 'AKIAI6KIQRRVMGK3WK5Q' - , secret: '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' - , bucket: 'log.curlybracecast.com' - } - }, function (e, resp, body) { - console.log(r.headers) - console.log(body) - } -) \ No newline at end of file diff --git a/node_modules/nodetime/node_modules/request/tests/test-timeout.js b/node_modules/nodetime/node_modules/request/tests/test-timeout.js deleted file mode 100644 index 673f8ad..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-timeout.js +++ /dev/null @@ -1,87 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , request = require('../main.js') - ; - -var s = server.createServer(); -var expectedBody = "waited"; -var remainingTests = 5; - -s.listen(s.port, function () { - // Request that waits for 200ms - s.on('/timeout', function (req, resp) { - setTimeout(function(){ - resp.writeHead(200, {'content-type':'text/plain'}) - resp.write(expectedBody) - resp.end() - }, 200); - }); - - // Scenario that should timeout - var shouldTimeout = { - url: s.url + "/timeout", - timeout:100 - } - - - request(shouldTimeout, function (err, resp, body) { - assert.equal(err.code, "ETIMEDOUT"); - checkDone(); - }) - - - // Scenario that shouldn't timeout - var shouldntTimeout = { - url: s.url + "/timeout", - timeout:300 - } - - request(shouldntTimeout, function (err, resp, body) { - assert.equal(err, null); - assert.equal(expectedBody, body) - checkDone(); - }) - - // Scenario with no timeout set, so shouldn't timeout - var noTimeout = { - url: s.url + "/timeout" - } - - request(noTimeout, function (err, resp, body) { - assert.equal(err); - assert.equal(expectedBody, body) - checkDone(); - }) - - // Scenario with a negative timeout value, should be treated a zero or the minimum delay - var negativeTimeout = { - url: s.url + "/timeout", - timeout:-1000 - } - - request(negativeTimeout, function (err, resp, body) { - assert.equal(err.code, "ETIMEDOUT"); - checkDone(); - }) - - // Scenario with a float timeout value, should be rounded by setTimeout anyway - var floatTimeout = { - url: s.url + "/timeout", - timeout: 100.76 - } - - request(floatTimeout, function (err, resp, body) { - assert.equal(err.code, "ETIMEDOUT"); - checkDone(); - }) - - function checkDone() { - if(--remainingTests == 0) { - s.close(); - console.log("All tests passed."); - } - } -}) - diff --git a/node_modules/nodetime/node_modules/request/tests/test-toJSON.js b/node_modules/nodetime/node_modules/request/tests/test-toJSON.js deleted file mode 100644 index b7c67ef..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-toJSON.js +++ /dev/null @@ -1,14 +0,0 @@ -var request = require('../main') - , http = require('http') - , assert = require('assert') - ; - -var s = http.createServer(function (req, resp) { - resp.statusCode = 200 - resp.end('asdf') -}).listen(8080, function () { - var r = request('http://localhost:8080', function (e, resp) { - assert.equal(JSON.parse(JSON.stringify(r)).response.statusCode, 200) - s.close() - }) -}) \ No newline at end of file diff --git a/node_modules/nodetime/node_modules/request/tests/test-tunnel.js b/node_modules/nodetime/node_modules/request/tests/test-tunnel.js deleted file mode 100644 index 51e2126..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-tunnel.js +++ /dev/null @@ -1,63 +0,0 @@ -// test that we can tunnel a https request over an http proxy -// keeping all the CA and whatnot intact. -// -// Note: this requires that squid is installed. -// If the proxy fails to start, we'll just log a warning and assume success. - -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - , fs = require('fs') - , path = require('path') - , caFile = path.resolve(__dirname, 'ssl/npm-ca.crt') - , ca = fs.readFileSync(caFile) - , child_process = require('child_process') - , sqConf = path.resolve(__dirname, 'squid.conf') - , sqArgs = ['-f', sqConf, '-N', '-d', '5'] - , proxy = 'http://localhost:3128' - , hadError = null - -var squid = child_process.spawn('squid', sqArgs); -var ready = false - -squid.stderr.on('data', function (c) { - console.error('SQUIDERR ' + c.toString().trim().split('\n') - .join('\nSQUIDERR ')) - ready = c.toString().match(/ready to serve requests/i) -}) - -squid.stdout.on('data', function (c) { - console.error('SQUIDOUT ' + c.toString().trim().split('\n') - .join('\nSQUIDOUT ')) -}) - -squid.on('exit', function (c) { - console.error('squid: exit '+c) - if (c && !ready) { - console.error('squid must be installed to run this test.') - console.error('skipping this test. please install squid and run again if you need to test tunneling.') - c = null - hadError = null - process.exit(0) - return - } - - if (c) { - hadError = hadError || new Error('Squid exited with '+c) - } - if (hadError) throw hadError -}) - -setTimeout(function F () { - if (!ready) return setTimeout(F, 100) - request({ uri: 'https://registry.npmjs.org/' - , proxy: 'http://localhost:3128' - , strictSSL: true - , ca: ca - , json: true }, function (er, body) { - hadError = er - console.log(er || typeof body) - if (!er) console.log("ok") - squid.kill('SIGKILL') - }) -}, 100) diff --git a/node_modules/nodetime/node_modules/request/tests/unicycle.jpg b/node_modules/nodetime/node_modules/request/tests/unicycle.jpg deleted file mode 100644 index 7cea4dd71dc41cd51c84bfcec6b3e65c15a58507..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19806 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 diff --git a/node_modules/nodetime/node_modules/request/tunnel.js b/node_modules/nodetime/node_modules/request/tunnel.js deleted file mode 100644 index 3f7bbb9..0000000 --- a/node_modules/nodetime/node_modules/request/tunnel.js +++ /dev/null @@ -1,227 +0,0 @@ -'use strict' - -var net = require('net') - , tls = require('tls') - , http = require('http') - , https = require('https') - , events = require('events') - , assert = require('assert') - , util = require('util') - ; - -exports.httpOverHttp = httpOverHttp -exports.httpsOverHttp = httpsOverHttp -exports.httpOverHttps = httpOverHttps -exports.httpsOverHttps = httpsOverHttps - - -function httpOverHttp(options) { - var agent = new TunnelingAgent(options) - agent.request = http.request - return agent -} - -function httpsOverHttp(options) { - var agent = new TunnelingAgent(options) - agent.request = http.request - agent.createSocket = createSecureSocket - return agent -} - -function httpOverHttps(options) { - var agent = new TunnelingAgent(options) - agent.request = https.request - return agent -} - -function httpsOverHttps(options) { - var agent = new TunnelingAgent(options) - agent.request = https.request - agent.createSocket = createSecureSocket - return agent -} - - -function TunnelingAgent(options) { - var self = this - self.options = options || {} - self.proxyOptions = self.options.proxy || {} - self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets - self.requests = [] - self.sockets = [] - - self.on('free', function onFree(socket, host, port) { - for (var i = 0, len = self.requests.length; i < len; ++i) { - var pending = self.requests[i] - if (pending.host === host && pending.port === port) { - // Detect the request to connect same origin server, - // reuse the connection. - self.requests.splice(i, 1) - pending.request.onSocket(socket) - return - } - } - socket.destroy() - self.removeSocket(socket) - }) -} -util.inherits(TunnelingAgent, events.EventEmitter) - -TunnelingAgent.prototype.addRequest = function addRequest(req, host, port) { - var self = this - - if (self.sockets.length >= this.maxSockets) { - // We are over limit so we'll add it to the queue. - self.requests.push({host: host, port: port, request: req}) - return - } - - // If we are under maxSockets create a new one. - self.createSocket({host: host, port: port, request: req}, function(socket) { - socket.on('free', onFree) - socket.on('close', onCloseOrRemove) - socket.on('agentRemove', onCloseOrRemove) - req.onSocket(socket) - - function onFree() { - self.emit('free', socket, host, port) - } - - function onCloseOrRemove(err) { - self.removeSocket() - socket.removeListener('free', onFree) - socket.removeListener('close', onCloseOrRemove) - socket.removeListener('agentRemove', onCloseOrRemove) - } - }) -} - -TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { - var self = this - var placeholder = {} - self.sockets.push(placeholder) - - var connectOptions = mergeOptions({}, self.proxyOptions, - { method: 'CONNECT' - , path: options.host + ':' + options.port - , agent: false - } - ) - if (connectOptions.proxyAuth) { - connectOptions.headers = connectOptions.headers || {} - connectOptions.headers['Proxy-Authorization'] = 'Basic ' + - new Buffer(connectOptions.proxyAuth).toString('base64') - } - - debug('making CONNECT request') - var connectReq = self.request(connectOptions) - connectReq.useChunkedEncodingByDefault = false // for v0.6 - connectReq.once('response', onResponse) // for v0.6 - connectReq.once('upgrade', onUpgrade) // for v0.6 - connectReq.once('connect', onConnect) // for v0.7 or later - connectReq.once('error', onError) - connectReq.end() - - function onResponse(res) { - // Very hacky. This is necessary to avoid http-parser leaks. - res.upgrade = true - } - - function onUpgrade(res, socket, head) { - // Hacky. - process.nextTick(function() { - onConnect(res, socket, head) - }) - } - - function onConnect(res, socket, head) { - connectReq.removeAllListeners() - socket.removeAllListeners() - - if (res.statusCode === 200) { - assert.equal(head.length, 0) - debug('tunneling connection has established') - self.sockets[self.sockets.indexOf(placeholder)] = socket - cb(socket) - } else { - debug('tunneling socket could not be established, statusCode=%d', res.statusCode) - var error = new Error('tunneling socket could not be established, ' + 'statusCode=' + res.statusCode) - error.code = 'ECONNRESET' - options.request.emit('error', error) - self.removeSocket(placeholder) - } - } - - function onError(cause) { - connectReq.removeAllListeners() - - debug('tunneling socket could not be established, cause=%s\n', cause.message, cause.stack) - var error = new Error('tunneling socket could not be established, ' + 'cause=' + cause.message) - error.code = 'ECONNRESET' - options.request.emit('error', error) - self.removeSocket(placeholder) - } -} - -TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { - var pos = this.sockets.indexOf(socket) - if (pos === -1) return - - this.sockets.splice(pos, 1) - - var pending = this.requests.shift() - if (pending) { - // If we have pending requests and a socket gets closed a new one - // needs to be created to take over in the pool for the one that closed. - this.createSocket(pending, function(socket) { - pending.request.onSocket(socket) - }) - } -} - -function createSecureSocket(options, cb) { - var self = this - TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { - // 0 is dummy port for v0.6 - var secureSocket = tls.connect(0, mergeOptions({}, self.options, - { servername: options.host - , socket: socket - } - )) - cb(secureSocket) - }) -} - - -function mergeOptions(target) { - for (var i = 1, len = arguments.length; i < len; ++i) { - var overrides = arguments[i] - if (typeof overrides === 'object') { - var keys = Object.keys(overrides) - for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { - var k = keys[j] - if (overrides[k] !== undefined) { - target[k] = overrides[k] - } - } - } - } - return target -} - - -var debug -if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { - debug = function() { - var args = Array.prototype.slice.call(arguments) - if (typeof args[0] === 'string') { - args[0] = 'TUNNEL: ' + args[0] - } else { - args.unshift('TUNNEL:') - } - console.error.apply(console, args) - } -} else { - debug = function() {} -} -exports.debug = debug // for test diff --git a/node_modules/nodetime/node_modules/request/uuid.js b/node_modules/nodetime/node_modules/request/uuid.js deleted file mode 100644 index fc0588b..0000000 --- a/node_modules/nodetime/node_modules/request/uuid.js +++ /dev/null @@ -1,19 +0,0 @@ -module.exports = function () { - var s = [], itoh = '0123456789ABCDEF' - - // Make array of random hex digits. The UUID only has 32 digits in it, but we - // allocate an extra items to make room for the '-'s we'll be inserting. - for (var i = 0; i <36; i++) s[i] = Math.floor(Math.random()*0x10) - - // Conform to RFC-4122, section 4.4 - s[14] = 4; // Set 4 high bits of time_high field to version - s[19] = (s[19] & 0x3) | 0x8 // Specify 2 high bits of clock sequence - - // Convert to hex chars - for (var i = 0; i <36; i++) s[i] = itoh[s[i]] - - // Insert '-'s - s[8] = s[13] = s[18] = s[23] = '-' - - return s.join('') -} diff --git a/node_modules/nodetime/node_modules/request/vendor/cookie/index.js b/node_modules/nodetime/node_modules/request/vendor/cookie/index.js deleted file mode 100644 index ff44b3e..0000000 --- a/node_modules/nodetime/node_modules/request/vendor/cookie/index.js +++ /dev/null @@ -1,65 +0,0 @@ -/*! - * Tobi - Cookie - * Copyright(c) 2010 LearnBoost - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var url = require('url'); - -/** - * Initialize a new `Cookie` with the given cookie `str` and `req`. - * - * @param {String} str - * @param {IncomingRequest} req - * @api private - */ - -var Cookie = exports = module.exports = function Cookie(str, req) { - this.str = str; - - // Map the key/val pairs - str.split(/ *; */).reduce(function(obj, pair){ - var p = pair.indexOf('='); - var key = p > 0 ? pair.substring(0, p).trim() : pair.trim(); - var lowerCasedKey = key.toLowerCase(); - var value = p > 0 ? pair.substring(p + 1).trim() : true; - - if (!obj.name) { - // First key is the name - obj.name = key; - obj.value = value; - } - else if (lowerCasedKey === 'httponly') { - obj.httpOnly = value; - } - else { - obj[lowerCasedKey] = value; - } - return obj; - }, this); - - // Expires - this.expires = this.expires - ? new Date(this.expires) - : Infinity; - - // Default or trim path - this.path = this.path - ? this.path.trim(): req - ? url.parse(req.url).pathname: '/'; -}; - -/** - * Return the original cookie string. - * - * @return {String} - * @api public - */ - -Cookie.prototype.toString = function(){ - return this.str; -}; diff --git a/node_modules/nodetime/node_modules/request/vendor/cookie/jar.js b/node_modules/nodetime/node_modules/request/vendor/cookie/jar.js deleted file mode 100644 index 34920e0..0000000 --- a/node_modules/nodetime/node_modules/request/vendor/cookie/jar.js +++ /dev/null @@ -1,72 +0,0 @@ -/*! -* Tobi - CookieJar -* Copyright(c) 2010 LearnBoost -* MIT Licensed -*/ - -/** -* Module dependencies. -*/ - -var url = require('url'); - -/** -* Initialize a new `CookieJar`. -* -* @api private -*/ - -var CookieJar = exports = module.exports = function CookieJar() { - this.cookies = []; -}; - -/** -* Add the given `cookie` to the jar. -* -* @param {Cookie} cookie -* @api private -*/ - -CookieJar.prototype.add = function(cookie){ - this.cookies = this.cookies.filter(function(c){ - // Avoid duplication (same path, same name) - return !(c.name == cookie.name && c.path == cookie.path); - }); - this.cookies.push(cookie); -}; - -/** -* Get cookies for the given `req`. -* -* @param {IncomingRequest} req -* @return {Array} -* @api private -*/ - -CookieJar.prototype.get = function(req){ - var path = url.parse(req.url).pathname - , now = new Date - , specificity = {}; - return this.cookies.filter(function(cookie){ - if (0 == path.indexOf(cookie.path) && now < cookie.expires - && cookie.path.length > (specificity[cookie.name] || 0)) - return specificity[cookie.name] = cookie.path.length; - }); -}; - -/** -* Return Cookie string for the given `req`. -* -* @param {IncomingRequest} req -* @return {String} -* @api private -*/ - -CookieJar.prototype.cookieString = function(req){ - var cookies = this.get(req); - if (cookies.length) { - return cookies.map(function(cookie){ - return cookie.name + '=' + cookie.value; - }).join('; '); - } -}; diff --git a/node_modules/nodetime/node_modules/timekit/.npmignore b/node_modules/nodetime/node_modules/timekit/.npmignore deleted file mode 100644 index db470e2..0000000 --- a/node_modules/nodetime/node_modules/timekit/.npmignore +++ /dev/null @@ -1,7 +0,0 @@ -.git* -test/ -.DS_Store -node_modules/ -npm-debug.log -build -.lock-wscript diff --git a/node_modules/nodetime/node_modules/timekit/LICENSE b/node_modules/nodetime/node_modules/timekit/LICENSE deleted file mode 100644 index 3959a05..0000000 --- a/node_modules/nodetime/node_modules/timekit/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2012 Dmitri Melikyan - -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. diff --git a/node_modules/nodetime/node_modules/timekit/README.md b/node_modules/nodetime/node_modules/timekit/README.md deleted file mode 100644 index 132b6a3..0000000 --- a/node_modules/nodetime/node_modules/timekit/README.md +++ /dev/null @@ -1,32 +0,0 @@ -Timekit - Time Related C Bindings -=== - - -## Installation - - npm install timekit - - -## API - -`var timekit = require('timekit');` - -`timekit.time()` - uses gettimeofday and returns current time in microseconds. In case of error returns undefined. On Windows uses GetSystemTimeAsFileTime. - -`timekit.cputime()` - uses getrusage and returns cpu time spent on current process (user + system) in microseconds. In case of error returns undefined. On Windows uses GetProcessTimes. - - -## Platforms - -POSIX and Windows - - -## License - -Copyright (c) 2012 Dmitri Melikyan - -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. diff --git a/node_modules/nodetime/node_modules/timekit/binding.gyp b/node_modules/nodetime/node_modules/timekit/binding.gyp deleted file mode 100644 index 549e543..0000000 --- a/node_modules/nodetime/node_modules/timekit/binding.gyp +++ /dev/null @@ -1,19 +0,0 @@ -{ - 'targets': [ - { - 'target_name': 'timekit', - 'conditions': [ - ['OS == "win"', { - 'sources': [ - 'src/timekit_win.cc' - ] - }, { - 'sources': [ - 'src/timekit_posix.cc' - ] - } - ], - ] - } - ] -} diff --git a/node_modules/nodetime/node_modules/timekit/build/Makefile b/node_modules/nodetime/node_modules/timekit/build/Makefile deleted file mode 100644 index 11e3eef..0000000 --- a/node_modules/nodetime/node_modules/timekit/build/Makefile +++ /dev/null @@ -1,359 +0,0 @@ -# We borrow heavily from the kernel build setup, though we are simpler since -# we don't have Kconfig tweaking settings on us. - -# The implicit make rules have it looking for RCS files, among other things. -# We instead explicitly write all the rules we care about. -# It's even quicker (saves ~200ms) to pass -r on the command line. -MAKEFLAGS=-r - -# The source directory tree. -srcdir := .. -abs_srcdir := $(abspath $(srcdir)) - -# The name of the builddir. -builddir_name ?= . - -# The V=1 flag on command line makes us verbosely print command lines. -ifdef V - quiet= -else - quiet=quiet_ -endif - -# Specify BUILDTYPE=Release on the command line for a release build. -BUILDTYPE ?= Release - -# Directory all our build output goes into. -# Note that this must be two directories beneath src/ for unit tests to pass, -# as they reach into the src/ directory for data with relative paths. -builddir ?= $(builddir_name)/$(BUILDTYPE) -abs_builddir := $(abspath $(builddir)) -depsdir := $(builddir)/.deps - -# Object output directory. -obj := $(builddir)/obj -abs_obj := $(abspath $(obj)) - -# We build up a list of every single one of the targets so we can slurp in the -# generated dependency rule Makefiles in one pass. -all_deps := - - - -# C++ apps need to be linked with g++. -# -# Note: flock is used to seralize linking. Linking is a memory-intensive -# process so running parallel links can often lead to thrashing. To disable -# the serialization, override LINK via an envrionment variable as follows: -# -# export LINK=g++ -# -# This will allow make to invoke N linker processes as specified in -jN. -LINK ?= ./gyp-mac-tool flock $(builddir)/linker.lock $(CXX) - -CC.target ?= $(CC) -CFLAGS.target ?= $(CFLAGS) -CXX.target ?= $(CXX) -CXXFLAGS.target ?= $(CXXFLAGS) -LINK.target ?= $(LINK) -LDFLAGS.target ?= $(LDFLAGS) -AR.target ?= $(AR) -ARFLAGS.target ?= crs - -# N.B.: the logic of which commands to run should match the computation done -# in gyp's make.py where ARFLAGS.host etc. is computed. -# TODO(evan): move all cross-compilation logic to gyp-time so we don't need -# to replicate this environment fallback in make as well. -CC.host ?= gcc -CFLAGS.host ?= -CXX.host ?= g++ -CXXFLAGS.host ?= -LINK.host ?= g++ -LDFLAGS.host ?= -AR.host ?= ar -ARFLAGS.host := crs - -# Define a dir function that can handle spaces. -# http://www.gnu.org/software/make/manual/make.html#Syntax-of-Functions -# "leading spaces cannot appear in the text of the first argument as written. -# These characters can be put into the argument value by variable substitution." -empty := -space := $(empty) $(empty) - -# http://stackoverflow.com/questions/1189781/using-make-dir-or-notdir-on-a-path-with-spaces -replace_spaces = $(subst $(space),?,$1) -unreplace_spaces = $(subst ?,$(space),$1) -dirx = $(call unreplace_spaces,$(dir $(call replace_spaces,$1))) - -# Flags to make gcc output dependency info. Note that you need to be -# careful here to use the flags that ccache and distcc can understand. -# We write to a dep file on the side first and then rename at the end -# so we can't end up with a broken dep file. -depfile = $(depsdir)/$(call replace_spaces,$@).d -DEPFLAGS = -MMD -MF $(depfile).raw - -# We have to fixup the deps output in a few ways. -# (1) the file output should mention the proper .o file. -# ccache or distcc lose the path to the target, so we convert a rule of -# the form: -# foobar.o: DEP1 DEP2 -# into -# path/to/foobar.o: DEP1 DEP2 -# (2) we want missing files not to cause us to fail to build. -# We want to rewrite -# foobar.o: DEP1 DEP2 \ -# DEP3 -# to -# DEP1: -# DEP2: -# DEP3: -# so if the files are missing, they're just considered phony rules. -# We have to do some pretty insane escaping to get those backslashes -# and dollar signs past make, the shell, and sed at the same time. -# Doesn't work with spaces, but that's fine: .d files have spaces in -# their names replaced with other characters. -define fixup_dep -# The depfile may not exist if the input file didn't have any #includes. -touch $(depfile).raw -# Fixup path as in (1). -sed -e "s|^$(notdir $@)|$@|" $(depfile).raw >> $(depfile) -# Add extra rules as in (2). -# We remove slashes and replace spaces with new lines; -# remove blank lines; -# delete the first line and append a colon to the remaining lines. -sed -e 's|\\||' -e 'y| |\n|' $(depfile).raw |\ - grep -v '^$$' |\ - sed -e 1d -e 's|$$|:|' \ - >> $(depfile) -rm $(depfile).raw -endef - -# Command definitions: -# - cmd_foo is the actual command to run; -# - quiet_cmd_foo is the brief-output summary of the command. - -quiet_cmd_cc = CC($(TOOLSET)) $@ -cmd_cc = $(CC.$(TOOLSET)) $(GYP_CFLAGS) $(DEPFLAGS) $(CFLAGS.$(TOOLSET)) -c -o $@ $< - -quiet_cmd_cxx = CXX($(TOOLSET)) $@ -cmd_cxx = $(CXX.$(TOOLSET)) $(GYP_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< - -quiet_cmd_objc = CXX($(TOOLSET)) $@ -cmd_objc = $(CC.$(TOOLSET)) $(GYP_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< - -quiet_cmd_objcxx = CXX($(TOOLSET)) $@ -cmd_objcxx = $(CXX.$(TOOLSET)) $(GYP_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< - -# Commands for precompiled header files. -quiet_cmd_pch_c = CXX($(TOOLSET)) $@ -cmd_pch_c = $(CC.$(TOOLSET)) $(GYP_PCH_CFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< -quiet_cmd_pch_cc = CXX($(TOOLSET)) $@ -cmd_pch_cc = $(CC.$(TOOLSET)) $(GYP_PCH_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< -quiet_cmd_pch_m = CXX($(TOOLSET)) $@ -cmd_pch_m = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< -quiet_cmd_pch_mm = CXX($(TOOLSET)) $@ -cmd_pch_mm = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< - -# gyp-mac-tool is written next to the root Makefile by gyp. -# Use $(4) for the command, since $(2) and $(3) are used as flag by do_cmd -# already. -quiet_cmd_mac_tool = MACTOOL $(4) $< -cmd_mac_tool = ./gyp-mac-tool $(4) $< "$@" - -quiet_cmd_mac_package_framework = PACKAGE FRAMEWORK $@ -cmd_mac_package_framework = ./gyp-mac-tool package-framework "$@" $(4) - -quiet_cmd_infoplist = INFOPLIST $@ -cmd_infoplist = $(CC.$(TOOLSET)) -E -P -Wno-trigraphs -x c $(INFOPLIST_DEFINES) "$<" -o "$@" - -quiet_cmd_touch = TOUCH $@ -cmd_touch = touch $@ - -quiet_cmd_copy = COPY $@ -# send stderr to /dev/null to ignore messages when linking directories. -cmd_copy = ln -f "$<" "$@" 2>/dev/null || (rm -rf "$@" && cp -af "$<" "$@") - -quiet_cmd_alink = LIBTOOL-STATIC $@ -cmd_alink = rm -f $@ && ./gyp-mac-tool filter-libtool libtool -static -o $@ $(filter %.o,$^) - -quiet_cmd_link = LINK($(TOOLSET)) $@ -cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) - -# TODO(thakis): Find out and document the difference between shared_library and -# loadable_module on mac. -quiet_cmd_solink = SOLINK($(TOOLSET)) $@ -cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) - -# TODO(thakis): The solink_module rule is likely wrong. Xcode seems to pass -# -bundle -single_module here (for osmesa.so). -quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@ -cmd_solink_module = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS) - - -# Define an escape_quotes function to escape single quotes. -# This allows us to handle quotes properly as long as we always use -# use single quotes and escape_quotes. -escape_quotes = $(subst ','\'',$(1)) -# This comment is here just to include a ' to unconfuse syntax highlighting. -# Define an escape_vars function to escape '$' variable syntax. -# This allows us to read/write command lines with shell variables (e.g. -# $LD_LIBRARY_PATH), without triggering make substitution. -escape_vars = $(subst $$,$$$$,$(1)) -# Helper that expands to a shell command to echo a string exactly as it is in -# make. This uses printf instead of echo because printf's behaviour with respect -# to escape sequences is more portable than echo's across different shells -# (e.g., dash, bash). -exact_echo = printf '%s\n' '$(call escape_quotes,$(1))' - -# Helper to compare the command we're about to run against the command -# we logged the last time we ran the command. Produces an empty -# string (false) when the commands match. -# Tricky point: Make has no string-equality test function. -# The kernel uses the following, but it seems like it would have false -# positives, where one string reordered its arguments. -# arg_check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \ -# $(filter-out $(cmd_$@), $(cmd_$(1)))) -# We instead substitute each for the empty string into the other, and -# say they're equal if both substitutions produce the empty string. -# .d files contain ? instead of spaces, take that into account. -command_changed = $(or $(subst $(cmd_$(1)),,$(cmd_$(call replace_spaces,$@))),\ - $(subst $(cmd_$(call replace_spaces,$@)),,$(cmd_$(1)))) - -# Helper that is non-empty when a prerequisite changes. -# Normally make does this implicitly, but we force rules to always run -# so we can check their command lines. -# $? -- new prerequisites -# $| -- order-only dependencies -prereq_changed = $(filter-out FORCE_DO_CMD,$(filter-out $|,$?)) - -# Helper that executes all postbuilds, and deletes the output file when done -# if any of the postbuilds failed. -define do_postbuilds - @E=0;\ - for p in $(POSTBUILDS); do\ - eval $$p;\ - F=$$?;\ - if [ $$F -ne 0 ]; then\ - E=$$F;\ - fi;\ - done;\ - if [ $$E -ne 0 ]; then\ - rm -rf "$@";\ - exit $$E;\ - fi -endef - -# do_cmd: run a command via the above cmd_foo names, if necessary. -# Should always run for a given target to handle command-line changes. -# Second argument, if non-zero, makes it do asm/C/C++ dependency munging. -# Third argument, if non-zero, makes it do POSTBUILDS processing. -# Note: We intentionally do NOT call dirx for depfile, since it contains ? for -# spaces already and dirx strips the ? characters. -define do_cmd -$(if $(or $(command_changed),$(prereq_changed)), - @$(call exact_echo, $($(quiet)cmd_$(1))) - @mkdir -p "$(call dirx,$@)" "$(dir $(depfile))" - $(if $(findstring flock,$(word 2,$(cmd_$1))), - @$(cmd_$(1)) - @echo " $(quiet_cmd_$(1)): Finished", - @$(cmd_$(1)) - ) - @$(call exact_echo,$(call escape_vars,cmd_$(call replace_spaces,$@) := $(cmd_$(1)))) > $(depfile) - @$(if $(2),$(fixup_dep)) - $(if $(and $(3), $(POSTBUILDS)), - $(call do_postbuilds) - ) -) -endef - -# Declare the "all" target first so it is the default, -# even though we don't have the deps yet. -.PHONY: all -all: - -# make looks for ways to re-generate included makefiles, but in our case, we -# don't have a direct way. Explicitly telling make that it has nothing to do -# for them makes it go faster. -%.d: ; - -# Use FORCE_DO_CMD to force a target to run. Should be coupled with -# do_cmd. -.PHONY: FORCE_DO_CMD -FORCE_DO_CMD: - -TOOLSET := target -# Suffix rules, putting all outputs into $(obj). -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.c FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cpp FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cxx FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.m FORCE_DO_CMD - @$(call do_cmd,objc,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.mm FORCE_DO_CMD - @$(call do_cmd,objcxx,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.S FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.s FORCE_DO_CMD - @$(call do_cmd,cc,1) - -# Try building from generated source, too. -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.c FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cpp FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cxx FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.m FORCE_DO_CMD - @$(call do_cmd,objc,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.mm FORCE_DO_CMD - @$(call do_cmd,objcxx,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.S FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.s FORCE_DO_CMD - @$(call do_cmd,cc,1) - -$(obj).$(TOOLSET)/%.o: $(obj)/%.c FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.cpp FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.cxx FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.m FORCE_DO_CMD - @$(call do_cmd,objc,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.mm FORCE_DO_CMD - @$(call do_cmd,objcxx,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.S FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.s FORCE_DO_CMD - @$(call do_cmd,cc,1) - - -ifeq ($(strip $(foreach prefix,$(NO_LOAD),\ - $(findstring $(join ^,$(prefix)),\ - $(join ^,timekit.target.mk)))),) - include timekit.target.mk -endif - -quiet_cmd_regen_makefile = ACTION Regenerating $@ -cmd_regen_makefile = /Users/jfolsom/.node-gyp/0.8.8/tools/gyp/gyp -fmake --ignore-environment "--toplevel-dir=." -I/Users/jfolsom/repos/ana/node_modules/nodetime/node_modules/timekit/build/config.gypi -I/usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi -I/Users/jfolsom/.node-gyp/0.8.8/common.gypi "--depth=." "-Goutput_dir=." "--generator-output=build" "-Dlibrary=shared_library" "-Dvisibility=default" "-Dnode_root_dir=/Users/jfolsom/.node-gyp/0.8.8" "-Dmodule_root_dir=/Users/jfolsom/repos/ana/node_modules/nodetime/node_modules/timekit" binding.gyp -Makefile: $(srcdir)/../../../../../../.node-gyp/0.8.8/common.gypi $(srcdir)/build/config.gypi $(srcdir)/binding.gyp $(srcdir)/../../../../../../../../usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi - $(call do_cmd,regen_makefile) - -# "all" is a concatenation of the "all" targets from all the included -# sub-makefiles. This is just here to clarify. -all: - -# Add in dependency-tracking rules. $(all_deps) is the list of every single -# target in our tree. Only consider the ones with .d (dependency) info: -d_files := $(wildcard $(foreach f,$(all_deps),$(depsdir)/$(f).d)) -ifneq ($(d_files),) - include $(d_files) -endif diff --git a/node_modules/nodetime/node_modules/timekit/build/Release/.deps/Release/obj.target/timekit/src/timekit_posix.o.d b/node_modules/nodetime/node_modules/timekit/build/Release/.deps/Release/obj.target/timekit/src/timekit_posix.o.d deleted file mode 100644 index ae11f87..0000000 --- a/node_modules/nodetime/node_modules/timekit/build/Release/.deps/Release/obj.target/timekit/src/timekit_posix.o.d +++ /dev/null @@ -1,29 +0,0 @@ -cmd_Release/obj.target/timekit/src/timekit_posix.o := c++ '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-D_DARWIN_USE_64_BIT_INODE=1' -I/Users/jfolsom/.node-gyp/0.8.8/src -I/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include -I/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include -Os -gdwarf-2 -mmacosx-version-min=10.5 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-rtti -fno-exceptions -fno-threadsafe-statics -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/timekit/src/timekit_posix.o.d.raw -c -o Release/obj.target/timekit/src/timekit_posix.o ../src/timekit_posix.cc -Release/obj.target/timekit/src/timekit_posix.o: ../src/timekit_posix.cc \ - /Users/jfolsom/.node-gyp/0.8.8/src/node.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares_version.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/uv-unix.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ngx-queue.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ev.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/eio.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/node_object_wrap.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/ev-emul.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/eio-emul.h -../src/timekit_posix.cc: -/Users/jfolsom/.node-gyp/0.8.8/src/node.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares_version.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/uv-unix.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ngx-queue.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ev.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/eio.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h: -/Users/jfolsom/.node-gyp/0.8.8/src/node_object_wrap.h: -/Users/jfolsom/.node-gyp/0.8.8/src/ev-emul.h: -/Users/jfolsom/.node-gyp/0.8.8/src/eio-emul.h: diff --git a/node_modules/nodetime/node_modules/timekit/build/Release/.deps/Release/timekit.node.d b/node_modules/nodetime/node_modules/timekit/build/Release/.deps/Release/timekit.node.d deleted file mode 100644 index b2b931e..0000000 --- a/node_modules/nodetime/node_modules/timekit/build/Release/.deps/Release/timekit.node.d +++ /dev/null @@ -1 +0,0 @@ -cmd_Release/timekit.node := ./gyp-mac-tool flock ./Release/linker.lock c++ -shared -Wl,-search_paths_first -mmacosx-version-min=10.5 -arch x86_64 -L./Release -install_name /usr/local/lib/timekit.node -o Release/timekit.node Release/obj.target/timekit/src/timekit_posix.o -undefined dynamic_lookup diff --git a/node_modules/nodetime/node_modules/timekit/build/Release/linker.lock b/node_modules/nodetime/node_modules/timekit/build/Release/linker.lock deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/nodetime/node_modules/timekit/build/Release/obj.target/timekit/src/timekit_posix.o b/node_modules/nodetime/node_modules/timekit/build/Release/obj.target/timekit/src/timekit_posix.o deleted file mode 100644 index 2920de408453480c1e9290f75326bde27b7469d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46692 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 diff --git a/node_modules/nodetime/node_modules/timekit/build/Release/timekit.node b/node_modules/nodetime/node_modules/timekit/build/Release/timekit.node deleted file mode 100755 index c429fca3499a634e883f100c6512103f19a7e2f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9888 zcmeHNZEO@p7@ljPRHR&gR8mynL`n?Etp`|-AAX$W^ct{Mu8<tqJ140yyi61ehfBZ@`Iie<}DjLO}?>is8y{pBT@XPFk znfG~S=6&a#cjwCN%zpI8kCSr<2{jTznjp`EJT#k-5z-2XkcG$_2%)qu+26;jY75b= zS|>T!Bw&W1#6+pbhCG1*lL5E( zE=}{AW@!)Sj7iv|gUl>4hx1zh?vVEO^4^3XKevBb+j6TDuJ`Y2X|Gw@Lypg2rbKDh z^_;vlAUo9CD@%K;WV_l1wm-*9TZ%^-2Tp=+pB5{gmFtj zrgUR>&xYjsZuOguh<5q2CPeaQ>x?U4QTTFG@Z)6VLqX67@RmoKop z^Ip`l4e{V{ouST9gpkWYV(~0EjC1Zq4yjG%Ss<~mKOR79(u+$8S>UgU5Q0nn63D3g z;m^_M9$&cn=o@RlX}nH98D0i;JY=)y64E@E|2>P#zT!84Yz`6gfEmCnT+hg^Tp8_* z!cxg+pcxYWIjYfXd2?i1k^$&V+({m0992#xX7=)2|B zh(}LwO9GFl_MD7wyYqw?<)I(mgaGsA7OwVss#2-MDrF5AA1eaj`>u&_Ys)KuaLkc@ z=mNtYM{)@J1Nj8TAM53~{{wIX{8}-xUGU@O_vIky(ldyqO9GFl9y*C`NUsuG(%qwz zsj+L5FyPx@qEbGjbguns65Klz`?Or-RqvH?%d&Cwx76sDsnK_0@0W4A3%c{Cbhl3F zUI3=J?pmpf`wpM(w!~d`p2j^?rDForD;>Y^@(eG3=j9)~Jj=^TUgC>TrK5qDvv}DA zCD8mmbi>YHP^|i%_}Y1Zhk15%@Vnr5ujgV2aE z$Dx|QXG}TSk0j=|?rZ33X-e+lcCp`j%(CC%`hKZuKNH$sll}J9_v_j->i}A8Jw_`J z!k$w~^`1K@r{+nyTgv@XJ}%|+QobtXTT-5q@-r#b{FNKO%KFFfMFUccd_NQ{D1!(D z5eOm>L?DPj5P={9K?H&b1Q7@#5JVt|KoEiR83DX=f@6TDb}1uL;(a65UnM2pg(1H| zO1xu4-YaFll-s3z1SH)5H|+)q@BU3glAmpFYswuC@w;;a>QuTJfS*&~xyBHQe17F^ z*ay!KqEH;hi#bT+keB)R1n|AsAQSdq23eh>An$>~&(YplX>U1Tw5K>guCLBlkfXkz zqrN)7=mL!TiUZ{O>f8l6>MPCwN1#q6Y&WowsRVd2WIS%dbU^Zhk{tvoQ)$V?}S=filWls64+6Em6aGR@BHhmVtmtYx<67Rznk9n) zj1Ho;Yr4eY>2!lQRJWD)aG=hVZW$))?n%?mTQfUY)=MUngvvO{XcGJ+gMYt6Gw=xt zeAJ@8yAfY&&|JyNQq#8YE*1Gi{>A!?Q$4rabxuKNoIxxmrjX9sMHb(r@9HvbmnD09 zVM_75gYT0vC684tr}-C4>%iYM|6(TDyCIubL#*3u87!B# Xn1Pdp_3V^feSmR@kH*d!`Y`z$zq3(m diff --git a/node_modules/nodetime/node_modules/timekit/build/binding.Makefile b/node_modules/nodetime/node_modules/timekit/build/binding.Makefile deleted file mode 100644 index a979783..0000000 --- a/node_modules/nodetime/node_modules/timekit/build/binding.Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# This file is generated by gyp; do not edit. - -export builddir_name ?= build/./. -.PHONY: all -all: - $(MAKE) timekit diff --git a/node_modules/nodetime/node_modules/timekit/build/config.gypi b/node_modules/nodetime/node_modules/timekit/build/config.gypi deleted file mode 100644 index cc73905..0000000 --- a/node_modules/nodetime/node_modules/timekit/build/config.gypi +++ /dev/null @@ -1,104 +0,0 @@ -# Do not edit. File was generated by node-gyp's "configure" step -{ - "target_defaults": { - "cflags": [], - "default_configuration": "Release", - "defines": [], - "include_dirs": [], - "libraries": [] - }, - "variables": { - "clang": 0, - "gcc_version": 42, - "host_arch": "x64", - "node_install_npm": "true", - "node_install_waf": "true", - "node_prefix": "out/dist-osx/usr/local", - "node_shared_openssl": "false", - "node_shared_v8": "false", - "node_shared_zlib": "false", - "node_use_dtrace": "false", - "node_use_etw": "false", - "node_use_openssl": "true", - "target_arch": "x64", - "v8_no_strict_aliasing": 1, - "v8_use_snapshot": "false", - "nodedir": "/Users/jfolsom/.node-gyp/0.8.8", - "copy_dev_lib": "true", - "save_dev": "", - "browser": "open", - "viewer": "man", - "rollback": "true", - "usage": "", - "globalignorefile": "/usr/local/etc/npmignore", - "init_author_url": "", - "shell": "/bin/bash", - "parseable": "", - "userignorefile": "/Users/jfolsom/.npmignore", - "cache_max": "null", - "init_author_email": "", - "sign_git_tag": "", - "ignore": "", - "long": "", - "registry": "https://registry.npmjs.org/", - "fetch_retries": "2", - "npat": "", - "message": "%s", - "versions": "", - "globalconfig": "/usr/local/etc/npmrc", - "always_auth": "", - "cache_lock_retries": "10", - "fetch_retry_mintimeout": "10000", - "proprietary_attribs": "true", - "coverage": "", - "json": "", - "pre": "", - "description": "true", - "engine_strict": "", - "https_proxy": "", - "init_module": "/Users/jfolsom/.npm-init.js", - "userconfig": "/Users/jfolsom/.npmrc", - "npaturl": "http://npat.npmjs.org/", - "node_version": "v0.8.8", - "user": "", - "editor": "vi", - "save": "", - "tag": "latest", - "global": "", - "optional": "true", - "username": "", - "force": "", - "searchopts": "", - "depth": "null", - "rebuild_bundle": "true", - "searchsort": "name", - "unicode": "true", - "yes": "", - "fetch_retry_maxtimeout": "60000", - "ca": "\"-----BEGIN CERTIFICATE-----\\nMIIChzCCAfACCQDauvz/KHp8ejANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMC\\nVVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMQwwCgYDVQQKEwNucG0x\\nIjAgBgNVBAsTGW5wbSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxDjAMBgNVBAMTBW5w\\nbUNBMRcwFQYJKoZIhvcNAQkBFghpQGl6cy5tZTAeFw0xMTA5MDUwMTQ3MTdaFw0y\\nMTA5MDIwMTQ3MTdaMIGHMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNV\\nBAcTB09ha2xhbmQxDDAKBgNVBAoTA25wbTEiMCAGA1UECxMZbnBtIENlcnRpZmlj\\nYXRlIEF1dGhvcml0eTEOMAwGA1UEAxMFbnBtQ0ExFzAVBgkqhkiG9w0BCQEWCGlA\\naXpzLm1lMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLI4tIqPpRW+ACw9GE\\nOgBlJZwK5f8nnKCLK629Pv5yJpQKs3DENExAyOgDcyaF0HD0zk8zTp+ZsLaNdKOz\\nGn2U181KGprGKAXP6DU6ByOJDWmTlY6+Ad1laYT0m64fERSpHw/hjD3D+iX4aMOl\\ny0HdbT5m1ZGh6SJz3ZqxavhHLQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAC4ySDbC\\nl7W1WpLmtLGEQ/yuMLUf6Jy/vr+CRp4h+UzL+IQpCv8FfxsYE7dhf/bmWTEupBkv\\nyNL18lipt2jSvR3v6oAHAReotvdjqhxddpe5Holns6EQd1/xEZ7sB1YhQKJtvUrl\\nZNufy1Jf1r0ldEGeA+0ISck7s+xSh9rQD2Op\\n-----END CERTIFICATE-----\\n\"", - "strict_ssl": "true", - "dev": "", - "fetch_retry_factor": "10", - "group": "20", - "cache_lock_stale": "60000", - "version": "", - "cache_min": "", - "cache": "/Users/jfolsom/.npm", - "searchexclude": "", - "color": "true", - "save_optional": "", - "user_agent": "node/v0.8.8", - "cache_lock_wait": "10000", - "production": "", - "save_bundle": "", - "init_version": "0.0.0", - "umask": "18", - "git": "git", - "init_author_name": "", - "onload_script": "", - "tmp": "/var/folders/fq/xzvjbs0n3ks26691bqfx1fjc0000gn/T/", - "unsafe_perm": "true", - "link": "", - "prefix": "/usr/local" - } -} diff --git a/node_modules/nodetime/node_modules/timekit/build/gyp-mac-tool b/node_modules/nodetime/node_modules/timekit/build/gyp-mac-tool deleted file mode 100755 index 22f8331..0000000 --- a/node_modules/nodetime/node_modules/timekit/build/gyp-mac-tool +++ /dev/null @@ -1,210 +0,0 @@ -#!/usr/bin/env python -# Generated by gyp. Do not edit. -# Copyright (c) 2012 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Utility functions to perform Xcode-style build steps. - -These functions are executed via gyp-mac-tool when using the Makefile generator. -""" - -import fcntl -import os -import plistlib -import re -import shutil -import string -import subprocess -import sys - - -def main(args): - executor = MacTool() - exit_code = executor.Dispatch(args) - if exit_code is not None: - sys.exit(exit_code) - - -class MacTool(object): - """This class performs all the Mac tooling steps. The methods can either be - executed directly, or dispatched from an argument list.""" - - def Dispatch(self, args): - """Dispatches a string command to a method.""" - if len(args) < 1: - raise Exception("Not enough arguments") - - method = "Exec%s" % self._CommandifyName(args[0]) - return getattr(self, method)(*args[1:]) - - def _CommandifyName(self, name_string): - """Transforms a tool name like copy-info-plist to CopyInfoPlist""" - return name_string.title().replace('-', '') - - def ExecCopyBundleResource(self, source, dest): - """Copies a resource file to the bundle/Resources directory, performing any - necessary compilation on each resource.""" - extension = os.path.splitext(source)[1].lower() - if os.path.isdir(source): - # Copy tree. - if os.path.exists(dest): - shutil.rmtree(dest) - shutil.copytree(source, dest) - elif extension == '.xib': - return self._CopyXIBFile(source, dest) - elif extension == '.strings': - self._CopyStringsFile(source, dest) - else: - shutil.copyfile(source, dest) - - def _CopyXIBFile(self, source, dest): - """Compiles a XIB file with ibtool into a binary plist in the bundle.""" - tools_dir = os.environ.get('DEVELOPER_BIN_DIR', '/usr/bin') - args = [os.path.join(tools_dir, 'ibtool'), '--errors', '--warnings', - '--notices', '--output-format', 'human-readable-text', '--compile', - dest, source] - ibtool_section_re = re.compile(r'/\*.*\*/') - ibtool_re = re.compile(r'.*note:.*is clipping its content') - ibtoolout = subprocess.Popen(args, stdout=subprocess.PIPE) - current_section_header = None - for line in ibtoolout.stdout: - if ibtool_section_re.match(line): - current_section_header = line - elif not ibtool_re.match(line): - if current_section_header: - sys.stdout.write(current_section_header) - current_section_header = None - sys.stdout.write(line) - return ibtoolout.returncode - - def _CopyStringsFile(self, source, dest): - """Copies a .strings file using iconv to reconvert the input into UTF-16.""" - input_code = self._DetectInputEncoding(source) or "UTF-8" - fp = open(dest, 'w') - args = ['/usr/bin/iconv', '--from-code', input_code, '--to-code', - 'UTF-16', source] - subprocess.call(args, stdout=fp) - fp.close() - - def _DetectInputEncoding(self, file_name): - """Reads the first few bytes from file_name and tries to guess the text - encoding. Returns None as a guess if it can't detect it.""" - fp = open(file_name, 'rb') - try: - header = fp.read(3) - except e: - fp.close() - return None - fp.close() - if header.startswith("\xFE\xFF"): - return "UTF-16BE" - elif header.startswith("\xFF\xFE"): - return "UTF-16LE" - elif header.startswith("\xEF\xBB\xBF"): - return "UTF-8" - else: - return None - - def ExecCopyInfoPlist(self, source, dest): - """Copies the |source| Info.plist to the destination directory |dest|.""" - # Read the source Info.plist into memory. - fd = open(source, 'r') - lines = fd.read() - fd.close() - - # Go through all the environment variables and replace them as variables in - # the file. - for key in os.environ: - if key.startswith('_'): - continue - evar = '${%s}' % key - lines = string.replace(lines, evar, os.environ[key]) - - # Write out the file with variables replaced. - fd = open(dest, 'w') - fd.write(lines) - fd.close() - - # Now write out PkgInfo file now that the Info.plist file has been - # "compiled". - self._WritePkgInfo(dest) - - def _WritePkgInfo(self, info_plist): - """This writes the PkgInfo file from the data stored in Info.plist.""" - plist = plistlib.readPlist(info_plist) - if not plist: - return - - # Only create PkgInfo for executable types. - package_type = plist['CFBundlePackageType'] - if package_type != 'APPL': - return - - # The format of PkgInfo is eight characters, representing the bundle type - # and bundle signature, each four characters. If that is missing, four - # '?' characters are used instead. - signature_code = plist.get('CFBundleSignature', '????') - if len(signature_code) != 4: # Wrong length resets everything, too. - signature_code = '?' * 4 - - dest = os.path.join(os.path.dirname(info_plist), 'PkgInfo') - fp = open(dest, 'w') - fp.write('%s%s' % (package_type, signature_code)) - fp.close() - - def ExecFlock(self, lockfile, *cmd_list): - """Emulates the most basic behavior of Linux's flock(1).""" - # Rely on exception handling to report errors. - fd = os.open(lockfile, os.O_RDONLY|os.O_NOCTTY|os.O_CREAT, 0o666) - fcntl.flock(fd, fcntl.LOCK_EX) - return subprocess.call(cmd_list) - - def ExecFilterLibtool(self, *cmd_list): - """Calls libtool and filters out 'libtool: file: foo.o has no symbols'.""" - libtool_re = re.compile(r'^libtool: file: .* has no symbols$') - libtoolout = subprocess.Popen(cmd_list, stderr=subprocess.PIPE) - for line in libtoolout.stderr: - if not libtool_re.match(line): - sys.stderr.write(line) - return libtoolout.returncode - - def ExecPackageFramework(self, framework, version): - """Takes a path to Something.framework and the Current version of that and - sets up all the symlinks.""" - # Find the name of the binary based on the part before the ".framework". - binary = os.path.basename(framework).split('.')[0] - - CURRENT = 'Current' - RESOURCES = 'Resources' - VERSIONS = 'Versions' - - if not os.path.exists(os.path.join(framework, VERSIONS, version, binary)): - # Binary-less frameworks don't seem to contain symlinks (see e.g. - # chromium's out/Debug/org.chromium.Chromium.manifest/ bundle). - return - - # Move into the framework directory to set the symlinks correctly. - pwd = os.getcwd() - os.chdir(framework) - - # Set up the Current version. - self._Relink(version, os.path.join(VERSIONS, CURRENT)) - - # Set up the root symlinks. - self._Relink(os.path.join(VERSIONS, CURRENT, binary), binary) - self._Relink(os.path.join(VERSIONS, CURRENT, RESOURCES), RESOURCES) - - # Back to where we were before! - os.chdir(pwd) - - def _Relink(self, dest, link): - """Creates a symlink to |dest| named |link|. If |link| already exists, - it is overwritten.""" - if os.path.lexists(link): - os.remove(link) - os.symlink(dest, link) - - -if __name__ == '__main__': - sys.exit(main(sys.argv[1:])) diff --git a/node_modules/nodetime/node_modules/timekit/build/timekit.target.mk b/node_modules/nodetime/node_modules/timekit/build/timekit.target.mk deleted file mode 100644 index 256b96d..0000000 --- a/node_modules/nodetime/node_modules/timekit/build/timekit.target.mk +++ /dev/null @@ -1,133 +0,0 @@ -# This file is generated by gyp; do not edit. - -TOOLSET := target -TARGET := timekit -DEFS_Debug := '-D_LARGEFILE_SOURCE' \ - '-D_FILE_OFFSET_BITS=64' \ - '-D_DARWIN_USE_64_BIT_INODE=1' \ - '-DDEBUG' \ - '-D_DEBUG' - -# Flags passed to all source files. -CFLAGS_Debug := -Os \ - -gdwarf-2 \ - -mmacosx-version-min=10.5 \ - -arch x86_64 \ - -Wall \ - -Wendif-labels \ - -W \ - -Wno-unused-parameter - -# Flags passed to only C files. -CFLAGS_C_Debug := -fno-strict-aliasing - -# Flags passed to only C++ files. -CFLAGS_CC_Debug := -fno-rtti \ - -fno-exceptions \ - -fno-threadsafe-statics \ - -fno-strict-aliasing - -# Flags passed to only ObjC files. -CFLAGS_OBJC_Debug := - -# Flags passed to only ObjC++ files. -CFLAGS_OBJCC_Debug := - -INCS_Debug := -I/Users/jfolsom/.node-gyp/0.8.8/src \ - -I/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include \ - -I/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include - -DEFS_Release := '-D_LARGEFILE_SOURCE' \ - '-D_FILE_OFFSET_BITS=64' \ - '-D_DARWIN_USE_64_BIT_INODE=1' - -# Flags passed to all source files. -CFLAGS_Release := -Os \ - -gdwarf-2 \ - -mmacosx-version-min=10.5 \ - -arch x86_64 \ - -Wall \ - -Wendif-labels \ - -W \ - -Wno-unused-parameter - -# Flags passed to only C files. -CFLAGS_C_Release := -fno-strict-aliasing - -# Flags passed to only C++ files. -CFLAGS_CC_Release := -fno-rtti \ - -fno-exceptions \ - -fno-threadsafe-statics \ - -fno-strict-aliasing - -# Flags passed to only ObjC files. -CFLAGS_OBJC_Release := - -# Flags passed to only ObjC++ files. -CFLAGS_OBJCC_Release := - -INCS_Release := -I/Users/jfolsom/.node-gyp/0.8.8/src \ - -I/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include \ - -I/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include - -OBJS := $(obj).target/$(TARGET)/src/timekit_posix.o - -# Add to the list of files we specially track dependencies for. -all_deps += $(OBJS) - -# CFLAGS et al overrides must be target-local. -# See "Target-specific Variable Values" in the GNU Make manual. -$(OBJS): TOOLSET := $(TOOLSET) -$(OBJS): GYP_CFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) -$(OBJS): GYP_CXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) -$(OBJS): GYP_OBJCFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) $(CFLAGS_OBJC_$(BUILDTYPE)) -$(OBJS): GYP_OBJCXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) $(CFLAGS_OBJCC_$(BUILDTYPE)) - -# Suffix rules, putting all outputs into $(obj). - -$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) - -# Try building from generated source, too. - -$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) - -$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) - -# End of this set of suffix rules -### Rules for final target. -LDFLAGS_Debug := -Wl,-search_paths_first \ - -mmacosx-version-min=10.5 \ - -arch x86_64 \ - -L$(builddir) \ - -install_name /usr/local/lib/timekit.node - -LDFLAGS_Release := -Wl,-search_paths_first \ - -mmacosx-version-min=10.5 \ - -arch x86_64 \ - -L$(builddir) \ - -install_name /usr/local/lib/timekit.node - -LIBS := -undefined dynamic_lookup - -$(builddir)/timekit.node: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE)) -$(builddir)/timekit.node: LIBS := $(LIBS) -$(builddir)/timekit.node: TOOLSET := $(TOOLSET) -$(builddir)/timekit.node: $(OBJS) FORCE_DO_CMD - $(call do_cmd,solink_module) - -all_deps += $(builddir)/timekit.node -# Add target alias -.PHONY: timekit -timekit: $(builddir)/timekit.node - -# Short alias for building this executable. -.PHONY: timekit.node -timekit.node: $(builddir)/timekit.node - -# Add executable to "all" target. -.PHONY: all -all: $(builddir)/timekit.node - diff --git a/node_modules/nodetime/node_modules/timekit/index.js b/node_modules/nodetime/node_modules/timekit/index.js deleted file mode 100644 index 564918b..0000000 --- a/node_modules/nodetime/node_modules/timekit/index.js +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2012 Dmitri Melikyan - * - * 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. - */ - -module.exports = require('bindings')('timekit.node') diff --git a/node_modules/nodetime/node_modules/timekit/node_modules/bindings/README.md b/node_modules/nodetime/node_modules/timekit/node_modules/bindings/README.md deleted file mode 100644 index 585cf51..0000000 --- a/node_modules/nodetime/node_modules/timekit/node_modules/bindings/README.md +++ /dev/null @@ -1,97 +0,0 @@ -node-bindings -============= -### Helper module for loading your native module's .node file - -This is a helper module for authors of Node.js native addon modules. -It is basically the "swiss army knife" of `require()`ing your native module's -`.node` file. - -Throughout the course of Node's native addon history, addons have ended up being -compiled in a variety of different places, depending on which build tool and which -version of node was used. To make matters worse, now the _gyp_ build tool can -produce either a _Release_ or _Debug_ build, each being built into different -locations. - -This module checks _all_ the possible locations that a native addon would be built -at, and returns the first one that loads successfully. - - -Installation ------------- - -Install with `npm`: - -``` bash -$ npm install bindings -``` - -Or add it to the `"dependencies"` section of your _package.json_ file. - - -Example -------- - -`require()`ing the proper bindings file for the current node version, platform -and architecture is as simple as: - -``` js -var bindings = require('bindings')('binding.node') - -// Use your bindings defined in your C files -bindings.your_c_function() -``` - - -Nice Error Output ------------------ - -When the `.node` file could not be loaded, `node-bindings` throws an Error with -a nice error message telling you exactly what was tried. You can also check the -`err.tries` Array property. - -``` -Error: Could not load the bindings file. Tried: - → /Users/nrajlich/ref/build/binding.node - → /Users/nrajlich/ref/build/Debug/binding.node - → /Users/nrajlich/ref/build/Release/binding.node - → /Users/nrajlich/ref/out/Debug/binding.node - → /Users/nrajlich/ref/Debug/binding.node - → /Users/nrajlich/ref/out/Release/binding.node - → /Users/nrajlich/ref/Release/binding.node - → /Users/nrajlich/ref/build/default/binding.node - → /Users/nrajlich/ref/compiled/0.8.2/darwin/x64/binding.node - at bindings (/Users/nrajlich/ref/node_modules/bindings/bindings.js:84:13) - at Object. (/Users/nrajlich/ref/lib/ref.js:5:47) - at Module._compile (module.js:449:26) - at Object.Module._extensions..js (module.js:467:10) - at Module.load (module.js:356:32) - at Function.Module._load (module.js:312:12) - ... -``` - - -License -------- - -(The MIT License) - -Copyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net> - -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. diff --git a/node_modules/nodetime/node_modules/timekit/node_modules/bindings/bindings.js b/node_modules/nodetime/node_modules/timekit/node_modules/bindings/bindings.js deleted file mode 100644 index c47a51b..0000000 --- a/node_modules/nodetime/node_modules/timekit/node_modules/bindings/bindings.js +++ /dev/null @@ -1,151 +0,0 @@ - -/** - * Module dependencies. - */ - -var fs = require('fs') - , path = require('path') - , join = path.join - , dirname = path.dirname - , exists = fs.existsSync || path.existsSync - , defaults = { - arrow: process.env.NODE_BINDINGS_ARROW || ' → ' - , compiled: process.env.NODE_BINDINGS_COMPILED_DIR || 'compiled' - , platform: process.platform - , arch: process.arch - , version: process.versions.node - , bindings: 'bindings.node' - , try: [ - // node-gyp's linked version in the "build" dir - [ 'module_root', 'build', 'bindings' ] - // node-waf and gyp_addon (a.k.a node-gyp) - , [ 'module_root', 'build', 'Debug', 'bindings' ] - , [ 'module_root', 'build', 'Release', 'bindings' ] - // Debug files, for development (legacy behavior, remove for node v0.9) - , [ 'module_root', 'out', 'Debug', 'bindings' ] - , [ 'module_root', 'Debug', 'bindings' ] - // Release files, but manually compiled (legacy behavior, remove for node v0.9) - , [ 'module_root', 'out', 'Release', 'bindings' ] - , [ 'module_root', 'Release', 'bindings' ] - // Legacy from node-waf, node <= 0.4.x - , [ 'module_root', 'build', 'default', 'bindings' ] - // Production "Release" buildtype binary (meh...) - , [ 'module_root', 'compiled', 'version', 'platform', 'arch', 'bindings' ] - ] - } - -/** - * The main `bindings()` function loads the compiled bindings for a given module. - * It uses V8's Error API to determine the parent filename that this function is - * being invoked from, which is then used to find the root directory. - */ - -function bindings (opts) { - - // Argument surgery - if (typeof opts == 'string') { - opts = { bindings: opts } - } else if (!opts) { - opts = {} - } - opts.__proto__ = defaults - - // Get the module root - if (!opts.module_root) { - opts.module_root = exports.getRoot(exports.getFileName()) - } - - // Ensure the given bindings name ends with .node - if (path.extname(opts.bindings) != '.node') { - opts.bindings += '.node' - } - - var tries = [] - , i = 0 - , l = opts.try.length - , n - - for (; i (/Users/nrajlich/ref/lib/ref.js:5:47)\n at Module._compile (module.js:449:26)\n at Object.Module._extensions..js (module.js:467:10)\n at Module.load (module.js:356:32)\n at Function.Module._load (module.js:312:12)\n ...\n```\n\n\nLicense\n-------\n\n(The MIT License)\n\nCopyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", - "_id": "bindings@1.0.0", - "_from": "bindings@*", - "scripts": {} -} diff --git a/node_modules/nodetime/node_modules/timekit/package.json b/node_modules/nodetime/node_modules/timekit/package.json deleted file mode 100644 index 8c7b1fa..0000000 --- a/node_modules/nodetime/node_modules/timekit/package.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "timekit", - "version": "0.1.9", - "description": "Time related C bindings", - "author": { - "name": "Dmitri Melikyan", - "email": "dmitri@rapidlogix.com" - }, - "keywords": [ - "time", - "cpu time", - "gettimeofday", - "getrusage", - "microseconds", - "posix", - "windows" - ], - "contributors": [], - "main": "./index.js", - "dependencies": { - "bindings": "*" - }, - "repository": { - "type": "git", - "url": "git://github.com/dmelikyan/node-timekit.git" - }, - "engines": { - "node": ">=0.6.0" - }, - "licenses": [ - { - "type": "MIT", - "url": "http://github.com/dmelikyan/node-timekit/raw/master/LICENSE" - } - ], - "scripts": { - "install": "node-gyp rebuild" - }, - "gypfile": true, - "readme": "Timekit - Time Related C Bindings\n===\n\n\n## Installation\n\n npm install timekit\n\n\n## API\n\n`var timekit = require('timekit');`\n\n`timekit.time()` - uses gettimeofday and returns current time in microseconds. In case of error returns undefined. On Windows uses GetSystemTimeAsFileTime.\n\n`timekit.cputime()` - uses getrusage and returns cpu time spent on current process (user + system) in microseconds. In case of error returns undefined. On Windows uses GetProcessTimes.\n\n\n## Platforms\n\nPOSIX and Windows\n\n\n## License\n\nCopyright (c) 2012 Dmitri Melikyan\n\nPermission 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:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE 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.\n", - "_id": "timekit@0.1.9", - "dist": { - "shasum": "b52796e1e369c9e5c5787c389e53b6288053c30b" - }, - "_from": "timekit@>=0.1.9" -} diff --git a/node_modules/nodetime/node_modules/timekit/src/timekit_posix.cc b/node_modules/nodetime/node_modules/timekit/src/timekit_posix.cc deleted file mode 100644 index b203bf8..0000000 --- a/node_modules/nodetime/node_modules/timekit/src/timekit_posix.cc +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2012 Dmitri Melikyan - * - * 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. - */ - - -#include -#include -#include -#include -#include - -using namespace v8; - - -Handle Time(const Arguments& args) { - HandleScope scope; - - timeval tv; - - int ret = gettimeofday(&tv, 0); - if (ret < 0) { - return scope.Close(Undefined()); - } - - return scope.Close(Number::New((double)tv.tv_sec * 1e6 + (double)tv.tv_usec)); -} - - -Handle Cputime(const Arguments& args) { - HandleScope scope; - - struct rusage ru; - - int ret = getrusage(RUSAGE_SELF, &ru); - if (ret < 0) { - return scope.Close(Undefined()); - } - - return scope.Close(Number::New((double)ru.ru_utime.tv_sec * 1e6 + (double)ru.ru_utime.tv_usec + (double)ru.ru_stime.tv_sec * 1e6 + (double)ru.ru_stime.tv_usec)); -} - - -void Init(Handle target) { - target->Set(String::NewSymbol("time"), FunctionTemplate::New(Time)->GetFunction()); - target->Set(String::NewSymbol("cputime"), FunctionTemplate::New(Cputime)->GetFunction()); -} - - -NODE_MODULE(timekit, Init); - diff --git a/node_modules/nodetime/node_modules/timekit/src/timekit_win.cc b/node_modules/nodetime/node_modules/timekit/src/timekit_win.cc deleted file mode 100644 index 12cbd87..0000000 --- a/node_modules/nodetime/node_modules/timekit/src/timekit_win.cc +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2012 Dmitri Melikyan - * - * 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. - */ - - -#include -#include -#include - -using namespace v8; - - -static double filetimeToMicroseconds(FILETIME* ft) { - ULARGE_INTEGER uli; - uli.LowPart = ft->dwLowDateTime; - uli.HighPart = ft->dwHighDateTime; - - return (double)(uli.QuadPart/10); -} - - -Handle Time(const Arguments& args) { - HandleScope scope; - - FILETIME stime; - GetSystemTimeAsFileTime(&stime); - - return scope.Close(Number::New(filetimeToMicroseconds(&stime))); -} - - -Handle Cputime(const Arguments& args) { - HandleScope scope; - - HANDLE proc = GetCurrentProcess(); - - FILETIME ctime; - FILETIME etime; - FILETIME ktime; - FILETIME utime; - int ret = GetProcessTimes(proc, &ctime, &etime, &ktime, &utime); - if(!ret) { - return scope.Close(Undefined()); - } - - return scope.Close(Number::New(filetimeToMicroseconds(&ktime) + filetimeToMicroseconds(&utime))); -} - - -void Init(Handle target) { - target->Set(String::NewSymbol("time"), FunctionTemplate::New(Time)->GetFunction()); - target->Set(String::NewSymbol("cputime"), FunctionTemplate::New(Cputime)->GetFunction()); -} - - -NODE_MODULE(timekit, Init); - diff --git a/node_modules/nodetime/node_modules/timekit/timekit.cc b/node_modules/nodetime/node_modules/timekit/timekit.cc deleted file mode 100644 index d4a7795..0000000 --- a/node_modules/nodetime/node_modules/timekit/timekit.cc +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2012 Dmitri Melikyan - * - * 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. - */ - - -/* - * This file is depricated. Kept for old npm versions defaulting to node-waf - */ - -#include -#include -#include -#include -#include -#include - -using namespace v8; - - -Handle Time(const Arguments& args) { - HandleScope scope; - - timeval tv; - - int ret = gettimeofday(&tv, 0); - if (ret < 0) { - return scope.Close(Undefined()); - } - - return scope.Close(Number::New((double)tv.tv_sec * 1e6 + (double)tv.tv_usec)); -} - - -Handle Cputime(const Arguments& args) { - HandleScope scope; - - struct rusage ru; - - int ret = getrusage(RUSAGE_SELF, &ru); - if (ret < 0) { - return scope.Close(Undefined()); - } - - return scope.Close(Number::New((double)ru.ru_utime.tv_sec * 1e6 + (double)ru.ru_utime.tv_usec + (double)ru.ru_stime.tv_sec * 1e6 + (double)ru.ru_stime.tv_usec)); -} - - -void Init(Handle target) { - target->Set(String::NewSymbol("time"), FunctionTemplate::New(Time)->GetFunction()); - target->Set(String::NewSymbol("cputime"), FunctionTemplate::New(Cputime)->GetFunction()); -} - - -NODE_MODULE(timekit, Init); - diff --git a/node_modules/nodetime/node_modules/timekit/wscript b/node_modules/nodetime/node_modules/timekit/wscript deleted file mode 100644 index de017af..0000000 --- a/node_modules/nodetime/node_modules/timekit/wscript +++ /dev/null @@ -1,16 +0,0 @@ -srcdir = '.' -blddir = 'build' -VERSION = '0.1' - -def set_options(opt): - opt.tool_options('compiler_cxx') - -def configure(conf): - conf.check_tool('compiler_cxx') - conf.check_tool('node_addon') - -def build(bld): - obj = bld.new_task_gen('cxx', 'shlib', 'node_addon') - obj.target = 'timekit' - obj.source = 'timekit.cc'; - diff --git a/node_modules/nodetime/node_modules/v8tools/.npmignore b/node_modules/nodetime/node_modules/v8tools/.npmignore deleted file mode 100644 index db470e2..0000000 --- a/node_modules/nodetime/node_modules/v8tools/.npmignore +++ /dev/null @@ -1,7 +0,0 @@ -.git* -test/ -.DS_Store -node_modules/ -npm-debug.log -build -.lock-wscript diff --git a/node_modules/nodetime/node_modules/v8tools/LICENSE b/node_modules/nodetime/node_modules/v8tools/LICENSE deleted file mode 100644 index 3959a05..0000000 --- a/node_modules/nodetime/node_modules/v8tools/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2012 Dmitri Melikyan - -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. diff --git a/node_modules/nodetime/node_modules/v8tools/README.md b/node_modules/nodetime/node_modules/v8tools/README.md deleted file mode 100644 index 31d8d6d..0000000 --- a/node_modules/nodetime/node_modules/v8tools/README.md +++ /dev/null @@ -1,37 +0,0 @@ -V8tools - V8 CPU Profiler Binding -=== - - -## Installation - - npm install v8tools - - -## API - -`var v8tools = require('v8tools');` - -`v8tools.afterGC(v8tools.afterGC(function(gcType, gcFlags, usedHeapSize) {})` - calls the callback after garbage collection cycle. - -`v8tools.startV8Profiler()` - starts V8 CPU profiler - -`v8tools.stopV8Profiler(function(parentNodeUid, nodeUid, totalSamplesCount, functionName, scriptResourceName, lineNumber) {})` - stops V8 CPU profiler. Callback function is called on every node while walking profile's top down call tree. - -`heapprof.takeHeapSnapshot(function(parentNodeUid, nodeUid, name, type, selfSize, retainerName, retainerType) {})` - takes heap snapshot. Callback function is called on every node of heap node graph. - - - -## Platforms - -POSIX and Windows - - -## License - -Copyright (c) 2012 Dmitri Melikyan - -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. diff --git a/node_modules/nodetime/node_modules/v8tools/binding.gyp b/node_modules/nodetime/node_modules/v8tools/binding.gyp deleted file mode 100644 index afd2ab3..0000000 --- a/node_modules/nodetime/node_modules/v8tools/binding.gyp +++ /dev/null @@ -1,14 +0,0 @@ -{ - 'targets': [ - { - 'target_name': 'v8tools', - 'sources': [ - 'src/v8tools.cc', - 'src/gc.cc', - 'src/gc.h', - 'src/profiler.cc', - 'src/profiler.h' - ] - } - ] -} diff --git a/node_modules/nodetime/node_modules/v8tools/build/Makefile b/node_modules/nodetime/node_modules/v8tools/build/Makefile deleted file mode 100644 index f4af4d1..0000000 --- a/node_modules/nodetime/node_modules/v8tools/build/Makefile +++ /dev/null @@ -1,359 +0,0 @@ -# We borrow heavily from the kernel build setup, though we are simpler since -# we don't have Kconfig tweaking settings on us. - -# The implicit make rules have it looking for RCS files, among other things. -# We instead explicitly write all the rules we care about. -# It's even quicker (saves ~200ms) to pass -r on the command line. -MAKEFLAGS=-r - -# The source directory tree. -srcdir := .. -abs_srcdir := $(abspath $(srcdir)) - -# The name of the builddir. -builddir_name ?= . - -# The V=1 flag on command line makes us verbosely print command lines. -ifdef V - quiet= -else - quiet=quiet_ -endif - -# Specify BUILDTYPE=Release on the command line for a release build. -BUILDTYPE ?= Release - -# Directory all our build output goes into. -# Note that this must be two directories beneath src/ for unit tests to pass, -# as they reach into the src/ directory for data with relative paths. -builddir ?= $(builddir_name)/$(BUILDTYPE) -abs_builddir := $(abspath $(builddir)) -depsdir := $(builddir)/.deps - -# Object output directory. -obj := $(builddir)/obj -abs_obj := $(abspath $(obj)) - -# We build up a list of every single one of the targets so we can slurp in the -# generated dependency rule Makefiles in one pass. -all_deps := - - - -# C++ apps need to be linked with g++. -# -# Note: flock is used to seralize linking. Linking is a memory-intensive -# process so running parallel links can often lead to thrashing. To disable -# the serialization, override LINK via an envrionment variable as follows: -# -# export LINK=g++ -# -# This will allow make to invoke N linker processes as specified in -jN. -LINK ?= ./gyp-mac-tool flock $(builddir)/linker.lock $(CXX) - -CC.target ?= $(CC) -CFLAGS.target ?= $(CFLAGS) -CXX.target ?= $(CXX) -CXXFLAGS.target ?= $(CXXFLAGS) -LINK.target ?= $(LINK) -LDFLAGS.target ?= $(LDFLAGS) -AR.target ?= $(AR) -ARFLAGS.target ?= crs - -# N.B.: the logic of which commands to run should match the computation done -# in gyp's make.py where ARFLAGS.host etc. is computed. -# TODO(evan): move all cross-compilation logic to gyp-time so we don't need -# to replicate this environment fallback in make as well. -CC.host ?= gcc -CFLAGS.host ?= -CXX.host ?= g++ -CXXFLAGS.host ?= -LINK.host ?= g++ -LDFLAGS.host ?= -AR.host ?= ar -ARFLAGS.host := crs - -# Define a dir function that can handle spaces. -# http://www.gnu.org/software/make/manual/make.html#Syntax-of-Functions -# "leading spaces cannot appear in the text of the first argument as written. -# These characters can be put into the argument value by variable substitution." -empty := -space := $(empty) $(empty) - -# http://stackoverflow.com/questions/1189781/using-make-dir-or-notdir-on-a-path-with-spaces -replace_spaces = $(subst $(space),?,$1) -unreplace_spaces = $(subst ?,$(space),$1) -dirx = $(call unreplace_spaces,$(dir $(call replace_spaces,$1))) - -# Flags to make gcc output dependency info. Note that you need to be -# careful here to use the flags that ccache and distcc can understand. -# We write to a dep file on the side first and then rename at the end -# so we can't end up with a broken dep file. -depfile = $(depsdir)/$(call replace_spaces,$@).d -DEPFLAGS = -MMD -MF $(depfile).raw - -# We have to fixup the deps output in a few ways. -# (1) the file output should mention the proper .o file. -# ccache or distcc lose the path to the target, so we convert a rule of -# the form: -# foobar.o: DEP1 DEP2 -# into -# path/to/foobar.o: DEP1 DEP2 -# (2) we want missing files not to cause us to fail to build. -# We want to rewrite -# foobar.o: DEP1 DEP2 \ -# DEP3 -# to -# DEP1: -# DEP2: -# DEP3: -# so if the files are missing, they're just considered phony rules. -# We have to do some pretty insane escaping to get those backslashes -# and dollar signs past make, the shell, and sed at the same time. -# Doesn't work with spaces, but that's fine: .d files have spaces in -# their names replaced with other characters. -define fixup_dep -# The depfile may not exist if the input file didn't have any #includes. -touch $(depfile).raw -# Fixup path as in (1). -sed -e "s|^$(notdir $@)|$@|" $(depfile).raw >> $(depfile) -# Add extra rules as in (2). -# We remove slashes and replace spaces with new lines; -# remove blank lines; -# delete the first line and append a colon to the remaining lines. -sed -e 's|\\||' -e 'y| |\n|' $(depfile).raw |\ - grep -v '^$$' |\ - sed -e 1d -e 's|$$|:|' \ - >> $(depfile) -rm $(depfile).raw -endef - -# Command definitions: -# - cmd_foo is the actual command to run; -# - quiet_cmd_foo is the brief-output summary of the command. - -quiet_cmd_cc = CC($(TOOLSET)) $@ -cmd_cc = $(CC.$(TOOLSET)) $(GYP_CFLAGS) $(DEPFLAGS) $(CFLAGS.$(TOOLSET)) -c -o $@ $< - -quiet_cmd_cxx = CXX($(TOOLSET)) $@ -cmd_cxx = $(CXX.$(TOOLSET)) $(GYP_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< - -quiet_cmd_objc = CXX($(TOOLSET)) $@ -cmd_objc = $(CC.$(TOOLSET)) $(GYP_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< - -quiet_cmd_objcxx = CXX($(TOOLSET)) $@ -cmd_objcxx = $(CXX.$(TOOLSET)) $(GYP_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< - -# Commands for precompiled header files. -quiet_cmd_pch_c = CXX($(TOOLSET)) $@ -cmd_pch_c = $(CC.$(TOOLSET)) $(GYP_PCH_CFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< -quiet_cmd_pch_cc = CXX($(TOOLSET)) $@ -cmd_pch_cc = $(CC.$(TOOLSET)) $(GYP_PCH_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< -quiet_cmd_pch_m = CXX($(TOOLSET)) $@ -cmd_pch_m = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< -quiet_cmd_pch_mm = CXX($(TOOLSET)) $@ -cmd_pch_mm = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< - -# gyp-mac-tool is written next to the root Makefile by gyp. -# Use $(4) for the command, since $(2) and $(3) are used as flag by do_cmd -# already. -quiet_cmd_mac_tool = MACTOOL $(4) $< -cmd_mac_tool = ./gyp-mac-tool $(4) $< "$@" - -quiet_cmd_mac_package_framework = PACKAGE FRAMEWORK $@ -cmd_mac_package_framework = ./gyp-mac-tool package-framework "$@" $(4) - -quiet_cmd_infoplist = INFOPLIST $@ -cmd_infoplist = $(CC.$(TOOLSET)) -E -P -Wno-trigraphs -x c $(INFOPLIST_DEFINES) "$<" -o "$@" - -quiet_cmd_touch = TOUCH $@ -cmd_touch = touch $@ - -quiet_cmd_copy = COPY $@ -# send stderr to /dev/null to ignore messages when linking directories. -cmd_copy = ln -f "$<" "$@" 2>/dev/null || (rm -rf "$@" && cp -af "$<" "$@") - -quiet_cmd_alink = LIBTOOL-STATIC $@ -cmd_alink = rm -f $@ && ./gyp-mac-tool filter-libtool libtool -static -o $@ $(filter %.o,$^) - -quiet_cmd_link = LINK($(TOOLSET)) $@ -cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) - -# TODO(thakis): Find out and document the difference between shared_library and -# loadable_module on mac. -quiet_cmd_solink = SOLINK($(TOOLSET)) $@ -cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) - -# TODO(thakis): The solink_module rule is likely wrong. Xcode seems to pass -# -bundle -single_module here (for osmesa.so). -quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@ -cmd_solink_module = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS) - - -# Define an escape_quotes function to escape single quotes. -# This allows us to handle quotes properly as long as we always use -# use single quotes and escape_quotes. -escape_quotes = $(subst ','\'',$(1)) -# This comment is here just to include a ' to unconfuse syntax highlighting. -# Define an escape_vars function to escape '$' variable syntax. -# This allows us to read/write command lines with shell variables (e.g. -# $LD_LIBRARY_PATH), without triggering make substitution. -escape_vars = $(subst $$,$$$$,$(1)) -# Helper that expands to a shell command to echo a string exactly as it is in -# make. This uses printf instead of echo because printf's behaviour with respect -# to escape sequences is more portable than echo's across different shells -# (e.g., dash, bash). -exact_echo = printf '%s\n' '$(call escape_quotes,$(1))' - -# Helper to compare the command we're about to run against the command -# we logged the last time we ran the command. Produces an empty -# string (false) when the commands match. -# Tricky point: Make has no string-equality test function. -# The kernel uses the following, but it seems like it would have false -# positives, where one string reordered its arguments. -# arg_check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \ -# $(filter-out $(cmd_$@), $(cmd_$(1)))) -# We instead substitute each for the empty string into the other, and -# say they're equal if both substitutions produce the empty string. -# .d files contain ? instead of spaces, take that into account. -command_changed = $(or $(subst $(cmd_$(1)),,$(cmd_$(call replace_spaces,$@))),\ - $(subst $(cmd_$(call replace_spaces,$@)),,$(cmd_$(1)))) - -# Helper that is non-empty when a prerequisite changes. -# Normally make does this implicitly, but we force rules to always run -# so we can check their command lines. -# $? -- new prerequisites -# $| -- order-only dependencies -prereq_changed = $(filter-out FORCE_DO_CMD,$(filter-out $|,$?)) - -# Helper that executes all postbuilds, and deletes the output file when done -# if any of the postbuilds failed. -define do_postbuilds - @E=0;\ - for p in $(POSTBUILDS); do\ - eval $$p;\ - F=$$?;\ - if [ $$F -ne 0 ]; then\ - E=$$F;\ - fi;\ - done;\ - if [ $$E -ne 0 ]; then\ - rm -rf "$@";\ - exit $$E;\ - fi -endef - -# do_cmd: run a command via the above cmd_foo names, if necessary. -# Should always run for a given target to handle command-line changes. -# Second argument, if non-zero, makes it do asm/C/C++ dependency munging. -# Third argument, if non-zero, makes it do POSTBUILDS processing. -# Note: We intentionally do NOT call dirx for depfile, since it contains ? for -# spaces already and dirx strips the ? characters. -define do_cmd -$(if $(or $(command_changed),$(prereq_changed)), - @$(call exact_echo, $($(quiet)cmd_$(1))) - @mkdir -p "$(call dirx,$@)" "$(dir $(depfile))" - $(if $(findstring flock,$(word 2,$(cmd_$1))), - @$(cmd_$(1)) - @echo " $(quiet_cmd_$(1)): Finished", - @$(cmd_$(1)) - ) - @$(call exact_echo,$(call escape_vars,cmd_$(call replace_spaces,$@) := $(cmd_$(1)))) > $(depfile) - @$(if $(2),$(fixup_dep)) - $(if $(and $(3), $(POSTBUILDS)), - $(call do_postbuilds) - ) -) -endef - -# Declare the "all" target first so it is the default, -# even though we don't have the deps yet. -.PHONY: all -all: - -# make looks for ways to re-generate included makefiles, but in our case, we -# don't have a direct way. Explicitly telling make that it has nothing to do -# for them makes it go faster. -%.d: ; - -# Use FORCE_DO_CMD to force a target to run. Should be coupled with -# do_cmd. -.PHONY: FORCE_DO_CMD -FORCE_DO_CMD: - -TOOLSET := target -# Suffix rules, putting all outputs into $(obj). -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.c FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cpp FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cxx FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.m FORCE_DO_CMD - @$(call do_cmd,objc,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.mm FORCE_DO_CMD - @$(call do_cmd,objcxx,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.S FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.s FORCE_DO_CMD - @$(call do_cmd,cc,1) - -# Try building from generated source, too. -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.c FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cpp FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cxx FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.m FORCE_DO_CMD - @$(call do_cmd,objc,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.mm FORCE_DO_CMD - @$(call do_cmd,objcxx,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.S FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.s FORCE_DO_CMD - @$(call do_cmd,cc,1) - -$(obj).$(TOOLSET)/%.o: $(obj)/%.c FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.cpp FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.cxx FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.m FORCE_DO_CMD - @$(call do_cmd,objc,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.mm FORCE_DO_CMD - @$(call do_cmd,objcxx,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.S FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.s FORCE_DO_CMD - @$(call do_cmd,cc,1) - - -ifeq ($(strip $(foreach prefix,$(NO_LOAD),\ - $(findstring $(join ^,$(prefix)),\ - $(join ^,v8tools.target.mk)))),) - include v8tools.target.mk -endif - -quiet_cmd_regen_makefile = ACTION Regenerating $@ -cmd_regen_makefile = /Users/jfolsom/.node-gyp/0.8.8/tools/gyp/gyp -fmake --ignore-environment "--toplevel-dir=." -I/Users/jfolsom/repos/ana/node_modules/nodetime/node_modules/v8tools/build/config.gypi -I/usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi -I/Users/jfolsom/.node-gyp/0.8.8/common.gypi "--depth=." "-Goutput_dir=." "--generator-output=build" "-Dlibrary=shared_library" "-Dvisibility=default" "-Dnode_root_dir=/Users/jfolsom/.node-gyp/0.8.8" "-Dmodule_root_dir=/Users/jfolsom/repos/ana/node_modules/nodetime/node_modules/v8tools" binding.gyp -Makefile: $(srcdir)/../../../../../../.node-gyp/0.8.8/common.gypi $(srcdir)/build/config.gypi $(srcdir)/binding.gyp $(srcdir)/../../../../../../../../usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi - $(call do_cmd,regen_makefile) - -# "all" is a concatenation of the "all" targets from all the included -# sub-makefiles. This is just here to clarify. -all: - -# Add in dependency-tracking rules. $(all_deps) is the list of every single -# target in our tree. Only consider the ones with .d (dependency) info: -d_files := $(wildcard $(foreach f,$(all_deps),$(depsdir)/$(f).d)) -ifneq ($(d_files),) - include $(d_files) -endif diff --git a/node_modules/nodetime/node_modules/v8tools/build/Release/.deps/Release/obj.target/v8tools/src/gc.o.d b/node_modules/nodetime/node_modules/v8tools/build/Release/.deps/Release/obj.target/v8tools/src/gc.o.d deleted file mode 100644 index 76cffa4..0000000 --- a/node_modules/nodetime/node_modules/v8tools/build/Release/.deps/Release/obj.target/v8tools/src/gc.o.d +++ /dev/null @@ -1,30 +0,0 @@ -cmd_Release/obj.target/v8tools/src/gc.o := c++ '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-D_DARWIN_USE_64_BIT_INODE=1' -I/Users/jfolsom/.node-gyp/0.8.8/src -I/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include -I/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include -Os -gdwarf-2 -mmacosx-version-min=10.5 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-rtti -fno-exceptions -fno-threadsafe-statics -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/v8tools/src/gc.o.d.raw -c -o Release/obj.target/v8tools/src/gc.o ../src/gc.cc -Release/obj.target/v8tools/src/gc.o: ../src/gc.cc ../src/gc.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/node.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares_version.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/uv-unix.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ngx-queue.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ev.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/eio.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/node_object_wrap.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/ev-emul.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/eio-emul.h -../src/gc.cc: -../src/gc.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h: -/Users/jfolsom/.node-gyp/0.8.8/src/node.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares_version.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/uv-unix.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ngx-queue.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ev.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/eio.h: -/Users/jfolsom/.node-gyp/0.8.8/src/node_object_wrap.h: -/Users/jfolsom/.node-gyp/0.8.8/src/ev-emul.h: -/Users/jfolsom/.node-gyp/0.8.8/src/eio-emul.h: diff --git a/node_modules/nodetime/node_modules/v8tools/build/Release/.deps/Release/obj.target/v8tools/src/profiler.o.d b/node_modules/nodetime/node_modules/v8tools/build/Release/.deps/Release/obj.target/v8tools/src/profiler.o.d deleted file mode 100644 index f67e9a6..0000000 --- a/node_modules/nodetime/node_modules/v8tools/build/Release/.deps/Release/obj.target/v8tools/src/profiler.o.d +++ /dev/null @@ -1,11 +0,0 @@ -cmd_Release/obj.target/v8tools/src/profiler.o := c++ '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-D_DARWIN_USE_64_BIT_INODE=1' -I/Users/jfolsom/.node-gyp/0.8.8/src -I/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include -I/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include -Os -gdwarf-2 -mmacosx-version-min=10.5 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-rtti -fno-exceptions -fno-threadsafe-statics -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/v8tools/src/profiler.o.d.raw -c -o Release/obj.target/v8tools/src/profiler.o ../src/profiler.cc -Release/obj.target/v8tools/src/profiler.o: ../src/profiler.cc \ - /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8-profiler.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h \ - ../src/profiler.h -../src/profiler.cc: -/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8-profiler.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h: -../src/profiler.h: diff --git a/node_modules/nodetime/node_modules/v8tools/build/Release/.deps/Release/obj.target/v8tools/src/v8tools.o.d b/node_modules/nodetime/node_modules/v8tools/build/Release/.deps/Release/obj.target/v8tools/src/v8tools.o.d deleted file mode 100644 index 3512090..0000000 --- a/node_modules/nodetime/node_modules/v8tools/build/Release/.deps/Release/obj.target/v8tools/src/v8tools.o.d +++ /dev/null @@ -1,32 +0,0 @@ -cmd_Release/obj.target/v8tools/src/v8tools.o := c++ '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-D_DARWIN_USE_64_BIT_INODE=1' -I/Users/jfolsom/.node-gyp/0.8.8/src -I/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include -I/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include -Os -gdwarf-2 -mmacosx-version-min=10.5 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-rtti -fno-exceptions -fno-threadsafe-statics -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/v8tools/src/v8tools.o.d.raw -c -o Release/obj.target/v8tools/src/v8tools.o ../src/v8tools.cc -Release/obj.target/v8tools/src/v8tools.o: ../src/v8tools.cc \ - /Users/jfolsom/.node-gyp/0.8.8/src/node.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares_version.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/uv-unix.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ngx-queue.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ev.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/eio.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/node_object_wrap.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/ev-emul.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/eio-emul.h ../src/gc.h \ - ../src/profiler.h -../src/v8tools.cc: -/Users/jfolsom/.node-gyp/0.8.8/src/node.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares_version.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/uv-unix.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ngx-queue.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ev.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/eio.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h: -/Users/jfolsom/.node-gyp/0.8.8/src/node_object_wrap.h: -/Users/jfolsom/.node-gyp/0.8.8/src/ev-emul.h: -/Users/jfolsom/.node-gyp/0.8.8/src/eio-emul.h: -../src/gc.h: -../src/profiler.h: diff --git a/node_modules/nodetime/node_modules/v8tools/build/Release/.deps/Release/v8tools.node.d b/node_modules/nodetime/node_modules/v8tools/build/Release/.deps/Release/v8tools.node.d deleted file mode 100644 index c7b7c18..0000000 --- a/node_modules/nodetime/node_modules/v8tools/build/Release/.deps/Release/v8tools.node.d +++ /dev/null @@ -1 +0,0 @@ -cmd_Release/v8tools.node := ./gyp-mac-tool flock ./Release/linker.lock c++ -shared -Wl,-search_paths_first -mmacosx-version-min=10.5 -arch x86_64 -L./Release -install_name /usr/local/lib/v8tools.node -o Release/v8tools.node Release/obj.target/v8tools/src/v8tools.o Release/obj.target/v8tools/src/gc.o Release/obj.target/v8tools/src/profiler.o -undefined dynamic_lookup diff --git a/node_modules/nodetime/node_modules/v8tools/build/Release/linker.lock b/node_modules/nodetime/node_modules/v8tools/build/Release/linker.lock deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/nodetime/node_modules/v8tools/build/Release/obj.target/v8tools/src/gc.o b/node_modules/nodetime/node_modules/v8tools/build/Release/obj.target/v8tools/src/gc.o deleted file mode 100644 index 7e087e7aad44ce9c000286457cd08ec175e6d0dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70984 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 ``>@JLJxBJ`rm)F;{MAO`lJf~Nfo-Y!vE9? zePf0Htrg|Hz2bgsqVz9cUxoj>71|$%|BUk}eKR?sxBnrFXC=pn`9^-QeEi-*cD930 zU`tbt?|(o!w)mpe7x;2q_T7SV%<>oXDt;M}=;gcl?}}ytvg1_qf^hyr<+tql#`d_+ zJ^z77pEz9da}R|4v_$Q+==ZN)SgvQ~cgwOy_kp2b=v$m!{?Kku`g@M)7X!kOd;~xF zEU)wH@;4j&G3v|aUD7P8NJvft?C;RgHQJx|E~M}eAS7}uY=x)5afQiKy5`2&KP_LpfaO|Mma%L< L`7??cK861QS?pZ} diff --git a/node_modules/nodetime/node_modules/v8tools/build/Release/obj.target/v8tools/src/profiler.o b/node_modules/nodetime/node_modules/v8tools/build/Release/obj.target/v8tools/src/profiler.o deleted file mode 100644 index bea72f94991fbaf49cff73ea97613e09c7557502..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56856 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 K(@lHv_kREvmLT2$ diff --git a/node_modules/nodetime/node_modules/v8tools/build/Release/obj.target/v8tools/src/v8tools.o b/node_modules/nodetime/node_modules/v8tools/build/Release/obj.target/v8tools/src/v8tools.o deleted file mode 100644 index b4fbfa374a598dd460184badf3c4aab06a09db41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40312 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 UZ_s|DNUcb3%wdzY7EMF^A4KfWtpET3 diff --git a/node_modules/nodetime/node_modules/v8tools/build/Release/v8tools.node b/node_modules/nodetime/node_modules/v8tools/build/Release/v8tools.node deleted file mode 100755 index f4331c895c38deb6ee6c3506ff93d7ccd05c354b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18212 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 S@Sx(sjFB (/Users/nrajlich/ref/lib/ref.js:5:47) - at Module._compile (module.js:449:26) - at Object.Module._extensions..js (module.js:467:10) - at Module.load (module.js:356:32) - at Function.Module._load (module.js:312:12) - ... -``` - - -License -------- - -(The MIT License) - -Copyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net> - -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. diff --git a/node_modules/nodetime/node_modules/v8tools/node_modules/bindings/bindings.js b/node_modules/nodetime/node_modules/v8tools/node_modules/bindings/bindings.js deleted file mode 100644 index c47a51b..0000000 --- a/node_modules/nodetime/node_modules/v8tools/node_modules/bindings/bindings.js +++ /dev/null @@ -1,151 +0,0 @@ - -/** - * Module dependencies. - */ - -var fs = require('fs') - , path = require('path') - , join = path.join - , dirname = path.dirname - , exists = fs.existsSync || path.existsSync - , defaults = { - arrow: process.env.NODE_BINDINGS_ARROW || ' → ' - , compiled: process.env.NODE_BINDINGS_COMPILED_DIR || 'compiled' - , platform: process.platform - , arch: process.arch - , version: process.versions.node - , bindings: 'bindings.node' - , try: [ - // node-gyp's linked version in the "build" dir - [ 'module_root', 'build', 'bindings' ] - // node-waf and gyp_addon (a.k.a node-gyp) - , [ 'module_root', 'build', 'Debug', 'bindings' ] - , [ 'module_root', 'build', 'Release', 'bindings' ] - // Debug files, for development (legacy behavior, remove for node v0.9) - , [ 'module_root', 'out', 'Debug', 'bindings' ] - , [ 'module_root', 'Debug', 'bindings' ] - // Release files, but manually compiled (legacy behavior, remove for node v0.9) - , [ 'module_root', 'out', 'Release', 'bindings' ] - , [ 'module_root', 'Release', 'bindings' ] - // Legacy from node-waf, node <= 0.4.x - , [ 'module_root', 'build', 'default', 'bindings' ] - // Production "Release" buildtype binary (meh...) - , [ 'module_root', 'compiled', 'version', 'platform', 'arch', 'bindings' ] - ] - } - -/** - * The main `bindings()` function loads the compiled bindings for a given module. - * It uses V8's Error API to determine the parent filename that this function is - * being invoked from, which is then used to find the root directory. - */ - -function bindings (opts) { - - // Argument surgery - if (typeof opts == 'string') { - opts = { bindings: opts } - } else if (!opts) { - opts = {} - } - opts.__proto__ = defaults - - // Get the module root - if (!opts.module_root) { - opts.module_root = exports.getRoot(exports.getFileName()) - } - - // Ensure the given bindings name ends with .node - if (path.extname(opts.bindings) != '.node') { - opts.bindings += '.node' - } - - var tries = [] - , i = 0 - , l = opts.try.length - , n - - for (; i (/Users/nrajlich/ref/lib/ref.js:5:47)\n at Module._compile (module.js:449:26)\n at Object.Module._extensions..js (module.js:467:10)\n at Module.load (module.js:356:32)\n at Function.Module._load (module.js:312:12)\n ...\n```\n\n\nLicense\n-------\n\n(The MIT License)\n\nCopyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", - "_id": "bindings@1.0.0", - "_from": "bindings@*", - "scripts": {} -} diff --git a/node_modules/nodetime/node_modules/v8tools/package.json b/node_modules/nodetime/node_modules/v8tools/package.json deleted file mode 100644 index e1b618b..0000000 --- a/node_modules/nodetime/node_modules/v8tools/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "v8tools", - "version": "0.2.1", - "description": "V8 profiler and GC bindings", - "author": { - "name": "Nodetime", - "email": "devops@nodetime.com" - }, - "keywords": [ - "V8 tools", - "V8 profiler", - "profiler", - "CPU profiler", - "heap profiler", - "garbage collection", - "posix", - "windows" - ], - "contributors": [], - "main": "./index.js", - "dependencies": { - "bindings": "*" - }, - "repository": { - "type": "git", - "url": "git://github.com/nodetime/node-v8tools.git" - }, - "engines": { - "node": ">=0.6.0" - }, - "licenses": [ - { - "type": "MIT", - "url": "http://github.com/dmelikyan/node-v8tools/raw/master/LICENSE" - } - ], - "scripts": { - "install": "node-gyp rebuild" - }, - "gypfile": true, - "readme": "V8tools - V8 CPU Profiler Binding\n===\n\n\n## Installation\n\n npm install v8tools\n\n\n## API\n\n`var v8tools = require('v8tools');`\n\n`v8tools.afterGC(v8tools.afterGC(function(gcType, gcFlags, usedHeapSize) {})` - calls the callback after garbage collection cycle.\n\n`v8tools.startV8Profiler()` - starts V8 CPU profiler\n\n`v8tools.stopV8Profiler(function(parentNodeUid, nodeUid, totalSamplesCount, functionName, scriptResourceName, lineNumber) {})` - stops V8 CPU profiler. Callback function is called on every node while walking profile's top down call tree.\n\n`heapprof.takeHeapSnapshot(function(parentNodeUid, nodeUid, name, type, selfSize, retainerName, retainerType) {})` - takes heap snapshot. Callback function is called on every node of heap node graph.\n\n\n\n## Platforms\n\nPOSIX and Windows\n\n\n## License\n\nCopyright (c) 2012 Dmitri Melikyan\n\nPermission 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:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE 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.\n", - "_id": "v8tools@0.2.1", - "dist": { - "shasum": "1ce4c149d2e9340e66b90cee16e5a425052c3471" - }, - "_from": "v8tools@>=0.2.0" -} diff --git a/node_modules/nodetime/node_modules/v8tools/src/gc.cc b/node_modules/nodetime/node_modules/v8tools/src/gc.cc deleted file mode 100644 index 2ddea7c..0000000 --- a/node_modules/nodetime/node_modules/v8tools/src/gc.cc +++ /dev/null @@ -1,102 +0,0 @@ - - -#include "gc.h" - -using namespace v8; - - -Persistent callback; -Persistent callback_context; - - -struct Baton { - uv_work_t request; - GCType gc_type; - GCCallbackFlags gc_callback_flags; - size_t used_heap_size; -}; - - -static void Noop(uv_work_t* request) { -} - - -static void GCEpilogueAsync(uv_work_t* request) { - Baton *baton = static_cast(request->data); - - Handle argv[3]; - - switch(baton->gc_type) { - case kGCTypeAll: - argv[0] = String::New("kGCTypeAll"); - break; - case kGCTypeMarkSweepCompact: - argv[0] = String::New("kGCTypeMarkSweepCompact"); - break; - case kGCTypeScavenge: - argv[0] = String::New("kGCTypeScavenge"); - break; - default: - argv[0] = String::New("Other"); - } - - switch(baton->gc_callback_flags) { - case kGCCallbackFlagCompacted: - argv[1] = String::New("kGCCallbackFlagCompacted"); - break; - case kNoGCCallbackFlags: - argv[1] = String::New("kNoGCCallbackFlags"); - break; - default: - argv[1] = String::New("Other"); - } - - argv[2] = Integer::New(baton->used_heap_size); - - callback->Call(callback_context, 3, argv); - - delete baton; -} - - -static size_t GetUsedHeapSize() { - HeapStatistics stats; - V8::GetHeapStatistics(&stats); - - return stats.used_heap_size(); -} - - -static void GCEpilogue(GCType gc_type, GCCallbackFlags gc_callback_flags) { - Baton *baton = new Baton(); - baton->request.data = baton; - - baton->gc_type = gc_type; - baton->gc_callback_flags = gc_callback_flags; - - baton->used_heap_size = GetUsedHeapSize(); - - uv_queue_work(uv_default_loop(), &baton->request, Noop, GCEpilogueAsync); -} - - -Handle AfterGC(const Arguments& args) { - HandleScope scope; - - - if(args.Length() > 0 && args[0]->IsFunction()) { - Local callbackArg = Local::Cast(args[0]); - callback = Persistent::New(callbackArg); - callback_context = Persistent::New(Context::GetCalling()->Global()); - } - else { - return scope.Close(Undefined()); - } - - - V8::AddGCEpilogueCallback(GCEpilogue); - - return scope.Close(Undefined()); -} - - diff --git a/node_modules/nodetime/node_modules/v8tools/src/gc.h b/node_modules/nodetime/node_modules/v8tools/src/gc.h deleted file mode 100644 index f7a410d..0000000 --- a/node_modules/nodetime/node_modules/v8tools/src/gc.h +++ /dev/null @@ -1,13 +0,0 @@ - - -#ifndef GC_H_ -#define GC_H_ - -#include -#include - -using namespace v8; - -Handle AfterGC(const Arguments& args); - -#endif diff --git a/node_modules/nodetime/node_modules/v8tools/src/profiler.cc b/node_modules/nodetime/node_modules/v8tools/src/profiler.cc deleted file mode 100644 index f4c4a57..0000000 --- a/node_modules/nodetime/node_modules/v8tools/src/profiler.cc +++ /dev/null @@ -1,124 +0,0 @@ - - -#include -#include "profiler.h" - -using namespace v8; - - -static void WalkCpuProfile(int* next_uid, - const int parent_uid, - const CpuProfileNode* node, - Local callback) { - if(!node) return; - - int uid = (*next_uid)++; - - Handle argv[6]; - argv[0] = Integer::New(parent_uid); - argv[1] = Integer::New(uid); - argv[2] = Number::New(node->GetTotalSamplesCount()); - argv[3] = node->GetFunctionName(); - argv[4] = node->GetScriptResourceName(); - argv[5] = Integer::New(node->GetLineNumber()); - - callback->Call(Context::GetCurrent()->Global(), 6, argv); - - int32_t children_count = node->GetChildrenCount(); - for(int i = 0; i < children_count; i++) { - const CpuProfileNode* child_node = node->GetChild(i); - WalkCpuProfile(next_uid, uid, child_node, callback); - } -} - - -Handle StartV8Profiler(const Arguments& args) { - HandleScope scope; - - CpuProfiler::StartProfiling(String::New("v8tools-cpu-profile")); - - return scope.Close(Undefined()); -} - - -Handle StopV8Profiler(const Arguments& args) { - HandleScope scope; - - const CpuProfile* profile = CpuProfiler::StopProfiling(String::New("v8tools-cpu-profile")); - - if(args.Length() > 0 && args[0]->IsFunction()) { - Local callback = Local::Cast(args[0]); - int next_uid = 1; - WalkCpuProfile(&next_uid, 0, profile->GetTopDownRoot(), callback); - } - - const_cast(profile)->Delete(); - - return scope.Close(Undefined()); -} - - - -/* - -node type: - 0 - hidden - 1 - array - 2 - string - 3 - object - 4 - compiled code - 5 - function clojure - 6 - regexp - 7 - heap number - 8 - native object - -edge type: - 0 - context variable - 1 - array element - 2 - property - 3 - internal - 4 - internal (size calculation) - 5 - internal (size calculation) - -*/ - -static void IterateHeapSnapshot(const HeapSnapshot* snapshot, Local callback) { - int32_t nodes_count = snapshot->GetNodesCount(); - for(int i = 0; i < nodes_count; i++) { - const HeapGraphNode* node = snapshot->GetNode(i); - - int32_t children_count = node->GetChildrenCount(); - for(int j = 0; j < children_count; j++) { - const HeapGraphEdge* child_edge = node->GetChild(j); - const HeapGraphNode* child_node = child_edge->GetToNode(); - - Handle argv[7]; - argv[0] = Integer::New(node->GetId()); - argv[1] = Integer::New(child_node->GetId()); - argv[2] = child_node->GetName(); - argv[3] = Integer::New(child_node->GetType()); - argv[4] = Integer::New(child_node->GetSelfSize()); - argv[5] = child_edge->GetName(); - argv[6] = Integer::New(child_edge->GetType()); - - callback->Call(Context::GetCurrent()->Global(), 7, argv); - } - } -} - - -Handle TakeHeapSnapshot(const Arguments& args) { - HandleScope scope; - - const HeapSnapshot* snapshot = HeapProfiler::TakeSnapshot(String::New("v8tools-heap-snapshot")); - if(args.Length() > 0 && args[0]->IsFunction()) { - Local callback = Local::Cast(args[0]); - IterateHeapSnapshot(snapshot, callback); - } - - const_cast(snapshot)->Delete(); - - return scope.Close(Undefined()); -} - - diff --git a/node_modules/nodetime/node_modules/v8tools/src/profiler.h b/node_modules/nodetime/node_modules/v8tools/src/profiler.h deleted file mode 100644 index 5bf655c..0000000 --- a/node_modules/nodetime/node_modules/v8tools/src/profiler.h +++ /dev/null @@ -1,13 +0,0 @@ - -#ifndef PROFILER_H_ -#define PROFILER_H_ - -#include - -using namespace v8; - -Handle StartV8Profiler(const Arguments& args); -Handle StopV8Profiler(const Arguments& args); -Handle TakeHeapSnapshot(const Arguments& args); - -#endif diff --git a/node_modules/nodetime/node_modules/v8tools/src/v8tools.cc b/node_modules/nodetime/node_modules/v8tools/src/v8tools.cc deleted file mode 100644 index b0d6774..0000000 --- a/node_modules/nodetime/node_modules/v8tools/src/v8tools.cc +++ /dev/null @@ -1,21 +0,0 @@ - - -#include -#include -#include -#include "gc.h" -#include "profiler.h" - -using namespace v8; - - -void Init(Handle target) { - target->Set(String::NewSymbol("afterGC"), FunctionTemplate::New(AfterGC)->GetFunction()); - target->Set(String::NewSymbol("startV8Profiler"), FunctionTemplate::New(StartV8Profiler)->GetFunction()); - target->Set(String::NewSymbol("stopV8Profiler"), FunctionTemplate::New(StopV8Profiler)->GetFunction()); - target->Set(String::NewSymbol("takeHeapSnapshot"), FunctionTemplate::New(TakeHeapSnapshot)->GetFunction()); -} - - -NODE_MODULE(v8tools, Init); - diff --git a/node_modules/nodetime/node_modules/v8tools/v8tools.cc b/node_modules/nodetime/node_modules/v8tools/v8tools.cc deleted file mode 100644 index fba27f4..0000000 --- a/node_modules/nodetime/node_modules/v8tools/v8tools.cc +++ /dev/null @@ -1,246 +0,0 @@ - - -/* - * This file is depricated. Kept for old npm versions defaulting to node-waf - */ - -#include -#include -#include -#include -#include -#include -#include - -using namespace v8; - - -/* CPU profiler */ - -void Walk(int* next_uid, const int parent_uid, const CpuProfileNode* node, Local callback) { - if(!node) return; - - int uid = (*next_uid)++; - - Handle argv[6]; - argv[0] = Integer::New(parent_uid); - argv[1] = Integer::New(uid); - argv[2] = Number::New(node->GetTotalSamplesCount()); - argv[3] = node->GetFunctionName(); - argv[4] = node->GetScriptResourceName(); - argv[5] = Integer::New(node->GetLineNumber()); - - callback->Call(Context::GetCurrent()->Global(), 6, argv); - - int32_t childrenCount = node->GetChildrenCount(); - for(int i = 0; i < childrenCount; i++) { - const CpuProfileNode* childNode = node->GetChild(i); - Walk(next_uid, uid, childNode, callback); - } -} - - -Handle StartV8Profiler(const Arguments& args) { - HandleScope scope; - - CpuProfiler::StartProfiling(String::New("v8tools-cpu-profile")); - - return scope.Close(Undefined()); -} - - -Handle StopV8Profiler(const Arguments& args) { - HandleScope scope; - - const CpuProfile* profile = CpuProfiler::StopProfiling(String::New("v8tools-cpu-profile")); - - if(args.Length() > 0 && args[0]->IsFunction()) { - Local callback = Local::Cast(args[0]); - int nextUid = 1; - Walk(&nextUid, 0, profile->GetTopDownRoot(), callback); - } - - const_cast(profile)->Delete(); - - return scope.Close(Undefined()); -} - - - -/* Heap profiler */ - - -/* - -node type: - 0 - hidden - 1 - array - 2 - string - 3 - object - 4 - compiled code - 5 - function clojure - 6 - regexp - 7 - heap number - 8 - native object - -edge type: - 0 - context variable - 1 - array element - 2 - property - 3 - internal - 4 - internal (size calculation) - 5 - internal (size calculation) -*/ - - -static void IterateHeapSnapshot(const HeapSnapshot* snapshot, Local callback) { - int32_t nodes_count = snapshot->GetNodesCount(); - for(int i = 0; i < nodes_count; i++) { - const HeapGraphNode* node = snapshot->GetNode(i); - - int32_t children_count = node->GetChildrenCount(); - for(int j = 0; j < children_count; j++) { - const HeapGraphEdge* child_edge = node->GetChild(j); - const HeapGraphNode* child_node = child_edge->GetToNode(); - - Handle argv[7]; - argv[0] = Integer::New(node->GetId()); - argv[1] = Integer::New(child_node->GetId()); - argv[2] = child_node->GetName(); - argv[3] = Integer::New(child_node->GetType()); - argv[4] = Integer::New(child_node->GetSelfSize()); - argv[5] = child_edge->GetName(); - argv[6] = Integer::New(child_edge->GetType()); - - callback->Call(Context::GetCurrent()->Global(), 7, argv); - } - } -} - - - -Handle TakeHeapSnapshot(const Arguments& args) { - HandleScope scope; - - const HeapSnapshot* snapshot = HeapProfiler::TakeSnapshot(String::New("v8tools-heap-snapshot")); - if(args.Length() > 0 && args[0]->IsFunction()) { - Local callback = Local::Cast(args[0]); - IterateHeapSnapshot(snapshot, callback); - } - - const_cast(snapshot)->Delete(); - - return scope.Close(Undefined()); -} - - - -/* GC listener */ - - -Persistent callback; -Persistent callback_context; - - -struct Baton { - uv_work_t request; - GCType gc_type; - GCCallbackFlags gc_callback_flags; - size_t used_heap_size; -}; - - -static void Noop(uv_work_t* request) { -} - - -static void GCEpilogueAsync(uv_work_t* request) { - Baton *baton = static_cast(request->data); - - Handle argv[3]; - - switch(baton->gc_type) { - case kGCTypeAll: - argv[0] = String::New("kGCTypeAll"); - break; - case kGCTypeMarkSweepCompact: - argv[0] = String::New("kGCTypeMarkSweepCompact"); - break; - case kGCTypeScavenge: - argv[0] = String::New("kGCTypeScavenge"); - break; - default: - argv[0] = String::New("Other"); - } - - switch(baton->gc_callback_flags) { - case kGCCallbackFlagCompacted: - argv[1] = String::New("kGCCallbackFlagCompacted"); - break; - case kNoGCCallbackFlags: - argv[1] = String::New("kNoGCCallbackFlags"); - break; - default: - argv[1] = String::New("Other"); - } - - argv[2] = Integer::New(baton->used_heap_size); - - callback->Call(callback_context, 3, argv); - - delete baton; -} - - -static size_t GetUsedHeapSize() { - HeapStatistics stats; - V8::GetHeapStatistics(&stats); - - return stats.used_heap_size(); -} - - -static void GCEpilogue(GCType gc_type, GCCallbackFlags gc_callback_flags) { - Baton *baton = new Baton(); - baton->request.data = baton; - - baton->gc_type = gc_type; - baton->gc_callback_flags = gc_callback_flags; - - baton->used_heap_size = GetUsedHeapSize(); - - uv_queue_work(uv_default_loop(), &baton->request, Noop, GCEpilogueAsync); -} - - -Handle AfterGC(const Arguments& args) { - HandleScope scope; - - - if(args.Length() > 0 && args[0]->IsFunction()) { - Local callbackArg = Local::Cast(args[0]); - callback = Persistent::New(callbackArg); - callback_context = Persistent::New(Context::GetCalling()->Global()); - } - else { - return scope.Close(Undefined()); - } - - - V8::AddGCEpilogueCallback(GCEpilogue); - - return scope.Close(Undefined()); -} - - - -void Init(Handle target) { - target->Set(String::NewSymbol("afterGC"), FunctionTemplate::New(AfterGC)->GetFunction()); - target->Set(String::NewSymbol("startV8Profiler"), FunctionTemplate::New(StartV8Profiler)->GetFunction()); - target->Set(String::NewSymbol("stopV8Profiler"), FunctionTemplate::New(StopV8Profiler)->GetFunction()); - target->Set(String::NewSymbol("takeHeapSnapshot"), FunctionTemplate::New(TakeHeapSnapshot)->GetFunction()); -} - - -NODE_MODULE(v8tools, Init); - diff --git a/node_modules/nodetime/node_modules/v8tools/wscript b/node_modules/nodetime/node_modules/v8tools/wscript deleted file mode 100644 index 8648d79..0000000 --- a/node_modules/nodetime/node_modules/v8tools/wscript +++ /dev/null @@ -1,16 +0,0 @@ -srcdir = '.' -blddir = 'build' -VERSION = '0.1' - -def set_options(opt): - opt.tool_options('compiler_cxx') - -def configure(conf): - conf.check_tool('compiler_cxx') - conf.check_tool('node_addon') - -def build(bld): - obj = bld.new_task_gen('cxx', 'shlib', 'node_addon') - obj.target = 'v8tools' - obj.source = 'v8tools.cc'; - diff --git a/node_modules/nodetime/package.json b/node_modules/nodetime/package.json deleted file mode 100644 index 051143a..0000000 --- a/node_modules/nodetime/package.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "name": "nodetime", - "version": "0.8.4", - "description": "Performance Profiler and Monitor", - "author": { - "name": "Nodetime", - "email": "devops@nodetime.com" - }, - "homepage": "http://nodetime.com", - "keywords": [ - "profiler", - "profiling", - "tracing", - "cpu", - "heap", - "performance", - "instrumentation", - "response time", - "performance", - "bottlenecks", - "monitoring", - "analytics", - "metrics", - "alerts", - "dtrace" - ], - "contributors": [], - "main": "./index.js", - "directories": { - "lib": "./lib" - }, - "repository": { - "type": "git", - "url": "git://github.com/nodetime/nodetime.git" - }, - "dependencies": { - "request": "2.12.0", - "timekit": ">=0.1.9", - "v8tools": ">=0.2.0" - }, - "optionalDependencies": { - "timekit": ">=0.1.9", - "v8tools": ">=0.2.0" - }, - "devDependencies": { - "mocha": "*", - "memwatch": "*", - "async": "*", - "express": "*", - "socket.io": "*", - "redis": "*", - "mongodb": "*", - "mongoose": "*", - "mysql": "*", - "pg": "*", - "memcached": "*", - "memcache": "*", - "cassandra-client": "*", - "cassandra": "*" - }, - "engines": { - "node": ">=0.6.0" - }, - "licenses": [ - { - "url": "http://github.com/nodetime/nodetime/raw/master/LICENSE" - } - ], - "readme": "Nodetime - Performance Profiler and Monitor for Node.js Applications\n===========================================\nNodetime reveals response time and other internals of HTTP requests and underlying HTTP, database, file system and other API calls in your Node.js application. Coupled with related process and OS state information, real-time and historical metrics, monitoring as well as CPU and memory profiling it enables tracing performance problems down to the root cause. Nodetime supports multiple APIs including native HTTP client, file system, cluster and sockets, Socket.io, Redis, MongoDB, MySQL, PostgreSQL, Memcached and Cassandra. HTTP based data stores like CouchDB and Riak are supported via HTTP API.\n\nThis repository contains the source code of Nodetime agent. Agent runs within the application and securely sends profiling data and metrics to Nodetime server, where they are made available via web console at nodetime.com.\n\nFull documentation at [nodetime.com](http://nodetime.com) [Docs section](http://nodetime.com/docs).\n\nFor questions or technical issues please contact our [support team](http://support.nodetime.com).\n\n\n", - "_id": "nodetime@0.8.4", - "dist": { - "shasum": "dd766ec3c75a0a00ba143e8256bfa687082fab0c" - }, - "_from": "nodetime@0.8.4" -} diff --git a/node_modules/timekit/.npmignore b/node_modules/timekit/.npmignore deleted file mode 100644 index db470e2..0000000 --- a/node_modules/timekit/.npmignore +++ /dev/null @@ -1,7 +0,0 @@ -.git* -test/ -.DS_Store -node_modules/ -npm-debug.log -build -.lock-wscript diff --git a/node_modules/timekit/LICENSE b/node_modules/timekit/LICENSE deleted file mode 100644 index 3959a05..0000000 --- a/node_modules/timekit/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2012 Dmitri Melikyan - -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. diff --git a/node_modules/timekit/README.md b/node_modules/timekit/README.md deleted file mode 100644 index 132b6a3..0000000 --- a/node_modules/timekit/README.md +++ /dev/null @@ -1,32 +0,0 @@ -Timekit - Time Related C Bindings -=== - - -## Installation - - npm install timekit - - -## API - -`var timekit = require('timekit');` - -`timekit.time()` - uses gettimeofday and returns current time in microseconds. In case of error returns undefined. On Windows uses GetSystemTimeAsFileTime. - -`timekit.cputime()` - uses getrusage and returns cpu time spent on current process (user + system) in microseconds. In case of error returns undefined. On Windows uses GetProcessTimes. - - -## Platforms - -POSIX and Windows - - -## License - -Copyright (c) 2012 Dmitri Melikyan - -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. diff --git a/node_modules/timekit/binding.gyp b/node_modules/timekit/binding.gyp deleted file mode 100644 index 549e543..0000000 --- a/node_modules/timekit/binding.gyp +++ /dev/null @@ -1,19 +0,0 @@ -{ - 'targets': [ - { - 'target_name': 'timekit', - 'conditions': [ - ['OS == "win"', { - 'sources': [ - 'src/timekit_win.cc' - ] - }, { - 'sources': [ - 'src/timekit_posix.cc' - ] - } - ], - ] - } - ] -} diff --git a/node_modules/timekit/build/Makefile b/node_modules/timekit/build/Makefile deleted file mode 100644 index 6c44432..0000000 --- a/node_modules/timekit/build/Makefile +++ /dev/null @@ -1,359 +0,0 @@ -# We borrow heavily from the kernel build setup, though we are simpler since -# we don't have Kconfig tweaking settings on us. - -# The implicit make rules have it looking for RCS files, among other things. -# We instead explicitly write all the rules we care about. -# It's even quicker (saves ~200ms) to pass -r on the command line. -MAKEFLAGS=-r - -# The source directory tree. -srcdir := .. -abs_srcdir := $(abspath $(srcdir)) - -# The name of the builddir. -builddir_name ?= . - -# The V=1 flag on command line makes us verbosely print command lines. -ifdef V - quiet= -else - quiet=quiet_ -endif - -# Specify BUILDTYPE=Release on the command line for a release build. -BUILDTYPE ?= Release - -# Directory all our build output goes into. -# Note that this must be two directories beneath src/ for unit tests to pass, -# as they reach into the src/ directory for data with relative paths. -builddir ?= $(builddir_name)/$(BUILDTYPE) -abs_builddir := $(abspath $(builddir)) -depsdir := $(builddir)/.deps - -# Object output directory. -obj := $(builddir)/obj -abs_obj := $(abspath $(obj)) - -# We build up a list of every single one of the targets so we can slurp in the -# generated dependency rule Makefiles in one pass. -all_deps := - - - -# C++ apps need to be linked with g++. -# -# Note: flock is used to seralize linking. Linking is a memory-intensive -# process so running parallel links can often lead to thrashing. To disable -# the serialization, override LINK via an envrionment variable as follows: -# -# export LINK=g++ -# -# This will allow make to invoke N linker processes as specified in -jN. -LINK ?= ./gyp-mac-tool flock $(builddir)/linker.lock $(CXX) - -CC.target ?= $(CC) -CFLAGS.target ?= $(CFLAGS) -CXX.target ?= $(CXX) -CXXFLAGS.target ?= $(CXXFLAGS) -LINK.target ?= $(LINK) -LDFLAGS.target ?= $(LDFLAGS) -AR.target ?= $(AR) -ARFLAGS.target ?= crs - -# N.B.: the logic of which commands to run should match the computation done -# in gyp's make.py where ARFLAGS.host etc. is computed. -# TODO(evan): move all cross-compilation logic to gyp-time so we don't need -# to replicate this environment fallback in make as well. -CC.host ?= gcc -CFLAGS.host ?= -CXX.host ?= g++ -CXXFLAGS.host ?= -LINK.host ?= g++ -LDFLAGS.host ?= -AR.host ?= ar -ARFLAGS.host := crs - -# Define a dir function that can handle spaces. -# http://www.gnu.org/software/make/manual/make.html#Syntax-of-Functions -# "leading spaces cannot appear in the text of the first argument as written. -# These characters can be put into the argument value by variable substitution." -empty := -space := $(empty) $(empty) - -# http://stackoverflow.com/questions/1189781/using-make-dir-or-notdir-on-a-path-with-spaces -replace_spaces = $(subst $(space),?,$1) -unreplace_spaces = $(subst ?,$(space),$1) -dirx = $(call unreplace_spaces,$(dir $(call replace_spaces,$1))) - -# Flags to make gcc output dependency info. Note that you need to be -# careful here to use the flags that ccache and distcc can understand. -# We write to a dep file on the side first and then rename at the end -# so we can't end up with a broken dep file. -depfile = $(depsdir)/$(call replace_spaces,$@).d -DEPFLAGS = -MMD -MF $(depfile).raw - -# We have to fixup the deps output in a few ways. -# (1) the file output should mention the proper .o file. -# ccache or distcc lose the path to the target, so we convert a rule of -# the form: -# foobar.o: DEP1 DEP2 -# into -# path/to/foobar.o: DEP1 DEP2 -# (2) we want missing files not to cause us to fail to build. -# We want to rewrite -# foobar.o: DEP1 DEP2 \ -# DEP3 -# to -# DEP1: -# DEP2: -# DEP3: -# so if the files are missing, they're just considered phony rules. -# We have to do some pretty insane escaping to get those backslashes -# and dollar signs past make, the shell, and sed at the same time. -# Doesn't work with spaces, but that's fine: .d files have spaces in -# their names replaced with other characters. -define fixup_dep -# The depfile may not exist if the input file didn't have any #includes. -touch $(depfile).raw -# Fixup path as in (1). -sed -e "s|^$(notdir $@)|$@|" $(depfile).raw >> $(depfile) -# Add extra rules as in (2). -# We remove slashes and replace spaces with new lines; -# remove blank lines; -# delete the first line and append a colon to the remaining lines. -sed -e 's|\\||' -e 'y| |\n|' $(depfile).raw |\ - grep -v '^$$' |\ - sed -e 1d -e 's|$$|:|' \ - >> $(depfile) -rm $(depfile).raw -endef - -# Command definitions: -# - cmd_foo is the actual command to run; -# - quiet_cmd_foo is the brief-output summary of the command. - -quiet_cmd_cc = CC($(TOOLSET)) $@ -cmd_cc = $(CC.$(TOOLSET)) $(GYP_CFLAGS) $(DEPFLAGS) $(CFLAGS.$(TOOLSET)) -c -o $@ $< - -quiet_cmd_cxx = CXX($(TOOLSET)) $@ -cmd_cxx = $(CXX.$(TOOLSET)) $(GYP_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< - -quiet_cmd_objc = CXX($(TOOLSET)) $@ -cmd_objc = $(CC.$(TOOLSET)) $(GYP_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< - -quiet_cmd_objcxx = CXX($(TOOLSET)) $@ -cmd_objcxx = $(CXX.$(TOOLSET)) $(GYP_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< - -# Commands for precompiled header files. -quiet_cmd_pch_c = CXX($(TOOLSET)) $@ -cmd_pch_c = $(CC.$(TOOLSET)) $(GYP_PCH_CFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< -quiet_cmd_pch_cc = CXX($(TOOLSET)) $@ -cmd_pch_cc = $(CC.$(TOOLSET)) $(GYP_PCH_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< -quiet_cmd_pch_m = CXX($(TOOLSET)) $@ -cmd_pch_m = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< -quiet_cmd_pch_mm = CXX($(TOOLSET)) $@ -cmd_pch_mm = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< - -# gyp-mac-tool is written next to the root Makefile by gyp. -# Use $(4) for the command, since $(2) and $(3) are used as flag by do_cmd -# already. -quiet_cmd_mac_tool = MACTOOL $(4) $< -cmd_mac_tool = ./gyp-mac-tool $(4) $< "$@" - -quiet_cmd_mac_package_framework = PACKAGE FRAMEWORK $@ -cmd_mac_package_framework = ./gyp-mac-tool package-framework "$@" $(4) - -quiet_cmd_infoplist = INFOPLIST $@ -cmd_infoplist = $(CC.$(TOOLSET)) -E -P -Wno-trigraphs -x c $(INFOPLIST_DEFINES) "$<" -o "$@" - -quiet_cmd_touch = TOUCH $@ -cmd_touch = touch $@ - -quiet_cmd_copy = COPY $@ -# send stderr to /dev/null to ignore messages when linking directories. -cmd_copy = ln -f "$<" "$@" 2>/dev/null || (rm -rf "$@" && cp -af "$<" "$@") - -quiet_cmd_alink = LIBTOOL-STATIC $@ -cmd_alink = rm -f $@ && ./gyp-mac-tool filter-libtool libtool -static -o $@ $(filter %.o,$^) - -quiet_cmd_link = LINK($(TOOLSET)) $@ -cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) - -# TODO(thakis): Find out and document the difference between shared_library and -# loadable_module on mac. -quiet_cmd_solink = SOLINK($(TOOLSET)) $@ -cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) - -# TODO(thakis): The solink_module rule is likely wrong. Xcode seems to pass -# -bundle -single_module here (for osmesa.so). -quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@ -cmd_solink_module = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS) - - -# Define an escape_quotes function to escape single quotes. -# This allows us to handle quotes properly as long as we always use -# use single quotes and escape_quotes. -escape_quotes = $(subst ','\'',$(1)) -# This comment is here just to include a ' to unconfuse syntax highlighting. -# Define an escape_vars function to escape '$' variable syntax. -# This allows us to read/write command lines with shell variables (e.g. -# $LD_LIBRARY_PATH), without triggering make substitution. -escape_vars = $(subst $$,$$$$,$(1)) -# Helper that expands to a shell command to echo a string exactly as it is in -# make. This uses printf instead of echo because printf's behaviour with respect -# to escape sequences is more portable than echo's across different shells -# (e.g., dash, bash). -exact_echo = printf '%s\n' '$(call escape_quotes,$(1))' - -# Helper to compare the command we're about to run against the command -# we logged the last time we ran the command. Produces an empty -# string (false) when the commands match. -# Tricky point: Make has no string-equality test function. -# The kernel uses the following, but it seems like it would have false -# positives, where one string reordered its arguments. -# arg_check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \ -# $(filter-out $(cmd_$@), $(cmd_$(1)))) -# We instead substitute each for the empty string into the other, and -# say they're equal if both substitutions produce the empty string. -# .d files contain ? instead of spaces, take that into account. -command_changed = $(or $(subst $(cmd_$(1)),,$(cmd_$(call replace_spaces,$@))),\ - $(subst $(cmd_$(call replace_spaces,$@)),,$(cmd_$(1)))) - -# Helper that is non-empty when a prerequisite changes. -# Normally make does this implicitly, but we force rules to always run -# so we can check their command lines. -# $? -- new prerequisites -# $| -- order-only dependencies -prereq_changed = $(filter-out FORCE_DO_CMD,$(filter-out $|,$?)) - -# Helper that executes all postbuilds, and deletes the output file when done -# if any of the postbuilds failed. -define do_postbuilds - @E=0;\ - for p in $(POSTBUILDS); do\ - eval $$p;\ - F=$$?;\ - if [ $$F -ne 0 ]; then\ - E=$$F;\ - fi;\ - done;\ - if [ $$E -ne 0 ]; then\ - rm -rf "$@";\ - exit $$E;\ - fi -endef - -# do_cmd: run a command via the above cmd_foo names, if necessary. -# Should always run for a given target to handle command-line changes. -# Second argument, if non-zero, makes it do asm/C/C++ dependency munging. -# Third argument, if non-zero, makes it do POSTBUILDS processing. -# Note: We intentionally do NOT call dirx for depfile, since it contains ? for -# spaces already and dirx strips the ? characters. -define do_cmd -$(if $(or $(command_changed),$(prereq_changed)), - @$(call exact_echo, $($(quiet)cmd_$(1))) - @mkdir -p "$(call dirx,$@)" "$(dir $(depfile))" - $(if $(findstring flock,$(word 2,$(cmd_$1))), - @$(cmd_$(1)) - @echo " $(quiet_cmd_$(1)): Finished", - @$(cmd_$(1)) - ) - @$(call exact_echo,$(call escape_vars,cmd_$(call replace_spaces,$@) := $(cmd_$(1)))) > $(depfile) - @$(if $(2),$(fixup_dep)) - $(if $(and $(3), $(POSTBUILDS)), - $(call do_postbuilds) - ) -) -endef - -# Declare the "all" target first so it is the default, -# even though we don't have the deps yet. -.PHONY: all -all: - -# make looks for ways to re-generate included makefiles, but in our case, we -# don't have a direct way. Explicitly telling make that it has nothing to do -# for them makes it go faster. -%.d: ; - -# Use FORCE_DO_CMD to force a target to run. Should be coupled with -# do_cmd. -.PHONY: FORCE_DO_CMD -FORCE_DO_CMD: - -TOOLSET := target -# Suffix rules, putting all outputs into $(obj). -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.c FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cpp FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cxx FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.m FORCE_DO_CMD - @$(call do_cmd,objc,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.mm FORCE_DO_CMD - @$(call do_cmd,objcxx,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.S FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.s FORCE_DO_CMD - @$(call do_cmd,cc,1) - -# Try building from generated source, too. -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.c FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cpp FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cxx FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.m FORCE_DO_CMD - @$(call do_cmd,objc,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.mm FORCE_DO_CMD - @$(call do_cmd,objcxx,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.S FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.s FORCE_DO_CMD - @$(call do_cmd,cc,1) - -$(obj).$(TOOLSET)/%.o: $(obj)/%.c FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.cpp FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.cxx FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.m FORCE_DO_CMD - @$(call do_cmd,objc,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.mm FORCE_DO_CMD - @$(call do_cmd,objcxx,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.S FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.s FORCE_DO_CMD - @$(call do_cmd,cc,1) - - -ifeq ($(strip $(foreach prefix,$(NO_LOAD),\ - $(findstring $(join ^,$(prefix)),\ - $(join ^,timekit.target.mk)))),) - include timekit.target.mk -endif - -quiet_cmd_regen_makefile = ACTION Regenerating $@ -cmd_regen_makefile = /Users/jfolsom/.node-gyp/0.8.8/tools/gyp/gyp -fmake --ignore-environment "--toplevel-dir=." -I/Users/jfolsom/repos/ana/node_modules/timekit/build/config.gypi -I/usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi -I/Users/jfolsom/.node-gyp/0.8.8/common.gypi "--depth=." "-Goutput_dir=." "--generator-output=build" "-Dlibrary=shared_library" "-Dvisibility=default" "-Dnode_root_dir=/Users/jfolsom/.node-gyp/0.8.8" "-Dmodule_root_dir=/Users/jfolsom/repos/ana/node_modules/timekit" binding.gyp -Makefile: $(srcdir)/../../../../.node-gyp/0.8.8/common.gypi $(srcdir)/build/config.gypi $(srcdir)/binding.gyp $(srcdir)/../../../../../../usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi - $(call do_cmd,regen_makefile) - -# "all" is a concatenation of the "all" targets from all the included -# sub-makefiles. This is just here to clarify. -all: - -# Add in dependency-tracking rules. $(all_deps) is the list of every single -# target in our tree. Only consider the ones with .d (dependency) info: -d_files := $(wildcard $(foreach f,$(all_deps),$(depsdir)/$(f).d)) -ifneq ($(d_files),) - include $(d_files) -endif diff --git a/node_modules/timekit/build/Release/.deps/Release/obj.target/timekit/src/timekit_posix.o.d b/node_modules/timekit/build/Release/.deps/Release/obj.target/timekit/src/timekit_posix.o.d deleted file mode 100644 index ae11f87..0000000 --- a/node_modules/timekit/build/Release/.deps/Release/obj.target/timekit/src/timekit_posix.o.d +++ /dev/null @@ -1,29 +0,0 @@ -cmd_Release/obj.target/timekit/src/timekit_posix.o := c++ '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-D_DARWIN_USE_64_BIT_INODE=1' -I/Users/jfolsom/.node-gyp/0.8.8/src -I/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include -I/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include -Os -gdwarf-2 -mmacosx-version-min=10.5 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-rtti -fno-exceptions -fno-threadsafe-statics -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/timekit/src/timekit_posix.o.d.raw -c -o Release/obj.target/timekit/src/timekit_posix.o ../src/timekit_posix.cc -Release/obj.target/timekit/src/timekit_posix.o: ../src/timekit_posix.cc \ - /Users/jfolsom/.node-gyp/0.8.8/src/node.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares_version.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/uv-unix.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ngx-queue.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ev.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/eio.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/node_object_wrap.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/ev-emul.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/eio-emul.h -../src/timekit_posix.cc: -/Users/jfolsom/.node-gyp/0.8.8/src/node.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares_version.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/uv-unix.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ngx-queue.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ev.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/eio.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h: -/Users/jfolsom/.node-gyp/0.8.8/src/node_object_wrap.h: -/Users/jfolsom/.node-gyp/0.8.8/src/ev-emul.h: -/Users/jfolsom/.node-gyp/0.8.8/src/eio-emul.h: diff --git a/node_modules/timekit/build/Release/.deps/Release/timekit.node.d b/node_modules/timekit/build/Release/.deps/Release/timekit.node.d deleted file mode 100644 index b2b931e..0000000 --- a/node_modules/timekit/build/Release/.deps/Release/timekit.node.d +++ /dev/null @@ -1 +0,0 @@ -cmd_Release/timekit.node := ./gyp-mac-tool flock ./Release/linker.lock c++ -shared -Wl,-search_paths_first -mmacosx-version-min=10.5 -arch x86_64 -L./Release -install_name /usr/local/lib/timekit.node -o Release/timekit.node Release/obj.target/timekit/src/timekit_posix.o -undefined dynamic_lookup diff --git a/node_modules/timekit/build/Release/linker.lock b/node_modules/timekit/build/Release/linker.lock deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/timekit/build/Release/obj.target/timekit/src/timekit_posix.o b/node_modules/timekit/build/Release/obj.target/timekit/src/timekit_posix.o deleted file mode 100644 index 2fd3d985d0952b6f4a87329ac95618a2ef62493b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46668 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 IpxUzj52K^{od5s; diff --git a/node_modules/timekit/build/Release/timekit.node b/node_modules/timekit/build/Release/timekit.node index df06077bd059ec486bcc8886ef32f86d4a83a17f..2ad19617e9725943224183f1026d6b742e995923 100755 GIT binary patch delta 16 Ycmez2^TTJu0tM!sy78MAD_ms-07pUxkpKVy delta 16 Ycmez2^TTJu0tIG;YdV`3D_ms-07d5qZU6uP diff --git a/node_modules/timekit/build/binding.Makefile b/node_modules/timekit/build/binding.Makefile deleted file mode 100644 index a979783..0000000 --- a/node_modules/timekit/build/binding.Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# This file is generated by gyp; do not edit. - -export builddir_name ?= build/./. -.PHONY: all -all: - $(MAKE) timekit diff --git a/node_modules/timekit/build/config.gypi b/node_modules/timekit/build/config.gypi index cc73905..a0a5c0c 100644 --- a/node_modules/timekit/build/config.gypi +++ b/node_modules/timekit/build/config.gypi @@ -60,7 +60,7 @@ "userconfig": "/Users/jfolsom/.npmrc", "npaturl": "http://npat.npmjs.org/", "node_version": "v0.8.8", - "user": "", + "user": "501", "editor": "vi", "save": "", "tag": "latest", @@ -96,8 +96,8 @@ "git": "git", "init_author_name": "", "onload_script": "", - "tmp": "/var/folders/fq/xzvjbs0n3ks26691bqfx1fjc0000gn/T/", - "unsafe_perm": "true", + "tmp": "/Users/jfolsom/tmp", + "unsafe_perm": "", "link": "", "prefix": "/usr/local" } diff --git a/node_modules/timekit/build/gyp-mac-tool b/node_modules/timekit/build/gyp-mac-tool deleted file mode 100755 index 22f8331..0000000 --- a/node_modules/timekit/build/gyp-mac-tool +++ /dev/null @@ -1,210 +0,0 @@ -#!/usr/bin/env python -# Generated by gyp. Do not edit. -# Copyright (c) 2012 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Utility functions to perform Xcode-style build steps. - -These functions are executed via gyp-mac-tool when using the Makefile generator. -""" - -import fcntl -import os -import plistlib -import re -import shutil -import string -import subprocess -import sys - - -def main(args): - executor = MacTool() - exit_code = executor.Dispatch(args) - if exit_code is not None: - sys.exit(exit_code) - - -class MacTool(object): - """This class performs all the Mac tooling steps. The methods can either be - executed directly, or dispatched from an argument list.""" - - def Dispatch(self, args): - """Dispatches a string command to a method.""" - if len(args) < 1: - raise Exception("Not enough arguments") - - method = "Exec%s" % self._CommandifyName(args[0]) - return getattr(self, method)(*args[1:]) - - def _CommandifyName(self, name_string): - """Transforms a tool name like copy-info-plist to CopyInfoPlist""" - return name_string.title().replace('-', '') - - def ExecCopyBundleResource(self, source, dest): - """Copies a resource file to the bundle/Resources directory, performing any - necessary compilation on each resource.""" - extension = os.path.splitext(source)[1].lower() - if os.path.isdir(source): - # Copy tree. - if os.path.exists(dest): - shutil.rmtree(dest) - shutil.copytree(source, dest) - elif extension == '.xib': - return self._CopyXIBFile(source, dest) - elif extension == '.strings': - self._CopyStringsFile(source, dest) - else: - shutil.copyfile(source, dest) - - def _CopyXIBFile(self, source, dest): - """Compiles a XIB file with ibtool into a binary plist in the bundle.""" - tools_dir = os.environ.get('DEVELOPER_BIN_DIR', '/usr/bin') - args = [os.path.join(tools_dir, 'ibtool'), '--errors', '--warnings', - '--notices', '--output-format', 'human-readable-text', '--compile', - dest, source] - ibtool_section_re = re.compile(r'/\*.*\*/') - ibtool_re = re.compile(r'.*note:.*is clipping its content') - ibtoolout = subprocess.Popen(args, stdout=subprocess.PIPE) - current_section_header = None - for line in ibtoolout.stdout: - if ibtool_section_re.match(line): - current_section_header = line - elif not ibtool_re.match(line): - if current_section_header: - sys.stdout.write(current_section_header) - current_section_header = None - sys.stdout.write(line) - return ibtoolout.returncode - - def _CopyStringsFile(self, source, dest): - """Copies a .strings file using iconv to reconvert the input into UTF-16.""" - input_code = self._DetectInputEncoding(source) or "UTF-8" - fp = open(dest, 'w') - args = ['/usr/bin/iconv', '--from-code', input_code, '--to-code', - 'UTF-16', source] - subprocess.call(args, stdout=fp) - fp.close() - - def _DetectInputEncoding(self, file_name): - """Reads the first few bytes from file_name and tries to guess the text - encoding. Returns None as a guess if it can't detect it.""" - fp = open(file_name, 'rb') - try: - header = fp.read(3) - except e: - fp.close() - return None - fp.close() - if header.startswith("\xFE\xFF"): - return "UTF-16BE" - elif header.startswith("\xFF\xFE"): - return "UTF-16LE" - elif header.startswith("\xEF\xBB\xBF"): - return "UTF-8" - else: - return None - - def ExecCopyInfoPlist(self, source, dest): - """Copies the |source| Info.plist to the destination directory |dest|.""" - # Read the source Info.plist into memory. - fd = open(source, 'r') - lines = fd.read() - fd.close() - - # Go through all the environment variables and replace them as variables in - # the file. - for key in os.environ: - if key.startswith('_'): - continue - evar = '${%s}' % key - lines = string.replace(lines, evar, os.environ[key]) - - # Write out the file with variables replaced. - fd = open(dest, 'w') - fd.write(lines) - fd.close() - - # Now write out PkgInfo file now that the Info.plist file has been - # "compiled". - self._WritePkgInfo(dest) - - def _WritePkgInfo(self, info_plist): - """This writes the PkgInfo file from the data stored in Info.plist.""" - plist = plistlib.readPlist(info_plist) - if not plist: - return - - # Only create PkgInfo for executable types. - package_type = plist['CFBundlePackageType'] - if package_type != 'APPL': - return - - # The format of PkgInfo is eight characters, representing the bundle type - # and bundle signature, each four characters. If that is missing, four - # '?' characters are used instead. - signature_code = plist.get('CFBundleSignature', '????') - if len(signature_code) != 4: # Wrong length resets everything, too. - signature_code = '?' * 4 - - dest = os.path.join(os.path.dirname(info_plist), 'PkgInfo') - fp = open(dest, 'w') - fp.write('%s%s' % (package_type, signature_code)) - fp.close() - - def ExecFlock(self, lockfile, *cmd_list): - """Emulates the most basic behavior of Linux's flock(1).""" - # Rely on exception handling to report errors. - fd = os.open(lockfile, os.O_RDONLY|os.O_NOCTTY|os.O_CREAT, 0o666) - fcntl.flock(fd, fcntl.LOCK_EX) - return subprocess.call(cmd_list) - - def ExecFilterLibtool(self, *cmd_list): - """Calls libtool and filters out 'libtool: file: foo.o has no symbols'.""" - libtool_re = re.compile(r'^libtool: file: .* has no symbols$') - libtoolout = subprocess.Popen(cmd_list, stderr=subprocess.PIPE) - for line in libtoolout.stderr: - if not libtool_re.match(line): - sys.stderr.write(line) - return libtoolout.returncode - - def ExecPackageFramework(self, framework, version): - """Takes a path to Something.framework and the Current version of that and - sets up all the symlinks.""" - # Find the name of the binary based on the part before the ".framework". - binary = os.path.basename(framework).split('.')[0] - - CURRENT = 'Current' - RESOURCES = 'Resources' - VERSIONS = 'Versions' - - if not os.path.exists(os.path.join(framework, VERSIONS, version, binary)): - # Binary-less frameworks don't seem to contain symlinks (see e.g. - # chromium's out/Debug/org.chromium.Chromium.manifest/ bundle). - return - - # Move into the framework directory to set the symlinks correctly. - pwd = os.getcwd() - os.chdir(framework) - - # Set up the Current version. - self._Relink(version, os.path.join(VERSIONS, CURRENT)) - - # Set up the root symlinks. - self._Relink(os.path.join(VERSIONS, CURRENT, binary), binary) - self._Relink(os.path.join(VERSIONS, CURRENT, RESOURCES), RESOURCES) - - # Back to where we were before! - os.chdir(pwd) - - def _Relink(self, dest, link): - """Creates a symlink to |dest| named |link|. If |link| already exists, - it is overwritten.""" - if os.path.lexists(link): - os.remove(link) - os.symlink(dest, link) - - -if __name__ == '__main__': - sys.exit(main(sys.argv[1:])) diff --git a/node_modules/timekit/build/timekit.target.mk b/node_modules/timekit/build/timekit.target.mk deleted file mode 100644 index 256b96d..0000000 --- a/node_modules/timekit/build/timekit.target.mk +++ /dev/null @@ -1,133 +0,0 @@ -# This file is generated by gyp; do not edit. - -TOOLSET := target -TARGET := timekit -DEFS_Debug := '-D_LARGEFILE_SOURCE' \ - '-D_FILE_OFFSET_BITS=64' \ - '-D_DARWIN_USE_64_BIT_INODE=1' \ - '-DDEBUG' \ - '-D_DEBUG' - -# Flags passed to all source files. -CFLAGS_Debug := -Os \ - -gdwarf-2 \ - -mmacosx-version-min=10.5 \ - -arch x86_64 \ - -Wall \ - -Wendif-labels \ - -W \ - -Wno-unused-parameter - -# Flags passed to only C files. -CFLAGS_C_Debug := -fno-strict-aliasing - -# Flags passed to only C++ files. -CFLAGS_CC_Debug := -fno-rtti \ - -fno-exceptions \ - -fno-threadsafe-statics \ - -fno-strict-aliasing - -# Flags passed to only ObjC files. -CFLAGS_OBJC_Debug := - -# Flags passed to only ObjC++ files. -CFLAGS_OBJCC_Debug := - -INCS_Debug := -I/Users/jfolsom/.node-gyp/0.8.8/src \ - -I/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include \ - -I/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include - -DEFS_Release := '-D_LARGEFILE_SOURCE' \ - '-D_FILE_OFFSET_BITS=64' \ - '-D_DARWIN_USE_64_BIT_INODE=1' - -# Flags passed to all source files. -CFLAGS_Release := -Os \ - -gdwarf-2 \ - -mmacosx-version-min=10.5 \ - -arch x86_64 \ - -Wall \ - -Wendif-labels \ - -W \ - -Wno-unused-parameter - -# Flags passed to only C files. -CFLAGS_C_Release := -fno-strict-aliasing - -# Flags passed to only C++ files. -CFLAGS_CC_Release := -fno-rtti \ - -fno-exceptions \ - -fno-threadsafe-statics \ - -fno-strict-aliasing - -# Flags passed to only ObjC files. -CFLAGS_OBJC_Release := - -# Flags passed to only ObjC++ files. -CFLAGS_OBJCC_Release := - -INCS_Release := -I/Users/jfolsom/.node-gyp/0.8.8/src \ - -I/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include \ - -I/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include - -OBJS := $(obj).target/$(TARGET)/src/timekit_posix.o - -# Add to the list of files we specially track dependencies for. -all_deps += $(OBJS) - -# CFLAGS et al overrides must be target-local. -# See "Target-specific Variable Values" in the GNU Make manual. -$(OBJS): TOOLSET := $(TOOLSET) -$(OBJS): GYP_CFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) -$(OBJS): GYP_CXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) -$(OBJS): GYP_OBJCFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) $(CFLAGS_OBJC_$(BUILDTYPE)) -$(OBJS): GYP_OBJCXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) $(CFLAGS_OBJCC_$(BUILDTYPE)) - -# Suffix rules, putting all outputs into $(obj). - -$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) - -# Try building from generated source, too. - -$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) - -$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) - -# End of this set of suffix rules -### Rules for final target. -LDFLAGS_Debug := -Wl,-search_paths_first \ - -mmacosx-version-min=10.5 \ - -arch x86_64 \ - -L$(builddir) \ - -install_name /usr/local/lib/timekit.node - -LDFLAGS_Release := -Wl,-search_paths_first \ - -mmacosx-version-min=10.5 \ - -arch x86_64 \ - -L$(builddir) \ - -install_name /usr/local/lib/timekit.node - -LIBS := -undefined dynamic_lookup - -$(builddir)/timekit.node: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE)) -$(builddir)/timekit.node: LIBS := $(LIBS) -$(builddir)/timekit.node: TOOLSET := $(TOOLSET) -$(builddir)/timekit.node: $(OBJS) FORCE_DO_CMD - $(call do_cmd,solink_module) - -all_deps += $(builddir)/timekit.node -# Add target alias -.PHONY: timekit -timekit: $(builddir)/timekit.node - -# Short alias for building this executable. -.PHONY: timekit.node -timekit.node: $(builddir)/timekit.node - -# Add executable to "all" target. -.PHONY: all -all: $(builddir)/timekit.node - diff --git a/node_modules/timekit/index.js b/node_modules/timekit/index.js deleted file mode 100644 index 564918b..0000000 --- a/node_modules/timekit/index.js +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2012 Dmitri Melikyan - * - * 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. - */ - -module.exports = require('bindings')('timekit.node') diff --git a/node_modules/timekit/node_modules/bindings/README.md b/node_modules/timekit/node_modules/bindings/README.md deleted file mode 100644 index 585cf51..0000000 --- a/node_modules/timekit/node_modules/bindings/README.md +++ /dev/null @@ -1,97 +0,0 @@ -node-bindings -============= -### Helper module for loading your native module's .node file - -This is a helper module for authors of Node.js native addon modules. -It is basically the "swiss army knife" of `require()`ing your native module's -`.node` file. - -Throughout the course of Node's native addon history, addons have ended up being -compiled in a variety of different places, depending on which build tool and which -version of node was used. To make matters worse, now the _gyp_ build tool can -produce either a _Release_ or _Debug_ build, each being built into different -locations. - -This module checks _all_ the possible locations that a native addon would be built -at, and returns the first one that loads successfully. - - -Installation ------------- - -Install with `npm`: - -``` bash -$ npm install bindings -``` - -Or add it to the `"dependencies"` section of your _package.json_ file. - - -Example -------- - -`require()`ing the proper bindings file for the current node version, platform -and architecture is as simple as: - -``` js -var bindings = require('bindings')('binding.node') - -// Use your bindings defined in your C files -bindings.your_c_function() -``` - - -Nice Error Output ------------------ - -When the `.node` file could not be loaded, `node-bindings` throws an Error with -a nice error message telling you exactly what was tried. You can also check the -`err.tries` Array property. - -``` -Error: Could not load the bindings file. Tried: - → /Users/nrajlich/ref/build/binding.node - → /Users/nrajlich/ref/build/Debug/binding.node - → /Users/nrajlich/ref/build/Release/binding.node - → /Users/nrajlich/ref/out/Debug/binding.node - → /Users/nrajlich/ref/Debug/binding.node - → /Users/nrajlich/ref/out/Release/binding.node - → /Users/nrajlich/ref/Release/binding.node - → /Users/nrajlich/ref/build/default/binding.node - → /Users/nrajlich/ref/compiled/0.8.2/darwin/x64/binding.node - at bindings (/Users/nrajlich/ref/node_modules/bindings/bindings.js:84:13) - at Object. (/Users/nrajlich/ref/lib/ref.js:5:47) - at Module._compile (module.js:449:26) - at Object.Module._extensions..js (module.js:467:10) - at Module.load (module.js:356:32) - at Function.Module._load (module.js:312:12) - ... -``` - - -License -------- - -(The MIT License) - -Copyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net> - -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. diff --git a/node_modules/timekit/node_modules/bindings/bindings.js b/node_modules/timekit/node_modules/bindings/bindings.js index c47a51b..2f04804 100644 --- a/node_modules/timekit/node_modules/bindings/bindings.js +++ b/node_modules/timekit/node_modules/bindings/bindings.js @@ -64,6 +64,8 @@ function bindings (opts) { , i = 0 , l = opts.try.length , n + , b + , err for (; i (/Users/nrajlich/ref/lib/ref.js:5:47)\n at Module._compile (module.js:449:26)\n at Object.Module._extensions..js (module.js:467:10)\n at Module.load (module.js:356:32)\n at Function.Module._load (module.js:312:12)\n ...\n```\n\n\nLicense\n-------\n\n(The MIT License)\n\nCopyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", - "_id": "bindings@1.0.0", + "_id": "bindings@1.1.0", "_from": "bindings@*" } diff --git a/node_modules/timekit/package.json b/node_modules/timekit/package.json index 5d57d56..8724bf9 100644 --- a/node_modules/timekit/package.json +++ b/node_modules/timekit/package.json @@ -39,8 +39,5 @@ "gypfile": true, "readme": "Timekit - Time Related C Bindings\n===\n\n\n## Installation\n\n npm install timekit\n\n\n## API\n\n`var timekit = require('timekit');`\n\n`timekit.time()` - uses gettimeofday and returns current time in microseconds. In case of error returns undefined. On Windows uses GetSystemTimeAsFileTime.\n\n`timekit.cputime()` - uses getrusage and returns cpu time spent on current process (user + system) in microseconds. In case of error returns undefined. On Windows uses GetProcessTimes.\n\n\n## Platforms\n\nPOSIX and Windows\n\n\n## License\n\nCopyright (c) 2012 Dmitri Melikyan\n\nPermission 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:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE 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.\n", "_id": "timekit@0.1.9", - "dist": { - "shasum": "b52796e1e369c9e5c5787c389e53b6288053c30b" - }, "_from": "timekit@0.1.9" } diff --git a/node_modules/timekit/src/timekit_posix.cc b/node_modules/timekit/src/timekit_posix.cc deleted file mode 100644 index b203bf8..0000000 --- a/node_modules/timekit/src/timekit_posix.cc +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2012 Dmitri Melikyan - * - * 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. - */ - - -#include -#include -#include -#include -#include - -using namespace v8; - - -Handle Time(const Arguments& args) { - HandleScope scope; - - timeval tv; - - int ret = gettimeofday(&tv, 0); - if (ret < 0) { - return scope.Close(Undefined()); - } - - return scope.Close(Number::New((double)tv.tv_sec * 1e6 + (double)tv.tv_usec)); -} - - -Handle Cputime(const Arguments& args) { - HandleScope scope; - - struct rusage ru; - - int ret = getrusage(RUSAGE_SELF, &ru); - if (ret < 0) { - return scope.Close(Undefined()); - } - - return scope.Close(Number::New((double)ru.ru_utime.tv_sec * 1e6 + (double)ru.ru_utime.tv_usec + (double)ru.ru_stime.tv_sec * 1e6 + (double)ru.ru_stime.tv_usec)); -} - - -void Init(Handle target) { - target->Set(String::NewSymbol("time"), FunctionTemplate::New(Time)->GetFunction()); - target->Set(String::NewSymbol("cputime"), FunctionTemplate::New(Cputime)->GetFunction()); -} - - -NODE_MODULE(timekit, Init); - diff --git a/node_modules/timekit/src/timekit_win.cc b/node_modules/timekit/src/timekit_win.cc deleted file mode 100644 index 12cbd87..0000000 --- a/node_modules/timekit/src/timekit_win.cc +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2012 Dmitri Melikyan - * - * 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. - */ - - -#include -#include -#include - -using namespace v8; - - -static double filetimeToMicroseconds(FILETIME* ft) { - ULARGE_INTEGER uli; - uli.LowPart = ft->dwLowDateTime; - uli.HighPart = ft->dwHighDateTime; - - return (double)(uli.QuadPart/10); -} - - -Handle Time(const Arguments& args) { - HandleScope scope; - - FILETIME stime; - GetSystemTimeAsFileTime(&stime); - - return scope.Close(Number::New(filetimeToMicroseconds(&stime))); -} - - -Handle Cputime(const Arguments& args) { - HandleScope scope; - - HANDLE proc = GetCurrentProcess(); - - FILETIME ctime; - FILETIME etime; - FILETIME ktime; - FILETIME utime; - int ret = GetProcessTimes(proc, &ctime, &etime, &ktime, &utime); - if(!ret) { - return scope.Close(Undefined()); - } - - return scope.Close(Number::New(filetimeToMicroseconds(&ktime) + filetimeToMicroseconds(&utime))); -} - - -void Init(Handle target) { - target->Set(String::NewSymbol("time"), FunctionTemplate::New(Time)->GetFunction()); - target->Set(String::NewSymbol("cputime"), FunctionTemplate::New(Cputime)->GetFunction()); -} - - -NODE_MODULE(timekit, Init); - diff --git a/node_modules/timekit/timekit.cc b/node_modules/timekit/timekit.cc deleted file mode 100644 index d4a7795..0000000 --- a/node_modules/timekit/timekit.cc +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2012 Dmitri Melikyan - * - * 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. - */ - - -/* - * This file is depricated. Kept for old npm versions defaulting to node-waf - */ - -#include -#include -#include -#include -#include -#include - -using namespace v8; - - -Handle Time(const Arguments& args) { - HandleScope scope; - - timeval tv; - - int ret = gettimeofday(&tv, 0); - if (ret < 0) { - return scope.Close(Undefined()); - } - - return scope.Close(Number::New((double)tv.tv_sec * 1e6 + (double)tv.tv_usec)); -} - - -Handle Cputime(const Arguments& args) { - HandleScope scope; - - struct rusage ru; - - int ret = getrusage(RUSAGE_SELF, &ru); - if (ret < 0) { - return scope.Close(Undefined()); - } - - return scope.Close(Number::New((double)ru.ru_utime.tv_sec * 1e6 + (double)ru.ru_utime.tv_usec + (double)ru.ru_stime.tv_sec * 1e6 + (double)ru.ru_stime.tv_usec)); -} - - -void Init(Handle target) { - target->Set(String::NewSymbol("time"), FunctionTemplate::New(Time)->GetFunction()); - target->Set(String::NewSymbol("cputime"), FunctionTemplate::New(Cputime)->GetFunction()); -} - - -NODE_MODULE(timekit, Init); - diff --git a/node_modules/timekit/wscript b/node_modules/timekit/wscript deleted file mode 100644 index de017af..0000000 --- a/node_modules/timekit/wscript +++ /dev/null @@ -1,16 +0,0 @@ -srcdir = '.' -blddir = 'build' -VERSION = '0.1' - -def set_options(opt): - opt.tool_options('compiler_cxx') - -def configure(conf): - conf.check_tool('compiler_cxx') - conf.check_tool('node_addon') - -def build(bld): - obj = bld.new_task_gen('cxx', 'shlib', 'node_addon') - obj.target = 'timekit' - obj.source = 'timekit.cc'; - diff --git a/node_modules/v8tools/README.md b/node_modules/v8tools/README.md index 31d8d6d..d38ac80 100644 --- a/node_modules/v8tools/README.md +++ b/node_modules/v8tools/README.md @@ -11,7 +11,7 @@ V8tools - V8 CPU Profiler Binding `var v8tools = require('v8tools');` -`v8tools.afterGC(v8tools.afterGC(function(gcType, gcFlags, usedHeapSize) {})` - calls the callback after garbage collection cycle. +`v8tools.afterGC(function(gcType, gcFlags, usedHeapSize) {})` - calls the callback after garbage collection cycle. `v8tools.startV8Profiler()` - starts V8 CPU profiler diff --git a/node_modules/v8tools/build/Release/v8tools.node b/node_modules/v8tools/build/Release/v8tools.node index 20394106c1ff5af2c0827659d78edf1dc212ab96..f73631770b2e9b7875d0e5e6fc500bae75843313 100755 GIT binary patch delta 35 ncmX@p%Xp@jal;KmW_F|a$+r!ALG^Z%Lr!NHvT9C01VX*jQ{`u diff --git a/node_modules/v8tools/build/config.gypi b/node_modules/v8tools/build/config.gypi index cc73905..a0a5c0c 100644 --- a/node_modules/v8tools/build/config.gypi +++ b/node_modules/v8tools/build/config.gypi @@ -60,7 +60,7 @@ "userconfig": "/Users/jfolsom/.npmrc", "npaturl": "http://npat.npmjs.org/", "node_version": "v0.8.8", - "user": "", + "user": "501", "editor": "vi", "save": "", "tag": "latest", @@ -96,8 +96,8 @@ "git": "git", "init_author_name": "", "onload_script": "", - "tmp": "/var/folders/fq/xzvjbs0n3ks26691bqfx1fjc0000gn/T/", - "unsafe_perm": "true", + "tmp": "/Users/jfolsom/tmp", + "unsafe_perm": "", "link": "", "prefix": "/usr/local" } diff --git a/node_modules/v8tools/node_modules/bindings/bindings.js b/node_modules/v8tools/node_modules/bindings/bindings.js index c47a51b..2f04804 100644 --- a/node_modules/v8tools/node_modules/bindings/bindings.js +++ b/node_modules/v8tools/node_modules/bindings/bindings.js @@ -64,6 +64,8 @@ function bindings (opts) { , i = 0 , l = opts.try.length , n + , b + , err for (; i (/Users/nrajlich/ref/lib/ref.js:5:47)\n at Module._compile (module.js:449:26)\n at Object.Module._extensions..js (module.js:467:10)\n at Module.load (module.js:356:32)\n at Function.Module._load (module.js:312:12)\n ...\n```\n\n\nLicense\n-------\n\n(The MIT License)\n\nCopyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", - "_id": "bindings@1.0.0", + "_id": "bindings@1.1.0", "_from": "bindings@*" } diff --git a/node_modules/v8tools/package.json b/node_modules/v8tools/package.json index 6216d43..406d3ab 100644 --- a/node_modules/v8tools/package.json +++ b/node_modules/v8tools/package.json @@ -1,6 +1,6 @@ { "name": "v8tools", - "version": "0.2.1", + "version": "0.2.2", "description": "V8 profiler and GC bindings", "author": { "name": "Nodetime", @@ -38,10 +38,7 @@ "install": "node-gyp rebuild" }, "gypfile": true, - "readme": "V8tools - V8 CPU Profiler Binding\n===\n\n\n## Installation\n\n npm install v8tools\n\n\n## API\n\n`var v8tools = require('v8tools');`\n\n`v8tools.afterGC(v8tools.afterGC(function(gcType, gcFlags, usedHeapSize) {})` - calls the callback after garbage collection cycle.\n\n`v8tools.startV8Profiler()` - starts V8 CPU profiler\n\n`v8tools.stopV8Profiler(function(parentNodeUid, nodeUid, totalSamplesCount, functionName, scriptResourceName, lineNumber) {})` - stops V8 CPU profiler. Callback function is called on every node while walking profile's top down call tree.\n\n`heapprof.takeHeapSnapshot(function(parentNodeUid, nodeUid, name, type, selfSize, retainerName, retainerType) {})` - takes heap snapshot. Callback function is called on every node of heap node graph.\n\n\n\n## Platforms\n\nPOSIX and Windows\n\n\n## License\n\nCopyright (c) 2012 Dmitri Melikyan\n\nPermission 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:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE 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.\n", - "_id": "v8tools@0.2.1", - "dist": { - "shasum": "1ce4c149d2e9340e66b90cee16e5a425052c3471" - }, - "_from": "v8tools@0.2.1" + "readme": "V8tools - V8 CPU Profiler Binding\n===\n\n\n## Installation\n\n npm install v8tools\n\n\n## API\n\n`var v8tools = require('v8tools');`\n\n`v8tools.afterGC(function(gcType, gcFlags, usedHeapSize) {})` - calls the callback after garbage collection cycle.\n\n`v8tools.startV8Profiler()` - starts V8 CPU profiler\n\n`v8tools.stopV8Profiler(function(parentNodeUid, nodeUid, totalSamplesCount, functionName, scriptResourceName, lineNumber) {})` - stops V8 CPU profiler. Callback function is called on every node while walking profile's top down call tree.\n\n`heapprof.takeHeapSnapshot(function(parentNodeUid, nodeUid, name, type, selfSize, retainerName, retainerType) {})` - takes heap snapshot. Callback function is called on every node of heap node graph.\n\n\n\n## Platforms\n\nPOSIX and Windows\n\n\n## License\n\nCopyright (c) 2012 Dmitri Melikyan\n\nPermission 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:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE 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.\n", + "_id": "v8tools@0.2.2", + "_from": "v8tools@0.2.2" } diff --git a/node_modules/v8tools/src/gc.cc b/node_modules/v8tools/src/gc.cc index 2ddea7c..3818c59 100644 --- a/node_modules/v8tools/src/gc.cc +++ b/node_modules/v8tools/src/gc.cc @@ -76,7 +76,7 @@ static void GCEpilogue(GCType gc_type, GCCallbackFlags gc_callback_flags) { baton->used_heap_size = GetUsedHeapSize(); - uv_queue_work(uv_default_loop(), &baton->request, Noop, GCEpilogueAsync); + uv_queue_work(uv_default_loop(), &baton->request, Noop, (uv_after_work_cb)GCEpilogueAsync); } diff --git a/package.json b/package.json index 1fd1ca9..961d77a 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,16 @@ { - "name": "Margin-Walker", - "version": "0.1.4", + "name": "MIT-Annotation-Data-Store", + "version": "1.0", "dependencies": { "jwt-simple": "0.1.0", - "express": "3.1.0", + "express": "3.1.1", "less-middleware": "0.1.6", - "mongoose": "3.5.7", - "nodetime": "0.8.4", + "mongoose": "3.6.4", "timekit": "0.1.9", - "v8tools": "0.2.1" + "v8tools": "0.2.2" }, "engines": { - "node": "0.8.19", - "npm": "1.2.10" + "node": "0.10.3", + "npm": "1.2.15" } } diff --git a/web.js b/web.js index 034fb53..1811d01 100644 --- a/web.js +++ b/web.js @@ -1,14 +1,16 @@ // Setup var application_root = __dirname, - config = require("./config"), - express = require("express"), + secret = process.env.SECRET, + port = process.env.PORT, + live_db = process.env.LIVE_DB, + consumer = process.env.CONSUMER, + version = process.env.VERSION, path = require("path"), mongoose = require('mongoose'), lessMiddleware = require('less-middleware'), jwt = require('jwt-simple'), - secret = config.secret, - app = express(), - port = config.port; + express = require("express"), + app = express(); // CORS var allowCrossDomain = function(req, res, next) { @@ -41,8 +43,7 @@ var Ranges = new Schema({ // Annotation Model var Annotation = new Schema({ id: { type: String, required: false }, - consumer: { type: String, default: config.consumer }, - annotator_schema_version: { type: String, required: false, default: config.api.version }, + annotator_schema_version: { type: String, required: false, default: version }, created: { type: Date, default: Date.now() }, updated: { type: Date, default: Date.now() }, user: { type: String, required: false }, @@ -66,7 +67,7 @@ var Annotation = new Schema({ var AnnotationModel = mongoose.model('Annotation', Annotation); // DB -mongoose.connect(config.mongodb.live); +mongoose.connect(live_db); // config app.configure(function () { @@ -239,11 +240,6 @@ app.delete('/api/annotations/:id', tokenOK, function (req, res) { }); }); -// launch server -app.listen(port, function() { - console.log("Listening on " + port); -}); - // Authentication function tokenOK (req, res, next) { try { @@ -271,3 +267,8 @@ function inWindow (decoded, next) { var result = (ttl - diff); console.log("Time left on token: about " + Math.floor(result/(60*60)) + " hours."); return ((result > 0) ? true : false); } + +// launch server +app.listen(port, function() { + console.log("Listening on " + port); +}); From 7b23522a10ec2baf1a389a140bc762031624e38a Mon Sep 17 00:00:00 2001 From: Jamie Folsom Date: Fri, 5 Apr 2013 16:22:29 -0400 Subject: [PATCH 10/18] Bump version. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 961d77a..942832c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "MIT-Annotation-Data-Store", - "version": "1.0", + "version": "1.0.0", "dependencies": { "jwt-simple": "0.1.0", "express": "3.1.1", From c9939436d0fbcd71d33a95590afb805956f2c53d Mon Sep 17 00:00:00 2001 From: Jamie Folsom Date: Fri, 5 Apr 2013 16:24:14 -0400 Subject: [PATCH 11/18] Remove timekit. --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 942832c..062ab4c 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,6 @@ "express": "3.1.1", "less-middleware": "0.1.6", "mongoose": "3.6.4", - "timekit": "0.1.9", "v8tools": "0.2.2" }, "engines": { From 52172cd294cc6803e970aab4d4e6a70dd8d8bed1 Mon Sep 17 00:00:00 2001 From: Jamie Folsom Date: Fri, 5 Apr 2013 16:28:03 -0400 Subject: [PATCH 12/18] Roll back versions. --- node_modules/express/.travis.yml | 2 +- node_modules/express/History.md | 9 - node_modules/express/Readme.md | 9 +- node_modules/express/bin/express | 32 +- node_modules/express/lib/application.js | 5 +- node_modules/express/lib/express.js | 2 +- node_modules/express/lib/request.js | 5 +- node_modules/express/lib/response.js | 8 +- node_modules/express/lib/utils.js | 8 +- node_modules/express/lib/view.js | 8 +- .../node_modules/buffer-crc32/README.md | 16 +- .../node_modules/buffer-crc32/index.js | 14 +- .../node_modules/buffer-crc32/package.json | 13 +- .../buffer-crc32/tests/crc.test.js | 41 +- .../node_modules/connect/lib-cov/cache.js | 68 + .../node_modules/connect/lib-cov/connect.js | 93 + .../node_modules/connect/lib-cov/index.js | 6 + .../connect/lib-cov/middleware/basicAuth.js | 128 ++ .../connect/lib-cov/middleware/bodyParser.js | 43 + .../connect/lib-cov/middleware/compress.js | 159 ++ .../lib-cov/middleware/cookieParser.js | 70 + .../lib-cov/middleware/cookieSession.js | 132 ++ .../connect/lib-cov/middleware/csrf.js | 51 + .../connect/lib-cov/middleware/directory.js | 256 +++ .../lib-cov/middleware/errorHandler.js | 104 ++ .../connect/lib-cov/middleware/favicon.js | 60 + .../connect/lib-cov/middleware/json.js | 117 ++ .../connect/lib-cov/middleware/limit.js | 63 + .../connect/lib-cov/middleware/logger.js | 312 ++++ .../lib-cov/middleware/methodOverride.js | 42 + .../connect/lib-cov/middleware/multipart.js | 183 ++ .../connect/lib-cov/middleware/query.js | 27 + .../lib-cov/middleware/responseTime.js | 39 + .../connect/lib-cov/middleware/session.js | 321 ++++ .../lib-cov/middleware/session/cookie.js | 65 + .../lib-cov/middleware/session/memory.js | 128 ++ .../lib-cov/middleware/session/session.js | 108 ++ .../lib-cov/middleware/session/store.js | 90 + .../connect/lib-cov/middleware/static.js | 92 + .../connect/lib-cov/middleware/staticCache.js | 276 +++ .../connect/lib-cov/middleware/timeout.js | 66 + .../connect/lib-cov/middleware/urlencoded.js | 98 + .../connect/lib-cov/middleware/vhost.js | 59 + .../node_modules/connect/lib-cov/patch.js | 85 + .../node_modules/connect/lib-cov/proto.js | 285 +++ .../connect/lib-cov/public/directory.html | 75 + .../connect/lib-cov/public/error.html | 13 + .../connect/lib-cov/public/favicon.ico | Bin 0 -> 1406 bytes .../connect/lib-cov/public/icons/page.png | Bin 0 -> 635 bytes .../connect/lib-cov/public/icons/page_add.png | Bin 0 -> 739 bytes .../lib-cov/public/icons/page_attach.png | Bin 0 -> 794 bytes .../lib-cov/public/icons/page_code.png | Bin 0 -> 818 bytes .../lib-cov/public/icons/page_copy.png | Bin 0 -> 663 bytes .../lib-cov/public/icons/page_delete.png | Bin 0 -> 740 bytes .../lib-cov/public/icons/page_edit.png | Bin 0 -> 807 bytes .../lib-cov/public/icons/page_error.png | Bin 0 -> 793 bytes .../lib-cov/public/icons/page_excel.png | Bin 0 -> 817 bytes .../lib-cov/public/icons/page_find.png | Bin 0 -> 879 bytes .../lib-cov/public/icons/page_gear.png | Bin 0 -> 833 bytes .../connect/lib-cov/public/icons/page_go.png | Bin 0 -> 779 bytes .../lib-cov/public/icons/page_green.png | Bin 0 -> 621 bytes .../connect/lib-cov/public/icons/page_key.png | Bin 0 -> 801 bytes .../lib-cov/public/icons/page_lightning.png | Bin 0 -> 839 bytes .../lib-cov/public/icons/page_link.png | Bin 0 -> 830 bytes .../lib-cov/public/icons/page_paintbrush.png | Bin 0 -> 813 bytes .../lib-cov/public/icons/page_paste.png | Bin 0 -> 703 bytes .../connect/lib-cov/public/icons/page_red.png | Bin 0 -> 641 bytes .../lib-cov/public/icons/page_refresh.png | Bin 0 -> 858 bytes .../lib-cov/public/icons/page_save.png | Bin 0 -> 774 bytes .../lib-cov/public/icons/page_white.png | Bin 0 -> 294 bytes .../public/icons/page_white_acrobat.png | Bin 0 -> 591 bytes .../public/icons/page_white_actionscript.png | Bin 0 -> 664 bytes .../lib-cov/public/icons/page_white_add.png | Bin 0 -> 512 bytes .../lib-cov/public/icons/page_white_c.png | Bin 0 -> 587 bytes .../public/icons/page_white_camera.png | Bin 0 -> 656 bytes .../lib-cov/public/icons/page_white_cd.png | Bin 0 -> 666 bytes .../lib-cov/public/icons/page_white_code.png | Bin 0 -> 603 bytes .../public/icons/page_white_code_red.png | Bin 0 -> 587 bytes .../public/icons/page_white_coldfusion.png | Bin 0 -> 592 bytes .../public/icons/page_white_compressed.png | Bin 0 -> 724 bytes .../lib-cov/public/icons/page_white_copy.png | Bin 0 -> 309 bytes .../public/icons/page_white_cplusplus.png | Bin 0 -> 621 bytes .../public/icons/page_white_csharp.png | Bin 0 -> 700 bytes .../lib-cov/public/icons/page_white_cup.png | Bin 0 -> 639 bytes .../public/icons/page_white_database.png | Bin 0 -> 579 bytes .../public/icons/page_white_delete.png | Bin 0 -> 536 bytes .../lib-cov/public/icons/page_white_dvd.png | Bin 0 -> 638 bytes .../lib-cov/public/icons/page_white_edit.png | Bin 0 -> 618 bytes .../lib-cov/public/icons/page_white_error.png | Bin 0 -> 623 bytes .../lib-cov/public/icons/page_white_excel.png | Bin 0 -> 663 bytes .../lib-cov/public/icons/page_white_find.png | Bin 0 -> 676 bytes .../lib-cov/public/icons/page_white_flash.png | Bin 0 -> 582 bytes .../public/icons/page_white_freehand.png | Bin 0 -> 639 bytes .../lib-cov/public/icons/page_white_gear.png | Bin 0 -> 402 bytes .../lib-cov/public/icons/page_white_get.png | Bin 0 -> 516 bytes .../lib-cov/public/icons/page_white_go.png | Bin 0 -> 612 bytes .../lib-cov/public/icons/page_white_h.png | Bin 0 -> 603 bytes .../public/icons/page_white_horizontal.png | Bin 0 -> 296 bytes .../lib-cov/public/icons/page_white_key.png | Bin 0 -> 616 bytes .../public/icons/page_white_lightning.png | Bin 0 -> 669 bytes .../lib-cov/public/icons/page_white_link.png | Bin 0 -> 614 bytes .../public/icons/page_white_magnify.png | Bin 0 -> 554 bytes .../lib-cov/public/icons/page_white_medal.png | Bin 0 -> 706 bytes .../public/icons/page_white_office.png | Bin 0 -> 779 bytes .../lib-cov/public/icons/page_white_paint.png | Bin 0 -> 688 bytes .../public/icons/page_white_paintbrush.png | Bin 0 -> 618 bytes .../lib-cov/public/icons/page_white_paste.png | Bin 0 -> 620 bytes .../lib-cov/public/icons/page_white_php.png | Bin 0 -> 538 bytes .../public/icons/page_white_picture.png | Bin 0 -> 650 bytes .../public/icons/page_white_powerpoint.png | Bin 0 -> 588 bytes .../lib-cov/public/icons/page_white_put.png | Bin 0 -> 523 bytes .../lib-cov/public/icons/page_white_ruby.png | Bin 0 -> 626 bytes .../lib-cov/public/icons/page_white_stack.png | Bin 0 -> 317 bytes .../lib-cov/public/icons/page_white_star.png | Bin 0 -> 565 bytes .../public/icons/page_white_swoosh.png | Bin 0 -> 634 bytes .../lib-cov/public/icons/page_white_text.png | Bin 0 -> 342 bytes .../public/icons/page_white_text_width.png | Bin 0 -> 315 bytes .../lib-cov/public/icons/page_white_tux.png | Bin 0 -> 668 bytes .../public/icons/page_white_vector.png | Bin 0 -> 644 bytes .../public/icons/page_white_visualstudio.png | Bin 0 -> 702 bytes .../lib-cov/public/icons/page_white_width.png | Bin 0 -> 309 bytes .../lib-cov/public/icons/page_white_word.png | Bin 0 -> 651 bytes .../lib-cov/public/icons/page_white_world.png | Bin 0 -> 734 bytes .../public/icons/page_white_wrench.png | Bin 0 -> 613 bytes .../lib-cov/public/icons/page_white_zip.png | Bin 0 -> 386 bytes .../lib-cov/public/icons/page_word.png | Bin 0 -> 777 bytes .../lib-cov/public/icons/page_world.png | Bin 0 -> 903 bytes .../connect/lib-cov/public/style.css | 141 ++ .../node_modules/connect/lib-cov/utils.js | 282 +++ .../node_modules/connect/lib/connect.js | 5 +- .../connect/lib/middleware/basicAuth.js | 4 +- .../connect/lib/middleware/compress.js | 11 +- .../connect/lib/middleware/cookieSession.js | 2 - .../connect/lib/middleware/csrf.js | 2 +- .../connect/lib/middleware/directory.js | 7 +- .../connect/lib/middleware/favicon.js | 3 +- .../connect/lib/middleware/json.js | 10 +- .../connect/lib/middleware/limit.js | 2 +- .../connect/lib/middleware/session.js | 18 +- .../connect/lib/middleware/session/cookie.js | 20 +- .../connect/lib/middleware/static.js | 3 +- .../connect/lib/middleware/timeout.js | 3 +- .../connect/lib/middleware/vhost.js | 6 +- .../express/node_modules/connect/lib/proto.js | 11 +- .../express/node_modules/connect/lib/utils.js | 22 +- .../node_modules/buffer-crc32/.npmignore | 1 - .../node_modules/buffer-crc32/.travis.yml | 8 - .../node_modules/buffer-crc32/README.md | 33 - .../node_modules/buffer-crc32/index.js | 84 - .../node_modules/buffer-crc32/package.json | 30 - .../buffer-crc32/tests/crc.test.js | 52 - .../connect/node_modules/bytes/History.md | 5 - .../connect/node_modules/bytes/index.js | 8 +- .../connect/node_modules/bytes/package.json | 11 +- .../express/node_modules/connect/package.json | 8 +- .../express/node_modules/connect/test.js | 37 +- .../node_modules/mkdirp/.gitignore.orig} | 2 +- .../node_modules/mkdirp/.gitignore.rej | 5 + .../express/node_modules/mkdirp/.travis.yml | 3 +- .../node_modules/mkdirp/README.markdown | 50 +- .../node_modules/mkdirp/examples/pow.js.orig | 6 + .../node_modules/mkdirp/examples/pow.js.rej | 19 + .../express/node_modules/mkdirp/index.js | 28 +- .../express/node_modules/mkdirp/package.json | 15 +- node_modules/express/package.json | 14 +- node_modules/express/test.js | 32 +- .../less-middleware/lib/determine-imports.js | 83 - .../less-middleware/lib/middleware.js | 63 +- node_modules/less-middleware/license | 22 - .../node_modules/less/package.json | 2 +- node_modules/less-middleware/package.json | 10 +- node_modules/less-middleware/readme.md | 143 -- .../less-middleware/test/parse-test.js | 0 node_modules/mongoose/.travis.yml | 1 - node_modules/mongoose/CONTRIBUTING.md | 13 +- node_modules/mongoose/History.md | 228 --- node_modules/mongoose/examples/README.md | 42 - node_modules/mongoose/examples/doc-methods.js | 70 - .../population-across-three-collections.js | 135 -- .../mongoose/examples/population-basic.js | 95 - .../examples/population-of-existing-doc.js | 101 - .../population-of-multiple-existing-docs.js | 112 -- .../mongoose/examples/population-options.js | 124 -- .../examples/population-plain-objects.js | 96 - node_modules/mongoose/lib/collection.js | 21 +- node_modules/mongoose/lib/connection.js | 30 +- node_modules/mongoose/lib/document.js | 461 ++--- node_modules/mongoose/lib/drivers/SPEC.md | 4 - .../drivers/node-mongodb-native/collection.js | 9 +- .../drivers/node-mongodb-native/connection.js | 14 +- node_modules/mongoose/lib/error.js | 5 +- .../mongoose/lib/errors/divergentArray.js | 40 - .../mongoose/lib/errors/validation.js | 12 +- node_modules/mongoose/lib/errors/validator.js | 10 +- node_modules/mongoose/lib/index.js | 121 +- node_modules/mongoose/lib/internal.js | 30 - node_modules/mongoose/lib/model.js | 956 +++------- node_modules/mongoose/lib/promise.js | 237 +-- node_modules/mongoose/lib/query.js | 545 ++---- node_modules/mongoose/lib/queryhelpers.js | 35 - node_modules/mongoose/lib/querystream.js | 97 +- node_modules/mongoose/lib/schema.js | 105 +- node_modules/mongoose/lib/schema/array.js | 55 +- node_modules/mongoose/lib/schema/boolean.js | 11 +- node_modules/mongoose/lib/schema/buffer.js | 46 +- node_modules/mongoose/lib/schema/date.js | 47 +- .../mongoose/lib/schema/documentarray.js | 4 +- node_modules/mongoose/lib/schema/mixed.js | 20 +- node_modules/mongoose/lib/schema/number.js | 58 +- node_modules/mongoose/lib/schema/objectid.js | 43 +- node_modules/mongoose/lib/schema/string.js | 54 +- node_modules/mongoose/lib/schematype.js | 110 +- node_modules/mongoose/lib/types/array.js | 144 +- .../mongoose/lib/types/documentarray.js | 22 +- node_modules/mongoose/lib/types/embedded.js | 75 +- node_modules/mongoose/lib/utils.js | 210 +-- .../mongoose/node_modules/mongodb/.travis.yml | 2 +- .../mongoose/node_modules/mongodb/Makefile | 56 +- .../lib/mongodb/connection/connection.js | 24 +- .../lib/mongodb/connection/connection_pool.js | 17 +- .../lib/mongodb/connection/repl_set.js | 50 +- .../mongodb/lib/mongodb/connection/server.js | 9 +- .../lib/mongodb/connection/url_parser.js | 2 - .../mongodb/lib/mongodb/cursor.js | 59 +- .../mongodb/lib/mongodb/cursorstream.js | 27 +- .../node_modules/mongodb/lib/mongodb/db.js | 34 +- .../mongodb/lib/mongodb/gridfs/gridstore.js | 16 +- .../mongodb/lib/mongodb/gridfs/readstream.js | 9 +- .../lib/mongodb/responses/mongo_reply.js | 9 +- .../node_modules/bson/build/Release/bson.node | Bin 49508 -> 49508 bytes .../node_modules/mongodb/package.json | 12 +- .../mongoose/node_modules/mpath/.travis.yml | 4 - .../mongoose/node_modules/mpath/History.md | 16 - .../mongoose/node_modules/mpath/LICENSE | 22 - .../mongoose/node_modules/mpath/Makefile | 5 - .../mongoose/node_modules/mpath/README.md | 278 --- .../mongoose/node_modules/mpath/index.js | 1 - .../mongoose/node_modules/mpath/lib/index.js | 183 -- .../mongoose/node_modules/mpath/package.json | 30 - .../mongoose/node_modules/mpath/test/index.js | 1630 ----------------- .../mongoose/node_modules/mpromise/.npmignore | 2 - .../node_modules/mpromise/.travis.yml | 4 - .../mongoose/node_modules/mpromise/History.md | 24 - .../mongoose/node_modules/mpromise/LICENSE | 22 - .../mongoose/node_modules/mpromise/Makefile | 12 - .../mongoose/node_modules/mpromise/README.md | 200 -- .../mongoose/node_modules/mpromise/index.js | 1 - .../node_modules/mpromise/lib/promise.js | 268 --- .../mpromise/node_modules/sliced/.npmignore | 2 - .../mpromise/node_modules/sliced/.travis.yml | 4 - .../mpromise/node_modules/sliced/History.md | 23 - .../mpromise/node_modules/sliced/LICENSE | 22 - .../mpromise/node_modules/sliced/Makefile | 5 - .../mpromise/node_modules/sliced/README.md | 62 - .../mpromise/node_modules/sliced/bench.js | 95 - .../node_modules/sliced/component.json | 13 - .../mpromise/node_modules/sliced/index.js | 1 - .../node_modules/sliced/lib/sliced.js | 37 - .../mpromise/node_modules/sliced/package.json | 30 - .../node_modules/sliced/test/index.js | 80 - .../node_modules/mpromise/package.json | 35 - .../mpromise/test/promise.test.js | 201 -- .../node_modules/mpromise/test/promises-A.js | 35 - node_modules/mongoose/package.json | 17 +- node_modules/mongoose/static.js | 1 - .../timekit/build/Release/timekit.node | Bin 9848 -> 0 bytes node_modules/v8tools/README.md | 2 +- .../v8tools/build/Release/v8tools.node | Bin 18124 -> 18124 bytes node_modules/v8tools/package.json | 8 +- node_modules/v8tools/src/gc.cc | 2 +- package.json | 13 +- 271 files changed, 5560 insertions(+), 8016 deletions(-) create mode 100644 node_modules/express/node_modules/connect/lib-cov/cache.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/connect.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/index.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/basicAuth.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/bodyParser.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/compress.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/cookieParser.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/cookieSession.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/csrf.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/directory.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/errorHandler.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/favicon.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/json.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/limit.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/logger.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/methodOverride.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/multipart.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/query.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/responseTime.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/session.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/session/cookie.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/session/memory.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/session/session.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/session/store.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/static.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/staticCache.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/timeout.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/urlencoded.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/vhost.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/patch.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/proto.js create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/directory.html create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/error.html create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/favicon.ico create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_add.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_attach.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_code.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_copy.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_delete.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_edit.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_error.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_excel.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_find.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_gear.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_go.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_green.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_key.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_lightning.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_link.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_paintbrush.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_paste.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_red.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_refresh.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_save.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_acrobat.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_actionscript.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_add.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_c.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_camera.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_cd.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_code.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_code_red.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_coldfusion.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_compressed.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_copy.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_cplusplus.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_csharp.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_cup.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_database.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_delete.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_dvd.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_edit.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_error.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_excel.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_find.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_flash.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_freehand.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_gear.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_get.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_go.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_h.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_horizontal.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_key.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_lightning.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_link.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_magnify.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_medal.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_office.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_paint.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_paintbrush.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_paste.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_php.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_picture.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_powerpoint.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_put.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_ruby.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_stack.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_star.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_swoosh.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_text.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_text_width.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_tux.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_vector.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_visualstudio.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_width.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_word.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_world.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_wrench.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_zip.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_word.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_world.png create mode 100644 node_modules/express/node_modules/connect/lib-cov/public/style.css create mode 100644 node_modules/express/node_modules/connect/lib-cov/utils.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/buffer-crc32/.npmignore delete mode 100644 node_modules/express/node_modules/connect/node_modules/buffer-crc32/.travis.yml delete mode 100644 node_modules/express/node_modules/connect/node_modules/buffer-crc32/README.md delete mode 100644 node_modules/express/node_modules/connect/node_modules/buffer-crc32/index.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/buffer-crc32/package.json delete mode 100644 node_modules/express/node_modules/connect/node_modules/buffer-crc32/tests/crc.test.js rename node_modules/{mongoose/node_modules/mpath/.npmignore => express/node_modules/mkdirp/.gitignore.orig} (51%) create mode 100644 node_modules/express/node_modules/mkdirp/.gitignore.rej create mode 100644 node_modules/express/node_modules/mkdirp/examples/pow.js.orig create mode 100644 node_modules/express/node_modules/mkdirp/examples/pow.js.rej delete mode 100644 node_modules/less-middleware/lib/determine-imports.js delete mode 100644 node_modules/less-middleware/license create mode 100644 node_modules/less-middleware/test/parse-test.js delete mode 100644 node_modules/mongoose/examples/README.md delete mode 100644 node_modules/mongoose/examples/doc-methods.js delete mode 100644 node_modules/mongoose/examples/population-across-three-collections.js delete mode 100644 node_modules/mongoose/examples/population-basic.js delete mode 100644 node_modules/mongoose/examples/population-of-existing-doc.js delete mode 100644 node_modules/mongoose/examples/population-of-multiple-existing-docs.js delete mode 100644 node_modules/mongoose/examples/population-options.js delete mode 100644 node_modules/mongoose/examples/population-plain-objects.js delete mode 100644 node_modules/mongoose/lib/drivers/SPEC.md delete mode 100644 node_modules/mongoose/lib/errors/divergentArray.js delete mode 100644 node_modules/mongoose/lib/internal.js delete mode 100644 node_modules/mongoose/lib/queryhelpers.js delete mode 100644 node_modules/mongoose/node_modules/mpath/.travis.yml delete mode 100644 node_modules/mongoose/node_modules/mpath/History.md delete mode 100644 node_modules/mongoose/node_modules/mpath/LICENSE delete mode 100644 node_modules/mongoose/node_modules/mpath/Makefile delete mode 100644 node_modules/mongoose/node_modules/mpath/README.md delete mode 100644 node_modules/mongoose/node_modules/mpath/index.js delete mode 100644 node_modules/mongoose/node_modules/mpath/lib/index.js delete mode 100644 node_modules/mongoose/node_modules/mpath/package.json delete mode 100644 node_modules/mongoose/node_modules/mpath/test/index.js delete mode 100644 node_modules/mongoose/node_modules/mpromise/.npmignore delete mode 100644 node_modules/mongoose/node_modules/mpromise/.travis.yml delete mode 100644 node_modules/mongoose/node_modules/mpromise/History.md delete mode 100644 node_modules/mongoose/node_modules/mpromise/LICENSE delete mode 100644 node_modules/mongoose/node_modules/mpromise/Makefile delete mode 100644 node_modules/mongoose/node_modules/mpromise/README.md delete mode 100644 node_modules/mongoose/node_modules/mpromise/index.js delete mode 100644 node_modules/mongoose/node_modules/mpromise/lib/promise.js delete mode 100644 node_modules/mongoose/node_modules/mpromise/node_modules/sliced/.npmignore delete mode 100644 node_modules/mongoose/node_modules/mpromise/node_modules/sliced/.travis.yml delete mode 100644 node_modules/mongoose/node_modules/mpromise/node_modules/sliced/History.md delete mode 100644 node_modules/mongoose/node_modules/mpromise/node_modules/sliced/LICENSE delete mode 100644 node_modules/mongoose/node_modules/mpromise/node_modules/sliced/Makefile delete mode 100644 node_modules/mongoose/node_modules/mpromise/node_modules/sliced/README.md delete mode 100644 node_modules/mongoose/node_modules/mpromise/node_modules/sliced/bench.js delete mode 100644 node_modules/mongoose/node_modules/mpromise/node_modules/sliced/component.json delete mode 100644 node_modules/mongoose/node_modules/mpromise/node_modules/sliced/index.js delete mode 100644 node_modules/mongoose/node_modules/mpromise/node_modules/sliced/lib/sliced.js delete mode 100644 node_modules/mongoose/node_modules/mpromise/node_modules/sliced/package.json delete mode 100644 node_modules/mongoose/node_modules/mpromise/node_modules/sliced/test/index.js delete mode 100644 node_modules/mongoose/node_modules/mpromise/package.json delete mode 100644 node_modules/mongoose/node_modules/mpromise/test/promise.test.js delete mode 100644 node_modules/mongoose/node_modules/mpromise/test/promises-A.js delete mode 100755 node_modules/timekit/build/Release/timekit.node diff --git a/node_modules/express/.travis.yml b/node_modules/express/.travis.yml index 09d3ef3..895dbd3 100644 --- a/node_modules/express/.travis.yml +++ b/node_modules/express/.travis.yml @@ -1,4 +1,4 @@ language: node_js node_js: + - 0.6 - 0.8 - - 0.10 diff --git a/node_modules/express/History.md b/node_modules/express/History.md index 880242d..1a2b171 100644 --- a/node_modules/express/History.md +++ b/node_modules/express/History.md @@ -1,13 +1,4 @@ -3.1.1 / 2013-04-01 -================== - - * add X-Forwarded-Host support to `req.host` - * fix relative redirects - * update mkdirp - * update buffer-crc32 - * remove legacy app.configure() method from app template. - 3.1.0 / 2013-01-25 ================== diff --git a/node_modules/express/Readme.md b/node_modules/express/Readme.md index f83e5a8..6bb8b95 100644 --- a/node_modules/express/Readme.md +++ b/node_modules/express/Readme.md @@ -1,6 +1,6 @@ ![express logo](http://f.cl.ly/items/0V2S1n0K1i3y1c122g04/Screen%20Shot%202012-04-11%20at%209.59.42%20AM.png) - Fast, unopinionated, minimalist web framework for [node](http://nodejs.org). [![Build Status](https://secure.travis-ci.org/visionmedia/express.png)](http://travis-ci.org/visionmedia/express) [![Dependency Status](https://gemnasium.com/visionmedia/express.png)](https://gemnasium.com/visionmedia/express) + Fast, unopinionated, minimalist web framework for [node](http://nodejs.org). [![Build Status](https://secure.travis-ci.org/visionmedia/express.png)](http://travis-ci.org/visionmedia/express) ```js var express = require('express'); @@ -51,7 +51,7 @@ app.listen(3000); The Express philosophy is to provide small, robust tooling for HTTP servers. Making it a great solution for single page applications, web sites, hybrids, or public HTTP APIs. - + Built on Connect you can use _only_ what you need, and nothing more, applications can be as big or as small as you like, even a single file. Express does not force you to use any specific ORM or template engine. With support for over @@ -66,7 +66,6 @@ app.listen(3000); * Visit the [Wiki](http://github.com/visionmedia/express/wiki) * [日本語ドキュメンテーション](http://hideyukisaito.com/doc/expressjs/) by [hideyukisaito](https://github.com/hideyukisaito) * [Русскоязычная документация](http://express-js.ru/) - * Run express examples [online](https://runnable.com/express) ## Viewing Examples @@ -97,7 +96,7 @@ project: express commits: 3559 active : 468 days files : 237 -authors: +authors: 1891 Tj Holowaychuk 53.1% 1285 visionmedia 36.1% 182 TJ Holowaychuk 5.1% @@ -154,7 +153,7 @@ authors: 1 Masahiro Hayashi 0.0% ``` -## License +## License (The MIT License) diff --git a/node_modules/express/bin/express b/node_modules/express/bin/express index 337c74e..3c0090c 100755 --- a/node_modules/express/bin/express +++ b/node_modules/express/bin/express @@ -30,7 +30,7 @@ var path = program.args.shift() || '.'; // end-of-line code -var eol = os.EOL +var eol = 'win32' == os.platform() ? '\r\n' : '\n' // Template engine @@ -216,27 +216,27 @@ var app = [ , '' , 'var app = express();' , '' - , '// all environments' - , 'app.set(\'port\', process.env.PORT || 3000);' - , 'app.set(\'views\', __dirname + \'/views\');' - , 'app.set(\'view engine\', \':TEMPLATE\');' - , 'app.use(express.favicon());' - , 'app.use(express.logger(\'dev\'));' - , 'app.use(express.bodyParser());' - , 'app.use(express.methodOverride());{sess}' - , 'app.use(app.router);{css}' - , 'app.use(express.static(path.join(__dirname, \'public\')));' + , 'app.configure(function(){' + , ' app.set(\'port\', process.env.PORT || 3000);' + , ' app.set(\'views\', __dirname + \'/views\');' + , ' app.set(\'view engine\', \':TEMPLATE\');' + , ' app.use(express.favicon());' + , ' app.use(express.logger(\'dev\'));' + , ' app.use(express.bodyParser());' + , ' app.use(express.methodOverride());{sess}' + , ' app.use(app.router);{css}' + , ' app.use(express.static(path.join(__dirname, \'public\')));' + , '});' , '' - , '// development only' - , 'if (\'development\' == app.get(\'env\')) {' + , 'app.configure(\'development\', function(){' , ' app.use(express.errorHandler());' - , '}' + , '});' , '' , 'app.get(\'/\', routes.index);' , 'app.get(\'/users\', user.list);' , '' , 'http.createServer(app).listen(app.get(\'port\'), function(){' - , ' console.log(\'Express server listening on port \' + app.get(\'port\'));' + , ' console.log("Express server listening on port " + app.get(\'port\'));' , '});' , '' ].join(eol); @@ -345,7 +345,7 @@ function createApplicationAt(path) { name: 'application-name' , version: '0.0.1' , private: true - , scripts: { start: 'node app.js' } + , scripts: { start: 'node app' } , dependencies: { express: version } diff --git a/node_modules/express/lib/application.js b/node_modules/express/lib/application.js index 902d574..7ebc6f6 100644 --- a/node_modules/express/lib/application.js +++ b/node_modules/express/lib/application.js @@ -34,6 +34,7 @@ app.init = function(){ this.cache = {}; this.settings = {}; this.engines = {}; + this.viewCallbacks = []; this.defaultConfiguration(); }; @@ -160,7 +161,7 @@ app.use = function(route, fn){ * [Consolidate.js](https://github.com/visionmedia/consolidate.js) * library was created to map all of node's popular template * engines to follow this convention, thus allowing them to - * work seamlessly within Express. + * work seeessly within Express. * * @param {String} ext * @param {Function} fn @@ -404,7 +405,7 @@ methods.forEach(function(method){ app[method] = function(path){ if ('get' == method && 1 == arguments.length) return this.set(path); - // if no router attached yet, attach the router + // if no router attacked yet, attach the router if (!this._usedRouter) this.use(this.router); // setup route diff --git a/node_modules/express/lib/express.js b/node_modules/express/lib/express.js index 43dc28e..2a704b2 100644 --- a/node_modules/express/lib/express.js +++ b/node_modules/express/lib/express.js @@ -20,7 +20,7 @@ exports = module.exports = createApplication; * Framework version. */ -exports.version = '3.1.1'; +exports.version = '3.1.0'; /** * Expose mime. diff --git a/node_modules/express/lib/request.js b/node_modules/express/lib/request.js index a60bdf6..1c6048d 100644 --- a/node_modules/express/lib/request.js +++ b/node_modules/express/lib/request.js @@ -440,10 +440,7 @@ req.__defineGetter__('path', function(){ */ req.__defineGetter__('host', function(){ - var trustProxy = this.app.get('trust proxy'); - var host = trustProxy && this.get('X-Forwarded-Host'); - host = host || this.get('Host'); - return host.split(':')[0]; + return this.get('Host').split(':')[0]; }); /** diff --git a/node_modules/express/lib/response.js b/node_modules/express/lib/response.js index 63d8955..2b66c88 100644 --- a/node_modules/express/lib/response.js +++ b/node_modules/express/lib/response.js @@ -634,15 +634,13 @@ res.location = function(url){ // relative if (!~url.indexOf('://') && 0 != url.indexOf('//')) { - var path + var path = app.path(); // relative to path if ('.' == url[0]) { - path = req.originalUrl.split('?')[0] - url = path + ('/' == path[path.length - 1] ? '' : '/') + url; - // relative to mount-point + url = req.path + '/' + url; + // relative to mount-point } else if ('/' != url[0]) { - path = app.path(); url = path + '/' + url; } } diff --git a/node_modules/express/lib/utils.js b/node_modules/express/lib/utils.js index cad3a65..8b1da1a 100644 --- a/node_modules/express/lib/utils.js +++ b/node_modules/express/lib/utils.js @@ -20,8 +20,8 @@ exports.etag = function(body){ /** * Make `locals()` bound to the given `obj`. - * - * This is used for `app.locals` and `res.locals`. + * + * This is used for `app.locals` and `res.locals`. * * @param {Object} obj * @return {Function} @@ -29,6 +29,8 @@ exports.etag = function(body){ */ exports.locals = function(obj){ + obj.viewCallbacks = obj.viewCallbacks || []; + function locals(obj){ for (var key in obj) locals[key] = obj[key]; return obj; @@ -277,4 +279,4 @@ exports.pathRegexp = function(path, keys, sensitive, strict) { .replace(/([\/.])/g, '\\$1') .replace(/\*/g, '(.*)'); return new RegExp('^' + path + '$', sensitive ? '' : 'i'); -} +} \ No newline at end of file diff --git a/node_modules/express/lib/view.js b/node_modules/express/lib/view.js index ae20b17..c7399a4 100644 --- a/node_modules/express/lib/view.js +++ b/node_modules/express/lib/view.js @@ -8,7 +8,7 @@ var path = require('path') , dirname = path.dirname , basename = path.basename , extname = path.extname - , exists = fs.existsSync || path.existsSync + , exists = fs.existsSync || path.existsSync , join = path.join; /** @@ -22,9 +22,9 @@ module.exports = View; * * Options: * - * - `defaultEngine` the default template engine name - * - `engines` template engine require() cache - * - `root` root path for view lookup + * - `defaultEngine` the default template engine name + * - `engines` template engine require() cache + * - `root` root path for view lookup * * @param {String} name * @param {Object} options diff --git a/node_modules/express/node_modules/buffer-crc32/README.md b/node_modules/express/node_modules/buffer-crc32/README.md index 0d9d8b8..4ad5d64 100644 --- a/node_modules/express/node_modules/buffer-crc32/README.md +++ b/node_modules/express/node_modules/buffer-crc32/README.md @@ -16,7 +16,7 @@ npm install buffer-crc32 ```js var crc32 = require('buffer-crc32'); // works with buffers -var buf = Buffer([0x00, 0x73, 0x75, 0x70, 0x20, 0x62, 0x72, 0x6f, 0x00]) +var buf = Buffer([[0x00, 0x73, 0x75, 0x70, 0x20, 0x62, 0x72, 0x6f, 0x00]) crc32(buf) // -> // has convenience methods for getting signed or unsigned ints @@ -26,22 +26,8 @@ crc32.unsigned(buf) // -> 2488970058 // will cast to buffer if given a string, so you can // directly use foreign characters safely crc32('自動販売機') // -> - -// and works in append mode too -var partialCrc = crc32('hey'); -var partialCrc = crc32(' ', partialCrc); -var partialCrc = crc32('sup', partialCrc); -var partialCrc = crc32(' ', partialCrc); -var finalCrc = crc32('bros', partialCrc); // -> ``` # tests This was tested against the output of zlib's crc32 method. You can run the tests with`npm test` (requires tap) - -# see also -https://github.com/alexgorbatchev/node-crc, `crc.buffer.crc32` also -supports buffer inputs and return unsigned ints (thanks @tjholowaychuk). - -# license -MIT/X11 diff --git a/node_modules/express/node_modules/buffer-crc32/index.js b/node_modules/express/node_modules/buffer-crc32/index.js index e29ce3e..ab0e19e 100644 --- a/node_modules/express/node_modules/buffer-crc32/index.js +++ b/node_modules/express/node_modules/buffer-crc32/index.js @@ -61,18 +61,14 @@ function bufferizeInt(num) { return tmp; } -function _crc32(buf, previous) { - if (!Buffer.isBuffer(buf)) { +function _crc32(buf) { + if (!Buffer.isBuffer(buf)) buf = Buffer(buf); - } - if (Buffer.isBuffer(previous)) { - previous = previous.readUInt32BE(0); - } - var crc = ~~previous ^ -1; + var crc = 0xffffffff; for (var n = 0; n < buf.length; n++) { crc = CRC_TABLE[(crc ^ buf[n]) & 0xff] ^ (crc >>> 8); } - return (crc ^ -1); + return (crc ^ 0xffffffff); } function crc32() { @@ -82,7 +78,7 @@ crc32.signed = function () { return _crc32.apply(null, arguments); }; crc32.unsigned = function () { - return _crc32.apply(null, arguments) >>> 0; + return crc32.apply(null, arguments).readUInt32BE(0); }; module.exports = crc32; diff --git a/node_modules/express/node_modules/buffer-crc32/package.json b/node_modules/express/node_modules/buffer-crc32/package.json index e01c98d..d9b0b51 100644 --- a/node_modules/express/node_modules/buffer-crc32/package.json +++ b/node_modules/express/node_modules/buffer-crc32/package.json @@ -6,12 +6,7 @@ }, "name": "buffer-crc32", "description": "A pure javascript CRC32 algorithm that plays nice with binary data", - "version": "0.2.1", - "contributors": [ - { - "name": "Vladimir Kuznetsov" - } - ], + "version": "0.1.1", "homepage": "https://github.com/brianloveswords/buffer-crc32", "repository": { "type": "git", @@ -29,7 +24,7 @@ "engines": { "node": "*" }, - "readme": "# buffer-crc32\n\n[![Build Status](https://secure.travis-ci.org/brianloveswords/buffer-crc32.png?branch=master)](http://travis-ci.org/brianloveswords/buffer-crc32)\n\ncrc32 that works with binary data and fancy character sets, outputs\nbuffer, signed or unsigned data and has tests.\n\nDerived from the sample CRC implementation in the PNG specification: http://www.w3.org/TR/PNG/#D-CRCAppendix\n\n# install\n```\nnpm install buffer-crc32\n```\n\n# example\n```js\nvar crc32 = require('buffer-crc32');\n// works with buffers\nvar buf = Buffer([0x00, 0x73, 0x75, 0x70, 0x20, 0x62, 0x72, 0x6f, 0x00])\ncrc32(buf) // -> \n\n// has convenience methods for getting signed or unsigned ints\ncrc32.signed(buf) // -> -1805997238\ncrc32.unsigned(buf) // -> 2488970058\n\n// will cast to buffer if given a string, so you can\n// directly use foreign characters safely\ncrc32('自動販売機') // -> \n\n// and works in append mode too\nvar partialCrc = crc32('hey');\nvar partialCrc = crc32(' ', partialCrc);\nvar partialCrc = crc32('sup', partialCrc);\nvar partialCrc = crc32(' ', partialCrc);\nvar finalCrc = crc32('bros', partialCrc); // -> \n```\n\n# tests\nThis was tested against the output of zlib's crc32 method. You can run\nthe tests with`npm test` (requires tap)\n\n# see also\nhttps://github.com/alexgorbatchev/node-crc, `crc.buffer.crc32` also\nsupports buffer inputs and return unsigned ints (thanks @tjholowaychuk).\n\n# license\nMIT/X11\n", - "_id": "buffer-crc32@0.2.1", - "_from": "buffer-crc32@~0.2.1" + "readme": "# buffer-crc32\n\n[![Build Status](https://secure.travis-ci.org/brianloveswords/buffer-crc32.png?branch=master)](http://travis-ci.org/brianloveswords/buffer-crc32)\n\ncrc32 that works with binary data and fancy character sets, outputs\nbuffer, signed or unsigned data and has tests.\n\nDerived from the sample CRC implementation in the PNG specification: http://www.w3.org/TR/PNG/#D-CRCAppendix\n\n# install\n```\nnpm install buffer-crc32\n```\n\n# example\n```js\nvar crc32 = require('buffer-crc32');\n// works with buffers\nvar buf = Buffer([[0x00, 0x73, 0x75, 0x70, 0x20, 0x62, 0x72, 0x6f, 0x00])\ncrc32(buf) // -> \n\n// has convenience methods for getting signed or unsigned ints\ncrc32.signed(buf) // -> -1805997238\ncrc32.unsigned(buf) // -> 2488970058\n\n// will cast to buffer if given a string, so you can\n// directly use foreign characters safely\ncrc32('自動販売機') // -> \n```\n\n# tests\nThis was tested against the output of zlib's crc32 method. You can run\nthe tests with`npm test` (requires tap)\n", + "_id": "buffer-crc32@0.1.1", + "_from": "buffer-crc32@0.1.1" } diff --git a/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js b/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js index bb0f9ef..d4767e3 100644 --- a/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js +++ b/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js @@ -36,54 +36,17 @@ test('casts to buffer if necessary', function (t) { t.end(); }); -test('can do signed', function (t) { +test('can do unsigned', function (t) { var input = 'ham sandwich'; var expected = -1891873021; t.same(crc32.signed(input), expected); t.end(); }); -test('can do unsigned', function (t) { +test('can do signed', function (t) { var input = 'bear sandwich'; var expected = 3711466352; t.same(crc32.unsigned(input), expected); t.end(); }); - -test('simple crc32 in append mode', function (t) { - var input = [Buffer('hey'), Buffer(' '), Buffer('sup'), Buffer(' '), Buffer('bros')]; - var expected = Buffer([0x47, 0xfa, 0x55, 0x70]); - for (var crc = 0, i = 0; i < input.length; i++) { - crc = crc32(input[i], crc); - } - t.same(crc, expected); - t.end(); -}); - - -test('can do signed in append mode', function (t) { - var input1 = 'ham'; - var input2 = ' '; - var input3 = 'sandwich'; - var expected = -1891873021; - - var crc = crc32.signed(input1); - crc = crc32.signed(input2, crc); - crc = crc32.signed(input3, crc); - - t.same(crc, expected); - t.end(); -}); - -test('can do unsigned in append mode', function (t) { - var input1 = 'bear san'; - var input2 = 'dwich'; - var expected = 3711466352; - - var crc = crc32.unsigned(input1); - crc = crc32.unsigned(input2, crc); - t.same(crc, expected); - t.end(); -}); - diff --git a/node_modules/express/node_modules/connect/lib-cov/cache.js b/node_modules/express/node_modules/connect/lib-cov/cache.js new file mode 100644 index 0000000..af6cd2f --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/cache.js @@ -0,0 +1,68 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['cache.js']) { + _$jscoverage['cache.js'] = []; + _$jscoverage['cache.js'][12] = 0; + _$jscoverage['cache.js'][21] = 0; + _$jscoverage['cache.js'][22] = 0; + _$jscoverage['cache.js'][23] = 0; + _$jscoverage['cache.js'][24] = 0; + _$jscoverage['cache.js'][35] = 0; + _$jscoverage['cache.js'][36] = 0; + _$jscoverage['cache.js'][37] = 0; + _$jscoverage['cache.js'][47] = 0; + _$jscoverage['cache.js'][48] = 0; + _$jscoverage['cache.js'][59] = 0; + _$jscoverage['cache.js'][60] = 0; + _$jscoverage['cache.js'][71] = 0; + _$jscoverage['cache.js'][73] = 0; + _$jscoverage['cache.js'][76] = 0; + _$jscoverage['cache.js'][78] = 0; + _$jscoverage['cache.js'][79] = 0; + _$jscoverage['cache.js'][80] = 0; +} +_$jscoverage['cache.js'][12]++; +module.exports = Cache; +_$jscoverage['cache.js'][21]++; +function Cache(limit) { + _$jscoverage['cache.js'][22]++; + this.store = {}; + _$jscoverage['cache.js'][23]++; + this.keys = []; + _$jscoverage['cache.js'][24]++; + this.limit = limit; +} +_$jscoverage['cache.js'][35]++; +Cache.prototype.touch = (function (key, i) { + _$jscoverage['cache.js'][36]++; + this.keys.splice(i, 1); + _$jscoverage['cache.js'][37]++; + this.keys.push(key); +}); +_$jscoverage['cache.js'][47]++; +Cache.prototype.remove = (function (key) { + _$jscoverage['cache.js'][48]++; + delete this.store[key]; +}); +_$jscoverage['cache.js'][59]++; +Cache.prototype.get = (function (key) { + _$jscoverage['cache.js'][60]++; + return this.store[key]; +}); +_$jscoverage['cache.js'][71]++; +Cache.prototype.add = (function (key) { + _$jscoverage['cache.js'][73]++; + var len = this.keys.push(key); + _$jscoverage['cache.js'][76]++; + if (len > this.limit) { + _$jscoverage['cache.js'][76]++; + this.remove(this.keys.shift()); + } + _$jscoverage['cache.js'][78]++; + var arr = this.store[key] = []; + _$jscoverage['cache.js'][79]++; + arr.createdAt = new Date(); + _$jscoverage['cache.js'][80]++; + return arr; +}); +_$jscoverage['cache.js'].source = ["","/*!"," * Connect - Cache"," * Copyright(c) 2011 Sencha Inc."," * MIT Licensed"," */","","/**"," * Expose `Cache`."," */","","module.exports = Cache;","","/**"," * LRU cache store."," *"," * @param {Number} limit"," * @api private"," */","","function Cache(limit) {"," this.store = {};"," this.keys = [];"," this.limit = limit;","}","","/**"," * Touch `key`, promoting the object."," *"," * @param {String} key"," * @param {Number} i"," * @api private"," */","","Cache.prototype.touch = function(key, i){"," this.keys.splice(i,1);"," this.keys.push(key);","};","","/**"," * Remove `key`."," *"," * @param {String} key"," * @api private"," */","","Cache.prototype.remove = function(key){"," delete this.store[key];","};","","/**"," * Get the object stored for `key`."," *"," * @param {String} key"," * @return {Array}"," * @api private"," */","","Cache.prototype.get = function(key){"," return this.store[key];","};","","/**"," * Add a cache `key`."," *"," * @param {String} key"," * @return {Array}"," * @api private"," */","","Cache.prototype.add = function(key){"," // initialize store"," var len = this.keys.push(key);",""," // limit reached, invalidate LRU"," if (len > this.limit) this.remove(this.keys.shift());",""," var arr = this.store[key] = [];"," arr.createdAt = new Date;"," return arr;","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/connect.js b/node_modules/express/node_modules/connect/lib-cov/connect.js new file mode 100644 index 0000000..f811bb8 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/connect.js @@ -0,0 +1,93 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['connect.js']) { + _$jscoverage['connect.js'] = []; + _$jscoverage['connect.js'][13] = 0; + _$jscoverage['connect.js'][22] = 0; + _$jscoverage['connect.js'][26] = 0; + _$jscoverage['connect.js'][32] = 0; + _$jscoverage['connect.js'][38] = 0; + _$jscoverage['connect.js'][44] = 0; + _$jscoverage['connect.js'][50] = 0; + _$jscoverage['connect.js'][56] = 0; + _$jscoverage['connect.js'][65] = 0; + _$jscoverage['connect.js'][66] = 0; + _$jscoverage['connect.js'][67] = 0; + _$jscoverage['connect.js'][68] = 0; + _$jscoverage['connect.js'][69] = 0; + _$jscoverage['connect.js'][70] = 0; + _$jscoverage['connect.js'][71] = 0; + _$jscoverage['connect.js'][72] = 0; + _$jscoverage['connect.js'][74] = 0; + _$jscoverage['connect.js'][75] = 0; + _$jscoverage['connect.js'][81] = 0; + _$jscoverage['connect.js'][87] = 0; + _$jscoverage['connect.js'][88] = 0; + _$jscoverage['connect.js'][89] = 0; + _$jscoverage['connect.js'][90] = 0; + _$jscoverage['connect.js'][91] = 0; + _$jscoverage['connect.js'][92] = 0; +} +_$jscoverage['connect.js'][13]++; +var EventEmitter = require("events").EventEmitter, proto = require("./proto"), utils = require("./utils"), path = require("path"), basename = path.basename, fs = require("fs"); +_$jscoverage['connect.js'][22]++; +require("./patch"); +_$jscoverage['connect.js'][26]++; +exports = module.exports = createServer; +_$jscoverage['connect.js'][32]++; +exports.version = "2.6.1"; +_$jscoverage['connect.js'][38]++; +exports.mime = require("./middleware/static").mime; +_$jscoverage['connect.js'][44]++; +exports.proto = proto; +_$jscoverage['connect.js'][50]++; +exports.middleware = {}; +_$jscoverage['connect.js'][56]++; +exports.utils = utils; +_$jscoverage['connect.js'][65]++; +function createServer() { + _$jscoverage['connect.js'][66]++; + function app(req, res) { + _$jscoverage['connect.js'][66]++; + app.handle(req, res); +} + _$jscoverage['connect.js'][67]++; + utils.merge(app, proto); + _$jscoverage['connect.js'][68]++; + utils.merge(app, EventEmitter.prototype); + _$jscoverage['connect.js'][69]++; + app.route = "/"; + _$jscoverage['connect.js'][70]++; + app.stack = []; + _$jscoverage['connect.js'][71]++; + for (var i = 0; i < arguments.length; ++i) { + _$jscoverage['connect.js'][72]++; + app.use(arguments[i]); +} + _$jscoverage['connect.js'][74]++; + return app; +} +_$jscoverage['connect.js'][75]++; +; +_$jscoverage['connect.js'][81]++; +createServer.createServer = createServer; +_$jscoverage['connect.js'][87]++; +fs.readdirSync(__dirname + "/middleware").forEach((function (filename) { + _$jscoverage['connect.js'][88]++; + if (! /\.js$/.test(filename)) { + _$jscoverage['connect.js'][88]++; + return; + } + _$jscoverage['connect.js'][89]++; + var name = basename(filename, ".js"); + _$jscoverage['connect.js'][90]++; + function load() { + _$jscoverage['connect.js'][90]++; + return require("./middleware/" + name); +} + _$jscoverage['connect.js'][91]++; + exports.middleware.__defineGetter__(name, load); + _$jscoverage['connect.js'][92]++; + exports.__defineGetter__(name, load); +})); +_$jscoverage['connect.js'].source = ["","/*!"," * Connect"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var EventEmitter = require('events').EventEmitter"," , proto = require('./proto')"," , utils = require('./utils')"," , path = require('path')"," , basename = path.basename"," , fs = require('fs');","","// node patches","","require('./patch');","","// expose createServer() as the module","","exports = module.exports = createServer;","","/**"," * Framework version."," */","","exports.version = '2.6.1';","","/**"," * Expose mime module."," */","","exports.mime = require('./middleware/static').mime;","","/**"," * Expose the prototype."," */","","exports.proto = proto;","","/**"," * Auto-load middleware getters."," */","","exports.middleware = {};","","/**"," * Expose utilities."," */","","exports.utils = utils;","","/**"," * Create a new connect server."," *"," * @return {Function}"," * @api public"," */","","function createServer() {"," function app(req, res){ app.handle(req, res); }"," utils.merge(app, proto);"," utils.merge(app, EventEmitter.prototype);"," app.route = '/';"," app.stack = [];"," for (var i = 0; i < arguments.length; ++i) {"," app.use(arguments[i]);"," }"," return app;","};","","/**"," * Support old `.createServer()` method."," */","","createServer.createServer = createServer;","","/**"," * Auto-load bundled middleware with getters."," */","","fs.readdirSync(__dirname + '/middleware').forEach(function(filename){"," if (!/\\.js$/.test(filename)) return;"," var name = basename(filename, '.js');"," function load(){ return require('./middleware/' + name); }"," exports.middleware.__defineGetter__(name, load);"," exports.__defineGetter__(name, load);","});"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/index.js b/node_modules/express/node_modules/connect/lib-cov/index.js new file mode 100644 index 0000000..e6bb1c7 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/index.js @@ -0,0 +1,6 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['index.js']) { + _$jscoverage['index.js'] = []; +} +_$jscoverage['index.js'].source = ["","/**"," * Connect is a middleware framework for node,"," * shipping with over 18 bundled middleware and a rich selection of"," * 3rd-party middleware."," *"," * var app = connect()"," * .use(connect.logger('dev'))"," * .use(connect.static('public'))"," * .use(function(req, res){"," * res.end('hello world\\n');"," * })"," * .listen(3000);"," * "," * Installation:"," * "," * $ npm install connect"," *"," * Middleware:"," *"," * - [logger](logger.html) request logger with custom format support"," * - [csrf](csrf.html) Cross-site request forgery protection"," * - [compress](compress.html) Gzip compression middleware"," * - [basicAuth](basicAuth.html) basic http authentication"," * - [bodyParser](bodyParser.html) extensible request body parser"," * - [json](json.html) application/json parser"," * - [urlencoded](urlencoded.html) application/x-www-form-urlencoded parser"," * - [multipart](multipart.html) multipart/form-data parser"," * - [timeout](timeout.html) request timeouts"," * - [cookieParser](cookieParser.html) cookie parser"," * - [session](session.html) session management support with bundled MemoryStore"," * - [cookieSession](cookieSession.html) cookie-based session support"," * - [methodOverride](methodOverride.html) faux HTTP method support"," * - [responseTime](responseTime.html) calculates response-time and exposes via X-Response-Time"," * - [staticCache](staticCache.html) memory cache layer for the static() middleware"," * - [static](static.html) streaming static file server supporting `Range` and more"," * - [directory](directory.html) directory listing middleware"," * - [vhost](vhost.html) virtual host sub-domain mapping middleware"," * - [favicon](favicon.html) efficient favicon server (with default icon)"," * - [limit](limit.html) limit the bytesize of request bodies"," * - [query](query.html) automatic querystring parser, populating `req.query`"," * - [errorHandler](errorHandler.html) flexible error handler"," *"," * Links:"," * "," * - list of [3rd-party](https://github.com/senchalabs/connect/wiki) middleware"," * - GitHub [repository](http://github.com/senchalabs/connect)"," * - [test documentation](https://github.com/senchalabs/connect/blob/gh-pages/tests.md)"," * "," */"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/basicAuth.js b/node_modules/express/node_modules/connect/lib-cov/middleware/basicAuth.js new file mode 100644 index 0000000..c9e7d63 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/basicAuth.js @@ -0,0 +1,128 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/basicAuth.js']) { + _$jscoverage['middleware/basicAuth.js'] = []; + _$jscoverage['middleware/basicAuth.js'][13] = 0; + _$jscoverage['middleware/basicAuth.js'][48] = 0; + _$jscoverage['middleware/basicAuth.js'][49] = 0; + _$jscoverage['middleware/basicAuth.js'][52] = 0; + _$jscoverage['middleware/basicAuth.js'][53] = 0; + _$jscoverage['middleware/basicAuth.js'][54] = 0; + _$jscoverage['middleware/basicAuth.js'][55] = 0; + _$jscoverage['middleware/basicAuth.js'][56] = 0; + _$jscoverage['middleware/basicAuth.js'][57] = 0; + _$jscoverage['middleware/basicAuth.js'][58] = 0; + _$jscoverage['middleware/basicAuth.js'][62] = 0; + _$jscoverage['middleware/basicAuth.js'][64] = 0; + _$jscoverage['middleware/basicAuth.js'][65] = 0; + _$jscoverage['middleware/basicAuth.js'][67] = 0; + _$jscoverage['middleware/basicAuth.js'][68] = 0; + _$jscoverage['middleware/basicAuth.js'][70] = 0; + _$jscoverage['middleware/basicAuth.js'][72] = 0; + _$jscoverage['middleware/basicAuth.js'][74] = 0; + _$jscoverage['middleware/basicAuth.js'][78] = 0; + _$jscoverage['middleware/basicAuth.js'][80] = 0; + _$jscoverage['middleware/basicAuth.js'][84] = 0; + _$jscoverage['middleware/basicAuth.js'][85] = 0; + _$jscoverage['middleware/basicAuth.js'][86] = 0; + _$jscoverage['middleware/basicAuth.js'][87] = 0; + _$jscoverage['middleware/basicAuth.js'][88] = 0; + _$jscoverage['middleware/basicAuth.js'][89] = 0; + _$jscoverage['middleware/basicAuth.js'][90] = 0; + _$jscoverage['middleware/basicAuth.js'][94] = 0; + _$jscoverage['middleware/basicAuth.js'][95] = 0; + _$jscoverage['middleware/basicAuth.js'][96] = 0; + _$jscoverage['middleware/basicAuth.js'][98] = 0; +} +_$jscoverage['middleware/basicAuth.js'][13]++; +var utils = require("../utils"), unauthorized = utils.unauthorized; +_$jscoverage['middleware/basicAuth.js'][48]++; +module.exports = (function basicAuth(callback, realm) { + _$jscoverage['middleware/basicAuth.js'][49]++; + var username, password; + _$jscoverage['middleware/basicAuth.js'][52]++; + if ("string" == typeof callback) { + _$jscoverage['middleware/basicAuth.js'][53]++; + username = callback; + _$jscoverage['middleware/basicAuth.js'][54]++; + password = realm; + _$jscoverage['middleware/basicAuth.js'][55]++; + if ("string" != typeof password) { + _$jscoverage['middleware/basicAuth.js'][55]++; + throw new Error("password argument required"); + } + _$jscoverage['middleware/basicAuth.js'][56]++; + realm = arguments[2]; + _$jscoverage['middleware/basicAuth.js'][57]++; + callback = (function (user, pass) { + _$jscoverage['middleware/basicAuth.js'][58]++; + return user == username && pass == password; +}); + } + _$jscoverage['middleware/basicAuth.js'][62]++; + realm = realm || "Authorization Required"; + _$jscoverage['middleware/basicAuth.js'][64]++; + return (function (req, res, next) { + _$jscoverage['middleware/basicAuth.js'][65]++; + var authorization = req.headers.authorization; + _$jscoverage['middleware/basicAuth.js'][67]++; + if (req.user) { + _$jscoverage['middleware/basicAuth.js'][67]++; + return next(); + } + _$jscoverage['middleware/basicAuth.js'][68]++; + if (! authorization) { + _$jscoverage['middleware/basicAuth.js'][68]++; + return unauthorized(res, realm); + } + _$jscoverage['middleware/basicAuth.js'][70]++; + var parts = authorization.split(" "); + _$jscoverage['middleware/basicAuth.js'][72]++; + if (parts.length !== 2) { + _$jscoverage['middleware/basicAuth.js'][72]++; + return next(utils.error(400)); + } + _$jscoverage['middleware/basicAuth.js'][74]++; + var scheme = parts[0], credentials = new Buffer(parts[1], "base64").toString(), index = credentials.indexOf(":"); + _$jscoverage['middleware/basicAuth.js'][78]++; + if ("Basic" != scheme || index < 0) { + _$jscoverage['middleware/basicAuth.js'][78]++; + return next(utils.error(400)); + } + _$jscoverage['middleware/basicAuth.js'][80]++; + var user = credentials.slice(0, index), pass = credentials.slice(index + 1); + _$jscoverage['middleware/basicAuth.js'][84]++; + if (callback.length >= 3) { + _$jscoverage['middleware/basicAuth.js'][85]++; + var pause = utils.pause(req); + _$jscoverage['middleware/basicAuth.js'][86]++; + callback(user, pass, (function (err, user) { + _$jscoverage['middleware/basicAuth.js'][87]++; + if (err || ! user) { + _$jscoverage['middleware/basicAuth.js'][87]++; + return unauthorized(res, realm); + } + _$jscoverage['middleware/basicAuth.js'][88]++; + req.user = req.remoteUser = user; + _$jscoverage['middleware/basicAuth.js'][89]++; + next(); + _$jscoverage['middleware/basicAuth.js'][90]++; + pause.resume(); +})); + } + else { + _$jscoverage['middleware/basicAuth.js'][94]++; + if (callback(user, pass)) { + _$jscoverage['middleware/basicAuth.js'][95]++; + req.user = req.remoteUser = user; + _$jscoverage['middleware/basicAuth.js'][96]++; + next(); + } + else { + _$jscoverage['middleware/basicAuth.js'][98]++; + unauthorized(res, realm); + } + } +}); +}); +_$jscoverage['middleware/basicAuth.js'].source = ["","/*!"," * Connect - basicAuth"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils')"," , unauthorized = utils.unauthorized;","","/**"," * Basic Auth:"," *"," * Enfore basic authentication by providing a `callback(user, pass)`,"," * which must return `true` in order to gain access. Alternatively an async"," * method is provided as well, invoking `callback(user, pass, callback)`. Populates"," * `req.user`. The final alternative is simply passing username / password"," * strings."," *"," * Simple username and password"," *"," * connect(connect.basicAuth('username', 'password'));"," *"," * Callback verification"," *"," * connect()"," * .use(connect.basicAuth(function(user, pass){"," * return 'tj' == user & 'wahoo' == pass;"," * }))"," *"," * Async callback verification, accepting `fn(err, user)`."," *"," * connect()"," * .use(connect.basicAuth(function(user, pass, fn){"," * User.authenticate({ user: user, pass: pass }, fn);"," * }))"," *"," * @param {Function|String} callback or username"," * @param {String} realm"," * @api public"," */","","module.exports = function basicAuth(callback, realm) {"," var username, password;",""," // user / pass strings"," if ('string' == typeof callback) {"," username = callback;"," password = realm;"," if ('string' != typeof password) throw new Error('password argument required');"," realm = arguments[2];"," callback = function(user, pass){"," return user == username && pass == password;"," }"," }",""," realm = realm || 'Authorization Required';",""," return function(req, res, next) {"," var authorization = req.headers.authorization;",""," if (req.user) return next();"," if (!authorization) return unauthorized(res, realm);",""," var parts = authorization.split(' ');",""," if (parts.length !== 2) return next(utils.error(400));",""," var scheme = parts[0]"," , credentials = new Buffer(parts[1], 'base64').toString()"," , index = credentials.indexOf(':');",""," if ('Basic' != scheme || index < 0) return next(utils.error(400));"," "," var user = credentials.slice(0, index)"," , pass = credentials.slice(index + 1);",""," // async"," if (callback.length >= 3) {"," var pause = utils.pause(req);"," callback(user, pass, function(err, user){"," if (err || !user) return unauthorized(res, realm);"," req.user = req.remoteUser = user;"," next();"," pause.resume();"," });"," // sync"," } else {"," if (callback(user, pass)) {"," req.user = req.remoteUser = user;"," next();"," } else {"," unauthorized(res, realm);"," }"," }"," }","};",""]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/bodyParser.js b/node_modules/express/node_modules/connect/lib-cov/middleware/bodyParser.js new file mode 100644 index 0000000..a108b97 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/bodyParser.js @@ -0,0 +1,43 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/bodyParser.js']) { + _$jscoverage['middleware/bodyParser.js'] = []; + _$jscoverage['middleware/bodyParser.js'][13] = 0; + _$jscoverage['middleware/bodyParser.js'][47] = 0; + _$jscoverage['middleware/bodyParser.js'][48] = 0; + _$jscoverage['middleware/bodyParser.js'][52] = 0; + _$jscoverage['middleware/bodyParser.js'][53] = 0; + _$jscoverage['middleware/bodyParser.js'][54] = 0; + _$jscoverage['middleware/bodyParser.js'][55] = 0; + _$jscoverage['middleware/bodyParser.js'][56] = 0; + _$jscoverage['middleware/bodyParser.js'][57] = 0; +} +_$jscoverage['middleware/bodyParser.js'][13]++; +var multipart = require("./multipart"), urlencoded = require("./urlencoded"), json = require("./json"); +_$jscoverage['middleware/bodyParser.js'][47]++; +exports = module.exports = (function bodyParser(options) { + _$jscoverage['middleware/bodyParser.js'][48]++; + var _urlencoded = urlencoded(options), _multipart = multipart(options), _json = json(options); + _$jscoverage['middleware/bodyParser.js'][52]++; + return (function bodyParser(req, res, next) { + _$jscoverage['middleware/bodyParser.js'][53]++; + _json(req, res, (function (err) { + _$jscoverage['middleware/bodyParser.js'][54]++; + if (err) { + _$jscoverage['middleware/bodyParser.js'][54]++; + return next(err); + } + _$jscoverage['middleware/bodyParser.js'][55]++; + _urlencoded(req, res, (function (err) { + _$jscoverage['middleware/bodyParser.js'][56]++; + if (err) { + _$jscoverage['middleware/bodyParser.js'][56]++; + return next(err); + } + _$jscoverage['middleware/bodyParser.js'][57]++; + _multipart(req, res, next); +})); +})); +}); +}); +_$jscoverage['middleware/bodyParser.js'].source = ["","/*!"," * Connect - bodyParser"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var multipart = require('./multipart')"," , urlencoded = require('./urlencoded')"," , json = require('./json');","","/**"," * Body parser:"," * "," * Parse request bodies, supports _application/json_,"," * _application/x-www-form-urlencoded_, and _multipart/form-data_."," *"," * This is equivalent to: "," *"," * app.use(connect.json());"," * app.use(connect.urlencoded());"," * app.use(connect.multipart());"," *"," * Examples:"," *"," * connect()"," * .use(connect.bodyParser())"," * .use(function(req, res) {"," * res.end('viewing user ' + req.body.user.name);"," * });"," *"," * $ curl -d 'user[name]=tj' http://local/"," * $ curl -d '{\"user\":{\"name\":\"tj\"}}' -H \"Content-Type: application/json\" http://local/"," *"," * View [json](json.html), [urlencoded](urlencoded.html), and [multipart](multipart.html) for more info."," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function bodyParser(options){"," var _urlencoded = urlencoded(options)"," , _multipart = multipart(options)"," , _json = json(options);",""," return function bodyParser(req, res, next) {"," _json(req, res, function(err){"," if (err) return next(err);"," _urlencoded(req, res, function(err){"," if (err) return next(err);"," _multipart(req, res, next);"," });"," });"," }","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/compress.js b/node_modules/express/node_modules/connect/lib-cov/middleware/compress.js new file mode 100644 index 0000000..aebd5f1 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/compress.js @@ -0,0 +1,159 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/compress.js']) { + _$jscoverage['middleware/compress.js'] = []; + _$jscoverage['middleware/compress.js'][12] = 0; + _$jscoverage['middleware/compress.js'][18] = 0; + _$jscoverage['middleware/compress.js'][27] = 0; + _$jscoverage['middleware/compress.js'][28] = 0; + _$jscoverage['middleware/compress.js'][61] = 0; + _$jscoverage['middleware/compress.js'][62] = 0; + _$jscoverage['middleware/compress.js'][63] = 0; + _$jscoverage['middleware/compress.js'][66] = 0; + _$jscoverage['middleware/compress.js'][67] = 0; + _$jscoverage['middleware/compress.js'][74] = 0; + _$jscoverage['middleware/compress.js'][78] = 0; + _$jscoverage['middleware/compress.js'][79] = 0; + _$jscoverage['middleware/compress.js'][80] = 0; + _$jscoverage['middleware/compress.js'][85] = 0; + _$jscoverage['middleware/compress.js'][86] = 0; + _$jscoverage['middleware/compress.js'][87] = 0; + _$jscoverage['middleware/compress.js'][92] = 0; + _$jscoverage['middleware/compress.js'][93] = 0; + _$jscoverage['middleware/compress.js'][96] = 0; + _$jscoverage['middleware/compress.js'][99] = 0; + _$jscoverage['middleware/compress.js'][102] = 0; + _$jscoverage['middleware/compress.js'][105] = 0; + _$jscoverage['middleware/compress.js'][108] = 0; + _$jscoverage['middleware/compress.js'][111] = 0; + _$jscoverage['middleware/compress.js'][112] = 0; + _$jscoverage['middleware/compress.js'][113] = 0; + _$jscoverage['middleware/compress.js'][114] = 0; + _$jscoverage['middleware/compress.js'][115] = 0; + _$jscoverage['middleware/compress.js'][121] = 0; + _$jscoverage['middleware/compress.js'][124] = 0; + _$jscoverage['middleware/compress.js'][127] = 0; + _$jscoverage['middleware/compress.js'][128] = 0; + _$jscoverage['middleware/compress.js'][132] = 0; + _$jscoverage['middleware/compress.js'][133] = 0; + _$jscoverage['middleware/compress.js'][136] = 0; + _$jscoverage['middleware/compress.js'][137] = 0; + _$jscoverage['middleware/compress.js'][140] = 0; + _$jscoverage['middleware/compress.js'][141] = 0; + _$jscoverage['middleware/compress.js'][145] = 0; +} +_$jscoverage['middleware/compress.js'][12]++; +var zlib = require("zlib"); +_$jscoverage['middleware/compress.js'][18]++; +exports.methods = {gzip: zlib.createGzip, deflate: zlib.createDeflate}; +_$jscoverage['middleware/compress.js'][27]++; +exports.filter = (function (req, res) { + _$jscoverage['middleware/compress.js'][28]++; + return /json|text|javascript/.test(res.getHeader("Content-Type")); +}); +_$jscoverage['middleware/compress.js'][61]++; +module.exports = (function compress(options) { + _$jscoverage['middleware/compress.js'][62]++; + options = options || {}; + _$jscoverage['middleware/compress.js'][63]++; + var names = Object.keys(exports.methods), filter = options.filter || exports.filter; + _$jscoverage['middleware/compress.js'][66]++; + return (function (req, res, next) { + _$jscoverage['middleware/compress.js'][67]++; + var accept = req.headers["accept-encoding"], write = res.write, end = res.end, stream, method; + _$jscoverage['middleware/compress.js'][74]++; + res.setHeader("Vary", "Accept-Encoding"); + _$jscoverage['middleware/compress.js'][78]++; + res.write = (function (chunk, encoding) { + _$jscoverage['middleware/compress.js'][79]++; + if (! this.headerSent) { + _$jscoverage['middleware/compress.js'][79]++; + this._implicitHeader(); + } + _$jscoverage['middleware/compress.js'][80]++; + return stream? stream.write(new Buffer(chunk, encoding)): write.call(res, chunk, encoding); +}); + _$jscoverage['middleware/compress.js'][85]++; + res.end = (function (chunk, encoding) { + _$jscoverage['middleware/compress.js'][86]++; + if (chunk) { + _$jscoverage['middleware/compress.js'][86]++; + this.write(chunk, encoding); + } + _$jscoverage['middleware/compress.js'][87]++; + return stream? stream.end(): end.call(res); +}); + _$jscoverage['middleware/compress.js'][92]++; + res.on("header", (function () { + _$jscoverage['middleware/compress.js'][93]++; + var encoding = res.getHeader("Content-Encoding") || "identity"; + _$jscoverage['middleware/compress.js'][96]++; + if ("identity" != encoding) { + _$jscoverage['middleware/compress.js'][96]++; + return; + } + _$jscoverage['middleware/compress.js'][99]++; + if (! filter(req, res)) { + _$jscoverage['middleware/compress.js'][99]++; + return; + } + _$jscoverage['middleware/compress.js'][102]++; + if (! accept) { + _$jscoverage['middleware/compress.js'][102]++; + return; + } + _$jscoverage['middleware/compress.js'][105]++; + if ("HEAD" == req.method) { + _$jscoverage['middleware/compress.js'][105]++; + return; + } + _$jscoverage['middleware/compress.js'][108]++; + if ("*" == accept.trim()) { + _$jscoverage['middleware/compress.js'][108]++; + method = "gzip"; + } + _$jscoverage['middleware/compress.js'][111]++; + if (! method) { + _$jscoverage['middleware/compress.js'][112]++; + for (var i = 0, len = names.length; i < len; ++i) { + _$jscoverage['middleware/compress.js'][113]++; + if (~ accept.indexOf(names[i])) { + _$jscoverage['middleware/compress.js'][114]++; + method = names[i]; + _$jscoverage['middleware/compress.js'][115]++; + break; + } +} + } + _$jscoverage['middleware/compress.js'][121]++; + if (! method) { + _$jscoverage['middleware/compress.js'][121]++; + return; + } + _$jscoverage['middleware/compress.js'][124]++; + stream = exports.methods[method](options); + _$jscoverage['middleware/compress.js'][127]++; + res.setHeader("Content-Encoding", method); + _$jscoverage['middleware/compress.js'][128]++; + res.removeHeader("Content-Length"); + _$jscoverage['middleware/compress.js'][132]++; + stream.on("data", (function (chunk) { + _$jscoverage['middleware/compress.js'][133]++; + write.call(res, chunk); +})); + _$jscoverage['middleware/compress.js'][136]++; + stream.on("end", (function () { + _$jscoverage['middleware/compress.js'][137]++; + end.call(res); +})); + _$jscoverage['middleware/compress.js'][140]++; + stream.on("drain", (function () { + _$jscoverage['middleware/compress.js'][141]++; + res.emit("drain"); +})); +})); + _$jscoverage['middleware/compress.js'][145]++; + next(); +}); +}); +_$jscoverage['middleware/compress.js'].source = ["/*!"," * Connect - compress"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var zlib = require('zlib');","","/**"," * Supported content-encoding methods."," */","","exports.methods = {"," gzip: zlib.createGzip"," , deflate: zlib.createDeflate","};","","/**"," * Default filter function."," */","","exports.filter = function(req, res){"," return /json|text|javascript/.test(res.getHeader('Content-Type'));","};","","/**"," * Compress:"," *"," * Compress response data with gzip/deflate."," *"," * Filter:"," *"," * A `filter` callback function may be passed to"," * replace the default logic of:"," *"," * exports.filter = function(req, res){"," * return /json|text|javascript/.test(res.getHeader('Content-Type'));"," * };"," *"," * Options:"," *"," * All remaining options are passed to the gzip/deflate"," * creation functions. Consult node's docs for additional details."," *"," * - `chunkSize` (default: 16*1024)"," * - `windowBits`"," * - `level`: 0-9 where 0 is no compression, and 9 is slow but best compression"," * - `memLevel`: 1-9 low is slower but uses less memory, high is fast but uses more"," * - `strategy`: compression strategy"," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","module.exports = function compress(options) {"," options = options || {};"," var names = Object.keys(exports.methods)"," , filter = options.filter || exports.filter;",""," return function(req, res, next){"," var accept = req.headers['accept-encoding']"," , write = res.write"," , end = res.end"," , stream"," , method;",""," // vary"," res.setHeader('Vary', 'Accept-Encoding');",""," // proxy",""," res.write = function(chunk, encoding){"," if (!this.headerSent) this._implicitHeader();"," return stream"," ? stream.write(new Buffer(chunk, encoding))"," : write.call(res, chunk, encoding);"," };",""," res.end = function(chunk, encoding){"," if (chunk) this.write(chunk, encoding);"," return stream"," ? stream.end()"," : end.call(res);"," };",""," res.on('header', function(){"," var encoding = res.getHeader('Content-Encoding') || 'identity';",""," // already encoded"," if ('identity' != encoding) return; ",""," // default request filter"," if (!filter(req, res)) return;",""," // SHOULD use identity"," if (!accept) return;",""," // head"," if ('HEAD' == req.method) return;",""," // default to gzip"," if ('*' == accept.trim()) method = 'gzip';",""," // compression method"," if (!method) {"," for (var i = 0, len = names.length; i < len; ++i) {"," if (~accept.indexOf(names[i])) {"," method = names[i];"," break;"," }"," }"," }",""," // compression method"," if (!method) return;",""," // compression stream"," stream = exports.methods[method](options);",""," // header fields"," res.setHeader('Content-Encoding', method);"," res.removeHeader('Content-Length');",""," // compression",""," stream.on('data', function(chunk){"," write.call(res, chunk);"," });",""," stream.on('end', function(){"," end.call(res);"," });",""," stream.on('drain', function() {"," res.emit('drain');"," });"," });",""," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/cookieParser.js b/node_modules/express/node_modules/connect/lib-cov/middleware/cookieParser.js new file mode 100644 index 0000000..7f462d1 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/cookieParser.js @@ -0,0 +1,70 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/cookieParser.js']) { + _$jscoverage['middleware/cookieParser.js'] = []; + _$jscoverage['middleware/cookieParser.js'][13] = 0; + _$jscoverage['middleware/cookieParser.js'][38] = 0; + _$jscoverage['middleware/cookieParser.js'][39] = 0; + _$jscoverage['middleware/cookieParser.js'][40] = 0; + _$jscoverage['middleware/cookieParser.js'][41] = 0; + _$jscoverage['middleware/cookieParser.js'][43] = 0; + _$jscoverage['middleware/cookieParser.js'][44] = 0; + _$jscoverage['middleware/cookieParser.js'][45] = 0; + _$jscoverage['middleware/cookieParser.js'][47] = 0; + _$jscoverage['middleware/cookieParser.js'][48] = 0; + _$jscoverage['middleware/cookieParser.js'][49] = 0; + _$jscoverage['middleware/cookieParser.js'][50] = 0; + _$jscoverage['middleware/cookieParser.js'][51] = 0; + _$jscoverage['middleware/cookieParser.js'][52] = 0; + _$jscoverage['middleware/cookieParser.js'][54] = 0; + _$jscoverage['middleware/cookieParser.js'][56] = 0; + _$jscoverage['middleware/cookieParser.js'][57] = 0; + _$jscoverage['middleware/cookieParser.js'][60] = 0; +} +_$jscoverage['middleware/cookieParser.js'][13]++; +var utils = require("./../utils"), cookie = require("cookie"); +_$jscoverage['middleware/cookieParser.js'][38]++; +module.exports = (function cookieParser(secret) { + _$jscoverage['middleware/cookieParser.js'][39]++; + return (function cookieParser(req, res, next) { + _$jscoverage['middleware/cookieParser.js'][40]++; + if (req.cookies) { + _$jscoverage['middleware/cookieParser.js'][40]++; + return next(); + } + _$jscoverage['middleware/cookieParser.js'][41]++; + var cookies = req.headers.cookie; + _$jscoverage['middleware/cookieParser.js'][43]++; + req.secret = secret; + _$jscoverage['middleware/cookieParser.js'][44]++; + req.cookies = {}; + _$jscoverage['middleware/cookieParser.js'][45]++; + req.signedCookies = {}; + _$jscoverage['middleware/cookieParser.js'][47]++; + if (cookies) { + _$jscoverage['middleware/cookieParser.js'][48]++; + try { + _$jscoverage['middleware/cookieParser.js'][49]++; + req.cookies = cookie.parse(cookies); + _$jscoverage['middleware/cookieParser.js'][50]++; + if (secret) { + _$jscoverage['middleware/cookieParser.js'][51]++; + req.signedCookies = utils.parseSignedCookies(req.cookies, secret); + _$jscoverage['middleware/cookieParser.js'][52]++; + req.signedCookies = utils.parseJSONCookies(req.signedCookies); + } + _$jscoverage['middleware/cookieParser.js'][54]++; + req.cookies = utils.parseJSONCookies(req.cookies); + } + catch (err) { + _$jscoverage['middleware/cookieParser.js'][56]++; + err.status = 400; + _$jscoverage['middleware/cookieParser.js'][57]++; + return next(err); + } + } + _$jscoverage['middleware/cookieParser.js'][60]++; + next(); +}); +}); +_$jscoverage['middleware/cookieParser.js'].source = ["","/*!"," * Connect - cookieParser"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('./../utils')"," , cookie = require('cookie');","","/**"," * Cookie parser:"," *"," * Parse _Cookie_ header and populate `req.cookies`"," * with an object keyed by the cookie names. Optionally"," * you may enabled signed cookie support by passing"," * a `secret` string, which assigns `req.secret` so"," * it may be used by other middleware."," *"," * Examples:"," *"," * connect()"," * .use(connect.cookieParser('optional secret string'))"," * .use(function(req, res, next){"," * res.end(JSON.stringify(req.cookies));"," * })"," *"," * @param {String} secret"," * @return {Function}"," * @api public"," */","","module.exports = function cookieParser(secret){"," return function cookieParser(req, res, next) {"," if (req.cookies) return next();"," var cookies = req.headers.cookie;",""," req.secret = secret;"," req.cookies = {};"," req.signedCookies = {};",""," if (cookies) {"," try {"," req.cookies = cookie.parse(cookies);"," if (secret) {"," req.signedCookies = utils.parseSignedCookies(req.cookies, secret);"," req.signedCookies = utils.parseJSONCookies(req.signedCookies);"," }"," req.cookies = utils.parseJSONCookies(req.cookies);"," } catch (err) {"," err.status = 400;"," return next(err);"," }"," }"," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/cookieSession.js b/node_modules/express/node_modules/connect/lib-cov/middleware/cookieSession.js new file mode 100644 index 0000000..e54fa47 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/cookieSession.js @@ -0,0 +1,132 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/cookieSession.js']) { + _$jscoverage['middleware/cookieSession.js'] = []; + _$jscoverage['middleware/cookieSession.js'][12] = 0; + _$jscoverage['middleware/cookieSession.js'][46] = 0; + _$jscoverage['middleware/cookieSession.js'][48] = 0; + _$jscoverage['middleware/cookieSession.js'][49] = 0; + _$jscoverage['middleware/cookieSession.js'][52] = 0; + _$jscoverage['middleware/cookieSession.js'][55] = 0; + _$jscoverage['middleware/cookieSession.js'][56] = 0; + _$jscoverage['middleware/cookieSession.js'][59] = 0; + _$jscoverage['middleware/cookieSession.js'][60] = 0; + _$jscoverage['middleware/cookieSession.js'][63] = 0; + _$jscoverage['middleware/cookieSession.js'][66] = 0; + _$jscoverage['middleware/cookieSession.js'][67] = 0; + _$jscoverage['middleware/cookieSession.js'][70] = 0; + _$jscoverage['middleware/cookieSession.js'][71] = 0; + _$jscoverage['middleware/cookieSession.js'][72] = 0; + _$jscoverage['middleware/cookieSession.js'][73] = 0; + _$jscoverage['middleware/cookieSession.js'][74] = 0; + _$jscoverage['middleware/cookieSession.js'][75] = 0; + _$jscoverage['middleware/cookieSession.js'][80] = 0; + _$jscoverage['middleware/cookieSession.js'][82] = 0; + _$jscoverage['middleware/cookieSession.js'][83] = 0; + _$jscoverage['middleware/cookieSession.js'][84] = 0; + _$jscoverage['middleware/cookieSession.js'][85] = 0; + _$jscoverage['middleware/cookieSession.js'][86] = 0; + _$jscoverage['middleware/cookieSession.js'][89] = 0; + _$jscoverage['middleware/cookieSession.js'][92] = 0; + _$jscoverage['middleware/cookieSession.js'][97] = 0; + _$jscoverage['middleware/cookieSession.js'][100] = 0; + _$jscoverage['middleware/cookieSession.js'][101] = 0; + _$jscoverage['middleware/cookieSession.js'][104] = 0; + _$jscoverage['middleware/cookieSession.js'][107] = 0; + _$jscoverage['middleware/cookieSession.js'][108] = 0; + _$jscoverage['middleware/cookieSession.js'][109] = 0; + _$jscoverage['middleware/cookieSession.js'][110] = 0; + _$jscoverage['middleware/cookieSession.js'][113] = 0; +} +_$jscoverage['middleware/cookieSession.js'][12]++; +var utils = require("./../utils"), Cookie = require("./session/cookie"), debug = require("debug")("connect:cookieSession"), signature = require("cookie-signature"), crc16 = require("crc").crc16; +_$jscoverage['middleware/cookieSession.js'][46]++; +module.exports = (function cookieSession(options) { + _$jscoverage['middleware/cookieSession.js'][48]++; + options = options || {}; + _$jscoverage['middleware/cookieSession.js'][49]++; + var key = options.key || "connect.sess", trustProxy = options.proxy; + _$jscoverage['middleware/cookieSession.js'][52]++; + return (function cookieSession(req, res, next) { + _$jscoverage['middleware/cookieSession.js'][55]++; + var secret = options.secret || req.secret; + _$jscoverage['middleware/cookieSession.js'][56]++; + if (! secret) { + _$jscoverage['middleware/cookieSession.js'][56]++; + throw new Error("`secret` option required for cookie sessions"); + } + _$jscoverage['middleware/cookieSession.js'][59]++; + req.session = {}; + _$jscoverage['middleware/cookieSession.js'][60]++; + var cookie = req.session.cookie = new Cookie(options.cookie); + _$jscoverage['middleware/cookieSession.js'][63]++; + if (0 != req.originalUrl.indexOf(cookie.path)) { + _$jscoverage['middleware/cookieSession.js'][63]++; + return next(); + } + _$jscoverage['middleware/cookieSession.js'][66]++; + if (! options.secret && req.secret) { + _$jscoverage['middleware/cookieSession.js'][67]++; + req.session = req.signedCookies[key] || {}; + } + else { + _$jscoverage['middleware/cookieSession.js'][70]++; + var rawCookie = req.cookies[key]; + _$jscoverage['middleware/cookieSession.js'][71]++; + if (rawCookie) { + _$jscoverage['middleware/cookieSession.js'][72]++; + var unsigned = utils.parseSignedCookie(rawCookie, secret); + _$jscoverage['middleware/cookieSession.js'][73]++; + if (unsigned) { + _$jscoverage['middleware/cookieSession.js'][74]++; + var originalHash = crc16(unsigned); + _$jscoverage['middleware/cookieSession.js'][75]++; + req.session = utils.parseJSONCookie(unsigned) || {}; + } + } + } + _$jscoverage['middleware/cookieSession.js'][80]++; + res.on("header", (function () { + _$jscoverage['middleware/cookieSession.js'][82]++; + if (! req.session) { + _$jscoverage['middleware/cookieSession.js'][83]++; + debug("clear session"); + _$jscoverage['middleware/cookieSession.js'][84]++; + cookie.expires = new Date(0); + _$jscoverage['middleware/cookieSession.js'][85]++; + res.setHeader("Set-Cookie", cookie.serialize(key, "")); + _$jscoverage['middleware/cookieSession.js'][86]++; + return; + } + _$jscoverage['middleware/cookieSession.js'][89]++; + delete req.session.cookie; + _$jscoverage['middleware/cookieSession.js'][92]++; + var proto = (req.headers["x-forwarded-proto"] || "").toLowerCase(), tls = req.connection.encrypted || (trustProxy && "https" == proto), secured = cookie.secure && tls; + _$jscoverage['middleware/cookieSession.js'][97]++; + if (cookie.secure && ! secured) { + _$jscoverage['middleware/cookieSession.js'][97]++; + return debug("not secured"); + } + _$jscoverage['middleware/cookieSession.js'][100]++; + debug("serializing %j", req.session); + _$jscoverage['middleware/cookieSession.js'][101]++; + var val = "j:" + JSON.stringify(req.session); + _$jscoverage['middleware/cookieSession.js'][104]++; + if (originalHash == crc16(val)) { + _$jscoverage['middleware/cookieSession.js'][104]++; + return debug("unmodified session"); + } + _$jscoverage['middleware/cookieSession.js'][107]++; + val = "s:" + signature.sign(val, secret); + _$jscoverage['middleware/cookieSession.js'][108]++; + val = cookie.serialize(key, val); + _$jscoverage['middleware/cookieSession.js'][109]++; + debug("set-cookie %j", cookie); + _$jscoverage['middleware/cookieSession.js'][110]++; + res.setHeader("Set-Cookie", val); +})); + _$jscoverage['middleware/cookieSession.js'][113]++; + next(); +}); +}); +_$jscoverage['middleware/cookieSession.js'].source = ["","/*!"," * Connect - cookieSession"," * Copyright(c) 2011 Sencha Inc."," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('./../utils')"," , Cookie = require('./session/cookie')"," , debug = require('debug')('connect:cookieSession')"," , signature = require('cookie-signature')"," , crc16 = require('crc').crc16;","","/**"," * Cookie Session:"," *"," * Cookie session middleware."," *"," * var app = connect();"," * app.use(connect.cookieParser());"," * app.use(connect.cookieSession({ secret: 'tobo!', cookie: { maxAge: 60 * 60 * 1000 }}));"," *"," * Options:"," *"," * - `key` cookie name defaulting to `connect.sess`"," * - `secret` prevents cookie tampering"," * - `cookie` session cookie settings, defaulting to `{ path: '/', httpOnly: true, maxAge: null }`"," * - `proxy` trust the reverse proxy when setting secure cookies (via \"x-forwarded-proto\")"," *"," * Clearing sessions:"," *"," * To clear the session simply set its value to `null`,"," * `cookieSession()` will then respond with a 1970 Set-Cookie."," *"," * req.session = null;"," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","module.exports = function cookieSession(options){"," // TODO: utilize Session/Cookie to unify API"," options = options || {};"," var key = options.key || 'connect.sess'"," , trustProxy = options.proxy;",""," return function cookieSession(req, res, next) {",""," // req.secret is for backwards compatibility"," var secret = options.secret || req.secret;"," if (!secret) throw new Error('`secret` option required for cookie sessions');",""," // default session"," req.session = {};"," var cookie = req.session.cookie = new Cookie(options.cookie);",""," // pathname mismatch"," if (0 != req.originalUrl.indexOf(cookie.path)) return next();",""," // cookieParser secret"," if (!options.secret && req.secret) {"," req.session = req.signedCookies[key] || {};"," } else {"," // TODO: refactor"," var rawCookie = req.cookies[key];"," if (rawCookie) {"," var unsigned = utils.parseSignedCookie(rawCookie, secret);"," if (unsigned) {"," var originalHash = crc16(unsigned);"," req.session = utils.parseJSONCookie(unsigned) || {};"," }"," }"," }",""," res.on('header', function(){"," // removed"," if (!req.session) {"," debug('clear session');"," cookie.expires = new Date(0);"," res.setHeader('Set-Cookie', cookie.serialize(key, ''));"," return;"," }",""," delete req.session.cookie;",""," // check security"," var proto = (req.headers['x-forwarded-proto'] || '').toLowerCase()"," , tls = req.connection.encrypted || (trustProxy && 'https' == proto)"," , secured = cookie.secure && tls;",""," // only send secure cookies via https"," if (cookie.secure && !secured) return debug('not secured');",""," // serialize"," debug('serializing %j', req.session);"," var val = 'j:' + JSON.stringify(req.session);",""," // compare hashes, no need to set-cookie if unchanged"," if (originalHash == crc16(val)) return debug('unmodified session');",""," // set-cookie"," val = 's:' + signature.sign(val, secret);"," val = cookie.serialize(key, val);"," debug('set-cookie %j', cookie);"," res.setHeader('Set-Cookie', val);"," });",""," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/csrf.js b/node_modules/express/node_modules/connect/lib-cov/middleware/csrf.js new file mode 100644 index 0000000..f3919ed --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/csrf.js @@ -0,0 +1,51 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/csrf.js']) { + _$jscoverage['middleware/csrf.js'] = []; + _$jscoverage['middleware/csrf.js'][11] = 0; + _$jscoverage['middleware/csrf.js'][39] = 0; + _$jscoverage['middleware/csrf.js'][40] = 0; + _$jscoverage['middleware/csrf.js'][41] = 0; + _$jscoverage['middleware/csrf.js'][43] = 0; + _$jscoverage['middleware/csrf.js'][45] = 0; + _$jscoverage['middleware/csrf.js'][48] = 0; + _$jscoverage['middleware/csrf.js'][51] = 0; + _$jscoverage['middleware/csrf.js'][54] = 0; + _$jscoverage['middleware/csrf.js'][56] = 0; + _$jscoverage['middleware/csrf.js'][69] = 0; + _$jscoverage['middleware/csrf.js'][70] = 0; +} +_$jscoverage['middleware/csrf.js'][11]++; +var utils = require("../utils"); +_$jscoverage['middleware/csrf.js'][39]++; +module.exports = (function csrf(options) { + _$jscoverage['middleware/csrf.js'][40]++; + options = options || {}; + _$jscoverage['middleware/csrf.js'][41]++; + var value = options.value || defaultValue; + _$jscoverage['middleware/csrf.js'][43]++; + return (function (req, res, next) { + _$jscoverage['middleware/csrf.js'][45]++; + var token = req.session._csrf || (req.session._csrf = utils.uid(24)); + _$jscoverage['middleware/csrf.js'][48]++; + if ("GET" == req.method || "HEAD" == req.method || "OPTIONS" == req.method) { + _$jscoverage['middleware/csrf.js'][48]++; + return next(); + } + _$jscoverage['middleware/csrf.js'][51]++; + var val = value(req); + _$jscoverage['middleware/csrf.js'][54]++; + if (val != token) { + _$jscoverage['middleware/csrf.js'][54]++; + return next(utils.error(403)); + } + _$jscoverage['middleware/csrf.js'][56]++; + next(); +}); +}); +_$jscoverage['middleware/csrf.js'][69]++; +function defaultValue(req) { + _$jscoverage['middleware/csrf.js'][70]++; + return (req.body && req.body._csrf) || (req.query && req.query._csrf) || req.headers["x-csrf-token"]; +} +_$jscoverage['middleware/csrf.js'].source = ["/*!"," * Connect - csrf"," * Copyright(c) 2011 Sencha Inc."," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils');","","/**"," * Anti CSRF:"," *"," * CRSF protection middleware."," *"," * By default this middleware generates a token named \"_csrf\""," * which should be added to requests which mutate"," * state, within a hidden form field, query-string etc. This"," * token is validated against the visitor's `req.session._csrf`"," * property."," *"," * The default `value` function checks `req.body` generated"," * by the `bodyParser()` middleware, `req.query` generated"," * by `query()`, and the \"X-CSRF-Token\" header field."," *"," * This middleware requires session support, thus should be added"," * somewhere _below_ `session()` and `cookieParser()`."," *"," * Options:"," *"," * - `value` a function accepting the request, returning the token "," *"," * @param {Object} options"," * @api public"," */","","module.exports = function csrf(options) {"," options = options || {};"," var value = options.value || defaultValue;",""," return function(req, res, next){"," // generate CSRF token"," var token = req.session._csrf || (req.session._csrf = utils.uid(24));",""," // ignore these methods"," if ('GET' == req.method || 'HEAD' == req.method || 'OPTIONS' == req.method) return next();",""," // determine value"," var val = value(req);",""," // check"," if (val != token) return next(utils.error(403));"," "," next();"," }","};","","/**"," * Default value function, checking the `req.body`"," * and `req.query` for the CSRF token."," *"," * @param {IncomingMessage} req"," * @return {String}"," * @api private"," */","","function defaultValue(req) {"," return (req.body && req.body._csrf)"," || (req.query && req.query._csrf)"," || (req.headers['x-csrf-token']);","}"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/directory.js b/node_modules/express/node_modules/connect/lib-cov/middleware/directory.js new file mode 100644 index 0000000..bc86b60 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/directory.js @@ -0,0 +1,256 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/directory.js']) { + _$jscoverage['middleware/directory.js'] = []; + _$jscoverage['middleware/directory.js'][17] = 0; + _$jscoverage['middleware/directory.js'][29] = 0; + _$jscoverage['middleware/directory.js'][48] = 0; + _$jscoverage['middleware/directory.js'][49] = 0; + _$jscoverage['middleware/directory.js'][52] = 0; + _$jscoverage['middleware/directory.js'][53] = 0; + _$jscoverage['middleware/directory.js'][58] = 0; + _$jscoverage['middleware/directory.js'][59] = 0; + _$jscoverage['middleware/directory.js'][61] = 0; + _$jscoverage['middleware/directory.js'][70] = 0; + _$jscoverage['middleware/directory.js'][73] = 0; + _$jscoverage['middleware/directory.js'][76] = 0; + _$jscoverage['middleware/directory.js'][77] = 0; + _$jscoverage['middleware/directory.js'][81] = 0; + _$jscoverage['middleware/directory.js'][84] = 0; + _$jscoverage['middleware/directory.js'][85] = 0; + _$jscoverage['middleware/directory.js'][86] = 0; + _$jscoverage['middleware/directory.js'][87] = 0; + _$jscoverage['middleware/directory.js'][88] = 0; + _$jscoverage['middleware/directory.js'][91] = 0; + _$jscoverage['middleware/directory.js'][92] = 0; + _$jscoverage['middleware/directory.js'][93] = 0; + _$jscoverage['middleware/directory.js'][94] = 0; + _$jscoverage['middleware/directory.js'][99] = 0; + _$jscoverage['middleware/directory.js'][109] = 0; + _$jscoverage['middleware/directory.js'][110] = 0; + _$jscoverage['middleware/directory.js'][111] = 0; + _$jscoverage['middleware/directory.js'][112] = 0; + _$jscoverage['middleware/directory.js'][113] = 0; + _$jscoverage['middleware/directory.js'][114] = 0; + _$jscoverage['middleware/directory.js'][115] = 0; + _$jscoverage['middleware/directory.js'][120] = 0; + _$jscoverage['middleware/directory.js'][121] = 0; + _$jscoverage['middleware/directory.js'][122] = 0; + _$jscoverage['middleware/directory.js'][131] = 0; + _$jscoverage['middleware/directory.js'][132] = 0; + _$jscoverage['middleware/directory.js'][133] = 0; + _$jscoverage['middleware/directory.js'][134] = 0; + _$jscoverage['middleware/directory.js'][135] = 0; + _$jscoverage['middleware/directory.js'][142] = 0; + _$jscoverage['middleware/directory.js'][143] = 0; + _$jscoverage['middleware/directory.js'][144] = 0; + _$jscoverage['middleware/directory.js'][145] = 0; + _$jscoverage['middleware/directory.js'][146] = 0; + _$jscoverage['middleware/directory.js'][153] = 0; + _$jscoverage['middleware/directory.js'][154] = 0; + _$jscoverage['middleware/directory.js'][155] = 0; + _$jscoverage['middleware/directory.js'][156] = 0; + _$jscoverage['middleware/directory.js'][157] = 0; + _$jscoverage['middleware/directory.js'][165] = 0; + _$jscoverage['middleware/directory.js'][166] = 0; + _$jscoverage['middleware/directory.js'][167] = 0; + _$jscoverage['middleware/directory.js'][170] = 0; + _$jscoverage['middleware/directory.js'][171] = 0; + _$jscoverage['middleware/directory.js'][172] = 0; + _$jscoverage['middleware/directory.js'][173] = 0; + _$jscoverage['middleware/directory.js'][176] = 0; + _$jscoverage['middleware/directory.js'][194] = 0; + _$jscoverage['middleware/directory.js'][195] = 0; + _$jscoverage['middleware/directory.js'][196] = 0; + _$jscoverage['middleware/directory.js'][208] = 0; + _$jscoverage['middleware/directory.js'][209] = 0; + _$jscoverage['middleware/directory.js'][210] = 0; + _$jscoverage['middleware/directory.js'][218] = 0; +} +_$jscoverage['middleware/directory.js'][17]++; +var fs = require("fs"), parse = require("url").parse, utils = require("../utils"), path = require("path"), normalize = path.normalize, extname = path.extname, join = path.join; +_$jscoverage['middleware/directory.js'][29]++; +var cache = {}; +_$jscoverage['middleware/directory.js'][48]++; +exports = module.exports = (function directory(root, options) { + _$jscoverage['middleware/directory.js'][49]++; + options = options || {}; + _$jscoverage['middleware/directory.js'][52]++; + if (! root) { + _$jscoverage['middleware/directory.js'][52]++; + throw new Error("directory() root path required"); + } + _$jscoverage['middleware/directory.js'][53]++; + var hidden = options.hidden, icons = options.icons, filter = options.filter, root = normalize(root); + _$jscoverage['middleware/directory.js'][58]++; + return (function directory(req, res, next) { + _$jscoverage['middleware/directory.js'][59]++; + if ("GET" != req.method && "HEAD" != req.method) { + _$jscoverage['middleware/directory.js'][59]++; + return next(); + } + _$jscoverage['middleware/directory.js'][61]++; + var accept = req.headers.accept || "text/plain", url = parse(req.url), dir = decodeURIComponent(url.pathname), path = normalize(join(root, dir)), originalUrl = parse(req.originalUrl), originalDir = decodeURIComponent(originalUrl.pathname), showUp = path != root && path != root + "/"; + _$jscoverage['middleware/directory.js'][70]++; + if (~ path.indexOf("\u0000")) { + _$jscoverage['middleware/directory.js'][70]++; + return next(utils.error(400)); + } + _$jscoverage['middleware/directory.js'][73]++; + if (0 != path.indexOf(root)) { + _$jscoverage['middleware/directory.js'][73]++; + return next(utils.error(403)); + } + _$jscoverage['middleware/directory.js'][76]++; + fs.stat(path, (function (err, stat) { + _$jscoverage['middleware/directory.js'][77]++; + if (err) { + _$jscoverage['middleware/directory.js'][77]++; + return "ENOENT" == err.code? next(): next(err); + } + _$jscoverage['middleware/directory.js'][81]++; + if (! stat.isDirectory()) { + _$jscoverage['middleware/directory.js'][81]++; + return next(); + } + _$jscoverage['middleware/directory.js'][84]++; + fs.readdir(path, (function (err, files) { + _$jscoverage['middleware/directory.js'][85]++; + if (err) { + _$jscoverage['middleware/directory.js'][85]++; + return next(err); + } + _$jscoverage['middleware/directory.js'][86]++; + if (! hidden) { + _$jscoverage['middleware/directory.js'][86]++; + files = removeHidden(files); + } + _$jscoverage['middleware/directory.js'][87]++; + if (filter) { + _$jscoverage['middleware/directory.js'][87]++; + files = files.filter(filter); + } + _$jscoverage['middleware/directory.js'][88]++; + files.sort(); + _$jscoverage['middleware/directory.js'][91]++; + for (var key in exports) { + _$jscoverage['middleware/directory.js'][92]++; + if (~ accept.indexOf(key) || ~ accept.indexOf("*/*")) { + _$jscoverage['middleware/directory.js'][93]++; + exports[key](req, res, files, next, originalDir, showUp, icons); + _$jscoverage['middleware/directory.js'][94]++; + return; + } +} + _$jscoverage['middleware/directory.js'][99]++; + next(utils.error(406)); +})); +})); +}); +}); +_$jscoverage['middleware/directory.js'][109]++; +exports.html = (function (req, res, files, next, dir, showUp, icons) { + _$jscoverage['middleware/directory.js'][110]++; + fs.readFile(__dirname + "/../public/directory.html", "utf8", (function (err, str) { + _$jscoverage['middleware/directory.js'][111]++; + if (err) { + _$jscoverage['middleware/directory.js'][111]++; + return next(err); + } + _$jscoverage['middleware/directory.js'][112]++; + fs.readFile(__dirname + "/../public/style.css", "utf8", (function (err, style) { + _$jscoverage['middleware/directory.js'][113]++; + if (err) { + _$jscoverage['middleware/directory.js'][113]++; + return next(err); + } + _$jscoverage['middleware/directory.js'][114]++; + if (showUp) { + _$jscoverage['middleware/directory.js'][114]++; + files.unshift(".."); + } + _$jscoverage['middleware/directory.js'][115]++; + str = str.replace("{style}", style).replace("{files}", html(files, dir, icons)).replace("{directory}", dir).replace("{linked-path}", htmlPath(dir)); + _$jscoverage['middleware/directory.js'][120]++; + res.setHeader("Content-Type", "text/html"); + _$jscoverage['middleware/directory.js'][121]++; + res.setHeader("Content-Length", str.length); + _$jscoverage['middleware/directory.js'][122]++; + res.end(str); +})); +})); +}); +_$jscoverage['middleware/directory.js'][131]++; +exports.json = (function (req, res, files) { + _$jscoverage['middleware/directory.js'][132]++; + files = JSON.stringify(files); + _$jscoverage['middleware/directory.js'][133]++; + res.setHeader("Content-Type", "application/json"); + _$jscoverage['middleware/directory.js'][134]++; + res.setHeader("Content-Length", files.length); + _$jscoverage['middleware/directory.js'][135]++; + res.end(files); +}); +_$jscoverage['middleware/directory.js'][142]++; +exports.plain = (function (req, res, files) { + _$jscoverage['middleware/directory.js'][143]++; + files = files.join("\n") + "\n"; + _$jscoverage['middleware/directory.js'][144]++; + res.setHeader("Content-Type", "text/plain"); + _$jscoverage['middleware/directory.js'][145]++; + res.setHeader("Content-Length", files.length); + _$jscoverage['middleware/directory.js'][146]++; + res.end(files); +}); +_$jscoverage['middleware/directory.js'][153]++; +function htmlPath(dir) { + _$jscoverage['middleware/directory.js'][154]++; + var curr = []; + _$jscoverage['middleware/directory.js'][155]++; + return dir.split("/").map((function (part) { + _$jscoverage['middleware/directory.js'][156]++; + curr.push(part); + _$jscoverage['middleware/directory.js'][157]++; + return "" + part + ""; +})).join(" / "); +} +_$jscoverage['middleware/directory.js'][165]++; +function html(files, dir, useIcons) { + _$jscoverage['middleware/directory.js'][166]++; + return "
      " + files.map((function (file) { + _$jscoverage['middleware/directory.js'][167]++; + var icon = "", classes = []; + _$jscoverage['middleware/directory.js'][170]++; + if (useIcons && ".." != file) { + _$jscoverage['middleware/directory.js'][171]++; + icon = icons[extname(file)] || icons["default"]; + _$jscoverage['middleware/directory.js'][172]++; + icon = ""; + _$jscoverage['middleware/directory.js'][173]++; + classes.push("icon"); + } + _$jscoverage['middleware/directory.js'][176]++; + return "
    • " + icon + file + "
    • "; +})).join("\n") + "
    "; +} +_$jscoverage['middleware/directory.js'][194]++; +function load(icon) { + _$jscoverage['middleware/directory.js'][195]++; + if (cache[icon]) { + _$jscoverage['middleware/directory.js'][195]++; + return cache[icon]; + } + _$jscoverage['middleware/directory.js'][196]++; + return cache[icon] = fs.readFileSync(__dirname + "/../public/icons/" + icon, "base64"); +} +_$jscoverage['middleware/directory.js'][208]++; +function removeHidden(files) { + _$jscoverage['middleware/directory.js'][209]++; + return files.filter((function (file) { + _$jscoverage['middleware/directory.js'][210]++; + return "." != file[0]; +})); +} +_$jscoverage['middleware/directory.js'][218]++; +var icons = {".js": "page_white_code_red.png", ".c": "page_white_c.png", ".h": "page_white_h.png", ".cc": "page_white_cplusplus.png", ".php": "page_white_php.png", ".rb": "page_white_ruby.png", ".cpp": "page_white_cplusplus.png", ".swf": "page_white_flash.png", ".pdf": "page_white_acrobat.png", "default": "page_white.png"}; +_$jscoverage['middleware/directory.js'].source = ["","/*!"," * Connect - directory"," * Copyright(c) 2011 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","// TODO: icon / style for directories","// TODO: arrow key navigation","// TODO: make icons extensible","","/**"," * Module dependencies."," */","","var fs = require('fs')"," , parse = require('url').parse"," , utils = require('../utils')"," , path = require('path')"," , normalize = path.normalize"," , extname = path.extname"," , join = path.join;","","/*!"," * Icon cache."," */","","var cache = {};","","/**"," * Directory:"," *"," * Serve directory listings with the given `root` path."," *"," * Options:"," *"," * - `hidden` display hidden (dot) files. Defaults to false."," * - `icons` display icons. Defaults to false."," * - `filter` Apply this filter function to files. Defaults to false."," *"," * @param {String} root"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function directory(root, options){"," options = options || {};",""," // root required"," if (!root) throw new Error('directory() root path required');"," var hidden = options.hidden"," , icons = options.icons"," , filter = options.filter"," , root = normalize(root);",""," return function directory(req, res, next) {"," if ('GET' != req.method && 'HEAD' != req.method) return next();",""," var accept = req.headers.accept || 'text/plain'"," , url = parse(req.url)"," , dir = decodeURIComponent(url.pathname)"," , path = normalize(join(root, dir))"," , originalUrl = parse(req.originalUrl)"," , originalDir = decodeURIComponent(originalUrl.pathname)"," , showUp = path != root && path != root + '/';",""," // null byte(s), bad request"," if (~path.indexOf('\\0')) return next(utils.error(400));",""," // malicious path, forbidden"," if (0 != path.indexOf(root)) return next(utils.error(403));",""," // check if we have a directory"," fs.stat(path, function(err, stat){"," if (err) return 'ENOENT' == err.code"," ? next()"," : next(err);",""," if (!stat.isDirectory()) return next();",""," // fetch files"," fs.readdir(path, function(err, files){"," if (err) return next(err);"," if (!hidden) files = removeHidden(files);"," if (filter) files = files.filter(filter);"," files.sort();",""," // content-negotiation"," for (var key in exports) {"," if (~accept.indexOf(key) || ~accept.indexOf('*/*')) {"," exports[key](req, res, files, next, originalDir, showUp, icons);"," return;"," }"," }",""," // not acceptable"," next(utils.error(406));"," });"," });"," };","};","","/**"," * Respond with text/html."," */","","exports.html = function(req, res, files, next, dir, showUp, icons){"," fs.readFile(__dirname + '/../public/directory.html', 'utf8', function(err, str){"," if (err) return next(err);"," fs.readFile(__dirname + '/../public/style.css', 'utf8', function(err, style){"," if (err) return next(err);"," if (showUp) files.unshift('..');"," str = str"," .replace('{style}', style)"," .replace('{files}', html(files, dir, icons))"," .replace('{directory}', dir)"," .replace('{linked-path}', htmlPath(dir));"," res.setHeader('Content-Type', 'text/html');"," res.setHeader('Content-Length', str.length);"," res.end(str);"," });"," });","};","","/**"," * Respond with application/json."," */","","exports.json = function(req, res, files){"," files = JSON.stringify(files);"," res.setHeader('Content-Type', 'application/json');"," res.setHeader('Content-Length', files.length);"," res.end(files);","};","","/**"," * Respond with text/plain."," */","","exports.plain = function(req, res, files){"," files = files.join('\\n') + '\\n';"," res.setHeader('Content-Type', 'text/plain');"," res.setHeader('Content-Length', files.length);"," res.end(files);","};","","/**"," * Map html `dir`, returning a linked path."," */","","function htmlPath(dir) {"," var curr = [];"," return dir.split('/').map(function(part){"," curr.push(part);"," return '<a href=\"' + curr.join('/') + '\">' + part + '</a>';"," }).join(' / ');","}","","/**"," * Map html `files`, returning an html unordered list."," */","","function html(files, dir, useIcons) {"," return '<ul id=\"files\">' + files.map(function(file){"," var icon = ''"," , classes = [];",""," if (useIcons && '..' != file) {"," icon = icons[extname(file)] || icons.default;"," icon = '<img src=\"data:image/png;base64,' + load(icon) + '\" />';"," classes.push('icon');"," }",""," return '<li><a href=\"'"," + join(dir, file)"," + '\" class=\"'"," + classes.join(' ') + '\"'"," + ' title=\"' + file + '\">'"," + icon + file + '</a></li>';",""," }).join('\\n') + '</ul>';","}","","/**"," * Load and cache the given `icon`."," *"," * @param {String} icon"," * @return {String}"," * @api private"," */","","function load(icon) {"," if (cache[icon]) return cache[icon];"," return cache[icon] = fs.readFileSync(__dirname + '/../public/icons/' + icon, 'base64');","}","","/**"," * Filter \"hidden\" `files`, aka files"," * beginning with a `.`."," *"," * @param {Array} files"," * @return {Array}"," * @api private"," */","","function removeHidden(files) {"," return files.filter(function(file){"," return '.' != file[0];"," });","}","","/**"," * Icon map."," */","","var icons = {"," '.js': 'page_white_code_red.png'"," , '.c': 'page_white_c.png'"," , '.h': 'page_white_h.png'"," , '.cc': 'page_white_cplusplus.png'"," , '.php': 'page_white_php.png'"," , '.rb': 'page_white_ruby.png'"," , '.cpp': 'page_white_cplusplus.png'"," , '.swf': 'page_white_flash.png'"," , '.pdf': 'page_white_acrobat.png'"," , 'default': 'page_white.png'","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/errorHandler.js b/node_modules/express/node_modules/connect/lib-cov/middleware/errorHandler.js new file mode 100644 index 0000000..9a87bfa --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/errorHandler.js @@ -0,0 +1,104 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/errorHandler.js']) { + _$jscoverage['middleware/errorHandler.js'] = []; + _$jscoverage['middleware/errorHandler.js'][12] = 0; + _$jscoverage['middleware/errorHandler.js'][17] = 0; + _$jscoverage['middleware/errorHandler.js'][44] = 0; + _$jscoverage['middleware/errorHandler.js'][45] = 0; + _$jscoverage['middleware/errorHandler.js'][46] = 0; + _$jscoverage['middleware/errorHandler.js'][47] = 0; + _$jscoverage['middleware/errorHandler.js'][48] = 0; + _$jscoverage['middleware/errorHandler.js'][49] = 0; + _$jscoverage['middleware/errorHandler.js'][51] = 0; + _$jscoverage['middleware/errorHandler.js'][52] = 0; + _$jscoverage['middleware/errorHandler.js'][53] = 0; + _$jscoverage['middleware/errorHandler.js'][54] = 0; + _$jscoverage['middleware/errorHandler.js'][56] = 0; + _$jscoverage['middleware/errorHandler.js'][57] = 0; + _$jscoverage['middleware/errorHandler.js'][63] = 0; + _$jscoverage['middleware/errorHandler.js'][64] = 0; + _$jscoverage['middleware/errorHandler.js'][68] = 0; + _$jscoverage['middleware/errorHandler.js'][69] = 0; + _$jscoverage['middleware/errorHandler.js'][70] = 0; + _$jscoverage['middleware/errorHandler.js'][71] = 0; + _$jscoverage['middleware/errorHandler.js'][72] = 0; + _$jscoverage['middleware/errorHandler.js'][73] = 0; + _$jscoverage['middleware/errorHandler.js'][76] = 0; + _$jscoverage['middleware/errorHandler.js'][77] = 0; + _$jscoverage['middleware/errorHandler.js'][86] = 0; +} +_$jscoverage['middleware/errorHandler.js'][12]++; +var utils = require("../utils"), fs = require("fs"); +_$jscoverage['middleware/errorHandler.js'][17]++; +var env = process.env.NODE_ENV || "development"; +_$jscoverage['middleware/errorHandler.js'][44]++; +exports = module.exports = (function errorHandler() { + _$jscoverage['middleware/errorHandler.js'][45]++; + return (function errorHandler(err, req, res, next) { + _$jscoverage['middleware/errorHandler.js'][46]++; + if (err.status) { + _$jscoverage['middleware/errorHandler.js'][46]++; + res.statusCode = err.status; + } + _$jscoverage['middleware/errorHandler.js'][47]++; + if (res.statusCode < 400) { + _$jscoverage['middleware/errorHandler.js'][47]++; + res.statusCode = 500; + } + _$jscoverage['middleware/errorHandler.js'][48]++; + if ("test" != env) { + _$jscoverage['middleware/errorHandler.js'][48]++; + console.error(err.stack); + } + _$jscoverage['middleware/errorHandler.js'][49]++; + var accept = req.headers.accept || ""; + _$jscoverage['middleware/errorHandler.js'][51]++; + if (~ accept.indexOf("html")) { + _$jscoverage['middleware/errorHandler.js'][52]++; + fs.readFile(__dirname + "/../public/style.css", "utf8", (function (e, style) { + _$jscoverage['middleware/errorHandler.js'][53]++; + fs.readFile(__dirname + "/../public/error.html", "utf8", (function (e, html) { + _$jscoverage['middleware/errorHandler.js'][54]++; + var stack = (err.stack || "").split("\n").slice(1).map((function (v) { + _$jscoverage['middleware/errorHandler.js'][56]++; + return "
  • " + v + "
  • "; +})).join(""); + _$jscoverage['middleware/errorHandler.js'][57]++; + html = html.replace("{style}", style).replace("{stack}", stack).replace("{title}", exports.title).replace("{statusCode}", res.statusCode).replace(/\{error\}/g, utils.escape(err.toString())); + _$jscoverage['middleware/errorHandler.js'][63]++; + res.setHeader("Content-Type", "text/html; charset=utf-8"); + _$jscoverage['middleware/errorHandler.js'][64]++; + res.end(html); +})); +})); + } + else { + _$jscoverage['middleware/errorHandler.js'][68]++; + if (~ accept.indexOf("json")) { + _$jscoverage['middleware/errorHandler.js'][69]++; + var error = {message: err.message, stack: err.stack}; + _$jscoverage['middleware/errorHandler.js'][70]++; + for (var prop in err) { + _$jscoverage['middleware/errorHandler.js'][70]++; + error[prop] = err[prop]; +} + _$jscoverage['middleware/errorHandler.js'][71]++; + var json = JSON.stringify({error: error}); + _$jscoverage['middleware/errorHandler.js'][72]++; + res.setHeader("Content-Type", "application/json"); + _$jscoverage['middleware/errorHandler.js'][73]++; + res.end(json); + } + else { + _$jscoverage['middleware/errorHandler.js'][76]++; + res.writeHead(res.statusCode, {"Content-Type": "text/plain"}); + _$jscoverage['middleware/errorHandler.js'][77]++; + res.end(err.stack); + } + } +}); +}); +_$jscoverage['middleware/errorHandler.js'][86]++; +exports.title = "Connect"; +_$jscoverage['middleware/errorHandler.js'].source = ["/*!"," * Connect - errorHandler"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils')"," , fs = require('fs');","","// environment","","var env = process.env.NODE_ENV || 'development';","","/**"," * Error handler:"," *"," * Development error handler, providing stack traces"," * and error message responses for requests accepting text, html,"," * or json."," *"," * Text:"," *"," * By default, and when _text/plain_ is accepted a simple stack trace"," * or error message will be returned."," *"," * JSON:"," *"," * When _application/json_ is accepted, connect will respond with"," * an object in the form of `{ \"error\": error }`."," *"," * HTML:"," *"," * When accepted connect will output a nice html stack trace."," *"," * @return {Function}"," * @api public"," */","","exports = module.exports = function errorHandler(){"," return function errorHandler(err, req, res, next){"," if (err.status) res.statusCode = err.status;"," if (res.statusCode < 400) res.statusCode = 500;"," if ('test' != env) console.error(err.stack);"," var accept = req.headers.accept || '';"," // html"," if (~accept.indexOf('html')) {"," fs.readFile(__dirname + '/../public/style.css', 'utf8', function(e, style){"," fs.readFile(__dirname + '/../public/error.html', 'utf8', function(e, html){"," var stack = (err.stack || '')"," .split('\\n').slice(1)"," .map(function(v){ return '<li>' + v + '</li>'; }).join('');"," html = html"," .replace('{style}', style)"," .replace('{stack}', stack)"," .replace('{title}', exports.title)"," .replace('{statusCode}', res.statusCode)"," .replace(/\\{error\\}/g, utils.escape(err.toString()));"," res.setHeader('Content-Type', 'text/html; charset=utf-8');"," res.end(html);"," });"," });"," // json"," } else if (~accept.indexOf('json')) {"," var error = { message: err.message, stack: err.stack };"," for (var prop in err) error[prop] = err[prop];"," var json = JSON.stringify({ error: error });"," res.setHeader('Content-Type', 'application/json');"," res.end(json);"," // plain text"," } else {"," res.writeHead(res.statusCode, { 'Content-Type': 'text/plain' });"," res.end(err.stack);"," }"," };","};","","/**"," * Template title, framework authors may override this value."," */","","exports.title = 'Connect';"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/favicon.js b/node_modules/express/node_modules/connect/lib-cov/middleware/favicon.js new file mode 100644 index 0000000..6228079 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/favicon.js @@ -0,0 +1,60 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/favicon.js']) { + _$jscoverage['middleware/favicon.js'] = []; + _$jscoverage['middleware/favicon.js'][13] = 0; + _$jscoverage['middleware/favicon.js'][50] = 0; + _$jscoverage['middleware/favicon.js'][51] = 0; + _$jscoverage['middleware/favicon.js'][56] = 0; + _$jscoverage['middleware/favicon.js'][57] = 0; + _$jscoverage['middleware/favicon.js'][58] = 0; + _$jscoverage['middleware/favicon.js'][59] = 0; + _$jscoverage['middleware/favicon.js'][60] = 0; + _$jscoverage['middleware/favicon.js'][62] = 0; + _$jscoverage['middleware/favicon.js'][63] = 0; + _$jscoverage['middleware/favicon.js'][64] = 0; + _$jscoverage['middleware/favicon.js'][73] = 0; + _$jscoverage['middleware/favicon.js'][74] = 0; + _$jscoverage['middleware/favicon.js'][78] = 0; +} +_$jscoverage['middleware/favicon.js'][13]++; +var fs = require("fs"), utils = require("../utils"); +_$jscoverage['middleware/favicon.js'][50]++; +module.exports = (function favicon(path, options) { + _$jscoverage['middleware/favicon.js'][51]++; + var options = options || {}, path = path || __dirname + "/../public/favicon.ico", maxAge = options.maxAge || 86400000, icon; + _$jscoverage['middleware/favicon.js'][56]++; + return (function favicon(req, res, next) { + _$jscoverage['middleware/favicon.js'][57]++; + if ("/favicon.ico" == req.url) { + _$jscoverage['middleware/favicon.js'][58]++; + if (icon) { + _$jscoverage['middleware/favicon.js'][59]++; + res.writeHead(200, icon.headers); + _$jscoverage['middleware/favicon.js'][60]++; + res.end(icon.body); + } + else { + _$jscoverage['middleware/favicon.js'][62]++; + fs.readFile(path, (function (err, buf) { + _$jscoverage['middleware/favicon.js'][63]++; + if (err) { + _$jscoverage['middleware/favicon.js'][63]++; + return next(err); + } + _$jscoverage['middleware/favicon.js'][64]++; + icon = {headers: {"Content-Type": "image/x-icon", "Content-Length": buf.length, "ETag": "\"" + utils.md5(buf) + "\"", "Cache-Control": "public, max-age=" + (maxAge / 1000)}, body: buf}; + _$jscoverage['middleware/favicon.js'][73]++; + res.writeHead(200, icon.headers); + _$jscoverage['middleware/favicon.js'][74]++; + res.end(icon.body); +})); + } + } + else { + _$jscoverage['middleware/favicon.js'][78]++; + next(); + } +}); +}); +_$jscoverage['middleware/favicon.js'].source = ["","/*!"," * Connect - favicon"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var fs = require('fs')"," , utils = require('../utils');","","/**"," * Favicon:"," *"," * By default serves the connect favicon, or the favicon"," * located by the given `path`."," *"," * Options:"," *"," * - `maxAge` cache-control max-age directive, defaulting to 1 day"," *"," * Examples:"," *"," * Serve default favicon:"," *"," * connect()"," * .use(connect.favicon())"," *"," * Serve favicon before logging for brevity:"," *"," * connect()"," * .use(connect.favicon())"," * .use(connect.logger('dev'))"," *"," * Serve custom favicon:"," *"," * connect()"," * .use(connect.favicon('public/favicon.ico))"," *"," * @param {String} path"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","module.exports = function favicon(path, options){"," var options = options || {}"," , path = path || __dirname + '/../public/favicon.ico'"," , maxAge = options.maxAge || 86400000"," , icon; // favicon cache",""," return function favicon(req, res, next){"," if ('/favicon.ico' == req.url) {"," if (icon) {"," res.writeHead(200, icon.headers);"," res.end(icon.body);"," } else {"," fs.readFile(path, function(err, buf){"," if (err) return next(err);"," icon = {"," headers: {"," 'Content-Type': 'image/x-icon'"," , 'Content-Length': buf.length"," , 'ETag': '\"' + utils.md5(buf) + '\"'"," , 'Cache-Control': 'public, max-age=' + (maxAge / 1000)"," },"," body: buf"," };"," res.writeHead(200, icon.headers);"," res.end(icon.body);"," });"," }"," } else {"," next();"," }"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/json.js b/node_modules/express/node_modules/connect/lib-cov/middleware/json.js new file mode 100644 index 0000000..87236cf --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/json.js @@ -0,0 +1,117 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/json.js']) { + _$jscoverage['middleware/json.js'] = []; + _$jscoverage['middleware/json.js'][13] = 0; + _$jscoverage['middleware/json.js'][20] = 0; + _$jscoverage['middleware/json.js'][21] = 0; + _$jscoverage['middleware/json.js'][41] = 0; + _$jscoverage['middleware/json.js'][42] = 0; + _$jscoverage['middleware/json.js'][45] = 0; + _$jscoverage['middleware/json.js'][49] = 0; + _$jscoverage['middleware/json.js'][50] = 0; + _$jscoverage['middleware/json.js'][51] = 0; + _$jscoverage['middleware/json.js'][53] = 0; + _$jscoverage['middleware/json.js'][56] = 0; + _$jscoverage['middleware/json.js'][59] = 0; + _$jscoverage['middleware/json.js'][62] = 0; + _$jscoverage['middleware/json.js'][63] = 0; + _$jscoverage['middleware/json.js'][64] = 0; + _$jscoverage['middleware/json.js'][65] = 0; + _$jscoverage['middleware/json.js'][66] = 0; + _$jscoverage['middleware/json.js'][67] = 0; + _$jscoverage['middleware/json.js'][68] = 0; + _$jscoverage['middleware/json.js'][70] = 0; + _$jscoverage['middleware/json.js'][71] = 0; + _$jscoverage['middleware/json.js'][74] = 0; + _$jscoverage['middleware/json.js'][75] = 0; + _$jscoverage['middleware/json.js'][76] = 0; + _$jscoverage['middleware/json.js'][77] = 0; + _$jscoverage['middleware/json.js'][79] = 0; + _$jscoverage['middleware/json.js'][80] = 0; + _$jscoverage['middleware/json.js'][81] = 0; +} +_$jscoverage['middleware/json.js'][13]++; +var utils = require("../utils"), _limit = require("./limit"); +_$jscoverage['middleware/json.js'][20]++; +function noop(req, res, next) { + _$jscoverage['middleware/json.js'][21]++; + next(); +} +_$jscoverage['middleware/json.js'][41]++; +exports = module.exports = (function (options) { + _$jscoverage['middleware/json.js'][42]++; + var options = options || {}, strict = options.strict !== false; + _$jscoverage['middleware/json.js'][45]++; + var limit = options.limit? _limit(options.limit): noop; + _$jscoverage['middleware/json.js'][49]++; + return (function json(req, res, next) { + _$jscoverage['middleware/json.js'][50]++; + if (req._body) { + _$jscoverage['middleware/json.js'][50]++; + return next(); + } + _$jscoverage['middleware/json.js'][51]++; + req.body = req.body || {}; + _$jscoverage['middleware/json.js'][53]++; + if (! utils.hasBody(req)) { + _$jscoverage['middleware/json.js'][53]++; + return next(); + } + _$jscoverage['middleware/json.js'][56]++; + if ("application/json" != utils.mime(req)) { + _$jscoverage['middleware/json.js'][56]++; + return next(); + } + _$jscoverage['middleware/json.js'][59]++; + req._body = true; + _$jscoverage['middleware/json.js'][62]++; + limit(req, res, (function (err) { + _$jscoverage['middleware/json.js'][63]++; + if (err) { + _$jscoverage['middleware/json.js'][63]++; + return next(err); + } + _$jscoverage['middleware/json.js'][64]++; + var buf = ""; + _$jscoverage['middleware/json.js'][65]++; + req.setEncoding("utf8"); + _$jscoverage['middleware/json.js'][66]++; + req.on("data", (function (chunk) { + _$jscoverage['middleware/json.js'][66]++; + buf += chunk; +})); + _$jscoverage['middleware/json.js'][67]++; + req.on("end", (function () { + _$jscoverage['middleware/json.js'][68]++; + var first = buf.trim()[0]; + _$jscoverage['middleware/json.js'][70]++; + if (0 == buf.length) { + _$jscoverage['middleware/json.js'][71]++; + return next(utils.error(400, "invalid json, empty body")); + } + _$jscoverage['middleware/json.js'][74]++; + if (strict && "{" != first && "[" != first) { + _$jscoverage['middleware/json.js'][74]++; + return next(utils.error(400, "invalid json")); + } + _$jscoverage['middleware/json.js'][75]++; + try { + _$jscoverage['middleware/json.js'][76]++; + req.body = JSON.parse(buf, options.reviver); + _$jscoverage['middleware/json.js'][77]++; + next(); + } + catch (err) { + _$jscoverage['middleware/json.js'][79]++; + err.body = buf; + _$jscoverage['middleware/json.js'][80]++; + err.status = 400; + _$jscoverage['middleware/json.js'][81]++; + next(err); + } +})); +})); +}); +}); +_$jscoverage['middleware/json.js'].source = ["","/*!"," * Connect - json"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils')"," , _limit = require('./limit');","","/**"," * noop middleware."," */","","function noop(req, res, next) {"," next();","}","","/**"," * JSON:"," *"," * Parse JSON request bodies, providing the"," * parsed object as `req.body`."," *"," * Options:"," *"," * - `strict` when `false` anything `JSON.parse()` accepts will be parsed"," * - `reviver` used as the second \"reviver\" argument for JSON.parse"," * - `limit` byte limit disabled by default"," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function(options){"," var options = options || {}"," , strict = options.strict !== false;",""," var limit = options.limit"," ? _limit(options.limit)"," : noop;",""," return function json(req, res, next) {"," if (req._body) return next();"," req.body = req.body || {};",""," if (!utils.hasBody(req)) return next();",""," // check Content-Type"," if ('application/json' != utils.mime(req)) return next();",""," // flag as parsed"," req._body = true;",""," // parse"," limit(req, res, function(err){"," if (err) return next(err);"," var buf = '';"," req.setEncoding('utf8');"," req.on('data', function(chunk){ buf += chunk });"," req.on('end', function(){"," var first = buf.trim()[0];",""," if (0 == buf.length) {"," return next(utils.error(400, 'invalid json, empty body'));"," }"," "," if (strict && '{' != first && '[' != first) return next(utils.error(400, 'invalid json'));"," try {"," req.body = JSON.parse(buf, options.reviver);"," next();"," } catch (err){"," err.body = buf;"," err.status = 400;"," next(err);"," }"," });"," });"," }","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/limit.js b/node_modules/express/node_modules/connect/lib-cov/middleware/limit.js new file mode 100644 index 0000000..fa8ea34 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/limit.js @@ -0,0 +1,63 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/limit.js']) { + _$jscoverage['middleware/limit.js'] = []; + _$jscoverage['middleware/limit.js'][12] = 0; + _$jscoverage['middleware/limit.js'][31] = 0; + _$jscoverage['middleware/limit.js'][32] = 0; + _$jscoverage['middleware/limit.js'][33] = 0; + _$jscoverage['middleware/limit.js'][34] = 0; + _$jscoverage['middleware/limit.js'][35] = 0; + _$jscoverage['middleware/limit.js'][41] = 0; + _$jscoverage['middleware/limit.js'][42] = 0; + _$jscoverage['middleware/limit.js'][45] = 0; + _$jscoverage['middleware/limit.js'][48] = 0; + _$jscoverage['middleware/limit.js'][49] = 0; + _$jscoverage['middleware/limit.js'][50] = 0; + _$jscoverage['middleware/limit.js'][53] = 0; +} +_$jscoverage['middleware/limit.js'][12]++; +var utils = require("../utils"); +_$jscoverage['middleware/limit.js'][31]++; +module.exports = (function limit(bytes) { + _$jscoverage['middleware/limit.js'][32]++; + if ("string" == typeof bytes) { + _$jscoverage['middleware/limit.js'][32]++; + bytes = utils.parseBytes(bytes); + } + _$jscoverage['middleware/limit.js'][33]++; + if ("number" != typeof bytes) { + _$jscoverage['middleware/limit.js'][33]++; + throw new Error("limit() bytes required"); + } + _$jscoverage['middleware/limit.js'][34]++; + return (function limit(req, res, next) { + _$jscoverage['middleware/limit.js'][35]++; + var received = 0, len = req.headers["content-length"]? parseInt(req.headers["content-length"], 10): null; + _$jscoverage['middleware/limit.js'][41]++; + if (req._limit) { + _$jscoverage['middleware/limit.js'][41]++; + return next(); + } + _$jscoverage['middleware/limit.js'][42]++; + req._limit = true; + _$jscoverage['middleware/limit.js'][45]++; + if (len && len > bytes) { + _$jscoverage['middleware/limit.js'][45]++; + return next(utils.error(413)); + } + _$jscoverage['middleware/limit.js'][48]++; + req.on("data", (function (chunk) { + _$jscoverage['middleware/limit.js'][49]++; + received += chunk.length; + _$jscoverage['middleware/limit.js'][50]++; + if (received > bytes) { + _$jscoverage['middleware/limit.js'][50]++; + req.destroy(); + } +})); + _$jscoverage['middleware/limit.js'][53]++; + next(); +}); +}); +_$jscoverage['middleware/limit.js'].source = ["","/*!"," * Connect - limit"," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils');","","/**"," * Limit:"," *"," * Limit request bodies to the given size in `bytes`."," *"," * A string representation of the bytesize may also be passed,"," * for example \"5mb\", \"200kb\", \"1gb\", etc."," *"," * connect()"," * .use(connect.limit('5.5mb'))"," * .use(handleImageUpload)"," *"," * @param {Number|String} bytes"," * @return {Function}"," * @api public"," */","","module.exports = function limit(bytes){"," if ('string' == typeof bytes) bytes = utils.parseBytes(bytes);"," if ('number' != typeof bytes) throw new Error('limit() bytes required');"," return function limit(req, res, next){"," var received = 0"," , len = req.headers['content-length']"," ? parseInt(req.headers['content-length'], 10)"," : null;",""," // self-awareness"," if (req._limit) return next();"," req._limit = true;",""," // limit by content-length"," if (len && len > bytes) return next(utils.error(413));",""," // limit"," req.on('data', function(chunk){"," received += chunk.length;"," if (received > bytes) req.destroy();"," });",""," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/logger.js b/node_modules/express/node_modules/connect/lib-cov/middleware/logger.js new file mode 100644 index 0000000..75c7a00 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/logger.js @@ -0,0 +1,312 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/logger.js']) { + _$jscoverage['middleware/logger.js'] = []; + _$jscoverage['middleware/logger.js'][12] = 0; + _$jscoverage['middleware/logger.js'][18] = 0; + _$jscoverage['middleware/logger.js'][24] = 0; + _$jscoverage['middleware/logger.js'][90] = 0; + _$jscoverage['middleware/logger.js'][91] = 0; + _$jscoverage['middleware/logger.js'][92] = 0; + _$jscoverage['middleware/logger.js'][93] = 0; + _$jscoverage['middleware/logger.js'][94] = 0; + _$jscoverage['middleware/logger.js'][96] = 0; + _$jscoverage['middleware/logger.js'][100] = 0; + _$jscoverage['middleware/logger.js'][103] = 0; + _$jscoverage['middleware/logger.js'][106] = 0; + _$jscoverage['middleware/logger.js'][109] = 0; + _$jscoverage['middleware/logger.js'][113] = 0; + _$jscoverage['middleware/logger.js'][114] = 0; + _$jscoverage['middleware/logger.js'][120] = 0; + _$jscoverage['middleware/logger.js'][121] = 0; + _$jscoverage['middleware/logger.js'][122] = 0; + _$jscoverage['middleware/logger.js'][123] = 0; + _$jscoverage['middleware/logger.js'][128] = 0; + _$jscoverage['middleware/logger.js'][130] = 0; + _$jscoverage['middleware/logger.js'][135] = 0; + _$jscoverage['middleware/logger.js'][136] = 0; + _$jscoverage['middleware/logger.js'][139] = 0; + _$jscoverage['middleware/logger.js'][140] = 0; + _$jscoverage['middleware/logger.js'][141] = 0; + _$jscoverage['middleware/logger.js'][142] = 0; + _$jscoverage['middleware/logger.js'][145] = 0; + _$jscoverage['middleware/logger.js'][146] = 0; + _$jscoverage['middleware/logger.js'][147] = 0; + _$jscoverage['middleware/logger.js'][148] = 0; + _$jscoverage['middleware/logger.js'][149] = 0; + _$jscoverage['middleware/logger.js'][150] = 0; + _$jscoverage['middleware/logger.js'][151] = 0; + _$jscoverage['middleware/logger.js'][156] = 0; + _$jscoverage['middleware/logger.js'][168] = 0; + _$jscoverage['middleware/logger.js'][169] = 0; + _$jscoverage['middleware/logger.js'][170] = 0; + _$jscoverage['middleware/logger.js'][171] = 0; + _$jscoverage['middleware/logger.js'][173] = 0; + _$jscoverage['middleware/logger.js'][174] = 0; + _$jscoverage['middleware/logger.js'][186] = 0; + _$jscoverage['middleware/logger.js'][187] = 0; + _$jscoverage['middleware/logger.js'][188] = 0; + _$jscoverage['middleware/logger.js'][200] = 0; + _$jscoverage['middleware/logger.js'][201] = 0; + _$jscoverage['middleware/logger.js'][202] = 0; + _$jscoverage['middleware/logger.js'][209] = 0; + _$jscoverage['middleware/logger.js'][215] = 0; + _$jscoverage['middleware/logger.js'][221] = 0; + _$jscoverage['middleware/logger.js'][227] = 0; + _$jscoverage['middleware/logger.js'][228] = 0; + _$jscoverage['middleware/logger.js'][232] = 0; + _$jscoverage['middleware/logger.js'][233] = 0; + _$jscoverage['middleware/logger.js'][234] = 0; + _$jscoverage['middleware/logger.js'][236] = 0; + _$jscoverage['middleware/logger.js'][240] = 0; + _$jscoverage['middleware/logger.js'][253] = 0; + _$jscoverage['middleware/logger.js'][254] = 0; + _$jscoverage['middleware/logger.js'][261] = 0; + _$jscoverage['middleware/logger.js'][262] = 0; + _$jscoverage['middleware/logger.js'][269] = 0; + _$jscoverage['middleware/logger.js'][270] = 0; + _$jscoverage['middleware/logger.js'][277] = 0; + _$jscoverage['middleware/logger.js'][278] = 0; + _$jscoverage['middleware/logger.js'][285] = 0; + _$jscoverage['middleware/logger.js'][286] = 0; + _$jscoverage['middleware/logger.js'][293] = 0; + _$jscoverage['middleware/logger.js'][294] = 0; + _$jscoverage['middleware/logger.js'][301] = 0; + _$jscoverage['middleware/logger.js'][302] = 0; + _$jscoverage['middleware/logger.js'][303] = 0; + _$jscoverage['middleware/logger.js'][304] = 0; + _$jscoverage['middleware/logger.js'][305] = 0; + _$jscoverage['middleware/logger.js'][312] = 0; + _$jscoverage['middleware/logger.js'][313] = 0; + _$jscoverage['middleware/logger.js'][320] = 0; + _$jscoverage['middleware/logger.js'][321] = 0; + _$jscoverage['middleware/logger.js'][328] = 0; + _$jscoverage['middleware/logger.js'][329] = 0; + _$jscoverage['middleware/logger.js'][336] = 0; + _$jscoverage['middleware/logger.js'][337] = 0; +} +_$jscoverage['middleware/logger.js'][12]++; +var bytes = require("bytes"); +_$jscoverage['middleware/logger.js'][18]++; +var buf = []; +_$jscoverage['middleware/logger.js'][24]++; +var defaultBufferDuration = 1000; +_$jscoverage['middleware/logger.js'][90]++; +exports = module.exports = (function logger(options) { + _$jscoverage['middleware/logger.js'][91]++; + if ("object" == typeof options) { + _$jscoverage['middleware/logger.js'][92]++; + options = options || {}; + } + else { + _$jscoverage['middleware/logger.js'][93]++; + if (options) { + _$jscoverage['middleware/logger.js'][94]++; + options = {format: options}; + } + else { + _$jscoverage['middleware/logger.js'][96]++; + options = {}; + } + } + _$jscoverage['middleware/logger.js'][100]++; + var immediate = options.immediate; + _$jscoverage['middleware/logger.js'][103]++; + var fmt = exports[options.format] || options.format || exports["default"]; + _$jscoverage['middleware/logger.js'][106]++; + if ("function" != typeof fmt) { + _$jscoverage['middleware/logger.js'][106]++; + fmt = compile(fmt); + } + _$jscoverage['middleware/logger.js'][109]++; + var stream = options.stream || process.stdout, buffer = options.buffer; + _$jscoverage['middleware/logger.js'][113]++; + if (buffer) { + _$jscoverage['middleware/logger.js'][114]++; + var realStream = stream, interval = "number" == typeof buffer? buffer: defaultBufferDuration; + _$jscoverage['middleware/logger.js'][120]++; + setInterval((function () { + _$jscoverage['middleware/logger.js'][121]++; + if (buf.length) { + _$jscoverage['middleware/logger.js'][122]++; + realStream.write(buf.join("")); + _$jscoverage['middleware/logger.js'][123]++; + buf.length = 0; + } +}), interval); + _$jscoverage['middleware/logger.js'][128]++; + stream = {write: (function (str) { + _$jscoverage['middleware/logger.js'][130]++; + buf.push(str); +})}; + } + _$jscoverage['middleware/logger.js'][135]++; + return (function logger(req, res, next) { + _$jscoverage['middleware/logger.js'][136]++; + req._startTime = new Date(); + _$jscoverage['middleware/logger.js'][139]++; + if (immediate) { + _$jscoverage['middleware/logger.js'][140]++; + var line = fmt(exports, req, res); + _$jscoverage['middleware/logger.js'][141]++; + if (null == line) { + _$jscoverage['middleware/logger.js'][141]++; + return; + } + _$jscoverage['middleware/logger.js'][142]++; + stream.write(line + "\n"); + } + else { + _$jscoverage['middleware/logger.js'][145]++; + var end = res.end; + _$jscoverage['middleware/logger.js'][146]++; + res.end = (function (chunk, encoding) { + _$jscoverage['middleware/logger.js'][147]++; + res.end = end; + _$jscoverage['middleware/logger.js'][148]++; + res.end(chunk, encoding); + _$jscoverage['middleware/logger.js'][149]++; + var line = fmt(exports, req, res); + _$jscoverage['middleware/logger.js'][150]++; + if (null == line) { + _$jscoverage['middleware/logger.js'][150]++; + return; + } + _$jscoverage['middleware/logger.js'][151]++; + stream.write(line + "\n"); +}); + } + _$jscoverage['middleware/logger.js'][156]++; + next(); +}); +}); +_$jscoverage['middleware/logger.js'][168]++; +function compile(fmt) { + _$jscoverage['middleware/logger.js'][169]++; + fmt = fmt.replace(/"/g, "\\\""); + _$jscoverage['middleware/logger.js'][170]++; + var js = " return \"" + fmt.replace(/:([-\w]{2,})(?:\[([^\]]+)\])?/g, (function (_, name, arg) { + _$jscoverage['middleware/logger.js'][171]++; + return "\"\n + (tokens[\"" + name + "\"](req, res, \"" + arg + "\") || \"-\") + \""; +})) + "\";"; + _$jscoverage['middleware/logger.js'][173]++; + return new Function("tokens, req, res", js); +} +_$jscoverage['middleware/logger.js'][174]++; +; +_$jscoverage['middleware/logger.js'][186]++; +exports.token = (function (name, fn) { + _$jscoverage['middleware/logger.js'][187]++; + exports[name] = fn; + _$jscoverage['middleware/logger.js'][188]++; + return this; +}); +_$jscoverage['middleware/logger.js'][200]++; +exports.format = (function (name, str) { + _$jscoverage['middleware/logger.js'][201]++; + exports[name] = str; + _$jscoverage['middleware/logger.js'][202]++; + return this; +}); +_$jscoverage['middleware/logger.js'][209]++; +exports.format("default", ":remote-addr - - [:date] \":method :url HTTP/:http-version\" :status :res[content-length] \":referrer\" \":user-agent\""); +_$jscoverage['middleware/logger.js'][215]++; +exports.format("short", ":remote-addr - :method :url HTTP/:http-version :status :res[content-length] - :response-time ms"); +_$jscoverage['middleware/logger.js'][221]++; +exports.format("tiny", ":method :url :status :res[content-length] - :response-time ms"); +_$jscoverage['middleware/logger.js'][227]++; +exports.format("dev", (function (tokens, req, res) { + _$jscoverage['middleware/logger.js'][228]++; + var status = res.statusCode, len = parseInt(res.getHeader("Content-Length"), 10), color = 32; + _$jscoverage['middleware/logger.js'][232]++; + if (status >= 500) { + _$jscoverage['middleware/logger.js'][232]++; + color = 31; + } + else { + _$jscoverage['middleware/logger.js'][233]++; + if (status >= 400) { + _$jscoverage['middleware/logger.js'][233]++; + color = 33; + } + else { + _$jscoverage['middleware/logger.js'][234]++; + if (status >= 300) { + _$jscoverage['middleware/logger.js'][234]++; + color = 36; + } + } + } + _$jscoverage['middleware/logger.js'][236]++; + len = isNaN(len)? "": len = " - " + bytes(len); + _$jscoverage['middleware/logger.js'][240]++; + return "\u001b[90m" + req.method + " " + req.originalUrl + " " + "\u001b[" + color + "m" + res.statusCode + " \u001b[90m" + (new Date() - req._startTime) + "ms" + len + "\u001b[0m"; +})); +_$jscoverage['middleware/logger.js'][253]++; +exports.token("url", (function (req) { + _$jscoverage['middleware/logger.js'][254]++; + return req.originalUrl || req.url; +})); +_$jscoverage['middleware/logger.js'][261]++; +exports.token("method", (function (req) { + _$jscoverage['middleware/logger.js'][262]++; + return req.method; +})); +_$jscoverage['middleware/logger.js'][269]++; +exports.token("response-time", (function (req) { + _$jscoverage['middleware/logger.js'][270]++; + return new Date() - req._startTime; +})); +_$jscoverage['middleware/logger.js'][277]++; +exports.token("date", (function () { + _$jscoverage['middleware/logger.js'][278]++; + return new Date().toUTCString(); +})); +_$jscoverage['middleware/logger.js'][285]++; +exports.token("status", (function (req, res) { + _$jscoverage['middleware/logger.js'][286]++; + return res.statusCode; +})); +_$jscoverage['middleware/logger.js'][293]++; +exports.token("referrer", (function (req) { + _$jscoverage['middleware/logger.js'][294]++; + return req.headers.referer || req.headers.referrer; +})); +_$jscoverage['middleware/logger.js'][301]++; +exports.token("remote-addr", (function (req) { + _$jscoverage['middleware/logger.js'][302]++; + if (req.ip) { + _$jscoverage['middleware/logger.js'][302]++; + return req.ip; + } + _$jscoverage['middleware/logger.js'][303]++; + var sock = req.socket; + _$jscoverage['middleware/logger.js'][304]++; + if (sock.socket) { + _$jscoverage['middleware/logger.js'][304]++; + return sock.socket.remoteAddress; + } + _$jscoverage['middleware/logger.js'][305]++; + return sock.remoteAddress; +})); +_$jscoverage['middleware/logger.js'][312]++; +exports.token("http-version", (function (req) { + _$jscoverage['middleware/logger.js'][313]++; + return req.httpVersionMajor + "." + req.httpVersionMinor; +})); +_$jscoverage['middleware/logger.js'][320]++; +exports.token("user-agent", (function (req) { + _$jscoverage['middleware/logger.js'][321]++; + return req.headers["user-agent"]; +})); +_$jscoverage['middleware/logger.js'][328]++; +exports.token("req", (function (req, res, field) { + _$jscoverage['middleware/logger.js'][329]++; + return req.headers[field.toLowerCase()]; +})); +_$jscoverage['middleware/logger.js'][336]++; +exports.token("res", (function (req, res, field) { + _$jscoverage['middleware/logger.js'][337]++; + return (res._headers || {})[field.toLowerCase()]; +})); +_$jscoverage['middleware/logger.js'].source = ["/*!"," * Connect - logger"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var bytes = require('bytes');","","/*!"," * Log buffer."," */","","var buf = [];","","/*!"," * Default log buffer duration."," */","","var defaultBufferDuration = 1000;","","/**"," * Logger:"," *"," * Log requests with the given `options` or a `format` string."," *"," * Options:"," *"," * - `format` Format string, see below for tokens"," * - `stream` Output stream, defaults to _stdout_"," * - `buffer` Buffer duration, defaults to 1000ms when _true_"," * - `immediate` Write log line on request instead of response (for response times)"," *"," * Tokens:"," *"," * - `:req[header]` ex: `:req[Accept]`"," * - `:res[header]` ex: `:res[Content-Length]`"," * - `:http-version`"," * - `:response-time`"," * - `:remote-addr`"," * - `:date`"," * - `:method`"," * - `:url`"," * - `:referrer`"," * - `:user-agent`"," * - `:status`"," *"," * Formats:"," *"," * Pre-defined formats that ship with connect:"," *"," * - `default` ':remote-addr - - [:date] \":method :url HTTP/:http-version\" :status :res[content-length] \":referrer\" \":user-agent\"'"," * - `short` ':remote-addr - :method :url HTTP/:http-version :status :res[content-length] - :response-time ms'"," * - `tiny` ':method :url :status :res[content-length] - :response-time ms'"," * - `dev` concise output colored by response status for development use"," *"," * Examples:"," *"," * connect.logger() // default"," * connect.logger('short')"," * connect.logger('tiny')"," * connect.logger({ immediate: true, format: 'dev' })"," * connect.logger(':method :url - :referrer')"," * connect.logger(':req[content-type] -> :res[content-type]')"," * connect.logger(function(tokens, req, res){ return 'some format string' })"," *"," * Defining Tokens:"," *"," * To define a token, simply invoke `connect.logger.token()` with the"," * name and a callback function. The value returned is then available"," * as \":type\" in this case."," *"," * connect.logger.token('type', function(req, res){ return req.headers['content-type']; })"," *"," * Defining Formats:"," *"," * All default formats are defined this way, however it's public API as well:"," *"," * connect.logger.format('name', 'string or function')"," *"," * @param {String|Function|Object} format or options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function logger(options) {"," if ('object' == typeof options) {"," options = options || {};"," } else if (options) {"," options = { format: options };"," } else {"," options = {};"," }",""," // output on request instead of response"," var immediate = options.immediate;",""," // format name"," var fmt = exports[options.format] || options.format || exports.default;",""," // compile format"," if ('function' != typeof fmt) fmt = compile(fmt);",""," // options"," var stream = options.stream || process.stdout"," , buffer = options.buffer;",""," // buffering support"," if (buffer) {"," var realStream = stream"," , interval = 'number' == typeof buffer"," ? buffer"," : defaultBufferDuration;",""," // flush interval"," setInterval(function(){"," if (buf.length) {"," realStream.write(buf.join(''));"," buf.length = 0;"," }"," }, interval); ",""," // swap the stream"," stream = {"," write: function(str){"," buf.push(str);"," }"," };"," }",""," return function logger(req, res, next) {"," req._startTime = new Date;",""," // immediate"," if (immediate) {"," var line = fmt(exports, req, res);"," if (null == line) return;"," stream.write(line + '\\n');"," // proxy end to output logging"," } else {"," var end = res.end;"," res.end = function(chunk, encoding){"," res.end = end;"," res.end(chunk, encoding);"," var line = fmt(exports, req, res);"," if (null == line) return;"," stream.write(line + '\\n');"," };"," }","",""," next();"," };","};","","/**"," * Compile `fmt` into a function."," *"," * @param {String} fmt"," * @return {Function}"," * @api private"," */","","function compile(fmt) {"," fmt = fmt.replace(/\"/g, '\\\\\"');"," var js = ' return \"' + fmt.replace(/:([-\\w]{2,})(?:\\[([^\\]]+)\\])?/g, function(_, name, arg){"," return '\"\\n + (tokens[\"' + name + '\"](req, res, \"' + arg + '\") || \"-\") + \"';"," }) + '\";'"," return new Function('tokens, req, res', js);","};","","/**"," * Define a token function with the given `name`,"," * and callback `fn(req, res)`."," *"," * @param {String} name"," * @param {Function} fn"," * @return {Object} exports for chaining"," * @api public"," */","","exports.token = function(name, fn) {"," exports[name] = fn;"," return this;","};","","/**"," * Define a `fmt` with the given `name`."," *"," * @param {String} name"," * @param {String|Function} fmt"," * @return {Object} exports for chaining"," * @api public"," */","","exports.format = function(name, str){"," exports[name] = str;"," return this;","};","","/**"," * Default format."," */","","exports.format('default', ':remote-addr - - [:date] \":method :url HTTP/:http-version\" :status :res[content-length] \":referrer\" \":user-agent\"');","","/**"," * Short format."," */","","exports.format('short', ':remote-addr - :method :url HTTP/:http-version :status :res[content-length] - :response-time ms');","","/**"," * Tiny format."," */","","exports.format('tiny', ':method :url :status :res[content-length] - :response-time ms');","","/**"," * dev (colored)"," */","","exports.format('dev', function(tokens, req, res){"," var status = res.statusCode"," , len = parseInt(res.getHeader('Content-Length'), 10)"," , color = 32;",""," if (status >= 500) color = 31"," else if (status >= 400) color = 33"," else if (status >= 300) color = 36;",""," len = isNaN(len)"," ? ''"," : len = ' - ' + bytes(len);",""," return '\\033[90m' + req.method"," + ' ' + req.originalUrl + ' '"," + '\\033[' + color + 'm' + res.statusCode"," + ' \\033[90m'"," + (new Date - req._startTime)"," + 'ms' + len"," + '\\033[0m';","});","","/**"," * request url"," */","","exports.token('url', function(req){"," return req.originalUrl || req.url;","});","","/**"," * request method"," */","","exports.token('method', function(req){"," return req.method;","});","","/**"," * response time in milliseconds"," */","","exports.token('response-time', function(req){"," return new Date - req._startTime;","});","","/**"," * UTC date"," */","","exports.token('date', function(){"," return new Date().toUTCString();","});","","/**"," * response status code"," */","","exports.token('status', function(req, res){"," return res.statusCode;","});","","/**"," * normalized referrer"," */","","exports.token('referrer', function(req){"," return req.headers['referer'] || req.headers['referrer'];","});","","/**"," * remote address"," */","","exports.token('remote-addr', function(req){"," if (req.ip) return req.ip;"," var sock = req.socket;"," if (sock.socket) return sock.socket.remoteAddress;"," return sock.remoteAddress;","});","","/**"," * HTTP version"," */","","exports.token('http-version', function(req){"," return req.httpVersionMajor + '.' + req.httpVersionMinor;","});","","/**"," * UA string"," */","","exports.token('user-agent', function(req){"," return req.headers['user-agent'];","});","","/**"," * request header"," */","","exports.token('req', function(req, res, field){"," return req.headers[field.toLowerCase()];","});","","/**"," * response header"," */","","exports.token('res', function(req, res, field){"," return (res._headers || {})[field.toLowerCase()];","});",""]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/methodOverride.js b/node_modules/express/node_modules/connect/lib-cov/middleware/methodOverride.js new file mode 100644 index 0000000..0a9118c --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/methodOverride.js @@ -0,0 +1,42 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/methodOverride.js']) { + _$jscoverage['middleware/methodOverride.js'] = []; + _$jscoverage['middleware/methodOverride.js'][23] = 0; + _$jscoverage['middleware/methodOverride.js'][24] = 0; + _$jscoverage['middleware/methodOverride.js'][25] = 0; + _$jscoverage['middleware/methodOverride.js'][26] = 0; + _$jscoverage['middleware/methodOverride.js'][29] = 0; + _$jscoverage['middleware/methodOverride.js'][30] = 0; + _$jscoverage['middleware/methodOverride.js'][31] = 0; + _$jscoverage['middleware/methodOverride.js'][33] = 0; + _$jscoverage['middleware/methodOverride.js'][34] = 0; + _$jscoverage['middleware/methodOverride.js'][37] = 0; +} +_$jscoverage['middleware/methodOverride.js'][23]++; +module.exports = (function methodOverride(key) { + _$jscoverage['middleware/methodOverride.js'][24]++; + key = key || "_method"; + _$jscoverage['middleware/methodOverride.js'][25]++; + return (function methodOverride(req, res, next) { + _$jscoverage['middleware/methodOverride.js'][26]++; + req.originalMethod = req.originalMethod || req.method; + _$jscoverage['middleware/methodOverride.js'][29]++; + if (req.body && key in req.body) { + _$jscoverage['middleware/methodOverride.js'][30]++; + req.method = req.body[key].toUpperCase(); + _$jscoverage['middleware/methodOverride.js'][31]++; + delete req.body[key]; + } + else { + _$jscoverage['middleware/methodOverride.js'][33]++; + if (req.headers["x-http-method-override"]) { + _$jscoverage['middleware/methodOverride.js'][34]++; + req.method = req.headers["x-http-method-override"].toUpperCase(); + } + } + _$jscoverage['middleware/methodOverride.js'][37]++; + next(); +}); +}); +_$jscoverage['middleware/methodOverride.js'].source = ["","/*!"," * Connect - methodOverride"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Method Override:"," * "," * Provides faux HTTP method support."," * "," * Pass an optional `key` to use when checking for"," * a method override, othewise defaults to _\\_method_."," * The original method is available via `req.originalMethod`."," *"," * @param {String} key"," * @return {Function}"," * @api public"," */","","module.exports = function methodOverride(key){"," key = key || \"_method\";"," return function methodOverride(req, res, next) {"," req.originalMethod = req.originalMethod || req.method;",""," // req.body"," if (req.body && key in req.body) {"," req.method = req.body[key].toUpperCase();"," delete req.body[key];"," // check X-HTTP-Method-Override"," } else if (req.headers['x-http-method-override']) {"," req.method = req.headers['x-http-method-override'].toUpperCase();"," }"," "," next();"," };","};",""]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/multipart.js b/node_modules/express/node_modules/connect/lib-cov/middleware/multipart.js new file mode 100644 index 0000000..dfcde09 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/multipart.js @@ -0,0 +1,183 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/multipart.js']) { + _$jscoverage['middleware/multipart.js'] = []; + _$jscoverage['middleware/multipart.js'][12] = 0; + _$jscoverage['middleware/multipart.js'][21] = 0; + _$jscoverage['middleware/multipart.js'][22] = 0; + _$jscoverage['middleware/multipart.js'][52] = 0; + _$jscoverage['middleware/multipart.js'][53] = 0; + _$jscoverage['middleware/multipart.js'][55] = 0; + _$jscoverage['middleware/multipart.js'][59] = 0; + _$jscoverage['middleware/multipart.js'][60] = 0; + _$jscoverage['middleware/multipart.js'][61] = 0; + _$jscoverage['middleware/multipart.js'][62] = 0; + _$jscoverage['middleware/multipart.js'][64] = 0; + _$jscoverage['middleware/multipart.js'][67] = 0; + _$jscoverage['middleware/multipart.js'][70] = 0; + _$jscoverage['middleware/multipart.js'][73] = 0; + _$jscoverage['middleware/multipart.js'][76] = 0; + _$jscoverage['middleware/multipart.js'][77] = 0; + _$jscoverage['middleware/multipart.js'][79] = 0; + _$jscoverage['middleware/multipart.js'][84] = 0; + _$jscoverage['middleware/multipart.js'][85] = 0; + _$jscoverage['middleware/multipart.js'][88] = 0; + _$jscoverage['middleware/multipart.js'][89] = 0; + _$jscoverage['middleware/multipart.js'][90] = 0; + _$jscoverage['middleware/multipart.js'][91] = 0; + _$jscoverage['middleware/multipart.js'][92] = 0; + _$jscoverage['middleware/multipart.js'][94] = 0; + _$jscoverage['middleware/multipart.js'][98] = 0; + _$jscoverage['middleware/multipart.js'][99] = 0; + _$jscoverage['middleware/multipart.js'][102] = 0; + _$jscoverage['middleware/multipart.js'][103] = 0; + _$jscoverage['middleware/multipart.js'][106] = 0; + _$jscoverage['middleware/multipart.js'][107] = 0; + _$jscoverage['middleware/multipart.js'][108] = 0; + _$jscoverage['middleware/multipart.js'][109] = 0; + _$jscoverage['middleware/multipart.js'][111] = 0; + _$jscoverage['middleware/multipart.js'][114] = 0; + _$jscoverage['middleware/multipart.js'][115] = 0; + _$jscoverage['middleware/multipart.js'][116] = 0; + _$jscoverage['middleware/multipart.js'][117] = 0; + _$jscoverage['middleware/multipart.js'][118] = 0; + _$jscoverage['middleware/multipart.js'][119] = 0; + _$jscoverage['middleware/multipart.js'][121] = 0; + _$jscoverage['middleware/multipart.js'][125] = 0; + _$jscoverage['middleware/multipart.js'][127] = 0; + _$jscoverage['middleware/multipart.js'][128] = 0; + _$jscoverage['middleware/multipart.js'][129] = 0; +} +_$jscoverage['middleware/multipart.js'][12]++; +var formidable = require("formidable"), _limit = require("./limit"), utils = require("../utils"), qs = require("qs"); +_$jscoverage['middleware/multipart.js'][21]++; +function noop(req, res, next) { + _$jscoverage['middleware/multipart.js'][22]++; + next(); +} +_$jscoverage['middleware/multipart.js'][52]++; +exports = module.exports = (function (options) { + _$jscoverage['middleware/multipart.js'][53]++; + options = options || {}; + _$jscoverage['middleware/multipart.js'][55]++; + var limit = options.limit? _limit(options.limit): noop; + _$jscoverage['middleware/multipart.js'][59]++; + return (function multipart(req, res, next) { + _$jscoverage['middleware/multipart.js'][60]++; + if (req._body) { + _$jscoverage['middleware/multipart.js'][60]++; + return next(); + } + _$jscoverage['middleware/multipart.js'][61]++; + req.body = req.body || {}; + _$jscoverage['middleware/multipart.js'][62]++; + req.files = req.files || {}; + _$jscoverage['middleware/multipart.js'][64]++; + if (! utils.hasBody(req)) { + _$jscoverage['middleware/multipart.js'][64]++; + return next(); + } + _$jscoverage['middleware/multipart.js'][67]++; + if ("GET" == req.method || "HEAD" == req.method) { + _$jscoverage['middleware/multipart.js'][67]++; + return next(); + } + _$jscoverage['middleware/multipart.js'][70]++; + if ("multipart/form-data" != utils.mime(req)) { + _$jscoverage['middleware/multipart.js'][70]++; + return next(); + } + _$jscoverage['middleware/multipart.js'][73]++; + req._body = true; + _$jscoverage['middleware/multipart.js'][76]++; + limit(req, res, (function (err) { + _$jscoverage['middleware/multipart.js'][77]++; + if (err) { + _$jscoverage['middleware/multipart.js'][77]++; + return next(err); + } + _$jscoverage['middleware/multipart.js'][79]++; + var form = new formidable.IncomingForm(), data = {}, files = {}, done; + _$jscoverage['middleware/multipart.js'][84]++; + Object.keys(options).forEach((function (key) { + _$jscoverage['middleware/multipart.js'][85]++; + form[key] = options[key]; +})); + _$jscoverage['middleware/multipart.js'][88]++; + function ondata(name, val, data) { + _$jscoverage['middleware/multipart.js'][89]++; + if (Array.isArray(data[name])) { + _$jscoverage['middleware/multipart.js'][90]++; + data[name].push(val); + } + else { + _$jscoverage['middleware/multipart.js'][91]++; + if (data[name]) { + _$jscoverage['middleware/multipart.js'][92]++; + data[name] = [data[name], val]; + } + else { + _$jscoverage['middleware/multipart.js'][94]++; + data[name] = val; + } + } +} + _$jscoverage['middleware/multipart.js'][98]++; + form.on("field", (function (name, val) { + _$jscoverage['middleware/multipart.js'][99]++; + ondata(name, val, data); +})); + _$jscoverage['middleware/multipart.js'][102]++; + form.on("file", (function (name, val) { + _$jscoverage['middleware/multipart.js'][103]++; + ondata(name, val, files); +})); + _$jscoverage['middleware/multipart.js'][106]++; + form.on("error", (function (err) { + _$jscoverage['middleware/multipart.js'][107]++; + if (! options.defer) { + _$jscoverage['middleware/multipart.js'][108]++; + err.status = 400; + _$jscoverage['middleware/multipart.js'][109]++; + next(err); + } + _$jscoverage['middleware/multipart.js'][111]++; + done = true; +})); + _$jscoverage['middleware/multipart.js'][114]++; + form.on("end", (function () { + _$jscoverage['middleware/multipart.js'][115]++; + if (done) { + _$jscoverage['middleware/multipart.js'][115]++; + return; + } + _$jscoverage['middleware/multipart.js'][116]++; + try { + _$jscoverage['middleware/multipart.js'][117]++; + req.body = qs.parse(data); + _$jscoverage['middleware/multipart.js'][118]++; + req.files = qs.parse(files); + _$jscoverage['middleware/multipart.js'][119]++; + if (! options.defer) { + _$jscoverage['middleware/multipart.js'][119]++; + next(); + } + } + catch (err) { + _$jscoverage['middleware/multipart.js'][121]++; + form.emit("error", err); + } +})); + _$jscoverage['middleware/multipart.js'][125]++; + form.parse(req); + _$jscoverage['middleware/multipart.js'][127]++; + if (options.defer) { + _$jscoverage['middleware/multipart.js'][128]++; + req.form = form; + _$jscoverage['middleware/multipart.js'][129]++; + next(); + } +})); +}); +}); +_$jscoverage['middleware/multipart.js'].source = ["/*!"," * Connect - multipart"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var formidable = require('formidable')"," , _limit = require('./limit')"," , utils = require('../utils')"," , qs = require('qs');","","/**"," * noop middleware."," */","","function noop(req, res, next) {"," next();","}","","/**"," * Multipart:"," * "," * Parse multipart/form-data request bodies,"," * providing the parsed object as `req.body`"," * and `req.files`."," *"," * Configuration:"," *"," * The options passed are merged with [formidable](https://github.com/felixge/node-formidable)'s"," * `IncomingForm` object, allowing you to configure the upload directory,"," * size limits, etc. For example if you wish to change the upload dir do the following."," *"," * app.use(connect.multipart({ uploadDir: path }));"," *"," * Options:"," *"," * - `limit` byte limit defaulting to none"," * - `defer` defers processing and exposes the Formidable form object as `req.form`."," * `next()` is called without waiting for the form's \"end\" event."," * This option is useful if you need to bind to the \"progress\" event, for example."," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function(options){"," options = options || {};",""," var limit = options.limit"," ? _limit(options.limit)"," : noop;",""," return function multipart(req, res, next) {"," if (req._body) return next();"," req.body = req.body || {};"," req.files = req.files || {};",""," if (!utils.hasBody(req)) return next();",""," // ignore GET"," if ('GET' == req.method || 'HEAD' == req.method) return next();",""," // check Content-Type"," if ('multipart/form-data' != utils.mime(req)) return next();",""," // flag as parsed"," req._body = true;",""," // parse"," limit(req, res, function(err){"," if (err) return next(err);",""," var form = new formidable.IncomingForm"," , data = {}"," , files = {}"," , done;",""," Object.keys(options).forEach(function(key){"," form[key] = options[key];"," });",""," function ondata(name, val, data){"," if (Array.isArray(data[name])) {"," data[name].push(val);"," } else if (data[name]) {"," data[name] = [data[name], val];"," } else {"," data[name] = val;"," }"," }",""," form.on('field', function(name, val){"," ondata(name, val, data);"," });",""," form.on('file', function(name, val){"," ondata(name, val, files);"," });",""," form.on('error', function(err){"," if (!options.defer) {"," err.status = 400;"," next(err);"," }"," done = true;"," });",""," form.on('end', function(){"," if (done) return;"," try {"," req.body = qs.parse(data);"," req.files = qs.parse(files);"," if (!options.defer) next();"," } catch (err) {"," form.emit('error', err);"," }"," });",""," form.parse(req);",""," if (options.defer) {"," req.form = form;"," next();"," }"," });"," }","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/query.js b/node_modules/express/node_modules/connect/lib-cov/middleware/query.js new file mode 100644 index 0000000..bd27ff6 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/query.js @@ -0,0 +1,27 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/query.js']) { + _$jscoverage['middleware/query.js'] = []; + _$jscoverage['middleware/query.js'][12] = 0; + _$jscoverage['middleware/query.js'][36] = 0; + _$jscoverage['middleware/query.js'][37] = 0; + _$jscoverage['middleware/query.js'][38] = 0; + _$jscoverage['middleware/query.js'][39] = 0; + _$jscoverage['middleware/query.js'][44] = 0; +} +_$jscoverage['middleware/query.js'][12]++; +var qs = require("qs"), parse = require("../utils").parseUrl; +_$jscoverage['middleware/query.js'][36]++; +module.exports = (function query(options) { + _$jscoverage['middleware/query.js'][37]++; + return (function query(req, res, next) { + _$jscoverage['middleware/query.js'][38]++; + if (! req.query) { + _$jscoverage['middleware/query.js'][39]++; + req.query = ~ req.url.indexOf("?")? qs.parse(parse(req).query, options): {}; + } + _$jscoverage['middleware/query.js'][44]++; + next(); +}); +}); +_$jscoverage['middleware/query.js'].source = ["/*!"," * Connect - query"," * Copyright(c) 2011 TJ Holowaychuk"," * Copyright(c) 2011 Sencha Inc."," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var qs = require('qs')"," , parse = require('../utils').parseUrl;","","/**"," * Query:"," *"," * Automatically parse the query-string when available,"," * populating the `req.query` object."," *"," * Examples:"," *"," * connect()"," * .use(connect.query())"," * .use(function(req, res){"," * res.end(JSON.stringify(req.query));"," * });"," *"," * The `options` passed are provided to qs.parse function."," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","module.exports = function query(options){"," return function query(req, res, next){"," if (!req.query) {"," req.query = ~req.url.indexOf('?')"," ? qs.parse(parse(req).query, options)"," : {};"," }",""," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/responseTime.js b/node_modules/express/node_modules/connect/lib-cov/middleware/responseTime.js new file mode 100644 index 0000000..954e040 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/responseTime.js @@ -0,0 +1,39 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/responseTime.js']) { + _$jscoverage['middleware/responseTime.js'] = []; + _$jscoverage['middleware/responseTime.js'][18] = 0; + _$jscoverage['middleware/responseTime.js'][19] = 0; + _$jscoverage['middleware/responseTime.js'][20] = 0; + _$jscoverage['middleware/responseTime.js'][22] = 0; + _$jscoverage['middleware/responseTime.js'][23] = 0; + _$jscoverage['middleware/responseTime.js'][25] = 0; + _$jscoverage['middleware/responseTime.js'][26] = 0; + _$jscoverage['middleware/responseTime.js'][27] = 0; + _$jscoverage['middleware/responseTime.js'][30] = 0; +} +_$jscoverage['middleware/responseTime.js'][18]++; +module.exports = (function responseTime() { + _$jscoverage['middleware/responseTime.js'][19]++; + return (function (req, res, next) { + _$jscoverage['middleware/responseTime.js'][20]++; + var start = new Date(); + _$jscoverage['middleware/responseTime.js'][22]++; + if (res._responseTime) { + _$jscoverage['middleware/responseTime.js'][22]++; + return next(); + } + _$jscoverage['middleware/responseTime.js'][23]++; + res._responseTime = true; + _$jscoverage['middleware/responseTime.js'][25]++; + res.on("header", (function () { + _$jscoverage['middleware/responseTime.js'][26]++; + var duration = new Date() - start; + _$jscoverage['middleware/responseTime.js'][27]++; + res.setHeader("X-Response-Time", duration + "ms"); +})); + _$jscoverage['middleware/responseTime.js'][30]++; + next(); +}); +}); +_$jscoverage['middleware/responseTime.js'].source = ["","/*!"," * Connect - responseTime"," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Reponse time:"," *"," * Adds the `X-Response-Time` header displaying the response"," * duration in milliseconds."," *"," * @return {Function}"," * @api public"," */","","module.exports = function responseTime(){"," return function(req, res, next){"," var start = new Date;",""," if (res._responseTime) return next();"," res._responseTime = true;",""," res.on('header', function(){"," var duration = new Date - start;"," res.setHeader('X-Response-Time', duration + 'ms');"," });",""," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/session.js b/node_modules/express/node_modules/connect/lib-cov/middleware/session.js new file mode 100644 index 0000000..5ff99f8 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/session.js @@ -0,0 +1,321 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/session.js']) { + _$jscoverage['middleware/session.js'] = []; + _$jscoverage['middleware/session.js'][13] = 0; + _$jscoverage['middleware/session.js'][25] = 0; + _$jscoverage['middleware/session.js'][31] = 0; + _$jscoverage['middleware/session.js'][37] = 0; + _$jscoverage['middleware/session.js'][38] = 0; + _$jscoverage['middleware/session.js'][39] = 0; + _$jscoverage['middleware/session.js'][40] = 0; + _$jscoverage['middleware/session.js'][46] = 0; + _$jscoverage['middleware/session.js'][188] = 0; + _$jscoverage['middleware/session.js'][189] = 0; + _$jscoverage['middleware/session.js'][198] = 0; + _$jscoverage['middleware/session.js'][199] = 0; + _$jscoverage['middleware/session.js'][203] = 0; + _$jscoverage['middleware/session.js'][204] = 0; + _$jscoverage['middleware/session.js'][205] = 0; + _$jscoverage['middleware/session.js'][206] = 0; + _$jscoverage['middleware/session.js'][209] = 0; + _$jscoverage['middleware/session.js'][210] = 0; + _$jscoverage['middleware/session.js'][212] = 0; + _$jscoverage['middleware/session.js'][214] = 0; + _$jscoverage['middleware/session.js'][218] = 0; + _$jscoverage['middleware/session.js'][221] = 0; + _$jscoverage['middleware/session.js'][225] = 0; + _$jscoverage['middleware/session.js'][228] = 0; + _$jscoverage['middleware/session.js'][231] = 0; + _$jscoverage['middleware/session.js'][235] = 0; + _$jscoverage['middleware/session.js'][238] = 0; + _$jscoverage['middleware/session.js'][241] = 0; + _$jscoverage['middleware/session.js'][243] = 0; + _$jscoverage['middleware/session.js'][244] = 0; + _$jscoverage['middleware/session.js'][248] = 0; + _$jscoverage['middleware/session.js'][249] = 0; + _$jscoverage['middleware/session.js'][250] = 0; + _$jscoverage['middleware/session.js'][257] = 0; + _$jscoverage['middleware/session.js'][260] = 0; + _$jscoverage['middleware/session.js'][261] = 0; + _$jscoverage['middleware/session.js'][263] = 0; + _$jscoverage['middleware/session.js'][264] = 0; + _$jscoverage['middleware/session.js'][267] = 0; + _$jscoverage['middleware/session.js'][268] = 0; + _$jscoverage['middleware/session.js'][269] = 0; + _$jscoverage['middleware/session.js'][270] = 0; + _$jscoverage['middleware/session.js'][274] = 0; + _$jscoverage['middleware/session.js'][275] = 0; + _$jscoverage['middleware/session.js'][276] = 0; + _$jscoverage['middleware/session.js'][277] = 0; + _$jscoverage['middleware/session.js'][278] = 0; + _$jscoverage['middleware/session.js'][279] = 0; + _$jscoverage['middleware/session.js'][280] = 0; + _$jscoverage['middleware/session.js'][281] = 0; + _$jscoverage['middleware/session.js'][282] = 0; + _$jscoverage['middleware/session.js'][287] = 0; + _$jscoverage['middleware/session.js'][288] = 0; + _$jscoverage['middleware/session.js'][292] = 0; + _$jscoverage['middleware/session.js'][295] = 0; + _$jscoverage['middleware/session.js'][296] = 0; + _$jscoverage['middleware/session.js'][297] = 0; + _$jscoverage['middleware/session.js'][298] = 0; + _$jscoverage['middleware/session.js'][299] = 0; + _$jscoverage['middleware/session.js'][303] = 0; + _$jscoverage['middleware/session.js'][304] = 0; + _$jscoverage['middleware/session.js'][305] = 0; + _$jscoverage['middleware/session.js'][307] = 0; + _$jscoverage['middleware/session.js'][308] = 0; + _$jscoverage['middleware/session.js'][309] = 0; + _$jscoverage['middleware/session.js'][310] = 0; + _$jscoverage['middleware/session.js'][314] = 0; + _$jscoverage['middleware/session.js'][315] = 0; + _$jscoverage['middleware/session.js'][316] = 0; + _$jscoverage['middleware/session.js'][317] = 0; + _$jscoverage['middleware/session.js'][318] = 0; + _$jscoverage['middleware/session.js'][320] = 0; + _$jscoverage['middleware/session.js'][323] = 0; + _$jscoverage['middleware/session.js'][324] = 0; + _$jscoverage['middleware/session.js'][325] = 0; + _$jscoverage['middleware/session.js'][326] = 0; + _$jscoverage['middleware/session.js'][329] = 0; + _$jscoverage['middleware/session.js'][330] = 0; + _$jscoverage['middleware/session.js'][331] = 0; + _$jscoverage['middleware/session.js'][332] = 0; + _$jscoverage['middleware/session.js'][333] = 0; + _$jscoverage['middleware/session.js'][337] = 0; + _$jscoverage['middleware/session.js'][348] = 0; + _$jscoverage['middleware/session.js'][349] = 0; + _$jscoverage['middleware/session.js'][350] = 0; +} +_$jscoverage['middleware/session.js'][13]++; +var Session = require("./session/session"), debug = require("debug")("connect:session"), MemoryStore = require("./session/memory"), signature = require("cookie-signature"), Cookie = require("./session/cookie"), Store = require("./session/store"), utils = require("./../utils"), parse = utils.parseUrl, crc16 = require("crc").crc16; +_$jscoverage['middleware/session.js'][25]++; +var env = process.env.NODE_ENV; +_$jscoverage['middleware/session.js'][31]++; +exports = module.exports = session; +_$jscoverage['middleware/session.js'][37]++; +exports.Store = Store; +_$jscoverage['middleware/session.js'][38]++; +exports.Cookie = Cookie; +_$jscoverage['middleware/session.js'][39]++; +exports.Session = Session; +_$jscoverage['middleware/session.js'][40]++; +exports.MemoryStore = MemoryStore; +_$jscoverage['middleware/session.js'][46]++; +var warning = "Warning: connection.session() MemoryStore is not\ndesigned for a production environment, as it will leak\nmemory, and will not scale past a single process."; +_$jscoverage['middleware/session.js'][188]++; +function session(options) { + _$jscoverage['middleware/session.js'][189]++; + var options = options || {}, key = options.key || "connect.sid", store = options.store || new MemoryStore(), cookie = options.cookie || {}, trustProxy = options.proxy, storeReady = true; + _$jscoverage['middleware/session.js'][198]++; + if ("production" == env && store instanceof MemoryStore) { + _$jscoverage['middleware/session.js'][199]++; + console.warn(warning); + } + _$jscoverage['middleware/session.js'][203]++; + store.generate = (function (req) { + _$jscoverage['middleware/session.js'][204]++; + req.sessionID = utils.uid(24); + _$jscoverage['middleware/session.js'][205]++; + req.session = new Session(req); + _$jscoverage['middleware/session.js'][206]++; + req.session.cookie = new Cookie(cookie); +}); + _$jscoverage['middleware/session.js'][209]++; + store.on("disconnect", (function () { + _$jscoverage['middleware/session.js'][209]++; + storeReady = false; +})); + _$jscoverage['middleware/session.js'][210]++; + store.on("connect", (function () { + _$jscoverage['middleware/session.js'][210]++; + storeReady = true; +})); + _$jscoverage['middleware/session.js'][212]++; + return (function session(req, res, next) { + _$jscoverage['middleware/session.js'][214]++; + if (req.session) { + _$jscoverage['middleware/session.js'][214]++; + return next(); + } + _$jscoverage['middleware/session.js'][218]++; + if (! storeReady) { + _$jscoverage['middleware/session.js'][218]++; + return debug("store is disconnected"), next(); + } + _$jscoverage['middleware/session.js'][221]++; + if (0 != req.originalUrl.indexOf(cookie.path || "/")) { + _$jscoverage['middleware/session.js'][221]++; + return next(); + } + _$jscoverage['middleware/session.js'][225]++; + var secret = options.secret || req.secret; + _$jscoverage['middleware/session.js'][228]++; + if (! secret) { + _$jscoverage['middleware/session.js'][228]++; + throw new Error("`secret` option required for sessions"); + } + _$jscoverage['middleware/session.js'][231]++; + var originalHash, originalId; + _$jscoverage['middleware/session.js'][235]++; + req.sessionStore = store; + _$jscoverage['middleware/session.js'][238]++; + var rawCookie = req.cookies[key]; + _$jscoverage['middleware/session.js'][241]++; + var unsignedCookie = req.signedCookies[key]; + _$jscoverage['middleware/session.js'][243]++; + if (! unsignedCookie && rawCookie) { + _$jscoverage['middleware/session.js'][244]++; + unsignedCookie = utils.parseSignedCookie(rawCookie, secret); + } + _$jscoverage['middleware/session.js'][248]++; + res.on("header", (function () { + _$jscoverage['middleware/session.js'][249]++; + if (! req.session) { + _$jscoverage['middleware/session.js'][249]++; + return; + } + _$jscoverage['middleware/session.js'][250]++; + var cookie = req.session.cookie, proto = (req.headers["x-forwarded-proto"] || "").toLowerCase(), tls = req.connection.encrypted || (trustProxy && "https" == proto), secured = cookie.secure && tls, isNew = unsignedCookie != req.sessionID; + _$jscoverage['middleware/session.js'][257]++; + if (cookie.secure && ! secured) { + _$jscoverage['middleware/session.js'][257]++; + return debug("not secured"); + } + _$jscoverage['middleware/session.js'][260]++; + if (null == cookie.expires) { + _$jscoverage['middleware/session.js'][261]++; + if (! isNew) { + _$jscoverage['middleware/session.js'][261]++; + return debug("already set browser-session cookie"); + } + } + else { + _$jscoverage['middleware/session.js'][263]++; + if (originalHash == hash(req.session) && originalId == req.session.id) { + _$jscoverage['middleware/session.js'][264]++; + return debug("unmodified session"); + } + } + _$jscoverage['middleware/session.js'][267]++; + var val = "s:" + signature.sign(req.sessionID, secret); + _$jscoverage['middleware/session.js'][268]++; + val = cookie.serialize(key, val); + _$jscoverage['middleware/session.js'][269]++; + debug("set-cookie %s", val); + _$jscoverage['middleware/session.js'][270]++; + res.setHeader("Set-Cookie", val); +})); + _$jscoverage['middleware/session.js'][274]++; + var end = res.end; + _$jscoverage['middleware/session.js'][275]++; + res.end = (function (data, encoding) { + _$jscoverage['middleware/session.js'][276]++; + res.end = end; + _$jscoverage['middleware/session.js'][277]++; + if (! req.session) { + _$jscoverage['middleware/session.js'][277]++; + return res.end(data, encoding); + } + _$jscoverage['middleware/session.js'][278]++; + debug("saving"); + _$jscoverage['middleware/session.js'][279]++; + req.session.resetMaxAge(); + _$jscoverage['middleware/session.js'][280]++; + req.session.save((function () { + _$jscoverage['middleware/session.js'][281]++; + debug("saved"); + _$jscoverage['middleware/session.js'][282]++; + res.end(data, encoding); +})); +}); + _$jscoverage['middleware/session.js'][287]++; + function generate() { + _$jscoverage['middleware/session.js'][288]++; + store.generate(req); +} + _$jscoverage['middleware/session.js'][292]++; + req.sessionID = unsignedCookie; + _$jscoverage['middleware/session.js'][295]++; + if (! req.sessionID) { + _$jscoverage['middleware/session.js'][296]++; + debug("no SID sent, generating session"); + _$jscoverage['middleware/session.js'][297]++; + generate(); + _$jscoverage['middleware/session.js'][298]++; + next(); + _$jscoverage['middleware/session.js'][299]++; + return; + } + _$jscoverage['middleware/session.js'][303]++; + var pause = utils.pause(req); + _$jscoverage['middleware/session.js'][304]++; + debug("fetching %s", req.sessionID); + _$jscoverage['middleware/session.js'][305]++; + store.get(req.sessionID, (function (err, sess) { + _$jscoverage['middleware/session.js'][307]++; + var _next = next; + _$jscoverage['middleware/session.js'][308]++; + next = (function (err) { + _$jscoverage['middleware/session.js'][309]++; + _next(err); + _$jscoverage['middleware/session.js'][310]++; + pause.resume(); +}); + _$jscoverage['middleware/session.js'][314]++; + if (err) { + _$jscoverage['middleware/session.js'][315]++; + debug("error"); + _$jscoverage['middleware/session.js'][316]++; + if ("ENOENT" == err.code) { + _$jscoverage['middleware/session.js'][317]++; + generate(); + _$jscoverage['middleware/session.js'][318]++; + next(); + } + else { + _$jscoverage['middleware/session.js'][320]++; + next(err); + } + } + else { + _$jscoverage['middleware/session.js'][323]++; + if (! sess) { + _$jscoverage['middleware/session.js'][324]++; + debug("no session found"); + _$jscoverage['middleware/session.js'][325]++; + generate(); + _$jscoverage['middleware/session.js'][326]++; + next(); + } + else { + _$jscoverage['middleware/session.js'][329]++; + debug("session found"); + _$jscoverage['middleware/session.js'][330]++; + store.createSession(req, sess); + _$jscoverage['middleware/session.js'][331]++; + originalId = req.sessionID; + _$jscoverage['middleware/session.js'][332]++; + originalHash = hash(sess); + _$jscoverage['middleware/session.js'][333]++; + next(); + } + } +})); +}); +} +_$jscoverage['middleware/session.js'][337]++; +; +_$jscoverage['middleware/session.js'][348]++; +function hash(sess) { + _$jscoverage['middleware/session.js'][349]++; + return crc16(JSON.stringify(sess, (function (key, val) { + _$jscoverage['middleware/session.js'][350]++; + if ("cookie" != key) { + _$jscoverage['middleware/session.js'][350]++; + return val; + } +}))); +} +_$jscoverage['middleware/session.js'].source = ["","/*!"," * Connect - session"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var Session = require('./session/session')"," , debug = require('debug')('connect:session')"," , MemoryStore = require('./session/memory')"," , signature = require('cookie-signature')"," , Cookie = require('./session/cookie')"," , Store = require('./session/store')"," , utils = require('./../utils')"," , parse = utils.parseUrl"," , crc16 = require('crc').crc16;","","// environment","","var env = process.env.NODE_ENV;","","/**"," * Expose the middleware."," */","","exports = module.exports = session;","","/**"," * Expose constructors."," */","","exports.Store = Store;","exports.Cookie = Cookie;","exports.Session = Session;","exports.MemoryStore = MemoryStore;","","/**"," * Warning message for `MemoryStore` usage in production."," */","","var warning = 'Warning: connection.session() MemoryStore is not\\n'"," + 'designed for a production environment, as it will leak\\n'"," + 'memory, and will not scale past a single process.';","","/**"," * Session:"," * "," * Setup session store with the given `options`."," *"," * Session data is _not_ saved in the cookie itself, however"," * cookies are used, so we must use the [cookieParser()](cookieParser.html)"," * middleware _before_ `session()`."," *"," * Examples:"," *"," * connect()"," * .use(connect.cookieParser())"," * .use(connect.session({ secret: 'keyboard cat', key: 'sid', cookie: { secure: true }}))"," *"," * Options:"," *"," * - `key` cookie name defaulting to `connect.sid`"," * - `store` session store instance"," * - `secret` session cookie is signed with this secret to prevent tampering"," * - `cookie` session cookie settings, defaulting to `{ path: '/', httpOnly: true, maxAge: null }`"," * - `proxy` trust the reverse proxy when setting secure cookies (via \"x-forwarded-proto\")"," *"," * Cookie option:"," *"," * By default `cookie.maxAge` is `null`, meaning no \"expires\" parameter is set"," * so the cookie becomes a browser-session cookie. When the user closes the "," * browser the cookie (and session) will be removed."," *"," * ## req.session"," *"," * To store or access session data, simply use the request property `req.session`,"," * which is (generally) serialized as JSON by the store, so nested objects "," * are typically fine. For example below is a user-specific view counter:"," *"," * connect()"," * .use(connect.favicon())"," * .use(connect.cookieParser())"," * .use(connect.session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }}))"," * .use(function(req, res, next){"," * var sess = req.session;"," * if (sess.views) {"," * res.setHeader('Content-Type', 'text/html');"," * res.write('<p>views: ' + sess.views + '</p>');"," * res.write('<p>expires in: ' + (sess.cookie.maxAge / 1000) + 's</p>');"," * res.end();"," * sess.views++;"," * } else {"," * sess.views = 1;"," * res.end('welcome to the session demo. refresh!');"," * }"," * }"," * )).listen(3000);"," *"," * ## Session#regenerate()"," *"," * To regenerate the session simply invoke the method, once complete"," * a new SID and `Session` instance will be initialized at `req.session`."," *"," * req.session.regenerate(function(err){"," * // will have a new session here"," * });"," *"," * ## Session#destroy()"," *"," * Destroys the session, removing `req.session`, will be re-generated next request."," *"," * req.session.destroy(function(err){"," * // cannot access session here"," * });"," * "," * ## Session#reload()"," *"," * Reloads the session data."," *"," * req.session.reload(function(err){"," * // session updated"," * });"," *"," * ## Session#save()"," *"," * Save the session."," *"," * req.session.save(function(err){"," * // session saved"," * });"," *"," * ## Session#touch()"," *"," * Updates the `.maxAge` property. Typically this is"," * not necessary to call, as the session middleware does this for you."," *"," * ## Session#cookie"," *"," * Each session has a unique cookie object accompany it. This allows"," * you to alter the session cookie per visitor. For example we can"," * set `req.session.cookie.expires` to `false` to enable the cookie"," * to remain for only the duration of the user-agent."," *"," * ## Session#maxAge"," *"," * Alternatively `req.session.cookie.maxAge` will return the time"," * remaining in milliseconds, which we may also re-assign a new value"," * to adjust the `.expires` property appropriately. The following"," * are essentially equivalent"," *"," * var hour = 3600000;"," * req.session.cookie.expires = new Date(Date.now() + hour);"," * req.session.cookie.maxAge = hour;"," *"," * For example when `maxAge` is set to `60000` (one minute), and 30 seconds"," * has elapsed it will return `30000` until the current request has completed,"," * at which time `req.session.touch()` is called to reset `req.session.maxAge`"," * to its original value."," *"," * req.session.cookie.maxAge;"," * // => 30000"," *"," * Session Store Implementation:"," *"," * Every session store _must_ implement the following methods"," *"," * - `.get(sid, callback)`"," * - `.set(sid, session, callback)`"," * - `.destroy(sid, callback)`"," *"," * Recommended methods include, but are not limited to:"," *"," * - `.length(callback)`"," * - `.clear(callback)`"," *"," * For an example implementation view the [connect-redis](http://github.com/visionmedia/connect-redis) repo."," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","function session(options){"," var options = options || {}"," , key = options.key || 'connect.sid'"," , store = options.store || new MemoryStore"," , cookie = options.cookie || {}"," , trustProxy = options.proxy"," , storeReady = true;",""," // notify user that this store is not"," // meant for a production environment"," if ('production' == env && store instanceof MemoryStore) {"," console.warn(warning);"," }",""," // generates the new session"," store.generate = function(req){"," req.sessionID = utils.uid(24);"," req.session = new Session(req);"," req.session.cookie = new Cookie(cookie);"," };",""," store.on('disconnect', function(){ storeReady = false; });"," store.on('connect', function(){ storeReady = true; });",""," return function session(req, res, next) {"," // self-awareness"," if (req.session) return next();",""," // Handle connection as if there is no session if"," // the store has temporarily disconnected etc"," if (!storeReady) return debug('store is disconnected'), next();",""," // pathname mismatch"," if (0 != req.originalUrl.indexOf(cookie.path || '/')) return next();",""," // backwards compatibility for signed cookies"," // req.secret is passed from the cookie parser middleware"," var secret = options.secret || req.secret;",""," // ensure secret is available or bail"," if (!secret) throw new Error('`secret` option required for sessions');",""," // parse url"," var originalHash"," , originalId;",""," // expose store"," req.sessionStore = store;",""," // grab the session cookie value and check the signature"," var rawCookie = req.cookies[key];",""," // get signedCookies for backwards compat with signed cookies"," var unsignedCookie = req.signedCookies[key];",""," if (!unsignedCookie && rawCookie) {"," unsignedCookie = utils.parseSignedCookie(rawCookie, secret);"," }",""," // set-cookie"," res.on('header', function(){"," if (!req.session) return;"," var cookie = req.session.cookie"," , proto = (req.headers['x-forwarded-proto'] || '').toLowerCase()"," , tls = req.connection.encrypted || (trustProxy && 'https' == proto)"," , secured = cookie.secure && tls"," , isNew = unsignedCookie != req.sessionID;",""," // only send secure cookies via https"," if (cookie.secure && !secured) return debug('not secured');",""," // browser-session length cookie"," if (null == cookie.expires) {"," if (!isNew) return debug('already set browser-session cookie');"," // compare hashes and ids"," } else if (originalHash == hash(req.session) && originalId == req.session.id) {"," return debug('unmodified session');"," }",""," var val = 's:' + signature.sign(req.sessionID, secret);"," val = cookie.serialize(key, val);"," debug('set-cookie %s', val);"," res.setHeader('Set-Cookie', val);"," });",""," // proxy end() to commit the session"," var end = res.end;"," res.end = function(data, encoding){"," res.end = end;"," if (!req.session) return res.end(data, encoding);"," debug('saving');"," req.session.resetMaxAge();"," req.session.save(function(){"," debug('saved');"," res.end(data, encoding);"," });"," };",""," // generate the session"," function generate() {"," store.generate(req);"," }",""," // get the sessionID from the cookie"," req.sessionID = unsignedCookie;",""," // generate a session if the browser doesn't send a sessionID"," if (!req.sessionID) {"," debug('no SID sent, generating session');"," generate();"," next();"," return;"," }",""," // generate the session object"," var pause = utils.pause(req);"," debug('fetching %s', req.sessionID);"," store.get(req.sessionID, function(err, sess){"," // proxy to resume() events"," var _next = next;"," next = function(err){"," _next(err);"," pause.resume();"," };",""," // error handling"," if (err) {"," debug('error');"," if ('ENOENT' == err.code) {"," generate();"," next();"," } else {"," next(err);"," }"," // no session"," } else if (!sess) {"," debug('no session found');"," generate();"," next();"," // populate req.session"," } else {"," debug('session found');"," store.createSession(req, sess);"," originalId = req.sessionID;"," originalHash = hash(sess);"," next();"," }"," });"," };","};","","/**"," * Hash the given `sess` object omitting changes"," * to `.cookie`."," *"," * @param {Object} sess"," * @return {String}"," * @api private"," */","","function hash(sess) {"," return crc16(JSON.stringify(sess, function(key, val){"," if ('cookie' != key) return val;"," }));","}"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/session/cookie.js b/node_modules/express/node_modules/connect/lib-cov/middleware/session/cookie.js new file mode 100644 index 0000000..279afe5 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/session/cookie.js @@ -0,0 +1,65 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/session/cookie.js']) { + _$jscoverage['middleware/session/cookie.js'] = []; + _$jscoverage['middleware/session/cookie.js'][13] = 0; + _$jscoverage['middleware/session/cookie.js'][24] = 0; + _$jscoverage['middleware/session/cookie.js'][25] = 0; + _$jscoverage['middleware/session/cookie.js'][26] = 0; + _$jscoverage['middleware/session/cookie.js'][27] = 0; + _$jscoverage['middleware/session/cookie.js'][28] = 0; + _$jscoverage['middleware/session/cookie.js'][29] = 0; + _$jscoverage['middleware/session/cookie.js'][38] = 0; + _$jscoverage['middleware/session/cookie.js'][48] = 0; + _$jscoverage['middleware/session/cookie.js'][49] = 0; + _$jscoverage['middleware/session/cookie.js'][60] = 0; + _$jscoverage['middleware/session/cookie.js'][71] = 0; + _$jscoverage['middleware/session/cookie.js'][84] = 0; + _$jscoverage['middleware/session/cookie.js'][97] = 0; + _$jscoverage['middleware/session/cookie.js'][115] = 0; + _$jscoverage['middleware/session/cookie.js'][126] = 0; +} +_$jscoverage['middleware/session/cookie.js'][13]++; +var utils = require("../../utils"), cookie = require("cookie"); +_$jscoverage['middleware/session/cookie.js'][24]++; +var Cookie = module.exports = (function Cookie(options) { + _$jscoverage['middleware/session/cookie.js'][25]++; + this.path = "/"; + _$jscoverage['middleware/session/cookie.js'][26]++; + this.maxAge = null; + _$jscoverage['middleware/session/cookie.js'][27]++; + this.httpOnly = true; + _$jscoverage['middleware/session/cookie.js'][28]++; + if (options) { + _$jscoverage['middleware/session/cookie.js'][28]++; + utils.merge(this, options); + } + _$jscoverage['middleware/session/cookie.js'][29]++; + this.originalMaxAge = undefined == this.originalMaxAge? this.maxAge: this.originalMaxAge; +}); +_$jscoverage['middleware/session/cookie.js'][38]++; +Cookie.prototype = {set expires (date) { + _$jscoverage['middleware/session/cookie.js'][48]++; + this._expires = date; + _$jscoverage['middleware/session/cookie.js'][49]++; + this.originalMaxAge = this.maxAge; +}, get expires () { + _$jscoverage['middleware/session/cookie.js'][60]++; + return this._expires; +}, set maxAge (ms) { + _$jscoverage['middleware/session/cookie.js'][71]++; + this.expires = "number" == typeof ms? new Date(Date.now() + ms): ms; +}, get maxAge () { + _$jscoverage['middleware/session/cookie.js'][84]++; + return this.expires instanceof Date? this.expires.valueOf() - Date.now(): this.expires; +}, get data () { + _$jscoverage['middleware/session/cookie.js'][97]++; + return ({originalMaxAge: this.originalMaxAge, expires: this._expires, secure: this.secure, httpOnly: this.httpOnly, domain: this.domain, path: this.path}); +}, serialize: (function (name, val) { + _$jscoverage['middleware/session/cookie.js'][115]++; + return cookie.serialize(name, val, this.data); +}), toJSON: (function () { + _$jscoverage['middleware/session/cookie.js'][126]++; + return this.data; +})}; +_$jscoverage['middleware/session/cookie.js'].source = ["","/*!"," * Connect - session - Cookie"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../../utils')"," , cookie = require('cookie');","","/**"," * Initialize a new `Cookie` with the given `options`."," *"," * @param {IncomingMessage} req"," * @param {Object} options"," * @api private"," */","","var Cookie = module.exports = function Cookie(options) {"," this.path = '/';"," this.maxAge = null;"," this.httpOnly = true;"," if (options) utils.merge(this, options);"," this.originalMaxAge = undefined == this.originalMaxAge"," ? this.maxAge"," : this.originalMaxAge;","};","","/*!"," * Prototype."," */","","Cookie.prototype = {",""," /**"," * Set expires `date`."," *"," * @param {Date} date"," * @api public"," */"," "," set expires(date) {"," this._expires = date;"," this.originalMaxAge = this.maxAge;"," },",""," /**"," * Get expires `date`."," *"," * @return {Date}"," * @api public"," */",""," get expires() {"," return this._expires;"," },"," "," /**"," * Set expires via max-age in `ms`."," *"," * @param {Number} ms"," * @api public"," */"," "," set maxAge(ms) {"," this.expires = 'number' == typeof ms"," ? new Date(Date.now() + ms)"," : ms;"," },",""," /**"," * Get expires max-age in `ms`."," *"," * @return {Number}"," * @api public"," */",""," get maxAge() {"," return this.expires instanceof Date"," ? this.expires.valueOf() - Date.now()"," : this.expires;"," },",""," /**"," * Return cookie data object."," *"," * @return {Object}"," * @api private"," */",""," get data() {"," return {"," originalMaxAge: this.originalMaxAge"," , expires: this._expires"," , secure: this.secure"," , httpOnly: this.httpOnly"," , domain: this.domain"," , path: this.path"," }"," },",""," /**"," * Return a serialized cookie string."," *"," * @return {String}"," * @api public"," */",""," serialize: function(name, val){"," return cookie.serialize(name, val, this.data);"," },",""," /**"," * Return JSON representation of this cookie."," *"," * @return {Object}"," * @api private"," */"," "," toJSON: function(){"," return this.data;"," }","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/session/memory.js b/node_modules/express/node_modules/connect/lib-cov/middleware/session/memory.js new file mode 100644 index 0000000..f140187 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/session/memory.js @@ -0,0 +1,128 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/session/memory.js']) { + _$jscoverage['middleware/session/memory.js'] = []; + _$jscoverage['middleware/session/memory.js'][13] = 0; + _$jscoverage['middleware/session/memory.js'][21] = 0; + _$jscoverage['middleware/session/memory.js'][22] = 0; + _$jscoverage['middleware/session/memory.js'][29] = 0; + _$jscoverage['middleware/session/memory.js'][39] = 0; + _$jscoverage['middleware/session/memory.js'][40] = 0; + _$jscoverage['middleware/session/memory.js'][41] = 0; + _$jscoverage['middleware/session/memory.js'][42] = 0; + _$jscoverage['middleware/session/memory.js'][44] = 0; + _$jscoverage['middleware/session/memory.js'][45] = 0; + _$jscoverage['middleware/session/memory.js'][46] = 0; + _$jscoverage['middleware/session/memory.js'][49] = 0; + _$jscoverage['middleware/session/memory.js'][50] = 0; + _$jscoverage['middleware/session/memory.js'][52] = 0; + _$jscoverage['middleware/session/memory.js'][55] = 0; + _$jscoverage['middleware/session/memory.js'][69] = 0; + _$jscoverage['middleware/session/memory.js'][70] = 0; + _$jscoverage['middleware/session/memory.js'][71] = 0; + _$jscoverage['middleware/session/memory.js'][72] = 0; + _$jscoverage['middleware/session/memory.js'][73] = 0; + _$jscoverage['middleware/session/memory.js'][84] = 0; + _$jscoverage['middleware/session/memory.js'][85] = 0; + _$jscoverage['middleware/session/memory.js'][86] = 0; + _$jscoverage['middleware/session/memory.js'][87] = 0; + _$jscoverage['middleware/session/memory.js'][88] = 0; + _$jscoverage['middleware/session/memory.js'][99] = 0; + _$jscoverage['middleware/session/memory.js'][100] = 0; + _$jscoverage['middleware/session/memory.js'][102] = 0; + _$jscoverage['middleware/session/memory.js'][103] = 0; + _$jscoverage['middleware/session/memory.js'][105] = 0; + _$jscoverage['middleware/session/memory.js'][115] = 0; + _$jscoverage['middleware/session/memory.js'][116] = 0; + _$jscoverage['middleware/session/memory.js'][117] = 0; + _$jscoverage['middleware/session/memory.js'][127] = 0; + _$jscoverage['middleware/session/memory.js'][128] = 0; +} +_$jscoverage['middleware/session/memory.js'][13]++; +var Store = require("./store"); +_$jscoverage['middleware/session/memory.js'][21]++; +var MemoryStore = module.exports = (function MemoryStore() { + _$jscoverage['middleware/session/memory.js'][22]++; + this.sessions = {}; +}); +_$jscoverage['middleware/session/memory.js'][29]++; +MemoryStore.prototype.__proto__ = Store.prototype; +_$jscoverage['middleware/session/memory.js'][39]++; +MemoryStore.prototype.get = (function (sid, fn) { + _$jscoverage['middleware/session/memory.js'][40]++; + var self = this; + _$jscoverage['middleware/session/memory.js'][41]++; + process.nextTick((function () { + _$jscoverage['middleware/session/memory.js'][42]++; + var expires, sess = self.sessions[sid]; + _$jscoverage['middleware/session/memory.js'][44]++; + if (sess) { + _$jscoverage['middleware/session/memory.js'][45]++; + sess = JSON.parse(sess); + _$jscoverage['middleware/session/memory.js'][46]++; + expires = "string" == typeof sess.cookie.expires? new Date(sess.cookie.expires): sess.cookie.expires; + _$jscoverage['middleware/session/memory.js'][49]++; + if (! expires || new Date() < expires) { + _$jscoverage['middleware/session/memory.js'][50]++; + fn(null, sess); + } + else { + _$jscoverage['middleware/session/memory.js'][52]++; + self.destroy(sid, fn); + } + } + else { + _$jscoverage['middleware/session/memory.js'][55]++; + fn(); + } +})); +}); +_$jscoverage['middleware/session/memory.js'][69]++; +MemoryStore.prototype.set = (function (sid, sess, fn) { + _$jscoverage['middleware/session/memory.js'][70]++; + var self = this; + _$jscoverage['middleware/session/memory.js'][71]++; + process.nextTick((function () { + _$jscoverage['middleware/session/memory.js'][72]++; + self.sessions[sid] = JSON.stringify(sess); + _$jscoverage['middleware/session/memory.js'][73]++; + fn && fn(); +})); +}); +_$jscoverage['middleware/session/memory.js'][84]++; +MemoryStore.prototype.destroy = (function (sid, fn) { + _$jscoverage['middleware/session/memory.js'][85]++; + var self = this; + _$jscoverage['middleware/session/memory.js'][86]++; + process.nextTick((function () { + _$jscoverage['middleware/session/memory.js'][87]++; + delete self.sessions[sid]; + _$jscoverage['middleware/session/memory.js'][88]++; + fn && fn(); +})); +}); +_$jscoverage['middleware/session/memory.js'][99]++; +MemoryStore.prototype.all = (function (fn) { + _$jscoverage['middleware/session/memory.js'][100]++; + var arr = [], keys = Object.keys(this.sessions); + _$jscoverage['middleware/session/memory.js'][102]++; + for (var i = 0, len = keys.length; i < len; ++i) { + _$jscoverage['middleware/session/memory.js'][103]++; + arr.push(this.sessions[keys[i]]); +} + _$jscoverage['middleware/session/memory.js'][105]++; + fn(null, arr); +}); +_$jscoverage['middleware/session/memory.js'][115]++; +MemoryStore.prototype.clear = (function (fn) { + _$jscoverage['middleware/session/memory.js'][116]++; + this.sessions = {}; + _$jscoverage['middleware/session/memory.js'][117]++; + fn && fn(); +}); +_$jscoverage['middleware/session/memory.js'][127]++; +MemoryStore.prototype.length = (function (fn) { + _$jscoverage['middleware/session/memory.js'][128]++; + fn(null, Object.keys(this.sessions).length); +}); +_$jscoverage['middleware/session/memory.js'].source = ["","/*!"," * Connect - session - MemoryStore"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var Store = require('./store');","","/**"," * Initialize a new `MemoryStore`."," *"," * @api public"," */","","var MemoryStore = module.exports = function MemoryStore() {"," this.sessions = {};","};","","/**"," * Inherit from `Store.prototype`."," */","","MemoryStore.prototype.__proto__ = Store.prototype;","","/**"," * Attempt to fetch session by the given `sid`."," *"," * @param {String} sid"," * @param {Function} fn"," * @api public"," */","","MemoryStore.prototype.get = function(sid, fn){"," var self = this;"," process.nextTick(function(){"," var expires"," , sess = self.sessions[sid];"," if (sess) {"," sess = JSON.parse(sess);"," expires = 'string' == typeof sess.cookie.expires"," ? new Date(sess.cookie.expires)"," : sess.cookie.expires;"," if (!expires || new Date < expires) {"," fn(null, sess);"," } else {"," self.destroy(sid, fn);"," }"," } else {"," fn();"," }"," });","};","","/**"," * Commit the given `sess` object associated with the given `sid`."," *"," * @param {String} sid"," * @param {Session} sess"," * @param {Function} fn"," * @api public"," */","","MemoryStore.prototype.set = function(sid, sess, fn){"," var self = this;"," process.nextTick(function(){"," self.sessions[sid] = JSON.stringify(sess);"," fn && fn();"," });","};","","/**"," * Destroy the session associated with the given `sid`."," *"," * @param {String} sid"," * @api public"," */","","MemoryStore.prototype.destroy = function(sid, fn){"," var self = this;"," process.nextTick(function(){"," delete self.sessions[sid];"," fn && fn();"," });","};","","/**"," * Invoke the given callback `fn` with all active sessions."," *"," * @param {Function} fn"," * @api public"," */","","MemoryStore.prototype.all = function(fn){"," var arr = []"," , keys = Object.keys(this.sessions);"," for (var i = 0, len = keys.length; i < len; ++i) {"," arr.push(this.sessions[keys[i]]);"," }"," fn(null, arr);","};","","/**"," * Clear all sessions."," *"," * @param {Function} fn"," * @api public"," */","","MemoryStore.prototype.clear = function(fn){"," this.sessions = {};"," fn && fn();","};","","/**"," * Fetch number of sessions."," *"," * @param {Function} fn"," * @api public"," */","","MemoryStore.prototype.length = function(fn){"," fn(null, Object.keys(this.sessions).length);","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/session/session.js b/node_modules/express/node_modules/connect/lib-cov/middleware/session/session.js new file mode 100644 index 0000000..73e85e0 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/session/session.js @@ -0,0 +1,108 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/session/session.js']) { + _$jscoverage['middleware/session/session.js'] = []; + _$jscoverage['middleware/session/session.js'][13] = 0; + _$jscoverage['middleware/session/session.js'][23] = 0; + _$jscoverage['middleware/session/session.js'][24] = 0; + _$jscoverage['middleware/session/session.js'][25] = 0; + _$jscoverage['middleware/session/session.js'][26] = 0; + _$jscoverage['middleware/session/session.js'][38] = 0; + _$jscoverage['middleware/session/session.js'][39] = 0; + _$jscoverage['middleware/session/session.js'][49] = 0; + _$jscoverage['middleware/session/session.js'][50] = 0; + _$jscoverage['middleware/session/session.js'][51] = 0; + _$jscoverage['middleware/session/session.js'][62] = 0; + _$jscoverage['middleware/session/session.js'][63] = 0; + _$jscoverage['middleware/session/session.js'][64] = 0; + _$jscoverage['middleware/session/session.js'][79] = 0; + _$jscoverage['middleware/session/session.js'][80] = 0; + _$jscoverage['middleware/session/session.js'][82] = 0; + _$jscoverage['middleware/session/session.js'][83] = 0; + _$jscoverage['middleware/session/session.js'][84] = 0; + _$jscoverage['middleware/session/session.js'][85] = 0; + _$jscoverage['middleware/session/session.js'][86] = 0; + _$jscoverage['middleware/session/session.js'][88] = 0; + _$jscoverage['middleware/session/session.js'][99] = 0; + _$jscoverage['middleware/session/session.js'][100] = 0; + _$jscoverage['middleware/session/session.js'][101] = 0; + _$jscoverage['middleware/session/session.js'][102] = 0; + _$jscoverage['middleware/session/session.js'][113] = 0; + _$jscoverage['middleware/session/session.js'][114] = 0; + _$jscoverage['middleware/session/session.js'][115] = 0; +} +_$jscoverage['middleware/session/session.js'][13]++; +var utils = require("../../utils"); +_$jscoverage['middleware/session/session.js'][23]++; +var Session = module.exports = (function Session(req, data) { + _$jscoverage['middleware/session/session.js'][24]++; + Object.defineProperty(this, "req", {value: req}); + _$jscoverage['middleware/session/session.js'][25]++; + Object.defineProperty(this, "id", {value: req.sessionID}); + _$jscoverage['middleware/session/session.js'][26]++; + if ("object" == typeof data) { + _$jscoverage['middleware/session/session.js'][26]++; + utils.merge(this, data); + } +}); +_$jscoverage['middleware/session/session.js'][38]++; +Session.prototype.touch = (function () { + _$jscoverage['middleware/session/session.js'][39]++; + return this.resetMaxAge(); +}); +_$jscoverage['middleware/session/session.js'][49]++; +Session.prototype.resetMaxAge = (function () { + _$jscoverage['middleware/session/session.js'][50]++; + this.cookie.maxAge = this.cookie.originalMaxAge; + _$jscoverage['middleware/session/session.js'][51]++; + return this; +}); +_$jscoverage['middleware/session/session.js'][62]++; +Session.prototype.save = (function (fn) { + _$jscoverage['middleware/session/session.js'][63]++; + this.req.sessionStore.set(this.id, this, fn || (function () { +})); + _$jscoverage['middleware/session/session.js'][64]++; + return this; +}); +_$jscoverage['middleware/session/session.js'][79]++; +Session.prototype.reload = (function (fn) { + _$jscoverage['middleware/session/session.js'][80]++; + var req = this.req, store = this.req.sessionStore; + _$jscoverage['middleware/session/session.js'][82]++; + store.get(this.id, (function (err, sess) { + _$jscoverage['middleware/session/session.js'][83]++; + if (err) { + _$jscoverage['middleware/session/session.js'][83]++; + return fn(err); + } + _$jscoverage['middleware/session/session.js'][84]++; + if (! sess) { + _$jscoverage['middleware/session/session.js'][84]++; + return fn(new Error("failed to load session")); + } + _$jscoverage['middleware/session/session.js'][85]++; + store.createSession(req, sess); + _$jscoverage['middleware/session/session.js'][86]++; + fn(); +})); + _$jscoverage['middleware/session/session.js'][88]++; + return this; +}); +_$jscoverage['middleware/session/session.js'][99]++; +Session.prototype.destroy = (function (fn) { + _$jscoverage['middleware/session/session.js'][100]++; + delete this.req.session; + _$jscoverage['middleware/session/session.js'][101]++; + this.req.sessionStore.destroy(this.id, fn); + _$jscoverage['middleware/session/session.js'][102]++; + return this; +}); +_$jscoverage['middleware/session/session.js'][113]++; +Session.prototype.regenerate = (function (fn) { + _$jscoverage['middleware/session/session.js'][114]++; + this.req.sessionStore.regenerate(this.req, fn); + _$jscoverage['middleware/session/session.js'][115]++; + return this; +}); +_$jscoverage['middleware/session/session.js'].source = ["","/*!"," * Connect - session - Session"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../../utils');","","/**"," * Create a new `Session` with the given request and `data`."," *"," * @param {IncomingRequest} req"," * @param {Object} data"," * @api private"," */","","var Session = module.exports = function Session(req, data) {"," Object.defineProperty(this, 'req', { value: req });"," Object.defineProperty(this, 'id', { value: req.sessionID });"," if ('object' == typeof data) utils.merge(this, data);","};","","/**"," * Update reset `.cookie.maxAge` to prevent"," * the cookie from expiring when the"," * session is still active."," *"," * @return {Session} for chaining"," * @api public"," */","","Session.prototype.touch = function(){"," return this.resetMaxAge();","};","","/**"," * Reset `.maxAge` to `.originalMaxAge`."," *"," * @return {Session} for chaining"," * @api public"," */","","Session.prototype.resetMaxAge = function(){"," this.cookie.maxAge = this.cookie.originalMaxAge;"," return this;","};","","/**"," * Save the session data with optional callback `fn(err)`."," *"," * @param {Function} fn"," * @return {Session} for chaining"," * @api public"," */","","Session.prototype.save = function(fn){"," this.req.sessionStore.set(this.id, this, fn || function(){});"," return this;","};","","/**"," * Re-loads the session data _without_ altering"," * the maxAge properties. Invokes the callback `fn(err)`,"," * after which time if no exception has occurred the"," * `req.session` property will be a new `Session` object,"," * although representing the same session."," *"," * @param {Function} fn"," * @return {Session} for chaining"," * @api public"," */","","Session.prototype.reload = function(fn){"," var req = this.req"," , store = this.req.sessionStore;"," store.get(this.id, function(err, sess){"," if (err) return fn(err);"," if (!sess) return fn(new Error('failed to load session'));"," store.createSession(req, sess);"," fn();"," });"," return this;","};","","/**"," * Destroy `this` session."," *"," * @param {Function} fn"," * @return {Session} for chaining"," * @api public"," */","","Session.prototype.destroy = function(fn){"," delete this.req.session;"," this.req.sessionStore.destroy(this.id, fn);"," return this;","};","","/**"," * Regenerate this request's session."," *"," * @param {Function} fn"," * @return {Session} for chaining"," * @api public"," */","","Session.prototype.regenerate = function(fn){"," this.req.sessionStore.regenerate(this.req, fn);"," return this;","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/session/store.js b/node_modules/express/node_modules/connect/lib-cov/middleware/session/store.js new file mode 100644 index 0000000..2d79aa2 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/session/store.js @@ -0,0 +1,90 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/session/store.js']) { + _$jscoverage['middleware/session/store.js'] = []; + _$jscoverage['middleware/session/store.js'][13] = 0; + _$jscoverage['middleware/session/store.js'][23] = 0; + _$jscoverage['middleware/session/store.js'][29] = 0; + _$jscoverage['middleware/session/store.js'][39] = 0; + _$jscoverage['middleware/session/store.js'][40] = 0; + _$jscoverage['middleware/session/store.js'][41] = 0; + _$jscoverage['middleware/session/store.js'][42] = 0; + _$jscoverage['middleware/session/store.js'][43] = 0; + _$jscoverage['middleware/session/store.js'][56] = 0; + _$jscoverage['middleware/session/store.js'][57] = 0; + _$jscoverage['middleware/session/store.js'][58] = 0; + _$jscoverage['middleware/session/store.js'][59] = 0; + _$jscoverage['middleware/session/store.js'][60] = 0; + _$jscoverage['middleware/session/store.js'][61] = 0; + _$jscoverage['middleware/session/store.js'][62] = 0; + _$jscoverage['middleware/session/store.js'][63] = 0; + _$jscoverage['middleware/session/store.js'][76] = 0; + _$jscoverage['middleware/session/store.js'][77] = 0; + _$jscoverage['middleware/session/store.js'][79] = 0; + _$jscoverage['middleware/session/store.js'][80] = 0; + _$jscoverage['middleware/session/store.js'][81] = 0; + _$jscoverage['middleware/session/store.js'][82] = 0; + _$jscoverage['middleware/session/store.js'][83] = 0; +} +_$jscoverage['middleware/session/store.js'][13]++; +var EventEmitter = require("events").EventEmitter, Session = require("./session"), Cookie = require("./cookie"); +_$jscoverage['middleware/session/store.js'][23]++; +var Store = module.exports = (function Store(options) { +}); +_$jscoverage['middleware/session/store.js'][29]++; +Store.prototype.__proto__ = EventEmitter.prototype; +_$jscoverage['middleware/session/store.js'][39]++; +Store.prototype.regenerate = (function (req, fn) { + _$jscoverage['middleware/session/store.js'][40]++; + var self = this; + _$jscoverage['middleware/session/store.js'][41]++; + this.destroy(req.sessionID, (function (err) { + _$jscoverage['middleware/session/store.js'][42]++; + self.generate(req); + _$jscoverage['middleware/session/store.js'][43]++; + fn(err); +})); +}); +_$jscoverage['middleware/session/store.js'][56]++; +Store.prototype.load = (function (sid, fn) { + _$jscoverage['middleware/session/store.js'][57]++; + var self = this; + _$jscoverage['middleware/session/store.js'][58]++; + this.get(sid, (function (err, sess) { + _$jscoverage['middleware/session/store.js'][59]++; + if (err) { + _$jscoverage['middleware/session/store.js'][59]++; + return fn(err); + } + _$jscoverage['middleware/session/store.js'][60]++; + if (! sess) { + _$jscoverage['middleware/session/store.js'][60]++; + return fn(); + } + _$jscoverage['middleware/session/store.js'][61]++; + var req = {sessionID: sid, sessionStore: self}; + _$jscoverage['middleware/session/store.js'][62]++; + sess = self.createSession(req, sess); + _$jscoverage['middleware/session/store.js'][63]++; + fn(null, sess); +})); +}); +_$jscoverage['middleware/session/store.js'][76]++; +Store.prototype.createSession = (function (req, sess) { + _$jscoverage['middleware/session/store.js'][77]++; + var expires = sess.cookie.expires, orig = sess.cookie.originalMaxAge; + _$jscoverage['middleware/session/store.js'][79]++; + sess.cookie = new Cookie(sess.cookie); + _$jscoverage['middleware/session/store.js'][80]++; + if ("string" == typeof expires) { + _$jscoverage['middleware/session/store.js'][80]++; + sess.cookie.expires = new Date(expires); + } + _$jscoverage['middleware/session/store.js'][81]++; + sess.cookie.originalMaxAge = orig; + _$jscoverage['middleware/session/store.js'][82]++; + req.session = new Session(req, sess); + _$jscoverage['middleware/session/store.js'][83]++; + return req.session; +}); +_$jscoverage['middleware/session/store.js'].source = ["","/*!"," * Connect - session - Store"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var EventEmitter = require('events').EventEmitter"," , Session = require('./session')"," , Cookie = require('./cookie');","","/**"," * Initialize abstract `Store`."," *"," * @api private"," */","","var Store = module.exports = function Store(options){};","","/**"," * Inherit from `EventEmitter.prototype`."," */","","Store.prototype.__proto__ = EventEmitter.prototype;","","/**"," * Re-generate the given requests's session."," *"," * @param {IncomingRequest} req"," * @return {Function} fn"," * @api public"," */","","Store.prototype.regenerate = function(req, fn){"," var self = this;"," this.destroy(req.sessionID, function(err){"," self.generate(req);"," fn(err);"," });","};","","/**"," * Load a `Session` instance via the given `sid`"," * and invoke the callback `fn(err, sess)`."," *"," * @param {String} sid"," * @param {Function} fn"," * @api public"," */","","Store.prototype.load = function(sid, fn){"," var self = this;"," this.get(sid, function(err, sess){"," if (err) return fn(err);"," if (!sess) return fn();"," var req = { sessionID: sid, sessionStore: self };"," sess = self.createSession(req, sess);"," fn(null, sess);"," });","};","","/**"," * Create session from JSON `sess` data."," *"," * @param {IncomingRequest} req"," * @param {Object} sess"," * @return {Session}"," * @api private"," */","","Store.prototype.createSession = function(req, sess){"," var expires = sess.cookie.expires"," , orig = sess.cookie.originalMaxAge;"," sess.cookie = new Cookie(sess.cookie);"," if ('string' == typeof expires) sess.cookie.expires = new Date(expires);"," sess.cookie.originalMaxAge = orig;"," req.session = new Session(req, sess);"," return req.session;","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/static.js b/node_modules/express/node_modules/connect/lib-cov/middleware/static.js new file mode 100644 index 0000000..c52b1c0 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/static.js @@ -0,0 +1,92 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/static.js']) { + _$jscoverage['middleware/static.js'] = []; + _$jscoverage['middleware/static.js'][13] = 0; + _$jscoverage['middleware/static.js'][45] = 0; + _$jscoverage['middleware/static.js'][46] = 0; + _$jscoverage['middleware/static.js'][49] = 0; + _$jscoverage['middleware/static.js'][52] = 0; + _$jscoverage['middleware/static.js'][54] = 0; + _$jscoverage['middleware/static.js'][55] = 0; + _$jscoverage['middleware/static.js'][56] = 0; + _$jscoverage['middleware/static.js'][57] = 0; + _$jscoverage['middleware/static.js'][59] = 0; + _$jscoverage['middleware/static.js'][60] = 0; + _$jscoverage['middleware/static.js'][61] = 0; + _$jscoverage['middleware/static.js'][64] = 0; + _$jscoverage['middleware/static.js'][65] = 0; + _$jscoverage['middleware/static.js'][66] = 0; + _$jscoverage['middleware/static.js'][67] = 0; + _$jscoverage['middleware/static.js'][68] = 0; + _$jscoverage['middleware/static.js'][69] = 0; + _$jscoverage['middleware/static.js'][72] = 0; + _$jscoverage['middleware/static.js'][73] = 0; + _$jscoverage['middleware/static.js'][74] = 0; + _$jscoverage['middleware/static.js'][77] = 0; + _$jscoverage['middleware/static.js'][94] = 0; +} +_$jscoverage['middleware/static.js'][13]++; +var send = require("send"), utils = require("../utils"), parse = utils.parseUrl, url = require("url"); +_$jscoverage['middleware/static.js'][45]++; +exports = module.exports = (function static(root, options) { + _$jscoverage['middleware/static.js'][46]++; + options = options || {}; + _$jscoverage['middleware/static.js'][49]++; + if (! root) { + _$jscoverage['middleware/static.js'][49]++; + throw new Error("static() root path required"); + } + _$jscoverage['middleware/static.js'][52]++; + var redirect = false !== options.redirect; + _$jscoverage['middleware/static.js'][54]++; + return (function static(req, res, next) { + _$jscoverage['middleware/static.js'][55]++; + if ("GET" != req.method && "HEAD" != req.method) { + _$jscoverage['middleware/static.js'][55]++; + return next(); + } + _$jscoverage['middleware/static.js'][56]++; + var path = parse(req).pathname; + _$jscoverage['middleware/static.js'][57]++; + var pause = utils.pause(req); + _$jscoverage['middleware/static.js'][59]++; + function resume() { + _$jscoverage['middleware/static.js'][60]++; + next(); + _$jscoverage['middleware/static.js'][61]++; + pause.resume(); +} + _$jscoverage['middleware/static.js'][64]++; + function directory() { + _$jscoverage['middleware/static.js'][65]++; + if (! redirect) { + _$jscoverage['middleware/static.js'][65]++; + return resume(); + } + _$jscoverage['middleware/static.js'][66]++; + var pathname = url.parse(req.originalUrl).pathname; + _$jscoverage['middleware/static.js'][67]++; + res.statusCode = 301; + _$jscoverage['middleware/static.js'][68]++; + res.setHeader("Location", pathname + "/"); + _$jscoverage['middleware/static.js'][69]++; + res.end("Redirecting to " + utils.escape(pathname) + "/"); +} + _$jscoverage['middleware/static.js'][72]++; + function error(err) { + _$jscoverage['middleware/static.js'][73]++; + if (404 == err.status) { + _$jscoverage['middleware/static.js'][73]++; + return resume(); + } + _$jscoverage['middleware/static.js'][74]++; + next(err); +} + _$jscoverage['middleware/static.js'][77]++; + send(req, path).maxage(options.maxAge || 0).root(root).hidden(options.hidden).on("error", error).on("directory", directory).pipe(res); +}); +}); +_$jscoverage['middleware/static.js'][94]++; +exports.mime = send.mime; +_$jscoverage['middleware/static.js'].source = ["","/*!"," * Connect - static"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var send = require('send')"," , utils = require('../utils')"," , parse = utils.parseUrl"," , url = require('url');","","/**"," * Static:"," *"," * Static file server with the given `root` path."," *"," * Examples:"," *"," * var oneDay = 86400000;"," *"," * connect()"," * .use(connect.static(__dirname + '/public'))"," *"," * connect()"," * .use(connect.static(__dirname + '/public', { maxAge: oneDay }))"," *"," * Options:"," *"," * - `maxAge` Browser cache maxAge in milliseconds. defaults to 0"," * - `hidden` Allow transfer of hidden files. defaults to false"," * - `redirect` Redirect to trailing \"/\" when the pathname is a dir. defaults to true"," *"," * @param {String} root"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function static(root, options){"," options = options || {};",""," // root required"," if (!root) throw new Error('static() root path required');",""," // default redirect"," var redirect = false !== options.redirect;",""," return function static(req, res, next) {"," if ('GET' != req.method && 'HEAD' != req.method) return next();"," var path = parse(req).pathname;"," var pause = utils.pause(req);",""," function resume() {"," next();"," pause.resume();"," }",""," function directory() {"," if (!redirect) return resume();"," var pathname = url.parse(req.originalUrl).pathname;"," res.statusCode = 301;"," res.setHeader('Location', pathname + '/');"," res.end('Redirecting to ' + utils.escape(pathname) + '/');"," }",""," function error(err) {"," if (404 == err.status) return resume();"," next(err);"," }",""," send(req, path)"," .maxage(options.maxAge || 0)"," .root(root)"," .hidden(options.hidden)"," .on('error', error)"," .on('directory', directory)"," .pipe(res);"," };","};","","/**"," * Expose mime module."," * "," * If you wish to extend the mime table use this"," * reference to the \"mime\" module in the npm registry."," */","","exports.mime = send.mime;"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/staticCache.js b/node_modules/express/node_modules/connect/lib-cov/middleware/staticCache.js new file mode 100644 index 0000000..e8c2940 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/staticCache.js @@ -0,0 +1,276 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/staticCache.js']) { + _$jscoverage['middleware/staticCache.js'] = []; + _$jscoverage['middleware/staticCache.js'][12] = 0; + _$jscoverage['middleware/staticCache.js'][51] = 0; + _$jscoverage['middleware/staticCache.js'][52] = 0; + _$jscoverage['middleware/staticCache.js'][56] = 0; + _$jscoverage['middleware/staticCache.js'][57] = 0; + _$jscoverage['middleware/staticCache.js'][59] = 0; + _$jscoverage['middleware/staticCache.js'][60] = 0; + _$jscoverage['middleware/staticCache.js'][68] = 0; + _$jscoverage['middleware/staticCache.js'][69] = 0; + _$jscoverage['middleware/staticCache.js'][75] = 0; + _$jscoverage['middleware/staticCache.js'][78] = 0; + _$jscoverage['middleware/staticCache.js'][81] = 0; + _$jscoverage['middleware/staticCache.js'][84] = 0; + _$jscoverage['middleware/staticCache.js'][88] = 0; + _$jscoverage['middleware/staticCache.js'][91] = 0; + _$jscoverage['middleware/staticCache.js'][94] = 0; + _$jscoverage['middleware/staticCache.js'][95] = 0; + _$jscoverage['middleware/staticCache.js'][96] = 0; + _$jscoverage['middleware/staticCache.js'][97] = 0; + _$jscoverage['middleware/staticCache.js'][99] = 0; + _$jscoverage['middleware/staticCache.js'][104] = 0; + _$jscoverage['middleware/staticCache.js'][107] = 0; + _$jscoverage['middleware/staticCache.js'][110] = 0; + _$jscoverage['middleware/staticCache.js'][111] = 0; + _$jscoverage['middleware/staticCache.js'][115] = 0; + _$jscoverage['middleware/staticCache.js'][116] = 0; + _$jscoverage['middleware/staticCache.js'][117] = 0; + _$jscoverage['middleware/staticCache.js'][118] = 0; + _$jscoverage['middleware/staticCache.js'][119] = 0; + _$jscoverage['middleware/staticCache.js'][120] = 0; + _$jscoverage['middleware/staticCache.js'][124] = 0; + _$jscoverage['middleware/staticCache.js'][125] = 0; + _$jscoverage['middleware/staticCache.js'][126] = 0; + _$jscoverage['middleware/staticCache.js'][127] = 0; + _$jscoverage['middleware/staticCache.js'][128] = 0; + _$jscoverage['middleware/staticCache.js'][129] = 0; + _$jscoverage['middleware/staticCache.js'][131] = 0; + _$jscoverage['middleware/staticCache.js'][132] = 0; + _$jscoverage['middleware/staticCache.js'][135] = 0; + _$jscoverage['middleware/staticCache.js'][151] = 0; + _$jscoverage['middleware/staticCache.js'][152] = 0; + _$jscoverage['middleware/staticCache.js'][156] = 0; + _$jscoverage['middleware/staticCache.js'][158] = 0; + _$jscoverage['middleware/staticCache.js'][160] = 0; + _$jscoverage['middleware/staticCache.js'][161] = 0; + _$jscoverage['middleware/staticCache.js'][162] = 0; + _$jscoverage['middleware/staticCache.js'][164] = 0; + _$jscoverage['middleware/staticCache.js'][165] = 0; + _$jscoverage['middleware/staticCache.js'][166] = 0; + _$jscoverage['middleware/staticCache.js'][167] = 0; + _$jscoverage['middleware/staticCache.js'][169] = 0; + _$jscoverage['middleware/staticCache.js'][171] = 0; + _$jscoverage['middleware/staticCache.js'][172] = 0; + _$jscoverage['middleware/staticCache.js'][173] = 0; + _$jscoverage['middleware/staticCache.js'][174] = 0; + _$jscoverage['middleware/staticCache.js'][175] = 0; + _$jscoverage['middleware/staticCache.js'][178] = 0; + _$jscoverage['middleware/staticCache.js'][181] = 0; + _$jscoverage['middleware/staticCache.js'][183] = 0; + _$jscoverage['middleware/staticCache.js'][186] = 0; + _$jscoverage['middleware/staticCache.js'][187] = 0; + _$jscoverage['middleware/staticCache.js'][200] = 0; + _$jscoverage['middleware/staticCache.js'][201] = 0; + _$jscoverage['middleware/staticCache.js'][206] = 0; + _$jscoverage['middleware/staticCache.js'][208] = 0; + _$jscoverage['middleware/staticCache.js'][210] = 0; + _$jscoverage['middleware/staticCache.js'][212] = 0; + _$jscoverage['middleware/staticCache.js'][214] = 0; + _$jscoverage['middleware/staticCache.js'][216] = 0; + _$jscoverage['middleware/staticCache.js'][229] = 0; + _$jscoverage['middleware/staticCache.js'][230] = 0; +} +_$jscoverage['middleware/staticCache.js'][12]++; +var utils = require("../utils"), Cache = require("../cache"), fresh = require("fresh"); +_$jscoverage['middleware/staticCache.js'][51]++; +module.exports = (function staticCache(options) { + _$jscoverage['middleware/staticCache.js'][52]++; + var options = options || {}, cache = new Cache(options.maxObjects || 128), maxlen = options.maxLength || 262144; + _$jscoverage['middleware/staticCache.js'][56]++; + console.warn("connect.staticCache() is deprecated and will be removed in 3.0"); + _$jscoverage['middleware/staticCache.js'][57]++; + console.warn("use varnish or similar reverse proxy caches."); + _$jscoverage['middleware/staticCache.js'][59]++; + return (function staticCache(req, res, next) { + _$jscoverage['middleware/staticCache.js'][60]++; + var key = cacheKey(req), ranges = req.headers.range, hasCookies = req.headers.cookie, hit = cache.get(key); + _$jscoverage['middleware/staticCache.js'][68]++; + req.on("static", (function (stream) { + _$jscoverage['middleware/staticCache.js'][69]++; + var headers = res._headers, cc = utils.parseCacheControl(headers["cache-control"] || ""), contentLength = headers["content-length"], hit; + _$jscoverage['middleware/staticCache.js'][75]++; + if (headers["set-cookie"]) { + _$jscoverage['middleware/staticCache.js'][75]++; + return hasCookies = true; + } + _$jscoverage['middleware/staticCache.js'][78]++; + if (hasCookies) { + _$jscoverage['middleware/staticCache.js'][78]++; + return; + } + _$jscoverage['middleware/staticCache.js'][81]++; + if (! contentLength || contentLength > maxlen) { + _$jscoverage['middleware/staticCache.js'][81]++; + return; + } + _$jscoverage['middleware/staticCache.js'][84]++; + if (headers["content-range"]) { + _$jscoverage['middleware/staticCache.js'][84]++; + return; + } + _$jscoverage['middleware/staticCache.js'][88]++; + if (cc["no-cache"] || cc["no-store"] || cc["private"] || cc["must-revalidate"]) { + _$jscoverage['middleware/staticCache.js'][91]++; + return; + } + _$jscoverage['middleware/staticCache.js'][94]++; + if (hit = cache.get(key)) { + _$jscoverage['middleware/staticCache.js'][95]++; + if (headers.etag == hit[0].etag) { + _$jscoverage['middleware/staticCache.js'][96]++; + hit[0].date = new Date(); + _$jscoverage['middleware/staticCache.js'][97]++; + return; + } + else { + _$jscoverage['middleware/staticCache.js'][99]++; + cache.remove(key); + } + } + _$jscoverage['middleware/staticCache.js'][104]++; + if (null == stream) { + _$jscoverage['middleware/staticCache.js'][104]++; + return; + } + _$jscoverage['middleware/staticCache.js'][107]++; + var arr = []; + _$jscoverage['middleware/staticCache.js'][110]++; + stream.on("data", (function (chunk) { + _$jscoverage['middleware/staticCache.js'][111]++; + arr.push(chunk); +})); + _$jscoverage['middleware/staticCache.js'][115]++; + stream.on("end", (function () { + _$jscoverage['middleware/staticCache.js'][116]++; + var cacheEntry = cache.add(key); + _$jscoverage['middleware/staticCache.js'][117]++; + delete headers["x-cache"]; + _$jscoverage['middleware/staticCache.js'][118]++; + cacheEntry.push(200); + _$jscoverage['middleware/staticCache.js'][119]++; + cacheEntry.push(headers); + _$jscoverage['middleware/staticCache.js'][120]++; + cacheEntry.push.apply(cacheEntry, arr); +})); +})); + _$jscoverage['middleware/staticCache.js'][124]++; + if (req.method == "GET" || req.method == "HEAD") { + _$jscoverage['middleware/staticCache.js'][125]++; + if (ranges) { + _$jscoverage['middleware/staticCache.js'][126]++; + next(); + } + else { + _$jscoverage['middleware/staticCache.js'][127]++; + if (! hasCookies && hit && ! mustRevalidate(req, hit)) { + _$jscoverage['middleware/staticCache.js'][128]++; + res.setHeader("X-Cache", "HIT"); + _$jscoverage['middleware/staticCache.js'][129]++; + respondFromCache(req, res, hit); + } + else { + _$jscoverage['middleware/staticCache.js'][131]++; + res.setHeader("X-Cache", "MISS"); + _$jscoverage['middleware/staticCache.js'][132]++; + next(); + } + } + } + else { + _$jscoverage['middleware/staticCache.js'][135]++; + next(); + } +}); +}); +_$jscoverage['middleware/staticCache.js'][151]++; +function respondFromCache(req, res, cacheEntry) { + _$jscoverage['middleware/staticCache.js'][152]++; + var status = cacheEntry[0], headers = utils.merge({}, cacheEntry[1]), content = cacheEntry.slice(2); + _$jscoverage['middleware/staticCache.js'][156]++; + headers.age = (new Date() - new Date(headers.date)) / 1000 || 0; + _$jscoverage['middleware/staticCache.js'][158]++; + switch (req.method) { + case "HEAD": + _$jscoverage['middleware/staticCache.js'][160]++; + res.writeHead(status, headers); + _$jscoverage['middleware/staticCache.js'][161]++; + res.end(); + _$jscoverage['middleware/staticCache.js'][162]++; + break; + case "GET": + _$jscoverage['middleware/staticCache.js'][164]++; + if (utils.conditionalGET(req) && fresh(req.headers, headers)) { + _$jscoverage['middleware/staticCache.js'][165]++; + headers["content-length"] = 0; + _$jscoverage['middleware/staticCache.js'][166]++; + res.writeHead(304, headers); + _$jscoverage['middleware/staticCache.js'][167]++; + res.end(); + } + else { + _$jscoverage['middleware/staticCache.js'][169]++; + res.writeHead(status, headers); + _$jscoverage['middleware/staticCache.js'][171]++; + function write() { + _$jscoverage['middleware/staticCache.js'][172]++; + while (content.length) { + _$jscoverage['middleware/staticCache.js'][173]++; + if (false === res.write(content.shift())) { + _$jscoverage['middleware/staticCache.js'][174]++; + res.once("drain", write); + _$jscoverage['middleware/staticCache.js'][175]++; + return; + } +} + _$jscoverage['middleware/staticCache.js'][178]++; + res.end(); +} + _$jscoverage['middleware/staticCache.js'][181]++; + write(); + } + _$jscoverage['middleware/staticCache.js'][183]++; + break; + default: + _$jscoverage['middleware/staticCache.js'][186]++; + res.writeHead(500, ""); + _$jscoverage['middleware/staticCache.js'][187]++; + res.end(); + } +} +_$jscoverage['middleware/staticCache.js'][200]++; +function mustRevalidate(req, cacheEntry) { + _$jscoverage['middleware/staticCache.js'][201]++; + var cacheHeaders = cacheEntry[1], reqCC = utils.parseCacheControl(req.headers["cache-control"] || ""), cacheCC = utils.parseCacheControl(cacheHeaders["cache-control"] || ""), cacheAge = (new Date() - new Date(cacheHeaders.date)) / 1000 || 0; + _$jscoverage['middleware/staticCache.js'][206]++; + if (cacheCC["no-cache"] || cacheCC["must-revalidate"] || cacheCC["proxy-revalidate"]) { + _$jscoverage['middleware/staticCache.js'][208]++; + return true; + } + _$jscoverage['middleware/staticCache.js'][210]++; + if (reqCC["no-cache"]) { + _$jscoverage['middleware/staticCache.js'][210]++; + return true; + } + _$jscoverage['middleware/staticCache.js'][212]++; + if (null != reqCC["max-age"]) { + _$jscoverage['middleware/staticCache.js'][212]++; + return reqCC["max-age"] < cacheAge; + } + _$jscoverage['middleware/staticCache.js'][214]++; + if (null != cacheCC["max-age"]) { + _$jscoverage['middleware/staticCache.js'][214]++; + return cacheCC["max-age"] < cacheAge; + } + _$jscoverage['middleware/staticCache.js'][216]++; + return false; +} +_$jscoverage['middleware/staticCache.js'][229]++; +function cacheKey(req) { + _$jscoverage['middleware/staticCache.js'][230]++; + return utils.parseUrl(req).path; +} +_$jscoverage['middleware/staticCache.js'].source = ["","/*!"," * Connect - staticCache"," * Copyright(c) 2011 Sencha Inc."," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils')"," , Cache = require('../cache')"," , fresh = require('fresh');","","/**"," * Static cache:"," *"," * Enables a memory cache layer on top of"," * the `static()` middleware, serving popular"," * static files."," *"," * By default a maximum of 128 objects are"," * held in cache, with a max of 256k each,"," * totalling ~32mb."," *"," * A Least-Recently-Used (LRU) cache algo"," * is implemented through the `Cache` object,"," * simply rotating cache objects as they are"," * hit. This means that increasingly popular"," * objects maintain their positions while"," * others get shoved out of the stack and"," * garbage collected."," *"," * Benchmarks:"," *"," * static(): 2700 rps"," * node-static: 5300 rps"," * static() + staticCache(): 7500 rps"," *"," * Options:"," *"," * - `maxObjects` max cache objects [128]"," * - `maxLength` max cache object length 256kb"," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","module.exports = function staticCache(options){"," var options = options || {}"," , cache = new Cache(options.maxObjects || 128)"," , maxlen = options.maxLength || 1024 * 256;",""," console.warn('connect.staticCache() is deprecated and will be removed in 3.0');"," console.warn('use varnish or similar reverse proxy caches.');",""," return function staticCache(req, res, next){"," var key = cacheKey(req)"," , ranges = req.headers.range"," , hasCookies = req.headers.cookie"," , hit = cache.get(key);",""," // cache static"," // TODO: change from staticCache() -> cache()"," // and make this work for any request"," req.on('static', function(stream){"," var headers = res._headers"," , cc = utils.parseCacheControl(headers['cache-control'] || '')"," , contentLength = headers['content-length']"," , hit;",""," // dont cache set-cookie responses"," if (headers['set-cookie']) return hasCookies = true;",""," // dont cache when cookies are present"," if (hasCookies) return;",""," // ignore larger files"," if (!contentLength || contentLength > maxlen) return;",""," // don't cache partial files"," if (headers['content-range']) return;",""," // dont cache items we shouldn't be"," // TODO: real support for must-revalidate / no-cache"," if ( cc['no-cache']"," || cc['no-store']"," || cc['private']"," || cc['must-revalidate']) return;",""," // if already in cache then validate"," if (hit = cache.get(key)){"," if (headers.etag == hit[0].etag) {"," hit[0].date = new Date;"," return;"," } else {"," cache.remove(key);"," }"," }",""," // validation notifiactions don't contain a steam"," if (null == stream) return;",""," // add the cache object"," var arr = [];",""," // store the chunks"," stream.on('data', function(chunk){"," arr.push(chunk);"," });",""," // flag it as complete"," stream.on('end', function(){"," var cacheEntry = cache.add(key);"," delete headers['x-cache']; // Clean up (TODO: others)"," cacheEntry.push(200);"," cacheEntry.push(headers);"," cacheEntry.push.apply(cacheEntry, arr);"," });"," });",""," if (req.method == 'GET' || req.method == 'HEAD') {"," if (ranges) {"," next();"," } else if (!hasCookies && hit && !mustRevalidate(req, hit)) {"," res.setHeader('X-Cache', 'HIT');"," respondFromCache(req, res, hit);"," } else {"," res.setHeader('X-Cache', 'MISS');"," next();"," }"," } else {"," next();"," }"," }","};","","/**"," * Respond with the provided cached value."," * TODO: Assume 200 code, that's iffy."," *"," * @param {Object} req"," * @param {Object} res"," * @param {Object} cacheEntry"," * @return {String}"," * @api private"," */","","function respondFromCache(req, res, cacheEntry) {"," var status = cacheEntry[0]"," , headers = utils.merge({}, cacheEntry[1])"," , content = cacheEntry.slice(2);",""," headers.age = (new Date - new Date(headers.date)) / 1000 || 0;",""," switch (req.method) {"," case 'HEAD':"," res.writeHead(status, headers);"," res.end();"," break;"," case 'GET':"," if (utils.conditionalGET(req) && fresh(req.headers, headers)) {"," headers['content-length'] = 0;"," res.writeHead(304, headers);"," res.end();"," } else {"," res.writeHead(status, headers);",""," function write() {"," while (content.length) {"," if (false === res.write(content.shift())) {"," res.once('drain', write);"," return;"," }"," }"," res.end();"," }",""," write();"," }"," break;"," default:"," // This should never happen."," res.writeHead(500, '');"," res.end();"," }","}","","/**"," * Determine whether or not a cached value must be revalidated."," *"," * @param {Object} req"," * @param {Object} cacheEntry"," * @return {String}"," * @api private"," */","","function mustRevalidate(req, cacheEntry) {"," var cacheHeaders = cacheEntry[1]"," , reqCC = utils.parseCacheControl(req.headers['cache-control'] || '')"," , cacheCC = utils.parseCacheControl(cacheHeaders['cache-control'] || '')"," , cacheAge = (new Date - new Date(cacheHeaders.date)) / 1000 || 0;",""," if ( cacheCC['no-cache']"," || cacheCC['must-revalidate']"," || cacheCC['proxy-revalidate']) return true;",""," if (reqCC['no-cache']) return true;",""," if (null != reqCC['max-age']) return reqCC['max-age'] < cacheAge;",""," if (null != cacheCC['max-age']) return cacheCC['max-age'] < cacheAge;",""," return false;","}","","/**"," * The key to use in the cache. For now, this is the URL path and query."," *"," * 'http://example.com?key=value' -> '/?key=value'"," *"," * @param {Object} req"," * @return {String}"," * @api private"," */","","function cacheKey(req) {"," return utils.parseUrl(req).path;","}"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/timeout.js b/node_modules/express/node_modules/connect/lib-cov/middleware/timeout.js new file mode 100644 index 0000000..de0e573 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/timeout.js @@ -0,0 +1,66 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/timeout.js']) { + _$jscoverage['middleware/timeout.js'] = []; + _$jscoverage['middleware/timeout.js'][12] = 0; + _$jscoverage['middleware/timeout.js'][30] = 0; + _$jscoverage['middleware/timeout.js'][31] = 0; + _$jscoverage['middleware/timeout.js'][33] = 0; + _$jscoverage['middleware/timeout.js'][34] = 0; + _$jscoverage['middleware/timeout.js'][35] = 0; + _$jscoverage['middleware/timeout.js'][38] = 0; + _$jscoverage['middleware/timeout.js'][39] = 0; + _$jscoverage['middleware/timeout.js'][40] = 0; + _$jscoverage['middleware/timeout.js'][41] = 0; + _$jscoverage['middleware/timeout.js'][42] = 0; + _$jscoverage['middleware/timeout.js'][43] = 0; + _$jscoverage['middleware/timeout.js'][46] = 0; + _$jscoverage['middleware/timeout.js'][47] = 0; + _$jscoverage['middleware/timeout.js'][50] = 0; + _$jscoverage['middleware/timeout.js'][51] = 0; + _$jscoverage['middleware/timeout.js'][54] = 0; +} +_$jscoverage['middleware/timeout.js'][12]++; +var debug = require("debug")("connect:timeout"); +_$jscoverage['middleware/timeout.js'][30]++; +module.exports = (function timeout(ms) { + _$jscoverage['middleware/timeout.js'][31]++; + ms = ms || 5000; + _$jscoverage['middleware/timeout.js'][33]++; + return (function (req, res, next) { + _$jscoverage['middleware/timeout.js'][34]++; + var id = setTimeout((function () { + _$jscoverage['middleware/timeout.js'][35]++; + req.emit("timeout", ms); +}), ms); + _$jscoverage['middleware/timeout.js'][38]++; + req.on("timeout", (function () { + _$jscoverage['middleware/timeout.js'][39]++; + if (req.headerSent) { + _$jscoverage['middleware/timeout.js'][39]++; + return debug("response started, cannot timeout"); + } + _$jscoverage['middleware/timeout.js'][40]++; + var err = new Error("Request timeout"); + _$jscoverage['middleware/timeout.js'][41]++; + err.timeout = ms; + _$jscoverage['middleware/timeout.js'][42]++; + err.status = 408; + _$jscoverage['middleware/timeout.js'][43]++; + next(err); +})); + _$jscoverage['middleware/timeout.js'][46]++; + req.clearTimeout = (function () { + _$jscoverage['middleware/timeout.js'][47]++; + clearTimeout(id); +}); + _$jscoverage['middleware/timeout.js'][50]++; + res.on("header", (function () { + _$jscoverage['middleware/timeout.js'][51]++; + clearTimeout(id); +})); + _$jscoverage['middleware/timeout.js'][54]++; + next(); +}); +}); +_$jscoverage['middleware/timeout.js'].source = ["","/*!"," * Connect - timeout"," * Ported from https://github.com/LearnBoost/connect-timeout"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var debug = require('debug')('connect:timeout');","","/**"," * Timeout:"," *"," * Times out the request in `ms`, defaulting to `5000`. The"," * method `req.clearTimeout()` is added to revert this behaviour"," * programmatically within your application's middleware, routes, etc."," *"," * The timeout error is passed to `next()` so that you may customize"," * the response behaviour. This error has the `.timeout` property as"," * well as `.status == 408`."," *"," * @param {Number} ms"," * @return {Function}"," * @api public"," */","","module.exports = function timeout(ms) {"," ms = ms || 5000;",""," return function(req, res, next) {"," var id = setTimeout(function(){"," req.emit('timeout', ms);"," }, ms);",""," req.on('timeout', function(){"," if (req.headerSent) return debug('response started, cannot timeout');"," var err = new Error('Request timeout');"," err.timeout = ms;"," err.status = 408;"," next(err);"," });",""," req.clearTimeout = function(){"," clearTimeout(id);"," };",""," res.on('header', function(){"," clearTimeout(id);"," });",""," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/urlencoded.js b/node_modules/express/node_modules/connect/lib-cov/middleware/urlencoded.js new file mode 100644 index 0000000..c8dbcef --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/urlencoded.js @@ -0,0 +1,98 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/urlencoded.js']) { + _$jscoverage['middleware/urlencoded.js'] = []; + _$jscoverage['middleware/urlencoded.js'][13] = 0; + _$jscoverage['middleware/urlencoded.js'][21] = 0; + _$jscoverage['middleware/urlencoded.js'][22] = 0; + _$jscoverage['middleware/urlencoded.js'][40] = 0; + _$jscoverage['middleware/urlencoded.js'][41] = 0; + _$jscoverage['middleware/urlencoded.js'][43] = 0; + _$jscoverage['middleware/urlencoded.js'][47] = 0; + _$jscoverage['middleware/urlencoded.js'][48] = 0; + _$jscoverage['middleware/urlencoded.js'][49] = 0; + _$jscoverage['middleware/urlencoded.js'][51] = 0; + _$jscoverage['middleware/urlencoded.js'][54] = 0; + _$jscoverage['middleware/urlencoded.js'][57] = 0; + _$jscoverage['middleware/urlencoded.js'][60] = 0; + _$jscoverage['middleware/urlencoded.js'][61] = 0; + _$jscoverage['middleware/urlencoded.js'][62] = 0; + _$jscoverage['middleware/urlencoded.js'][63] = 0; + _$jscoverage['middleware/urlencoded.js'][64] = 0; + _$jscoverage['middleware/urlencoded.js'][65] = 0; + _$jscoverage['middleware/urlencoded.js'][66] = 0; + _$jscoverage['middleware/urlencoded.js'][67] = 0; + _$jscoverage['middleware/urlencoded.js'][70] = 0; + _$jscoverage['middleware/urlencoded.js'][72] = 0; + _$jscoverage['middleware/urlencoded.js'][73] = 0; +} +_$jscoverage['middleware/urlencoded.js'][13]++; +var utils = require("../utils"), _limit = require("./limit"), qs = require("qs"); +_$jscoverage['middleware/urlencoded.js'][21]++; +function noop(req, res, next) { + _$jscoverage['middleware/urlencoded.js'][22]++; + next(); +} +_$jscoverage['middleware/urlencoded.js'][40]++; +exports = module.exports = (function (options) { + _$jscoverage['middleware/urlencoded.js'][41]++; + options = options || {}; + _$jscoverage['middleware/urlencoded.js'][43]++; + var limit = options.limit? _limit(options.limit): noop; + _$jscoverage['middleware/urlencoded.js'][47]++; + return (function urlencoded(req, res, next) { + _$jscoverage['middleware/urlencoded.js'][48]++; + if (req._body) { + _$jscoverage['middleware/urlencoded.js'][48]++; + return next(); + } + _$jscoverage['middleware/urlencoded.js'][49]++; + req.body = req.body || {}; + _$jscoverage['middleware/urlencoded.js'][51]++; + if (! utils.hasBody(req)) { + _$jscoverage['middleware/urlencoded.js'][51]++; + return next(); + } + _$jscoverage['middleware/urlencoded.js'][54]++; + if ("application/x-www-form-urlencoded" != utils.mime(req)) { + _$jscoverage['middleware/urlencoded.js'][54]++; + return next(); + } + _$jscoverage['middleware/urlencoded.js'][57]++; + req._body = true; + _$jscoverage['middleware/urlencoded.js'][60]++; + limit(req, res, (function (err) { + _$jscoverage['middleware/urlencoded.js'][61]++; + if (err) { + _$jscoverage['middleware/urlencoded.js'][61]++; + return next(err); + } + _$jscoverage['middleware/urlencoded.js'][62]++; + var buf = ""; + _$jscoverage['middleware/urlencoded.js'][63]++; + req.setEncoding("utf8"); + _$jscoverage['middleware/urlencoded.js'][64]++; + req.on("data", (function (chunk) { + _$jscoverage['middleware/urlencoded.js'][64]++; + buf += chunk; +})); + _$jscoverage['middleware/urlencoded.js'][65]++; + req.on("end", (function () { + _$jscoverage['middleware/urlencoded.js'][66]++; + try { + _$jscoverage['middleware/urlencoded.js'][67]++; + req.body = buf.length? qs.parse(buf, options): {}; + _$jscoverage['middleware/urlencoded.js'][70]++; + next(); + } + catch (err) { + _$jscoverage['middleware/urlencoded.js'][72]++; + err.body = buf; + _$jscoverage['middleware/urlencoded.js'][73]++; + next(err); + } +})); +})); +}); +}); +_$jscoverage['middleware/urlencoded.js'].source = ["","/*!"," * Connect - urlencoded"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils')"," , _limit = require('./limit')"," , qs = require('qs');","","/**"," * noop middleware."," */","","function noop(req, res, next) {"," next();","}","","/**"," * Urlencoded:"," * "," * Parse x-ww-form-urlencoded request bodies,"," * providing the parsed object as `req.body`."," *"," * Options:"," *"," * - `limit` byte limit disabled by default"," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function(options){"," options = options || {};",""," var limit = options.limit"," ? _limit(options.limit)"," : noop;",""," return function urlencoded(req, res, next) {"," if (req._body) return next();"," req.body = req.body || {};",""," if (!utils.hasBody(req)) return next();",""," // check Content-Type"," if ('application/x-www-form-urlencoded' != utils.mime(req)) return next();",""," // flag as parsed"," req._body = true;",""," // parse"," limit(req, res, function(err){"," if (err) return next(err);"," var buf = '';"," req.setEncoding('utf8');"," req.on('data', function(chunk){ buf += chunk });"," req.on('end', function(){"," try {"," req.body = buf.length"," ? qs.parse(buf, options)"," : {};"," next();"," } catch (err){"," err.body = buf;"," next(err);"," }"," });"," });"," }","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/vhost.js b/node_modules/express/node_modules/connect/lib-cov/middleware/vhost.js new file mode 100644 index 0000000..b069e5c --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/middleware/vhost.js @@ -0,0 +1,59 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['middleware/vhost.js']) { + _$jscoverage['middleware/vhost.js'] = []; + _$jscoverage['middleware/vhost.js'][28] = 0; + _$jscoverage['middleware/vhost.js'][29] = 0; + _$jscoverage['middleware/vhost.js'][30] = 0; + _$jscoverage['middleware/vhost.js'][31] = 0; + _$jscoverage['middleware/vhost.js'][32] = 0; + _$jscoverage['middleware/vhost.js'][33] = 0; + _$jscoverage['middleware/vhost.js'][34] = 0; + _$jscoverage['middleware/vhost.js'][35] = 0; + _$jscoverage['middleware/vhost.js'][36] = 0; + _$jscoverage['middleware/vhost.js'][37] = 0; + _$jscoverage['middleware/vhost.js'][38] = 0; +} +_$jscoverage['middleware/vhost.js'][28]++; +module.exports = (function vhost(hostname, server) { + _$jscoverage['middleware/vhost.js'][29]++; + if (! hostname) { + _$jscoverage['middleware/vhost.js'][29]++; + throw new Error("vhost hostname required"); + } + _$jscoverage['middleware/vhost.js'][30]++; + if (! server) { + _$jscoverage['middleware/vhost.js'][30]++; + throw new Error("vhost server required"); + } + _$jscoverage['middleware/vhost.js'][31]++; + var regexp = new RegExp("^" + hostname.replace(/[*]/g, "(.*?)") + "$", "i"); + _$jscoverage['middleware/vhost.js'][32]++; + if (server.onvhost) { + _$jscoverage['middleware/vhost.js'][32]++; + server.onvhost(hostname); + } + _$jscoverage['middleware/vhost.js'][33]++; + return (function vhost(req, res, next) { + _$jscoverage['middleware/vhost.js'][34]++; + if (! req.headers.host) { + _$jscoverage['middleware/vhost.js'][34]++; + return next(); + } + _$jscoverage['middleware/vhost.js'][35]++; + var host = req.headers.host.split(":")[0]; + _$jscoverage['middleware/vhost.js'][36]++; + if (! regexp.test(host)) { + _$jscoverage['middleware/vhost.js'][36]++; + return next(); + } + _$jscoverage['middleware/vhost.js'][37]++; + if ("function" == typeof server) { + _$jscoverage['middleware/vhost.js'][37]++; + return server(req, res, next); + } + _$jscoverage['middleware/vhost.js'][38]++; + server.emit("request", req, res); +}); +}); +_$jscoverage['middleware/vhost.js'].source = ["","/*!"," * Connect - vhost"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Vhost:"," * "," * Setup vhost for the given `hostname` and `server`."," *"," * connect()"," * .use(connect.vhost('foo.com', fooApp))"," * .use(connect.vhost('bar.com', barApp))"," * .use(connect.vhost('*.com', mainApp))"," *"," * The `server` may be a Connect server or"," * a regular Node `http.Server`. "," *"," * @param {String} hostname"," * @param {Server} server"," * @return {Function}"," * @api public"," */","","module.exports = function vhost(hostname, server){"," if (!hostname) throw new Error('vhost hostname required');"," if (!server) throw new Error('vhost server required');"," var regexp = new RegExp('^' + hostname.replace(/[*]/g, '(.*?)') + '$', 'i');"," if (server.onvhost) server.onvhost(hostname);"," return function vhost(req, res, next){"," if (!req.headers.host) return next();"," var host = req.headers.host.split(':')[0];"," if (!regexp.test(host)) return next();"," if ('function' == typeof server) return server(req, res, next);"," server.emit('request', req, res);"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/patch.js b/node_modules/express/node_modules/connect/lib-cov/patch.js new file mode 100644 index 0000000..7d59643 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/patch.js @@ -0,0 +1,85 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['patch.js']) { + _$jscoverage['patch.js'] = []; + _$jscoverage['patch.js'][12] = 0; + _$jscoverage['patch.js'][20] = 0; + _$jscoverage['patch.js'][30] = 0; + _$jscoverage['patch.js'][31] = 0; + _$jscoverage['patch.js'][43] = 0; + _$jscoverage['patch.js'][44] = 0; + _$jscoverage['patch.js'][48] = 0; + _$jscoverage['patch.js'][49] = 0; + _$jscoverage['patch.js'][50] = 0; + _$jscoverage['patch.js'][55] = 0; + _$jscoverage['patch.js'][56] = 0; + _$jscoverage['patch.js'][59] = 0; + _$jscoverage['patch.js'][66] = 0; + _$jscoverage['patch.js'][67] = 0; + _$jscoverage['patch.js'][68] = 0; + _$jscoverage['patch.js'][69] = 0; + _$jscoverage['patch.js'][72] = 0; + _$jscoverage['patch.js'][73] = 0; + _$jscoverage['patch.js'][74] = 0; + _$jscoverage['patch.js'][75] = 0; + _$jscoverage['patch.js'][78] = 0; +} +_$jscoverage['patch.js'][12]++; +var http = require("http"), res = http.ServerResponse.prototype, setHeader = res.setHeader, _renderHeaders = res._renderHeaders, writeHead = res.writeHead; +_$jscoverage['patch.js'][20]++; +if (! res._hasConnectPatch) { + _$jscoverage['patch.js'][30]++; + res.__defineGetter__("headerSent", (function () { + _$jscoverage['patch.js'][31]++; + return this._header; +})); + _$jscoverage['patch.js'][43]++; + res.setHeader = (function (field, val) { + _$jscoverage['patch.js'][44]++; + var key = field.toLowerCase(), prev; + _$jscoverage['patch.js'][48]++; + if (this._headers && "set-cookie" == key) { + _$jscoverage['patch.js'][49]++; + if (prev = this.getHeader(field)) { + _$jscoverage['patch.js'][50]++; + val = Array.isArray(prev)? prev.concat(val): [prev, val]; + } + } + else { + _$jscoverage['patch.js'][55]++; + if ("content-type" == key && this.charset) { + _$jscoverage['patch.js'][56]++; + val += "; charset=" + this.charset; + } + } + _$jscoverage['patch.js'][59]++; + return setHeader.call(this, field, val); +}); + _$jscoverage['patch.js'][66]++; + res._renderHeaders = (function () { + _$jscoverage['patch.js'][67]++; + if (! this._emittedHeader) { + _$jscoverage['patch.js'][67]++; + this.emit("header"); + } + _$jscoverage['patch.js'][68]++; + this._emittedHeader = true; + _$jscoverage['patch.js'][69]++; + return _renderHeaders.call(this); +}); + _$jscoverage['patch.js'][72]++; + res.writeHead = (function () { + _$jscoverage['patch.js'][73]++; + if (! this._emittedHeader) { + _$jscoverage['patch.js'][73]++; + this.emit("header"); + } + _$jscoverage['patch.js'][74]++; + this._emittedHeader = true; + _$jscoverage['patch.js'][75]++; + return writeHead.apply(this, arguments); +}); + _$jscoverage['patch.js'][78]++; + res._hasConnectPatch = true; +} +_$jscoverage['patch.js'].source = ["","/*!"," * Connect"," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var http = require('http')"," , res = http.ServerResponse.prototype"," , setHeader = res.setHeader"," , _renderHeaders = res._renderHeaders"," , writeHead = res.writeHead;","","// apply only once","","if (!res._hasConnectPatch) {",""," /**"," * Provide a public \"header sent\" flag"," * until node does."," *"," * @return {Boolean}"," * @api public"," */",""," res.__defineGetter__('headerSent', function(){"," return this._header;"," });",""," /**"," * Set header `field` to `val`, special-casing"," * the `Set-Cookie` field for multiple support."," *"," * @param {String} field"," * @param {String} val"," * @api public"," */",""," res.setHeader = function(field, val){"," var key = field.toLowerCase()"," , prev;",""," // special-case Set-Cookie"," if (this._headers && 'set-cookie' == key) {"," if (prev = this.getHeader(field)) {"," val = Array.isArray(prev)"," ? prev.concat(val)"," : [prev, val];"," }"," // charset"," } else if ('content-type' == key && this.charset) {"," val += '; charset=' + this.charset;"," }",""," return setHeader.call(this, field, val);"," };",""," /**"," * Proxy to emit \"header\" event."," */",""," res._renderHeaders = function(){"," if (!this._emittedHeader) this.emit('header');"," this._emittedHeader = true;"," return _renderHeaders.call(this);"," };",""," res.writeHead = function(){"," if (!this._emittedHeader) this.emit('header');"," this._emittedHeader = true;"," return writeHead.apply(this, arguments);"," };",""," res._hasConnectPatch = true;","}"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/proto.js b/node_modules/express/node_modules/connect/lib-cov/proto.js new file mode 100644 index 0000000..e8ecb99 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/proto.js @@ -0,0 +1,285 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['proto.js']) { + _$jscoverage['proto.js'] = []; + _$jscoverage['proto.js'][13] = 0; + _$jscoverage['proto.js'][19] = 0; + _$jscoverage['proto.js'][23] = 0; + _$jscoverage['proto.js'][62] = 0; + _$jscoverage['proto.js'][64] = 0; + _$jscoverage['proto.js'][65] = 0; + _$jscoverage['proto.js'][66] = 0; + _$jscoverage['proto.js'][70] = 0; + _$jscoverage['proto.js'][71] = 0; + _$jscoverage['proto.js'][72] = 0; + _$jscoverage['proto.js'][73] = 0; + _$jscoverage['proto.js'][74] = 0; + _$jscoverage['proto.js'][79] = 0; + _$jscoverage['proto.js'][80] = 0; + _$jscoverage['proto.js'][84] = 0; + _$jscoverage['proto.js'][85] = 0; + _$jscoverage['proto.js'][89] = 0; + _$jscoverage['proto.js'][90] = 0; + _$jscoverage['proto.js'][92] = 0; + _$jscoverage['proto.js'][102] = 0; + _$jscoverage['proto.js'][103] = 0; + _$jscoverage['proto.js'][109] = 0; + _$jscoverage['proto.js'][110] = 0; + _$jscoverage['proto.js'][112] = 0; + _$jscoverage['proto.js'][113] = 0; + _$jscoverage['proto.js'][114] = 0; + _$jscoverage['proto.js'][117] = 0; + _$jscoverage['proto.js'][118] = 0; + _$jscoverage['proto.js'][119] = 0; + _$jscoverage['proto.js'][122] = 0; + _$jscoverage['proto.js'][125] = 0; + _$jscoverage['proto.js'][127] = 0; + _$jscoverage['proto.js'][130] = 0; + _$jscoverage['proto.js'][132] = 0; + _$jscoverage['proto.js'][133] = 0; + _$jscoverage['proto.js'][136] = 0; + _$jscoverage['proto.js'][139] = 0; + _$jscoverage['proto.js'][144] = 0; + _$jscoverage['proto.js'][145] = 0; + _$jscoverage['proto.js'][146] = 0; + _$jscoverage['proto.js'][147] = 0; + _$jscoverage['proto.js'][148] = 0; + _$jscoverage['proto.js'][149] = 0; + _$jscoverage['proto.js'][151] = 0; + _$jscoverage['proto.js'][152] = 0; + _$jscoverage['proto.js'][153] = 0; + _$jscoverage['proto.js'][154] = 0; + _$jscoverage['proto.js'][155] = 0; + _$jscoverage['proto.js'][157] = 0; + _$jscoverage['proto.js'][160] = 0; + _$jscoverage['proto.js'][161] = 0; + _$jscoverage['proto.js'][162] = 0; + _$jscoverage['proto.js'][165] = 0; + _$jscoverage['proto.js'][167] = 0; + _$jscoverage['proto.js'][168] = 0; + _$jscoverage['proto.js'][172] = 0; + _$jscoverage['proto.js'][173] = 0; + _$jscoverage['proto.js'][176] = 0; + _$jscoverage['proto.js'][177] = 0; + _$jscoverage['proto.js'][178] = 0; + _$jscoverage['proto.js'][181] = 0; + _$jscoverage['proto.js'][182] = 0; + _$jscoverage['proto.js'][183] = 0; + _$jscoverage['proto.js'][184] = 0; + _$jscoverage['proto.js'][185] = 0; + _$jscoverage['proto.js'][187] = 0; + _$jscoverage['proto.js'][189] = 0; + _$jscoverage['proto.js'][190] = 0; + _$jscoverage['proto.js'][192] = 0; + _$jscoverage['proto.js'][195] = 0; + _$jscoverage['proto.js'][198] = 0; + _$jscoverage['proto.js'][227] = 0; + _$jscoverage['proto.js'][228] = 0; + _$jscoverage['proto.js'][229] = 0; +} +_$jscoverage['proto.js'][13]++; +var http = require("http"), utils = require("./utils"), debug = require("debug")("connect:dispatcher"); +_$jscoverage['proto.js'][19]++; +var app = module.exports = {}; +_$jscoverage['proto.js'][23]++; +var env = process.env.NODE_ENV || "development"; +_$jscoverage['proto.js'][62]++; +app.use = (function (route, fn) { + _$jscoverage['proto.js'][64]++; + if ("string" != typeof route) { + _$jscoverage['proto.js'][65]++; + fn = route; + _$jscoverage['proto.js'][66]++; + route = "/"; + } + _$jscoverage['proto.js'][70]++; + if ("function" == typeof fn.handle) { + _$jscoverage['proto.js'][71]++; + var server = fn; + _$jscoverage['proto.js'][72]++; + fn.route = route; + _$jscoverage['proto.js'][73]++; + fn = (function (req, res, next) { + _$jscoverage['proto.js'][74]++; + server.handle(req, res, next); +}); + } + _$jscoverage['proto.js'][79]++; + if (fn instanceof http.Server) { + _$jscoverage['proto.js'][80]++; + fn = fn.listeners("request")[0]; + } + _$jscoverage['proto.js'][84]++; + if ("/" == route[route.length - 1]) { + _$jscoverage['proto.js'][85]++; + route = route.slice(0, -1); + } + _$jscoverage['proto.js'][89]++; + debug("use %s %s", route || "/", fn.name || "anonymous"); + _$jscoverage['proto.js'][90]++; + this.stack.push({route: route, handle: fn}); + _$jscoverage['proto.js'][92]++; + return this; +}); +_$jscoverage['proto.js'][102]++; +app.handle = (function (req, res, out) { + _$jscoverage['proto.js'][103]++; + var stack = this.stack, fqdn = ~ req.url.indexOf("://"), removed = "", slashAdded = false, index = 0; + _$jscoverage['proto.js'][109]++; + function next(err) { + _$jscoverage['proto.js'][110]++; + var layer, path, status, c; + _$jscoverage['proto.js'][112]++; + if (slashAdded) { + _$jscoverage['proto.js'][113]++; + req.url = req.url.substr(1); + _$jscoverage['proto.js'][114]++; + slashAdded = false; + } + _$jscoverage['proto.js'][117]++; + req.url = removed + req.url; + _$jscoverage['proto.js'][118]++; + req.originalUrl = req.originalUrl || req.url; + _$jscoverage['proto.js'][119]++; + removed = ""; + _$jscoverage['proto.js'][122]++; + layer = stack[index++]; + _$jscoverage['proto.js'][125]++; + if (! layer || res.headerSent) { + _$jscoverage['proto.js'][127]++; + if (out) { + _$jscoverage['proto.js'][127]++; + return out(err); + } + _$jscoverage['proto.js'][130]++; + if (err) { + _$jscoverage['proto.js'][132]++; + if (res.statusCode < 400) { + _$jscoverage['proto.js'][132]++; + res.statusCode = 500; + } + _$jscoverage['proto.js'][133]++; + debug("default %s", res.statusCode); + _$jscoverage['proto.js'][136]++; + if (err.status) { + _$jscoverage['proto.js'][136]++; + res.statusCode = err.status; + } + _$jscoverage['proto.js'][139]++; + var msg = "production" == env? http.STATUS_CODES[res.statusCode]: err.stack || err.toString(); + _$jscoverage['proto.js'][144]++; + if ("test" != env) { + _$jscoverage['proto.js'][144]++; + console.error(err.stack || err.toString()); + } + _$jscoverage['proto.js'][145]++; + if (res.headerSent) { + _$jscoverage['proto.js'][145]++; + return req.socket.destroy(); + } + _$jscoverage['proto.js'][146]++; + res.setHeader("Content-Type", "text/plain"); + _$jscoverage['proto.js'][147]++; + res.setHeader("Content-Length", Buffer.byteLength(msg)); + _$jscoverage['proto.js'][148]++; + if ("HEAD" == req.method) { + _$jscoverage['proto.js'][148]++; + return res.end(); + } + _$jscoverage['proto.js'][149]++; + res.end(msg); + } + else { + _$jscoverage['proto.js'][151]++; + debug("default 404"); + _$jscoverage['proto.js'][152]++; + res.statusCode = 404; + _$jscoverage['proto.js'][153]++; + res.setHeader("Content-Type", "text/plain"); + _$jscoverage['proto.js'][154]++; + if ("HEAD" == req.method) { + _$jscoverage['proto.js'][154]++; + return res.end(); + } + _$jscoverage['proto.js'][155]++; + res.end("Cannot " + req.method + " " + utils.escape(req.originalUrl)); + } + _$jscoverage['proto.js'][157]++; + return; + } + _$jscoverage['proto.js'][160]++; + try { + _$jscoverage['proto.js'][161]++; + path = utils.parseUrl(req).pathname; + _$jscoverage['proto.js'][162]++; + if (undefined == path) { + _$jscoverage['proto.js'][162]++; + path = "/"; + } + _$jscoverage['proto.js'][165]++; + if (0 != path.toLowerCase().indexOf(layer.route.toLowerCase())) { + _$jscoverage['proto.js'][165]++; + return next(err); + } + _$jscoverage['proto.js'][167]++; + c = path[layer.route.length]; + _$jscoverage['proto.js'][168]++; + if (c && "/" != c && "." != c) { + _$jscoverage['proto.js'][168]++; + return next(err); + } + _$jscoverage['proto.js'][172]++; + removed = layer.route; + _$jscoverage['proto.js'][173]++; + req.url = req.url.substr(removed.length); + _$jscoverage['proto.js'][176]++; + if (! fqdn && "/" != req.url[0]) { + _$jscoverage['proto.js'][177]++; + req.url = "/" + req.url; + _$jscoverage['proto.js'][178]++; + slashAdded = true; + } + _$jscoverage['proto.js'][181]++; + debug("%s", layer.handle.name || "anonymous"); + _$jscoverage['proto.js'][182]++; + var arity = layer.handle.length; + _$jscoverage['proto.js'][183]++; + if (err) { + _$jscoverage['proto.js'][184]++; + if (arity === 4) { + _$jscoverage['proto.js'][185]++; + layer.handle(err, req, res, next); + } + else { + _$jscoverage['proto.js'][187]++; + next(err); + } + } + else { + _$jscoverage['proto.js'][189]++; + if (arity < 4) { + _$jscoverage['proto.js'][190]++; + layer.handle(req, res, next); + } + else { + _$jscoverage['proto.js'][192]++; + next(); + } + } + } + catch (e) { + _$jscoverage['proto.js'][195]++; + next(e); + } +} + _$jscoverage['proto.js'][198]++; + next(); +}); +_$jscoverage['proto.js'][227]++; +app.listen = (function () { + _$jscoverage['proto.js'][228]++; + var server = http.createServer(this); + _$jscoverage['proto.js'][229]++; + return server.listen.apply(server, arguments); +}); +_$jscoverage['proto.js'].source = ["","/*!"," * Connect - HTTPServer"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var http = require('http')"," , utils = require('./utils')"," , debug = require('debug')('connect:dispatcher');","","// prototype","","var app = module.exports = {};","","// environment","","var env = process.env.NODE_ENV || 'development';","","/**"," * Utilize the given middleware `handle` to the given `route`,"," * defaulting to _/_. This \"route\" is the mount-point for the"," * middleware, when given a value other than _/_ the middleware"," * is only effective when that segment is present in the request's"," * pathname."," *"," * For example if we were to mount a function at _/admin_, it would"," * be invoked on _/admin_, and _/admin/settings_, however it would"," * not be invoked for _/_, or _/posts_."," *"," * Examples:"," *"," * var app = connect();"," * app.use(connect.favicon());"," * app.use(connect.logger());"," * app.use(connect.static(__dirname + '/public'));"," *"," * If we wanted to prefix static files with _/public_, we could"," * \"mount\" the `static()` middleware:"," *"," * app.use('/public', connect.static(__dirname + '/public'));"," *"," * This api is chainable, so the following is valid:"," *"," * connect()"," * .use(connect.favicon())"," * .use(connect.logger())"," * .use(connect.static(__dirname + '/public'))"," * .listen(3000);"," *"," * @param {String|Function|Server} route, callback or server"," * @param {Function|Server} callback or server"," * @return {Server} for chaining"," * @api public"," */","","app.use = function(route, fn){"," // default route to '/'"," if ('string' != typeof route) {"," fn = route;"," route = '/';"," }",""," // wrap sub-apps"," if ('function' == typeof fn.handle) {"," var server = fn;"," fn.route = route;"," fn = function(req, res, next){"," server.handle(req, res, next);"," };"," }",""," // wrap vanilla http.Servers"," if (fn instanceof http.Server) {"," fn = fn.listeners('request')[0];"," }",""," // strip trailing slash"," if ('/' == route[route.length - 1]) {"," route = route.slice(0, -1);"," }",""," // add the middleware"," debug('use %s %s', route || '/', fn.name || 'anonymous');"," this.stack.push({ route: route, handle: fn });",""," return this;","};","","/**"," * Handle server requests, punting them down"," * the middleware stack."," *"," * @api private"," */","","app.handle = function(req, res, out) {"," var stack = this.stack"," , fqdn = ~req.url.indexOf('://')"," , removed = ''"," , slashAdded = false"," , index = 0;",""," function next(err) {"," var layer, path, status, c;",""," if (slashAdded) {"," req.url = req.url.substr(1);"," slashAdded = false;"," }",""," req.url = removed + req.url;"," req.originalUrl = req.originalUrl || req.url;"," removed = '';",""," // next callback"," layer = stack[index++];",""," // all done"," if (!layer || res.headerSent) {"," // delegate to parent"," if (out) return out(err);",""," // unhandled error"," if (err) {"," // default to 500"," if (res.statusCode < 400) res.statusCode = 500;"," debug('default %s', res.statusCode);",""," // respect err.status"," if (err.status) res.statusCode = err.status;",""," // production gets a basic error message"," var msg = 'production' == env"," ? http.STATUS_CODES[res.statusCode]"," : err.stack || err.toString();",""," // log to stderr in a non-test env"," if ('test' != env) console.error(err.stack || err.toString());"," if (res.headerSent) return req.socket.destroy();"," res.setHeader('Content-Type', 'text/plain');"," res.setHeader('Content-Length', Buffer.byteLength(msg));"," if ('HEAD' == req.method) return res.end();"," res.end(msg);"," } else {"," debug('default 404');"," res.statusCode = 404;"," res.setHeader('Content-Type', 'text/plain');"," if ('HEAD' == req.method) return res.end();"," res.end('Cannot ' + req.method + ' ' + utils.escape(req.originalUrl));"," }"," return;"," }",""," try {"," path = utils.parseUrl(req).pathname;"," if (undefined == path) path = '/';",""," // skip this layer if the route doesn't match."," if (0 != path.toLowerCase().indexOf(layer.route.toLowerCase())) return next(err);",""," c = path[layer.route.length];"," if (c && '/' != c && '.' != c) return next(err);",""," // Call the layer handler"," // Trim off the part of the url that matches the route"," removed = layer.route;"," req.url = req.url.substr(removed.length);",""," // Ensure leading slash"," if (!fqdn && '/' != req.url[0]) {"," req.url = '/' + req.url;"," slashAdded = true;"," }",""," debug('%s', layer.handle.name || 'anonymous');"," var arity = layer.handle.length;"," if (err) {"," if (arity === 4) {"," layer.handle(err, req, res, next);"," } else {"," next(err);"," }"," } else if (arity < 4) {"," layer.handle(req, res, next);"," } else {"," next();"," }"," } catch (e) {"," next(e);"," }"," }"," next();","};","","/**"," * Listen for connections."," *"," * This method takes the same arguments"," * as node's `http.Server#listen()`. "," *"," * HTTP and HTTPS:"," *"," * If you run your application both as HTTP"," * and HTTPS you may wrap them individually,"," * since your Connect \"server\" is really just"," * a JavaScript `Function`."," *"," * var connect = require('connect')"," * , http = require('http')"," * , https = require('https');"," * "," * var app = connect();"," * "," * http.createServer(app).listen(80);"," * https.createServer(options, app).listen(443);"," *"," * @return {http.Server}"," * @api public"," */","","app.listen = function(){"," var server = http.createServer(this);"," return server.listen.apply(server, arguments);","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/public/directory.html b/node_modules/express/node_modules/connect/lib-cov/public/directory.html new file mode 100644 index 0000000..15164bb --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/public/directory.html @@ -0,0 +1,75 @@ + + + listing directory {directory} + + + + + +
    +

    {linked-path}

    + {files} +
    + + \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/lib-cov/public/error.html b/node_modules/express/node_modules/connect/lib-cov/public/error.html new file mode 100644 index 0000000..c5ae73a --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/public/error.html @@ -0,0 +1,13 @@ + + + {error} + + + +
    +

    {title}

    +

    {statusCode} {error}

    +
      {stack}
    +
    + + diff --git a/node_modules/express/node_modules/connect/lib-cov/public/favicon.ico b/node_modules/express/node_modules/connect/lib-cov/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..895fc96a76b68b4924f1c51d022e1b82fa0f461f GIT binary patch literal 1406 zcmZQzU<5(|0R}M0U}azs1F|%L7$l?s#Ec9aKoZP=&}i&OouUjIY8@C}uZw4x5z5N2 zvEG^C^vXtt_xtJ?p3O32c(KTx;lsgZhW%5M85Sf}k-mf`L80)|7ga~M{a znlL=>m1Q`#uoPkbC~GtXMnhnDh5$DU1D6mx+;2QAKt3ZQFH}H~1y~00GcqzVg9QXw z_<%(a7y$V|wJgF=E>MgE#Aid|14}IyCM5MhEnxFF;pTzOK(>#80puP=gnOXwAd33` mpMe2}f66m3eB@_fcnmb^7!b1nO#opK8zcsj1F30)+jEP);68^d)m`eN0o>(5%D`Q(1;j>g@G;xlf`0VBQ`PFY?6)!N&f?*K}$p; zB!U=NBn{eB8${1}&-2_L*HuZp@ZP1@clS@cHp)4iM1ewzw59vko7eMM{e9z|%NNdX z0V;`?KKSzTCvTm5bc{L^CIKLUxc2X{i{ISz$8Sgf{q)1nXTP{`{s?9mQ$4&hPiKC- zY8q7(Y1Xu5iCf33=O4Vy(+|zQ?rW#gkKB0f%}?+6{G*qT22|DQB-73`YzA{N4W^=s zq0kQYcbtFfz zLz)H<&|z(Y4kBG67=JY6c|L1R-#TR>fC$3^Y%QEnYO1xHsf)+GU`3F<{J0kR(;pbF3)zyg$H+idfnl-wl5Wkh!vUH z4Z32YP=l_}1rZd1W_D&^$A($A+&a0e&P?xx0!ctY2}*<#p+qPVN*B(YzvAWXa*%bzq z7Fz41LKILT(GWohi9|LgIzSZBhb*Zf6R6O}WYQ4GOi&71s9lmll0x6;8&ILOl$j(c z0Z1T(6Tg09{?wd{moFHNN6PS?$|e>1MxSJ(0Z7o2)J-Zv|>acY@f`(Y@g7GwsEj5NLQo+q|HsxQ5}XSX_d@*^A9ZT9=A{W~j+$GyI1 zc4oqTHx@1FlRjw4XWyPN5i2~l_F3@aBk!0yu^aoRDvXy}8@HCjUVQUsuSH4$T5|r< zzZOn^?Wfa6y|Q($Hx4{ws+)wX6-HP4zo!S?4KJ@7PG@G3G{CjXs(p*kIrj6rHs7_y z+=<-=Q62s9FuWa^X~WKgJIAAZJR&XBB002ovPDHLkV1jCMPILeO literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_attach.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_attach.png new file mode 100644 index 0000000000000000000000000000000000000000..89ee2da0753040d1ba0a3487473a715a8fe89322 GIT binary patch literal 794 zcmV+#1LgdQP)i_t#ewV_0K6;=bl;e_Jt7$~$sQ)q$+ia<4Ec+jeaGt9oWH@O|2`W6&O0t!k{B9sUvLWxkCaPsd9W(`fa z;j-|^ZI^2XnzhgZWYRW-kP&J>DWPo`%;JaBX}or79k=+Jo@h%4Eo72tqev+cB?PjP zO<|ByL#>Tehyq$jR74O$B9WDW1`tK`LzYyL3A9iAcRxLkJ`I)n}v%Od-3H>j$OTBtk>(k-9o?8PqI=0 zB&f-+KOXVnjyKJlf4iHOtnuiE_4+ZVJ$dHjU<^o^YCjQ-wt^!;rPpBv(@pFO{9rdw98 z_s@3+yta93oyfL>7AD5}r=|`zS3Gm$_|(iSl8XBd9k%=91J0j2=ivT5cJ18ZmDjh{ z$-RMd{jQ#X79#Sc literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_code.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_code.png new file mode 100644 index 0000000000000000000000000000000000000000..f7ea90419d950f9e69d977a1f5847456d96a5f0b GIT binary patch literal 818 zcmV-21I_%2P)@LCln44|RX7Ti z0HI3&7jPq){odH{?_{%nYVq_;n_c4WbUpvU(&Cvnj!vq|kVC-vpF6vp^;;e0mm6HW z+WPzA`AZ|;pPp$&dNjzrc??4rt`k%Q1l*u-BPD0MQ}Fbm8jnsyezNt7+u{23>t7Em zJtETY?ja9KrVs^!LJ$xEMF3-bAZO;-IQJavE60KA7fO$VY_%N)R6s>g5mW>fL4&aR z*EVgKKTBXm!=L?S0?xM zYqL@C$|EDF2q*3zWW7;PDZ}SK*IE8;i!3U62=qn80C&*I1Le7WwNP5EcX;_oh2dJn zf#HgBe4@r$GcjHjmj2vAfT%(YN?}kK=(*+1*DkNNc1H5R++vfBMhACi<5uFUU+N4+ z<&U*CPmWi}REa7C6-t>2im1CWv5Jkefxa6>)dEj-CAW wWa{_}BJ!}~75?MkfaCnj>Dn=~vkLS70Pk`;z)@TQj{pDw07*qoM6N<$f@imYHUIzs literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_copy.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_copy.png new file mode 100644 index 0000000000000000000000000000000000000000..195dc6d6c365d298e466026b37c1959d96119ea7 GIT binary patch literal 663 zcmV;I0%-k-P)^@R5;6Z z(>-WZK@^7J_sq=QY_e{46@P+~LNG}sRzZsxQHvCsN*h5ir6^j7pq-$xu$N#V1gx}9 zClV7;5)7zih-s3DB)G=7|99>ji@So7-P24n=VQ(@GctDX!^_@$bj%oviY6e4Dh;od zooe%Wvs8LEKQ&&bL&@bwi=STIAI@!-gB2jC5+?y?VR~VkrNxam-`6*8&po|RZ5LpS zNKdJ%c4bTX`XjKsnecf%W>1%6WT?pKNdLLq{=(f(Col?P1+oq@R>)W(n=x!|*BIIh z6DJGw_w`)u6yN|vAhMteYK5#b%r5^v+VCFl1IGssaclZZMS{vs-LJ2$)n7DAr6==K z<29#%AXsBsDoO}SBaXR#_Ap!JKx)(1)3O2pj0_dYWz5By*X74fRT01$Fk%P_RzOMDtV?GU{nsYq#K8iy zb6qzLYDj`_f5$BwC*WE(t0m#xYJ*=jC2|HQYHh=pf#QG7oowi`h!L!{DB$8|qY{~X zu8@sU1tWq;n$XThR0%;45mdqXM892|{CJ@0DS*}>?ami06Q_^tvM~Y3K(_-`#m!8f z8f!QIrH4y#61;0Ym0cCoLl8{IPombPHtnn7%SbTdI&G-d>ZQo!_wBMF9nzX!g8HVY xYTJPGciz9XMh3w2fmZ(7v{)r*QZD48?mrio{~IaoqP z|1Ep}yDQG09bP~E^Dk?@JiKQJ z6-pO(3~IOP)IYisL6D6;oAEd;E%zR}{U$rMRNuD6nQV7nesKS>)yLo7JuDCrD>Abi zbj3uW23?^GA}9jQ{M^8v?ejL?HaT7AX5WPZNkBmfN`w-jL?{tT7ykZt$%Yln?p_m~ z-?>&d(LD(jAd}h=LPltPQbO$*Wbyl@G-_k5jXbb#qffHY03>M1jfEqoPJQ6Mr=Byp=^jfzePZV1 zLjCmNi31hdIJHa%e;5g=1(`u3BRzfeExY%=VCu{loOr{`%2hUR*x>tL^W_TTaj);0 zpPR6CUD1+0>4TQ6zVfH3TQ;%l6#(_%yspK@3gcmG#Q4!WCPyLU93nMKk7E2pcA=l45({2jNho>sdF*A~bA zxX?-cp~y_z_kFf+yqu3m#QiB}03?Z&9vvR5TNgj<)($Vm)xq5G>|o2sFMag&6aNF+ WAT1?sQBYt20000iHtsh1EzPArg^Q zIZrOk#rNsfjaSbMAL;<4h;Z=jvu8dzyz8N&Nb7=z03ZUw?9z%8KQEa6yM5=kUnka& z3?FJk2}L7q>na=T#;<7U*P91xfF`;`6%pVgWgRy0?1ZryL@%z52=-!fGXWGEn4M351L4<+7eDgwo|moqXT+s1&Kmn>-uQQ8mL7XY)w5Zk*(g+<3Y3tmkR!bL zOUKaUtj_pX26sH+=Iorwu}MGd`_%O-_sS}8VpG#fJA)Fcs#ezwtZf?q?Ac70mDv`rVs{$od?VPKeqf<-kUjNtS6ecB*mq<&M97K^6IVsDO zt2$Ru!b+>2S<}_H>$RcInusU_8PMNdf(W{sNlJ3FkrwMJPeBPO#d}Y^a{9TH(#{Y) l0D?dWAV4eUJX#h`!2gmISk&ZKd4B)^002ovPDHLkV1g&sd|Lnj literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_error.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_error.png new file mode 100644 index 0000000000000000000000000000000000000000..f07f449a44ff2761bfc7b752db3d08d0e1238b02 GIT binary patch literal 793 zcmV+!1LpjRP)lHwhvrAu0-@MQwt}+5~MQTtu}C0%;W( z1<{R?aHBz*g;pk%AyQVBR_Zu5m~;ES_vxI-O!vIF|H*|T{l`n#garr?$RMk>)?Y48 z(ZF2yTneKb};DNWF+jK)IF`6_IfJ{i|F3o%Q+l&4_HGBD|ACE8na_6>L z=s{^>-C(a7J$6=8A_%h5W!1K6dcL!D?XX+Ndk)oei?UundDpX_E&1Y&`)3P8#Ny0s z2Ag7_&ZPhyGj%)g&S6V2LNun1;iBQm#Fwlfv zgyESZR$X}2P;=RW!2zid1r$hBL{K7>2qi*f7>pT1=RdT3@-anEoH{ z={KFOO;Dh#bV*jaN>}M>RZqQd`S=6O9C3KpI~I>l%QFYfo;jqQYe5fcn`)+)zMm6P z4X&L(>gnN0!%J4^rhX->?$S5bY<=GEU%jc!KLL8sww-Eg;h z`H-yBHa)yfojYT}&G*GFc$<(Yja_q=lZvj66DC^O5%$B)|Z(CeD=n`|eM04SP; z>-=-l+xdJjA~vR6^xB#o{ehf~tSM`iwaQv$O<8NIHA}W_WOw*~ XD^gE}t;YAo00000NkvXXu0mjfl6ZQ> literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_excel.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_excel.png new file mode 100644 index 0000000000000000000000000000000000000000..eb6158eb5ca9c4b64c81e70e0fd894dbc8e2bed9 GIT binary patch literal 817 zcmV-11J3-3P)hdKqhFO_H1|Vn1E?(=|cjAh_&P}y{{^`u< zcYD@PK?$)4i~7o9*6F_$F$4lR(d4AAvrez^(88Hk+)+B7E)M3jc=Ewl4$S^`_qwSF zA%qz@=c2EOsz@0qB1IqsqJU)HaG&+}%`-OM8YqW{K85hqj@4&V9vz!Cm_n0-W#f;# zeEpJde%vdgRn5?(+PY=W*z~|lT2-mtown({ll8&3S5+lWz5K}LTRW{k{eJn3Qz!SU zQ`@qI_n2;K?RG~pYJ9=dj-RWgG;P&wEuoAxL~Q)<>x0b=dED^Outj&xQ^rA;u3pw| zca_ClTh_d9cxXg_U!lLRl0`xU@$=UXO|_dRdtXfKwPawmnf(LC7u}-U>8k6}3u|{8 zs9LHr>MIJZGD^r9h|q2yF24Wuh+PM^yMN9GP1$khlDkdyCY}D{kg}jEf-(kW5jBY> z0rB29ZhG-r=i_R{;+1k0?A-sBM;AP6(k1i9ZuixR4?MqXOvphQgCYj~RnXKKL~J9Q zIDNz~XMfO{ZhUg&BTtMyXJqDVqc<x643?SvKHx004lTvR=0a5$dUw z>Xb470000$S;ka1sfH4I-R8njUol7M4dtApOahDylptpYswf1hD#CwFoz6oEA>(SIECU&IQ%a}GXdnC!9$70`0uH1B00000NkvXXu0mjf!8w72 literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_find.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_find.png new file mode 100644 index 0000000000000000000000000000000000000000..2f193889f7ea091c292acdd684c595dcb206b5c4 GIT binary patch literal 879 zcmV-#1CacQP)@+1&aazfGU7ezSm^v zpACwO+tu0su66!(dT=`e05DeeCnCFJW(8|RKtKa{4LGONnx2V85A4m%PEQ?MEtR-esdM$pB-`H542D0)N2zSC6Imf)4L8?>%ZrW+H>xCKi$unm zvGZq-*Q%Aahx;C*=l+K%-?>XB)6TB$-L$r*`RUvlA`xP1NG2?)ge8@TQ4EN|Jks0u zcDg;oFC#-#R`YbWB`D?Q`1#y7l$LXhjSLf8AvQuB84}i#j0^!#g{VE#(K7h@5pFHy zSenl=@XBEdxp`h2Ji>CR%=qXJ7!e|?paKet-~;#ok#jETyeB(5&Bkhp;!+;51~G=) zH?L7xmDUu_h+a$+xuWom;AWW!mS$%%+436Rjc@}y?l1134kgD0AOf$OmjOR zstUlshZk$ZC!bAyIg{Y29z#&@3SJ;6D4+_eFume9^#TmMccC5u0J!ZCTnO6m$lnD| z5JeFHf`Xs~1vP>RLKI1GKDY<~pjr2&bi(fX;6Nj-ss@Ds0CcoO0H{JsEQkm{q03skAA);_bv3q{k31qwVo&s-q`Z?_e+j^w(WL? zl+uETs5+~xBU2};OqEE9ETLGwsMGe1%iTRNue)9}|0~E4B*@5#oRXZ9oRXZ9TqRep zPrGZuoOON4n@=uPbyP1y4G=+HktC6l(gZoFD>@_lXDrN?wo+zozGt3P=Qh+3L7+}q z2!WK7geXLnO3Vw;o12Skp%_E#+N#9;DDWP?Q-VS3B$v~Ha)dDzWn0zG~O(^_1!n0HYp-( z+;wPIdoFgQlpYV!10V>5@a)1LyGBMvoa}miyp(bxbMTM-FYNyx;V@TfYddyT00000 LNkvXXu0mjf90!wr literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_go.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_go.png new file mode 100644 index 0000000000000000000000000000000000000000..80fe1ed0cc75fbb67e9398ae686641f8fb287238 GIT binary patch literal 779 zcmV+m1N8ifP)JNR2Ufr z!Apo%Wf%b9=l#x^8AolrB&K9H?Pg_|78WA8(M3toqE%3B#7*srcF`i*xhupr27%Nr ziguah1+mN)U5GNmyEfQ3-e%_i&-vb-Co#(>FJ+EhQEwjRYVQ(&UYy{U@%vbY||>@4x=B^vIqabI?L* z;-S&DS^V3-ni4^fl|HMkOEbgX)(390>A}|VIypb5Xee4g;7ck zwKh^A3Mi1Mh@eC$5lV!}Fw%sP623U`g3pd_Hr5sunLvTskx4}&Gm%Q6L}(l4x}jCe z*81q1_4-O*ffi~_nMslo?EQ8t*&Ec(pzEw$vc}pKn_Qp0>D7Jr>ATNC3w@9f|Y+U&+)#!t7l&wKp+nP{PQsb+fb=Yf!Fu&5j8vpRj{FT>jD z>d>$sx;A&+`n$HcF}&sYKSyR;=(=9tvvOj@hUG;~4qTYk^_@E=?$*^_pVh_bGnOt~ z;pEw)j{SK$XVc;qy181rT655gW9NG{(yeablViIL>cDI_ux8m>Pp{tY$J0lgo4#ax za?j0EA3s0S!f>{~ykN9h_RhM&g3K(E`q(dE(Rd49+%xMeR9{qlWnmd{s#(SQ>PmFtSQqUjAtB;_Vvt6}AS_5YgM`Uqu`yva+H8^=4U$e4gHb}u zAQ2N{V3A%pO|?Pv?tb6z=jC}SiRa$G^v3q?*6XcYz$p|cq{uLj@#~Fi`J(>5{@&&N zy%T^+;>8cXx%|o77anP?&W1?1A(>-T49z9pyeCl@7YI+Si zKti7=B~``}TImz(G{0PnlQA3P#MAd}sorMjkP!50B7$nAkU^%#nl{Q9lW0@}9fE-> zN(q7tRuiC_T1r|BBtVBTlQ2+70$Rf;eF`Z;lx46Cpu-rEgb)EBKq(b^W8l<^We(`D z43?0=01z<3G6+UUv6`CsWCk6^93!#+<;ws7007{zS3k2k9-zZKFO~(k`>s0y006+1 zgF_jyIhsL-`FMf~JL~C=cV75(CrJ|q;MVO961G=O zm9d)YpJg5g(4i_HKL75eSE}mq$Y}r}hyVdcV~p>6a}oXr80q`oj%+s700000NkvXX Hu0mjfPs|!l literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_key.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_key.png new file mode 100644 index 0000000000000000000000000000000000000000..d6626cb09eb11a298b90a8a27b0d8eab41f49a82 GIT binary patch literal 801 zcmV++1K#|JP)$lC4gU2-`f*>nhR-;k6IP7e>YO!0^w)WK%3$w02v-#>5Ep64PCP| zJihT#O|N+nT7XR2h7dAB?UEAOhJF^mol1i`QtQB`HSY}RE7=r! z)zaVIHr5?>v2Gz&fdYw&2ug$!p+txby(aWZ7(4QT)l2`jX7eMQ{>)lG6ev(fWKxmH zOr%mM5$6B%u~qGtCf40#`mbGj3s!n+^%wnJ&#rl>g<4Z)lB5J6f!?|AP275)Zswr* z%T}4~{;_(?waU!#?JabbF3Cy-kf0{R{z}6$e=5yMQKt3BPcl2>zoTPMqMwF;3!_n|>sT?~bK_-2O_m+o>GJ6h zt=+g$4n7y%1qVJI7*5Yw(hqM=JusY{d}*?U(Oj*gT655eZ>Ksn(qrd7v3}DX1}C>` z+X+8@+4-pVq_fxG zlU}~Ye!0+%>J+pPk+0wV{GM$QaYM?5ux)w2z59=S&H2+K?;gH$bZGzL&g5>G ft+noNiyiPkP9r@8gT|RZ00000NkvXXu0mjfuqTIu literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_lightning.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_lightning.png new file mode 100644 index 0000000000000000000000000000000000000000..7e568703d6432c530224e443771a04fc1e2e59c6 GIT binary patch literal 839 zcmV-N1GxN&P)73{`^;G#xwAtHz%LU)4b zqTRU=ve1RNa3QT=ZM7C`iJ~QFQ*9t7<~pX$d^7W%^M8FFCkcQj-~0ZRTBCB(J0^iD z-~e!d9LR`f3#|=(>$bPvx_D-~2jC%pJ=n_e_OK zeJ_2b-KdDDh@@UlzBSMC;EPygH_MwjWBnPGQegihBV73D?-x9PlHL9A=(Vg=8^d<4 z<9r=UkxuIm)*CO=9e###7PztDxUv}e?$0)rQicmYhV`pQ%S!g@;K(?TVfhM#E?bM| z=B0gfb6h@a8bf5FVT-SV~6}?X}9lK@@Yynoty&1zdZP@?RfODsl=2XzzU% zS8gIN43How+9%bK2S@Xbc`O>`z5`%^;pXGy8^4f>9^3!Sp@|O&)m;dOa3q6d;4P-l zca|=H_{G&m?D_+&-}r{u-J$5T=(X4R&)q|O^gN8cgv;s#@5sEPT5_Z)oFo9Ac>l+I zc4ng5zHpps|9)<_Rw>5bKzE(M1j)dFWI_%OH$BJSz0?T+02W0)_a>#vFqb!*d|5wB zzBUN|M&ty51O@=i?kiDrjQ{{}e|^rU?OS|RdxxP1p5mAw36cX72#`R6UsoeCQFI~! z0ATITp!vfeYyQ?Dr=^5BAshfEa0nB~JG?nUa2Aur006MC*<9`)86SPS(W^`H2n+xi ztOWohsFfVfVWrI7PSKW}BmkyPoj(-|J?ES|BGd-}fIxr{00@ANnO*ZR`#)pee4I5T Rmm>fG002ovPDHLkV1i|Hc$okI literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_link.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_link.png new file mode 100644 index 0000000000000000000000000000000000000000..312eab0914ab59271384686255d1be913a6b3add GIT binary patch literal 830 zcmV-E1Ht@>P)VWgGzD=Y79#JI$lhEn`|2MpRa?Bt#-nSD~P0P(mbVe{KrOBoKnSsk>m|ML{6l zBosu@om4j#WzNLRAk+{k1JRvL(MfE&vvbb->v>W{*z*1_uMP}0cIRX*?mz+wk%*#O z%0D-+$B*g1nRkvI+_3E8Pr1NC6@5M&4vWaLCnNlr;lNlr4i91z&)eBGqL{L{GNu;Fof}GS9{gM5BJuH;2QWk8yuOZdB3pGR#s8bd~ zAmt<>3Q=YH$t5YJ5;7@+8Uh6=ktBgY6#6Pa%2F?h910?U8cLT43KAj$Z1*==ra&gILO{WkHfs(--F=bly9l~${z@AT>V$oat!YAD@M zBE0v_F{`g#^wOSP-u~!wvlmXdd*uqFqoZ0^{&nEMDU+=!>({S0wrQhFmoB}Yq1)~0 z^{A)L8Xjzdr(W4_exYO6u3a{4*kIeXZMJUR>Q=ksjW_p!rAwDKYUs90>6Q|C>56o@ zbrSq^Xk7Gq#>dAsn@un`Hz$?w$;Ss`%jV7L%9ShgHFV~C)6M>B`Tp%|nqPc&G*A3| z)Qe+}vT4-x^t1~XE@(6wR;^lPWMo9n*~E!cy~)YRsT2{`?fqeIw-e7N@mOA%UcCIq z_kH(_EK7|>pM*1Wt2^DaDAp|cvp*@(ZZDKpYkKC^?97(`0sb&XTXy7N#sB~S07*qo IM6N<$f;YmCWB>pF literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_paintbrush.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_paintbrush.png new file mode 100644 index 0000000000000000000000000000000000000000..246a2f0b426faa0c7f5ba009e32b1deaf88d1288 GIT binary patch literal 813 zcmV+|1JeA7P)otxGRZMDZ!_a~nK|b_-`n%VosaL{KDuPV10`(1LIen8kX2Xff$3BE zah#djvFGJ&eE^89Pk*-O^+&d>FC~^GjRYVQ(uuPJyS|-v?9lxA-+tM5>1Qu*n+Ir1 z6KhA>X4$XDH6?-|E5oe1E?pQ5-M;2xw_ex!x}I2+b=}mPFW$U%^;o(Zg*LP!K^1kP%8ynsD^= z1y^6xD1#GLjO{VLdh@0GKY7;d$+NGukV)GRLPn^=q=dF%B#XaJrNP`0E6=}e&Gj3d zKJbQre*WXt!60_DnIzgMQc6S#fvjXxsE1v7;T;njHkdy2miIqAS(nX~o%cO+q+b#h z5tIleLWvL=dQE8OC#{%y*Tnku&K`Tuub&_ELI0t_ea{@3f>Jv&sYqld(%}3_GY3Dm z;O{3*Y?v^A`a|D;^qrM=ykI)U6QHd%WhO~VF!SGjGn0GOZrc3mGZudNl9{Q#X5&-F zuGwVReFLBjE5jr!!^-5*L%!I%PkYH#Hs5rMrEBl^)9)9XTD;xjHFxVZMc3~Dw6#k$ z(-S}RE$bgMHv6Z`mS5|u$$78sp4G-8b@lVkl`HtEv+MGn!F&bKcHPi$$oP_;=BrPf z$(~b3&p3CsuQxhoV$%jIR;`lB-s7FDX)xCTXuJ7ZyIQk96uIR=HBt%-P?N*bp`)EF zq14c}QM+O70NTOa@V~_)&GMZ$^cQDlkyOCa(H3Mf+6xhCuZh`VSN{cQBl5Ys9{cp( rh`2H3A^=GuC6HjQ*7|*0>;m{7QlnX3z3MSD00000NkvXXu0mjfR5FYo literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_paste.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_paste.png new file mode 100644 index 0000000000000000000000000000000000000000..968f073fdddc1cc0f0800b1ac4001cd9a55f053d GIT binary patch literal 703 zcmV;w0zmzVP)AVs!l4K}n~L(tL`6d4Up4iSWnZ3Qg~4n+_J zDGk-qQdogO5JUtO-d5pRp7Nd7_r1^a|M&Zq%mn9Oe((|e0sw%Ur!K7T1pojj=U#f? zQM`qbQrM^DPkwa?DK_be^~z<~RgSMIa<`xP_4P7gg2jCwJ{9^k!fsU=#Ti|%I3p;>90Qd+7|~0h&mIklA#nb>ATL2+v$&u)OBgB z;nsHb)I&QRKeX40H~~cIZxCd}5C} z=79lXoXK%6YlyLtsV$~bSm?Upq|DJh#{|*a7XMm`4QJWZ>s6nL2R1|&J z0VPEwJ9?!n`o5PKAjc->P1Gi8BY*%!5&FVp=#)$mMJYul1Jton}gujiUf??eOy!x&!tsjxy;=Q3_DdcXx=a^OBhW0N~`A@4xB0a*%F? l+@c^sQA%W+?pa#c`9H5UNfS6T{e=Jk002ovPDHLkV1grvM=byV literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_red.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_red.png new file mode 100644 index 0000000000000000000000000000000000000000..0b18247da5850f3c2486373a3e179acd2772e8aa GIT binary patch literal 641 zcmV-{0)G98P);68^@7JE5sw#jpE*579S@TLkU(6yap1yN*Zuy>-hV%Q_v4Ar&!63c8OBr(ZRhFu z_kWs36-AmgZCT>x!RqM;Zu9tqvoHI~k@UmYo_g(*J3c%2{N8}7I+|qKPQzv}7t>%W zsu&9G)UmCzkDYSw{fBnuW4j;1fKV_nicw`$8C6D=F_qu`zUiK$2Oc?5UVY+D(`I@R zW`KlwqLftWHH3Z2_XVNfKn>VgT~k=@- z+N>c>0|@A_HbI9Jn`v0~7cfIF(TS69zaomDS1QtgvaBBfGEPLHccO2~3jc>n^6}^HAEh-2#VxC7YYcDXv!L9X= z-R*SOUvIs;n`8(LxP4~^2|JsiN^hq6cU}5dn4v1~Kl{eT7pm&f$PoY`hyVe%y8G*S bxB&kH@RuR86sIAS00000NkvXXu0mjfZBi!% literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_refresh.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..cf347c7d4685128a4a447abb9fb8e939417644f4 GIT binary patch literal 858 zcmV-g1Eu_lP)`6pHR2Ufr z!EI=jWf;Km|8+n2IrHqe<9xxFVk)&(Nh?w$Xk`TAyvb=#e=0aySC z00NkRDM597_LiNIJ2M^qhuTvB004REvvU8@of{r?P8tmo3;+Pk0F0@*jAMhdOkS&1 zhJPPfQa;pP0|4+Yk%#j>X}o-s#EF1_DMV93FsfPP`G*>Ks>L&)Q}w2g%slu0kBfW1 z+*$*0BC^oTl6>OGIq(9BgG4|C90Dk-N_mPazGrQ7uHZ|>BLD!-KmZ)z1e^#?1Sf(M z!6m}K(^b|i%$TcA5bC}r$tAA?0C)g1@CgWliJ;NAk&ZF+-w#}$`-3nZ32C6IVKrHp zr+(!L2hRfF&AsTw>_@ z1y23;E%Oz}?q^Q2d($ayO;-sON2t7$w(Z|o0Pw1YnSp^}0PI+I5HnDNsFCA?oorkG z5sUIGIq=FSyxcj+xlhkm0en=52Bx3@02o12gdAU$_i?v6iyFMuc7P9#zQ-Hf; zVuV$t9P5`m)F2w1?t6{<8%wk{w-PP#Sj#%1MbsjrSI6n;D_@8q9`~W98dNQf$j=iI z6~hpgww&be%X_HI50Hhx@W==u4TLPB;ei-J-1}G8wH}|{i#Lk-WZAyfv}k4y0|fvU zZTy^$u6L>2nWo(NDSV2@MRD}JQ4(c%G%=dG@_vxH?>gcH#*Ue2HC}9sapf8X?R$Z;XEnm&g zW99mh)5jNw008mK8)r^`_{yH0rNn%u1|SpC(tjf#om=+r#lh+?Kb>DVb9`|C0Bvbv zN3U(>f4-tAC1hosRoA7p(b(hL*V}(j>ug<`&U)|l$6o$)!>PBQ9RQSwn9asj2p*|xhU*R^vq?*Twb0t!lm5}`yW5lRy-U0ZYK?8to!;o!r!XeOE$ z0HB3T+6EEoI4PlR=wonwqJ+TvCoWh&$?CAPVYcU= zD{DS0?AkOtb@-hh^ZLq~FMjxYf19X?pa_YqtgZGvv2TaxcF#KT?O%=_*a-kW_;N|D zakkWsOe!)HsT5WRBiC+p;N-c>0Qwy(1D2MDBC595oXSiR07)sKNk-%9*rDBOO^HUD zZW#;)R&EZpqha<(HK$(tZYU#V29<@0qCXgU{gXeGpc_|pTqQD-WO|}%yKZbeX7k*H z2W~CK$v8NBAq~czrc5A(v51g0Wma7`G8}f=ZcuAiYYxZan@gP(;Ku66M6?bquGiHe z3Q0ya)%Lvk@kLixZfZyU@#UFbv+>pYhcj8TRKSr_sWG8i^X~UA**LvbD3(_Lba3xm ziYcpup*A9qJ$?AA=Og05lndxfwr`!C+O~h|B~4 z01q8H`StcY);%&mId7_+)76ovRpeNWRp&4M?#jx@|E-)x%P*A6t^fc407*qoM6N<$ Ef@ddc(f|Me literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white.png new file mode 100644 index 0000000000000000000000000000000000000000..8b8b1ca0000bc8fa8d0379926736029f8fabe364 GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-&H;pyTSqH(@-Vl>|&1p(LP>kg~E zYiz5X^`c$+%8#zC{u)yfe-5 zmgid={Z3k(ERKCKrE7DF;=x4^O+ pzO8rLO8p|Ip=x)jHOtWj`bJBmKdh_V<`47(gQu&X%Q~loCIFbEay|e6 literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_acrobat.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_acrobat.png new file mode 100644 index 0000000000000000000000000000000000000000..8f8095e46fa4965700afe1f9d065d8a37b101676 GIT binary patch literal 591 zcmV-V0~O9lw>B8WRlD)Gm}Jrz31u-X&&gn2lvjs=i{7nIaL6v2==uw+8Lcs(8j27 z;|c`rmSv@Lx!heopGP^^Ieb3f=R!%Lpp$}iMS-&P3EJ)s48wrJ_Ni0~k|c47D2nj= z{jS6bt|kFpFf|p5cM`_&0Zh|`rfEp0(}=}lT#(6RpzAsUfxv^LSYX>WlAaN$>)*J5 z0#sE+JRUD8iT9*fz{)_^7@6P&!sEjTcD+I9Z4YjT1`wH@fV{cEvneYGFU%maIEU2s55&K(LixD|{p-uiS@?KNj zk-Go8G$hH6g002ovPDHLkV1hVj1#|!a literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_actionscript.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_actionscript.png new file mode 100644 index 0000000000000000000000000000000000000000..159b24075191fc259cfd80c797a1b0d74c168422 GIT binary patch literal 664 zcmV;J0%!e+P)7Z7t2}reCh0o`+ zAlt$F2tW%oO@m<=(B8a-_VgLl#~yUMUDWG!0qFPppd^03e+x1WpkO1NhIaKD2A)-@ z=Py8(Wi%R%JtYZG#sTKH@6Z+&!S3Edf8jFJJNKuva#KJQD3X^7;H^fd2di znEN&c58aUG>`>P{Vqq$kLb+TP{?I!d4(|o59X_%|nVEZq2Rk60n7072SWJ{64CV?3 zgS!EB=eYxwQ>P2&$}(iT6UMvuFgHHIEdNA29!EBtg=v~X!DxxEH~}L2zn|52%xalaq@DTdhh{EVwv0IaQ=!?daer zTKp4I`l8SDt;d{8Q`5Ko;BXUi&oAG1l4}59P-{|^S(Rmord5s6qsh<&m@Ab^wqCD) zHyRD}lKLDzpYN&@q5&*47mGzGiqcXpmqR9#K|CH8kXS4RNs`(iEF%HjP%f8ItyaZK z6$%Apvsok(2>~dTO5jTZfq;N?0ch4l01f$k9?4{~Youl-#x{UDMr#AFIkz@SDwPtQ z$gQ^$2|*(Ps9LQiav_8o8Ne<=Zx1*M*syo80sEO1tB%>5 zfdHB`1z+!R@?ghPRKmL)hWEvZE$=*54ose*0JiUNTM_)cMDXhxEKg(?-pD=y<)L4J zT0dSyD0&NhJ$^_8Ko9uom%-ZM4BTM{Tw$9qyPj=-9W;N(Wi@3*-Q4pq`Gcp}^vvNr zyd&PsmG>fpCSZz?K}UIEd;HGgG%0MG>ymxKPwy{>wy(m*Atq7)0000~7 zMNw2LQirBVQoa8G3P(rY+l;L4iy+JwSqmy$9JlSkk z&*$^Eg+c)@!R|v4gdc8+TTn&eWHO0VD&>$!B%o;;WLf4CNs=Inq9d`xA4otCWHK38 zmc{pkX`0Y=9g3oGK{}lVy~OYL|C5lQ&U^l;wrg|7w=BcA9L4-r411?K7f`@348&rw zXD#uW)DK;H`hxO}u%=@Cj{;#u#_;bb1_KgUOT2Hp6;)MvC6P$vQP3=g1O5#aU%I!K zZ1dc@f}YvG&*Spnplm2rIp^VdA^HydZ0X1axdms2!RKi5x-SFA4p@ zC@N|PI$ryHL@t-(!zBsf2-+sYAukhDHU7Lxm88-p zDk^c;sHj}OKUc4lGZU}6umlGVNAJx0%sKDOFwQx|V2pVvxhYKe|L9TNk!~md3BVrm zYPDL8Hk*yU-ER3~LGwJ7N`0ZV&nOhBI{~~A;@ND*=kxg?#^W&`4u`zk?Mg_e)8XlK z`T#M+OaR1!<#Nf_>$S`xrqd}OjYhoJ>q)?3vEX8pY&I()ERjfjrXM$k7e+-Qs3Ihj zNyOuEQ2EGYG7ro!o6VOBQEwuV2z)*tR8>WxP{616FY)p1Pn1d}#9}cxolZC$4n(6- z35hJq0;FlHC{ zp*iF(lgUK(E`($(s9pJ8Kn?(M734H_63WHtf}6SQQ_MXEP!#0|&@>J8dL5TfG&tBw z#tYn{TCGZvAr>cca%YYn^!t73tg8OOJ2FvJ(`YpCyVZi*?Ur+1uUA$hAg8-aK)c;e zQ<)!XwHh|n&ND=$@^)>aF-`~n}#*WMkD*M|f8r$i*z7+W! qF|A!t*4fE(R`<_YIkN&?Jng?3oQ|aAqClPi0000t>5xmo{nArfL4CJwMMm+N`pQ3p^Le$?rMud6Rbxz!-yG7bz2z$^USP5(;udf(gfQ zG~f68y^)EvcNWp#bUoDt2=h+^%o-?-|mo~iieWqLNP<0m@2PTB7ftyb= z@H`K$>v9Pr5X`L|rw&CEN2(9SB7A2SE;d|j9@*F}sd(@*2l|P*fWfK>1drZUrtUA7 zNXO~pKn1cjf~~TLbje1g>EPPzN2GH#UIBxJ{}S9=E`{zs-w#hO?vcH+hJxroI5v?j zD!4lP0WXq8zUx3RAP@|Gq$}6wXCjFLZY^YSWBxN9#&g)ro$%5}aYn#y=tJ_aIT%4d z5d4u`rlp!};XGmbZkJE*kYJoi&N0pd*yxY{0${xD;;Q1h^8f$<07*qoM6N<$f(}t7 Ae*gdg literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_code.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_code.png new file mode 100644 index 0000000000000000000000000000000000000000..0c76bd1297751b66230f74719504b2adb02b1615 GIT binary patch literal 603 zcmV-h0;K(kP)^~*-1fljz_B$LUvK}k?BNXe#Y!m=zM!!V#}8bncK5m;8VP zw86G*RI63?Cd%b9bX|ueNlZ|wR6rj|r_)VIP@r2imh3?SN+^{|kY%~8B{maJ@F*OK z&VH9LwOeGt#DRjj0~v~8`>iO7!Ybi;zE$va`A^T#yW`y44;k^#O~K5*jD=qcUhPSc zvyy~q;5H_1WT1l~cqje9yfa+l!hu6xjdOJ8s;8E^+=QQ$tw p?%p!Hy#YapB=@+^9(46X{{RQg%9y;OKjr`c002ovPDHLkV1g7l326WT literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_code_red.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_code_red.png new file mode 100644 index 0000000000000000000000000000000000000000..87a69145075afd8f8fd8b391c5da1249ec8b2889 GIT binary patch literal 587 zcmV-R0<`^!P)LWh{^|hy<@Q*xw+qo|KpY<+vaXbbW{L4q( zTsjXEJvb}e%bgb=o%W0h?4u1;^bWTqH8}5Th002ovPDHLkV1nrS0P+9; literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_coldfusion.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_coldfusion.png new file mode 100644 index 0000000000000000000000000000000000000000..c66011fb0fbdcbf210483d676b7131542a0e282b GIT binary patch literal 592 zcmV-W0k7R5;6x zlV4BMP#DI+Z{WQcKZBTk0lfkj5F$ztWhP#lcuyb@0@rA^#Kpu5KLA&Rgc}o#aSmis zrZC__xY^&#cI&!!{c|4Q_tcec*#b>|Y15wPcY2=o3;-Bl=(t4;6Ok*pL)-{*A;GX^ zS(@WGp6j~k1wBVR9)BB_gar`}HyRBXh7nM!)u5^>N~MyN6bc0-5{W?44iB<`2biXb zR;wk?jIQg@G!5l)SqhrXCU}x$GU-dY1sra}0uCq@153FUULT=jNwSk}0WBjKz}Jdu z<5gB*<^XtpAmp3m^ZEXQZWd1krhft}CoYaF4cSMvTJ01}X3X37KYdx-D0$c{doUe8 ztY{vlGr-e*;N!WAV%_hgUawyYrhegW>^F)pv%uUTFslHn; zvJ)l{%w(~{!O4`KTmK{Q{zCYltLfs&4?nz|6IdlqHCvX;|HGv~!QW?8P~_d#e0$v$ z)5XHEz{3>qMiH`1+qNYf?huS+@L`J9_$cjJF)Hf?@pu;)`9}BXwGUM{2!{y-4|Z{L zG>z?O%Cp8P5T#j1DID7u_*(Jg?7iss8AZQ+&;u_J{FmILf((9eoiL5nGUe>Fgq*U$z0000 zJ3A|*qoWOonz+4ZQ0KNhDB07SX1?#FrNy8%K)_l}y&kh`*KYdy`Y99&tgNgMLSSrc z?B?+B@HO@P-jS~z2Rgc6yy~Y~%>oJpBxsb$5<&nRLqiuR7K=@0SZj~jTs|sv_jWVX zGe?WflejOaq|Vec=s9+ahmXbyJ|T)Sl*?s82sr2H?Ce~HD5WI+Sz&tmWrN()wI2}+ zKqg92t*l^-#ae~;9%KFlWkmwnY=-UK`_|%ICZ#P1gdjK<2n38VXsuC7{WiU!fZFmm zW~Sda9(Qi@pxO}$ARY+;t##Ao27usOqNt7Hwq6K7G1il@xitj=LIM&{N&#SuX;x4x zmG6FhCg-$PI;hQ=;1iZ>F>^~@)IPi;l}fX?SZ!QiO=X<|pSVkNpJuLHzW(FT_~W-v z?vFpkyE>8ee4d=7wKauH5~dd_M7d2Aa=ICC{Nj7Blqv&DQEP#j_VeWV&WXL>c=LLK zsmYg^_JiDb;%U!UxO%qjFAvsDFj-kzT2$GbV(ZopPM$i$z`!7jvEk07BcC=6FMt4` z*0u3Sy`0b~%#(0000K literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_copy.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_copy.png new file mode 100644 index 0000000000000000000000000000000000000000..a9f31a278e17993d8d4e13beac2f9d5f7b42d08f GIT binary patch literal 309 zcmV-50m}Y~P)sF~CC`eaI+m%Y8jfzomMvZQaNUIT3LIrJ$h)_W{ zwF|LDNlB-g`Hb_G$;>3F$9JF3WYR|3fy2C+_wH}*xp!_4fF2UN4lt#d26oXwru}hT z0+0%Vz-l&|Tdh_L-Ng1G2*RBtBncRx;99K)&+}s0whhxXp{go}$g&Jk6k|vfypI5M z!1sNGVaV?!*L7i87Bo%cfO@?S`bajL{R<($@$|PtgBRcCGIJ_2a|&kO>G-s2aR3E4 zjssoScUa;zIdOeGHBnH13G)W-zt$kUQgNfG;96b=v&4NzRt&@7nN%v3HsG`<<+F$cumMs448N!W3r&2Z*b~D5^$^d6Jxn@SFK5Q8*uKSR7x{I|H-_N1f+AD zSYC5@2K4OKL$==F9U@CH;ONNL(W}oZICHn;d?~pw?GRIsH*x-68Oy6SuK`)`{E)46 z9^3(-HXa#X89SBv?u_YP)WjsQrp;}0X?Bxrvf12IKW8>3t`e~W9|JS<{btTNbNT@EQIWBSNJTX8AMGXD z-SsH|s#>j9Xf~VMtyT-YMD}5^SWHTY5->o`k|d#AE_YQd79j`%GMS7FNvG3b7^Vy9 zn0HYCJy5MyQLoqKnW|JOp-?D*<2V^msZ>BOv0ANd2n7t@{=V;sZrQ>3c})5_%ms4z z7!qXwHHe~!QFj8aR~&*-3F?O|;#(ESIXP~Os%|~y^7c15*q5`gz2-5ol!fU92NIGT z_ves+>+Tf3gfcL?!nimYmR}cw*|BGULzI^7!;k#3K^YO#;!+vM@N~(99+<;fdqr zYPJm+pXYFYk;neQyXXEcTQDNQx57i`Okp9A#n?<7!{#tnKJdsF>utb@JH7dU01gfL zEK2hoPZAnO5+je3&^i*hWM`qCW^vLK!O*?U-#IvXV?#6koWqrwnD{j&K`7N>^tR3G z8zr1(qVOzcF#nF1&0MZ5C$l8*E^Uth0000zE0Ay_3@1Z_7#f-XWL#E{8Al7>L$ z0Rx7lnddoqAyfT%&#`$;v0@*5YdW3w z7mLNoa=FAshK% zDiy@zakyMAxr-H?iQDZi^!t5;Eno2A=?>mMx`Vg(Z!?<53LHLvfTPa`$mjDcX*Qdv zR;ylN4OH+m)fVX&Z#yZpUae;ss@a$K&})gHovkhr@w#xyPVlfVgXti1_357y%I-UHDvRWYvPEX+#g+j4Q9ayba zh7uQN1j%HQgA=Fp9DfODAU^*3*FCs^6IpO7xg`RUXyP)(;=d!ly=#I^l3e0Cub`{H Z`5PU3+D2e&<<>s`J(VpX#y^kqzQ;#=2x({YMw9Q&ndHT&`BD$#%Ql?{+)-OuSA`r}MWJ zVg+2Gc(GW}a=BERPNy^;kEz$|38dTYlFQ{%5S!g@|8f8D_!Nu9_Ni2glF1}xG8xi! zorc39&F6EPOeWOt_XS`W2H_Bo$MXugy}SEctJQj=(TLXTHL(jRXfzs>NF=0SHk;94 zF!&HjdZNX(3U3;LY64IMX__Xv%_wjLC!J2`0Jw?X=zPK$C$`&dYPDKaC={e16bcE@ zgun^<0k;ak*=xLE)@(Lqu~MmsFoMCLY&0Qog`NO(h@kyxaA%EbwJLy8sU*Vi`~52K zX0wrqW;_LmMq@evX4iAM9Od(Q0eHP$1%L|xAh@vrqB`HPQLon}f3aAka=9!3hr=O- z5F9`#J_7Jhah=U(4RjaRhkS4Xkk98kDz-`i!r|~~AQ1TFcDw(@<8g{aBE)l)PNxNE zI(RPyc>9e{@WGSMU%i7*v{!&P$WLz25)0oc=Dl-yy%xYZAm4b-rttL7UjR#%`#j_F R;_m(?iiXTHIMmcoLoO94I8;j@ zv^2DJ5#orqydFJX|Gm$_Bi_vyew+j6{r}$Qc@D1%fQqeAhJj)1!z4pP83k2MV2~s! zSt^w(<#HLFVBg_#xz1W8ioi(WY&Hu~6zil?DI^jJgu`K35(hkP)H%@Imesbg#5!Ps_$Ni*SiR8&sKb9?M`0-mH)gtg&YgRX#*TXz@Z+| z;|2H@xzE0TfuORhuO2k6#K8#sW^J`mQ0+E@$K`QkFV+DTlI$w{GJ;zid{*v9xeIe_ z$|Bp`@iKkgoFK3{4Z)#DWKV~W4K@5WZN+Ql_7%YxNqSx7%cWud&cX>)_PvD*UzxZg a%Kia9Rjz_59@~-t0000)l$0ECbfb-0$}>7z|u>IvuoHEmW&j4lzv=KA+EpIObc7e7{sGA)QVmnM@*^ z%|h38^m;wC+ilpk%>l#V5LCqP_y2_Cayd^XlX;j*r54R*lW!zbqtSpQNyz8(JVmWm zyV4S$2{Uhyc{Cb0QQbf{ZGT{Kr zvJi{K_&f+q^Pv4MK$hhS4TgFj_FD*rLOePdE-E^T7ZzTFCRUB`*?9&h(a#C!-v8lWG#k3AOJQaUey6Oasked^kDPe=Khg@7s584 zg`XfS1)&u*_c;I76#%`kkBfiZgKKo@0)9d6vZw=ExQUtV?eW{Y1Xv}=4X(2zy85d> Y0C^(qLv?Ui{{R3007*qoM6N<$f-gW7od5s; literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_edit.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..b93e77600def75c9a144d3d0a5088a62c02cbb0b GIT binary patch literal 618 zcmV-w0+s!VP)$>5Y&axjp2O=VLu>*f>1L;s0)kkvKC!*u?s6CVL=HJ6oP~pNfZc; zsKr=bq;7MITw8NXw{SZm%59TId2x_9BQ zV86`NuvGI!>o^V!Na!=$7GJE{Cq`b+XwknM{UcGHFTTfmuS+ zm-zYC!P3+zmY;SG$?!fYkOih`QYaLxyF}A86h$GGN}kFj)_o*0e zjPMP%zTG7FYMAfO2Nn1D`D0Cj?Wl>5q%@CE10nX)KxpNmwk+!IWkzywiYD( zqUXiYYIq3qcRyMGJ;IY`(Gz~E$J$zu2+R{)xGlE*88b3WK6V*J>}2iPY1HH|tER0W z_+^^FdppY?o)Gt5M2`%xwRDH@R3G}^i1l4|6uchm0X0f!@&YdVLB5K&dd7Rv{)DXX zt^&vP;}kqj3f>94j+4xd93>s|Q!Ezi>?r8(Il$P}PFxSqu{d*!Y%*#cX(R0f|Juz# z3o0_xI14Al->1uky@W-rCI_%l&>PK^TXNSN{byMk2AI5vbwp!K-%-@!-vPR3iikL1L7HA!^!~ChCFU#lnGzp88=I z67V8PHBo4(l$u?-AKmT8?#_0rKW9dUNRbpLc`}piywAM9$xZ-3fR1C75T(BjCn-l* zjUcci2oXXo-}iqun@#)+`W@kL_-U&|2>MxZy~3IdmRm&8b)9!2%ksg3R)nNnT*TJOC=6{2hG86Dz+<^p6qfG5$i^UNUh+u)CD7O2 zK>Ioazn;U|+X0x$=feveYZL1W*Fm%e5P1sajd#eW#^5(ddx76*pt$^)b}$Q4oPabL zLc^HF>Z{8za;f$LtN0P$6C?1{X*jtXkRJ8IEeyiSzencvH3Ux_y>y^}wfJrRCQN#9 z?&e+C>sSAfrE%mZD5RfZ`gSndD)=P?+nG5Oq$zmY&-v+gc7R6c0u8^Ke#|XOq?gF@othF3zFpM8Il<8BJrWqBtF>b#_ye4{0)Xbu6j&@UIhRE002ov JPDHLkV1nWI9dZBw literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_excel.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_excel.png new file mode 100644 index 0000000000000000000000000000000000000000..b977d7e52e2446ea01201c5c7209ac3a05f12c9f GIT binary patch literal 663 zcmV;I0%-k-P)^@R5;6x zlTS!gQ5431_q{u#M2 zg&W%y6a}>qj1Z|7Vu&-DW6d~k-n;jnHsjb-q#u0C^W!_5^C=MlKq<8oNCQ6qS00!X z5eI;XP=g!^f}j{hku}E1zZ?XCjE;`p19k(Rh%^AQQ54xysU+ocx$c#f61Z4HnT#3u~FR(3>BnZniMIF4DouI8Hi4u>cAK%EN)5PO(ip3(% zIgBx+QYirR){Z8QwV$9Z(Mpt=L-Or3#bf-G@66}txq0yc*T(zNTBDT0T8rO^JeNbSI-Tzf5!pBioy4NwAN^?iN#{;fH1Jke4Xa`^fR8m z%h6dq%xX)S?7`zae))(Xst^Scp6B8FejQW?RLTM8@0=vnnntuRGBM2dpo>gbCnTD= z^<;=JuqdSf@O>Z8^XdR?s+KEfhDdB_#ahFj^giCtzT(s8kA$AViyTqaAR;KGaLzUU z<=GqA4bRwpX|IG~*x>pZ!@zLr`XQ`od>m(`;jz|M_*1GDO#$7;n74ppb8=eiqh760 x0yt}J1#p`gw$`o!R{d7zU9~!Un@nJV{4bstt4Au+Up@c;002ovPDHLkV1kWhGjjj{ literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_find.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_find.png new file mode 100644 index 0000000000000000000000000000000000000000..581843637079359a6a58fcdccf0763690c67b063 GIT binary patch literal 676 zcmV;V0$crwP)_k3`4d{s8lK_6bi^@vq&To98fNoK}7)fx$e2^Y&@<^jR_Ee+8}KG;X`@ z@bCyiolqX>bb1ZIs%QGnjzFU~L8H~d?e;*XP(h(S262}XyZ3a0h07r{KV?E70l+e- zE`%3x|M5#q+;HOC(h@A^M)7Rn13dm0&>K$j%k_F4wOWlsNCIH+!c_#{eS&TL8v4yc zcpnPEY`cQzZ$ILq{U-MA6Z6Z|1p!FZjQ}tXSb25J@HphEqX-6Hqo?-_Zn@{d#>2Ml zJGhxTAd&emK$lV-QK&VM&ix0Xy{GyS3Wp(+E1^8BhD3T0a)m-Lw@Lu4zQRrP)9(3F z^>$hh@N>OAXrmPYunLi|fJ$_*5i`46;M>~*5D{bp>-OL3{+!MJa`3kv~Q#QfQ%c z)1s}QE<_XaYBG;IuRF=td#+}fi4h(6HgoUyJLi0t(*dA^B)%@8kkG&bdM5P5^Z5WF z%d%>m^SbN0XeV)wbUOXn5Ag#A$gJx+7-OCkMM1S%MWIlTkbFLmOeW(&n&wUd&;`>p zVcRy$Z{K0=?SpNnP^;BYEEXleFbq(UY&LrXX$6qkJ~)8+b{=jj3HEXds;Z(?D%}}L zX3`39&dy=Zyar!ehA}e>w)(*vrCct{PI9^2Jpj&OZS8<3-@{0(gNv%1{)zAiLY+_^ zl}e>Ofd4&#Irj#7>=o=Uhv5IJ@?sN0^J|(WL2Uun$4}si6}TG-s3T#p&6GE<<2W)O zf{^Y2HlO#*QDvTp3v&d@;8*}aUC4lisG9(w7@d5Y8y)}U#FwCkqp*Mcgme4{&gGRf zlBfd`nF9cQBKB2_L{F8G2)7pAf$i)Ds`|}-c>pc^LRW{w4SQ)3N^BbZx)6BlCZts! zKph%`(m#xg-q3I7=(us;9<)*2%iuQ1J`oV3gU6V~T}^JU5714JN33&GwEEru0d}Uo U{MPL+lmGw#07*qoM6N<$f^vibe*gdg literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_freehand.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_freehand.png new file mode 100644 index 0000000000000000000000000000000000000000..8d719df5205f7415ce657e5c277db4533c82f346 GIT binary patch literal 639 zcmV-_0)YLAP)p{{sC7)XB-g4w*W1a1)XtvxrMYa1o?wn&v~3 zHnC|#(>B_M1d`_7gfzLiHy=0c<2kQQdXu*33(xYN_xYW39(cz9jEVT%VokB8|DoF~ z8u%Q5sdl@4VB7X#uh+v_;yOGY&pRi?378ghv)P1cngiAAb<}D#l*?rWDV0j_dc6Zk z-|P~AJZQCA=yWcQjG8fYnimzj*3KqTfN0Cy!G^$7)+bQ$+mHVd1J zvwOR^5Lm<|R+uyB1Nu4vL?d4qa3tn?9H7SZH@~u=fFHEDfSH|bHU6kh0O3%cLdyny z{`9S2Sw~WMy0MPy!64i`jdk4Z3>^+KIL_fN2V_d&ywBt`^IJpxUI$=YAph~5`;xCe Z{s%Y0vkUXDnO6V+002ovPDHLkV1loX8z=w( literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_gear.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_gear.png new file mode 100644 index 0000000000000000000000000000000000000000..106f5aa3611a4807ec8c21701c631730275089a4 GIT binary patch literal 402 zcmV;D0d4+?P)<@FR}JvtGRKa0_WfK^c7uXaFH3q@Y!Hnl8VySc`OtkPN3;#l*y*l23+99h*9JzA00}rAC!#M1dZ#v9YOBH|eC*${MmzzYjBu!!-< zK8tujf&(6i)1biy*F>4{f*Kd(IU-JsG&#b_@NgTnx@40)2@2%c;*=?-2Za=}O}7&( w%_K#(S>e1j&gfY?mR})n>>0+8p`iTe2d1K2h8#$+)&Kwi07*qoM6N<$f(2cptN;K2 literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_get.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_get.png new file mode 100644 index 0000000000000000000000000000000000000000..e4a1ecba1b60e54f3777717ed105cdde745b7184 GIT binary patch literal 516 zcmV+f0{i`mP)o)wchR-92qq~y6`XqbKmElbB3z{pkZs0VPF`CFvS?7jDn^mFo>d9Y&06* z&1MsS!M-CH3ee+h_sy)Ms%B*ec3R0RpVi9?*mU84yoq(Bw8 z<4(999dJJE!V%pWT~HGRIAb;(#O%2K3?uRpz}AfgE8e9q&OSdr^e^}lC$QXZz;S2A z)w>^oHy>?v)q--`!pmuBe96PxP0u*inQvyFW(llfv9 zXV1s*Jh`y2H%B3ZTA(AzpsQ?hb6_PyZ=c1?_B4fbl>G%!@ubJln=!)x0000#DY{xaiib^#X=YT4@yE_&2#eBulEdzjE`u&@G%2(&u{J-<}d(^uY4W_kMfEX z@!X)AR9F&FL?RJyJRUzvBoeqN{5kY`z3wcM0+du73~_0|*lac! z42Dw(Eg1o{Ash}P8jXrqN+1w`*XxDD;ShmPCZC7#4;wWbHoMvBl$=zF-`?*9j*Nbjd=v@OWt_BgKxP-3wd zy37?ATx&$b+&zRM!K;BD%Okw`Sb@&Pak8$KRX19jWZmC0&n*Ggv%j8nvSPDFw zEkV65AGOoBQ8kf`R|}Px*&INNS%osq9b{Fq2I(x6@xM>tg=vRLF?I`0rWzHyRc>}g~)F_Qn`A>)C_iwK%Z zrIJ;xR)UI1Y4Ozts|-Nho;q zVk9-bX)%F~!;63iu$Fk=VJn3~fmb5S@@)ZqjBT2{f`vT`b2}zxb0$o;EF@G3&BHK^ zc)`1kUzo^Qkk$?KFKHNBD?nP-MJ3b@&4fg;g5l2wMi^g?9qj+~@b;62o_U1_S1J`g z7m^UMg25FX1MJ5AQxAJ5F5WDt=$=-@JV-!LHA2vuxl9kN>PS8x??^AINH6LjF*#nbk4}=n3gfWp$kEX5IpHS zYiQ{@d7Nl&d$#+7-TckP&Q}N91e-C#5QQ<|d}62BjvZR2H60wE-&H<>}%WqH(_V;zPbB1rgSSSC(0? zWlQ#?N3UgnJ9m2C29w!SwoOo5_2Iq!<8vCyEoDoj@#oV($oJEg6Bj@;nD|2g8 s%L|>IZ381yx9RvPhV4J)*SeoEV4lyr#k*`nfWBbxboFyt=akR{0DpOPi2wiq literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_key.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_key.png new file mode 100644 index 0000000000000000000000000000000000000000..d61648452284da1bc28b10385f95b5d2bf027901 GIT binary patch literal 616 zcmV-u0+;=XP)-tZUVHjYHp;RjQ0M0pRlXN=mLv{hk9Ebp9&~+Wj-T9IkpzWPWd#fZ)d=zV^~S`;LE*!&u-?g42^wwN&Xr1~#d5ifl_2*B1OoS}CDno^8a50ArfE8;stQF>AP54J@H~%T zFz84s;dO!QJKD36(~!QOg!t_^gfFcSKDU4yK0+Ypg$NT^mIYcQ6bk*3P(lBLh7Df_ zTu=2xC#+-_%)|{Cv8zz0t|0y4D5M`xAc{gwOKc`ou<*&VjUREFHs1qd<_xSkKeTBt zgyCi=@jj;&Ns^GsWWaIUl0Y2azcDlF@u{(P*!+EH;lnU~b|Lv{4|4Hdkh!qoQHiE$ zY#y>KFA0QEw=4Z|uV{0A^`Y=D}hB$GP&<$bi8q(u;p^0(my3Rz7fP}|# zGZ&#uor4@c3q9r|f?H6-UZmfgKx(iV(MQ`MPWB>iC~SxnN5H*zb*A3#zWwgu&c|}3 zn^g87H{pdeasl%Lhmab&jC?lES}7C?4BFDNA<}20hoY@w_IU%i*T;}}wh!589}7~7 z#Ug`-R~4j&+K_y4kW@X7qLr-)S5qVKU)tO;+kXJ++{vPI@{hVK|PhMVVx_`)vx~zUs}c9O-Ok{00000NkvXXu0mjf DS5_-g literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_link.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_link.png new file mode 100644 index 0000000000000000000000000000000000000000..bf7bd1c9bfd78d689c73ba67cf914182933ee68c GIT binary patch literal 614 zcmV-s0-61ZP)OOAS;jTeL{ZSdz-%)SMH9tDF;N4B6%j=d15J&5qy`F#vB?Ar zqS1nH@%ny_XSI*Y>) z1f5QYdmzT>YciP<3WehS<{GovEaLGv27>{*-7f0&I$yJ^L%ZGPv1YT$V|u;*+ZCWz ztHI~CDVsuy($SfR6-`N~K?9GTB#l%%0h7 z-q`K-y~E)+s8lMyTrPL8^_pUo)9G|SluG5pPqw6!LJB_PzyJUM07*qoM6N<$f^=yZ AYybcN literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_magnify.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_magnify.png new file mode 100644 index 0000000000000000000000000000000000000000..f6b74cc40f82fc83e4dfa6e9647ccc1b34e6ed7e GIT binary patch literal 554 zcmV+_0@eMAP)Vb2f>2}Fa82O3m(Ob=t*sniin`NpInLyMJgI`saru@YOPfh zy4g0#G*cV!#N%;Gq9_VH9?v%kjS3Rb1j8^;C={$Gp=lbj z*(?%?geA!5^Pok%UauwjA)v4g2`HedDw4_Mk4hhBQt?e7YJ5(hcj|3dNu^TOPGnjB zTTsqd3GIZ=Bb`n=7no)dflv&K(lsWw?lH6T1Yht0F9qgIuzh}ym0%n<3d3EBWB*pg z+G!I0lbAEXyd>k|QNuwr4=KX1D+tLPv)j@C1=N4sA4NF9A>HcO3G47*Y6!+SrUH-7 z1hb;^#S=r|`aMh>J#dWruAEf}gcR(DRUC`ZUev&$Sbh0SgLiTXeeHEU<$_YV;9281 zym`igIE%Sm8DpDw7@71Tv^EB5xSdUR*0$Mqp+Wq8OoaZtOg52&)zZ;;M=7#C1Yd6x svjx>8ad4e2x|*xHHwRjcjs6zA0XLDUqKT6dS^xk507*qoM6N<$f*wetruo^Ag2=LamM1T#~4RmC^m`_ zs}H7d&XJ}mg+hU?tu0noRvyjI&o2SRAeYZFesYkts79I^jJ7!A7%6nJwq8O?iT55M z1OQ` zbL{!Cp5o*IRmE9PInMCSPjTwfT~J+EYkz}tjxY=fg5Yf6EQ@DG$0kMJ9h^&$W}9BU zP1oj2;?MWVkKIEl)r=Y;L^Cx2q|>!)qJJ8zE7-V*-Cf7V8_2#1c0N975t~+&QUpQJ z5(uo(-O_`%Rj@U@t>JYAgd!>L?0Idxtd#oW2gc!jinsAEva8|kF4#Ic**mmml_{d^$s}Q5Q)KCys4sfck5bP1SyeHwh2`A<@N&t2j0^lgHC_^(pAAPCNjwl+>AN%C4Ll>_8Hjda%9 oS~i=#*e)>KsPlg0=2)Qg6BCqJ=F8HdGXMYp07*qoM6N<$f@i)wr~m)} literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_office.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_office.png new file mode 100644 index 0000000000000000000000000000000000000000..a65bcb3e1e9613cd9e4950850db43d7025a5fdf9 GIT binary patch literal 779 zcmV+m1N8ifP)JNR5;6x zll@CmQ5eTZ^k*a#RQf}fVOdd`5NJh6S(>6Cf$wEW#f&JyAR#GAn9>Gml;nOf3WCDa z5({5&UB$(IF?G#$x4X@Ickg!Y-HU!Z_rzX=qAq-XI_LS^=lOCT0|0{#{kBkYDS7{3 zD`iu%E=`cDX_^#^#n$5SIQ|4Zhsk8>N|zXHXG@*41$i-7`Jr{8`3S_OEcmY|RF48wXkk?WpdVM4OePBSbfh z#4_=eXJg@3epx~gi>QbUmO}Bm(ENN3+@c?jWiKvSrm(o|W}Ud*?vy~fn1!V~Cl4kB zI-;c!8f~-v)jX82%EG($>?;KSD$64f2&4qQ#=Yyrcpy$57RAVuV#vKMP)0hT$r6m# zc^F^XaJ8R9Q|}x^NoJYIvYZkq-z}Tnj@UJK2l2H zG}p+VvtjP2Z%bsb$~7QLJ9#pC0dKi`ppOd^_V;ME6tdzC0PtV|r=@e@37O`%0k^=5^`%cf$eu00N17Ro!{^30krz>a%3j34C?*{Mt2^a4~ zK=P+Qq%|f;Tc&+9ps;@Mw`EE%rgs&#y=j6BUGg96oIqdwj9-fiy*N(|@o)eD002ov JPDHLkV1j#pUPb@_ literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_paint.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_paint.png new file mode 100644 index 0000000000000000000000000000000000000000..23a37b891c2f5faa3b8128d45373ceab794ca609 GIT binary patch literal 688 zcmV;h0#E&kP)PK^TXt2QS_@2qt2T|9~baC-vaPn=ziepcfAwB$0!O2Q)E}1e8!q+9)KT5JVKU z7HNY}h##OS-BxWHWjD0wrPDeEfUClHs%Q6&2u@FTOJkKMQN|_Rlw6rQz$gPzqGNtj z#ruSeFeh835JJFiM6vp@6M5bXj%k7CMt%SIwfbF_fD-3*Os`9Ly_Q3WQ_SX33E{pX z9_WIeeTCGQ3wYALpBcK+P-iuw;3i&7xCua37k5# z`>c`M@sGeC7cdsdz`aE9lOz!hPholbyz%T85LYf6O*@SA+9&+^7k>+4M8$A8iNQq{ zQvn8k?-+dU`Z@gK0z$EtPV#+`^OH`R@cE-cuE&_!D)SZGxmQxeobP_Zwq zMEgi6ePN45N`|V1so0uE8^}1xw8s;VM%Ai@7} z2-&Cyvez_-O4?6uv{zTaj|YeYEk34i~K@`8YW2g{x* zc;7z3lItpVy_et{Z-ZZ)<@*%{l7Ao8mu@V7*gz<_1##mwW*%LEwCdzNsVLYx2*T-J z#HeQ*_a=R~KDdVNk$EVgAIRl$oQi_(`_IrdJciDpH|Xe{K-YsMtc!cRnFi$qzsr4z z5*$;ecov%3->1{YNy6-Gf(Ecy&_I$CjI#laeuE+S120^|Vjsf)W&i*H07*qoM6N<$ Ef)^4A_ab^avY?n0hpS-#mn_4{O$e%cm-@NH=3`90Wq+3`~HKArSdfX`&Z12 z(CY$VW-MNtXX4xy%yUeE?}*~0-|iByA@ZrwXgph4S*bhcc5{HB!DFVm_v}P*g7+Q~K}7K0lcp(^N@X>U zV`{ZpeIf${R6Hgg4FL^`X$Eu75k(PE6ycl$AW0Ic)#@rR7Z(7;V?i-dR1K935Jgcx zPfkwK>2wGokf!Nih^ARp6-6arYFG#(9Ta!x93nFEjoA==z(g?#sDg?Owk?Mg7K+>l zWYsf(<`#+$h9Sp6gFOg_dd+80SkUpk&xM7h0`Sov9W73spU;GP073|VfZ&Gd$J$*0<~TV5aPS|qWH57|VJz+d0000vYep8SaFV10Q$h+;hIUPX_=v5b}%>Tm<(&j1&5;I!55C)oN0s(P%ZB zP3Q#ahfpXKWF@S?jm4U#fv)QovMhrriclyNs6-G12#3R##4PSZ0VY(dRWJ;Lwuq{# zAW0Gwi$yA^R4RZ!;W+L`f&%x{=D^VK#BBWL4Ys{;*!A7Q;!=dN<&D8*GzGaF4`hV4 zDbY0{NrMX>ZqF=0((gR5-zL$kC*b)!fwu{Euru|XrG<$^n#@)7i_>rCmRxnDq>$Y%gJaCkRd|tE*a2x05Pe!I^e13o69#&RQZ36s0 zB=O|K2Yi(jsMqThn}9t?f5E-)L^naZ+db$&%M$!bCdm=jv7?t_lB?3&%Ltq(>ESw? c;MI421LCcoDG!2@;{X5v07*qoM6N<$f`UZt7XSbN literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_picture.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_picture.png new file mode 100644 index 0000000000000000000000000000000000000000..134b6693687b2fa5fe36d48a9c0b8001f937c741 GIT binary patch literal 650 zcmV;50(Jd~P)VHAd+bMNh~)LLRqN>D)-jd9UvB%+hyKX5U|&4t0)fzgD-MPpQ$nHU%yoz=vI zMGb>1Xu!6Hw$NT~@Au<4P-+{9;Uw?&oj31uzH>xX0T7Xkz!(tn|Ed9-s_FqyReC13 z(ll)vW1O{Ck5ihay12Ob2ABc@RUI;zHpaMiyRDs0r>|D4rHw{ItJSJnYjt~jTbGuW z`X(~}?!&86q40R8<4zYw;$qi0^3ec=c&<&H;r`8W%H=Xymf^i;Wo6~<+}zx2UMzpC z*6MZN?(FMv`n|KO3(KFiUaucP0;Z!@LcUNa%8#vGK5aZ>wDgB0Gi=t*argWJcdlMQ z2#MpEX0wU+9&0U?N(F#OgpviU_Y{jYMsj65U3|PjwUOY}lUYj?MTiK_Il}NCVx-Eh zDx-TzMk7se+M#W_>?A1-x}ZXw3kkyz5kW)_hkjsi@RhKadN#H$Hq)$07*qoM6N<$f}lhwPXGV_ literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_powerpoint.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_powerpoint.png new file mode 100644 index 0000000000000000000000000000000000000000..c4eff0387d5888c638ba09473ba6d2369f7b56f0 GIT binary patch literal 588 zcmV-S0<-;zP)HU2HvUSp%6 z*n}iP63IK?dpo;h@sj9~pcxo;VVTc-XLiP@DgefqE#NE=@oyUd-&HjLpsLIuSFXV-EMck)oQ(A`s%*^&wf0(rNiNHsU%=0Rw;WC z(kbc37l6fo`-0uR!pYkYv8U^3?nsh^@pw!K0TH3uYyx1_2>|JbXPmfskJ|1YAw9w! z9`N)1^Aesr;y5Nr5-ODn)oOL|CGi}f9!&iVwpK$khlIX10X$H6^A_stBJqvLhU$?V`QXqKme*s~gVDJ4A;LTs_e15jhc1;By a82kqHEPVYFAD2!50000JNR5;6( zlS@kiVHAe7MZY2;Xi-5)WxDDgv@tCUl*&p14T@Z~3ThM5LP4tuQfLu@EnG;nXc<8S z6&3BN?fx-cv-Kp6>HRiNTHE>$X( zD&=w+?GWC>?RLAGC6Yix;an~UmSt)tSf}1VS6N1N2ONORdD? zaj}w6DAZZdOud9Ep?M?{iQWbE5^9HLLZZF|1kdy0Tu4InEuboP9@nvbZ-P0n4AZTy zyMRIxRDmUE#LdqYuD=-Qz4N^bC`_#S7vcLn1M}{J(Wl3#c4VWczu&)AjUlh(11>gp>f`wv{KnjF%!aA*Jk N002ovPDHLkV1kkt*XsZP literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_ruby.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_ruby.png new file mode 100644 index 0000000000000000000000000000000000000000..f59b7c4365fa1720af1aa04eb47167ddaa6eeed4 GIT binary patch literal 626 zcmV-&0*(ENP)ZS(e|#C2>JN4>y}l*tQ*E7zP@R2CCJnkW?xa6bgk%(hgtZ z0=~d?U3i`+Mvi4!&~+WPT1^NX#{u6&QIx+DE(oR{&T5&-ovF?@wGw)P&AtpHZa|G%V*GUUqL@@!d4V$`8=##4)ytY959JG zdc&Kho)&AL70^i z!PEmeeDWCB-UbK(*4JST44^tV2z_J(dn~+vBMJT97_7rzFio=~XczIv?PQ5$v%u~y zu(bteXb5I1h2zCV{Jc2~V{{yzZipgsP6;k264$*#5q?GzCm|CPa9CKqm4b116h3Pu z?+%Cm52plC8|5P0@igf2GV1KkCfk{Zecu=G@VNrf>s%g9c5D%@cfxVb6$nY`1IW=4 zt10QqSps_2JLp0f3I0j0u>#qA;v!+T))KEbCg|mo3q0pG{OR}p0fPds8+K~d>Hq)$ M07*qoM6N<$g1S2e3jhEB literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_stack.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_stack.png new file mode 100644 index 0000000000000000000000000000000000000000..44084add79b9a0fc3354d16bbd4b4b5ff8095da7 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$R@9E+gqH(@-qA%AW0|7U8+xDRI z0k`B18}ImRw2g{jTGP$Pmx3yI6F_2s&$|`cJ!i0UN zB3H;=r{#{FwLaNVJ&hZl9+MTHGx1T^-A=Q0?hRb#8a~x50X%;`b6ik3cw=#XdxWy= zgrpBoDjpwP&g9<9h3x!k_B!?vuTJVkmIJ-U N;OXk;vd$@?2>|rNdMN+^ literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_star.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_star.png new file mode 100644 index 0000000000000000000000000000000000000000..3a1441c9a12062a4bb3d706000d3ca14399aebca GIT binary patch literal 565 zcmV-50?Pe~P)SCZIX8XZzY2l?gCw6LlgWJ5Avz#QX4|&mI8LN)w~J1vgL=KLAhlWz*=#m~gyvxa z&;iC6gb?aZvMdXxX`<0+D1hs_pqJ!wxqlEH;CJ)je~uL(gpi@v>!I0f_Kl=E(E+Tq z26na*9gribxx-Oft(HnstyXUUy!39&E-cI%J5Rsy;(PGZH{g{ty!HVC&yGPT3H8x# zw{^gBPW)O0FMoh{k%l<`1a|To_Wl&u&-GXm8izU|&<&utILc4wc6s@u1bmTz6x{qg zTw@7=FQRcg&r`h+gcR$*Jbv+*DPk7v)B@e0o2 z6IlBXW&8xh@9)YKiV~2>+z&XKd24JT55YWz&JtfvCg4r^~bLP79-yS@n$OW00000NkvXXu0mjf DStt2z literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_swoosh.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_swoosh.png new file mode 100644 index 0000000000000000000000000000000000000000..e7708292adabf4821612bfca032cbd019c63180b GIT binary patch literal 634 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 literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_width.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_width.png new file mode 100644 index 0000000000000000000000000000000000000000..1eb880947ddf3e745c29e8d9dc90f09c7e6e323c GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$R?&;zfqH(@;q9b3Efq-lM(nr^( z=EYR73-9e)UYMWsXy%?aZsD68Yyv^2$~6QgEcljw%kx>O(f-gQ?@fOOx3A-0+Qw?O zRx~W)kn~Qe2d6f9nMG#g9Q04Mk==M~N!Dglvxk!fgVh#w@ZV$IY1+Xc`d{d2UcaP~ zfWp)_Ivqj}l2SPy^9ZWy6rG9Yx4v67_uA&&9|XA~5-#3)W3%em1peD8RWH^#O%XoM zxMPud%}GTj#~*+7JMxTd!`{^Q+>(D3*|@KV`*G2;{QnANOxu1$r2xIe;OXk;vd$@? F2>@zac~<}c literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_word.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_word.png new file mode 100644 index 0000000000000000000000000000000000000000..ae8ecbf47672a874c0958d0d113a56162c2bd364 GIT binary patch literal 651 zcmV;60(AX}P)hkjP zNW|QGv-YFNLN^qH@tJycPNG5ti6B7;r4mEr#lr@*T8*M85D`{ZR^BWwF23T<%MYIh zdC)S*p=|xk^!~H=+HSZ183~y8v4|mYmZxt&)5{{~>J`>E223Q5>T$=~mtA71q-jdG z+eJhOAyBW^0k9Gk1+rX8)zFx((CG^&tDY>6XaS~Fy!WJON|Gdujg5^~Vzt@o%BcYLiNiTQSD`zL^ociBz_>bDlpw3kriQ@Z`bVsGz-_6N>$&gTDiKDTKR^ z-hB*tHa^>!oD~5TK^0UK5rZ}RBm50Bv}S-yA%s=Ha5RYb{)!z2N&$&64gfhybBu8p lh~_|?8^bu;BRYt{<}Yrwd83Y=s?Goa002ovPDHLkV1l%3CP4rI literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_world.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_world.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed2490ed1432d5d667a76235360824a1088e928 GIT binary patch literal 734 zcmV<40wMj0P)JT{hN;C#tgf#9krG=I>5!<*aE1_(spcgF}<`n4i zJi-}^6UUeU4jUFwdCiVPDm%`Zx^UBa8J(mnR6wEgz^}o8;)M*Y(@l_!Kfv)}4+NuM zaPXE50z)r)9=D=SR|RIqfQ^j}Hu!fzMeQBo+@PZk1G8hOw|vBTvkx`HM)Xe9q3xao z@`p0`NO!2904FHSLA6E@Y-O6zH$DQzvq@aHsz}}<(!v(Z_+EodX%R&NZW75g+nENo zV0020rxE^;7d!067AN>6*+&YLp$9uH6F-=In`XC{Cn%+o|5)b&boEPr02w@|P*oGm QmjD0&07*qoM6N<$g78X0Q~&?~ literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_wrench.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_wrench.png new file mode 100644 index 0000000000000000000000000000000000000000..fecadd08afed92536be91ab12d8e37b6bf410d5d GIT binary patch literal 613 zcmV-r0-F7aP)wK%m(L+9IV|s|#(WRl-O^4GvaQsnHq|OstfO zIJ3}3<01}YGARE4m!7=)QisvlHUo!Qymx-@-t*p_129Ko-#pVI)6#!*kLj-AGXWNR zyA_{wKii_amK7^YT-v z6#plaNm#8`-kz@OvjIt^4%IN{@J3bR zRI}ME1Mv85p|%;RK>ViR>APPLB4;;BpCtqE@P+*7!G>I4UjNx~e>r3HA^tWCQ@S)l z{BslcSwL-CxQ&_ZZSv_g0Tu{yi*X){Mt|W7)lbE`SQxFP00000NkvXXu0mjf;)M*S literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_zip.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_zip.png new file mode 100644 index 0000000000000000000000000000000000000000..fd4bbccdf1643f4ff5022fbc59b82546e259317e GIT binary patch literal 386 zcmV-|0e$|7P)_QM!1S$Bhw4w+iRuFWf;tfR6D%SMJrb+tx zC9R6{2>Ou6#juIy6u(I?|;&Owi$sRB4^20apB5xE2 z#B9XekY66S6lzfCL!eEQRgo0LokTA55@Y#%_wN!TXPw^Q4IIXsG~v#u_4t;x_HM16EQ@QRY+rut&97&UefsPmLrQ5P zBC2kcbux9L%2bJz$P$XV$*zSxb2e@6_3O#;&!FD<&hLjGn%~%en;7)djE^d6!t$lW7GyIOKlQ46hr`Z zjLNuRDP_53dNoN?wd&HMgL^m1DXFU<5dQsrceN>fSz00000)O9XRTN^$%%`*Fg>ryDtc(lF@?b>dE!20r+y z#Q*>(wbV5H`-E4Do={CJp7=ERhw15hgZi)?jRG88 zzVz(5;g?Td1izJyO33bhjg2Qc7FVY@f9!o)Gu?DII~vm-Dc?}3M!fsgjP?F(7`rgg z+xOk8XD)e?Zl=5+un`5!7kr?F=eq)K-5uqr%yU$1hLv){Vlm=)*5~`lwMciiXFu*g z)*Jkz6AF>#zb(Vx`Iv{bdGZHtlW)v(y5k^|xgSUc9%0}S20nrYrO}78ofk?bV!5)4 z=Ngz@+$9N1>>mA%IWx`Fqa240bWkiW;2TZgd8CZS0U}@mknC;!2;wi$eI@`h0y2JS`Eae0CW}q(2(%!m8 zWq$`PDU>LT1_y*bBv#P5<@q0@ttz$hIH}YMDvAigCc=y*)jY-VOpTd;A8@3t7Xh4r z0KTWOk;N2Ox4!&&^4B*no$WtTX!BXB)rg!y8dvGgKBQKLJNXRRp0}Bsjd1|LNQX~c zbC~fjrk2iL@4dYF*vt;}dFn(%h)n_-vzEIHMOKRkdF%3Lq|zBgKm_h>TEq!))nWjq zzn;B!?!(dQcHu$#=JF`cS&W~C`WHFW^B!~MI#k)>1Vk&eQy8P1O`J6V04{D@|7d6^ zyBABnh-d^H0FX&L07M||E0n_dp4v&Q%PSE9p#R#Hq)`5I_(B5CE#q dxjPz0{s-<+c#AC!i7@~G002ovPDHLkV1iPlpuqqD literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/style.css b/node_modules/express/node_modules/connect/lib-cov/public/style.css new file mode 100644 index 0000000..32b6507 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/public/style.css @@ -0,0 +1,141 @@ +body { + margin: 0; + padding: 80px 100px; + font: 13px "Helvetica Neue", "Lucida Grande", "Arial"; + background: #ECE9E9 -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fff), to(#ECE9E9)); + background: #ECE9E9 -moz-linear-gradient(top, #fff, #ECE9E9); + background-repeat: no-repeat; + color: #555; + -webkit-font-smoothing: antialiased; +} +h1, h2, h3 { + margin: 0; + font-size: 22px; + color: #343434; +} +h1 em, h2 em { + padding: 0 5px; + font-weight: normal; +} +h1 { + font-size: 60px; +} +h2 { + margin-top: 10px; +} +h3 { + margin: 5px 0 10px 0; + padding-bottom: 5px; + border-bottom: 1px solid #eee; + font-size: 18px; +} +ul { + margin: 0; + padding: 0; +} +ul li { + margin: 5px 0; + padding: 3px 8px; + list-style: none; +} +ul li:hover { + cursor: pointer; + color: #2e2e2e; +} +ul li .path { + padding-left: 5px; + font-weight: bold; +} +ul li .line { + padding-right: 5px; + font-style: italic; +} +ul li:first-child .path { + padding-left: 0; +} +p { + line-height: 1.5; +} +a { + color: #555; + text-decoration: none; +} +a:hover { + color: #303030; +} +#stacktrace { + margin-top: 15px; +} +.directory h1 { + margin-bottom: 15px; + font-size: 18px; +} +ul#files { + width: 100%; + height: 500px; +} +ul#files li { + padding: 0; +} +ul#files li img { + position: absolute; + top: 5px; + left: 5px; +} +ul#files li a { + position: relative; + display: block; + margin: 1px; + width: 30%; + height: 25px; + line-height: 25px; + text-indent: 8px; + float: left; + border: 1px solid transparent; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + overflow: hidden; + text-overflow: ellipsis; +} +ul#files li a.icon { + text-indent: 25px; +} +ul#files li a:focus, +ul#files li a:hover { + outline: none; + background: rgba(255,255,255,0.65); + border: 1px solid #ececec; +} +ul#files li a.highlight { + -webkit-transition: background .4s ease-in-out; + background: #ffff4f; + border-color: #E9DC51; +} +#search { + display: block; + position: fixed; + top: 20px; + right: 20px; + width: 90px; + -webkit-transition: width ease 0.2s, opacity ease 0.4s; + -moz-transition: width ease 0.2s, opacity ease 0.4s; + -webkit-border-radius: 32px; + -moz-border-radius: 32px; + -webkit-box-shadow: inset 0px 0px 3px rgba(0, 0, 0, 0.25), inset 0px 1px 3px rgba(0, 0, 0, 0.7), 0px 1px 0px rgba(255, 255, 255, 0.03); + -moz-box-shadow: inset 0px 0px 3px rgba(0, 0, 0, 0.25), inset 0px 1px 3px rgba(0, 0, 0, 0.7), 0px 1px 0px rgba(255, 255, 255, 0.03); + -webkit-font-smoothing: antialiased; + text-align: left; + font: 13px "Helvetica Neue", Arial, sans-serif; + padding: 4px 10px; + border: none; + background: transparent; + margin-bottom: 0; + outline: none; + opacity: 0.7; + color: #888; +} +#search:focus { + width: 120px; + opacity: 1.0; +} diff --git a/node_modules/express/node_modules/connect/lib-cov/utils.js b/node_modules/express/node_modules/connect/lib-cov/utils.js new file mode 100644 index 0000000..2200dce --- /dev/null +++ b/node_modules/express/node_modules/connect/lib-cov/utils.js @@ -0,0 +1,282 @@ +/* automatically generated by JSCoverage - do not edit */ +if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; +if (! _$jscoverage['utils.js']) { + _$jscoverage['utils.js'] = []; + _$jscoverage['utils.js'][13] = 0; + _$jscoverage['utils.js'][26] = 0; + _$jscoverage['utils.js'][27] = 0; + _$jscoverage['utils.js'][39] = 0; + _$jscoverage['utils.js'][40] = 0; + _$jscoverage['utils.js'][41] = 0; + _$jscoverage['utils.js'][54] = 0; + _$jscoverage['utils.js'][55] = 0; + _$jscoverage['utils.js'][56] = 0; + _$jscoverage['utils.js'][57] = 0; + _$jscoverage['utils.js'][73] = 0; + _$jscoverage['utils.js'][74] = 0; + _$jscoverage['utils.js'][95] = 0; + _$jscoverage['utils.js'][96] = 0; + _$jscoverage['utils.js'][97] = 0; + _$jscoverage['utils.js'][98] = 0; + _$jscoverage['utils.js'][101] = 0; + _$jscoverage['utils.js'][112] = 0; + _$jscoverage['utils.js'][113] = 0; + _$jscoverage['utils.js'][132] = 0; + _$jscoverage['utils.js'][133] = 0; + _$jscoverage['utils.js'][147] = 0; + _$jscoverage['utils.js'][148] = 0; + _$jscoverage['utils.js'][149] = 0; + _$jscoverage['utils.js'][166] = 0; + _$jscoverage['utils.js'][167] = 0; + _$jscoverage['utils.js'][168] = 0; + _$jscoverage['utils.js'][169] = 0; + _$jscoverage['utils.js'][184] = 0; + _$jscoverage['utils.js'][185] = 0; + _$jscoverage['utils.js'][186] = 0; + _$jscoverage['utils.js'][187] = 0; + _$jscoverage['utils.js'][188] = 0; + _$jscoverage['utils.js'][189] = 0; + _$jscoverage['utils.js'][190] = 0; + _$jscoverage['utils.js'][191] = 0; + _$jscoverage['utils.js'][192] = 0; + _$jscoverage['utils.js'][196] = 0; + _$jscoverage['utils.js'][208] = 0; + _$jscoverage['utils.js'][209] = 0; + _$jscoverage['utils.js'][222] = 0; + _$jscoverage['utils.js'][223] = 0; + _$jscoverage['utils.js'][224] = 0; + _$jscoverage['utils.js'][225] = 0; + _$jscoverage['utils.js'][226] = 0; + _$jscoverage['utils.js'][228] = 0; + _$jscoverage['utils.js'][239] = 0; + _$jscoverage['utils.js'][240] = 0; + _$jscoverage['utils.js'][241] = 0; + _$jscoverage['utils.js'][242] = 0; + _$jscoverage['utils.js'][267] = 0; + _$jscoverage['utils.js'][276] = 0; + _$jscoverage['utils.js'][277] = 0; + _$jscoverage['utils.js'][278] = 0; + _$jscoverage['utils.js'][279] = 0; + _$jscoverage['utils.js'][292] = 0; + _$jscoverage['utils.js'][293] = 0; + _$jscoverage['utils.js'][305] = 0; + _$jscoverage['utils.js'][306] = 0; + _$jscoverage['utils.js'][307] = 0; + _$jscoverage['utils.js'][308] = 0; + _$jscoverage['utils.js'][319] = 0; + _$jscoverage['utils.js'][320] = 0; + _$jscoverage['utils.js'][321] = 0; + _$jscoverage['utils.js'][322] = 0; + _$jscoverage['utils.js'][334] = 0; + _$jscoverage['utils.js'][335] = 0; + _$jscoverage['utils.js'][346] = 0; + _$jscoverage['utils.js'][347] = 0; + _$jscoverage['utils.js'][350] = 0; + _$jscoverage['utils.js'][351] = 0; + _$jscoverage['utils.js'][355] = 0; + _$jscoverage['utils.js'][358] = 0; + _$jscoverage['utils.js'][369] = 0; + _$jscoverage['utils.js'][370] = 0; + _$jscoverage['utils.js'][371] = 0; + _$jscoverage['utils.js'][372] = 0; + _$jscoverage['utils.js'][374] = 0; + _$jscoverage['utils.js'][386] = 0; +} +_$jscoverage['utils.js'][13]++; +var http = require("http"), crypto = require("crypto"), parse = require("url").parse, signature = require("cookie-signature"); +_$jscoverage['utils.js'][26]++; +exports.hasBody = (function (req) { + _$jscoverage['utils.js'][27]++; + return "transfer-encoding" in req.headers || "content-length" in req.headers; +}); +_$jscoverage['utils.js'][39]++; +exports.mime = (function (req) { + _$jscoverage['utils.js'][40]++; + var str = req.headers["content-type"] || ""; + _$jscoverage['utils.js'][41]++; + return str.split(";")[0]; +}); +_$jscoverage['utils.js'][54]++; +exports.error = (function (code, msg) { + _$jscoverage['utils.js'][55]++; + var err = new Error(msg || http.STATUS_CODES[code]); + _$jscoverage['utils.js'][56]++; + err.status = code; + _$jscoverage['utils.js'][57]++; + return err; +}); +_$jscoverage['utils.js'][73]++; +exports.md5 = (function (str, encoding) { + _$jscoverage['utils.js'][74]++; + return crypto.createHash("md5").update(str).digest(encoding || "hex"); +}); +_$jscoverage['utils.js'][95]++; +exports.merge = (function (a, b) { + _$jscoverage['utils.js'][96]++; + if (a && b) { + _$jscoverage['utils.js'][97]++; + for (var key in b) { + _$jscoverage['utils.js'][98]++; + a[key] = b[key]; +} + } + _$jscoverage['utils.js'][101]++; + return a; +}); +_$jscoverage['utils.js'][112]++; +exports.escape = (function (html) { + _$jscoverage['utils.js'][113]++; + return String(html).replace(/&(?!\w+;)/g, "&").replace(//g, ">").replace(/"/g, """); +}); +_$jscoverage['utils.js'][132]++; +exports.uid = (function (len) { + _$jscoverage['utils.js'][133]++; + return crypto.randomBytes(Math.ceil(len * 3 / 4)).toString("base64").slice(0, len); +}); +_$jscoverage['utils.js'][147]++; +exports.sign = (function (val, secret) { + _$jscoverage['utils.js'][148]++; + console.warn("do not use utils.sign(), use https://github.com/visionmedia/node-cookie-signature"); + _$jscoverage['utils.js'][149]++; + return val + "." + crypto.createHmac("sha256", secret).update(val).digest("base64").replace(/=+$/, ""); +}); +_$jscoverage['utils.js'][166]++; +exports.unsign = (function (val, secret) { + _$jscoverage['utils.js'][167]++; + console.warn("do not use utils.unsign(), use https://github.com/visionmedia/node-cookie-signature"); + _$jscoverage['utils.js'][168]++; + var str = val.slice(0, val.lastIndexOf(".")); + _$jscoverage['utils.js'][169]++; + return exports.sign(str, secret) == val? str: false; +}); +_$jscoverage['utils.js'][184]++; +exports.parseSignedCookies = (function (obj, secret) { + _$jscoverage['utils.js'][185]++; + var ret = {}; + _$jscoverage['utils.js'][186]++; + Object.keys(obj).forEach((function (key) { + _$jscoverage['utils.js'][187]++; + var val = obj[key]; + _$jscoverage['utils.js'][188]++; + if (0 == val.indexOf("s:")) { + _$jscoverage['utils.js'][189]++; + val = signature.unsign(val.slice(2), secret); + _$jscoverage['utils.js'][190]++; + if (val) { + _$jscoverage['utils.js'][191]++; + ret[key] = val; + _$jscoverage['utils.js'][192]++; + delete obj[key]; + } + } +})); + _$jscoverage['utils.js'][196]++; + return ret; +}); +_$jscoverage['utils.js'][208]++; +exports.parseSignedCookie = (function (str, secret) { + _$jscoverage['utils.js'][209]++; + return 0 == str.indexOf("s:")? signature.unsign(str.slice(2), secret): str; +}); +_$jscoverage['utils.js'][222]++; +exports.parseJSONCookies = (function (obj) { + _$jscoverage['utils.js'][223]++; + Object.keys(obj).forEach((function (key) { + _$jscoverage['utils.js'][224]++; + var val = obj[key]; + _$jscoverage['utils.js'][225]++; + var res = exports.parseJSONCookie(val); + _$jscoverage['utils.js'][226]++; + if (res) { + _$jscoverage['utils.js'][226]++; + obj[key] = res; + } +})); + _$jscoverage['utils.js'][228]++; + return obj; +}); +_$jscoverage['utils.js'][239]++; +exports.parseJSONCookie = (function (str) { + _$jscoverage['utils.js'][240]++; + if (0 == str.indexOf("j:")) { + _$jscoverage['utils.js'][241]++; + try { + _$jscoverage['utils.js'][242]++; + return JSON.parse(str.slice(2)); + } + catch (err) { + } + } +}); +_$jscoverage['utils.js'][267]++; +exports.pause = require("pause"); +_$jscoverage['utils.js'][276]++; +exports.removeContentHeaders = (function (res) { + _$jscoverage['utils.js'][277]++; + Object.keys(res._headers).forEach((function (field) { + _$jscoverage['utils.js'][278]++; + if (0 == field.indexOf("content")) { + _$jscoverage['utils.js'][279]++; + res.removeHeader(field); + } +})); +}); +_$jscoverage['utils.js'][292]++; +exports.conditionalGET = (function (req) { + _$jscoverage['utils.js'][293]++; + return req.headers["if-modified-since"] || req.headers["if-none-match"]; +}); +_$jscoverage['utils.js'][305]++; +exports.unauthorized = (function (res, realm) { + _$jscoverage['utils.js'][306]++; + res.statusCode = 401; + _$jscoverage['utils.js'][307]++; + res.setHeader("WWW-Authenticate", "Basic realm=\"" + realm + "\""); + _$jscoverage['utils.js'][308]++; + res.end("Unauthorized"); +}); +_$jscoverage['utils.js'][319]++; +exports.notModified = (function (res) { + _$jscoverage['utils.js'][320]++; + exports.removeContentHeaders(res); + _$jscoverage['utils.js'][321]++; + res.statusCode = 304; + _$jscoverage['utils.js'][322]++; + res.end(); +}); +_$jscoverage['utils.js'][334]++; +exports.etag = (function (stat) { + _$jscoverage['utils.js'][335]++; + return "\"" + stat.size + "-" + Number(stat.mtime) + "\""; +}); +_$jscoverage['utils.js'][346]++; +exports.parseCacheControl = (function (str) { + _$jscoverage['utils.js'][347]++; + var directives = str.split(","), obj = {}; + _$jscoverage['utils.js'][350]++; + for (var i = 0, len = directives.length; i < len; i++) { + _$jscoverage['utils.js'][351]++; + var parts = directives[i].split("="), key = parts.shift().trim(), val = parseInt(parts.shift(), 10); + _$jscoverage['utils.js'][355]++; + obj[key] = isNaN(val)? true: val; +} + _$jscoverage['utils.js'][358]++; + return obj; +}); +_$jscoverage['utils.js'][369]++; +exports.parseUrl = (function (req) { + _$jscoverage['utils.js'][370]++; + var parsed = req._parsedUrl; + _$jscoverage['utils.js'][371]++; + if (parsed && parsed.href == req.url) { + _$jscoverage['utils.js'][372]++; + return parsed; + } + else { + _$jscoverage['utils.js'][374]++; + return req._parsedUrl = parse(req.url); + } +}); +_$jscoverage['utils.js'][386]++; +exports.parseBytes = require("bytes"); +_$jscoverage['utils.js'].source = ["","/*!"," * Connect - utils"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var http = require('http')"," , crypto = require('crypto')"," , parse = require('url').parse"," , signature = require('cookie-signature');","","/**"," * Return `true` if the request has a body, otherwise return `false`."," *"," * @param {IncomingMessage} req"," * @return {Boolean}"," * @api private"," */","","exports.hasBody = function(req) {"," return 'transfer-encoding' in req.headers || 'content-length' in req.headers;","};","","/**"," * Extract the mime type from the given request's"," * _Content-Type_ header."," *"," * @param {IncomingMessage} req"," * @return {String}"," * @api private"," */","","exports.mime = function(req) {"," var str = req.headers['content-type'] || '';"," return str.split(';')[0];","};","","/**"," * Generate an `Error` from the given status `code`"," * and optional `msg`."," *"," * @param {Number} code"," * @param {String} msg"," * @return {Error}"," * @api private"," */","","exports.error = function(code, msg){"," var err = new Error(msg || http.STATUS_CODES[code]);"," err.status = code;"," return err;","};","","/**"," * Return md5 hash of the given string and optional encoding,"," * defaulting to hex."," *"," * utils.md5('wahoo');"," * // => \"e493298061761236c96b02ea6aa8a2ad\""," *"," * @param {String} str"," * @param {String} encoding"," * @return {String}"," * @api private"," */","","exports.md5 = function(str, encoding){"," return crypto"," .createHash('md5')"," .update(str)"," .digest(encoding || 'hex');","};","","/**"," * Merge object b with object a."," *"," * var a = { foo: 'bar' }"," * , b = { bar: 'baz' };"," * "," * utils.merge(a, b);"," * // => { foo: 'bar', bar: 'baz' }"," *"," * @param {Object} a"," * @param {Object} b"," * @return {Object}"," * @api private"," */","","exports.merge = function(a, b){"," if (a && b) {"," for (var key in b) {"," a[key] = b[key];"," }"," }"," return a;","};","","/**"," * Escape the given string of `html`."," *"," * @param {String} html"," * @return {String}"," * @api private"," */","","exports.escape = function(html){"," return String(html)"," .replace(/&(?!\\w+;)/g, '&amp;')"," .replace(/</g, '&lt;')"," .replace(/>/g, '&gt;')"," .replace(/\"/g, '&quot;');","};","","","/**"," * Return a unique identifier with the given `len`."," *"," * utils.uid(10);"," * // => \"FDaS435D2z\""," *"," * @param {Number} len"," * @return {String}"," * @api private"," */","","exports.uid = function(len) {"," return crypto.randomBytes(Math.ceil(len * 3 / 4))"," .toString('base64')"," .slice(0, len);","};","","/**"," * Sign the given `val` with `secret`."," *"," * @param {String} val"," * @param {String} secret"," * @return {String}"," * @api private"," */","","exports.sign = function(val, secret){"," console.warn('do not use utils.sign(), use https://github.com/visionmedia/node-cookie-signature')"," return val + '.' + crypto"," .createHmac('sha256', secret)"," .update(val)"," .digest('base64')"," .replace(/=+$/, '');","};","","/**"," * Unsign and decode the given `val` with `secret`,"," * returning `false` if the signature is invalid."," *"," * @param {String} val"," * @param {String} secret"," * @return {String|Boolean}"," * @api private"," */","","exports.unsign = function(val, secret){"," console.warn('do not use utils.unsign(), use https://github.com/visionmedia/node-cookie-signature')"," var str = val.slice(0, val.lastIndexOf('.'));"," return exports.sign(str, secret) == val"," ? str"," : false;","};","","/**"," * Parse signed cookies, returning an object"," * containing the decoded key/value pairs,"," * while removing the signed key from `obj`."," *"," * @param {Object} obj"," * @return {Object}"," * @api private"," */","","exports.parseSignedCookies = function(obj, secret){"," var ret = {};"," Object.keys(obj).forEach(function(key){"," var val = obj[key];"," if (0 == val.indexOf('s:')) {"," val = signature.unsign(val.slice(2), secret);"," if (val) {"," ret[key] = val;"," delete obj[key];"," }"," }"," });"," return ret;","};","","/**"," * Parse a signed cookie string, return the decoded value"," *"," * @param {String} str signed cookie string"," * @param {String} secret"," * @return {String} decoded value"," * @api private"," */","","exports.parseSignedCookie = function(str, secret){"," return 0 == str.indexOf('s:')"," ? signature.unsign(str.slice(2), secret)"," : str;","};","","/**"," * Parse JSON cookies."," *"," * @param {Object} obj"," * @return {Object}"," * @api private"," */","","exports.parseJSONCookies = function(obj){"," Object.keys(obj).forEach(function(key){"," var val = obj[key];"," var res = exports.parseJSONCookie(val);"," if (res) obj[key] = res;"," });"," return obj;","};","","/**"," * Parse JSON cookie string"," *"," * @param {String} str"," * @return {Object} Parsed object or null if not json cookie"," * @api private"," */","","exports.parseJSONCookie = function(str) {"," if (0 == str.indexOf('j:')) {"," try {"," return JSON.parse(str.slice(2));"," } catch (err) {"," // no op"," }"," }","};","","/**"," * Pause `data` and `end` events on the given `obj`."," * Middleware performing async tasks _should_ utilize"," * this utility (or similar), to re-emit data once"," * the async operation has completed, otherwise these"," * events may be lost."," *"," * var pause = utils.pause(req);"," * fs.readFile(path, function(){"," * next();"," * pause.resume();"," * });"," *"," * @param {Object} obj"," * @return {Object}"," * @api private"," */","","exports.pause = require('pause');","","/**"," * Strip `Content-*` headers from `res`."," *"," * @param {ServerResponse} res"," * @api private"," */","","exports.removeContentHeaders = function(res){"," Object.keys(res._headers).forEach(function(field){"," if (0 == field.indexOf('content')) {"," res.removeHeader(field);"," }"," });","};","","/**"," * Check if `req` is a conditional GET request."," *"," * @param {IncomingMessage} req"," * @return {Boolean}"," * @api private"," */","","exports.conditionalGET = function(req) {"," return req.headers['if-modified-since']"," || req.headers['if-none-match'];","};","","/**"," * Respond with 401 \"Unauthorized\"."," *"," * @param {ServerResponse} res"," * @param {String} realm"," * @api private"," */","","exports.unauthorized = function(res, realm) {"," res.statusCode = 401;"," res.setHeader('WWW-Authenticate', 'Basic realm=\"' + realm + '\"');"," res.end('Unauthorized');","};","","/**"," * Respond with 304 \"Not Modified\"."," *"," * @param {ServerResponse} res"," * @param {Object} headers"," * @api private"," */","","exports.notModified = function(res) {"," exports.removeContentHeaders(res);"," res.statusCode = 304;"," res.end();","};","","/**"," * Return an ETag in the form of `\"<size>-<mtime>\"`"," * from the given `stat`."," *"," * @param {Object} stat"," * @return {String}"," * @api private"," */","","exports.etag = function(stat) {"," return '\"' + stat.size + '-' + Number(stat.mtime) + '\"';","};","","/**"," * Parse the given Cache-Control `str`."," *"," * @param {String} str"," * @return {Object}"," * @api private"," */","","exports.parseCacheControl = function(str){"," var directives = str.split(',')"," , obj = {};",""," for(var i = 0, len = directives.length; i < len; i++) {"," var parts = directives[i].split('=')"," , key = parts.shift().trim()"," , val = parseInt(parts.shift(), 10);",""," obj[key] = isNaN(val) ? true : val;"," }",""," return obj;","};","","/**"," * Parse the `req` url with memoization."," *"," * @param {ServerRequest} req"," * @return {Object}"," * @api private"," */","","exports.parseUrl = function(req){"," var parsed = req._parsedUrl;"," if (parsed && parsed.href == req.url) {"," return parsed;"," } else {"," return req._parsedUrl = parse(req.url);"," }","};","","/**"," * Parse byte `size` string."," *"," * @param {String} size"," * @return {Number}"," * @api private"," */","","exports.parseBytes = require('bytes');"]; diff --git a/node_modules/express/node_modules/connect/lib/connect.js b/node_modules/express/node_modules/connect/lib/connect.js index d588ad2..a067e24 100644 --- a/node_modules/express/node_modules/connect/lib/connect.js +++ b/node_modules/express/node_modules/connect/lib/connect.js @@ -1,3 +1,4 @@ + /*! * Connect * Copyright(c) 2010 Sencha Inc. @@ -28,7 +29,7 @@ exports = module.exports = createServer; * Framework version. */ -exports.version = '2.7.4'; +exports.version = '2.7.2'; /** * Expose mime module. @@ -62,7 +63,7 @@ exports.utils = utils; */ function createServer() { - function app(req, res, next){ app.handle(req, res, next); } + function app(req, res){ app.handle(req, res); } utils.merge(app, proto); utils.merge(app, EventEmitter.prototype); app.route = '/'; diff --git a/node_modules/express/node_modules/connect/lib/middleware/basicAuth.js b/node_modules/express/node_modules/connect/lib/middleware/basicAuth.js index bc7ec97..0205812 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/basicAuth.js +++ b/node_modules/express/node_modules/connect/lib/middleware/basicAuth.js @@ -69,13 +69,13 @@ module.exports = function basicAuth(callback, realm) { var parts = authorization.split(' '); - if (parts.length !== 2) return next(utils.error(400)); + if (parts.length !== 2) return next(400); var scheme = parts[0] , credentials = new Buffer(parts[1], 'base64').toString() , index = credentials.indexOf(':'); - if ('Basic' != scheme || index < 0) return next(utils.error(400)); + if ('Basic' != scheme || index < 0) return next(400); var user = credentials.slice(0, index) , pass = credentials.slice(index + 1); diff --git a/node_modules/express/node_modules/connect/lib/middleware/compress.js b/node_modules/express/node_modules/connect/lib/middleware/compress.js index e71ea8c..2dc6437 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/compress.js +++ b/node_modules/express/node_modules/connect/lib/middleware/compress.js @@ -63,20 +63,15 @@ module.exports = function compress(options) { var names = Object.keys(exports.methods) , filter = options.filter || exports.filter; - return function compress(req, res, next){ + return function(req, res, next){ var accept = req.headers['accept-encoding'] - , vary = res.getHeader('Vary') , write = res.write , end = res.end , stream , method; // vary - if (!vary) { - res.setHeader('Vary', 'Accept-Encoding'); - } else if (!~vary.indexOf('Accept-Encoding')) { - res.setHeader('Vary', vary + ', Accept-Encoding'); - } + res.setHeader('Vary', 'Accept-Encoding'); // proxy @@ -98,7 +93,7 @@ module.exports = function compress(options) { var encoding = res.getHeader('Content-Encoding') || 'identity'; // already encoded - if ('identity' != encoding) return; + if ('identity' != encoding) return; // default request filter if (!filter(req, res)) return; diff --git a/node_modules/express/node_modules/connect/lib/middleware/cookieSession.js b/node_modules/express/node_modules/connect/lib/middleware/cookieSession.js index 402fd55..1a23d57 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/cookieSession.js +++ b/node_modules/express/node_modules/connect/lib/middleware/cookieSession.js @@ -65,7 +65,6 @@ module.exports = function cookieSession(options){ // cookieParser secret if (!options.secret && req.secret) { req.session = req.signedCookies[key] || {}; - req.session.cookie = cookie; } else { // TODO: refactor var rawCookie = req.cookies[key]; @@ -74,7 +73,6 @@ module.exports = function cookieSession(options){ if (unsigned) { var originalHash = crc32.signed(unsigned); req.session = utils.parseJSONCookie(unsigned) || {}; - req.session.cookie = cookie; } } } diff --git a/node_modules/express/node_modules/connect/lib/middleware/csrf.js b/node_modules/express/node_modules/connect/lib/middleware/csrf.js index e3c353e..5d5e7c6 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/csrf.js +++ b/node_modules/express/node_modules/connect/lib/middleware/csrf.js @@ -51,7 +51,7 @@ module.exports = function csrf(options) { var val = value(req); // check - if (val != token) return next(utils.error(403)); + if (val != token) return next(403); next(); } diff --git a/node_modules/express/node_modules/connect/lib/middleware/directory.js b/node_modules/express/node_modules/connect/lib/middleware/directory.js index 1c925a7..8fa008c 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/directory.js +++ b/node_modules/express/node_modules/connect/lib/middleware/directory.js @@ -16,7 +16,6 @@ var fs = require('fs') , parse = require('url').parse - , utils = require('../utils') , path = require('path') , normalize = path.normalize , extname = path.extname @@ -67,10 +66,10 @@ exports = module.exports = function directory(root, options){ , showUp = path != root && path != root + '/'; // null byte(s), bad request - if (~path.indexOf('\0')) return next(utils.error(400)); + if (~path.indexOf('\0')) return next(400); // malicious path, forbidden - if (0 != path.indexOf(root)) return next(utils.error(403)); + if (0 != path.indexOf(root)) return next(403); // check if we have a directory fs.stat(path, function(err, stat){ @@ -96,7 +95,7 @@ exports = module.exports = function directory(root, options){ } // not acceptable - next(utils.error(406)); + next(406); }); }); }; diff --git a/node_modules/express/node_modules/connect/lib/middleware/favicon.js b/node_modules/express/node_modules/connect/lib/middleware/favicon.js index ef54354..c57bf34 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/favicon.js +++ b/node_modules/express/node_modules/connect/lib/middleware/favicon.js @@ -1,3 +1,4 @@ + /*! * Connect - favicon * Copyright(c) 2010 Sencha Inc. @@ -38,7 +39,7 @@ var fs = require('fs') * Serve custom favicon: * * connect() - * .use(connect.favicon('public/favicon.ico')) + * .use(connect.favicon('public/favicon.ico)) * * @param {String} path * @param {Object} options diff --git a/node_modules/express/node_modules/connect/lib/middleware/json.js b/node_modules/express/node_modules/connect/lib/middleware/json.js index 17e5918..200006b 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/json.js +++ b/node_modules/express/node_modules/connect/lib/middleware/json.js @@ -68,19 +68,19 @@ exports = module.exports = function(options){ var first = buf.trim()[0]; if (0 == buf.length) { - return next(utils.error(400, 'invalid json, empty body')); + return next(400, 'invalid json, empty body'); } - if (strict && '{' != first && '[' != first) return next(utils.error(400, 'invalid json')); + if (strict && '{' != first && '[' != first) return next(400, 'invalid json'); try { req.body = JSON.parse(buf, options.reviver); + next(); } catch (err){ err.body = buf; err.status = 400; - return next(err); + next(err); } - next(); }); }); - }; + } }; diff --git a/node_modules/express/node_modules/connect/lib/middleware/limit.js b/node_modules/express/node_modules/connect/lib/middleware/limit.js index 8233b4d..614787d 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/limit.js +++ b/node_modules/express/node_modules/connect/lib/middleware/limit.js @@ -42,7 +42,7 @@ module.exports = function limit(bytes){ req._limit = true; // limit by content-length - if (len && len > bytes) return next(utils.error(413)); + if (len && len > bytes) return next(413); // limit req.on('data', function(chunk){ diff --git a/node_modules/express/node_modules/connect/lib/middleware/session.js b/node_modules/express/node_modules/connect/lib/middleware/session.js index 9be6c8b..f97b8d6 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/session.js +++ b/node_modules/express/node_modules/connect/lib/middleware/session.js @@ -49,7 +49,7 @@ var warning = 'Warning: connection.session() MemoryStore is not\n' /** * Session: - * + * * Setup session store with the given `options`. * * Session data is _not_ saved in the cookie itself, however @@ -73,13 +73,13 @@ var warning = 'Warning: connection.session() MemoryStore is not\n' * Cookie option: * * By default `cookie.maxAge` is `null`, meaning no "expires" parameter is set - * so the cookie becomes a browser-session cookie. When the user closes the + * so the cookie becomes a browser-session cookie. When the user closes the * browser the cookie (and session) will be removed. * * ## req.session * * To store or access session data, simply use the request property `req.session`, - * which is (generally) serialized as JSON by the store, so nested objects + * which is (generally) serialized as JSON by the store, so nested objects * are typically fine. For example below is a user-specific view counter: * * connect() @@ -117,7 +117,7 @@ var warning = 'Warning: connection.session() MemoryStore is not\n' * req.session.destroy(function(err){ * // cannot access session here * }); - * + * * ## Session#reload() * * Reloads the session data. @@ -248,7 +248,7 @@ function session(options){ res.on('header', function(){ if (!req.session) return; var cookie = req.session.cookie - , proto = (req.headers['x-forwarded-proto'] || '').split(',')[0].toLowerCase().trim() + , proto = (req.headers['x-forwarded-proto'] || '').toLowerCase() , tls = req.connection.encrypted || (trustProxy && 'https' == proto) , secured = cookie.secure && tls , isNew = unsignedCookie != req.sessionID; @@ -256,9 +256,6 @@ function session(options){ // only send secure cookies via https if (cookie.secure && !secured) return debug('not secured'); - // long expires, handle expiry server-side - if (!isNew && cookie.hasLongExpires) return debug('already set cookie'); - // browser-session length cookie if (null == cookie.expires) { if (!isNew) return debug('already set browser-session cookie'); @@ -280,8 +277,7 @@ function session(options){ if (!req.session) return res.end(data, encoding); debug('saving'); req.session.resetMaxAge(); - req.session.save(function(err){ - if (err) console.error(err.stack); + req.session.save(function(){ debug('saved'); res.end(data, encoding); }); @@ -316,7 +312,7 @@ function session(options){ // error handling if (err) { - debug('error %j', err); + debug('error'); if ('ENOENT' == err.code) { generate(); next(); diff --git a/node_modules/express/node_modules/connect/lib/middleware/session/cookie.js b/node_modules/express/node_modules/connect/lib/middleware/session/cookie.js index cdce2a5..e8ff862 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/session/cookie.js +++ b/node_modules/express/node_modules/connect/lib/middleware/session/cookie.js @@ -43,7 +43,7 @@ Cookie.prototype = { * @param {Date} date * @api public */ - + set expires(date) { this._expires = date; this.originalMaxAge = this.maxAge; @@ -59,14 +59,14 @@ Cookie.prototype = { get expires() { return this._expires; }, - + /** * Set expires via max-age in `ms`. * * @param {Number} ms * @api public */ - + set maxAge(ms) { this.expires = 'number' == typeof ms ? new Date(Date.now() + ms) @@ -104,18 +104,6 @@ Cookie.prototype = { } }, - /** - * Check if the cookie has a reasonably large max-age. - * - * @return {Boolean} - * @api private - */ - - get hasLongExpires() { - var week = 604800000; - return this.maxAge > (4 * week); - }, - /** * Return a serialized cookie string. * @@ -133,7 +121,7 @@ Cookie.prototype = { * @return {Object} * @api private */ - + toJSON: function(){ return this.data; } diff --git a/node_modules/express/node_modules/connect/lib/middleware/static.js b/node_modules/express/node_modules/connect/lib/middleware/static.js index f69b58e..bb29d07 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/static.js +++ b/node_modules/express/node_modules/connect/lib/middleware/static.js @@ -1,3 +1,4 @@ + /*! * Connect - static * Copyright(c) 2010 Sencha Inc. @@ -34,7 +35,6 @@ var send = require('send') * - `maxAge` Browser cache maxAge in milliseconds. defaults to 0 * - `hidden` Allow transfer of hidden files. defaults to false * - `redirect` Redirect to trailing "/" when the pathname is a dir. defaults to true - * - `index` Default file name, defaults to 'index.html' * * @param {String} root * @param {Object} options @@ -77,7 +77,6 @@ exports = module.exports = function static(root, options){ send(req, path) .maxage(options.maxAge || 0) .root(root) - .index(options.index || 'index.html') .hidden(options.hidden) .on('error', error) .on('directory', directory) diff --git a/node_modules/express/node_modules/connect/lib/middleware/timeout.js b/node_modules/express/node_modules/connect/lib/middleware/timeout.js index dba4654..a6dc087 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/timeout.js +++ b/node_modules/express/node_modules/connect/lib/middleware/timeout.js @@ -1,3 +1,4 @@ + /*! * Connect - timeout * Ported from https://github.com/LearnBoost/connect-timeout @@ -35,7 +36,7 @@ module.exports = function timeout(ms) { }, ms); req.on('timeout', function(){ - if (res.headerSent) return debug('response started, cannot timeout'); + if (req.headerSent) return debug('response started, cannot timeout'); var err = new Error('Response timeout'); err.timeout = ms; err.status = 503; diff --git a/node_modules/express/node_modules/connect/lib/middleware/vhost.js b/node_modules/express/node_modules/connect/lib/middleware/vhost.js index abbb050..897a9d8 100644 --- a/node_modules/express/node_modules/connect/lib/middleware/vhost.js +++ b/node_modules/express/node_modules/connect/lib/middleware/vhost.js @@ -8,7 +8,7 @@ /** * Vhost: - * + * * Setup vhost for the given `hostname` and `server`. * * connect() @@ -17,7 +17,7 @@ * .use(connect.vhost('*.com', mainApp)) * * The `server` may be a Connect server or - * a regular Node `http.Server`. + * a regular Node `http.Server`. * * @param {String} hostname * @param {Server} server @@ -28,7 +28,7 @@ module.exports = function vhost(hostname, server){ if (!hostname) throw new Error('vhost hostname required'); if (!server) throw new Error('vhost server required'); - var regexp = new RegExp('^' + hostname.replace(/[^*\w]/g, '\\$&').replace(/[*]/g, '(?:.*?)') + '$', 'i'); + var regexp = new RegExp('^' + hostname.replace(/[*]/g, '(.*?)') + '$', 'i'); if (server.onvhost) server.onvhost(hostname); return function vhost(req, res, next){ if (!req.headers.host) return next(); diff --git a/node_modules/express/node_modules/connect/lib/proto.js b/node_modules/express/node_modules/connect/lib/proto.js index b304cf7..889c237 100644 --- a/node_modules/express/node_modules/connect/lib/proto.js +++ b/node_modules/express/node_modules/connect/lib/proto.js @@ -106,7 +106,7 @@ app.handle = function(req, res, out) { , slashAdded = false , index = 0; - function next(err) { + function next(err, msg) { var layer, path, status, c; if (slashAdded) { @@ -118,6 +118,15 @@ app.handle = function(req, res, out) { req.originalUrl = req.originalUrl || req.url; removed = ''; + // next(status, msg) support + if (typeof err === 'number') { + var status = err; + var name = http.STATUS_CODES[status]; + err = new Error(msg || name); + err.name = name; + err.status = status; + } + // next callback layer = stack[index++]; diff --git a/node_modules/express/node_modules/connect/lib/utils.js b/node_modules/express/node_modules/connect/lib/utils.js index 2c03c28..47b30e0 100644 --- a/node_modules/express/node_modules/connect/lib/utils.js +++ b/node_modules/express/node_modules/connect/lib/utils.js @@ -41,22 +41,6 @@ exports.mime = function(req) { return str.split(';')[0]; }; -/** - * Generate an `Error` from the given status `code` - * and optional `msg`. - * - * @param {Number} code - * @param {String} msg - * @return {Error} - * @api private - */ - -exports.error = function(code, msg){ - var err = new Error(msg || http.STATUS_CODES[code]); - err.status = code; - return err; -}; - /** * Return md5 hash of the given string and optional encoding, * defaulting to hex. @@ -82,7 +66,7 @@ exports.md5 = function(str, encoding){ * * var a = { foo: 'bar' } * , b = { bar: 'baz' }; - * + * * utils.merge(a, b); * // => { foo: 'bar', bar: 'baz' } * @@ -132,9 +116,7 @@ exports.escape = function(html){ exports.uid = function(len) { return crypto.randomBytes(Math.ceil(len * 3 / 4)) .toString('base64') - .slice(0, len) - .replace(/\//g, '-') - .replace(/\+/g, '_'); + .slice(0, len); }; /** diff --git a/node_modules/express/node_modules/connect/node_modules/buffer-crc32/.npmignore b/node_modules/express/node_modules/connect/node_modules/buffer-crc32/.npmignore deleted file mode 100644 index b512c09..0000000 --- a/node_modules/express/node_modules/connect/node_modules/buffer-crc32/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/buffer-crc32/.travis.yml b/node_modules/express/node_modules/connect/node_modules/buffer-crc32/.travis.yml deleted file mode 100644 index 7a902e8..0000000 --- a/node_modules/express/node_modules/connect/node_modules/buffer-crc32/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -language: node_js -node_js: - - 0.6 - - 0.8 -notifications: - email: - recipients: - - brianloveswords@gmail.com \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/buffer-crc32/README.md b/node_modules/express/node_modules/connect/node_modules/buffer-crc32/README.md deleted file mode 100644 index 4ad5d64..0000000 --- a/node_modules/express/node_modules/connect/node_modules/buffer-crc32/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# buffer-crc32 - -[![Build Status](https://secure.travis-ci.org/brianloveswords/buffer-crc32.png?branch=master)](http://travis-ci.org/brianloveswords/buffer-crc32) - -crc32 that works with binary data and fancy character sets, outputs -buffer, signed or unsigned data and has tests. - -Derived from the sample CRC implementation in the PNG specification: http://www.w3.org/TR/PNG/#D-CRCAppendix - -# install -``` -npm install buffer-crc32 -``` - -# example -```js -var crc32 = require('buffer-crc32'); -// works with buffers -var buf = Buffer([[0x00, 0x73, 0x75, 0x70, 0x20, 0x62, 0x72, 0x6f, 0x00]) -crc32(buf) // -> - -// has convenience methods for getting signed or unsigned ints -crc32.signed(buf) // -> -1805997238 -crc32.unsigned(buf) // -> 2488970058 - -// will cast to buffer if given a string, so you can -// directly use foreign characters safely -crc32('自動販売機') // -> -``` - -# tests -This was tested against the output of zlib's crc32 method. You can run -the tests with`npm test` (requires tap) diff --git a/node_modules/express/node_modules/connect/node_modules/buffer-crc32/index.js b/node_modules/express/node_modules/connect/node_modules/buffer-crc32/index.js deleted file mode 100644 index ab0e19e..0000000 --- a/node_modules/express/node_modules/connect/node_modules/buffer-crc32/index.js +++ /dev/null @@ -1,84 +0,0 @@ -var Buffer = require('buffer').Buffer; - -var CRC_TABLE = [ - 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, - 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, - 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, - 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, - 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, - 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, - 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, - 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, - 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, - 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, - 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, - 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, - 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, - 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, - 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, - 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, - 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, - 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, - 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, - 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, - 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, - 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, - 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, - 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, - 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, - 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, - 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, - 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, - 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, - 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, - 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, - 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, - 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, - 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, - 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, - 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, - 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, - 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, - 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, - 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, - 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, - 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, - 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, - 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, - 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, - 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, - 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, - 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, - 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, - 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, - 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, - 0x2d02ef8d -]; - -function bufferizeInt(num) { - var tmp = Buffer(4); - tmp.writeInt32BE(num, 0); - return tmp; -} - -function _crc32(buf) { - if (!Buffer.isBuffer(buf)) - buf = Buffer(buf); - var crc = 0xffffffff; - for (var n = 0; n < buf.length; n++) { - crc = CRC_TABLE[(crc ^ buf[n]) & 0xff] ^ (crc >>> 8); - } - return (crc ^ 0xffffffff); -} - -function crc32() { - return bufferizeInt(_crc32.apply(null, arguments)); -} -crc32.signed = function () { - return _crc32.apply(null, arguments); -}; -crc32.unsigned = function () { - return crc32.apply(null, arguments).readUInt32BE(0); -}; - -module.exports = crc32; diff --git a/node_modules/express/node_modules/connect/node_modules/buffer-crc32/package.json b/node_modules/express/node_modules/connect/node_modules/buffer-crc32/package.json deleted file mode 100644 index d9b0b51..0000000 --- a/node_modules/express/node_modules/connect/node_modules/buffer-crc32/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "author": { - "name": "Brian J. Brennan", - "email": "brianloveswords@gmail.com", - "url": "http://bjb.io" - }, - "name": "buffer-crc32", - "description": "A pure javascript CRC32 algorithm that plays nice with binary data", - "version": "0.1.1", - "homepage": "https://github.com/brianloveswords/buffer-crc32", - "repository": { - "type": "git", - "url": "git://github.com/brianloveswords/buffer-crc32.git" - }, - "main": "index.js", - "scripts": { - "test": "./node_modules/.bin/tap tests/*.test.js" - }, - "dependencies": {}, - "devDependencies": { - "tap": "~0.2.5" - }, - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "readme": "# buffer-crc32\n\n[![Build Status](https://secure.travis-ci.org/brianloveswords/buffer-crc32.png?branch=master)](http://travis-ci.org/brianloveswords/buffer-crc32)\n\ncrc32 that works with binary data and fancy character sets, outputs\nbuffer, signed or unsigned data and has tests.\n\nDerived from the sample CRC implementation in the PNG specification: http://www.w3.org/TR/PNG/#D-CRCAppendix\n\n# install\n```\nnpm install buffer-crc32\n```\n\n# example\n```js\nvar crc32 = require('buffer-crc32');\n// works with buffers\nvar buf = Buffer([[0x00, 0x73, 0x75, 0x70, 0x20, 0x62, 0x72, 0x6f, 0x00])\ncrc32(buf) // -> \n\n// has convenience methods for getting signed or unsigned ints\ncrc32.signed(buf) // -> -1805997238\ncrc32.unsigned(buf) // -> 2488970058\n\n// will cast to buffer if given a string, so you can\n// directly use foreign characters safely\ncrc32('自動販売機') // -> \n```\n\n# tests\nThis was tested against the output of zlib's crc32 method. You can run\nthe tests with`npm test` (requires tap)\n", - "_id": "buffer-crc32@0.1.1", - "_from": "buffer-crc32@0.1.1" -} diff --git a/node_modules/express/node_modules/connect/node_modules/buffer-crc32/tests/crc.test.js b/node_modules/express/node_modules/connect/node_modules/buffer-crc32/tests/crc.test.js deleted file mode 100644 index d4767e3..0000000 --- a/node_modules/express/node_modules/connect/node_modules/buffer-crc32/tests/crc.test.js +++ /dev/null @@ -1,52 +0,0 @@ -var crc32 = require('..'); -var test = require('tap').test; - -test('simple crc32 is no problem', function (t) { - var input = Buffer('hey sup bros'); - var expected = Buffer([0x47, 0xfa, 0x55, 0x70]); - t.same(crc32(input), expected); - t.end(); -}); - -test('another simple one', function (t) { - var input = Buffer('IEND'); - var expected = Buffer([0xae, 0x42, 0x60, 0x82]); - t.same(crc32(input), expected); - t.end(); -}); - -test('slightly more complex', function (t) { - var input = Buffer([0x00, 0x00, 0x00]); - var expected = Buffer([0xff, 0x41, 0xd9, 0x12]); - t.same(crc32(input), expected); - t.end(); -}); - -test('complex crc32 gets calculated like a champ', function (t) { - var input = Buffer('शीर्षक'); - var expected = Buffer([0x17, 0xb8, 0xaf, 0xf1]); - t.same(crc32(input), expected); - t.end(); -}); - -test('casts to buffer if necessary', function (t) { - var input = 'शीर्षक'; - var expected = Buffer([0x17, 0xb8, 0xaf, 0xf1]); - t.same(crc32(input), expected); - t.end(); -}); - -test('can do unsigned', function (t) { - var input = 'ham sandwich'; - var expected = -1891873021; - t.same(crc32.signed(input), expected); - t.end(); -}); - -test('can do signed', function (t) { - var input = 'bear sandwich'; - var expected = 3711466352; - t.same(crc32.unsigned(input), expected); - t.end(); -}); - diff --git a/node_modules/express/node_modules/connect/node_modules/bytes/History.md b/node_modules/express/node_modules/connect/node_modules/bytes/History.md index 1332808..db1f759 100644 --- a/node_modules/express/node_modules/connect/node_modules/bytes/History.md +++ b/node_modules/express/node_modules/connect/node_modules/bytes/History.md @@ -1,9 +1,4 @@ -0.2.0 / 2012-10-28 -================== - - * bytes(200).should.eql('200b') - 0.1.0 / 2012-07-04 ================== diff --git a/node_modules/express/node_modules/connect/node_modules/bytes/index.js b/node_modules/express/node_modules/connect/node_modules/bytes/index.js index 70b2e01..3eaafc7 100644 --- a/node_modules/express/node_modules/connect/node_modules/bytes/index.js +++ b/node_modules/express/node_modules/connect/node_modules/bytes/index.js @@ -24,9 +24,9 @@ module.exports = function(size) { /** * convert bytes into string. - * + * * @param {Number} b - bytes to convert - * @return {String} + * @return {String}i * @api public */ @@ -35,5 +35,5 @@ function convert (b) { if (b >= gb) return (Math.round(b / gb * 100) / 100) + 'gb'; if (b >= mb) return (Math.round(b / mb * 100) / 100) + 'mb'; if (b >= kb) return (Math.round(b / kb * 100) / 100) + 'kb'; - return b + 'b'; -} + return b; +} \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/bytes/package.json b/node_modules/express/node_modules/connect/node_modules/bytes/package.json index bd73098..05f17ec 100644 --- a/node_modules/express/node_modules/connect/node_modules/bytes/package.json +++ b/node_modules/express/node_modules/connect/node_modules/bytes/package.json @@ -6,14 +6,19 @@ "url": "http://tjholowaychuk.com" }, "description": "byte size string parser / serializer", - "version": "0.2.0", + "version": "0.1.0", "main": "index.js", "dependencies": {}, "devDependencies": { "mocha": "*", "should": "*" }, + "component": { + "scripts": { + "bytes": "index.js" + } + }, "readme": "# node-bytes\n\n Byte string parser / formatter.\n\n## Example:\n\n```js\nbytes('1kb')\n// => 1024\n\nbytes('2mb')\n// => 2097152\n\nbytes('1gb')\n// => 1073741824\n\nbytes(1073741824)\n// => 1gb\n```\n\n## Installation\n\n```\n$ npm install bytes\n$ component install visionmedia/bytes.js\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", - "_id": "bytes@0.2.0", - "_from": "bytes@0.2.0" + "_id": "bytes@0.1.0", + "_from": "bytes@0.1.0" } diff --git a/node_modules/express/node_modules/connect/package.json b/node_modules/express/node_modules/connect/package.json index ce1beac..d84a62c 100644 --- a/node_modules/express/node_modules/connect/package.json +++ b/node_modules/express/node_modules/connect/package.json @@ -1,6 +1,6 @@ { "name": "connect", - "version": "2.7.4", + "version": "2.7.2", "description": "High performance middleware framework", "keywords": [ "framework", @@ -24,8 +24,8 @@ "cookie-signature": "0.0.1", "buffer-crc32": "0.1.1", "cookie": "0.0.5", + "bytes": "0.1.0", "send": "0.1.0", - "bytes": "0.2.0", "fresh": "0.1.0", "pause": "0.0.1", "debug": "*" @@ -44,6 +44,6 @@ "test": "make" }, "readme": "[![build status](https://secure.travis-ci.org/senchalabs/connect.png)](http://travis-ci.org/senchalabs/connect)\n# Connect\n\n Connect is an extensible HTTP server framework for [node](http://nodejs.org), providing high performance \"plugins\" known as _middleware_.\n\n Connect is bundled with over _20_ commonly used middleware, including\n a logger, session support, cookie parser, and [more](http://senchalabs.github.com/connect). Be sure to view the 2.x [documentation](http://senchalabs.github.com/connect/).\n\n```js\nvar connect = require('connect')\n , http = require('http');\n\nvar app = connect()\n .use(connect.favicon())\n .use(connect.logger('dev'))\n .use(connect.static('public'))\n .use(connect.directory('public'))\n .use(connect.cookieParser())\n .use(connect.session({ secret: 'my secret here' }))\n .use(function(req, res){\n res.end('Hello from Connect!\\n');\n });\n\nhttp.createServer(app).listen(3000);\n```\n\n## Middleware\n\n - [csrf](http://www.senchalabs.org/connect/csrf.html)\n - [basicAuth](http://www.senchalabs.org/connect/basicAuth.html)\n - [bodyParser](http://www.senchalabs.org/connect/bodyParser.html)\n - [json](http://www.senchalabs.org/connect/json.html)\n - [multipart](http://www.senchalabs.org/connect/multipart.html)\n - [urlencoded](http://www.senchalabs.org/connect/urlencoded.html)\n - [cookieParser](http://www.senchalabs.org/connect/cookieParser.html)\n - [directory](http://www.senchalabs.org/connect/directory.html)\n - [compress](http://www.senchalabs.org/connect/compress.html)\n - [errorHandler](http://www.senchalabs.org/connect/errorHandler.html)\n - [favicon](http://www.senchalabs.org/connect/favicon.html)\n - [limit](http://www.senchalabs.org/connect/limit.html)\n - [logger](http://www.senchalabs.org/connect/logger.html)\n - [methodOverride](http://www.senchalabs.org/connect/methodOverride.html)\n - [query](http://www.senchalabs.org/connect/query.html)\n - [responseTime](http://www.senchalabs.org/connect/responseTime.html)\n - [session](http://www.senchalabs.org/connect/session.html)\n - [static](http://www.senchalabs.org/connect/static.html)\n - [staticCache](http://www.senchalabs.org/connect/staticCache.html)\n - [vhost](http://www.senchalabs.org/connect/vhost.html)\n - [subdomains](http://www.senchalabs.org/connect/subdomains.html)\n - [cookieSession](http://www.senchalabs.org/connect/cookieSession.html)\n\n## Running Tests\n\nfirst:\n\n $ npm install -d\n\nthen:\n\n $ make test\n\n## Authors\n\n Below is the output from [git-summary](http://github.com/visionmedia/git-extras).\n\n\n project: connect\n commits: 2033\n active : 301 days\n files : 171\n authors: \n 1414\tTj Holowaychuk 69.6%\n 298\tvisionmedia 14.7%\n 191\tTim Caswell 9.4%\n 51\tTJ Holowaychuk 2.5%\n 10\tRyan Olds 0.5%\n 8\tAstro 0.4%\n 5\tNathan Rajlich 0.2%\n 5\tJakub Nešetřil 0.2%\n 3\tDaniel Dickison 0.1%\n 3\tDavid Rio Deiros 0.1%\n 3\tAlexander Simmerl 0.1%\n 3\tAndreas Lind Petersen 0.1%\n 2\tAaron Heckmann 0.1%\n 2\tJacques Crocker 0.1%\n 2\tFabian Jakobs 0.1%\n 2\tBrian J Brennan 0.1%\n 2\tAdam Malcontenti-Wilson 0.1%\n 2\tGlen Mailer 0.1%\n 2\tJames Campos 0.1%\n 1\tTrent Mick 0.0%\n 1\tTroy Kruthoff 0.0%\n 1\tWei Zhu 0.0%\n 1\tcomerc 0.0%\n 1\tdarobin 0.0%\n 1\tnateps 0.0%\n 1\tMarco Sanson 0.0%\n 1\tArthur Taylor 0.0%\n 1\tAseem Kishore 0.0%\n 1\tBart Teeuwisse 0.0%\n 1\tCameron Howey 0.0%\n 1\tChad Weider 0.0%\n 1\tCraig Barnes 0.0%\n 1\tEran Hammer-Lahav 0.0%\n 1\tGregory McWhirter 0.0%\n 1\tGuillermo Rauch 0.0%\n 1\tJae Kwon 0.0%\n 1\tJakub Nesetril 0.0%\n 1\tJoshua Peek 0.0%\n 1\tJxck 0.0%\n 1\tAJ ONeal 0.0%\n 1\tMichael Hemesath 0.0%\n 1\tMorten Siebuhr 0.0%\n 1\tSamori Gorse 0.0%\n 1\tTom Jensen 0.0%\n\n## Node Compatibility\n\n Connect `< 1.x` is compatible with node 0.2.x\n\n\n Connect `1.x` is compatible with node 0.4.x\n\n\n Connect (_master_) `2.x` is compatible with node 0.6.x\n\n## CLA\n\n [http://sencha.com/cla](http://sencha.com/cla)\n\n## License\n\nView the [LICENSE](https://github.com/senchalabs/connect/blob/master/LICENSE) file. The [Silk](http://www.famfamfam.com/lab/icons/silk/) icons used by the `directory` middleware created by/copyright of [FAMFAMFAM](http://www.famfamfam.com/).\n", - "_id": "connect@2.7.4", - "_from": "connect@2.7.4" + "_id": "connect@2.7.2", + "_from": "connect@2.7.2" } diff --git a/node_modules/express/node_modules/connect/test.js b/node_modules/express/node_modules/connect/test.js index 92b7003..142e9f2 100644 --- a/node_modules/express/node_modules/connect/test.js +++ b/node_modules/express/node_modules/connect/test.js @@ -2,39 +2,6 @@ var connect = require('./'); var app = connect(); -app.use(connect.logger('dev')); -app.use(connect.bodyParser()); +app.use(connect.directory('.')); -app.use(function(req, res, next){ - if (req.checkContinue) { - res.writeContinue(); - } - res.end('hello'); -}); - -var server = app.listen(3000); - -server.on('checkContinue', function(req, res){ - req.checkContinue = true; - app(req, res); -}); - - -// var http = require('http'); - -// var app = http.createServer(function(req, res){ -// console.log(req.headers); -// }); - -// app.on('checkContinue', function(req, res){ -// if ('application/json' == req.headers['content-type']) { -// res.writeContinue(); -// console.log('ok'); -// res.end('thanks') -// } else { -// res.writeHead(400); -// res.end('bad request, json only'); -// } -// }); - -// app.listen(3000); +app.listen(3000) \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mpath/.npmignore b/node_modules/express/node_modules/mkdirp/.gitignore.orig similarity index 51% rename from node_modules/mongoose/node_modules/mpath/.npmignore rename to node_modules/express/node_modules/mkdirp/.gitignore.orig index be106ca..9303c34 100644 --- a/node_modules/mongoose/node_modules/mpath/.npmignore +++ b/node_modules/express/node_modules/mkdirp/.gitignore.orig @@ -1,2 +1,2 @@ -*.sw* node_modules/ +npm-debug.log \ No newline at end of file diff --git a/node_modules/express/node_modules/mkdirp/.gitignore.rej b/node_modules/express/node_modules/mkdirp/.gitignore.rej new file mode 100644 index 0000000..69244ff --- /dev/null +++ b/node_modules/express/node_modules/mkdirp/.gitignore.rej @@ -0,0 +1,5 @@ +--- /dev/null ++++ .gitignore +@@ -0,0 +1,2 @@ ++node_modules/ ++npm-debug.log \ No newline at end of file diff --git a/node_modules/express/node_modules/mkdirp/.travis.yml b/node_modules/express/node_modules/mkdirp/.travis.yml index 84fd7ca..f1d0f13 100644 --- a/node_modules/express/node_modules/mkdirp/.travis.yml +++ b/node_modules/express/node_modules/mkdirp/.travis.yml @@ -1,5 +1,4 @@ language: node_js node_js: + - 0.4 - 0.6 - - 0.8 - - 0.9 diff --git a/node_modules/express/node_modules/mkdirp/README.markdown b/node_modules/express/node_modules/mkdirp/README.markdown index 83b0216..40de04f 100644 --- a/node_modules/express/node_modules/mkdirp/README.markdown +++ b/node_modules/express/node_modules/mkdirp/README.markdown @@ -1,37 +1,34 @@ -# mkdirp +mkdirp +====== Like `mkdir -p`, but in node.js! [![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](http://travis-ci.org/substack/node-mkdirp) -# example +example +======= -## pow.js - -```js -var mkdirp = require('mkdirp'); +pow.js +------ + var mkdirp = require('mkdirp'); -mkdirp('/tmp/foo/bar/baz', function (err) { - if (err) console.error(err) - else console.log('pow!') -}); -``` + mkdirp('/tmp/foo/bar/baz', function (err) { + if (err) console.error(err) + else console.log('pow!') + }); Output - -``` -pow! -``` + pow! And now /tmp/foo/bar/baz exists, huzzah! -# methods +methods +======= -```js var mkdirp = require('mkdirp'); -``` -## mkdirp(dir, mode, cb) +mkdirp(dir, mode, cb) +--------------------- Create a new directory and any necessary subdirectories at `dir` with octal permission string `mode`. @@ -41,7 +38,8 @@ If `mode` isn't specified, it defaults to `0777 & (~process.umask())`. `cb(err, made)` fires with the error or the first directory `made` that had to be created, if any. -## mkdirp.sync(dir, mode) +mkdirp.sync(dir, mode) +---------------------- Synchronously create a new directory and any necessary subdirectories at `dir` with octal permission string `mode`. @@ -50,14 +48,14 @@ If `mode` isn't specified, it defaults to `0777 & (~process.umask())`. Returns the first directory that had to be created, if any. -# install +install +======= With [npm](http://npmjs.org) do: -``` -npm install mkdirp -``` + npm install mkdirp -# license +license +======= -MIT +MIT/X11 diff --git a/node_modules/express/node_modules/mkdirp/examples/pow.js.orig b/node_modules/express/node_modules/mkdirp/examples/pow.js.orig new file mode 100644 index 0000000..7741462 --- /dev/null +++ b/node_modules/express/node_modules/mkdirp/examples/pow.js.orig @@ -0,0 +1,6 @@ +var mkdirp = require('mkdirp'); + +mkdirp('/tmp/foo/bar/baz', 0755, function (err) { + if (err) console.error(err) + else console.log('pow!') +}); diff --git a/node_modules/express/node_modules/mkdirp/examples/pow.js.rej b/node_modules/express/node_modules/mkdirp/examples/pow.js.rej new file mode 100644 index 0000000..81e7f43 --- /dev/null +++ b/node_modules/express/node_modules/mkdirp/examples/pow.js.rej @@ -0,0 +1,19 @@ +--- examples/pow.js ++++ examples/pow.js +@@ -1,6 +1,15 @@ +-var mkdirp = require('mkdirp').mkdirp; ++var mkdirp = require('../').mkdirp, ++ mkdirpSync = require('../').mkdirpSync; + + mkdirp('/tmp/foo/bar/baz', 0755, function (err) { + if (err) console.error(err) + else console.log('pow!') + }); ++ ++try { ++ mkdirpSync('/tmp/bar/foo/baz', 0755); ++ console.log('double pow!'); ++} ++catch (ex) { ++ console.log(ex); ++} \ No newline at end of file diff --git a/node_modules/express/node_modules/mkdirp/index.js b/node_modules/express/node_modules/mkdirp/index.js index fda6de8..874b310 100644 --- a/node_modules/express/node_modules/mkdirp/index.js +++ b/node_modules/express/node_modules/mkdirp/index.js @@ -27,10 +27,18 @@ function mkdirP (p, mode, f, made) { }); break; - // In the case of any other error, just see if there's a dir - // there already. If so, then hooray! If not, then something - // is borked. - default: + case 'EISDIR': + case 'EPERM': + // Operation not permitted or already is a dir. + // This is the error you get when trying to mkdir('c:/') + // on windows, or mkdir('/') on unix. Make sure it's a + // dir by falling through to the EEXIST case. + case 'EROFS': + // a read-only file system. + // However, the dir could already exist, in which case + // the EROFS error will be obscuring a EEXIST! + // Fallthrough to that case. + case 'EEXIST': fs.stat(p, function (er2, stat) { // if the stat fails, then that's super weird. // let the original error be the failure reason. @@ -38,6 +46,10 @@ function mkdirP (p, mode, f, made) { else cb(null, made); }); break; + + default: + cb(er, made); + break; } }); } @@ -62,10 +74,7 @@ mkdirP.sync = function sync (p, mode, made) { sync(p, mode, made); break; - // In the case of any other error, just see if there's a dir - // there already. If so, then hooray! If not, then something - // is borked. - default: + case 'EEXIST' : var stat; try { stat = fs.statSync(p); @@ -75,6 +84,9 @@ mkdirP.sync = function sync (p, mode, made) { } if (!stat.isDirectory()) throw err0; break; + default : + throw err0 + break; } } diff --git a/node_modules/express/node_modules/mkdirp/package.json b/node_modules/express/node_modules/mkdirp/package.json index 1f2736d..b5a2c99 100644 --- a/node_modules/express/node_modules/mkdirp/package.json +++ b/node_modules/express/node_modules/mkdirp/package.json @@ -1,7 +1,7 @@ { "name": "mkdirp", "description": "Recursively mkdir, like `mkdir -p`", - "version": "0.3.5", + "version": "0.3.3", "author": { "name": "James Halliday", "email": "mail@substack.net", @@ -20,10 +20,13 @@ "test": "tap test/*.js" }, "devDependencies": { - "tap": "~0.4.0" + "tap": "~0.2.4" }, - "license": "MIT", - "readme": "# mkdirp\n\nLike `mkdir -p`, but in node.js!\n\n[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](http://travis-ci.org/substack/node-mkdirp)\n\n# example\n\n## pow.js\n\n```js\nvar mkdirp = require('mkdirp');\n \nmkdirp('/tmp/foo/bar/baz', function (err) {\n if (err) console.error(err)\n else console.log('pow!')\n});\n```\n\nOutput\n\n```\npow!\n```\n\nAnd now /tmp/foo/bar/baz exists, huzzah!\n\n# methods\n\n```js\nvar mkdirp = require('mkdirp');\n```\n\n## mkdirp(dir, mode, cb)\n\nCreate a new directory and any necessary subdirectories at `dir` with octal\npermission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\n`cb(err, made)` fires with the error or the first directory `made`\nthat had to be created, if any.\n\n## mkdirp.sync(dir, mode)\n\nSynchronously create a new directory and any necessary subdirectories at `dir`\nwith octal permission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\nReturns the first directory that had to be created, if any.\n\n# install\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm install mkdirp\n```\n\n# license\n\nMIT\n", - "_id": "mkdirp@0.3.5", - "_from": "mkdirp@>= 0.3.1" + "license": "MIT/X11", + "engines": { + "node": "*" + }, + "readme": "mkdirp\n======\n\nLike `mkdir -p`, but in node.js!\n\n[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](http://travis-ci.org/substack/node-mkdirp)\n\nexample\n=======\n\npow.js\n------\n var mkdirp = require('mkdirp');\n \n mkdirp('/tmp/foo/bar/baz', function (err) {\n if (err) console.error(err)\n else console.log('pow!')\n });\n\nOutput\n pow!\n\nAnd now /tmp/foo/bar/baz exists, huzzah!\n\nmethods\n=======\n\nvar mkdirp = require('mkdirp');\n\nmkdirp(dir, mode, cb)\n---------------------\n\nCreate a new directory and any necessary subdirectories at `dir` with octal\npermission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\n`cb(err, made)` fires with the error or the first directory `made`\nthat had to be created, if any.\n\nmkdirp.sync(dir, mode)\n----------------------\n\nSynchronously create a new directory and any necessary subdirectories at `dir`\nwith octal permission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\nReturns the first directory that had to be created, if any.\n\ninstall\n=======\n\nWith [npm](http://npmjs.org) do:\n\n npm install mkdirp\n\nlicense\n=======\n\nMIT/X11\n", + "_id": "mkdirp@0.3.3", + "_from": "mkdirp@0.3.3" } diff --git a/node_modules/express/package.json b/node_modules/express/package.json index a87ed1c..8be502a 100644 --- a/node_modules/express/package.json +++ b/node_modules/express/package.json @@ -1,7 +1,7 @@ { "name": "express", "description": "Sinatra inspired web development framework", - "version": "3.1.1", + "version": "3.1.0", "author": { "name": "TJ Holowaychuk", "email": "tj@vision-media.ca" @@ -25,12 +25,12 @@ } ], "dependencies": { - "connect": "2.7.4", + "connect": "2.7.2", "commander": "0.6.1", "range-parser": "0.0.4", - "mkdirp": "~0.3.4", + "mkdirp": "0.3.3", "cookie": "0.0.5", - "buffer-crc32": "~0.2.1", + "buffer-crc32": "0.1.1", "fresh": "0.1.0", "methods": "0.0.1", "send": "0.1.0", @@ -74,7 +74,7 @@ "engines": { "node": "*" }, - "readme": "![express logo](http://f.cl.ly/items/0V2S1n0K1i3y1c122g04/Screen%20Shot%202012-04-11%20at%209.59.42%20AM.png)\n\n Fast, unopinionated, minimalist web framework for [node](http://nodejs.org). [![Build Status](https://secure.travis-ci.org/visionmedia/express.png)](http://travis-ci.org/visionmedia/express) [![Dependency Status](https://gemnasium.com/visionmedia/express.png)](https://gemnasium.com/visionmedia/express)\n\n```js\nvar express = require('express');\nvar app = express();\n\napp.get('/', function(req, res){\n res.send('Hello World');\n});\n\napp.listen(3000);\n```\n\n## Installation\n\n $ npm install -g express\n\n## Quick Start\n\n The quickest way to get started with express is to utilize the executable `express(1)` to generate an application as shown below:\n\n Create the app:\n\n $ npm install -g express\n $ express /tmp/foo && cd /tmp/foo\n\n Install dependencies:\n\n $ npm install\n\n Start the server:\n\n $ node app\n\n## Features\n\n * Built on [Connect](http://github.com/senchalabs/connect)\n * Robust routing\n * HTTP helpers (redirection, caching, etc)\n * View system supporting 14+ template engines\n * Content negotiation\n * Focus on high performance\n * Environment based configuration\n * Executable for generating applications quickly\n * High test coverage\n\n## Philosophy\n\n The Express philosophy is to provide small, robust tooling for HTTP servers. Making\n it a great solution for single page applications, web sites, hybrids, or public\n HTTP APIs.\n\n Built on Connect you can use _only_ what you need, and nothing more, applications\n can be as big or as small as you like, even a single file. Express does\n not force you to use any specific ORM or template engine. With support for over\n 14 template engines via [Consolidate.js](http://github.com/visionmedia/consolidate.js)\n you can quickly craft your perfect framework.\n\n## More Information\n\n * Join #express on freenode\n * [Google Group](http://groups.google.com/group/express-js) for discussion\n * Follow [tjholowaychuk](http://twitter.com/tjholowaychuk) on twitter for updates\n * Visit the [Wiki](http://github.com/visionmedia/express/wiki)\n * [日本語ドキュメンテーション](http://hideyukisaito.com/doc/expressjs/) by [hideyukisaito](https://github.com/hideyukisaito)\n * [Русскоязычная документация](http://express-js.ru/)\n * Run express examples [online](https://runnable.com/express)\n\n## Viewing Examples\n\nClone the Express repo, then install the dev dependencies to install all the example / test suite deps:\n\n $ git clone git://github.com/visionmedia/express.git --depth 1\n $ cd express\n $ npm install\n\nthen run whichever tests you want:\n\n $ node examples/content-negotiation\n\n## Running Tests\n\nTo run the test suite first invoke the following command within the repo, installing the development dependencies:\n\n $ npm install\n\nthen run the tests:\n\n $ make test\n\n## Contributors\n\n```\nproject: express\ncommits: 3559\nactive : 468 days\nfiles : 237\nauthors:\n 1891\tTj Holowaychuk 53.1%\n 1285\tvisionmedia 36.1%\n 182\tTJ Holowaychuk 5.1%\n 54\tAaron Heckmann 1.5%\n 34\tcsausdev 1.0%\n 26\tciaranj 0.7%\n 21\tRobert Sköld 0.6%\n 6\tGuillermo Rauch 0.2%\n 3\tDav Glass 0.1%\n 3\tNick Poulden 0.1%\n 2\tRandy Merrill 0.1%\n 2\tBenny Wong 0.1%\n 2\tHunter Loftis 0.1%\n 2\tJake Gordon 0.1%\n 2\tBrian McKinney 0.1%\n 2\tRoman Shtylman 0.1%\n 2\tBen Weaver 0.1%\n 2\tDave Hoover 0.1%\n 2\tEivind Fjeldstad 0.1%\n 2\tDaniel Shaw 0.1%\n 1\tMatt Colyer 0.0%\n 1\tPau Ramon 0.0%\n 1\tPero Pejovic 0.0%\n 1\tPeter Rekdal Sunde 0.0%\n 1\tRaynos 0.0%\n 1\tTeng Siong Ong 0.0%\n 1\tViktor Kelemen 0.0%\n 1\tctide 0.0%\n 1\t8bitDesigner 0.0%\n 1\tisaacs 0.0%\n 1\tmgutz 0.0%\n 1\tpikeas 0.0%\n 1\tshuwatto 0.0%\n 1\ttstrimple 0.0%\n 1\tewoudj 0.0%\n 1\tAdam Sanderson 0.0%\n 1\tAndrii Kostenko 0.0%\n 1\tAndy Hiew 0.0%\n 1\tArpad Borsos 0.0%\n 1\tAshwin Purohit 0.0%\n 1\tBenjen 0.0%\n 1\tDarren Torpey 0.0%\n 1\tGreg Ritter 0.0%\n 1\tGregory Ritter 0.0%\n 1\tJames Herdman 0.0%\n 1\tJim Snodgrass 0.0%\n 1\tJoe McCann 0.0%\n 1\tJonathan Dumaine 0.0%\n 1\tJonathan Palardy 0.0%\n 1\tJonathan Zacsh 0.0%\n 1\tJustin Lilly 0.0%\n 1\tKen Sato 0.0%\n 1\tMaciej Małecki 0.0%\n 1\tMasahiro Hayashi 0.0%\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2009-2012 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", - "_id": "express@3.1.1", - "_from": "express@3.1.1" + "readme": "![express logo](http://f.cl.ly/items/0V2S1n0K1i3y1c122g04/Screen%20Shot%202012-04-11%20at%209.59.42%20AM.png)\n\n Fast, unopinionated, minimalist web framework for [node](http://nodejs.org). [![Build Status](https://secure.travis-ci.org/visionmedia/express.png)](http://travis-ci.org/visionmedia/express)\n\n```js\nvar express = require('express');\nvar app = express();\n\napp.get('/', function(req, res){\n res.send('Hello World');\n});\n\napp.listen(3000);\n```\n\n## Installation\n\n $ npm install -g express\n\n## Quick Start\n\n The quickest way to get started with express is to utilize the executable `express(1)` to generate an application as shown below:\n\n Create the app:\n\n $ npm install -g express\n $ express /tmp/foo && cd /tmp/foo\n\n Install dependencies:\n\n $ npm install\n\n Start the server:\n\n $ node app\n\n## Features\n\n * Built on [Connect](http://github.com/senchalabs/connect)\n * Robust routing\n * HTTP helpers (redirection, caching, etc)\n * View system supporting 14+ template engines\n * Content negotiation\n * Focus on high performance\n * Environment based configuration\n * Executable for generating applications quickly\n * High test coverage\n\n## Philosophy\n\n The Express philosophy is to provide small, robust tooling for HTTP servers. Making\n it a great solution for single page applications, web sites, hybrids, or public\n HTTP APIs.\n \n Built on Connect you can use _only_ what you need, and nothing more, applications\n can be as big or as small as you like, even a single file. Express does\n not force you to use any specific ORM or template engine. With support for over\n 14 template engines via [Consolidate.js](http://github.com/visionmedia/consolidate.js)\n you can quickly craft your perfect framework.\n\n## More Information\n\n * Join #express on freenode\n * [Google Group](http://groups.google.com/group/express-js) for discussion\n * Follow [tjholowaychuk](http://twitter.com/tjholowaychuk) on twitter for updates\n * Visit the [Wiki](http://github.com/visionmedia/express/wiki)\n * [日本語ドキュメンテーション](http://hideyukisaito.com/doc/expressjs/) by [hideyukisaito](https://github.com/hideyukisaito)\n * [Русскоязычная документация](http://express-js.ru/)\n\n## Viewing Examples\n\nClone the Express repo, then install the dev dependencies to install all the example / test suite deps:\n\n $ git clone git://github.com/visionmedia/express.git --depth 1\n $ cd express\n $ npm install\n\nthen run whichever tests you want:\n\n $ node examples/content-negotiation\n\n## Running Tests\n\nTo run the test suite first invoke the following command within the repo, installing the development dependencies:\n\n $ npm install\n\nthen run the tests:\n\n $ make test\n\n## Contributors\n\n```\nproject: express\ncommits: 3559\nactive : 468 days\nfiles : 237\nauthors: \n 1891\tTj Holowaychuk 53.1%\n 1285\tvisionmedia 36.1%\n 182\tTJ Holowaychuk 5.1%\n 54\tAaron Heckmann 1.5%\n 34\tcsausdev 1.0%\n 26\tciaranj 0.7%\n 21\tRobert Sköld 0.6%\n 6\tGuillermo Rauch 0.2%\n 3\tDav Glass 0.1%\n 3\tNick Poulden 0.1%\n 2\tRandy Merrill 0.1%\n 2\tBenny Wong 0.1%\n 2\tHunter Loftis 0.1%\n 2\tJake Gordon 0.1%\n 2\tBrian McKinney 0.1%\n 2\tRoman Shtylman 0.1%\n 2\tBen Weaver 0.1%\n 2\tDave Hoover 0.1%\n 2\tEivind Fjeldstad 0.1%\n 2\tDaniel Shaw 0.1%\n 1\tMatt Colyer 0.0%\n 1\tPau Ramon 0.0%\n 1\tPero Pejovic 0.0%\n 1\tPeter Rekdal Sunde 0.0%\n 1\tRaynos 0.0%\n 1\tTeng Siong Ong 0.0%\n 1\tViktor Kelemen 0.0%\n 1\tctide 0.0%\n 1\t8bitDesigner 0.0%\n 1\tisaacs 0.0%\n 1\tmgutz 0.0%\n 1\tpikeas 0.0%\n 1\tshuwatto 0.0%\n 1\ttstrimple 0.0%\n 1\tewoudj 0.0%\n 1\tAdam Sanderson 0.0%\n 1\tAndrii Kostenko 0.0%\n 1\tAndy Hiew 0.0%\n 1\tArpad Borsos 0.0%\n 1\tAshwin Purohit 0.0%\n 1\tBenjen 0.0%\n 1\tDarren Torpey 0.0%\n 1\tGreg Ritter 0.0%\n 1\tGregory Ritter 0.0%\n 1\tJames Herdman 0.0%\n 1\tJim Snodgrass 0.0%\n 1\tJoe McCann 0.0%\n 1\tJonathan Dumaine 0.0%\n 1\tJonathan Palardy 0.0%\n 1\tJonathan Zacsh 0.0%\n 1\tJustin Lilly 0.0%\n 1\tKen Sato 0.0%\n 1\tMaciej Małecki 0.0%\n 1\tMasahiro Hayashi 0.0%\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2009-2012 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", + "_id": "express@3.1.0", + "_from": "express@3.1.0" } diff --git a/node_modules/express/test.js b/node_modules/express/test.js index 50cf320..112ee0a 100644 --- a/node_modules/express/test.js +++ b/node_modules/express/test.js @@ -6,33 +6,9 @@ var express = require('./') , app = express() -var users = ['foo', 'bar', 'baz']; - -app.use(express.bodyParser()); - -app.get('/api/users', function(req, res){ - res.send(users); -}); - -app.del('/api/users', function(req, res){ - users = []; - res.send(200); -}); - -app.post('/api/users', function(req, res){ - users.push(req.body.name); - res.send(201); -}); - -app.get('/api/user/:id', function(req, res){ - var id = req.params.id; - res.send(users[id]); -}); - -app.use('/api', function(req, res, next){ - var err = new Error('Method Not Allowed'); - err.status = 405; +app.get('/', function(req, res){ + console.log(req.query); }); -app.listen(5555); -console.log('listening on 5555'); +app.listen(3000); +console.log('listening on 3000'); diff --git a/node_modules/less-middleware/lib/determine-imports.js b/node_modules/less-middleware/lib/determine-imports.js deleted file mode 100644 index 05fd0f2..0000000 --- a/node_modules/less-middleware/lib/determine-imports.js +++ /dev/null @@ -1,83 +0,0 @@ -var fs = require('fs'), - path = require('path'); - -module.exports = function (tree, lessPath, additional_import_paths) { - additional_import_paths = additional_import_paths || []; - - var less_root_dir = path.dirname(lessPath); - var result = new ImportSet(); - - process_tree_node(tree, less_root_dir, less_root_dir, additional_import_paths, result); - - return result.items; -}; - -// Process each less file node, with a list of rules -var process_tree_node = module.exports.process_tree_node = function (node, current_dir, root_dir, additional_import_paths, imports) { - var import_rules = node.rules - .filter(function (rule) { - return rule.path && !rule.css; - }); - - import_rules.forEach(function (import_rule) { - process_import_rule(import_rule, current_dir, root_dir, additional_import_paths, imports); - }); -}; - -// Process an import rule, with a path and a single less file node -var process_import_rule = module.exports.process_import_rule = function process_import_rule(import_rule, current_dir, root_dir, additional_import_paths, imports) { - var found_path = locate(import_rule.path, current_dir, root_dir, additional_import_paths); - var this_import = { - mtime: Date.now(), - path: found_path - }; - imports.add(this_import); - var new_current_dir = path.dirname(found_path); - process_tree_node(import_rule.root, new_current_dir, root_dir, additional_import_paths, imports); -}; - -// Less imports check for the path first in the local directory of the file, -// and then again in the directory of the top level less file being imported. -var locate = module.exports.locate = function (filename, current_dir, root_dir, additional_import_paths) { - var i, import_path, from_import_path; - var from_current_path = path.join(current_dir, filename); - var from_root_path = path.join(root_dir, filename); - - if (fs.existsSync(from_current_path)) { - return from_current_path; - } - - if (fs.existsSync(from_root_path)){ - return from_root_path; - } - - for(i = 0; i < additional_import_paths.length; i++){ - import_path = additional_import_paths[i]; - from_import_path = path.join(import_path, filename); - if (fs.existsSync(from_import_path)) { - return from_import_path; - } - } - - throw new Error("'"+filename+"' wasn't found."); -}; - - -// It's quick to check here for duplicate items, -// and it avoids an fs call in the middleware proper -var ImportSet = module.exports.ImportSet = function(){ - this.items = []; -}; - -ImportSet.prototype.add = function(item){ - var that = this; - if (!already_in(item)){ - this.items.push(item); - } - - function already_in(item){ - return that.items.some(function(element){ - return element.path === item.path; - }); - } -}; diff --git a/node_modules/less-middleware/lib/middleware.js b/node_modules/less-middleware/lib/middleware.js index 5c8c8a6..6928b7d 100644 --- a/node_modules/less-middleware/lib/middleware.js +++ b/node_modules/less-middleware/lib/middleware.js @@ -1,7 +1,7 @@ /*! * Less - middleware (adapted from the stylus middleware) * - * Copyright(c) 2013 Randy Merrill + * Original Copyright(c) 2010 LearnBoost * MIT Licensed */ @@ -9,8 +9,7 @@ var less = require('less'), fs = require('fs'), url = require('url'), path = require('path'), - mkdirp = require('mkdirp'), - determine_imports = require('./determine-imports.js'); + mkdirp = require('mkdirp'); // Import map var imports = {}; @@ -30,7 +29,6 @@ var imports = {}; * `compress` Whether the output .css files should be compressed * `yuicompress` Same as `compress`, but uses YUI Compressor * `optimization` The desired value of the less optimization option (0, 1, or 2. 0 is default) - * `dumpLineNumbers` Add line tracking to the compiled css. ('comments' or 'mediaquery') * * Examples: * @@ -67,7 +65,7 @@ module.exports = less.middleware = function(options){ // Only log if in debug mode var log = function(key, val, type) { - if(options.debug || type === 'error') { + if(options.debug) { switch(type) { case 'log': case 'info': @@ -108,23 +106,20 @@ module.exports = less.middleware = function(options){ --pending || next(changed); }); }); - }; + } // Once option options.once = options.once || false; // Compress option options.compress = typeof options.compress === 'undefined' ? 'auto' : options.compress; - + // YUI Compress option options.yuicompress = typeof options.yuicompress === 'undefined' ? false : options.yuicompress; // Optimization option options.optimization = options.optimization || 0; - // Line Number Tracking - options.dumpLineNumbers = options.dumpLineNumbers || 0; - // Source dir required var src = options.src; if (!src) { throw new Error('less.middleware() requires "src" directory'); } @@ -132,45 +127,33 @@ module.exports = less.middleware = function(options){ // Default dest dir to source var dest = options.dest ? options.dest : src; - if (options.paths){ - if (!(options.paths instanceof Array)) { - options.paths = [options.paths]; - } - } else { - options.paths = []; - } - // Default compile callback options.render = options.render || function(str, lessPath, cssPath, callback) { - - var paths = [ path.dirname(lessPath) ]; - options.paths.forEach(function(p){ paths.push(p); }); - var parser = new less.Parser({ - paths: paths, + paths: [path.dirname(lessPath)], filename: lessPath, - optimization: options.optimization, - dumpLineNumbers: options.dumpLineNumbers + optimization: options.optimization }); parser.parse(str, function(err, tree) { - if(err) { - return callback(err); - } - - try { - var css = tree.toCSS({ - compress: (options.compress == 'auto' ? regex.compress.test(cssPath) : options.compress), - yuicompress: options.yuicompress - }); + var css = tree.toCSS({ + compress: (options.compress == 'auto' ? regex.compress.test(cssPath) : options.compress), + yuicompress: options.yuicompress + }); - // Store the less import paths - imports[lessPath] = determine_imports(tree, lessPath, options.paths); + // Store the less import paths + imports[lessPath] = tree.rules + .filter(function(rule) { + return rule.path; + }) + .map(function(rule) { + return { + mtime : Date.now(), + path : path.join(path.dirname(lessPath), rule.path) + }; + }); - callback(err, css); - } catch(parseError) { - callback(parseError, null); - } + callback(err, css); }); }; diff --git a/node_modules/less-middleware/license b/node_modules/less-middleware/license deleted file mode 100644 index 5103e09..0000000 --- a/node_modules/less-middleware/license +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2013 Randy Merrill - -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. diff --git a/node_modules/less-middleware/node_modules/less/package.json b/node_modules/less-middleware/node_modules/less/package.json index 8b8d08c..ea27ed5 100644 --- a/node_modules/less-middleware/node_modules/less/package.json +++ b/node_modules/less-middleware/node_modules/less/package.json @@ -45,5 +45,5 @@ "dependencies": { "ycssmin": ">=1.0.1" }, - "_from": "less@>= 1.3.3" + "_from": "less@>= 1.3.0" } diff --git a/node_modules/less-middleware/package.json b/node_modules/less-middleware/package.json index 98d95e1..61a73a0 100644 --- a/node_modules/less-middleware/package.json +++ b/node_modules/less-middleware/package.json @@ -6,14 +6,14 @@ }, "name": "less-middleware", "description": "LESS.js middleware for connect.", - "version": "0.1.11", + "version": "0.1.6", "repository": { "type": "git", "url": "git://github.com/emberfeather/less.js-middleware.git" }, "main": "lib/middleware.js", "dependencies": { - "less": ">= 1.3.3", + "less": ">= 1.3.0", "mkdirp": ">= 0.3.1" }, "devDependencies": {}, @@ -21,7 +21,7 @@ "engines": { "node": "*" }, - "readme": "## Installation\n\n sudo npm install less-middleware\n\n## Options\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n
    OptionDescriptionDefault
    forceAlways re-compile less files on each request.false
    onceOnly check for need to recompile once after each server restart. Useful for reducing disk i/o on production.false
    debugOutput any debugging messages to the console.false
    srcSource directory containing the .less files. Required.
    destDesitnation directory to output the compiled .css files.<src>
    pathsSpecify search paths for @import directivesThe dirname of <src>
    prefixPath which should be stripped from the public pathname.
    compressCompress the output being written to the *.css files. When set to 'auto' compression will only happen when the css file ends with .min.css or -min.css.auto
    optimizationDesired level of LESS optimization. Optionally 0, 1, or 20
    dumpLineNumbersAdd line tracking to the compiled css. Optionally 0, 'comments', or 'mediaquery'0
    \n\n## Examples\n\n### Connect\n\n var lessMiddleware = require('less-middleware');\n\n var server = connect.createServer(\n lessMiddleware({\n src: __dirname + '/public',\n compress: true\n }),\n connect.staticProvider(__dirname + '/public')\n );\n\n### Express\n\n var lessMiddleware = require('less-middleware');\n\n var app = express.createServer();\n\n app.configure(function () {\n // Other configuration here...\n\n app.use(lessMiddleware({\n src: __dirname + '/public',\n compress: true\n }));\n\n app.use(express.static(__dirname + '/public'));\n });\n\n### Express - Different `src` and `dest`\n\nWhen using a different `src` and `dest` you can use the `prefix` option to make the directory structure cleaner.\n\nRequests for static assets (like stylesheets) made to the express server use a `pathname` to look up the file. So if the request is for `http://localhost/stylesheets/styles.css` the `pathname` will be `/stylesheets/styles.css`.\n\nThe less middleware uses that path to determine where to look for less files. In the original example it looks for the less file at `/public/stylesheets/styles.less` and compiles it to `/public/stylesheets/styles.css`.\n\nIf you are using a different `src` and `dest` options it causes for more complex directories structures unless you use the `prefix` option. For example, without the `prefix`, and with a `src` of `/src/less` and a `dest` of `/public` it would look for the less file at `/src/less/stylesheets/styles.less` and compile it to `/public/stylesheets/styles.css`. To make it cleaner you can use the `prefix` option:\n\n var lessMiddleware = require('less-middleware');\n\n var app = express.createServer();\n\n app.configure(function () {\n // Other configuration here...\n\n app.use(lessMiddleware({\n dest: __dirname + '/public/stylesheets',\n src: __dirname + '/src/less',\n prefix: '/stylesheets',\n compress: true\n }));\n\n app.use(express.static(__dirname + '/public'));\n });\n\nUsing the `prefix` it changes the `pathname` from `/stylesheets/styles.css` to `/styles.css`. With that prefix removed from the `pathname` it makes things cleaner. With the `prefix` removed it would look for the less file at `/src/less/styles.less` and compile it to `/public/stylesheets/styles.css`.\n\n### Express - Using a temp directory for `dest`\n\nSince less middleware relies on static content to be served by express.static, using temp directories just requires that you inform express about where generated files are built:\n\n var lessMiddleware = require('less-middleware'),\n os = require('os');\n\n var app = express.createServer();\n\n app.configure(function () {\n // Other configuration here...\n\n var tmpDir = os.tmpDir();\n app.use(lessMiddleware({\n src: __dirname + '/public/stylesheets',\n dest: tmpDir,\n compress: true\n }));\n\n app.use(express.static(__dirname + '/public'));\n app.use(express.static(tmpDir));\n });\n\nUsing a temp directory is useful for read-only file systems, such as a Heroku deployment. By using a temp directory the css files can still be written and served.\n\n### Importing less\n\nBy default the directory in which the compiled files live in is already set as an import directive:\n\n```css\n// file1.less\n\n@import 'file2.less';\n\nbody {\n color: @bodyColor;\n}\n```\n\n```css\n// file2.less\n\n@bodyColor: #333333;\n```\n\nHowever, you can use the `paths` option if you need to specify other directories in which to search for importable less files.\n\n```js\nvar less = require('less-middleware'),\n path = require('path');\n\n lessMiddleware({\n src: path.join(__dirname, 'public'),\n paths: [path.join(__dirname, 'module', 'less')]\n });\n```\n\n```css\n// public/base.css\n\n@import 'colors';\n\nbody {\n color: @bodyColor;\n}\n```\n\n```css\n// module/less/colors.less\n\n@bodyColor: #333333;\n```\n\n### Using bootstrap\n\nHere's an example on how to use Twitter's bootstrap within an Express.js set-up:\n\n```js\n// package.json\n{\n \"name\": \"my-module\",\n // ...\n \"dependencies\": {\n \"less-middleware\": \"*\",\n \"bootstrap\": \"git+https://github.com/twitter/bootstrap.git#v2.2.2\",\n \"express\": \"3.0\"\n }\n}\n```\n\n```js\n// app.js\nvar express = require('express')\n , path = require('path')\n , app = express()\n , less = require('less-middleware');\n\napp.configure(function(){\n // ...\n var bootstrapPath = path.join(__dirname, 'node_modules', 'bootstrap');\n app.use(express.bodyParser());\n app.use(express.methodOverride());\n app.use('/img', express['static'](path.join(bootstrapPath, 'img')));\n app.use(app.router);\n app.use(less({\n src : path.join(__dirname, 'assets', 'less'),\n paths : [path.join(bootstrapPath, 'less')],\n dest : path.join(__dirname, 'public', 'stylesheets'),\n prefix : '/stylesheets'\n }));\n app.use(express['static'](path.join(__dirname, 'public')));\n // ...\n});\n\n// ...\n```\n\n```css\n// assets/less/base.less\n\n@import 'bootstrap';\n@import 'responsive';\n\n@bodyBackground: #FAF7EC;\n@navbarBrandColor: #989CAE;\n\n.brand {\n font-family: @monoFontFamily;\n}\n```\n\n", - "_id": "less-middleware@0.1.11", - "_from": "less-middleware@0.1.11" + "readme": "## Installation\n\n sudo npm install less-middleware\n\n## Options\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    OptionDescriptionDefault
    forceAlways re-compile less files on each request.false
    onceOnly check for need to recompile once after each server restart. Useful for reducing disk i/o on production.false
    debugOutput any debugging messages to the console.false
    srcSource directory containing the .less files. Required.
    destDesitnation directory to output the compiled .css files.<src>
    prefixPath which should be stripped from the public pathname.
    compressCompress the output being written to the *.css files. When set to 'auto' compression will only happen when the css file ends with .min.css or -min.css.auto
    optimizationDesired level of LESS optimization. Optionally 0, 1, or 20
    \n\n## Examples\n\n### Connect\n\n var lessMiddleware = require('less-middleware');\n\n var server = connect.createServer(\n lessMiddleware({\n src: __dirname + '/public',\n compress: true\n }),\n connect.staticProvider(__dirname + '/public')\n );\n\n### Express\n\n var lessMiddleware = require('less-middleware');\n\n var app = express.createServer();\n\n app.configure(function () {\n // Other configuration here...\n\n app.use(lessMiddleware({\n src: __dirname + '/public',\n compress: true\n }));\n\n app.use(express.static(__dirname + '/public'));\n });\n\n### Express - Different `src` and `dest`\n\nWhen using a different `src` and `dest` you can use the `prefix` option to make the directory structure cleaner.\n\nRequests for static assets (like stylesheets) made to the express server use a `pathname` to look up the file. So if the request is for `http://localhost/stylesheets/styles.css` the `pathname` will be `/stylesheets/styles.css`.\n\nThe less middleware uses that path to determine where to look for less files. In the original example it looks for the less file at `/public/stylesheets/styles.less` and compiles it to `/public/stylesheets/styles.css`.\n\nIf you are using a different `src` and `dest` options it causes for more complex directories structures unless you use the `prefix` option. For example, without the `prefix`, and with a `src` of `/src/less` and a `dest` of `/public` it would look for the less file at `/src/less/stylesheets/styles.less` and compile it to `/public/stylesheets/styles.css`. To make it cleaner you can use the `prefix` option:\n\n var lessMiddleware = require('less-middleware');\n\n var app = express.createServer();\n\n app.configure(function () {\n // Other configuration here...\n\n app.use(lessMiddleware({\n dest: __dirname + '/public/stylesheets',\n src: __dirname + '/src/less',\n prefix: '/stylesheets',\n compress: true\n }));\n\n app.use(express.static(__dirname + '/public'));\n });\n\nUsing the `prefix` it changes the `pathname` from `/stylesheets/styles.css` to `/styles.css`. With that prefix removed from the `pathname` it makes things cleaner. With the `prefix` removed it would look for the less file at `/src/less/styles.less` and compile it to `/public/stylesheets/styles.css`.\n", + "_id": "less-middleware@0.1.6", + "_from": "less-middleware@0.1.6" } diff --git a/node_modules/less-middleware/readme.md b/node_modules/less-middleware/readme.md index c28b1d4..8149f28 100644 --- a/node_modules/less-middleware/readme.md +++ b/node_modules/less-middleware/readme.md @@ -38,11 +38,6 @@ Desitnation directory to output the compiled .css files. <src> - - paths - Specify search paths for @import directives - The dirname of <src> - prefix Path which should be stripped from the public pathname. @@ -58,12 +53,6 @@ Desired level of LESS optimization. Optionally 0, 1, or 2 0 - - dumpLineNumbers - Add line tracking to the compiled css. Optionally 0, 'comments', or 'mediaquery' - 0 - - @@ -126,135 +115,3 @@ If you are using a different `src` and `dest` options it causes for more complex }); Using the `prefix` it changes the `pathname` from `/stylesheets/styles.css` to `/styles.css`. With that prefix removed from the `pathname` it makes things cleaner. With the `prefix` removed it would look for the less file at `/src/less/styles.less` and compile it to `/public/stylesheets/styles.css`. - -### Express - Using a temp directory for `dest` - -Since less middleware relies on static content to be served by express.static, using temp directories just requires that you inform express about where generated files are built: - - var lessMiddleware = require('less-middleware'), - os = require('os'); - - var app = express.createServer(); - - app.configure(function () { - // Other configuration here... - - var tmpDir = os.tmpDir(); - app.use(lessMiddleware({ - src: __dirname + '/public/stylesheets', - dest: tmpDir, - compress: true - })); - - app.use(express.static(__dirname + '/public')); - app.use(express.static(tmpDir)); - }); - -Using a temp directory is useful for read-only file systems, such as a Heroku deployment. By using a temp directory the css files can still be written and served. - -### Importing less - -By default the directory in which the compiled files live in is already set as an import directive: - -```css -// file1.less - -@import 'file2.less'; - -body { - color: @bodyColor; -} -``` - -```css -// file2.less - -@bodyColor: #333333; -``` - -However, you can use the `paths` option if you need to specify other directories in which to search for importable less files. - -```js -var less = require('less-middleware'), - path = require('path'); - - lessMiddleware({ - src: path.join(__dirname, 'public'), - paths: [path.join(__dirname, 'module', 'less')] - }); -``` - -```css -// public/base.css - -@import 'colors'; - -body { - color: @bodyColor; -} -``` - -```css -// module/less/colors.less - -@bodyColor: #333333; -``` - -### Using bootstrap - -Here's an example on how to use Twitter's bootstrap within an Express.js set-up: - -```js -// package.json -{ - "name": "my-module", - // ... - "dependencies": { - "less-middleware": "*", - "bootstrap": "git+https://github.com/twitter/bootstrap.git#v2.2.2", - "express": "3.0" - } -} -``` - -```js -// app.js -var express = require('express') - , path = require('path') - , app = express() - , less = require('less-middleware'); - -app.configure(function(){ - // ... - var bootstrapPath = path.join(__dirname, 'node_modules', 'bootstrap'); - app.use(express.bodyParser()); - app.use(express.methodOverride()); - app.use('/img', express['static'](path.join(bootstrapPath, 'img'))); - app.use(app.router); - app.use(less({ - src : path.join(__dirname, 'assets', 'less'), - paths : [path.join(bootstrapPath, 'less')], - dest : path.join(__dirname, 'public', 'stylesheets'), - prefix : '/stylesheets' - })); - app.use(express['static'](path.join(__dirname, 'public'))); - // ... -}); - -// ... -``` - -```css -// assets/less/base.less - -@import 'bootstrap'; -@import 'responsive'; - -@bodyBackground: #FAF7EC; -@navbarBrandColor: #989CAE; - -.brand { - font-family: @monoFontFamily; -} -``` - diff --git a/node_modules/less-middleware/test/parse-test.js b/node_modules/less-middleware/test/parse-test.js new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/mongoose/.travis.yml b/node_modules/mongoose/.travis.yml index ab51641..ce393d5 100644 --- a/node_modules/mongoose/.travis.yml +++ b/node_modules/mongoose/.travis.yml @@ -2,6 +2,5 @@ language: node_js node_js: - 0.6 - 0.8 - - 0.10 services: - mongodb diff --git a/node_modules/mongoose/CONTRIBUTING.md b/node_modules/mongoose/CONTRIBUTING.md index f32a3eb..7a90c4e 100644 --- a/node_modules/mongoose/CONTRIBUTING.md +++ b/node_modules/mongoose/CONTRIBUTING.md @@ -1,9 +1,5 @@ ## Contributing to Mongoose -### STOP! - -If you have a question about Mongoose (not a bug report) please post it to either [StackOverflow](http://stackoverflow.com/questions/tagged/mongoose), our [Google Group](http://groups.google.com/group/mongoose-orm), or on the #mongoosejs irc channel on freenode. - ### Reporting bugs - Before opening a new issue, look for existing [issues](https://github.com/learnboost/mongoose/issues) to avoid duplication. If the issue does not yet exist, [create one](https://github.com/learnboost/mongoose/issues/new). @@ -27,14 +23,7 @@ If you have a question about Mongoose (not a bug report) please post it to eithe - `for (..) {` - `while (..) {` - `function (err) {` -- Write tests and make sure they pass (tests are in the [test](https://github.com/LearnBoost/mongoose/tree/master/test) directory). - -### Running the tests -- Open a terminal and navigate to the root of the project -- execute `npm install` to install the necessary dependencies -- execute `make test` to run the tests (we're using [mocha](http://visionmedia.github.com/mocha/)) - - or to execute a single test `T="-g 'some regexp that matches the test description'" make test` - - any mocha flags can be specified with T="..." +- Write tests and make sure they pass (execute `make test` from the command line to run the test suite). ### Documentation diff --git a/node_modules/mongoose/History.md b/node_modules/mongoose/History.md index 9172e63..2b17f0c 100644 --- a/node_modules/mongoose/History.md +++ b/node_modules/mongoose/History.md @@ -1,203 +1,4 @@ -3.6.4 / 2013-04-03 -================== - - * fixed; +field conflict with $slice #1370 - * fixed; nested deselection conflict #1333 - * fixed; RangeError in ValidationError.toString() #1296 - * fixed; do not save user defined transforms #1415 - * tests; fix race condition - -3.6.3 / 2013-04-02 -================== - - * fixed; setting subdocuments deeply nested fields #1394 - * fixed; regression: populated streams #1411 - * docs; mention hooks/validation with findAndModify - * docs; mention auth - * docs; add more links - * examples; add document methods example - * website; display "see" links for properties - * website; clean up homepage - -3.5.10 / 2013-04-02 -================== - - * fixed; setting subdocuments deeply nested fields #1394 - * fixed; do not alter schema arguments #1364 - -3.6.2 / 2013-03-29 -================== - - * fixed; corrupted sub-doc array #1408 - * fixed; document#update returns a Query #1397 - * docs; readpref strategy - -3.6.1 / 2013-03-27 -================== - - * added; populate support to findAndModify varients #1395 - * added; text index type to schematypes - * expose allowed index types as Schema.indexTypes - * fixed; use of `setMaxListeners` as path - * fixed; regression in node 0.6 on docs with > 10 arrays - * fixed; do not alter schema arguments #1364 - * fixed; subdoc#ownerDocument() #1385 - * website; change search id - * website; add search from google [jackdbernier](https://github.com/jackdbernier) - * website; fix link - * website; add 3.5.x docs release - * website; fix link - * docs; fix geometry - * docs; hide internal constructor - * docs; aggregation does not cast arguments #1399 - * docs; querystream options - * examples; added for population - -3.6.0 / 2013-03-18 -================== - - * changed; cast 'true'/'false' to boolean #1282 [mgrach](https://github.com/mgrach) - * changed; Buffer arrays can now contain nulls - * added; QueryStream transform option - * added; support for authSource driver option - * added; {mongoose,db}.modelNames() - * added; $push w/ $slice,$sort support (MongoDB 2.4) - * added; hashed index type (MongoDB 2.4) - * added; support for mongodb 2.4 geojson (MongoDB 2.4) - * added; value at time of validation error - * added; support for object literal schemas - * added; bufferCommands schema option - * added; allow auth option in connections #1360 [geoah](https://github.com/geoah) - * added; performance improvements to populate() [263ece9](https://github.com/LearnBoost/mongoose/commit/263ece9) - * added; allow adding uncasted docs to populated arrays and properties #570 - * added; doc#populated(path) stores original populated _ids - * added; lean population #1260 - * added; query.populate() now accepts an options object - * added; document#populate(opts, callback) - * added; Model.populate(docs, opts, callback) - * added; support for rich nested path population - * added; doc.array.remove(value) subdoc with _id value support #1278 - * added; optionally allow non-strict sets and updates - * added; promises/A+ comformancy with [mpromise](https://github.com/aheckmann/mpromise) - * added; promise#then - * added; promise#end - * fixed; use of `model` as doc property - * fixed; lean population #1382 - * fixed; empty object mixed defaults #1380 - * fixed; populate w/ deselected _id using string syntax - * fixed; attempted save of divergent populated arrays #1334 related - * fixed; better error msg when attempting toObject as property name - * fixed; non population buffer casting from doc - * fixed; setting populated paths #570 - * fixed; casting when added docs to populated arrays #570 - * fixed; prohibit updating arrays selected with $elemMatch #1334 - * fixed; pull / set subdoc combination #1303 - * fixed; multiple bg index creation #1365 - * fixed; manual reconnection to single mongod - * fixed; Constructor / version exposure #1124 - * fixed; CastError race condition - * fixed; no longer swallowing misuse of subdoc#invalidate() - * fixed; utils.clone retains RegExp opts - * fixed; population of non-schema property - * fixed; allow updating versionKey #1265 - * fixed; add EventEmitter props to reserved paths #1338 - * fixed; can now deselect populated doc _ids #1331 - * fixed; properly pass subtype to Binary in MongooseBuffer - * fixed; casting _id from document with non-ObjectId _id - * fixed; specifying schema type edge case { path: [{type: "String" }] } - * fixed; typo in schemdate #1329 [jplock](https://github.com/jplock) - * updated; driver to 1.2.14 - * updated; muri to 0.3.1 - * updated; mpromise to 0.2.1 - * updated; mocha 1.8.1 - * updated; mpath to 0.1.1 - * deprecated; pluralization will die in 4.x - * refactor; rename private methods to something unusable as doc properties - * refactor MongooseArray#remove - * refactor; move expires index to SchemaDate #1328 - * refactor; internal document properties #1171 #1184 - * tests; added - * docs; indexes - * docs; validation - * docs; populate - * docs; populate - * docs; add note about stream compatibility with node 0.8 - * docs; fix for private names - * docs; Buffer -> mongodb.Binary #1363 - * docs; auth options - * docs; improved - * website; update FAQ - * website; add more api links - * website; add 3.5.x docs to prior releases - * website; Change mongoose-types to an active repo [jackdbernier](https://github.com/jackdbernier) - * website; compat with node 0.10 - * website; add news section - * website; use T for generic type - * benchmark; make adjustable - -3.5.9 / 2013-03-15 -================== - - * updated; driver to 1.2.14 - * added; support for authSource driver option (mongodb 2.4) - * added; QueryStream transform option (node 0.10 helper) - * fixed; backport for saving required populated buffers - * fixed; pull / set subdoc combination #1303 - * fixed; multiple bg index creation #1365 - * test; added for saveable required populated buffers - * test; added for #1365 - * test; add authSource test - -3.6.0rc1 / 2013-03-12 -====================== - - * refactor; rename private methods to something unusable as doc properties - * added; {mongoose,db}.modelNames() - * added; $push w/ $slice,$sort support (MongoDB 2.4) - * added; hashed index type (MongoDB 2.4) - * added; support for mongodb 2.4 geojson (MongoDB 2.4) - * added; value at time of validation error - * added; support for object literal schemas - * added; bufferCommands schema option - * added; allow auth option in connections #1360 [geoah](https://github.com/geoah) - * fixed; lean population #1382 - * fixed; empty object mixed defaults #1380 - * fixed; populate w/ deselected _id using string syntax - * fixed; attempted save of divergent populated arrays #1334 related - * fixed; better error msg when attempting toObject as property name - * fixed; non population buffer casting from doc - * fixed; setting populated paths #570 - * fixed; casting when added docs to populated arrays #570 - * fixed; prohibit updating arrays selected with $elemMatch #1334 - * fixed; pull / set subdoc combination #1303 - * fixed; multiple bg index creation #1365 - * fixed; manual reconnection to single mongod - * fixed; Constructor / version exposure #1124 - * fixed; CastError race condition - * fixed; no longer swallowing misuse of subdoc#invalidate() - * fixed; utils.clone retains RegExp opts - * fixed; population of non-schema property - * fixed; allow updating versionKey #1265 - * fixed; add EventEmitter props to reserved paths #1338 - * fixed; can now deselect populated doc _ids #1331 - * updated; muri to 0.3.1 - * updated; driver to 1.2.12 - * updated; mpromise to 0.2.1 - * deprecated; pluralization will die in 4.x - * docs; Buffer -> mongodb.Binary #1363 - * docs; auth options - * docs; improved - * website; add news section - * benchmark; make adjustable - -3.5.8 / 2013-03-12 -================== - - * added; auth option in connection [geoah](https://github.com/geoah) - * fixed; CastError race condition - * docs; add note about stream compatibility with node 0.8 - 3.5.7 / 2013-02-22 ================== @@ -229,35 +30,6 @@ * docs; README * docs; CONTRIBUTING.md -3.6.0rc0 / 2013-02-03 -====================== - - * changed; cast 'true'/'false' to boolean #1282 [mgrach](https://github.com/mgrach) - * changed; Buffer arrays can now contain nulls - * fixed; properly pass subtype to Binary in MongooseBuffer - * fixed; casting _id from document with non-ObjectId _id - * fixed; specifying schema type edge case { path: [{type: "String" }] } - * fixed; typo in schemdate #1329 [jplock](https://github.com/jplock) - * refactor; move expires index to SchemaDate #1328 - * refactor; internal document properties #1171 #1184 - * added; performance improvements to populate() [263ece9](https://github.com/LearnBoost/mongoose/commit/263ece9) - * added; allow adding uncasted docs to populated arrays and properties #570 - * added; doc#populated(path) stores original populated _ids - * added; lean population #1260 - * added; query.populate() now accepts an options object - * added; document#populate(opts, callback) - * added; Model.populate(docs, opts, callback) - * added; support for rich nested path population - * added; doc.array.remove(value) subdoc with _id value support #1278 - * added; optionally allow non-strict sets and updates - * added; promises/A+ comformancy with [mpromise](https://github.com/aheckmann/mpromise) - * added; promise#then - * added; promise#end - * updated; mocha 1.8.1 - * updated; muri to 0.3.0 - * updated; mpath to 0.1.1 - * updated; docs - 3.5.5 / 2013-01-29 ================== diff --git a/node_modules/mongoose/examples/README.md b/node_modules/mongoose/examples/README.md deleted file mode 100644 index 89728d9..0000000 --- a/node_modules/mongoose/examples/README.md +++ /dev/null @@ -1,42 +0,0 @@ - -This directory contains runnable sample mongoose programs. - -To run: - - - first install [Node.js](http://nodejs.org/) - - from the command line, execute: `node example.js`, replacing "example.js" with the name of a program. - - -Goal is to show: - -- global schemas -- GeoJSON schemas / use (with crs) -- text search -- storing schemas as json -- lean querires -- statics -- methods and statics on subdocs -- custom types -- querybuilder -- promises -- express + mongoose -- accessing driver collection, db -- connecting to replica sets -- connecting to sharded clusters -- enabling a fail fast mode -- on the fly schemas -- storing files -- map reduce -- aggregation -- advanced hooks -- using $elemMatch to return a subset of an array -- query casting -- upserts -- pagination -- express + mongoose session handling -- group by (use aggregation) -- authentication -- schema migration techniques -- converting documents to plain objects (show transforms) -- how to $unset - diff --git a/node_modules/mongoose/examples/doc-methods.js b/node_modules/mongoose/examples/doc-methods.js deleted file mode 100644 index 373a46b..0000000 --- a/node_modules/mongoose/examples/doc-methods.js +++ /dev/null @@ -1,70 +0,0 @@ - -var mongoose = require('mongoose') -var Schema = mongoose.Schema; - -console.log('Running mongoose version %s', mongoose.version); - -/** - * Schema - */ - -var CharacterSchema = Schema({ - name: { type: String, required: true } - , health: { type: Number, min: 0, max: 100 } -}) - -/** - * Methods - */ - -CharacterSchema.methods.attack = function () { - console.log('%s is attacking', this.name); -} - -/** - * Character model - */ - -var Character = mongoose.model('Character', CharacterSchema); - -/** - * Connect to the database on localhost with - * the default port (27017) - */ - -var dbname = 'mongoose-example-doc-methods-' + ((Math.random()*10000)|0); -var uri = 'mongodb://localhost/' + dbname; - -console.log('connecting to %s', uri); - -mongoose.connect(uri, function (err) { - // if we failed to connect, abort - if (err) throw err; - - // we connected ok - example(); -}) - -/** - * Use case - */ - -function example () { - Character.create({ name: 'Link', health: 100 }, function (err, link) { - if (err) return done(err); - console.log('found', link); - link.attack(); // 'Link is attacking' - done(); - }) -} - -/** - * Clean up - */ - -function done (err) { - if (err) console.error(err); - mongoose.connection.db.dropDatabase(function () { - mongoose.disconnect(); - }) -} diff --git a/node_modules/mongoose/examples/population-across-three-collections.js b/node_modules/mongoose/examples/population-across-three-collections.js deleted file mode 100644 index 4bec928..0000000 --- a/node_modules/mongoose/examples/population-across-three-collections.js +++ /dev/null @@ -1,135 +0,0 @@ - -var assert = require('assert') -var mongoose = require('../'); -var Schema = mongoose.Schema; -var ObjectId = mongoose.Types.ObjectId; - -/** - * Connect to the db - */ - -var dbname = 'testing_populateAdInfinitum_' + require('../lib/utils').random() -mongoose.connect('localhost', dbname); -mongoose.connection.on('error', function() { - console.error('connection error', arguments); -}); - -/** - * Schemas - */ - -var user = new Schema({ - name: String, - friends: [{ - type: Schema.ObjectId, - ref: 'User' - }] -}); -var User = mongoose.model('User', user); - -var blogpost = Schema({ - title: String, - tags: [String], - author: { - type: Schema.ObjectId, - ref: 'User' - } -}) -var BlogPost = mongoose.model('BlogPost', blogpost); - -/** - * example - */ - -mongoose.connection.on('open', function() { - - /** - * Generate data - */ - - var userIds = [new ObjectId, new ObjectId, new ObjectId, new ObjectId]; - var users = []; - - users.push({ - _id: userIds[0], - name: 'mary', - friends: [userIds[1], userIds[2], userIds[3]] - }); - users.push({ - _id: userIds[1], - name: 'bob', - friends: [userIds[0], userIds[2], userIds[3]] - }); - users.push({ - _id: userIds[2], - name: 'joe', - friends: [userIds[0], userIds[1], userIds[3]] - }); - users.push({ - _id: userIds[3], - name: 'sally', - friends: [userIds[0], userIds[1], userIds[2]] - }); - - User.create(users, function(err, docs) { - assert.ifError(err); - - var blogposts = []; - blogposts.push({ - title: 'blog 1', - tags: ['fun', 'cool'], - author: userIds[3] - }) - blogposts.push({ - title: 'blog 2', - tags: ['cool'], - author: userIds[1] - }) - blogposts.push({ - title: 'blog 3', - tags: ['fun', 'odd'], - author: userIds[2] - }) - - BlogPost.create(blogposts, function(err, docs) { - assert.ifError(err); - - /** - * Population - */ - - BlogPost - .find({ tags: 'fun' }) - .lean() - .populate('author') - .exec(function(err, docs) { - assert.ifError(err); - - /** - * Populate the populated documents - */ - - var opts = { - path: 'author.friends', - select: 'name', - options: { limit: 2 } - } - - BlogPost.populate(docs, opts, function(err, docs) { - assert.ifError(err); - console.log('populated'); - var s = require('util').inspect(docs, { depth: null }) - console.log(s); - done(); - }) - }) - }) - }) -}); - -function done(err) { - if (err) console.error(err.stack); - mongoose.connection.db.dropDatabase(function() { - mongoose.connection.close(); - }); -} diff --git a/node_modules/mongoose/examples/population-basic.js b/node_modules/mongoose/examples/population-basic.js deleted file mode 100644 index c1d6a70..0000000 --- a/node_modules/mongoose/examples/population-basic.js +++ /dev/null @@ -1,95 +0,0 @@ - -var mongoose = require('mongoose') -var Schema = mongoose.Schema; - -console.log('Running mongoose version %s', mongoose.version); - -/** - * Console schema - */ - -var consoleSchema = Schema({ - name: String - , manufacturer: String - , released: Date -}) -var Console = mongoose.model('Console', consoleSchema); - -/** - * Game schema - */ - -var gameSchema = Schema({ - name: String - , developer: String - , released: Date - , consoles: [{ type: Schema.Types.ObjectId, ref: 'Console' }] -}) -var Game = mongoose.model('Game', gameSchema); - -/** - * Connect to the console database on localhost with - * the default port (27017) - */ - -mongoose.connect('mongodb://localhost/console', function (err) { - // if we failed to connect, abort - if (err) throw err; - - // we connected ok - createData(); -}) - -/** - * Data generation - */ - -function createData () { - Console.create({ - name: 'Nintendo 64' - , manufacturer: 'Nintendo' - , released: 'September 29, 1996' - }, function (err, nintendo64) { - if (err) return done(err); - - Game.create({ - name: 'Legend of Zelda: Ocarina of Time' - , developer: 'Nintendo' - , released: new Date('November 21, 1998') - , consoles: [nintendo64] - }, function (err) { - if (err) return done(err); - example(); - }) - }) -} - -/** - * Population - */ - -function example () { - Game - .findOne({ name: /^Legend of Zelda/ }) - .populate('consoles') - .exec(function (err, ocinara) { - if (err) return done(err); - - console.log( - '"%s" was released for the %s on %s' - , ocinara.name - , ocinara.consoles[0].name - , ocinara.released.toLocaleDateString()); - - done(); - }) -} - -function done (err) { - if (err) console.error(err); - Console.remove(function () { - Game.remove(function () { - mongoose.disconnect(); - }) - }) -} diff --git a/node_modules/mongoose/examples/population-of-existing-doc.js b/node_modules/mongoose/examples/population-of-existing-doc.js deleted file mode 100644 index 6d48fdc..0000000 --- a/node_modules/mongoose/examples/population-of-existing-doc.js +++ /dev/null @@ -1,101 +0,0 @@ - -var mongoose = require('mongoose') -var Schema = mongoose.Schema; - -console.log('Running mongoose version %s', mongoose.version); - -/** - * Console schema - */ - -var consoleSchema = Schema({ - name: String - , manufacturer: String - , released: Date -}) -var Console = mongoose.model('Console', consoleSchema); - -/** - * Game schema - */ - -var gameSchema = Schema({ - name: String - , developer: String - , released: Date - , consoles: [{ type: Schema.Types.ObjectId, ref: 'Console' }] -}) -var Game = mongoose.model('Game', gameSchema); - -/** - * Connect to the console database on localhost with - * the default port (27017) - */ - -mongoose.connect('mongodb://localhost/console', function (err) { - // if we failed to connect, abort - if (err) throw err; - - // we connected ok - createData(); -}) - -/** - * Data generation - */ - -function createData () { - Console.create({ - name: 'Nintendo 64' - , manufacturer: 'Nintendo' - , released: 'September 29, 1996' - }, function (err, nintendo64) { - if (err) return done(err); - - Game.create({ - name: 'Legend of Zelda: Ocarina of Time' - , developer: 'Nintendo' - , released: new Date('November 21, 1998') - , consoles: [nintendo64] - }, function (err) { - if (err) return done(err); - example(); - }) - }) -} - -/** - * Population - */ - -function example () { - Game - .findOne({ name: /^Legend of Zelda/ }) - .exec(function (err, ocinara) { - if (err) return done(err); - - console.log('"%s" console _id: %s', ocinara.name, ocinara.consoles[0]); - - // population of existing document - ocinara.populate('consoles', function (err) { - if (err) return done(err); - - console.log( - '"%s" was released for the %s on %s' - , ocinara.name - , ocinara.consoles[0].name - , ocinara.released.toLocaleDateString()); - - done(); - }) - }) -} - -function done (err) { - if (err) console.error(err); - Console.remove(function () { - Game.remove(function () { - mongoose.disconnect(); - }) - }) -} diff --git a/node_modules/mongoose/examples/population-of-multiple-existing-docs.js b/node_modules/mongoose/examples/population-of-multiple-existing-docs.js deleted file mode 100644 index 6d918ff..0000000 --- a/node_modules/mongoose/examples/population-of-multiple-existing-docs.js +++ /dev/null @@ -1,112 +0,0 @@ - -var mongoose = require('mongoose') -var Schema = mongoose.Schema; - -console.log('Running mongoose version %s', mongoose.version); - -/** - * Console schema - */ - -var consoleSchema = Schema({ - name: String - , manufacturer: String - , released: Date -}) -var Console = mongoose.model('Console', consoleSchema); - -/** - * Game schema - */ - -var gameSchema = Schema({ - name: String - , developer: String - , released: Date - , consoles: [{ type: Schema.Types.ObjectId, ref: 'Console' }] -}) -var Game = mongoose.model('Game', gameSchema); - -/** - * Connect to the console database on localhost with - * the default port (27017) - */ - -mongoose.connect('mongodb://localhost/console', function (err) { - // if we failed to connect, abort - if (err) throw err; - - // we connected ok - createData(); -}) - -/** - * Data generation - */ - -function createData () { - Console.create({ - name: 'Nintendo 64' - , manufacturer: 'Nintendo' - , released: 'September 29, 1996' - }, { - name: 'Super Nintendo' - , manufacturer: 'Nintendo' - , released: 'August 23, 1991' - }, function (err, nintendo64, superNintendo) { - if (err) return done(err); - - Game.create({ - name: 'Legend of Zelda: Ocarina of Time' - , developer: 'Nintendo' - , released: new Date('November 21, 1998') - , consoles: [nintendo64] - }, { - name: 'Mario Kart' - , developer: 'Nintendo' - , released: 'September 1, 1992' - , consoles: [superNintendo] - }, function (err) { - if (err) return done(err); - example(); - }) - }) -} - -/** - * Population - */ - -function example () { - Game - .find({}) - .exec(function (err, games) { - if (err) return done(err); - - console.log('found %d games', games.length); - - var options = { path: 'consoles', select: 'name released -_id' }; - Game.populate(games, options, function (err, games) { - if (err) return done(err); - - games.forEach(function (game) { - console.log( - '"%s" was released for the %s on %s' - , game.name - , game.consoles[0].name - , game.released.toLocaleDateString()); - }) - - done() - }) - }) -} - -function done (err) { - if (err) console.error(err); - Console.remove(function () { - Game.remove(function () { - mongoose.disconnect(); - }) - }) -} diff --git a/node_modules/mongoose/examples/population-options.js b/node_modules/mongoose/examples/population-options.js deleted file mode 100644 index 7387b3b..0000000 --- a/node_modules/mongoose/examples/population-options.js +++ /dev/null @@ -1,124 +0,0 @@ - -var mongoose = require('mongoose') -var Schema = mongoose.Schema; - -console.log('Running mongoose version %s', mongoose.version); - -/** - * Console schema - */ - -var consoleSchema = Schema({ - name: String - , manufacturer: String - , released: Date -}) -var Console = mongoose.model('Console', consoleSchema); - -/** - * Game schema - */ - -var gameSchema = Schema({ - name: String - , developer: String - , released: Date - , consoles: [{ type: Schema.Types.ObjectId, ref: 'Console' }] -}) -var Game = mongoose.model('Game', gameSchema); - -/** - * Connect to the console database on localhost with - * the default port (27017) - */ - -mongoose.connect('mongodb://localhost/console', function (err) { - // if we failed to connect, abort - if (err) throw err; - - // we connected ok - createData(); -}) - -/** - * Data generation - */ - -function createData () { - Console.create({ - name: 'Nintendo 64' - , manufacturer: 'Nintendo' - , released: 'September 29, 1996' - }, { - name: 'Super Nintendo' - , manufacturer: 'Nintendo' - , released: 'August 23, 1991' - }, { - name: 'XBOX 360' - , manufacturer: 'Microsoft' - , released: 'November 22, 2005' - }, function (err, nintendo64, superNintendo, xbox360) { - if (err) return done(err); - - Game.create({ - name: 'Legend of Zelda: Ocarina of Time' - , developer: 'Nintendo' - , released: new Date('November 21, 1998') - , consoles: [nintendo64] - }, { - name: 'Mario Kart' - , developer: 'Nintendo' - , released: 'September 1, 1992' - , consoles: [superNintendo] - }, { - name: 'Perfect Dark Zero' - , developer: 'Rare' - , released: 'November 17, 2005' - , consoles: [xbox360] - }, function (err) { - if (err) return done(err); - example(); - }) - }) -} - -/** - * Population - */ - -function example () { - Game - .find({}) - .populate({ - path: 'consoles' - , match: { manufacturer: 'Nintendo' } - , select: 'name' - , options: { comment: 'population' } - }) - .exec(function (err, games) { - if (err) return done(err); - - games.forEach(function (game) { - console.log( - '"%s" was released for the %s on %s' - , game.name - , game.consoles.length ? game.consoles[0].name : '??' - , game.released.toLocaleDateString()); - }) - - return done(); - }) -} - -/** - * Clean up - */ - -function done (err) { - if (err) console.error(err); - Console.remove(function () { - Game.remove(function () { - mongoose.disconnect(); - }) - }) -} diff --git a/node_modules/mongoose/examples/population-plain-objects.js b/node_modules/mongoose/examples/population-plain-objects.js deleted file mode 100644 index 50fc9fa..0000000 --- a/node_modules/mongoose/examples/population-plain-objects.js +++ /dev/null @@ -1,96 +0,0 @@ - -var mongoose = require('mongoose') -var Schema = mongoose.Schema; - -console.log('Running mongoose version %s', mongoose.version); - -/** - * Console schema - */ - -var consoleSchema = Schema({ - name: String - , manufacturer: String - , released: Date -}) -var Console = mongoose.model('Console', consoleSchema); - -/** - * Game schema - */ - -var gameSchema = Schema({ - name: String - , developer: String - , released: Date - , consoles: [{ type: Schema.Types.ObjectId, ref: 'Console' }] -}) -var Game = mongoose.model('Game', gameSchema); - -/** - * Connect to the console database on localhost with - * the default port (27017) - */ - -mongoose.connect('mongodb://localhost/console', function (err) { - // if we failed to connect, abort - if (err) throw err; - - // we connected ok - createData(); -}) - -/** - * Data generation - */ - -function createData () { - Console.create({ - name: 'Nintendo 64' - , manufacturer: 'Nintendo' - , released: 'September 29, 1996' - }, function (err, nintendo64) { - if (err) return done(err); - - Game.create({ - name: 'Legend of Zelda: Ocarina of Time' - , developer: 'Nintendo' - , released: new Date('November 21, 1998') - , consoles: [nintendo64] - }, function (err) { - if (err) return done(err); - example(); - }) - }) -} - -/** - * Population - */ - -function example () { - Game - .findOne({ name: /^Legend of Zelda/ }) - .populate('consoles') - .lean() // just return plain objects, not documents wrapped by mongoose - .exec(function (err, ocinara) { - if (err) return done(err); - - console.log( - '"%s" was released for the %s on %s' - , ocinara.name - , ocinara.consoles[0].name - , ocinara.released.toLocaleDateString()); - - done(); - }) -} - -function done (err) { - if (err) console.error(err); - Console.remove(function () { - Game.remove(function () { - mongoose.disconnect(); - }) - }) -} diff --git a/node_modules/mongoose/lib/collection.js b/node_modules/mongoose/lib/collection.js index 1c38286..1c2ab7d 100644 --- a/node_modules/mongoose/lib/collection.js +++ b/node_modules/mongoose/lib/collection.js @@ -17,22 +17,13 @@ var STATES = require('./connectionstate') */ function Collection (name, conn, opts) { - if (undefined === opts) opts = {}; - if (undefined === opts.capped) opts.capped = {}; - - opts.bufferCommands = undefined === opts.bufferCommands - ? true - : opts.bufferCommands; - - if ('number' == typeof opts.capped) { - opts.capped = { size: opts.capped }; - } - - this.opts = opts; this.name = name; this.conn = conn; + this.buffer = true; this.queue = []; - this.buffer = this.opts.bufferCommands; + + if ('number' == typeof opts) opts = { size: opts }; + this.opts = opts || {}; if (STATES.connected == this.conn.readyState) { this.onOpen(); @@ -76,9 +67,7 @@ Collection.prototype.onOpen = function () { */ Collection.prototype.onClose = function () { - if (this.opts.bufferCommands) { - this.buffer = true; - } + this.buffer = true; }; /** diff --git a/node_modules/mongoose/lib/connection.js b/node_modules/mongoose/lib/connection.js index ef4595f..7a32990 100644 --- a/node_modules/mongoose/lib/connection.js +++ b/node_modules/mongoose/lib/connection.js @@ -127,7 +127,6 @@ Connection.prototype.db; * replset - passed to the connection ReplSet instance * user - username for authentication * pass - password for authentication - * auth - options for authentication (see http://mongodb.github.com/node-mongodb-native/api-generated/db.html#authenticate) * * ####Notes: * @@ -143,7 +142,6 @@ Connection.prototype.db; * @param {Object} [options] options * @param {Function} [callback] * @see node-mongodb-native https://github.com/mongodb/node-mongodb-native - * @see http://mongodb.github.com/node-mongodb-native/api-generated/db.html#authenticate * @api public */ @@ -248,7 +246,7 @@ Connection.prototype.open = function (host, database, port, options, callback) { }; /** - * Opens the connection to a replica set. + * Connects to a replica set. * * ####Example: * @@ -265,22 +263,14 @@ Connection.prototype.open = function (host, database, port, options, callback) { * replset - passed to the connection ReplSetServer instance * user - username for authentication * pass - password for authentication - * auth - options for authentication (see http://mongodb.github.com/node-mongodb-native/api-generated/db.html#authenticate) * * _Options passed take precedence over options included in connection strings._ * - * ####Notes: - * - * Mongoose forces the db option `forceServerObjectId` false and cannot be overridden. - * Mongoose defaults the server `auto_reconnect` options to true which can be overridden. - * See the node-mongodb-native driver instance for options that it understands. - * * @param {String} uris comma-separated mongodb:// `URI`s * @param {String} [database] database name if not included in `uris` * @param {Object} [options] passed to the internal driver * @param {Function} [callback] * @see node-mongodb-native https://github.com/mongodb/node-mongodb-native - * @see http://mongodb.github.com/node-mongodb-native/api-generated/db.html#authenticate * @api public */ @@ -443,7 +433,7 @@ Connection.prototype.onOpen = function (callback) { // re-authenticate if (self.user && self.pass) { - self.db.authenticate(self.user, self.pass, self.options.auth, open); + self.db.authenticate(self.user, self.pass, open); } else open(); @@ -515,8 +505,6 @@ Connection.prototype.onClose = function () { /** * Retrieves a collection, creating it if not cached. * - * Not typically needed by applications. Just talk to your collection through your model. - * * @param {String} name of the collection * @param {Object} [options] optional collection options * @return {Collection} collection instance @@ -568,10 +556,6 @@ Connection.prototype.model = function (name, schema, collection) { schema = false; } - if (utils.isObject(schema) && !(schema instanceof Schema)) { - schema = new Schema(schema); - } - if (this.models[name] && !collection) { // model exists but we are not subclassing with custom collection if (schema instanceof Schema && schema != this.models[name].schema) { @@ -629,16 +613,6 @@ Connection.prototype.model = function (name, schema, collection) { return this.models[name] = model.__subclass(this, schema, collection); } -/** - * Returns an array of model names created on this connection. - * @api public - * @return {Array} - */ - -Connection.prototype.modelNames = function () { - return Object.keys(this.models); -} - /** * Set profiling level. * diff --git a/node_modules/mongoose/lib/document.js b/node_modules/mongoose/lib/document.js index df88fc0..fef4e63 100644 --- a/node_modules/mongoose/lib/document.js +++ b/node_modules/mongoose/lib/document.js @@ -3,7 +3,6 @@ */ var EventEmitter = require('events').EventEmitter - , setMaxListeners = EventEmitter.prototype.setMaxListeners , MongooseError = require('./error') , MixedSchema = require('./schema/mixed') , Schema = require('./schema') @@ -12,21 +11,20 @@ var EventEmitter = require('events').EventEmitter , clone = utils.clone , isMongooseObject = utils.isMongooseObject , inspect = require('util').inspect - , ElemMatchError = MongooseError.ElemMatchError - , ValidationError = MongooseError.ValidationError - , DocumentError = MongooseError.DocumentError - , InternalCache = require('./internal') + , StateMachine = require('./statemachine') + , ActiveRoster = StateMachine.ctor('require', 'modify', 'init', 'default') + , ValidationError = require('./errors/validation') + , DocumentError = require('./errors/document') , deepEqual = utils.deepEqual , hooks = require('hooks') , DocumentArray , MongooseArray - , Embedded /** * Document constructor. * * @param {Object} obj the values to set - * @param {Object} [opts] optional object containing the fields which were selected in the query returning this document and any populated paths data + * @param {Object} [fields] the fields which were selected in the query returning this document * @param {Boolean} [skipId] bool, should we auto create an ObjectId _id * @inherits NodeJS EventEmitter http://nodejs.org/api/events.html#events_class_events_eventemitter * @event `init`: Emitted on a document after it has was retreived from the db and fully hydrated by Mongoose. @@ -35,34 +33,39 @@ var EventEmitter = require('events').EventEmitter */ function Document (obj, fields, skipId) { - this.$__ = new InternalCache; - this.isNew = true; - this.errors = undefined; - - var schema = this.schema; + this.setMaxListeners(0); if ('boolean' === typeof fields) { - this.$__.strictMode = fields; - fields = undefined; + this._strictMode = fields; + this._selected = fields = undefined; } else { - this.$__.strictMode = schema.options && schema.options.strict; - this.$__.selected = fields; + this._strictMode = this.schema.options && this.schema.options.strict; + this._selected = fields; } - var required = schema.requiredPaths(); + this.isNew = true; + this.errors = undefined; + this._shardval = undefined; + this._saveError = undefined; + this._validationError = undefined; + this._adhocPaths = undefined; + this._removing = undefined; + this._inserting = undefined; + this.__version = undefined; + this.__getters = {}; + this.__id = undefined; + + this._activePaths = new ActiveRoster; + + var required = this.schema.requiredPaths(); for (var i = 0; i < required.length; ++i) { - this.$__.activePaths.require(required[i]); - } - - setMaxListeners.call(this, 0); - this._doc = this.$__buildDoc(obj, fields, skipId); - - if (obj) { - this.set(obj, undefined, true); + this._activePaths.require(required[i]); } - this.$__registerHooks(); -} + this._doc = this._buildDoc(obj, fields, skipId); + if (obj) this.set(obj, undefined, true); + this._registerHooks(); +}; /*! * Inherit from EventEmitter. @@ -121,11 +124,9 @@ Document.prototype.errors; * @param {Boolean} [skipId] * @return {Object} * @api private - * @method $__buildDoc - * @memberOf Document */ -Document.prototype.$__buildDoc = function (obj, fields, skipId) { +Document.prototype._buildDoc = function (obj, fields, skipId) { var doc = {} , self = this , exclude @@ -179,7 +180,7 @@ Document.prototype.$__buildDoc = function (obj, fields, skipId) { def = type.getDefault(self, true); if ('undefined' !== typeof def) { doc_[piece] = def; - self.$__.activePaths.default(p); + self._activePaths.default(p); } } else if (p in fields) { @@ -187,14 +188,14 @@ Document.prototype.$__buildDoc = function (obj, fields, skipId) { def = type.getDefault(self, true); if ('undefined' !== typeof def) { doc_[piece] = def; - self.$__.activePaths.default(p); + self._activePaths.default(p); } } } else { def = type.getDefault(self, true); if ('undefined' !== typeof def) { doc_[piece] = def; - self.$__.activePaths.default(p); + self._activePaths.default(p); } } } else { @@ -216,28 +217,11 @@ Document.prototype.$__buildDoc = function (obj, fields, skipId) { * @api private */ -Document.prototype.init = function (doc, opts, fn) { - // do not prefix this method with $__ since its - // used by public hooks - - if ('function' == typeof opts) { - fn = opts; - opts = null; - } - +Document.prototype.init = function (doc, fn) { this.isNew = false; - // handle docs with populated paths - if (doc._id && opts && opts.populated && opts.populated.length) { - var id = String(doc._id); - for (var i = 0; i < opts.populated.length; ++i) { - var item = opts.populated[i]; - this.populated(item.path, item._docs[id], item); - } - } - init(this, doc, this._doc); - this.$__storeShard(); + this._storeShard(); this.emit('init', this); if (fn) fn(null); @@ -269,14 +253,16 @@ function init (self, obj, doc, prefix) { if (!schema && obj[i] && 'Object' === obj[i].constructor.name) { // assume nested object - if (!doc[i]) doc[i] = {}; + if (!doc[i]) { + doc[i] = {}; + } init(self, obj[i], doc[i], path + '.'); } else { if (obj[i] === null) { doc[i] = null; } else if (obj[i] !== undefined) { if (schema) { - self.$__try(function(){ + self.try(function(){ doc[i] = schema.cast(obj[i], self, true); }); } else { @@ -284,7 +270,7 @@ function init (self, obj, doc, prefix) { } } // mark as hydrated - self.$__.activePaths.init(path); + self._activePaths.init(path); } } }; @@ -297,16 +283,14 @@ function init (self, obj, doc, prefix) { * _Shard key values do not / are not allowed to change._ * * @api private - * @method $__storeShard - * @memberOf Document */ -Document.prototype.$__storeShard = function () { +Document.prototype._storeShard = function _storeShard () { // backwards compat var key = this.schema.options.shardKey || this.schema.options.shardkey; if (!(key && 'Object' == key.constructor.name)) return; - var orig = this.$__.shardval = {} + var orig = this._shardval = {} , paths = Object.keys(key) , len = paths.length , val @@ -353,7 +337,7 @@ for (var k in hooks) { Document.prototype.update = function update () { var args = utils.args(arguments); args.unshift({_id: this._id}); - return this.constructor.update.apply(this.constructor, args); + this.constructor.update.apply(this.constructor, args); } /** @@ -378,9 +362,6 @@ Document.prototype.update = function update () { * // only-the-fly cast to string * doc.set(path, value, String) * - * // changing strict mode behavior - * doc.set(path, value, { strict: false }); - * * @param {String|Object} path path or object of key/vals to set * @param {Any} val the value to set * @param {Schema|String|Number|Buffer|etc..} [type] optionally specify a type for "on-the-fly" attributes @@ -399,12 +380,8 @@ Document.prototype.set = function (path, val, type, options) { , constructing = true === type , adhocs - var strict = options && 'strict' in options - ? options.strict - : this.$__.strictMode; - if (adhoc) { - adhocs = this.$__.adhocPaths || (this.$__.adhocPaths = {}); + adhocs = this._adhocPaths || (this._adhocPaths = {}); adhocs[path] = Schema.interpretAsType(path, type); } @@ -434,12 +411,12 @@ Document.prototype.set = function (path, val, type, options) { if (null != path[key] && 'Object' == path[key].constructor.name && 'virtual' != pathtype - && !(this.$__path(prefix + key) instanceof MixedSchema)) { + && !(this._path(prefix + key) instanceof MixedSchema)) { this.set(path[key], prefix + key, constructing); - } else if (strict) { + } else if (this._strictMode) { if ('real' === pathtype || 'virtual' === pathtype) { this.set(prefix + key, path[key], constructing); - } else if ('throw' == strict) { + } else if ('throw' == this._strictMode) { throw new Error("Field `" + key + "` is not in schema."); } } else if (undefined !== path[key]) { @@ -462,14 +439,14 @@ Document.prototype.set = function (path, val, type, options) { } var schema; - if ('adhocOrUndefined' == pathType && strict) { + if ('adhocOrUndefined' == pathType && this._strictMode) { return this; } else if ('virtual' == pathType) { schema = this.schema.virtualpath(path); schema.applySetters(val, this); return this; } else { - schema = this.$__path(path); + schema = this._path(path); } var parts = path.split('.') @@ -496,7 +473,7 @@ Document.prototype.set = function (path, val, type, options) { } if (!schema || null === val || undefined === val) { - this.$__set(pathToMark, path, constructing, parts, schema, val); + this._set(pathToMark, path, constructing, parts, schema, val); return this; } @@ -508,12 +485,12 @@ Document.prototype.set = function (path, val, type, options) { ? undefined : this.get(path); - var shouldSet = this.$__try(function(){ + var shouldSet = this.try(function(){ val = schema.applySetters(val, self, false, priorVal); }); if (shouldSet) { - this.$__set(pathToMark, path, constructing, parts, schema, val, priorVal); + this._set(pathToMark, path, constructing, parts, schema, val, priorVal); } return this; @@ -524,11 +501,9 @@ Document.prototype.set = function (path, val, type, options) { * * @return {Boolean} * @api private - * @method $__shouldModify - * @memberOf Document */ -Document.prototype.$__shouldModify = function ( +Document.prototype._shouldModify = function ( pathToMark, path, constructing, parts, schema, val, priorVal) { if (this.isNew) return true; @@ -540,7 +515,7 @@ Document.prototype.$__shouldModify = function ( return true; } - if (undefined === val && path in this.$__.activePaths.states.default) { + if (undefined === val && path in this._activePaths.states.default) { // we're just unsetting the default value which was never saved return false; } @@ -551,7 +526,7 @@ Document.prototype.$__shouldModify = function ( if (!constructing && null != val && - path in this.$__.activePaths.states.default && + path in this._activePaths.states.default && deepEqual(val, schema.getDefault(this, constructing))) { // a path with a default was $unset on the server // and the user is setting it to the same value again @@ -565,14 +540,12 @@ Document.prototype.$__shouldModify = function ( * Handles the actual setting of the value and marking the path modified if appropriate. * * @api private - * @method $__set - * @memberOf Document */ -Document.prototype.$__set = function ( +Document.prototype._set = function ( pathToMark, path, constructing, parts, schema, val, priorVal) { - var shouldModify = this.$__shouldModify.apply(this, arguments); + var shouldModify = this._shouldModify.apply(this, arguments); if (shouldModify) { this.markModified(pathToMark, val); @@ -614,7 +587,19 @@ Document.prototype.$__set = function ( */ Document.prototype.getValue = function (path) { - return utils.getValue(path, this._doc); + var parts = path.split('.') + , obj = this._doc + , part; + + for (var i = 0, l = parts.length; i < l; i++) { + part = parts[i]; + obj = obj.getValue + ? obj.getValue(part) // If we have an embedded array document member + : obj[part]; + if (!obj) return obj; + } + + return obj; } /** @@ -626,9 +611,16 @@ Document.prototype.getValue = function (path) { */ Document.prototype.setValue = function (path, val) { - utils.setValue(path, val, this._doc); + var parts = path.split('.') + , obj = this._doc; + + for (var i = 0, len = parts.length-1; i < len; i++) { + obj = obj[parts[i]]; + } + + obj[parts[len]] = val; return this; -} +}; /** * Returns the value of a path. @@ -649,11 +641,11 @@ Document.prototype.setValue = function (path, val) { Document.prototype.get = function (path, type) { var adhocs; if (type) { - adhocs = this.$__.adhocPaths || (this.$__.adhocPaths = {}); + adhocs = this._adhocPaths || (this._adhocPaths = {}); adhocs[path] = Schema.interpretAsType(path, type); } - var schema = this.$__path(path) || this.schema.virtualpath(path) + var schema = this._path(path) || this.schema.virtualpath(path) , pieces = path.split('.') , obj = this._doc; @@ -673,12 +665,10 @@ Document.prototype.get = function (path, type) { * * @param {String} path * @api private - * @method $__path - * @memberOf Document */ -Document.prototype.$__path = function (path) { - var adhocs = this.$__.adhocPaths +Document.prototype._path = function (path) { + var adhocs = this._adhocPaths , adhocType = adhocs && adhocs[path]; if (adhocType) { @@ -704,7 +694,7 @@ Document.prototype.$__path = function (path) { */ Document.prototype.markModified = function (path) { - this.$__.activePaths.modify(path); + this._activePaths.modify(path); } /** @@ -713,17 +703,15 @@ Document.prototype.markModified = function (path) { * @param {Function} fn function to execute * @param {Object} scope the scope with which to call fn * @api private - * @method $__try - * @memberOf Document */ -Document.prototype.$__try = function (fn, scope) { +Document.prototype.try = function (fn, scope) { var res; try { fn.call(scope); res = true; } catch (e) { - this.$__error(e); + this._error(e); res = false; } return res; @@ -737,7 +725,7 @@ Document.prototype.$__try = function (fn, scope) { */ Document.prototype.modifiedPaths = function () { - var directModifiedPaths = Object.keys(this.$__.activePaths.states.modify); + var directModifiedPaths = Object.keys(this._activePaths.states.modify); return directModifiedPaths.reduce(function (list, path) { var parts = path.split('.'); @@ -768,7 +756,7 @@ Document.prototype.modifiedPaths = function () { Document.prototype.isModified = function (path) { return path ? !!~this.modifiedPaths().indexOf(path) - : this.$__.activePaths.some('modify'); + : this._activePaths.some('modify'); }; /** @@ -786,7 +774,7 @@ Document.prototype.isModified = function (path) { */ Document.prototype.isDirectModified = function (path) { - return (path in this.$__.activePaths.states.modify); + return (path in this._activePaths.states.modify); }; /** @@ -798,7 +786,7 @@ Document.prototype.isDirectModified = function (path) { */ Document.prototype.isInit = function (path) { - return (path in this.$__.activePaths.states.init); + return (path in this._activePaths.states.init); }; /** @@ -817,30 +805,30 @@ Document.prototype.isInit = function (path) { */ Document.prototype.isSelected = function isSelected (path) { - if (this.$__.selected) { + if (this._selected) { if ('_id' === path) { - return 0 !== this.$__.selected._id; + return 0 !== this._selected._id; } - var paths = Object.keys(this.$__.selected) + var paths = Object.keys(this._selected) , i = paths.length , inclusive = false , cur if (1 === i && '_id' === paths[0]) { // only _id was selected. - return 0 === this.$__.selected._id; + return 0 === this._selected._id; } while (i--) { cur = paths[i]; if ('_id' == cur) continue; - inclusive = !! this.$__.selected[cur]; + inclusive = !! this._selected[cur]; break; } - if (path in this.$__.selected) { + if (path in this._selected) { return inclusive; } @@ -888,14 +876,14 @@ Document.prototype.validate = function (cb) { var self = this // only validate required fields when necessary - var paths = Object.keys(this.$__.activePaths.states.require).filter(function (path) { + var paths = Object.keys(this._activePaths.states.require).filter(function (path) { if (!self.isSelected(path) && !self.isModified(path)) return false; return true; }); - paths = paths.concat(Object.keys(this.$__.activePaths.states.init)); - paths = paths.concat(Object.keys(this.$__.activePaths.states.modify)); - paths = paths.concat(Object.keys(this.$__.activePaths.states.default)); + paths = paths.concat(Object.keys(this._activePaths.states.init)); + paths = paths.concat(Object.keys(this._activePaths.states.modify)); + paths = paths.concat(Object.keys(this._activePaths.states.default)); if (0 === paths.length) { complete(); @@ -918,24 +906,16 @@ Document.prototype.validate = function (cb) { var p = self.schema.path(path); if (!p) return --total || complete(); - var val = self.getValue(path); - p.doValidate(val, function (err) { - if (err) { - self.invalidate( - path - , err - , undefined - , true // embedded docs - ); - } + p.doValidate(self.getValue(path), function (err) { + if (err) self.invalidate(path, err, true); --total || complete(); }, self); }); } function complete () { - var err = self.$__.validationError; - self.$__.validationError = undefined; + var err = self._validationError; + self._validationError = undefined; self.emit('validate', self); cb(err); } @@ -946,25 +926,19 @@ Document.prototype.validate = function (cb) { * * @param {String} path the field to invalidate * @param {String|Error} err the error which states the reason `path` was invalid - * @param {Object|String|Number|any} value optional invalid value * @api public */ -Document.prototype.invalidate = function (path, err, val) { - if (!this.$__.validationError) { - this.$__.validationError = new ValidationError(this); +Document.prototype.invalidate = function (path, err) { + if (!this._validationError) { + this._validationError = new ValidationError(this); } if (!err || 'string' === typeof err) { - // sniffing arguments: - // need to handle case where user does not pass value - // so our error message is cleaner - err = 2 < arguments.length - ? new ValidatorError(path, err, val) - : new ValidatorError(path, err) + err = new ValidatorError(path, err); } - this.$__.validationError.errors[path] = err; + this._validationError.errors[path] = err; } /** @@ -972,15 +946,13 @@ Document.prototype.invalidate = function (path, err, val) { * * @api private * @return {Document} - * @method $__reset - * @memberOf Document */ -Document.prototype.$__reset = function reset () { +Document.prototype._reset = function reset () { var self = this; DocumentArray || (DocumentArray = require('./types/documentarray')); - this.$__.activePaths + this._activePaths .map('init', 'modify', function (i) { return self.getValue(i); }) @@ -992,12 +964,12 @@ Document.prototype.$__reset = function reset () { while (i--) { var doc = array[i]; if (!doc) continue; - doc.$__reset(); + doc._reset(); } }); // clear atomics - this.$__dirty().forEach(function (dirt) { + this._dirty().forEach(function (dirt) { var type = dirt.value; if (type && type._atomics) { type._atomics = {}; @@ -1005,12 +977,12 @@ Document.prototype.$__reset = function reset () { }); // Clear 'modify'('dirty') cache - this.$__.activePaths.clear('modify'); - this.$__.validationError = undefined; + this._activePaths.clear('modify'); + this._validationError = undefined; this.errors = undefined; var self = this; this.schema.requiredPaths().forEach(function (path) { - self.$__.activePaths.require(path); + self._activePaths.require(path); }); return this; @@ -1020,17 +992,15 @@ Document.prototype.$__reset = function reset () { * Returns this documents dirty paths / vals. * * @api private - * @method $__dirty - * @memberOf Document */ -Document.prototype.$__dirty = function () { +Document.prototype._dirty = function _dirty () { var self = this; - var all = this.$__.activePaths.map('modify', function (path) { + var all = this._activePaths.map('modify', function (path) { return { path: path , value: self.getValue(path) - , schema: self.$__path(path) }; + , schema: self._path(path) }; }); // Sort dirty paths in a flat hierarchy. @@ -1049,8 +1019,10 @@ Document.prototype.$__dirty = function () { minimal.push(item); top = item; } else { + if (!(item.value && top.value)) return; + // special case for top level MongooseArrays - if (top.value && top.value._atomics && top.value.hasAtomics()) { + if (top.value._atomics && top.value.hasAtomics()) { // the `top` array itself and a sub path of `top` are being modified. // the only way to honor all of both modifications is through a $set // of entire array. @@ -1103,14 +1075,14 @@ function define (prop, subprops, prototype, prefix, keys) { Object.defineProperty(prototype, prop, { enumerable: true , get: function () { - if (!this.$__.getters) - this.$__.getters = {}; + if (!this.__getters) + this.__getters = {}; - if (!this.$__.getters[path]) { + if (!this.__getters[path]) { var nested = Object.create(this); // save scope for nested getters/setters - if (!prefix) nested.$__.scope = this; + if (!prefix) nested._scope = this; // shadow inherited getters from sub-objects so // thing.nested.nested.nested... doesn't occur (gh-366) @@ -1132,14 +1104,14 @@ function define (prop, subprops, prototype, prefix, keys) { }; compile(subprops, nested, path); - this.$__.getters[path] = nested; + this.__getters[path] = nested; } - return this.$__.getters[path]; + return this.__getters[path]; } , set: function (v) { if (v instanceof Document) v = v.toObject(); - return (this.$__.scope || this).set(path, v); + return this.set(path, v); } }); @@ -1147,8 +1119,8 @@ function define (prop, subprops, prototype, prefix, keys) { Object.defineProperty(prototype, prop, { enumerable: true - , get: function ( ) { return this.get.call(this.$__.scope || this, path); } - , set: function (v) { return this.set.call(this.$__.scope || this, path, v); } + , get: function ( ) { return this.get.call(this._scope || this, path); } + , set: function (v) { return this.set.call(this._scope || this, path, v); } }); } }; @@ -1158,11 +1130,9 @@ function define (prop, subprops, prototype, prefix, keys) { * * @param {Schema} schema * @api private - * @method $__setSchema - * @memberOf Document */ -Document.prototype.$__setSchema = function (schema) { +Document.prototype._setSchema = function (schema) { compile(schema.tree, this); this.schema = schema; } @@ -1171,17 +1141,14 @@ Document.prototype.$__setSchema = function (schema) { * Register default hooks * * @api private - * @method $__registerHooks - * @memberOf Document */ -Document.prototype.$__registerHooks = function () { +Document.prototype._registerHooks = function _registerHooks () { if (!this.save) return; DocumentArray || (DocumentArray = require('./types/documentarray')); this.pre('save', function (next) { - // validate all document arrays. // we keep the error semaphore to make sure we don't // call `save` unnecessarily (we only need 1 error) var subdocs = 0 @@ -1189,7 +1156,7 @@ Document.prototype.$__registerHooks = function () { , self = this; // check for DocumentArrays - var arrays = this.$__.activePaths + var arrays = this._activePaths .map('init', 'modify', function (i) { return self.getValue(i); }) @@ -1226,7 +1193,7 @@ Document.prototype.$__registerHooks = function () { if (error) return; if (err) { - self.$__.validationError = undefined; + self._validationError = undefined; return next(error = err); } @@ -1248,10 +1215,9 @@ Document.prototype.$__registerHooks = function () { } }).pre('save', function checkForExistingErrors (next) { // if any doc.set() calls failed - var err = this.$__.saveError; - if (err) { - this.$__.saveError = null; - next(err); + if (this._saveError) { + next(this._saveError); + this._saveError = null; } else { next(); } @@ -1260,7 +1226,7 @@ Document.prototype.$__registerHooks = function () { }); // add user defined queues - this.$__doQueue(); + this._doQueue(); }; /** @@ -1268,12 +1234,10 @@ Document.prototype.$__registerHooks = function () { * * @param {Error} err * @api private - * @method $__error - * @memberOf Document */ -Document.prototype.$__error = function (err) { - this.$__.saveError = err; +Document.prototype._error = function (err) { + this._saveError = err; return this; }; @@ -1281,11 +1245,9 @@ Document.prototype.$__error = function (err) { * Executes methods queued from the Schema definition * * @api private - * @method $__doQueue - * @memberOf Document */ -Document.prototype.$__doQueue = function () { +Document.prototype._doQueue = function () { var q = this.schema && this.schema.callQueue; if (q) { for (var i = 0, l = q.length; i < l; i++) { @@ -1296,9 +1258,7 @@ Document.prototype.$__doQueue = function () { }; /** - * Converts this document into a plain javascript object, ready for storage in MongoDB. - * - * Buffers are converted to instances of [mongodb.Binary](http://mongodb.github.com/node-mongodb-native/api-bson-generated/binary.html) for proper storage. + * Converts this document into a plain javascript object * * ####Options: * @@ -1402,19 +1362,10 @@ Document.prototype.$__doQueue = function () { * * @param {Object} [options] * @return {Object} js object - * @see mongodb.Binary http://mongodb.github.com/node-mongodb-native/api-bson-generated/binary.html * @api public */ Document.prototype.toObject = function (options) { - if (options && options.convertToId) { - // populated paths that we set to a document? - Embedded || (Embedded = require('./types/embedded')); - if (!(this instanceof Embedded)) { - return clone(this._id, options); - } - } - // When internally saving this document we always pass options, // bypassing the custom schema options. if (!(options && 'Object' == options.constructor.name)) { @@ -1557,129 +1508,7 @@ Document.prototype.equals = function (doc) { return tid.equals ? tid.equals(docid) : tid === docid; -} - -/** - * Populates document references, executing the `callback` when complete. - * - * ####Example: - * - * doc - * .populate('company') - * .populate({ - * path: 'notes', - * match: /airline/, - * select: 'text', - * match: 'modelName' - * options: opts - * }, function (err, user) { - * assert(doc._id == user._id) // the document itself is passed - * }) - * - * // summary - * doc.populate(path) // not executed - * doc.populate(options); // not executed - * doc.populate(path, callback) // executed - * doc.populate(options, callback); // executed - * doc.populate(callback); // executed - * - * - * ####NOTE: - * - * Population does not occur unless a `callback` is passed. - * Passing the same path a second time will overwrite the previous path options. - * See [Model.populate()](#model_Model.populate) for explaination of options. - * - * @see Model.populate #model_Model.populate - * @param {String|Object} [path] The path to populate or an options object - * @param {Function} [callback] When passed, population is invoked - * @api public - * @return {Document} this - */ - -Document.prototype.populate = function populate () { - if (0 === arguments.length) return this; - - var pop = this.$__.populate || (this.$__.populate = {}); - var args = utils.args(arguments); - var fn; - - if ('function' == typeof args[args.length-1]) { - fn = args.pop(); - } - - // allow `doc.populate(callback)` - if (args.length) { - // use hash to remove duplicate paths - var res = utils.populate.apply(null, args); - for (var i = 0; i < res.length; ++i) { - pop[res[i].path] = res[i]; - } - } - - if (fn) { - var paths = utils.object.vals(pop); - this.$__.populate = undefined; - this.constructor.populate(this, paths, fn); - } - - return this; -} - - -/** - * Gets _id(s) used during population of the given `path`. - * - * ####Example: - * - * Model.findOne().populate('author').exec(function (err, doc) { - * console.log(doc.author.name) // Dr.Seuss - * console.log(doc.populated('author')) // '5144cf8050f071d979c118a7' - * }) - * - * If the path was not populated, undefined is returned. - * - * @param {String} path - * @return {Array|ObjectId|Number|Buffer|String|undefined} - * @api public - */ - -Document.prototype.populated = function (path, val, options) { - // val and options are internal - - if (null == val) { - if (!this.$__.populated) return undefined; - var v = this.$__.populated[path]; - if (v) return v.value; - return undefined; - } - - // internal - - if (true === val) { - if (!this.$__.populated) return undefined; - return this.$__.populated[path]; - } - - this.$__.populated || (this.$__.populated = {}); - this.$__.populated[path] = { value: val, options: options }; - return val; -} - -/** - * Returns the full path to this document. - * - * @param {String} [path] - * @return {String} - * @api private - * @method $__fullPath - * @memberOf Document - */ - -Document.prototype.$__fullPath = function (path) { - // overridden in SubDocuments - return path || ''; -} +}; /*! * Module exports. diff --git a/node_modules/mongoose/lib/drivers/SPEC.md b/node_modules/mongoose/lib/drivers/SPEC.md deleted file mode 100644 index 6464693..0000000 --- a/node_modules/mongoose/lib/drivers/SPEC.md +++ /dev/null @@ -1,4 +0,0 @@ - -# Driver Spec - -TODO diff --git a/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js b/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js index da0f6e7..a53857f 100644 --- a/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js +++ b/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js @@ -37,10 +37,11 @@ NativeCollection.prototype.__proto__ = MongooseCollection.prototype; NativeCollection.prototype.onOpen = function () { var self = this; - // always get a new collection in case the user changed host:port - // of parent db instance when re-opening the connection. + if (this.collection) { + return MongooseCollection.prototype.onOpen.call(self); + } - if (!self.opts.capped.size) { + if (!self.opts.size) { // non-capped return self.conn.db.collection(self.name, callback); } @@ -66,7 +67,7 @@ NativeCollection.prototype.onOpen = function () { } } else { // create - var opts = utils.clone(self.opts.capped); + var opts = utils.clone(self.opts); opts.capped = true; self.conn.db.createCollection(self.name, opts, callback); } diff --git a/node_modules/mongoose/lib/drivers/node-mongodb-native/connection.js b/node_modules/mongoose/lib/drivers/node-mongodb-native/connection.js index fb894fc..aa46ff1 100644 --- a/node_modules/mongoose/lib/drivers/node-mongodb-native/connection.js +++ b/node_modules/mongoose/lib/drivers/node-mongodb-native/connection.js @@ -45,13 +45,14 @@ NativeConnection.prototype.doOpen = function (fn) { var self = this; this.db.open(function (err) { if (err) return fn(err); - listen(self); fn(); + listen(self); }); return this; }; + /*! * Register listeners for important events and bubble appropriately. */ @@ -169,7 +170,6 @@ NativeConnection.prototype.doClose = function (fn) { NativeConnection.prototype.parseOptions = function (passed, connStrOpts) { var o = passed || {}; o.db || (o.db = {}); - o.auth || (o.auth = {}); o.server || (o.server = {}); o.replset || (o.replset = {}); o.server.socketOptions || (o.server.socketOptions = {}); @@ -200,16 +200,6 @@ NativeConnection.prototype.parseOptions = function (passed, connStrOpts) { o.server.socketOptions[name] = o.replset.socketOptions[name] = opts[name]; } break; - case 'authdb': - if ('undefined' == typeof o.auth.authdb) { - o.auth.authdb = opts[name]; - } - break; - case 'authSource': - if ('undefined' == typeof o.auth.authSource) { - o.auth.authSource = opts[name]; - } - break; case 'retries': case 'reconnectWait': case 'rs_name': diff --git a/node_modules/mongoose/lib/error.js b/node_modules/mongoose/lib/error.js index 6d00f80..9216cd9 100644 --- a/node_modules/mongoose/lib/error.js +++ b/node_modules/mongoose/lib/error.js @@ -1,8 +1,8 @@ /** - * MongooseError constructor + * Mongoose error * - * @param {String} msg Error message + * @api private * @inherits Error https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error */ @@ -36,4 +36,3 @@ MongooseError.ValidatorError = require('./errors/validator') MongooseError.VersionError =require('./errors/version') MongooseError.OverwriteModelError = require('./errors/overwriteModel') MongooseError.MissingSchemaError = require('./errors/missingSchema') -MongooseError.DivergentArrayError = require('./errors/divergentArray') diff --git a/node_modules/mongoose/lib/errors/divergentArray.js b/node_modules/mongoose/lib/errors/divergentArray.js deleted file mode 100644 index 45809bc..0000000 --- a/node_modules/mongoose/lib/errors/divergentArray.js +++ /dev/null @@ -1,40 +0,0 @@ - -/*! - * Module dependencies. - */ - -var MongooseError = require('../error'); - -/*! - * DivergentArrayError constructor. - * - * @inherits MongooseError - */ - -function DivergentArrayError (paths) { - var msg = 'For your own good, using `document.save()` to update an array ' - + 'which was selected using an $elemMatch projection OR ' - + 'populated using skip, limit, query conditions, or exclusion of ' - + 'the _id field when the operation results in a $pop or $set of ' - + 'the entire array is not supported. The following ' - + 'path(s) would have been modified unsafely:\n' - + ' ' + paths.join('\n ') + '\n' - + 'Use Model.update() to update these arrays instead.' - // TODO write up a docs page (FAQ) and link to it - - MongooseError.call(this, msg); - Error.captureStackTrace(this, arguments.callee); - this.name = 'DivergentArrayError'; -}; - -/*! - * Inherits from MongooseError. - */ - -DivergentArrayError.prototype.__proto__ = MongooseError.prototype; - -/*! - * exports - */ - -module.exports = DivergentArrayError; diff --git a/node_modules/mongoose/lib/errors/validation.js b/node_modules/mongoose/lib/errors/validation.js index 1679849..08f2aaa 100644 --- a/node_modules/mongoose/lib/errors/validation.js +++ b/node_modules/mongoose/lib/errors/validation.js @@ -25,15 +25,9 @@ function ValidationError (instance) { */ ValidationError.prototype.toString = function () { - var ret = this.name + ': '; - var msgs = []; - - Object.keys(this.errors).forEach(function (key) { - if (this == this.errors[key]) return; - msgs.push(String(this.errors[key])); - }, this) - - return ret + msgs.join(', '); + return this.name + ': ' + Object.keys(this.errors).map(function (key) { + return String(this.errors[key]); + }, this).join(', '); }; /*! diff --git a/node_modules/mongoose/lib/errors/validator.js b/node_modules/mongoose/lib/errors/validator.js index 2498b05..5499bee 100644 --- a/node_modules/mongoose/lib/errors/validator.js +++ b/node_modules/mongoose/lib/errors/validator.js @@ -9,25 +9,19 @@ var MongooseError = require('../error'); * * @param {String} path * @param {String} msg - * @param {String|Number|any} val * @inherits MongooseError * @api private */ -function ValidatorError (path, type, val) { +function ValidatorError (path, type) { var msg = type ? '"' + type + '" ' : ''; - - var message = 'Validator ' + msg + 'failed for path ' + path - if (2 < arguments.length) message += ' with value `' + String(val) + '`'; - - MongooseError.call(this, message); + MongooseError.call(this, 'Validator ' + msg + 'failed for path ' + path); Error.captureStackTrace(this, arguments.callee); this.name = 'ValidatorError'; this.path = path; this.type = type; - this.value = val; }; /*! diff --git a/node_modules/mongoose/lib/index.js b/node_modules/mongoose/lib/index.js index ca4cfa0..b0c0ed3 100644 --- a/node_modules/mongoose/lib/index.js +++ b/node_modules/mongoose/lib/index.js @@ -42,8 +42,6 @@ function Mongoose () { * * mongoose.set('test', value) // sets the 'test' option to `value` * - * mongoose.set('debug', true) // enable logging collection methods + arguments to the console - * * @param {String} key * @param {String} value * @api public @@ -229,15 +227,11 @@ Mongoose.prototype.disconnect = function (fn) { */ Mongoose.prototype.model = function (name, schema, collection, skipInit) { - if ('string' == typeof schema) { + if (!(schema instanceof Schema)) { collection = schema; schema = false; } - if (utils.isObject(schema) && !(schema instanceof Schema)) { - schema = new Schema(schema); - } - if ('boolean' === typeof collection) { skipInit = collection; collection = null; @@ -316,22 +310,6 @@ Mongoose.prototype.model = function (name, schema, collection, skipInit) { return this.models[name] = model; } -/** - * Returns an array of model names created on this instance of Mongoose. - * - * ####Note: - * - * _Does not include names of models created using `connection.model()`._ - * - * @api public - * @return {Array} - */ - -Mongoose.prototype.modelNames = function () { - var names = Object.keys(this.models); - return names; -} - /** * Applies global plugins to `schema`. * @@ -400,32 +378,40 @@ var Connection = require(driver + '/connection'); var Collection = require(driver + '/collection'); +/** + * The exports object is an instance of Mongoose. + * + * @api public + */ + +module.exports = exports = new Mongoose; +var mongoose = module.exports; + /** * The Mongoose Collection constructor * - * @method Collection * @api public */ -Mongoose.prototype.Collection = Collection; +mongoose.Collection = Collection; /** - * The Mongoose [Connection](#connection_Connection) constructor + * The Mongoose Connection constructor * - * @method Connection * @api public */ -Mongoose.prototype.Connection = Connection; +mongoose.Connection = Connection; /** - * The Mongoose version + * Mongoose version * - * @property version * @api public */ -Mongoose.prototype.version = require(__dirname + '/../package.json').version; +mongoose.version = JSON.parse( + require('fs').readFileSync(__dirname + '/../package.json', 'utf8') +).version; /** * The Mongoose constructor @@ -437,14 +423,13 @@ Mongoose.prototype.version = require(__dirname + '/../package.json').version; * var mongoose = require('mongoose'); * var mongoose2 = new mongoose.Mongoose(); * - * @method Mongoose * @api public */ -Mongoose.prototype.Mongoose = Mongoose; +mongoose.Mongoose = Mongoose; /** - * The Mongoose [Schema](#schema_Schema) constructor + * The Mongoose Schema constructor * * ####Example: * @@ -452,20 +437,18 @@ Mongoose.prototype.Mongoose = Mongoose; * var Schema = mongoose.Schema; * var CatSchema = new Schema(..); * - * @method Schema * @api public */ -Mongoose.prototype.Schema = Schema; +mongoose.Schema = Schema; /** - * The Mongoose [SchemaType](#schematype_SchemaType) constructor + * The Mongoose SchemaType constructor. * - * @method SchemaType * @api public */ -Mongoose.prototype.SchemaType = SchemaType; +mongoose.SchemaType = SchemaType; /** * The various Mongoose SchemaTypes. @@ -474,21 +457,19 @@ Mongoose.prototype.SchemaType = SchemaType; * * _Alias of mongoose.Schema.Types for backwards compatibility._ * - * @property SchemaTypes * @see Schema.SchemaTypes #schema_Schema.Types * @api public */ -Mongoose.prototype.SchemaTypes = Schema.Types; +mongoose.SchemaTypes = Schema.Types; /** - * The Mongoose [VirtualType](#virtualtype_VirtualType) constructor + * The Mongoose VirtualType constructor. * - * @method VirtualType * @api public */ -Mongoose.prototype.VirtualType = VirtualType; +mongoose.VirtualType = VirtualType; /** * The various Mongoose Types. @@ -500,81 +481,67 @@ Mongoose.prototype.VirtualType = VirtualType; * * ####Types: * - * - [ObjectId](#types-objectid-js) - * - [Buffer](#types-buffer-js) - * - [SubDocument](#types-embedded-js) - * - [Array](#types-array-js) - * - [DocumentArray](#types-documentarray-js) + * - Array + * - Buffer + * - Document + * - Embedded + * - DocumentArray + * - ObjectId * * Using this exposed access to the `ObjectId` type, we can construct ids on demand. * * var ObjectId = mongoose.Types.ObjectId; * var id1 = new ObjectId; * - * @property Types * @api public */ -Mongoose.prototype.Types = Types; +mongoose.Types = Types; /** - * The Mongoose [Query](#query_Query) constructor. + * The Mongoose Query constructor. * - * @method Query * @api public */ -Mongoose.prototype.Query = Query; +mongoose.Query = Query; /** - * The Mongoose [Promise](#promise_Promise) constructor. + * The Mongoose Promise constructor. * - * @method Promise * @api public */ -Mongoose.prototype.Promise = Promise; +mongoose.Promise = Promise; /** - * The Mongoose [Model](#model_Model) constructor. + * The Mongoose Model constructor. * - * @method Model * @api public */ -Mongoose.prototype.Model = Model; +mongoose.Model = Model; /** - * The Mongoose [Document](#document-js) constructor. + * The Mongoose Document constructor. * - * @method Document * @api public */ -Mongoose.prototype.Document = Document; +mongoose.Document = Document; /** - * The [MongooseError](#error_MongooseError) constructor. + * The MongooseError constructor. * - * @method Error * @api public */ -Mongoose.prototype.Error = require('./error'); +mongoose.Error = require('./error'); /** - * The [node-mongodb-native](https://github.com/mongodb/node-mongodb-native) driver Mongoose uses. - * - * @property mongo - * @api public - */ - -Mongoose.prototype.mongo = require('mongodb'); - -/*! - * The exports object is an instance of Mongoose. + * The node-mongodb-native driver Mongoose uses. * * @api public */ -var mongoose = module.exports = exports = new Mongoose; +mongoose.mongo = require('mongodb'); diff --git a/node_modules/mongoose/lib/internal.js b/node_modules/mongoose/lib/internal.js deleted file mode 100644 index 6b33fb9..0000000 --- a/node_modules/mongoose/lib/internal.js +++ /dev/null @@ -1,30 +0,0 @@ -/*! - * Dependencies - */ - -var StateMachine = require('./statemachine') -var ActiveRoster = StateMachine.ctor('require', 'modify', 'init', 'default') - -module.exports = exports = InternalCache; - -function InternalCache () { - this.strictMode = undefined; - this.selected = undefined; - this.shardval = undefined; - this.saveError = undefined; - this.validationError = undefined; - this.adhocPaths = undefined; - this.removing = undefined; - this.inserting = undefined; - this.version = undefined; - this.getters = {}; - this._id = undefined; - this.populate = undefined; - this.populated = undefined; - this.scope = undefined; - this.activePaths = new ActiveRoster; - - // embedded docs - this.ownerDocument = undefined; - this.fullPath = undefined; -} diff --git a/node_modules/mongoose/lib/model.js b/node_modules/mongoose/lib/model.js index 2b60ac9..e84a65d 100644 --- a/node_modules/mongoose/lib/model.js +++ b/node_modules/mongoose/lib/model.js @@ -6,18 +6,14 @@ var Document = require('./document') , MongooseArray = require('./types/array') , MongooseBuffer = require('./types/buffer') , MongooseError = require('./error') - , VersionError = MongooseError.VersionError - , DivergentArrayError = MongooseError.DivergentArrayError + , VersionError = require('./errors/version') , Query = require('./query') , Schema = require('./schema') - , Types = require('./schema/index') , utils = require('./utils') - , hasOwnProperty = utils.object.hasOwnProperty , isMongooseObject = utils.isMongooseObject , EventEmitter = require('events').EventEmitter , merge = utils.merge , Promise = require('./promise') - , assert = require('assert') , tick = utils.tick var VERSION_WHERE = 1 @@ -74,6 +70,217 @@ Model.prototype.collection; Model.prototype.modelName; +/** + * Returns what paths can be populated + * + * @param {Query} query object + * @return {Object|undefined} population paths + * @api private + */ + +Model.prototype._getPopulationKeys = function getPopulationKeys (query) { + if (!(query && query.options.populate)) return; + + var names = Object.keys(query.options.populate) + , n = names.length + , name + , paths = {} + , hasKeys + , schema + + while (n--) { + name = names[n]; + schema = this.schema.path(name); + hasKeys = true; + + if (!schema) { + // if the path is not recognized, it's potentially embedded docs + // walk path atoms from right to left to find a matching path + var pieces = name.split('.') + , i = pieces.length; + + while (i--) { + var path = pieces.slice(0, i).join('.') + , pathSchema = this.schema.path(path); + + // loop until we find an array schema + if (pathSchema && pathSchema.caster) { + if (!paths[path]) { + paths[path] = { sub: {} }; + } + + paths[path].sub[pieces.slice(i).join('.')] = query.options.populate[name]; + hasKeys || (hasKeys = true); + break; + } + } + } else { + paths[name] = query.options.populate[name]; + hasKeys || (hasKeys = true); + } + } + + return hasKeys && paths; +}; + +/** + * Populates an object + * + * @param {SchemaType} schema type for the oid + * @param {Object} oid object id or array of object ids + * @param {Object} query object specifying query conditions, fields, and options + * @param {Function} fn + * @api private + */ + +Model.prototype._populate = function populate (schema, oid, query, fn) { + if (!Array.isArray(oid)) { + var conditions = query.conditions || {}; + conditions._id = oid; + + return this + .db.model(query.model || schema.options.ref) + .findOne(conditions, query.fields, query.options, fn); + } + + if (!oid.length) { + return fn(null, oid); + } + + var model = this.db.model(query.model || schema.caster.options.ref) + , conditions = query && query.conditions || {}; + + conditions._id || (conditions._id = { $in: oid }); + + model.find(conditions, query.fields, query.options, function (err, docs) { + if (err) return fn(err); + + // user specified sort order? + if (query.options && query.options.sort) { + return fn(null, docs); + } + + // put back in original id order (using a hash reduces complexity from n*n to 2n) + var docHash = {}; + docs.forEach(function (doc) { + docHash[doc._id] = doc; + }); + + var arr = []; + oid.forEach(function (id) { + if (id in docHash) arr.push(docHash[id]); + }); + + fn(null, arr); + }); +}; + +/** + * Performs auto-population of relations. + * + * @param {Object} doc document returned by mongo + * @param {Query} query query that originated the initialization + * @param {Function} fn + * @api private + */ + +Model.prototype.init = function init (doc, query, fn) { + if ('function' == typeof query) { + fn = query; + query = null; + } + + var populate = this._getPopulationKeys(query); + + if (!populate) { + return Document.prototype.init.call(this, doc, fn); + } + + // population from other models is necessary + var self = this; + + init(doc, '', function (err) { + if (err) return fn(err); + Document.prototype.init.call(self, doc, fn); + }); + + return this; + + function init (obj, prefix, fn) { + prefix = prefix || ''; + + var keys = Object.keys(obj) + , len = keys.length; + + return next(); + + function next () { + if (--len < 0) return fn(); + + var i = keys[len] + , path = prefix + i + , schema = self.schema.path(path) + , total = 0 + , inline = false + , poppath + + if (!schema && obj[i] && 'Object' === obj[i].constructor.name) { + // assume nested object + return init(obj[i], path + '.', next); + } + + if (!(obj[i] && schema && populate[path])) return next(); + + // this query object is re-used and passed around. we clone + // it to prevent query condition contamination between + // one populate call to the next. + poppath = utils.clone(populate[path]); + + if (poppath.sub) { + obj[i].forEach(function (subobj) { + inline = true; + + var pkeys = Object.keys(poppath.sub) + , pi = pkeys.length + , key + + while (pi--) { + key = pkeys[pi]; + + if (subobj[key]) (function (key) { + total++; + self._populate(schema.schema.path(key), subobj[key], poppath.sub[key], done); + function done (err, doc) { + if (err) return error(err); + subobj[key] = doc; + if (--total < 1 && !inline) { + next(); + } + } + })(key); + } + }); + + inline = false; + + if (0 === total) return next(); + + } else { + self._populate(schema, obj[i], poppath, function (err, doc) { + if (err) return error(err); + obj[i] = doc; + next(); + }); + } + }; + }; + + function error (err) { + if (error.err) return; + fn(error.err = err); + } +}; + /*! * Handles doc.save() callbacks */ @@ -83,7 +290,7 @@ function handleSave (promise, self) { if (err) { // If the initial insert fails provide a second chance. // (If we did this all the time we would break updates) - if (self.$__.inserting) { + if (self._inserting) { self.isNew = true; self.emit('isNew', true); } @@ -92,7 +299,7 @@ function handleSave (promise, self) { return; } - self.$__storeShard(); + self._storeShard(); var numAffected; if (result) { @@ -105,9 +312,9 @@ function handleSave (promise, self) { } // was this an update that required a version bump? - if (self.$__.version && !self.$__.inserting) { - var doIncrement = VERSION_INC === (VERSION_INC & self.$__.version); - self.$__.version = undefined; + if (self.__version && !self._inserting) { + var doIncrement = VERSION_INC === (VERSION_INC & self.__version); + self.__version = undefined; // increment version if was successful if (numAffected > 0) { @@ -169,30 +376,30 @@ Model.prototype.save = function save (fn) { if (this.isNew) { // send entire doc var obj = this.toObject({ depopulate: 1 }); - this.$__version(true, obj); + this._version(true, obj); this.collection.insert(obj, options, complete); - this.$__reset(); + this._reset(); this.isNew = false; this.emit('isNew', false); // Make it possible to retry the insert - this.$__.inserting = true; + this._inserting = true; } else { // Make sure we don't treat it as a new object on error, // since it already exists - this.$__.inserting = false; + this._inserting = false; - var delta = this.$__delta(); + var delta = this._delta(); if (delta) { - if (delta instanceof Error) return complete(delta); - var where = this.$__where(delta[0]); - this.$__reset(); + var where = this._where(delta[0]); this.collection.update(where, delta[1], options, complete); } else { - this.$__reset(); - complete(null); + process.nextTick(function () { + complete(null); + }) } + this._reset(); this.emit('isNew', false); } }; @@ -219,7 +426,7 @@ function operand (self, where, delta, data, val, op) { if (false === self.schema.options.versionKey) return; // already marked for versioning? - if (VERSION_ALL === (VERSION_ALL & self.$__.version)) return; + if (VERSION_ALL === (VERSION_ALL & self.__version)) return; switch (op) { case '$set': @@ -242,7 +449,7 @@ function operand (self, where, delta, data, val, op) { // modifying elements of an array is ok if position does not change. if ('$push' == op || '$pushAll' == op || '$addToSet' == op) { - self.$__.version = VERSION_INC; + self.__version = VERSION_INC; } else if (/^\$p/.test(op)) { // potentially changing array positions @@ -255,7 +462,7 @@ function operand (self, where, delta, data, val, op) { // now handling $set, $unset else if (/\.\d+/.test(data.path)) { // subpath of array - self.$__.version = VERSION_WHERE; + self.__version = VERSION_WHERE; } } @@ -266,28 +473,19 @@ function operand (self, where, delta, data, val, op) { * @param {Object} where * @param {Object} delta * @param {Object} data - * @param {Array} value + * @param {Array} val */ -function handleAtomics (self, where, delta, data, value) { +function handleAtomics (self, where, delta, data, val) { if (delta.$set && delta.$set[data.path]) { // $set has precedence over other atomics return; } - if ('function' == typeof value.$__getAtomics) { - value.$__getAtomics().forEach(function (atomic) { - var op = atomic[0]; - var val = atomic[1]; - operand(self, where, delta, data, val, op); - }) - return; - } - - // legacy support for plugins - - var atomics = value._atomics + var atomics = val._atomics , ops = Object.keys(atomics) + , schema = data.schema + , path = data.path , i = ops.length , val , op; @@ -295,19 +493,18 @@ function handleAtomics (self, where, delta, data, value) { if (0 === i) { // $set - if (isMongooseObject(value)) { - value = value.toObject({ depopulate: 1 }); - } else if (value.valueOf) { - value = value.valueOf(); + if (isMongooseObject(val)) { + val = val.toObject({ depopulate: 1 }); + } else if (val.valueOf) { + val = val.valueOf(); } - return operand(self, where, delta, data, value); + return operand(self, where, delta, data, val); } while (i--) { op = ops[i]; val = atomics[op]; - if (isMongooseObject(val)) { val = val.toObject({ depopulate: 1 }) } else if (Array.isArray(val)) { @@ -331,18 +528,16 @@ function handleAtomics (self, where, delta, data, value) { * Produces a special query document of the modified properties used in updates. * * @api private - * @method $__delta - * @memberOf Model */ -Model.prototype.$__delta = function () { - var dirty = this.$__dirty(); +Model.prototype._delta = function _delta () { + var dirty = this._dirty(); if (!dirty.length) return; - var where = {} + var self = this + , where = {} , delta = {} , len = dirty.length - , divergent = [] , d = 0 , val , obj @@ -352,104 +547,41 @@ Model.prototype.$__delta = function () { var value = data.value var schema = data.schema - var match = checkDivergentArray(this, data.path, value); - if (match) { - divergent.push(match); - continue; - } - - if (divergent.length) continue; - if (undefined === value) { - operand(this, where, delta, data, 1, '$unset'); + operand(self, where, delta, data, 1, '$unset'); } else if (null === value) { - operand(this, where, delta, data, null); + operand(self, where, delta, data, null); } else if (value._path && value._atomics) { // arrays and other custom types (support plugins etc) - handleAtomics(this, where, delta, data, value); + handleAtomics(self, where, delta, data, value); } else if (value._path && Buffer.isBuffer(value)) { // MongooseBuffer value = value.toObject(); - operand(this, where, delta, data, value); + operand(self, where, delta, data, value); } else { - value = utils.clone(value, { convertToId: 1 }); - operand(this, where, delta, data, value); + value = utils.clone(value); + operand(self, where, delta, data, value); } } - if (divergent.length) { - return new DivergentArrayError(divergent); - } - - if (this.$__.version) { - this.$__version(where, delta); + if (this.__version) { + this._version(where, delta); } return [where, delta]; } -/*! - * Determine if array was populated with some form of filter and is now - * being updated in a manner which could overwrite data unintentionally. - * - * @see https://github.com/LearnBoost/mongoose/issues/1334 - * @param {Document} doc - * @param {String} path - * @return {String|undefined} - */ - -function checkDivergentArray (doc, path, array) { - // see if we populated this path - var pop = doc.populated(path, true); - - if (!pop && doc.$__.selected) { - // If any array was selected using an $elemMatch projection, we deny the update. - // NOTE: MongoDB only supports projected $elemMatch on top level array. - var top = path.split('.')[0]; - if (doc.$__.selected[top] && doc.$__.selected[top].$elemMatch) { - return top; - } - } - - if (!(pop && array instanceof MongooseArray)) return; - - // If the array was populated using options that prevented all - // documents from being returned (match, skip, limit) or they - // deselected the _id field, $pop and $set of the array are - // not safe operations. If _id was deselected, we do not know - // how to remove elements. $pop will pop off the _id from the end - // of the array in the db which is not guaranteed to be the - // same as the last element we have here. $set of the entire array - // would be similarily destructive as we never received all - // elements of the array and potentially would overwrite data. - var check = pop.options.match || - pop.options.options && hasOwnProperty(pop.options.options, 'limit') || // 0 is not permitted - pop.options.options && pop.options.options.skip || // 0 is permitted - pop.options.select && // deselected _id? - (0 === pop.options.select._id || - /\s?-_id\s?/.test(pop.options.select)) - - if (check) { - var atomics = array._atomics; - if (0 === Object.keys(atomics).length || atomics.$set || atomics.$pop) { - return path; - } - } -} - /** * Appends versioning to the where and update clauses. * * @api private - * @method $__version - * @memberOf Model */ -Model.prototype.$__version = function (where, delta) { +Model.prototype._version = function _version (where, delta) { var key = this.schema.options.versionKey; if (true === where) { @@ -464,16 +596,17 @@ Model.prototype.$__version = function (where, delta) { // there is no way to select the correct version. we could fail // fast here and force them to include the versionKey but // thats a bit intrusive. can we do this automatically? + // TODO fail fast option? if (!this.isSelected(key)) { return; } // $push $addToSet don't need the where clause set - if (VERSION_WHERE === (VERSION_WHERE & this.$__.version)) { + if (VERSION_WHERE === (VERSION_WHERE & this.__version)) { where[key] = this.getValue(key); } - if (VERSION_INC === (VERSION_INC & this.$__.version)) { + if (VERSION_INC === (VERSION_INC & this.__version)) { delta.$inc || (delta.$inc = {}); delta.$inc[key] = 1; } @@ -487,7 +620,7 @@ Model.prototype.$__version = function (where, delta) { */ Model.prototype.increment = function increment () { - this.$__.version = VERSION_ALL; + this.__version = VERSION_ALL; return this; } @@ -495,22 +628,20 @@ Model.prototype.increment = function increment () { * Returns a query object which applies shardkeys if they exist. * * @api private - * @method $__where - * @memberOf Model */ -Model.prototype.$__where = function _where (where) { +Model.prototype._where = function _where (where) { where || (where = {}); var paths , len - if (this.$__.shardval) { - paths = Object.keys(this.$__.shardval) + if (this._shardval) { + paths = Object.keys(this._shardval) len = paths.length for (var i = 0; i < len; ++i) { - where[paths[i]] = this.$__.shardval[paths[i]]; + where[paths[i]] = this._shardval[paths[i]]; } } @@ -535,13 +666,13 @@ Model.prototype.$__where = function _where (where) { */ Model.prototype.remove = function remove (fn) { - if (this.$__.removing) { - this.$__.removing.addBack(fn); + if (this._removing) { + this._removing.addBack(fn); return this; } - var promise = this.$__.removing = new Promise(fn) - , where = this.$__where() + var promise = this._removing = new Promise(fn) + , where = this._where() , self = this , options = {} @@ -552,7 +683,7 @@ Model.prototype.remove = function remove (fn) { this.collection.remove(where, options, tick(function (err) { if (err) { promise.error(err); - promise = self = self.$__.removing = where = options = null; + promise = self = self._removing = where = options = null; return; } self.emit('remove', self); @@ -563,6 +694,16 @@ Model.prototype.remove = function remove (fn) { return this; }; +/** + * Register hooks override + * + * @api private + */ + +Model.prototype._registerHooks = function registerHooks () { + Document.prototype._registerHooks.call(this); +}; + /** * Returns another Model instance. * @@ -624,8 +765,6 @@ Model.init = function init () { * * _NOTE: It is not recommended that you run this in production. Index creation may impact database performance depending on your load. Use with caution._ * - * The `ensureIndex` commands are not sent in parallel. This is to avoid the `MongoError: cannot add index with a background operation in progress` error. See [this ticket](https://github.com/LearnBoost/mongoose/issues/1365) for more information. - * * @param {Function} [cb] optional callback * @api public */ @@ -633,33 +772,25 @@ Model.init = function init () { Model.ensureIndexes = function ensureIndexes (cb) { var indexes = this.schema.indexes(); if (!indexes.length) { - return cb && process.nextTick(cb); + return cb && cb(); } - // Indexes are created one-by-one to support how MongoDB < 2.4 deals - // with background indexes. - var self = this , safe = self.schema.options.safe + , count = indexes.length + , error - function done (err) { - self.emit('index', err); - cb && cb(err); - } - - function create () { - var index = indexes.shift(); - if (!index) return done(); - + indexes.forEach(function (index) { var options = index[1]; options.safe = safe; self.collection.ensureIndex(index[0], options, tick(function (err) { - if (err) return done(err); - create(); - })); - } + if (err) error = err; + if (--count) return; - create(); + self.emit('index', error); + cb && cb(error); + })); + }); } /** @@ -1369,6 +1500,9 @@ Model.create = function create (doc, fn) { --count || fn.apply(null, docs); }); }); + + // TODO + // utilize collection.insertAll for batch processing? }; /** @@ -1388,7 +1522,6 @@ Model.create = function create (doc, fn) { * - `safe` (boolean) safe mode (defaults to value set in schema (true)) * - `upsert` (boolean) whether to create the doc if it doesn't match (false) * - `multi` (boolean) whether multiple documents should be updated (false) - * - `strict` (boolean) overrides the `strict` option for this update * * All `update` values are cast to their appropriate SchemaTypes before being sent. * @@ -1435,7 +1568,6 @@ Model.create = function create (doc, fn) { * doc.save(callback); * }) * - * @see strict schemas http://mongoosejs.com/docs/guide.html#strict * @param {Object} conditions * @param {Object} update * @param {Object} [options] @@ -1579,11 +1711,9 @@ Model.mapReduce = function mapReduce (o, callback) { * console.log(res); // [ { maxAge: 98 } ] * }); * - * ####NOTE: + * _NOTE: the documents returned are plain javascript objects, not mongoose documents cast to this models schema definition (since any shape of document can be returned)._ * - * - At this time, arguments are not cast to the schema because $project operators allow redefining the "shape" of the documents at any stage of the pipeline. - * - The documents returned are plain javascript objects, not mongoose documents cast to this models schema definition (since any shape of document can be returned). - * - Requires MongoDB >= 2.1 + * _NOTE: this requires running MongoDB >= 2.1_ * * @param {Array} array an array of pipeline commands * @param {Object} [options] @@ -1597,474 +1727,6 @@ Model.aggregate = function aggregate () { return this.collection.aggregate.apply(this.collection, arguments); } -/** - * Populates document references. - * - * ####Available options: - * - * - path: space delimited path(s) to populate - * - select: optional fields to select - * - match: optional query conditions to match - * - model: optional name of the model to use for population - * - options: optional query options like sort, limit, etc - * - * ####Examples: - * - * // populates a single object - * User.findById(id, function (err, user) { - * var opts = [ - * { path: 'company', match: { x: 1 }, select: 'name' } - * , { path: 'notes', options: { limit: 10 }, model: 'override' } - * ] - * - * User.populate(user, opts, function (err, user) { - * console.log(user); - * }) - * }) - * - * // populates an array of objects - * User.find(match, function (err, users) { - * var opts = [{ path: 'company', match: { x: 1 }, select: 'name' }] - * - * User.populate(users, opts, function (err, user) { - * console.log(user); - * }) - * }) - * - * // imagine a Weapon model exists with two saved documents: - * // { _id: 389, name: 'whip' } - * // { _id: 8921, name: 'boomerang' } - * - * var user = { name: 'Indiana Jones', weapon: 389 } - * Weapon.populate(user, { path: 'weapon', model: 'Weapon' }, function (err, user) { - * console.log(user.weapon.name) // whip - * }) - * - * // populate many plain objects - * var users = [{ name: 'Indiana Jones', weapon: 389 }] - * users.push({ name: 'Batman', weapon: 8921 }) - * Weapon.populate(users, { path: 'weapon' }, function (err, users) { - * users.forEach(function (user) { - * console.log('%s uses a %s', users.name, user.weapon.name) - * // Indiana Jones uses a whip - * // Batman uses a boomerang - * }) - * }) - * // Note that we didn't need to specify the Weapon model because - * // we were already using it's populate() method. - * - * @param {Document|Array} docs Either a single document or array of documents to populate. - * @param {Object} options A hash of key/val (path, options) used for population. - * @param {Function} cb(err,doc) A callback, executed upon completion. Receives `err` and the `doc(s)`. - * @api public - */ - -Model.populate = function (docs, paths, cb) { - assert.equal('function', typeof cb); - - // always callback on nextTick for consistent async behavior - function callback () { - var args = utils.args(arguments); - process.nextTick(function () { - cb.apply(null, args); - }); - } - - // normalized paths - var paths = utils.populate(paths); - var pending = paths.length; - - if (0 === pending) { - return callback(null, docs); - } - - // each path has its own query options and must be executed separately - var i = pending; - var path; - while (i--) { - path = paths[i]; - populate(this, docs, path, next); - } - - function next (err) { - if (next.err) return; - if (err) return callback(next.err = err); - if (--pending) return; - callback(null, docs); - } -} - -/*! - * Populates `docs` - */ - -function populate (model, docs, options, cb) { - var select = options.select - , match = options.match - , path = options.path - - var schema = model._getSchema(path); - var subpath; - - // handle document arrays - if (schema && schema.caster) { - schema = schema.caster; - } - - // model name for the populate query - var modelName = options.model && options.model.modelName - || options.model // query options - || schema && schema.options.ref // declared in schema - || model.modelName // an ad-hoc structure - - var Model = model.db.model(modelName); - - // expose the model used - options.model = Model; - - // normalize single / multiple docs passed - if (!Array.isArray(docs)) { - docs = [docs]; - } - - if (0 === docs.length || docs.every(utils.isNullOrUndefined)) { - return cb(); - } - - // get all ids for all docs for a given path - var rawIds = docs.map(function (doc) { - if (!doc) return doc; - - var isDocument = !! doc.$__; - var ret; - - if (isDocument && !doc.isModified(path)) { - // it is possible a previously populated path is being - // populated again. because users can specify matcher - // clauses in their populate arguments we use the cached - // _ids from the original populate call to ensure all _ids - // are looked up, but only if the path wasn't modified which - // signifies the users intent of the state of the path. - ret = doc.populated(path); - } - - if (!ret || Array.isArray(ret) && 0 === ret.length) { - ret = utils.getValue(path, doc); - } - - options._docs[doc._id] = Array.isArray(ret) - ? ret.slice() - : ret; - - if (isDocument) { - // cache original populated _ids and model used - doc.populated(path, options._docs[doc._id], options); - } - - return ret; - }); - - var ids = utils.array.flatten(rawIds, function (item) { - // no need to include undefined values in our query - return undefined !== item; - }); - - if (0 === ids.length || ids.every(utils.isNullOrUndefined)) { - return cb(); - } - - // preserve original match conditions by copying - if (match) { - match = utils.object.shallowCopy(match); - } else { - match = {}; - } - - match._id || (match._id = { $in: ids }); - - var assignmentOpts = {}; - assignmentOpts.sort = options.options && options.options.sort || undefined; - assignmentOpts.excludeId = /\s?-_id\s?/.test(select) || (select && 0 === select._id); - - if (assignmentOpts.excludeId) { - // override the exclusion from the query so we can use the _id - // for document matching during assignment. we'll delete the - // _id back off before returning the result. - if ('string' == typeof select) { - select = null; - } else { - // preserve original select conditions by copying - select = utils.object.shallowCopy(select); - delete select._id; - } - } - - Model.find(match, select, options.options, function (err, vals) { - if (err) return cb(err); - - assignVals({ - rawIds: rawIds - , rawDocs: vals - , docs: docs - , path: path - , options: assignmentOpts - }) - - cb(); - }); -} - -/*! - * Assigns documents returned from a population query back - * to the original document path. - */ - -function assignVals (opts) { - var rawIds = opts.rawIds; - var rawDocs = opts.rawDocs; - var docs = opts.docs; - var path = opts.path; - var options = opts.options; - - assignRawDocsToIdStructure(rawIds, rawDocs, options); - - for (var i = 0; i < docs.length; ++i) { - utils.setValue(path, rawIds[i], docs[i], function (val) { - return valueFilter(val, options); - }); - } -} - -/*! - * 1) Apply backwards compatible find/findOne behavior to sub documents - * - * find logic: - * a) filter out non-documents - * b) remove _id from sub docs when user specified - * - * findOne - * a) if no doc found, set to null - * b) remove _id from sub docs when user specified - * - * 2) Remove _ids when specified by users query. - * - * background: - * _ids are left in the query even when user excludes them so - * that population mapping can occur. - */ - -function valueFilter (val, assignmentOpts) { - if (Array.isArray(val)) { - // find logic - var ret = []; - for (var i = 0; i < val.length; ++i) { - var subdoc = val[i]; - if (!isDoc(subdoc)) continue; - maybeRemoveId(subdoc, assignmentOpts); - ret.push(subdoc); - } - return ret; - } - - // findOne - if (isDoc(val)) { - maybeRemoveId(val, assignmentOpts); - return val; - } - return null; -} - -/*! - * Remove _id from `subdoc` if user specified "lean" query option - */ - -function maybeRemoveId (subdoc, assignmentOpts) { - if (assignmentOpts.excludeId) { - if ('function' == typeof subdoc.setValue) { - subdoc.setValue('_id', undefined); - } else { - delete subdoc._id; - } - } -} - -/*! - * Determine if `doc` is a document returned - * by a populate query. - */ - -function isDoc (doc) { - if (null == doc) - return false; - - var type = typeof doc; - if ('string' == type) - return false; - - if ('number' == type) - return false; - - if (Buffer.isBuffer(doc)) - return false; - - if ('ObjectID' == doc.constructor.name) - return false; - - // only docs - return true; -} - -/*! - * Assign `vals` returned by mongo query to the `rawIds` - * structure returned from utils.getVals() honoring - * query sort order if specified by user. - * - * This can be optimized. - * - * Rules: - * - * if the value of the path is not an array, use findOne rules, else find. - * for findOne the results are assigned directly to doc path (including null results). - * for find, if user specified sort order, results are assigned directly - * else documents are put back in original order of array if found in results - * - * @param {Array} rawIds - * @param {Array} vals - * @param {Boolean} sort - * @api private - */ - -function assignRawDocsToIdStructure (rawIds, vals, options, recursed) { - // honor user specified sort order - var newOrder = []; - var sorting = options.sort && rawIds.length > 1; - var found; - var doc; - var sid; - var id; - - for (var i = 0; i < rawIds.length; ++i) { - id = rawIds[i]; - - if (Array.isArray(id)) { - // handle [ [id0, id2], [id3] ] - assignRawDocsToIdStructure(id, vals, options, true); - newOrder.push(id); - continue; - } - - if (null === id && !sorting) { - // keep nulls for findOne unless sorting, which always - // removes them (backward compat) - newOrder.push(id); - continue; - } - - sid = String(id); - found = false; - - if (recursed) { - // apply find behavior - - // assign matching documents in original order unless sorting - for (var f = 0; f < vals.length; ++f) { - if (sid == String(vals[f]._id)) { - found = true; - if (sorting) { - newOrder[f] = vals[f]; - } else { - newOrder.push(vals[f]); - } - break; - } - } - - if (!found) { - newOrder.push(id); - } - - } else { - // apply findOne behavior - if document in results, assign, else assign null - - doc = null; - for (var f = 0; f < vals.length; ++f) { - if (sid == String(vals[f]._id)) { - doc = vals[f]; - break; - } - } - - newOrder[i] = doc; - } - } - - rawIds.length = 0; - if (newOrder.length) { - // reassign the documents based on corrected order - - // forEach skips over sparse entries in arrays so we - // can safely use this to our advantage dealing with sorted - // result sets too. - newOrder.forEach(function (doc, i) { - rawIds[i] = doc; - }); - } -} - -/** - * Finds the schema for `path`. This is different than - * calling `schema.path` as it also resolves paths with - * positional selectors (something.$.another.$.path). - * - * @param {String} path - * @return {Schema} - * @api private - */ - -Model._getSchema = function _getSchema (path) { - var schema = this.schema - , pathschema = schema.path(path); - - if (pathschema) - return pathschema; - - // look for arrays - return (function search (parts, schema) { - var p = parts.length + 1 - , foundschema - , trypath - - while (p--) { - trypath = parts.slice(0, p).join('.'); - foundschema = schema.path(trypath); - if (foundschema) { - if (foundschema.caster) { - - // array of Mixed? - if (foundschema.caster instanceof Types.Mixed) { - return foundschema.caster; - } - - // Now that we found the array, we need to check if there - // are remaining document paths to look up for casting. - // Also we need to handle array.$.path since schema.path - // doesn't work for that. - if (p !== parts.length) { - if ('$' === parts[p]) { - // comments.$.comments.$.title - return search(parts.slice(p+1), foundschema.schema); - } else { - // this is the last path of the selector - return search(parts.slice(p), foundschema.schema); - } - } - } - return foundschema; - } - } - })(path.split('.'), schema) -} - /*! * Compiler utility. * @@ -2076,15 +1738,6 @@ Model._getSchema = function _getSchema (path) { */ Model.compile = function compile (name, schema, collectionName, connection, base) { - var versioningEnabled = false !== schema.options.versionKey; - - if (versioningEnabled && !schema.paths[schema.options.versionKey]) { - // add versioning to top level documents only - var o = {}; - o[schema.options.versionKey] = Number; - schema.add(o); - } - // generate new class function model (doc, fields, skipId) { if (!(this instanceof model)) @@ -2092,23 +1745,14 @@ Model.compile = function compile (name, schema, collectionName, connection, base Model.call(this, doc, fields, skipId); }; - model.base = base; model.modelName = name; model.__proto__ = Model; model.prototype.__proto__ = Model.prototype; - model.model = Model.prototype.model; - model.db = model.prototype.db = connection; - - model.prototype.$__setSchema(schema); - - var collectionOptions = { - bufferCommands: schema.options.bufferCommands - , capped: schema.options.capped - }; - + model.prototype.db = connection; + model.prototype._setSchema(schema); model.prototype.collection = connection.collection( collectionName - , collectionOptions + , schema.options.capped ); // apply methods @@ -2122,9 +1766,12 @@ Model.compile = function compile (name, schema, collectionName, connection, base // apply named scopes if (schema.namedScopes) schema.namedScopes.compile(model); - model.schema = model.prototype.schema; + model.model = model.prototype.model; model.options = model.prototype.options; + model.db = model.prototype.db; + model.schema = model.prototype.schema; model.collection = model.prototype.collection; + model.base = base; return model; }; @@ -2162,12 +1809,7 @@ Model.__subclass = function subclass (conn, schema, collection) { || utils.toCollectionName(model.modelName); } - var collectionOptions = { - bufferCommands: s ? s.options.bufferCommands : true - , capped: s && s.options.capped - }; - - Model.prototype.collection = conn.collection(collection, collectionOptions); + Model.prototype.collection = conn.collection(collection, s && s.options.capped); Model.collection = Model.prototype.collection; Model.init(); return Model; diff --git a/node_modules/mongoose/lib/promise.js b/node_modules/mongoose/lib/promise.js index 20ab42a..1768e62 100644 --- a/node_modules/mongoose/lib/promise.js +++ b/node_modules/mongoose/lib/promise.js @@ -1,231 +1,158 @@ /*! - * Module dependencies + * Module dependencies. */ -var MPromise = require('mpromise'); +var util = require('./utils'); +var EventEmitter = require('events').EventEmitter; /** * Promise constructor. * - * Promises are returned from executed queries. Example: - * - * var query = Candy.find({ bar: true }); - * var promise = query.exec(); - * - * @param {Function} fn a function which will be called when the promise is resolved that accepts `fn(err, ...){}` as signature - * @inherits mpromise https://github.com/aheckmann/mpromise + * @param {Function} back a callback+errback that accepts `fn(err, ...){}` as signature * @inherits NodeJS EventEmitter http://nodejs.org/api/events.html#events_class_events_eventemitter - * @event `err`: Emits when the promise is rejected - * @event `complete`: Emits when the promise is fulfilled + * @event `err`: Emits when the promise resolves to an error. + * @event `complete`: Emits when the promise resolves sucessfully. * @api public */ -function Promise (fn) { - MPromise.call(this, fn); -} - -/*! - * Inherit from mpromise - */ - -Promise.prototype = Object.create(MPromise.prototype, { - constructor: { - value: Promise - , enumerable: false - , writable: true - , configurable: true - } -}); +function Promise (back) { + this.emitted = {}; + if ('function' == typeof back) + this.addBack(back); +}; /*! - * Override event names for backward compatibility. + * Inherits from EventEmitter. */ -Promise.SUCCESS = 'complete'; -Promise.FAILURE = 'err'; +Promise.prototype.__proto__ = EventEmitter.prototype; /** * Adds `listener` to the `event`. * - * If `event` is either the success or failure event and the event has already been emitted, the`listener` is called immediately and passed the results of the original emitted event. + * If `event` is either `error` or `complete` and the event has already been emitted, the`listener` is called immediately and passed the results of the original emitted event. * - * @see mpromise#on https://github.com/aheckmann/mpromise#on - * @method on - * @memberOf Promise * @param {String} event - * @param {Function} listener - * @return {Promise} this - * @api public - */ - -/** - * Rejects this promise with `reason`. - * - * If the promise has already been fulfilled or rejected, not action is taken. - * - * @see mpromise#reject https://github.com/aheckmann/mpromise#reject - * @method reject - * @memberOf Promise - * @param {Object|String|Error} reason + * @param {Function} callback * @return {Promise} this * @api public */ -/** - * Rejects this promise with `err`. - * - * If the promise has already been fulfilled or rejected, not action is taken. - * - * Differs from [#reject](#promise_Promise-reject) by first casting `err` to an `Error` if it is not `instanceof Error`. - * - * @api public - * @param {Error|String} err - * @return {Promise} this - */ +Promise.prototype.on = function (event, callback) { + if (this.emitted[event]) + callback.apply(this, this.emitted[event]); + else + EventEmitter.prototype.on.call(this, event, callback); -Promise.prototype.error = function (err) { - if (!(err instanceof Error)) err = new Error(err); - return this.reject(err); -} + return this; +}; /** - * Resolves this promise to a rejected state if `err` is passed or a fulfilled state if no `err` is passed. + * Keeps track of emitted events to run them on `on`. * - * If the promise has already been fulfilled or rejected, not action is taken. - * - * `err` will be cast to an Error if not already instanceof Error. - * - * _NOTE: overrides [mpromise#resolve](https://github.com/aheckmann/mpromise#resolve) to provide error casting._ - * - * @param {Error} [err] error or null - * @param {Object} [val] value to fulfill the promise with - * @api public + * @api private */ -Promise.prototype.resolve = function (err, val) { - if (err) return this.error(err); - return this.fulfill(val); -} +Promise.prototype.emit = function (event) { + // ensures a promise can't be complete() or error() twice + if (event == 'err' || event == 'complete'){ + if (this.emitted.err || this.emitted.complete) { + return this; + } + this.emitted[event] = util.args(arguments, 1); + } + + return EventEmitter.prototype.emit.apply(this, arguments); +}; /** - * Adds a single function as a listener to both err and complete. - * - * It will be executed with traditional node.js argument position when the promise is resolved. - * - * promise.addBack(function (err, args...) { - * if (err) return handleError(err); - * console.log('success'); - * }) + * Shortcut for emitting the `complete` event. * - * Alias of [mpromise#onResolve](https://github.com/aheckmann/mpromise#onresolve). - * - * @method addBack - * @param {Function} listener - * @return {Promise} this + * @api public */ -Promise.prototype.addBack = Promise.prototype.onResolve; +Promise.prototype.complete = function () { + var args = util.args(arguments); + return this.emit.apply(this, ['complete'].concat(args)); +}; /** - * Fulfills this promise with passed arguments. + * Shortcut for emitting the `err` event. * - * Alias of [mpromise#fulfill](https://github.com/aheckmann/mpromise#fulfill). + * If `err` is not instanceof Error, it is cast to Error before rejecting. * - * @method complete - * @param {any} args * @api public + * @return {Promise} */ -Promise.prototype.complete = MPromise.prototype.fulfill; +Promise.prototype.error = function (err) { + if (!(err instanceof Error)) err = new Error(err); + return this.emit('err', err); +}; /** * Adds a listener to the `complete` (success) event. * - * Alias of [mpromise#onFulfill](https://github.com/aheckmann/mpromise#onfulfill). - * - * @method addCallback - * @param {Function} listener * @return {Promise} this * @api public */ -Promise.prototype.addCallback = Promise.prototype.onFulfill; +Promise.prototype.addCallback = function (fn) { + return this.on('complete', fn); +}; /** * Adds a listener to the `err` (rejected) event. * - * Alias of [mpromise#onReject](https://github.com/aheckmann/mpromise#onreject). - * - * @method addErrback - * @param {Function} listener * @return {Promise} this * @api public */ -Promise.prototype.addErrback = Promise.prototype.onReject; +Promise.prototype.addErrback = function (fn) { + return this.on('err', fn); +}; /** - * Creates a new promise and returns it. If `onFulfill` or `onReject` are passed, they are added as SUCCESS/ERROR callbacks to this promise after the nextTick. + * Adds a single function as both a callback and errback. * - * Conforms to [promises/A+](https://github.com/promises-aplus/promises-spec) specification. + * It will be executed with traditional node.js argument position: + * function (err, args...) {} * - * ####Example: - * - * var promise = Meetups.find({ tags: 'javascript' }).select('_id').exec(); - * promise.then(function (meetups) { - * var ids = meetups.map(function (m) { - * return m._id; - * }); - * return People.find({ meetups: { $in: ids }).exec(); - * }).then(function (people) { - * if (people.length < 10000) { - * throw new Error('Too few people!!!'); - * } else { - * throw new Error('Still need more people!!!'); - * } - * }).then(null, function (err) { - * assert.ok(err instanceof Error); - * }); - * - * @see promises-A+ https://github.com/promises-aplus/promises-spec - * @see mpromise#then https://github.com/aheckmann/mpromise#then - * @method then - * @memberOf Promise - * @param {Function} onFulFill - * @param {Function} onReject - * @return {Promise} newPromise + * @param {Function} fn + * @return {Promise} this */ +Promise.prototype.addBack = function (fn) { + this.on('err', function(err){ + fn.call(this, err); + }); + + this.on('complete', function(){ + var args = util.args(arguments); + fn.apply(this, [null].concat(args)); + }); + + return this; +}; + /** - * Signifies that this promise was the last in a chain of `then()s`: if a handler passed to the call to `then` which produced this promise throws, the exception will go uncaught. - * - * ####Example: + * Resolves this promise to an error state if `err` is passed or success state when no `err` is passed. * - * var p = new Promise; - * p.then(function(){ throw new Error('shucks') }); - * setTimeout(function () { - * p.fulfill(); - * // error was caught and swallowed by the promise returned from - * // p.then(). we either have to always register handlers on - * // the returned promises or we can do the following... - * }, 10); - * - * // this time we use .end() which prevents catching thrown errors - * var p = new Promise; - * var p2 = p.then(function(){ throw new Error('shucks') }).end(); // <-- - * setTimeout(function () { - * p.fulfill(); // throws "shucks" - * }, 10); + * `err` will be cast to an Error if not already instanceof Error. * + * @param {Error} [err] error or null + * @param {Object} [val] value to complete the promise with * @api public - * @see mpromise#end https://github.com/aheckmann/mpromise#end - * @method end - * @memberOf Promise */ +Promise.prototype.resolve = function (err, val) { + if (err) return this.error(err); + return this.complete(val); +}; + /*! - * expose + * Module exports. */ module.exports = Promise; diff --git a/node_modules/mongoose/lib/query.js b/node_modules/mongoose/lib/query.js index 84b98e3..bb97798 100644 --- a/node_modules/mongoose/lib/query.js +++ b/node_modules/mongoose/lib/query.js @@ -10,7 +10,6 @@ var utils = require('./utils') , inGroupsOf = utils.inGroupsOf , tick = utils.tick , QueryStream = require('./querystream') - , helpers = require('./queryhelpers') , ReadPref = require('mongodb').ReadPreference /** @@ -31,7 +30,6 @@ function Query (criteria, options) { this._conditions = {}; this._updateArg = {}; this._fields = undefined; - this._geoComparison = undefined; if (criteria) this.find(criteria); } @@ -63,10 +61,18 @@ Query.prototype.setOptions = function (options, overwrite) { // overwrite is internal use only if (overwrite) { options = this.options = options || {}; - this.safe = options.safe; - if ('populate' in options) { - this.populate(this.options.populate); + this.safe = options.safe + + // normalize population options + var pop = this.options.populate; + this.options.populate = {}; + + if (pop && Array.isArray(pop)) { + for (var i = 0, l = pop.length; i < l; i++) { + this.options.populate[pop[i]] = {}; + } } + return this; } @@ -94,7 +100,6 @@ Query.prototype.setOptions = function (options, overwrite) { this.options[method] = options[method]; } } - return this; } @@ -303,8 +308,7 @@ Query.prototype.cast = function (model, obj) { var geo = val.$near ? '$near' : val.$nearSphere ? '$nearSphere' : - val.$within ? '$within' : - val.$geoIntersects ? '$geoIntersects' : ''; + val.$within ? '$within' : ''; if (!geo) { continue; @@ -318,27 +322,13 @@ Query.prototype.cast = function (model, obj) { } if ('$within' == geo) { - var withinType = value.$center - || value.$centerSphere - || value.$box - || value.$polygon; - + // find $center, $centerSphere, $box, $polygon + var withinType = value.$center || value.$centerSphere || value.$box || value.$polygon; if (!withinType) { throw new Error('Bad $within paramater: ' + JSON.stringify(val)); } value = withinType; - - } else if ('$near' == geo && - 'string' == typeof value.type && Array.isArray(value.coordinates)) { - // geojson; cast the coordinates - value = value.coordinates; - - } else if (('$near' == geo || '$geoIntersects' == geo) && - value.$geometry && 'string' == typeof value.$geometry.type && - Array.isArray(value.$geometry.coordinates)) { - // geojson; cast the coordinates - value = value.$geometry.coordinates; } ;(function _cast (val) { @@ -494,60 +484,48 @@ Query.prototype._applyPaths = function applyPaths () { schema.eachPath(function (path, type) { if (prefix) path = prefix + '.' + path; - analyzePath(path, type); - // array of subdocs? if (type.schema) { analyzeSchema(type.schema, path); } + analyzePath(path, type); }); } function analyzePath (path, type) { if ('boolean' != typeof type.selected) return; - var plusPath = '+' + path; - if (fields && plusPath in fields) { + if (fields && ('+' + path) in fields) { // forced inclusion - delete fields[plusPath]; + delete fields['+' + path]; // if there are other fields being included, add this one // if no other included fields, leave this out (implied inclusion) - if (false === exclude && keys.length > 1 && !~keys.indexOf(path)) { + if (false === exclude && keys.length > 1) { fields[path] = 1; } return }; - // check for parent exclusions - var root = path.split('.')[0]; - if (~excluded.indexOf(root)) return; - ;(type.selected ? selected : excluded).push(path); } } /** - * Specifies a javascript function or expression to pass to MongoDBs query system. + * Specifies a `$where` condition + * + * Use `$where` when you need to select documents using a JavaScript expression. * * ####Example * * query.$where('this.comments.length > 10 || this.name.length > 5') * - * // or - * * query.$where(function () { * return this.comments.length > 10 || this.name.length > 5; * }) * - * ####NOTE: - * - * Only use `$where` when you have a condition that cannot be met using other MongoDB operators like `$lt`. - * **Be sure to read about all of [its caveats](http://docs.mongodb.org/manual/reference/operator/where/) before using.** - * - * @see $where http://docs.mongodb.org/manual/reference/operator/where/ * @param {String|Function} js javascript string or function * @return {Query} this * @memberOf Query @@ -631,7 +609,6 @@ Query.prototype.equals = function equals (val) { * * query.or([{ color: 'red' }, { status: 'emergency' }]) * - * @see $or http://docs.mongodb.org/manual/reference/operator/or/ * @param {Array} array array of conditions * @return {Query} this * @api public @@ -651,7 +628,6 @@ Query.prototype.or = function or (array) { * * query.nor([{ color: 'green' }, { status: 'ok' }]) * - * @see $nor http://docs.mongodb.org/manual/reference/operator/nor/ * @param {Array} array array of conditions * @return {Query} this * @api public @@ -671,7 +647,6 @@ Query.prototype.nor = function nor (array) { * * query.and([{ color: 'green' }, { status: 'ok' }]) * - * @see $and http://docs.mongodb.org/manual/reference/operator/and/ * @param {Array} array array of conditions * @return {Query} this * @api public @@ -696,7 +671,6 @@ Query.prototype.and = function and (array) { * // or * Thing.find().gt('age', 21) * - * @see $gt http://docs.mongodb.org/manual/reference/operator/gt/ * @method gt * @memberOf Query * @param {String} path @@ -709,7 +683,6 @@ Query.prototype.and = function and (array) { * * When called with one argument, the most recent path passed to `where()` is used. * - * @see $gte http://docs.mongodb.org/manual/reference/operator/gte/ * @method gte * @memberOf Query * @param {String} path @@ -722,7 +695,6 @@ Query.prototype.and = function and (array) { * * When called with one argument, the most recent path passed to `where()` is used. * - * @see $lt http://docs.mongodb.org/manual/reference/operator/lt/ * @method lt * @memberOf Query * @param {String} path @@ -735,7 +707,6 @@ Query.prototype.and = function and (array) { * * When called with one argument, the most recent path passed to `where()` is used. * - * @see $lte http://docs.mongodb.org/manual/reference/operator/lte/ * @method lte * @memberOf Query * @param {String} path @@ -748,7 +719,6 @@ Query.prototype.and = function and (array) { * * When called with one argument, the most recent path passed to `where()` is used. * - * @see $ne http://docs.mongodb.org/manual/reference/operator/ne/ * @method ne * @memberOf Query * @param {String} path @@ -761,7 +731,6 @@ Query.prototype.and = function and (array) { * * When called with one argument, the most recent path passed to `where()` is used. * - * @see $in http://docs.mongodb.org/manual/reference/operator/in/ * @method in * @memberOf Query * @param {String} path @@ -774,7 +743,6 @@ Query.prototype.and = function and (array) { * * When called with one argument, the most recent path passed to `where()` is used. * - * @see $nin http://docs.mongodb.org/manual/reference/operator/nin/ * @method nin * @memberOf Query * @param {String} path @@ -787,7 +755,6 @@ Query.prototype.and = function and (array) { * * When called with one argument, the most recent path passed to `where()` is used. * - * @see $all http://docs.mongodb.org/manual/reference/operator/all/ * @method all * @memberOf Query * @param {String} path @@ -800,7 +767,6 @@ Query.prototype.and = function and (array) { * * When called with one argument, the most recent path passed to `where()` is used. * - * @see $size http://docs.mongodb.org/manual/reference/operator/size/ * @method size * @memberOf Query * @param {String} path @@ -813,7 +779,6 @@ Query.prototype.and = function and (array) { * * When called with one argument, the most recent path passed to `where()` is used. * - * @see $regex http://docs.mongodb.org/manual/reference/operator/regex/ * @method regex * @memberOf Query * @param {String} path @@ -826,7 +791,6 @@ Query.prototype.and = function and (array) { * * When called with one argument, the most recent path passed to `where()` is used. * - * @see $maxDistance http://docs.mongodb.org/manual/reference/operator/maxDistance/ * @method maxDistance * @memberOf Query * @param {String} path @@ -859,7 +823,6 @@ Query.prototype.and = function and (array) { * @param {Number} val * @return {Query} this * @see http://www.mongodb.org/display/DOCS/Geospatial+Indexing - * @see $near http://docs.mongodb.org/manual/reference/operator/near/ * @api public */ @@ -885,7 +848,6 @@ Query.prototype.near = function (path, val) { * @param {Object} val * @return {Query} this * @see http://www.mongodb.org/display/DOCS/Geospatial+Indexing - * @see $nearSphere http://docs.mongodb.org/manual/reference/operator/nearSphere/ * @api public */ @@ -910,7 +872,6 @@ Query.prototype.nearSphere = function (path, val) { * @param {String} path * @param {Number} val * @return {Query} this - * @see $mod http://docs.mongodb.org/manual/reference/operator/mod/ * @api public */ @@ -935,7 +896,6 @@ Query.prototype.mod = function (path, val) { * @param {String} path * @param {Number} val * @return {Query} this - * @see $exists http://docs.mongodb.org/manual/reference/operator/exists/ * @api public */ @@ -978,7 +938,6 @@ Query.prototype.exists = function (path, val) { * @param {String|Object|Function} path * @param {Object|Function} criteria * @return {Query} this - * @see $elemMatch http://docs.mongodb.org/manual/reference/operator/elemMatch/ * @api public */ @@ -1010,57 +969,21 @@ Query.prototype.elemMatch = function (path, criteria) { // Spatial queries /** - * Defines a $within query for `box()`, `center()`, etc + * Syntax sugar for expressive queries. * * ####Example * * query.within.box() * query.within.center() - * query.within.geometry() * * @property within * @memberOf Query - * @see Query#box #query_Query-box - * @see Query#center #query_Query-center - * @see Query#centerSphere #query_Query-centerSphere - * @see Query#polygon #query_Query-polygon - * @see Query#geometry #query_Query-geometry - * @see $geoWithin http://docs.mongodb.org/manual/reference/operator/within/ * @return {Query} this * @api public */ Object.defineProperty(Query.prototype, 'within', { - get: function () { - this._geoComparison = '$within'; - return this - } -}); - -/** - * Declares an intersects query for `geometry()`. - * - * ####Example - * - * query.intersects.geometry({ - * type: 'LineString' - * , coordinates: [[180.0, 11.0], [180, 9.0]] - * }) - * - * @property intersects - * @see Query#geometry #query_Query-geometry - * @see $geometry http://docs.mongodb.org/manual/reference/operator/geometry/ - * @see geoIntersects http://docs.mongodb.org/manual/reference/operator/geoIntersects/ - * @memberOf Query - * @return {Query} this - * @api public - */ - -Object.defineProperty(Query.prototype, 'intersects', { - get: function () { - this._geoComparison = '$geoIntersects'; - return this - } + get: function () { return this } }); /** @@ -1074,7 +997,6 @@ Object.defineProperty(Query.prototype, 'intersects', { * * @see http://www.mongodb.org/display/DOCS/Geospatial+Indexing * @see Query#within #query_Query-within - * @see $box http://docs.mongodb.org/manual/reference/operator/box/ * @param {String} path * @param {Object} val * @return {Query} this @@ -1104,7 +1026,6 @@ Query.prototype.box = function (path, val) { * @param {Object} [opts] options e.g. { $uniqueDocs: true } * @return {Query} this * @see http://www.mongodb.org/display/DOCS/Geospatial+Indexing - * @see $center http://docs.mongodb.org/manual/reference/operator/center/ * @api public */ @@ -1132,11 +1053,10 @@ Query.prototype.center = function (path, val, opts) { * var area = { center: [50, 50], radius: 10 } * query.where('loc').within.centerSphere(area) * - * @param {String} [path] + * @param {String} path * @param {Object} val * @return {Query} this * @see http://www.mongodb.org/display/DOCS/Geospatial+Indexing - * @see $centerSphere http://docs.mongodb.org/manual/reference/operator/centerSphere/ * @api public */ @@ -1162,11 +1082,10 @@ Query.prototype.centerSphere = function (path, val) { * var polyB = { a : { x : 10, y : 20 }, b : { x : 15, y : 25 }, c : { x : 20, y : 20 } } * query.where('loc').within.polygon(polyB) * - * @param {String} [path] + * @param {String} path * @param {Array|Object} val * @return {Query} this * @see http://www.mongodb.org/display/DOCS/Geospatial+Indexing - * @see $polygon http://docs.mongodb.org/manual/reference/operator/polygon/ * @api public */ @@ -1180,61 +1099,6 @@ Query.prototype.polygon = function (path, val) { return this; }; -/** - * Specifies a $geometry condition - * - * ####Example - * - * var polyA = [[[ 10, 20 ], [ 10, 40 ], [ 30, 40 ], [ 30, 20 ]]] - * query.where('loc').within.geometry({ type: 'Polygon', coordinates: polyA }) - * - * // or - * var polyB = [[ 0, 0 ], [ 1, 1 ]] - * query.where('loc').within.geometry({ type: 'LineString', coordinates: polyB }) - * - * // or - * var polyC = [ 0, 0 ] - * query.where('loc').within.geometry({ type: 'Point', coordinates: polyC }) - * - * // or - * var polyC = [ 0, 0 ] - * query.where('loc').intersects.geometry({ type: 'Point', coordinates: polyC }) - * - * ####NOTE: - * - * `geometry()` **must** come after either `intersects` or `within`. - * - * The `object` argument must contain `type` and `coordinates` properties. - * - type {String} - * - coordinates {Array} - * - * When called with one argument, the most recent path passed to `where()` is used. - * - * @param {String} [path] Optional name of a path to match against - * @param {Object} object Must contain a `type` property which is a String and a `coordinates` property which is an Array. See the example. - * @return {Query} this - * @see http://docs.mongodb.org/manual/release-notes/2.4/#new-geospatial-indexes-with-geojson-and-improved-spherical-geometry - * @see http://www.mongodb.org/display/DOCS/Geospatial+Indexing - * @see $geometry http://docs.mongodb.org/manual/reference/operator/geometry/ - * @api public - */ - -Query.prototype.geometry = function (path, val) { - if (arguments.length === 1) { - val = path; - path = this._currPath; - } - - var conds = this._conditions[path] || (this._conditions[path] = {}); - - if (!this._geoComparison) { - throw new Error('query.geometry() must come after either `within` or `intersects`'); - } - - conds[this._geoComparison] = { $geometry: val }; - return this; -}; - /** * Specifies which document fields to include or exclude * @@ -1286,7 +1150,7 @@ Query.prototype.select = function select (arg) { }; /** - * Specifies a $slice projection for an array. + * Specifies a $slice condition * * ####Example * @@ -1300,7 +1164,6 @@ Query.prototype.select = function select (arg) { * @param {Number} val number of elements to slice * @return {Query} this * @see mongodb http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields#RetrievingaSubsetofFields-RetrievingaSubrangeofArrayElements - * @see $slice http://docs.mongodb.org/manual/reference/projection/slice/#prj._S_slice * @api public */ @@ -1324,21 +1187,18 @@ Query.prototype.slice = function (path, val) { /** * Sets the sort order * - * If an object is passed, values allowed are `asc`, `desc`, `ascending`, `descending`, `1`, and `-1`. + * If an object is passed, values allowed are 'asc', 'desc', 'ascending', 'descending', 1, and -1. * * If a string is passed, it must be a space delimited list of path names. The sort order of each path is ascending unless the path name is prefixed with `-` which will be treated as descending. * * ####Example * - * // sort by "field" ascending and "test" descending + * // these are equivalent * query.sort({ field: 'asc', test: -1 }); - * - * // equivalent * query.sort('field -test'); * * @param {Object|String} arg * @return {Query} this - * @see cursor.sort http://docs.mongodb.org/manual/reference/method/cursor.sort/ * @api public */ @@ -1379,19 +1239,20 @@ function push (arr, field, value) { } /** - * Specifies the maximum number of documents the query will return. + * Specifies the limit option. * * ####Example * - * Kitten.find().limit(20).exec(callback) + * Kitten.find().limit(20) * * @method limit * @memberOf Query * @param {Number} val + * @see mongodb http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%7B%7Blimit%28%29%7D%7D * @api public */ /** - * Specifies the number of documents to skip. + * Specifies the skip option. * * ####Example * @@ -1400,7 +1261,7 @@ function push (arr, field, value) { * @method skip * @memberOf Query * @param {Number} val - * @see cursor.skip http://docs.mongodb.org/manual/reference/method/cursor.skip/ + * @see mongodb http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%7B%7Bskip%28%29%7D%7D * @api public */ /** @@ -1413,7 +1274,7 @@ function push (arr, field, value) { * @method maxscan * @memberOf Query * @param {Number} val - * @see maxScan http://docs.mongodb.org/manual/reference/operator/maxScan/ + * @see mongodb http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24maxScan * @api public */ /** @@ -1426,7 +1287,7 @@ function push (arr, field, value) { * @method batchSize * @memberOf Query * @param {Number} val - * @see batchSize http://docs.mongodb.org/manual/reference/method/cursor.batchSize/ + * @see mongodb http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%7B%7BbatchSize%28%29%7D%7D * @api public */ /** @@ -1439,7 +1300,7 @@ function push (arr, field, value) { * @method comment * @memberOf Query * @param {Number} val - * @see comment http://docs.mongodb.org/manual/reference/operator/comment/ + * @see mongodb http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24comment * @api public */ @@ -1465,7 +1326,7 @@ function push (arr, field, value) { * * Kitten.find().snapshot() * - * @see snapshot http://docs.mongodb.org/manual/reference/operator/snapshot/ + * @see mongodb http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%7B%7Bsnapshot%28%29%7D%7D * @return {Query} this * @api public */ @@ -1484,7 +1345,7 @@ Query.prototype.snapshot = function () { * * @param {Object} val a hint object * @return {Query} this - * @see $hint http://docs.mongodb.org/manual/reference/operator/hint/ + * @see mongodb http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24hint * @api public */ @@ -1506,7 +1367,7 @@ Query.prototype.hint = function (val) { }; /** - * Sets the slaveOk option. _Deprecated_ in MongoDB 2.2 in favor of [read preferences](#query_Query-read). + * Sets the slaveOk option. * * ####Example: * @@ -1516,7 +1377,6 @@ Query.prototype.hint = function (val) { * * @param {Boolean} v defaults to true * @see mongodb http://docs.mongodb.org/manual/applications/replication/#read-preference - * @see slaveOk http://docs.mongodb.org/manual/reference/method/rs.slaveOk/ * @return {Query} this * @api public */ @@ -1527,23 +1387,7 @@ Query.prototype.slaveOk = function (v) { } /** - * Determines the MongoDB nodes from which to read. - * - * ####Preferences: - * - * primary - (default) Read from primary only. Operations will produce an error if primary is unavailable. Cannot be combined with tags. - * secondary Read from secondary if available, otherwise error. - * primaryPreferred Read from primary if available, otherwise a secondary. - * secondaryPreferred Read from a secondary if available, otherwise read from the primary. - * nearest All operations read from among the nearest candidates, but unlike other modes, this option will include both the primary and all secondaries in the selection. - * - * Aliases - * - * p primary - * pp primaryPreferred - * s secondary - * sp secondaryPreferred - * n nearest + * Sets the readPreference option for the query. * * ####Example: * @@ -1562,12 +1406,28 @@ Query.prototype.slaveOk = function (v) { * new Query().read('nearest') * new Query().read('n') // same as nearest * - * // read from secondaries with matching tags - * new Query().read('secondary', [{ dc:'sf', s: 1 },{ dc:'ma', s: 2 }]) + * // with tags + * new Query().read('s', [{ dc:'sf', s: 1 },{ dc:'ma', s: 2 }]) + * + * ####Preferences: + * + * primary - (default) Read from primary only. Operations will produce an error if primary is unavailable. Cannot be combined with tags. + * secondary Read from secondary if available, otherwise error. + * primaryPreferred Read from primary if available, otherwise a secondary. + * secondaryPreferred Read from a secondary if available, otherwise read from the primary. + * nearest All operations read from among the nearest candidates, but unlike other modes, this option will include both the primary and all secondaries in the random selection. + * + * Aliases + * + * p primary + * pp primaryPreferred + * s secondary + * sp secondaryPreferred + * n nearest * * Read more about how to use read preferrences [here](http://docs.mongodb.org/manual/applications/replication/#read-preference) and [here](http://mongodb.github.com/node-mongodb-native/driver-articles/anintroductionto1_1and2_2.html#read-preferences). * - * @param {String} pref one of the listed preference options or aliases + * @param {String} pref one of the listed preference options or their aliases * @param {Array} [tags] optional tags for this query * @see mongodb http://docs.mongodb.org/manual/applications/replication/#read-preference * @see driver http://mongodb.github.com/node-mongodb-native/driver-articles/anintroductionto1_1and2_2.html#read-preferences @@ -1583,7 +1443,9 @@ Query.prototype.read = function (pref, tags) { /** * Sets the lean option. * - * Documents returned from queries with the `lean` option enabled are plain javascript objects, not [MongooseDocuments](#document-js). They have no `save` method, getters/setters or other Mongoose magic applied. + * Documents returned from queries with the `lean` option enabled are plain javascript objects, not [MongooseDocuments](#document-js). They have no `save` method, getters/setters or any other Mongoose magic applied. + * + * This is a [great](https://groups.google.com/forum/#!topic/mongoose-orm/u2_DzDydcnA/discussion) option in high-performance read-only scenarios, especially when combined with the [stream](#query_Query-stream) option. * * ####Example: * @@ -1591,13 +1453,11 @@ Query.prototype.read = function (pref, tags) { * new Query().lean(true) * new Query().lean(false) * - * Model.find().lean().exec(function (err, docs) { - * docs[0] instanceof mongoose.Document // false - * }); + * Model.find().lean().exec(); * - * This is a [great](https://groups.google.com/forum/#!topic/mongoose-orm/u2_DzDydcnA/discussion) option in high-performance read-only scenarios, especially when combined with [stream](#query_Query-stream). + * var leanStream = Model.find().lean().stream(); * - * @param {Boolean} bool defaults to true + * @param {Boolean} v defaults to true * @return {Query} this * @api public */ @@ -1608,16 +1468,16 @@ Query.prototype.lean = function (v) { } /** - * Sets the tailable option (for use with capped collections). + * Sets tailable option. * * ####Example * - * Kitten.find().tailable() // true + * Kitten.find().tailable() <== true * Kitten.find().tailable(true) * Kitten.find().tailable(false) * - * @param {Boolean} bool defaults to true - * @see tailable http://docs.mongodb.org/manual/tutorial/create-tailable-cursor/ + * @param {Boolean} v defaults to true + * @see mongodb http://www.mongodb.org/display/DOCS/Tailable+Cursors * @api public */ @@ -1667,65 +1527,32 @@ Query.prototype.execFind = function (callback) { function cb (err, docs) { if (err) return promise.error(err); - if (0 === docs.length) { + if (true === options.lean) return promise.complete(docs); - } - if (!self.options.populate) { - return true === options.lean - ? promise.complete(docs) - : completeMany(model, docs, fields, self, null, promise); - } + var arr = [] + , count = docs.length; - var pop = helpers.preparePopulationOptions(self, options); - model.populate(docs, pop, function (err, docs) { - if (err) return promise.error(err); - return true === options.lean - ? promise.complete(docs) - : completeMany(model, docs, fields, self, pop, promise); - }); + if (!count) return promise.complete([]); + + for (var i = 0, l = docs.length; i < l; i++) { + arr[i] = new model(undefined, fields, true); + arr[i].init(docs[i], self, function (err) { + if (err) return promise.error(err); + --count || promise.complete(arr); + }); + } } return this; -} - -/*! - * hydrates many documents - * - * @param {Model} model - * @param {Array} docs - * @param {Object} fields - * @param {Query} self - * @param {Array} [pop] array of paths used in population - * @param {Promise} promise - */ - -function completeMany (model, docs, fields, self, pop, promise) { - var arr = []; - var count = docs.length; - var len = count; - var i = 0; - var opts = pop ? - { populated: pop } - : undefined; - - for (; i < len; ++i) { - arr[i] = new model(undefined, fields, true); - arr[i].init(docs[i], opts, function (err) { - if (err) return promise.error(err); - --count || promise.complete(arr); - }); - } -} +}; /** - * Executes the query as a findOne() operation, passing the first found document to the callback. + * Executes the query as a findOne() operation. * * ####Example * - * var query = Kitten.find({ color: 'white'}); - * - * query.findOne(function (err, kitten) { + * Kitten.where('color', 'white').findOne(function (err, kitten) { * if (err) return handleError(err); * * // kitten may be null if no document matched @@ -1736,7 +1563,6 @@ function completeMany (model, docs, fields, self, pop, promise) { * * @param {Function} callback * @return {Query} this - * @see findOne http://docs.mongodb.org/manual/reference/method/db.collection.findOne/ * @api public */ @@ -1773,46 +1599,17 @@ Query.prototype.findOne = function (callback) { if (err) return promise.error(err); if (!doc) return promise.complete(null); - if (!self.options.populate) { - return true === options.lean - ? promise.complete(doc) - : completeOne(model, doc, fields, self, null, promise); - } + if (true === options.lean) return promise.complete(doc); - var pop = helpers.preparePopulationOptions(self, options); - model.populate(doc, pop, function (err, doc) { + var casted = new model(undefined, fields, true); + casted.init(doc, self, function (err) { if (err) return promise.error(err); - return true === options.lean - ? promise.complete(doc) - : completeOne(model, doc, fields, self, pop, promise); - }) + promise.complete(casted); + }); })); return this; -} - -/*! - * hydrates a document - * - * @param {Model} model - * @param {Document} doc - * @param {Object} fields - * @param {Query} self - * @param {Array} [pop] array of paths used in population - * @param {Promise} promise - */ - -function completeOne (model, doc, fields, self, pop, promise) { - var opts = pop ? - { populated: pop } - : undefined; - - var casted = new model(undefined, fields, true); - casted.init(doc, opts, function (err) { - if (err) return promise.error(err); - promise.complete(casted); - }); -} +}; /** * Exectues the query as a count() operation. @@ -1826,7 +1623,7 @@ function completeOne (model, doc, fields, self, pop, promise) { * * @param {Function} callback * @return {Query} this - * @see count http://docs.mongodb.org/manual/reference/method/db.collection.count/ + * @see mongodb http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Count * @api public */ @@ -1852,7 +1649,7 @@ Query.prototype.count = function (callback) { * @param {String} field * @param {Function} callback * @return {Query} this - * @see distinct http://docs.mongodb.org/manual/reference/method/db.collection.distinct/ + * @see mongodb http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Distinct * @api public */ @@ -1904,7 +1701,7 @@ var numberOps = { * * Model.update({..}, { title: 'remove words' }, ...) * - * // becomes + * becomes * * Model.update({..}, { $set: { title: 'remove words' }}, ...) * @@ -1916,8 +1713,6 @@ var numberOps = { * @param {Function} callback * @return {Query} this * @api public - * @see Model.update http://localhost:8088/docs/api.html#model_Model.update - * @see update http://docs.mongodb.org/manual/reference/method/db.collection.update/ */ Query.prototype.update = function update (doc, callback) { @@ -2029,7 +1824,8 @@ Query.prototype._castUpdate = function _castUpdate (obj) { */ Query.prototype._walkUpdatePath = function _walkUpdatePath (obj, op, pref) { - var prefix = pref ? pref + '.' : '' + var strict = this.model.schema.options.strict + , prefix = pref ? pref + '.' : '' , keys = Object.keys(obj) , i = keys.length , hasKeys = false @@ -2037,10 +1833,6 @@ Query.prototype._walkUpdatePath = function _walkUpdatePath (obj, op, pref) { , key , val - var strict = 'strict' in this.options - ? this.options.strict - : this.model.schema.options.strict; - while (i--) { key = keys[i]; val = obj[key]; @@ -2061,20 +1853,10 @@ Query.prototype._walkUpdatePath = function _walkUpdatePath (obj, op, pref) { } } else { hasKeys = true; - if ('$each' in val) { obj[key] = { $each: this._castUpdateVal(schema, val.$each, op) } - - if (val.$slice) { - obj[key].$slice = val.$slice | 0; - } - - if (val.$sort) { - obj[key].$sort = val.$sort; - } - } else { obj[key] = this._castUpdateVal(schema, val, op); } @@ -2152,7 +1934,47 @@ Query.prototype._castUpdateVal = function _castUpdateVal (schema, val, op, $cond */ Query.prototype._getSchema = function _getSchema (path) { - return this.model._getSchema(path); + var schema = this.model.schema + , pathschema = schema.path(path); + + if (pathschema) + return pathschema; + + // look for arrays + return (function search (parts, schema) { + var p = parts.length + 1 + , foundschema + , trypath + + while (p--) { + trypath = parts.slice(0, p).join('.'); + foundschema = schema.path(trypath); + if (foundschema) { + if (foundschema.caster) { + + // array of Mixed? + if (foundschema.caster instanceof Types.Mixed) { + return foundschema.caster; + } + + // Now that we found the array, we need to check if there + // are remaining document paths to look up for casting. + // Also we need to handle array.$.path since schema.path + // doesn't work for that. + if (p !== parts.length) { + if ('$' === parts[p]) { + // comments.$.comments.$.title + return search(parts.slice(p+1), foundschema.schema); + } else { + // this is the last path of the selector + return search(parts.slice(p), foundschema.schema); + } + } + } + return foundschema; + } + } + })(path.split('.'), schema) } /** @@ -2218,7 +2040,6 @@ Query.prototype._castFields = function _castFields (fields) { * * @param {Function} callback * @api public - * @see remove http://docs.mongodb.org/manual/reference/method/db.collection.remove/ */ Query.prototype.remove = function (callback) { @@ -2445,19 +2266,15 @@ Query.prototype._findAndModify = function (type, callback) { if (err) return promise.error(err); if (!doc) return promise.complete(null); - if (!self.options.populate) { - return true === opts.lean - ? promise.complete(doc) - : completeOne(model, doc, fields, self, null, promise); + if (true === opts.lean) { + return promise.complete(doc); } - var pop = helpers.preparePopulationOptions(self, opts); - model.populate(doc, pop, function (err, doc) { + var casted = new model(undefined, fields, true); + casted.init(doc, self, function (err) { if (err) return promise.error(err); - return true === opts.lean - ? promise.complete(doc) - : completeOne(model, doc, fields, self, pop, promise); - }) + promise.complete(casted); + }); })); return promise; @@ -2466,61 +2283,60 @@ Query.prototype._findAndModify = function (type, callback) { /** * Specifies paths which should be populated with other documents. * + * Paths are populated after the query executes and a response is received. A separate query is then executed for each path specified for population. After a response for each query has also been returned, the results are passed to the callback. + * * ####Example: * * Kitten.findOne().populate('owner').exec(function (err, kitten) { * console.log(kitten.owner.name) // Max * }) * - * Kitten.find().populate({ - * path: 'owner' - * , select: 'name' - * , match: { color: 'black' } - * , options: { sort: { name: -1 }} - * }).exec(function (err, kittens) { - * console.log(kittens[0].owner.name) // Zoopa - * }) - * - * // alternatively - * Kitten.find().populate('owner', 'name', null, {sort: { name: -1 }}).exec(function (err, kittens) { - * console.log(kittens[0].owner.name) // Zoopa - * }) - * - * Paths are populated after the query executes and a response is received. A separate query is then executed for each path specified for population. After a response for each query has also been returned, the results are passed to the callback. - * - * @param {Object|String} path either the path to populate or an object specifying all parameters - * @param {Object|String} [select] Field selection for the population query + * @param {String} path + * @param {Object|String} [fields] Field selection for the population query * @param {Model} [model] The name of the model you wish to use for population. If not specified, the name is looked up from the Schema ref. - * @param {Object} [match] Conditions for the population query + * @param {Object} [conditions] Conditions for the population query * @param {Object} [options] Options for the population query (sort, etc) * @see population ./populate.html * @see Query#select #query_Query-select - * @see Model.populate #model_Model.populate * @return {Query} this * @api public */ -Query.prototype.populate = function populate () { - var res = utils.populate.apply(null, arguments); - var opts = this.options; - - if (!utils.isObject(opts.populate)) { - opts.populate = {}; - } - - for (var i = 0; i < res.length; ++i) { - opts.populate[res[i].path] = res[i]; +Query.prototype.populate = function (path, fields, model, conditions, options) { + if ('string' !== typeof model) { + options = conditions; + conditions = model; + model = undefined; } + // The order of fields/conditions args is opposite Model.find but + // necessary to keep backward compatibility (fields could be + // an array, string, or object literal). + this.options.populate[path] = + new PopulateOptions(fields, conditions, options, model); return this; +}; + +/*! + * Populate options constructor + */ + +function PopulateOptions (fields, conditions, options, model) { + this.conditions = conditions; + this.fields = fields; + this.options = options; + this.model = model; } +// make it compatible with utils.clone +PopulateOptions.prototype.constructor = Object; + /** - * Returns a Node.js 0.8 style [read stream](http://nodejs.org/docs/v0.8.21/api/stream.html#stream_readable_stream) interface. + * Returns a stream interface * * ####Example * - * // follows the nodejs 0.8 stream api + * // follows the nodejs stream api * Thing.find({ name: /^hello/ }).stream().pipe(res) * * // manual streaming @@ -2534,24 +2350,13 @@ Query.prototype.populate = function populate () { * // the stream is closed * }); * - * ####Valid options - * - * - `transform`: optional function which accepts a mongoose document. The return value of the function will be emitted on `data`. - * - * ####Example - * - * // JSON.stringify all documents before emitting - * var stream = Thing.find().stream({ transform: JSON.stringify }); - * stream.pipe(writeStream); - * * @return {QueryStream} - * @param {Object} [options] * @see QueryStream * @api public */ -Query.prototype.stream = function stream (opts) { - return new QueryStream(this, opts); +Query.prototype.stream = function stream () { + return new QueryStream(this); } // helpers diff --git a/node_modules/mongoose/lib/queryhelpers.js b/node_modules/mongoose/lib/queryhelpers.js deleted file mode 100644 index 4637fad..0000000 --- a/node_modules/mongoose/lib/queryhelpers.js +++ /dev/null @@ -1,35 +0,0 @@ - -/*! - * Module dependencies - */ - -var utils = require('./utils') - -/*! - * Prepare a set of path options for query population. - * - * @param {Query} query - * @param {Object} options - * @return {Array} - */ - -exports.preparePopulationOptions = function preparePopulationOptions (query, options) { - var pop = utils.object.vals(query.options.populate); - - // lean options should trickle through all queries - if (options.lean) pop.forEach(makeLean); - - return pop; -} - -/*! - * Set each path query option to lean - * - * @param {Object} option - */ - -function makeLean (option) { - option.options || (option.options = {}); - option.options.lean = true; -} - diff --git a/node_modules/mongoose/lib/querystream.js b/node_modules/mongoose/lib/querystream.js index 6db7570..69726c4 100644 --- a/node_modules/mongoose/lib/querystream.js +++ b/node_modules/mongoose/lib/querystream.js @@ -5,11 +5,9 @@ var Stream = require('stream').Stream var utils = require('./utils') -var helpers = require('./queryhelpers') -var K = function(k){ return k } /** - * Provides a Node.js 0.8 style [ReadStream](http://nodejs.org/docs/v0.8.21/api/stream.html#stream_readable_stream) interface for Queries. + * Provides a [ReadStream](http://nodejs.org/api/stream.html#stream_readable_stream) interface for Queries. * * var stream = Model.find().stream(); * @@ -22,34 +20,21 @@ var K = function(k){ return k } * }); * * - * The stream interface allows us to simply "plug-in" to other _Node.js 0.8_ style write streams. + * The stream interface allows us to simply "plug-in" to other Node.js write streams (fs.createWriteStream) so everything "just works" out of the box. * * Model.where('created').gte(twoWeeksAgo).stream().pipe(writeStream); * - * ####Valid options - * - * - `transform`: optional function which accepts a mongoose document. The return value of the function will be emitted on `data`. - * - * ####Example - * - * // JSON.stringify all documents before emitting - * var stream = Thing.find().stream({ transform: JSON.stringify }); - * stream.pipe(writeStream); - * * _NOTE: plugging into an HTTP response will *not* work out of the box. Those streams expect only strings or buffers to be emitted, so first formatting our documents as strings/buffers is necessary._ * - * _NOTE: these streams are Node.js 0.8 style read streams which differ from Node.js 0.10 style. Node.js 0.10 streams are not well tested yet and are not guaranteed to work._ - * * @param {Query} query - * @param {Object} [options] - * @inherits NodeJS Stream http://nodejs.org/docs/v0.8.21/api/stream.html#stream_readable_stream + * @inherits NodeJS Stream http://nodejs.org/api/stream.html * @event `data`: emits a single Mongoose document * @event `error`: emits when an error occurs during streaming. This will emit _before_ the `close` event. * @event `close`: emits when the stream reaches the end of the cursor or an error occurs, or the stream is manually `destroy`ed. After this event, no more events are emitted. * @api public */ -function QueryStream (query, options) { +function QueryStream (query) { Stream.call(this); this.query = query; @@ -61,9 +46,6 @@ function QueryStream (query, options) { this._buffer = null; this._inline = T_INIT; this._running = false; - this._transform = options && 'function' == typeof options.transform - ? options.transform - : K; // give time to hook up events var self = this; @@ -212,51 +194,39 @@ QueryStream.prototype._onNextObject = function _onNextObject (err, doc) { return this.destroy(); } - var opts = this.query.options; - - if (!opts.populate) { - return true === opts.lean - ? emit(this, doc) - : createAndEmit(this, doc); + if (this.query.options && true === this.query.options.lean) { + this.emit('data', doc); + + // trampoline management + if (T_IDLE === this._inline) { + // no longer in trampoline. restart it. + this._next(); + } else { + // in a trampoline. tell __next that its + // ok to continue jumping. + this._inline = T_CONT; + } + return; } - var self = this; - var pop = helpers.preparePopulationOptions(self.query, self.query.options); - - self.query.model.populate(doc, pop, function (err, doc) { - if (err) return self.destroy(err); - return true === opts.lean - ? emit(self, doc) - : createAndEmit(self, doc); - }) -} + var instance = new this.query.model(undefined, this._fields, true); -function createAndEmit (self, doc) { - var instance = new self.query.model(undefined, self._fields, true); - instance.init(doc, function (err) { + var self = this; + instance.init(doc, this.query, function (err) { if (err) return self.destroy(err); - emit(self, instance); + self.emit('data', instance); + + // trampoline management + if (T_IDLE === self._inline) { + // no longer in trampoline. restart it. + self._next(); + } else + // in a trampoline. tell __next that its + // ok to continue jumping. + self._inline = T_CONT; }); } -/*! - * Emit a data event and manage the trampoline state - */ - -function emit (self, doc) { - self.emit('data', self._transform(doc)); - - // trampoline management - if (T_IDLE === self._inline) { - // no longer in trampoline. restart it. - self._next(); - } else { - // in a trampoline. tell __next that its - // ok to continue jumping. - self._inline = T_CONT; - } -} - /** * Pauses this stream. * @@ -323,6 +293,13 @@ QueryStream.prototype.destroy = function (err) { * * query.stream().pipe(writeStream [, options]) * + * This could be particularily useful if you are, for example, setting up an API for a service and want to stream out the docs based on some criteria. We could first pipe the QueryStream into a sort of filter that formats the stream as an array before passing on the document to an http response. + * + * var format = new ArrayFormatter; + * Events.find().stream().pipe(format).pipe(res); + * + * As long as ArrayFormat implements the WriteStream API we can stream large formatted result sets out to the client. See this [gist](https://gist.github.com/1403797) for a hacked example. + * * @method pipe * @memberOf QueryStream * @see NodeJS http://nodejs.org/api/stream.html diff --git a/node_modules/mongoose/lib/schema.js b/node_modules/mongoose/lib/schema.js index b4bdcfa..cc455ab 100644 --- a/node_modules/mongoose/lib/schema.js +++ b/node_modules/mongoose/lib/schema.js @@ -24,12 +24,10 @@ var EventEmitter = require('events').EventEmitter * ####Options: * * - [autoIndex](/docs/guide.html#autoIndex): bool - defaults to true - * - [bufferCommands](/docs/guide.html#bufferCommands): bool - defaults to true * - [capped](/docs/guide.html#capped): bool - defaults to false * - [collection](/docs/guide.html#collection): string - no default * - [id](/docs/guide.html#id): bool - defaults to true * - [_id](/docs/guide.html#_id): bool - defaults to true - * - `minimize`: bool - controls [document#toObject](#document_Document-toObject) behavior when called manually - defaults to true * - [read](/docs/guide.html#read): string * - [safe](/docs/guide.html#safe): bool - defaults to true. * - [shardKey](/docs/guide.html#shardKey): bool - defaults to `null` @@ -37,6 +35,7 @@ var EventEmitter = require('events').EventEmitter * - [toJSON](/docs/guide.html#toJSON) - object - no default * - [toObject](/docs/guide.html#toObject) - object - no default * - [versionKey](/docs/guide.html#versionKey): bool - defaults to "__v" + * - `minimize`: bool - controls [document#toObject](#document_Document-toObject) behavior when called manually - defaults to true * * ####Note: * @@ -82,18 +81,21 @@ function Schema (obj, options) { if (autoid) { this.virtual('id').get(idGetter); } -} + + // versioning not directly added to schema b/c we only want + // it in the top level document, not embedded ones. +}; /*! * Returns this documents _id cast to a string. */ function idGetter () { - if (this.$__._id) { - return this.$__._id; + if (this.__id) { + return this.__id; } - return this.$__._id = null == this._id + return this.__id = null == this._id ? null : String(this._id); } @@ -151,7 +153,6 @@ Schema.prototype.defaultOptions = function (options) { options = utils.options({ strict: true - , bufferCommands: true , capped: false // { size, max, autoIndexId } , versionKey: '__v' , minimize: true @@ -210,7 +211,7 @@ Schema.prototype.add = function add (obj, prefix) { * * Keys in this object are names that are rejected in schema declarations b/c they conflict with mongoose functionality. Using these key name will throw an error. * - * on, emit, _events, db, init, isNew, errors, schema, options, modelName, collection, _pres, _posts, toObject + * on, emit, _events, db, init, isNew, errors, schema, options, modelName, collection, _pres, _posts * * _NOTE:_ Use of these terms as method names is permitted, but play at your own risk, as they may be existing mongoose document methods you are stomping on. * @@ -229,7 +230,6 @@ reserved.schema = reserved.options = reserved.modelName = reserved.collection = -reserved.toObject = reserved.emit = // EventEmitter reserved._events = // EventEmitter reserved._pres = reserved._posts = 1 // hooks.js @@ -670,21 +670,6 @@ Schema.prototype.get = function (key) { return this.options[key]; } -/** - * The allowed index types - * - * @static indexTypes - * @receiver Schema - * @api public - */ - -var indexTypes = '2d 2dsphere hashed text'.split(' '); - -Object.defineProperty(Schema, 'indexTypes', { - get: function () { return indexTypes } - , set: function () { throw new Error('Cannot overwrite Schema.indexTypes') } -}) - /** * Compiles indexes from fields and schema-level indexes * @@ -692,51 +677,35 @@ Object.defineProperty(Schema, 'indexTypes', { */ Schema.prototype.indexes = function () { - 'use strict'; - var indexes = [] - , seenSchemas = [] + , seenSchemas = []; + collectIndexes(this); + return indexes; function collectIndexes (schema, prefix) { if (~seenSchemas.indexOf(schema)) return; seenSchemas.push(schema); + var index; + var paths = schema.paths; prefix = prefix || ''; - var key, path, index, field, isObject, options, type; - var keys = Object.keys(schema.paths); - - for (var i = 0; i < keys.length; ++i) { - key = keys[i]; - path = schema.paths[key]; - - if (path instanceof Types.DocumentArray) { - collectIndexes(path.schema, key + '.'); - } else { - index = path._index; - - if (false !== index && null != index) { - field = {}; - isObject = utils.isObject(index); - options = isObject ? index : {}; - type = 'string' == typeof index ? index : - isObject ? index.type : - false; - - if (type && ~Schema.indexTypes.indexOf(type)) { - field[prefix + key] = type; - } else { - field[prefix + key] = 1; + for (var i in paths) { + if (paths[i]) { + if (paths[i] instanceof Types.DocumentArray) { + collectIndexes(paths[i].schema, i + '.'); + } else { + index = paths[i]._index; + + if (index !== false && index !== null){ + var field = {}; + field[prefix + i] = '2d' === index ? index : 1; + var options = 'Object' === index.constructor.name ? index : {}; + if (!('background' in options)) options.background = true; + indexes.push([field, options]); } - - delete options.type; - if (!('background' in options)) { - options.background = true; - } - - indexes.push([field, options]); } } } @@ -861,7 +830,9 @@ module.exports = exports = Schema; // require down here because of reference issues /** - * The various built-in Mongoose Schema Types. + * The various Mongoose Schema Types. + * + * ####Example: * * ####Example: * @@ -870,14 +841,14 @@ module.exports = exports = Schema; * * ####Types: * - * - [String](#schema-string-js) - * - [Number](#schema-number-js) - * - [Boolean](#schema-boolean-js) | Bool - * - [Array](#schema-array-js) - * - [Buffer](#schema-buffer-js) - * - [Date](#schema-date-js) - * - [ObjectId](#schema-objectid-js) | Oid - * - [Mixed](#schema-mixed-js) + * - String + * - Number + * - Boolean | Bool + * - Array + * - Buffer + * - Date + * - ObjectId | Oid + * - Mixed * * Using this exposed access to the `Mixed` SchemaType, we can use them in our schema. * diff --git a/node_modules/mongoose/lib/schema/array.js b/node_modules/mongoose/lib/schema/array.js index 749a906..83455ed 100644 --- a/node_modules/mongoose/lib/schema/array.js +++ b/node_modules/mongoose/lib/schema/array.js @@ -17,8 +17,7 @@ var SchemaType = require('../schematype') , EmbeddedDoc = require('../types').Embedded , Mixed = require('./mixed') , Query = require('../query') - , utils = require('../utils') - , isMongooseObject = utils.isMongooseObject + , isMongooseObject = require('../utils').isMongooseObject /** * Array SchemaType constructor @@ -37,23 +36,15 @@ function SchemaArray (key, cast, options) { if ('Object' === cast.constructor.name) { if (cast.type) { // support { type: Woot } - castOptions = utils.clone(cast); // do not alter user arguments - delete castOptions.type; + castOptions = cast; cast = cast.type; + delete castOptions.type; } else { cast = Mixed; } } - // support { type: 'String' } - var name = 'string' == typeof cast - ? cast - : cast.name; - - var caster = name in Types - ? Types[name] - : cast; - + var caster = cast.name in Types ? Types[cast.name] : cast; this.casterConstructor = caster; this.caster = new caster(null, castOptions); if (!(this.caster instanceof EmbeddedDoc)) { @@ -191,18 +182,6 @@ function castToNumber (val) { return Types.Number.prototype.cast.call(this, val); } -function castArray (arr, self) { - self || (self = this); - - arr.forEach(function (v, i) { - if (Array.isArray(v)) { - castArray(v, self); - } else { - arr[i] = castToNumber.call(self, v); - } - }); -} - SchemaArray.prototype.$conditionalHandlers = { '$all': function handle$all (val) { if (!Array.isArray(val)) { @@ -273,36 +252,10 @@ SchemaArray.prototype.$conditionalHandlers = { val[type][i] = castToNumber.call(this, item); } }) - } else if (val.$geometry) { - switch (val.$geometry.type) { - case 'Polygon': - case 'LineString': - case 'Point': - val.$geometry.coordinates.forEach(castArray); - break; - default: - // ignore unknowns - break; - } } return val; } - , '$geoIntersects': function (val) { - var geo = val.$geometry; - if (!geo) return; - - switch (val.$geometry.type) { - case 'Polygon': - case 'LineString': - case 'Point': - val.$geometry.coordinates.forEach(castArray); - break; - default: - // ignore unknowns - break; - } - } , '$maxDistance': castToNumber }; diff --git a/node_modules/mongoose/lib/schema/boolean.js b/node_modules/mongoose/lib/schema/boolean.js index cc16b7a..05635bc 100644 --- a/node_modules/mongoose/lib/schema/boolean.js +++ b/node_modules/mongoose/lib/schema/boolean.js @@ -1,3 +1,4 @@ + /*! * Module dependencies. */ @@ -40,12 +41,10 @@ SchemaBoolean.prototype.checkRequired = function (value) { */ SchemaBoolean.prototype.cast = function (value) { - if (null === value) return value; - if ('0' === value) return false; - if ('true' === value) return true; - if ('false' === value) return false; - return !! value; -} + if (value === null) return value; + if (value === '0') return false; + return !!value; +}; /*! * ignore diff --git a/node_modules/mongoose/lib/schema/buffer.js b/node_modules/mongoose/lib/schema/buffer.js index ca89864..64321f5 100644 --- a/node_modules/mongoose/lib/schema/buffer.js +++ b/node_modules/mongoose/lib/schema/buffer.js @@ -6,9 +6,7 @@ var SchemaType = require('../schematype') , CastError = SchemaType.CastError , MongooseBuffer = require('../types').Buffer , Binary = MongooseBuffer.Binary - , Query = require('../query') - , utils = require('../utils') - , Document + , Query = require('../query'); /** * Buffer SchemaType constructor @@ -35,12 +33,8 @@ SchemaBuffer.prototype.__proto__ = SchemaType.prototype; * @api private */ -SchemaBuffer.prototype.checkRequired = function (value, doc) { - if (SchemaType._isRef(this, value, doc, true)) { - return null != value; - } else { - return !!(value && value.length); - } +SchemaBuffer.prototype.checkRequired = function (value) { + return !!(value && value.length); }; /** @@ -53,37 +47,7 @@ SchemaBuffer.prototype.checkRequired = function (value, doc) { */ SchemaBuffer.prototype.cast = function (value, doc, init) { - if (SchemaType._isRef(this, value, doc, init)) { - // wait! we may need to cast this to a document - - // lazy load - Document || (Document = require('./../document')); - - if (value instanceof Document || null == value) { - return value; - } - - // setting a populated path - if (Buffer.isBuffer(value)) { - return value; - } else if (!utils.isObject(value)) { - throw new CastError('buffer', value, this.path); - } - - // Handle the case where user directly sets a populated - // path to a plain object; cast to the Model used in - // the population query. - var path = doc.$__fullPath(this.path); - var owner = doc.ownerDocument ? doc.ownerDocument() : doc; - var pop = owner.populated(path, true); - var ret = new pop.options.model(value); - return ret; - } - - // documents - if (value && value._id) { - value = value._id; - } + if (SchemaType._isRef(this, value, init)) return value; if (Buffer.isBuffer(value)) { if (!(value instanceof MongooseBuffer)) { @@ -95,8 +59,6 @@ SchemaBuffer.prototype.cast = function (value, doc, init) { return new MongooseBuffer(value.value(true), [this.path, doc]); } - if (null === value) return value; - var type = typeof value; if ('string' == type || 'number' == type || Array.isArray(value)) { return new MongooseBuffer(value, [this.path, doc]); diff --git a/node_modules/mongoose/lib/schema/date.js b/node_modules/mongoose/lib/schema/date.js index 86e4062..fecd7d9 100644 --- a/node_modules/mongoose/lib/schema/date.js +++ b/node_modules/mongoose/lib/schema/date.js @@ -1,10 +1,10 @@ + /*! * Module requirements. */ -var SchemaType = require('../schematype'); -var CastError = SchemaType.CastError; -var utils = require('../utils'); +var SchemaType = require('../schematype') + , CastError = SchemaType.CastError; /** * Date SchemaType constructor. @@ -25,47 +25,6 @@ function SchemaDate (key, options) { SchemaDate.prototype.__proto__ = SchemaType.prototype; -/** - * Declares a TTL index (rounded to the nearest second) for _Date_ types only. - * - * This sets the `expiresAfterSeconds` index option available in MongoDB >= 2.1.2. - * This index type is only compatible with Date types. - * - * ####Example: - * - * // expire in 24 hours - * new Schema({ createdAt: { type: Date, expires: 60*60*24 }}); - * - * `expires` utilizes the `ms` module from [guille](https://github.com/guille/) allowing us to use a friendlier syntax: - * - * ####Example: - * - * // expire in 24 hours - * new Schema({ createdAt: { type: Date, expires: '24h' }}); - * - * // expire in 1.5 hours - * new Schema({ createdAt: { type: Date, expires: '1.5h' }}); - * - * // expire in 7 days - * var schema = new Schema({ createdAt: Date }); - * schema.path('createdAt').expires('7d'); - * - * @param {Number|String} when - * @added 3.0.0 - * @return {SchemaType} this - * @api public - */ - -SchemaDate.prototype.expires = function (when) { - if (!this._index || 'Object' !== this._index.constructor.name) { - this._index = {}; - } - - this._index.expires = when; - utils.expires(this._index); - return this; -}; - /** * Required validator for date * diff --git a/node_modules/mongoose/lib/schema/documentarray.js b/node_modules/mongoose/lib/schema/documentarray.js index 3b02887..93f2455 100644 --- a/node_modules/mongoose/lib/schema/documentarray.js +++ b/node_modules/mongoose/lib/schema/documentarray.js @@ -27,7 +27,7 @@ function DocumentArray (key, schema, options) { } EmbeddedDocument.prototype.__proto__ = Subdocument.prototype; - EmbeddedDocument.prototype.$__setSchema(schema); + EmbeddedDocument.prototype._setSchema(schema); EmbeddedDocument.schema = schema; // apply methods @@ -130,7 +130,7 @@ DocumentArray.prototype.cast = function (value, doc, init, prev) { while (i--) { if (!(value[i] instanceof Subdocument) && value[i]) { if (init) { - selected || (selected = scopePaths(this, doc.$__.selected, init)); + selected || (selected = scopePaths(this, doc._selected, init)); subdoc = new this.casterConstructor(null, value, true, selected); value[i] = subdoc.init(value[i]); } else { diff --git a/node_modules/mongoose/lib/schema/mixed.js b/node_modules/mongoose/lib/schema/mixed.js index 6e2e4d3..f22ebb9 100644 --- a/node_modules/mongoose/lib/schema/mixed.js +++ b/node_modules/mongoose/lib/schema/mixed.js @@ -4,7 +4,6 @@ */ var SchemaType = require('../schematype'); -var utils = require('../utils'); /** * Mixed SchemaType constructor. @@ -16,19 +15,12 @@ var utils = require('../utils'); */ function Mixed (path, options) { - if (options && options.default) { - var def = options.default; - if (Array.isArray(def) && 0 === def.length) { - // make sure empty array defaults are handled - options.default = Array; - } else if (!options.shared && - utils.isObject(def) && - 0 === Object.keys(def).length) { - // prevent odd "shared" objects between documents - options.default = function () { - return {} - } - } + // make sure empty array defaults are handled + if (options && + options.default && + Array.isArray(options.default) && + 0 === options.default.length) { + options.default = Array; } SchemaType.call(this, path, options); diff --git a/node_modules/mongoose/lib/schema/number.js b/node_modules/mongoose/lib/schema/number.js index d80f2e8..0ac633c 100644 --- a/node_modules/mongoose/lib/schema/number.js +++ b/node_modules/mongoose/lib/schema/number.js @@ -4,8 +4,6 @@ var SchemaType = require('../schematype') , CastError = SchemaType.CastError - , utils = require('../utils') - , Document /** * Number SchemaType constructor. @@ -32,8 +30,8 @@ SchemaNumber.prototype.__proto__ = SchemaType.prototype; * @api private */ -SchemaNumber.prototype.checkRequired = function checkRequired (value, doc) { - if (SchemaType._isRef(this, value, doc, true)) { +SchemaNumber.prototype.checkRequired = function checkRequired (value) { + if (SchemaType._isRef(this, value, true)) { return null != value; } else { return typeof value == 'number' || value instanceof Number; @@ -112,45 +110,17 @@ SchemaNumber.prototype.max = function (value, message) { */ SchemaNumber.prototype.cast = function (value, doc, init) { - if (SchemaType._isRef(this, value, doc, init)) { - // wait! we may need to cast this to a document - - // lazy load - Document || (Document = require('./../document')); - - if (value instanceof Document || null == value) { - return value; - } - - // setting a populated path - if ('number' == typeof value) { - return value; - } else if (Buffer.isBuffer(value) || !utils.isObject(value)) { - throw new CastError('number', value, this.path); - } - - // Handle the case where user directly sets a populated - // path to a plain object; cast to the Model used in - // the population query. - var path = doc.$__fullPath(this.path); - var owner = doc.ownerDocument ? doc.ownerDocument() : doc; - var pop = owner.populated(path, true); - return new pop.options.model(value); - } - - var val = value && value._id - ? value._id // documents - : value; - - if (!isNaN(val)){ - if (null === val) return val; - if ('' === val) return null; - if ('string' == typeof val) val = Number(val); - if (val instanceof Number) return val - if ('number' == typeof val) return val; - if (val.toString && !Array.isArray(val) && - val.toString() == Number(val)) { - return new Number(val) + if (SchemaType._isRef(this, value, init)) return value; + + if (!isNaN(value)){ + if (null === value) return value; + if ('' === value) return null; + if ('string' == typeof value) value = Number(value); + if (value instanceof Number) return value + if ('number' == typeof value) return value; + if (value.toString && !Array.isArray(value) && + value.toString() == Number(value)) { + return new Number(value) } } @@ -167,7 +137,7 @@ function handleSingle (val) { function handleArray (val) { var self = this; - return val.map(function (m) { + return val.map( function (m) { return self.cast(m) }); } diff --git a/node_modules/mongoose/lib/schema/objectid.js b/node_modules/mongoose/lib/schema/objectid.js index 9dadd31..05762fe 100644 --- a/node_modules/mongoose/lib/schema/objectid.js +++ b/node_modules/mongoose/lib/schema/objectid.js @@ -5,9 +5,8 @@ var SchemaType = require('../schematype') , CastError = SchemaType.CastError , driver = global.MONGOOSE_DRIVER_PATH || './../drivers/node-mongodb-native' - , oid = require('../types/objectid') - , utils = require('../utils') - , Document + , oid = require('../types/objectid'); + /** * ObjectId SchemaType constructor. @@ -34,8 +33,8 @@ ObjectId.prototype.__proto__ = SchemaType.prototype; * @api private */ -ObjectId.prototype.checkRequired = function checkRequired (value, doc) { - if (SchemaType._isRef(this, value, doc, true)) { +ObjectId.prototype.checkRequired = function checkRequired (value) { + if (SchemaType._isRef(this, value, true)) { return null != value; } else { return value instanceof oid; @@ -46,37 +45,13 @@ ObjectId.prototype.checkRequired = function checkRequired (value, doc) { * Casts to ObjectId * * @param {Object} value - * @param {Object} doc + * @param {Object} scope * @param {Boolean} init whether this is an initialization cast * @api private */ -ObjectId.prototype.cast = function (value, doc, init) { - if (SchemaType._isRef(this, value, doc, init)) { - // wait! we may need to cast this to a document - - // lazy load - Document || (Document = require('./../document')); - - if (value instanceof Document || null == value) { - return value; - } - - // setting a populated path - if (value instanceof oid) { - return value; - } else if (Buffer.isBuffer(value) || !utils.isObject(value)) { - throw new CastError('ObjectId', value, this.path); - } - - // Handle the case where user directly sets a populated - // path to a plain object; cast to the Model used in - // the population query. - var path = doc.$__fullPath(this.path); - var owner = doc.ownerDocument ? doc.ownerDocument() : doc; - var pop = owner.populated(path, true); - return new pop.options.model(value); - } +ObjectId.prototype.cast = function (value, scope, init) { + if (SchemaType._isRef(this, value, init)) return value; if (value === null) return value; @@ -146,7 +121,7 @@ ObjectId.prototype.castForQuery = function ($conditional, val) { /** * Adds an auto-generated ObjectId default if turnOn is true. * @param {Boolean} turnOn auto generated ObjectId defaults - * @api public + * @api private */ ObjectId.prototype.auto = function (turnOn) { @@ -165,7 +140,7 @@ function defaultId () { }; function resetId (v) { - this.$__._id = null; + this.__id = null; return v; } diff --git a/node_modules/mongoose/lib/schema/string.js b/node_modules/mongoose/lib/schema/string.js index c4eb39a..d1bef26 100644 --- a/node_modules/mongoose/lib/schema/string.js +++ b/node_modules/mongoose/lib/schema/string.js @@ -4,9 +4,7 @@ */ var SchemaType = require('../schematype') - , CastError = SchemaType.CastError - , utils = require('../utils') - , Document + , CastError = SchemaType.CastError; /** * String SchemaType constructor. @@ -179,8 +177,8 @@ SchemaString.prototype.match = function match (regExp) { * @api private */ -SchemaString.prototype.checkRequired = function checkRequired (value, doc) { - if (SchemaType._isRef(this, value, doc, true)) { +SchemaString.prototype.checkRequired = function checkRequired (value) { + if (SchemaType._isRef(this, value, true)) { return null != value; } else { return (value instanceof String || typeof value == 'string') && value.length; @@ -193,48 +191,10 @@ SchemaString.prototype.checkRequired = function checkRequired (value, doc) { * @api private */ -SchemaString.prototype.cast = function (value, doc, init) { - if (SchemaType._isRef(this, value, doc, init)) { - // wait! we may need to cast this to a document - - // lazy load - Document || (Document = require('./../document')); - - if (value instanceof Document || null == value) { - return value; - } - - // setting a populated path - if ('string' == typeof value) { - return value; - } else if (Buffer.isBuffer(value) || !utils.isObject(value)) { - throw new CastError('string', value, this.path); - } - - // Handle the case where user directly sets a populated - // path to a plain object; cast to the Model used in - // the population query. - var path = doc.$__fullPath(this.path); - var owner = doc.ownerDocument ? doc.ownerDocument() : doc; - var pop = owner.populated(path, true); - return new pop.options.model(value); - } - - if (value === null) { - return value; - } - - if ('undefined' !== typeof value) { - // handle documents being passed - if (value._id && 'string' == typeof value._id) { - return value._id; - } - if (value.toString) { - return value.toString(); - } - } - - +SchemaString.prototype.cast = function (value, scope, init) { + if (SchemaType._isRef(this, value, init)) return value; + if (value === null) return value; + if ('undefined' !== typeof value && value.toString) return value.toString(); throw new CastError('string', value, this.path); }; diff --git a/node_modules/mongoose/lib/schematype.js b/node_modules/mongoose/lib/schematype.js index 55ed4f1..9a1edb9 100644 --- a/node_modules/mongoose/lib/schematype.js +++ b/node_modules/mongoose/lib/schematype.js @@ -98,9 +98,6 @@ SchemaType.prototype.default = function (val) { * ####Example: * * var s = new Schema({ name: { type: String, index: true }) - * var s = new Schema({ loc: { type: [Number], index: 'hashed' }) - * var s = new Schema({ loc: { type: [Number], index: '2d', sparse: true }) - * var s = new Schema({ loc: { type: [Number], index: { type: '2dsphere', sparse: true }}) * var s = new Schema({ date: { type: Date, index: { unique: true, expires: '1d' }}) * Schema.path('my.path').index(true); * Schema.path('my.date').index({ expires: 60 }); @@ -112,7 +109,7 @@ SchemaType.prototype.default = function (val) { * * [Direction doesn't matter for single key indexes](http://www.mongodb.org/display/DOCS/Indexes#Indexes-CompoundKeysIndexes) * - * @param {Object|Boolean|String} options + * @param {Object|Boolean} options * @return {SchemaType} this * @api public */ @@ -139,10 +136,8 @@ SchemaType.prototype.index = function (options) { */ SchemaType.prototype.unique = function (bool) { - if (null == this._index || 'boolean' == typeof this._index) { + if (!this._index || 'Object' !== this._index.constructor.name) { this._index = {}; - } else if ('string' == typeof this._index) { - this._index = { type: this._index }; } this._index.unique = bool; @@ -163,16 +158,55 @@ SchemaType.prototype.unique = function (bool) { */ SchemaType.prototype.sparse = function (bool) { - if (null == this._index || 'boolean' == typeof this._index) { + if (!this._index || 'Object' !== this._index.constructor.name) { this._index = {}; - } else if ('string' == typeof this._index) { - this._index = { type: this._index }; } this._index.sparse = bool; return this; }; +/** + * Declares a TTL index (rounded to the nearest second) for _Date_ types only. + * + * This sets the `expiresAfterSeconds` index option available in MongoDB >= 2.1.2. + * This index type is only compatible with Date types. + * + * ####Example: + * + * // expire in 24 hours + * new Schema({ createdAt: { type: Date, expires: 60*60*24 }}); + * + * `expires` utilizes the `ms` module from [guille](https://github.com/guille/) allowing us to use a friendlier syntax: + * + * ####Example: + * + * // expire in 24 hours + * new Schema({ createdAt: { type: Date, expires: '24h' }}); + * + * // expire in 1.5 hours + * new Schema({ createdAt: { type: Date, expires: '1.5h' }}); + * + * // expire in 7 days + * var schema = new Schema({ createdAt: Date }); + * schema.path('createdAt').expires('7d'); + * + * @param {Number|String} when + * @added 3.0.0 + * @return {SchemaType} this + * @api public + */ + +SchemaType.prototype.expires = function (when) { + if (!this._index || 'Object' !== this._index.constructor.name) { + this._index = {}; + } + + this._index.expires = when; + utils.expires(this._index); + return this; +}; + /** * Adds a setter to this schematype. * @@ -248,7 +282,7 @@ SchemaType.prototype.sparse = function (bool) { SchemaType.prototype.set = function (fn) { if ('function' != typeof fn) - throw new TypeError('A setter must be a function.'); + throw new Error('A setter must be a function.'); this.setters.push(fn); return this; }; @@ -317,7 +351,7 @@ SchemaType.prototype.set = function (fn) { SchemaType.prototype.get = function (fn) { if ('function' != typeof fn) - throw new TypeError('A getter must be a function.'); + throw new Error('A getter must be a function.'); this.getters.push(fn); return this; }; @@ -433,7 +467,7 @@ SchemaType.prototype.required = function (required) { if ('isSelected' in this && !this.isSelected(self.path) && !this.isModified(self.path)) return true; - return self.checkRequired(v, this); + return self.checkRequired(v); } if (false === required) { @@ -479,11 +513,7 @@ SchemaType.prototype.getDefault = function (scope, init) { */ SchemaType.prototype.applySetters = function (value, scope, init, priorVal) { - if (SchemaType._isRef(this, value, scope, init)) { - return init - ? value - : this.cast(value, scope, init, priorVal); - } + if (SchemaType._isRef(this, value, init)) return value; var v = value , setters = this.setters @@ -491,7 +521,9 @@ SchemaType.prototype.applySetters = function (value, scope, init, priorVal) { if (!len) { if (null === v || undefined === v) return v; - return this.cast(v, scope, init, priorVal) + return init + ? v // if we just initialized we dont recast + : this.cast(v, scope, init, priorVal) } while (len--) { @@ -515,7 +547,7 @@ SchemaType.prototype.applySetters = function (value, scope, init, priorVal) { */ SchemaType.prototype.applyGetters = function (value, scope) { - if (SchemaType._isRef(this, value, scope, true)) return value; + if (SchemaType._isRef(this, value, true)) return value; var v = value , getters = this.getters @@ -568,12 +600,12 @@ SchemaType.prototype.doValidate = function (value, fn, scope) { if (!count) return fn(null); - function validate (ok, msg, val) { + function validate (val, msg) { if (err) return; - if (ok === undefined || ok) { + if (val === undefined || val) { --count || fn(null); } else { - fn(err = new ValidatorError(path, msg, val)); + fn(err = new ValidatorError(path, msg)); } } @@ -582,14 +614,14 @@ SchemaType.prototype.doValidate = function (value, fn, scope) { , message = v[1]; if (validator instanceof RegExp) { - validate(validator.test(value), message, value); + validate(validator.test(value), message); } else if ('function' === typeof validator) { if (2 === validator.length) { - validator.call(scope, value, function (ok) { - validate(ok, message, value); + validator.call(scope, value, function (val) { + validate(val, message); }); } else { - validate(validator.call(scope, value), message, value); + validate(validator.call(scope, value), message); } } }); @@ -600,33 +632,15 @@ SchemaType.prototype.doValidate = function (value, fn, scope) { * * @param {SchemaType} self * @param {Object} value - * @param {Document} doc * @param {Boolean} init * @return {Boolean} * @api private */ -SchemaType._isRef = function (self, value, doc, init) { - // fast path - var ref = init && self.options && self.options.ref; - - if (!ref && doc && doc.$__fullPath) { - // checks for - // - this populated with adhoc model and no ref was set in schema OR - // - setting / pushing values after population - var path = doc.$__fullPath(self.path); - var owner = doc.ownerDocument ? doc.ownerDocument() : doc; - ref = owner.populated(path); - } - - if (ref) { +SchemaType._isRef = function (self, value, init) { + if (init && self.options && self.options.ref) { if (null == value) return true; - if (!Buffer.isBuffer(value) && // buffers are objects too - 'Binary' != value._bsontype // raw binary value from the db - && utils.isObject(value) // might have deselected _id in population query - ) { - return true; - } + if (value._id && value._id.constructor.name === self.instance) return true; } return false; diff --git a/node_modules/mongoose/lib/types/array.js b/node_modules/mongoose/lib/types/array.js index f45f0b4..294c989 100644 --- a/node_modules/mongoose/lib/types/array.js +++ b/node_modules/mongoose/lib/types/array.js @@ -6,8 +6,6 @@ var EmbeddedDocument = require('./embedded'); var Document = require('../document'); var ObjectId = require('./objectid'); -var utils = require('../utils'); -var isMongooseObject = utils.isMongooseObject; /** * Mongoose Array constructor. @@ -74,39 +72,11 @@ MongooseArray.prototype._parent; */ MongooseArray.prototype._cast = function (value) { - var owner = this._owner; - var populated = false; - var Model; - - if (this._parent) { - // if a populated array, we must cast to the same model - // instance as specified in the original query. - if (!owner) { - owner = this._owner = this._parent.ownerDocument - ? this._parent.ownerDocument() - : this._parent; - } - - populated = owner.populated(this._path, true); - } - - if (populated && null != value) { - // cast to the populated Models schema - var Model = populated.options.model; - - // only objects are permitted so we can safely assume that - // non-objects are to be interpreted as _id - if (Buffer.isBuffer(value) || - value instanceof ObjectId || !utils.isObject(value)) { - value = { _id: value }; - } - - value = new Model(value); - return this._schema.caster.cast(value, this._parent, true) - } + var cast = this._schema.caster.cast + , doc = this._parent; - return this._schema.caster.cast(value, this._parent, false) -} + return cast.call(null, value, doc); +}; /** * Marks this array as modified. @@ -133,6 +103,7 @@ MongooseArray.prototype._markModified = function (elem, embeddedPath) { // directly set an index dirtyPath = dirtyPath + '.' + elem; } + } parent.markModified(dirtyPath); } @@ -190,52 +161,6 @@ MongooseArray.prototype._registerAtomic = function (op, val) { return this; }; -/** - * Depopulates stored atomic operation values as necessary for direct insertion to MongoDB. - * - * If no atomics exist, we return all array values after conversion. - * - * @return {Array} - * @method $__getAtomics - * @memberOf MongooseArray - * @api private - */ - -MongooseArray.prototype.$__getAtomics = function () { - var ret = []; - var keys = Object.keys(this._atomics); - var i = keys.length; - - if (0 === i) { - ret[0] = ['$set', this.toObject({ depopulate: 1 })]; - return ret; - } - - while (i--) { - var op = keys[i]; - var val = this._atomics[op]; - - // the atomic values which are arrays are not MongooseArrays. we - // need to convert their elements as if they were MongooseArrays - // to handle populated arrays versus DocumentArrays properly. - if (isMongooseObject(val)) { - val = val.toObject({ depopulate: 1 }); - } else if (Array.isArray(val)) { - val = this.toObject.call(val, { depopulate: 1 }); - } else if (val.valueOf) { - val = val.valueOf(); - } - - if ('$addToSet' == op) { - val = { $each: val } - } - - ret.push([op, val]); - } - - return ret; -} - /** * Returns the number of pending atomic operations to send to the db for this array. * @@ -419,24 +344,29 @@ MongooseArray.prototype.shift = function () { }; /** - * Pulls items from the array atomically. + * Removes items from an array atomically * * ####Examples: * - * doc.array.pull(ObjectId) - * doc.array.pull({ _id: 'someId' }) - * doc.array.pull(36) - * doc.array.pull('tag 1', 'tag 2') - * - * To remove a document from a subdocument array we may pass an object with a matching `_id`. + * doc.array.remove(ObjectId) + * doc.array.remove('tag 1', 'tag 2') * - * doc.subdocs.push({ _id: 4815162342 }) - * doc.subdocs.pull({ _id: 4815162342 }) // removed - * - * Or we may passing the _id directly and let mongoose take care of it. - * - * doc.subdocs.push({ _id: 4815162342 }) - * doc.subdocs.pull(4815162342); // works + * @param {Object} [args...] values to remove + * @see mongodb http://www.mongodb.org/display/DOCS/Updating/#Updating-%24pull + * @api public + */ + +MongooseArray.prototype.remove = function () { + var args = [].map.call(arguments, this._cast, this); + if (args.length == 1) + this.pull(args[0]); + else + this.pull.apply(this, args); + return args; +}; + +/** + * Pulls items from the array atomically. * * @param {any} [args...] * @see mongodb http://www.mongodb.org/display/DOCS/Updating/#Updating-%24pull @@ -470,18 +400,6 @@ MongooseArray.prototype.pull = function () { return this; }; -/** - * Alias of [pull](#types_array_MongooseArray-pull) - * - * @see MongooseArray#pull #types_array_MongooseArray-pull - * @see mongodb http://www.mongodb.org/display/DOCS/Updating/#Updating-%24pull - * @api public - * @memberOf MongooseArray - * @method remove - */ - -MongooseArray.prototype.remove = MongooseArray.prototype.pull; - /** * Wraps [`Array#splice`](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/splice) with proper change tracking and casting. * @@ -632,17 +550,17 @@ MongooseArray.prototype.set = function set (i, val) { */ MongooseArray.prototype.toObject = function (options) { - if (options && options.depopulate) { + if (options && options.depopulate && this[0] instanceof Document) { return this.map(function (doc) { - // this is called on populated arrays too - return doc instanceof Document - ? doc._id - : doc + return doc._id; }); } - return this.slice() -} + // return this.slice()? + return this.map(function (doc) { + return doc; + }); +}; /** * Helper for console.log diff --git a/node_modules/mongoose/lib/types/documentarray.js b/node_modules/mongoose/lib/types/documentarray.js index 1820a6e..b888965 100644 --- a/node_modules/mongoose/lib/types/documentarray.js +++ b/node_modules/mongoose/lib/types/documentarray.js @@ -7,7 +7,6 @@ var MongooseArray = require('./array') , driver = global.MONGOOSE_DRIVER_PATH || '../drivers/node-mongodb-native' , ObjectId = require(driver + '/objectid') , ObjectIdSchema = require('../schema/objectid') - , utils = require('../utils') , util = require('util') /** @@ -57,22 +56,8 @@ MongooseDocumentArray.prototype.__proto__ = MongooseArray.prototype; */ MongooseDocumentArray.prototype._cast = function (value) { - if (value instanceof this._schema.casterConstructor) { - if (!(value.__parent && value.__parentArray)) { - // value may have been created using array.create() - value.__parent = this._parent; - value.__parentArray = this; - } + if (value instanceof this._schema.casterConstructor) return value; - } - - // handle cast('string') or cast(ObjectId) etc. - // only objects are permitted so we can safely assume that - // non-objects are to be interpreted as _id - if (Buffer.isBuffer(value) || - value instanceof ObjectId || !utils.isObject(value)) { - value = { _id: value }; - } return new this._schema.casterConstructor(value, this); }; @@ -120,14 +105,13 @@ MongooseDocumentArray.prototype.id = function (id) { * * _Each sub-document is converted to a plain object by calling its `#toObject` method._ * - * @param {Object} [options] optional options to pass to each documents `toObject` method call during conversion * @return {Array} * @api public */ -MongooseDocumentArray.prototype.toObject = function (options) { +MongooseDocumentArray.prototype.toObject = function () { return this.map(function (doc) { - return doc && doc.toObject(options) || null; + return doc && doc.toObject() || null; }); }; diff --git a/node_modules/mongoose/lib/types/embedded.js b/node_modules/mongoose/lib/types/embedded.js index 6de36e6..3ebc842 100644 --- a/node_modules/mongoose/lib/types/embedded.js +++ b/node_modules/mongoose/lib/types/embedded.js @@ -54,7 +54,7 @@ EmbeddedDocument.prototype.__proto__ = Document.prototype; EmbeddedDocument.prototype.markModified = function (path) { if (!this.__parentArray) return; - this.$__.activePaths.modify(path); + this._activePaths.modify(path); if (this.isNew) { // Mark the WHOLE parent array as modified @@ -97,7 +97,7 @@ EmbeddedDocument.prototype.remove = function (fn) { if (!this.willRemove) { _id = this._doc._id; if (!_id) { - throw new Error('For your own good, Mongoose does not know ' + + throw new Error('For your own good, Mongoose does not know ' + 'how to remove an EmbeddedDocument that has no _id'); } this.__parentArray.pull({ _id: _id }); @@ -138,27 +138,14 @@ EmbeddedDocument.prototype.inspect = function () { * @api public */ -EmbeddedDocument.prototype.invalidate = function (path, err, val, first) { - if (!this.__parent) { - var msg = 'Unable to invalidate a subdocument that has not been added to an array.' - throw new Error(msg); - } - +EmbeddedDocument.prototype.invalidate = function (path, err, first) { + if (!this.__parent) return false; var index = this.__parentArray.indexOf(this); var parentPath = this.__parentArray._path; var fullPath = [parentPath, index, path].join('.'); - - // sniffing arguments: - // need to check if user passed a value to keep - // our error message clean. - if (2 < arguments.length) { - this.__parent.invalidate(fullPath, err, val); - } else { - this.__parent.invalidate(fullPath, err); - } - + this.__parent.invalidate(fullPath, err); if (first) - this.$__.validationError = this.ownerDocument().$__.validationError; + this._validationError = ownerDocument(this)._validationError; return true; } @@ -169,52 +156,20 @@ EmbeddedDocument.prototype.invalidate = function (path, err, val, first) { */ EmbeddedDocument.prototype.ownerDocument = function () { - if (this.$__.ownerDocument) { - return this.$__.ownerDocument; - } - - var parent = this.__parent; - if (!parent) return this; - - while (parent.__parent) { - parent = parent.__parent; - } - - return this.$__.ownerDocument = parent; + return ownerDocument(this); } -/** - * Returns the full path to this document. If optional `path` is passed, it is appended to the full path. +/*! + * Returns the top level document of this sub-document. * - * @param {String} [path] - * @return {String} - * @api private - * @method $__fullPath - * @memberOf EmbeddedDocument + * @return {Document} */ -EmbeddedDocument.prototype.$__fullPath = function (path) { - if (!this.$__.fullPath) { - var parent = this; - if (!parent.__parent) return path; - - var paths = []; - while (parent.__parent) { - paths.unshift(parent.__parentArray._path); - parent = parent.__parent; - } - - this.$__.fullPath = paths.join('.'); - - if (!this.$__.ownerDocument) { - // optimization - this.$__.ownerDocument = parent; - } - } - - return path - ? this.$__.fullPath + '.' + path - : this.$__.fullPath; +function ownerDocument (self) { + var parent = self.__parent; + while (parent.__parent) + parent = parent.__parent; + return parent; } /** diff --git a/node_modules/mongoose/lib/utils.js b/node_modules/mongoose/lib/utils.js index 461c418..1f9b14a 100644 --- a/node_modules/mongoose/lib/utils.js +++ b/node_modules/mongoose/lib/utils.js @@ -6,12 +6,11 @@ var ReadPref = require('mongodb').ReadPreference , ObjectId = require('./types/objectid') , ms = require('ms') , sliced = require('sliced') - , mpath = require('mpath') , MongooseBuffer , MongooseArray , Document -/*! +/** * Produces a collection name from model `name`. * * @param {String} name a model name @@ -29,8 +28,6 @@ exports.toCollectionName = function (name) { * Pluralization rules. * * These rules are applied while processing the argument to `toCollectionName`. - * - * @deprecated remove in 4.x gh-1350 */ exports.pluralization = [ @@ -61,7 +58,6 @@ var rules = exports.pluralization; * Uncountable words. * * These words are applied while processing the argument to `toCollectionName`. - * @api public */ exports.uncountables = [ @@ -114,7 +110,7 @@ function pluralize (str) { return str; }; -/*! +/** * Determines if `a` and `b` are deep equal. * * Modified from node/lib/assert.js @@ -200,7 +196,7 @@ exports.deepEqual = function deepEqual (a, b) { return true; }; -/*! +/** * Object clone with Mongoose natives support. * * If options.minimize is true, creates a minimal data object. Empty objects and undefined values will not be cloned. This makes the data payload sent to MongoDB as small as possible. @@ -302,8 +298,9 @@ function cloneArray (arr, options) { return ret; }; -/*! - * Shallow copies defaults into options. + +/** + * Copies and merges options with defaults. * * @param {Object} defaults * @param {Object} options @@ -328,7 +325,7 @@ exports.options = function (defaults, options) { return options; }; -/*! +/** * Generates a random string * * @api private @@ -338,7 +335,7 @@ exports.random = function () { return Math.random().toString().substr(3); }; -/*! +/** * Merges `from` into `to` without overwriting existing properties. * * @param {Object} to @@ -371,11 +368,10 @@ exports.merge = function merge (to, from) { var toString = Object.prototype.toString; -/*! +/** * Determines if `arg` is an object. * * @param {Object|Array|String|Function|RegExp|any} arg - * @api private * @return {Boolean} */ @@ -383,14 +379,14 @@ exports.isObject = function (arg) { return '[object Object]' == toString.call(arg); } -/*! +/** * A faster Array.prototype.slice.call(arguments) alternative * @api private */ exports.args = sliced; -/*! +/** * process.nextTick helper. * * Wraps `callback` in a try/catch + nextTick. @@ -416,7 +412,7 @@ exports.tick = function tick (callback) { } } -/*! +/** * Returns if `v` is a mongoose object that has a `toObject()` method we can use. * * This is for compatibility with libs like Date.js which do foolish things to Natives. @@ -436,7 +432,7 @@ exports.isMongooseObject = function (v) { } var isMongooseObject = exports.isMongooseObject; -/*! +/** * Converts `expires` options of index objects to `expiresAfterSeconds` options for MongoDB. * * @param {Object} object @@ -457,15 +453,6 @@ exports.expires = function expires (object) { delete object.expires; } -/*! - * Converts arguments to ReadPrefs the driver - * can understand. - * - * @TODO move this into the driver layer - * @param {String|Array} pref - * @param {Array} [tags] - */ - exports.readPref = function readPref (pref, tags) { if (Array.isArray(pref)) { tags = pref[1]; @@ -492,174 +479,3 @@ exports.readPref = function readPref (pref, tags) { return new ReadPref(pref, tags); } - -/*! - * Populate options constructor - */ - -function PopulateOptions (path, select, match, options, model) { - this.path = path; - this.match = match; - this.select = select; - this.options = options; - this.model = model; - this._docs = {}; -} - -// make it compatible with utils.clone -PopulateOptions.prototype.constructor = Object; - -// expose -exports.PopulateOptions = PopulateOptions; - -/*! - * populate helper - */ - -exports.populate = function populate (path, select, model, match, options) { - // The order of select/conditions args is opposite Model.find but - // necessary to keep backward compatibility (select could be - // an array, string, or object literal). - - // might have passed an object specifying all arguments - if (1 === arguments.length) { - if (path instanceof PopulateOptions) { - return [path]; - } - - if (Array.isArray(path)) { - return path.map(function(o){ - return exports.populate(o)[0]; - }); - } - - if (exports.isObject(path)) { - match = path.match; - options = path.options; - select = path.select; - model = path.model; - path = path.path; - } - } else if ('string' !== typeof model) { - options = match; - match = model; - model = undefined; - } - - if ('string' != typeof path) { - throw new TypeError('utils.populate: invalid path. Expected string. Got typeof `' + typeof path + '`'); - } - - var ret = []; - var paths = path.split(' '); - for (var i = 0; i < paths.length; ++i) { - ret.push(new PopulateOptions(paths[i], select, match, options, model)); - } - - return ret; -} - -/*! - * Return the value of `obj` at the given `path`. - * - * @param {String} path - * @param {Object} obj - */ - -exports.getValue = function (path, obj, map) { - return mpath.get(path, obj, '_doc', map); -} - -/*! - * Sets the value of `obj` at the given `path`. - * - * @param {String} path - * @param {Anything} val - * @param {Object} obj - */ - -exports.setValue = function (path, val, obj, map) { - mpath.set(path, val, obj, '_doc', map); -} - -/*! - * Returns an array of values from object `o`. - * - * @param {Object} o - * @return {Array} - * @private - */ - -exports.object = {}; -exports.object.vals = function vals (o) { - var keys = Object.keys(o) - , i = keys.length - , ret = []; - - while (i--) { - ret.push(o[keys[i]]); - } - - return ret; -} - -/*! - * @see exports.options - */ - -exports.object.shallowCopy = exports.options; - -/*! - * Safer helper for hasOwnProperty checks - * - * @param {Object} obj - * @param {String} prop - */ - -exports.object.hasOwnProperty = function (obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -} - -/*! - * Determine if `val` is null or undefined - * - * @return {Boolean} - */ - -exports.isNullOrUndefined = function (val) { - return null == val -} - -/*! - * ignore - */ - -exports.array = {}; - -/*! - * Flattens an array. - * - * [ 1, [ 2, 3, [4] ]] -> [1,2,3,4] - * - * @param {Array} arr - * @param {Function} [filter] If passed, will be invoked with each item in the array. If `filter` returns a falsey value, the item will not be included in the results. - * @return {Array} - * @private - */ - -exports.array.flatten = function flatten (arr, filter, ret) { - ret || (ret = []); - - arr.forEach(function (item) { - if (Array.isArray(item)) { - flatten(item, filter, ret); - } else { - if (!filter || filter(item)) { - ret.push(item); - } - } - }); - - return ret; -} - diff --git a/node_modules/mongoose/node_modules/mongodb/.travis.yml b/node_modules/mongoose/node_modules/mongodb/.travis.yml index 0140117..94740d0 100644 --- a/node_modules/mongoose/node_modules/mongodb/.travis.yml +++ b/node_modules/mongoose/node_modules/mongodb/.travis.yml @@ -2,4 +2,4 @@ language: node_js node_js: - 0.6 - 0.8 - - 0.10 # development version of 0.8, may be unstable \ No newline at end of file + - 0.9 # development version of 0.8, may be unstable \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/Makefile b/node_modules/mongoose/node_modules/mongodb/Makefile index 59d2bfe..ac55626 100644 --- a/node_modules/mongoose/node_modules/mongodb/Makefile +++ b/node_modules/mongoose/node_modules/mongodb/Makefile @@ -6,20 +6,56 @@ name = all total: build_native -test_functional: - node test/runner.js -t functional +test-coverage: + rm -rf lib-cov/ + jscoverage lib/ lib-cov/ + @TEST_COVERAGE=true nodeunit test/ test/gridstore test/connection -test_ssl: - node test/runner.js -t ssl +build_native: -test_replicaset: - node test/runner.js -t replicaset +test: build_native + @echo "\n == Run All tests minus replicaset tests==" + $(NODE) dev/tools/test_all.js --noreplicaset --boot -test_sharded: - node test/runner.js -t sharded +test_pure: build_native + @echo "\n == Run All tests minus replicaset tests==" + $(NODE) dev/tools/test_all.js --noreplicaset --boot --nonative -test_auth: - node test/runner.js -t auth +test_junit: build_native + @echo "\n == Run All tests minus replicaset tests==" + $(NODE) dev/tools/test_all.js --junit --noreplicaset --nokill + +jenkins: build_native + @echo "\n == Run All tests minus replicaset tests==" + $(NODE) dev/tools/test_all.js --junit --noreplicaset --nokill + +test_nodeunit_pure: + @echo "\n == Execute Test Suite using Pure JS BSON Parser == " + @$(NODEUNIT) test/ test/gridstore test/bson + +test_nodeunit_replicaset_pure: + @echo "\n == Execute Test Suite using Pure JS BSON Parser == " + @$(NODEUNIT) test/replicaset + +test_nodeunit_native: + @echo "\n == Execute Test Suite using Native BSON Parser == " + @TEST_NATIVE=TRUE $(NODEUNIT) test/ test/gridstore test/bson + +test_nodeunit_replicaset_native: + @echo "\n == Execute Test Suite using Native BSON Parser == " + @TEST_NATIVE=TRUE $(NODEUNIT) test/replicaset + +test_all: build_native + @echo "\n == Run All tests ==" + $(NODE) dev/tools/test_all.js --boot + +test_all_junit: build_native + @echo "\n == Run All tests ==" + $(NODE) dev/tools/test_all.js --junit --boot + +clean: + rm ./external-libs/bson/bson.node + rm -r ./external-libs/bson/build generate_docs: $(NODE) dev/tools/build-docs.js diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection.js index 41647a3..14cbeee 100644 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection.js +++ b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection.js @@ -24,7 +24,6 @@ var Connection = exports.Connection = function(id, socketOptions) { // Connection parsing state // this.maxBsonSize = socketOptions.maxBsonSize ? socketOptions.maxBsonSize : Connection.DEFAULT_MAX_BSON_SIZE; - this.maxMessageSizeBytes = socketOptions.maxMessageSizeBytes ? socketOptions.maxMessageSizeBytes : Connection.DEFAULT_MAX_MESSAGE_SIZE; // Contains the current message bytes this.buffer = null; // Contains the current message size @@ -43,8 +42,6 @@ var Connection = exports.Connection = function(id, socketOptions) { // Set max bson size Connection.DEFAULT_MAX_BSON_SIZE = 1024 * 1024 * 4; -// Set default to max bson to avoid overflow or bad guesses -Connection.DEFAULT_MAX_MESSAGE_SIZE = Connection.DEFAULT_MAX_BSON_SIZE; // Inherit event emitter so we can emit stuff wohoo inherits(Connection, EventEmitter); @@ -94,6 +91,10 @@ Connection.prototype.start = function() { if(this.socketOptions.sslCert) { tls_options.cert = this.socketOptions.sslCert; tls_options.key = this.socketOptions.sslKey; + // Allow for a combined cert/key pem file being passed in as cert parameter + // if(tls_options.key == null) { + // tls_options.key = this.socketOptions.ssl_cert; + // } } // If the driver has been provided a private key password @@ -186,14 +187,8 @@ Connection.prototype.write = function(command, callback) { if(Array.isArray(command)) { for(var i = 0; i < command.length; i++) { var binaryCommand = command[i].toBinary() - if(!this.socketOptions['disableDriverBSONSizeCheck'] && binaryCommand.length > this.maxBsonSize) - return callback(new Error("Document exceeds maximum allowed bson size of " + this.maxBsonSize + " bytes")); - - if(this.socketOptions['disableDriverBSONSizeCheck'] && binaryCommand.length > this.maxMessageSizeBytes) { - return callback(new Error("Command exceeds maximum message size of " + this.maxMessageSizeBytes + " bytes")); - } - + return callback(new Error("Document exceeds maximal allowed bson size of " + this.maxBsonSize + " bytes")); if(this.logger != null && this.logger.doDebug) this.logger.debug("writing command to mongodb", {binary: binaryCommand, json: command[i]}); @@ -201,13 +196,8 @@ Connection.prototype.write = function(command, callback) { } } else { var binaryCommand = command.toBinary() - if(!this.socketOptions['disableDriverBSONSizeCheck'] && binaryCommand.length > this.maxBsonSize) - return callback(new Error("Document exceeds maximum allowed bson size of " + this.maxBsonSize + " bytes")); - - if(this.socketOptions['disableDriverBSONSizeCheck'] && binaryCommand.length > this.maxMessageSizeBytes) { - return callback(new Error("Command exceeds maximum message size of " + this.maxMessageSizeBytes + " bytes")); - } + return callback(new Error("Document exceeds maximal allowed bson size of " + this.maxBsonSize + " bytes")); if(this.logger != null && this.logger.doDebug) this.logger.debug("writing command to mongodb", {binary: binaryCommand, json: command}); @@ -298,7 +288,7 @@ var createDataHandler = exports.Connection.createDataHandler = function(self) { // Emit the buffer self.emit("message", emitBuffer, self); } catch(err) { - var errorObject = {err:"socketHandler", trace:err, bin:self.buffer, parseState:{ + var errorObject = {err:"socketHandler", trace:err, bin:buffer, parseState:{ sizeOfMessage:self.sizeOfMessage, bytesRead:self.bytesRead, stubBuffer:self.stubBuffer}}; diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection_pool.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection_pool.js index 0ca433f..8e6f3ee 100644 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection_pool.js +++ b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection_pool.js @@ -1,16 +1,11 @@ var utils = require('./connection_utils'), inherits = require('util').inherits, net = require('net'), - timers = require('timers'), EventEmitter = require('events').EventEmitter, inherits = require('util').inherits, MongoReply = require("../responses/mongo_reply").MongoReply, Connection = require("./connection").Connection; -// Set processor, setImmediate if 0.10 otherwise nextTick -var processor = timers.setImmediate ? timers.setImmediate : process.nextTick; -processor = process.nextTick - var ConnectionPool = exports.ConnectionPool = function(host, port, poolSize, bson, socketOptions) { if(typeof host !== 'string') { throw new Error("host must be specified [" + host + "]"); @@ -81,16 +76,6 @@ ConnectionPool.prototype.setMaxBsonSize = function(maxBsonSize) { } } -ConnectionPool.prototype.setMaxMessageSizeBytes = function(maxMessageSizeBytes) { - if(maxMessageSizeBytes == null){ - maxMessageSizeBytes = Connection.DEFAULT_MAX_MESSAGE_SIZE; - } - - for(var i = 0; i < this.openConnections.length; i++) { - this.openConnections[i].maxMessageSizeBytes = maxMessageSizeBytes; - } -} - // Start a function var _connect = function(_self) { // return new function() { @@ -119,7 +104,7 @@ var _connect = function(_self) { } }, _self._timeToWait); } else { - processor(function() { + process.nextTick(function() { // If we are still connecting (no close events fired in between start another connection) if(_self._poolState == 'connecting') { _connect(_self); diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/repl_set.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/repl_set.js index 92171a6..860c9fe 100644 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/repl_set.js +++ b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/repl_set.js @@ -105,8 +105,6 @@ var ReplSet = exports.ReplSet = function(servers, options) { this._serverState = 'disconnected'; // Read preference this._readPreference = null; - // HA running - this._haRunning = false; // Do we record server stats or not this.recordQueryStats = false; // Update health try server @@ -134,9 +132,6 @@ var ReplSet = exports.ReplSet = function(servers, options) { || this._readPreference == false || this._readPreference == null ? false : true; - // Ensure correct slave set - if(this.readSecondary) this.slaveOk = true; - // Strategy for picking a secondary this.secondaryAcceptableLatencyMS = this.options['secondaryAcceptableLatencyMS'] == null ? 15 : this.options['secondaryAcceptableLatencyMS']; this.strategy = this.options['strategy']; @@ -242,10 +237,8 @@ inherits(ReplSet, Base); ReplSet.prototype.setReadPreference = function(preference) { // Set read preference this._readPreference = preference; - // Ensure slaveOk is correct for secondaries read preference and tags - if((this._readPreference == ReadPreference.SECONDARY_PREFERRED - || this._readPreference == ReadPreference.SECONDARY - || this._readPreference == ReadPreference.NEAREST) + // Ensure slaveOk is correct for secodnaries read preference and tags + if((this._readPreference == ReadPreference.SECONDARY_PREFERRED || this._readPreference == ReadPreference.SECONDARY) || (this._readPreference != null && typeof this._readPreference == 'object')) { this.slaveOk = true; } @@ -345,7 +338,6 @@ ReplSet.prototype.allServerInstances = function() { */ ReplSet.prototype._enableHA = function () { var self = this; - self._haRunning = true; return check(); function ping () { @@ -398,17 +390,17 @@ ReplSet.prototype._enableHA = function () { self._haServer._callBackStore = self._callBackStore; // Add error handlers - self._haServer.on("close", function() { + self.on("close", function() { if(self._haServer) self._haServer.close(); self._haServer = null; }); - self._haServer.on("error", function() { + self.on("error", function() { if(self._haServer) self._haServer.close(); self._haServer = null; }); - self._haServer.on("timeout", function() { + self.on("timeout", function() { if(self._haServer) self._haServer.close(); self._haServer = null; }); @@ -417,13 +409,12 @@ ReplSet.prototype._enableHA = function () { // behavior on any errors we could possibly run into self._haServer.connect(db, function(err, result, _server) { if("disconnected" == self._serverState) { - if(_server && _server.close) _server.close(); - self._haRunning = false; + if(_server.close) _server.close(); return; } if(err) { - if(_server && _server.close) _server.close(); + if(_server.close) _server.close(); return check(); } @@ -442,17 +433,11 @@ ReplSet.prototype._enableHA = function () { // Execute is master command db._executeQueryCommand(cmd, {failFast:true, connection: _server.checkoutReader()}, function(err, res) { if("disconnected" == self._serverState) { - if(_server && _server.close) _server.close(); - self._haRunning = false; - self._haServer = null; + if(_server.close) _server.close(); return; } // If error let's set perform another check - if(err) { - // Force new server selection - self._haServer = null; - return check(); - } + if(err) return check(); // Validate the replicaset self._validateReplicaset(res, db.auths, function() { check(); @@ -520,7 +505,7 @@ ReplSet.prototype._validateReplicaset = function(result, auths, cb) { * @param {Function} cb * @ignore */ -function connectTo(hosts, auths, replset, cb) { +function connectTo (hosts, auths, replset, cb) { var pending = hosts.length; if (!pending) return cb(); @@ -544,7 +529,7 @@ function connectTo(hosts, auths, replset, cb) { * @param {Function} cb * @ignore */ -function connectToHost(host, auths, replset, cb) { +function connectToHost (host, auths, replset, cb) { var server = createServer(host, replset); var options = { @@ -618,7 +603,7 @@ function connectToHost(host, auths, replset, cb) { * @return {Server} * @ignore */ -function createServer(host, replset) { +function createServer (host, replset) { // copy existing socket options to new server var socketOptions = {} if(replset.socketOptions) { @@ -837,7 +822,6 @@ var _connectHandler = function(self, candidateServers, instanceServer) { } delete addresses[server.host + ":" + server.port]; } - addresses[server.host + ":" + server.port] = server; // Connect server.connect(self.db, {returnIsMasterResults: true, eventReceiver:server}, _connectHandler(self, candidateServers, server)); @@ -856,20 +840,18 @@ var _connectHandler = function(self, candidateServers, instanceServer) { return self.emit("connectionError", new Error("no primary server found in set")) } else{ - if(self.strategyInstance) { + if (self.strategyInstance) { self.strategyInstance.start(); } for(var i = 0; i < self.dbInstances.length; i++) self.dbInstances[i]._state = 'connected'; self.emit("fullsetup", null, self.db, self); - self.emit("open", null, self.db, self); + self.emit("open", null, self.db, self); } } } } -var _fullsetup_emitted = false; - /** * Interval state object constructor * @@ -967,8 +949,7 @@ ReplSet.prototype.connect = function(parent, options, callback) { returnIsMasterResults: true, eventReceiver: server } - - server.connect(parent, opts, _connectHandler(self, candidateServers, server)); + server.connect(parent, opts, _connectHandler(this, candidateServers, server)); } /** @@ -986,7 +967,6 @@ ReplSet.prototype._handleOnFullSetup = function (parent) { parent.emit("fullsetup", null, this.db, this); if(!this.haEnabled) return; - if(this._haRunning) return; this._enableHA(); } diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js index 20392fa..c4ae952 100644 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js +++ b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js @@ -6,13 +6,8 @@ var Connection = require('./connection').Connection, EventEmitter = require('events').EventEmitter, Base = require('./base').Base, utils = require('../utils'), - timers = require('timers'), inherits = require('util').inherits; -// Set processor, setImmediate if 0.10 otherwise nextTick -var processor = timers.setImmediate ? timers.setImmediate : process.nextTick; -processor = process.nextTick - /** * Class representing a single MongoDB Server connection * @@ -24,6 +19,7 @@ processor = process.nextTick * - **sslCert** {Buffer/String, default:null}, String or buffer containing the certificate we wish to present (needs to have a mongod server with ssl support, 2.4 or higher) * - **sslKey** {Buffer/String, default:null}, String or buffer containing the certificate private key we wish to present (needs to have a mongod server with ssl support, 2.4 or higher) * - **sslPass** {Buffer/String, default:null}, String or buffer containing the certificate password (needs to have a mongod server with ssl support, 2.4 or higher) + * - **slaveOk** {Boolean, default:false}, legacy option allowing reads from secondary, use **readPrefrence** instead. * - **poolSize** {Number, default:5}, number of connections in the connection pool, set to 5 as default for legacy reasons. * - **socketOptions** {Object, default:null}, an object containing socket options to use (noDelay:(boolean), keepAlive:(number), connectTimeoutMS:(number), socketTimeoutMS:(number)) * - **logger** {Object, default:null}, an object representing a logger that you want to use, needs to support functions debug, log, error **({error:function(message, object) {}, log:function(message, object) {}, debug:function(message, object) {}})**. @@ -322,7 +318,6 @@ Server.prototype.connect = function(dbInstance, options, callback) { if(err != null) return internalCallback(err, null, server); server.master = reply.documents[0].ismaster == 1 ? true : false; server.connectionPool.setMaxBsonSize(reply.documents[0].maxBsonObjectSize); - server.connectionPool.setMaxMessageSizeBytes(reply.documents[0].maxMessageSizeBytes); // Set server as connected server.connected = true; // Save document returned so we can query it @@ -525,7 +520,7 @@ Server.prototype.connect = function(dbInstance, options, callback) { } } catch (err) { // Throw error in next tick - processor(function() { + process.nextTick(function() { throw err; }) } diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/url_parser.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/url_parser.js index 4c13d0c..d31e8a0 100644 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/url_parser.js +++ b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/url_parser.js @@ -172,8 +172,6 @@ exports.parse = function(url, options) { case 'w': dbOptions.w = parseInt(value, 10); break; - case 'authSource': - dbOptions.authSource = value; case 'wtimeoutMS': dbOptions.wtimeoutMS = parseInt(value, 10); break; diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursor.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursor.js index f7aa556..c4d417b 100644 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursor.js +++ b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursor.js @@ -4,12 +4,8 @@ var QueryCommand = require('./commands/query_command').QueryCommand, Long = require('bson').Long, ReadPreference = require('./connection/read_preference').ReadPreference, CursorStream = require('./cursorstream'), - timers = require('timers'), utils = require('./utils'); -// Set processor, setImmediate if 0.10 otherwise nextTick -var processor = timers.setImmediate ? timers.setImmediate : process.nextTick; - /** * Constructor for a cursor object that handles all the operations on query result * using find. This cursor object is unidirectional and cannot traverse backwards. Clients should not be creating a cursor directly, @@ -254,7 +250,7 @@ Cursor.prototype.each = function(callback) { // from the server. var eachExhaust = function(self, callback) { //FIX: stack overflow (on deep callback) (cred: https://github.com/limp/node-mongodb-native/commit/27da7e4b2af02035847f262b29837a94bbbf6ce2) - processor(function(){ + process.nextTick(function(){ // Fetch the next object until there is no more objects self.nextObject(function(err, item) { if(err != null) return callback(err, null); @@ -701,16 +697,14 @@ var getMore = function(self, options, callback) { // Execute the command self.db._executeQueryCommand(getMoreCommand, command_options, function(err, result) { - var cbValue; - // Get more done self.state = Cursor.OPEN; - if(err != null) { - return callback(utils.toError(err), null); - } - try { + if(err != null) { + return callback(utils.toError(err), null); + } + var isDead = 1 === result.responseFlag && result.cursorId.isZero(); self.cursorId = result.cursorId; @@ -735,9 +729,10 @@ var getMore = function(self, options, callback) { // Don's shift a document out as we need it for toArray if(options.noReturn) { - cbValue = true; + return callback(null, true); + callback(null, true); } else { - cbValue = self.items.shift(); + callback(null, self.items.shift()); } } else if(self.tailable && !isDead && self.awaitdata) { // Excute the tailable cursor once more, will timeout after ~4 sec if awaitdata used @@ -759,7 +754,6 @@ var getMore = function(self, options, callback) { } catch(err) { callback(utils.toError(err), null); } - if (cbValue != null) callback(null, cbValue); }); getMoreCommand = null; @@ -786,6 +780,36 @@ var getMore = function(self, options, callback) { Cursor.prototype.explain = function(callback) { var limit = (-1)*Math.abs(this.limitValue); + // * - **skip** {Number} skip number of documents to skip. + // * - **limit** {Number}, limit the number of results to return. -1 has a special meaning and is used by Db.eval. A value of 1 will also be treated as if it were -1. + // * - **hint** {Object}, hint force the query to use a specific index. + // * - **explain** {Boolean}, explain return the explaination of the query. + // * - **slaveOk** {Boolean}, slaveOk, sets the slaveOk flag on the query wire protocol for secondaries. + // * - **snapshot** {Boolean}, snapshot Snapshot mode assures no duplicates are returned. + // * - **timeout** {Boolean}, timeout allow the query to timeout. + // * - **tailable** {Boolean}, tailable allow the cursor to be tailable. + // * - **awaitdata** {Boolean}, awaitdata allow the cursor to wait for data, only applicable for tailable cursor. + // * - **batchSize** {Number}, batchSize the number of the subset of results to request the database to return for every request. This should initially be greater than 1 otherwise the database will automatically close the cursor. The batch size can be set to 1 with cursorInstance.batchSize after performing the initial query to the database. + // * - **raw** {Boolean}, raw return all query documents as raw buffers (default false). + // * - **read** {Boolean}, read specify override of read from source (primary/secondary). + // * - **returnKey** {Boolean}, returnKey only return the index key. + // * - **maxScan** {Number}, maxScan limit the number of items to scan. + // * - **min** {Number}, min set index bounds. + // * - **max** {Number}, max set index bounds. + // * - **showDiskLoc** {Boolean}, showDiskLoc show disk location of results. + // * - **comment** {String}, comment you can put a $comment field on a query to make looking in the profiler logs simpler. + // * - **numberOfRetries** {Number}, numberOfRetries if using awaidata specifies the number of times to retry on timeout. + // * - **dbName** {String}, dbName override the default dbName. + // * - **tailableRetryInterval** {Number}, tailableRetryInterval specify the miliseconds between getMores on tailable cursor. + // * - **exhaust** {Boolean}, exhaust have the server send all the documents at once as getMore packets. + // * - **partial** {Boolean}, partial have the sharded system return a partial result from mongos. + + // * - **sort** {Array | Object}, set to sort the documents coming back from the query. Array of indexes, [['a', 1]] etc. + +// function Cursor(db, collection, selector, fields, skip, limit +// - , sort, hint, explain, snapshot, timeout, tailable, batchSize, slaveOk, raw, read +// - , returnKey, maxScan, min, max, showDiskLoc, comment, awaitdata, numberOfRetries, dbName, tailableRetry + // Create a new cursor and fetch the plan var cursor = new Cursor(this.db, this.collection, this.selector, this.fields, { skip: this.skipValue @@ -899,14 +923,11 @@ Cursor.prototype.streamRecords = function(options) { /** * Returns a Node ReadStream interface for this cursor. * - * Options - * - **transform** {Function} function of type function(object) { return transformed }, allows for transformation of data before emitting. - * * @return {CursorStream} returns a stream object. * @api public */ -Cursor.prototype.stream = function stream(options) { - return new CursorStream(this, options); +Cursor.prototype.stream = function stream () { + return new CursorStream(this); } /** diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursorstream.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursorstream.js index 2752091..ee0cd80 100644 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursorstream.js +++ b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursorstream.js @@ -1,8 +1,3 @@ -var timers = require('timers'); - -// Set processor, setImmediate if 0.10 otherwise nextTick -var processor = timers.setImmediate ? timers.setImmediate : process.nextTick; - /** * Module dependecies. */ @@ -13,9 +8,6 @@ var Stream = require('stream').Stream; * * Returns a stream interface for the **cursor**. * - * Options - * - **transform** {Function} function of type function(object) { return transformed }, allows for transformation of data before emitting. - * * Events * - **data** {function(item) {}} the data event triggers when a document is ready. * - **error** {function(err) {}} the error event triggers if an error happens. @@ -25,9 +17,8 @@ var Stream = require('stream').Stream; * @param {Cursor} cursor a cursor object that the stream wraps. * @return {Stream} */ -function CursorStream(cursor, options) { +function CursorStream(cursor) { if(!(this instanceof CursorStream)) return new CursorStream(cursor); - options = options ? options : {}; Stream.call(this); @@ -35,12 +26,11 @@ function CursorStream(cursor, options) { this.paused = false; this._cursor = cursor; this._destroyed = null; - this.options = options; // give time to hook up events var self = this; - process.nextTick(function() { - self._init(); + process.nextTick(function () { + self._init(); }); } @@ -77,13 +67,11 @@ CursorStream.prototype._init = function () { * @api private */ CursorStream.prototype._next = function () { - if(this.paused || this._destroyed) return; + if (this.paused || this._destroyed) return; var self = this; // Get the next object - processor(function() { - if(self.paused || self._destroyed) return; - + process.nextTick(function() { self._cursor.nextObject(function (err, doc) { self._onNextObject(err, doc); }); @@ -103,8 +91,7 @@ CursorStream.prototype._onNextObject = function (err, doc) { this.emit('end') return this.destroy(); } else if(doc) { - var data = typeof this.options.transform == 'function' ? this.options.transform(doc) : doc; - this.emit('data', data); + this.emit('data', doc); this._next(); } } @@ -150,7 +137,7 @@ CursorStream.prototype.destroy = function (err) { this._cursor.close(); - if(err) { + if (err) { this.emit('error', err); } diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/db.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/db.js index 957e436..76635ec 100644 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/db.js +++ b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/db.js @@ -15,14 +15,9 @@ var QueryCommand = require('./commands/query_command').QueryCommand, EventEmitter = require('events').EventEmitter, inherits = require('util').inherits, crypto = require('crypto'), - timers = require('timers'), utils = require('./utils'), parse = require('./connection/url_parser').parse; -// Set processor, setImmediate if 0.10 otherwise nextTick -var processor = timers.setImmediate ? timers.setImmediate : process.nextTick; -processor = process.nextTick - /** * Create a new Db instance. * @@ -243,7 +238,7 @@ Db.prototype.open = function(callback) { // Execute any baked up commands var _execute_queued_command = function(self) { // Execute any backed up commands - processor(function() { + process.nextTick(function() { // Execute any backed up commands while(self.commands.length > 0) { // Fetch the command @@ -426,8 +421,7 @@ Db.prototype.collectionNames = function(collectionName, options, callback) { }; /** - * Fetch a specific collection (containing the actual collection information). If the application does not use strict mode you can - * can use it without a callback in the following way. var collection = db.collection('mycollection'); + * Fetch a specific collection (containing the actual collection information) * * Options * - **w**, {Number/String, > -1 || 'majority' || tag name} the write concern for the operation where < 1 is no acknowlegement of write and w >= 1, w = 'majority' or tag acknowledges the write @@ -438,11 +432,12 @@ Db.prototype.collectionNames = function(collectionName, options, callback) { * - **raw** {Boolean, default:false}, perform all operations using raw bson objects. * - **pkFactory** {Object}, object overriding the basic ObjectID primary key generation. * - **readPreference** {String}, the prefered read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). - * - **strict**, (Boolean, default:false) throws and error if the collection does not exist + * - **strict**, (Boolean, default:false) throws and error if collection already exists * * Deprecated Options * - **safe** {true | {w:n, wtimeout:n} | {fsync:true}, default:false}, executes with a getLastError command returning the results of the command on MongoDB. * + * * @param {String} collectionName the collection name we wish to access. * @param {Object} [options] returns option results. * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the collection or null if an error occured. @@ -625,9 +620,8 @@ Db.prototype.logout = function(options, callback) { * Authenticate a user against the server. * * Options - * - **authSource** {String}, The database that the credentials are for, + * - **authdb** {String}, The database that the credentials are for, * different from the name of the current DB, for example admin - * * @param {String} username username. * @param {String} password password. * @param {Object} [options] the options @@ -645,7 +639,6 @@ Db.prototype.authenticate = function(username, password, options, callback) { // the default db to authenticate against is 'this' // if authententicate is called from a retry context, it may be another one, like admin var authdb = options.authdb ? options.authdb : self.databaseName; - authdb = options.authSource ? options.authSource : authdb; // Push the new auth if we have no previous record var numberOfConnections = 0; @@ -1611,7 +1604,7 @@ var __retryCommandOnFailure = function(self, retryInMilliseconds, numberOfTimes, // Execute command command(_self, _db_command, _options, _callback); - processor(function() { + process.nextTick(function() { // Execute any backed up commands while(_self.commands.length > 0) { // Fetch the command @@ -1674,7 +1667,7 @@ Db.prototype._executeQueryCommand = function(db_command, options, callback) { var config = this.serverConfig; // If the pool is not connected, attemp to reconnect to send the message if(this._state == 'connecting' && config.autoReconnect && !failFast) { - return processor(function() { + return process.nextTick(function() { self.commands.push({ type: 'query', db_command: db_command, @@ -1706,7 +1699,7 @@ Db.prototype._executeQueryCommand = function(db_command, options, callback) { } __executeQueryCommand(self, db_command, options, function (err, result, conn) { - if(callback) callback(err, result, conn); + callback(err, result, conn); }); }; @@ -1794,7 +1787,7 @@ Db.prototype._executeInsertCommand = function(db_command, options, callback) { // If the pool is not connected, attemp to reconnect to send the message if(self._state == 'connecting' && this.serverConfig.autoReconnect) { - processor(function() { + process.nextTick(function() { self.commands.push({type:'insert', 'db_command':db_command, 'options':options, 'callback':callback}); }) } else if(!this.serverConfig.isConnected() && this.serverConfig.autoReconnect) { @@ -2038,14 +2031,7 @@ var _finishConnecting = function(serverConfig, object, options, callback) { // Open the db db.open(function(err, db){ if(err == null && object.auth){ - // What db to authenticate against - var authentication_db = db; - if(object.db_options && object.db_options.authSource) { - authentication_db = db.db(object.db_options.authSource); - } - - // Authenticate - authentication_db.authenticate(object.auth.user, object.auth.password, function(err, success){ + db.authenticate(object.auth.user, object.auth.password, function(err, success){ if(success){ callback(null, db); } else { diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/gridstore.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/gridstore.js index 615b22e..e9ddb97 100644 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/gridstore.js +++ b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/gridstore.js @@ -11,16 +11,11 @@ var Chunk = require('./chunk').Chunk, ObjectID = require('bson').ObjectID, Buffer = require('buffer').Buffer, fs = require('fs'), - timers = require('timers'), util = require('util'), inherits = util.inherits, ReadStream = require('./readstream').ReadStream, Stream = require('stream'); -// Set processor, setImmediate if 0.10 otherwise nextTick -var processor = timers.setImmediate ? timers.setImmediate : process.nextTick; -processor = process.nextTick - var REFERENCE_BY_FILENAME = 0, REFERENCE_BY_ID = 1; @@ -331,7 +326,7 @@ GridStore.prototype.writeFile = function (file, callback) { fs.close(file); self.close(callback); } else { - return processor(writeChunk); + return process.nextTick(writeChunk); } }); }); @@ -339,7 +334,7 @@ GridStore.prototype.writeFile = function (file, callback) { } // Process the first write - processor(writeChunk); + process.nextTick(writeChunk); }); }); }; @@ -751,7 +746,7 @@ GridStore.prototype.read = function(length, buffer, callback) { // Copy content to final buffer slice.copy(finalBuffer, finalBuffer._index); // Update internal position - self.position = self.position + finalBuffer.length; + self.position = finalBuffer.length; // Check if we don't have a file at all if(finalLength == 0 && finalBuffer.length == 0) return callback(new Error("File does not exist"), null); // Else return data @@ -818,10 +813,6 @@ GridStore.prototype.seek = function(position, seekLocation, callback) { var seekLocationFinal = seekLocation == null ? exports.GridStore.IO_SEEK_SET : seekLocation; var finalPosition = position; var targetPosition = 0; - - // console.dir(targetPosition) - - // Calculate the position if(seekLocationFinal == exports.GridStore.IO_SEEK_CUR) { targetPosition = self.position + finalPosition; } else if(seekLocationFinal == exports.GridStore.IO_SEEK_END) { @@ -830,7 +821,6 @@ GridStore.prototype.seek = function(position, seekLocation, callback) { targetPosition = finalPosition; } - // Get the chunk var newChunkNumber = Math.floor(targetPosition/self.chunkSize); if(newChunkNumber != self.currentChunk.chunkNumber) { var seekChunk = function() { diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/readstream.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/readstream.js index 8ff9973..ebb09bd 100644 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/readstream.js +++ b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/readstream.js @@ -1,11 +1,6 @@ var Stream = require('stream').Stream, - timers = require('timers'), util = require('util'); -// Set processor, setImmediate if 0.10 otherwise nextTick -var processor = timers.setImmediate ? timers.setImmediate : process.nextTick; -processor = process.nextTick - /** * ReadStream * @@ -45,7 +40,7 @@ function ReadStream(autoclose, gstore) { this.seekStartPosition = gstore.position - (this.currentChunkNumber * gstore.chunkSize); var self = this; - processor(function() { + process.nextTick(function() { self._execute(); }); }; @@ -185,7 +180,7 @@ ReadStream.prototype.resume = function() { this.paused = false; var self = this; - processor(function() { + process.nextTick(function() { self._execute(); }); }; diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js index 743618f..b129dc6 100644 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js +++ b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js @@ -1,9 +1,4 @@ -var Long = require('bson').Long - , timers = require('timers'); - -// Set processor, setImmediate if 0.10 otherwise nextTick -var processor = timers.setImmediate ? timers.setImmediate : process.nextTick; -processor = process.nextTick +var Long = require('bson').Long; /** Reply message from mongo db @@ -98,7 +93,7 @@ MongoReply.prototype.parseBody = function(binary_reply, bson, raw, callback) { // If we hav more documents process NextTick if(object_index < _numberReturned) { - processor(processFunction); + process.nextTick(processFunction); } else { callback(null); } diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/Release/bson.node b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/Release/bson.node index 22d7d536fe17e72b2d6c7e23c8c114d2e01fcd6e..d578d5b5cc12555f4a1cb40bc54a4b33d6b32c52 100755 GIT binary patch delta 17 ZcmaFT#Qda*dBcNdrrpMyA2m1G0sv3b2(17B delta 17 YcmaFT#Qda*dBcNdCQhTxkD8lo0ZQ)&`Tzg` diff --git a/node_modules/mongoose/node_modules/mongodb/package.json b/node_modules/mongoose/node_modules/mongodb/package.json index 84deb0f..5ee72db 100755 --- a/node_modules/mongoose/node_modules/mongodb/package.json +++ b/node_modules/mongoose/node_modules/mongodb/package.json @@ -7,7 +7,7 @@ "driver", "db" ], - "version": "1.2.14", + "version": "1.2.13", "author": { "name": "Christian Amor Kvalheim", "email": "christkv@gmail.com" @@ -190,9 +190,7 @@ "markdown": "0.3.1", "gleak": "0.2.3", "step": "0.0.5", - "async": "0.1.22", - "integra": "0.0.1", - "optimist": "latest" + "async": "0.1.22" }, "config": { "native": false @@ -206,7 +204,7 @@ "node": ">=0.6.19" }, "scripts": { - "test": "make test_functional" + "test": "make test_pure" }, "licenses": [ { @@ -215,6 +213,6 @@ } ], "readme": "Up to date documentation\n========================\n\n[Documentation](http://mongodb.github.com/node-mongodb-native/)\n\nInstall\n=======\n\nTo install the most recent release from npm, run:\n\n npm install mongodb\n\nThat may give you a warning telling you that bugs['web'] should be bugs['url'], it would be safe to ignore it (this has been fixed in the development version)\n\nTo install the latest from the repository, run::\n\n npm install path/to/node-mongodb-native\n\nCommunity\n=========\nCheck out the google group [node-mongodb-native](http://groups.google.com/group/node-mongodb-native) for questions/answers from users of the driver.\n\nTry it live\n============\n\n\nIntroduction\n============\n\nThis is a node.js driver for MongoDB. It's a port (or close to a port) of the library for ruby at http://github.com/mongodb/mongo-ruby-driver/.\n\nA simple example of inserting a document.\n\n```javascript\n var client = new Db('test', new Server(\"127.0.0.1\", 27017, {}), {w: 1}),\n test = function (err, collection) {\n collection.insert({a:2}, function(err, docs) {\n\n collection.count(function(err, count) {\n test.assertEquals(1, count);\n });\n\n // Locate all the entries using find\n collection.find().toArray(function(err, results) {\n test.assertEquals(1, results.length);\n test.assertTrue(results[0].a === 2);\n\n // Let's close the db\n client.close();\n });\n });\n };\n\n client.open(function(err, p_client) {\n client.collection('test_insert', test);\n });\n```\n\nData types\n==========\n\nTo store and retrieve the non-JSON MongoDb primitives ([ObjectID](http://www.mongodb.org/display/DOCS/Object+IDs), Long, Binary, [Timestamp](http://www.mongodb.org/display/DOCS/Timestamp+data+type), [DBRef](http://www.mongodb.org/display/DOCS/Database+References#DatabaseReferences-DBRef), Code).\n\nIn particular, every document has a unique `_id` which can be almost any type, and by default a 12-byte ObjectID is created. ObjectIDs can be represented as 24-digit hexadecimal strings, but you must convert the string back into an ObjectID before you can use it in the database. For example:\n\n```javascript\n // Get the objectID type\n var ObjectID = require('mongodb').ObjectID;\n\n var idString = '4e4e1638c85e808431000003';\n collection.findOne({_id: new ObjectID(idString)}, console.log) // ok\n collection.findOne({_id: idString}, console.log) // wrong! callback gets undefined\n```\n\nHere are the constructors the non-Javascript BSON primitive types:\n\n```javascript\n // Fetch the library\n var mongo = require('mongodb');\n // Create new instances of BSON types\n new mongo.Long(numberString)\n new mongo.ObjectID(hexString)\n new mongo.Timestamp() // the actual unique number is generated on insert.\n new mongo.DBRef(collectionName, id, dbName)\n new mongo.Binary(buffer) // takes a string or Buffer\n new mongo.Code(code, [context])\n new mongo.Symbol(string)\n new mongo.MinKey()\n new mongo.MaxKey()\n new mongo.Double(number)\t// Force double storage\n```\n\nThe C/C++ bson parser/serializer\n--------------------------------\n\nIf you are running a version of this library has the C/C++ parser compiled, to enable the driver to use the C/C++ bson parser pass it the option native_parser:true like below\n\n```javascript\n // using native_parser:\n var client = new Db('integration_tests_20',\n new Server(\"127.0.0.1\", 27017),\n {native_parser:true});\n```\n\nThe C++ parser uses the js objects both for serialization and deserialization.\n\nGitHub information\n==================\n\nThe source code is available at http://github.com/mongodb/node-mongodb-native.\nYou can either clone the repository or download a tarball of the latest release.\n\nOnce you have the source you can test the driver by running\n\n $ make test\n\nin the main directory. You will need to have a mongo instance running on localhost for the integration tests to pass.\n\nExamples\n========\n\nFor examples look in the examples/ directory. You can execute the examples using node.\n\n $ cd examples\n $ node queries.js\n\nGridStore\n=========\n\nThe GridStore class allows for storage of binary files in mongoDB using the mongoDB defined files and chunks collection definition.\n\nFor more information have a look at [Gridstore](https://github.com/mongodb/node-mongodb-native/blob/master/docs/gridfs.md)\n\nReplicasets\n===========\nFor more information about how to connect to a replicaset have a look at [Replicasets](https://github.com/mongodb/node-mongodb-native/blob/master/docs/replicaset.md)\n\nPrimary Key Factories\n---------------------\n\nDefining your own primary key factory allows you to generate your own series of id's\n(this could f.ex be to use something like ISBN numbers). The generated the id needs to be a 12 byte long \"string\".\n\nSimple example below\n\n```javascript\n // Custom factory (need to provide a 12 byte array);\n CustomPKFactory = function() {}\n CustomPKFactory.prototype = new Object();\n CustomPKFactory.createPk = function() {\n return new ObjectID(\"aaaaaaaaaaaa\");\n }\n\n var p_client = new Db('integration_tests_20', new Server(\"127.0.0.1\", 27017, {}), {'pk':CustomPKFactory});\n p_client.open(function(err, p_client) {\n p_client.dropDatabase(function(err, done) {\n p_client.createCollection('test_custom_key', function(err, collection) {\n collection.insert({'a':1}, function(err, docs) {\n collection.find({'_id':new ObjectID(\"aaaaaaaaaaaa\")}, function(err, cursor) {\n cursor.toArray(function(err, items) {\n test.assertEquals(1, items.length);\n\n // Let's close the db\n p_client.close();\n });\n });\n });\n });\n });\n });\n```\n\nStrict mode\n-----------\n\nEach database has an optional strict mode. If it is set then asking for a collection\nthat does not exist will return an Error object in the callback. Similarly if you\nattempt to create a collection that already exists. Strict is provided for convenience.\n\n```javascript\n var error_client = new Db('integration_tests_', new Server(\"127.0.0.1\", 27017, {auto_reconnect: false}), {strict:true});\n test.assertEquals(true, error_client.strict);\n\n error_client.open(function(err, error_client) {\n error_client.collection('does-not-exist', function(err, collection) {\n test.assertTrue(err instanceof Error);\n test.assertEquals(\"Collection does-not-exist does not exist. Currently in strict mode.\", err.message);\n });\n\n error_client.createCollection('test_strict_access_collection', function(err, collection) {\n error_client.collection('test_strict_access_collection', function(err, collection) {\n test.assertTrue(collection instanceof Collection);\n // Let's close the db\n error_client.close();\n });\n });\n });\n```\n\nDocumentation\n=============\n\nIf this document doesn't answer your questions, see the source of\n[Collection](https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/collection.js)\nor [Cursor](https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/cursor.js),\nor the documentation at MongoDB for query and update formats.\n\nFind\n----\n\nThe find method is actually a factory method to create\nCursor objects. A Cursor lazily uses the connection the first time\nyou call `nextObject`, `each`, or `toArray`.\n\nThe basic operation on a cursor is the `nextObject` method\nthat fetches the next matching document from the database. The convenience\nmethods `each` and `toArray` call `nextObject` until the cursor is exhausted.\n\nSignatures:\n\n```javascript\n var cursor = collection.find(query, [fields], options);\n cursor.sort(fields).limit(n).skip(m).\n\n cursor.nextObject(function(err, doc) {});\n cursor.each(function(err, doc) {});\n cursor.toArray(function(err, docs) {});\n\n cursor.rewind() // reset the cursor to its initial state.\n```\n\nUseful chainable methods of cursor. These can optionally be options of `find` instead of method calls:\n\n* `.limit(n).skip(m)` to control paging.\n* `.sort(fields)` Order by the given fields. There are several equivalent syntaxes:\n * `.sort({field1: -1, field2: 1})` descending by field1, then ascending by field2.\n * `.sort([['field1', 'desc'], ['field2', 'asc']])` same as above\n * `.sort([['field1', 'desc'], 'field2'])` same as above\n * `.sort('field1')` ascending by field1\n\nOther options of `find`:\n\n* `fields` the fields to fetch (to avoid transferring the entire document)\n* `tailable` if true, makes the cursor [tailable](http://www.mongodb.org/display/DOCS/Tailable+Cursors).\n* `batchSize` The number of the subset of results to request the database\nto return for every request. This should initially be greater than 1 otherwise\nthe database will automatically close the cursor. The batch size can be set to 1\nwith `batchSize(n, function(err){})` after performing the initial query to the database.\n* `hint` See [Optimization: hint](http://www.mongodb.org/display/DOCS/Optimization#Optimization-Hint).\n* `explain` turns this into an explain query. You can also call\n`explain()` on any cursor to fetch the explanation.\n* `snapshot` prevents documents that are updated while the query is active\nfrom being returned multiple times. See more\n[details about query snapshots](http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database).\n* `timeout` if false, asks MongoDb not to time out this cursor after an\ninactivity period.\n\n\nFor information on how to create queries, see the\n[MongoDB section on querying](http://www.mongodb.org/display/DOCS/Querying).\n\n```javascript\n var mongodb = require('mongodb');\n var server = new mongodb.Server(\"127.0.0.1\", 27017, {});\n new mongodb.Db('test', server, {}).open(function (error, client) {\n if (error) throw error;\n var collection = new mongodb.Collection(client, 'test_collection');\n collection.find({}, {limit:10}).toArray(function(err, docs) {\n console.dir(docs);\n });\n });\n```\n\nInsert\n------\n\nSignature:\n\n```javascript\n collection.insert(docs, options, [callback]);\n```\n\nwhere `docs` can be a single document or an array of documents.\n\nUseful options:\n\n* `safe:true` Should always set if you have a callback.\n\nSee also: [MongoDB docs for insert](http://www.mongodb.org/display/DOCS/Inserting).\n\n```javascript\n var mongodb = require('mongodb');\n var server = new mongodb.Server(\"127.0.0.1\", 27017, {});\n new mongodb.Db('test', server, {w: 1}).open(function (error, client) {\n if (error) throw error;\n var collection = new mongodb.Collection(client, 'test_collection');\n collection.insert({hello: 'world'}, {safe:true},\n function(err, objects) {\n if (err) console.warn(err.message);\n if (err && err.message.indexOf('E11000 ') !== -1) {\n // this _id was already inserted in the database\n }\n });\n });\n```\n\nNote that there's no reason to pass a callback to the insert or update commands\nunless you use the `safe:true` option. If you don't specify `safe:true`, then\nyour callback will be called immediately.\n\nUpdate; update and insert (upsert)\n----------------------------------\n\nThe update operation will update the first document that matches your query\n(or all documents that match if you use `multi:true`).\nIf `safe:true`, `upsert` is not set, and no documents match, your callback will return 0 documents updated.\n\nSee the [MongoDB docs](http://www.mongodb.org/display/DOCS/Updating) for\nthe modifier (`$inc`, `$set`, `$push`, etc.) formats.\n\nSignature:\n\n```javascript\n collection.update(criteria, objNew, options, [callback]);\n```\n\nUseful options:\n\n* `safe:true` Should always set if you have a callback.\n* `multi:true` If set, all matching documents are updated, not just the first.\n* `upsert:true` Atomically inserts the document if no documents matched.\n\nExample for `update`:\n\n```javascript\n var mongodb = require('mongodb');\n var server = new mongodb.Server(\"127.0.0.1\", 27017, {});\n new mongodb.Db('test', server, {w: 1}).open(function (error, client) {\n if (error) throw error;\n var collection = new mongodb.Collection(client, 'test_collection');\n collection.update({hi: 'here'}, {$set: {hi: 'there'}}, {safe:true},\n function(err) {\n if (err) console.warn(err.message);\n else console.log('successfully updated');\n });\n });\n```\n\nFind and modify\n---------------\n\n`findAndModify` is like `update`, but it also gives the updated document to\nyour callback. But there are a few key differences between findAndModify and\nupdate:\n\n 1. The signatures differ.\n 2. You can only findAndModify a single item, not multiple items.\n\nSignature:\n\n```javascript\n collection.findAndModify(query, sort, update, options, callback)\n```\n\nThe sort parameter is used to specify which object to operate on, if more than\none document matches. It takes the same format as the cursor sort (see\nConnection.find above).\n\nSee the\n[MongoDB docs for findAndModify](http://www.mongodb.org/display/DOCS/findAndModify+Command)\nfor more details.\n\nUseful options:\n\n* `remove:true` set to a true to remove the object before returning\n* `new:true` set to true if you want to return the modified object rather than the original. Ignored for remove.\n* `upsert:true` Atomically inserts the document if no documents matched.\n\nExample for `findAndModify`:\n\n```javascript\n var mongodb = require('mongodb');\n var server = new mongodb.Server(\"127.0.0.1\", 27017, {});\n new mongodb.Db('test', server, {w: 1}).open(function (error, client) {\n if (error) throw error;\n var collection = new mongodb.Collection(client, 'test_collection');\n collection.findAndModify({hello: 'world'}, [['_id','asc']], {$set: {hi: 'there'}}, {},\n function(err, object) {\n if (err) console.warn(err.message);\n else console.dir(object); // undefined if no matching object exists.\n });\n });\n```\n\nSave\n----\n\nThe `save` method is a shorthand for upsert if the document contains an\n`_id`, or an insert if there is no `_id`.\n\nSponsors\n========\nJust as Felix Geisendörfer I'm also working on the driver for my own startup and this driver is a big project that also benefits other companies who are using MongoDB.\n\nIf your company could benefit from a even better-engineered node.js mongodb driver I would appreciate any type of sponsorship you may be able to provide. All the sponsors will get a lifetime display in this readme, priority support and help on problems and votes on the roadmap decisions for the driver. If you are interested contact me on [christkv AT g m a i l.com](mailto:christkv@gmail.com) for details.\n\nAnd I'm very thankful for code contributions. If you are interested in working on features please contact me so we can discuss API design and testing.\n\nRelease Notes\n=============\n\nSee HISTORY\n\nCredits\n=======\n\n1. [10gen](http://github.com/mongodb/mongo-ruby-driver/)\n2. [Google Closure Library](http://code.google.com/closure/library/)\n3. [Jonas Raoni Soares Silva](http://jsfromhell.com/classes/binary-parser)\n\nContributors\n============\n\nAaron Heckmann, Christoph Pojer, Pau Ramon Revilla, Nathan White, Emmerman, Seth LaForge, Boris Filipov, Stefan Schärmeli, Tedde Lundgren, renctan, Sergey Ukustov, Ciaran Jessup, kuno, srimonti, Erik Abele, Pratik Daga, Slobodan Utvic, Kristina Chodorow, Yonathan Randolph, Brian Noguchi, Sam Epstein, James Harrison Fisher, Vladimir Dronnikov, Ben Hockey, Henrik Johansson, Simon Weare, Alex Gorbatchev, Shimon Doodkin, Kyle Mueller, Eran Hammer-Lahav, Marcin Ciszak, François de Metz, Vinay Pulim, nstielau, Adam Wiggins, entrinzikyl, Jeremy Selier, Ian Millington, Public Keating, andrewjstone, Christopher Stott, Corey Jewett, brettkiefer, Rob Holland, Senmiao Liu, heroic, gitfy\n\nLicense\n=======\n\n Copyright 2009 - 2012 Christian Amor Kvalheim.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n", - "_id": "mongodb@1.2.14", - "_from": "mongodb@1.2.14" + "_id": "mongodb@1.2.13", + "_from": "mongodb@1.2.13" } diff --git a/node_modules/mongoose/node_modules/mpath/.travis.yml b/node_modules/mongoose/node_modules/mpath/.travis.yml deleted file mode 100644 index 09c230f..0000000 --- a/node_modules/mongoose/node_modules/mpath/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.6 - - 0.8 diff --git a/node_modules/mongoose/node_modules/mpath/History.md b/node_modules/mongoose/node_modules/mpath/History.md deleted file mode 100644 index 4fbf338..0000000 --- a/node_modules/mongoose/node_modules/mpath/History.md +++ /dev/null @@ -1,16 +0,0 @@ - -0.1.1 / 2012-12-21 -================== - - * added; map support - -0.1.0 / 2012-12-13 -================== - - * added; set('array.property', val, object) support - * added; get('array.property', object) support - -0.0.1 / 2012-11-03 -================== - - * initial release diff --git a/node_modules/mongoose/node_modules/mpath/LICENSE b/node_modules/mongoose/node_modules/mpath/LICENSE deleted file mode 100644 index 38c529d..0000000 --- a/node_modules/mongoose/node_modules/mpath/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2012 [Aaron Heckmann](aaron.heckmann+github@gmail.com) - -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. diff --git a/node_modules/mongoose/node_modules/mpath/Makefile b/node_modules/mongoose/node_modules/mpath/Makefile deleted file mode 100644 index b0bb081..0000000 --- a/node_modules/mongoose/node_modules/mpath/Makefile +++ /dev/null @@ -1,5 +0,0 @@ - -test: - @node_modules/mocha/bin/mocha -A $(T) - -.PHONY: test diff --git a/node_modules/mongoose/node_modules/mpath/README.md b/node_modules/mongoose/node_modules/mpath/README.md deleted file mode 100644 index 9831dd0..0000000 --- a/node_modules/mongoose/node_modules/mpath/README.md +++ /dev/null @@ -1,278 +0,0 @@ -#mpath - -{G,S}et javascript object values using MongoDB-like path notation. - -###Getting - -```js -var mpath = require('mpath'); - -var obj = { - comments: [ - { title: 'funny' }, - { title: 'exciting!' } - ] -} - -mpath.get('comments.1.title', obj) // 'exciting!' -``` - -`mpath.get` supports array property notation as well. - -```js -var obj = { - comments: [ - { title: 'funny' }, - { title: 'exciting!' } - ] -} - -mpath.get('comments.title', obj) // ['funny', 'exciting!'] -``` - -Array property and indexing syntax, when used together, are very powerful. - -```js -var obj = { - array: [ - { o: { array: [{x: {b: [4,6,8]}}, { y: 10} ] }} - , { o: { array: [{x: {b: [1,2,3]}}, { x: {z: 10 }}, { x: 'Turkey Day' }] }} - , { o: { array: [{x: {b: null }}, { x: { b: [null, 1]}}] }} - , { o: { array: [{x: null }] }} - , { o: { array: [{y: 3 }] }} - , { o: { array: [3, 0, null] }} - , { o: { name: 'ha' }} - ]; -} - -var found = mpath.get('array.o.array.x.b.1', obj); - -console.log(found); // prints.. - - [ [6, undefined] - , [2, undefined, undefined] - , [null, 1] - , [null] - , [undefined] - , [undefined, undefined, undefined] - , undefined - ] - -``` - -#####Field selection rules: - -The following rules are iteratively applied to each `segment` in the passed `path`. For example: - -```js -var path = 'one.two.14'; // path -'one' // segment 0 -'two' // segment 1 -14 // segment 2 -``` - -- 1) when value of the segment parent is not an array, return the value of `parent.segment` -- 2) when value of the segment parent is an array - - a) if the segment is an integer, replace the parent array with the value at `parent[segment]` - - b) if not an integer, keep the array but replace each array `item` with the value returned from calling `get(remainingSegments, item)` or undefined if falsey. - -#####Maps - -`mpath.get` also accepts an optional `map` argument which receives each individual found value. The value returned from the `map` function will be used in the original found values place. - -```js -var obj = { - comments: [ - { title: 'funny' }, - { title: 'exciting!' } - ] -} - -mpath.get('comments.title', obj, function (val) { - return 'funny' == val - ? 'amusing' - : val; -}); -// ['amusing', 'exciting!'] -``` - -###Setting - -```js -var obj = { - comments: [ - { title: 'funny' }, - { title: 'exciting!' } - ] -} - -mpath.set('comments.1.title', 'hilarious', obj) -console.log(obj.comments[1].title) // 'hilarious' -``` - -`mpath.set` supports the same array property notation as `mpath.get`. - -```js -var obj = { - comments: [ - { title: 'funny' }, - { title: 'exciting!' } - ] -} - -mpath.set('comments.title', ['hilarious', 'fruity'], obj); - -console.log(obj); // prints.. - - { comments: [ - { title: 'hilarious' }, - { title: 'fruity' } - ]} -``` - -Array property and indexing syntax can be used together also when setting. - -```js -var obj = { - array: [ - { o: { array: [{x: {b: [4,6,8]}}, { y: 10} ] }} - , { o: { array: [{x: {b: [1,2,3]}}, { x: {z: 10 }}, { x: 'Turkey Day' }] }} - , { o: { array: [{x: {b: null }}, { x: { b: [null, 1]}}] }} - , { o: { array: [{x: null }] }} - , { o: { array: [{y: 3 }] }} - , { o: { array: [3, 0, null] }} - , { o: { name: 'ha' }} - ] -} - -mpath.set('array.1.o', 'this was changed', obj); - -console.log(require('util').inspect(obj, false, 1000)); // prints.. - -{ - array: [ - { o: { array: [{x: {b: [4,6,8]}}, { y: 10} ] }} - , { o: 'this was changed' } - , { o: { array: [{x: {b: null }}, { x: { b: [null, 1]}}] }} - , { o: { array: [{x: null }] }} - , { o: { array: [{y: 3 }] }} - , { o: { array: [3, 0, null] }} - , { o: { name: 'ha' }} - ]; -} - -mpath.set('array.o.array.x', 'this was changed too', obj); - -console.log(require('util').inspect(obj, false, 1000)); // prints.. - -{ - array: [ - { o: { array: [{x: 'this was changed too'}, { y: 10, x: 'this was changed too'} ] }} - , { o: 'this was changed' } - , { o: { array: [{x: 'this was changed too'}, { x: 'this was changed too'}] }} - , { o: { array: [{x: 'this was changed too'}] }} - , { o: { array: [{x: 'this was changed too', y: 3 }] }} - , { o: { array: [3, 0, null] }} - , { o: { name: 'ha' }} - ]; -} -``` - -####Setting arrays - -By default, setting a property within an array to another array results in each element of the new array being set to the item in the destination array at the matching index. An example is helpful. - -```js -var obj = { - comments: [ - { title: 'funny' }, - { title: 'exciting!' } - ] -} - -mpath.set('comments.title', ['hilarious', 'fruity'], obj); - -console.log(obj); // prints.. - - { comments: [ - { title: 'hilarious' }, - { title: 'fruity' } - ]} -``` - -If we do not desire this destructuring-like assignment behavior we may instead specify the `$` operator in the path being set to force the array to be copied directly. - -```js -var obj = { - comments: [ - { title: 'funny' }, - { title: 'exciting!' } - ] -} - -mpath.set('comments.$.title', ['hilarious', 'fruity'], obj); - -console.log(obj); // prints.. - - { comments: [ - { title: ['hilarious', 'fruity'] }, - { title: ['hilarious', 'fruity'] } - ]} -``` - -####Field assignment rules - -The rules utilized mirror those used on `mpath.get`, meaning we can take values returned from `mpath.get`, update them, and reassign them using `mpath.set`. Note that setting nested arrays of arrays can get unweildy quickly. Check out the [tests](https://github.com/aheckmann/mpath/blob/master/test/index.js) for more extreme examples. - -#####Maps - -`mpath.set` also accepts an optional `map` argument which receives each individual value being set. The value returned from the `map` function will be used in the original values place. - -```js -var obj = { - comments: [ - { title: 'funny' }, - { title: 'exciting!' } - ] -} - -mpath.set('comments.title', ['hilarious', 'fruity'], obj, function (val) { - return val.length; -}); - -console.log(obj); // prints.. - - { comments: [ - { title: 9 }, - { title: 6 } - ]} -``` - -### Custom object types - -Sometimes you may want to enact the same functionality on custom object types that store all their real data internally, say for an ODM type object. No fear, `mpath` has you covered. Simply pass the name of the property being used to store the internal data and it will be traversed instead: - -```js -var mpath = require('mpath'); - -var obj = { - comments: [ - { title: 'exciting!', _doc: { title: 'great!' }} - ] -} - -mpath.get('comments.0.title', obj, '_doc') // 'great!' -mpath.set('comments.0.title', 'nov 3rd', obj, '_doc') -mpath.get('comments.0.title', obj, '_doc') // 'nov 3rd' -mpath.get('comments.0.title', obj) // 'exciting' -``` - -When used with a `map`, the `map` argument comes last. - -```js -mpath.get(path, obj, '_doc', map); -mpath.set(path, val, obj, '_doc', map); -``` - -[LICENSE](https://github.com/aheckmann/mpath/blob/master/LICENSE) - diff --git a/node_modules/mongoose/node_modules/mpath/index.js b/node_modules/mongoose/node_modules/mpath/index.js deleted file mode 100644 index f7b65dd..0000000 --- a/node_modules/mongoose/node_modules/mpath/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = exports = require('./lib'); diff --git a/node_modules/mongoose/node_modules/mpath/lib/index.js b/node_modules/mongoose/node_modules/mpath/lib/index.js deleted file mode 100644 index 24e1e83..0000000 --- a/node_modules/mongoose/node_modules/mpath/lib/index.js +++ /dev/null @@ -1,183 +0,0 @@ - -/** - * Returns the value of object `o` at the given `path`. - * - * ####Example: - * - * var obj = { - * comments: [ - * { title: 'exciting!', _doc: { title: 'great!' }} - * , { title: 'number dos' } - * ] - * } - * - * mpath.get('comments.0.title', o) // 'exciting!' - * mpath.get('comments.0.title', o, '_doc') // 'great!' - * mpath.get('comments.title', o) // ['exciting!', 'number dos'] - * - * // summary - * mpath.get(path, o) - * mpath.get(path, o, special) - * mpath.get(path, o, map) - * mpath.get(path, o, special, map) - * - * @param {String} path - * @param {Object} o - * @param {String} [special] When this property name is present on any object in the path, walking will continue on the value of this property. - * @param {Function} [map] Optional function which receives each individual found value. The value returned from `map` is used in the original values place. - */ - -exports.get = function (path, o, special, map) { - if ('function' == typeof special) { - map = special; - special = undefined; - } - - map || (map = K); - - var parts = 'string' == typeof path - ? path.split('.') - : path - - if (!Array.isArray(parts)) { - throw new TypeError('Invalid `path`. Must be either string or array'); - } - - var obj = o - , part; - - for (var i = 0; i < parts.length; ++i) { - part = parts[i]; - - if (Array.isArray(obj) && !/^\d+$/.test(part)) { - // reading a property from the array items - var paths = parts.slice(i); - - return obj.map(function (item) { - return item - ? exports.get(paths, item, special, map) - : map(undefined); - }); - } - - obj = special && obj[special] - ? obj[special][part] - : obj[part]; - - if (!obj) return map(obj); - } - - return map(obj); -} - -/** - * Sets the `val` at the given `path` of object `o`. - * - * @param {String} path - * @param {Anything} val - * @param {Object} o - * @param {String} [special] When this property name is present on any object in the path, walking will continue on the value of this property. - * @param {Function} [map] Optional function which is passed each individual value before setting it. The value returned from `map` is used in the original values place. - - */ - -exports.set = function (path, val, o, special, map, _copying) { - if ('function' == typeof special) { - map = special; - special = undefined; - } - - map || (map = K); - - var parts = 'string' == typeof path - ? path.split('.') - : path - - if (!Array.isArray(parts)) { - throw new TypeError('Invalid `path`. Must be either string or array'); - } - - if (null == o) return; - - // the existance of $ in a path tells us if the user desires - // the copying of an array instead of setting each value of - // the array to the one by one to matching positions of the - // current array. - var copy = _copying || /\$/.test(path) - , obj = o - , part - - for (var i = 0, len = parts.length - 1; i < len; ++i) { - part = parts[i]; - - if ('$' == part) { - if (i == len - 1) { - break; - } else { - continue; - } - } - - if (Array.isArray(obj) && !/^\d+$/.test(part)) { - var paths = parts.slice(i); - if (!copy && Array.isArray(val)) { - for (var j = 0; j < obj.length && j < val.length; ++j) { - // assignment of single values of array - exports.set(paths, val[j], obj[j], special, map, copy); - } - } else { - for (var j = 0; j < obj.length; ++j) { - // assignment of entire value - exports.set(paths, val, obj[j], special, map, copy); - } - } - return; - } - - obj = special && obj[special] - ? obj[special][part] - : obj[part]; - - if (!obj) return; - } - - // process the last property of the path - - part = parts[len]; - - // use the special property if exists - if (special && obj[special]) { - obj = obj[special]; - } - - // set the value on the last branch - if (Array.isArray(obj) && !/^\d+$/.test(part)) { - if (!copy && Array.isArray(val)) { - for (var item, j = 0; j < obj.length && j < val.length; ++j) { - item = obj[j]; - if (item) { - if (item[special]) item = item[special]; - item[part] = map(val[j]); - } - } - } else { - for (var j = 0; j < obj.length; ++j) { - item = obj[j]; - if (item) { - if (item[special]) item = item[special]; - item[part] = map(val); - } - } - } - } else { - obj[part] = map(val); - } -} - -/*! - * Returns the value passed to it. - */ - -function K (v) { - return v; -} diff --git a/node_modules/mongoose/node_modules/mpath/package.json b/node_modules/mongoose/node_modules/mpath/package.json deleted file mode 100644 index 5f86d07..0000000 --- a/node_modules/mongoose/node_modules/mpath/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "mpath", - "version": "0.1.1", - "description": "{G,S}et object values using MongoDB path notation", - "main": "index.js", - "scripts": { - "test": "make test" - }, - "repository": { - "type": "git", - "url": "git://github.com/aheckmann/mpath.git" - }, - "keywords": [ - "mongodb", - "path", - "get", - "set" - ], - "author": { - "name": "Aaron Heckmann", - "email": "aaron.heckmann+github@gmail.com" - }, - "license": "MIT", - "devDependencies": { - "mocha": "1.6.0" - }, - "readme": "#mpath\n\n{G,S}et javascript object values using MongoDB-like path notation.\n\n###Getting\n\n```js\nvar mpath = require('mpath');\n\nvar obj = {\n comments: [\n { title: 'funny' },\n { title: 'exciting!' }\n ]\n}\n\nmpath.get('comments.1.title', obj) // 'exciting!'\n```\n\n`mpath.get` supports array property notation as well.\n\n```js\nvar obj = {\n comments: [\n { title: 'funny' },\n { title: 'exciting!' }\n ]\n}\n\nmpath.get('comments.title', obj) // ['funny', 'exciting!']\n```\n\nArray property and indexing syntax, when used together, are very powerful.\n\n```js\nvar obj = {\n array: [\n { o: { array: [{x: {b: [4,6,8]}}, { y: 10} ] }}\n , { o: { array: [{x: {b: [1,2,3]}}, { x: {z: 10 }}, { x: 'Turkey Day' }] }}\n , { o: { array: [{x: {b: null }}, { x: { b: [null, 1]}}] }}\n , { o: { array: [{x: null }] }}\n , { o: { array: [{y: 3 }] }}\n , { o: { array: [3, 0, null] }}\n , { o: { name: 'ha' }}\n ];\n}\n\nvar found = mpath.get('array.o.array.x.b.1', obj);\n\nconsole.log(found); // prints..\n\n [ [6, undefined]\n , [2, undefined, undefined]\n , [null, 1]\n , [null]\n , [undefined]\n , [undefined, undefined, undefined]\n , undefined\n ]\n\n```\n\n#####Field selection rules:\n\nThe following rules are iteratively applied to each `segment` in the passed `path`. For example:\n\n```js\nvar path = 'one.two.14'; // path\n'one' // segment 0\n'two' // segment 1\n14 // segment 2\n```\n\n- 1) when value of the segment parent is not an array, return the value of `parent.segment`\n- 2) when value of the segment parent is an array\n - a) if the segment is an integer, replace the parent array with the value at `parent[segment]`\n - b) if not an integer, keep the array but replace each array `item` with the value returned from calling `get(remainingSegments, item)` or undefined if falsey.\n\n#####Maps\n\n`mpath.get` also accepts an optional `map` argument which receives each individual found value. The value returned from the `map` function will be used in the original found values place.\n\n```js\nvar obj = {\n comments: [\n { title: 'funny' },\n { title: 'exciting!' }\n ]\n}\n\nmpath.get('comments.title', obj, function (val) {\n return 'funny' == val\n ? 'amusing'\n : val;\n});\n// ['amusing', 'exciting!']\n```\n\n###Setting\n\n```js\nvar obj = {\n comments: [\n { title: 'funny' },\n { title: 'exciting!' }\n ]\n}\n\nmpath.set('comments.1.title', 'hilarious', obj)\nconsole.log(obj.comments[1].title) // 'hilarious'\n```\n\n`mpath.set` supports the same array property notation as `mpath.get`.\n\n```js\nvar obj = {\n comments: [\n { title: 'funny' },\n { title: 'exciting!' }\n ]\n}\n\nmpath.set('comments.title', ['hilarious', 'fruity'], obj);\n\nconsole.log(obj); // prints..\n\n { comments: [\n { title: 'hilarious' },\n { title: 'fruity' }\n ]}\n```\n\nArray property and indexing syntax can be used together also when setting.\n\n```js\nvar obj = {\n array: [\n { o: { array: [{x: {b: [4,6,8]}}, { y: 10} ] }}\n , { o: { array: [{x: {b: [1,2,3]}}, { x: {z: 10 }}, { x: 'Turkey Day' }] }}\n , { o: { array: [{x: {b: null }}, { x: { b: [null, 1]}}] }}\n , { o: { array: [{x: null }] }}\n , { o: { array: [{y: 3 }] }}\n , { o: { array: [3, 0, null] }}\n , { o: { name: 'ha' }}\n ]\n}\n\nmpath.set('array.1.o', 'this was changed', obj);\n\nconsole.log(require('util').inspect(obj, false, 1000)); // prints..\n\n{\n array: [\n { o: { array: [{x: {b: [4,6,8]}}, { y: 10} ] }}\n , { o: 'this was changed' }\n , { o: { array: [{x: {b: null }}, { x: { b: [null, 1]}}] }}\n , { o: { array: [{x: null }] }}\n , { o: { array: [{y: 3 }] }}\n , { o: { array: [3, 0, null] }}\n , { o: { name: 'ha' }}\n ];\n}\n\nmpath.set('array.o.array.x', 'this was changed too', obj);\n\nconsole.log(require('util').inspect(obj, false, 1000)); // prints..\n\n{\n array: [\n { o: { array: [{x: 'this was changed too'}, { y: 10, x: 'this was changed too'} ] }}\n , { o: 'this was changed' }\n , { o: { array: [{x: 'this was changed too'}, { x: 'this was changed too'}] }}\n , { o: { array: [{x: 'this was changed too'}] }}\n , { o: { array: [{x: 'this was changed too', y: 3 }] }}\n , { o: { array: [3, 0, null] }}\n , { o: { name: 'ha' }}\n ];\n}\n```\n\n####Setting arrays\n\nBy default, setting a property within an array to another array results in each element of the new array being set to the item in the destination array at the matching index. An example is helpful.\n\n```js\nvar obj = {\n comments: [\n { title: 'funny' },\n { title: 'exciting!' }\n ]\n}\n\nmpath.set('comments.title', ['hilarious', 'fruity'], obj);\n\nconsole.log(obj); // prints..\n\n { comments: [\n { title: 'hilarious' },\n { title: 'fruity' }\n ]}\n```\n\nIf we do not desire this destructuring-like assignment behavior we may instead specify the `$` operator in the path being set to force the array to be copied directly.\n\n```js\nvar obj = {\n comments: [\n { title: 'funny' },\n { title: 'exciting!' }\n ]\n}\n\nmpath.set('comments.$.title', ['hilarious', 'fruity'], obj);\n\nconsole.log(obj); // prints..\n\n { comments: [\n { title: ['hilarious', 'fruity'] },\n { title: ['hilarious', 'fruity'] }\n ]}\n```\n\n####Field assignment rules\n\nThe rules utilized mirror those used on `mpath.get`, meaning we can take values returned from `mpath.get`, update them, and reassign them using `mpath.set`. Note that setting nested arrays of arrays can get unweildy quickly. Check out the [tests](https://github.com/aheckmann/mpath/blob/master/test/index.js) for more extreme examples.\n\n#####Maps\n\n`mpath.set` also accepts an optional `map` argument which receives each individual value being set. The value returned from the `map` function will be used in the original values place.\n\n```js\nvar obj = {\n comments: [\n { title: 'funny' },\n { title: 'exciting!' }\n ]\n}\n\nmpath.set('comments.title', ['hilarious', 'fruity'], obj, function (val) {\n return val.length;\n});\n\nconsole.log(obj); // prints..\n\n { comments: [\n { title: 9 },\n { title: 6 }\n ]}\n```\n\n### Custom object types\n\nSometimes you may want to enact the same functionality on custom object types that store all their real data internally, say for an ODM type object. No fear, `mpath` has you covered. Simply pass the name of the property being used to store the internal data and it will be traversed instead:\n\n```js\nvar mpath = require('mpath');\n\nvar obj = {\n comments: [\n { title: 'exciting!', _doc: { title: 'great!' }}\n ]\n}\n\nmpath.get('comments.0.title', obj, '_doc') // 'great!'\nmpath.set('comments.0.title', 'nov 3rd', obj, '_doc')\nmpath.get('comments.0.title', obj, '_doc') // 'nov 3rd'\nmpath.get('comments.0.title', obj) // 'exciting'\n```\n\nWhen used with a `map`, the `map` argument comes last.\n\n```js\nmpath.get(path, obj, '_doc', map);\nmpath.set(path, val, obj, '_doc', map);\n```\n\n[LICENSE](https://github.com/aheckmann/mpath/blob/master/LICENSE)\n\n", - "_id": "mpath@0.1.1", - "_from": "mpath@0.1.1" -} diff --git a/node_modules/mongoose/node_modules/mpath/test/index.js b/node_modules/mongoose/node_modules/mpath/test/index.js deleted file mode 100644 index 98e119a..0000000 --- a/node_modules/mongoose/node_modules/mpath/test/index.js +++ /dev/null @@ -1,1630 +0,0 @@ - -/** - * Test dependencies. - */ - -var mpath = require('../') -var assert = require('assert') - -/** - * logging helper - */ - -function log (o) { - console.log(); - console.log(require('util').inspect(o, false, 1000)); -} - -/** - * special path for override tests - */ - -var special = '_doc'; - -/** - * Tests - */ - -describe('mpath', function(){ - - /** - * test doc creator - */ - - function doc () { - var o = { first: { second: { third: [3,{ name: 'aaron' }, 9] }}}; - o.comments = [ - { name: 'one' } - , { name: 'two', _doc: { name: '2' }} - , { name: 'three' - , comments: [{},{ comments: [{val: 'twoo'}]}] - , _doc: { name: '3', comments: [{},{ _doc: { comments: [{ val: 2 }] }}] }} - ]; - o.name = 'jiro'; - o.array = [ - { o: { array: [{x: {b: [4,6,8]}}, { y: 10} ] }} - , { o: { array: [{x: {b: [1,2,3]}}, { x: {z: 10 }}, { x: {b: 'hi'}}] }} - , { o: { array: [{x: {b: null }}, { x: { b: [null, 1]}}] }} - , { o: { array: [{x: null }] }} - , { o: { array: [{y: 3 }] }} - , { o: { array: [3, 0, null] }} - , { o: { name: 'ha' }} - ]; - o.arr = [ - { arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } - , { yep: true } - ] - return o; - } - - describe('get', function(){ - var o = doc(); - - it('`path` must be a string or array', function(done){ - assert.throws(function () { - mpath.get({}, o); - }, /Must be either string or array/); - assert.throws(function () { - mpath.get(4, o); - }, /Must be either string or array/); - assert.throws(function () { - mpath.get(function(){}, o); - }, /Must be either string or array/); - assert.throws(function () { - mpath.get(/asdf/, o); - }, /Must be either string or array/); - assert.throws(function () { - mpath.get(Math, o); - }, /Must be either string or array/); - assert.throws(function () { - mpath.get(Buffer, o); - }, /Must be either string or array/); - assert.doesNotThrow(function () { - mpath.get('string', o); - }); - assert.doesNotThrow(function () { - mpath.get([], o); - }); - done(); - }) - - describe('without `special`', function(){ - it('works', function(done){ - assert.equal('jiro', mpath.get('name', o)); - - assert.deepEqual( - { second: { third: [3,{ name: 'aaron' }, 9] }} - , mpath.get('first', o) - ); - - assert.deepEqual( - { third: [3,{ name: 'aaron' }, 9] } - , mpath.get('first.second', o) - ); - - assert.deepEqual( - [3,{ name: 'aaron' }, 9] - , mpath.get('first.second.third', o) - ); - - assert.deepEqual( - 3 - , mpath.get('first.second.third.0', o) - ); - - assert.deepEqual( - 9 - , mpath.get('first.second.third.2', o) - ); - - assert.deepEqual( - { name: 'aaron' } - , mpath.get('first.second.third.1', o) - ); - - assert.deepEqual( - 'aaron' - , mpath.get('first.second.third.1.name', o) - ); - - assert.deepEqual([ - { name: 'one' } - , { name: 'two', _doc: { name: '2' }} - , { name: 'three' - , comments: [{},{ comments: [{val: 'twoo'}]}] - , _doc: { name: '3', comments: [{},{ _doc: { comments: [{ val: 2 }] }}]}}], - mpath.get('comments', o)); - - assert.deepEqual({ name: 'one' }, mpath.get('comments.0', o)); - assert.deepEqual('one', mpath.get('comments.0.name', o)); - assert.deepEqual('two', mpath.get('comments.1.name', o)); - assert.deepEqual('three', mpath.get('comments.2.name', o)); - - assert.deepEqual([{},{ comments: [{val: 'twoo'}]}] - , mpath.get('comments.2.comments', o)); - - assert.deepEqual({ comments: [{val: 'twoo'}]} - , mpath.get('comments.2.comments.1', o)); - - assert.deepEqual('twoo', mpath.get('comments.2.comments.1.comments.0.val', o)); - - done(); - }) - - it('handles array.property dot-notation', function(done){ - assert.deepEqual( - ['one', 'two', 'three'] - , mpath.get('comments.name', o) - ); - done(); - }) - - it('handles array.array notation', function(done){ - assert.deepEqual( - [undefined, undefined, [{}, {comments:[{val:'twoo'}]}]] - , mpath.get('comments.comments', o) - ); - done(); - }) - - it('handles prop.prop.prop.arrayProperty notation', function(done){ - assert.deepEqual( - [undefined, 'aaron', undefined] - , mpath.get('first.second.third.name', o) - ); - assert.deepEqual( - [1, 'aaron', 1] - , mpath.get('first.second.third.name', o, function (v) { - return undefined === v ? 1 : v; - }) - ); - done(); - }) - - it('handles array.prop.array', function(done){ - assert.deepEqual( - [ [{x: {b: [4,6,8]}}, { y: 10} ] - , [{x: {b: [1,2,3]}}, { x: {z: 10 }}, { x: {b: 'hi'}}] - , [{x: {b: null }}, { x: { b: [null, 1]}}] - , [{x: null }] - , [{y: 3 }] - , [3, 0, null] - , undefined - ] - , mpath.get('array.o.array', o) - ); - done(); - }) - - it('handles array.prop.array.index', function(done){ - assert.deepEqual( - [ {x: {b: [4,6,8]}} - , {x: {b: [1,2,3]}} - , {x: {b: null }} - , {x: null } - , {y: 3 } - , 3 - , undefined - ] - , mpath.get('array.o.array.0', o) - ); - done(); - }) - - it('handles array.prop.array.index.prop', function(done){ - assert.deepEqual( - [ {b: [4,6,8]} - , {b: [1,2,3]} - , {b: null } - , null - , undefined - , undefined - , undefined - ] - , mpath.get('array.o.array.0.x', o) - ); - done(); - }) - - it('handles array.prop.array.prop', function(done){ - assert.deepEqual( - [ [undefined, 10 ] - , [undefined, undefined, undefined] - , [undefined, undefined] - , [undefined] - , [3] - , [undefined, undefined, undefined] - , undefined - ] - , mpath.get('array.o.array.y', o) - ); - assert.deepEqual( - [ [{b: [4,6,8]}, undefined] - , [{b: [1,2,3]}, {z: 10 }, {b: 'hi'}] - , [{b: null }, { b: [null, 1]}] - , [null] - , [undefined] - , [undefined, undefined, undefined] - , undefined - ] - , mpath.get('array.o.array.x', o) - ); - done(); - }) - - it('handles array.prop.array.prop.prop', function(done){ - assert.deepEqual( - [ [[4,6,8], undefined] - , [[1,2,3], undefined, 'hi'] - , [null, [null, 1]] - , [null] - , [undefined] - , [undefined, undefined, undefined] - , undefined - ] - , mpath.get('array.o.array.x.b', o) - ); - done(); - }) - - it('handles array.prop.array.prop.prop.index', function(done){ - assert.deepEqual( - [ [6, undefined] - , [2, undefined, 'i'] // undocumented feature (string indexing) - , [null, 1] - , [null] - , [undefined] - , [undefined, undefined, undefined] - , undefined - ] - , mpath.get('array.o.array.x.b.1', o) - ); - assert.deepEqual( - [ [6, 0] - , [2, 0, 'i'] // undocumented feature (string indexing) - , [null, 1] - , [null] - , [0] - , [0, 0, 0] - , 0 - ] - , mpath.get('array.o.array.x.b.1', o, function (v) { - return undefined === v ? 0 : v; - }) - ); - done(); - }) - - it('handles array.index.prop.prop', function(done){ - assert.deepEqual( - [{x: {b: [1,2,3]}}, { x: {z: 10 }}, { x: {b: 'hi'}}] - , mpath.get('array.1.o.array', o) - ); - assert.deepEqual( - ['hi','hi','hi'] - , mpath.get('array.1.o.array', o, function (v) { - if (Array.isArray(v)) { - return v.map(function (val) { - return 'hi'; - }) - } - return v; - }) - ); - done(); - }) - - it('handles array.array.index', function(done){ - assert.deepEqual( - [{ a: { c: 48 }}, undefined] - , mpath.get('arr.arr.1', o) - ); - assert.deepEqual( - ['woot', undefined] - , mpath.get('arr.arr.1', o, function (v) { - if (v && v.a && v.a.c) return 'woot'; - return v; - }) - ); - done(); - }) - - it('handles array.array.index.prop', function(done){ - assert.deepEqual( - [{ c: 48 }, 'woot'] - , mpath.get('arr.arr.1.a', o, function (v) { - if (undefined === v) return 'woot'; - return v; - }) - ); - assert.deepEqual( - [{ c: 48 }, undefined] - , mpath.get('arr.arr.1.a', o) - ); - mpath.set('arr.arr.1.a', [{c:49},undefined], o) - assert.deepEqual( - [{ c: 49 }, undefined] - , mpath.get('arr.arr.1.a', o) - ); - mpath.set('arr.arr.1.a', [{c:48},undefined], o) - done(); - }) - - it('handles array.array.index.prop.prop', function(done){ - assert.deepEqual( - [48, undefined] - , mpath.get('arr.arr.1.a.c', o) - ); - assert.deepEqual( - [48, 'woot'] - , mpath.get('arr.arr.1.a.c', o, function (v) { - if (undefined === v) return 'woot'; - return v; - }) - ); - done(); - }) - - }) - - describe('with `special`', function(){ - it('works', function(done){ - assert.equal('jiro', mpath.get('name', o, special)); - - assert.deepEqual( - { second: { third: [3,{ name: 'aaron' }, 9] }} - , mpath.get('first', o, special) - ); - - assert.deepEqual( - { third: [3,{ name: 'aaron' }, 9] } - , mpath.get('first.second', o, special) - ); - - assert.deepEqual( - [3,{ name: 'aaron' }, 9] - , mpath.get('first.second.third', o, special) - ); - - assert.deepEqual( - 3 - , mpath.get('first.second.third.0', o, special) - ); - - assert.deepEqual( - 4 - , mpath.get('first.second.third.0', o, special, function (v) { - return 3 === v ? 4 : v; - }) - ); - - assert.deepEqual( - 9 - , mpath.get('first.second.third.2', o, special) - ); - - assert.deepEqual( - { name: 'aaron' } - , mpath.get('first.second.third.1', o, special) - ); - - assert.deepEqual( - 'aaron' - , mpath.get('first.second.third.1.name', o, special) - ); - - assert.deepEqual([ - { name: 'one' } - , { name: 'two', _doc: { name: '2' }} - , { name: 'three' - , comments: [{},{ comments: [{val: 'twoo'}]}] - , _doc: { name: '3', comments: [{},{ _doc: { comments: [{ val: 2 }] }}]}}], - mpath.get('comments', o, special)); - - assert.deepEqual({ name: 'one' }, mpath.get('comments.0', o, special)); - assert.deepEqual('one', mpath.get('comments.0.name', o, special)); - assert.deepEqual('2', mpath.get('comments.1.name', o, special)); - assert.deepEqual('3', mpath.get('comments.2.name', o, special)); - assert.deepEqual('nice', mpath.get('comments.2.name', o, special, function (v) { - return '3' === v ? 'nice' : v; - })); - - assert.deepEqual([{},{ _doc: { comments: [{ val: 2 }] }}] - , mpath.get('comments.2.comments', o, special)); - - assert.deepEqual({ _doc: { comments: [{val: 2}]}} - , mpath.get('comments.2.comments.1', o, special)); - - assert.deepEqual(2, mpath.get('comments.2.comments.1.comments.0.val', o, special)); - done(); - }) - - it('handles array.property dot-notation', function(done){ - assert.deepEqual( - ['one', '2', '3'] - , mpath.get('comments.name', o, special) - ); - assert.deepEqual( - ['one', 2, '3'] - , mpath.get('comments.name', o, special, function (v) { - return '2' === v ? 2 : v - }) - ); - done(); - }) - - it('handles array.array notation', function(done){ - assert.deepEqual( - [undefined, undefined, [{}, {_doc: { comments:[{val:2}]}}]] - , mpath.get('comments.comments', o, special) - ); - done(); - }) - - it('handles array.array.index.array', function(done){ - assert.deepEqual( - [undefined, undefined, [{val:2}]] - , mpath.get('comments.comments.1.comments', o, special) - ); - done(); - }) - - it('handles array.array.index.array.prop', function(done){ - assert.deepEqual( - [undefined, undefined, [2]] - , mpath.get('comments.comments.1.comments.val', o, special) - ); - assert.deepEqual( - ['nil', 'nil', [2]] - , mpath.get('comments.comments.1.comments.val', o, special, function (v) { - return undefined === v ? 'nil' : v; - }) - ); - done(); - }) - }) - - }) - - describe('set', function(){ - describe('without `special`', function(){ - var o = doc(); - - it('works', function(done){ - mpath.set('name', 'a new val', o, function (v) { - return 'a new val' === v ? 'changed' : v; - }); - assert.deepEqual('changed', o.name); - - mpath.set('name', 'changed', o); - assert.deepEqual('changed', o.name); - - mpath.set('first.second.third', [1,{name:'x'},9], o); - assert.deepEqual([1,{name:'x'},9], o.first.second.third); - - mpath.set('first.second.third.1.name', 'y', o) - assert.deepEqual([1,{name:'y'},9], o.first.second.third); - - mpath.set('comments.1.name', 'ttwwoo', o); - assert.deepEqual({ name: 'ttwwoo', _doc: { name: '2' }}, o.comments[1]); - - mpath.set('comments.2.comments.1.comments.0.expand', 'added', o); - assert.deepEqual( - { val: 'twoo', expand: 'added'} - , o.comments[2].comments[1].comments[0]); - - mpath.set('comments.2.comments.1.comments.2', 'added', o); - assert.equal(3, o.comments[2].comments[1].comments.length); - assert.deepEqual( - { val: 'twoo', expand: 'added'} - , o.comments[2].comments[1].comments[0]); - assert.deepEqual( - undefined - , o.comments[2].comments[1].comments[1]); - assert.deepEqual( - 'added' - , o.comments[2].comments[1].comments[2]); - - done(); - }) - - describe('array.path', function(){ - describe('with single non-array value', function(){ - it('works', function(done){ - mpath.set('arr.yep', false, o, function (v) { - return false === v ? true: v; - }); - assert.deepEqual([ - { yep: true, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } - , { yep: true } - ], o.arr); - - mpath.set('arr.yep', false, o); - - assert.deepEqual([ - { yep: false, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } - , { yep: false } - ], o.arr); - - done(); - }) - }) - describe('with array of values', function(){ - it('that are equal in length', function(done){ - mpath.set('arr.yep', ['one',2], o, function (v) { - return 'one' === v ? 1 : v; - }); - assert.deepEqual([ - { yep: 1, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } - , { yep: 2 } - ], o.arr); - mpath.set('arr.yep', ['one',2], o); - - assert.deepEqual([ - { yep: 'one', arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } - , { yep: 2 } - ], o.arr); - - done(); - }) - - it('that is less than length', function(done){ - mpath.set('arr.yep', [47], o, function (v) { - return 47 === v ? 4 : v; - }); - assert.deepEqual([ - { yep: 4, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } - , { yep: 2 } - ], o.arr); - - mpath.set('arr.yep', [47], o); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } - , { yep: 2 } - ], o.arr); - - done(); - }) - - it('that is greater than length', function(done){ - mpath.set('arr.yep', [5,6,7], o, function (v) { - return 5 === v ? 'five' : v; - }); - assert.deepEqual([ - { yep: 'five', arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } - , { yep: 6 } - ], o.arr); - - mpath.set('arr.yep', [5,6,7], o); - assert.deepEqual([ - { yep: 5, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } - , { yep: 6 } - ], o.arr); - - done(); - }) - }) - }) - - describe('array.$.path', function(){ - describe('with single non-array value', function(){ - it('copies the value to each item in array', function(done){ - mpath.set('arr.$.yep', {xtra: 'double good'}, o, function (v) { - return v && v.xtra ? 'hi' : v; - }); - assert.deepEqual([ - { yep: 'hi', arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } - , { yep: 'hi'} - ], o.arr); - - mpath.set('arr.$.yep', {xtra: 'double good'}, o); - assert.deepEqual([ - { yep: {xtra:'double good'}, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } - , { yep: {xtra:'double good'}} - ], o.arr); - - done(); - }) - }) - describe('with array of values', function(){ - it('copies the value to each item in array', function(done){ - mpath.set('arr.$.yep', [15], o, function (v) { - return v.length === 1 ? [] : v; - }); - assert.deepEqual([ - { yep: [], arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } - , { yep: []} - ], o.arr); - - mpath.set('arr.$.yep', [15], o); - assert.deepEqual([ - { yep: [15], arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } - , { yep: [15]} - ], o.arr); - - done(); - }) - }) - }) - - describe('array.index.path', function(){ - it('works', function(done){ - mpath.set('arr.1.yep', 0, o, function (v) { - return 0 === v ? 'zero' : v; - }); - assert.deepEqual([ - { yep: [15] , arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } - , { yep: 'zero' } - ], o.arr); - - mpath.set('arr.1.yep', 0, o); - assert.deepEqual([ - { yep: [15] , arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } - , { yep: 0 } - ], o.arr); - - done(); - }) - }) - - describe('array.index.array.path', function(){ - it('with single value', function(done){ - mpath.set('arr.0.arr.e', 35, o, function (v) { - return 35 === v ? 3 : v; - }); - assert.deepEqual([ - { yep: [15], arr: [{ a: { b: 47 }, e: 3}, { a: { c: 48 }, e: 3}, { d: 'yep', e: 3 }] } - , { yep: 0 } - ], o.arr); - - mpath.set('arr.0.arr.e', 35, o); - assert.deepEqual([ - { yep: [15], arr: [{ a: { b: 47 }, e: 35}, { a: { c: 48 }, e: 35}, { d: 'yep', e: 35 }] } - , { yep: 0 } - ], o.arr); - - done(); - }) - it('with array', function(done){ - mpath.set('arr.0.arr.e', ['a','b'], o, function (v) { - return 'a' === v ? 'x' : v; - }); - assert.deepEqual([ - { yep: [15], arr: [{ a: { b: 47 }, e: 'x'}, { a: { c: 48 }, e: 'b'}, { d: 'yep', e: 35 }] } - , { yep: 0 } - ], o.arr); - - mpath.set('arr.0.arr.e', ['a','b'], o); - assert.deepEqual([ - { yep: [15], arr: [{ a: { b: 47 }, e: 'a'}, { a: { c: 48 }, e: 'b'}, { d: 'yep', e: 35 }] } - , { yep: 0 } - ], o.arr); - - done(); - }) - }) - - describe('array.index.array.path.path', function(){ - it('with single value', function(done){ - mpath.set('arr.0.arr.a.b', 36, o, function (v) { - return 36 === v ? 3 : v; - }); - assert.deepEqual([ - { yep: [15], arr: [{ a: { b: 3 }, e: 'a'}, { a: { c: 48, b: 3 }, e: 'b'}, { d: 'yep', e: 35 }] } - , { yep: 0 } - ], o.arr); - - mpath.set('arr.0.arr.a.b', 36, o); - assert.deepEqual([ - { yep: [15], arr: [{ a: { b: 36 }, e: 'a'}, { a: { c: 48, b: 36 }, e: 'b'}, { d: 'yep', e: 35 }] } - , { yep: 0 } - ], o.arr); - - done(); - }) - it('with array', function(done){ - mpath.set('arr.0.arr.a.b', [1,2,3,4], o, function (v) { - return 2 === v ? 'two' : v; - }); - assert.deepEqual([ - { yep: [15], arr: [{ a: { b: 1 }, e: 'a'}, { a: { c: 48, b: 'two' }, e: 'b'}, { d: 'yep', e: 35 }] } - , { yep: 0 } - ], o.arr); - - mpath.set('arr.0.arr.a.b', [1,2,3,4], o); - assert.deepEqual([ - { yep: [15], arr: [{ a: { b: 1 }, e: 'a'}, { a: { c: 48, b: 2 }, e: 'b'}, { d: 'yep', e: 35 }] } - , { yep: 0 } - ], o.arr); - - done(); - }) - }) - - describe('array.index.array.$.path.path', function(){ - it('with single value', function(done){ - mpath.set('arr.0.arr.$.a.b', '$', o, function (v) { - return '$' === v ? 'dolla billz' : v; - }); - assert.deepEqual([ - { yep: [15], arr: [{ a: { b: 'dolla billz' }, e: 'a'}, { a: { c: 48, b: 'dolla billz' }, e: 'b'}, { d: 'yep', e: 35 }] } - , { yep: 0 } - ], o.arr); - - mpath.set('arr.0.arr.$.a.b', '$', o); - assert.deepEqual([ - { yep: [15], arr: [{ a: { b: '$' }, e: 'a'}, { a: { c: 48, b: '$' }, e: 'b'}, { d: 'yep', e: 35 }] } - , { yep: 0 } - ], o.arr); - - done(); - }) - it('with array', function(done){ - mpath.set('arr.0.arr.$.a.b', [1], o, function (v) { - return Array.isArray(v) ? {} : v; - }); - assert.deepEqual([ - { yep: [15], arr: [{ a: { b: {} }, e: 'a'}, { a: { c: 48, b: {} }, e: 'b'}, { d: 'yep', e: 35 }] } - , { yep: 0 } - ], o.arr); - - mpath.set('arr.0.arr.$.a.b', [1], o); - assert.deepEqual([ - { yep: [15], arr: [{ a: { b: [1] }, e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } - , { yep: 0 } - ], o.arr); - - done(); - }) - }) - - describe('array.array.index.path', function(){ - it('with single value', function(done){ - mpath.set('arr.arr.0.a', 'single', o, function (v) { - return 'single' === v ? 'double' : v; - }); - assert.deepEqual([ - { yep: [15], arr: [{ a: 'double', e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } - , { yep: 0 } - ], o.arr); - - mpath.set('arr.arr.0.a', 'single', o); - assert.deepEqual([ - { yep: [15], arr: [{ a: 'single', e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } - , { yep: 0 } - ], o.arr); - - done(); - }) - it('with array', function(done){ - mpath.set('arr.arr.0.a', [4,8,15,16,23,42], o, function (v) { - return 4 === v ? 3 : v; - }); - assert.deepEqual([ - { yep: [15], arr: [{ a: 3, e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } - , { yep: false } - ], o.arr); - - mpath.set('arr.arr.0.a', [4,8,15,16,23,42], o); - assert.deepEqual([ - { yep: [15], arr: [{ a: 4, e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } - , { yep: false } - ], o.arr); - - done(); - }) - }) - - describe('array.array.$.index.path', function(){ - it('with single value', function(done){ - mpath.set('arr.arr.$.0.a', 'singles', o, function (v) { - return 0; - }); - assert.deepEqual([ - { yep: [15], arr: [{ a: 0, e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } - , { yep: 0 } - ], o.arr); - - mpath.set('arr.arr.$.0.a', 'singles', o); - assert.deepEqual([ - { yep: [15], arr: [{ a: 'singles', e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } - , { yep: 0 } - ], o.arr); - - mpath.set('$.arr.arr.0.a', 'single', o); - assert.deepEqual([ - { yep: [15], arr: [{ a: 'single', e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } - , { yep: 0 } - ], o.arr); - - done(); - }) - it('with array', function(done){ - mpath.set('arr.arr.$.0.a', [4,8,15,16,23,42], o, function (v) { - return 'nope' - }); - assert.deepEqual([ - { yep: [15], arr: [{ a: 'nope', e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } - , { yep: 0} - ], o.arr); - - mpath.set('arr.arr.$.0.a', [4,8,15,16,23,42], o); - assert.deepEqual([ - { yep: [15], arr: [{ a: [4,8,15,16,23,42], e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } - , { yep: 0} - ], o.arr); - - mpath.set('arr.$.arr.0.a', [4,8,15,16,23,42,108], o); - assert.deepEqual([ - { yep: [15], arr: [{ a: [4,8,15,16,23,42,108], e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } - , { yep: 0} - ], o.arr); - - done(); - }) - }) - - describe('array.array.path.index', function(){ - it('with single value', function(done){ - mpath.set('arr.arr.a.7', 47, o, function (v) { - return 1 - }); - assert.deepEqual([ - { yep: [15], arr: [{ a: [4,8,15,16,23,42,108,1], e: 'a'}, { a: { c: 48, b: [1], '7': 1 }, e: 'b'}, { d: 'yep', e: 35 }] } - , { yep: 0} - ], o.arr); - - mpath.set('arr.arr.a.7', 47, o); - assert.deepEqual([ - { yep: [15], arr: [{ a: [4,8,15,16,23,42,108,47], e: 'a'}, { a: { c: 48, b: [1], '7': 47 }, e: 'b'}, { d: 'yep', e: 35 }] } - , { yep: 0} - ], o.arr); - - done(); - }) - it('with array', function(done){ - o.arr[1].arr = [{ a: [] }, { a: [] }, { a: null }]; - mpath.set('arr.arr.a.7', [[null,46], [undefined, 'woot']], o); - - var a1 = []; - var a2 = []; - a1[7] = undefined; - a2[7] = 'woot'; - - assert.deepEqual([ - { yep: [15], arr: [{ a: [4,8,15,16,23,42,108,null], e: 'a'}, { a: { c: 48, b: [1], '7': 46 }, e: 'b'}, { d: 'yep', e: 35 }] } - , { yep: 0, arr: [{a:a1},{a:a2},{a:null}] } - ], o.arr); - - done(); - }) - }) - - describe('handles array.array.path', function(){ - it('with single', function(done){ - o.arr[1].arr = [{},{}]; - assert.deepEqual([{},{}], o.arr[1].arr); - o.arr.push({ arr: 'something else' }); - o.arr.push({ arr: ['something else'] }); - o.arr.push({ arr: [[]] }); - o.arr.push({ arr: [5] }); - - var weird = []; - weird.e = 'xmas'; - - // test - mpath.set('arr.arr.e', 47, o, function (v) { - return 'xmas' - }); - assert.deepEqual([ - { yep: [15], arr: [ - { a: [4,8,15,16,23,42,108,null], e: 'xmas'} - , { a: { c: 48, b: [1], '7': 46 }, e: 'xmas'} - , { d: 'yep', e: 'xmas' } - ] - } - , { yep: 0, arr: [{e: 'xmas'}, {e:'xmas'}] } - , { arr: 'something else' } - , { arr: ['something else'] } - , { arr: [weird] } - , { arr: [5] } - ] - , o.arr); - - weird.e = 47; - - mpath.set('arr.arr.e', 47, o); - assert.deepEqual([ - { yep: [15], arr: [ - { a: [4,8,15,16,23,42,108,null], e: 47} - , { a: { c: 48, b: [1], '7': 46 }, e: 47} - , { d: 'yep', e: 47 } - ] - } - , { yep: 0, arr: [{e: 47}, {e:47}] } - , { arr: 'something else' } - , { arr: ['something else'] } - , { arr: [weird] } - , { arr: [5] } - ] - , o.arr); - - done(); - }) - it('with arrays', function(done){ - mpath.set('arr.arr.e', [[1,2,3],[4,5],null,[],[6], [7,8,9]], o, function (v) { - return 10; - }); - - var weird = []; - weird.e = 10; - - assert.deepEqual([ - { yep: [15], arr: [ - { a: [4,8,15,16,23,42,108,null], e: 10} - , { a: { c: 48, b: [1], '7': 46 }, e: 10} - , { d: 'yep', e: 10 } - ] - } - , { yep: 0, arr: [{e: 10}, {e:10}] } - , { arr: 'something else' } - , { arr: ['something else'] } - , { arr: [weird] } - , { arr: [5] } - ] - , o.arr); - - mpath.set('arr.arr.e', [[1,2,3],[4,5],null,[],[6], [7,8,9]], o); - - weird.e = 6; - - assert.deepEqual([ - { yep: [15], arr: [ - { a: [4,8,15,16,23,42,108,null], e: 1} - , { a: { c: 48, b: [1], '7': 46 }, e: 2} - , { d: 'yep', e: 3 } - ] - } - , { yep: 0, arr: [{e: 4}, {e:5}] } - , { arr: 'something else' } - , { arr: ['something else'] } - , { arr: [weird] } - , { arr: [5] } - ] - , o.arr); - - done(); - }) - }) - }) - - describe('with `special`', function(){ - var o = doc(); - - it('works', function(done){ - mpath.set('name', 'chan', o, special, function (v) { - return 'hi'; - }); - assert.deepEqual('hi', o.name); - - mpath.set('name', 'changer', o, special); - assert.deepEqual('changer', o.name); - - mpath.set('first.second.third', [1,{name:'y'},9], o, special); - assert.deepEqual([1,{name:'y'},9], o.first.second.third); - - mpath.set('first.second.third.1.name', 'z', o, special) - assert.deepEqual([1,{name:'z'},9], o.first.second.third); - - mpath.set('comments.1.name', 'ttwwoo', o, special); - assert.deepEqual({ name: 'two', _doc: { name: 'ttwwoo' }}, o.comments[1]); - - mpath.set('comments.2.comments.1.comments.0.expander', 'adder', o, special, function (v) { - return 'super' - }); - assert.deepEqual( - { val: 2, expander: 'super'} - , o.comments[2]._doc.comments[1]._doc.comments[0]); - - mpath.set('comments.2.comments.1.comments.0.expander', 'adder', o, special); - assert.deepEqual( - { val: 2, expander: 'adder'} - , o.comments[2]._doc.comments[1]._doc.comments[0]); - - mpath.set('comments.2.comments.1.comments.2', 'set', o, special); - assert.equal(3, o.comments[2]._doc.comments[1]._doc.comments.length); - assert.deepEqual( - { val: 2, expander: 'adder'} - , o.comments[2]._doc.comments[1]._doc.comments[0]); - assert.deepEqual( - undefined - , o.comments[2]._doc.comments[1]._doc.comments[1]); - assert.deepEqual( - 'set' - , o.comments[2]._doc.comments[1]._doc.comments[2]); - done(); - }) - - describe('array.path', function(){ - describe('with single non-array value', function(){ - it('works', function(done){ - o.arr[1]._doc = { special: true } - - mpath.set('arr.yep', false, o, special, function (v) { - return 'yes'; - }); - assert.deepEqual([ - { yep: 'yes', arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } - , { yep: true, _doc: { special: true, yep: 'yes'}} - ], o.arr); - - mpath.set('arr.yep', false, o, special); - assert.deepEqual([ - { yep: false, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } - , { yep: true, _doc: { special: true, yep: false }} - ], o.arr); - - done(); - }) - }) - describe('with array of values', function(){ - it('that are equal in length', function(done){ - mpath.set('arr.yep', ['one',2], o, special, function (v) { - return 2 === v ? 20 : v; - }); - assert.deepEqual([ - { yep: 'one', arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } - , { yep: true, _doc: { special: true, yep: 20}} - ], o.arr); - - mpath.set('arr.yep', ['one',2], o, special); - assert.deepEqual([ - { yep: 'one', arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } - , { yep: true, _doc: { special: true, yep: 2}} - ], o.arr); - - done(); - }) - - it('that is less than length', function(done){ - mpath.set('arr.yep', [47], o, special, function (v) { - return 80; - }); - assert.deepEqual([ - { yep: 80, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } - , { yep: true, _doc: { special: true, yep: 2}} - ], o.arr); - - mpath.set('arr.yep', [47], o, special); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } - , { yep: true, _doc: { special: true, yep: 2}} - ], o.arr); - - // add _doc to first element - o.arr[0]._doc = { yep: 46, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } - - mpath.set('arr.yep', [20], o, special); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }], _doc: { yep: 20, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } } - , { yep: true, _doc: { special: true, yep: 2}} - ], o.arr); - - done(); - }) - - it('that is greater than length', function(done){ - mpath.set('arr.yep', [5,6,7], o, special, function () { - return 'x'; - }); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }], _doc: { yep: 'x', arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } } - , { yep: true, _doc: { special: true, yep: 'x'}} - ], o.arr); - - mpath.set('arr.yep', [5,6,7], o, special); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }], _doc: { yep: 5, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } } - , { yep: true, _doc: { special: true, yep: 6}} - ], o.arr); - - done(); - }) - }) - }) - - describe('array.$.path', function(){ - describe('with single non-array value', function(){ - it('copies the value to each item in array', function(done){ - mpath.set('arr.$.yep', {xtra: 'double good'}, o, special, function (v) { - return 9; - }); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: 9, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } } - , { yep: true, _doc: { special: true, yep: 9}} - ], o.arr); - - mpath.set('arr.$.yep', {xtra: 'double good'}, o, special); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: {xtra:'double good'}, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } } - , { yep: true, _doc: { special: true, yep: {xtra:'double good'}}} - ], o.arr); - - done(); - }) - }) - describe('with array of values', function(){ - it('copies the value to each item in array', function(done){ - mpath.set('arr.$.yep', [15], o, special, function (v) { - return 'array' - }); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: 'array', arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } } - , { yep: true, _doc: { special: true, yep: 'array'}} - ], o.arr); - - mpath.set('arr.$.yep', [15], o, special); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } } - , { yep: true, _doc: { special: true, yep: [15]}} - ], o.arr); - - done(); - }) - }) - }) - - describe('array.index.path', function(){ - it('works', function(done){ - mpath.set('arr.1.yep', 0, o, special, function (v) { - return 1; - }); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } } - , { yep: true, _doc: { special: true, yep: 1}} - ], o.arr); - - mpath.set('arr.1.yep', 0, o, special); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] } } - , { yep: true, _doc: { special: true, yep: 0}} - ], o.arr); - - done(); - }) - }) - - describe('array.index.array.path', function(){ - it('with single value', function(done){ - mpath.set('arr.0.arr.e', 35, o, special, function (v) { - return 30 - }); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: { b: 47 }, e: 30}, { a: { c: 48 }, e: 30}, { d: 'yep', e: 30 }] } } - , { yep: true, _doc: { special: true, yep: 0}} - ], o.arr); - - mpath.set('arr.0.arr.e', 35, o, special); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: { b: 47 }, e: 35}, { a: { c: 48 }, e: 35}, { d: 'yep', e: 35 }] } } - , { yep: true, _doc: { special: true, yep: 0}} - ], o.arr); - - done(); - }) - it('with array', function(done){ - mpath.set('arr.0.arr.e', ['a','b'], o, special, function (v) { - return 'a' === v ? 'A' : v; - }); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: { b: 47 }, e: 'A'}, { a: { c: 48 }, e: 'b'}, { d: 'yep', e: 35 }] } } - , { yep: true, _doc: { special: true, yep: 0}} - ], o.arr); - - mpath.set('arr.0.arr.e', ['a','b'], o, special); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: { b: 47 }, e: 'a'}, { a: { c: 48 }, e: 'b'}, { d: 'yep', e: 35 }] } } - , { yep: true, _doc: { special: true, yep: 0}} - ], o.arr); - - done(); - }) - }) - - describe('array.index.array.path.path', function(){ - it('with single value', function(done){ - mpath.set('arr.0.arr.a.b', 36, o, special, function (v) { - return 20 - }); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: { b: 20 }, e: 'a'}, { a: { c: 48, b: 20 }, e: 'b'}, { d: 'yep', e: 35 }] } } - , { yep: true, _doc: { special: true, yep: 0}} - ], o.arr); - - mpath.set('arr.0.arr.a.b', 36, o, special); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: { b: 36 }, e: 'a'}, { a: { c: 48, b: 36 }, e: 'b'}, { d: 'yep', e: 35 }] } } - , { yep: true, _doc: { special: true, yep: 0}} - ], o.arr); - - done(); - }) - it('with array', function(done){ - mpath.set('arr.0.arr.a.b', [1,2,3,4], o, special, function (v) { - return v*2; - }); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: { b: 2 }, e: 'a'}, { a: { c: 48, b: 4 }, e: 'b'}, { d: 'yep', e: 35 }] } } - , { yep: true, _doc: { special: true, yep: 0}} - ], o.arr); - - mpath.set('arr.0.arr.a.b', [1,2,3,4], o, special); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: { b: 1 }, e: 'a'}, { a: { c: 48, b: 2 }, e: 'b'}, { d: 'yep', e: 35 }] } } - , { yep: true, _doc: { special: true, yep: 0}} - ], o.arr); - - done(); - }) - }) - - describe('array.index.array.$.path.path', function(){ - it('with single value', function(done){ - mpath.set('arr.0.arr.$.a.b', '$', o, special, function (v) { - return 'dollaz' - }); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: { b: 'dollaz' }, e: 'a'}, { a: { c: 48, b: 'dollaz' }, e: 'b'}, { d: 'yep', e: 35 }] } } - , { yep: true, _doc: { special: true, yep: 0}} - ], o.arr); - - mpath.set('arr.0.arr.$.a.b', '$', o, special); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: { b: '$' }, e: 'a'}, { a: { c: 48, b: '$' }, e: 'b'}, { d: 'yep', e: 35 }] } } - , { yep: true, _doc: { special: true, yep: 0}} - ], o.arr); - - done(); - }) - it('with array', function(done){ - mpath.set('arr.0.arr.$.a.b', [1], o, special, function (v) { - return {}; - }); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: { b: {} }, e: 'a'}, { a: { c: 48, b: {} }, e: 'b'}, { d: 'yep', e: 35 }] } } - , { yep: true, _doc: { special: true, yep: 0}} - ], o.arr); - - mpath.set('arr.0.arr.$.a.b', [1], o, special); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: { b: [1] }, e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } } - , { yep: true, _doc: { special: true, yep: 0}} - ], o.arr); - - done(); - }) - }) - - describe('array.array.index.path', function(){ - it('with single value', function(done){ - mpath.set('arr.arr.0.a', 'single', o, special, function (v) { - return 88; - }); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: 88, e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } } - , { yep: true, _doc: { special: true, yep: 0}} - ], o.arr); - - mpath.set('arr.arr.0.a', 'single', o, special); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: 'single', e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } } - , { yep: true, _doc: { special: true, yep: 0}} - ], o.arr); - - done(); - }) - it('with array', function(done){ - mpath.set('arr.arr.0.a', [4,8,15,16,23,42], o, special, function (v) { - return v*2; - }); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: 8, e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } } - , { yep: true, _doc: { special: true, yep: 0}} - ], o.arr); - - mpath.set('arr.arr.0.a', [4,8,15,16,23,42], o, special); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: 4, e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } } - , { yep: true, _doc: { special: true, yep: 0}} - ], o.arr); - - done(); - }) - }) - - describe('array.array.$.index.path', function(){ - it('with single value', function(done){ - mpath.set('arr.arr.$.0.a', 'singles', o, special, function (v) { - return v.toUpperCase(); - }); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: 'SINGLES', e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } } - , { yep: true, _doc: { special: true, yep: 0}} - ], o.arr); - - mpath.set('arr.arr.$.0.a', 'singles', o, special); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: 'singles', e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } } - , { yep: true, _doc: { special: true, yep: 0}} - ], o.arr); - - mpath.set('$.arr.arr.0.a', 'single', o, special); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: 'single', e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } } - , { yep: true, _doc: { special: true, yep: 0}} - ], o.arr); - - done(); - }) - it('with array', function(done){ - mpath.set('arr.arr.$.0.a', [4,8,15,16,23,42], o, special, function (v) { - return Array - }); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: Array, e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } } - , { yep: true, _doc: { special: true, yep: 0}} - ], o.arr); - - mpath.set('arr.arr.$.0.a', [4,8,15,16,23,42], o, special); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: [4,8,15,16,23,42], e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } } - , { yep: true, _doc: { special: true, yep: 0}} - ], o.arr); - - mpath.set('arr.$.arr.0.a', [4,8,15,16,23,42,108], o, special); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: [4,8,15,16,23,42,108], e: 'a'}, { a: { c: 48, b: [1] }, e: 'b'}, { d: 'yep', e: 35 }] } } - , { yep: true, _doc: { special: true, yep: 0}} - ], o.arr); - - done(); - }) - }) - - describe('array.array.path.index', function(){ - it('with single value', function(done){ - mpath.set('arr.arr.a.7', 47, o, special, function (v) { - return Object; - }); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: [4,8,15,16,23,42,108,Object], e: 'a'}, { a: { c: 48, b: [1], '7': Object }, e: 'b'}, { d: 'yep', e: 35 }] } } - , { yep: true, _doc: { special: true, yep: 0}} - ], o.arr); - - mpath.set('arr.arr.a.7', 47, o, special); - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: [4,8,15,16,23,42,108,47], e: 'a'}, { a: { c: 48, b: [1], '7': 47 }, e: 'b'}, { d: 'yep', e: 35 }] } } - , { yep: true, _doc: { special: true, yep: 0}} - ], o.arr); - - done(); - }) - it('with array', function(done){ - o.arr[1]._doc.arr = [{ a: [] }, { a: [] }, { a: null }]; - mpath.set('arr.arr.a.7', [[null,46], [undefined, 'woot']], o, special, function (v) { - return undefined === v ? 'nope' : v; - }); - - var a1 = []; - var a2 = []; - a1[7] = 'nope'; - a2[7] = 'woot'; - - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: [4,8,15,16,23,42,108,null], e: 'a'}, { a: { c: 48, b: [1], '7': 46 }, e: 'b'}, { d: 'yep', e: 35 }] } } - , { yep: true, _doc: { arr: [{a:a1},{a:a2},{a:null}], special: true, yep: 0}} - ], o.arr); - - mpath.set('arr.arr.a.7', [[null,46], [undefined, 'woot']], o, special); - - a1[7] = undefined; - - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { yep: [15], arr: [{ a: [4,8,15,16,23,42,108,null], e: 'a'}, { a: { c: 48, b: [1], '7': 46 }, e: 'b'}, { d: 'yep', e: 35 }] } } - , { yep: true, _doc: { arr: [{a:a1},{a:a2},{a:null}], special: true, yep: 0}} - ], o.arr); - - done(); - }) - }) - - describe('handles array.array.path', function(){ - it('with single', function(done){ - o.arr[1]._doc.arr = [{},{}]; - assert.deepEqual([{},{}], o.arr[1]._doc.arr); - o.arr.push({ _doc: { arr: 'something else' }}); - o.arr.push({ _doc: { arr: ['something else'] }}); - o.arr.push({ _doc: { arr: [[]] }}); - o.arr.push({ _doc: { arr: [5] }}); - - // test - mpath.set('arr.arr.e', 47, o, special); - - var weird = []; - weird.e = 47; - - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { - yep: [15] - , arr: [ - { a: [4,8,15,16,23,42,108,null], e: 47} - , { a: { c: 48, b: [1], '7': 46 }, e: 47} - , { d: 'yep', e: 47 } - ] - } - } - , { yep: true - , _doc: { - arr: [ - {e:47} - , {e:47} - ] - , special: true - , yep: 0 - } - } - , { _doc: { arr: 'something else' }} - , { _doc: { arr: ['something else'] }} - , { _doc: { arr: [weird] }} - , { _doc: { arr: [5] }} - ] - , o.arr); - - done(); - }) - it('with arrays', function(done){ - mpath.set('arr.arr.e', [[1,2,3],[4,5],null,[],[6], [7,8,9]], o, special); - - var weird = []; - weird.e = 6; - - assert.deepEqual([ - { yep: 47, arr: [{ a: { b: 47 }}, { a: { c: 48 }}, { d: 'yep' }] - , _doc: { - yep: [15] - , arr: [ - { a: [4,8,15,16,23,42,108,null], e: 1} - , { a: { c: 48, b: [1], '7': 46 }, e: 2} - , { d: 'yep', e: 3 } - ] - } - } - , { yep: true - , _doc: { - arr: [ - {e:4} - , {e:5} - ] - , special: true - , yep: 0 - } - } - , { _doc: { arr: 'something else' }} - , { _doc: { arr: ['something else'] }} - , { _doc: { arr: [weird] }} - , { _doc: { arr: [5] }} - ] - , o.arr); - - done(); - }) - }) - - }) - - describe('get/set integration', function(){ - var o = doc(); - - it('works', function(done){ - var vals = mpath.get('array.o.array.x.b', o); - - vals[0][0][2] = 10; - vals[1][0][1] = 0; - vals[1][1] = 'Rambaldi'; - vals[1][2] = [12,14]; - vals[2] = [{changed:true}, [null, ['changed','to','array']]]; - - mpath.set('array.o.array.x.b', vals, o); - - var t = [ - { o: { array: [{x: {b: [4,6,10]}}, { y: 10} ] }} - , { o: { array: [{x: {b: [1,0,3]}}, { x: {b:'Rambaldi',z: 10 }}, { x: {b: [12,14]}}] }} - , { o: { array: [{x: {b: {changed:true}}}, { x: { b: [null, ['changed','to','array']]}}]}} - , { o: { array: [{x: null }] }} - , { o: { array: [{y: 3 }] }} - , { o: { array: [3, 0, null] }} - , { o: { name: 'ha' }} - ]; - assert.deepEqual(t, o.array); - done(); - }) - - it('array.prop', function(done){ - mpath.set('comments.name', ['this', 'was', 'changed'], o); - - assert.deepEqual([ - { name: 'this' } - , { name: 'was', _doc: { name: '2' }} - , { name: 'changed' - , comments: [{},{ comments: [{val: 'twoo'}]}] - , _doc: { name: '3', comments: [{},{ _doc: { comments: [{ val: 2 }] }}] }} - ], o.comments); - - mpath.set('comments.name', ['also', 'changed', 'this'], o, special); - - assert.deepEqual([ - { name: 'also' } - , { name: 'was', _doc: { name: 'changed' }} - , { name: 'changed' - , comments: [{},{ comments: [{val: 'twoo'}]}] - , _doc: { name: 'this', comments: [{},{ _doc: { comments: [{ val: 2 }] }}] }} - ], o.comments); - - done(); - }) - - }) - - describe('multiple $ use', function(){ - var o = doc(); - it('is ok', function(done){ - assert.doesNotThrow(function () { - mpath.set('arr.$.arr.$.a', 35, o); - }); - done(); - }) - }) - - it('ignores setting a nested path that doesnt exist', function(done){ - var o = doc(); - assert.doesNotThrow(function(){ - mpath.set('thing.that.is.new', 10, o); - }) - done(); - }) - }) - -}) diff --git a/node_modules/mongoose/node_modules/mpromise/.npmignore b/node_modules/mongoose/node_modules/mpromise/.npmignore deleted file mode 100644 index be106ca..0000000 --- a/node_modules/mongoose/node_modules/mpromise/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -*.sw* -node_modules/ diff --git a/node_modules/mongoose/node_modules/mpromise/.travis.yml b/node_modules/mongoose/node_modules/mpromise/.travis.yml deleted file mode 100644 index 09c230f..0000000 --- a/node_modules/mongoose/node_modules/mpromise/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.6 - - 0.8 diff --git a/node_modules/mongoose/node_modules/mpromise/History.md b/node_modules/mongoose/node_modules/mpromise/History.md deleted file mode 100644 index f157b69..0000000 --- a/node_modules/mongoose/node_modules/mpromise/History.md +++ /dev/null @@ -1,24 +0,0 @@ - -0.2.1 / 2013-02-09 -================== - - * fixed; conformancy with A+ 1.2 - -0.2.0 / 2013-01-09 -================== - - * added; .end() - * fixed; only catch handler executions - -0.1.0 / 2013-01-08 -================== - - * cleaned up API - * customizable event names - * docs - -0.0.1 / 2013-01-07 -================== - - * original release - diff --git a/node_modules/mongoose/node_modules/mpromise/LICENSE b/node_modules/mongoose/node_modules/mpromise/LICENSE deleted file mode 100644 index 38c529d..0000000 --- a/node_modules/mongoose/node_modules/mpromise/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2012 [Aaron Heckmann](aaron.heckmann+github@gmail.com) - -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. diff --git a/node_modules/mongoose/node_modules/mpromise/Makefile b/node_modules/mongoose/node_modules/mpromise/Makefile deleted file mode 100644 index 717a796..0000000 --- a/node_modules/mongoose/node_modules/mpromise/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -TESTS = $(shell find test/ -name '*.test.js') - -test: - @make test-unit && echo "testing promises-A+ implementation ..." && make test-promises-A - -test-unit: - @./node_modules/.bin/mocha $(T) --async-only $(TESTS) - -test-promises-A: - @node test/promises-A.js - -.PHONY: test test-unit test-promises-A diff --git a/node_modules/mongoose/node_modules/mpromise/README.md b/node_modules/mongoose/node_modules/mpromise/README.md deleted file mode 100644 index 7da2725..0000000 --- a/node_modules/mongoose/node_modules/mpromise/README.md +++ /dev/null @@ -1,200 +0,0 @@ -#mpromise -========== - -A [promises/A+](https://github.com/promises-aplus/promises-spec) conformant implementation, written for [mongoose](http://mongoosejs.com). - -## installation - -``` -$ npm install mpromise -``` - -## docs - -An `mpromise` can be in any of three states, pending, fulfilled (success), or rejected (error). Once it is either fulfilled or rejected it's state can no longer be changed. - -The exports object is the Promise constructor. - -```js -var Promise = require('mpromise'); -``` - -The constructor accepts an optional function which is executed when the promise is first resolved (either fulfilled or rejected). - -```js -var promise = new Promise(fn); -``` - -This is the same as passing the `fn` to `onResolve` directly. - -```js -var promise = new Promise; -promise.onResolve(function (err, args..) { - ... -}); -``` - -### Methods - -####fulfill - -Fulfilling a promise with values: - -```js -var promise = new Promise; -promise.fulfill(args...); -``` - -If the promise has already been fulfilled or rejected, no action is taken. - -####reject - -Rejecting a promise with a reason: - -```js -var promise = new Promise; -promise.reject(reason); -``` - -If the promise has already been fulfilled or rejected, no action is taken. - -####resolve - -Node.js callback style promise resolution `(err, args...)`: - -```js -var promise = new Promise; -promise.resolve([reason], [arg1, arg2, ...]); -``` - -If the promise has already been fulfilled or rejected, no action is taken. - -####onFulfill - -To register a function for execution when the promise is fulfilled, pass it to `onFulfill`. When executed it will receive the arguments passed to `fulfill()`. - -```js -var promise = new Promise; -promise.onFulfill(function (a, b) { - assert.equal(3, a + b); -}); -promise.fulfill(1, 2); -``` - -The function will only be called once when the promise is fulfilled, never when rejected. - -Registering a function with `onFulfill` after the promise has already been fulfilled results in the immediate execution of the function with the original arguments used to fulfill the promise. - -```js -var promise = new Promise; -promise.fulfill(" :D "); -promise.onFulfill(function (arg) { - console.log(arg); // logs " :D " -}) -``` - -####onReject - -To register a function for execution when the promise is rejected, pass it to `onReject`. When executed it will receive the argument passed to `reject()`. - -```js -var promise = new Promise; -promise.onReject(function (reason) { - assert.equal('sad', reason); -}); -promise.reject('sad'); -``` - -The function will only be called once when the promise is rejected, never when fulfilled. - -Registering a function with `onReject` after the promise has already been rejected results in the immediate execution of the function with the original argument used to reject the promise. - -```js -var promise = new Promise; -promise.reject(" :( "); -promise.onReject(function (reason) { - console.log(reason); // logs " :( " -}) -``` - -####onResolve - -Allows registration of node.js style callbacks `(err, args..)` to handle either promise resolution type (fulfill or reject). - -```js -// fulfillment -var promise = new Promise; -promise.onResolve(function (err, a, b) { - console.log(a + b); // logs 3 -}); -promise.fulfill(1, 2); - -// rejection -var promise = new Promise; -promise.onResolve(function (err) { - if (err) { - console.log(err.message); // logs "failed" - } -}); -promise.reject(new Error('failed')); -``` - -####then - -Creates a new promise and returns it. If `onFulfill` or `onReject` are passed, they are added as SUCCESS/ERROR callbacks to this promise after the nextTick. - -Conforms to [promises/A+](https://github.com/promises-aplus/promises-spec) specification and passes its [tests](https://github.com/promises-aplus/promises-tests). - -```js -// promise.then(onFulfill, onReject); - -var p = new Promise; - -p.then(function (arg) { - return arg + 1; -}).then(function (arg) { - throw new Error(arg + ' is an error!'); -}).then(null, function (err) { - assert.ok(err instanceof Error); - assert.equal('2 is an error', err.message); -}); -p.complete(1); -``` - -####end - -Signifies that this promise was the last in a chain of `then()s`: if a handler passed to the call to `then` which produced this promise throws, the exception will go uncaught. - -```js -var p = new Promise; -p.then(function(){ throw new Error('shucks') }); -setTimeout(function () { - p.fulfill(); - // error was caught and swallowed by the promise returned from - // p.then(). we either have to always register handlers on - // the returned promises or we can do the following... -}, 10); - -// this time we use .end() which prevents catching thrown errors -var p = new Promise; -var p2 = p.then(function(){ throw new Error('shucks') }).end(); // <-- -setTimeout(function () { - p.fulfill(); // throws "shucks" -}, 10); -``` - -###Event names - -If you'd like to alter this implementations event names used to signify success and failure you may do so by setting `Promise.SUCCESS` or `Promise.FAILURE` respectively. - -```js -Promise.SUCCESS = 'complete'; -Promise.FAILURE = 'err'; -``` - -###Luke, use the Source -For more ideas read the [source](https://github.com/aheckmann/mpromise/blob/master/lib), [tests](https://github.com/aheckmann/mpromise/blob/master/test), or the [mongoose implementation](https://github.com/LearnBoost/mongoose/blob/3.6x/lib/promise.js). - -## license - -[MIT](https://github.com/aheckmann/mpromise/blob/master/LICENSE) diff --git a/node_modules/mongoose/node_modules/mpromise/index.js b/node_modules/mongoose/node_modules/mpromise/index.js deleted file mode 100644 index 0b3669d..0000000 --- a/node_modules/mongoose/node_modules/mpromise/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = exports = require('./lib/promise'); diff --git a/node_modules/mongoose/node_modules/mpromise/lib/promise.js b/node_modules/mongoose/node_modules/mpromise/lib/promise.js deleted file mode 100644 index be992c3..0000000 --- a/node_modules/mongoose/node_modules/mpromise/lib/promise.js +++ /dev/null @@ -1,268 +0,0 @@ - -/*! - * Module dependencies. - */ - -var slice = require('sliced'); -var EventEmitter = require('events').EventEmitter; - -/** - * Promise constructor. - * - * _NOTE: The success and failure event names can be overridden by setting `Promise.SUCCESS` and `Promise.FAILURE` respectively._ - * - * @param {Function} back a function that accepts `fn(err, ...){}` as signature - * @inherits NodeJS EventEmitter http://nodejs.org/api/events.html#events_class_events_eventemitter - * @event `reject`: Emits when the promise is rejected (event name may be overridden) - * @event `fulfill`: Emits when the promise is fulfilled (event name may be overridden) - * @api public - */ - -function Promise (back) { - this.emitted = {}; - this.ended = false; - if ('function' == typeof back) - this.onResolve(back); -} - -/*! - * event names - */ - -Promise.SUCCESS = 'fulfill'; -Promise.FAILURE = 'reject'; - -/*! - * Inherits from EventEmitter. - */ - -Promise.prototype.__proto__ = EventEmitter.prototype; - -/** - * Adds `listener` to the `event`. - * - * If `event` is either the success or failure event and the event has already been emitted, the`listener` is called immediately and passed the results of the original emitted event. - * - * @param {String} event - * @param {Function} callback - * @return {Promise} this - * @api public - */ - -Promise.prototype.on = function (event, callback) { - if (this.emitted[event]) - callback.apply(this, this.emitted[event]); - else - EventEmitter.prototype.on.call(this, event, callback); - - return this; -} - -/** - * Keeps track of emitted events to run them on `on`. - * - * @api private - */ - -Promise.prototype.emit = function (event) { - // ensures a promise can't be fulfill() or reject() more than once - var success = this.constructor.SUCCESS; - var failure = this.constructor.FAILURE; - - if (event == success || event == failure) { - if (this.emitted[success] || this.emitted[failure]) { - return this; - } - this.emitted[event] = slice(arguments, 1); - } - - return EventEmitter.prototype.emit.apply(this, arguments); -} - -/** - * Fulfills this promise with passed arguments. - * - * If this promise has already been fulfilled or rejected, no action is taken. - * - * @api public - */ - -Promise.prototype.fulfill = function () { - var args = slice(arguments); - return this.emit.apply(this, [this.constructor.SUCCESS].concat(args)); -} - -/** - * Rejects this promise with `reason`. - * - * If this promise has already been fulfilled or rejected, no action is taken. - * - * @api public - * @param {Object|String} reason - * @return {Promise} this - */ - -Promise.prototype.reject = function (reason) { - return this.emit(this.constructor.FAILURE, reason); -} - -/** - * Resolves this promise to a rejected state if `err` is passed or - * fulfilled state if no `err` is passed. - * - * @param {Error} [err] error or null - * @param {Object} [val] value to fulfill the promise with - * @api public - */ - -Promise.prototype.resolve = function (err, val) { - if (err) return this.reject(err); - return this.fulfill(val); -} - -/** - * Adds a listener to the SUCCESS event. - * - * @return {Promise} this - * @api public - */ - -Promise.prototype.onFulfill = function (fn) { - return this.on(this.constructor.SUCCESS, fn); -} - -/** - * Adds a listener to the FAILURE event. - * - * @return {Promise} this - * @api public - */ - -Promise.prototype.onReject = function (fn) { - return this.on(this.constructor.FAILURE, fn); -} - -/** - * Adds a single function as a listener to both SUCCESS and FAILURE. - * - * It will be executed with traditional node.js argument position: - * function (err, args...) {} - * - * @param {Function} fn - * @return {Promise} this - */ - -Promise.prototype.onResolve = function (fn) { - this.on(this.constructor.FAILURE, function(err){ - fn.call(this, err); - }); - - this.on(this.constructor.SUCCESS, function(){ - var args = slice(arguments); - fn.apply(this, [null].concat(args)); - }); - - return this; -} - -/** - * Creates a new promise and returns it. If `onFulfill` or - * `onReject` are passed, they are added as SUCCESS/ERROR callbacks - * to this promise after the nextTick. - * - * Conforms to [promises/A+](https://github.com/promises-aplus/promises-spec) specification. Read for more detail how to use this method. - * - * ####Example: - * - * var p = new Promise; - * p.then(function (arg) { - * return arg + 1; - * }).then(function (arg) { - * throw new Error(arg + ' is an error!'); - * }).then(null, function (err) { - * assert.ok(err instanceof Error); - * assert.equal('2 is an error', err.message); - * }); - * p.complete(1); - * - * @see promises-A+ https://github.com/promises-aplus/promises-spec - * @param {Function} onFulFill - * @param {Function} onReject - * @return {Promise} newPromise - */ - -Promise.prototype.then = function (onFulfill, onReject) { - var self = this - , retPromise = new Promise; - - function handler (fn) { - return function handle (arg) { - var val; - - try { - val = fn(arg); - } catch (err) { - if (retPromise.ended) throw err; - return retPromise.reject(err); - } - - if (val && 'function' == typeof val.then) { - val.then( - retPromise.fulfill.bind(retPromise) - , retPromise.reject.bind(retPromise)) - } else { - retPromise.fulfill(val); - } - } - } - - process.nextTick(function () { - if ('function' == typeof onReject) { - self.onReject(handler(onReject)); - } else { - self.onReject(retPromise.reject.bind(retPromise)); - } - - if ('function' == typeof onFulfill) { - self.onFulfill(handler(onFulfill)); - } else { - self.onFulfill(retPromise.fulfill.bind(retPromise)); - } - }) - - return retPromise; -} - -/** - * Signifies that this promise was the last in a chain of `then()s`: if a handler passed to the call to `then` which produced this promise throws, the exception will go uncaught. - * - * ####Example: - * - * var p = new Promise; - * p.then(function(){ throw new Error('shucks') }); - * setTimeout(function () { - * p.fulfill(); - * // error was caught and swallowed by the promise returned from - * // p.then(). we either have to always register handlers on - * // the returned promises or we can do the following... - * }, 10); - * - * // this time we use .end() which prevents catching thrown errors - * var p = new Promise; - * var p2 = p.then(function(){ throw new Error('shucks') }).end(); // <-- - * setTimeout(function () { - * p.fulfill(); // throws "shucks" - * }, 10); - * - * @api public - */ - -Promise.prototype.end = function () { - this.ended = true; -} - -/*! - * Module exports. - */ - -module.exports = Promise; diff --git a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/.npmignore b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/.npmignore deleted file mode 100644 index be106ca..0000000 --- a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -*.sw* -node_modules/ diff --git a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/.travis.yml b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/.travis.yml deleted file mode 100644 index 895dbd3..0000000 --- a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.6 - - 0.8 diff --git a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/History.md b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/History.md deleted file mode 100644 index 8132c95..0000000 --- a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/History.md +++ /dev/null @@ -1,23 +0,0 @@ - -0.0.4 / 2013-01-07 -================== - - * added component.json #1 [jkroso](https://github.com/jkroso) - * reversed array loop #1 [jkroso](https://github.com/jkroso) - * remove fn params - -0.0.3 / 2012-09-29 -================== - - * faster with negative start args - -0.0.2 / 2012-09-29 -================== - - * support full [].slice semantics - -0.0.1 / 2012-09-29 -=================== - - * initial release - diff --git a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/LICENSE b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/LICENSE deleted file mode 100644 index 38c529d..0000000 --- a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2012 [Aaron Heckmann](aaron.heckmann+github@gmail.com) - -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. diff --git a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/Makefile b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/Makefile deleted file mode 100644 index 3dd8a2d..0000000 --- a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/Makefile +++ /dev/null @@ -1,5 +0,0 @@ - -test: - @time ./node_modules/.bin/mocha $(T) $(TESTS) - -.PHONY: test diff --git a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/README.md b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/README.md deleted file mode 100644 index 6605c39..0000000 --- a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/README.md +++ /dev/null @@ -1,62 +0,0 @@ -#sliced -========== - -A faster alternative to `[].slice.call(arguments)`. - -[![Build Status](https://secure.travis-ci.org/aheckmann/sliced.png)](http://travis-ci.org/aheckmann/sliced) - -Example output from [benchmark.js](https://github.com/bestiejs/benchmark.js) - - Array.prototype.slice.call x 1,320,205 ops/sec ±2.35% (92 runs sampled) - [].slice.call x 1,314,605 ops/sec ±1.60% (95 runs sampled) - cached slice.call x 10,468,380 ops/sec ±1.45% (95 runs sampled) - sliced x 16,608,237 ops/sec ±1.40% (92 runs sampled) - fastest is sliced - - Array.prototype.slice.call(arguments, 1) x 1,383,584 ops/sec ±1.73% (97 runs sampled) - [].slice.call(arguments, 1) x 1,494,735 ops/sec ±1.33% (95 runs sampled) - cached slice.call(arguments, 1) x 10,085,270 ops/sec ±1.51% (97 runs sampled) - sliced(arguments, 1) x 16,620,480 ops/sec ±1.29% (95 runs sampled) - fastest is sliced(arguments, 1) - - Array.prototype.slice.call(arguments, -1) x 1,303,262 ops/sec ±1.62% (94 runs sampled) - [].slice.call(arguments, -1) x 1,325,615 ops/sec ±1.36% (97 runs sampled) - cached slice.call(arguments, -1) x 9,673,603 ops/sec ±1.70% (96 runs sampled) - sliced(arguments, -1) x 16,384,575 ops/sec ±1.06% (91 runs sampled) - fastest is sliced(arguments, -1) - - Array.prototype.slice.call(arguments, -2, -10) x 1,404,390 ops/sec ±1.61% (95 runs sampled) - [].slice.call(arguments, -2, -10) x 1,514,367 ops/sec ±1.21% (96 runs sampled) - cached slice.call(arguments, -2, -10) x 9,836,017 ops/sec ±1.21% (95 runs sampled) - sliced(arguments, -2, -10) x 18,544,882 ops/sec ±1.30% (91 runs sampled) - fastest is sliced(arguments, -2, -10) - - Array.prototype.slice.call(arguments, -2, -1) x 1,458,604 ops/sec ±1.41% (97 runs sampled) - [].slice.call(arguments, -2, -1) x 1,536,547 ops/sec ±1.63% (99 runs sampled) - cached slice.call(arguments, -2, -1) x 10,060,633 ops/sec ±1.37% (96 runs sampled) - sliced(arguments, -2, -1) x 18,608,712 ops/sec ±1.08% (93 runs sampled) - fastest is sliced(arguments, -2, -1) - -_Benchmark [source](https://github.com/aheckmann/sliced/blob/master/bench.js)._ - -##Usage - -`sliced` accepts the same arguments as `Array#slice` so you can easily swap it out. - -```js -function zing () { - var slow = [].slice.call(arguments, 1, 8); - var args = slice(arguments, 1, 8); - - var slow = Array.prototype.slice.call(arguments); - var args = slice(arguments); - // etc -} -``` - -## install - - npm install sliced - - -[LICENSE](https://github.com/aheckmann/sliced/blob/master/LICENSE) diff --git a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/bench.js b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/bench.js deleted file mode 100644 index f201d16..0000000 --- a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/bench.js +++ /dev/null @@ -1,95 +0,0 @@ - -var sliced = require('./') -var Bench = require('benchmark'); -var s = new Bench.Suite; -var slice = [].slice; - -s.add('Array.prototype.slice.call', function () { - Array.prototype.slice.call(arguments); -}).add('[].slice.call', function () { - [].slice.call(arguments); -}).add('cached slice.call', function () { - slice.call(arguments) -}).add('sliced', function () { - sliced(arguments) -}).on('cycle', function (evt) { - console.log(String(evt.target)); -}).on('complete', function () { - console.log('fastest is %s', this.filter('fastest').pluck('name')); -}) -.run(); - -var s = new Bench.Suite; -s.add('Array.prototype.slice.call(arguments, 1)', function () { - Array.prototype.slice.call(arguments, 1); -}).add('[].slice.call(arguments, 1)', function () { - [].slice.call(arguments, 1); -}).add('cached slice.call(arguments, 1)', function () { - slice.call(arguments, 1) -}).add('sliced(arguments, 1)', function () { - sliced(arguments, 1) -}).on('cycle', function (evt) { - console.log(String(evt.target)); -}).on('complete', function () { - console.log('fastest is %s', this.filter('fastest').pluck('name')); -}) -.run(); - -var s = new Bench.Suite; -s.add('Array.prototype.slice.call(arguments, -1)', function () { - Array.prototype.slice.call(arguments, -1); -}).add('[].slice.call(arguments, -1)', function () { - [].slice.call(arguments, -1); -}).add('cached slice.call(arguments, -1)', function () { - slice.call(arguments, -1) -}).add('sliced(arguments, -1)', function () { - sliced(arguments, -1) -}).on('cycle', function (evt) { - console.log(String(evt.target)); -}).on('complete', function () { - console.log('fastest is %s', this.filter('fastest').pluck('name')); -}) -.run(); - -var s = new Bench.Suite; -s.add('Array.prototype.slice.call(arguments, -2, -10)', function () { - Array.prototype.slice.call(arguments, -2, -10); -}).add('[].slice.call(arguments, -2, -10)', function () { - [].slice.call(arguments, -2, -10); -}).add('cached slice.call(arguments, -2, -10)', function () { - slice.call(arguments, -2, -10) -}).add('sliced(arguments, -2, -10)', function () { - sliced(arguments, -2, -10) -}).on('cycle', function (evt) { - console.log(String(evt.target)); -}).on('complete', function () { - console.log('fastest is %s', this.filter('fastest').pluck('name')); -}) -.run(); - -var s = new Bench.Suite; -s.add('Array.prototype.slice.call(arguments, -2, -1)', function () { - Array.prototype.slice.call(arguments, -2, -1); -}).add('[].slice.call(arguments, -2, -1)', function () { - [].slice.call(arguments, -2, -1); -}).add('cached slice.call(arguments, -2, -1)', function () { - slice.call(arguments, -2, -1) -}).add('sliced(arguments, -2, -1)', function () { - sliced(arguments, -2, -1) -}).on('cycle', function (evt) { - console.log(String(evt.target)); -}).on('complete', function () { - console.log('fastest is %s', this.filter('fastest').pluck('name')); -}) -.run(); - -/** - * Output: - * - * Array.prototype.slice.call x 1,289,592 ops/sec ±2.88% (87 runs sampled) - * [].slice.call x 1,345,451 ops/sec ±1.68% (97 runs sampled) - * cached slice.call x 10,719,886 ops/sec ±1.04% (99 runs sampled) - * sliced x 15,809,545 ops/sec ±1.46% (93 runs sampled) - * fastest is sliced - * - */ diff --git a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/component.json b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/component.json deleted file mode 100644 index a7ac7f2..0000000 --- a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/component.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "sliced", - "version": "0.0.3", - "description": "A faster Node.js alternative to Array.prototype.slice.call(arguments)", - "repo" : "aheckmann/sliced", - "keywords": [ - "arguments", - "slice", - "array" - ], - "author": "Aaron Heckmann ", - "license": "MIT" -} diff --git a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/index.js b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/index.js deleted file mode 100644 index 3b90ae7..0000000 --- a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = exports = require('./lib/sliced'); diff --git a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/lib/sliced.js b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/lib/sliced.js deleted file mode 100644 index d8c15bc..0000000 --- a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/lib/sliced.js +++ /dev/null @@ -1,37 +0,0 @@ - -/** - * An Array.prototype.slice.call(arguments) alternative - * - * @param {Object} args something with a length - * @param {Number} slice - * @param {Number} sliceEnd - * @api public - */ - -module.exports = function () { - var args = arguments[0]; - var slice = arguments[1]; - var sliceEnd = arguments[2]; - - var ret = []; - var len = args.length; - - if (0 === len) return ret; - - var start = slice < 0 - ? Math.max(0, slice + len) - : slice || 0; - - var end = 3 === arguments.length - ? sliceEnd < 0 - ? sliceEnd + len - : sliceEnd - : len; - - while (end-- > start) { - ret[end - start] = args[end]; - } - - return ret; -} - diff --git a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/package.json b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/package.json deleted file mode 100644 index c5af598..0000000 --- a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "sliced", - "version": "0.0.4", - "description": "A faster Node.js alternative to Array.prototype.slice.call(arguments)", - "main": "index.js", - "scripts": { - "test": "make test" - }, - "repository": { - "type": "git", - "url": "git://github.com/aheckmann/sliced" - }, - "keywords": [ - "arguments", - "slice", - "array" - ], - "author": { - "name": "Aaron Heckmann", - "email": "aaron.heckmann+github@gmail.com" - }, - "license": "MIT", - "devDependencies": { - "mocha": "1.5.0", - "benchmark": "~1.0.0" - }, - "readme": "#sliced\n==========\n\nA faster alternative to `[].slice.call(arguments)`.\n\n[![Build Status](https://secure.travis-ci.org/aheckmann/sliced.png)](http://travis-ci.org/aheckmann/sliced)\n\nExample output from [benchmark.js](https://github.com/bestiejs/benchmark.js)\n\n Array.prototype.slice.call x 1,320,205 ops/sec ±2.35% (92 runs sampled)\n [].slice.call x 1,314,605 ops/sec ±1.60% (95 runs sampled)\n cached slice.call x 10,468,380 ops/sec ±1.45% (95 runs sampled)\n sliced x 16,608,237 ops/sec ±1.40% (92 runs sampled)\n fastest is sliced\n\n Array.prototype.slice.call(arguments, 1) x 1,383,584 ops/sec ±1.73% (97 runs sampled)\n [].slice.call(arguments, 1) x 1,494,735 ops/sec ±1.33% (95 runs sampled)\n cached slice.call(arguments, 1) x 10,085,270 ops/sec ±1.51% (97 runs sampled)\n sliced(arguments, 1) x 16,620,480 ops/sec ±1.29% (95 runs sampled)\n fastest is sliced(arguments, 1)\n\n Array.prototype.slice.call(arguments, -1) x 1,303,262 ops/sec ±1.62% (94 runs sampled)\n [].slice.call(arguments, -1) x 1,325,615 ops/sec ±1.36% (97 runs sampled)\n cached slice.call(arguments, -1) x 9,673,603 ops/sec ±1.70% (96 runs sampled)\n sliced(arguments, -1) x 16,384,575 ops/sec ±1.06% (91 runs sampled)\n fastest is sliced(arguments, -1)\n\n Array.prototype.slice.call(arguments, -2, -10) x 1,404,390 ops/sec ±1.61% (95 runs sampled)\n [].slice.call(arguments, -2, -10) x 1,514,367 ops/sec ±1.21% (96 runs sampled)\n cached slice.call(arguments, -2, -10) x 9,836,017 ops/sec ±1.21% (95 runs sampled)\n sliced(arguments, -2, -10) x 18,544,882 ops/sec ±1.30% (91 runs sampled)\n fastest is sliced(arguments, -2, -10)\n\n Array.prototype.slice.call(arguments, -2, -1) x 1,458,604 ops/sec ±1.41% (97 runs sampled)\n [].slice.call(arguments, -2, -1) x 1,536,547 ops/sec ±1.63% (99 runs sampled)\n cached slice.call(arguments, -2, -1) x 10,060,633 ops/sec ±1.37% (96 runs sampled)\n sliced(arguments, -2, -1) x 18,608,712 ops/sec ±1.08% (93 runs sampled)\n fastest is sliced(arguments, -2, -1)\n\n_Benchmark [source](https://github.com/aheckmann/sliced/blob/master/bench.js)._\n\n##Usage\n\n`sliced` accepts the same arguments as `Array#slice` so you can easily swap it out.\n\n```js\nfunction zing () {\n var slow = [].slice.call(arguments, 1, 8);\n var args = slice(arguments, 1, 8);\n\n var slow = Array.prototype.slice.call(arguments);\n var args = slice(arguments);\n // etc\n}\n```\n\n## install\n\n npm install sliced\n\n\n[LICENSE](https://github.com/aheckmann/sliced/blob/master/LICENSE)\n", - "_id": "sliced@0.0.4", - "_from": "sliced@0.0.4" -} diff --git a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/test/index.js b/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/test/index.js deleted file mode 100644 index 33d36a1..0000000 --- a/node_modules/mongoose/node_modules/mpromise/node_modules/sliced/test/index.js +++ /dev/null @@ -1,80 +0,0 @@ - -var sliced = require('../') -var assert = require('assert') - -describe('sliced', function(){ - it('exports a function', function(){ - assert.equal('function', typeof sliced); - }) - describe('with 1 arg', function(){ - it('returns an array of the arg', function(){ - var o = [3, "4", {}]; - var r = sliced(o); - assert.equal(3, r.length); - assert.equal(o[0], r[0]); - assert.equal(o[1], r[1]); - assert.equal(o[1], r[1]); - }) - }) - describe('with 2 args', function(){ - it('returns an array of the arg starting at the 2nd arg', function(){ - var o = [3, "4", 5, null]; - var r = sliced(o, 2); - assert.equal(2, r.length); - assert.equal(o[2], r[0]); - assert.equal(o[3], r[1]); - }) - }) - describe('with 3 args', function(){ - it('returns an array of the arg from the 2nd to the 3rd arg', function(){ - var o = [3, "4", 5, null]; - var r = sliced(o, 1, 2); - assert.equal(1, r.length); - assert.equal(o[1], r[0]); - }) - }) - describe('with negative start and no end', function(){ - it('begins at an offset from the end and includes all following elements', function(){ - var o = [3, "4", 5, null]; - var r = sliced(o, -2); - assert.equal(2, r.length); - assert.equal(o[2], r[0]); - assert.equal(o[3], r[1]); - - var r = sliced(o, -12); - assert.equal(4, r.length); - assert.equal(o[0], r[0]); - assert.equal(o[1], r[1]); - }) - }) - describe('with negative start and positive end', function(){ - it('begins at an offset from the end and includes `end` elements', function(){ - var o = [3, "4", {x:1}, null]; - - var r = sliced(o, -2, 1); - assert.equal(0, r.length); - - var r = sliced(o, -2, 2); - assert.equal(0, r.length); - - var r = sliced(o, -2, 3); - assert.equal(1, r.length); - assert.equal(o[2], r[0]); - }) - }) - describe('with negative start and negative end', function(){ - it('begins at `start` offset from the end and includes all elements up to `end` offset from the end', function(){ - var o = [3, "4", {x:1}, null]; - var r = sliced(o, -3, -1); - assert.equal(2, r.length); - assert.equal(o[1], r[0]); - assert.equal(o[2], r[1]); - - var r = sliced(o, -3, -3); - assert.equal(0, r.length); - - var r = sliced(o, -3, -4); - assert.equal(0, r.length); - }) - }) -}) diff --git a/node_modules/mongoose/node_modules/mpromise/package.json b/node_modules/mongoose/node_modules/mpromise/package.json deleted file mode 100644 index bbda943..0000000 --- a/node_modules/mongoose/node_modules/mpromise/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "mpromise", - "version": "0.2.1", - "description": "Promises A+ conformant implementation", - "main": "index.js", - "scripts": { - "test": "make test" - }, - "dependencies": { - "sliced": "0.0.4" - }, - "devDependencies": { - "mocha": "1.7.4", - "promises-aplus-tests": ">= 1.2" - }, - "repository": { - "type": "git", - "url": "git://github.com/aheckmann/mpromise" - }, - "keywords": [ - "promise", - "mongoose", - "aplus", - "a+", - "plus" - ], - "author": { - "name": "Aaron Heckmann", - "email": "aaron.heckmann+github@gmail.com" - }, - "license": "MIT", - "readme": "#mpromise\n==========\n\nA [promises/A+](https://github.com/promises-aplus/promises-spec) conformant implementation, written for [mongoose](http://mongoosejs.com).\n\n## installation\n\n```\n$ npm install mpromise\n```\n\n## docs\n\nAn `mpromise` can be in any of three states, pending, fulfilled (success), or rejected (error). Once it is either fulfilled or rejected it's state can no longer be changed.\n\nThe exports object is the Promise constructor.\n\n```js\nvar Promise = require('mpromise');\n```\n\nThe constructor accepts an optional function which is executed when the promise is first resolved (either fulfilled or rejected).\n\n```js\nvar promise = new Promise(fn);\n```\n\nThis is the same as passing the `fn` to `onResolve` directly.\n\n```js\nvar promise = new Promise;\npromise.onResolve(function (err, args..) {\n ...\n});\n```\n\n### Methods\n\n####fulfill\n\nFulfilling a promise with values:\n\n```js\nvar promise = new Promise;\npromise.fulfill(args...);\n```\n\nIf the promise has already been fulfilled or rejected, no action is taken.\n\n####reject\n\nRejecting a promise with a reason:\n\n```js\nvar promise = new Promise;\npromise.reject(reason);\n```\n\nIf the promise has already been fulfilled or rejected, no action is taken.\n\n####resolve\n\nNode.js callback style promise resolution `(err, args...)`:\n\n```js\nvar promise = new Promise;\npromise.resolve([reason], [arg1, arg2, ...]);\n```\n\nIf the promise has already been fulfilled or rejected, no action is taken.\n\n####onFulfill\n\nTo register a function for execution when the promise is fulfilled, pass it to `onFulfill`. When executed it will receive the arguments passed to `fulfill()`.\n\n```js\nvar promise = new Promise;\npromise.onFulfill(function (a, b) {\n assert.equal(3, a + b);\n});\npromise.fulfill(1, 2);\n```\n\nThe function will only be called once when the promise is fulfilled, never when rejected.\n\nRegistering a function with `onFulfill` after the promise has already been fulfilled results in the immediate execution of the function with the original arguments used to fulfill the promise.\n\n```js\nvar promise = new Promise;\npromise.fulfill(\" :D \");\npromise.onFulfill(function (arg) {\n console.log(arg); // logs \" :D \"\n})\n```\n\n####onReject\n\nTo register a function for execution when the promise is rejected, pass it to `onReject`. When executed it will receive the argument passed to `reject()`.\n\n```js\nvar promise = new Promise;\npromise.onReject(function (reason) {\n assert.equal('sad', reason);\n});\npromise.reject('sad');\n```\n\nThe function will only be called once when the promise is rejected, never when fulfilled.\n\nRegistering a function with `onReject` after the promise has already been rejected results in the immediate execution of the function with the original argument used to reject the promise.\n\n```js\nvar promise = new Promise;\npromise.reject(\" :( \");\npromise.onReject(function (reason) {\n console.log(reason); // logs \" :( \"\n})\n```\n\n####onResolve\n\nAllows registration of node.js style callbacks `(err, args..)` to handle either promise resolution type (fulfill or reject).\n\n```js\n// fulfillment\nvar promise = new Promise;\npromise.onResolve(function (err, a, b) {\n console.log(a + b); // logs 3\n});\npromise.fulfill(1, 2);\n\n// rejection\nvar promise = new Promise;\npromise.onResolve(function (err) {\n if (err) {\n console.log(err.message); // logs \"failed\"\n }\n});\npromise.reject(new Error('failed'));\n```\n\n####then\n\nCreates a new promise and returns it. If `onFulfill` or `onReject` are passed, they are added as SUCCESS/ERROR callbacks to this promise after the nextTick.\n\nConforms to [promises/A+](https://github.com/promises-aplus/promises-spec) specification and passes its [tests](https://github.com/promises-aplus/promises-tests).\n\n```js\n// promise.then(onFulfill, onReject);\n\nvar p = new Promise;\n\np.then(function (arg) {\n return arg + 1;\n}).then(function (arg) {\n throw new Error(arg + ' is an error!');\n}).then(null, function (err) {\n assert.ok(err instanceof Error);\n assert.equal('2 is an error', err.message);\n});\np.complete(1);\n```\n\n####end\n\nSignifies that this promise was the last in a chain of `then()s`: if a handler passed to the call to `then` which produced this promise throws, the exception will go uncaught.\n\n```js\nvar p = new Promise;\np.then(function(){ throw new Error('shucks') });\nsetTimeout(function () {\n p.fulfill();\n // error was caught and swallowed by the promise returned from\n // p.then(). we either have to always register handlers on\n // the returned promises or we can do the following...\n}, 10);\n\n// this time we use .end() which prevents catching thrown errors\nvar p = new Promise;\nvar p2 = p.then(function(){ throw new Error('shucks') }).end(); // <--\nsetTimeout(function () {\n p.fulfill(); // throws \"shucks\"\n}, 10);\n```\n\n###Event names\n\nIf you'd like to alter this implementations event names used to signify success and failure you may do so by setting `Promise.SUCCESS` or `Promise.FAILURE` respectively.\n\n```js\nPromise.SUCCESS = 'complete';\nPromise.FAILURE = 'err';\n```\n\n###Luke, use the Source\nFor more ideas read the [source](https://github.com/aheckmann/mpromise/blob/master/lib), [tests](https://github.com/aheckmann/mpromise/blob/master/test), or the [mongoose implementation](https://github.com/LearnBoost/mongoose/blob/3.6x/lib/promise.js).\n\n## license\n\n[MIT](https://github.com/aheckmann/mpromise/blob/master/LICENSE)\n", - "_id": "mpromise@0.2.1", - "_from": "mpromise@0.2.1" -} diff --git a/node_modules/mongoose/node_modules/mpromise/test/promise.test.js b/node_modules/mongoose/node_modules/mpromise/test/promise.test.js deleted file mode 100644 index 45f6e29..0000000 --- a/node_modules/mongoose/node_modules/mpromise/test/promise.test.js +++ /dev/null @@ -1,201 +0,0 @@ - -/** - * Module dependencies. - */ - -var assert = require('assert') -var Promise = require('../lib/promise'); - -/** - * Test. - */ - -describe('promise', function(){ - it('events fire right after fulfill()', function(done){ - var promise = new Promise() - , called = 0; - - promise.on('fulfill', function (a, b) { - assert.equal(a, '1'); - assert.equal(b, '2'); - called++; - }); - - promise.fulfill('1', '2'); - - promise.on('fulfill', function (a, b) { - assert.equal(a, '1'); - assert.equal(b, '2'); - called++; - }); - - assert.equal(2, called); - done(); - }); - - it('events fire right after reject()', function(done){ - var promise = new Promise() - , called = 0; - - promise.on('reject', function (err) { - assert.ok(err instanceof Error); - called++; - }); - - promise.reject(new Error('booyah')); - - promise.on('reject', function (err) { - assert.ok(err instanceof Error); - called++; - }); - - assert.equal(2, called); - done() - }); - - describe('onResolve()', function(){ - it('from constructor works', function(done){ - var called = 0; - - var promise = new Promise(function (err) { - assert.ok(err instanceof Error); - called++; - }) - - promise.reject(new Error('dawg')); - - assert.equal(1, called); - done(); - }); - - it('after fulfill()', function(done){ - var promise = new Promise() - , called = 0; - - promise.fulfill('woot'); - - promise.onResolve(function (err, data){ - assert.equal(data,'woot'); - called++; - }); - - promise.onResolve(function (err, data){ - assert.strictEqual(err, null); - called++; - }); - - assert.equal(2, called); - done(); - }) - }); - - describe('onFulfill shortcut', function(){ - it('works', function(done){ - var promise = new Promise() - , called = 0; - - promise.onFulfill(function (woot) { - assert.strictEqual(woot, undefined); - called++; - }); - - promise.fulfill(); - - assert.equal(1, called); - done(); - }) - }) - - describe('onReject shortcut', function(){ - it('works', function(done){ - var promise = new Promise() - , called = 0; - - promise.onReject(function (err) { - assert.ok(err instanceof Error); - called++; - }); - - promise.reject(new Error); - assert.equal(1, called); - done(); - }) - }); - - describe('return values', function(){ - it('on()', function(done){ - var promise = new Promise() - assert.ok(promise.on('jump', function(){}) instanceof Promise); - done() - }); - - it('onFulfill()', function(done){ - var promise = new Promise() - assert.ok(promise.onFulfill(function(){}) instanceof Promise); - done(); - }) - it('onReject()', function(done){ - var promise = new Promise() - assert.ok(promise.onReject(function(){}) instanceof Promise); - done(); - }) - it('onResolve()', function(done){ - var promise = new Promise() - assert.ok(promise.onResolve(function(){}) instanceof Promise); - done(); - }) - }) - - describe('casting errors', function(){ - describe('reject()', function(){ - it('does not cast arguments to Error', function(done){ - var p = new Promise(function (err, arg) { - assert.equal(3, err); - done(); - }); - - p.reject(3); - }) - }) - }) - - describe('then catching', function(){ - it('should not catch returned promise fulfillments', function(done){ - var p1 = new Promise; - - var p2 = p1.then(function () { return 'step 1' }) - - p2.onFulfill(function () { throw new Error('fulfill threw me') }) - p2.reject = assert.ifError.bind(assert, new Error('reject should not have been called')); - - setTimeout(function () { - assert.throws(function () { - p1.fulfill(); - }, /fulfill threw me/) - done(); - }, 10); - - }) - - it('can be disabled using .end()', function(done){ - var p = new Promise; - - var p2 = p.then(function () { throw new Error('shucks') }) - p2.end(); - - setTimeout(function () { - try { - p.fulfill(); - } catch (err) { - assert.ok(/shucks/.test(err)) - done(); - } - - setTimeout(function () { - done(new Error('error was swallowed')); - }, 10); - - }, 10); - }) - }) -}) diff --git a/node_modules/mongoose/node_modules/mpromise/test/promises-A.js b/node_modules/mongoose/node_modules/mpromise/test/promises-A.js deleted file mode 100644 index ebb4626..0000000 --- a/node_modules/mongoose/node_modules/mpromise/test/promises-A.js +++ /dev/null @@ -1,35 +0,0 @@ - -/** - * Module dependencies. - */ - -var assert = require('assert') -var Promise = require('../lib/promise'); -var aplus = require('promises-aplus-tests'); - -// tests - -var adapter = {}; -adapter.fulfilled = function (value) { - var p = new Promise; - p.fulfill(value); - return p; -}; -adapter.rejected = function (reason) { - var p = new Promise; - p.reject(reason); - return p; -} -adapter.pending = function () { - var p = new Promise; - return { - promise: p - , fulfill: p.fulfill.bind(p) - , reject: p.reject.bind(p) - } -} - -aplus(adapter, function (err) { - assert.ifError(err); -}); - diff --git a/node_modules/mongoose/package.json b/node_modules/mongoose/package.json index d427b14..4451640 100644 --- a/node_modules/mongoose/package.json +++ b/node_modules/mongoose/package.json @@ -1,7 +1,7 @@ { "name": "mongoose", "description": "Mongoose MongoDB ODM", - "version": "3.6.4", + "version": "3.5.7", "author": { "name": "Guillermo Rauch", "email": "guillermo@learnboost.com" @@ -20,21 +20,18 @@ ], "dependencies": { "hooks": "0.2.1", - "mongodb": "1.2.14", + "mongodb": "1.2.13", "ms": "0.1.0", "sliced": "0.0.3", - "muri": "0.3.1", - "mpromise": "0.2.1", - "mpath": "0.1.1" + "muri": "0.3.1" }, "devDependencies": { - "mocha": "1.8.1", + "mocha": "1.7.4", "node-static": "0.5.9", "dox": "0.3.1", "jade": "0.26.3", "highlight.js": "7.0.1", - "markdown": "0.3.1", - "promises-aplus-tests": ">= 1.0.2" + "markdown": "0.3.1" }, "directories": { "lib": "./lib/mongoose" @@ -56,6 +53,6 @@ }, "homepage": "http://mongoosejs.com", "readme": "## What's Mongoose?\n\nMongoose is a [MongoDB](http://www.mongodb.org/) object modeling tool designed to work in an asynchronous environment.\n\n## Documentation\n\n[mongoosejs.com](http://mongoosejs.com/)\n\n## Try it live\n\n\n## Support\n\n - [Stack Overflow](http://stackoverflow.com/questions/tagged/mongoose)\n - [bug reports](https://github.com/learnboost/mongoose/issues/)\n - [help forum](http://groups.google.com/group/mongoose-orm)\n - [10gen support](http://www.mongodb.org/display/DOCS/Technical+Support)\n - (irc) #mongoosejs on freenode\n\n## Installation\n\nFirst install [node.js](http://nodejs.org/) and [mongodb](http://www.mongodb.org/downloads).\n\n $ npm install mongoose\n\n## Plugins\n\nCheck out the [plugins search site](http://plugins.mongoosejs.com/) to see hundreds of related modules from the community.\n\n## Contributors\n\nView all 80+ [contributors](https://github.com/learnboost/mongoose/graphs/contributors).\n\n## Get Involved\n\nStand up and be counted as a [contributor](https://github.com/LearnBoost/mongoose/blob/master/CONTRIBUTING.md) to mongoose too!\n\n## Overview\n\n### Connecting to MongoDB\n\nFirst, we need to define a connection. If your app uses only one database, you should use `mongose.connect`. If you need to create additional connections, use `mongoose.createConnection`.\n\nBoth `connect` and `createConnection` take a `mongodb://` URI, or the parameters `host, database, port, options`.\n\n var mongoose = require('mongoose');\n\n mongoose.connect('mongodb://localhost/my_database');\n\nOnce connected, the `open` event is fired on the `Connection` instance. If you're using `mongoose.connect`, the `Connection` is `mongoose.connection`. Otherwise, `mongoose.createConnection` return value is a `Connection`.\n\n**Important!** Mongoose buffers all the commands until it's connected to the database. This means that you don't have to wait until it connects to MongoDB in order to define models, run queries, etc.\n\n### Defining a Model\n\nModels are defined through the `Schema` interface. \n\n var Schema = mongoose.Schema\n , ObjectId = Schema.ObjectId;\n\n var BlogPost = new Schema({\n author : ObjectId\n , title : String\n , body : String\n , date : Date\n });\n\nAside from defining the structure of your documents and the types of data you're storing, a Schema handles the definition of:\n\n* [Validators](http://mongoosejs.com/docs/validation.html) (async and sync)\n* [Defaults](http://mongoosejs.com/docs/api.html#schematype_SchemaType-default)\n* [Getters](http://mongoosejs.com/docs/api.html#schematype_SchemaType-get)\n* [Setters](http://mongoosejs.com/docs/api.html#schematype_SchemaType-set)\n* [Indexes](http://mongoosejs.com/docs/guide.html#indexes)\n* [Middleware](http://mongoosejs.com/docs/middleware.html)\n* [Methods](http://mongoosejs.com/docs/guide.html#methods) definition\n* [Statics](http://mongoosejs.com/docs/guide.html#statics) definition\n* [Plugins](http://mongoosejs.com/docs/plugins.html)\n* [pseudo-JOINs](http://mongoosejs.com/docs/populate.html)\n\nThe following example shows some of these features:\n\n var Comment = new Schema({\n name : { type: String, default: 'hahaha' }\n , age : { type: Number, min: 18, index: true }\n , bio : { type: String, match: /[a-z]/ }\n , date : { type: Date, default: Date.now }\n , buff : Buffer\n });\n\n // a setter\n Comment.path('name').set(function (v) {\n return capitalize(v);\n });\n\n // middleware\n Comment.pre('save', function (next) {\n notify(this.get('email'));\n next();\n });\n\nTake a look at the example in `examples/schema.js` for an end-to-end example of a typical setup.\n\n### Accessing a Model\n\nOnce we define a model through `mongoose.model('ModelName', mySchema)`, we can access it through the same function\n\n var myModel = mongoose.model('ModelName');\n\nOr just do it all at once\n\n var MyModel = mongoose.model('ModelName', mySchema);\n\nWe can then instantiate it, and save it:\n\n var instance = new MyModel();\n instance.my.key = 'hello';\n instance.save(function (err) {\n //\n });\n\nOr we can find documents from the same collection\n\n MyModel.find({}, function (err, docs) {\n // docs.forEach\n });\n\nYou can also `findOne`, `findById`, `update`, etc. For more details check out [the docs](http://mongoosejs.com/docs/queries.html).\n\n**Important!** If you opened a separate connection using `mongoose.createConnection()` but attempt to access the model through `mongoose.model('ModelName')` it will not work as expected since it is not hooked up to an active db connection. In this case access your model through the connection you created:\n\n var conn = mongoose.createConnection('your connection string');\n var MyModel = conn.model('ModelName', schema);\n var m = new MyModel;\n m.save() // works\n\n vs\n\n var conn = mongoose.createConnection('your connection string');\n var MyModel = mongoose.model('ModelName', schema);\n var m = new MyModel;\n m.save() // does not work b/c the default connection object was never connected\n\n### Embedded Documents\n\nIn the first example snippet, we defined a key in the Schema that looks like:\n\n comments: [Comments]\n\nWhere `Comments` is a `Schema` we created. This means that creating embedded documents is as simple as:\n\n // retrieve my model\n var BlogPost = mongoose.model('BlogPost');\n\n // create a blog post\n var post = new BlogPost();\n\n // create a comment\n post.comments.push({ title: 'My comment' });\n\n post.save(function (err) {\n if (!err) console.log('Success!');\n });\n\nThe same goes for removing them:\n\n BlogPost.findById(myId, function (err, post) {\n if (!err) {\n post.comments[0].remove();\n post.save(function (err) {\n // do something\n });\n }\n });\n\nEmbedded documents enjoy all the same features as your models. Defaults, validators, middleware. Whenever an error occurs, it's bubbled to the `save()` error callback, so error handling is a snap!\n\nMongoose interacts with your embedded documents in arrays _atomically_, out of the box.\n\n### Middleware\n\nSee the [docs](http://mongoosejs.com/docs/middleware.html) page.\n\n#### Intercepting and mutating method arguments\n\nYou can intercept method arguments via middleware.\n\nFor example, this would allow you to broadcast changes about your Documents every time someone `set`s a path in your Document to a new value:\n\n schema.pre('set', function (next, path, val, typel) {\n // `this` is the current Document\n this.emit('set', path, val);\n\n // Pass control to the next pre\n next();\n });\n\nMoreover, you can mutate the incoming `method` arguments so that subsequent middleware see different values for those arguments. To do so, just pass the new values to `next`:\n\n .pre(method, function firstPre (next, methodArg1, methodArg2) {\n // Mutate methodArg1\n next(\"altered-\" + methodArg1.toString(), methodArg2);\n })\n\n // pre declaration is chainable\n .pre(method, function secondPre (next, methodArg1, methodArg2) {\n console.log(methodArg1);\n // => 'altered-originalValOfMethodArg1' \n \n console.log(methodArg2);\n // => 'originalValOfMethodArg2' \n \n // Passing no arguments to `next` automatically passes along the current argument values\n // i.e., the following `next()` is equivalent to `next(methodArg1, methodArg2)`\n // and also equivalent to, with the example method arg \n // values, `next('altered-originalValOfMethodArg1', 'originalValOfMethodArg2')`\n next();\n })\n\n#### Schema gotcha\n\n`type`, when used in a schema has special meaning within Mongoose. If your schema requires using `type` as a nested property you must use object notation:\n\n new Schema({\n broken: { type: Boolean }\n , asset : {\n name: String\n , type: String // uh oh, it broke. asset will be interpreted as String\n }\n });\n\n new Schema({\n works: { type: Boolean }\n , asset : {\n name: String\n , type: { type: String } // works. asset is an object with a type property\n }\n });\n\n### Driver access\n\nThe driver being used defaults to [node-mongodb-native](https://github.com/mongodb/node-mongodb-native) and is directly accessible through `YourModel.collection`. **Note**: using the driver directly bypasses all Mongoose power-tools like validation, getters, setters, hooks, etc.\n\n## API Docs\n\nFind the API docs [here](http://mongoosejs.com/docs/api.html), generated by [dox](http://github.com/visionmedia/dox).\n\n## License\n\nCopyright (c) 2010 LearnBoost <dev@learnboost.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", - "_id": "mongoose@3.6.4", - "_from": "mongoose@3.6.4" + "_id": "mongoose@3.5.7", + "_from": "mongoose@3.5.7" } diff --git a/node_modules/mongoose/static.js b/node_modules/mongoose/static.js index 8eab8ad..fc0e722 100644 --- a/node_modules/mongoose/static.js +++ b/node_modules/mongoose/static.js @@ -12,7 +12,6 @@ require('http').createServer(function (req, res) { } }); }); - req.resume(); }).listen(8088); console.error('now listening on localhost:8088'); diff --git a/node_modules/timekit/build/Release/timekit.node b/node_modules/timekit/build/Release/timekit.node deleted file mode 100755 index 2ad19617e9725943224183f1026d6b742e995923..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9848 zcmeHNZ)_Ar6rU@2RJ63ls-S?UQlluh9B93oka(2SYrtB2#Z*DZz1z9=U~l)by9cd* zVhz;T#2VCqnrMuPCXlF6qlqTQfDlAuM2#Q%N&TS75il`Tk&xQ+z4_DIyIPEipUh5} zdG9y#-kbN{&Xw7jJ%0A*=>>#@<`F`|P%nf!bRHq2qy;!amLP5*gwnobe;@CvZG>30 zPhzl1zzji(g;I|Vd4dZ6;}3Ye1%R*OV-Z3Wzf8pvpKGf_mXCz*)I(!Ea5CdDI26YM=vlj zRPSF=+S?;F5uYnwTz7GJV3cl1^d)@Lsr5Do#r1}Em2FCmVbiGU&t*@U!)32@t6Ei# zQd6hya3N!xwCFjr{A-bhRNfH#?V*1cRLz0Dp?i9@qu#$kY418Ig4l1bswp_kTM8#o+(Yh#i1^S>hIS|uA`ZDRyQ>>pV7R0fo;!w zQOh>OgU5A-Iztgct^tb85IBr6_aKJSD(ifpDC^G$z?!oEYCd{KD?^zoFPw~&y=h5YYXT*`{y0HOs%!~qdN6s~7vZ@3}a9)+cn z&%iJg{Bu;JH}3%SglhEC!>-2)(e>xlBcqVvTD^g6mb%fHUyWP~*3s``1l$H1lpq5^ z27(L(83;1)f6YK5y=i>e!@pK4iFBpSg-t^9m88<<0JAwY_ES2w>r^~7{^&$`2W&uq zITkxzeihi!gTo8TPXTjs>13*T<(H&NPNrvhs7+9pZWk2%!iw}+WV2rwr*C!1TE-U1Hi9PI}Y znD!8Yy(kahYnXq$hx7fPgB#%2%Fzb}K2-ipPJ%AIg1mG|@Dr)WkDwdUtHeF&uCeLV z__`!a_%WEMl=mu~b>B~ed#7XHl#9IU(=u*ZHjVv}8v8Ca_DSrsGH!Q4chQXQy)(M! zgDI|ilhnn1hfjA);(_~5;2x^dHVNvLw%>Srnzv_odzQCTyq)GPz6e#?8hAUOw_#|( z?)b7dLEuCyI1Ky&w9%gFyI_!p6%5d2=`zYzR0$R8B^IP&ia zehm5jf*(cxCE(GIk=@Y*Zd6IOSmHDq)m$g5Hm|g3yZNDLHcRAgmT!2Mq9znS#i;Pb z6qAQ_iG1lo9#$=E8t1{L6gkpxIqdo_1uw254WST$f1;Bz;QK7bJa6(zhl3NYZ1Hek-YpU%BzS?0*(tG@vxe_d|h#HpoDb zfgl4x27(L(83-~EWFW{ukbxirK?Z^h1R3}*Gk|waa10P$ENMhiyl=$*)so^}7~ips|;89;;V7b0JcR`H$3U>e>fj(7m+`vYbF5s6#Ro_KqB;F(aEdg$Zs^)uMVwInF zBv$c#i5RX#)qV1JfZ^Y?n(tyb+w$WZ>u|CTTXpz&9saQnUk{7LZ~u-uyhUKp5+zrM zaed<5HXN(*yI(vjTLyJG)GMJzpk4*_YN-E4HbS(`E^}OMTh2CJyP!D?jsrE_(lxx( zrUlz5naovZg&LXb?C{^2$&~V@q4hG8=`Pdk%(kefI|Iy{nP>L-qz!la_ubS7=a{`4 zyVvZ9cO;yFQh`~Xo2-w4U&pT+7%pn7qw#25Gg#5pcEq*3l{HHS12#H{)^6z(2cokL z;#6H$-ouI7Q@UlCtgAas+waP3V_7emOcE*&OJ#-#erCbH$)OqetOPz(QQy*tFED7X zWM!#o+uKV;9>_mfpEJ~RyItoL2xA1Xml`dLX2D-tw4Z>86Se zy_==f8B6Z?+kp-Kf%e-WNH1?&eXLM4b&thjcQ8+N`Yg;6T-(idCVOtj6j!r-^F6v* zVvuZjK56QE-pTY@+MSM3d?X#|{D7r19 zEjHvS!{41Db&&F(CP0_L0GFUEeF$05z_3V^feSmQm OAB~+e^kMjg67m;1-ai%q diff --git a/node_modules/v8tools/README.md b/node_modules/v8tools/README.md index d38ac80..31d8d6d 100644 --- a/node_modules/v8tools/README.md +++ b/node_modules/v8tools/README.md @@ -11,7 +11,7 @@ V8tools - V8 CPU Profiler Binding `var v8tools = require('v8tools');` -`v8tools.afterGC(function(gcType, gcFlags, usedHeapSize) {})` - calls the callback after garbage collection cycle. +`v8tools.afterGC(v8tools.afterGC(function(gcType, gcFlags, usedHeapSize) {})` - calls the callback after garbage collection cycle. `v8tools.startV8Profiler()` - starts V8 CPU profiler diff --git a/node_modules/v8tools/build/Release/v8tools.node b/node_modules/v8tools/build/Release/v8tools.node index f73631770b2e9b7875d0e5e6fc500bae75843313..ee7fdf2639a6bf7129fc9e620ec501db2592341e 100755 GIT binary patch delta 32 kcmX@p%Xp@jal;Kmrd`I9ZyELhsm)nNd5j?XmhmSc0PGJ9=>Px# delta 32 ncmX@p%Xp@jal;KmCU&FAw+#D$)aERsJVquCqs_OBKM4T<%_$4c diff --git a/node_modules/v8tools/package.json b/node_modules/v8tools/package.json index 406d3ab..ab1637c 100644 --- a/node_modules/v8tools/package.json +++ b/node_modules/v8tools/package.json @@ -1,6 +1,6 @@ { "name": "v8tools", - "version": "0.2.2", + "version": "0.2.1", "description": "V8 profiler and GC bindings", "author": { "name": "Nodetime", @@ -38,7 +38,7 @@ "install": "node-gyp rebuild" }, "gypfile": true, - "readme": "V8tools - V8 CPU Profiler Binding\n===\n\n\n## Installation\n\n npm install v8tools\n\n\n## API\n\n`var v8tools = require('v8tools');`\n\n`v8tools.afterGC(function(gcType, gcFlags, usedHeapSize) {})` - calls the callback after garbage collection cycle.\n\n`v8tools.startV8Profiler()` - starts V8 CPU profiler\n\n`v8tools.stopV8Profiler(function(parentNodeUid, nodeUid, totalSamplesCount, functionName, scriptResourceName, lineNumber) {})` - stops V8 CPU profiler. Callback function is called on every node while walking profile's top down call tree.\n\n`heapprof.takeHeapSnapshot(function(parentNodeUid, nodeUid, name, type, selfSize, retainerName, retainerType) {})` - takes heap snapshot. Callback function is called on every node of heap node graph.\n\n\n\n## Platforms\n\nPOSIX and Windows\n\n\n## License\n\nCopyright (c) 2012 Dmitri Melikyan\n\nPermission 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:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE 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.\n", - "_id": "v8tools@0.2.2", - "_from": "v8tools@0.2.2" + "readme": "V8tools - V8 CPU Profiler Binding\n===\n\n\n## Installation\n\n npm install v8tools\n\n\n## API\n\n`var v8tools = require('v8tools');`\n\n`v8tools.afterGC(v8tools.afterGC(function(gcType, gcFlags, usedHeapSize) {})` - calls the callback after garbage collection cycle.\n\n`v8tools.startV8Profiler()` - starts V8 CPU profiler\n\n`v8tools.stopV8Profiler(function(parentNodeUid, nodeUid, totalSamplesCount, functionName, scriptResourceName, lineNumber) {})` - stops V8 CPU profiler. Callback function is called on every node while walking profile's top down call tree.\n\n`heapprof.takeHeapSnapshot(function(parentNodeUid, nodeUid, name, type, selfSize, retainerName, retainerType) {})` - takes heap snapshot. Callback function is called on every node of heap node graph.\n\n\n\n## Platforms\n\nPOSIX and Windows\n\n\n## License\n\nCopyright (c) 2012 Dmitri Melikyan\n\nPermission 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:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE 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.\n", + "_id": "v8tools@0.2.1", + "_from": "v8tools@0.2.1" } diff --git a/node_modules/v8tools/src/gc.cc b/node_modules/v8tools/src/gc.cc index 3818c59..2ddea7c 100644 --- a/node_modules/v8tools/src/gc.cc +++ b/node_modules/v8tools/src/gc.cc @@ -76,7 +76,7 @@ static void GCEpilogue(GCType gc_type, GCCallbackFlags gc_callback_flags) { baton->used_heap_size = GetUsedHeapSize(); - uv_queue_work(uv_default_loop(), &baton->request, Noop, (uv_after_work_cb)GCEpilogueAsync); + uv_queue_work(uv_default_loop(), &baton->request, Noop, GCEpilogueAsync); } diff --git a/package.json b/package.json index 062ab4c..6d619be 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,16 @@ { "name": "MIT-Annotation-Data-Store", - "version": "1.0.0", + "version": "0.1.4", "dependencies": { "jwt-simple": "0.1.0", - "express": "3.1.1", + "express": "3.1.0", "less-middleware": "0.1.6", - "mongoose": "3.6.4", - "v8tools": "0.2.2" + "mongoose": "3.5.7", + "timekit": "0.1.9", + "v8tools": "0.2.1" }, "engines": { - "node": "0.10.3", - "npm": "1.2.15" + "node": "0.8.19", + "npm": "1.2.10" } } From 47882014903e5ced1e327f17c27abcd49a2d8af7 Mon Sep 17 00:00:00 2001 From: Jamie Folsom Date: Fri, 5 Apr 2013 16:36:30 -0400 Subject: [PATCH 13/18] Re-add node time. --- node_modules/nodetime/.npmignore | 5 + node_modules/nodetime/LICENSE | 19 + node_modules/nodetime/README.md | 11 + .../darwin/x64/v0.10.0/nodetime_native.node | Bin 0 -> 18772 bytes .../darwin/x64/v0.10.1/nodetime_native.node | Bin 0 -> 18772 bytes .../darwin/x64/v0.8.0/nodetime_native.node | Bin 0 -> 18772 bytes .../darwin/x64/v0.8.1/nodetime_native.node | Bin 0 -> 18772 bytes .../darwin/x64/v0.8.10/nodetime_native.node | Bin 0 -> 18772 bytes .../darwin/x64/v0.8.11/nodetime_native.node | Bin 0 -> 18772 bytes .../darwin/x64/v0.8.12/nodetime_native.node | Bin 0 -> 18772 bytes .../darwin/x64/v0.8.13/nodetime_native.node | Bin 0 -> 18772 bytes .../darwin/x64/v0.8.14/nodetime_native.node | Bin 0 -> 18772 bytes .../darwin/x64/v0.8.15/nodetime_native.node | Bin 0 -> 18772 bytes .../darwin/x64/v0.8.16/nodetime_native.node | Bin 0 -> 18772 bytes .../darwin/x64/v0.8.17/nodetime_native.node | Bin 0 -> 18772 bytes .../darwin/x64/v0.8.18/nodetime_native.node | Bin 0 -> 18772 bytes .../darwin/x64/v0.8.19/nodetime_native.node | Bin 0 -> 18772 bytes .../darwin/x64/v0.8.2/nodetime_native.node | Bin 0 -> 18772 bytes .../darwin/x64/v0.8.20/nodetime_native.node | Bin 0 -> 18772 bytes .../darwin/x64/v0.8.21/nodetime_native.node | Bin 0 -> 18772 bytes .../darwin/x64/v0.8.22/nodetime_native.node | Bin 0 -> 18772 bytes .../darwin/x64/v0.8.3/nodetime_native.node | Bin 0 -> 18772 bytes .../darwin/x64/v0.8.4/nodetime_native.node | Bin 0 -> 18772 bytes .../darwin/x64/v0.8.5/nodetime_native.node | Bin 0 -> 18772 bytes .../darwin/x64/v0.8.6/nodetime_native.node | Bin 0 -> 18772 bytes .../darwin/x64/v0.8.7/nodetime_native.node | Bin 0 -> 18772 bytes .../darwin/x64/v0.8.8/nodetime_native.node | Bin 0 -> 18772 bytes .../darwin/x64/v0.8.9/nodetime_native.node | Bin 0 -> 18772 bytes .../linux/ia32/v0.10.0/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.10.1/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.6.0/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.6.1/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.6.10/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.6.11/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.6.12/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.6.13/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.6.14/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.6.15/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.6.16/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.6.17/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.6.18/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.6.19/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.6.2/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.6.20/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.6.21/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.6.3/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.6.4/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.6.5/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.6.6/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.6.7/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.6.8/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.6.9/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.8.0/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.8.1/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.8.10/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.8.11/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.8.12/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.8.13/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.8.14/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.8.15/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.8.16/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.8.17/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.8.18/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.8.19/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.8.2/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.8.20/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.8.21/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.8.22/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.8.3/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.8.4/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.8.5/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.8.6/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.8.7/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.8.8/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/ia32/v0.8.9/nodetime_native.node | Bin 0 -> 18457 bytes .../linux/x64/v0.10.0/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.10.1/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.6.0/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.6.1/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.6.10/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.6.11/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.6.12/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.6.13/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.6.14/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.6.15/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.6.16/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.6.17/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.6.18/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.6.19/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.6.2/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.6.20/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.6.21/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.6.3/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.6.4/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.6.5/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.6.6/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.6.7/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.6.8/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.6.9/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.8.0/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.8.1/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.8.10/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.8.11/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.8.12/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.8.13/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.8.14/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.8.15/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.8.16/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.8.17/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.8.18/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.8.19/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.8.2/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.8.20/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.8.21/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.8.22/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.8.3/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.8.4/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.8.5/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.8.6/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.8.7/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.8.8/nodetime_native.node | Bin 0 -> 20736 bytes .../linux/x64/v0.8.9/nodetime_native.node | Bin 0 -> 20736 bytes .../win32/ia32/v0.10.0/nodetime_native.node | Bin 0 -> 71680 bytes .../win32/ia32/v0.10.1/nodetime_native.node | Bin 0 -> 71680 bytes .../win32/ia32/v0.8.0/nodetime_native.node | Bin 0 -> 70656 bytes .../win32/ia32/v0.8.1/nodetime_native.node | Bin 0 -> 70656 bytes .../win32/ia32/v0.8.10/nodetime_native.node | Bin 0 -> 70656 bytes .../win32/ia32/v0.8.11/nodetime_native.node | Bin 0 -> 70656 bytes .../win32/ia32/v0.8.12/nodetime_native.node | Bin 0 -> 70656 bytes .../win32/ia32/v0.8.13/nodetime_native.node | Bin 0 -> 70656 bytes .../win32/ia32/v0.8.14/nodetime_native.node | Bin 0 -> 70656 bytes .../win32/ia32/v0.8.15/nodetime_native.node | Bin 0 -> 70656 bytes .../win32/ia32/v0.8.16/nodetime_native.node | Bin 0 -> 70656 bytes .../win32/ia32/v0.8.17/nodetime_native.node | Bin 0 -> 70656 bytes .../win32/ia32/v0.8.18/nodetime_native.node | Bin 0 -> 70656 bytes .../win32/ia32/v0.8.19/nodetime_native.node | Bin 0 -> 70656 bytes .../win32/ia32/v0.8.2/nodetime_native.node | Bin 0 -> 70656 bytes .../win32/ia32/v0.8.20/nodetime_native.node | Bin 0 -> 70656 bytes .../win32/ia32/v0.8.21/nodetime_native.node | Bin 0 -> 70656 bytes .../win32/ia32/v0.8.22/nodetime_native.node | Bin 0 -> 70656 bytes .../win32/ia32/v0.8.3/nodetime_native.node | Bin 0 -> 70656 bytes .../win32/ia32/v0.8.4/nodetime_native.node | Bin 0 -> 70656 bytes .../win32/ia32/v0.8.5/nodetime_native.node | Bin 0 -> 70656 bytes .../win32/ia32/v0.8.6/nodetime_native.node | Bin 0 -> 70656 bytes .../win32/ia32/v0.8.7/nodetime_native.node | Bin 0 -> 70656 bytes .../win32/ia32/v0.8.8/nodetime_native.node | Bin 0 -> 70656 bytes .../win32/ia32/v0.8.9/nodetime_native.node | Bin 0 -> 70656 bytes .../win32/x64/v0.10.0/nodetime_native.node | Bin 0 -> 78336 bytes .../win32/x64/v0.10.1/nodetime_native.node | Bin 0 -> 78336 bytes .../win32/x64/v0.8.0/nodetime_native.node | Bin 0 -> 77824 bytes .../win32/x64/v0.8.1/nodetime_native.node | Bin 0 -> 77824 bytes .../win32/x64/v0.8.10/nodetime_native.node | Bin 0 -> 78336 bytes .../win32/x64/v0.8.11/nodetime_native.node | Bin 0 -> 78336 bytes .../win32/x64/v0.8.12/nodetime_native.node | Bin 0 -> 78336 bytes .../win32/x64/v0.8.13/nodetime_native.node | Bin 0 -> 78336 bytes .../win32/x64/v0.8.14/nodetime_native.node | Bin 0 -> 78336 bytes .../win32/x64/v0.8.15/nodetime_native.node | Bin 0 -> 78336 bytes .../win32/x64/v0.8.16/nodetime_native.node | Bin 0 -> 78336 bytes .../win32/x64/v0.8.17/nodetime_native.node | Bin 0 -> 78336 bytes .../win32/x64/v0.8.18/nodetime_native.node | Bin 0 -> 78336 bytes .../win32/x64/v0.8.19/nodetime_native.node | Bin 0 -> 78336 bytes .../win32/x64/v0.8.2/nodetime_native.node | Bin 0 -> 77824 bytes .../win32/x64/v0.8.20/nodetime_native.node | Bin 0 -> 78336 bytes .../win32/x64/v0.8.21/nodetime_native.node | Bin 0 -> 78336 bytes .../win32/x64/v0.8.22/nodetime_native.node | Bin 0 -> 78336 bytes .../win32/x64/v0.8.3/nodetime_native.node | Bin 0 -> 77824 bytes .../win32/x64/v0.8.4/nodetime_native.node | Bin 0 -> 77824 bytes .../win32/x64/v0.8.5/nodetime_native.node | Bin 0 -> 77824 bytes .../win32/x64/v0.8.6/nodetime_native.node | Bin 0 -> 77824 bytes .../win32/x64/v0.8.7/nodetime_native.node | Bin 0 -> 77824 bytes .../win32/x64/v0.8.8/nodetime_native.node | Bin 0 -> 78336 bytes .../win32/x64/v0.8.9/nodetime_native.node | Bin 0 -> 78336 bytes node_modules/nodetime/index.js | 1 + .../nodetime/lib/addons/dtrace-provider.js | 63 + .../nodetime/lib/addons/stdout-writer.js | 45 + node_modules/nodetime/lib/core/agent.js | 385 ++++ node_modules/nodetime/lib/core/logger.js | 34 + node_modules/nodetime/lib/core/proxy.js | 201 ++ node_modules/nodetime/lib/core/system.js | 49 + node_modules/nodetime/lib/core/thread.js | 41 + node_modules/nodetime/lib/core/time.js | 90 + node_modules/nodetime/lib/core/timers.js | 99 + node_modules/nodetime/lib/core/utils.js | 20 + node_modules/nodetime/lib/metrics/metric.js | 204 ++ .../nodetime/lib/metrics/metrics-manager.js | 150 ++ .../nodetime/lib/monitors/mongodb-monitor.js | 384 ++++ .../nodetime/lib/monitors/redis-monitor.js | 161 ++ .../lib/probes/cassandra-client-probe.js | 114 + .../nodetime/lib/probes/cassandra-probe.js | 71 + node_modules/nodetime/lib/probes/fs-probe.js | 114 + .../nodetime/lib/probes/global-probe.js | 24 + .../nodetime/lib/probes/http-probe.js | 162 ++ .../nodetime/lib/probes/memcache-probe.js | 126 ++ .../nodetime/lib/probes/memcached-probe.js | 88 + .../nodetime/lib/probes/mongodb-probe.js | 129 ++ .../nodetime/lib/probes/mysql-probe.js | 64 + node_modules/nodetime/lib/probes/net-probe.js | 58 + node_modules/nodetime/lib/probes/pg-probe.js | 132 ++ .../nodetime/lib/probes/process-probe.js | 70 + .../nodetime/lib/probes/redis-probe.js | 215 ++ .../nodetime/lib/probes/socket.io-probe.js | 79 + .../nodetime/lib/process/disk-stats.js | 74 + .../nodetime/lib/process/process-info.js | 139 ++ .../nodetime/lib/process/process-state.js | 20 + .../nodetime/lib/process/process-stats.js | 71 + .../lib/profiler/call-metrics-groups.js | 69 + .../nodetime/lib/profiler/call-metrics.js | 58 + .../lib/profiler/custom-transaction.js | 27 + .../profiler/filter/filter-key-extractor.js | 92 + .../lib/profiler/filter/predicate-filter.js | 111 + .../lib/profiler/named-transactions.js | 61 + .../nodetime/lib/profiler/profiler.js | 370 ++++ node_modules/nodetime/lib/profiler/sample.js | 43 + .../nodetime/lib/profiler/skip-counter.js | 45 + .../nodetime/lib/profiler/time-promise.js | 52 + node_modules/nodetime/lib/saas/data-sender.js | 126 ++ .../nodetime/lib/saas/gzip-request.js | 47 + node_modules/nodetime/lib/saas/saas-client.js | 189 ++ node_modules/nodetime/lib/v8/cpu-profiler.js | 162 ++ node_modules/nodetime/lib/v8/gc-stats.js | 37 + node_modules/nodetime/lib/v8/heap-profiler.js | 457 ++++ node_modules/nodetime/lib/v8/heap-stats.js | 46 + .../node_modules/nodetime-native/.npmignore | 7 + .../node_modules/nodetime-native/LICENSE | 19 + .../node_modules/nodetime-native/README.md | 3 + .../node_modules/nodetime-native/binding.gyp | 27 + .../nodetime-native/build/Makefile | 359 +++ .../.deps/Release/nodetime_native.node.d | 1 + .../obj.target/nodetime_native/src/gc.o.d | 30 + .../nodetime_native/src/nodetime_native.o.d | 33 + .../nodetime_native/src/profiler.o.d | 11 + .../nodetime_native/src/system_posix.o.d | 29 + .../nodetime-native/build/Release/linker.lock | 0 .../build/Release/nodetime_native.node | Bin 0 -> 18884 bytes .../obj.target/nodetime_native/src/gc.o | Bin 0 -> 70992 bytes .../nodetime_native/src/nodetime_native.o | Bin 0 -> 40740 bytes .../obj.target/nodetime_native/src/profiler.o | Bin 0 -> 56864 bytes .../nodetime_native/src/system_posix.o | Bin 0 -> 44296 bytes .../nodetime-native/build/binding.Makefile | 6 + .../nodetime-native/build/config.gypi | 104 + .../nodetime-native/build/gyp-mac-tool | 210 ++ .../build/nodetime_native.target.mk | 136 ++ .../node_modules/nodetime-native/index.js | 1 + .../node_modules/bindings/README.md | 97 + .../node_modules/bindings/bindings.js | 155 ++ .../node_modules/bindings/package.json | 27 + .../nodetime-native/nodetime_native.cc | 281 +++ .../node_modules/nodetime-native/package.json | 32 + .../node_modules/nodetime-native/src/gc.cc | 102 + .../node_modules/nodetime-native/src/gc.h | 13 + .../nodetime-native/src/nodetime_native.cc | 24 + .../nodetime-native/src/profiler.cc | 124 ++ .../nodetime-native/src/profiler.h | 13 + .../node_modules/nodetime-native/src/system.h | 12 + .../nodetime-native/src/system_posix.cc | 37 + .../nodetime-native/src/system_win.cc | 43 + .../node_modules/nodetime-native/wscript | 16 + .../nodetime/node_modules/request/LICENSE | 55 + .../nodetime/node_modules/request/README.md | 310 +++ .../nodetime/node_modules/request/aws.js | 191 ++ .../nodetime/node_modules/request/forever.js | 103 + .../nodetime/node_modules/request/main.js | 1123 ++++++++++ .../request/node_modules/form-data/.npmignore | 5 + .../request/node_modules/form-data/Makefile | 7 + .../request/node_modules/form-data/Readme.md | 86 + .../node_modules/form-data/lib/form_data.js | 237 ++ .../form-data/node-form-data.sublime-project | 8 + .../node-form-data.sublime-workspace | 508 +++++ .../form-data/node_modules/async/.gitmodules | 9 + .../form-data/node_modules/async/LICENSE | 19 + .../form-data/node_modules/async/Makefile | 21 + .../form-data/node_modules/async/README.md | 970 ++++++++ .../node_modules/async/async.min.js.gzip | Bin 0 -> 1859 bytes .../node_modules/async/deps/nodeunit.css | 70 + .../node_modules/async/deps/nodeunit.js | 1966 +++++++++++++++++ .../node_modules/async/dist/async.min.js | 1 + .../form-data/node_modules/async/index.js | 3 + .../form-data/node_modules/async/lib/async.js | 632 ++++++ .../form-data/node_modules/async/nodelint.cfg | 4 + .../form-data/node_modules/async/package.json | 41 + .../form-data/node_modules/async/test/.swp | Bin 0 -> 12288 bytes .../node_modules/async/test/test-async.js | 1367 ++++++++++++ .../node_modules/async/test/test.html | 24 + .../node_modules/combined-stream/.npmignore | 3 + .../node_modules/combined-stream/License | 19 + .../node_modules/combined-stream/Makefile | 7 + .../node_modules/combined-stream/Readme.md | 132 ++ .../combined-stream/lib/combined_stream.js | 183 ++ .../node_modules/delayed-stream/.npmignore | 2 + .../node_modules/delayed-stream/License | 19 + .../node_modules/delayed-stream/Makefile | 7 + .../node_modules/delayed-stream/Readme.md | 154 ++ .../delayed-stream/lib/delayed_stream.js | 99 + .../node_modules/delayed-stream/package.json | 38 + .../delayed-stream/test/common.js | 6 + .../integration/test-delayed-http-upload.js | 38 + .../test-delayed-stream-auto-pause.js | 21 + .../integration/test-delayed-stream-pause.js | 14 + .../test/integration/test-delayed-stream.js | 48 + .../integration/test-handle-source-errors.js | 15 + .../test/integration/test-max-data-size.js | 18 + .../test/integration/test-pipe-resumes.js | 13 + .../test/integration/test-proxy-readable.js | 13 + .../node_modules/delayed-stream/test/run.js | 7 + .../node_modules/combined-stream/package.json | 39 + .../combined-stream/test/common.js | 12 + .../combined-stream/test/fixture/file1.txt | 256 +++ .../combined-stream/test/fixture/file2.txt | 256 +++ .../test/integration/test-callback-streams.js | 27 + .../test/integration/test-data-size.js | 34 + ...delayed-streams-and-buffers-and-strings.js | 38 + .../test/integration/test-delayed-streams.js | 35 + .../test/integration/test-max-data-size.js | 24 + .../test/integration/test-unpaused-streams.js | 30 + .../node_modules/combined-stream/test/run.js | 7 + .../node_modules/form-data/package.json | 43 + .../node_modules/form-data/test/common.js | 14 + .../form-data/test/fixture/bacon.txt | 1 + .../form-data/test/fixture/unicycle.jpg | Bin 0 -> 19806 bytes .../test/integration/test-form-get-length.js | 93 + .../test/integration/test-get-boundary.js | 18 + .../test/integration/test-http-response.js | 121 + .../form-data/test/integration/test-pipe.js | 111 + .../form-data/test/integration/test-submit.js | 107 + .../node_modules/form-data/test/run.js | 7 + .../request/node_modules/mime/LICENSE | 19 + .../request/node_modules/mime/README.md | 63 + .../request/node_modules/mime/mime.js | 104 + .../request/node_modules/mime/package.json | 42 + .../request/node_modules/mime/test.js | 55 + .../node_modules/mime/types/mime.types | 1588 +++++++++++++ .../node_modules/mime/types/node.types | 59 + .../nodetime/node_modules/request/oauth.js | 43 + .../node_modules/request/package.json | 40 + .../request/tests/googledoodle.png | Bin 0 -> 38510 bytes .../node_modules/request/tests/run.js | 45 + .../node_modules/request/tests/server.js | 90 + .../node_modules/request/tests/squid.conf | 77 + .../node_modules/request/tests/ssl/ca/ca.cnf | 20 + .../node_modules/request/tests/ssl/ca/ca.crl | 0 .../node_modules/request/tests/ssl/ca/ca.crt | 17 + .../node_modules/request/tests/ssl/ca/ca.csr | 13 + .../node_modules/request/tests/ssl/ca/ca.key | 18 + .../node_modules/request/tests/ssl/ca/ca.srl | 1 + .../request/tests/ssl/ca/server.cnf | 19 + .../request/tests/ssl/ca/server.crt | 16 + .../request/tests/ssl/ca/server.csr | 11 + .../request/tests/ssl/ca/server.js | 28 + .../request/tests/ssl/ca/server.key | 9 + .../node_modules/request/tests/ssl/npm-ca.crt | 16 + .../node_modules/request/tests/ssl/test.crt | 15 + .../node_modules/request/tests/ssl/test.key | 15 + .../node_modules/request/tests/test-body.js | 117 + .../node_modules/request/tests/test-cookie.js | 29 + .../request/tests/test-cookiejar.js | 90 + .../request/tests/test-defaults.js | 114 + .../node_modules/request/tests/test-errors.js | 37 + .../request/tests/test-follow-all-303.js | 30 + .../request/tests/test-follow-all.js | 35 + .../node_modules/request/tests/test-form.js | 79 + .../request/tests/test-headers.js | 52 + .../request/tests/test-httpModule.js | 94 + .../request/tests/test-https-strict.js | 97 + .../node_modules/request/tests/test-https.js | 86 + .../node_modules/request/tests/test-oauth.js | 117 + .../node_modules/request/tests/test-params.js | 92 + .../request/tests/test-piped-redirect.js | 52 + .../node_modules/request/tests/test-pipes.js | 216 ++ .../node_modules/request/tests/test-pool.js | 16 + .../tests/test-protocol-changing-redirect.js | 60 + .../node_modules/request/tests/test-proxy.js | 39 + .../node_modules/request/tests/test-qs.js | 28 + .../request/tests/test-redirect.js | 154 ++ .../node_modules/request/tests/test-s3.js | 13 + .../request/tests/test-timeout.js | 87 + .../node_modules/request/tests/test-toJSON.js | 14 + .../node_modules/request/tests/test-tunnel.js | 63 + .../node_modules/request/tests/unicycle.jpg | Bin 0 -> 19806 bytes .../nodetime/node_modules/request/tunnel.js | 227 ++ .../nodetime/node_modules/request/uuid.js | 19 + .../request/vendor/cookie/index.js | 65 + .../node_modules/request/vendor/cookie/jar.js | 72 + node_modules/nodetime/package.json | 70 + node_modules/nodetime/publish.sh | 11 + package.json | 1 + 385 files changed, 22244 insertions(+) create mode 100644 node_modules/nodetime/.npmignore create mode 100644 node_modules/nodetime/LICENSE create mode 100644 node_modules/nodetime/README.md create mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.10.0/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.10.1/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.0/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.1/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.10/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.11/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.12/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.13/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.14/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.15/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.16/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.17/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.18/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.19/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.2/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.20/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.21/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.22/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.3/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.4/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.5/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.6/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.7/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.8/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.9/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.10.0/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.10.1/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.0/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.1/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.10/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.11/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.12/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.13/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.14/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.15/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.16/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.17/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.18/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.19/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.2/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.20/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.21/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.3/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.4/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.5/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.6/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.7/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.8/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.9/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.0/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.1/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.10/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.11/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.12/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.13/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.14/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.15/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.16/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.17/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.18/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.19/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.2/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.20/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.21/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.22/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.3/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.4/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.5/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.6/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.7/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.8/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.9/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.10.0/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.10.1/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.0/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.1/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.10/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.11/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.12/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.13/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.14/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.15/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.16/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.17/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.18/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.19/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.2/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.20/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.21/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.3/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.4/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.5/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.6/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.7/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.8/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.9/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.0/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.1/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.10/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.11/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.12/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.13/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.14/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.15/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.16/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.17/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.18/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.19/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.2/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.20/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.21/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.22/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.3/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.4/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.5/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.6/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.7/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.8/nodetime_native.node create mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.9/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.10.0/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.10.1/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.0/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.1/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.10/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.11/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.12/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.13/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.14/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.15/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.16/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.17/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.18/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.19/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.2/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.20/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.21/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.22/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.3/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.4/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.5/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.6/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.7/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.8/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.9/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/x64/v0.10.0/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/x64/v0.10.1/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.0/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.1/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.10/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.11/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.12/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.13/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.14/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.15/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.16/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.17/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.18/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.19/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.2/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.20/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.21/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.22/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.3/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.4/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.5/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.6/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.7/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.8/nodetime_native.node create mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.9/nodetime_native.node create mode 100644 node_modules/nodetime/index.js create mode 100644 node_modules/nodetime/lib/addons/dtrace-provider.js create mode 100644 node_modules/nodetime/lib/addons/stdout-writer.js create mode 100644 node_modules/nodetime/lib/core/agent.js create mode 100644 node_modules/nodetime/lib/core/logger.js create mode 100644 node_modules/nodetime/lib/core/proxy.js create mode 100644 node_modules/nodetime/lib/core/system.js create mode 100644 node_modules/nodetime/lib/core/thread.js create mode 100644 node_modules/nodetime/lib/core/time.js create mode 100644 node_modules/nodetime/lib/core/timers.js create mode 100644 node_modules/nodetime/lib/core/utils.js create mode 100644 node_modules/nodetime/lib/metrics/metric.js create mode 100644 node_modules/nodetime/lib/metrics/metrics-manager.js create mode 100644 node_modules/nodetime/lib/monitors/mongodb-monitor.js create mode 100644 node_modules/nodetime/lib/monitors/redis-monitor.js create mode 100644 node_modules/nodetime/lib/probes/cassandra-client-probe.js create mode 100644 node_modules/nodetime/lib/probes/cassandra-probe.js create mode 100644 node_modules/nodetime/lib/probes/fs-probe.js create mode 100644 node_modules/nodetime/lib/probes/global-probe.js create mode 100644 node_modules/nodetime/lib/probes/http-probe.js create mode 100644 node_modules/nodetime/lib/probes/memcache-probe.js create mode 100644 node_modules/nodetime/lib/probes/memcached-probe.js create mode 100644 node_modules/nodetime/lib/probes/mongodb-probe.js create mode 100644 node_modules/nodetime/lib/probes/mysql-probe.js create mode 100644 node_modules/nodetime/lib/probes/net-probe.js create mode 100644 node_modules/nodetime/lib/probes/pg-probe.js create mode 100644 node_modules/nodetime/lib/probes/process-probe.js create mode 100644 node_modules/nodetime/lib/probes/redis-probe.js create mode 100644 node_modules/nodetime/lib/probes/socket.io-probe.js create mode 100644 node_modules/nodetime/lib/process/disk-stats.js create mode 100644 node_modules/nodetime/lib/process/process-info.js create mode 100644 node_modules/nodetime/lib/process/process-state.js create mode 100644 node_modules/nodetime/lib/process/process-stats.js create mode 100644 node_modules/nodetime/lib/profiler/call-metrics-groups.js create mode 100644 node_modules/nodetime/lib/profiler/call-metrics.js create mode 100644 node_modules/nodetime/lib/profiler/custom-transaction.js create mode 100644 node_modules/nodetime/lib/profiler/filter/filter-key-extractor.js create mode 100644 node_modules/nodetime/lib/profiler/filter/predicate-filter.js create mode 100644 node_modules/nodetime/lib/profiler/named-transactions.js create mode 100644 node_modules/nodetime/lib/profiler/profiler.js create mode 100644 node_modules/nodetime/lib/profiler/sample.js create mode 100644 node_modules/nodetime/lib/profiler/skip-counter.js create mode 100644 node_modules/nodetime/lib/profiler/time-promise.js create mode 100644 node_modules/nodetime/lib/saas/data-sender.js create mode 100644 node_modules/nodetime/lib/saas/gzip-request.js create mode 100644 node_modules/nodetime/lib/saas/saas-client.js create mode 100644 node_modules/nodetime/lib/v8/cpu-profiler.js create mode 100644 node_modules/nodetime/lib/v8/gc-stats.js create mode 100644 node_modules/nodetime/lib/v8/heap-profiler.js create mode 100644 node_modules/nodetime/lib/v8/heap-stats.js create mode 100644 node_modules/nodetime/node_modules/nodetime-native/.npmignore create mode 100644 node_modules/nodetime/node_modules/nodetime-native/LICENSE create mode 100644 node_modules/nodetime/node_modules/nodetime-native/README.md create mode 100644 node_modules/nodetime/node_modules/nodetime-native/binding.gyp create mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/Makefile create mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/Release/.deps/Release/nodetime_native.node.d create mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/Release/.deps/Release/obj.target/nodetime_native/src/gc.o.d create mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/Release/.deps/Release/obj.target/nodetime_native/src/nodetime_native.o.d create mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/Release/.deps/Release/obj.target/nodetime_native/src/profiler.o.d create mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/Release/.deps/Release/obj.target/nodetime_native/src/system_posix.o.d create mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/Release/linker.lock create mode 100755 node_modules/nodetime/node_modules/nodetime-native/build/Release/nodetime_native.node create mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/Release/obj.target/nodetime_native/src/gc.o create mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/Release/obj.target/nodetime_native/src/nodetime_native.o create mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/Release/obj.target/nodetime_native/src/profiler.o create mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/Release/obj.target/nodetime_native/src/system_posix.o create mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/binding.Makefile create mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/config.gypi create mode 100755 node_modules/nodetime/node_modules/nodetime-native/build/gyp-mac-tool create mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/nodetime_native.target.mk create mode 100644 node_modules/nodetime/node_modules/nodetime-native/index.js create mode 100644 node_modules/nodetime/node_modules/nodetime-native/node_modules/bindings/README.md create mode 100644 node_modules/nodetime/node_modules/nodetime-native/node_modules/bindings/bindings.js create mode 100644 node_modules/nodetime/node_modules/nodetime-native/node_modules/bindings/package.json create mode 100644 node_modules/nodetime/node_modules/nodetime-native/nodetime_native.cc create mode 100644 node_modules/nodetime/node_modules/nodetime-native/package.json create mode 100644 node_modules/nodetime/node_modules/nodetime-native/src/gc.cc create mode 100644 node_modules/nodetime/node_modules/nodetime-native/src/gc.h create mode 100644 node_modules/nodetime/node_modules/nodetime-native/src/nodetime_native.cc create mode 100644 node_modules/nodetime/node_modules/nodetime-native/src/profiler.cc create mode 100644 node_modules/nodetime/node_modules/nodetime-native/src/profiler.h create mode 100644 node_modules/nodetime/node_modules/nodetime-native/src/system.h create mode 100644 node_modules/nodetime/node_modules/nodetime-native/src/system_posix.cc create mode 100644 node_modules/nodetime/node_modules/nodetime-native/src/system_win.cc create mode 100644 node_modules/nodetime/node_modules/nodetime-native/wscript create mode 100644 node_modules/nodetime/node_modules/request/LICENSE create mode 100644 node_modules/nodetime/node_modules/request/README.md create mode 100644 node_modules/nodetime/node_modules/request/aws.js create mode 100644 node_modules/nodetime/node_modules/request/forever.js create mode 100644 node_modules/nodetime/node_modules/request/main.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/.npmignore create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/Makefile create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/Readme.md create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/lib/form_data.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node-form-data.sublime-project create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/.gitmodules create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/LICENSE create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/Makefile create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/README.md create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/async.min.js.gzip create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.css create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/dist/async.min.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/index.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/lib/async.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/nodelint.cfg create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/package.json create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/.swp create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/test-async.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/test.html create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/.npmignore create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/License create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/Makefile create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js create mode 100755 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/common.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file1.txt create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file2.txt create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-callback-streams.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-data-size.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams-and-buffers-and-strings.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-max-data-size.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-unpaused-streams.js create mode 100755 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/run.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/package.json create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/test/common.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/test/fixture/bacon.txt create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/test/fixture/unicycle.jpg create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-form-get-length.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-get-boundary.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-http-response.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-pipe.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-submit.js create mode 100755 node_modules/nodetime/node_modules/request/node_modules/form-data/test/run.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/mime/LICENSE create mode 100644 node_modules/nodetime/node_modules/request/node_modules/mime/README.md create mode 100644 node_modules/nodetime/node_modules/request/node_modules/mime/mime.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/mime/package.json create mode 100644 node_modules/nodetime/node_modules/request/node_modules/mime/test.js create mode 100644 node_modules/nodetime/node_modules/request/node_modules/mime/types/mime.types create mode 100644 node_modules/nodetime/node_modules/request/node_modules/mime/types/node.types create mode 100644 node_modules/nodetime/node_modules/request/oauth.js create mode 100644 node_modules/nodetime/node_modules/request/package.json create mode 100644 node_modules/nodetime/node_modules/request/tests/googledoodle.png create mode 100644 node_modules/nodetime/node_modules/request/tests/run.js create mode 100644 node_modules/nodetime/node_modules/request/tests/server.js create mode 100644 node_modules/nodetime/node_modules/request/tests/squid.conf create mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.cnf create mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.crl create mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.crt create mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.csr create mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.key create mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.srl create mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/server.cnf create mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/server.crt create mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/server.csr create mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/server.js create mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/server.key create mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/npm-ca.crt create mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/test.crt create mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/test.key create mode 100644 node_modules/nodetime/node_modules/request/tests/test-body.js create mode 100644 node_modules/nodetime/node_modules/request/tests/test-cookie.js create mode 100644 node_modules/nodetime/node_modules/request/tests/test-cookiejar.js create mode 100644 node_modules/nodetime/node_modules/request/tests/test-defaults.js create mode 100644 node_modules/nodetime/node_modules/request/tests/test-errors.js create mode 100644 node_modules/nodetime/node_modules/request/tests/test-follow-all-303.js create mode 100644 node_modules/nodetime/node_modules/request/tests/test-follow-all.js create mode 100644 node_modules/nodetime/node_modules/request/tests/test-form.js create mode 100644 node_modules/nodetime/node_modules/request/tests/test-headers.js create mode 100644 node_modules/nodetime/node_modules/request/tests/test-httpModule.js create mode 100644 node_modules/nodetime/node_modules/request/tests/test-https-strict.js create mode 100644 node_modules/nodetime/node_modules/request/tests/test-https.js create mode 100644 node_modules/nodetime/node_modules/request/tests/test-oauth.js create mode 100644 node_modules/nodetime/node_modules/request/tests/test-params.js create mode 100644 node_modules/nodetime/node_modules/request/tests/test-piped-redirect.js create mode 100644 node_modules/nodetime/node_modules/request/tests/test-pipes.js create mode 100644 node_modules/nodetime/node_modules/request/tests/test-pool.js create mode 100644 node_modules/nodetime/node_modules/request/tests/test-protocol-changing-redirect.js create mode 100644 node_modules/nodetime/node_modules/request/tests/test-proxy.js create mode 100644 node_modules/nodetime/node_modules/request/tests/test-qs.js create mode 100644 node_modules/nodetime/node_modules/request/tests/test-redirect.js create mode 100644 node_modules/nodetime/node_modules/request/tests/test-s3.js create mode 100644 node_modules/nodetime/node_modules/request/tests/test-timeout.js create mode 100644 node_modules/nodetime/node_modules/request/tests/test-toJSON.js create mode 100644 node_modules/nodetime/node_modules/request/tests/test-tunnel.js create mode 100644 node_modules/nodetime/node_modules/request/tests/unicycle.jpg create mode 100644 node_modules/nodetime/node_modules/request/tunnel.js create mode 100644 node_modules/nodetime/node_modules/request/uuid.js create mode 100644 node_modules/nodetime/node_modules/request/vendor/cookie/index.js create mode 100644 node_modules/nodetime/node_modules/request/vendor/cookie/jar.js create mode 100644 node_modules/nodetime/package.json create mode 100755 node_modules/nodetime/publish.sh diff --git a/node_modules/nodetime/.npmignore b/node_modules/nodetime/.npmignore new file mode 100644 index 0000000..067cc80 --- /dev/null +++ b/node_modules/nodetime/.npmignore @@ -0,0 +1,5 @@ +.git* +test/ +.DS_Store +node_modules/ +npm-debug.log diff --git a/node_modules/nodetime/LICENSE b/node_modules/nodetime/LICENSE new file mode 100644 index 0000000..d3f3199 --- /dev/null +++ b/node_modules/nodetime/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2012 Rapidlogix UG + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to use, copy and distribute the Software. It is strictly prohibited to +modify, merge, publish, sublicense and/or sell copies of the Software, +including substantial modification of the execution flow of the Software +at run-time by means other than documented. + +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. diff --git a/node_modules/nodetime/README.md b/node_modules/nodetime/README.md new file mode 100644 index 0000000..bdb782e --- /dev/null +++ b/node_modules/nodetime/README.md @@ -0,0 +1,11 @@ +Nodetime - Performance Profiler and Monitor for Node.js Applications +=========================================== +Nodetime reveals response time and other internals of HTTP requests and underlying HTTP, database, file system and other API calls in your Node.js application. Coupled with related process and OS state information, real-time and historical metrics, monitoring as well as CPU and memory profiling it enables tracing performance problems down to the root cause. Nodetime supports multiple APIs including native HTTP client, file system, cluster and sockets, Socket.io, Redis, MongoDB, MySQL, PostgreSQL, Memcached and Cassandra. HTTP based data stores like CouchDB and Riak are supported via HTTP API. + +This repository contains the source code of Nodetime agent. Agent runs within the application and securely sends profiling data and metrics to Nodetime server, where they are made available via web console at nodetime.com. + +Full documentation at [nodetime.com](http://nodetime.com) [Docs section](http://nodetime.com/docs). + +For questions or technical issues please contact our [support team](http://support.nodetime.com). + + diff --git a/node_modules/nodetime/compiled/darwin/x64/v0.10.0/nodetime_native.node b/node_modules/nodetime/compiled/darwin/x64/v0.10.0/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..0872907849aa9035701d9fd54c20a84d8b1b9ee7 GIT binary patch literal 18772 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 K!{b+}ru`q46^N_= literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/darwin/x64/v0.8.0/nodetime_native.node b/node_modules/nodetime/compiled/darwin/x64/v0.8.0/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..426fdc98864588ecdd90a3719ca1b7f73dc9912e GIT binary patch literal 18772 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 Ab^rhX literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/darwin/x64/v0.8.1/nodetime_native.node b/node_modules/nodetime/compiled/darwin/x64/v0.8.1/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..79fd5d80c4eefc5ec8512c1fe7a93dd73a05d369 GIT binary patch literal 18772 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 Jze+Xje*ilxi>m+t literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/darwin/x64/v0.8.11/nodetime_native.node b/node_modules/nodetime/compiled/darwin/x64/v0.8.11/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..1f00fbc25897df22909f84d617a3ccd9ea661d5c GIT binary patch literal 18772 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 JewAw4{{qW*i?RR! literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/darwin/x64/v0.8.12/nodetime_native.node b/node_modules/nodetime/compiled/darwin/x64/v0.8.12/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..9c51f85e2ea4c1a7a8523502d3c97a5646b23d1d GIT binary patch literal 18772 zcmeHPeQ;D&mVXTiL&$sV1IRZyB8%6x&_Jz|{ zDjIK-YUBLZc&V)TlIs=EY<}A)G>mW}o*r|cd%TU8NzD?~9(bD5GaZJJiEoLtC{Gq-298?C8Orzs`e?Tv7I^Vw;{Pi7yvdju0^7`478pQG1u#$`-h zJjENeOR-0XVMKaj5s4)~aeJyct$cF345KYEHVfnJD}z2AY95Gpj+5eTAqntd7_pF% z?&)kv#Ehhs8aLiK(Al0xDKe#b)sYONzOG?apter!DOD^`&XoBkQoupubhb4U{Bk5( z=FalUOgdE=ON2wQ%2>3eGMzf9_^0JMOhh= zR*cq5&K3J^4Oo(uON6-Tnj8;Cg3+X{NO-}5is}l4bhHK4IB37l)0_GWlz8&=f<0-= z?5wzPQa!B?p_#AO77iQf3a?X5y9%w7-TUA-vbAs&JW%jJ!2<;k6g*JyK*0kA5B%>u z;0x9dT-J7cbkr9dooC=mtMqbhblxU_wR-k_-@0I3_Dg->h6ixn_uMEByAwZ{_3S~E zdGMRVd&>K-c9kePWM2tdpZ&d_{jHw;XYX(9YAPSNVN*`mo6}vObWZ~4*+cdRpibRC zQ2D?OSLbv;7lPF9n;5a^_WYl>2wY2%yIbFK%Aau8~Zrr7Nx72+lr@Jku zd#Tc0&bkX-x+|paLpfbvPWQ1Q?zf0_PvHlKW4!Bqn>HSuhC1?kQ1AU{zMlP~KCo@X zeiDMcca~{)#r6I>OYEJHS?0-vsOY=r+EZn7$BL-ZdqnRWJwWkb727|Do}Mk`g|j`@foWe^6OwV{g8h-Q~LQpd==CAOv{;y%Y4+sDj|m< z5+%zpqDyMCcP_8Zrfcg5GKb+o`%(OkAi5t^?+?IUzix+x@w4eBfIcvj?tNg$2u!ODO*a|!%rBdU*G1n^%3$^gC~Fdaa{k1ZL3Rb*W@Fx>C2#RNdtllcY&-d8H0E0xy( zq{^RhPXQ_;{dekisZ@VQ?_ctRS!Cc1y+j694?itt>~oUsJ7SgS*|+VK@I>*?uy$x9 z*9VSgrt@^!EvVy_jTtM46Nkxpb)-LV!`->gw~NjX*>gedhmeV2ec8TPlpiFWO9Z4q zD5vn1p&$aGN(S$+eF9;RW*6j|{kG6K}T(7j>hx*$>D;{j2xb=VRmcjlNvF z^s~$njBOX9QU=CwrWF3r*ZVg3Hp&HI`=G5BwRFvnkM^KTn$rH_)vSt0)(4(V(g|S} z0uXb&9t%sxZGZ~0m}8t8{)~GIdbY0-f;6qAyDdzknC)jEwaio67e;}Y@#%IoifFq1 zh~mD@P(gg?{m+uJeHH4mef5BSL#4YbpyVB@AJ{gS?c0DdmcoP=iO#XBy={L}sKkWI z>g>tV-S5&IdOt>8ZT7$Guo=vRL|yj9dQ91Gg`o%Kyox!+ybe-W{X1$fF9Sj#Fi0&Q zltp*QBFxI$_CHFzm+*dByPlHNWX}}f zkbNE~#Ax>6Wxy}&A{6!a(ctQ{pZP{#s$FWA_FV~fb@qdP;giv!>xI8c`$oRZdB{$| zbM|Y<>Ia^p>B9(Vo%m70>!g-oe{q=3EMoT<&dk=cBl?aPDGZ#Uav^M>P@&aRL#GOR z3h54PJB;;RjLN>Dp6T{xlpVYDgkE~}>cb~WZ<%=$*6)eZs{_L)N}FG>XGjfkmU&Ku z8BXzNNn%>9HGGx{>N`FY?zi~Kf`$3z|%c~aylky|3~ z5_z}C?-2P`k>4fq?IOQhXTc)P^s6SgFtNw{6&a|mycxR`LG z#2&)664N>IXpO{Q5WYrYIv*Y_m-th{7fAdu;S!0D68_UkVbA-7k4yY6;rAr|Pr@S- zze)I2iQgbRB=PHneGLHI?9w-G)daS!3gCC(7uEAj1w@0Ylf@Ggm?gttm;5>84SA{>!;BjIL=Zy{VS z@mj*mf$3(u7EWfGh=y7%GquvMrL9oPT36GUO0-5}c)XUj5=jSZg*r^#3?+l{P%_<) z$14>TmFZM?+|B!NSaaRa*E&}En|hL_FBVg9btu&l++vzZf1)!P3R|i?7!Gxr@itTY zj@1qmpy&_9VlAO?$BI~}jfKsK*3pp2uS#oOHC7@KOJ9p&U7M6+$d$Fj?rYP^aO^`k zw(qR)VF%RcG8en9HW!HwqQrYNkLL<)iie(YE(1^LwK>Re5XM;$_w~=wsx)kxctUV7 zROtE7@+n%;=oD>gF$7Ld)jWSF(x%XFpVym4Qx7G5rOA;DLe%3LYqUpx}Xm2MQi2c%a~cf(Hs7$oBxX1bl}E~bM__b}bd z^e|`<{5}MVzi9`UAH4j6X{V;__dM^J_KD}_Cp|xz^7ln_?}u(9MUd1{1>odw0^f?; zg4e&i>TgH}&1v+sPTeqnXIWXxf9#H73`;^3!zLO{Y2U!1HIE3^SPx9nnb^nrh(pNm)7c57aI+nP2l8;cv zhuhyPQQ-9Vt>7o}_s+kN4ZMPSvQP2UG}))_j}lMzIe8l25!OG>`ifWj>b|Mcck-nF zJ-)#?8=DOEuXv@e?x!k!Cr|p1%$D{Wtgm>bukNoZeJ4Me|L#G1PX9dwej@)3e^d5< zev!0a@v47yUsm<+nmRAtNXP|-^n}e*P;I{2&wOkzR$(~(#5~-;y-iovk_a){%Tx&i;Lgw;-7Kx zAG!E%;dM1<`!~9HL-5-nB9Ar~AD8mjRpqhW#sAR7|J21lF8SPgc-F-?qFK5SSc4Qq zYC>9zv<`{(_-3SAkZwg~@m1X2>|cBB+i8p%S+Aax;aLFz`L7e4Ml+JSU8(w#_Kk+vb>QI)nG=`N)IFJmd^ zueHQiYhiq$))Gpaxu@SbaIO4?t#Xpb5Ssr)5_XZBH5DYuJoU^$(Bqs z7O7lg#!Tut(Q;b_p4hjUR<3XUes03Y@(Fy*ckAN1c+_fG*i}=lhvJc#S=SIWs=w26 zn;EtOfq-VX9^4z9iAW}9s-d)nE5c#zYq1_(34^cm$(Iw>tRkzI`ciF~PBU($11>Yf zCxh3v^&~5+Drzdc3o9dLGF{nKQyGniW0{BvSkX=%sP|T_^aqmBSfVXs3Qx#)69Vvr zcZutr0(b-(iyIP&WaH9Im$4<0>M+u>8OW+;eCeKeI8PwVFD+<>LiAy<__mtgn&3AS zQeT@#a~%r5dY1(A-}V^qU<}>6IGFbi$b>@m-o-bEVjccuhTj}%j7A&9ba@w#6*eHc z;o~Y}Nj)tf1YVUm_=`22rH(KyzH@-brpR>!4pp8~I#fT*m9hv0U7qGN2{?DfIt3=IL z48X4t5ped|wlzphJQp-kXWU^XoyFY3o?wZeX&Xg@wBvZI#+F5OEp~Iu40O>{i%RcU zWy-sV)}LHf2o&0*oEvvg{ObZNo`#^;psjq#x=<`*@@g928s-IWc%8kuF9sQ6JW}3;vx}sK(AA4>p5fj_Ea7UiTc;7D;@3&d_2t92@!|6QhtJP-J zWOgQFAmB9XB(oq8D$!|9^& zOm^-JAShK(R5xTgTg;U3L?l-zFFY0nP0KaSIp+vp7~bm;9QcPHR*%m@$hTy$U~-Mf zMIe2=Djao{FNN=e;{P@T8XdLQQDopho#0}?v}jPYx^inUzc!PCudMO4)zY7iiaNB} z#-q#`k~_&QrhZ%lRf{JOh$3>&u!xtgjYrJZXxxl&U#nc3h<7nY(UeHmCbq=aBofM2 zA(j{M-bE0kGjZCV$mGT}UXH>`oUr96guo(-x0R_-vON%KGlc~Hjfm5t@e*Q5O1DnX z#!_Lm=x0J1su7DUXvSKDh}(%f6Jph9%ioU6W6agKv5grj-`pJhzEs(^S zhei@L%AA11gRZL~F&XukR=GBugL6xg$!e!*aCzM=JEMS}T4SaYnN-+3i#-#0LN0G_Rb5&QN)A2}YZQSH-_nU?jB6yk_G^UOJB-#) zG?rh|mIk+hjsDw7W3ePMzYF2)kAkx-9j;9?zXCX|U;bSZ@kDHPnEF*ByPhR3f` GP5U24_KUax literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/darwin/x64/v0.8.13/nodetime_native.node b/node_modules/nodetime/compiled/darwin/x64/v0.8.13/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..98676a292d53fad7a9bd3933cbea54ab30ed6721 GIT binary patch literal 18772 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 GY5xPN`is2) literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/darwin/x64/v0.8.14/nodetime_native.node b/node_modules/nodetime/compiled/darwin/x64/v0.8.14/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..a447ad56c71f2485b0fe749b77d54a29dc1128b8 GIT binary patch literal 18772 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 GP5WQU@r%m< literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/darwin/x64/v0.8.16/nodetime_native.node b/node_modules/nodetime/compiled/darwin/x64/v0.8.16/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..e40a5c79ea7ac349715ebb6e9438e2ffa088ef6d GIT binary patch literal 18772 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 JewAw4{{SGfi`)PJ literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/darwin/x64/v0.8.19/nodetime_native.node b/node_modules/nodetime/compiled/darwin/x64/v0.8.19/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..fdb4509ef20f16862f871479c855e098c45ea30b GIT binary patch literal 18772 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 It5nne2b+_N;s5{u literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/darwin/x64/v0.8.2/nodetime_native.node b/node_modules/nodetime/compiled/darwin/x64/v0.8.2/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..5d4b15766b3c6ab5796c4d0daab40beb35d63068 GIT binary patch literal 18772 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 IM=6f~0r>EX8eSx1vUI>GACFG=OVXy(-FCkY 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 Hsiyr80k4bW literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/darwin/x64/v0.8.21/nodetime_native.node b/node_modules/nodetime/compiled/darwin/x64/v0.8.21/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..aa0503121ecfb815e2818ae63b60497050b48800 GIT binary patch literal 18772 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 IU!|J%KY8Da=>Px# literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/darwin/x64/v0.8.22/nodetime_native.node b/node_modules/nodetime/compiled/darwin/x64/v0.8.22/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..7e4799bf5b7a4be54f6d66504d9212c5e27cf04a GIT binary patch literal 18772 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 IU!|J%Kl4wE?*IS* literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/darwin/x64/v0.8.3/nodetime_native.node b/node_modules/nodetime/compiled/darwin/x64/v0.8.3/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..e865144b1497f8cadf56d4a49eadfd912dfd591d GIT binary patch literal 18772 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 L*YNmJisOF(r6-H| literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/darwin/x64/v0.8.4/nodetime_native.node b/node_modules/nodetime/compiled/darwin/x64/v0.8.4/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..a0416ecb20424f6f8ccebb49682bf420d13c0546 GIT binary patch literal 18772 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 Ik5U}}10bi1{{R30 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/darwin/x64/v0.8.5/nodetime_native.node b/node_modules/nodetime/compiled/darwin/x64/v0.8.5/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..7abb624c199bfcaf0bd6cc5b93cca292b93bac70 GIT binary patch literal 18772 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 Ik5U}}1B9%M1ONa4 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/darwin/x64/v0.8.6/nodetime_native.node b/node_modules/nodetime/compiled/darwin/x64/v0.8.6/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..3bef9b22bf82523437a1518083752e42a156aad8 GIT binary patch literal 18772 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 L*YNmJisOF({N0QS literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/darwin/x64/v0.8.7/nodetime_native.node b/node_modules/nodetime/compiled/darwin/x64/v0.8.7/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..9042c2dce7ea2c60cb4d856cc2b213d4957acca0 GIT binary patch literal 18772 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 K4UZqCIQ|EXIgAki literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/darwin/x64/v0.8.8/nodetime_native.node b/node_modules/nodetime/compiled/darwin/x64/v0.8.8/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..2b16c66b6cf61d79a2c8a67fb0ed6cbecc364127 GIT binary patch literal 18772 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 IM=6f~0SLK_7XSbN literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/darwin/x64/v0.8.9/nodetime_native.node b/node_modules/nodetime/compiled/darwin/x64/v0.8.9/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..e0870a1730a754d356ded1a2e345aca3abe54d1c GIT binary patch literal 18772 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 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/linux/ia32/v0.10.1/nodetime_native.node b/node_modules/nodetime/compiled/linux/ia32/v0.10.1/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..727b0b83bbe30a1207a968e78c059c8a074108eb GIT binary patch literal 18457 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 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/linux/ia32/v0.6.0/nodetime_native.node b/node_modules/nodetime/compiled/linux/ia32/v0.6.0/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..f62e0d625c36c7a71d5931a3479b8116b51d47a3 GIT binary patch literal 18457 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 j3*(zGQyCp!1dS)^%WXvk>cs!Ypm;NT@wrZe9J zP(hCK5GVdo)g}n+LY->SO90P;ein4r)4*9tcUyHP_;vN7 zjaAdSer-k?(4eac8mp#%0Cb?|6)k@?=yv<6p^KIM0VJFWSc=-#xkhB~>e~O%i%;+V z&VSrH`_Db!_{59JO}j{2Wbs}G$gprk$@3Alb%5&`Ybyain|8jP;;o#8sM_wxb-4idC z-~9M{eu?fy^Oxpx@{i@7o>YTjszobLjiB!=Cpzcmi@}i0R@NfODJFn!jAk5<5YE@M`Q!kVX1_jK>E$OQm=z|4rc4 zO%j#(ThPA@IQNUo#oNXE0Z(J^{Glbk7xJ3s2yrjkDeou1NB;r(0EvIcA@5$a`#{fF z{F?wDe3uY+SU7$96)HoSA>Jac1f2D5i2^SZKZf3#rt$HJV6bl>J{U}yp`;lMiePjw zYKq`y0Fc7lLOcw`q8~CuaOF^Nwb2(%nMN`Y3#C#D?)>jn9<(Z z9jsr~`#~dYwzjsCp(i?EtiF*fOPZ5?=>cQVOp(AAfBo|GVAzbt2YZZxL@Z<)3p^98SN$iql1pSM40pB#CUTH}Q8#C0Z3Cokj>e4SgiLkaW;}5bp8B597Gs4GN^}o~5~=>U zdA_8EUnfPFU`UzKa4O(0_;1152LEC>wwR%{ z3+{6EY8C0BV8qxQO2^D#EFMn~zddcFjo{XJa*Ou4nh+HY<5RJ?eb6-ejHGOjif||v z>kWms1jBK(Z!-%GmXroP(RBfEIwo&CN~5q-#ZV#8ARrR!(&6Fvt61y~V|w+lZ$$hm ze!s6hr8O0~q@gVq@0F`(wXxYq8iQe@wTn(^h{E0^7M3=`GI()74aDz*Gift|vLI0t z>y^|(JDk73-yDgw1zHo)SiCQ7uqXY3g*3#7Z42~lPZ%7(e^FaNQx6Y88$B5!M_k4 zI^YjwNWm~Y5o(swNldI|^+am@^^g+ikH#Y4vyE^f-UiLusy83Mf81wDKNdT71m!}8 z1}ArXo3wT@+xAz~c_DX-i}#&qEhyLf#!d0p!P1_1q9wj{aCJOBK52d%Q+^wvID3Fe z_ZP8o10$F6y`(Rs!EMP@i6E!OrB%nnu6sV2rj7g*Dfp^`_$38b-{(Tb?U0<{9jxm$-+xb+vTR!S`0LAajP9u7q~9m zIZpn^`^pmWC0y(A`pt)$dS~=4yh?k?Y{l1$YgF>T zV!^-Qnwt1;aji=DkvR(T831ullY%oXSY^Q(xK?)63-K!KAe;jEgjH-02yuq(fbU~F z;1yQ_qVLs!C2tcVXTft89KiV5e%ykqFn;3mNG}!Q3l^*(9r(vA_>u*C$&dC9@+}nN z-z`{6I`I1}SV=zMyDYece4ssR!JEj3`eO^uCm)XQx8NS|xf+G|6X9YZ`ayHy=HY3= z8-!R1J{KM${3rS0(?1d-a9$&<7GfIwQc^C&HH3IZlO=@Dzh}Wd%nR|qTCn7u3jZbP zc=l3(8z;i+Ech7<&W3EZzt4gR3x3jqk6Cak;-LgLpwF=%;FYkE@N%|K7vd1%dxTg; z{eaI|@OOw4;`_-Dcr$Dye3tz0hCQSME~UMI0`p!nAJ1AW_*O#P|5Ot~=8vc!@CDih z*vWP*$xVcyeb$0IsUNsW`G5~wa3$>k{z(hYr9Hs^%YrHPzfOoxu|MFQ><1VkKVTX8 z0RPQ`A0hu-AwEZbz`My0I7EKHE6E4=BMaUDT_uS1c0%j`ea!ZO4Q^^^!vYrzi?z8BAT2)(#pCA?OMFB4*C`##|mJpbZ&@KEVV!pnu& z!f{myG4_5uTfwuBQ-pY?aGG!d?q!=0_e%wCnuWLwbT=W|yECUeV`vuZcO3{oUM_Pc zpU)4Enp4K0Rg68)pNeuAa?rE>02x)uKZIZq`3JZMvE(1XU_?I;Po98;`~z^B=qLH) zQJ{xmvnu092lkDZHQ8UU?H>CESau!w0p>k(s`6t$#C!^ozAcwIr)(7Ab!8=6{+(%}BX zgxn3eKn-LRR+(D1bFBqfioPHW z;A97kA9)yOBRMYfZLrkMahwd1AonviJaw4^$b5=u{Q&wa?9O%)^?AYW^TC$KHSUU=GMBQsmec!{nCT| zQ4aS34y1Svs_gFckJ6z%-m3FDag?R#i~t-(s7Pt(`GRL3oL!}Dm|z#pUZ%~?9Q0++ zBD^1U!$;EJ)LjS%Xq7J1Zdj9j?B=!EpCbx43?ISp6BWBRBD`_}?qFOM#Uk(~IkpzB zmnWE3Mrn&|>5+lHg2!m)f zCT?yiYL-z#VWK7+;i=8dj$zmx7%8+ZQ*n0$=kj<+> zVeOyrl~1x_L27nr^6Fz1trdGejIRFt=6&GxGPpB`U798Pm_CARxw-+1RyOc1Yg|2q z*+UeA)^%3v2HC0uvv_%dwGm#2QEJ)Rr_A!(_<~oH)$_v{Dz_)#p4<2@wUh@^wm5*$4XFxml);b2e+Y6-e_-@Y5o5V9%~oyD>JHl)!?M!?eyL&|gCr;N-~gl2c+?bqfrsd3p-1 zdiIF2Ywqz!(davVAI(h#A$^ATSvbKK?l+&nz4cfrL}b*xC7(o!a3bA97*g-|gnYre zw(u$sxc#l2FdZ-GL~ZT-R5Co@`D8O3c0TMBTh!Z~=2%Q0-V{o1>E3D>i9mcH5el2S zy*nHlG6wO$b(Ps~B-v_z6=X3R5wWE+UQ9}fp$0P^kEP~eSo0FozH&)@E9TXsYhPQ=N|;V4Y%me1KtIA7Vs>f7xZm^%;$Ru z|CG<)4|o>0ttSBQ`g1<-#t!<~zvS~iz-_tY$|53Lri9Uj;0GPnCK z^s7c2rbx_$ejlJH_be|jTUjyPbZ-;yzk2C)3%qmK-b5N~` zWyT#S_mzITq`VR>2S7U1T<$(x2{se;6R+g+?7~umdKW9&5^T_NGNlkv(qCSN21sxp z#&-oEKaBb_@ZJtP$-9R-$=g-(+_VDoq2;`5sY9i|s{Ww-RghhuC{L6QxXNdu1tyna(4NCE z{W0{dMopk!CFY2i)FM#cv?AkPac9YjJ*6cE#&_rdeQ^(Xc7TW9Gk|B)ip-Q1d)ytv zC3lvV{A?Ozfv*)dHi0|}o=uo*etW^O4bvBvJ)aiJaEYamppLE1D8DT z|K0=qjvbE(@*IeUJm%#J->(ziV?n;3#~UPZ2(S#0-&ykdmfu(6fw26Z9k0aX_u+qd zEgx?{XTB~vfge6}x*s@Rsfkz7pVuF}F5}a|GkCYfOCI77iSI-Oz7)lEE)X6+g7;x~ zbt+D{g}|$7`Mw;l?qtEGZ@eFL*dC`0T;j%$!$@2L#c9(UDg5SMmp{UWsqm4fN%?~9 z+c932PXppU;eFLLYkKkBR(d`@l?o-})pfP?wF~F@)3R~VwF<|p!PNEvGt>)cCKc@0 zM}u+GsO=j}*Y>9Inbf>!L`bYZlScGr|4{dTLDd2!@hLe4cNfsG5&^04rXN7mC(PUy+YK;EPaJ zc|T-vYQB9oK6~zp#a8g&7i@fA_X@!pp>V5cd0zoevrAEBt__@`X=K&M5965jk?(n| z{pZ0)|LdapeuxImcM5!`CgFS3#&-sMXC~2$TVOe7)GKp+z;_zQS|1_pIEt$E^1Fbs z`D*_~vn=FeeG*mkaZf!1K1^|;Xujh%KJIHCALg#WHLm}8v{66pt8PLCUnP!pp*)t8 zsMHIxEabb+Iwl~Em3uj5>9P`hFKYylJS>E^=@bVS3Gp#(5PXJ#LpfI3!8K%;*Kz}V zz=dHIEl=Zi$bE)IWpk;$MBz&F{RO(xz`a4y)u_1#C|nV^))mfGsMfT?xwEOYt8f)r zI!B>YjzXx`hc9sSH4*!t1Fj3BsY)#w*+hIPaC;6>$U)CK@W&naD>l3u^7y@> zF4Z`=(uPyt4Gw&x13zrT8Qss=aQ1)AfzLpo*mH(v0Y43Y=$xe`z~?rpcw$b}GT=>f z#&ei90@sD|2W>d@XKXm>-?HJPAGYD7d#t?&hjRbzci_Vg{5uZ(W#IOlt#Y+RQJj>w z+JS%Af&a4ue-yYqN9#8Zx<_q!1^Kfb_(BJMivu5W;9s@j^v{oMIQ{d41AozhSE?L!U|{4eF}fZKD*ZgKE`+<|}1fj{NI&pB`(PE|mF)Ac~ls@1`c_U;~L+XY*Su$2KDDH0F%$@HP1y!{A<(%S@X zEs!T;8j;$1|Dq*=gkUtX4OqQjsJod+dSGC?*3;VABGoKk-F#DPP-9f1kH@vhdmX8z zFI*djske62bs|5jYY7sxn3@%2zF!BDUJ7|eGVkv~$wjgQQjTuwIkwv1<_bVZ|GGRx4JWrWNUUvN=J9I}xn z=nEE-!k8zM+KzO_fnXw@if)sFEqhiiU*6r?6YObT*3rs&ilpMfewpB?CrvvrTHjD# zi(H0aA{;dP(}P=Td$);T%PpPFH?;>Q&PTauqKPf>!~Z&R_a@7woH*Czt`Qu+Ndprt)hq zmONWn4HwEGb!Jl*(rPSAkpbf?grOq=Z^DEodyi!7DbjB^r+DIA$Vu`QC(X%oEMn%IO&AivTbX%i|6t+#1mg3T z0>wG<;1EC)B$?_dD@tsYw%L*iC(St2z0c3agtosaFSXM~=Id$2jRfM=1Kw j3*(zGQyCp!1dS)^%WXvk>cs!Ypm;NTSxXhG99t5X^j!VC!^NLmvnAp~PgNk9~In9O`hrc7qy%y$A* z7QrFd*=bnTy4@bzt@haV*sZ&@tzBvBcB6@~o}RYW9(!oDls(!uR9aDJOLx)P&*#1G zn|$X>0@l;|&+>BK-0yw&zI*Sx@4ol_d2@G5`wExKC3Gnk#e!J*=yv-mp^KIM0VJFSSd7}*u|}L){`ChVclX6! z`|r!zezWDxC-42)hrdYLVvF}eK$hJlqHT`*>GTozv~{E{LtT#gle_mcCekAp4m|kA z6W@OMzU|9fUO4v4;kh**+j05+Yd^Ai@1f8CyyVcG>ng6!{qw1j`mw=p4ZmLcn;*Yc zddu@4_z}7nls`%*swTKv+^d!2nD|c>N&XW5E)BH`@r5NCQ~VsSE|oaAP9uQCpL6Id zb@cCb(C66n%|!pO!@f_^$yT8~CWFB$#P71nXa9B?REmN0n1g=E(SMs_mA~ZA*z6&` z$)W!<4*Bo1IfVQdIOsPz#`_+}_?A2H3my8t7c*hw9mo+FAn;+gMOuh-f5d3+SB2nZ*`3C%MSay9rn$2(04oV3h2<~Y8=?M zGPxcOIrP1Z`5k$m5RXI7Ofg;j5O98@TJx8R*c7z0VMuShr9>SUI}{I z;@=3k^KXQ>$HM8;N2m;CrnpF40XPo%EHlLn@m=VxYMdC42n2fjnT?*x0+xmOr(U#5|L-2q!(i%=pmtnR{VV5)`;9Js}hz}SEb6b-Mc|9r9pdm~A zool9Y!jh&}Je-Oeus*isqn00hwNiu$hNKw@CH=m<{}!#S_bq{A3mIBE z;Vx&d7LghZgpEzXRMZSaY}P(k6QZJFVk(xj#Z05uNXYhx2nD0j zo?vKmAQVUYRx{sVNvYQpUF!#@WAY}VGy*$S4CMn20>aTw9UeZPip8!FrdJR9M#Qh; z_j%irT2p~b>RY4n9=Uo}8=H)T5epeDopefl1okGdu(T1D!AtyVAU-dgNt+Rrd5M}> zr=;fF;rvCurf|5`-!c%1#(Pr+d(tmhNP~>nR)6=l0fXcBEpGK|>WXNvH`&sHp@d4^SbLgQvE&FT!(4mWHK^D^R$ygV0>34+^kpXkHk&LGjA>-^Fd^PCM z4u2>^@`mY&P_vXuU}7z+CsXUIgA{*XBpL>vZG@BY)@#-lz4`cj6Fy7$u-LI9C>Js` zIJpzsq_vCLw!ebTHQXuA-FLFJpj_{rFvV93OS|I(&G9X<)$#bmr1@-2bh`W;Bk)|99gI4y_oV7BR<<_#e3FnT%h`Ei+CV^c$A0-7n;Wd- zU%HL)Tqbos3u45gjo55=Jmg+)F&9C;=lJG=sP>=}9KlC5s3cv9O52S+*f zr~c!8Ws&#-uJw5R=0#1uKXMVT(q6RM$|I3WXw9#IvryKMMI&y`yAN2Ac-^A6;=+%I z`z<){Jqmxog41U!e7gm&n4|FbS#XyHziL4*u6Zf1&4L>&xYdH6*7U0s-)dZ=lK*83 z{s!07#Gk;mD&bAICMD!E0K$?+1!q~X!h$n#t?a53;!W5=I1Ta%E7mkE)z;Aso?WBhDCY{8o`e&P#AFBal+7Azwj_)ZJHZowY%qrIJcHA4J{ z1*=I1{-6cR$p?Iw1virqw3jS+6ZufTYr%!&!|_8F+yg#WgAjitTp~mtXfE75{FLxR zLaYLx3l9;#Pk#9H4}=Juw+JhRxEOvZDivZbA)e7>2;uW5EO-m%h4`x$d;{}C{70nY z*~_2cPr_Nafg;>#!DH`N_;l!Cdy@q>TJUogya4e~gd5QBvmfAVYzMrQ?bC%gK==V6 zZlHd^A6xKev;+7*U`&J`giVAmk^dUZE9rpO(GEaCI~U?viv=$s#QjetA!L4u`T@tN zAFzY%SdtqFLHo1?W7H44kMaQ@wcs_h1NcS@p0?l@XcyX(?0+rhnf(FpVn4t-@&UeN z!F$LL{BOxWA8|>3z&+##Y$YGyuPpcp@&o@MbQB@hYY4FeJWD!YoOHldY_Ad`NH`b! z03l-FlZ5cm*Env#L&UMUoFH6)=N#0}SfqaJgw2Gg8wn8um(sr%3-J*`EYO{VE+IZa zh`D%_5M$X-I0NgLut#?dU+?;7<(UN(I)m&*-} znA66gRgAyFpI^XX>9LaaqhwSi_YLmPxrez2vE&}cU_>7ej~;=9+{191=p*^)b3hNm zW>qGRM)ysWHJM+o?Hd1AuaMN2k~ zg)4@?ar&)XZupa@@H_7(PrX%?{+(;-@nq%jzq5CG#Fde3x%<=PP<@sjPyFgYn&MsQ zvGVnI+&&8ZUE^4nP`^y7pOyWjpw{Qj%d_cIO8@j>*_N5*$vu}Io3;M-(QJiBjpCNI z@MPui22VxS^msEBo`cOEdPD$99|6*1Vw_`1A9H7$Jr!WfpgG^PT{f`?cyjFF#!}6b z*<-t>BvYFgp6~q^Q+Uz4t?<%!Tj88{Tj9KSTVeg%RG1#CTz^ME#qWvH;m5HJVmUpD z-A9O95YC>1ZV%Up48U*U(^j=$Mc{(0bRDA5P`g^kr|4Yhgw9i#h(&ADfo z`zaW3v>nD<(|~cAm(eng<7kisxu3D=Q8sn3Y48j=Nz&XCa-442LHaA$2w%NqV)Mn3 z+`qh8)6si}9Vw%|%CGg>14mZ2j4NVok5$u;G z*dOI^AC?X&n1c$tJAET`Xt$^0j7}V7F?u5aM-VDf8hXB3vJcL#&^Ao6i)Jp=W~axz znNtYwr`_<8^fz_q!vR{Q3$+v0WS+TYZRQ7v!VN>uV)z4PyH_B*vSPU1(}_v-@I=xg zpuS$t-$9NIXBYR<|4N;J%jRdgJ?^}2E8gVxUXQ4rEQA<3YG4(fpJRRGO>2fQQwjr1 zjQx^4abA#65Uh#Z)gOqRXgVS zUfi@V1IyE+E=|I0awEt*l^GxZGNNqR22WM$#q`()%*5@Zaw63Jl0Mdeu3iQkG}U86 zslcFXv*twLK@N<`FX%&vTx|&q%|`*)3Yu+0%UqymBy&6qZIE7zxvfu+H83pXg0l8I z%scF9mosU4IvLEct2-0*tjk6{8?_v#L3-R)D1t0c@;XA{j&OEWN#@|tvpd?d%k8V@ zdP!T36}00n3@4oJbR&djLqY@MPUumAYj$Rq$M<~ZDa=yCc=wyRoTfRHtJzXhk5JVn zXT~w~b_~4}L+{35)?qsG!?(-en%K&%1M6jt+z__I4;!;jdhUlsa7}~ew!7gN=0)pL zZfGDGJ>^P2)8#u2!2v%67lRrg+KFZ_D;xi7Vpl-EPdleE6nT_m_cJ zU$*z_;Diod{RwNogrB^UmCMjNvp}6kAFG%x+Z#q#-)}eV1Fr{@Yv--hyqSY=b+fhK zQiojU$5SWRDgBHq&u0rYYvh<3XjQAzJ|CK#UsP(f>SozXtFZ1#T7K1wgr!Is@E8`5Ljxrrch?VY=& zUGtB=fOVnwazc4Mfsn0Y;Oh?D=MXmqOLS-itrc5aUj*&YC2o(5Rv-Zj94cZ`FUeP*RbEr~Ukgs;a=S*a$31Q~ zeVns+Dre3a{ss^Ab;;T2D+(xMLt;+p@CF4VNkuV z6Y_=W+Wf0I;P$t0!gRcF6V=rVlZntm=ab4%$ocS6Y*ue;nxavCcvCR3xoeAI4EW>y z1Hq7~+q*)+K_i9-s5hH^MuM&OS34H75f+;};)SH77_2wr@n~`ZhP7Zoy_2HTK zf~57PkW=X~+gw)_FB`xi?x4k?VHP_b9>F@|V{9dhq1Em=`IV^!I7)4f&PaOJXV7kRE`dn2kBw((uNXeuqax2UOf z#-8G)((<(1U+OLXT2W~^T1G)S&{XO^SPnK5^+`kzyRcNDejIf_+6LI5<)n)tqNuNQ z1{xs2jSDH>V?2&}8oYPHPV(-dPV#mZy?k+=`M?U^h18+hWZ}Jqmpb8V!_qxegr4_uyn8U-S?Ov1(t+YNuF_d(fypy4 z=#qml{TXztL>)jsFXkwXW8p7tT$y&SytioOp5h_{<2x`)U)&F#&w_{FCxB<;%Jj6A zd))0qMfVmLJ$Er=fv*iVHiA3?o}GB)z;7uywjuh$vZqPev(Ht$x9H+CE%MVp^e5xv zG~(kP96S8k2Y>pN^AFH1lD`)G8~!(!d!UeiMd?0Q(GFV&IRWH3U(S2rya&#E;JgRU zd*HkW{@;0k-?8ISL5>60kjK2d;rn&M`z^@#^QFKK0L}p9cb2>!=J%C&AS~ZyeqWCf-DUUa#;vj!y?q;@uW5TOP8ql)jvt1RxMYgcrgu{K&Al#vfDISGMQ{_#>Mj#E<|;5TfZ6X0W=c| z_UWTo+%&3tW2x$%6h4z$5D5#3^#zlCqB^`ShMo$V2}Kz+5=neCT7U#VOBhk|tAl~4 zDXQi7tkv@4z-swbYjq+nKO(6%`U0C0_2uP&RqDqiR0x53Gl{(5*r~mU~b&ANK%Oyc*9Jt(U$cpY*{s z(80qn>Hk-- z_Fn-X{jZDW`wkj3-!bqVn}Y9Y8{bLrot#21-#u{7s8{CtfbTetwLU`H@f@nw%kKil z7pnai&9ab>^#xST$368V_%Ox!qWKQn__(i?c=1dk&o!a{6|_-5?W=4=1z$Oib)h_# zqo~vivMl7g);cC2jg@;jW$CgCd~aw3kUT7ew&@gOi-p*U4T8@+a45%0JGh4I@|r&c zA8=t2vb)PJTCX zNH{{SLlzgJhI@*(&xI?2D&X2a7p@2x6JE<-McDao1kQNn6uO}AHb4(>&K&VRz{hO- z_Bf$_6ZCPL{$0Rdnu{M4mnai|4`|o_8Q_myO)BGdy7-zpl)ses1djNooRLNP_W(zL z4_NqVK)zAuGc(fpY>V?x6N%T_45YkP2i^tzF`PvC+>895buVzRKMhec3v-5M13wOb=$xgcz~?urcw$b} za^UtHraOS^LisTpPW@>cPWo4EIOzv%IO!$U-h)HA|MofXAqW0V2mS_dd(Kv=+M*~< z%3JNg?{eV(ZqL#Bm4jZQw!FOjs~mWZ1HaXQ4?6HK+i?2lNgGc8{MdoN=D^F< zmYcVy3V3CsL^1x?bG5|r&LfQ`=A7N?;Qu=Z{uKxQ69<0UfqQYH^4jz*=84NHw7<)N zZ+75&fmbz7#M^@o`r{7#r~`MaQ;O6`eKUdE$3F+SJ%?_Qji1Y)1NaQ+=d}cL_zWAJ z^6qiqKLoDNZ_L3Hp@f+N?-zrGkV&B)k<^olmH{nQ*GVf1B3R($Or{tXSQ2Q%gW&RHKh4 zw8(oMsiikm9fGO1wbynaKdW;o6113_6=1$!JCa`Vc}6nt?`+9MvIA0%bYfCda$77^ zAh5Ol=H*T8fj~0V6KD&Bti&bfOEKDGy{1Z7w)tvr2}UlQ3+E}Ej0gH;f}@@^ z?Z8M~eO)zj83F^LfZ3OdZLaRwDgw>7b~N48=AS$t<(!Eow!{zL+sNIUDwlHdT*tpm zx|ky$#hC`;$SR#QbyOu46{LzxovCxSl$3nN$zM6Oh#7&6jWVyq${^86X@%A~Q+r^a zBbQC(*PbhRHoqFqmP6{yrp%|+Se7CK#+wgAM*`lY2~GAS9fu4IB)@vzNlN9rk@8!Z zoM%s=lp*Wzz&TP7-*NWc+46ejuBlR_-*Hayv#IJ?9c<5V@C986Z?P+bdy{+u;NyFgWd9D-N73XM@{65DjIa`u#p{z+V3Y}v; zcNQ^I`mA$W!P#LVkSxXhG99t5X^j!VC!^NLmvnAp~PgNk9~In9O`hrc7qy%y$A* z7QrFd*=bnTy4@bzt@haV*sZ&@tzBvBcB6@~o}RYW9(!oDls(!uR9aDJOLx)P&*#1G zn|$X>0@l;|&+>BK-0yw&zI*Sx@4ol_d2@G5`wExKC3Gnk#e!J*=yv-mp^KIM0VJFSSd7}*u|}L){`ChVclX6! z`|r!zezWDxC-42)hrdYLVvF}eK$hJlqHT`*>GTozv~{E{LtT#gle_mcCekAp4m|kA z6W@OMzU|9fUO4v4;kh**+j05+Yd^Ai@1f8CyyVcG>ng6!{qw1j`mw=p4ZmLcn;*Yc zddu@4_z}7nls`%*swTKv+^d!2nD|c>N&XW5E)BH`@r5NCQ~VsSE|oaAP9uQCpL6Id zb@cCb(C66n%|!pO!@f_^$yT8~CWFB$#P71nXa9B?REmN0n1g=E(SMs_mA~ZA*z6&` z$)W!<4*Bo1IfVQdIOsPz#`_+}_?A2H3my8t7c*hw9mo+FAn;+gMOuh-f5d3+SB2nZ*`3C%MSay9rn$2(04oV3h2<~Y8=?M zGPxcOIrP1Z`5k$m5RXI7Ofg;j5O98@TJx8R*c7z0VMuShr9>SUI}{I z;@=3k^KXQ>$HM8;N2m;CrnpF40XPo%EHlLn@m=VxYMdC42n2fjnT?*x0+xmOr(U#5|L-2q!(i%=pmtnR{VV5)`;9Js}hz}SEb6b-Mc|9r9pdm~A zool9Y!jh&}Je-Oeus*isqn00hwNiu$hNKw@CH=m<{}!#S_bq{A3mIBE z;Vx&d7LghZgpEzXRMZSaY}P(k6QZJFVk(xj#Z05uNXYhx2nD0j zo?vKmAQVUYRx{sVNvYQpUF!#@WAY}VGy*$S4CMn20>aTw9UeZPip8!FrdJR9M#Qh; z_j%irT2p~b>RY4n9=Uo}8=H)T5epeDopefl1okGdu(T1D!AtyVAU-dgNt+Rrd5M}> zr=;fF;rvCurf|5`-!c%1#(Pr+d(tmhNP~>nR)6=l0fXcBEpGK|>WXNvH`&sHp@d4^SbLgQvE&FT!(4mWHK^D^R$ygV0>34+^kpXkHk&LGjA>-^Fd^PCM z4u2>^@`mY&P_vXuU}7z+CsXUIgA{*XBpL>vZG@BY)@#-lz4`cj6Fy7$u-LI9C>Js` zIJpzsq_vCLw!ebTHQXuA-FLFJpj_{rFvV93OS|I(&G9X<)$#bmr1@-2bh`W;Bk)|99gI4y_oV7BR<<_#e3FnT%h`Ei+CV^c$A0-7n;Wd- zU%HL)Tqbos3u45gjo55=Jmg+)F&9C;=lJG=sP>=}9KlC5s3cv9O52S+*f zr~c!8Ws&#-uJw5R=0#1uKXMVT(q6RM$|I3WXw9#IvryKMMI&y`yAN2Ac-^A6;=+%I z`z<){Jqmxog41U!e7gm&n4|FbS#XyHziL4*u6Zf1&4L>&xYdH6*7U0s-)dZ=lK*83 z{s!07#Gk;mD&bAICMD!E0K$?+1!q~X!h$n#t?a53;!W5=I1Ta%E7mkE)z;Aso?WBhDCY{8o`e&P#AFBal+7Azwj_)ZJHZowY%qrIJcHA4J{ z1*=I1{-6cR$p?Iw1virqw3jS+6ZufTYr%!&!|_8F+yg#WgAjitTp~mtXfE75{FLxR zLaYLx3l9;#Pk#9H4}=Juw+JhRxEOvZDivZbA)e7>2;uW5EO-m%h4`x$d;{}C{70nY z*~_2cPr_Nafg;>#!DH`N_;l!Cdy@q>TJUogya4e~gd5QBvmfAVYzMrQ?bC%gK==V6 zZlHd^A6xKev;+7*U`&J`giVAmk^dUZE9rpO(GEaCI~U?viv=$s#QjetA!L4u`T@tN zAFzY%SdtqFLHo1?W7H44kMaQ@wcs_h1NcS@p0?l@XcyX(?0+rhnf(FpVn4t-@&UeN z!F$LL{BOxWA8|>3z&+##Y$YGyuPpcp@&o@MbQB@hYY4FeJWD!YoOHldY_Ad`NH`b! z03l-FlZ5cm*Env#L&UMUoFH6)=N#0}SfqaJgw2Gg8wn8um(sr%3-J*`EYO{VE+IZa zh`D%_5M$X-I0NgLut#?dU+?;7<(UN(I)m&*-} znA66gRgAyFpI^XX>9LaaqhwSi_YLmPxrez2vE&}cU_>7ej~;=9+{191=p*^)b3hNm zW>qGRM)ysWHJM+o?Hd1AuaMN2k~ zg)4@?ar&)XZupa@@H_7(PrX%?{+(;-@nq%jzq5CG#Fde3x%<=PP<@sjPyFgYn&MsQ zvGVnI+&&8ZUE^4nP`^y7pOyWjpw{Qj%d_cIO8@j>*_N5*$vu}Io3;M-(QJiBjpCNI z@MPui22VxS^msEBo`cOEdPD$99|6*1Vw_`1A9H7$Jr!WfpgG^PT{f`?cyjFF#!}6b z*<-t>BvYFgp6~q^Q+Uz4t?<%!Tj88{Tj9KSTVeg%RG1#CTz^ME#qWvH;m5HJVmUpD z-A9O95YC>1ZV%Up48U*U(^j=$Mc{(0bRDA5P`g^kr|4Yhgw9i#h(&ADfo z`zaW3v>nD<(|~cAm(eng<7kisxu3D=Q8sn3Y48j=Nz&XCa-442LHaA$2w%NqV)Mn3 z+`qh8)6si}9Vw%|%CGg>14mZ2j4NVok5$u;G z*dOI^AC?X&n1c$tJAET`Xt$^0j7}V7F?u5aM-VDf8hXB3vJcL#&^Ao6i)Jp=W~axz znNtYwr`_<8^fz_q!vR{Q3$+v0WS+TYZRQ7v!VN>uV)z4PyH_B*vSPU1(}_v-@I=xg zpuS$t-$9NIXBYR<|4N;J%jRdgJ?^}2E8gVxUXQ4rEQA<3YG4(fpJRRGO>2fQQwjr1 zjQx^4abA#65Uh#Z)gOqRXgVS zUfi@V1IyE+E=|I0awEt*l^GxZGNNqR22WM$#q`()%*5@Zaw63Jl0Mdeu3iQkG}U86 zslcFXv*twLK@N<`FX%&vTx|&q%|`*)3Yu+0%UqymBy&6qZIE7zxvfu+H83pXg0l8I z%scF9mosU4IvLEct2-0*tjk6{8?_v#L3-R)D1t0c@;XA{j&OEWN#@|tvpd?d%k8V@ zdP!T36}00n3@4oJbR&djLqY@MPUumAYj$Rq$M<~ZDa=yCc=wyRoTfRHtJzXhk5JVn zXT~w~b_~4}L+{35)?qsG!?(-en%K&%1M6jt+z__I4;!;jdhUlsa7}~ew!7gN=0)pL zZfGDGJ>^P2)8#u2!2v%67lRrg+KFZ_D;xi7Vpl-EPdleE6nT_m_cJ zU$*z_;Diod{RwNogrB^UmCMjNvp}6kAFG%x+Z#q#-)}eV1Fr{@Yv--hyqSY=b+fhK zQiojU$5SWRDgBHq&u0rYYvh<3XjQAzJ|CK#UsP(f>SozXtFZ1#T7K1wgr!Is@E8`5Ljxrrch?VY=& zUGtB=fOVnwazc4Mfsn0Y;Oh?D=MXmqOLS-itrc5aUj*&YC2o(5Rv-Zj94cZ`FUeP*RbEr~Ukgs;a=S*a$31Q~ zeVns+Dre3a{ss^Ab;;T2D+(xMLt;+p@CF4VNkuV z6Y_=W+Wf0I;P$t0!gRcF6V=rVlZntm=ab4%$ocS6Y*ue;nxavCcvCR3xoeAI4EW>y z1Hq7~+q*)+K_i9-s5hH^MuM&OS34H75f+;};)SH77_2wr@n~`ZhP7Zoy_2HTK zf~57PkW=X~+gw)_FB`xi?x4k?VHP_b9>F@|V{9dhq1Em=`IV^!I7)4f&PaOJXV7kRE`dn2kBw((uNXeuqax2UOf z#-8G)((<(1U+OLXT2W~^T1G)S&{XO^SPnK5^+`kzyRcNDejIf_+6LI5<)n)tqNuNQ z1{xs2jSDH>V?2&}8oYPHPV(-dPV#mZy?k+=`M?U^h18+hWZ}Jqmpb8V!_qxegr4_uyn8U-S?Ov1(t+YNuF_d(fypy4 z=#qml{TXztL>)jsFXkwXW8p7tT$y&SytioOp5h_{<2x`)U)&F#&w_{FCxB<;%Jj6A zd))0qMfVmLJ$Er=fv*iVHiA3?o}GB)z;7uywjuh$vZqPev(Ht$x9H+CE%MVp^e5xv zG~(kP96S8k2Y>pN^AFH1lD`)G8~!(!d!UeiMd?0Q(GFV&IRWH3U(S2rya&#E;JgRU zd*HkW{@;0k-?8ISL5>60kjK2d;rn&M`z^@#^QFKK0L}p9cb2>!=J%C&AS~ZyeqWCf-DUUa#;vj!y?q;@uW5TOP8ql)jvt1RxMYgcrgu{K&Al#vfDISGMQ{_#>Mj#E<|;5TfZ6X0W=c| z_UWTo+%&3tW2x$%6h4z$5D5#3^#zlCqB^`ShMo$V2}Kz+5=neCT7U#VOBhk|tAl~4 zDXQi7tkv@4z-swbYjq+nKO(6%`U0C0_2uP&RqDqiR0x53Gl{(5*r~mU~b&ANK%Oyc*9Jt(U$cpY*{s z(80qn>Hk-- z_Fn-X{jZDW`wkj3-!bqVn}Y9Y8{bLrot#21-#u{7s8{CtfbTetwLU`H@f@nw%kKil z7pnai&9ab>^#xST$368V_%Ox!qWKQn__(i?c=1dk&o!a{6|_-5?W=4=1z$Oib)h_# zqo~vivMl7g);cC2jg@;jW$CgCd~aw3kUT7ew&@gOi-p*U4T8@+a45%0JGh4I@|r&c zA8=t2vb)PJTCX zNH{{SLlzgJhI@*(&xI?2D&X2a7p@2x6JE<-McDao1kQNn6uO}AHb4(>&K&VRz{hO- z_Bf$_6ZCPL{$0Rdnu{M4mnai|4`|o_8Q_myO)BGdy7-zpl)ses1djNooRLNP_W(zL z4_NqVK)zAuGc(fpY>V?x6N%T_45YkP2i^tzF`PvC+>895buVzRKMhec3v-5M13wOb=$xgcz~?urcw$b} za^UtHraOS^LisTpPW@>cPWo4EIOzv%IO!$U-h)HA|MofXAqW0V2mS_dd(Kv=+M*~< z%3JNg?{eV(ZqL#Bm4jZQw!FOjs~mWZ1HaXQ4?6HK+i?2lNgGc8{MdoN=D^F< zmYcVy3V3CsL^1x?bG5|r&LfQ`=A7N?;Qu=Z{uKxQ69<0UfqQYH^4jz*=84NHw7<)N zZ+75&fmbz7#M^@o`r{7#r~`MaQ;O6`eKUdE$3F+SJ%?_Qji1Y)1NaQ+=d}cL_zWAJ z^6qiqKLoDNZ_L3Hp@f+N?-zrGkV&B)k<^olmH{nQ*GVf1B3R($Or{tXSQ2Q%gW&RHKh4 zw8(oMsiikm9fGO1wbynaKdW;o6113_6=1$!JCa`Vc}6nt?`+9MvIA0%bYfCda$77^ zAh5Ol=H*T8fj~0V6KD&Bti&bfOEKDGy{1Z7w)tvr2}UlQ3+E}Ej0gH;f}@@^ z?Z8M~eO)zj83F^LfZ3OdZLaRwDgw>7b~N48=AS$t<(!Eow!{zL+sNIUDwlHdT*tpm zx|ky$#hC`;$SR#QbyOu46{LzxovCxSl$3nN$zM6Oh#7&6jWVyq${^86X@%A~Q+r^a zBbQC(*PbhRHoqFqmP6{yrp%|+Se7CK#+wgAM*`lY2~GAS9fu4IB)@vzNlN9rk@8!Z zoM%s=lp*Wzz&TP7-*NWc+46ejuBlR_-*Hayv#IJ?9c<5V@C986Z?P+bdy{+u;NyFgWd9D-N73XM@{65DjIa`u#p{z+V3Y}v; zcNQ^I`mA$W!P#LVkSxXhG99t5X^j!VC!^NLmvnAp~PgNk9~In9O`hrc7qy%y$A* z7QrFd*=bnTy4@bzt@haV*sZ&@tzBvBcB6@~o}RYW9(!oDls(!uR9aDJOLx)P&*#1G zn|$X>0@l;|&+>BK-0yw&zI*Sx@4ol_d2@G5`wExKC3Gnk#e!J*=yv-mp^KIM0VJFSSd7}*u|}L){`ChVclX6! z`|r!zezWDxC-42)hrdYLVvF}eK$hJlqHT`*>GTozv~{E{LtT#gle_mcCekAp4m|kA z6W@OMzU|9fUO4v4;kh**+j05+Yd^Ai@1f8CyyVcG>ng6!{qw1j`mw=p4ZmLcn;*Yc zddu@4_z}7nls`%*swTKv+^d!2nD|c>N&XW5E)BH`@r5NCQ~VsSE|oaAP9uQCpL6Id zb@cCb(C66n%|!pO!@f_^$yT8~CWFB$#P71nXa9B?REmN0n1g=E(SMs_mA~ZA*z6&` z$)W!<4*Bo1IfVQdIOsPz#`_+}_?A2H3my8t7c*hw9mo+FAn;+gMOuh-f5d3+SB2nZ*`3C%MSay9rn$2(04oV3h2<~Y8=?M zGPxcOIrP1Z`5k$m5RXI7Ofg;j5O98@TJx8R*c7z0VMuShr9>SUI}{I z;@=3k^KXQ>$HM8;N2m;CrnpF40XPo%EHlLn@m=VxYMdC42n2fjnT?*x0+xmOr(U#5|L-2q!(i%=pmtnR{VV5)`;9Js}hz}SEb6b-Mc|9r9pdm~A zool9Y!jh&}Je-Oeus*isqn00hwNiu$hNKw@CH=m<{}!#S_bq{A3mIBE z;Vx&d7LghZgpEzXRMZSaY}P(k6QZJFVk(xj#Z05uNXYhx2nD0j zo?vKmAQVUYRx{sVNvYQpUF!#@WAY}VGy*$S4CMn20>aTw9UeZPip8!FrdJR9M#Qh; z_j%irT2p~b>RY4n9=Uo}8=H)T5epeDopefl1okGdu(T1D!AtyVAU-dgNt+Rrd5M}> zr=;fF;rvCurf|5`-!c%1#(Pr+d(tmhNP~>nR)6=l0fXcBEpGK|>WXNvH`&sHp@d4^SbLgQvE&FT!(4mWHK^D^R$ygV0>34+^kpXkHk&LGjA>-^Fd^PCM z4u2>^@`mY&P_vXuU}7z+CsXUIgA{*XBpL>vZG@BY)@#-lz4`cj6Fy7$u-LI9C>Js` zIJpzsq_vCLw!ebTHQXuA-FLFJpj_{rFvV93OS|I(&G9X<)$#bmr1@-2bh`W;Bk)|99gI4y_oV7BR<<_#e3FnT%h`Ei+CV^c$A0-7n;Wd- zU%HL)Tqbos3u45gjo55=Jmg+)F&9C;=lJG=sP>=}9KlC5s3cv9O52S+*f zr~c!8Ws&#-uJw5R=0#1uKXMVT(q6RM$|I3WXw9#IvryKMMI&y`yAN2Ac-^A6;=+%I z`z<){Jqmxog41U!e7gm&n4|FbS#XyHziL4*u6Zf1&4L>&xYdH6*7U0s-)dZ=lK*83 z{s!07#Gk;mD&bAICMD!E0K$?+1!q~X!h$n#t?a53;!W5=I1Ta%E7mkE)z;Aso?WBhDCY{8o`e&P#AFBal+7Azwj_)ZJHZowY%qrIJcHA4J{ z1*=I1{-6cR$p?Iw1virqw3jS+6ZufTYr%!&!|_8F+yg#WgAjitTp~mtXfE75{FLxR zLaYLx3l9;#Pk#9H4}=Juw+JhRxEOvZDivZbA)e7>2;uW5EO-m%h4`x$d;{}C{70nY z*~_2cPr_Nafg;>#!DH`N_;l!Cdy@q>TJUogya4e~gd5QBvmfAVYzMrQ?bC%gK==V6 zZlHd^A6xKev;+7*U`&J`giVAmk^dUZE9rpO(GEaCI~U?viv=$s#QjetA!L4u`T@tN zAFzY%SdtqFLHo1?W7H44kMaQ@wcs_h1NcS@p0?l@XcyX(?0+rhnf(FpVn4t-@&UeN z!F$LL{BOxWA8|>3z&+##Y$YGyuPpcp@&o@MbQB@hYY4FeJWD!YoOHldY_Ad`NH`b! z03l-FlZ5cm*Env#L&UMUoFH6)=N#0}SfqaJgw2Gg8wn8um(sr%3-J*`EYO{VE+IZa zh`D%_5M$X-I0NgLut#?dU+?;7<(UN(I)m&*-} znA66gRgAyFpI^XX>9LaaqhwSi_YLmPxrez2vE&}cU_>7ej~;=9+{191=p*^)b3hNm zW>qGRM)ysWHJM+o?Hd1AuaMN2k~ zg)4@?ar&)XZupa@@H_7(PrX%?{+(;-@nq%jzq5CG#Fde3x%<=PP<@sjPyFgYn&MsQ zvGVnI+&&8ZUE^4nP`^y7pOyWjpw{Qj%d_cIO8@j>*_N5*$vu}Io3;M-(QJiBjpCNI z@MPui22VxS^msEBo`cOEdPD$99|6*1Vw_`1A9H7$Jr!WfpgG^PT{f`?cyjFF#!}6b z*<-t>BvYFgp6~q^Q+Uz4t?<%!Tj88{Tj9KSTVeg%RG1#CTz^ME#qWvH;m5HJVmUpD z-A9O95YC>1ZV%Up48U*U(^j=$Mc{(0bRDA5P`g^kr|4Yhgw9i#h(&ADfo z`zaW3v>nD<(|~cAm(eng<7kisxu3D=Q8sn3Y48j=Nz&XCa-442LHaA$2w%NqV)Mn3 z+`qh8)6si}9Vw%|%CGg>14mZ2j4NVok5$u;G z*dOI^AC?X&n1c$tJAET`Xt$^0j7}V7F?u5aM-VDf8hXB3vJcL#&^Ao6i)Jp=W~axz znNtYwr`_<8^fz_q!vR{Q3$+v0WS+TYZRQ7v!VN>uV)z4PyH_B*vSPU1(}_v-@I=xg zpuS$t-$9NIXBYR<|4N;J%jRdgJ?^}2E8gVxUXQ4rEQA<3YG4(fpJRRGO>2fQQwjr1 zjQx^4abA#65Uh#Z)gOqRXgVS zUfi@V1IyE+E=|I0awEt*l^GxZGNNqR22WM$#q`()%*5@Zaw63Jl0Mdeu3iQkG}U86 zslcFXv*twLK@N<`FX%&vTx|&q%|`*)3Yu+0%UqymBy&6qZIE7zxvfu+H83pXg0l8I z%scF9mosU4IvLEct2-0*tjk6{8?_v#L3-R)D1t0c@;XA{j&OEWN#@|tvpd?d%k8V@ zdP!T36}00n3@4oJbR&djLqY@MPUumAYj$Rq$M<~ZDa=yCc=wyRoTfRHtJzXhk5JVn zXT~w~b_~4}L+{35)?qsG!?(-en%K&%1M6jt+z__I4;!;jdhUlsa7}~ew!7gN=0)pL zZfGDGJ>^P2)8#u2!2v%67lRrg+KFZ_D;xi7Vpl-EPdleE6nT_m_cJ zU$*z_;Diod{RwNogrB^UmCMjNvp}6kAFG%x+Z#q#-)}eV1Fr{@Yv--hyqSY=b+fhK zQiojU$5SWRDgBHq&u0rYYvh<3XjQAzJ|CK#UsP(f>SozXtFZ1#T7K1wgr!Is@E8`5Ljxrrch?VY=& zUGtB=fOVnwazc4Mfsn0Y;Oh?D=MXmqOLS-itrc5aUj*&YC2o(5Rv-Zj94cZ`FUeP*RbEr~Ukgs;a=S*a$31Q~ zeVns+Dre3a{ss^Ab;;T2D+(xMLt;+p@CF4VNkuV z6Y_=W+Wf0I;P$t0!gRcF6V=rVlZntm=ab4%$ocS6Y*ue;nxavCcvCR3xoeAI4EW>y z1Hq7~+q*)+K_i9-s5hH^MuM&OS34H75f+;};)SH77_2wr@n~`ZhP7Zoy_2HTK zf~57PkW=X~+gw)_FB`xi?x4k?VHP_b9>F@|V{9dhq1Em=`IV^!I7)4f&PaOJXV7kRE`dn2kBw((uNXeuqax2UOf z#-8G)((<(1U+OLXT2W~^T1G)S&{XO^SPnK5^+`kzyRcNDejIf_+6LI5<)n)tqNuNQ z1{xs2jSDH>V?2&}8oYPHPV(-dPV#mZy?k+=`M?U^h18+hWZ}Jqmpb8V!_qxegr4_uyn8U-S?Ov1(t+YNuF_d(fypy4 z=#qml{TXztL>)jsFXkwXW8p7tT$y&SytioOp5h_{<2x`)U)&F#&w_{FCxB<;%Jj6A zd))0qMfVmLJ$Er=fv*iVHiA3?o}GB)z;7uywjuh$vZqPev(Ht$x9H+CE%MVp^e5xv zG~(kP96S8k2Y>pN^AFH1lD`)G8~!(!d!UeiMd?0Q(GFV&IRWH3U(S2rya&#E;JgRU zd*HkW{@;0k-?8ISL5>60kjK2d;rn&M`z^@#^QFKK0L}p9cb2>!=J%C&AS~ZyeqWCf-DUUa#;vj!y?q;@uW5TOP8ql)jvt1RxMYgcrgu{K&Al#vfDISGMQ{_#>Mj#E<|;5TfZ6X0W=c| z_UWTo+%&3tW2x$%6h4z$5D5#3^#zlCqB^`ShMo$V2}Kz+5=neCT7U#VOBhk|tAl~4 zDXQi7tkv@4z-swbYjq+nKO(6%`U0C0_2uP&RqDqiR0x53Gl{(5*r~mU~b&ANK%Oyc*9Jt(U$cpY*{s z(80qn>Hk-- z_Fn-X{jZDW`wkj3-!bqVn}Y9Y8{bLrot#21-#u{7s8{CtfbTetwLU`H@f@nw%kKil z7pnai&9ab>^#xST$368V_%Ox!qWKQn__(i?c=1dk&o!a{6|_-5?W=4=1z$Oib)h_# zqo~vivMl7g);cC2jg@;jW$CgCd~aw3kUT7ew&@gOi-p*U4T8@+a45%0JGh4I@|r&c zA8=t2vb)PJTCX zNH{{SLlzgJhI@*(&xI?2D&X2a7p@2x6JE<-McDao1kQNn6uO}AHb4(>&K&VRz{hO- z_Bf$_6ZCPL{$0Rdnu{M4mnai|4`|o_8Q_myO)BGdy7-zpl)ses1djNooRLNP_W(zL z4_NqVK)zAuGc(fpY>V?x6N%T_45YkP2i^tzF`PvC+>895buVzRKMhec3v-5M13wOb=$xgcz~?urcw$b} za^UtHraOS^LisTpPW@>cPWo4EIOzv%IO!$U-h)HA|MofXAqW0V2mS_dd(Kv=+M*~< z%3JNg?{eV(ZqL#Bm4jZQw!FOjs~mWZ1HaXQ4?6HK+i?2lNgGc8{MdoN=D^F< zmYcVy3V3CsL^1x?bG5|r&LfQ`=A7N?;Qu=Z{uKxQ69<0UfqQYH^4jz*=84NHw7<)N zZ+75&fmbz7#M^@o`r{7#r~`MaQ;O6`eKUdE$3F+SJ%?_Qji1Y)1NaQ+=d}cL_zWAJ z^6qiqKLoDNZ_L3Hp@f+N?-zrGkV&B)k<^olmH{nQ*GVf1B3R($Or{tXSQ2Q%gW&RHKh4 zw8(oMsiikm9fGO1wbynaKdW;o6113_6=1$!JCa`Vc}6nt?`+9MvIA0%bYfCda$77^ zAh5Ol=H*T8fj~0V6KD&Bti&bfOEKDGy{1Z7w)tvr2}UlQ3+E}Ej0gH;f}@@^ z?Z8M~eO)zj83F^LfZ3OdZLaRwDgw>7b~N48=AS$t<(!Eow!{zL+sNIUDwlHdT*tpm zx|ky$#hC`;$SR#QbyOu46{LzxovCxSl$3nN$zM6Oh#7&6jWVyq${^86X@%A~Q+r^a zBbQC(*PbhRHoqFqmP6{yrp%|+Se7CK#+wgAM*`lY2~GAS9fu4IB)@vzNlN9rk@8!Z zoM%s=lp*Wzz&TP7-*NWc+46ejuBlR_-*Hayv#IJ?9c<5V@C986Z?P+bdy{+u;NyFgWd9D-N73XM@{65DjIa`u#p{z+V3Y}v; zcNQ^I`mA$W!P#LVkSxXhG99t5X^j!VC!^NLmvnAp~PgNk9~In9O`hrc7qy%y$A* z7QrFd*=bnTy4@bzt@haV*sZ&@tzBvBcB6@~o}RYW9(!oDls(!uR9aDJOLx)P&*#1G zn|$X>0@l;|&+>BK-0yw&zI*Sx@4ol_d2@G5`wExKC3Gnk#e!J*=yv-mp^KIM0VJFSSd7}*u|}L){`ChVclX6! z`|r!zezWDxC-42)hrdYLVvF}eK$hJlqHT`*>GTozv~{E{LtT#gle_mcCekAp4m|kA z6W@OMzU|9fUO4v4;kh**+j05+Yd^Ai@1f8CyyVcG>ng6!{qw1j`mw=p4ZmLcn;*Yc zddu@4_z}7nls`%*swTKv+^d!2nD|c>N&XW5E)BH`@r5NCQ~VsSE|oaAP9uQCpL6Id zb@cCb(C66n%|!pO!@f_^$yT8~CWFB$#P71nXa9B?REmN0n1g=E(SMs_mA~ZA*z6&` z$)W!<4*Bo1IfVQdIOsPz#`_+}_?A2H3my8t7c*hw9mo+FAn;+gMOuh-f5d3+SB2nZ*`3C%MSay9rn$2(04oV3h2<~Y8=?M zGPxcOIrP1Z`5k$m5RXI7Ofg;j5O98@TJx8R*c7z0VMuShr9>SUI}{I z;@=3k^KXQ>$HM8;N2m;CrnpF40XPo%EHlLn@m=VxYMdC42n2fjnT?*x0+xmOr(U#5|L-2q!(i%=pmtnR{VV5)`;9Js}hz}SEb6b-Mc|9r9pdm~A zool9Y!jh&}Je-Oeus*isqn00hwNiu$hNKw@CH=m<{}!#S_bq{A3mIBE z;Vx&d7LghZgpEzXRMZSaY}P(k6QZJFVk(xj#Z05uNXYhx2nD0j zo?vKmAQVUYRx{sVNvYQpUF!#@WAY}VGy*$S4CMn20>aTw9UeZPip8!FrdJR9M#Qh; z_j%irT2p~b>RY4n9=Uo}8=H)T5epeDopefl1okGdu(T1D!AtyVAU-dgNt+Rrd5M}> zr=;fF;rvCurf|5`-!c%1#(Pr+d(tmhNP~>nR)6=l0fXcBEpGK|>WXNvH`&sHp@d4^SbLgQvE&FT!(4mWHK^D^R$ygV0>34+^kpXkHk&LGjA>-^Fd^PCM z4u2>^@`mY&P_vXuU}7z+CsXUIgA{*XBpL>vZG@BY)@#-lz4`cj6Fy7$u-LI9C>Js` zIJpzsq_vCLw!ebTHQXuA-FLFJpj_{rFvV93OS|I(&G9X<)$#bmr1@-2bh`W;Bk)|99gI4y_oV7BR<<_#e3FnT%h`Ei+CV^c$A0-7n;Wd- zU%HL)Tqbos3u45gjo55=Jmg+)F&9C;=lJG=sP>=}9KlC5s3cv9O52S+*f zr~c!8Ws&#-uJw5R=0#1uKXMVT(q6RM$|I3WXw9#IvryKMMI&y`yAN2Ac-^A6;=+%I z`z<){Jqmxog41U!e7gm&n4|FbS#XyHziL4*u6Zf1&4L>&xYdH6*7U0s-)dZ=lK*83 z{s!07#Gk;mD&bAICMD!E0K$?+1!q~X!h$n#t?a53;!W5=I1Ta%E7mkE)z;Aso?WBhDCY{8o`e&P#AFBal+7Azwj_)ZJHZowY%qrIJcHA4J{ z1*=I1{-6cR$p?Iw1virqw3jS+6ZufTYr%!&!|_8F+yg#WgAjitTp~mtXfE75{FLxR zLaYLx3l9;#Pk#9H4}=Juw+JhRxEOvZDivZbA)e7>2;uW5EO-m%h4`x$d;{}C{70nY z*~_2cPr_Nafg;>#!DH`N_;l!Cdy@q>TJUogya4e~gd5QBvmfAVYzMrQ?bC%gK==V6 zZlHd^A6xKev;+7*U`&J`giVAmk^dUZE9rpO(GEaCI~U?viv=$s#QjetA!L4u`T@tN zAFzY%SdtqFLHo1?W7H44kMaQ@wcs_h1NcS@p0?l@XcyX(?0+rhnf(FpVn4t-@&UeN z!F$LL{BOxWA8|>3z&+##Y$YGyuPpcp@&o@MbQB@hYY4FeJWD!YoOHldY_Ad`NH`b! z03l-FlZ5cm*Env#L&UMUoFH6)=N#0}SfqaJgw2Gg8wn8um(sr%3-J*`EYO{VE+IZa zh`D%_5M$X-I0NgLut#?dU+?;7<(UN(I)m&*-} znA66gRgAyFpI^XX>9LaaqhwSi_YLmPxrez2vE&}cU_>7ej~;=9+{191=p*^)b3hNm zW>qGRM)ysWHJM+o?Hd1AuaMN2k~ zg)4@?ar&)XZupa@@H_7(PrX%?{+(;-@nq%jzq5CG#Fde3x%<=PP<@sjPyFgYn&MsQ zvGVnI+&&8ZUE^4nP`^y7pOyWjpw{Qj%d_cIO8@j>*_N5*$vu}Io3;M-(QJiBjpCNI z@MPui22VxS^msEBo`cOEdPD$99|6*1Vw_`1A9H7$Jr!WfpgG^PT{f`?cyjFF#!}6b z*<-t>BvYFgp6~q^Q+Uz4t?<%!Tj88{Tj9KSTVeg%RG1#CTz^ME#qWvH;m5HJVmUpD z-A9O95YC>1ZV%Up48U*U(^j=$Mc{(0bRDA5P`g^kr|4Yhgw9i#h(&ADfo z`zaW3v>nD<(|~cAm(eng<7kisxu3D=Q8sn3Y48j=Nz&XCa-442LHaA$2w%NqV)Mn3 z+`qh8)6si}9Vw%|%CGg>14mZ2j4NVok5$u;G z*dOI^AC?X&n1c$tJAET`Xt$^0j7}V7F?u5aM-VDf8hXB3vJcL#&^Ao6i)Jp=W~axz znNtYwr`_<8^fz_q!vR{Q3$+v0WS+TYZRQ7v!VN>uV)z4PyH_B*vSPU1(}_v-@I=xg zpuS$t-$9NIXBYR<|4N;J%jRdgJ?^}2E8gVxUXQ4rEQA<3YG4(fpJRRGO>2fQQwjr1 zjQx^4abA#65Uh#Z)gOqRXgVS zUfi@V1IyE+E=|I0awEt*l^GxZGNNqR22WM$#q`()%*5@Zaw63Jl0Mdeu3iQkG}U86 zslcFXv*twLK@N<`FX%&vTx|&q%|`*)3Yu+0%UqymBy&6qZIE7zxvfu+H83pXg0l8I z%scF9mosU4IvLEct2-0*tjk6{8?_v#L3-R)D1t0c@;XA{j&OEWN#@|tvpd?d%k8V@ zdP!T36}00n3@4oJbR&djLqY@MPUumAYj$Rq$M<~ZDa=yCc=wyRoTfRHtJzXhk5JVn zXT~w~b_~4}L+{35)?qsG!?(-en%K&%1M6jt+z__I4;!;jdhUlsa7}~ew!7gN=0)pL zZfGDGJ>^P2)8#u2!2v%67lRrg+KFZ_D;xi7Vpl-EPdleE6nT_m_cJ zU$*z_;Diod{RwNogrB^UmCMjNvp}6kAFG%x+Z#q#-)}eV1Fr{@Yv--hyqSY=b+fhK zQiojU$5SWRDgBHq&u0rYYvh<3XjQAzJ|CK#UsP(f>SozXtFZ1#T7K1wgr!Is@E8`5Ljxrrch?VY=& zUGtB=fOVnwazc4Mfsn0Y;Oh?D=MXmqOLS-itrc5aUj*&YC2o(5Rv-Zj94cZ`FUeP*RbEr~Ukgs;a=S*a$31Q~ zeVns+Dre3a{ss^Ab;;T2D+(xMLt;+p@CF4VNkuV z6Y_=W+Wf0I;P$t0!gRcF6V=rVlZntm=ab4%$ocS6Y*ue;nxavCcvCR3xoeAI4EW>y z1Hq7~+q*)+K_i9-s5hH^MuM&OS34H75f+;};)SH77_2wr@n~`ZhP7Zoy_2HTK zf~57PkW=X~+gw)_FB`xi?x4k?VHP_b9>F@|V{9dhq1Em=`IV^!I7)4f&PaOJXV7kRE`dn2kBw((uNXeuqax2UOf z#-8G)((<(1U+OLXT2W~^T1G)S&{XO^SPnK5^+`kzyRcNDejIf_+6LI5<)n)tqNuNQ z1{xs2jSDH>V?2&}8oYPHPV(-dPV#mZy?k+=`M?U^h18+hWZ}Jqmpb8V!_qxegr4_uyn8U-S?Ov1(t+YNuF_d(fypy4 z=#qml{TXztL>)jsFXkwXW8p7tT$y&SytioOp5h_{<2x`)U)&F#&w_{FCxB<;%Jj6A zd))0qMfVmLJ$Er=fv*iVHiA3?o}GB)z;7uywjuh$vZqPev(Ht$x9H+CE%MVp^e5xv zG~(kP96S8k2Y>pN^AFH1lD`)G8~!(!d!UeiMd?0Q(GFV&IRWH3U(S2rya&#E;JgRU zd*HkW{@;0k-?8ISL5>60kjK2d;rn&M`z^@#^QFKK0L}p9cb2>!=J%C&AS~ZyeqWCf-DUUa#;vj!y?q;@uW5TOP8ql)jvt1RxMYgcrgu{K&Al#vfDISGMQ{_#>Mj#E<|;5TfZ6X0W=c| z_UWTo+%&3tW2x$%6h4z$5D5#3^#zlCqB^`ShMo$V2}Kz+5=neCT7U#VOBhk|tAl~4 zDXQi7tkv@4z-swbYjq+nKO(6%`U0C0_2uP&RqDqiR0x53Gl{(5*r~mU~b&ANK%Oyc*9Jt(U$cpY*{s z(80qn>Hk-- z_Fn-X{jZDW`wkj3-!bqVn}Y9Y8{bLrot#21-#u{7s8{CtfbTetwLU`H@f@nw%kKil z7pnai&9ab>^#xST$368V_%Ox!qWKQn__(i?c=1dk&o!a{6|_-5?W=4=1z$Oib)h_# zqo~vivMl7g);cC2jg@;jW$CgCd~aw3kUT7ew&@gOi-p*U4T8@+a45%0JGh4I@|r&c zA8=t2vb)PJTCX zNH{{SLlzgJhI@*(&xI?2D&X2a7p@2x6JE<-McDao1kQNn6uO}AHb4(>&K&VRz{hO- z_Bf$_6ZCPL{$0Rdnu{M4mnai|4`|o_8Q_myO)BGdy7-zpl)ses1djNooRLNP_W(zL z4_NqVK)zAuGc(fpY>V?x6N%T_45YkP2i^tzF`PvC+>895buVzRKMhec3v-5M13wOb=$xgcz~?urcw$b} za^UtHraOS^LisTpPW@>cPWo4EIOzv%IO!$U-h)HA|MofXAqW0V2mS_dd(Kv=+M*~< z%3JNg?{eV(ZqL#Bm4jZQw!FOjs~mWZ1HaXQ4?6HK+i?2lNgGc8{MdoN=D^F< zmYcVy3V3CsL^1x?bG5|r&LfQ`=A7N?;Qu=Z{uKxQ69<0UfqQYH^4jz*=84NHw7<)N zZ+75&fmbz7#M^@o`r{7#r~`MaQ;O6`eKUdE$3F+SJ%?_Qji1Y)1NaQ+=d}cL_zWAJ z^6qiqKLoDNZ_L3Hp@f+N?-zrGkV&B)k<^olmH{nQ*GVf1B3R($Or{tXSQ2Q%gW&RHKh4 zw8(oMsiikm9fGO1wbynaKdW;o6113_6=1$!JCa`Vc}6nt?`+9MvIA0%bYfCda$77^ zAh5Ol=H*T8fj~0V6KD&Bti&bfOEKDGy{1Z7w)tvr2}UlQ3+E}Ej0gH;f}@@^ z?Z8M~eO)zj83F^LfZ3OdZLaRwDgw>7b~N48=AS$t<(!Eow!{zL+sNIUDwlHdT*tpm zx|ky$#hC`;$SR#QbyOu46{LzxovCxSl$3nN$zM6Oh#7&6jWVyq${^86X@%A~Q+r^a zBbQC(*PbhRHoqFqmP6{yrp%|+Se7CK#+wgAM*`lY2~GAS9fu4IB)@vzNlN9rk@8!Z zoM%s=lp*Wzz&TP7-*NWc+46ejuBlR_-*Hayv#IJ?9c<5V@C986Z?P+bdy{+u;NyFgWd9D-N73XM@{65DjIa`u#p{z+V3Y}v; zcNQ^I`mA$W!P#LVkSxXhG99t5X^j!VC!^NLmvnAp~PgNk9~In9O`hrc7qy%y$A* z7QrFd*=bnTy4@bzt@haV*sZ&@tzBvBcB6@~o}RYW9(!oDls(!uR9aDJOLx)P&*#1G zn|$X>0@l;|&+>BK-0yw&zI*Sx@4ol_d2@G5`wExKC3Gnk#e!J*=yv-mp^KIM0VJFSSd7}*u|}L){`ChVclX6! z`|r!zezWDxC-42)hrdYLVvF}eK$hJlqHT`*>GTozv~{E{LtT#gle_mcCekAp4m|kA z6W@OMzU|9fUO4v4;kh**+j05+Yd^Ai@1f8CyyVcG>ng6!{qw1j`mw=p4ZmLcn;*Yc zddu@4_z}7nls`%*swTKv+^d!2nD|c>N&XW5E)BH`@r5NCQ~VsSE|oaAP9uQCpL6Id zb@cCb(C66n%|!pO!@f_^$yT8~CWFB$#P71nXa9B?REmN0n1g=E(SMs_mA~ZA*z6&` z$)W!<4*Bo1IfVQdIOsPz#`_+}_?A2H3my8t7c*hw9mo+FAn;+gMOuh-f5d3+SB2nZ*`3C%MSay9rn$2(04oV3h2<~Y8=?M zGPxcOIrP1Z`5k$m5RXI7Ofg;j5O98@TJx8R*c7z0VMuShr9>SUI}{I z;@=3k^KXQ>$HM8;N2m;CrnpF40XPo%EHlLn@m=VxYMdC42n2fjnT?*x0+xmOr(U#5|L-2q!(i%=pmtnR{VV5)`;9Js}hz}SEb6b-Mc|9r9pdm~A zool9Y!jh&}Je-Oeus*isqn00hwNiu$hNKw@CH=m<{}!#S_bq{A3mIBE z;Vx&d7LghZgpEzXRMZSaY}P(k6QZJFVk(xj#Z05uNXYhx2nD0j zo?vKmAQVUYRx{sVNvYQpUF!#@WAY}VGy*$S4CMn20>aTw9UeZPip8!FrdJR9M#Qh; z_j%irT2p~b>RY4n9=Uo}8=H)T5epeDopefl1okGdu(T1D!AtyVAU-dgNt+Rrd5M}> zr=;fF;rvCurf|5`-!c%1#(Pr+d(tmhNP~>nR)6=l0fXcBEpGK|>WXNvH`&sHp@d4^SbLgQvE&FT!(4mWHK^D^R$ygV0>34+^kpXkHk&LGjA>-^Fd^PCM z4u2>^@`mY&P_vXuU}7z+CsXUIgA{*XBpL>vZG@BY)@#-lz4`cj6Fy7$u-LI9C>Js` zIJpzsq_vCLw!ebTHQXuA-FLFJpj_{rFvV93OS|I(&G9X<)$#bmr1@-2bh`W;Bk)|99gI4y_oV7BR<<_#e3FnT%h`Ei+CV^c$A0-7n;Wd- zU%HL)Tqbos3u45gjo55=Jmg+)F&9C;=lJG=sP>=}9KlC5s3cv9O52S+*f zr~c!8Ws&#-uJw5R=0#1uKXMVT(q6RM$|I3WXw9#IvryKMMI&y`yAN2Ac-^A6;=+%I z`z<){Jqmxog41U!e7gm&n4|FbS#XyHziL4*u6Zf1&4L>&xYdH6*7U0s-)dZ=lK*83 z{s!07#Gk;mD&bAICMD!E0K$?+1!q~X!h$n#t?a53;!W5=I1Ta%E7mkE)z;Aso?WBhDCY{8o`e&P#AFBal+7Azwj_)ZJHZowY%qrIJcHA4J{ z1*=I1{-6cR$p?Iw1virqw3jS+6ZufTYr%!&!|_8F+yg#WgAjitTp~mtXfE75{FLxR zLaYLx3l9;#Pk#9H4}=Juw+JhRxEOvZDivZbA)e7>2;uW5EO-m%h4`x$d;{}C{70nY z*~_2cPr_Nafg;>#!DH`N_;l!Cdy@q>TJUogya4e~gd5QBvmfAVYzMrQ?bC%gK==V6 zZlHd^A6xKev;+7*U`&J`giVAmk^dUZE9rpO(GEaCI~U?viv=$s#QjetA!L4u`T@tN zAFzY%SdtqFLHo1?W7H44kMaQ@wcs_h1NcS@p0?l@XcyX(?0+rhnf(FpVn4t-@&UeN z!F$LL{BOxWA8|>3z&+##Y$YGyuPpcp@&o@MbQB@hYY4FeJWD!YoOHldY_Ad`NH`b! z03l-FlZ5cm*Env#L&UMUoFH6)=N#0}SfqaJgw2Gg8wn8um(sr%3-J*`EYO{VE+IZa zh`D%_5M$X-I0NgLut#?dU+?;7<(UN(I)m&*-} znA66gRgAyFpI^XX>9LaaqhwSi_YLmPxrez2vE&}cU_>7ej~;=9+{191=p*^)b3hNm zW>qGRM)ysWHJM+o?Hd1AuaMN2k~ zg)4@?ar&)XZupa@@H_7(PrX%?{+(;-@nq%jzq5CG#Fde3x%<=PP<@sjPyFgYn&MsQ zvGVnI+&&8ZUE^4nP`^y7pOyWjpw{Qj%d_cIO8@j>*_N5*$vu}Io3;M-(QJiBjpCNI z@MPui22VxS^msEBo`cOEdPD$99|6*1Vw_`1A9H7$Jr!WfpgG^PT{f`?cyjFF#!}6b z*<-t>BvYFgp6~q^Q+Uz4t?<%!Tj88{Tj9KSTVeg%RG1#CTz^ME#qWvH;m5HJVmUpD z-A9O95YC>1ZV%Up48U*U(^j=$Mc{(0bRDA5P`g^kr|4Yhgw9i#h(&ADfo z`zaW3v>nD<(|~cAm(eng<7kisxu3D=Q8sn3Y48j=Nz&XCa-442LHaA$2w%NqV)Mn3 z+`qh8)6si}9Vw%|%CGg>14mZ2j4NVok5$u;G z*dOI^AC?X&n1c$tJAET`Xt$^0j7}V7F?u5aM-VDf8hXB3vJcL#&^Ao6i)Jp=W~axz znNtYwr`_<8^fz_q!vR{Q3$+v0WS+TYZRQ7v!VN>uV)z4PyH_B*vSPU1(}_v-@I=xg zpuS$t-$9NIXBYR<|4N;J%jRdgJ?^}2E8gVxUXQ4rEQA<3YG4(fpJRRGO>2fQQwjr1 zjQx^4abA#65Uh#Z)gOqRXgVS zUfi@V1IyE+E=|I0awEt*l^GxZGNNqR22WM$#q`()%*5@Zaw63Jl0Mdeu3iQkG}U86 zslcFXv*twLK@N<`FX%&vTx|&q%|`*)3Yu+0%UqymBy&6qZIE7zxvfu+H83pXg0l8I z%scF9mosU4IvLEct2-0*tjk6{8?_v#L3-R)D1t0c@;XA{j&OEWN#@|tvpd?d%k8V@ zdP!T36}00n3@4oJbR&djLqY@MPUumAYj$Rq$M<~ZDa=yCc=wyRoTfRHtJzXhk5JVn zXT~w~b_~4}L+{35)?qsG!?(-en%K&%1M6jt+z__I4;!;jdhUlsa7}~ew!7gN=0)pL zZfGDGJ>^P2)8#u2!2v%67lRrg+KFZ_D;xi7Vpl-EPdleE6nT_m_cJ zU$*z_;Diod{RwNogrB^UmCMjNvp}6kAFG%x+Z#q#-)}eV1Fr{@Yv--hyqSY=b+fhK zQiojU$5SWRDgBHq&u0rYYvh<3XjQAzJ|CK#UsP(f>SozXtFZ1#T7K1wgr!Is@E8`5Ljxrrch?VY=& zUGtB=fOVnwazc4Mfsn0Y;Oh?D=MXmqOLS-itrc5aUj*&YC2o(5Rv-Zj94cZ`FUeP*RbEr~Ukgs;a=S*a$31Q~ zeVns+Dre3a{ss^Ab;;T2D+(xMLt;+p@CF4VNkuV z6Y_=W+Wf0I;P$t0!gRcF6V=rVlZntm=ab4%$ocS6Y*ue;nxavCcvCR3xoeAI4EW>y z1Hq7~+q*)+K_i9-s5hH^MuM&OS34H75f+;};)SH77_2wr@n~`ZhP7Zoy_2HTK zf~57PkW=X~+gw)_FB`xi?x4k?VHP_b9>F@|V{9dhq1Em=`IV^!I7)4f&PaOJXV7kRE`dn2kBw((uNXeuqax2UOf z#-8G)((<(1U+OLXT2W~^T1G)S&{XO^SPnK5^+`kzyRcNDejIf_+6LI5<)n)tqNuNQ z1{xs2jSDH>V?2&}8oYPHPV(-dPV#mZy?k+=`M?U^h18+hWZ}Jqmpb8V!_qxegr4_uyn8U-S?Ov1(t+YNuF_d(fypy4 z=#qml{TXztL>)jsFXkwXW8p7tT$y&SytioOp5h_{<2x`)U)&F#&w_{FCxB<;%Jj6A zd))0qMfVmLJ$Er=fv*iVHiA3?o}GB)z;7uywjuh$vZqPev(Ht$x9H+CE%MVp^e5xv zG~(kP96S8k2Y>pN^AFH1lD`)G8~!(!d!UeiMd?0Q(GFV&IRWH3U(S2rya&#E;JgRU zd*HkW{@;0k-?8ISL5>60kjK2d;rn&M`z^@#^QFKK0L}p9cb2>!=J%C&AS~ZyeqWCf-DUUa#;vj!y?q;@uW5TOP8ql)jvt1RxMYgcrgu{K&Al#vfDISGMQ{_#>Mj#E<|;5TfZ6X0W=c| z_UWTo+%&3tW2x$%6h4z$5D5#3^#zlCqB^`ShMo$V2}Kz+5=neCT7U#VOBhk|tAl~4 zDXQi7tkv@4z-swbYjq+nKO(6%`U0C0_2uP&RqDqiR0x53Gl{(5*r~mU~b&ANK%Oyc*9Jt(U$cpY*{s z(80qn>Hk-- z_Fn-X{jZDW`wkj3-!bqVn}Y9Y8{bLrot#21-#u{7s8{CtfbTetwLU`H@f@nw%kKil z7pnai&9ab>^#xST$368V_%Ox!qWKQn__(i?c=1dk&o!a{6|_-5?W=4=1z$Oib)h_# zqo~vivMl7g);cC2jg@;jW$CgCd~aw3kUT7ew&@gOi-p*U4T8@+a45%0JGh4I@|r&c zA8=t2vb)PJTCX zNH{{SLlzgJhI@*(&xI?2D&X2a7p@2x6JE<-McDao1kQNn6uO}AHb4(>&K&VRz{hO- z_Bf$_6ZCPL{$0Rdnu{M4mnai|4`|o_8Q_myO)BGdy7-zpl)ses1djNooRLNP_W(zL z4_NqVK)zAuGc(fpY>V?x6N%T_45YkP2i^tzF`PvC+>895buVzRKMhec3v-5M13wOb=$xgcz~?urcw$b} za^UtHraOS^LisTpPW@>cPWo4EIOzv%IO!$U-h)HA|MofXAqW0V2mS_dd(Kv=+M*~< z%3JNg?{eV(ZqL#Bm4jZQw!FOjs~mWZ1HaXQ4?6HK+i?2lNgGc8{MdoN=D^F< zmYcVy3V3CsL^1x?bG5|r&LfQ`=A7N?;Qu=Z{uKxQ69<0UfqQYH^4jz*=84NHw7<)N zZ+75&fmbz7#M^@o`r{7#r~`MaQ;O6`eKUdE$3F+SJ%?_Qji1Y)1NaQ+=d}cL_zWAJ z^6qiqKLoDNZ_L3Hp@f+N?-zrGkV&B)k<^olmH{nQ*GVf1B3R($Or{tXSQ2Q%gW&RHKh4 zw8(oMsiikm9fGO1wbynaKdW;o6113_6=1$!JCa`Vc}6nt?`+9MvIA0%bYfCda$77^ zAh5Ol=H*T8fj~0V6KD&Bti&bfOEKDGy{1Z7w)tvr2}UlQ3+E}Ej0gH;f}@@^ z?Z8M~eO)zj83F^LfZ3OdZLaRwDgw>7b~N48=AS$t<(!Eow!{zL+sNIUDwlHdT*tpm zx|ky$#hC`;$SR#QbyOu46{LzxovCxSl$3nN$zM6Oh#7&6jWVyq${^86X@%A~Q+r^a zBbQC(*PbhRHoqFqmP6{yrp%|+Se7CK#+wgAM*`lY2~GAS9fu4IB)@vzNlN9rk@8!Z zoM%s=lp*Wzz&TP7-*NWc+46ejuBlR_-*Hayv#IJ?9c<5V@C986Z?P+bdy{+u;NyFgWd9D-N73XM@{65DjIa`u#p{z+V3Y}v; zcNQ^I`mA$W!P#LVkSxXhG99t5X^j!VC!^NLmvnAp~PgNk9~In9O`hrc7qy%y$A* z7QrFd*=bnTy4@bzt@haV*sZ&@tzBvBcB6@~o}RYW9(!oDls(!uR9aDJOLx)P&*#1G zn|$X>0@l;|&+>BK-0yw&zI*Sx@4ol_d2@G5`wExKC3Gnk#e!J*=yv-mp^KIM0VJFSSd7}*u|}L){`ChVclX6! z`|r!zezWDxC-42)hrdYLVvF}eK$hJlqHT`*>GTozv~{E{LtT#gle_mcCekAp4m|kA z6W@OMzU|9fUO4v4;kh**+j05+Yd^Ai@1f8CyyVcG>ng6!{qw1j`mw=p4ZmLcn;*Yc zddu@4_z}7nls`%*swTKv+^d!2nD|c>N&XW5E)BH`@r5NCQ~VsSE|oaAP9uQCpL6Id zb@cCb(C66n%|!pO!@f_^$yT8~CWFB$#P71nXa9B?REmN0n1g=E(SMs_mA~ZA*z6&` z$)W!<4*Bo1IfVQdIOsPz#`_+}_?A2H3my8t7c*hw9mo+FAn;+gMOuh-f5d3+SB2nZ*`3C%MSay9rn$2(04oV3h2<~Y8=?M zGPxcOIrP1Z`5k$m5RXI7Ofg;j5O98@TJx8R*c7z0VMuShr9>SUI}{I z;@=3k^KXQ>$HM8;N2m;CrnpF40XPo%EHlLn@m=VxYMdC42n2fjnT?*x0+xmOr(U#5|L-2q!(i%=pmtnR{VV5)`;9Js}hz}SEb6b-Mc|9r9pdm~A zool9Y!jh&}Je-Oeus*isqn00hwNiu$hNKw@CH=m<{}!#S_bq{A3mIBE z;Vx&d7LghZgpEzXRMZSaY}P(k6QZJFVk(xj#Z05uNXYhx2nD0j zo?vKmAQVUYRx{sVNvYQpUF!#@WAY}VGy*$S4CMn20>aTw9UeZPip8!FrdJR9M#Qh; z_j%irT2p~b>RY4n9=Uo}8=H)T5epeDopefl1okGdu(T1D!AtyVAU-dgNt+Rrd5M}> zr=;fF;rvCurf|5`-!c%1#(Pr+d(tmhNP~>nR)6=l0fXcBEpGK|>WXNvH`&sHp@d4^SbLgQvE&FT!(4mWHK^D^R$ygV0>34+^kpXkHk&LGjA>-^Fd^PCM z4u2>^@`mY&P_vXuU}7z+CsXUIgA{*XBpL>vZG@BY)@#-lz4`cj6Fy7$u-LI9C>Js` zIJpzsq_vCLw!ebTHQXuA-FLFJpj_{rFvV93OS|I(&G9X<)$#bmr1@-2bh`W;Bk)|99gI4y_oV7BR<<_#e3FnT%h`Ei+CV^c$A0-7n;Wd- zU%HL)Tqbos3u45gjo55=Jmg+)F&9C;=lJG=sP>=}9KlC5s3cv9O52S+*f zr~c!8Ws&#-uJw5R=0#1uKXMVT(q6RM$|I3WXw9#IvryKMMI&y`yAN2Ac-^A6;=+%I z`z<){Jqmxog41U!e7gm&n4|FbS#XyHziL4*u6Zf1&4L>&xYdH6*7U0s-)dZ=lK*83 z{s!07#Gk;mD&bAICMD!E0K$?+1!q~X!h$n#t?a53;!W5=I1Ta%E7mkE)z;Aso?WBhDCY{8o`e&P#AFBal+7Azwj_)ZJHZowY%qrIJcHA4J{ z1*=I1{-6cR$p?Iw1virqw3jS+6ZufTYr%!&!|_8F+yg#WgAjitTp~mtXfE75{FLxR zLaYLx3l9;#Pk#9H4}=Juw+JhRxEOvZDivZbA)e7>2;uW5EO-m%h4`x$d;{}C{70nY z*~_2cPr_Nafg;>#!DH`N_;l!Cdy@q>TJUogya4e~gd5QBvmfAVYzMrQ?bC%gK==V6 zZlHd^A6xKev;+7*U`&J`giVAmk^dUZE9rpO(GEaCI~U?viv=$s#QjetA!L4u`T@tN zAFzY%SdtqFLHo1?W7H44kMaQ@wcs_h1NcS@p0?l@XcyX(?0+rhnf(FpVn4t-@&UeN z!F$LL{BOxWA8|>3z&+##Y$YGyuPpcp@&o@MbQB@hYY4FeJWD!YoOHldY_Ad`NH`b! z03l-FlZ5cm*Env#L&UMUoFH6)=N#0}SfqaJgw2Gg8wn8um(sr%3-J*`EYO{VE+IZa zh`D%_5M$X-I0NgLut#?dU+?;7<(UN(I)m&*-} znA66gRgAyFpI^XX>9LaaqhwSi_YLmPxrez2vE&}cU_>7ej~;=9+{191=p*^)b3hNm zW>qGRM)ysWHJM+o?Hd1AuaMN2k~ zg)4@?ar&)XZupa@@H_7(PrX%?{+(;-@nq%jzq5CG#Fde3x%<=PP<@sjPyFgYn&MsQ zvGVnI+&&8ZUE^4nP`^y7pOyWjpw{Qj%d_cIO8@j>*_N5*$vu}Io3;M-(QJiBjpCNI z@MPui22VxS^msEBo`cOEdPD$99|6*1Vw_`1A9H7$Jr!WfpgG^PT{f`?cyjFF#!}6b z*<-t>BvYFgp6~q^Q+Uz4t?<%!Tj88{Tj9KSTVeg%RG1#CTz^ME#qWvH;m5HJVmUpD z-A9O95YC>1ZV%Up48U*U(^j=$Mc{(0bRDA5P`g^kr|4Yhgw9i#h(&ADfo z`zaW3v>nD<(|~cAm(eng<7kisxu3D=Q8sn3Y48j=Nz&XCa-442LHaA$2w%NqV)Mn3 z+`qh8)6si}9Vw%|%CGg>14mZ2j4NVok5$u;G z*dOI^AC?X&n1c$tJAET`Xt$^0j7}V7F?u5aM-VDf8hXB3vJcL#&^Ao6i)Jp=W~axz znNtYwr`_<8^fz_q!vR{Q3$+v0WS+TYZRQ7v!VN>uV)z4PyH_B*vSPU1(}_v-@I=xg zpuS$t-$9NIXBYR<|4N;J%jRdgJ?^}2E8gVxUXQ4rEQA<3YG4(fpJRRGO>2fQQwjr1 zjQx^4abA#65Uh#Z)gOqRXgVS zUfi@V1IyE+E=|I0awEt*l^GxZGNNqR22WM$#q`()%*5@Zaw63Jl0Mdeu3iQkG}U86 zslcFXv*twLK@N<`FX%&vTx|&q%|`*)3Yu+0%UqymBy&6qZIE7zxvfu+H83pXg0l8I z%scF9mosU4IvLEct2-0*tjk6{8?_v#L3-R)D1t0c@;XA{j&OEWN#@|tvpd?d%k8V@ zdP!T36}00n3@4oJbR&djLqY@MPUumAYj$Rq$M<~ZDa=yCc=wyRoTfRHtJzXhk5JVn zXT~w~b_~4}L+{35)?qsG!?(-en%K&%1M6jt+z__I4;!;jdhUlsa7}~ew!7gN=0)pL zZfGDGJ>^P2)8#u2!2v%67lRrg+KFZ_D;xi7Vpl-EPdleE6nT_m_cJ zU$*z_;Diod{RwNogrB^UmCMjNvp}6kAFG%x+Z#q#-)}eV1Fr{@Yv--hyqSY=b+fhK zQiojU$5SWRDgBHq&u0rYYvh<3XjQAzJ|CK#UsP(f>SozXtFZ1#T7K1wgr!Is@E8`5Ljxrrch?VY=& zUGtB=fOVnwazc4Mfsn0Y;Oh?D=MXmqOLS-itrc5aUj*&YC2o(5Rv-Zj94cZ`FUeP*RbEr~Ukgs;a=S*a$31Q~ zeVns+Dre3a{ss^Ab;;T2D+(xMLt;+p@CF4VNkuV z6Y_=W+Wf0I;P$t0!gRcF6V=rVlZntm=ab4%$ocS6Y*ue;nxavCcvCR3xoeAI4EW>y z1Hq7~+q*)+K_i9-s5hH^MuM&OS34H75f+;};)SH77_2wr@n~`ZhP7Zoy_2HTK zf~57PkW=X~+gw)_FB`xi?x4k?VHP_b9>F@|V{9dhq1Em=`IV^!I7)4f&PaOJXV7kRE`dn2kBw((uNXeuqax2UOf z#-8G)((<(1U+OLXT2W~^T1G)S&{XO^SPnK5^+`kzyRcNDejIf_+6LI5<)n)tqNuNQ z1{xs2jSDH>V?2&}8oYPHPV(-dPV#mZy?k+=`M?U^h18+hWZ}Jqmpb8V!_qxegr4_uyn8U-S?Ov1(t+YNuF_d(fypy4 z=#qml{TXztL>)jsFXkwXW8p7tT$y&SytioOp5h_{<2x`)U)&F#&w_{FCxB<;%Jj6A zd))0qMfVmLJ$Er=fv*iVHiA3?o}GB)z;7uywjuh$vZqPev(Ht$x9H+CE%MVp^e5xv zG~(kP96S8k2Y>pN^AFH1lD`)G8~!(!d!UeiMd?0Q(GFV&IRWH3U(S2rya&#E;JgRU zd*HkW{@;0k-?8ISL5>60kjK2d;rn&M`z^@#^QFKK0L}p9cb2>!=J%C&AS~ZyeqWCf-DUUa#;vj!y?q;@uW5TOP8ql)jvt1RxMYgcrgu{K&Al#vfDISGMQ{_#>Mj#E<|;5TfZ6X0W=c| z_UWTo+%&3tW2x$%6h4z$5D5#3^#zlCqB^`ShMo$V2}Kz+5=neCT7U#VOBhk|tAl~4 zDXQi7tkv@4z-swbYjq+nKO(6%`U0C0_2uP&RqDqiR0x53Gl{(5*r~mU~b&ANK%Oyc*9Jt(U$cpY*{s z(80qn>Hk-- z_Fn-X{jZDW`wkj3-!bqVn}Y9Y8{bLrot#21-#u{7s8{CtfbTetwLU`H@f@nw%kKil z7pnai&9ab>^#xST$368V_%Ox!qWKQn__(i?c=1dk&o!a{6|_-5?W=4=1z$Oib)h_# zqo~vivMl7g);cC2jg@;jW$CgCd~aw3kUT7ew&@gOi-p*U4T8@+a45%0JGh4I@|r&c zA8=t2vb)PJTCX zNH{{SLlzgJhI@*(&xI?2D&X2a7p@2x6JE<-McDao1kQNn6uO}AHb4(>&K&VRz{hO- z_Bf$_6ZCPL{$0Rdnu{M4mnai|4`|o_8Q_myO)BGdy7-zpl)ses1djNooRLNP_W(zL z4_NqVK)zAuGc(fpY>V?x6N%T_45YkP2i^tzF`PvC+>895buVzRKMhec3v-5M13wOb=$xgcz~?urcw$b} za^UtHraOS^LisTpPW@>cPWo4EIOzv%IO!$U-h)HA|MofXAqW0V2mS_dd(Kv=+M*~< z%3JNg?{eV(ZqL#Bm4jZQw!FOjs~mWZ1HaXQ4?6HK+i?2lNgGc8{MdoN=D^F< zmYcVy3V3CsL^1x?bG5|r&LfQ`=A7N?;Qu=Z{uKxQ69<0UfqQYH^4jz*=84NHw7<)N zZ+75&fmbz7#M^@o`r{7#r~`MaQ;O6`eKUdE$3F+SJ%?_Qji1Y)1NaQ+=d}cL_zWAJ z^6qiqKLoDNZ_L3Hp@f+N?-zrGkV&B)k<^olmH{nQ*GVf1B3R($Or{tXSQ2Q%gW&RHKh4 zw8(oMsiikm9fGO1wbynaKdW;o6113_6=1$!JCa`Vc}6nt?`+9MvIA0%bYfCda$77^ zAh5Ol=H*T8fj~0V6KD&Bti&bfOEKDGy{1Z7w)tvr2}UlQ3+E}Ej0gH;f}@@^ z?Z8M~eO)zj83F^LfZ3OdZLaRwDgw>7b~N48=AS$t<(!Eow!{zL+sNIUDwlHdT*tpm zx|ky$#hC`;$SR#QbyOu46{LzxovCxSl$3nN$zM6Oh#7&6jWVyq${^86X@%A~Q+r^a zBbQC(*PbhRHoqFqmP6{yrp%|+Se7CK#+wgAM*`lY2~GAS9fu4IB)@vzNlN9rk@8!Z zoM%s=lp*Wzz&TP7-*NWc+46ejuBlR_-*Hayv#IJ?9c<5V@C986Z?P+bdy{+u;NyFgWd9D-N73XM@{65DjIa`u#p{z+V3Y}v; zcNQ^I`mA$W!P#LVkSxXhG99t5X^j!VC!^NLmvnAp~PgNk9~In9O`hrc7qy%y$A* z7QrFd*=bnTy4@bzt@haV*sZ&@tzBvBcB6@~o}RYW9(!oDls(!uR9aDJOLx)P&*#1G zn|$X>0@l;|&+>BK-0yw&zI*Sx@4ol_d2@G5`wExKC3Gnk#e!J*=yv-mp^KIM0VJFSSd7}*u|}L){`ChVclX6! z`|r!zezWDxC-42)hrdYLVvF}eK$hJlqHT`*>GTozv~{E{LtT#gle_mcCekAp4m|kA z6W@OMzU|9fUO4v4;kh**+j05+Yd^Ai@1f8CyyVcG>ng6!{qw1j`mw=p4ZmLcn;*Yc zddu@4_z}7nls`%*swTKv+^d!2nD|c>N&XW5E)BH`@r5NCQ~VsSE|oaAP9uQCpL6Id zb@cCb(C66n%|!pO!@f_^$yT8~CWFB$#P71nXa9B?REmN0n1g=E(SMs_mA~ZA*z6&` z$)W!<4*Bo1IfVQdIOsPz#`_+}_?A2H3my8t7c*hw9mo+FAn;+gMOuh-f5d3+SB2nZ*`3C%MSay9rn$2(04oV3h2<~Y8=?M zGPxcOIrP1Z`5k$m5RXI7Ofg;j5O98@TJx8R*c7z0VMuShr9>SUI}{I z;@=3k^KXQ>$HM8;N2m;CrnpF40XPo%EHlLn@m=VxYMdC42n2fjnT?*x0+xmOr(U#5|L-2q!(i%=pmtnR{VV5)`;9Js}hz}SEb6b-Mc|9r9pdm~A zool9Y!jh&}Je-Oeus*isqn00hwNiu$hNKw@CH=m<{}!#S_bq{A3mIBE z;Vx&d7LghZgpEzXRMZSaY}P(k6QZJFVk(xj#Z05uNXYhx2nD0j zo?vKmAQVUYRx{sVNvYQpUF!#@WAY}VGy*$S4CMn20>aTw9UeZPip8!FrdJR9M#Qh; z_j%irT2p~b>RY4n9=Uo}8=H)T5epeDopefl1okGdu(T1D!AtyVAU-dgNt+Rrd5M}> zr=;fF;rvCurf|5`-!c%1#(Pr+d(tmhNP~>nR)6=l0fXcBEpGK|>WXNvH`&sHp@d4^SbLgQvE&FT!(4mWHK^D^R$ygV0>34+^kpXkHk&LGjA>-^Fd^PCM z4u2>^@`mY&P_vXuU}7z+CsXUIgA{*XBpL>vZG@BY)@#-lz4`cj6Fy7$u-LI9C>Js` zIJpzsq_vCLw!ebTHQXuA-FLFJpj_{rFvV93OS|I(&G9X<)$#bmr1@-2bh`W;Bk)|99gI4y_oV7BR<<_#e3FnT%h`Ei+CV^c$A0-7n;Wd- zU%HL)Tqbos3u45gjo55=Jmg+)F&9C;=lJG=sP>=}9KlC5s3cv9O52S+*f zr~c!8Ws&#-uJw5R=0#1uKXMVT(q6RM$|I3WXw9#IvryKMMI&y`yAN2Ac-^A6;=+%I z`z<){Jqmxog41U!e7gm&n4|FbS#XyHziL4*u6Zf1&4L>&xYdH6*7U0s-)dZ=lK*83 z{s!07#Gk;mD&bAICMD!E0K$?+1!q~X!h$n#t?a53;!W5=I1Ta%E7mkE)z;Aso?WBhDCY{8o`e&P#AFBal+7Azwj_)ZJHZowY%qrIJcHA4J{ z1*=I1{-6cR$p?Iw1virqw3jS+6ZufTYr%!&!|_8F+yg#WgAjitTp~mtXfE75{FLxR zLaYLx3l9;#Pk#9H4}=Juw+JhRxEOvZDivZbA)e7>2;uW5EO-m%h4`x$d;{}C{70nY z*~_2cPr_Nafg;>#!DH`N_;l!Cdy@q>TJUogya4e~gd5QBvmfAVYzMrQ?bC%gK==V6 zZlHd^A6xKev;+7*U`&J`giVAmk^dUZE9rpO(GEaCI~U?viv=$s#QjetA!L4u`T@tN zAFzY%SdtqFLHo1?W7H44kMaQ@wcs_h1NcS@p0?l@XcyX(?0+rhnf(FpVn4t-@&UeN z!F$LL{BOxWA8|>3z&+##Y$YGyuPpcp@&o@MbQB@hYY4FeJWD!YoOHldY_Ad`NH`b! z03l-FlZ5cm*Env#L&UMUoFH6)=N#0}SfqaJgw2Gg8wn8um(sr%3-J*`EYO{VE+IZa zh`D%_5M$X-I0NgLut#?dU+?;7<(UN(I)m&*-} znA66gRgAyFpI^XX>9LaaqhwSi_YLmPxrez2vE&}cU_>7ej~;=9+{191=p*^)b3hNm zW>qGRM)ysWHJM+o?Hd1AuaMN2k~ zg)4@?ar&)XZupa@@H_7(PrX%?{+(;-@nq%jzq5CG#Fde3x%<=PP<@sjPyFgYn&MsQ zvGVnI+&&8ZUE^4nP`^y7pOyWjpw{Qj%d_cIO8@j>*_N5*$vu}Io3;M-(QJiBjpCNI z@MPui22VxS^msEBo`cOEdPD$99|6*1Vw_`1A9H7$Jr!WfpgG^PT{f`?cyjFF#!}6b z*<-t>BvYFgp6~q^Q+Uz4t?<%!Tj88{Tj9KSTVeg%RG1#CTz^ME#qWvH;m5HJVmUpD z-A9O95YC>1ZV%Up48U*U(^j=$Mc{(0bRDA5P`g^kr|4Yhgw9i#h(&ADfo z`zaW3v>nD<(|~cAm(eng<7kisxu3D=Q8sn3Y48j=Nz&XCa-442LHaA$2w%NqV)Mn3 z+`qh8)6si}9Vw%|%CGg>14mZ2j4NVok5$u;G z*dOI^AC?X&n1c$tJAET`Xt$^0j7}V7F?u5aM-VDf8hXB3vJcL#&^Ao6i)Jp=W~axz znNtYwr`_<8^fz_q!vR{Q3$+v0WS+TYZRQ7v!VN>uV)z4PyH_B*vSPU1(}_v-@I=xg zpuS$t-$9NIXBYR<|4N;J%jRdgJ?^}2E8gVxUXQ4rEQA<3YG4(fpJRRGO>2fQQwjr1 zjQx^4abA#65Uh#Z)gOqRXgVS zUfi@V1IyE+E=|I0awEt*l^GxZGNNqR22WM$#q`()%*5@Zaw63Jl0Mdeu3iQkG}U86 zslcFXv*twLK@N<`FX%&vTx|&q%|`*)3Yu+0%UqymBy&6qZIE7zxvfu+H83pXg0l8I z%scF9mosU4IvLEct2-0*tjk6{8?_v#L3-R)D1t0c@;XA{j&OEWN#@|tvpd?d%k8V@ zdP!T36}00n3@4oJbR&djLqY@MPUumAYj$Rq$M<~ZDa=yCc=wyRoTfRHtJzXhk5JVn zXT~w~b_~4}L+{35)?qsG!?(-en%K&%1M6jt+z__I4;!;jdhUlsa7}~ew!7gN=0)pL zZfGDGJ>^P2)8#u2!2v%67lRrg+KFZ_D;xi7Vpl-EPdleE6nT_m_cJ zU$*z_;Diod{RwNogrB^UmCMjNvp}6kAFG%x+Z#q#-)}eV1Fr{@Yv--hyqSY=b+fhK zQiojU$5SWRDgBHq&u0rYYvh<3XjQAzJ|CK#UsP(f>SozXtFZ1#T7K1wgr!Is@E8`5Ljxrrch?VY=& zUGtB=fOVnwazc4Mfsn0Y;Oh?D=MXmqOLS-itrc5aUj*&YC2o(5Rv-Zj94cZ`FUeP*RbEr~Ukgs;a=S*a$31Q~ zeVns+Dre3a{ss^Ab;;T2D+(xMLt;+p@CF4VNkuV z6Y_=W+Wf0I;P$t0!gRcF6V=rVlZntm=ab4%$ocS6Y*ue;nxavCcvCR3xoeAI4EW>y z1Hq7~+q*)+K_i9-s5hH^MuM&OS34H75f+;};)SH77_2wr@n~`ZhP7Zoy_2HTK zf~57PkW=X~+gw)_FB`xi?x4k?VHP_b9>F@|V{9dhq1Em=`IV^!I7)4f&PaOJXV7kRE`dn2kBw((uNXeuqax2UOf z#-8G)((<(1U+OLXT2W~^T1G)S&{XO^SPnK5^+`kzyRcNDejIf_+6LI5<)n)tqNuNQ z1{xs2jSDH>V?2&}8oYPHPV(-dPV#mZy?k+=`M?U^h18+hWZ}Jqmpb8V!_qxegr4_uyn8U-S?Ov1(t+YNuF_d(fypy4 z=#qml{TXztL>)jsFXkwXW8p7tT$y&SytioOp5h_{<2x`)U)&F#&w_{FCxB<;%Jj6A zd))0qMfVmLJ$Er=fv*iVHiA3?o}GB)z;7uywjuh$vZqPev(Ht$x9H+CE%MVp^e5xv zG~(kP96S8k2Y>pN^AFH1lD`)G8~!(!d!UeiMd?0Q(GFV&IRWH3U(S2rya&#E;JgRU zd*HkW{@;0k-?8ISL5>60kjK2d;rn&M`z^@#^QFKK0L}p9cb2>!=J%C&AS~ZyeqWCf-DUUa#;vj!y?q;@uW5TOP8ql)jvt1RxMYgcrgu{K&Al#vfDISGMQ{_#>Mj#E<|;5TfZ6X0W=c| z_UWTo+%&3tW2x$%6h4z$5D5#3^#zlCqB^`ShMo$V2}Kz+5=neCT7U#VOBhk|tAl~4 zDXQi7tkv@4z-swbYjq+nKO(6%`U0C0_2uP&RqDqiR0x53Gl{(5*r~mU~b&ANK%Oyc*9Jt(U$cpY*{s z(80qn>Hk-- z_Fn-X{jZDW`wkj3-!bqVn}Y9Y8{bLrot#21-#u{7s8{CtfbTetwLU`H@f@nw%kKil z7pnai&9ab>^#xST$368V_%Ox!qWKQn__(i?c=1dk&o!a{6|_-5?W=4=1z$Oib)h_# zqo~vivMl7g);cC2jg@;jW$CgCd~aw3kUT7ew&@gOi-p*U4T8@+a45%0JGh4I@|r&c zA8=t2vb)PJTCX zNH{{SLlzgJhI@*(&xI?2D&X2a7p@2x6JE<-McDao1kQNn6uO}AHb4(>&K&VRz{hO- z_Bf$_6ZCPL{$0Rdnu{M4mnai|4`|o_8Q_myO)BGdy7-zpl)ses1djNooRLNP_W(zL z4_NqVK)zAuGc(fpY>V?x6N%T_45YkP2i^tzF`PvC+>895buVzRKMhec3v-5M13wOb=$xgcz~?urcw$b} za^UtHraOS^LisTpPW@>cPWo4EIOzv%IO!$U-h)HA|MofXAqW0V2mS_dd(Kv=+M*~< z%3JNg?{eV(ZqL#Bm4jZQw!FOjs~mWZ1HaXQ4?6HK+i?2lNgGc8{MdoN=D^F< zmYcVy3V3CsL^1x?bG5|r&LfQ`=A7N?;Qu=Z{uKxQ69<0UfqQYH^4jz*=84NHw7<)N zZ+75&fmbz7#M^@o`r{7#r~`MaQ;O6`eKUdE$3F+SJ%?_Qji1Y)1NaQ+=d}cL_zWAJ z^6qiqKLoDNZ_L3Hp@f+N?-zrGkV&B)k<^olmH{nQ*GVf1B3R($Or{tXSQ2Q%gW&RHKh4 zw8(oMsiikm9fGO1wbynaKdW;o6113_6=1$!JCa`Vc}6nt?`+9MvIA0%bYfCda$77^ zAh5Ol=H*T8fj~0V6KD&Bti&bfOEKDGy{1Z7w)tvr2}UlQ3+E}Ej0gH;f}@@^ z?Z8M~eO)zj83F^LfZ3OdZLaRwDgw>7b~N48=AS$t<(!Eow!{zL+sNIUDwlHdT*tpm zx|ky$#hC`;$SR#QbyOu46{LzxovCxSl$3nN$zM6Oh#7&6jWVyq${^86X@%A~Q+r^a zBbQC(*PbhRHoqFqmP6{yrp%|+Se7CK#+wgAM*`lY2~GAS9fu4IB)@vzNlN9rk@8!Z zoM%s=lp*Wzz&TP7-*NWc+46ejuBlR_-*Hayv#IJ?9c<5V@C986Z?P+bdy{+u;NyFgWd9D-N73XM@{65DjIa`u#p{z+V3Y}v; zcNQ^I`mA$W!P#LVkSxXhG99t5X^j!VC!^NLmvnAp~PgNk9~In9O`hrc7qy%y$A* z7QrFd*=bnTy4@bzt@haV*sZ&@tzBvBcB6@~o}RYW9(!oDls(!uR9aDJOLx)P&*#1G zn|$X>0@l;|&+>BK-0yw&zI*Sx@4ol_d2@G5`wExKC3Gnk#e!J*=yv-mp^KIM0VJFSSd7}*u|}L){`ChVclX6! z`|r!zezWDxC-42)hrdYLVvF}eK$hJlqHT`*>GTozv~{E{LtT#gle_mcCekAp4m|kA z6W@OMzU|9fUO4v4;kh**+j05+Yd^Ai@1f8CyyVcG>ng6!{qw1j`mw=p4ZmLcn;*Yc zddu@4_z}7nls`%*swTKv+^d!2nD|c>N&XW5E)BH`@r5NCQ~VsSE|oaAP9uQCpL6Id zb@cCb(C66n%|!pO!@f_^$yT8~CWFB$#P71nXa9B?REmN0n1g=E(SMs_mA~ZA*z6&` z$)W!<4*Bo1IfVQdIOsPz#`_+}_?A2H3my8t7c*hw9mo+FAn;+gMOuh-f5d3+SB2nZ*`3C%MSay9rn$2(04oV3h2<~Y8=?M zGPxcOIrP1Z`5k$m5RXI7Ofg;j5O98@TJx8R*c7z0VMuShr9>SUI}{I z;@=3k^KXQ>$HM8;N2m;CrnpF40XPo%EHlLn@m=VxYMdC42n2fjnT?*x0+xmOr(U#5|L-2q!(i%=pmtnR{VV5)`;9Js}hz}SEb6b-Mc|9r9pdm~A zool9Y!jh&}Je-Oeus*isqn00hwNiu$hNKw@CH=m<{}!#S_bq{A3mIBE z;Vx&d7LghZgpEzXRMZSaY}P(k6QZJFVk(xj#Z05uNXYhx2nD0j zo?vKmAQVUYRx{sVNvYQpUF!#@WAY}VGy*$S4CMn20>aTw9UeZPip8!FrdJR9M#Qh; z_j%irT2p~b>RY4n9=Uo}8=H)T5epeDopefl1okGdu(T1D!AtyVAU-dgNt+Rrd5M}> zr=;fF;rvCurf|5`-!c%1#(Pr+d(tmhNP~>nR)6=l0fXcBEpGK|>WXNvH`&sHp@d4^SbLgQvE&FT!(4mWHK^D^R$ygV0>34+^kpXkHk&LGjA>-^Fd^PCM z4u2>^@`mY&P_vXuU}7z+CsXUIgA{*XBpL>vZG@BY)@#-lz4`cj6Fy7$u-LI9C>Js` zIJpzsq_vCLw!ebTHQXuA-FLFJpj_{rFvV93OS|I(&G9X<)$#bmr1@-2bh`W;Bk)|99gI4y_oV7BR<<_#e3FnT%h`Ei+CV^c$A0-7n;Wd- zU%HL)Tqbos3u45gjo55=Jmg+)F&9C;=lJG=sP>=}9KlC5s3cv9O52S+*f zr~c!8Ws&#-uJw5R=0#1uKXMVT(q6RM$|I3WXw9#IvryKMMI&y`yAN2Ac-^A6;=+%I z`z<){Jqmxog41U!e7gm&n4|FbS#XyHziL4*u6Zf1&4L>&xYdH6*7U0s-)dZ=lK*83 z{s!07#Gk;mD&bAICMD!E0K$?+1!q~X!h$n#t?a53;!W5=I1Ta%E7mkE)z;Aso?WBhDCY{8o`e&P#AFBal+7Azwj_)ZJHZowY%qrIJcHA4J{ z1*=I1{-6cR$p?Iw1virqw3jS+6ZufTYr%!&!|_8F+yg#WgAjitTp~mtXfE75{FLxR zLaYLx3l9;#Pk#9H4}=Juw+JhRxEOvZDivZbA)e7>2;uW5EO-m%h4`x$d;{}C{70nY z*~_2cPr_Nafg;>#!DH`N_;l!Cdy@q>TJUogya4e~gd5QBvmfAVYzMrQ?bC%gK==V6 zZlHd^A6xKev;+7*U`&J`giVAmk^dUZE9rpO(GEaCI~U?viv=$s#QjetA!L4u`T@tN zAFzY%SdtqFLHo1?W7H44kMaQ@wcs_h1NcS@p0?l@XcyX(?0+rhnf(FpVn4t-@&UeN z!F$LL{BOxWA8|>3z&+##Y$YGyuPpcp@&o@MbQB@hYY4FeJWD!YoOHldY_Ad`NH`b! z03l-FlZ5cm*Env#L&UMUoFH6)=N#0}SfqaJgw2Gg8wn8um(sr%3-J*`EYO{VE+IZa zh`D%_5M$X-I0NgLut#?dU+?;7<(UN(I)m&*-} znA66gRgAyFpI^XX>9LaaqhwSi_YLmPxrez2vE&}cU_>7ej~;=9+{191=p*^)b3hNm zW>qGRM)ysWHJM+o?Hd1AuaMN2k~ zg)4@?ar&)XZupa@@H_7(PrX%?{+(;-@nq%jzq5CG#Fde3x%<=PP<@sjPyFgYn&MsQ zvGVnI+&&8ZUE^4nP`^y7pOyWjpw{Qj%d_cIO8@j>*_N5*$vu}Io3;M-(QJiBjpCNI z@MPui22VxS^msEBo`cOEdPD$99|6*1Vw_`1A9H7$Jr!WfpgG^PT{f`?cyjFF#!}6b z*<-t>BvYFgp6~q^Q+Uz4t?<%!Tj88{Tj9KSTVeg%RG1#CTz^ME#qWvH;m5HJVmUpD z-A9O95YC>1ZV%Up48U*U(^j=$Mc{(0bRDA5P`g^kr|4Yhgw9i#h(&ADfo z`zaW3v>nD<(|~cAm(eng<7kisxu3D=Q8sn3Y48j=Nz&XCa-442LHaA$2w%NqV)Mn3 z+`qh8)6si}9Vw%|%CGg>14mZ2j4NVok5$u;G z*dOI^AC?X&n1c$tJAET`Xt$^0j7}V7F?u5aM-VDf8hXB3vJcL#&^Ao6i)Jp=W~axz znNtYwr`_<8^fz_q!vR{Q3$+v0WS+TYZRQ7v!VN>uV)z4PyH_B*vSPU1(}_v-@I=xg zpuS$t-$9NIXBYR<|4N;J%jRdgJ?^}2E8gVxUXQ4rEQA<3YG4(fpJRRGO>2fQQwjr1 zjQx^4abA#65Uh#Z)gOqRXgVS zUfi@V1IyE+E=|I0awEt*l^GxZGNNqR22WM$#q`()%*5@Zaw63Jl0Mdeu3iQkG}U86 zslcFXv*twLK@N<`FX%&vTx|&q%|`*)3Yu+0%UqymBy&6qZIE7zxvfu+H83pXg0l8I z%scF9mosU4IvLEct2-0*tjk6{8?_v#L3-R)D1t0c@;XA{j&OEWN#@|tvpd?d%k8V@ zdP!T36}00n3@4oJbR&djLqY@MPUumAYj$Rq$M<~ZDa=yCc=wyRoTfRHtJzXhk5JVn zXT~w~b_~4}L+{35)?qsG!?(-en%K&%1M6jt+z__I4;!;jdhUlsa7}~ew!7gN=0)pL zZfGDGJ>^P2)8#u2!2v%67lRrg+KFZ_D;xi7Vpl-EPdleE6nT_m_cJ zU$*z_;Diod{RwNogrB^UmCMjNvp}6kAFG%x+Z#q#-)}eV1Fr{@Yv--hyqSY=b+fhK zQiojU$5SWRDgBHq&u0rYYvh<3XjQAzJ|CK#UsP(f>SozXtFZ1#T7K1wgr!Is@E8`5Ljxrrch?VY=& zUGtB=fOVnwazc4Mfsn0Y;Oh?D=MXmqOLS-itrc5aUj*&YC2o(5Rv-Zj94cZ`FUeP*RbEr~Ukgs;a=S*a$31Q~ zeVns+Dre3a{ss^Ab;;T2D+(xMLt;+p@CF4VNkuV z6Y_=W+Wf0I;P$t0!gRcF6V=rVlZntm=ab4%$ocS6Y*ue;nxavCcvCR3xoeAI4EW>y z1Hq7~+q*)+K_i9-s5hH^MuM&OS34H75f+;};)SH77_2wr@n~`ZhP7Zoy_2HTK zf~57PkW=X~+gw)_FB`xi?x4k?VHP_b9>F@|V{9dhq1Em=`IV^!I7)4f&PaOJXV7kRE`dn2kBw((uNXeuqax2UOf z#-8G)((<(1U+OLXT2W~^T1G)S&{XO^SPnK5^+`kzyRcNDejIf_+6LI5<)n)tqNuNQ z1{xs2jSDH>V?2&}8oYPHPV(-dPV#mZy?k+=`M?U^h18+hWZ}Jqmpb8V!_qxegr4_uyn8U-S?Ov1(t+YNuF_d(fypy4 z=#qml{TXztL>)jsFXkwXW8p7tT$y&SytioOp5h_{<2x`)U)&F#&w_{FCxB<;%Jj6A zd))0qMfVmLJ$Er=fv*iVHiA3?o}GB)z;7uywjuh$vZqPev(Ht$x9H+CE%MVp^e5xv zG~(kP96S8k2Y>pN^AFH1lD`)G8~!(!d!UeiMd?0Q(GFV&IRWH3U(S2rya&#E;JgRU zd*HkW{@;0k-?8ISL5>60kjK2d;rn&M`z^@#^QFKK0L}p9cb2>!=J%C&AS~ZyeqWCf-DUUa#;vj!y?q;@uW5TOP8ql)jvt1RxMYgcrgu{K&Al#vfDISGMQ{_#>Mj#E<|;5TfZ6X0W=c| z_UWTo+%&3tW2x$%6h4z$5D5#3^#zlCqB^`ShMo$V2}Kz+5=neCT7U#VOBhk|tAl~4 zDXQi7tkv@4z-swbYjq+nKO(6%`U0C0_2uP&RqDqiR0x53Gl{(5*r~mU~b&ANK%Oyc*9Jt(U$cpY*{s z(80qn>Hk-- z_Fn-X{jZDW`wkj3-!bqVn}Y9Y8{bLrot#21-#u{7s8{CtfbTetwLU`H@f@nw%kKil z7pnai&9ab>^#xST$368V_%Ox!qWKQn__(i?c=1dk&o!a{6|_-5?W=4=1z$Oib)h_# zqo~vivMl7g);cC2jg@;jW$CgCd~aw3kUT7ew&@gOi-p*U4T8@+a45%0JGh4I@|r&c zA8=t2vb)PJTCX zNH{{SLlzgJhI@*(&xI?2D&X2a7p@2x6JE<-McDao1kQNn6uO}AHb4(>&K&VRz{hO- z_Bf$_6ZCPL{$0Rdnu{M4mnai|4`|o_8Q_myO)BGdy7-zpl)ses1djNooRLNP_W(zL z4_NqVK)zAuGc(fpY>V?x6N%T_45YkP2i^tzF`PvC+>895buVzRKMhec3v-5M13wOb=$xgcz~?urcw$b} za^UtHraOS^LisTpPW@>cPWo4EIOzv%IO!$U-h)HA|MofXAqW0V2mS_dd(Kv=+M*~< z%3JNg?{eV(ZqL#Bm4jZQw!FOjs~mWZ1HaXQ4?6HK+i?2lNgGc8{MdoN=D^F< zmYcVy3V3CsL^1x?bG5|r&LfQ`=A7N?;Qu=Z{uKxQ69<0UfqQYH^4jz*=84NHw7<)N zZ+75&fmbz7#M^@o`r{7#r~`MaQ;O6`eKUdE$3F+SJ%?_Qji1Y)1NaQ+=d}cL_zWAJ z^6qiqKLoDNZ_L3Hp@f+N?-zrGkV&B)k<^olmH{nQ*GVf1B3R($Or{tXSQ2Q%gW&RHKh4 zw8(oMsiikm9fGO1wbynaKdW;o6113_6=1$!JCa`Vc}6nt?`+9MvIA0%bYfCda$77^ zAh5Ol=H*T8fj~0V6KD&Bti&bfOEKDGy{1Z7w)tvr2}UlQ3+E}Ej0gH;f}@@^ z?Z8M~eO)zj83F^LfZ3OdZLaRwDgw>7b~N48=AS$t<(!Eow!{zL+sNIUDwlHdT*tpm zx|ky$#hC`;$SR#QbyOu46{LzxovCxSl$3nN$zM6Oh#7&6jWVyq${^86X@%A~Q+r^a zBbQC(*PbhRHoqFqmP6{yrp%|+Se7CK#+wgAM*`lY2~GAS9fu4IB)@vzNlN9rk@8!Z zoM%s=lp*Wzz&TP7-*NWc+46ejuBlR_-*Hayv#IJ?9c<5V@C986Z?P+bdy{+u;NyFgWd9D-N73XM@{65DjIa`u#p{z+V3Y}v; zcNQ^I`mA$W!P#LVkSxXhG99t5X^j!VC!^NLmvnAp~PgNk9~In9O`hrc7qy%y$A* z7QrFd*=bnTy4@bzt@haV*sZ&@tzBvBcB6@~o}RYW9(!oDls(!uR9aDJOLx)P&*#1G zn|$X>0@l;|&+>BK-0yw&zI*Sx@4ol_d2@G5`wExKC3Gnk#e!J*=yv-mp^KIM0VJFSSd7}*u|}L){`ChVclX6! z`|r!zezWDxC-42)hrdYLVvF}eK$hJlqHT`*>GTozv~{E{LtT#gle_mcCekAp4m|kA z6W@OMzU|9fUO4v4;kh**+j05+Yd^Ai@1f8CyyVcG>ng6!{qw1j`mw=p4ZmLcn;*Yc zddu@4_z}7nls`%*swTKv+^d!2nD|c>N&XW5E)BH`@r5NCQ~VsSE|oaAP9uQCpL6Id zb@cCb(C66n%|!pO!@f_^$yT8~CWFB$#P71nXa9B?REmN0n1g=E(SMs_mA~ZA*z6&` z$)W!<4*Bo1IfVQdIOsPz#`_+}_?A2H3my8t7c*hw9mo+FAn;+gMOuh-f5d3+SB2nZ*`3C%MSay9rn$2(04oV3h2<~Y8=?M zGPxcOIrP1Z`5k$m5RXI7Ofg;j5O98@TJx8R*c7z0VMuShr9>SUI}{I z;@=3k^KXQ>$HM8;N2m;CrnpF40XPo%EHlLn@m=VxYMdC42n2fjnT?*x0+xmOr(U#5|L-2q!(i%=pmtnR{VV5)`;9Js}hz}SEb6b-Mc|9r9pdm~A zool9Y!jh&}Je-Oeus*isqn00hwNiu$hNKw@CH=m<{}!#S_bq{A3mIBE z;Vx&d7LghZgpEzXRMZSaY}P(k6QZJFVk(xj#Z05uNXYhx2nD0j zo?vKmAQVUYRx{sVNvYQpUF!#@WAY}VGy*$S4CMn20>aTw9UeZPip8!FrdJR9M#Qh; z_j%irT2p~b>RY4n9=Uo}8=H)T5epeDopefl1okGdu(T1D!AtyVAU-dgNt+Rrd5M}> zr=;fF;rvCurf|5`-!c%1#(Pr+d(tmhNP~>nR)6=l0fXcBEpGK|>WXNvH`&sHp@d4^SbLgQvE&FT!(4mWHK^D^R$ygV0>34+^kpXkHk&LGjA>-^Fd^PCM z4u2>^@`mY&P_vXuU}7z+CsXUIgA{*XBpL>vZG@BY)@#-lz4`cj6Fy7$u-LI9C>Js` zIJpzsq_vCLw!ebTHQXuA-FLFJpj_{rFvV93OS|I(&G9X<)$#bmr1@-2bh`W;Bk)|99gI4y_oV7BR<<_#e3FnT%h`Ei+CV^c$A0-7n;Wd- zU%HL)Tqbos3u45gjo55=Jmg+)F&9C;=lJG=sP>=}9KlC5s3cv9O52S+*f zr~c!8Ws&#-uJw5R=0#1uKXMVT(q6RM$|I3WXw9#IvryKMMI&y`yAN2Ac-^A6;=+%I z`z<){Jqmxog41U!e7gm&n4|FbS#XyHziL4*u6Zf1&4L>&xYdH6*7U0s-)dZ=lK*83 z{s!07#Gk;mD&bAICMD!E0K$?+1!q~X!h$n#t?a53;!W5=I1Ta%E7mkE)z;Aso?WBhDCY{8o`e&P#AFBal+7Azwj_)ZJHZowY%qrIJcHA4J{ z1*=I1{-6cR$p?Iw1virqw3jS+6ZufTYr%!&!|_8F+yg#WgAjitTp~mtXfE75{FLxR zLaYLx3l9;#Pk#9H4}=Juw+JhRxEOvZDivZbA)e7>2;uW5EO-m%h4`x$d;{}C{70nY z*~_2cPr_Nafg;>#!DH`N_;l!Cdy@q>TJUogya4e~gd5QBvmfAVYzMrQ?bC%gK==V6 zZlHd^A6xKev;+7*U`&J`giVAmk^dUZE9rpO(GEaCI~U?viv=$s#QjetA!L4u`T@tN zAFzY%SdtqFLHo1?W7H44kMaQ@wcs_h1NcS@p0?l@XcyX(?0+rhnf(FpVn4t-@&UeN z!F$LL{BOxWA8|>3z&+##Y$YGyuPpcp@&o@MbQB@hYY4FeJWD!YoOHldY_Ad`NH`b! z03l-FlZ5cm*Env#L&UMUoFH6)=N#0}SfqaJgw2Gg8wn8um(sr%3-J*`EYO{VE+IZa zh`D%_5M$X-I0NgLut#?dU+?;7<(UN(I)m&*-} znA66gRgAyFpI^XX>9LaaqhwSi_YLmPxrez2vE&}cU_>7ej~;=9+{191=p*^)b3hNm zW>qGRM)ysWHJM+o?Hd1AuaMN2k~ zg)4@?ar&)XZupa@@H_7(PrX%?{+(;-@nq%jzq5CG#Fde3x%<=PP<@sjPyFgYn&MsQ zvGVnI+&&8ZUE^4nP`^y7pOyWjpw{Qj%d_cIO8@j>*_N5*$vu}Io3;M-(QJiBjpCNI z@MPui22VxS^msEBo`cOEdPD$99|6*1Vw_`1A9H7$Jr!WfpgG^PT{f`?cyjFF#!}6b z*<-t>BvYFgp6~q^Q+Uz4t?<%!Tj88{Tj9KSTVeg%RG1#CTz^ME#qWvH;m5HJVmUpD z-A9O95YC>1ZV%Up48U*U(^j=$Mc{(0bRDA5P`g^kr|4Yhgw9i#h(&ADfo z`zaW3v>nD<(|~cAm(eng<7kisxu3D=Q8sn3Y48j=Nz&XCa-442LHaA$2w%NqV)Mn3 z+`qh8)6si}9Vw%|%CGg>14mZ2j4NVok5$u;G z*dOI^AC?X&n1c$tJAET`Xt$^0j7}V7F?u5aM-VDf8hXB3vJcL#&^Ao6i)Jp=W~axz znNtYwr`_<8^fz_q!vR{Q3$+v0WS+TYZRQ7v!VN>uV)z4PyH_B*vSPU1(}_v-@I=xg zpuS$t-$9NIXBYR<|4N;J%jRdgJ?^}2E8gVxUXQ4rEQA<3YG4(fpJRRGO>2fQQwjr1 zjQx^4abA#65Uh#Z)gOqRXgVS zUfi@V1IyE+E=|I0awEt*l^GxZGNNqR22WM$#q`()%*5@Zaw63Jl0Mdeu3iQkG}U86 zslcFXv*twLK@N<`FX%&vTx|&q%|`*)3Yu+0%UqymBy&6qZIE7zxvfu+H83pXg0l8I z%scF9mosU4IvLEct2-0*tjk6{8?_v#L3-R)D1t0c@;XA{j&OEWN#@|tvpd?d%k8V@ zdP!T36}00n3@4oJbR&djLqY@MPUumAYj$Rq$M<~ZDa=yCc=wyRoTfRHtJzXhk5JVn zXT~w~b_~4}L+{35)?qsG!?(-en%K&%1M6jt+z__I4;!;jdhUlsa7}~ew!7gN=0)pL zZfGDGJ>^P2)8#u2!2v%67lRrg+KFZ_D;xi7Vpl-EPdleE6nT_m_cJ zU$*z_;Diod{RwNogrB^UmCMjNvp}6kAFG%x+Z#q#-)}eV1Fr{@Yv--hyqSY=b+fhK zQiojU$5SWRDgBHq&u0rYYvh<3XjQAzJ|CK#UsP(f>SozXtFZ1#T7K1wgr!Is@E8`5Ljxrrch?VY=& zUGtB=fOVnwazc4Mfsn0Y;Oh?D=MXmqOLS-itrc5aUj*&YC2o(5Rv-Zj94cZ`FUeP*RbEr~Ukgs;a=S*a$31Q~ zeVns+Dre3a{ss^Ab;;T2D+(xMLt;+p@CF4VNkuV z6Y_=W+Wf0I;P$t0!gRcF6V=rVlZntm=ab4%$ocS6Y*ue;nxavCcvCR3xoeAI4EW>y z1Hq7~+q*)+K_i9-s5hH^MuM&OS34H75f+;};)SH77_2wr@n~`ZhP7Zoy_2HTK zf~57PkW=X~+gw)_FB`xi?x4k?VHP_b9>F@|V{9dhq1Em=`IV^!I7)4f&PaOJXV7kRE`dn2kBw((uNXeuqax2UOf z#-8G)((<(1U+OLXT2W~^T1G)S&{XO^SPnK5^+`kzyRcNDejIf_+6LI5<)n)tqNuNQ z1{xs2jSDH>V?2&}8oYPHPV(-dPV#mZy?k+=`M?U^h18+hWZ}Jqmpb8V!_qxegr4_uyn8U-S?Ov1(t+YNuF_d(fypy4 z=#qml{TXztL>)jsFXkwXW8p7tT$y&SytioOp5h_{<2x`)U)&F#&w_{FCxB<;%Jj6A zd))0qMfVmLJ$Er=fv*iVHiA3?o}GB)z;7uywjuh$vZqPev(Ht$x9H+CE%MVp^e5xv zG~(kP96S8k2Y>pN^AFH1lD`)G8~!(!d!UeiMd?0Q(GFV&IRWH3U(S2rya&#E;JgRU zd*HkW{@;0k-?8ISL5>60kjK2d;rn&M`z^@#^QFKK0L}p9cb2>!=J%C&AS~ZyeqWCf-DUUa#;vj!y?q;@uW5TOP8ql)jvt1RxMYgcrgu{K&Al#vfDISGMQ{_#>Mj#E<|;5TfZ6X0W=c| z_UWTo+%&3tW2x$%6h4z$5D5#3^#zlCqB^`ShMo$V2}Kz+5=neCT7U#VOBhk|tAl~4 zDXQi7tkv@4z-swbYjq+nKO(6%`U0C0_2uP&RqDqiR0x53Gl{(5*r~mU~b&ANK%Oyc*9Jt(U$cpY*{s z(80qn>Hk-- z_Fn-X{jZDW`wkj3-!bqVn}Y9Y8{bLrot#21-#u{7s8{CtfbTetwLU`H@f@nw%kKil z7pnai&9ab>^#xST$368V_%Ox!qWKQn__(i?c=1dk&o!a{6|_-5?W=4=1z$Oib)h_# zqo~vivMl7g);cC2jg@;jW$CgCd~aw3kUT7ew&@gOi-p*U4T8@+a45%0JGh4I@|r&c zA8=t2vb)PJTCX zNH{{SLlzgJhI@*(&xI?2D&X2a7p@2x6JE<-McDao1kQNn6uO}AHb4(>&K&VRz{hO- z_Bf$_6ZCPL{$0Rdnu{M4mnai|4`|o_8Q_myO)BGdy7-zpl)ses1djNooRLNP_W(zL z4_NqVK)zAuGc(fpY>V?x6N%T_45YkP2i^tzF`PvC+>895buVzRKMhec3v-5M13wOb=$xgcz~?urcw$b} za^UtHraOS^LisTpPW@>cPWo4EIOzv%IO!$U-h)HA|MofXAqW0V2mS_dd(Kv=+M*~< z%3JNg?{eV(ZqL#Bm4jZQw!FOjs~mWZ1HaXQ4?6HK+i?2lNgGc8{MdoN=D^F< zmYcVy3V3CsL^1x?bG5|r&LfQ`=A7N?;Qu=Z{uKxQ69<0UfqQYH^4jz*=84NHw7<)N zZ+75&fmbz7#M^@o`r{7#r~`MaQ;O6`eKUdE$3F+SJ%?_Qji1Y)1NaQ+=d}cL_zWAJ z^6qiqKLoDNZ_L3Hp@f+N?-zrGkV&B)k<^olmH{nQ*GVf1B3R($Or{tXSQ2Q%gW&RHKh4 zw8(oMsiikm9fGO1wbynaKdW;o6113_6=1$!JCa`Vc}6nt?`+9MvIA0%bYfCda$77^ zAh5Ol=H*T8fj~0V6KD&Bti&bfOEKDGy{1Z7w)tvr2}UlQ3+E}Ej0gH;f}@@^ z?Z8M~eO)zj83F^LfZ3OdZLaRwDgw>7b~N48=AS$t<(!Eow!{zL+sNIUDwlHdT*tpm zx|ky$#hC`;$SR#QbyOu46{LzxovCxSl$3nN$zM6Oh#7&6jWVyq${^86X@%A~Q+r^a zBbQC(*PbhRHoqFqmP6{yrp%|+Se7CK#+wgAM*`lY2~GAS9fu4IB)@vzNlN9rk@8!Z zoM%s=lp*Wzz&TP7-*NWc+46ejuBlR_-*Hayv#IJ?9c<5V@C986Z?P+bdy{+u;NyFgWd9D-N73XM@{65DjIa`u#p{z+V3Y}v; zcNQ^I`mA$W!P#LVkSxXhG99t5X^j!VC!^NLmvnAp~PgNk9~In9O`hrc7qy%y$A* z7QrFd*=bnTy4@bzt@haV*sZ&@tzBvBcB6@~o}RYW9(!oDls(!uR9aDJOLx)P&*#1G zn|$X>0@l;|&+>BK-0yw&zI*Sx@4ol_d2@G5`wExKC3Gnk#e!J*=yv-mp^KIM0VJFSSd7}*u|}L){`ChVclX6! z`|r!zezWDxC-42)hrdYLVvF}eK$hJlqHT`*>GTozv~{E{LtT#gle_mcCekAp4m|kA z6W@OMzU|9fUO4v4;kh**+j05+Yd^Ai@1f8CyyVcG>ng6!{qw1j`mw=p4ZmLcn;*Yc zddu@4_z}7nls`%*swTKv+^d!2nD|c>N&XW5E)BH`@r5NCQ~VsSE|oaAP9uQCpL6Id zb@cCb(C66n%|!pO!@f_^$yT8~CWFB$#P71nXa9B?REmN0n1g=E(SMs_mA~ZA*z6&` z$)W!<4*Bo1IfVQdIOsPz#`_+}_?A2H3my8t7c*hw9mo+FAn;+gMOuh-f5d3+SB2nZ*`3C%MSay9rn$2(04oV3h2<~Y8=?M zGPxcOIrP1Z`5k$m5RXI7Ofg;j5O98@TJx8R*c7z0VMuShr9>SUI}{I z;@=3k^KXQ>$HM8;N2m;CrnpF40XPo%EHlLn@m=VxYMdC42n2fjnT?*x0+xmOr(U#5|L-2q!(i%=pmtnR{VV5)`;9Js}hz}SEb6b-Mc|9r9pdm~A zool9Y!jh&}Je-Oeus*isqn00hwNiu$hNKw@CH=m<{}!#S_bq{A3mIBE z;Vx&d7LghZgpEzXRMZSaY}P(k6QZJFVk(xj#Z05uNXYhx2nD0j zo?vKmAQVUYRx{sVNvYQpUF!#@WAY}VGy*$S4CMn20>aTw9UeZPip8!FrdJR9M#Qh; z_j%irT2p~b>RY4n9=Uo}8=H)T5epeDopefl1okGdu(T1D!AtyVAU-dgNt+Rrd5M}> zr=;fF;rvCurf|5`-!c%1#(Pr+d(tmhNP~>nR)6=l0fXcBEpGK|>WXNvH`&sHp@d4^SbLgQvE&FT!(4mWHK^D^R$ygV0>34+^kpXkHk&LGjA>-^Fd^PCM z4u2>^@`mY&P_vXuU}7z+CsXUIgA{*XBpL>vZG@BY)@#-lz4`cj6Fy7$u-LI9C>Js` zIJpzsq_vCLw!ebTHQXuA-FLFJpj_{rFvV93OS|I(&G9X<)$#bmr1@-2bh`W;Bk)|99gI4y_oV7BR<<_#e3FnT%h`Ei+CV^c$A0-7n;Wd- zU%HL)Tqbos3u45gjo55=Jmg+)F&9C;=lJG=sP>=}9KlC5s3cv9O52S+*f zr~c!8Ws&#-uJw5R=0#1uKXMVT(q6RM$|I3WXw9#IvryKMMI&y`yAN2Ac-^A6;=+%I z`z<){Jqmxog41U!e7gm&n4|FbS#XyHziL4*u6Zf1&4L>&xYdH6*7U0s-)dZ=lK*83 z{s!07#Gk;mD&bAICMD!E0K$?+1!q~X!h$n#t?a53;!W5=I1Ta%E7mkE)z;Aso?WBhDCY{8o`e&P#AFBal+7Azwj_)ZJHZowY%qrIJcHA4J{ z1*=I1{-6cR$p?Iw1virqw3jS+6ZufTYr%!&!|_8F+yg#WgAjitTp~mtXfE75{FLxR zLaYLx3l9;#Pk#9H4}=Juw+JhRxEOvZDivZbA)e7>2;uW5EO-m%h4`x$d;{}C{70nY z*~_2cPr_Nafg;>#!DH`N_;l!Cdy@q>TJUogya4e~gd5QBvmfAVYzMrQ?bC%gK==V6 zZlHd^A6xKev;+7*U`&J`giVAmk^dUZE9rpO(GEaCI~U?viv=$s#QjetA!L4u`T@tN zAFzY%SdtqFLHo1?W7H44kMaQ@wcs_h1NcS@p0?l@XcyX(?0+rhnf(FpVn4t-@&UeN z!F$LL{BOxWA8|>3z&+##Y$YGyuPpcp@&o@MbQB@hYY4FeJWD!YoOHldY_Ad`NH`b! z03l-FlZ5cm*Env#L&UMUoFH6)=N#0}SfqaJgw2Gg8wn8um(sr%3-J*`EYO{VE+IZa zh`D%_5M$X-I0NgLut#?dU+?;7<(UN(I)m&*-} znA66gRgAyFpI^XX>9LaaqhwSi_YLmPxrez2vE&}cU_>7ej~;=9+{191=p*^)b3hNm zW>qGRM)ysWHJM+o?Hd1AuaMN2k~ zg)4@?ar&)XZupa@@H_7(PrX%?{+(;-@nq%jzq5CG#Fde3x%<=PP<@sjPyFgYn&MsQ zvGVnI+&&8ZUE^4nP`^y7pOyWjpw{Qj%d_cIO8@j>*_N5*$vu}Io3;M-(QJiBjpCNI z@MPui22VxS^msEBo`cOEdPD$99|6*1Vw_`1A9H7$Jr!WfpgG^PT{f`?cyjFF#!}6b z*<-t>BvYFgp6~q^Q+Uz4t?<%!Tj88{Tj9KSTVeg%RG1#CTz^ME#qWvH;m5HJVmUpD z-A9O95YC>1ZV%Up48U*U(^j=$Mc{(0bRDA5P`g^kr|4Yhgw9i#h(&ADfo z`zaW3v>nD<(|~cAm(eng<7kisxu3D=Q8sn3Y48j=Nz&XCa-442LHaA$2w%NqV)Mn3 z+`qh8)6si}9Vw%|%CGg>14mZ2j4NVok5$u;G z*dOI^AC?X&n1c$tJAET`Xt$^0j7}V7F?u5aM-VDf8hXB3vJcL#&^Ao6i)Jp=W~axz znNtYwr`_<8^fz_q!vR{Q3$+v0WS+TYZRQ7v!VN>uV)z4PyH_B*vSPU1(}_v-@I=xg zpuS$t-$9NIXBYR<|4N;J%jRdgJ?^}2E8gVxUXQ4rEQA<3YG4(fpJRRGO>2fQQwjr1 zjQx^4abA#65Uh#Z)gOqRXgVS zUfi@V1IyE+E=|I0awEt*l^GxZGNNqR22WM$#q`()%*5@Zaw63Jl0Mdeu3iQkG}U86 zslcFXv*twLK@N<`FX%&vTx|&q%|`*)3Yu+0%UqymBy&6qZIE7zxvfu+H83pXg0l8I z%scF9mosU4IvLEct2-0*tjk6{8?_v#L3-R)D1t0c@;XA{j&OEWN#@|tvpd?d%k8V@ zdP!T36}00n3@4oJbR&djLqY@MPUumAYj$Rq$M<~ZDa=yCc=wyRoTfRHtJzXhk5JVn zXT~w~b_~4}L+{35)?qsG!?(-en%K&%1M6jt+z__I4;!;jdhUlsa7}~ew!7gN=0)pL zZfGDGJ>^P2)8#u2!2v%67lRrg+KFZ_D;xi7Vpl-EPdleE6nT_m_cJ zU$*z_;Diod{RwNogrB^UmCMjNvp}6kAFG%x+Z#q#-)}eV1Fr{@Yv--hyqSY=b+fhK zQiojU$5SWRDgBHq&u0rYYvh<3XjQAzJ|CK#UsP(f>SozXtFZ1#T7K1wgr!Is@E8`5Ljxrrch?VY=& zUGtB=fOVnwazc4Mfsn0Y;Oh?D=MXmqOLS-itrc5aUj*&YC2o(5Rv-Zj94cZ`FUeP*RbEr~Ukgs;a=S*a$31Q~ zeVns+Dre3a{ss^Ab;;T2D+(xMLt;+p@CF4VNkuV z6Y_=W+Wf0I;P$t0!gRcF6V=rVlZntm=ab4%$ocS6Y*ue;nxavCcvCR3xoeAI4EW>y z1Hq7~+q*)+K_i9-s5hH^MuM&OS34H75f+;};)SH77_2wr@n~`ZhP7Zoy_2HTK zf~57PkW=X~+gw)_FB`xi?x4k?VHP_b9>F@|V{9dhq1Em=`IV^!I7)4f&PaOJXV7kRE`dn2kBw((uNXeuqax2UOf z#-8G)((<(1U+OLXT2W~^T1G)S&{XO^SPnK5^+`kzyRcNDejIf_+6LI5<)n)tqNuNQ z1{xs2jSDH>V?2&}8oYPHPV(-dPV#mZy?k+=`M?U^h18+hWZ}Jqmpb8V!_qxegr4_uyn8U-S?Ov1(t+YNuF_d(fypy4 z=#qml{TXztL>)jsFXkwXW8p7tT$y&SytioOp5h_{<2x`)U)&F#&w_{FCxB<;%Jj6A zd))0qMfVmLJ$Er=fv*iVHiA3?o}GB)z;7uywjuh$vZqPev(Ht$x9H+CE%MVp^e5xv zG~(kP96S8k2Y>pN^AFH1lD`)G8~!(!d!UeiMd?0Q(GFV&IRWH3U(S2rya&#E;JgRU zd*HkW{@;0k-?8ISL5>60kjK2d;rn&M`z^@#^QFKK0L}p9cb2>!=J%C&AS~ZyeqWCf-DUUa#;vj!y?q;@uW5TOP8ql)jvt1RxMYgcrgu{K&Al#vfDISGMQ{_#>Mj#E<|;5TfZ6X0W=c| z_UWTo+%&3tW2x$%6h4z$5D5#3^#zlCqB^`ShMo$V2}Kz+5=neCT7U#VOBhk|tAl~4 zDXQi7tkv@4z-swbYjq+nKO(6%`U0C0_2uP&RqDqiR0x53Gl{(5*r~mU~b&ANK%Oyc*9Jt(U$cpY*{s z(80qn>Hk-- z_Fn-X{jZDW`wkj3-!bqVn}Y9Y8{bLrot#21-#u{7s8{CtfbTetwLU`H@f@nw%kKil z7pnai&9ab>^#xST$368V_%Ox!qWKQn__(i?c=1dk&o!a{6|_-5?W=4=1z$Oib)h_# zqo~vivMl7g);cC2jg@;jW$CgCd~aw3kUT7ew&@gOi-p*U4T8@+a45%0JGh4I@|r&c zA8=t2vb)PJTCX zNH{{SLlzgJhI@*(&xI?2D&X2a7p@2x6JE<-McDao1kQNn6uO}AHb4(>&K&VRz{hO- z_Bf$_6ZCPL{$0Rdnu{M4mnai|4`|o_8Q_myO)BGdy7-zpl)ses1djNooRLNP_W(zL z4_NqVK)zAuGc(fpY>V?x6N%T_45YkP2i^tzF`PvC+>895buVzRKMhec3v-5M13wOb=$xgcz~?urcw$b} za^UtHraOS^LisTpPW@>cPWo4EIOzv%IO!$U-h)HA|MofXAqW0V2mS_dd(Kv=+M*~< z%3JNg?{eV(ZqL#Bm4jZQw!FOjs~mWZ1HaXQ4?6HK+i?2lNgGc8{MdoN=D^F< zmYcVy3V3CsL^1x?bG5|r&LfQ`=A7N?;Qu=Z{uKxQ69<0UfqQYH^4jz*=84NHw7<)N zZ+75&fmbz7#M^@o`r{7#r~`MaQ;O6`eKUdE$3F+SJ%?_Qji1Y)1NaQ+=d}cL_zWAJ z^6qiqKLoDNZ_L3Hp@f+N?-zrGkV&B)k<^olmH{nQ*GVf1B3R($Or{tXSQ2Q%gW&RHKh4 zw8(oMsiikm9fGO1wbynaKdW;o6113_6=1$!JCa`Vc}6nt?`+9MvIA0%bYfCda$77^ zAh5Ol=H*T8fj~0V6KD&Bti&bfOEKDGy{1Z7w)tvr2}UlQ3+E}Ej0gH;f}@@^ z?Z8M~eO)zj83F^LfZ3OdZLaRwDgw>7b~N48=AS$t<(!Eow!{zL+sNIUDwlHdT*tpm zx|ky$#hC`;$SR#QbyOu46{LzxovCxSl$3nN$zM6Oh#7&6jWVyq${^86X@%A~Q+r^a zBbQC(*PbhRHoqFqmP6{yrp%|+Se7CK#+wgAM*`lY2~GAS9fu4IB)@vzNlN9rk@8!Z zoM%s=lp*Wzz&TP7-*NWc+46ejuBlR_-*Hayv#IJ?9c<5V@C986Z?P+bdy{+u;NyFgWd9D-N73XM@{65DjIa`u#p{z+V3Y}v; zcNQ^I`mA$W!P#LVkaD`dL{-wtP^;72R~H5}-<5k=gI}-ghT& zUXvF2xcX0TKR4%{d(J)Q+;h*p@4olu^nLA}9WIwk=u#*O1+l7&glGV4_9{w)s1oOk zYVjsmR-RKhQm|yd<5dn&4`2msXBz;!h}&{7d}1G}J1@mltVF@pHVoRN>-kjQ|pV#G$Xm z(SOiEUux6082v*I`#wS^TZQ(R3=>LLEq>Y?-IxO);jR>9s2&sVbA3bdCML8S{>u7vf=d4-8P)|HaX-U zb=Xtop#RuupM(E%4*HCPeu;zLZJQt3)8(L#ImY){hy8sH`>t@%_d4)O=+NadT-dfU zxgL%=^!))wHNJ{{~SZZUcSx5(-lEgBVX8=qzR8`Rtc~SG7n~ z;;%#hV&L2_-XNBUcawCn5Whw{<@ZC*)MY|EfM(*~177xK^s(fB%^~j}(Z2spLL@By z9e`En|1k@vPY+NT%3|?4suBm@CQ;zU;=9mW-7+^G;r9;?M@Re#GY~iZe&G*~giYZe z001dC7T{$d5`M2C{MU^7dyK(w!ZhN(NFb3g62gCD!v=KdS~1$xxIQoviWnQZdi{;p z_1|m+&GzBUS=|~ROb#0(W`YE^cpE#CBSAA99qBWMW08Pq)OQ)X+Pga_ zWlrGA&4EbLfIP_Q_1na>_tyKndcA&XUELcV90{1oI2jj|@Aa-TOs%wi)Z%OGHRIut z!PQXSyL-4l8fov|7=#C;k=AhPdkwRF0lTCbe($R8cr<3j&E2gg_gNCf~b#Ge8 z39DKM;Ldfv`5fe3*~?kk+ytou;fN8Rm#LxGjKtrglUEgNgQb4BgVcdeaCd zCOl$iUXBk9ZpEfH<=q+!9FP5}|xeM{Of}`w>Y6&2@+-&L;x{np@9Zfnh^+pO19~mwsf}5mJ0Z;YbL4wh_+9+oW0B_2%RC&iO3v#bU>fpj^n%;N;G2 zlh!U~+y3%8*K?;hd*Auif^vP`oGIQ0SlSnjwMBQ0^hBd`ljgNCHMSWM1AAa@8Li;{ zpm#Ix3hqjJM_OcpuT$JSXkn_lZvj>=Te;yk* zFmfs1OL{#GUKbCWIns~uAZTo(?E3;*MB zvOs(WXFZQEDJ3BQh~v?r~$vT*qIwC2BovryKAMI&xrc{i{E@w`RffrB3}pRi!h z5`}-?f^8KF|BeMWFID(<3m&xKa~2%KnV0fDWWmo^aLR&DYx<>%?*PuI)marFR zYQpPrRwewS1^Etucu|XjTMQ$$$~NR;rizm{AcjHnuVxBn`@O2|3HX`hsB_~-YGGT z4!E3l05;POKrd_|{7(y3lK*Y+8~Fe~L_WY4wl5drZ!Gv8LOlNr5kmG7%17;`e!!2g z9ZT|lLX7EY3mzjM@PDOzz+%b={3iPmryYQwvfvizCjKq<8FPe!$zIvjDNbpAb7jm~_CmkPi4| zwpR=BZ-iF}@l!&?3SP{K0*tAdasjU;j?HE#;W8n9K!}(dpnmL(pCLq@B1FvWqCYMW z;_HN1urq`%Ax;uvPM2{0F_yOy77H;*SOEJi_(j6ELmr_=h@TN&i8!D=*y)xME)wEP zgm}r+&T+i~ekCl0zITHc??O%x;vK^*;R+!tTCfh*2n2!<=Y#GhM0;=QM9~bI#nwHC z>me_bI+@L8C#K9rGteq#p5dQQmI#rWF4}sSjH+ZG;C`LGk9!hJ_C5?o4Ds^#(~yw8 zk2~}b$;Tf7dK5ORGIw=&|6JLW{^jQ0nJ~Nllk; zz3FhK(xXPP>H5uZWzA&7Q<>T3X-U_3j<$K|5&O84f0O!kuaJR8Ee2D$>oK zG)T7Qib>N`o^GIoBJgI}^D)FN*vf2dW$DVC5|D}@uskQ}RT?mla);t4{#uHE{?}4` z{I8|>_kS71jJf>aD#Au%3#{_=xTh#TxUBG;uGzZXe-k7AMf>6fem$b!bJXqOnv$Zv zft!~|ANEeAfA-?%5$9#;OA(-TX23a0Z0h_qI0GkOj6&YVu>Qq7LUat$=z^TI0y+!iERl4`< zpks~IP_$lPqwoRTqEyJ$S%byYkn!b~;lxzw#K)Be_utvLGriSnIoG87JZ^Mqnr!n_ z=gd9fp6r7hHuZVRGPoy6BZ~_G!Q2dH4=6>7f^L+e&A=>JgKpcp{qW@IX=V?=kmGF_ z#N>llP;%;&%X}lo<>q*f-#~)g2iY{vrVcipF2_fj+(?xir+d0c{|PowYs;3~U0ufX zv`udFRAt7o7n{ zeH;MXQK380t$m&fG?m-^;+;~2^3ytVl=LeCQ6O}rR7~o#Mf)M6(k_;0<=n=bK3|)k znyyQqLX;nJ!`D~P-<9^T=<`%c7j8;Fbp7V^zat9ACmzmx+p`~9OZVQ22+Ig~q!X5G z;cx)AS#Sp-X1tE~q;^t5vIWzPYkBJgjL0@U?J^KMm8DxUTt6704i4a*unkSyWD~}? z9%K9|7LSc(ecF^!xdY@jkilM)Blmf@h-xHDpC<%zjzn%Ld`LFgy`{pv6Otkj+G6k3 z=V?JxGxgZQ7%O0ljQ&0u?@b_MsKq#k2<$a(hQHRUojoxH@eQ}tc%R(Qc}QbWslzT! zMOf7F-gPiNGjj`~a?LhRL-NVg^tj%ixIZ+=&@|^l6P7UupgOng??+r~)froifHf}+ ziQ41kyt#O3NY8HFj&PYf%-||@VjE2EgaveNH%8f)j(E0YBAy+(=c}-W=L1;lmN8+? z4Tc`dTvL=jGV$3$fq%`r9K&YzlXoHq2}!pV2Ytwj@A1WQxtzDk^=Gd`P3O84@^ zQYKL}@w?J}+jzOvjd`iVR5J*rY8h$GrTcycKS8#EAZ(a!<1EJWBf(sa=JqHXw74=POiJFzIODE8F)>Go-oca0PIevq@B& zUfuBzVvWi33Zkl-3r8;{nBRoqG79@`**X z@+S`~J8Pag1VY_Y4?lGfu;JBOy=R)*wc$9QoYn4!q}}?DdVU;!A)DQE_~uHi^VBRu z;8fOJI{5%E_4(*G?(8F(^FTJ;F<*2z76_WU zy*C&bHAe74_&RgQh_luHsmfwDLSkoEG@q0ZqfKTs8c8g}u$INt=h9r;5Z>W0OITk% zIn^F>gX_}5HQbx<%0yJmX0smvTo3qB?04006&FVZUKz{+Rs*`x{!zd>z>42xvpWc1 z%4WX+cmR*lCjgs%pUqZaFJAw@*=!pj*2nt+X8;cXmO~bc>%Bd~HD2VpwAk%_Kl)Xn z4O1lcJ_q@LqNJ#!r1+ZB3r+W!c=si1u3F)_tQpNMs4>{c-wue@lA?)%){^483R_Fc z?sT`7l&2Q?N?HnkUQkkwmct+&0ngFa68A%3FGIZ@wd%!emfcyZQSU*mL|cpv;J=G9 zQ-!{gx`LsSVl+UI`zYSGf;@$~1H8LoGkNdSyxj%Az97eZq>WEVyxY)sUxCkr#V=*w zNqbXnm|F1o1tn#^l458mf~oGK>(G&QR)hck-(<7$kpei!&YOMcx7qB+Em;!<=xL4J zr^deDRXFLIZ}1%FIQmUv-V(UZv%RHYu%y_h#(6~fy6;J#u&h$Jm1U7?Sh^D$iK z+16b!1ixzI=pM)}ezP&Xsc>IOll-&ykf$lq7ut(^QlJ3fKot3AHwy^@VK zq4OfP;}2g6eF``}p@~1DKX1)E>+slc65q0TCL_)>B0hWJm!dcW0paxleE-6yQ!xv{ zZv;elaWN_jo&cglpu_ekW#D)ieF{e6I1!~yuch!e_qv=1|6Gh()S`UB_N5+0tp~(8 z{2f)*oBHv)t>kk2R4NdURyEW%*48icCS~KwD-|w8ZDRMZ8R!Qz;|dPxtC6T_)DDg$ zYx|Sh}r5I<;fBSL<45sR3jR{ox~R{l7! zR{pBBHXfBfBB?co`~z|Pe8xW%LQjpU9{xZ)j-RO12F++Z0o4lJ90Vi82ZqBzsE$HB z{?tl6N+y1nf=W81=~et?%<##d^JmX#&|Mi%Ec}dzBdnZf#un=k+89GD&5RG3HoXKp+j55;E3WP}!G!j8Rs`rY_`VS&ypYi?PM}eza-5?9aLhmGQ`H#w2Su zuBn%8ge)OceDalTjBQrNww6aenlWtS<62qjwWUC76B2dd`d9>9uE;klyq(pTi85BR;4mCuv9Xukbu z(0umX6(`>(Y1@z*vQqCFm%3L4t&Ei_?BcvUVplZGR9l*?Twf~}77V@$F z7*+FePdy1fOmVJgzNc(_+}Dcg@C=sYn$!Ob+NhuQRkfgkuMF3^P#(*1RO$s;7V=$X zT@#ST%DtSjbh!q6FK7giJS>E^=@io|g}5CX1m6+hQjV2&a1GhzwY?KQ;KHzqmZxz$ zUjzX

    lkP?i2}j6v$l^lOa8J?p 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 F{{|Mi{F(p& literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/linux/x64/v0.10.1/nodetime_native.node b/node_modules/nodetime/compiled/linux/x64/v0.10.1/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..79d4dc5cab4e9ebbda2bc924df1f36b93ff7ec13 GIT binary patch literal 20736 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 F{{|Mi{F(p& literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/linux/x64/v0.6.0/nodetime_native.node b/node_modules/nodetime/compiled/linux/x64/v0.6.0/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..d3c660568ef725a3c3afda93ca55535cd72b4d35 GIT binary patch literal 20736 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 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/linux/x64/v0.8.1/nodetime_native.node b/node_modules/nodetime/compiled/linux/x64/v0.8.1/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..6f1feb86acf7ba1d93b3153294a47027612a1720 GIT binary patch literal 20736 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 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/linux/x64/v0.8.10/nodetime_native.node b/node_modules/nodetime/compiled/linux/x64/v0.8.10/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..c9750e887c9be26d53b655996983894fd1c6b386 GIT binary patch literal 20736 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 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/linux/x64/v0.8.20/nodetime_native.node b/node_modules/nodetime/compiled/linux/x64/v0.8.20/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..c9750e887c9be26d53b655996983894fd1c6b386 GIT binary patch literal 20736 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∈yEaC*OPL$JXJDa2@tFA$K5Pudc>u0di zppR40%@Q*@_^&vkzD_GrL7BzcxDtUV*q^f?vU(@ejHVgvVZZzcK`2nHjb9~du2>6% z)L=ycbVhQ(;(u*7I_C)2e$)`;q2Oi{vY<6XZ<1BFx#<+Qqx})3;OURkkTEiuX0%+{t?k?PB>RClbEHx!r!IcRCPM)0@)9=72f8w#Jm zcPCOxxOjt%#K?|9`WAVo*{*}VN zi^W?gKCSTI6Qb}?QHYEyJV5bev=2m}uG!!-Yo{ue9UCIa)WK4URIk5}OO)uLL-~?;~@Q;9Kr*>LE3y;AW4KDx6!Pbioc7Z$@wAWk>5ptMN+(SQ+a&7Bc^)#y@Ht}yV zt4WbkH6$}DHdic3ys1Q-z$QUA7#46+6POvrBCj1Loc7R9WYS^k=pOosq#mZO?x7zX zC(#VK@sWx~adz7Sa$Pq>%~_-tIJ>1}7?0Ba0O9BCA%)*L>?C2Y#_}v*H;bwA^)%Rp zubZSP>dN(s>x{B=J<_Fx>dFm@t24ZG!!CfKlv!$eJ;B*UZxkW=e`_`A9uWFs5r;Hi1X;D2Kp2pZ9nnA>8Ig9hvfSLg}SM~O%lq90~O zU#j7CZFqQxu~Y8T>__FG>4$>B&>%8((GY5WwXsLc{UPL#AWpTn$mlmW`S@ABE(B@JQ(g0cy9EoOOXFZdU5hwdy z7fO8=IGmLF3~(|=Qc}MYUL`3FE}J0a2od`p!o}fa;%xwg{F_N5dztF)A*?6|hAhf4 zYtm(&smLh?z9|f-Y=m-G-jH0xJ7t_!naGWwH~{Irt`3!>AL) zXGYH&OfBAszqB}C4sMD_?j8YO}K6l@jkNv{uSdS{&G z8u(Fipwb`noaU2*F%#V9i2H2n?Ls$F^zmwS*lO`I=G6*mD8r)?>UT z$jsa@@7KQ;U}bQ##P=X&NAqF+Z7a4w%_e=5`7S{=6`R$P2b6JYiC0-+QpY*cxvgS? zn%;dQW=P2<_&T5AKTatt|Lv&~?fq284D`37qVf1BTGRQM4e4SuF|jQ3JrdkL3ZCE({z+rv&kZ8WkA? z{{&Lo2>x4u|1-?JNV6`?$=a03wqh?6<-l*j#?Ltr%26^e>1W6}5Z1(WWW6}j3Bt$= z{+NsLGDuVXra$H&q|D=rGc8{ZXT`L6q6ID_x!X@;XG|KbTwW08hRDaNR;ErR1(@eB zRjyDMLQ+kXcbE)fdWCknf=zoDXxxf{X)`wr7fpl`>;f;jPEEp;NTHIF5t4Z{|5EjR zBl{<9&RYZ)A4zb$G2(+X;s$8e$b4JZ1J%n^>KTmg5BwTzFpa%>K4x@Z_ddq85|YblQx-;GIQ%MQ#kLffdpIQauz!TYECi^xfq_STUp#)jXEGFU6WweE zWn%J}edF0J*qKyncWRll(C3(mgZwjgAzq=@nPJdVAKwq~v<6^lQXfAQA2|>o35-Vk z>)c_d86rby_|71W1Qc?{CSk2ze=b)yIfpNT@EzlI~R>Ba$I@ z17e{6HZYC$D%E1&#$FIy^BDDcv_QpZf%h}0fc7fEV|R_F&q0tX2K0(c0J%tgtQE1@ z!}xKti722xb{yd&_4vsPyP3d~I-{{a{EDy$AjaND5I(}{V?_VL5*n>31*oO#$hbv)(ALd4McpGo#C$4Zcch=!z zI_oSZ?Q*Ep*pt5j4f^)*HLQ4(h;Mct5X5Y@jgmJ#03Em)29OzicDAu~s6h@AVI29m zWY^}>A}F^#;9->@6*SwUemf*6BZpBsa2+|S)DxQh0t7RfU?%YfnWc-C5)rO9p+hDU z6kmrX@Lv-S8=*tvDNI69?emhl+OGMFvn$-}ThOQ51J;A>YEao>Qg)b?9hTsGwzQys zhwY`8UV4q(4sdit;k*+^sA5Zoq1jfnQX23-HWkssIMO1`jIA-^4zF;~f?weByEG>W#AHE~xC_7sJ|7I0TQBe4wCj zIJSBfsmC#wZ^G`x#JCa41QLmm=$IF}bBc#edL1{6_H-ItN){4rR}m8m(TksKbDriBwJ2r@u%#%?|uJ@}V2|$K~2!oMsqp z*Wr=duhf|x!_qi4#9qfh!byJ*kU_^_+&L6LXRVE7($e6_9mp^2L$LP!29146zPKVv zHfX&(>_ymmFbp+8Hm97m(SsDflew|{(xjmI@HHgy8R}o04L{8e*oy6^?j}vucTCD= zOF=oaK1Oq5ntiq!4@ zw@w-)sV9=xQcTD6+pMoHw7wdMfMne*^=~56yu>jT&0|W@dj|rn z_W&kk{c__}Q;{RMrJum>(BK}B52E`QPkW74lzOwd=pN}BR&6#ORRC2fGe?XHRQ0;d z(nZyGNK{4srC=`ciM44p0ApV`a!TC-XH_`!W_Z`oMEDo%nPgYD#x9+s(N*d$Fmg3l z*LkszV&BH(g}ahtvB}z4K|_&)NzZ z4p9PT$dAa7!=1twoA&0Tf9hiM-Z}hj**gz!(j)cAgNb#v8g=<%8;*R=TqGAo7|$sr zpDW18@sV}>}Kn*4vyH1C-^>P z9*kXOIFYP(zzQovbfZkCQ}`}*+fS_-_}JmJY__roIXvAjv?^r%i3>KIk0Hnm#W;Bn zcW<5OfsQ^*68gqUv@~|a(^N_*A-CKU{ zVRI>SF5ykaHkz69X9cL5k^q`!a-) zZYWy~yk=9HThDRx9NIU|SBr9kZ2CZ_+--=?hp|0^8BQDRN$HG( zfvzV@J`Co3rHoq0;Zsgd;n4T~Bkuu5c7$Xg3O)+tA0Ok`pH;rfU0UibT03Hc)i-pl z_&U_QLAeD@l2tYzBZ1Ph?2}b^j0_KBJB^Q7%cwMzfqEA|jFf8}K0!{=qp8gBc=S?!Y1w9q9N~E}|Xnfji9hcD4tG zh;r4NrERikn{3*q47QN>$5O@1(A5|The&M^Dkl|&dYks`Z0*}w+P7!2%xFP4x|Vw? z%G3|YzrlXW-f!2mlW+t9%YJ~Hk%IV!=m-qQJhub+nsy2N2_oT&2k#}2rIa1VS8<%} z=w1->s!~nN&0zmd>kquS;%=VNNeseRs87%peGA{JpfA|2PHOn19%$C$+qvg3(F8HE z_kOgB&p6~yOtp6moRi-(ik7^S&B=1uAom)ieziT=Z8iq!Wy9;3e9;)}O%Ri=yad3h zdbtm%92$Tt=aSsmtz*Exg2WaC92RtZR&vtV<`~{$b_`k{eI5hRaE)V<9m8Z|g-3qh zDqpfXhO5^}iM`(iUISsS3(7!?Xcwl_+S{(|({i5{)jYP?;*T#@thxB7mR(z!5B3(>U0*KTs-seK!jAU z>j>?p9><6E-bYh_;~0v79I>)~@s1(?_JX14803zQLHegx_6?!k=hmYYZQvXzy&OTn zijB!NeN6IbOr8fWC_#mH???Cyo*_If#l{&Yo0l5p4>|Qd;?(tK1`55 z;-kodM)@NeS?iZjZ}7K;y~5u%_7Z<*u)X}9#r}!jce1B=G>7ft?_Ac%-!s{E z{+`7|{?2C)@b?_HfxolaTK=BLR`d4)wj6J{wMg4i#1`?SC9HtIOV}O!y`0^~-)?pj zf3Ief`Fjl;&);iV3V*L>2L9f_u95rn7BBmlzaL<|{Jn|2$KN75$KTu7N&eo>I`AeG zUaiNZVsB9DtBn-g&x5o9XZv`NjHB!yd2lxcpX9-(DA>q@&rt9Y9(<015Aoph6#OO+ zzCgh>Joq97T|D?E1@Gp;00qCsgRK;t#e=lwvYU92G+t~Hf*j>eikW!^>EPI>WHW!Y zi-LdP!3z|8p9i}sc!39dD0q?w83o&T@G=G8;6bhp+s}h^$YlF?@G1rWkp~AU_#_X~ z9)>mYAno(nBRohSeX@smkWOptn+S50=@u(i&NFD=&6e?C1_kfp!7K{S;lXSQ-o}GD z6r9F`xfGnpgEJ{;=D}GM{IrewpHIO*@ZcN@zR!dFbN358xPVem@?a4K+jwvZ1>fMo z5(@4|kfXeuV&CT(ZVLVb50br~?c%{T6l~zZwG`aKgX<}HKZ4|dA62R9(@v~ZlN^a$ zmkNbq35wvG9T=X5NV|%ZJM|Q^BT<;5r{wA>`HsYy(Ub{1Wy>7L+*v%u!vsnh+mN-9 z4ti>_#gS-=*8A04yfvF6(Hu=_*HbbaiI!-}t9nY7BheO3c|lLfb|hv*Q~pj*$#EoR zMN{halw3z*b~NQ7J!PIFF+ZBJR!>>rNSqT*S*E8HITGhZQ|9R@OB{&{qA9oPDJ71? zqG(D6Pua5EF?R`1!M!(>66<};)yPg-7PUN!dulpP@0hMSGt^`E%*(>}x{jYq{c?w< z9?c7uIF8mCiWFy-QZ-mml`Ew|D8m;EHa%yqI@f}83iK~kGs|%N&ayrofWwF1^cF@J zdVDDtntB}V`(XZ{OBGfjdBe{dQm)vD86ikA!bs{T=mP>7g(l|Sen>w)# z9q(odVBbn4rGy1CXTsJ8|4L{cs;(APT@_!hfH$S?CPNPVXpK}i-88CmZ9uH7OfP`l zyG1)oPMIP7>!8=D$tIT#PNL2nN_-i03Y>%1C->@zXUA9UC0{SK4n~|EcgG=rCn4_$ zZk@#b2{u@D$Z=ithLZ_%Ic$#H=w?phxiQGAgE$u8lXCGcI7*_4K90YR9u5mPmz5P% z(U;pa&H!1Gnbjn}(|_4FRaoD*YRKu=j_{_lx*|wXxTC&BZuUDUP2|?xFFL1`md2@%$)%TbL3TVBWRG$|4sk&S z=K|X(7i1F`fCX?2jqKd9ph1J7YUkED@nc^}2HMYzeG)P4Sn|OcM10+Ex(gq*ma(~4 z32O_{hrFbS1JDx4h;OU2+(^Y$b!MGvW$az}W9h`YJVLDBz5WHn`Xvg2Oq^ICe>|BY z{6LZY88X4K>jE@eaaLRXbW%>Aka(NFg*_hhQeTGVuZmj6#d4oJPkj}KgABD~2-;Vj>*iWl?HTS6K>5&G;UkWI(8_^o{ipLXos+06;9t*UidelXAbM zywts>vZ|7<=G8hwHP(*;rDbYR?xt_BcESPV;?5vT7QYsCQ>wA$Tj%yv6VowU9^hX>QVdo;0Fn!S()s= z$FvMy-Q7kpsd@6E66urs)`Zlqf%7m<=D`%bN>mPwxkBUA^FOkbA<@9ixI zyZBOZa~L>nFP$8rE2~i3cqgn)L7<|Zl;7JK{2*D}7)jDE1gx<>oP=iudh)ObJ$bmA zdXkK1C6ablAZh11Bt2YHgrA4p_}Q`^KRY%d#y$M(B@M<2K4ru{tCYS|>iCl~Q)WFBM0}^*t@2knV@+~%8EQ>Ou-#Y_VWmt5wZ;YYM@L0m7pF|Ppjvso$90bR#jI7WkIgk z{4U0R1YI;d_xy_ug|xHVYQ+~=YCUa6p#WMFk(4TPu+D5IvjP@O{`HWX{Q%kYHJ~`5 z#cB2>G&={ItFE;;%z&Z}fX=_3;g1Z#%%pmS)3(^6k|l`EV2$SecH3Mfj1BT}Zd)9jP@ZLkCHp-*K4 z??uT95*c*@zh^vs-)MJfX(GMXk@H;d1;6w-E!QnVJsCj8D7R<;A^$v4KUFxZ;`0$Y zuO`5sBn3Vv)|X7V@aBO3X@`b%xSzBn@vJt3b+0LR^M?=stvUECin9X$`ODy`8V6*7 z&Vd8^*k4Sf0;G|lgE|XIxe4cMX+#z$Jt*OU3$$6`Zy|4`cSxB{i=) z2gMZYtFCL%Ql$mQu!VlF1;{EFHj}Oka@%S4mmHC=P2M_Q4&=a;PRdCZ;wZ*xCiO8v zMckYO?NwTb=)y=s8+>rlEBC&dL*smFYEMhD_$3VK42%R+Kl9(OO`8APtqBR2=7$jq zA=Ea%TS_Ax+DUuI{BAMjHK453CJdZYgZGhU=D2oC2E^&1Rofv`Nx2Sl&GZ5I zA%uo%DfA{nb9q_-p?^l&-c|&{iS773_8ls69HG~F;ZB6IdFTv6FMd0AR}1@lq8D8X zlgLV-062f~bNz*@$CBJE2&62`A80vpZ6gB70)ccovWN?yjHuGq@&y7YiwmHP5dma_ z07`}cvTQM|u%Cj2iJx;ioA$9~U0^}UY(1RhW-i)$3~r2Aimk6Ax)hi;1uCVFd1gM1 zlRUUhGC~)}rzoA8RfzGHl;&~8E#sP#T7oU(iW@tmE7kK{qo&u9xnYa7d6rBSPIHS{ zmHOZqm#O|e2Q{H(!u(@ma#4#JF#gzLCa1YOBWd;5Hj0+|YtC5CM`~wD{k(kf6ZHul zgR+*a`IGOH3?(h8MRzw-<$e+v)g#8=C>JEs`P8eBrNf|SG(l&>|E!C)oq@oUr%=j82QO4`kJ(MEU1hBr)$@W0l$4dWzpQ^<(q^ z#KR&Z`d1_rIBlY_Ey<}awb0Ps4#%F7N0J7*+KLUc<-rZx)1LKhST~>v#R=H44W?2& zmB)?hQK8t>pZE+!jA5OaQIAjOtUjZEkpb7I(ci&A8)ImK6XN@zYwQz;Be03ZKCX^l z0M1XWa3F`KAOoIZ7T=`%;Hl69S$L)ttEHCDw!(fP4le}$pcO`i@>Cg{zxjA3JYDSO4jxdTf;Vq3Bh zxse9ld4}%FfNThZ2W;#EewNA_v3l44c;t{l+%$TgAZDD#nK5gGk8*J{3-Qr~u=BD8 z<)dALB`Y7p#}>lcSx}czXH@DkU^>8OJTur8r0MK+2?vn+Iz|gWjL_VtqIU}F<1)Z4 zT{zaufwZnMJ){WqLwMmaD{-N^7)C%DThST64X?i3RzQ~PMd+DPuPDp8r5(rk_c zqPPaPnjJ^2+>1{szZ!Nz`v=%{8N!a`YK3V=`JkF?J>tUF>?+-NYlU7DN2VIMs8|mM zoE1qK4mQJsW4H)QA27vc5+$iDmPmTnQO{#PAXQ) z`(O<_4dza3I<r{AX5z9C`qmuM81yo>)r3u1`NA04jM>%{*qQC|R~y*s<9yjEW7naL0&TGFs8=Eh zB$y$

      |6SebWFhWw~Tq&Ws+rwLV>v`20o_zks>i#F;k+aVz=WS?Sd*y1I-f;smV`UaDo_ChAgDzCx{&#pNq@n{TrfSR0T@ znl5}|SIut4QvRnp01;W?o3suWz{W2Q_nP$%^h*=jt8b$N^VrL<52)eZr%BAwS25xx zbfwE4z^zJL{QDQ=<12H>K768|*A8SL>N83!*biY1k71f5L@HEgSBay``dm;R9NIqH z;moL;i7irUOY&0KmajE09gZ#)P*P>!T7OV#CtoOR5h$7XB7(1mu!yuFpK|vOP-nA7 zI$QAKNM}i&4{j9K$%9VuUU{%an#^^2SXp9woG)=oWmJXa!EcDut<6*yndbFC3d32t@YJ_>yq5a{^>~``?8dVf560&I27d@@Ox51RZ!4ZNco?O`#^%4`55Yy8>dGinE8(0eLDD+< zq)F@*tbO|V;Riul#(QO~f(1^?mfxx6w&o;9=MEg{ijc5%9DAI~M!$;d#9w$cV85b< zn@;Vxu_X-)U6S>1$Kr_5mtWazE?U-fYG*H+gClg)scjSL9doy*lV5y3bOQzAz%XtO zxpZGv#`az9sXV)ul7N%TO3J%R=Phe>5>S1@AY>P8Pgrp)*iz8$vU z;$1bxdhq&Tpk03p?X7W-3Vjvk_(U`}goFjy(9b-g?ZhkBe#&uFn&3DF_i_5Z6QBFL zO^PjYcSFd4VoLcC;E>ilGuWM$)|pn0t2WKS_tGL0aozX1U}U=SRN84{M+3}}C{2H5 zt?8`T12AcCudA-X-*6n=O689(4OppZV}v_lE?^xnV;$&pvzz%!;&*n#h~*nEU$*$+ z%ssSkU(G&tJKWgdudFPF&c}ICF>(iT;fG$WhUm6| zDbJHEjUAjHJ2F=PUg0UXYxdtmaRserm3@mWy7XLD6NSIWB{N&cKRex(#ktEyfHRrT@uYekzg>#yZ(PO|=} z^YjNHSawd;zc>9f14Zno^c@4vuox{c$$&Pao#wzmuzRR)NX&&hYdTr#Sl1LfgW{vy z=iZ7$vq`NotvT4hPYC z)N{3~B}oc&L?sExKZ#k6(f#WT0SeQ=gQM>&uPX zuR=9Kf0w}?@YnUd^pY>(r8T|Hh|3!<2p+%G=dbJ8w{M?XcnGGpmHwrMXXT62jYn~h z8vfW>!^P>C9!k|2T)p>5;xhSI_uYQ6sn0hZ*KOq;D>~hc%MF^6tc`xmBJ5)2W7_G9 z1E-o+H}ypliA$4!Yreg8N9~O8M>XrG!Y{+xSA_^hN*j zrara6_=!^2tris2b=TfpP~IJxf~|EPmEzgs{eNRXzT=bHL|HRz#y!6m$XZyUmUk=T zaoB$3BweoH>csKkbhpn~c@s{?UHCqsF4Yf=^4jfzD=*1)7X;C;c+Ua!8JC@>Q{Nru z>TpXIr_oEjDNq<-Oa5dU-g(Y5eyK-oN7g=_IQuZ$2NQMT?2FPx-q;0_b_?>`ntJT? z`@kv(Slw2BVc;FLs@uQzyM3x%Ju%~LTn>T!4}oZ!)TP)}>CEX%^f5+VH?FPf+J0K? z^Cbi?CHP%~_vW2&bZ$4RcPQf1M9&RR_mN-bvPXLHSq>0hf&0Bi2g?&1EN5pFBal1q zm`+x31KMqxXl;BHNd1{%s!`kGhv||&Oe^FQ-Nn>F`>DJWv0=KyzhDyXn>0B-p)u&9 zF;EI{FpEsba7~L2RjmOo3xB{!4I4Ha>0{VC)VE6>c~^Cv;lpziy!1MWL+a8oQlsOe zroV{}LffbJ&tGa7q4)m)xqS)t^J{v`&_f+B$JG76&bo^}(1~$OgR2j*dNrtH9LFI4 z0|={ATY;dFqX{4K-e-WCk*76m#K}h6`4^yhg4h_BXpXS)S=H68Zuj@8Z_hZPGx0}A zNvrEpD6#GgIQsPaF;1@Q+Kwxs|6@*u6eKp~!+rX{Pdz6ted=hXB7x{+4Z zCtoX)@JYvUwfw45X;Q{VQsrwoQX*0m+?t|anzQ=ZxTDMe3W3@Q-X}Bv7gE z|Bn)=gz*2X1?m}e@PDH~CA=I{+wuFqTA*G4f<}(!s6eH(|E&U*$od5WwF}9Ap+Gf0 z6(>-)kJ+KxJ3RQJ*4Ye2e=!bIyYV*|6xS|AdPZ>_P+Tu6t``*7^NQ;^#kF5?Jyqb! zm2O~4*3V{{nXb)Sx&lD&;S?B;dAD3vL@VFG$73r|FXM?ntEUmHd{3yX9+X z*2lB43!}sR-{ZJm@^<|-^VTG67nb3U99J&>U~$yCf{RBIeTkKk4qR6%vpjKXNeQkS zWJYV#c3QemME2vlv9NO&ZKxwJ$QyUzI_%2GKLMg5y$GONUivIJlg||S$$~ub<^{9G zY4bzk8w(a&pST^s7C3jL&f2iRV14{1#C%B+WtlH6(x@Y6eQX`p*w4VSHhu$%^WiSK znKH{??jYaO178j`Cohc{HRpbGetxL#;^*LaQ6D%x0i0TT z??(i636LVaAl(YzPnTX(?2lvt@-I2$v>4=AZe360jW35#WkHJd@rMA!XX9I;!$=h$7a^WaaT z6gUrTvDMcNByKkjI|o*RE{gL2_1OB@uTdgW=}WC#CSOanHoXm+#4 zRllJ&@~0d+HvX?f88M*<}}yq z{;ET2`3d?;7zCr^8}ta)gNswuKD%_{H99`dI5{KOaEa=2HHY7VZ^?IC4|dcz-m%K` z$#jh)Y?W_7;K-*(DE7AXaXJGJ-Vea=HI6pvrbPpb&AiMF1)ELMgaW%XPLYl)QoACx_O|kA@r=K& zE9`ucz9dwg`u8UsrCb5I%K55Fe1D$W=Di{Z`vyo&$jFIW#wz@b>)2&VYSQMF>o zKPLfa4wIvg4kiZx4|X<8k*!0bu?Dv@J6}kUAACMRb3G^5JtypZ10SGi&Sx~&i^P39 zcQ*tR0zkB>W5?Ijx(iL(wmemW9sJD6jc4$QsCw4epVk-rU^+aB(~dSk_eHaqsEZmq zPtcD`Pet&NyVc-8m-S$u@kGD#j6tMntvWB@#y+*Y>*RwMg5A?kev}4RlrzDL(@(Or zqbqRjA%;sjSs?8f6KiDGnb_z$&uks9mY*Rrut8|}M5s3i(j2+&tOgUn#u6tRqHWgx0s!k{~T&=3qrj{SWWmA#c!_KEn7!`o%=jgnS2u$-x1|ta( zD*`lX_72j);Lq*WHK#du)hN~)WofGFd`j7xpj0G{n78ir(?SJ3?(W@!?INDpe~T-L z@a)BN9?wU3O8ySt8sOQFXCI!`c%tSYadd5iA0&)7<+j&oTFeMS0hbLf!-a*O8J#eq zKQF+A{kgESlPnKm=NbLgb^Q4CyRfbh%3@O6;)K}|6Ml2ZDp6;y!JT$r1D%@QMmF6m z7p9&CaQpuAHPF&MP5un&rkv)*2{qxxMnitv;zVQ@^`^n(RpaQiHvI$2LnVYXls|+> zy`x=9;$CM{27-teNfW(2r*L5g?ladf_zb>;1@;t};CcMn7`pEb_eB?!o2A*_3si0# z06?)~mZo~oAnspm@=bEHt3Ty7FL>@8YFlhfj7;$!AI*GcB=et;2{F}sKdeyJgU8f! z-|DcrfMHvZWd$Qb4%~ipju%^N`^+O8EzhbV;eZ zsJNcd#aYw&N34fPAj)h#m3fA)Zd%AMjq-cR*2cd^3cq>u8C-bddXtY; zO@X;~yb4`b>%M&u*^q#3it|l-hvGT}tr_XZT!W-hQ%~B_XBTOVmGT$W@(*U5 zopHiHXT0^`FwcS@v&#R1Rv_i9@;@VRSeJmq*2i~KOqYPeTW#0{NemZg;5v@pQyBlK z5L`OoWHBMwLqZTPi(CkP(EBn<0jxA}=|GV#1XBt&nIuy|{{Pk9m%v9=Wb0QJG!l>& z5Tl~BEQ+%AzNfphK_UqTl0ZN(Y0{lVI^AtAkT@X0phFBesHn`0Gom6g^H9-;iW)KO z0TF_rqM|a2P7p>>nGhA_|DC#hdr3Nhapt}Gzu$QC`%?E-o!U;FI#svo)NTKUYXa+* z1z-iz%++4ry2hgBgk23q>!J3FmgV-vH`tOI^3YvZV2JGZQWAOs)L!G%GyR@zsduc# zr>T1zw?OS}CbhSkq_KX%YJ6IctGx^Avz9~ct$^BFU%y~I)Lvs&6YMO`X01D$*Id7# znJrwlXs4k0&fZ}>O{OTUE-(gGB`^xy?>O1mn$W!Y*pOr>ic>fY0S%bY3ZzpNL=7f&+tdm^(Z6w3Hz$v`P@2~FI{Ffp7zfArb$&>awmb^Q= zA%J!|3GJ7)k!!z`A?8nBJN;ok4A1*F9C+BP4Pyh1Ck!8CUF zyYo>9L*uOXF}YH{g?55<39NV;V6{{9zVf|cEyG$DeM&;MOx3$#7Dg$IkS+b{bGcx( z_N&jp%|=16PWJn?nw|u~IyrA5|GWpjL~=||)Qwr+BrjMCEqnyc(UA2C_}`HAd3nQv zFOJckIjYfKt`Dq*E{@Q{_!{al8%hqrLw~<&yeN|c@CDnz#q>$ri;&_M$KK}>*&0Xz z1&l^9bR+O!0Jem!{T9!K2c{?Z2EHhkS?e0}nlT#ZZNvyUaarCWO!zS-A8E{6+wUcG z_lxQsO&EuF(>Of1xAA=lH zXonz-?KBK`@L@QXD27I27zCg@lOVR!Fx(D7q!t7L_mGH_3t3T?HWUg)j`0AzQuUX!J0A1nj`3e@a|q z(Ibsn8(`^)@0R*yD-*!Yh1ZiliVsd5vsRVwOvl(09*xrDcck}X$9%Bns6Tt@9SOHy zTGAM3+x(?u(U(7=3kb>#jfz1E6SO0Zv#_6abid;WW=IJiBxAaS-a-mu^Vz&6e0z|- z%zFq8p*a1~qR-Jz?2eIi4diA&69YXBWOkZZe!fC8Ho+EFxT7w zBfooJpd5?P5sogyH;_o*KZ$%B7aXD7F)i!El6N;2wKbmH{3UI?z0Ehz1^FbOUS^6ncJS5f6s)6Ti*E;3sXJ(u`mJ=>_P*th!&!=!WdmgmMNRlN zNusgU7nhchw}%wpuH@azR2C@x#z0d8DTb7U_PWj3(?mYWCzm8=;0;1}D?7R)>o{Hp zCZZeNlX15Gc)Ury;9_*3FKQuzZFBb@r`f10(%@bZ1>bn3>wKl3`!Us+CRv+*Po1?(E)ww*By`d>5B+>Yw61p z(MoU7d@=z)L_%{A%vUc+-f=uWdCM)7ZX#^v`_joB?6b9Rk@$OUMA7k;#%Zro`t4hi z{PD?K+qWbV71CIzXynRbtFed;0-03a6jPc1k8+UKwMcnHjV%&# zg@Rdyf=Tf%hMW>ghV8%QW=y0}GC#iG0XN>?+qgf_uP-riYkiA#YhNqf1!sx)kj=E; zzqjB_dE=}z%C|U+Zk5asShpLjBUbJPD`D_lzdOEttCZY0V(A5oc2gPqy#$-93V7Ql;gfX{u*p^}YXrS&xFN)8gYA`Lo5O3xfi=iRktL{KWIvQtn{QPSPg^!Oe;K7+EG>eaahkOHc0H?@E;MAQL44}%@pcDUhTO`dA z&?@BOLmwv^TZd&OoqlWBJISqhCB6{G5$h4sHUNWhK4wpCt5EXks10UTr<89k-bMA9 zfvLPuq21VC4%TQlKE)oa((ZWN5~E0}_~E0w_KK3#xOv!C5+*5v(HvG@ovnfX!RF`< z7fGY*y)$fI{V}Wmszt|w)i_4gfKc&jkW1Ad7seZnEy}z;$yt3)ZwCK)Z)L15((W?_ z`{MlkH|)$OA=8GGhT_DA;w1g7KK<^_0^=HHNniniNqHM>Fz;Vxx`-?2D@j31>K!;2 z_if{Q4GTI%O&#b+*hLC@U*mU}u5*Rmme39ZisUyE-f56E)Fi@K0=l@Dv8auv6tsed zxgS3KF7aR2h(nl264oWyloWS{!xS}%{=_syZw#E^WP`QFkD=5*icY6ENR^Oxl7391 z@rQ(6jo&8wu{E1UrO+b->!gKYZCl z8eQH%nZ65-F7M&Y34P`V&7anQ-;BskI*Xrd$&;ML4?Dqnm$;an)bH2L=&|^6aB))L zhQ|EF#-v4AXHH`5Z2Z3QYYfDjKap(yN|O8zKA%VCC`mXNez>6~sj(*M^iI-X0U16a z-I#(%G%>=rkPc84&I-fVPZ*?kqrLEvX_4N40G2H<1B5|JZy2QD8)O^l8)T-HG+yX? zQGfJL#ScDP{n`3n8}MCmzZIVV==V%f(($n*^Ef4viuV>+Xr^98P6E!d;+>T~kySr} z=&?YP^g7W8Kd^N?N%UwNj7)-O_Fi6&jLwcYgCkr!do?4P^m!(EnQo4G?xLFfa{aGz z;GLuRHf$SXHNb3O3NRkf0oMXo01_Y(IPq7;4gxK}M&NPaexL@p6_^R61EYcdz?sh( zI|{r7Yy%zv?g8cleqc6mBVYio1ug~>f%ea!O@YI}ZeSDeJn%TM6qpZqfSEuI%D)s? z1MC1k2hIQ&BWx&O2Iv|NzqU^qD+DeEe)ColuJ0XT7lu?@gt zU_3A!IP)=Mdx3|5+ksnvp+G$FyN@tK0}_FcK15vL4qzs518_0$&0)sY1M`9Lz&jr> z_9EZ{q`;~7@e9Ae3ZN3W7TEM2W6OaVfE4IBgz^L8WAdcg z6sBP^roFsWQmuxsk3SRT9F$EcyC3;d z3wiP1hZON?VLZ86IsQ|6PM)$*GaJuYACPs z+@La%4@m*>(*|_ql#7>eN>>P}2BlbfQD((_Pgf`e@=etP<|fBq|o+rk(L)}2Eacj zxYo7jhb8vke(u$=~>^)Bjkt5*EOAL zaGA6m)x47P-^O*9pabTdGyR_8?_O6 zD`;lojMzp(I-Z%8l7mQ6F5VohoIesI3!(RUXWbT+@{f>Y7> zOPX4UO=->H+?j7djzb3LQ)Nm61=VI=rK>0Iqm&?P(JALE54hMr< z;P6kiIRpHDLd1O)?E7v5cQ447Y6 z;XW~V|4_s|tlgVQj_A5K;{G=g_sb*h?~Ay{+4xZ02O{q2w?V};Ux>ITevqspJz6?s zs9dlP)2du{_q+nXFyV%Okyyxi+6at;}CF*OBk`1Ux() z;aNzA<$)`<3P-xTW*RHP+?TlCncvwgn;F2lYW$~JFJ1QF-)OXYUht2!yPc6wZSarr zka6699QUKR`S7JHE$C*V*V1@Eb7^`>C?86PMq-*3&=?_9z*l;+5YsI{c=R*nO=Y6|@LtUG!8fgW+Vo86QQ0XSDl5guF^p_O zb+v(d7-R$2XlWiUDc#iKVtIMv?DlcE!Ih8ZPXjU?Wsd6E4&LCC+;c{_+4RT!0QY8O>@{?j^IOKK)B0uyLf0p zAn4ls6qg|$13d#B0}VqslV-T9Jx+(;Ar-osV>E%>{j6m(GPgaeJj@Zci=#xqNeo3uBDB<9?W&TZ>72f*3Tk&T z1(F+=W8TfPP!6GO=a&0zvz^o^;bMfciKaoDPbnL+Xv(kXwFZDXm0bErsWK!CN zJE3G)1P?`ihjWYIP6S;{_C#=?d7g6}^5Yg$ZEdRRBIJjfXH!wuO%oO(o{2PUb8+aIFZjYcg@W@C` zuR;7&;2J!ekdPTuPCSY-&E=VBOG*MR^zsT9bZAM5mo!2Z)Hv=vey>Ia*I}EDfvTjW z%;}}-^El<0_6QFpCH~4PYC8m!l=%Gi5RJ!1-a;N_c1M{L;iSmyBgya74xFn8jsORN z7N7}O53B`N0V{wdz+FHcPy_e@58wnU0Xt9%%mng*Tp%0B1gwAw&;cqy28;$q0>c3* zFc?Sy1_BbG50C^T0t`5_ok==?Q@}~!1keT?1&#oRfkVJSpap0GHUMjZ<-lUV1LOlT zKmwfH#w4x4I$$~A1ag7lKoZb_t=m(;3E(iW5m*nb237zyKrtW#l7J&ykSDMb@B{h4 zaG(P_n}-47UkluIz)GM7m1aoY4SpDRhr`G=I&;PaV>1Uo@|J?Kc zz2SuyU)uQcE3Y=aw(0fe&0Dr^+rDFG%dXvT?0IwVzSjM39XR;*JMSKP@BI%BfB4bI zNB;83r$;~g{I6}tzBqp3Z(n|O^6PKDJ@xnY(;eS^|HGLde>%(J;u8{kU2tL2MZJ^z z^u4&Bqzu=CA|L*$#yYv62 z`Ja}ak(o7qLUzuL6La$>-IPChN z-A><_GEZQP$LlVya$-Lt=vV2mdB*r$Hjl5;O=~EnP$QDzVMs5*yb6AzD~7cO{jmrw zDII{hWq-^K0Wn;3r74(G1yKr@6cvT7g6jdSm*N>%KS=N|h3g64*TJ=3Ciu^pkU^^g zX*4Ge-edV=PQg5f!$V6GwlcryUr=V7>u^;#*iHUQzEA`D3{0kH+sfvQciJj~HYRb5lF4L9Pd;q&q_j!o=1dyTpK~T< za<_o{;}$ENKmXE6;v}AfOhRk6QwlN*e*4j~2N&)blfFLwv&G5wr%#gt&oIn%d;Fn# zj}h20b9SK0X`eX-D*<@(2!#fjHP&OF-KA8>YZdG-M1R`fSdZr>;E?DK8a`+s3KMB$8l?7R+z*R_>>b(wbOE3=>%tK7S55ngK>BTxnhRLx9L21F(j`N33 zKtw(t9}yjn58#HvCtip56Cjd4GMxNZ^PeZ^KK;|eUntmyF0JI_TPZ+!bhxOk~E;>U7`>!7ukKS$DUw>-$wZ1H&kO@?;z|Kd$|AG_HZf8 zVv%93eU8IxovX82C#Pju^V6p0_}oscI9ugb>kMWDjU1b6SZwrU+Wa=`9biPnx|7c> zL@Gk0;u&}=uwd&gBjEL7Dc73ec45id&r>Z(v!qS63`agTr*&#%h*d!`XCkK4JsW|M zVJJ&vG+|?arzgbvArwz=$1hjnTJUv?BTj|kvft)f4e#d0Vg@T#YbiX#$;PMK0@ zXPl3f7zQH>ISI1{p3mg;EEH6(ux5j}BTNgfXSf5z`B23o<79)+1-yj{-F}<1z()Hm zzMf)CLJTR7kz3_*ObXDxR1b+W3#TpMTQgG}K6k)d=9pxwc61Ymw{2|xB4c(5Pi=g_ zg{@k*>*uF)Z=5B^CnjSJHy7AgLN&~fw-jQsBuZ&N zS(ViDJ4YoIfz$_)=IADDmr%!`$dF!%u46<1a-4(;?qZfqzW2lVA8L%CN-9QvH*k62 z5*^hToP>7?@}A(ec`7-P&_70pVg*G#R$S^D>^iDXkqdhYJ?X;U=-m##wa|gyLkdzX zV7DDQB7k(Ks41qYAY)kn_t&QRp;~4KkQQe-+ad5S2Q5+&RLarJiwr>=5|7_A3%!9@ zLt-8*R;2n2OFkk+lqy=SW=|$XElO2X9OTmyYNfD_39$f7oWi+X==Nm7#$}4z9jS{1 zI^Iy>$ibE({(s6WWR+qShaQo$6!sy)NJ3);o(^k3E<0ffh#?tS_6p)N@$9>BypZOM zmY`sKE*%-XW(5vsc>%UpV`oH!mvOordu)mvP>d8LlJsKC?0Qy^#=0Nb45Ys06tg*_{0PX z_|&3P81J}uGfSG?J|QE^Q{{A51RUa$Kx9l!TJbcMu+ji2q+5}S77l#yv(At~HZSA4 zm0sV&1>nsks9yZcJRd_W!}A?pA5DNT>WiwJ=y+YZ)_@p9^ylclj*MXA1+CX}IzfFu zDgkYDTfh-;l+1H`aa@9PDWq}4o6edsQU!@Lym+WAL}j~B6EP$zcC^}yNrFW3HPIts zlrW~HPfhby1jx2P;O z62^xJMuUANlOnQ=Dxa+TalnQ7-dINsR)3n~!qaMu8r*2FHXeQjwP^ZkS{F+5jmI(& zUm==8Awe?o@Ue+mQzm8QDivexw7RvMY>be0zMBvF>d2V~a$-`-S2=l&p@+JGeEU(v%Jom*@ zPvwS@>rbPdve|;%OlE z^7(>2$5rO#7A&xk4VO$PEXw7hx<{1jcw}5OhZr}D;u1HZN$C9wXSos!oLGWnm&Zk# zY`Q5uA$2~1$LNU^MdP0gaIFe&S_Lpy!qhp32FgG_KbrNIV-Yelh%-)W55;)oSlE*PS?UDU~hPT`xzF6lL`%I?Uhw0R5NdC=-r z>9u|bd!KTTMb6&jt&;(>E0D3h{3(+x8{D<*sf5V^hqo5Gj+=5qo%2dVs2-qF6;_qa z336d`gzN@|62faq$aUKwwXjw{vybm*^E}-7fxKodyD5cg%+0~dnt)i{LUiRJeaJqF$uXD zd8FmZrUfOdNC@$&&@D2MRSB&`H1u)-x`w z2VD3SV+x=Qco5hMd<9&35;m>CZNUA&)4+ScSwQ+V&c6aS;C5gQunjm2^!)}O90zQ` zGT=4f5bzT)Fp26Ql{2BrhQ0v-ll20j4J09Sp7bGpDZzy~w{ z8-b%h()ZvMPzuxne*l_*1HfsZ?+>sa18xTH16~5&1`^NUOEW+j&;lg=$e0Fj0}lhc zfn$L5C-56+0j|PovK8C9^Sn>BpDf-~d z%fvOv`+2OZ9x5o#t6PWI_@**u)js>K=BU%^&z0qg`9vO2a1_CEEnD!Pl^&3?_6 zfa~|*8v!)K^J9i4Zf(&sO~=#9Xo~0d(jX(eHDlTz^Sy;HZ1Nab`iWR*65kat{gs`I z29t24fJq2UIWZ%OTt}suKi-zYo?==dAFOPZS5*XH{VcA%QXDKIU_Ol33nWaWw6c`u zE32v!20C$VFmi64gJ?oYdWevNMVBx`(lc|;nMG8L==8->Os(=&!FD^8ZY0mdvUEoq zo#H=IyJ%W6V2{m>n*x4MfTmRrTXoDL#v~BR6@EDsriwk)^jx$;ic=hZ8?8VJuQwt2 z3^$&zz}RUChh#|3U#%by!t!uvDU8G=lH)Ogg{*tpf9RBmyz{y%b%)>{1=ce|!pr#? z?SCGUdR`Gia@UnQmMnFpik6Q^**F(%XITovq0-KC|G;))QA5LNUWJ6b*#X-sX{m9W!hQw)O8PKwy~dZOX0XF=856J1Ex zbS2{K5qfKQtzN98LSRU+C#gcL6vLzV)ty4`nrG-OxcfSWx=c)cA1g^g>Bo}wn5B)m zxD%5ywCWjNPmCo4A+nwug~;$CRZccE-B+KeI&VpItu&|VvR>DfE_l4K`|Jem8nqM_ zlNDY1b4;q9x^~P6Vxyt0eSRDy(3~DrF|0TnP({!oVRG zCO<8cYv1lD(y^5sq$u*2>v~KgHbF!Rv13mV3eYu>VhVvJ+E^pDCf$k&WQjJUe0ZfI zea~aGJ`eKHSlyXc>Mng+4CtvFi!|Mg&th<=5jf=CgJnmM zW_)hct|)ECqGiT+7FzDl`+C9t_$lh#h@)YGN#~#>NG9QPZQI~a`LrX!4{$$CPpMS!Rroqa&5C6PHXqX z!G49j#cX5o1T$kXSl|QbCvmG#aYW=C37fW{7*ShqB3YE40#74093nIV0_c?qnF!3{ zEB~~?7K?Y5v}vkNWSGSV8A=?_anYi#uLmY@_Gi1Dc8spEsvo&I6tQIzl!@?)ww1SE zjCm1nL9B&$-H-?WBX|%RfPx%AlvpAGv!P;QP$AC8{fq*0MG-B*A%TviOwgD;S^`;k zf}MN5wX;X0ehMZTCb3S9>T46IdVE_&oUZtI59(F|I4uf~HGC_YKR>M~6tT!-Cld%^ zJKbUn_}wKA7ag(fB(oT@xTTE+nqfMu8#`jK*TjJVSAy zOiFw($9J3~O0ag6O)Vs%;vb3RqIqT~2?|N14?h{-qpTN~kU^7$=*~mlV2D-B*RhEH zA7n}~*|G49DB}5Y1{p@hJAd{>#`Mu_JJ^kSXg6roQ0@F=cNpeLtlk&JjZX9t;&RTY z0i0Pr-<-IeVyx!o3!mqhV+sSJAhsnDT`4?b!_JU*n)6~9q%4h7cdC1=3Pb{0IDs@RU-*m^K{(syxvx#=+7#oXe3%>DL0^=linHA^ftyUHp7W%eRFl^H2 z)>ogq{Pj#apAkvt$9rK(6)o~x`MDFA|6_Ls`(wE3gwIsbHO0Qg}T; z;fn!E=RV+i;E%!Q$KX==Rs)pZQvlJu1W@_*0u=r(K;bE13h_te8E&!DC0wE#d^~Ue z?&5WqPIvU8zvznb|D7(iH(kZ}jzJ-i599*bKqg=Xbbt&P2@D1#KoW4K8D~|1Q@}~! z1keT?1&#oRfkVJSpcU8yYy&m|>w&cZ(XRql0?UELz0vOQoI?@IX0WH7=U=^?&m=E{?CtwF=0);>>kO`Oo6)+kY4h#nR03Dl9 zN8kuR^atU#02_hTzzU!aZ~}H{O>63|4g3U zia=2QyA=WH|4e!QO{xAL7lq}Q;_PpHV$y0%fJ*PIz4MwN8`pd++&uQA;4XUf2rO$D zv))n1-L;_K{KWfDNQK}o{}=rvcv*w)3+G9n7Nma>^!pw^`uG*>v&Y*Wzq$ML?|6*I zn2ZVA0}zx91ZSNa2oJ~{#$Bl#Ud$!@8_Z$F*~#Dv6ir{eQi+z?Je7uVsZ zD9(k2!Rr+07lXb#kZvcPe$N}iI3?y6`K?p(TiPj{#t15pI9AXcjIQFhFg^^$*Z?=M z68262zi8~nPkzw6lW48LS@66L?jp>wX%0;DSt+m(2wkhvPw_>@deMQwNG#V zLzT64){i4TyW-xPEl!ZBhT+7bs*X%o+ zGo)tA0jqn*k)_A#c1?KYfwgH(cg-ofPQUE5=g9o@rVsD^=(|7saQu!xPtJJk^SPhy z`R4j@ix*v+IZ|@jpF5tBe7b$x_nF6^I{5ABKyOrUeEx3*c~5;dD|P!UW8)w1pK*59nv;)7n+u;@s*AJH4 zQhUGqgoplhSZ3IbAK$d>VORh9zgxB*811+W)nswcoJC6Rw=FZu?VTTC8hc zta3iv>ox7&$1Td#ru5rCdwa#}@BG!W<;NfQ+7@3jZ_j@nwT#QX`7e3fHm!K@^Iewv zw-p!znQso<^t)#*A62}vLZ9{Y)z9r)VHrMb$0tp%80EIc+by=D>6`C(u3&!uS4%AK zemQR01)J`_>(U=GEyFEO9@9U0-4_ej-e6gV4lEF2B8OM25V1o#~o}{kl6RJiL+p_^$ErlH#N*pKJT{?llR<9gDNlFMRR00qqB4 z4a(aFzcuUw#g{qDXXw}bdQ|^^ZCx3*8H$zx@A~Z~$rrR~&zbh7PIYkN7A0$KxKX@8VDI64?kV zmc_9dP+~`g2+V|~UVPKlSu3rncDj72L-C0H=IR5*O0z{ub%zL1N8f=|p=Q&#P}1iaiK~hx@nxqPcs=!W@hG0nox{&NPhFr zJkw~Ef_78LGG&FbyJb(vw#hz`osx~0m&qTJH_6-O0~88{Ua?8hqBy2FsklP8~)1FpM^+4OTXUj| z>eZ>EQq`$Bsq<3rP5oo)w$!&%6U_b1*P1ovnP!i9vH4N+8gsLGhk2AmV@bD6uuQfT zTkf+wWqHAJz;eX$xux9#ftF%j3w%kG^_2~fU5*dTSY|5QUnW<` z)8vQcC*(iKQxqc=N=24pilRcXNb#tmRq>@_h%!~_QZ7}#ru;yepz5zmQB6?IP&KHU zR9jR#Rr^#QtB$F@QYEM_Q{SX6RNtb$U;StG^XgaCr_>`gV>K#Gj^Lj|$byw?#>&EJ|x^&$nU4gDl zSE+O9{JMK|_v!wuJD~ea*P%<+U!}L}=j-p*Kc@ea{#pHN`mgmr=?54x4K~Bmh7Sz! z#w(0cqry1JSYeDa4K$^jZZ_R#T4`EklB8Y=u8v8~Pc2HFk$PL|fz)_&lKC?8E#^7q z+suD3x0(-|KQ(`4{<}HOa-l_H8Dtq^8D)`M^cIU{BKUiYrPAWE)L4FJdDil_g%n9H zczdbrN?Dd{qHMCPLbg!$q-=;hU7jmnEMF==ByW>{DgPcO&=SQU#bCuKNMME{M^U1% zE1U|iqE@j`akpZrVuj-OidBlWisuxsDYhtfD&AD=SG=n@toTInS4F#`kFvk=3gr;x zb;{97l~S*?DsNI2DrYFml=aF65R6{T%(h`W4{%F8!DK@AOHK@f!_|hKCHR49^*w z4D(IPOb?oV4^FQ!^-oPnRi(~MU7NZgb!%!%>ao->QwN!cnn#)CX0165Jb&K2)Uv{| z&a#u_)Qa-}aITiEmA?VL9fdre0^hDz$Q35VM8zycs&WEqeZTUz$~DS$%FmQvD8Evk zQYNaDD!nRAwM4ZH(zr);Ky?Tbc~td{sz5zcJzKq4^OWX!%|=a&=1t8Ao^nmF}Q3h?F)axKk8uZcX)TdM9%-5i93(R}W10g4N;s@hDMys8MX?$;$S(T$IP&rj|(XXCH=`UB0RzISCSskyr zO|x9nOM40Qk48ILJ6&tj)@bk3KCOKbrQNRGt$hzB_1EhRy2a=rD|GStB>h1BM17fl zp8gsA2K~$Wo%*-+AL#$0Uji-ksNprke#5(l?Z*Aa!zNkkE2$?^6V1uy0p=9*V6)Vm zV|JUDnOB%snjbN*GOsqTHLo+TH-8T^{X|QWrH{pHSzuXddDODnvKFoOrsXu%u@t{o z0q1&X7L`mVGeN&(%Ccp-vWH}k$X3Z#%ht*^K(`)JeW5y|8VcNfTF>H(UWn!jtdYc0CjkhJ+I@!#|g!$QLngTr{M5gB-dHRi#x4YHSIo1ooW zWP4?A$qqq_eIolD-2Gbici9iJv$9_Di{$;}1LW7M7OJ+ZMi@Rfj7XKEzyFxJ+k6Hs zbERdNWu#>^PS#GhEVTR~Sex~h4VI0TCQCEbsSf8#;PjSBWCLX>vca-DWy?^HXOZ_t zS(EHT*@bew+$ztMXQQ9z%M0bj@|p5A@^$j{@(uEha*wh?{e_yO?O|<=PNE;Ae+fG3 z4Sj{-4#P%+(KybeHMN;`rP|CD<|NC-mcht*ALY9oXTIQEBwH%WQI;y#Y1V5tKz5rn z&FGmenmw9U%|Xo}&1agYwEMIlLu2OYZlegRgthh>#SiKv%^=NqNX?O?4G5;{^lS}VgisneRYR&Ay> zTbrxR*A{AvwKKJ)TD!JV>(qL*en{|qZJl;8`rK0Oa%h{C+DEjjw5zpiwd=I&wHve> zA=}N+KrPxm7$FX74`~l;k7$o-+b~X?#7NPBnloLZE=ku1I%=RUMK@R{#i%h-H(Dpt zsdPG>NoUn%>aumYx_n)su2?rySE{pPBys9I7)xq&^L2H^w^p3*ffL=1rETNH^0lG1Zjv|4x5-=Nd*rR0!_A7(N*Q|hBhXRn zl^c{z(9VaHC(+9jF>(%8jaJE2R#m1dS7pbX;}O+r)mqhh)i!9ZBRC>6SS?js)un2u zdWm|4dcC?;eNrva$TayHk7g+}0Z9Z&0Sb*TrqO(dK|0ajl)1`$XvbpZOvsI0S*dg? zJxaf_Mmb+ur(CRDg7JH~as@BfD&=bB+Ffl}=^i^~gp|@>PYZV%1DlDe6=SE#^`ARW+*lsyfW8mZ+Ah zmZPRCQP)+xwn^#~^+>f&osC-7Ko8WZ7o)Zt_3I5A&^wwiOWI~=G3+t4LOwennar4I zOoDVuAfG9a(2$nLmDq8DN0H85ImhR1!&QiZ-O9sW@UVI!LUegUBF>pxr7voxB;mSIt%w zav|Yzoy6T=vYYIt+gM^Z-K4GCxY4{+XB@(SwFX~mFq)KDY7QBjkZ1uT;r_qRxih>Z zX}9~?|9*D=FMhmp&+BuZ^PJ~A=bYzx?!k5UZow!Bf(ehN3Bp0V>0bf={qsKz+2f|a zHcr@|^y?cA8kYb1hSlEhZO+w()T2+IxeLi3N77st}Ngt!}049SA< zG*Y(fsSkV&ZyTO{JZ|IRI6;UP3_KzB7Sy7= zL0CZ9xdvgs4vJzU{{X@aRD@p$0*e31f4wKaFgC!m<*VRDA$&vJxJ^X(iND7W;YWR? z!5;N5OAyw7qk6-4#P0|~YAG@RQ}Ez<7SE`E1!(#kdNHAskhJOD7Cs$S2tkw!e4~1E z^>-2GeMO%^Bs^mgMY)1+RBycRK@|MwiO451rr~Y+Qn@>k`v3p?Z=irZpe!;e24#^s zbd3I~L3MeyNgc1))MAt3HmP@+l_K*IlfZM29Sa+loDgh!S-pH%7@eX9^?0mC)9P%K zNByMlNSruVT`^eZ-!bSnJ$~1=iT>xg2#}fSF1^OXSNe_^#H2FT3|5d^Olo*tC7^^8 z2t3d7u*PUsE9G#EsJ+#rFluNQ&8k7Q`3%}g!ZK_aolE@-3u{M}R}CY5;r&@;8k6vs z;ZJQ0Wlp+%-KL!~fsIJa7>ti%h%56Sk zj*ZV4d<%7YTMCN&mdCf*{2Q_bxyMqZ(_|Q5`=7=)<4gF44cmcRc#$PaR&`0XDa`p& z$HBkIG6rRJQN|bInPcKjsNc9KD>j_Rnige^$uDVIn{6fr3dM=@hZ(5-F2Cu~ZE3F& z5;DsM2N70^+ww39awe)AKRgKca4zC#7jm?D5f5`ji?mi!3C>NRFYxiW)lanam;Mc~ z!GgVD56wd@or)sYj9d@vw(6AE=@vG; z1WZPTbSyUdd>mbZ<|oBt<;L*ypOha|W0;@68$}={KPWRg|BA-oM)U|9_K(GHcqZu- zC45Ggh{gYN_z{F*{6gb~Srbsg36vSd?}cdA2+yg(SW7W{z9646yL; ziItp+So;dDj3Tj`L=fa2b99N()C`+=l!K-shO4a+a z=Xq2ydxsfy0@lr9X)n4Qg638nB^mh8r~(XzBZTF@i^#YMYk6Pp`N_hM=GI5rL|w^@c17X?9qY+DbmboP_Z6e*wSI*E)|QlFDOE)3)_MT7 z|A7xmmIAUn-n2fx6?l}X`NW2iWdA?WwuxxP$7=%;)m|_MuRRYjVmIYJz2+l>q}GC-%9;M~=mb7v8FopaY{=`*81ipBt0tEJE38B4MYMgf@xAnR8V zj#)a8U!h+cwDimFV0-w8fx#8rVJCy6YJvtpjnqI?Jad63efT4k7qm=S15mPPBPvofyUOKEX#^Ur+dp z*#$91%!o4Lt)m(7#$iUBN%ML%BeD+8awcLqFJKXcSB+x1wBgy4jS;eq;kn`YGs1bg zNR}^UjqqP4I3wGm&ZRY?Oq~bL&mbPdo2wM?&Z4-wbY7896Z4A18;isguk9pf|IEm3 zG&j8G(e+i@8C3vLvm-YXDqe=PVx-wHMA?xEUO}${p>ReuV}P^Or3)}$WhMY_PLY@f zNEQw_25Dv#QU+?qAkBMrEyj8MjW@#q`!Xm45x;dTS!a?9BBgnTK(<6FX>p`yJg*w80heM@|Ths8lx zgq9<5_C5f~1}U?Y6${XeS-D*)oTsImfD14%uhP;jgceW-0B>NbVDs+7k4Gsi(9$!I z1;hvTk*u;o@QpqH3@@b7KujKHjTVP$jYZyR7OamyMx(WIM9lpSC988u5JK2-5@Dcp zVYk%O5D=5mv<1+%jm@h)DK|peO4>+pu=Y{03jO6_b$d?w-s*#wHWw z_b_UF1Y-Ejd%%q)n7G8dK1-jYf|`E?Szv7t zh3`(@R;OMax+zXW*Qw2VN*gs*V;~SX_Z~cE3obCEC*k#aq zGy-nde-_-PKMU^J(cpMT(PPl~nDQq&D?sXy-~`X>+{&@b?;hW4D&Tu}1Phd|Y0K|GK@K!a4@>Fbs!U>ebo<&lh6N-UE5Bn8nbUFB~0%s?^m?oLkPuRbrj9z?n zCKxf2iURBqwy5Pm#Y&NJ(a6R2P+$D9X$G6&Z~(uDs4;1loXV4Y2ETLAjh&x!a3&#f zH&FC`|HqJRbEz=<1tv{-ncvmRZbj4H-KR0voxN^F>SYfD{xP4~%aF#hCZj)2i#%YE z{)WAWr4-XX(H`iThs_v^!_krA?03kB^ss8YwDi*;Tl48zXyjMd2}1K}YHk2}riQ@7 ziR@<$Lt}FAf zNdQt_uBCUN=SqT%J$WR1Kj=85=fKGTxv!B#w_29&SHMWYyUnnW{Q3sb)3FUCgr3KzVsc-N>T(_5jO3M?;+L z6M)KQW^%<*1TMDHS^L z?E%$gc39qQdrh#3$p!Mjr0S3C0c4uqJcgubsk%#p=%&80ep7J{mUvVNW6oYhC)EM_ zxpL)~CJdP4nzjBu6a)(QWC2M?3Tu6$p0JD(z&xpPeiu>ATK^FUS2r|>Uu*sCDC9N0 z0m7tVpby(_G}y}6{^`6!VBdy=DCH$H*r7X-81{@3@g#aA`0Jp|Hs0e2$3n2yLPiV$(4WS1s+iQ?=g!1QVq znt~8bPFlWHa6heg(P5Ws%z`)@lM-w@clRws@E6b|z(J(#0sYio*aeURf+1F}BveLg zLQU#2hlK?gQ8fu_)YbyCPyvOUx(K^+DgNLRWW;8_89IQg;%pDCXZJ%0_%|6mY%a#M zyjc`xY=Sf0fM$JH5)3|>5C>7)>t1ZNXdZ zR4N9s%>fr#AF0C_szW)~{7X&pfT>z4VRbYxorsq^IyV;`6tIvX5T}NWAxEg%>ei$| zwjQfsIq}6L|6&_b7xL6)(Nyu)pcd!$&pC**5Snl1jYBl&Q%rjs%UY|+qrKhCk#U-F zL=3E}yr&)A^7u@?EcOaE7_?r3MThJ2!dT4WeHm*iL-NgnJy03KsyCBXy;fLISOr?A z)s6Uomg;h>Q?W%Giz>Dr-RuGihS&m>)M-d%4}gaKol^q+o#jPQ_A9~iDPQZ_`k<#w z&L_qdqzv{xM6z!h%efZg{L>uGhI67x4MmJtZrvk%{yciB4m4=e%|1(IUVIy1h^ZxP z5%3_g{Unmep2GxJa@jNdMGO>4D`8nwfHfd3EYJzY9=InqB`~)ZjLa=%MYyw2l;EdF7H*G1K5bIgCwp*4NIS378AqHD?-6D z*y>%uSoUgCwOTi z89=lge95dl0FExxMV!9nQwLZJSX1lZJ#Vxsm);qDOCozu+?{m zv^P`|A}|p?@fo~^BLBcFy#OsmuOrQvOn?+|Fi{4(XmfM5_o%ryj;y@hE;?97L+oL0yXg)PjbhxsIm z?(x4(E1LARC||2{iSe~F=;OrLj-IpY8QM#mD@huBd7n=rXB&obnAelIHk76a&GfR- ztW5$WiM2xTKthHf&9|eJ_YDxSOgrP?=c%&CEXbE&#Im!t-*JOnq2tfs@$k<|r3vyLopgMAabEfDp)YCf%A-XG-x z0*9u(t#vfVWXO`(?0JlMK%YIiV`mSF1I`qhIfo#&W9KS;=0HwD3V#pjSW4FE>w%}t z-bVw}2i8yr%0d3G<;A;!`IhNejJ5$A|Dz0()uAUEVZMXfb3l`h@*Thk5RAQKAxOE| zKyHBccYiUg&=+7uA$d6@2nkJ^mFKjGe<5bUQP8}dU<_Ssf-dRaHbfz5iK`Hg2fkWI zbh#ni+aN&7DKT9{37q5E1Ug_qgs@y3J82){VHb#0y&hJEw}&l+RPnHn|48AV0bvho zg?#j|zeO0j+fmypdmv&3*V)u@@G*+hPGC>qkSx`gVp~8tKX4KrcH(3&z1a+C_h@-b z=J-%jIa>>$-YzIsy&d>rdk9@xT~~X`yuZ&!N(MGs2V0PL=oo&=)d5HAW~-VAFi^zE zVUuI1`V%?71A8K2U8Ok1OCk0upi)avjQQed-J?`mPkmY5r%7_I!Hx(dNFWlB>;fa@ z#n*#Lto5B>#pYTBo1C^EZO0pjQ^DHs9Fp}tn7$#y<_mkU4s0E~`j!j{14_+lrQ*C& z(T0?fUYo~bH>A=eBSJX4O_7UXXV)cOpsP1pplhT+7cZbIK(f#o zxdvOJTf)58B!WSXX;8xuv#?*1SqAwyY?_&wQbWu)yyF5<4OHsq5P_H#peht$(AfM? zkLxptNtZE}D0S!)45@z3ID{1aP%2+q?(sYKgK;;2Eqw*PtV$1i1VXaB+}`d8N@mQ; z9xDz2{@t{BZ4N*IugrY`zm6lDZnR{dk?qZMHsRRT>gOI#d195W%(O0OcK!5PdA(iG@xyOcGLXAf zP_018cpOMMPE?-+@9Ir#{}GNLyfM4haBfGnik+Q6JE*ntz>rvm(_K?iU(g`B`hsRD z1tjz8b3I?}moH9N!@+_0;Kc+Z)_35x#Y67*LLTxA1t}xX`9%?N#)is>Mw!Lo+Y_yB{PFoKA z5is`yCM2V#iFac8UWlbXiktl=4b3PENs&fS3L;6Q^)ex7{t`~&EZ`GKrefg)@DS|s z*NoO(UW7D0=CF~VA*`SGRJMn}8IeBPlpW^%B}s6*J`fm&8~mFr@{U0P%2n8#3A;qO zwIH5`$-m-?qpkXa_ANF894UVd6F+RK(*lqT+h1LW^GNC37C=i9ZV``5V&~<&z6+^F9Vh?zfMCcYvEnx!z$#a^; zBswZN%_e0cra|q(8zqoB&pG(=jn*dvg-D7l&=MO?isq(-#<)9`QcKe`>nkC5A^WQ= zkO4iIs3nq&6qBK9YD&#pMN8$<>)h=8sUL|aA z#^iu<1I>sQf1#mv-i?w;?Tw_`1NL+120DR0oan(4HQ_Gac--1M(V=$f6Y2{_P%Py* znt{T%7bJ;GA=C4%hXQUCp22EJtAS3YHYK2Ydgrvnk)B3U+1=41#zHL-S*4c39uHU- z)e~Fe1fm#Ku=R{XB6?DJ55O7aEI~8Sd6^&ZEG71Hp0d2D#Dd_!=df?pbzO}ZP)|wY z)LmTlvKAb@hji)6ToDHD$a8=2hhQpe-N>+d!P*(z&Z8`N@;InW?(Ni$o~2dR6-gofrl5h3GPga zhDS6I2Ww%gI7B~XU%6kvtbqVI*hr=5=TDaM310d_fOZhe(VD#-+vBH#&7@9HgP3`` zLaYc`@=aXFK)wjx=N1aK4cc6AuK?4h4Q?hjKc1W}xK(fk>TS+J`krvA`WC|)BuZ3!Oo?$^mL+C>3D68 zCWzUzkc>uQZ?}$uhodl`Jw}_`VDZ1Y8=Z56t3R#_@=$QI30csZp*M-D+uU%H+tL1rQu1fnUED|9@if28yr9_s8OoP<&zj6S4TC6#qv4 z-^Joh6rYy=?{QIhs3=6nBH9NcP}gkmnYEMU%8m_@MCxEMMJm_d!zD`e&~lK5 z9;=cBOQ*%n{u$ISFV~e}phwIa1XC!VN%F=4zL1oZ9bR#<;Puzh2yBC5YC}j&>hEY? zfQb>=h@B<`iSAq>4cesvxQWqh?$wnr^e*6WGI?t0OArQM+MT_2nERx}Ln{F}Vr#ez zhr8C)@k<3E*kw!URrs{)Kcmd0Rw~y)`6=J@9Pz6z)G@o7pM;=@_Di>4jk2F$(Jhm& zX<}jtYXKXT%X`V(B>0y58@fqNDY)4qqzdO&DBZB+Z^)&Md5c9iE-4LNh${Z`^!rpN z{r=!I{r)?-RVlwbhTp1PPYv*w{}O-wppCy8TKH>kfWLnF242rT(a?(*tYChZN%3Dn zILzB4+n3V7DDSR8#otWBK8~`qbtUX@^y(#tN-V zlQJ|ZO_OZVv-Zz{4t%S1<4+h77;{EO=4n)KewKcoqo3#T6CEgw8+@pKiFGQ^ZGxov zE3pW(Pgg0Rx_TmF@Yo?v)jjls z<0P6PH$GC)D9$c>K(6V6s5yhwJZG1b2;))8rx1S5Zc_N2#ZD6TYAnz4HM5v3UrT{q z_?k(YqOM%8xK1le*CSn8sIJ_gxH`g1H|zo!N|~jm)`Fah>%5v;kARU!^IYd^CabRV zAgEflR#`IMtU1p|-esO1FjGQI%SY;2f-zm&x}iiX?JAE<1~F9}uwmuK=~Upy(((|` z8;cf>$1$969O_V(Zh*;oFHYXEbu{L82LBsVf6$1Q#Ox-695i4@xI#~mK8{DS5dAPK z`ce(AX+uLhj2&{XW*(1aTr>f+ogAe(hhRQ7bvY zkblw8aOm^l&|owaUD~rp#00pp1Ve*W%~J+r2>TWTBX7JU$oVf}2(cD3sm6N+RMpbw zVHDNQhI7_>Iv%L`+Y$FNWR=kN$y)yzu+epS(DQjaDWjQyXm3-zg~#^|$6w&_{jqrS z8wg>ovUzvw5K*W3Aky~GkLqH&R>Tn$m*%BXS@8~((B@JQ(g0cy9EoOOXFZdU5hwdy z=Zk$7IGhyw3~(|=QbL~-UL{F&E}I}^2@(4q!o}fa;w=D#{2NIldx`4qA*?6|hAhf4 zYtkj2smLu$eUTye@2L-G-jH3@ZCX_!naGrL*JEIrt`3!l)C( zXG2^=?~K!2 z1wTp-RQh9%(|lqeW`g??aUUW8oVXicX^0ZnNee?fk@mOhnVb&m0dtjNiHl-6Ov=+l z%G*W|h`gbkJ;rN- z%*=K3-hEeqmBG#8--nbP$%py3wa@}JoAh1gy9n7-XjY5vQ^u)9US)+z9p^~pwu%XA zYS;CcAw`?u|MVjWW9VQCO^*13lSx^RZTCn%^lVAUFEk;wuV7OgM1IkxI5c92B*S%h zoLXR_%$V62TnZrot(fW8`>@dvCoYn&&aVE%U-Sq0>iDhWe5q@Itm)VLkyjClUxIP* zjVpJwO$p2h$^mmlh&iy;2l@#IGbR{pA*4lD!BUtMM|0aLs>(;F6;e`djo4K_Hm1h7 z$OSM~Z^&Z*TlNF06=m;M;$f%*E#6LA0xx6j@Qq`8z{R?O2=?O@ zCh*>^ds;AqUkl)e`zDFw^JtmC*PY8uZdU(W3;fQIGm<(Z}HI0-%P}j>ww; zeLonY{7dp2-`7H(n){ECOqUj@aq|t*HgsmLJs z$C27f@ZSXdUt;b>8g*e#)~0l}6?>T|2YwGWe$IhVj*@vvKSR!euqLJ>>&4*?5Jq0` z$83z3L7M6}{V@w6Wgb_YX}NMZBc{z0EpQ>p-hK)@W71${^MW`xL_Sfq5_Kvmz&wYj za+$gil4_#7!(Y67N25|xyUkjx|b7c1`> z-alz`-XyU2NP^>y5g(utH$byS=G&TXs9vU0&tP=F?_IFLH1^85n9+UR2N>6KNM8RO zj&R;InBT*Z`+XT~K4uu{_^-itZ!tESF$;Rc?Mr5BK=N|*T3ayTuZZ`8G#(sgCb zg=WgxxZz4lMRz1cSr~!g@SBts+frce;gHzP{t*hZ5TM=y1|IQ!@%Z(g$xy&ebh82CE=A{k=W zAqM(y1Jh`)P%ZWl_JZJ=N2$*v1~DV+bFv#ZOMy%>)z*_SR70O#TC{9q9nnsczp=3GChdS(Gn<+YG zjImb{9at5>6>~gluA^U^S*FZmJ}^HyAWZSFj}Qb8m%|7@#Et0iHr~unT;WRYti#20 z#u-f7bW^zPwnSm7oS-|XBch?#5~C2zV9I&d=#AT#*vY-Q_EgB&EnIP!7H zuFa)IP;R}?!^%M_XtqcEc1Tc04xx158gf*rJ2d-w2xc_FOyYGiOBF3eB3y4m2Tdj@ zz79^{za|_uLI=lFn1rI*>m_xyUGo=ambuyYpij34tOwfEpt8fH>@X`kEW!6}DM9}Z z+lw#0_$s*_;OL0LImZuE#ilevqpe`2)bD?EDx!yQq(zz;X)C0Dt`5X9TX!iF+x?Nf zcS)JQfqe$YJ1j={#0yjDFx8{I^dLHA4>Z=tlRd2fdYvmx4IiOsYXc=@;T(|b|G~#d zu)fk}eZ}Z#+d3&HSm5?QnM(P-tX1sCSj>Q8(_(`hih~v54Az1z7JtJaDxp0$+NPpz z?qvQL4tDl)B}hjqMz(A?y9|{|*nG?lxn)VT07hk`fLFi(@IvXlP&UzRmy?{d~Nd9xvv&ma66wUG%cQx7~##TXC-murJ@nqjnE zhevLoQe$=uN#oQIdkq5#C;dG@1|5TO=U@PxwbqkKOM@eKAUD4k!Rim{H1;|9;)*C) zr}gl#7h&sxFw_K@oO0HB4^sS2=Em|%lY-{Mw~)kVsDE)L{50EPE4H7!lQdP|Hz}Jf zd8N$yD9xGLnvVef6heOKLeFT1o2KRtm5Z%9c+N-pp)SAr&cS%>VYP0dE0;o!fIbu|xs@G+f zE~>syqAKz)d2@+RtPQIH82iHEQ|cBttHPN#&AWys!oOh8B)hsacJVBYu2OTJk*m47 z&Wn8%dkB*k?n;iuCTo2e4Mi3vJ^KUZO}VZSC`96`jld1FM!j}f^NHhhR`eetw%7_1FA zLM?PmZk_#e?=j4;n zu1RfLo{`zuxbHg3=+QGs0@pxbWsrnvY&@7jc^5T4YlqRE$Y=8~;@{+mPo)_ST}W(3 z^MxrF$bJnIw>%WNiJXA4>aOYCEn$Nvk<5OHY$l#%_Ex+=x zITUBlVA~%Se*{K?iPfqJc9@eCMqskU<}sHqf64HkL@R4O~JrcS#t{SJ01Sx3)Dl z%2orf*_7tibKE?K_Kow^g6trh-rpg28KN^{w9Qffrk{VmV?SA!ht)5@dp>FuNTW7l zq>NV3&Dl`BnQ2Kp@Dc5RoNxuW(o~vOzuGWWn#TQ#CZMXSv;i~g0n?%xP8;n>>5PMc zt|d!84CZ{Lj9SRyQ%+9d(D(i$?*T@3m}DRdJ__U?ALH1cQM$@qTc(y;2ej+43RFkf02m}bo?q8(T?`O9cFtQ+XF*H zsp`$pHd(YyHf>WHTgdxkso-VkYK*vpq_zl^k_tn;MSCbydniMDXeLXK7KEc~si&+& z{gC_{>?iGgc1=40M-Z^=hqxIjh;N7v!*I-V+mWwn7r~z(60UggUIbZ+*)e<-$JvhV z1u?HG*2L^I_V2X*z?*B-%`-ZQK^P153A&>1;ae5-1>4n0b)VG&&1!r*_beuwAjbFH zi&pU&hy0nT`nLYF^7}^7l5?UlQ4SmA9)r}UwgtP)#vr|Hcpa557=t}=V#4JY0XSJN z_aT)-190VBk{!Es4A_^E*n)t=f{xEhP8eGqLtD&_0qY~rVIb6cU zs$~0Z$li_jlZful#*Z71h-bzLIKw1j6VkZU&{P-)u#HROSh;0YdN6l~?eOB8&a2e~$E9}m(YlkMffD-`@k9vqeN>nUbOyf8&i$<|YH9q}`xDHC|gmN|~Ovv`V!36wInA!|Jy z^wdI&BivqmT1Z=dP;^P-WE-HUQfw%#HU45{!UNHa>Qpu zQ)=~;Y)5=%H01$3Wu7BGH=43mPg&rIpA$`4rl%A*;^#$E=IJR*9PtaHDL3mWMUMD_ zXi6GS*|OX*cL`6yy*HE+>wV1C$WB@owKRi!YC2Bsn65h0)T4LJ%fR=#j$cWAa=WG; z$q5!Yj?@?m6laD~F_2f0Eu}yx!xsxSJ!iH$*Mf5j^e+`NOK|+ous#)l!-wDWCPo)} zd?_26dK~S0Vg8^?6;>g6$722T*bh(Y>Tmg%++ofaOoFg=A}fWKOKpMDI5Ui!IN@yM`uH;o*5nn2UH>K_-Lk|3CjZ`;XG^%rLK&+%hFM!>< zMLR=InIZk_pjWBM2A2&^qRuQzdDQ1ltdG~9Df}>92RaYDaotI zl1wEfkp!IFH7S#dfw0-QB?58^fLe z80P4qC64adk!Ip_MUbL!M|_Li?DtTb$Sv7lbxtWR9;H4emtM{VnWMQNbA$`Bhzrs< z7uZI)Ad|QNEP!KZWao|rbs7v+JGagmJ@(~fp#8$wClJ$)B_EtY#Mk_$JMd9!37dO` zu(l9=$V-Yi04;%x__jL3jZ|D!XV$4!!rp^FmQJio!^HaiYhOXE-=HAK#EAv+k0w)u zA1E@vKqfeLorh*?l+{*0os`liB;LmFVUGvB)YqZ;tDu%~vD}x=Q{TklAWbbA#CfV1 zIN>~HQ{A{v(4D=CrGfY47W0>mQ*=m#FK($D2kYHvB^yn+OMZSrl8;RhGPBGror>84xNdetkWJP$VT901%7vZL_l2q}*#M zEq1RduPCRhd9{vEmG$F5afup~yXYINop1oTurtUK#cxI3l&Y*d4R{vW=qHPQa_Ogl ze%$o4o_;p@m0C1hBz52v_AT{D5Jnkm#E5Mzat;2wY(#LNc!xaH6gXL{~U~yIWR@9QcvNGg*?NeWzuKC2-N{3)3>F8yL(E( zF1}>k90pEnrjsLdWo2qB?}W7>2vpP)^7}i3A0~<$BMJJ2fK}E96Y#7+PagE3Cl6Lq zPZII0MAFVOB<);>qz9`C@biEhKU>!0XU8UF{58^cK8UoPTamVN=O#bjocXz_Z<*8# z1>IfhiQtEHyuEI8dpi^TTWtQFwq?@C*b2j)If%0WJgO%t*ZEI&zK{t4Cr5CN*Bi3k2C15Jl4E@}3lsWb_uCcG{*KIB@iL z%xF_vZW1v6@#RXg8Z3Vj-q)t=&}?!_Z@?8hyqbrmLrOrJ31-1zBHLm=+5ZXdK*Tv3 z?_M?3zX9oOYAd~sCn8G`#_fyzSdTI%dQO}>@!^Tily>P#|7EoorP5FWlcoQn@kI4F z2af++&DB<1CTQN0v?2!?Q*Z~9{TxDOge?8<^moed2nfTBb=B4tV&%|40W2HXEW`c%^Y zew3^rkx?h``^HoEjC7ZlCenKyKF9T5@Jk=1<+@3zB?HJ92hZP$`0>lqYs)a5cZUg+fGu| zy4bivw}{cRs&!c9VdODo^w5SON^^ZI)KCwdZ!n1RK^^98U&#yqhz7>+!eC>?=dI2m z@IpGv0KLP)*8zvvVzAZu`7m3U{G|gvdY zASPK~ab1O$DkV6EE%bXWKvp@wk#t><+fK8;=&*cs^49TkAPc5+QckiEM{$&9QXdmk z#LY?2UZu2)E{r6!!3P$-eD^C^G|o3CcQ+-9U&D~jz(_##Gyj9?g!#YQ8W(qQei)$; zLap<=q!iMjov^ph?-G+<1n`$cn@i2j%hcgL7X03wH-2*l-uF>{rD}~Odo(B zL};*@LT?~6m!|~~`e&pyw;&LXZ^Q4=?^BUu2))J&cOaC>L#GjX;i1@FE$r`!UUVr; zJS&0%;M|2T^%t%lOR_T{kTNiTpykN64GSa-1k$O!AcUbJ5;oU}MBmXnh6IrNFcyP%eGKGjnO2 z_={CZVt~!5*0BgvBRdbXttPAgdgJ z9u^tVzalQrX%mgD2~KsXg@*Q4IQA4hoY3FdT47()}B5I+E2W1l!2hD|K?adq?p zaDHNi135GWY48lQ_$J*0PlayC!qdfAEwx;>74{1mmt0}M*(uoalnmAmIJgYwe%-*> zLq<_k3KmRIvgS0AG6#Q;1M0pXB0zxrD-6YM`gDLYL2sUA3>({u*~=Er9asY5TN8!I z^)%?t({xt`WJ4G{U}GQhvsA{g)w}j*!-ovwrjhdmG2=AOj2Xjxl#QENh>y;PotHEy zAMF|}S-BWKwh-3NyqdHcqf(Ow(*Zu?nZYh2O=qu*IDpjFFk1LwgyudKJyTF0mjQ0+ z#Iaruq_igBfNKM1{gP_k7-=KZ13tFAg7Jh2qbKb(4M&uc8At8s97nAU_zp^d=Y2yH z@s5-3zu`nP%7G#3Mw-7e&RtT*vUvw^rS|mz4(;UD`6+Je}G++ChSdE?Zvv8uK!QDnChg~LBBq&fD#v-LqYxIrhlWFNyG;SHX|8IBj{m zwgx7{bX*of-ngs<0^|R~RFkG20pfJ2O50N&{Pcj4wMS>>9LDpbgd?^>QSR z1TzG9F)x!FEAuwWkRR2sG{->fG@(j^_VCU9zoqtZ(MFABJ0ygK?DHXZJ=9WVzT6U) z0)MhE3tMO-hS&eG@)fEDlC71Vv9fgvJdI*~u_u=yo8-4u2*6Hb` zdU^@`e;l1+sxE5P5Er(P-6UpJSEup#C_!t4mud;PiMkY(uTbk`aQTYe=38t9)&^vf zrVF3gRkEA0l>ey?Ktz`LCauE-u%j1;yUltB`lN~MmABA=dF&?g2>$1qJ0B4w(xv&hkDeKsf$3~rz8 zaHiGF#1<*JDRC)m%U2th4n>y=D5=tLtv@KWlP?su2$W2G5y4kOSVUTpPr1$g)Y**T z&gQ)^+*y+60~^J4@_&K7t!@uu~J7+ zDv~=&9~jGc5PTE4?yEBRDI>OA(K;|jLq;pw-F!jFq!rEMg&me0I1GZl&%-26eC#U3 zWPC91@vz@QJz7b}JUUNcHNw1U*FOCjPJ}SFe{5)ST0TcCY?zlw4lI#4H9Uy3L2Snr zJ(%8%m5&a=(WBNx=W0 za^pbZ*ionf{Tj95n>k7=N@fel57_c?xIE9E#EkVj&%5D7iGO8&XD9i!V9z=M&Wg@U z2*aN+%o%-VpYxJY%Aw1L$Iq)^!>hN?xF&Kd-87OpCe;*Ss9=yj#BZE*d~_bUu0-$5 zwElRQQ{+p32G2{ltNE+&JdV4Dhwc>eWX!jn#v{5<(z@Q3hU!exnn!XLs` z3!Cy+_(NpxhTQwIQ%((2m+2X?{L|uZT$=W5LD_<`$I%w zB%;t2w0j9pH=gr&PUAU-rv(pe=-sfP{}=rsI5jlt^h`W+@D$+z&;K|3L%dXnR&;-e zwFrV{u`wC#53vupU@WNc?f}Bwcr1v-d>FpcAA(Ag-r+y?hv0BWmHUtVA)>I?qX{pb zO?bB9sm0TXXE&Z^JQ$n*8~h=tF;#m5zb$x9<6)E%8=L=%KLi(Xsw=HTEr)Za1WD`Y zl_s&5vG(cbhaU%N8Sjy?3g$U2TYj&W+8Pra9XoKOD?q~5aqKZF8~rM-1ApPsfc=UZ zZaBH)`lb{tbP3i&?TaHuUv7D$xnNnt$(=oD4vx?bC$~+gbEx z#k*>f^}w}5K)d!P+FRou75Xa7@tJ6@3keIbp`UqJ+lg1U{iNfFG{JEc?&I`*CqDOg zn-p8*&bp8R#gx)Pz#*-9dax@cr6Z*jS8bYu@25m2;=1p%!N_#u$&^#Z_Bxm&QJVhB zTEiK!8(>o2T31zn)IbkQdISK_P--{(jTTs!{1&YHG3v9)0QGH zVrm3@flFSXL40MSIWB{PW+NKex(#ktEgNDRrRsjs|B0WYp-T)PO$#8 zpXqT~|wEDoZz zsOM@^ixL#*h>GH@2ZXxc5o6Xxv^)6q8)b^?3e3B8*9-xeAHN1i$UxrOhF&QZ*Owc& zUx8|b{w{+(;IHX@@kL+Ui)(rs5tlcf7d(Ec*I(1Uckf;`{~%0lEB#9i&&U_18;{@~ zHTo=L$7Z-uG`8vT5zfhmm4%BSnK_mMcBp4N3~NI z`cF2jZs?7~%i9}zaf>_0;d0~wHT;ZkdijhK9CY0W1oz?imGWC%O9_#jxA29;sSEz) z4ZUif@iV2SOU=ux>8idlue2*N1zYPJD#f$M`~Sv(e8*?i@v>&vjC+31leMr&E$vdq z0^wVE?isHx&4&d z>x&CsjPtt&?#?;x=-6&nZ&Splh@Kms>LtI-We@k@vm7A20{45343;N0Sk8_pMj&_2 zQJt*d2DIBS(OUlqkoq&jRHe3#9;S=>Fs+b}cNJ0x?I&}N$A;-P|AI-lZ_?!WjK-jo z#z4u#!7MTz!!<2BRMiH!EPRTQ8ZvA)(#Np3sc#iM{GRGM&4=d(cN%2TgaBGTwY0m0rMjc)LR|wP&Apie0fqD#mCV@(Q z|9_M~C4~Q9El^LRgZ~=^D&ggr+J@i%)dKZA5HxZ$M+7RR{cjbhMAokmsGUgu3k9n2 z$x#Az`O;q^A|ve#P~I;(A_jJ*T*yRb2ZN*OPg! zZ0S1o2%OWRmwt#Z^Dl50Kn;q+qEh-&Qygv^wcxf<^MYhte3~j5?~FuBUe0ZbyHmcJ zVtp(VyD&Q3|2>ZDMQ_z!HE&J8c3~Or$Z=)k4;DwQE4X+h-WOjUX~%V?GRqOC78T*T zL1wfzY^SCBcw`^08w)#k(S|zmyu5K2uEQ>m{1YH5(hC5(<;5?8GxK)Y=Lt}@~jOD4A#ePK+KmAQI`2qBK10Q)<@T2jr{^FYyEeSI3Mn! zn<=yOr5zJ@cu8x#w?@C%c~3e2L{f#R&Tndv@TZNY6!#9DDKV ztlJitw;WuCKkmuLZOc#Rha!jNnk+$FszdcJ)6k&U0@(ZE>{jyv&Jnv6e2(1-I}iRe zN}hB77F%sifBbgikh6a!=%P6HQ;)5WzKar(a$j=!GWlw~@tWVqk z?DF^FE<5Y4*$BScg_$S!tXG^b!QxlXz|l3S{hhBCOvN|c&XI3rD8)bE52TiYq6 z=Sgk2%u8yKQh2A1_k0M3uX40XH!SL3Z02RI%iC;{CgjLiH zonhw-^d+I{d|EAi!5C0VpM}Z@fA}@NMR7jwUkq>V=T!VJecpOt0uIIUMli+CkEmsX z{yA|tbC?{xbTHWuc(Ai!ifkPeja9gv+4+2&eE)NCn(JA)=2>Cq>-Ydob3U!PULfw< zxw|eH7XYFS?K{4u)|_w9w&kc2?BJ(QY&?xmMAb9KzLehJhtuInoN}ZNx-Xi=L|xR_ zd7OS+dMbhs->C-sJFN$LjmP_(rwt-aYt?xkH}4TQi9Bha7+)p3PRB;qd3x)3we&QZfek|4XF{z(kmkrWXEc}qHl9HT-+@6z z-uR9HF$?VTO5c+b!AkEfij1q$obN?&q2N0tR?Zxxv9E#)0|{lejPg_nGS#djby$(ocT}4gqZ5N7gi|ifuri# z@3q@pz_2yQGJ+Aa-?aGNfXiQRw*29ZOTht9lekQAby*L0#$;gsImqxTrSwBZx~SA# zP+U*z;;iA^!`6c&5M{QW$~;ZiH_BiM+4=Np^;f}bM*00jYyDp%h2K2-G%mbxy}`$- zD$iU!UWG2JW$#{yY)HUX#rcN4U2z?R){OLHt^v}hsVD5EA0Fb`vkNrFO6dz~>4!7U z%sB3!Gv0b&h-X2NS>=C0E0A(l`JWLuq)Wgd>tnkqrc1z~tv2j}B!&w#a2-d_NsNC~ z2rlh+vX~I;CLsuyMJ@zC?0E^L09Kl~w7)m_vh^zq8VN`X zh*42m7D3s1-_zaMAdv(ENgyDYH0jPFo$j_5NF0!0&>;pKR8-!KGom6g^H9-;iW)I2 zLO_HdsHmunq7#HsR3=14`G2Qw-(HeVV4RsZ|MwejeqZX|s#DvkQ>W@yox1Jccuipa z@&K$rnz`D`Ti;mJoUp5*Xam$<(em8B_y${2Lms;8N(_Eu{9=kTljWT!T;RakY0rebx%7y_HaV8|oKsfZA)!YJ#1`*{tNB-G^%Sc8JU`n>PC_WOP! z*M8rV_G>5Y_f1gy;jr|Rs9#V6uEWr0KQ-wxR^d^dl6Fn;@JCKB3lC~ zpn%aRhHeBN48WGKwcnC?@WAv0-@q5eGHZQfUNc7HyiFJ(CoRuAgb6>!-xQj z?tW3dqY2~iZW@ON_cp!{fqahyvPlrgCf0y2eDQI(dL4aD=4{@k`h}a=qSyE^91_Nd z7Vi**v7LtD4n7RW62;I+41)l4XA;DA8iv~;h};Xe5X2pVAf6NjaRUkB!U#e9D*3xe zL0l*bqA(2q!-6=W8$mo78iv<&D};O){w6uFrmFx1z7U3CGGwcF9E~1^kANN6^iPRv zEPA*xYa=W@@!e9tY*hldx#&95NAba_W7g{Oo#_~R!lO}o{EqZq?3fSM9Q9`}y*=TU zOG_F9ZCk#SEdKH*bOAw`p;0kNVS;v~aW?j|j_!9H!3-(kgJevX&|64BY&o0Pgl`Yh zmw6ANArz-STKqZMiQPVmjywpls@rHDbev)xA)U~cyk#OQA_y!W``zMfZR4PGnAP0T1i%YI6@{!rcVgnpaf zSX!L0BQp-a<(9Q9WTN3*LbIJZqb$&C5_(oU#eC2ACWiY4$;+f|XxN9*V_d%nw*Iuc z?vuWCTcu0$<9A?YfuDXk_9$$Fl+EqiB>p&S`?e(f^hQf!`?f@KliIh%lPhW824!8} zB0as0;kRPwHoozVmtl{?hV7oVnL#7@hd~LWL;D9A_xh8uGdiFz{kr4vK7A1ZZ!LXU zB3kJUnolO+he&7+g8AwN$vck6CvUx((oKZTd|x`bgMGI4trCB)O(;6P(m4GUO22(; zl0QCqTl>~TqC#5jTjS{tiMMZ!3&!N%pF6#kmoYwhXXEb8yoh`KLyY@Sus2XJjI(`N zsZcPhP%tUp#gJ1%$*}!5--L-YO6JG+JK)CqdmHx$`t>CyZmVyxZtH8MyWlJlAF`SL zyZ08JDQ}#8M)?+J(Jhjh0_%2zb;QcuU?mKm>vzYuZQ@uLZ08&7;?WPtGhKM@g=V7n|+pbsBX*ldFf&thoOh|%Z;)#Aw z&prurttHL13AadY{v)vjJl>o1M-mXa!?(wYk+_Q&7=ybwe2*M{7cAaOZP3{A3W>w8 zH~iOwr&0tAhHHh}2d99^1SK#8_3ba%waOYKx>< z0$PP!eCXpuW9zW2q|Xh=WCA+9T zGclDHDzqEh%fTA$#;4eWRoWeoTVfPR6+e7*=U!2=8n+DFM#3aTFq*^4tFtZ8KiC|- z;UZ~ty?2J~t3PJ-U$yvHuo}mx8W1X84RWa(T^v1vmPBvI;{1{68qv&*sgH#E5C+WvD z8h=RG)%XoB5|!}-j3*x<4gNX-lYpcK32NMLvwV3U1>OUUyOH2tO0YvHSO=^<{KJ<| zqS56Il{IC<|-&c^Q>zs5kk@NlSGfU!N??dX78mH$mr~dGdRMvvsW{sNuOhqm+0o0=T550FW3Jn z2i`e~Z^O1RRs+ldrUDZH9dIph1t0+uffIjW>>$trYyutw?gMIoTYy;^Ui&jF7C%YX%d2bcxap!~~# zwZIPGbKnecF~WudW`M5Y@N4^&u|nWt;HOVe7vOH-7T{{2?axRDZ~`-d>wyzT7~2Re z0VV*$fioX7wikF1xDB`&7z)G#zx@a^G$0Z9=tIN>ZU<%o*8>*=-yCLa1F!&?0KD@7 zV=n+MKnk3CAHVPmtOP27Yk|%0F}4Dj2}psCLnuEWUY@lydI(o4j!cg%W)j=nu%8$f z%YFQ@+$rQA573S70Pq_4dH~-58;&1n9?c|kY<8*5>2#Ob{8erjQG;LTwbmhV5-$rd z7xS|!R?Qqt3V8A72Be&>FYC?SLYB*JWCi$(q!B_3SPq-aCdLS1EEBQvSQ@A38j~l@ zrZNqaF(v*ey|G9q4JGoUEY-{dR|>fCKfrvvjCm+U4$32CW$?Fizj9vcYED~;+W2s1 z!+(lV&E_yCtA&ppX?PLpVikCDfr4s2kEak$i^8jThz;?o*lj^NH~f3ELYTe_=@XqD z_hmfX5zJGH+yXp(3YQ{ZH_w&IMK_O%AW6kZLu2ef*gy=b~&v+5O0u zTF8t4KBS0G3**Vn%JHAlbMlmhn%Q{HBA>=`J`pdgK;uA}rEC-%4__xzyADs~NY905 z;s%w8d`Jq2pEjT?r(C>@Bs~;MkQd>9IA$gi!v+bBM;>hTdpXT==P?xMSf?XyoGqC zb|KyiAp(bqS5&@n{}Q?ATn|~O9%7k9zQwA6y%WC`Oc#nzt!?AILZ}b*u2^YExy+H= zie(A6pMq&a>51hyzxJDtykh6rwGAWl)BKG5s3%b${W836yB z;9A$7Blg8G#{@Z4FjXkM^XFFyO74P$)gWI#`Ydrsd?HB{TQQuQ*uUgVAIdLQd%Mx9 z)Lw!XrT*;Z+JUsB13Hnkl!K>0Z9tb$4|yj!qS8=Gqz44uLVAj1re}RGkB}cKU)OZ1 z!DZ5NRP##Ce;e0bf)1E_&h&qdyhP_@=lr$>xggd*+z*NSq!s+or=&+KK~E#k9MneS zt)Q8SGh!PF>Bu75=ltb?QWa#7_8IPT&lU9)flk;*fNOc|meTbC=4OnIs7=*2yF|j>tB> z#3VHH@W7?XQ3_ma@v}{vm;?u|mRAfh6u9eNWRlC_7Q?*)Zrck?awXgvxP#%2 zf_pXjKhGpX;7Z|2;cnW;6D0^ca*3Qk4i zFKKEaHl;O}b8|lan|b`sIbKH!O0^b-Cxeq>h?0 zhbK5alp?$w;q(KSaXc5{UjiIyultG3{F=nFP{YaipNqMh0_D%dT`mus;Pg%KIvfmc zfx|z|<_z%ri4pf{G$keC47WF{rpll1b(cAOK8D)*piP9)mc~{)q|FJsUU+xKF<^dO zh5N+d{euzruy$`IIil;Hi2L6}+^>kZzc=C@XX8V0?~k~r-v$-ad_Lly_(8IY^l0gj zp>n}GOs{g;-SZ3l!h{?CMLvi3#yPh*%KSO5a<{jd2TT{@!`we`C<4Yh;GX8V;ysN8bfxjWKyy|qBlVdwXjr^=A)I;<^)|5|-GF;ngpW{Ov5X9FAv8W= z6`Plb(xx(qc?&MR8c{w}5+QFfUolUjqkJeG8i{FEKx2eZ_6c~Zig+$WX^FxY;Wr)m z+mQmz;l-GRpo)CX17GRQLQJ;+;nB~OHMM`fpUsH_wp$1t)D z)zt>-VUP`6W2AYwq;yk@i{<5wx7)|#23J0sKMlxqlsT&BICz6kcFzml-&p2%lXn5M zhUl3Vs0jE_up0tSp2iIU7jMWkkGG1qq0L*y+s`q_8?bo=8k>vXA|HnI8PcUR8PcM3 z02j-%)iR_3*UKh2=CB)VE>>Xk2fTI!;F{pA;&+9W0k1FUH{D@(If4&`0pTvs?c$*Y zfuL*iQ(T644D<|i3^WYkOq$`Y_Bb7Whg9gc(p-9dc6&!6KWT>3=JQFjs~ldcQLQx7 z;Vbi2d4j=Anr`zsf<$RvudNo5BK^YTQk!2oib)G=J&sO^l+x?EQ|coXQYQ6RdL4L) zuK=s;BUx#+%>{j6m(GJeaeJj@Zci=#xqNeo3uBDB<9?W&TZ>72f*3Tk&T z1(F+=WByIEQ4XPP=au_ybDY#D;bMfciKaoDPc1CWA>L+Xv(kXwFZDXm0bErsWK!CN zJE3G)1P?`ihjWYIP6S;{_C*B^k?+N*qF7FF9k;DabzJrzQviCF-u zdr016R)LlJz;~NhU^zGwA)G#%+c7g6}^5Yg$ZEdRRBc(`ND*E2-H%oO(o{2Psj>vIa*I}E3fvTjW z%;}}-^El<0_6QFpCH~4PYC8m!l=%Gi5RJ!1-a;N_c1M{L;iSmyqsZ^n4xFn8jsORN z7N7~(0IUO611o{0z@0!HPy_e@58wnU0Xt9%%mVU(Tp%0B1gwAw&;cqy28;nl0mA_) zFc?Sy1_BbG50C^T0t`6wI+Jt&r+|~d37`!)3LF6r1BZZvKnu_WYy{Q;D}W_{2gnCx zfCM@E7eL`zaf2?CEa_>-rZ>znF#p z;@J89MW%2E3;)IAef)g>#Q4(x^yWwXyS8iP|F#6gEe`#~o#!RCAh~zMh5zE?&hJl* z-?jFCug|%90Od3ge`1dG6uy_>XYK!E-sEbLEYjz>X+Pk*RPj0 z+}*fr`8~f`aqoTiuYBOahgSX9Z-4jj@Bi?~>PH`Ye9aSUpIrCHKmGUmr=EUh!?Vx* z&&KCpcyZH9FTc|C>gLy)w`|?E{q-F?TXyY!W6zs=_qFbS>%hUc-+A}Yd+&d6_`{Dr zKJw>JK0W%`=YMHC_QmlNfBo{SlV5-H?Ww=DpYHhX`ybBy_|sVy7oU*W>w*iDF6y1! zr|-r6B$xCbF!0hrm!({O#g&7vx_XH8nxVsnkGOW^sOzpDJ!b5<@iMtWsZwjSI=#VY zN;O-owmBGN%PT6YZkg+>cDX&bdVT)Dy!kb?x7{>r_RS@w-G~2b!NS`Y{k!Y`@6P`p z=6_mxMrPK8iP%MyDC4QlCXr9jR zb~}Az%RGUx9t{B!D^v5E! zq;vr0mi;j|1jKOBm8M`$6+|gqQdAVS8mc#q|exdrnb4i7C&*vkB(e?ggTp2Jn)U^n_J`9cloGccK+V=J3G!D*`ql4Ej? zYwl!sbSPGXTyDF=UsdfWabdAx9#&k(&GLE6W_9u&S4NAqL`Ug>w}o_TE5};H#0-Xo z3a@{f4(p%9ZmfCv-JXa?=C{ptWP|qwVb-&hTbaZ$S|*brJ^8RHlhY=Xn=^R=f6kel z$=w3(k6Wy8{`^ZPiIaE^G6}8OPA$kRm~rh$UEc;>`m>8h&%gbvx&29jXBcL=J^oO= z#|rG2H78Kzw9lG~l>oeXghGSN8t1Xk=~61>wHo#pqCf3#Y`}99a7gqA4IeZR1_NZ; zT3}Xy;tfU^J<}B#c1ny3e~O!k`h?OW;^0N`BWcMy6Mibti!>BJ6VJIpKMEJaBJ+%l zvl{Pz__;!cpM>c4%7Uy@;A*5x^Q@Vi|oEOU{5f@Zxj6R8>%s{cM$fAJ>36od$<&4 zvBg6O#Hyf}vk=qio`b;1 zFq9=Sny@jz(-UHyiL*>~R8;veB4*Y29WEcN?RfBvv|`jD?8j@77jG%RASsNPSVFXB zcmm?^87yRe`n0eo@<5TZZ7#dhVVzdMmmS5-BLetVtLP7Au^T8K@T#YbiX#$;PMK0@ zXPl3f7zQH>IT^DCp3ju@EEH6(ux5j}BTNgfXSf5z`B23o<79)+1-yj{-F}<1z()Hm zzMf)CMhq#Bkz3_*Ob*b#R1b+W3#TpMTQgG~K6k)d=9p}&c61Ymw{2|xB4c(5Pi;cL zg{@k*>*uF)Pn;#kCnjSJHy7AgLN%NcZz;rNNt`HIY1Y(LE+XerJxRuN6-^_pN(J>I zzN=j2uO*@Ox}AuJ7CRVcne3QvjcE4h-VqUi2>I!m)Xc0r-csbk%OV=W&ZS_6(4|EF z<$J5DvH3Gk5E1lS)a)Dd58M01X3SFnxmVr-9jCMB13v5x{eV6$Z;|%xQkgb`Q8ubf2c8nDybOxUC-r# zOLSCYa1!1n$a|vK=BeaFLjM>OiWL;~SaGRqu#r@sA{X`)deVi-=-m##wa|gyLkdzX zV7DDQB7k(Ks41qaAY)kn_t&QRp<3nykQQe-+bQra2Q5+&RLarJiwr>=5|7_83%!9@ zLt-8*R;2n2OFkk+lqy=SW=|nSElO2X9OTmyYNfD_39$f7oXWXf==Nm7#$~G89jS{1 zI^Iy>$ibE({(s6WWR+qShaQo$6!sy)NJ3);o(^k3E<0ffh#?tS_6p)N@$9>BypZOM zmY`sKE*%-XW(5vsc>%UpV`oH!mvOordu)mvP>d2JlJsKC?0Qy<(*zEaj_D?LPy=Cn zAkIw@=-r`y!`Z{x5Q9D8<`@~Hl##KbN*N_4lxtCpQbxy)F6F`az`PP@H`*;Mak||e z_BWw*Ak=)Q{yXLpvynHSOQ4;mI?5er+%gQ{Ixc@1P;TecdINdsxuPI*03R#@d}0Cx zd}`4tjCb6-m?h0_pO}&5sdBn20uFIWATp*Vt$4ahSZRP1(yd5E3kN>1o0oCj zO0VzX0`TS%R4;p3&=Hp5`3|p-CO{bVMO998yslhpKnx=Kb97%vMzHaM*6TT)puQiI zfHt}{;0QQM=DWQ(F2T7J(m3KxXU!O?fh9)1P2X!>ee7fSO@z%meD zA(~1dK{E32u}N7|Cuij<731u*y0x2ZjF5J|n-BWz3zp@Ie11J5w?b|QlVfM>F7E5D zhDnE=W`k)k2P|}WtE<31hgc|fAhF0*$!E;=EYZLb1%u{h?1@ASoZSZ}B=6&(xOZI(PUauQ@?u)0M z$_*pg8~h#%d@zE1Hesr*%I64`k+Ihk3!Oe8knN;OWcGeq4z7C8A9A)cFJ+qbE`njej!0wJN-66~J5xQ|C07y}(l?yc@7@sU5kjUO2$q}TK+yCb90<}GyRL917# z*ZLjoeabx+IeU}0P6o`bK*sj+r%bYJaM!XY6Q%?l-dgB7ZpsOD&MOU}x}Qo_SXDMR z$b~HtvKtgi2(Kj}*KLE;&Vl(@En4FsPo2hbe5O4i*Ma5S&edgKqF11GyZC!~4*A3^ zR!R418TpK9sT?^0F#HR5@-{4a$y%w-5B z9BRWE@Z&hU_E+qq!O&ZF8Dmm_jJ%IriXVKEVA%)$D+mKY1CU=cuzC>u02%0{fE5Pe zs}V0BVOF3O_Y$Nf>yNbXOejTs@jf4M8RF$5UNdNA2$#ZdHT+^hg78Rxym~}EM~2lQ zy~t;}kL5@HCxf&bg87PNV5oB}9NZ84A7B>X1l9-d3*j~a8-XQ2Ca?yu5|4l*;6*F( z0QcC>VA!u<*tcM<@W-A8!+r$!WAI~CS84~`pM;A&42Jy+RtK6Dpr!a8xTS!V_>6o+ z3>5D{Q%YfQ3F1A~iJt2aHy`0LqCq|$xb#deJ(GVvsDS$HI0bm>O6>#ZE*t7z-0`~z=0q+540qNH`{|eZE+kmyecHl73_Zxh09Iye) zfmeY;z)!%CZxIF*0=EHA0DFP2fB~lv29yHJfIk5Tfz!aqzu~L`a0l>5pcQBb2DhWV z00*!f_#faXaLH-xjQ~YJ4e&6~415g?=wM6@%m97`JOsQ1d;pvQuKEt=bb;xB4`={3 z0Y`zP@4+je6sQG$4>SP>fYU(VA7DQQ+yvYUya>DvB%Z;SW`HuF1xWglF%94b9s+g) z#{lV1;5X0$T!qzSE8qiu3v2;S0Ld(lsexjk0oVY%4J2V(eGHHb)B*nkv;n>1Lem$E^a`=+qV*%j0z`5CMod3Lm zO~T2EJT@7Y>iIayI~7*jg|POY2CMF3HiOM%H?di4Hf;S$SSh1(M`f@Oci{91ot3P@ z4;{>foqRRyyy;xmt=#II?9=D5`8c0di!-dhg00{}*aF46NSH`zWhu>9 zR#hbobmH1zMgU>5HY9R^_XL?RF^LNS=vh>5eu! z#lNR^(X?d19-A9C2K=4?O{*NX>X=20Ng$Lf{BkHv6?>}bxoCwHr#k#LT7eW^Z$k1J zZaiUuvC|R`$&j4CT0tI!<>Am$7>P?H$72KwS@*R6&?yml=XF==4#7PNtY?OVm-92) z|2!o1yds3;t}AscS?Wp^EgzAxaW2}Q)lKu~iG5cdyZLzoB8-k~ zgc?4Ssw$ScOG_ig6(JZQs^~X%w0tbmnA)%_VW-We7zCl66tVC1M8j9lf~vPCx{$8v zO2pYC^w#iNy;wr{1QiWJ4hDY(MJB8jg&(K?N_jL?)nV9-MR+56!k0t9dOB-`> zCnjZR)ib=F7)u61WIZN$EoNQ>iuRc+A-je8AX-?H;y{;==@OWYO*$LV;YAGxx zE4uXOm{dJ=?U)h7MnhZs{9fpLES+^L)k3d6S9s5&dLCUG+8@SMURpHoz9>Xf=*3Z@ z9%;JW#g560bGJgFw>HD(FRSc6Q+jDHm|xW+P3MiLu3|GySiz1}%1l1F5*8MPfkP}z zep)8izTHuzV=FmGQRFYz^_WC#f`}Ai$DSw@plcw-6aq`Mu|{l7x)l@15^YHN@JdDc zp2ui?9^|31x-+fV5hCYJooTusr+cRCJW7kyUHY^b&{H=SX}TGo#o$gOaLBs{%Z?z; zgxsiIQQD40%S`AjwA`Qf^{!)jdXz1PAPv-&v35?WW#R}M?Nf_0?r6St<`!lgJTI)e zWmE=SbNQZJ7uI2lL0fWUOu-A)X_)8lyMuVE~H!(D>0EP@j-M;oMbM;x6r$8vC=NR1%}%hZfBs{#ouxx=WL4XbRHZw zisB@lj2cL{bwk-Tv2b$>ypxjzJ<(Y|qgwoHxNJ-AxEMtAjMLhJ7AhZL2B4?q*qlAIs&90!1Pijm4OGhT=e( zl=xtd?>I-4VC^WIT1Z62-xJA2^UO{X6p~0EelosCSuZXjgC+~nork=^5UZH4V-fw| z$&_NUW8oQ5#Pj70GK`9M{_Kg2>7&_pup9NzZqTTq+WE=uFwB!!y)TLzo#-RP<(yFi zIJ11dIdMD1Sk28BKF=}76b3{=Y)c}#Qh3CMogwcu=fyBcSsJJARQFgFhW?91dJZ;; zvChq*AZ4dj>XK@{>5fJH|F~;b6Yb71HV)GkeB-kO#!2onE6&ebtt>Ju^lhhL*yPWx zuRMGCYngODBa+UK_rj7YTI9F#b0;wW$L2Ou!2002wd}7z{{&B;ZUl&Z+>XfRn%p zpba<*903jkhk%1XE3gOH4r~H80P6svUk$7RRsc(Y1%L;z1Es($ARjORGT6#?nLrab?qRR52Q!ir0A_BTE;X$>YorFYccaZQkoYd;ol9(_V^7e8_YmNkr7 zZ?EI-I?!)<{QbwJLU5P=i+>WltU>qr^Q2D;(!T)ueUBY|>2q&S7>+n+) z=fa}kbqe%LK;Iomx06o4`wd~767!4v)+zZd>l9971eHe|D`*ZzSMggIABJLVfE!o^ zdnbTjGho9;%-q$_2YLIv@ZQ6XfaG&_vt}E|R(fy-;-Lv<~tp_Gsr6>RJyl3>fr(XYk zm9=&Dk0U<2;+`8XKVEOW^}%-^$hf%I^6Q@YgY~=DR%iZoasS^ezT+k9Yo@o??mL?^ zq-N^@t9!?hWyk7vO?>(Ob!km^&Mg|LUw+ziWI=keSQ1)na7_z`0eTAf40 zz_d&&<9_aXXJ;>mAmVA4@vKipIW+oL;&?=Z|-@MekByw50+a~ zd%yd*hyHa~X4;J(-?;oCSO5CIS+*S*%v#|FxyH->@YUubjC4^(ViySl7N# z<$R{stJ=GcTa>9y>9>9M_R81Z`HN-ik3a6UExBa=p8q~-8J~O8pYyhFUirZ1yDax@ zFE9o&-yFF4x6fEUs(5*&KI^HgpWV08GJM#MPnupf%59CeS!_i!w%q<~!Giv;lvv*V za{TfOHs5#Wr9Wg^hFhLErhj7O7mLViGP3g_3Ky?1fy zz26%yzpZRUhP-*b>6(W9x;rL5w2A%ruJQ2F;-o8|ZTs}DwF$-@OR~~0eBr+W+7HGV zl(!CkYuE>hFLPGR)UW;Z=H}_|KXJ#}$DUVwQu*8^PfmR#bHhF z+!4Q-k+`P$qpb^nXxnl1AO5m*=Jb0_ujSVdO_@B&G3Uqn-#l}{%7vF49sAKEd*5nF z{BZ3ddflO`PLdhwA9YL?x)(x!`TtMh0MrVuIQ|X|9a6_1@lW)R$30lz#h>0KvJqA+ zi(@mP#EuFPmvI@IRNam{n%H04lfpi0>O zNgY~lbNU=Z&8G38w4)=3(vP6%lDlbqR9Q{qLzPB!(|D1eW-^-0%*>fQu^8)+{N^8d zrqL<|?WT}r$_iz7$sU(&mwh5TC7U2GlRqeLlDEqTC=?34VzZ(}aZGViafR}~mD`nv zlvk*-RC82IR4Y|GRG+Hi)x*^)b-B7;tiN9j;Yr%eD2|XSF-D znYyXEyL6B1w(I_?Q|L4FGxSdVZTkE5Pv|%6cj({KUtt(w7-LWytcH9;so@U8a>Gi) zw5=D;prY93Pmm%5Ic-WWSQ_ksX#Dmt7*iOsE>>zENGMzFB>r`cLZT)UT*dsYhwXX;hjV&95{MX`a!AK0f0$rJ| zQs>h7b$9FT)%{6#K=+xhLzk?-N^jRM(BGwhRR2f)Gx}HcU+aI;4=`jJY=)-{9~k0| zR~V&6g>ka6!Wd^7Xi7KTWV+Y1%Cy=fNxc+Y9h;h;T9i67_14q_sqy9{^JV6n&2!DS zntyL@H6J#AYW~XnH*=ijLW{&Q$TGw-+9J2;Ef&ip@b_j*rNw2bvHaHZjOA?$DUw|9 z_EOoEvMkvo*%VoYY?15<*${cUJXgL%zD#~d-X{N2{yj{fC5l0c!HUt4zzju>qC{a= zI2B$+tzwblF2yp%O2zLKs}<`M&njM3Y*p-3ys6l)cvo>)@rmLuigraGWq;)r$|1^; z$}vinQm?csZ&Vg4XDZ8-^~wh2qsoKI50%H1Qq^@TwaTTMuc}u)qIyF0wCZ`)yQ*BY zNrl?0p093D->+V!-l*QJKB)d!{hc~d(?>H{GgPD0I5qP$4{ILRysFu*`AXx`uGIck zyIp$`T4RLHshg*JRQHnZUEL45(fU;VT>U-zmEig={g?Xh^huEM8w`zx2MwzY&l;Kx z3rx#R514)jPOmlfPfbZxrOrxSm%1@^TWU+{vD7b92bqVON1NqltvL-mf6lzjveL5N zvXkW0it_+)u9mHnzX84-g*=`D->y^06(+?b#cV~Yaw2MdpYp$yYnAJjpDDjkex*F6 zOjIdVdR3ZgscJc-agXYN>JTLIsOlS4fqIsDj(UmaNzHSbO_~70uR+}wn)jFoLQYVbe2gP-M$2Z% z_M@+zk*Vd|P^ZfjzgDio55|9tRyz&T_}(hBDo0hIa;oN`UpfhFXp#QUeDYVcdhF1;y4euIWH|{qcHpx<7PCb#DXihc{FsGOYo2BL) zv)jDfywbeN{IGeod5w9UdA)gq`Foh@Ct8v$eJozfLdz=4BbGImb!fFWEvKoDrTD!H zIM+e5sAM{s3Hl{dmMzPbJt%uvwpzAEwobMYy7iFi3)LCbP-xc)>SFaR>ILe1)T^N< zwyWP!x2eBZ575lg{7v(^)}osONn3yt|5fiWEHW%LIE=R#k%328V;(HqD0@k^8QQ%? zwpaF+>=3lrC$i7M-LGYTll>q&E9)h{NZwCAKz^NSk?M8T2*c-w5vg+Y_a9Sto6n$S zuCxrZjIxZu$=Vr~MV8+OYqPmK1;q+GDZ?3zOMQ$3jf0KDjbn@|qX{EauCdTK z3$pLTNToBGOjc8|X_g6Vs%#I^W7=Mkc8zwOcD;6kcB6I^ zWV;y}s71R6Bg8@NA?;!95$#cJ8^(!~7%4hXbEZqwCF%M=M-9}a=mzVg7&S)e#^_`^ zl}@KK>8!d;UA8V)m#-_-73*f{N_BROBuRBo47%AInL z+%K<@FOb(klP`rXUm;&9UnPH7zFNLUzAn_(P4Z^>c6p0@kGz$0xLGkqDMRmm7&>Z$ za-*^d+WC<3Bzk!wM$W;iF)EqLs>)R5s_d9^Jgi!yTBq8e+78Wi1V>~BtEFnIx>W5{ zFIBHpZ&0_YPpTyvnI>Q3(JX@|Ac-I;K%w!)G@9=)NGJN6GFO=o?O3dw1-Y>+E0s>A zN9kAAC>JQ}luMLLF@CR5uH@xftz4sA7cAW-l&=}{pcdsGWh*b~VdW9!QDvL*M6k?B zsy-@-Y9KGWR5e^Riq}A;(y2_m9@(f#zN%1FteT}NMV%_4#XKs%sz$XyRfl=iQq?lm z3ebjcOHc6eL9;Mc)vr)?$=z%)*64Z8+euH5ndPfsxN!txAhCPN>$Y%#6lNl3@ zNsvwn^IvgVMn35gak67Ktb&YgiF zNxR+8zVB!E_s5TS?)m$i=RD^*&pGFLo_laTuv;(+f?&dsybAIsa=zPObE8ZI<&~<5tA1?5nUl4md*>wwUL)?>HvfzvSy?wzq@y?&%T;SmGr3>ca zUEq6j!EzpdbU`71yB5sl@2~Rr%5Q$%OE64AADp9?Ww;r{DNT1v+2nWv# z!hFikHwXuHP!t>e2M||M1flQef{;C$`k7GInNN)k@I3N)@S-)pByQLyBK+1<_#ynL zuQb?k|8fLj-Ir?De@*6$!$9anb)j_1FluVIe+64eIe& zjh0opCXf1I|M3KIj=FrP!oOq4Z+iUxZ4>>^aSE2Jtp1)c+CrQMh3NIVa}NRvX(WuW@4yNf;ex4 zp*rsOn;zSi@d_a&vs`c#VX3$+kD?%Fs(*m&i!#-N03J@_-6-bW;6*&_JJBL-)l?#i zKlRV!RzK7-pZhsrgDppCK}A%<81zn3dBrfcK4#cRg8FHCQ2B+HxO~$XfE?b!5%&4) z{46yqZnJv7MJeGxKpHTdSsABg&IQ7s!WQ_ZXt&QtMzniTcwym5&`Y23BdG8qQGVsJ zfO7hQZvq+-3(EY}LlvsSKYMt^wv2Lh)&XixlixS1r?g+Mc(lI?MQxyc8N1EOX}?wt zJxKFb%cP>nH6z!6sPH8l`90aAXYr)P8(QEdHOvhaimLv(GXXAIgm4(;Uqj#fQ&#pQe83_Akq| zm1>#Weh#)?m7AqPd{}(KN;lX$(~ZPxPDQLOMc3j;tfmkIxz`*O`FcD~{zvm;O9JY< zE!sQL(LQ-nZr9?V>HIDN;aFnW5Fh)Ly#JH@PIX4;@waJX=|P!MdTfhkjnYHDGIQ@- zo55ypRTk&wLbS{-D_1w>&h@Bb?qYkO!qI1Kw1B77IzgSX3}ivEY&FToF=Hi-N;4%19L`KFa~EPXh#945z=pb6Zq%HwWxmLZ5j@IN z+qKN+^@_`KmjPb(N?(#2#dF6mAV)C@pmP**Hk<|c}Zx!D9mNzyVmQoOAi1@tz`)hlw(pnN5}%u|6fS#j-TjBN)5 zuy>TAwLJtvvZzz2ExFY!?=TDM;0~v{+@xjJBdswY&ZWei<8-9Xs`+xODPmN&U~BhA z7*rvlqGcALtQ!=}z%*f@Pc#h_QQy!q7b6}0%y8=?ZKAGZN4p~NfsXZLExPic`tMco z^jbH{e{0IhvGgb+b!#<%+W)`@B}W0-9j{p*-wHe`)IwszNUHzuXni+#R%EP@Z8A!8Ra}(B+FNFM)@xroRRBM=g^u^q0R;8XAzI#&5!JO=TKZ-GPlI1 zi3KI%Z6#uwcMyFAL9-)w)7Y)ZsZO^#oLLrQl!~1M7fa(UZz)pP&lue zF~GU%lKGggG7|tduSCoMBnt-|gES)wNjNhKX+~rMO*?Nk(qfQis1-$kv=SK>(43}< zYTmm$&p^xys97t0MiQvR#1M|@yO5(ZLIryu5q(1*CjZ)M2)FTw%dKPg=kk>-k8d$k zsAwMwHuZ~E-(sKOVILJzX-g!*-VY$TAZ3oSd_I~nEB7eHbG6K&1ANTPE454$p#{_d zz?(Bguz79x@hHVbTBZ$IKztB|AzmQ(#-1l)@-K^vKcG%x7SfH_#`<_OjZU0c`wnNZ zLK1usZi{oxG_ims3AbXCI>(HRrhsI!2O>$JATkKw(tSErECd>J*+ioOte>a2&=e4( zWqn4kd#YgDN7U6a1?19jpa~)a$x;heH(ltORDn}GUMh~^(3nu<{R_xf=F=*YuXhhn zXMiLJK@w1QCI~kJQ!2I8&3@_@h|O};;|=dvtP-b8ZJ6>WTkiEK7;{qC4Y4 z_glfZg_p*RP@5f(T7GQuKwif%)8|VJzqy?LQ3SE$r?G|nETt*15}_Fsn!OTeA4V2v zJW(fqj2^wDr$TRN%4I<+*wpQ`uJB%Ut>C>f$MwpB4w!kbeAHnZ`h~5XARyV|ORc!j z?RhK6_WZeesAWMdbF`LOr-qHF5l;_LLm#Torw1)yV+bN&vC*P6rw_fXum{{&a?#N& z?}2IhoD|f;YsdmCgD8AA@}@fF3R2V=*c@Ot;$4H;8x>>Nf0n8zl{?j03?(RN0EzOo zUylIJ@w#)OfX9H;cN#g~^&|?w1=%DQv8~NUe{`VZKM!24w-XG^IUk(O2N3%utZaPa zlI7j_p9QyR@)+#0X#E)lC;n%_b^cj!jq%`kN6}-@_@weDI=e3W^RUb31Cix@65z%T z#NBZ;qYWQO9&)79c3Dce8tQF;VqKdvcLvS=BN#A9h6JtCH<>Y<(R>DbBSz9ufE~q_v=XRTDKah^x!e)zPdqu*U^5&G;P)ssCe4)7d6LiIcMiF+ z({m1G5fTpoMem9I*g?&q!t7r$X(}uHu0D1bn)Yrwhq>^_v7?-#Kb- z5K5`0z@y3RrvM&#gY{3M__iFj6}n>tZUSLnfl>jTl+v`sPSoi=gK5o7$d7c`HAh%_ zu%M9AcQk0}^j7MI3JU8nP*Nh>2=E1UHp$A)K_|`bMP{bz>CPwNBpHiUB+J8o0tTtk5!tF#A-m<^~Mw+KFq zml2JRfK2Lj^&_>)j9kUp)6_3n3Nopa*2dR>wY*_SaP*0Z@^FImrM)vSo@m%y;VIKP zQChC+5v+|Qdy&Exp*;c-ur|ukq<@1ggUSsXq+HN9r@~#v_9CsqCzP>?C?5lvL@DT1 zKQ(2P?jU$qu|Y#6UPU)fFIo z-9wrdPAo#20rrf&l)3L3h9L|_G1yW}LLi)Y1tB^+@hzs()P*X0=YyM+rb`HFndgZ8 z=b|Q<=n`g6C8>Wpk?5U?fzvWiA}AM90YNgO%wa0yCD{6si{-T)MLI(4sat4nh-Tj; z_IC(Y_9qshodj{b&*063<;7=Ye}l>-C5@~MYOj-=aH`9)mkO%o=IP~@fz#95(@rSq zlv1S=-yTq1W{2gq!>j_IK0nC#w7j_fXtc_%KY8W2EueI?W z6!Kns6@a^#b@)=KG_Z|U&ybEP+ zRyviM&H&V3dJiJ;D52%4V69W4C`tRZf1@rV?Z8OdUwdsi2Epq^g$gzcX9^5Qq`Hj$ z^*#zx`L1c1mw+)O$yKpf9@fN#_CSkeN%O8mGho#eWG@lTMTOVU&stXIZ=wd={wB(E zH&@+YD`@0n2_7x8i(t8iu$lkWgKW`tP3s7O^xeRnNH1n0a+V@QoG96)NnWBjyB#pS z8ij5_h$bg3Un;nt*1PDi%XMZ!oP|jVww<&4P9pg8XcFKc()NOWY9G#{NCCkRt5lMz zqcx!xb(zD$%p*WB1!~c@BC}8hg`2w2gxZORXCosv`^`A>Ul(W5>c<|25b$p@c-S0_ zX=SCd1jWVi$nm(@A~XSlwkYxH7230*eq1*&^e!~ z*B!&+6!t6R^U@ZSR^MQCh)0rePCzSUtRj$M1EJjeV`OoH@RggA*b_*Kt=!`WKX>J( zw!=wOnlNDBAt15ky)Fox=I-VOf}lRRjumC9HH4NMo}m5#2>C5HtpWC$dvA!Eo9sJU~v^RGdbHkfW$ z6PoCru|*q;Dz+Xy>>U&gvH2*e(~!y@0u2YcZV3!@RhC5AuMEqle4~5o zBc2MmkQi5xve?@Y$-b#9??#OC&v7)HE{Y~K6ft7Cb&vA-bLgo$*rZ8!_$<{0iS2+P zrkAmWz=O#4&yi%d2NPV$XV35#F;FCRrQF_Gwa&CUrwOh<n{0u;ZWjQ=cw_;}`z-7(Du4|k2&5Em#8{d4Hlr%S+Ln!MG3CZ;VBr+l6F?_~ zW`PI5X93Yl@FlbI064lr7jgQQPaR~fU`?%)lWTcwgZLU&2el6qs$ZPiok^S#K+)vdp}xgM1SZEN>hpLL_@qCv(Lt!BW9%>kkL(K{2Odafpb&8 zwQ&&rP>Zpj6O-NSJ_4o|&(veH_1J7Zc84CDug9|VSdkt})nkkG*br6|Kq=8<@9VKO zg)~gm$ZshDo(t|n>l*?m5VoNXA!5nfN>+E1Dy zG}9~MS(^k%3TuPlfrJb}nr}xb?~5Q}g?8S%hu-^&Xd0dOKFK3|_MP|c;t_tjI4>7c z2|=AhE$pL7Cr*+Jsh}WYGew02kyh2*z0{q3l(U!S9yYHC-u)#y=TRwMSD*g-qVv?+ z7z8EtNe?Xn9TW~Af%RZmv^i8=okLQCRvv;IMOM?{>B#DWV4sdGZ-adqyDbp)>uMpb zUfz%H0t60CdsFM&7n322W3%Ub!~^>5$sap=P#kb>p_y|OVmo%O(q|6jB&6^+k&dNg zt-c<3D(w9c71b+8iT|3X2c8<=mIhQ(+bu<<{}Fj*aXq7mjgs5u8U=>*>ai~_;f zOBRBZp9|y$vG4fHVTC>gD+6?rIpZi&^h2q9WtqqCJP5{J54Q9b`Esf~?7I+>m6i4m zM^G|jR`yzP0Pydo&Fj7Z^zX`?=ke<}zWE+GkSLej&}za(nvklL7!jBzq_!2^iio|r z~GC*jG8; z+Mb}kRWOB`t9$5JD_(>ldxy&(uvMv?NO?K_W?m!N5!`%t6eoF|QK(-xtzKSd7j*pa zo0AIU?h;fhP%@qZQjXKLXTZC96Wf1`BM5KIt~FiUQLAESC(sURjXXFkR^W8klF}bE zh_3#iSxN)Ry!u=(R0rhC)6{TqFfn*J$%yqGIPuC#lIk345t@rl-aXKw`HRU;w2{}c zHXb2HE;h@~LDLe=Ipnyp{c-z6^(ukjWK)x zv3uAvs8GM4u+qQUAl~LPl(D}%&Edf@>tMv;6sa@kJFtHEl z-cHyEz&e~r7}JEc2Pz)~-r5{$kS*t>C@2txdSYsi=h1b2&Xq#1R%Q=)lw{}@%PnC8 z0V!~r#S}U!In5?zBBnw8g4-mJy1+T~i`%SE28xjsnXe@`oe|9~NzDoODdm=ysn(Z5 z?qc@8azF<3V4{{xGEz*1s;MPOb6T1W#b^M{HC`0IEY}SQ(m&VV$Pp9kZ=^^+0wh!0 zeHuUKp_|smUZByEG(Sf)%}5lpAP9wD^k+^>c5NOln^w-5#)CL^se0^xIVVNDCY>8fzHePfM+SQU-VQIOd%Eo2kybXRo8Vj zV?aG+%~N)9)yo=i^j^}XD|19-I6`7F`ZhO9GAh!LT0Z1=4!XUmA?Q`{38H3gtW=PhQA# zda%e{=J6=bYtSY@=C+A*-OK@WaONLE?28^~g9dSqy@pcSo0u8ciw&`F{DDeHLuGIu zp*F#tDbet#2IBBK=+TeTPsQi%7cgreKn{DU6#e|kQa-^;9{03^SccZ@9oQZ}72HSa z1T~16rz^xtkR{*FbqwTt;O)b{WxX~B+$+HJX@gsd&5tLq8*UU_fqJ)d$o`sJ*}%|4 z^dNeq0Tp0#S-+3!g;ZDHdIcLXFyC5G8wSbJm|sJbWwM~*uz1wXX8Rm6S5>G+vj#JI(z?rW$M0WLgGYHh(!&%7)Yj zEsB#Vt}F75VR0?|Y5b-K)n$)m_!mEBQ=ENpdTMhE`|N7PqnMJgz>SQ}R$5C!`>3nHs`GRTK^_WjHX#dIGxR1|b(@>ca68%`QA++e5zY?l zpa=;R_4e=tsLE+uif)#v)$5ey>(mmHeBEqqdI_n%+)8!F8hL$zS&)O4hU)}>`yXH% z-m$*$aeT)irG$&u%SepuC`6tfZ=m?M3bCl^@kWYQ7yfN5-bC@`h5lIlyA)qg_(UxJ z7{$L-_&2e53&p1v{#!y69x4ivafJsdo{aW^2-G#}eP-=UrLtpvB$+x`N|EYy4|0hT zJ+vIAp~tEu!P04Qvwr~fD=T$n80ZnR2Ei1{XOg^OkS`=<6~~reE_(Gb8nBEi; zQwBQs&Bw%uY`{(vf<$+&kcRBipq4qGW^uBQh1%YTKxe%Q`mO|AU3Kfqrv@uHaWUclmHy)@@vVZVv-ZPlBd& zQpCa667BRGG_qv6Aj^f)O_mD?WuM{bO|X4=dmMM5g2nuN9Ji%-}fy2?4h6M@Dm*%&gd4u_W=<5^(~X1l?d*z)4MDW)zFOe3Wq7OFxlGN2#NG=_itU zl)Ac?esG*bGvu~+1cX(b-S&W7*9}o~9;pS+ZYdeYqqL78{G2_c@VkJWB<$5#p5+^6 zF;%{i2D|VLlXQ!^Vx8hTrz}~AbZLRQV!h((3@=%~3t%W^rkcJ9ksG;QnpGOfJ3GBO#&RB^zDl^ds1 zfgejNLp*ORS~woZaKdq@Q(3YeCg=S)dB@h#n8P;wZ%hM0BU%!3TMTm0fF0p-Jwf^) z5y?XIL#OCVHN2t?5AQH`%6*#sxEwV7vtTeZh)i8LgqmM&>=ASS8FEMvC*mb&VnXCs z{)HN~k{1m57Y>hvJ{buOMMKf0J$F=0fE&v&G+5O<6)=XduP`w3hAV6O^P4n@dG3A zr+NHfEWYmuLRhP8-g+G(>g+p=w7vABx|psNaRkLB1?f~)ycZ?3ITVC6fYt*?qM6uP z&md&P$$rNlJsuCI~q~#J-nsaX6WHCjcS;Hqyvmp}Kns zE6RZ(i*n4GbcJVXb9jF!4N?IAxdDVS$v!n=Ce6O23maOup(n0@%05}GBkf)$I|ZGC zZ&EdkIzgQF)i&4!u@|%9v;a4k8tCeOtDdis=Luqxd^}-=bPc_FH}ACdkfBB~rOLsC z8nkU(A;EwSaK}-BZ6}DgRVwi7iTn#6VC)RAcgyfp;81PD!fz`mw@4HC_O&WRrv@FF ziEQBrGP5}{k>8>Q$0H%q8HZIuk)PxoF5gA5r}0- z*il)J@tPnrbHm)<{#JmM!OarihLj!6hxxay*aBU)^mXRD4B1p{R!cT2>w&`&y?HNjvDAuYNJmcyhN&uwR^Dj%ITNJ+IV zVpsXtn3@wJ?|`xTTFlLsq@umOYZ<08^fR+h-J-O86W{tnY0FX8RI~3p+^{C$#zVjB? zJAfKeJ0q_F^uu6?%FoDie6I?5Y92UFGF_UlCd@NPUrG&#cg*{mLApJ)N1PI5ws{K^ zq{&DeKksWs$p$GdA2+4;NM}^cfY9z+0;jv>fFU$+94!c9R!f3>+yF4|VtGKNO9RKz zDM5U$Mnwj}KZVpbg8v%e{}OXA(yR+}vNmP1t=P*%Iq;jX@pBG@a+J(V`WbRIgf%f8 zSuc)tf-v&@Kjvb*4AK<8>5n-GDRa5vOv{(USut&%Xn_k!?)J0T8IuMpmlwpjA@ZTB zm8nxm0p>YMl`GT*kW>@p9VUaAUZI_>U{l`$8h2n|+RP2ZMH8U}yTnVbRg*9!QmCY4 zgk&Dgzg+#`$o@&2{ThMQGV?j!81XI|aRW4KWWKHIf$C)n^$bS$jlTsOOl2=!j2Ye6 zzKe0Kgyi+l<_H%|h50=kdDxf5=3$1Bj{gRH_ZDHJ8MB~A+`d${8YHiT-$TJvDUZ_v z`bJ%=Dcw}TTxh0}jT@<3Vog#h(VFz~4Fi^s3` zOojq(qMJ>pOiUiLZ#=slJCjQ79(==rKF3TPALu3dI-x;KlfI`j~1tEV2TCG%d5gmF7q#UwoF0%yC=TJV8Kq3`K z=%~OVG$6?v>9|Lz)e~y}U1&jV5ndZbjJu1ekCF1(ez5|It49h4AumO*`WR6R3DpHz z(gW&aL^8x~LJaiZ2By(oqFU_R*b9Pd9-}^w7N{64@NNbb&|V^V?B3Dz*$7g_fL?Ji zAQ!2RwIVia7(Z?{5e3x8P9l7)9zS_uHxqbLXEgTFZwQM3V(eW6;Ula*M)WT%q0zdf z;Az5%(EWoA8@`t)iycM5%1Zx^k+I#WkL`Fh8Q7-*39L2GP@#ggL*fK=iD@+XyOb=4 z`A~;FY%@j2j4}2qq64b}xMH?P&36olGb)t1%m?Nt2ZUQZ?0p2m!<8_?4|5|ryp1>W z6IZyJJL_;UJxG&w8B}WQiQj<+eS7&DR=i2XH#!>yF`I3p)cwkf4klMd`o|gn@muA9iG5{O*m|X4v(iW2}QNfOX_O7<}c2!aIg8m)07hZVbWpX>f(Gi97P939)Eg6PpThR(>!2j43M33S~i!?LRmP-R%9f)PN z;Yv2P`=fjBvI>6_`xuUQSd8%b7pBrNsz-b2A#}u(Mw*LpoA1vK1rQ6{u9k=3#Egt&5`tFe;-3yaEP*7s}*?a*1xc zoYV{%mB!UCOPXS9*_B9OBjfvn31TKCpXCAS>#@j6os8k89)S4~ z5Vm*R$;0YXl;Uq3N0p47{s(g8866HOdH54)LVS^26p37vhlivIq<$Dnjv`B? z57n#eO$e~wgP4@{%ZyV@MULQ>egeNkgL^doe&`=#qxwb^)70aT^T z95E_T)$1}#7ggUOQ5E^8f;q$|)}~bejD6wADRm2+RpHE=;hjqp;h(T)l3m>zyL^F0 zSE;+i$kkk3>%~5beH)V(?n;hDCTn8_4Mh$nJ^KUZO{K08C`RJT&A<(_M!j)$zdRkD z{it{l6-iomV-TBYfK=&{MqYK%Su$QN_7>{%#LXf&AwXa2EmI3=W@vBr7jH_iHob>x z{fV@47_3b=LDkAwD1MyyXT<8fcN<9-J+0AVwxmdrP{TMsS7*V5KQ-%hfhsqim0XVG>H`W&^y;<#R$qOLX@ zFTfKh^*%W;!*RYA+|D<4F5nhT1$CG<0``xX)59tg`tS36!2`pRB@TWOx|cX?)Boe>^Oj93O4@l7IFV|C(Re z)HGNOA`&^U9v>3nADrVbm?6^T4lFd$fsS9*BHGa& zxWjC3XM16YC|A8%+9r#($);_}U<-JEELFS=U4@ZwnA8@ba#CTacWU3x*1nykeR~GW zj248WYq_VQOns018|-K7{dP?|4M!00`g^!JD2Q)}j=^xub32f)X_vvDAQG;0@ZPfq zADyz3_$rRG9o++BURkP%xf$%=X#IgVSKQ4qI*CCT3-t-QqHp3`74!w$)kzH>*8|O3 zd^`6nCYm57_CADG@fnBwv8nd%feZ56M$wXYx;a@68{}St)UUP&yUoTRy=-`$kl!%| zdlST@t1kd>s$T9rDu)K(%DFfq-G@9x1sG+gJH zWXCX>SmBZ1waS;Rj^XOHQey89f!9Eo>w+@SBHD%NwD!)c`?cJs+|`hA;a4bA?lsj~ z>tBcL-FWvPx?9B09z3mhrk{p0Ofohh%}Wd|#R&l0yd*(xGsw>Y*I2fabMxFNJ z5%Dw=Y`Cnf?Fj9r9><6E-bYh_;~0v79I>)~@$Mo2_JX14803zQLHZ|G_Ya}nD{Ik; zHgExyeilK%ijB#2eN6IbO!|NeN>Jh50)BGwEW^`MY@B|&d5KYepHuGxPQ8DP15LO^ z%Z!fI`w8*~d=#4FO74y;haRAZ(J_19D1SgBYyB>H_Qcfy>^;EYc{~U39L5vC(~hST z&+qYo*0@gR348|scoyEco8<8fyfg5|1tw2Wz6Ea!-e$bbc$@GxjU5}EMniyST8FX6 zGXqbI#=sjCh#LzYM{ncCK`*1HjTyTUNva1*@sYSWuU&rIY7E}ekru4%_2IZZlA0V# zU4>M>R*{~c93Q@pX+(P4PzPwV#mrviZwvbcf7{p#{GGw}@pl&cdwSo)p5)OSwu`@W zStEbXVB7h7CKLHPpKavt*=#+3XR|f@J(sQG@A+&Q-g0Y^wxx(I{k9>#U}IjYBrv~*RT}+UdIgly`Ehs_vtNO_91_7WWD^oiM`F=BD=uf+t_LT z-p)GkCKO&GiNs!|)R!75cz_3K1J3sIAQ?y54|s4l1)t!-Cn?y-gHKcNQ67Ajg5To7 zJrw*p4?ai1)jaq-1zkLNgo5|+V1R;O;lWl4&g4N_bJ?vtNE$CT2|C&kP>gLH80 z6SA4V)J4IMc<>Sh-{rw>3SQ#D9txi3K}Nwg9=t-qS9y?Y!w&Eu9WvQ|9=t}uAMoHH z1)tzS+QYC$9;AIfdz1(1qfhoN9;DM6`#ORgWxBPBmGcbRceABDm_fmNc`%EDvw1L^ zf_L&@4h5(3U@iqG^56^#nt5<01wUz{{^wKhBOaVh!FPF(f9`&X2j^4jX&x-1U>grE zrr@hQSVF-A2y&E{QS8S&!%e}z<3Y0bvt2y6nt}~HxQ2pTcyJvBA3~5E@S`eKecFkY zYLX+7>r$amEI|=`vjfA^5NTJDa*v*3b|eb7=qb5+O1>j;Ml@vtPuVitF=r-E@i2i> z#x`Vaq=TMXY;h!-qV<0B8gI?!NHj-N+VzwSN1`Q~@{*pCo^|mYy=#k(eJ%S)-@ScO=e^rYzM{iX4e^qbYOsl*Nw3`O%a+ z^pp}uVo@|DgQsj+=9sgXr+8QbrNnw4b2YM)mPIYk;+~q0vpc4#&J6X${d2SMy{_YR zsbB8U)Z=-<636j6Ly_XlQmO_Es&b_?2xa(U!KUZTRp(f6PJ#ZVYDO83-&xkD0&w{7 zn_k1{LXR)yLQ{{UeILvpbg9BhB=1CwoYW_&~mA*P#R~4 zanmKXq2t{w0qk3eq?E8g=1kc7;9m*NL)Eo{s%zql74W9i-DJptAFYwnV9ZNnqgNU#AP50uX z)-pEd8ewfA`jD3taR6EZ8S!m(mK&+Kn$E0Kt&F_|e=MC?S4N2S@2`9gv3`w$AQLAR z$RAIp2tQC{e~L_S?79TaR-DyVKb@4*CnVl3_}gL_*cYMstD=^1k=$p_Q(wm6AVVz~ z!g;C`IN>~HQ{A{f(4D)IWq|kOR`X|$Q*=m#FK)RT2kUM$67|oGo(<`?G?VUmi&8V_ zY)Gd^YL&PD0_Vb;^mF0jUzpkb#P$?ei$LTM zp&fPMjUEi`f%PiRA~>-;Y9buqWl?HTS6T{6&G;UkWI(8_^wo6`LXos+06;9tSIx>I zlk$+IywttAvZ|7Pa%56-e4yfux;lk@QGS5q`eq#?O{@_}Q@u8Q(zK&PR~8b1Twz?%d?(n=?N* z^(~e5K|y!FdOG+X9dB=nZ*OO^e~Zn()3#Ll09#?WGY4@NfJgNtzXCA78Gds=>-9;eBn&4b38_^d?-f!>f5{I-~`p8DJJ1CUPzIGXo#u z&O@A|@$OSY1M89AuC~$JcsjBKVcfRJkM$^Xy7%lcDa-SaaSQHXvR_2VjF4sEHv?VrZv^#(dRDza?NlGfx2n1# zC<}7M=65mn6X>Ghx#wSGD5Ra;Rx7^1QtN3m3I)*Wh@@1RgLP&znH8{L-cDZ+x!FJB zm%auRC$u=tzJzAyU~|>=Hs{AeWhB+!(Ofmy=DaQ}1SANvO&QuI6J2stO5VPJ1HUr1 z0_u0UH3###lKSQ=bg83=AuvC=rfGnbuCTPvW<| z4!n&%l?}WdB`Zi|)Cv5y@$7@6-KC|8^j^mlxrrgc%Ljbhq;Ik;s3jF6U zgQsd7kOevi4(LOFF_8+8MuraRVDyHu4}ZhQjvGxKZ*5)$Z$J5E+5#AMWYB=o2Tc|T zdrHS`C+TWKY+RvR#OPVo2CVWh@|d!EX~Phuxjq(ZsF%(+7)1H74)gBM<%J)hfib)= z)LivRn{ybvkjb(@@38Piz#+C6YIA-v!WJff`Jm6ZvefSyD)oR%2w|3r^%E;NZGRrY z?4wI+UUCkKDb|-<*P*3K3yxt6{ay=@RW58MT^HoG)9f!fCSRYtb-WzNfhnDolPtth zjMGf&V}gpfISJaUv<}gQk%Tt*(86Cl@KO$q^Bt)@Ey>~+Fr?El5>Wljd$%@e-tV_2 zBwU^sMks_(+q`ZmjdWO z;`ixV`T+beLd$sQ2trLf6hP?xZ=-N40^!7V{N9YZFkm2*%8PU&v=K$ZiRTa++!VX3 zg?*psMVG=PvJxl&F23`b{=(H`ac&j_QWoY9v>ds%5rJfZKsp;)$OTYFRB3DZ908QY z1yII_0J1>bb5_)9c9Gu*KRu zPo@f|xy7tXeQ=D+RKL$bO=y`g?}V6K)M5sVKem|3Y3`m#TK)A6qNV=2GnVs#+F4RR zH(&f%eO$+&tR-vSZCP_v-{m(Sq zt-2uvpSNgY25zl`-KfazF%EcGJpdp(>XolggZ0sApxZI{%pg~O`idheT5v-XHlGlb z_!j!f^W;6?xFFreR)Uzi1ERANMpj)?#*E%H2@722Ef)%0mK}*enk)u#Af>=*-kQR0 zqN=w=LKSmeS>jZ+JOhU;m&N*{fW1SWH_Q5DP#rYBt_ImX=#E;KA>TVoy(%TO8E5%7 z8|d4`9hoi54OktT$Eo#vD1;WFxH-ulnCpbaCt!41jC~-hCMC+RYmvmfw~SS0?~7;n zT~j|r4?sLDGNONZLV?pJ8rzbb>JkeL?Okx}DS0$$psTIeFiRd>zdh|4-}wg% zfW)?BA#yVfy7L^}l>ylh1`pWSd;BbwHDdLy|LMpfgSct*JVDGjl`~`32p{F*W)|Y3 zOJU~~4a!Hm21`~x<}zCVYiB`SMx9Zq%Yf+spYcp*SCOW(*JT_)>gyOS{4hdupNigF zP#>28Zt23YUJj(SCE=zv;tWEe1 zN`U8mQws?aC*6O;iDr}o!_b!N zmSk#6npG^!gu6lb%T06eD1wgeb3pmEW4P3nCBESQxy22#?zPsUV{OO{d7|75U>}S$~ zQf^yuLO!z8!yOE)`;X7e?d1Oc?`1DxuS%<1b zWok;ZISz>88r*7j9Jg{WKBfFx*a__)VAo{`JC>;xrs?H_YO?j13tO{mbl!E-=Sg<9*2!H%R`Qaf`Gd}CMW__{U6znw>Yp#qM`id7Lgf{Aa$|KuLKObZ& z2RUfoayK?TE#~^`HDY4@^1XqtSIR1H zIlaxg6Hb4%DG&{L7}rQTml16V16>o(4*W(P#^^ZCZqI$0ZYx2_VD03x(v@zu5i-}5 z-<(vel=s0Jb{5Q?)^uk3)SZctFSR$}9K9Z;ile1as5q|FG%A%^i<^jisVJ2*rj%0E zM}UC__God_12|q%r7aY^w>Ivhsy7vKh0jDX=r!?Sd*y1I;~;smV`UaDUQH&K_O@)c^GEG}QM+kAs9 z$J&5Q(sbbyyJ~g^mhwN<0f@*7-=wv;05*Pc@R{`v^h*=jOK+e9bJ>fq52)eZr%24v zS25ycbfwE4z^zJL{QKwU<12H>K768|*A8SL>N83!*vqhn$1qJ2A{DB$tHjY|eKsf$ z4sD<1aAwraz!oXBC3y*K%h#Ki3`ds=D5)}VjXx;0lP?su2$W2G5y4kOSVY>8Pr3UB zsIyrkoh^8Nq_ZT?2RDdo@>GLx9DI>OA(K;|jLq;pw1AIZqrWMWOg&me0I1GZl-@}?X z@v*BAQ}MyP$HRUH^=LI6^XNQ*)d=&ZL;L8bI1$3w{(+&zY54@Puwia8Ij}?$)bJ3_ z2C*Gi^k8}iRz5leM~_+)p|^AUOoYi-`#94_Z2GAjTS6SnOXP0Tr%tRo!015;es}n= zWgEP0$&CYrV@IJT^eb+|HzQ6fN@fel57_c?xV*%k#EkVjFS+4FiGLM-XBYXkxY=V9 z;H>Dpf-w9E-{g!wqu+VODCN=R!{g^xv60o=XIve*i*6dp9+PT{FjO!|@8LH=Iu)Ns zt}D?yGp+wP!YT5VKZEBL+|~Sfc)o?ZhDY$M=Nq2?D|mimKjArg${!8!^W}fRKcemm zE>HXu{t=sY!p8hL{t=BkxGlaO+2kK#qW65ry#$6k3I68J@*>=Hr=-XC|IpJg}+vz^49R^pD`w(5TbRc%H=bJi-3I?jK=k zKr6a`#F6?x=^tT37RG`K@6JJZF`kWhVm=L@>mNa-Ne}TK`$urNapnGF|A;8;0B~r> z(}|}GPd6Thrw@;jdiHN-^I!3g;37|TWt6FvaMqL{c^!Sy zB(@K0p?;qDevp>+UKy)mfzz_(-_>$kbCRQT2ab3}NZ2}#ZKbl&ujD%M7ZeTHzo_A+ zGdpf>NyEaIWIfukC}Q;GS2mlAmNuQ)*^B1j7~OPc+k|?@obBo4C!Y^pL4i0hjGKh+ zmJ+pvrpSZ}c5jF_MYxB#pQ}2to5DUNdO*US!2*B8q%yTD7%_46qlX_`rvC=t5?gQ) zubN^#bmJ({uD_l3+PGJRz7lhMESeia^tVnUGmdFH@yfNIaU7Q>I8MNwoWA$O=l^b# zVvF3@5Hg^cQa%JYq(#pRcBiFvrj_IBO>^+=w8%tU|9v4CnPxnbcGlR@0P`eD(_c|* zIxqGBOxhc3t84H#6GyjJ`J+n(R&LrT;f|O~SQpG#7dqYSHomg>o!u~M`NqpvEPgn5 z5AEMyv!C4sw>J1MD~q55a=xP&t;d|*u$=gvJ#Oq3JS-8-bFClt6cGRLORrW#bo)Ts z9+IuGgY=eTWA*VBo^rcp{{s|R(6ZNME^(6LYM^W2H*y#Kp^6OrEe2A%XCpIX3G%W= z^RkggnlMt$!|w-L^O$PhHlms*T^Fh5v$$%$iBd0HL)%-=M=Ap_*scfzp z%No&)Wkgl;HeEHJ1%-SzSIu)Jz3b8B&uHgYNU^l4>a|c^pRB)Lv^lf>dd}t~>rXn* zz88X}=S=w5O@->()PhUsmEe~IB4`JHLTR%Z{?jRI@^uQ4w{mzjeg7`>}ur`+Szvo z&NQuR>Wd`G+nf4ut2@WxYUEpL_!-}{%IT*$=!SO*?xTq-V_1$ry z4!34;8okh)0tEuL=uf2Ko##B~mwME8WbN09vmdj4Fi|JY{wQ7K4P78Xy7xbJIpuspHBa&|^B0=e@} z=wt;qpxvg4*2eDwsXsGJHELV@FkRM%X}Nr=yO=s?Ka+PVHcWT>=TE}@lP1T2K90RxeWT>jw^Y|TK0LR=Yp;_yq%IvJH99_O z`Vn*x+CRO2{!+sTz5g4??Mtv z0bzAYD-bktG~rX;`!rB9^0bBxIO%9R{{l2m5gX%D%@H;}ue!R`?fyRXjp?U!CjI~^ zX?0x+CDxq-N1uH+#>sVE+i^wof6U2{g2bkLxX=Dxb+r#%xTS-XaYB9C1vNc@ZlqQ9 z$=8b{eByCZEx)Eznw0U8RQY<2l!z1sx2Wis=q!FF?kMv=LZEg6`Tws8)RX8l2~_I) z|DyydA^iVpfqD)d{GTXL2`|T#cKrU27O0nippm0FDo`oyf2u$wvVM+0?LzWjC{VBd zZJa>eK4yn%@9^LYTW2#A|HU{=?Z)3^P+Yqd>1oAvP;ou4xSms7dlc8RitB*lda}Tk zE8WCu;j9+D1Z4d$_!qhJp%%qqQ7M11B>}gOT5$WQd44J`LQR*9_eCOQzsPS%xKF;G zX8m3^c42h5|2~fEC2!PUH*ZbCc3~;*%yH%74-`kOEx3pz(U({m>A>}+GRqUEl$7B5 zL1wfzZKtLCROA4z9}7Eo(S|zmoV;NduE(y7{5>El((?ei<%Lg!Gxdf`?4c717ikL4cqAc~LMH+SFtdFh58v7|&*2b?PaUR@9 zH&bT$i@oHujfNvP&o9_{vs`y@^5#^{dGL#&=Hw+2qvkw-&d&?gz4IA3UepIpj{~Qc z-iHuDT>_*?&q;T{7u2QK6#FAtfc$F?IV}b`mRr{odG(7SRGFV*{oc0##AoV#0Xkm) z(qYB*VwA|qzLehYBQZ+P9MBVgogVZoqzdNVzeb+ydRp@(SN4`7>`U(5ftMofi5NNd z;`Nz#&o^&5ycB=jlaJe$pUewIj>&a7g1AJ7>R+m%L9rFE55oDa?s=Reb}RTiy9;(7 z{Hc@z=fN$u`nrL{?Z#o}zzWbsaUP@|TOa!^8R05@sg+CR>#5eJH=rYr97W@}A$Kx* zp7T&gs`Y4}f7#ug4cFZnup*`CB>jCP@#Rv)!Jv_}`32S|s?Z%h>%-nsgf-Vew6miA zUO~L(cedgLcaVU`FI2KJGH@~7)yt1>zd6qN6gj7DcxLHTo%G0&M@NNri4 zxE0tH9>Cpp)?Kp@e7PGlPwri(IA4SXu#thI>(U3hUM`w~Z@Qf?B8Lo!u({VL&enqR z7xBl=P$YsqP9uCioG%9JUNp+VRdRQ-;%X!a&m#LF+^v~yI7|#(Q(&wer(X5f9mZi! zbG_oPI;@tTqOXQQFgm_Lk6=BtC{^vVOQ&9@Nn~r3Ae~sh3G;QI46FO~e zr<7SBwc~OxsZ~njojTR~9vHsH(I(xxaA1*{m$|86vq_pzV3)=z(n&>XSESb7Rz5AB z_SbcVozKJ81&TkdmOpO{DCN&WWrRQcn%Js1pYtz*clRC@|I44V9-4qdvAh9H@w4M< z#gKn?0?r&JM;{$b4gwzRZkQrlheTryZfkZvmmoj9CqZ*PE7v_M?0gj;q-oBlHP`dR zeLHtI1QP;4w5emqSJb*oP1?3RRf1jo-02PH@X4rp-q@ek7kqCTJd4wgH$eAAvzVxh z8aq$Xk4sNQ@X`C!;6Ru4P@nNszw?|yq-m`>FX0A1wY=-}!s-(ZS!q zz#?z>jQ}wV>c-J^s|H>tw`HqdL#0xposz;t;Jk+km~|JW->#PDQ3-SmEyQWI*1~E|hR< zdm>eoH?#_h^Q2t&q5w&ONvS%a%y6};Qkzb& zM63wVsM$M62ZKMiTi2ZC+*PAkYm_Cas`E)@Yl2ddG-B>r>ZgSYdfdJz1lxVPu}0uI zipTiZg3Weunuo;EwGDoeFy@roUZ!a=JqQI{Hn>Y~hFtlc*A9D?oMom3!FMsbS*PgvYW2}@vua>_z z{rvP({@LTLhlY6;1esO-C$s`7XO;f}fup(v9JYRMH^p=bIK0({U690Zp$4w!=skn+ zj|#yh15Oqbf;}Vz;ljv;;CsCcvPQ>RYVtvdHMhU;QXkzL+S!bpJHs~LBu%d6X}9Lw>k z>Q07@PM8fxkiYBwCcHW`ZI6kd*i227}h0u(m2vzkip zId}JV`j;yN!3*uTm9$@NLQ`W_1J{0Q$Ph1h3eWL-%9}QPdF`GP$v+``(tbyiw`W%e z(N7J~epzd{_G<`hzXoW(+y=76f%f}F)P5(q_B)AoHgfIP$Y31`{_1mo<=XGpVO;zD zO4_fHwBN~)_QT85FQR=R4Y&edG!}vPtQ5$Lw!NYjJdZ;Lq-S9=*;3f2l+l!Io_eT$MiL48zf&xaQ zn7R?UF9_Shx-RpkAppx0d=p<3%dC|(xwV*$bJt*o9Jw%eKNkF$lMmPAuITbMhWo`; zj*RpDS@r%#Hr0!WRk8N0M5 z>kU|b;yb1R*^&fs^X?l-AH|23j#En#1Tt{ElPX!U>7hld#r&14e%j zyh$aF#XvZ+5Z^>1eg8blt(kS0O2@J+g(YvV8Cze|u;Bz9ynS4=VWH|`RBK^M*P5}L zH~e^Q@-~!{e0rfV-q6H%uT!y)jw8M;*rjfwUFy9b>2ApZ4oaBc2$r*Tp5T448Y{@!?hk=n8 zM)zl&t2!2MRL{Bu1L#<0r9mIOcuRt8q+wF6|0EtO$W6>BJ;#1axM_dov4k$`cFZqK z*peBC-*(Gd5H{JEIFD94l?GX`!$^#*MoM|W{~@OPYRS8#ZD`tu5oBDKM>qbqz4EKh zl^dn=^WwK)Wr3f9IrrK!x~f_Uu_)!9_8P-F)0wA zys2?xB2gi)#*OjhL*|Ve<3cI<_vlV<j(&p8@u#!+epgo-zVTxtfnFy5%yrp!%A&PqAG0sQBqm9ffbJJ3{|i}Uxv zVRt?Xg;u9l7baF0Cg~@obh$SRjH{j`fdvE><@I#Hyl0{DVy>XCA_Xm}a^O9=pKA_O z&uS7ib+9Sn15(htYkt9Uoh$76ghm)pB=1Q0xLQ^{BN4_D(8V1LW9w;2K|5$z`{6_I zlE4i$cqtQE!ny>9lH$p5gknZwATb@uYl6o)Sx>Fu3n=x^o99y)qDshZpdZ($`A5PB zH79wMsE(gvKKUGZ@W%<51SC~U(BdxZw^N zNt%;&rU7$j&95~-VItn}m1M(@lH`x^IXyB*Ny3ZbhpJ~J)yzmby_GarP=-%R*Q6p5 zEsXGOq>rcx=Y;9&H%!vo(O>xJv`8QL2$n4{3xq*RCm5vQn`BGqn`8r)(0rlqK;tnm z4nF{G4P@&(yn*kG2dwxcK$lfxla37{nP)Z3gy$AmY?`hnCjsxa;+d5`nN@Wi(PM)q zX+6=0KDc!(Nerk@K_Q#AcBloF=3X8cnf$LSPI+^ z%mxBL8IT9)fB`^Hpd--uEz$zJfLh=MU=c74C}dI}Gdxwg9Vur-1tb zA5aEN0CE5;FbL=kTn=;u4tpP=>&!ZFw}9oan^`{oqG^QKd^Vho zV#8v@pdXMbm!)%x)+u?`Yz)&d8B^kq@*9YJ(ov%T>Qc_UaHW6;|AWlW>zIpL3`c#W ztOVh99#+b0UCwFC&>BB{HvFd)$bq}Ci>LDNg`;j9)eTzE}E5(1x&&6{VT4v)Vi+mc$`9!>Qg2sV5 zOIbfQ7@;oYb|daek)Ip)#0{zwg^&~wKW#v3PPusbDunjX=!%txl*=5+tyq^x|0$R@oS#^a3+un>C@Xe}t@|*#Jk9SYk46%W(ce>^ zI$WL?GAZ=^H00$&o1+KLoIpSE1a7>Ux1yhCdyKsILq2_K#*bI~#z?dZtiFYK4 zVlPHY6UUdF>BHs4>TeHvmHJE2qBNd8Tsx4KbU-JPmU8eMs1N88+97WtM^qciiS&S= zTS!ll%(SoXN$|QHTk#H)(8{A2E-iwR;Nr-ctyse(cp-=t!-bVMOM;sUcgfpK zas}LMxL3m6{}z*61-A@tPq?XYuc7candDly61Y;hE8bv|UU1i7tvv(oVz?D>XTZG^ z?nJm};1<9=2Ui6*myZpaA8E{#@-~k{7`0o_3K^_F{-hW&B-tdv!s;pqzRBP;ahpoP z+82Lx4dQ>WrU2h4=P8_u=3mm(LTbuuD(B{O{5SJ-ElbEkI${0Ri|3u!EVne|$Ji;X z4JY&$)`nxO|#1H}P`t z&1If9-BW&4cglzAO6j2+v(w7U(`bZ2HgFA)=Hil)rvewt%^hsF4~7R<9=bmr$aIuA z$|pN`hmZ113;S;_33w8`cbhFK^MTw4W09&mkZsADo4VRN&5TOjDOBLde@pOgCv%7Q+B zC~UmL?skN33W91~`N5ED3s72ybPV(ibPO~M@l2ZGDfhY@0f$r=w$dDWeD?Tm zKzY&(m(A~&W;-1|YEgwW)8Q}iIlZB1CLLn)J3>V1KA)`uiK4?I7OQ-+?ekVCiniT~x8z4uouW8_dbQ$POqQ`?ugeChcetr}Bm=ijl9sqU{-Dnxw6A4+ zRBW-Q-0hU2>s)^46zX>|2a+4NWBRR=P!FMRrv)k!pmCX-y%7m^l+P*TbbWz-*x3jo8nHizIw?h~)I{Cja`&V7LR#H!&o^$`pPA z{`JSrO+1bhD4*hn4lOG3kw$Pr zjl=H^_%tfG4%=i*R7FK4E*~|Yrzypfu2ArfERNm5+DUg0uliRoOz!~nt)S418^Lu2aW)TfkVK4U>{Hi>;$#} zn}IdJN?8*7K41r|KzE=XCv7_c;@=v$OM&@78IS`|Km4~}Qmm$%|MkOufbiEm zJoa5S*x26RJl6WJIsF_K`J-QHzmUJ^9OkmfUp$`2FXT^5Fa2-tezd=Jzn1;qmVmf9 z;lH>Gyu=1dHTmR37oNokBN!{@$mPmIIzXU(K{?A-3=`XCc5h@9b z_yr&RNEs{w=FF{{ch9}|&9A<{X2HS-9$fU$!;dU}^s&d6Jn^R|m;U*wr~qVX zf8oUyFTMOfD_>dl>gv~C|H~V1zV-H+ciw$(?O)feuidb5)8_ZLY~A+3_8mJv+_k%I z&)$#r{q5sV_8&O->7ma)|KjkMUwwV#n{U6XKl=T#<3F7EvEiqaKcD)09Xei=baAKTl+KrQkzCrfTldQ@?~!`Nl~?t=`kHH{y?XcQd)@Un^tv9==B5^}}3y3qZiZdfaJ#c%uoRzQpw-O3(VcZN_4R|Z8zadmK)0n*Du_m`m@ zfZ`h9t`3Dy9hO160qL|B4*9X|F*Sd>!{MbZ30p}(49_pIO>?-XIM~gBGQL3r`V1_h zC)-M<4t3e4gvhZd$2E17r+F-Pf!rRuBj7A|6uGg{xX>i`N{i? z9+f_d+~K2!^84YVGP#@2!{Now=I_6Bk~m4;KD_^eEXL$#=I@y~cxmrbDVeL}>pwkK zfA}mZ?u@jF9&aGr?tub3CQc4IUG|A%umgZ6j&N*zc>ogRJ5BC$GnI6A(=w9Z%t>U{@0z-!lJUgPBAudt8*i zCEdmH2;F5-etdBzTpucDyry}1E#rU8Y#!gTzD*o#_qedLY?WKB6L6wvvB+_V zhD}9prY&H@83ATM>@WE}LZY!qR5*bhVHO;*WdwabY}r~fJZ@}F2Y9ae>6Y|ymcA&* z=CY29jSoqI-ZIvWheC9OolC(j!jKaAm*;bqcDR&nYPIZJUH5JwUkEArEb z2IR66k$@PIk!7Dkd?ucK7D*S@oXsUDl%7k+^@475xJvVJj2gQjBK(!-I@}(cVmK(0 z1&JiR7_+$c)uLYDFzJ{!Qin7U<_F@OD%2z4al_fe*${(0k?!aeqn6RBn$@zIm{6&@ z7`1Gkx_K>MiVsdJf_9@*!6KK(<7Eeg-hoi_srsK-OIT1gUrV5$#yCnH=-d)a;5sgU z8BlKL)q1CS*<4Z3vA-WD|9&xpe7>}35yuCvpIOrF_F)-WUZ=}5CFl^h0HRZB(hJ9{ zgq;OQA$dhA+9>cN%sN2^*}RnNR(f2IRDgGvpnBOk;@2HPN6=9;-Q%0ee&#g}kABh9 zQcFdv1Cd5lNa(i51kv?Qxx^GI5&hv$qj>9AqrEKzX za!J-Cp(#wzhOhEE)&ligT* z4RXxD&P#1vWQhw6&JE=%;t`f#fpus(?a8G3hhhtc@6L>&m=GBS_}R#;F{83_l!`%i z+F9C8c0I^D&%-BR_C3pTN8i66RaybJJsFN&qLzG-|jpBHO|J*j$6*;cE$FY)-!; zTt~*>A`jLr(ke<#{7z@g z7Dueea>Mw;$4PP-$c%;qcb>!mMi=2JPdnW^?P9S5u z_+2Jh6L>1viwUEH4qru{!^h1hp;~#PAyki0tqPnaQ$t+X5GA`Ip@i^S5^_8?NbO{p zY*nB)_VL_lPQ|CX6LK8bN^RL(b^@aUz1u3>$4kf~X0bBzr)T6brloq^oRv%dPLO0s zj?Y%ecw3~lT}_EHna1YBd?(_tpc1}5ZW*he479ykoEmtBs% zK0w+H_m^Q0MuISeR|2)&u>}KASREh%9Rrs2z&+^m5M~8%D90)hF6)Xklnz*gFwtL& zd{-k)1JcMq?1w<3Kktlfk6_kbK= zBCs^%&xE@i2mmTzF|ZnWE(7w=zQZV^4*o^R7iR$sX9CPh0ACJMIQ(9KfldOq7<9#O zml2OCAJ9?SO1NGE{1}vBB!>J%gR=;soG3rFg_n)EO8A!nR7M^^_vF$&4+jn9;l;fb zpmaRXtKwKSWad5K3*ao!{{-HH1nvXg0love{fO}cIDkiiw}3ssNuYZJzK#Lp05gEc zfK|X3KAa=wDzQFdbL|yb0_D zP5_BbXai6LQ~|F5p8}_VZoj~;3K#|0ftkSTKs|8Duh@eJZUycK-UY7x2l4?H0$YF+ zK(90C6JR>94Y>L&?g2mWCtw3`97z6+F*Q&KR0FGlzX3_u%^d*b0F}UBfO?<;(a4MtlAB*WrIB&v*5fWoeg0bc-tV04aIw>*?50) z1RIGr4|3TkSbFE-P1rH8dM<#q{5V)e7qVN}1a>Q%h!)?*idZo$t0%)AoZdt!W%RD0 z6CbXh3On<1*h$lSQFm~wZL;s4#-`)_rV6|RdKYZ%X2H(xZdM6vo4KqCRyp^yJVP5q zD>hn0rOiF_Xa;#_ZOn{7uly+&-{UuJPFj0y7Y|(4u;lfiw z`w50)10%waA(_L^TST)ILQBO8iM1H#^gChi9L_hIXXm4Bp5s5$y5_WG^c|ZUHwOdW zAT5g=w(^)&j7cEWYm6gcqrEplYQoYKVYRTe)?)L5HUZ`QK?a>6Y>b9Cfv9t%`4b~r zD7w9!_ZFGRTkbfL@P>Bhv6B}THQxH>;TIrR7nC3@C9SDrNl9y}=Diu+ljoyt+4B+l zRvjCOYNKOw#W5t0-LbrD5J#^Ygu67Ht16b-NlzyQ64m8ls^(9==+juFF||@_!WIW8 zF$lt^1L7EHkB09Eg;ZdBbm1}InuxPUctDEmKZ}i22n-305mlI#Vtg}xwWU~Fml=MV zY`cx&!4OmL#>!GqzOke@W^H3`lEkD8@8m`H$YRMrn5_LyAu>FWl#(4t+s!AcmfP&D z8_lU&?LoDs3%wfGc5#B-7vH|*UBC#1 znufiPkM?!jt_sl<`0!RsyEJVcw8mt{`I%batH`hgO3KFnaS5I!hV~e;l;}2rDt+w+7`tSoOXsN#s*4t?Pd|1AS#F0sfP&_XdOu@g~%dp ztf^Hq#ENxUkv6PLc%!02FJM}|0P^sp+LBfr2+<3#mNacosO?j>oK8jRRzp;bXk#iB zqgzat;ox=*3qmwQbDAB>(P<#KKD4Dk@^C(mTTj13nwb&^Jx#+D+r^YyCf<~yV^VRE z+MH)CIf2CiFAEz@8D&BDRDLAXiY-_T(1{S8xbsT2SR3Z0i+N`HM>cKNs~jyNc7I6znfs(NB5lW5Wr@dhK*nE*!gBY{7u1$l<0} zE?Wo}<_&ICF6g@;x zV<93@zRuGvoHwB)ZOzJ@)ghW#b1#oCx6LTR$y-T~zoyAM1tVTCE{d`I3#Y-TFY?1o z+i{*Gq1I6`6_AK2|4bq`E%sVSP*@`U_=)RwWxcS73|}lncLDMSgPlUYM?>`gBvT5> z-hmfH2``j0D6m<&3ujMsNU(SkloT+W*`h<8{o zv?OlN7OT6trQvxNdcw>lh;32SP>M{gut(#A=7JaoDNEamKeH%!OqkJhXxm^ItmzYCgmjYcwpzvM*g{uL& zPY>N^gzod;QkpTL@cfWF9xmm73qWPVu!84P4p$0zfu4X5pt@2!h`th_I?oBYbKz2a z6+rRx0IJVJz>UCDq5EgxQvH?#RNjjK(Y*~&{dNHq{|P|xsbC86N8}m2IJprn(GA^R zaClqk+RCRbdNEvd#q|G4m-?HoY`oW=30MImpaWEZ4Cn_)fm9#`fQg`_sTS|}1NFcW z;4p9q*bnRj>VTcVHefSQ3#yRgK2&e;yely%PzzSe7Fc0to6M+IC2haf$;LKkIJtfv#;QGJszqMN&*Mnk?|LQ%} zvt?bIu8fp1;{&v37x=jw-&8=^tGh?y#5(-@T}hjlP?ogK>)&6O|3r>$zlJ`kDA)hbMPbopcqcSIF=;s#K*e(_=JpD)k-kq(7v7WO z*PN#h!wQ5k>+DMIt^oap=MFw6<*}{*&G}6TvxeL^FOWVxME@4(cRzdN*(=#M&(=SC zYpVjn`Okiarx=X|+vtP09h9=7gSQ`4w5I=P|L2Ec|016)q+C_TBo_iPBk|o#@qQ3I zga+v1N_><5e7HMwodW$l(6tm{Gz!VKS@CAPFk;7fpg$_CEPh!YttH-*0WOJZXkRui?@dT+d4%2zb1wK z)}<+7f8M4pVSnFKT}6N8V@oa<{nEATt`Pi*>p!^a0Tub5`C;d-t2TZ#$|`Mm>P>I| z6|cPiXQ#Dp(%I|2x$=RVuQ*m^z2mV@9?iI6ZNc*k zw6;BGYbMm}ziv|XFP~0%`O&7IZ&?5Awn?8=x^q5w@^R_?@necNUl&As*@rtnq+c<_ z^$*J(rcR$c=cRv5mI-#l7dJ0_+}*Y6@0Lv;4RBoXRbh{}_xxn3>(Xc5u&aixeE-E0 z7V8UdIbE-I_^bBbV-}@p?T|aa`P<_4AAe`rc=qfr+q_Gs@BE)5mcco-x@|h!R?K6kgeKyuya#zQleF~;m zoqK4G>7ifKuDG-0x(s>kN@K6;J-WHW9$&-GequN@zcA^l*XqB%_k{$*mU&r2E_&;U zp!U;2Y05i#?(Orb;>7Sp6Z9|Kx2|^l!RP0`@a&t4ugYG(^u;kxXWsI*WWaU9j||kP zZq8q|YwC3m-jcYy_VbOi{!zc>ny0>-KVkes#`Sqsy;DbxbWA>5_28==7tgx%$iUB^ z-nDmI;%6`H??n8?RVm2~kB>?w3;TuGKmPw)H~_VRD~>-yLx)uITl^ElJj1 z(`^3oLDS^DrFccaSqjtbakO#lahrO}2g!PyJ9m;wjrd5VpMM4S0&`Oe>5$To-B_5l zSMYpjX=C&`@G=VarR{hPaT@Fnra1iJ$mr-SzLATH# zY0xR0)0ldf+FX7|Z?kc5IPd0(!}&*1v?|>=xLI9|gTswRa^ql;pJsX~C^K{Ts9}ZJ zhvc4r<(_7%p6EA)EK^n>yI1y{Y@h6u?0R{I{9gG=`9^u8yqiLy&?|N+_A7pYf#prg zPnD;XNvaX5pz2}O8>-E!MpZZUa`hYPjp{^Acg;{uiDs^5v1YmEW6jT+URsTIx%PGK zx7q|32-?f$goY44=%OFNo&I_+x14ThTyWrlkViw&BiZ{ z8snqJmyDknPZ)nQ_BE+ZB_^NgUejZywWd1L5z{$SN3+y?y}8ExnE6@ri{{tNYs_Do zPn$bfuCZt=MoW&R$YQtLZkc0w$g<2*YuRC;NpvE3(^ED;W{}xrQ)F{x56SS8-13p~ zGWiU7mHbipv+}p)d*naLr3$mcqgbd|r#PhOtn9DMS58)zDIZt9tURDhQFT@IP+hAU ztkSD2s(jTH)zhlws#U75RKKd?)ye8i^$hiF^*r?x>K*Fu)aTS=G^&Y?Q`0{XxC`hX*X*RYQNO} zs_mmw>#}vX>dJL*fZreMe$xG-JE!ZcPuGvqm*^MkU(=t}_fH#>c6*vPZEo6AX>X^E zHrNdh8~(@erJ>%?U??^^jBevB<1*v(#+Qv7jD1XFOogT?rd6i*OdCu;n55aOU)khUFJFFYV(8UC(X~8SAo0h%-hW0o6niAvp6hMEst8Bv^-;Z+p^p8 zcZ;A*jNq+D_ONUzWbTlxpIj$5%SXubQ#yAOVoYUgVn>;1?q`vm)fVUQm<8SQ6E?TtnLh1w`kUBj%dEubl2X3{s?NA z(q62)K{rx&mu{i%J>BQJBjEcLdb57GzEHnN|0n&Y`fv3O`Z&nqf(5 zW0`TDaiy`zm}u%|N;TYDo_b$^M(|x9g!1Z|ZA@dRQ8FLSdn~a&+KCrM!c9p!J zTm^Z|1lKC$bL0!;Ps(4BFH}5^Hh-l!s%TW4QK*$^N{cd6S)i;^Rx2M;?pJ=M?4jzZ z>Z9rhiBzeEsGd`;RK2d+r#`KY*Cc6DHCJl}X*3!m#&V8koMxh?RO8Xy37MR)d06vj z&3?^EO^Wss{bl;A^p*Pg`akPe=)c!@OuI2{aoQUgsp}2z8}?#ker@=>A;oy5QEJRE zjxd&Bgw8VFYkb1^SL0dZXww~N*@vc{W;^8MF3U?67+^DcKX`g+3`WxlCTu6Q=d1&!AE2O~*|Q zrcf6-RPU;GsyE!lO>mX&5!z;}sm$y)&orl623wrq8+|-qg(6>4)GAUm5{$%DO;3$f(^u0^Ge9HLs5ClF zmgXYuV68|tq>S^j1)H~I6>c6S!J24PFwoSfMUMEjcNEF?n zOJs_*X`9n_V%9m7b|me1+NrcNX^DmuLw7?@Ltn!HgUVnuWEye|1%`>xn*EFej51@k zF~^9EYVkW>a2hnHG)so1NwfgwiX(H zn|7zR4wAiJdq{g2(p|4Tu5Hks(l%+&;6;c;U6L+EC((7+rRsX>q?m{M=?3UzI+aeR zGwQ6mOw1EGx;$M0#>7NjF~&ui&ZYC}(1<$x#swS|G_z4|g_g;d=U`kG$P48Yp{4DZ z1zmElJb<}yro2)rU}Voz%~vggPF|_1RUKBH!K)oowN;&i z{tKuVsaK=_8q^Z>cb>+j@oE-m7HL*$R%=jUd@U;#a|@I8#HuD+nFHNXpe$5QR2D1k zn3Y}7{{iI;#MWGrkL!DMAS1MO4-%zgMwcD)RrrfElQ|?1O4=E2TkMPz*p9sxPm*47Jy(j4G=tQ^IvgVMn35gak67Ktb&YgiF zNxR+8zVB!E_s5TS?)m$i=RD^*&pGFLo_laTuv;(+f?&dsybAIsa=zPObE8ZI<&~<5tA1?5nUl4md*>wwUL)?>HvfzvSy?wzq@y?&%T;SmGr3>ca zUEq6j!EzpdbU`71yB5sl@2~Rr%5Q$%OE632 z<*)SAqj%tK!*hVgZ9JSH2#JD$C&b>uI>bS=TCYJ!5Q-2%C8{^_)}uBM>64oU;ox~e zm`~aH2H~I%iejVx0OCrDAoTrQ5VA*8KNIRY^Qo}`o<}|pUbN-tuZdq1g!D3G0H&}C&kyj#{VPJ#U($;SU4*1f@3!!MTpF8com{|{2Y9#9sV z6oazR96Cw=)S$X7*QAbDY-*`Vahufp%}R;+xJlr-Cr^eAvrh{)y{uk7EX1d%K|LO; z(XuMn(d|{l#$@Hg$+*)u7sZ2JH-CP5H~>^8YgY2;vBS zWuL;2GNbs-{T%#=p2`RXN9n8Mtp@EKVPOqGC?zIPdX%!!{;bM1>vcv;xy{GTqvH|Z z+mk29^ru*-x234WZ+U#1&A&cZkb5m9VZ)gI$m7S-JFY+8Xx1pb!-kE(HN4OgZB|{J zYYKCI)NxW{jHIJ~(!bC$rc3I=tWU+W$HZFzuX$n4$e^|?%o&qk*0LtoObiuD5a*3B zRLA{((_`B*ULmApmJ5y|EETuqQ557%^$(DJQKotjz{5$r8^ydEyoiT=Ct9Sfno30R zr~Y}|>W5n9b3X@cu;nN%sEBG9gWgFhuNcPG#|#@uP(Mu%D!dg(KM1QlK+%CB4& zP)l=kZtkM>ugs139)W4Bp3?boWI z2Wj4FnN$?HX5@O9NzaX98a6x&Oh!pC78`y3#+RV^Oz~K`G5r50_^EWCVb^4cDz-;RMn8YKP=oD5*=C6W*GL25$=m5mQyC3s^lu@Gj zK9FnG&qpaj@q=;ku;DqNJ4&y^w78E(Puc@<5x_i5OKTh!M89|lvG{+Eo&;fpp7!*y z^rXxvJ+q=&qx1|Lj*P*d+K*3(#s72o5QGtY_F2Z_Lzz*0nxk2x`0)Ae)6@^${$;tg zQY~}a&%xHKa~gex{+ATsfe|u=vo|!)f9pt_nM<3UysMh|7d<}NkDzK zMSCYY+9yxS?OGf(o!>C#X}Ffh;JNjVFhSRES;+ zAlN{DWmWDBEwhnQ35pFcW~`)9X{IEB!*ibjijhged%olkvf=8KZ zyO#O9UU6COGQi7T=}U5>c&=N^ETIfQeiCo{Mc`*^3hc-!qok)P3pGmJ73J*wu%<0S z9~^6PZQHwvN^7gD9<-li?_*0Zx6X`>9>(`dh6nAMwM;Jn_%t+R_L@%v)hMe82t11{ z9rH|)ngNIm>WW3n+(dCPH=AH6Nm}McinmpxfZj&AdPVLTl&@r$c`8sQE3Tc4vF(5W z_Ks4twueAS7Ig}>CAXU89cDot+~HK0o3zY&q%{V_xsKj_-Vx*&=8E$=~P1Kd_XjddY(6OGZMOPkF|Gg@n zUh78rZ%tV_mL5f2ZZ|T_$N-&YfOA)I&dnw8I_Iv|GIOFpO2z*&{dEi)quWHtu^@)r^Ni(}cpXe|4SK+3(+mrU%x z3P^MI2Qi9>^Bo|Ub=M_uy1FJeV-aYc0d~)|?s^7EYe5{Z&hj^sh~?KshYy(9Ez(;=9c(0 zv7kh}twc=o4x+ChXm;donj79$L|1C(RRKiJjod+~csr3+iZmOBC^s^}%k(M`3g=Zb z1~^w;G9U9*W&+^mm53RDWZ{5gkY+?731>zj&4^5(Y3I#GS`5+*wW0`+RwBa!n$uKK z&3kv}8HiZ{HEX5MNCK6Z7{W1q7jkq)s9+ByqHoB<A2;Wi#|xpnORT)vX!@hxTw z741X8rhd`tTkI1&?4v>|ZHXk<`vD{uq|8y4&qp(6T-Lb?&#SRZeu(TNjl-{CA) zNP-W-ZE>!dCKj+H;Z|%?=a`Yv6p&2zKqLtiL9({>Vj{cdA!&h4N>J@H?RWhqf#bZ1=X zek&Na@Y0wOYO~`}%a2VS$mW73_;{8Hd?gi^r4p(_JA8pE;^d! zJupq5lY&}!4Ow7i5QXnX-c+YtL5ey9n*;1dylXIfqhbvE&rd z>k+^?UUyCu@EDN#P9w*=oS#mTLo1SnIC9!9b)bGT>IoZQr$BeE7zg6LE#4CF=$*g|J z{sm?9;_;ba#7H^{u%p@6&vnD)u`K<`{^zE}c|h7@PNM@FQV)#3%A39{`wHxrG#ev=^VJ4ek8 zLMhc0cr=;)6u={Iu>MID-F0<_Jp< z78FwYjs`8A-b&q2L18@xN=jrK0luKlCRy1z=%m^GXoRf*GUz=vIvPV4h2HPt$F5Pa zadP1r47esHvZ*KLMWu@BZ7{Fl(Fg)5EUT03p2ybYe z7?PVRJZutxR90%4t?0RuBxA9PWO>+6z#x^qoj^byG)l=8Yy(bemG(dpvjMf^7Qtun zGNSPjkV(C+exz2Jk*hd+n))S6K_+$5+V~o2b39R%+xHfX41yj5>V93Lw@(tec4sTd63_A1?VbEJ>m**!K9MM(r0Nv*T|-oLn)VIi?RT2@nJB%f zdq~s5iA6{=z@D*}GWT7>FoeM<23v|r2!s=_AVg;;zQt6Ux=>~Bd~lP}bO}K%^Bl4N zT+{>;UBc|CB=t`x61_7qa9ZX`1m!|1AV_AEIZS1|1Y2KnvAnjUNJof0bqmc6(d?VV z{tm&){=_1*lOT@w8N8XWy!edlZ%~<}q>+_D?RAn9PIX!KQbD!cJiXj9aC&-s+6g6{ zQmS;~+XJf0?6ACc_!Yq>rWVPAlWO0$2asuc?Ff>hr5dgbp_}?f`ZdKlROV47j5&K5 zom2+6xPOMJz*&&fO*p8!fv9PwUMk&4Z}nDwKm>^ zLf&hyf-o5v=wr6q47Lh(a2oFr*th90N_kBvbo4%CdCF?`EzKpd+zslydIPf*kf(WD z0ievow#Vv;7A&mvkNpU=@vstP6alOGTfXRF4n+JW=gC_^o%Xy_KI7@@-Xj2zccIM9 zN~coO8G!mr??EIUCA2&htaVBhC27C*Z`5U^9T-XbYp*TGAb7o~P{C&5Oo8EuRF~1e z-bX?NYPsPG#4SBUS$&QgSk6D7Me$x9Sxw*#hE zqtGn~(d4A%O9l7SdKVpbxy~$zvoI;awsUshNd$i$O#&Q5+FsC4?ZbH#DIgePl}b`| zv?kP|E^}Czc?1ZiKrPx*6e0{n*100{%?~51WHA zt*lg*ptv|5IUYA#geE}Hwk2jm^;&(=#KKySgMpZ$Z85R?LE%cd#w4^An}uo}I_FdM zx?@Km*M@kkQR3223kRRl6@Ae4K5j4VzNzH(C%djd(Zm3#c)=dRq; zb~uSj69()%1SGb+mxc|?2+VJ3JYu+g$bKIO_0@q-K`q5Jn?oCq3T;k1)==%dHm4PD zwM(fQ!pRa`Wc_Xf#!wy3yWwAAk_Sz-QWhr=_%o2TBtE)ru9fCbj9m1+-{xzu52Gb3z zLhH1;5g*V}U5RxnwrFEf#nz*Ty@P@wHXkK*8dBLqpy5E*ErEfq%91Gim0|gmZ**^c z#8V*`65|R|7JC~a**BHt-H37iIgV!2MbV^&B1SB??omE}4n0)|n>6VTpQXAWu^lkP z^fI;(co5nCIg-rwV1g_8>>2(d28v{qu^cMEnvfP2=mcXAJQ$l2m|OEl=ax2yA|o41 z+RbU504*j0k*W}v!89eIz`(5ZRQSx5N8R8ce_i+0{fcuC8?m*J#MP)_=@-mma@cuI zD0&84y=xfDK27S;q;4n&(T@&HJX&~YEJDyu;>EX|*v72GN&sCbb+!+KbBi`-@d#El ze$fI?Qh~PW&|cd1$b*_V$*s*B9M=PmU5AS1DjoI!(q z0jraD6S@M8FTs_};o>#jh|4u*Y|54>J2I3Vo7x_02l*DYJ@!>d!$sj@@9s=2qv;GM za!5B~lP%EK?E-)pk1RlWpM~8;1+XCmft2En7%TJMW>iI3+p>`@rrcN!ESv&+0_cR$ zEbsvMEFfA5zGPM&07qBoB2M4(se`N)tf_T!axIT-5MRUUp!Q)x^^5cV)aEdYlqiE- z*y_7O+8ZiK5tz`P_!!)7??+3G=ntJiX)3XuXo$CC_Sx8T#H^G9GP;S3e}hdaaBk|i zHV&d6YBBb6VzQgvN5ItLnR;xt9-FPl?$BfN^;ni3E7D`BdTg;C8^US=C?$IAeLc3O zkcNpG`7I@YT*txad^FS@-X=}F8C|GH7eIAugGM7JVy}CE3dd+(p^uV66_JL)71SLY zQFnR;yN77*D5T*MGa9r58F*Xddj;As|AO*jKro0P=4yh=-oP{?cILxZNh@TC!WQPz z!+a7&_xN9>6;1j=l&{q}#Q55I^l@TrN6*>yJnf~;)g%o*yU!<)vkk*I!s{tq`$g(9V1J(0gAIO{4SPCwYX=zVqH)Ji<>G=jB2w zA*gexg?%*X#7S}?6%<5lrl^o0(yE%fm%6i$a`w{P!{!yiyT3%|JSxTO>eGK;be>up zgP^27>7gZ{gTetMupSJHHixRKb4Y5?%0qCY$Z9$~9a&uv?9-9uZLlw6w*{hpT`i>5 z%lpw?fWV$`D14fiUZCqG;@wZY{$-3`pkixgcSZJ(y^4R z)z<@0g}t8!s2{AM4pxHvUnod)1M@A@uo!IvHvY#LCaXhFG{Rg5HRqrvo!~owQ6Lz5 z$wH9wbAj9-_8osYtk9=mMIm`PBnSyjnpxnqh<_nw!8mB%b})u6HbIw6?_oqCX^E>4 zPXxYNXLPwC+}j~QDk(8jLN^A=#7e0Rm9&6%cFTL4x zX!mG&OXc`bQYBjhpx$%Pt9o1U!}b!ow7RbHRCwnUA|(qOt;0um?>3U0tFa>j36h8e zw32|43KAQ^B-X|*u;RXY1Y4Z8A8*GShf~4Yv=MTj zoGQqmE)G?#>WsV)cJ_3E1`TyRm+;y=9=jo~t0qD?drXnbVP|(YFVNi+Ezmt$pqm%a z6(Bk2j9iB;(Vb!5YZAdA$5g0ch*{V#$qa*h95&6&OsOH}8`*Jzs0J$aGl)RU3Q!e_ zFlcOkq{sCc#H6bjOO!hLA%;{xXBV*8JA1mTU@wWf1i z(bXR`OKBjPSD)*J>VSNCni>ucCI&Aj8L_?tCtg`eQk_FBLUXany9Zh{e=*sKHu755 z#v{bY#b((#Xj-BIN50)wY-(t_h;4iSYS?5K z@tw9D_#Ofioigv?)8r`%9AG9(^D%47d6>!A>+JK)DJF zB4L*-w-qJQF!`5XbF|mKqkV-<2S>_Zz{C%m8ngf;!}gcg;yhA#l7tA~ZHGR3MR0`KaW`G*6>k!H! zb`N_773vohR{B>P#M^v^GWK^Ujk7Hwf3FA11|JSJw7>+UCBVvfwSIvhwQC#&CiVf{ z+X)*1Scek{W16t`K;?tLTbn}-vgN!K1qGr|PfYFcJi4yWxl-uW%IpD;k__Eqxg~5M zAO%jdm_kP-r`e=T#5Aa1aGL~D7dVH0ahvtYKrxac^R?urGoraAsX5_3rQFgo)%sG% zUCjPh4#q3`sex^Ibve{jTGrefMjaB zPvhr2bko|{3p84i=I4l}`6*ITapdaq$nSYZCo;JHAqB@Dj-X95*e@=!cSI737uGLW zBVH$L@4)1Mas$nX7Jsp!e(r6ON$rcI+XMEC=mt80KAi5w5;fs|-gv^A`_Q2d=|k!Z zMo=v0IGTaNSLdgQOCZw=tw#fH6rRrNNUMQPrne-adwS=z@bkCG z45+89dCD%XdRYUG-b=c4WsZmpM@URY-{xjXMnxJ@%ZL2VL3df1zwR1K#XN#608bU7 z)q6KDRbAKQ>)Ph~)WP7p34W8+5v;w(%}(^w%3ldx)Sc1l#^DMN0qDRIpaUq`w;F9J zbJpM&D?V+QqDTEG>X>S7nrdD4e#cwf(z>;#z%D`nC)5<=OM}sOAN)F2p`6F#$qRW- z4;H!0JRZe)4cY|A+%|Epn>m0E&iq4&ebEDL&>+sS*HB7(6Eg#Qu_5-2KTrv2s0{8S z)F!wyB^n;pKpb8NJ^E4lsrcOe0%i>a$YC#)qMtum$|rcqp%dj*(2ZE!2G`SIj+!;OL~Q15mQ*5cpaN_z>-SN;km~ANuV5nv=35JD!ys82^J|E*Ocpd87LU5wY@b8sstPr!&8fk} zL8?Q+{~eschsAVQ%8hT>Epyq7f5&hxx2VNtJ)T8zr@6n#RAX(LOv|9l<}YVT*^v66 zMR794bw$20EUtw=joOHUVC zl}^>yX@Zzb3rRc*`+Ia0JRF62>?w*nuj#!Dk?sQjA|22gHWYk)^TXZJopRxGSkeSB z$4hVaduRq>s>kfHLYeI|z+O-3@Or>>L<-9QJ~;CithR^~ygE_Ns_kr&o~*hC;bHq} ztgN5HN`pR5MK?>#=-|KLi24exNCjmUYvT$8qF`TVL1gt#rWs8$*u#GP0fJDVSR21g z)Lgy>2&ut}0_cq7fW`mvZgkEOuKl1P$V0)+CS*ZthTbHrZgbNaZb$ngO35E5!r5UR z6d{44-X5L+RXJ@-(akcodY!U-omyg&ubZt+FCo>JTdD3?Bd;$o3v$rXaGl_9{{w8p zJJuIIj_)|6lyLES8Hte{g~-$64HW-YAr>_~-bnH4!oQ8hn<&1#&>xF`m*NWwpNPdD zqxhE!|0Wi1q4?Coe@lqMLq#DnuJ9nmlhHm9fx2eB&#axPRCcV7BvS`VDN?=eK`v3E zhnB-M^jMW7SUN3k_79+bWu>kR13hBaAech=Op-SY@`a?V;@I-bMX$b!MqnEh)0;wK z%0TD7`Is1y4cKWykm$}8(vV#m)H3JOZ0^&QF!V0saWZ+r*9~FtrQO+Qhq+HmKDq*s zBetfiaIkAjAHPHpg59>XK7~)af%D27YNdKDl%MkLdx&3kp^n+L?@0)XXuov(Rh<0< zi*AK{LlcwBSS#45Qr=JICc(GN-_%2DO2N&(OR8{gh0+a6{-%7|n73MV(eJ;J82l(qJNAP;~iKafhU@ys_3AQhfFM+*=0_ZDNmjkE`AnkZXPoLTxBJGIk z)L5l;Yf_dbWoVKude;6K(1Gu?Zu|)&0%OkT$UKee`<|trJ@oS&exd_~aZ}T`{}Ss| zf!hR0^Wj7N79$QM0gI!p_R2#Y7Ng5tjjd)PWn%(YVI3eCIx=*^e40*}q<*k#N?i|5 zgIpDzw)3lErW*1kROSW6+whq2AS^9n&qP2;93Hzso($S+u7U_TN+|B7pGdj3b&YzK zRS}!`H<{I>NU0iCk&l5SB~tW#X)lqKtsE-g@3tXEu};U(*L0Su+gRMR(soQms`nl2(>kHk^(?`drfpqcrj>VBMka%pDh}ANa^rL= z@MCFZi06$(3&-OaPB;#ADofVG%*b6$VD$a7B;{U&Ih%EoM@k zw+B?k$08U-wX5l(wULeoYT++!I^R`pQJ_4e>N%4a`eqbd2 zG>;#Q#rGXS2y2ziTdzYzoqdOqwwHcX7t^&Oj-a@tAf3vJ_o9S0hk}p>(0brVG!r}P z8H9{D+3&hk>a)P%q||4CQ!$c~`knA9NojD|1R+O=*!L1H4kr`u1R&(!MjF{GRCh07 zML95JQI1)YuJBB44(|`8K?>kMH-Jzk*{4R#q}i8rVMFUS^u!fV*(a-Yq}|J8r=WB2 zO{#`bCy3L&+6J2-_F^`i7U1Sm16}=Z)$=v-JV8v7k0-2E?l>y2?F8|*N(FvBk$>R>jGY1YZW*2m9I9|s4cqBwRVBsXc+rbi(;AOrviBWm%vYm~)HhgbKmM{2%(}OV++-HdUZ34iFyB?N?C~=*%FeDObf2W?$>$Dy+*C>{R zD3&9nJV&IwdlZ4l5xsSnxv68@RQY4^wmJt^s9r& zs|qD9#<=*#RXW;l2}}>l0drM|Ik43S`bmegCKzlXq(xW3a+nn3x$P`f<)hOEDXF$a z>?$7{Q*%P(9WYj3i@Dj7RMgl(41N{tJszi9_Cu-_W$!lPVW&0trc3kHgn0((OQ`|zj(J}*NVli5PgQ5ZZl9;B>bfFoXtnss4L)}~Ch6?>T|2YwSae$IhVj*@vvKSR!juqLJ> z>&3B75JsN=$6Sn;L7L(>{V@k2WiD5oY58(EE2hm8EpQ>p-F_B3W71&d@`5-wL_Sot zGIa_mz&uB(a)r78l4_#7!(f=o4H}QXd;wgmw3swY7(YI3YC&-Xd%?V;1y?+n35#gXER)dnlMH<#Ad- z->7RfrJE|43(ZuraU+$Ks-8%ivLFJ(;g=~Zwxz(_!y&PU{QwHH5TM=(1|Ic&@%Z(g z$xy&ebhGJ{iOFO3jc2!GXHu!%gKs#{=a`9u{4;hTUZK{RVbD{*cL3mN4ZzZ*e(!L6 zWove1z4^+g998NG&3X=k8BH*gc$3W1MN5eY z*PGB`lL?Bi!xQ+g35Si);qeqEp{VwGNnLH%{KeT7ZuU*+)9nH4p>{Q>>@X=i%*qZ+ z@NHXK(7(g>!V53FOl}7_I-+pisbf^JCBx8cD_S89_#c~s=usSLk!D8Pa%q681F_6D zT*=0Ee{}C%R^e}AAH(quixEEm!c;m&^=L0WgihH5&5em07lYrz(azi9}S z(4HG@Q&Bf}GXEY9cJ_;9NJlD0wqhi^0+q_xJj@Nbb#b%+MrE{sSHJ-9LYcf!F41k5 zlbRu;(zyC%NmFbsyAla(WPE=xLCmD297+P9=3Pldut;+Avphh3Jr-H1lQG=X128`V z!uF0kd02glQv8kMsFJbM|3Hp>WAfJ2`eoy$*!-nAk#zav$y+TH&GDCZH`^k{HbGeE zc%!y0rU}^D$$c0t-mLTB%>(a&H?Lj-6AtRUxnz?#McxVCyh+{ajk4t~sO;bu!`e|e z1do(_prCI!wt5w*$1#U*!tTMuxEaa>5{Z!Lm>0Tpiib^n6Xo|(A!UhI<)u*#MM<#7 zmJK=xMji+IqJe(wkD^Nk6j4y!myzfE30TaPDLJH(93GaYh7&0WGC+Bp13+`DhD0ZH zkn-0yeG-{34}T&}h%b_hB9V*o@Q^ft)Q?4`(acCI)lDXC{JKq_sBPTM4*WXuVH@|y z<=SAJW*BYP;gQ>~)R`T_(l|B5Uco@ZNq;YpLC0X+IUGP|t&L>T(%{G)$S>?eu=d>s zjeSDCxFSk6XuUj)+i?Wzp)k}0*_?9LMh{Z_PUgn)OOt};!&i{RXQ+QsHvBX@U@Nwt zxsNne-!UnhEd}Mw`WVfb`nvZ4{wzX%>4TPWjUCoTFo0lvsTeb*qn8fMabUg+FsiEu zU>@qoSEO$L&pT<5q@GA#OEDeO@3g+O!1_`k0+MyN)E_~nd9h;(pc$4p2DiM2#ZYcb zAX{1|22OK!V>1I4hY1jBd(|*-3okMQbAh{%_>z=G7WhK?l~w?HphmsBM#;xc4o8ut z(ue9*_9g^a??Ft;`enu`rXojhOFx0%p}{>MA4K;rn)))WDD`G@(f!hOtlDfmssO4| zW{wyYsOoi@rHiWXkf@6MQ^6eK6Km5d0LH#>9ewyD^AOG(f6!Nh7bi=qwqp7JCczdE#afoDiU|^_HoHG&8g}`-?XvSexEM zwf;m}ISke&9HIowke`qtha4+FgnjwwpSsArZ#I8h_RYnc^hiDOU}BxEMqReZh9jRd z7s*8t#&ZfuXxF8;EX&GnZa#1mW%TM9B!TN7u(C+PG&dj4qP)u*pS2@sPvo~&^q^jjXA#-dDvpT zdC1`5?k%r-*ldckXRz&$Awma0){KNv$MCs`!7)7Y4%;*)Jx5Q+*8c=N8dnpW2YMjy zjgZG`(Kc*uCUGy%&IoiKMRDJbu)b3$b^&EW-qzKm`w9Tpee=OUBPW!7MTkXDRGN0^ z0N7J6rhJdWu(HeAjM~ewwI5ce!>$Jep{Bqfnz-lf!uiHv!(6&_O!~ln=H)aDY)wH) zmi5Ww>hZX*+i|}G8Gx`EQ%mL>+pUKd;%jN^p>HSI&s6vqo3m&;27QiNVsTurO;J~y zjThhvlzN{WnBh2I3vTBdyO=JL-W;B9*t-n`(QS!)F`|MSpEHgc5C>sE9I+O{k_e`z zLS8&J_C*LI-B7j)c+H|Tx1QtXIkaz_rxxV~*|dR9x!Vw(5%D%h{TqJ%{f_-iLjhL5 z0PlI+D3C^N)JPevpqsOydNb3Kc<6oF0Xg9caIK|0qj8mCiZqq`6-_`@RcQxi)G96N*T3~!>62_!lCc|0q+4uc7$Xg3O)+t9~j08&0v`<#yF)}=i?KD1Sl|LR9O^%PYe91q1i+{~8 zY-$=ThVpkzf^?EEOORshf592Y7y;d z58Pq4x3j%4M3k%EENzoT+ho%=Wv~UjKb9(9hOWX$I817bP&uhE)H}6rXKUZi(!M=| zWkw6a(Y4%DQKr5}{tfms_I|sjorWU_c>O)x92CSiM8{w_=D8in*R;#vPY?-LI(Y9{ zgO5(xNqiN@*^cf3F|RDu#M}(_Z?yivn=9^S8J)x+jD`9HUC}r3tqS^r?dqh4kL!VE zExw(5786Yn6MG**tN4sV{@7G|_rL}DZKG((JKdZthYfPCLF!lAgWYChkX|;tPRQ>V zgS`o2($yCLI8`tA9+g7_aOGT_8@ojb*jJF)f`G$v#8HAR4Z7 zOtNE`Osw$8?^@-{R>yGlS}C#jhrnwf%ymH-Xc6tgbXt4o)%{xTQ|@ZWxbQ2KDfgOc zEpoTf*skR^t*?Sq$@Q;8_HMj;5Zx`}XAhoMJkw9Z873K=CL!(Z6 z@rZbu2{v3-)^>z;Q;*}rdheqtz;O&kK#o{hzj*hMe|y1DbPRGw#~}TatNVx0?v=G@ zMH{#PN zqGd+M>iq=y13n7PaV2-hl|v8E!|0g3Z@I0Oacn;$U;AzLx ziRbrtKx@9s+)eU$2HqKX;{uZ>DBps&1#dInX1q;!o5qffPNN~fGp)ne zF-1^&)p`}jMH{XM%+-)mS3f3IT({$9_nll$}*FZ+<2u!n}Sd9;FA<=8U=IaP^B|*O8xLNg;Hx~ywP6Q%kPew_KM!7`;176k zkb+O}AnjpTBM;I(pFPTh^wB5#77x;CjeQ+Kjxya^#madG?Yr4h9?YQNy*!vj!Pz{R zO~E^PFo%Luc`%oP6M1k31)Ew(rkP0@P4d5yPbb0nIhDeZbnh9l7uO?gRA$#NvxqAAbmDcO$1jA+W= z=qWjl#H?say`GZmNX(9=d`nN6>qyLxrmWFZ<~tH+M^l#SDMgONxzUulddgx);{0gJ z9ePTMBe5u&lEG89EOX3R%u_rpfl^|ceekb@=Ar6ZLDeTWXRz>n5Qb<<6wI>!dY z%F6Tt*u7h{^W>Bn(!UORnVM{J+2ADV%%Q{=QK!H;XnkUzj(B!_#a{CDQtM#E*>PVS z^7jz(j^Nfw?C)WNRfilmL~l5mFqgyT$jxr%B%T|CygG*(RI za9defK~;`qDl3a5;pDDK*;EXK&BcX_=nr~O!7^}b4!&u)#?lag3a!$=p$B_ks9Eg4 zViS&xcmiOUqlcCRx@Sk4fzuU1iozZBEpoGehtfoD&HcP{N@;1F`j}jLITvKdb3yhf z7vvBZWN7BvZ-#|AL!0q$uhuua;y0>$0<4_!WXyPje~VJ8j1SnM$d+HTbfDtyhW)Q zbT*_@p(f6gx8rt0G07q3&fGE!r$W{83*4R{H8X2%$(?GyotL<*R08 zkx6;TQeNs_U0GF0SKDfxp&IK4fzmQHD0kC0SUceW^3Kj6OBTNpbyKRb?lj<8XrrGT z`pKuCBKmRD&pP_q}?koXmqMdZl_6XDs9y7A}=O4o0XBAep`@ z4L;CY4tDXS;(9P}+CDltLRVIyw((9_n}R?^JuSbzGx%PzxFM3HUjSHReIyCba`fa8 z4|?)QHT5JJ&k7{%tU%JvwMcrTrU*aZa^q*qI{fU|gp6+>ZRaCM+qo5KJ9lpK^Uax` zoBEbY`=Fq^Up*askB+xD#kaRJ*}ui+-)UPaeSobn+?j(o3&5j#l5&$Dc9@-}`=zTY zcF9IDg-$-jOYWBjR^wKJ&?`3dBCj*=M5%f_R$x-|O}s#mjR8?2U9Id*14-hy;Iz{= z<-vhtpmTb=+IqWy`HwGGQq^GPlkmPa<%VXFQ+gAw*x}VYG#%0c(hM*Q4imW+`CZ&%ysZ9E-Wf-r7d@Z9q+G8EFzZmShvV5#-A8HEC9bwpCC%)vUdnam1UFmI=?hurKR z@k?I=iW6F#W?w?HbFjJUdYkiOp)!(c?`W=VVmo`MkbU#GNC}QW>^n7ho(C%^>x>{vZ+soSq6p`P?QKqq)cn4*(dSa zUI*SrpUMW_j*=B5GU^0=+j#cD(eBdHM0&4d7rEXGe(7;quG@urGJuRxZqWcj{&}K) zs&H1t=Oc7pO@Kd13VcqiFPL)S%>n<@4h`vWKWRzgS#1XEK2z@I_aOjUbMRRdX9fQA zm%&pt4#)zX0|)e>znDk`NFzfBbufCv*oVL2W5wv%+VAvUhiEn@VnY6Dhz79(XB-#`%uao|a_s3mDSr7zwC;=Dk~+H1GFY z6A~`Z3nLUlsBK=iltwzV)Ao*e-D1kiKv}Cz7`UJYA0*ApN$vIwh||MA{tjd+DYwIk z2l4xKEqwrf7@=i6bOfO$9tt4z{3(u{bvi0x1jg2U?C?+lWB2Kp>rsEaUHf?YV};#sOfcNZrEaN zo+nd<)7)ZKr9L>uWvbujpeD3Tn0G=aM&mEx&9Zd8v8#istmry*htYsHLud^%_K8T|_lxIQflBZxM}&;%#McR|b@T#K!E(q4W(}SbbvBJZ=Pig8{11+$ile; zOF&{^**#${MkH*Z*|nkU`uudY&L=oXVLoYlM$-aWf0? z(WS8SiU#GQU4tbnA9I;4fVH!rE~Cz<)MdbQfX{fQv#Utc+3PY6AoX>O7Je9^xlcv! zEvS#n0Jn7EST6_C+LCa#|THA4DB)&+RsCYc4kUHb7!|*vBw8(OPJ2EJp<@hhZ7+sDHb=KDepb z+*V{1dL76iV^_VsBdr}@+ybCll?5DQ;07+3p8dW+|D77>gNhl0&Wt)X#9M3jLMsUWHOLoe}}1Hzj!+_&GfT*&MRe= zx18Q)-3h0^+7yU}JdA53oy&-}gn_P!X9s?x4r6p2XSe6ROt+PwWUzK}S?NkQ+X$I! z%5P38R?7Qe4Lb|wPHQ@|ed^9c$d}riaE@M&QpM3yC{!F*Y8sVFt;J15zEqUT8BLb8F1ADZ%>46)p){brrA-yr}GSoqJt4X~8DZZS&0eOut38u3rPRHihcTapqg!jG- zex$`|%bWFeFd1gzvJm>#9MTx{GPc!(O3))d&8?eSL|*s7C!*(qabV1LjC z>yCOgl0bqP0=$%$$&ZzJ7aA+_qZ*Os7>J!FRB6&4y<^~a)IKiSsIzQ`gs_l(KE!T@ zTB^dA5BTsW`>e2qHezJ`A1hy>S|Hh4?HMau^WbS5ldW4pAbeBuFzgC&tlx;wKWy~z z2V1MBm+R?e@c(giiRrqiRYP3ZLUxmwRb5@iQ*naU2rt#IgPW*JQTYnBP8OH1*loVS zmSb%|CTY6xiCs0j155dz>HtJ!g>TYYTmT!tIQYzZ2l}On?4>u*fw}BO*ay^b?^7h^ z=&Km z2Zy%LayT>UW?+ky+LF8kw&m;1ONOIM1(Z}7xW*rp+Q}CRTLelbzKGzfAuJ+o$fw+W z1Jv29kwep}-d_W$oktTDU9#)pv9_I_3QW;etdGKrERC#crs29=o zS+P>bQ7V!jrw@!}JOaLn-1K=F{FD(}u4o+?qamXe?E$_ZWYdb~@xl&E4jcx--tS>e zocP#Ph^hEs-s54vgL<@@j(K#Rz-okf)1iIzQ=AB4Z2!Q};t9_j5BR2h1jx8Y$<|T5s=~E|G9bohz1iw3c z*s=}Yw&ccv!m*=J6Z#dm;hPbs6(zF;`#v`1$g`;2%+U z1(zrO3IB*qJ7Ht~9RG;M9o!aQk8JXfFwy%-qy_Nw;2H6G_;dad1RQ7Jk+M-+`=|UP zsMMeKkBGwf1`4ghvkcE-JoE9)#xoO7E*{v_dtg)lFZxGtYG~ByW;{>gd7fbZU-yr& zG@upTKjKLJpY)HgAq!(cg?Hy5yco|$JTae!&-IU>(xiv@kNqP!+_-Z8v42Dqb^tiE z|fMy z)0rJNx1?d=OR^sASQIh(@++IoMN6B`?CeEzaExv`vu#4XW6t(;@{`YpuAo317{*OP zcT0)dLQ`Zy1-myynmz71(0Xg4MjMih$ZdgwI&K@`R3Lch-=DF4ndkTnu_@!5?A-a7a zZ4b%T*g<;Bv9bF23QxIRv;P5#ENI#5GM6|>aW&92@Ef^{{!m2*{uTqN-LsLIu>^Tp zqj}lLBTX2o=Hd4Pt$9o}ZyQm~ldg+Y^I2Rq-^EKpzfO9y(~;8`xN80)RP#{fqf|E6 zjAe~z#xkO+d7G}9&w@feo2%xzlHT=b@@KU3E2LOjRrOk^u20rqFWQ`0e?4b&lJzH@ zXWt9K(sQQ%?P+HjC}KaO?;vod#b|*^2DItzGzSKP-9vptVlLcU)5&tjx^QI?Jjs*T zuGeDIV&_r5+r1gohtIK?!VaPg{D2eL3%oGyY#cet&y62;y3a*%owOb*Ni9<^;9y#h zdaic0BuRnJs3gI9NND&yF=j(VyO&?bQK7i5!Q9($!w`Tu@(XZ`3>2(s>XXuOow;%Q zHK$mbw6rJtHWd}`3)O5q7om3GM7V z18166HT6XjZ$2(;IathzYj#yq%Os-O6SgArjIk~x^azF*Y>k& zpD!VJIl=E5d?4?XqjS4iy;~8VB6_ZWs*n6Mmpuc8_;gkL~G-Bfz+QFrW&;^ewZ%n!?avJ)m=;-w4cd46&t3z{qrZ`{z;SLV;X}l z8Uv*O2ersF4A<1?P}LgX!tfDBYS^&ZNFT@Et-ew6=v%7m93P%r;kDOE98#B#ks2Kz zHT?)W2<@NVKYyuVgx>!Rr4UMvh`o{EAIun0@ zl(f1og%az|fuqm98{_1V$~d7u?Sh&fKsVB= z`sC|H5%g{`w0ivMC9rgr0RGAOQHiuAPNI;gmwS6t62u04wDS;cigaXne! z%9U;M*bcU73p~Z-SWbx!I^xf$j|2IiMP$4 zB~G0e5?`Ia$olwQ05;#bBX#Eb`3CFvZbi(O6j7G?(jtvIa@NPzVvYS2ENkP}kT?(S zqnjzS{KZ~!+D5~Xo97qoyjiY0IC*ob<~;btP;>HfZSb953nvr^kU) zOYcL7pe_MYr01kN;0x-~Yl{7mEI|G>hnyCJ9LufiiM;y75UR{iv3~Dc0OB+Cz5pGs zf9bH|dNE4mWM4|}_mLQ-XAbCzzfKQ&7E%Rs?_VQNc0H~6k}G>l5%wkb?!Zft_C$;v zd-3|ryXTv?9A1h)?#ah(%TMNoBFE&q96?;7L-jA!(4g1~*azYKR`)#45xW(9p4|nz z5B^k2f%D)NTYcR?;&$V(b6^GNqBsvykFAgWmW*(fzSPR4^7T|}(;Lu{M~kpN zJ6JJL|4l2)^8nnJ4$IQ=Bit0@%pF(RJwqT`w0+!8hH`7m-5-MA+PG6lZHe z`HT2tXDAZE9;XpLAI=wpbuSv_;3~O0S#dQIglCcc5boB@HXJ5~t|>6qj#IDt>ki{E zr@3D7R~=T%PtjMyAQ&CrphvJCT9m5x*`-r2)A4co>FL3S%T$-EIs6uUTfWjK4}R?D9^29)w=p)$fBeobsuoX`0e!Ml5pivQ)$Sr1LXp;+Dkruf-$ zwPMIWI{{}7lcSFgCIkGa&4W7km#~YygqFGGT zMU9=O=*Oj}BKYWiYH*;-dZ^EMs^59eAkwr}otJQfpIY8^`r%8#?rEn#NP}z2x!^m~ zPP4S*%W(}NhD$nKARQ1BYh>5C*yuXXZ5^+cpChxdL1_3`s5c1GY`N~d29v;s^XTAj zU|^9q{6>J71@;ByZ%N5urMDJF#?@%fw<5S;@HZq@&L5_+uYpVDbSOAFY6>vhob9l+ zVI1$*H{K0Fp&ox~)pauBs8OBg(_FiWCvk{YoNd5fah|AAT&E&aF|2TRcrqYwXctPj zwLOt4${Sh*#d%V$dr^R-z@${2P-eJVRjExaKY`1qB6o$IPns|)0MXCUc?A)e>X8ga z5+YUvXw>W-q=Uhq+pTL(bMC59tToD#RMq*UvNb`eNE$JBE%nnv1wC%x6N2r&-B=^= z9K~b&Yr*EgvjWfac>WfT?QaBIBA$Z?N6kax=-LLqNEmaz@zE*o5i3k*He zJ7HAcBfzEo*|4*d>gfXz89J|Aur^PV=IKn(!i{A-`==BC?Bm(_jLtadcXn{to4#5<(iv zA4a6!(Jm!%FSJ_*f`}JM6TK(ljT6EB=K6)7KYsxW>=`h@9{d>@y8jLLM;DZvrCHuq zDmM-Qpja_WQ@lqI_b)Q}Cb?P9zj7NGJb4bcEixuXZt)%*%?yuZ{yj1wrg|TORmytk zgnHqd9X1y*YzwliV8rYid_I0$MImnp7p>#?qw3>>%!8D685zo$r- zmAZEn*VDQ7~|Fib& znE?j$bk6&o@B5uLzdvj3wVri**0Y|q_FB*0gWDh)8WSYXNgM(pZ0wclQj;6YXg!&DKFHeS|IF6SipaB!=p#X(V?d+EF zJ5Jxeo&MzsLGVKRZ6)njpU~2r-Nd!u8ZyKS9>;V1?#h-8pI^TFSn?0Zp0wZLJfqb~bbE*UVrY3jXTze&yQl*AZO% z{Yu)enY7=JA?=5kr=LOlLK<)-zQ(~d;K4Q;u#vv$-s6s0q{Q+XHyoC{Njt8gJhu0k z`xu0wZt{LCu9WYipI~hQtDag|@r>KA+?Td3tzpiWBxH+J-D)Remck6Vtw&8R7p#UJ zHJR|N5d^EL$DL}r69lVi`e^>S4}6*Au%4*vvVTmTwGvwRAiASA`wQ^DHv8-H+F9Qo zrZaRjqq$rkTnSwqrHAo#)WbH^9D;}Oe(7*gCVSzFw!!o06SwCg$8Qhs=MvcvOa%pu zNHKLIa!(Mpg$+ICO+x^dC-^45D3;l)>hkI_8|SUT3^{sH-d-&DF()6a%Ujvwbqx1& zYaDAa4{xV=xNkSZehB0~63DfJK(1xA_~I9zhbvdo*JV!Ut*M!{hTXoNPs3qhd}z)V zK^U898gAj!a4b;_&%`hgz;Gr(Y^G_r8G^`z;DsP=5d^VG6vWjeh_j*u@%!Xoq6Kl5 zD2T!|{4WdQ@D2pADLf6Y=uimxH2h<7a7B9o2!1O}!(`Z2<2clM8a@bizz85Uu5R42 zy6jhA`HAnC24qVUz|GsQCVdniS~_MgFW)*0b5CS88Wz80SQmEK59^Ma(-+K6xcP$O zx?tmmW0Eh|lN1(c2kR!|JnPVI$3d)+5D<)=tJ+^A#BV z-Tf++I1U5h&?0;jiS+$bD7S9bK`I@~vJ{rQy>47%UDJkRbny0J-G)V~b5X5DDLw1P zZQk(x<;mMnPV$LG#&|;u-@Q)7K01#0wqTdKg?6dm9|l|B_XBZww_@9(-m=o=E+Zjt2PwXHlD98XS)lamf@^C@F{CCmS8u?XCdx@}T9BNHCkWxG?9i6%BX}4X zjbU_G=INRv@kaHm^DuypWK|pV!E?7H$VM9`*ZY6OV+Fa1ndPV1?+MrJtv-^_W8J$8 ziW0VD#o@QzvKNL;HYUxZ)lRiR7VI(_BdeKG?(@Hg>AqI-CTSa*_F)7W*W-bWzi+Sp zqI>m5>4N+sChC&`5zaC}9lfz=ejLfn=PF_UcZ*_IMFqe2D}n(yD@;g&q2kdVFHCNN z`PRJps)U;*H$6)%0grbkJxc;YK75Ou7ztmzz!>=A@O^TGb)B=5`k-#xTObUa#dGAnrCSoZs zG-x}HmqRVuj!(0PnzTJ0USbqU6@MA&j-8@p)on=IM8YIRG`hpeo3km{Gt?d3;38`b zy${oN)f~14E}e5Y)QrQ_3a$&qtw@sOslAN7#VgvZkM=N91(RQGzI2Y&d zgTwB83<|AHtu0EdElSc)PU$f}8;q-+EP(|C7Uhj}z`T2r@m#K;FChgjsd3;vxu5Fx z)y`@WHFdBh;T=-YyXt7u=c}; z;3a{p>hMw~vV?UB4kg8t;RwZy#6V&OlGg=~aBLsjU_lu^DP5O} zM6@u%w~;=eCY%w@BS~UFV+sn{w6#k;s3b2l$s6Q3e9IkF@iSc|hZsBd4Pys@Ex>EQbHFm- zE?_ng04jidKnDy0`T|{n=C6?!*a_4FPXmjAX+Q~(189JO00WMF#n?e$FR%r80eBR+ z3-AFIz(gPyumVGX{=kJmSKz>xc+mjphI(HEqywV>A21(y0;mV}00)64fUX5dlMAf* z0<=IWFbrt^9Q43!APZ0c@xbPTj4cEv0ha+MKSQ3t(|{Wo3uu5}KV@t`-~-ISflt6g zU?DIbPyzA4*9REe4lDo)fy;mwK4$E0U^vjSAHTE)`~`3UR^a!2j6Dcc01BXGFJleB zDxmGPXb_W3pTHz9-Ar1p^XvEJxz`g#JU|{PKB+1FJNo$pe4{FjNnX5$NlI;Ysmc}Kgw?~^2tDr0;o$R^TL$^9{dk7Kd)mRYB3V^ zk+L#`+j&?yuXQD-tw3x1@Y(R6QdF{1=3-R{u_F&3V%=;C?%bfDmQUk3MDn6|Cy%iq zos-=fqVpiU8!Loqwva#3+2Jqa@s3cLQj`|t`BS_U<$8FjR39(?C`TcM6ESW!1T-Ug zD}`Ju5$fmnL^&086Y3s7xzs~G{P!bAeEJr59#)S3l%I>|EVRtVOBVSwnDdEv=>&}f zb(XS$Y$!rq$n9#}l_Nhl?ui>zCki1cAb#3__MCF_I+FBIDnVX^|B;kgyiR$@fjBXQ z_b&Cg*x!n9f4h+bwZ;KD;?@+jRf-b4NL$8RT^=gK1y^V-@q+RdVk$u?)?SoZu^f50 zoY-8ZDEd{hYSq0tp94=I;9l3TGZk^WOKZ8$%%9%t8o(@|FJ65ID-ba|RTP#%pW8l!)t zJaxD{FJw~a`)SC_hdhJep9@@TKXSye7~z;8hYF?&=Xdt}Dn`xSkgypjH-Irq91`zH z62)GOlqQZZIn#&Bi`CyA^eXk2phamsd$@KWE$M(xBrWCOIZz+aCA34{Mvka9loROz zLAQ{eBAMx2-^-)qhw9fppGt6dg(g7e?Tb(f$6rk*kXKO!%!OR{r*+d^Cr+aDQ+ z#C_5V0q9fGqZOd1nWq%35qT?UX5x(4M?yZbsQx*7d7xYc86>%&Ih$s0A!jk)$T&ay zd~ImO6!2Tj(I2j@*zYnH(bwhZ7Z2wRX$_i7y|^boX>ppJXr>c5L$imV-GwwHT@hZ8 zT+!O4=uIZU11o-IkxB5n99#JYlhDee1THOtlHlUVnXO#IBzPf+mB59SH%o$>3U}%2 zOmY$29Jm+5-TNAoTmrWOZeO^ma4)0qSDEB;xDvQhxGP^_l74X4V68m^?h?3FaA&~1 z749UsC*c;tJq=d{H;<1EnjdM*l=C)^M;NtR&Mmk~r){p0%-zv9sPSc+FYRPg5^D4Q{~sC@F#}+4@UW6eO=Gx2yu5u`RVs6#qh;Z{(GbRcy~KY zbAObde!Egk`)ZV*_(8IY{AeqSp>d%$OmMpGp6LYvVZn{?aejyIy3(5+Wr30Ia*wZ) zM@$gX^fw5-o)`Kf?QUljQWg4RJZ2~lAIifhZ9YQj$_Tkx7_~GX&{~?F5$GC&KBBdA zbl7!#9`J;z3J_0g_-LvOj0(~V3VvGSihi04=*r+@f!3^4M;bF_(6D&MLOhKk z8g1e@8U?>QDnzKSSVxAZ5SpK`tIF#`c~c$4vIUnOji?-|iBPs!u2?3~Q8|PqRM8*|btE7NI&K{jv=lIG!(lBWt6%gY;Tw-1E}S3bHw1ITie zIVwvXyu-(MriK02l?6N$TmY>h24)1O1pTPksGy7IF)HZh9hu?vIe8!2d}X}<9HqXX z%_q><+}w+D81iSxm-1xDi}C^7EYDWOkOy2J8}2A&qik+gU<(9&c0}MB?sIZqVMWmA z4~0!|*xioMO<_>*<$2sZwjdaCZ2?NlkdA?#fsTQOA)ZMyJ(XUUBjAt9YC#(j2G5M=h$7W;y(2KBqSn&7{L@en*HX!{@VAAyIT#gj{M1NCz@$VU^d> zCX*6+Tz5(Rq(aK1feN1k5AjpLD*IKeq|)YwKCnxtL7#Yh(lU>?3jf^xfG@}coB`BK zs7*2?O3Hkb2Ohff-c zEpb$c)jngDqG&s6_#bg;P@w#k~dWV~uM>25ZWNDep;}7~ALi^gr zN5z(SD&0;gy3XZyPN9Amb0E2KJEq?_8TAnQc3OGBR_dZoiBuz8OlunS`Pjn3k;L2V z999yv2c$j+27ue?Mj<8bxD(EXMe$JNccio^?nKeWWM5Q#bbX_8K;5P}eSsjP*6#F2 zSX62Af)Ao>byf+HCT0bw?P2+h*#uVN2j6Wzf#u*#lyHXR(ot>;x&pB|9?73~S*-Lz z>#&t#qAD&fbNQ(GJWV;4J;F_KaiGFUeTRtRVt>FMrt#V+SSX{+?kIC1 zo)npVAcY;;!XyWP24FL=23Q3w2bKbhfqB3TAP9JY3cwDO0F!_spb*Fhasew~1ayE3 zkO6~$fxrMj3iJh10lb(ikpL+`5|9Wm;N;s((gGX@nt-D~BX9^f2pjfR(^z{bx0=CSsFt?B2m$RGVm``P?O=P;K={^IdGel~w%dg*_A_oMyo`?cc#wgkk@ z3ID~Ngi`zKKtDNta|>17gxXZ^50&0^|ja6yz%B+YyZA(ef@@wn>N3_W$U(gw!gdMy`8%n zcEA6@o_~D!(cXRgKR)our=K1C{EIISef9M>jfcNIa`d}n-#7j6<4?zbZa&fS%dfwk zJoWo&78jq8*rn?^N#}M;PU(JL56SsGd-cBH!ak`NU3^L3OE0@z+OL1wfGe)NYT(t^ zTsvs+kfAcULa9<~v^ssd!DupDthQ22vgK1MoHtK(Rk}UiTYUaNaN6`4Rkz+aY4T0Q zB^}4#HgneO+yB$;|4*0yFY`ZRSY}rC@DVv9M~%+S8*^R$^I#joS$ot5~7=b>r3fXCzV4=(ct2YY>WEC*4alIiaLA8skEsRI9S$#TN!ZE)Vt7HBZJNV9#lfx%RPYTN&}U*1 zU1}?vI^1QO5+cW<9M{w_p4PG01#)}rj)1e$QS8Ph!!+!)4w>Zll}&0BJfw^^X^D>V z0Z$9bYb(bd!-!0V4GLdiybk-G#AfVu1w7uUTNbcQb>x8O1re6B3NMp5u9eAT$WNYj z{g{j~Er=#{G9dpEvEAy z-ydB&^n%8R*dG4 zc|z;>Xg(amuWdF0(e%;rH%?>{H_%c19ZxaIfp)`>V#v{>Xg zM8l?{H_H~V;fw$?AoiF19wE^c*_8k zV{=)@N5@zdl+qk$8R7DjA~HG-b%{nU&2ramt=?N0& z!wrj0lLJ0$z-LFG&=at^3T$+);_ocQ7^FzxDRP}|$Cx0UKXsBh>(6Nm_z}!lhu;(Q zl{v=PDjgl9;e8vMzbKd;=Per^bmK_YIRC?)5mHG-D6c!0E-ulnI)jt&Awj_-d^T?dClba-k8rAxsK-i6LxWvT z?HT9B*+FNz@WVI@>?o{-4vZdBkYWWp9MDk_q&r1TF+l|x!#;nYDkA{ZQW`{FoaJn( zz`K#?ktrdi+?sjOF-Sw=v4C0ViNhKe^H8;-)n`QVktnKGt<`GI^`xjpscMx5<-8c~ zrHGCRvj9v~b8Z)Uyjiei8SC*x>mq@UcT^;CsHcekTbYHdPpsn9BXXAFHXx29G*;xt z5e>*?Cn5ncBqQ5Ch4@T7`y`SstT|gtP$)f@jw=P-=5Uo4;21S_K}7f~&vm3dHpNI# zBnuKrdNF2kovTH?z+uuc9i$FvAj}WMIaR1f!sCXshqECDdm`P@Ek-S)Q?;sPD>0!` zbunt$I(6$>J{upLRt)V%r-H>UkH^dQ3B3cM=2P`Qv6ir)Y`&I2KaF*iJJ7jhn80;h z{xYH5&ZzZH@Upq0pkseOPX7I31_gX+(I$=$TtBm9*zF@Sv%OB2XG+i^ZUIE6)MOM* zPzgH=kV5i`RJ2jxN0@b@46=DX*RAxp9;pEDE&NXRtF-DsF2WY4+)w_jA@m+wF-(!g4*Y6TF*+Y1S4bE_zd5aAf4w6Egg?ZCQ8{9 z;N+65NkUVYpbcN-btG`c1Pd89aUN(w>=q&U8MOu)KdvF3OlXLGGKyN=k7YhOj9t-Xf)7Rp)G}u0 z?G4z4S%R_Nbf4$32VFd#mTEAmi>FYssmu2HJScNlJdGM|jL6>Qer&G6@bIOCu{NjQ z5w0U+ZzmSI{6Zw#N`7R-dx~wNyRaSO7P{jZejiVhqL0tr_L1%~AGaETwP~bgLS<1e zKeauoUPq$SqC3R2*_4*JiBV0@I*h%XSm46;AG;_n+Dy_z`3br6#WZ7IB1h5SCKFt9 z;;E+qCPG-oX1MJIUZ=25XFpLta#?{oXJu4g=qZbg6DP3UkPb3?X_E)*6=@ZvCVpoy zW{V?MWV>Pf;c?R-69$EU0z1FU1gG7RSz+@Pdh(!Qox`dE4z{04k44Vj_Y}Wm7|3*bpVVA)$ouS`uX@n zB*$sbq(KH-E%rVyZ!B%>LiSP<#|B*E+|ywu$_6LoX6BK`B|8$-Y)V3ySA`ytfy^oN z64B5?A9RT*Bh)^RZ#Z}c4JMA7$ZpB0(EDM5?}WX>`G_Lu8e!x2E$pL@Vh-XwY?YPq*NEs%R+gH}AZ8cmk0e%e1FcL$4qQO~&P)?Me+QQ35Ts8d50V*ROpnG!Zo`-{m^6=u` z3Q#(p=OuBh7Bce|@ELFlxb_&{g9Ppb-T=Mh%hCVU+O$OUEq z4+1X$p8?%}KpapE+yguZybF8-upeRD1Y8f?3OoX=2fhJPeuC@*G>0Hy*@1OEUnijQL^U@Gt+umflYNRz~~1eS=Ly0UXv60G36v1Hi5 zcW39}N4)6ptS9RQb#MXHL?4#QE@Bt6OITlaDZ32MyHeJV^=D~p04&q4WLLpb;%eBS zT?^Z_!Larp%4AHAy+0-1mr~=+P%Yj!(!;9V09!WL!!ZlaOETCnmWj6wve|IFcbbFu zCr7c-c=I5Sje(_iKHh{K3#;csSj&%xRdf-%flXvLvPo$1O{|!ez_Pj&_Tcm;N;#u< z4W0OK{Z!bQSHe!3-ix}0TWynl_cS&g?>AN99njlgYc~sacDJ)?Sli5HHL%LLqwN{m z5L&U(B08gtmS`RyO%mdhs<6e;cISg{67m$-Mv2RwIF8Uf~ez5|ulr1Yt2O?qgCKJdk5Oi)R94Or*3+li@FOI)#Z!+-Hkk8;=y8 z5;{*X5*rv1h78LZdB!4Ir4U*wR!FSHc&Fb9d*^Vz(L6g7ZR;HWnbx(YC8O`y+_)|n z@CIpF z(L&Lk?Yy_iMBaACk%Tw2JCB{bu&D9Yw+=rGxjL%^VJT@(9ZO2uQ?>5R=$%@ zZ{KK6)ou@}JzeP4xQ>ex^k%CqrI@T}H&SC#iG6^s^9OuT%-B)tP)LPAdZzf!CGRXo zDAY9UeSEa9+i_KhrqGACS~{ia@Srs&GtSJ^LSI#;El^g`aiR1qTQJ?(DNWn6k@iwB zUf5)fRm&{CW)b$=1Pw1%CO;#KE7OiBhT*g`L@_QRFJ7C)KvJ;y{RAc(tYJctY)*vh8##QnwqTVnhd1 zsTkd6vJ3}zVptHO8J^qfP>xOm!S&&71(JvJaom3T9oEW}K}M+YJg6J=)|2@s?FLkKSRtT+r_slg`@Zmm>8AW z2%jhD&9#*}T-J_>Lt_SIi^ay`36`f~w7>_@kKsm$;^f6S60xj6HCmngh-9sF5O^B3 z#~wA>5kXHGC`4cu-|VLIomjlHWK2-CA;VHS#8Be+NH^_c`a59)XMc{zWyeGqtNGFA zAyKCUA(@D5;#ztC#aP1d9>n%<`}1J%KZ*z8$tA=AB#9*wuv#f11{LBptUpj;t^`_3 za9E&YDGGFEr-mpNzU4120sLIlJM1b>i&C(^Y(+oiXN(Ic9Ot#uQMqvJYOw_ao??fa zUb$=|T$newMTQ0Bws6g3JnV+m;kdABw>!KJ*hjd_oREmt>KNJL&`+2{!emv&W!zS# z9VwTY3M`I_{gAO@7nxP?qt^CEadet%fkAJk#}%w}^Jl{7b&w)w7>|w^&v249hu@@x zI-qQy8MfX1Wbfn-9XOzDdIdUk+}vu>rx-z{hdwJ2dTJF;rCXDY1epuw%Yh1O2UGMg zL5+ooMEN>Hw{YHsl5{jHb5@6FV$HogzS1_M7$|C3B9 zB6|m35G6cY&Y-|n>CT=#(JB43DFJzK2q=9Y$MSm+5emms#qQ9~&*wZa~a51O-L7^EzNQ@3e*tOi5>#Ueceo5WOS z=1_=|c3cBE;|>|-7gzEFVQf~K|Xax2G+kiE|3Sco%4Y&Y1FbOCGa)B(s2&jNTzyP2x&>Khr zPOd|qzyY8EAo|U4*8nSlCBQtu3rqqEfm}cbNPv@n7xa`^Z-MLozW>%9 zj$d;gI|wTf#;miexw{hd8=l<%q?E_D|2OA%A+I z#EtC=2M_kpmis$*Q~&4@VpxC9IUlz4NU71g~TynRH{EvUPW9KCsKNw?`Ha+^P z_u7@uzx`LIwPEt9E55q;?&~f(Qe(a4!H*uuJg>{5t6zN7`pf#|S>Mg+dC#1=Z&=qG z|MB#$(<3jRvGD_|XUoBbhpXQi@#g(2GuGZQb=+0@MJK!mXAWEY$=#p+^4H&v%zp0r z%*Vf;_T`QruO2#Y&XrjMC4HW2c|r2!+nayQI`Yh(pH3Y4eAKNE?8DQdD7rXpjJO7A9X<9q%*027tWc`QVST>$IwbM55{OLRX=a6M+?v0=4ZCUCntsu(Wmja%>sJ~3)$Z2K9r4f_cIqR;fdxfLm%P;Y<@~1;3|r=94?E|z zhlARWhomcS>HB`#$BJVk7f;kbedoIR3HzU#`}7m9D!!yklNj65`0 zqq?r(g`HEcxaWq%74@HPob_AdmdhUfX2HY>_Zrvd*Yr;vGulyls^*>-yDph^{-MF2 zKDP7yZHb>ey|)|j7gx0;D?C1`nJnxVV*mXAZ{Yyc3a&W*3=JJp&2RBf43CE&tZx@i z&k{L^E0V>riBMjLgapiptzLZN(^Vy%QR#B~P5trV!E}FFg`?8uAB=B7`aFJ5d0;SJ z&P})ZD~C*z_m|=o0cSZ(x5v}QvBz!dFCQZ7Z|>erDmCIGm45ye+_TJ0DWpS6KXzkb z)?UT)p{0${=fKM-*q65BHNW%6|O>fO`O_^q{W{GBn=0nX-ntoc1c7^t3 z?bq4_-2h#l?mpdAL7I(_g9A>u=THpAj?h9!pQ4euKE8GbY*8ZR}vjMI&? zjdjKcjL#ZBG9EMjZX94zo61Z+(|pr|rnRO9(;?GoQ&+Rpe5JY0{Gj;>^E2j`%xlb_ zn@^a#ST3_@EJjPNrPyM(+-#X+x!1DXQg3Z7_` zHB_ZnSyTn8DXPa*D^xG2zEJ(DidQGAv(z)xv(@v|53Ao*f1^IF9;>-s^BuVNi{`YZ zi#A!?Q+ttCs=Z1(M61>swOQI+ZK1YA>(sin0qtzPn&N41HK4pB)xWSla8fz*tO)H<|`}?%T&t)mPag)TVA*9 zvixijl!+0%^~mm%ErZM*kPVdUGEkm!ouG*;Ds@kXe zQq`zRRG+6FpdP9osV-DcQoGbXb&YzhdW-s~`X_aF$ht+dPIE}}t){p32J}ZzyH>kJ z`-Ape-Br5Ly4!S%bZ_ZC)g1!gFVdU!BlSi4#rnVKKh}S(Z_>v>zIPZtF??k>0$w*8 zN{to9dB#=77Gt8RmnqexH)8SGiaDiL#HX zuPRM75E7|U4O2a-TBUkfwMTtI9j{5!q-rkJ4AE#bMvUcL&3MfuO}WOSxfL?GKy#nw zubRD@A2li3^YjTglh7mf;IN$iN@$be{#_LVDpk?ow`kL*KliMuMT3~?9=mDi4Mp~}y4p}d>Xo~zJ zMWdp>awvLigfd?_QF*uWVday`waP6RRi~6Hl~XlSbyRh(daQbb`k;E8#-<5q=4&3; zJga$0vrY54=9H$ZHbr}Z_G0bT+I(%5_Ac!njE_UwvAQCiUH6FYZ@R6z-*t)lbM<}n zSLm5$1N>17D}*(4kuA{A^Id;m80j0FLcL#2e>2@>p$+62l$Y#W*?F?wvQ*h+vi`Dx&|nIg z2E5IXWy?m(u9JwEKazfr z;UPng@oH$Bt)>dI+dR{pY8h&Af^YQkd=-j(R#C4=(MT{7Q#E}xQq2I(K+PbHOrz51 zG})SSv_rKP?Ii8<+TB_ZFBi@S_R4QmSE#3{pH}ZsH>m%irtic+^w>7}4taw-MIll2 zhAxpQ)~0Vx-+@`@K>DHdqv^-fPo^gtQVhKfeGLN)gA6Kz(U4`xH53{qL2C{)4l>G& zImTQgGOEY#c)@AX9M`mHPU2OBL~RmeP@?UvP1W{=9v`3`s2!x0X;oSsw7C`fJO>&* zA3D7VwJp)wwG~>I)(hP}LpxJjt(~V`pk1h4tX-mAs$HgCj`?(@c9nLu_7&*+wc2`U z{B7DD+6GAWUhM(xK}dI__NcZ=dtBS1J&6|~5_L(s6rDuZTbHWqtCM0L9;h3nlj&4C zozAGU>as9TL#&4WUIPtYFJGzXtxQ!`E9WVf zD3>aiDOX@5*FzsQDv#pDjYL&%RVw6v5Oh+mDu9taPqjd`7&>{Cs$O+abrP?3NYz$# zF8VK^UaVe?{%cZ8(BJtQm&U7Es9CI8rCF^(h4HnlRLm_*))%Xq9Az$aN1?JvIZ0Wf zv}0CwLH`GoGn6xVT^1-8Di?=pv>bI>sa&O8t$anfhSzSha+`98vO&2A^*o?Fs651L z+r;aeq)Jgqc&+=Yq^beD?lRO~r!uOnsw`Cw+L5m+R28WvsY+CKRfWo>@}gxk(6(yc zx`k-p64g@7Jj>C}m8v9ls(K*Cc@Acq8S0tpYOD$tsMqLML$j_)Uz=VJsoVy+Y=C68 zKqi?X(U1hWlt405A)5msn=(kJ4)SS*gyuj-^9^3ZQo}OCasxQ>=k+HC{^Y=)9Qcz1 Te{$eY4*bc1KRNJU&Vl~}P3AAh literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/ia32/v0.8.10/nodetime_native.node b/node_modules/nodetime/compiled/win32/ia32/v0.8.10/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..61a7a618b425dd09c982abd6e8a66626d0e53364 GIT binary patch literal 70656 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 @s>-K5W?B5b8<(I$;%%* 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 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/ia32/v0.8.12/nodetime_native.node b/node_modules/nodetime/compiled/win32/ia32/v0.8.12/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..22a89a7e81bdbe2881f72646f90911d4e35b7e79 GIT binary patch literal 70656 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 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/ia32/v0.8.13/nodetime_native.node b/node_modules/nodetime/compiled/win32/ia32/v0.8.13/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..cfac671e4f0dd5b5cf890aaec291b70434eea9f4 GIT binary patch literal 70656 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 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/ia32/v0.8.14/nodetime_native.node b/node_modules/nodetime/compiled/win32/ia32/v0.8.14/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..78f3f442eb2bb3fee48de485987945a02467aa10 GIT binary patch literal 70656 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

      8GX#8!k~@uIBJt@NM~S>%op1#~W6eKB2C0 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 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/ia32/v0.8.15/nodetime_native.node b/node_modules/nodetime/compiled/win32/ia32/v0.8.15/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..4fe9bc748e0e2e13434e165c8785feb56b86292a GIT binary patch literal 70656 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 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/ia32/v0.8.16/nodetime_native.node b/node_modules/nodetime/compiled/win32/ia32/v0.8.16/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..4988b8c2846b4704b6e4f6cf6af094a2be3fbf32 GIT binary patch literal 70656 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 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/ia32/v0.8.17/nodetime_native.node b/node_modules/nodetime/compiled/win32/ia32/v0.8.17/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..c8246a84899871968613c0c4bc0296be98cac0fa GIT binary patch literal 70656 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 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/ia32/v0.8.18/nodetime_native.node b/node_modules/nodetime/compiled/win32/ia32/v0.8.18/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..f1b4918a8e49e2e928c0b510cc975c93d52a80b4 GIT binary patch literal 70656 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
      iffKI72xlCTuBc@HJkDygr zO(#ulrqiZ&(>WM+k2M#Xi_InGY342Fx6Q5QQ|8m=cJ$bFmNAwZ=#@p5rI!1kT~=6D zS{}0;vz)ZFSx#HpX)Kg6{?+?r)m7+|3{}3$r&^?XNVP`wx@x!Tu&NDOqM!OkwN5=& zU9MiM&e2?{{Vg=>IE-w$-lTt7zZdm>Ipg&VmxVTwtC3~0>@wNqvVO8O+4ZtPvZ2sm z3YiAH&6MTH#>pngCdqD>mCDLxHOjrpD^)?gCL?HEfU#a+x&}RLQ`tVW*$V||ekH}WZ zR?F7N*2>n&*2^}?8fBNrQ{@tQKY5zGMX^IQR&9oqoz)!BdUdmP{q@(O4|eDe>(eqG z&G@b1VMDI*W@wuorb@HhJlC9N83_%2(n251SE0z~6-|m%jRYexO*23v)eP1Q)eO_f zG%AfwlcTv*J5p=WPSgHTyH5+^Rl?r-0r?&3O7(2@v+8~7_thV%KUN=8)AwN@eymx( zUw!}@W`IJf7_2ZVtcu;3dk$qB%{ZBHI^$eMvLV&b&oIC+*f7kXG8hfnhI~V@VH)(N z%MdW=j7Fo?SYn)J#2zZ!jr^E4S(^g+lW6;C)3gJi!v|}JYKLiMT9sA@O>TuQ&xJNG zgg!4pP0O@)ZKc+w^+K;#Yv*cfwTrY%wfAY4YgcGjY9G_C!hE_$yH>kSyB@l}QQHJ< z->luOZGluD&>qqrfn>L8Piot=r?u_cb9nI}S(lybZNQ)Iw|Jip}Ju@nNFqC z>5Mw7E*o=1zOGPLjPWo{SB5cBsdMSPx`3`)H&<7yLmOJ~8y9f0<+<{FjLBkoiF_I~ zv>h{`OYW5iFb~d^*UA^kmqPn2m#>hols_h4C0{LHgB8R&=Ze@$I6|0JKN{OnUYA{BCPGwYOtEOQL+^1ThTB%xvl}4kg z1>+!9Em6zVh0w;;m@ikUn=tAbdfuuj)6CV>Y97<9(llzCG^jAXl9h(}g~i zhyEy5mMEtw%anG^%r49U0cEvvuCi9SNV!ybAFtC&E%@Re4g`h8H}NRVk`e71cWp8db_`KTIWqR;4yr(TZG*=0a7mss!yRQ`uFO zDwoQu3aF}~xoXkErD)@F-pa?&&ea(6De5%!P>l6l%sAERx$0W9bg6oSejT*yhK$CH zri^VF%^ABhS|FS4kVr?2 f`TCgyKXc$`4*bl4pE>X|2Y%+j&m8z)%7Om_#qDqP literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/ia32/v0.8.2/nodetime_native.node b/node_modules/nodetime/compiled/win32/ia32/v0.8.2/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..b2df72a8317530b551af4d9c2eb3ca0cec69383a GIT binary patch literal 70656 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 z

      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 R2mau|9~}6D1OMe5_&+aZF(3c{ literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/ia32/v0.8.20/nodetime_native.node b/node_modules/nodetime/compiled/win32/ia32/v0.8.20/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..6ac0903a201276d1192020340c6d271efadaef27 GIT binary patch literal 70656 zcmeFa4_s8&nKyoi8DN0H85ImBs3elq6m3XHQ*p##bdXp_2a!P%LAzBtotVbry=u0i z&m+tJ>89QEZLD!OyGdKyx>1u8 zq}}dk-}kfo`{Tzu_xyd%bDr~@=bZCA&po*A+btLcK``ObG(k9oH~lN(zkm6MA$#1k zm&OSPQhsyuA;YrY+`P*B&CNNRY9IPW?bja6`TEzs^{t1*oWI$SQ!9Nd=bPWkS-hew z=fQ{8Z}?JrdTMSI^e47M4<7#ZxdpN3TyoulpCEoNxn#k=^7r-yy?F0WaV~h7$Coa6 z3Gc(-eq+Hg9)Ebjuld`x;1GX*mA_Yh^Xp!M8S8=DDG199iNg2yEGvzrbqfhMrx{WO z;rmGWTRrv2ZFt-8?B{VC4<`shqF~?&vA3`eaS-j&y#^scC_)64sNTq1k3It;eR889 zw4M`$`IMb+5Dw^|C^q^JAg-n$`b$B`9!>pBh@Jk_*Z|Mg&x04O`6Y3~HWA?up2QE~ zM}4Kij{BD*2iw7ZbV&Nt@nn;r+Nm2%=oz zOSPM8zm72PEBXu~3BoX*xPL_iuXe-6hfwgbiO3)_W>5jV*O3cSh0?$2hB5YWEO0el=_3~jMK1B`c z@mP(PRk1VNBn zO=@^;HK2r(2t3d7u&!uU8|83})L<;6BS`J9io>v}Lo}-f)#fv3rwMDyUlW%fHpG`c zapJGTm+Fk*yXaH+Qf3t28J~kM(N`Ivs2a3)goTZ$qLi3G=~2o?`?D(7tdGfPDYyBU zIW`_+@GaKqYbh%6TOQkH^RLepf`o`hAEt)k-->_jja0@TAM9HKs z&NYQO|LHiWF~-r+J>g$y8Pf%IVb-VO*<<1@fY-b*XJimt7Uqn}FKbzoYbFK?C5ZDz z7^vf3zv+=}87~o1GRp-A5tfSE@-PZ=Ci)pLoM@#UjR1PaFiBQL^X^-?*x@s3}fqKMvWw>pQZ zQnTVVtM^)z5)K5U0YjOUaav{(5dIXlz&Ay^buluc-HXBt3(taH`V1dIg%^p=e?Ipq zryuwxpb@d4%wIiJp*sAthgWRNC|744qUJRDeY1K}`|XN{`>RmY2HKagFIze7*Q%lW zX`X7CR1~>pvp8^p1vKi#h`dxM|MqncnRES~=AlN{D zWmWDBEpr#85)>O?%vedIvYV0w4riv8`2=D#h#945z=pb6Zq%HwWgg(g2p(ms?ONu3 zz2dUmWq_Bx(wF2$@m#l->81=oej0E41>k3E3hc-!qoijj3pGmJ73J*Qu%<0S9~^6P zZQHwvN^7gD?zf*{?_*0Zx6X`>9>(`_h6nAMwaiTb;M35M*_(9=s76^$K;T(q>6mA3 zr)B^mgSukTGPhA&%*`ekN|Kf-QoOAi1@tz`)ys0vpnN&I%u|6fS#j-TjBN)5uy>TA zwdV+gWKpM3TXL&e-eDHh!5vO@xk<}xMp|P)oJ)y2$LUC&QS;?iQ^crl!Pf5eFsMR8 zMawKfSvM${foZ}*pJ*B=qQ0(WE<-x{nc>z)+C*K+j&?=j10CzhT6E=p_1~-F>9uZ@ z|JIb1V<}QZ>ee~{wf~V1N{#}uJ6^RuwiS3(sD;FakyQUb(l&)?#m8$s64gF12d_OB zF=97mqh50sYDSX%_fq*R%wXa(EptBA=~7?QGIJ>ea;kl(;l{HH&uTnt@T|kL9*vkikdiS#)@Yft zdB)=0qBtNk0c71u!ZAk&@*4WJUdzmm0-4Q$fc!NGWqU$TQbE*KM=0UZv z_w3Fy5VHbm)=Hm|1S&Bxgk$)8Fed^yYGTg((H z+J}No{i4;k*e7_{M}<_{5=pT414u4NnWHS9k7mruT}ts>Ez<;CfPs0XmT4ihfI0wp zbEXJ3uMIyQrMO7T%t96rAKXu}$_BwV_IweOe>w5uPpz}aJI#Xiu}5iiR*Z_Zzole# z4hcR8H%<}^j4s@kn3@7&Dw?t(7fHa>Qo2{CM+V`CS!@En7|iGbLenM-6$GB^GkV=q zA!X8uxLT$ei71_m0Ryu|s5J;gF5dx175=hN9Fd8}PI)*epjq*6@y|X*-F%e!np{=T^|6p7<}uvXrPVx--sqzZHyIcxlWC zx7qOmJ3lsgAg@PI;}a%^-&{`rD1usM0Js52Rw+o3u@a#f6q>yfXtyJ)DIiTmFU*MQ zi;$_8^i=2#O}Q*c1)I8^))n5Xt`)pj=D1#2&;c{=m5(}XL%*=K69gn%e5n=ZyFG6O z*)xBs9%@-o%N(s`)~R75YQ)n6)X>N3^XWkg*cgJymu<9Y&FMogE9?O`mR#Zz@BV4} zoD|f;tH=T?gD8AA@`gI)GE&qT*c@Ot;@ybZ8x>>Nf0n8zl-t!=3?(RN0EzOo-;Myz z@w#)OfX9H;cN#ffkwgKwAe-bOwzb*lj}CPF=Yh-hc7lZ=I{-`-_yA(Rgq4kNT(Z2| z|FhsWO&)_?7Og*{;2Qt4;5z>zxF_Pl@s6U$pz#Ui&vbTO_UB=j&j%vQ`z*kX9f&*Q zXhs`8P$}d{r|q(oa3$2+0L8jCXYLG|{wFYCkS7URr*AT2IHUOtK7l=j01)e~!dula zcdB|rSU$ssoL>sI-k&E&Q?cm@Cs7i68cF?59Hf&y>^02jO7L41&PKelN0ZFzhwNWb zMlT+p2}X>hqX0XCEomiCu~KAQG;*mU)Sq}_s=;PB8o=)nYD}6br}HGA!S5V$W2fgF znn6h12Nb;*_CdDIp~CE!m^76Yepes615JDD&tk4S``n7u#~ud!6F#%I3u!E8GWz4R z$b$yyZ`oT|Ix+2&?SbC8*nF`B91SVX{(y`~FRR5%%RCFR?L9jajl6b)AnZL$%?(0H z)f9L*nf(mFBd@dmNfh6f!?r?qjKB>b>`PEGpp#OXme`3py{9p)nF;xk4!hYtEuG#<-B3YcJqAijWE%m#pw1>)*;(kM*}Z6ltpGCUJvKTTLl=eK@8ZXo0Rs&*B{< z8ovTEsn^tx)G9M_6=zRVzho)Mq)u8JUj^3kh9SYxCnn0n3DTGL%*A-3VRMD2OzT8x zxvodBHj?Z`3R{Hs2t>fzC`Xh24Ymv_H*An{LEoGTcNyD*vH>kWzHV}(cBj}lpR_C%(r&daJvj995hf_8B#Z}Xudtbve3~G zXM4HMV!*iFj6yU4TsF1b!Y%`q$|?|s7iqXW19Ne2-!u$$`epjfWb`|whkoaD({JHL z{MPKsH0RJOeTc`Vbn#c>S^m1UlfP!2!0YM969tr1ox^qA_z?nvHx7u z1QT7v?5QO6Pd5_1^D%H*=0ybMLMk9gW|TQZWxNDiUvjaYcA-c|h&_1|%?;7)o5cPB z!OH%`BD9krj`tb7nXtV0jO_1FnWUtVl|c=5f)h@4S@uvtwcI?t+%j-#dVAV&C7n{L zbmH3ss>|%KyxRVfU=ve|h5K`WBqW8kF>t5d`95Pq$VccGBi z^a==*fq_11yTxFuUcrhE~9_F z4}(;`t2n*^V@Q%KVzE4|i3{z47R!?6U5RGEswv1`BASZ|ucDu|tjym;4Y>VHl;>`) zy3SV6$j1^q(904m*AO=Izqy|+x~6FzA&|ZsxD)BcOhnF5goqO*yEMs56lb>rrdOlT zO$gECq~%Km_tSb89d^0SEQqr(DZ#dLcHd3}e-2Fo97Nh4&`<4yo*gM57-E%5QgyT@ z)TAzRSeTCyRa2lQZ7VVhRZzI83$ZJg5)Um#Mr`(*apu1!&Z5KxIT+K* zN`-IY$0Nt%W{c1S2->#9Y^YwVFPd0b>!H{XQ?xB6b}uMgDc6{UwqmnTtwZO0s$O#p zi&NNdkk3n7P+EPR)gc~9Qj1M!g^X1MGHf7}dw+r~P7uCwQxba|NwJlC{NU%V+|+hB ziAoa&>^lS`w!D{y4QmL@?`S+?xP8d}5C`?;flom##Wb5k8;=TYPCM36?VL8J6>qgm zsT#t`5?o~cZUe?p9nQP%Ut*F6O|?=PYoLMYLcG$^wYlVwfQ1Z!1T|y~IYPBowik=FKcymNWM+52dYC@^|F2osZ6a zt!~5zv{YAOor*2mSX8m~=wa`mV2I5}Nu7pN_8@3D&~;N_psTVZ%6?^7KIQA(TOaaN z$c4nXf|SMHhDi2JWqH?QoPU<1*>piPsiBAw%dLBq&!0t4)xjoBy3J>)E=X(#3^Bco zEd(A!wttBvvu7~Dm3;OC{vrm7WR$TSD!`hM78d9PV-MUPn-Z8?^GD~FHisf38%x^F zX`KKqCIXSF5SPI;C85B;tn^g)%#}yhfrI>Y-BhrN^&}Hq1Oi)iEZRu8tn5} zoxJtv3bd01S2Bl-*YqJS*O;*>TcYg9PPgF3hZ&96GF4V z1K_iOXeIcPS$O~)U7?FOeaoi~vR1IB*2&4WJhnl66{~~VhY8g$&iiwl!z@yw402(s z?+$5is3b*TQhWSkaJ#)9Ej6M)bOxoV#CD<~-j3O4W6u(^QVz(tj>!0T*pve2rhaSV zAo`&eV?QS*yV*SiOf8kC@EACX&78V-LVmM zr&qAMh~|z$8ZI%TLEE2!w?)2Npbhh{C@%&Cg9u`-Cb;Z%OfzCF{)9bwRLKN0zt2zKq=#i28N4kXA46 zM|S`Mho-%ub?%MHkj1gt^C3|(x3E}7nTL?LO3s}N5F zzFKE=xgp%!AwViAF;hedoa5O9I$%JAuzValX&>TY?+~f_Jgfq54_g4K;$a{BiNZev z!XDNJ`RHNaLm0Z+xNVg^5V3;mZ0b1p=p<;TuqSXxmfFj)EudU@=rlam#K~TIv+2<8 z(ejqc@u8$jwgy1G-B7H0JMqKz5W2LwuJTlP=M*9(3mdINt;joa0zZ}NprdWGRZRvM zC}QNW$uV5}pS5rG6rL;_k# zz(@s&jbIXMV;5L)Z#{x7PTNnmONN9&rS7a! zby2D7l0PsZ?6_Y0Rn~+K6eNp(L}Y>X6{^N+k)$MRXJUIgwJQdqpz5NOSm5ju#}S+= z$e=C`RjulbJRf%U^neBpbv+EP&Ev5fQfZPAA)Gy?$fdBe`!X-k-4`v;JzAif7tj?T zIp~aBhb__VVcu&J!63&}s9}g%*ssY9gM1t|&CE=xA?6#|ae=4?D)n=SK+FnI6^bxu zY<{fA^%=yZD;P_ZI`ScgR6l1NL5hATl`k*z_?-v9xa+}|z9L^vwTFEdLb9^b-r)#J zX3WZ7D-Hnu-L!e#8-M~{ne!Ze9mh7`B?l7alIvPcxJVOHl@cQY(}dKvqMH%1H<#R@ z&Y|*hpvdpO-q6N(zvpUyQ&v$^;JRdO9EaYjPUZ+&8;umqk^?4eql}>=R1*6t$6MPI z)VB(zP;+$;9BsvmFl6s=`2&KN%88Vh<8S6Qk{!X#cSdoN*BOQSb<^tQb#_6=55GC7 zK<*AfwE`vMNg(AoReKt|t2eRzCpd!e#_U?tg&nmjc6I{opw`HP!(s(acP%OXL4)Y( z51OSkkj$&k^+I((zBEk@2L}^_my(QF-+>datR$(?rUvUAY1L~{-~u5W+LenGuLAUN67Bx*a2+D@upZmN%byRF#N&~yRY_Wsqd$u8nM zZ8`8Kz&rq$kc^rp-h<_P0hazKZuVO>G@~paMH)dVilmU%%Y>l$GdPJeflnlriiMNF zL$JeNH(Gaj5z_dW!$yLJuzucO-4Oz3MEYq{c9i#*B*9(!Kwubd_HVMtJB9=(S7Bc! z?2_fSqC^@d|MIJj_S$!}udwOhNcjtx_+e9n7Jy{fet0d;BZVhOh(HZ>3-%URs7X^< zfg$OavWOeMhYrmz6b(x}>^N!e{9=-!C8;qWz2`G6sbH__%T1+HxE?YC)ObyYP!_R! z*bh*lenDZSf3-op#b+pE|A5js+Y<73d!TIa;ZQ>hOh8%!tc+Lc7YI_j#!+BmAJDy( zun~ZDIFT@>32P5j-VeOBIn*Fq&P!2HAPV)w)E>{F>-wB4g~C^F2J~Q}mP|5IOoghcB}sEynhnKh0L?XC5Wg(f4GGe})L+jL6YH<1NIwQ7Q`Ne(k&=odSC&Wqz%x3L!SxR*IR0=1ZJNP;VUfKfl2E*`e!&{? z8ew}ICI^%oXhyX7iw*U2Z;?!DUnJcguwOto&3aPKSf*unOuSb; zddixo?Bc4IHQ?wyq)S)kh{$k+#ANhsZkA+Jq#?C@$nP9U4#Hms42*o2BYsj^6Nl3kH?c2@|+qh za+i5Lit{S836QyM;#@a#03Dq9hY>Gci64Fo^Jh-S$ zaA!(1JgR{>v+o%-%{Mk}I!AltQ zh?%D=#7dAQ-^z6i&_nbf zdZYmrU~^f&m+FO7SKoRC8!<57T2LDX$T_`2OPm(BQh4Ciu-T5Q(iSrm7g`-@C9)~3m{47zOoa;B6GsrOqH zCsSOPA8P~Tu84rFN50EUH;Xi4r}u z9HODeswBbEX>qgv1?pE;>dG+CBW4YPDU{D7dBY%INXjaXF27Xt^2=xhwm~tyDI}&0 zbncyxi4oa=ohAf{?pz@a*`-0ah0$#8)0HsvF5+=Ad1{%95e8q{oqcwg`=sO}D*!oS zYq|mlySDW4O9UaF}wCY0YMS%mu|m`v!7tm zt&p#4VsaU41she$`^elR_?G#bdPq$vxY>6}70#_tx?#!RlusM;R*P<2QkuFERs0v} z_sK5${n1(a{Wo%>Qht2`zcss_9ON(mW&Zk6JAXB`^4GoqfBp0oyqec8Y5IAFexAiobf7S9@R|BG)~N!w z36kc+2l_2W97qBdM_cXX2RbZ9m$@2S%|yz^1g^q5KrnP<=!E$koiIuLVAqto9-Icb zDmrcFSH(;<;ic*Xs@{nBIF36xQBis<=WOY>KRr= zY~tT!R+A#7YDi{QY_3?6cyoz3flY#LFf8DtCNMLKMGhY!oc7R9WYQ7p=pOosq#mKJ z?x7zXC(#VK?U9N`adz7Sa$Pq>%{inNIJ>1}7?09Eg79WX!W>#VY59nz%*>WcM>t24Z0{Vsr^l$mOJJ;a6e;eTTq2pZ9nnA>8Ig9hvfm+J}A2Z=}) zq8~a%U#j6HZFqQxu~Y8T?8oGw>0bncp+RKo!XecBa$}E}`!A3~f;bT`K@$@qzws~B zsFl26$iHxSB=pHhXeb(rF73IaVglS)hM~c#=Ba=&gnfm9kvCix}9IEhp?g? z7_unGtVx%7rZ$K7htePg@Sht%D3k0{BWBXm?R%dSRq|Suini&Wj$!9QB0|FFrfx* z8&^m$paa}7RAAc);w_a5{CXn)$_E%b1MJ;0JQX-p+pzH43d$|g1ipQ(3el-SM`j{h zID*Vn?Ls$F`~RwS*lO`I=G6*mDu* z)?>UT$jsa@_jkV&U}bQ##J3@3NAqF+Z7a4w%_e=F`7S{=6`R$PjmkK+#H%bfspA~! z+*UC`P4B)DGo)k_{GWaTVGJEivB{BmXfi45vF#qshn_73`Nbxr_7`nRfXFY|lz>JI zkyN+}k5h|Glo>M{gG(U;>3mWwOO?v`b+*OUmL%5oG*PfkTw100P?Cr ziHk8VzHya~_L~CJgL1%J6=Du-^?`oUp{xl8TL@{obb`XPK0eg?f>6ZP7YDL+*jd&R9K#RAXmcT1mJAC8V9&oX4 zAcFmPxe2^?$DUTq;FkjU;l4@Y_ySrc@b%LzM3%4Ablw{Al^3bYX<4o)E;q4klE%fOpqoc zas0fm86_K}xO~i%+9RD-F#|%oZwj31mIH>+z%jHSh*>QO@-YLzyo==ll`ak(L#G7s z*%}oY1pg#b+X()vfd6aEy-2ez%*oo6$+luI6Xn2f!p6@z5Xw<9FX?B<*$~#mbY#6a z+6ltQ^Z%5K@iItL{H8zUAf(LYiZd-=4rj%*d7=d_B)QwqU}sDktXy6Y=Z46Ks#c~> zAqAM{2vx377eG=?ly{g6VtR#krh-j<3uxSifoU^03>Qs=66_)`xmHcWlt`hHk`a=5 zH2+fd{UiG)ZT71K79T}$yfNa8M%)0+8kukFdZ2olLOp}gedF)I22DweMnF zDAQ(=A&M;`QLv3Zzbq~pI1-@QfHXvQq)5w|autp>>};rCE5Rm$VEfWA@J zYDza$Fc+GsWaCCEDOEj@G-W{qhQlvYR%}awxraky5Bnh$W+6bm9Sl6``{MEIJ(Hn; zo9JfKDHD^&>>JN+#m=NsyGzTQi9W|n9OR#|3-JoI&J2T|`sjXur!@dellthP_{f3y zNMJPLU+WG#%@7$v!*>R0B%qKpMnTBmfmSP3T||do0x5@Vn#(K!^jVZoB#=nO5jrZc z2n|T`Mmp{hYW0NLe-~O%TZGp}5##P+>La9lwqK}#;_9KoLC8zdt3E;$Lqc^ymUN%` z2$2l28xRBiw}EN27pWHeHui$xnn$S5qXjBP3%r{_1+*6l9=m%qeKvwrF`!pm49G?5 zBdv(d8pe;CO+*3pkrN0Xt;bJZ*v$l<)ESL^^d?~uK#aYMAbCk1 z(EXzg8@?AQiycA1%1Zx^k+I#WkL`Fh8Q7-*39L0gph5*}hr|i$64Pk%cPUv8^PvuV z*k+238Ds2KLg#qvTB+p#wL=05YA=&Nj9dHON6C zj3b}!h%tv2LAhyg0PiWS&5X@+TnZz4pmM&UKM7Z9B z4w+0)d>xv=e@!@Sgbt0TFbPGq&r9lRyXG&>u5hz&LZ5CASP!6;OL0Lc_)uj#g+_1v#n@_G~j<^3Zh4Fq(zz;Y0ISnt`5X9+i*D> z+x^kKcUgtMiG2*mJ1j={qzhB&DAl9A^bk5_4>UI>l0B^mdY!8+P4A;-#RHTSmgFUkxu!(oR#dKu$TeGmPH0RlmIKjIjjX+EdHh;R6=`h zv`t0b+{ye=9PI2D%8-s!jBLe7b_FVxv3Zyqa_iz~0gTFM0k41o;Ds`IpT$CI~OD4OFh?QXV3jBSFj(D8b0 zTTBzMvy=NUTD&ueH}}5>-n?=VOgO0X=8{d~6nQ6j^9FURH_Dc~pt6Hs3~NW>5Ij=y zfr7r_*y>fJ9>*NM3A+mu<3=bGNF+j{V_xXaDIPZQ4V2$Qg_I>;m6t{}6eYnPTQ=w* z7Uq+tu$6+y7rsR-Da(Gyp8cw7j$N=SW4gk%q8WNq*LCRm- z^hspCJp73?A-+g1ibO8R!$Z;pQa=`%Ml&O=R5zKl@#{8yqPB52JMinshi%*+murJ@ znqjnEhevL|QfGDyOXJiKdkF&xC;dG@1|5TO=THEhwKkGTOM@eKAiuB=!P<8lH1-Mk z;)*EQp!M>w7h&tcFw_LuoO0Gi4^sS2=Em|%lY-{MSCGVKsDDv5{4_gYE4H7$hcs2+ zF)5oZ1?9~82+f)Ly7vM83_^bCgO+iP9o9xLfM9*G7&E1#mk!KvV7?15s;dWJ9_Ywd zq;CH&I%$xko=9FxF&)!yx4yW*`eGmgl6AM#zk*EjV#gFfGc0ioZg~%jq1={0wzN(R zoaXGtW(Fz_6Cl*~s$t+3UStO50(T+tB`J$6@P+g%tpIdije2K|l8>Dnjv`B?57jH| z4G6H_1DKTc%ZyV@MULQ>egeNkgL^UEi=i>mLCsEYh^!5rcfYtt$K#=daml)44Zs&MAb@Rra-_-E{yWLLMwE}f^*Rq8G> zay3`ida;jU-^S#HyOLv($=X;!Ly?0?&;E#cQ>kkNijjD@8MtBAsMoLTlc&S89~BRv zB1!9R3}O=vkSbl&$g3_oOUA3k-a>tzxLE`z1n6tMWojYK4DF5n;!O$GruR^-Kao}r zgS82VC;>C%r)0<>#|jW(Z$A2`E;8?(&EJ;2bMYoUQja{CSZAwImo2j4$mh&Oa#4iw zoI(=Xb?Gh3va*|-_uoJny?O>o;5rDbERrzI&4;om?~=x6?FiZv`D`9R{L38iDKx{O z3yIBWzA)tj*)L$?R)!+Ck`qu)!*#v8Wo+m)lG(3u+|YOK5tF>38(YV2wifH)h`o4% z?-S<1*j0uT$$AH@urfq9%5*w~?^3t@^y+~R9Zt(;D|?W`)BQrLLe`(VV8i(kg3M5i zllO4<)`=eI$fJjXXZh@szAP7#^C{M24-5SkEkS&p=4Uf8X=H<(&h-IEFc9q6_LMuj zr9mUg-aU(oRd7I)ENG2?MsyQ(5QhapXGN0KbG&i!9w&aXutwpec-GI+Rq z%WEDso8s&T*!IT|p#vamM#89L_*}%`7#?|tZ5orFqo-r*e;gi-USjh=59GZO@>ng} zhRw|+?&aATfzG2S?%NU8cM`?Uqio3Ax|(!f0&v|s9}F~dLfKn{SoB1tX$SX%J@sPB zqZEdfUDjsQUW%>#usR)b-6se&1qKloOjKMr-xzF|OP7vGAJ|VHPQ$>~6qICHpE#x- zi~G7A_dAdQ2%9mrWWKT8dT=4WmbM=Jc9Q*cg@3U*i?(CX=cpwX$FFf|qO;<2$W zLKx|WvQ@xq7NxoM95>IQed9c}C^yKa4Rp%ghUkolw>j$H@bm9??57(Fu=)jf&*Mgc zG-{(p%4h}MoDJ2RnU=(Z@6!&*30HutE#(=Fs|-`5sobw<0;;M?J20~zG%cL&w9%fF z&Nvw8da~rhV9r;{sD&Ip<>V9&eeVx>4=}PLBm+_KQ6T@=7{~ss@|Et=Qt$5jM{KbA zhOQM~hnm+bx1ve1%I0GvPup;bCm2@iD9X@vvxee6;0D{@GjnYkp-@(_k@_ zzhe@l6MR{M6k~q_XSl;O%PArv64}2V9}?jooZ~QE`eUJPb?5FMhc1=44M-Z^=d$>s`h;N9F!f?!UJCLtwm%yJO60UUc-n9lFow5`7 zDvq-q-2-A?S*nS-8SLL^{ed@E+|4pNi9r|(^$EJ7Z{k}O^ab11Nev&@1I=1|JNGmu znjj|jK7dy78HfC_srJr+^YYt9(UNznIav-H7QKLH-vUCuSF}`zsk(L4|h<_{qhy3{Ok3ar&v|B}VyuPQ4E}^?n%#nsAGj86B(l z6XXy0C^W~F+#OdAJwOkmWA?sL{(wf-`d#wuiK_wF&j5$#@a)HP2u}b{JDyHFf4~D; z<2s$k@frMMS$N}alE*Ue&cGWNm^@DT7Q8KZoAEZ|ZNl3$c5HMS4FR5M9mXEd3_LL! z18-0uZY+2ly^R|Oy^NkVX6!~JsU9fBN8;wZcKL0qF?dr)TClR$hvW80YH}=f6;k3tV_f=6@MF8 zZRhWqOyuu;wvoSQv-SL)&DQYuT(*k8=d)#a%dJJ)mLj&0CoN_L{9VHC^y&OW2g9gJL|xk zPk{ejcO^INQgAWE^EbRr14^t5acL#Qq0UVNC(G0A)EP& zT@?I?2QO0aT^{VF;6)znq2MVVWE5=U!OIkUnFqNxY(EduA(QRn!K)PfArB5x@Npib zJq&B)LE7iDhk1}b`efhYK{~CmuOrA&rdz96InSVdH(Sbs85F#m2eT+Rn+LNgcsmc~ zP;e>_=2CDX56+;VnFnW5@RK&`e?A32;=$Pze3u9L=k6DIa6YA;;=v*cw(;O%3ck#P zB^2C`AV+x_#eTvw+!Xu=9wd7|+r@*cDcHb+Ybdyd2iH;X0R+hbKdMsIr=3`-COHzh zE)@#J5){EVJ1{&Ak#-d+cj+l+N1||(o|3Dl}blj^pv@d#QbQ=8a-vcBXM>#WvQN0&-@3iK~kGsrBNGQ9wH z?-uPGIc0|QuY(R#lT9ugoJ5^Dl=uSb6gUU1kMGqH&yKIyOTJ!e9gH|T?ukSGE<)ZB z+&YQG?80#KkuAUS{kQ5CYN5$1=;ajkUh!;Im87S zoC|EDT#!v%02aV8G_rHY{00q%s-0VB$B%s_8E8K>_DRIFW61|+5b-6y>27?~TE^yF zC9Ew(AM%nS4nRvFBfhQ9aw8R2)0uUum9e+rkEIjq@(8j1{iV+#)^AY|Wa7jE`QynH z;RlNBPmu|ZT^FI*inH44r;~E}gv8qge_IR#`yw=dRn#&rlKaeg>dQDBWT+)WI8T)V zC!D8jsvGwQx^q{u4Dg=ZYW~b|iVlhJ#VvQ^VBL*IqW-zjvmsskWYRrvQECRA4e3;< ziSy*`xZO}pa)`Mzx6Hz+P__IDcWcqrt@8F?;aqrwelA@6D>J*7*q#Dw5r`Zlw4*M( z(SxBquwKPk1SghB6Z>v_7(M55Jnkm#E5Mzat;1_Z6%Ow?^wlb^_cxa@Vx}ltW5Ub zYg!7g?rx)))I51%iS+UPt3ztnzy%m5^I(czsh+_Z3wefxOQny45vl`7rmsqa_w|;8 zU3{syDGZ#pmrjn*l~t&1yc5=@AW%_H$#3rrzLzX+h$QJ30M=L^O2V@oJ$cB3o;*}d zJxRv10!ce7khF6xk{+rl!q2zd_}Q`!KRY%d;~PlZ`4G}}ZbjP8otyl8bLQu!zNOM$ zDCq80PX*tj57V7vQbQ- zlTY!Id!>QZxRoIEk`2Ac>&!b|sve6KnACg&FA!v7K$J*VDtpsFlK3q+?X*pKaNro| zoZhas-YQ`JjN2CZu^wek^`5$L>b+B4X&utlfh%esN@bt~Cd zzl*V-LKh9sJ^vy@A?@t8TJZ&zT2Gr%D1cT+B&Et6tTUU*tbhgcR{DC#&Hf3$^fjP3 zp~Y$TB{Vw+o2#z1IX@OEBdPX|=BmLq=QUv=AVHXI%Fs5M=#ryS^7aKB_?590P`}Hq zIhY@|xz4L(Lg^zD3IuD0^`LWTy39w04?(62I+r;BEA& zY~bxESwSMBPT;qVXYL>EE-g)@_d0rk>%HKY9;fBHRj4Ne$Qb1o4It#7C+epPXH|SY zLg&>4_>-i-=fwKFDHq-x@IUR)kPi2gmL#6lX0Yxx zEYLY{Kp*;xiBy0zGIUS}qc@Cw_$D7aZZvhgwRsi1{p7>61u*Q$paG)~nk*3Zl#bg@ z($$98xI(vx(X*-zSmj~lF=h4Ah9OFGeJs>aFP(2Ni1HyF=AEC*3qM2yV|Zbxx$2WP z=P-C7lVyS4Vd0B_Lu@hB=KN%YElmFML7#DDsoynJ>H(J!!Ymc*CsuIU{yc=)N0-#R z=o}PNtS`E*K}(eu9K#m+y%r#=T-Z#yF34@C*CjHuJLYwZDTjfwR+}(zUJc$)nwb;Ytr-xfhko)M$W&5phZ7Ir_o-U? z0Q?X_%XsJ&gqnCLfYAHjM&VWj!inwpy%BX`z(6RK7wJT3BZ`C*&muIqDRx&2`##Z& zE`>>CB~Sodc;_?yg{#Nn+$;#BEX*HhIdW|y0?7h_bSAQp3!sds($?}h0w{|Mpo|d# zWP<=oh5)i`F)X*AhJ=Zqb2^*$v87#LLCI`AlH_JC+ItLch**lPFCw}Gm^K9}r4M;# zK8=$+xJ@!b7ssb4otjmM@s^b4am6j;nv+_BE#rzCJESYsb6umR*O9qli?w-TW;24*wexHMy&@y4(aWT25#S9pKYB7`3++C5h`fD3ROZ_!xEawBYv!s4*zWA~F zn2teNOV+%}_e+M7meitqnyGR>35@Cy<8Ks$^Y5e4i&?+#?r&ZAx1YK#q_mWVN8jYZ z&lbXvZGo==^yzdR21L>jF5`)e$1PXzbtDxIsprk`3vIQ;l!Z^^w`1^`L9YDt6-QLG;D#n_J|QUaE%X!T z$a}zXUb=;?1Tl37L}w?Ath%I(8NF!|7P!n?&KI~WI}(93Sq$VrN`ce7HHFMM`Qj&hl?I(6@^_ zGFz4#usSr4Q*kW`h$6HI#m!0fz+5LRJ^`cCV(bH1H7QYkO^YPvy=AO2dtW)t@0$7< zdH~{KkrDmN6AGL*(b$&cRF_z2XzzeyPszhc16^&!hFS99`t4~y@U34vpb5nZ*s%?! zQaqK%jp{L>*wml+6hw?+t(Z}dPv@*Yqko|R*QaG+1kuJAn&5=^F6bKj#NjAxVzG~_ zqZfYj6Du6Zp()6KXPCt|>3(=B^gtG#EyZf7<+Dd&zmRds6$YH0fh|wTVjX~k%Wxjl z4UD~H6g8z`!2~7i&Jro}@b@mD?)xzU1jxVKQ0k^n2PhNt=2^zDvAvXqESx*A1SGa4 z3y~XX(4A-Lt_;YAFnGYm-s5MftP!hs{m(`Y8N^Ma=LurQshkIHBC;^`L zO)bPbPP+ew6U`_GhN&AF{^|sGSq01G9l)Jp;$&(cjaVDWJ(iptu>a_N65)EsEXmZC zG^<#y%R-5K5Ougcx7)O>x!B;_0Ey*cAH&>4YoWEV92KY>hGn>;{_XDi;HGACTai)d zbs&d~UG?^kw03-P3xH}>7I2J#8@O=O1%L-sT&FAlp}XO2LFn6wfed}YemX5E<+c?k zZh%L$Re*H^sfkMYlXur<3%_uX1?ClroMHE>a} z9t_BX1zQq~@W&sN9~?3@#kj+R29;Ul`<Xk?W z31$fJQeGxMR_0x3tjLdQM4DqDcA8M7NqhLVf!|a6xM-u!vKE5NaSBR>DI(Z?Tbt)5=4 zr!MZ-abXMDO=4Dcbs0~_30fn(RKE^xqAo?{E7Uq!T)twr`8r#UwE>x= z>B1*=)$BGb<$taN5RnzWNo#QdZ2aQjGwU7bmnO0oUq=V#vKL?u!+sC-Xf+-4=sbbd2=k^x`{-vl5yII1fuY4|`2?}BVQw-xutXBn@DR=hu^m_R zV0s%?J~{+Pk6II=s^g6clfYn8@z4F zjRS>aN1-P4D{jL#BTg$yW(&v<*z$3>yvUxwjP*M&y5U5Le-(ab7x}fg*&`F+tmwRq zF#HMM;EX<_-+9?6<I;Wt4#8J|b4E73bM zt^YK_De~pNfahi0)%KB9}V&I<$u9HqV6&-Py93f z5u0|x#{4<{5sf>zExsPv`A1NxKkpwA zh4Bp(T7_pBp2c|PTI2KY~h=9^yatkKl0Q%KgXw5mDFy;Lwhz6HgbO zZafT6A08w1?Ei>=1U05=+4#-HGaF9{rNqYOzv3UkMV{))C{ruptSLeAI{KtZY%kVA z{XFsgAT8^?GFHU`r)A5(tL3)lBuD2C9Px^fuyq{UN@b&8$#vo{C>pSTQNvBAcih;L zhJ`Q5dZc4f#OTYfY&I7yZ92WP7tO&jy6N<`3H6RS+tbNUJ|DV*0&!p%HwoP-C29*z zkqH&-?htK?a1V1oS9M}Hg?&o&fP_7R1^$RhWolP2V&dvY4?ng{e-qylTW}Gtnqob8 z{Rq&mzm@jdxL1X~5_5bknj1pGd~EP%9MyK>m1{rkI3`VS9EUqOeea3S|J^3V7P+S( zWI!>cd)yG$O%I%u{k5FVm%U+kc#7T;)fv$l!g{Ban*bmFA4oR>CH|>PMznf`3q3ZLzRzG*<3T0HKG~I zh^ppox@tZP3i)iVn&(P-*Tc!5(ax`sVrf;?YoWS6QGcyyb7uXuoXttrpLU*kF9b`^ z>H4>)onfGe{j|P=z?l}K1tuBLrnl1^7zlO`^$m%+aBoc~%N^^&l|}F*Phz`XjZKT4 zNBC~{Mo=F<$6^XQfHLp{PGryX!nm_>+SQUI z1v;aW1nWVe;Sa=^4H4~bejP`J;<^fRZ^Ly%0OrUqz%epVu%@X`O2>8P#_d<3DxtsA zU=R4~`ksH@m+<`R-e$z*4HpHEU+VMM_3YcXPc1wI)7uLF62lMVccvMS;a)ZTv9pGE zreS(0RcCP(-@}PZ<>TG=_{F9^-!xpmm3O@8OgAn&XiBm+`Z0^JtCf#yXWkh&-L$Hy zFOn#4Z|cLX?i`0Jk#DKtANZzKPCvy#H@r)5A5L5$zuvus5XpNTUrd~N$G@zpPc1Nh ztkiX@1qF58wYLIX)7?e@Tx=jFPKf@oN@=K%VQ%g@uP?~e0zxHXH@ z==t6hC=jqke>@HEJm*=z)T6c|YoAV>eVFZoi8^uiMd>1M=mJT*1^IPNJ$~k0V3h-` zZZE$$@P=B|?O*ewKGm+Coc=m4i$MPSKr~J2QtYa9_RJ;vIHRr`*I0FJKcn{f5`vc! z{I0?K@=iKBx0}^F74b=;=lUo6$WL?W!@c-S2M906eP5%4<%tcJvonej$enjwCo8xC z?KVxcHhvdK{e@wwQQP8&>5@K7%jJ{Z#neIj>AaJ%VY<^le-iGWG&w$|G3cT(PzrER zi%i3CO^ps!tpP3!A7P}14V#VhaqOMy>m?7rrMk}Y;kg-Jd!57~b?F$X(eY8!UqJ_< z{nPvBFExzN`@ezQz6AS))xBltp^leh%6?#H-9;bl#5ktGMgCp&YEZ{GjzRt#5LTzO z0zo536F%j=PXRR}PixqKla99YuR!x8u`w>y9AV>gs;gVw?(b7ypMFwj;t!CLR@bFa zV%=GA^qF^KoLtwn9alvE$D9l)NNmc7`^+CySNp*En>t7tC)B5%SJMONMp{*$e62{r zCmtu%@~cXvNf{qWm9OPUiAYg!i;8}U&f*`$9cBJU2-Hp>|Nk|CdIEhWfl7V$0`(#gG;%aY1uCWePZg*{*3S{BT}b{b1?rW*j}xfd z$Lvt;9UgpP>uiSNzZi$9-T0dfiffl5J*Bt~D6Z!e*RzW28O8Oq;@Ypco+xnTN;j}t zIIBf30a^bm{zdM5s6}yDRLWmyNxe*{EDdJaIhJpXBMCZ8$t^Z9w=E%RrIQ|E=m zm*+3CK6VFy&3Eodow) z&`VC+XgG4?{DPe~%5?`OZ%);m2fi3;PF@l*YR>)W{Jc=zJD-8$MSbA(7;tLoeE<>E zB|wVwtaKZEL0x)Hu|JXp$iL-~(_)Zgxph5}m%kW7mH8>wN52IiK2z`W(DC}04lAw~ zqC`&irSyIuiBWpyfS&kk^`K`VRWSE{4|%fdDb1H$*;|URFS&OIUW)Wg#K^H1ug$!3 zzIn@`rTF8XeB8GDbY3WORIbYr#3edZ|56PNimiZs0M2i9&*2=gTfyhqU9kJ$Po)$% z4{Wj3*9|0YHx4@oR)8*w^8oeO`pECd2v_M#tz0T!OSLw=4jp;q2pY!?xs%cJoCi8m ztw;L&%kJ!KxaQ7)6)8n0=^rAAhf5I$gGSQk7g!&!LU;764|_`y)?5eB&WifG1@Wri z*@_d~0XlLs6SSSG^J)8O*hdP=pQ?kc%IMr*Q2vZ$G&-{i%Ab{tdCu%YYRmfg&A_g3 zKkl}(?wW<*;cm=4xp$r7d;u1~Mh1?qOCRVuTr>sWbUR-_4jB+(bFWdHtp(*T;E$c5 zNCbPFM)-U&4xAkC0jpGfgOrKEK zIKo!>1_X|Na+G4PTOXxk(UGHfQ|#ncoR$=4JJ9V-N3y-Y#&J%Xws61+owl}9$}EuD zak-b&Dy8vGo$P%N3}54DlWtx(u*l5I+)%LDBuyx=OXC#jgd(*oQfqH3pB7K~>$<|u z=V0ps#h+5kpECxO@~5FP!XJK3Y*n1k`WL~w`xzDg%b&F#oPa~Iya7z{^J8kokbiap z&KxF3A012%03Pgam?B$;L}LwZYj!@HAV2s_g64W!u6tV8`7%C8)0|IfuIGsRcJ6Kn zCIopZ)4yjp&i%)$nt;bWoRAV{<2x^o�vpbugKxsXB5!z8 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 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/ia32/v0.8.21/nodetime_native.node b/node_modules/nodetime/compiled/win32/ia32/v0.8.21/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..e2f94ddbac16ea233ec7275142780c8bbae8a4a3 GIT binary patch literal 70656 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�vpbugKxsXB5!z8 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 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/ia32/v0.8.3/nodetime_native.node b/node_modules/nodetime/compiled/win32/ia32/v0.8.3/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..328adad9438a2226a7a62492d84d4b1330c0a0a4 GIT binary patch literal 70656 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

      1(H+%UUxEMCS>Kjc&;I@> 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

      ?Ts#ff#rN&0Ciy%%MJadp!quzjo&<+~be)tf) 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 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/ia32/v0.8.9/nodetime_native.node b/node_modules/nodetime/compiled/win32/ia32/v0.8.9/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..0e4948c031b7585911ffeea2f5d0816ad97ee09d GIT binary patch literal 70656 zcmeFa4_s8&nKyoi8DN0H85ImBs3elq6m3XHQ*ppxbdXp_2a!P%QM*+-otVbry=u0i z&m+tJ>89QEZLD!OyGdKyx>1u8 zq}}dk-}kfo`{Tzu_xyd%bDr~@=bZCA&po*A+btLcK``ObG(k9oH~lN-zkm6MA$#1k zm&OSPQhsyuA;Z$&+`Q8J&CNNRY9IPW?bja6`TEzs^{t1*oWI$SQ!9Nd=bPWkS+u-7 z=fQ{8Z}?JrdTMSI^e47M4<7#Zx%si@Tyov~pCEoNxpe-&^7r=ny?F0Wan664$Cu21 z3Gc(-eq;VI9)EcLuld_G{}6wFmA_Yf^Xp!M8S8=DDF{mqiNesHrDd_SZXx03G()N& zd><))tEV2h4R0Hs{XA~t;RHcQ6bw8e_7>J54x+7`VGt68Vnk4h>W#eh=rbVFCpQX0 z>p4Lvr0jfya6kt|vC)43aWw_eUkXC@XzFJ|?DVI`26(o99=vGHFNqtri3or2Bz_1# z>MIR)+`k+_Sofvc^3|H1!*6tD-B z1t!IyEHH;o&_6Y(F3mNm;}x4)W>VZH^xyQzQ4YsQ4aPz`g4F)XI1HOQM6+s8Z9ao`ny{w))p7Y@LwxBI zC;mEosm=(#3qOS~Wk&Ix@j3VseU%Z4szG~4SlEavN~sBy9;IxwKPz+1`k0KCa+{Bt zW8*Of-x8g^mf}*s<*{ux|N2}(?zNQaeH_8}@5hg&ZydhcqFJN#4I8!tx9|c>luYWP zTvM3ypN@kXV;mjb6aEF3FWPK{0Jtp1)c+CrPMh3BELC%=`@|M-PW@4aFf;ex4 zfjaK>n;zMg@e&~=vs`cxVX3$+52GMwqMt$5MVaV+&PBW%CA=HFh=-}sB5iA^L==DO zpU16!sAazJ3%~{&j?#jPsD?4(y0^jb0e!KkP{%RDpf%fI>%T`YNwQA^o znx|SO6-BNYxgM6G=SDFN8(sh=qa+xMjXq!FOVIqKc&ywQ{{OS`g=&oQ|F{v>0F-bN zWk%=gwrJMqn14nd>hv$OfZ5c0F=N|2cdJ!U#TlEo1Sa%qTw1(X3H?`26>2>W6Os(p+1a zmRbJ`u=&c|EEVF!;uBW5!S0!>khq3Z5o=5F)i@HXDFi|8HAh9f9*>jv(frsFfckEW z_D*#4Pn?k3wK!-x|2G2RSYp@^ANy<9E2=X>kH1eFOApG7@qaXHlpgZsnS18i3^seK zvM4tfqGon^g}O0!u16Jf7uf@qjy`Ln1w5tJ3F?%UAPb6Rld;&2V#EddDU_;$3H)T9 zwdV+gWKpM3TXL&e-eDHh!5vO@nMuoRMp|P)oJ)y2$LUC&QS;?iQ^crl!Pf5eFsMR8 zMawKjSvM${foZ}*pJ*B=qQ0(WE=4-}nc>z)+C*K+j&?=j10CzhT6E=p_1~-G>9uZ@ z|5le*U@1~W>ee~{wf~V1N{#}uJ6^RuwiS3(sztlK4e{n4P7msCs5lFdL_>zhJR|09y z{vbv%alQlOvhKPFPFGjwW-J8FGr;b-)?Gh9(pnJ5tF!#|Bx3n>(IEuC>zrtd<3yWx z=BYT2_X$4Y`bNTE%q@;FVpfz9?}%r_TSgdh2F>euMr56wuZUy0jFH)s zixIMo;kl9dGs=0oNR}_>jPhSLI3w4i&Y?A-Qk@IV&mtbfn;+Tn&Y`%vcy6gr6AMbk zTS~<=ulY1*|Ln+}G&j6w(e)MDIaL5rb0fDAD&B6Sl_AZBA`@w><)dQlZz)-w zLxK;&jgtfeqYJmirlx?Hil%JHMG`QzlFY=+zL9>6aU3nmJ;xgI$-9#@==Fv=ohwjf`DX;FSYV~x96=O zd*(0ILoEwxnWMGLIyG!Wjd*&18v0m$K0Rmw8$%HJvW*t4IeqA5r9I%rl1p6T-9JsA zlY&}w6d+Y!Jy zUUyCu@EDN#P9w)Fk|+QdWRqOPwl*96(SeTtJaD<*POva!2Y{&pA3*Gvu(I)uOO|*0 ze-_-P$z!m~qV;DKT;qQhT<2c|_e4B6-cj@zG(MsHna-}u{ygmR`9NfOp9Q$F194{@ z&1l01Duo>Bv|W}Gu7r9Upjg-D%$-5g{{#jM@+3j)^i5_AXEdL|C$Ogw0Ajt>c&i%b zPIYex%V*e-^Gm_j`}5>zDmFdgBuZjWBdOnsgLJZoy@nZG1%9i>*@##6Xp&j|ko_yl z=*8nR!HAJ`6ktcNC9MJ~R*H;^MlN-P`V&t~HP{SC1Nc2cjY%`*be`lh_?<&;?DU*N zGYEgC>HdNu zO5f3-rPEuf8!9NO$3RJmY$L!I)Y&8}I}4pOyBCeHGLHg33xfoA0Y_9Z_Yn>=9 z*Yyb2Mv}cqVGGe7fe2U|deYQHUmh%cfRX*kzznRSm-MA`O>kU@q?Mn}(rIzf8ZGjDDx|(C?gX`YpPM z-1iqJWaBQ`mbIQPpYMJBYX6Y2It1^rr41 zO$#R$Bh3JN#vaPtdlkbF2BR2kDJCHhPP~i|ot^j=Q)%i#l|6;vCZ*{jg3$C3`_Dy9 zFwsTKo+?uRbR*GQh=J2GFCr)xQ2{|Rqs$>H<0aVol8g1U3q?9Y?8%#GZir^zB=!#o zR`n+qqn!kCywBjxgyqF&WPgXsBqfck9BQx=oN%hkvWE()73S#`mVr~#+tZFK>6B8f z6W<n)%KSJo0wWG4^FCm-yT4w>D3cRik51)JcMrQ8|haS=TNyvl`!V)FgmFY z+AmZozcyjO9M`Rl8&MD_+@Av^At|hl$$G*PN&xeu%SGKpHESbTof?LR@M~?n3x&L< zS3sBy4D?akEe2a9J1~uR2<+Q*2&KFx6gqMbvOMKAdza*rSl$onynG$A6p*KR&%P|! z$~|m*te$AW!b<H_cDN&T9ecHcKmyx!AB<*`%TaH2SZbOAiHVbD83`b;5IsNN> z7^L!D#qkXoLy}w(OXOiqTwo8hSQa<$N;CsjO+ofz(Og_~75%Jb<^CpW!0m6MJa=>T zb+(*FK9=BtUY20FhOn9c&HZfQHBIXXf%M(Lok%ZcB65ZzM4TwurAc0*IJ*@vy&8pX zLWm|OEnh0QpVqtRu*-F3L7at23AUZH`*tGub7&IaAky}Lerg}|>_`E@5UWy>)aMMYKaN0kgozv#D;;nWm z)k8R0f{U!*ZNM0+!+F>Ji%s&Nsa7gy4Ky%ah*vqfHkTd}u#h2;poWYgN2u27)}$e} z4y#}l@x>(nLK{-&^VB8LRPm0Wmf-f!K7_Lnn%~PChiERMnDz#iwKkJSdt)z0#%acp zFtB#b{T=9*$7k~8uotnxp!E_gI#Qn(#$uM}%UZQ2B;O|318YK9^|F2osZ9b zt!~5zv{YANor*2mSX8m~=wa`mV2Bl>q)tOBdk{1n=(;H|&{b6$WxsMPpYrwYtq*xB zpQ=g*?2>R^*5-R85bDM)Mw3^Bc& zEdU-wwttBvvu7~Dm3;OC{vrm7WR$ZUD!`hM78d9PV-MUPn-Z8?g`;yzn?sS2jV0~o zv`&B)6M;x|h|6G_l2Bk^R(dLZ=Bgv>z(M}H?koEg=O8v>Yaxl(poXPiFpJ4y=T)Kj z2iWRe#aQ-fQjaEeL(PePbYSAq!b4*bf-)2@zU9O=W*t@nsBEdTeHfgZv^k4Lu%hvc z7I=aRw52;msEL!@+MJ~$CACgDoo|Tt5Io8s=Y~2LmE?5ZLaz@p65GhRG}z~{ zI(h5S6=)|3u4E3EtnNcxt}$a%wpiJbq3qby_DDO(x3KMzuR8X zx)Gaffxd1R0K|A?KFa$n><%h`4Iv1mlx)OUnfElKD#F^9jcgI+#%f^U6xicHCxm8! z2f$|m(JJsIv+@8qx>6T$`j$@}WUXLLt&@{$S!{#&Dpm)z4-=|iocHH8hgqaV8RWuN z-yPE4P)Ulwr1tp7;C6dIT53dp=nP6ziS0x~ydAU8#-1f+r5uoP9g*?xuqg%3P5su! zLG(i{!G2CmcC&j3m|8MZkImL&v-Q|*daO{7W$CeEJ(jA+7U{7etR{d`s>j~fW2=j3 zn5dE8Q3A+y42;f4L*3zR(!?9lg?e-WRJS&0G-4w5y8EecjOLa4C@EACX&78V-LVmM zr&qGOh~|zW8ZI%TLEE2!w?)2Npbhh{C@%&Cg9u`-BDm~zOfzCVjaejx2A3eHptg5cTV75v^X{ zkL~~j4o!PQ>)acYA&X+O=TYJTefH#!ojoWHI5*MEIRddAJ6Gv52XYcp_?t+_QnFTG z4?LCjej1>Du!cHV1@eEPAkhuXw@kxgv<=w!A7PlR4n5Hba~;&2gPL@l?*K-DVC*Fe zLCVhsa)a1+{PnOxpMn*I@&8u2DCh1g+0rIw%=^Ci%_N2#=)`f|L@Bso`MM+6ci5eaA| z0V5S8HiAj4ja^{Hz4ZvTIBh@KjyDdcg0<-xB?MC5s~@YSEw4RMUs-Nor&$~)UFtag6fM>Vu7?#sMDcVDzX_h^A`UO-oX zHd1!}QvIB91S$HVRKC2_<98kao~UgE;*1WmtNOu!o`}9s+1ZLm?osQ72k}Ay}9%b zbq9zKfw`%H)hwGF6^jPv9l9s2en!r92P5ax@$@44;n;Q zf6y$Yfn;8Nt{15T@}+5NI5?OXyp&|b`VO3UWhF^<4z&o)B_{7P(4zTE$WFA8*RnRg zLX2EumYsv9#hP=-aeez^_6zD20>R0qCQ;jI)OJ$+GE;rz+ifMLhNcVHw)d}sO?DyQ zY0H5>0puMWk-2`NfO+p4+MtcX8$IOykkg!auxPv z!Y)~ED^8?g@-MsUXs>-o`wE*5j+DQEi61sKXaPuu?T6RmJW_Omgb377w_tC9g_<;# zl^BwKDT}!Ad+1PMk!V=#VaG{x=NFRVDv@&7lU_GG2;;0#T?ZruKLaUDxMa8T4x9_JBu8hHkOK5;hQ! z0;gF_p`()1Y*Hp-8r09fMFOb{oI}65#ri~`1WA!XExGBmXl_YrPPj*@u(V9Iz8G?s zu)oOx8PJ1?S~AH3avm?AEQOfRw?3Aj;sI;$hC20EGEl7#N*ozs#>dm2e+_eF~sOSEKURai=T zJz!l_Pi{*Ph+uSb; zddi!p?Bc4I)!^toq)S)kh{$k+#ANhsZkA+Jq#?Cp$nP9U4#Hms42*o2BYsj^6Nl3kH?c2@|+qh zc9(lRit{S836QyM;#@a#03Dq9hY>Gci64FpPJh-S$ zaA!(1JgR{>v+o%-%{Mk}I!AltQ zh?%D=#7dDR-^z6i&_nbf zdZYmrU~^f&m+FO7SKoRC8!<57T2LDX$+DPVLzHE*py9B1)Xir595Po`s!4554JHm! z9SZ*M;0!)2ro->T_`2OPm(BQh4CgY7T4L7YSrm7g`-@FA)~3m{47zOo3Z|3~srOqH zCsSOPwU`{4B89K>A8P~Tu84rFN50EW$jz!Zy5P zebHn1jzdZbm#mkO7}-&TJU!k(@oyDjQPbm%6kk*H_px{r#g`TNWAX1&e16g6vG^kt z|5DN4#o{d#pIY>92~l{cC`85;9iVtJ+6N*~*R1!MwbNC~j`fjb>R=f~)~vgqOO)uL z_$~9x-bWOrd-x$r}dwLQ-CNblIiimtRIBunmgoO(8L5 zpmT2_CPrifcA5|*x^smzWS0iv7DltVPglawyO_tx zt?3FJ?Ap@DFBXJgw=Jzt;nQy5oHB=6S+f?(Px;noh+lP~j@h;M2?&a4zjXUmoc#og zZl!!(6O+qXE7+(?-bdyp!MD`k)I(}Y!Ogx)s&HMF=upSo%nP| ztD@6(epSp=L%xKnyr6gs9y1<K^*RaT3jt+a9TC6lb?RAlG$6)SN?VfwNmmhVdxvBM3id4=Mc4V-z> zucyH-eBC77q%L2lxXvnz*CAb+uP$G&xH`j&*Y5%tN|~vq*Mppj>!O<8h=7qt3tSiL zCabQCAgEfoT3IyStT``6e#bn$V5X#)mXFl41Y?@Eb$z*3(Ongp3}UJ{V8hCd)2YCZ zrBxxGHx?}%k7GFDIMk^uUJsM=KAgN`>uAhj8~!(@fuIpBiMcHXIcUI+aG9PUeUOM` zA^M?H^raeJ(uRk37(3-Y&3;S{n*K#F7#c*TE*L`1FE{pxx&Hz=B#0C75;QR(@*DpG zjatbIhWrbLM?#;BgodJ_=+d4$Dki{<TX}r{Nc=e- zKM;%WeFY(`RW|Q#9U|)NJ%qG9^rO0%t`%_v#l;2bR93tjCA2vdgfxKG14p8n*jdjY zWW>pS*TpiQ1r8@=J_DSJk(AW$gjY#QgUcoeIYPv~hj4K?nRq(@A^#TA$X=$pdk8Da zfgy`>%$jtWXKHhJe<%%70ROoGgfhuKHDV^szNiZuTDPGmu7t`y8UBTse3|SdbPm2r zYhcs~;F%3CpFc=+(PqAJHHs-!4kpx~ zZR2tY26TWsh6-#uLA<3(fnQJLU-I{RHHzU z0m%+AX}M_psuZDfy}bj;O`5goVMq=L0RX~?T72#rWzmx1RlVzxT%#ngUxKZoJ?Zr! zP4A4;TmwH!4pjP6p3{74FlK`L3~|3r061~i!_p8Xu9FsqL?Z3))pL2B)`R96#gY)k za)gv;iIjJaA`p2+Z{1~X>ex0_zLv1VB40B~8GA0`oLn8^FC|@%uxsG_sBnxxEJMPM z%6g2~1euu|=Kk(?0;~*fmiRWL>}WpBzilNJsM(~iGv6i1rV_JSx=|UYmU@+CCUu-6 zo!crVsOjA|VuqA%g8$P`AdI1dDKR+`4^1XzJ+|GW`OveaAiui0JLJJ-|WXmL!7ukzBa4&Lx1TXZwudf3+x?0 z4XK@xR{{D#Fhtd712p!kny4nQSZeGEolvCT#qi1ECxx^OAmsoDE@3Oh?v> zqn#j(T==J4jF&;0;y3*%2O(uHSDb12ayTod%@ZwfA<5l-20LTYVCC|HI5$K-RJC$- z3Ms%mN2qe8Iv7Mq6|MmqlM@ZDR8jb_Y(9&!6p*(#8{3Vsg-Q>8pk3+Nkl zt)_HCC3B&fDmHGUl2Y9hNmJ%WU^x6TWyQ7>n0q)R_OKs9VHN_^+rhx2zAqlX-ZL2r zxQT8yoiZ_b%)asLR_siww7ay-ndo!O#6kWUyAZEb>&!6dsgLdlcv=InG^vjsijN$K zj|4^|{YEao>Qg)b?9hTtR zwzQyshwb_2pFd1)2RJ&SaNfzIRIw$)&}=JSE)Dn}nS$sM9BGkeM%prIfU5(s%r;!k z#&&;n?_FN$Z(<+A@eYd-KIy_#I!g6uFFk}#*#pguiDXYJhF<4tOVj%(+SWt~IXDO8 z`+xKS609$_TVFIf+P6;13l_WmPoz`6FJ}e&CoE<_v1Oq_4kf^fa1Lw17K^`W2$j&D z8*NijH+M3B6bC!|g>s}L6(d_Yl3j^PEG>W#AHE~xC_7sJ|7I0TQB ze4wCjIJSBfsmC#gZ^G`v#JCa41QLmm=$IF}bBc#ed;{h8P$6ZpSLLNq4MjL1{6_H-ItT+{Bc;!l_@!-ksKbDriK$K2r@ugK+s0!SL)1;VQHKiVlQDJ;iSI@$e?2|?i>oBv(`p3X=!le4&)d0Az1rvgT_7~ zUtAF-8?;^?_9ARO7>1f4n^Vr(=s}9#$=q0eX;RR9_zIHv4D~O}hM#5!Y{mA|_mHOQ zJ0@kbrJ#aYAE7x@U-v%1pFzkkeb6$lvBTO31`w<-mSCoI^wNPj4$OA}Ms@W7%mW?y ziq!4@MJElC)Dy{TDWPNf?ba9PTVD)BK(g+Z`d5%?UgVepXokg(!7cA$F_ha9$d=ZL zfzzDb*vvr1VFHBOUNsEd!VAs7T;MJwz9eO#1-_7er4@kgt5NT)QSz~q!%<|3^r3o% zy#WE%djONNeyMSasn`+R(of)bXmAh62hsftryiyirQU2VzE`@2Rhx}R6+l(W%@Lyl zRlP2=bW!yk5>=6ZE|^1nVr^Opz}Od#oKm;ISryK_8QxNw2>*;dlkDo&*roF{x=P(e zMy}@SS}*od?Aw^Ua946HG+7%fX()0q>DeDKZ>n^SKnW5LHv>1!8uj{>ee!g8_M_qf zR3vHLjX`Xp0aB%l8hO=4XUTZA#9O4#6E}>e7Wa9QmBNNG^^r zo>N3ZyDq(DX;yY~^ZpwsqgT%$30wz(l|>S!x%p5Q5mLXa6s zaPl7R-a63(9eMOn@GPHQ(wF5Taz4d+>|vqbq9us0)BJ2ECXH;6)44tX2?l~4+n#b~ zw=`%(*}G>^u^J9&k_D~t&xmfK4&t!js*L1w49Nd_^hlD0*17*{%=xw0!xrhyLk16b zZ+XqbW>cK~0Nef;B6I*`%}5w^44;b_9K$2;uuWsqbM$m<{g1<=(MxO|=z+X9LLRHd z+pxKr#JxN_BhYyi$9+4(`c9(Qd6W%#TUU|pO8~BW3&B7mCzQR#h(%9Sns#tM*i$d2 zJW63$*=21;?WNe-53AE5*L{LeQ(zEb!9>Lcg~njRT)K2j`oMnra2f`-rl2&-`ouBy zSlrj`xZi;cK-i3_rG>_J>%j&1TH1Q>+e!A*mHtKMEZUAipQDyq9M@`7)KzBVd3XY) z-XjNQIL_6A+xf;Wri-LEhvysiHiIC#EpZPS#!&;}APk5j)(6nH>(?)wz zI^$rV>&cQ2gE?O*qZV@bl#^39^u0giJ;2D0kPJk@M}hofV;uXlDpt75%DlVpAF;ve z8@g6}9co^$+=?d2Dw~gyKcGk$HSt@@zItq`DbtOul|)yO@qZy z{*FnIPVi+3QjGl#oZ$}BET@QwNM!$dd`N_UaE`-ZhDet?u)stII(}7)Xh(bC4zs^iCNVw9$d)I1wbjnWP zt2oYfbPtGmMVTh%X0U&w^#|TuaW~88BnDwD)FW7>?cCFt zXo8s7`v6+SXB_g!rrJ9P&dYBbMN8hP=43f+kb4bMzuF$`HXDQVvf*`He#aQ>O%Ri= zJP*LBdb#(g92$Tt=c3%$txCYYlEfAS92RtZR&vVN<`~{$b_`m-`wRx6;Tp#zJBG=` zN{{@mRla0(46j)$CHDRZcnyTPE+_*nqFtCyYj3}@Ps@GMy#_Ka{1Ro#y{1}=+-)?r zYq?G9t07f#{p*mu8}A-OcZ>LW22U%V>8IcflZ;JB^I}6wNdmw&FHVr#jB=O*KQRIv z_Vbalyp#c3205HSDE!k%soi=Rxy?Wbf?&vP9?1oa#Xw{>o|$-Z@nqx4z+=H;Z_4V(w1 zpGFX{Vq$A%fS+7EOYyXn7^k0VUTl=#=hXXvQ}35?pb58VnbEO& zKSBP0k3w@?$=z|~&;#@^I%e-1Lo<(c8Fj(97s)W5#YolInpnd?aqpYnR`)8iO}=qy?*beK>B9q$bBwS0a_K zRix)9$A_M)Bzf8F|(KX+roau-!}F#^>zIMR*RyNnKE1`uKIHF>te3wxvA6kKWas&N8#~3{+gS(R zgu;s?k=VC=%RI=nVf%TI4w-Bp4_>9<4|#Bqf{*hc z?O|9W57IuLJr42O?pbMo|5lKoDof#z*Dx&cFdW{Q#?$dl(7w2 z8|k2@mRKB#rf9u4U*)aY9Es*=O1qwt;YhSZQ(n|lvK)!FXv(vCO12|0BbxGedPT=p%UJdx|<9+@S`sQJ&H!t&i{35zmgV*h{`%Y8{L?JMM`?{w_k^ z5!^b7{UdC!>X75Q=nW?m=5p8^xzWv>#B*biR|jz{z$fM6-Efpd6MY zsLqj0<>iqioZK}jn~H(3xwsVx{Xq{ZSq5&+!8Z+8SsDURp;h@e^kDA`HH-Z>Y{Dxe zo&Xr;=%FQn?%9!M;B-ZhqHsrji`?wrp)`?Ob3gB#QdSnHJ|>r5&IQ@=T#!A=1v$h8 z8Jr7jqg;?pTmTlpF*LGsM`42oL)Ff$v*X9UiVU=$8v7(-+Ogz=Gl=+--*h)VYAt7T zt`gQ3q7QjV5eJ|pkP+WjXStDztLe--)ymmh@W;}Lb$NtX|NheF5bL)n2r_YEf&B4g zitqzP_NT}M$F7UeY{gk^_0vfOeL~{xg1;?>fqfC0ziMh37s-9*JoRN94l>lzA)Kem zfD_JBHr0*$1KqhRSO$1cZZ&`AI7Np<_~KT$aj@=2BT@g{=-H62eKP5uwQ;ICuW&BBK|dER`jwg8OKeYpwFpEG653H0 z-sr*59$2s9EP@lu!zRK3UKV8*b%mv%%#82hNd|<<%U)gwArwiA1^~pOeATQhG${{Q zD$3les;aB#s#~oyRAc=hP*$!6LX{Zb~)Qod!G$Z1j^uKl$`i zOh0b=Sw}yc{7O9xfS9iBjOlqFIpj7(!{#7BhYv2NmlX);juTan6jDB-2-=!TWkE zz%IU2+!O{*+e;@$=*lY9Hr@$qQxK@Ar{uSH2H#5-H$;;33jk}Z4<+GQhMqj+K~El9 zLp@2xvm8k~E0MHwEs`FpDaOyY-1ynD4nI3KA>$iJ+xZaEc5X%5&Yhe5d~@dKroJW8 zUMT49RZj)qqvP!j@$KzQ_HVKIciNUnA7CpCcjh3@0`RDwq}`Q2N4mMX`Yjb`qR7Fzl9nIB)ZO&`L0ziT=+mxYgGSMYRW#sJ(IPfcD%b|Xk zTXQf!Y;&Dg$%N8JCKL$P4C_JX&~&GzzV0elHucFc%fPS#iW1?7lxgiW`y_tb>%iOS zQ~AK#QL=(WMxDTK8_(Q7+Fe?jNbhy@0@r)NFFj7nb*oTM29PnzEgC?`KTp(870#;o ze1y)c3GgRLfzOHcc~dUDIpBZVp&=daCoM@ltIc5DYs%gHJ_JB(4nB+GtiXT%I(Vwa z0a>7P;DA2#mk_A{X=Lc24n}Vn`|wRZcHC&{cx&@Yc>BqRX$xT3kwF7SA2eAY>?s|$ zousP`v2lfN5u;~S8?eg5$YaXtr42)r=K5HupPs zZO&ovLMF=sy~Dy60f*RPsLlDw2wRx^6@xzGiZZ`zsLTT{A%s~f)=#Y9wEcMqvyU#R zdC@s2rdVHeU4xb?EjWfP^m{EpR=KE|bX}0!PP4!CsC;em*70&62c~pVPO=b3F-|k7 zj|nQ`<|JsZ(mF&JMiScKgA0Cj--|gk&bOuZv?PmPz>rSINI>;7@7>y@d4JfNkZ@^U z7@-hCZS%UNG}57+vUkku7E=xbWvw=0;Jg~VpENTkv|BSEP7nR$JCLcQ+zuxm!0%JF z^a1!GgqHHqD+o35PynI#zm3AJ2!s>c@p~ic!hnHLDlgKB&_)yqC!R%Ua8vBA7WRFj z7hMXI$V#CAxbV(r`U_W&MY&lJNLiRa&~oJ3Mg)=t0_jX-0T)0SQKhZra|BQp7eE;! z0>}mdlneo6*VsokruuyjYC_9|dB?@%;ubSt{HeuEPIGrf((12m5H0oBoUxn_)XviSx%uM9 z>SHo6dahHx2AWIS%Ug0CZ~a7aCGhF@r_C8lggZIWcf)Bi%l-KrZ> z@Og_SX5iL3*o}(a9^-(A)dK*sqh9&?G*};<2D%-C&kS{7oq6IfJVe<(=iEp8w zI7i+Cj`PwjYz2s^J0LncVPw@MWz6VJld!;L-g3UcW!aGkq{(6+2T}^0=B+902C8~X zBvd)ql_gG9D>87%a#^fD4%j>7d9$of1l2*~Yif|)h3=?z8S>q;)GJa_n{k$Zvw^-{ z+>zO`%z)LQd7O%CNk9~#MJQ=bvIpimVettVofcys$f`++@@rZoG4Cy7wb}d1X@1w# z&(H%94~vZGUzSkdw28*HB&WLALPL889D7P1P8#THD>2NH2iI>;`+;x$+5t@{Nx+V6 zFqPt|JZ@Bv2_>ff#HS!)3~R-VdVD%(^%?yO47ffm3nPd&#?S;O#CJj0*e4E0VH1me zTphjeo1a+WKn_ho20X(ozDf7PQ=td4@N5}YOD&&03j2kOORg~B>yWV8a+=CGfw5qm^H#jxwx5y_~>HT zd0B(<(XPRgm5q!9pE#b>Ff&9boRQ014w-xqlF(vXzo+ddlTy8 zGQcfeIM&O7w6-K1aBbkMUsJ7HBJE^)z{i$XF`h7C^k%%I;fPW`{kZ*ts@*lbz-WG(uofyc_7wo6gf>Lf< zNkTrd)Z_+uL|X+|H;|gBR9ue0DdzGp=oLvunLCl8w&6QrczI+YS;4FMhMfU(r!}44K6Pgz^uP^PYezSRklvVf8S0?A)uf(>6ko<(hrGs@1k>5$r($#LyT?Bx!g~*cA8B#g z@*nbw|At zNg%-t0ba(-A?iT>SeB^YN8AWFJ1!&ua%V5cL^lmFzIA;W12;gh-|8>?(D1S)UHdgG1YA zIh+}FGq6QUZAo4X+w!&M#lz910!pe3T;mT)?c@uEEdnJIUqtZL5EhX(6<%(+9>f9s=J)Zuqt9_j5BR2h1jx8Y$=B0AC=~E|G9bohz1iw3c*s=}Y zw&ccv!m*=J6Z#dm;hPbs6(zF;uWRFQTMHng=r1$WfAf1fQBiEJa zotf5u8sQZA@?XI7GVW^rJUrjRUBe@I*7FU|{}nvHv5)W^J>`#v`1$g`;2%+U8J8#i z8UKh)J7Ht~9RG;M9o!aQk8JXfFwy%7qy_Nw;2H6G_)Go~1RQ7Jk+M-+`=|UPsMMeL zkBGwf1`4gjvlP!FJcW2>8qkXF zAMr~4pY@NhAq!(cg?Hy5ya>-mJTae!&-IU>(xiv@kNqP!+_-Z8v42Dqb^tiE|fMy)9D>I zwxnUt_@9af$aExv`y=_9hW6t(;@{`YpuAo317{*OPcS?!c z0#jr{CA&LBnEtP7oPb_-uw{LXF|wS42{%N9SJyNCAe ztJ%lyfLj~sOF){N2zSC8Os{c zjAcYs^EO>Ip9O_{HdoDaCB5t6NRVjx;{~Vt$1^0{k5FUN!Fiso_Q|> zOV8>0x2K(9posmnzJtJ-7NZ3w8PKM;(;OHGb`SLpiMeoZO()A8>%x^q@FY)SyIze= zi=9XKZudq|A3n!o3Oj%@@B>a{&-22#vvK4oKR15Z={^_5b;5eEG__nkkArDF>bct0 z(j)~sqtXQHL80Lf#Fz~c?QVV@N2TJr3UhD6bwdE=$S=S#GElI(sZUDBb>_zHSD`AQ zztdn3`0M(ff8Lky{Hoq&#N`ba1&?3q^Vjw4+qX|GIt0_(a{pq(59D{I8IR#!HT^T)&lfy!cEvE<0#SvNrlLi?FMek85Y%893dv zvZ*hUC~t4-!>#Tdhbxh9so@{^rd3Tp#X&c`OK=}fTrR)fy_gWmdmUd)oO#E;w5d-m zFn+Amb*lvhb=|eM6jXFaZo*bOk4o|E@&3OxAm8zEZKA9hHsjvki)1}4RV%uc@i=@x ze2OkxaCPE1ai-g6thyN|0NXZi5l46nUT;*h#@jMV7(sOhhu zgV6rz{qvU@M(F+DKyF`x{lco=a`aHg%Q0m?u(R%>4|ZZ4)8Hciu6i}7V;sjI{|yMM zQ(A$bk)sKp^4_O_nvth9Y`{rJ+xb_Zd6L)|muil%@j2Dit#0@Csjp8zsWb5hNJ*>f zQYf+REI9hiyD?6#>)MVhqW@z~h7=?=<->jE52~wu;QUP;q>K~l)6T2u0dym+x=+4V zEa4N66Kcg(rOKp?kEF`ia->A0D7ZyMzeH!z58{q8|04uyCy@XDnm|2)K9fMDzW+Z; zpc2CWuNJ6h(ZT{|WV|O5DgRY|OTsj#<9 z+O(aP?vs)IxPC0`+(jGe$g}c>UAP{*D)Ntjs7TKN=$7X{4bJ2JlJDdRDp(zMw9>rr00J0_5Lv$Z0XivD~_z$je_0p-N$j_0ewuh|kpfJaoMNCBusA zg(#7eeJQ=)M`DzoIiM&0T0Q7lL>0`v-$S14dP?&pSM`=5>`U(5ftMmZ6ESk^#cMO~ zEHrO9v;=?LlaJe$pUw+Kj>>g8g1A_R>R+OvL9rFE55W1Y?m3(zb}RTiy9;(7{Hc@z z=YcJ@`nrL{?Z#o}z;e(h7q@o*X9V9-cfVS)AWYIH}>`mnbQVa;^_?JTdqTM)1M zovk>*9iSsOGeO&_I-j#kV{9`44>lY7@G&KF<-Y-Hf*y7Ymr!^KnZO}Fy}EvNLK2AS1J=k!G>T)%Q--2(;cUup3)HvR-%Jd0! zjU#N8Z$RMaCr2svy7f^y79BZyH^okF#c4@#wgcVXbR^sRYaHjKX$uCN&}nNsrOX1U z9hZAatx_8A)XCoW!02c4*6#% z;LKri^wGiO0N}yyhAFajNHo^qwr1zE3G#!_BxtUu<+`VZoiF2qG|l;x=6a5}Z|ClY zU_t@%M1cb+wfG_6(VMcm-0R&#!`^Cf>*>yHHy3Vs($Ey`*$t-LT8a@{44T3aVt~;l}B(UKeI`}3GEb@jo z1&CQ-Ur_OulnhpSYe8gOjplqSf(r)UB(ZYt5RH8eTq>tS!O>AufZ673hpi3cc(1O7a`+D$x(L$u;-1NMsZc#YyZ8JUV~jWH6Etu_8dD zX73;!4F241U2~dqSB+w=Q5L7F&L@}} zn*+~sJkR0zdpx$k6Ksii4j>#g4~e5|8~h?+%&D*)rfD%f2nAd=xC|E&gSJ#OX*YC!;# z7Qk)%&(uIm_ayl@q?>Y@7bet%7a9%uZ3`2TUEG@n6IhL-)7tb8C=Zno(op^oBK3}T zDT#Zb-82wHyjYs(y$Eld2<|u6FZ}$)^H^X{g9)C&pOK;a-*A6)L4{eG5kqI%?`v9y`)`Q2@^WW^S zxqx9?kYxoUX1{6S0|A%6(QNtSE0=?VpeAvd;_9{@?TX33feVn~HA=;MigZb-dq;6S zrHiws3lCclkwBE$Ix6!NUFRr+C1mGQE7jM6*NyVq$=1eiAcfyV`V=m}alOLFs;0nP zJ6?q@t99Q#h-^r}HpTghy+d&wg4T@mW3EBcsHvyy74IG4+Ov0PjFpP#)Qb0}pPPQt zKYP6O;4sgEAhXKoTo}0!e6RNflmb|3;^Ki~T?nQWY%)ovf_(A7&C&~g30@%qF7{k6s1*TY zhf=X0Vz0u#G#z)cnU(+D-j{$!Rb*{f7BrF|J%|z&wIQIWEWI!3H6(!q5{M)~L@;U6 z9n#Y2?&$>*1q=ikn8*w|sQBq9Dk}P+;tVQk2ErmlKnTjGh{&KK69gqH15r`__tfp% zOVSC9GxN{?Kc6?xo2pxNYCCo6RNbm`Zx>>?F2@wv`?VB|1gO1+NoRY%)Lidag-=!Y zG;D_2+eB(_6-i_L+*SD09#?x8)#omQ+FK5_x3+%nTByB-+(y`4oXcHvuCS?oZWFtE z>HO`2<~ujfaE44%SY2=!tW01exYyCv(2~@&>DYCtP!y-|as)JBQWF%Qu&JHfUU|>C zyLZsPLLmrVXus{G{hE^6Pv^FA?YEu`@q(xD9KW}^ebXn`?fokCYh+K_?^x=Nyd^>O zQya8j?s~5M+QQne4cf1;jcjqC{k{{m-#1+QeS>zM=GyNxgLNqQt1tYXYrpSDbM5y% zX}{B?{k{olKfFBsEZP^+fUEH}4z2+YchG>X^iB8P_sk_FR@l1fnB)!GaSi3MqxXWx zAq)-E4q$Pmd>8!$YZF-YEP)lz!~@C?GnzA6=6^;)wp7(~$u!JTm?4{c*B5ZXYUy2{ z4bOT(u-bb6Moo8uV71L2%Rl#lFOwY86LmxGH>q=1Lkk~9cPz>M6#QS3d$e-N+%JyN z89JJAx>6rp4P6|ihw*jPV>Z+rf`{>b%_vbOFT)pYgO}1LZZAQOUmQEYC9)-$4hk5N zV(LcZz94K1TY4{?g#av1@J)PCEOXa16gFWtE?kcpa_rK={aEm0PCndFxVrai819$U zI~p+$@1S|Oe^0{!2;_$(kd1;sHnJu7;uoKXt5?(4WzH3@ub;b~-Mx`d!(m~3X#O@q z7*EqQ+|H-rc%m4diD4js;Y@;fnx^5?5JVmXF9dO$Ac$?EAg(1roEs&GCsV(R7R0%t zAPUp)KP`x(x)8*+@HD)tOCjXb@HeT!RhHJ25kPuE!^B4$ za@WD~6W=in$W|nQn|I$x`Y189bj)2@xqT$&p2%!8GI86;9_*MO)*bcdE}xfl$K_=W z!PZS*N#=j`6NZ4G%+RTrq_99c+%OI2Sx5Fd4r7Is^ie97OBgMrAU2&VY{a(+=}W!) z(GiL>hvpweKe2g3=oJVdRdp+^gN{?G!=w{hQ#Xy{X%3?o@jH$QOQ$3+nTECIIvD-^ z?iDI=A_l^drT8Wi>HDWqZo}NeR63SrX)JX|!^GBxwoPBr!Q1-{o0h6BLA92q^=X*6 zb<@e~Qkzju>Y1g+L_<5@y-vqII*$0ZVVAm{cB$VT30vQH0||JyqIqdw*^-Hk_*O}> zp~at&l~lNk6yMvaJC>>}Q2GtQ#wDZ}(vwctZNix*%1LcooSKa%2;r&h$hO?$co-Oq zVf5SVbM?m)jq16VVgMb_sWa$0hMkK` zleXm~;J4j!?+u%5OkGH;ojQXo*kde4)@e%lq5mCB_e&&ikhY;|A4ZS~y&u^8(~i1N zd(~~0E-p&khLr_=3g*}ouoY4^o!%k|Bv?;xNx@HXG$)_ll1y&O=`D%mN=|QqvaWBI zp4r0i+cD%#Y}ok*>~mPgj!7FBG*Tb~N*Dt=aD`!aAQdO0m-V7wdpw@j3kmSl(u*ad zmv+*6G6_FSLTeDLS1(H4c04h4^X-&xGHmF3(VILtXFI)F66moWRmWEwC%;MgpWd7j zNKD;wdUG;SA+OV$6Um3nPj5~LrR3kEJF}VBF)?*}!;THSin{~X8TO!JJ5e#rv%Ofk zP%*1eF)5zKP*PG^#@^d+!$KN03*dVma1#SP4SR#Vdl3`2)HhqV^sZ6-hR z;oP&84b#pl-{ma2Lo!8R-43vhSh)kNgaLH@j>OYjq~s6K3=ZJ$s z0gw_H@)f3F&TYxqoUw-{>NI*#d=X89srkitGRIsD4f$bpI~vm7Fs=RPwTj02K-zMPGC>#)%128&K1D`oE0Xez)oBE)k`ArgsjGcj- zz*8wA`op!tO~YHvSAa;U|L#x^?54yUNenW!*SA^&{f9N(4PxvnSvfVj1Fc2YED60r zE?ZBtmLrvO|2rn^;q>8_cbkA;4vKlsJY$0KiA{yOc<;~d=>=Wvao^X*h zhTi)bd+Lu_1J}$y7HY;ZY6gUgH-lVi2DvcaXlPazrlsblo!JEb^U=y!U9=r&I?l!U z`{1xUABRGhq%SE=UQ(K(pO)5pQ7#y_WSRsP5LlGA(gE|{rN&FRg1(v*w4~mF_vF59 z_;AVGc2QFY+mqfV1-+-?J1p0^!fs7E4FihQok{O6ku9l7hOq>6aSy}9R$5Zf4jR^e z_z=7#a6ziGmV#g~LjQ-U`& z6eTyL%+EdBhPkuh`-ZPE5pVibvgxEG^?iI!kIYe0@S^y^B{eAxH7RGdlLiaQ@JZ>0 zbR?pM5x$M|9yQ^dFn#@mNqPtR3m=^p=>zY>M zu|bovk?2Do+&Z2j2DGN3kdSrX>&sBkxxr`G(%V-}NGAOgle|uzW99cyOFCTJjxcs- zE57{&OaMj#8ej-;1<(^X~ zUf@o^1=xWJKqhb#a0T$w=O_m_3hW1V0dD{=0#5?>19JcuP!1FTRjB_Q;6dP3;C~7XN=_lKYhyBSHM=_PGAafDX{+&SM-s1FHZxPyk#7{B)49Pl1(y3(x@DK4R<{;C4U) z967+)pMZrxDR2ew;)l>4z!*RRwC+d!0r6^inzWm6Egi}vvnMmj%XdV=#JG6w*(VBa zq3}e2JhJzIzo7j0@Xe|WCVA;5CYf%tOKmQfr@|I+dfY^fIzXzd*Cj}NEXdp}z?`g_ zIhYji;m-p|IbAQ-le;CXfQ@Ix_=~0yVvAWm8^=b+i9w$sRUymb6rEG@tl0#nVKSz~ zALTa;`DCF+0o0|MdErU{5B>+4pVzSvwa7<(q^ttrb{%r#3oWzpl0`lZ<9s4sIzi(=ouzCD8-Y+4a=Q_CmB`PHd*TMwi9$#U zh@Uo~GpF3VjwC&lN{|=fekxHSW9m7)YM z(pKsaeizQKGSu7+39CW50gPGVka$OuDE4BcG;w^%nLb=zy#Dr}SE;`QElT6r z!?goxNe6TyX(ScsOrJ zYtUTk#Xb2+i_`2xGo8R0nmq*VE~FvpitvKuiq83AYsPRd8EhWs~TDf|^C zxel%rt`zS2bxbktKt%bW7?wxR5aL>ZE!#xK#2W}xB8#F)Cn5pD#o`f)J zx1bfW+0FQqV#JVSlLQN^s{;6@gVV%qDg|qF{LwX>|G~Nfe50Iaa4MRANmC1{DX*EF zo3ruX%+qx&As6X{_1gfRcTr4knaB_OPx$52DK`si!-?*hZqIDD)KOF6@P?L$>4<+7 z@$`d?3A_~HANB{Bw8tNa&HNh6a?!$Z_+Nmvn*uG!fvw#x0ytc}(Yv4}~`5%n( z!y3DZE1-}vcwI4T19?n;lZnnz3)(iGVIfvk#vbC#pX;|+RwKEl0_4J!m! zY%?4qJvEcrM67*@>mB)>$MRSvI9HATwCbhH9{L-KUM~#&k#@H;3aJhKF&;C5hmYW4 zl(q<=bY+Fy9E@6;4`?k-&j@slLm$!FIXY}Sp9ef)s$#^`8a|pT3!{Q`4b9DTje(!m zxT2rt0=lyJSfDj4)sef?6jtUX#E7p^mMfM?bW{%ILo+e03TTcH>OKm0&Zzqm)RrjxQDKu&z8yKx8eU9U z0;=fyLhzNIEW~_^5g&U`WmBD~JjS0$f^dbr>7MeVx>G(>S4xl91oASgt21eYK{jv= zl@{WXlBX6ID=Zvgw~v4aR}s2D3&?R)II5>Rc!!Vk%nJL*R|Gs1Tnw!t24)3k1pTPk zn4pX2F(&Bd9hv3zIe8!2d=_wTKseS1HK>+a0XB_p*H0qnpxASPTf&rU*G)8=yC>F`NIvE_~`vD)XYQWR~s74OK8s5(V)0`=;|x40~0 zGq z6Ic$;L`1;AY?^V9p%STo0Gh0P}z$H!{rZ zj3EhM9U?is%gMh6GXm}~^Gys%urh_8fPXjR<|ZD;n8z!q4cs!4(*a0t0tVpTh>Xlw za^hB$X)e!1TUHiyW0cQuLx+}?`A8!;p~m6&27DS7T!(EsCaSWs3YU+X&(l<5*(2PP zl?AGt)OUy|EAt2JVH&TEf`u|F?2ZZ-;z^O&hfvt5ZA@|kI1KCqnt?`OEwCC`2`mQ| z1NQ)RKn)N8ynqX+0_;FJFcl~Q3V=Ky2e1N0KnJJ*888$W0t^DAKz|?|=nF`IG#~{? z1{iSmEhcFPP62Je37{1?0vrYo0{ek|Kr_$?tOHg9%YcP|7bpT`fCOmUiubC4HNY~! z1rz{-fE1t|M~kO`6Tm@WJ+Ky71uO?@fKosPqyUFEqfB505CDpRK|niB-VOr9zh<~= zfE7RuFcqMF_}_j>v6_zk8-o1+;V(8k{#_o}*xlbk*7+}%em;x*(XX~&$X|303s~eY z5zpfn@+YR3{%`Mow7+w|R{h_WfQ0$szl00C#2zGfK|<9dzb$1_sj0P z{}0O_c<`YW5C7LAkN)wo$5%e_Cfw4dG)pRufOqT z<6kyxY}&MW%htEHZEt>i$Ie~v?B3I|_ucpQ{m=U!?Emn2BXPrvD&6%lC7Lk z<-B92tJ>}H{@Ujc1ZT~zslD^Isnc#REAKk~t~qn(-Tj|#|9`stf13YUBeQdIM~%+Q zA2YU~aNPK!TP75j;3uC-Z=E9Wzw7w_C;0!*ieJ~wyCCrk&qK3x0guP!A6DTF4)gjv zl};DVGeTii4x4wF-)-~yt30%aQVumzo)G~ynI(r2Cc0u=Qz*RdGOP*vU~LJ=05M*4 z>-u3m7D5wTDHIjOHNjm5NUsp?TP{aA0L8VzT^kCYIXatm1F~o>9P(q^V`lMehr>%- z61Iwf7+zdqo8@rNaIo=#D!xGj`fMzsr`sxKj&j*%gvhZd$2D`DCpH$lKyHuS5pY&J z%G}swn1!9z;Zyy-im4rfhgZ-hEzwav;AshYZI#$#7@f_qLE#Hb(qZ3|*o?idfX5qk z%L2BUjy&+ZIKpyP1B;45xFA)wo{=w20xL;gbd8U>HkB3d{;ny8eixd%B|IPKap{ zPHE3Z=SRe$i_%BaQg9B!hNAr<4W&2YJ|`4L@nT$bnUtmt4}17IJ$9Hj?Yg)gfc#R_ zGSE|dABDR(!Y@g3{i zKBoJ4V`2C4PZxC`?<$Usrvq_AwXTIfDr_~v@Ef0TuV3un{{OdsOJ^2~414P{9X{(Uoz;3vR<5-uYf`@7 z(-j> zabt@*z;i9mvSdxN3_>|JmvvHfj8#D?Cni`%yFAko86AhZL?;st0(gExsxJ~O6C5*~ ze$0fqH35g)59>M}eQQ=J+7JojtxYhpz=bR$=;!s^mDV7I-dxE|S$2eQHql+}WZ{zb91+!G1+o+%$N3$OH&(G(c1WUeO%*Gn& zF0iqTT4+eLlwgr0E|9FWTIwtp(QBygBxACQmXB7Yf<_TPMRo>iNvM4u7t*1}wkKG| zIc8g%DFndrvDAv(g&rQlX!NQwL_@;R$<*fUEI5sX{3>1pn;y5&LE3@SAvmVa>aA$;6QYp$C#N~lYbWCS(5Q$& z__#itDkSRh($dhtESW6rjJ)|JT3U)c5qasLmikf1w3NnWM z{y=S30IFqr5P5Nyvo{6a<)cStgp_hD^P*#rhQ#ARW}zn!Ygo)f)rwZ15y?lQs9MFU z)x29sQHxR)lLqB%3HMS&$Ann`CKhmRmw3E6uxXj#@kHw)fsS`nByp&xi2sL}g{)Al z;?yH@mg4p!jwCc*NTU_^Qu}I)B>6k83hcpo82jbjVf!-4yH=I434RP2L z>5c($Y8jm>rj{{cLZyz6Q_I-Yv9;Wt7@SoG?MA1AWiF4$%i4tAfl%|Q`X5+JOhVaw zErEWT;HY$$v=7L%E$->s`ug&lLq7|NCJ9;1@F}=1YqXaeUy;XO=9xeROuN z*Xi=i2s*^AfasK(tkTIUVTS=yNM4bOHVpg-vrdsgHv4hiN{{W43h?d{R4;o`&=HnF zMGl{z7C@NwMO998yscboKn$YBbL?10L9pq9*6Ti>kiH+3gg*Lp&=GW$&Gz_avYwnv zVT~htI%>vf6(rK|>Y=d^l{bWzh%qs#W7S?<5@b@OiJb{!gfVO6q%7ZzAlVWK+?|Ap zEs7zL=@Z z9&ls5H{4N!U7x0e$g&!<1~<~HO+;96ExNv%_Jgwgqpb--tY8XZ6;xj6$&L&oC$qhf4l=pvkO#Xg(ke<# z{LW&`mO!k?b;Iz)YO(kLiGo#Rf)4=W{3-$qGUHDln`D^Qh~0oO$LY?!FBVMztqg{0-lh6Od7krd`tiAQ80 za|*pgH1u!*x@43QYM;k93Os`b6Gu(#R*m?6TJl%I-sK`h6PjDGulNOH?I&Q%4a4r0 zS6~kjAfxW0%khIm5`-bV4p`e4et^PS014=@{AVlsK{pXS!mL0W{B;PI_CY+-5$cdm z^fw{jwMcUqbTZH{!+jInc#w1m_jW_O68S~v(eYl4lb|l-mxl5Z%a>7o;$YWa*!KWa z0T-|)+5I>dS5E(53xD?s<;(mf9c4dqde zdl^9K=ziJN3G7P9%vit!ECt>KjspEoGL{d_2A%@m2L28VZi6i-U;`EatAH)QK_KO8 z*h>Lszytgd*aDmcuKNb>vI4gOvw>y6tH38f&u?KP1&jw~1CIjDz)?VQ3SR>ODuCs{ z2Hrfs;W0)7XCp%7J>|Szsq{7P$5d+78%(MZlB5R^TXbaXak0 z0Qxr3bYLE^9M}S!1TOmywpqYTU?K1n@CI-QI0dAAkN1Ot8sIUY5jYN9^#km6ftP@j zz%^&_4lFPaco}E`F8&d10bT%FfTW*bGX~rO%mE$&-U3>IE3t!Y1suQ%pb?ih>&q^On&`*U*_G@nb~WqIu3^`*>zI@cU;|kO8-!=> z>)8#k)VL8ga5uwtZW!J+7{O#rj<*?np=&Nefcal8$7GUJE(WT)^9HC{O)FTu=ZKN z>R}ahPscO7;k0U_C3RK>Ez>+cnka-PUo73@K6~)ZNuC1RH&L5K;(8xTSlRh#u#iR$ zSV+M9604f%y--@cmy>&R>Xr766>54Ws$A6@C zv9x4#9-kZIg8^@lmPQU+b=)e(B@pU0!4a_0o}chQ5tgP1tA#DS4x1*_<8uBmgWeN1 zWW$?J)Vb08i4!dp-QA9VhfL%hcRERUL#G1RK@5u;Z+&d|1<2I}B?wDNXXd@DpX%Z43{FxOz8UmV)w)C&h7V8+W55E@gNJF|s!oPX@wd-FFI+;i06G z>`=OHK2det-tXLKPSt7et215b)x55Y6ZB@xwo+VHbQ-B~sl+}&*ZBiJC}!*`bt$C6 zAU$7v_mX!3BNS>H_C`M1Pwu)ZL{s9!TQ%L%ba}uVml@}0YKgBl+ZL#(>bg*Ro-Lm3 z?3SkEnM`LXm?UiO#;auxU$Y2%Zi0pvD^rw}!nV4en-ZbFbF+O!_>-m zzb!dQ1BD38;v3#{t`v`VmaNID4rEwLhZss6&v(;aroS5|aQ5eU zTy{)^@tPlfCK7d05R!?=My{3jUz{Zj??G$Uj_8Hs zUW+Xl@RT{+^vY)k;ljMZEkP_Gw}opS=V3Rj4kw0HyWQb+z%IjG;eVmR!W|3n?K^Rdsy@DM&=8jqPDMnN2q0d@`o?3;|@K~~Zkhx$!9jLN) zF-4CQ)L4i}l&|x23+GKJNmsKnXLX1s-rURMt8F!9IDM-K^4COpr(nbjMon>+f8jJ3 z^<{pTi961dB-A=8rWO)0;~z=nro~t*n=pk-?3H=q^CsU?^0|_h^Xz zA7n}?*;(*{DB*>21_j2XyKweIr}Wd3H#Cg8={KmpaO(nO7Z>44ywMlKjSlot;&R@k zLA*nIp(SxUx_I5qH}%f5&=Y1ZL2S#ShEil|g&iCpG#A7$NLd!A?$Gvl4Tk=UM|vJM ziK))dp%5kQxCU^}9eOdKtePJRW0U&deobwp6C8Xy2=h6<@mL096;Fi~?@wE;EIKay zZJ$uwxTDrLU%ql<4%zER(*^J_ROX}&V=I6E0OsJ>xfk9=s1rU@M7KZtqMiFI04kS2 z?_`jh45R}+fL_2wz$L)N0KGGi5^^bw?x`viN8bVx<0xNBOKxv~@+Ia_*sp*-AyD`L zfWp-P-DidFvqSeqa4F4%P&<30UT7e_LVc;OJAJ_-90K0&#z({0u%r_fDupuLxDj+ ze;^HL-+(p(hXJDB2e%nm53B-~19gB4ume+pJU|Mh0mNsq-sJyRUe?PJc>ZFZ|Li^0 zvtwP`uZonh_-*ieH~6^+ZA95?`$po#I{fQhNtc&UmbA<3UtgF1M2=m*d@R(a>$gY$ z6Se*Kl-Z>Sgyg?V5s?0S>hmAU_5X8GSavzy0ZmL!S%n2q`GVR7143+k=C6VW@5S+J z{^N&XeZiP@ULAK=gMQOf2cDAh*v|jv|0IN2L+&dVNS_s=e--q5o;>p8RqXR8Tc5nG zQvu=p=RLtw+=2z$EeCEtAZ29-?l_?6O#j~gLx*8|BA+Lue6fm2E(Bsm;=7pQ{cv~) zZP3Ma_*DM+aChiB1^R`c?+T>bNvHpIr!Y^6~)CkbfXN$WK$a1K1LgF7E>qThkLa&^aK#m(U)s3gO2MDJ@$IXBry~CoU+&s{_2&1+S*2}{z2d!j z^$TzP(P?d&_T%8suln8iE05P(fBoPG4`g53W9f}AJ!buGb=lA*j`~|ODHyZ!v znLX$7udCVop4GGM@V&?C-X8tNA692I-ZOLJ4f>^LyocwEZ2b6lhravc569;{e@pfg zM`wMu>zf-#ES!IR&Janz=i6VDeD>DX?{khnyYJgG$3Gc!=L36k9lN&Qcj+@PuDtTI zr$+U1^h*oQUlg46c3xrW$Rp4GL2pp6|I?Snh0lII&GgnZL&IbDPdPX3nYJgSO(jp? ztF`U@v0+NX{=w6heD~3e=O1YQ_J)m5Hc$Jw&Ry{KBM(V`n>e9->);^T%ih`b4*iND zt{*JFHue1ADKGtNw@k4c{yKi?L+(EHf46LTZ>ZzSPfPo~w)bmGOYe+@qpu#l=B;PH zvRI#a)#-Yv$6vIIj$4$b#*ue^{y)n%zW+DN<{y9DZCm)O*}MMxh-E~QIwin}h_l~FRg z{@i`@P4|7DdF7oIgR|vLYm5Vy?A0w8{m^>$;|GR=i%V0ke!2CtMb9J|wk^yZdGV_c z2els!&s6@p|GOCwo{!Ma$>@>d3G| zkMDlBIr-yf_S54IU3HS2@c5`>vanx>{pJ6^gac43xDxm?G;~NEzr{Z>JQ04dzEe0o zOXMN0RF=S|KzSVz5-=mSR`E?wSFNUHYP>SRq{%_vQUW`Sn8W|iiB&9|BXT8(y<_D|ZQ z+9cf|U7_xN-BY^Pb-Q#2bl>WF=&#jZuh;AE)Ze4OSO0*1rGBlxN&l(-OZ_Q*Qf6AF zG_xSno_Sa1Z!=eAzMi=+^H}DY%xerc7{(i_42ulQ4KEmW8a_09V@Nh$V{{p38|N7t zj1L%}Gk#$F%J`FUkV$Q-F!@Z2Ob?nGO)aJ)rgNr?%u@69<_7bF<|ob1nqM}rH-BP2 zWA0(ez}rI_%P32UWtyeJ;|sBvv$39gLbR-fc6vZ z_u34dT9>E0O;@d32cEyL`&##%?wqcdK1)ANU!h;Fe_8*d{^raHnRjG*GZ$n&mib!d zEe5;ce#3toJ~6Z!+6?7JhtX}EYg}o3+W5S2lQF|I!BlFRVS3T@rfHMuOOw<*)T}gH z%(>=U%#+RK=1Q~2e3yB?d5QV==10s=m|p~kH<+8vUzpFC2U{GLnU)7Ek650tyk^;B z`8)9z3dIQCdSv&@9);W;lns&VPGc8^$GR2>Rym{i)Mr7h~^7TU+t~vkD#_u zyG{GG_7dFJI6SfbUo8&H8+OseYOMzw{sJkLug>36Sw!hK~)O8;*n5 zrw!AMRmO$JHO6*hvgtBYx=C*`n<^o}cbVp!eq*{1Tu(F~G#@daHTSc)$$*&c0}I<_ zSIdXURglLVaIIE8Uw*Ir5%~-9rHY5p=1(zZPb-3BDf7Gwmf1$r9^Ty2Ond>lGHyYkDyo=HKnc?q-G~-o9 zsWIC)##n(-I@h?!_^|OW#vhHhn0}3xy<_TcwnI+tvOH&j(KDlmlmQrN1+sf&m!U;7 zGu2g5&J)--wZoBR$U9$cX zeLwwR{mpv0e!u=>{YibV%mJAItwGxjtYO(mw=pi`<$E|b^vuxX>|V`!CD z(+N|X>6EG6bQXr)W6VY75_73}s(G{d9doPsr1_M&9X)o9WwfOhdS#(yvE^Q9m*tif zmPai|Ehj8(mQ$8?8Vlu&fAv0Dbp`q)Q&physTQgpRIOIMq1vT7q-ukf=&Qb7ty7Ot zSE$#hb2XQ1e-F(%79(4(H|bx|??Js^$$TTzWuZ;v8f2L)yF_-WtgkFxcCBonYzQ=% zLZ$(4vt+rlv9j^9iLzT|WwHuct#Xg@a#c{T$qX9jW2_gNZbAzJ7|ZqM#pZj>%gnEv z|7!lxoNP(4q*)}EzLs=Le~Z*|hsA3NSZXYDET3Awq&CzE``Ib7-n`WQG86RW!?KmK zRkGExHL|s`b+YxcM%hL3G`U3HSDr3!QEXR@QJW!UXEgh@UfnERKm9f6gYEi5`t;04 zGJkJ)$dG5e5!z_i91BQrKJHFTYJ)rJkjJM!i@4f%;?hC+eeW`aTTAk2TBp z$@fFU^jAm~gA_)ERj~_m&%w+inI|$&WuDDUHl!K)8u}Xs8HO5E2BRUzP+%xAOoiTb z83G2K(P*?9ON~>F*h6KzkRQ_~Yf~V95^Y~?y0$-b_#o{N?NF^utJ3PA$*s`kdC=xX z(C4M7X}Q*}tNEs*N{+JoA|knC3N32mG9l(t=a7B3zo>r!-SI*G2YE?w7OC&fHGL^o6?)2Vbi zol$4i<*VeYv4U6&-Mt>#yGg!P-YnlGZ;`Ku z1|FhZrd+OErChCCqgu~WC2E&?^W{o)6GlBl&s#O+nmL*}&7+!?nnq2N1{KCvveGfXFj;@BZt|1` z&>tnrQsq=-xzdiA*@ZbEpsZ2OQPwFJDi^GCuZ4D9pV^q% zl({vtIdfNL3uLn$QppU-h7?Gq1hSb9=^O&-ltDgqkWedRG!If*WbhhR7#=mOG=L+& fT)%MO7Y_WwfnPZA3kQDTz%Ly5g#-UfIq-h~^9^vx literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/x64/v0.10.0/nodetime_native.node b/node_modules/nodetime/compiled/win32/x64/v0.10.0/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..64669ce97b435eb8f927e0ce2399979da2715f9f GIT binary patch literal 78336 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 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/x64/v0.10.1/nodetime_native.node b/node_modules/nodetime/compiled/win32/x64/v0.10.1/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..f0a243f10cd4e70c58740455943f113906de8af2 GIT binary patch literal 78336 zcmeFadwf*I`9Hp!-6fkFXAu^{O%@4?Ml?2B6Bp_p*ez#eSD=cb0;0i)^_Ie}K;@En z63u2jl~!AAYb&)@t+myDw2-ZJwD8-n_m_~u+s%kzo0#87b)|)3Zo0?_rYDY?Op~a= z60_-b>S%%4l$S;c@jvulNnLI-nMNhjzR!29$+VUh_B;MA3Eix z{J8+lC5so{7P<}P?m$K@{ukr_X|w79x?CcPnU;-5ejWxg1mBr7px!?ZTDYV{6y#&X zSWTFAlk1Ffo=X-lSzLrHJ|~zPKJ6Est=t{=+>e5D33kktX#l=2KBL?er2fCZv&=w# ztrC&#O2izI9SyCmtqMy)L}62qhIBT?fp3Sx>L`=)HQR^pnoKAo5)j`h;-ZY_Iz>I? zQrNz(`jpW0K#|;|L{{YFU87~z$wu?CQ2{OMPbgn3jVb5QC~DM>j6fu9`O&U=b0|&G zruXRAI?;tTwMSv7tEih?w=|&QB2+{{DrVDjsR(NjnF6*re7E(52hdDVDq2G63NvpY zv@jf~G9f-1KAy`&`Q&)waWNiLOO~bfzsLAKeCI!o?>_8~GspKLDkjG_or;`ge33!D zivf5N>y=!eAtJU^Kaw%v+My{Xj=P3Tf9D#?R_UejNi+4#h2J0 zDDsOXo}pR&ve7~-z09d-&i#8Z4QsHz*+^9)gO(qadl&fL!DmbWs=RJ#hPFT0h=d3{RL{K*A<6DntU`bJx&b#lLie(Qg0 z-@&&e27fUin+V7Pn(f`)m;?UT2j3MwA7)H<_VUi&DY^NavrLKY6SRPaG<;!gsE$DY zi>dVKlY<3I!l$q;hVvJ%oL=fQbZ(6d>Ni}>kF{SyWLE$9Y3R@znbi+HT9wEwPDcoL z=nwOIdc5y)p?rS;P``ivchI9L*`Q0={c)B0>m5IB6imTufA2R13QJRr@y{cXN^|_* zw~NnhFU{+Z{|QPcQk6(3$0c7+M9#}TQrHoqb9X6`xu8>#dvXeh+If_s&4pYLbO=6rywT z+y=wB8=&)&AkN$M@l=pC_AMgDmG}fMrit;1Wkvkh&iHs~M9KO3ZhGB<@_pbx8@>Lc zMDU(Yuh*brlAb+CMb1Rn1pP|Pa)RF^)^~~v>+I@X=g1)J0SrB{MyJX#<*wCZFl!+8AFcq^>UaONcQ#)vL=iv~VJ zqlWWsQL@{sO&<_oSRIUAVZqgkHv3D%+3^BF2e9r(v50SPMeVAK6a1I$<~j3_6F>zF zEWm1slD>AzFpLKGyuB;lQ<#_|w0MD%->NTyj-r%pq8Yt){=BdIqKBZL9tcB(%PzzD z9QCa^wXO6O$eAgy`yU)40DhQfBi(TRDjo#j4#T-38H-p9XE85N!ma0)e%+xzEU|hB zJs#mbDr~>uyp&gVX2&~SBswibD##tp*D3_n2OTDb^{kq%u<1z3MN)ZfXfh?Qc2HX- zSVw4f3d@dJ6?O}V?2aaH4(Vtnz(+YKv>?E?V#e}!=?{Hth{eAvk%e`M2gR6POvWMu zFkXs*RbfoG&QFd?iCmxKn0?(1GDqAxAg+%7fVi&>P9QFjV;@lO5yN=_n#k|+vK}D) zFa8O@l*pSoq&x;9&*gNWULf*vPCNg8JqJ__@+W(jbK7tJLX9>DScl>KCBi;xMyF=3 zMs-MN3H*@RyMEScI76ZWCd_aaAdEzXwUZ3(JBa_E;s2NTk3HkVp7CMN_$0%5KGo8K z>j{Hz=Pl5t!QKJGPZxQ6DeuQTJo^Q)Lx9uB|L8dak;+3RKzs|uwO|vKADV2do98u( zyvHc-I1kT$Qq&bovMSk@*nP#K{4-RZx6AvH(EKZgbGZO!Bgd450?LEfNjv)Nto!Af zRLrO0EJsVS(dcu3BR$%NEu*k`j~I=zyIXqnmxu0m#UQpVh>Kr~IAS-{CnXEP zQaFDoQJC#xM;xEMIg1oFJinGUsRC{|lRoCq#{xEekFf6Nye}Q;l6mpFPi%Hvgfudbc(y*84;q|J=1Op^b2O_tW7|tS!YFQydPR%xtqbztpGp*fB zlAGu7g@crMY%SJ~!xKlnW1<(Lu-niI;g9r-G8!ePpi!g&ua@+~t2dE|X(POvZinF^ zY|XEY0bN?rI5mfbwyn9$jGa`^Q)s$~LLZ`f$OmpXK(CRvfzKx`Vb-0fplDgN-wfyC zL`#NqM!b@XS1L@#BB_RR90!Dtu}PpNM@Wv3o?d=+G~U`w!&&wWCf=KKy_aUDSo*RB zE4Wap-WHdQyjZCPO7}v1)O~LGN|7$wqEzf!ZvRS}ll4WTfPR7D{C&JZ0n=ZSF=A_v zQH;wlNw${QADn*zh=nL(IKTKKwf88OR5)`FAhO0pD+v*i@JqoG8qRl7uA(-~*;j$# zyc(6G5fo$Py!2O+!+9NnR+AV6hE#yeCr~Cn!bymdK!lt;1fLec%OTCvSo8Xg)rzrh zK@O_cQf@&ax1MH#a_jNGnbr}|{1Wqtg`pS*_Irv^P@$Qq;CaO0X%qDMqtV)DU#GA` z+;XKkrxV6%K^Np=P&vanl~2v=2^?#F#3Rm;o2l&}=v}s8{X;381+#@P9bnKKPyB(( zI3GQ&xuZNe-rSd>O#7zOnrou;{>{BCif%jEAG*KvZEme7^UKqlTXtr1^F+~qboFoU zhQ7_s5@oJAy}1j|Y;K?^y5qFwQu{WS!mDLtPVDg(#oX-&3Y<3Bjg+K07aZ#kT{TaR z&)sXHOl!kwbH~nXu7r}*O%rTHkb}QRLm-eTMqABrAg;a+M3Y-N^IP=W1(BT)9gaY2bef%WCg?Ah5pqP# z(R*>s&`a-J$QgzlwqIe#kgZ>f?5+lL$WGkxEl?hXHE}xyKzH3rNSoAs^!rdYppD*( zDGfwM_El4o^d<(Gf2;mZ25s2TU<#)pOwfNuT&_TXK1AxKPfh zr42s^1n?CUh}i1z31ELt>xW%CM}L`w2`y_-6(x+WLbm>E64^E9Dqa+9L2t$IkuZ82 zeR19~7pXr72(7KXI;o$vtH;gZmHJI%IAKZ6uZ_~7gMP#z;`&p_h(-05bBRnX{T=ma zn{WwwY#7bMms9Uchf?X~sruVcf@53tS4L5M*%Je`R_PgGD7$1KcfEcRF9{GZ_qD6ctdlF$y9>@ne=gk&;%p?DwPlAtJ}u19-w;8 zr+!OWTd_1lA?KfmdWLh)lOT~6MTP1R8>$}%N<}+BO4Q?)a4JUgOIUZr%5h^o^yVaA zCyQ7%x0vPmStr{cU?1|57^YO{JUJW#qG={^9djSD5w!UMmh}>lI|#WYRW^2FnOy+K z8DNcUH$-vWkG@4BulzVFC-aVBiC7Qiswd3hD=^8IAuoRy)q5X#$%qw=1lVYqcXS|> zk;ssZ-4zD_$O%jM%4Dm1As=?Pk8ByYgB>GvGc*c9-GKN8bR>!yZK7w^1SzGKwu?vD z=3wQU2|Uk(4X@AKkf7m$_D!4a2w|R0pUNR@B0Y7x*lv(f3izIjz5sx+?>LWurc{Yh z1Min(3JvF&Flh4aC}aw!i*hgVZMqg28>lNTGi*T&st3UiB1ZI7Z*UOq*`TbXSH%6VD+xGi#bn|EBTH>1uQ zvDuJ_BP$!pjrp~H*5*zR4K!*Mwcerj3|)K#W<}*G#ey7fEjOUket{M1o`muvUoX$b z63@hb#Z)|R#k7zWr##1l6n0Esi!GbqmDs>vV9eUJ7X7{pFaV=gkvjFT9qR9=m+qD@R21+x3*5Qv)qIP=fc;WnA=(f@TmO)}_1#Sjz>XcNz& zg4F=UR2;b?>s&LG;&%+^Ill&>)>h3S5Z-3e8H-qz9%^!ud!*6Eo06T%XVazBeIp`ExfbJA0H|Sj6}0dE?LCZZ@@x z>Q+?uvppDwzA}f8Uxo-2Pq|y9kOH;lPw1xF0RsXRz2-d7w7+0tP6xLRl)d%z#FzUf ziedehl4_0;y>{9lVZwGmNHrV7GeR@iyIgjy%8)DV#fAByK}NlwhTf1;cKj%&bn&Oe zmpq=z*K_hyfP{m`(o{g{qFw9(4<735A~k8)HXb*j0WbepGh2wD8>mI;1# zH%RT00zdm$o+r=cyqfS_pzSr7J>W=an25UhWQIqplPj^z=J1djLJs{Nkh>a#LbsD* z3~7bvR+bHu)j;Q|S8^L}08%o`Dj92rp~-Oe{EAQZFnutsD{F@wj}+Fdzkxo8dC)m7 z(J#&R=~|Q^n`%m<46{_PNncTy+kup}JybyQ@xw<5*P-is844$wB&0CN;`{Z_K`<58 zsc4E>Uxyh`BGaIFk&L0;V8*&*)9cRyfW~PK^hf73NrDPsgbY)0d-O@bSdmOsZZ`Lp|SegC|SDNVS=vCZiJw;RiBBJ7(##{G8NzGp1MRM zw>Dr{ho9l&j#i+U-~(bbnr%07lCoDZvXioxOj7K3$X@Dge71f=&61VOOw*~)K=nRC zSRdFm8|fj*e!jqFNcOYuoA2yr1EeRDc1^Z^7y+(4V{z~LC5^?FKAuRn?L-c~Abr@h zsoAjsiaHK-ukYM(9X~D$$g|}ei1P*55&Z;2$2CBr2Glp4S!feRI>i6RFb%sUJMuE;iy?lgvhkOT6{A@eqJsw9s z8Bl*JGA%sw18PxsV=VC{_w-}?E_puf#00;IfsZQ?CThFejb=;|-&=j{ATC-=^;pN! z6&pbs09gz60uVmS2C7R|1(%)+&8r3k&!pEuEfHJwNxnK+9iz>d#3tI3^ByCJI%&`s z7uv2wZ9>(pdJq*c+^pE&^y2eOrX~|k7fkvs$smkcv2%1V50n1mWTFsg`tKjmgkunS z85v({MdFvv+ z4lnbyv)P+iur{CtI}E4$7errS(g4NG_Ol0Fpq4O02H1Q4$Srn%Zc3U4~a4>sCo7{Y4QIeI5Pxu3zom($ zPpXU{Z&j#lrKxDiy&d5RiaPmu5MER0Tu4BFKuFKKkT2@M4IF3KHk{KSnN7C}8HTsD zL%(JMZ5fDq>^f_pCFNkjbw6!@m5(!Q7@7T_Jb=uEJptT%l+)>`cbkY8R(6Grk_kH0l+#&fy-mBs=yg ztH)%pK$8QAJb>NPlo_*lS(N5YVIR1!TryiRpz+e#`9U`IC}wDJp_sKLm-#9VhiqPV zZs;-!xbHq0nxMK(;o&5kF4KN&{-;^Sa1<|QHfU**jkW~ni~q&3k5=4+701NhjqfE2 z@yJ`n?&N$DGKw+&u}8tlTU+Vum-r^jntuYza?A*28P1Oxf>{A1aIP5r{a9YM4~-T4 zL9_jnYlmfPF-_`i4pWm1@d;b4tQnsaYAg%kYieUzH+_LQ%(M_CEvrUe4U{gE-h{2U zMqw(YbQDy*@VW}3G!w*p9Q{h zeKBH*rE(c1{{S7z{f^Z1etc2T4*h4GYmr78wrh$*PfHaAIRggKlgcl|MA1ZZTd|91 zB=Z-LG-A^iK?Z`!RS~h9MQo0U1w?F-i2X>!N<=JA#FmNJc|68SF>NAYkVsfd37YNT zQ}}W>qq}3^$s1{nU>g~WNyRELS|w7=@~G;lP9rTm40RqfV?m%p_k;$jSDV6+Qg-O;Q6j#oYta@F^@Ute zm>bs?8+z?CEb9+F0)cagMdP4qJQjy#J%Us$F)@ngXtmJB6U3V0f?8r-u;zLmSPf|S z0??YD@#WoGNh+C-+J$(l^sy|o&^&OdDSxlCu9g^LL!p%t!8xJ|+fB^LhY=U2ZSO59w>MM|a z>YQ|KI%wRc|LfAk*uxhU+CGCs{lIyI^uNYHz1lMZfYCdUF0&H=;-u_88Aj!}o6p&S z_|7>X1rWk0hXINa0npY9z@@|z0mW?s3dk=KhvJWMDEu6XuK~qT*?lzp_J4pPAuD6o zX<7e*(q}kdc^IR`nhpoIejF)WXnHoDXeG9vK&3b?vVHn`tUDcV-i>0QKQ(q>OY{R$ zo#NqLFqS3y((gS^ONv!$*MG&g;#U2Gfz;7f{l2d$YpdSHM~rj_Pv<>G>yX$A8GXsb zGYB&{D?oj!*(t`(M9pa5nq-$r&{FW` zkN%EmS!NpvvUB5N~KaBhTj8q;ZG<#M?fOf$Qm zoa191Y`>Qs}Ml4rVDu{Sq5~1rGS!rxus!chR;kObw^R z{!IzDDhvedlX7aTT@O$u&bweP%PQq9ZxK0&FXHhHhzHzXhiw739(pstzNTfGpos6h zWS`^$5v*zmxWl-g?*|vcu(ms-#~k%5fYdJCYErh3E=H5|kAT33f}vx$_~I!{#8a{j?br zW5fw+36!Lbb6%WENAD&sAF;VWH5HpF19-eGlGO!r0bOc|4@RssMZKomC~lf!n9{wG z#TJAvHKjLBxr}1dyp@ZmLKOLsDya1^++WizngI)3yqRUajErJ$VJPQzsr+)FkOJWo z%o!*G>$WLS708Tv<*cRqA$PYzrvb%S$sEiF@qrXI4 zW~V9+tXkn$C*>HSMf7zlber7eGnqp-)0aIw(9be+4Cj4ie9!xoqA!6@ZK%3otwaOf ztbRI1sq3*RcORakST3&fGiwgC7?WJ(!zhA|N*^@L0$v;LU07PfmuWQljm>^_liht{ zMY)gt+s{5w*yIN}e3RTpXpo{#a-RyNmj>MS(kS*9%yQlwqtWZOmvy&SLpU%-wy1UA z097R~wAsgFB%h0dF?jaKeC*;QVaJ3+deGEf=_fZJ65qdzLI(a-$iq2o2 zzkpgEJq?r)asWiCk+f}I2SAf1gF)b&Y^(kgh=)L?a&m1d(h-y#Vz4M?f4z;yl4a+#d)K62}xU zR;defTzzbzIzbQGmGuLFtRIW<=EfszisIrJIPqEJv|c;UJvj@4>gYs)D4tv&}Cp}RMO_1raLfOE!z&fW^St?T%qe)tq zPdVH5e@)=XI{5Sg$n}(Wg+^8!4*%U#ddd|VfX}q>pQw?v#%YErW>Ji-`CXVMsr+L= zQR;SuY^CnBunkpXM|k>Hqz6IfVGWp+L*U8A0KO3UEio!))RnsDhS0`&;UAW736HMm zBA=b9=F)=m&BM?@KiBA53vknVL}=xjn9G65WR_(L-YgdI`1bs z1ZgxBn_tbzLCFDx@O{@D!Y?_(Bn?%B|B$xhepo>Li@@0k_5YSbXgxWELuzpr0F9aL zZL}3TbgzCLymZA+gqPTZ129j>kKjp$-4{d{jfM$jDH_*|X^eqU-EZDL%3)pVL2`G;Y0B6NxGW;0MpFK!t1D^=9zEu8K!d=!5 zM&=3)0U=32Xk54}89Ee*kcUWaJALOVJ5O-8NqDT9!P${CfzrW_&qK3Hk&cnfB9@lH zN7hLrlX(lgI#uH)z5EvN_6dB_4CiM*=i5Gml%G3w!|=1CPz?>|UZj%+4;hHHASMJq z4D}v5#|zQ1;0o|ul0W7)a9Wojt@(dJU2XEk_&U3+i789ivwP)TZFGjHXZ=3)U{k^J zb31K*3l1XlAa4M7dX}T>h;1xZhlYP4&JU0>X~2>ZAUhdIr4y7qxyFjpq_egox0;g> zZbD7?MtsN*vHwhsspEGO)4@1lViodvTsDf+bQhF3oThbsK{5~!nUqJV{86gI)~w|# zyrr-ZHcaiIT8hDjMMBJ>MBLrH#EN{2pJ8jmLh%#S4B(Cocgyx6;#YfY;jBQ!Z`-G$sD#5!ys`-VSjs(T8_L%U+QwJU8?9pXhR;QGIcF|;n)!V-6=gv+3{M$SA14h z2=iqvdxLCnVW~-_Z^)M70IRGJ(q3&Mxr~xg+Ei8u<9cm4QNH7tPp2O$+QYe zD=sV4`lLZvG{t^WR`^(-Gzh__*pJEzVXaKog;mECyQr-2Un#w5XvY*AT2}Zv(pb|5 z0z&fEM>w?Xae|r4$uQGJ_()>uG*QfNMT!#P^Ag6gH1X1ntej#OCyHcGW?=Ijz7?8Z6 z1*7->8(7i38=-cD1RdtXX;sH-KysX~MY6^ZpmR3tFNpC#)!ER^6z%042V`{!^PM)T zXj?<|=~TF)16x9d8^Kp>ADJm_`ab~#23*474CU{VtI6d}|HoK>1runAqWOT+L15Kf zar!?K@*p3@U-*WhGe?|@V3+FeUWQ(<9j~MrEI_|>9Es5{5VkIa<^-Uj!|(;afuJKu zf&lakI12m*HDhp-sIU{fkqXgrBF3>^$jbA@R%csd5H+b@nmX?Dah=n^hQ&b<|OeX`@mkMf7X697l~X8mar zPn{28Wj9b7*%?46VE=sqNeSC%e|nJzYYT|c!&XuP_CcNj{V<$2a^!$tJOn>71JQJi z4Pc@c1mF+r0x|LKX9U?fL{FRtJ>$Wefb7vdqI8|+o^t@B9(6jY9J80oj!u}F-QH} z61q{d_=ZsIet6&KM(j%c)kJyBh~Uv!C$ zilyYY1hm_5By(|2%!S^LlKq=y9mW?wI-`La&UGQ$pgPVB&D>w;BtQ*9HcXebphYi- zO5F;9$qt;o9$Lg2^@Ke%NIj7e0;*XdoPt+Qh+Q0DbnOHVZip%B^At9rWO%Tbts`32 z^e}zWEW~VH;<1!j$g=JNVP-pNPcYkU2wR%nJ6B$$6m3x~;5ZMjMFp&Sv)yFW6SlCd z0u+kv)_?XHIC{jI1IWn5YD1dIv=K{Savuz5vENW%Y=>;T6SJ|c_;MeFaTp+{0c5En z8w(VOaCqGZrHV8}y%7#&^jp4b=7ReJ#uA`bULO-g+|J-***IDcuohYUxJT|XSp#fm zXt2yY_F&OWYj=CVvJ-ktVBAiBQNuNCh(lph9Zaz+mg)8`*&>B9ac$P3c62IF1uV^h z{4K;DLE~-q?#cI4Xc3=Vv?h2!QL$#(~MF|Ml^YB){B!%3o74{E$?zXOY-SJY&4QLN z4Q{*+gbNYAG#(y{@Gy~_Ufvb1fq-eosT4j>@y~Dh=Slu~f`1<8pU3!T56(kz7b|Xk zQ4c}zvVGJ+WD3L)lB&$~0Q)MyqWYtsg1sG33P%@lMXg7wcn2ecvEViEZNvFi2_k&E zNac^yR?(bQ$l!{4;m;5tapmWH4?%U`ODURj4ll7CoNXW)HJlDgCe?nu$af|4yKt;v zI6HYK$bVAgca&0js{aAcZ%gDaMLs`rwY`H3qH^b#P%Wz(QQ}T zGZdiHsox*~kGm(SHu&%D;EJJn9JC=+1%9oR!#WM8m3P&lK&P5S9bIX>OJ5gpE-mxZ zERqHbIIoelS>K=)+1P_3sa-hRG=~RB8xA{T9<(`#_qHQ+x#9c=L5MOJ5=kam4;E9{ zD^C$PJ3@nTzad`04$VZAVOcH6Hk?c1ISwz|7G#Y$Oyxy{n;$7D;6PXJ;k0^Y{5)~~ zyj$Yu;=cS{*i2+S9!TnL8pOl!=wfeVkgh}YeS>IfBwIg;gM6Gn&_-#1GBF75C~94b zVr&T?L9OtBVqauXY@0u~S(etDil;=ZX1`jSQjAeR8{HC)QXvNw(tky*o`+UrFXH;a z-?5#9{V@MPkhQ_75=VvNV^`RP0yrsX2@NC2&Y?_Oab$Q*Cm2T|r2G1ScvBw`18iS_ z)%ziEghvH)_XDVu;;9kqV82?=fx6UhG>4FFR5yf)E;wL=`0H-4l%Bay2 z{)Bq8B5x$g%oX>681N=DiX(Gpor2IjGq#4HAZpHs6b+*YcwL>e-hpk6=5~dTD!Fy! zA7(TY9~5K#?l})pQ}H>kg#9=%=ig^$3ld<&>M?OmoR(FzEOV*HQdVWD$1LHY%y#jY znE0{GmV@s|*0~fLtOE%X+;a%}B;}K|5&`U{Pc$HqM$_R8k^1 zd8n-BAzUeOJBNP?(l?ZqHY2IR_WRGF0oe5wI1$Fp0_?G?q6igEwTIw`4XRwpi)DqV zSeovas2DjWO?7nf7E;1PR9+^facZ_XmMS??zLr+QQ!0*#m`_}v+58^qkf7FH&0~iz zW3Ex_x3sA}6BmD_$%oaRK}!cz!(wG>D68`lIj7lGj}4TiACse_%)E7YMu6zP&OXHG zfLeIy!?yQ*OpO(bh=uH(3*cfF;UXzf;Zfd7v)+Iv6AQK%cFY89*i%95hAPw4O6&#j zf%r~1OcObPf2cMXn_O!^%be)x(B0a9KKT9Ao@ebBUTkJCJX zWz)_Wt`wTXa9^i)Ql{ATZ`&dKz`nCH_C8(m(GMfe-Ni(c=U}^FIC*{Vb@bt1xjO@F zOIKZLXk?XnO4X3GtLnoyC`KJXzftL~BeoX)_nKbzb&WP8t+?zXLn# zrf=+^BE;vylD-OuP{Pj(^D?ItzgcW@4dJyVU&;V*(pF*QE=ev3l4JNY<;K3;?aBa4H$?4o}I zBC$-eJ4jL>|pxq-A`abO72eSp+922U~922zK!^M0%!l4Nbnxt%Nx|Hor z_b6p`rHBKJLrPhcN>qCg53o$pUqEU|!+$*U!vg8JuW)^OHllt9rDao^i_)Oj)Ojeq zgVG_S2I7F>i6*3WQfg25C4ZStJ^0Id=u1)w$j;Kt98!LYg(XNQniS*}Fh^KZ@p*Pn@}Tfl|c+K^abV@jchao8Ch+ z(TR>}fwHj{V8z~aOxzIBjf|&~28G|@%d*ox(Mhlp-eK=`2m(9uyxOXj12e-D=2jKfF z$wnQpdVAUeRFmh()dMg&5Ii#X;;V3G zX9%`?2T4I_E=5t7^_XC-WHTYBB$8@fL~}5KWpmJ2r%}29U*wxFl|PBLWVOZU^qSN9 zKxRc8nR0qhzmSL3#K@;nXQ0)rfB-9tLIX7EHc?(d(#BF+t=t{@ zk?p+qnN$qXk3^K3(ccweS{!hGFVuS2utFo$8kz=z{AUoD(FGOI|4N0m2j{#k(7 zn$S1)6C%k}e^P)A!j6IEgTI)iUxGukATr1JanAO4L}c|Ux{s>aJitxtD43V80u_OV z(8rfsw5wkRX#o;PLhCpM0UsVvYIQA!4A*mg5YK;#qOn}zlll=(wAUyaqcnv%-R+o; z8)(O|c2S_N3lW^L+qLN~{pfqVXOgPKT@oQbaetTOnT~c7tj^K5>3A74;ib!e`fCt) zeDrX@N{5VBV?a6@ypegCfyg{-@z;NYM6!!^UhcP5)-jcI)JpUCwW4Y8r8jLb;iJl0 z$T>Z!+Fzel$P;IW5O#&1;%r5GahWjKm)Zyt+rjPl;s*N?&{23U;;4hJ_rUo6`h4i5 z)D0PQCgB@r9H>bp<;I`Ebu?wYjH=4ch((tGf&oLTyT^N`?EuZua9$ZoVg@NeL)*9{aJ?%eE42SG0-}(AfCN zHrc0Ky4eZ+ZDEebgktQ5Or#ay$e;w1oks;G&=GElmo?xxaxRMR$HqIOctr_@(Z7aV zP49TdEB%Fbt2VnNfc{ZZ$;Az+KM*7e1l>Sxqugb|duXL;jw)~Z$FYHkri2`&X)d|S zYyY^ij3z6V+Q`4b=Ih9`fHVDYbL?s;B4`5h@C@t+F12U)QahT_rnq96GQ|d>6>Un# zX>Gto9TUBKF^u>cUmsX>?yVPR3bcUYq5$p$um|Cyg3AI#$Al}gUI?)q2g3=x9{?qR zEZA|p2N8aX6!_RZ!ms;FToQxe{ESfQX-?gvRS3kPDRfvqveU>252gJ^L?GchY||^Y zP#?CNNpg-n!s{|yfXA?&oa>+|(St^($ca5uyHD&HI-!cIBZ3ZiAUtCsUDzI>FJY4y zAN&GPswYl`$HPAaVN5Y3d;47YN36ivPv|-hj{2u&q<WPzKNY22cCR@*8(F*feV{eE?z&il1x|TP>Re9Y0rn$_Hn@quzJs9Xe;eQb~m_n8M zO80{(z=a%-|AfJ7w(DjnCDEb47wA8;K{bfx#r$lu{3d~2SRmZVWJ{~xatJntJoT7u zakR|Pp(IJ=IE}zP$S4nYqqwvlC*{KcKJCAMBZ2m%i;mAn#1l93#A`>^`>CnY#mRUO5^7m8M($ zmOcL5*6=rE!79iO@5XC?=hmD;1EqGm-?EA4v1_em(dS^H2wean7#eCcDWXm4eZl=_rrPbZ`0Or0frC@k?2aJ{WpyfS(?xFA-n76Vo zX=ns#Xq@_`H8f29GAon;4SK{IVrXxOp}ir7_67|tkozvC8^AiIYb!1~x`BoT)1nmD z==`~R!kvT~i{TeYhsHRgCA;hkZ_@^NI;RxHu>m~%R^)vC=upz%qXcw&8HD`>E?m5Y zvllxitJ@5H0cZN1x&z3jus_nSgG1-rh^6#fMjhJj?-P7>(Sz;s2D-`xtPThWN- zBOHWI!_xII?Vl8>;yAv#Y>#7|%;EwPJvv~*Bt)QvtYK5F5gUW?k4?2lY!CB5X2e!T zfxWmZd-6#D1WZ?t+g3VpCMB)+PItf>TdpjEFN0AZ`-ttO{IcVO^D76VNR@Z^s411@ zW|Ny2_z>q|t}=sY#mb>d(T=L};lwkkgaeGsXo|t*&h{L9gF6j74Jqp>gvF5lYcmaL z^dmge0+`?V0=BhWcqE3;$2?r!Mg`xaCn&b+52LJJ1HUt2go@enu>@brY%}p<(2Eec zuiDTZx1zObS%xr0B;2W(PlznY%-h& zZln^m;fdGXC&Dcv686YCPwht&6XUNO@>Gms(a_Qs> zRo{du`zcvGQ}x?7Av{-6k9RDc3OM$DnsAV*H~9h!QsLk6!k>M18>o^k3)(+Su%(r1R$`SgMWAcO&X`I6X)O|INq8A(1K3qKrawUtM{KR|)eyNf zFIk%r?Xz~U&$)L)Jcq1@;bj=k&AgUH_<8OK$Nrmn_0X-@otz)a*!-+hU!W6skai$t z9gxdcSVo7(;5-U8La;W#?IAP=`MGIaBT2$gUThp8l57sQe&W26`khHQI)~^F?15~j z@M9u3xR&T*jF7a^#9tqM9CzQztaY8VZkNACoN1cPe(9B+NcJo~7l)zhhpC|f0UUrt z9MGJ}GNN`|4LjC=aG{8#B4P;*B2&y767tDP3}e<&7_vg?m4irjf+pF;?ODQJ!|he0 zV6TF-HwaJiLc@m<1g0T;x8r{YH@CoW6`9qE|2^UM*b{Mk0PGJ63=?+x5LFOprx>q< zZ=E8Y^wAS;6IP?^zkB@ZAvmcF$stD-doce1_)<=GAh#_jP1$`%fQ_ODa7{t??j=Ku z<+6`Vok8vQpfiTtXra_FY$>RV$%nmd6Fo!>Jd?^l0pm%&K}t8iFTy)JFzPz=u_BPI zXN!PKmqcKKK0pNW^lu44;Y9om|DNvA4~c-He=Gts_5C6+N8c#|3-o3YSfpaB1{T} ze!U1Uqp%{vr4*hd!j%-x6X7)!&Jp3KD4Z?Aizu8a!Y@+TB*L#!_~_ew9;zu!PXS;~ zYAO7l2scx>O@!Mhyh()DQn*@#+bR6A2zO9;tqAKBenNyhDO@SSJrrIc!lX*+B_eF6 z@In!GP)Xm?lM0|EOZ$Z9+`vE>Yo-`Xb$yQzDrDvY-ixFEq1qCpC8nr&iH=VM& z1!uo!#~hsW=<;vIW-eKa>J27&qXiF>)6KZF1OBKLQVf zplZ|`&g>whZ1T9~zF=KgFn=|82K`BRD|o&T`~2Nd&U#W7&zP?xcSg3UIW-hUtC#Q`RjsT9z0 zlM4X!3ZHHQ&-q|L=%4|BhSX_)#@Zpl#b|2dY5l&`!fq5>9DMg*6Xq<+7? z0zY*4-OWpJphOo%u1}?^Geuu+94w`)xbb(6xt(4{j^6q;(KHZ zKwNcaa`9IO+#O5jU|-;5KfW(6`z{o5ll7Li2bsCB?Eg%nM;fOg96h8y=wYF2A}Cl1 zPhu=Twy~vF{{|K_;0ty%-!p7Gzd;el7zMBbU+_9yaDf-QlC*0WZZ1SJ9CZ64!j$z` zDcJXdn3Zk%nt%LH)_p;8-95tfSNFU}R)DAZdSV@)!X(kUduZMB1Y(Le&#>FEZ{Zru zSJ-z7j|SnoO?-uC_E8Z^NJUr%8oGeiw+7726itEJPr44=D7YIqe;IUvQgn=de?kj( z;E+mRcL0!Rx0>a$6U2X(!usaxh-)ZNP?kqa(Gpx8wAmeXr|ceS-FBUx%;R&3nLEc* z87}Ztt}JZyU4?7v*O+4&h!r&Y3W1n7!3lQ21b}-sz5*r>AuPu8C)70`qvmsoac#r6 zfGC-Ro3+I#X<){TKJ3j z(QlT8`OQghQ7bAQ6*KwD2Vnz(OZb$Fc5D6l>oyD$MpShuM*~^C2$p; z-JxzE)@EKc6!_R7sKE~X{gZ?!vpdMk^dS%Of%VI9OpDoYAVr~+b=HDtEwDa;gh>Qt zP0<>p)1FbQMdP_%_8ILKx$dN0me#fE3%}*3!h^k)cQ~*&1~vN5F>Rpz8OzplU|;8e zG?^|!3bGxIzCma&*n!JU1PzROK?gPs*fe6;HguZeqMJ|9L`|F#kdcke8p4OnAW{%# z{|O`#Jk=(x^SMH4(z@W-x(<6rT>}2(CW`Zh2eX5$NSsWxw&JcT&a+J6fttLLjyx>D zJ{-N~?~48k+te6e?t^82`~&=R0{?h}bW<%zc4B37EoE4(9O#UgKqh^^&gx3!2EPJ^iF2E>36QF5#RUhs28 z4?Xol2Nn9ZcOj#_ouQBBGjm5s!bzR9E<^to-GKHSp*%CsTNZ|6Ax?yddQ_1I9FuFb{LrM4A!!zE|{siG!w_!DsFk&Mdr2kDi*HYh^C zE}F!dm@Kl1z_nv!>>SRr^hsE4epS+o_j^_0y$C;x=9>p7&(gf7oNto~@CM|xs2p0!de zUsfEDrDrzN!&A71xJ`c$2Lk@0Z3=rQpn1%SWt+Yn+aEP>@id&;m^x9>ZZt!M8Cf;O zT*=Wd4-453|I+Esifz|jCR2fU;#_*7PO?keB3*F$w5iNc}Z+WWR-QGCWJP{|H3s;P+9#avUC3ov} z$8D@0PAir+({(9#?|Ry6sYiiy6u1+nK3*UtS-^7lt}Ybtnx^`-JHd>aEF>9=X(Z`Lx~JFj3g;xYteo-|=| zm)ViGhN2HTqlWT%#FbCpsS^QKC=m&|Y4({67 zs}OSuZYF?-lf0I~BuhbWP8S&E9DHFp3Xu}vyY~IYq)VvLMpmEmF-9DnF^uvzQ zx@DC!@bg47QuJ<|^N|+q=spn7Dyg)4E0b#X>y4&%c=%pLiG)fX4R$WK(5;6A6H9V?AD8AOGB~RQ}}?T*iv5!g9ZYSfex%Rp!%g>Wc?txJ0SW*!$;_$?1FlOcinYtnN6} z*M4jd|IupL@haGtG8fwPo?Coyb;dBeRc`GP$Jk7SkQwW zdYUBuWFUM%7;bc(<$W^fh&SOkKwv7s!-RBPrz!1tD$>}Bt6zHRcEJiS)T0QA-E81^ z(^CL13lc+m500>(hmqg{g*``qgG$dQcDIw4hL?2+hpW9}L97j=xdczfx!(^DrJtCY zlrvE&+Dhcm(p21JHRr)E5NU~hCxa|nO{-mWB>5~3`mo#J%7}Aek6C{fgaDfoco(z# zi@Z6wh1pYac-2yrRkWpMeKD1%N5{7F;!9AR3l)B*3Z#cPQ<*A5&ahS-SnlaQz(EVA zu?F_OTbF|Epxxl8+w}{np`xw0Ix9HpcKrfstEeG<1%A8U{R!tea6suNqR|OIKUO>2 zqXt}dB%Y%l!u;D7{uPrb7|w#TG8}~%P98Cw&79g8cwB!v#1k-_g*a7Zn`3vARU($) zHV)2h@_M`wsmeY;z!AoV$!C?otaPAPNfBG9k%TT<`^i zszE5QfEdc5KOmxRS|+#&$-~@92As4MZD3#w)}(%%6!PR(GK+G$-2Fn+Jm>~(iYPuHnECs(-Ln^#_0-V(}8NZH+$;2Uw?nrwyJ5I7ovr@GAg-#`J* z#)4re?q$J*b;N@4TYtoY@BT*27-zv7o<^i>6HN~+3dDqg0tK>q?2gb+@#zaK#Ah)a ztN<@u*l3=4Bik|UG0M9wl!H$h@2d7IF#)kfyyP;lx7bzRm75NmDBXJR+j?)^qht5t=SB)n@t_clvOb@fW?N6nGdkF96XLga+^7U}Q&y%=zRuD>VI^Uz=7=!qA4K?QNf zj>mn;WMu&u0c~C_Y1wqRTfip)9}~!v&;?mHsB=f}2EAND8;An`@Z#GCU?u#wk;?an zuY`6Sc9yPe7gnXVg#J(;3(~t)S0r+LZE<~|nnoGR!<*OPkGmRDLW6mU9U%6J60!O- zDiNIt_Rwye|GT(5AX*XHN!%6iyT||Bca0xZ@B5B_VBhh-WdFZ7{@?z0;}`G92H7kJ zIod*Hhl@(KJ^%wv2%#f3a)Lv87Wp543J0R>VbIPSxU9m!nSsG2?Tg{~f zg`saw;c2JK!UJSOw#J4-fimkgbdaxI2S&G*bFP}L!dZ+A)GA%pB3!lu?{CI$OSZ6U zthiy&P;Dv&J=s9=PO%J$tk^rQouw4}#??azf?W9q;3YM|XH%tsci6lwBUn1aTdW3x7x<7M&>cv)NBhZ%C+=T2|NPH)EUx{eGvVvdcK z*`TSK^&GaPE;`1G`e8Tfq`-5@QF`MN=MAme@p!!6J>n2I+B2cgtw z#rWMr{l+1nD{lwWV1dhsNYch21i9Uj8IX6jN2b~J%VDv`Fvlp7rJy2B*gX7aG{?f# zEU6pew~x-y73aJubVW`};=Z8#-R-!^o7w*Orv&t!(t0^P|A4%43?`oSaC@*4ncW=m zZDR6(vd?J3Bfd5!r<8qZTutFU(t5MD#9Y_m@M(8`67jW{8D=;&gfD~}GixZEThRu$ zQcI)Xy=lc)(T_kUaF)^*nb-aX)C*H|Clb6Y%l9hMwP2eMXB5mVtJ{spN}8t*TsQHu zSj4A8vG}b#ZZEWG)+Uc@%B`27f_rn@{YCXGP|@a<{=838e~l((Jlnt;gGKebJG$GZ zRCv*U_7u%JKzS;b#-T}1Koh%5)_}ikN21}{c*8w5_HJ%-u&8+o^J;CoKhiQCcqYS& zXHW5<_7~pV#wn42*5)s2TXq52FV17$U$+5D+~GBQ@isRe(ry$bBglaN^>Q3%5m383 z{6$;FqDdL9a9S7r{GZDaMjKgZn289T={MSQh##Nk(K;oBap zm3My#htY7mto=MCShPFHw&0k}-@PyBu3zB<4^rwrO1Va}Rc6s-|y}7#F{VrdW ztzuEOVNv99jb~Yve~0%5i{Ogbghlz@E7HIYM(Is0W~+bMWD4BVBmSlGw}BKZq!1(dlxG?rdiIsSYXsO`a`E%XaFDKMn^yYXWb$5y}x zaBm!a9!jE*H8S@tY@<`l-}f@x1pteE;I-J&5#aA{A@Ll7bwjufl$;RTizn*eashII z+i-ed%?ywQvE<3=9K?1cXLDBq#6fs5@}>Vr%agSH2^htb zw0sGaWuoQx8n8B);rzudQP3FJy{n|?n3;61isdV5Xcf`@(>Zdo{1 zqBl{3V3$=UypNlS_i^o$(nHosSz%kyQWw+ZDhIxCw@Z3#1Vl@z{5TmcSPS{U{Q^PR zKwxqr@F76uDP)GHK*dX_B-bF{6nBorbdr+%K=mK)2DW5D^f(ngR6NSani@5Q<2RR2(6-5Q2o#IXc0?~r%8|CYNScb z%1Lw$oRHP%0IB?G8ZoZXEuoJo92;JzBs}3HRX`{)70z24stRgzXe0#3M5*FaB&$JY z)BqVxQF?e%gz6DWOw6$uPGkrf31z-1{rs}h<96v0FM*gwwU#EvzcgJWEIQ7H^*Y532&~@GS^9O z*J~lAt?blH=;^Do1W@u-yH|b?8~XMvq{So@l^**mn(56v6#cDeRx}D5z>|Rp4yd}M z@*z-uRU`X>>?&W^B-@Gsa!OsLuPd0lb7M9j2VP>&43XCFhMff4d294*=z7Kuq@#!o zyUo`Swl_j;K8PQ0+yP@&;XJl7rTYWfaulc8VT&bvXW_g@!j|0d{Q_p`G13;xPQ8i? zSJI;;2;++9S8HK&Qx7j7fTkm9c@`2UKWj2|e?ZBF^B%)9Vv%_pDL)ta8v$A=EH-sOn+_R6`fk>E~g{giZReGm_1%zFifqUK_GTzzET`eJW>3xZo<7TV#} ztY*CM7G%Y;dyAy5L_Y}COX?DY90-REO` zmKG?iFnIyskr-QJMm?FuBEeT8zSl5-^*98rUERb#e@gkw7XtQLcA~hu9Y#1ZyLrp+ zeI*bwMYO-UDyfaq!;TUg5yS(#rZ$^th_Z>ivMuV?}w^rbp%-QQXfT45H zVqLMEu^Be6S7-n+E39F!fVVv(@CEDHwA3M!0nluc;Rsub-!h)beE-DL8v^Cr|EIlg zfs3-r`#%GyBr4-A!RvS{H&YQQF)e0fMxj8Fi&E*r$P6+GGt*oY$`VrxLR)LwUAHTl zTs9G{-O5@w$1>Aui?q_R3zcmco6%)AyZZnB&NB z;k-MUABLS!Uhl8?Bw{g5+{7ZJ8ll?AZ~FwiK3t3rz6Ob>)b6P<{So1t4py7?3byt^ z*z55I?(~9YjeV{Mt318B+VmW%%KE=yy`{$VThhn_ zrkR5ES-bQR6&4ja8`;?UDFbjOJ;I2}6nX(;)|FbL{%bFci;x-Vkf_6+f36sY!sK zCxX>jwYYsi;bgY)=dgz*mm|q_=VYB+nE6 z`s`1Q?1_fq#BZ@K5$f}1@`(l#XBKehecp+^C*p8R1*+O7d)uNjHVz(%?v_i*Wbn&Bx*NBY{23yZ67_zco3`^d1HTFd2!GG}kx5Ygw8-G4V$dmrC;{2^9YU;O;tRx8 zor%SX$1}#ETQFf5S$22q<8MIeUdE0d+K0)Crya%Xb8vYV_@)uFd1%0YM@>lV+Uuzm zH_Ut)7im#vut#l4;gtgsT04bi*hAggiG{NDAA@$}@cJ7*^~R%B z^bSHPYe{gQNw#FphP4=CGpt`VF527IG^2D}l((m8#)acNe=yYi13mOH%*Sqwy4YBQ z)%XMJPv5wx=AF!q9?EcO-;WGqkKwlukVO;2zkb;EgZ=>*0)Ho_C8IDaiSFSALv2AI+RgSXx`&grYi;$@88z0IQ7sK*?Tau(egVtd(6GLXk~yOE4lP_CuwMrv zfxg~2%eej}@6?(bkh&K13cPRd)x3_sgCE z$Le1*)jV6B_fbYoUIT9cpG7}`Lo(M6!dxU%N)uTce__ty;Lv{QJ08f+-Lv0ocE_K8L?7%AoRU}*F- zk4&bSFJd?ili^7@T6%uvIq>!A30hOYt+KeT))e^y)q{al5Bi}V^yc;8#5m4y&^uT# z;0}4?jIwXNJ@Nl5&u&A__ZS}?gFa0=W~w=f1rLmRZ_GB*fe9~Gzbu14GL8KLLnA2C zpmA8yh~0sOrSDLOwMLqfH_kjn%8&bm7C`xZd~g(Rn%It?jKS4ir2L<(-ixzbkDDfb zK?5TL?X3EQ8ZpGPx{9O;P#Q00SE4fe}waL5$t>lZ5uYL?uM4D9vSgy%&CFhm~X6~Kq#P;dok!;nj< z0C}hYxI}=GT5S^Q|8zk8^TMeA`$GM{;p&f%J*oaP0_sl#BBB0T7I?NYP-S!l&{-&6hk(Vo{{h8{3n%M+bCMejq$~N7I`Rh;$iP`B(ohg4dqpl zh(5~{``9bg@SR6~_P_Em+9k9~Xp>A655IDfJd*Qj2u^rI6OCPx*W-%zBlNL$8=cj{ z7#0280gCR#C`5b+v7%mGjBlP^2muXd&C_s)Em&X?37t9!R@|mx+&D{14eHEqNU=}3 zN8k!2{9=uP)(Z_YpK(WG5RF4tXyegzzL3866W!d6I9WKe)z!l^^F!2w$QO)}FHtjJ z^BlsTiw_Pu;TS_H!C?NJn7yeR2c@7UU?F*LTO2YTg)eqfyRoY5b3;``X5?Y2e9@5P ziHp&^K|+RGBk+ILMXRo9?~4Wg8QwmI{SgVU%9we?eUkq5f-iiK3^TEz#tRM`DnE`) z$2YLCDksudRT>vX+f-^YhtT-*-f}VijK=T`<4+%Cr5=AG_yljX4El2ldIv9X*^pIT z9f?oF%-^H@u``ZT;52p~@i8k-m-_D@!^v0rd2_8{tq!vag;De`n&zq6Kz22#Cv9}=^CmBqG>`|;8g8i`~ndcicw%M zQF+4K6;UYAUWU_8lee_JCw0@X;1@O3G;^<9B}NFQ>eMI%(aRM1I&qmIUzM5#O`5y0 z4-+XtLXi{-5it^E^J7VV3q(eR)CoTg=lxLNm^vIK#O^|ttU4MwCEpS^e z^Il@AK{Pe^VFIkr?#0S}&GXosp+&XZ`@R;*#rMHMqyqB6u~k&j$fGC zelZ>4!x>Fzf-Vie5We;XJ$|ZZ?WO(KU~&Y%1iWQET>`dtpAM^J0WKUTt9hj+x=n|j zHl1AC-n=!8t+?^)ZjAC35AZluoj=Lf>4^Wk{zqZScQ zmBez1*GSBlm?3et#ET`4l-N_^H}nCF=VOVlO57*$A&K`$yiH=I#A_sGNxVd&PGWC~ zpW}y;=xLRBNa8~hH%q)#;tGitiHjv>Nz_ZcSmFeULnZc<_+<|fZ=1xoB)%x|F^TmO z?~-`4#8Qd*60>DF6icj>SSxX-#MdPrm-tVKy=6G(Ni<62!oj~E=)yZZPfMIE@o)H{ z9C}`t_>jaxiF%1&^51G?Y`4S}5@$)gK;k!az!A@Gi8o2imN-D-Nm>8)Nu*x}p=Ytg z%OsAGc>D+9{Mz=9IAaN&Kxur$pfz_}{XV#?hT0U4pQ0EeY@5 z*+*xa9;4?iAlnEK8Ol$9UM3sHT29Dt&l9+5vcRQgi_TnH>L@aMY!18NrT?|FH9Vbq z{0t_g*TuZd&OFS<%9xeuKrZ|_KssV)eOYggxh#XtXF2#&^C+&kQiY|nd2DVMu9)0` z?@VUkT;W6D(XecGF-u_6@JC@!LU;zG&VzK7F&v!0y9cS$A=Pf4-b@~I25gF8Z{c>u zJO^c*w*)zJ!(_&P@=?Z?vQkz78wc7#CX zYy}@lYZ>yYLkv#%E#kQ@mT{Bzb z^fVXmR6bM&!bM1$WJc+n{9mFUN`4f%CHV89q)CxqxExsgau?EIvc4sVxb9Uvq5^;r(F?^XS@m>5c#78xY>g>M~-$nlT zoX}CB11k`g3t@U8zfwr8b4^m}W1p$i=)y`lb|dj8-TM0yic z<#+bsn~|$!CWiItCo}Z|)VonnDI`X{kLVqQAJWEP z8POPto|YHII0%bg{Bg>6+UY@$R=$hT4ZgEp5d2!<%nIdufBDYjJKcgo&(7xsKfYc0 zlO^Bd~MEswo1MadV!1x!tkSuCtaGS)Hn(^8v|! zT=L6c82!YtMtM;ot+&&o!>_FfQ~3X>4wtFi=E-t7imYxoLr&djCB>+M#t;_Nj#8CZ znvbDfY05K#rU;Z5AolnLy<Vbjc*F+_?DO1K*Zif|Sc^RA_F{*tj5{oXA9~=P zVRm~AMIPG2_dM<~Vz7>>*-l^YI9s{pu^bH^$ z8kxHgSBZR|1751FRI8QxN=}#K-LA3~`C<6>qx9nndY)eT9;9?q-YH#5dIZwvD8)yq z6X_7|Bn=U-5)Xw#qZ%4vQU4mq&m7p;RCc*YIdQpFb_fnvUQ-W2IS+Qp1-IHR6X~Zf zI3%;R`NxcA+9hRWmr%_Xj|I<#x=cJeGF0H< z4w;!#ES4$aB@1d}5URtB)*@@!QmbE4<~ddbz0WW5ILJ8%t(D?n@GkSZk=V<?#k2B*tL<(+AE75U5Ay42-0yZnN^+-&Esh?gNQhVUtDhA=5SkRARj7{a1(*c|Ip z20tvv?D4uRaKJOiWs@ezrNrxU``=I=R*T)LvdHy{w@infbLDs?nmrT_`6oXNd<;Ac z?p$8FR7aV!)atS7L=&OQps5ar>wNBtb~m-u>~`zYY*rWLwnAsLx{F*kr^2F}ZFXBF zlfmUOS4fX)`+ygn*`u2v;?1paT0;YaOCe3Ql4>JXmfTd|bVc_!`v|Cu-oEfsci8IoxBSkdq3 zELMLC(8lT%@i9N2&2ID9%%!&LtS+63qtIHSWaX@qsN(N7iJ@{*r7uWAp?qD5vd~#- zMh&vsDXXL}S1-{Ol{(yBmzC$WlY5XW+}w21A5$6+sL*Ti=v-D*CcDj!2n#z&D=0XolB-e< zftXbiQ}KlrsmfiQc2x*6pDS!Gj~AM5vAF}HEi*f%=7j2P*u+qNrGAG^jLN;M#1y(w zCT5o?4oFI+$f8^=)?%}_)YDZ-1mcHMg!35KA9I)w6Ev6O3w;!x<<1jc@ODK6mwod=pV>r!^vWtXz?Fi!zZ0!;*609v&QJm&$C zhF^ki1Wot_!x)7zc;O>sc&GF2Y&>WRXwqdDFnGbp9A+Z?n~0YSxEo^*r)Ylg%1Eb2 z!~dnA(RiPQfG)#u8?TD~bKNK2f&#A{t-~@q+Gz3aq87!5ZbQC1J+6zBz-KitMaNlC zP*mz7Q3z+e7h@O~uqY_-l-Q_jB||}h+hYm5g5PN-XX%~7vsjBtfz(i1L?f*@0w)|3 z<9nS%twbiV<4xh-DzQc40f|0|J0;diyjS98iJK&DkXR*goy1Cst0b07^hhj`XpvYb zak0dFiMbN9BxXoVlW3HvmpDsevcx2b2@)@qI6>k#i8_hHCB{h{BvC7|kHlz+Q4*QN z@7@sdJtgr=i5(LEF0oZ&i^KyGcS)?3xJhEU#C(a#65}MEIx6BlDsiX8O%h8arb*OE zWD+}$2>)#oTP3zgY?OG9#7z<_B^FA=Z}L^r_hFpGj@QNe0g0O>mP^c%I6>m6*CfBh zMv034ZIbU!iTM(fCB{iqRf+%8MjgK6g8wF99!~rP+lPNk!!N^j_qUF9{tM<`!vcRA zc6NX25N=|DzX+@ep3R@)U-y5y>_z4~muty?w+3j|`2Un&3_24kB}jOaCh!-bIlDi_ zf9Kr)SerA|0E%f4{*)N$EnwENGvzecJ(U0KavR{%vVd8bGnH*edlj}`@7A*zw7RM?!E8++6T5gxV5gnq45t7ZEM=zykqCXkNojZ zk3RPJt|y-S^X|Vqwa2&j>1XymyZ^ZZ2cLi8#lODva?2}+4!`=^>qm~h@#e9&-hSuZ z*7x53;P{7s`>5^2$L)XrDw<>+ke2oL4(g75*I&o*zge}N9jh789Q$LdFM~~#RU^DoHTh#!qmiRNf%u_J$c3@ zGiP0TS&H7g6a%2*WhJ(2mY0^<9nNcAZjX1x%JPcqu3o(4mj#7gyI;TRh8tJ^Pv`%C zI{u$5f5YrlqiN3EwDilb$jF>GKWjmDPA<+zYh~O^iFcR9L2U$F;}VBmsritNp8E@=`L~5r$v@ljEi>SW+@t9g_4+!Sh$@juR!aiZ3z!qt*Bs?^n(03Lu{Aoi_FW(ae3wOmIJ6F7CjgmMd*j+2% zbs_c%^1UO(e)-%~nz1q{-&67(Q+LaAR$8r2nnp7hd6=}%DKf9H+Lu|`d`}6VbcB5> zKE{@si!Mznd$PWMWLkOq8q%|( zOBOqv9)CV2iR>+2>a~?x7H4CI316XpSDE?APRmkwoXSi#6o&Gs^FiVMn1@2qV2@_hY{vTcj$pkLdnRb7 ziF|LzB+bj9!W|;Sa|TDV!Jgi1u;m;!I0@$L{yv3wBW4~JVGibI@Lmnn#P(#dmR>A2 z378n;)bxp9eKh@9{G=E*%(8$D%gtiLlIF8vn#4p4V;N$X&=JJZ4j4&+w5Y97fgyt#M&)3HplO@WrwFmTRNN+a8(vJ;E>dS^?5A5jQ z8r#y>7sF*ndN&wrJP(56cMAQY|70IOGMdHS5z~53OD|s!XH;QiRzw2n2F(!n?-{{* zW=HsSG%62e51KB+;QGw<6#5Ar8VorPPVDdN-`TE3k!xf=)|)`tA?e`h=@r3xY3}Cf z;$g$`99dr!|Gkzlb_vJ{|Aah^iGeiUQpni7pgWW_^0GmhKo1lhkDqc58|itJjkNrU zjZFF@8>!jJv{^!yPLd^;doRD9Qd+J<=kW??y9_seR5a5j;akJir=_jTVg~OuS@$-p6dFPJ=iac)@6)sC<%lan%9ljFm^kL;#Uwx(S{5F_KRTs5_>1a zPwHzL*N??M0)5r?WLm_fedHWpFK5pzN*_JE%&0xsHxO+?e>UJyOx9@F z`{L0%g33EE#~U5NqLT&&*~L%n0i7Pi`a89Su`<1t6rOA&DGZEV*c{MN3WHh>lxL6~ z)hQ3^3haA857lm(m?##5_ADl`moFZ_Xw&nM&~b>K&pB5PNBaR9_Zi-G(M)%ID2sb_ z7}M?>&Z0fznA$ylTu*kcW(0$r3VS7pGWSthqoY`~E6N#J7?Hrs-xZNS>BiWLWrI8v zc8>_w!_za!PU;Hh#dwNE#0B#P*&)0v@GJ$X!wa$l55{$D07%UfWCs?EQQ2&enkUGP z;?g26keWwr$I}j32DN7{=m&4#`a)m&uvmKM^$9y0DY>+w~YCE2eY@~y?x&6^jYSHG#qOI)5M%)qKL2YjQu%5h6RJU6`8+wPo-OP%Q>%q=>U*SgFsN03$j~~&K_4_=yt>ocQJGB(y5#9v8v1kiD zgV81qVuL@A;cY`X#i!~6HKY$o8WumQC+m;?n#Yz9!Fegn`0;4d(bo)lMBCA?HMpID zXjuFO=#!F0qA$X%M-Ycd?`A*GXz;{^<=IJTitEkd&{xKx?!=+)#0?nKDn<#Yx8uQp zC*ezh>i^V#r@`JC#*N7_lQLd{TC-WSC=~M0IF24Q->xYErd|IGnA0HJw!Ij`s^Yr? zcFY&xQJa1~&m?5~^LZvAho8?giQ4g>a-J!UrKBWaFU@kROTQvnuU}v?81z{t!@_j8 zqZE5a^i%cvtJq9%O~qC{Yz1%{%^ov$3t=7sE5B}s@Rmp3@~=WWrb)q8y;QHug)JER zREHhgPCPv197Bp>Vahn#w^OQLsCLmOlGnxXS?X8{N3|QJN9|AS{^0=%Z|plwO15>G z&5ij3Q@O`#cjNpMcfZn*PZmDu@{dEbZ%4onB?SK_)cIG<#vd7V#k6 zX=b~n)T&>Y!}kLy2~asKG?#jQaaopNszH^=d6;S8 z(JU~{Hc(2ZChF6`ek#BX*{3?ZB!7R_f_$Y>N#*d8%5`|mr8#EWTjlQ7&ph&@<9;%1 zcI!MZ?NaM5f)vi1!#81NTip(?tH?UfTxRXc4=?5LQbyGMd1!OIc5DE3*#Gr#ZquZs zyOm({fifdu7VtbSh)BuBB$G11q^H@YF#4gMgz8R17A4VqoPJs&uT^}ns?AeDD(-TW z!XrxVRZYq~>q@;!0fOs_$^jlwGI8)1o~H4S+Wt zq$TH4o6@E0^CGuWfvC+1&aKJ;5zj+T53&>^-^<0z!e1~-bCpkVUcmK(Yk5$~2qsZc z$YHL_>@4AIqSjpK_b1gqtZ%9?=Tolo?AZ6$eOnoWdT;gUbFHXT)PVYv*=1c}Uc%xt z9pFoqs^CU94F#=o4Dy7S4){we(E0>~KxLK9WuEJB8nN>}+u=~RQ<75@SRepdV&wY+ zmO?w|^-2e&WQ5emR@9Th1f7=?YO-cx)DXBbv zIo8tR9BiZPA}Zbn58<5YmM(bGDZdkhhEmHJKFaPJPPR};n;N06{L3~99SI^_Aov~r zy2QoAg`s4UdY#~~xX<&$q%_E1P)dXJ2Jz;FNoR=fpme?(;ayQ6cl{NVIvh^+4^c`` zbKb50h_S~K#LdSZD6ed5u@!|}guXtRYh&u!Hj9IJ4oEQQ_&per*oxdrAUR?%65=RY z)0pNk@f0GzR5$jE+$c^#{)3yuuq+5A>*C;EGe|29&~t-p znU}T`3lT3w2dI)t4mLv4MtIT6^Fm;)JWV+jWlPb&tGe#s^r##t6|zr1NAw*kVUq|8 z=Bc6#N?<~leS{sO#L3ojth4Rc1P0{jQ24Q<$_UuyRG|3FX!XtDo`c0Uz7BUKxkxs$ zaI-5++4D>p(-J3JXif12I-!8DvmAVMz)mugUH$%oDz;p{D?S|?MX%P(DRrY)xU49Z z!`y738ync4BD2jlx7D9Z%(zkfSw*=HiVdDD$ndK;R-kYnSe`ZBhvjx1yUgy z8@}suaM%IEbA#QIW75E;sa?S-y~B5 zW6Ly@O_Lql(j9iHm!cxM7vbdHBAdmUT4HwPIx?{n+%~(yV`cAA?BUqiFFt6n76r$7on`Uk%%ddG6LBf?6<-yc2Wd zTG%nnIky5ku&zKvb}d@W*@KrzvDab#zGV>X$PL86+XDBU@Xsh5P%G>dGde>4o&bLx z@RtBTJ_@@F(!yQs=0p0_?`m@`!c)JKIn=-6uA_9qy;6p!q(KL}aFo!7JD)znoGz#Y z)FI8uKn6E@uLZ?{T0tEMw-w~WWYkW=nK%$ z{u(w5R0vuFx*K#5)CSTF(6DKsrJ!oiW1x>fkpngC0#F9X23iYh0=)_9IS6i`1)x=+ zt)Ro8FF~URYuH@Sb)aU@F;I_lHEaqfAG8M41Zn|&3mS)C5Y7ixfwqATflh%&#c9|a z&~>2uLHj`MAZlI3D8lHW-Q7DR0gUCy$3pXoQ9== z)`K1ceFqvd9$|u3gB}Nc0K&{8i(ru~3ggnAtQU*MspH-(24{}@GOU6r_0dS)_C)FiN}I6*v( zC9#WeW6^Z1G0(us;h8vdgL6A9h3T1r&1R`M?`y)D(YaW=PsiEWD{$I4lg+~^*(}`T zl#NrOxh#(@#3|K$b|t%tUCkD=B{)4<(OL<2#Gi@FT?%`GN=!_EKjiBs+g^GT}NEB}WD4U`kk$b}I*0>StZ2e~lX zQP0)#FNH9(wcz(NVjxy*Tjs^7No9tY`=aRx8b9NkL~_%dmBC$Pvx%NcnS9iXSDxE+ z46Er2qI)0dn8HyDXST86iZezN>?t@7B`FJSZX3>i2Eq;!Amy0y&?R?ppg$^?!OV0h zwhOV$_j;UO>g%oMvM$mYo<$@s@Odc)jos(?jNBs7Y^%pi)1Bh`$gjGp!W7e)p;JSA z>UApr*hYbiDQW*q8&{$r`G;c=3FvMKq*FLkLnnKwx+n`Jm_PL^HWzP*!&&I?+4=CR zV;J^u3KoVfSZCDwaz^G*1ygzGq&+IP?({*$)`dP~`YZR;F7$zyCLHO2xL*+h0VjoR z9Wg;pjhtFl{EWd90i+7yxx=@g;dnzA!NT(Rmv{U%w0kx_r>C^q-LnQ7r*M2+Xrg8Z zRuBT&PLxuTRW8Xd;{Z#r9J}lk!bR@?Q0_L@{^}LJ-v}RY_YH42Kg!HO(A-m3*`)8s z(CO6hs^aH7W04UjzAB6Hjof{i5o4#tlWwwM$o90(@20RLU<<5!*q!kR^pzaJdX{uFK(dW|)^+OZDBb z(?^>0phO;4IP@8)FbIht&GY!NBBitCvI*?;p~M8OEh>CL4I0F&T1Qc}6>y-hI>aKx z##c0G2{Eh`Qw)oeLiq4$Au~q8Pq)*|v%5P{2+5^6N-?po4=V)q%9m<6NUBI+=3UPV zGu%jwmnNpS^+7_QRutQ!W*b$a@b_O*5bzXMMQA%!K1nJUS9bg>$>t46uv+`IJX|9~ z<=X8QsT3Y!Xp^81wNN))N|*s2{lcIsIG1wBmwJ?Okek=5uC;+PBmG!(&_fjik8;*P zY_f2Gx?Euq=+h@8_Rx_FFOrfLzO8oG;&)#1>LKEegSRv zN+HIxP(F+l4f$d^j(q%B;pFrBsQ5f<2_eoPk3T|8YOih@!^?`*T@g}?o304OLt8Zi zq6t?cLxd9IL!~`u;n|DpmCimkzP&Si@$((HXBeW24piuJfvS!L`gp!UlQ%YJCp^+T z18ty636Vm$tn=2F2Oh$F29X8)ompCb-jFHzf-=5u04o^uYNKA>oc=SZaFky{K%aieg_ zFJUZ*;=s};x5M%))`J9*{b*@_5s=;u@;z0)X93AiwzSWYxClt$UkRePu|U;%fjA-{T-k z-%B8JKLR56I0%L0rN|6M{%90K7w;j?SX~Q#Lf?a3X*DkRIn#SEcW3`+a{sB}|5*Q_ z>G{9%PW3_kXytuleI!OpjFQMCe)pX1lhhr~9CtrCw) zY>{|CqEF&3i901WO01Q*Nn*Lg5{dZ|mGIN#d$Pm{615VU#I{#NdRrv!lek-Aqr^&y zB@)##R_pb@+gzI@et)T}aQ~;>NeCbvs$i4LgfrTFm+$r|CwRB_X2Sx)uu3c~|+0@vK%`W>0{H&$|N1pnR#-+WLfoICwr^MkO` zOMLV!`3;i)G4Q{<<@lDN?87Z>TdwXp{2L$OJ{I7EX2F}kd{f5?-n{0`#LoPOkG|9T zHSVdpQKamim7+cUcOibOSNVw-9`|JYCsNvXr)=lH%NBC~skmA`9;N@tk^RAsM5Uj} zeox3FS0eRUlzye}qHiAcbD&M|ZyGCbmwfkbX3P!3hC!zJ?(}K;?jyf?&}o!uC2$R7 zMc<&LcskH(kpHQT(EH5?dIZehMElM9d;0jzS-w*Jaoh2fDH&J4m$~n$JAd=HgDH3H%bDpl{&mn(ckM`dXW5f?&M<8s`S8nk zri>fA|NY%h&YWtlxh}<=cjew2AI@1d;LimqM@~-J*z>77)(`&Hm@+P6{&AY<7^!v5H+R^jQ8~Pug^v?Y+9Xb&8cKy-+q8S`2wV$7VmjtpfN>T3n zA^Zbq_~!!m!`ugE+UI`?WNF9VdrbN$cL)(ygHC-WupZ_%nAP|C(49ZGf;j#UJ7K1C8|@&v1E^&XV<$mmR^Rh9XE5fhK)X8x?tr-wX2L_D z%`nphmvT1};gz6Q5f0%B&_0;e_bJg`OMd|EggxPYP%X?IK;^C`!gSCE*b^3mR>4f? z9O^-v5U=_kD7p{o_n<=X5IzRVg4qXD?#Uud#1FPv;FmB7luO|N9|Wa=e54XCZL4jyJ-~-SyI}qk@P`X@=hc{B(z1-;40OTrlf^CJ^~e1AY%GggrL+vvnX! z8(|}e!XZ319d!XbZvlrU3;W@~d!@M+IC2JLMd1Sn z`vt5?hYlc|dw?HZ4urW47=MNEI~-U8qV#M4J_MSDJiZ0&HxFUKUJG=CC|`8{*X5JdcKz{j(N`Bh*_jxg(il^_a-aCEM)F9mJ@kv-uj(!K+@ zI1gz#34H_V7NQQqOn4=T_!k3PK}oPDq%(9Rhe}{^KI9E^39t!7^7H|}yc%+by>>DD zfhu9v1M@*uFc$*NpbaoPf!BgI!Hgp#%mBI*X3sB?&H_=s9l*JTA}?vczkvP(9v?8n zEYd?bs|d1zJ>fq=(VwEv09IL$PRNb$`(pgQ4D9L0+}aOSpy1$jesX z%41-Sk?lmpCFz}K%wTLE+JDx8SDLGbH+z@axH4WFY7f!0dM8|D&V!5Zi? z%!NSxdXzWJgm2s|>epMq?YE#$hfH+@-_z^odKR11rp-mJ1;M0x$D>y7(!NZ}cxLGbM zE{4EO1QuLav;v#hms#C@N42wwZ+*ehuMF!7YpJf3{$D!A>`u3@a9~g77@gN9cG6us zrr2ESwvM@M))ar(!Jhr$t2jEvK5I%)T4zo1XBysTO;O}|S(YKoU^J%Bo13364L{|b z`Owy){2CwhJ$T?j-PQ?P6Sih;&EJ~5J#Bmb_LA-8+pD&3-rl%<*Y*S3k8W?)3W`8*7Sg(l*64>6#`qB{U^B>6_A; zvYPUn3Y$uroK59Tl}%Mmo0>K^)iyOY?QGiBf3r? zYs=Q7TU)obZSB~4YAdUYuG7}V)#>Uc)Fsp<*Xirh>ayzc>k8{i>YR1ub(M8hb(`uo z*VWcF*6pm@Rp+ZaP}fp-w63+Tt*)c)R2@D)>UH%K>J#dd>-F_%^;z}#^@a5%_0Ib8 z`pWvM`c3tl>uc*9>vz`gs`u3&sBfu1THjjVR^L&7s-87OH)tEe=l3Xb6o*{oH*Rj+ z*|@9G*La|@rBS;*SZZm_S2 hMDNhG2~BUjQz1~fNPwc%da0|<*1*gglJSlt6DBAsAX=+djV5 z=-WPi_Trx`b(Af+@6IK+-Qy^^?cRIu3pj4S!?7fIuj428I^5S?@3`l_MR#19m6e_w zYx?GCfBELT32o2E|KC6R_UA2#-#@$L`5XE7jn9w7_sE-Xetry(&v||(v!I6=YZZJHHlp2v5 zxDekq9xgZ17ll&{1`B=QFaB*S&?SP>@Cmu|M=)i7vaF42CiBwEyJ0-e6cu3;P{^mj>=w9zfnl>+nG!)7S|K zlKvck=F%mLZVTLIFnm>ljC%ZEg#V|_stf3HsVHVxJ_-2+7|3vZr_+E2{#7mol(wp>5`>Os7pR4m>WLrd1otk$KCg#;0**j=E^Vx-xr-xZYom$-``ng zps-#E%T^_949m8r_V#u~wS4%l!GHvc@pz|*E35%YuIrW1A&0{D_BN&jX820vekHsz zx8Pbevq9EdmyhwOS${?wcCQ^>sMGothPp~< zv*VT~R9uXTC`iRD+6*efnnWfCB@WMR$?yQ0Jf*5FkghP}Mp|~=hAMdicmcmWsJvF7HtKUIemnLZ@iQdp+|T~&PiGUrG?X5 zg*C?3OC6Nm&g6om(ikt3i;@$nXStH2?b3RAP{N?~y)}98ZSlch49KPcGM{SsY&YhB z|0UtK!so+?>CIWuGcYAJ=bU9qEJx7-8u~rHuohHDp!+;3efs1ih{0Ca(b!L z(6>FDJ!rU?AM>Du@T}A0gYg~n$LT-}-P)D#tikaZ{!InV0Nr3yfl|pBhx&sWL_B#p z(cWMH(f;84?`VH&4*JPS#%uv$V*SuCpQ2Y^9yCP?OH=eo&m&Qk$6B`S;&Tt!V`Ct? z7XLdvRS5@j9rA1s2qW%z#P?Ic>s}S9j=QZi}-2k1J z#ANT#uB3vjIk`w2a`BDv9qZ)d6N5rLBI08167%)l^t%q_li)ua{r;iXQ6Nxmiyq};>+F6<4?Yn zh|_#@B+XAP2|Y>cUs#_ML8G|TnQ2yV{=YpYUn@<-iCg#&gMb0vx zs>Pc;9>7=pKZGys-^2G-*4g0e*qH?1@2JR`@cF{-+?=?~ps2oFMGm#JJp;3IX^9n35D#e}Iw^uBP&^(c91!`~*zx@EtkdYxV2q*i`of$z z`m`&6F3}mar&?~>0kGmc7jdtMi&Fo=emWQB|K0j$o^5`+wzH%Hjf#4AZks=n?KLkL3~bH;g<(?teNzf$L$?o4-tiZL4q)AiVqwpos`}Lz$N4qe&2#+7@u30+=416lSzkS+>w1%O z{+^ZZDNM`}TD(9hY}Xb;M^P#^(~RD_VE)(1=pp1o7lbFmZHI1ug8EkN_iUptU+zqS z?SJ490r2;EHqv$bL$M$Lx9Rq~6S1&Kx8K0alkn@hWl(qM4@(?6gdUIZ9u>Avw~ynM z?fqLtr;A0W7a|qpkLK%M1Vazn3<~RCJwstLkTe=emGyxsl)T19ZIxjiq1h=cCu&yM zEg-r(Tim&%qZt4n<)F|)AKQi*E8L|$^sO!y|E72r)+H7cV|pqP3lG6~DF)VsG2OZ# zF)AfIJJ&Yn`Ws}9xD7yD4gCReUmX@lTp-6@pxz_8eI%MF>~*t#ApOt(3BZ)_8@UdS z{Lkffqn%Pl~!? zN$yRwC3fEpqWm*dp0~^UkpSu|y8R~tm`xm0X7dO@R_E+Y+FAF>b*Y$7-5x+ovfk`* zej`2Ffi0u3`H$$$va?Tm^cRTwn3#AUi!B5b3!^ZxP}ouSpFnbw ztRU(^=sFY4i})z)7q-$wCid1;qusY%xddrpAP%Ay^9M4`m9od~A#1 zvpaXO!p<$Mr%kGWJI4*VYqI`XgBSe0lVV)w;juIMPl?vKTa zqM3+27>gC?_5y&$Tc=gVJh2&fLqm=?d3(GdZ)Dz}M(&NpT)I69gAhk4U+!FXeHl$S znqGxeAG5ssJq(6rweT+x4~#;tGhs1lJ1Nh{C>!RtSHjpND9aoPzE}8t^JO2(Mm3BBqV-YK9eXR<#AqtSJhF*@)(; zK`gc9=a(C?m;S+1Xu^m_?-Mo2n2`qgi1JvMqGs&_$Q#Anj$Od(EsVFM+ow<^J{QD9 zE=a_}sk%LzH^@iXB9Id($??%Oz^^`uwKY?>-}Ve9-km$!O*2y}ec6T;T%^=)kI6=E ztkgoKZxKEkJ~w@(NEdBYs&=igekIM#+R-e)Sg6}stU(9gGrvm2h^?)m7?)uZY%RV& zIR69?vr$C1@Aw0?_b8WCICJ+QverN=36YWTOTiNA_Vp-NRUhQ+t4OzBhRTsJim^&w z`YXw1FC@_F;)B4DijesP%EU%E8Br35kW+x*(;|2Uq5oQhopZgy4spwtYM((EtNI;~ zlR@Ql`!qf^bMiRO{D4R7CpJ^te$cxd!TLu~I`iiU;o8TbN1pgSm9am1T60Hva;&*8 zMVZ>un`@!;!OguSif%tS7`i_vH@8ldx&QR$mY><&d{Ol8y@Q*(A-TC(qRd67H+SKg z%?%Yrcb?Wp?WR6|}HTyIm03yvVr-v`3~}IcI|Yl1<1FHb(BjF~b18b0DV= zQ^NKs>=?4OA0fN9$r!K_cYG7VvBFxo-2$LHZY88m=sw!LDC<+lZa{rscyzLwlAt$H z$o$*1cQR3JQcR z4fq7GH`DrI*Ur^mB4I+!I)?5ce=FABDxwPW~5__m$CIPaK;)Sm%_ z_VxiC)yuj<$Bn^N+D+p)VM#5lkI-R)cEl#)+Ed7gMzpr`h)it);Q%$yyA(Y(jpgAh zsP|Po9eb(KM5|j=2w52--p)%c=o#`@sxTWxW&2>;O1+A8Tg2A&P5W^eqy3 z<;PJuk#`JB#QG^Wbix?C5|ey6@(OoRz4wuqh?vockBuGAJK7(}h-b+9?yCI&Ae$&Qh_85jeh?z7+0IzU2+7t=dL&#VPfNNgX3UI3e3 z(%g`s;ehr{o9+l>nc+Qvw(Oh#?>=Q0iQP~T$7L5Oe?72dRnZWkk57Ymo^_MuM#`z+NcSI3ce7jV6>4f^V@X#iPw0y%a2 zUPMAuZbucGC+K3J3l2s)|yAw@vQCIWBWZ%v#qfpMx8Yga*`#Rhc>)ja*?y$vzL>y^ZUj8Eh zt@pAHXL?|$Uay22ZK3`VOOC+Is63^ZkmIiB_9@yguxi~MSAOK#@*FJjOzc-o#q(xN z3t4e0b6rSb$Fz0WvW30z4g3Yhtp3QP-FpG1px-D}24e~Hk$?@56`JxQ3_-}4hl~pS zB!($f)*`H^m!ypW*?nU;L`(pD=vnG;yUgC!{&hZ0GU!9qa1`{Zmz+ZdYXOR(G<;G;uRy5PmAMDe&qZkAXJ~=Jq_kZNpaI&oLUbwI1xp_(c3K&xu$>BAg#rrA zO8?{src=WCNI(;pp^2D2q53>;K;rV|Z&5n?m3&yp_hAWsZUZQL`{{`{^o{S6fSq3j^7DqnC!>lu~j0D5iADr^J_BuIkrv3sZoE z!^YE8K;exaI~7fzZg=p;ALXb(>QrkV={8U260&&NEqPvc7f9{WA}{+`o-fbi zyqfS_pzXDoJ>W=Sq=-8CWCq8Erc`5@jltn{gdE!4Aa`{-g>EOs7}5&Stt<;BtBF*U ztGG?q2Pv6lm5n#T(4^b@f5|6%q&AG!m33i%B89bTucHrQ9(2x2^h>pDS%(s2Q%z}> zVU`*&@hhPfRv@M2H7X!^_+b)+>%i;*hQf&^2`LP+_&)7(5KM*jD5_%A)?)^g@N_H9 z`!Gel!H9Lorq`YY0L{~F=#S2A5(E{%2pOh)1=+^-;&hsMt=br3hoKUyp?MmT1=I<> z(4ny7q&_*f2F7b|p=9|Qn*q8yyAguYHf<(Sq6h(o@HBj*d+HL6+}ea;ZGVQ3J5q&W zf)9w%sFqielaReik)4peWRhaPL-q>Y#%JpRYL={IMw(9TI#f>*!jfQDEe|I5^943T zqMyCrd}lu!Aw3z?Yjd>22yo>Yi|hRbjm45aiAc8PL@vG{eOT0KIng0XXd>ud^4xJ9 zKPC&vbL1O{^ZD2j?F2-}wLqdK)Yt8Yq2$3xhxp%k{C&iMNnYn>=^?Obg!{euCw=OD zR&VHAtMt$#NF%;J2MY`&@H)3FowJerSrliZB2Dd3OdX1|V@WoZ`4?a(jl4cMN|+FC za461qmv|}fH#9CF&19uPH!12E&>5(gcT(?=?*NLI?a=Kv@;LIzfO@USH1W(2s71|* zvBZ|#HHhsy>R zs4m$Q99lj!uR0JsgVq4GL~PY3`RZhKk2PWvTWCwpe~cjNp+R3p=mG$e}Fd*KZ(2hW*{qOy=qKSM8VF4Pj5Wn|Zp}oXyN%?^FHV zy50G6qOUM%fMVu&*@F&HOPC>j>^*Pz7OOXWSB^Kl)Zq7f@;lubKH;SdH2>yjBP8T8T+avB5YGGG~qKRB${)I!rIRYScotPWJHGL$U6 zr#qOZgr+d>8uG=3*GMix*G7N8Pr*>@~Z5fDq?0U1W z#190A#77BvUeg{Q+X6n!1wY+xRWbE5P+W)AzR5--*#HyMW)YeYUvzBhsH~1=?B=fqnM#3#bVZ$Uhb(n9I&{Z`GLzR;JoW(ATQ)J z1kWYebh-LN<3EiuhNHMKvwl;HtarpgU-B=GeYD~(tT-n2E_^Rlh)3Qkb|>ePkWutW z_dNo85B z+iZpw8R8SRT16{9Db!pMz}K|qiaz=RbC_u&N?K8iygDdd2CW5KZ>_>Yl+vTe68~#F zviWv>foF$buSYh}KZu=eIhjIjgm@BT^revuxK`A70CkfX64xa_cQ_By?Jf+BWi2_5 z&wkyWf|!smgT!08>Zlz~i6;gMS=MwERp?CNN4#uYW9$KW)9v4*G}0Htrf4dcQ406d zq1g~aNyRELS|w7=3aILs9z88M5_KLlVnLuo6)31UM5{-|wWxGxTznNja`5W$RSe{l zz2!N>PVM12t#6z0XW#ijxK49og` zzd+zzV$nFLngn9PvK~PymY5jDqe!4Oo*>o~6V&4Cf;HC)z-mCl7lPK@&zE;wHK}AC zY8T?Il4MzEqj}(#g}~)3Ya;IhIC2qsKnv%QF@KxZ4)z7Tj(Qb1BA7#}#*mTV5Rera zw4S*TrWS+Bm*He+dCVJ!O$pl}b{>Y}EQi{$_B*uNe!>BcKzZN>xkLfS08BPz0gAfS z-)qou+|C0si^|gUL$dQwur=Xv<08i#5TF6X6#V+T`Y%LRUxDmX=cH@XLF0DqUzf$l z9=xd7au5>r0}}}8e+5Cstv(|F7`qecGCKhvPRh=cK~#>p{hS?$@0AB$6OOe8bre|Y`W@7tsREpsu+pBHBy3_IIT_^_nQ)dOXL_Q$ZDHh%}hQcx2yXQD9 zDORaV`z7Cs+q4gcQb*ggd%vcvZCWoMG16^3o%a}NKw>*&^re@aL72f=0WwUc;AvLH zd0+`pC?TRJ$>g-AF-d>vNYEtMEHh|lr|6yWnvvw1WS5E4Qt;-+moYG?6fiJnZ9rK2 zCCCIiw$k9qA5HTR;Hv$5z)+MKhA(Y3CI?;JjQBIKU}`%^Bv;2C#JVZ!6b)Zd5cx9) z5SsEhY$}GpI8>}bNSh=&ljvZyO;%^7==LQ@r!k#2RxX#j!8CIQ$vGa@&Gxz3F}^<9 z53nX{LsRZOhuaW9lwiNPnIagYyL!@f2tv-Pf|DecCaXV(%YRiA=^fP*mGM>aS{liLe@S79~B0q_v)^PXdyd9mgmb4XQo~p5J2eW{XJ?8L7ySL93fU z)9?+ynGm5RmY|H(gXO?gSCaIB#llh~OiCDruLAavTTAjwA$YA-ckl1Z4&A!)~eDJ0F5MY%b#JPg_ATMxCIRKuJ0{=f$aX z#DvgghV4mz56!x*$CX;M6mLZDV$w{7^zIR_E@O)zKkr?3akk>{QkM)hoTB$+>!9 zF@2p1+$Q&W4939C^koeW^|H)d_}x_SJ?~LUz6A1gpz6kT5)F7u=+kjZL%&72>+oE~ zba8{1nRB7V7~~ocM&Y+rd!S(!@!D|j!qV!VOufacZ}EmUTb(CXR(jZHUiN{)raZ{u zo9xsB*-B`#^Hd5GN3g$OmUHLo&2Fc)qOYqK!ht@zE!6N0P*rk6yS)v~E7)?x zzx_0e;C@KnSk7T~O6%*D@Wswhe@ZZwnsi0eL;a?pg~C>#lGDb=qT7GLD@c`%*cQ6m znHkOE#g!JblK=;?oGa^_m5LKMTrfzFDoA5lFMwp|_64X~2!-rveq0N=99r02P(~hv zeE#u(&P;Tb)2W!TWbDJJ{g%r>@H>giU8Mj$u=3Hdp*5KXTn13Dv+4HkHBK z{OezWIm^(l#_k~#1t;YCj$o}Ii%Eu|E z)o9u_uK}RRQ@|i_PPR?^F~mb?d?sU!3CCCm)#*lVMNvvxwZCvy27+VxG!xi`sjo+C z$3RZYorb_nsy!UF%bioyGGpLUrR0maN~hgTRl})NXDK&sy@N&58exhC-cg=z#n zXjj(v0J3&0%A1>nupxqrW8lPRk<$k3Ja^|V^s^&4>5xNrU~7{n^e(pCCO^4^5D1(PCN0w!k{4)|jeO6}?4TUr0GSw14GsWF2;T z0pz+Wdjq4Z4hLU$m7j71hTt%OBA^82ut--NXz2vhq%~)PE0nM0@RrO*Vtfw;)&Bnb6^gpCIbsok*AVUF;5_$x#tLhC}Cp!YuC#MCbVM4Bw-fGpl z2+L4mG!}bk4FGQ9gQtqId5C5p3lq{rX?za!rpQgS9HJjs*LgpY;Yg#QSiGU!T$CI_ z2%o&>5Pr!KCSj-|{D-t1^TPt_Uj)uZsQo1Nk^7T#0Np z){fFjc*^-Gh3!EzYY3XiMIIDMA+xrNBoopEIM>zQBraPL07!L!l>Wvk&Ld0bDJ4E& zB~_dfhNM1@mL)i{)IR{K+5DHOGkn1WFVDJPzvNaGfI=r+J)R&PC~c|HSQbnAwR_a z6Ezl^w40a?#t9Rvkk4bXQH-WLpv2)ct@jI(fq=-QJW7?1QXRH-9be(C#l^5;st?su z3^pthVh+XQ&eo-718@T>F{T4AoZzehq1?Wg`J0xf{bATJ|`> z%;jX5>B4*@(R7+9<~1Wl3G;c0ybT#5uC@%Q$)HrXHr0|L)Y%$LWvvkhFV>W}ufge; zz-eZ=^B~P3cA-Jp^u1>fT=JWI#GNgHOr;O~SY{$S`T)1L>h@cf)3gJ}b-S_*+6@jL z3ipGqAvqo{LOPW$iYHu#1adhn^5J};R?sh`Ozcu>3uE2+oCkc88?<2TzR!RaeY+9r zLP*eIKAiT@Bo#=G^R;l+q#<<9hW!OG9;iA8x|yQBlxu^m4q?8>LKQ7*sXmwK+6=>1Dy5)tLBN*|CzeIfsf+P ze8bS0BhE#zOSN||M=#ipSJ4a>p)q(=lknK5-06vm=f{mvS+3-mS3flN~p9ls^)l065AwYEP4RYQG&VZ=^J` zGk{RQ{`&}$;00R0HIt1MpOd(n9T81ouMVA_Z7j|@vuMy&Fr1;9g7qUq> zvrr1|y9H?g1Nf7y+840Bg*s+?VPP-p41Jy=Rc--lAP~5nKK%4CH}ttFaDC`=bKug@ z=R*P`^sRv_wJBCQC>lX{^kV=Ob@|juDw(V?ANY#EXb$9>R3nl?_=>JXe2IwPMe)0} zME)I?&ruvVXIz!}#JyXEadV{_6m3Pz`5>M(!_k5}^7a8>Y*u-=tMSrEZ77WChO7 zh8D3lbix|Q4xPvd0M*P8PQfelq8IzvTZFSdG?}M_o~N(@C47QCzwS>*wpImTy>FBvQ;sG<2<|$6|m~9R)gM1*ut`MP$;@vyZ<0K zdf1!`$jHTNW17LR2}@vb9tdW!UsGRfr>wsdwXkjYavp$j7$BzsWT`3#3*-xPc%28N zsx(C1VGd>FTfS@Nf%^l-GN4vLk_jSaXYjBb9Ig9Un;iPMU+y)SeXKJuOlB^tzhtJl zughoZgdXFY*y$~4x|R*MDQudJDOSZa!`dsGq(COF*_uM#J<3x)Q>(9VE3rq=xLYD) z_t3dF_970BiXg~&S*I2TaLH^On0)$Ql7A%m@fc|E>1EZZPt{3V7i9X=B%0eWtBS-!5-qr+4D+fTpmS{irt!TEcX=@!AkBM)b`+eRBksQ@3F9DC>qu6HcBSd{z;K<;4M&oFOC&-dk^mf`O8Fp zeL0n<{1143M?C*V$nD+cCs(2nxDS*s|A_2~9b5GO|f=v0%bqpS3H>FXlSrDcAaMbcmq=QXlA z>l?Hp>u;k-YA?<4ig3$!4c_qH=|g>L^j^@1`N5=kam4;E9{D^C$PI|IXX z`#rG&R%j-o49jXmHtrF`a%^t4-OrkFn97R?H$PHRz=5uLo73u*(=5_^-D)|lMAEvhw9~5K# z?l})oQ?WU(hW$7`=l{vf7RAAcHe%vhI4!GcTkZ%QOIe*2I%W!vV3v!&#KezhmRx*? zv(BT~Fbzl;=bppSCn=w#l?Yg24QZBhfSS94YqY~30gJ-ZuyNMbqmmNF$wPH556!@V zh5g)5LHb6p@>V2OS$_99Gyto%5+}mAS%5uubp)Z}Y1RPzutAlpd9kbj6-(2+5)~uI zq-nNZ-a<-nc!-xtX`Ys2jHXJql&_^V@RW)nBIXmN13@B@azE5eT{vH(E+va5Qt^Z z`&fUdCljmT&U^oTI_d1gJSAM6DZS8GH4UDca zPOTZ9c6DR$21RcG=r<~T4aC-hpRFBWU)QR`(@HBo(xuXh*eGT^Ec#MQ24R308OioP@W zF;^Z*)(2Q*&;nR6EGZ>z7}pp3P>`fP3{9WZu^2J3p>W%_m?L*|ljYH#n3JA1uIWP+VgOz{1@pA~g^sHSb|rXs}W zf|9lxhfu=L3-dC!E}aUL;$toNn5Y`OBxcdy1i(;dByuzf9cxnu>h?ynyy1D@8lpqA zqwnAx411;)ox@)Qm7<~8=m#wd-R|V$6#94x4v?pOvX^FJKaMO8;IfPM4Uh{x!tWzn z%Z5mV89E@EqUpn2J$)xfDePeS8`w`^LP~z8^w1wLU$C`Um)u5s>-)V8#z01mnb=G< zF8DX}Hl#pWWJm~UDWz~c1!L`PFbA?kl9{KNAt-tqB9`DR5ir57hkSTd@{I*%)#D9y zrxIDRdRbGGG|pu}AG`zNbzf7WcpfHkpO|(Y{&_2o85{<~(y7!SG{bZ&nsmVLwc8h- z1zFUc-b1PV;D|`8Z<~b=5#5?o$gX98p;s| z7>AUK2$iUHA?{Qt?nuF4y*fh8(y_?b@r21lj z;Rz?C_E2hn@I`NhMm=~d`sqsw5s*FQnYo5Y9Tt+NAby`(j30Bb)@y1#eSs9cExty4 zf$+FcO41_n1wxuRu}JX+nmMpQcwdU6p0Tq8k}cDP;%W;mfmBEYHAr`T9ViTqf2BYeCDBSSGPP4N2?ci}gqI+fVZg zOz@>+>Sw3ZB6u}Q>!!3WO6veze1&NFW?>q9$e@ZZ3C!MfB1 zdy2oX-Vb{yS*YoDRG#+UIPBMo&6GzX7XC0~H`2f)LBD3_=D1PL=51+kSROw&YK@gy zJ5ab1(~zhvvhfKyuFiimZWI(-1191-CCX&Q)LK|yQA|(u1v58hfS;BY&&t6m3Z7oT zi(`{vsr9j4K2rlkPS)Qz`-EmeDy3D(A%`1VnrbgOz`L9RJMass*ytSfy7+74cfTAj!?HT z=Eh29<@O#O;!*|fcXQps1W!Fg9fPAegQN699yQ4etMXjAb_ga1f=A{ad=<~^3BY!5 zBPj?aQk2m0egmwPY$oKCcv8KCXbvW@VlEo%(aRU&i+uB?$|up59BR{h+{Uyd$jpdi zvm`)^$K$ZY<8k0bJQ=!s-;F^BSU7Z4Bwc`)6$dYtCg6jMzJSkdtR?_y_6K-g%s^X_ z$8+}5jI4m}d+-1XIvWD_!2TVd*4siwhTuH7*@=m53ycUA6X&>ZCvgi#Eocwo7!+YK zoU73`AArFV*BcD#4fmX930<0ne4bY%jM0o{Co62dm@^@-ScJSV3 zQZYn75>aYKdsl>MalrZAQ0rmC3XBTX(KHa`_d{St7gRv|D-~8BocoqQ1B-=<7f+{trV93-c}l?#F*ozrmXh*)T3I`V<5aeZSS zA(Bk>C;M17b_^^Z`~@xTQXHE3kvYzbbGDZekwaJ0eN@%r0&ZeQ!MuDms0cKKBwudP zu68-31xOrmt>Y8~e0V^GYU?p%xSng-JpU<*M)QSF>PI-yUaP2#(iCQQc40bhpdH7$ zM1h80L~zD#RcAP~qwn#aNvaZeNre2w{aq4gI_gcZI!E53<7Lc*n=b!puR`GQz|x|w zvdMTg2Bf3O9iE@*3(q%~e*HH{B)e$m<$qga9#>6Atu&8cE2;`#dc#HoK5ERxoYRx4 z{qU}wGo$u^af|sl5c9VsbITkGZd=_Dy--?zqtOj74Y#v#*$6qmLuU0L zgXS`F8~QJY)|iGaLM54&G%$9DFdZ0U_Ug&WKFbPQLD;8V`C@VWS??q zMmzMkMY%2mim@9qkyeBwgECBZ0TsxjBiu4KYr=8lJQUxDjdw=zsxk~?a1FVZ-tml8 z`ZMiTbxxTN{iCFkj~i0ICrA_sy1x8oxz~jE(aO_oHSY9}qeBr*3E0Zh9CD4@`f+sy zO;$9unSX=LH;`!oXZpd`=rvG8&;;h;8Q2dTq5gB1S<#F-)e+5?up5GV;`!H(fQ zi11USz(?;Ee%)W0CQj46g>Z=DDKh?O||30%*?3H`AZ>EA{@p%dQ*&uOs?Pn7)Z77X(3(20{l zNY22c7EAwO(F${!qpyobz&ikMXdQ2atMa)0O>>zOGns-XyD-py!v7*>Foi1hmF5Le zfD1Vu{|SQE?9hx*N+KhGFVKJHfNBuUi+b4>`3(ZQxJbB@$)C6NkU zgOVgw;xq#HAR|27hvL!(oRp6Q__Y5%Ljvtf2OXb}iY0F0i9Z@chiODvwA(i5V z1)1*RMY#^?VKV)bBf|Mb^K#D*Tv9aG7|4^>7fI_Cqx0A@d;U(edDU0|RGx13n%?&2 zw+Fu=3szB1a5rB6JFo5(8Ys6~y{64PkNwD85qS<4iogXBf}x>CvH}twhM@;VM%9`@ zLZZWJ&!Ml(TC){jmfCE@!avM(hfA$dQ+NUVv{u_d>FS8BfXqd}SPjKv?>vM7SJi@u z(9N*jUk@-zDY`9K!UxYK6R=FrAaCy;9#=ynW`fQl` zjn0l`=Yk}BZ>(Hnl1*>RRwJeQP3_K(2Qc>yDMjZ7cfwd{^_$-F<{t{aj(My2l7>c* z1}28SGzUh8zRU__K!YCjx)|E)VrZ|6p}kH+^X0#b=?1X28S2W5j&7u3!L%sFG&*no z+rb_}jV164q(ftz(UM*EFK^KXcsjQn#jycg{8r=w{^(G`-=hq4dpU&tg$`W2g|ins zCWp4`+Ct9sdo&x6O<{kaT?dEGw-9r)Zs#Gi?AKzS zw#v1hA)HO82yOtq5O*Dg!8M0p-7GU+%Z$DD~$#x zFYqDG!yFYl(TY_gl#-n_mFE)Aq!KnTGQA}VmpjXI@D1+Ktu&;prw|rH`mZfCq_Onw zD~1G^-}wTzwS0Ia2G7SlT+=}X-=ilewrLNetX2oVGhu{^S_-iQU&?F?@nX=60J*Q> za=VW$;;u{uGPgTGz7I{g2MBM#)mBWnuB8F*TP!ys31AYRh0#jLq+A@u8xZ994asOM z@sX+BN+0}=T9!)MWZrouuN0lHNUt2Lr5508rAY36YDn*1mV*J_3Id|egu>XO+xOo{ zCF+Bhgr;mjvH{jaAkcQafr!LyMDPEr#YAmJU!=$o5gD+3K*2aeUfxHyUtyF>Cs(M( z7EIYs$>N!+-M$&&c}nPb_p)h#W6!5?2brq<01^5lE(PKNH{AcYf$)tV!`@eH83(|G z+u@ZQF5E#0o#=kxO`7(JNYSQ#K43dKO|WdzCLt4OuiFh6Dx49weu6k`X@{?d$fbG7 z+Jb1(+QB~O#LK#yAnRdx8M^(?yp~D$dF~8G|C@Pr(e2w#&JSg5e%7Nc)CfFCJCL&W z%atolV}s*x9t9gASR3GW5t@Vi+%&P7Bw;8o7LE`JHiuh3FRe^6kUu+oR9ffqSPR4DX5FdhrMkxJ!A|#lPW&}<4L?pN;keQ!aF-K>e{sNB9Noy zh=4nU6$!o)+gi$$2Wq2>_bE(#A9;cg0BMOdTo$xSo?tcSuqBHT~mPeho=s@5gKVlR}}* z7UAU-Rz$d*!jna~n!*Jlyq3bbBK#DEb3}MCg)>F?1qvHP_#YHL`WByuS_;!s0GN|{ z3cn}9trYGM;SLIK7U6Xit`*@f3cn=6-4tFY!WxC25aAvQSBr2zg;$C&sZv^*2wN$< zNQ7+^o-4vR6!wWQ7eHJhoJZ+bh%k9yYI!1DMBy6?4`~rmo zBK!{uFBaii3eTf(NEir+uapk#bsU^!g|~y-S+wu-8g!zXwML}miWGQwW(7scIU;2) zQvN1V3?gMAQvN7XzIY?v8>cM>tk6Jz-W(Jx5CykTK{msIl=DT(t0E;2DPu&+A4Lij z!mM*d%3~s>2q{*PvPz`5kaDV>59KbAq9Em{NV!R*EJjL-s5M=rlp&>Gl(|x*EJw;0 zB4r{^;RFbYABx1GB9SN&65key$6n{lPb3M6Eh6y~N{r3BYfjRw`I+=6F?h#({0}O) zy$@Ds+4Uys7H(0(9xI!_uu#YS01qBdnuD8Ut1oiXGf((MiLI`pA{ajPdJp8A9yzoX zXTNfOqu%OlQs)|1rm!wIyJI=)qw80xI2(1dh33BBmjf&qH{hl*dKUz3a@Y!e1Re%K zRd3YoIetjlzyhMGp#qB(JXBq88x-nlE_?>Zi7f$RLI4*Aa zzHjq7TbJQNzZi77l9(ty_66`{;A1BV95(zHe z?oEaU9-w(7=3)XKnn4yK%-Lk-DFZ|R9FDd-=&}of1z5EV8Vf}n(JXGj!tnTTFqL>m z7xf|8sxx{jifPV+_$`q-fT>K(SYPh8^c zGI9T?jIRB1IdP^JmsnW8R`dZ{tIQ=H>xPzDk8ctqXVQzAE;5}VlbA7r1q#B%q#=cK zLmHy%5OuQ__Ac@r{H`Db$i>{=4=>x80Li^}VS$4By%f(?d`x#02JJBy?J^QEQ;0lP5m6`kIm$4nRLq=n&fq~d4v`3D5X^(Wr_Q+O% zxcbh-;;->JyO+(yzQDn&{$GIL?s|CvCKG)_Y}dPqs=VWMjyC|C_o zVk|$lv8i7B1{O2m3wAW$Gi(RHK@r0k1+W5N@H(7-p&PrBv}+h{E<`dMbdwQb>ISS7 z?0bI9%64t--~T7;zA&-wF5&vCx!xlyz|(v^v5rq+l4#vswC)80F~yr_!Z#SM!F+{1 zr|@VHuG_>`cxIA{P(~`ka?sF)w7zvFd3zd>%^m`PlzZ-{C z+WP%~M7`B0SDYaJvkcZZPj^g1fr7FkQjV73>Y&c)Za8IiN$YoL^kg2NOU&FkuIgZs zt9n&&v*&7DQ@_?2%|NWE*;5R}#0ieS8zunUv+)!$c{pJ)o}WYS zj?^PbvJ+;_<4!6D{1r-GiJsCJy=#gbd+Mw*{vl2noQQ zo)f$j>Jv`v+Jf8Z+&I=r;CJ!*qvKlH7syV99|e@O#DA6vovKxl+Q4{3?{P)(jPViB zL3l*K$!Nfdh{ifjxEo<0@Hn~=3SZzy@Hx6R?sN3vX^uvn04(lkw1vYK(yRjxM-M=Y z?9t(N6mvIfz#G&_UPJ%6uTeEs!zhUMK+#)--!Kqw0hIy63CFa3aIX^PrKNBcozorK zNUY7cdIa#XTTp|Y+WRL7QRZ}$m+3<;Ca$#TRfV3Dc zLJG2N&7N$u=kLblCV~b=J--c`25cHJY#TaFanQ{tXrczr2*}9BW)0^}ZN z3wK3+iEXM++U$X4e^N95%;TS<@QHO$Ep`kGW|sw71exXQ28vlo2~omX?^7&n`Aj5! zEE0P};$D&XQ=VwqEn?-Fyuv#oRx0v#ir6|nc1xRx;WUVvZbA$Q5h2G4-~~TdbkS2U zbWovfe-|>^TN&C|J~MX&B%IVq>oc@((G6(N5y~_2yyZbS7UD#Rs7DQXQ07tJ%vfWs z&Ojwxpd41y!7o+fcV#;L7+d;gtf+4WWqH`eOnDq zvTy>~SWRWWO3=A8plff(6W7L4=`zc_yWkQugj7)jIs6H@3rI#~`~37uUk4N+U>8l| zOiUKpMBv&nI(iOgS=wZ*Hoq$A#{0b?;k^hyi^yx3Odw4VNQ2+fi5#Zygv~tpO%~ks zCG#oFuOBJwiCn(6uu`f@tA`!)mUL<7z*`KmZ*Us-8&hu`0gvbO?VJ@VF;?h`aRr8_ zGhr`-xP!wsx(`klc^>5N8Q#j@QNvZ%;Q881Xi-K%YN;NkM0e4mTqV#*tLTdHp6F|^ z%k7u0YYNq;;W7fm7D)@Dn(!q483tGW24~zrjn{HXoe5k~csTTfOI*?uTkx!vV*0Xb zzbrkog&v;5HN@@OgE$cImTXtpJ3iHAR7~5o71;i$fs3cX)aKMn6!k_URG85n8?7k$B={>gBwS*_=UX{sd8Ue^EBfnIN@Bha&+yus^~1aPir`C zVU2KFF?ATOPq}N?({58E3Z$dJoiO$B0x5|Crn`3aqJY~l&D?AGb{D8@V0d|P0eoN8 zSw^{*Xq5&-FG(+A$p$7G?|~`6jWezwmRa6;1)~v{At3Xl37fmj zj=VVneb5;-ln>l9gRi~zeWF9an_=1;IAjgyY44y(wk5*F2FQt;0OI|oWtjVT9Ls11!p}t4yTi*DbHaJ#N)E~sTj}?5>aj3wR1or z<`UdY{<_SZxp)JSXugMiNR!awDbO*^@|y)T*9Tzw_CRW{`otqC2Wb*6&^GLXBPicI z+uI1`S8-u0!3$VZBi>T7VFM{(|5mZ{xH zbta(q=+j;{q)vxNveKYkp-gOm@F7+4mzLFOr*J?3mFmV655r5YJ8-qJiQkKIlM10p zzyxsKv1pe7lq%mKmNFpqMP5R@d`-$F!6CF^^cFUMW^-!6#yik0YwGJ7)mHvtcX`9| z>g(|HMAxNgeK_YME!x(%KbBQiZFN^KH&N>mvPUVTe9>RIw`vI8u%}kt%s*3pon}&j zszHAeZtXR=tH3VrlDel`B{V<3b%E66@=oemGwHaPxEk9O_mpmG;uC_(fPBm2HfcTV) zaBKBA58Eu)5L(OZJ*@`U&S>To(+P~pquyNLDH;h%!!uBiBs zqes5KV0n7;bR$lUT2i7J2wg%U98JJlf!T(RNKa0!EL3WD_Fez+pMSU6q4Y(RhU2i< zGy=JUoa`=O+UjxAbwsZyJ<=TBu*()av{D&q24!*Qsu zgX)5|onA40Wxm4694K9>=n(|@v|7FKT5`%ZchQ{wYRO%FBbW>?2`*6BbG6s0^a5gcoxC)>tOGb)9S{qm9U#qRcrwoUesBc+#LVQ} zOO%prL=H_Yr7dP-0sI1y7T#z9At&*GpDyA7_4I2U#qwP!&HuqlCeQLDGa zor_zT{Z)roFGE>HU1rplPf1xMYXT|jM>G{vsK@6h@_;XDTpD1$^aI^pNXYG-@Y zfXj}=b3%tO|CU96#Uu)bv+%48MdGafnML6A0=A_%SLl%KZ!?Y!k zmVib0T@ct)BMsCN#0t%gqjNXVMsMfrlF){Dt2zeu=;HzGxIN&ioM*b}*nOKeBtEbq zhUjXH->tX0o!!#Y4Wa&%E1k|QtFEeS3uMNn?7nL7jTmoDw8Cu&9F4$J9Y*bMpa5rM z!7vmLuwcSEV!`o?bN&1gKj_T-Svnjo3ykC0wYq z$MG~0-Zh|mo8_dsx}^F@l#7;t~CzbDZ1(4S-Ii5Gf71#!lX z$9>6UWdayJb$&f**>t#D#3unCdE`mxfUN7+xTANIRwD{U;<2jy=m_ATTql^~d&FkRDy-g{BVZ6jn5c_zEXyX}` zh|c)?X*VwTZOk1ItqAQT<_h@T!67}1{Et5d0(q+H-PPyH(slK4bbSgB%s~d-4VM-ngKld! zLhP1}(b1lwQGqmBdJ9)D8l#pvlIp6hI2eNJgC^E=L)ckvm&>oda-|eCH52v;j$HYe=~ktvW;D9 z#tnm}T0=SL$wrcQN@Yl7rS6GcETz;lu@OQL8x50D7V1Ic#e~WSkrKFEct2Lr$%(^XBV4_(^A+j;(mN)RWOg4AF`!z&Ba>`2hV`B#s5> zXBD}+#4PikjpO45q=1C|Wah$ue;*Dr@cS&9PFfuE^nvO?#ytqbEzs1TiZ=$cQR-kR ze)mwjaX9G8TmCdy;4;FJw8;-aZg==P$U8g2)2-SSuvlZ5~jF9{w|$EPwc89Qqz3d%7xgBb*w77s8F1H5JdR>VR9R zsoCq?yz;BaN1zipOX&#D?|L2Tg(1?31UJj_`~&H#zr%ww3TBi;JM{1>nx}4DH*vFQ z*rP$Q_>DYq54333Ax~_{ZDd9Lz5ndCi)Xu1^%*~@rLVT4fk8vyZNpDlGdrrt#<7GNX@k2nG7?Y zJ;j6CU%2y|r-prMhqt6-`2}RZn84h>>Hw6u!)tWoZEifI-7HFmkpchf6*$f!pmukA zOSX|ZrJHhY*{F@cYQY&(xjk6nZ5%%20Y@9D-fiue^XIvi0w9YDnnJR!jve-rjYQhqx& zhg}$|yvc$2qM1Bl!S4VvZTCTUet+K{nb~Bvoi*&$!t~GT)oAb$#-Gwyt-Hb={8R&3NNj z+ATEFehV$EhJ}5(1LI)ZrmDlOxXomdot;ZlaQ;P$JNsq6xVbRxIcRNh*CBansaSkv z-;1y8)bZ{&|INBq!=S}13tq;+`S!vJ;Q(H}&q(VO$H4*QrX}f;cYo&2*W|u;`J!wS zi?SVyB2R2S%c^`9+~Y5SD`E>46i?9d zrBIfMmfwf(|8LOpKSN9Y|0OLan>n+*_?Q2^w0tOFi_`Mn=l@sI@}&Ta)AAb-h|}@~ z1nd7QTD}>&_E~B9E6DiIX!$DkKcVGNEsjC8SO=y7Yl9KaU)&M}je*^>1}aV1{}?@7 z3eoN_kjEJ<17OA%j+`GZRBc11O)#m01Qz_qOYurIucz)O&(LMv#UE+z2{{f%z6A! z`)XV8A^t2XKcH2o?wo90HjMwin`jt)MRr56JENAZ&O#Hx#~=A8N?;&T75yNMNRwGx zP?CM_4MYX%4HY}ra`Jaj|VQ1D(yT_5cpT*plD~ZReJa~B%WEh zOjHhBLUTBhAgO!+NdrSzOcO}zSc~Uz(#Ipykj)bats+-a{m%<%5zCLKNsr)aq(RKe zNpuaIkVBCnQsvV$VqBwJN*_}>HoQhjc*04lf>2^8p1&+m<5%a>NC=Kgq^eJm9P%^0 z4#;ST(8H4=)QC`gVva>|B16bXDDzGE=a-isw@Qz=3B)w2wJbjVW$7YeArkm}KZ0!j z5^7|LD1**VO}0MJMF6DIY=olk@(x4C(gU|fd?@9|CBR!^i}Wh+=2&zr;mwt5=6dO^ zMm3;xRGgX#J$+4<07|}k_o@$~Bi@>Yw5Wul(qn%`GXt52BEJ#Mibi1rc+wZf0adS5 zIULGwNY8m7r^eGe*|KtooYGM3>GkJ#Zps1Vz)S3z;nIfPu#;drZ;N~lT~FVMbQFsXfg%wES~>J(3Bs%PrxiaM%rS1%?+isv^4hZfJ@6imZd+ag!wt|4LAg?U(>=re@gi)76JBpcA~Ve3r09HySXdx zc_o0`sNaf)8|BUjHQ7B*?u<5kIL@8XC3k-A&S>-IzXQn8sQ;DVwkkZ6IcEb0FmMi9 zY$%m8w!r4~3JoA?hBfRJ@U~|JzF<9Dmf2)702&Q49AV4xTgEe)=l`_#CGb%ecmK0V zfS3STE=f3-OHr;6B7{S;OLigA1Y-_}2ThjjhD0{I>mHCONVsfb#G<7Yk7`76R6>Zh zDq5?HqJUC~pasEdv{-|9#G@6j`hI^i^Xxvm*#OqQ|GxkC^~vX#?>sZVxqkDTnn^+K+7HVZEi+v^VaF{AX*kcGs?YVRwi2)Fs$LA?orU z(B!gH<7!_<_2voSvpHNqr;rRk8(IkLDKa&d#F~DIeR+UEgULrr>wp{4>$M_J#~ zx8m@1VtmmFcFYCV0fIgk#eNC(+#kjmZ(xk!BM-GbezOrk%Xp^2aZglY?g+o^_=XYJ zDB%3Ifv2@5|94MOWya>6k})qCH{OU6HDT#|3=Wzues-_vOWHEI*Yu45Y%%*LwWKEN zZo|g3k*1Al6H((lJ&o0A5vL;YuLRB06cdIL8)iTb(B`-elVK>C{gNTh=quTq7O6>u zpeKOUSiP*r$ve@|qj+(QpcmMlL7J=JJk&V*73>PY%lM^Arftnogv@#gP$f2B3X zJ-fdq>jCI?-1>4f`Y5Z)eh7FRI(b-9FjRc&uYwzX0rFIB{`;8B!wr>rhTUILM?lp+ zvnIb0KY|VxEI^#y#-{lNtSGk8{Z4oBjCel6br!21T{?87StAhc5yn&DaM)=n;zt^a7WBZoJv`ox=n zR?#~UrK}~veJa^fI2+bth|REJ<=AL%AJa_R*eGvL)69uuJ-;>7{vAE^am>eVjGAt& z#cKS%4d36qsP?U_jULLdto@3nbig#-5Dx|Iry#ntWe6n3lA4|p91lXb&@Q@#)4W^2aOw@LrQ_O0 zbO`7w%in-;6vX)s%zr7F{k%5@&CokkLcBwuaNnU0;rSY{Lq^j4hA2}}OP;0f9;1jO zu09CqF6yJGKS;vM8|V-6@1mNmw3E|UIqeWmPUmhQdN?Cqt%!{&T zz_I$*O|>u7xrKn@L*{4 zw17;e*#|J3hRN`h94)=H;yn2JpaVlL zr2^!m0^kw>N@|TssQ+^T_0JEZ{_hI)|C*~mKK7*g&kU$P4TyyL8)onE>;KE)^xx#y ze`OT3&lQg$&D+pY=;}~kKy^>0a`iXG9z;q%LNy}IhZk&mr!`FueGKJ zaH#NiB{h){&|c5*Eyl=pY?E6(uw-V|-Me&XemAD~!On}5-+oD7m06$c8U#D8Xtmx? zu>ZxlG5d34+?6;ya1zbH$$z417%;K_T;xBfPav76P}5Le zl}YHcOmUCDN)6uyjqWuVctlds$ zwJ=6SKevyfJ2?^&A406CSJUy$(+eS>!K{4_?yv<5EFz&(`@xFaG>jYPXsJP+{WU4} zY4>nkp@d(oG0=LUVfORxNDQKJ$O>&dn$DLqc7LRszY!-3XSch0m}b9+dJy@tG4d5^ z=4w8UOqDMh zk~}#b%^M_SxHSU*=UlS#`cr+dz(3R5+wfvUBCIlJA8~(7|9Zg}K1ha|*bw8zhYeL9 zL}uU{*jSw#X{@%zN6|Kw+N{Ae{`^ga7=K1%c!u$(53*8^KM{PQH(Cb$83nzQ7r1Q5 zs;`a2r(xFJD1YpXBNg}_JCFF76{k!6caY)aEB(B=*04^8S%sn~`WH=eSp3I2|FA%h z-C&2})~C>rlE!M-WO;)oqjs99wm6!90qqwbLB`la_==of`wBz{8yY#q!iiJ}<0+I_ zdQI|JxEW({Un1%%4v5x78qgt|YOaVf)#OGS&^qy+8Ed+RngM82b7oRL{Cg`>ny`2!088>jt_6Y~3CmR>=ZfI8IjkYHf6f z4m)kSxON=7HH@ve@#|iU@)ZyCZ4(Gn+@g1r%H1E`x<6K-24M4)_`S+SVR=>+G5*sS zGsC%xJFiECb4su6bN^bpKdb}$x0Iy$qsI1$Y5UitV6g9t+q}CLf1$Dv>3$xc5M4Zr zEH|l~a71b50Mu#x{^=cnnjY%_CvUx(I?*;oe#%znm$`Plv=~68A`aSmI`hH%hcf%#=7w;zWs25jFQ zA~8{7wnU4>Dv9??d{p9#65AzyA(2Ole+4q0VG^tH13C2QB_>MLO5DSLn-M=}BXOR@ z-V(p2gN%4yl6afM9EqbPzANkBGZHsTERi@-Vqb}${gVgFelPJ(iQ^@H@tttLQ{wd! z^%A2cp7>VqJt}dt#N`qvOZ@s9!M8_Zj>JTX9dx}Ko_i$PCC-ur~Hr_5m&y!5|ru7;;WkDs}u^thOp*_nrxv2tc*I*<#04v>!6Ssxa| zF^^@kD_Ji7)I5qSu1sMWYyq3!jVmT^;5&;MI9K=(cr+}BO=pR08vZEkNeIt?)OnDu za)yHuc=sT6I;7go)0@R(&V)@d>@D1`gy*1~^OhoKZkWvYPd>`o5@utSu(2Qv7hLUZ zDc8Aq2uA_cHEchQBg)qvUhIK8EEnC4Azuz`dBeTVHOB40vx z#Q%U#BTrKnLLf;@_Un~W-bw!Qwj%^8XDj$fT1$~v9b$08Z!ynxiHySr6uBi?P`JXS z9Gpt(0~#8vUsL_@h1V|%Ex6n%4n^*1(9=A;Q~6LC2p1t~k{P9Q@_&ndDEU$3mgvui zk|srd;c{T{%Uwu=$@-SWQvBgi>6>{i5&5Fp7A`Cu*Fn-_B~28jNLLb@;SWzq&$*T7 z3d9vY#_(mT#5et4h>vO()!Ba~zDxY^IiaIM2bLo&7sB*Hel|$0YfVz>Woy)Gz5j~-1jl6I@;8S_MF~GpPpMR>)$pL*rS`TI{-}pqf?O#w7cDqRN?mpV zc_gaJ@7(o;LKiwpdPDs^_58sxi1a3^%J1C6HzQX|Q4UJT?vSw6=?}E`B`7xsmmRe- z)E7JPPG;%_sCT2DQb>$?AJIDqKctPpGNLgOJ*@}CI0%bc{K=N@w3CCL&XE_`uW%nJ-xKA#PQLqI6z-$sd)prIULoI`5y@WfN~fsoJ2 zDFT&obH06<-Lb;1vsM&aovNX8ljJ`k`DHMSe!^Izyr_`Y)9KOS*HnZl{QoqE%T!V3 z$#yx4t!_6%PTgoF#i)YD5Ej%9o60NAx6rOLzbF$8CF^C5~LU2ftG~D18(!<6nMWfB5uH;ZZ&)97;F& z$4qAWtn%_%RI|ln!81{pg-1t*N<7>lD{G3yGDW;(Lv0K~b(qmwY%O16^()E($MT@} zD~ml2a?V9-r8pS8OTBI+_HwU{2Y$KN&I{h)bd^zgXPI5a{&Kc1ae2)yzhEyn+xaWv zWr&L*dUFvOZzvC|#cowu z9*Bkh`MYO|zNZ zZe4nr)kV3j)ETYrVpo|{VbRSsyRDMR;BuKOrAM`Wz>Ci8(Tx}J=2beap@G4rh^AU> zIyW_6#X3)^%Zdq@r4Xe>1YA^Zwxb=g=$4~BbGUTH4re9)+1(zOms^y1kWwXe2v71Y zUqb0T8+U;JY@9`wO1rrnNi=(`=y!A$t3L&3V|9x7n4hoAUgjw?+sbaVx^yazB5SFV zm2*m>ivNsB43(2AeL)fm?y{xu;SU96uCrTLT)S8(oGkz4B_8t<8x>ffWYy6rdLsEQWJNi7c^RZXrgR=q zk=NqUxvZ#6_A)ynEb1bypx~HFu1YxsVpd5^#TQnjDtC3-RUycHE-!O=ywG$@nL8lb zaUY@0sNB0tOpzO9Vs?q*fTUE4EXvhlEirp-p6*H_5I>Y6oPQzB zK=PFQp}O#b5#mtFQ`Y-Hg)j1;op6*$UzA_cA(ZFxC0s)kha$fwF!r-camfzo0??c} zm$J()yOfQCc?xI}XaeYB(8`tIxd4bX{0ww6X#7PCV-&{Vg^!HkozAbbaiA%nNta#B z-~}Udn2GRj0$wiWZj3pcqWQrqBb^=v|CfSB;e8GQx(vf@yej(7b)R?(3%z!<4omH5 zqs6<6T9h($8}i-haZOJKpVhns9cN)-vCT!I5YBin!7wghQCR3HEu*rP426Ymk0tO5 zey5q7rFRO?VlB1-siCxpMp|(MMjsdBdnU2-n0RlO*e1~@u~lM|#5#$aBvwgWC9y)H zQ=&~`sYHv!B8k^YERdKdFLoC~>^Ru@ZF>he?c=I8dTiVsDAj z5~CzCiQm2<t8Vc8W#A|uygxUhp?6f{vxm@crJg6f8GD-vKN`}TCS!4 zuQfok#{Z}MBGB1TDM7-un!sO#=G^`i|6OzcLv7Ah11P3}_)}t}w}4s8&X&_)_fYx|MJ$`?eDz%*Awsk?fs6EADsH|qmMu7{PeTWzxew< zzC8Wa*WY~m-9PcOYY~xAJ$m+vJ})M=cb~p-+J5~93>~MHf$)IBD{f#HmTsk}sJ)BW32S*>f(vELCq_f&oy;($cc)m)Xkg4(AOnx5vAD zMMdR}*Iu{yXN5)GyWg~O)y=E_)A|2T$N!_{ZE)n5$ImORZ+-B)8q{ zbeB5l(;`tT#xcvlJL-QLf=_} z3?~Hj@?AGbxGVlT<$Lx>VXq$??9Sx7HpE^h-`hj%m(5S387qVGJtf~Ub+;^ch1Ke$ zX*4rF)}(!Iv3a@GzSPRD^px^RN7$#~V{D1Jc-cIgd8uTVAA1nOvIUM{4ms0lcUbUU zU2ZM3V?t~>Rx&1E=XMoe7h*lRxENs&pCV6`e;&P>OE4ccKaJtT+T~f8g7pzn3C!<$ z98T3M^O%=e)1e!=0o71~0(PctSt;bFSXw6}CMM!#>X@q*7#0v_ESSgNGZq**=5qU- zTx0IthPUqDy5jEnw_otrk5aSm`8(-Z@vQ3{PLDqylSKBeTjDLVS+2{$3=_UW{jM_e zlbx0&@X8+w!~Y~|*wK@G50~F6)IjT*o#0WP=ntU#pe_%>Qo_czd%kR^2NQ*_e#V1O zdDMIb;lczXaXVFRp>YR7!yE*{rf{&f*5y(2m4dGgJXllf_96ZbmHTOxnLJS#%A?K) zh5JJu3PppxmQiyV>lYKjVv>3$YNv^O@4zI@K~T|75#o7+qS+u%3>#!Qj}1zOIj5gb z;oXRthea1Lb_;l~1!{Unu-=+}EMZbC8)~_V4b97DLzAy$Lp7JPfo=VLS}cxupnrN4 zux4OSHqg?G4NL|mX`THNVpsy=NkBXah$kUwQ2T(kKwP&#fitHvwoRr>6W5c)!G9e5 z$0fx&HT`?C{vIvspB%^fKN_2@(e=i>O+Ti~(=uIhU#4>n>m1S^-*&!lptE006pMjB z3lh+IR>Ph+XY2u>%>Fzfyh7GgCv0+H#Fjsu%`Rzhdii{^<9%?2gq5iJqdsr+R z=80#+@&?1t`D~b`KNFIIOo#Vo!#%NVxFv=S&pVF|ha86|CA1H2qc}-kv4}T@#pOU= z1EV2-5YnZTfriT^n#(0&GW=WiAdKhPaLqHUudlZ=Hd~Zmdk-o<@*e~L=fOYBIVi)y zF>J7BthjLiZ$5e^|wYf>PsKQChJH=sLZJPA|I zV4ZFmPWJNaB*l9pI*M08JCra+Ml)?PzAIe4+hTmt z&R#`5vq@Gd;MI_k9Rk==T=~e|=fpqtIDxPo_m&+DFgx^>X&i_NR+@ss8U7fHt5X z>whRVdlc+^3Ft>a>7AIXj(U-$!YVj$+ZSC}(6*L?Wdd zV=a~gy6sbh*&~AW@bnC}0}sYc>@$#>C&-S%fqPB}kJ?V^9gh>^I2M7c0o36I*&#fP zNm&v|%@bq?9*lF@T#%YaZO7w;41?M<7xaU-aebgKy;&T+^SX^4F|M9Yk_pDUY!FBt zuG&u1Hd3~u=CzkLJ{po5yD9r z-jntHEV%9D;Zt2*f_Mnmf^Q7kM$aI$kptPF&tiGILHndMq#MZ^mN2p>>xaIZ$B-Do z-6@=eacI-g&kTN4+u650xZQ!6Si;5VkCI2AAHs}B5Qj+P7C+A@@WhAZX{B_;$FO+x zNAajf@u)}f{Rg&-5d$3YbdD3K{X(GnKlR_^VV@nwjma^SGG2-Y?;Khb3VCQ8M~|9s z*OUO$mVX4yTO&2BV>iaIs`x&H9rFcv)TW=#D+$^DbY4lw;ivOTqIUeJ&MWn2si}$B zJG0E{(l1ZZ>#s5y4Ek)7VPS^bVZ$B~{ZzgF8tj!zO`VFZd06^)8qFRvb_ZeJ04u$2 zhwzq9-U_Z^>;y~2*1R;Y%Y`i$`ZR|f+e|z>``%oms{JXX6K=bgCw)rJDfNWhY3h4qg}&BY{w zm{Gt|zCO+ARi+nYLbFYC7Y1w*57M1(wp(mg{lZ+n{;woJ<*?9f^I8>q$SjWHfyB-f zQGv>TaKH!vOR!v)rI=b!C2|2~R(Ld5ndTZOrBjpi>0o~|zzx}_IlLr)f7XJ0rBg{w zhrF$xJcq|@%Qe$pD)$-vEFeFT+)rki-MYX_yVA}S!D!B#%Qs!+Slte+)6O|K$(#+3wa*Tk4VkKq>?hBq^H@XF#4gM zbUKrUEJ~*NH~q9EUaR=t)G|*cskqBwgGZFyHcjdR>k7R}0fOs_$^jlwWXMS}JqGyvXokd|nvP3hM49+6wAK-A_0=T_x_h!-HItt{2Z z_ipjB@E45IToq89eYm!9Ee|Rg!6YgQIm~yNou!;j)S5WIKdJsRJ*_nX-hRrrFmSvU-gw_sTq37n+&mw-=y+ZsLu(v%BC%V)Kfk>~p7lx8{>UDy{;yz=-q%_E1P)dXJ2JxnZ zNoR=fpmhE=!n?ds?(!?NIUG**hA1VdIq%kgz}O=dar3bU$}7iOVnrbrqpwfl+L(5( z&El6lei95ieh)?@WyNkKkX$hs32_vyshg!5ESC9cCTE$=vD9m&ib@MEYQNJB1&fl! zS`KuQj0zVm%eY~uza|ly+K;!r!ATIsCI)EVlhkhTTD{i76%N-j_Bl_pzg18SU0N@7 zGodgk4HaqWU7}4=oPzuZH%?($kpArH!Tnc|ei)!}2G>$AZR8c1U5Kto)e7Ze3nFbn z7ws(<2iwWhlv`Q81U;>)6Aey}%7IcLd)L=QE3Rt!sCz41po%gmfr;I=)^?27CR;18 z!u6siFf>Nf&JX-lMZhk%5~J60TK6)z=V6(PuYg@mE|QHb-0TWd&H_{Bw4})vTFrZz z&ITatYzObB*~iReSHHikiY<@tN6)|(&1*IDY;N>VJn^_4f>Put$L4ekjp_{Sm8d+c ztGo=dv?@tt??&a@OZo8EVp5JpA(?1r8T(xn0_)Z}A~M5mv@Y>3ML(5|&jpkoyC5pZ zV_PV85$D@i;M5OeBgrn);aKK%D(ZoDoK7XglS`V}NkuEa3s`cGMJ{YiCP}enTz(#l z7;Z2&gx<3p7O#!F(?D?%c7c*Dofk5>Tn?oANCZ{Hc`hqTi^D%dq7Q3Nj}dNsZAfU8I{syGYCMMQ%mTDdkXzOqcE zj8XsTYl^WEf%JLX$+DO};k2kf}sH6p{mNk0veDZ>|5E{+*splq;Pa-C)3 zYk+-CrOovVodLU^Vv^rZPbi z?nOBBwy4ZvO)E9K@*G*%gIzYa(qm=sQ0(E@*>PS1$d&4x7h?}otP8C!`krI#bBP52f#5vAbPwCorSEA6deb(nW<8!V^}^SE`Gt8UkVVDAI9WB!^G>{>yI z;3d*w9^E$(2s@%qn0>IX!d!AEy@T4|S21@Y+(h_k2cH&htq8jl6OZ925j<-9R`^xF ztIeB2ctiavyjn^N;&aNdl=#t6Vxg%kX*;mC{66MTLFu42X^scBgQ`HM|Asu%JHl)O zwIX~U^2Q*CY|1C{%RqIouY+8)uqV4Vyfg3>0o%zB2>U#k4(^@cBfo7xAE*dsAH^eS zk3=oftfe>zCAFjcd?51Q4!>1E2I_=e8%PJUliUy=nOnib!+@D&K>p}mpQ>Rs(3xjI zCqR*XHEbHl4EiN#ALvWaxHt{V1XY3_2K@H1d26n+LLiehGRC^f71vew{Z3R0vuRdI+=^bPCir9%%+;gB+k* z(1V~h(6=C6f`(lVssP;qY6a~DodQJ+(XgSQ98e9Y71RdO4ArnCkOlM-D0Y~J%?5cv z_k#|Dz5q=eu3znmhus166@`fDVBE0ZJH&G=OdZ-32-T`V`b(r(yF!H-R1j zwSm3@O&FzNR?z*RH$Z(yYnUFi3e*Dn0yJa{!UU}V?F1bMVO4@fut*lgda$0X7mLOz z-WV2(GrWBmRwSX;SZibhpmu{8R!CSpD!>pnlnrCU*$8|)>)0qZnvG#&aU$gcb|H4$ zUWBtJ6L4l_63*dHVTo)iW*MikWOfN|0Gfey+?hCuI~!+Ma1Ms0GCeb}xhxImXH7VR zIUj4{890l21y1i~u?0AFnvI*0a&YQ0kL9z4IQ3b;u4dP;YuR;dG0w;ovLZ(JE)?U0 zrxmBx=}wt4c0Ep$+i>ER?i6sc8~Eu_I%~R|t-yU1mALEYCY-TZh4VG5SruD@eb?)- zyL$tp5uFDkGG%)Yz0CabJ4s4O z)}>^>i~}sea_qKY4i~xqv-6C(_Sc*6ZFl&9MFSpA;k!$@@*N&DlhYkDeNBf>6NXn6 zKj&GCj5zU)R)R0iGnW}Lc3Bh%CkDm1$;A zap@Ujr|;(66=i2*>$2n%PPG<_sp4)DZR8^-F<&Tp6Mw=mJ~Q%GyIUT<6e4-@JtZk; z38otsbtv71Fkd7jj5GHwoC{}!>({5x)nlYsIK$sK@eHbM&!I;@2X=pV9?Gj!9Q7zL zl&AZS{LGx8y|}{NrB*8r-Sppzb4dT}w?4!E3du7MyC>AEkF@3mvCr$Gquhbl`7mAn z+@Kv5qPVFxWBQxIGva0kS|C=2%)w#{6$TATcx;%DN-Oo+m+>{PE~2492rYTh3LH;Y z=pYppK?%lW;}>>_?Fik-lEN#zTn0GbGry zjFIp&>@?r%K9eYf=WX;Z?QV9*fe4NiId%&Q?A`JknFQT{suG zWD46$bB1zrMIqK3i@p4!8D2JM3&aMjaN|n9Co~6zZkz_Rp3RTUBSlmR-B|jAeA#L6 z7^+Nx;fdSoDLk|K7ZlQ_pj2W!2j#_<$-bqseZ)|EvI=8K9>sM)>=8|EHA*EV*GVLQtf{C?J-%usT7%S-`MHA?_LN z1?&xqmUx~-N*=ka8boo^MOG9}IY&s0#TaRNL&k~ysQI}`+5+Ca|Z~= zPuczQ{Xrn5ZySi>YXlMB6Cg_8Df`^+Ek~%KNB3l-MEhgv54OpC{YQ2tb89PaiGL# ziA-YWVbPwqOFSy^HHrHqwo0s%cpe%+wN7r4_M0SDORSPuA<-$ZRAPa|bcrbvbrPc` zo<1bgDe*ebC}Vx7b-5;sY#mRKdxDX~Cey2KQTO8DdDd%VPGiJh;? z^h(?(u~p(WiT6pYmRKY)U7}jXYQ6qZKtn$~ z-Kv0&JO6L{_y4&{w5N#nLlY52!+N$29|%QjE7y*a<<#)DFg#c(uN?D}I#UHK0meXIQ|++%dJNZEZWM0@)0Li|>%@)ICD?#cL1q_po&+0K8PBjo;L zakYFrO8=27`-2~dNF!35ioxp?KkW1>+LsZKOg5ekNu** zVy^o2mh%;}?&)U|ggNTj{X=h0Ci8Dv~6H}1V5 zw_llXYMuUuUmy8ZTHhWUFWPy({;Ox}j32G(|BE$ipVU7)=kNnqz}`FhHnh|w{Pm%EeXN6fd)M6JUA{j( zt6=Vl#$V2yeaWszKg!K&d~flkFD#y2d;gu+e80G%^Ff_2ul}|f=2yR~y{7i)xWzSJ z9bfwJuTFn{;j>%!E&fZDJ#+uPcj<18$SK-0&WrrAKOOiJ|Fzr$2fj(Y;nJ8R4>{@I z>C|g1v){gQ<6ZXt>;9hl{Nah#gm()DKk@3Pscms%*3Tb0zxjp6k5lyxkC)kY_W0wB zTTZ1;yY%U~H@^4!=4b!>e(H1IefNraeZLh4wx39yl6mbrS$m$@{Hwq1PrY+b?rg8| zPXnL1XJ_hLOP|_2)3js6BL_F9jve#jyH7tgd#bti##D3u)w^$gBzI;1KNO}O`FP64 zp3mI5VbC|m)Um1cCui1Q_`&L?i&IxMKX~G4%gT9ef62eB_@~hRjwgMbvFVzb4L^Uzx9C{?+J>!w#Ae?Th+L z!_ohy85}CLpPql01QIbyQSOH!tO0%aslW!9--Ma=rXK|vPoZ7Hq>pmv3}Gc`A9x6V z4cY}WO>`-D!w_BrGJYno0_J3xvDMdq9}L|KQx5XLp72*73(R%EKY-}Y7~ep~-U5+X zeJ>E*C$t81Tc^MWV6K3f@HtQ^%<6k{=uVvs&^ClaSOVG%vmSfsmAiQe?*>)Cp73!{ zDa`Fa<&Gc1nP{x@U{AOZWQ4g0_-jxR;#J=pME3{X4N9aifscc9F#CYYy-I{h_(88^ z_~i)mSPBRD5a{h%VVeSOpI9kM21zbM{Wd(cmXKeL2{BA6nfjdEZ=mYMZWbcDWH|Pff zW`Z(57Wcv|hMCH%2pD;x2r~+}a6EXxUjTGtve5>!2lxmm>O=4W|9LTETPVy4hzCUB zR|DUh1igT{12_R4G1(^rZvc_Zw*mhN+5>y~;erc6l!oy@8;H_|-|S+KNi*F`^Dc;Z z@Y`H$c%tCZ0gFLoZvon;GWHt6bOL`4;^_fimL$@g4!j9O{40TR(@;jp3*B+n=Mt17 z%sQY6M1IqO-+}b7$A)#b9z0HKU@h*?I{=<0;42^s zvkkaak2|+uzYRFpAY>8`#Ih_~|B=AKM(82T@xZ<&lpD-iVAMS1?=yjOVCMP*^hh(| zOCXZl0pJJH{2}n^bl4-Dqrln>=oHNN0pGtIqy=We_dvwo0em7ym|p{?<_fbOSOubR z2uI}!dmAB$>cs0z#e;u$L)EoAMbkd9DPz5Y0059xI zfz2S2rw{nWwMaY6+Up>DP!Y^}U;(HU<|3dOWP{lWyaD8d8Al+P0px+%^E0HgP?T>c zaDI`V|22+s-Zuh3#_aWbzvp24m1(= z`+)Oq6=_HZ&aXwBuulihzfGEf12+me6CNWoc-{owaXb1)m^T9pH$$&rE&@)tN0=u9 zZ{G_2f&C_6+76@(W+QO%PUs2o1L;oGfsi2~-C0UzLb@xI%!IE?^D!XZ?@9KAbU!AU z3F)p&G859Bm1HKQdnd_ENOw$R2@ zBwPbE%j_I zf+Nk9JRF*eo8z+L`T}h0vEYK6<=7m))av#-s+~=I3k;4mWm=b8Z8{tMzjUh;57BrrnmfEoEE$j`2HEcBJnp*ipKpVn_9kEjyZa z?Aoz!$I%@fJ5KM2Zi#Oh-;&aj-cry~+LE$UzcYPj=}zZP)`mV2Vd=Jy-=4TVWxIZR z`u6PY1>1|Zmu`1%uh?F-y?Xnm?OV3jZExD%x_#Gn-}Zgm+qNIw-oCwKd*}Ak+gWpT zv$i?DS=T(iIk7pVS>K%AoZVc|T-03J>};-Ru4=As-qgIMxvsgXxwUy$v#)tyb6fM# z=Jw`}=FaBR&1^^X4(*Qk9Xg~w5$V?>2ieF&5pv-~KB|zDO~^|fa?^_Z_>iMEO{U+OLU7CdDFEZ6YXfb0H+&RV|1goF}_jPIKDBlF{M%8nBJJ(SkPG1SlZ}ptZJ-o z+|;q_fd zx9!^I+qQ38+qR?I+P8IV>)dvF8>^45*Vf0^>*~kXC)TIb>+93&v+E1$i|R}3o%I#< zRrS^No9egJ*VQ-Gx7P2f_to#KZ>v9A-(KHQ-&udUo;Acb=o-d1BsQcp=o``-vKtB- ziW*8AoDCHXRSne*n;Nz>)HO6Uv^MN&@HOmfXlppy(B9C|(AjY2d>%zk;+s;M3YxYw zwKnZ)@-^*iYHQN&5Yigok_c_kLm#rC5fv>}E!8cXTDG**wKTP~w(M&0wd`v-+S1G2~BUjQz1~fNPwc%da0|<*1*gglJSlt6DBAsAX=+djV5 z=-WPi_Trx`b(Af+@6IK+-Qy^^?cRIu3pj4S!?7fIuj428I^5S?@3`l_MR#19m6e_w zYx?GCfBELT32o2E|KC6R_UA2#-#@$L`5XE7jn9w7_sE-Xetry(&v||NypU;Nv!7P*+b8>bnO<3dDKihrFM7b!NY(eTk|gCTI#V344mlLIx3@7RFvC|O_bcI* zxdqp%nGLeux_pdJ&H5wCmrCO*d2dQ6Vnv28oVMaRewR`R8LY>yHFw|8- zn;o|_q2gjxL_sQM(PmH))+91HC~w?MFL|sby560X1&c7Y+YV3wH$NLm2CdPXU6*a!%3;C@q}c zDy%WKUh1Iib|x1jmBx6PT$G$pJ0XS*>6 z{4WW=6+RzEOmEJLo`ET;Ip-`>VmXQy(9rMkg|(nM0^R3P>C-1C8UGZvRk#2BmD5X| zhQ96L>_NlD{FnzNglC-|AB^vqKTZc?=+>@;XAO?W@NX(;2IvNx3Y1F5IMg51AmYi( ziS`Bqi1r8Pe@FXMbI?ytGG+@16YGbD`4qkS@}MbFSel|wdLD_QJl3*p7oU5;9vcJE zwfNuZsY*DI>yT#?(Q~tp6n2E@-cOY9JkYK1-MK|X{ai}P3Xrk`O2fxy#k5!7xqMU- z{flBhZqw}L&B;aLkc)4O?^q`vpBNP45fK-2mzb~brr&iap9KHe==a|xg7&7{~o@#vd#uy$Ic}9en&;lgwGdt=jOy^21WJdDsre**X@tKh`P+3 z>+%$~DNJmUJfxk$?-`h#OG~VPf_O*+(Mb_3f#UHn;eg1;#*XKQXPrim24f7B*B9o* z(WhMjbcxQWJ=Jp44uBQsxrlp3T$K6`_S3m2|L@j6^KA3my*+7uomAw^`Sn-TOO-zX zlKR5FT*sUnZdBB}bL*6fL+gOI3bWij!e~$mH!ES!1vHaKlcx_Oc#M53#v@(*%*Tq_49lCvZB5$1NvPm>>5RHNlijsY9b;b}M z!|Gt{3iGc~)Hz@3_Kv?0bO7sC6bpOyRMoG(IL@!xZl2>ujt>7kBA{ctmW>8rF>KO`~fuzw$s;m!8q2x6-YO4(E2+dAmIZ?C1 zZUNEV+2YP69nApvCK7u_&3F~ur9Hn7}HaUSa=A=OEIu6jOo?| ziBT!x*}1kk*WVy>#BBiLYUmG$`|7Yb;sQDL0`(rz?IY1dVXvF@1L=SMPXMNb-^g`v zeV><`^B1v0fYZp|MfrS_K}JA)qbT1(<%cBN>f?FqMc!kS_c;&Gc~aCB zOLA|bEwTG<5apkt^1NN%j|5O((d|DGz-;1}GMh&LvN~sH($2b1u1m#y>h=IylJ#bf z^Bd{W4s02P&3{C1mYsdlqrX7Z$Hc_@SZpDfSQv$gg~FB^Nn6T}*07~$tz}@t`~;Gd zWCc+VLf4sSUc^UXzp#}iGO@R&BGpp}jO6f7Ml6o$1p?DAM-ni7!T_ev)$L|#i`fX% zuP02`md4S!@lUblb^C!>(80H8TOvm2{3^vD#x0DAV~aUrH#H_C4Z%`4e<)L!&s}u z(ex^$`k3Y2?_n@3tA&4ocwiKAoe7Ic+j*g)&L-*DP4v*so7twVv`}+Cj2){#k|Lqa zWuOAI-heWYYvb$9j?^tjGwit5#4B_uRrLWIt!=AYow{5*e67I{O)1<@;5d}<=x-(tuaNL3s5N5;1LrS2L`Dv#Kp%PSx$%yg@$77J-~VNsf=M0eB}~(;3B1VdrUTR zW2F`^j#kdTUU~BRH z!TBeEn2jR3ea9cDy+^sE!kN1dk+lX|Nr;SuUka8`x35RJs`?;jUq!n8GE|O)QH)jc z(qBn7dm({V7as(MRD{eYP$o9Q$%v9bgq#8dpBBL@Al=hg3kHqVjInM-4yx8uZc#k9 zk!FH&8}YxD76i~#U_LPk6vMz6#VDxIOayrzF?iYpNq;n2>zwNqc8FWHRQn9VSk>=< zoD3?b+o$oVnUlwH<_A1tKe3tG_JiK#2-ZJ>(wRR;2-iLaJ@Ulwsf_*6)0#WVlVi<& zDazEI-dqc%4{q)yQFQys!O;CVxw&Ab~xBSfJ=8K|#?;YIS4av>T5@jwry}1j| zY;LG1y7RQ=Qj?oY;ni|5Ct8!3J~4OufC8rtb`vG3_Jzj=Ls!d_V{`YaDDzURt;ABW zGn*@;q|oNP0k$_Fe<;qZI+)Fa*-Ar$t+cN}*MlivHz^Hmwur?{^oi`9ENc}^;ktd( z@6ZqkWQyKVcPq3b&$;y$fy0mG!}5IisF7{9KU2S5P2q zX}~9dy_wbzyLPVj5(yJ()-mjSB|NqU+1js2WLNF0c~P(htsTQh!nf`8#d*g(r2Y&b zw6_oFs9x3;I&KWE(ry~Z2}^2WeS{7Zv?DeV*PcQ~G@`YgM`UUf2nVQn-lgcVX)F(4 zLA@^I=*?+Ye@#D(jtCW(UBr`&cvE4N+Y4qHmGN zD?g6PiM(T2BGym2p%cd7m6+tqkyp5j>b;M=M8u3nd~ED^-qHR*Mm$5-cUSEPASX=0 zs}im5fqdB4HM(u$PIipc&A=E4b)Wr~)&UYqyqMl0dS)$&eOw-0?1*k`FmxjK%#yMXJ3ZO~VLO#{ff6UeFC z_aYLSaytqcg6X2%i+r1wBV!|V#bt&UsZPaaf*nMR=&9D^KoXWQy>0|jwatk3T4Z#e z5*RKB(nf4Jm#iu&+MQ^Ui@KU0Ci`|~8HI9g);Mvi+}GirSntkgaEC1xB;rWR^70=6 zXuX$pIMV||^?D`LXbbg^SaJkrM&&8RgdBH0w@=Z2fmQ47xbh>o=5Cca-S0 z-2w>{wgW<{IT)TExQ@NcW!IVvx!PJUTbKeQ z95$Y&0!kO{Vi$NY*{Nvybi0E${wPNUQm0z`NVj=9mypHFZprhqyFhA}7J1pn@_cz7 z=hcMg0&TCw>;XptBSqB7Co?!UG^HBLYzz*sBjnKT2Dz)#DRet2#*kKsZe>|8Sxuy( zT*Ym=K1j(dt8Baxh9=$K|4TmEBeh|)uB;3D6Dh1!dmVic^PqEHqF<_I%Q}=Gn`%n4 z471dLiC+n=umUM9uTcTX!w-`nTnAH85U#3nk0f*bLCs*^LmCwrMkw5=96wgs0&f-BXunt62 z6MR67Mzy?(oP_LEitL2!C6g5U9kN&GHa=SqP_twuGtzWw*P(in5S9eHYI!iZpD(Z( z68-G`<~#e@2BFK<%ZUzALK8vvlIM== z_%T^Po+IBtoX^LOXeS^#t_2b`p}uZE3?&anI>i6R70$^&!RXR6=`aRV(L(w9ZRyQ%)bCTY2@|6QNo09 zgF|t?yTnU*zoBsfX(lTTx=B&TfX+a@ypwu|d^Yk;jow2Gnasrio{MKrL!c zj3u_@u0d?yAuphv80R-p@NosgM15bE-ik@$dn?%v;-JM09qV4UauY}cAZx>30K#Wk zKy}Hc;L!4+dDVg78MFqdC1R^S$yX<9`PB{b!E5MD#zJV-#lM@TEUkT2@cjT~p#cHRCklGzNikYRXRJGE=`Xv;v_Dwb#$p*j>DF%6g#QqP2{Y-Wg9`+O- z_UE^};0QPicNLF(;7Uck&dOwrt$s-=Gve!kOubPFHQ1aZm*zx2WsR5&=4-J5k%zFm zTQZ|2H;d4`DeMF1RZHh6Iy7E7OFzJ-9mNbSDHgM~^m0$t;ef^M%nw{n0q0#O19>5* zA$TsyrpwhI8vkjOF&xE>nf04mWW6H}`jUTf?4uQTVZ|}Acj0@fLOk+Tu{$}Rgp8t3 zy6;hN^7eK*3nsqFvKE}cvK-R`S-SmWhG3Qt37jiNem9<%O`@@aKd6>pka7^NScho} z-DWei$Pk~f)hb%?NulP70KTR*SM<>rn8QpHQPPT9dTSLHqLdyzmiS-e zk@16vTvl86@7yRY&b`N<1-8$g-xRs6uB7KjLNM8el47Lhb!(H27n zg2`18v71F~u88?WY_W*_K*Y*KtU$z;i`WDnW967Ok&rDC)=`3L;rhO_72O>JPu@gp z1l!1XOe$81(JGN@RzOw9^yq29k*M>a5eotxsz5=-AzD2uu0^Fo@8Ok!E;Wz6qN%IRV`a|iuVVGhORLLA*JlpHlRdoRo9^{BI=8{pfE3{EjA6$m416nwbjQQKNcCat#b=0fC5y2c%HHM4?hk&fe zp!Lj!Ftr#|z6>Wr%VXX+Y)aS;vGXt#XF1f4wcnxD_7e_p1j++9$R!Fm24J!&3sBUp z{$7KQ<8~g9SyYy$ACjGif~^UU8y7j|fB+33rr_7#)qf$n`U+&9IwxJ54jQ*>|GF$b z_TWXumV=O}ADBQ$|0@V8ZuJ=fz}THgm)QvbaZ+}k45D((?dR-3eCHgH0tjK0!vMvI z0O%M1;4)%~fZ{d*1>_frL-B_g6kZO+*MQ=v>^vHL>)${TmzA;W)U01Y>C^46JdDv| zP0t0lUWybhG(8(jG!xs8qf!hP*@+AsN5+@^gnlsej`-TO6VZPR-Bh>>pN>Ac5C0}|UIqc6SW48jb~3Xowk1y8do z&I3z;LJ1K)NhYT?jY;}TM}j87W|=`dJ4Nq|*Ni0BB)d$UmV!4ozKnrErGSAsYXidC zFF_{Iv6Ti-{%D$q09Wnb1BRl^FnnpNF*)e!X2hR?1ykEWBDp&DAl6M$r)c##-U;jLfRzJnM4PpZL&HuMYk_OI*sYHv2wZG4W^khNY3%FZnn?Oj`8); zetLlAOS6`UloG+F&QT>h(~NDs*ppop+C{z>HS z;<;v?+s`EpAL}J3@_Y=E9n4Zn=u2$)l{nyYo?23-{e-r4acVFn`WYqMsxT0+&6U)8 zm*%5PoOZ!nmQ~JMeo^EgzL>{}y)4JVksLB>IH1j=mky-(pEP zUaMK_fTG$4Qh!zZON7;svnc5~B(3#SeG-tw>^MfjXi)V@@cb5wH(N}K$Vf$o3|id; znuc%q&4dUou>@tL9xMm0x{{<1EEbl^7+C}YOV$#ccp4)&B7%J)_5=1$VGr#et^Kf0 zWQWWBR7tx`l;b!^b|fKK3(*yZBq%F@A9hRK-uV#BVRI2zf7%L)G3o@h1WMAuIWJD7 zBX<#(4_h3dnu^7c0X*Iw&guoZfG)Mv10zY_Y#X!d@+FX`164P!lW4$OLZ6OP8u~5DU5Do? zri&ZA%$y4?#vs>tFbcn|+5-)VHswJM z-(;sA$W}s=ou>ln?T z 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 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/x64/v0.8.10/nodetime_native.node b/node_modules/nodetime/compiled/win32/x64/v0.8.10/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..989b66261d5c789d8a7554d6699a7eb1b97da853 GIT binary patch literal 78336 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 Bc+vm> literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/x64/v0.8.11/nodetime_native.node b/node_modules/nodetime/compiled/win32/x64/v0.8.11/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..db9e8695c5c78c7469791b4b5a7d79322f8a2316 GIT binary patch literal 78336 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 D-JE%5 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/x64/v0.8.12/nodetime_native.node b/node_modules/nodetime/compiled/win32/x64/v0.8.12/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..bb6a194ebf1d5842f9b84c45868e8e71e9bd8f27 GIT binary patch literal 78336 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 De#Lkl literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/x64/v0.8.14/nodetime_native.node b/node_modules/nodetime/compiled/win32/x64/v0.8.14/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..15d7302316431e590883648d2bb1c3d9b8400347 GIT binary patch literal 78336 zcmeFadwkQ?{Xd>G2~BUjQy@@o5}+tr(Yoqv4a~eD8Sh9kV2YvwqQ#2y)STD;J-&$(4yFui@d+j*Evbr0)FP_ukYva z`+fU>d*GOj0}ZdIZ68}> z^lcw|-Qqi!I!c$^cgK=j?{O60dhfmW1su2C?pPAM*Ky~)4)@G!9rxU~==MvpveI+o zP2V*3g>TMtwLG8r|MMT-_Pho0pZ~D<`5XB64bKn5_prj7o*%{IbDkfK@AF*E&lmG} z$@3%l_fMZ6!@sZN-#@*xcrmqk<_Kna42DGy4KS=9^OM<$yiUV7M@CAz!SF0n9ucX5 z3-N8^;W8tAQ8>k5u+Rto65ock$i?Ihzt4yq7b2ok;_K|VNO{$2G#nafFg$+DV32i2tGYD(Z5x!7wV3_I!><=1qYnQ|@c)cibpc&25ycG4Cm=r`0~vzvOd3${p9?KqQYs4a zF=DI+OuNBxRyo%tOO`GvMi!qF%nhIRi_TT<_Pg&x!MOxG=E^Vt-xr@%ZYom$-`_cA zprB3(%T^_949m8L*49=GHxkm}F z%+0?>&5X!;^YT$XH7kPhCDND*-kTDNT9M%kr>!{FRc{QWDe8YRHyYQ40V;z zX2;D9s91%HC`iRD+6*ef8bl@sB>_))Uw8n`M5VGNkghP}Mp|~=hAI;U@B;qXqI_~Z z@wgZdswK-(2TZp1i+_*t9)0IOj(0V7!`b7lLB-^FZ>A#W7;iXR0Ln*?^ z*PqY~(h@5v+j?{P`jzwi*;XHxxL;jrQjE{dcE^|0>nrw(C7r37y|UgyE4$pTsP=Rk z=31<04pNnH_KIV2?}Gke@L2;ym3?~&vTR6`j3PQa$J#Q(_q+8hUFF%?z(2(0v}2K67%C>x0En*jC;C_A6(WIs<)M z!`c0Yi}^A4O9;>ETa$v<2Y6iuz+TLQS$ju0nKAp4Xt;KL+T$Bqo1{ zb_Eq=jeUzGAQ#^l-*7QLF(|~-665`z^n3rV|47gNArZW1((iSsn51Wnikywm3Hp_o z`vg8E)_1A{>+I-V=WsUm6^5QzqciI#(i5{#up7(W{kOz&xAOQ4FDK(P9{>}3Ps~pZ z2|az*zo4#91dY}ZPwA6{`Ymm|zJMu-f8WgypG5gS_;4+dHzy%8D5@`4kweY8Zh!hE z)Mf5mm#3gbVPcCEBJC`G&%o?lT5<&x#6ud0P>Ns)6isg@Nx09JzMB7Ucci&EcX{fkikKdpb}x#rh^ioNSkMb4gIe`TFi zaVL<}7xv{k=3IY+qTZcbtCSyJ2fS67-HyjY|cJWB9)ie+%HYyX*J1KhVl5T@m5%yZqH5TjS*e$5eTdzpk76b%*}2#G%9J@hI<6Vejeo zOL=8`PQ25_qSGRzg8b2Ztwu2PfX$$=p4BrHHUmj{NUEp{Orhj8HfpOB>j=$GVL36g z!fpo9-Pz>MB^}KG_$UX37W&vW%viy0?ZIz#vG{i;val}kpcvDO$yj&*#!E4jBdL@}B@q3BQ?3 z%A+s*Ty6*I`NA*fw)5}Tb3xT0ud;VJ_xDzz>t(IFJs>Jz!gPBf!bntDJIUCdgZTd${(p)8*fSpN84vc1N7C)*Q!UlMfiU>UUI=^}3*<^7n4=e!_x2yhzthn^!4sXSx^#J5sh^*2%Zp~<$od0wN)dzA7{@bH}9 ziMnD*RwvsMyRSr)e}>BQc6mP%ntw&NuMog&;+V2XKzR^5X=k6Eb)Q_Diuu&-6=+G; z8$Hf%q(|DYWfV65VZBjyc1w@^3Q->u6Ypd3gDLY!jmZG(mferJM zNKTR!L_G*yXQR2oM`8Ci)5IkA)=!b@DF8-t_n(vF;J*X^2ZD~g6CbM*n~2z>@t7+%0Z(^gujIUmN3)gMNY z(B@K50a|ZB8OXKq^=3zFm!lbWLTlg^+Lg+>fQ{C+*{x1pt{u6?V2Gs@93XHUN_b>= z>EiGMckA{!e?p6trrU2q&`0vMFMM;UZZD>&niU}AgdWFH7CfMt)@~Nb(R2C2L25j{ z4r|BZiKE_e(F;-7?P!JYNBU(sjgnK)DAIseOZ(x~n@Gg85nj!(!Y~mu7u3aoF0E*s zn!`d{)?Q}BPO9fAG+jiY4^utl12=4-*T~z*=aZH&>kd><)GXR>x_wEaCEY$VUdh2L z6(wWgRNX$F1H#AHBv6whB*#ZrFTXk#Z*7)tFMkFT@6Nr>O*2y>ec6H)T%^=&kIP1G ztkgoKdl5b&pPRl?q>HvHmAhA1zmn!=ebFeOU#Q!kiZ>`=`b#oKZ0%8saTzAb))M=J z^G^V=2t{=J7k{Mo9^sM-XYM{k)*5IfAucq_EY_#`%B;E)`>E|I{8^>_Ml3Gv~r9%hps7=JRCy)_~YAxpxnOgRH>d`Xs67<+Gnujl^ z-j@xf(koIm(wk%3v{yz^eEAsdd8`rwL$N$NVGRZ8%Fr#xM;Hy!O|*Q2ksaGwxjX2G zyns}aPk(`#*PFwZJ%|_Cqvr!REZT>5bXIvFXwy1!Q11qGqn!pwYbkMAXv*Jlx}*p0 z)qX_%-w`^I61-l!1mTU%DF#C=24v92XQK&5{8g$L%2&6IW!+Ep>`y#NS=+EQLm}sn zLp|NT_je$XCM5*bAvRPy0hEe%fRuzzn1ZPo&97kX5i7@y`Ouq_e4Q+0IoyJl?`56r zJsPICdXvWP2crYhLs% z5_#pvP&t`*981J{C^vM{7`y_Ld>Qfzc2m6%ke7^@(TIIE60Dzn{ z1+PrDx)1VUcl*ee@jKaZQa1ymAk+S(*Tgsl!%zgfWZeAx8* z%nb<|4rt%B>5dZSS+r>!!Y0yFcZlr<8Ksc#x#$Z382gU%2xv-G7&Y*I1*TB9{}~Ge zh!z1&_^tr6pl!2|gs!<-_D_+EDFF-s#1N1bsCI>@j|SXerpU^tkc&bPH7&Vll)?@l z>dzue&0K|{Ijr@j*+8ms3YaAaAZ+QRvT8gUs)NL0Sw%^Z6L~9^={Xb=JQsAuSsqcAfnPbenjxa+umiuMbvT6ZUuANe|Y4wiTp_A931c{8Sk ztT+|9E~K#I+B$66g092{{sLoGe`3<^y#Q0tW0Wd_@r3zEzy`<)O?e51AY{x#M!9|p z!;~s&5LVPlX`?`P-y8yQ698xanL6Aqv%T8C&ZkKReW)CQfp>hrt_iOZX}McLJ(WEYFwc zab8V$F3|QG%pPzgFib?9d@_ThLsP1-%*No5T0#!(ZjifLokF*fVhm}8=vI~mlhr`y ztyglJt`AZ&%PJjfgrP~d_xzeq_AqTQtt)GX9FG*%ti6FghYMr}Q2KnYKW z;zcrsdc6_rj!myU3ji9Y+t44K+aw7pfDtlG*$T3a?Z@df^IEl0#12EnRzu@7BnzmM zdZ9yMCrEvAZVimp-bTr?H8ulub#?;;rES_Qq{I*c4B=_`M)%Yu8o8wb!#eT|A9u78 z#RMM^qfsq;kdu_XN|2qDy=0PNzeDy4-O6X{x6~|I$&56e+DugMBZT#VUA2%NlI-UT zY=&e%`@i|lel|jSGN{+&Xh#s>$}<-C&R@}3Ea?-7WLr+=;tSG;MV*!t8=!>7gYNa6 zJFer$WdV7Pd_8eKA3Lg@gy^^yNYsG(x;+bR!bpes-+266D1E>ruXD5XAb2gpJ>I-i zKJ`AUH}tJldhlVS5nrE!1qKp$om-a9*+~8@inCskrnV`jHpSVtB%8|o3$Vj-05UZ~ zm=LaaD9(46cq#8m8W)gevJ%lviaH8(2I}R*)H~!mfZ}C4An)-w^2vbuGm&ZHnIBS% zniFG*FS)B9+jqzdXeTE4O$>ZofiO|m-L5xdlK9^0YX@=AVup@)EL*t=qydn%U@rjS zvn-&xWL0ozdCN8r^8=)KypXIo(?zjw6i&znZM4b z`a5*H^Or4~ z`-=TQa7cWVFwtw;=VM#Ihq>UV+pQ|5eg=x`u-Z4+Xe1i|L$nCw1rqzK2>Y4rC^+IN zIO5N1deISZ7VIt>cK;QMI@8KzjIC}-Dl_8i{!G1I2}NwqVM}vjpR#&P2Jlbc0p-W2ws^U9@j6df8bouwaS(~e<=mK2FuTY8zN@<_nqcIE{xqk!|SQ-O&g zry)3;WYgv9kB$E{${3E~#?1OnO|ssW0DZ~7IQG$syRhPz*t_t(R3RRDi`boo85B zTWy9W8R8SRT6r@*Db!dVz}K|K@^1P9bC_i!N?Klnyjmz-2CWHOZ>_>Yl+vlk6aQ;0 zviWv>k!OeBs6#f;KZu=eIh8_fgm@BT^revuxK`A-A9edMB(6(=Uj_4(x6pUY+72XD99Nwh@Mn&Ats6@n%jyUL?fBEkfafdwiq%H zOs@8Oi!E;Wz1eF62RV`a|iuVKthORaQA*JlpHlRd&Ro9^{BI=8{pfE44EjIMpXIR!B zdISRJ5{t$`)dVaK%X%28SYl!n&(Uh3jmL>K#Rav*x?s(@aoCiw9b)GZD9&=I6>GmktLY&e;0QDk+#r`I;3$B}rYt~F zxB3SSI*!|UP-Zb%ntoVz9u77qJ#Jj&m;(aTE3gTE{ayVRpsTMy_NjBywdtU7yY{b3 z6JrlvRAl)K67~J#2bdTx9#T4On+N-nonkNAY z0|-rd3^o-*U<@i&Bcx3bok?^s+9Ip7QgCjBbQ;qcW94$W8%#5&pPb`i9qc_fJI>cf z`w`Y;ZD`89gSZU=L<#nrn<#=Yx~nG4L=bXTC43vPG+8}4T>h)1NGHh>pop+C!m>cQ zyLoOd&+XxohL3d-6cc?6k{!%aO6W^$_?0-|bDmyOs@+N3x+pc668kqL+@dfLuum$e zv3AWznK`N)xKFI{fm;GL(*DLc(cW%h>TQZ$e`5? zplSHl?e~WWEwKcpq#i5>uDbe2A6P6bl`*;q1eUBNIPo+_Z$Je5M9^aFpMp->KU(V% zoyZQC`>B$4sVK*BknBi8uoj{#3`tN{FeKP5b^ERdVGf&%xcakZP>c~LsU=X7HqLo* zDjmIxxO~{+0M%41h792G_Hb4g$OUw%r5+fu(v;9O-FivWRNav74lgkwbg3b|aq49h zo9?b!G7X~0M^qtH55xU6-J%(=z$IH)*2~B!aTf)0Z<8u62MQ?=KEa%UBCu{7e8rA8 z44?`=b+OrR`m`uV^5rT zMwZHoI!gdtcH5<8{eaF-?*nk^*}%3iyH0*6p(d+y&&sOU05#b^!z|>r;ogO%)jgSdlULv34Q;kMPp+)+uz!2mhYFkW z0Ecg~Qx9Y-p~=qEf%Gz;(^?kA{(@P~ovSyxo!0X1_8JHW`pA}0-E8%st%gxYVr3`qN{ z6ZqG&1ap?5U4`94CJIi-^&P<)K^FTMhWhTK0B9rhfc(&u2|y`2e|i1_YI*c@P(sK7 z5UEDews{=@O`ZY}=xLJFFvoa7I%cr;^LsMUe z){cXmmN^Z9SyX!nYL_{usHMihB}(xZ36)N}o2rIWsm@Yv+@Wsc*5gEvX#&Upx-|N;vf>|2`=LPK!AWarhu_3v?$ln#}=v) z^q^f?KLE(u@fdGz0>XwUE{=f{pF>XTwe#GayU@>$;-o_k-HxqIp49v0CSoKQ{_a4k zFPuV{U2vq#IWCx8P*-`xwSJuRcpWrBrp1b69oquyoLX(FN>%hGX?+3Z?9l!-kt6Hi zGYcTsRnZj~S$QP*cUReIM_>Rx(}I7ZM$#Im>xP&~(YFD!R*2bqU8U~(>jC+h?FLKL*bsF)rpbIuE(jd8&rR%{K9uIwV8ooU9h!f|MZ zwZ}5ZEvd2#<6xb;qOok;n?U~q8dK+C3m_9izFbxxOrSx{Q z)=pT43L~-D1FHdW10Ot9jL$sQ~ z07Ce_YYyR;9AT1%D#CwA+i^cEp#DYRY=ruM%O$j)62Kv~I17Nr%=R@}N-~fS|BaQ% zW~1#Wt%RqXk5bqkG_!`FiCpACkrXm(yGSx2O@MPY| z16D%yUOHP*ha6R$yOsb+w`!kq;jf3bL7`7I!}^T<;xQS1bo891crc+q#!gt z*p&<&_JzqqB(I&m^OapEx!WW>R*m57NSa9LV8`RotWvCDB(sU7W$=-8(#T}q0|1-yMCpETY6*)RCE&miUJ4o%m+>=;x--M$a$WWhrQVl9XX!4E^do6hk9bS$_M zJeTB;c@3P_B}i+*Ur<+_axuQnEo)-R687v~c~>2sA?lgGPd(UFu>9OkThM}o$b85f zz@45I=sIi}i`AjwUx@Pqq)Z;LbOgvw22$w+C10*JqcrKP?Z~a+B!rt#6TT52@k8uC zQ)8hCdx+^^oG`Hp`8+Ng#c8?&N*qqpy1pP82#8F|qg3$-)nRMb@fF@$R0JEQ`d}T! zV8bFI=5QkJY+h#U)XDvRoAKL6^eE*g>JVS~S$Pr6mv!t7vcUzV zrVxEYwiE|gJrK2l#J4b@*)`5>w=l0G^Aof>=)%lI7>>VRZ?0>d6C*D4Z@-! z_S5pBNBg8f2sXriR9*yYWwI`;I)>OqZqSukenl=&;lDj_4p=FN| z%v?@}nJ&yn5=*CvVqP;+lrW!{=w8SW3ALqHO$Md9rJ;rlq0Z)DDr=59c(I1$eGN{( z1Wq%{9iP!0Viy{eO+R?{;G`$>5O+2OGL>%hW0{5Q*!|qzs@oq}PSXw?*X_zOXg4@~ zC^!KBhx>cOg-EB;g^A2dkw7kog+81w)Cl^8l=1CKO+manpYxzka)TC(e(&GFitarK zwId|xFdt59Xo3nP$N5?~Yr+6JXT$!27!OpP1KmtfU(U5bR);X(X`zaiwN#%@g)2L- zC1kh}e8u*YnbM;D6F^|Vr5w&c!EU*RT;8;Qj0IRQftD(&2RQ8qR?QQq|Fa+u@=^SS zZx}jr#JLD|srK$==mp#HN}9n!^h?K)82v(F>q2O*4;nfQU+^37+x#R5K+k}qz;97A z1~-XHE5RGC6fGxW9P33MhFA)HF8~R+Ot;H`qo9RMkTkE$2sf{<`*Fmq;xPC^nO z9SCc#FqH;R$Don-#4#w%jyMKg%Eicex4^DXcHH<;{xEm~;3(gyJx$`N{XwkkMoJ?) z0|*7|zb_yuVH@pFFY;k+0Wo^WOiI9h$TOfHy8Q-@9Po>W;74X4ny#@vOw>Xj{9zqH zW*~>_EC~y04<^x#6Y&KA1oSC%7`iW*LSM0K8L|KtU1|hg*wHb*hKjFY;wuMV$R^>; zLMi%$#vl!#7k~Py_W5jofsWZ;SkT3Gg+5P_Dz*SM5D45xAAb6n8~WT7xHj~;IdDnn z^8taO`qsb|+7v4t6b&Uj`YC{lxqRvbl}y%{4}3*oGzW4`s1`{fe8pBGzC^_DqWIm~ zBT-s2VsC;3F5x6FL27-)mgyi&MK_vpd<$CZ#hG`c0|x>1M0K@((WMqDmQv8-Q*XtQ z%*DAe2YNe3_HUMT1Yi8|!6IYbS7ULre)hPhkT}1_!&@dZJ}b578&hLd@bO z9!r@;EbC4XX10s=1hd?Vu&LR(Yt=#Mx#U z?r!&)c0rHvjo;-hZn%aGu__YH%Q|CPf7*H0U}&gwI5Rl0Y33wC+O?+IuMo7IDQv!NwSha0aA;Ua`D zjfck~JWM2~S9AqyAz&JDDuvI}{PSD>d5V9YBLWd!ESq^m& znF4Wyq$)Gb$G-BhsP@RGU~dPMqS3`%QR|T^-@(XWEO-rkTerVeiU{8>QpIDmRaAR5 zGPt5%^m7DAT=@mxLr~rKQHpAx%S-G4XB&t{b-Rs{Nwwb~@*T=3R9t(5WUEUN|Cx_xOp$L40+{j3p(sl14A^CKk%9O&x3oL0|@pC>Mue{=j?+*7a{ zn~AK)14-RYgLoJmUE&UBYZ^q~H;AT&bF@=9$jA8uZIlKm6WMS_2}M#AeQWS2Y6S-9ZNm;H01>FpMA@M46V7@bH*MFpfe<^Yj7n#y%kW*nS_Y_d?(Zj`HWd z2cS|)riIOey`g#z)TLg%IT(#i^yTfECT%c}D3QY^FX>4DI30OVM)j89C)A@Ec_T?? zuDln-fH#>@5}r5vG=%0^v9$yRQFA_|Xb?rf>mt$y8@4r?+Z{Zn>ao5%L-7jG|ekfF>*|r zX6xcDqy&eAc$t*OX*tGNs$@&~T3Q27sW>8HK5>0!%lo85f?B&(mleK@d3v4K)E4TQ zwB##QJ`(E5UN)cx7Ar$TdBjcRoMtz4e4s4-m>eBt=8oXm0iydF`v{{0YT+Re%f1gV zHD)X#7P5CPfQwm#i=;#aN4cwvS_7I)EZ9ESF%z(1Px-MMstwbsuou7w;yd98P2|9; zY^|Cq@_n!ctF<+O8~K>;S{x%8wA)Sm@D&pRq`VrmAQK1splRQppm_qzrkycdDKZA( zzE1C?Otos?wnO-VeP>tf1G?m+9YLJCi-{%&VY^^B`F-zo^xb;c>fhPFdkE~Nd?Ro>;7;wRHEg0MdU~1#z3~nSbxOiAXI72Wy zGngGC@6>o@S~H>*!?hnlZitJ2*V3_60)vGQ;N8bbC#PkE_^IF7SANFbu3jH-lF_sS zDBD$Vz{^gB)>w_f^I@_Sw&X@d%`5|A{1&Yt2(1D~J(vBA+xX50`wcbOLML-qwg_>7 zTOuIDK#*7o@fviKj2XoZ3jAtAxtoEou>;(;(O-slY|6zf<5+DW;9$5=nWw;+WMt?8 zt1)1Q^sd`q0Q_W&84PJ9ZYGA9u_L$_l?qS^%MR01OCSTTIze3ST1MsJA*1L!gCBF{ zkz{>TWN3ouq$E=WK^4p%~aun zf21pt0%?&UA*7|0!0{A}wJTx{WQim*PccJK^hTnV;A{~v!LEmVcvbR^1!mRh4Rxdv zS+aUrLxVKNWk4Ui1LAdGQ=)htCV8Kjb{_tD%a0oz2E)>+)F3p&bSs*4!0)xg7oH7S z)Scc*sXgF`NbE#nPjD|f8xtk3m_GND@d8iz3370RLlYV_NIB+oDaW1eQpzJ`hy#qn zN_mt@)VL7$u}smQPijcRe>?-keCfEaa9w&1qFx)NQ3aw~qRWl1iRSf5Cr_3_2~qxtQj`2{BU z(lPbdrPCsKHA?HCw025s16+KCX!&MiA$2}ma?fo&>ujQL5k3=l|VaRTzfk}dXU6-5VMmd|eDdMm^HaupHms#6e zxB}CVtSqwe2|2FTe-myL6j=i%;ycC4WX056P*+|=PxS>eH)epJmK4p-!6^!!UcifE zlVPd#vE4pX1R|$vh)3Emcfd8O&yeH6NyB+;cBap{dr3ODwW;0*-(N}ABf#p39_O|t zhp30-TQUR$@i%ZVh&W$8O9u27?Ppj~2m|B%c{r7Aqm(M7kbEF9S8hZb)7=*8Fvi_j z$*kPksY6^U$Ng@uTbSUfhp3}}G^c+wzi(8P=gKt$FgXxBGWX%DXjW$cwtE{%L1->T z2`%q2z*@;>K~6~|)j5dfU;@kMqOnfBY$3kLH(#pw9omvZEqbThnAQg}Gve4RNzfAU z1Z;_T0yq)x3*Ei%#-Rf&96BnJF2Ku5fEP~_@WDl2z~?qr5r8!Ny*w{&pe>)sbN16D zuYm6R*+CR^MgsT1{+*cCTSJA0;5@k5iHU6q3=I_#=eTbtaSKK*Xb<2R6k#!*WC?$t z5=XLm32IckqEGsTJRC}ld^&XoTFnXxu<|H0K!auxJh!F!)Y#SlFt zqSTD`t_aiOfb+Yd*29Js7!j(aX&}gd4uKh6Pyy|)R9Jmr?%M(lEEXzWG`%x02;MFv zYNXR>Em}F13#|b*Kq;6BY)IzZ!E>4%B&WcY3xXn@({SmCSZH)Q@`0-fed9esB$?_@ z_OWd27+5~|3tHMGI5hJkbBq_~Y=1{Y4qZj}QB{izxQQJF^YT@oBG3@}_;QPOwaXwa zK;lSf9j77S!viW*Q->kL^<2y5`A<+ZmM45t58*_6t)enYQ<&Y^j_J6bb{uOL1tMLD z;Edg>&TweQ-se4&R3+|`2>FToyClza)Ei-Sj=oLD%a{o_UH;QvgTUjVhXYpGWV{*! z($U}!&(HLQ=bKBu{u?Bc-L&)azO6QosiLD+n#ZpdRfR9TVWR;b)#f73=}Fc8`kX?Z zI6H)}EBqAaDC&#Lg~7heLXcPv?!Xr}*q4Hi!gCQv9dx}1#`o73KqsYc$e=SB-#GJt z<-4@Xh)Y6x#M!Xqn`(FN^^NY_Qip=uR@cWal-A#1bi+%-?W|umRL*OYSslorxs=?7 z{>!1&r=g2bQ%ZFz+zaA0?GM+>rVML83s=_2o6nT_(JbR+eU~cBg+F8;EF1z*d&#kgMI+kE_aQvSO)? z{2OdOLZ$_r=?9x*S3?m&6PSl*U_Wq#dWJ8vq8W9nBbF&sY#>@ur*@pt23*uJ(R-G_ zh_CYXfko$@dU2*e3n(rM;7$O004^%HEI@QjxFTys5X*5eoWT15P!h<39mjhR;U`Fe zkKHZ&y1&FFF$m7j2&JCp)Hyl?fjBUg4$DV&>KVbIwBLvbBwU9rTIE*i!*UZz&f$l7 zU1ss|7}k?>9W*6+Q0Wvov1jV`i#~I{=wEzB%1lpGlIzAr}Pu#*2e=>>=(}=QYw}MuOSDV8NGTlXs zavjn`WcnvZg!2pM<(?myR5;fdm?*6;l-4Uo=kaCsyq#$C%FzI*EZyui?e*rh2EQQ- zR$)$X4_^N}ul6(=D6?9T)_{o9DKxN* zwp{PPs(|c1^}2iTG5Q!dzBh8n{1zHE%v9YM;Y_AkF3bsBR(PW^aIv&L8>W7vvu)XM zkc1zMma9#&X|HTGQmWt7>TJ6ob00}593I>WW2Mz^df%IOIQRzUt^7+G8bKNuANtZ9 z7#8|6E06&Vdc+%IXm5z2y&;D71`W-Z_b#Rzz}jZ0D=#{>k%k4+q7>KYym@53$;vlUFYvJuUPIS8G)sp}!y zKPgh>34C=~9>Y2r#RVjKbijZ~2tx~5%chyb76#)Vn`RAL9^!$_u%(;=`*2tG)b9Wg zFg(6VId)HZU^1DF&B2%X9Dz?$oU`q^u_p7DM{4Ei|Oj5A#eDV1DNd z*w*skkr+H5^Kf+=6?~tbpxCB8gtA&K{LX|CDrPCb5_~DMEyRmKF9PJghRf|fwurkj z<;&de0Qo*NbLz9PMHyoOqUuazRXd#EA3V_6Occnb)KItvP8lWsq71C^)?P6|!g zfMf%#i9n$3cmolM+lb!(SCfg_jJ-sW0V2|C`+$ORmc0BP-F}5pE}dMV>YFfSKO>80 zs&?CEgy$)t6CKN@0gip2CLClc4**2ykGK?w2i$P~<9fn3ehhnGk!1`36K;oBaJX;> zC3Ldm{Rq&-1&J&%S>c^hTf3zI?o`- zq&I{u*wjijtFX$LBG5H`SInUOtPY8^B)kl?0qiOq)1M@W!Woz z8g{G!!6Fe!MZ^@yCR5B>67tDP3}eBx`BHT{lAtKyCVXFvh6h5_yCV+KPxKo6CDEx^C6Is>TMVMTEv{n(eQMgWo zb13|}2s*wChB8IfWGw zE~D^d5w40t}+)m+_MYw~)>qJ^NNZ}3< zUQFS=B1|fs)-1xyDg34gmr?jt5w4=}b0WN!!cU0s6BK?#gx68HOoU&ga6p7#rSM`A zuA%Te3WtP&fcQ#D?_S5jSyp&ExSd7&A+JFvs#$A9O0GzOhi6t$qzn=%bCL2lkzx=j z3z70Ck@CfxiQYJEF<^yy`}5|YV7@50g$lA64y2qfQeG1&6Ol4Xr2I*wKq1T;BvKv~ zDTPR}ij-9%#f6m9t$ZkVi4+AX$3)7FB4sgBQbeukBBc~5J)+DNB4s&Jz7Q$nc?u^$ zNc>174it$*iIBKgBp!c*FF%naBsPh}Pbe`y@2)w0Zq3i4M~T5Z=Hq`*!R>vpLd)*A zP`6-<682cx{DlQN?gx1Ac+wo)BwKxvo1S^XFG_566&Awqsn>ZR-*n2MtvLIY^Xm0x zXM;M|xH5&cyV>o_SvOt3O2yfzn=LeV|Dg_XX?1f_ZDeGw4skTfqy2*yrtra@LcwWabRjH_4{p00#=lGB}{f5^R&p;PMNB zucK4D2`&*zUI!UvT;z8Da#Lz6<^xCmVo%|u5Nx)|@WBTdFAgxNOqGC+n_K{(TljPn zc=iW;LI?E$EH?`p#^Pd}f)9txc6iu!h;TB)3(WISOeyXpMPnRF!mtA9Je56xE1AEP zcw8n@okyid;SdN>$g>!B`iaTqYm^8L`}bv7@< zg?=&UbR{`aeC!M0$-u`>5;$%ER{Rz%HJK9Q=X-^_*$hmKzrhAk36F3b2;AEj8hC(C zBrz8g@Zb!x5MjCsRfwo%-)2nkihVYzTc`8Y}cw@MK%L+G9V`da;mr656{2<9sY6O)D%&JAgZu0zz# zn%KL@cksJ{5Fi(Gdq2Ev;{qi2+JyxQ>i1GSSMf33Rp__JT(rj^uJzkv_ih9ze2*De zaB+d|VNpNpbh8to?ps#&<+`isRjmOqtG5X=A}K-5#J+Q0pjXAl8e8_ z=j>QE7yAMy`|*8o*>|CcldQM2J;=<3W&dXqJ<>Q0;pidtK@SsM6G6c$coJjzv5if2 z+BdM60bj7A`JQ1r_zj9U#wdUl_=4Br{0rUKm84z6aC0G&;h@_W5vFdyO2NM8$E+TY+znbfPvI0EK*Awgb1SW~r-9_u3FA!6_d4}DNeGAuMzQUf|zOJcUdiLRgIFPpE4?M%CjGmq~4Sj!KqbjO~Q4sBcqPGaYVIbZDDg}lUj%n|~y-JvumcmtZPDf}Xu{PuC zp}@xuK@E0lADkjYnbSdDrVqN153FB~V_M9H4JitxtTz`%>wxtMBupYGYl_w)o%T$q zMl_!1W}ne+kt3(9vb4TcTl6hI6&~!ay4{Aok=^JSWY|diGnS*}!oJP{X);`d6lB{P zJ=ti_-+{|b1PzROej7Fo*fe6;HguZepqo$7L=Bt~kdcke9>RyrAW{%#|0yIAJk=(x z_c#J+(t7{cNQX5el7K(CiQ>HBfgC?87AF&}t+=a-^DIMfpek>oBM%d>4@a*ByQ9Cx zHq|FocwpI|a6kW?$UjHm6YHQ_>=+izE(@{McXz@tnS$vqB}#3SDuo!0>b?>}3#l zaM(uo!RaE;1N=S1TlhO_xXKzlUwauX$|y)J)xnhLE?ktW1nOxOU2)zMdmVPU1JcZf zP+b}>BS37Cv>>VpPvT!-aAj|D#tqbXJ(tv(z~u!;LO+`1k{;iJXRQ>|mz4)(>6tC` z@D#2gZr2{bfq=JoyTab_sV<{p+ODm@_D2m|JPoEcrcP4S8;nq4MpjQXR&n&p$3phQ zzjV5@V%dGC!B8lkIF}xeD5m%D(@{#^NpI*BDA_izI%Kj}a_`kX+skP|<+HRs)EOxr zs1K$_lSg4cwv`p;2d;PHh!(%Fw<1;UZf~4soP-n3MJq?vjH!&xmbQNva1@3^Uj~7Tu7BJnly9))}hH2(5%eT8hWdlRXit^$6s?IjbHAJg4 z7_uz$f>501m>q-n}?m;>>+EPg5m^n*lH8+YyORfxF+H;cb6 zGiNT|KqQ*)VIR>XGEH&C5%=sotd zmkp@Z;gPIFw9A$85eOerC5eqbb=qkh5J086A;rV+lIsp!ZEWE8qTHlHXc901oOd+Z zB><(0H;JY6N`29n5ieVlGATHKHjLiH=Fe(O&EI%C8fOjN?IT*sKI$loEU%i0pC_7` zqIKh(kF;o8_knm;X_eJowcJFlN68+gkn%-;W!}mGbiz>{1@u9Cc!=SdGSbmfirC(*Mpt1m?d za`kra_&Vxhk5(d^8cISvMfaOZO!ZYT-fP(3t!TVN4sAKLqO}CHXgQwC?OzE(?fpMc z)aiOzVF~Wr7ydYi8Op(ph}aiiT(uceZ7n-qgqJ+(ud1@e(oRRJa6o+8MYy$kjE8NO zs|l@T_P$n)YiBfbis>ZAj*&tIP2 zINgX-qo$Nt211i4grf;)J(z9ii1g&t$^xZkXZN)q|K+L84y8M)L{7kBQxD|28n1N9 zs(G+-=k6SACjQ8QV%q9;_CQGu9bdHa5~U_%-=9mTr0@GPRmA19$O)*g{py0Yomnw` zWuC&x94K9h=n(|@j9OiZT5`%Zcj26#D#=}S1DuEZ>=JsRM6e^Upa)#^G)er)K=^<# z+~_*T`()4&Z^Unaz*K;T3F){_Rod}Xq`nPTzqHgHf)!qv}8VYk7R5$D1#qxLKa0X8M@E@t%>yK`|1v#0XN z>SZXasLPDn5-LxRj_u&Zm!dcqD!eQtkRIYpRjLd*!(4e_g{%7j2Q8S!8rTO;P4c&c zc7vnt&@QBginrnFtl+3Svcuwdr z=HIgDub4!^a2B4E;V8s#@`>SW;nYUQ> zScl7rvt#kxrbf(c{v^)WcWMV=n*;gc++_lBmpTvuQBbg!iAk>FfG;3a4MKs1#83|Z z0g=$=<${}#Jj|VBz)8!{1_s7pP3p%@!sadhqm+UTvET@u<5Z&gRZ9(^K!9k&l$mGewD9lLMS1|$YHzz|!F@w@eA zx3fcfIuhzRwbJR_vg*o;mOy4g%I>ZL--z?pWGmc;z|jai)nU~B1`2R477RmiFAFBD zBNmL`{v#HA*EeFuI1AqRG$Q4jX?kE$ASMhHD3n9TZx8$opPs-Xe3rn$3h=^(jpms* zvIEl|qr6)Kx%iavu4=y$6A@d?OD+d{i(U0yx#_Tp(yjNtt@qYFM&_^(zs^nP+f)qp zo<(??08LXda?W#bUndk(8gRu4N5s{1hXJZUH{991PMnk%W(SWIW`pg*N15x-LQe@z zxwM5Avv@y#6Ng!L{(~#Rb3+~G*!5iYho@IH1Oe*SkY$?J+!!gm(?- z-ewu8u5M|=sJU|JWAiz*5INz!Mfy8`F9zJ7>+ebQJp7k9dg6s%P(hrr<8fayS(yNa zPn};!S~eZ-7V=5J$3*fZbU@biYuwShL939^2BN?}y!iGZSPB1aq>A@~S3)}u+RIk8 z3#(FFLVu`_`RU!ND-t=Lwzxh}L!*r43M-Q$1myT%Wy_kG7du}j;>GOfjP*ad*IR{WYBGmMu^?AF*edu zI3kcHOK;-}Mt#guOHy5x6$e95ebB_34hTET?Q+>wSFDs`rbYw!R&!ZlQQ(`?c-rZ* z-~d^d&9UK7pp05A9ptOmg3)c`oU3-5a26v2b%-u&5iVPS_c!6UC0p1vX527ns4O6AvC%LYWuZ>Ra^)I*4bW~B z<|7MMiZppFOhIFfvDq7q@iGMm+^j9~QHC7(-0sfU<<8g>>Bx}7#@JYyWlvMhgV@$c zbc`GKFEiQ@Lr#sZ^XBV3_(^A+j;(mN#FNoZ4AF`!z&Bd?`2hV`B#s5>XBD}+#4Pik zP2l4Nq=1C|Wah$ue>V;@@cS&9PFfuEbc5kh?qts_5_}xS8h9RIU zZ~N0=fy)R>(k4Fyxjo^Tkau>3r(3nlVX?+A$0*@tpdwA!Jp5-g$HLVtsT<+9kIvE+ z=e{X)MNUiNzM%Zw?YPOCS^oH^1oWNK206XpfV^o8CZ6?hd$1Co(;W6}X7YgY&uGHK zo;D_@lz*vTP2s)L2BW&v80oNi)H^;2d)mu&Bb*w77s8F1H5AROY=c{=snP4)yz;B) zAW>y>Sd_l?!0zyaXs@@wz;K0@0UWqL6b6`ZD5W5;`%)u-EC7V-RM7Os%jpf zJP}Ld(4;4ziQOryz+bjA(QsY7;T{WnH?P@W+&q=J)wVr{)Jz+m$uQ&DQ#`2sg*&ft zYS^c?d5hbYUqJSYam@XjHb99xyhbhW7Tk&YB?Ax<5r-4xSlX1@R$J*&^NjK{aLXVsAS>|t`n z1U>???K~kpdNrmqZw|=5rvuL@;#bV*a76XA0TtWugaoU9GVF(>yf;3F?HH=O$$|Nz znLKI1?*KAw&u8wup6-1zv&n2btKaiE=0?ugHNGkAsguJtZ>SEw?fyD>&qr_=4Yteb zFH-!)d;DxGj@i83`~A-Pm3HtTC2}a`8r59Qe3rJb&)ycZObr7K;CjB|eXRA3;GXhZ zgkM-w5BmVK|4w{ax6q>I)%%N2U}dK=-&^r@{oVg;UGEa>x*f-xiN>+CTWF*`7Ft*h z3;XvrjDu~Pst&Q@Hj_nm?pm6H^DkQ5>;BFcHy5To2dypcI`myyDwbH;_Y*5Sb*%fX z|FEuAFlaH$g1=+ne0yPqZ~(8~XQXvX;9xIu(~`8yd;aat)8y`V`J!wSi?SVyB9Cu8 z$Ey50xX)h47yfK<3Ai zC#N%;?M%+*?gWV0-cSTMJ_k5{$d~u;AVAy`2a)E}>pamH#9j>V1retu&F;J@%m0Q| zuHGqw2+iLN+XjFsb7#~sOEEIs84!zlT)_BAo{_eLqd`F zSHv-%=11IMpbHbqF=TIH|4R7v_owB%pZdQ{%YXIK|D)weTK+hU;z?S*6v{Hu^84`p z{|#FH7ih`P;2<(r{v zpOcoqf{gD+%U7}g2`z_eaU80}Ixr1b8;o%N;+80A4D6mYP-(*cN9o~Gh;}bPHvgSZ zopZ1xJpVCv5;@Gxz7EfS*v(F|uiflpxcT5cwqaU(ZQ_E5b_8x&I98%JQT$++)dswe zn~C>vt&`IO=E+$>i{BK9X>zp<-?-Z)JvsuSrBrc(j25hgeBgeGpsXV>B@y@tpz;(l z!&9L0B~+4Yk#F#@qk!vSoU&XNOGC4sypPaw*@^tXSFtf=CyLgL3F*U^N@btt%ckRU z)gZrV7mA4fQEJuuWhe3i7nYrv6v!<*F-`jAHE6W#glBbT+2@Pot9D5b7a@V)#EMSG zSp@Ev*JhyG=v9aa2wu$x3^7NtudIvOl3m429#g!ttJ+q*?`0m$dE!v}DqHYD{wyj# zpjD^toNQe-nE$?;Xc&D(_du~btCp?SLKDHqAN?mvU?5T@{UD7^92PR1sb{@zN{44sIXlJrjdgxXpo?W?AR1Qp{IUGii zRNRlG-XSce2_$u_$@3WL3*-{7kO}G8&@v@T3UU zBb1n!<1w7b5Hb?Vd{g%MWo0L<(!*{7F^y_1ON@V6x=2`v1U}ynBb&d38eJmFp!3s{ zt@pPR0I4(^q1d~;!_e{cz%5Z9O8IdK@aFg;y#~BF9ve+~bA_6@UV6J;4Jd8pr)NP= zUy~((lCRpc>ciO3w`U_QCZVYG=wH!HZ|33XlcHJCC~N?~^M!Fh)g@I7f$|&DbMDWn z_H<3QtQ;VxM5;Vp{=8kAasWB-5_@Kdv|$hIB-qZ|qF+PT({~~rMP%4*zJ{>932O5} z{CML|7_*AzvsEeGAIhdS70b=E|JIAhv#o7aTl~8xD{rhoo>}^#0zhJRw6sM zN}*Ng2cdc?v=kxvjc);7iO1O>JzPxj+D%vUcw|{7+HAluqPI{DSd1Jc9@FM-4@_eE zn&9A~`3=E=Me{cW(=gVS=vBN>U2rHbG}X!rr4`*|4w{Qb1YVan()I><#pJ){QGa#{ zrleeVc+SJVVpz>~ubv~bQ$JAyS(|+7FRb$TZ(+b10Be`zW(VBTE6w-~uc_+gR{Q`L z)Xt+zO;CcvKR-p!Y{33ygyCfV!`@J1iZ}FSiYM;_T&I5+d22R$^4@{RSc=E=Df(FR z2-K7fP{&`XNvXq#+@?CQGH-JO7HoH`uXb1N3to=aUX$4_k7;-0^D!P%3lvtEya4b> zjIA-Fp3Gul|0`k7YZ$-=9D>%ZY2u$hqx=<%0DB!fS<>AOBOICC+!gn{62NWLZ$-oP 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 Bc-H^` literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/x64/v0.8.15/nodetime_native.node b/node_modules/nodetime/compiled/win32/x64/v0.8.15/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..de27eefa05104a033bbf31b25def6109403e8d84 GIT binary patch literal 78336 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 C7I=LC literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/x64/v0.8.17/nodetime_native.node b/node_modules/nodetime/compiled/win32/x64/v0.8.17/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..9523d041d3900be0efd02eb0d1a57e24da0a540e GIT binary patch literal 78336 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 Ag8%>k literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/x64/v0.8.19/nodetime_native.node b/node_modules/nodetime/compiled/win32/x64/v0.8.19/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..0f238568673ac02fda96fc7f63e3c03cf571a3b7 GIT binary patch literal 78336 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%0DB!fS<>AOBOICC+!gn{62NWLZ$-oP z@~$W~*)c}m6^nc{#+}hF@A}-G(c;Z}2auyt|0}_5m3Ss|&IS%(U=Ui2l*k!dVDox~ z1`spD8uki!+cN@Ru%1oJY%&=DjRqNxux0oy<5|q}PdvRLP|g_%7BbJj!t?)$&^Xkt z{Xgw}34D`9-v6X6P+Oqkl9n@EiXu=-<<=%NfmU0nJ)j=gh9;$vG>JK&Rg@y2trZtt zR&l*5(qp9*bXP@XH6SXes}*!XakaX*7E!Fnu6Ql~?{8+FT9pI^W8 z%>3s1&2NrpuGB1g9Nu2^#X~o4c#2Bx7>-*;??D_-q5X*7Q)7CZ1cvkOWPTKOLV10^ z;**G_G;x!FkZOf$BfrPS;`Px|bnvxEJf-%zTGQ_lzG+{LX_sI-)*pL4-o~9?(5z7} zbz@a0SJs$bLRDG&H>|hRnqEqHvf#Pe>|M1tys)cXd+b7Np%8WX88o@<*qGW^P`!Bq z_-qar&@m(c}V zIzY(hqS!B?p8LZX<86#F{N$mw+x_bRw2WsOnDAsJ=8o{oj&B=rjRMYZ8+cl43V#1I zRc377DIN8)aou$&Q4^NVN8zC9qUT;ReM4I&Uow3!09(wyPb;m-zQ?dGeYj~|`UR+Q z-tNZg^r&Oe_*aVNX`%^3iM3N92WWG`+6gd}&V1RBVDy*1lpd`~hM>oR)mXi>+tEAG z(4%;9jGzbDo<*9g;5^tk^EK=Wz|8P;L&DP^40B_h{?Zt10s7p8seIb;(yn=wrc4vo zVDe0L`EM4^1?buhjhGgtbj>6kqbs*l5SGs&1KET?4C`{wZvP|3OIT%`id7RjRfr#u z5&kvgpOP?(yiJwfN)&H5b8o)59n@4*r$--42@k;EfB>Yo(San-6aIR>m>%674a3p9 zur3kq^Jemi1`=l$aOZu&(OpLqaZ3fN+Go4kW3$!`7>4eaOUY#OYqN1^wtt4Q9PGYi{@g(kuViu#;NLrTepIue&X(=Vv=VHP-l^TzBKiUEgYr3D51T$$k*Jov@}H zjXuh%vJV0tgH9fn6bu#Ln#$p@--Y5)9*BA+DNiEKWR`H5%Q5 z3B$DXh#mLz2S3T5?V!Hf0VM81owqx zo5tC&7DH@?wJS!)`g)nB+egRvx|^n7FxvY&L+#(uLm$R`?7EmK##*e#?_GQH#)Y-- zWv}y6hV8vRHjFxq-#$PVO$`5fW7`k<2V4mJgP4|#!K@^@hgS?WIp`m-Kv`XUt?Q6bC zwKpJjt>_ha-{7x(9bLn^m^8HW2dHO&a+wa+nCOe+ee$&uT`>NalY8Y7BzSkAU)T@H z6g-S3_Fm(fMF+hYRUhDi?=rm6j$qq{zwtSGhxildF7Q*{nd1)B+<;(B2Ysyw5vmNo zh=g|zesm7cqq#ju>F1rp!KbL{DaG+1bPH{wTR6eH1q`R&##%bAZA6EFuCn}X7)L;y zAHe*V(wWcu;?N9zKqbUG1Pb>9>JXl<0Xt+Q&2Nh`6}99!>h3X$IOy($knW~Fiu!{T zyu6M6px|z*Y1|eoIkl$4HKwDo5|9wSI5tuQR{G81!Kjqw$40#5zWLUMP&kaw}8Vh<3Xz{LuoA4U|(C6q^3|t%t`Ciky z%TA)6V$6gqYo7cTRp8}7%`i?rf%n~DL)ne`*0`=`EP}yEsgMUlqo;XfGR=Gy!)cfd zPs`EL%gfJ#ug{OtngVW>#dWo&=vSy7^rL#v8}%TL*Mp;@Im15R0KtGe= z|8KlI4YfaFd~_K4H2JWp_Ba+iFzUTA*GLB@d|3Um4EWeI>MIP5ph*2kV?`rj8y1#+ zKpoZ^X-eKWb3Z9R?i0EU%J1icqa@R~WBAD!T-`;=|Jll2ILq~OVcG{xl#G>Tj62C!qhYMACm#K>w9d&|Y^UhBWU( zOQEZS{Xx||md4fJ6#qI>`WdPbX+G2-`-`CZ9~(@5)xLznbA7EfJ%~evzb~zchJar3 z4&7*sZo@XYmHkVnXWz3!hvs)(MlbBVIQqjk^i`St`HlgwpW@)KGo%tOp_6g5WT%m+ttTE7f zp<(9po@flBamWg7Jetl|GIxEZo4XDt3um^uyP0NwgnAJDiZS{%YUXQSLils>!9gb+ z<0&N=%%2s%D}7!6G}HtvB=2fZM8;$A#cn!gtS;#tU3FWYt$jDM!G=ao@o*v)!gvZLmQj;B8g9mT+?R;D ziUXoG(FSzLrkYD*Of`A22DDDRXU3YYp{5_2CX@wE)$YPC5MiMh1@;=1C%j!6g97bg zIJuj=W$Zexn~Vj&m`SFYyW}b{LNL{&#~_FvrszKtmnr&9saepZx$Al|krE^nNudxC zBk>s%o;Be>CziIOX6_~(^7A-x891Umqx57(AIEHh%u~YJ{WNWX+j^OAhN%|O)Z&K; zus*vBEBm!CV{e8Q)o#~^S|k_W2m6o;$Op$(QAMK<@lcS7mrb}2M~v}IYtbi*fFKKe zfBI|pLdKs^HHD0ge0+h_iVYVs2!suPUL1u`?)k;n&Xu^2MQkF`;s*Gu=m;OqXhIWo z8Tf_p)i>zzQ$4FM>az-yBlsoYO>5~Au+@8XSS1T`;W%0C8?~|RI_$LRW_k(eWKhD4pjIEi24hmz=Nlek~v zBN8`Cyj9{di57`hNz9R`mpDb@Sc!uqc9-~dHxX~U#CIjWD)9-44HADV@n(s3iG>n# zWjT~etddwKal6DnOFSa+9}?qaIOj+-O60=9zkkw&cX)P7oFMUU_@Nwn{w(nkiNzB2 z62IoZ)yUXRiOVF;l6bzv@92Odo}ChJl9(&8uf*fB{_T-SzYIdpRT3|jI8x$~e+u{A z5(_1cR_uQi?!T4jk~mFbe~BOdAo%u3Y>;@h#PcP7{k`D3Nn)|YM2RocwQG1Dka&&6 z84`O+e3@o!@GO>?BJsNu!rm|OE{QIQ!ZrB6bvuotJ3qQ)Vc%93*}b!m&NiP7pLZGA zMuEssaTN4A*)Z06REB$w!1WUZE;d_qX1m>4V)ojc4#7+R>t<_sI`#M&OiHht`Iv)w znT?e*E7O78_;Z4E#LjxLIF9)&i_K?w_*3&JuDDW#WwLo}ZWpeY+=1_GX5d_rL*UV{ zTsDOzv&s0Qu*V}j15)Qjy2=?2PT<{()aj6F4^MA4k2woAC9t<}yHcKma?V?ZoOxg} z<3IT*XN#GgRl>%CFx+r;uqAkNfPhGV;gh=#@j7{|lpYuUC`94I1{VjL0G>>qOOfhw*n0RoaV|yLMB2TGmrBcx z{~m;B=R8hU3OfqV&O;VCGxL}gIgRIXB3atNV?~;EY%H4yTRTEK4{xOi&w+Q62BnE? zNFzv|W>9BIId~dLlgO9Q9q~Wt)5z15jSxr@69Rgrly^#?yd4OE%GnA&lGYOBRfiZ{ z@LR%jT`J?S14V9078I^&L`k;n}>er+|e3A8wLJKW-ibIimI`lLj?^Hfi2Es*1 znq)@lobX?wA4+}{xg`hkp`=NXU!)vZ0&*A9V6wiYuxWvCsPxUemWX^&ZHp9^j_V-l zv63bVQ=}_}O$~&nr02}ab2;LQ9Ao4%RpOiSFT_VRi|XvZ65oY^_*~FYp##ehmK$OE zAU`{#*10Arbu%b2CH<*^@XlObMM${=npS~$y{N+^A?1xUQYpn?Y)bh|V$%chMJjJ6 zN|nk>w5n9UoxHW6R?~_$l3Fb*4?)o*1x0=)h3ONeibACJL9{v4ev$5+sxJuY(>snTr;jB&9C9pgfXQ<#*=#LZJ&CCB32ko_hY!7({xLRpoc);hT}GB`60a zWKUSw>huTO`%;vflgo};8S0B&cqcRU0@S-vPbnluy^rV}gdftzP#Mt}iJsP1#W)Cy zUi@*%ciQPek5;~m(G9+{UJ?9S;mnHVdms7EmD_kaw)d`;|ICY`2HK|0?W#eb_r@V?zAj8TO9*214BFr=->K(a%k*-?50xs1Eu; zJwbD=O5PXR92V#DJg@j*fqj9;>Yl&&8f%F+(^2Ylmve`O@Iw#Wv&03d0=$-ma>8ah1vUIpC$* zO0`<4ujF(I-W@7ikspR{KT1EYpy%nO??Fl@<(<-{q(>lqj#7M-I*|_XPSOzZD)CS_ zG^(Ky7WJ>e{LF!kO=XvlloOXnWryH!YwigL~*ZrGwH( z@iPA9=L>{S?-U;8gTkS7lYh);X3QurpFuTSJQh3`=(6$X$WV!gJ7i~1v{)vJmmH{# zL8uNhT1%|ui>(1gnde*<@;<-B>m=tqv{s6P!MDWcL1HiQ*?HiX_#C|84KBBh$~)Wa zE(w&gb+OxLb_WD|iP^zl5idhr4B=DQ3}I4uAP4+cGK59pusPPn41QRi+3Ry#;DBe2 z+a^trOPSB@3A~{^tQLn=Ws&a_Z`n=<=gRX*GCSSO-RiaK zL=&OQqNxt2`&{mdb~oK__IPv|HmjR*Td6ZzJtc0NOJUK?HhZj+$>4UIE2T%Zeb9@} z?A47G@#a^$tl@#drI@B#>^cuMUnM$kncIp9m?aRUMFd=2Zg!v@vgnqfJ#)HsB~Di* z{y98ew~t%cyhy2%I)o?rmMx}qo{l@ne>%=$OQpkHjwG7BR`feMi#3n}w6Quxd@R6c zbJ)B#v)y)`)vZ%;6kE%btejC2Rs5$+Vz``C=?jriIA2$yEOyz=s6kc-WtH^h%0;>o zyVK)yTX|kPxrewyuFi6YO^2ejdu&VKBM=J8T<5SZzjBdKI9dM7O1g~u1YxsV^&E_#TQYeDtC3- zRUycHF0;A4K4`kd<_U_n-0YH?6Rx)r6GQox`W-PbD)+7uQ|v*RnBAf{ASsn1i*mJC zOU*vJx2uu}#t)^4was4l!3lmI1DXgLfARSYUNAC;nF#;J;pKep#+cJ3njgF}(&-WKe-UT|-e)18i!t2B ztD^s0_ldWt$mc-ou*88jTD-fdMX{mVknb+9drB(!tmeh&IE#u(>~0c;aK?KnhH*iQ zq9SjZjmlOs6cu^Amf$P+U1oBY-YGnbwZsmjhSDM$X~hvZ_OKY=>m+I=GKn4U2=_LL ztrGW2^h?|>u}u2hr~}M zwn=Q2xL4v1iFFd!ORSJsC~=y^M2RO3iFgl5+%9pw#4?E)5_J-p#Eyf)f4jssiLDZw zB;F@+y~HYs#S-zGd{y*)m?*L1&*FWr#ElXwB<4sQEAhlzl3!wzL`DDB%XgQ=LW$EP zCQ4LQiT~3^9lqm2|Hfh-PW*-1M}Et|FT4G7s|hi1^+bc%>L9N+{A)^QCJf^ zlRw43?*DYzi_CW}*Rua^4bZF#{3*W}bUIW@knko=@GnYpW`BzR&bj}oHm9or6jOiv zDKXMp(5z*r%W0^4IRBaDHpr!AL9;N)jS#XXRIR#c^_sOe-%?$3Ywd08ZvWN#JMR4T zhTq(E_r`mEd+&YsKk#7PLz^DnT;I^x^t(s4G;eL$w*Aq^e*cHZpLlY|Q%^s$^N-Iy z=ijya`8_YZ_|o2eFTe8YpI&>t^^N@p-hAuN2M@jd&f$0e^4|MxAAI=NBOm?k)^Z zV$z_&Lxv6;t{X9O)aWtioICcs^T%BeqGl&Pe?N{n4^%UZ>OU8DHY^jd!`7 zr8c{mt5odEtY+7EkHhTplsW0sB3UcOMcZ++6pgRKQP)S<`z2radpJMq8_KWmFWzxP zmxs^#39OTRO2Wg#34dov!k;z__3~XeK)5UZI^=uKaAB_>80yaCyEe>TC*Rw`?3d0> zrx`1Q@;xQrF?F{zZ@Ja#qG>d9iI++Hyb|*=t7D0k&G(k^Nk`bH<6~^Gxn$`ayLpLZ zmmhl&!qR!pP!2iM>2O-`U0rT1a$rJi8CEhTT;*|>Toq$maB3x!-TKUfUC^>1eawoyz+;_2t3IecH$`C!xgX!H_&>f_LHFPSeSEE?*SKt zrG$-b`Fz<<4@U}L{fq^l@~HVLB83S?;$E+E3y(V(8osp=Hid(=wN8(kuMB)0;K7<& zmk;sB^0Rb;B~fK28wx{t)cK%rf67ClXs|~!W;SDe;-XkwO7~>#WRdT!n520fRJ=`u zc-DYeHozOl23XEw15#nm?c-N?*J0*iA?9Fi2Je+XP0uLSQ`3hfjgM!8Etj#u`8jNG z>U=g>a|!F;+Sjke;)oaer$+&6`gdpjEj?KORA7qM)h8*AB_W<9#FK=0l2Qh=^=l2r zbu$z=YZ7CdWx6y8-B|+sC%}I~O1w+cw>#_W)v~^+39Rp9@i`h@Pt4o&VY+-R)1~%i zI`@!{L2ZexXZ!oR`ozVsIQT=pU6dEnw@nu^)(m=DhQABucF;TWy-&Xw)-SaO>z9%c z@RKnWKV|_^{M-WbvmnKfhUW?Su^>PBJ&>>NlrO&~AtsRSK11Tz5K96Zf;0|sCw83O zCM2cEcpT=TrehN7?@GRh#IqsZL^dRUApD%ohG_aSAt}goXiqlO8_$MX;@Hsqv)E9` zacD|X+rUzJyh!H;V14IdP||jx zTV$6sES4qQ8Q*qRYY%@nS4?qqPE<1K2+a)l=^n+p=SBr|Go}DK0Gg`uui^R$y@W0d zfP4p}^zrxUY}cyDGrAD#OrTsP43#b@wM)|@iuKUk%i957SCE#oWPMS>>9L5h86X$J zA>?UI38wXyV#e+V-6`Wqns^o)=6#$Ev;2V#OZ`0?rrFN4IYOQ;$W!QKkAO~6yw{ScOdi?WHiNr9gcNv7>tBMV*0tH|U?*O%or(;?bVPr}Xgi@^MEc zC*hZDy6+b{j$+_*%~eCtZh(e-fp=Xj(;XSa65kxmw0nlISnp`2c264Jot>>2${?@e z9?7Eo{gmd|7#8b}aYYwLB~!XF)?&G!W(u=g6zk^g9%=_3jGNe(AT>{j9fbq;+%O)s zozy!XC&qCs3RefH!wa!Pco>s1It8QV39$nY#<^@ZNX?_R<8eZUA#Iu)`oY_{UeK4G zEP>v6-Nud>cXt=b1mj&c0Hh9AZKvrS&3ex!sfu#J_?Ptsh48EFcsg>C4&LteL3^o1 zyPJSEvo{-hXHo~XyGet)^FC4Cwz-fL&7e3o2z6&rY9BV}&Olq4Bl?V9=rekv&pyo<9WM5 z`=m6a8>t$WG`u_OgT9-`kQ~L`DV(G+Xw%Wp417%6(Yr0Q-GP``()s9*Qiq`*!i+}< zhe+eb0M7{UBu3=fPU%RDV~OaG5>by5QI8V)_HPp-1~}sB7$Y$GYk}(j)PHBd-W9=( z$uW~MUP=V-ELs!_duSX-kD71C#30j-e+11LkZJoajA2#r-3dG95Avu@zno_hvi;>e zlaRwN=b1$9_)j^{l*rQ3lChU&snxAtHchX;%w#a=b4-Q>nI5Mddq(t=^!h6>%1TR{ zgspnm3g9xDy=Lqd!aM?2emzd%t$@50UcuP+EDc-r(tU0>wqWSfoepd}@$!)K3~7c1 zX`^Z1j$OY%?V?X1uLYX4xpwDbII7(!J!*eq_YV(Hcw?Vv(sHd!Y#z)Xm@2$hhX?1M zxclXXLdr{k7PJiZ@5 zNr1{>f!Xe}D)x|BD#ZhdohqV2mH*Iy5dix_$g&Jm4XQ-W!%Pd0<}%Z41Eq9QiarDE zUj?}#`*f#|dkk0&GtMq?XB{h($75dGl=`ivN^2te6&mLR1r+) zym@>RR<70K^tnr{^UUSeuKe&)jx1$F9nV9X<8xpGsMGPUhqG3bmg!M~(FeXvR(+-a)xtBC)^Q_DD zDg_9wD=G(gK#?1%ymO+`3LIDpKw((8K3py;iXy@sx2+soxt2+toJ4i(2&e2>yxR!^Mj9?NKg&gL(&8{-eCTh(& z0e@2cBl@NaGlp_i;K07WQ@54hYSQwoUVXk5b&49$Kr*|m>naCoT$MItVJg%P+jP8@ z1}_?஺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 Bd7}UT literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/x64/v0.8.2/nodetime_native.node b/node_modules/nodetime/compiled/win32/x64/v0.8.2/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..140e200e5e5bbf33fa93e78d9e45da916c36e54b GIT binary patch literal 77824 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 A*Z=?k literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/x64/v0.8.21/nodetime_native.node b/node_modules/nodetime/compiled/win32/x64/v0.8.21/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..cbb3b82c46bbf7b43a32dea7609454968c820b06 GIT binary patch literal 78336 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஺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 Bcq#w@ literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/x64/v0.8.22/nodetime_native.node b/node_modules/nodetime/compiled/win32/x64/v0.8.22/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..5162dd2f3afa12dca54244787c05799aa2202440 GIT binary patch literal 78336 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

      1k*4cH+gX?|Ojsi-B-QFo6~#6fp2gmgFcQPdx# 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

      f|JFbE!?~()Eub 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 C`F3;w literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/x64/v0.8.3/nodetime_native.node b/node_modules/nodetime/compiled/win32/x64/v0.8.3/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..84a5017f7ade93f01fd009b6445964024ca1a0c8 GIT binary patch literal 77824 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 BJ8 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 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/x64/v0.8.4/nodetime_native.node b/node_modules/nodetime/compiled/win32/x64/v0.8.4/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..f2fd9ba25eff3108cecb1a0cba9fe5947f2ea5cb GIT binary patch literal 77824 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%0DJAoFGYf?ZL!fJ`h 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 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/x64/v0.8.7/nodetime_native.node b/node_modules/nodetime/compiled/win32/x64/v0.8.7/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..0629c1828836f634791ec2dbfdee0ae311f956e8 GIT binary patch literal 77824 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 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/x64/v0.8.8/nodetime_native.node b/node_modules/nodetime/compiled/win32/x64/v0.8.8/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..ee6f01040853788423530396ff1c5b9ffb1648fb GIT binary patch literal 78336 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 Dbys&S literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/compiled/win32/x64/v0.8.9/nodetime_native.node b/node_modules/nodetime/compiled/win32/x64/v0.8.9/nodetime_native.node new file mode 100644 index 0000000000000000000000000000000000000000..ec688018622f4e3af7591fd2993f87139ebb5d38 GIT binary patch literal 78336 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 20) return ''; + + var tab = ''; + for(var i = 0; i < depth; i++) tab += "\t"; + + var str = '' + var arr = Array.isArray(obj); + + for(var prop in obj) { + var val = obj[prop]; + if(val == undefined || prop.match(/^_/)) continue; + + var label = val._label || (arr ? ('[' + prop + ']') : prop); + + if(typeof val === 'string' || typeof val === 'number') { + str += tab + label + ': \u001b[33m' + val + '\u001b[0m\n'; + } + else if(typeof val === 'object') { + str += tab + '\u001b[1m' + label + '\u001b[0m\n'; + str += indent(val, depth + 1); + } + } + + return str; +} + diff --git a/node_modules/nodetime/lib/core/agent.js b/node_modules/nodetime/lib/core/agent.js new file mode 100644 index 0000000..7ae630f --- /dev/null +++ b/node_modules/nodetime/lib/core/agent.js @@ -0,0 +1,385 @@ +'use strict'; + +var fs = require('fs'); +var util = require('util'); +var path = require('path'); +var cluster = require('cluster'); +var EventEmitter = require('events').EventEmitter; + +var Logger = require('./logger').Logger; +var Timers = require('./timers').Timers; +var System = require('./system').System; +var Proxy = require('./proxy').Proxy; +var Thread = require('./thread').Thread; +var Utils = require('./utils').Utils; +var MetricsManager = require('../metrics/metrics-manager').MetricsManager; +var ProcessState = require('../process/process-state').ProcessState; +var ProcessInfo = require('../process/process-info').ProcessInfo; +var ProcessStats = require('../process/process-stats').ProcessStats; +var DiskStats = require('../process/disk-stats').DiskStats; +var SaasClient = require('../saas/saas-client').SaasClient; +var DataSender = require('../saas/data-sender').DataSender; +var Profiler = require('../profiler/profiler').Profiler; +var NamedTransactions = require('../profiler/named-transactions').NamedTransactions; +var CustomTransaction = require('../profiler/custom-transaction').CustomTransaction; +var GCStats = require('../v8/gc-stats').GCStats; +var CpuProfiler = require('../v8/cpu-profiler').CpuProfiler; +var HeapProfiler = require('../v8/heap-profiler').HeapProfiler; +var HeapStats = require('../v8/heap-stats').HeapStats; +var StdoutWriter = require('../addons/stdout-writer').StdoutWriter; + + +function Agent() { + this.initialized = false; + this.version = '0.8.10'; + this.nextId = Math.round(Math.random() * Math.pow(10, 6)); + this.nodetimeNative = undefined; + + this.performanceIndexMetric = undefined; + + // predefine options + this.debug = false; + this.stdout = false; + this.server = undefined; + this.proxyServer = undefined; + this.precompiled = undefined; + this.features = { + transactionProfiler: true, + hostMetrics: false, + redisMetrics: true, + mongodbMetrics: true + }; + + EventEmitter.call(this); + + + // create modules + this.logger = new Logger(this); + this.timers = new Timers(this); + this.system = new System(this); + this.proxy = new Proxy(this); + this.thread = new Thread(this); + this.utils = new Utils(this); + this.metricsManager = new MetricsManager(this); + this.processState = new ProcessState(this); + this.processInfo = new ProcessInfo(this); + this.processStats = new ProcessStats(this); + this.diskStats = new DiskStats(this); + this.saasClient = new SaasClient(this); + this.dataSender = new DataSender(this); + this.profiler = new Profiler(this); + this.namedTransactions = new NamedTransactions(this); + this.customTransaction = new CustomTransaction(this); + this.gcStats = new GCStats(this); + this.cpuProfiler = new CpuProfiler(this); + this.heapProfiler = new HeapProfiler(this); + this.heapStats = new HeapStats(this); + this.stdoutWriter = new StdoutWriter(this); +}; + +util.inherits(Agent, EventEmitter); + + + +Agent.prototype.init = function(opts) { + var self = this; + + if(self.initialized) return; + self.initialized = true; + + opts || (opts = {}); + opts.features || (opts.features = {}); + + // Registered accounts. + self.accountKey = opts.accountKey; + if(!self.accountKey) { + throw Error('Nodetime: account key is missing. Please sign up for an account at http://nodetime.com.'); + } + else if(!self.accountKey.match(/^[a-zA-Z0-9]{40}$/)) { + throw Error('Nodetime: invalid account key format'); + } + + self.appName = opts.appName || 'Default Application'; + if(!self.appName.match(/^[a-zA-Z0-9 \_\-\+\'\/\.\,\:\!\@\&\(\)\[\]]{1,64}$/)) { + throw Error('Nodetime: invalid application name format, should conform to /^[a-zA-Z0-9 \_\-\+\'\/\.\,\:\!\@\&\(\)\[\]]{1,64}$/'); + } + + self.sessionId = 'pro:' + self.accountKey + ':' + self.utils.sha1(self.appName); + + self.debug = opts.debug; + self.stdout = opts.stdout; + self.server = opts.server; + self.proxyServer = opts.proxy; + self.precompiled = + opts.precompiled === undefined || opts.precompiled; + + // compatibility + if(opts.features.transactionsProfiler === undefined && opts.transactions !== undefined) + opts.features.transactionsProfiler = opts.transactions; + if(opts.features.redisMetrics === undefined && opts.redisMetrics !== undefined) + opts.features.redisMetrics = opts.redisMetrics; + if(opts.features.mongodbMetrics === undefined && opts.mongodbMetrics !== undefined) + opts.features.mongodbMetrics = opts.mongodbMetrics; + // end compatibility + + self.features.transactionProfiler = + opts.features.transactionProfiler === undefined || opts.features.transactionProfiler; + self.features.hostMetrics = !!opts.features.hostMetrics; + self.features.redisMetrics = + opts.features.redisMetrics === undefined || opts.features.redisMetrics; + self.features.mongodbMetrics = + opts.features.mongodbMetrics === undefined || opts.features.mongodbMetrics; + + + // Initialize logger first. + self.logger.init(self.debug); + + // Load native extention + self.loadNativeExtention(); + + // Initialize core modules first. + self.timers.init(); + self.system.init(); + self.proxy.init(); + self.thread.init(); + self.utils.init(); + + // Initialize data sender. + self.dataSender.init(); + self.saasClient.init(self.server, self.proxyServer, self.sessionId); + + // Metrics aggregator should be initialize before + // metric senders. + self.metricsManager.init(); + // Predefine performance index metric. + self.performanceIndexMetric = + this.metricsManager.createMetric('Process', 'Performance index', null, 'index'); + + + // Initialize the rest. + self.processState.init(); + self.processInfo.init(); + self.processStats.init(); + if(self.features.hostMetrics) self.diskStats.init(); + self.profiler.init(); + self.namedTransactions.init(opts.namedTransactions); + self.customTransaction.init(); + self.gcStats.init(); + self.cpuProfiler.init(); + self.heapProfiler.init(); + self.heapStats.init(); + if(self.stdout) self.stdoutWriter.init(); + + + // Prepare probes. + self.loadProbes(); + + try { + self.emit('session'); + } + catch(err) { + self.logger.error(err); + } +}; + +Agent.prototype.profile = Agent.prototype.init; + + +Agent.prototype.loadProbes = function() { + var self = this; + + // Dynamic probes. + var probeCons = []; + probeCons.push(require('../probes/cassandra-client-probe').CassandraClientProbe); + probeCons.push(require('../probes/fs-probe').FsProbe); + probeCons.push(require('../probes/http-probe').HttpProbe); + probeCons.push(require('../probes/memcache-probe').MemcacheProbe); + probeCons.push(require('../probes/memcached-probe').MemcachedProbe); + probeCons.push(require('../probes/mongodb-probe').MongodbProbe); + probeCons.push(require('../probes/mysql-probe').MysqlProbe); + probeCons.push(require('../probes/net-probe').NetProbe); + probeCons.push(require('../probes/pg-probe').PgProbe); + probeCons.push(require('../probes/redis-probe').RedisProbe); + probeCons.push(require('../probes/socket.io-probe').SocketioProbe); + + var packageProbes = {}; + probeCons.forEach(function(probeCon) { + var probe = new probeCon(self); + probe.packages.forEach(function(pkg) { + packageProbes[pkg] = probe; + }); + }); + + // Preattaching probles, works, but not well tested + // because require may load from different paths. + // This removes the requirement to require nodetime + // before everything else. + /*for(var name in packageProbes) { + var ret; + try { + ret = require.call(this, name); + } + catch(err) { + // ignore exceptions + } + + if(ret) { + self.logger.log('found ' + name + ' module'); + packageProbes[name].attach(ret); + } + }*/ + + // on demand probe attaching + self.proxy.after(module.__proto__, 'require', function(obj, args, ret) { + var probe = packageProbes[args[0]]; + if(probe) { + probe.attach(ret); + } + }); + + + // Explicit probes. + var ProcessProbe = require('../probes/process-probe').ProcessProbe; + new ProcessProbe(self).attach(process); + var GlobalProbe = require('../probes/global-probe').GlobalProbe; + new GlobalProbe(self).attach(global); +}; + + +Agent.prototype.loadNativeExtention = function() { + var self = this; + + try { + self.nodetimeNative = require('nodetime-native'); + } + catch(err) { + this.logger.error(err); + } + + if(!self.nodetimeNative && self.precompiled) { + // use precompiled extention + + try { + var extentionPath = '../../compiled/' + + process.platform + '/' + + process.arch + '/' + + process.version + '/' + + 'nodetime_native.node'; + + self.logger.log("Trying to load precompiled extention " + extentionPath + "..."); + + self.nodetimeNative = require(extentionPath); + + if( + !self.nodetimeNative || + !self.nodetimeNative.cpuTime || + !self.nodetimeNative.cpuTime() + ) { + throw new Error("Failed loading precompiled package..."); + } + else { + self.logger.log("Loaded precompiled extention"); + } + } + catch(err) { + self.nodetimeNative = undefined; + + self.logger.error(err); + self.logger.message( + "Compilation or installation of native extention failed and " + + "precompiled package was not available or had no matching version. " + + "Please try the latest version of \"nodetime\". " + + "Alternatively, you can continue using Nodetime without the native extention, " + + "but will be missing several core features." + ); + } + } +}; + + + +Agent.prototype.getNextId = function() { + return this.nextId++ +}; + + +Agent.prototype.switchApp = function(appName) { + if(!this.initialized) return; + + this.appName = appName; + this.sessionId = 'pro:' + this.accountKey + ':' + this.utils.sha1(this.appName); + this.saasClient.switchSessionId(this.sessionId); + + // Resend info, so that the server can see the new application name. + try { + this.processInfo.sendInfo(); + } + catch(err) { + this.logger.error(err); + } +}; + + +Agent.prototype.destroy = function() { + try { + this.emit('destroy'); + } + catch(err) { + this.logger.error(err); + } + + this.removeAllListeners(); +}; + + +Agent.prototype.time = function(scope, label, context) { + if(!this.initialized) return; + + return this.customTransaction.start(scope, label, context) +}; + + +Agent.prototype.metric = function(scope, name, value, unit, op) { + if(!this.initialized) return; + + this.metricsManager.addMetric(scope, name, value, unit, op); +}; + + +Agent.prototype.expressErrorHandler = function() { + return function(err, req, res, next) { + res.__caughtException__ = err; + next(err); + }; +}; + + +var Nodetime = function() { + var self = this; + + var agent = new Agent(); + ['profile', + 'switchApp', + 'destroy', + 'time', + 'metric', + 'expressErrorHandler' + ].forEach(function(meth) { + self[meth] = function() { + return agent[meth].apply(agent, arguments); + }; + }); + + ['on', + 'addListener', + 'pause', + 'resume' + ].forEach(function(meth) { + self[meth] = function() { + // deprecated + }; + }); +}; + +exports = module.exports = new Nodetime(); + diff --git a/node_modules/nodetime/lib/core/logger.js b/node_modules/nodetime/lib/core/logger.js new file mode 100644 index 0000000..ac78f14 --- /dev/null +++ b/node_modules/nodetime/lib/core/logger.js @@ -0,0 +1,34 @@ +'use strict'; + +var util = require('util'); + + +function Logger(agent) { + this.agent = agent; +} +exports.Logger = Logger; + + +Logger.prototype.init = function(debug) { + this.debug = debug; +}; + + +Logger.prototype.log = function(msg) { + if(this.debug && msg) console.log('nodetime v' + this.agent.version + ':', msg); +}; + + +Logger.prototype.error = function(err) { + if(this.debug && err) console.error('nodetime v' + this.agent.version + ' error:', err, err.stack); +}; + + +Logger.prototype.dump = function(obj) { + if(this.debug) console.log(util.inspect(obj, false, 10, true)); +}; + + +Logger.prototype.message = function(msg) { + util.log("\u001b[1;31mNodetime:\u001b[0m " + msg); +}; diff --git a/node_modules/nodetime/lib/core/proxy.js b/node_modules/nodetime/lib/core/proxy.js new file mode 100644 index 0000000..37ce020 --- /dev/null +++ b/node_modules/nodetime/lib/core/proxy.js @@ -0,0 +1,201 @@ +'use strict'; + +var EventEmitter = require('events').EventEmitter; + +function Proxy(agent) { + this.agent = agent; +} +exports.Proxy = Proxy; + + +Proxy.prototype.init = function() { + // removeListener compairs objects, so the original callback + // should be passed instead of the proxy + this.before(EventEmitter.prototype, 'removeListener', function(obj, args) { + if(args.length > 1 && args[1] && args[1].__nodetimeProxy__) { + args[1] = args[1].__nodetimeProxy__; + } + }); +}; + +var Locals = function() { + this.time = undefined; + this.stackTrace = undefined; + this.params = undefined; +} + + +Proxy.prototype.before = function(obj, meths, hook) { + var self = this; + + if(!Array.isArray(meths)) meths = [meths]; + + meths.forEach(function(meth) { + var orig = obj[meth]; + if(!orig) return; + + obj[meth] = function() { + try { + hook(this, arguments); + } + catch(e) { + self.logError(e); + } + + return orig.apply(this, arguments); + }; + }); +}; + + +Proxy.prototype.after = function(obj, meths, hook) { + var self = this; + + if(!Array.isArray(meths)) meths = [meths]; + + meths.forEach(function(meth) { + var orig = obj[meth]; + if(!orig) return; + + obj[meth] = function() { + var ret = orig.apply(this, arguments); + + var hookRet; + try { + hookRet = hook(this, arguments, ret); + } + catch(e) { + self.logError(e) + } + + return hookRet || ret; + }; + }); +}; + + +Proxy.prototype.around = function(obj, meths, hookBefore, hookAfter) { + var self = this; + + if(!Array.isArray(meths)) meths = [meths]; + + meths.forEach(function(meth) { + var orig = obj[meth]; + if(!orig) return; + + obj[meth] = function() { + var locals = new Locals(); + + try { + hookBefore(this, arguments, locals); + } + catch(e) { + self.logError(e) + } + + var ret = orig.apply(this, arguments); + + var hookRet; + try { + hookRet = hookAfter(this, arguments, ret, locals); + } + catch(e) { + self.logError(e) + } + + return hookRet || ret; + }; + }); +}; + + +Proxy.prototype.callback = function(args, pos, hookBefore, hookAfter) { + var self = this; + + if(args.length <= pos) return false; + if(pos === -1) pos = args.length - 1; + + var orig = (typeof args[pos] === 'function') ? args[pos] : undefined; + if(!orig) return; + + args[pos] = function() { + if(hookBefore) { + try { + hookBefore(this, arguments); + } + catch(e) { + self.logError(e); + } + } + + var ret = orig.apply(this, arguments); + + if(hookAfter) { + try { + hookAfter(this, arguments); + } + catch(e) { + self.logError(e); + } + } + return ret; + }; + + // this is need for removeListener + orig.__nodetimeProxy__ = args[pos]; +}; + + +Proxy.prototype.getter = function(obj, props, hook) { + var self = this; + + if(!Array.isArray(props)) props = [props]; + + props.forEach(function(prop) { + var orig = obj.__lookupGetter__(prop); + if(!orig) return; + + obj.__defineGetter__(prop, function() { + var ret = orig.apply(this, arguments); + + try { + hook(this, ret); + } + catch(e) { + self.logError(e) + } + + return ret; + }); + }); +}; + + +Proxy.prototype.hasError = function(args) { + return (args && args.length > 0 && args[0]); +}; + + +Proxy.prototype.getErrorMessage = function(args) { + if(args && args.length > 0 && args[0]) { + if(args[0] && typeof(args[0]) === 'object' && args[0].message) { + return args[0].message; + } + else if(typeof(args[0]) === 'string') { + return args[0]; + } + else { + return 'unspecified'; + } + } + + return undefined; +}; + + +Proxy.prototype.logError = function(err) { + this.agent.logger.error(err); +} + + + diff --git a/node_modules/nodetime/lib/core/system.js b/node_modules/nodetime/lib/core/system.js new file mode 100644 index 0000000..55f369f --- /dev/null +++ b/node_modules/nodetime/lib/core/system.js @@ -0,0 +1,49 @@ +'use strict'; + +function System(agent) { + this.agent = agent; + + this.hasHrtime = true; + this.timekit = undefined; +} +exports.System = System; + + +System.prototype.init = function() { + var self = this; + + self.nodetimeNative = self.agent.nodetimeNative; + + // make sure hrtime is available + self.hasHrtime = process.hasOwnProperty('hrtime'); +}; + + +System.prototype.hrtime = function() { + if(this.nodetimeNative) { + return this.nodetimeNative.time(); + } + else if(this.hasHrtime) { + var ht = process.hrtime(); + return ht[0] * 1000000 + Math.round(ht[1] / 1000); + } + else { + return Date.now() * 1000; + } +}; + + +System.prototype.micros = function() { + return this.nodetimeNative ? this.nodetimeNative.time() : Date.now() * 1000; +}; + + +System.prototype.millis = function() { + return this.nodetimeNative ? this.nodetimeNative.time() / 1000 : Date.now(); +}; + + +System.prototype.cputime = function() { + return this.nodetimeNative ? this.nodetimeNative.cpuTime() : undefined; +}; + diff --git a/node_modules/nodetime/lib/core/thread.js b/node_modules/nodetime/lib/core/thread.js new file mode 100644 index 0000000..6e69a25 --- /dev/null +++ b/node_modules/nodetime/lib/core/thread.js @@ -0,0 +1,41 @@ +'use strict'; + +/* + * Thread class simulates thread model, which allows to trace + * nested operations. + */ + +function Thread(agent) { + this.agent = agent; + this.nextId = 1; + this.threadId = undefined; +} + +exports.Thread = Thread; + + +Thread.prototype.init = function() { +}; + + +Thread.prototype.enter = function() { + this.threadId = this.nextId++; // no way this runs out + return this.threadId; +}; + + +Thread.prototype.exit = function() { + this.threadId = undefined; +}; + + +Thread.prototype.current = function() { + return this.threadId; +}; + + +Thread.prototype.resume = function(threadId) { + this.threadId = threadId; +}; + + diff --git a/node_modules/nodetime/lib/core/time.js b/node_modules/nodetime/lib/core/time.js new file mode 100644 index 0000000..7d44169 --- /dev/null +++ b/node_modules/nodetime/lib/core/time.js @@ -0,0 +1,90 @@ +'use strict'; + +/* + * The Time class is used to calculate execution time and CPU time + * of a call. It also emits call-start and call-done events. + */ + +function Time(agent, scope, group, isRoot) { + this.agent = agent; + + this.scope = scope; + this.group = group; + this.isRoot = isRoot; + + this.id = agent.getNextId(); + + this._begin = undefined; + this._cputime = undefined; + + this.begin = undefined; + this.end = undefined; + this.ms = undefined; + this.cputime = undefined; + + this.hasError = undefined; + + this._bytesRead = undefined; + this._bytesWritten = undefined; + + this.threadId = undefined; +}; +exports.Time = Time; + + +Time.prototype.start = function() { + var self = this; + + var system = self.agent.system; + var thread = self.agent.thread; + var processState = self.agent.processState; + + self.begin = system.millis(); + self._cputime = system.cputime(); + self._begin = system.hrtime(); + + self._bytesRead = processState.bytesRead; + self._bytesWritten = processState.bytesWritten; + + // threads + if(self.isRoot) { + self.threadId = thread.enter(); + } + else { + self.threadId = thread.current(); + } +}; + + +Time.prototype.done = function(hasError) { + var self = this; + + if(self.ms !== undefined) return false; + + var system = self.agent.system; + var thread = self.agent.thread; + var processState = self.agent.processState; + + self.ms = (system.hrtime() - self._begin) / 1000; + self.end = self.begin + self.ms; + if(self._cputime !== undefined) { + self.cputime = (system.cputime() - self._cputime) / 1000; + } + + self.hasError = hasError; + + self.bytesRead = processState.bytesRead - self._bytesRead; + self.bytesWritten = processState.bytesWritten - self._bytesWritten; + + // threads + if(self.isRoot) { + thread.exit(); + } + else { + thread.resume(self.threadId); + } + + return true; +}; + + diff --git a/node_modules/nodetime/lib/core/timers.js b/node_modules/nodetime/lib/core/timers.js new file mode 100644 index 0000000..712c3f2 --- /dev/null +++ b/node_modules/nodetime/lib/core/timers.js @@ -0,0 +1,99 @@ +'use strict'; + +function Timers(agent) { + this.agent = agent; + + this.timeoutIds = []; + this.intervalIds = []; +} +exports.Timers = Timers; + + +Timers.prototype.init = function() { + var self = this; + + self.agent.on('destroy', function() { + self.timeoutIds.forEach(function(timeoutId) { + clearTimeout(timeoutId); + }); + self.timeoutIds = []; + + self.intervalIds.forEach(function(intervalId) { + clearInterval(intervalId); + }); + self.intervalIds = []; + }); +}; + + +Timers.prototype.setTimeout = function(func, ms) { + var self = this; + + var context = {timeoutId: undefined}; + + var funcWrap = function() { + try { + func.apply(this, arguments); + } + catch(err) { + self.agent.logger.error(err); + } + + self.deleteTimeout(context.timeoutId); + }; + + context.timeoutId = setTimeout(funcWrap, ms); + this.timeoutIds.push(context.timeoutId); + + return context.timeoutId; +}; + + +Timers.prototype.setInterval = function(func, ms) { + var self = this; + + var funcWrap = function() { + try { + func(); + } + catch(err) { + self.agent.logger.error(err); + } + }; + + var intervalId = setInterval(funcWrap, ms); + self.intervalIds.push(intervalId); + return intervalId; +}; + + +Timers.prototype.clearTimeout = function(timeoutId) { + this.deleteTimeout(timeoutId); + clearTimeout(timeoutId); +}; + + +Timers.prototype.clearInterval = function(intervalId) { + this.deleteInterval(intervalId); + clearTimeout(intervalId); +}; + + +Timers.prototype.deleteTimeout = function(timeoutId) { + for (var i = 0; i < this.timeoutIds.length; i++) { + if(this.timeoutIds[i] === timeoutId) { + this.timeoutIds.splice(i, 1); + break; + } + } +}; + + +Timers.prototype.deleteInterval = function(intervalId) { + for (var i = 0; i < this.intervalIds.length; i++) { + if(this.intervalIds[i] === intervalId) { + this.intervalIds.splice(i, 1); + break; + } + } +}; diff --git a/node_modules/nodetime/lib/core/utils.js b/node_modules/nodetime/lib/core/utils.js new file mode 100644 index 0000000..51879c9 --- /dev/null +++ b/node_modules/nodetime/lib/core/utils.js @@ -0,0 +1,20 @@ +'use strict'; + +var crypto = require('crypto'); + + +function Utils(agent) { + this.agent = agent; +} +exports.Utils = Utils; + + +Utils.prototype.init = function(str) { +} + + +Utils.prototype.sha1 = function(str) { + var hash = crypto.createHash('sha1'); + hash.update(str); + return hash.digest('hex'); +}; diff --git a/node_modules/nodetime/lib/metrics/metric.js b/node_modules/nodetime/lib/metrics/metric.js new file mode 100644 index 0000000..de602ec --- /dev/null +++ b/node_modules/nodetime/lib/metrics/metric.js @@ -0,0 +1,204 @@ +'use strict'; + +/* + * Metric object used for aggregating values and trasfering + * the aggregated metric to data sender. It can have three states: + * - created/resetted + * - initialized, i.e. accumulating values + * - aggregated + */ + + +function Metric(scope, name, unit, op) { + this.scope = scope; + this.name = name; + this.value = undefined; + this.unit = unit; + this.op = op || 'avg'; + + this.source = undefined; + this._ns = undefined; + this._id = undefined; + this._ts = undefined; + + // used for aggregation only + this._sum = undefined; + this._count = undefined; + this._values = undefined; + this._bins = undefined; +} + +exports.Metric = Metric; + + + +Metric.prototype.init = function() { + var self = this; + + self.value = 0; + + // compatibility + switch(self.op) { + case 'gauge': + self.op = 'set'; + break; + case 'gaugex': + self.op = 'setx'; + break; + } + // end compatibility + + if(self.op === 'avg') { + self._sum = 0; + self._count = 0; + } + if(self.op === 'sum' || self.op === 'inc') { + self._sum = 0; + } + else if(self.op === '95th') { + self._values = []; + } + else if(self.op === 'index') { + // prefill bins + self._bins = { + 1: 0, + 10: 0, + 100: 0, + 1000: 0, + 10000: 0, + 100000: 0, + 1000000: 0 + }; + } + /*else { + // set, setx + }*/ +}; + + +Metric.prototype.isInitialized = function() { + return (this.value !== undefined) +}; + + +Metric.prototype.reset = function() { + var self = this; + + self.value = undefined; + + if(self.op === 'avg') { + self._sum = undefined; + self._count = undefined; + } + if(self.op === 'sum' || self.op === 'inc') { + self._sum = 0; + self.init(); + } + else if(self.op === '95th') { + self._values = undefined; + } + else if(self.op === 'index') { + self._bins = undefined; + } +}; + + +Metric.prototype.addValue = function(value) { + var self = this; + + if(typeof(value) !== 'number') return; + + if(self.value === undefined) { + self.init(); + } + + switch(self.op) { + case 'avg': + self._sum += value; + self._count++; + break; + case 'sum': + case 'inc': + self._sum += value; + break; + case 'set': + case 'setx': + self.value = value; + break; + case '95th': + if(self._values.length < 250) { + self._values.push(value); + } + break; + case 'index': + var bin = value < 1 ? 1 : Math.pow(10, Math.floor(Math.log(value) / Math.LN10) + 1); + if(self._bins[bin]) { + self._bins[bin]++; + } + else { + self._bins[bin] = 1; + } + break; + } +}; + + +Metric.prototype.aggregate = function() { + var self = this; + + if(self.op === 'avg') { + self.value = self._sum / self._count; + } + else if(self.op === 'sum' || self.op === 'inc') { + self.value = self._sum; + } + else if(self.op === '95th') { + if(self._values.length > 0) { + self._values = self._values.sort(function(a, b) { return a - b}); + var n = Math.floor(self._values.length * 0.95 + 0.5); + self.value = self._values[n - 1]; + } + else { + self.value = 0; + } + } + else if(self.op === 'index') { + var total = 0; + for(var bin in self._bins) { + total += self._bins[bin]; + } + + if(total !== 0) { + self.value = 0; + for(var bin in self._bins) { + self.value += + Math.round(1 / (Math.log(bin) / Math.LN10 + 1) * + (self._bins[bin] / total * 100)); + } + } + + self.value = 100 - self.value; + } +}; + + +Metric.prototype.clone = function() { + var cln = new Metric( + this.scope, + this.name, + this.unit, + this.op + ); + cln.value = this.value; + + if(this.op === 'avg') { + cln._sum = this._sum; + cln._count = this._count; + } + + return cln; +}; + + + + diff --git a/node_modules/nodetime/lib/metrics/metrics-manager.js b/node_modules/nodetime/lib/metrics/metrics-manager.js new file mode 100644 index 0000000..699928c --- /dev/null +++ b/node_modules/nodetime/lib/metrics/metrics-manager.js @@ -0,0 +1,150 @@ +'use strict'; + +var os = require('os'); +var Metric = require('./metric').Metric; + + +/* + * MetricsManager managemes metric lifecycle, i.e. keeps list + * and map of metrics, aggregates and emits every minute, etc. + * It also emits all possible metris once on agent start, to make sure + * the server gets something to start with. + */ + +function MetricsManager(agent) { + this.agent = agent; + + this.stringRegex = /^[a-zA-Z0-9 \_\-\+\'\/\.\:\?\[\]\(\)]{1,128}$/; + + this.metrics = []; + this.metricMap = {}; +} +exports.MetricsManager = MetricsManager; + + +MetricsManager.prototype.init = function() { + var self = this; + + self.agent.timers.setTimeout(function() { + self.agent.timers.setInterval(function() { + self.flush(); + }, 60000); + }, 2000); + + //send any initial values + self.agent.on('session', function() { + self.flushPartial(); + }); +}; + + +MetricsManager.prototype.createMetric = function(scope, name, unit, op) { + var self = this; + + if(this.metrics.length == 5000) { + self.agent.logger.message('too many metrics, ignoring metric'); + return new Metric(scope, name, unit, op); // dummy metric + } + + if( + !scope || typeof(scope) !== 'string' || !self.stringRegex.exec(scope) || + !name || typeof(name) !== 'string' || !self.stringRegex.exec(name) + ) { + self.agent.logger.message('metric parameter(s) missing or invalid, ignoring metric'); + return new Metric(scope, name, unit, op); // dummy metric + } + + var metric = new Metric(scope, name, unit, op); + self.metrics.push(metric); + self.metricMap[scope + '/' + name] = metric; + + return metric; +} + + +MetricsManager.prototype.findMetric = function(scope, name) { + return this.metricMap[scope + '/' + name]; +} + + + +MetricsManager.prototype.findOrCreateMetric = function(scope, name, unit, op) { + var metric = this.findMetric(scope, name); + if(!metric) { + metric = this.createMetric(scope, name, unit, op); + } + + return metric; +} + + +MetricsManager.prototype.addMetric = function(scope, name, value, unit, op) { + var metric = this.findMetric(scope, name); + if(!metric) { + metric = this.createMetric(scope, name, unit, op); + } + + metric.addValue(value); + + return metric; +} + + +MetricsManager.prototype.emit = function(metric) { + var self = this; + + try { + // convert aggregation operations to those recognized by the server + switch(metric.op) { + case 'index': + case '95th': + case 'sum': + metric.op = 'avg'; + break; + } + + metric.source = os.hostname() + '[' + process.pid + ']'; + metric._ns = 'metrics'; + metric._id = self.agent.getNextId(); + metric._ts = Date.now(); + + self.agent.emit('metric', metric); + } + catch(err) { + self.agent.logger.error(err); + } +}; + + +MetricsManager.prototype.flushPartial = function() { + var self = this; + + self.metrics.forEach(function(metric) { + if(!metric.isInitialized()) return; + + if(metric.op === 'avg' || + metric.op === 'set' || + metric.op === 'setx') + { + metric.aggregate(); + self.emit(metric.clone()); + } + }); +}; + + +MetricsManager.prototype.flush = function() { + var self = this; + + self.metrics.forEach(function(metric) { + if(!metric.isInitialized()) return; + + metric.aggregate(); + + if(metric.value !== undefined) { + self.emit(metric.clone()); + metric.reset(); + } + }); +}; + diff --git a/node_modules/nodetime/lib/monitors/mongodb-monitor.js b/node_modules/nodetime/lib/monitors/mongodb-monitor.js new file mode 100644 index 0000000..f82ab5d --- /dev/null +++ b/node_modules/nodetime/lib/monitors/mongodb-monitor.js @@ -0,0 +1,384 @@ +'use strict'; + + + +/* + * MongoDB server and collection stats. + */ + +function MongoDBMonitor(agent) { + this.agent = agent; + + this.serversCount = 0; + this.servers = {}; + + this.collsCount = 0; + this.colls = {}; + this.collNameRegex = /[^\.\$]+\.([^\.\$]+)/; +} +exports.MongoDBMonitor = MongoDBMonitor; + + + +MongoDBMonitor.prototype.init = function(mongodb) { + var self = this; + + self.mongodb = mongodb; + + + self.agent.timers.setInterval(function() { + for(address in self.servers) { + try { + self.loadServerStatus(self.servers[address]); + } + catch(err) { + self.agent.logger.error(err); + } + } + + for(var address in self.colls) { + try { + self.loadCollStats(self.colls[address]); + } + catch(err) { + self.agent.logger.error(err); + } + } + }, 60000); +}; + + +MongoDBMonitor.prototype.monitorServer = function(host, port, dbName, auth) { + var self = this; + + var address = host + ':' + port; + var server = self.servers[address]; + + if(server || ++self.serversCount > 25) return; + + self.servers[address] = { + host: host, + port: port, + dbName: dbName, + auth: auth, + lastValues: {} + }; +} + + +MongoDBMonitor.prototype.monitorCollection = function(host, port, dbName, collName, auth) { + var self = this; + + if(!self.agent.features.mongodbMetrics) return; + + // start querying for server status + if(auth && auth.authdb === 'admin') { + self.monitorServer(host, port, dbName, auth); + } + + var m = self.collNameRegex.exec(collName); + if(!m || !m[1]) return; + collName = m[1]; + + var address = host + ':' + port + ':' + dbName + ':' + collName; + var coll = self.colls[address]; + + // add auth to existing collection + if(coll && auth) { + coll.auth = auth; + } + + if(coll || ++self.collsCount > 50) return; + + self.colls[address] = { + host: host, + port: port, + dbName: dbName, + collName: collName, + auth: auth, + lastValues: {} + }; +} + + +function getValue(stats, key) { + var props = key.split('.'); + + for(var i = 0; i < props.length; i++) { + stats = stats[props[i]]; + if(!stats) return; + } + + return parseFloat(stats); +} + + +MongoDBMonitor.prototype.metric = function(client, stats, scope, name, key, unit, isRelative, scale) { + var self = this; + + var numVal = getValue(stats, key); + if(typeof(numVal) !== 'number') return; + + if(scale) { + numVal = numVal * scale; + } + + if(isRelative) { + if(client.lastValues[key]) { + self.agent.metric( + scope, + name, + numVal - client.lastValues[key], + unit, + 'set'); + } + + client.lastValues[key] = numVal; + } + else { + self.agent.metric( + scope, + name, + numVal, + unit, + 'set'); + } +}; + + +MongoDBMonitor.prototype.done = function(db, err) { + var self = this; + + try { + if(db) db.close() + } + catch(err2) { + self.agent.logger.error(err2); + } + + if(err) { + self.agent.logger.error(err); + } +}; + + +MongoDBMonitor.prototype.loadServerStatus = function(server) { + var self = this; + + var db = new self.mongodb.Db( + server.dbName, + new self.mongodb.Server(server.host, server.port, {'auto_reconnect': false, 'poolSize': 1}), + {safe: false}); + + db.open(function(err) { + if(err) return self.done(db, err); + + try { + db.admin(function(err, adminDb) { + if(err) return self.done(db, err); + if(!adminDb) return; + + try { + adminDb.authenticate(server.auth.username, server.auth.password, function(err, result) { + if(err) return self.done(db, err); + if(!result) return self.done(db, 'mongodb server auth failed'); + + try { + adminDb.serverStatus(function(err, serverStatus) { + if(err) return self.done(db, err); + if(!serverStatus) return self.done(db, 'mongodb serverStatus empty'); + + try { + self.extractServerMetrics(server, serverStatus); + + self.done(db); + } + catch(err) { + self.done(db, err); + } + }); + } + catch(err) { + self.done(db, err); + } + }); + } + catch(err) { + self.done(db, err); + } + }); + } + catch(err) { + self.done(db, err); + } + }); +}; + + + +MongoDBMonitor.prototype.extractServerMetrics = function(server, serverStatus) { + var self = this; + + var scope = + 'MongoDB Server/' + + server.host + ':' + server.port; + + self.metric(server, serverStatus, scope, 'Global lock/Total time', 'globalLock.totalTime', 'ms/minute', true, 1/1024); + self.metric(server, serverStatus, scope, 'Global lock/Lock time', 'globalLock.lockTime', 'ms/minute', true, 1/1024); + self.metric(server, serverStatus, scope, 'Global lock/Current queue/Total', 'globalLock.currentQueue.total', null, false); + self.metric(server, serverStatus, scope, 'Global lock/Current queue/Readers', 'globalLock.currentQueue.readers', null, false); + self.metric(server, serverStatus, scope, 'Global lock/Current queue/Writers', 'globalLock.currentQueue.writers', null, false); + self.metric(server, serverStatus, scope, 'Global lock/Active clients/Total', 'globalLock.activeClients.total', null, false); + self.metric(server, serverStatus, scope, 'Global lock/Active clients/Readers', 'globalLock.activeClients.readers', null, false); + self.metric(server, serverStatus, scope, 'Global lock/Active clients/Writers', 'globalLock.activeClients.writers', null, false); + self.metric(server, serverStatus, scope, 'Memory/Resident', 'mem.resident', 'MB', false); + self.metric(server, serverStatus, scope, 'Memory/Virtual', 'mem.virtual', 'MB', false); + self.metric(server, serverStatus, scope, 'Memory/Mapped', 'mem.mapped', 'MB', false); + self.metric(server, serverStatus, scope, 'Memory/Mapped with journal', 'mem.mappedWithJournal', 'MB', false); + self.metric(server, serverStatus, scope, 'Connections/Current', 'connections.current', null, false); + self.metric(server, serverStatus, scope, 'Connections/Available', 'connections.available', null, false); + self.metric(server, serverStatus, scope, 'Extra info/Heap usage', 'extra_info.heap_usage_bytes', 'MB', false, 1/1048576); + self.metric(server, serverStatus, scope, 'Extra info/Page faults', 'extra_info.page_faults', 'count/minute', true); + self.metric(server, serverStatus, scope, 'Index counters/BTree/Accesses', 'indexCounters.btree.accesses', 'count/minute', true); + self.metric(server, serverStatus, scope, 'Index counters/BTree/Hits', 'indexCounters.btree.hits', 'count/minute', true); + self.metric(server, serverStatus, scope, 'Index counters/BTree/Misses', 'indexCounters.btree.misses', 'count/minute', true); + self.metric(server, serverStatus, scope, 'Index counters/BTree/Resets', 'indexCounters.btree.resets', 'count/minute', true); + self.metric(server, serverStatus, scope, 'Index counters/BTree/Miss ratio', 'indexCounters.btree.missRatio', null, false); + self.metric(server, serverStatus, scope, 'Background flushing/Flushes', 'backgroundFlushing.flushes', 'count/minute', true); + self.metric(server, serverStatus, scope, 'Background flushing/Time', 'backgroundFlushing.total_ms', 'ms/minute', true); + self.metric(server, serverStatus, scope, 'Background flushing/Average time', 'backgroundFlushing.average_ms', 'ms', false); + self.metric(server, serverStatus, scope, 'Cursors/Total open', 'cursors.totalOpen', null, false); + self.metric(server, serverStatus, scope, 'Cursors/Timed out', 'cursors.timedOut', 'count/minute', true); + self.metric(server, serverStatus, scope, 'Network/Bytes in', 'network.bytesIn', 'Bytes/minute', true); + self.metric(server, serverStatus, scope, 'Network/Bytes out', 'network.bytesOut', 'Bytes/minute', true); + self.metric(server, serverStatus, scope, 'Network/Number of requests', 'network.numRequests', 'count/minute', true); + self.metric(server, serverStatus, scope, 'Operation counters/insert', 'opcounters.insert', 'count/minute', true); + self.metric(server, serverStatus, scope, 'Operation counters/query', 'opcounters.query', 'count/minute', true); + self.metric(server, serverStatus, scope, 'Operation counters/update', 'opcounters.update', 'count/minute', true); + self.metric(server, serverStatus, scope, 'Operation counters/delete', 'opcounters.delete', 'count/minute', true); + self.metric(server, serverStatus, scope, 'Operation counters/getmore', 'opcounters.getmore', 'count/minute', true); + self.metric(server, serverStatus, scope, 'Operation counters/command', 'opcounters.command', 'count/minute', true); + + // Journaling stats have intervals smaller than a minute + /* + self.metric(server, serverStatus, scope, '', 'dur.commits', , ); + self.metric(server, serverStatus, scope, '', 'dur.journaledMB', , ); + self.metric(server, serverStatus, scope, '', 'dur.writeToDataFilesMB', , ); + self.metric(server, serverStatus, scope, '', 'dur.compression', , ); + self.metric(server, serverStatus, scope, '', 'dur.commitsInWriteLock', , ); + self.metric(server, serverStatus, scope, '', 'dur.earlyCommits', , ); + self.metric(server, serverStatus, scope, '', 'dur.timeMs.dt', , ); + self.metric(server, serverStatus, scope, '', 'dur.timeMs.prepLogBuffer', , ); + self.metric(server, serverStatus, scope, '', 'dur.timeMs.writeToJournal', , ); + self.metric(server, serverStatus, scope, '', 'dur.timeMs.writeToDataFiles', , ); + self.metric(server, serverStatus, scope, '', 'dur.timeMs.remapPrivateView', , ); + */ +}; + + + +MongoDBMonitor.prototype.loadCollStats = function(coll) { + var self = this; + + var db = new self.mongodb.Db( + coll.dbName, + new self.mongodb.Server(coll.host, coll.port, {'auto_reconnect': false, 'poolSize': 1}), + {safe: false}); + + db.open(function(err) { + if(err) return self.done(db, err); + + if(coll.auth) { + if(coll.auth.authdb === 'admin') { + try { + db.admin(function(err, adminDb) { + if(err) return self.done(db, err); + if(!adminDb) return; + + try { + adminDb.authenticate(coll.auth.username, coll.auth.password, function(err, result) { + if(err) return self.done(db, err); + if(!result) return self.done(db, 'mongodb server auth failed'); + + loadStats(); + }); + } + catch(err) { + self.done(db, err); + } + }); + } + catch(err) { + self.done(db, err); + } + } + else { + try { + db.authenticate(coll.auth.username, coll.auth.password, function(err, result) { + if(err) return self.done(db, err); + if(!result) return self.done(db, 'mongodb server auth failed'); + + loadStats(); + }); + } + catch(err) { + self.done(db, err); + } + } + } + else { + loadStats(); + } + + + function loadStats() { + try { + db.collection(coll.collName, function(err, collection) { + if(err) return self.done(db, err); + + try { + collection.stats(function(err, stats) { + if(err) return self.done(db, err); + if(!stats) return self.done(db); + + try { + self.extractCollMetrics(coll, stats) + + self.done(db); + } + catch(err) { + self.done(db, err); + } + }); + } + catch(err) { + self.done(db, err); + } + }); + } + catch(err) { + self.done(db, err); + } + } + }); +}; + + + +MongoDBMonitor.prototype.extractCollMetrics = function(coll, stats) { + var self = this; + + var scope = + 'MongoDB Collection/' + + coll.host + ':' + coll.port + '/' + + coll.dbName + '/' + + coll.collName; + + self.metric(coll, stats, scope, 'Object count', 'count', null, false); + self.metric(coll, stats, scope, 'Collection size', 'size' ,'MB', false, 1/1048576); + self.metric(coll, stats, scope, 'Average object size', 'avgObjSize', 'Bytes', false); + self.metric(coll, stats, scope, 'Storage size', 'storageSize', 'MB', false, 1/1048576); + self.metric(coll, stats, scope, 'Index size', 'totalIndexSize', 'MB', false, 1/1048576); + self.metric(coll, stats, scope, 'Padding factor', 'paddingFactor', null, false); +}; + diff --git a/node_modules/nodetime/lib/monitors/redis-monitor.js b/node_modules/nodetime/lib/monitors/redis-monitor.js new file mode 100644 index 0000000..d3f5f2e --- /dev/null +++ b/node_modules/nodetime/lib/monitors/redis-monitor.js @@ -0,0 +1,161 @@ +'use strict'; + + + +/* + * Redis server stats. + */ + +function RedisMonitor(agent) { + this.agent = agent; + + this.redis = undefined; + + this.clientsCount = 0; + this.clients = {}; +} +exports.RedisMonitor = RedisMonitor; + + + +RedisMonitor.prototype.init = function(redis) { + var self = this; + + self.redis = redis; + + self.agent.timers.setInterval(function() { + for(var address in self.clients) { + try { + self.loadInfo(self.clients[address]); + } + catch(err) { + self.agent.logger.error(err); + } + } + }, 60000); +} + + + +RedisMonitor.prototype.monitorServer = function(host, port, password) { + var self = this; + + if(!self.agent.features.redisMetrics) return; + + var address = host + ':' + port; + if(self.clients[address]) { + if(password) { + self.clients[address].password = password; + } + } + else if(++self.clientsCount <= 10) { + self.clients[address] = { + host: host, + port: port, + password: password, + lastValues: {} + }; + } +} + + +RedisMonitor.prototype.metric = function(client, info, scope, name, key, unit, isRelative, scale) { + var self = this; + + var numVal = parseFloat(info[key]); + if(typeof(numVal) !== 'number') return; + + if(scale) { + numVal = numVal * scale; + } + + if(isRelative) { + if(client.lastValues[key]) { + self.agent.metric( + scope, + name, + numVal - client.lastValues[key], + unit, + 'set'); + } + + client.lastValues[key] = numVal; + } + else { + self.agent.metric( + scope, + name, + numVal, + unit, + 'set'); + } +}; + + +RedisMonitor.prototype.done = function(rClient, err) { + var self = this; + + try { + rClient.quit(); + } + catch(err2) { + try { + rClient.end(); + } + catch(err3) { + self.agent.logger.error(err3); + } + + self.agent.logger.error(err2); + } + + self.agent.logger.error(err); +}; + + +RedisMonitor.prototype.loadInfo = function(client) { + var self = this; + + var rClient = self.redis.createClient(client.port, client.host); + + rClient.on('error', function(err) { + self.done(rClient, err); + }); + + if(client.password) { + rClient.auth(client.password, function(err) { + if(err) self.done(rClient, err); + }); + } + + rClient.on('ready', function() { + try { + var info = rClient.server_info; + var scope = 'Redis Server/' + client.host + ':' + client.port; + + self.metric(client, info, scope, 'Used CPU sys' ,'used_cpu_sys' , null, true); + self.metric(client, info, scope, 'Used CPU user' ,'used_cpu_user' , null, true); + self.metric(client, info, scope, 'Connected clients' ,'connected_clients' , null, false); + self.metric(client, info, scope, 'Connected slaves' ,'connected_slaves' , null, false); + self.metric(client, info, scope, 'Blocked clients' ,'blocked_clients' , null, false); + self.metric(client, info, scope, 'Expired keys', 'expired_keys' , null, true); + self.metric(client, info, scope, 'Evicted keys' ,'evicted_keys' , null, true); + self.metric(client, info, scope, 'Keyspace hits' ,'keyspace_hits' , null, true); + self.metric(client, info, scope, 'Keyspace misses' ,'keyspace_misses' , null, true); + self.metric(client, info, scope, 'Connections received' ,'total_connections_received' , null, true); + self.metric(client, info, scope, 'Commands processed' ,'total_commands_processed' , null, true); + self.metric(client, info, scope, 'Rejected connections' ,'rejected_connections' , null, true); + self.metric(client, info, scope, 'Used memory', 'used_memory', 'KB', false, 1/1024); + self.metric(client, info, scope, 'Used memory RSS' , 'used_memory_rss', 'KB', false); + self.metric(client, info, scope, 'Memory fragmentation ratio' , 'mem_fragmentation_ratio', null, false); + self.metric(client, info, scope, 'PubSub channels' ,'pubsub_channels' , null, false); + + self.done(rClient); + } + catch(err) { + self.done(rClient, err); + } + }); +}; + + diff --git a/node_modules/nodetime/lib/probes/cassandra-client-probe.js b/node_modules/nodetime/lib/probes/cassandra-client-probe.js new file mode 100644 index 0000000..7b5c2ec --- /dev/null +++ b/node_modules/nodetime/lib/probes/cassandra-client-probe.js @@ -0,0 +1,114 @@ +'use strict'; + +function CassandraClientProbe(agent) { + this.agent = agent; + + this.packages = ['cassandra-client']; +} +exports.CassandraClientProbe = CassandraClientProbe; + + +CassandraClientProbe.prototype.attach = function(obj) { + var self = this; + + if(obj.__nodetimeProbeAttached__) return; + obj.__nodetimeProbeAttached__ = true; + + var proxy = self.agent.proxy; + var profiler = self.agent.profiler; + var counter = profiler.createSkipCounter(); + var metrics = profiler.createCallMetricsGroups(); + var type = 'Cassandra'; + + // connect + [obj.Connection.prototype, obj.PooledConnection.prototype].forEach(function(proto) { + proxy.before(proto, 'connect', function(obj, args) { + var client = obj; + var trace = profiler.stackTrace(); + var time = profiler.time(type, 'connect'); + metrics.callStart(type, null, time); + metrics.callStart(type, 'connect', time); + + proxy.callback(args, -1, function(obj, args) { + if(!time.done(proxy.hasError(args))) return; + metrics.callDone(type, null, time); + metrics.callDone(type, command, time); + if(counter.skip(time)) return; + + var error = proxy.getErrorMessage(args); + var sample = profiler.createSample(); + sample['Type'] = type; + sample['Connection'] = connection(client); + sample['Command'] = 'connect'; + sample['Stack trace'] = trace; + sample['Error'] = error; + sample._group = type + ': connect'; + sample._label = type + ': connect'; + + profiler.addSample(time, sample); + }); + }); + }); + + + // execute + [obj.Connection.prototype, obj.PooledConnection.prototype].forEach(function(proto) { + proxy.before(proto, 'execute', function(obj, args) { + var client = obj; + var trace = profiler.stackTrace(); + var command = args.length > 0 ? args[0] : undefined; + var params = args.length > 1 && Array.isArray(args[1]) ? args[1] : undefined; + var time = profiler.time(type, 'execute'); + metrics.callStart(type, null, time); + metrics.callStart(type, 'execute', time); + + proxy.callback(args, -1, function(obj, args) { + if(!time.done()) return; + metrics.callDone(type, null, time); + metrics.callDone(type, 'execute', time); + if(counter.skip(time)) return; + + var error = args.length > 0 ? (args[0] ? args[0].message : undefined) : undefined; + var sample = profiler.createSample(); + sample['Type'] = type; + sample['Connection'] = connection(client); + sample['Command'] = command; + sample['Arguments'] = profiler.truncate(params); + sample['Stack trace'] = trace; + sample['Error'] = error; + sample._group = type + ': ' + command; + sample._label = type + ': ' + command; + + profiler.addSample(time, sample); + }); + }); + }); +}; + + +var connection = function(client) { + var connection = undefined; + + if(client.connectionInfo) { + connection = { + host: client.connectionInfo.host, + port: client.connectionInfo.port, + keyspace: client.connectionInfo.keyspace, + user: client.connectionInfo.user + }; + } + else if(client.connections && client.connections.length > 0) { + connection = []; + conn.connections.forEach(function(conn) { + connection.push({ + host: conn.host, + port: conn.port, + keyspace: conn.keyspace, + user: conn.user + }); + }); + } + + return connection; +}; + diff --git a/node_modules/nodetime/lib/probes/cassandra-probe.js b/node_modules/nodetime/lib/probes/cassandra-probe.js new file mode 100644 index 0000000..0b20472 --- /dev/null +++ b/node_modules/nodetime/lib/probes/cassandra-probe.js @@ -0,0 +1,71 @@ +'use strict'; + + +var commands = [ + 'get', + 'count', + 'set', + 'remove', + 'truncate', + 'use', + 'addKeySpace', + 'dropKeySpace' +]; + + +/* + * This probe is not used. Should be revisited. + */ + +function CassandraProbe(agent) { + this.agent = agent; + + this.packages = ['cassandra']; +} +exports.CassandraProbe = CassandraProbe; + + +CassandraProbe.prototype.attach = function(obj) { + var self = this; + + if(obj.__nodetimeProbeAttached__) return; + obj.__nodetimeProbeAttached__ = true; + + var proxy = self.agent.proxy; + var profiler = self.agent.profiler; + var counter = profiler.createSkipCounter(); + var metrics = profiler.createCallMetricsGroups(); + var type = 'Cassandra'; + + commands.forEach(function(command) { + proxy.before(obj.ColumnFamily.prototype, command, function(obj, args) { + var cf = obj; + var trace = profiler.stackTrace(); + var params = args.length > 1 && Array.isArray(args[1]) ? args[1] : undefined; + var time = profiler.time(type, command); + metrics.callStart(type, null, time); + metrics.callStart(type, command, time); + + proxy.callback(args, -1, function(obj, args) { + if(!time.done(proxy.hasError(args)))) return; + metrics.callDone(type, null, time); + metrics.callDone(type, command, time); + if(counter.skip(time)) return; + + var error = proxy.getErrorMessage(args); + var sample = profiler.createSample(); + sample['Type'] = type; + sample['Connection'] = {host: cf.client_.host, port: cf.client_.port, keyspace: cf.client_.keyspace, columnFamily: cf.name}; + sample['Command'] = command; + sample['Arguments'] = profiler.truncate(params); + sample['Stack trace'] = trace; + sample['Error'] = error; + sample._group = type + ': ' + command; + sample._label = type + ': ' + command; + + profiler.addSample(time, sample); + }); + }); + }); +}; + diff --git a/node_modules/nodetime/lib/probes/fs-probe.js b/node_modules/nodetime/lib/probes/fs-probe.js new file mode 100644 index 0000000..3ac42f3 --- /dev/null +++ b/node_modules/nodetime/lib/probes/fs-probe.js @@ -0,0 +1,114 @@ +'use strict'; + + +var commands = [ + 'rename', + 'truncate', + 'chown', + 'fchown', + 'lchown', + 'chmod', + 'fchmod', + 'lchmod', + 'stat', + 'lstat', + 'fstat', + 'link', + 'symlink', + 'readlink', + 'realpath', + 'unlink', + 'rmdir', + 'mkdir', + 'readdir', + 'close', + 'open', + 'utimes', + 'futimes', + 'fsync', + 'write', + 'read', + 'readFile', + 'writeFile', + 'appendFile', + 'exists' +]; + + +function FsProbe(agent) { + this.agent = agent; + + this.packages = ['fs']; +} +exports.FsProbe = FsProbe; + + + +FsProbe.prototype.attach = function(obj) { + var self = this; + + if(obj.__nodetimeProbeAttached__) return; + obj.__nodetimeProbeAttached__ = true; + + var proxy = self.agent.proxy; + var profiler = self.agent.profiler; + var counter = profiler.createSkipCounter(); + var metrics = profiler.createCallMetricsGroups(); + var type = 'File System'; + + commands.forEach(function(command) { + proxy.before(obj, command, function(obj, args) { + var trace = profiler.stackTrace(); + var params = args; + var time = profiler.time(type, command); + metrics.callStart(type, null, time); + metrics.callStart(type, command, time); + + proxy.callback(args, -1, function(obj, args) { + if(!time.done(proxy.hasError(args))) return; + metrics.callDone(type, null, time); + metrics.callDone(type, command, time); + if(counter.skip(time)) return; + + var error = proxy.getErrorMessage(args); + var sample = profiler.createSample(); + sample['Type'] = type; + sample['Command'] = command; + sample['Arguments'] = profiler.truncate(params); + sample['Stack trace'] = trace; + sample['Error'] = error; + sample._group = type + ': ' + command; + sample._label = type + ': ' + command; + + profiler.addSample(time, sample); + }); + }); + + + var commandSync = command + 'Sync'; + proxy.around(obj, commandSync, function(obj, args, locals) { + locals.stackTrace = profiler.stackTrace(); + locals.params = args; + locals.time = profiler.time(type, commandSync); + metrics.callStart(type, null, locals.time); + metrics.callStart(type, commandSync, locals.time); + + }, function(obj, args, ret, locals) { + if(!locals.time.done()) return; + metrics.callDone(type, null, locals.time); + metrics.callDone(type, commandSync, locals.time); + if(counter.skip(locals.time)) return; + + var sample = profiler.createSample(); + sample['Type'] = type; + sample['Command'] = commandSync; + sample['Arguments'] = profiler.truncate(locals.params); + sample['Stack trace'] = locals.stackTrace; + sample._group = type + ': ' + commandSync; + sample._label = type + ': ' + commandSync; + + profiler.addSample(locals.time, sample); + }); + }); +}; + diff --git a/node_modules/nodetime/lib/probes/global-probe.js b/node_modules/nodetime/lib/probes/global-probe.js new file mode 100644 index 0000000..4d3c248 --- /dev/null +++ b/node_modules/nodetime/lib/probes/global-probe.js @@ -0,0 +1,24 @@ +'use strict'; + + +function GlobalProbe(agent) { + this.agent = agent; +} +exports.GlobalProbe = GlobalProbe; + + + +GlobalProbe.prototype.attach = function(obj) { + var self = this; + + var proxy = self.agent.proxy; + var thread = self.agent.thread; + + // we need these for thread simulation + proxy.before(obj, ['setTimeout', 'setInterval'], function(obj, args) { + var threadId = thread.current(); + proxy.callback(args, 0, function(obj, args) { + thread.resume(threadId); + }); + }); +}; \ No newline at end of file diff --git a/node_modules/nodetime/lib/probes/http-probe.js b/node_modules/nodetime/lib/probes/http-probe.js new file mode 100644 index 0000000..be1a21d --- /dev/null +++ b/node_modules/nodetime/lib/probes/http-probe.js @@ -0,0 +1,162 @@ +'use strict'; + + +function HttpProbe(agent) { + this.agent = agent; + + this.packages = ['http', 'https']; +} +exports.HttpProbe = HttpProbe; + + + +HttpProbe.prototype.attach = function(obj) { + var self = this; + + if(obj.__nodetimeProbeAttached__) return; + obj.__nodetimeProbeAttached__ = true; + + var proxy = self.agent.proxy; + var profiler = self.agent.profiler; + var counter = profiler.createSkipCounter(); + var serverMetrics = profiler.createCallMetricsGroups(); + var clientMetrics = profiler.createCallMetricsGroups(); + + var typeServer = 'HTTP Server'; + var typeClient = 'HTTP Client'; + + + // server probe + proxy.before(obj.Server.prototype, ['on', 'addListener'], function(obj, args) { + if(args[0] !== 'request') return; + + if(obj.__httpProbe__) return; + obj.__httpProbe__ = true; + + proxy.callback(args, -1, function(obj, args) { + var req = args[0]; + var res = args[1]; + var group = self.agent.namedTransactions.matchRequest(req); + var time = profiler.time(typeServer, group, true); + serverMetrics.callStart(typeServer, null, time); + if(group) serverMetrics.callStart(typeServer, group, time); + + var skipSample = counter.skip(time); + if(!skipSample) { + profiler.startTransaction(time); + } + + proxy.after(res, 'end', function(obj, args) { + var error = res.__caughtException__; + if(error) res.__caughtException__ = undefined; + + if(!time.done(error ? true : false)) return; + serverMetrics.callDone(typeServer, null, time); + if(group) serverMetrics.callDone(typeServer, group, time); + if(skipSample) return; + + var sample = profiler.createSample(); + sample['Type'] = typeServer; + sample['Method'] = req.method; + sample['URL'] = req.url; + sample['Request headers'] = req.headers; + sample['Status code'] = res.statusCode; + sample['Stack trace'] = profiler.formatStackTrace(error); + sample['Error'] = (error ? (error.message || 'Uncaught exeption') : undefined); + sample._group = typeServer; + sample._label = req.url; + + profiler.addSample(time, sample); + }); + }); + }); + + + // client error probe + proxy.after(obj, 'request', function(obj, args, ret) { + var time = undefined; + var trace = profiler.stackTrace(); + var opts = args[0]; + var group = (opts.method || 'GET'); + + // exclude api communication + if(opts && opts.headers && opts.headers['X-Agent-Version']) return; + + proxy.before(ret, 'end', function(obj, args) { + time = opts.__time__ = !opts.__time__ ? profiler.time(typeClient, opts.method || 'GET') : undefined; + clientMetrics.callStart(typeClient, null, time); + clientMetrics.callStart(typeClient, group, time); + }); + + proxy.before(ret, ['on', 'addListener'], function(obj, args) { + if(args[0] !== 'error') return; + + proxy.callback(args, -1, function(obj, args) { + if(!time || !time.done(proxy.hasError(args))) return; + clientMetrics.callDone(typeClient, null, time); + clientMetrics.callDone(typeClient, group, time); + if(counter.skip(time)) return; + + var error = proxy.getErrorMessage(args); + var sample = profiler.createSample(); + sample['Type'] = typeClient; + sample['Method'] = opts.method; + sample['URL'] = + (opts.hostname || opts.host) + + (opts.port ? ':' + opts.port : '') + + (opts.path || '/'); + sample['Request headers'] = opts.headers; + sample['Stack trace'] = trace; + sample['Error'] = error; + sample._group = typeClient + ': ' + group; + sample._label = typeClient + ': ' + sample.URL; + + profiler.addSample(time, sample); + }); + }); + }); + + + // client probe + proxy.before(obj, 'request', function(obj, args) { + var trace = profiler.stackTrace(); + var opts = args[0]; + var group = (opts.method || 'GET'); + + // exclude api communication + if(opts && opts.headers && opts.headers['X-Agent-Version']) return; + + proxy.callback(args, -1, function(obj, args) { + var res = args[0]; + proxy.before(res, ['on', 'addListener'], function(obj, args) { + if(args[0] !== 'end') return; + + proxy.callback(args, -1, function(obj, args) { + var time = opts.__time__; + if(!time || !time.done()) return; + clientMetrics.callDone(typeClient, null, time); + clientMetrics.callDone(typeClient, group, time); + if(counter.skip(time)) return; + + var sample = profiler.createSample(); + sample['Type'] = typeClient; + sample['Method'] = opts.method; + sample['URL'] = + (opts.hostname || opts.host) + + (opts.port ? ':' + opts.port : '') + + (opts.path || '/'); + sample['Request headers'] = opts.headers; + sample['Response headers'] = res.headers; + sample['Status code'] = res.statusCode; + sample['Stack trace'] = trace; + sample._group = typeClient + ': ' + group; + sample._label = typeClient + ': ' + sample.URL; + + profiler.addSample(time, sample); + }); + }); + }); + }); +}; + + diff --git a/node_modules/nodetime/lib/probes/memcache-probe.js b/node_modules/nodetime/lib/probes/memcache-probe.js new file mode 100644 index 0000000..9c27ae1 --- /dev/null +++ b/node_modules/nodetime/lib/probes/memcache-probe.js @@ -0,0 +1,126 @@ +'use strict'; + + +var commands = [ + 'get', + 'set', + 'delete', + 'add', + 'replace', + 'append', + 'prepend', + 'cas', + 'increment', + 'decrement', + 'stats' +]; + + + +function MemcacheProbe(agent) { + this.agent = agent; + + this.packages = ['memcache']; +} +exports.MemcacheProbe = MemcacheProbe; + + + +MemcacheProbe.prototype.attach = function(obj) { + var self = this; + + if(obj.__nodetimeProbeAttached__) return; + obj.__nodetimeProbeAttached__ = true; + + var proxy = self.agent.proxy; + var profiler = self.agent.profiler; + var counter = profiler.createSkipCounter(); + var metrics = profiler.createCallMetricsGroups(); + var type = 'Memcached'; + + // connect + proxy.after(obj.Client.prototype, 'connect', function(obj, args, ret) { + obj.__trace__ = profiler.stackTrace(); + obj.__time__ = profiler.time(type, 'connect'); + metrics.callStart(type, null, obj.__time__); + metrics.callStart(type, 'connect', obj.__time__); + }); + + proxy.before(obj.Client.prototype, 'on', function(obj, args) { + var client = obj; + var event = args[0]; + if(event !== 'connect' && event !== 'timeout' && event !== 'error') return; + + proxy.callback(args, -1, function(obj, args) { + var time = client.__time__; + if(!time || !time.done(proxy.hasError(args))) return; + metrics.callDone(type, null, time); + metrics.callDone(type, 'connect', time); + if(counter.skip(time)) return; + + var error = undefined; + if(event === 'timeout') { + error = 'socket timeout'; + } + else if(event === 'error') { + error = proxy.getErrorMessage(args); + } + + var command = 'connect'; + var sample = profiler.createSample(); + sample['Type'] = type; + sample['Connection'] = {host: client.host, port: client.port}; + sample['Command'] = command; + sample['Stack trace'] = client.__trace__; + sample['Error'] = error; + sample._group = type + ': ' + command; + sample._label = type + ': ' + command; + + profiler.addSample(time, sample); + }); + }); + + + // commands + commands.forEach(function(command) { + proxy.before(obj.Client.prototype, command, function(obj, args) { + var client = obj; + var trace = profiler.stackTrace(); + var params = args; + var time = profiler.time(type, command); + metrics.callStart(type, null, time); + metrics.callStart(type, command, time); + + // there might be args after callback, need to do extra callback search + var pos = findCallback(args); + if(pos == undefined) return; + + proxy.callback(args, pos, function(obj, args) { + if(!time.done(proxy.hasError(args))) return; + metrics.callDone(type, null, time); + metrics.callDone(type, command, time); + if(counter.skip(time)) return; + + var error = proxy.getErrorMessage(args); + var sample = profiler.createSample(); + sample['Type'] = 'Memcached'; + sample['Connection'] = {host: client.host, port: client.port}; + sample['Command'] = command; + sample['Arguments'] = profiler.truncate(params); + sample['Stack trace'] = trace; + sample['Error'] = error; + sample._group = type + ': ' + command; + sample._label = type + ': ' + command; + + profiler.addSample(time, sample); + }); + }); + }); +}; + +var findCallback = function(args) { + for(var i = 0; i < args.length; i++) + if(typeof args[i] === 'function') return i; +}; + + diff --git a/node_modules/nodetime/lib/probes/memcached-probe.js b/node_modules/nodetime/lib/probes/memcached-probe.js new file mode 100644 index 0000000..8fc39bb --- /dev/null +++ b/node_modules/nodetime/lib/probes/memcached-probe.js @@ -0,0 +1,88 @@ +'use strict'; + + +var commands = [ + 'get', + 'gets', + 'getMulti', + 'set', + 'replace', + 'add', + 'cas', + 'append', + 'prepend', + 'increment', + 'decrement', + 'incr', + 'decr', + 'del', + 'delete', + 'version', + 'flush', + 'samples', + 'slabs', + 'items', + 'flushAll', + 'statsSettings', + 'statsSlabs', + 'statsItems', + 'cachedump' +]; + + +function MemcachedProbe(agent) { + this.agent = agent; + + this.packages = ['memcached']; +} +exports.MemcachedProbe = MemcachedProbe; + + + +MemcachedProbe.prototype.attach = function(obj) { + var self = this; + + if(obj.__nodetimeProbeAttached__) return; + obj.__nodetimeProbeAttached__ = true; + + var proxy = self.agent.proxy; + var profiler = self.agent.profiler; + var counter = profiler.createSkipCounter(); + var metrics = profiler.createCallMetricsGroups(); + var type = 'Memcached'; + + commands.forEach(function(command) { + proxy.before(obj.prototype, command, function(obj, args) { + // ignore, getMulti will be called + if(command === 'get' && Array.isArray(args[0])) return; + + var client = obj; + var trace = profiler.stackTrace(); + var params = args; + var time = profiler.time(type, command); + metrics.callStart(type, null, time); + metrics.callStart(type, command, time); + + proxy.callback(args, -1, function(obj, args) { + if(!time.done(proxy.hasError(args))) return; + metrics.callDone(type, null, time); + metrics.callDone(type, command, time); + if(counter.skip(time)) return; + + var error = proxy.getErrorMessage(args); + var sample = profiler.createSample(); + sample['Type'] = type; + sample['Servers'] = client.servers; + sample['Command'] = command; + sample['Arguments'] = profiler.truncate(params); + sample['Stack trace'] = trace; + sample['Error'] = error; + sample._group = type + ': ' + command; + sample._label = type + ': ' + command; + + profiler.addSample(time, sample); + }); + }); + }); +}; + diff --git a/node_modules/nodetime/lib/probes/mongodb-probe.js b/node_modules/nodetime/lib/probes/mongodb-probe.js new file mode 100644 index 0000000..6e56934 --- /dev/null +++ b/node_modules/nodetime/lib/probes/mongodb-probe.js @@ -0,0 +1,129 @@ +'use strict'; + +var MongoDBMonitor = require('../monitors/mongodb-monitor').MongoDBMonitor; + + + +var internalCommands = [ + '_executeQueryCommand', + '_executeInsertCommand', + '_executeUpdateCommand', + '_executeRemoveCommand' +]; + +var commandMap = { + '_executeQueryCommand': 'find', + '_executeInsertCommand': 'insert', + '_executeUpdateCommand': 'update', + '_executeRemoveCommand': 'remove' +}; + + + +function MongodbProbe(agent) { + this.agent = agent; + + this.packages = ['mongodb']; +} +exports.MongodbProbe = MongodbProbe; + + + +MongodbProbe.prototype.attach = function(obj) { + var self = this; + + if(obj.__nodetimeProbeAttached__) return; + obj.__nodetimeProbeAttached__ = true; + + var proxy = self.agent.proxy; + var profiler = self.agent.profiler; + var counter = profiler.createSkipCounter(); + var metrics = profiler.createCallMetricsGroups(); + var type = 'MongoDB'; + + + var mongodbMonitor = new MongoDBMonitor(self.agent); + mongodbMonitor.init(obj); + + + internalCommands.forEach(function(internalCommand) { + var commandName = commandMap[internalCommand] || internalCommand; + + proxy.before(obj.Db.prototype, internalCommand, function(obj, args) { + var trace = profiler.stackTrace(); + var command = (args && args.length > 0) ? args[0] : undefined; + + var time = profiler.time(type, commandName); + metrics.callStart(type, null, time); + metrics.callStart(type, commandName, time); + + proxy.callback(args, -1, function(obj, args) { + if(!time.done()) return; + metrics.callDone(type, null, time); + metrics.callDone(type, commandName, time); + if(counter.skip(time)) return; + + var conn = {}; + if(command && command.db) { + var auth; + if(command.db.auths && command.db.auths.length > 0) { + auth = command.db.auths[0]; + } + + var servers = command.db.serverConfig; + if(servers) { + if(Array.isArray(servers)) { + conn.servers = []; + servers.forEach(function(server) { + conn.servers.push({host: server.host, port: server.port}); + + mongodbMonitor.monitorCollection( + server.host, + server.port, + command.db.databaseName, + command.collectionName, + auth + ); + }); + } + else { + conn.host = servers.host; + conn.port = servers.port; + + mongodbMonitor.monitorCollection( + servers.host, + servers.port, + command.db.databaseName, + command.collectionName, + auth + ); + } + } + + conn.database = command.db.databaseName; + } + + var query = command.query ? profiler.truncate(JSON.stringify(command.query)) : '{}'; + var error = proxy.getErrorMessage(args); + + var sample = profiler.createSample(); + sample['Type'] = type; + sample['Connection'] = conn; + sample['Command'] = { + collectionName: command.collectionName, + commandName: commandName, + query: query, + queryOptions: command.queryOptions, + numberToSkip: command.numberToSkip, + numberToReturn: command.numberToReturn}; + sample['Stack trace'] = trace; + sample['Error'] = error; + sample._group = type + ': ' + commandName; + sample._label = type + ': ' + commandName; + + profiler.addSample(time, sample); + }); + }); + }); +}; + diff --git a/node_modules/nodetime/lib/probes/mysql-probe.js b/node_modules/nodetime/lib/probes/mysql-probe.js new file mode 100644 index 0000000..a58c666 --- /dev/null +++ b/node_modules/nodetime/lib/probes/mysql-probe.js @@ -0,0 +1,64 @@ +'use strict'; + + +function MysqlProbe(agent) { + this.agent = agent; + + this.packages = ['mysql']; +} +exports.MysqlProbe = MysqlProbe; + + + +MysqlProbe.prototype.attach = function(obj) { + var self = this; + + if(obj.__nodetimeProbeAttached__) return; + obj.__nodetimeProbeAttached__ = true; + + var proxy = self.agent.proxy; + var profiler = self.agent.profiler; + var counter = profiler.createSkipCounter(); + var metrics = profiler.createCallMetricsGroups(); + var type = 'MySQL'; + + ['createClient', 'createConnection'].forEach(function(createCmd) { + proxy.after(obj, createCmd, function(obj, args, ret) { + var client = ret; + var config = (createCmd === 'createClient' ? client : client.config); + if(!config) return; + + proxy.before(client, 'query', function(obj, args) { + var trace = profiler.stackTrace(); + var command = args.length > 0 ? args[0] : undefined; + var params = args.length > 1 && Array.isArray(args[1]) ? args[1] : undefined; + var time = profiler.time(type, "query"); + metrics.callStart(type, null, time); + + proxy.callback(args, -1, function(obj, args) { + if(!time.done(proxy.hasError(args))) return; + metrics.callDone(type, null, time); + if(counter.skip(time)) return; + + var error = proxy.getErrorMessage(args); + var sample = profiler.createSample(); + sample['Type'] = type; + sample['Connection'] = { + host: config.host, + port: config.port, + user: config.user, + database: config.database !== '' ? config.database : undefined}; + sample['Command'] = profiler.truncate(command); + sample['Arguments'] = profiler.truncate(params); + sample['Stack trace'] = trace; + sample['Error'] = error; + sample._group = type + ': ' + 'query'; + sample._label = type + ': ' + sample['Command']; + + profiler.addSample(time, sample); + }); + }); + }); + }); +}; + diff --git a/node_modules/nodetime/lib/probes/net-probe.js b/node_modules/nodetime/lib/probes/net-probe.js new file mode 100644 index 0000000..d55bd39 --- /dev/null +++ b/node_modules/nodetime/lib/probes/net-probe.js @@ -0,0 +1,58 @@ +'use strict'; + + +function NetProbe(agent) { + this.agent = agent; + + this.packages = ['net']; +} +exports.NetProbe = NetProbe; + + + +NetProbe.prototype.attach = function(obj) { + var self = this; + + if(obj.__nodetimeProbeAttached__) return; + obj.__nodetimeProbeAttached__ = true; + + var proxy = self.agent.proxy; + + var bytesWritten = 0; + var bytesRead = 0; + + self.agent.timers.setInterval(function() { + self.agent.metric('Network', 'Data sent per minute', bytesWritten / 1024, 'KB', 'avg'); + self.agent.metric('Network', 'Data received per minute', bytesRead / 1024, 'KB', 'avg'); + + bytesWritten = bytesRead = 0; + }, 60000); + + + proxy.after(obj, ['connect', 'createConnection'], function(obj, args, ret) { + var socket = ret; + var lastBytesWritten = 0; + var lastBytesRead = 0; + var currentBytesWritten = 0; + var currentBytesRead = 0; + + proxy.before(ret, ['write', 'end'], function(obj, args) { + currentBytesWritten = socket.bytesWritten || 0; + bytesWritten += currentBytesWritten - lastBytesWritten; + self.agent.processState.bytesWritten += currentBytesWritten - lastBytesWritten; + lastBytesWritten = currentBytesWritten; + }); + + proxy.before(ret, 'on', function(obj, args) { + if(args.length < 1 || args[0] !== 'data') return; + + proxy.callback(args, -1, function(obj, args) { + currentBytesRead = socket.bytesRead || 0; + bytesRead += currentBytesRead - lastBytesRead; + self.agent.processState.bytesRead += currentBytesRead - lastBytesRead; + lastBytesRead = currentBytesRead; + }); + }); + }); +}; + diff --git a/node_modules/nodetime/lib/probes/pg-probe.js b/node_modules/nodetime/lib/probes/pg-probe.js new file mode 100644 index 0000000..eac6cd9 --- /dev/null +++ b/node_modules/nodetime/lib/probes/pg-probe.js @@ -0,0 +1,132 @@ +'use strict'; + + +function PgProbe(agent) { + this.agent = agent; + + this.packages = ['pg']; +} +exports.PgProbe = PgProbe; + + + +PgProbe.prototype.attach = function(obj) { + var self = this; + + if(obj.__nodetimeProbeAttached__) return; + obj.__nodetimeProbeAttached__ = true; + + var proxy = self.agent.proxy; + var profiler = self.agent.profiler; + var counter = profiler.createSkipCounter(); + var metrics = profiler.createCallMetricsGroups(); + var type = 'PostgreSQL'; + + + function probe(obj) { + if(obj.__nodetimeProbeAttached__) return; + obj.__nodetimeProbeAttached__ = true; + + // Callback API + proxy.before(obj, 'query', function(obj, args, ret) { + var client = obj; + var trace = profiler.stackTrace(); + var command = args.length > 0 ? args[0] : undefined; + var params = args.length > 1 && Array.isArray(args[1]) ? args[1] : undefined; + var time = profiler.time(type, "query"); + metrics.callStart(type, null, time); + + proxy.callback(args, -1, function(obj, args) { + if(!time.done(proxy.hasError(args))) return; + metrics.callDone(type, null, time); + if(counter.skip(time)) return; + + var error = proxy.getErrorMessage(args); + var sample = profiler.createSample(); + sample['Type'] = type; + sample['Connection'] = { + host: client.host, + port: client.port, + user: client.user, + database: client.database ? client.database : undefined}; + sample['Command'] = truncate(profile, command); + sample['Arguments'] = profiler.truncate(params); + sample['Stack trace'] = trace; + sample['Error'] = error; + sample._group = type + ': query'; + sample._label = type + ': ' + sample['Command']; + + profiler.addSample(time, sample); + }); + }); + + + // Evented API + proxy.after(obj, 'query', function(obj, args, ret) { + // If has a callback, ignore + if(args.length > 0 && typeof args[args.length - 1] === 'function') return; + + var client = obj; + var trace = profiler.stackTrace(); + var command = args.length > 0 ? args[0] : undefined; + var params = args.length > 1 && Array.isArray(args[1]) ? args[1] : undefined; + var time = profiler.time(type, "query"); + var error; + metrics.callStart(type, null, time); + + proxy.before(ret, 'on', function(obj, args) { + var event = args[0]; + + if(event !== 'end' && event !== 'error') return; + + proxy.callback(args, -1, function(obj, args) { + if(event === 'error') { + error = proxy.getErrorMessage(args); + return; + } + + if(!time.done(proxy.hasError(args))) return; + metrics.callDone(type, null, time); + if(counter.skip(time)) return; + + var sample = profiler.createSample(); + sample['Type'] = type; + sample['Connection'] = { + host: client.host, + port: client.port, + user: client.user, + database: client.database ? client.database : undefined}; + sample['Command'] = truncate(profiler, command); + sample['Arguments'] = profiler.truncate(params); + sample['Stack trace'] = trace; + sample['Error'] = error; + sample._group = type + ': query'; + sample._label = type + ': ' + sample['Command']; + + profiler.addSample(time, sample); + }); + }); + }); + } + + + // Native, reinitialize probe + proxy.getter(obj, 'native', function(obj, ret) { + proxy.after(ret, 'Client', function(obj, args, ret) { + probe(ret.__proto__); + }); + }); + + probe(obj.Client.prototype); +}; + + +function truncate(profiler, str) { + if(str && typeof(str) === 'object') { + str = str.text; + } + + return profiler.truncate(str); +} + + diff --git a/node_modules/nodetime/lib/probes/process-probe.js b/node_modules/nodetime/lib/probes/process-probe.js new file mode 100644 index 0000000..058f3dc --- /dev/null +++ b/node_modules/nodetime/lib/probes/process-probe.js @@ -0,0 +1,70 @@ +'use strict'; + + +function ProcessProbe(agent) { + this.agent = agent; +} +exports.ProcessProbe = ProcessProbe; + + + +ProcessProbe.prototype.attach = function(obj) { + var self = this; + + var proxy = self.agent.proxy; + var thread = self.agent.thread; + + var bytesToStdout = 0; + var bytesToStderr = 0; + var uncaughtExceptions = undefined; + + self.agent.timers.setInterval(function() { + self.agent.metric('Process', 'Data written to STDOUT per minute', bytesToStdout / 1024, 'KB', 'avg'); + self.agent.metric('Process', 'Data written to STDERR per minute', bytesToStderr / 1024, 'KB', 'avg'); + bytesToStdout = bytesToStderr = 0; + + if(uncaughtExceptions !== undefined) { + self.agent.metric('Process', 'Uncaught exceptions', uncaughtExceptions, undefined, 'avg'); + uncaughtExceptions = 0; + } + }, 60000); + + proxy.before(obj.stdout, ['write', 'end'], function(obj, args) { + bytesToStdout += calculateSize(args[0]); + }); + + if(obj.stdout !== obj.stderr) { + proxy.before(obj.stderr, ['write', 'end'], function(obj, args) { + bytesToStderr += calculateSize(args[0]); + }); + } + + proxy.before(obj, ['on', 'addListener'], function(obj, args) { + if(args[0] !== 'uncaughtException') return; + + if(uncaughtExceptions === undefined) { + uncaughtExceptions = 0; + } + + proxy.callback(args, -1, function(obj, args) { + uncaughtExceptions++; + }); + }); + + + // we need nextThick for thread simulation + proxy.before(obj, ['nextTick'], function(obj, args) { + var threadId = thread.current(); + proxy.callback(args, -1, function(obj, args) { + thread.resume(threadId); + }); + }); +}; + + +function calculateSize(args) { + if(args.length < 1) return 0; + + return args[0].length || 0; // approximate for strings +} + diff --git a/node_modules/nodetime/lib/probes/redis-probe.js b/node_modules/nodetime/lib/probes/redis-probe.js new file mode 100644 index 0000000..495cb1a --- /dev/null +++ b/node_modules/nodetime/lib/probes/redis-probe.js @@ -0,0 +1,215 @@ +'use strict'; + + +var RedisMonitor = require('../monitors/redis-monitor').RedisMonitor; + + +var commands = [ + 'append', + 'auth', + 'bgrewriteaof', + 'bgsave', + 'bitcount', + 'bitop', + 'blpop', + 'brpop', + 'brpoplpush', + 'client', + 'config', + 'dbsize', + 'debug', + 'decr', + 'decrby', + 'del', + 'discard', + 'dump', + 'echo', + 'eval', + 'evalsha', + 'exec', + 'exists', + 'expire', + 'expireat', + 'flushall', + 'flushdb', + 'get', + 'getbit', + 'getrange', + 'getset', + 'hdel', + 'hexists', + 'hget', + 'hgetall', + 'hincrby', + 'hincrbyfloat', + 'hkeys', + 'hlen', + 'hmget', + 'hmset', + 'hset', + 'hsetnx', + 'hvals', + 'incr', + 'incrby', + 'incrbyfloat', + 'info', + 'keys', + 'lastsave', + 'lindex', + 'linsert', + 'llen', + 'lpop', + 'lpush', + 'lpushx', + 'lrange', + 'lrem', + 'lset', + 'ltrim', + 'mget', + 'migrate', + 'monitor', + 'move', + 'mset', + 'msetnx', + 'multi', + 'object', + 'persist', + 'pexpire', + 'pexpireat', + 'ping', + 'psetex', + 'psubscribe', + 'pttl', + 'publish', + 'punsubscribe', + 'quit', + 'randomkey', + 'rename', + 'renamenx', + 'restore', + 'rpop', + 'rpoplpush', + 'rpush', + 'rpushx', + 'sadd', + 'save', + 'scard', + 'script', + 'sdiff', + 'sdiffstore', + 'select', + 'set', + 'setbit', + 'setex', + 'setnx', + 'setrange', + 'shutdown', + 'sinter', + 'sinterstore', + 'sismember', + 'slaveof', + 'slowlog', + 'smembers', + 'smove', + 'sort', + 'spop', + 'srandmember', + 'srem', + 'strlen', + 'subscribe', + 'sunion', + 'sunionstore', + 'sync', + 'time', + 'ttl', + 'type', + 'unsubscribe', + 'unwatch', + 'watch', + 'zadd', + 'zcard', + 'zcount', + 'zincrby', + 'zinterstore', + 'zrange', + 'zrangebyscore', + 'zrank', + 'zrem', + 'zremrangebyrank', + 'zremrangebyscore', + 'zrevrange', + 'zrevrangebyscore', + 'zrevrank', + 'zscore', + 'zunionstore' +]; + + +function RedisProbe(agent) { + this.agent = agent; + + this.packages = ['redis']; +} +exports.RedisProbe = RedisProbe; + + + +RedisProbe.prototype.attach = function(obj) { + var self = this; + + if(obj.__nodetimeProbeAttached__) return; + obj.__nodetimeProbeAttached__ = true; + + var logger = self.agent.logger; + var proxy = self.agent.proxy; + var profiler = self.agent.profiler; + var counter = profiler.createSkipCounter(); + var metrics = profiler.createCallMetricsGroups(); + var type = 'Redis'; + + + var redisMonitor = new RedisMonitor(self.agent); + redisMonitor.init(obj); + + + proxy.after(obj, 'createClient', function(obj, args, ret) { + var client = ret; + + redisMonitor.monitorServer(client.host, client.port); + + commands.forEach(function(command) { + proxy.before(ret, command, function(obj, args) { + var trace = profiler.stackTrace(); + var time = profiler.time(type, command); + metrics.callStart(type, null, time); + metrics.callStart(type, command, time); + var params = args; + + if(command === 'auth' && args.length > 0) { + redisMonitor.monitorServer(client.host, client.port, args[0]); + } + + proxy.callback(args, -1, function(obj, args) { + if(!time.done(proxy.hasError(args))) return; + metrics.callDone(type, null, time); + metrics.callDone(type, command, time); + if(counter.skip(time)) return; + + var error = proxy.getErrorMessage(args); + var sample = profiler.createSample(); + sample['Type'] = type; + sample['Connection'] = {host: client.host, port: client.port}; + sample['Command'] = command; + sample['Arguments'] = profiler.truncate(params); + sample['Stack trace'] = trace; + sample['Error'] = error; + sample._group = type + ': ' + command; + sample._label = type + ': ' + command; + + profiler.addSample(time, sample); + }); + }); + }); + }); +}; + diff --git a/node_modules/nodetime/lib/probes/socket.io-probe.js b/node_modules/nodetime/lib/probes/socket.io-probe.js new file mode 100644 index 0000000..8087f77 --- /dev/null +++ b/node_modules/nodetime/lib/probes/socket.io-probe.js @@ -0,0 +1,79 @@ +'use strict'; + + +function SocketioProbe(agent) { + this.agent = agent; + + this.packages = ['socket.io']; + this.attached = false; +} +exports.SocketioProbe = SocketioProbe; + + + +SocketioProbe.prototype.attach = function(obj) { + var self = this; + + if(obj.__nodetimeProbeAttached__) return; + obj.__nodetimeProbeAttached__ = true; + + var proxy = self.agent.proxy; + var profiler = self.agent.profiler; + var metricsManager = self.agent.metricsManager; + + var connectCount = undefined; + + var connectCountMetric = metricsManager.findOrCreateMetric('Socket.io', 'Socket count', 'count', 'avg'); + var totalConnectCountMetric = metricsManager.findOrCreateMetric('Socket.io', 'Total socket count', 'count', 'inc'); + var sentCountMetric = metricsManager.findOrCreateMetric('Socket.io', 'Messages sent per minute', 'count', 'sum'); + var receivedCountMetric = metricsManager.findOrCreateMetric('Socket.io', 'Messages received per minute', 'count', 'sum'); + + self.agent.timers.setInterval(function() { + if(connectCount !== undefined) { + connectCountMetric.addValue(connectCount); + totalConnectCountMetric.addValue(connectCount); + } + }, 60000); + + + proxy.after(obj, 'listen', function(obj, args, ret) { + if(!ret.sockets) return; + + if(connectCount === undefined) { + connectCount = 0; + } + + proxy.before(ret.sockets, ['on', 'addListener'], function(obj, args) { + if(args[0] !== 'connection') return; + + proxy.callback(args, -1, function(obj, args) { + if(!args[0]) return; + + var socket = args[0]; + + // conenctions + connectCount++; + socket.on('disconnect', function() { + connectCount--; + }); + + // sent messages + proxy.before(socket, ['emit', 'send'], function(obj, args) { + // ignore internal events + if(args[0] === 'newListener') return; + + sentCountMetric.addValue(1); + }); + + // received messages + proxy.before(socket, ['on', 'addListener'], function(obj, args) { + // ignore internal events + if(args[0] === 'disconnect') return; + + receivedCountMetric.addValue(1); + }); + }); + }); + }); +}; + diff --git a/node_modules/nodetime/lib/process/disk-stats.js b/node_modules/nodetime/lib/process/disk-stats.js new file mode 100644 index 0000000..652ca88 --- /dev/null +++ b/node_modules/nodetime/lib/process/disk-stats.js @@ -0,0 +1,74 @@ +'use strict'; + + +var os = require('os'); +var childProcess = require('child_process'); + +/* + * Sending process related data as metrics. + */ + +function DiskStats(agent) { + this.agent = agent; + + this.headerRegexLinux = undefined; + this.mountRegexLinux = undefined; + + this.headerRegexOSX = undefined; + this.mountRegexOSX = undefined; +} +exports.DiskStats = DiskStats; + + +DiskStats.prototype.init = function() { + var self = this; + + self.headerRegex = /^(Filesystem)\s+(\w+-blocks)\s+(Used)\s+(Available)\s/; + self.mountRegex = /^\/dev\/([^\s]+)\s+(\d+)\s+(\d+)\s+(\d+)\s+/; + + self.agent.timers.setInterval(function() { + self.collectMetrics(); + }, 60000); + + self.collectMetrics(); +}; + + +DiskStats.prototype.collectMetrics = function() { + var self = this; + + var hostname = os.hostname(); + + childProcess.exec('df -k', function(err, stdout, stderr) { + try { + if(err) return self.agent.logger.error(err); + + var lines = stdout.split('\n'); + if(lines.length == 0) return; + + if(!self.headerRegex.exec(lines[0])) return; + + for(var i = 1; i < lines.length; i++) { + var mount = {}; + + var mountMatch = self.mountRegex.exec(lines[i]); + if(mountMatch && mountMatch.length == 5) { + mount.device = mountMatch[1]; + mount.used = parseInt(mountMatch[3]) / 1024; + mount.available = parseInt(mountMatch[4]) / 1024; + } + + if(mount.device && mount.used !== undefined && mount.available !== undefined) { + var total = mount.used + mount.available; + + self.agent.metric('Disks/' + hostname + '/' + mount.device, 'Total space', total, 'MB', 'set'); + self.agent.metric('Disks/' + hostname + '/' + mount.device, 'Used space', mount.used, 'MB', 'set'); + } + } + } + catch(err) { + self.agent.logger.error(err); + } + }); +}; + diff --git a/node_modules/nodetime/lib/process/process-info.js b/node_modules/nodetime/lib/process/process-info.js new file mode 100644 index 0000000..066fe42 --- /dev/null +++ b/node_modules/nodetime/lib/process/process-info.js @@ -0,0 +1,139 @@ +'use strict'; + + +var os = require('os'); + +/* + * Sends process information to the server every minute + */ + +function ProcessInfo(agent) { + this.agent = agent; +} + +exports.ProcessInfo = ProcessInfo; + + +ProcessInfo.prototype.init = function() { + var self = this; + + self.agent.timers.setInterval(function() { + self.sendInfo(); + }, 60000); + + self.agent.on('session', function() { + self.sendInfo(); + }); +}; + + +ProcessInfo.prototype.sendInfo = function() { + var self = this; + + var info = {}; + info._ts = self.agent.system.millis(); + info._ns = 'info'; + info['Application name'] = self.agent.appName; + + try { + info['Hostname'] = os.hostname(); + } catch(err) { + self.logError(err) + } + + try { + info['OS type'] = os.type(); + } + catch(err) { + self.logError(err) + } + + try { + info['Platform'] = os.platform(); + } + catch(err) { + self.logError(err) + } + + try { + info['Total memory (MB)'] = os.totalmem() / 1048576; + } + catch(err) { + self.logError(err) + } + + try { + var cpus = os.cpus(); info['CPU'] = { + architecture: os.arch(), + model: cpus[0].model, + speed: cpus[0].speed, + cores: cpus.length + }; + } + catch(err) { + self.logError(err) + } + + try { + info['Interfaces'] = os.networkInterfaces(); + } + catch(err) { + self.logError(err) + } + + try { + info['OS uptime (Hours)'] = Math.floor(os.uptime() / 3600); + } + catch(err) { + self.logError(err) + } + + try { + info['Node arguments'] = process.argv; + } + catch(err) { + self.logError(err) + } + + try { + info['Node PID'] = process.pid; + } + catch(err) { + self.logError(err) + } + + try { + info['Node uptime (Hours)'] = Math.floor(process.uptime() / 3600); + } + catch(err) { + self.logError(err) + } + + try { + info['Node versions'] = process.versions; + } + catch(err) { + self.logError(err) + } + + info['Nodetime version'] = self.agent.version; + info['Nodetime options'] = { + debug: self.agent.debug, + features: self.agent.features, + transactionFilter: self.agent.profiler.filterOptions + }; + + try { + self.agent.emit('info', info); + } + catch(err) { + self.logError(err); + } +} + + +ProcessInfo.prototype.logError = function(err) { + this.agent.logger.error(err); +} + + diff --git a/node_modules/nodetime/lib/process/process-state.js b/node_modules/nodetime/lib/process/process-state.js new file mode 100644 index 0000000..e4bff27 --- /dev/null +++ b/node_modules/nodetime/lib/process/process-state.js @@ -0,0 +1,20 @@ +'use strict'; + + +/* + * ProcessState is responsible for keeping process related state. + * Certain probes are regularly updating the state. + */ + +function ProcessState(agent) { + this.agent = agent; + + this.bytesRead = 0; + this.bytesWritten = 0; +}; +exports.ProcessState = ProcessState; + + +ProcessState.prototype.init = function(str) { +} + diff --git a/node_modules/nodetime/lib/process/process-stats.js b/node_modules/nodetime/lib/process/process-stats.js new file mode 100644 index 0000000..57aaa4d --- /dev/null +++ b/node_modules/nodetime/lib/process/process-stats.js @@ -0,0 +1,71 @@ +'use strict'; + + +var os = require('os'); + + +/* + * Sending process related data as metrics. + */ + +function ProcessStats(agent) { + this.agent = agent; + + this.lastCpuTime = undefined; +} +exports.ProcessStats = ProcessStats; + + +ProcessStats.prototype.init = function() { + var self = this; + + self.agent.timers.setInterval(function() { + self.collectMetrics(); + }, 60000); + + self.collectMetrics(); +}; + + +ProcessStats.prototype.collectMetrics = function() { + var self = this; + + try { + self.agent.metric('OS', 'Load average', os.loadavg()[0], null, 'avg'); + self.agent.metric('OS', 'Total memory', os.totalmem() / 1048576, 'MB', 'avg'); + self.agent.metric('OS', 'Free memory', os.freemem() / 1048576, 'MB', 'avg'); + + if(self.agent.features.hostMetrics) { + var host = os.hostname(); + self.agent.metric('OS/' + host, 'Load average', os.loadavg()[0], null, 'set'); + self.agent.metric('OS/' + host, 'Total memory', os.totalmem() / 1048576, 'MB', 'set'); + self.agent.metric('OS/' + host, 'Free memory', os.freemem() / 1048576, 'MB', 'set'); + } + } + catch(err) { + self.agent.logger.error(err); + } + + self.agent.metric('Process', 'Agents', 1, 'count', 'inc'); + + try { + var mem = process.memoryUsage(); + self.agent.metric('Process', 'Node RSS', mem.rss / 1048576, 'MB', 'avg'); + self.agent.metric('Process', 'V8 heap used', mem.heapUsed / 1048576, 'MB', 'avg'); + self.agent.metric('Process', 'V8 heap total', mem.heapTotal / 1048576, 'MB', 'avg'); + } + catch(err) { + self.agent.logger.error(err); + } + + var cpuTime = self.agent.system.cputime(); + if(cpuTime !== undefined && self.lastCpuTime !== undefined) { + var cpuTimePerMinute = (cpuTime - self.lastCpuTime) / 1000; + self.agent.metric('Process', 'CPU time', cpuTimePerMinute, 'ms', 'avg'); + self.agent.metric('Process', 'CPU usage', cpuTimePerMinute / 60000 * 100, 'percent', 'avg'); + } + if(cpuTime !== undefined) { + self.lastCpuTime = cpuTime; + } +}; + diff --git a/node_modules/nodetime/lib/profiler/call-metrics-groups.js b/node_modules/nodetime/lib/profiler/call-metrics-groups.js new file mode 100644 index 0000000..095ca36 --- /dev/null +++ b/node_modules/nodetime/lib/profiler/call-metrics-groups.js @@ -0,0 +1,69 @@ +'use strict'; + +var CallMetrics = require('./call-metrics').CallMetrics; + + +/* + * Manages groups of metric calls. See call-metrics.js + */ + +function CallMetricsGroups(agent) { + this.agent = agent; + + this.callMetrics = undefined; + this.callMetricsGroups = {}; +} +exports.CallMetricsGroups = CallMetricsGroups; + + + +CallMetricsGroups.prototype.init = function(scope, groups) { + var self = this; + + groups.forEach(function(group) { + var callMetrics = new CallMetrics(this.agent); + callMetrics.init(scope, group); + self.callMetricsGroups[group] = callMetrics; + }); +}; + + +CallMetricsGroups.prototype.callStart = function(scope, group, time) { + if(group) { + var callMetrics = this.callMetricsGroups[group]; + if(callMetrics) { + callMetrics.callStart(time); + } + else { + callMetrics = new CallMetrics(this.agent); + callMetrics.init(scope, group); + this.callMetricsGroups[group] = callMetrics; + + callMetrics.callStart(time); + } + } + else { + if(this.callMetrics) { + this.callMetrics.callStart(time); + } + else { + this.callMetrics = new CallMetrics(this.agent); + this.callMetrics.init(scope, group); + this.callMetrics.callStart(time); + } + } +}; + + +CallMetricsGroups.prototype.callDone = function(scope, group, time) { + if(group) { + var callMetrics = this.callMetricsGroups[group]; + if(callMetrics) { + callMetrics.callDone(time); + } + } + else { + this.callMetrics.callDone(time); + } +}; + diff --git a/node_modules/nodetime/lib/profiler/call-metrics.js b/node_modules/nodetime/lib/profiler/call-metrics.js new file mode 100644 index 0000000..d170616 --- /dev/null +++ b/node_modules/nodetime/lib/profiler/call-metrics.js @@ -0,0 +1,58 @@ +'use strict'; + + +/* + * To hold a set of metrics associated with a call in closure context. + */ + +function CallMetrics(agent) { + this.agent = agent; + + this.rpm = undefined; + this.trpm = undefined; + + this.epm = undefined; + this.art = undefined; + this.rtp = undefined; + this.act = undefined; + + // Predefined performance index metric. + this.pi = this.agent.performanceIndexMetric; +} +exports.CallMetrics = CallMetrics; + + +CallMetrics.prototype.init = function(scope, group) { + var mm = this.agent.metricsManager; + + if(group) { + scope = scope + '/' + group; + } + + this.rpm = mm.findOrCreateMetric(scope, 'Requests per minute', 'count', 'sum'); + this.trpm = mm.findOrCreateMetric(scope, 'Total requests per minute', 'count', 'inc'); + + this.epm = mm.findOrCreateMetric(scope, 'Errors per minute', 'count', 'sum'); + this.art = mm.findOrCreateMetric(scope, 'Average response time', 'ms', 'avg'); + this.rtp = mm.findOrCreateMetric(scope, 'Response time 95th percentile', 'ms', '95th'); + this.act = mm.findOrCreateMetric(scope, 'Average CPU time', 'ms', 'avg'); +}; + + +CallMetrics.prototype.callStart = function(time) { + this.rpm.addValue(1); + this.trpm.addValue(1); +}; + + +CallMetrics.prototype.callDone = function(time) { + this.epm.addValue(time.hasError ? 1 : 0); + this.art.addValue(time.ms); + this.rtp.addValue(time.ms); + if(time.cputime) { + this.act.addValue(time.cputime); + } + + this.pi.addValue(time.ms); +}; + diff --git a/node_modules/nodetime/lib/profiler/custom-transaction.js b/node_modules/nodetime/lib/profiler/custom-transaction.js new file mode 100644 index 0000000..4926bc6 --- /dev/null +++ b/node_modules/nodetime/lib/profiler/custom-transaction.js @@ -0,0 +1,27 @@ +'use strict'; + + +var TimePromise = require('./time-promise').TimePromise; + + +function CustomTransaction(agent) { + this.agent = agent; + + this.counter = undefined; + this.metrics = undefined; +} +exports.CustomTransaction = CustomTransaction; + + +CustomTransaction.prototype.init = function() { + this.counter = this.agent.profiler.createSkipCounter(); + this.metrics = this.agent.profiler.createCallMetricsGroups(); +}; + + +CustomTransaction.prototype.start = function(scope, label, context) { + var tp = new TimePromise(this.agent, scope, label, this.counter, this.metrics); + tp.start(context); + + return tp; +}; diff --git a/node_modules/nodetime/lib/profiler/filter/filter-key-extractor.js b/node_modules/nodetime/lib/profiler/filter/filter-key-extractor.js new file mode 100644 index 0000000..2536913 --- /dev/null +++ b/node_modules/nodetime/lib/profiler/filter/filter-key-extractor.js @@ -0,0 +1,92 @@ +'use strict'; + + +/* + * Extracts sample objec field names and emits them. DataSender + * sends them to server for displaying on the transaction profiler page. + */ + + +function FilterKeyExtractor(agent) { + this.agent = agent; + + this.filterKeys = {}; + this.sampleNum = 0; +} +exports.FilterKeyExtractor = FilterKeyExtractor; + + +FilterKeyExtractor.prototype.init = function() { + var self = this; + var profiler = self.agent.profiler; + + self.agent.on('sample', function(sample) { + if(self.agent.sessionId && !profiler.paused) { + self.collectKeys(undefined, sample, 0); + + // collect keys only from the first 25 samples + if(self.sampleNum++ < 25) { + self.collectKeys(undefined, sample, 0); + } + + // send keys only on first and tenth sample + if(self.sampleNum === 1 || self.sampleNum === 10) { + self.sendKeys(); + } + } + }); + + // send keys on transaction profiler resume + self.agent.on('resume', function() { + self.sendKeys(); + }) +}; + + +FilterKeyExtractor.prototype.collectKeys = function(key, obj, depth) { + var self = this; + + if(depth > 20) return 0; + + var isArray = Array.isArray(obj); + for(var prop in obj) { + if(prop.match(/^\_/)) continue; + + if(typeof obj[prop] === 'object') { + self.collectKeys(prop, obj[prop], depth + 1); + } + else { + if(!isArray) { + self.filterKeys[prop] = true; + } + else { + self.filterKeys[key] = true; + } + } + } +}; + + +FilterKeyExtractor.prototype.sendKeys = function() { + var self = this; + + var keys = []; + for(var prop in this.filterKeys) { + keys.push(prop); + } + + keys = keys.sort(function(a, b) { + a = a.toLowerCase(); + b = b.toLowerCase(); + + if(a > b) return 1; + if(a < b) return -1; + return 0; + }); + + if(keys.length > 0) { + self.agent.emit('filterKeys', keys); + } +}; + + diff --git a/node_modules/nodetime/lib/profiler/filter/predicate-filter.js b/node_modules/nodetime/lib/profiler/filter/predicate-filter.js new file mode 100644 index 0000000..9834229 --- /dev/null +++ b/node_modules/nodetime/lib/profiler/filter/predicate-filter.js @@ -0,0 +1,111 @@ +'use strict'; + + +var PredicateFilter = function() { +} + +exports.PredicateFilter = PredicateFilter; + + +PredicateFilter.prototype.preparePredicates = function(preds) { + var self = this; + + var parsedPreds = []; + preds.forEach(function(pred) { + var parsedPred = {}; + parsedPreds.push(parsedPred); + + parsedPred.key = pred.key; + parsedPred.op = pred.op; + parsedPred.val = pred.val; + + try{ + parsedPred.valNum = parseFloat(pred.val) + } + catch(err) { + } + + try{ + if(pred.op === 'match') parsedPred.valRe = new RegExp(pred.val); + if(typeof pred.val === 'string') parsedPred.valLc = pred.val.toLowerCase(); + } + catch(err) { + return self.agent.logger.error(err); + } + }); + + this.preds = parsedPreds; + + return true; +} + + +PredicateFilter.prototype.filter = function(sample) { + var matched = 0; + + this.preds.forEach(function(pred) { + matched += walk(pred, sample, 0); + }); + + return (matched > 0); +}; + + +function walk(pred, obj, depth) { + if(depth > 20) return 0; + + var matched = 0; + + for(var prop in obj) { + var val = obj[prop]; + + if(val === undefined || val === null) { + continue; + } + else if(typeof val === 'object') { + matched += walk(pred, val, depth + 1); + } + else if((pred.key === '*' || pred.key === prop) && test(pred, val)) { + matched++; + } + + if(matched) break; + } + + return matched; +} + + +function test(pred, val) { + var ret = false; + + if(typeof val === 'number') { + if(pred.valNum !== NaN) { + if (pred.op === '==') { + ret = (val == pred.valNum); + } + else if (pred.op === '!=') { + ret = (val != pred.valNum); + } + else if (pred.op === '<') { + ret = (val < pred.valNum); + } + else if (pred.op === '>') { + ret = (val > pred.valNum); + } + } + } + else if(typeof val === 'string') { + if(pred.op === 'match' && pred.valRe) { + ret = pred.valRe.exec(val); + } + else if (pred.op === '==') { + ret = (val.toLowerCase() == pred.valLc); + } + else if (pred.op === '!=') { + ret = (val.toLowerCase() != pred.valLc); + } + } + + return ret; +} diff --git a/node_modules/nodetime/lib/profiler/named-transactions.js b/node_modules/nodetime/lib/profiler/named-transactions.js new file mode 100644 index 0000000..2a511dc --- /dev/null +++ b/node_modules/nodetime/lib/profiler/named-transactions.js @@ -0,0 +1,61 @@ +'use strict'; + + +function NamedTransactions(agent) { + this.agent = agent; + + this.namedTransactions = undefined; +} +exports.NamedTransactions = NamedTransactions; + + + +NamedTransactions.prototype.init = function(config) { + var self = this; + + self.namedTransactions = {}; + + var count = 0; + for(var name in config) { + count++; + + name = name.trim(); + var pattern = config[name]; + + if(!name.match(/^[a-zA-Z0-9\_\-\ ]{1,25}$/)) { + throw new Error('Nodetime: invalid name for a named transation'); + } + + if(typeof(pattern) === 'string') { + pattern = new RegExp('^' + pattern); + } + else if(!(pattern instanceof RegExp)) { + throw new Error('Nodetime: named transaction pattern should be string or RegExp'); + } + + self.namedTransactions[name] = pattern; + } + + if(count > 10) { + throw new Error('Nodetime: max (10) number of named transactions exceeded'); + } + + if(count == 0) { + self.namedTransactions = undefined; + } +}; + + +NamedTransactions.prototype.matchRequest = function(req) { + if(this.namedTransactions) { + for(var name in this.namedTransactions) { + var pattern = this.namedTransactions[name]; + if(pattern.exec(req.url)) { + return name; + } + } + } + + return undefined; +}; + diff --git a/node_modules/nodetime/lib/profiler/profiler.js b/node_modules/nodetime/lib/profiler/profiler.js new file mode 100644 index 0000000..47a9f42 --- /dev/null +++ b/node_modules/nodetime/lib/profiler/profiler.js @@ -0,0 +1,370 @@ +'use strict'; + + +var Time = require('../core/time').Time; +var Sample = require('./sample').Sample; +var SkipCounter = require('./skip-counter').SkipCounter; +var CallMetrics = require('./call-metrics').CallMetrics; +var CallMetricsGroups = require('./call-metrics-groups').CallMetricsGroups; +var PredicateFilter = require('./filter/predicate-filter').PredicateFilter; +var FilterKeyExtractor = require('./filter/filter-key-extractor').FilterKeyExtractor; + +/* + * Trasaction profiler is responsible for managing the sampling process: + * pausing and resuming sampling, finding related operations, + * emitting samples and providing api for probes to create samples. + */ + +function Profiler(agent) { + this.agent = agent; + + this.enabled = false; + this.paused = true; + this.pauseAt = undefined; + this.filterFunc = undefined; + this.filterOptions = undefined; + + this.info = undefined; + this.state = {}; + this.transactions = {}; + this.stackTraceCalls = 0; + this.stackTraceFilter = /nodetime/; + + this.filterKeyExtractor = new FilterKeyExtractor(this.agent); +} +exports.Profiler = Profiler; + + +Profiler.prototype.init = function() { + var self = this; + + self.enabled = self.agent.features.transactionProfiler; + + self.agent.on('info', function(info) { + self.info = info; + }); + + self.agent.on('metric', function(metric) { + if(!self.state[metric.scope]) self.state[metric.scope] = {}; + self.state[metric.scope][metric.name + (metric.unit ? ' (' + metric.unit + ')' : '')] = metric.value; + }); + + + // cleanup transactions + self.agent.timers.setInterval(function() { + // expire transactions older than 5 minunes, which have not ended + var now = Date.now(); + for(var threadId in self.transactions) { + if(self.transactions[threadId].started + 300000 < now) { + delete self.transactions[threadId]; + } + } + }, 5000); + + + // init sample field sender + self.filterKeyExtractor.init(); + + + // listen for server commands + self.agent.on('command', function(command, args) { + switch(command) { + case 'pause': + self.pause(); + break; + + case 'resume': + self.resume(); + break; + + case 'filter': + self.filter(args) + break; + } + }); + + + // pause profiler when destroyed + self.agent.on('destroy', function() { + if(!self.paused) { + self.pause(); + } + }); + + + // autopause profiler if not paused explicitly + self.agent.timers.setInterval(function() { + if(!self.paused && Date.now() > self.pauseAt) + self.pause(); + }, 1000); +} + + + +Profiler.prototype.pause = function(keepState) { + var self = this; + + this.paused = true; + + if(!keepState) { + self.pauseAt = undefined; + self.filterFunc = undefined; + self.filterOptions = undefined; + } + + try { + self.agent.emit('pause'); + self.agent.logger.log('profiler paused'); + } + catch(err) { + self.agent.logger.error(err); + } +}; + + + +Profiler.prototype.resume = function(seconds) { + if(!seconds) seconds = 180; + + this.pauseAt = Date.now() + seconds * 1000; + this.paused = false; + + try { + this.agent.emit('resume', seconds); + this.agent.logger.log('profiler resumed for ' + seconds + ' seconds'); + } + catch(err) { + self.agent.logger.error(err); + } +}; + + + +Profiler.prototype.filter = function(filterOptions) { + var self = this; + + if(filterOptions) { + var pf = new PredicateFilter(); + if(pf.preparePredicates(filterOptions)) { + self.filterFunc = function(sample) { + return pf.filter(sample); + }; + self.filterOptions = filterOptions; + } + } + else { + self.filterFunc = undefined; + self.filterOptions = undefined; + } +}; + + +Profiler.prototype.createCallMetrics = function(scope, group) { + var callMetrics = new CallMetrics(this.agent); + callMetrics.init(scope, group); + + return callMetrics; +}; + + +Profiler.prototype.createCallMetricsGroups = function(scope, groups) { + return new CallMetricsGroups(this.agent); +}; + + +Profiler.prototype.time = function(scope, group, isRoot) { + var t = new Time(this.agent, scope, group, isRoot); + t.start(); + + return t; +}; + + +Profiler.prototype.stackTrace = function() { + if(this.paused || this.stackTraceCalls++ > 1000) { + return undefined; + } + + var err = new Error(); + Error.captureStackTrace(err); + + return this.formatStackTrace(err); +}; + + +Profiler.prototype.formatStackTrace = function(err) { + var self = this; + + if(err && err.stack) { + var lines = err.stack.split("\n"); + lines.shift(); + lines = lines.filter(function(line) { + return !self.stackTraceFilter.exec(line) + }); + + return lines; + } + + return undefined; +}; + + +Profiler.prototype.createSample = function() { + return new Sample(); +}; + + +Profiler.prototype.createSkipCounter = function() { + var skipCounter = new SkipCounter(this.agent); + skipCounter.init(); + return skipCounter; +}; + + +Profiler.prototype.startTransaction = function(time) { + var self = this; + + self.transactions[time.threadId] = { + operations: [], + started: Date.now() + }; +} + + +Profiler.prototype.endTransaction = function(time) { + delete this.transactions[time.threadId]; +} + + + +Profiler.prototype.addSample = function(time, sample) { + var self = this; + + if(!self.enabled) { + return; + } + + process.nextTick(function() { + try { + self._addSample(time, sample); + } + catch(err) { + self.agent.logger.error(err); + } + }); +}; + + +Profiler.prototype._addSample = function(time, sample) { + var self = this; + + sample._version = self.agent.version; + sample._ns = 'samples'; + sample._id = time.id; + sample._isRoot = time.isRoot; + sample._begin = time.begin; + sample._end = time.end; + sample._ms = time.ms; + sample._ts = time.begin; + sample._cputime = time.cputime; + sample._threadId = time.threadId; + + if(sample._label.length > 80) sample._label = sample._label.substring(0, 80) + '...'; + + sample['Response time (ms)'] = sample._ms; + sample['Timestamp (ms)'] = sample._ts; + if(sample._cputime !== undefined) sample['CPU time (ms)'] = sample._cputime; + if(!sample._isRoot) { + sample['Bytes read (KB)'] = time.bytesRead / 1024; + sample['Bytes written (KB)'] = time.bytesWritten / 1024; + } + + if(sample._isRoot) { + var transaction = self.transactions[sample._threadId]; + if(transaction) { + // sort nested operations, slowest first + transaction.operations = transaction.operations.sort(function(a, b) { + return b._ms - a._ms; + }); + + sample['Operations'] = transaction.operations.splice(0, 50); + } + sample['Node state'] = self.state; + sample['Node information'] = self.info; + + try { + if(!self.filterFunc || self.filterFunc(sample)) { + sample._filtered = true; + } + + self.agent.emit('sample', sample); + } + catch(err) { + self.agent.logger.error(err); + } + + self.endTransaction(time); + } + else { + // if there is a started request, buffer its nested operations + var transaction = self.transactions[sample._threadId]; + if(transaction) { + transaction.operations.push(sample); + } + + try { + if(!self.filterFunc || self.filterFunc(sample)) { + sample._filtered = true; + } + + self.agent.emit('sample', sample); + } + catch(err) { + self.agent.logger.error(err); + } + } +}; + + +Profiler.prototype.truncate = function(args) { + if(!args) return undefined; + + if(typeof args === 'string') { + return (args.length > 80 ? (args.substr(0, 80) + '...') : args); + } + + if(!args.length) return undefined; + + var arr = []; + var argsLen = (args.length > 10 ? 10 : args.length); + for(var i = 0; i < argsLen; i++) { + if(typeof args[i] === 'string') { + if(args[i].length > 80) { + arr.push(args[i].substr(0, 80) + '...'); + } + else { + arr.push(args[i]); + } + } + else if(typeof args[i] === 'number') { + arr.push(args[i]); + } + else if(args[i] === undefined) { + arr.push('[undefined]'); + } + else if(args[i] === null) { + arr.push('[null]'); + } + else if(typeof args[i] === 'object') { + arr.push('[object]'); + } + if(typeof args[i] === 'function') { + arr.push('[function]'); + } + } + + if(argsLen < args.length) arr.push('...'); + + return arr; +}; + diff --git a/node_modules/nodetime/lib/profiler/sample.js b/node_modules/nodetime/lib/profiler/sample.js new file mode 100644 index 0000000..8c8682c --- /dev/null +++ b/node_modules/nodetime/lib/profiler/sample.js @@ -0,0 +1,43 @@ +'use strict'; + + +function Sample() { + this['Type'] = undefined; + this['Connection'] = undefined; + this['Command'] = undefined; + this['Arguments'] = undefined; + this['Stack trace'] = undefined; + this['Error'] = undefined; + this['URL'] = undefined; + this['Method'] = undefined; + this['Request headers'] = undefined; + this['Response headers'] = undefined; + this['Status code'] = undefined; + this._group = undefined; + this._version = undefined; + this._ns = undefined; + this._id = undefined; + this._isRoot = undefined; + this._begin = undefined; + this._end = undefined; + this._ms = undefined; + this._ts = undefined; + this._cputime = undefined; + this._threadId = undefined; + this['Response time (ms)'] = undefined; + this['Timestamp (ms)'] = undefined; + this['CPU time (ms)'] = undefined; + this['Bytes read (KB)'] = undefined; + this['Bytes written (KB)'] = undefined; + this['Start context'] = undefined; + this['End context'] = undefined; + this['Operations'] = undefined; + this['Node state'] = undefined; + this['Node information'] = undefined; + this._filtered = undefined; + this._realtime = undefined; + this._slow = undefined; +} + +exports.Sample = Sample; + diff --git a/node_modules/nodetime/lib/profiler/skip-counter.js b/node_modules/nodetime/lib/profiler/skip-counter.js new file mode 100644 index 0000000..62eb890 --- /dev/null +++ b/node_modules/nodetime/lib/profiler/skip-counter.js @@ -0,0 +1,45 @@ +'use strict'; + + +function SkipCounter(agent) { + this.agent = agent; + + this.counter = undefined; + this.groupCounter = undefined; +}; +exports.SkipCounter = SkipCounter; + + +SkipCounter.prototype.init = function() { + var self = this; + + self.counter = 0; + self.groupCounter = {}; + + self.agent.timers.setInterval(function() { + self.counter = 0; + self.groupCounter = {}; + }, 10000); +} + + +SkipCounter.prototype.skip = function(time) { + var group = time.group; + + if(group) { + var count = this.groupCounter[group]; + + if(!count) { + this.groupCounter[group] = 1; + return false; + } + else { + this.groupCounter[group] = ++count; + return (count > 10); + } + } + else { + return (++this.counter > 10); + } +} + \ No newline at end of file diff --git a/node_modules/nodetime/lib/profiler/time-promise.js b/node_modules/nodetime/lib/profiler/time-promise.js new file mode 100644 index 0000000..a3187a5 --- /dev/null +++ b/node_modules/nodetime/lib/profiler/time-promise.js @@ -0,0 +1,52 @@ +'use strict'; + + +function TimePromise(agent, scope, label, counter, metrics) { + this.agent = agent; + + this.scope = scope; + this.label = label; + this.counter = counter; + this.metrics = metrics; + + this.stackTrace = undefined; + this.time = undefined; + this.context = undefined; +}; +exports.TimePromise = TimePromise; + + + +TimePromise.prototype.start = function(scope, label, context) { + var self = this; + var profiler = self.agent.profiler; + + self.stackTrace = profiler.stackTrace(), + self.time = profiler.time(self.scope, self.label, true), + self.metrics.callStart(self.scope, self.label, self.time); + profiler.startTransaction(self.time); + + this.context = context; +}; + + + +TimePromise.prototype.end = function(context) { + var self = this; + var profiler = self.agent.profiler; + + if(!self.time.done()) return; + self.metrics.callDone(self.scope, self.label, self.time); + if(self.counter.skip(self.time)) return; + + var sample = profiler.createSample(); + sample['Type'] = self.scope; + sample['Start context'] = self.context; + sample['End context'] = context; + sample['Stack trace'] = self.stackTrace; + if(context && context['Error']) sample['Error'] = context['Error']; + sample._group = self.scope; + sample._label = self.scope + ': ' + self.time.group; + + profiler.addSample(self.time, sample); +}; diff --git a/node_modules/nodetime/lib/saas/data-sender.js b/node_modules/nodetime/lib/saas/data-sender.js new file mode 100644 index 0000000..822143d --- /dev/null +++ b/node_modules/nodetime/lib/saas/data-sender.js @@ -0,0 +1,126 @@ +'use strict'; + + +function DataSender(agent) { + this.agent = agent; + this.infoBuffer = undefined; + this.metricsBuffer = []; + this.samplesBuffer = {}; + this.slowSamplesBuffer = {}; +} +exports.DataSender = DataSender; + + +DataSender.prototype.init = function() { + var self = this; + var saasClient = self.agent.saasClient; + + self.agent.on('session', function() { + self.agent.on('info', function(info) { + self.infoBuffer = info; + }); + + self.agent.on('metric', function(metric) { + self.metricsBuffer.push(metric); + }); + + self.agent.on('sample', function(sample) { + // only send if profiler is active and sample was also filtered + // by profiler and not only emitted as historically slowest samples + if(!self.agent.profiler.paused && sample._filtered) { + self.samplesBuffer[sample._group] || (self.samplesBuffer[sample._group] = []); + self.samplesBuffer[sample._group].push(sample); + } + + self.slowSamplesBuffer[sample._group] || (self.slowSamplesBuffer[sample._group] = []); + self.slowSamplesBuffer[sample._group].push(sample); + }); + + self.agent.on('cpuProfile', function(cpuProfile) { + saasClient.sendCommand('updateData', cpuProfile); + }); + + self.agent.on('heapSnapshot', function(heapSnapshot) { + saasClient.sendCommand('updateData', heapSnapshot); + }); + + self.agent.on('filterKeys', function(filterKeys) { + saasClient.sendCommand('updateFilterKeys', filterKeys); + }); + + + // send info and metrics and empty the buffers + self.agent.timers.setInterval(function() { + self.sendInfo(); + self.sendMetrics(); + }, 2000); + + // send samples and empty the buffer + self.agent.timers.setInterval(function() { + self.sendSamples(); + }, 5000); + + // send slow samples and empty the buffer + self.agent.timers.setInterval(function() { + self.sendSlowSamples(); + }, 60000); + }); +}; + + +DataSender.prototype.sendInfo = function() { + var self = this; + + if(self.infoBuffer) { + self.agent.saasClient.sendCommand('updateData', self.infoBuffer); + self.infoBuffer = undefined; + } +}; + + +DataSender.prototype.sendMetrics = function() { + var self = this; + + self.metricsBuffer.forEach(function(metric) { + self.agent.saasClient.sendCommand('updateData', metric); + }); + + self.metricsBuffer = []; +}; + + +DataSender.prototype.sendSamples = function() { + var self = this; + + for(var group in self.samplesBuffer) { + var samples = self.samplesBuffer[group].sort(function(a, b) { + return b._ms - a._ms; + }); + + for(var i = 0; i < (samples.length < 5 ? samples.length : 5); i++) { + self.agent.saasClient.sendCommand('updateData', samples[i]); + } + } + + self.samplesBuffer = {}; +}; + + +DataSender.prototype.sendSlowSamples = function() { + var self = this; + + for(var group in self.slowSamplesBuffer) { + var samples = self.slowSamplesBuffer[group].sort(function(a, b) { + return b._ms - a._ms; + }); + + for(var i = 0; i < (samples.length < 5 ? samples.length : 5); i++) { + samples[i]._slow = true; + self.agent.saasClient.sendCommand('updateData', samples[i]); + } + } + + self.slowSamplesBuffer = {}; +}; + + diff --git a/node_modules/nodetime/lib/saas/gzip-request.js b/node_modules/nodetime/lib/saas/gzip-request.js new file mode 100644 index 0000000..dc73a73 --- /dev/null +++ b/node_modules/nodetime/lib/saas/gzip-request.js @@ -0,0 +1,47 @@ +'use strict'; + + +var request = require('request'); +var zlib = require('zlib'); + + +module.exports = function(options, callback) { + if(!options.json) { + return request(options, callback); + } + + var gzipRequest = {}; + + options.headers || (options.headers = {}); + zlib.gzip(JSON.stringify(options.json), function(err, buf) { + if(err) return callback(err); + + options.body = buf; + options.headers['Content-type'] = 'application/json'; + options.headers['Content-encoding'] = 'gzip'; + delete options.json; + + var req = request(options, function(err, response, body) { + if(err) return callback(err); + + if(response.headers['content-encoding'] === 'gzip') { + zlib.gunzip(body, function(err, buf) { + if(err) return callback(err); + + if(options.encoding) { + callback(err, response, buf.toString(options.encoding)); + } + }); + } + else { + callback(err, response, body); + } + }); + + for(var prop in req) { + gzipRequest[prop] = req[prop]; + } + }); + + return gzipRequest; +}; diff --git a/node_modules/nodetime/lib/saas/saas-client.js b/node_modules/nodetime/lib/saas/saas-client.js new file mode 100644 index 0000000..b3fc4ff --- /dev/null +++ b/node_modules/nodetime/lib/saas/saas-client.js @@ -0,0 +1,189 @@ +'use strict'; + + +var os = require("os"); +var util = require("util"); +var request = require("request"); +var gzipRequest = require("./gzip-request"); + + +function SaasClient(agent) { + this.agent = agent; + + this.sessionId = undefined; + this.agentId = os.hostname() + ':' + process.pid; + this.headers = { + 'X-Agent-Version': this.agent.version + }; + + this.retry = 2; + + this._lastTimestamp = 0; + this._pollFailed = 0; + this._pollOngoing = false; + this._pushFailed = 0; + this._pushOngoing = false; + this._pushBuffer = []; +} +exports.SaasClient = SaasClient; + + +SaasClient.prototype.init = function(server, proxyServer, sessionId) { + var self = this; + + this.server = server || 'https://api.nodetime.com'; + self.proxyServer = proxyServer; + self.sessionId = sessionId; + + self.agent.timers.setInterval(function() { + if(!self._pushOngoing) self._push(); + }, 1000); + + self.agent.timers.setInterval(function() { + if(!self._pollOngoing) self._poll(); + }, 1000); + + + self.agent.on('destroy', function() { + self.destroy(); + }); +}; + +exports.SaasClient = SaasClient; + + +SaasClient.prototype.switchSessionId = function(sessionId) { + this.sessionId = sessionId; +} + + +SaasClient.prototype.destroy = function() { + if(this._deferTimeoutId) clearTimeout(this._deferTimeoutId); + + if(this._pollRequest) { + this._pollRequest.abort(); + if(this._pollRequest.timeoutTimer) { + clearTimeout(this._pollRequest.timeoutTimer); + } + } + + if(this._pushRequest) { + this._pushRequest.abort(); + if(this._pushRequest.timeoutTimer) { + clearTimeout(this._pushRequest.timeoutTimer); + } + } +} + + +SaasClient.prototype.sendCommand = function(cmd, args) { + this._pushBuffer.push({ + payload: { + cmd: cmd, + args: args + }, + ts: new Date().getTime() + }); +}; + + +SaasClient.prototype._push = function() { + var self = this; + + if(self._pushBuffer.length == 0) return; + + self._pushOngoing = true; + var buf = this._pushBuffer; + self._pushBuffer = []; + self._pushRequest = gzipRequest({ + method: "POST", + url: self.server + '/agent/push/' + + '?session_id=' + self.sessionId + + '&agent_id=' + self.agentId, + proxy: self.proxyServer, + json: buf, + timeout: 10000, + headers: self.headers + }, function(err, response, body) { + if(err || response.statusCode != 200) { + if(++self._pushFailed == self.retry) { + self._pushFailed = 0; + } + else { + // put back + self._pushBuffer = buf.concat(self._pushBuffer); + } + + self.agent.logger.error(err || "error pushung message(s)"); + } + else { + self._pushFailed = 0; + + self.agent.logger.log("sent message(s) to server"); + } + + self._pushOngoing = false; + }); +}; + + +SaasClient.prototype._poll = function() { + var self = this; + + self._pollOngoing = true; + self._pollRequest = request({ + url: self.server + '/agent/poll/' + + '?session_id=' + self.sessionId + + '&agent_id=' + self.agentId + + '&since=' + (self._lastTimestamp || ''), + proxy: self.proxyServer, + encoding: "utf8", + timeout: 70000, + headers: self.headers + }, function(err, response, body) { + if(err || response.statusCode != 200) { + self._deferPoll(); + return self.agent.logger.error(err || 'poll request error'); + } + + try { + var msgs = JSON.parse(body); + msgs = msgs || []; + + msgs.forEach(function(msg) { + if(msg && msg.ts && msg.payload && msg.payload.cmd) { + self.agent.logger.log("message(s) received from server"); + self._lastTimestamp = msg.ts; + + self.agent.emit("command", msg.payload.cmd, msg.payload.args); + } + else { + self.agent.logger.error("invalid message for client " + self.group); + } + }); + } + catch(err) { + self._deferPoll(); + return self.agent.logger.error(err); + } + + self._pollFailed = 0; + self._pollOngoing = false; + }); +}; + + +SaasClient.prototype._deferPoll = function() { + var self = this; + + if(++self._pollFailed == self.retry) { + self._deferTimeoutId = setTimeout(function() { + self._pollFailed = 0; + self._pollOngoing = false; + }, 60000); + } + else { + self._pollOngoing = false; + } +} + diff --git a/node_modules/nodetime/lib/v8/cpu-profiler.js b/node_modules/nodetime/lib/v8/cpu-profiler.js new file mode 100644 index 0000000..03b05dd --- /dev/null +++ b/node_modules/nodetime/lib/v8/cpu-profiler.js @@ -0,0 +1,162 @@ +'use strict'; + + +var os = require('os'); + + +function CpuProfiler(agent) { + this.agent = agent; + + this.active = false; + this.origPaused; +} +exports.CpuProfiler = CpuProfiler; + + + +CpuProfiler.prototype.init = function() { + var self = this; + + // if paused during CPU profiling, do not resume automatically + self.agent.on('pause', function() { + self.origPaused = true; + }); + + // listening for command + self.agent.on('command', function(command, args) { + if(command === 'profileCpu') { + try { + if(typeof args === 'number' && args > 0 && args <= 60) { + self.startCpuProfiler(args); + } + } + catch(err) { + self.agent.logger.error(err); + self.active = false; + } + } + }); +} + + +CpuProfiler.prototype.sendError = function(msg) { + var self = this; + + var obj = {}; + obj._id = self.agent.getNextId(); + obj._label = os.hostname() + ' [' + process.pid + ']'; + obj._ts = self.agent.system.millis(); + obj._ns = 'cpu-profiles'; + obj['Error'] = msg; + + try { + self.agent.emit('cpuProfle', obj); + } + catch(err) { + self.agent.logger.error(err); + } +} + + + +CpuProfiler.prototype.startCpuProfiler = function(seconds) { + var self = this; + + if(!self.agent.nodetimeNative) { + return self.sendError("V8 tools are not loaded."); + } + + if(self.active) { + return self.sendError("CPU profiler is already active."); + } + + self.active = true; + + seconds || (seconds = 10); + + var paused = self.agent.profiler.paused; + if(!paused) { + self.agent.profiler.pause(true); + self.origPaused = paused; + } + + + self.agent.nodetimeNative.startV8Profiler(); + self.agent.logger.log("V8 CPU profiler started"); + + // stop v8 profiler automatically after 10 seconds + self.agent.timers.setTimeout(function() { + self.stopCpuProfiler(); + }, seconds * 1000); + + self.agent.on('destroy', function() { + self.stopCpuProfiler(); + }); +}; + + +CpuProfiler.prototype.stopCpuProfiler = function() { + var self = this; + + if(!self.agent.nodetimeNative || !self.active) return; + + var nodes = {}; + var root = undefined; + var rootSamplesCount = undefined; + + self.agent.nodetimeNative.stopV8Profiler(function(parentCallUid, callUid, totalSamplesCount, functionName, scriptResourceName, lineNumber) { + if(rootSamplesCount === undefined) + rootSamplesCount = totalSamplesCount; + + var cpuUsage = ((totalSamplesCount * 100) / rootSamplesCount || 1); + var obj = { + _totalSamplesCount: totalSamplesCount, + _functionName: functionName, + _scriptResourceName: scriptResourceName, + _lineNumber: lineNumber, + _cpuUsage: cpuUsage, + _id: self.agent.getNextId(), + _target: [], + _label: cpuUsage.toFixed(2) + "% - " + functionName + }; + + if(scriptResourceName && lineNumber) + obj._label += " (" + scriptResourceName + ":" + lineNumber + ")"; + + nodes[callUid] = obj; + if(root === undefined) { + root = obj; + } + + if(parentCallUid) { + var parentNode = nodes[parentCallUid]; + if(parentNode) parentNode._target.push(obj); + } + }); + + self.agent.logger.log("V8 CPU profiler stopped"); + + if(root) { + var profile = {}; + profile._id = self.agent.getNextId(); + profile._label = os.hostname() + ' [' + process.pid + ']'; + profile._ts = self.agent.system.millis(); + profile._ns = 'cpu-profiles'; + profile.root = root; + + try { + self.agent.emit('cpuProfile', profile); + } + catch(err) { + self.agent.logger.error(err); + } + } + + + if(!self.origPaused) { + self.agent.profiler.resume(); + } + + self.active = false; +}; + diff --git a/node_modules/nodetime/lib/v8/gc-stats.js b/node_modules/nodetime/lib/v8/gc-stats.js new file mode 100644 index 0000000..fa089c1 --- /dev/null +++ b/node_modules/nodetime/lib/v8/gc-stats.js @@ -0,0 +1,37 @@ +'use strict'; + + + +function GCStats(agent) { + this.agent = agent; +} +exports.GCStats = GCStats; + + + +GCStats.prototype.init = function() { + var self = this; + + if(!self.agent.nodetimeNative) return; + + var mm = self.agent.metricsManager; + + var numFullGC = mm.findOrCreateMetric('Garbage Collection', 'Full GCs per minute', null, 'sum'); + var numIncGC = mm.findOrCreateMetric('Garbage Collection', 'Incremental GCs per minute', null, 'sum'); + var sizeChange = mm.findOrCreateMetric('Garbage Collection', 'Used heap size change per minute', 'MB', 'sum'); + var lastUsedHeapSize = undefined; + + self.agent.nodetimeNative.afterGC(function(gcType, gcFlags, usedHeapSize) { + if(gcType === 'kGCTypeMarkSweepCompact') { + numFullGC.addValue(1); + } + else if(gcType === 'kGCTypeScavenge') { + numIncGC.addValue(1); + } + + if(lastUsedHeapSize !== undefined) { + sizeChange.addValue((usedHeapSize - lastUsedHeapSize) / 1048576); + } + lastUsedHeapSize = usedHeapSize; + }); +}; diff --git a/node_modules/nodetime/lib/v8/heap-profiler.js b/node_modules/nodetime/lib/v8/heap-profiler.js new file mode 100644 index 0000000..6ec2042 --- /dev/null +++ b/node_modules/nodetime/lib/v8/heap-profiler.js @@ -0,0 +1,457 @@ +'use strict'; + + +var os = require('os'); +var EventEmitter = require('events').EventEmitter; + + +function HeapProfiler(agent) { + this.agent = agent; + + this.active = false; +} +exports.HeapProfiler = HeapProfiler; + + +HeapProfiler.prototype.init = function() { + var self = this; + + // if paused during CPU profiling, do not resume automatically + self.agent.on('pause', function() { + self.origPaused = true; + }); + + + // listening for command + self.agent.on('command', function(command, args) { + if(command === 'takeHeapSnapshot') { + try { + self.takeHeapSnapshot(); + } + catch(err) { + self.agent.logger.error(err); + self.active = false; + } + } + }); +} + + + +HeapProfiler.prototype.sendError = function(msg) { + var self = this; + + var obj = {}; + obj._id = self.agent.getNextId(); + obj._label = os.hostname() + ' [' + process.pid + ']'; + obj._ts = self.agent.system.millis(); + obj._ns = 'heap-snapshots'; + obj['Error'] = msg; + + try { + self.agent.emit('heapSnapshot', obj); + } + catch(err) { + self.agent.logger.error(err); + } +} + + + +HeapProfiler.prototype.takeHeapSnapshot = function() { + var self = this; + + if(!self.agent.nodetimeNative) { + return self.sendError("V8 tools are not loaded."); + } + + if(self.active) { + return self.sendError("Heap profiler is already active."); + } + + self.active = true; + + self.agent.logger.log("V8 heap profiler starting..."); + + var snapshot = {}; + var nodeEmitter = new EventEmitter(); + + self.buildRetainerGroups(nodeEmitter, snapshot); + self.buildObjectGroups(nodeEmitter, snapshot); + + var nodes = {}; + self.agent.nodetimeNative.takeHeapSnapshot(function(parentNodeUid, nodeUid, name, type, selfSize, retainerName, retainerType) { + if(retainerType === 5) return; + + if(!nodes[nodeUid]) { + nodes[nodeUid] = true; + + var node = { + nodeUid: nodeUid, + name: ((type === 2 || type == 6) && name && name.length > 25) ? + name.substring(0, 25) + '...' : + name, + type: type, + selfSize: selfSize, + retainerName: retainerName, + retainerType: retainerType, + parents: {}, + children: [] + }; + + nodeEmitter.emit('node', node); + } + }); + + + self.agent.logger.log("V8 heap profiler stopped"); + + snapshot._id = self.agent.getNextId(); + snapshot._label = os.hostname() + ' [' + process.pid + ']'; + snapshot._ts = self.agent.system.millis(); + snapshot._ns = 'heap-snapshots'; + snapshot['Retainers'] = undefined; + snapshot['Objects'] = undefined; + + nodeEmitter.emit('done'); + nodeEmitter.removeAllListeners(); + + try { + self.agent.emit('heapSnapshot', snapshot); + } + catch(err) { + self.agent.logger.error(err); + } + + self.active = false; +}; + + + +HeapProfiler.prototype.buildRetainerGroups = function(nodeEmitter, snapshot) { + var self = this; + + var groups = {}; + var totalSize = 0; + var totalCount = 0; + + nodeEmitter.on('node', function(node) { + var key = genRetainerKey(node); + var obj = groups[key]; + if(!obj) { + obj = groups[key] = { + _id: self.agent.getNextId(), + _label: genRetainerLabel(node), + _size: 0, + _count: 0, + _largestInstances: [], + _minInstanceSize: 0, + _randomInstances: [] + }; + } + + if(!obj._largestInstances) { + return; // something is wrong here + } + + obj._size += node.selfSize; + obj._count++; + + var large = (node.selfSize > obj._minInstanceSize || obj._largestInstances.length < 10); + var random = (obj._count % Math.pow(10, Math.floor(Math.log(obj._count) / Math.LN10)) == 0); + if(large || random) { + var instance = { + _id: self.agent.getNextId(), + _label: genNodeLabel(node), + _selfSize: node.selfSize, + 'Name': node.name, + 'Type': nodeTypeToString(node.type), + 'Size (KB)': (node.selfSize / 1024).toFixed(3) + }; + + if(large) { + obj._largestInstances.push(instance); + + obj._largestInstances = obj._largestInstances.sort(function(a, b) { + return b._selfSize - a._selfSize; + }); + + obj._largestInstances.splice(10); + obj._minInstanceSize = obj._largestInstances[obj._largestInstances.length - 1]._selfSize; + } + + if(random) { + obj._randomInstances.unshift(instance); + obj._randomInstances.splice(10); + } + } + + totalSize += node.selfSize; + totalCount++; + }); + + + nodeEmitter.on('done', function() { + // sort groups + var groupsOrdered = []; + for(var key in groups) { + groupsOrdered.push(groups[key]); + } + groupsOrdered = groupsOrdered.sort(function(a, b) { + return b._size - a._size; + }); + groupsOrdered.splice(25); + + + // prepare for rendering + for(var key in groups) { + var obj = groups[key]; + + obj['Size (KB)'] = (obj._size / 1024).toFixed(3); + if(totalSize > 0) obj['Size (%)'] = Math.round((obj._size / totalSize) * 100); + obj._label = obj['Size (%)'] + "% - " + obj._label; + + obj['Count'] = obj._count; + if(totalCount > 0) obj['Count (%)'] = Math.round((obj._count / totalCount) * 100); + + obj['Largest instances'] = obj._largestInstances; + obj['Random instances'] = obj._randomInstances; + + delete obj._size; + delete obj._count; + delete obj._largestInstances; + delete obj._minInstanceSize; + delete obj._randomInstances; + } + + snapshot['Retainers'] = groupsOrdered; + }); +} + + +HeapProfiler.prototype.buildObjectGroups = function(nodeEmitter, snapshot) { + var self = this; + + var groups = {}; + var totalSize = 0; + var totalCount = 0; + + nodeEmitter.on('node', function(node) { + var key = genObjectKey(node); + var obj = groups[key]; + if(!obj) { + obj = groups[key] = { + _id: self.agent.getNextId(), + _label: key, + _size: 0, + _count: 0, + _largestInstances: [], + _minInstanceSize: 0, + _randomInstances: [] + }; + } + + if(!obj._largestInstances) { + return; // something is wrong here + } + + obj._size += node.selfSize; + obj._count++; + + var large = (node.selfSize > obj._minInstanceSize || obj._largestInstances.length < 10); + var random = (obj._count % Math.pow(10, Math.floor(Math.log(obj._count) / Math.LN10)) == 0); + if(large || random) { + var instance = { + _id: self.agent.getNextId(), + _label: genNodeLabel(node), + _selfSize: node.selfSize, + 'Name': node.name, + 'Type': nodeTypeToString(node.type), + 'Size (KB)': (node.selfSize / 1024).toFixed(3) + }; + + if(large) { + obj._largestInstances.push(instance); + + obj._largestInstances = obj._largestInstances.sort(function(a, b) { + return b._selfSize - a._selfSize; + }); + + obj._largestInstances.splice(10); + obj._minInstanceSize = obj._largestInstances[obj._largestInstances.length - 1]._selfSize; + } + + if(random) { + obj._randomInstances.unshift(instance); + obj._randomInstances.splice(10); + } + } + + totalSize += node.selfSize; + totalCount++; + }); + + + nodeEmitter.on('done', function() { + // sort groups + var groupsOrdered = []; + for(var key in groups) { + groupsOrdered.push(groups[key]); + } + groupsOrdered = groupsOrdered.sort(function(a, b) { + return b._size - a._size; + }); + groupsOrdered.splice(25); + + + // prepare for rendering + for(var key in groups) { + var obj = groups[key]; + + obj['Size (KB)'] = (obj._size / 1024).toFixed(3); + if(totalSize > 0) obj['Size (%)'] = Math.round((obj._size / totalSize) * 100); + obj._name = obj._label; + obj._label = obj['Size (%)'] + "% - " + obj._label; + + obj['Count'] = obj._count; + if(totalCount > 0) obj['Count (%)'] = Math.round((obj._count / totalCount) * 100); + + obj['Largest instances'] = obj._largestInstances; + obj['Random instances'] = obj._randomInstances; + + delete obj._size; + delete obj._count; + delete obj._largestInstances; + delete obj._minInstanceSize; + delete obj._randomInstances; + } + + snapshot['Objects'] = groupsOrdered; + }); +} + + + +function genObjectKey(node) { + switch(node.type) { + case 1: + return 'Array'; + case 2: + return 'String'; + case 3: + return node.name; + case 4: + return 'compiled code'; + case 5: + return 'Function'; + case 6: + return 'RegExp'; + case 7: + return 'Number'; + case 8: + return node.name; + default: + return 'other'; + } +} + + +function genRetainerKey(node) { + if(node.retainerType == 0 || node.retainerType == 2) { + return edgeTypeToString(node.retainerType) + ':' + node.retainerName; + } + else { + return edgeTypeToString(node.retainerType); + } +} + + +function genRetainerLabel(node) { + switch(node.retainerType) { + case 0: + return 'Variable: ' + node.retainerName; + case 1: + return 'Array elements'; + case 2: + return 'Property: ' + node.retainerName; + case 4: + return 'Hidden links'; + case 6: + return 'Weak references'; + default: + return 'Other'; + } +} + + +function truncate(obj, len) { + if(!obj) return undefined; + + if(typeof(obj) === 'string') { + if(obj.length > len) { + return obj.substring(0, len) + '...'; + } + else { + return obj; + } + } + else if(typeof(obj) === 'number') { + return obj; + } +} + + +function genNodeLabel(node) { + var name = truncate(node.name, 25); + return nodeTypeToString(node.type) + (name ? (": " + name) : ""); +} + + + +function edgeTypeToString(type) { + switch(type) { + case 0: + return 'variable'; + case 1: + return 'element'; + case 2: + return 'property'; + case 3: + return 'internal'; + case 4: + return 'hidden'; + case 5: + return 'shortcut'; + case 6: + return 'weak'; + default: + return 'other'; + } +} + +function nodeTypeToString(type) { + switch(type) { + case 0: + return 'hidden'; + case 1: + return 'array'; + case 2: + return 'string'; + case 3: + return 'object'; + case 4: + return 'compiled code'; + case 5: + return 'function clojure'; + case 6: + return 'regexp'; + case 7: + return 'heap number'; + case 8: + return 'native object'; + default: + return 'other'; + } +} + + diff --git a/node_modules/nodetime/lib/v8/heap-stats.js b/node_modules/nodetime/lib/v8/heap-stats.js new file mode 100644 index 0000000..35bd048 --- /dev/null +++ b/node_modules/nodetime/lib/v8/heap-stats.js @@ -0,0 +1,46 @@ +'use strict'; + + +function HeapStats(agent) { + this.agent = agent; +} +exports.HeapStats = HeapStats; + + +HeapStats.prototype.init = function() { + var self = this; + + self.agent.on('heapSnapshot', function(heapSnapshot) { + var objs = heapSnapshot['Objects']; + if(!objs || !Array.isArray(objs)) return; + + var len = objs.length < 6 ? objs.length : 6; + for(var i = 0; i < len; i++) { + var obj = objs[i]; + + if(obj._name === 'other') { + continue; + } + + var objSize = parseFloat(obj['Size (KB)']); + if(objSize) { + self.agent.metric( + 'Heap Snapshot', + obj._name + '/Size', + objSize, + 'KB', + 'setx'); + } + + var objCount = parseInt(obj['Count']) + if(objCount) { + self.agent.metric( + 'Heap Snapshot', + obj._name + '/Count', + objCount, + null, + 'setx'); + } + } + }); +}; \ No newline at end of file diff --git a/node_modules/nodetime/node_modules/nodetime-native/.npmignore b/node_modules/nodetime/node_modules/nodetime-native/.npmignore new file mode 100644 index 0000000..db470e2 --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/.npmignore @@ -0,0 +1,7 @@ +.git* +test/ +.DS_Store +node_modules/ +npm-debug.log +build +.lock-wscript diff --git a/node_modules/nodetime/node_modules/nodetime-native/LICENSE b/node_modules/nodetime/node_modules/nodetime-native/LICENSE new file mode 100644 index 0000000..d3f3199 --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2012 Rapidlogix UG + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to use, copy and distribute the Software. It is strictly prohibited to +modify, merge, publish, sublicense and/or sell copies of the Software, +including substantial modification of the execution flow of the Software +at run-time by means other than documented. + +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. diff --git a/node_modules/nodetime/node_modules/nodetime-native/README.md b/node_modules/nodetime/node_modules/nodetime-native/README.md new file mode 100644 index 0000000..a866868 --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/README.md @@ -0,0 +1,3 @@ +Nodetime's Native Tools +=== + diff --git a/node_modules/nodetime/node_modules/nodetime-native/binding.gyp b/node_modules/nodetime/node_modules/nodetime-native/binding.gyp new file mode 100644 index 0000000..5cc7279 --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/binding.gyp @@ -0,0 +1,27 @@ +{ + 'targets': [ + { + 'target_name': 'nodetime_native', + 'sources': [ + 'src/nodetime_native.cc', + 'src/gc.cc', + 'src/gc.h', + 'src/profiler.cc', + 'src/profiler.h' + ], + 'conditions': [ + ['OS == "win"', { + 'sources': [ + 'src/system_win.cc' + ] + }, { + 'sources': [ + 'src/system_posix.cc' + ] + } + ], + ] + + } + ] +} diff --git a/node_modules/nodetime/node_modules/nodetime-native/build/Makefile b/node_modules/nodetime/node_modules/nodetime-native/build/Makefile new file mode 100644 index 0000000..98301a9 --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/build/Makefile @@ -0,0 +1,359 @@ +# We borrow heavily from the kernel build setup, though we are simpler since +# we don't have Kconfig tweaking settings on us. + +# The implicit make rules have it looking for RCS files, among other things. +# We instead explicitly write all the rules we care about. +# It's even quicker (saves ~200ms) to pass -r on the command line. +MAKEFLAGS=-r + +# The source directory tree. +srcdir := .. +abs_srcdir := $(abspath $(srcdir)) + +# The name of the builddir. +builddir_name ?= . + +# The V=1 flag on command line makes us verbosely print command lines. +ifdef V + quiet= +else + quiet=quiet_ +endif + +# Specify BUILDTYPE=Release on the command line for a release build. +BUILDTYPE ?= Release + +# Directory all our build output goes into. +# Note that this must be two directories beneath src/ for unit tests to pass, +# as they reach into the src/ directory for data with relative paths. +builddir ?= $(builddir_name)/$(BUILDTYPE) +abs_builddir := $(abspath $(builddir)) +depsdir := $(builddir)/.deps + +# Object output directory. +obj := $(builddir)/obj +abs_obj := $(abspath $(obj)) + +# We build up a list of every single one of the targets so we can slurp in the +# generated dependency rule Makefiles in one pass. +all_deps := + + + +# C++ apps need to be linked with g++. +# +# Note: flock is used to seralize linking. Linking is a memory-intensive +# process so running parallel links can often lead to thrashing. To disable +# the serialization, override LINK via an envrionment variable as follows: +# +# export LINK=g++ +# +# This will allow make to invoke N linker processes as specified in -jN. +LINK ?= ./gyp-mac-tool flock $(builddir)/linker.lock $(CXX) + +CC.target ?= $(CC) +CFLAGS.target ?= $(CFLAGS) +CXX.target ?= $(CXX) +CXXFLAGS.target ?= $(CXXFLAGS) +LINK.target ?= $(LINK) +LDFLAGS.target ?= $(LDFLAGS) +AR.target ?= $(AR) +ARFLAGS.target ?= crs + +# N.B.: the logic of which commands to run should match the computation done +# in gyp's make.py where ARFLAGS.host etc. is computed. +# TODO(evan): move all cross-compilation logic to gyp-time so we don't need +# to replicate this environment fallback in make as well. +CC.host ?= gcc +CFLAGS.host ?= +CXX.host ?= g++ +CXXFLAGS.host ?= +LINK.host ?= g++ +LDFLAGS.host ?= +AR.host ?= ar +ARFLAGS.host := crs + +# Define a dir function that can handle spaces. +# http://www.gnu.org/software/make/manual/make.html#Syntax-of-Functions +# "leading spaces cannot appear in the text of the first argument as written. +# These characters can be put into the argument value by variable substitution." +empty := +space := $(empty) $(empty) + +# http://stackoverflow.com/questions/1189781/using-make-dir-or-notdir-on-a-path-with-spaces +replace_spaces = $(subst $(space),?,$1) +unreplace_spaces = $(subst ?,$(space),$1) +dirx = $(call unreplace_spaces,$(dir $(call replace_spaces,$1))) + +# Flags to make gcc output dependency info. Note that you need to be +# careful here to use the flags that ccache and distcc can understand. +# We write to a dep file on the side first and then rename at the end +# so we can't end up with a broken dep file. +depfile = $(depsdir)/$(call replace_spaces,$@).d +DEPFLAGS = -MMD -MF $(depfile).raw + +# We have to fixup the deps output in a few ways. +# (1) the file output should mention the proper .o file. +# ccache or distcc lose the path to the target, so we convert a rule of +# the form: +# foobar.o: DEP1 DEP2 +# into +# path/to/foobar.o: DEP1 DEP2 +# (2) we want missing files not to cause us to fail to build. +# We want to rewrite +# foobar.o: DEP1 DEP2 \ +# DEP3 +# to +# DEP1: +# DEP2: +# DEP3: +# so if the files are missing, they're just considered phony rules. +# We have to do some pretty insane escaping to get those backslashes +# and dollar signs past make, the shell, and sed at the same time. +# Doesn't work with spaces, but that's fine: .d files have spaces in +# their names replaced with other characters. +define fixup_dep +# The depfile may not exist if the input file didn't have any #includes. +touch $(depfile).raw +# Fixup path as in (1). +sed -e "s|^$(notdir $@)|$@|" $(depfile).raw >> $(depfile) +# Add extra rules as in (2). +# We remove slashes and replace spaces with new lines; +# remove blank lines; +# delete the first line and append a colon to the remaining lines. +sed -e 's|\\||' -e 'y| |\n|' $(depfile).raw |\ + grep -v '^$$' |\ + sed -e 1d -e 's|$$|:|' \ + >> $(depfile) +rm $(depfile).raw +endef + +# Command definitions: +# - cmd_foo is the actual command to run; +# - quiet_cmd_foo is the brief-output summary of the command. + +quiet_cmd_cc = CC($(TOOLSET)) $@ +cmd_cc = $(CC.$(TOOLSET)) $(GYP_CFLAGS) $(DEPFLAGS) $(CFLAGS.$(TOOLSET)) -c -o $@ $< + +quiet_cmd_cxx = CXX($(TOOLSET)) $@ +cmd_cxx = $(CXX.$(TOOLSET)) $(GYP_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< + +quiet_cmd_objc = CXX($(TOOLSET)) $@ +cmd_objc = $(CC.$(TOOLSET)) $(GYP_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< + +quiet_cmd_objcxx = CXX($(TOOLSET)) $@ +cmd_objcxx = $(CXX.$(TOOLSET)) $(GYP_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< + +# Commands for precompiled header files. +quiet_cmd_pch_c = CXX($(TOOLSET)) $@ +cmd_pch_c = $(CC.$(TOOLSET)) $(GYP_PCH_CFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< +quiet_cmd_pch_cc = CXX($(TOOLSET)) $@ +cmd_pch_cc = $(CC.$(TOOLSET)) $(GYP_PCH_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< +quiet_cmd_pch_m = CXX($(TOOLSET)) $@ +cmd_pch_m = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< +quiet_cmd_pch_mm = CXX($(TOOLSET)) $@ +cmd_pch_mm = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< + +# gyp-mac-tool is written next to the root Makefile by gyp. +# Use $(4) for the command, since $(2) and $(3) are used as flag by do_cmd +# already. +quiet_cmd_mac_tool = MACTOOL $(4) $< +cmd_mac_tool = ./gyp-mac-tool $(4) $< "$@" + +quiet_cmd_mac_package_framework = PACKAGE FRAMEWORK $@ +cmd_mac_package_framework = ./gyp-mac-tool package-framework "$@" $(4) + +quiet_cmd_infoplist = INFOPLIST $@ +cmd_infoplist = $(CC.$(TOOLSET)) -E -P -Wno-trigraphs -x c $(INFOPLIST_DEFINES) "$<" -o "$@" + +quiet_cmd_touch = TOUCH $@ +cmd_touch = touch $@ + +quiet_cmd_copy = COPY $@ +# send stderr to /dev/null to ignore messages when linking directories. +cmd_copy = ln -f "$<" "$@" 2>/dev/null || (rm -rf "$@" && cp -af "$<" "$@") + +quiet_cmd_alink = LIBTOOL-STATIC $@ +cmd_alink = rm -f $@ && ./gyp-mac-tool filter-libtool libtool -static -o $@ $(filter %.o,$^) + +quiet_cmd_link = LINK($(TOOLSET)) $@ +cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) + +# TODO(thakis): Find out and document the difference between shared_library and +# loadable_module on mac. +quiet_cmd_solink = SOLINK($(TOOLSET)) $@ +cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) + +# TODO(thakis): The solink_module rule is likely wrong. Xcode seems to pass +# -bundle -single_module here (for osmesa.so). +quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@ +cmd_solink_module = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS) + + +# Define an escape_quotes function to escape single quotes. +# This allows us to handle quotes properly as long as we always use +# use single quotes and escape_quotes. +escape_quotes = $(subst ','\'',$(1)) +# This comment is here just to include a ' to unconfuse syntax highlighting. +# Define an escape_vars function to escape '$' variable syntax. +# This allows us to read/write command lines with shell variables (e.g. +# $LD_LIBRARY_PATH), without triggering make substitution. +escape_vars = $(subst $$,$$$$,$(1)) +# Helper that expands to a shell command to echo a string exactly as it is in +# make. This uses printf instead of echo because printf's behaviour with respect +# to escape sequences is more portable than echo's across different shells +# (e.g., dash, bash). +exact_echo = printf '%s\n' '$(call escape_quotes,$(1))' + +# Helper to compare the command we're about to run against the command +# we logged the last time we ran the command. Produces an empty +# string (false) when the commands match. +# Tricky point: Make has no string-equality test function. +# The kernel uses the following, but it seems like it would have false +# positives, where one string reordered its arguments. +# arg_check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \ +# $(filter-out $(cmd_$@), $(cmd_$(1)))) +# We instead substitute each for the empty string into the other, and +# say they're equal if both substitutions produce the empty string. +# .d files contain ? instead of spaces, take that into account. +command_changed = $(or $(subst $(cmd_$(1)),,$(cmd_$(call replace_spaces,$@))),\ + $(subst $(cmd_$(call replace_spaces,$@)),,$(cmd_$(1)))) + +# Helper that is non-empty when a prerequisite changes. +# Normally make does this implicitly, but we force rules to always run +# so we can check their command lines. +# $? -- new prerequisites +# $| -- order-only dependencies +prereq_changed = $(filter-out FORCE_DO_CMD,$(filter-out $|,$?)) + +# Helper that executes all postbuilds, and deletes the output file when done +# if any of the postbuilds failed. +define do_postbuilds + @E=0;\ + for p in $(POSTBUILDS); do\ + eval $$p;\ + F=$$?;\ + if [ $$F -ne 0 ]; then\ + E=$$F;\ + fi;\ + done;\ + if [ $$E -ne 0 ]; then\ + rm -rf "$@";\ + exit $$E;\ + fi +endef + +# do_cmd: run a command via the above cmd_foo names, if necessary. +# Should always run for a given target to handle command-line changes. +# Second argument, if non-zero, makes it do asm/C/C++ dependency munging. +# Third argument, if non-zero, makes it do POSTBUILDS processing. +# Note: We intentionally do NOT call dirx for depfile, since it contains ? for +# spaces already and dirx strips the ? characters. +define do_cmd +$(if $(or $(command_changed),$(prereq_changed)), + @$(call exact_echo, $($(quiet)cmd_$(1))) + @mkdir -p "$(call dirx,$@)" "$(dir $(depfile))" + $(if $(findstring flock,$(word 2,$(cmd_$1))), + @$(cmd_$(1)) + @echo " $(quiet_cmd_$(1)): Finished", + @$(cmd_$(1)) + ) + @$(call exact_echo,$(call escape_vars,cmd_$(call replace_spaces,$@) := $(cmd_$(1)))) > $(depfile) + @$(if $(2),$(fixup_dep)) + $(if $(and $(3), $(POSTBUILDS)), + $(call do_postbuilds) + ) +) +endef + +# Declare the "all" target first so it is the default, +# even though we don't have the deps yet. +.PHONY: all +all: + +# make looks for ways to re-generate included makefiles, but in our case, we +# don't have a direct way. Explicitly telling make that it has nothing to do +# for them makes it go faster. +%.d: ; + +# Use FORCE_DO_CMD to force a target to run. Should be coupled with +# do_cmd. +.PHONY: FORCE_DO_CMD +FORCE_DO_CMD: + +TOOLSET := target +# Suffix rules, putting all outputs into $(obj). +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cpp FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cxx FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.m FORCE_DO_CMD + @$(call do_cmd,objc,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.mm FORCE_DO_CMD + @$(call do_cmd,objcxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.S FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.s FORCE_DO_CMD + @$(call do_cmd,cc,1) + +# Try building from generated source, too. +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cpp FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cxx FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.m FORCE_DO_CMD + @$(call do_cmd,objc,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.mm FORCE_DO_CMD + @$(call do_cmd,objcxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.S FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.s FORCE_DO_CMD + @$(call do_cmd,cc,1) + +$(obj).$(TOOLSET)/%.o: $(obj)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.cpp FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.cxx FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.m FORCE_DO_CMD + @$(call do_cmd,objc,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.mm FORCE_DO_CMD + @$(call do_cmd,objcxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.S FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.s FORCE_DO_CMD + @$(call do_cmd,cc,1) + + +ifeq ($(strip $(foreach prefix,$(NO_LOAD),\ + $(findstring $(join ^,$(prefix)),\ + $(join ^,nodetime_native.target.mk)))),) + include nodetime_native.target.mk +endif + +quiet_cmd_regen_makefile = ACTION Regenerating $@ +cmd_regen_makefile = /Users/jfolsom/.node-gyp/0.8.8/tools/gyp/gyp -fmake --ignore-environment "--toplevel-dir=." -I/Users/jfolsom/repos/ana/node_modules/nodetime/node_modules/nodetime-native/build/config.gypi -I/usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi -I/Users/jfolsom/.node-gyp/0.8.8/common.gypi "--depth=." "-Goutput_dir=." "--generator-output=build" "-Dlibrary=shared_library" "-Dvisibility=default" "-Dnode_root_dir=/Users/jfolsom/.node-gyp/0.8.8" "-Dmodule_root_dir=/Users/jfolsom/repos/ana/node_modules/nodetime/node_modules/nodetime-native" binding.gyp +Makefile: $(srcdir)/../../../../../../.node-gyp/0.8.8/common.gypi $(srcdir)/build/config.gypi $(srcdir)/binding.gyp $(srcdir)/../../../../../../../../usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi + $(call do_cmd,regen_makefile) + +# "all" is a concatenation of the "all" targets from all the included +# sub-makefiles. This is just here to clarify. +all: + +# Add in dependency-tracking rules. $(all_deps) is the list of every single +# target in our tree. Only consider the ones with .d (dependency) info: +d_files := $(wildcard $(foreach f,$(all_deps),$(depsdir)/$(f).d)) +ifneq ($(d_files),) + include $(d_files) +endif diff --git a/node_modules/nodetime/node_modules/nodetime-native/build/Release/.deps/Release/nodetime_native.node.d b/node_modules/nodetime/node_modules/nodetime-native/build/Release/.deps/Release/nodetime_native.node.d new file mode 100644 index 0000000..6c8c020 --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/build/Release/.deps/Release/nodetime_native.node.d @@ -0,0 +1 @@ +cmd_Release/nodetime_native.node := ./gyp-mac-tool flock ./Release/linker.lock c++ -shared -Wl,-search_paths_first -mmacosx-version-min=10.5 -arch x86_64 -L./Release -install_name /usr/local/lib/nodetime_native.node -o Release/nodetime_native.node Release/obj.target/nodetime_native/src/nodetime_native.o Release/obj.target/nodetime_native/src/gc.o Release/obj.target/nodetime_native/src/profiler.o Release/obj.target/nodetime_native/src/system_posix.o -undefined dynamic_lookup diff --git a/node_modules/nodetime/node_modules/nodetime-native/build/Release/.deps/Release/obj.target/nodetime_native/src/gc.o.d b/node_modules/nodetime/node_modules/nodetime-native/build/Release/.deps/Release/obj.target/nodetime_native/src/gc.o.d new file mode 100644 index 0000000..fc7a011 --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/build/Release/.deps/Release/obj.target/nodetime_native/src/gc.o.d @@ -0,0 +1,30 @@ +cmd_Release/obj.target/nodetime_native/src/gc.o := c++ '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-D_DARWIN_USE_64_BIT_INODE=1' -I/Users/jfolsom/.node-gyp/0.8.8/src -I/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include -I/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include -Os -gdwarf-2 -mmacosx-version-min=10.5 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-rtti -fno-exceptions -fno-threadsafe-statics -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/nodetime_native/src/gc.o.d.raw -c -o Release/obj.target/nodetime_native/src/gc.o ../src/gc.cc +Release/obj.target/nodetime_native/src/gc.o: ../src/gc.cc ../src/gc.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h \ + /Users/jfolsom/.node-gyp/0.8.8/src/node.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares_version.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/uv-unix.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ngx-queue.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ev.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/eio.h \ + /Users/jfolsom/.node-gyp/0.8.8/src/node_object_wrap.h \ + /Users/jfolsom/.node-gyp/0.8.8/src/ev-emul.h \ + /Users/jfolsom/.node-gyp/0.8.8/src/eio-emul.h +../src/gc.cc: +../src/gc.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h: +/Users/jfolsom/.node-gyp/0.8.8/src/node.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares_version.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/uv-unix.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ngx-queue.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ev.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/eio.h: +/Users/jfolsom/.node-gyp/0.8.8/src/node_object_wrap.h: +/Users/jfolsom/.node-gyp/0.8.8/src/ev-emul.h: +/Users/jfolsom/.node-gyp/0.8.8/src/eio-emul.h: diff --git a/node_modules/nodetime/node_modules/nodetime-native/build/Release/.deps/Release/obj.target/nodetime_native/src/nodetime_native.o.d b/node_modules/nodetime/node_modules/nodetime-native/build/Release/.deps/Release/obj.target/nodetime_native/src/nodetime_native.o.d new file mode 100644 index 0000000..14b8c14 --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/build/Release/.deps/Release/obj.target/nodetime_native/src/nodetime_native.o.d @@ -0,0 +1,33 @@ +cmd_Release/obj.target/nodetime_native/src/nodetime_native.o := c++ '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-D_DARWIN_USE_64_BIT_INODE=1' -I/Users/jfolsom/.node-gyp/0.8.8/src -I/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include -I/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include -Os -gdwarf-2 -mmacosx-version-min=10.5 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-rtti -fno-exceptions -fno-threadsafe-statics -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/nodetime_native/src/nodetime_native.o.d.raw -c -o Release/obj.target/nodetime_native/src/nodetime_native.o ../src/nodetime_native.cc +Release/obj.target/nodetime_native/src/nodetime_native.o: \ + ../src/nodetime_native.cc /Users/jfolsom/.node-gyp/0.8.8/src/node.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares_version.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/uv-unix.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ngx-queue.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ev.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/eio.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h \ + /Users/jfolsom/.node-gyp/0.8.8/src/node_object_wrap.h \ + /Users/jfolsom/.node-gyp/0.8.8/src/ev-emul.h \ + /Users/jfolsom/.node-gyp/0.8.8/src/eio-emul.h ../src/system.h \ + ../src/gc.h ../src/profiler.h +../src/nodetime_native.cc: +/Users/jfolsom/.node-gyp/0.8.8/src/node.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares_version.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/uv-unix.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ngx-queue.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ev.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/eio.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h: +/Users/jfolsom/.node-gyp/0.8.8/src/node_object_wrap.h: +/Users/jfolsom/.node-gyp/0.8.8/src/ev-emul.h: +/Users/jfolsom/.node-gyp/0.8.8/src/eio-emul.h: +../src/system.h: +../src/gc.h: +../src/profiler.h: diff --git a/node_modules/nodetime/node_modules/nodetime-native/build/Release/.deps/Release/obj.target/nodetime_native/src/profiler.o.d b/node_modules/nodetime/node_modules/nodetime-native/build/Release/.deps/Release/obj.target/nodetime_native/src/profiler.o.d new file mode 100644 index 0000000..9524576 --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/build/Release/.deps/Release/obj.target/nodetime_native/src/profiler.o.d @@ -0,0 +1,11 @@ +cmd_Release/obj.target/nodetime_native/src/profiler.o := c++ '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-D_DARWIN_USE_64_BIT_INODE=1' -I/Users/jfolsom/.node-gyp/0.8.8/src -I/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include -I/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include -Os -gdwarf-2 -mmacosx-version-min=10.5 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-rtti -fno-exceptions -fno-threadsafe-statics -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/nodetime_native/src/profiler.o.d.raw -c -o Release/obj.target/nodetime_native/src/profiler.o ../src/profiler.cc +Release/obj.target/nodetime_native/src/profiler.o: ../src/profiler.cc \ + /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8-profiler.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h \ + ../src/profiler.h +../src/profiler.cc: +/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8-profiler.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h: +../src/profiler.h: diff --git a/node_modules/nodetime/node_modules/nodetime-native/build/Release/.deps/Release/obj.target/nodetime_native/src/system_posix.o.d b/node_modules/nodetime/node_modules/nodetime-native/build/Release/.deps/Release/obj.target/nodetime_native/src/system_posix.o.d new file mode 100644 index 0000000..d154bcf --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/build/Release/.deps/Release/obj.target/nodetime_native/src/system_posix.o.d @@ -0,0 +1,29 @@ +cmd_Release/obj.target/nodetime_native/src/system_posix.o := c++ '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-D_DARWIN_USE_64_BIT_INODE=1' -I/Users/jfolsom/.node-gyp/0.8.8/src -I/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include -I/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include -Os -gdwarf-2 -mmacosx-version-min=10.5 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-rtti -fno-exceptions -fno-threadsafe-statics -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/nodetime_native/src/system_posix.o.d.raw -c -o Release/obj.target/nodetime_native/src/system_posix.o ../src/system_posix.cc +Release/obj.target/nodetime_native/src/system_posix.o: \ + ../src/system_posix.cc /Users/jfolsom/.node-gyp/0.8.8/src/node.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares_version.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/uv-unix.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ngx-queue.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ev.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/eio.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h \ + /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h \ + /Users/jfolsom/.node-gyp/0.8.8/src/node_object_wrap.h \ + /Users/jfolsom/.node-gyp/0.8.8/src/ev-emul.h \ + /Users/jfolsom/.node-gyp/0.8.8/src/eio-emul.h +../src/system_posix.cc: +/Users/jfolsom/.node-gyp/0.8.8/src/node.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares_version.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/uv-unix.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ngx-queue.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ev.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/eio.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h: +/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h: +/Users/jfolsom/.node-gyp/0.8.8/src/node_object_wrap.h: +/Users/jfolsom/.node-gyp/0.8.8/src/ev-emul.h: +/Users/jfolsom/.node-gyp/0.8.8/src/eio-emul.h: diff --git a/node_modules/nodetime/node_modules/nodetime-native/build/Release/linker.lock b/node_modules/nodetime/node_modules/nodetime-native/build/Release/linker.lock new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/nodetime/node_modules/nodetime-native/build/Release/nodetime_native.node b/node_modules/nodetime/node_modules/nodetime-native/build/Release/nodetime_native.node new file mode 100755 index 0000000000000000000000000000000000000000..71b9c0225a0815581f3ae23a8f7e0224c249a98a GIT binary patch literal 18884 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 N#uV53_z{fbzX4P^x|RR{ literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/node_modules/nodetime-native/build/Release/obj.target/nodetime_native/src/gc.o b/node_modules/nodetime/node_modules/nodetime-native/build/Release/obj.target/nodetime_native/src/gc.o new file mode 100644 index 0000000000000000000000000000000000000000..553fb344aa80648c430145c4e6d6b2581ffe179a GIT binary patch literal 70992 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 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/node_modules/nodetime-native/build/Release/obj.target/nodetime_native/src/nodetime_native.o b/node_modules/nodetime/node_modules/nodetime-native/build/Release/obj.target/nodetime_native/src/nodetime_native.o new file mode 100644 index 0000000000000000000000000000000000000000..19005f2d5f284245fbf735622abdf413ebf252de GIT binary patch literal 40740 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 Y9oOl&UdIhOZWM{t$;}z;G*^rN1DBFK-~a#s literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/node_modules/nodetime-native/build/Release/obj.target/nodetime_native/src/profiler.o b/node_modules/nodetime/node_modules/nodetime-native/build/Release/obj.target/nodetime_native/src/profiler.o new file mode 100644 index 0000000000000000000000000000000000000000..ae7d95635cb01edc2214315d3fe6a1ee7c5830be GIT binary patch literal 56864 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%0A%VtQ*{+g)6wLxl#pE41_TcL;Q(SU5W_4ln2 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 L|DA5yi@*N^b1>b) literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/node_modules/nodetime-native/build/Release/obj.target/nodetime_native/src/system_posix.o b/node_modules/nodetime/node_modules/nodetime-native/build/Release/obj.target/nodetime_native/src/system_posix.o new file mode 100644 index 0000000000000000000000000000000000000000..5c0d41e7d6223c0d17a7aebb0f539c6ab24ab2e6 GIT binary patch literal 44296 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 CjkZJp literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/node_modules/nodetime-native/build/binding.Makefile b/node_modules/nodetime/node_modules/nodetime-native/build/binding.Makefile new file mode 100644 index 0000000..1236b53 --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/build/binding.Makefile @@ -0,0 +1,6 @@ +# This file is generated by gyp; do not edit. + +export builddir_name ?= build/./. +.PHONY: all +all: + $(MAKE) nodetime_native diff --git a/node_modules/nodetime/node_modules/nodetime-native/build/config.gypi b/node_modules/nodetime/node_modules/nodetime-native/build/config.gypi new file mode 100644 index 0000000..a0a5c0c --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/build/config.gypi @@ -0,0 +1,104 @@ +# Do not edit. File was generated by node-gyp's "configure" step +{ + "target_defaults": { + "cflags": [], + "default_configuration": "Release", + "defines": [], + "include_dirs": [], + "libraries": [] + }, + "variables": { + "clang": 0, + "gcc_version": 42, + "host_arch": "x64", + "node_install_npm": "true", + "node_install_waf": "true", + "node_prefix": "out/dist-osx/usr/local", + "node_shared_openssl": "false", + "node_shared_v8": "false", + "node_shared_zlib": "false", + "node_use_dtrace": "false", + "node_use_etw": "false", + "node_use_openssl": "true", + "target_arch": "x64", + "v8_no_strict_aliasing": 1, + "v8_use_snapshot": "false", + "nodedir": "/Users/jfolsom/.node-gyp/0.8.8", + "copy_dev_lib": "true", + "save_dev": "", + "browser": "open", + "viewer": "man", + "rollback": "true", + "usage": "", + "globalignorefile": "/usr/local/etc/npmignore", + "init_author_url": "", + "shell": "/bin/bash", + "parseable": "", + "userignorefile": "/Users/jfolsom/.npmignore", + "cache_max": "null", + "init_author_email": "", + "sign_git_tag": "", + "ignore": "", + "long": "", + "registry": "https://registry.npmjs.org/", + "fetch_retries": "2", + "npat": "", + "message": "%s", + "versions": "", + "globalconfig": "/usr/local/etc/npmrc", + "always_auth": "", + "cache_lock_retries": "10", + "fetch_retry_mintimeout": "10000", + "proprietary_attribs": "true", + "coverage": "", + "json": "", + "pre": "", + "description": "true", + "engine_strict": "", + "https_proxy": "", + "init_module": "/Users/jfolsom/.npm-init.js", + "userconfig": "/Users/jfolsom/.npmrc", + "npaturl": "http://npat.npmjs.org/", + "node_version": "v0.8.8", + "user": "501", + "editor": "vi", + "save": "", + "tag": "latest", + "global": "", + "optional": "true", + "username": "", + "force": "", + "searchopts": "", + "depth": "null", + "rebuild_bundle": "true", + "searchsort": "name", + "unicode": "true", + "yes": "", + "fetch_retry_maxtimeout": "60000", + "ca": "\"-----BEGIN CERTIFICATE-----\\nMIIChzCCAfACCQDauvz/KHp8ejANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMC\\nVVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMQwwCgYDVQQKEwNucG0x\\nIjAgBgNVBAsTGW5wbSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxDjAMBgNVBAMTBW5w\\nbUNBMRcwFQYJKoZIhvcNAQkBFghpQGl6cy5tZTAeFw0xMTA5MDUwMTQ3MTdaFw0y\\nMTA5MDIwMTQ3MTdaMIGHMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNV\\nBAcTB09ha2xhbmQxDDAKBgNVBAoTA25wbTEiMCAGA1UECxMZbnBtIENlcnRpZmlj\\nYXRlIEF1dGhvcml0eTEOMAwGA1UEAxMFbnBtQ0ExFzAVBgkqhkiG9w0BCQEWCGlA\\naXpzLm1lMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLI4tIqPpRW+ACw9GE\\nOgBlJZwK5f8nnKCLK629Pv5yJpQKs3DENExAyOgDcyaF0HD0zk8zTp+ZsLaNdKOz\\nGn2U181KGprGKAXP6DU6ByOJDWmTlY6+Ad1laYT0m64fERSpHw/hjD3D+iX4aMOl\\ny0HdbT5m1ZGh6SJz3ZqxavhHLQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAC4ySDbC\\nl7W1WpLmtLGEQ/yuMLUf6Jy/vr+CRp4h+UzL+IQpCv8FfxsYE7dhf/bmWTEupBkv\\nyNL18lipt2jSvR3v6oAHAReotvdjqhxddpe5Holns6EQd1/xEZ7sB1YhQKJtvUrl\\nZNufy1Jf1r0ldEGeA+0ISck7s+xSh9rQD2Op\\n-----END CERTIFICATE-----\\n\"", + "strict_ssl": "true", + "dev": "", + "fetch_retry_factor": "10", + "group": "20", + "cache_lock_stale": "60000", + "version": "", + "cache_min": "", + "cache": "/Users/jfolsom/.npm", + "searchexclude": "", + "color": "true", + "save_optional": "", + "user_agent": "node/v0.8.8", + "cache_lock_wait": "10000", + "production": "", + "save_bundle": "", + "init_version": "0.0.0", + "umask": "18", + "git": "git", + "init_author_name": "", + "onload_script": "", + "tmp": "/Users/jfolsom/tmp", + "unsafe_perm": "", + "link": "", + "prefix": "/usr/local" + } +} diff --git a/node_modules/nodetime/node_modules/nodetime-native/build/gyp-mac-tool b/node_modules/nodetime/node_modules/nodetime-native/build/gyp-mac-tool new file mode 100755 index 0000000..22f8331 --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/build/gyp-mac-tool @@ -0,0 +1,210 @@ +#!/usr/bin/env python +# Generated by gyp. Do not edit. +# Copyright (c) 2012 Google Inc. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""Utility functions to perform Xcode-style build steps. + +These functions are executed via gyp-mac-tool when using the Makefile generator. +""" + +import fcntl +import os +import plistlib +import re +import shutil +import string +import subprocess +import sys + + +def main(args): + executor = MacTool() + exit_code = executor.Dispatch(args) + if exit_code is not None: + sys.exit(exit_code) + + +class MacTool(object): + """This class performs all the Mac tooling steps. The methods can either be + executed directly, or dispatched from an argument list.""" + + def Dispatch(self, args): + """Dispatches a string command to a method.""" + if len(args) < 1: + raise Exception("Not enough arguments") + + method = "Exec%s" % self._CommandifyName(args[0]) + return getattr(self, method)(*args[1:]) + + def _CommandifyName(self, name_string): + """Transforms a tool name like copy-info-plist to CopyInfoPlist""" + return name_string.title().replace('-', '') + + def ExecCopyBundleResource(self, source, dest): + """Copies a resource file to the bundle/Resources directory, performing any + necessary compilation on each resource.""" + extension = os.path.splitext(source)[1].lower() + if os.path.isdir(source): + # Copy tree. + if os.path.exists(dest): + shutil.rmtree(dest) + shutil.copytree(source, dest) + elif extension == '.xib': + return self._CopyXIBFile(source, dest) + elif extension == '.strings': + self._CopyStringsFile(source, dest) + else: + shutil.copyfile(source, dest) + + def _CopyXIBFile(self, source, dest): + """Compiles a XIB file with ibtool into a binary plist in the bundle.""" + tools_dir = os.environ.get('DEVELOPER_BIN_DIR', '/usr/bin') + args = [os.path.join(tools_dir, 'ibtool'), '--errors', '--warnings', + '--notices', '--output-format', 'human-readable-text', '--compile', + dest, source] + ibtool_section_re = re.compile(r'/\*.*\*/') + ibtool_re = re.compile(r'.*note:.*is clipping its content') + ibtoolout = subprocess.Popen(args, stdout=subprocess.PIPE) + current_section_header = None + for line in ibtoolout.stdout: + if ibtool_section_re.match(line): + current_section_header = line + elif not ibtool_re.match(line): + if current_section_header: + sys.stdout.write(current_section_header) + current_section_header = None + sys.stdout.write(line) + return ibtoolout.returncode + + def _CopyStringsFile(self, source, dest): + """Copies a .strings file using iconv to reconvert the input into UTF-16.""" + input_code = self._DetectInputEncoding(source) or "UTF-8" + fp = open(dest, 'w') + args = ['/usr/bin/iconv', '--from-code', input_code, '--to-code', + 'UTF-16', source] + subprocess.call(args, stdout=fp) + fp.close() + + def _DetectInputEncoding(self, file_name): + """Reads the first few bytes from file_name and tries to guess the text + encoding. Returns None as a guess if it can't detect it.""" + fp = open(file_name, 'rb') + try: + header = fp.read(3) + except e: + fp.close() + return None + fp.close() + if header.startswith("\xFE\xFF"): + return "UTF-16BE" + elif header.startswith("\xFF\xFE"): + return "UTF-16LE" + elif header.startswith("\xEF\xBB\xBF"): + return "UTF-8" + else: + return None + + def ExecCopyInfoPlist(self, source, dest): + """Copies the |source| Info.plist to the destination directory |dest|.""" + # Read the source Info.plist into memory. + fd = open(source, 'r') + lines = fd.read() + fd.close() + + # Go through all the environment variables and replace them as variables in + # the file. + for key in os.environ: + if key.startswith('_'): + continue + evar = '${%s}' % key + lines = string.replace(lines, evar, os.environ[key]) + + # Write out the file with variables replaced. + fd = open(dest, 'w') + fd.write(lines) + fd.close() + + # Now write out PkgInfo file now that the Info.plist file has been + # "compiled". + self._WritePkgInfo(dest) + + def _WritePkgInfo(self, info_plist): + """This writes the PkgInfo file from the data stored in Info.plist.""" + plist = plistlib.readPlist(info_plist) + if not plist: + return + + # Only create PkgInfo for executable types. + package_type = plist['CFBundlePackageType'] + if package_type != 'APPL': + return + + # The format of PkgInfo is eight characters, representing the bundle type + # and bundle signature, each four characters. If that is missing, four + # '?' characters are used instead. + signature_code = plist.get('CFBundleSignature', '????') + if len(signature_code) != 4: # Wrong length resets everything, too. + signature_code = '?' * 4 + + dest = os.path.join(os.path.dirname(info_plist), 'PkgInfo') + fp = open(dest, 'w') + fp.write('%s%s' % (package_type, signature_code)) + fp.close() + + def ExecFlock(self, lockfile, *cmd_list): + """Emulates the most basic behavior of Linux's flock(1).""" + # Rely on exception handling to report errors. + fd = os.open(lockfile, os.O_RDONLY|os.O_NOCTTY|os.O_CREAT, 0o666) + fcntl.flock(fd, fcntl.LOCK_EX) + return subprocess.call(cmd_list) + + def ExecFilterLibtool(self, *cmd_list): + """Calls libtool and filters out 'libtool: file: foo.o has no symbols'.""" + libtool_re = re.compile(r'^libtool: file: .* has no symbols$') + libtoolout = subprocess.Popen(cmd_list, stderr=subprocess.PIPE) + for line in libtoolout.stderr: + if not libtool_re.match(line): + sys.stderr.write(line) + return libtoolout.returncode + + def ExecPackageFramework(self, framework, version): + """Takes a path to Something.framework and the Current version of that and + sets up all the symlinks.""" + # Find the name of the binary based on the part before the ".framework". + binary = os.path.basename(framework).split('.')[0] + + CURRENT = 'Current' + RESOURCES = 'Resources' + VERSIONS = 'Versions' + + if not os.path.exists(os.path.join(framework, VERSIONS, version, binary)): + # Binary-less frameworks don't seem to contain symlinks (see e.g. + # chromium's out/Debug/org.chromium.Chromium.manifest/ bundle). + return + + # Move into the framework directory to set the symlinks correctly. + pwd = os.getcwd() + os.chdir(framework) + + # Set up the Current version. + self._Relink(version, os.path.join(VERSIONS, CURRENT)) + + # Set up the root symlinks. + self._Relink(os.path.join(VERSIONS, CURRENT, binary), binary) + self._Relink(os.path.join(VERSIONS, CURRENT, RESOURCES), RESOURCES) + + # Back to where we were before! + os.chdir(pwd) + + def _Relink(self, dest, link): + """Creates a symlink to |dest| named |link|. If |link| already exists, + it is overwritten.""" + if os.path.lexists(link): + os.remove(link) + os.symlink(dest, link) + + +if __name__ == '__main__': + sys.exit(main(sys.argv[1:])) diff --git a/node_modules/nodetime/node_modules/nodetime-native/build/nodetime_native.target.mk b/node_modules/nodetime/node_modules/nodetime-native/build/nodetime_native.target.mk new file mode 100644 index 0000000..0808c4e --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/build/nodetime_native.target.mk @@ -0,0 +1,136 @@ +# This file is generated by gyp; do not edit. + +TOOLSET := target +TARGET := nodetime_native +DEFS_Debug := '-D_LARGEFILE_SOURCE' \ + '-D_FILE_OFFSET_BITS=64' \ + '-D_DARWIN_USE_64_BIT_INODE=1' \ + '-DDEBUG' \ + '-D_DEBUG' + +# Flags passed to all source files. +CFLAGS_Debug := -Os \ + -gdwarf-2 \ + -mmacosx-version-min=10.5 \ + -arch x86_64 \ + -Wall \ + -Wendif-labels \ + -W \ + -Wno-unused-parameter + +# Flags passed to only C files. +CFLAGS_C_Debug := -fno-strict-aliasing + +# Flags passed to only C++ files. +CFLAGS_CC_Debug := -fno-rtti \ + -fno-exceptions \ + -fno-threadsafe-statics \ + -fno-strict-aliasing + +# Flags passed to only ObjC files. +CFLAGS_OBJC_Debug := + +# Flags passed to only ObjC++ files. +CFLAGS_OBJCC_Debug := + +INCS_Debug := -I/Users/jfolsom/.node-gyp/0.8.8/src \ + -I/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include \ + -I/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include + +DEFS_Release := '-D_LARGEFILE_SOURCE' \ + '-D_FILE_OFFSET_BITS=64' \ + '-D_DARWIN_USE_64_BIT_INODE=1' + +# Flags passed to all source files. +CFLAGS_Release := -Os \ + -gdwarf-2 \ + -mmacosx-version-min=10.5 \ + -arch x86_64 \ + -Wall \ + -Wendif-labels \ + -W \ + -Wno-unused-parameter + +# Flags passed to only C files. +CFLAGS_C_Release := -fno-strict-aliasing + +# Flags passed to only C++ files. +CFLAGS_CC_Release := -fno-rtti \ + -fno-exceptions \ + -fno-threadsafe-statics \ + -fno-strict-aliasing + +# Flags passed to only ObjC files. +CFLAGS_OBJC_Release := + +# Flags passed to only ObjC++ files. +CFLAGS_OBJCC_Release := + +INCS_Release := -I/Users/jfolsom/.node-gyp/0.8.8/src \ + -I/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include \ + -I/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include + +OBJS := $(obj).target/$(TARGET)/src/nodetime_native.o \ + $(obj).target/$(TARGET)/src/gc.o \ + $(obj).target/$(TARGET)/src/profiler.o \ + $(obj).target/$(TARGET)/src/system_posix.o + +# Add to the list of files we specially track dependencies for. +all_deps += $(OBJS) + +# CFLAGS et al overrides must be target-local. +# See "Target-specific Variable Values" in the GNU Make manual. +$(OBJS): TOOLSET := $(TOOLSET) +$(OBJS): GYP_CFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) +$(OBJS): GYP_CXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) +$(OBJS): GYP_OBJCFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) $(CFLAGS_OBJC_$(BUILDTYPE)) +$(OBJS): GYP_OBJCXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) $(CFLAGS_OBJCC_$(BUILDTYPE)) + +# Suffix rules, putting all outputs into $(obj). + +$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) + +# Try building from generated source, too. + +$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) + +$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) + +# End of this set of suffix rules +### Rules for final target. +LDFLAGS_Debug := -Wl,-search_paths_first \ + -mmacosx-version-min=10.5 \ + -arch x86_64 \ + -L$(builddir) \ + -install_name /usr/local/lib/nodetime_native.node + +LDFLAGS_Release := -Wl,-search_paths_first \ + -mmacosx-version-min=10.5 \ + -arch x86_64 \ + -L$(builddir) \ + -install_name /usr/local/lib/nodetime_native.node + +LIBS := -undefined dynamic_lookup + +$(builddir)/nodetime_native.node: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE)) +$(builddir)/nodetime_native.node: LIBS := $(LIBS) +$(builddir)/nodetime_native.node: TOOLSET := $(TOOLSET) +$(builddir)/nodetime_native.node: $(OBJS) FORCE_DO_CMD + $(call do_cmd,solink_module) + +all_deps += $(builddir)/nodetime_native.node +# Add target alias +.PHONY: nodetime_native +nodetime_native: $(builddir)/nodetime_native.node + +# Short alias for building this executable. +.PHONY: nodetime_native.node +nodetime_native.node: $(builddir)/nodetime_native.node + +# Add executable to "all" target. +.PHONY: all +all: $(builddir)/nodetime_native.node + diff --git a/node_modules/nodetime/node_modules/nodetime-native/index.js b/node_modules/nodetime/node_modules/nodetime-native/index.js new file mode 100644 index 0000000..fcb9137 --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/index.js @@ -0,0 +1 @@ +module.exports = require('bindings')('nodetime_native.node') diff --git a/node_modules/nodetime/node_modules/nodetime-native/node_modules/bindings/README.md b/node_modules/nodetime/node_modules/nodetime-native/node_modules/bindings/README.md new file mode 100644 index 0000000..585cf51 --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/node_modules/bindings/README.md @@ -0,0 +1,97 @@ +node-bindings +============= +### Helper module for loading your native module's .node file + +This is a helper module for authors of Node.js native addon modules. +It is basically the "swiss army knife" of `require()`ing your native module's +`.node` file. + +Throughout the course of Node's native addon history, addons have ended up being +compiled in a variety of different places, depending on which build tool and which +version of node was used. To make matters worse, now the _gyp_ build tool can +produce either a _Release_ or _Debug_ build, each being built into different +locations. + +This module checks _all_ the possible locations that a native addon would be built +at, and returns the first one that loads successfully. + + +Installation +------------ + +Install with `npm`: + +``` bash +$ npm install bindings +``` + +Or add it to the `"dependencies"` section of your _package.json_ file. + + +Example +------- + +`require()`ing the proper bindings file for the current node version, platform +and architecture is as simple as: + +``` js +var bindings = require('bindings')('binding.node') + +// Use your bindings defined in your C files +bindings.your_c_function() +``` + + +Nice Error Output +----------------- + +When the `.node` file could not be loaded, `node-bindings` throws an Error with +a nice error message telling you exactly what was tried. You can also check the +`err.tries` Array property. + +``` +Error: Could not load the bindings file. Tried: + → /Users/nrajlich/ref/build/binding.node + → /Users/nrajlich/ref/build/Debug/binding.node + → /Users/nrajlich/ref/build/Release/binding.node + → /Users/nrajlich/ref/out/Debug/binding.node + → /Users/nrajlich/ref/Debug/binding.node + → /Users/nrajlich/ref/out/Release/binding.node + → /Users/nrajlich/ref/Release/binding.node + → /Users/nrajlich/ref/build/default/binding.node + → /Users/nrajlich/ref/compiled/0.8.2/darwin/x64/binding.node + at bindings (/Users/nrajlich/ref/node_modules/bindings/bindings.js:84:13) + at Object. (/Users/nrajlich/ref/lib/ref.js:5:47) + at Module._compile (module.js:449:26) + at Object.Module._extensions..js (module.js:467:10) + at Module.load (module.js:356:32) + at Function.Module._load (module.js:312:12) + ... +``` + + +License +------- + +(The MIT License) + +Copyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net> + +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. diff --git a/node_modules/nodetime/node_modules/nodetime-native/node_modules/bindings/bindings.js b/node_modules/nodetime/node_modules/nodetime-native/node_modules/bindings/bindings.js new file mode 100644 index 0000000..2f04804 --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/node_modules/bindings/bindings.js @@ -0,0 +1,155 @@ + +/** + * Module dependencies. + */ + +var fs = require('fs') + , path = require('path') + , join = path.join + , dirname = path.dirname + , exists = fs.existsSync || path.existsSync + , defaults = { + arrow: process.env.NODE_BINDINGS_ARROW || ' → ' + , compiled: process.env.NODE_BINDINGS_COMPILED_DIR || 'compiled' + , platform: process.platform + , arch: process.arch + , version: process.versions.node + , bindings: 'bindings.node' + , try: [ + // node-gyp's linked version in the "build" dir + [ 'module_root', 'build', 'bindings' ] + // node-waf and gyp_addon (a.k.a node-gyp) + , [ 'module_root', 'build', 'Debug', 'bindings' ] + , [ 'module_root', 'build', 'Release', 'bindings' ] + // Debug files, for development (legacy behavior, remove for node v0.9) + , [ 'module_root', 'out', 'Debug', 'bindings' ] + , [ 'module_root', 'Debug', 'bindings' ] + // Release files, but manually compiled (legacy behavior, remove for node v0.9) + , [ 'module_root', 'out', 'Release', 'bindings' ] + , [ 'module_root', 'Release', 'bindings' ] + // Legacy from node-waf, node <= 0.4.x + , [ 'module_root', 'build', 'default', 'bindings' ] + // Production "Release" buildtype binary (meh...) + , [ 'module_root', 'compiled', 'version', 'platform', 'arch', 'bindings' ] + ] + } + +/** + * The main `bindings()` function loads the compiled bindings for a given module. + * It uses V8's Error API to determine the parent filename that this function is + * being invoked from, which is then used to find the root directory. + */ + +function bindings (opts) { + + // Argument surgery + if (typeof opts == 'string') { + opts = { bindings: opts } + } else if (!opts) { + opts = {} + } + opts.__proto__ = defaults + + // Get the module root + if (!opts.module_root) { + opts.module_root = exports.getRoot(exports.getFileName()) + } + + // Ensure the given bindings name ends with .node + if (path.extname(opts.bindings) != '.node') { + opts.bindings += '.node' + } + + var tries = [] + , i = 0 + , l = opts.try.length + , n + , b + , err + + for (; i (/Users/nrajlich/ref/lib/ref.js:5:47)\n at Module._compile (module.js:449:26)\n at Object.Module._extensions..js (module.js:467:10)\n at Module.load (module.js:356:32)\n at Function.Module._load (module.js:312:12)\n ...\n```\n\n\nLicense\n-------\n\n(The MIT License)\n\nCopyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", + "_id": "bindings@1.1.0", + "_from": "bindings@*" +} diff --git a/node_modules/nodetime/node_modules/nodetime-native/nodetime_native.cc b/node_modules/nodetime/node_modules/nodetime-native/nodetime_native.cc new file mode 100644 index 0000000..60c1b6f --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/nodetime_native.cc @@ -0,0 +1,281 @@ + + +/* + * This file is depricated. Kept for old npm versions defaulting to node-waf + */ + +#include +#include +#include +#include +#include +#include +#include + +using namespace v8; + + +/* Time */ + +Handle Time(const Arguments& args) { + HandleScope scope; + + timeval tv; + + int ret = gettimeofday(&tv, 0); + if (ret < 0) { + return scope.Close(Undefined()); + } + + return scope.Close(Number::New((double)tv.tv_sec * 1e6 + (double)tv.tv_usec)); +} + + +/* CPU time */ + +Handle CPUTime(const Arguments& args) { + HandleScope scope; + + struct rusage ru; + + int ret = getrusage(RUSAGE_SELF, &ru); + if (ret < 0) { + return scope.Close(Undefined()); + } + + return scope.Close(Number::New((double)ru.ru_utime.tv_sec * 1e6 + (double)ru.ru_utime.tv_usec + (double)ru.ru_stime.tv_sec * 1e6 + (double)ru.ru_stime.tv_usec)); +} + + + + +/* CPU profiler */ + +void Walk(int* next_uid, const int parent_uid, const CpuProfileNode* node, Local callback) { + if(!node) return; + + int uid = (*next_uid)++; + + Handle argv[6]; + argv[0] = Integer::New(parent_uid); + argv[1] = Integer::New(uid); + argv[2] = Number::New(node->GetTotalSamplesCount()); + argv[3] = node->GetFunctionName(); + argv[4] = node->GetScriptResourceName(); + argv[5] = Integer::New(node->GetLineNumber()); + + callback->Call(Context::GetCurrent()->Global(), 6, argv); + + int32_t childrenCount = node->GetChildrenCount(); + for(int i = 0; i < childrenCount; i++) { + const CpuProfileNode* childNode = node->GetChild(i); + Walk(next_uid, uid, childNode, callback); + } +} + + +Handle StartV8Profiler(const Arguments& args) { + HandleScope scope; + + CpuProfiler::StartProfiling(String::New("v8tools-cpu-profile")); + + return scope.Close(Undefined()); +} + + +Handle StopV8Profiler(const Arguments& args) { + HandleScope scope; + + const CpuProfile* profile = CpuProfiler::StopProfiling(String::New("v8tools-cpu-profile")); + + if(args.Length() > 0 && args[0]->IsFunction()) { + Local callback = Local::Cast(args[0]); + int nextUid = 1; + Walk(&nextUid, 0, profile->GetTopDownRoot(), callback); + } + + const_cast(profile)->Delete(); + + return scope.Close(Undefined()); +} + + + +/* Heap profiler */ + + +/* + +node type: + 0 - hidden + 1 - array + 2 - string + 3 - object + 4 - compiled code + 5 - function clojure + 6 - regexp + 7 - heap number + 8 - native object + +edge type: + 0 - context variable + 1 - array element + 2 - property + 3 - internal + 4 - internal (size calculation) + 5 - internal (size calculation) +*/ + + +static void IterateHeapSnapshot(const HeapSnapshot* snapshot, Local callback) { + int32_t nodes_count = snapshot->GetNodesCount(); + for(int i = 0; i < nodes_count; i++) { + const HeapGraphNode* node = snapshot->GetNode(i); + + int32_t children_count = node->GetChildrenCount(); + for(int j = 0; j < children_count; j++) { + const HeapGraphEdge* child_edge = node->GetChild(j); + const HeapGraphNode* child_node = child_edge->GetToNode(); + + Handle argv[7]; + argv[0] = Integer::New(node->GetId()); + argv[1] = Integer::New(child_node->GetId()); + argv[2] = child_node->GetName(); + argv[3] = Integer::New(child_node->GetType()); + argv[4] = Integer::New(child_node->GetSelfSize()); + argv[5] = child_edge->GetName(); + argv[6] = Integer::New(child_edge->GetType()); + + callback->Call(Context::GetCurrent()->Global(), 7, argv); + } + } +} + + + +Handle TakeHeapSnapshot(const Arguments& args) { + HandleScope scope; + + const HeapSnapshot* snapshot = HeapProfiler::TakeSnapshot(String::New("v8tools-heap-snapshot")); + if(args.Length() > 0 && args[0]->IsFunction()) { + Local callback = Local::Cast(args[0]); + IterateHeapSnapshot(snapshot, callback); + } + + const_cast(snapshot)->Delete(); + + return scope.Close(Undefined()); +} + + + +/* GC listener */ + + +Persistent callback; +Persistent callback_context; + + +struct Baton { + uv_work_t request; + GCType gc_type; + GCCallbackFlags gc_callback_flags; + size_t used_heap_size; +}; + + +static void Noop(uv_work_t* request) { +} + + +static void GCEpilogueAsync(uv_work_t* request) { + Baton *baton = static_cast(request->data); + + Handle argv[3]; + + switch(baton->gc_type) { + case kGCTypeAll: + argv[0] = String::New("kGCTypeAll"); + break; + case kGCTypeMarkSweepCompact: + argv[0] = String::New("kGCTypeMarkSweepCompact"); + break; + case kGCTypeScavenge: + argv[0] = String::New("kGCTypeScavenge"); + break; + default: + argv[0] = String::New("Other"); + } + + switch(baton->gc_callback_flags) { + case kGCCallbackFlagCompacted: + argv[1] = String::New("kGCCallbackFlagCompacted"); + break; + case kNoGCCallbackFlags: + argv[1] = String::New("kNoGCCallbackFlags"); + break; + default: + argv[1] = String::New("Other"); + } + + argv[2] = Integer::New(baton->used_heap_size); + + callback->Call(callback_context, 3, argv); + + delete baton; +} + + +static size_t GetUsedHeapSize() { + HeapStatistics stats; + V8::GetHeapStatistics(&stats); + + return stats.used_heap_size(); +} + + +static void GCEpilogue(GCType gc_type, GCCallbackFlags gc_callback_flags) { + Baton *baton = new Baton(); + baton->request.data = baton; + + baton->gc_type = gc_type; + baton->gc_callback_flags = gc_callback_flags; + + baton->used_heap_size = GetUsedHeapSize(); + + uv_queue_work(uv_default_loop(), &baton->request, Noop, GCEpilogueAsync); +} + + +Handle AfterGC(const Arguments& args) { + HandleScope scope; + + + if(args.Length() > 0 && args[0]->IsFunction()) { + Local callbackArg = Local::Cast(args[0]); + callback = Persistent::New(callbackArg); + callback_context = Persistent::New(Context::GetCalling()->Global()); + } + else { + return scope.Close(Undefined()); + } + + + V8::AddGCEpilogueCallback(GCEpilogue); + + return scope.Close(Undefined()); +} + + + +void Init(Handle target) { + target->Set(String::NewSymbol("time"), FunctionTemplate::New(Time)->GetFunction()); + target->Set(String::NewSymbol("cpuTime"), FunctionTemplate::New(CPUTime)->GetFunction()); + target->Set(String::NewSymbol("startV8Profiler"), FunctionTemplate::New(StartV8Profiler)->GetFunction()); + target->Set(String::NewSymbol("stopV8Profiler"), FunctionTemplate::New(StopV8Profiler)->GetFunction()); + target->Set(String::NewSymbol("takeHeapSnapshot"), FunctionTemplate::New(TakeHeapSnapshot)->GetFunction()); +} + + +NODE_MODULE(nodetimenative, Init); + diff --git a/node_modules/nodetime/node_modules/nodetime-native/package.json b/node_modules/nodetime/node_modules/nodetime-native/package.json new file mode 100644 index 0000000..b5b907e --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/package.json @@ -0,0 +1,32 @@ +{ + "name": "nodetime-native", + "version": "0.1.0", + "description": "Nodetime Native Tools", + "author": { + "name": "Nodetime", + "email": "devops@nodetime.com" + }, + "main": "./index.js", + "dependencies": { + "bindings": "*" + }, + "repository": { + "type": "git", + "url": "git://github.com/nodetime/nodetime-native.git" + }, + "engines": { + "node": ">=0.6.0" + }, + "licenses": [ + { + "url": "http://github.com/nodetime/nodetime-native/raw/master/LICENSE" + } + ], + "scripts": { + "install": "node-gyp rebuild" + }, + "gypfile": true, + "readme": "Nodetime's Native Tools\n===\n\n", + "_id": "nodetime-native@0.1.0", + "_from": "nodetime-native@0.1.0" +} diff --git a/node_modules/nodetime/node_modules/nodetime-native/src/gc.cc b/node_modules/nodetime/node_modules/nodetime-native/src/gc.cc new file mode 100644 index 0000000..3818c59 --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/src/gc.cc @@ -0,0 +1,102 @@ + + +#include "gc.h" + +using namespace v8; + + +Persistent callback; +Persistent callback_context; + + +struct Baton { + uv_work_t request; + GCType gc_type; + GCCallbackFlags gc_callback_flags; + size_t used_heap_size; +}; + + +static void Noop(uv_work_t* request) { +} + + +static void GCEpilogueAsync(uv_work_t* request) { + Baton *baton = static_cast(request->data); + + Handle argv[3]; + + switch(baton->gc_type) { + case kGCTypeAll: + argv[0] = String::New("kGCTypeAll"); + break; + case kGCTypeMarkSweepCompact: + argv[0] = String::New("kGCTypeMarkSweepCompact"); + break; + case kGCTypeScavenge: + argv[0] = String::New("kGCTypeScavenge"); + break; + default: + argv[0] = String::New("Other"); + } + + switch(baton->gc_callback_flags) { + case kGCCallbackFlagCompacted: + argv[1] = String::New("kGCCallbackFlagCompacted"); + break; + case kNoGCCallbackFlags: + argv[1] = String::New("kNoGCCallbackFlags"); + break; + default: + argv[1] = String::New("Other"); + } + + argv[2] = Integer::New(baton->used_heap_size); + + callback->Call(callback_context, 3, argv); + + delete baton; +} + + +static size_t GetUsedHeapSize() { + HeapStatistics stats; + V8::GetHeapStatistics(&stats); + + return stats.used_heap_size(); +} + + +static void GCEpilogue(GCType gc_type, GCCallbackFlags gc_callback_flags) { + Baton *baton = new Baton(); + baton->request.data = baton; + + baton->gc_type = gc_type; + baton->gc_callback_flags = gc_callback_flags; + + baton->used_heap_size = GetUsedHeapSize(); + + uv_queue_work(uv_default_loop(), &baton->request, Noop, (uv_after_work_cb)GCEpilogueAsync); +} + + +Handle AfterGC(const Arguments& args) { + HandleScope scope; + + + if(args.Length() > 0 && args[0]->IsFunction()) { + Local callbackArg = Local::Cast(args[0]); + callback = Persistent::New(callbackArg); + callback_context = Persistent::New(Context::GetCalling()->Global()); + } + else { + return scope.Close(Undefined()); + } + + + V8::AddGCEpilogueCallback(GCEpilogue); + + return scope.Close(Undefined()); +} + + diff --git a/node_modules/nodetime/node_modules/nodetime-native/src/gc.h b/node_modules/nodetime/node_modules/nodetime-native/src/gc.h new file mode 100644 index 0000000..f7a410d --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/src/gc.h @@ -0,0 +1,13 @@ + + +#ifndef GC_H_ +#define GC_H_ + +#include +#include + +using namespace v8; + +Handle AfterGC(const Arguments& args); + +#endif diff --git a/node_modules/nodetime/node_modules/nodetime-native/src/nodetime_native.cc b/node_modules/nodetime/node_modules/nodetime-native/src/nodetime_native.cc new file mode 100644 index 0000000..282ae78 --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/src/nodetime_native.cc @@ -0,0 +1,24 @@ + + +#include +#include +#include +#include "system.h" +#include "gc.h" +#include "profiler.h" + +using namespace v8; + + +void Init(Handle target) { + target->Set(String::NewSymbol("time"), FunctionTemplate::New(Time)->GetFunction()); + target->Set(String::NewSymbol("cpuTime"), FunctionTemplate::New(CPUTime)->GetFunction()); + target->Set(String::NewSymbol("afterGC"), FunctionTemplate::New(AfterGC)->GetFunction()); + target->Set(String::NewSymbol("startV8Profiler"), FunctionTemplate::New(StartV8Profiler)->GetFunction()); + target->Set(String::NewSymbol("stopV8Profiler"), FunctionTemplate::New(StopV8Profiler)->GetFunction()); + target->Set(String::NewSymbol("takeHeapSnapshot"), FunctionTemplate::New(TakeHeapSnapshot)->GetFunction()); +} + + +NODE_MODULE(nodetime_native, Init); + diff --git a/node_modules/nodetime/node_modules/nodetime-native/src/profiler.cc b/node_modules/nodetime/node_modules/nodetime-native/src/profiler.cc new file mode 100644 index 0000000..f4c4a57 --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/src/profiler.cc @@ -0,0 +1,124 @@ + + +#include +#include "profiler.h" + +using namespace v8; + + +static void WalkCpuProfile(int* next_uid, + const int parent_uid, + const CpuProfileNode* node, + Local callback) { + if(!node) return; + + int uid = (*next_uid)++; + + Handle argv[6]; + argv[0] = Integer::New(parent_uid); + argv[1] = Integer::New(uid); + argv[2] = Number::New(node->GetTotalSamplesCount()); + argv[3] = node->GetFunctionName(); + argv[4] = node->GetScriptResourceName(); + argv[5] = Integer::New(node->GetLineNumber()); + + callback->Call(Context::GetCurrent()->Global(), 6, argv); + + int32_t children_count = node->GetChildrenCount(); + for(int i = 0; i < children_count; i++) { + const CpuProfileNode* child_node = node->GetChild(i); + WalkCpuProfile(next_uid, uid, child_node, callback); + } +} + + +Handle StartV8Profiler(const Arguments& args) { + HandleScope scope; + + CpuProfiler::StartProfiling(String::New("v8tools-cpu-profile")); + + return scope.Close(Undefined()); +} + + +Handle StopV8Profiler(const Arguments& args) { + HandleScope scope; + + const CpuProfile* profile = CpuProfiler::StopProfiling(String::New("v8tools-cpu-profile")); + + if(args.Length() > 0 && args[0]->IsFunction()) { + Local callback = Local::Cast(args[0]); + int next_uid = 1; + WalkCpuProfile(&next_uid, 0, profile->GetTopDownRoot(), callback); + } + + const_cast(profile)->Delete(); + + return scope.Close(Undefined()); +} + + + +/* + +node type: + 0 - hidden + 1 - array + 2 - string + 3 - object + 4 - compiled code + 5 - function clojure + 6 - regexp + 7 - heap number + 8 - native object + +edge type: + 0 - context variable + 1 - array element + 2 - property + 3 - internal + 4 - internal (size calculation) + 5 - internal (size calculation) + +*/ + +static void IterateHeapSnapshot(const HeapSnapshot* snapshot, Local callback) { + int32_t nodes_count = snapshot->GetNodesCount(); + for(int i = 0; i < nodes_count; i++) { + const HeapGraphNode* node = snapshot->GetNode(i); + + int32_t children_count = node->GetChildrenCount(); + for(int j = 0; j < children_count; j++) { + const HeapGraphEdge* child_edge = node->GetChild(j); + const HeapGraphNode* child_node = child_edge->GetToNode(); + + Handle argv[7]; + argv[0] = Integer::New(node->GetId()); + argv[1] = Integer::New(child_node->GetId()); + argv[2] = child_node->GetName(); + argv[3] = Integer::New(child_node->GetType()); + argv[4] = Integer::New(child_node->GetSelfSize()); + argv[5] = child_edge->GetName(); + argv[6] = Integer::New(child_edge->GetType()); + + callback->Call(Context::GetCurrent()->Global(), 7, argv); + } + } +} + + +Handle TakeHeapSnapshot(const Arguments& args) { + HandleScope scope; + + const HeapSnapshot* snapshot = HeapProfiler::TakeSnapshot(String::New("v8tools-heap-snapshot")); + if(args.Length() > 0 && args[0]->IsFunction()) { + Local callback = Local::Cast(args[0]); + IterateHeapSnapshot(snapshot, callback); + } + + const_cast(snapshot)->Delete(); + + return scope.Close(Undefined()); +} + + diff --git a/node_modules/nodetime/node_modules/nodetime-native/src/profiler.h b/node_modules/nodetime/node_modules/nodetime-native/src/profiler.h new file mode 100644 index 0000000..5bf655c --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/src/profiler.h @@ -0,0 +1,13 @@ + +#ifndef PROFILER_H_ +#define PROFILER_H_ + +#include + +using namespace v8; + +Handle StartV8Profiler(const Arguments& args); +Handle StopV8Profiler(const Arguments& args); +Handle TakeHeapSnapshot(const Arguments& args); + +#endif diff --git a/node_modules/nodetime/node_modules/nodetime-native/src/system.h b/node_modules/nodetime/node_modules/nodetime-native/src/system.h new file mode 100644 index 0000000..47044c5 --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/src/system.h @@ -0,0 +1,12 @@ + +#ifndef SYSTEM_H_ +#define SYSTEM_H_ + +#include + +using namespace v8; + +Handle Time(const Arguments& args); +Handle CPUTime(const Arguments& args); + +#endif diff --git a/node_modules/nodetime/node_modules/nodetime-native/src/system_posix.cc b/node_modules/nodetime/node_modules/nodetime-native/src/system_posix.cc new file mode 100644 index 0000000..fb4463b --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/src/system_posix.cc @@ -0,0 +1,37 @@ + +#include +#include +#include +#include + +#include + +using namespace v8; + + +Handle Time(const Arguments& args) { + HandleScope scope; + + timeval tv; + + int ret = gettimeofday(&tv, 0); + if (ret < 0) { + return scope.Close(Undefined()); + } + + return scope.Close(Number::New((double)tv.tv_sec * 1e6 + (double)tv.tv_usec)); +} + + +Handle CPUTime(const Arguments& args) { + HandleScope scope; + + struct rusage ru; + + int ret = getrusage(RUSAGE_SELF, &ru); + if (ret < 0) { + return scope.Close(Undefined()); + } + + return scope.Close(Number::New((double)ru.ru_utime.tv_sec * 1e6 + (double)ru.ru_utime.tv_usec + (double)ru.ru_stime.tv_sec * 1e6 + (double)ru.ru_stime.tv_usec)); +} diff --git a/node_modules/nodetime/node_modules/nodetime-native/src/system_win.cc b/node_modules/nodetime/node_modules/nodetime-native/src/system_win.cc new file mode 100644 index 0000000..1cc4ad3 --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/src/system_win.cc @@ -0,0 +1,43 @@ + +#include + +#include + +using namespace v8; + + +static double filetimeToMicroseconds(FILETIME* ft) { + ULARGE_INTEGER uli; + uli.LowPart = ft->dwLowDateTime; + uli.HighPart = ft->dwHighDateTime; + + return (double)(uli.QuadPart/10); +} + + +Handle Time(const Arguments& args) { + HandleScope scope; + + FILETIME stime; + GetSystemTimeAsFileTime(&stime); + + return scope.Close(Number::New(filetimeToMicroseconds(&stime))); +} + + +Handle CPUTime(const Arguments& args) { + HandleScope scope; + + HANDLE proc = GetCurrentProcess(); + + FILETIME ctime; + FILETIME etime; + FILETIME ktime; + FILETIME utime; + int ret = GetProcessTimes(proc, &ctime, &etime, &ktime, &utime); + if(!ret) { + return scope.Close(Undefined()); + } + + return scope.Close(Number::New(filetimeToMicroseconds(&ktime) + filetimeToMicroseconds(&utime))); +} diff --git a/node_modules/nodetime/node_modules/nodetime-native/wscript b/node_modules/nodetime/node_modules/nodetime-native/wscript new file mode 100644 index 0000000..ff8c132 --- /dev/null +++ b/node_modules/nodetime/node_modules/nodetime-native/wscript @@ -0,0 +1,16 @@ +srcdir = '.' +blddir = 'build' +VERSION = '0.1' + +def set_options(opt): + opt.tool_options('compiler_cxx') + +def configure(conf): + conf.check_tool('compiler_cxx') + conf.check_tool('node_addon') + +def build(bld): + obj = bld.new_task_gen('cxx', 'shlib', 'node_addon') + obj.target = 'nodetime_native' + obj.source = 'nodetime_native.cc'; + diff --git a/node_modules/nodetime/node_modules/request/LICENSE b/node_modules/nodetime/node_modules/request/LICENSE new file mode 100644 index 0000000..a4a9aee --- /dev/null +++ b/node_modules/nodetime/node_modules/request/LICENSE @@ -0,0 +1,55 @@ +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and + +You must cause any modified files to carry prominent notices stating that You changed the files; and + +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/node_modules/nodetime/node_modules/request/README.md b/node_modules/nodetime/node_modules/request/README.md new file mode 100644 index 0000000..d1f5c56 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/README.md @@ -0,0 +1,310 @@ +# Request -- Simplified HTTP request method + +## Install + +
      +  npm install request
      +
      + +Or from source: + +
      +  git clone git://github.com/mikeal/request.git 
      +  cd request
      +  npm link
      +
      + +## Super simple to use + +Request is designed to be the simplest way possible to make http calls. It supports HTTPS and follows redirects by default. + +```javascript +var request = require('request'); +request('http://www.google.com', function (error, response, body) { + if (!error && response.statusCode == 200) { + console.log(body) // Print the google web page. + } +}) +``` + +## Streaming + +You can stream any response to a file stream. + +```javascript +request('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png')) +``` + +You can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types, in this case `application/json`, and use the proper content-type in the PUT request if one is not already provided in the headers. + +```javascript +fs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json')) +``` + +Request can also pipe to itself. When doing so the content-type and content-length will be preserved in the PUT headers. + +```javascript +request.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png')) +``` + +Now let's get fancy. + +```javascript +http.createServer(function (req, resp) { + if (req.url === '/doodle.png') { + if (req.method === 'PUT') { + req.pipe(request.put('http://mysite.com/doodle.png')) + } else if (req.method === 'GET' || req.method === 'HEAD') { + request.get('http://mysite.com/doodle.png').pipe(resp) + } + } +}) +``` + +You can also pipe() from a http.ServerRequest instance and to a http.ServerResponse instance. The HTTP method and headers will be sent as well as the entity-body data. Which means that, if you don't really care about security, you can do: + +```javascript +http.createServer(function (req, resp) { + if (req.url === '/doodle.png') { + var x = request('http://mysite.com/doodle.png') + req.pipe(x) + x.pipe(resp) + } +}) +``` + +And since pipe() returns the destination stream in node 0.5.x you can do one line proxying :) + +```javascript +req.pipe(request('http://mysite.com/doodle.png')).pipe(resp) +``` + +Also, none of this new functionality conflicts with requests previous features, it just expands them. + +```javascript +var r = request.defaults({'proxy':'http://localproxy.com'}) + +http.createServer(function (req, resp) { + if (req.url === '/doodle.png') { + r.get('http://google.com/doodle.png').pipe(resp) + } +}) +``` +You can still use intermediate proxies, the requests will still follow HTTP forwards, etc. + +## Forms + +`request` supports `application/x-www-form-urlencoded` and `multipart/form-data` form uploads. For `multipart/related` refer to the `multipart` API. + +Url encoded forms are simple + +```javascript +request.post('http://service.com/upload', {form:{key:'value'}}) +// or +request.post('http://service.com/upload').form({key:'value'}) +``` + +For `multipart/form-data` we use the [form-data](https://github.com/felixge/node-form-data) library by [@felixge](https://github.com/felixge). You don't need to worry about piping the form object or setting the headers, `request` will handle that for you. + +```javascript +var r = request.post('http://service.com/upload') +var form = r.form() +form.append('my_field', 'my_value') +form.append('my_buffer', new Buffer([1, 2, 3])) +form.append('my_file', fs.createReadStream(path.join(__dirname, 'doodle.png')) +form.append('remote_file', request('http://google.com/doodle.png')) +``` + +## OAuth Signing + +```javascript +// Twitter OAuth +var qs = require('querystring') + , oauth = + { callback: 'http://mysite.com/callback/' + , consumer_key: CONSUMER_KEY + , consumer_secret: CONSUMER_SECRET + } + , url = 'https://api.twitter.com/oauth/request_token' + ; +request.post({url:url, oauth:oauth}, function (e, r, body) { + // Assume by some stretch of magic you aquired the verifier + var access_token = qs.parse(body) + , oauth = + { consumer_key: CONSUMER_KEY + , consumer_secret: CONSUMER_SECRET + , token: access_token.oauth_token + , verifier: VERIFIER + , token_secret: access_token.oauth_token_secret + } + , url = 'https://api.twitter.com/oauth/access_token' + ; + request.post({url:url, oauth:oauth}, function (e, r, body) { + var perm_token = qs.parse(body) + , oauth = + { consumer_key: CONSUMER_KEY + , consumer_secret: CONSUMER_SECRET + , token: perm_token.oauth_token + , token_secret: perm_token.oauth_token_secret + } + , url = 'https://api.twitter.com/1/users/show.json?' + , params = + { screen_name: perm_token.screen_name + , user_id: perm_token.user_id + } + ; + url += qs.stringify(params) + request.get({url:url, oauth:oauth, json:true}, function (e, r, user) { + console.log(user) + }) + }) +}) +``` + + + +### request(options, callback) + +The first argument can be either a url or an options object. The only required option is uri, all others are optional. + +* `uri` || `url` - fully qualified uri or a parsed url object from url.parse() +* `qs` - object containing querystring values to be appended to the uri +* `method` - http method, defaults to GET +* `headers` - http headers, defaults to {} +* `body` - entity body for POST and PUT requests. Must be buffer or string. +* `form` - when passed an object this will set `body` but to a querystring representation of value and adds `Content-type: application/x-www-form-urlencoded; charset=utf-8` header. When passed no option a FormData instance is returned that will be piped to request. +* `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header. Additionally, parses the response body as json. +* `multipart` - (experimental) array of objects which contains their own headers and `body` attribute. Sends `multipart/related` request. See example below. +* `followRedirect` - follow HTTP 3xx responses as redirects. defaults to true. +* `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects. defaults to false. +* `maxRedirects` - the maximum number of redirects to follow, defaults to 10. +* `encoding` - Encoding to be used on `setEncoding` of response data. If set to `null`, the body is returned as a Buffer. +* `pool` - A hash object containing the agents for these requests. If omitted this request will use the global pool which is set to node's default maxSockets. +* `pool.maxSockets` - Integer containing the maximum amount of sockets in the pool. +* `timeout` - Integer containing the number of milliseconds to wait for a request to respond before aborting the request +* `proxy` - An HTTP proxy to be used. Support proxy Auth with Basic Auth the same way it's supported with the `url` parameter by embedding the auth info in the uri. +* `oauth` - Options for OAuth HMAC-SHA1 signing, see documentation above. +* `strictSSL` - Set to `true` to require that SSL certificates be valid. Note: to use your own certificate authority, you need to specify an agent that was created with that ca as an option. +* `jar` - Set to `false` if you don't want cookies to be remembered for future use or define your custom cookie jar (see examples section) +* `aws` - object containing aws signing information, should have the properties `key` and `secret` as well as `bucket` unless you're specifying your bucket as part of the path, or you are making a request that doesn't use a bucket (i.e. GET Services) + + +The callback argument gets 3 arguments. The first is an error when applicable (usually from the http.Client option not the http.ClientRequest object). The second in an http.ClientResponse object. The third is the response body String or Buffer. + +## Convenience methods + +There are also shorthand methods for different HTTP METHODs and some other conveniences. + +### request.defaults(options) + +This method returns a wrapper around the normal request API that defaults to whatever options you pass in to it. + +### request.put + +Same as request() but defaults to `method: "PUT"`. + +```javascript +request.put(url) +``` + +### request.post + +Same as request() but defaults to `method: "POST"`. + +```javascript +request.post(url) +``` + +### request.head + +Same as request() but defaults to `method: "HEAD"`. + +```javascript +request.head(url) +``` + +### request.del + +Same as request() but defaults to `method: "DELETE"`. + +```javascript +request.del(url) +``` + +### request.get + +Alias to normal request method for uniformity. + +```javascript +request.get(url) +``` +### request.cookie + +Function that creates a new cookie. + +```javascript +request.cookie('cookie_string_here') +``` +### request.jar + +Function that creates a new cookie jar. + +```javascript +request.jar() +``` + + +## Examples: + +```javascript + var request = require('request') + , rand = Math.floor(Math.random()*100000000).toString() + ; + request( + { method: 'PUT' + , uri: 'http://mikeal.iriscouch.com/testjs/' + rand + , multipart: + [ { 'content-type': 'application/json' + , body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}}) + } + , { body: 'I am an attachment' } + ] + } + , function (error, response, body) { + if(response.statusCode == 201){ + console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand) + } else { + console.log('error: '+ response.statusCode) + console.log(body) + } + } + ) +``` +Cookies are enabled by default (so they can be used in subsequent requests). To disable cookies set jar to false (either in defaults or in the options sent). + +```javascript +var request = request.defaults({jar: false}) +request('http://www.google.com', function () { + request('http://images.google.com') +}) +``` + +If you to use a custom cookie jar (instead of letting request use its own global cookie jar) you do so by setting the jar default or by specifying it as an option: + +```javascript +var j = request.jar() +var request = request.defaults({jar:j}) +request('http://www.google.com', function () { + request('http://images.google.com') +}) +``` +OR + +```javascript +var j = request.jar() +var cookie = request.cookie('your_cookie_here') +j.add(cookie) +request({url: 'http://www.google.com', jar: j}, function () { + request('http://images.google.com') +}) +``` diff --git a/node_modules/nodetime/node_modules/request/aws.js b/node_modules/nodetime/node_modules/request/aws.js new file mode 100644 index 0000000..4d8d950 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/aws.js @@ -0,0 +1,191 @@ + +/*! + * knox - auth + * Copyright(c) 2010 LearnBoost + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var crypto = require('crypto') + , parse = require('url').parse + ; + +/** + * Valid keys. + */ + +var keys = + [ 'acl' + , 'location' + , 'logging' + , 'notification' + , 'partNumber' + , 'policy' + , 'requestPayment' + , 'torrent' + , 'uploadId' + , 'uploads' + , 'versionId' + , 'versioning' + , 'versions' + , 'website' + ] + +/** + * Return an "Authorization" header value with the given `options` + * in the form of "AWS :" + * + * @param {Object} options + * @return {String} + * @api private + */ + +exports.authorization = function(options){ + return 'AWS ' + options.key + ':' + exports.sign(options) +} + +/** + * Simple HMAC-SHA1 Wrapper + * + * @param {Object} options + * @return {String} + * @api private + */ + +exports.hmacSha1 = function(options){ + return crypto.createHmac('sha1', options.secret).update(options.message).digest('base64') +} + +/** + * Create a base64 sha1 HMAC for `options`. + * + * @param {Object} options + * @return {String} + * @api private + */ + +exports.sign = function(options){ + options.message = exports.stringToSign(options) + return exports.hmacSha1(options) +} + +/** + * Create a base64 sha1 HMAC for `options`. + * + * Specifically to be used with S3 presigned URLs + * + * @param {Object} options + * @return {String} + * @api private + */ + +exports.signQuery = function(options){ + options.message = exports.queryStringToSign(options) + return exports.hmacSha1(options) +} + +/** + * Return a string for sign() with the given `options`. + * + * Spec: + * + * \n + * \n + * \n + * \n + * [headers\n] + * + * + * @param {Object} options + * @return {String} + * @api private + */ + +exports.stringToSign = function(options){ + var headers = options.amazonHeaders || '' + if (headers) headers += '\n' + var r = + [ options.verb + , options.md5 + , options.contentType + , options.date.toUTCString() + , headers + options.resource + ] + return r.join('\n') +} + +/** + * Return a string for sign() with the given `options`, but is meant exclusively + * for S3 presigned URLs + * + * Spec: + * + * \n + * + * + * @param {Object} options + * @return {String} + * @api private + */ + +exports.queryStringToSign = function(options){ + return 'GET\n\n\n' + options.date + '\n' + options.resource +}; + +/** + * Perform the following: + * + * - ignore non-amazon headers + * - lowercase fields + * - sort lexicographically + * - trim whitespace between ":" + * - join with newline + * + * @param {Object} headers + * @return {String} + * @api private + */ + +exports.canonicalizeHeaders = function(headers){ + var buf = [] + , fields = Object.keys(headers) + ; + for (var i = 0, len = fields.length; i < len; ++i) { + var field = fields[i] + , val = headers[field] + , field = field.toLowerCase() + ; + if (0 !== field.indexOf('x-amz')) continue + buf.push(field + ':' + val) + } + return buf.sort().join('\n') +}; + +/** + * Perform the following: + * + * - ignore non sub-resources + * - sort lexicographically + * + * @param {String} resource + * @return {String} + * @api private + */ + +exports.canonicalizeResource = function(resource){ + var url = parse(resource, true) + , path = url.pathname + , buf = [] + ; + + Object.keys(url.query).forEach(function(key){ + if (!~keys.indexOf(key)) return + var val = '' == url.query[key] ? '' : '=' + encodeURIComponent(url.query[key]) + buf.push(key + val) + }) + + return path + (buf.length ? '?' + buf.sort().join('&') : '') +}; diff --git a/node_modules/nodetime/node_modules/request/forever.js b/node_modules/nodetime/node_modules/request/forever.js new file mode 100644 index 0000000..1e1d4b9 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/forever.js @@ -0,0 +1,103 @@ +module.exports = ForeverAgent +ForeverAgent.SSL = ForeverAgentSSL + +var util = require('util') + , Agent = require('http').Agent + , net = require('net') + , tls = require('tls') + , AgentSSL = require('https').Agent + +function ForeverAgent(options) { + var self = this + self.options = options || {} + self.requests = {} + self.sockets = {} + self.freeSockets = {} + self.maxSockets = self.options.maxSockets || Agent.defaultMaxSockets + self.minSockets = self.options.minSockets || ForeverAgent.defaultMinSockets + self.on('free', function(socket, host, port) { + var name = host + ':' + port + if (self.requests[name] && self.requests[name].length) { + self.requests[name].shift().onSocket(socket) + } else if (self.sockets[name].length < self.minSockets) { + if (!self.freeSockets[name]) self.freeSockets[name] = [] + self.freeSockets[name].push(socket) + + // if an error happens while we don't use the socket anyway, meh, throw the socket away + function onIdleError() { + socket.destroy() + } + socket._onIdleError = onIdleError + socket.on('error', onIdleError) + } else { + // If there are no pending requests just destroy the + // socket and it will get removed from the pool. This + // gets us out of timeout issues and allows us to + // default to Connection:keep-alive. + socket.destroy() + } + }) + +} +util.inherits(ForeverAgent, Agent) + +ForeverAgent.defaultMinSockets = 5 + + +ForeverAgent.prototype.createConnection = net.createConnection +ForeverAgent.prototype.addRequestNoreuse = Agent.prototype.addRequest +ForeverAgent.prototype.addRequest = function(req, host, port) { + var name = host + ':' + port + if (this.freeSockets[name] && this.freeSockets[name].length > 0 && !req.useChunkedEncodingByDefault) { + var idleSocket = this.freeSockets[name].pop() + idleSocket.removeListener('error', idleSocket._onIdleError) + delete idleSocket._onIdleError + req._reusedSocket = true + req.onSocket(idleSocket) + } else { + this.addRequestNoreuse(req, host, port) + } +} + +ForeverAgent.prototype.removeSocket = function(s, name, host, port) { + if (this.sockets[name]) { + var index = this.sockets[name].indexOf(s) + if (index !== -1) { + this.sockets[name].splice(index, 1) + } + } else if (this.sockets[name] && this.sockets[name].length === 0) { + // don't leak + delete this.sockets[name] + delete this.requests[name] + } + + if (this.freeSockets[name]) { + var index = this.freeSockets[name].indexOf(s) + if (index !== -1) { + this.freeSockets[name].splice(index, 1) + if (this.freeSockets[name].length === 0) { + delete this.freeSockets[name] + } + } + } + + if (this.requests[name] && this.requests[name].length) { + // If we have pending requests and a socket gets closed a new one + // needs to be created to take over in the pool for the one that closed. + this.createSocket(name, host, port).emit('free') + } +} + +function ForeverAgentSSL (options) { + ForeverAgent.call(this, options) +} +util.inherits(ForeverAgentSSL, ForeverAgent) + +ForeverAgentSSL.prototype.createConnection = createConnectionSSL +ForeverAgentSSL.prototype.addRequestNoreuse = AgentSSL.prototype.addRequest + +function createConnectionSSL (port, host, options) { + options.port = port + options.host = host + return tls.connect(options) +} diff --git a/node_modules/nodetime/node_modules/request/main.js b/node_modules/nodetime/node_modules/request/main.js new file mode 100644 index 0000000..27b470b --- /dev/null +++ b/node_modules/nodetime/node_modules/request/main.js @@ -0,0 +1,1123 @@ +// Copyright 2010-2012 Mikeal Rogers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +var http = require('http') + , https = false + , tls = false + , url = require('url') + , util = require('util') + , stream = require('stream') + , qs = require('querystring') + , oauth = require('./oauth') + , uuid = require('./uuid') + , ForeverAgent = require('./forever') + , Cookie = require('./vendor/cookie') + , CookieJar = require('./vendor/cookie/jar') + , cookieJar = new CookieJar + , tunnel = require('./tunnel') + , aws = require('./aws') + + , mime = require('mime') + , FormData = require('form-data') + ; + +if (process.logging) { + var log = process.logging('request') +} + +try { + https = require('https') +} catch (e) {} + +try { + tls = require('tls') +} catch (e) {} + +function toBase64 (str) { + return (new Buffer(str || "", "ascii")).toString("base64") +} + +// Hacky fix for pre-0.4.4 https +if (https && !https.Agent) { + https.Agent = function (options) { + http.Agent.call(this, options) + } + util.inherits(https.Agent, http.Agent) + https.Agent.prototype._getConnection = function (host, port, cb) { + var s = tls.connect(port, host, this.options, function () { + // do other checks here? + if (cb) cb() + }) + return s + } +} + +function isReadStream (rs) { + if (rs.readable && rs.path && rs.mode) { + return true + } +} + +function copy (obj) { + var o = {} + Object.keys(obj).forEach(function (i) { + o[i] = obj[i] + }) + return o +} + +var isUrl = /^https?:/ + +var globalPool = {} + +function Request (options) { + stream.Stream.call(this) + this.readable = true + this.writable = true + + if (typeof options === 'string') { + options = {uri:options} + } + + var reserved = Object.keys(Request.prototype) + for (var i in options) { + if (reserved.indexOf(i) === -1) { + this[i] = options[i] + } else { + if (typeof options[i] === 'function') { + delete options[i] + } + } + } + options = copy(options) + + this.init(options) +} +util.inherits(Request, stream.Stream) +Request.prototype.init = function (options) { + var self = this + + if (!options) options = {} + if (process.env.NODE_DEBUG && /request/.test(process.env.NODE_DEBUG)) console.error('REQUEST', options) + if (!self.pool && self.pool !== false) self.pool = globalPool + self.dests = [] + self.__isRequestRequest = true + + // Protect against double callback + if (!self._callback && self.callback) { + self._callback = self.callback + self.callback = function () { + if (self._callbackCalled) return // Print a warning maybe? + self._callback.apply(self, arguments) + self._callbackCalled = true + } + self.on('error', self.callback.bind()) + self.on('complete', self.callback.bind(self, null)) + } + + if (self.url) { + // People use this property instead all the time so why not just support it. + self.uri = self.url + delete self.url + } + + if (!self.uri) { + // this will throw if unhandled but is handleable when in a redirect + return self.emit('error', new Error("options.uri is a required argument")) + } else { + if (typeof self.uri == "string") self.uri = url.parse(self.uri) + } + if (self.proxy) { + if (typeof self.proxy == 'string') self.proxy = url.parse(self.proxy) + + // do the HTTP CONNECT dance using koichik/node-tunnel + if (http.globalAgent && self.uri.protocol === "https:") { + var tunnelFn = self.proxy.protocol === "http:" + ? tunnel.httpsOverHttp : tunnel.httpsOverHttps + + var tunnelOptions = { proxy: { host: self.proxy.hostname + , port: +self.proxy.port + , proxyAuth: self.proxy.auth } + , ca: this.ca } + + self.agent = tunnelFn(tunnelOptions) + self.tunnel = true + } + } + + if (!self.uri.host || !self.uri.pathname) { + // Invalid URI: it may generate lot of bad errors, like "TypeError: Cannot call method 'indexOf' of undefined" in CookieJar + // Detect and reject it as soon as possible + var faultyUri = url.format(self.uri) + var message = 'Invalid URI "' + faultyUri + '"' + if (Object.keys(options).length === 0) { + // No option ? This can be the sign of a redirect + // As this is a case where the user cannot do anything (he didn't call request directly with this URL) + // he should be warned that it can be caused by a redirection (can save some hair) + message += '. This can be caused by a crappy redirection.' + } + self.emit('error', new Error(message)) + return // This error was fatal + } + + self._redirectsFollowed = self._redirectsFollowed || 0 + self.maxRedirects = (self.maxRedirects !== undefined) ? self.maxRedirects : 10 + self.followRedirect = (self.followRedirect !== undefined) ? self.followRedirect : true + self.followAllRedirects = (self.followAllRedirects !== undefined) ? self.followAllRedirects : false + if (self.followRedirect || self.followAllRedirects) + self.redirects = self.redirects || [] + + self.headers = self.headers ? copy(self.headers) : {} + + self.setHost = false + if (!self.headers.host) { + self.headers.host = self.uri.hostname + if (self.uri.port) { + if ( !(self.uri.port === 80 && self.uri.protocol === 'http:') && + !(self.uri.port === 443 && self.uri.protocol === 'https:') ) + self.headers.host += (':'+self.uri.port) + } + self.setHost = true + } + + self.jar(self._jar || options.jar) + + if (!self.uri.pathname) {self.uri.pathname = '/'} + if (!self.uri.port) { + if (self.uri.protocol == 'http:') {self.uri.port = 80} + else if (self.uri.protocol == 'https:') {self.uri.port = 443} + } + + if (self.proxy && !self.tunnel) { + self.port = self.proxy.port + self.host = self.proxy.hostname + } else { + self.port = self.uri.port + self.host = self.uri.hostname + } + + self.clientErrorHandler = function (error) { + if (self._aborted) return + + if (self.setHost) delete self.headers.host + if (self.req._reusedSocket && error.code === 'ECONNRESET' + && self.agent.addRequestNoreuse) { + self.agent = { addRequest: self.agent.addRequestNoreuse.bind(self.agent) } + self.start() + self.req.end() + return + } + if (self.timeout && self.timeoutTimer) { + clearTimeout(self.timeoutTimer) + self.timeoutTimer = null + } + self.emit('error', error) + } + + self._parserErrorHandler = function (error) { + if (this.res) { + if (this.res.request) { + this.res.request.emit('error', error) + } else { + this.res.emit('error', error) + } + } else { + this._httpMessage.emit('error', error) + } + } + + if (options.form) { + self.form(options.form) + } + + if (options.oauth) { + self.oauth(options.oauth) + } + + if (options.aws) { + self.aws(options.aws) + } + + if (self.uri.auth && !self.headers.authorization) { + self.headers.authorization = "Basic " + toBase64(self.uri.auth.split(':').map(function(item){ return qs.unescape(item)}).join(':')) + } + if (self.proxy && self.proxy.auth && !self.headers['proxy-authorization'] && !self.tunnel) { + self.headers['proxy-authorization'] = "Basic " + toBase64(self.proxy.auth.split(':').map(function(item){ return qs.unescape(item)}).join(':')) + } + + if (options.qs) self.qs(options.qs) + + if (self.uri.path) { + self.path = self.uri.path + } else { + self.path = self.uri.pathname + (self.uri.search || "") + } + + if (self.path.length === 0) self.path = '/' + + if (self.proxy && !self.tunnel) self.path = (self.uri.protocol + '//' + self.uri.host + self.path) + + if (options.json) { + self.json(options.json) + } else if (options.multipart) { + self.boundary = uuid() + self.multipart(options.multipart) + } + + if (self.body) { + var length = 0 + if (!Buffer.isBuffer(self.body)) { + if (Array.isArray(self.body)) { + for (var i = 0; i < self.body.length; i++) { + length += self.body[i].length + } + } else { + self.body = new Buffer(self.body) + length = self.body.length + } + } else { + length = self.body.length + } + if (length) { + if(!self.headers['content-length'] && !self.headers['Content-Length']) + self.headers['content-length'] = length + } else { + throw new Error('Argument error, options.body.') + } + } + + var protocol = self.proxy && !self.tunnel ? self.proxy.protocol : self.uri.protocol + , defaultModules = {'http:':http, 'https:':https} + , httpModules = self.httpModules || {} + ; + self.httpModule = httpModules[protocol] || defaultModules[protocol] + + if (!self.httpModule) return this.emit('error', new Error("Invalid protocol")) + + if (options.ca) self.ca = options.ca + + if (!self.agent) { + if (options.agentOptions) self.agentOptions = options.agentOptions + + if (options.agentClass) { + self.agentClass = options.agentClass + } else if (options.forever) { + self.agentClass = protocol === 'http:' ? ForeverAgent : ForeverAgent.SSL + } else { + self.agentClass = self.httpModule.Agent + } + } + + if (self.pool === false) { + self.agent = false + } else { + self.agent = self.agent || self.getAgent() + if (self.maxSockets) { + // Don't use our pooling if node has the refactored client + self.agent.maxSockets = self.maxSockets + } + if (self.pool.maxSockets) { + // Don't use our pooling if node has the refactored client + self.agent.maxSockets = self.pool.maxSockets + } + } + + self.once('pipe', function (src) { + if (self.ntick && self._started) throw new Error("You cannot pipe to this stream after the outbound request has started.") + self.src = src + if (isReadStream(src)) { + if (!self.headers['content-type'] && !self.headers['Content-Type']) + self.headers['content-type'] = mime.lookup(src.path) + } else { + if (src.headers) { + for (var i in src.headers) { + if (!self.headers[i]) { + self.headers[i] = src.headers[i] + } + } + } + if (self._json && !self.headers['content-type'] && !self.headers['Content-Type']) + self.headers['content-type'] = 'application/json' + if (src.method && !self.method) { + self.method = src.method + } + } + + self.on('pipe', function () { + console.error("You have already piped to this stream. Pipeing twice is likely to break the request.") + }) + }) + + process.nextTick(function () { + if (self._aborted) return + + if (self._form) { + self.setHeaders(self._form.getHeaders()) + self._form.pipe(self) + } + if (self.body) { + if (Array.isArray(self.body)) { + self.body.forEach(function (part) { + self.write(part) + }) + } else { + self.write(self.body) + } + self.end() + } else if (self.requestBodyStream) { + console.warn("options.requestBodyStream is deprecated, please pass the request object to stream.pipe.") + self.requestBodyStream.pipe(self) + } else if (!self.src) { + if (self.method !== 'GET' && typeof self.method !== 'undefined') { + self.headers['content-length'] = 0 + } + self.end() + } + self.ntick = true + }) +} + +// Must call this when following a redirect from https to http or vice versa +// Attempts to keep everything as identical as possible, but update the +// httpModule, Tunneling agent, and/or Forever Agent in use. +Request.prototype._updateProtocol = function () { + var self = this + var protocol = self.uri.protocol + + if (protocol === 'https:') { + // previously was doing http, now doing https + // if it's https, then we might need to tunnel now. + if (self.proxy) { + self.tunnel = true + var tunnelFn = self.proxy.protocol === 'http:' + ? tunnel.httpsOverHttp : tunnel.httpsOverHttps + var tunnelOptions = { proxy: { host: self.proxy.hostname + , post: +self.proxy.port + , proxyAuth: self.proxy.auth } + , ca: self.ca } + self.agent = tunnelFn(tunnelOptions) + return + } + + self.httpModule = https + switch (self.agentClass) { + case ForeverAgent: + self.agentClass = ForeverAgent.SSL + break + case http.Agent: + self.agentClass = https.Agent + break + default: + // nothing we can do. Just hope for the best. + return + } + + // if there's an agent, we need to get a new one. + if (self.agent) self.agent = self.getAgent() + + } else { + if (log) log('previously https, now http') + // previously was doing https, now doing http + // stop any tunneling. + if (self.tunnel) self.tunnel = false + self.httpModule = http + switch (self.agentClass) { + case ForeverAgent.SSL: + self.agentClass = ForeverAgent + break + case https.Agent: + self.agentClass = http.Agent + break + default: + // nothing we can do. just hope for the best + return + } + + // if there's an agent, then get a new one. + if (self.agent) { + self.agent = null + self.agent = self.getAgent() + } + } +} + +Request.prototype.getAgent = function () { + var Agent = this.agentClass + var options = {} + if (this.agentOptions) { + for (var i in this.agentOptions) { + options[i] = this.agentOptions[i] + } + } + if (this.ca) options.ca = this.ca + + var poolKey = '' + + // different types of agents are in different pools + if (Agent !== this.httpModule.Agent) { + poolKey += Agent.name + } + + if (!this.httpModule.globalAgent) { + // node 0.4.x + options.host = this.host + options.port = this.port + if (poolKey) poolKey += ':' + poolKey += this.host + ':' + this.port + } + + // ca option is only relevant if proxy or destination are https + var proxy = this.proxy + if (typeof proxy === 'string') proxy = url.parse(proxy) + var caRelevant = (proxy && proxy.protocol === 'https:') || this.uri.protocol === 'https:' + if (options.ca && caRelevant) { + if (poolKey) poolKey += ':' + poolKey += options.ca + } + + if (!poolKey && Agent === this.httpModule.Agent && this.httpModule.globalAgent) { + // not doing anything special. Use the globalAgent + return this.httpModule.globalAgent + } + + // we're using a stored agent. Make sure it's protocol-specific + poolKey = this.uri.protocol + poolKey + + // already generated an agent for this setting + if (this.pool[poolKey]) return this.pool[poolKey] + + return this.pool[poolKey] = new Agent(options) +} + +Request.prototype.start = function () { + var self = this + + if (self._aborted) return + + self._started = true + self.method = self.method || 'GET' + self.href = self.uri.href + if (log) log('%method %href', self) + + if (self.src && self.src.stat && self.src.stat.size && !self.headers['content-length'] && !self.headers['Content-Length']) { + self.headers['content-length'] = self.src.stat.size + } + if (self._aws) { + self.aws(self._aws, true) + } + self.req = self.httpModule.request(self, function (response) { + if (response.connection.listeners('error').indexOf(self._parserErrorHandler) === -1) { + response.connection.once('error', self._parserErrorHandler) + } + if (self._aborted) return + if (self._paused) response.pause() + + self.response = response + response.request = self + response.toJSON = toJSON + + if (self.httpModule === https && + self.strictSSL && + !response.client.authorized) { + var sslErr = response.client.authorizationError + self.emit('error', new Error('SSL Error: '+ sslErr)) + return + } + + if (self.setHost) delete self.headers.host + if (self.timeout && self.timeoutTimer) { + clearTimeout(self.timeoutTimer) + self.timeoutTimer = null + } + + var addCookie = function (cookie) { + if (self._jar) self._jar.add(new Cookie(cookie)) + else cookieJar.add(new Cookie(cookie)) + } + + if (response.headers['set-cookie'] && (!self._disableCookies)) { + if (Array.isArray(response.headers['set-cookie'])) response.headers['set-cookie'].forEach(addCookie) + else addCookie(response.headers['set-cookie']) + } + + if (response.statusCode >= 300 && response.statusCode < 400 && + (self.followAllRedirects || + (self.followRedirect && (self.method !== 'PUT' && self.method !== 'POST' && self.method !== 'DELETE'))) && + response.headers.location) { + if (self._redirectsFollowed >= self.maxRedirects) { + self.emit('error', new Error("Exceeded maxRedirects. Probably stuck in a redirect loop "+self.uri.href)) + return + } + self._redirectsFollowed += 1 + + if (!isUrl.test(response.headers.location)) { + response.headers.location = url.resolve(self.uri.href, response.headers.location) + } + + var uriPrev = self.uri + self.uri = url.parse(response.headers.location) + + // handle the case where we change protocol from https to http or vice versa + if (self.uri.protocol !== uriPrev.protocol) { + self._updateProtocol() + } + + self.redirects.push( + { statusCode : response.statusCode + , redirectUri: response.headers.location + } + ) + if (self.followAllRedirects) self.method = 'GET' + // self.method = 'GET' // Force all redirects to use GET || commented out fixes #215 + delete self.src + delete self.req + delete self.agent + delete self._started + delete self.body + delete self._form + if (self.headers) { + delete self.headers.host + delete self.headers['content-type'] + delete self.headers['content-length'] + } + if (log) log('Redirect to %uri', self) + self.init() + return // Ignore the rest of the response + } else { + self._redirectsFollowed = self._redirectsFollowed || 0 + // Be a good stream and emit end when the response is finished. + // Hack to emit end on close because of a core bug that never fires end + response.on('close', function () { + if (!self._ended) self.response.emit('end') + }) + + if (self.encoding) { + if (self.dests.length !== 0) { + console.error("Ingoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.") + } else { + response.setEncoding(self.encoding) + } + } + + self.dests.forEach(function (dest) { + self.pipeDest(dest) + }) + + response.on("data", function (chunk) { + self._destdata = true + self.emit("data", chunk) + }) + response.on("end", function (chunk) { + self._ended = true + self.emit("end", chunk) + }) + response.on("close", function () {self.emit("close")}) + + self.emit('response', response) + + if (self.callback) { + var buffer = [] + var bodyLen = 0 + self.on("data", function (chunk) { + buffer.push(chunk) + bodyLen += chunk.length + }) + self.on("end", function () { + if (self._aborted) return + + if (buffer.length && Buffer.isBuffer(buffer[0])) { + var body = new Buffer(bodyLen) + var i = 0 + buffer.forEach(function (chunk) { + chunk.copy(body, i, 0, chunk.length) + i += chunk.length + }) + if (self.encoding === null) { + response.body = body + } else { + response.body = body.toString(self.encoding) + } + } else if (buffer.length) { + response.body = buffer.join('') + } + + if (self._json) { + try { + response.body = JSON.parse(response.body) + } catch (e) {} + } + + self.emit('complete', response, response.body) + }) + } + } + }) + + if (self.timeout && !self.timeoutTimer) { + self.timeoutTimer = setTimeout(function () { + self.req.abort() + var e = new Error("ETIMEDOUT") + e.code = "ETIMEDOUT" + self.emit("error", e) + }, self.timeout) + + // Set additional timeout on socket - in case if remote + // server freeze after sending headers + if (self.req.setTimeout) { // only works on node 0.6+ + self.req.setTimeout(self.timeout, function () { + if (self.req) { + self.req.abort() + var e = new Error("ESOCKETTIMEDOUT") + e.code = "ESOCKETTIMEDOUT" + self.emit("error", e) + } + }) + } + } + + self.req.on('error', self.clientErrorHandler) + self.req.on('drain', function() { + self.emit('drain') + }) + self.on('end', function() { + if ( self.req.connection ) self.req.connection.removeListener('error', self._parserErrorHandler) + }) + self.emit('request', self.req) +} + +Request.prototype.abort = function () { + this._aborted = true + + if (this.req) { + this.req.abort() + } + else if (this.response) { + this.response.abort() + } + + this.emit("abort") +} + +Request.prototype.pipeDest = function (dest) { + var response = this.response + // Called after the response is received + if (dest.headers) { + dest.headers['content-type'] = response.headers['content-type'] + if (response.headers['content-length']) { + dest.headers['content-length'] = response.headers['content-length'] + } + } + if (dest.setHeader) { + for (var i in response.headers) { + dest.setHeader(i, response.headers[i]) + } + dest.statusCode = response.statusCode + } + if (this.pipefilter) this.pipefilter(response, dest) +} + +// Composable API +Request.prototype.setHeader = function (name, value, clobber) { + if (clobber === undefined) clobber = true + if (clobber || !this.headers.hasOwnProperty(name)) this.headers[name] = value + else this.headers[name] += ',' + value + return this +} +Request.prototype.setHeaders = function (headers) { + for (var i in headers) {this.setHeader(i, headers[i])} + return this +} +Request.prototype.qs = function (q, clobber) { + var base + if (!clobber && this.uri.query) base = qs.parse(this.uri.query) + else base = {} + + for (var i in q) { + base[i] = q[i] + } + + this.uri = url.parse(this.uri.href.split('?')[0] + '?' + qs.stringify(base)) + this.url = this.uri + + return this +} +Request.prototype.form = function (form) { + if (form) { + this.headers['content-type'] = 'application/x-www-form-urlencoded; charset=utf-8' + this.body = qs.stringify(form).toString('utf8') + return this + } + // create form-data object + this._form = new FormData() + return this._form +} +Request.prototype.multipart = function (multipart) { + var self = this + self.body = [] + + if (!self.headers['content-type']) { + self.headers['content-type'] = 'multipart/related; boundary=' + self.boundary + } else { + self.headers['content-type'] = self.headers['content-type'].split(';')[0] + '; boundary=' + self.boundary + } + + if (!multipart.forEach) throw new Error('Argument error, options.multipart.') + + if (self.preambleCRLF) { + self.body.push(new Buffer('\r\n')) + } + + multipart.forEach(function (part) { + var body = part.body + if(body == null) throw Error('Body attribute missing in multipart.') + delete part.body + var preamble = '--' + self.boundary + '\r\n' + Object.keys(part).forEach(function (key) { + preamble += key + ': ' + part[key] + '\r\n' + }) + preamble += '\r\n' + self.body.push(new Buffer(preamble)) + self.body.push(new Buffer(body)) + self.body.push(new Buffer('\r\n')) + }) + self.body.push(new Buffer('--' + self.boundary + '--')) + return self +} +Request.prototype.json = function (val) { + this.setHeader('accept', 'application/json') + this._json = true + if (typeof val === 'boolean') { + if (typeof this.body === 'object') { + this.setHeader('content-type', 'application/json') + this.body = JSON.stringify(this.body) + } + } else { + this.setHeader('content-type', 'application/json') + this.body = JSON.stringify(val) + } + return this +} +function getHeader(name, headers) { + var result, re, match + Object.keys(headers).forEach(function (key) { + re = new RegExp(name, 'i') + match = key.match(re) + if (match) result = headers[key] + }) + return result +} +Request.prototype.aws = function (opts, now) { + if (!now) { + this._aws = opts + return this + } + var date = new Date() + this.setHeader('date', date.toUTCString()) + var auth = + { key: opts.key + , secret: opts.secret + , verb: this.method.toUpperCase() + , date: date + , contentType: getHeader('content-type', this.headers) || '' + , md5: getHeader('content-md5', this.headers) || '' + , amazonHeaders: aws.canonicalizeHeaders(this.headers) + } + if (opts.bucket && this.path) { + auth.resource = '/' + opts.bucket + this.path + } else if (opts.bucket && !this.path) { + auth.resource = '/' + opts.bucket + } else if (!opts.bucket && this.path) { + auth.resource = this.path + } else if (!opts.bucket && !this.path) { + auth.resource = '/' + } + auth.resource = aws.canonicalizeResource(auth.resource) + this.setHeader('authorization', aws.authorization(auth)) + + return this +} + +Request.prototype.oauth = function (_oauth) { + var form + if (this.headers['content-type'] && + this.headers['content-type'].slice(0, 'application/x-www-form-urlencoded'.length) === + 'application/x-www-form-urlencoded' + ) { + form = qs.parse(this.body) + } + if (this.uri.query) { + form = qs.parse(this.uri.query) + } + if (!form) form = {} + var oa = {} + for (var i in form) oa[i] = form[i] + for (var i in _oauth) oa['oauth_'+i] = _oauth[i] + if (!oa.oauth_version) oa.oauth_version = '1.0' + if (!oa.oauth_timestamp) oa.oauth_timestamp = Math.floor( (new Date()).getTime() / 1000 ).toString() + if (!oa.oauth_nonce) oa.oauth_nonce = uuid().replace(/-/g, '') + + oa.oauth_signature_method = 'HMAC-SHA1' + + var consumer_secret = oa.oauth_consumer_secret + delete oa.oauth_consumer_secret + var token_secret = oa.oauth_token_secret + delete oa.oauth_token_secret + + var baseurl = this.uri.protocol + '//' + this.uri.host + this.uri.pathname + var signature = oauth.hmacsign(this.method, baseurl, oa, consumer_secret, token_secret) + + // oa.oauth_signature = signature + for (var i in form) { + if ( i.slice(0, 'oauth_') in _oauth) { + // skip + } else { + delete oa['oauth_'+i] + if (i !== 'x_auth_mode') delete oa[i] + } + } + this.headers.Authorization = + 'OAuth '+Object.keys(oa).sort().map(function (i) {return i+'="'+oauth.rfc3986(oa[i])+'"'}).join(',') + this.headers.Authorization += ',oauth_signature="' + oauth.rfc3986(signature) + '"' + return this +} +Request.prototype.jar = function (jar) { + var cookies + + if (this._redirectsFollowed === 0) { + this.originalCookieHeader = this.headers.cookie + } + + if (jar === false) { + // disable cookies + cookies = false + this._disableCookies = true + } else if (jar) { + // fetch cookie from the user defined cookie jar + cookies = jar.get({ url: this.uri.href }) + } else { + // fetch cookie from the global cookie jar + cookies = cookieJar.get({ url: this.uri.href }) + } + + if (cookies && cookies.length) { + var cookieString = cookies.map(function (c) { + return c.name + "=" + c.value + }).join("; ") + + if (this.originalCookieHeader) { + // Don't overwrite existing Cookie header + this.headers.cookie = this.originalCookieHeader + '; ' + cookieString + } else { + this.headers.cookie = cookieString + } + } + this._jar = jar + return this +} + + +// Stream API +Request.prototype.pipe = function (dest, opts) { + if (this.response) { + if (this._destdata) { + throw new Error("You cannot pipe after data has been emitted from the response.") + } else if (this._ended) { + throw new Error("You cannot pipe after the response has been ended.") + } else { + stream.Stream.prototype.pipe.call(this, dest, opts) + this.pipeDest(dest) + return dest + } + } else { + this.dests.push(dest) + stream.Stream.prototype.pipe.call(this, dest, opts) + return dest + } +} +Request.prototype.write = function () { + if (!this._started) this.start() + return this.req.write.apply(this.req, arguments) +} +Request.prototype.end = function (chunk) { + if (chunk) this.write(chunk) + if (!this._started) this.start() + this.req.end() +} +Request.prototype.pause = function () { + if (!this.response) this._paused = true + else this.response.pause.apply(this.response, arguments) +} +Request.prototype.resume = function () { + if (!this.response) this._paused = false + else this.response.resume.apply(this.response, arguments) +} +Request.prototype.destroy = function () { + if (!this._ended) this.end() +} + +// organize params for post, put, head, del +function initParams(uri, options, callback) { + if ((typeof options === 'function') && !callback) callback = options + if (options && typeof options === 'object') { + options.uri = uri + } else if (typeof uri === 'string') { + options = {uri:uri} + } else { + options = uri + uri = options.uri + } + return { uri: uri, options: options, callback: callback } +} + +function request (uri, options, callback) { + if (typeof uri === 'undefined') throw new Error('undefined is not a valid uri or options object.') + if ((typeof options === 'function') && !callback) callback = options + if (options && typeof options === 'object') { + options.uri = uri + } else if (typeof uri === 'string') { + options = {uri:uri} + } else { + options = uri + } + + if (callback) options.callback = callback + var r = new Request(options) + return r +} + +module.exports = request + +request.initParams = initParams + +request.defaults = function (options, requester) { + var def = function (method) { + var d = function (uri, opts, callback) { + var params = initParams(uri, opts, callback) + for (var i in options) { + if (params.options[i] === undefined) params.options[i] = options[i] + } + if(typeof requester === 'function') { + if(method === request) { + method = requester + } else { + params.options._requester = requester + } + } + return method(params.options, params.callback) + } + return d + } + var de = def(request) + de.get = def(request.get) + de.post = def(request.post) + de.put = def(request.put) + de.head = def(request.head) + de.del = def(request.del) + de.cookie = def(request.cookie) + de.jar = request.jar + return de +} + +request.forever = function (agentOptions, optionsArg) { + var options = {} + if (optionsArg) { + for (option in optionsArg) { + options[option] = optionsArg[option] + } + } + if (agentOptions) options.agentOptions = agentOptions + options.forever = true + return request.defaults(options) +} + +request.get = request +request.post = function (uri, options, callback) { + var params = initParams(uri, options, callback) + params.options.method = 'POST' + return request(params.uri || null, params.options, params.callback) +} +request.put = function (uri, options, callback) { + var params = initParams(uri, options, callback) + params.options.method = 'PUT' + return request(params.uri || null, params.options, params.callback) +} +request.head = function (uri, options, callback) { + var params = initParams(uri, options, callback) + params.options.method = 'HEAD' + if (params.options.body || + params.options.requestBodyStream || + (params.options.json && typeof params.options.json !== 'boolean') || + params.options.multipart) { + throw new Error("HTTP HEAD requests MUST NOT include a request body.") + } + return request(params.uri || null, params.options, params.callback) +} +request.del = function (uri, options, callback) { + var params = initParams(uri, options, callback) + params.options.method = 'DELETE' + if(typeof params.options._requester === 'function') { + request = params.options._requester + } + return request(params.uri || null, params.options, params.callback) +} +request.jar = function () { + return new CookieJar +} +request.cookie = function (str) { + if (str && str.uri) str = str.uri + if (typeof str !== 'string') throw new Error("The cookie function only accepts STRING as param") + return new Cookie(str) +} + +// Safe toJSON + +function getSafe (self, uuid) { + if (typeof self === 'object' || typeof self === 'function') var safe = {} + if (Array.isArray(self)) var safe = [] + + var recurse = [] + + Object.defineProperty(self, uuid, {}) + + var attrs = Object.keys(self).filter(function (i) { + if (i === uuid) return false + if ( (typeof self[i] !== 'object' && typeof self[i] !== 'function') || self[i] === null) return true + return !(Object.getOwnPropertyDescriptor(self[i], uuid)) + }) + + + for (var i=0;i $(BUILDDIR)/async.min.js + +test: + nodeunit test + +clean: + rm -rf $(BUILDDIR) + +lint: + nodelint --config nodelint.cfg lib/async.js + +.PHONY: test build all diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/README.md b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/README.md new file mode 100644 index 0000000..039d942 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/README.md @@ -0,0 +1,970 @@ +# Async.js + +Async is a utility module which provides straight-forward, powerful functions +for working with asynchronous JavaScript. Although originally designed for +use with [node.js](http://nodejs.org), it can also be used directly in the +browser. + +Async provides around 20 functions that include the usual 'functional' +suspects (map, reduce, filter, forEach…) as well as some common patterns +for asynchronous flow control (parallel, series, waterfall…). All these +functions assume you follow the node.js convention of providing a single +callback as the last argument of your async function. + + +## Quick Examples + + async.map(['file1','file2','file3'], fs.stat, function(err, results){ + // results is now an array of stats for each file + }); + + async.filter(['file1','file2','file3'], path.exists, function(results){ + // results now equals an array of the existing files + }); + + async.parallel([ + function(){ ... }, + function(){ ... } + ], callback); + + async.series([ + function(){ ... }, + function(){ ... } + ]); + +There are many more functions available so take a look at the docs below for a +full list. This module aims to be comprehensive, so if you feel anything is +missing please create a GitHub issue for it. + + +## Download + +Releases are available for download from +[GitHub](http://github.com/caolan/async/downloads). +Alternatively, you can install using Node Package Manager (npm): + + npm install async + + +__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 17.5kb Uncompressed + +__Production:__ [async.min.js](https://github.com/caolan/async/raw/master/dist/async.min.js) - 1.7kb Packed and Gzipped + + +## In the Browser + +So far its been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage: + + + + + +## Documentation + +### Collections + +* [forEach](#forEach) +* [map](#map) +* [filter](#filter) +* [reject](#reject) +* [reduce](#reduce) +* [detect](#detect) +* [sortBy](#sortBy) +* [some](#some) +* [every](#every) +* [concat](#concat) + +### Flow Control + +* [series](#series) +* [parallel](#parallel) +* [whilst](#whilst) +* [until](#until) +* [waterfall](#waterfall) +* [queue](#queue) +* [auto](#auto) +* [iterator](#iterator) +* [apply](#apply) +* [nextTick](#nextTick) + +### Utils + +* [memoize](#memoize) +* [log](#log) +* [dir](#dir) +* [noConflict](#noConflict) + + +## Collections + + +### forEach(arr, iterator, callback) + +Applies an iterator function to each item in an array, in parallel. +The iterator is called with an item from the list and a callback for when it +has finished. If the iterator passes an error to this callback, the main +callback for the forEach function is immediately called with the error. + +Note, that since this function applies the iterator to each item in parallel +there is no guarantee that the iterator functions will complete in order. + +__Arguments__ + +* arr - An array to iterate over. +* iterator(item, callback) - A function to apply to each item in the array. + The iterator is passed a callback which must be called once it has completed. +* callback(err) - A callback which is called after all the iterator functions + have finished, or an error has occurred. + +__Example__ + + // assuming openFiles is an array of file names and saveFile is a function + // to save the modified contents of that file: + + async.forEach(openFiles, saveFile, function(err){ + // if any of the saves produced an error, err would equal that error + }); + +--------------------------------------- + + +### forEachSeries(arr, iterator, callback) + +The same as forEach only the iterator is applied to each item in the array in +series. The next iterator is only called once the current one has completed +processing. This means the iterator functions will complete in order. + + +--------------------------------------- + + +### map(arr, iterator, callback) + +Produces a new array of values by mapping each value in the given array through +the iterator function. The iterator is called with an item from the array and a +callback for when it has finished processing. The callback takes 2 arguments, +an error and the transformed item from the array. If the iterator passes an +error to this callback, the main callback for the map function is immediately +called with the error. + +Note, that since this function applies the iterator to each item in parallel +there is no guarantee that the iterator functions will complete in order, however +the results array will be in the same order as the original array. + +__Arguments__ + +* arr - An array to iterate over. +* iterator(item, callback) - A function to apply to each item in the array. + The iterator is passed a callback which must be called once it has completed + with an error (which can be null) and a transformed item. +* callback(err, results) - A callback which is called after all the iterator + functions have finished, or an error has occurred. Results is an array of the + transformed items from the original array. + +__Example__ + + async.map(['file1','file2','file3'], fs.stat, function(err, results){ + // results is now an array of stats for each file + }); + +--------------------------------------- + + +### mapSeries(arr, iterator, callback) + +The same as map only the iterator is applied to each item in the array in +series. The next iterator is only called once the current one has completed +processing. The results array will be in the same order as the original. + + +--------------------------------------- + + +### filter(arr, iterator, callback) + +__Alias:__ select + +Returns a new array of all the values which pass an async truth test. +_The callback for each iterator call only accepts a single argument of true or +false, it does not accept an error argument first!_ This is in-line with the +way node libraries work with truth tests like path.exists. This operation is +performed in parallel, but the results array will be in the same order as the +original. + +__Arguments__ + +* arr - An array to iterate over. +* iterator(item, callback) - A truth test to apply to each item in the array. + The iterator is passed a callback which must be called once it has completed. +* callback(results) - A callback which is called after all the iterator + functions have finished. + +__Example__ + + async.filter(['file1','file2','file3'], path.exists, function(results){ + // results now equals an array of the existing files + }); + +--------------------------------------- + + +### filterSeries(arr, iterator, callback) + +__alias:__ selectSeries + +The same as filter only the iterator is applied to each item in the array in +series. The next iterator is only called once the current one has completed +processing. The results array will be in the same order as the original. + +--------------------------------------- + + +### reject(arr, iterator, callback) + +The opposite of filter. Removes values that pass an async truth test. + +--------------------------------------- + + +### rejectSeries(arr, iterator, callback) + +The same as filter, only the iterator is applied to each item in the array +in series. + + +--------------------------------------- + + +### reduce(arr, memo, iterator, callback) + +__aliases:__ inject, foldl + +Reduces a list of values into a single value using an async iterator to return +each successive step. Memo is the initial state of the reduction. This +function only operates in series. For performance reasons, it may make sense to +split a call to this function into a parallel map, then use the normal +Array.prototype.reduce on the results. This function is for situations where +each step in the reduction needs to be async, if you can get the data before +reducing it then its probably a good idea to do so. + +__Arguments__ + +* arr - An array to iterate over. +* memo - The initial state of the reduction. +* iterator(memo, item, callback) - A function applied to each item in the + array to produce the next step in the reduction. The iterator is passed a + callback which accepts an optional error as its first argument, and the state + of the reduction as the second. If an error is passed to the callback, the + reduction is stopped and the main callback is immediately called with the + error. +* callback(err, result) - A callback which is called after all the iterator + functions have finished. Result is the reduced value. + +__Example__ + + async.reduce([1,2,3], 0, function(memo, item, callback){ + // pointless async: + process.nextTick(function(){ + callback(null, memo + item) + }); + }, function(err, result){ + // result is now equal to the last value of memo, which is 6 + }); + +--------------------------------------- + + +### reduceRight(arr, memo, iterator, callback) + +__Alias:__ foldr + +Same as reduce, only operates on the items in the array in reverse order. + + +--------------------------------------- + + +### detect(arr, iterator, callback) + +Returns the first value in a list that passes an async truth test. The +iterator is applied in parallel, meaning the first iterator to return true will +fire the detect callback with that result. That means the result might not be +the first item in the original array (in terms of order) that passes the test. + +If order within the original array is important then look at detectSeries. + +__Arguments__ + +* arr - An array to iterate over. +* iterator(item, callback) - A truth test to apply to each item in the array. + The iterator is passed a callback which must be called once it has completed. +* callback(result) - A callback which is called as soon as any iterator returns + true, or after all the iterator functions have finished. Result will be + the first item in the array that passes the truth test (iterator) or the + value undefined if none passed. + +__Example__ + + async.detect(['file1','file2','file3'], path.exists, function(result){ + // result now equals the first file in the list that exists + }); + +--------------------------------------- + + +### detectSeries(arr, iterator, callback) + +The same as detect, only the iterator is applied to each item in the array +in series. This means the result is always the first in the original array (in +terms of array order) that passes the truth test. + + +--------------------------------------- + + +### sortBy(arr, iterator, callback) + +Sorts a list by the results of running each value through an async iterator. + +__Arguments__ + +* arr - An array to iterate over. +* iterator(item, callback) - A function to apply to each item in the array. + The iterator is passed a callback which must be called once it has completed + with an error (which can be null) and a value to use as the sort criteria. +* callback(err, results) - A callback which is called after all the iterator + functions have finished, or an error has occurred. Results is the items from + the original array sorted by the values returned by the iterator calls. + +__Example__ + + async.sortBy(['file1','file2','file3'], function(file, callback){ + fs.stat(file, function(err, stats){ + callback(err, stats.mtime); + }); + }, function(err, results){ + // results is now the original array of files sorted by + // modified date + }); + + +--------------------------------------- + + +### some(arr, iterator, callback) + +__Alias:__ any + +Returns true if at least one element in the array satisfies an async test. +_The callback for each iterator call only accepts a single argument of true or +false, it does not accept an error argument first!_ This is in-line with the +way node libraries work with truth tests like path.exists. Once any iterator +call returns true, the main callback is immediately called. + +__Arguments__ + +* arr - An array to iterate over. +* iterator(item, callback) - A truth test to apply to each item in the array. + The iterator is passed a callback which must be called once it has completed. +* callback(result) - A callback which is called as soon as any iterator returns + true, or after all the iterator functions have finished. Result will be + either true or false depending on the values of the async tests. + +__Example__ + + async.some(['file1','file2','file3'], path.exists, function(result){ + // if result is true then at least one of the files exists + }); + +--------------------------------------- + + +### every(arr, iterator, callback) + +__Alias:__ all + +Returns true if every element in the array satisfies an async test. +_The callback for each iterator call only accepts a single argument of true or +false, it does not accept an error argument first!_ This is in-line with the +way node libraries work with truth tests like path.exists. + +__Arguments__ + +* arr - An array to iterate over. +* iterator(item, callback) - A truth test to apply to each item in the array. + The iterator is passed a callback which must be called once it has completed. +* callback(result) - A callback which is called after all the iterator + functions have finished. Result will be either true or false depending on + the values of the async tests. + +__Example__ + + async.every(['file1','file2','file3'], path.exists, function(result){ + // if result is true then every file exists + }); + +--------------------------------------- + + +### concat(arr, iterator, callback) + +Applies an iterator to each item in a list, concatenating the results. Returns the +concatenated list. The iterators are called in parallel, and the results are +concatenated as they return. There is no guarantee that the results array will +be returned in the original order of the arguments passed to the iterator function. + +__Arguments__ + +* arr - An array to iterate over +* iterator(item, callback) - A function to apply to each item in the array. + The iterator is passed a callback which must be called once it has completed + with an error (which can be null) and an array of results. +* callback(err, results) - A callback which is called after all the iterator + functions have finished, or an error has occurred. Results is an array containing + the concatenated results of the iterator function. + +__Example__ + + async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){ + // files is now a list of filenames that exist in the 3 directories + }); + +--------------------------------------- + + +### concatSeries(arr, iterator, callback) + +Same as async.concat, but executes in series instead of parallel. + + +## Flow Control + + +### series(tasks, [callback]) + +Run an array of functions in series, each one running once the previous +function has completed. If any functions in the series pass an error to its +callback, no more functions are run and the callback for the series is +immediately called with the value of the error. Once the tasks have completed, +the results are passed to the final callback as an array. + +It is also possible to use an object instead of an array. Each property will be +run as a function and the results will be passed to the final callback as an object +instead of an array. This can be a more readable way of handling results from +async.series. + + +__Arguments__ + +* tasks - An array or object containing functions to run, each function is passed + a callback it must call on completion. +* callback(err, results) - An optional callback to run once all the functions + have completed. This function gets an array of all the arguments passed to + the callbacks used in the array. + +__Example__ + + async.series([ + function(callback){ + // do some stuff ... + callback(null, 'one'); + }, + function(callback){ + // do some more stuff ... + callback(null, 'two'); + }, + ], + // optional callback + function(err, results){ + // results is now equal to ['one', 'two'] + }); + + + // an example using an object instead of an array + async.series({ + one: function(callback){ + setTimeout(function(){ + callback(null, 1); + }, 200); + }, + two: function(callback){ + setTimeout(function(){ + callback(null, 2); + }, 100); + }, + }, + function(err, results) { + // results is now equals to: {one: 1, two: 2} + }); + + +--------------------------------------- + + +### parallel(tasks, [callback]) + +Run an array of functions in parallel, without waiting until the previous +function has completed. If any of the functions pass an error to its +callback, the main callback is immediately called with the value of the error. +Once the tasks have completed, the results are passed to the final callback as an +array. + +It is also possible to use an object instead of an array. Each property will be +run as a function and the results will be passed to the final callback as an object +instead of an array. This can be a more readable way of handling results from +async.parallel. + + +__Arguments__ + +* tasks - An array or object containing functions to run, each function is passed a + callback it must call on completion. +* callback(err, results) - An optional callback to run once all the functions + have completed. This function gets an array of all the arguments passed to + the callbacks used in the array. + +__Example__ + + async.parallel([ + function(callback){ + setTimeout(function(){ + callback(null, 'one'); + }, 200); + }, + function(callback){ + setTimeout(function(){ + callback(null, 'two'); + }, 100); + }, + ], + // optional callback + function(err, results){ + // in this case, the results array will equal ['two','one'] + // because the functions were run in parallel and the second + // function had a shorter timeout before calling the callback. + }); + + + // an example using an object instead of an array + async.parallel({ + one: function(callback){ + setTimeout(function(){ + callback(null, 1); + }, 200); + }, + two: function(callback){ + setTimeout(function(){ + callback(null, 2); + }, 100); + }, + }, + function(err, results) { + // results is now equals to: {one: 1, two: 2} + }); + + +--------------------------------------- + + +### whilst(test, fn, callback) + +Repeatedly call fn, while test returns true. Calls the callback when stopped, +or an error occurs. + +__Arguments__ + +* test() - synchronous truth test to perform before each execution of fn. +* fn(callback) - A function to call each time the test passes. The function is + passed a callback which must be called once it has completed with an optional + error as the first argument. +* callback(err) - A callback which is called after the test fails and repeated + execution of fn has stopped. + +__Example__ + + var count = 0; + + async.whilst( + function () { return count < 5; }, + function (callback) { + count++; + setTimeout(callback, 1000); + }, + function (err) { + // 5 seconds have passed + } + }); + + +--------------------------------------- + + +### until(test, fn, callback) + +Repeatedly call fn, until test returns true. Calls the callback when stopped, +or an error occurs. + +The inverse of async.whilst. + + +--------------------------------------- + + +### waterfall(tasks, [callback]) + +Runs an array of functions in series, each passing their results to the next in +the array. However, if any of the functions pass an error to the callback, the +next function is not executed and the main callback is immediately called with +the error. + +__Arguments__ + +* tasks - An array of functions to run, each function is passed a callback it + must call on completion. +* callback(err) - An optional callback to run once all the functions have + completed. This function gets passed any error that may have occurred. + +__Example__ + + async.waterfall([ + function(callback){ + callback(null, 'one', 'two'); + }, + function(arg1, arg2, callback){ + callback(null, 'three'); + }, + function(arg1, callback){ + // arg1 now equals 'three' + callback(null, 'done'); + } + ]); + + +--------------------------------------- + + +### queue(worker, concurrency) + +Creates a queue object with the specified concurrency. Tasks added to the +queue will be processed in parallel (up to the concurrency limit). If all +workers are in progress, the task is queued until one is available. Once +a worker has completed a task, the task's callback is called. + +__Arguments__ + +* worker(task, callback) - An asynchronous function for processing a queued + task. +* concurrency - An integer for determining how many worker functions should be + run in parallel. + +__Queue objects__ + +The queue object returned by this function has the following properties and +methods: + +* length() - a function returning the number of items waiting to be processed. +* concurrency - an integer for determining how many worker functions should be + run in parallel. This property can be changed after a queue is created to + alter the concurrency on-the-fly. +* push(task, [callback]) - add a new task to the queue, the callback is called + once the worker has finished processing the task. +* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued +* empty - a callback that is called when the last item from the queue is given to a worker +* drain - a callback that is called when the last item from the queue has returned from the worker + +__Example__ + + // create a queue object with concurrency 2 + + var q = async.queue(function (task, callback) { + console.log('hello ' + task.name). + callback(); + }, 2); + + + // assign a callback + q.drain = function() { + console.log('all items have been processed'); + } + + // add some items to the queue + + q.push({name: 'foo'}, function (err) { + console.log('finished processing foo'); + }); + q.push({name: 'bar'}, function (err) { + console.log('finished processing bar'); + }); + + +--------------------------------------- + + +### auto(tasks, [callback]) + +Determines the best order for running functions based on their requirements. +Each function can optionally depend on other functions being completed first, +and each function is run as soon as its requirements are satisfied. If any of +the functions pass and error to their callback, that function will not complete +(so any other functions depending on it will not run) and the main callback +will be called immediately with the error. + +__Arguments__ + +* tasks - An object literal containing named functions or an array of + requirements, with the function itself the last item in the array. The key + used for each function or array is used when specifying requirements. The + syntax is easier to understand by looking at the example. +* callback(err) - An optional callback which is called when all the tasks have + been completed. The callback may receive an error as an argument. + +__Example__ + + async.auto({ + get_data: function(callback){ + // async code to get some data + }, + make_folder: function(callback){ + // async code to create a directory to store a file in + // this is run at the same time as getting the data + }, + write_file: ['get_data', 'make_folder', function(callback){ + // once there is some data and the directory exists, + // write the data to a file in the directory + }], + email_link: ['write_file', function(callback){ + // once the file is written let's email a link to it... + }] + }); + +This is a fairly trivial example, but to do this using the basic parallel and +series functions would look like this: + + async.parallel([ + function(callback){ + // async code to get some data + }, + function(callback){ + // async code to create a directory to store a file in + // this is run at the same time as getting the data + } + ], + function(results){ + async.series([ + function(callback){ + // once there is some data and the directory exists, + // write the data to a file in the directory + }, + email_link: ['write_file', function(callback){ + // once the file is written let's email a link to it... + } + ]); + }); + +For a complicated series of async tasks using the auto function makes adding +new tasks much easier and makes the code more readable. + + +--------------------------------------- + + +### iterator(tasks) + +Creates an iterator function which calls the next function in the array, +returning a continuation to call the next one after that. Its also possible to +'peek' the next iterator by doing iterator.next(). + +This function is used internally by the async module but can be useful when +you want to manually control the flow of functions in series. + +__Arguments__ + +* tasks - An array of functions to run, each function is passed a callback it + must call on completion. + +__Example__ + + var iterator = async.iterator([ + function(){ sys.p('one'); }, + function(){ sys.p('two'); }, + function(){ sys.p('three'); } + ]); + + node> var iterator2 = iterator(); + 'one' + node> var iterator3 = iterator2(); + 'two' + node> iterator3(); + 'three' + node> var nextfn = iterator2.next(); + node> nextfn(); + 'three' + + +--------------------------------------- + + +### apply(function, arguments..) + +Creates a continuation function with some arguments already applied, a useful +shorthand when combined with other flow control functions. Any arguments +passed to the returned function are added to the arguments originally passed +to apply. + +__Arguments__ + +* function - The function you want to eventually apply all arguments to. +* arguments... - Any number of arguments to automatically apply when the + continuation is called. + +__Example__ + + // using apply + + async.parallel([ + async.apply(fs.writeFile, 'testfile1', 'test1'), + async.apply(fs.writeFile, 'testfile2', 'test2'), + ]); + + + // the same process without using apply + + async.parallel([ + function(callback){ + fs.writeFile('testfile1', 'test1', callback); + }, + function(callback){ + fs.writeFile('testfile2', 'test2', callback); + }, + ]); + +It's possible to pass any number of additional arguments when calling the +continuation: + + node> var fn = async.apply(sys.puts, 'one'); + node> fn('two', 'three'); + one + two + three + +--------------------------------------- + + +### nextTick(callback) + +Calls the callback on a later loop around the event loop. In node.js this just +calls process.nextTick, in the browser it falls back to setTimeout(callback, 0), +which means other higher priority events may precede the execution of the callback. + +This is used internally for browser-compatibility purposes. + +__Arguments__ + +* callback - The function to call on a later loop around the event loop. + +__Example__ + + var call_order = []; + async.nextTick(function(){ + call_order.push('two'); + // call_order now equals ['one','two] + }); + call_order.push('one') + + +## Utils + + +### memoize(fn, [hasher]) + +Caches the results of an async function. When creating a hash to store function +results against, the callback is omitted from the hash and an optional hash +function can be used. + +__Arguments__ + +* fn - the function you to proxy and cache results from. +* hasher - an optional function for generating a custom hash for storing + results, it has all the arguments applied to it apart from the callback, and + must be synchronous. + +__Example__ + + var slow_fn = function (name, callback) { + // do something + callback(null, result); + }; + var fn = async.memoize(slow_fn); + + // fn can now be used as if it were slow_fn + fn('some name', function () { + // callback + }); + + + +### log(function, arguments) + +Logs the result of an async function to the console. Only works in node.js or +in browsers that support console.log and console.error (such as FF and Chrome). +If multiple arguments are returned from the async function, console.log is +called on each argument in order. + +__Arguments__ + +* function - The function you want to eventually apply all arguments to. +* arguments... - Any number of arguments to apply to the function. + +__Example__ + + var hello = function(name, callback){ + setTimeout(function(){ + callback(null, 'hello ' + name); + }, 1000); + }; + + node> async.log(hello, 'world'); + 'hello world' + + +--------------------------------------- + + +### dir(function, arguments) + +Logs the result of an async function to the console using console.dir to +display the properties of the resulting object. Only works in node.js or +in browsers that support console.dir and console.error (such as FF and Chrome). +If multiple arguments are returned from the async function, console.dir is +called on each argument in order. + +__Arguments__ + +* function - The function you want to eventually apply all arguments to. +* arguments... - Any number of arguments to apply to the function. + +__Example__ + + var hello = function(name, callback){ + setTimeout(function(){ + callback(null, {hello: name}); + }, 1000); + }; + + node> async.dir(hello, 'world'); + {hello: 'world'} + + +--------------------------------------- + + +### noConflict() + +Changes the value of async back to its original value, returning a reference to the +async object. diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/async.min.js.gzip b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/async.min.js.gzip new file mode 100644 index 0000000000000000000000000000000000000000..e1c32944465c634d9b609622b37972d1ae8e6e7d GIT binary patch literal 1859 zcmV-J2fX+niwFpUH4aSx17UM{ZeuQOX>KlRa{$d)OOx9+4E`&dJ!r^8tJqh0RZrV# zZ=H17-aJ0=C0o0)cwe{Z%@F7vMl6BIVG?Up_q$mIcJ^&y2_Vq3=Im_>A)%=wm zRM|H1UCQ!Wg?FMX>M~b$eE0e-N!vm+Sy>Qze$T2qmYlm4KJcX3XLTqN91Adg8<}0$l>2$&!4KwRQ*L(Nw8`Hdo+t}rs${2EMTi7(9>F{v~n`LU|lDFTN#B?dOCp(dzEuskQM+O-E&H1&YCh#iml zi4<*~hnwCB+XzaUU=84sc1HQrH&bpRFk`~=Br2gaYEw)$o?wcPlg8*d>nw?R_@3ph zidomukX@}6kY9SiFs~J)8=Gd^M21i(G+KPvYdq>e>9Uq&(6B4SC&a#o&2hWH4BYlSH>uKEi9n30?Sh3G;4_GGWRFU!ynmh-%Jfljc<1oxAviD z9fi-|tEvWkuKFswvmbX>U6qWq=s4!zI*u?K1gWXCjDq84f~ZIu)zDYToN8BUAGrAi z&2ug>iaTo2kY;(KDgZ=|@i(I$6MC*zxe1YZ+0WQjdNQmxpO8dx`vc8$c5a0wPIM zwTgyv+zsYEtcj(~YgU{RV*v~>15f|OlFNlS@wb_xt+tlrSWUDE+9y@>)0{1u?0q&W zx}>eKxHYTMX-r6? zwy5`6+7QRR$DGWuLJky#KW2^?6i&BCUlFOG+;n>*Rwk&T*a5&i(op1bd=j0*-G$r$dt<7}^7< zmYYGtmh9+CL8_f6<%^zSDb$2#tS-|pw0jF6K^kEn7{E5g%<~h?5L7-xP~q%113&p$ zHm9^WMFsp#*y><@dK1}0G?}n*P5!~6-P*PjiJOblK2pPZ!AH}GC2FG8VRk}S0Y|U~ z0M02T+BZj5fpRr<&9w_)cO3a;4Y3j+0+6aVL+6VXM3@mDcDIvV+`mhL$7BgH25UBp zEkM?+)Z2nGce&X7=u zTF5y4G*cIc%Z7&~w(vJg8l$wXm(f3QvM^l|RnC}wtKY6qpM5*_cEjBX@}@&+f66RB z!LW5Jet}+UP(U2}vnzHKI(t&XW23Ts)2s%*Sz-}1qn>Z-xexm+ucv1;ykwwjL9Xg{ zPlyzr%*?m;6X=c76w9_~vV2w|EQnu}sz2|AqQJjf)v8G;7+;Ur?wTfN++$l+st~7G zgxCP$@rSm5pCxM;99uA0oQdaHbmKk|*_$P>z&^zuEWmF0m`0wqAaF_NZf2EZJ_~>r zB;ZQl#z4p-)E#=#D%V_ph{y=}x~tWg_Zqt;o}^@)-iC>}>SGDSWA z(uz3hq{3lz^YsGl#i70ap59&)zP4{7RaIpb1fwCSi|qsyydW6SLQJgwoi2p5+v*gB zVpHytBe{p4dwo31DjdR(9v;-8%>J3)K%0F*Q6IB$|2ku)su=X%cBf?!E~8_4wAX@Z xGIF@2s}wJS#afNxut~Qx9u+Qm9U5>4tV;&(tNFTZoYVmy`WKn%6PvIY007E|gZuyh literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.css b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.css new file mode 100644 index 0000000..274434a --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.css @@ -0,0 +1,70 @@ +/*! + * Styles taken from qunit.css + */ + +h1#nodeunit-header, h1.nodeunit-header { + padding: 15px; + font-size: large; + background-color: #06b; + color: white; + font-family: 'trebuchet ms', verdana, arial; + margin: 0; +} + +h1#nodeunit-header a { + color: white; +} + +h2#nodeunit-banner { + height: 2em; + border-bottom: 1px solid white; + background-color: #eee; + margin: 0; + font-family: 'trebuchet ms', verdana, arial; +} +h2#nodeunit-banner.pass { + background-color: green; +} +h2#nodeunit-banner.fail { + background-color: red; +} + +h2#nodeunit-userAgent, h2.nodeunit-userAgent { + padding: 10px; + background-color: #eee; + color: black; + margin: 0; + font-size: small; + font-weight: normal; + font-family: 'trebuchet ms', verdana, arial; + font-size: 10pt; +} + +div#nodeunit-testrunner-toolbar { + background: #eee; + border-top: 1px solid black; + padding: 10px; + font-family: 'trebuchet ms', verdana, arial; + margin: 0; + font-size: 10pt; +} + +ol#nodeunit-tests { + font-family: 'trebuchet ms', verdana, arial; + font-size: 10pt; +} +ol#nodeunit-tests li strong { + cursor:pointer; +} +ol#nodeunit-tests .pass { + color: green; +} +ol#nodeunit-tests .fail { + color: red; +} + +p#nodeunit-testresult { + margin-left: 1em; + font-size: 10pt; + font-family: 'trebuchet ms', verdana, arial; +} diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.js new file mode 100644 index 0000000..5957184 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.js @@ -0,0 +1,1966 @@ +/*! + * Nodeunit + * https://github.com/caolan/nodeunit + * Copyright (c) 2010 Caolan McMahon + * MIT Licensed + * + * json2.js + * http://www.JSON.org/json2.js + * Public Domain. + * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. + */ +nodeunit = (function(){ +/* + http://www.JSON.org/json2.js + 2010-11-17 + + Public Domain. + + NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. + + See http://www.JSON.org/js.html + + + This code should be minified before deployment. + See http://javascript.crockford.com/jsmin.html + + USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO + NOT CONTROL. + + + This file creates a global JSON object containing two methods: stringify + and parse. + + JSON.stringify(value, replacer, space) + value any JavaScript value, usually an object or array. + + replacer an optional parameter that determines how object + values are stringified for objects. It can be a + function or an array of strings. + + space an optional parameter that specifies the indentation + of nested structures. If it is omitted, the text will + be packed without extra whitespace. If it is a number, + it will specify the number of spaces to indent at each + level. If it is a string (such as '\t' or ' '), + it contains the characters used to indent at each level. + + This method produces a JSON text from a JavaScript value. + + When an object value is found, if the object contains a toJSON + method, its toJSON method will be called and the result will be + stringified. A toJSON method does not serialize: it returns the + value represented by the name/value pair that should be serialized, + or undefined if nothing should be serialized. The toJSON method + will be passed the key associated with the value, and this will be + bound to the value + + For example, this would serialize Dates as ISO strings. + + Date.prototype.toJSON = function (key) { + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + return this.getUTCFullYear() + '-' + + f(this.getUTCMonth() + 1) + '-' + + f(this.getUTCDate()) + 'T' + + f(this.getUTCHours()) + ':' + + f(this.getUTCMinutes()) + ':' + + f(this.getUTCSeconds()) + 'Z'; + }; + + You can provide an optional replacer method. It will be passed the + key and value of each member, with this bound to the containing + object. The value that is returned from your method will be + serialized. If your method returns undefined, then the member will + be excluded from the serialization. + + If the replacer parameter is an array of strings, then it will be + used to select the members to be serialized. It filters the results + such that only members with keys listed in the replacer array are + stringified. + + Values that do not have JSON representations, such as undefined or + functions, will not be serialized. Such values in objects will be + dropped; in arrays they will be replaced with null. You can use + a replacer function to replace those with JSON values. + JSON.stringify(undefined) returns undefined. + + The optional space parameter produces a stringification of the + value that is filled with line breaks and indentation to make it + easier to read. + + If the space parameter is a non-empty string, then that string will + be used for indentation. If the space parameter is a number, then + the indentation will be that many spaces. + + Example: + + text = JSON.stringify(['e', {pluribus: 'unum'}]); + // text is '["e",{"pluribus":"unum"}]' + + + text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); + // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' + + text = JSON.stringify([new Date()], function (key, value) { + return this[key] instanceof Date ? + 'Date(' + this[key] + ')' : value; + }); + // text is '["Date(---current time---)"]' + + + JSON.parse(text, reviver) + This method parses a JSON text to produce an object or array. + It can throw a SyntaxError exception. + + The optional reviver parameter is a function that can filter and + transform the results. It receives each of the keys and values, + and its return value is used instead of the original value. + If it returns what it received, then the structure is not modified. + If it returns undefined then the member is deleted. + + Example: + + // Parse the text. Values that look like ISO date strings will + // be converted to Date objects. + + myData = JSON.parse(text, function (key, value) { + var a; + if (typeof value === 'string') { + a = +/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); + if (a) { + return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], + +a[5], +a[6])); + } + } + return value; + }); + + myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { + var d; + if (typeof value === 'string' && + value.slice(0, 5) === 'Date(' && + value.slice(-1) === ')') { + d = new Date(value.slice(5, -1)); + if (d) { + return d; + } + } + return value; + }); + + + This is a reference implementation. You are free to copy, modify, or + redistribute. +*/ + +/*jslint evil: true, strict: false, regexp: false */ + +/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, + call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, + getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, + lastIndex, length, parse, prototype, push, replace, slice, stringify, + test, toJSON, toString, valueOf +*/ + + +// Create a JSON object only if one does not already exist. We create the +// methods in a closure to avoid creating global variables. + +if (!this.JSON) { + this.JSON = {}; +} + +(function () { + "use strict"; + + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + if (typeof Date.prototype.toJSON !== 'function') { + + Date.prototype.toJSON = function (key) { + + return isFinite(this.valueOf()) ? + this.getUTCFullYear() + '-' + + f(this.getUTCMonth() + 1) + '-' + + f(this.getUTCDate()) + 'T' + + f(this.getUTCHours()) + ':' + + f(this.getUTCMinutes()) + ':' + + f(this.getUTCSeconds()) + 'Z' : null; + }; + + String.prototype.toJSON = + Number.prototype.toJSON = + Boolean.prototype.toJSON = function (key) { + return this.valueOf(); + }; + } + + var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + gap, + indent, + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }, + rep; + + + function quote(string) { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can safely slap some quotes around it. +// Otherwise we must also replace the offending characters with safe escape +// sequences. + + escapable.lastIndex = 0; + return escapable.test(string) ? + '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' ? c : + '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : + '"' + string + '"'; + } + + + function str(key, holder) { + +// Produce a string from holder[key]. + + var i, // The loop counter. + k, // The member key. + v, // The member value. + length, + mind = gap, + partial, + value = holder[key]; + +// If the value has a toJSON method, call it to obtain a replacement value. + + if (value && typeof value === 'object' && + typeof value.toJSON === 'function') { + value = value.toJSON(key); + } + +// If we were called with a replacer function, then call the replacer to +// obtain a replacement value. + + if (typeof rep === 'function') { + value = rep.call(holder, key, value); + } + +// What happens next depends on the value's type. + + switch (typeof value) { + case 'string': + return quote(value); + + case 'number': + +// JSON numbers must be finite. Encode non-finite numbers as null. + + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + +// If the value is a boolean or null, convert it to a string. Note: +// typeof null does not produce 'null'. The case is included here in +// the remote chance that this gets fixed someday. + + return String(value); + +// If the type is 'object', we might be dealing with an object or an array or +// null. + + case 'object': + +// Due to a specification blunder in ECMAScript, typeof null is 'object', +// so watch out for that case. + + if (!value) { + return 'null'; + } + +// Make an array to hold the partial results of stringifying this object value. + + gap += indent; + partial = []; + +// Is the value an array? + + if (Object.prototype.toString.apply(value) === '[object Array]') { + +// The value is an array. Stringify every element. Use null as a placeholder +// for non-JSON values. + + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + +// Join all of the elements together, separated with commas, and wrap them in +// brackets. + + v = partial.length === 0 ? '[]' : + gap ? '[\n' + gap + + partial.join(',\n' + gap) + '\n' + + mind + ']' : + '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + +// If the replacer is an array, use it to select the members to be stringified. + + if (rep && typeof rep === 'object') { + length = rep.length; + for (i = 0; i < length; i += 1) { + k = rep[i]; + if (typeof k === 'string') { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } else { + +// Otherwise, iterate through all of the keys in the object. + + for (k in value) { + if (Object.hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + +// Join all of the member texts together, separated with commas, +// and wrap them in braces. + + v = partial.length === 0 ? '{}' : + gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + + mind + '}' : '{' + partial.join(',') + '}'; + gap = mind; + return v; + } + } + +// If the JSON object does not yet have a stringify method, give it one. + + if (typeof JSON.stringify !== 'function') { + JSON.stringify = function (value, replacer, space) { + +// The stringify method takes a value and an optional replacer, and an optional +// space parameter, and returns a JSON text. The replacer can be a function +// that can replace values, or an array of strings that will select the keys. +// A default replacer method can be provided. Use of the space parameter can +// produce text that is more easily readable. + + var i; + gap = ''; + indent = ''; + +// If the space parameter is a number, make an indent string containing that +// many spaces. + + if (typeof space === 'number') { + for (i = 0; i < space; i += 1) { + indent += ' '; + } + +// If the space parameter is a string, it will be used as the indent string. + + } else if (typeof space === 'string') { + indent = space; + } + +// If there is a replacer, it must be a function or an array. +// Otherwise, throw an error. + + rep = replacer; + if (replacer && typeof replacer !== 'function' && + (typeof replacer !== 'object' || + typeof replacer.length !== 'number')) { + throw new Error('JSON.stringify'); + } + +// Make a fake root object containing our value under the key of ''. +// Return the result of stringifying the value. + + return str('', {'': value}); + }; + } + + +// If the JSON object does not yet have a parse method, give it one. + + if (typeof JSON.parse !== 'function') { + JSON.parse = function (text, reviver) { + +// The parse method takes a text and an optional reviver function, and returns +// a JavaScript value if the text is a valid JSON text. + + var j; + + function walk(holder, key) { + +// The walk method is used to recursively walk the resulting structure so +// that modifications can be made. + + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + } + + +// Parsing happens in four stages. In the first stage, we replace certain +// Unicode characters with escape sequences. JavaScript handles many characters +// incorrectly, either silently deleting them, or treating them as line endings. + + text = String(text); + cx.lastIndex = 0; + if (cx.test(text)) { + text = text.replace(cx, function (a) { + return '\\u' + + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + +// In the second stage, we run the text against regular expressions that look +// for non-JSON patterns. We are especially concerned with '()' and 'new' +// because they can cause invocation, and '=' because it can cause mutation. +// But just to be safe, we want to reject all unexpected forms. + +// We split the second stage into 4 regexp operations in order to work around +// crippling inefficiencies in IE's and Safari's regexp engines. First we +// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we +// replace all simple value tokens with ']' characters. Third, we delete all +// open brackets that follow a colon or comma or that begin the text. Finally, +// we look to see that the remaining characters are only whitespace or ']' or +// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. + + if (/^[\],:{}\s]*$/ +.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') +.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') +.replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + +// In the third stage we use the eval function to compile the text into a +// JavaScript structure. The '{' operator is subject to a syntactic ambiguity +// in JavaScript: it can begin a block or an object literal. We wrap the text +// in parens to eliminate the ambiguity. + + j = eval('(' + text + ')'); + +// In the optional fourth stage, we recursively walk the new structure, passing +// each name/value pair to a reviver function for possible transformation. + + return typeof reviver === 'function' ? + walk({'': j}, '') : j; + } + +// If the text is not JSON parseable, then a SyntaxError is thrown. + + throw new SyntaxError('JSON.parse'); + }; + } +}()); +var assert = this.assert = {}; +var types = {}; +var core = {}; +var nodeunit = {}; +var reporter = {}; +/*global setTimeout: false, console: false */ +(function () { + + var async = {}; + + // global on the server, window in the browser + var root = this, + previous_async = root.async; + + if (typeof module !== 'undefined' && module.exports) { + module.exports = async; + } + else { + root.async = async; + } + + async.noConflict = function () { + root.async = previous_async; + return async; + }; + + //// cross-browser compatiblity functions //// + + var _forEach = function (arr, iterator) { + if (arr.forEach) { + return arr.forEach(iterator); + } + for (var i = 0; i < arr.length; i += 1) { + iterator(arr[i], i, arr); + } + }; + + var _map = function (arr, iterator) { + if (arr.map) { + return arr.map(iterator); + } + var results = []; + _forEach(arr, function (x, i, a) { + results.push(iterator(x, i, a)); + }); + return results; + }; + + var _reduce = function (arr, iterator, memo) { + if (arr.reduce) { + return arr.reduce(iterator, memo); + } + _forEach(arr, function (x, i, a) { + memo = iterator(memo, x, i, a); + }); + return memo; + }; + + var _keys = function (obj) { + if (Object.keys) { + return Object.keys(obj); + } + var keys = []; + for (var k in obj) { + if (obj.hasOwnProperty(k)) { + keys.push(k); + } + } + return keys; + }; + + var _indexOf = function (arr, item) { + if (arr.indexOf) { + return arr.indexOf(item); + } + for (var i = 0; i < arr.length; i += 1) { + if (arr[i] === item) { + return i; + } + } + return -1; + }; + + //// exported async module functions //// + + //// nextTick implementation with browser-compatible fallback //// + async.nextTick = function (fn) { + if (typeof process === 'undefined' || !(process.nextTick)) { + setTimeout(fn, 0); + } + else { + process.nextTick(fn); + } + }; + + async.forEach = function (arr, iterator, callback) { + if (!arr.length) { + return callback(); + } + var completed = 0; + _forEach(arr, function (x) { + iterator(x, function (err) { + if (err) { + callback(err); + callback = function () {}; + } + else { + completed += 1; + if (completed === arr.length) { + callback(); + } + } + }); + }); + }; + + async.forEachSeries = function (arr, iterator, callback) { + if (!arr.length) { + return callback(); + } + var completed = 0; + var iterate = function () { + iterator(arr[completed], function (err) { + if (err) { + callback(err); + callback = function () {}; + } + else { + completed += 1; + if (completed === arr.length) { + callback(); + } + else { + iterate(); + } + } + }); + }; + iterate(); + }; + + + var doParallel = function (fn) { + return function () { + var args = Array.prototype.slice.call(arguments); + return fn.apply(null, [async.forEach].concat(args)); + }; + }; + var doSeries = function (fn) { + return function () { + var args = Array.prototype.slice.call(arguments); + return fn.apply(null, [async.forEachSeries].concat(args)); + }; + }; + + + var _asyncMap = function (eachfn, arr, iterator, callback) { + var results = []; + arr = _map(arr, function (x, i) { + return {index: i, value: x}; + }); + eachfn(arr, function (x, callback) { + iterator(x.value, function (err, v) { + results[x.index] = v; + callback(err); + }); + }, function (err) { + callback(err, results); + }); + }; + async.map = doParallel(_asyncMap); + async.mapSeries = doSeries(_asyncMap); + + + // reduce only has a series version, as doing reduce in parallel won't + // work in many situations. + async.reduce = function (arr, memo, iterator, callback) { + async.forEachSeries(arr, function (x, callback) { + iterator(memo, x, function (err, v) { + memo = v; + callback(err); + }); + }, function (err) { + callback(err, memo); + }); + }; + // inject alias + async.inject = async.reduce; + // foldl alias + async.foldl = async.reduce; + + async.reduceRight = function (arr, memo, iterator, callback) { + var reversed = _map(arr, function (x) { + return x; + }).reverse(); + async.reduce(reversed, memo, iterator, callback); + }; + // foldr alias + async.foldr = async.reduceRight; + + var _filter = function (eachfn, arr, iterator, callback) { + var results = []; + arr = _map(arr, function (x, i) { + return {index: i, value: x}; + }); + eachfn(arr, function (x, callback) { + iterator(x.value, function (v) { + if (v) { + results.push(x); + } + callback(); + }); + }, function (err) { + callback(_map(results.sort(function (a, b) { + return a.index - b.index; + }), function (x) { + return x.value; + })); + }); + }; + async.filter = doParallel(_filter); + async.filterSeries = doSeries(_filter); + // select alias + async.select = async.filter; + async.selectSeries = async.filterSeries; + + var _reject = function (eachfn, arr, iterator, callback) { + var results = []; + arr = _map(arr, function (x, i) { + return {index: i, value: x}; + }); + eachfn(arr, function (x, callback) { + iterator(x.value, function (v) { + if (!v) { + results.push(x); + } + callback(); + }); + }, function (err) { + callback(_map(results.sort(function (a, b) { + return a.index - b.index; + }), function (x) { + return x.value; + })); + }); + }; + async.reject = doParallel(_reject); + async.rejectSeries = doSeries(_reject); + + var _detect = function (eachfn, arr, iterator, main_callback) { + eachfn(arr, function (x, callback) { + iterator(x, function (result) { + if (result) { + main_callback(x); + } + else { + callback(); + } + }); + }, function (err) { + main_callback(); + }); + }; + async.detect = doParallel(_detect); + async.detectSeries = doSeries(_detect); + + async.some = function (arr, iterator, main_callback) { + async.forEach(arr, function (x, callback) { + iterator(x, function (v) { + if (v) { + main_callback(true); + main_callback = function () {}; + } + callback(); + }); + }, function (err) { + main_callback(false); + }); + }; + // any alias + async.any = async.some; + + async.every = function (arr, iterator, main_callback) { + async.forEach(arr, function (x, callback) { + iterator(x, function (v) { + if (!v) { + main_callback(false); + main_callback = function () {}; + } + callback(); + }); + }, function (err) { + main_callback(true); + }); + }; + // all alias + async.all = async.every; + + async.sortBy = function (arr, iterator, callback) { + async.map(arr, function (x, callback) { + iterator(x, function (err, criteria) { + if (err) { + callback(err); + } + else { + callback(null, {value: x, criteria: criteria}); + } + }); + }, function (err, results) { + if (err) { + return callback(err); + } + else { + var fn = function (left, right) { + var a = left.criteria, b = right.criteria; + return a < b ? -1 : a > b ? 1 : 0; + }; + callback(null, _map(results.sort(fn), function (x) { + return x.value; + })); + } + }); + }; + + async.auto = function (tasks, callback) { + callback = callback || function () {}; + var keys = _keys(tasks); + if (!keys.length) { + return callback(null); + } + + var completed = []; + + var listeners = []; + var addListener = function (fn) { + listeners.unshift(fn); + }; + var removeListener = function (fn) { + for (var i = 0; i < listeners.length; i += 1) { + if (listeners[i] === fn) { + listeners.splice(i, 1); + return; + } + } + }; + var taskComplete = function () { + _forEach(listeners, function (fn) { + fn(); + }); + }; + + addListener(function () { + if (completed.length === keys.length) { + callback(null); + } + }); + + _forEach(keys, function (k) { + var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k]; + var taskCallback = function (err) { + if (err) { + callback(err); + // stop subsequent errors hitting callback multiple times + callback = function () {}; + } + else { + completed.push(k); + taskComplete(); + } + }; + var requires = task.slice(0, Math.abs(task.length - 1)) || []; + var ready = function () { + return _reduce(requires, function (a, x) { + return (a && _indexOf(completed, x) !== -1); + }, true); + }; + if (ready()) { + task[task.length - 1](taskCallback); + } + else { + var listener = function () { + if (ready()) { + removeListener(listener); + task[task.length - 1](taskCallback); + } + }; + addListener(listener); + } + }); + }; + + async.waterfall = function (tasks, callback) { + if (!tasks.length) { + return callback(); + } + callback = callback || function () {}; + var wrapIterator = function (iterator) { + return function (err) { + if (err) { + callback(err); + callback = function () {}; + } + else { + var args = Array.prototype.slice.call(arguments, 1); + var next = iterator.next(); + if (next) { + args.push(wrapIterator(next)); + } + else { + args.push(callback); + } + async.nextTick(function () { + iterator.apply(null, args); + }); + } + }; + }; + wrapIterator(async.iterator(tasks))(); + }; + + async.parallel = function (tasks, callback) { + callback = callback || function () {}; + if (tasks.constructor === Array) { + async.map(tasks, function (fn, callback) { + if (fn) { + fn(function (err) { + var args = Array.prototype.slice.call(arguments, 1); + if (args.length <= 1) { + args = args[0]; + } + callback.call(null, err, args || null); + }); + } + }, callback); + } + else { + var results = {}; + async.forEach(_keys(tasks), function (k, callback) { + tasks[k](function (err) { + var args = Array.prototype.slice.call(arguments, 1); + if (args.length <= 1) { + args = args[0]; + } + results[k] = args; + callback(err); + }); + }, function (err) { + callback(err, results); + }); + } + }; + + async.series = function (tasks, callback) { + callback = callback || function () {}; + if (tasks.constructor === Array) { + async.mapSeries(tasks, function (fn, callback) { + if (fn) { + fn(function (err) { + var args = Array.prototype.slice.call(arguments, 1); + if (args.length <= 1) { + args = args[0]; + } + callback.call(null, err, args || null); + }); + } + }, callback); + } + else { + var results = {}; + async.forEachSeries(_keys(tasks), function (k, callback) { + tasks[k](function (err) { + var args = Array.prototype.slice.call(arguments, 1); + if (args.length <= 1) { + args = args[0]; + } + results[k] = args; + callback(err); + }); + }, function (err) { + callback(err, results); + }); + } + }; + + async.iterator = function (tasks) { + var makeCallback = function (index) { + var fn = function () { + if (tasks.length) { + tasks[index].apply(null, arguments); + } + return fn.next(); + }; + fn.next = function () { + return (index < tasks.length - 1) ? makeCallback(index + 1): null; + }; + return fn; + }; + return makeCallback(0); + }; + + async.apply = function (fn) { + var args = Array.prototype.slice.call(arguments, 1); + return function () { + return fn.apply( + null, args.concat(Array.prototype.slice.call(arguments)) + ); + }; + }; + + var _concat = function (eachfn, arr, fn, callback) { + var r = []; + eachfn(arr, function (x, cb) { + fn(x, function (err, y) { + r = r.concat(y || []); + cb(err); + }); + }, function (err) { + callback(err, r); + }); + }; + async.concat = doParallel(_concat); + async.concatSeries = doSeries(_concat); + + async.whilst = function (test, iterator, callback) { + if (test()) { + iterator(function (err) { + if (err) { + return callback(err); + } + async.whilst(test, iterator, callback); + }); + } + else { + callback(); + } + }; + + async.until = function (test, iterator, callback) { + if (!test()) { + iterator(function (err) { + if (err) { + return callback(err); + } + async.until(test, iterator, callback); + }); + } + else { + callback(); + } + }; + + async.queue = function (worker, concurrency) { + var workers = 0; + var tasks = []; + var q = { + concurrency: concurrency, + push: function (data, callback) { + tasks.push({data: data, callback: callback}); + async.nextTick(q.process); + }, + process: function () { + if (workers < q.concurrency && tasks.length) { + var task = tasks.splice(0, 1)[0]; + workers += 1; + worker(task.data, function () { + workers -= 1; + if (task.callback) { + task.callback.apply(task, arguments); + } + q.process(); + }); + } + }, + length: function () { + return tasks.length; + } + }; + return q; + }; + + var _console_fn = function (name) { + return function (fn) { + var args = Array.prototype.slice.call(arguments, 1); + fn.apply(null, args.concat([function (err) { + var args = Array.prototype.slice.call(arguments, 1); + if (typeof console !== 'undefined') { + if (err) { + if (console.error) { + console.error(err); + } + } + else if (console[name]) { + _forEach(args, function (x) { + console[name](x); + }); + } + } + }])); + }; + }; + async.log = _console_fn('log'); + async.dir = _console_fn('dir'); + /*async.info = _console_fn('info'); + async.warn = _console_fn('warn'); + async.error = _console_fn('error');*/ + +}()); +(function(exports){ +/** + * This file is based on the node.js assert module, but with some small + * changes for browser-compatibility + * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! + */ + + +/** + * Added for browser compatibility + */ + +var _keys = function(obj){ + if(Object.keys) return Object.keys(obj); + var keys = []; + for(var k in obj){ + if(obj.hasOwnProperty(k)) keys.push(k); + } + return keys; +}; + + + +// http://wiki.commonjs.org/wiki/Unit_Testing/1.0 +// +// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! +// +// Originally from narwhal.js (http://narwhaljs.org) +// Copyright (c) 2009 Thomas Robinson <280north.com> +// +// 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 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. + + +var pSlice = Array.prototype.slice; + +// 1. The assert module provides functions that throw +// AssertionError's when particular conditions are not met. The +// assert module must conform to the following interface. + +var assert = exports; + +// 2. The AssertionError is defined in assert. +// new assert.AssertionError({message: message, actual: actual, expected: expected}) + +assert.AssertionError = function AssertionError (options) { + this.name = "AssertionError"; + this.message = options.message; + this.actual = options.actual; + this.expected = options.expected; + this.operator = options.operator; + var stackStartFunction = options.stackStartFunction || fail; + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, stackStartFunction); + } +}; +// code from util.inherits in node +assert.AssertionError.super_ = Error; + + +// EDITED FOR BROWSER COMPATIBILITY: replaced Object.create call +// TODO: test what effect this may have +var ctor = function () { this.constructor = assert.AssertionError; }; +ctor.prototype = Error.prototype; +assert.AssertionError.prototype = new ctor(); + + +assert.AssertionError.prototype.toString = function() { + if (this.message) { + return [this.name+":", this.message].join(' '); + } else { + return [ this.name+":" + , JSON.stringify(this.expected ) + , this.operator + , JSON.stringify(this.actual) + ].join(" "); + } +}; + +// assert.AssertionError instanceof Error + +assert.AssertionError.__proto__ = Error.prototype; + +// At present only the three keys mentioned above are used and +// understood by the spec. Implementations or sub modules can pass +// other keys to the AssertionError's constructor - they will be +// ignored. + +// 3. All of the following functions must throw an AssertionError +// when a corresponding condition is not met, with a message that +// may be undefined if not provided. All assertion methods provide +// both the actual and expected values to the assertion error for +// display purposes. + +function fail(actual, expected, message, operator, stackStartFunction) { + throw new assert.AssertionError({ + message: message, + actual: actual, + expected: expected, + operator: operator, + stackStartFunction: stackStartFunction + }); +} + +// EXTENSION! allows for well behaved errors defined elsewhere. +assert.fail = fail; + +// 4. Pure assertion tests whether a value is truthy, as determined +// by !!guard. +// assert.ok(guard, message_opt); +// This statement is equivalent to assert.equal(true, guard, +// message_opt);. To test strictly for the value true, use +// assert.strictEqual(true, guard, message_opt);. + +assert.ok = function ok(value, message) { + if (!!!value) fail(value, true, message, "==", assert.ok); +}; + +// 5. The equality assertion tests shallow, coercive equality with +// ==. +// assert.equal(actual, expected, message_opt); + +assert.equal = function equal(actual, expected, message) { + if (actual != expected) fail(actual, expected, message, "==", assert.equal); +}; + +// 6. The non-equality assertion tests for whether two objects are not equal +// with != assert.notEqual(actual, expected, message_opt); + +assert.notEqual = function notEqual(actual, expected, message) { + if (actual == expected) { + fail(actual, expected, message, "!=", assert.notEqual); + } +}; + +// 7. The equivalence assertion tests a deep equality relation. +// assert.deepEqual(actual, expected, message_opt); + +assert.deepEqual = function deepEqual(actual, expected, message) { + if (!_deepEqual(actual, expected)) { + fail(actual, expected, message, "deepEqual", assert.deepEqual); + } +}; + +function _deepEqual(actual, expected) { + // 7.1. All identical values are equivalent, as determined by ===. + if (actual === expected) { + return true; + // 7.2. If the expected value is a Date object, the actual value is + // equivalent if it is also a Date object that refers to the same time. + } else if (actual instanceof Date && expected instanceof Date) { + return actual.getTime() === expected.getTime(); + + // 7.3. Other pairs that do not both pass typeof value == "object", + // equivalence is determined by ==. + } else if (typeof actual != 'object' && typeof expected != 'object') { + return actual == expected; + + // 7.4. For all other Object pairs, including Array objects, equivalence is + // determined by having the same number of owned properties (as verified + // with Object.prototype.hasOwnProperty.call), the same set of keys + // (although not necessarily the same order), equivalent values for every + // corresponding key, and an identical "prototype" property. Note: this + // accounts for both named and indexed properties on Arrays. + } else { + return objEquiv(actual, expected); + } +} + +function isUndefinedOrNull (value) { + return value === null || value === undefined; +} + +function isArguments (object) { + return Object.prototype.toString.call(object) == '[object Arguments]'; +} + +function objEquiv (a, b) { + if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) + return false; + // an identical "prototype" property. + if (a.prototype !== b.prototype) return false; + //~~~I've managed to break Object.keys through screwy arguments passing. + // Converting to array solves the problem. + if (isArguments(a)) { + if (!isArguments(b)) { + return false; + } + a = pSlice.call(a); + b = pSlice.call(b); + return _deepEqual(a, b); + } + try{ + var ka = _keys(a), + kb = _keys(b), + key, i; + } catch (e) {//happens when one is a string literal and the other isn't + return false; + } + // having the same number of owned properties (keys incorporates hasOwnProperty) + if (ka.length != kb.length) + return false; + //the same set of keys (although not necessarily the same order), + ka.sort(); + kb.sort(); + //~~~cheap key test + for (i = ka.length - 1; i >= 0; i--) { + if (ka[i] != kb[i]) + return false; + } + //equivalent values for every corresponding key, and + //~~~possibly expensive deep test + for (i = ka.length - 1; i >= 0; i--) { + key = ka[i]; + if (!_deepEqual(a[key], b[key] )) + return false; + } + return true; +} + +// 8. The non-equivalence assertion tests for any deep inequality. +// assert.notDeepEqual(actual, expected, message_opt); + +assert.notDeepEqual = function notDeepEqual(actual, expected, message) { + if (_deepEqual(actual, expected)) { + fail(actual, expected, message, "notDeepEqual", assert.notDeepEqual); + } +}; + +// 9. The strict equality assertion tests strict equality, as determined by ===. +// assert.strictEqual(actual, expected, message_opt); + +assert.strictEqual = function strictEqual(actual, expected, message) { + if (actual !== expected) { + fail(actual, expected, message, "===", assert.strictEqual); + } +}; + +// 10. The strict non-equality assertion tests for strict inequality, as determined by !==. +// assert.notStrictEqual(actual, expected, message_opt); + +assert.notStrictEqual = function notStrictEqual(actual, expected, message) { + if (actual === expected) { + fail(actual, expected, message, "!==", assert.notStrictEqual); + } +}; + +function _throws (shouldThrow, block, err, message) { + var exception = null, + threw = false, + typematters = true; + + message = message || ""; + + //handle optional arguments + if (arguments.length == 3) { + if (typeof(err) == "string") { + message = err; + typematters = false; + } + } else if (arguments.length == 2) { + typematters = false; + } + + try { + block(); + } catch (e) { + threw = true; + exception = e; + } + + if (shouldThrow && !threw) { + fail( "Missing expected exception" + + (err && err.name ? " ("+err.name+")." : '.') + + (message ? " " + message : "") + ); + } + if (!shouldThrow && threw && typematters && exception instanceof err) { + fail( "Got unwanted exception" + + (err && err.name ? " ("+err.name+")." : '.') + + (message ? " " + message : "") + ); + } + if ((shouldThrow && threw && typematters && !(exception instanceof err)) || + (!shouldThrow && threw)) { + throw exception; + } +}; + +// 11. Expected to throw an error: +// assert.throws(block, Error_opt, message_opt); + +assert.throws = function(block, /*optional*/error, /*optional*/message) { + _throws.apply(this, [true].concat(pSlice.call(arguments))); +}; + +// EXTENSION! This is annoying to write outside this module. +assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) { + _throws.apply(this, [false].concat(pSlice.call(arguments))); +}; + +assert.ifError = function (err) { if (err) {throw err;}}; +})(assert); +(function(exports){ +/*! + * Nodeunit + * Copyright (c) 2010 Caolan McMahon + * MIT Licensed + * + * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! + * Only code on that line will be removed, its mostly to avoid requiring code + * that is node specific + */ + +/** + * Module dependencies + */ + + + +/** + * Creates assertion objects representing the result of an assert call. + * Accepts an object or AssertionError as its argument. + * + * @param {object} obj + * @api public + */ + +exports.assertion = function (obj) { + return { + method: obj.method || '', + message: obj.message || (obj.error && obj.error.message) || '', + error: obj.error, + passed: function () { + return !this.error; + }, + failed: function () { + return Boolean(this.error); + } + }; +}; + +/** + * Creates an assertion list object representing a group of assertions. + * Accepts an array of assertion objects. + * + * @param {Array} arr + * @param {Number} duration + * @api public + */ + +exports.assertionList = function (arr, duration) { + var that = arr || []; + that.failures = function () { + var failures = 0; + for (var i=0; i(' + + '' + assertions.failures() + ', ' + + '' + assertions.passes() + ', ' + + assertions.length + + ')'; + test.className = assertions.failures() ? 'fail': 'pass'; + test.appendChild(strong); + + var aList = document.createElement('ol'); + aList.style.display = 'none'; + test.onclick = function () { + var d = aList.style.display; + aList.style.display = (d == 'none') ? 'block': 'none'; + }; + for (var i=0; i' + (a.error.stack || a.error) + ''; + li.className = 'fail'; + } + else { + li.innerHTML = a.message || a.method || 'no message'; + li.className = 'pass'; + } + aList.appendChild(li); + } + test.appendChild(aList); + tests.appendChild(test); + }, + done: function (assertions) { + var end = new Date().getTime(); + var duration = end - start; + + var failures = assertions.failures(); + banner.className = failures ? 'fail': 'pass'; + + result.innerHTML = 'Tests completed in ' + duration + + ' milliseconds.
      ' + + assertions.passes() + ' assertions of ' + + '' + assertions.length + ' passed, ' + + assertions.failures() + ' failed.'; + } + }); +}; +})(reporter); +nodeunit = core; +nodeunit.assert = assert; +nodeunit.reporter = reporter; +nodeunit.run = reporter.run; +return nodeunit; })(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/dist/async.min.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/dist/async.min.js new file mode 100644 index 0000000..f89741e --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/dist/async.min.js @@ -0,0 +1 @@ +/*global setTimeout: false, console: false */(function(){var a={};var b=this,c=b.async;typeof module!=="undefined"&&module.exports?module.exports=a:b.async=a,a.noConflict=function(){b.async=c;return a};var d=function(a,b){if(a.forEach)return a.forEach(b);for(var c=0;cd?1:0};d(null,e(b.sort(c),function(a){return a.value}))})},a.auto=function(a,b){b=b||function(){};var c=g(a);if(!c.length)return b(null);var e=[];var i=[];var j=function(a){i.unshift(a)};var k=function(a){for(var b=0;b b ? 1 : 0; + }; + callback(null, _map(results.sort(fn), function (x) { + return x.value; + })); + } + }); + }; + + async.auto = function (tasks, callback) { + callback = callback || function () {}; + var keys = _keys(tasks); + if (!keys.length) { + return callback(null); + } + + var completed = []; + + var listeners = []; + var addListener = function (fn) { + listeners.unshift(fn); + }; + var removeListener = function (fn) { + for (var i = 0; i < listeners.length; i += 1) { + if (listeners[i] === fn) { + listeners.splice(i, 1); + return; + } + } + }; + var taskComplete = function () { + _forEach(listeners, function (fn) { + fn(); + }); + }; + + addListener(function () { + if (completed.length === keys.length) { + callback(null); + } + }); + + _forEach(keys, function (k) { + var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k]; + var taskCallback = function (err) { + if (err) { + callback(err); + // stop subsequent errors hitting callback multiple times + callback = function () {}; + } + else { + completed.push(k); + taskComplete(); + } + }; + var requires = task.slice(0, Math.abs(task.length - 1)) || []; + var ready = function () { + return _reduce(requires, function (a, x) { + return (a && _indexOf(completed, x) !== -1); + }, true); + }; + if (ready()) { + task[task.length - 1](taskCallback); + } + else { + var listener = function () { + if (ready()) { + removeListener(listener); + task[task.length - 1](taskCallback); + } + }; + addListener(listener); + } + }); + }; + + async.waterfall = function (tasks, callback) { + if (!tasks.length) { + return callback(); + } + callback = callback || function () {}; + var wrapIterator = function (iterator) { + return function (err) { + if (err) { + callback(err); + callback = function () {}; + } + else { + var args = Array.prototype.slice.call(arguments, 1); + var next = iterator.next(); + if (next) { + args.push(wrapIterator(next)); + } + else { + args.push(callback); + } + async.nextTick(function () { + iterator.apply(null, args); + }); + } + }; + }; + wrapIterator(async.iterator(tasks))(); + }; + + async.parallel = function (tasks, callback) { + callback = callback || function () {}; + if (tasks.constructor === Array) { + async.map(tasks, function (fn, callback) { + if (fn) { + fn(function (err) { + var args = Array.prototype.slice.call(arguments, 1); + if (args.length <= 1) { + args = args[0]; + } + callback.call(null, err, args); + }); + } + }, callback); + } + else { + var results = {}; + async.forEach(_keys(tasks), function (k, callback) { + tasks[k](function (err) { + var args = Array.prototype.slice.call(arguments, 1); + if (args.length <= 1) { + args = args[0]; + } + results[k] = args; + callback(err); + }); + }, function (err) { + callback(err, results); + }); + } + }; + + async.series = function (tasks, callback) { + callback = callback || function () {}; + if (tasks.constructor === Array) { + async.mapSeries(tasks, function (fn, callback) { + if (fn) { + fn(function (err) { + var args = Array.prototype.slice.call(arguments, 1); + if (args.length <= 1) { + args = args[0]; + } + callback.call(null, err, args); + }); + } + }, callback); + } + else { + var results = {}; + async.forEachSeries(_keys(tasks), function (k, callback) { + tasks[k](function (err) { + var args = Array.prototype.slice.call(arguments, 1); + if (args.length <= 1) { + args = args[0]; + } + results[k] = args; + callback(err); + }); + }, function (err) { + callback(err, results); + }); + } + }; + + async.iterator = function (tasks) { + var makeCallback = function (index) { + var fn = function () { + if (tasks.length) { + tasks[index].apply(null, arguments); + } + return fn.next(); + }; + fn.next = function () { + return (index < tasks.length - 1) ? makeCallback(index + 1): null; + }; + return fn; + }; + return makeCallback(0); + }; + + async.apply = function (fn) { + var args = Array.prototype.slice.call(arguments, 1); + return function () { + return fn.apply( + null, args.concat(Array.prototype.slice.call(arguments)) + ); + }; + }; + + var _concat = function (eachfn, arr, fn, callback) { + var r = []; + eachfn(arr, function (x, cb) { + fn(x, function (err, y) { + r = r.concat(y || []); + cb(err); + }); + }, function (err) { + callback(err, r); + }); + }; + async.concat = doParallel(_concat); + async.concatSeries = doSeries(_concat); + + async.whilst = function (test, iterator, callback) { + if (test()) { + iterator(function (err) { + if (err) { + return callback(err); + } + async.whilst(test, iterator, callback); + }); + } + else { + callback(); + } + }; + + async.until = function (test, iterator, callback) { + if (!test()) { + iterator(function (err) { + if (err) { + return callback(err); + } + async.until(test, iterator, callback); + }); + } + else { + callback(); + } + }; + + async.queue = function (worker, concurrency) { + var workers = 0; + var tasks = []; + var q = { + concurrency: concurrency, + saturated: null, + empty: null, + drain: null, + push: function (data, callback) { + tasks.push({data: data, callback: callback}); + if(q.saturated && tasks.length == concurrency) q.saturated(); + async.nextTick(q.process); + }, + process: function () { + if (workers < q.concurrency && tasks.length) { + var task = tasks.splice(0, 1)[0]; + if(q.empty && tasks.length == 0) q.empty(); + workers += 1; + worker(task.data, function () { + workers -= 1; + if (task.callback) { + task.callback.apply(task, arguments); + } + if(q.drain && tasks.length + workers == 0) q.drain(); + q.process(); + }); + } + }, + length: function () { + return tasks.length; + }, + running: function () { + return workers; + } + }; + return q; + }; + + var _console_fn = function (name) { + return function (fn) { + var args = Array.prototype.slice.call(arguments, 1); + fn.apply(null, args.concat([function (err) { + var args = Array.prototype.slice.call(arguments, 1); + if (typeof console !== 'undefined') { + if (err) { + if (console.error) { + console.error(err); + } + } + else if (console[name]) { + _forEach(args, function (x) { + console[name](x); + }); + } + } + }])); + }; + }; + async.log = _console_fn('log'); + async.dir = _console_fn('dir'); + /*async.info = _console_fn('info'); + async.warn = _console_fn('warn'); + async.error = _console_fn('error');*/ + + async.memoize = function (fn, hasher) { + var memo = {}; + hasher = hasher || function (x) { + return x; + }; + return function () { + var args = Array.prototype.slice.call(arguments); + var callback = args.pop(); + var key = hasher.apply(null, args); + if (key in memo) { + callback.apply(null, memo[key]); + } + else { + fn.apply(null, args.concat([function () { + memo[key] = arguments; + callback.apply(null, arguments); + }])); + } + }; + }; + +}()); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/nodelint.cfg b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/nodelint.cfg new file mode 100644 index 0000000..457a967 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/nodelint.cfg @@ -0,0 +1,4 @@ +var options = { + indent: 4, + onevar: false +}; diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/package.json b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/package.json new file mode 100644 index 0000000..e5646d7 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/package.json @@ -0,0 +1,41 @@ +{ + "name": "async", + "description": "Higher-order functions and common patterns for asynchronous code", + "main": "./index", + "author": { + "name": "Caolan McMahon" + }, + "version": "0.1.9", + "repository": { + "type": "git", + "url": "git://github.com/caolan/async.git" + }, + "bugs": { + "url": "http://github.com/caolan/async/issues" + }, + "licenses": [ + { + "type": "MIT", + "url": "http://github.com/caolan/async/raw/master/LICENSE" + } + ], + "_npmUser": { + "name": "mikeal", + "email": "mikeal.rogers@gmail.com" + }, + "_id": "async@0.1.9", + "dependencies": {}, + "devDependencies": {}, + "optionalDependencies": {}, + "engines": { + "node": "*" + }, + "_engineSupported": true, + "_npmVersion": "1.1.24", + "_nodeVersion": "v0.8.1", + "_defaultsLoaded": true, + "dist": { + "shasum": "fd9b6aca66495fd0f7e97f86e71c7706ca9ae754" + }, + "_from": "async@0.1.9" +} diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/.swp b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/.swp new file mode 100644 index 0000000000000000000000000000000000000000..ece9b6bb6a4f01d31a8613468ccc9244e256ea4d GIT binary patch literal 12288 zcmeI2y>1gh5XU!k2=O6!fx#G*1bfd;q(nN!t|DZl1PM@R*c9ixB|hhTd)%IJ+yq_& z3R-G9L;(dAk3r27P#`h8Hj0FhDR2|%Kho^%?9R;1{jOTw_FGTx@6)#25G>b(c>C(Z z{-Njzc}a*kGFg`WCKRNaX>-TxySGFHn-?2hK00ck)1V8`;KmY_l00ck)1pbRatF`szv%4rQ2h}JO z&i%`hkMQef!&#D>HT{)qIkZB`K-8$SMB#Eo565YIOg)_yA?@62cf$csiJIY&p>aV; zS`zJsiOzJTi5`We&Z7~}Y-mkcHTzSdlTe@N*jMYNNtz#pT-S?SSJF;oz2PRsbQbfN z^T_JwW1Yu3q^Bx4tT)t7Y)Y+euPUh$byuyaj_Nj)9PpNm{ZJJ3#yWe(d8R*fCe5FD z*G_m-$$oUq=Ctm6anI2SxelGUw*7iAFe4o-xY}N$2f8XJw40WE>)n)7+DmQ4?=>s* V?{PKv`7hd=TWkEtC4RDw_ysbD&=&vz literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/test-async.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/test-async.js new file mode 100644 index 0000000..8c2cebd --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/test-async.js @@ -0,0 +1,1367 @@ +var async = require('../lib/async'); + + +exports['auto'] = function(test){ + var callOrder = []; + var testdata = [{test: 'test'}]; + async.auto({ + task1: ['task2', function(callback){ + setTimeout(function(){ + callOrder.push('task1'); + callback(); + }, 25); + }], + task2: function(callback){ + setTimeout(function(){ + callOrder.push('task2'); + callback(); + }, 50); + }, + task3: ['task2', function(callback){ + callOrder.push('task3'); + callback(); + }], + task4: ['task1', 'task2', function(callback){ + callOrder.push('task4'); + callback(); + }] + }, + function(err){ + test.same(callOrder, ['task2','task3','task1','task4']); + test.done(); + }); +}; + +exports['auto empty object'] = function(test){ + async.auto({}, function(err){ + test.done(); + }); +}; + +exports['auto error'] = function(test){ + test.expect(1); + async.auto({ + task1: function(callback){ + callback('testerror'); + }, + task2: ['task1', function(callback){ + test.ok(false, 'task2 should not be called'); + callback(); + }], + task3: function(callback){ + callback('testerror2'); + } + }, + function(err){ + test.equals(err, 'testerror'); + }); + setTimeout(test.done, 100); +}; + +exports['auto no callback'] = function(test){ + async.auto({ + task1: function(callback){callback();}, + task2: ['task1', function(callback){callback(); test.done();}] + }); +}; + +exports['waterfall'] = function(test){ + test.expect(6); + var call_order = []; + async.waterfall([ + function(callback){ + call_order.push('fn1'); + setTimeout(function(){callback(null, 'one', 'two');}, 0); + }, + function(arg1, arg2, callback){ + call_order.push('fn2'); + test.equals(arg1, 'one'); + test.equals(arg2, 'two'); + setTimeout(function(){callback(null, arg1, arg2, 'three');}, 25); + }, + function(arg1, arg2, arg3, callback){ + call_order.push('fn3'); + test.equals(arg1, 'one'); + test.equals(arg2, 'two'); + test.equals(arg3, 'three'); + callback(null, 'four'); + }, + function(arg4, callback){ + call_order.push('fn4'); + test.same(call_order, ['fn1','fn2','fn3','fn4']); + callback(null, 'test'); + } + ], function(err){ + test.done(); + }); +}; + +exports['waterfall empty array'] = function(test){ + async.waterfall([], function(err){ + test.done(); + }); +}; + +exports['waterfall no callback'] = function(test){ + async.waterfall([ + function(callback){callback();}, + function(callback){callback(); test.done();} + ]); +}; + +exports['waterfall async'] = function(test){ + var call_order = []; + async.waterfall([ + function(callback){ + call_order.push(1); + callback(); + call_order.push(2); + }, + function(callback){ + call_order.push(3); + callback(); + }, + function(){ + test.same(call_order, [1,2,3]); + test.done(); + } + ]); +}; + +exports['waterfall error'] = function(test){ + test.expect(1); + async.waterfall([ + function(callback){ + callback('error'); + }, + function(callback){ + test.ok(false, 'next function should not be called'); + callback(); + } + ], function(err){ + test.equals(err, 'error'); + }); + setTimeout(test.done, 50); +}; + +exports['waterfall multiple callback calls'] = function(test){ + var call_order = []; + var arr = [ + function(callback){ + call_order.push(1); + // call the callback twice. this should call function 2 twice + callback(null, 'one', 'two'); + callback(null, 'one', 'two'); + }, + function(arg1, arg2, callback){ + call_order.push(2); + callback(null, arg1, arg2, 'three'); + }, + function(arg1, arg2, arg3, callback){ + call_order.push(3); + callback(null, 'four'); + }, + function(arg4){ + call_order.push(4); + arr[3] = function(){ + call_order.push(4); + test.same(call_order, [1,2,2,3,3,4,4]); + test.done(); + }; + } + ]; + async.waterfall(arr); +}; + + +exports['parallel'] = function(test){ + var call_order = []; + async.parallel([ + function(callback){ + setTimeout(function(){ + call_order.push(1); + callback(null, 1); + }, 25); + }, + function(callback){ + setTimeout(function(){ + call_order.push(2); + callback(null, 2); + }, 50); + }, + function(callback){ + setTimeout(function(){ + call_order.push(3); + callback(null, 3,3); + }, 15); + } + ], + function(err, results){ + test.equals(err, null); + test.same(call_order, [3,1,2]); + test.same(results, [1,2,[3,3]]); + test.done(); + }); +}; + +exports['parallel empty array'] = function(test){ + async.parallel([], function(err, results){ + test.equals(err, null); + test.same(results, []); + test.done(); + }); +}; + +exports['parallel error'] = function(test){ + async.parallel([ + function(callback){ + callback('error', 1); + }, + function(callback){ + callback('error2', 2); + } + ], + function(err, results){ + test.equals(err, 'error'); + }); + setTimeout(test.done, 100); +}; + +exports['parallel no callback'] = function(test){ + async.parallel([ + function(callback){callback();}, + function(callback){callback(); test.done();}, + ]); +}; + +exports['parallel object'] = function(test){ + var call_order = []; + async.parallel({ + one: function(callback){ + setTimeout(function(){ + call_order.push(1); + callback(null, 1); + }, 25); + }, + two: function(callback){ + setTimeout(function(){ + call_order.push(2); + callback(null, 2); + }, 50); + }, + three: function(callback){ + setTimeout(function(){ + call_order.push(3); + callback(null, 3,3); + }, 15); + } + }, + function(err, results){ + test.equals(err, null); + test.same(call_order, [3,1,2]); + test.same(results, { + one: 1, + two: 2, + three: [3,3] + }); + test.done(); + }); +}; + +exports['series'] = function(test){ + var call_order = []; + async.series([ + function(callback){ + setTimeout(function(){ + call_order.push(1); + callback(null, 1); + }, 25); + }, + function(callback){ + setTimeout(function(){ + call_order.push(2); + callback(null, 2); + }, 50); + }, + function(callback){ + setTimeout(function(){ + call_order.push(3); + callback(null, 3,3); + }, 15); + } + ], + function(err, results){ + test.equals(err, null); + test.same(results, [1,2,[3,3]]); + test.same(call_order, [1,2,3]); + test.done(); + }); +}; + +exports['series empty array'] = function(test){ + async.series([], function(err, results){ + test.equals(err, null); + test.same(results, []); + test.done(); + }); +}; + +exports['series error'] = function(test){ + test.expect(1); + async.series([ + function(callback){ + callback('error', 1); + }, + function(callback){ + test.ok(false, 'should not be called'); + callback('error2', 2); + } + ], + function(err, results){ + test.equals(err, 'error'); + }); + setTimeout(test.done, 100); +}; + +exports['series no callback'] = function(test){ + async.series([ + function(callback){callback();}, + function(callback){callback(); test.done();}, + ]); +}; + +exports['series object'] = function(test){ + var call_order = []; + async.series({ + one: function(callback){ + setTimeout(function(){ + call_order.push(1); + callback(null, 1); + }, 25); + }, + two: function(callback){ + setTimeout(function(){ + call_order.push(2); + callback(null, 2); + }, 50); + }, + three: function(callback){ + setTimeout(function(){ + call_order.push(3); + callback(null, 3,3); + }, 15); + } + }, + function(err, results){ + test.equals(err, null); + test.same(results, { + one: 1, + two: 2, + three: [3,3] + }); + test.same(call_order, [1,2,3]); + test.done(); + }); +}; + +exports['iterator'] = function(test){ + var call_order = []; + var iterator = async.iterator([ + function(){call_order.push(1);}, + function(arg1){ + test.equals(arg1, 'arg1'); + call_order.push(2); + }, + function(arg1, arg2){ + test.equals(arg1, 'arg1'); + test.equals(arg2, 'arg2'); + call_order.push(3); + } + ]); + iterator(); + test.same(call_order, [1]); + var iterator2 = iterator(); + test.same(call_order, [1,1]); + var iterator3 = iterator2('arg1'); + test.same(call_order, [1,1,2]); + var iterator4 = iterator3('arg1', 'arg2'); + test.same(call_order, [1,1,2,3]); + test.equals(iterator4, undefined); + test.done(); +}; + +exports['iterator empty array'] = function(test){ + var iterator = async.iterator([]); + test.equals(iterator(), undefined); + test.equals(iterator.next(), undefined); + test.done(); +}; + +exports['iterator.next'] = function(test){ + var call_order = []; + var iterator = async.iterator([ + function(){call_order.push(1);}, + function(arg1){ + test.equals(arg1, 'arg1'); + call_order.push(2); + }, + function(arg1, arg2){ + test.equals(arg1, 'arg1'); + test.equals(arg2, 'arg2'); + call_order.push(3); + } + ]); + var fn = iterator.next(); + var iterator2 = fn('arg1'); + test.same(call_order, [2]); + iterator2('arg1','arg2'); + test.same(call_order, [2,3]); + test.equals(iterator2.next(), undefined); + test.done(); +}; + +exports['forEach'] = function(test){ + var args = []; + async.forEach([1,3,2], function(x, callback){ + setTimeout(function(){ + args.push(x); + callback(); + }, x*25); + }, function(err){ + test.same(args, [1,2,3]); + test.done(); + }); +}; + +exports['forEach empty array'] = function(test){ + test.expect(1); + async.forEach([], function(x, callback){ + test.ok(false, 'iterator should not be called'); + callback(); + }, function(err){ + test.ok(true, 'should call callback'); + }); + setTimeout(test.done, 25); +}; + +exports['forEach error'] = function(test){ + test.expect(1); + async.forEach([1,2,3], function(x, callback){ + callback('error'); + }, function(err){ + test.equals(err, 'error'); + }); + setTimeout(test.done, 50); +}; + +exports['forEachSeries'] = function(test){ + var args = []; + async.forEachSeries([1,3,2], function(x, callback){ + setTimeout(function(){ + args.push(x); + callback(); + }, x*25); + }, function(err){ + test.same(args, [1,3,2]); + test.done(); + }); +}; + +exports['forEachSeries empty array'] = function(test){ + test.expect(1); + async.forEachSeries([], function(x, callback){ + test.ok(false, 'iterator should not be called'); + callback(); + }, function(err){ + test.ok(true, 'should call callback'); + }); + setTimeout(test.done, 25); +}; + +exports['forEachSeries error'] = function(test){ + test.expect(2); + var call_order = []; + async.forEachSeries([1,2,3], function(x, callback){ + call_order.push(x); + callback('error'); + }, function(err){ + test.same(call_order, [1]); + test.equals(err, 'error'); + }); + setTimeout(test.done, 50); +}; + +exports['map'] = function(test){ + var call_order = []; + async.map([1,3,2], function(x, callback){ + setTimeout(function(){ + call_order.push(x); + callback(null, x*2); + }, x*25); + }, function(err, results){ + test.same(call_order, [1,2,3]); + test.same(results, [2,6,4]); + test.done(); + }); +}; + +exports['map original untouched'] = function(test){ + var a = [1,2,3]; + async.map(a, function(x, callback){ + callback(null, x*2); + }, function(err, results){ + test.same(results, [2,4,6]); + test.same(a, [1,2,3]); + test.done(); + }); +}; + +exports['map error'] = function(test){ + test.expect(1); + async.map([1,2,3], function(x, callback){ + callback('error'); + }, function(err, results){ + test.equals(err, 'error'); + }); + setTimeout(test.done, 50); +}; + +exports['mapSeries'] = function(test){ + var call_order = []; + async.mapSeries([1,3,2], function(x, callback){ + setTimeout(function(){ + call_order.push(x); + callback(null, x*2); + }, x*25); + }, function(err, results){ + test.same(call_order, [1,3,2]); + test.same(results, [2,6,4]); + test.done(); + }); +}; + +exports['mapSeries error'] = function(test){ + test.expect(1); + async.mapSeries([1,2,3], function(x, callback){ + callback('error'); + }, function(err, results){ + test.equals(err, 'error'); + }); + setTimeout(test.done, 50); +}; + +exports['reduce'] = function(test){ + var call_order = []; + async.reduce([1,2,3], 0, function(a, x, callback){ + call_order.push(x); + callback(null, a + x); + }, function(err, result){ + test.equals(result, 6); + test.same(call_order, [1,2,3]); + test.done(); + }); +}; + +exports['reduce async with non-reference memo'] = function(test){ + async.reduce([1,3,2], 0, function(a, x, callback){ + setTimeout(function(){callback(null, a + x)}, Math.random()*100); + }, function(err, result){ + test.equals(result, 6); + test.done(); + }); +}; + +exports['reduce error'] = function(test){ + test.expect(1); + async.reduce([1,2,3], 0, function(a, x, callback){ + callback('error'); + }, function(err, result){ + test.equals(err, 'error'); + }); + setTimeout(test.done, 50); +}; + +exports['inject alias'] = function(test){ + test.equals(async.inject, async.reduce); + test.done(); +}; + +exports['foldl alias'] = function(test){ + test.equals(async.foldl, async.reduce); + test.done(); +}; + +exports['reduceRight'] = function(test){ + var call_order = []; + var a = [1,2,3]; + async.reduceRight(a, 0, function(a, x, callback){ + call_order.push(x); + callback(null, a + x); + }, function(err, result){ + test.equals(result, 6); + test.same(call_order, [3,2,1]); + test.same(a, [1,2,3]); + test.done(); + }); +}; + +exports['foldr alias'] = function(test){ + test.equals(async.foldr, async.reduceRight); + test.done(); +}; + +exports['filter'] = function(test){ + async.filter([3,1,2], function(x, callback){ + setTimeout(function(){callback(x % 2);}, x*25); + }, function(results){ + test.same(results, [3,1]); + test.done(); + }); +}; + +exports['filter original untouched'] = function(test){ + var a = [3,1,2]; + async.filter(a, function(x, callback){ + callback(x % 2); + }, function(results){ + test.same(results, [3,1]); + test.same(a, [3,1,2]); + test.done(); + }); +}; + +exports['filterSeries'] = function(test){ + async.filterSeries([3,1,2], function(x, callback){ + setTimeout(function(){callback(x % 2);}, x*25); + }, function(results){ + test.same(results, [3,1]); + test.done(); + }); +}; + +exports['select alias'] = function(test){ + test.equals(async.select, async.filter); + test.done(); +}; + +exports['selectSeries alias'] = function(test){ + test.equals(async.selectSeries, async.filterSeries); + test.done(); +}; + +exports['reject'] = function(test){ + async.reject([3,1,2], function(x, callback){ + setTimeout(function(){callback(x % 2);}, x*25); + }, function(results){ + test.same(results, [2]); + test.done(); + }); +}; + +exports['reject original untouched'] = function(test){ + var a = [3,1,2]; + async.reject(a, function(x, callback){ + callback(x % 2); + }, function(results){ + test.same(results, [2]); + test.same(a, [3,1,2]); + test.done(); + }); +}; + +exports['rejectSeries'] = function(test){ + async.rejectSeries([3,1,2], function(x, callback){ + setTimeout(function(){callback(x % 2);}, x*25); + }, function(results){ + test.same(results, [2]); + test.done(); + }); +}; + +exports['some true'] = function(test){ + async.some([3,1,2], function(x, callback){ + setTimeout(function(){callback(x === 1);}, 0); + }, function(result){ + test.equals(result, true); + test.done(); + }); +}; + +exports['some false'] = function(test){ + async.some([3,1,2], function(x, callback){ + setTimeout(function(){callback(x === 10);}, 0); + }, function(result){ + test.equals(result, false); + test.done(); + }); +}; + +exports['some early return'] = function(test){ + var call_order = []; + async.some([1,2,3], function(x, callback){ + setTimeout(function(){ + call_order.push(x); + callback(x === 1); + }, x*25); + }, function(result){ + call_order.push('callback'); + }); + setTimeout(function(){ + test.same(call_order, [1,'callback',2,3]); + test.done(); + }, 100); +}; + +exports['any alias'] = function(test){ + test.equals(async.any, async.some); + test.done(); +}; + +exports['every true'] = function(test){ + async.every([1,2,3], function(x, callback){ + setTimeout(function(){callback(true);}, 0); + }, function(result){ + test.equals(result, true); + test.done(); + }); +}; + +exports['every false'] = function(test){ + async.every([1,2,3], function(x, callback){ + setTimeout(function(){callback(x % 2);}, 0); + }, function(result){ + test.equals(result, false); + test.done(); + }); +}; + +exports['every early return'] = function(test){ + var call_order = []; + async.every([1,2,3], function(x, callback){ + setTimeout(function(){ + call_order.push(x); + callback(x === 1); + }, x*25); + }, function(result){ + call_order.push('callback'); + }); + setTimeout(function(){ + test.same(call_order, [1,2,'callback',3]); + test.done(); + }, 100); +}; + +exports['all alias'] = function(test){ + test.equals(async.all, async.every); + test.done(); +}; + +exports['detect'] = function(test){ + var call_order = []; + async.detect([3,2,1], function(x, callback){ + setTimeout(function(){ + call_order.push(x); + callback(x == 2); + }, x*25); + }, function(result){ + call_order.push('callback'); + test.equals(result, 2); + }); + setTimeout(function(){ + test.same(call_order, [1,2,'callback',3]); + test.done(); + }, 100); +}; + +exports['detectSeries'] = function(test){ + var call_order = []; + async.detectSeries([3,2,1], function(x, callback){ + setTimeout(function(){ + call_order.push(x); + callback(x == 2); + }, x*25); + }, function(result){ + call_order.push('callback'); + test.equals(result, 2); + }); + setTimeout(function(){ + test.same(call_order, [3,2,'callback']); + test.done(); + }, 200); +}; + +exports['sortBy'] = function(test){ + async.sortBy([{a:1},{a:15},{a:6}], function(x, callback){ + setTimeout(function(){callback(null, x.a);}, 0); + }, function(err, result){ + test.same(result, [{a:1},{a:6},{a:15}]); + test.done(); + }); +}; + +exports['apply'] = function(test){ + test.expect(6); + var fn = function(){ + test.same(Array.prototype.slice.call(arguments), [1,2,3,4]) + }; + async.apply(fn, 1, 2, 3, 4)(); + async.apply(fn, 1, 2, 3)(4); + async.apply(fn, 1, 2)(3, 4); + async.apply(fn, 1)(2, 3, 4); + async.apply(fn)(1, 2, 3, 4); + test.equals( + async.apply(function(name){return 'hello ' + name}, 'world')(), + 'hello world' + ); + test.done(); +}; + + +// generates tests for console functions such as async.log +var console_fn_tests = function(name){ + + if (typeof console !== 'undefined') { + exports[name] = function(test){ + test.expect(5); + var fn = function(arg1, callback){ + test.equals(arg1, 'one'); + setTimeout(function(){callback(null, 'test');}, 0); + }; + var fn_err = function(arg1, callback){ + test.equals(arg1, 'one'); + setTimeout(function(){callback('error');}, 0); + }; + var _console_fn = console[name]; + var _error = console.error; + console[name] = function(val){ + test.equals(val, 'test'); + test.equals(arguments.length, 1); + console.error = function(val){ + test.equals(val, 'error'); + console[name] = _console_fn; + console.error = _error; + test.done(); + }; + async[name](fn_err, 'one'); + }; + async[name](fn, 'one'); + }; + + exports[name + ' with multiple result params'] = function(test){ + var fn = function(callback){callback(null,'one','two','three');}; + var _console_fn = console[name]; + var called_with = []; + console[name] = function(x){ + called_with.push(x); + }; + async[name](fn); + test.same(called_with, ['one','two','three']); + console[name] = _console_fn; + test.done(); + }; + } + + // browser-only test + exports[name + ' without console.' + name] = function(test){ + if (typeof window !== 'undefined') { + var _console = window.console; + window.console = undefined; + var fn = function(callback){callback(null, 'val');}; + var fn_err = function(callback){callback('error');}; + async[name](fn); + async[name](fn_err); + window.console = _console; + } + test.done(); + }; + +}; + +console_fn_tests('log'); +console_fn_tests('dir'); +/*console_fn_tests('info'); +console_fn_tests('warn'); +console_fn_tests('error');*/ + +exports['nextTick'] = function(test){ + var call_order = []; + async.nextTick(function(){call_order.push('two');}); + call_order.push('one'); + setTimeout(function(){ + test.same(call_order, ['one','two']); + test.done(); + }, 50); +}; + +exports['nextTick in the browser'] = function(test){ + if (typeof process !== 'undefined') { + // skip this test in node + return test.done(); + } + test.expect(1); + + var call_order = []; + async.nextTick(function(){call_order.push('two');}); + + call_order.push('one'); + setTimeout(function(){ + if (typeof process !== 'undefined') { + process.nextTick = _nextTick; + } + test.same(call_order, ['one','two']); + }, 50); + setTimeout(test.done, 100); +}; + +exports['noConflict - node only'] = function(test){ + if (typeof process !== 'undefined') { + // node only test + test.expect(3); + var fs = require('fs'); + var filename = __dirname + '/../lib/async.js'; + fs.readFile(filename, function(err, content){ + if(err) return test.done(); + var Script = process.binding('evals').Script; + + var s = new Script(content, filename); + var s2 = new Script( + content + 'this.async2 = this.async.noConflict();', + filename + ); + + var sandbox1 = {async: 'oldvalue'}; + s.runInNewContext(sandbox1); + test.ok(sandbox1.async); + + var sandbox2 = {async: 'oldvalue'}; + s2.runInNewContext(sandbox2); + test.equals(sandbox2.async, 'oldvalue'); + test.ok(sandbox2.async2); + + test.done(); + }); + } + else test.done(); +}; + +exports['concat'] = function(test){ + var call_order = []; + var iterator = function (x, cb) { + setTimeout(function(){ + call_order.push(x); + var r = []; + while (x > 0) { + r.push(x); + x--; + } + cb(null, r); + }, x*25); + }; + async.concat([1,3,2], iterator, function(err, results){ + test.same(results, [1,2,1,3,2,1]); + test.same(call_order, [1,2,3]); + test.ok(!err); + test.done(); + }); +}; + +exports['concat error'] = function(test){ + var iterator = function (x, cb) { + cb(new Error('test error')); + }; + async.concat([1,2,3], iterator, function(err, results){ + test.ok(err); + test.done(); + }); +}; + +exports['concatSeries'] = function(test){ + var call_order = []; + var iterator = function (x, cb) { + setTimeout(function(){ + call_order.push(x); + var r = []; + while (x > 0) { + r.push(x); + x--; + } + cb(null, r); + }, x*25); + }; + async.concatSeries([1,3,2], iterator, function(err, results){ + test.same(results, [1,3,2,1,2,1]); + test.same(call_order, [1,3,2]); + test.ok(!err); + test.done(); + }); +}; + +exports['until'] = function (test) { + var call_order = []; + + var count = 0; + async.until( + function () { + call_order.push(['test', count]); + return (count == 5); + }, + function (cb) { + call_order.push(['iterator', count]); + count++; + cb(); + }, + function (err) { + test.same(call_order, [ + ['test', 0], + ['iterator', 0], ['test', 1], + ['iterator', 1], ['test', 2], + ['iterator', 2], ['test', 3], + ['iterator', 3], ['test', 4], + ['iterator', 4], ['test', 5], + ]); + test.equals(count, 5); + test.done(); + } + ); +}; + +exports['whilst'] = function (test) { + var call_order = []; + + var count = 0; + async.whilst( + function () { + call_order.push(['test', count]); + return (count < 5); + }, + function (cb) { + call_order.push(['iterator', count]); + count++; + cb(); + }, + function (err) { + test.same(call_order, [ + ['test', 0], + ['iterator', 0], ['test', 1], + ['iterator', 1], ['test', 2], + ['iterator', 2], ['test', 3], + ['iterator', 3], ['test', 4], + ['iterator', 4], ['test', 5], + ]); + test.equals(count, 5); + test.done(); + } + ); +}; + +exports['queue'] = function (test) { + var call_order = [], + delays = [40,20,60,20]; + + // worker1: --1-4 + // worker2: -2---3 + // order of completion: 2,1,4,3 + + var q = async.queue(function (task, callback) { + setTimeout(function () { + call_order.push('process ' + task); + callback('error', 'arg'); + }, delays.splice(0,1)[0]); + }, 2); + + q.push(1, function (err, arg) { + test.equal(err, 'error'); + test.equal(arg, 'arg'); + test.equal(q.length(), 1); + call_order.push('callback ' + 1); + }); + q.push(2, function (err, arg) { + test.equal(err, 'error'); + test.equal(arg, 'arg'); + test.equal(q.length(), 2); + call_order.push('callback ' + 2); + }); + q.push(3, function (err, arg) { + test.equal(err, 'error'); + test.equal(arg, 'arg'); + test.equal(q.length(), 0); + call_order.push('callback ' + 3); + }); + q.push(4, function (err, arg) { + test.equal(err, 'error'); + test.equal(arg, 'arg'); + test.equal(q.length(), 0); + call_order.push('callback ' + 4); + }); + test.equal(q.length(), 4); + test.equal(q.concurrency, 2); + + setTimeout(function () { + test.same(call_order, [ + 'process 2', 'callback 2', + 'process 1', 'callback 1', + 'process 4', 'callback 4', + 'process 3', 'callback 3' + ]); + test.equal(q.concurrency, 2); + test.equal(q.length(), 0); + test.done(); + }, 200); +}; + +exports['queue changing concurrency'] = function (test) { + var call_order = [], + delays = [40,20,60,20]; + + // worker1: --1-2---3-4 + // order of completion: 1,2,3,4 + + var q = async.queue(function (task, callback) { + setTimeout(function () { + call_order.push('process ' + task); + callback('error', 'arg'); + }, delays.splice(0,1)[0]); + }, 2); + + q.push(1, function (err, arg) { + test.equal(err, 'error'); + test.equal(arg, 'arg'); + test.equal(q.length(), 3); + call_order.push('callback ' + 1); + }); + q.push(2, function (err, arg) { + test.equal(err, 'error'); + test.equal(arg, 'arg'); + test.equal(q.length(), 2); + call_order.push('callback ' + 2); + }); + q.push(3, function (err, arg) { + test.equal(err, 'error'); + test.equal(arg, 'arg'); + test.equal(q.length(), 1); + call_order.push('callback ' + 3); + }); + q.push(4, function (err, arg) { + test.equal(err, 'error'); + test.equal(arg, 'arg'); + test.equal(q.length(), 0); + call_order.push('callback ' + 4); + }); + test.equal(q.length(), 4); + test.equal(q.concurrency, 2); + q.concurrency = 1; + + setTimeout(function () { + test.same(call_order, [ + 'process 1', 'callback 1', + 'process 2', 'callback 2', + 'process 3', 'callback 3', + 'process 4', 'callback 4' + ]); + test.equal(q.concurrency, 1); + test.equal(q.length(), 0); + test.done(); + }, 250); +}; + +exports['queue push without callback'] = function (test) { + var call_order = [], + delays = [40,20,60,20]; + + // worker1: --1-4 + // worker2: -2---3 + // order of completion: 2,1,4,3 + + var q = async.queue(function (task, callback) { + setTimeout(function () { + call_order.push('process ' + task); + callback('error', 'arg'); + }, delays.splice(0,1)[0]); + }, 2); + + q.push(1); + q.push(2); + q.push(3); + q.push(4); + + setTimeout(function () { + test.same(call_order, [ + 'process 2', + 'process 1', + 'process 4', + 'process 3' + ]); + test.done(); + }, 200); +}; + +exports['memoize'] = function (test) { + test.expect(4); + var call_order = []; + + var fn = function (arg1, arg2, callback) { + call_order.push(['fn', arg1, arg2]); + callback(null, arg1 + arg2); + }; + + var fn2 = async.memoize(fn); + fn2(1, 2, function (err, result) { + test.equal(result, 3); + }); + fn2(1, 2, function (err, result) { + test.equal(result, 3); + }); + fn2(2, 2, function (err, result) { + test.equal(result, 4); + }); + + test.same(call_order, [['fn',1,2], ['fn',2,2]]); + test.done(); +}; + +exports['memoize error'] = function (test) { + test.expect(1); + var testerr = new Error('test'); + var fn = function (arg1, arg2, callback) { + callback(testerr, arg1 + arg2); + }; + async.memoize(fn)(1, 2, function (err, result) { + test.equal(err, testerr); + }); + test.done(); +}; + +exports['memoize custom hash function'] = function (test) { + test.expect(2); + var testerr = new Error('test'); + + var fn = function (arg1, arg2, callback) { + callback(testerr, arg1 + arg2); + }; + var fn2 = async.memoize(fn, function () { + return 'custom hash'; + }); + fn2(1, 2, function (err, result) { + test.equal(result, 3); + }); + fn2(2, 2, function (err, result) { + test.equal(result, 3); + }); + test.done(); +}; + +// Issue 10 on github: https://github.com/caolan/async/issues#issue/10 +exports['falsy return values in series'] = function (test) { + function taskFalse(callback) { + async.nextTick(function() { + callback(null, false); + }); + }; + function taskUndefined(callback) { + async.nextTick(function() { + callback(null, undefined); + }); + }; + function taskEmpty(callback) { + async.nextTick(function() { + callback(null); + }); + }; + function taskNull(callback) { + async.nextTick(function() { + callback(null, null); + }); + }; + async.series( + [taskFalse, taskUndefined, taskEmpty, taskNull], + function(err, results) { + test.same(results, [false, undefined, undefined, null]); + test.strictEqual(results[0], false); + test.strictEqual(results[1], undefined); + test.strictEqual(results[2], undefined); + test.strictEqual(results[3], null); + test.done(); + } + ); +}; + +// Issue 10 on github: https://github.com/caolan/async/issues#issue/10 +exports['falsy return values in parallel'] = function (test) { + function taskFalse(callback) { + async.nextTick(function() { + callback(null, false); + }); + }; + function taskUndefined(callback) { + async.nextTick(function() { + callback(null, undefined); + }); + }; + function taskEmpty(callback) { + async.nextTick(function() { + callback(null); + }); + }; + function taskNull(callback) { + async.nextTick(function() { + callback(null, null); + }); + }; + async.parallel( + [taskFalse, taskUndefined, taskEmpty, taskNull], + function(err, results) { + test.same(results, [false, undefined, undefined, null]); + test.strictEqual(results[0], false); + test.strictEqual(results[1], undefined); + test.strictEqual(results[2], undefined); + test.strictEqual(results[3], null); + test.done(); + } + ); +}; + +exports['queue events'] = function(test) { + var calls = []; + var q = async.queue(function(task, cb) { + // nop + calls.push('process ' + task); + cb(); + }, 3); + + q.saturated = function() { + test.ok(q.length() == 3, 'queue should be saturated now'); + calls.push('saturated'); + }; + q.empty = function() { + test.ok(q.length() == 0, 'queue should be empty now'); + calls.push('empty'); + }; + q.drain = function() { + test.ok( + q.length() == 0 && q.running() == 0, + 'queue should be empty now and no more workers should be running' + ); + calls.push('drain'); + test.same(calls, [ + 'saturated', + 'process foo', + 'foo cb', + 'process bar', + 'bar cb', + 'process zoo', + 'zoo cb', + 'process poo', + 'poo cb', + 'empty', + 'process moo', + 'moo cb', + 'drain', + ]); + test.done(); + }; + q.push('foo', function () {calls.push('foo cb');}); + q.push('bar', function () {calls.push('bar cb');}); + q.push('zoo', function () {calls.push('zoo cb');}); + q.push('poo', function () {calls.push('poo cb');}); + q.push('moo', function () {calls.push('moo cb');}); +}; diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/test.html b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/test.html new file mode 100644 index 0000000..2450e2d --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/test.html @@ -0,0 +1,24 @@ + + + Async.js Test Suite + + + + + + + + +

      Async.js Test Suite

      + + + diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/.npmignore b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/.npmignore new file mode 100644 index 0000000..aba34f0 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/.npmignore @@ -0,0 +1,3 @@ +*.un~ +/node_modules +/test/tmp diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/License b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/License new file mode 100644 index 0000000..4804b7a --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/License @@ -0,0 +1,19 @@ +Copyright (c) 2011 Debuggable Limited + +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. diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/Makefile b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/Makefile new file mode 100644 index 0000000..b4ff85a --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/Makefile @@ -0,0 +1,7 @@ +SHELL := /bin/bash + +test: + @./test/run.js + +.PHONY: test + diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md new file mode 100644 index 0000000..1a9999e --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md @@ -0,0 +1,132 @@ +# combined-stream + +A stream that emits multiple other streams one after another. + +## Installation + +``` bash +npm install combined-stream +``` + +## Usage + +Here is a simple example that shows how you can use combined-stream to combine +two files into one: + +``` javascript +var CombinedStream = require('combined-stream'); +var fs = require('fs'); + +var combinedStream = CombinedStream.create(); +combinedStream.append(fs.createReadStream('file1.txt')); +combinedStream.append(fs.createReadStream('file2.txt')); + +combinedStream.pipe(fs.createWriteStream('combined.txt')); +``` + +While the example above works great, it will pause all source streams until +they are needed. If you don't want that to happen, you can set `pauseStreams` +to `false`: + +``` javascript +var CombinedStream = require('combined-stream'); +var fs = require('fs'); + +var combinedStream = CombinedStream.create({pauseStreams: false}); +combinedStream.append(fs.createReadStream('file1.txt')); +combinedStream.append(fs.createReadStream('file2.txt')); + +combinedStream.pipe(fs.createWriteStream('combined.txt')); +``` + +However, what if you don't have all the source streams yet, or you don't want +to allocate the resources (file descriptors, memory, etc.) for them right away? +Well, in that case you can simply provide a callback that supplies the stream +by calling a `next()` function: + +``` javascript +var CombinedStream = require('combined-stream'); +var fs = require('fs'); + +var combinedStream = CombinedStream.create(); +combinedStream.append(function(next) { + next(fs.createReadStream('file1.txt')); +}); +combinedStream.append(function(next) { + next(fs.createReadStream('file2.txt')); +}); + +combinedStream.pipe(fs.createWriteStream('combined.txt')); +``` + +## API + +### CombinedStream.create([options]) + +Returns a new combined stream object. Available options are: + +* `maxDataSize` +* `pauseStreams` + +The effect of those options is described below. + +### combinedStream.pauseStreams = true + +Whether to apply back pressure to the underlaying streams. If set to `false`, +the underlaying streams will never be paused. If set to `true`, the +underlaying streams will be paused right after being appended, as well as when +`delayedStream.pipe()` wants to throttle. + +### combinedStream.maxDataSize = 2 * 1024 * 1024 + +The maximum amount of bytes (or characters) to buffer for all source streams. +If this value is exceeded, `combinedStream` emits an `'error'` event. + +### combinedStream.dataSize = 0 + +The amount of bytes (or characters) currently buffered by `combinedStream`. + +### combinedStream.append(stream) + +Appends the given `stream` to the combinedStream object. If `pauseStreams` is +set to `true, this stream will also be paused right away. + +`streams` can also be a function that takes one parameter called `next`. `next` +is a function that must be invoked in order to provide the `next` stream, see +example above. + +Regardless of how the `stream` is appended, combined-stream always attaches an +`'error'` listener to it, so you don't have to do that manually. + +Special case: `stream` can also be a String or Buffer. + +### combinedStream.write(data) + +You should not call this, `combinedStream` takes care of piping the appended +streams into itself for you. + +### combinedStream.resume() + +Causes `combinedStream` to start drain the streams it manages. The function is +idempotent, and also emits a `'resume'` event each time which usually goes to +the stream that is currently being drained. + +### combinedStream.pause(); + +If `combinedStream.pauseStreams` is set to `false`, this does nothing. +Otherwise a `'pause'` event is emitted, this goes to the stream that is +currently being drained, so you can use it to apply back pressure. + +### combinedStream.end(); + +Sets `combinedStream.writable` to false, emits an `'end'` event, and removes +all streams from the queue. + +### combinedStream.destroy(); + +Same as `combinedStream.end()`, except it emits a `'close'` event instead of +`'end'`. + +## License + +combined-stream is licensed under the MIT license. diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js new file mode 100644 index 0000000..03754e6 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js @@ -0,0 +1,183 @@ +var util = require('util'); +var Stream = require('stream').Stream; +var DelayedStream = require('delayed-stream'); + +module.exports = CombinedStream; +function CombinedStream() { + this.writable = false; + this.readable = true; + this.dataSize = 0; + this.maxDataSize = 2 * 1024 * 1024; + this.pauseStreams = true; + + this._released = false; + this._streams = []; + this._currentStream = null; +} +util.inherits(CombinedStream, Stream); + +CombinedStream.create = function(options) { + var combinedStream = new this(); + + options = options || {}; + for (var option in options) { + combinedStream[option] = options[option]; + } + + return combinedStream; +}; + +CombinedStream.isStreamLike = function(stream) { + return (typeof stream !== 'function') + && (typeof stream !== 'string') + && (!Buffer.isBuffer(stream)); +}; + +CombinedStream.prototype.append = function(stream) { + var isStreamLike = CombinedStream.isStreamLike(stream); + + if (isStreamLike) { + if (!(stream instanceof DelayedStream)) { + stream.on('data', this._checkDataSize.bind(this)); + + stream = DelayedStream.create(stream, { + maxDataSize: Infinity, + pauseStream: this.pauseStreams, + }); + } + + this._handleErrors(stream); + + if (this.pauseStreams) { + stream.pause(); + } + } + + this._streams.push(stream); + return this; +}; + +CombinedStream.prototype.pipe = function(dest, options) { + Stream.prototype.pipe.call(this, dest, options); + this.resume(); +}; + +CombinedStream.prototype._getNext = function() { + this._currentStream = null; + var stream = this._streams.shift(); + + + if (!stream) { + this.end(); + return; + } + + if (typeof stream !== 'function') { + this._pipeNext(stream); + return; + } + + var getStream = stream; + getStream(function(stream) { + var isStreamLike = CombinedStream.isStreamLike(stream); + if (isStreamLike) { + stream.on('data', this._checkDataSize.bind(this)); + this._handleErrors(stream); + } + + this._pipeNext(stream); + }.bind(this)); +}; + +CombinedStream.prototype._pipeNext = function(stream) { + this._currentStream = stream; + + var isStreamLike = CombinedStream.isStreamLike(stream); + if (isStreamLike) { + stream.on('end', this._getNext.bind(this)) + stream.pipe(this, {end: false}); + return; + } + + var value = stream; + this.write(value); + this._getNext(); +}; + +CombinedStream.prototype._handleErrors = function(stream) { + var self = this; + stream.on('error', function(err) { + self._emitError(err); + }); +}; + +CombinedStream.prototype.write = function(data) { + this.emit('data', data); +}; + +CombinedStream.prototype.pause = function() { + if (!this.pauseStreams) { + return; + } + + this.emit('pause'); +}; + +CombinedStream.prototype.resume = function() { + if (!this._released) { + this._released = true; + this.writable = true; + this._getNext(); + } + + this.emit('resume'); +}; + +CombinedStream.prototype.end = function() { + this._reset(); + this.emit('end'); +}; + +CombinedStream.prototype.destroy = function() { + this._reset(); + this.emit('close'); +}; + +CombinedStream.prototype._reset = function() { + this.writable = false; + this._streams = []; + this._currentStream = null; +}; + +CombinedStream.prototype._checkDataSize = function() { + this._updateDataSize(); + if (this.dataSize <= this.maxDataSize) { + return; + } + + var message = + 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.' + this._emitError(new Error(message)); +}; + +CombinedStream.prototype._updateDataSize = function() { + this.dataSize = 0; + + var self = this; + this._streams.forEach(function(stream) { + if (!stream.dataSize) { + return; + } + + self.dataSize += stream.dataSize; + }); + + if (this._currentStream && this._currentStream.dataSize) { + this.dataSize += this._currentStream.dataSize; + } +}; + +CombinedStream.prototype._emitError = function(err) { + this._reset(); + this.emit('error', err); +}; diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore new file mode 100644 index 0000000..2fedb26 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore @@ -0,0 +1,2 @@ +*.un~ +/node_modules/* diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License new file mode 100644 index 0000000..4804b7a --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License @@ -0,0 +1,19 @@ +Copyright (c) 2011 Debuggable Limited + +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. diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile new file mode 100644 index 0000000..b4ff85a --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile @@ -0,0 +1,7 @@ +SHELL := /bin/bash + +test: + @./test/run.js + +.PHONY: test + diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md new file mode 100644 index 0000000..5cb5b35 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md @@ -0,0 +1,154 @@ +# delayed-stream + +Buffers events from a stream until you are ready to handle them. + +## Installation + +``` bash +npm install delayed-stream +``` + +## Usage + +The following example shows how to write a http echo server that delays its +response by 1000 ms. + +``` javascript +var DelayedStream = require('delayed-stream'); +var http = require('http'); + +http.createServer(function(req, res) { + var delayed = DelayedStream.create(req); + + setTimeout(function() { + res.writeHead(200); + delayed.pipe(res); + }, 1000); +}); +``` + +If you are not using `Stream#pipe`, you can also manually release the buffered +events by calling `delayedStream.resume()`: + +``` javascript +var delayed = DelayedStream.create(req); + +setTimeout(function() { + // Emit all buffered events and resume underlaying source + delayed.resume(); +}, 1000); +``` + +## Implementation + +In order to use this meta stream properly, here are a few things you should +know about the implementation. + +### Event Buffering / Proxying + +All events of the `source` stream are hijacked by overwriting the `source.emit` +method. Until node implements a catch-all event listener, this is the only way. + +However, delayed-stream still continues to emit all events it captures on the +`source`, regardless of whether you have released the delayed stream yet or +not. + +Upon creation, delayed-stream captures all `source` events and stores them in +an internal event buffer. Once `delayedStream.release()` is called, all +buffered events are emitted on the `delayedStream`, and the event buffer is +cleared. After that, delayed-stream merely acts as a proxy for the underlaying +source. + +### Error handling + +Error events on `source` are buffered / proxied just like any other events. +However, `delayedStream.create` attaches a no-op `'error'` listener to the +`source`. This way you only have to handle errors on the `delayedStream` +object, rather than in two places. + +### Buffer limits + +delayed-stream provides a `maxDataSize` property that can be used to limit +the amount of data being buffered. In order to protect you from bad `source` +streams that don't react to `source.pause()`, this feature is enabled by +default. + +## API + +### DelayedStream.create(source, [options]) + +Returns a new `delayedStream`. Available options are: + +* `pauseStream` +* `maxDataSize` + +The description for those properties can be found below. + +### delayedStream.source + +The `source` stream managed by this object. This is useful if you are +passing your `delayedStream` around, and you still want to access properties +on the `source` object. + +### delayedStream.pauseStream = true + +Whether to pause the underlaying `source` when calling +`DelayedStream.create()`. Modifying this property afterwards has no effect. + +### delayedStream.maxDataSize = 1024 * 1024 + +The amount of data to buffer before emitting an `error`. + +If the underlaying source is emitting `Buffer` objects, the `maxDataSize` +refers to bytes. + +If the underlaying source is emitting JavaScript strings, the size refers to +characters. + +If you know what you are doing, you can set this property to `Infinity` to +disable this feature. You can also modify this property during runtime. + +### delayedStream.maxDataSize = 1024 * 1024 + +The amount of data to buffer before emitting an `error`. + +If the underlaying source is emitting `Buffer` objects, the `maxDataSize` +refers to bytes. + +If the underlaying source is emitting JavaScript strings, the size refers to +characters. + +If you know what you are doing, you can set this property to `Infinity` to +disable this feature. + +### delayedStream.dataSize = 0 + +The amount of data buffered so far. + +### delayedStream.readable + +An ECMA5 getter that returns the value of `source.readable`. + +### delayedStream.resume() + +If the `delayedStream` has not been released so far, `delayedStream.release()` +is called. + +In either case, `source.resume()` is called. + +### delayedStream.pause() + +Calls `source.pause()`. + +### delayedStream.pipe(dest) + +Calls `delayedStream.resume()` and then proxies the arguments to `source.pipe`. + +### delayedStream.release() + +Emits and clears all events that have been buffered up so far. This does not +resume the underlaying source, use `delayedStream.resume()` instead. + +## License + +delayed-stream is licensed under the MIT license. diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js new file mode 100644 index 0000000..7c10d48 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js @@ -0,0 +1,99 @@ +var Stream = require('stream').Stream; +var util = require('util'); + +module.exports = DelayedStream; +function DelayedStream() { + this.source = null; + this.dataSize = 0; + this.maxDataSize = 1024 * 1024; + this.pauseStream = true; + + this._maxDataSizeExceeded = false; + this._released = false; + this._bufferedEvents = []; +} +util.inherits(DelayedStream, Stream); + +DelayedStream.create = function(source, options) { + var delayedStream = new this(); + + options = options || {}; + for (var option in options) { + delayedStream[option] = options[option]; + } + + delayedStream.source = source; + + var realEmit = source.emit; + source.emit = function() { + delayedStream._handleEmit(arguments); + return realEmit.apply(source, arguments); + }; + + source.on('error', function() {}); + if (delayedStream.pauseStream) { + source.pause(); + } + + return delayedStream; +}; + +DelayedStream.prototype.__defineGetter__('readable', function() { + return this.source.readable; +}); + +DelayedStream.prototype.resume = function() { + if (!this._released) { + this.release(); + } + + this.source.resume(); +}; + +DelayedStream.prototype.pause = function() { + this.source.pause(); +}; + +DelayedStream.prototype.release = function() { + this._released = true; + + this._bufferedEvents.forEach(function(args) { + this.emit.apply(this, args); + }.bind(this)); + this._bufferedEvents = []; +}; + +DelayedStream.prototype.pipe = function() { + var r = Stream.prototype.pipe.apply(this, arguments); + this.resume(); + return r; +}; + +DelayedStream.prototype._handleEmit = function(args) { + if (this._released) { + this.emit.apply(this, args); + return; + } + + if (args[0] === 'data') { + this.dataSize += args[1].length; + this._checkIfMaxDataSizeExceeded(); + } + + this._bufferedEvents.push(args); +}; + +DelayedStream.prototype._checkIfMaxDataSizeExceeded = function() { + if (this._maxDataSizeExceeded) { + return; + } + + if (this.dataSize <= this.maxDataSize) { + return; + } + + this._maxDataSizeExceeded = true; + var message = + 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.' + this.emit('error', new Error(message)); +}; diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json new file mode 100644 index 0000000..d394b92 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json @@ -0,0 +1,38 @@ +{ + "author": { + "name": "Felix Geisendörfer", + "email": "felix@debuggable.com", + "url": "http://debuggable.com/" + }, + "name": "delayed-stream", + "description": "Buffers events from a stream until you are ready to handle them.", + "version": "0.0.5", + "homepage": "https://github.com/felixge/node-delayed-stream", + "repository": { + "type": "git", + "url": "git://github.com/felixge/node-delayed-stream.git" + }, + "main": "./lib/delayed_stream", + "engines": { + "node": ">=0.4.0" + }, + "dependencies": {}, + "devDependencies": { + "fake": "0.2.0", + "far": "0.0.1" + }, + "_npmUser": { + "name": "mikeal", + "email": "mikeal.rogers@gmail.com" + }, + "_id": "delayed-stream@0.0.5", + "optionalDependencies": {}, + "_engineSupported": true, + "_npmVersion": "1.1.24", + "_nodeVersion": "v0.8.1", + "_defaultsLoaded": true, + "dist": { + "shasum": "56f46a53506f656e1a549c63d8794c6cf8b6e1fc" + }, + "_from": "delayed-stream@0.0.5" +} diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js new file mode 100644 index 0000000..4d71b8a --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js @@ -0,0 +1,6 @@ +var common = module.exports; + +common.DelayedStream = require('..'); +common.assert = require('assert'); +common.fake = require('fake'); +common.PORT = 49252; diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js new file mode 100644 index 0000000..9ecad5b --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js @@ -0,0 +1,38 @@ +var common = require('../common'); +var assert = common.assert; +var DelayedStream = common.DelayedStream; +var http = require('http'); + +var UPLOAD = new Buffer(10 * 1024 * 1024); + +var server = http.createServer(function(req, res) { + var delayed = DelayedStream.create(req, {maxDataSize: UPLOAD.length}); + + setTimeout(function() { + res.writeHead(200); + delayed.pipe(res); + }, 10); +}); +server.listen(common.PORT, function() { + var request = http.request({ + method: 'POST', + port: common.PORT, + }); + + request.write(UPLOAD); + request.end(); + + request.on('response', function(res) { + var received = 0; + res + .on('data', function(chunk) { + received += chunk.length; + }) + .on('end', function() { + assert.equal(received, UPLOAD.length); + server.close(); + }); + }); +}); + + diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js new file mode 100644 index 0000000..6f417f3 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js @@ -0,0 +1,21 @@ +var common = require('../common'); +var assert = common.assert; +var fake = common.fake.create(); +var DelayedStream = common.DelayedStream; +var Stream = require('stream').Stream; + +(function testAutoPause() { + var source = new Stream(); + + fake.expect(source, 'pause', 1); + var delayedStream = DelayedStream.create(source); + fake.verify(); +})(); + +(function testDisableAutoPause() { + var source = new Stream(); + fake.expect(source, 'pause', 0); + + var delayedStream = DelayedStream.create(source, {pauseStream: false}); + fake.verify(); +})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js new file mode 100644 index 0000000..b50c397 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js @@ -0,0 +1,14 @@ +var common = require('../common'); +var assert = common.assert; +var fake = common.fake.create(); +var DelayedStream = common.DelayedStream; +var Stream = require('stream').Stream; + +(function testDelayEventsUntilResume() { + var source = new Stream(); + var delayedStream = DelayedStream.create(source, {pauseStream: false}); + + fake.expect(source, 'pause'); + delayedStream.pause(); + fake.verify(); +})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js new file mode 100644 index 0000000..fc4047e --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js @@ -0,0 +1,48 @@ +var common = require('../common'); +var assert = common.assert; +var fake = common.fake.create(); +var DelayedStream = common.DelayedStream; +var Stream = require('stream').Stream; + +(function testDelayEventsUntilResume() { + var source = new Stream(); + var delayedStream = DelayedStream.create(source, {pauseStream: false}); + + // delayedStream must not emit until we resume + fake.expect(delayedStream, 'emit', 0); + + // but our original source must emit + var params = []; + source.on('foo', function(param) { + params.push(param); + }); + + source.emit('foo', 1); + source.emit('foo', 2); + + // Make sure delayedStream did not emit, and source did + assert.deepEqual(params, [1, 2]); + fake.verify(); + + // After resume, delayedStream must playback all events + fake + .stub(delayedStream, 'emit') + .times(Infinity) + .withArg(1, 'newListener'); + fake.expect(delayedStream, 'emit', ['foo', 1]); + fake.expect(delayedStream, 'emit', ['foo', 2]); + fake.expect(source, 'resume'); + + delayedStream.resume(); + fake.verify(); + + // Calling resume again will delegate to source + fake.expect(source, 'resume'); + delayedStream.resume(); + fake.verify(); + + // Emitting more events directly leads to them being emitted + fake.expect(delayedStream, 'emit', ['foo', 3]); + source.emit('foo', 3); + fake.verify(); +})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js new file mode 100644 index 0000000..a9d35e7 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js @@ -0,0 +1,15 @@ +var common = require('../common'); +var assert = common.assert; +var fake = common.fake.create(); +var DelayedStream = common.DelayedStream; +var Stream = require('stream').Stream; + +(function testHandleSourceErrors() { + var source = new Stream(); + var delayedStream = DelayedStream.create(source, {pauseStream: false}); + + // We deal with this by attaching a no-op listener to 'error' on the source + // when creating a new DelayedStream. This way error events on the source + // won't throw. + source.emit('error', new Error('something went wrong')); +})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js new file mode 100644 index 0000000..7638a2b --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js @@ -0,0 +1,18 @@ +var common = require('../common'); +var assert = common.assert; +var fake = common.fake.create(); +var DelayedStream = common.DelayedStream; +var Stream = require('stream').Stream; + +(function testMaxDataSize() { + var source = new Stream(); + var delayedStream = DelayedStream.create(source, {maxDataSize: 1024, pauseStream: false}); + + source.emit('data', new Buffer(1024)); + + fake + .expect(delayedStream, 'emit') + .withArg(1, 'error'); + source.emit('data', new Buffer(1)); + fake.verify(); +})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js new file mode 100644 index 0000000..7d312ab --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js @@ -0,0 +1,13 @@ +var common = require('../common'); +var assert = common.assert; +var fake = common.fake.create(); +var DelayedStream = common.DelayedStream; +var Stream = require('stream').Stream; + +(function testPipeReleases() { + var source = new Stream(); + var delayedStream = DelayedStream.create(source, {pauseStream: false}); + + fake.expect(delayedStream, 'resume'); + delayedStream.pipe(new Stream()); +})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js new file mode 100644 index 0000000..d436163 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js @@ -0,0 +1,13 @@ +var common = require('../common'); +var assert = common.assert; +var fake = common.fake.create(); +var DelayedStream = common.DelayedStream; +var Stream = require('stream').Stream; + +(function testProxyReadableProperty() { + var source = new Stream(); + var delayedStream = DelayedStream.create(source, {pauseStream: false}); + + source.readable = fake.value('source.readable'); + assert.strictEqual(delayedStream.readable, source.readable); +})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js new file mode 100755 index 0000000..0bb8e82 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js @@ -0,0 +1,7 @@ +#!/usr/bin/env node +var far = require('far').create(); + +far.add(__dirname); +far.include(/test-.*\.js$/); + +far.execute(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json new file mode 100644 index 0000000..7bb0fcf --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json @@ -0,0 +1,39 @@ +{ + "author": { + "name": "Felix Geisendörfer", + "email": "felix@debuggable.com", + "url": "http://debuggable.com/" + }, + "name": "combined-stream", + "description": "A stream that emits multiple other streams one after another.", + "version": "0.0.3", + "homepage": "https://github.com/felixge/node-combined-stream", + "repository": { + "type": "git", + "url": "git://github.com/felixge/node-combined-stream.git" + }, + "main": "./lib/combined_stream", + "engines": { + "node": "*" + }, + "dependencies": { + "delayed-stream": "0.0.5" + }, + "devDependencies": { + "far": "0.0.1" + }, + "_npmUser": { + "name": "mikeal", + "email": "mikeal.rogers@gmail.com" + }, + "_id": "combined-stream@0.0.3", + "optionalDependencies": {}, + "_engineSupported": true, + "_npmVersion": "1.1.24", + "_nodeVersion": "v0.8.1", + "_defaultsLoaded": true, + "dist": { + "shasum": "c41c9899277b587901bb6ce4bf458b94693afafa" + }, + "_from": "combined-stream@0.0.3" +} diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/common.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/common.js new file mode 100644 index 0000000..aa9ab3a --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/common.js @@ -0,0 +1,12 @@ +var common = module.exports; + +var path = require('path'); +var root = path.join(__dirname, '..'); + +common.dir = { + fixture: root + '/test/fixture', + tmp: root + '/test/tmp', +}; + +common.CombinedStream = require(root); +common.assert = require('assert'); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file1.txt b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file1.txt new file mode 100644 index 0000000..50e0218 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file1.txt @@ -0,0 +1,256 @@ +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 +10101010101010101010101010101010101010101010101010101010101010101010101010101010 +01010101010101010101010101010101010101010101010101010101010101010101010101010101 diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file2.txt b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file2.txt new file mode 100644 index 0000000..da1d821 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file2.txt @@ -0,0 +1,256 @@ +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 +20202020202020202020202020202020202020202020202020202020202020202020202020202020 +02020202020202020202020202020202020202020202020202020202020202020202020202020202 diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-callback-streams.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-callback-streams.js new file mode 100644 index 0000000..44ecaba --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-callback-streams.js @@ -0,0 +1,27 @@ +var common = require('../common'); +var assert = common.assert; +var CombinedStream = common.CombinedStream; +var fs = require('fs'); + +var FILE1 = common.dir.fixture + '/file1.txt'; +var FILE2 = common.dir.fixture + '/file2.txt'; +var EXPECTED = fs.readFileSync(FILE1) + fs.readFileSync(FILE2); + +(function testDelayedStreams() { + var combinedStream = CombinedStream.create(); + combinedStream.append(function(next) { + next(fs.createReadStream(FILE1)); + }); + combinedStream.append(function(next) { + next(fs.createReadStream(FILE2)); + }); + + var tmpFile = common.dir.tmp + '/combined.txt'; + var dest = fs.createWriteStream(tmpFile); + combinedStream.pipe(dest); + + dest.on('end', function() { + var written = fs.readFileSync(tmpFile, 'utf8'); + assert.strictEqual(written, EXPECTED); + }); +})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-data-size.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-data-size.js new file mode 100644 index 0000000..e3fbd18 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-data-size.js @@ -0,0 +1,34 @@ +var common = require('../common'); +var assert = common.assert; +var CombinedStream = common.CombinedStream; + +(function testDataSizeGetter() { + var combinedStream = CombinedStream.create(); + + assert.strictEqual(combinedStream.dataSize, 0); + + // Test one stream + combinedStream._streams.push({dataSize: 10}); + combinedStream._updateDataSize(); + assert.strictEqual(combinedStream.dataSize, 10); + + // Test two streams + combinedStream._streams.push({dataSize: 23}); + combinedStream._updateDataSize(); + assert.strictEqual(combinedStream.dataSize, 33); + + // Test currentStream + combinedStream._currentStream = {dataSize: 20}; + combinedStream._updateDataSize(); + assert.strictEqual(combinedStream.dataSize, 53); + + // Test currentStream without dataSize + combinedStream._currentStream = {}; + combinedStream._updateDataSize(); + assert.strictEqual(combinedStream.dataSize, 33); + + // Test stream function + combinedStream._streams.push(function() {}); + combinedStream._updateDataSize(); + assert.strictEqual(combinedStream.dataSize, 33); +})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams-and-buffers-and-strings.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams-and-buffers-and-strings.js new file mode 100644 index 0000000..c678575 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams-and-buffers-and-strings.js @@ -0,0 +1,38 @@ +var common = require('../common'); +var assert = common.assert; +var CombinedStream = common.CombinedStream; +var fs = require('fs'); + +var FILE1 = common.dir.fixture + '/file1.txt'; +var BUFFER = new Buffer('Bacon is delicious'); +var FILE2 = common.dir.fixture + '/file2.txt'; +var STRING = 'The € kicks the $\'s ass!'; + +var EXPECTED = + fs.readFileSync(FILE1) + + BUFFER + + fs.readFileSync(FILE2) + + STRING; +var GOT; + +(function testDelayedStreams() { + var combinedStream = CombinedStream.create(); + combinedStream.append(fs.createReadStream(FILE1)); + combinedStream.append(BUFFER); + combinedStream.append(fs.createReadStream(FILE2)); + combinedStream.append(function(next) { + next(STRING); + }); + + var tmpFile = common.dir.tmp + '/combined-file1-buffer-file2-string.txt'; + var dest = fs.createWriteStream(tmpFile); + combinedStream.pipe(dest); + + dest.on('close', function() { + GOT = fs.readFileSync(tmpFile, 'utf8'); + }); +})(); + +process.on('exit', function() { + assert.strictEqual(GOT, EXPECTED); +}); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams.js new file mode 100644 index 0000000..263cfdf --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams.js @@ -0,0 +1,35 @@ +var common = require('../common'); +var assert = common.assert; +var CombinedStream = common.CombinedStream; +var fs = require('fs'); + +var FILE1 = common.dir.fixture + '/file1.txt'; +var FILE2 = common.dir.fixture + '/file2.txt'; +var EXPECTED = fs.readFileSync(FILE1) + fs.readFileSync(FILE2); +var GOT; + +(function testDelayedStreams() { + var combinedStream = CombinedStream.create(); + combinedStream.append(fs.createReadStream(FILE1)); + combinedStream.append(fs.createReadStream(FILE2)); + + var stream1 = combinedStream._streams[0]; + var stream2 = combinedStream._streams[1]; + + stream1.on('end', function() { + assert.equal(stream2.dataSize, 0); + }); + + var tmpFile = common.dir.tmp + '/combined.txt'; + var dest = fs.createWriteStream(tmpFile); + combinedStream.pipe(dest); + + dest.on('close', function() { + GOT = fs.readFileSync(tmpFile, 'utf8'); + }); +})(); + +process.on('exit', function() { + console.error(GOT.length, EXPECTED.length); + assert.strictEqual(GOT, EXPECTED); +}); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-max-data-size.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-max-data-size.js new file mode 100644 index 0000000..25f47a4 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-max-data-size.js @@ -0,0 +1,24 @@ +var common = require('../common'); +var assert = common.assert; +var CombinedStream = common.CombinedStream; +var fs = require('fs'); + +var FILE1 = common.dir.fixture + '/file1.txt'; +var FILE2 = common.dir.fixture + '/file2.txt'; +var EXPECTED = fs.readFileSync(FILE1) + fs.readFileSync(FILE2); + +(function testDelayedStreams() { + var combinedStream = CombinedStream.create({pauseStreams: false, maxDataSize: 20736}); + combinedStream.append(fs.createReadStream(FILE1)); + combinedStream.append(fs.createReadStream(FILE2)); + + var gotErr = null; + combinedStream.on('error', function(err) { + gotErr = err; + }); + + process.on('exit', function() { + assert.ok(gotErr); + assert.ok(gotErr.message.match(/bytes/)); + }); +})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-unpaused-streams.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-unpaused-streams.js new file mode 100644 index 0000000..30a3a6f --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-unpaused-streams.js @@ -0,0 +1,30 @@ +var common = require('../common'); +var assert = common.assert; +var CombinedStream = common.CombinedStream; +var fs = require('fs'); + +var FILE1 = common.dir.fixture + '/file1.txt'; +var FILE2 = common.dir.fixture + '/file2.txt'; +var EXPECTED = fs.readFileSync(FILE1) + fs.readFileSync(FILE2); + +(function testDelayedStreams() { + var combinedStream = CombinedStream.create({pauseStreams: false}); + combinedStream.append(fs.createReadStream(FILE1)); + combinedStream.append(fs.createReadStream(FILE2)); + + var stream1 = combinedStream._streams[0]; + var stream2 = combinedStream._streams[1]; + + stream1.on('end', function() { + assert.ok(stream2.dataSize > 0); + }); + + var tmpFile = common.dir.tmp + '/combined.txt'; + var dest = fs.createWriteStream(tmpFile); + combinedStream.pipe(dest); + + dest.on('end', function() { + var written = fs.readFileSync(tmpFile, 'utf8'); + assert.strictEqual(written, EXPECTED); + }); +})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/run.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/run.js new file mode 100755 index 0000000..0bb8e82 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/run.js @@ -0,0 +1,7 @@ +#!/usr/bin/env node +var far = require('far').create(); + +far.add(__dirname); +far.include(/test-.*\.js$/); + +far.execute(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/package.json b/node_modules/nodetime/node_modules/request/node_modules/form-data/package.json new file mode 100644 index 0000000..1948a5e --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/package.json @@ -0,0 +1,43 @@ +{ + "author": { + "name": "Felix Geisendörfer", + "email": "felix@debuggable.com", + "url": "http://debuggable.com/" + }, + "name": "form-data", + "description": "A module to create readable `\"multipart/form-data\"` streams. Can be used to submit forms and file uploads to other web applications.", + "version": "0.0.3", + "repository": { + "type": "git", + "url": "git://github.com/felixge/node-form-data.git" + }, + "main": "./lib/form_data", + "engines": { + "node": "*" + }, + "dependencies": { + "combined-stream": "0.0.3", + "mime": "~1.2.2", + "async": "~0.1.9" + }, + "devDependencies": { + "fake": "0.2.1", + "far": "0.0.1", + "formidable": "1.0.2", + "request": "~2.9.203" + }, + "_npmUser": { + "name": "mikeal", + "email": "mikeal.rogers@gmail.com" + }, + "_id": "form-data@0.0.3", + "optionalDependencies": {}, + "_engineSupported": true, + "_npmVersion": "1.1.24", + "_nodeVersion": "v0.8.1", + "_defaultsLoaded": true, + "dist": { + "shasum": "6eea17b45790b42d779a1d581d1b3600fe0c7c0d" + }, + "_from": "form-data" +} diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/common.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/common.js new file mode 100644 index 0000000..8a26482 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/common.js @@ -0,0 +1,14 @@ +var common = module.exports; +var path = require('path'); + +var rootDir = path.join(__dirname, '..'); +common.dir = { + lib: rootDir + '/lib', + fixture: rootDir + '/test/fixture', + tmp: rootDir + '/test/tmp', +}; + +common.assert = require('assert'); +common.fake = require('fake'); + +common.port = 8432; diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/fixture/bacon.txt b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/fixture/bacon.txt new file mode 100644 index 0000000..9804bbd --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/fixture/bacon.txt @@ -0,0 +1 @@ +Bacon is delicious. diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/fixture/unicycle.jpg b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/fixture/unicycle.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7cea4dd71dc41cd51c84bfcec6b3e65c15a58507 GIT binary patch literal 19806 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 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-form-get-length.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-form-get-length.js new file mode 100644 index 0000000..44d3b4d --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-form-get-length.js @@ -0,0 +1,93 @@ +var common = require('../common'); +var assert = common.assert; +var FormData = require(common.dir.lib + '/form_data'); +var fake = require('fake').create(); +var fs = require('fs'); + +(function testEmptyForm() { + var form = new FormData(); + var callback = fake.callback(arguments.callee.name + '-getLength'); + var calls = fake.expectAnytime(callback, [null, 0]).calls; + + form.getLength(callback); + + // Make sure our response is async + assert.strictEqual(calls.length, 0); +})(); + +(function testUtf8String() { + var FIELD = 'my_field'; + var VALUE = 'May the € be with you'; + + var form = new FormData(); + form.append(FIELD, VALUE); + var callback = fake.callback(arguments.callee.name + '-getLength'); + + var expectedLength = + form._overheadLength + + Buffer.byteLength(VALUE) + + form._lastBoundary().length; + + fake.expectAnytime(callback, [null, expectedLength]); + form.getLength(callback); +})(); + +(function testBuffer() { + var FIELD = 'my_field'; + var VALUE = new Buffer(23); + + var form = new FormData(); + form.append(FIELD, VALUE); + var callback = fake.callback(arguments.callee.name + '-getLength'); + + var expectedLength = + form._overheadLength + + VALUE.length + + form._lastBoundary().length; + + fake.expectAnytime(callback, [null, expectedLength]); + form.getLength(callback); +})(); + + +(function testStringFileBufferFile() { + var fields = [ + { + name: 'my_field', + value: 'Test 123', + }, + { + name: 'my_image', + value: fs.createReadStream(common.dir.fixture + '/unicycle.jpg'), + }, + { + name: 'my_buffer', + value: new Buffer('123'), + }, + { + name: 'my_txt', + value: fs.createReadStream(common.dir.fixture + '/bacon.txt'), + }, + ]; + + var form = new FormData(); + var expectedLength = 0; + + fields.forEach(function(field) { + form.append(field.name, field.value); + if (field.value.path) { + var stat = fs.statSync(field.value.path); + expectedLength += stat.size; + } else { + expectedLength += field.value.length; + } + }); + + expectedLength += form._overheadLength + form._lastBoundary().length; + + var callback = fake.callback(arguments.callee.name + '-getLength'); + fake.expectAnytime(callback, [null, expectedLength]); + form.getLength(callback); +})(); + + diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-get-boundary.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-get-boundary.js new file mode 100644 index 0000000..6dc2fb2 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-get-boundary.js @@ -0,0 +1,18 @@ +var common = require('../common'); +var assert = common.assert; + +var FormData = require(common.dir.lib + '/form_data'); + +(function testOneBoundaryPerForm() { + var form = new FormData(); + var boundary = form.getBoundary(); + + assert.equal(boundary, form.getBoundary()); + assert.equal(boundary.length, 50); +})(); + +(function testUniqueBoundaryPerForm() { + var formA = new FormData(); + var formB = new FormData(); + assert.notEqual(formA.getBoundary(), formB.getBoundary()); +})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-http-response.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-http-response.js new file mode 100644 index 0000000..8e183fe --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-http-response.js @@ -0,0 +1,121 @@ +var common = require('../common'); +var assert = common.assert; +var http = require('http'); +var path = require('path'); +var mime = require('mime'); +var request = require('request'); +var parseUrl = require('url').parse; +var fs = require('fs'); +var FormData = require(common.dir.lib + '/form_data'); +var IncomingForm = require('formidable').IncomingForm; + +var remoteFile = 'http://nodejs.org/images/logo.png'; + +var FIELDS; +var server; + +var parsedUrl = parseUrl(remoteFile) + , options = { + method: 'get', + port: parsedUrl.port || 80, + path: parsedUrl.pathname, + host: parsedUrl.hostname + } + ; + +http.request(options, function(res) { + + FIELDS = [ + {name: 'my_field', value: 'my_value'}, + {name: 'my_buffer', value: new Buffer([1, 2, 3])}, + {name: 'remote_file', value: res } + ]; + + var form = new FormData(); + FIELDS.forEach(function(field) { + form.append(field.name, field.value); + }); + + server.listen(common.port, function() { + + form.submit('http://localhost:' + common.port + '/', function(err, res) { + + if (err) { + throw err; + } + + assert.strictEqual(res.statusCode, 200); + server.close(); + }); + + }); + + +}).end(); + +server = http.createServer(function(req, res) { + + // formidable is broken so let's do it manual way + // + // var form = new IncomingForm(); + // form.uploadDir = common.dir.tmp; + // form.parse(req); + // form + // .on('field', function(name, value) { + // var field = FIELDS.shift(); + // assert.strictEqual(name, field.name); + // assert.strictEqual(value, field.value+''); + // }) + // .on('file', function(name, file) { + // var field = FIELDS.shift(); + // assert.strictEqual(name, field.name); + // assert.strictEqual(file.name, path.basename(field.value.path)); + // // mime.lookup file.NAME == 'my_file' ? + // assert.strictEqual(file.type, mime.lookup(file.name)); + // }) + // .on('end', function() { + // res.writeHead(200); + // res.end('done'); + // }); + + // temp workaround + var data = ''; + req.setEncoding('utf8'); + + req.on('data', function(d) { + data += d; + }); + + req.on('end', function() { + + // check for the fields' traces + + // 1st field : my_field + var field = FIELDS.shift(); + assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); + assert.ok( data.indexOf(field.value) != -1 ); + + // 2nd field : my_buffer + var field = FIELDS.shift(); + assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); + assert.ok( data.indexOf(field.value) != -1 ); + + // 3rd field : remote_file + var field = FIELDS.shift(); + assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); + assert.ok( data.indexOf('; filename="'+path.basename(remoteFile)+'"') != -1 ); + // check for http://nodejs.org/images/logo.png traces + assert.ok( data.indexOf('ImageReady') != -1 ); + assert.ok( data.indexOf('Content-Type: '+mime.lookup(remoteFile) ) != -1 ); + + res.writeHead(200); + res.end('done'); + + }); + +}); + + +process.on('exit', function() { + assert.strictEqual(FIELDS.length, 0); +}); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-pipe.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-pipe.js new file mode 100644 index 0000000..acc39df --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-pipe.js @@ -0,0 +1,111 @@ +var common = require('../common'); +var assert = common.assert; +var http = require('http'); +var path = require('path'); +var mime = require('mime'); +var request = require('request'); +var fs = require('fs'); +var FormData = require(common.dir.lib + '/form_data'); +var IncomingForm = require('formidable').IncomingForm; + +var remoteFile = 'http://nodejs.org/images/logo.png'; + +var FIELDS = [ + {name: 'my_field', value: 'my_value'}, + {name: 'my_buffer', value: new Buffer([1, 2, 3])}, + {name: 'my_file', value: fs.createReadStream(common.dir.fixture + '/unicycle.jpg')}, + {name: 'remote_file', value: request(remoteFile) } +]; + +var server = http.createServer(function(req, res) { + + // formidable is broken so let's do it manual way + // + // var form = new IncomingForm(); + // form.uploadDir = common.dir.tmp; + // form.parse(req); + // form + // .on('field', function(name, value) { + // var field = FIELDS.shift(); + // assert.strictEqual(name, field.name); + // assert.strictEqual(value, field.value+''); + // }) + // .on('file', function(name, file) { + // var field = FIELDS.shift(); + // assert.strictEqual(name, field.name); + // assert.strictEqual(file.name, path.basename(field.value.path)); + // assert.strictEqual(file.type, mime.lookup(file.name)); + // }) + // .on('end', function() { + // res.writeHead(200); + // res.end('done'); + // }); + + // temp workaround + var data = ''; + req.setEncoding('utf8'); + + req.on('data', function(d) { + data += d; + }); + + req.on('end', function() { + // check for the fields' traces + + // 1st field : my_field + var field = FIELDS.shift(); + assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); + assert.ok( data.indexOf(field.value) != -1 ); + + // 2nd field : my_buffer + var field = FIELDS.shift(); + assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); + assert.ok( data.indexOf(field.value) != -1 ); + + // 3rd field : my_file + var field = FIELDS.shift(); + assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); + assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); + // check for unicycle.jpg traces + assert.ok( data.indexOf('2005:06:21 01:44:12') != -1 ); + assert.ok( data.indexOf('Content-Type: '+mime.lookup(field.value.path) ) != -1 ); + + // 4th field : remote_file + var field = FIELDS.shift(); + assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); + assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); + // check for http://nodejs.org/images/logo.png traces + assert.ok( data.indexOf('ImageReady') != -1 ); + assert.ok( data.indexOf('Content-Type: '+mime.lookup(remoteFile) ) != -1 ); + + res.writeHead(200); + res.end('done'); + + }); + + +}); + +server.listen(common.port, function() { + var form = new FormData(); + FIELDS.forEach(function(field) { + form.append(field.name, field.value); + }); + + var request = http.request({ + method: 'post', + port: common.port, + path: '/upload', + headers: form.getHeaders() + }); + + form.pipe(request); + + request.on('response', function(res) { + server.close(); + }); +}); + +process.on('exit', function() { + assert.strictEqual(FIELDS.length, 0); +}); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-submit.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-submit.js new file mode 100644 index 0000000..c40e88f --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-submit.js @@ -0,0 +1,107 @@ +var common = require('../common'); +var assert = common.assert; +var http = require('http'); +var path = require('path'); +var mime = require('mime'); +var request = require('request'); +var fs = require('fs'); +var FormData = require(common.dir.lib + '/form_data'); +var IncomingForm = require('formidable').IncomingForm; + +var remoteFile = 'http://nodejs.org/images/logo.png'; + +var FIELDS = [ + {name: 'my_field', value: 'my_value'}, + {name: 'my_buffer', value: new Buffer([1, 2, 3])}, + {name: 'my_file', value: fs.createReadStream(common.dir.fixture + '/unicycle.jpg') }, + {name: 'remote_file', value: request(remoteFile) } +]; + +var server = http.createServer(function(req, res) { + + // formidable is broken so let's do it manual way + // + // var form = new IncomingForm(); + // form.uploadDir = common.dir.tmp; + // form.parse(req); + // form + // .on('field', function(name, value) { + // var field = FIELDS.shift(); + // assert.strictEqual(name, field.name); + // assert.strictEqual(value, field.value+''); + // }) + // .on('file', function(name, file) { + // var field = FIELDS.shift(); + // assert.strictEqual(name, field.name); + // assert.strictEqual(file.name, path.basename(field.value.path)); + // // mime.lookup file.NAME == 'my_file' ? + // assert.strictEqual(file.type, mime.lookup(file.name)); + // }) + // .on('end', function() { + // res.writeHead(200); + // res.end('done'); + // }); + + // temp workaround + var data = ''; + req.setEncoding('utf8'); + req.on('data', function(d) { + data += d; + }); + req.on('end', function() { + // check for the fields' traces + + // 1st field : my_field + var field = FIELDS.shift(); + assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); + assert.ok( data.indexOf(field.value) != -1 ); + + // 2nd field : my_buffer + var field = FIELDS.shift(); + assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); + assert.ok( data.indexOf(field.value) != -1 ); + + // 3rd field : my_file + var field = FIELDS.shift(); + assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); + assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); + // check for unicycle.jpg traces + assert.ok( data.indexOf('2005:06:21 01:44:12') != -1 ); + assert.ok( data.indexOf('Content-Type: '+mime.lookup(field.value.path) ) != -1 ); + + // 4th field : remote_file + var field = FIELDS.shift(); + assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); + assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); + // check for http://nodejs.org/images/logo.png traces + assert.ok( data.indexOf('ImageReady') != -1 ); + assert.ok( data.indexOf('Content-Type: '+mime.lookup(remoteFile) ) != -1 ); + + res.writeHead(200); + res.end('done'); + + }); + +}); + +server.listen(common.port, function() { + var form = new FormData(); + FIELDS.forEach(function(field) { + form.append(field.name, field.value); + }); + + form.submit('http://localhost:' + common.port + '/', function(err, res) { + + if (err) { + throw err; + } + + assert.strictEqual(res.statusCode, 200); + server.close(); + }); + +}); + +process.on('exit', function() { + assert.strictEqual(FIELDS.length, 0); +}); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/run.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/run.js new file mode 100755 index 0000000..0bb8e82 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/run.js @@ -0,0 +1,7 @@ +#!/usr/bin/env node +var far = require('far').create(); + +far.add(__dirname); +far.include(/test-.*\.js$/); + +far.execute(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/mime/LICENSE b/node_modules/nodetime/node_modules/request/node_modules/mime/LICENSE new file mode 100644 index 0000000..451fc45 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/mime/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2010 Benjamin Thomas, Robert Kieffer + +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. diff --git a/node_modules/nodetime/node_modules/request/node_modules/mime/README.md b/node_modules/nodetime/node_modules/request/node_modules/mime/README.md new file mode 100644 index 0000000..b90552a --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/mime/README.md @@ -0,0 +1,63 @@ +# mime + +Comprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community. + +## Install + +Install with [npm](http://github.com/isaacs/npm): + + npm install mime + +## API - Queries + +### mime.lookup(path) +Get the mime type associated with a file. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g. + + var mime = require('mime'); + + mime.lookup('/path/to/file.txt'); // => 'text/plain' + mime.lookup('file.txt'); // => 'text/plain' + mime.lookup('.TXT'); // => 'text/plain' + mime.lookup('htm'); // => 'text/html' + +### mime.extension(type) +Get the default extension for `type` + + mime.extension('text/html'); // => 'html' + mime.extension('application/octet-stream'); // => 'bin' + +### mime.charsets.lookup() + +Map mime-type to charset + + mime.charsets.lookup('text/plain'); // => 'UTF-8' + +(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.) + +## API - Defining Custom Types + +The following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/broofa/node-mime/wiki/Requesting-New-Types). + +### mime.define() + +Add custom mime/extension mappings + + mime.define({ + 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'], + 'application/x-my-type': ['x-mt', 'x-mtt'], + // etc ... + }); + + mime.lookup('x-sft'); // => 'text/x-some-format' + +The first entry in the extensions array is returned by `mime.extension()`. E.g. + + mime.extension('text/x-some-format'); // => 'x-sf' + +### mime.load(filepath) + +Load mappings from an Apache ".types" format file + + mime.load('./my_project.types'); + +The .types file format is simple - See the `types` dir for examples. diff --git a/node_modules/nodetime/node_modules/request/node_modules/mime/mime.js b/node_modules/nodetime/node_modules/request/node_modules/mime/mime.js new file mode 100644 index 0000000..1e00585 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/mime/mime.js @@ -0,0 +1,104 @@ +var path = require('path'); +var fs = require('fs'); + +function Mime() { + // Map of extension -> mime type + this.types = Object.create(null); + + // Map of mime type -> extension + this.extensions = Object.create(null); +} + +/** + * Define mimetype -> extension mappings. Each key is a mime-type that maps + * to an array of extensions associated with the type. The first extension is + * used as the default extension for the type. + * + * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']}); + * + * @param map (Object) type definitions + */ +Mime.prototype.define = function (map) { + for (var type in map) { + var exts = map[type]; + + for (var i = 0; i < exts.length; i++) { + this.types[exts[i]] = type; + } + + // Default extension is the first one we encounter + if (!this.extensions[type]) { + this.extensions[type] = exts[0]; + } + } +}; + +/** + * Load an Apache2-style ".types" file + * + * This may be called multiple times (it's expected). Where files declare + * overlapping types/extensions, the last file wins. + * + * @param file (String) path of file to load. + */ +Mime.prototype.load = function(file) { + // Read file and split into lines + var map = {}, + content = fs.readFileSync(file, 'ascii'), + lines = content.split(/[\r\n]+/); + + lines.forEach(function(line) { + // Clean up whitespace/comments, and split into fields + var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/); + map[fields.shift()] = fields; + }); + + this.define(map); +}; + +/** + * Lookup a mime type based on extension + */ +Mime.prototype.lookup = function(path, fallback) { + var ext = path.replace(/.*[\.\/]/, '').toLowerCase(); + + return this.types[ext] || fallback || this.default_type; +}; + +/** + * Return file extension associated with a mime type + */ +Mime.prototype.extension = function(mimeType) { + return this.extensions[mimeType]; +}; + +// Default instance +var mime = new Mime(); + +// Load local copy of +// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types +mime.load(path.join(__dirname, 'types/mime.types')); + +// Load additional types from node.js community +mime.load(path.join(__dirname, 'types/node.types')); + +// Default type +mime.default_type = mime.lookup('bin'); + +// +// Additional API specific to the default instance +// + +mime.Mime = Mime; + +/** + * Lookup a charset based on mime type. + */ +mime.charsets = { + lookup: function(mimeType, fallback) { + // Assume text types are utf8 + return (/^text\//).test(mimeType) ? 'UTF-8' : fallback; + } +} + +module.exports = mime; diff --git a/node_modules/nodetime/node_modules/request/node_modules/mime/package.json b/node_modules/nodetime/node_modules/request/node_modules/mime/package.json new file mode 100644 index 0000000..06e2ee5 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/mime/package.json @@ -0,0 +1,42 @@ +{ + "author": { + "name": "Robert Kieffer", + "email": "robert@broofa.com", + "url": "http://github.com/broofa" + }, + "contributors": [ + { + "name": "Benjamin Thomas", + "email": "benjamin@benjaminthomas.org", + "url": "http://github.com/bentomas" + } + ], + "dependencies": {}, + "description": "A comprehensive library for mime-type mapping", + "devDependencies": {}, + "keywords": [ + "util", + "mime" + ], + "main": "mime.js", + "name": "mime", + "repository": { + "url": "git://github.com/broofa/node-mime.git", + "type": "git" + }, + "version": "1.2.7", + "_npmUser": { + "name": "mikeal", + "email": "mikeal.rogers@gmail.com" + }, + "_id": "mime@1.2.7", + "optionalDependencies": {}, + "engines": { + "node": "*" + }, + "_engineSupported": true, + "_npmVersion": "1.1.24", + "_nodeVersion": "v0.8.1", + "_defaultsLoaded": true, + "_from": "mime" +} diff --git a/node_modules/nodetime/node_modules/request/node_modules/mime/test.js b/node_modules/nodetime/node_modules/request/node_modules/mime/test.js new file mode 100644 index 0000000..cbad034 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/mime/test.js @@ -0,0 +1,55 @@ +/** + * Usage: node test.js + */ + +var mime = require('./mime'); +var assert = require('assert'); + +function eq(a, b) { + console.log('Test: ' + a + ' === ' + b); + assert.strictEqual.apply(null, arguments); +} + +console.log(Object.keys(mime.extensions).length + ' types'); +console.log(Object.keys(mime.types).length + ' extensions\n'); + +// +// Test mime lookups +// + +eq('text/plain', mime.lookup('text.txt')); +eq('text/plain', mime.lookup('.text.txt')); +eq('text/plain', mime.lookup('.txt')); +eq('text/plain', mime.lookup('txt')); +eq('application/octet-stream', mime.lookup('text.nope')); +eq('fallback', mime.lookup('text.fallback', 'fallback')); +eq('application/octet-stream', mime.lookup('constructor')); +eq('text/plain', mime.lookup('TEXT.TXT')); +eq('text/event-stream', mime.lookup('text/event-stream')); +eq('application/x-web-app-manifest+json', mime.lookup('text.webapp')); + +// +// Test extensions +// + +eq('txt', mime.extension(mime.types.text)); +eq('html', mime.extension(mime.types.htm)); +eq('bin', mime.extension('application/octet-stream')); +eq(undefined, mime.extension('constructor')); + +// +// Test node types +// + +eq('application/octet-stream', mime.lookup('file.buffer')); +eq('audio/mp4', mime.lookup('file.m4a')); + +// +// Test charsets +// + +eq('UTF-8', mime.charsets.lookup('text/plain')); +eq(undefined, mime.charsets.lookup(mime.types.js)); +eq('fallback', mime.charsets.lookup('application/octet-stream', 'fallback')); + +console.log('\nOK'); diff --git a/node_modules/nodetime/node_modules/request/node_modules/mime/types/mime.types b/node_modules/nodetime/node_modules/request/node_modules/mime/types/mime.types new file mode 100644 index 0000000..b90b165 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/mime/types/mime.types @@ -0,0 +1,1588 @@ +# This file maps Internet media types to unique file extension(s). +# Although created for httpd, this file is used by many software systems +# and has been placed in the public domain for unlimited redisribution. +# +# The table below contains both registered and (common) unregistered types. +# A type that has no unique extension can be ignored -- they are listed +# here to guide configurations toward known types and to make it easier to +# identify "new" types. File extensions are also commonly used to indicate +# content languages and encodings, so choose them carefully. +# +# Internet media types should be registered as described in RFC 4288. +# The registry is at . +# +# MIME type (lowercased) Extensions +# ============================================ ========== +# application/1d-interleaved-parityfec +# application/3gpp-ims+xml +# application/activemessage +application/andrew-inset ez +# application/applefile +application/applixware aw +application/atom+xml atom +application/atomcat+xml atomcat +# application/atomicmail +application/atomsvc+xml atomsvc +# application/auth-policy+xml +# application/batch-smtp +# application/beep+xml +# application/calendar+xml +# application/cals-1840 +# application/ccmp+xml +application/ccxml+xml ccxml +application/cdmi-capability cdmia +application/cdmi-container cdmic +application/cdmi-domain cdmid +application/cdmi-object cdmio +application/cdmi-queue cdmiq +# application/cea-2018+xml +# application/cellml+xml +# application/cfw +# application/cnrp+xml +# application/commonground +# application/conference-info+xml +# application/cpl+xml +# application/csta+xml +# application/cstadata+xml +application/cu-seeme cu +# application/cybercash +application/davmount+xml davmount +# application/dca-rft +# application/dec-dx +# application/dialog-info+xml +# application/dicom +# application/dns +application/docbook+xml dbk +# application/dskpp+xml +application/dssc+der dssc +application/dssc+xml xdssc +# application/dvcs +application/ecmascript ecma +# application/edi-consent +# application/edi-x12 +# application/edifact +application/emma+xml emma +# application/epp+xml +application/epub+zip epub +# application/eshop +# application/example +application/exi exi +# application/fastinfoset +# application/fastsoap +# application/fits +application/font-tdpfr pfr +# application/framework-attributes+xml +application/gml+xml gml +application/gpx+xml gpx +application/gxf gxf +# application/h224 +# application/held+xml +# application/http +application/hyperstudio stk +# application/ibe-key-request+xml +# application/ibe-pkg-reply+xml +# application/ibe-pp-data +# application/iges +# application/im-iscomposing+xml +# application/index +# application/index.cmd +# application/index.obj +# application/index.response +# application/index.vnd +application/inkml+xml ink inkml +# application/iotp +application/ipfix ipfix +# application/ipp +# application/isup +application/java-archive jar +application/java-serialized-object ser +application/java-vm class +application/javascript js +application/json json +application/jsonml+json jsonml +# application/kpml-request+xml +# application/kpml-response+xml +application/lost+xml lostxml +application/mac-binhex40 hqx +application/mac-compactpro cpt +# application/macwriteii +application/mads+xml mads +application/marc mrc +application/marcxml+xml mrcx +application/mathematica ma nb mb +# application/mathml-content+xml +# application/mathml-presentation+xml +application/mathml+xml mathml +# application/mbms-associated-procedure-description+xml +# application/mbms-deregister+xml +# application/mbms-envelope+xml +# application/mbms-msk+xml +# application/mbms-msk-response+xml +# application/mbms-protection-description+xml +# application/mbms-reception-report+xml +# application/mbms-register+xml +# application/mbms-register-response+xml +# application/mbms-user-service-description+xml +application/mbox mbox +# application/media_control+xml +application/mediaservercontrol+xml mscml +application/metalink+xml metalink +application/metalink4+xml meta4 +application/mets+xml mets +# application/mikey +application/mods+xml mods +# application/moss-keys +# application/moss-signature +# application/mosskey-data +# application/mosskey-request +application/mp21 m21 mp21 +application/mp4 mp4s +# application/mpeg4-generic +# application/mpeg4-iod +# application/mpeg4-iod-xmt +# application/msc-ivr+xml +# application/msc-mixer+xml +application/msword doc dot +application/mxf mxf +# application/nasdata +# application/news-checkgroups +# application/news-groupinfo +# application/news-transmission +# application/nss +# application/ocsp-request +# application/ocsp-response +application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy +application/oda oda +application/oebps-package+xml opf +application/ogg ogx +application/omdoc+xml omdoc +application/onenote onetoc onetoc2 onetmp onepkg +application/oxps oxps +# application/parityfec +application/patch-ops-error+xml xer +application/pdf pdf +application/pgp-encrypted pgp +# application/pgp-keys +application/pgp-signature asc sig +application/pics-rules prf +# application/pidf+xml +# application/pidf-diff+xml +application/pkcs10 p10 +application/pkcs7-mime p7m p7c +application/pkcs7-signature p7s +application/pkcs8 p8 +application/pkix-attr-cert ac +application/pkix-cert cer +application/pkix-crl crl +application/pkix-pkipath pkipath +application/pkixcmp pki +application/pls+xml pls +# application/poc-settings+xml +application/postscript ai eps ps +# application/prs.alvestrand.titrax-sheet +application/prs.cww cww +# application/prs.nprend +# application/prs.plucker +# application/prs.rdf-xml-crypt +# application/prs.xsf+xml +application/pskc+xml pskcxml +# application/qsig +application/rdf+xml rdf +application/reginfo+xml rif +application/relax-ng-compact-syntax rnc +# application/remote-printing +application/resource-lists+xml rl +application/resource-lists-diff+xml rld +# application/riscos +# application/rlmi+xml +application/rls-services+xml rs +application/rpki-ghostbusters gbr +application/rpki-manifest mft +application/rpki-roa roa +# application/rpki-updown +application/rsd+xml rsd +application/rss+xml rss +application/rtf rtf +# application/rtx +# application/samlassertion+xml +# application/samlmetadata+xml +application/sbml+xml sbml +application/scvp-cv-request scq +application/scvp-cv-response scs +application/scvp-vp-request spq +application/scvp-vp-response spp +application/sdp sdp +# application/set-payment +application/set-payment-initiation setpay +# application/set-registration +application/set-registration-initiation setreg +# application/sgml +# application/sgml-open-catalog +application/shf+xml shf +# application/sieve +# application/simple-filter+xml +# application/simple-message-summary +# application/simplesymbolcontainer +# application/slate +# application/smil +application/smil+xml smi smil +# application/soap+fastinfoset +# application/soap+xml +application/sparql-query rq +application/sparql-results+xml srx +# application/spirits-event+xml +application/srgs gram +application/srgs+xml grxml +application/sru+xml sru +application/ssdl+xml ssdl +application/ssml+xml ssml +# application/tamp-apex-update +# application/tamp-apex-update-confirm +# application/tamp-community-update +# application/tamp-community-update-confirm +# application/tamp-error +# application/tamp-sequence-adjust +# application/tamp-sequence-adjust-confirm +# application/tamp-status-query +# application/tamp-status-response +# application/tamp-update +# application/tamp-update-confirm +application/tei+xml tei teicorpus +application/thraud+xml tfi +# application/timestamp-query +# application/timestamp-reply +application/timestamped-data tsd +# application/tve-trigger +# application/ulpfec +# application/vcard+xml +# application/vemmi +# application/vividence.scriptfile +# application/vnd.3gpp.bsf+xml +application/vnd.3gpp.pic-bw-large plb +application/vnd.3gpp.pic-bw-small psb +application/vnd.3gpp.pic-bw-var pvb +# application/vnd.3gpp.sms +# application/vnd.3gpp2.bcmcsinfo+xml +# application/vnd.3gpp2.sms +application/vnd.3gpp2.tcap tcap +application/vnd.3m.post-it-notes pwn +application/vnd.accpac.simply.aso aso +application/vnd.accpac.simply.imp imp +application/vnd.acucobol acu +application/vnd.acucorp atc acutc +application/vnd.adobe.air-application-installer-package+zip air +application/vnd.adobe.formscentral.fcdt fcdt +application/vnd.adobe.fxp fxp fxpl +# application/vnd.adobe.partial-upload +application/vnd.adobe.xdp+xml xdp +application/vnd.adobe.xfdf xfdf +# application/vnd.aether.imp +# application/vnd.ah-barcode +application/vnd.ahead.space ahead +application/vnd.airzip.filesecure.azf azf +application/vnd.airzip.filesecure.azs azs +application/vnd.amazon.ebook azw +application/vnd.americandynamics.acc acc +application/vnd.amiga.ami ami +# application/vnd.amundsen.maze+xml +application/vnd.android.package-archive apk +application/vnd.anser-web-certificate-issue-initiation cii +application/vnd.anser-web-funds-transfer-initiation fti +application/vnd.antix.game-component atx +application/vnd.apple.installer+xml mpkg +application/vnd.apple.mpegurl m3u8 +# application/vnd.arastra.swi +application/vnd.aristanetworks.swi swi +application/vnd.astraea-software.iota iota +application/vnd.audiograph aep +# application/vnd.autopackage +# application/vnd.avistar+xml +application/vnd.blueice.multipass mpm +# application/vnd.bluetooth.ep.oob +application/vnd.bmi bmi +application/vnd.businessobjects rep +# application/vnd.cab-jscript +# application/vnd.canon-cpdl +# application/vnd.canon-lips +# application/vnd.cendio.thinlinc.clientconf +application/vnd.chemdraw+xml cdxml +application/vnd.chipnuts.karaoke-mmd mmd +application/vnd.cinderella cdy +# application/vnd.cirpack.isdn-ext +application/vnd.claymore cla +application/vnd.cloanto.rp9 rp9 +application/vnd.clonk.c4group c4g c4d c4f c4p c4u +application/vnd.cluetrust.cartomobile-config c11amc +application/vnd.cluetrust.cartomobile-config-pkg c11amz +# application/vnd.collection+json +# application/vnd.commerce-battelle +application/vnd.commonspace csp +application/vnd.contact.cmsg cdbcmsg +application/vnd.cosmocaller cmc +application/vnd.crick.clicker clkx +application/vnd.crick.clicker.keyboard clkk +application/vnd.crick.clicker.palette clkp +application/vnd.crick.clicker.template clkt +application/vnd.crick.clicker.wordbank clkw +application/vnd.criticaltools.wbs+xml wbs +application/vnd.ctc-posml pml +# application/vnd.ctct.ws+xml +# application/vnd.cups-pdf +# application/vnd.cups-postscript +application/vnd.cups-ppd ppd +# application/vnd.cups-raster +# application/vnd.cups-raw +# application/vnd.curl +application/vnd.curl.car car +application/vnd.curl.pcurl pcurl +# application/vnd.cybank +application/vnd.dart dart +application/vnd.data-vision.rdz rdz +application/vnd.dece.data uvf uvvf uvd uvvd +application/vnd.dece.ttml+xml uvt uvvt +application/vnd.dece.unspecified uvx uvvx +application/vnd.dece.zip uvz uvvz +application/vnd.denovo.fcselayout-link fe_launch +# application/vnd.dir-bi.plate-dl-nosuffix +application/vnd.dna dna +application/vnd.dolby.mlp mlp +# application/vnd.dolby.mobile.1 +# application/vnd.dolby.mobile.2 +application/vnd.dpgraph dpg +application/vnd.dreamfactory dfac +application/vnd.ds-keypoint kpxx +application/vnd.dvb.ait ait +# application/vnd.dvb.dvbj +# application/vnd.dvb.esgcontainer +# application/vnd.dvb.ipdcdftnotifaccess +# application/vnd.dvb.ipdcesgaccess +# application/vnd.dvb.ipdcesgaccess2 +# application/vnd.dvb.ipdcesgpdd +# application/vnd.dvb.ipdcroaming +# application/vnd.dvb.iptv.alfec-base +# application/vnd.dvb.iptv.alfec-enhancement +# application/vnd.dvb.notif-aggregate-root+xml +# application/vnd.dvb.notif-container+xml +# application/vnd.dvb.notif-generic+xml +# application/vnd.dvb.notif-ia-msglist+xml +# application/vnd.dvb.notif-ia-registration-request+xml +# application/vnd.dvb.notif-ia-registration-response+xml +# application/vnd.dvb.notif-init+xml +# application/vnd.dvb.pfr +application/vnd.dvb.service svc +# application/vnd.dxr +application/vnd.dynageo geo +# application/vnd.easykaraoke.cdgdownload +# application/vnd.ecdis-update +application/vnd.ecowin.chart mag +# application/vnd.ecowin.filerequest +# application/vnd.ecowin.fileupdate +# application/vnd.ecowin.series +# application/vnd.ecowin.seriesrequest +# application/vnd.ecowin.seriesupdate +# application/vnd.emclient.accessrequest+xml +application/vnd.enliven nml +# application/vnd.eprints.data+xml +application/vnd.epson.esf esf +application/vnd.epson.msf msf +application/vnd.epson.quickanime qam +application/vnd.epson.salt slt +application/vnd.epson.ssf ssf +# application/vnd.ericsson.quickcall +application/vnd.eszigno3+xml es3 et3 +# application/vnd.etsi.aoc+xml +# application/vnd.etsi.cug+xml +# application/vnd.etsi.iptvcommand+xml +# application/vnd.etsi.iptvdiscovery+xml +# application/vnd.etsi.iptvprofile+xml +# application/vnd.etsi.iptvsad-bc+xml +# application/vnd.etsi.iptvsad-cod+xml +# application/vnd.etsi.iptvsad-npvr+xml +# application/vnd.etsi.iptvservice+xml +# application/vnd.etsi.iptvsync+xml +# application/vnd.etsi.iptvueprofile+xml +# application/vnd.etsi.mcid+xml +# application/vnd.etsi.overload-control-policy-dataset+xml +# application/vnd.etsi.sci+xml +# application/vnd.etsi.simservs+xml +# application/vnd.etsi.tsl+xml +# application/vnd.etsi.tsl.der +# application/vnd.eudora.data +application/vnd.ezpix-album ez2 +application/vnd.ezpix-package ez3 +# application/vnd.f-secure.mobile +application/vnd.fdf fdf +application/vnd.fdsn.mseed mseed +application/vnd.fdsn.seed seed dataless +# application/vnd.ffsns +# application/vnd.fints +application/vnd.flographit gph +application/vnd.fluxtime.clip ftc +# application/vnd.font-fontforge-sfd +application/vnd.framemaker fm frame maker book +application/vnd.frogans.fnc fnc +application/vnd.frogans.ltf ltf +application/vnd.fsc.weblaunch fsc +application/vnd.fujitsu.oasys oas +application/vnd.fujitsu.oasys2 oa2 +application/vnd.fujitsu.oasys3 oa3 +application/vnd.fujitsu.oasysgp fg5 +application/vnd.fujitsu.oasysprs bh2 +# application/vnd.fujixerox.art-ex +# application/vnd.fujixerox.art4 +# application/vnd.fujixerox.hbpl +application/vnd.fujixerox.ddd ddd +application/vnd.fujixerox.docuworks xdw +application/vnd.fujixerox.docuworks.binder xbd +# application/vnd.fut-misnet +application/vnd.fuzzysheet fzs +application/vnd.genomatix.tuxedo txd +# application/vnd.geocube+xml +application/vnd.geogebra.file ggb +application/vnd.geogebra.tool ggt +application/vnd.geometry-explorer gex gre +application/vnd.geonext gxt +application/vnd.geoplan g2w +application/vnd.geospace g3w +# application/vnd.globalplatform.card-content-mgt +# application/vnd.globalplatform.card-content-mgt-response +application/vnd.gmx gmx +application/vnd.google-earth.kml+xml kml +application/vnd.google-earth.kmz kmz +application/vnd.grafeq gqf gqs +# application/vnd.gridmp +application/vnd.groove-account gac +application/vnd.groove-help ghf +application/vnd.groove-identity-message gim +application/vnd.groove-injector grv +application/vnd.groove-tool-message gtm +application/vnd.groove-tool-template tpl +application/vnd.groove-vcard vcg +# application/vnd.hal+json +application/vnd.hal+xml hal +application/vnd.handheld-entertainment+xml zmm +application/vnd.hbci hbci +# application/vnd.hcl-bireports +application/vnd.hhe.lesson-player les +application/vnd.hp-hpgl hpgl +application/vnd.hp-hpid hpid +application/vnd.hp-hps hps +application/vnd.hp-jlyt jlt +application/vnd.hp-pcl pcl +application/vnd.hp-pclxl pclxl +# application/vnd.httphone +application/vnd.hydrostatix.sof-data sfd-hdstx +# application/vnd.hzn-3d-crossword +# application/vnd.ibm.afplinedata +# application/vnd.ibm.electronic-media +application/vnd.ibm.minipay mpy +application/vnd.ibm.modcap afp listafp list3820 +application/vnd.ibm.rights-management irm +application/vnd.ibm.secure-container sc +application/vnd.iccprofile icc icm +application/vnd.igloader igl +application/vnd.immervision-ivp ivp +application/vnd.immervision-ivu ivu +# application/vnd.informedcontrol.rms+xml +# application/vnd.informix-visionary +# application/vnd.infotech.project +# application/vnd.infotech.project+xml +# application/vnd.innopath.wamp.notification +application/vnd.insors.igm igm +application/vnd.intercon.formnet xpw xpx +application/vnd.intergeo i2g +# application/vnd.intertrust.digibox +# application/vnd.intertrust.nncp +application/vnd.intu.qbo qbo +application/vnd.intu.qfx qfx +# application/vnd.iptc.g2.conceptitem+xml +# application/vnd.iptc.g2.knowledgeitem+xml +# application/vnd.iptc.g2.newsitem+xml +# application/vnd.iptc.g2.newsmessage+xml +# application/vnd.iptc.g2.packageitem+xml +# application/vnd.iptc.g2.planningitem+xml +application/vnd.ipunplugged.rcprofile rcprofile +application/vnd.irepository.package+xml irp +application/vnd.is-xpr xpr +application/vnd.isac.fcs fcs +application/vnd.jam jam +# application/vnd.japannet-directory-service +# application/vnd.japannet-jpnstore-wakeup +# application/vnd.japannet-payment-wakeup +# application/vnd.japannet-registration +# application/vnd.japannet-registration-wakeup +# application/vnd.japannet-setstore-wakeup +# application/vnd.japannet-verification +# application/vnd.japannet-verification-wakeup +application/vnd.jcp.javame.midlet-rms rms +application/vnd.jisp jisp +application/vnd.joost.joda-archive joda +application/vnd.kahootz ktz ktr +application/vnd.kde.karbon karbon +application/vnd.kde.kchart chrt +application/vnd.kde.kformula kfo +application/vnd.kde.kivio flw +application/vnd.kde.kontour kon +application/vnd.kde.kpresenter kpr kpt +application/vnd.kde.kspread ksp +application/vnd.kde.kword kwd kwt +application/vnd.kenameaapp htke +application/vnd.kidspiration kia +application/vnd.kinar kne knp +application/vnd.koan skp skd skt skm +application/vnd.kodak-descriptor sse +application/vnd.las.las+xml lasxml +# application/vnd.liberty-request+xml +application/vnd.llamagraphics.life-balance.desktop lbd +application/vnd.llamagraphics.life-balance.exchange+xml lbe +application/vnd.lotus-1-2-3 123 +application/vnd.lotus-approach apr +application/vnd.lotus-freelance pre +application/vnd.lotus-notes nsf +application/vnd.lotus-organizer org +application/vnd.lotus-screencam scm +application/vnd.lotus-wordpro lwp +application/vnd.macports.portpkg portpkg +# application/vnd.marlin.drm.actiontoken+xml +# application/vnd.marlin.drm.conftoken+xml +# application/vnd.marlin.drm.license+xml +# application/vnd.marlin.drm.mdcf +application/vnd.mcd mcd +application/vnd.medcalcdata mc1 +application/vnd.mediastation.cdkey cdkey +# application/vnd.meridian-slingshot +application/vnd.mfer mwf +application/vnd.mfmp mfm +application/vnd.micrografx.flo flo +application/vnd.micrografx.igx igx +application/vnd.mif mif +# application/vnd.minisoft-hp3000-save +# application/vnd.mitsubishi.misty-guard.trustweb +application/vnd.mobius.daf daf +application/vnd.mobius.dis dis +application/vnd.mobius.mbk mbk +application/vnd.mobius.mqy mqy +application/vnd.mobius.msl msl +application/vnd.mobius.plc plc +application/vnd.mobius.txf txf +application/vnd.mophun.application mpn +application/vnd.mophun.certificate mpc +# application/vnd.motorola.flexsuite +# application/vnd.motorola.flexsuite.adsi +# application/vnd.motorola.flexsuite.fis +# application/vnd.motorola.flexsuite.gotap +# application/vnd.motorola.flexsuite.kmr +# application/vnd.motorola.flexsuite.ttc +# application/vnd.motorola.flexsuite.wem +# application/vnd.motorola.iprm +application/vnd.mozilla.xul+xml xul +application/vnd.ms-artgalry cil +# application/vnd.ms-asf +application/vnd.ms-cab-compressed cab +# application/vnd.ms-color.iccprofile +application/vnd.ms-excel xls xlm xla xlc xlt xlw +application/vnd.ms-excel.addin.macroenabled.12 xlam +application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb +application/vnd.ms-excel.sheet.macroenabled.12 xlsm +application/vnd.ms-excel.template.macroenabled.12 xltm +application/vnd.ms-fontobject eot +application/vnd.ms-htmlhelp chm +application/vnd.ms-ims ims +application/vnd.ms-lrm lrm +# application/vnd.ms-office.activex+xml +application/vnd.ms-officetheme thmx +# application/vnd.ms-opentype +# application/vnd.ms-package.obfuscated-opentype +application/vnd.ms-pki.seccat cat +application/vnd.ms-pki.stl stl +# application/vnd.ms-playready.initiator+xml +application/vnd.ms-powerpoint ppt pps pot +application/vnd.ms-powerpoint.addin.macroenabled.12 ppam +application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm +application/vnd.ms-powerpoint.slide.macroenabled.12 sldm +application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm +application/vnd.ms-powerpoint.template.macroenabled.12 potm +# application/vnd.ms-printing.printticket+xml +application/vnd.ms-project mpp mpt +# application/vnd.ms-tnef +# application/vnd.ms-wmdrm.lic-chlg-req +# application/vnd.ms-wmdrm.lic-resp +# application/vnd.ms-wmdrm.meter-chlg-req +# application/vnd.ms-wmdrm.meter-resp +application/vnd.ms-word.document.macroenabled.12 docm +application/vnd.ms-word.template.macroenabled.12 dotm +application/vnd.ms-works wps wks wcm wdb +application/vnd.ms-wpl wpl +application/vnd.ms-xpsdocument xps +application/vnd.mseq mseq +# application/vnd.msign +# application/vnd.multiad.creator +# application/vnd.multiad.creator.cif +# application/vnd.music-niff +application/vnd.musician mus +application/vnd.muvee.style msty +application/vnd.mynfc taglet +# application/vnd.ncd.control +# application/vnd.ncd.reference +# application/vnd.nervana +# application/vnd.netfpx +application/vnd.neurolanguage.nlu nlu +application/vnd.nitf ntf nitf +application/vnd.noblenet-directory nnd +application/vnd.noblenet-sealer nns +application/vnd.noblenet-web nnw +# application/vnd.nokia.catalogs +# application/vnd.nokia.conml+wbxml +# application/vnd.nokia.conml+xml +# application/vnd.nokia.isds-radio-presets +# application/vnd.nokia.iptv.config+xml +# application/vnd.nokia.landmark+wbxml +# application/vnd.nokia.landmark+xml +# application/vnd.nokia.landmarkcollection+xml +# application/vnd.nokia.n-gage.ac+xml +application/vnd.nokia.n-gage.data ngdat +application/vnd.nokia.n-gage.symbian.install n-gage +# application/vnd.nokia.ncd +# application/vnd.nokia.pcd+wbxml +# application/vnd.nokia.pcd+xml +application/vnd.nokia.radio-preset rpst +application/vnd.nokia.radio-presets rpss +application/vnd.novadigm.edm edm +application/vnd.novadigm.edx edx +application/vnd.novadigm.ext ext +# application/vnd.ntt-local.file-transfer +# application/vnd.ntt-local.sip-ta_remote +# application/vnd.ntt-local.sip-ta_tcp_stream +application/vnd.oasis.opendocument.chart odc +application/vnd.oasis.opendocument.chart-template otc +application/vnd.oasis.opendocument.database odb +application/vnd.oasis.opendocument.formula odf +application/vnd.oasis.opendocument.formula-template odft +application/vnd.oasis.opendocument.graphics odg +application/vnd.oasis.opendocument.graphics-template otg +application/vnd.oasis.opendocument.image odi +application/vnd.oasis.opendocument.image-template oti +application/vnd.oasis.opendocument.presentation odp +application/vnd.oasis.opendocument.presentation-template otp +application/vnd.oasis.opendocument.spreadsheet ods +application/vnd.oasis.opendocument.spreadsheet-template ots +application/vnd.oasis.opendocument.text odt +application/vnd.oasis.opendocument.text-master odm +application/vnd.oasis.opendocument.text-template ott +application/vnd.oasis.opendocument.text-web oth +# application/vnd.obn +# application/vnd.oftn.l10n+json +# application/vnd.oipf.contentaccessdownload+xml +# application/vnd.oipf.contentaccessstreaming+xml +# application/vnd.oipf.cspg-hexbinary +# application/vnd.oipf.dae.svg+xml +# application/vnd.oipf.dae.xhtml+xml +# application/vnd.oipf.mippvcontrolmessage+xml +# application/vnd.oipf.pae.gem +# application/vnd.oipf.spdiscovery+xml +# application/vnd.oipf.spdlist+xml +# application/vnd.oipf.ueprofile+xml +# application/vnd.oipf.userprofile+xml +application/vnd.olpc-sugar xo +# application/vnd.oma-scws-config +# application/vnd.oma-scws-http-request +# application/vnd.oma-scws-http-response +# application/vnd.oma.bcast.associated-procedure-parameter+xml +# application/vnd.oma.bcast.drm-trigger+xml +# application/vnd.oma.bcast.imd+xml +# application/vnd.oma.bcast.ltkm +# application/vnd.oma.bcast.notification+xml +# application/vnd.oma.bcast.provisioningtrigger +# application/vnd.oma.bcast.sgboot +# application/vnd.oma.bcast.sgdd+xml +# application/vnd.oma.bcast.sgdu +# application/vnd.oma.bcast.simple-symbol-container +# application/vnd.oma.bcast.smartcard-trigger+xml +# application/vnd.oma.bcast.sprov+xml +# application/vnd.oma.bcast.stkm +# application/vnd.oma.cab-address-book+xml +# application/vnd.oma.cab-feature-handler+xml +# application/vnd.oma.cab-pcc+xml +# application/vnd.oma.cab-user-prefs+xml +# application/vnd.oma.dcd +# application/vnd.oma.dcdc +application/vnd.oma.dd2+xml dd2 +# application/vnd.oma.drm.risd+xml +# application/vnd.oma.group-usage-list+xml +# application/vnd.oma.pal+xml +# application/vnd.oma.poc.detailed-progress-report+xml +# application/vnd.oma.poc.final-report+xml +# application/vnd.oma.poc.groups+xml +# application/vnd.oma.poc.invocation-descriptor+xml +# application/vnd.oma.poc.optimized-progress-report+xml +# application/vnd.oma.push +# application/vnd.oma.scidm.messages+xml +# application/vnd.oma.xcap-directory+xml +# application/vnd.omads-email+xml +# application/vnd.omads-file+xml +# application/vnd.omads-folder+xml +# application/vnd.omaloc-supl-init +application/vnd.openofficeorg.extension oxt +# application/vnd.openxmlformats-officedocument.custom-properties+xml +# application/vnd.openxmlformats-officedocument.customxmlproperties+xml +# application/vnd.openxmlformats-officedocument.drawing+xml +# application/vnd.openxmlformats-officedocument.drawingml.chart+xml +# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml +# application/vnd.openxmlformats-officedocument.extended-properties+xml +# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml +# application/vnd.openxmlformats-officedocument.presentationml.comments+xml +# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml +# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml +# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml +application/vnd.openxmlformats-officedocument.presentationml.presentation pptx +# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml +application/vnd.openxmlformats-officedocument.presentationml.slide sldx +# application/vnd.openxmlformats-officedocument.presentationml.slide+xml +# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml +# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml +application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx +# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml +# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml +# application/vnd.openxmlformats-officedocument.presentationml.tags+xml +application/vnd.openxmlformats-officedocument.presentationml.template potx +# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx +# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx +# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml +# application/vnd.openxmlformats-officedocument.theme+xml +# application/vnd.openxmlformats-officedocument.themeoverride+xml +# application/vnd.openxmlformats-officedocument.vmldrawing +# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.document docx +# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx +# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml +# application/vnd.openxmlformats-package.core-properties+xml +# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml +# application/vnd.openxmlformats-package.relationships+xml +# application/vnd.quobject-quoxdocument +# application/vnd.osa.netdeploy +application/vnd.osgeo.mapguide.package mgp +# application/vnd.osgi.bundle +application/vnd.osgi.dp dp +application/vnd.osgi.subsystem esa +# application/vnd.otps.ct-kip+xml +application/vnd.palm pdb pqa oprc +# application/vnd.paos.xml +application/vnd.pawaafile paw +application/vnd.pg.format str +application/vnd.pg.osasli ei6 +# application/vnd.piaccess.application-licence +application/vnd.picsel efif +application/vnd.pmi.widget wg +# application/vnd.poc.group-advertisement+xml +application/vnd.pocketlearn plf +application/vnd.powerbuilder6 pbd +# application/vnd.powerbuilder6-s +# application/vnd.powerbuilder7 +# application/vnd.powerbuilder7-s +# application/vnd.powerbuilder75 +# application/vnd.powerbuilder75-s +# application/vnd.preminet +application/vnd.previewsystems.box box +application/vnd.proteus.magazine mgz +application/vnd.publishare-delta-tree qps +application/vnd.pvi.ptid1 ptid +# application/vnd.pwg-multiplexed +# application/vnd.pwg-xhtml-print+xml +# application/vnd.qualcomm.brew-app-res +application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb +# application/vnd.radisys.moml+xml +# application/vnd.radisys.msml+xml +# application/vnd.radisys.msml-audit+xml +# application/vnd.radisys.msml-audit-conf+xml +# application/vnd.radisys.msml-audit-conn+xml +# application/vnd.radisys.msml-audit-dialog+xml +# application/vnd.radisys.msml-audit-stream+xml +# application/vnd.radisys.msml-conf+xml +# application/vnd.radisys.msml-dialog+xml +# application/vnd.radisys.msml-dialog-base+xml +# application/vnd.radisys.msml-dialog-fax-detect+xml +# application/vnd.radisys.msml-dialog-fax-sendrecv+xml +# application/vnd.radisys.msml-dialog-group+xml +# application/vnd.radisys.msml-dialog-speech+xml +# application/vnd.radisys.msml-dialog-transform+xml +# application/vnd.rainstor.data +# application/vnd.rapid +application/vnd.realvnc.bed bed +application/vnd.recordare.musicxml mxl +application/vnd.recordare.musicxml+xml musicxml +# application/vnd.renlearn.rlprint +application/vnd.rig.cryptonote cryptonote +application/vnd.rim.cod cod +application/vnd.rn-realmedia rm +application/vnd.rn-realmedia-vbr rmvb +application/vnd.route66.link66+xml link66 +# application/vnd.rs-274x +# application/vnd.ruckus.download +# application/vnd.s3sms +application/vnd.sailingtracker.track st +# application/vnd.sbm.cid +# application/vnd.sbm.mid2 +# application/vnd.scribus +# application/vnd.sealed.3df +# application/vnd.sealed.csf +# application/vnd.sealed.doc +# application/vnd.sealed.eml +# application/vnd.sealed.mht +# application/vnd.sealed.net +# application/vnd.sealed.ppt +# application/vnd.sealed.tiff +# application/vnd.sealed.xls +# application/vnd.sealedmedia.softseal.html +# application/vnd.sealedmedia.softseal.pdf +application/vnd.seemail see +application/vnd.sema sema +application/vnd.semd semd +application/vnd.semf semf +application/vnd.shana.informed.formdata ifm +application/vnd.shana.informed.formtemplate itp +application/vnd.shana.informed.interchange iif +application/vnd.shana.informed.package ipk +application/vnd.simtech-mindmapper twd twds +application/vnd.smaf mmf +# application/vnd.smart.notebook +application/vnd.smart.teacher teacher +# application/vnd.software602.filler.form+xml +# application/vnd.software602.filler.form-xml-zip +application/vnd.solent.sdkm+xml sdkm sdkd +application/vnd.spotfire.dxp dxp +application/vnd.spotfire.sfs sfs +# application/vnd.sss-cod +# application/vnd.sss-dtf +# application/vnd.sss-ntf +application/vnd.stardivision.calc sdc +application/vnd.stardivision.draw sda +application/vnd.stardivision.impress sdd +application/vnd.stardivision.math smf +application/vnd.stardivision.writer sdw vor +application/vnd.stardivision.writer-global sgl +application/vnd.stepmania.package smzip +application/vnd.stepmania.stepchart sm +# application/vnd.street-stream +application/vnd.sun.xml.calc sxc +application/vnd.sun.xml.calc.template stc +application/vnd.sun.xml.draw sxd +application/vnd.sun.xml.draw.template std +application/vnd.sun.xml.impress sxi +application/vnd.sun.xml.impress.template sti +application/vnd.sun.xml.math sxm +application/vnd.sun.xml.writer sxw +application/vnd.sun.xml.writer.global sxg +application/vnd.sun.xml.writer.template stw +# application/vnd.sun.wadl+xml +application/vnd.sus-calendar sus susp +application/vnd.svd svd +# application/vnd.swiftview-ics +application/vnd.symbian.install sis sisx +application/vnd.syncml+xml xsm +application/vnd.syncml.dm+wbxml bdm +application/vnd.syncml.dm+xml xdm +# application/vnd.syncml.dm.notification +# application/vnd.syncml.ds.notification +application/vnd.tao.intent-module-archive tao +application/vnd.tcpdump.pcap pcap cap dmp +application/vnd.tmobile-livetv tmo +application/vnd.trid.tpt tpt +application/vnd.triscape.mxs mxs +application/vnd.trueapp tra +# application/vnd.truedoc +# application/vnd.ubisoft.webplayer +application/vnd.ufdl ufd ufdl +application/vnd.uiq.theme utz +application/vnd.umajin umj +application/vnd.unity unityweb +application/vnd.uoml+xml uoml +# application/vnd.uplanet.alert +# application/vnd.uplanet.alert-wbxml +# application/vnd.uplanet.bearer-choice +# application/vnd.uplanet.bearer-choice-wbxml +# application/vnd.uplanet.cacheop +# application/vnd.uplanet.cacheop-wbxml +# application/vnd.uplanet.channel +# application/vnd.uplanet.channel-wbxml +# application/vnd.uplanet.list +# application/vnd.uplanet.list-wbxml +# application/vnd.uplanet.listcmd +# application/vnd.uplanet.listcmd-wbxml +# application/vnd.uplanet.signal +application/vnd.vcx vcx +# application/vnd.vd-study +# application/vnd.vectorworks +# application/vnd.verimatrix.vcas +# application/vnd.vidsoft.vidconference +application/vnd.visio vsd vst vss vsw +application/vnd.visionary vis +# application/vnd.vividence.scriptfile +application/vnd.vsf vsf +# application/vnd.wap.sic +# application/vnd.wap.slc +application/vnd.wap.wbxml wbxml +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/vnd.webturbo wtb +# application/vnd.wfa.wsc +# application/vnd.wmc +# application/vnd.wmf.bootstrap +# application/vnd.wolfram.mathematica +# application/vnd.wolfram.mathematica.package +application/vnd.wolfram.player nbp +application/vnd.wordperfect wpd +application/vnd.wqd wqd +# application/vnd.wrq-hp3000-labelled +application/vnd.wt.stf stf +# application/vnd.wv.csp+wbxml +# application/vnd.wv.csp+xml +# application/vnd.wv.ssp+xml +application/vnd.xara xar +application/vnd.xfdl xfdl +# application/vnd.xfdl.webform +# application/vnd.xmi+xml +# application/vnd.xmpie.cpkg +# application/vnd.xmpie.dpkg +# application/vnd.xmpie.plan +# application/vnd.xmpie.ppkg +# application/vnd.xmpie.xlim +application/vnd.yamaha.hv-dic hvd +application/vnd.yamaha.hv-script hvs +application/vnd.yamaha.hv-voice hvp +application/vnd.yamaha.openscoreformat osf +application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg +# application/vnd.yamaha.remote-setup +application/vnd.yamaha.smaf-audio saf +application/vnd.yamaha.smaf-phrase spf +# application/vnd.yamaha.through-ngn +# application/vnd.yamaha.tunnel-udpencap +application/vnd.yellowriver-custom-menu cmp +application/vnd.zul zir zirz +application/vnd.zzazz.deck+xml zaz +application/voicexml+xml vxml +# application/vq-rtcpxr +# application/watcherinfo+xml +# application/whoispp-query +# application/whoispp-response +application/widget wgt +application/winhlp hlp +# application/wita +# application/wordperfect5.1 +application/wsdl+xml wsdl +application/wspolicy+xml wspolicy +application/x-7z-compressed 7z +application/x-abiword abw +application/x-ace-compressed ace +# application/x-amf +application/x-apple-diskimage dmg +application/x-authorware-bin aab x32 u32 vox +application/x-authorware-map aam +application/x-authorware-seg aas +application/x-bcpio bcpio +application/x-bittorrent torrent +application/x-blorb blb blorb +application/x-bzip bz +application/x-bzip2 bz2 boz +application/x-cbr cbr cba cbt cbz cb7 +application/x-cdlink vcd +application/x-cfs-compressed cfs +application/x-chat chat +application/x-chess-pgn pgn +application/x-conference nsc +# application/x-compress +application/x-cpio cpio +application/x-csh csh +application/x-debian-package deb udeb +application/x-dgc-compressed dgc +application/x-director dir dcr dxr cst cct cxt w3d fgd swa +application/x-doom wad +application/x-dtbncx+xml ncx +application/x-dtbook+xml dtb +application/x-dtbresource+xml res +application/x-dvi dvi +application/x-envoy evy +application/x-eva eva +application/x-font-bdf bdf +# application/x-font-dos +# application/x-font-framemaker +application/x-font-ghostscript gsf +# application/x-font-libgrx +application/x-font-linux-psf psf +application/x-font-otf otf +application/x-font-pcf pcf +application/x-font-snf snf +# application/x-font-speedo +# application/x-font-sunos-news +application/x-font-ttf ttf ttc +application/x-font-type1 pfa pfb pfm afm +application/x-font-woff woff +# application/x-font-vfont +application/x-freearc arc +application/x-futuresplash spl +application/x-gca-compressed gca +application/x-glulx ulx +application/x-gnumeric gnumeric +application/x-gramps-xml gramps +application/x-gtar gtar +# application/x-gzip +application/x-hdf hdf +application/x-install-instructions install +application/x-iso9660-image iso +application/x-java-jnlp-file jnlp +application/x-latex latex +application/x-lzh-compressed lzh lha +application/x-mie mie +application/x-mobipocket-ebook prc mobi +application/x-ms-application application +application/x-ms-shortcut lnk +application/x-ms-wmd wmd +application/x-ms-wmz wmz +application/x-ms-xbap xbap +application/x-msaccess mdb +application/x-msbinder obd +application/x-mscardfile crd +application/x-msclip clp +application/x-msdownload exe dll com bat msi +application/x-msmediaview mvb m13 m14 +application/x-msmetafile wmf wmz emf emz +application/x-msmoney mny +application/x-mspublisher pub +application/x-msschedule scd +application/x-msterminal trm +application/x-mswrite wri +application/x-netcdf nc cdf +application/x-nzb nzb +application/x-pkcs12 p12 pfx +application/x-pkcs7-certificates p7b spc +application/x-pkcs7-certreqresp p7r +application/x-rar-compressed rar +application/x-research-info-systems ris +application/x-sh sh +application/x-shar shar +application/x-shockwave-flash swf +application/x-silverlight-app xap +application/x-sql sql +application/x-stuffit sit +application/x-stuffitx sitx +application/x-subrip srt +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-t3vm-image t3 +application/x-tads gam +application/x-tar tar +application/x-tcl tcl +application/x-tex tex +application/x-tex-tfm tfm +application/x-texinfo texinfo texi +application/x-tgif obj +application/x-ustar ustar +application/x-wais-source src +application/x-x509-ca-cert der crt +application/x-xfig fig +application/x-xliff+xml xlf +application/x-xpinstall xpi +application/x-xz xz +application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8 +# application/x400-bp +application/xaml+xml xaml +# application/xcap-att+xml +# application/xcap-caps+xml +application/xcap-diff+xml xdf +# application/xcap-el+xml +# application/xcap-error+xml +# application/xcap-ns+xml +# application/xcon-conference-info-diff+xml +# application/xcon-conference-info+xml +application/xenc+xml xenc +application/xhtml+xml xhtml xht +# application/xhtml-voice+xml +application/xml xml xsl +application/xml-dtd dtd +# application/xml-external-parsed-entity +# application/xmpp+xml +application/xop+xml xop +application/xproc+xml xpl +application/xslt+xml xslt +application/xspf+xml xspf +application/xv+xml mxml xhvml xvml xvm +application/yang yang +application/yin+xml yin +application/zip zip +# audio/1d-interleaved-parityfec +# audio/32kadpcm +# audio/3gpp +# audio/3gpp2 +# audio/ac3 +audio/adpcm adp +# audio/amr +# audio/amr-wb +# audio/amr-wb+ +# audio/asc +# audio/atrac-advanced-lossless +# audio/atrac-x +# audio/atrac3 +audio/basic au snd +# audio/bv16 +# audio/bv32 +# audio/clearmode +# audio/cn +# audio/dat12 +# audio/dls +# audio/dsr-es201108 +# audio/dsr-es202050 +# audio/dsr-es202211 +# audio/dsr-es202212 +# audio/dv +# audio/dvi4 +# audio/eac3 +# audio/evrc +# audio/evrc-qcp +# audio/evrc0 +# audio/evrc1 +# audio/evrcb +# audio/evrcb0 +# audio/evrcb1 +# audio/evrcwb +# audio/evrcwb0 +# audio/evrcwb1 +# audio/example +# audio/fwdred +# audio/g719 +# audio/g722 +# audio/g7221 +# audio/g723 +# audio/g726-16 +# audio/g726-24 +# audio/g726-32 +# audio/g726-40 +# audio/g728 +# audio/g729 +# audio/g7291 +# audio/g729d +# audio/g729e +# audio/gsm +# audio/gsm-efr +# audio/gsm-hr-08 +# audio/ilbc +# audio/ip-mr_v2.5 +# audio/isac +# audio/l16 +# audio/l20 +# audio/l24 +# audio/l8 +# audio/lpc +audio/midi mid midi kar rmi +# audio/mobile-xmf +audio/mp4 mp4a +# audio/mp4a-latm +# audio/mpa +# audio/mpa-robust +audio/mpeg mpga mp2 mp2a mp3 m2a m3a +# audio/mpeg4-generic +# audio/musepack +audio/ogg oga ogg spx +# audio/opus +# audio/parityfec +# audio/pcma +# audio/pcma-wb +# audio/pcmu-wb +# audio/pcmu +# audio/prs.sid +# audio/qcelp +# audio/red +# audio/rtp-enc-aescm128 +# audio/rtp-midi +# audio/rtx +audio/s3m s3m +audio/silk sil +# audio/smv +# audio/smv0 +# audio/smv-qcp +# audio/sp-midi +# audio/speex +# audio/t140c +# audio/t38 +# audio/telephone-event +# audio/tone +# audio/uemclip +# audio/ulpfec +# audio/vdvi +# audio/vmr-wb +# audio/vnd.3gpp.iufp +# audio/vnd.4sb +# audio/vnd.audiokoz +# audio/vnd.celp +# audio/vnd.cisco.nse +# audio/vnd.cmles.radio-events +# audio/vnd.cns.anp1 +# audio/vnd.cns.inf1 +audio/vnd.dece.audio uva uvva +audio/vnd.digital-winds eol +# audio/vnd.dlna.adts +# audio/vnd.dolby.heaac.1 +# audio/vnd.dolby.heaac.2 +# audio/vnd.dolby.mlp +# audio/vnd.dolby.mps +# audio/vnd.dolby.pl2 +# audio/vnd.dolby.pl2x +# audio/vnd.dolby.pl2z +# audio/vnd.dolby.pulse.1 +audio/vnd.dra dra +audio/vnd.dts dts +audio/vnd.dts.hd dtshd +# audio/vnd.dvb.file +# audio/vnd.everad.plj +# audio/vnd.hns.audio +audio/vnd.lucent.voice lvp +audio/vnd.ms-playready.media.pya pya +# audio/vnd.nokia.mobile-xmf +# audio/vnd.nortel.vbk +audio/vnd.nuera.ecelp4800 ecelp4800 +audio/vnd.nuera.ecelp7470 ecelp7470 +audio/vnd.nuera.ecelp9600 ecelp9600 +# audio/vnd.octel.sbc +# audio/vnd.qcelp +# audio/vnd.rhetorex.32kadpcm +audio/vnd.rip rip +# audio/vnd.sealedmedia.softseal.mpeg +# audio/vnd.vmx.cvsd +# audio/vorbis +# audio/vorbis-config +audio/webm weba +audio/x-aac aac +audio/x-aiff aif aiff aifc +audio/x-caf caf +audio/x-flac flac +audio/x-matroska mka +audio/x-mpegurl m3u +audio/x-ms-wax wax +audio/x-ms-wma wma +audio/x-pn-realaudio ram ra +audio/x-pn-realaudio-plugin rmp +# audio/x-tta +audio/x-wav wav +audio/xm xm +chemical/x-cdx cdx +chemical/x-cif cif +chemical/x-cmdf cmdf +chemical/x-cml cml +chemical/x-csml csml +# chemical/x-pdb +chemical/x-xyz xyz +image/bmp bmp +image/cgm cgm +# image/example +# image/fits +image/g3fax g3 +image/gif gif +image/ief ief +# image/jp2 +image/jpeg jpeg jpg jpe +# image/jpm +# image/jpx +image/ktx ktx +# image/naplps +image/png png +image/prs.btif btif +# image/prs.pti +image/sgi sgi +image/svg+xml svg svgz +# image/t38 +image/tiff tiff tif +# image/tiff-fx +image/vnd.adobe.photoshop psd +# image/vnd.cns.inf2 +image/vnd.dece.graphic uvi uvvi uvg uvvg +image/vnd.dvb.subtitle sub +image/vnd.djvu djvu djv +image/vnd.dwg dwg +image/vnd.dxf dxf +image/vnd.fastbidsheet fbs +image/vnd.fpx fpx +image/vnd.fst fst +image/vnd.fujixerox.edmics-mmr mmr +image/vnd.fujixerox.edmics-rlc rlc +# image/vnd.globalgraphics.pgb +# image/vnd.microsoft.icon +# image/vnd.mix +image/vnd.ms-modi mdi +image/vnd.ms-photo wdp +image/vnd.net-fpx npx +# image/vnd.radiance +# image/vnd.sealed.png +# image/vnd.sealedmedia.softseal.gif +# image/vnd.sealedmedia.softseal.jpg +# image/vnd.svf +image/vnd.wap.wbmp wbmp +image/vnd.xiff xif +image/webp webp +image/x-3ds 3ds +image/x-cmu-raster ras +image/x-cmx cmx +image/x-freehand fh fhc fh4 fh5 fh7 +image/x-icon ico +image/x-mrsid-image sid +image/x-pcx pcx +image/x-pict pic pct +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-tga tga +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd +# message/cpim +# message/delivery-status +# message/disposition-notification +# message/example +# message/external-body +# message/feedback-report +# message/global +# message/global-delivery-status +# message/global-disposition-notification +# message/global-headers +# message/http +# message/imdn+xml +# message/news +# message/partial +message/rfc822 eml mime +# message/s-http +# message/sip +# message/sipfrag +# message/tracking-status +# message/vnd.si.simp +# model/example +model/iges igs iges +model/mesh msh mesh silo +model/vnd.collada+xml dae +model/vnd.dwf dwf +# model/vnd.flatland.3dml +model/vnd.gdl gdl +# model/vnd.gs-gdl +# model/vnd.gs.gdl +model/vnd.gtw gtw +# model/vnd.moml+xml +model/vnd.mts mts +# model/vnd.parasolid.transmit.binary +# model/vnd.parasolid.transmit.text +model/vnd.vtu vtu +model/vrml wrl vrml +model/x3d+binary x3db x3dbz +model/x3d+vrml x3dv x3dvz +model/x3d+xml x3d x3dz +# multipart/alternative +# multipart/appledouble +# multipart/byteranges +# multipart/digest +# multipart/encrypted +# multipart/example +# multipart/form-data +# multipart/header-set +# multipart/mixed +# multipart/parallel +# multipart/related +# multipart/report +# multipart/signed +# multipart/voice-message +# text/1d-interleaved-parityfec +text/cache-manifest appcache +text/calendar ics ifb +text/css css +text/csv csv +# text/directory +# text/dns +# text/ecmascript +# text/enriched +# text/example +# text/fwdred +text/html html htm +# text/javascript +text/n3 n3 +# text/parityfec +text/plain txt text conf def list log in +# text/prs.fallenstein.rst +text/prs.lines.tag dsc +# text/vnd.radisys.msml-basic-layout +# text/red +# text/rfc822-headers +text/richtext rtx +# text/rtf +# text/rtp-enc-aescm128 +# text/rtx +text/sgml sgml sgm +# text/t140 +text/tab-separated-values tsv +text/troff t tr roff man me ms +text/turtle ttl +# text/ulpfec +text/uri-list uri uris urls +text/vcard vcard +# text/vnd.abc +text/vnd.curl curl +text/vnd.curl.dcurl dcurl +text/vnd.curl.scurl scurl +text/vnd.curl.mcurl mcurl +# text/vnd.dmclientscript +text/vnd.dvb.subtitle sub +# text/vnd.esmertec.theme-descriptor +text/vnd.fly fly +text/vnd.fmi.flexstor flx +text/vnd.graphviz gv +text/vnd.in3d.3dml 3dml +text/vnd.in3d.spot spot +# text/vnd.iptc.newsml +# text/vnd.iptc.nitf +# text/vnd.latex-z +# text/vnd.motorola.reflex +# text/vnd.ms-mediapackage +# text/vnd.net2phone.commcenter.command +# text/vnd.si.uricatalogue +text/vnd.sun.j2me.app-descriptor jad +# text/vnd.trolltech.linguist +# text/vnd.wap.si +# text/vnd.wap.sl +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/x-asm s asm +text/x-c c cc cxx cpp h hh dic +text/x-fortran f for f77 f90 +text/x-java-source java +text/x-opml opml +text/x-pascal p pas +text/x-nfo nfo +text/x-setext etx +text/x-sfv sfv +text/x-uuencode uu +text/x-vcalendar vcs +text/x-vcard vcf +# text/xml +# text/xml-external-parsed-entity +# video/1d-interleaved-parityfec +video/3gpp 3gp +# video/3gpp-tt +video/3gpp2 3g2 +# video/bmpeg +# video/bt656 +# video/celb +# video/dv +# video/example +video/h261 h261 +video/h263 h263 +# video/h263-1998 +# video/h263-2000 +video/h264 h264 +# video/h264-rcdo +# video/h264-svc +video/jpeg jpgv +# video/jpeg2000 +video/jpm jpm jpgm +video/mj2 mj2 mjp2 +# video/mp1s +# video/mp2p +# video/mp2t +video/mp4 mp4 mp4v mpg4 +# video/mp4v-es +video/mpeg mpeg mpg mpe m1v m2v +# video/mpeg4-generic +# video/mpv +# video/nv +video/ogg ogv +# video/parityfec +# video/pointer +video/quicktime qt mov +# video/raw +# video/rtp-enc-aescm128 +# video/rtx +# video/smpte292m +# video/ulpfec +# video/vc1 +# video/vnd.cctv +video/vnd.dece.hd uvh uvvh +video/vnd.dece.mobile uvm uvvm +# video/vnd.dece.mp4 +video/vnd.dece.pd uvp uvvp +video/vnd.dece.sd uvs uvvs +video/vnd.dece.video uvv uvvv +# video/vnd.directv.mpeg +# video/vnd.directv.mpeg-tts +# video/vnd.dlna.mpeg-tts +video/vnd.dvb.file dvb +video/vnd.fvt fvt +# video/vnd.hns.video +# video/vnd.iptvforum.1dparityfec-1010 +# video/vnd.iptvforum.1dparityfec-2005 +# video/vnd.iptvforum.2dparityfec-1010 +# video/vnd.iptvforum.2dparityfec-2005 +# video/vnd.iptvforum.ttsavc +# video/vnd.iptvforum.ttsmpeg2 +# video/vnd.motorola.video +# video/vnd.motorola.videop +video/vnd.mpegurl mxu m4u +video/vnd.ms-playready.media.pyv pyv +# video/vnd.nokia.interleaved-multimedia +# video/vnd.nokia.videovoip +# video/vnd.objectvideo +# video/vnd.sealed.mpeg1 +# video/vnd.sealed.mpeg4 +# video/vnd.sealed.swf +# video/vnd.sealedmedia.softseal.mov +video/vnd.uvvu.mp4 uvu uvvu +video/vnd.vivo viv +video/webm webm +video/x-f4v f4v +video/x-fli fli +video/x-flv flv +video/x-m4v m4v +video/x-matroska mkv mk3d mks +video/x-mng mng +video/x-ms-asf asf asx +video/x-ms-vob vob +video/x-ms-wm wm +video/x-ms-wmv wmv +video/x-ms-wmx wmx +video/x-ms-wvx wvx +video/x-msvideo avi +video/x-sgi-movie movie +video/x-smv smv +x-conference/x-cooltalk ice diff --git a/node_modules/nodetime/node_modules/request/node_modules/mime/types/node.types b/node_modules/nodetime/node_modules/request/node_modules/mime/types/node.types new file mode 100644 index 0000000..9097334 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/node_modules/mime/types/node.types @@ -0,0 +1,59 @@ +# What: Google Chrome Extension +# Why: To allow apps to (work) be served with the right content type header. +# http://codereview.chromium.org/2830017 +# Added by: niftylettuce +application/x-chrome-extension crx + +# What: OTF Message Silencer +# Why: To silence the "Resource interpreted as font but transferred with MIME +# type font/otf" message that occurs in Google Chrome +# Added by: niftylettuce +font/opentype otf + +# What: HTC support +# Why: To properly render .htc files such as CSS3PIE +# Added by: niftylettuce +text/x-component htc + +# What: HTML5 application cache manifest +# Why: De-facto standard. Required by Mozilla browser when serving HTML5 apps +# per https://developer.mozilla.org/en/offline_resources_in_firefox +# Added by: louisremi +text/cache-manifest appcache manifest + +# What: node binary buffer format +# Why: semi-standard extension w/in the node community +# Added by: tootallnate +application/octet-stream buffer + +# What: The "protected" MP-4 formats used by iTunes. +# Why: Required for streaming music to browsers (?) +# Added by: broofa +application/mp4 m4p +audio/mp4 m4a + +# What: Music playlist format (http://en.wikipedia.org/wiki/M3U) +# Why: See https://github.com/bentomas/node-mime/pull/6 +# Added by: mjrusso +application/x-mpegURL m3u8 + +# What: Video format, Part of RFC1890 +# Why: See https://github.com/bentomas/node-mime/pull/6 +# Added by: mjrusso +video/MP2T ts + +# What: The FLAC lossless codec format +# Why: Streaming and serving FLAC audio +# Added by: jacobrask +audio/flac flac + +# What: EventSource mime type +# Why: mime type of Server-Sent Events stream +# http://www.w3.org/TR/eventsource/#text-event-stream +# Added by: francois2metz +text/event-stream event-stream + +# What: Mozilla App manifest mime type +# Why: https://developer.mozilla.org/en/Apps/Manifest#Serving_manifests +# Added by: ednapiranha +application/x-web-app-manifest+json webapp diff --git a/node_modules/nodetime/node_modules/request/oauth.js b/node_modules/nodetime/node_modules/request/oauth.js new file mode 100644 index 0000000..e35bfa6 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/oauth.js @@ -0,0 +1,43 @@ +var crypto = require('crypto') + , qs = require('querystring') + ; + +function sha1 (key, body) { + return crypto.createHmac('sha1', key).update(body).digest('base64') +} + +function rfc3986 (str) { + return encodeURIComponent(str) + .replace(/!/g,'%21') + .replace(/\*/g,'%2A') + .replace(/\(/g,'%28') + .replace(/\)/g,'%29') + .replace(/'/g,'%27') + ; +} + +function hmacsign (httpMethod, base_uri, params, consumer_secret, token_secret) { + // adapted from https://dev.twitter.com/docs/auth/oauth and + // https://dev.twitter.com/docs/auth/creating-signature + + var querystring = Object.keys(params).sort().map(function(key){ + // big WTF here with the escape + encoding but it's what twitter wants + return escape(rfc3986(key)) + "%3D" + escape(rfc3986(params[key])) + }).join('%26') + + var base = [ + httpMethod ? httpMethod.toUpperCase() : 'GET', + rfc3986(base_uri), + querystring + ].join('&') + + var key = [ + consumer_secret, + token_secret || '' + ].map(rfc3986).join('&') + + return sha1(key, base) +} + +exports.hmacsign = hmacsign +exports.rfc3986 = rfc3986 diff --git a/node_modules/nodetime/node_modules/request/package.json b/node_modules/nodetime/node_modules/request/package.json new file mode 100644 index 0000000..6a256de --- /dev/null +++ b/node_modules/nodetime/node_modules/request/package.json @@ -0,0 +1,40 @@ +{ + "name": "request", + "description": "Simplified HTTP request client.", + "tags": [ + "http", + "simple", + "util", + "utility" + ], + "version": "2.12.0", + "author": { + "name": "Mikeal Rogers", + "email": "mikeal.rogers@gmail.com" + }, + "repository": { + "type": "git", + "url": "http://github.com/mikeal/request.git" + }, + "bugs": { + "url": "http://github.com/mikeal/request/issues" + }, + "engines": [ + "node >= 0.3.6" + ], + "main": "./main", + "dependencies": { + "form-data": "~0.0.3", + "mime": "~1.2.7" + }, + "bundleDependencies": [ + "form-data", + "mime" + ], + "scripts": { + "test": "node tests/run.js" + }, + "readme": "# Request -- Simplified HTTP request method\n\n## Install\n\n
      \n  npm install request\n
      \n\nOr from source:\n\n
      \n  git clone git://github.com/mikeal/request.git \n  cd request\n  npm link\n
      \n\n## Super simple to use\n\nRequest is designed to be the simplest way possible to make http calls. It supports HTTPS and follows redirects by default.\n\n```javascript\nvar request = require('request');\nrequest('http://www.google.com', function (error, response, body) {\n if (!error && response.statusCode == 200) {\n console.log(body) // Print the google web page.\n }\n})\n```\n\n## Streaming\n\nYou can stream any response to a file stream.\n\n```javascript\nrequest('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png'))\n```\n\nYou can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types, in this case `application/json`, and use the proper content-type in the PUT request if one is not already provided in the headers.\n\n```javascript\nfs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json'))\n```\n\nRequest can also pipe to itself. When doing so the content-type and content-length will be preserved in the PUT headers.\n\n```javascript\nrequest.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png'))\n```\n\nNow let's get fancy.\n\n```javascript\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n if (req.method === 'PUT') {\n req.pipe(request.put('http://mysite.com/doodle.png'))\n } else if (req.method === 'GET' || req.method === 'HEAD') {\n request.get('http://mysite.com/doodle.png').pipe(resp)\n } \n }\n})\n```\n\nYou can also pipe() from a http.ServerRequest instance and to a http.ServerResponse instance. The HTTP method and headers will be sent as well as the entity-body data. Which means that, if you don't really care about security, you can do:\n\n```javascript\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n var x = request('http://mysite.com/doodle.png')\n req.pipe(x)\n x.pipe(resp)\n }\n})\n```\n\nAnd since pipe() returns the destination stream in node 0.5.x you can do one line proxying :)\n\n```javascript\nreq.pipe(request('http://mysite.com/doodle.png')).pipe(resp)\n```\n\nAlso, none of this new functionality conflicts with requests previous features, it just expands them.\n\n```javascript\nvar r = request.defaults({'proxy':'http://localproxy.com'})\n\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n r.get('http://google.com/doodle.png').pipe(resp)\n }\n})\n```\nYou can still use intermediate proxies, the requests will still follow HTTP forwards, etc.\n\n## Forms\n\n`request` supports `application/x-www-form-urlencoded` and `multipart/form-data` form uploads. For `multipart/related` refer to the `multipart` API.\n\nUrl encoded forms are simple\n\n```javascript\nrequest.post('http://service.com/upload', {form:{key:'value'}})\n// or\nrequest.post('http://service.com/upload').form({key:'value'})\n```\n\nFor `multipart/form-data` we use the [form-data](https://github.com/felixge/node-form-data) library by [@felixge](https://github.com/felixge). You don't need to worry about piping the form object or setting the headers, `request` will handle that for you.\n\n```javascript\nvar r = request.post('http://service.com/upload')\nvar form = r.form()\nform.append('my_field', 'my_value')\nform.append('my_buffer', new Buffer([1, 2, 3]))\nform.append('my_file', fs.createReadStream(path.join(__dirname, 'doodle.png'))\nform.append('remote_file', request('http://google.com/doodle.png'))\n```\n\n## OAuth Signing\n\n```javascript\n// Twitter OAuth\nvar qs = require('querystring')\n , oauth =\n { callback: 'http://mysite.com/callback/'\n , consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n }\n , url = 'https://api.twitter.com/oauth/request_token'\n ;\nrequest.post({url:url, oauth:oauth}, function (e, r, body) {\n // Assume by some stretch of magic you aquired the verifier\n var access_token = qs.parse(body)\n , oauth = \n { consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n , token: access_token.oauth_token\n , verifier: VERIFIER\n , token_secret: access_token.oauth_token_secret\n }\n , url = 'https://api.twitter.com/oauth/access_token'\n ;\n request.post({url:url, oauth:oauth}, function (e, r, body) {\n var perm_token = qs.parse(body)\n , oauth = \n { consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n , token: perm_token.oauth_token\n , token_secret: perm_token.oauth_token_secret\n }\n , url = 'https://api.twitter.com/1/users/show.json?'\n , params = \n { screen_name: perm_token.screen_name\n , user_id: perm_token.user_id\n }\n ;\n url += qs.stringify(params)\n request.get({url:url, oauth:oauth, json:true}, function (e, r, user) {\n console.log(user)\n })\n })\n})\n```\n\n\n\n### request(options, callback)\n\nThe first argument can be either a url or an options object. The only required option is uri, all others are optional.\n\n* `uri` || `url` - fully qualified uri or a parsed url object from url.parse()\n* `qs` - object containing querystring values to be appended to the uri\n* `method` - http method, defaults to GET\n* `headers` - http headers, defaults to {}\n* `body` - entity body for POST and PUT requests. Must be buffer or string.\n* `form` - when passed an object this will set `body` but to a querystring representation of value and adds `Content-type: application/x-www-form-urlencoded; charset=utf-8` header. When passed no option a FormData instance is returned that will be piped to request.\n* `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header. Additionally, parses the response body as json.\n* `multipart` - (experimental) array of objects which contains their own headers and `body` attribute. Sends `multipart/related` request. See example below.\n* `followRedirect` - follow HTTP 3xx responses as redirects. defaults to true.\n* `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects. defaults to false.\n* `maxRedirects` - the maximum number of redirects to follow, defaults to 10.\n* `encoding` - Encoding to be used on `setEncoding` of response data. If set to `null`, the body is returned as a Buffer.\n* `pool` - A hash object containing the agents for these requests. If omitted this request will use the global pool which is set to node's default maxSockets.\n* `pool.maxSockets` - Integer containing the maximum amount of sockets in the pool.\n* `timeout` - Integer containing the number of milliseconds to wait for a request to respond before aborting the request\t\n* `proxy` - An HTTP proxy to be used. Support proxy Auth with Basic Auth the same way it's supported with the `url` parameter by embedding the auth info in the uri.\n* `oauth` - Options for OAuth HMAC-SHA1 signing, see documentation above.\n* `strictSSL` - Set to `true` to require that SSL certificates be valid. Note: to use your own certificate authority, you need to specify an agent that was created with that ca as an option.\n* `jar` - Set to `false` if you don't want cookies to be remembered for future use or define your custom cookie jar (see examples section)\n* `aws` - object containing aws signing information, should have the properties `key` and `secret` as well as `bucket` unless you're specifying your bucket as part of the path, or you are making a request that doesn't use a bucket (i.e. GET Services)\n\n\nThe callback argument gets 3 arguments. The first is an error when applicable (usually from the http.Client option not the http.ClientRequest object). The second in an http.ClientResponse object. The third is the response body String or Buffer.\n\n## Convenience methods\n\nThere are also shorthand methods for different HTTP METHODs and some other conveniences.\n\n### request.defaults(options) \n \nThis method returns a wrapper around the normal request API that defaults to whatever options you pass in to it.\n\n### request.put\n\nSame as request() but defaults to `method: \"PUT\"`.\n\n```javascript\nrequest.put(url)\n```\n\n### request.post\n\nSame as request() but defaults to `method: \"POST\"`.\n\n```javascript\nrequest.post(url)\n```\n\n### request.head\n\nSame as request() but defaults to `method: \"HEAD\"`.\n\n```javascript\nrequest.head(url)\n```\n\n### request.del\n\nSame as request() but defaults to `method: \"DELETE\"`.\n\n```javascript\nrequest.del(url)\n```\n\n### request.get\n\nAlias to normal request method for uniformity.\n\n```javascript\nrequest.get(url)\n```\n### request.cookie\n\nFunction that creates a new cookie.\n\n```javascript\nrequest.cookie('cookie_string_here')\n```\n### request.jar\n\nFunction that creates a new cookie jar.\n\n```javascript\nrequest.jar()\n```\n\n\n## Examples:\n\n```javascript\n var request = require('request')\n , rand = Math.floor(Math.random()*100000000).toString()\n ;\n request(\n { method: 'PUT'\n , uri: 'http://mikeal.iriscouch.com/testjs/' + rand\n , multipart: \n [ { 'content-type': 'application/json'\n , body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}})\n }\n , { body: 'I am an attachment' }\n ] \n }\n , function (error, response, body) {\n if(response.statusCode == 201){\n console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand)\n } else {\n console.log('error: '+ response.statusCode)\n console.log(body)\n }\n }\n )\n```\nCookies are enabled by default (so they can be used in subsequent requests). To disable cookies set jar to false (either in defaults or in the options sent).\n\n```javascript\nvar request = request.defaults({jar: false})\nrequest('http://www.google.com', function () {\n request('http://images.google.com')\n})\n```\n\nIf you to use a custom cookie jar (instead of letting request use its own global cookie jar) you do so by setting the jar default or by specifying it as an option:\n\n```javascript\nvar j = request.jar()\nvar request = request.defaults({jar:j})\nrequest('http://www.google.com', function () {\n request('http://images.google.com')\n})\n```\nOR\n\n```javascript\nvar j = request.jar()\nvar cookie = request.cookie('your_cookie_here')\nj.add(cookie)\nrequest({url: 'http://www.google.com', jar: j}, function () {\n request('http://images.google.com')\n})\n```\n", + "_id": "request@2.12.0", + "_from": "request@2.12.0" +} diff --git a/node_modules/nodetime/node_modules/request/tests/googledoodle.png b/node_modules/nodetime/node_modules/request/tests/googledoodle.png new file mode 100644 index 0000000000000000000000000000000000000000..f80c9c52d3c507996535a19ee0bcfe3821de322d GIT binary patch literal 38510 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 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/node_modules/request/tests/run.js b/node_modules/nodetime/node_modules/request/tests/run.js new file mode 100644 index 0000000..538a65c --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/run.js @@ -0,0 +1,45 @@ +var spawn = require('child_process').spawn + , exitCode = 0 + ; + +var tests = [ + 'test-body.js' + , 'test-cookie.js' + , 'test-cookiejar.js' + , 'test-defaults.js' + , 'test-errors.js' + , 'test-form.js' + , 'test-follow-all-303.js' + , 'test-follow-all.js' + , 'test-headers.js' + , 'test-httpModule.js' + , 'test-https.js' + , 'test-https-strict.js' + , 'test-oauth.js' + , 'test-params.js' + , 'test-pipes.js' + , 'test-pool.js' + , 'test-protocol-changing-redirect.js' + , 'test-proxy.js' + , 'test-piped-redirect.js' + , 'test-qs.js' + , 'test-redirect.js' + , 'test-timeout.js' + , 'test-toJSON.js' + , 'test-tunnel.js' +] + +var next = function () { + if (tests.length === 0) process.exit(exitCode); + + var file = tests.shift() + console.log(file) + var proc = spawn('node', [ 'tests/' + file ]) + proc.stdout.pipe(process.stdout) + proc.stderr.pipe(process.stderr) + proc.on('exit', function (code) { + exitCode += code || 0 + next() + }) +} +next() diff --git a/node_modules/nodetime/node_modules/request/tests/server.js b/node_modules/nodetime/node_modules/request/tests/server.js new file mode 100644 index 0000000..b6eacba --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/server.js @@ -0,0 +1,90 @@ +var fs = require('fs') + , http = require('http') + , path = require('path') + , https = require('https') + , events = require('events') + , stream = require('stream') + , assert = require('assert') + ; + +exports.createServer = function (port) { + port = port || 6767 + var s = http.createServer(function (req, resp) { + s.emit(req.url, req, resp); + }) + s.port = port + s.url = 'http://localhost:'+port + return s; +} + +exports.createSSLServer = function(port, opts) { + port = port || 16767 + + var options = { 'key' : path.join(__dirname, 'ssl', 'test.key') + , 'cert': path.join(__dirname, 'ssl', 'test.crt') + } + if (opts) { + for (var i in opts) options[i] = opts[i] + } + + for (var i in options) { + options[i] = fs.readFileSync(options[i]) + } + + var s = https.createServer(options, function (req, resp) { + s.emit(req.url, req, resp); + }) + s.port = port + s.url = 'https://localhost:'+port + return s; +} + +exports.createPostStream = function (text) { + var postStream = new stream.Stream(); + postStream.writeable = true; + postStream.readable = true; + setTimeout(function () {postStream.emit('data', new Buffer(text)); postStream.emit('end')}, 0); + return postStream; +} +exports.createPostValidator = function (text, reqContentType) { + var l = function (req, resp) { + var r = ''; + req.on('data', function (chunk) {r += chunk}) + req.on('end', function () { + if (req.headers['content-type'] && req.headers['content-type'].indexOf('boundary=') >= 0) { + var boundary = req.headers['content-type'].split('boundary=')[1]; + text = text.replace(/__BOUNDARY__/g, boundary); + } + if (r !== text) console.log(r, text); + assert.equal(r, text) + if (reqContentType) { + assert.ok(req.headers['content-type']) + assert.ok(~req.headers['content-type'].indexOf(reqContentType)) + } + resp.writeHead(200, {'content-type':'text/plain'}) + resp.write('OK') + resp.end() + }) + } + return l; +} +exports.createGetResponse = function (text, contentType) { + var l = function (req, resp) { + contentType = contentType || 'text/plain' + resp.writeHead(200, {'content-type':contentType}) + resp.write(text) + resp.end() + } + return l; +} +exports.createChunkResponse = function (chunks, contentType) { + var l = function (req, resp) { + contentType = contentType || 'text/plain' + resp.writeHead(200, {'content-type':contentType}) + chunks.forEach(function (chunk) { + resp.write(chunk) + }) + resp.end() + } + return l; +} diff --git a/node_modules/nodetime/node_modules/request/tests/squid.conf b/node_modules/nodetime/node_modules/request/tests/squid.conf new file mode 100644 index 0000000..0d4a3b6 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/squid.conf @@ -0,0 +1,77 @@ +# +# Recommended minimum configuration: +# +acl manager proto cache_object +acl localhost src 127.0.0.1/32 ::1 +acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1 + +# Example rule allowing access from your local networks. +# Adapt to list your (internal) IP networks from where browsing +# should be allowed +acl localnet src 10.0.0.0/8 # RFC1918 possible internal network +acl localnet src 172.16.0.0/12 # RFC1918 possible internal network +acl localnet src 192.168.0.0/16 # RFC1918 possible internal network +acl localnet src fc00::/7 # RFC 4193 local private network range +acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines + +acl SSL_ports port 443 +acl Safe_ports port 80 # http +acl Safe_ports port 21 # ftp +acl Safe_ports port 443 # https +acl Safe_ports port 70 # gopher +acl Safe_ports port 210 # wais +acl Safe_ports port 1025-65535 # unregistered ports +acl Safe_ports port 280 # http-mgmt +acl Safe_ports port 488 # gss-http +acl Safe_ports port 591 # filemaker +acl Safe_ports port 777 # multiling http +acl CONNECT method CONNECT + +# +# Recommended minimum Access Permission configuration: +# +# Only allow cachemgr access from localhost +http_access allow manager localhost +http_access deny manager + +# Deny requests to certain unsafe ports +http_access deny !Safe_ports + +# Deny CONNECT to other than secure SSL ports +#http_access deny CONNECT !SSL_ports + +# We strongly recommend the following be uncommented to protect innocent +# web applications running on the proxy server who think the only +# one who can access services on "localhost" is a local user +#http_access deny to_localhost + +# +# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS +# + +# Example rule allowing access from your local networks. +# Adapt localnet in the ACL section to list your (internal) IP networks +# from where browsing should be allowed +http_access allow localnet +http_access allow localhost + +# And finally deny all other access to this proxy +http_access deny all + +# Squid normally listens to port 3128 +http_port 3128 + +# We recommend you to use at least the following line. +hierarchy_stoplist cgi-bin ? + +# Uncomment and adjust the following to add a disk cache directory. +#cache_dir ufs /usr/local/var/cache 100 16 256 + +# Leave coredumps in the first cache dir +coredump_dir /usr/local/var/cache + +# Add any of your own refresh_pattern entries above these. +refresh_pattern ^ftp: 1440 20% 10080 +refresh_pattern ^gopher: 1440 0% 1440 +refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 +refresh_pattern . 0 20% 4320 diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.cnf b/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.cnf new file mode 100644 index 0000000..425a889 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.cnf @@ -0,0 +1,20 @@ +[ req ] +default_bits = 1024 +days = 3650 +distinguished_name = req_distinguished_name +attributes = req_attributes +prompt = no +output_password = password + +[ req_distinguished_name ] +C = US +ST = CA +L = Oakland +O = request +OU = request Certificate Authority +CN = requestCA +emailAddress = mikeal@mikealrogers.com + +[ req_attributes ] +challengePassword = password challenge + diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.crl b/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.crl new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.crt b/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.crt new file mode 100644 index 0000000..b4524e4 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.crt @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICvTCCAiYCCQDn+P/MSbDsWjANBgkqhkiG9w0BAQUFADCBojELMAkGA1UEBhMC +VVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMRAwDgYDVQQKEwdyZXF1 +ZXN0MSYwJAYDVQQLEx1yZXF1ZXN0IENlcnRpZmljYXRlIEF1dGhvcml0eTESMBAG +A1UEAxMJcmVxdWVzdENBMSYwJAYJKoZIhvcNAQkBFhdtaWtlYWxAbWlrZWFscm9n +ZXJzLmNvbTAeFw0xMjAzMDEyMjUwNTZaFw0yMjAyMjcyMjUwNTZaMIGiMQswCQYD +VQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNVBAcTB09ha2xhbmQxEDAOBgNVBAoT +B3JlcXVlc3QxJjAkBgNVBAsTHXJlcXVlc3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +MRIwEAYDVQQDEwlyZXF1ZXN0Q0ExJjAkBgkqhkiG9w0BCQEWF21pa2VhbEBtaWtl +YWxyb2dlcnMuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7t9pQUAK4 +5XJYTI6NrF0n3G2HZsfN+rPYSVzzL8SuVyb1tHXos+vbPm3NKI4E8X1yVAXU8CjJ +5SqXnp4DAypAhaseho81cbhk7LXUhFz78OvAa+OD+xTAEAnNQ8tGUr4VGyplEjfD +xsBVuqV2j8GPNTftr+drOCFlqfAgMrBn4wIDAQABMA0GCSqGSIb3DQEBBQUAA4GB +ADVdTlVAL45R+PACNS7Gs4o81CwSclukBu4FJbxrkd4xGQmurgfRrYYKjtqiopQm +D7ysRamS3HMN9/VKq2T7r3z1PMHPAy7zM4uoXbbaTKwlnX4j/8pGPn8Ca3qHXYlo +88L/OOPc6Di7i7qckS3HFbXQCTiULtxWmy97oEuTwrAj +-----END CERTIFICATE----- diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.csr b/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.csr new file mode 100644 index 0000000..e48c56e --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.csr @@ -0,0 +1,13 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIICBjCCAW8CAQAwgaIxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEQMA4GA1UE +BxMHT2FrbGFuZDEQMA4GA1UEChMHcmVxdWVzdDEmMCQGA1UECxMdcmVxdWVzdCBD +ZXJ0aWZpY2F0ZSBBdXRob3JpdHkxEjAQBgNVBAMTCXJlcXVlc3RDQTEmMCQGCSqG +SIb3DQEJARYXbWlrZWFsQG1pa2VhbHJvZ2Vycy5jb20wgZ8wDQYJKoZIhvcNAQEB +BQADgY0AMIGJAoGBALu32lBQArjlclhMjo2sXSfcbYdmx836s9hJXPMvxK5XJvW0 +deiz69s+bc0ojgTxfXJUBdTwKMnlKpeengMDKkCFqx6GjzVxuGTstdSEXPvw68Br +44P7FMAQCc1Dy0ZSvhUbKmUSN8PGwFW6pXaPwY81N+2v52s4IWWp8CAysGfjAgMB +AAGgIzAhBgkqhkiG9w0BCQcxFBMScGFzc3dvcmQgY2hhbGxlbmdlMA0GCSqGSIb3 +DQEBBQUAA4GBAGJO7grHeVHXetjHEK8urIxdnvfB2qeZeObz4GPKIkqUurjr0rfj +bA3EK1kDMR5aeQWR8RunixdM16Q6Ry0lEdLVWkdSwRN9dmirIHT9cypqnD/FYOia +SdezZ0lUzXgmJIwRYRwB1KSMMocIf52ll/xC2bEGg7/ZAEuAyAgcZV3X +-----END CERTIFICATE REQUEST----- diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.key b/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.key new file mode 100644 index 0000000..a53e7f7 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.key @@ -0,0 +1,18 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,C8B5887048377F02 + +nyD5ZH0Wup2uWsDvurq5mKDaDrf8lvNn9w0SH/ZkVnfR1/bkwqrFriqJWvZNUG+q +nS0iBYczsWLJnbub9a1zLOTENWUKVD5uqbC3aGHhnoUTNSa27DONgP8gHOn6JgR+ +GAKo01HCSTiVT4LjkwN337QKHnMP2fTzg+IoC/CigvMcq09hRLwU1/guq0GJKGwH +gTxYNuYmQC4Tjh8vdS4liF+Ve/P3qPR2CehZrIOkDT8PHJBGQJRo4xGUIB7Tpk38 +VCk+UZ0JCS2coY8VkY/9tqFJp/ZnnQQVmaNbdRqg7ECKL+bXnNo7yjzmazPZmPe3 +/ShbE0+CTt7LrjCaQAxWbeDzqfo1lQfgN1LulTm8MCXpQaJpv7v1VhIhQ7afjMYb +4thW/ypHPiYS2YJCAkAVlua9Oxzzh1qJoh8Df19iHtpd79Q77X/qf+1JvITlMu0U +gi7yEatmQcmYNws1mtTC1q2DXrO90c+NZ0LK/Alse6NRL/xiUdjug2iHeTf/idOR +Gg/5dSZbnnlj1E5zjSMDkzg6EHAFmHV4jYGSAFLEQgp4V3ZhMVoWZrvvSHgKV/Qh +FqrAK4INr1G2+/QTd09AIRzfy3/j6yD4A9iNaOsEf9Ua7Qh6RcALRCAZTWR5QtEf +dX+iSNJ4E85qXs0PqwkMDkoaxIJ+tmIRJY7y8oeylV8cfGAi8Soubt/i3SlR8IHC +uDMas/2OnwafK3N7ODeE1i7r7wkzQkSHaEz0TrF8XRnP25jAICCSLiMdAAjKfxVb +EvzsFSuAy3Jt6bU3hSLY9o4YVYKE+68ITMv9yNjvTsEiW+T+IbN34w== +-----END RSA PRIVATE KEY----- diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.srl b/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.srl new file mode 100644 index 0000000..17128db --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.srl @@ -0,0 +1 @@ +ADF62016AA40C9C3 diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.cnf b/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.cnf new file mode 100644 index 0000000..cd1fd1e --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.cnf @@ -0,0 +1,19 @@ +[ req ] +default_bits = 1024 +days = 3650 +distinguished_name = req_distinguished_name +attributes = req_attributes +prompt = no + +[ req_distinguished_name ] +C = US +ST = CA +L = Oakland +O = request +OU = testing +CN = testing.request.mikealrogers.com +emailAddress = mikeal@mikealrogers.com + +[ req_attributes ] +challengePassword = password challenge + diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.crt b/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.crt new file mode 100644 index 0000000..efe96ce --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.crt @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE----- +MIICejCCAeMCCQCt9iAWqkDJwzANBgkqhkiG9w0BAQUFADCBojELMAkGA1UEBhMC +VVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMRAwDgYDVQQKEwdyZXF1 +ZXN0MSYwJAYDVQQLEx1yZXF1ZXN0IENlcnRpZmljYXRlIEF1dGhvcml0eTESMBAG +A1UEAxMJcmVxdWVzdENBMSYwJAYJKoZIhvcNAQkBFhdtaWtlYWxAbWlrZWFscm9n +ZXJzLmNvbTAeFw0xMjAzMDEyMjUwNTZaFw0yMjAyMjcyMjUwNTZaMIGjMQswCQYD +VQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNVBAcTB09ha2xhbmQxEDAOBgNVBAoT +B3JlcXVlc3QxEDAOBgNVBAsTB3Rlc3RpbmcxKTAnBgNVBAMTIHRlc3RpbmcucmVx +dWVzdC5taWtlYWxyb2dlcnMuY29tMSYwJAYJKoZIhvcNAQkBFhdtaWtlYWxAbWlr +ZWFscm9nZXJzLmNvbTBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDgVl0jMumvOpmM +20W5v9yhGgZj8hPhEQF/N7yCBVBn/rWGYm70IHC8T/pR5c0LkWc5gdnCJEvKWQjh +DBKxZD8FAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEABShRkNgFbgs4vUWW9R9deNJj +7HJoiTmvkmoOC7QzcYkjdgHbOxsSq3rBnwxsVjY9PAtPwBn0GRspOeG7KzKRgySB +kb22LyrCFKbEOfKO/+CJc80ioK9zEPVjGsFMyAB+ftYRqM+s/4cQlTg/m89l01wC +yapjN3RxZbInGhWR+jA= +-----END CERTIFICATE----- diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.csr b/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.csr new file mode 100644 index 0000000..a8e7595 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.csr @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIBgjCCASwCAQAwgaMxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEQMA4GA1UE +BxMHT2FrbGFuZDEQMA4GA1UEChMHcmVxdWVzdDEQMA4GA1UECxMHdGVzdGluZzEp +MCcGA1UEAxMgdGVzdGluZy5yZXF1ZXN0Lm1pa2VhbHJvZ2Vycy5jb20xJjAkBgkq +hkiG9w0BCQEWF21pa2VhbEBtaWtlYWxyb2dlcnMuY29tMFwwDQYJKoZIhvcNAQEB +BQADSwAwSAJBAOBWXSMy6a86mYzbRbm/3KEaBmPyE+ERAX83vIIFUGf+tYZibvQg +cLxP+lHlzQuRZzmB2cIkS8pZCOEMErFkPwUCAwEAAaAjMCEGCSqGSIb3DQEJBzEU +ExJwYXNzd29yZCBjaGFsbGVuZ2UwDQYJKoZIhvcNAQEFBQADQQBD3E5WekQzCEJw +7yOcqvtPYIxGaX8gRKkYfLPoj3pm3GF5SGqtJKhylKfi89szHXgktnQgzff9FN+A +HidVJ/3u +-----END CERTIFICATE REQUEST----- diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.js b/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.js new file mode 100644 index 0000000..05e21c1 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.js @@ -0,0 +1,28 @@ +var fs = require("fs") +var https = require("https") +var options = { key: fs.readFileSync("./server.key") + , cert: fs.readFileSync("./server.crt") } + +var server = https.createServer(options, function (req, res) { + res.writeHead(200) + res.end() + server.close() +}) +server.listen(1337) + +var ca = fs.readFileSync("./ca.crt") +var agent = new https.Agent({ host: "localhost", port: 1337, ca: ca }) + +https.request({ host: "localhost" + , method: "HEAD" + , port: 1337 + , headers: { host: "testing.request.mikealrogers.com" } + , agent: agent + , ca: [ ca ] + , path: "/" }, function (res) { + if (res.client.authorized) { + console.log("node test: OK") + } else { + throw new Error(res.client.authorizationError) + } +}).end() diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.key b/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.key new file mode 100644 index 0000000..72d8698 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.key @@ -0,0 +1,9 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIBOwIBAAJBAOBWXSMy6a86mYzbRbm/3KEaBmPyE+ERAX83vIIFUGf+tYZibvQg +cLxP+lHlzQuRZzmB2cIkS8pZCOEMErFkPwUCAwEAAQJAK+r8ZM2sze8s7FRo/ApB +iRBtO9fCaIdJwbwJnXKo4RKwZDt1l2mm+fzZ+/QaQNjY1oTROkIIXmnwRvZWfYlW +gQIhAPKYsG+YSBN9o8Sdp1DMyZ/rUifKX3OE6q9tINkgajDVAiEA7Ltqh01+cnt0 +JEnud/8HHcuehUBLMofeg0G+gCnSbXECIQCqDvkXsWNNLnS/3lgsnvH0Baz4sbeJ +rjIpuVEeg8eM5QIgbu0+9JmOV6ybdmmiMV4yAncoF35R/iKGVHDZCAsQzDECIQDZ +0jGz22tlo5YMcYSqrdD3U4sds1pwiAaWFRbCunoUJw== +-----END RSA PRIVATE KEY----- diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/npm-ca.crt b/node_modules/nodetime/node_modules/request/tests/ssl/npm-ca.crt new file mode 100644 index 0000000..fde2fe9 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/ssl/npm-ca.crt @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE----- +MIIChzCCAfACCQDauvz/KHp8ejANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMC +VVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMQwwCgYDVQQKEwNucG0x +IjAgBgNVBAsTGW5wbSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxDjAMBgNVBAMTBW5w +bUNBMRcwFQYJKoZIhvcNAQkBFghpQGl6cy5tZTAeFw0xMTA5MDUwMTQ3MTdaFw0y +MTA5MDIwMTQ3MTdaMIGHMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNV +BAcTB09ha2xhbmQxDDAKBgNVBAoTA25wbTEiMCAGA1UECxMZbnBtIENlcnRpZmlj +YXRlIEF1dGhvcml0eTEOMAwGA1UEAxMFbnBtQ0ExFzAVBgkqhkiG9w0BCQEWCGlA +aXpzLm1lMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLI4tIqPpRW+ACw9GE +OgBlJZwK5f8nnKCLK629Pv5yJpQKs3DENExAyOgDcyaF0HD0zk8zTp+ZsLaNdKOz +Gn2U181KGprGKAXP6DU6ByOJDWmTlY6+Ad1laYT0m64fERSpHw/hjD3D+iX4aMOl +y0HdbT5m1ZGh6SJz3ZqxavhHLQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAC4ySDbC +l7W1WpLmtLGEQ/yuMLUf6Jy/vr+CRp4h+UzL+IQpCv8FfxsYE7dhf/bmWTEupBkv +yNL18lipt2jSvR3v6oAHAReotvdjqhxddpe5Holns6EQd1/xEZ7sB1YhQKJtvUrl +ZNufy1Jf1r0ldEGeA+0ISck7s+xSh9rQD2Op +-----END CERTIFICATE----- diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/test.crt b/node_modules/nodetime/node_modules/request/tests/ssl/test.crt new file mode 100644 index 0000000..b357f86 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/ssl/test.crt @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICQzCCAawCCQCO/XWtRFck1jANBgkqhkiG9w0BAQUFADBmMQswCQYDVQQGEwJU +SDEQMA4GA1UECBMHQmFuZ2tvazEOMAwGA1UEBxMFU2lsb20xGzAZBgNVBAoTElRo +ZSBSZXF1ZXN0IE1vZHVsZTEYMBYGA1UEAxMPcmVxdWVzdC5leGFtcGxlMB4XDTEx +MTIwMzAyMjkyM1oXDTIxMTEzMDAyMjkyM1owZjELMAkGA1UEBhMCVEgxEDAOBgNV +BAgTB0Jhbmdrb2sxDjAMBgNVBAcTBVNpbG9tMRswGQYDVQQKExJUaGUgUmVxdWVz +dCBNb2R1bGUxGDAWBgNVBAMTD3JlcXVlc3QuZXhhbXBsZTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAwmctddZqlA48+NXs0yOy92DijcQV1jf87zMiYAIlNUto +wghVbTWgJU5r0pdKrD16AptnWJTzKanhItEX8XCCPgsNkq1afgTtJP7rNkwu3xcj +eIMkhJg/ay4ZnkbnhYdsii5VTU5prix6AqWRAhbkBgoA+iVyHyof8wvZyKBoFTMC +AwEAATANBgkqhkiG9w0BAQUFAAOBgQB6BybMJbpeiABgihDfEVBcAjDoQ8gUMgwV +l4NulugfKTDmArqnR9aPd4ET5jX5dkMP4bwCHYsvrcYDeWEQy7x5WWuylOdKhua4 +L4cEi2uDCjqEErIG3cc1MCOk6Cl6Ld6tkIzQSf953qfdEACRytOeUqLNQcrXrqeE +c7U8F6MWLQ== +-----END CERTIFICATE----- diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/test.key b/node_modules/nodetime/node_modules/request/tests/ssl/test.key new file mode 100644 index 0000000..b85810d --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/ssl/test.key @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXgIBAAKBgQDCZy111mqUDjz41ezTI7L3YOKNxBXWN/zvMyJgAiU1S2jCCFVt +NaAlTmvSl0qsPXoCm2dYlPMpqeEi0RfxcII+Cw2SrVp+BO0k/us2TC7fFyN4gySE +mD9rLhmeRueFh2yKLlVNTmmuLHoCpZECFuQGCgD6JXIfKh/zC9nIoGgVMwIDAQAB +AoGBALXFwfUf8vHTSmGlrdZS2AGFPvEtuvldyoxi9K5u8xmdFCvxnOcLsF2RsTHt +Mu5QYWhUpNJoG+IGLTPf7RJdj/kNtEs7xXqWy4jR36kt5z5MJzqiK+QIgiO9UFWZ +fjUb6oeDnTIJA9YFBdYi97MDuL89iU/UK3LkJN3hd4rciSbpAkEA+MCkowF5kSFb +rkOTBYBXZfiAG78itDXN6DXmqb9XYY+YBh3BiQM28oxCeQYyFy6pk/nstnd4TXk6 +V/ryA2g5NwJBAMgRKTY9KvxJWbESeMEFe2iBIV0c26/72Amgi7ZKUCLukLfD4tLF ++WSZdmTbbqI1079YtwaiOVfiLm45Q/3B0eUCQAaQ/0eWSGE+Yi8tdXoVszjr4GXb +G81qBi91DMu6U1It+jNfIba+MPsiHLcZJMVb4/oWBNukN7bD1nhwFWdlnu0CQQCf +Is9WHkdvz2RxbZDxb8verz/7kXXJQJhx5+rZf7jIYFxqX3yvTNv3wf2jcctJaWlZ +fVZwB193YSivcgt778xlAkEAprYUz3jczjF5r2hrgbizPzPDR94tM5BTO3ki2v3w +kbf+j2g7FNAx6kZiVN8XwfLc8xEeUGiPKwtq3ddPDFh17w== +-----END RSA PRIVATE KEY----- diff --git a/node_modules/nodetime/node_modules/request/tests/test-body.js b/node_modules/nodetime/node_modules/request/tests/test-body.js new file mode 100644 index 0000000..a624397 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/test-body.js @@ -0,0 +1,117 @@ +var server = require('./server') + , events = require('events') + , stream = require('stream') + , assert = require('assert') + , request = require('../main.js') + ; + +var s = server.createServer(); + +var tests = + { testGet : + { resp : server.createGetResponse("TESTING!") + , expectBody: "TESTING!" + } + , testGetChunkBreak : + { resp : server.createChunkResponse( + [ new Buffer([239]) + , new Buffer([163]) + , new Buffer([191]) + , new Buffer([206]) + , new Buffer([169]) + , new Buffer([226]) + , new Buffer([152]) + , new Buffer([131]) + ]) + , expectBody: "Ω☃" + } + , testGetBuffer : + { resp : server.createGetResponse(new Buffer("TESTING!")) + , encoding: null + , expectBody: new Buffer("TESTING!") + } + , testGetEncoding : + { resp : server.createGetResponse(new Buffer('efa3bfcea9e29883', 'hex')) + , encoding: 'hex' + , expectBody: "efa3bfcea9e29883" + } + , testGetJSON : + { resp : server.createGetResponse('{"test":true}', 'application/json') + , json : true + , expectBody: {"test":true} + } + , testPutString : + { resp : server.createPostValidator("PUTTINGDATA") + , method : "PUT" + , body : "PUTTINGDATA" + } + , testPutBuffer : + { resp : server.createPostValidator("PUTTINGDATA") + , method : "PUT" + , body : new Buffer("PUTTINGDATA") + } + , testPutJSON : + { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) + , method: "PUT" + , json: {foo: 'bar'} + } + , testPutMultipart : + { resp: server.createPostValidator( + '--__BOUNDARY__\r\n' + + 'content-type: text/html\r\n' + + '\r\n' + + 'Oh hi.' + + '\r\n--__BOUNDARY__\r\n\r\n' + + 'Oh hi.' + + '\r\n--__BOUNDARY__--' + ) + , method: "PUT" + , multipart: + [ {'content-type': 'text/html', 'body': 'Oh hi.'} + , {'body': 'Oh hi.'} + ] + } + , testPutMultipartPreambleCRLF : + { resp: server.createPostValidator( + '\r\n--__BOUNDARY__\r\n' + + 'content-type: text/html\r\n' + + '\r\n' + + 'Oh hi.' + + '\r\n--__BOUNDARY__\r\n\r\n' + + 'Oh hi.' + + '\r\n--__BOUNDARY__--' + ) + , method: "PUT" + , preambleCRLF: true + , multipart: + [ {'content-type': 'text/html', 'body': 'Oh hi.'} + , {'body': 'Oh hi.'} + ] + } + } + +s.listen(s.port, function () { + + var counter = 0 + + for (i in tests) { + (function () { + var test = tests[i] + s.on('/'+i, test.resp) + test.uri = s.url + '/' + i + request(test, function (err, resp, body) { + if (err) throw err + if (test.expectBody) { + assert.deepEqual(test.expectBody, body) + } + counter = counter - 1; + if (counter === 0) { + console.log(Object.keys(tests).length+" tests passed.") + s.close() + } + }) + counter++ + })() + } +}) + diff --git a/node_modules/nodetime/node_modules/request/tests/test-cookie.js b/node_modules/nodetime/node_modules/request/tests/test-cookie.js new file mode 100644 index 0000000..6c6a7a7 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/test-cookie.js @@ -0,0 +1,29 @@ +var Cookie = require('../vendor/cookie') + , assert = require('assert'); + +var str = 'Sid="s543qactge.wKE61E01Bs%2BKhzmxrwrnug="; Path=/; httpOnly; Expires=Sat, 04 Dec 2010 23:27:28 GMT'; +var cookie = new Cookie(str); + +// test .toString() +assert.equal(cookie.toString(), str); + +// test .path +assert.equal(cookie.path, '/'); + +// test .httpOnly +assert.equal(cookie.httpOnly, true); + +// test .name +assert.equal(cookie.name, 'Sid'); + +// test .value +assert.equal(cookie.value, '"s543qactge.wKE61E01Bs%2BKhzmxrwrnug="'); + +// test .expires +assert.equal(cookie.expires instanceof Date, true); + +// test .path default +var cookie = new Cookie('foo=bar', { url: 'http://foo.com/bar' }); +assert.equal(cookie.path, '/bar'); + +console.log('All tests passed'); diff --git a/node_modules/nodetime/node_modules/request/tests/test-cookiejar.js b/node_modules/nodetime/node_modules/request/tests/test-cookiejar.js new file mode 100644 index 0000000..76fcd71 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/test-cookiejar.js @@ -0,0 +1,90 @@ +var Cookie = require('../vendor/cookie') + , Jar = require('../vendor/cookie/jar') + , assert = require('assert'); + +function expires(ms) { + return new Date(Date.now() + ms).toUTCString(); +} + +// test .get() expiration +(function() { + var jar = new Jar; + var cookie = new Cookie('sid=1234; path=/; expires=' + expires(1000)); + jar.add(cookie); + setTimeout(function(){ + var cookies = jar.get({ url: 'http://foo.com/foo' }); + assert.equal(cookies.length, 1); + assert.equal(cookies[0], cookie); + setTimeout(function(){ + var cookies = jar.get({ url: 'http://foo.com/foo' }); + assert.equal(cookies.length, 0); + }, 1000); + }, 5); +})(); + +// test .get() path support +(function() { + var jar = new Jar; + var a = new Cookie('sid=1234; path=/'); + var b = new Cookie('sid=1111; path=/foo/bar'); + var c = new Cookie('sid=2222; path=/'); + jar.add(a); + jar.add(b); + jar.add(c); + + // should remove the duplicates + assert.equal(jar.cookies.length, 2); + + // same name, same path, latter prevails + var cookies = jar.get({ url: 'http://foo.com/' }); + assert.equal(cookies.length, 1); + assert.equal(cookies[0], c); + + // same name, diff path, path specifity prevails, latter prevails + var cookies = jar.get({ url: 'http://foo.com/foo/bar' }); + assert.equal(cookies.length, 1); + assert.equal(cookies[0], b); + + var jar = new Jar; + var a = new Cookie('sid=1111; path=/foo/bar'); + var b = new Cookie('sid=1234; path=/'); + jar.add(a); + jar.add(b); + + var cookies = jar.get({ url: 'http://foo.com/foo/bar' }); + assert.equal(cookies.length, 1); + assert.equal(cookies[0], a); + + var cookies = jar.get({ url: 'http://foo.com/' }); + assert.equal(cookies.length, 1); + assert.equal(cookies[0], b); + + var jar = new Jar; + var a = new Cookie('sid=1111; path=/foo/bar'); + var b = new Cookie('sid=3333; path=/foo/bar'); + var c = new Cookie('pid=3333; path=/foo/bar'); + var d = new Cookie('sid=2222; path=/foo/'); + var e = new Cookie('sid=1234; path=/'); + jar.add(a); + jar.add(b); + jar.add(c); + jar.add(d); + jar.add(e); + + var cookies = jar.get({ url: 'http://foo.com/foo/bar' }); + assert.equal(cookies.length, 2); + assert.equal(cookies[0], b); + assert.equal(cookies[1], c); + + var cookies = jar.get({ url: 'http://foo.com/foo/' }); + assert.equal(cookies.length, 1); + assert.equal(cookies[0], d); + + var cookies = jar.get({ url: 'http://foo.com/' }); + assert.equal(cookies.length, 1); + assert.equal(cookies[0], e); +})(); + +setTimeout(function() { + console.log('All tests passed'); +}, 1200); diff --git a/node_modules/nodetime/node_modules/request/tests/test-defaults.js b/node_modules/nodetime/node_modules/request/tests/test-defaults.js new file mode 100644 index 0000000..ba09418 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/test-defaults.js @@ -0,0 +1,114 @@ +var server = require('./server') + , assert = require('assert') + , request = require('../main.js') + ; + +var s = server.createServer(); + +s.listen(s.port, function () { + var counter = 0; + s.on('/get', function (req, resp) { + assert.equal(req.headers.foo, 'bar'); + assert.equal(req.method, 'GET') + resp.writeHead(200, {'Content-Type': 'text/plain'}); + resp.end('TESTING!'); + }); + + // test get(string, function) + request.defaults({headers:{foo:"bar"}})(s.url + '/get', function (e, r, b){ + if (e) throw e; + assert.deepEqual("TESTING!", b); + counter += 1; + }); + + s.on('/post', function (req, resp) { + assert.equal(req.headers.foo, 'bar'); + assert.equal(req.headers['content-type'], null); + assert.equal(req.method, 'POST') + resp.writeHead(200, {'Content-Type': 'application/json'}); + resp.end(JSON.stringify({foo:'bar'})); + }); + + // test post(string, object, function) + request.defaults({headers:{foo:"bar"}}).post(s.url + '/post', {json: true}, function (e, r, b){ + if (e) throw e; + assert.deepEqual('bar', b.foo); + counter += 1; + }); + + s.on('/post-body', function (req, resp) { + assert.equal(req.headers.foo, 'bar'); + assert.equal(req.headers['content-type'], 'application/json'); + assert.equal(req.method, 'POST') + resp.writeHead(200, {'Content-Type': 'application/json'}); + resp.end(JSON.stringify({foo:'bar'})); + }); + + // test post(string, object, function) with body + request.defaults({headers:{foo:"bar"}}).post(s.url + '/post-body', {json: true, body:{bar:"baz"}}, function (e, r, b){ + if (e) throw e; + assert.deepEqual('bar', b.foo); + counter += 1; + }); + + s.on('/del', function (req, resp) { + assert.equal(req.headers.foo, 'bar'); + assert.equal(req.method, 'DELETE') + resp.writeHead(200, {'Content-Type': 'application/json'}); + resp.end(JSON.stringify({foo:'bar'})); + }); + + // test .del(string, function) + request.defaults({headers:{foo:"bar"}, json:true}).del(s.url + '/del', function (e, r, b){ + if (e) throw e; + assert.deepEqual('bar', b.foo); + counter += 1; + }); + + s.on('/head', function (req, resp) { + assert.equal(req.headers.foo, 'bar'); + assert.equal(req.method, 'HEAD') + resp.writeHead(200, {'Content-Type': 'text/plain'}); + resp.end(); + }); + + // test head.(object, function) + request.defaults({headers:{foo:"bar"}}).head({uri: s.url + '/head'}, function (e, r, b){ + if (e) throw e; + counter += 1; + }); + + s.on('/get_custom', function(req, resp) { + assert.equal(req.headers.foo, 'bar'); + assert.equal(req.headers.x, 'y'); + resp.writeHead(200, {'Content-Type': 'text/plain'}); + resp.end(); + }); + + // test custom request handler function + var defaultRequest = request.defaults({ + headers:{foo:"bar"} + , body: 'TESTING!' + }, function(uri, options, callback) { + var params = request.initParams(uri, options, callback); + options = params.options; + options.headers.x = 'y'; + + return request(params.uri, params.options, params.callback); + }); + + var msg = 'defaults test failed. head request should throw earlier'; + assert.throws(function() { + defaultRequest.head(s.url + '/get_custom', function(e, r, b) { + throw new Error(msg); + }); + counter+=1; + }, msg); + + defaultRequest.get(s.url + '/get_custom', function(e, r, b) { + if(e) throw e; + counter += 1; + console.log(counter.toString() + " tests passed."); + s.close(); + }); +}) diff --git a/node_modules/nodetime/node_modules/request/tests/test-errors.js b/node_modules/nodetime/node_modules/request/tests/test-errors.js new file mode 100644 index 0000000..1986a59 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/test-errors.js @@ -0,0 +1,37 @@ +var server = require('./server') + , events = require('events') + , assert = require('assert') + , request = require('../main.js') + ; + +var local = 'http://localhost:8888/asdf' + +try { + request({uri:local, body:{}}) + assert.fail("Should have throw") +} catch(e) { + assert.equal(e.message, 'Argument error, options.body.') +} + +try { + request({uri:local, multipart: 'foo'}) + assert.fail("Should have throw") +} catch(e) { + assert.equal(e.message, 'Argument error, options.multipart.') +} + +try { + request({uri:local, multipart: [{}]}) + assert.fail("Should have throw") +} catch(e) { + assert.equal(e.message, 'Body attribute missing in multipart.') +} + +try { + request(local, {multipart: [{}]}) + assert.fail("Should have throw") +} catch(e) { + assert.equal(e.message, 'Body attribute missing in multipart.') +} + +console.log("All tests passed.") diff --git a/node_modules/nodetime/node_modules/request/tests/test-follow-all-303.js b/node_modules/nodetime/node_modules/request/tests/test-follow-all-303.js new file mode 100644 index 0000000..3f2162d --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/test-follow-all-303.js @@ -0,0 +1,30 @@ +var request = require('../main'); +var http = require('http'); +var requests = 0; +var assert = require('assert'); + +var server = http.createServer(function (req, res) { + console.error(req.method, req.url); + requests ++; + + if (req.method === 'POST') { + console.error('send 303'); + res.setHeader('location', req.url); + res.statusCode = 303; + res.end('try again, i guess\n'); + } else { + console.error('send 200') + res.end('ok: ' + requests); + } +}); +server.listen(6767); + +request.post({ url: 'http://localhost:6767/foo', + followAllRedirects: true, + form: { foo: 'bar' } }, function (er, req, body) { + if (er) throw er; + assert.equal(body, 'ok: 2'); + assert.equal(requests, 2); + console.error('ok - ' + process.version); + server.close(); +}); diff --git a/node_modules/nodetime/node_modules/request/tests/test-follow-all.js b/node_modules/nodetime/node_modules/request/tests/test-follow-all.js new file mode 100644 index 0000000..b78745b --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/test-follow-all.js @@ -0,0 +1,35 @@ +var request = require('../main'); +var http = require('http'); +var requests = 0; +var assert = require('assert'); + +var server = http.createServer(function (req, res) { + requests ++; + + // redirect everything 3 times, no matter what. + var c = req.headers.cookie; + + if (!c) c = 0; + else c = +c.split('=')[1] || 0; + + if (c > 3) { + res.end('ok: '+requests); + return; + } + + res.setHeader('set-cookie', 'c=' + (c + 1)); + res.setHeader('location', req.url); + res.statusCode = 302; + res.end('try again, i guess\n'); +}); +server.listen(6767); + +request.post({ url: 'http://localhost:6767/foo', + followAllRedirects: true, + form: { foo: 'bar' } }, function (er, req, body) { + if (er) throw er; + assert.equal(body, 'ok: 5'); + assert.equal(requests, 5); + console.error('ok - ' + process.version); + server.close(); +}); diff --git a/node_modules/nodetime/node_modules/request/tests/test-form.js b/node_modules/nodetime/node_modules/request/tests/test-form.js new file mode 100644 index 0000000..aeefd31 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/test-form.js @@ -0,0 +1,79 @@ +var assert = require('assert') +var http = require('http'); +var path = require('path'); +var mime = require('mime'); +var request = require('../main.js'); +var fs = require('fs'); + +var remoteFile = 'http://nodejs.org/images/logo.png'; + +var FIELDS = [ + {name: 'my_field', value: 'my_value'}, + {name: 'my_buffer', value: new Buffer([1, 2, 3])}, + {name: 'my_file', value: fs.createReadStream(__dirname + '/unicycle.jpg')}, + {name: 'remote_file', value: request(remoteFile) } +]; + +var server = http.createServer(function(req, res) { + + // temp workaround + var data = ''; + req.setEncoding('utf8'); + + req.on('data', function(d) { + data += d; + }); + + req.on('end', function() { + // check for the fields' traces + + // 1st field : my_field + var field = FIELDS.shift(); + assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); + assert.ok( data.indexOf(field.value) != -1 ); + + // 2nd field : my_buffer + var field = FIELDS.shift(); + assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); + assert.ok( data.indexOf(field.value) != -1 ); + + // 3rd field : my_file + var field = FIELDS.shift(); + assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); + assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); + // check for unicycle.jpg traces + assert.ok( data.indexOf('2005:06:21 01:44:12') != -1 ); + assert.ok( data.indexOf('Content-Type: '+mime.lookup(field.value.path) ) != -1 ); + + // 4th field : remote_file + var field = FIELDS.shift(); + assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); + assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); + // check for http://nodejs.org/images/logo.png traces + assert.ok( data.indexOf('ImageReady') != -1 ); + assert.ok( data.indexOf('Content-Type: '+mime.lookup(remoteFile) ) != -1 ); + + res.writeHead(200); + res.end('done'); + + }); + + +}); + +server.listen(8080, function() { + + var req = request.post('http://localhost:8080/upload', function () { + server.close(); + }) + var form = req.form() + + FIELDS.forEach(function(field) { + form.append(field.name, field.value); + }); + +}); + +process.on('exit', function() { + assert.strictEqual(FIELDS.length, 0); +}); diff --git a/node_modules/nodetime/node_modules/request/tests/test-headers.js b/node_modules/nodetime/node_modules/request/tests/test-headers.js new file mode 100644 index 0000000..31fe3f4 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/test-headers.js @@ -0,0 +1,52 @@ +var server = require('./server') + , assert = require('assert') + , request = require('../main.js') + , Cookie = require('../vendor/cookie') + , Jar = require('../vendor/cookie/jar') + , s = server.createServer() + +s.listen(s.port, function () { + var serverUri = 'http://localhost:' + s.port + , numTests = 0 + , numOutstandingTests = 0 + + function createTest(requestObj, serverAssertFn) { + var testNumber = numTests; + numTests += 1; + numOutstandingTests += 1; + s.on('/' + testNumber, function (req, res) { + serverAssertFn(req, res); + res.writeHead(200); + res.end(); + }); + requestObj.url = serverUri + '/' + testNumber + request(requestObj, function (err, res, body) { + assert.ok(!err) + assert.equal(res.statusCode, 200) + numOutstandingTests -= 1 + if (numOutstandingTests === 0) { + console.log(numTests + ' tests passed.') + s.close() + } + }) + } + + // Issue #125: headers.cookie shouldn't be replaced when a cookie jar isn't specified + createTest({headers: {cookie: 'foo=bar'}}, function (req, res) { + assert.ok(req.headers.cookie) + assert.equal(req.headers.cookie, 'foo=bar') + }) + + // Issue #125: headers.cookie + cookie jar + var jar = new Jar() + jar.add(new Cookie('quux=baz')); + createTest({jar: jar, headers: {cookie: 'foo=bar'}}, function (req, res) { + assert.ok(req.headers.cookie) + assert.equal(req.headers.cookie, 'foo=bar; quux=baz') + }) + + // There should be no cookie header when neither headers.cookie nor a cookie jar is specified + createTest({}, function (req, res) { + assert.ok(!req.headers.cookie) + }) +}) diff --git a/node_modules/nodetime/node_modules/request/tests/test-httpModule.js b/node_modules/nodetime/node_modules/request/tests/test-httpModule.js new file mode 100644 index 0000000..1866de2 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/test-httpModule.js @@ -0,0 +1,94 @@ +var http = require('http') + , https = require('https') + , server = require('./server') + , assert = require('assert') + , request = require('../main.js') + + +var faux_requests_made = {'http':0, 'https':0} +function wrap_request(name, module) { + // Just like the http or https module, but note when a request is made. + var wrapped = {} + Object.keys(module).forEach(function(key) { + var value = module[key]; + + if(key != 'request') + wrapped[key] = value; + else + wrapped[key] = function(options, callback) { + faux_requests_made[name] += 1 + return value.apply(this, arguments) + } + }) + + return wrapped; +} + + +var faux_http = wrap_request('http', http) + , faux_https = wrap_request('https', https) + , plain_server = server.createServer() + , https_server = server.createSSLServer() + + +plain_server.listen(plain_server.port, function() { + plain_server.on('/plain', function (req, res) { + res.writeHead(200) + res.end('plain') + }) + plain_server.on('/to_https', function (req, res) { + res.writeHead(301, {'location':'https://localhost:'+https_server.port + '/https'}) + res.end() + }) + + https_server.listen(https_server.port, function() { + https_server.on('/https', function (req, res) { + res.writeHead(200) + res.end('https') + }) + https_server.on('/to_plain', function (req, res) { + res.writeHead(302, {'location':'http://localhost:'+plain_server.port + '/plain'}) + res.end() + }) + + run_tests() + run_tests({}) + run_tests({'http:':faux_http}) + run_tests({'https:':faux_https}) + run_tests({'http:':faux_http, 'https:':faux_https}) + }) +}) + +function run_tests(httpModules) { + var to_https = 'http://localhost:'+plain_server.port+'/to_https' + var to_plain = 'https://localhost:'+https_server.port+'/to_plain' + + request(to_https, {'httpModules':httpModules}, function (er, res, body) { + assert.ok(!er, 'Bounce to SSL worked') + assert.equal(body, 'https', 'Received HTTPS server body') + done() + }) + + request(to_plain, {'httpModules':httpModules}, function (er, res, body) { + assert.ok(!er, 'Bounce to plaintext server worked') + assert.equal(body, 'plain', 'Received HTTPS server body') + done() + }) +} + + +var passed = 0; +function done() { + passed += 1 + var expected = 10 + + if(passed == expected) { + plain_server.close() + https_server.close() + + assert.equal(faux_requests_made.http, 4, 'Wrapped http module called appropriately') + assert.equal(faux_requests_made.https, 4, 'Wrapped https module called appropriately') + + console.log((expected+2) + ' tests passed.') + } +} diff --git a/node_modules/nodetime/node_modules/request/tests/test-https-strict.js b/node_modules/nodetime/node_modules/request/tests/test-https-strict.js new file mode 100644 index 0000000..470b68d --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/test-https-strict.js @@ -0,0 +1,97 @@ +// a test where we validate the siguature of the keys +// otherwise exactly the same as the ssl test + +var server = require('./server') + , assert = require('assert') + , request = require('../main.js') + , fs = require('fs') + , path = require('path') + , opts = { key: path.resolve(__dirname, 'ssl/ca/server.key') + , cert: path.resolve(__dirname, 'ssl/ca/server.crt') } + , s = server.createSSLServer(null, opts) + , caFile = path.resolve(__dirname, 'ssl/ca/ca.crt') + , ca = fs.readFileSync(caFile) + +var tests = + { testGet : + { resp : server.createGetResponse("TESTING!") + , expectBody: "TESTING!" + } + , testGetChunkBreak : + { resp : server.createChunkResponse( + [ new Buffer([239]) + , new Buffer([163]) + , new Buffer([191]) + , new Buffer([206]) + , new Buffer([169]) + , new Buffer([226]) + , new Buffer([152]) + , new Buffer([131]) + ]) + , expectBody: "Ω☃" + } + , testGetJSON : + { resp : server.createGetResponse('{"test":true}', 'application/json') + , json : true + , expectBody: {"test":true} + } + , testPutString : + { resp : server.createPostValidator("PUTTINGDATA") + , method : "PUT" + , body : "PUTTINGDATA" + } + , testPutBuffer : + { resp : server.createPostValidator("PUTTINGDATA") + , method : "PUT" + , body : new Buffer("PUTTINGDATA") + } + , testPutJSON : + { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) + , method: "PUT" + , json: {foo: 'bar'} + } + , testPutMultipart : + { resp: server.createPostValidator( + '--__BOUNDARY__\r\n' + + 'content-type: text/html\r\n' + + '\r\n' + + 'Oh hi.' + + '\r\n--__BOUNDARY__\r\n\r\n' + + 'Oh hi.' + + '\r\n--__BOUNDARY__--' + ) + , method: "PUT" + , multipart: + [ {'content-type': 'text/html', 'body': 'Oh hi.'} + , {'body': 'Oh hi.'} + ] + } + } + +s.listen(s.port, function () { + + var counter = 0 + + for (i in tests) { + (function () { + var test = tests[i] + s.on('/'+i, test.resp) + test.uri = s.url + '/' + i + test.strictSSL = true + test.ca = ca + test.headers = { host: 'testing.request.mikealrogers.com' } + request(test, function (err, resp, body) { + if (err) throw err + if (test.expectBody) { + assert.deepEqual(test.expectBody, body) + } + counter = counter - 1; + if (counter === 0) { + console.log(Object.keys(tests).length+" tests passed.") + s.close() + } + }) + counter++ + })() + } +}) diff --git a/node_modules/nodetime/node_modules/request/tests/test-https.js b/node_modules/nodetime/node_modules/request/tests/test-https.js new file mode 100644 index 0000000..58e7db9 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/test-https.js @@ -0,0 +1,86 @@ +var server = require('./server') + , assert = require('assert') + , request = require('../main.js') + +var s = server.createSSLServer(); + +var tests = + { testGet : + { resp : server.createGetResponse("TESTING!") + , expectBody: "TESTING!" + } + , testGetChunkBreak : + { resp : server.createChunkResponse( + [ new Buffer([239]) + , new Buffer([163]) + , new Buffer([191]) + , new Buffer([206]) + , new Buffer([169]) + , new Buffer([226]) + , new Buffer([152]) + , new Buffer([131]) + ]) + , expectBody: "Ω☃" + } + , testGetJSON : + { resp : server.createGetResponse('{"test":true}', 'application/json') + , json : true + , expectBody: {"test":true} + } + , testPutString : + { resp : server.createPostValidator("PUTTINGDATA") + , method : "PUT" + , body : "PUTTINGDATA" + } + , testPutBuffer : + { resp : server.createPostValidator("PUTTINGDATA") + , method : "PUT" + , body : new Buffer("PUTTINGDATA") + } + , testPutJSON : + { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) + , method: "PUT" + , json: {foo: 'bar'} + } + , testPutMultipart : + { resp: server.createPostValidator( + '--__BOUNDARY__\r\n' + + 'content-type: text/html\r\n' + + '\r\n' + + 'Oh hi.' + + '\r\n--__BOUNDARY__\r\n\r\n' + + 'Oh hi.' + + '\r\n--__BOUNDARY__--' + ) + , method: "PUT" + , multipart: + [ {'content-type': 'text/html', 'body': 'Oh hi.'} + , {'body': 'Oh hi.'} + ] + } + } + +s.listen(s.port, function () { + + var counter = 0 + + for (i in tests) { + (function () { + var test = tests[i] + s.on('/'+i, test.resp) + test.uri = s.url + '/' + i + request(test, function (err, resp, body) { + if (err) throw err + if (test.expectBody) { + assert.deepEqual(test.expectBody, body) + } + counter = counter - 1; + if (counter === 0) { + console.log(Object.keys(tests).length+" tests passed.") + s.close() + } + }) + counter++ + })() + } +}) diff --git a/node_modules/nodetime/node_modules/request/tests/test-oauth.js b/node_modules/nodetime/node_modules/request/tests/test-oauth.js new file mode 100644 index 0000000..72ca923 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/test-oauth.js @@ -0,0 +1,117 @@ +var hmacsign = require('../oauth').hmacsign + , assert = require('assert') + , qs = require('querystring') + , request = require('../main') + ; + +function getsignature (r) { + var sign + r.headers.Authorization.slice('OAuth '.length).replace(/,\ /g, ',').split(',').forEach(function (v) { + if (v.slice(0, 'oauth_signature="'.length) === 'oauth_signature="') sign = v.slice('oauth_signature="'.length, -1) + }) + return decodeURIComponent(sign) +} + +// Tests from Twitter documentation https://dev.twitter.com/docs/auth/oauth + +var reqsign = hmacsign('POST', 'https://api.twitter.com/oauth/request_token', + { oauth_callback: 'http://localhost:3005/the_dance/process_callback?service_provider_id=11' + , oauth_consumer_key: 'GDdmIQH6jhtmLUypg82g' + , oauth_nonce: 'QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk' + , oauth_signature_method: 'HMAC-SHA1' + , oauth_timestamp: '1272323042' + , oauth_version: '1.0' + }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98") + +console.log(reqsign) +console.log('8wUi7m5HFQy76nowoCThusfgB+Q=') +assert.equal(reqsign, '8wUi7m5HFQy76nowoCThusfgB+Q=') + +var accsign = hmacsign('POST', 'https://api.twitter.com/oauth/access_token', + { oauth_consumer_key: 'GDdmIQH6jhtmLUypg82g' + , oauth_nonce: '9zWH6qe0qG7Lc1telCn7FhUbLyVdjEaL3MO5uHxn8' + , oauth_signature_method: 'HMAC-SHA1' + , oauth_token: '8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc' + , oauth_timestamp: '1272323047' + , oauth_verifier: 'pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY' + , oauth_version: '1.0' + }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98", "x6qpRnlEmW9JbQn4PQVVeVG8ZLPEx6A0TOebgwcuA") + +console.log(accsign) +console.log('PUw/dHA4fnlJYM6RhXk5IU/0fCc=') +assert.equal(accsign, 'PUw/dHA4fnlJYM6RhXk5IU/0fCc=') + +var upsign = hmacsign('POST', 'http://api.twitter.com/1/statuses/update.json', + { oauth_consumer_key: "GDdmIQH6jhtmLUypg82g" + , oauth_nonce: "oElnnMTQIZvqvlfXM56aBLAf5noGD0AQR3Fmi7Q6Y" + , oauth_signature_method: "HMAC-SHA1" + , oauth_token: "819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw" + , oauth_timestamp: "1272325550" + , oauth_version: "1.0" + , status: 'setting up my twitter 私のさえずりを設定する' + }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98", "J6zix3FfA9LofH0awS24M3HcBYXO5nI1iYe8EfBA") + +console.log(upsign) +console.log('yOahq5m0YjDDjfjxHaXEsW9D+X0=') +assert.equal(upsign, 'yOahq5m0YjDDjfjxHaXEsW9D+X0=') + + +var rsign = request.post( + { url: 'https://api.twitter.com/oauth/request_token' + , oauth: + { callback: 'http://localhost:3005/the_dance/process_callback?service_provider_id=11' + , consumer_key: 'GDdmIQH6jhtmLUypg82g' + , nonce: 'QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk' + , timestamp: '1272323042' + , version: '1.0' + , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" + } + }) + +setTimeout(function () { + console.log(getsignature(rsign)) + assert.equal(reqsign, getsignature(rsign)) +}) + +var raccsign = request.post( + { url: 'https://api.twitter.com/oauth/access_token' + , oauth: + { consumer_key: 'GDdmIQH6jhtmLUypg82g' + , nonce: '9zWH6qe0qG7Lc1telCn7FhUbLyVdjEaL3MO5uHxn8' + , signature_method: 'HMAC-SHA1' + , token: '8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc' + , timestamp: '1272323047' + , verifier: 'pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY' + , version: '1.0' + , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" + , token_secret: "x6qpRnlEmW9JbQn4PQVVeVG8ZLPEx6A0TOebgwcuA" + } + }) + +setTimeout(function () { + console.log(getsignature(raccsign)) + assert.equal(accsign, getsignature(raccsign)) +}, 1) + +var rupsign = request.post( + { url: 'http://api.twitter.com/1/statuses/update.json' + , oauth: + { consumer_key: "GDdmIQH6jhtmLUypg82g" + , nonce: "oElnnMTQIZvqvlfXM56aBLAf5noGD0AQR3Fmi7Q6Y" + , signature_method: "HMAC-SHA1" + , token: "819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw" + , timestamp: "1272325550" + , version: "1.0" + , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" + , token_secret: "J6zix3FfA9LofH0awS24M3HcBYXO5nI1iYe8EfBA" + } + , form: {status: 'setting up my twitter 私のさえずりを設定する'} + }) +setTimeout(function () { + console.log(getsignature(rupsign)) + assert.equal(upsign, getsignature(rupsign)) +}, 1) + + + + diff --git a/node_modules/nodetime/node_modules/request/tests/test-params.js b/node_modules/nodetime/node_modules/request/tests/test-params.js new file mode 100644 index 0000000..5ddb311 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/test-params.js @@ -0,0 +1,92 @@ +var server = require('./server') + , assert = require('assert') + , request = require('../main.js') + ; + +var s = server.createServer(); + +var tests = + { testGet : + { resp : server.createGetResponse("TESTING!") + , expectBody: "TESTING!" + } + , testGetChunkBreak : + { resp : server.createChunkResponse( + [ new Buffer([239]) + , new Buffer([163]) + , new Buffer([191]) + , new Buffer([206]) + , new Buffer([169]) + , new Buffer([226]) + , new Buffer([152]) + , new Buffer([131]) + ]) + , expectBody: "Ω☃" + } + , testGetBuffer : + { resp : server.createGetResponse(new Buffer("TESTING!")) + , encoding: null + , expectBody: new Buffer("TESTING!") + } + , testGetJSON : + { resp : server.createGetResponse('{"test":true}', 'application/json') + , json : true + , expectBody: {"test":true} + } + , testPutString : + { resp : server.createPostValidator("PUTTINGDATA") + , method : "PUT" + , body : "PUTTINGDATA" + } + , testPutBuffer : + { resp : server.createPostValidator("PUTTINGDATA") + , method : "PUT" + , body : new Buffer("PUTTINGDATA") + } + , testPutJSON : + { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) + , method: "PUT" + , json: {foo: 'bar'} + } + , testPutMultipart : + { resp: server.createPostValidator( + '--__BOUNDARY__\r\n' + + 'content-type: text/html\r\n' + + '\r\n' + + 'Oh hi.' + + '\r\n--__BOUNDARY__\r\n\r\n' + + 'Oh hi.' + + '\r\n--__BOUNDARY__--' + ) + , method: "PUT" + , multipart: + [ {'content-type': 'text/html', 'body': 'Oh hi.'} + , {'body': 'Oh hi.'} + ] + } + } + +s.listen(s.port, function () { + + var counter = 0 + + for (i in tests) { + (function () { + var test = tests[i] + s.on('/'+i, test.resp) + //test.uri = s.url + '/' + i + request(s.url + '/' + i, test, function (err, resp, body) { + if (err) throw err + if (test.expectBody) { + assert.deepEqual(test.expectBody, body) + } + counter = counter - 1; + if (counter === 0) { + console.log(Object.keys(tests).length+" tests passed.") + s.close() + } + }) + counter++ + })() + } +}) diff --git a/node_modules/nodetime/node_modules/request/tests/test-piped-redirect.js b/node_modules/nodetime/node_modules/request/tests/test-piped-redirect.js new file mode 100644 index 0000000..25bf35d --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/test-piped-redirect.js @@ -0,0 +1,52 @@ +var http = require('http') + , assert = require('assert') + , request = require('../main.js') + ; + +var portOne = 8968 + , portTwo = 8969 + ; + + +// server one +var s1 = http.createServer(function (req, resp) +{ + if (req.url == '/original') + { + resp.writeHeader(302, {'location': '/redirected'}) + resp.end() + } + else if (req.url == '/redirected') + { + resp.writeHeader(200, {'content-type': 'text/plain'}) + resp.write('OK') + resp.end() + } + +}).listen(portOne); + + +// server two +var s2 = http.createServer(function (req, resp) +{ + + var x = request('http://localhost:'+portOne+'/original') + req.pipe(x) + x.pipe(resp) + +}).listen(portTwo, function() +{ + + var r = request('http://localhost:'+portTwo+'/original', function (err, res, body) { + + assert.equal(body, 'OK') + + s1.close() + s2.close() + + }); + + // it hangs, so wait a second :) + r.timeout = 1000; + +}); diff --git a/node_modules/nodetime/node_modules/request/tests/test-pipes.js b/node_modules/nodetime/node_modules/request/tests/test-pipes.js new file mode 100644 index 0000000..7162981 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/test-pipes.js @@ -0,0 +1,216 @@ +var server = require('./server') + , events = require('events') + , stream = require('stream') + , assert = require('assert') + , fs = require('fs') + , request = require('../main.js') + , path = require('path') + , util = require('util') + ; + +var s = server.createServer(3453); + +function ValidationStream(str) { + this.str = str + this.buf = '' + this.on('data', function (data) { + this.buf += data + }) + this.on('end', function () { + assert.equal(this.str, this.buf) + }) + this.writable = true +} +util.inherits(ValidationStream, stream.Stream) +ValidationStream.prototype.write = function (chunk) { + this.emit('data', chunk) +} +ValidationStream.prototype.end = function (chunk) { + if (chunk) emit('data', chunk) + this.emit('end') +} + +s.listen(s.port, function () { + counter = 0; + + var check = function () { + counter = counter - 1 + if (counter === 0) { + console.log('All tests passed.') + setTimeout(function () { + process.exit(); + }, 500) + } + } + + // Test pipeing to a request object + s.once('/push', server.createPostValidator("mydata")); + + var mydata = new stream.Stream(); + mydata.readable = true + + counter++ + var r1 = request.put({url:'http://localhost:3453/push'}, function () { + check(); + }) + mydata.pipe(r1) + + mydata.emit('data', 'mydata'); + mydata.emit('end'); + + // Test pipeing to a request object with a json body + s.once('/push-json', server.createPostValidator("{\"foo\":\"bar\"}", "application/json")); + + var mybodydata = new stream.Stream(); + mybodydata.readable = true + + counter++ + var r2 = request.put({url:'http://localhost:3453/push-json',json:true}, function () { + check(); + }) + mybodydata.pipe(r2) + + mybodydata.emit('data', JSON.stringify({foo:"bar"})); + mybodydata.emit('end'); + + // Test pipeing from a request object. + s.once('/pull', server.createGetResponse("mypulldata")); + + var mypulldata = new stream.Stream(); + mypulldata.writable = true + + counter++ + request({url:'http://localhost:3453/pull'}).pipe(mypulldata) + + var d = ''; + + mypulldata.write = function (chunk) { + d += chunk; + } + mypulldata.end = function () { + assert.equal(d, 'mypulldata'); + check(); + }; + + + s.on('/cat', function (req, resp) { + if (req.method === "GET") { + resp.writeHead(200, {'content-type':'text/plain-test', 'content-length':4}); + resp.end('asdf') + } else if (req.method === "PUT") { + assert.equal(req.headers['content-type'], 'text/plain-test'); + assert.equal(req.headers['content-length'], 4) + var validate = ''; + + req.on('data', function (chunk) {validate += chunk}) + req.on('end', function () { + resp.writeHead(201); + resp.end(); + assert.equal(validate, 'asdf'); + check(); + }) + } + }) + s.on('/pushjs', function (req, resp) { + if (req.method === "PUT") { + assert.equal(req.headers['content-type'], 'application/javascript'); + check(); + } + }) + s.on('/catresp', function (req, resp) { + request.get('http://localhost:3453/cat').pipe(resp) + }) + s.on('/doodle', function (req, resp) { + if (req.headers['x-oneline-proxy']) { + resp.setHeader('x-oneline-proxy', 'yup') + } + resp.writeHead('200', {'content-type':'image/png'}) + fs.createReadStream(path.join(__dirname, 'googledoodle.png')).pipe(resp) + }) + s.on('/onelineproxy', function (req, resp) { + var x = request('http://localhost:3453/doodle') + req.pipe(x) + x.pipe(resp) + }) + + counter++ + fs.createReadStream(__filename).pipe(request.put('http://localhost:3453/pushjs')) + + counter++ + request.get('http://localhost:3453/cat').pipe(request.put('http://localhost:3453/cat')) + + counter++ + request.get('http://localhost:3453/catresp', function (e, resp, body) { + assert.equal(resp.headers['content-type'], 'text/plain-test'); + assert.equal(resp.headers['content-length'], 4) + check(); + }) + + var doodleWrite = fs.createWriteStream(path.join(__dirname, 'test.png')) + + counter++ + request.get('http://localhost:3453/doodle').pipe(doodleWrite) + + doodleWrite.on('close', function () { + assert.deepEqual(fs.readFileSync(path.join(__dirname, 'googledoodle.png')), fs.readFileSync(path.join(__dirname, 'test.png'))) + check() + }) + + process.on('exit', function () { + fs.unlinkSync(path.join(__dirname, 'test.png')) + }) + + counter++ + request.get({uri:'http://localhost:3453/onelineproxy', headers:{'x-oneline-proxy':'nope'}}, function (err, resp, body) { + assert.equal(resp.headers['x-oneline-proxy'], 'yup') + check() + }) + + s.on('/afterresponse', function (req, resp) { + resp.write('d') + resp.end() + }) + + counter++ + var afterresp = request.post('http://localhost:3453/afterresponse').on('response', function () { + var v = new ValidationStream('d') + afterresp.pipe(v) + v.on('end', check) + }) + + s.on('/forward1', function (req, resp) { + resp.writeHead(302, {location:'/forward2'}) + resp.end() + }) + s.on('/forward2', function (req, resp) { + resp.writeHead('200', {'content-type':'image/png'}) + resp.write('d') + resp.end() + }) + + counter++ + var validateForward = new ValidationStream('d') + validateForward.on('end', check) + request.get('http://localhost:3453/forward1').pipe(validateForward) + + // Test pipe options + s.once('/opts', server.createGetResponse('opts response')); + + var optsStream = new stream.Stream(); + optsStream.writable = true + + var optsData = ''; + optsStream.write = function (buf) { + optsData += buf; + if (optsData === 'opts response') { + setTimeout(check, 10); + } + } + + optsStream.end = function () { + assert.fail('end called') + }; + + counter++ + request({url:'http://localhost:3453/opts'}).pipe(optsStream, { end : false }) +}) diff --git a/node_modules/nodetime/node_modules/request/tests/test-pool.js b/node_modules/nodetime/node_modules/request/tests/test-pool.js new file mode 100644 index 0000000..1e7d578 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/test-pool.js @@ -0,0 +1,16 @@ +var request = require('../main') + , http = require('http') + , assert = require('assert') + ; + +var s = http.createServer(function (req, resp) { + resp.statusCode = 200; + resp.end('asdf'); +}).listen(8080, function () { + request({'url': 'http://localhost:8080', 'pool': false}, function (e, resp) { + var agent = resp.request.agent; + assert.strictEqual(typeof agent, 'boolean'); + assert.strictEqual(agent, false); + s.close(); + }); +}); \ No newline at end of file diff --git a/node_modules/nodetime/node_modules/request/tests/test-protocol-changing-redirect.js b/node_modules/nodetime/node_modules/request/tests/test-protocol-changing-redirect.js new file mode 100644 index 0000000..f74e196 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/test-protocol-changing-redirect.js @@ -0,0 +1,60 @@ +var server = require('./server') + , assert = require('assert') + , request = require('../main.js') + + +var s = server.createServer() +var ss = server.createSSLServer() +var sUrl = 'http://localhost:' + s.port +var ssUrl = 'https://localhost:' + ss.port + +s.listen(s.port, bouncy(s, ssUrl)) +ss.listen(ss.port, bouncy(ss, sUrl)) + +var hits = {} +var expect = {} +var pending = 0 +function bouncy (s, server) { return function () { + + var redirs = { a: 'b' + , b: 'c' + , c: 'd' + , d: 'e' + , e: 'f' + , f: 'g' + , g: 'h' + , h: 'end' } + + var perm = true + Object.keys(redirs).forEach(function (p) { + var t = redirs[p] + + // switch type each time + var type = perm ? 301 : 302 + perm = !perm + s.on('/' + p, function (req, res) { + res.writeHead(type, { location: server + '/' + t }) + res.end() + }) + }) + + s.on('/end', function (req, res) { + var h = req.headers['x-test-key'] + hits[h] = true + pending -- + if (pending === 0) done() + }) +}} + +for (var i = 0; i < 5; i ++) { + pending ++ + var val = 'test_' + i + expect[val] = true + request({ url: (i % 2 ? sUrl : ssUrl) + '/a' + , headers: { 'x-test-key': val } }) +} + +function done () { + assert.deepEqual(hits, expect) + process.exit(0) +} diff --git a/node_modules/nodetime/node_modules/request/tests/test-proxy.js b/node_modules/nodetime/node_modules/request/tests/test-proxy.js new file mode 100644 index 0000000..647157c --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/test-proxy.js @@ -0,0 +1,39 @@ +var server = require('./server') + , events = require('events') + , stream = require('stream') + , assert = require('assert') + , fs = require('fs') + , request = require('../main.js') + , path = require('path') + , util = require('util') + ; + +var port = 6768 + , called = false + , proxiedHost = 'google.com' + ; + +var s = server.createServer(port) +s.listen(port, function () { + s.on('http://google.com/', function (req, res) { + called = true + assert.equal(req.headers.host, proxiedHost) + res.writeHeader(200) + res.end() + }) + request ({ + url: 'http://'+proxiedHost, + proxy: 'http://localhost:'+port + /* + //should behave as if these arguments where passed: + url: 'http://localhost:'+port, + headers: {host: proxiedHost} + //*/ + }, function (err, res, body) { + s.close() + }) +}) + +process.on('exit', function () { + assert.ok(called, 'the request must be made to the proxy server') +}) diff --git a/node_modules/nodetime/node_modules/request/tests/test-qs.js b/node_modules/nodetime/node_modules/request/tests/test-qs.js new file mode 100644 index 0000000..1aac22b --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/test-qs.js @@ -0,0 +1,28 @@ +var request = request = require('../main.js') + , assert = require('assert') + ; + + +// Test adding a querystring +var req1 = request.get({ uri: 'http://www.google.com', qs: { q : 'search' }}) +setTimeout(function() { + assert.equal('/?q=search', req1.path) +}, 1) + +// Test replacing a querystring value +var req2 = request.get({ uri: 'http://www.google.com?q=abc', qs: { q : 'search' }}) +setTimeout(function() { + assert.equal('/?q=search', req2.path) +}, 1) + +// Test appending a querystring value to the ones present in the uri +var req3 = request.get({ uri: 'http://www.google.com?x=y', qs: { q : 'search' }}) +setTimeout(function() { + assert.equal('/?x=y&q=search', req3.path) +}, 1) + +// Test leaving a querystring alone +var req4 = request.get({ uri: 'http://www.google.com?x=y'}) +setTimeout(function() { + assert.equal('/?x=y', req4.path) +}, 1) diff --git a/node_modules/nodetime/node_modules/request/tests/test-redirect.js b/node_modules/nodetime/node_modules/request/tests/test-redirect.js new file mode 100644 index 0000000..b84844a --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/test-redirect.js @@ -0,0 +1,154 @@ +var server = require('./server') + , assert = require('assert') + , request = require('../main.js') + , Cookie = require('../vendor/cookie') + , Jar = require('../vendor/cookie/jar') + +var s = server.createServer() + +s.listen(s.port, function () { + var server = 'http://localhost:' + s.port; + var hits = {} + var passed = 0; + + bouncer(301, 'temp') + bouncer(302, 'perm') + bouncer(302, 'nope') + + function bouncer(code, label) { + var landing = label+'_landing'; + + s.on('/'+label, function (req, res) { + hits[label] = true; + res.writeHead(code, { + 'location':server + '/'+landing, + 'set-cookie': 'ham=eggs' + }) + res.end() + }) + + s.on('/'+landing, function (req, res) { + if (req.method !== 'GET') { // We should only accept GET redirects + console.error("Got a non-GET request to the redirect destination URL"); + res.writeHead(400); + res.end(); + return; + } + // Make sure the cookie doesn't get included twice, see #139: + // Make sure cookies are set properly after redirect + assert.equal(req.headers.cookie, 'foo=bar; quux=baz; ham=eggs'); + hits[landing] = true; + res.writeHead(200) + res.end(landing) + }) + } + + // Permanent bounce + var jar = new Jar() + jar.add(new Cookie('quux=baz')) + request({uri: server+'/perm', jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { + if (er) throw er + if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode) + assert.ok(hits.perm, 'Original request is to /perm') + assert.ok(hits.perm_landing, 'Forward to permanent landing URL') + assert.equal(body, 'perm_landing', 'Got permanent landing content') + passed += 1 + done() + }) + + // Temporary bounce + request({uri: server+'/temp', jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { + if (er) throw er + if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode) + assert.ok(hits.temp, 'Original request is to /temp') + assert.ok(hits.temp_landing, 'Forward to temporary landing URL') + assert.equal(body, 'temp_landing', 'Got temporary landing content') + passed += 1 + done() + }) + + // Prevent bouncing. + request({uri:server+'/nope', jar: jar, headers: {cookie: 'foo=bar'}, followRedirect:false}, function (er, res, body) { + if (er) throw er + if (res.statusCode !== 302) throw new Error('Status is not 302: '+res.statusCode) + assert.ok(hits.nope, 'Original request to /nope') + assert.ok(!hits.nope_landing, 'No chasing the redirect') + assert.equal(res.statusCode, 302, 'Response is the bounce itself') + passed += 1 + done() + }) + + // Should not follow post redirects by default + request.post(server+'/temp', { jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { + if (er) throw er + if (res.statusCode !== 301) throw new Error('Status is not 301: '+res.statusCode) + assert.ok(hits.temp, 'Original request is to /temp') + assert.ok(!hits.temp_landing, 'No chasing the redirect when post') + assert.equal(res.statusCode, 301, 'Response is the bounce itself') + passed += 1 + done() + }) + + // Should follow post redirects when followAllRedirects true + request.post({uri:server+'/temp', followAllRedirects:true, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { + if (er) throw er + if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode) + assert.ok(hits.temp, 'Original request is to /temp') + assert.ok(hits.temp_landing, 'Forward to temporary landing URL') + assert.equal(body, 'temp_landing', 'Got temporary landing content') + passed += 1 + done() + }) + + request.post({uri:server+'/temp', followAllRedirects:false, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { + if (er) throw er + if (res.statusCode !== 301) throw new Error('Status is not 301: '+res.statusCode) + assert.ok(hits.temp, 'Original request is to /temp') + assert.ok(!hits.temp_landing, 'No chasing the redirect') + assert.equal(res.statusCode, 301, 'Response is the bounce itself') + passed += 1 + done() + }) + + // Should not follow delete redirects by default + request.del(server+'/temp', { jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { + if (er) throw er + if (res.statusCode < 301) throw new Error('Status is not a redirect.') + assert.ok(hits.temp, 'Original request is to /temp') + assert.ok(!hits.temp_landing, 'No chasing the redirect when delete') + assert.equal(res.statusCode, 301, 'Response is the bounce itself') + passed += 1 + done() + }) + + // Should not follow delete redirects even if followRedirect is set to true + request.del(server+'/temp', { followRedirect: true, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { + if (er) throw er + if (res.statusCode !== 301) throw new Error('Status is not 301: '+res.statusCode) + assert.ok(hits.temp, 'Original request is to /temp') + assert.ok(!hits.temp_landing, 'No chasing the redirect when delete') + assert.equal(res.statusCode, 301, 'Response is the bounce itself') + passed += 1 + done() + }) + + // Should follow delete redirects when followAllRedirects true + request.del(server+'/temp', {followAllRedirects:true, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { + if (er) throw er + if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode) + assert.ok(hits.temp, 'Original request is to /temp') + assert.ok(hits.temp_landing, 'Forward to temporary landing URL') + assert.equal(body, 'temp_landing', 'Got temporary landing content') + passed += 1 + done() + }) + + var reqs_done = 0; + function done() { + reqs_done += 1; + if(reqs_done == 9) { + console.log(passed + ' tests passed.') + s.close() + } + } +}) diff --git a/node_modules/nodetime/node_modules/request/tests/test-s3.js b/node_modules/nodetime/node_modules/request/tests/test-s3.js new file mode 100644 index 0000000..5f59c4a --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/test-s3.js @@ -0,0 +1,13 @@ +var request = require('../main') + +var r = request.get('https://log.curlybracecast.com.s3.amazonaws.com/', + { aws: + { key: 'AKIAI6KIQRRVMGK3WK5Q' + , secret: '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' + , bucket: 'log.curlybracecast.com' + } + }, function (e, resp, body) { + console.log(r.headers) + console.log(body) + } +) \ No newline at end of file diff --git a/node_modules/nodetime/node_modules/request/tests/test-timeout.js b/node_modules/nodetime/node_modules/request/tests/test-timeout.js new file mode 100644 index 0000000..673f8ad --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/test-timeout.js @@ -0,0 +1,87 @@ +var server = require('./server') + , events = require('events') + , stream = require('stream') + , assert = require('assert') + , request = require('../main.js') + ; + +var s = server.createServer(); +var expectedBody = "waited"; +var remainingTests = 5; + +s.listen(s.port, function () { + // Request that waits for 200ms + s.on('/timeout', function (req, resp) { + setTimeout(function(){ + resp.writeHead(200, {'content-type':'text/plain'}) + resp.write(expectedBody) + resp.end() + }, 200); + }); + + // Scenario that should timeout + var shouldTimeout = { + url: s.url + "/timeout", + timeout:100 + } + + + request(shouldTimeout, function (err, resp, body) { + assert.equal(err.code, "ETIMEDOUT"); + checkDone(); + }) + + + // Scenario that shouldn't timeout + var shouldntTimeout = { + url: s.url + "/timeout", + timeout:300 + } + + request(shouldntTimeout, function (err, resp, body) { + assert.equal(err, null); + assert.equal(expectedBody, body) + checkDone(); + }) + + // Scenario with no timeout set, so shouldn't timeout + var noTimeout = { + url: s.url + "/timeout" + } + + request(noTimeout, function (err, resp, body) { + assert.equal(err); + assert.equal(expectedBody, body) + checkDone(); + }) + + // Scenario with a negative timeout value, should be treated a zero or the minimum delay + var negativeTimeout = { + url: s.url + "/timeout", + timeout:-1000 + } + + request(negativeTimeout, function (err, resp, body) { + assert.equal(err.code, "ETIMEDOUT"); + checkDone(); + }) + + // Scenario with a float timeout value, should be rounded by setTimeout anyway + var floatTimeout = { + url: s.url + "/timeout", + timeout: 100.76 + } + + request(floatTimeout, function (err, resp, body) { + assert.equal(err.code, "ETIMEDOUT"); + checkDone(); + }) + + function checkDone() { + if(--remainingTests == 0) { + s.close(); + console.log("All tests passed."); + } + } +}) + diff --git a/node_modules/nodetime/node_modules/request/tests/test-toJSON.js b/node_modules/nodetime/node_modules/request/tests/test-toJSON.js new file mode 100644 index 0000000..b7c67ef --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/test-toJSON.js @@ -0,0 +1,14 @@ +var request = require('../main') + , http = require('http') + , assert = require('assert') + ; + +var s = http.createServer(function (req, resp) { + resp.statusCode = 200 + resp.end('asdf') +}).listen(8080, function () { + var r = request('http://localhost:8080', function (e, resp) { + assert.equal(JSON.parse(JSON.stringify(r)).response.statusCode, 200) + s.close() + }) +}) \ No newline at end of file diff --git a/node_modules/nodetime/node_modules/request/tests/test-tunnel.js b/node_modules/nodetime/node_modules/request/tests/test-tunnel.js new file mode 100644 index 0000000..51e2126 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tests/test-tunnel.js @@ -0,0 +1,63 @@ +// test that we can tunnel a https request over an http proxy +// keeping all the CA and whatnot intact. +// +// Note: this requires that squid is installed. +// If the proxy fails to start, we'll just log a warning and assume success. + +var server = require('./server') + , assert = require('assert') + , request = require('../main.js') + , fs = require('fs') + , path = require('path') + , caFile = path.resolve(__dirname, 'ssl/npm-ca.crt') + , ca = fs.readFileSync(caFile) + , child_process = require('child_process') + , sqConf = path.resolve(__dirname, 'squid.conf') + , sqArgs = ['-f', sqConf, '-N', '-d', '5'] + , proxy = 'http://localhost:3128' + , hadError = null + +var squid = child_process.spawn('squid', sqArgs); +var ready = false + +squid.stderr.on('data', function (c) { + console.error('SQUIDERR ' + c.toString().trim().split('\n') + .join('\nSQUIDERR ')) + ready = c.toString().match(/ready to serve requests/i) +}) + +squid.stdout.on('data', function (c) { + console.error('SQUIDOUT ' + c.toString().trim().split('\n') + .join('\nSQUIDOUT ')) +}) + +squid.on('exit', function (c) { + console.error('squid: exit '+c) + if (c && !ready) { + console.error('squid must be installed to run this test.') + console.error('skipping this test. please install squid and run again if you need to test tunneling.') + c = null + hadError = null + process.exit(0) + return + } + + if (c) { + hadError = hadError || new Error('Squid exited with '+c) + } + if (hadError) throw hadError +}) + +setTimeout(function F () { + if (!ready) return setTimeout(F, 100) + request({ uri: 'https://registry.npmjs.org/' + , proxy: 'http://localhost:3128' + , strictSSL: true + , ca: ca + , json: true }, function (er, body) { + hadError = er + console.log(er || typeof body) + if (!er) console.log("ok") + squid.kill('SIGKILL') + }) +}, 100) diff --git a/node_modules/nodetime/node_modules/request/tests/unicycle.jpg b/node_modules/nodetime/node_modules/request/tests/unicycle.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7cea4dd71dc41cd51c84bfcec6b3e65c15a58507 GIT binary patch literal 19806 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 literal 0 HcmV?d00001 diff --git a/node_modules/nodetime/node_modules/request/tunnel.js b/node_modules/nodetime/node_modules/request/tunnel.js new file mode 100644 index 0000000..3f7bbb9 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/tunnel.js @@ -0,0 +1,227 @@ +'use strict' + +var net = require('net') + , tls = require('tls') + , http = require('http') + , https = require('https') + , events = require('events') + , assert = require('assert') + , util = require('util') + ; + +exports.httpOverHttp = httpOverHttp +exports.httpsOverHttp = httpsOverHttp +exports.httpOverHttps = httpOverHttps +exports.httpsOverHttps = httpsOverHttps + + +function httpOverHttp(options) { + var agent = new TunnelingAgent(options) + agent.request = http.request + return agent +} + +function httpsOverHttp(options) { + var agent = new TunnelingAgent(options) + agent.request = http.request + agent.createSocket = createSecureSocket + return agent +} + +function httpOverHttps(options) { + var agent = new TunnelingAgent(options) + agent.request = https.request + return agent +} + +function httpsOverHttps(options) { + var agent = new TunnelingAgent(options) + agent.request = https.request + agent.createSocket = createSecureSocket + return agent +} + + +function TunnelingAgent(options) { + var self = this + self.options = options || {} + self.proxyOptions = self.options.proxy || {} + self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets + self.requests = [] + self.sockets = [] + + self.on('free', function onFree(socket, host, port) { + for (var i = 0, len = self.requests.length; i < len; ++i) { + var pending = self.requests[i] + if (pending.host === host && pending.port === port) { + // Detect the request to connect same origin server, + // reuse the connection. + self.requests.splice(i, 1) + pending.request.onSocket(socket) + return + } + } + socket.destroy() + self.removeSocket(socket) + }) +} +util.inherits(TunnelingAgent, events.EventEmitter) + +TunnelingAgent.prototype.addRequest = function addRequest(req, host, port) { + var self = this + + if (self.sockets.length >= this.maxSockets) { + // We are over limit so we'll add it to the queue. + self.requests.push({host: host, port: port, request: req}) + return + } + + // If we are under maxSockets create a new one. + self.createSocket({host: host, port: port, request: req}, function(socket) { + socket.on('free', onFree) + socket.on('close', onCloseOrRemove) + socket.on('agentRemove', onCloseOrRemove) + req.onSocket(socket) + + function onFree() { + self.emit('free', socket, host, port) + } + + function onCloseOrRemove(err) { + self.removeSocket() + socket.removeListener('free', onFree) + socket.removeListener('close', onCloseOrRemove) + socket.removeListener('agentRemove', onCloseOrRemove) + } + }) +} + +TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { + var self = this + var placeholder = {} + self.sockets.push(placeholder) + + var connectOptions = mergeOptions({}, self.proxyOptions, + { method: 'CONNECT' + , path: options.host + ':' + options.port + , agent: false + } + ) + if (connectOptions.proxyAuth) { + connectOptions.headers = connectOptions.headers || {} + connectOptions.headers['Proxy-Authorization'] = 'Basic ' + + new Buffer(connectOptions.proxyAuth).toString('base64') + } + + debug('making CONNECT request') + var connectReq = self.request(connectOptions) + connectReq.useChunkedEncodingByDefault = false // for v0.6 + connectReq.once('response', onResponse) // for v0.6 + connectReq.once('upgrade', onUpgrade) // for v0.6 + connectReq.once('connect', onConnect) // for v0.7 or later + connectReq.once('error', onError) + connectReq.end() + + function onResponse(res) { + // Very hacky. This is necessary to avoid http-parser leaks. + res.upgrade = true + } + + function onUpgrade(res, socket, head) { + // Hacky. + process.nextTick(function() { + onConnect(res, socket, head) + }) + } + + function onConnect(res, socket, head) { + connectReq.removeAllListeners() + socket.removeAllListeners() + + if (res.statusCode === 200) { + assert.equal(head.length, 0) + debug('tunneling connection has established') + self.sockets[self.sockets.indexOf(placeholder)] = socket + cb(socket) + } else { + debug('tunneling socket could not be established, statusCode=%d', res.statusCode) + var error = new Error('tunneling socket could not be established, ' + 'statusCode=' + res.statusCode) + error.code = 'ECONNRESET' + options.request.emit('error', error) + self.removeSocket(placeholder) + } + } + + function onError(cause) { + connectReq.removeAllListeners() + + debug('tunneling socket could not be established, cause=%s\n', cause.message, cause.stack) + var error = new Error('tunneling socket could not be established, ' + 'cause=' + cause.message) + error.code = 'ECONNRESET' + options.request.emit('error', error) + self.removeSocket(placeholder) + } +} + +TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { + var pos = this.sockets.indexOf(socket) + if (pos === -1) return + + this.sockets.splice(pos, 1) + + var pending = this.requests.shift() + if (pending) { + // If we have pending requests and a socket gets closed a new one + // needs to be created to take over in the pool for the one that closed. + this.createSocket(pending, function(socket) { + pending.request.onSocket(socket) + }) + } +} + +function createSecureSocket(options, cb) { + var self = this + TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { + // 0 is dummy port for v0.6 + var secureSocket = tls.connect(0, mergeOptions({}, self.options, + { servername: options.host + , socket: socket + } + )) + cb(secureSocket) + }) +} + + +function mergeOptions(target) { + for (var i = 1, len = arguments.length; i < len; ++i) { + var overrides = arguments[i] + if (typeof overrides === 'object') { + var keys = Object.keys(overrides) + for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { + var k = keys[j] + if (overrides[k] !== undefined) { + target[k] = overrides[k] + } + } + } + } + return target +} + + +var debug +if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { + debug = function() { + var args = Array.prototype.slice.call(arguments) + if (typeof args[0] === 'string') { + args[0] = 'TUNNEL: ' + args[0] + } else { + args.unshift('TUNNEL:') + } + console.error.apply(console, args) + } +} else { + debug = function() {} +} +exports.debug = debug // for test diff --git a/node_modules/nodetime/node_modules/request/uuid.js b/node_modules/nodetime/node_modules/request/uuid.js new file mode 100644 index 0000000..fc0588b --- /dev/null +++ b/node_modules/nodetime/node_modules/request/uuid.js @@ -0,0 +1,19 @@ +module.exports = function () { + var s = [], itoh = '0123456789ABCDEF' + + // Make array of random hex digits. The UUID only has 32 digits in it, but we + // allocate an extra items to make room for the '-'s we'll be inserting. + for (var i = 0; i <36; i++) s[i] = Math.floor(Math.random()*0x10) + + // Conform to RFC-4122, section 4.4 + s[14] = 4; // Set 4 high bits of time_high field to version + s[19] = (s[19] & 0x3) | 0x8 // Specify 2 high bits of clock sequence + + // Convert to hex chars + for (var i = 0; i <36; i++) s[i] = itoh[s[i]] + + // Insert '-'s + s[8] = s[13] = s[18] = s[23] = '-' + + return s.join('') +} diff --git a/node_modules/nodetime/node_modules/request/vendor/cookie/index.js b/node_modules/nodetime/node_modules/request/vendor/cookie/index.js new file mode 100644 index 0000000..ff44b3e --- /dev/null +++ b/node_modules/nodetime/node_modules/request/vendor/cookie/index.js @@ -0,0 +1,65 @@ +/*! + * Tobi - Cookie + * Copyright(c) 2010 LearnBoost + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var url = require('url'); + +/** + * Initialize a new `Cookie` with the given cookie `str` and `req`. + * + * @param {String} str + * @param {IncomingRequest} req + * @api private + */ + +var Cookie = exports = module.exports = function Cookie(str, req) { + this.str = str; + + // Map the key/val pairs + str.split(/ *; */).reduce(function(obj, pair){ + var p = pair.indexOf('='); + var key = p > 0 ? pair.substring(0, p).trim() : pair.trim(); + var lowerCasedKey = key.toLowerCase(); + var value = p > 0 ? pair.substring(p + 1).trim() : true; + + if (!obj.name) { + // First key is the name + obj.name = key; + obj.value = value; + } + else if (lowerCasedKey === 'httponly') { + obj.httpOnly = value; + } + else { + obj[lowerCasedKey] = value; + } + return obj; + }, this); + + // Expires + this.expires = this.expires + ? new Date(this.expires) + : Infinity; + + // Default or trim path + this.path = this.path + ? this.path.trim(): req + ? url.parse(req.url).pathname: '/'; +}; + +/** + * Return the original cookie string. + * + * @return {String} + * @api public + */ + +Cookie.prototype.toString = function(){ + return this.str; +}; diff --git a/node_modules/nodetime/node_modules/request/vendor/cookie/jar.js b/node_modules/nodetime/node_modules/request/vendor/cookie/jar.js new file mode 100644 index 0000000..34920e0 --- /dev/null +++ b/node_modules/nodetime/node_modules/request/vendor/cookie/jar.js @@ -0,0 +1,72 @@ +/*! +* Tobi - CookieJar +* Copyright(c) 2010 LearnBoost +* MIT Licensed +*/ + +/** +* Module dependencies. +*/ + +var url = require('url'); + +/** +* Initialize a new `CookieJar`. +* +* @api private +*/ + +var CookieJar = exports = module.exports = function CookieJar() { + this.cookies = []; +}; + +/** +* Add the given `cookie` to the jar. +* +* @param {Cookie} cookie +* @api private +*/ + +CookieJar.prototype.add = function(cookie){ + this.cookies = this.cookies.filter(function(c){ + // Avoid duplication (same path, same name) + return !(c.name == cookie.name && c.path == cookie.path); + }); + this.cookies.push(cookie); +}; + +/** +* Get cookies for the given `req`. +* +* @param {IncomingRequest} req +* @return {Array} +* @api private +*/ + +CookieJar.prototype.get = function(req){ + var path = url.parse(req.url).pathname + , now = new Date + , specificity = {}; + return this.cookies.filter(function(cookie){ + if (0 == path.indexOf(cookie.path) && now < cookie.expires + && cookie.path.length > (specificity[cookie.name] || 0)) + return specificity[cookie.name] = cookie.path.length; + }); +}; + +/** +* Return Cookie string for the given `req`. +* +* @param {IncomingRequest} req +* @return {String} +* @api private +*/ + +CookieJar.prototype.cookieString = function(req){ + var cookies = this.get(req); + if (cookies.length) { + return cookies.map(function(cookie){ + return cookie.name + '=' + cookie.value; + }).join('; '); + } +}; diff --git a/node_modules/nodetime/package.json b/node_modules/nodetime/package.json new file mode 100644 index 0000000..e9e2c8c --- /dev/null +++ b/node_modules/nodetime/package.json @@ -0,0 +1,70 @@ +{ + "name": "nodetime", + "version": "0.8.10", + "description": "Performance Profiler and Monitor", + "author": { + "name": "Nodetime", + "email": "devops@nodetime.com" + }, + "homepage": "http://nodetime.com", + "keywords": [ + "profiler", + "profiling", + "tracing", + "cpu", + "heap", + "performance", + "instrumentation", + "response time", + "performance", + "bottlenecks", + "monitoring", + "analytics", + "metrics", + "alerts", + "dtrace" + ], + "contributors": [], + "main": "./index.js", + "directories": { + "lib": "./lib" + }, + "repository": { + "type": "git", + "url": "git://github.com/nodetime/nodetime.git" + }, + "dependencies": { + "request": "2.12.0", + "nodetime-native": "0.1.0" + }, + "optionalDependencies": { + "nodetime-native": "0.1.0" + }, + "devDependencies": { + "mocha": "*", + "memwatch": "*", + "async": "*", + "express": "*", + "socket.io": "*", + "redis": "*", + "mongodb": "*", + "mongoose": "*", + "mysql": "*", + "pg": "*", + "memcached": "*", + "memcache": "*", + "cassandra-client": "*", + "cassandra": "*" + }, + "engines": { + "node": ">=0.6.0" + }, + "licenses": [ + { + "url": "http://github.com/nodetime/nodetime/raw/master/LICENSE" + } + ], + "readme": "Nodetime - Performance Profiler and Monitor for Node.js Applications\n===========================================\nNodetime reveals response time and other internals of HTTP requests and underlying HTTP, database, file system and other API calls in your Node.js application. Coupled with related process and OS state information, real-time and historical metrics, monitoring as well as CPU and memory profiling it enables tracing performance problems down to the root cause. Nodetime supports multiple APIs including native HTTP client, file system, cluster and sockets, Socket.io, Redis, MongoDB, MySQL, PostgreSQL, Memcached and Cassandra. HTTP based data stores like CouchDB and Riak are supported via HTTP API.\n\nThis repository contains the source code of Nodetime agent. Agent runs within the application and securely sends profiling data and metrics to Nodetime server, where they are made available via web console at nodetime.com.\n\nFull documentation at [nodetime.com](http://nodetime.com) [Docs section](http://nodetime.com/docs).\n\nFor questions or technical issues please contact our [support team](http://support.nodetime.com).\n\n\n", + "_id": "nodetime@0.8.10", + "_from": "nodetime@0.8.10" +} diff --git a/node_modules/nodetime/publish.sh b/node_modules/nodetime/publish.sh new file mode 100755 index 0000000..389fac6 --- /dev/null +++ b/node_modules/nodetime/publish.sh @@ -0,0 +1,11 @@ +TAG=$1 +MSG=$2 + +echo "pushing and publishing $TAG ($MSG)" + +#git add . +#git commit -am "$MSG" +git tag -a "$TAG" -m "$MSG" +git push origin master +git push origin $TAG +npm publish diff --git a/package.json b/package.json index 6d619be..35dd761 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "less-middleware": "0.1.6", "mongoose": "3.5.7", "timekit": "0.1.9", + "nodetime": "0.8.10", "v8tools": "0.2.1" }, "engines": { From 65bfcc698fefe008e10d1658c3c746c67c62af08 Mon Sep 17 00:00:00 2001 From: Jamie Folsom Date: Fri, 5 Apr 2013 16:51:31 -0400 Subject: [PATCH 14/18] Add node modules to .gitignore. Remove node modules from repo. --- .gitignore | 2 +- backups/live-annotations-2-22.json | 3706 ------- node_modules/.bin/express | 1 - node_modules/cors/cors.js | 21 - node_modules/express/.npmignore | 9 - node_modules/express/.travis.yml | 4 - node_modules/express/History.md | 1091 -- node_modules/express/LICENSE | 22 - node_modules/express/Makefile | 33 - node_modules/express/Readme.md | 179 - node_modules/express/bin/express | 422 - node_modules/express/client.js | 25 - node_modules/express/index.js | 4 - node_modules/express/lib/application.js | 534 - node_modules/express/lib/express.js | 92 - node_modules/express/lib/middleware.js | 33 - node_modules/express/lib/request.js | 493 - node_modules/express/lib/response.js | 754 -- node_modules/express/lib/router/index.js | 273 - node_modules/express/lib/router/route.js | 72 - node_modules/express/lib/utils.js | 282 - node_modules/express/lib/view.js | 76 - .../node_modules/buffer-crc32/.npmignore | 1 - .../node_modules/buffer-crc32/.travis.yml | 8 - .../node_modules/buffer-crc32/README.md | 33 - .../node_modules/buffer-crc32/index.js | 84 - .../node_modules/buffer-crc32/package.json | 30 - .../buffer-crc32/tests/crc.test.js | 52 - .../express/node_modules/commander/.npmignore | 4 - .../node_modules/commander/.travis.yml | 4 - .../express/node_modules/commander/History.md | 107 - .../express/node_modules/commander/Makefile | 7 - .../express/node_modules/commander/Readme.md | 262 - .../express/node_modules/commander/index.js | 2 - .../node_modules/commander/lib/commander.js | 1026 -- .../node_modules/commander/package.json | 34 - .../express/node_modules/connect/.npmignore | 12 - .../express/node_modules/connect/.travis.yml | 5 - .../express/node_modules/connect/LICENSE | 24 - .../express/node_modules/connect/Readme.md | 133 - .../express/node_modules/connect/index.js | 4 - .../node_modules/connect/lib-cov/cache.js | 68 - .../node_modules/connect/lib-cov/connect.js | 93 - .../node_modules/connect/lib-cov/index.js | 6 - .../connect/lib-cov/middleware/basicAuth.js | 128 - .../connect/lib-cov/middleware/bodyParser.js | 43 - .../connect/lib-cov/middleware/compress.js | 159 - .../lib-cov/middleware/cookieParser.js | 70 - .../lib-cov/middleware/cookieSession.js | 132 - .../connect/lib-cov/middleware/csrf.js | 51 - .../connect/lib-cov/middleware/directory.js | 256 - .../lib-cov/middleware/errorHandler.js | 104 - .../connect/lib-cov/middleware/favicon.js | 60 - .../connect/lib-cov/middleware/json.js | 117 - .../connect/lib-cov/middleware/limit.js | 63 - .../connect/lib-cov/middleware/logger.js | 312 - .../lib-cov/middleware/methodOverride.js | 42 - .../connect/lib-cov/middleware/multipart.js | 183 - .../connect/lib-cov/middleware/query.js | 27 - .../lib-cov/middleware/responseTime.js | 39 - .../connect/lib-cov/middleware/session.js | 321 - .../lib-cov/middleware/session/cookie.js | 65 - .../lib-cov/middleware/session/memory.js | 128 - .../lib-cov/middleware/session/session.js | 108 - .../lib-cov/middleware/session/store.js | 90 - .../connect/lib-cov/middleware/static.js | 92 - .../connect/lib-cov/middleware/staticCache.js | 276 - .../connect/lib-cov/middleware/timeout.js | 66 - .../connect/lib-cov/middleware/urlencoded.js | 98 - .../connect/lib-cov/middleware/vhost.js | 59 - .../node_modules/connect/lib-cov/patch.js | 85 - .../node_modules/connect/lib-cov/proto.js | 285 - .../connect/lib-cov/public/directory.html | 75 - .../connect/lib-cov/public/error.html | 13 - .../connect/lib-cov/public/favicon.ico | Bin 1406 -> 0 bytes .../connect/lib-cov/public/icons/page.png | Bin 635 -> 0 bytes .../connect/lib-cov/public/icons/page_add.png | Bin 739 -> 0 bytes .../lib-cov/public/icons/page_attach.png | Bin 794 -> 0 bytes .../lib-cov/public/icons/page_code.png | Bin 818 -> 0 bytes .../lib-cov/public/icons/page_copy.png | Bin 663 -> 0 bytes .../lib-cov/public/icons/page_delete.png | Bin 740 -> 0 bytes .../lib-cov/public/icons/page_edit.png | Bin 807 -> 0 bytes .../lib-cov/public/icons/page_error.png | Bin 793 -> 0 bytes .../lib-cov/public/icons/page_excel.png | Bin 817 -> 0 bytes .../lib-cov/public/icons/page_find.png | Bin 879 -> 0 bytes .../lib-cov/public/icons/page_gear.png | Bin 833 -> 0 bytes .../connect/lib-cov/public/icons/page_go.png | Bin 779 -> 0 bytes .../lib-cov/public/icons/page_green.png | Bin 621 -> 0 bytes .../connect/lib-cov/public/icons/page_key.png | Bin 801 -> 0 bytes .../lib-cov/public/icons/page_lightning.png | Bin 839 -> 0 bytes .../lib-cov/public/icons/page_link.png | Bin 830 -> 0 bytes .../lib-cov/public/icons/page_paintbrush.png | Bin 813 -> 0 bytes .../lib-cov/public/icons/page_paste.png | Bin 703 -> 0 bytes .../connect/lib-cov/public/icons/page_red.png | Bin 641 -> 0 bytes .../lib-cov/public/icons/page_refresh.png | Bin 858 -> 0 bytes .../lib-cov/public/icons/page_save.png | Bin 774 -> 0 bytes .../lib-cov/public/icons/page_white.png | Bin 294 -> 0 bytes .../public/icons/page_white_acrobat.png | Bin 591 -> 0 bytes .../public/icons/page_white_actionscript.png | Bin 664 -> 0 bytes .../lib-cov/public/icons/page_white_add.png | Bin 512 -> 0 bytes .../lib-cov/public/icons/page_white_c.png | Bin 587 -> 0 bytes .../public/icons/page_white_camera.png | Bin 656 -> 0 bytes .../lib-cov/public/icons/page_white_cd.png | Bin 666 -> 0 bytes .../lib-cov/public/icons/page_white_code.png | Bin 603 -> 0 bytes .../public/icons/page_white_code_red.png | Bin 587 -> 0 bytes .../public/icons/page_white_coldfusion.png | Bin 592 -> 0 bytes .../public/icons/page_white_compressed.png | Bin 724 -> 0 bytes .../lib-cov/public/icons/page_white_copy.png | Bin 309 -> 0 bytes .../public/icons/page_white_cplusplus.png | Bin 621 -> 0 bytes .../public/icons/page_white_csharp.png | Bin 700 -> 0 bytes .../lib-cov/public/icons/page_white_cup.png | Bin 639 -> 0 bytes .../public/icons/page_white_database.png | Bin 579 -> 0 bytes .../public/icons/page_white_delete.png | Bin 536 -> 0 bytes .../lib-cov/public/icons/page_white_dvd.png | Bin 638 -> 0 bytes .../lib-cov/public/icons/page_white_edit.png | Bin 618 -> 0 bytes .../lib-cov/public/icons/page_white_error.png | Bin 623 -> 0 bytes .../lib-cov/public/icons/page_white_excel.png | Bin 663 -> 0 bytes .../lib-cov/public/icons/page_white_find.png | Bin 676 -> 0 bytes .../lib-cov/public/icons/page_white_flash.png | Bin 582 -> 0 bytes .../public/icons/page_white_freehand.png | Bin 639 -> 0 bytes .../lib-cov/public/icons/page_white_gear.png | Bin 402 -> 0 bytes .../lib-cov/public/icons/page_white_get.png | Bin 516 -> 0 bytes .../lib-cov/public/icons/page_white_go.png | Bin 612 -> 0 bytes .../lib-cov/public/icons/page_white_h.png | Bin 603 -> 0 bytes .../public/icons/page_white_horizontal.png | Bin 296 -> 0 bytes .../lib-cov/public/icons/page_white_key.png | Bin 616 -> 0 bytes .../public/icons/page_white_lightning.png | Bin 669 -> 0 bytes .../lib-cov/public/icons/page_white_link.png | Bin 614 -> 0 bytes .../public/icons/page_white_magnify.png | Bin 554 -> 0 bytes .../lib-cov/public/icons/page_white_medal.png | Bin 706 -> 0 bytes .../public/icons/page_white_office.png | Bin 779 -> 0 bytes .../lib-cov/public/icons/page_white_paint.png | Bin 688 -> 0 bytes .../public/icons/page_white_paintbrush.png | Bin 618 -> 0 bytes .../lib-cov/public/icons/page_white_paste.png | Bin 620 -> 0 bytes .../lib-cov/public/icons/page_white_php.png | Bin 538 -> 0 bytes .../public/icons/page_white_picture.png | Bin 650 -> 0 bytes .../public/icons/page_white_powerpoint.png | Bin 588 -> 0 bytes .../lib-cov/public/icons/page_white_put.png | Bin 523 -> 0 bytes .../lib-cov/public/icons/page_white_ruby.png | Bin 626 -> 0 bytes .../lib-cov/public/icons/page_white_stack.png | Bin 317 -> 0 bytes .../lib-cov/public/icons/page_white_star.png | Bin 565 -> 0 bytes .../public/icons/page_white_swoosh.png | Bin 634 -> 0 bytes .../lib-cov/public/icons/page_white_text.png | Bin 342 -> 0 bytes .../public/icons/page_white_text_width.png | Bin 315 -> 0 bytes .../lib-cov/public/icons/page_white_tux.png | Bin 668 -> 0 bytes .../public/icons/page_white_vector.png | Bin 644 -> 0 bytes .../public/icons/page_white_visualstudio.png | Bin 702 -> 0 bytes .../lib-cov/public/icons/page_white_width.png | Bin 309 -> 0 bytes .../lib-cov/public/icons/page_white_word.png | Bin 651 -> 0 bytes .../lib-cov/public/icons/page_white_world.png | Bin 734 -> 0 bytes .../public/icons/page_white_wrench.png | Bin 613 -> 0 bytes .../lib-cov/public/icons/page_white_zip.png | Bin 386 -> 0 bytes .../lib-cov/public/icons/page_word.png | Bin 777 -> 0 bytes .../lib-cov/public/icons/page_world.png | Bin 903 -> 0 bytes .../connect/lib-cov/public/style.css | 141 - .../node_modules/connect/lib-cov/utils.js | 282 - .../express/node_modules/connect/lib/cache.js | 81 - .../node_modules/connect/lib/connect.js | 93 - .../express/node_modules/connect/lib/index.js | 50 - .../connect/lib/middleware/basicAuth.js | 103 - .../connect/lib/middleware/bodyParser.js | 61 - .../connect/lib/middleware/compress.js | 147 - .../connect/lib/middleware/cookieParser.js | 62 - .../connect/lib/middleware/cookieSession.js | 115 - .../connect/lib/middleware/csrf.js | 73 - .../connect/lib/middleware/directory.js | 228 - .../connect/lib/middleware/errorHandler.js | 86 - .../connect/lib/middleware/favicon.js | 81 - .../connect/lib/middleware/json.js | 86 - .../connect/lib/middleware/limit.js | 55 - .../connect/lib/middleware/logger.js | 339 - .../connect/lib/middleware/methodOverride.js | 40 - .../connect/lib/middleware/multipart.js | 133 - .../connect/lib/middleware/query.js | 46 - .../connect/lib/middleware/responseTime.js | 32 - .../connect/lib/middleware/session.js | 352 - .../connect/lib/middleware/session/cookie.js | 128 - .../connect/lib/middleware/session/memory.js | 129 - .../connect/lib/middleware/session/session.js | 116 - .../connect/lib/middleware/session/store.js | 84 - .../connect/lib/middleware/static.js | 94 - .../connect/lib/middleware/staticCache.js | 231 - .../connect/lib/middleware/timeout.js | 56 - .../connect/lib/middleware/urlencoded.js | 78 - .../connect/lib/middleware/vhost.js | 40 - .../express/node_modules/connect/lib/patch.js | 79 - .../express/node_modules/connect/lib/proto.js | 239 - .../connect/lib/public/directory.html | 81 - .../connect/lib/public/error.html | 14 - .../connect/lib/public/favicon.ico | Bin 1406 -> 0 bytes .../connect/lib/public/icons/page.png | Bin 635 -> 0 bytes .../connect/lib/public/icons/page_add.png | Bin 739 -> 0 bytes .../connect/lib/public/icons/page_attach.png | Bin 794 -> 0 bytes .../connect/lib/public/icons/page_code.png | Bin 818 -> 0 bytes .../connect/lib/public/icons/page_copy.png | Bin 663 -> 0 bytes .../connect/lib/public/icons/page_delete.png | Bin 740 -> 0 bytes .../connect/lib/public/icons/page_edit.png | Bin 807 -> 0 bytes .../connect/lib/public/icons/page_error.png | Bin 793 -> 0 bytes .../connect/lib/public/icons/page_excel.png | Bin 817 -> 0 bytes .../connect/lib/public/icons/page_find.png | Bin 879 -> 0 bytes .../connect/lib/public/icons/page_gear.png | Bin 833 -> 0 bytes .../connect/lib/public/icons/page_go.png | Bin 779 -> 0 bytes .../connect/lib/public/icons/page_green.png | Bin 621 -> 0 bytes .../connect/lib/public/icons/page_key.png | Bin 801 -> 0 bytes .../lib/public/icons/page_lightning.png | Bin 839 -> 0 bytes .../connect/lib/public/icons/page_link.png | Bin 830 -> 0 bytes .../lib/public/icons/page_paintbrush.png | Bin 813 -> 0 bytes .../connect/lib/public/icons/page_paste.png | Bin 703 -> 0 bytes .../connect/lib/public/icons/page_red.png | Bin 641 -> 0 bytes .../connect/lib/public/icons/page_refresh.png | Bin 858 -> 0 bytes .../connect/lib/public/icons/page_save.png | Bin 774 -> 0 bytes .../connect/lib/public/icons/page_white.png | Bin 294 -> 0 bytes .../lib/public/icons/page_white_acrobat.png | Bin 591 -> 0 bytes .../public/icons/page_white_actionscript.png | Bin 664 -> 0 bytes .../lib/public/icons/page_white_add.png | Bin 512 -> 0 bytes .../connect/lib/public/icons/page_white_c.png | Bin 587 -> 0 bytes .../lib/public/icons/page_white_camera.png | Bin 656 -> 0 bytes .../lib/public/icons/page_white_cd.png | Bin 666 -> 0 bytes .../lib/public/icons/page_white_code.png | Bin 603 -> 0 bytes .../lib/public/icons/page_white_code_red.png | Bin 587 -> 0 bytes .../public/icons/page_white_coldfusion.png | Bin 592 -> 0 bytes .../public/icons/page_white_compressed.png | Bin 724 -> 0 bytes .../lib/public/icons/page_white_copy.png | Bin 309 -> 0 bytes .../lib/public/icons/page_white_cplusplus.png | Bin 621 -> 0 bytes .../lib/public/icons/page_white_csharp.png | Bin 700 -> 0 bytes .../lib/public/icons/page_white_cup.png | Bin 639 -> 0 bytes .../lib/public/icons/page_white_database.png | Bin 579 -> 0 bytes .../lib/public/icons/page_white_delete.png | Bin 536 -> 0 bytes .../lib/public/icons/page_white_dvd.png | Bin 638 -> 0 bytes .../lib/public/icons/page_white_edit.png | Bin 618 -> 0 bytes .../lib/public/icons/page_white_error.png | Bin 623 -> 0 bytes .../lib/public/icons/page_white_excel.png | Bin 663 -> 0 bytes .../lib/public/icons/page_white_find.png | Bin 676 -> 0 bytes .../lib/public/icons/page_white_flash.png | Bin 582 -> 0 bytes .../lib/public/icons/page_white_freehand.png | Bin 639 -> 0 bytes .../lib/public/icons/page_white_gear.png | Bin 402 -> 0 bytes .../lib/public/icons/page_white_get.png | Bin 516 -> 0 bytes .../lib/public/icons/page_white_go.png | Bin 612 -> 0 bytes .../connect/lib/public/icons/page_white_h.png | Bin 603 -> 0 bytes .../public/icons/page_white_horizontal.png | Bin 296 -> 0 bytes .../lib/public/icons/page_white_key.png | Bin 616 -> 0 bytes .../lib/public/icons/page_white_lightning.png | Bin 669 -> 0 bytes .../lib/public/icons/page_white_link.png | Bin 614 -> 0 bytes .../lib/public/icons/page_white_magnify.png | Bin 554 -> 0 bytes .../lib/public/icons/page_white_medal.png | Bin 706 -> 0 bytes .../lib/public/icons/page_white_office.png | Bin 779 -> 0 bytes .../lib/public/icons/page_white_paint.png | Bin 688 -> 0 bytes .../public/icons/page_white_paintbrush.png | Bin 618 -> 0 bytes .../lib/public/icons/page_white_paste.png | Bin 620 -> 0 bytes .../lib/public/icons/page_white_php.png | Bin 538 -> 0 bytes .../lib/public/icons/page_white_picture.png | Bin 650 -> 0 bytes .../public/icons/page_white_powerpoint.png | Bin 588 -> 0 bytes .../lib/public/icons/page_white_put.png | Bin 523 -> 0 bytes .../lib/public/icons/page_white_ruby.png | Bin 626 -> 0 bytes .../lib/public/icons/page_white_stack.png | Bin 317 -> 0 bytes .../lib/public/icons/page_white_star.png | Bin 565 -> 0 bytes .../lib/public/icons/page_white_swoosh.png | Bin 634 -> 0 bytes .../lib/public/icons/page_white_text.png | Bin 342 -> 0 bytes .../public/icons/page_white_text_width.png | Bin 315 -> 0 bytes .../lib/public/icons/page_white_tux.png | Bin 668 -> 0 bytes .../lib/public/icons/page_white_vector.png | Bin 644 -> 0 bytes .../public/icons/page_white_visualstudio.png | Bin 702 -> 0 bytes .../lib/public/icons/page_white_width.png | Bin 309 -> 0 bytes .../lib/public/icons/page_white_word.png | Bin 651 -> 0 bytes .../lib/public/icons/page_white_world.png | Bin 734 -> 0 bytes .../lib/public/icons/page_white_wrench.png | Bin 613 -> 0 bytes .../lib/public/icons/page_white_zip.png | Bin 386 -> 0 bytes .../connect/lib/public/icons/page_word.png | Bin 777 -> 0 bytes .../connect/lib/public/icons/page_world.png | Bin 903 -> 0 bytes .../node_modules/connect/lib/public/style.css | 141 - .../express/node_modules/connect/lib/utils.js | 370 - .../connect/node_modules/bytes/.npmignore | 1 - .../connect/node_modules/bytes/History.md | 5 - .../connect/node_modules/bytes/Makefile | 7 - .../connect/node_modules/bytes/Readme.md | 51 - .../connect/node_modules/bytes/component.json | 7 - .../connect/node_modules/bytes/index.js | 39 - .../connect/node_modules/bytes/package.json | 24 - .../node_modules/formidable/.npmignore | 4 - .../node_modules/formidable/.travis.yml | 4 - .../connect/node_modules/formidable/Makefile | 14 - .../connect/node_modules/formidable/Readme.md | 311 - .../connect/node_modules/formidable/TODO | 3 - .../benchmark/bench-multipart-parser.js | 70 - .../node_modules/formidable/example/post.js | 43 - .../node_modules/formidable/example/upload.js | 48 - .../connect/node_modules/formidable/index.js | 1 - .../node_modules/formidable/lib/file.js | 73 - .../formidable/lib/incoming_form.js | 384 - .../node_modules/formidable/lib/index.js | 3 - .../formidable/lib/multipart_parser.js | 312 - .../formidable/lib/querystring_parser.js | 25 - .../node_modules/formidable/lib/util.js | 6 - .../formidable/node-gently/Makefile | 4 - .../formidable/node-gently/Readme.md | 167 - .../formidable/node-gently/example/dog.js | 22 - .../node-gently/example/event_emitter.js | 11 - .../formidable/node-gently/index.js | 1 - .../node-gently/lib/gently/gently.js | 184 - .../node-gently/lib/gently/index.js | 1 - .../formidable/node-gently/package.json | 14 - .../formidable/node-gently/test/common.js | 8 - .../node-gently/test/simple/test-gently.js | 348 - .../node_modules/formidable/package.json | 27 - .../node_modules/formidable/test/common.js | 19 - .../test/fixture/file/funkyfilename.txt | 1 - .../formidable/test/fixture/file/plain.txt | 1 - .../http/special-chars-in-filename/info.md | 3 - .../formidable/test/fixture/js/no-filename.js | 3 - .../fixture/js/special-chars-in-filename.js | 21 - .../formidable/test/fixture/multipart.js | 72 - .../test/integration/test-fixtures.js | 89 - .../formidable/test/legacy/common.js | 24 - .../integration/test-multipart-parser.js | 80 - .../test/legacy/simple/test-file.js | 104 - .../test/legacy/simple/test-incoming-form.js | 727 -- .../legacy/simple/test-multipart-parser.js | 50 - .../legacy/simple/test-querystring-parser.js | 45 - .../legacy/system/test-multi-video-upload.js | 75 - .../node_modules/formidable/test/run.js | 2 - .../test/unit/test-incoming-form.js | 63 - .../node_modules/formidable/tool/record.js | 47 - .../connect/node_modules/pause/.npmignore | 4 - .../connect/node_modules/pause/History.md | 5 - .../connect/node_modules/pause/Makefile | 7 - .../connect/node_modules/pause/Readme.md | 29 - .../connect/node_modules/pause/index.js | 29 - .../connect/node_modules/pause/package.json | 19 - .../connect/node_modules/qs/.gitmodules | 6 - .../connect/node_modules/qs/.npmignore | 1 - .../connect/node_modules/qs/.travis.yml | 4 - .../connect/node_modules/qs/History.md | 83 - .../connect/node_modules/qs/Makefile | 12 - .../connect/node_modules/qs/Readme.md | 58 - .../connect/node_modules/qs/benchmark.js | 17 - .../connect/node_modules/qs/component.json | 6 - .../connect/node_modules/qs/examples.js | 51 - .../connect/node_modules/qs/index.js | 2 - .../connect/node_modules/qs/lib/head.js | 1 - .../node_modules/qs/lib/querystring.js | 262 - .../connect/node_modules/qs/lib/tail.js | 1 - .../connect/node_modules/qs/package.json | 35 - .../connect/node_modules/qs/querystring.js | 254 - .../node_modules/qs/test/browser/expect.js | 1202 --- .../node_modules/qs/test/browser/index.html | 18 - .../node_modules/qs/test/browser/jquery.js | 8981 ---------------- .../node_modules/qs/test/browser/mocha.css | 163 - .../node_modules/qs/test/browser/mocha.js | 4201 -------- .../node_modules/qs/test/browser/qs.css | 0 .../node_modules/qs/test/browser/qs.js | 351 - .../connect/node_modules/qs/test/parse.js | 147 - .../connect/node_modules/qs/test/stringify.js | 73 - .../express/node_modules/connect/package.json | 49 - .../express/node_modules/connect/test.js | 7 - .../node_modules/cookie-signature/.npmignore | 4 - .../node_modules/cookie-signature/History.md | 5 - .../node_modules/cookie-signature/Makefile | 7 - .../node_modules/cookie-signature/Readme.md | 42 - .../node_modules/cookie-signature/index.js | 42 - .../cookie-signature/package.json | 23 - .../express/node_modules/cookie/.npmignore | 1 - .../express/node_modules/cookie/.travis.yml | 4 - .../express/node_modules/cookie/README.md | 44 - .../express/node_modules/cookie/index.js | 61 - .../express/node_modules/cookie/package.json | 32 - .../node_modules/cookie/test/mocha.opts | 1 - .../express/node_modules/cookie/test/parse.js | 28 - .../node_modules/cookie/test/serialize.js | 59 - .../express/node_modules/debug/.npmignore | 4 - .../express/node_modules/debug/History.md | 62 - .../express/node_modules/debug/Readme.md | 115 - .../express/node_modules/debug/component.json | 9 - .../express/node_modules/debug/debug.js | 124 - .../express/node_modules/debug/example/app.js | 19 - .../node_modules/debug/example/browser.html | 24 - .../node_modules/debug/example/wildcards.js | 10 - .../node_modules/debug/example/worker.js | 22 - .../express/node_modules/debug/index.js | 5 - .../express/node_modules/debug/lib/debug.js | 134 - .../express/node_modules/debug/package.json | 36 - .../express/node_modules/fresh/.npmignore | 1 - .../express/node_modules/fresh/Makefile | 7 - .../express/node_modules/fresh/Readme.md | 32 - .../express/node_modules/fresh/index.js | 49 - .../express/node_modules/fresh/package.json | 19 - .../express/node_modules/methods/index.js | 26 - .../express/node_modules/methods/package.json | 20 - .../node_modules/mkdirp/.gitignore.orig | 2 - .../node_modules/mkdirp/.gitignore.rej | 5 - .../express/node_modules/mkdirp/.npmignore | 2 - .../express/node_modules/mkdirp/.travis.yml | 4 - .../express/node_modules/mkdirp/LICENSE | 21 - .../node_modules/mkdirp/README.markdown | 61 - .../node_modules/mkdirp/examples/pow.js | 6 - .../node_modules/mkdirp/examples/pow.js.orig | 6 - .../node_modules/mkdirp/examples/pow.js.rej | 19 - .../express/node_modules/mkdirp/index.js | 94 - .../express/node_modules/mkdirp/package.json | 32 - .../express/node_modules/mkdirp/test/chmod.js | 38 - .../node_modules/mkdirp/test/clobber.js | 37 - .../node_modules/mkdirp/test/mkdirp.js | 28 - .../express/node_modules/mkdirp/test/perm.js | 32 - .../node_modules/mkdirp/test/perm_sync.js | 39 - .../express/node_modules/mkdirp/test/race.js | 41 - .../express/node_modules/mkdirp/test/rel.js | 32 - .../node_modules/mkdirp/test/return.js | 25 - .../node_modules/mkdirp/test/return_sync.js | 24 - .../express/node_modules/mkdirp/test/root.js | 18 - .../express/node_modules/mkdirp/test/sync.js | 32 - .../express/node_modules/mkdirp/test/umask.js | 28 - .../node_modules/mkdirp/test/umask_sync.js | 32 - .../node_modules/range-parser/.npmignore | 1 - .../node_modules/range-parser/History.md | 15 - .../node_modules/range-parser/Makefile | 7 - .../node_modules/range-parser/Readme.md | 28 - .../node_modules/range-parser/index.js | 49 - .../node_modules/range-parser/package.json | 19 - .../express/node_modules/send/.npmignore | 4 - .../express/node_modules/send/History.md | 25 - .../express/node_modules/send/Makefile | 8 - .../express/node_modules/send/Readme.md | 123 - .../express/node_modules/send/index.js | 2 - .../express/node_modules/send/lib/send.js | 473 - .../express/node_modules/send/lib/utils.js | 47 - .../send/node_modules/mime/LICENSE | 19 - .../send/node_modules/mime/README.md | 63 - .../send/node_modules/mime/mime.js | 104 - .../send/node_modules/mime/package.json | 31 - .../send/node_modules/mime/test.js | 55 - .../send/node_modules/mime/types/mime.types | 1510 --- .../send/node_modules/mime/types/node.types | 65 - .../express/node_modules/send/package.json | 33 - node_modules/express/package.json | 80 - node_modules/express/test.js | 14 - node_modules/jwt-simple/.npmignore | 3 - node_modules/jwt-simple/History.md | 0 node_modules/jwt-simple/LICENSE | 22 - node_modules/jwt-simple/README.md | 22 - node_modules/jwt-simple/index.js | 1 - node_modules/jwt-simple/lib/jwt.js | 141 - node_modules/jwt-simple/package.json | 32 - node_modules/jwt-simple/test/basic.js | 45 - node_modules/less-middleware/.npmignore | 1 - .../less-middleware/lib/middleware.js | 268 - .../less-middleware/node_modules/.bin/lessc | 1 - .../node_modules/less/.npmignore | 1 - .../node_modules/less/CHANGELOG.md | 118 - .../node_modules/less/CONTRIBUTING.md | 50 - .../less-middleware/node_modules/less/LICENSE | 179 - .../node_modules/less/Makefile | 87 - .../node_modules/less/README.md | 20 - .../less/benchmark/benchmark.less | 3979 ------- .../less/benchmark/less-benchmark.js | 47 - .../node_modules/less/bin/lessc | 190 - .../node_modules/less/build/amd.js | 6 - .../node_modules/less/build/ecma-5.js | 120 - .../node_modules/less/build/header.js | 7 - .../node_modules/less/build/require-rhino.js | 7 - .../node_modules/less/build/require.js | 7 - .../node_modules/less/lib/less/browser.js | 519 - .../node_modules/less/lib/less/colors.js | 152 - .../node_modules/less/lib/less/functions.js | 377 - .../node_modules/less/lib/less/index.js | 216 - .../less/lib/less/lessc_helper.js | 62 - .../node_modules/less/lib/less/parser.js | 1522 --- .../node_modules/less/lib/less/rhino.js | 123 - .../node_modules/less/lib/less/tree.js | 45 - .../node_modules/less/lib/less/tree/alpha.js | 17 - .../less/lib/less/tree/anonymous.js | 27 - .../less/lib/less/tree/assignment.js | 19 - .../node_modules/less/lib/less/tree/call.js | 54 - .../node_modules/less/lib/less/tree/color.js | 111 - .../less/lib/less/tree/comment.js | 14 - .../less/lib/less/tree/condition.js | 42 - .../less/lib/less/tree/dimension.js | 51 - .../less/lib/less/tree/directive.js | 39 - .../less/lib/less/tree/element.js | 49 - .../less/lib/less/tree/expression.js | 23 - .../node_modules/less/lib/less/tree/import.js | 82 - .../less/lib/less/tree/javascript.js | 51 - .../less/lib/less/tree/keyword.js | 19 - .../node_modules/less/lib/less/tree/media.js | 121 - .../node_modules/less/lib/less/tree/mixin.js | 212 - .../less/lib/less/tree/operation.js | 37 - .../node_modules/less/lib/less/tree/paren.js | 16 - .../node_modules/less/lib/less/tree/quoted.js | 43 - .../node_modules/less/lib/less/tree/ratio.js | 13 - .../node_modules/less/lib/less/tree/rule.js | 49 - .../less/lib/less/tree/ruleset.js | 414 - .../less/lib/less/tree/selector.js | 52 - .../less/lib/less/tree/unicode-descriptor.js | 13 - .../node_modules/less/lib/less/tree/url.js | 27 - .../node_modules/less/lib/less/tree/value.js | 24 - .../less/lib/less/tree/variable.js | 38 - .../less/node_modules/.bin/ycssmin | 1 - .../less/node_modules/ycssmin/.npmignore | 11 - .../less/node_modules/ycssmin/.travis.yml | 8 - .../less/node_modules/ycssmin/LICENSE | 25 - .../less/node_modules/ycssmin/Makefile | 14 - .../less/node_modules/ycssmin/README.md | 97 - .../less/node_modules/ycssmin/bin/cssmin | 27 - .../less/node_modules/ycssmin/cssmin.js | 361 - .../less/node_modules/ycssmin/package.json | 61 - .../tests/files/background-position.css | 2 - .../tests/files/background-position.css.min | 1 - .../ycssmin/tests/files/border-none.css | 5 - .../ycssmin/tests/files/border-none.css.min | 1 - .../ycssmin/tests/files/box-model-hack.css | 9 - .../tests/files/box-model-hack.css.min | 1 - .../ycssmin/tests/files/bug2527974.css | 10 - .../ycssmin/tests/files/bug2527974.css.min | 1 - .../ycssmin/tests/files/bug2527991.css | 19 - .../ycssmin/tests/files/bug2527991.css.min | 1 - .../ycssmin/tests/files/bug2527998.css | 4 - .../ycssmin/tests/files/bug2527998.css.min | 1 - .../ycssmin/tests/files/bug2528034.css | 5 - .../ycssmin/tests/files/bug2528034.css.min | 1 - .../ycssmin/tests/files/charset-media.css | 9 - .../ycssmin/tests/files/charset-media.css.min | 1 - .../ycssmin/tests/files/color-simple.css | 8 - .../ycssmin/tests/files/color-simple.css.min | 1 - .../ycssmin/tests/files/color.css | 46 - .../ycssmin/tests/files/color.css.min | 1 - .../ycssmin/tests/files/comment.css | 3 - .../ycssmin/tests/files/comment.css.min | 1 - .../ycssmin/tests/files/concat-charset.css | 15 - .../tests/files/concat-charset.css.min | 1 - .../files/dataurl-base64-doublequotes.css | 23 - .../files/dataurl-base64-doublequotes.css.min | 1 - .../tests/files/dataurl-base64-eof.css | 10 - .../tests/files/dataurl-base64-eof.css.min | 1 - .../files/dataurl-base64-linebreakindata.css | 34 - .../dataurl-base64-linebreakindata.css.min | 1 - .../tests/files/dataurl-base64-noquotes.css | 26 - .../files/dataurl-base64-noquotes.css.min | 1 - .../files/dataurl-base64-singlequotes.css | 23 - .../files/dataurl-base64-singlequotes.css.min | 1 - .../tests/files/dataurl-base64-twourls.css | 27 - .../files/dataurl-base64-twourls.css.min | 1 - .../tests/files/dataurl-dbquote-font.css | 30 - .../tests/files/dataurl-dbquote-font.css.min | 5 - .../files/dataurl-nonbase64-doublequotes.css | 13 - .../dataurl-nonbase64-doublequotes.css.min | 1 - .../files/dataurl-nonbase64-noquotes.css | 11 - .../files/dataurl-nonbase64-noquotes.css.min | 1 - .../files/dataurl-nonbase64-singlequotes.css | 15 - .../dataurl-nonbase64-singlequotes.css.min | 2 - .../files/dataurl-noquote-multiline-font.css | 31 - .../dataurl-noquote-multiline-font.css.min | 3 - .../files/dataurl-realdata-doublequotes.css | 90 - .../dataurl-realdata-doublequotes.css.min | 1 - .../tests/files/dataurl-realdata-noquotes.css | 90 - .../files/dataurl-realdata-noquotes.css.min | 1 - .../files/dataurl-realdata-singlequotes.css | 90 - .../dataurl-realdata-singlequotes.css.min | 1 - .../tests/files/dataurl-realdata-yuiapp.css | 106 - .../files/dataurl-realdata-yuiapp.css.min | 1 - .../tests/files/dataurl-singlequote-font.css | 30 - .../files/dataurl-singlequote-font.css.min | 3 - .../ycssmin/tests/files/decimals.css | 3 - .../ycssmin/tests/files/decimals.css.min | 1 - .../ycssmin/tests/files/dollar-header.css | 7 - .../ycssmin/tests/files/dollar-header.css.min | 3 - .../ycssmin/tests/files/font-face.css | 6 - .../ycssmin/tests/files/font-face.css.min | 1 - .../ycssmin/tests/files/ie5mac.css | 5 - .../ycssmin/tests/files/ie5mac.css.min | 1 - .../ycssmin/tests/files/media-empty-class.css | 16 - .../tests/files/media-empty-class.css.min | 1 - .../ycssmin/tests/files/media-multi.css | 3 - .../ycssmin/tests/files/media-multi.css.min | 1 - .../ycssmin/tests/files/media-test.css | 3 - .../ycssmin/tests/files/media-test.css.min | 1 - .../ycssmin/tests/files/opacity-filter.css | 14 - .../tests/files/opacity-filter.css.min | 1 - .../ycssmin/tests/files/preserve-case.css | 15 - .../ycssmin/tests/files/preserve-case.css.min | 1 - .../ycssmin/tests/files/preserve-new-line.css | 6 - .../tests/files/preserve-new-line.css.min | 3 - .../ycssmin/tests/files/preserve-strings.css | 7 - .../tests/files/preserve-strings.css.min | 1 - .../ycssmin/tests/files/pseudo-first.css | 16 - .../ycssmin/tests/files/pseudo-first.css.min | 1 - .../ycssmin/tests/files/pseudo.css | 5 - .../ycssmin/tests/files/pseudo.css.min | 1 - .../ycssmin/tests/files/special-comments.css | 13 - .../tests/files/special-comments.css.min | 9 - .../tests/files/special/linebreakpos.css | 118 - .../tests/files/special/linebreakpos.css.min | 6 - .../tests/files/star-underscore-hacks.css | 5 - .../tests/files/star-underscore-hacks.css.min | 1 - .../ycssmin/tests/files/string-in-comment.css | 8 - .../tests/files/string-in-comment.css.min | 1 - .../ycssmin/tests/files/webkit-transform.css | 2 - .../tests/files/webkit-transform.css.min | 1 - .../ycssmin/tests/files/zeros.css | 6 - .../ycssmin/tests/files/zeros.css.min | 1 - .../less/node_modules/ycssmin/tests/tests.js | 49 - .../node_modules/less/package.json | 49 - .../less/test/browser-test-prepare.js | 29 - .../node_modules/less/test/browser/common.js | 74 - .../test/browser/css/relative-urls/urls.css | 36 - .../browser/css/rootpath-relative/urls.css | 36 - .../less/test/browser/css/rootpath/urls.css | 36 - .../less/test/browser/css/urls.css | 36 - .../less/test/browser/jasmine-html.js | 681 -- .../less/test/browser/jasmine.css | 82 - .../node_modules/less/test/browser/jasmine.js | 2600 ----- .../less/test/browser/less/imports/urls.less | 4 - .../less/test/browser/less/imports/urls2.less | 4 - .../test/browser/less/relative-urls/urls.less | 33 - .../browser/less/rootpath-relative/urls.less | 33 - .../less/test/browser/less/rootpath/urls.less | 33 - .../less/test/browser/less/urls.less | 33 - .../less/test/browser/phantom-runner.js | 139 - .../less/test/browser/runner-browser.js | 3 - .../less/test/browser/runner-main.js | 15 - .../less/test/browser/runner-relative-urls.js | 4 - .../test/browser/runner-rootpath-relative.js | 5 - .../less/test/browser/runner-rootpath.js | 4 - .../less/test/browser/template.htm | 10 - .../node_modules/less/test/css/charsets.css | 1 - .../node_modules/less/test/css/colors.css | 80 - .../node_modules/less/test/css/comments.css | 63 - .../node_modules/less/test/css/css-3.css | 113 - .../less/test/css/css-escapes.css | 24 - .../node_modules/less/test/css/css.css | 89 - .../less/test/css/debug/linenumbers-all.css | 43 - .../test/css/debug/linenumbers-comments.css | 35 - .../test/css/debug/linenumbers-mediaquery.css | 35 - .../node_modules/less/test/css/functions.css | 100 - .../node_modules/less/test/css/ie-filters.css | 9 - .../less/test/css/import-once.css | 3 - .../node_modules/less/test/css/import.css | 21 - .../node_modules/less/test/css/javascript.css | 23 - .../node_modules/less/test/css/lazy-eval.css | 3 - .../node_modules/less/test/css/media.css | 195 - .../less/test/css/mixins-args.css | 95 - .../less/test/css/mixins-closure.css | 9 - .../less/test/css/mixins-guards.css | 71 - .../less/test/css/mixins-important.css | 38 - .../less/test/css/mixins-named-args.css | 27 - .../less/test/css/mixins-nested.css | 14 - .../less/test/css/mixins-pattern.css | 47 - .../node_modules/less/test/css/mixins.css | 121 - .../node_modules/less/test/css/operations.css | 49 - .../node_modules/less/test/css/parens.css | 20 - .../node_modules/less/test/css/rulesets.css | 33 - .../node_modules/less/test/css/scope.css | 35 - .../node_modules/less/test/css/selectors.css | 133 - .../less/test/css/static-urls/urls.css | 42 - .../node_modules/less/test/css/strings.css | 40 - .../node_modules/less/test/css/urls.css | 42 - .../node_modules/less/test/css/variables.css | 26 - .../node_modules/less/test/css/whitespace.css | 42 - .../node_modules/less/test/less-test.js | 182 - .../node_modules/less/test/less/charsets.less | 3 - .../node_modules/less/test/less/colors.less | 92 - .../node_modules/less/test/less/comments.less | 77 - .../node_modules/less/test/less/css-3.less | 113 - .../less/test/less/css-escapes.less | 33 - .../node_modules/less/test/less/css.less | 102 - .../less/test/less/debug/import/test.less | 25 - .../less/test/less/debug/linenumbers.less | 23 - .../errors/bad-variable-declaration1.less | 1 - .../less/errors/bad-variable-declaration1.txt | 2 - .../test/less/errors/comment-in-selector.less | 1 - .../test/less/errors/comment-in-selector.txt | 2 - .../less/test/less/errors/import-missing.less | 1 - .../less/test/less/errors/import-missing.txt | 3 - .../less/test/less/errors/import-no-semi.less | 1 - .../less/test/less/errors/import-no-semi.txt | 2 - .../test/less/errors/import-subfolder1.less | 1 - .../test/less/errors/import-subfolder1.txt | 3 - .../test/less/errors/import-subfolder2.less | 1 - .../test/less/errors/import-subfolder2.txt | 2 - .../errors/imports/import-subfolder1.less | 1 - .../errors/imports/import-subfolder2.less | 1 - .../test/less/errors/imports/import-test.less | 4 - .../imports/subfolder/mixin-not-defined.less | 1 - .../subfolder/parse-error-curly-bracket.less | 1 - .../test/less/errors/javascript-error.less | 3 - .../test/less/errors/javascript-error.txt | 4 - .../errors/mixed-mixin-definition-args-1.less | 6 - .../errors/mixed-mixin-definition-args-1.txt | 4 - .../errors/mixed-mixin-definition-args-2.less | 6 - .../errors/mixed-mixin-definition-args-2.txt | 4 - .../test/less/errors/mixin-not-defined.less | 11 - .../test/less/errors/mixin-not-defined.txt | 3 - .../test/less/errors/mixin-not-matched.less | 6 - .../test/less/errors/mixin-not-matched.txt | 3 - .../test/less/errors/mixin-not-matched2.less | 6 - .../test/less/errors/mixin-not-matched2.txt | 3 - .../errors/parse-error-curly-bracket.less | 1 - .../less/errors/parse-error-curly-bracket.txt | 2 - .../errors/parse-error-missing-bracket.less | 2 - .../errors/parse-error-missing-bracket.txt | 2 - .../less/errors/parse-error-with-import.less | 13 - .../less/errors/parse-error-with-import.txt | 4 - .../test/less/errors/property-ie5-hack.less | 3 - .../test/less/errors/property-ie5-hack.txt | 4 - .../test/less/errors/recursive-variable.less | 1 - .../test/less/errors/recursive-variable.txt | 2 - .../less/test/less/functions.less | 111 - .../less/test/less/ie-filters.less | 15 - .../less/test/less/import-once.less | 4 - .../node_modules/less/test/less/import.less | 12 - .../import/deeper/import-once-test-a.less | 1 - .../import-and-relative-paths-test.less | 6 - .../test/less/import/import-charset-test.less | 1 - .../test/less/import/import-once-test-c.less | 6 - .../less/test/less/import/import-test-a.less | 3 - .../less/test/less/import/import-test-b.less | 8 - .../less/test/less/import/import-test-c.less | 6 - .../less/test/less/import/import-test-d.css | 1 - .../less/test/less/import/import-test-e.less | 2 - .../less/test/less/import/imports/font.less | 8 - .../less/test/less/import/imports/logo.less | 5 - .../less/test/less/import/urls.less | 1 - .../less/test/less/javascript.less | 29 - .../less/test/less/lazy-eval.less | 6 - .../node_modules/less/test/less/media.less | 199 - .../less/test/less/mixins-args.less | 167 - .../less/test/less/mixins-closure.less | 26 - .../less/test/less/mixins-guards.less | 124 - .../less/test/less/mixins-important.less | 22 - .../less/test/less/mixins-named-args.less | 36 - .../less/test/less/mixins-nested.less | 22 - .../less/test/less/mixins-pattern.less | 99 - .../node_modules/less/test/less/mixins.less | 114 - .../less/test/less/operations.less | 62 - .../node_modules/less/test/less/parens.less | 26 - .../node_modules/less/test/less/rulesets.less | 30 - .../node_modules/less/test/less/scope.less | 79 - .../less/test/less/selectors.less | 136 - .../less/test/less/static-urls/urls.less | 33 - .../node_modules/less/test/less/strings.less | 51 - .../node_modules/less/test/less/urls.less | 33 - .../less/test/less/variables.less | 53 - .../less/test/less/whitespace.less | 44 - .../node_modules/mkdirp/.npmignore | 2 - .../node_modules/mkdirp/.travis.yml | 5 - .../node_modules/mkdirp/LICENSE | 21 - .../node_modules/mkdirp/README.markdown | 63 - .../node_modules/mkdirp/examples/pow.js | 6 - .../node_modules/mkdirp/index.js | 82 - .../node_modules/mkdirp/package.json | 29 - .../node_modules/mkdirp/test/chmod.js | 38 - .../node_modules/mkdirp/test/clobber.js | 37 - .../node_modules/mkdirp/test/mkdirp.js | 28 - .../node_modules/mkdirp/test/perm.js | 32 - .../node_modules/mkdirp/test/perm_sync.js | 39 - .../node_modules/mkdirp/test/race.js | 41 - .../node_modules/mkdirp/test/rel.js | 32 - .../node_modules/mkdirp/test/return.js | 25 - .../node_modules/mkdirp/test/return_sync.js | 24 - .../node_modules/mkdirp/test/root.js | 18 - .../node_modules/mkdirp/test/sync.js | 32 - .../node_modules/mkdirp/test/umask.js | 28 - .../node_modules/mkdirp/test/umask_sync.js | 32 - node_modules/less-middleware/package.json | 27 - node_modules/less-middleware/readme.md | 117 - .../less-middleware/test/parse-test.js | 0 node_modules/mongoose/.npmignore | 13 - node_modules/mongoose/.travis.yml | 6 - node_modules/mongoose/CONTRIBUTING.md | 42 - node_modules/mongoose/History.md | 1308 --- node_modules/mongoose/README.md | 269 - node_modules/mongoose/examples/schema.js | 102 - node_modules/mongoose/index.js | 7 - node_modules/mongoose/lib/collection.js | 177 - node_modules/mongoose/lib/connection.js | 680 -- node_modules/mongoose/lib/connectionstate.js | 24 - node_modules/mongoose/lib/document.js | 1519 --- .../lib/drivers/node-mongodb-native/binary.js | 8 - .../drivers/node-mongodb-native/collection.js | 212 - .../drivers/node-mongodb-native/connection.js | 289 - .../drivers/node-mongodb-native/objectid.js | 29 - node_modules/mongoose/lib/error.js | 38 - node_modules/mongoose/lib/errors/cast.js | 35 - node_modules/mongoose/lib/errors/document.js | 32 - .../mongoose/lib/errors/missingSchema.js | 32 - .../mongoose/lib/errors/overwriteModel.js | 30 - .../mongoose/lib/errors/validation.js | 43 - node_modules/mongoose/lib/errors/validator.js | 45 - node_modules/mongoose/lib/errors/version.js | 31 - node_modules/mongoose/lib/index.js | 547 - node_modules/mongoose/lib/model.js | 1822 ---- node_modules/mongoose/lib/namedscope.js | 70 - node_modules/mongoose/lib/promise.js | 158 - node_modules/mongoose/lib/query.js | 2395 ----- node_modules/mongoose/lib/querystream.js | 313 - node_modules/mongoose/lib/schema.js | 871 -- node_modules/mongoose/lib/schema/array.js | 266 - node_modules/mongoose/lib/schema/boolean.js | 91 - node_modules/mongoose/lib/schema/buffer.js | 119 - node_modules/mongoose/lib/schema/date.js | 126 - .../mongoose/lib/schema/documentarray.js | 189 - node_modules/mongoose/lib/schema/index.js | 28 - node_modules/mongoose/lib/schema/mixed.js | 75 - node_modules/mongoose/lib/schema/number.js | 182 - node_modules/mongoose/lib/schema/objectid.js | 151 - node_modules/mongoose/lib/schema/string.js | 255 - node_modules/mongoose/lib/schemadefault.js | 34 - node_modules/mongoose/lib/schematype.js | 657 -- node_modules/mongoose/lib/statemachine.js | 179 - node_modules/mongoose/lib/types/array.js | 598 -- node_modules/mongoose/lib/types/buffer.js | 210 - .../mongoose/lib/types/documentarray.js | 171 - node_modules/mongoose/lib/types/embedded.js | 199 - node_modules/mongoose/lib/types/index.js | 13 - node_modules/mongoose/lib/types/objectid.js | 43 - node_modules/mongoose/lib/utils.js | 481 - node_modules/mongoose/lib/virtualtype.js | 103 - .../mongoose/node_modules/hooks/.npmignore | 2 - .../mongoose/node_modules/hooks/Makefile | 9 - .../mongoose/node_modules/hooks/README.md | 306 - .../mongoose/node_modules/hooks/hooks.alt.js | 134 - .../mongoose/node_modules/hooks/hooks.js | 161 - .../mongoose/node_modules/hooks/package.json | 45 - .../mongoose/node_modules/hooks/test.js | 691 -- .../mongoose/node_modules/mongodb/.travis.yml | 5 - .../node_modules/mongodb/CONTRIBUTING.md | 23 - .../mongoose/node_modules/mongodb/Makefile | 64 - .../mongoose/node_modules/mongodb/Readme.md | 442 - .../mongoose/node_modules/mongodb/index.js | 1 - .../mongoose/node_modules/mongodb/install.js | 40 - .../node_modules/mongodb/lib/mongodb/admin.js | 339 - .../mongodb/lib/mongodb/collection.js | 1762 ---- .../lib/mongodb/commands/base_command.js | 29 - .../lib/mongodb/commands/db_command.js | 241 - .../lib/mongodb/commands/delete_command.js | 114 - .../lib/mongodb/commands/get_more_command.js | 83 - .../lib/mongodb/commands/insert_command.js | 147 - .../mongodb/commands/kill_cursor_command.js | 98 - .../lib/mongodb/commands/query_command.js | 261 - .../lib/mongodb/commands/update_command.js | 174 - .../mongodb/lib/mongodb/connection/base.js | 169 - .../lib/mongodb/connection/connection.js | 494 - .../lib/mongodb/connection/connection_pool.js | 278 - .../mongodb/connection/connection_utils.js | 23 - .../mongodb/lib/mongodb/connection/mongos.js | 357 - .../lib/mongodb/connection/read_preference.js | 66 - .../lib/mongodb/connection/repl_set.js | 1451 --- .../mongodb/lib/mongodb/connection/server.js | 900 -- .../connection/strategies/ping_strategy.js | 290 - .../strategies/statistics_strategy.js | 80 - .../lib/mongodb/connection/url_parser.js | 223 - .../mongodb/lib/mongodb/cursor.js | 1009 -- .../mongodb/lib/mongodb/cursorstream.js | 151 - .../node_modules/mongodb/lib/mongodb/db.js | 2133 ---- .../mongodb/lib/mongodb/gridfs/chunk.js | 213 - .../mongodb/lib/mongodb/gridfs/grid.js | 103 - .../mongodb/lib/mongodb/gridfs/gridstore.js | 1466 --- .../mongodb/lib/mongodb/gridfs/readstream.js | 188 - .../node_modules/mongodb/lib/mongodb/index.js | 69 - .../mongodb/lib/mongodb/mongo_client.js | 116 - .../lib/mongodb/responses/mongo_reply.js | 140 - .../node_modules/mongodb/lib/mongodb/utils.js | 121 - .../mongodb/node_modules/bson/.travis.yml | 5 - .../mongodb/node_modules/bson/Makefile | 19 - .../mongodb/node_modules/bson/Readme.md | 1 - .../bson/benchmarks/benchmarks.js | 130 - .../mongodb/node_modules/bson/binding.gyp | 17 - .../node_modules/bson/browser_build/bson.js | 4814 --------- .../bson/browser_build/package.json | 8 - .../mongodb/node_modules/bson/build/Makefile | 359 - .../build/Release/.deps/Release/bson.node.d | 1 - .../Release/obj.target/bson/ext/bson.o.d | 34 - .../node_modules/bson/build/Release/bson.node | Bin 49508 -> 0 bytes .../bson/build/Release/linker.lock | 0 .../build/Release/obj.target/bson/ext/bson.o | Bin 257612 -> 0 bytes .../node_modules/bson/build/binding.Makefile | 6 - .../node_modules/bson/build/bson.target.mk | 131 - .../node_modules/bson/build/config.gypi | 104 - .../node_modules/bson/build/gyp-mac-tool | 210 - .../node_modules/bson/build_browser.js | 7 - .../mongodb/node_modules/bson/builderror.log | 0 .../mongodb/node_modules/bson/ext/Makefile | 28 - .../mongodb/node_modules/bson/ext/bson.cc | 1006 -- .../mongodb/node_modules/bson/ext/bson.h | 273 - .../mongodb/node_modules/bson/ext/index.js | 30 - .../bson/ext/win32/ia32/bson.node | Bin 113152 -> 0 bytes .../node_modules/bson/ext/win32/x64/bson.node | Bin 118272 -> 0 bytes .../mongodb/node_modules/bson/ext/wscript | 39 - .../node_modules/bson/lib/bson/binary.js | 339 - .../bson/lib/bson/binary_parser.js | 385 - .../node_modules/bson/lib/bson/bson.js | 1519 --- .../node_modules/bson/lib/bson/code.js | 25 - .../node_modules/bson/lib/bson/db_ref.js | 31 - .../node_modules/bson/lib/bson/double.js | 33 - .../bson/lib/bson/float_parser.js | 121 - .../node_modules/bson/lib/bson/index.js | 74 - .../node_modules/bson/lib/bson/long.js | 854 -- .../node_modules/bson/lib/bson/max_key.js | 13 - .../node_modules/bson/lib/bson/min_key.js | 13 - .../node_modules/bson/lib/bson/objectid.js | 253 - .../node_modules/bson/lib/bson/symbol.js | 48 - .../node_modules/bson/lib/bson/timestamp.js | 853 -- .../mongodb/node_modules/bson/package.json | 51 - .../bson/test/browser/browser_example.htm | 19 - .../bson/test/browser/bson_test.js | 260 - .../bson/test/browser/nodeunit.js | 2034 ---- .../node_modules/bson/test/browser/suite2.js | 13 - .../node_modules/bson/test/browser/suite3.js | 7 - .../node_modules/bson/test/browser/test.html | 30 - .../bson/test/node/bson_array_test.js | 240 - .../test/node/bson_parser_comparision_test.js | 493 - .../node_modules/bson/test/node/bson_test.js | 1694 --- .../bson/test/node/bson_typed_array_test.js | 392 - .../bson/test/node/data/test_gs_weird_bug.png | Bin 52184 -> 0 bytes .../bson/test/node/test_full_bson.js | 315 - .../bson/test/node/to_bson_test.js | 109 - .../bson/test/node/tools/utils.js | 80 - .../mongodb/node_modules/bson/tools/gleak.js | 21 - .../bson/tools/jasmine-1.1.0/MIT.LICENSE | 20 - .../bson/tools/jasmine-1.1.0/jasmine-html.js | 190 - .../bson/tools/jasmine-1.1.0/jasmine.css | 166 - .../bson/tools/jasmine-1.1.0/jasmine.js | 2476 ----- .../tools/jasmine-1.1.0/jasmine_favicon.png | Bin 905 -> 0 bytes .../node_modules/mongodb/package.json | 218 - .../mongoose/node_modules/mongodb/upload.py | 2347 ----- .../mongoose/node_modules/ms/.npmignore | 1 - .../mongoose/node_modules/ms/Makefile | 8 - .../mongoose/node_modules/ms/README.md | 65 - node_modules/mongoose/node_modules/ms/ms.js | 35 - .../mongoose/node_modules/ms/package.json | 14 - .../mongoose/node_modules/ms/test/index.html | 19 - .../node_modules/ms/test/support/jquery.js | 9266 ----------------- .../mongoose/node_modules/ms/test/test.js | 61 - .../mongoose/node_modules/muri/.npmignore | 2 - .../mongoose/node_modules/muri/.travis.yml | 4 - .../mongoose/node_modules/muri/History.md | 47 - .../mongoose/node_modules/muri/LICENSE | 22 - .../mongoose/node_modules/muri/Makefile | 5 - .../mongoose/node_modules/muri/README.md | 46 - .../mongoose/node_modules/muri/index.js | 1 - .../mongoose/node_modules/muri/lib/index.js | 235 - .../mongoose/node_modules/muri/package.json | 29 - .../mongoose/node_modules/muri/test/index.js | 312 - .../mongoose/node_modules/sliced/.npmignore | 2 - .../mongoose/node_modules/sliced/.travis.yml | 4 - .../mongoose/node_modules/sliced/History.md | 16 - .../mongoose/node_modules/sliced/LICENSE | 22 - .../mongoose/node_modules/sliced/Makefile | 5 - .../mongoose/node_modules/sliced/README.md | 62 - .../mongoose/node_modules/sliced/bench.js | 95 - .../mongoose/node_modules/sliced/index.js | 1 - .../node_modules/sliced/lib/sliced.js | 33 - .../mongoose/node_modules/sliced/package.json | 30 - .../node_modules/sliced/test/index.js | 80 - node_modules/mongoose/package.json | 58 - node_modules/mongoose/static.js | 17 - node_modules/mongoose/website.js | 60 - node_modules/nodetime/.npmignore | 5 - node_modules/nodetime/LICENSE | 19 - node_modules/nodetime/README.md | 11 - .../darwin/x64/v0.10.0/nodetime_native.node | Bin 18772 -> 0 bytes .../darwin/x64/v0.10.1/nodetime_native.node | Bin 18772 -> 0 bytes .../darwin/x64/v0.8.0/nodetime_native.node | Bin 18772 -> 0 bytes .../darwin/x64/v0.8.1/nodetime_native.node | Bin 18772 -> 0 bytes .../darwin/x64/v0.8.10/nodetime_native.node | Bin 18772 -> 0 bytes .../darwin/x64/v0.8.11/nodetime_native.node | Bin 18772 -> 0 bytes .../darwin/x64/v0.8.12/nodetime_native.node | Bin 18772 -> 0 bytes .../darwin/x64/v0.8.13/nodetime_native.node | Bin 18772 -> 0 bytes .../darwin/x64/v0.8.14/nodetime_native.node | Bin 18772 -> 0 bytes .../darwin/x64/v0.8.15/nodetime_native.node | Bin 18772 -> 0 bytes .../darwin/x64/v0.8.16/nodetime_native.node | Bin 18772 -> 0 bytes .../darwin/x64/v0.8.17/nodetime_native.node | Bin 18772 -> 0 bytes .../darwin/x64/v0.8.18/nodetime_native.node | Bin 18772 -> 0 bytes .../darwin/x64/v0.8.19/nodetime_native.node | Bin 18772 -> 0 bytes .../darwin/x64/v0.8.2/nodetime_native.node | Bin 18772 -> 0 bytes .../darwin/x64/v0.8.20/nodetime_native.node | Bin 18772 -> 0 bytes .../darwin/x64/v0.8.21/nodetime_native.node | Bin 18772 -> 0 bytes .../darwin/x64/v0.8.22/nodetime_native.node | Bin 18772 -> 0 bytes .../darwin/x64/v0.8.3/nodetime_native.node | Bin 18772 -> 0 bytes .../darwin/x64/v0.8.4/nodetime_native.node | Bin 18772 -> 0 bytes .../darwin/x64/v0.8.5/nodetime_native.node | Bin 18772 -> 0 bytes .../darwin/x64/v0.8.6/nodetime_native.node | Bin 18772 -> 0 bytes .../darwin/x64/v0.8.7/nodetime_native.node | Bin 18772 -> 0 bytes .../darwin/x64/v0.8.8/nodetime_native.node | Bin 18772 -> 0 bytes .../darwin/x64/v0.8.9/nodetime_native.node | Bin 18772 -> 0 bytes .../linux/ia32/v0.10.0/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.10.1/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.6.0/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.6.1/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.6.10/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.6.11/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.6.12/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.6.13/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.6.14/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.6.15/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.6.16/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.6.17/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.6.18/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.6.19/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.6.2/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.6.20/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.6.21/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.6.3/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.6.4/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.6.5/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.6.6/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.6.7/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.6.8/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.6.9/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.8.0/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.8.1/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.8.10/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.8.11/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.8.12/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.8.13/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.8.14/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.8.15/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.8.16/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.8.17/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.8.18/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.8.19/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.8.2/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.8.20/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.8.21/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.8.22/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.8.3/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.8.4/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.8.5/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.8.6/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.8.7/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.8.8/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/ia32/v0.8.9/nodetime_native.node | Bin 18457 -> 0 bytes .../linux/x64/v0.10.0/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.10.1/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.6.0/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.6.1/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.6.10/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.6.11/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.6.12/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.6.13/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.6.14/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.6.15/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.6.16/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.6.17/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.6.18/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.6.19/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.6.2/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.6.20/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.6.21/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.6.3/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.6.4/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.6.5/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.6.6/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.6.7/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.6.8/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.6.9/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.8.0/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.8.1/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.8.10/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.8.11/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.8.12/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.8.13/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.8.14/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.8.15/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.8.16/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.8.17/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.8.18/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.8.19/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.8.2/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.8.20/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.8.21/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.8.22/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.8.3/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.8.4/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.8.5/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.8.6/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.8.7/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.8.8/nodetime_native.node | Bin 20736 -> 0 bytes .../linux/x64/v0.8.9/nodetime_native.node | Bin 20736 -> 0 bytes .../win32/ia32/v0.10.0/nodetime_native.node | Bin 71680 -> 0 bytes .../win32/ia32/v0.10.1/nodetime_native.node | Bin 71680 -> 0 bytes .../win32/ia32/v0.8.0/nodetime_native.node | Bin 70656 -> 0 bytes .../win32/ia32/v0.8.1/nodetime_native.node | Bin 70656 -> 0 bytes .../win32/ia32/v0.8.10/nodetime_native.node | Bin 70656 -> 0 bytes .../win32/ia32/v0.8.11/nodetime_native.node | Bin 70656 -> 0 bytes .../win32/ia32/v0.8.12/nodetime_native.node | Bin 70656 -> 0 bytes .../win32/ia32/v0.8.13/nodetime_native.node | Bin 70656 -> 0 bytes .../win32/ia32/v0.8.14/nodetime_native.node | Bin 70656 -> 0 bytes .../win32/ia32/v0.8.15/nodetime_native.node | Bin 70656 -> 0 bytes .../win32/ia32/v0.8.16/nodetime_native.node | Bin 70656 -> 0 bytes .../win32/ia32/v0.8.17/nodetime_native.node | Bin 70656 -> 0 bytes .../win32/ia32/v0.8.18/nodetime_native.node | Bin 70656 -> 0 bytes .../win32/ia32/v0.8.19/nodetime_native.node | Bin 70656 -> 0 bytes .../win32/ia32/v0.8.2/nodetime_native.node | Bin 70656 -> 0 bytes .../win32/ia32/v0.8.20/nodetime_native.node | Bin 70656 -> 0 bytes .../win32/ia32/v0.8.21/nodetime_native.node | Bin 70656 -> 0 bytes .../win32/ia32/v0.8.22/nodetime_native.node | Bin 70656 -> 0 bytes .../win32/ia32/v0.8.3/nodetime_native.node | Bin 70656 -> 0 bytes .../win32/ia32/v0.8.4/nodetime_native.node | Bin 70656 -> 0 bytes .../win32/ia32/v0.8.5/nodetime_native.node | Bin 70656 -> 0 bytes .../win32/ia32/v0.8.6/nodetime_native.node | Bin 70656 -> 0 bytes .../win32/ia32/v0.8.7/nodetime_native.node | Bin 70656 -> 0 bytes .../win32/ia32/v0.8.8/nodetime_native.node | Bin 70656 -> 0 bytes .../win32/ia32/v0.8.9/nodetime_native.node | Bin 70656 -> 0 bytes .../win32/x64/v0.10.0/nodetime_native.node | Bin 78336 -> 0 bytes .../win32/x64/v0.10.1/nodetime_native.node | Bin 78336 -> 0 bytes .../win32/x64/v0.8.0/nodetime_native.node | Bin 77824 -> 0 bytes .../win32/x64/v0.8.1/nodetime_native.node | Bin 77824 -> 0 bytes .../win32/x64/v0.8.10/nodetime_native.node | Bin 78336 -> 0 bytes .../win32/x64/v0.8.11/nodetime_native.node | Bin 78336 -> 0 bytes .../win32/x64/v0.8.12/nodetime_native.node | Bin 78336 -> 0 bytes .../win32/x64/v0.8.13/nodetime_native.node | Bin 78336 -> 0 bytes .../win32/x64/v0.8.14/nodetime_native.node | Bin 78336 -> 0 bytes .../win32/x64/v0.8.15/nodetime_native.node | Bin 78336 -> 0 bytes .../win32/x64/v0.8.16/nodetime_native.node | Bin 78336 -> 0 bytes .../win32/x64/v0.8.17/nodetime_native.node | Bin 78336 -> 0 bytes .../win32/x64/v0.8.18/nodetime_native.node | Bin 78336 -> 0 bytes .../win32/x64/v0.8.19/nodetime_native.node | Bin 78336 -> 0 bytes .../win32/x64/v0.8.2/nodetime_native.node | Bin 77824 -> 0 bytes .../win32/x64/v0.8.20/nodetime_native.node | Bin 78336 -> 0 bytes .../win32/x64/v0.8.21/nodetime_native.node | Bin 78336 -> 0 bytes .../win32/x64/v0.8.22/nodetime_native.node | Bin 78336 -> 0 bytes .../win32/x64/v0.8.3/nodetime_native.node | Bin 77824 -> 0 bytes .../win32/x64/v0.8.4/nodetime_native.node | Bin 77824 -> 0 bytes .../win32/x64/v0.8.5/nodetime_native.node | Bin 77824 -> 0 bytes .../win32/x64/v0.8.6/nodetime_native.node | Bin 77824 -> 0 bytes .../win32/x64/v0.8.7/nodetime_native.node | Bin 77824 -> 0 bytes .../win32/x64/v0.8.8/nodetime_native.node | Bin 78336 -> 0 bytes .../win32/x64/v0.8.9/nodetime_native.node | Bin 78336 -> 0 bytes node_modules/nodetime/index.js | 1 - .../nodetime/lib/addons/dtrace-provider.js | 63 - .../nodetime/lib/addons/stdout-writer.js | 45 - node_modules/nodetime/lib/core/agent.js | 385 - node_modules/nodetime/lib/core/logger.js | 34 - node_modules/nodetime/lib/core/proxy.js | 201 - node_modules/nodetime/lib/core/system.js | 49 - node_modules/nodetime/lib/core/thread.js | 41 - node_modules/nodetime/lib/core/time.js | 90 - node_modules/nodetime/lib/core/timers.js | 99 - node_modules/nodetime/lib/core/utils.js | 20 - node_modules/nodetime/lib/metrics/metric.js | 204 - .../nodetime/lib/metrics/metrics-manager.js | 150 - .../nodetime/lib/monitors/mongodb-monitor.js | 384 - .../nodetime/lib/monitors/redis-monitor.js | 161 - .../lib/probes/cassandra-client-probe.js | 114 - .../nodetime/lib/probes/cassandra-probe.js | 71 - node_modules/nodetime/lib/probes/fs-probe.js | 114 - .../nodetime/lib/probes/global-probe.js | 24 - .../nodetime/lib/probes/http-probe.js | 162 - .../nodetime/lib/probes/memcache-probe.js | 126 - .../nodetime/lib/probes/memcached-probe.js | 88 - .../nodetime/lib/probes/mongodb-probe.js | 129 - .../nodetime/lib/probes/mysql-probe.js | 64 - node_modules/nodetime/lib/probes/net-probe.js | 58 - node_modules/nodetime/lib/probes/pg-probe.js | 132 - .../nodetime/lib/probes/process-probe.js | 70 - .../nodetime/lib/probes/redis-probe.js | 215 - .../nodetime/lib/probes/socket.io-probe.js | 79 - .../nodetime/lib/process/disk-stats.js | 74 - .../nodetime/lib/process/process-info.js | 139 - .../nodetime/lib/process/process-state.js | 20 - .../nodetime/lib/process/process-stats.js | 71 - .../lib/profiler/call-metrics-groups.js | 69 - .../nodetime/lib/profiler/call-metrics.js | 58 - .../lib/profiler/custom-transaction.js | 27 - .../profiler/filter/filter-key-extractor.js | 92 - .../lib/profiler/filter/predicate-filter.js | 111 - .../lib/profiler/named-transactions.js | 61 - .../nodetime/lib/profiler/profiler.js | 370 - node_modules/nodetime/lib/profiler/sample.js | 43 - .../nodetime/lib/profiler/skip-counter.js | 45 - .../nodetime/lib/profiler/time-promise.js | 52 - node_modules/nodetime/lib/saas/data-sender.js | 126 - .../nodetime/lib/saas/gzip-request.js | 47 - node_modules/nodetime/lib/saas/saas-client.js | 189 - node_modules/nodetime/lib/v8/cpu-profiler.js | 162 - node_modules/nodetime/lib/v8/gc-stats.js | 37 - node_modules/nodetime/lib/v8/heap-profiler.js | 457 - node_modules/nodetime/lib/v8/heap-stats.js | 46 - .../node_modules/nodetime-native/.npmignore | 7 - .../node_modules/nodetime-native/LICENSE | 19 - .../node_modules/nodetime-native/README.md | 3 - .../node_modules/nodetime-native/binding.gyp | 27 - .../nodetime-native/build/Makefile | 359 - .../.deps/Release/nodetime_native.node.d | 1 - .../obj.target/nodetime_native/src/gc.o.d | 30 - .../nodetime_native/src/nodetime_native.o.d | 33 - .../nodetime_native/src/profiler.o.d | 11 - .../nodetime_native/src/system_posix.o.d | 29 - .../nodetime-native/build/Release/linker.lock | 0 .../build/Release/nodetime_native.node | Bin 18884 -> 0 bytes .../obj.target/nodetime_native/src/gc.o | Bin 70992 -> 0 bytes .../nodetime_native/src/nodetime_native.o | Bin 40740 -> 0 bytes .../obj.target/nodetime_native/src/profiler.o | Bin 56864 -> 0 bytes .../nodetime_native/src/system_posix.o | Bin 44296 -> 0 bytes .../nodetime-native/build/binding.Makefile | 6 - .../nodetime-native/build/config.gypi | 104 - .../nodetime-native/build/gyp-mac-tool | 210 - .../build/nodetime_native.target.mk | 136 - .../node_modules/nodetime-native/index.js | 1 - .../node_modules/bindings/README.md | 97 - .../node_modules/bindings/bindings.js | 155 - .../node_modules/bindings/package.json | 27 - .../nodetime-native/nodetime_native.cc | 281 - .../node_modules/nodetime-native/package.json | 32 - .../node_modules/nodetime-native/src/gc.cc | 102 - .../node_modules/nodetime-native/src/gc.h | 13 - .../nodetime-native/src/nodetime_native.cc | 24 - .../nodetime-native/src/profiler.cc | 124 - .../nodetime-native/src/profiler.h | 13 - .../node_modules/nodetime-native/src/system.h | 12 - .../nodetime-native/src/system_posix.cc | 37 - .../nodetime-native/src/system_win.cc | 43 - .../node_modules/nodetime-native/wscript | 16 - .../nodetime/node_modules/request/LICENSE | 55 - .../nodetime/node_modules/request/README.md | 310 - .../nodetime/node_modules/request/aws.js | 191 - .../nodetime/node_modules/request/forever.js | 103 - .../nodetime/node_modules/request/main.js | 1123 -- .../request/node_modules/form-data/.npmignore | 5 - .../request/node_modules/form-data/Makefile | 7 - .../request/node_modules/form-data/Readme.md | 86 - .../node_modules/form-data/lib/form_data.js | 237 - .../form-data/node-form-data.sublime-project | 8 - .../node-form-data.sublime-workspace | 508 - .../form-data/node_modules/async/.gitmodules | 9 - .../form-data/node_modules/async/LICENSE | 19 - .../form-data/node_modules/async/Makefile | 21 - .../form-data/node_modules/async/README.md | 970 -- .../node_modules/async/async.min.js.gzip | Bin 1859 -> 0 bytes .../node_modules/async/deps/nodeunit.css | 70 - .../node_modules/async/deps/nodeunit.js | 1966 ---- .../node_modules/async/dist/async.min.js | 1 - .../form-data/node_modules/async/index.js | 3 - .../form-data/node_modules/async/lib/async.js | 632 -- .../form-data/node_modules/async/nodelint.cfg | 4 - .../form-data/node_modules/async/package.json | 41 - .../form-data/node_modules/async/test/.swp | Bin 12288 -> 0 bytes .../node_modules/async/test/test-async.js | 1367 --- .../node_modules/async/test/test.html | 24 - .../node_modules/combined-stream/.npmignore | 3 - .../node_modules/combined-stream/License | 19 - .../node_modules/combined-stream/Makefile | 7 - .../node_modules/combined-stream/Readme.md | 132 - .../combined-stream/lib/combined_stream.js | 183 - .../node_modules/delayed-stream/.npmignore | 2 - .../node_modules/delayed-stream/License | 19 - .../node_modules/delayed-stream/Makefile | 7 - .../node_modules/delayed-stream/Readme.md | 154 - .../delayed-stream/lib/delayed_stream.js | 99 - .../node_modules/delayed-stream/package.json | 38 - .../delayed-stream/test/common.js | 6 - .../integration/test-delayed-http-upload.js | 38 - .../test-delayed-stream-auto-pause.js | 21 - .../integration/test-delayed-stream-pause.js | 14 - .../test/integration/test-delayed-stream.js | 48 - .../integration/test-handle-source-errors.js | 15 - .../test/integration/test-max-data-size.js | 18 - .../test/integration/test-pipe-resumes.js | 13 - .../test/integration/test-proxy-readable.js | 13 - .../node_modules/delayed-stream/test/run.js | 7 - .../node_modules/combined-stream/package.json | 39 - .../combined-stream/test/common.js | 12 - .../combined-stream/test/fixture/file1.txt | 256 - .../combined-stream/test/fixture/file2.txt | 256 - .../test/integration/test-callback-streams.js | 27 - .../test/integration/test-data-size.js | 34 - ...delayed-streams-and-buffers-and-strings.js | 38 - .../test/integration/test-delayed-streams.js | 35 - .../test/integration/test-max-data-size.js | 24 - .../test/integration/test-unpaused-streams.js | 30 - .../node_modules/combined-stream/test/run.js | 7 - .../node_modules/form-data/package.json | 43 - .../node_modules/form-data/test/common.js | 14 - .../form-data/test/fixture/bacon.txt | 1 - .../form-data/test/fixture/unicycle.jpg | Bin 19806 -> 0 bytes .../test/integration/test-form-get-length.js | 93 - .../test/integration/test-get-boundary.js | 18 - .../test/integration/test-http-response.js | 121 - .../form-data/test/integration/test-pipe.js | 111 - .../form-data/test/integration/test-submit.js | 107 - .../node_modules/form-data/test/run.js | 7 - .../request/node_modules/mime/LICENSE | 19 - .../request/node_modules/mime/README.md | 63 - .../request/node_modules/mime/mime.js | 104 - .../request/node_modules/mime/package.json | 42 - .../request/node_modules/mime/test.js | 55 - .../node_modules/mime/types/mime.types | 1588 --- .../node_modules/mime/types/node.types | 59 - .../nodetime/node_modules/request/oauth.js | 43 - .../node_modules/request/package.json | 40 - .../request/tests/googledoodle.png | Bin 38510 -> 0 bytes .../node_modules/request/tests/run.js | 45 - .../node_modules/request/tests/server.js | 90 - .../node_modules/request/tests/squid.conf | 77 - .../node_modules/request/tests/ssl/ca/ca.cnf | 20 - .../node_modules/request/tests/ssl/ca/ca.crl | 0 .../node_modules/request/tests/ssl/ca/ca.crt | 17 - .../node_modules/request/tests/ssl/ca/ca.csr | 13 - .../node_modules/request/tests/ssl/ca/ca.key | 18 - .../node_modules/request/tests/ssl/ca/ca.srl | 1 - .../request/tests/ssl/ca/server.cnf | 19 - .../request/tests/ssl/ca/server.crt | 16 - .../request/tests/ssl/ca/server.csr | 11 - .../request/tests/ssl/ca/server.js | 28 - .../request/tests/ssl/ca/server.key | 9 - .../node_modules/request/tests/ssl/npm-ca.crt | 16 - .../node_modules/request/tests/ssl/test.crt | 15 - .../node_modules/request/tests/ssl/test.key | 15 - .../node_modules/request/tests/test-body.js | 117 - .../node_modules/request/tests/test-cookie.js | 29 - .../request/tests/test-cookiejar.js | 90 - .../request/tests/test-defaults.js | 114 - .../node_modules/request/tests/test-errors.js | 37 - .../request/tests/test-follow-all-303.js | 30 - .../request/tests/test-follow-all.js | 35 - .../node_modules/request/tests/test-form.js | 79 - .../request/tests/test-headers.js | 52 - .../request/tests/test-httpModule.js | 94 - .../request/tests/test-https-strict.js | 97 - .../node_modules/request/tests/test-https.js | 86 - .../node_modules/request/tests/test-oauth.js | 117 - .../node_modules/request/tests/test-params.js | 92 - .../request/tests/test-piped-redirect.js | 52 - .../node_modules/request/tests/test-pipes.js | 216 - .../node_modules/request/tests/test-pool.js | 16 - .../tests/test-protocol-changing-redirect.js | 60 - .../node_modules/request/tests/test-proxy.js | 39 - .../node_modules/request/tests/test-qs.js | 28 - .../request/tests/test-redirect.js | 154 - .../node_modules/request/tests/test-s3.js | 13 - .../request/tests/test-timeout.js | 87 - .../node_modules/request/tests/test-toJSON.js | 14 - .../node_modules/request/tests/test-tunnel.js | 63 - .../node_modules/request/tests/unicycle.jpg | Bin 19806 -> 0 bytes .../nodetime/node_modules/request/tunnel.js | 227 - .../nodetime/node_modules/request/uuid.js | 19 - .../request/vendor/cookie/index.js | 65 - .../node_modules/request/vendor/cookie/jar.js | 72 - node_modules/nodetime/package.json | 70 - node_modules/nodetime/publish.sh | 11 - node_modules/timekit/build/config.gypi | 104 - .../timekit/node_modules/bindings/bindings.js | 155 - .../node_modules/bindings/package.json | 27 - node_modules/timekit/package.json | 43 - node_modules/v8tools/.npmignore | 7 - node_modules/v8tools/LICENSE | 19 - node_modules/v8tools/README.md | 37 - node_modules/v8tools/binding.gyp | 14 - node_modules/v8tools/build/Makefile | 359 - .../Release/obj.target/v8tools/src/gc.o.d | 30 - .../obj.target/v8tools/src/profiler.o.d | 11 - .../obj.target/v8tools/src/v8tools.o.d | 32 - .../Release/.deps/Release/v8tools.node.d | 1 - .../v8tools/build/Release/linker.lock | 0 .../build/Release/obj.target/v8tools/src/gc.o | Bin 70968 -> 0 bytes .../Release/obj.target/v8tools/src/profiler.o | Bin 56832 -> 0 bytes .../Release/obj.target/v8tools/src/v8tools.o | Bin 40288 -> 0 bytes .../v8tools/build/Release/v8tools.node | Bin 18124 -> 0 bytes node_modules/v8tools/build/binding.Makefile | 6 - node_modules/v8tools/build/config.gypi | 104 - node_modules/v8tools/build/gyp-mac-tool | 210 - node_modules/v8tools/build/v8tools.target.mk | 135 - node_modules/v8tools/index.js | 24 - .../v8tools/node_modules/bindings/README.md | 97 - .../v8tools/node_modules/bindings/bindings.js | 155 - .../node_modules/bindings/package.json | 27 - node_modules/v8tools/package.json | 44 - node_modules/v8tools/src/gc.cc | 102 - node_modules/v8tools/src/gc.h | 13 - node_modules/v8tools/src/profiler.cc | 124 - node_modules/v8tools/src/profiler.h | 13 - node_modules/v8tools/src/v8tools.cc | 21 - node_modules/v8tools/v8tools.cc | 246 - node_modules/v8tools/wscript | 16 - 1372 files changed, 1 insertion(+), 151637 deletions(-) delete mode 100644 backups/live-annotations-2-22.json delete mode 120000 node_modules/.bin/express delete mode 100644 node_modules/cors/cors.js delete mode 100644 node_modules/express/.npmignore delete mode 100644 node_modules/express/.travis.yml delete mode 100644 node_modules/express/History.md delete mode 100644 node_modules/express/LICENSE delete mode 100644 node_modules/express/Makefile delete mode 100644 node_modules/express/Readme.md delete mode 100755 node_modules/express/bin/express delete mode 100644 node_modules/express/client.js delete mode 100644 node_modules/express/index.js delete mode 100644 node_modules/express/lib/application.js delete mode 100644 node_modules/express/lib/express.js delete mode 100644 node_modules/express/lib/middleware.js delete mode 100644 node_modules/express/lib/request.js delete mode 100644 node_modules/express/lib/response.js delete mode 100644 node_modules/express/lib/router/index.js delete mode 100644 node_modules/express/lib/router/route.js delete mode 100644 node_modules/express/lib/utils.js delete mode 100644 node_modules/express/lib/view.js delete mode 100644 node_modules/express/node_modules/buffer-crc32/.npmignore delete mode 100644 node_modules/express/node_modules/buffer-crc32/.travis.yml delete mode 100644 node_modules/express/node_modules/buffer-crc32/README.md delete mode 100644 node_modules/express/node_modules/buffer-crc32/index.js delete mode 100644 node_modules/express/node_modules/buffer-crc32/package.json delete mode 100644 node_modules/express/node_modules/buffer-crc32/tests/crc.test.js delete mode 100644 node_modules/express/node_modules/commander/.npmignore delete mode 100644 node_modules/express/node_modules/commander/.travis.yml delete mode 100644 node_modules/express/node_modules/commander/History.md delete mode 100644 node_modules/express/node_modules/commander/Makefile delete mode 100644 node_modules/express/node_modules/commander/Readme.md delete mode 100644 node_modules/express/node_modules/commander/index.js delete mode 100644 node_modules/express/node_modules/commander/lib/commander.js delete mode 100644 node_modules/express/node_modules/commander/package.json delete mode 100644 node_modules/express/node_modules/connect/.npmignore delete mode 100644 node_modules/express/node_modules/connect/.travis.yml delete mode 100644 node_modules/express/node_modules/connect/LICENSE delete mode 100644 node_modules/express/node_modules/connect/Readme.md delete mode 100644 node_modules/express/node_modules/connect/index.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/cache.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/connect.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/index.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/basicAuth.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/bodyParser.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/compress.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/cookieParser.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/cookieSession.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/csrf.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/directory.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/errorHandler.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/favicon.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/json.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/limit.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/logger.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/methodOverride.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/multipart.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/query.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/responseTime.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/session.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/session/cookie.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/session/memory.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/session/session.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/session/store.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/static.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/staticCache.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/timeout.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/urlencoded.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/vhost.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/patch.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/proto.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/directory.html delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/error.html delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/favicon.ico delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_add.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_attach.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_code.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_copy.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_delete.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_edit.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_error.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_excel.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_find.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_gear.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_go.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_green.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_key.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_lightning.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_link.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_paintbrush.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_paste.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_red.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_refresh.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_save.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_acrobat.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_actionscript.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_add.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_c.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_camera.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_cd.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_code.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_code_red.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_coldfusion.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_compressed.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_copy.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_cplusplus.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_csharp.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_cup.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_database.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_delete.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_dvd.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_edit.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_error.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_excel.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_find.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_flash.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_freehand.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_gear.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_get.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_go.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_h.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_horizontal.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_key.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_lightning.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_link.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_magnify.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_medal.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_office.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_paint.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_paintbrush.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_paste.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_php.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_picture.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_powerpoint.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_put.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_ruby.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_stack.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_star.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_swoosh.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_text.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_text_width.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_tux.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_vector.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_visualstudio.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_width.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_word.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_world.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_wrench.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_zip.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_word.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_world.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/style.css delete mode 100644 node_modules/express/node_modules/connect/lib-cov/utils.js delete mode 100644 node_modules/express/node_modules/connect/lib/cache.js delete mode 100644 node_modules/express/node_modules/connect/lib/connect.js delete mode 100644 node_modules/express/node_modules/connect/lib/index.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/basicAuth.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/bodyParser.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/compress.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/cookieParser.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/cookieSession.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/csrf.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/directory.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/errorHandler.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/favicon.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/json.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/limit.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/logger.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/methodOverride.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/multipart.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/query.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/responseTime.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/session.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/session/cookie.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/session/memory.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/session/session.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/session/store.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/static.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/staticCache.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/timeout.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/urlencoded.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/vhost.js delete mode 100644 node_modules/express/node_modules/connect/lib/patch.js delete mode 100644 node_modules/express/node_modules/connect/lib/proto.js delete mode 100644 node_modules/express/node_modules/connect/lib/public/directory.html delete mode 100644 node_modules/express/node_modules/connect/lib/public/error.html delete mode 100644 node_modules/express/node_modules/connect/lib/public/favicon.ico delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_add.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_attach.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_code.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_copy.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_delete.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_edit.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_error.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_excel.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_find.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_gear.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_go.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_green.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_key.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_lightning.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_link.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_paintbrush.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_paste.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_red.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_refresh.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_save.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_acrobat.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_actionscript.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_add.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_c.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_camera.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_cd.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_code.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_code_red.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_coldfusion.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_compressed.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_copy.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_cplusplus.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_csharp.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_cup.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_database.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_delete.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_dvd.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_edit.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_error.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_excel.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_find.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_flash.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_freehand.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_gear.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_get.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_go.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_h.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_horizontal.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_key.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_lightning.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_link.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_magnify.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_medal.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_office.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_paint.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_paintbrush.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_paste.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_php.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_picture.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_powerpoint.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_put.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_ruby.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_stack.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_star.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_swoosh.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_text.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_text_width.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_tux.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_vector.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_visualstudio.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_width.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_word.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_world.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_wrench.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_zip.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_word.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_world.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/style.css delete mode 100644 node_modules/express/node_modules/connect/lib/utils.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/bytes/.npmignore delete mode 100644 node_modules/express/node_modules/connect/node_modules/bytes/History.md delete mode 100644 node_modules/express/node_modules/connect/node_modules/bytes/Makefile delete mode 100644 node_modules/express/node_modules/connect/node_modules/bytes/Readme.md delete mode 100644 node_modules/express/node_modules/connect/node_modules/bytes/component.json delete mode 100644 node_modules/express/node_modules/connect/node_modules/bytes/index.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/bytes/package.json delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/.npmignore delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/.travis.yml delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/Makefile delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/Readme.md delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/TODO delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/benchmark/bench-multipart-parser.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/example/post.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/example/upload.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/index.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/lib/file.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/lib/incoming_form.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/lib/index.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/lib/multipart_parser.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/lib/querystring_parser.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/lib/util.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/node-gently/Makefile delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/node-gently/Readme.md delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/node-gently/example/dog.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/node-gently/example/event_emitter.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/node-gently/index.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/node-gently/lib/gently/gently.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/node-gently/lib/gently/index.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/node-gently/package.json delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/node-gently/test/common.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/node-gently/test/simple/test-gently.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/package.json delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/common.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/file/funkyfilename.txt delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/file/plain.txt delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/info.md delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/js/no-filename.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/js/special-chars-in-filename.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/multipart.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/integration/test-fixtures.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/common.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/integration/test-multipart-parser.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-file.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-incoming-form.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-multipart-parser.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-querystring-parser.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/system/test-multi-video-upload.js delete mode 100755 node_modules/express/node_modules/connect/node_modules/formidable/test/run.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/unit/test-incoming-form.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/tool/record.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/pause/.npmignore delete mode 100644 node_modules/express/node_modules/connect/node_modules/pause/History.md delete mode 100644 node_modules/express/node_modules/connect/node_modules/pause/Makefile delete mode 100644 node_modules/express/node_modules/connect/node_modules/pause/Readme.md delete mode 100644 node_modules/express/node_modules/connect/node_modules/pause/index.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/pause/package.json delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/.gitmodules delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/.npmignore delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/.travis.yml delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/History.md delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/Makefile delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/Readme.md delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/benchmark.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/component.json delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/examples.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/index.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/lib/head.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/lib/querystring.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/lib/tail.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/package.json delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/querystring.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/test/browser/expect.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/test/browser/index.html delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/test/browser/jquery.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/test/browser/mocha.css delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/test/browser/mocha.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/test/browser/qs.css delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/test/browser/qs.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/test/parse.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/test/stringify.js delete mode 100644 node_modules/express/node_modules/connect/package.json delete mode 100644 node_modules/express/node_modules/connect/test.js delete mode 100644 node_modules/express/node_modules/cookie-signature/.npmignore delete mode 100644 node_modules/express/node_modules/cookie-signature/History.md delete mode 100644 node_modules/express/node_modules/cookie-signature/Makefile delete mode 100644 node_modules/express/node_modules/cookie-signature/Readme.md delete mode 100644 node_modules/express/node_modules/cookie-signature/index.js delete mode 100644 node_modules/express/node_modules/cookie-signature/package.json delete mode 100644 node_modules/express/node_modules/cookie/.npmignore delete mode 100644 node_modules/express/node_modules/cookie/.travis.yml delete mode 100644 node_modules/express/node_modules/cookie/README.md delete mode 100644 node_modules/express/node_modules/cookie/index.js delete mode 100644 node_modules/express/node_modules/cookie/package.json delete mode 100644 node_modules/express/node_modules/cookie/test/mocha.opts delete mode 100644 node_modules/express/node_modules/cookie/test/parse.js delete mode 100644 node_modules/express/node_modules/cookie/test/serialize.js delete mode 100644 node_modules/express/node_modules/debug/.npmignore delete mode 100644 node_modules/express/node_modules/debug/History.md delete mode 100644 node_modules/express/node_modules/debug/Readme.md delete mode 100644 node_modules/express/node_modules/debug/component.json delete mode 100644 node_modules/express/node_modules/debug/debug.js delete mode 100644 node_modules/express/node_modules/debug/example/app.js delete mode 100644 node_modules/express/node_modules/debug/example/browser.html delete mode 100644 node_modules/express/node_modules/debug/example/wildcards.js delete mode 100644 node_modules/express/node_modules/debug/example/worker.js delete mode 100644 node_modules/express/node_modules/debug/index.js delete mode 100644 node_modules/express/node_modules/debug/lib/debug.js delete mode 100644 node_modules/express/node_modules/debug/package.json delete mode 100644 node_modules/express/node_modules/fresh/.npmignore delete mode 100644 node_modules/express/node_modules/fresh/Makefile delete mode 100644 node_modules/express/node_modules/fresh/Readme.md delete mode 100644 node_modules/express/node_modules/fresh/index.js delete mode 100644 node_modules/express/node_modules/fresh/package.json delete mode 100644 node_modules/express/node_modules/methods/index.js delete mode 100644 node_modules/express/node_modules/methods/package.json delete mode 100644 node_modules/express/node_modules/mkdirp/.gitignore.orig delete mode 100644 node_modules/express/node_modules/mkdirp/.gitignore.rej delete mode 100644 node_modules/express/node_modules/mkdirp/.npmignore delete mode 100644 node_modules/express/node_modules/mkdirp/.travis.yml delete mode 100644 node_modules/express/node_modules/mkdirp/LICENSE delete mode 100644 node_modules/express/node_modules/mkdirp/README.markdown delete mode 100644 node_modules/express/node_modules/mkdirp/examples/pow.js delete mode 100644 node_modules/express/node_modules/mkdirp/examples/pow.js.orig delete mode 100644 node_modules/express/node_modules/mkdirp/examples/pow.js.rej delete mode 100644 node_modules/express/node_modules/mkdirp/index.js delete mode 100644 node_modules/express/node_modules/mkdirp/package.json delete mode 100644 node_modules/express/node_modules/mkdirp/test/chmod.js delete mode 100644 node_modules/express/node_modules/mkdirp/test/clobber.js delete mode 100644 node_modules/express/node_modules/mkdirp/test/mkdirp.js delete mode 100644 node_modules/express/node_modules/mkdirp/test/perm.js delete mode 100644 node_modules/express/node_modules/mkdirp/test/perm_sync.js delete mode 100644 node_modules/express/node_modules/mkdirp/test/race.js delete mode 100644 node_modules/express/node_modules/mkdirp/test/rel.js delete mode 100644 node_modules/express/node_modules/mkdirp/test/return.js delete mode 100644 node_modules/express/node_modules/mkdirp/test/return_sync.js delete mode 100644 node_modules/express/node_modules/mkdirp/test/root.js delete mode 100644 node_modules/express/node_modules/mkdirp/test/sync.js delete mode 100644 node_modules/express/node_modules/mkdirp/test/umask.js delete mode 100644 node_modules/express/node_modules/mkdirp/test/umask_sync.js delete mode 100644 node_modules/express/node_modules/range-parser/.npmignore delete mode 100644 node_modules/express/node_modules/range-parser/History.md delete mode 100644 node_modules/express/node_modules/range-parser/Makefile delete mode 100644 node_modules/express/node_modules/range-parser/Readme.md delete mode 100644 node_modules/express/node_modules/range-parser/index.js delete mode 100644 node_modules/express/node_modules/range-parser/package.json delete mode 100644 node_modules/express/node_modules/send/.npmignore delete mode 100644 node_modules/express/node_modules/send/History.md delete mode 100644 node_modules/express/node_modules/send/Makefile delete mode 100644 node_modules/express/node_modules/send/Readme.md delete mode 100644 node_modules/express/node_modules/send/index.js delete mode 100644 node_modules/express/node_modules/send/lib/send.js delete mode 100644 node_modules/express/node_modules/send/lib/utils.js delete mode 100644 node_modules/express/node_modules/send/node_modules/mime/LICENSE delete mode 100644 node_modules/express/node_modules/send/node_modules/mime/README.md delete mode 100644 node_modules/express/node_modules/send/node_modules/mime/mime.js delete mode 100644 node_modules/express/node_modules/send/node_modules/mime/package.json delete mode 100644 node_modules/express/node_modules/send/node_modules/mime/test.js delete mode 100644 node_modules/express/node_modules/send/node_modules/mime/types/mime.types delete mode 100644 node_modules/express/node_modules/send/node_modules/mime/types/node.types delete mode 100644 node_modules/express/node_modules/send/package.json delete mode 100644 node_modules/express/package.json delete mode 100644 node_modules/express/test.js delete mode 100644 node_modules/jwt-simple/.npmignore delete mode 100644 node_modules/jwt-simple/History.md delete mode 100644 node_modules/jwt-simple/LICENSE delete mode 100644 node_modules/jwt-simple/README.md delete mode 100644 node_modules/jwt-simple/index.js delete mode 100644 node_modules/jwt-simple/lib/jwt.js delete mode 100644 node_modules/jwt-simple/package.json delete mode 100644 node_modules/jwt-simple/test/basic.js delete mode 100644 node_modules/less-middleware/.npmignore delete mode 100644 node_modules/less-middleware/lib/middleware.js delete mode 120000 node_modules/less-middleware/node_modules/.bin/lessc delete mode 100644 node_modules/less-middleware/node_modules/less/.npmignore delete mode 100644 node_modules/less-middleware/node_modules/less/CHANGELOG.md delete mode 100644 node_modules/less-middleware/node_modules/less/CONTRIBUTING.md delete mode 100644 node_modules/less-middleware/node_modules/less/LICENSE delete mode 100644 node_modules/less-middleware/node_modules/less/Makefile delete mode 100644 node_modules/less-middleware/node_modules/less/README.md delete mode 100644 node_modules/less-middleware/node_modules/less/benchmark/benchmark.less delete mode 100644 node_modules/less-middleware/node_modules/less/benchmark/less-benchmark.js delete mode 100755 node_modules/less-middleware/node_modules/less/bin/lessc delete mode 100644 node_modules/less-middleware/node_modules/less/build/amd.js delete mode 100644 node_modules/less-middleware/node_modules/less/build/ecma-5.js delete mode 100644 node_modules/less-middleware/node_modules/less/build/header.js delete mode 100644 node_modules/less-middleware/node_modules/less/build/require-rhino.js delete mode 100644 node_modules/less-middleware/node_modules/less/build/require.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/browser.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/colors.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/functions.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/index.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/lessc_helper.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/parser.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/rhino.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/alpha.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/anonymous.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/assignment.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/call.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/color.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/comment.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/condition.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/dimension.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/directive.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/element.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/expression.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/import.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/javascript.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/keyword.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/media.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/mixin.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/operation.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/paren.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/quoted.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/ratio.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/rule.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/ruleset.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/selector.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/unicode-descriptor.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/url.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/value.js delete mode 100644 node_modules/less-middleware/node_modules/less/lib/less/tree/variable.js delete mode 120000 node_modules/less-middleware/node_modules/less/node_modules/.bin/ycssmin delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/.npmignore delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/.travis.yml delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/LICENSE delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/Makefile delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/README.md delete mode 100755 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/bin/cssmin delete mode 100755 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/cssmin.js delete mode 100755 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/package.json delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/background-position.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/background-position.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/border-none.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/border-none.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/box-model-hack.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/box-model-hack.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2527974.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2527974.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2527991.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2527991.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2527998.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2527998.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2528034.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2528034.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/charset-media.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/charset-media.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/color-simple.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/color-simple.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/color.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/color.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/comment.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/comment.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/concat-charset.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/concat-charset.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-doublequotes.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-doublequotes.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-eof.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-eof.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-linebreakindata.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-linebreakindata.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-noquotes.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-noquotes.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-singlequotes.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-singlequotes.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-twourls.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-twourls.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-dbquote-font.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-dbquote-font.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-nonbase64-doublequotes.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-nonbase64-doublequotes.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-nonbase64-noquotes.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-nonbase64-noquotes.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-nonbase64-singlequotes.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-nonbase64-singlequotes.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-noquote-multiline-font.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-noquote-multiline-font.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-doublequotes.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-doublequotes.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-noquotes.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-noquotes.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-singlequotes.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-singlequotes.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-yuiapp.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-yuiapp.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-singlequote-font.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-singlequote-font.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/decimals.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/decimals.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dollar-header.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dollar-header.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/font-face.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/font-face.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/ie5mac.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/ie5mac.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/media-empty-class.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/media-empty-class.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/media-multi.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/media-multi.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/media-test.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/media-test.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/opacity-filter.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/opacity-filter.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/preserve-case.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/preserve-case.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/preserve-new-line.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/preserve-new-line.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/preserve-strings.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/preserve-strings.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/pseudo-first.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/pseudo-first.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/pseudo.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/pseudo.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/special-comments.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/special-comments.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/special/linebreakpos.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/special/linebreakpos.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/star-underscore-hacks.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/star-underscore-hacks.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/string-in-comment.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/string-in-comment.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/webkit-transform.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/webkit-transform.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/zeros.css delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/zeros.css.min delete mode 100644 node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/tests.js delete mode 100644 node_modules/less-middleware/node_modules/less/package.json delete mode 100644 node_modules/less-middleware/node_modules/less/test/browser-test-prepare.js delete mode 100644 node_modules/less-middleware/node_modules/less/test/browser/common.js delete mode 100644 node_modules/less-middleware/node_modules/less/test/browser/css/relative-urls/urls.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/browser/css/rootpath-relative/urls.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/browser/css/rootpath/urls.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/browser/css/urls.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/browser/jasmine-html.js delete mode 100644 node_modules/less-middleware/node_modules/less/test/browser/jasmine.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/browser/jasmine.js delete mode 100644 node_modules/less-middleware/node_modules/less/test/browser/less/imports/urls.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/browser/less/imports/urls2.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/browser/less/relative-urls/urls.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/browser/less/rootpath-relative/urls.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/browser/less/rootpath/urls.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/browser/less/urls.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/browser/phantom-runner.js delete mode 100644 node_modules/less-middleware/node_modules/less/test/browser/runner-browser.js delete mode 100644 node_modules/less-middleware/node_modules/less/test/browser/runner-main.js delete mode 100644 node_modules/less-middleware/node_modules/less/test/browser/runner-relative-urls.js delete mode 100644 node_modules/less-middleware/node_modules/less/test/browser/runner-rootpath-relative.js delete mode 100644 node_modules/less-middleware/node_modules/less/test/browser/runner-rootpath.js delete mode 100644 node_modules/less-middleware/node_modules/less/test/browser/template.htm delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/charsets.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/colors.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/comments.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/css-3.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/css-escapes.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/css.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/debug/linenumbers-all.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/debug/linenumbers-comments.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/debug/linenumbers-mediaquery.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/functions.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/ie-filters.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/import-once.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/import.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/javascript.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/lazy-eval.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/media.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/mixins-args.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/mixins-closure.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/mixins-guards.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/mixins-important.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/mixins-named-args.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/mixins-nested.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/mixins-pattern.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/mixins.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/operations.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/parens.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/rulesets.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/scope.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/selectors.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/static-urls/urls.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/strings.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/urls.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/variables.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/css/whitespace.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/less-test.js delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/charsets.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/colors.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/comments.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/css-3.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/css-escapes.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/css.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/debug/import/test.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/debug/linenumbers.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/bad-variable-declaration1.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/bad-variable-declaration1.txt delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/comment-in-selector.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/comment-in-selector.txt delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/import-missing.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/import-missing.txt delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/import-no-semi.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/import-no-semi.txt delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/import-subfolder1.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/import-subfolder1.txt delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/import-subfolder2.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/import-subfolder2.txt delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/imports/import-subfolder1.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/imports/import-subfolder2.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/imports/import-test.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/imports/subfolder/mixin-not-defined.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/imports/subfolder/parse-error-curly-bracket.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/javascript-error.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/javascript-error.txt delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/mixed-mixin-definition-args-1.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/mixed-mixin-definition-args-1.txt delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/mixed-mixin-definition-args-2.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/mixed-mixin-definition-args-2.txt delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/mixin-not-defined.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/mixin-not-defined.txt delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/mixin-not-matched.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/mixin-not-matched.txt delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/mixin-not-matched2.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/mixin-not-matched2.txt delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/parse-error-curly-bracket.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/parse-error-curly-bracket.txt delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/parse-error-missing-bracket.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/parse-error-missing-bracket.txt delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/parse-error-with-import.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/parse-error-with-import.txt delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/property-ie5-hack.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/property-ie5-hack.txt delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/recursive-variable.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/errors/recursive-variable.txt delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/functions.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/ie-filters.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/import-once.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/import.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/import/deeper/import-once-test-a.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/import/import-and-relative-paths-test.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/import/import-charset-test.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/import/import-once-test-c.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/import/import-test-a.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/import/import-test-b.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/import/import-test-c.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/import/import-test-d.css delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/import/import-test-e.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/import/imports/font.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/import/imports/logo.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/import/urls.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/javascript.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/lazy-eval.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/media.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/mixins-args.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/mixins-closure.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/mixins-guards.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/mixins-important.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/mixins-named-args.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/mixins-nested.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/mixins-pattern.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/mixins.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/operations.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/parens.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/rulesets.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/scope.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/selectors.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/static-urls/urls.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/strings.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/urls.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/variables.less delete mode 100644 node_modules/less-middleware/node_modules/less/test/less/whitespace.less delete mode 100644 node_modules/less-middleware/node_modules/mkdirp/.npmignore delete mode 100644 node_modules/less-middleware/node_modules/mkdirp/.travis.yml delete mode 100644 node_modules/less-middleware/node_modules/mkdirp/LICENSE delete mode 100644 node_modules/less-middleware/node_modules/mkdirp/README.markdown delete mode 100644 node_modules/less-middleware/node_modules/mkdirp/examples/pow.js delete mode 100644 node_modules/less-middleware/node_modules/mkdirp/index.js delete mode 100644 node_modules/less-middleware/node_modules/mkdirp/package.json delete mode 100644 node_modules/less-middleware/node_modules/mkdirp/test/chmod.js delete mode 100644 node_modules/less-middleware/node_modules/mkdirp/test/clobber.js delete mode 100644 node_modules/less-middleware/node_modules/mkdirp/test/mkdirp.js delete mode 100644 node_modules/less-middleware/node_modules/mkdirp/test/perm.js delete mode 100644 node_modules/less-middleware/node_modules/mkdirp/test/perm_sync.js delete mode 100644 node_modules/less-middleware/node_modules/mkdirp/test/race.js delete mode 100644 node_modules/less-middleware/node_modules/mkdirp/test/rel.js delete mode 100644 node_modules/less-middleware/node_modules/mkdirp/test/return.js delete mode 100644 node_modules/less-middleware/node_modules/mkdirp/test/return_sync.js delete mode 100644 node_modules/less-middleware/node_modules/mkdirp/test/root.js delete mode 100644 node_modules/less-middleware/node_modules/mkdirp/test/sync.js delete mode 100644 node_modules/less-middleware/node_modules/mkdirp/test/umask.js delete mode 100644 node_modules/less-middleware/node_modules/mkdirp/test/umask_sync.js delete mode 100644 node_modules/less-middleware/package.json delete mode 100644 node_modules/less-middleware/readme.md delete mode 100644 node_modules/less-middleware/test/parse-test.js delete mode 100644 node_modules/mongoose/.npmignore delete mode 100644 node_modules/mongoose/.travis.yml delete mode 100644 node_modules/mongoose/CONTRIBUTING.md delete mode 100644 node_modules/mongoose/History.md delete mode 100644 node_modules/mongoose/README.md delete mode 100644 node_modules/mongoose/examples/schema.js delete mode 100644 node_modules/mongoose/index.js delete mode 100644 node_modules/mongoose/lib/collection.js delete mode 100644 node_modules/mongoose/lib/connection.js delete mode 100644 node_modules/mongoose/lib/connectionstate.js delete mode 100644 node_modules/mongoose/lib/document.js delete mode 100644 node_modules/mongoose/lib/drivers/node-mongodb-native/binary.js delete mode 100644 node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js delete mode 100644 node_modules/mongoose/lib/drivers/node-mongodb-native/connection.js delete mode 100644 node_modules/mongoose/lib/drivers/node-mongodb-native/objectid.js delete mode 100644 node_modules/mongoose/lib/error.js delete mode 100644 node_modules/mongoose/lib/errors/cast.js delete mode 100644 node_modules/mongoose/lib/errors/document.js delete mode 100644 node_modules/mongoose/lib/errors/missingSchema.js delete mode 100644 node_modules/mongoose/lib/errors/overwriteModel.js delete mode 100644 node_modules/mongoose/lib/errors/validation.js delete mode 100644 node_modules/mongoose/lib/errors/validator.js delete mode 100644 node_modules/mongoose/lib/errors/version.js delete mode 100644 node_modules/mongoose/lib/index.js delete mode 100644 node_modules/mongoose/lib/model.js delete mode 100644 node_modules/mongoose/lib/namedscope.js delete mode 100644 node_modules/mongoose/lib/promise.js delete mode 100644 node_modules/mongoose/lib/query.js delete mode 100644 node_modules/mongoose/lib/querystream.js delete mode 100644 node_modules/mongoose/lib/schema.js delete mode 100644 node_modules/mongoose/lib/schema/array.js delete mode 100644 node_modules/mongoose/lib/schema/boolean.js delete mode 100644 node_modules/mongoose/lib/schema/buffer.js delete mode 100644 node_modules/mongoose/lib/schema/date.js delete mode 100644 node_modules/mongoose/lib/schema/documentarray.js delete mode 100644 node_modules/mongoose/lib/schema/index.js delete mode 100644 node_modules/mongoose/lib/schema/mixed.js delete mode 100644 node_modules/mongoose/lib/schema/number.js delete mode 100644 node_modules/mongoose/lib/schema/objectid.js delete mode 100644 node_modules/mongoose/lib/schema/string.js delete mode 100644 node_modules/mongoose/lib/schemadefault.js delete mode 100644 node_modules/mongoose/lib/schematype.js delete mode 100644 node_modules/mongoose/lib/statemachine.js delete mode 100644 node_modules/mongoose/lib/types/array.js delete mode 100644 node_modules/mongoose/lib/types/buffer.js delete mode 100644 node_modules/mongoose/lib/types/documentarray.js delete mode 100644 node_modules/mongoose/lib/types/embedded.js delete mode 100644 node_modules/mongoose/lib/types/index.js delete mode 100644 node_modules/mongoose/lib/types/objectid.js delete mode 100644 node_modules/mongoose/lib/utils.js delete mode 100644 node_modules/mongoose/lib/virtualtype.js delete mode 100644 node_modules/mongoose/node_modules/hooks/.npmignore delete mode 100644 node_modules/mongoose/node_modules/hooks/Makefile delete mode 100644 node_modules/mongoose/node_modules/hooks/README.md delete mode 100644 node_modules/mongoose/node_modules/hooks/hooks.alt.js delete mode 100644 node_modules/mongoose/node_modules/hooks/hooks.js delete mode 100644 node_modules/mongoose/node_modules/hooks/package.json delete mode 100644 node_modules/mongoose/node_modules/hooks/test.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/.travis.yml delete mode 100644 node_modules/mongoose/node_modules/mongodb/CONTRIBUTING.md delete mode 100644 node_modules/mongoose/node_modules/mongodb/Makefile delete mode 100644 node_modules/mongoose/node_modules/mongodb/Readme.md delete mode 100755 node_modules/mongoose/node_modules/mongodb/index.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/install.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/admin.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/collection.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/base_command.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/db_command.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/delete_command.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/get_more_command.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/insert_command.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/kill_cursor_command.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/query_command.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/update_command.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/base.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection_pool.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection_utils.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/mongos.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/read_preference.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/repl_set.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/strategies/ping_strategy.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/strategies/statistics_strategy.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/url_parser.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursor.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursorstream.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/db.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/chunk.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/grid.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/gridstore.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/readstream.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/index.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/mongo_client.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/lib/mongodb/utils.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/.travis.yml delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/Makefile delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/Readme.md delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/benchmarks/benchmarks.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/binding.gyp delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/browser_build/bson.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/browser_build/package.json delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/Makefile delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/Release/.deps/Release/bson.node.d delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/Release/.deps/Release/obj.target/bson/ext/bson.o.d delete mode 100755 node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/Release/bson.node delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/Release/linker.lock delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/Release/obj.target/bson/ext/bson.o delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/binding.Makefile delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/bson.target.mk delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/config.gypi delete mode 100755 node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/gyp-mac-tool delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/build_browser.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/builderror.log delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/Makefile delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/bson.cc delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/bson.h delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/index.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/win32/ia32/bson.node delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/win32/x64/bson.node delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/wscript delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/binary.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/binary_parser.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/bson.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/code.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/db_ref.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/double.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/float_parser.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/index.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/long.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/max_key.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/min_key.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/objectid.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/symbol.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/timestamp.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/package.json delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/browser/browser_example.htm delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/browser/bson_test.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/browser/nodeunit.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/browser/suite2.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/browser/suite3.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/browser/test.html delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/bson_array_test.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/bson_parser_comparision_test.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/bson_test.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/bson_typed_array_test.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/data/test_gs_weird_bug.png delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/test_full_bson.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/to_bson_test.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/tools/utils.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/tools/gleak.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/tools/jasmine-1.1.0/MIT.LICENSE delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/tools/jasmine-1.1.0/jasmine-html.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/tools/jasmine-1.1.0/jasmine.css delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/tools/jasmine-1.1.0/jasmine.js delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/bson/tools/jasmine-1.1.0/jasmine_favicon.png delete mode 100755 node_modules/mongoose/node_modules/mongodb/package.json delete mode 100644 node_modules/mongoose/node_modules/mongodb/upload.py delete mode 100644 node_modules/mongoose/node_modules/ms/.npmignore delete mode 100644 node_modules/mongoose/node_modules/ms/Makefile delete mode 100644 node_modules/mongoose/node_modules/ms/README.md delete mode 100644 node_modules/mongoose/node_modules/ms/ms.js delete mode 100644 node_modules/mongoose/node_modules/ms/package.json delete mode 100644 node_modules/mongoose/node_modules/ms/test/index.html delete mode 100644 node_modules/mongoose/node_modules/ms/test/support/jquery.js delete mode 100644 node_modules/mongoose/node_modules/ms/test/test.js delete mode 100644 node_modules/mongoose/node_modules/muri/.npmignore delete mode 100644 node_modules/mongoose/node_modules/muri/.travis.yml delete mode 100644 node_modules/mongoose/node_modules/muri/History.md delete mode 100644 node_modules/mongoose/node_modules/muri/LICENSE delete mode 100644 node_modules/mongoose/node_modules/muri/Makefile delete mode 100644 node_modules/mongoose/node_modules/muri/README.md delete mode 100644 node_modules/mongoose/node_modules/muri/index.js delete mode 100644 node_modules/mongoose/node_modules/muri/lib/index.js delete mode 100644 node_modules/mongoose/node_modules/muri/package.json delete mode 100644 node_modules/mongoose/node_modules/muri/test/index.js delete mode 100644 node_modules/mongoose/node_modules/sliced/.npmignore delete mode 100644 node_modules/mongoose/node_modules/sliced/.travis.yml delete mode 100644 node_modules/mongoose/node_modules/sliced/History.md delete mode 100644 node_modules/mongoose/node_modules/sliced/LICENSE delete mode 100644 node_modules/mongoose/node_modules/sliced/Makefile delete mode 100644 node_modules/mongoose/node_modules/sliced/README.md delete mode 100644 node_modules/mongoose/node_modules/sliced/bench.js delete mode 100644 node_modules/mongoose/node_modules/sliced/index.js delete mode 100644 node_modules/mongoose/node_modules/sliced/lib/sliced.js delete mode 100644 node_modules/mongoose/node_modules/sliced/package.json delete mode 100644 node_modules/mongoose/node_modules/sliced/test/index.js delete mode 100644 node_modules/mongoose/package.json delete mode 100644 node_modules/mongoose/static.js delete mode 100644 node_modules/mongoose/website.js delete mode 100644 node_modules/nodetime/.npmignore delete mode 100644 node_modules/nodetime/LICENSE delete mode 100644 node_modules/nodetime/README.md delete mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.10.0/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.10.1/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.0/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.1/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.10/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.11/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.12/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.13/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.14/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.15/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.16/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.17/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.18/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.19/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.2/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.20/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.21/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.22/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.3/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.4/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.5/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.6/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.7/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.8/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/darwin/x64/v0.8.9/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.10.0/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.10.1/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.0/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.1/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.10/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.11/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.12/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.13/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.14/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.15/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.16/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.17/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.18/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.19/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.2/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.20/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.21/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.3/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.4/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.5/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.6/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.7/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.8/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.6.9/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.0/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.1/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.10/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.11/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.12/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.13/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.14/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.15/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.16/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.17/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.18/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.19/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.2/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.20/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.21/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.22/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.3/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.4/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.5/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.6/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.7/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.8/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/ia32/v0.8.9/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.10.0/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.10.1/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.0/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.1/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.10/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.11/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.12/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.13/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.14/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.15/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.16/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.17/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.18/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.19/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.2/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.20/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.21/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.3/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.4/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.5/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.6/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.7/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.8/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.6.9/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.0/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.1/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.10/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.11/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.12/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.13/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.14/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.15/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.16/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.17/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.18/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.19/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.2/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.20/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.21/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.22/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.3/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.4/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.5/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.6/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.7/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.8/nodetime_native.node delete mode 100755 node_modules/nodetime/compiled/linux/x64/v0.8.9/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.10.0/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.10.1/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.0/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.1/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.10/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.11/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.12/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.13/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.14/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.15/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.16/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.17/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.18/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.19/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.2/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.20/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.21/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.22/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.3/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.4/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.5/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.6/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.7/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.8/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/ia32/v0.8.9/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/x64/v0.10.0/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/x64/v0.10.1/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.0/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.1/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.10/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.11/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.12/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.13/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.14/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.15/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.16/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.17/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.18/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.19/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.2/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.20/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.21/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.22/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.3/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.4/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.5/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.6/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.7/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.8/nodetime_native.node delete mode 100644 node_modules/nodetime/compiled/win32/x64/v0.8.9/nodetime_native.node delete mode 100644 node_modules/nodetime/index.js delete mode 100644 node_modules/nodetime/lib/addons/dtrace-provider.js delete mode 100644 node_modules/nodetime/lib/addons/stdout-writer.js delete mode 100644 node_modules/nodetime/lib/core/agent.js delete mode 100644 node_modules/nodetime/lib/core/logger.js delete mode 100644 node_modules/nodetime/lib/core/proxy.js delete mode 100644 node_modules/nodetime/lib/core/system.js delete mode 100644 node_modules/nodetime/lib/core/thread.js delete mode 100644 node_modules/nodetime/lib/core/time.js delete mode 100644 node_modules/nodetime/lib/core/timers.js delete mode 100644 node_modules/nodetime/lib/core/utils.js delete mode 100644 node_modules/nodetime/lib/metrics/metric.js delete mode 100644 node_modules/nodetime/lib/metrics/metrics-manager.js delete mode 100644 node_modules/nodetime/lib/monitors/mongodb-monitor.js delete mode 100644 node_modules/nodetime/lib/monitors/redis-monitor.js delete mode 100644 node_modules/nodetime/lib/probes/cassandra-client-probe.js delete mode 100644 node_modules/nodetime/lib/probes/cassandra-probe.js delete mode 100644 node_modules/nodetime/lib/probes/fs-probe.js delete mode 100644 node_modules/nodetime/lib/probes/global-probe.js delete mode 100644 node_modules/nodetime/lib/probes/http-probe.js delete mode 100644 node_modules/nodetime/lib/probes/memcache-probe.js delete mode 100644 node_modules/nodetime/lib/probes/memcached-probe.js delete mode 100644 node_modules/nodetime/lib/probes/mongodb-probe.js delete mode 100644 node_modules/nodetime/lib/probes/mysql-probe.js delete mode 100644 node_modules/nodetime/lib/probes/net-probe.js delete mode 100644 node_modules/nodetime/lib/probes/pg-probe.js delete mode 100644 node_modules/nodetime/lib/probes/process-probe.js delete mode 100644 node_modules/nodetime/lib/probes/redis-probe.js delete mode 100644 node_modules/nodetime/lib/probes/socket.io-probe.js delete mode 100644 node_modules/nodetime/lib/process/disk-stats.js delete mode 100644 node_modules/nodetime/lib/process/process-info.js delete mode 100644 node_modules/nodetime/lib/process/process-state.js delete mode 100644 node_modules/nodetime/lib/process/process-stats.js delete mode 100644 node_modules/nodetime/lib/profiler/call-metrics-groups.js delete mode 100644 node_modules/nodetime/lib/profiler/call-metrics.js delete mode 100644 node_modules/nodetime/lib/profiler/custom-transaction.js delete mode 100644 node_modules/nodetime/lib/profiler/filter/filter-key-extractor.js delete mode 100644 node_modules/nodetime/lib/profiler/filter/predicate-filter.js delete mode 100644 node_modules/nodetime/lib/profiler/named-transactions.js delete mode 100644 node_modules/nodetime/lib/profiler/profiler.js delete mode 100644 node_modules/nodetime/lib/profiler/sample.js delete mode 100644 node_modules/nodetime/lib/profiler/skip-counter.js delete mode 100644 node_modules/nodetime/lib/profiler/time-promise.js delete mode 100644 node_modules/nodetime/lib/saas/data-sender.js delete mode 100644 node_modules/nodetime/lib/saas/gzip-request.js delete mode 100644 node_modules/nodetime/lib/saas/saas-client.js delete mode 100644 node_modules/nodetime/lib/v8/cpu-profiler.js delete mode 100644 node_modules/nodetime/lib/v8/gc-stats.js delete mode 100644 node_modules/nodetime/lib/v8/heap-profiler.js delete mode 100644 node_modules/nodetime/lib/v8/heap-stats.js delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/.npmignore delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/LICENSE delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/README.md delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/binding.gyp delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/Makefile delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/Release/.deps/Release/nodetime_native.node.d delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/Release/.deps/Release/obj.target/nodetime_native/src/gc.o.d delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/Release/.deps/Release/obj.target/nodetime_native/src/nodetime_native.o.d delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/Release/.deps/Release/obj.target/nodetime_native/src/profiler.o.d delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/Release/.deps/Release/obj.target/nodetime_native/src/system_posix.o.d delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/Release/linker.lock delete mode 100755 node_modules/nodetime/node_modules/nodetime-native/build/Release/nodetime_native.node delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/Release/obj.target/nodetime_native/src/gc.o delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/Release/obj.target/nodetime_native/src/nodetime_native.o delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/Release/obj.target/nodetime_native/src/profiler.o delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/Release/obj.target/nodetime_native/src/system_posix.o delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/binding.Makefile delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/config.gypi delete mode 100755 node_modules/nodetime/node_modules/nodetime-native/build/gyp-mac-tool delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/build/nodetime_native.target.mk delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/index.js delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/node_modules/bindings/README.md delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/node_modules/bindings/bindings.js delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/node_modules/bindings/package.json delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/nodetime_native.cc delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/package.json delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/src/gc.cc delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/src/gc.h delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/src/nodetime_native.cc delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/src/profiler.cc delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/src/profiler.h delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/src/system.h delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/src/system_posix.cc delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/src/system_win.cc delete mode 100644 node_modules/nodetime/node_modules/nodetime-native/wscript delete mode 100644 node_modules/nodetime/node_modules/request/LICENSE delete mode 100644 node_modules/nodetime/node_modules/request/README.md delete mode 100644 node_modules/nodetime/node_modules/request/aws.js delete mode 100644 node_modules/nodetime/node_modules/request/forever.js delete mode 100644 node_modules/nodetime/node_modules/request/main.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/.npmignore delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/Makefile delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/Readme.md delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/lib/form_data.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node-form-data.sublime-project delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/.gitmodules delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/LICENSE delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/Makefile delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/README.md delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/async.min.js.gzip delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.css delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/dist/async.min.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/index.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/lib/async.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/nodelint.cfg delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/package.json delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/.swp delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/test-async.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/test.html delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/.npmignore delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/License delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/Makefile delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js delete mode 100755 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/common.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file1.txt delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file2.txt delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-callback-streams.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-data-size.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams-and-buffers-and-strings.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-max-data-size.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-unpaused-streams.js delete mode 100755 node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/run.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/package.json delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/test/common.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/test/fixture/bacon.txt delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/test/fixture/unicycle.jpg delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-form-get-length.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-get-boundary.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-http-response.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-pipe.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-submit.js delete mode 100755 node_modules/nodetime/node_modules/request/node_modules/form-data/test/run.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/mime/LICENSE delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/mime/README.md delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/mime/mime.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/mime/package.json delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/mime/test.js delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/mime/types/mime.types delete mode 100644 node_modules/nodetime/node_modules/request/node_modules/mime/types/node.types delete mode 100644 node_modules/nodetime/node_modules/request/oauth.js delete mode 100644 node_modules/nodetime/node_modules/request/package.json delete mode 100644 node_modules/nodetime/node_modules/request/tests/googledoodle.png delete mode 100644 node_modules/nodetime/node_modules/request/tests/run.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/server.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/squid.conf delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.cnf delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.crl delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.crt delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.csr delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.key delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.srl delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/server.cnf delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/server.crt delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/server.csr delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/server.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/ca/server.key delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/npm-ca.crt delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/test.crt delete mode 100644 node_modules/nodetime/node_modules/request/tests/ssl/test.key delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-body.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-cookie.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-cookiejar.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-defaults.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-errors.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-follow-all-303.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-follow-all.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-form.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-headers.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-httpModule.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-https-strict.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-https.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-oauth.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-params.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-piped-redirect.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-pipes.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-pool.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-protocol-changing-redirect.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-proxy.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-qs.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-redirect.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-s3.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-timeout.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-toJSON.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/test-tunnel.js delete mode 100644 node_modules/nodetime/node_modules/request/tests/unicycle.jpg delete mode 100644 node_modules/nodetime/node_modules/request/tunnel.js delete mode 100644 node_modules/nodetime/node_modules/request/uuid.js delete mode 100644 node_modules/nodetime/node_modules/request/vendor/cookie/index.js delete mode 100644 node_modules/nodetime/node_modules/request/vendor/cookie/jar.js delete mode 100644 node_modules/nodetime/package.json delete mode 100755 node_modules/nodetime/publish.sh delete mode 100644 node_modules/timekit/build/config.gypi delete mode 100644 node_modules/timekit/node_modules/bindings/bindings.js delete mode 100644 node_modules/timekit/node_modules/bindings/package.json delete mode 100644 node_modules/timekit/package.json delete mode 100644 node_modules/v8tools/.npmignore delete mode 100644 node_modules/v8tools/LICENSE delete mode 100644 node_modules/v8tools/README.md delete mode 100644 node_modules/v8tools/binding.gyp delete mode 100644 node_modules/v8tools/build/Makefile delete mode 100644 node_modules/v8tools/build/Release/.deps/Release/obj.target/v8tools/src/gc.o.d delete mode 100644 node_modules/v8tools/build/Release/.deps/Release/obj.target/v8tools/src/profiler.o.d delete mode 100644 node_modules/v8tools/build/Release/.deps/Release/obj.target/v8tools/src/v8tools.o.d delete mode 100644 node_modules/v8tools/build/Release/.deps/Release/v8tools.node.d delete mode 100644 node_modules/v8tools/build/Release/linker.lock delete mode 100644 node_modules/v8tools/build/Release/obj.target/v8tools/src/gc.o delete mode 100644 node_modules/v8tools/build/Release/obj.target/v8tools/src/profiler.o delete mode 100644 node_modules/v8tools/build/Release/obj.target/v8tools/src/v8tools.o delete mode 100755 node_modules/v8tools/build/Release/v8tools.node delete mode 100644 node_modules/v8tools/build/binding.Makefile delete mode 100644 node_modules/v8tools/build/config.gypi delete mode 100755 node_modules/v8tools/build/gyp-mac-tool delete mode 100644 node_modules/v8tools/build/v8tools.target.mk delete mode 100644 node_modules/v8tools/index.js delete mode 100644 node_modules/v8tools/node_modules/bindings/README.md delete mode 100644 node_modules/v8tools/node_modules/bindings/bindings.js delete mode 100644 node_modules/v8tools/node_modules/bindings/package.json delete mode 100644 node_modules/v8tools/package.json delete mode 100644 node_modules/v8tools/src/gc.cc delete mode 100644 node_modules/v8tools/src/gc.h delete mode 100644 node_modules/v8tools/src/profiler.cc delete mode 100644 node_modules/v8tools/src/profiler.h delete mode 100644 node_modules/v8tools/src/v8tools.cc delete mode 100644 node_modules/v8tools/v8tools.cc delete mode 100644 node_modules/v8tools/wscript diff --git a/.gitignore b/.gitignore index 01ae8f7..a334d8c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,7 @@ .DS_Store # node noise -# node_modules +node_modules # live config config.js diff --git a/backups/live-annotations-2-22.json b/backups/live-annotations-2-22.json deleted file mode 100644 index 8aa6031..0000000 --- a/backups/live-annotations-2-22.json +++ /dev/null @@ -1,3706 +0,0 @@ -{ "_id" : { "$oid" : "504d5d6a87aad10200000002" }, "id" : "504d5d6a87aad10200000002", "user" : "agursoy@mit.edu", "text" : "I have no idea what is going on here because I don't speak Russian", "uri" : "http://annotationstudio.mit.edu/documents/russian-text", "quote" : "- Старается,- ответил Сувор коротко.      Богатырь внимательно изучал мальчишку:", "uuid" : "5C169530", "permissions" : { "delete" : [ "agursoy@mit.edu" ], "update" : [ "agursoy@mit.edu" ], "admin" : [ "agursoy@mit.edu" ], "read" : [ "agursoy@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 3980, "end" : "/div[1]/p[6]", "endOffset" : 4060, "_id" : { "$oid" : "504d5d6a87aad10200000003" } } ], "groups" : [ "Testing", "21L.000", "21L.003" ], "updated" : "1347247466126", "created" : "1347247466126", "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "504d5d7381c9cd0200000004" }, "id" : "504d5d7381c9cd0200000004", "user" : "agursoy@mit.edu", "text" : "Some more annotations for testing", "uri" : "http://annotationstudio.mit.edu/documents/russian-text", "quote" : "На заднем дворе в каморке доживал век странный старик по имени Горюн. Он был в молодости воином, так говорили, спас при таинственных обстоятельствах жизнь самому князю Олегу, потом долго был волхвом, но ушел и оттуда, занялся складыванием кощюн. Его слушали охотно, он знал великое множество историй, как героических, волшебных, бытовых, так и про зверей, рыб и птиц.", "uuid" : "CC25E98E", "permissions" : { "delete" : [ "agursoy@mit.edu" ], "update" : [ "agursoy@mit.edu" ], "admin" : [ "agursoy@mit.edu" ], "read" : [ "agursoy@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[7]", "startOffset" : 5, "end" : "/div[1]/p[7]", "endOffset" : 373, "_id" : { "$oid" : "504d5d7381c9cd0200000005" } } ], "groups" : [ "Testing", "21L.000", "21L.003" ], "updated" : "1347247475096", "created" : "1347247475096", "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "504d5d8081c9cd0200000006" }, "id" : "504d5d8081c9cd0200000006", "user" : "agursoy@mit.edu", "text" : "Annotation here.", "uri" : "http://annotationstudio.mit.edu/documents/russian-text", "quote" : "лава 3", "uuid" : "5071AF97", "permissions" : { "delete" : [ "agursoy@mit.edu" ], "update" : [ "agursoy@mit.edu" ], "admin" : [ "agursoy@mit.edu" ], "read" : [ "agursoy@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/b[3]", "startOffset" : 1, "end" : "/div[1]/b[3]", "endOffset" : 7, "_id" : { "$oid" : "504d5d8081c9cd0200000007" } } ], "groups" : [ "Testing", "21L.000", "21L.003" ], "updated" : "1347247488222", "created" : "1347247488222", "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "504d5d8e81c9cd0200000008" }, "id" : "504d5d8e81c9cd0200000008", "user" : "agursoy@mit.edu", "text" : "Is this going in reverse order?", "uri" : "http://annotationstudio.mit.edu/documents/russian-text", "quote" : "В крохотную каморку челядной шагнул высокий молодой воин. Лицо его было смуглое, хищное, голова чисто выбрита", "uuid" : "445BE3B1", "permissions" : { "delete" : [ "agursoy@mit.edu" ], "update" : [ "agursoy@mit.edu" ], "admin" : [ "agursoy@mit.edu" ], "read" : [ "agursoy@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 6, "end" : "/div[1]/p[2]", "endOffset" : 115, "_id" : { "$oid" : "504d5d8e81c9cd0200000009" } } ], "groups" : [ "Testing", "21L.000", "21L.003" ], "updated" : "1347247502622", "created" : "1347247502622", "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504d5fa681c9cd020000000a", "user" : "fendt@mit.edu", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/russian-text", "quote" : "Чего такой красный? Урод какой-то.", "uuid" : "8C92B2AD", "_id" : { "$oid" : "504d5fa681c9cd020000000a" }, "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 1344, "end" : "/div[1]/p[2]", "endOffset" : 1378, "_id" : { "$oid" : "504d5fa681c9cd020000000b" } } ], "groups" : [ "Testing", "21F.414", "Fall 2012" ], "updated" : "1347248038930", "created" : "1347248038930", "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "504e399c87aad1020000001d" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : "1347303836609", "groups" : [ "21L.003" ], "id" : "504e399c87aad1020000001d", "permissions" : { "admin" : [ "rahmanr@mit.edu" ], "delete" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ] }, "quote" : "The company began to disperse when the dancing was over—enough to leave\n\nspace for the remainder to walk about in some comfort; and now was the\n\ntime for a heroine, who had not yet played a very distinguished part\n\nin the events of the evening, to be noticed and admired. Every five\n\nminutes, by removing some of the crowd, gave greater openings for her\n\ncharms. She was now seen by many young men who had not been near her\n\nbefore. Not one, however, started with rapturous wonder on beholding\n\nher, no whisper of eager inquiry ran round the room, nor was she once\n\ncalled a divinity by anybody. Yet Catherine was in very good looks, and\n\nhad the company only seen her three years before, they would now have\n\nthought her exceedingly handsome.", "ranges" : [ { "start" : "/div[1]/p[40]", "startOffset" : 2, "end" : "/div[1]/p[41]", "endOffset" : 0, "_id" : { "$oid" : "504e9a1c220c8e020000000a" } } ], "tags" : [], "text" : "Austen highlights the differences between the heroine-like quality of Catherine (here) and the hero-like attributes of Mr. Tilney (in later passages).", "updated" : { "$date" : 1347328551175 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "uuid" : "B329366D" } -{ "__v" : 1, "_id" : { "$oid" : "504e3a3281c9cd020000001f" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : "1347303986269", "groups" : [ "21L.003" ], "id" : "504e3a3281c9cd020000001f", "permissions" : { "admin" : [ "rahmanr@mit.edu" ], "delete" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ] }, "quote" : "\"Have you ever read\n\nUdolpho, Mr. Thorpe?\"", "ranges" : [ { "start" : "/div[1]/p[180]", "startOffset" : 696, "end" : "/div[1]/p[180]", "endOffset" : 739, "_id" : { "$oid" : "504e9a41220c8e020000000c" } } ], "tags" : [], "text" : "Mr. Thorpe very blatantly shares his lowly view of novels; this is very different from Mr. Tilney towards the end of volume 1.", "updated" : { "$date" : 1347328577512 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "uuid" : "49DFDBC2" } -{ "__v" : 1, "_id" : { "$oid" : "504e3a8081c9cd0200000021" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : "1347304064441", "groups" : [ "21L.003" ], "id" : "504e3a8081c9cd0200000021", "permissions" : { "admin" : [ "rahmanr@mit.edu" ], "delete" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ] }, "quote" : "Let us\n\nnot desert one another", "ranges" : [ { "start" : "/div[1]/p[104]", "startOffset" : 1434, "end" : "/div[1]/p[104]", "endOffset" : 1464, "_id" : { "$oid" : "504e9a52220c8e020000000e" } } ], "tags" : [], "text" : "Answer to \"Why read fiction?\"", "updated" : { "$date" : 1347328594944 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "uuid" : "EA6FB657" } -{ "__v" : 1, "_id" : { "$oid" : "504e3aaf87aad1020000001f" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : "1347304111636", "groups" : [ "21L.003" ], "id" : "504e3aaf87aad1020000001f", "permissions" : { "admin" : [ "rahmanr@mit.edu" ], "delete" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ] }, "quote" : "instead of answering, as she probably would have done,\n\nhad there been no friendship and no flattery in the case, \"I do not like\n\nhim at all,\" she directly replied, \"I like him very much; he seems very\n\nagreeable.\"", "ranges" : [ { "start" : "/div[1]/p[192]", "startOffset" : 864, "end" : "/div[1]/p[192]", "endOffset" : 1078, "_id" : { "$oid" : "504e9a4b220c8e020000000d" } } ], "tags" : [], "text" : "Catherine speaks the opposite of her true opinion. ", "updated" : { "$date" : 1347328587843 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "uuid" : "25F581AF" } -{ "__v" : 1, "_id" : { "$oid" : "504e3af181c9cd0200000023" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : "1347304177190", "groups" : [ "21L.003" ], "id" : "504e3af181c9cd0200000023", "permissions" : { "admin" : [ "rahmanr@mit.edu" ], "delete" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ] }, "quote" : "To be disgraced in the eye of the world, to wear the appearance of\n\ninfamy while her heart is all purity, her actions all innocence, and the\n\nmisconduct of another the true source of her debasement, is one of those\n\ncircumstances which peculiarly belong to the heroine's life, and her\n\nfortitude under it what particularly dignifies her character. Catherine\n\nhad fortitude too; she suffered, but no murmur passed her lips", "ranges" : [ { "start" : "/div[1]/p[204]", "startOffset" : 1633, "end" : "/div[1]/p[204]", "endOffset" : 2054, "_id" : { "$oid" : "504e9a58220c8e020000000f" } } ], "tags" : [], "text" : "Catherine makes a huge deal out of not being able to dance. She has very different expectations now compared to her first ball. ", "updated" : { "$date" : 1347328600379 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "uuid" : "2B2BEEE1" } -{ "__v" : 1, "_id" : { "$oid" : "504e3bb387aad10200000021" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : "1347304371989", "groups" : [ "21L.003" ], "id" : "504e3bb387aad10200000021", "permissions" : { "admin" : [ "rahmanr@mit.edu" ], "delete" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ] }, "quote" : "Am I never to be acquainted with him? How do you like my\n\ngown?", "ranges" : [ { "start" : "/div[1]/p[294]", "startOffset" : 15, "end" : "/div[1]/p[294]", "endOffset" : 78, "_id" : { "$oid" : "504e9a2d9d9ada0200000008" } } ], "tags" : [], "text" : "The manner in which Isabella changes the topic of conversation highlights her superficiality. ", "updated" : { "$date" : 1347328557263 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "uuid" : "F8946CF2" } -{ "__v" : 1, "_id" : { "$oid" : "504e3bd387aad10200000023" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : "1347304403251", "groups" : [ "21L.003" ], "id" : "504e3bd387aad10200000023", "permissions" : { "admin" : [ "rahmanr@mit.edu" ], "delete" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ] }, "quote" : "\"She had no doubt in the world of its being a very fine day, if the\n\nclouds would only go off, and the sun keep out.\"", "ranges" : [ { "start" : "/div[1]/p[355]", "startOffset" : 559, "end" : "/div[1]/p[355]", "endOffset" : 676, "_id" : { "$oid" : "504e9a35220c8e020000000b" } } ], "tags" : [], "text" : "The general manner of speaking is to use absolutes, even when they are completely unwarranted. Everyone is always trying to show that they know what they're talking about. In addition, everyone is always trying to please other people. ", "updated" : { "$date" : 1347328565602 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "uuid" : "B90E7B78" } -{ "_id" : { "$oid" : "504e690dabd5790200000002" }, "id" : "504e690dabd5790200000002", "user" : "jfische2@mit.edu", "text" : "text", "uri" : "http://annotationstudio.mit.edu/documents/moby-dick-chapters-1-5", "quote" : "Call me Ishmael.", "uuid" : "24F4E2A1", "permissions" : { "delete" : [ "jfische2@mit.edu" ], "update" : [ "jfische2@mit.edu" ], "admin" : [ "jfische2@mit.edu" ], "read" : [ "jfische2@mit.edu" ] }, "tags" : [ "tag" ], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 23, "end" : "/div[1]/div[3]", "endOffset" : 39, "_id" : { "$oid" : "504e690dabd5790200000003" } } ], "groups" : [ "CMS", "21L.448J", "21L.003", "21F.414" ], "updated" : "1347315981947", "created" : "1347315981947", "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "504e6a41abd5790200000008" }, "id" : "504e6a41abd5790200000008", "user" : "jfische2@mit.edu", "text" : "![alt text](http://blogs.archives.gov/prologue/wp-content/uploads/acushnet-crew-list-874x1024.jpg)", "uri" : "http://annotationstudio.mit.edu/documents/moby-dick-chapters-1-5", "quote" : "riving off the spleen", "uuid" : "6FDF3EA3", "permissions" : { "delete" : [ "jfische2@mit.edu" ], "update" : [ "jfische2@mit.edu" ], "admin" : [ "jfische2@mit.edu" ], "read" : [ "jfische2@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 271, "end" : "/div[1]/div[3]", "endOffset" : 292, "_id" : { "$oid" : "504e6a41abd5790200000009" } } ], "groups" : [ "CMS", "21L.448J", "21L.003", "21F.414" ], "updated" : "1347316289817", "created" : "1347316289817", "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "504e6c45abd579020000000a" }, "id" : "504e6c45abd579020000000a", "user" : "jfische2@mit.edu", "text" : "Best first line ever", "uri" : "http://annotationstudio.mit.edu/documents/moby-dick-chapters-1-5", "quote" : "Call me Ishmael.", "uuid" : "8D2C47A8", "permissions" : { "delete" : [ "jfische2@mit.edu" ], "update" : [ "jfische2@mit.edu" ], "admin" : [ "jfische2@mit.edu" ], "read" : [ "jfische2@mit.edu" ] }, "tags" : [ "Ishmael" ], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 23, "end" : "/div[1]/div[3]", "endOffset" : 39, "_id" : { "$oid" : "504e6c45abd579020000000b" } } ], "groups" : [ "Testing" ], "updated" : "1347316805069", "created" : "1347316805069", "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504e709fbc9c5d0200000008", "user" : "vvachh@mit.edu", "text" : "Alice gets a sense of the scale of things. Compare falling down stairs to falling off of a house--compare making a daisy chain (above) to making the universe.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "'after such a fall as this, I shall think nothing of\ntumbling down stairs! How brave they'll all think me at home! Why, I wouldn't say anything\nabout it, even if I fell off the top of the house!'", "uuid" : "E93FBBB8", "_id" : { "$oid" : "504e709fbc9c5d0200000008" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [ "scale" ], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 2475, "end" : "/div[1]/div[3]", "endOffset" : 2671, "_id" : { "$oid" : "504e709fbc9c5d0200000009" } } ], "groups" : [ "21L.448J" ], "updated" : "1347317919195", "created" : "1347317919195", "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504e70b6bc9c5d020000000a", "user" : "vvachh@mit.edu", "text" : "More scale.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "Down, down, down. Would the fall NEVER come to an end! 'I wonder how many miles I've\nfallen by this time?' she said aloud. 'I must be getting somewhere near the centre of the\nearth. Let me see: that would be four thousand miles down, I think--'", "uuid" : "5380B11D", "_id" : { "$oid" : "504e70b6bc9c5d020000000a" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 2704, "end" : "/div[1]/div[3]", "endOffset" : 2949, "_id" : { "$oid" : "504e70b6bc9c5d020000000b" } } ], "groups" : [ "21L.448J" ], "updated" : "1347317942451", "created" : "1347317942451", "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "504e71b1bc9c5d020000000e" }, "consumer" : "annotationstudio.mit.edu", "created" : "1347318193304", "groups" : [ "21L.448J" ], "id" : "504e71b1bc9c5d020000000e", "permissions" : { "admin" : [ "vvachh@mit.edu" ], "delete" : [ "vvachh@mit.edu" ], "read" : [], "update" : [ "vvachh@mit.edu" ] }, "quote" : "'Do cats eat bats?\nDo cats eat bats?' and sometimes, 'Do bats eat cats?' for, you see, as she couldn't answer\neither question, it didn't much matter which way she put it.", "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 4603, "end" : "/div[1]/div[3]", "endOffset" : 4773, "_id" : { "$oid" : "504e71b1bc9c5d020000000f" } } ], "tags" : [], "text" : "Does a god create humans? Do humans create the idea of a god? Does it much matter which way you put it?", "updated" : "1347318240609", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "user" : "vvachh@mit.edu", "uuid" : "FAC98D22" } -{ "_id" : { "$oid" : "504e729bbc9c5d0200000010" }, "id" : "504e729bbc9c5d0200000010", "user" : "jfische2@mit.edu", "text" : "Whaling ship crew experiences ![](http://www.neh.gov/files/humanities/articles/whaling_crewmen_pic_ma2010.jpg)", "uri" : "http://annotationstudio.mit.edu/documents/moby-dick-chapters-1-5", "quote" : "I thought I would sail about a little and see the watery part of the world.", "uuid" : "7ABFF2BC", "permissions" : { "delete" : [ "jfische2@mit.edu" ], "update" : [ "jfische2@mit.edu" ], "admin" : [ "jfische2@mit.edu" ], "read" : [ "jfische2@mit.edu" ] }, "tags" : [ "photographs" ], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 172, "end" : "/div[1]/div[3]", "endOffset" : 247, "_id" : { "$oid" : "504e729bbc9c5d0200000011" } } ], "groups" : [ "Testing" ], "updated" : "1347318427140", "created" : "1347318427140", "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504e72fbbc9c5d0200000012", "user" : "vvachh@mit.edu", "text" : "Alice wishes for something, and it appears--logocentric creation. Suggests that Alice is the creator of the physical system she seeks to understand.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "she went back to the table,\nhalf hoping she might find another key on it, or at any rate a book of rules for shutting\npeople up like telescopes: this time she found a little bottle on it, ('which certainly\nwas not here before,' said Alice,) and round the neck of the bottle was a paper label,\nwith the words 'DRINK ME' beautifully printed on it in large letters.", "uuid" : "E44343A5", "_id" : { "$oid" : "504e72fbbc9c5d0200000012" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 7233, "end" : "/div[1]/div[3]", "endOffset" : 7596, "_id" : { "$oid" : "504e72fbbc9c5d0200000013" } } ], "groups" : [ "21L.448J" ], "updated" : "1347318523841", "created" : "1347318523841", "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504e7556bc9c5d0200000014", "user" : "vvachh@mit.edu", "text" : "Alice has an innate tendency to ask lofty questions. Alice is a typical human.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "And she tried to fancy what the flame of a candle is like after the candle is blown out,\nfor she could not remember ever having seen such a thing.", "uuid" : "2F32CA31", "_id" : { "$oid" : "504e7556bc9c5d0200000014" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 9186, "end" : "/div[1]/div[3]", "endOffset" : 9333, "_id" : { "$oid" : "504e7556bc9c5d0200000015" } } ], "groups" : [ "21L.448J" ], "updated" : "1347319126184", "created" : "1347319126184", "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504e75a3bc9c5d0200000016", "user" : "vvachh@mit.edu", "text" : "that is, creator and creation. She creates logocentrically but she still does not understand what she has created.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "for this curious child was\nvery fond of pretending to be two people.", "uuid" : "8AD8A5F0", "_id" : { "$oid" : "504e75a3bc9c5d0200000016" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 10270, "end" : "/div[1]/div[3]", "endOffset" : 10339, "_id" : { "$oid" : "504e75a3bc9c5d0200000017" } } ], "groups" : [ "21L.448J" ], "updated" : "1347319203168", "created" : "1347319203168", "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504e7663bc9c5d0200000018", "user" : "vvachh@mit.edu", "text" : "Alice is now an exceptional creation. She doesn't want to be the same as the rest of the world. Echoes human exceptionalism in interpretation of the world.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "Alice had got so much into the way of expecting nothing but out-of-the-way\nthings to happen, that it seemed quite dull and stupid for life to go on in the common\nway.", "uuid" : "68CDDDA8", "_id" : { "$oid" : "504e7663bc9c5d0200000018" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 11176, "end" : "/div[1]/div[3]", "endOffset" : 11343, "_id" : { "$oid" : "504e7663bc9c5d0200000019" } } ], "groups" : [ "21L.448J" ], "updated" : "1347319395619", "created" : "1347319395619", "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504e7738abd579020000001d", "user" : "vvachh@mit.edu", "text" : "The great puzzle, indeed.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "But if I'm not the same, the next question is, Who in the world am I?\n\t\t\tAh, THAT'S the great puzzle!", "uuid" : "70947A73", "_id" : { "$oid" : "504e7738abd579020000001d" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]/p[1]", "startOffset" : 3011, "end" : "/div[1]/div[4]/p[1]", "endOffset" : 3112, "_id" : { "$oid" : "504e7738abd579020000001e" } } ], "groups" : [ "21L.448J" ], "updated" : "1347319608338", "created" : "1347319608338", "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504e7985bc9c5d020000001c", "user" : "vvachh@mit.edu", "text" : "Alice asks for and is denied proof of authority. Questions the wisdom of the elders.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`I am older than\n\t\t\tyou, and must know better'; and this Alice would not allow without knowing how old it was,\n\t\t\tand, as the Lory positively refused to tell its age, there was no more to be said.", "uuid" : "31C14E67", "_id" : { "$oid" : "504e7985bc9c5d020000001c" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[1]", "startOffset" : 556, "end" : "/div[1]/div[5]/p[1]", "endOffset" : 753, "_id" : { "$oid" : "504e7985bc9c5d020000001d" } } ], "groups" : [ "21L.448J" ], "updated" : "1347320197040", "created" : "1347320197040", "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504e79f2bc9c5d020000001e", "user" : "vvachh@mit.edu", "text" : "Confusing diction. Mouse obscures clear explanation with words.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`Found IT,' the Mouse replied rather crossly: `of course you know what \"it\"\n\t\t\tmeans.'", "uuid" : "C1DFCE2C", "_id" : { "$oid" : "504e79f2bc9c5d020000001e" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[1]", "startOffset" : 1958, "end" : "/div[1]/div[5]/p[1]", "endOffset" : 2045, "_id" : { "$oid" : "504e79f2bc9c5d020000001f" } } ], "groups" : [ "21L.448J" ], "updated" : "1347320306062", "created" : "1347320306062", "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504e7a4eabd579020000001f", "user" : "vvachh@mit.edu", "text" : "When did the race start? Who started it? Why are we running in a race? Big questions.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "First it marked out a race-course, in a sort of circle, (`the exact shape doesn't matter,'\n\t\t\tit said,) and then all the party were placed along the course, here and there. There was\n\t\t\tno `One, two, three, and away,' but they began running when they liked, and left off when\n\t\t\tthey liked, so that it was not easy to know when the race was over. However, when they had\n\t\t\tbeen running half an hour or so, and were quite dry again, the Dodo suddenly called out\n\t\t\t`The race is over!' and they all crowded round it, panting, and asking, `But who has won?'", "uuid" : "21813B84", "_id" : { "$oid" : "504e7a4eabd579020000001f" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[1]", "startOffset" : 3577, "end" : "/div[1]/div[5]/p[1]", "endOffset" : 4131, "_id" : { "$oid" : "504e7a4eabd5790200000020" } } ], "groups" : [ "21L.448J" ], "updated" : "1347320398078", "created" : "1347320398078", "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "504e7b01bc9c5d0200000020" }, "consumer" : "annotationstudio.mit.edu", "created" : "1347320577730", "groups" : [ "21L.448J" ], "id" : "504e7b01bc9c5d0200000020", "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "quote" : "`Fury said to a\n\t\t\t                       \n\t\t\tmouse, That he\n\t\t\t                   \n\t\t\tmet in the\n\t\t\t               \n\t\t\thouse,\n\t\t\t            \"Let us\n\t\t\t               \n\t\t\tboth go to\n\t\t\t                   \n\t\t\tlaw: I will\n\t\t\t                       \n\t\t\tprosecute\n\t\t\t                           \n\t\t\tYOU. --Come,\n\t\t\t                               \n\t\t\tI'll take no\n\t\t\t                                   \n\t\t\tdenial; We\n\t\t\t                               \n\t\t\tmust have a\n\t\t\t                           \n\t\t\ttrial: For\n\t\t\t                       \n\t\t\treally this\n\t\t\t                   \n\t\t\tmorning I've\n\t\t\t               \n\t\t\tnothing\n\t\t\t            to do.\"\n\t\t\t               \n\t\t\tSaid the\n\t\t\t                   \n\t\t\tmouse to the\n\t\t\t                       \n\t\t\tcur, \"Such\n\t\t\t                           \n\t\t\ta trial,\n\t\t\t                               \n\t\t\tdear Sir,\n\t\t\t                                   \n\t\t\tWith\n\t\t\t                               \n\t\t\tno jury\n\t\t\t                           \n\t\t\tor judge,\n\t\t\t                       \n\t\t\twould be\n\t\t\t                   \n\t\t\twasting\n\t\t\t               \n\t\t\tour\n\t\t\t                   \n\t\t\tbreath.\"\n\t\t\t                       \n\t\t\t\"I'll be\n\t\t\t                           \n\t\t\tjudge, I'll\n\t\t\t                               \n\t\t\tbe jury,\"\n\t\t\t                                   \n\t\t\tSaid\n\t\t\t                           \n\t\t\tcunning\n\t\t\t                               \n\t\t\told Fury:\n\t\t\t                               \n\t\t\t\"I'll\n\t\t\t                               \n\t\t\ttry the\n\t\t\t                                   \n\t\t\twhole\n\t\t\t                                       \n\t\t\tcause,\n\t\t\t                                           \n\t\t\tand\n\t\t\t                                   \n\t\t\tcondemn\n\t\t\t                               \n\t\t\tyou\n\t\t\t                           \n\t\t\tto\n\t\t\t                               \n\t\t\tdeath.\"'", "ranges" : [ { "start" : "/div[1]/div[5]/p[1]", "startOffset" : 6605, "end" : "/div[1]/div[5]/p[1]", "endOffset" : 8409, "_id" : { "$oid" : "504e7b01bc9c5d0200000021" } } ], "tags" : [], "text" : "A deity finds a useless fault in a mouse, and this results in the condemnation of mousekind. Is the deity legitimate? Does it hold real power?", "updated" : "1347320666334", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "user" : "vvachh@mit.edu", "uuid" : "7EE1E4A5" } -{ "id" : "504e7d02abd5790200000021", "user" : "vvachh@mit.edu", "text" : "Alice's perspective of the world is challenged. Is Dinah actually the best cat in the world?", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`Nobody seems\n\t\t\tto like her, down here, and I'm sure she's the best cat in the world!", "uuid" : "FC77E9CC", "_id" : { "$oid" : "504e7d02abd5790200000021" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[1]", "startOffset" : 10655, "end" : "/div[1]/div[5]/p[1]", "endOffset" : 10741, "_id" : { "$oid" : "504e7d02abd5790200000022" } } ], "groups" : [ "21L.448J" ], "updated" : "1347321090240", "created" : "1347321090240", "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504e82e8bc9c5d020000002e", "user" : "vvachh@mit.edu", "text" : "Alice follows orders blindly.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "And Alice was so much frightened that she ran\n\t\t\toff at once in the direction it pointed to, without trying to explain the mistake it had\n\t\t\tmade.", "uuid" : "5B27EE0B", "_id" : { "$oid" : "504e82e8bc9c5d020000002e" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]/p[1]", "startOffset" : 920, "end" : "/div[1]/div[6]/p[1]", "endOffset" : 1066, "_id" : { "$oid" : "504e82e8bc9c5d020000002f" } } ], "groups" : [ "21L.448J" ], "updated" : "1347322600453", "created" : "1347322600453", "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504e83cfabd5790200000028", "user" : "vvachh@mit.edu", "text" : "Loss of better judgement. The creation has fallen from grace.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`I\n\t\t\tknow SOMETHING interesting is sure to happen,' she said to herself, `whenever I eat or\n\t\t\tdrink anything; so I'll just see what this bottle does. I do hope it'll make me grow large\n\t\t\tagain, for really I'm quite tired of being such a tiny little thing!'", "uuid" : "057CB5A9", "_id" : { "$oid" : "504e83cfabd5790200000028" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]/p[1]", "startOffset" : 2548, "end" : "/div[1]/div[6]/p[1]", "endOffset" : 2809, "_id" : { "$oid" : "504e83cfabd5790200000029" } } ], "groups" : [ "21L.448J" ], "updated" : "1347322831560", "created" : "1347322831560", "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504e8402bc9c5d0200000030", "user" : "vvachh@mit.edu", "text" : "Challenges earlier beliefs about what fairy tales are like.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "When I used to read fairy-tales, I fancied\n\t\t\tthat kind of thing never happened, and now here I am in the middle of one!", "uuid" : "FAFFF9D3", "_id" : { "$oid" : "504e8402bc9c5d0200000030" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]/p[1]", "startOffset" : 4304, "end" : "/div[1]/div[6]/p[1]", "endOffset" : 4424, "_id" : { "$oid" : "504e8402bc9c5d0200000031" } } ], "groups" : [ "21L.448J" ], "updated" : "1347322882779", "created" : "1347322882779", "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504e8adcbc9c5d0200000032", "user" : "mvwagner@mit.edu", "text" : "Here is an example of both rational and irrational thinking. The notion that Time is a person who controls the hours and dates illustrates irrational thinking, perhaps lending more to nonsense. However, out of the situation that the Hare and the Hatter find themselves in with Time, they rationally set out all of their china at the table. There is no opportunity to wash the utensils since it is always tea time, so they must always have cups available so as to drink tea! There is a definite rational thought process here. ", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "It's always six o'clock now.' \n\t\t\t\n\t\t\tA bright idea came into Alice's head. `Is that the reason so many tea-things are put out\n\t\t\there?' she asked. \n\t\t\t\n\t\t\t`Yes, that's it,' said the Hatter with a sigh: `it's always tea-time, and we've no time to\n\t\t\twash the things between whiles.' \n\t\t\t\n\t\t\t`Then you keep moving round, I suppose?' said Alice. \n\t\t\t\n\t\t\t`Exactly so,' said the Hatter: `as the things get used up.' \n\t\t\t\n\t\t\t`But what happens when you come to the beginning again?' Alice ventured to ask.", "uuid" : "6470B2D5", "_id" : { "$oid" : "504e8adcbc9c5d0200000032" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]/p[1]", "startOffset" : 7165, "end" : "/div[1]/div[8]/p[1]", "endOffset" : 7669, "_id" : { "$oid" : "504e8adcbc9c5d0200000033" } } ], "groups" : [ "21L.448J" ], "updated" : "1347324636181", "created" : "1347324636181", "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504e93cd220c8e0200000002", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Alice indicates her awareness of the consistencies of the natural world and how her recent experiences have not been according to these consistencies. She questions the strange experiences, but accepts them very easily. She begins to adopt the idea that there are few natural rules in the new world and begins to come up with solutions to her problems that could never occur in the real world.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`Dear, dear! How queer everything is to-day! And\n\t\t\tyesterday things went on just as usual. I wonder if I've been changed in the night? Let me\n\t\t\tthink: was I the same when I got up this morning? I almost think I can remember feeling a\n\t\t\tlittle different. But if I'm not the same, the next question is, Who in the world am I?\n\t\t\tAh, THAT'S the great puzzle!' And she began thinking over all the children she knew that\n\t\t\twere of the same age as herself, to see if she could have been changed for any of them.", "uuid" : "C3FAB268", "_id" : { "$oid" : "504e93cd220c8e0200000002" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]/p[1]", "startOffset" : 2754, "end" : "/div[1]/div[4]/p[1]", "endOffset" : 3264, "_id" : { "$oid" : "504e93cd220c8e0200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347326925543 }, "created" : { "$date" : 1347326925543 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "504e9cfc9d9ada0200000009" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347329276488 }, "groups" : [ "21L.448J" ], "id" : "504e9cfc9d9ada0200000009", "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [] }, "quote" : "There ought to\n\t\t\tbe a book written about me, that there ought! And when I grow up, I'll write one--but I'm\n\t\t\tgrown up now,' she added in a sorrowful tone; `at least there's no room to grow up any\n\t\t\tmore HERE.'", "ranges" : [ { "start" : "/div[1]/div[6]/p[1]", "startOffset" : 4425, "end" : "/div[1]/div[6]/p[1]", "endOffset" : 4638, "_id" : { "$oid" : "504e9cfc9d9ada020000000a" } } ], "tags" : [], "text" : "This is an ironic statement that has some similarities to Doctor Seuss' style. Alice wishes for a book to be written about her within a book written about her. This also shows her separation from reality. She notes that she is in a fairy tale, and fairy tales are known to be wonderful, mystical worlds, but Alice makes it clear that she would rather be in the real world.", "updated" : { "$date" : 1347329377171 }, "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "user" : "holjose@mit.edu", "username" : "Holly J.", "uuid" : "686EB36D" } -{ "id" : "504e9f82220c8e0200000012", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "This relates to one of Aristotle's \"causes.\" Alice has an idea/reason which would be classified as one of the fourth causes, but Alice can't figure out the other three causes because the world she is in is more similar to the Genesis world.In the Genesis world, God created by speech. In Alice's world it seems that something is allowing the creation by Alice's thoughts. If Alice needs something, there is usually some cryptic way to achieve it that is spontaneously placed in a convenient location for her.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`The first thing I've got to do,' said Alice to herself, as she wandered about in the\n\t\t\twood, `is to grow to my right size again; and the second thing is to find my way into that\n\t\t\tlovely garden. I think that will be the best plan.' \n\t\t\t\n\t\t\tIt sounded an excellent plan, no doubt, and very neatly and simply arranged; the only\n\t\t\tdifficulty was, that she had not the smallest idea how to set about it;", "uuid" : "82ED1A57", "_id" : { "$oid" : "504e9f82220c8e0200000012" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]/p[1]", "startOffset" : 11194, "end" : "/div[1]/div[6]/p[1]", "endOffset" : 11597, "_id" : { "$oid" : "504e9f82220c8e0200000013" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347330000063 }, "created" : { "$date" : 1347329922751 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504ea6609d9ada020000000b", "user" : "mvwagner@mit.edu", "text" : "For me, this passage encompasses all of the nonsense of Wonderland. So soon into her journey, Alice realizes that things do not happen in a \"normal\" way and that she should expect the unfamiliar. It even causes her to speak differently as she futilely attempts to rationalize her surroundings.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "she remained the same size: to be sure, this generally happens when one eats\ncake, but Alice had got so much into the way of expecting nothing but out-of-the-way\nthings to happen,", "uuid" : "98F76E6A", "_id" : { "$oid" : "504ea6609d9ada020000000b" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 11089, "end" : "/div[1]/div[3]", "endOffset" : 11268, "_id" : { "$oid" : "504ea6609d9ada020000000c" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347331680755 }, "created" : { "$date" : 1347331680755 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504ea75d220c8e0200000016", "user" : "mvwagner@mit.edu", "text" : "An example of nonsense. There is only a vague sense of gravity in the \"natural\" laws of Wonderland. She falls but with no urgency. This leads her to consider her knowledge of the earth; she understands that her descent will end but is now unsure if it will be in her world. ", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "Would the fall NEVER come to an end!", "uuid" : "02C317DF", "_id" : { "$oid" : "504ea75d220c8e0200000016" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 2721, "end" : "/div[1]/div[3]", "endOffset" : 2758, "_id" : { "$oid" : "504ea75d220c8e0200000017" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347331933457 }, "created" : { "$date" : 1347331933457 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "504ea7a4220c8e0200000018" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347332004462 }, "groups" : [ "21L.448J" ], "id" : "504ea7a4220c8e0200000018", "permissions" : { "admin" : [ "mvwagner@mit.edu" ], "delete" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ] }, "quote" : "loveliest garden", "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 6603, "end" : "/div[1]/div[3]", "endOffset" : 6620, "_id" : { "$oid" : "504ea7a4220c8e0200000019" } } ], "tags" : [], "text" : "garden of eden? loose tie to genesis? eager to enter into the garden, some forbidden place. ", "updated" : { "$date" : 1347332096125 }, "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "user" : "mvwagner@mit.edu", "uuid" : "7E076147" } -{ "id" : "504ea7f5220c8e020000001a", "user" : "mvwagner@mit.edu", "text" : "dominion over the animals?", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`But who is to give the prizes?' quite a chorus of voices asked. \n\t\t\t\n\t\t\t`Why, SHE, of course,", "uuid" : "32221F42", "_id" : { "$oid" : "504ea7f5220c8e020000001a" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[1]", "startOffset" : 4483, "end" : "/div[1]/div[5]/p[1]", "endOffset" : 4577, "_id" : { "$oid" : "504ea7f5220c8e020000001b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347332085916 }, "created" : { "$date" : 1347332085916 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504ea825220c8e020000001c", "user" : "mvwagner@mit.edu", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "offended", "uuid" : "1386E8FF", "_id" : { "$oid" : "504ea825220c8e020000001c" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [ "rudeness" ], "ranges" : [ { "start" : "/div[1]/div[5]/p[1]", "startOffset" : 3096, "end" : "/div[1]/div[5]/p[1]", "endOffset" : 3104, "_id" : { "$oid" : "504ea825220c8e020000001d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347332133869 }, "created" : { "$date" : 1347332133869 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504ea8559d9ada020000000d", "user" : "mvwagner@mit.edu", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "Why, she'll eat a little bird as soon as look at it!'", "uuid" : "DE5D6484", "_id" : { "$oid" : "504ea8559d9ada020000000d" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [ "rudeness" ], "ranges" : [ { "start" : "/div[1]/div[5]/p[1]", "startOffset" : 10064, "end" : "/div[1]/div[5]/p[1]", "endOffset" : 10118, "_id" : { "$oid" : "504ea8559d9ada020000000e" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347332181138 }, "created" : { "$date" : 1347332181138 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504ea8c39d9ada020000000f", "user" : "mvwagner@mit.edu", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "You should learn not to make personal remarks,' Alice said with some severity; `it's very\n\t\t\trude", "uuid" : "88632A28", "_id" : { "$oid" : "504ea8c39d9ada020000000f" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [ "rudeness" ], "ranges" : [ { "start" : "/div[1]/div[8]/p[1]", "startOffset" : 1341, "end" : "/div[1]/div[8]/p[1]", "endOffset" : 1438, "_id" : { "$oid" : "504ea8c39d9ada0200000010" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347332291920 }, "created" : { "$date" : 1347332291920 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504ebbc2220c8e020000001e", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Interesting use of punctuation/whatever you want to call it to convey sensation. Also done through capitalization of words throughout the text for emphasis", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "*    *    *    *    *    *    *\n   *    *    *    *    *    *\n*    *    *    *    *    *    *", "uuid" : "209D6094", "_id" : { "$oid" : "504ebbc2220c8e020000001e" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 8556, "end" : "/div[1]/div[3]", "endOffset" : 8649, "_id" : { "$oid" : "504ebbc2220c8e020000001f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347337154317 }, "created" : { "$date" : 1347337154317 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504ec1d3220c8e0200000020", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "General theme in the book. Lack of outside stimulus forces exploration of the mind within.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "Down, down, down. There was nothing else to do, so Alice soon began talking again.", "uuid" : "E4E126CF", "_id" : { "$oid" : "504ec1d3220c8e0200000020" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 4096, "end" : "/div[1]/div[3]", "endOffset" : 4178, "_id" : { "$oid" : "504ec1d3220c8e0200000021" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347338707299 }, "created" : { "$date" : 1347338707299 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504ec3e8220c8e0200000022", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Alice postulates that extraordinary things are now ordinary.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "Oh, how I wish I could shut up like a telescope! I think\nI could, if I only know how to begin.' For, you see, so many out-of-the-way things had\nhappened lately, that Alice had begun to think that very few things indeed were really\nimpossible.", "uuid" : "232E5219", "_id" : { "$oid" : "504ec3e8220c8e0200000022" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 6928, "end" : "/div[1]/div[3]", "endOffset" : 7171, "_id" : { "$oid" : "504ec3e8220c8e0200000023" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347339240870 }, "created" : { "$date" : 1347339240870 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504ec664220c8e0200000024", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Alice abides by this real world rule", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "I'll look first,' she said, 'and see whether it's marked\n\"poison\" or not", "uuid" : "B4411389", "_id" : { "$oid" : "504ec664220c8e0200000024" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 7706, "end" : "/div[1]/div[3]", "endOffset" : 7778, "_id" : { "$oid" : "504ec664220c8e0200000025" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347339876651 }, "created" : { "$date" : 1347339876651 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "504ec6ac9d9ada0200000011" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347339948077 }, "groups" : [ "21L.448J" ], "id" : "504ec6ac9d9ada0200000011", "permissions" : { "admin" : [ "mkel@mit.edu" ], "delete" : [ "mkel@mit.edu" ], "read" : [], "update" : [ "mkel@mit.edu" ] }, "quote" : "And so it was indeed: she was now only ten inches high, and her face brightened up at the\nthought that she was now the right size for going though the little door into that lovely\ngarden.", "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 8733, "end" : "/div[1]/div[3]", "endOffset" : 8920, "_id" : { "$oid" : "505010afe638270200000021" } } ], "tags" : [], "text" : "Conveniently irrational. A number of events seem to occur only so that Alice can continue her journey. Often she is guided by them to areas she was supposed to go to. Wonderland seems like it was designed specifically for her and one might very reasonably suggest it was designed by her own mind in the form of a boredom induced daydream/hallucination. There are still, however, a number of occasions where purpose seems to be completely absent. The only rules which seem to consistently apply to this world are that everything is out of the ordinary, animals talk, and eating or drinking something usually changes one's size. Alice picks up these rules after a while.", "updated" : { "$date" : 1347424431881 }, "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "user" : "mkel@mit.edu", "username" : "Michael K.", "uuid" : "83C33B70" } -{ "id" : "504ec7b6220c8e0200000026", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "At this point, Alice is surprised by anything normal.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "She ate a little bit, and said anxiously to herself, 'Which way? Which way?', holding her\nhand on the top of her head to feel which way it was growing, and she was quite surprised\nto find that she remained the same size: to be sure, this generally happens when one eats\ncake, but Alice had got so much into the way of expecting nothing but out-of-the-way\nthings to happen, that it seemed quite dull and stupid for life to go on in the common\nway.", "uuid" : "30523907", "_id" : { "$oid" : "504ec7b6220c8e0200000026" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 10896, "end" : "/div[1]/div[3]", "endOffset" : 11343, "_id" : { "$oid" : "504ec7b6220c8e0200000027" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347340214446 }, "created" : { "$date" : 1347340214446 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504ec8759d9ada0200000013", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Perhaps a delayed effect of the cake, perhaps no reason at all.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "now I'm opening out like the largest telescope that ever was!", "uuid" : "7A9485D8", "_id" : { "$oid" : "504ec8759d9ada0200000013" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]/p[1]", "startOffset" : 139, "end" : "/div[1]/div[4]/p[1]", "endOffset" : 200, "_id" : { "$oid" : "504ec8759d9ada0200000014" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347340405684 }, "created" : { "$date" : 1347340405684 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "504ec9739d9ada0200000015" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347340659693 }, "groups" : [ "21L.448J" ], "id" : "504ec9739d9ada0200000015", "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "quote" : "I'll try if I know all the things I used to know. Let me\n\t\t\tsee: four times five is twelve, and four times six is thirteen, and four times seven\n\t\t\tis--oh dear! I shall never get to twenty at that rate! However, the Multiplication Table\n\t\t\tdoesn't signify: let's try Geography. London is the capital of Paris, and Paris is the\n\t\t\tcapital of Rome, and Rome--no, THAT'S all wrong, I'm certain!", "ranges" : [ { "start" : "/div[1]/div[4]/p[1]", "startOffset" : 3572, "end" : "/div[1]/div[4]/p[1]", "endOffset" : 3963, "_id" : { "$oid" : "504ec9739d9ada0200000016" } } ], "tags" : [], "text" : "Alice is irrational and has forgotten all she knew and suspects she is not herself.", "updated" : { "$date" : 1347340725658 }, "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "user" : "mkel@mit.edu", "username" : "Michael K.", "uuid" : "A30CEBBE" } -{ "__v" : 0, "_id" : { "$oid" : "504ecaa1220c8e0200000028" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347340961227 }, "groups" : [ "21L.448J" ], "id" : "504ecaa1220c8e0200000028", "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "quote" : "she was now about two\n\t\t\tfeet high, and was going on shrinking rapidly: she soon found out that the cause of this\n\t\t\twas the fan she was holding, and she dropped it hastily, just in time to avoid shrinking\n\t\t\taway altogether.", "ranges" : [ { "start" : "/div[1]/div[4]/p[1]", "startOffset" : 5643, "end" : "/div[1]/div[4]/p[1]", "endOffset" : 5869, "_id" : { "$oid" : "504ecaa1220c8e0200000029" } } ], "tags" : [], "text" : "there is a cause, unnatural, yet still a cause", "updated" : { "$date" : 1347340984212 }, "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "user" : "mkel@mit.edu", "username" : "Michael K.", "uuid" : "70CF906D" } -{ "id" : "504ecc72220c8e020000002a", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Alice is unwillingly rude, but the mouse does not leave her when she apologizes.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "He says it kills all the rats and--oh dear!' cried\n\t\t\tAlice in a sorrowful tone, `I'm afraid I've offended it again!' For the Mouse was swimming\n\t\t\taway from her as hard as it could go, and making quite a commotion in the pool as it went.\n\t\t\t\n\t\t\t\n\t\t\tSo she called softly after it, `Mouse dear! Do come back again, and we won't talk about\n\t\t\tcats or dogs either, if you don't like them!' When the Mouse heard this, it turned round\n\t\t\tand swam slowly back to her: its face was quite pale (with passion, Alice thought), and it\n\t\t\tsaid in a low trembling voice, `Let us get to the shore, and then I'll tell you my\n\t\t\thistory, and you'll understand why it is I hate cats and dogs.'", "uuid" : "646499A8", "_id" : { "$oid" : "504ecc72220c8e020000002a" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]/p[1]", "startOffset" : 10507, "end" : "/div[1]/div[4]/p[1]", "endOffset" : 11184, "_id" : { "$oid" : "504ecc72220c8e020000002b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347341426149 }, "created" : { "$date" : 1347341426149 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "504f257d220c8e020000002c" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347364221329 }, "groups" : [ "21L.000J" ], "id" : "504f257d220c8e020000002c", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "quote" : "November", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 28, "end" : "/div[1]/p[1]", "endOffset" : 36, "_id" : { "$oid" : "504f257d220c8e020000002d" } } ], "tags" : [], "text" : "Why November? All Souls Day? Samhain? Celtic or Roman Catholic influence? \n1st month of winter, the season associated most with evil and darkness?", "updated" : { "$date" : 1347364413040 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "uuid" : "791BBF66" } -{ "_id" : { "$oid" : "504f25b99d9ada0200000017" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347364281927 }, "groups" : [ "21L.000J" ], "id" : "504f25b99d9ada0200000017", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "quote" : "spark of being", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 199, "end" : "/div[1]/p[1]", "endOffset" : 213, "_id" : { "$oid" : "504f25b99d9ada0200000018" } } ], "tags" : [], "text" : "Vitalism? Or a not so subtle reference to \"Then he breathed into it the breath of life\"? \n\nGnosticism? God spark as Higgins mentions in Pygmallion Act 5?", "updated" : { "$date" : 1347410473690 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "uuid" : "34CDC3E2" } -{ "_id" : { "$oid" : "504f27ad220c8e020000002e" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347364781523 }, "groups" : [ "21L.000J" ], "id" : "504f27ad220c8e020000002e", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "quote" : "yellow", "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 248, "end" : "/div[1]/p[2]", "endOffset" : 254, "_id" : { "$oid" : "504f27ad220c8e020000002f" } } ], "tags" : [], "text" : "\"Yellow, and black, and pale, and hectic red\"? Mongolian or simply unfamiliar? 4 Horsemen of Apocalypse? If so Conquest or death? Classically pale refers to death but the original Greek indicates that Yellow Green is closer while Conquest is probably white/pale. Death would fit to nicely, along with alternate interpretations of Plague and Pestilence. Again a premonition of the horrors to come, the deaths the creature will bring to Victor.\n\nPossibly humorism too. Yellow referring to Yellow bile/chole. Balance needed but seems all are in excess. This indicates the creature to be choleric. Dominant, ambitious,leader like.\n\nLater, yellow is the only colour predominantly mentioned, hinting at choleric nature of the creature.\n\n4 Alchemic Elements? Earth? If so fitting as this is dust/clay unto which life has been breathed into by Victor. Earth would also correspond with Death quite nicely.", "updated" : { "$date" : 1347413563043 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "uuid" : "F70C0D5D" } -{ "_id" : { "$oid" : "504f2953220c8e0200000030" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347365203046 }, "groups" : [ "21L.000J" ], "id" : "504f2953220c8e0200000030", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "quote" : "muscles and arteries", "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 289, "end" : "/div[1]/p[2]", "endOffset" : 309, "_id" : { "$oid" : "504f2953220c8e0200000031" } } ], "tags" : [], "text" : "These are undoubtedly RED. Why not veins? Veins are superficial far, far easier to see yet he chooses deep seated arteries. Just to separate from humans who cant see their own arteries, only veins or to highlight the colour red? If so War? or is it human race of American Indians?\n\nOr is it simply Blood (4 Humors)? Fire of Alchemic elements (traditionally blood is associated with air though)", "updated" : { "$date" : 1347416768272 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "uuid" : "AB394DB2" } -{ "_id" : { "$oid" : "504f29c3220c8e0200000032" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347365315997 }, "groups" : [ "21L.000J" ], "id" : "504f29c3220c8e0200000032", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "quote" : "black", "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 346, "end" : "/div[1]/p[2]", "endOffset" : 351, "_id" : { "$oid" : "504f29c3220c8e0200000033" } } ], "tags" : [], "text" : "Black.Famine? Or again Human race?\nJust parading through four horseman or showing the creature as a combination of human races? Chimera ? Soyinka's \"Telephone conversation\"?\n\nOr Black Bile( melanchole)?", "updated" : { "$date" : 1347416845908 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "uuid" : "B0E01687" } -{ "_id" : { "$oid" : "504f2a4b220c8e0200000034" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347365451493 }, "groups" : [ "21L.000J" ], "id" : "504f2a4b220c8e0200000034", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "quote" : "on a dreary night", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 6, "end" : "/div[1]/p[1]", "endOffset" : 24, "_id" : { "$oid" : "504f2a4b220c8e0200000035" } } ], "tags" : [], "text" : "Did this book Influence Poe while writing \"The Raven\"? Once upon a midnight dreary...\nThat was December though, month of the solstice, much more significant from the pagan calender. \n\nMight just be the inherent musicality of the whole thing that reminds me of Raven.", "updated" : { "$date" : 1347410294801 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "uuid" : "FD225629" } -{ "id" : "504f3d699d9ada0200000019", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "text" : "In this segment and at several other times in the story, Alice wants to accomplish something or be physically transformed and a potion to accomplish the task seems to magically appear. This hints to that Alice's mind is in control of Wonderland.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "There seemed to be no use in waiting by the little door, so she went back to the table,\nhalf hoping she might find another key on it, or at any rate a book of rules for shutting\npeople up like telescopes: this time she found a little bottle on it, ('which certainly\nwas not here before,' said Alice,) and round the neck of the bottle was a paper label,\nwith the words 'DRINK ME' beautifully printed on it in large letters. \n\nIt was all very well to say 'Drink me,' but the wise little Alice was not going to do THAT\nin a hurry. 'No, I'll look first,' she said, 'and see whether it's marked\n\"poison\" or not'; for she had read several nice little histories about children\nwho had got burnt, and eaten up by wild beasts and other unpleasant things, all because\nthey WOULD not remember the simple rules their friends had taught them: such as, that a\nred-hot poker will burn you if you hold it too long; and that if you cut your finger VERY\ndeeply with a knife, it usually bleeds; and she had never forgotten that, if you drink\nmuch from a bottle marked 'poison,' it is almost certain to disagree with you, sooner or\nlater. \n\nHowever, this bottle was NOT marked 'poison,' so Alice ventured to taste it, and finding\nit very nice, (it had, in fact, a sort of mixed flavour of cherry-tart, custard,\npine-apple, roast turkey, toffee, and hot buttered toast,) she very soon finished it off. \n\n*    *    *    *    *    *    *\n   *    *    *    *    *    *\n*    *    *    *    *    *    *\n\n'What a curious feeling!' said Alice; 'I must be shutting up like a telescope.'", "uuid" : "7848A067", "_id" : { "$oid" : "504f3d699d9ada0200000019" }, "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [ "jpaggi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 7173, "end" : "/div[1]/div[3]", "endOffset" : 8731, "_id" : { "$oid" : "504f3d699d9ada020000001a" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347370345326 }, "created" : { "$date" : 1347370345326 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504f400b9d9ada020000001b", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "text" : "Time is likely the most consistent thing in our world and for many people one of the most frightening. This makes time being able to be stopped comical, and at the same time thought provoking. It leads us to imagine what our world would be like if we could control time, spending an eternity in our happiest moments and skipping completely the tedious and depressing parts of life.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "It's always six o'clock now.'", "uuid" : "17327441", "_id" : { "$oid" : "504f400b9d9ada020000001b" }, "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]/p[1]", "startOffset" : 7165, "end" : "/div[1]/div[8]/p[1]", "endOffset" : 7199, "_id" : { "$oid" : "504f400b9d9ada020000001c" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347371019749 }, "created" : { "$date" : 1347371019749 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504f42799d9ada020000001d", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "text" : "In this segment and in a later one regarding the queen, it becomes clear that the authority figures of Wonderland are ruthless. I think that they symbolize the often brutal and unforgiving tendencies of nature itself. This points to that Wonderland is a \"tooth and claw\" world, where only the fittest survive. This is also apparent in the mouse's and birds' fear of cats.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`The Duchess! The Duchess! Oh my dear paws! Oh my fur\n\t\t\tand whiskers! She'll get me executed, as sure as ferrets are ferrets!", "uuid" : "F7A4F875", "_id" : { "$oid" : "504f42799d9ada020000001d" }, "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]/p[1]", "startOffset" : 165, "end" : "/div[1]/div[6]/p[1]", "endOffset" : 292, "_id" : { "$oid" : "504f42799d9ada020000001e" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347371641175 }, "created" : { "$date" : 1347371641175 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504f4394220c8e0200000038", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Lory lies about his rudeness", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`Ugh!' said the Lory, with a shiver. \n\t\t\t\n\t\t\t`I beg your pardon!' said the Mouse, frowning, but very politely: `Did you speak?' \n\t\t\t\n\t\t\t`Not I!' said the Lory hastily.", "uuid" : "EBCF80DF", "_id" : { "$oid" : "504f4394220c8e0200000038" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[1]", "startOffset" : 1525, "end" : "/div[1]/div[5]/p[1]", "endOffset" : 1693, "_id" : { "$oid" : "504f4394220c8e0200000039" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347371924991 }, "created" : { "$date" : 1347371924991 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504f4405220c8e020000003a", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Duck points out confusing grammar", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "found it advisable--\"' \n\t\t\t\n\t\t\t`Found WHAT?' said the Duck. \n\t\t\t\n\t\t\t`Found IT,' the Mouse replied rather crossly: `of course you know what \"it\"\n\t\t\tmeans.' \n\t\t\t\n\t\t\t`I know what \"it\" means well enough, when I find a thing,' said the Duck: `it's\n\t\t\tgenerally a frog or a worm. The question is, what did the archbishop find?'", "uuid" : "CA29F319", "_id" : { "$oid" : "504f4405220c8e020000003a" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[1]", "startOffset" : 1890, "end" : "/div[1]/div[5]/p[1]", "endOffset" : 2212, "_id" : { "$oid" : "504f4405220c8e020000003b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347372037215 }, "created" : { "$date" : 1347372037215 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504f4483220c8e020000003c", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "rule", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`EVERYBODY has won, and all must have prizes.' \n\t\t\t\n\t\t\t`But who is to give the prizes?' quite a chorus of voices asked. \n\t\t\t\n\t\t\t`Why, SHE, of course,' said the Dodo, pointing to Alice with one finger; and the whole\n\t\t\tparty at once crowded round her, calling out in a confused way, `Prizes! Prizes!'", "uuid" : "9ABE1309", "_id" : { "$oid" : "504f4483220c8e020000003c" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[1]", "startOffset" : 4428, "end" : "/div[1]/div[5]/p[1]", "endOffset" : 4728, "_id" : { "$oid" : "504f4483220c8e020000003d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347372163991 }, "created" : { "$date" : 1347372163991 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504f451e220c8e020000003e", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "wordplay", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`Mine is a long and a sad tale!' said the Mouse, turning to Alice, and sighing. \n\t\t\t\n\t\t\t`It IS a long tail, certainly,' said Alice, looking down with wonder at the Mouse's tail;\n\t\t\t`but why do you call it sad?'", "uuid" : "C365FB94", "_id" : { "$oid" : "504f451e220c8e020000003e" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[1]", "startOffset" : 6232, "end" : "/div[1]/div[5]/p[1]", "endOffset" : 6442, "_id" : { "$oid" : "504f451e220c8e020000003f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347372318310 }, "created" : { "$date" : 1347372318310 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504f4564220c8e0200000040", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "wordplay", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`I had NOT!' cried the Mouse, sharply and very angrily. \n\t\t\t\n\t\t\t`A knot!' said Alice, always ready to make herself useful, and looking anxiously about\n\t\t\ther. `Oh, do let me help to undo it!'", "uuid" : "B275BE42", "_id" : { "$oid" : "504f4564220c8e0200000040" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[1]", "startOffset" : 8611, "end" : "/div[1]/div[5]/p[1]", "endOffset" : 8803, "_id" : { "$oid" : "504f4564220c8e0200000041" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347372388623 }, "created" : { "$date" : 1347372388623 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504f45f0220c8e0200000042", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Alice scares off everybody else.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`Dinah's our cat.\n\t\t\tAnd she's such a capital one for catching mice you can't think! And oh, I wish you could\n\t\t\tsee her after the birds! Why, she'll eat a little bird as soon as look at it!'", "uuid" : "9BFE5CB8", "_id" : { "$oid" : "504f45f0220c8e0200000042" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[1]", "startOffset" : 9926, "end" : "/div[1]/div[5]/p[1]", "endOffset" : 10117, "_id" : { "$oid" : "504f45f0220c8e0200000043" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347372528913 }, "created" : { "$date" : 1347372528913 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504f47369d9ada020000001f", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Alice correctly predicts effect of bottle, but misjudges amount of growth.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "There was no label this time\n\t\t\twith the words `DRINK ME,' but nevertheless she uncorked it and put it to her lips. `I\n\t\t\tknow SOMETHING interesting is sure to happen,' she said to herself, `whenever I eat or\n\t\t\tdrink anything; so I'll just see what this bottle does. I do hope it'll make me grow large\n\t\t\tagain, for really I'm quite tired of being such a tiny little thing!'  \n\t\t\t\n\t\t\tIt did so indeed, and much sooner than she had expected: before she had drunk half the\n\t\t\tbottle, she found her head pressing against the ceiling, and had to stoop to save her neck\n\t\t\tfrom being broken. She hastily put down the bottle, saying to herself `That's quite\n\t\t\tenough--I hope I shan't grow any more--As it is, I can't get out at the door--I do wish I\n\t\t\thadn't drunk quite so much!'", "uuid" : "D7BF4BB5", "_id" : { "$oid" : "504f47369d9ada020000001f" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]/p[1]", "startOffset" : 2432, "end" : "/div[1]/div[6]/p[1]", "endOffset" : 3210, "_id" : { "$oid" : "504f47369d9ada0200000020" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347372854022 }, "created" : { "$date" : 1347372854022 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504f491d220c8e0200000044", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "had sense of perspective challenged.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`I'm afraid I can't put it more clearly,' Alice replied very politely, `for I can't\n\t\t\tunderstand it myself to begin with; and being so many different sizes in a day is very\n\t\t\tconfusing.'", "uuid" : "D5DF0DD5", "_id" : { "$oid" : "504f491d220c8e0200000044" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]/p[1]", "startOffset" : 726, "end" : "/div[1]/div[7]/p[1]", "endOffset" : 915, "_id" : { "$oid" : "504f491d220c8e0200000045" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347373341928 }, "created" : { "$date" : 1347373341928 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504f4a569d9ada0200000021", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "This was published after \"On the Origin of Species\". Alice is uncomfortable with evolution.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "only one doesn't like\n\t\t\tchanging so often, you know.'", "uuid" : "4DDC6513", "_id" : { "$oid" : "504f4a569d9ada0200000021" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]/p[1]", "startOffset" : 5013, "end" : "/div[1]/div[7]/p[1]", "endOffset" : 5068, "_id" : { "$oid" : "504f4a569d9ada0200000022" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347373654850 }, "created" : { "$date" : 1347373654850 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504f50b49d9ada0200000023", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Alice seems relatively unfazed by all the strange things that are happening around her. She eats and drinks random things she finds with messages, whether or not they could actually be for her. She grows to the size of a house and feels, what seems like, only a little upset", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "seemed", "uuid" : "6EF90C11", "_id" : { "$oid" : "504f50b49d9ada0200000023" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]/p[1]", "startOffset" : 3870, "end" : "/div[1]/div[6]/p[1]", "endOffset" : 3877, "_id" : { "$oid" : "504f50b49d9ada0200000024" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347375284817 }, "created" : { "$date" : 1347375284817 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504f7f1c220c8e0200000046", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Isn't the final cause all that really matters? Maybe: is evolution relevant?", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`You're looking for eggs, I know THAT well\n\t\t\tenough; and what does it matter to me whether you're a little girl or a serpent?'", "uuid" : "497F4E7E", "_id" : { "$oid" : "504f7f1c220c8e0200000046" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]/p[1]", "startOffset" : 10931, "end" : "/div[1]/div[7]/p[1]", "endOffset" : 11059, "_id" : { "$oid" : "504f7f1c220c8e0200000047" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347387164340 }, "created" : { "$date" : 1347387164340 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504f805d220c8e0200000048", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Scale of time", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`Why should it?' muttered the Hatter. `Does YOUR watch tell you what year it is?' \n\t\t\t\n\t\t\t`Of course not,' Alice replied very readily: `but that's because it stays the same year\n\t\t\tfor such a long time together.'", "uuid" : "2606A790", "_id" : { "$oid" : "504f805d220c8e0200000048" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]/p[1]", "startOffset" : 3800, "end" : "/div[1]/div[8]/p[1]", "endOffset" : 4012, "_id" : { "$oid" : "504f805d220c8e0200000049" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347387485657 }, "created" : { "$date" : 1347387485657 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504f808e220c8e020000004a", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Asking lofty questions is a waste of time.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`I think you might do something better with the time,' she said,\n\t\t\t`than waste it in asking riddles that have no answers.'", "uuid" : "54D7E58F", "_id" : { "$oid" : "504f808e220c8e020000004a" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]/p[1]", "startOffset" : 4813, "end" : "/div[1]/div[8]/p[1]", "endOffset" : 4937, "_id" : { "$oid" : "504f808e220c8e020000004b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347387534595 }, "created" : { "$date" : 1347387534595 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504f8124220c8e020000004c", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Logocentric creation gone wrong. Something that is manifested upon speech suddenly ceases to manifest itself upon speech.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`Well, I'd hardly finished the first verse,' said the Hatter, `when the Queen jumped up\n\t\t\tand bawled out, \"He's murdering the time! Off with his head!\"' \n\t\t\t\n\t\t\t`How dreadfully savage!' exclaimed Alice. \n\t\t\t\n\t\t\t`And ever since that,' the Hatter went on in a mournful tone, `he won't do a thing I ask!\n\t\t\tIt's always six o'clock now.'", "uuid" : "13BAA4AC", "_id" : { "$oid" : "504f8124220c8e020000004c" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]/p[1]", "startOffset" : 6864, "end" : "/div[1]/div[8]/p[1]", "endOffset" : 7199, "_id" : { "$oid" : "504f8124220c8e020000004d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347387684587 }, "created" : { "$date" : 1347387684587 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504f81839d9ada0200000025", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Rational questioning rejected by dogmatic acceptance.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "Alice did not quite know what to say to this: so she helped herself to some tea and\n\t\t\tbread-and-butter, and then turned to the Dormouse, and repeated her question. `Why did\n\t\t\tthey live at the bottom of a well?' \n\t\t\t\n\t\t\tThe Dormouse again took a minute or two to think about it, and then said, `It was a\n\t\t\ttreacle-well.' \n\t\t\t\n\t\t\t`There's no such thing!' Alice was beginning very angrily, but the Hatter and the March\n\t\t\tHare went `Sh! sh!' and the Dormouse sulkily remarked, `If you can't be civil, you'd\n\t\t\tbetter finish the story for yourself.'", "uuid" : "1640A7B6", "_id" : { "$oid" : "504f81839d9ada0200000025" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]/p[1]", "startOffset" : 9500, "end" : "/div[1]/div[8]/p[1]", "endOffset" : 10049, "_id" : { "$oid" : "504f81839d9ada0200000026" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347387779963 }, "created" : { "$date" : 1347387779963 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504f82089d9ada0200000027", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Alice the rationalist is turned off by the logical gymnastics of the believer.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`At any rate I'll never go THERE again!' said Alice as she picked her way through the\n\t\t\twood. `It's the stupidest tea-party I ever was at in all my life!'", "uuid" : "F2E20BC4", "_id" : { "$oid" : "504f82089d9ada0200000027" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]/p[1]", "startOffset" : 12726, "end" : "/div[1]/div[8]/p[1]", "endOffset" : 12882, "_id" : { "$oid" : "504f82089d9ada0200000028" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347387912438 }, "created" : { "$date" : 1347387912438 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504f91829d9ada020000002b", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "text" : "At first, Alice was offended by the rudeness of the other members of the tea party, and even reprimanded them for it. By this point, however, she has adapted and is interrupting and challenging them in order to hold her own in their conversation. In this way her rudeness is a survival strategy, although she does abandon it later on when she is ultimately offended one too many times and leaves the table.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`Who's making personal remarks now?'", "uuid" : "3E4ADAAE", "_id" : { "$oid" : "504f91829d9ada020000002b" }, "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]/p[1]", "startOffset" : 9424, "end" : "/div[1]/div[8]/p[1]", "endOffset" : 9460, "_id" : { "$oid" : "504f91829d9ada020000002c" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347391874039 }, "created" : { "$date" : 1347391874039 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "504f92249d9ada020000002d" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347392036562 }, "groups" : [ "21L.448J" ], "id" : "504f92249d9ada020000002d", "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "quote" : "`You'll get used to it in time,'", "ranges" : [ { "start" : "/div[1]/div[7]/p[1]", "startOffset" : 5759, "end" : "/div[1]/div[7]/p[1]", "endOffset" : 5791, "_id" : { "$oid" : "504f92249d9ada020000002e" } } ], "tags" : [], "text" : "When we find out at the end of this section that the Caterpillar can respond to her thoughts as well as her words, it brings a new meaning to this response. Alice clearly thought that the Caterpillar meant that she would get used to her size in time, but it could be that he meant she would get used to the ease which with the Wonderlanders are offended. In the beginning, Alice was trying to be polite to everyone and yet they were still offended by what she said; later on, during the tea party, she finally begins to disregard her proper upbringing and defend herself with rudeness, and the characters she is with accept it. The animals of Wonderland appear to be more offended by politeness than by rudeness.", "updated" : { "$date" : 1347392190349 }, "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "uuid" : "B2CA98A2" } -{ "id" : "504f93b59d9ada020000002f", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "text" : "Much of this past scene has seemed to focus on the pure absurdity of what is happening. The game that they play is blatantly ridiculous, and even Alice, who has generally been accepting all of the strange things that have happened to her, comments on the absurdity.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "Alice thought the whole thing very absurd", "uuid" : "DB3B5FB7", "_id" : { "$oid" : "504f93b59d9ada020000002f" }, "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[1]", "startOffset" : 5484, "end" : "/div[1]/div[5]/p[1]", "endOffset" : 5525, "_id" : { "$oid" : "504f93b59d9ada0200000030" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347392437037 }, "created" : { "$date" : 1347392437037 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fa46b67a5060200000004", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "This is probably one of the few examples of rational thinking in the conversations between Alice and the characters in Wonderland. Alice realizes that talking about the mouse's predators in this way is making the mouse uncomfortable. So in order to get the mouses help, it is in her best interest to change the subject", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "So she called softly after it, `Mouse dear! Do come back again, and we won't talk about\n\t\t\tcats or dogs either, if you don't like them!' When the Mouse heard this, it turned round\n\t\t\tand swam slowly back to her: its face was quite pale (with passion, Alice thought), and it\n\t\t\tsaid in a low trembling voice, `Let us get to the shore, and then I'll tell you my\n\t\t\thistory, and you'll understand why it is I hate cats and dogs.'", "uuid" : "013B54B4", "_id" : { "$oid" : "504fa46b67a5060200000004" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]/p[1]", "startOffset" : 10757, "end" : "/div[1]/div[4]/p[1]", "endOffset" : 11184, "_id" : { "$oid" : "504fa46b67a5060200000005" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347396715677 }, "created" : { "$date" : 1347396715677 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fa5309d9ada0200000031", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "This is sort of a pun. The mouse tells Alice a tale, but Alice mistakes the mouse to be talking about his tail.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`It IS a long tail, certainly,' said Alice, looking down with wonder at the Mouse's tail;\n\t\t\t`but why do you call it sad?' And she kept on puzzling about it while the Mouse was\n\t\t\tspeaking, so that her idea of the tale was something like this:-- \n\t\t\t\n\t\t\t                           \n\t\t\t`Fury said to a\n\t\t\t                       \n\t\t\tmouse, That he\n\t\t\t                   \n\t\t\tmet in the\n\t\t\t               \n\t\t\thouse,\n\t\t\t            \"Let us\n\t\t\t               \n\t\t\tboth go to\n\t\t\t                   \n\t\t\tlaw: I will\n\t\t\t                       \n\t\t\tprosecute\n\t\t\t                           \n\t\t\tYOU. --Come,\n\t\t\t                               \n\t\t\tI'll take no\n\t\t\t                                   \n\t\t\tdenial; We\n\t\t\t                               \n\t\t\tmust have a\n\t\t\t                           \n\t\t\ttrial: For\n\t\t\t                       \n\t\t\treally this\n\t\t\t                   \n\t\t\tmorning I've\n\t\t\t               \n\t\t\tnothing\n\t\t\t            to do.\"\n\t\t\t               \n\t\t\tSaid the\n\t\t\t                   \n\t\t\tmouse to the\n\t\t\t                       \n\t\t\tcur, \"Such\n\t\t\t                           \n\t\t\ta trial,\n\t\t\t                               \n\t\t\tdear Sir,\n\t\t\t                                   \n\t\t\tWith\n\t\t\t                               \n\t\t\tno jury\n\t\t\t                           \n\t\t\tor judge,\n\t\t\t                       \n\t\t\twould be\n\t\t\t                   \n\t\t\twasting\n\t\t\t               \n\t\t\tour\n\t\t\t                   \n\t\t\tbreath.\"\n\t\t\t                       \n\t\t\t\"I'll be\n\t\t\t                           \n\t\t\tjudge, I'll\n\t\t\t                               \n\t\t\tbe jury,\"\n\t\t\t                                   \n\t\t\tSaid\n\t\t\t                           \n\t\t\tcunning\n\t\t\t                               \n\t\t\told Fury:\n\t\t\t                               \n\t\t\t\"I'll\n\t\t\t                               \n\t\t\ttry the\n\t\t\t                                   \n\t\t\twhole\n\t\t\t                                       \n\t\t\tcause,\n\t\t\t                                           \n\t\t\tand\n\t\t\t                                   \n\t\t\tcondemn\n\t\t\t                               \n\t\t\tyou\n\t\t\t                           \n\t\t\tto\n\t\t\t                               \n\t\t\tdeath.\"'\n\t\t\t\n\t\t\t\n\t\t\t`You are not attending!' said the Mouse to Alice severely. `What are you thinking of?' \n\t\t\t\n\t\t\t`I beg your pardon,' said Alice very humbly: `you had got to the fifth bend, I think?' \n\t\t\t\n\t\t\t`I had NOT!' cried the Mouse, sharply and very angrily.", "uuid" : "56C0AD60", "_id" : { "$oid" : "504fa5309d9ada0200000031" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[1]", "startOffset" : 6320, "end" : "/div[1]/div[5]/p[1]", "endOffset" : 8667, "_id" : { "$oid" : "504fa5309d9ada0200000032" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347396912080 }, "created" : { "$date" : 1347396912080 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fa57167a5060200000006", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Alice starts off being very apologetic, but as the story progresses, she becomes more confrontational and less afraid to speak her mind. I think this first become evident at the tea table and when she encounters the queen (that chapter).", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`I didn't mean it!' pleaded poor Alice. `But you're so easily offended, you know!'", "uuid" : "36F29748", "_id" : { "$oid" : "504fa57167a5060200000006" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[1]", "startOffset" : 8943, "end" : "/div[1]/div[5]/p[1]", "endOffset" : 9026, "_id" : { "$oid" : "504fa57167a5060200000007" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347396977511 }, "created" : { "$date" : 1347396977511 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "504fa67367a5060200000008" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347397235404 }, "groups" : [ "21L.448J" ], "id" : "504fa67367a5060200000008", "permissions" : { "admin" : [ "mpd91@mit.edu" ], "delete" : [ "mpd91@mit.edu" ], "read" : [], "update" : [ "mpd91@mit.edu" ] }, "quote" : "At last the Mouse, who seemed to be a person of authority among them, called out, `Sit\n\t\t\tdown, all of you, and listen to me! I'LL soon make you dry enough!' They all sat down at\n\t\t\tonce, in a large ring, with the Mouse in the middle. Alice kept her eyes anxiously fixed\n\t\t\ton it, for she felt sure she would catch a bad cold if she did not get dry very soon.", "ranges" : [ { "start" : "/div[1]/div[5]/p[1]", "startOffset" : 761, "end" : "/div[1]/div[5]/p[1]", "endOffset" : 1121, "_id" : { "$oid" : "504ff0a2e63827020000001a" } } ], "tags" : [], "text" : "This paragraph and the few that follow are examples of irrational thinking and nonsense in this story. They try to use dry humor will help them dry off physically, which the reader finds funny because this is not possible in the world we live in, and we realize it is not even possible in Wonderland since this ends up not working. ", "updated" : { "$date" : 1347416226349 }, "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "user" : "mpd91@mit.edu", "username" : "Michael D.", "uuid" : "159CC3F6" } -{ "__v" : 1, "_id" : { "$oid" : "504fa76d9d9ada0200000033" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347397485173 }, "groups" : [ "21L.448J" ], "id" : "504fa76d9d9ada0200000033", "permissions" : { "admin" : [ "mpd91@mit.edu" ], "delete" : [ "mpd91@mit.edu" ], "read" : [], "update" : [ "mpd91@mit.edu" ] }, "quote" : "First it marked out a race-course, in a sort of circle, (`the exact shape doesn't matter,'\n\t\t\tit said,) and then all the party were placed along the course, here and there. There was\n\t\t\tno `One, two, three, and away,' but they began running when they liked, and left off when\n\t\t\tthey liked, so that it was not easy to know when the race was over. However, when they had\n\t\t\tbeen running half an hour or so, and were quite dry again, the Dodo suddenly called out\n\t\t\t`The race is over!' and they all crowded round it, panting, and asking, `But who has won?'", "ranges" : [ { "start" : "/div[1]/div[5]/p[1]", "startOffset" : 3577, "end" : "/div[1]/div[5]/p[1]", "endOffset" : 4132, "_id" : { "$oid" : "504ff04067a506020000003a" } } ], "tags" : [], "text" : "I thought this part was a good example of, not necessarily nonsense, but achieving something in a roundabout way, which adds humor. The point of the race was to get everyone to move around and help them dry off or take their minds off the fact that they were wet, not necessarily win since everyone started at different times and from different places. The reader realizes this but the characters do not. Alice seems to think that the idea of giving out prizes and being presented with the thimble is a little ridiculous but does her best not to laugh", "updated" : { "$date" : 1347416128293 }, "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "user" : "mpd91@mit.edu", "username" : "Michael D.", "uuid" : "1ABAD11D" } -{ "id" : "504fa7e967a506020000000a", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "It seems like Alice's new found defiance is in response to the Queen's personality. Her's is much harsher than the other people she has been around, and Alice has adjusted to match. Unlike when she was hanging out with the animals in the 2nd chapter and trying to dry off", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "The Queen turned crimson with fury, and, after glaring at her for a moment like a wild\n\t\t\tbeast, screamed `Off with her head! Off--' \n\t\t\t\n\t\t\t`Nonsense!' said Alice, very loudly and decidedly, and the Queen was silent.", "uuid" : "BDF0FD24", "_id" : { "$oid" : "504fa7e967a506020000000a" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 4141, "end" : "/div[1]/div[3]", "endOffset" : 4359, "_id" : { "$oid" : "504fa7e967a506020000000b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347397609471 }, "created" : { "$date" : 1347397609471 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504faa279d9ada0200000035", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "The Queen is the most aggressive character in the story so far. Yet I don't this makes the story of Alice in Wonderland an example of a \"tooth and claw\" evolutionary world. That sounds more like a world where the inhabitants compete for dominance. The Queen in this case is already in a dominant position, and whether or not she behaves the way she does, she is going to keep her position of power. So it seems like her obsession with beheading people for minute mistakes is excessive.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`I see!' said the Queen, who had meanwhile been examining the roses. `Off with their\n\t\t\theads!' and the procession moved on, three of the soldiers remaining behind to execute the\n\t\t\tunfortunate gardeners, who ran to Alice for protection.", "uuid" : "8734B51E", "_id" : { "$oid" : "504faa279d9ada0200000035" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 5091, "end" : "/div[1]/div[3]", "endOffset" : 5329, "_id" : { "$oid" : "504faa279d9ada0200000036" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347398183659 }, "created" : { "$date" : 1347398183659 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fac3c9d9ada0200000037", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "This is another example of nonsense, but it is amusing in this story because we know it is a fiction piece. Playing with living animals that don't necessarily want to be the game pieces they are adds a funny and challenging twist to the game. ", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "The chief difficulty Alice found at first was in managing her flamingo: she succeeded in\n\t\t\tgetting its body tucked away, comfortably enough, under her arm, with its legs hanging\n\t\t\tdown, but generally, just as she had got its neck nicely straightened out, and was going\n\t\t\tto give the hedgehog a blow with its head, it WOULD twist itself round and look up in her\n\t\t\tface, with such a puzzled expression that she could not help bursting out laughing: and\n\t\t\twhen she had got its head down, and was going to begin again, it was very provoking to\n\t\t\tfind that the hedgehog had unrolled itself, and was in the act of crawling away: besides\n\t\t\tall this, there was generally a ridge or furrow in the way wherever she wanted to send the\n\t\t\thedgehog to, and, as the doubled-up soldiers were always getting up and walking off to\n\t\t\tother parts of the ground, Alice soon came to the conclusion that it was a very difficult\n\t\t\tgame indeed.", "uuid" : "75080F4A", "_id" : { "$oid" : "504fac3c9d9ada0200000037" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 7401, "end" : "/div[1]/div[3]", "endOffset" : 8331, "_id" : { "$oid" : "504fac3c9d9ada0200000038" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347398716306 }, "created" : { "$date" : 1347398716306 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fb5b69d9ada0200000039", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Humorous self-referencing", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "There ought to\n\t\t\tbe a book written about me, that there ought!", "uuid" : "1203F4D7", "_id" : { "$oid" : "504fb5b69d9ada0200000039" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]/p[1]", "startOffset" : 4425, "end" : "/div[1]/div[6]/p[1]", "endOffset" : 4488, "_id" : { "$oid" : "504fb5b69d9ada020000003a" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347401142247 }, "created" : { "$date" : 1347401142247 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fb87567a506020000000c", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Alice on the counter-attack.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "THAT you won't' thought Alice, and, after waiting till she fancied she heard the Rabbit\n\t\t\tjust under the window, she suddenly spread out her hand, and made a snatch in the air.", "uuid" : "264A7E2C", "_id" : { "$oid" : "504fb87567a506020000000c" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]/p[1]", "startOffset" : 5852, "end" : "/div[1]/div[6]/p[1]", "endOffset" : 6029, "_id" : { "$oid" : "504fb87567a506020000000d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347401845466 }, "created" : { "$date" : 1347401845466 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fb9b367a506020000000e", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Alice threatens", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`You'd better not\n\t\t\tdo that again!'", "uuid" : "FAB11ACA", "_id" : { "$oid" : "504fb9b367a506020000000e" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]/p[1]", "startOffset" : 10243, "end" : "/div[1]/div[6]/p[1]", "endOffset" : 10279, "_id" : { "$oid" : "504fb9b367a506020000000f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347402163673 }, "created" : { "$date" : 1347402163673 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fba1f67a5060200000010", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Alice uses her observations from this bizarre world to make an educated guess about what will happen next.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "Alice noticed with some surprise that the pebbles were all turning into little cakes as\n\t\t\tthey lay on the floor, and a bright idea came into her head. `If I eat one of these\n\t\t\tcakes,' she thought, `it's sure to make SOME change in my size; and as it can't possibly\n\t\t\tmake me larger, it must make me smaller, I suppose.'", "uuid" : "8B9BA53B", "_id" : { "$oid" : "504fba1f67a5060200000010" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]/p[1]", "startOffset" : 10325, "end" : "/div[1]/div[6]/p[1]", "endOffset" : 10648, "_id" : { "$oid" : "504fba1f67a5060200000011" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347402271150 }, "created" : { "$date" : 1347402271150 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fba7f67a5060200000012", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "For the first time, Alice chooses her course of action.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`The first thing I've got to do,' said Alice to herself, as she wandered about in the\n\t\t\twood, `is to grow to my right size again; and the second thing is to find my way into that\n\t\t\tlovely garden. I think that will be the best plan.'", "uuid" : "343A2061", "_id" : { "$oid" : "504fba7f67a5060200000012" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]/p[1]", "startOffset" : 11194, "end" : "/div[1]/div[6]/p[1]", "endOffset" : 11429, "_id" : { "$oid" : "504fba7f67a5060200000013" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347402367649 }, "created" : { "$date" : 1347402367649 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fc4ec9d9ada020000003b", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "Henry uses this imagery to give Catherine a feeling of suspense, mystery and excitement in response to Northanger Abbey", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "a\n\nponderous chest which no efforts can open", "uuid" : "933DAF99", "_id" : { "$oid" : "504fc4ec9d9ada020000003b" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [ "cabinets", "mystery" ], "ranges" : [ { "start" : "/div[1]/p[728]", "startOffset" : 209, "end" : "/div[1]/p[728]", "endOffset" : 253, "_id" : { "$oid" : "504fc4ec9d9ada020000003c" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347405063275 }, "created" : { "$date" : 1347405036106 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fc5c59d9ada020000003d", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "Why was it at first unnoticed? ", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "a large, old-fashioned cabinet of ebony\n\nand gold, which, though narrowly examining the furniture before, you\n\nhad passed unnoticed.", "uuid" : "33FDE3CF", "_id" : { "$oid" : "504fc5c59d9ada020000003d" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [ "cabinet" ], "ranges" : [ { "start" : "/div[1]/p[732]", "startOffset" : 747, "end" : "/div[1]/p[732]", "endOffset" : 879, "_id" : { "$oid" : "504fc5c59d9ada020000003e" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347405253719 }, "created" : { "$date" : 1347405253719 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "504fd24a9d9ada020000003f" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347408458341 }, "groups" : [ "21L.000J" ], "id" : "504fd24a9d9ada020000003f", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "quote" : "anxiety that almost amounted to agony", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 91, "end" : "/div[1]/p[1]", "endOffset" : 128, "_id" : { "$oid" : "504fd24a9d9ada0200000040" } } ], "tags" : [], "text" : "Lots of a's including one alliteration. Repeatation. Reminded of The Raven ,though it is a later work.", "updated" : { "$date" : 1347410264960 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "uuid" : "7A592FCC" } -{ "_id" : { "$oid" : "504fd26d67a5060200000014" }, "id" : "504fd26d67a5060200000014", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "New day- New life?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "one in the morning", "uuid" : "8A6DD77B", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 274, "end" : "/div[1]/p[1]", "endOffset" : 292, "_id" : { "$oid" : "504fd26d67a5060200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347408493506 }, "created" : { "$date" : 1347408493506 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "504fd2cd67a5060200000016" }, "id" : "504fd2cd67a5060200000016", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Equivalent Exchange- His price for his achievement. Alchemic Principle that even modern science accpets.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "For this I had deprived myself of rest and health.", "uuid" : "DD2EBABC", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 189, "end" : "/div[1]/p[3]", "endOffset" : 239, "_id" : { "$oid" : "504fd2cd67a5060200000017" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347408589475 }, "created" : { "$date" : 1347408589475 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "504fd74d67a5060200000018" }, "id" : "504fd74d67a5060200000018", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Chemicals? Devices?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "instruments of life", "uuid" : "108E86AC", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 146, "end" : "/div[1]/p[1]", "endOffset" : 165, "_id" : { "$oid" : "504fd74d67a5060200000019" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347409741593 }, "created" : { "$date" : 1347409741593 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "504fd8ad9d9ada0200000041" }, "id" : "504fd8ad9d9ada0200000041", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Jaundiced or diseased? Yellow eyes seem odd. \n\nPerhaps feral or animalistic.Wolves have yellow eyes but not dull. Either case inhuman or strange.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "dull yellow eye", "uuid" : "744F72A0", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 439, "end" : "/div[1]/p[1]", "endOffset" : 454, "_id" : { "$oid" : "504fd8ad9d9ada0200000042" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347410093103 }, "created" : { "$date" : 1347410093103 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "504fdda867a506020000001a" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347411368859 }, "groups" : [ "21L.000J" ], "id" : "504fdda867a506020000001a", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "quote" : "beautiful. Beautiful!", "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 211, "end" : "/div[1]/p[2]", "endOffset" : 232, "_id" : { "$oid" : "504fdda867a506020000001b" } } ], "tags" : [], "text" : "Double standard. HE MADE THE CREATURE. HIS DESIGN IS AT FAULT.\n\nGod may have had made Adam in his image (no way to be sure of course) but he wasn't repulsed by the appearance of his creation.", "updated" : { "$date" : 1347411711878 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "uuid" : "76F1E8B5" } -{ "_id" : { "$oid" : "504fddc99d9ada0200000043" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347411401920 }, "groups" : [ "21L.000J" ], "id" : "504fddc99d9ada0200000043", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "quote" : "pearly whiteness", "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 381, "end" : "/div[1]/p[2]", "endOffset" : 397, "_id" : { "$oid" : "504fddc99d9ada0200000044" } } ], "tags" : [], "text" : "Conquest. The last horseman? ", "updated" : { "$date" : 1347416871344 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "uuid" : "6EEC86E0" } -{ "_id" : { "$oid" : "504fdfee9d9ada0200000045" }, "id" : "504fdfee9d9ada0200000045", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Just using Wordsworth? \n\"gleams of half-extinguished thought\" in Tintern Abbey.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "glimmer of the half-extinguished light", "uuid" : "92C0C08E", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 389, "end" : "/div[1]/p[1]", "endOffset" : 427, "_id" : { "$oid" : "504fdfee9d9ada0200000046" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347411950872 }, "created" : { "$date" : 1347411950872 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "504fe00767a506020000001c" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347411975988 }, "groups" : [ "21L.000J" ], "id" : "504fe00767a506020000001c", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "quote" : "candle was nearly burnt out", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 346, "end" : "/div[1]/p[1]", "endOffset" : 374, "_id" : { "$oid" : "504fe00767a506020000001d" } } ], "tags" : [], "text" : "Real candle or life spirit or both? Sort of ironic because the last spark from the his candle animates the creature ,thereby extinguishing his own.\nForeshadows the future", "updated" : { "$date" : 1347412051621 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "uuid" : "B19814B8" } -{ "_id" : { "$oid" : "504fe0aa67a506020000001e" }, "id" : "504fe0aa67a506020000001e", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "irony", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "accomplishment", "uuid" : "A91D6AEF", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 55, "end" : "/div[1]/p[1]", "endOffset" : 69, "_id" : { "$oid" : "504fe0aa67a506020000001f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347412138270 }, "created" : { "$date" : 1347412138270 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "504fe0d667a5060200000020" }, "id" : "504fe0d667a5060200000020", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Contrast. So far things were apparently going well. Realization.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "How can I describe my emotions at this catastrophe", "uuid" : "DD4681D0", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 0, "end" : "/div[1]/p[2]", "endOffset" : 50, "_id" : { "$oid" : "504fe0d667a5060200000021" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347412182364 }, "created" : { "$date" : 1347412182364 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "504fe2519d9ada0200000047" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347412561963 }, "groups" : [ "21L.000J" ], "id" : "504fe2519d9ada0200000047", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "quote" : "watery eyes,", "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 465, "end" : "/div[1]/p[2]", "endOffset" : 477, "_id" : { "$oid" : "504fe2519d9ada0200000048" } } ], "tags" : [], "text" : "Overwhelmed by emotion or Physiological malfunction? Similar to the first cry of a baby?\n\nPhlegm? Water of alchemic elements? The Humor associated with winter? ", "updated" : { "$date" : 1347416981683 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "uuid" : "57660A94" } -{ "_id" : { "$oid" : "504fe28d67a5060200000022" }, "id" : "504fe28d67a5060200000022", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Again hint at liver malfunction. Black Lips characterize that.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "straight black lips", "uuid" : "1A82CDCC", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 595, "end" : "/div[1]/p[2]", "endOffset" : 614, "_id" : { "$oid" : "504fe28d67a5060200000023" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347412621851 }, "created" : { "$date" : 1347412621851 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "504fe53ce638270200000002" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347413308208 }, "groups" : [ "21L.003" ], "id" : "504fe53ce638270200000002", "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [] }, "quote" : "novel", "ranges" : [ { "start" : "/div[1]/p[104]", "startOffset" : 1351, "end" : "/div[1]/p[104]", "endOffset" : 1357, "_id" : { "$oid" : "504fe53ce638270200000003" } } ], "tags" : [ "novel", "book" ], "text" : "Austen defends novels. ", "updated" : { "$date" : 1347413325966 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "uuid" : "39A538F3" } -{ "id" : "504fe5b0e638270200000004", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Talk of the gown emphasizes Isabella's superficial character. ", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "my\n\ngown?", "uuid" : "644C4082", "_id" : { "$oid" : "504fe5b0e638270200000004" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [] }, "tags" : [ "gown", "clothes" ], "ranges" : [ { "start" : "/div[1]/p[294]", "startOffset" : 69, "end" : "/div[1]/p[294]", "endOffset" : 78, "_id" : { "$oid" : "504fe5b0e638270200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347413424070 }, "created" : { "$date" : 1347413424070 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fe5dd67a5060200000024", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "The caterpillar is not impressed by the strange things that have happened to Alice.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`I'm afraid I can't put it more clearly,' Alice replied very politely, `for I can't\n\t\t\tunderstand it myself to begin with; and being so many different sizes in a day is very\n\t\t\tconfusing.' \n\t\t\t\n\t\t\t`It isn't,' said the Caterpillar.", "uuid" : "1D22FC2D", "_id" : { "$oid" : "504fe5dd67a5060200000024" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]/p[1]", "startOffset" : 726, "end" : "/div[1]/div[7]/p[1]", "endOffset" : 957, "_id" : { "$oid" : "504fe5dd67a5060200000025" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347413469058 }, "created" : { "$date" : 1347413469058 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fe5e067a5060200000026", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Money plays a huge part in the courtship and alliances. ", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "I hate money", "uuid" : "78CB287B", "_id" : { "$oid" : "504fe5e067a5060200000026" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [] }, "tags" : [ "money" ], "ranges" : [ { "start" : "/div[1]/p[634]", "startOffset" : 265, "end" : "/div[1]/p[634]", "endOffset" : 277, "_id" : { "$oid" : "504fe5e067a5060200000027" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347413472860 }, "created" : { "$date" : 1347413472860 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fe66a67a5060200000028", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Description of Isabella's first impression of the abbey.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "abbey", "uuid" : "3CB29768", "_id" : { "$oid" : "504fe66a67a5060200000028" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [] }, "tags" : [ "abbey" ], "ranges" : [ { "start" : "/div[1]/p[736]", "startOffset" : 253, "end" : "/div[1]/p[736]", "endOffset" : 259, "_id" : { "$oid" : "504fe66a67a5060200000029" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347413610311 }, "created" : { "$date" : 1347413610311 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fe6c367a506020000002a", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Chaises, carriages, and horses are very present. Transportation receives a lot of detail. ", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "chaise and four", "uuid" : "922B95DF", "_id" : { "$oid" : "504fe6c367a506020000002a" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [] }, "tags" : [ "horse", "chaise", "carriage", "transportation" ], "ranges" : [ { "start" : "/div[1]/p[715]", "startOffset" : 1545, "end" : "/div[1]/p[715]", "endOffset" : 1560, "_id" : { "$oid" : "504fe6c367a506020000002b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347413699198 }, "created" : { "$date" : 1347413699198 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fe6f167a506020000002c", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Windows always come up in architectural descriptions.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Gothic windows.", "uuid" : "7EF0DE1D", "_id" : { "$oid" : "504fe6f167a506020000002c" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [] }, "tags" : [ "window" ], "ranges" : [ { "start" : "/div[1]/p[735]", "startOffset" : 409, "end" : "/div[1]/p[735]", "endOffset" : 424, "_id" : { "$oid" : "504fe6f167a506020000002d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347413745254 }, "created" : { "$date" : 1347413745254 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fe6fe67a506020000002e", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "windows", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "windows", "uuid" : "CE1F90E9", "_id" : { "$oid" : "504fe6fe67a506020000002e" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [] }, "tags" : [ "window" ], "ranges" : [ { "start" : "/div[1]/p[737]", "startOffset" : 487, "end" : "/div[1]/p[737]", "endOffset" : 494, "_id" : { "$oid" : "504fe6fe67a506020000002f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347413758296 }, "created" : { "$date" : 1347413758296 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fe74067a5060200000030", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Windows at Henry's house are different from those at Northanger Abbey", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "windows", "uuid" : "734F5703", "_id" : { "$oid" : "504fe74067a5060200000030" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [] }, "tags" : [ "window" ], "ranges" : [ { "start" : "/div[1]/p[905]", "startOffset" : 508, "end" : "/div[1]/p[905]", "endOffset" : 516, "_id" : { "$oid" : "504fe74067a5060200000031" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347413824738 }, "created" : { "$date" : 1347413824738 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fe75de638270200000006", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "The way the candle behaves could have some signficance.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "candle", "uuid" : "8D0E10F7", "_id" : { "$oid" : "504fe75de638270200000006" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [] }, "tags" : [ "candle" ], "ranges" : [ { "start" : "/div[1]/p[749]", "startOffset" : 1557, "end" : "/div[1]/p[749]", "endOffset" : 1564, "_id" : { "$oid" : "504fe75de638270200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347413853960 }, "created" : { "$date" : 1347413853960 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fe783e638270200000008", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Love of flowers might shed some light on relationship between Henry and Catherine.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "flowers", "uuid" : "8301F289", "_id" : { "$oid" : "504fe783e638270200000008" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [] }, "tags" : [ "flower" ], "ranges" : [ { "start" : "/div[1]/p[758]", "startOffset" : 218, "end" : "/div[1]/p[758]", "endOffset" : 225, "_id" : { "$oid" : "504fe783e638270200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347413891592 }, "created" : { "$date" : 1347413891592 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fe7a267a5060200000032", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Letter from James to Catherine", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "\"Dear Catherine,", "uuid" : "7E5FCB2D", "_id" : { "$oid" : "504fe7a267a5060200000032" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [] }, "tags" : [ "letter" ], "ranges" : [ { "start" : "/div[1]/p[848]", "startOffset" : 2, "end" : "/div[1]/p[848]", "endOffset" : 18, "_id" : { "$oid" : "504fe7a267a5060200000033" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347413922240 }, "created" : { "$date" : 1347413922240 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fe7b9e63827020000000a", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Letter from Isabella", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "My dearest Catherine", "uuid" : "340FD7F9", "_id" : { "$oid" : "504fe7b9e63827020000000a" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [] }, "tags" : [ "letter" ], "ranges" : [ { "start" : "/div[1]/p[915]", "startOffset" : 2, "end" : "/div[1]/p[915]", "endOffset" : 22, "_id" : { "$oid" : "504fe7b9e63827020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347413945603 }, "created" : { "$date" : 1347413945603 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fe7d6e63827020000000c", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "letter between Eleanor and Catherine", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "letter", "uuid" : "934EFF43", "_id" : { "$oid" : "504fe7d6e63827020000000c" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [] }, "tags" : [ "letter" ], "ranges" : [ { "start" : "/div[1]/p[957]", "startOffset" : 182, "end" : "/div[1]/p[957]", "endOffset" : 188, "_id" : { "$oid" : "504fe7d6e63827020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347413974168 }, "created" : { "$date" : 1347413974168 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fe7e567a5060200000034", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Novel - Udolpho", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Udolpho", "uuid" : "5E6F08D6", "_id" : { "$oid" : "504fe7e567a5060200000034" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [] }, "tags" : [ "novel" ], "ranges" : [ { "start" : "/div[1]/p[108]", "startOffset" : 658, "end" : "/div[1]/p[108]", "endOffset" : 665, "_id" : { "$oid" : "504fe7e567a5060200000035" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347413989483 }, "created" : { "$date" : 1347413989483 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fe7f0e63827020000000e", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Novel - Camilla", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Camilla", "uuid" : "3785D89E", "_id" : { "$oid" : "504fe7f0e63827020000000e" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [] }, "tags" : [ "novel" ], "ranges" : [ { "start" : "/div[1]/p[187]", "startOffset" : 22, "end" : "/div[1]/p[187]", "endOffset" : 29, "_id" : { "$oid" : "504fe7f0e63827020000000f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347414000910 }, "created" : { "$date" : 1347414000910 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504fe802e638270200000010", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Instructional book? The Mirror.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "The Mirror", "uuid" : "FCF8C0AA", "_id" : { "$oid" : "504fe802e638270200000010" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [] }, "tags" : [ "book", "novel" ], "ranges" : [ { "start" : "/div[1]/p[994]", "startOffset" : 160, "end" : "/div[1]/p[994]", "endOffset" : 170, "_id" : { "$oid" : "504fe802e638270200000011" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347414018705 }, "created" : { "$date" : 1347414018705 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "504feb6c67a5060200000036" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347414892906 }, "groups" : [ "21L.448J" ], "id" : "504feb6c67a5060200000036", "permissions" : { "admin" : [ "mkel@mit.edu" ], "delete" : [ "mkel@mit.edu" ], "read" : [], "update" : [ "mkel@mit.edu" ] }, "quote" : "`I wish the creatures wouldn't be so easily offended!'", "ranges" : [ { "start" : "/div[1]/div[7]/p[1]", "startOffset" : 5696, "end" : "/div[1]/div[7]/p[1]", "endOffset" : 5751, "_id" : { "$oid" : "504fffda67a5060200000043" } } ], "tags" : [], "text" : "A number of the creatures that Alice encounters are both rude and easily offended. Even more peculiar than this is that (at least until chapter 7) we don't see any two animals arguing. Alice is always involved in the arguments, despite the fact that she is both less rude and more tolerant than many of the creatures we encounter.", "updated" : { "$date" : 1347420122948 }, "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "user" : "mkel@mit.edu", "username" : "Michael K.", "uuid" : "6D19CA99" } -{ "__v" : 1, "_id" : { "$oid" : "504fed78e638270200000012" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347415416250 }, "groups" : [ "21L.448J" ], "id" : "504fed78e638270200000012", "permissions" : { "admin" : [ "mpd91@mit.edu" ], "delete" : [ "mpd91@mit.edu" ], "read" : [], "update" : [ "mpd91@mit.edu" ] }, "quote" : "Why the fact\n\t\t\tis, you see, Miss, this here ought to have been a RED rose-tree, and we put a white one in\n\t\t\tby mistake; and if the Queen was to find it out, we should all have our heads cut off, you\n\t\t\tknow.", "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 1382, "end" : "/div[1]/div[3]", "endOffset" : 1591, "_id" : { "$oid" : "504fed78e638270200000013" } } ], "tags" : [], "text" : "The Queen likes her rules followed to the tee, and when they aren't, the only punishment is an excessively severe one: beheading. This makes me think that Carroll is trying to mock the way that rules can be used too excessively and enforced too severely. If they are followed too closely, in some cases, they can take the joy out of life.", "updated" : { "$date" : 1347415974770 }, "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "user" : "mpd91@mit.edu", "username" : "Michael D.", "uuid" : "496236F4" } -{ "id" : "504fee32e638270200000014", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Another example of the Queen being excessive ", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "The Queen's argument was, that if something wasn't done about it in less than no time\n\t\t\tshe'd have everybody executed, all round.", "uuid" : "504EFA1D", "_id" : { "$oid" : "504fee32e638270200000014" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 13772, "end" : "/div[1]/div[3]", "endOffset" : 13903, "_id" : { "$oid" : "504fee32e638270200000015" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347415602154 }, "created" : { "$date" : 1347415602154 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "504feff0e638270200000016" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347416048734 }, "groups" : [ "21L.003" ], "id" : "504feff0e638270200000016", "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "quote" : "a large\n\nhigh chest, standing back in a deep recess on one side of the fireplace.\n\nThe sight of it made her start; and, forgetting everything else, she\n\nstood gazing on it in motionless wonder, while these thoughts crossed\n\nher:\n\n\n\n\n\n\"This is strange indeed! I did not expect such a sight as this! An\n\nimmense heavy chest! What can it hold? Why should it be placed here?\n\nPushed back too, as if meant to be out of sight! I will look into\n\nit—cost me what it may, I will look into it—and directly too—by\n\ndaylight. If I stay till evening my candle may go out.\" She advanced and\n\nexamined it closely: it was of cedar, curiously inlaid with some darker\n\nwood, and raised, about a foot from the ground, on a carved stand of the\n\nsame. The lock was silver, though tarnished from age; at each end\n\nwere the imperfect remains of handles also of silver, broken perhaps\n\nprematurely by some strange violence; and, on the centre of the lid, was\n\na mysterious cipher, in the same metal. Catherine bent over it intently,\n\nbut without being able to distinguish anything with certainty. She could\n\nnot, in whatever direction she took it, believe the last letter to be\n\na T; and yet that it should be anything else in that house was\n\na circumstance to raise no common degree of astonishment. If not\n\noriginally theirs, by what strange events could it have fallen into the\n\nTilney family?\n\n\n\n\n\nHer fearful curiosity was every moment growing greater; and seizing,\n\nwith trembling hands, the hasp of the lock, she resolved at all hazards\n\nto satisfy herself at least as to its contents. With difficulty, for\n\nsomething seemed to resist her efforts, she raised the lid a few inches;\n\nbut at that moment a sudden knocking at the door of the room made her,\n\nstarting, quit her hold, and the lid closed with alarming violence. This\n\nill-timed intruder was Miss Tilney's maid, sent by her mistress to be of\n\nuse to Miss Morland; and though Catherine immediately dismissed her, it\n\nrecalled her to the sense of what she ought to be doing, and forced her,\n\nin spite of her anxious desire to penetrate this mystery, to proceed in\n\nher dressing without further delay. Her progress was not quick, for her\n\nthoughts and her eyes were still bent on the object so well calculated\n\nto interest and alarm; and though she dared not waste a moment upon\n\na second attempt, she could not remain many paces from the chest. At\n\nlength, however, having slipped one arm into her gown, her toilette\n\nseemed so nearly finished that the impatience of her curiosity might\n\nsafely be indulged. One moment surely might be spared; and, so desperate\n\nshould be the exertion of her strength, that, unless secured by\n\nsupernatural means, the lid in one moment should be thrown back. With\n\nthis spirit she sprang forward, and her confidence did not deceive her.\n\nHer resolute effort threw back the lid, and gave to her astonished eyes\n\nthe view of a white cotton counterpane, properly folded, reposing at one\n\nend of the chest in undisputed possession!", "ranges" : [ { "start" : "/div[1]/p[740]", "startOffset" : 911, "end" : "/div[1]/p[742]", "endOffset" : 1626, "_id" : { "$oid" : "5057f30dcef0a60200000004" } } ], "tags" : [ "chest" ], "text" : "Catherine sees the chest and it sparks her imagination about the origins of it and its contents and what it could mean about the Tilney family", "updated" : { "$date" : 1347941133812 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "kristies@mit.edu", "username" : "Kristie S.", "uuid" : "ADBE25BF" } -{ "id" : "504ff10467a506020000003b", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "rudeness", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "a\n\t\t\tDormouse was sitting between them, fast asleep, and the other two were using it as a\n\t\t\tcushion, resting their elbows on it, and the talking over its head.", "uuid" : "9F829527", "_id" : { "$oid" : "504ff10467a506020000003b" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]/p[1]", "startOffset" : 122, "end" : "/div[1]/div[8]/p[1]", "endOffset" : 282, "_id" : { "$oid" : "504ff10467a506020000003c" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347416324201 }, "created" : { "$date" : 1347416324201 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504ff1f967a506020000003d", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Hatter gives Alice a quick logic lesson.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`I do,' Alice hastily replied; `at least--at least I mean what I say--that's the same\n\t\t\tthing, you know.' \n\t\t\t\n\t\t\t`Not the same thing a bit!' said the Hatter. `You might just as well say that \"I see\n\t\t\twhat I eat\" is the same thing as \"I eat what I see\"!'", "uuid" : "EB205386", "_id" : { "$oid" : "504ff1f967a506020000003d" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]/p[1]", "startOffset" : 1918, "end" : "/div[1]/div[8]/p[1]", "endOffset" : 2175, "_id" : { "$oid" : "504ff1f967a506020000003e" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347416569344 }, "created" : { "$date" : 1347416569344 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504ff7fe67a506020000003f", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Time: someone you want to be on good terms with", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`Ah! that accounts for it,' said the Hatter. `He won't stand beating. Now, if you only\n\t\t\tkept on good terms with him, he'd do almost anything you liked with the clock. For\n\t\t\tinstance, suppose it were nine o'clock in the morning, just time to begin lessons: you'd\n\t\t\tonly have to whisper a hint to Time, and round goes the clock in a twinkling! Half-past\n\t\t\tone, time for dinner!'", "uuid" : "8F5C827F", "_id" : { "$oid" : "504ff7fe67a506020000003f" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]/p[1]", "startOffset" : 5339, "end" : "/div[1]/div[8]/p[1]", "endOffset" : 5721, "_id" : { "$oid" : "504ff7fe67a5060200000040" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347418110763 }, "created" : { "$date" : 1347418110763 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504ff8a067a5060200000041", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "When Alice points out a logical fallacy, they change the subject.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`But what happens when you come to the beginning again?' Alice ventured to ask. \n\t\t\t\n\t\t\t`Suppose we change the subject,' the March Hare interrupted, yawning. `I'm getting tired\n\t\t\tof this. I vote the young lady tells us a story.'", "uuid" : "8CB101DA", "_id" : { "$oid" : "504ff8a067a5060200000041" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]/p[1]", "startOffset" : 7589, "end" : "/div[1]/div[8]/p[1]", "endOffset" : 7819, "_id" : { "$oid" : "504ff8a067a5060200000042" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347418272909 }, "created" : { "$date" : 1347418272909 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "504ff918e63827020000001d", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Alice gets another lesson in logic.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`Take some more tea,' the March Hare said to Alice, very earnestly. \n\t\t\t\n\t\t\t`I've had nothing yet,' Alice replied in an offended tone, `so I can't take more.' \n\t\t\t\n\t\t\t`You mean you can't take LESS,' said the Hatter: `it's very easy to take MORE than\n\t\t\tnothing.'", "uuid" : "95DCB953", "_id" : { "$oid" : "504ff918e63827020000001d" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]/p[1]", "startOffset" : 9104, "end" : "/div[1]/div[8]/p[1]", "endOffset" : 9367, "_id" : { "$oid" : "504ff918e63827020000001e" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347418392398 }, "created" : { "$date" : 1347418392398 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "504ffbfbe63827020000001f" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347419131570 }, "groups" : [ "21L.448J" ], "id" : "504ffbfbe63827020000001f", "permissions" : { "admin" : [ "mkel@mit.edu" ], "delete" : [ "mkel@mit.edu" ], "read" : [], "update" : [ "mkel@mit.edu" ] }, "quote" : "`I don't think--' \n\t\t\t\n\t\t\t`Then you shouldn't talk,' said the Hatter.", "ranges" : [ { "start" : "/div[1]/div[8]/p[1]", "startOffset" : 12266, "end" : "/div[1]/div[8]/p[1]", "endOffset" : 12336, "_id" : { "$oid" : "504ffbfbe638270200000020" } } ], "tags" : [], "text" : "One of the Hatter's many witty jabs at Alice. The Hatter is being rude, but everything he says is technically correct. In general, rudeness in this world is not based on stereotypes or hatred, but rather lack of concern for feelings and social conventions. So far, we haven't seen anyone get in trouble due to rudeness.", "updated" : { "$date" : 1347419634657 }, "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "user" : "mkel@mit.edu", "username" : "Michael K.", "uuid" : "7FDC2998" } -{ "id" : "504fffdf67a5060200000044", "user" : "alex93@mit.edu", "username" : "Alexander O.", "text" : "This seems very much like a Doctor Seuss passage. The hidden context seems very political but is masked with children-oriented characters (e.g. mouse).", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "At last the Mouse, who seemed to be a person of authority among them, called out, `Sit\n\t\t\tdown, all of you, and listen to me! I'LL soon make you dry enough!' They all sat down at\n\t\t\tonce, in a large ring, with the Mouse in the middle", "uuid" : "D84D4F17", "_id" : { "$oid" : "504fffdf67a5060200000044" }, "permissions" : { "delete" : [ "alex93@mit.edu" ], "update" : [ "alex93@mit.edu" ], "admin" : [ "alex93@mit.edu" ], "read" : [ "alex93@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[1]", "startOffset" : 761, "end" : "/div[1]/div[5]/p[1]", "endOffset" : 994, "_id" : { "$oid" : "504fffdf67a5060200000045" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347420127706 }, "created" : { "$date" : 1347420127706 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5050034067a5060200000046", "user" : "alex93@mit.edu", "username" : "Alexander O.", "text" : "This quote shows that the way in which each world is constructed (Alice's Home and Wonderland) is quite different based on the creatures that predominate (humans versus animals). What humans find comforting animals usually don't. This shows the design of the world affects its functionality.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "Nobody seems\n\t\t\tto like her, down here, and I'm sure she's the best cat in the world!", "uuid" : "B95C5E98", "_id" : { "$oid" : "5050034067a5060200000046" }, "permissions" : { "delete" : [ "alex93@mit.edu" ], "update" : [ "alex93@mit.edu" ], "admin" : [ "alex93@mit.edu" ], "read" : [ "alex93@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[1]", "startOffset" : 10656, "end" : "/div[1]/div[5]/p[1]", "endOffset" : 10741, "_id" : { "$oid" : "5050034067a5060200000047" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347420992447 }, "created" : { "$date" : 1347420992447 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505076b3e638270200000022", "user" : "alex93@mit.edu", "username" : "Alexander O.", "text" : "This should be very ironic, seeing as caterpillars are very physically immature creatures. If the caterpillar turns out to be wise, then it shows the completely different design of the creatures in Wonderland.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "Advice from a Caterpillar", "uuid" : "03DD2131", "_id" : { "$oid" : "505076b3e638270200000022" }, "permissions" : { "delete" : [ "alex93@mit.edu" ], "update" : [ "alex93@mit.edu" ], "admin" : [ "alex93@mit.edu" ], "read" : [ "alex93@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]/h4[1]", "startOffset" : 11, "end" : "/div[1]/div[7]/h4[1]", "endOffset" : 36, "_id" : { "$oid" : "505076b3e638270200000023" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347450547553 }, "created" : { "$date" : 1347450547553 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5050d81d67a5060200000048" }, "id" : "5050d81d67a5060200000048", "user" : "cjahn@mit.edu", "username" : "Chantal J.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Wenn die Wörter noch nicht schmecken, kann man sich von Blicken ernähren. Ich fand schnell Zugang zu den Blicken der Menschen.", "uuid" : "6D1F52CE", "permissions" : { "delete" : [ "cjahn@mit.edu" ], "update" : [ "cjahn@mit.edu" ], "admin" : [ "cjahn@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[15]", "startOffset" : 1306, "end" : "/div[1]/div[1]/p[15]", "endOffset" : 1432, "_id" : { "$oid" : "5050d81d67a5060200000049" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347475485207 }, "created" : { "$date" : 1347475485207 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5050d836e638270200000024" }, "id" : "5050d836e638270200000024", "user" : "cjahn@mit.edu", "username" : "Chantal J.", "text" : "Kulturelle Unterschiede?", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Sie wandten sich nicht ab» schützten sich nicht, blickten nicht zurück, so dass ich mich nicht bedroht fühlte.", "uuid" : "418F7054", "permissions" : { "delete" : [ "cjahn@mit.edu" ], "update" : [ "cjahn@mit.edu" ], "admin" : [ "cjahn@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[15]", "startOffset" : 1892, "end" : "/div[1]/div[1]/p[15]", "endOffset" : 2002, "_id" : { "$oid" : "5050d836e638270200000025" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347475510203 }, "created" : { "$date" : 1347475510203 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5050d85de638270200000026" }, "id" : "5050d85de638270200000026", "user" : "cjahn@mit.edu", "username" : "Chantal J.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "fremd, fern, aber nicht verschlossen zu sein schien.", "uuid" : "623F4E11", "permissions" : { "delete" : [ "cjahn@mit.edu" ], "update" : [ "cjahn@mit.edu" ], "admin" : [ "cjahn@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[16]", "startOffset" : 111, "end" : "/div[1]/div[1]/p[16]", "endOffset" : 163, "_id" : { "$oid" : "5050d85de638270200000027" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347475549542 }, "created" : { "$date" : 1347475549542 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5050d89f67a506020000004c" }, "id" : "5050d89f67a506020000004c", "user" : "cjahn@mit.edu", "username" : "Chantal J.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Ich verdanke also mein Gefühl für die deutsche Sprache dem Halbdunkel und dem Geschmack von Kaffee und Kuchen", "uuid" : "7018432F", "permissions" : { "delete" : [ "cjahn@mit.edu" ], "update" : [ "cjahn@mit.edu" ], "admin" : [ "cjahn@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[24]", "startOffset" : 0, "end" : "/div[1]/div[1]/p[24]", "endOffset" : 109, "_id" : { "$oid" : "5050d89f67a506020000004d" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347475615116 }, "created" : { "$date" : 1347475615116 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5050d8cae638270200000028" }, "id" : "5050d8cae638270200000028", "user" : "cjahn@mit.edu", "username" : "Chantal J.", "text" : "Zwischen Sprachen. Kein Kauderwelsch", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Ohne Grenzen gibt es keine Geborgenheit.", "uuid" : "2A5FB05C", "permissions" : { "delete" : [ "cjahn@mit.edu" ], "update" : [ "cjahn@mit.edu" ], "admin" : [ "cjahn@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[28]", "startOffset" : 215, "end" : "/div[1]/div[1]/p[28]", "endOffset" : 255, "_id" : { "$oid" : "5050d8cae638270200000029" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347475658551 }, "created" : { "$date" : 1347475658551 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5050d8d367a506020000004e" }, "id" : "5050d8d367a506020000004e", "user" : "cjahn@mit.edu", "username" : "Chantal J.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Ihre Überwindung gelingt nur, wenn man sie beachtet, wahrnimmt, ernst nimmt und nicht leichtfertig übergeht.", "uuid" : "D6D5A5AA", "permissions" : { "delete" : [ "cjahn@mit.edu" ], "update" : [ "cjahn@mit.edu" ], "admin" : [ "cjahn@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[28]", "startOffset" : 22, "end" : "/div[1]/div[1]/p[28]", "endOffset" : 131, "_id" : { "$oid" : "5050d8d367a506020000004f" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347475667499 }, "created" : { "$date" : 1347475667499 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5050d8e567a5060200000050" }, "id" : "5050d8e567a5060200000050", "user" : "cjahn@mit.edu", "username" : "Chantal J.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Heimatlosigkeit beginnt damit, dass Sprachen keine Heimat mehr haben.", "uuid" : "8396CF68", "permissions" : { "delete" : [ "cjahn@mit.edu" ], "update" : [ "cjahn@mit.edu" ], "admin" : [ "cjahn@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[30]", "startOffset" : 100, "end" : "/div[1]/div[1]/p[30]", "endOffset" : 170, "_id" : { "$oid" : "5050d8e567a5060200000051" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347475685425 }, "created" : { "$date" : 1347475685425 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5050d903e63827020000002a" }, "id" : "5050d903e63827020000002a", "user" : "cjahn@mit.edu", "username" : "Chantal J.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Das Sprachgefühl ist der Kompass zur Heimatfindung", "uuid" : "A1C3C171", "permissions" : { "delete" : [ "cjahn@mit.edu" ], "update" : [ "cjahn@mit.edu" ], "admin" : [ "cjahn@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[34]", "startOffset" : 626, "end" : "/div[1]/div[1]/p[34]", "endOffset" : 676, "_id" : { "$oid" : "5050d903e63827020000002b" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347475715539 }, "created" : { "$date" : 1347475715539 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5050d93067a5060200000052" }, "id" : "5050d93067a5060200000052", "user" : "cjahn@mit.edu", "username" : "Chantal J.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Sprachgefühl kann nicht erlernt, aber empathisch erworben werden. Mit der Fähigkeit, sich in andere hineinzuversetzen, verliert das Eigene den Charakter einer Festung", "uuid" : "1D27C287", "permissions" : { "delete" : [ "cjahn@mit.edu" ], "update" : [ "cjahn@mit.edu" ], "admin" : [ "cjahn@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[38]", "startOffset" : 0, "end" : "/div[1]/div[1]/p[38]", "endOffset" : 166, "_id" : { "$oid" : "5050d93067a5060200000053" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347475760283 }, "created" : { "$date" : 1347475760283 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5050d944e63827020000002e" }, "id" : "5050d944e63827020000002e", "user" : "cjahn@mit.edu", "username" : "Chantal J.", "text" : "Klare Grenzen", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Der Niedergang in einer Gesellschaft beginnt mit der Verwahrlosung der Sprache.", "uuid" : "E2867F1D", "permissions" : { "delete" : [ "cjahn@mit.edu" ], "update" : [ "cjahn@mit.edu" ], "admin" : [ "cjahn@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[40]", "startOffset" : 0, "end" : "/div[1]/div[1]/p[40]", "endOffset" : 80, "_id" : { "$oid" : "5050d944e63827020000002f" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347475780095 }, "created" : { "$date" : 1347475780095 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5050d95b67a5060200000054" }, "id" : "5050d95b67a5060200000054", "user" : "cjahn@mit.edu", "username" : "Chantal J.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Denn was im Sprachengewirr verloren geht, ist die Fähigkeit zum Übersetzen.", "uuid" : "B2E90B76", "permissions" : { "delete" : [ "cjahn@mit.edu" ], "update" : [ "cjahn@mit.edu" ], "admin" : [ "cjahn@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[41]", "startOffset" : 359, "end" : "/div[1]/div[1]/p[41]", "endOffset" : 434, "_id" : { "$oid" : "5050d95b67a5060200000055" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347475803379 }, "created" : { "$date" : 1347475803379 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5050d95fe638270200000030" }, "id" : "5050d95fe638270200000030", "user" : "cjahn@mit.edu", "username" : "Chantal J.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Der Schlüssel für ein Zuhause.", "uuid" : "A13BB4A2", "permissions" : { "delete" : [ "cjahn@mit.edu" ], "update" : [ "cjahn@mit.edu" ], "admin" : [ "cjahn@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[41]", "startOffset" : 592, "end" : "/div[1]/div[1]/p[41]", "endOffset" : 622, "_id" : { "$oid" : "5050d95fe638270200000031" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347475807411 }, "created" : { "$date" : 1347475807411 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5050d99567a5060200000056" }, "id" : "5050d99567a5060200000056", "user" : "cjahn@mit.edu", "username" : "Chantal J.", "text" : "Durch das vermischen verliert man gleichzeitig das Gefühl für beide Sprachen.", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Das Kauderwelsch", "uuid" : "CBDC1EBC", "permissions" : { "delete" : [ "cjahn@mit.edu" ], "update" : [ "cjahn@mit.edu" ], "admin" : [ "cjahn@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[43]", "startOffset" : 344, "end" : "/div[1]/div[1]/p[43]", "endOffset" : 361, "_id" : { "$oid" : "5050d99567a5060200000057" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347475861858 }, "created" : { "$date" : 1347475861858 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5050d9b667a5060200000058" }, "id" : "5050d9b667a5060200000058", "user" : "cjahn@mit.edu", "username" : "Chantal J.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Die Sprache ist die Brücke zwischen dem Denken und dem Empfinden.", "uuid" : "2D0E3E25", "permissions" : { "delete" : [ "cjahn@mit.edu" ], "update" : [ "cjahn@mit.edu" ], "admin" : [ "cjahn@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[46]", "startOffset" : 13, "end" : "/div[1]/div[1]/p[46]", "endOffset" : 78, "_id" : { "$oid" : "5050d9b667a5060200000059" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347475894665 }, "created" : { "$date" : 1347475894665 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5050d9c667a506020000005a" }, "id" : "5050d9c667a506020000005a", "user" : "cjahn@mit.edu", "username" : "Chantal J.", "text" : "Integration", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Ein entspanntes Einleben gibt es nur, wenn sie sich der Sprache ihres Einwanderungslandes annehmen und sich mit ihren Gepflogenheiten und ihrem Erbe vertraut machen.", "uuid" : "5DECE788", "permissions" : { "delete" : [ "cjahn@mit.edu" ], "update" : [ "cjahn@mit.edu" ], "admin" : [ "cjahn@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[48]", "startOffset" : 110, "end" : "/div[1]/div[1]/p[48]", "endOffset" : 276, "_id" : { "$oid" : "5050d9c667a506020000005b" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347475910561 }, "created" : { "$date" : 1347475910561 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5050d9e467a506020000005c" }, "id" : "5050d9e467a506020000005c", "user" : "cjahn@mit.edu", "username" : "Chantal J.", "text" : "Grenzen verschwimmen heutzutage durch Globalisierung", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Die globalisierte Konsumgesellschaft, die internationale Vernetzung des Verkehrs und der Kommunikation machen die Grenzen porö", "uuid" : "A7535A62", "permissions" : { "delete" : [ "cjahn@mit.edu" ], "update" : [ "cjahn@mit.edu" ], "admin" : [ "cjahn@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[49]", "startOffset" : 218, "end" : "/div[1]/div[1]/p[49]", "endOffset" : 344, "_id" : { "$oid" : "5050d9e467a506020000005d" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347475940598 }, "created" : { "$date" : 1347475940598 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5050d9eee638270200000032" }, "id" : "5050d9eee638270200000032", "user" : "cjahn@mit.edu", "username" : "Chantal J.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Und Sprache ist einer dieser Rückzugsorte", "uuid" : "763D72DB", "permissions" : { "delete" : [ "cjahn@mit.edu" ], "update" : [ "cjahn@mit.edu" ], "admin" : [ "cjahn@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[51]", "startOffset" : 485, "end" : "/div[1]/div[1]/p[51]", "endOffset" : 526, "_id" : { "$oid" : "5050d9eee638270200000033" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347475949999 }, "created" : { "$date" : 1347475949999 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5050e144e638270200000034" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347477828664 }, "groups" : [ "21F.414" ], "id" : "5050e144e638270200000034", "permissions" : { "delete" : [ "maby@mit.edu" ], "update" : [ "maby@mit.edu" ], "admin" : [ "maby@mit.edu" ], "read" : [ "maby@mit.edu" ] }, "quote" : "Dieses Deutschland war für mich zunächst einmal kein Land, sondern eine fremde Sprache, die sich lustig anhörte", "ranges" : [ { "start" : "/div[1]/div[1]/p[15]", "startOffset" : 1193, "end" : "/div[1]/div[1]/p[15]", "endOffset" : 1304, "_id" : { "$oid" : "50532ce2ffb2770200000059" } } ], "tags" : [], "text" : "Die Sprache ist irgendwie am wichstigsten", "updated" : { "$date" : 1347628258150 }, "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "user" : "maby@mit.edu", "username" : "Madeline A.", "uuid" : "68763D3E" } -{ "__v" : 1, "_id" : { "$oid" : "5050e1542ce64f0200000002" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347477844349 }, "groups" : [ "21F.414" ], "id" : "5050e1542ce64f0200000002", "permissions" : { "delete" : [ "maby@mit.edu" ], "update" : [ "maby@mit.edu" ], "admin" : [ "maby@mit.edu" ], "read" : [ "maby@mit.edu" ] }, "quote" : "Die Menschen waren nicht nur fremd, sie waren Fremde", "ranges" : [ { "start" : "/div[1]/div[1]/p[15]", "startOffset" : 1619, "end" : "/div[1]/div[1]/p[15]", "endOffset" : 1671, "_id" : { "$oid" : "50532d152b76cf020000003a" } } ], "tags" : [], "text" : "Eine andere Welt", "updated" : { "$date" : 1347628309504 }, "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "user" : "maby@mit.edu", "username" : "Madeline A.", "uuid" : "DF03DC5F" } -{ "__v" : 1, "_id" : { "$oid" : "5050e1de2ce64f0200000004" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347477982630 }, "groups" : [ "21F.414" ], "id" : "5050e1de2ce64f0200000004", "permissions" : { "delete" : [ "maby@mit.edu" ], "update" : [ "maby@mit.edu" ], "admin" : [ "maby@mit.edu" ], "read" : [ "maby@mit.edu" ] }, "quote" : "chmeckten die Wörter nach Kaffee und Kuchen", "ranges" : [ { "start" : "/div[1]/div[1]/p[20]", "startOffset" : 573, "end" : "/div[1]/div[1]/p[20]", "endOffset" : 616, "_id" : { "$oid" : "50532cf3ffb277020000005a" } } ], "tags" : [], "text" : "Geschmack von Wörter", "updated" : { "$date" : 1347628275110 }, "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "user" : "maby@mit.edu", "username" : "Madeline A.", "uuid" : "1A2CEA43" } -{ "id" : "5050e2412ce64f0200000006", "user" : "maby@mit.edu", "username" : "Madeline A.", "text" : "Nachtruhe", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Die Dunkelheit hat dich langsamer und aufmerksamer gemacht, und wir sind ja auch gut vorangekommen, wie man sieht.", "uuid" : "A3392C26", "_id" : { "$oid" : "5050e2412ce64f0200000006" }, "permissions" : { "delete" : [ "maby@mit.edu" ], "update" : [ "maby@mit.edu" ], "admin" : [ "maby@mit.edu" ], "read" : [ "maby@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[22]", "startOffset" : 478, "end" : "/div[1]/div[1]/p[22]", "endOffset" : 592, "_id" : { "$oid" : "5050e2412ce64f0200000007" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347478081558 }, "created" : { "$date" : 1347478081558 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5050e2912ce64f0200000008", "user" : "maby@mit.edu", "username" : "Madeline A.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Wer aber in den Genuss einer fremden Sprache kommen möchte, braucht Hingabe.", "uuid" : "D9B75C34", "_id" : { "$oid" : "5050e2912ce64f0200000008" }, "permissions" : { "delete" : [ "maby@mit.edu" ], "update" : [ "maby@mit.edu" ], "admin" : [ "maby@mit.edu" ], "read" : [ "maby@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[24]", "startOffset" : 500, "end" : "/div[1]/div[1]/p[24]", "endOffset" : 576, "_id" : { "$oid" : "5050e2912ce64f0200000009" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347478161894 }, "created" : { "$date" : 1347478161894 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5050e332e638270200000038" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347478322830 }, "groups" : [ "21F.414" ], "id" : "5050e332e638270200000038", "permissions" : { "delete" : [ "maby@mit.edu" ], "update" : [ "maby@mit.edu" ], "admin" : [ "maby@mit.edu" ], "read" : [ "maby@mit.edu" ] }, "quote" : "Eine zweisprachige Wohnung mit geregelten Grenzen, die mich zu einem zweisprachigen Menschen gemacht hat.", "ranges" : [ { "start" : "/div[1]/div[1]/p[27]", "startOffset" : 74, "end" : "/div[1]/div[1]/p[27]", "endOffset" : 179, "_id" : { "$oid" : "50532bb32b76cf0200000034" } } ], "tags" : [], "text" : "Grenzen", "updated" : { "$date" : 1347627955282 }, "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "user" : "maby@mit.edu", "username" : "Madeline A.", "uuid" : "5A021B28" } -{ "__v" : 1, "_id" : { "$oid" : "5050e352e63827020000003a" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347478354371 }, "groups" : [ "21F.414" ], "id" : "5050e352e63827020000003a", "permissions" : { "delete" : [ "maby@mit.edu" ], "update" : [ "maby@mit.edu" ], "admin" : [ "maby@mit.edu" ], "read" : [ "maby@mit.edu" ] }, "quote" : "Aber eine Grenze, die zugleich eine Mauer ist, wird früher oder später aufhören zu existieren.", "ranges" : [ { "start" : "/div[1]/div[1]/p[28]", "startOffset" : 256, "end" : "/div[1]/div[1]/p[28]", "endOffset" : 350, "_id" : { "$oid" : "50532bd1ffb2770200000056" } } ], "tags" : [], "text" : "Verschiedene Sorten von Grenzen", "updated" : { "$date" : 1347627985893 }, "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "user" : "maby@mit.edu", "username" : "Madeline A.", "uuid" : "82C043F7" } -{ "__v" : 1, "_id" : { "$oid" : "5050e391e63827020000003c" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347478417886 }, "groups" : [ "21F.414" ], "id" : "5050e391e63827020000003c", "permissions" : { "delete" : [ "maby@mit.edu" ], "update" : [ "maby@mit.edu" ], "admin" : [ "maby@mit.edu" ], "read" : [ "maby@mit.edu" ] }, "quote" : "Sprachen sprechen die Sinne an. Sie klingen, sie schmecken.", "ranges" : [ { "start" : "/div[1]/div[1]/p[30]", "startOffset" : 291, "end" : "/div[1]/div[1]/p[30]", "endOffset" : 350, "_id" : { "$oid" : "50532c14ffb2770200000057" } } ], "tags" : [], "text" : "Sprache und Sinne", "updated" : { "$date" : 1347628052162 }, "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "user" : "maby@mit.edu", "username" : "Madeline A.", "uuid" : "9866FCB9" } -{ "__v" : 1, "_id" : { "$oid" : "5050e407e63827020000003e" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347478535897 }, "groups" : [ "21F.414" ], "id" : "5050e407e63827020000003e", "permissions" : { "delete" : [ "maby@mit.edu" ], "update" : [ "maby@mit.edu" ], "admin" : [ "maby@mit.edu" ], "read" : [ "maby@mit.edu" ] }, "quote" : "Beim Lernprozess wird das Sprachgefühl überlagert. Sprache bekommt eine Schutzhaut.", "ranges" : [ { "start" : "/div[1]/div[1]/p[33]", "startOffset" : 491, "end" : "/div[1]/div[1]/p[33]", "endOffset" : 574, "_id" : { "$oid" : "50532c622b76cf0200000037" } } ], "tags" : [], "text" : "Schutzhaut der Sprache", "updated" : { "$date" : 1347628147239 }, "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "user" : "maby@mit.edu", "username" : "Madeline A.", "uuid" : "524A10D1" } -{ "id" : "5050e46f2ce64f020000000a", "user" : "maby@mit.edu", "username" : "Madeline A.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Zweisprachigkeit setzt das Übersetzen voraus. Das Leben mit nur einer Sprache genügt dem Übersetzer nicht.", "uuid" : "67E34899", "_id" : { "$oid" : "5050e46f2ce64f020000000a" }, "permissions" : { "delete" : [ "maby@mit.edu" ], "update" : [ "maby@mit.edu" ], "admin" : [ "maby@mit.edu" ], "read" : [ "maby@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[35]", "startOffset" : 634, "end" : "/div[1]/div[1]/p[35]", "endOffset" : 740, "_id" : { "$oid" : "5050e46f2ce64f020000000b" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347478639897 }, "created" : { "$date" : 1347478639897 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5050e4ca2ce64f020000000c" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347478730350 }, "groups" : [ "21F.414" ], "id" : "5050e4ca2ce64f020000000c", "permissions" : { "delete" : [ "maby@mit.edu" ], "update" : [ "maby@mit.edu" ], "admin" : [ "maby@mit.edu" ], "read" : [ "maby@mit.edu" ] }, "quote" : "Wörter haben zwei Schichten. An der Oberfläche nistet die lexikalische Bedeutung, das Sinnhafte, tiefer im Inneren das Wesentliche des Wortes, sein ursprünglicher, vor jeder Deutung existierender Kern.", "ranges" : [ { "start" : "/div[1]/div[1]/p[36]", "startOffset" : 257, "end" : "/div[1]/div[1]/p[36]", "endOffset" : 458, "_id" : { "$oid" : "50532c072b76cf0200000035" } } ], "tags" : [], "text" : "Dualität von Wörter", "updated" : { "$date" : 1347628039167 }, "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "user" : "maby@mit.edu", "username" : "Madeline A.", "uuid" : "07249ABA" } -{ "__v" : 1, "_id" : { "$oid" : "5050e5012ce64f020000000e" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347478785711 }, "groups" : [ "21F.414" ], "id" : "5050e5012ce64f020000000e", "permissions" : { "delete" : [ "maby@mit.edu" ], "update" : [ "maby@mit.edu" ], "admin" : [ "maby@mit.edu" ], "read" : [ "maby@mit.edu" ] }, "quote" : "Das erlernte Deutsch bekommt einen mechanischen Klang. Die Kultur der Sprache bleibt fremd.", "ranges" : [ { "start" : "/div[1]/div[1]/p[37]", "startOffset" : 508, "end" : "/div[1]/div[1]/p[37]", "endOffset" : 599, "_id" : { "$oid" : "50532c952b76cf0200000038" } } ], "tags" : [], "text" : "Wie muss mann eine Sprache lernen?", "updated" : { "$date" : 1347628181957 }, "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "user" : "maby@mit.edu", "username" : "Madeline A.", "uuid" : "8760C77D" } -{ "__v" : 1, "_id" : { "$oid" : "5050e532e638270200000040" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347478834074 }, "groups" : [ "21F.414" ], "id" : "5050e532e638270200000040", "permissions" : { "delete" : [ "maby@mit.edu" ], "update" : [ "maby@mit.edu" ], "admin" : [ "maby@mit.edu" ], "read" : [ "maby@mit.edu" ] }, "quote" : "Bildungspolitikern ist das Sprechen eines akzentfreien und korrekten Deutsch mehr als genug. Für jenen aber, der in Deutschland zu Hause sein möchte, kann das nicht genug sein, denn er sehnt sich nach Heimat, die ihm nur das Sprachgefühl geben kann.", "ranges" : [ { "start" : "/div[1]/div[1]/p[37]", "startOffset" : 927, "end" : "/div[1]/div[1]/p[37]", "endOffset" : 1176, "_id" : { "$oid" : "50532c9cffb2770200000058" } } ], "tags" : [], "text" : "Wie muss mann eine Sprache lernen?", "updated" : { "$date" : 1347628188190 }, "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "user" : "maby@mit.edu", "username" : "Madeline A.", "uuid" : "962860ED" } -{ "__v" : 1, "_id" : { "$oid" : "5050e58a2ce64f0200000010" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347478922269 }, "groups" : [ "21F.414" ], "id" : "5050e58a2ce64f0200000010", "permissions" : { "delete" : [ "maby@mit.edu" ], "update" : [ "maby@mit.edu" ], "admin" : [ "maby@mit.edu" ], "read" : [ "maby@mit.edu" ] }, "quote" : "Jugendliche höre, die Deutsch, Arabisch, Türkisch miteinander vermischen, keiner der Sprachen wirklich zuhörend, keiner zugehörig, fühle ich eine tiefe Verletzung in mir.", "ranges" : [ { "start" : "/div[1]/div[1]/p[40]", "startOffset" : 129, "end" : "/div[1]/div[1]/p[40]", "endOffset" : 301, "_id" : { "$oid" : "50532bbeffb2770200000055" } } ], "tags" : [], "text" : "Mischung", "updated" : { "$date" : 1347627966686 }, "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "user" : "maby@mit.edu", "username" : "Madeline A.", "uuid" : "525D13A2" } -{ "__v" : 1, "_id" : { "$oid" : "5050e5ed2ce64f0200000012" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347479021883 }, "groups" : [ "21F.414" ], "id" : "5050e5ed2ce64f0200000012", "permissions" : { "delete" : [ "maby@mit.edu" ], "update" : [ "maby@mit.edu" ], "admin" : [ "maby@mit.edu" ], "read" : [ "maby@mit.edu" ] }, "quote" : "Es verschwimmt das Gefühl für die Wörter, die nicht übersetzt werden können. Der Schlüssel für ein Zuhause.", "ranges" : [ { "start" : "/div[1]/div[1]/p[41]", "startOffset" : 515, "end" : "/div[1]/div[1]/p[41]", "endOffset" : 622, "_id" : { "$oid" : "50532cac2b76cf0200000039" } } ], "tags" : [], "text" : "Sicherheit in der Sprache", "updated" : { "$date" : 1347628204188 }, "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "user" : "maby@mit.edu", "username" : "Madeline A.", "uuid" : "6D9657C1" } -{ "__v" : 1, "_id" : { "$oid" : "5050e62de638270200000042" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347479085421 }, "groups" : [ "21F.414" ], "id" : "5050e62de638270200000042", "permissions" : { "delete" : [ "maby@mit.edu" ], "update" : [ "maby@mit.edu" ], "admin" : [ "maby@mit.edu" ], "read" : [ "maby@mit.edu" ] }, "quote" : "Das Kauderwelsch ist kein Kommunikationsmodell, es ist ein Kriegsruf.", "ranges" : [ { "start" : "/div[1]/div[1]/p[43]", "startOffset" : 345, "end" : "/div[1]/div[1]/p[43]", "endOffset" : 415, "_id" : { "$oid" : "50532c4b2b76cf0200000036" } } ], "tags" : [], "text" : "Kauderwelsch = Kriegsruf (Grenzen)", "updated" : { "$date" : 1347628107769 }, "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "user" : "maby@mit.edu", "username" : "Madeline A.", "uuid" : "15770461" } -{ "id" : "5050e7082ce64f0200000014", "user" : "maby@mit.edu", "username" : "Madeline A.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Die sozialen Verhältnisse und die gesellschaftlichen Bezüge verschwinden hinter konstruierten nationalen und religiösen Identitäten.", "uuid" : "14DAE9EF", "_id" : { "$oid" : "5050e7082ce64f0200000014" }, "permissions" : { "delete" : [ "maby@mit.edu" ], "update" : [ "maby@mit.edu" ], "admin" : [ "maby@mit.edu" ], "read" : [ "maby@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[49]", "startOffset" : 859, "end" : "/div[1]/div[1]/p[49]", "endOffset" : 991, "_id" : { "$oid" : "5050e7082ce64f0200000015" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347479304931 }, "created" : { "$date" : 1347479304931 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50511e0e2ce64f020000001d", "user" : "fendt@mit.edu", "username" : "Kurt F.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Ich verdanke also mein Gefühl für die deutsche Sprache dem Halbdunkel und dem Geschmack von Kaffee und Kuchen, vorzugsweise Apfelkuchen.", "uuid" : "D19BA98A", "_id" : { "$oid" : "50511e0e2ce64f020000001d" }, "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[24]", "startOffset" : 0, "end" : "/div[1]/div[1]/p[24]", "endOffset" : 136, "_id" : { "$oid" : "50511e0e2ce64f020000001e" } } ], "groups" : [ "Testing", "21F.414", "Fall 2012" ], "updated" : { "$date" : 1347493390621 }, "created" : { "$date" : 1347493390621 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50511e31e63827020000004a", "user" : "fendt@mit.edu", "username" : "Kurt F.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Deutsch und Türkisch vertragen sich wunderbar, wenn sie eine Heimat haben, ein eigenes Territorium. Heimatlosigkeit beginnt damit, dass Sprachen keine Heimat mehr haben.", "uuid" : "8CAC2E13", "_id" : { "$oid" : "50511e31e63827020000004a" }, "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[30]", "startOffset" : 0, "end" : "/div[1]/div[1]/p[30]", "endOffset" : 170, "_id" : { "$oid" : "50511e31e63827020000004b" } } ], "groups" : [ "Testing", "21F.414", "Fall 2012" ], "updated" : { "$date" : 1347493425566 }, "created" : { "$date" : 1347493425566 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50511e3d2ce64f020000001f", "user" : "fendt@mit.edu", "username" : "Kurt F.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Es ist eine Berührung des Bewusst-seins.", "uuid" : "FC0189B2", "_id" : { "$oid" : "50511e3d2ce64f020000001f" }, "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[33]", "startOffset" : 391, "end" : "/div[1]/div[1]/p[33]", "endOffset" : 432, "_id" : { "$oid" : "50511e3d2ce64f0200000020" } } ], "groups" : [ "Testing", "21F.414", "Fall 2012" ], "updated" : { "$date" : 1347493437346 }, "created" : { "$date" : 1347493437346 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50511e462ce64f0200000021", "user" : "fendt@mit.edu", "username" : "Kurt F.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Aber unter der Haut existiert weiterhin die Fähigkeit, Sprache sinnlich zu genießen. Wenn diese Fähigkeit eingeschränkt ist, wird der Sprachgebrauch mechanisch.", "uuid" : "CD56C179", "_id" : { "$oid" : "50511e462ce64f0200000021" }, "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[33]", "startOffset" : 575, "end" : "/div[1]/div[1]/p[33]", "endOffset" : 735, "_id" : { "$oid" : "50511e462ce64f0200000022" } } ], "groups" : [ "Testing", "21F.414", "Fall 2012" ], "updated" : { "$date" : 1347493446009 }, "created" : { "$date" : 1347493446009 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50511e632ce64f0200000023", "user" : "fendt@mit.edu", "username" : "Kurt F.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Schlüssel zur Empathie,", "uuid" : "99E50C68", "_id" : { "$oid" : "50511e632ce64f0200000023" }, "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[35]", "startOffset" : 3, "end" : "/div[1]/div[1]/p[35]", "endOffset" : 27, "_id" : { "$oid" : "50511e632ce64f0200000024" } } ], "groups" : [ "Testing", "21F.414", "Fall 2012" ], "updated" : { "$date" : 1347493475064 }, "created" : { "$date" : 1347493475064 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50511e852ce64f0200000025", "user" : "fendt@mit.edu", "username" : "Kurt F.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Sprachgefühl kann nicht erlernt, aber empathisch erworben werden.", "uuid" : "48A1BB10", "_id" : { "$oid" : "50511e852ce64f0200000025" }, "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[38]", "startOffset" : 0, "end" : "/div[1]/div[1]/p[38]", "endOffset" : 65, "_id" : { "$oid" : "50511e852ce64f0200000026" } } ], "groups" : [ "Testing", "21F.414", "Fall 2012" ], "updated" : { "$date" : 1347493509175 }, "created" : { "$date" : 1347493509175 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50511e90e63827020000004c", "user" : "fendt@mit.edu", "username" : "Kurt F.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "verliert das Eigene den Charakter einer Festung.", "uuid" : "1BA66B74", "_id" : { "$oid" : "50511e90e63827020000004c" }, "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[38]", "startOffset" : 119, "end" : "/div[1]/div[1]/p[38]", "endOffset" : 167, "_id" : { "$oid" : "50511e90e63827020000004d" } } ], "groups" : [ "Testing", "21F.414", "Fall 2012" ], "updated" : { "$date" : 1347493520105 }, "created" : { "$date" : 1347493520105 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50511e9ce63827020000004e", "user" : "fendt@mit.edu", "username" : "Kurt F.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Der Niedergang in einer Gesellschaft beginnt mit der Verwahrlosung der Sprache.", "uuid" : "BD0817A7", "_id" : { "$oid" : "50511e9ce63827020000004e" }, "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[40]", "startOffset" : 0, "end" : "/div[1]/div[1]/p[40]", "endOffset" : 80, "_id" : { "$oid" : "50511e9ce63827020000004f" } } ], "groups" : [ "Testing", "21F.414", "Fall 2012" ], "updated" : { "$date" : 1347493532918 }, "created" : { "$date" : 1347493532918 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50511ec12ce64f0200000027", "user" : "fendt@mit.edu", "username" : "Kurt F.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Keine Sprache ersetzt die andere.", "uuid" : "FD15633A", "_id" : { "$oid" : "50511ec12ce64f0200000027" }, "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[45]", "startOffset" : 80, "end" : "/div[1]/div[1]/p[45]", "endOffset" : 113, "_id" : { "$oid" : "50511ec12ce64f0200000028" } } ], "groups" : [ "Testing", "21F.414", "Fall 2012" ], "updated" : { "$date" : 1347493569374 }, "created" : { "$date" : 1347493569374 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50511ed4e638270200000050", "user" : "fendt@mit.edu", "username" : "Kurt F.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Integration ist keine mechanische Anpassung. Sie ist, wenn sie Erfolg versprechen soll, ein Einfühlen, ein Hineindenken.", "uuid" : "FA926978", "_id" : { "$oid" : "50511ed4e638270200000050" }, "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[48]", "startOffset" : 276, "end" : "/div[1]/div[1]/p[48]", "endOffset" : 397, "_id" : { "$oid" : "50511ed4e638270200000051" } } ], "groups" : [ "Testing", "21F.414", "Fall 2012" ], "updated" : { "$date" : 1347493588454 }, "created" : { "$date" : 1347493588454 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50511edc2ce64f0200000029", "user" : "fendt@mit.edu", "username" : "Kurt F.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Grenzen porös", "uuid" : "0062652D", "_id" : { "$oid" : "50511edc2ce64f0200000029" }, "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[49]", "startOffset" : 331, "end" : "/div[1]/div[1]/p[49]", "endOffset" : 345, "_id" : { "$oid" : "50511edc2ce64f020000002a" } } ], "groups" : [ "Testing", "21F.414", "Fall 2012" ], "updated" : { "$date" : 1347493596297 }, "created" : { "$date" : 1347493596297 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50511ee3e638270200000052", "user" : "fendt@mit.edu", "username" : "Kurt F.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Und Sprache ist einer dieser Rückzugsorte.", "uuid" : "C9882A99", "_id" : { "$oid" : "50511ee3e638270200000052" }, "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[51]", "startOffset" : 485, "end" : "/div[1]/div[1]/p[51]", "endOffset" : 527, "_id" : { "$oid" : "50511ee3e638270200000053" } } ], "groups" : [ "Testing", "21F.414", "Fall 2012" ], "updated" : { "$date" : 1347493603024 }, "created" : { "$date" : 1347493603024 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50511f442ce64f020000002b", "user" : "fendt@mit.edu", "username" : "Kurt F.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "hatte sich mir eingeprägt: die Nachtruhe, die si", "uuid" : "77ED4476", "_id" : { "$oid" : "50511f442ce64f020000002b" }, "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[18]", "startOffset" : 230, "end" : "/div[1]/div[1]/p[18]", "endOffset" : 279, "_id" : { "$oid" : "50511f442ce64f020000002c" } } ], "groups" : [ "Testing", "21F.414", "Fall 2012" ], "updated" : { "$date" : 1347493700885 }, "created" : { "$date" : 1347493700885 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50515db475da710200000002", "user" : "njl@mit.edu", "username" : "Nicholas L.", "text" : "Choice of words interesting. The instruments literally beckon life. The collection of instruments is fairly analogous to the conjuring of spirits in a fantastical, magical sense.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "instruments of life", "uuid" : "10A6AEDA", "_id" : { "$oid" : "50515db475da710200000002" }, "permissions" : { "delete" : [ "njl@mit.edu" ], "update" : [ "njl@mit.edu" ], "admin" : [ "njl@mit.edu" ], "read" : [ "njl@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 146, "end" : "/div[1]/p[1]", "endOffset" : 165, "_id" : { "$oid" : "50515db475da710200000003" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347509684040 }, "created" : { "$date" : 1347509684040 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50515e102ce64f020000002d" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347509776551 }, "groups" : [ "21L.000J" ], "id" : "50515e102ce64f020000002d", "permissions" : { "delete" : [ "njl@mit.edu" ], "update" : [ "njl@mit.edu" ], "admin" : [ "njl@mit.edu" ], "read" : [ "njl@mit.edu" ] }, "quote" : "dismally", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 312, "end" : "/div[1]/p[1]", "endOffset" : 320, "_id" : { "$oid" : "50515e102ce64f020000002e" } } ], "tags" : [], "text" : "Connotation of destitution. As the narrative is being told \"after-the-fact\" the mood of the rain takes on the emotion of the narrator, Frankenstein, in retrospect to the events to follow.", "updated" : { "$date" : 1347509796713 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "njl@mit.edu", "username" : "Nicholas L.", "uuid" : "6FF8CE24" } -{ "__v" : 0, "_id" : { "$oid" : "50515ea92ce64f020000002f" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347509929053 }, "groups" : [ "21L.000J" ], "id" : "50515ea92ce64f020000002f", "permissions" : { "delete" : [ "njl@mit.edu" ], "update" : [ "njl@mit.edu" ], "admin" : [ "njl@mit.edu" ], "read" : [ "njl@mit.edu" ] }, "quote" : "yellow eye of the creature open; it breathed hard", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 444, "end" : "/div[1]/p[1]", "endOffset" : 493, "_id" : { "$oid" : "50515ea92ce64f0200000030" } } ], "tags" : [], "text" : "Grammatically, \"it\" still refers to the eye. The eye literally breathing can act as a parallel to the soul entering the body, as the connection of eye and spirit is an age-old human myth.", "updated" : { "$date" : 1347509947807 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "njl@mit.edu", "username" : "Nicholas L.", "uuid" : "93B0A0EE" } -{ "id" : "50515f1a75da710200000004", "user" : "njl@mit.edu", "username" : "Nicholas L.", "text" : "Another reference to the creatures eyes highlights the importance of the image.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "eyes, that seemed almost of the same colour as the dun-white sockets in which they were set", "uuid" : "908A3E99", "_id" : { "$oid" : "50515f1a75da710200000004" }, "permissions" : { "delete" : [ "njl@mit.edu" ], "update" : [ "njl@mit.edu" ], "admin" : [ "njl@mit.edu" ], "read" : [ "njl@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 472, "end" : "/div[1]/p[2]", "endOffset" : 563, "_id" : { "$oid" : "50515f1a75da710200000005" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347510042194 }, "created" : { "$date" : 1347510042194 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50515f5a2ce64f0200000031", "user" : "njl@mit.edu", "username" : "Nicholas L.", "text" : "Almost as if Frankenstein sacrificed life in order to gain it.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "For this I had deprived myself of rest and health.", "uuid" : "B5BC7366", "_id" : { "$oid" : "50515f5a2ce64f0200000031" }, "permissions" : { "delete" : [ "njl@mit.edu" ], "update" : [ "njl@mit.edu" ], "admin" : [ "njl@mit.edu" ], "read" : [ "njl@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 189, "end" : "/div[1]/p[3]", "endOffset" : 239, "_id" : { "$oid" : "50515f5a2ce64f0200000032" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347510106577 }, "created" : { "$date" : 1347510106577 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50515f942ce64f0200000033", "user" : "njl@mit.edu", "username" : "Nicholas L.", "text" : "Real life sets in once work is complete. Comes to realize the implications of his actions.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "beauty of the dream vanished", "uuid" : "4437B010", "_id" : { "$oid" : "50515f942ce64f0200000033" }, "permissions" : { "delete" : [ "njl@mit.edu" ], "update" : [ "njl@mit.edu" ], "admin" : [ "njl@mit.edu" ], "read" : [ "njl@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 335, "end" : "/div[1]/p[3]", "endOffset" : 363, "_id" : { "$oid" : "50515f942ce64f0200000034" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347510164561 }, "created" : { "$date" : 1347510164561 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50515fca2ce64f0200000035", "user" : "njl@mit.edu", "username" : "Nicholas L.", "text" : "Wishes to abandon duty as creator of the creature. Chooses sleep to try and return to the \"beauty of the dream\" mentioned earlier.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "endeavouring to seek a few moments of forgetfulness.", "uuid" : "70756915", "_id" : { "$oid" : "50515fca2ce64f0200000035" }, "permissions" : { "delete" : [ "njl@mit.edu" ], "update" : [ "njl@mit.edu" ], "admin" : [ "njl@mit.edu" ], "read" : [ "njl@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 697, "end" : "/div[1]/p[3]", "endOffset" : 749, "_id" : { "$oid" : "50515fca2ce64f0200000036" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347510218343 }, "created" : { "$date" : 1347510218343 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5051600f2ce64f0200000037", "user" : "njl@mit.edu", "username" : "Nicholas L.", "text" : "Feels his touch brings about horror. Is guilt-ridden for what he has done.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "they became livid with the hue of death", "uuid" : "76C38E03", "_id" : { "$oid" : "5051600f2ce64f0200000037" }, "permissions" : { "delete" : [ "njl@mit.edu" ], "update" : [ "njl@mit.edu" ], "admin" : [ "njl@mit.edu" ], "read" : [ "njl@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1007, "end" : "/div[1]/p[3]", "endOffset" : 1046, "_id" : { "$oid" : "5051600f2ce64f0200000038" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347510287233 }, "created" : { "$date" : 1347510287233 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5051604c2ce64f0200000039", "user" : "njl@mit.edu", "username" : "Nicholas L.", "text" : "Waking from dream similar to birth of the creature in the convulsion of limbs.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "every limb became convulsed;", "uuid" : "A6ACC959", "_id" : { "$oid" : "5051604c2ce64f0200000039" }, "permissions" : { "delete" : [ "njl@mit.edu" ], "update" : [ "njl@mit.edu" ], "admin" : [ "njl@mit.edu" ], "read" : [ "njl@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1334, "end" : "/div[1]/p[3]", "endOffset" : 1362, "_id" : { "$oid" : "5051604c2ce64f020000003a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347510348008 }, "created" : { "$date" : 1347510348008 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5051607b75da710200000006", "user" : "njl@mit.edu", "username" : "Nicholas L.", "text" : "Calls into question of eyes to call into question nature of the creature's soul.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "his eyes, if eyes they may be called", "uuid" : "25126CF3", "_id" : { "$oid" : "5051607b75da710200000006" }, "permissions" : { "delete" : [ "njl@mit.edu" ], "update" : [ "njl@mit.edu" ], "admin" : [ "njl@mit.edu" ], "read" : [ "njl@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1562, "end" : "/div[1]/p[3]", "endOffset" : 1598, "_id" : { "$oid" : "5051607b75da710200000007" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347510395781 }, "created" : { "$date" : 1347510395781 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "505160a175da710200000008" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347510433354 }, "groups" : [ "21L.000J" ], "id" : "505160a175da710200000008", "permissions" : { "delete" : [ "njl@mit.edu" ], "update" : [ "njl@mit.edu" ], "admin" : [ "njl@mit.edu" ], "read" : [ "njl@mit.edu" ] }, "quote" : "one hand was stretched out", "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1753, "end" : "/div[1]/p[3]", "endOffset" : 1779, "_id" : { "$oid" : "505160a175da710200000009" } } ], "tags" : [], "text" : "The creature reaches out to his creator. Frankenstein to engulfed in horror to correctly interpret the act.", "updated" : { "$date" : 1347510454975 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "njl@mit.edu", "username" : "Nicholas L.", "uuid" : "237BC945" } -{ "id" : "505160ec2ce64f020000003b", "user" : "njl@mit.edu", "username" : "Nicholas L.", "text" : "Distinction being: The mummy once had life. The creature was born out of nothing.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "mummy again endued with animation could not be so hideous as that wretch.", "uuid" : "42508AB4", "_id" : { "$oid" : "505160ec2ce64f020000003b" }, "permissions" : { "delete" : [ "njl@mit.edu" ], "update" : [ "njl@mit.edu" ], "admin" : [ "njl@mit.edu" ], "read" : [ "njl@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 61, "end" : "/div[1]/p[4]", "endOffset" : 135, "_id" : { "$oid" : "505160ec2ce64f020000003c" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347510508468 }, "created" : { "$date" : 1347510508468 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5051610975da71020000000a", "user" : "njl@mit.edu", "username" : "Nicholas L.", "text" : "Dante's Inferno describes Hell in great detail", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Dante", "uuid" : "E630F908", "_id" : { "$oid" : "5051610975da71020000000a" }, "permissions" : { "delete" : [ "njl@mit.edu" ], "update" : [ "njl@mit.edu" ], "admin" : [ "njl@mit.edu" ], "read" : [ "njl@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 289, "end" : "/div[1]/p[4]", "endOffset" : 294, "_id" : { "$oid" : "5051610975da71020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347510537291 }, "created" : { "$date" : 1347510537291 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505161962ce64f020000003d", "user" : "njl@mit.edu", "username" : "Nicholas L.", "text" : "Wretched to describe both the creature and himself", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "wretchedly", "uuid" : "B851A929", "_id" : { "$oid" : "505161962ce64f020000003d" }, "permissions" : { "delete" : [ "njl@mit.edu" ], "update" : [ "njl@mit.edu" ], "admin" : [ "njl@mit.edu" ], "read" : [ "njl@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 19, "end" : "/div[1]/p[5]", "endOffset" : 29, "_id" : { "$oid" : "505161962ce64f020000003e" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347510678494 }, "created" : { "$date" : 1347510678494 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505161fd2ce64f020000003f", "user" : "njl@mit.edu", "username" : "Nicholas L.", "text" : "Feels the extremes of life. Feels his blood coursing through his body, then feels weak.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I felt the palpitation of every artery; at others, I nearly sank to the ground through languor and extreme weakness", "uuid" : "DFFE6BAE", "_id" : { "$oid" : "505161fd2ce64f020000003f" }, "permissions" : { "delete" : [ "njl@mit.edu" ], "update" : [ "njl@mit.edu" ], "admin" : [ "njl@mit.edu" ], "read" : [ "njl@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 82, "end" : "/div[1]/p[5]", "endOffset" : 197, "_id" : { "$oid" : "505161fd2ce64f0200000040" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347510781759 }, "created" : { "$date" : 1347510781759 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5051621f75da71020000000c", "user" : "njl@mit.edu", "username" : "Nicholas L.", "text" : "Unprepared for ramifications of actions.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "the change was so rapid", "uuid" : "D530C2AC", "_id" : { "$oid" : "5051621f75da71020000000c" }, "permissions" : { "delete" : [ "njl@mit.edu" ], "update" : [ "njl@mit.edu" ], "admin" : [ "njl@mit.edu" ], "read" : [ "njl@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 367, "end" : "/div[1]/p[5]", "endOffset" : 390, "_id" : { "$oid" : "5051621f75da71020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347510815207 }, "created" : { "$date" : 1347510815207 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5051624275da71020000000e", "user" : "njl@mit.edu", "username" : "Nicholas L.", "text" : "Told himself he would rest once his work is complete. Completed work: cannot rest.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "dreams that had been my food and pleasant rest for so long a space were now become a hell to me", "uuid" : "909BA3D3", "_id" : { "$oid" : "5051624275da71020000000e" }, "permissions" : { "delete" : [ "njl@mit.edu" ], "update" : [ "njl@mit.edu" ], "admin" : [ "njl@mit.edu" ], "read" : [ "njl@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 266, "end" : "/div[1]/p[5]", "endOffset" : 361, "_id" : { "$oid" : "5051624275da71020000000f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347510850162 }, "created" : { "$date" : 1347510850162 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505261a1ffb2770200000004" }, "__v" : 1, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347576225820 }, "groups" : [ "21L.000J" ], "id" : "505261a1ffb2770200000004", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "quote" : "accomplishment", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 55, "end" : "/div[1]/p[1]", "endOffset" : 69, "_id" : { "$oid" : "50526914ffb2770200000012" } } ], "tags" : [ "irony" ], "text" : "ironic how quickly he changed his mind", "updated" : { "$date" : 1347578132556 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "uuid" : "44D2DE76" } -{ "_id" : { "$oid" : "5052622175da710200000010" }, "id" : "5052622175da710200000010", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "he almost worked himself to death", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "toils", "uuid" : "D44590EA", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 76, "end" : "/div[1]/p[1]", "endOffset" : 81, "_id" : { "$oid" : "5052622175da710200000011" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347576453202 }, "created" : { "$date" : 1347576353614 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5052647b75da710200000012" }, "id" : "5052647b75da710200000012", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "after months of working on this so enthusiastically, he can hardly be blamed for this level of anxiety", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "agony", "uuid" : "1AA63AF0", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 123, "end" : "/div[1]/p[1]", "endOffset" : 128, "_id" : { "$oid" : "5052647b75da710200000013" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347576955712 }, "created" : { "$date" : 1347576955712 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505264ecffb2770200000006" }, "__v" : 1, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347577068576 }, "groups" : [ "21L.000J" ], "id" : "505264ecffb2770200000006", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "quote" : "instruments", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 146, "end" : "/div[1]/p[1]", "endOffset" : 157, "_id" : { "$oid" : "505264ecffb2770200000007" } } ], "tags" : [ "creation" ], "text" : "the term is used to describe the tools that brought the creature to life in every case in the book. very vague.", "updated" : { "$date" : 1347577251103 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "uuid" : "62CA2D96" } -{ "_id" : { "$oid" : "5052657975da710200000014" }, "__v" : 1, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347577209912 }, "groups" : [ "21L.000J" ], "id" : "5052657975da710200000014", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "quote" : "infuse", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 190, "end" : "/div[1]/p[1]", "endOffset" : 196, "_id" : { "$oid" : "5052657975da710200000015" } } ], "tags" : [ "life,", "soul,", "spark" ], "text" : "denotes that the presence of a certain 'spark' defines the difference between animate and inanimate beings", "updated" : { "$date" : 1347577289206 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "uuid" : "C55C2DBB" } -{ "_id" : { "$oid" : "50526625ffb2770200000008" }, "__v" : 1, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347577381283 }, "groups" : [ "21L.000J" ], "id" : "50526625ffb2770200000008", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "quote" : "one", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 274, "end" : "/div[1]/p[1]", "endOffset" : 277, "_id" : { "$oid" : "5052664875da710200000016" } } ], "tags" : [ "symbolism" ], "text" : "hour of darkness? also implies that Victor has disregarded time in his work", "updated" : { "$date" : 1347577416186 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "uuid" : "92ED361C" } -{ "_id" : { "$oid" : "5052667275da710200000017" }, "id" : "5052667275da710200000017", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "rain", "uuid" : "623C448F", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "symbolism" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 298, "end" : "/div[1]/p[1]", "endOffset" : 302, "_id" : { "$oid" : "5052667275da710200000018" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347577458804 }, "created" : { "$date" : 1347577458804 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50526806ffb277020000000c" }, "id" : "50526806ffb277020000000c", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "implies darkness is near", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "burnt", "uuid" : "46A544B1", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "symbolism" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 365, "end" : "/div[1]/p[1]", "endOffset" : 370, "_id" : { "$oid" : "50526806ffb277020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347577862979 }, "created" : { "$date" : 1347577862979 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5052682d75da710200000019" }, "id" : "5052682d75da710200000019", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "lifeless? devoid of emotion?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "dull", "uuid" : "5CCB267D", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "creature" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 439, "end" : "/div[1]/p[1]", "endOffset" : 443, "_id" : { "$oid" : "5052682d75da71020000001a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347577901692 }, "created" : { "$date" : 1347577901692 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5052684175da71020000001b" }, "id" : "5052684175da71020000001b", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "sick, ill", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "yellow", "uuid" : "8B2FA4DB", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "creature" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 444, "end" : "/div[1]/p[1]", "endOffset" : 450, "_id" : { "$oid" : "5052684175da71020000001c" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347577921106 }, "created" : { "$date" : 1347577921106 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50526879ffb277020000000e" }, "__v" : 1, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347577977934 }, "groups" : [ "21L.000J" ], "id" : "50526879ffb277020000000e", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "quote" : "convulsive", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 501, "end" : "/div[1]/p[1]", "endOffset" : 511, "_id" : { "$oid" : "50526879ffb277020000000f" } } ], "tags" : [ "creation" ], "text" : "engine of life kicking in", "updated" : { "$date" : 1347577991282 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "uuid" : "E97D8C5E" } -{ "_id" : { "$oid" : "505268bfffb2770200000010" }, "__v" : 1, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347578047999 }, "groups" : [ "21L.000J" ], "id" : "505268bfffb2770200000010", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "quote" : "delineate", "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 59, "end" : "/div[1]/p[2]", "endOffset" : 68, "_id" : { "$oid" : "505268bfffb2770200000011" } } ], "tags" : [ "meaning" ], "text" : ":describe", "updated" : { "$date" : 1347578059887 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "uuid" : "5192F581" } -{ "_id" : { "$oid" : "505268f375da71020000001d" }, "id" : "505268f375da71020000001d", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "considered accomplishment just a moment ago", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "catastrophe", "uuid" : "60D6D3AC", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "irony" ], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 39, "end" : "/div[1]/p[2]", "endOffset" : 50, "_id" : { "$oid" : "505268f375da71020000001e" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347578099452 }, "created" : { "$date" : 1347578099452 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50526961ffb2770200000013" }, "id" : "50526961ffb2770200000013", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "mathematically correct", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "proportion", "uuid" : "C131D9C4", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "creature" ], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 164, "end" : "/div[1]/p[2]", "endOffset" : 174, "_id" : { "$oid" : "50526961ffb2770200000014" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347578209092 }, "created" : { "$date" : 1347578209092 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505269b3ffb2770200000015" }, "id" : "505269b3ffb2770200000015", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "infinite", "uuid" : "9DD42F7D", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "hyperbole" ], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 95, "end" : "/div[1]/p[2]", "endOffset" : 103, "_id" : { "$oid" : "505269b3ffb2770200000016" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347578291254 }, "created" : { "$date" : 1347578291254 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50526a3775da71020000001f" }, "id" : "50526a3775da71020000001f", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "Not. Absolute opposite, persona is hysteric about it.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Beautiful", "uuid" : "014B848E", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 222, "end" : "/div[1]/p[2]", "endOffset" : 231, "_id" : { "$oid" : "50526a3775da710200000020" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347578423356 }, "created" : { "$date" : 1347578423356 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50526a6075da710200000021" }, "id" : "50526a6075da710200000021", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "he was designed", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "selected", "uuid" : "3BBA899F", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "creation,creature" ], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 186, "end" : "/div[1]/p[2]", "endOffset" : 194, "_id" : { "$oid" : "50526a6075da710200000022" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347578464186 }, "created" : { "$date" : 1347578464186 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50526a71ffb2770200000017" }, "id" : "50526a71ffb2770200000017", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "sick, ill?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "yellow", "uuid" : "51C6F674", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 248, "end" : "/div[1]/p[2]", "endOffset" : 254, "_id" : { "$oid" : "50526a71ffb2770200000018" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347578481074 }, "created" : { "$date" : 1347578481074 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50526d0975da710200000023" }, "id" : "50526d0975da710200000023", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "shows the level of intricateness", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "arteries", "uuid" : "7566DC62", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "creation" ], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 301, "end" : "/div[1]/p[2]", "endOffset" : 309, "_id" : { "$oid" : "50526d0975da710200000024" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347579145684 }, "created" : { "$date" : 1347579145684 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5052700b75da710200000025" }, "__v" : 1, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347579915197 }, "groups" : [ "21L.000J" ], "id" : "5052700b75da710200000025", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "quote" : "eyes", "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 472, "end" : "/div[1]/p[2]", "endOffset" : 476, "_id" : { "$oid" : "5052700b75da710200000026" } } ], "tags" : [ "creature" ], "text" : "the feature that looks un-alive. each feature by itself is considered beautiful by victor; combined, they are revolting", "updated" : { "$date" : 1347579928760 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "uuid" : "B7E3E47A" } -{ "_id" : { "$oid" : "50527094ffb2770200000019" }, "id" : "50527094ffb2770200000019", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "he previously desired the creature to be alive, now he is disgusted", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "changeable", "uuid" : "87FF101F", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 43, "end" : "/div[1]/p[3]", "endOffset" : 53, "_id" : { "$oid" : "50527094ffb277020000001a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347580052662 }, "created" : { "$date" : 1347580052662 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505270b8ffb277020000001b" }, "id" : "505270b8ffb277020000001b", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "he had only a goal. he did not think the outcome through", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "sole", "uuid" : "43C3DB17", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 135, "end" : "/div[1]/p[3]", "endOffset" : 139, "_id" : { "$oid" : "505270b8ffb277020000001c" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347580088362 }, "created" : { "$date" : 1347580088362 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505270fe75da710200000027" }, "id" : "505270fe75da710200000027", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "he regards these the sacrifices he had made for his work", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "deprived", "uuid" : "677260DA", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 204, "end" : "/div[1]/p[3]", "endOffset" : 212, "_id" : { "$oid" : "505270fe75da710200000028" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347580158325 }, "created" : { "$date" : 1347580158325 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5052718775da710200000029" }, "id" : "5052718775da710200000029", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "idealism", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "dream", "uuid" : "9E03818E", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 349, "end" : "/div[1]/p[3]", "endOffset" : 354, "_id" : { "$oid" : "5052718775da71020000002a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347580295475 }, "created" : { "$date" : 1347580295475 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505271a375da71020000002b" }, "id" : "505271a375da71020000002b", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "visual", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "aspect", "uuid" : "973DA63A", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 437, "end" : "/div[1]/p[3]", "endOffset" : 443, "_id" : { "$oid" : "505271a375da71020000002c" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347580323035 }, "created" : { "$date" : 1347580323035 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505271c4ffb277020000001d" }, "id" : "505271c4ffb277020000001d", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "victor does not know what to call his creature", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "being", "uuid" : "8449F87D", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 451, "end" : "/div[1]/p[3]", "endOffset" : 456, "_id" : { "$oid" : "505271c4ffb277020000001e" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347580356806 }, "created" : { "$date" : 1347580356806 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50527211ffb277020000001f" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347580433962 }, "groups" : [ "21L.000J" ], "id" : "50527211ffb277020000001f", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "quote" : "rushed", "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 474, "end" : "/div[1]/p[3]", "endOffset" : 480, "_id" : { "$oid" : "50527211ffb2770200000020" } } ], "tags" : [], "text" : "victor does not want to accept responsibility for the creature. he runs away. alternately, he may have thought that the creature is unable to move and think, and is safe to be left alone.", "updated" : { "$date" : 1347580632951 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "uuid" : "5179E843" } -{ "_id" : { "$oid" : "5052727675da71020000002d" }, "id" : "5052727675da71020000002d", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "procrastination. victor has to deal with the creature, but he does not immediately", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "traversing", "uuid" : "EA2634B6", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 523, "end" : "/div[1]/p[3]", "endOffset" : 533, "_id" : { "$oid" : "5052727675da71020000002e" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347580534387 }, "created" : { "$date" : 1347580534387 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505273dc75da71020000002f" }, "id" : "505273dc75da71020000002f", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "implies that he is confused, does not know what to do", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "compose", "uuid" : "975A0166", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 560, "end" : "/div[1]/p[3]", "endOffset" : 567, "_id" : { "$oid" : "505273dc75da710200000030" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347580892603 }, "created" : { "$date" : 1347580892603 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505273ebffb2770200000021" }, "id" : "505273ebffb2770200000021", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "weariness", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "lassitude", "uuid" : "531CC912", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "meaning" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 596, "end" : "/div[1]/p[3]", "endOffset" : 605, "_id" : { "$oid" : "505273ebffb2770200000022" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347580907609 }, "created" : { "$date" : 1347580907609 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5052741cffb2770200000023" }, "id" : "5052741cffb2770200000023", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "confusion", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "tumult", "uuid" : "483881EB", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 623, "end" : "/div[1]/p[3]", "endOffset" : 629, "_id" : { "$oid" : "5052741cffb2770200000024" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347580956142 }, "created" : { "$date" : 1347580956142 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505278f1ffb2770200000025" }, "id" : "505278f1ffb2770200000025", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "allude to throwing away the idea of the creature", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "threw", "uuid" : "7CBD337D", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 658, "end" : "/div[1]/p[3]", "endOffset" : 663, "_id" : { "$oid" : "505278f1ffb2770200000026" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347582193375 }, "created" : { "$date" : 1347582193375 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505279b475da710200000031" }, "id" : "505279b475da710200000031", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "his subconscious", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "dreams", "uuid" : "0DC7C582", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "symbolism" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 822, "end" : "/div[1]/p[3]", "endOffset" : 828, "_id" : { "$oid" : "505279b475da710200000032" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347582388289 }, "created" : { "$date" : 1347582388289 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50527a2b75da710200000033" }, "id" : "50527a2b75da710200000033", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "similar to his dream. His dream was desirable at first, then it turned into horror, just like elizabeth in the dream", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "death", "uuid" : "0E21DB2C", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "metaphor" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1041, "end" : "/div[1]/p[3]", "endOffset" : 1046, "_id" : { "$oid" : "50527a2b75da710200000034" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347582507459 }, "created" : { "$date" : 1347582507459 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50527a5675da710200000035" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347582550567 }, "groups" : [ "21L.000J" ], "id" : "50527a5675da710200000035", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "quote" : "imprinted", "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 969, "end" : "/div[1]/p[3]", "endOffset" : 978, "_id" : { "$oid" : "50527a5675da710200000036" } } ], "tags" : [], "text" : "symbolic of the moment he infused life into the creature- a moment he has been waiting for, but when it came, it did not happen the way he wanted it to", "updated" : { "$date" : 1347582599558 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "uuid" : "8C59DD1D" } -{ "id" : "50528ecbffb2770200000027", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "text" : "Alice stands up for herself, and her challenge of authority leaves the Queen awestruck to the extent that she doesn't know how to respond, and instead moves on to the next problem.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`Nonsense!' said Alice, very loudly and decidedly, and the Queen was silent.", "uuid" : "E9ABD0DC", "_id" : { "$oid" : "50528ecbffb2770200000027" }, "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 4282, "end" : "/div[1]/div[3]", "endOffset" : 4359, "_id" : { "$oid" : "50528ecbffb2770200000028" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347587787273 }, "created" : { "$date" : 1347587787273 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50528f4bffb2770200000029", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "text" : "In this example, Alice is once again like a child: she sees that all of the figures around that seem to know the rules are shouting, and she follows their example. She doesn't have a good reason to shout, nor is she typically shouting, but she tries to follow these unspoken rules as best she can by learning by example.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`Yes!' shouted Alice.", "uuid" : "8CAED369", "_id" : { "$oid" : "50528f4bffb2770200000029" }, "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 5877, "end" : "/div[1]/div[3]", "endOffset" : 5898, "_id" : { "$oid" : "50528f4bffb277020000002a" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347587915222 }, "created" : { "$date" : 1347587915222 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505290092b76cf0200000002", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "text" : "This fact is so contrary to the rest of Wonderland, where there are so many unspoken rules that nearly everyone takes great pains to attend to.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "and they don't seem to have\n\t\t\tany rules in particular; at least, if there are, nobody attends to them", "uuid" : "611E4340", "_id" : { "$oid" : "505290092b76cf0200000002" }, "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 10012, "end" : "/div[1]/div[3]", "endOffset" : 10114, "_id" : { "$oid" : "505290092b76cf0200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347588105327 }, "created" : { "$date" : 1347588105327 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505291352b76cf0200000004", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "text" : "She still tries to figure out the rules that are in play, and, as children often are, is wrong about some of them.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "very much pleased at having found out\n\t\t\ta new kind of rule", "uuid" : "C25BE468", "_id" : { "$oid" : "505291352b76cf0200000004" }, "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 650, "end" : "/div[1]/div[4]", "endOffset" : 709, "_id" : { "$oid" : "505291352b76cf0200000005" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347588405459 }, "created" : { "$date" : 1347588405458 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505293132b76cf0200000006" }, "id" : "505293132b76cf0200000006", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "denoting that it is not human", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "it", "uuid" : "3D053AE2", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1413, "end" : "/div[1]/p[3]", "endOffset" : 1415, "_id" : { "$oid" : "505293132b76cf0200000007" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347588883796 }, "created" : { "$date" : 1347588883796 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50529359ffb277020000002b" }, "id" : "50529359ffb277020000002b", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "despicable", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "wretch", "uuid" : "93B3BD6D", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "meaning" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1473, "end" : "/div[1]/p[3]", "endOffset" : 1479, "_id" : { "$oid" : "50529359ffb277020000002c" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347588953769 }, "created" : { "$date" : 1347588953769 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505293752b76cf0200000008" }, "id" : "505293752b76cf0200000008", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "symbolic that he breached a border", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "curtain", "uuid" : "F5E42EB9", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1538, "end" : "/div[1]/p[3]", "endOffset" : 1545, "_id" : { "$oid" : "505293752b76cf0200000009" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347588981226 }, "created" : { "$date" : 1347588981226 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505293fb2b76cf020000000a" }, "id" : "505293fb2b76cf020000000a", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "like a newborn meeting his parents", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "grin", "uuid" : "CC16D5FD", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1685, "end" : "/div[1]/p[3]", "endOffset" : 1689, "_id" : { "$oid" : "505293fb2b76cf020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347589115945 }, "created" : { "$date" : 1347589115945 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5052940affb277020000002d" }, "id" : "5052940affb277020000002d", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "too busy was he trying to run away", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "hear", "uuid" : "22F2D310", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1747, "end" : "/div[1]/p[3]", "endOffset" : 1751, "_id" : { "$oid" : "5052940affb277020000002e" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347589130168 }, "created" : { "$date" : 1347589130168 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505294892b76cf020000000c" }, "id" : "505294892b76cf020000000c", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "looking for recognition, like how a babe would reach out to its parent", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "stretched", "uuid" : "D9DAEFB7", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1766, "end" : "/div[1]/p[3]", "endOffset" : 1775, "_id" : { "$oid" : "505294892b76cf020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347589257773 }, "created" : { "$date" : 1347589257773 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505294a12b76cf020000000e", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "text" : "This newly invented rule shows the level of ridiculousness with which Carroll is handling the rules. Rule 42 was created on the spot, and clearly was not a fair or reasonable rule. This is one way in which Carroll is commenting on the uselessness of some rules, as well as the danger of an authority figure that can write laws as he/she likes.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "Rule Forty-two. ALL PERSONS MORE THAN\n\t\t\tA MILE HIGH TO LEAVE THE COURT.'", "uuid" : "5D48C757", "_id" : { "$oid" : "505294a12b76cf020000000e" }, "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 2819, "end" : "/div[1]/div[6]", "endOffset" : 2893, "_id" : { "$oid" : "505294a12b76cf020000000f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347589281987 }, "created" : { "$date" : 1347589281987 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505294b2ffb277020000002f" }, "id" : "505294b2ffb277020000002f", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "the gesture perceived by Victor by threatening", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "detain", "uuid" : "53E189E7", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1794, "end" : "/div[1]/p[3]", "endOffset" : 1800, "_id" : { "$oid" : "505294b2ffb2770200000030" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347589298464 }, "created" : { "$date" : 1347589298464 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505294ecffb2770200000031", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "text" : "Emphasis on the true absurdity of each of the King's comments", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "it was the first really clever thing the\n\t\t\tKing had said that day.", "uuid" : "1D2EF14E", "_id" : { "$oid" : "505294ecffb2770200000031" }, "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 4830, "end" : "/div[1]/div[6]", "endOffset" : 4897, "_id" : { "$oid" : "505294ecffb2770200000032" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347589356622 }, "created" : { "$date" : 1347589356622 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50529555ffb2770200000033" }, "__v" : 1, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347589461602 }, "groups" : [ "21L.000J" ], "id" : "50529555ffb2770200000033", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "quote" : "countenance", "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 47, "end" : "/div[1]/p[4]", "endOffset" : 58, "_id" : { "$oid" : "50529555ffb2770200000034" } } ], "tags" : [ "creature" ], "text" : "the creature is considered terribly ugly by Victor", "updated" : { "$date" : 1347589473891 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "uuid" : "4FD572D5" } -{ "_id" : { "$oid" : "5052957d2b76cf0200000010" }, "id" : "5052957d2b76cf0200000010", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "watched with compassion?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "gazed", "uuid" : "2BC5BC4C", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 142, "end" : "/div[1]/p[4]", "endOffset" : 147, "_id" : { "$oid" : "5052957d2b76cf0200000011" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347589501653 }, "created" : { "$date" : 1347589501653 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5052974effb2770200000037" }, "id" : "5052974effb2770200000037", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "uglier than anything that can be found in hell", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Dante", "uuid" : "41FFA122", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "literary", "reference" ], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 289, "end" : "/div[1]/p[4]", "endOffset" : 294, "_id" : { "$oid" : "5052974effb2770200000038" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347589966298 }, "created" : { "$date" : 1347589966298 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5052975b2b76cf0200000012" }, "id" : "5052975b2b76cf0200000012", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "unhappily", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "wretchedly", "uuid" : "E57D7D55", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 19, "end" : "/div[1]/p[5]", "endOffset" : 29, "_id" : { "$oid" : "5052975b2b76cf0200000013" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347589979798 }, "created" : { "$date" : 1347589979798 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505297c2ffb2770200000039" }, "id" : "505297c2ffb2770200000039", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "weakness", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "languor", "uuid" : "23BB22E5", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 169, "end" : "/div[1]/p[5]", "endOffset" : 176, "_id" : { "$oid" : "505297c2ffb277020000003a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347590082678 }, "created" : { "$date" : 1347590082678 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505298482b76cf0200000014" }, "id" : "505298482b76cf0200000014", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "Victor is now more aware of the creature's ability to move and think. He still does not want to confront him", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "return", "uuid" : "8CB72656", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 434, "end" : "/div[1]/p[6]", "endOffset" : 440, "_id" : { "$oid" : "505298482b76cf0200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347590216031 }, "created" : { "$date" : 1347590216031 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505298582b76cf0200000016" }, "id" : "505298582b76cf0200000016", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "bleak, severe", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "comfortless", "uuid" : "26313A98", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 568, "end" : "/div[1]/p[6]", "endOffset" : 579, "_id" : { "$oid" : "505298582b76cf0200000017" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347590232511 }, "created" : { "$date" : 1347590232511 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50529887ffb277020000003b" }, "id" : "50529887ffb277020000003b", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "cold and miserable", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "drenched", "uuid" : "32B0A3C4", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 517, "end" : "/div[1]/p[6]", "endOffset" : 525, "_id" : { "$oid" : "50529887ffb277020000003c" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347590279003 }, "created" : { "$date" : 1347590279003 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505298f8ffb277020000003d" }, "id" : "505298f8ffb277020000003d", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "Victor is afraid of the creature. He hurries along the streets and dare not look around for fear that the creature is about. He rather not know", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "tread", "uuid" : "BA64CB23", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[8]", "startOffset" : 187, "end" : "/div[1]/p[8]", "endOffset" : 192, "_id" : { "$oid" : "505298f8ffb277020000003e" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347590392134 }, "created" : { "$date" : 1347590392134 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505299292b76cf0200000018" }, "id" : "505299292b76cf0200000018", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "Henry is a welcome distraction", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Clerval", "uuid" : "43763AC9", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 41, "end" : "/div[1]/p[11]", "endOffset" : 48, "_id" : { "$oid" : "505299292b76cf0200000019" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347590441239 }, "created" : { "$date" : 1347590441239 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50529a07ffb277020000003f" }, "id" : "50529a07ffb277020000003f", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "all the more after the terror of the previous night", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : ".", "uuid" : "564A7479", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 318, "end" : "/div[1]/p[11]", "endOffset" : 319, "_id" : { "$oid" : "50529a07ffb2770200000040" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347590663383 }, "created" : { "$date" : 1347590663383 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50529a852b76cf020000001a" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347590789023 }, "groups" : [ "21L.000J" ], "id" : "50529a852b76cf020000001a", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "quote" : "schoolmaster", "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 859, "end" : "/div[1]/p[11]", "endOffset" : 871, "_id" : { "$oid" : "50529a852b76cf020000001b" } } ], "tags" : [ "literary", "reference" ], "text" : "does not value knowledge and innovation", "updated" : { "$date" : 1347590809421 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "uuid" : "1C8E2256" } -{ "_id" : { "$oid" : "50529aae2b76cf020000001c" }, "id" : "50529aae2b76cf020000001c", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "Henry expected to learn", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "discovery", "uuid" : "44FA9FCF", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 1099, "end" : "/div[1]/p[11]", "endOffset" : 1108, "_id" : { "$oid" : "50529aae2b76cf020000001d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347590830971 }, "created" : { "$date" : 1347590830971 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50529ae52b76cf020000001e" }, "id" : "50529ae52b76cf020000001e", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "finally taking a good look at Victor, after the initial distraction of reunion", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "full", "uuid" : "D6838BDC", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 221, "end" : "/div[1]/p[13]", "endOffset" : 225, "_id" : { "$oid" : "50529ae52b76cf020000001f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347590885106 }, "created" : { "$date" : 1347590885106 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50529afcffb2770200000041" }, "id" : "50529afcffb2770200000041", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "from the creature he created", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "free", "uuid" : "459A6526", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 239, "end" : "/div[1]/p[14]", "endOffset" : 243, "_id" : { "$oid" : "50529afcffb2770200000042" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347590908796 }, "created" : { "$date" : 1347590908796 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50529b1c2b76cf0200000020" }, "id" : "50529b1c2b76cf0200000020", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "Victor does not seem to intend to do anything regarding his creation", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "end", "uuid" : "EE3DD4F5", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 211, "end" : "/div[1]/p[14]", "endOffset" : 214, "_id" : { "$oid" : "50529b1c2b76cf0200000021" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347590940491 }, "created" : { "$date" : 1347590940491 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50529b612b76cf0200000022" }, "id" : "50529b612b76cf0200000022", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "Victor does not want to let people know of his creation, or possibly let people know that it was he who made the creature", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "him", "uuid" : "606C01CD", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 413, "end" : "/div[1]/p[15]", "endOffset" : 416, "_id" : { "$oid" : "50529b612b76cf0200000023" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347591009593 }, "created" : { "$date" : 1347591009593 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50529be0ffb2770200000043" }, "id" : "50529be0ffb2770200000043", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "What Victor temporarily claims as good fortune would come back to haunt him later. He feels that the problem is solved with the the creature absent from his sight", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "me", "uuid" : "943A118A", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 991, "end" : "/div[1]/p[15]", "endOffset" : 993, "_id" : { "$oid" : "50529be0ffb2770200000044" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347591136880 }, "created" : { "$date" : 1347591136880 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50529c1affb2770200000045" }, "id" : "50529c1affb2770200000045", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "interesting how Victor sees the creature as having fled. as if the creature was running away from his master.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "fled", "uuid" : "04F661B3", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 1046, "end" : "/div[1]/p[15]", "endOffset" : 1050, "_id" : { "$oid" : "50529c1affb2770200000046" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347591194961 }, "created" : { "$date" : 1347591194961 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50529c392b76cf0200000024" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347591225553 }, "groups" : [ "21L.000J" ], "id" : "50529c392b76cf0200000024", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "quote" : "aloud", "ranges" : [ { "start" : "/div[1]/p[16]", "startOffset" : 345, "end" : "/div[1]/p[16]", "endOffset" : 350, "_id" : { "$oid" : "50529c392b76cf0200000025" } } ], "tags" : [], "text" : "Victor is showing signs of hysteria", "updated" : { "$date" : 1347591233260 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "uuid" : "C6F9989F" } -{ "_id" : { "$oid" : "50529c612b76cf0200000026" }, "id" : "50529c612b76cf0200000026", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "ghost, something terrifying", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "spectre", "uuid" : "247E244E", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 738, "end" : "/div[1]/p[15]", "endOffset" : 745, "_id" : { "$oid" : "50529c612b76cf0200000027" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347591265296 }, "created" : { "$date" : 1347591265296 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50529c8dffb2770200000047" }, "id" : "50529c8dffb2770200000047", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "Henry was a childhood friend", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "attentively", "uuid" : "76B18F6A", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[16]", "startOffset" : 451, "end" : "/div[1]/p[16]", "endOffset" : 462, "_id" : { "$oid" : "50529c8dffb2770200000048" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347591309472 }, "created" : { "$date" : 1347591309472 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50529cbb2b76cf0200000028" }, "id" : "50529cbb2b76cf0200000028", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "fright takes over Victor, and he imagines that the creature is seizing him", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "seized", "uuid" : "83F106FA", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 185, "end" : "/div[1]/p[18]", "endOffset" : 191, "_id" : { "$oid" : "50529cbb2b76cf0200000029" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347591355723 }, "created" : { "$date" : 1347591355723 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50529d4dffb2770200000049" }, "id" : "50529d4dffb2770200000049", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "there was nothing his father and Elizabeth could have done, Henry believed", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "spared", "uuid" : "B52BE9F2", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 280, "end" : "/div[1]/p[20]", "endOffset" : 286, "_id" : { "$oid" : "50529d4dffb277020000004a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347591501737 }, "created" : { "$date" : 1347591501737 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50529dafffb277020000004b" }, "id" : "50529dafffb277020000004b", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "We can deduce the love and affection Victor held for Henry. Especially after this episode.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "restored", "uuid" : "21DB7587", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 119, "end" : "/div[1]/p[21]", "endOffset" : 127, "_id" : { "$oid" : "50529dafffb277020000004c" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347591599006 }, "created" : { "$date" : 1347591599006 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50529df22b76cf020000002a" }, "id" : "50529df22b76cf020000002a", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "Victor spoke as if he gave the creature something valued.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "bestowed", "uuid" : "229412B2", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 178, "end" : "/div[1]/p[21]", "endOffset" : 186, "_id" : { "$oid" : "50529df22b76cf020000002b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347591666234 }, "created" : { "$date" : 1347591666234 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50529e37ffb277020000004d" }, "id" : "50529e37ffb277020000004d", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "spoke insensbly", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "raved", "uuid" : "F33B6FA6", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 231, "end" : "/div[1]/p[21]", "endOffset" : 236, "_id" : { "$oid" : "50529e37ffb277020000004e" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347591735419 }, "created" : { "$date" : 1347591735419 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50529f7fffb277020000004f" }, "id" : "50529f7fffb277020000004f", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "The constancy at which Victor always raved on can be seen a few times in the book", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "pertinacity", "uuid" : "6319E484", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 385, "end" : "/div[1]/p[21]", "endOffset" : 396, "_id" : { "$oid" : "50529f7fffb2770200000050" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347592063046 }, "created" : { "$date" : 1347592063046 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50529fff2b76cf020000002c" }, "id" : "50529fff2b76cf020000002c", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "Victor's mind has been on the creature, and disturbed to the point that he did not take heed of his surroundings", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "pleasure", "uuid" : "CBE01F73", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 187, "end" : "/div[1]/p[22]", "endOffset" : 195, "_id" : { "$oid" : "50529fff2b76cf020000002d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347592191527 }, "created" : { "$date" : 1347592191527 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5052a01bffb2770200000051" }, "id" : "5052a01bffb2770200000051", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "a whole season was spent with him being troubled", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "disappeared", "uuid" : "20E15F82", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 236, "end" : "/div[1]/p[22]", "endOffset" : 247, "_id" : { "$oid" : "5052a01bffb2770200000052" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347592219063 }, "created" : { "$date" : 1347592219063 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5052a09d2b76cf020000002e" }, "id" : "5052a09d2b76cf020000002e", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "indicative of a new beginning, era", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "forth", "uuid" : "47AD49C3", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 286, "end" : "/div[1]/p[22]", "endOffset" : 291, "_id" : { "$oid" : "5052a09d2b76cf020000002f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347592349725 }, "created" : { "$date" : 1347592349725 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5052a0ee2b76cf0200000030" }, "id" : "5052a0ee2b76cf0200000030", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "Victor seems intent on putting the entire thing behind him", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "before", "uuid" : "4B25B4FF", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 540, "end" : "/div[1]/p[22]", "endOffset" : 546, "_id" : { "$oid" : "5052a0ee2b76cf0200000031" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347592430663 }, "created" : { "$date" : 1347592430663 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5052a165ffb2770200000053" }, "id" : "5052a165ffb2770200000053", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "the idea of the creature scares Victor;he shies away from the topic", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "trembled", "uuid" : "BCFD6857", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[25]", "startOffset" : 2, "end" : "/div[1]/p[25]", "endOffset" : 10, "_id" : { "$oid" : "5052a165ffb2770200000054" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347592549041 }, "created" : { "$date" : 1347592549041 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5052a2262b76cf0200000032" }, "id" : "5052a2262b76cf0200000032", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "Victor is glad that the topic of the creature is not brought up His tone lightens up.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "love", "uuid" : "20E23A1F", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[26]", "startOffset" : 163, "end" : "/div[1]/p[26]", "endOffset" : 167, "_id" : { "$oid" : "5052a2262b76cf0200000033" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347592742963 }, "created" : { "$date" : 1347592742963 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "50533ba1ffb277020000005b" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347632033189 }, "groups" : [ "21L.003" ], "id" : "50533ba1ffb277020000005b", "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "quote" : "curricle", "ranges" : [ { "start" : "/div[1]/p[159]", "startOffset" : 616, "end" : "/div[1]/p[159]", "endOffset" : 625, "_id" : { "$oid" : "505a56cf04ebe20200000012" } } ], "tags" : [ "curricle" ], "text" : "Carriage---the price and fanciness of which demonstrate wealth, from Thorpe's view. It also associates someone with a social class.", "updated" : { "$date" : 1348097743270 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "uuid" : "DA48CD89" } -{ "__v" : 1, "_id" : { "$oid" : "50533c372b76cf020000003b" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347632183976 }, "groups" : [ "21L.003" ], "id" : "50533c372b76cf020000003b", "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "quote" : "\"I will drive you up Lansdown Hill tomorrow.\"", "ranges" : [ { "start" : "/div[1]/p[173]", "startOffset" : 2, "end" : "/div[1]/p[173]", "endOffset" : 47, "_id" : { "$oid" : "505a56c304ebe20200000011" } } ], "tags" : [], "text" : "Carriage also provides privacy. Although sometimes more than two people will travel in the same curricle, the careful selection of the trip participants can ensure the confidentiality so that the parties involved can act with less discretion than they would in public.", "updated" : { "$date" : 1348097731483 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "uuid" : "A1C0766B" } -{ "id" : "505341d6ffb277020000005d", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Thorpe attempting to inquire after Catherine's wealth and future fortune.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "\"Old Allen is as rich as a Jew—is not he?\" Catherine did not\n\nunderstand him—and he repeated his question, adding in explanation,\n\n\"Old Allen, the man you are with.\"\n\n\n\n\n\n\"Oh! Mr. Allen, you mean. Yes, I believe, he is very rich.\"\n\n\n\n\n\n\"And no children at all?\"\n\n\n\n\n\n\"No—not any.\"\n\n\n\n\n\n\"A famous thing for his next heirs. He is your godfather, is not he?\"\n\n\n\n\n\n\"My godfather! No.\"\n\n\n\n\n\n\"But you are always very much with them.\"\n\n\n\n\n\n\"Yes, very much.\"", "uuid" : "EE67FD98", "_id" : { "$oid" : "505341d6ffb277020000005d" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[250]", "startOffset" : 1648, "end" : "/div[1]/p[257]", "endOffset" : 19, "_id" : { "$oid" : "505341d6ffb277020000005e" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347633622674 }, "created" : { "$date" : 1347633622674 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505346ecffb277020000005f", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Thorpe's imprudence is fully exhibited in this secluded environment. He pays no attention to decorum here.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Mr.\n\nThorpe only laughed, smacked his whip, encouraged his horse, made odd\n\nnoises, and drove on", "uuid" : "B9A3F3D7", "_id" : { "$oid" : "505346ecffb277020000005f" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[407]", "startOffset" : 852, "end" : "/div[1]/p[407]", "endOffset" : 948, "_id" : { "$oid" : "505346ecffb2770200000060" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347634924920 }, "created" : { "$date" : 1347634924920 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50534eb8ffb2770200000065", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Jaundice? chole of the four humours?earth? or is the 4th Horseman-Death?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "yellow", "uuid" : "CE79B7D2", "_id" : { "$oid" : "50534eb8ffb2770200000065" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 247, "end" : "/div[1]/p[2]", "endOffset" : 254, "_id" : { "$oid" : "50534eb8ffb2770200000066" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347636920296 }, "created" : { "$date" : 1347636920296 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5053825c2b76cf0200000040", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "the anxiety really is killing victor. the first sign of victor's bad health situation.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "With an anxiety that almost amounted to agony", "uuid" : "FBDEDA08", "_id" : { "$oid" : "5053825c2b76cf0200000040" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 83, "end" : "/div[1]/p[1]", "endOffset" : 128, "_id" : { "$oid" : "5053825c2b76cf0200000041" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347650140562 }, "created" : { "$date" : 1347650140562 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50538290ffb2770200000067", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "doesn't really make sense to me. weird grammar here.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "that I might infuse a spark of being into the lifeless thing that lay at my feet", "uuid" : "6805ADB6", "_id" : { "$oid" : "50538290ffb2770200000067" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 177, "end" : "/div[1]/p[1]", "endOffset" : 257, "_id" : { "$oid" : "50538290ffb2770200000068" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347650192441 }, "created" : { "$date" : 1347650192441 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505383012b76cf0200000042", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "the dictionary says \"Causing the mood of gloom\". we can see mary shelly was trying to produce a gloomy scene here.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "dismally", "uuid" : "ABD39D08", "_id" : { "$oid" : "505383012b76cf0200000042" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 312, "end" : "/div[1]/p[1]", "endOffset" : 320, "_id" : { "$oid" : "505383012b76cf0200000043" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347650305836 }, "created" : { "$date" : 1347650305836 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5053833f2b76cf0200000044", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "hints that victor had been working continuously for a seriously long time", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "my candle was nearly burnt out", "uuid" : "D9D96C9C", "_id" : { "$oid" : "5053833f2b76cf0200000044" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 344, "end" : "/div[1]/p[1]", "endOffset" : 374, "_id" : { "$oid" : "5053833f2b76cf0200000045" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347650367997 }, "created" : { "$date" : 1347650367997 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505383a8ffb2770200000069", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "The creature comes to life!!! very vivid and scary. just like a movie.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I saw the dull yellow eye of the creature open; it breathed hard, and a convulsive motion agitated its limbs", "uuid" : "2DFA6736", "_id" : { "$oid" : "505383a8ffb2770200000069" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 429, "end" : "/div[1]/p[1]", "endOffset" : 537, "_id" : { "$oid" : "505383a8ffb277020000006a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347650472587 }, "created" : { "$date" : 1347650472587 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505384032b76cf0200000046", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Is this irony?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "beautiful. Beautiful! Great God!", "uuid" : "8D3B04E6", "_id" : { "$oid" : "505384032b76cf0200000046" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 211, "end" : "/div[1]/p[2]", "endOffset" : 243, "_id" : { "$oid" : "505384032b76cf0200000047" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347650563286 }, "created" : { "$date" : 1347650563286 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5053844effb277020000006b", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Vivid portray of the monster's appearance. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "his teeth of a pearly whiteness; but these luxuriances only formed a more horrid contrast with his watery eyes, that seemed almost of the same colour as the dun-white sockets in which they were set, his shrivelled complexion and straight black lips.", "uuid" : "6BB55964", "_id" : { "$oid" : "5053844effb277020000006b" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 366, "end" : "/div[1]/p[2]", "endOffset" : 615, "_id" : { "$oid" : "5053844effb277020000006c" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347650638355 }, "created" : { "$date" : 1347650638355 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505385292b76cf0200000048", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Maybe this number is not that appropriate. It doesn't make sense to me that Victor only took 2 years to make the monster. If it were that easy, why are scientists working for decades on still trying to get the highest efficient photovoltaic cell to pass the efficiency of 20%? Does Mary Shelly have a strong background knowledge in science and engineering?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "nearly two years,", "uuid" : "299C5309", "_id" : { "$oid" : "505385292b76cf0200000048" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 109, "end" : "/div[1]/p[3]", "endOffset" : 126, "_id" : { "$oid" : "505385292b76cf0200000049" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347650857327 }, "created" : { "$date" : 1347650857327 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505386082b76cf020000004a", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Is Victor out of his mind? It's not really ethical to infuse life into an inanimate body. If he's in 21st century, he must have violated UN's related laws.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "for the sole purpose of infusing life into an inanimate body", "uuid" : "DBEDE21E", "_id" : { "$oid" : "505386082b76cf020000004a" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 127, "end" : "/div[1]/p[3]", "endOffset" : 187, "_id" : { "$oid" : "505386082b76cf020000004b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347651080651 }, "created" : { "$date" : 1347651080651 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5053865f2b76cf020000004c", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "It's great to have enthusiasm, but when it exceeds moderation, it becomes detrimental to us. Thus, I would say that Victor was a mad scientist.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I had desired it with an ardour that far exceeded moderation", "uuid" : "DB950BAB", "_id" : { "$oid" : "5053865f2b76cf020000004c" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 240, "end" : "/div[1]/p[3]", "endOffset" : 300, "_id" : { "$oid" : "5053865f2b76cf020000004d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347651167835 }, "created" : { "$date" : 1347651167835 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505386d62b76cf020000004e", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "a state of physical weariness", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "lassitude", "uuid" : "A41BCDBA", "_id" : { "$oid" : "505386d62b76cf020000004e" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 596, "end" : "/div[1]/p[3]", "endOffset" : 605, "_id" : { "$oid" : "505386d62b76cf020000004f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347651286123 }, "created" : { "$date" : 1347651286123 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5053870b2b76cf0200000050", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "a loud, confusing noise", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "tumult", "uuid" : "73FED084", "_id" : { "$oid" : "5053870b2b76cf0200000050" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 623, "end" : "/div[1]/p[3]", "endOffset" : 630, "_id" : { "$oid" : "5053870b2b76cf0200000051" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347651339195 }, "created" : { "$date" : 1347651339195 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50538754e9a1430200000002", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "We can clearly see that Victor's health is in a pretty bad situation, both mentally and physically. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "but I was disturbed by the wildest dreams", "uuid" : "6BAC3DE7", "_id" : { "$oid" : "50538754e9a1430200000002" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 787, "end" : "/div[1]/p[3]", "endOffset" : 828, "_id" : { "$oid" : "50538754e9a1430200000003" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347651412480 }, "created" : { "$date" : 1347651412480 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505387882b76cf0200000052", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "this is pretty scary. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "livid with the hue of death", "uuid" : "917D7738", "_id" : { "$oid" : "505387882b76cf0200000052" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1019, "end" : "/div[1]/p[3]", "endOffset" : 1046, "_id" : { "$oid" : "505387882b76cf0200000053" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347651464398 }, "created" : { "$date" : 1347651464398 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505388172b76cf0200000054", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "He was obviously missing Elizabeth and his mother, and with his crazy work going on, he had bad dreams that both of his beloved ones were in.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "thought I saw Elizabeth, in the bloom of health, walking in the streets of Ingolstadt. Delighted and surprised, I embraced her, but as I imprinted the first kiss on her lips, they became livid with the hue of death; her features appeared to change, and I thought that I held the corpse of my dead mother in my arms; a shroud enveloped her form, and I saw the grave-worms crawling in the folds of the flannel", "uuid" : "F466B1D3", "_id" : { "$oid" : "505388172b76cf0200000054" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 831, "end" : "/div[1]/p[3]", "endOffset" : 1239, "_id" : { "$oid" : "505388172b76cf0200000055" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347651607368 }, "created" : { "$date" : 1347651607368 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505388422b76cf0200000056", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "just like when the monster arose.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "with horror; a cold dew covered my forehead, my teeth chattered, and every limb became convulsed;", "uuid" : "BA0D9799", "_id" : { "$oid" : "505388422b76cf0200000056" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1264, "end" : "/div[1]/p[3]", "endOffset" : 1362, "_id" : { "$oid" : "505388422b76cf0200000057" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347651650466 }, "created" : { "$date" : 1347651650466 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5053886d2b76cf0200000058", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "that's kind of mean to say that.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "wretch", "uuid" : "1EDFB37E", "_id" : { "$oid" : "5053886d2b76cf0200000058" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1473, "end" : "/div[1]/p[3]", "endOffset" : 1479, "_id" : { "$oid" : "5053886d2b76cf0200000059" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347651693467 }, "created" : { "$date" : 1347651693467 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505388a22b76cf020000005a", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "just like how an infant looks at his father for the first time.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "His jaws opened, and he muttered some inarticulate sounds, while a grin wrinkled his cheeks.", "uuid" : "75C2DCF1", "_id" : { "$oid" : "505388a22b76cf020000005a" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1618, "end" : "/div[1]/p[3]", "endOffset" : 1710, "_id" : { "$oid" : "505388a22b76cf020000005b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347651746801 }, "created" : { "$date" : 1347651746801 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50538924e9a1430200000004", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Victor considered it demon / corpse, instead of a living and nice creature.He's so mean!", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "demoniacal corpse", "uuid" : "B8A9352C", "_id" : { "$oid" : "50538924e9a1430200000004" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 2110, "end" : "/div[1]/p[3]", "endOffset" : 2127, "_id" : { "$oid" : "50538924e9a1430200000005" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347651876870 }, "created" : { "$date" : 1347651876870 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5053898ee9a1430200000006", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Notice how Victor called him a wretch, and then he himself passed the night \"wretchedly\". like father, like son.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "wretchedly", "uuid" : "1F39D496", "_id" : { "$oid" : "5053898ee9a1430200000006" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 19, "end" : "/div[1]/p[5]", "endOffset" : 29, "_id" : { "$oid" : "5053898ee9a1430200000007" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347651982913 }, "created" : { "$date" : 1347651982913 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505389e52b76cf020000005c", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Notice how ironic this is. Victor's dream and enthusiasm are now killing him mentally. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Mingled with this horror, I felt the bitterness of disappointment; dreams that had been my food and pleasant rest for so long a space were now become a hell to me; and the change was so rapid, the overthrow so complete!", "uuid" : "F5AB4082", "_id" : { "$oid" : "505389e52b76cf020000005c" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 199, "end" : "/div[1]/p[5]", "endOffset" : 418, "_id" : { "$oid" : "505389e52b76cf020000005d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347652069675 }, "created" : { "$date" : 1347652069675 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50538a862b76cf020000005e", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Man up! Victor!", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I did not dare return to the apartment which I inhabited", "uuid" : "24B079B3", "_id" : { "$oid" : "50538a862b76cf020000005e" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 418, "end" : "/div[1]/p[6]", "endOffset" : 475, "_id" : { "$oid" : "50538a862b76cf020000005f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347652230083 }, "created" : { "$date" : 1347652230083 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50538b12e9a1430200000008", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Should probably look this up. It's so hard to comprehend.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Like one who, on a lonely road, Doth walk in fear and dread, And, having once turned round, walks on, And turns no more his head; Because he knows a frightful fiend Doth close behind him tread.", "uuid" : "DD2CAE39", "_id" : { "$oid" : "50538b12e9a1430200000008" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[8]", "startOffset" : 0, "end" : "/div[1]/p[8]", "endOffset" : 193, "_id" : { "$oid" : "50538b12e9a1430200000009" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347652370548 }, "created" : { "$date" : 1347652370548 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50538bb02b76cf0200000060", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Victor's excitement and joy of seeing his best friend Henry Clerval.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Nothing could equal my delight on seeing Clerval", "uuid" : "8E0E3103", "_id" : { "$oid" : "50538bb02b76cf0200000060" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 0, "end" : "/div[1]/p[11]", "endOffset" : 48, "_id" : { "$oid" : "50538bb02b76cf0200000061" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347652528027 }, "created" : { "$date" : 1347652528027 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50538c0a2b76cf0200000062", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Means that he still misses his family and friends back in Geneva ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "his presence brought back to my thoughts my father, Elizabeth, and all those scenes of home so dear to my recollection", "uuid" : "EE7906C6", "_id" : { "$oid" : "50538c0a2b76cf0200000062" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 50, "end" : "/div[1]/p[11]", "endOffset" : 168, "_id" : { "$oid" : "50538c0a2b76cf0200000063" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347652618174 }, "created" : { "$date" : 1347652618174 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50538c5a2b76cf0200000064", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "This is the best thing about seeing a best friend. It heals everything.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I felt suddenly, and for the first time during many months, calm and serene joy", "uuid" : "90426A5E", "_id" : { "$oid" : "50538c5a2b76cf0200000064" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 239, "end" : "/div[1]/p[11]", "endOffset" : 318, "_id" : { "$oid" : "50538c5a2b76cf0200000065" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347652698513 }, "created" : { "$date" : 1347652698513 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50538cd02b76cf0200000066", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "What does this mean?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "By the by", "uuid" : "86A14DFE", "_id" : { "$oid" : "50538cd02b76cf0200000066" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 84, "end" : "/div[1]/p[13]", "endOffset" : 93, "_id" : { "$oid" : "50538cd02b76cf0200000067" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347652816227 }, "created" : { "$date" : 1347652816227 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50538d012b76cf0200000068", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Even his best friend didn't know about him creating the monster.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "\"I did not before remark how very ill you appear; so thin and pale; you look as if you had been watching for several nights.\"", "uuid" : "348C15F8", "_id" : { "$oid" : "50538d012b76cf0200000068" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 238, "end" : "/div[1]/p[13]", "endOffset" : 363, "_id" : { "$oid" : "50538d012b76cf0200000069" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347652865295 }, "created" : { "$date" : 1347652865295 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50538d36e9a143020000000a", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Bro love over here", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I dreaded to behold this monster, but I feared still more that Henry should see him", "uuid" : "A682C0F7", "_id" : { "$oid" : "50538d36e9a143020000000a" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 332, "end" : "/div[1]/p[15]", "endOffset" : 416, "_id" : { "$oid" : "50538d36e9a143020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347652918152 }, "created" : { "$date" : 1347652918152 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50538d7ce9a143020000000c", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "suggesting that victor is just like a kid and the monster is the ghost that freaks him out.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I threw the door forcibly open, as children are accustomed to do when they expect a spectre to stand in waiting for them on the other side;", "uuid" : "C905E4A3", "_id" : { "$oid" : "50538d7ce9a143020000000c" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 654, "end" : "/div[1]/p[15]", "endOffset" : 793, "_id" : { "$oid" : "50538d7ce9a143020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347652988124 }, "created" : { "$date" : 1347652988124 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50538d90e9a143020000000e", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Such a great relief ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "great a good fortune could have befallen me", "uuid" : "486C2E0D", "_id" : { "$oid" : "50538d90e9a143020000000e" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 950, "end" : "/div[1]/p[15]", "endOffset" : 993, "_id" : { "$oid" : "50538d90e9a143020000000f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347653008065 }, "created" : { "$date" : 1347653008065 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50538db42b76cf020000006a", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "does this mean the monster or the fear of encountering the monster?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "enemy", "uuid" : "C5710581", "_id" : { "$oid" : "50538db42b76cf020000006a" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 1029, "end" : "/div[1]/p[15]", "endOffset" : 1034, "_id" : { "$oid" : "50538db42b76cf020000006b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347653044808 }, "created" : { "$date" : 1347653044808 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50538de6e9a1430200000010", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "weird grammar again", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "cried I", "uuid" : "0443846E", "_id" : { "$oid" : "50538de6e9a1430200000010" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 17, "end" : "/div[1]/p[18]", "endOffset" : 24, "_id" : { "$oid" : "50538de6e9a1430200000011" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347653094698 }, "created" : { "$date" : 1347653094698 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50538e25e9a1430200000012", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Victor is acting just like a kid. Clerval must be thinking WTF right now.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "HE can tell. Oh, save me! Save me!\" I imagined that the monster seized me; I struggled furiously and fell down in a fit.", "uuid" : "646101A4", "_id" : { "$oid" : "50538e25e9a1430200000012" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 121, "end" : "/div[1]/p[18]", "endOffset" : 241, "_id" : { "$oid" : "50538e25e9a1430200000013" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347653157204 }, "created" : { "$date" : 1347653157204 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50538e622b76cf020000006c", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Cleveral was being such a great friend. So thoughtful!", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "and how wretched my sickness would make Elizabeth, he spared them this grief by concealing the extent of my disorder", "uuid" : "F02F3925", "_id" : { "$oid" : "50538e622b76cf020000006c" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 226, "end" : "/div[1]/p[20]", "endOffset" : 342, "_id" : { "$oid" : "50538e622b76cf020000006d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347653218755 }, "created" : { "$date" : 1347653218755 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50538ea6e9a1430200000014", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "I think it's pretty obvious already that Victor was really ill. A little bit repetitive I guess.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "But I was in reality very ill", "uuid" : "D96772AC", "_id" : { "$oid" : "50538ea6e9a1430200000014" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 0, "end" : "/div[1]/p[21]", "endOffset" : 29, "_id" : { "$oid" : "50538ea6e9a1430200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347653286631 }, "created" : { "$date" : 1347653286631 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50538efe2b76cf020000006e", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "pretty ironic here. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "fatal passion", "uuid" : "474EE0FA", "_id" : { "$oid" : "50538efe2b76cf020000006e" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 569, "end" : "/div[1]/p[22]", "endOffset" : 582, "_id" : { "$oid" : "50538efe2b76cf020000006f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347653374097 }, "created" : { "$date" : 1347653374097 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50538fa42b76cf0200000070", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Best friends never probe into one's privacy or something he wouldn't like to share about.Even more persuasive that Henry was Victor's best friend.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I trembled. One subject! What could it be? Could he allude to an object on whom I dared not even think? \"Compose yourself,\" said Clerval, who observed my change of colour, \"I will not mention it if it agitates you; but your father and cousin would be very happy if they received a letter from you in your own handwriting. They hardly know how ill you have been and are uneasy at your long silence.\"", "uuid" : "8575E157", "_id" : { "$oid" : "50538fa42b76cf0200000070" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[25]", "startOffset" : 0, "end" : "/div[1]/p[26]", "endOffset" : 0, "_id" : { "$oid" : "50538fa42b76cf0200000071" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347653540407 }, "created" : { "$date" : 1347653540407 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5053c8aee9a1430200000016" }, "id" : "5053c8aee9a1430200000016", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "eye", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "eye", "uuid" : "EF071623", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 451, "end" : "/div[1]/p[1]", "endOffset" : 454, "_id" : { "$oid" : "5053c8aee9a1430200000017" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347668142052 }, "created" : { "$date" : 1347668142052 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "50548d7fac97d50200000004" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347718527070 }, "groups" : [ "21L.448J" ], "id" : "50548d7fac97d50200000004", "permissions" : { "admin" : [ "holjose@mit.edu" ], "delete" : [ "holjose@mit.edu" ], "read" : [], "update" : [ "holjose@mit.edu" ] }, "quote" : "`Yes, it IS his business!' said Five, `and I'll tell him--it was for bringing the cook\n\t\t\ttulip-roots instead of onions.'", "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 827, "end" : "/div[1]/div[3]", "endOffset" : 949, "_id" : { "$oid" : "50548d7fac97d50200000005" } } ], "tags" : [], "text" : "Accidentally bringing a cook the wrong item seems like such an arbitrary thing to have the possibility of beheading. Lewis Carroll is probably satirizing the ridiculousness of some rules in our society. By having Alice there absorbing the whole thing, he is probably also trying to show that if a child is exposed to these arbitrary rules, he/she will assimilate them and fail to question them.", "updated" : { "$date" : 1347722931356 }, "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "user" : "holjose@mit.edu", "username" : "Holly J.", "uuid" : "CCEAD828" } -{ "__v" : 1, "_id" : { "$oid" : "50548f48e9a143020000001e" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347718984064 }, "groups" : [ "21L.448J" ], "id" : "50548f48e9a143020000001e", "permissions" : { "admin" : [ "holjose@mit.edu" ], "delete" : [ "holjose@mit.edu" ], "read" : [], "update" : [ "holjose@mit.edu" ] }, "quote" : "`Get to your places!' shouted the Queen in a voice of thunder, and people began running\n\t\t\tabout in all directions, tumbling up against each other; however, they got settled down in\n\t\t\ta minute or two, and the game began. Alice thought she had never seen such a curious\n\t\t\tcroquet-ground in her life; it was all ridges and furrows; the balls were live hedgehogs,\n\t\t\tthe mallets live flamingoes, and the soldiers had to double themselves up and to stand on\n\t\t\ttheir hands and feet, to make the arches.", "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 6892, "end" : "/div[1]/div[3]", "endOffset" : 7393, "_id" : { "$oid" : "50548f48e9a143020000001f" } } ], "tags" : [], "text" : "In society, people will blindly follow a leader. The creatures in the Queen's kingdom seem to just follow her every command. They do not seem to even think about the command, but just follow it. This is an exaggeration of real society.", "updated" : { "$date" : 1347722948096 }, "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "user" : "holjose@mit.edu", "username" : "Holly J.", "uuid" : "1B190A43" } -{ "__v" : 1, "_id" : { "$oid" : "50549357ac97d50200000006" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347720023862 }, "groups" : [ "21L.448J" ], "id" : "50549357ac97d50200000006", "permissions" : { "admin" : [ "holjose@mit.edu" ], "delete" : [ "holjose@mit.edu" ], "read" : [], "update" : [ "holjose@mit.edu" ] }, "quote" : "`Not at all,' said Alice: `she's so extremely--' Just then she noticed that the Queen was\n\t\t\tclose behind her, listening: so she went on, `--likely to win, that it's hardly worth\n\t\t\twhile finishing the game.'", "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 10473, "end" : "/div[1]/div[3]", "endOffset" : 10682, "_id" : { "$oid" : "50549357ac97d50200000007" } } ], "tags" : [], "text" : "Alice quickly learns the society rule of appeasing the queen. Her original nature was to speak her mind. In the beginning, she seemed very unlikely to have the ability to lie or try to cover something up. However, here, she realizes it is a survival tactic and adapts almost immediately.", "updated" : { "$date" : 1347722985771 }, "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "user" : "holjose@mit.edu", "username" : "Holly J.", "uuid" : "340E3C51" } -{ "__v" : 1, "_id" : { "$oid" : "50549445ac97d50200000008" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347720261696 }, "groups" : [ "21L.448J" ], "id" : "50549445ac97d50200000008", "permissions" : { "admin" : [ "holjose@mit.edu" ], "delete" : [ "holjose@mit.edu" ], "read" : [], "update" : [ "holjose@mit.edu" ] }, "quote" : "`It's no use speaking to it,' she\n\t\t\tthought, `till its ears have come, or at least one of them.'", "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 9483, "end" : "/div[1]/div[3]", "endOffset" : 9581, "_id" : { "$oid" : "50549445ac97d50200000009" } } ], "tags" : [], "text" : "This shows the logic of rules of nature. In Alice's mind, based on the natural world she knows, it seems logical that the cat would not be able to hear her until his ears were present. However, Carroll is also bringing in irony as it is unnatural that an object would have the ability of invisibility. Perhaps Carroll is commenting on the seeming randomness of some natural rules.", "updated" : { "$date" : 1347722970268 }, "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "user" : "holjose@mit.edu", "username" : "Holly J.", "uuid" : "F9012778" } -{ "id" : "5054985aac97d5020000000a", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Schools teach children how to understand the natural world. In Wonderland, the students are also learning about their natural world, but it is much different than Earth. The young age at which all of this is taught is what allows the society to run the way it does without question because it is the only way the citizens know and accept.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`Reeling and Writhing, of course, to begin with,' the Mock Turtle replied; `and then the\n\t\t\tdifferent branches of Arithmetic-- Ambition, Distraction, Uglification, and Derision.'", "uuid" : "B4FB76D9", "_id" : { "$oid" : "5054985aac97d5020000000a" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [ "holjose@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 11209, "end" : "/div[1]/div[4]", "endOffset" : 11388, "_id" : { "$oid" : "5054985aac97d5020000000b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347721306646 }, "created" : { "$date" : 1347721306646 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50549ceaac97d5020000000c", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Alice is questioning the rule. It is a very strange rule, but nobody else questions it. Possibly out of fear?", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`Well, I shan't go, at any rate,' said Alice: `besides, that's not a regular rule: you\n\t\t\tinvented it just now.'", "uuid" : "5C07D379", "_id" : { "$oid" : "50549ceaac97d5020000000c" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [ "holjose@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 3063, "end" : "/div[1]/div[6]", "endOffset" : 3176, "_id" : { "$oid" : "50549ceaac97d5020000000d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347722474724 }, "created" : { "$date" : 1347722474724 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50549e25e9a1430200000020", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "There are many illogical procedures in the jury. This statement by the queen makes the entire procedure void. There is no reason to have a trial if the sentence will be given before a conclusion is made. Alice realizes the injustice and tries to do something about it.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`No, no!' said the Queen. `Sentence first--verdict afterwards.'", "uuid" : "3B78B7E8", "_id" : { "$oid" : "50549e25e9a1430200000020" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [ "holjose@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 8394, "end" : "/div[1]/div[6]", "endOffset" : 8458, "_id" : { "$oid" : "50549e25e9a1430200000021" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347722789761 }, "created" : { "$date" : 1347722789761 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5054a708ac97d5020000000e" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347725064820 }, "groups" : [ "21L.003" ], "id" : "5054a708ac97d5020000000e", "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "quote" : "Have you gone on\n\nwith Udolpho?\"", "ranges" : [ { "start" : "/div[1]/p[108]", "startOffset" : 635, "end" : "/div[1]/p[108]", "endOffset" : 669, "_id" : { "$oid" : "5054a708ac97d5020000000f" } } ], "tags" : [], "text" : "Gothic novel Catherine is reading that later inspires her fantasies at Northanger Abbey. http://books.google.com/books/about/The_Mysteries_of_Udolpho.html?id=qAPHL0F5cicC", "updated" : { "$date" : 1347725088022 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "slonaker@mit.edu", "username" : "James S.", "uuid" : "6751F60E" } -{ "_id" : { "$oid" : "5054a763ac97d50200000010" }, "__v" : 1, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347725155027 }, "groups" : [ "21L.003" ], "id" : "5054a763ac97d50200000010", "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "quote" : "I will read you their names directly; here they are, in my pocketbook.\n\nCastle of Wolfenbach, Clermont, Mysterious Warnings, Necromancer of the\n\nBlack Forest, Midnight Bell, Orphan of the Rhine, and Horrid Mysteries.\n\nThose will last us some time.\"", "ranges" : [ { "start" : "/div[1]/p[114]", "startOffset" : 3, "end" : "/div[1]/p[114]", "endOffset" : 253, "_id" : { "$oid" : "505a64d004ebe20200000015" } } ], "tags" : [], "text" : "Other gothic novels of the time period (late 18th century). Gothic novels are horror-love stories that typically take place in a castle, but not in england, in mainland Europe. http://cai.ucdavis.edu/waters-sites/gothicnovel/155breport.html", "updated" : { "$date" : 1348101342663 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "slonaker@mit.edu", "username" : "James S.", "uuid" : "0E3DB94B" } -{ "_id" : { "$oid" : "5054a7c3ac97d50200000012" }, "__v" : 1, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347725251919 }, "groups" : [ "21L.003" ], "id" : "5054a7c3ac97d50200000012", "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "quote" : "\"It is so odd to me, that you should never have read Udolpho before; but\n\nI suppose Mrs. Morland objects to novels.\"\n\n\n\n\n\n\"No, she does not. She very often reads Sir Charles Grandison herself;\n\nbut new books do not fall in our way.\"\n\n\n\n\n\n\"Sir Charles Grandison! That is an amazing horrid book, is it not? I\n\nremember Miss Andrews could not get through the first volume.\"", "ranges" : [ { "start" : "/div[1]/p[124]", "startOffset" : 2, "end" : "/div[1]/p[127]", "endOffset" : 0, "_id" : { "$oid" : "505a007d6ee4de020000007e" } } ], "tags" : [], "text" : "Shows that Mrs. Morland also reads novels, as does Miss Andrews. Almost every female in the book reads novels.", "updated" : { "$date" : 1348075645503 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "slonaker@mit.edu", "username" : "James S.", "uuid" : "B9434627" } -{ "_id" : { "$oid" : "5054a828e9a1430200000022" }, "id" : "5054a828e9a1430200000022", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Catherine has no interest in what Mr. Thorpe is saying at all and thus changes the subject to something she is interested in, specifically novels.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Catherine, after listening and agreeing as long as\n\nshe could, with all the civility and deference of the youthful female\n\nmind, fearful of hazarding an opinion of its own in opposition to that\n\nof a self-assured man, especially where the beauty of her own sex is\n\nconcerned, ventured at length to vary the subject by a question which\n\nhad been long uppermost in her thoughts; it was, \"Have you ever read\n\nUdolpho, Mr. Thorpe?\"", "uuid" : "4FACAC2D", "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[180]", "startOffset" : 312, "end" : "/div[1]/p[180]", "endOffset" : 741, "_id" : { "$oid" : "5054a828e9a1430200000023" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347725352107 }, "created" : { "$date" : 1347725352107 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5054a87fe9a1430200000024" }, "__v" : 1, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347725439542 }, "groups" : [ "21L.003" ], "id" : "5054a87fe9a1430200000024", "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "quote" : "\"Udolpho! Oh, Lord! Not I; I never read novels; I have something else to\n\ndo.\"\n\n\n\n\n\nCatherine, humbled and ashamed, was going to apologize for her question,\n\nbut he prevented her by saying, \"Novels are all so full of nonsense\n\nand stuff; there has not been a tolerably decent one come out since\n\nTom Jones, except The Monk; I read that t'other day; but as for all the\n\nothers, they are the stupidest things in creation.\"", "ranges" : [ { "start" : "/div[1]/p[181]", "startOffset" : 2, "end" : "/div[1]/p[182]", "endOffset" : 340, "_id" : { "$oid" : "505a65f604ebe20200000018" } } ], "tags" : [], "text" : "John Thorpe at first shuts down any notion of novel reading by saying they are all stupid. This definitely helped Catherine form her unfavorable opinion of him.", "updated" : { "$date" : 1348101622220 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "slonaker@mit.edu", "username" : "James S.", "uuid" : "5B68842F" } -{ "_id" : { "$oid" : "5054a8c7e9a1430200000026" }, "__v" : 1, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347725511310 }, "groups" : [ "21L.003" ], "id" : "5054a8c7e9a1430200000026", "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "quote" : "\"I think you must like Udolpho, if you were to read it; it is so very\n\ninteresting.\"\n\n\n\n\n\n\"Not I, faith! No, if I read any, it shall be Mrs. Radcliffe's; her\n\nnovels are amusing enough; they are worth reading; some fun and nature\n\nin them.\"\n\n\n\n\n\n\"Udolpho was written by Mrs. Radcliffe,\" said Catherine, with some\n\nhesitation, from the fear of mortifying him.\n\n\n\n\n\n\"No sure; was it? Aye, I remember, so it was; I was thinking of that\n\nother stupid book, written by that woman they make such a fuss about,\n\nshe who married the French emigrant.\"", "ranges" : [ { "start" : "/div[1]/p[183]", "startOffset" : 2, "end" : "/div[1]/p[186]", "endOffset" : 182, "_id" : { "$oid" : "505642ae1a807e020000009e" } } ], "tags" : [], "text" : "John then goes back and says he has read some of Anne Radcliffe's novels. I wonder if Anne Radcliffe was famous at the time or just choose her randomly, rather than another author. Maybe because she is another woman author?", "updated" : { "$date" : 1348101698063 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "slonaker@mit.edu", "username" : "James S.", "uuid" : "7E674DD1" } -{ "_id" : { "$oid" : "5054a99fac97d50200000014" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347725727639 }, "groups" : [ "21L.003" ], "id" : "5054a99fac97d50200000014", "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "quote" : "I suppose you mean Camilla?\"\n\n\n\n\n\n\"Yes, that's the book; such unnatural stuff! An old man playing at\n\nsee-saw, I took up the first volume once and looked it over, but I soon\n\nfound it would not do; indeed I guessed what sort of stuff it must be\n\nbefore I saw it: as soon as I heard she had married an emigrant, I was\n\nsure I should never be able to get through it.\"\n\n\n\n\n\n\"I have never read it.\"\n\n\n\n\n\n\"You had no loss, I assure you; it is the horridest nonsense you can\n\nimagine; there is nothing in the world in it but an old man's playing at\n\nsee-saw and learning Latin; upon my soul there is not.\"\n\n\n\n\n\nThis critique, the justness of which was unfortunately lost on poor\n\nCatherine", "ranges" : [ { "start" : "/div[1]/p[187]", "startOffset" : 3, "end" : "/div[1]/p[191]", "endOffset" : 80, "_id" : { "$oid" : "5054a99fac97d50200000015" } } ], "tags" : [], "text" : "Camilla is also a gothic love story. http://www.goodreads.com/book/show/220079.Camilla", "updated" : { "$date" : 1347725733630 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "slonaker@mit.edu", "username" : "James S.", "uuid" : "3122FF09" } -{ "_id" : { "$oid" : "5054aa58e9a1430200000028" }, "id" : "5054aa58e9a1430200000028", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Another reference to her reading.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Catherine was then\n\nleft to the luxury of a raised, restless, and frightened imagination\n\nover the pages of Udolpho, lost from all worldly concerns of dressing\n\nand dinner,", "uuid" : "CACCED8C", "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[202]", "startOffset" : 752, "end" : "/div[1]/p[202]", "endOffset" : 924, "_id" : { "$oid" : "5054aa58e9a1430200000029" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347725912354 }, "created" : { "$date" : 1347725912354 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5054aad2ac97d50200000016" }, "id" : "5054aad2ac97d50200000016", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Foreshadowing her fantasies in the second volume, she compares the Blaize Castle to be like Udolpho.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "To feel herself\n\nslighted by them was very painful. On the other hand, the delight of\n\nexploring an edifice like Udolpho, as her fancy represented Blaize\n\nCastle to be, was such a counterpoise of good as might console her for\n\nalmost anything.", "uuid" : "5912DD9A", "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[404]", "startOffset" : 690, "end" : "/div[1]/p[404]", "endOffset" : 934, "_id" : { "$oid" : "5054aad2ac97d50200000017" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347726034196 }, "created" : { "$date" : 1347726034196 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5054acafac97d5020000001a" }, "__v" : 1, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347726511731 }, "groups" : [ "21L.003" ], "id" : "5054acafac97d5020000001a", "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "quote" : "Oh! No, I only mean what I have read about. It always puts me in mind\n\nof the country that Emily and her father travelled through, in The\n\nMysteries of Udolpho. But you never read novels, I dare say?\"\n\n\n\n\n\n\"Why not?\"\n\n\n\n\n\n\"Because they are not clever enough for you—gentlemen read better\n\nbooks.\"\n\n\n\n\n\n\"The person, be it gentleman or lady, who has not pleasure in a good\n\nnovel, must be intolerably stupid. I have read all Mrs. Radcliffe's\n\nworks, and most of them with great pleasure. The Mysteries of Udolpho,\n\nwhen I had once begun it, I could not lay down again; I remember\n\nfinishing it in two days—my hair standing on end the whole time.\"\n\n\n\n\n\n\"Yes,\" added Miss Tilney, \"and I remember that you undertook to read it\n\naloud to me, and that when I was called away for only five minutes to\n\nanswer a note, instead of waiting for me, you took the volume into the\n\nHermitage Walk, and I was obliged to stay till you had finished it.\"\n\n\n\n\n\n\"Thank you, Eleanor—a most honourable testimony. You see, Miss Morland,\n\nthe injustice of your suspicions. Here was I, in my eagerness to get on,\n\nrefusing to wait only five minutes for my sister, breaking the promise\n\nI had made of reading it aloud, and keeping her in suspense at a most\n\ninteresting part, by running away with the volume, which, you are to\n\nobserve, was her own, particularly her own. I am proud when I reflect on\n\nit, and I think it must establish me in your good opinion.\"\n\n\n\n\n\n\"I am very glad to hear it indeed, and now I shall never be ashamed of\n\nliking Udolpho myself. But I really thought before, young men despised\n\nnovels amazingly.\"\n\n\n\n\n\n\"It is amazingly; it may well suggest amazement if they do—for they\n\nread nearly as many as women. I myself have read hundreds and hundreds.\n\nDo not imagine that you can cope with me in a knowledge of Julias and\n\nLouisas. If we proceed to particulars, and engage in the never-ceasing\n\ninquiry of 'Have you read this?' and 'Have you read that?' I shall soon\n\nleave you as far behind me as—what shall I say?—I want an appropriate\n\nsimile.—as far as your friend Emily herself left poor Valancourt when\n\nshe went with her aunt into Italy.", "ranges" : [ { "start" : "/div[1]/p[487]", "startOffset" : 3, "end" : "/div[1]/p[494]", "endOffset" : 537, "_id" : { "$oid" : "505a68d204ebe2020000001d" } } ], "tags" : [], "text" : "This passage contrasts with the earlier passage where John and Catherine were discussing novels. There John said most novels were stupid, while in this passage Henry says that people who do not enjoy a good novel are stupid. This plays a big role in why she finds Henry favorably over John. Also, again Henry seems metrosexual as he likes reading which was typically done mostly by females in this time period. Maybe thats why Catherine is attracted to him.", "updated" : { "$date" : 1348102354400 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "slonaker@mit.edu", "username" : "James S.", "uuid" : "7C02768E" } -{ "_id" : { "$oid" : "5054ad73ac97d5020000001c" }, "__v" : 1, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347726707603 }, "groups" : [ "21L.003" ], "id" : "5054ad73ac97d5020000001c", "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "quote" : "\"To be sure, I have. Is not it a fine old place, just like what one\n\nreads about?\"\n\n\n\n\n\n\"And are you prepared to encounter all the horrors that a building such\n\nas 'what one reads about' may produce? Have you a stout heart? Nerves\n\nfit for sliding panels and tapestry?\"\n\n\n\n\n\n\"Oh! yes—I do not think I should be easily frightened, because there\n\nwould be so many people in the house—and besides, it has never been\n\nuninhabited and left deserted for years, and then the family come back\n\nto it unawares, without giving any notice, as generally happens.\"\n\n\n\n\n\n\"No, certainly. We shall not have to explore our way into a hall dimly\n\nlighted by the expiring embers of a wood fire—nor be obliged to spread\n\nour beds on the floor of a room without windows, doors, or furniture.\n\nBut you must be aware that when a young lady is (by whatever means)\n\nintroduced into a dwelling of this kind, she is always lodged apart from\n\nthe rest of the family. While they snugly repair to their own end of the\n\nhouse, she is formally conducted by Dorothy, the ancient housekeeper, up\n\na different staircase, and along many gloomy passages, into an apartment\n\nnever used since some cousin or kin died in it about twenty years\n\nbefore. Can you stand such a ceremony as this? Will not your mind\n\nmisgive you when you find yourself in this gloomy chamber—too lofty and\n\nextensive for you, with only the feeble rays of a single lamp to take\n\nin its size—its walls hung with tapestry exhibiting figures as large as\n\nlife, and the bed, of dark green stuff or purple velvet, presenting even\n\na funereal appearance? Will not your heart sink within you?\"\n\n\n\n\n\n\"Oh! But this will not happen to me, I am sure.\"\n\n\n\n\n\n\"How fearfully will you examine the furniture of your apartment! And\n\nwhat will you discern? Not tables, toilettes, wardrobes, or drawers,\n\nbut on one side perhaps the remains of a broken lute, on the other a\n\nponderous chest which no efforts can open, and over the fireplace\n\nthe portrait of some handsome warrior, whose features will so\n\nincomprehensibly strike you, that you will not be able to withdraw your\n\neyes from it. Dorothy, meanwhile, no less struck by your appearance,\n\ngazes on you in great agitation, and drops a few unintelligible hints.\n\nTo raise your spirits, moreover, she gives you reason to suppose that\n\nthe part of the abbey you inhabit is undoubtedly haunted, and informs\n\nyou that you will not have a single domestic within call. With this\n\nparting cordial she curtsies off—you listen to the sound of her\n\nreceding footsteps as long as the last echo can reach you—and when,\n\nwith fainting spirits, you attempt to fasten your door, you discover,\n\nwith increased alarm, that it has no lock.\"\n\n\n\n\n\n\"Oh! Mr. Tilney, how frightful! This is just like a book! But it cannot\n\nreally happen to me. I am sure your housekeeper is not really Dorothy.\n\nWell, what then?\"\n\n\n\n\n\n\"Nothing further to alarm perhaps may occur the first night. After\n\nsurmounting your unconquerable horror of the bed, you will retire to\n\nrest, and get a few hours' unquiet slumber. But on the second, or at\n\nfarthest the third night after your arrival, you will probably have a\n\nviolent storm. Peals of thunder so loud as to seem to shake the edifice\n\nto its foundation will roll round the neighbouring mountains—and during\n\nthe frightful gusts of wind which accompany it, you will probably think\n\nyou discern (for your lamp is not extinguished) one part of the hanging\n\nmore violently agitated than the rest. Unable of course to repress your\n\ncuriosity in so favourable a moment for indulging it, you will instantly\n\narise, and throwing your dressing-gown around you, proceed to examine\n\nthis mystery. After a very short search, you will discover a division in\n\nthe tapestry so artfully constructed as to defy the minutest inspection,\n\nand on opening it, a door will immediately appear—which door, being\n\nonly secured by massy bars and a padlock, you will, after a few efforts,\n\nsucceed in opening—and, with your lamp in your hand, will pass through\n\nit into a small vaulted room.\"\n\n\n\n\n\n\"No, indeed; I should be too much frightened to do any such thing.\"\n\n\n\n\n\n\"What! Not when Dorothy has given you to understand that there is a\n\nsecret subterraneous communication between your apartment and the chapel\n\nof St. Anthony, scarcely two miles off? Could you shrink from so simple\n\nan adventure? No, no, you will proceed into this small vaulted room,\n\nand through this into several others, without perceiving anything very\n\nremarkable in either. In one perhaps there may be a dagger, in another\n\na few drops of blood, and in a third the remains of some instrument of\n\ntorture; but there being nothing in all this out of the common way,\n\nand your lamp being nearly exhausted, you will return towards your own\n\napartment. In repassing through the small vaulted room, however, your\n\neyes will be attracted towards a large, old-fashioned cabinet of ebony\n\nand gold, which, though narrowly examining the furniture before, you\n\nhad passed unnoticed. Impelled by an irresistible presentiment, you will\n\neagerly advance to it, unlock its folding doors, and search into\n\nevery drawer—but for some time without discovering anything of\n\nimportance—perhaps nothing but a considerable hoard of diamonds. At\n\nlast, however, by touching a secret spring, an inner compartment will\n\nopen—a roll of paper appears—you seize it—it contains many sheets of\n\nmanuscript—you hasten with the precious treasure into your own chamber,\n\nbut scarcely have you been able to decipher 'Oh! Thou—whomsoever thou\n\nmayst be, into whose hands these memoirs of the wretched Matilda may\n\nfall'—when your lamp suddenly expires in the socket, and leaves you in\n\ntotal darkness.\"\n\n\n\n\n\n\"Oh! No, no—do not say so. Well, go on.\"\n\n\n\n\n\nBut Henry was too much amused by the interest he had raised to be able\n\nto carry it farther; he could no longer command solemnity either of\n\nsubject or voice, and was obliged to entreat her to use her own fancy\n\nin the perusal of Matilda's woes. Catherine, recollecting herself, grew\n\nashamed of her eagerness, and began earnestly to assure him that her\n\nattention had been fixed without the smallest apprehension of really\n\nmeeting with what he related. \"Miss Tilney, she was sure, would never\n\nput her into such a chamber as he had described! She was not at all\n\nafraid.\"\n\n\n\n\n\nAs they drew near the end of their journey, her impatience for a sight\n\nof the abbey—for some time suspended by his conversation on subjects\n\nvery different—returned in full force, and every bend in the road was\n\nexpected with solemn awe to afford a glimpse of its massy walls of grey\n\nstone, rising amidst a grove of ancient oaks, with the last beams of the\n\nsun playing in beautiful splendour on its high Gothic windows. But so\n\nlow did the building stand, that she found herself passing through the\n\ngreat gates of the lodge into the very grounds of Northanger, without\n\nhaving discerned even an antique chimney.", "ranges" : [ { "start" : "/div[1]/p[723]", "startOffset" : 2, "end" : "/div[1]/p[735]", "endOffset" : 619, "_id" : { "$oid" : "5056443465c4d70200000008" } } ], "tags" : [], "text" : "In this passage Henry plays off of Catherine's fondness for gothic novels by creating a picture of the abbey just like the ones she has read about. This will later prove to play to her fantasies.", "updated" : { "$date" : 1347830836582 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "slonaker@mit.edu", "username" : "James S.", "uuid" : "EE62387F" } -{ "_id" : { "$oid" : "5054adc2ac97d5020000001e" }, "id" : "5054adc2ac97d5020000001e", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "The first of her fantasies to start, she believes the chest to hold some secret, when all it holds is Eleanor's old hats.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "when her eye suddenly fell on a large\n\nhigh chest, standing back in a deep recess on one side of the fireplace.\n\nThe sight of it made her start; and, forgetting everything else, she\n\nstood gazing on it in motionless wonder, while these thoughts crossed\n\nher:\n\n\n\n\n\n\"This is strange indeed! I did not expect such a sight as this! An\n\nimmense heavy chest! What can it hold? Why should it be placed here?\n\nPushed back too, as if meant to be out of sight! I will look into\n\nit—cost me what it may, I will look into it—and directly too—by\n\ndaylight. If I stay till evening my candle may go out.\" She advanced and\n\nexamined it closely: it was of cedar, curiously inlaid with some darker\n\nwood, and raised, about a foot from the ground, on a carved stand of the\n\nsame. The lock was silver, though tarnished from age; at each end\n\nwere the imperfect remains of handles also of silver, broken perhaps\n\nprematurely by some strange violence; and, on the centre of the lid, was\n\na mysterious cipher, in the same metal. Catherine bent over it intently,\n\nbut without being able to distinguish anything with certainty. She could\n\nnot, in whatever direction she took it, believe the last letter to be\n\na T; and yet that it should be anything else in that house was\n\na circumstance to raise no common degree of astonishment. If not\n\noriginally theirs, by what strange events could it have fallen into the\n\nTilney family?\n\n\n\n\n\nHer fearful curiosity was every moment growing greater; and seizing,\n\nwith trembling hands, the hasp of the lock, she resolved at all hazards\n\nto satisfy herself at least as to its contents. With difficulty, for\n\nsomething seemed to resist her efforts, she raised the lid a few inches;\n\nbut at that moment a sudden knocking at the door of the room made her,\n\nstarting, quit her hold, and the lid closed with alarming violence. This\n\nill-timed intruder was Miss Tilney's maid, sent by her mistress to be of\n\nuse to Miss Morland; and though Catherine immediately dismissed her, it\n\nrecalled her to the sense of what she ought to be doing, and forced her,\n\nin spite of her anxious desire to penetrate this mystery, to proceed in\n\nher dressing without further delay. Her progress was not quick, for her\n\nthoughts and her eyes were still bent on the object so well calculated\n\nto interest and alarm; and though she dared not waste a moment upon\n\na second attempt, she could not remain many paces from the chest. At\n\nlength, however, having slipped one arm into her gown, her toilette\n\nseemed so nearly finished that the impatience of her curiosity might\n\nsafely be indulged. One moment surely might be spared; and, so desperate\n\nshould be the exertion of her strength, that, unless secured by\n\nsupernatural means, the lid in one moment should be thrown back. With\n\nthis spirit she sprang forward, and her confidence did not deceive her.\n\nHer resolute effort threw back the lid, and gave to her astonished eyes\n\nthe view of a white cotton counterpane, properly folded, reposing at one\n\nend of the chest in undisputed possession!\n\n\n\n\n\nShe was gazing on it with the first blush of surprise when Miss Tilney,\n\nanxious for her friend's being ready, entered the room, and to the\n\nrising shame of having harboured for some minutes an absurd expectation,\n\nwas then added the shame of being caught in so idle a search. \"That is\n\na curious old chest, is not it?\" said Miss Tilney, as Catherine hastily\n\nclosed it and turned away to the glass. \"It is impossible to say how\n\nmany generations it has been here. How it came to be first put in this\n\nroom I know not, but I have not had it moved, because I thought it might\n\nsometimes be of use in holding hats and bonnets. The worst of it is that\n\nits weight makes it difficult to open. In that corner, however, it is at\n\nleast out of the way.\"", "uuid" : "C85B051E", "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[740]", "startOffset" : 881, "end" : "/div[1]/p[743]", "endOffset" : 750, "_id" : { "$oid" : "5054adc2ac97d5020000001f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347726786554 }, "created" : { "$date" : 1347726786554 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5054ae27ac97d50200000020" }, "id" : "5054ae27ac97d50200000020", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "This is the next instance of her imagination playing on her as she thinks some secret is in the dresser.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "when, on giving a parting glance round the room, she was struck by the\n\nappearance of a high, old-fashioned black cabinet, which, though in\n\na situation conspicuous enough, had never caught her notice before.\n\nHenry's words, his description of the ebony cabinet which was to escape\n\nher observation at first, immediately rushed across her; and though\n\nthere could be nothing really in it, there was something whimsical, it\n\nwas certainly a very remarkable coincidence! She took her candle and\n\nlooked closely at the cabinet. It was not absolutely ebony and gold; but\n\nit was japan, black and yellow japan of the handsomest kind; and as she\n\nheld her candle, the yellow had very much the effect of gold. The key\n\nwas in the door, and she had a strange fancy to look into it; not,\n\nhowever, with the smallest expectation of finding anything, but it was\n\nso very odd, after what Henry had said. In short, she could not sleep\n\ntill she had examined it. So, placing the candle with great caution on\n\na chair, she seized the key with a very tremulous hand and tried to turn\n\nit; but it resisted her utmost strength. Alarmed, but not discouraged,\n\nshe tried it another way; a bolt flew, and she believed herself\n\nsuccessful; but how strangely mysterious! The door was still immovable.\n\nShe paused a moment in breathless wonder. The wind roared down the\n\nchimney, the rain beat in torrents against the windows, and everything\n\nseemed to speak the awfulness of her situation. To retire to bed,\n\nhowever, unsatisfied on such a point, would be vain, since sleep must be\n\nimpossible with the consciousness of a cabinet so mysteriously closed\n\nin her immediate vicinity. Again, therefore, she applied herself to the\n\nkey, and after moving it in every possible way for some instants with\n\nthe determined celerity of hope's last effort, the door suddenly yielded\n\nto her hand: her heart leaped with exultation at such a victory, and\n\nhaving thrown open each folding door, the second being secured only by\n\nbolts of less wonderful construction than the lock, though in that her\n\neye could not discern anything unusual, a double range of small drawers\n\nappeared in view, with some larger drawers above and below them; and in\n\nthe centre, a small door, closed also with a lock and key, secured in\n\nall probability a cavity of importance.\n\n\n\n\n\nCatherine's heart beat quick, but her courage did not fail her. With a\n\ncheek flushed by hope, and an eye straining with curiosity, her fingers\n\ngrasped the handle of a drawer and drew it forth. It was entirely empty.\n\nWith less alarm and greater eagerness she seized a second, a third, a\n\nfourth; each was equally empty. Not one was left unsearched, and in not\n\none was anything found. Well read in the art of concealing a treasure,\n\nthe possibility of false linings to the drawers did not escape her, and\n\nshe felt round each with anxious acuteness in vain. The place in the\n\nmiddle alone remained now unexplored; and though she had \"never from\n\nthe first had the smallest idea of finding anything in any part of the\n\ncabinet, and was not in the least disappointed at her ill success thus\n\nfar, it would be foolish not to examine it thoroughly while she was\n\nabout it.\" It was some time however before she could unfasten the door,\n\nthe same difficulty occurring in the management of this inner lock as of\n\nthe outer; but at length it did open; and not vain, as hitherto, was her\n\nsearch; her quick eyes directly fell on a roll of paper pushed back\n\ninto the further part of the cavity, apparently for concealment, and\n\nher feelings at that moment were indescribable. Her heart fluttered, her\n\nknees trembled, and her cheeks grew pale. She seized, with an unsteady\n\nhand, the precious manuscript, for half a glance sufficed to ascertain\n\nwritten characters; and while she acknowledged with awful sensations\n\nthis striking exemplification of what Henry had foretold, resolved\n\ninstantly to peruse every line before she attempted to rest.\n\n\n\n\n\nThe dimness of the light her candle emitted made her turn to it with\n\nalarm; but there was no danger of its sudden extinction; it had yet some\n\nhours to burn; and that she might not have any greater difficulty in\n\ndistinguishing the writing than what its ancient date might occasion,\n\nshe hastily snuffed it. Alas! It was snuffed and extinguished in one. A\n\nlamp could not have expired with more awful effect. Catherine, for a\n\nfew moments, was motionless with horror. It was done completely; not a\n\nremnant of light in the wick could give hope to the rekindling breath.\n\nDarkness impenetrable and immovable filled the room. A violent gust\n\nof wind, rising with sudden fury, added fresh horror to the moment.\n\nCatherine trembled from head to foot. In the pause which succeeded, a\n\nsound like receding footsteps and the closing of a distant door struck\n\non her affrighted ear. Human nature could support no more. A cold sweat\n\nstood on her forehead, the manuscript fell from her hand, and groping\n\nher way to the bed, she jumped hastily in, and sought some suspension of\n\nagony by creeping far underneath the clothes. To close her eyes in\n\nsleep that night, she felt must be entirely out of the question. With\n\na curiosity so justly awakened, and feelings in every way so agitated,\n\nrepose must be absolutely impossible. The storm too abroad so dreadful!\n\nShe had not been used to feel alarm from wind, but now every blast\n\nseemed fraught with awful intelligence. The manuscript so wonderfully\n\nfound, so wonderfully accomplishing the morning's prediction, how was it\n\nto be accounted for? What could it contain? To whom could it relate?\n\nBy what means could it have been so long concealed? And how singularly\n\nstrange that it should fall to her lot to discover it! Till she had made\n\nherself mistress of its contents, however, she could have neither repose\n\nnor comfort; and with the sun's first rays she was determined to peruse\n\nit. But many were the tedious hours which must yet intervene. She\n\nshuddered, tossed about in her bed, and envied every quiet sleeper. The\n\nstorm still raged, and various were the noises, more terrific even\n\nthan the wind, which struck at intervals on her startled ear. The very\n\ncurtains of her bed seemed at one moment in motion, and at another\n\nthe lock of her door was agitated, as if by the attempt of somebody to\n\nenter. Hollow murmurs seemed to creep along the gallery, and more than\n\nonce her blood was chilled by the sound of distant moans. Hour after\n\nhour passed away, and the wearied Catherine had heard three proclaimed\n\nby all the clocks in the house before the tempest subsided or she\n\nunknowingly fell fast asleep.", "uuid" : "31F2B96C", "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[749]", "startOffset" : 1075, "end" : "/div[1]/p[751]", "endOffset" : 2665, "_id" : { "$oid" : "5054ae27ac97d50200000021" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347726887773 }, "created" : { "$date" : 1347726887773 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5054ae56ac97d50200000022" }, "id" : "5054ae56ac97d50200000022", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "It turns out the 'manuscript' she saw in the chest was actually laundry bills.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "She now plainly saw that she must not\n\nexpect a manuscript of equal length with the generality of what she had\n\nshuddered over in books, for the roll, seeming to consist entirely of\n\nsmall disjointed sheets, was altogether but of trifling size, and much\n\nless than she had supposed it to be at first.\n\n\n\n\n\nHer greedy eye glanced rapidly over a page. She started at its import.\n\nCould it be possible, or did not her senses play her false? An inventory\n\nof linen, in coarse and modern characters, seemed all that was before\n\nher! If the evidence of sight might be trusted, she held a washing-bill\n\nin her hand. She seized another sheet, and saw the same articles with\n\nlittle variation; a third, a fourth, and a fifth presented nothing\n\nnew. Shirts, stockings, cravats, and waistcoats faced her in each. Two\n\nothers, penned by the same hand, marked an expenditure scarcely more\n\ninteresting, in letters, hair-powder, shoe-string, and breeches-ball.\n\nAnd the larger sheet, which had enclosed the rest, seemed by its first\n\ncramp line, \"To poultice chestnut mare\"—a farrier's bill!", "uuid" : "F6C5993E", "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[752]", "startOffset" : 668, "end" : "/div[1]/p[753]", "endOffset" : 774, "_id" : { "$oid" : "5054ae56ac97d50200000023" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347726934573 }, "created" : { "$date" : 1347726934573 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50550fced42d6e0200000002", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "Creating life sounds really simple this way; all you need is a few \"life instruments\"", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I \ncollected the instruments of life around me, that I might infuse a spark of \nbeing into the lifeless thing that lay at my feet", "uuid" : "BC8F563C", "_id" : { "$oid" : "50550fced42d6e0200000002" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[154]", "startOffset" : 131, "end" : "/div[1]/p[154]", "endOffset" : 261, "_id" : { "$oid" : "50550fced42d6e0200000003" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347751886473 }, "created" : { "$date" : 1347751886473 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505510a3d42d6e0200000004", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I saw the dull \nyellow eye of the creature open; it breathed hard, and a convulsive motion \nagitated its limbs.", "uuid" : "E691BB33", "_id" : { "$oid" : "505510a3d42d6e0200000004" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[154]", "startOffset" : 435, "end" : "/div[1]/p[154]", "endOffset" : 546, "_id" : { "$oid" : "505510a3d42d6e0200000005" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347752099434 }, "created" : { "$date" : 1347752099434 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50551204ac97d50200000026", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I had desired it with an ardour that far exceeded \nmoderation; but now that I had finished, the beauty of the dream vanished, and \nbreathless horror and disgust filled my heart.", "uuid" : "936E9246", "_id" : { "$oid" : "50551204ac97d50200000026" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[156]", "startOffset" : 242, "end" : "/div[1]/p[156]", "endOffset" : 420, "_id" : { "$oid" : "50551204ac97d50200000027" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347752452005 }, "created" : { "$date" : 1347752452005 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505512b8d42d6e0200000006", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "great solution", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I rushed out of the room, and continued a long time \ntraversing my bed-chamber, unable to compose my mind to sleep", "uuid" : "9C56F995", "_id" : { "$oid" : "505512b8d42d6e0200000006" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[156]", "startOffset" : 477, "end" : "/div[1]/p[156]", "endOffset" : 592, "_id" : { "$oid" : "505512b8d42d6e0200000007" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347752632161 }, "created" : { "$date" : 1347752632161 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505512cdac97d50200000028", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "unknown word", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "lassitude", "uuid" : "4A94B5B8", "_id" : { "$oid" : "505512cdac97d50200000028" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[156]", "startOffset" : 605, "end" : "/div[1]/p[156]", "endOffset" : 614, "_id" : { "$oid" : "505512cdac97d50200000029" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347752653821 }, "created" : { "$date" : 1347752653821 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505512f9ac97d5020000002a", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "this is why he fell asleep", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "endeavouring to seek a few moments of forgetfulness", "uuid" : "E944C02E", "_id" : { "$oid" : "505512f9ac97d5020000002a" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[156]", "startOffset" : 707, "end" : "/div[1]/p[156]", "endOffset" : 758, "_id" : { "$oid" : "505512f9ac97d5020000002b" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347752697424 }, "created" : { "$date" : 1347752697424 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50551337ac97d5020000002c", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "disturbing. and how is this related to the monster/ the current situation?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I embraced her; but as I imprinted the \nfirst kiss on her lips, they became livid with the hue of death; her features \nappeared to change, and I thought that I held the corpse of my dead mother in my \narms", "uuid" : "8B098F11", "_id" : { "$oid" : "50551337ac97d5020000002c" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[156]", "startOffset" : 955, "end" : "/div[1]/p[156]", "endOffset" : 1161, "_id" : { "$oid" : "50551337ac97d5020000002d" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347752759171 }, "created" : { "$date" : 1347752759171 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055139cd42d6e0200000008", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "word", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "grin", "uuid" : "3D7ABB4A", "_id" : { "$oid" : "5055139cd42d6e0200000008" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[156]", "startOffset" : 1708, "end" : "/div[1]/p[156]", "endOffset" : 1712, "_id" : { "$oid" : "5055139cd42d6e0200000009" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347752860476 }, "created" : { "$date" : 1347752860476 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505513edd42d6e020000000a", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "why does he hate the creature so much?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "as it forced its way through the window-shutters, \nI beheld the wretch -- the miserable monster whom I had created.", "uuid" : "6D86C47A", "_id" : { "$oid" : "505513edd42d6e020000000a" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[156]", "startOffset" : 1428, "end" : "/div[1]/p[156]", "endOffset" : 1543, "_id" : { "$oid" : "505513edd42d6e020000000b" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347752941496 }, "created" : { "$date" : 1347752941496 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50551426d42d6e020000000c", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "He was actually smiling!? He looks like a nice guy", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "His jaws opened, and he muttered some inarticulate sounds, while a grin wrinkled \nhis cheeks.", "uuid" : "4CBF2D90", "_id" : { "$oid" : "50551426d42d6e020000000c" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[156]", "startOffset" : 1641, "end" : "/div[1]/p[156]", "endOffset" : 1735, "_id" : { "$oid" : "50551426d42d6e020000000d" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347752998529 }, "created" : { "$date" : 1347752998529 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50551445ac97d5020000002e", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "more attention to his eyes", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "and his eyes, if eyes they may be called, were fixed on me", "uuid" : "4FDF6E2D", "_id" : { "$oid" : "50551445ac97d5020000002e" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[156]", "startOffset" : 1580, "end" : "/div[1]/p[156]", "endOffset" : 1638, "_id" : { "$oid" : "50551445ac97d5020000002f" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347753029039 }, "created" : { "$date" : 1347753029039 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055146bd42d6e020000000e", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "it's interesting how the creature has a gender.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "his", "uuid" : "840B96DF", "_id" : { "$oid" : "5055146bd42d6e020000000e" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[156]", "startOffset" : 1584, "end" : "/div[1]/p[156]", "endOffset" : 1588, "_id" : { "$oid" : "5055146bd42d6e020000000f" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347753067148 }, "created" : { "$date" : 1347753067148 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505514f2ac97d50200000030", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "does he know how to speak?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "He might have spoken", "uuid" : "EE0D3ED0", "_id" : { "$oid" : "505514f2ac97d50200000030" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[156]", "startOffset" : 1735, "end" : "/div[1]/p[156]", "endOffset" : 1755, "_id" : { "$oid" : "505514f2ac97d50200000031" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347753202800 }, "created" : { "$date" : 1347753202800 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50551910d42d6e0200000010", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "demoniacal corpse", "uuid" : "6B29321C", "_id" : { "$oid" : "50551910d42d6e0200000010" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[156]", "startOffset" : 2142, "end" : "/div[1]/p[156]", "endOffset" : 2159, "_id" : { "$oid" : "50551910d42d6e0200000011" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347754256807 }, "created" : { "$date" : 1347754256807 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50551950d42d6e0200000012", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "he is really afraid, but the creature didn't do anything wrong", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "walking up and down in the greatest \nagitation, listening attentively, catching and fearing each sound as if it were \nto announce", "uuid" : "9FAA864B", "_id" : { "$oid" : "50551950d42d6e0200000012" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[156]", "startOffset" : 1992, "end" : "/div[1]/p[156]", "endOffset" : 2122, "_id" : { "$oid" : "50551950d42d6e0200000013" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347754320419 }, "created" : { "$date" : 1347754320419 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505519b9d42d6e0200000014", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "interesting", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "he was ugly then; but when those muscles and \njoints were rendered capable of motion, it became a thing such as even Dante \ncould not have conceived.", "uuid" : "E71838F5", "_id" : { "$oid" : "505519b9d42d6e0200000014" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[157]", "startOffset" : 174, "end" : "/div[1]/p[157]", "endOffset" : 324, "_id" : { "$oid" : "505519b9d42d6e0200000015" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347754425111 }, "created" : { "$date" : 1347754425111 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505519ddac97d50200000032", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "Here we get a feeling that Carroll views rules as necessary. It equally demonstrates the importance of someone enforcing rules. While we often see the queen attempting to enforce, but with absolute power and unjust punishment for breaking rules.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "you've no\n\t\t\tidea how confusing it is", "uuid" : "02BAA7AD", "_id" : { "$oid" : "505519ddac97d50200000032" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 10120, "end" : "/div[1]/div[3]", "endOffset" : 10157, "_id" : { "$oid" : "505519ddac97d50200000033" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347754461868 }, "created" : { "$date" : 1347754461868 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505519e3d42d6e0200000016", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "word", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "languor", "uuid" : "D75756BA", "_id" : { "$oid" : "505519e3d42d6e0200000016" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[158]", "startOffset" : 172, "end" : "/div[1]/p[158]", "endOffset" : 179, "_id" : { "$oid" : "505519e3d42d6e0200000017" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347754467313 }, "created" : { "$date" : 1347754467313 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50551a97ac97d50200000034", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "word", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "dismal", "uuid" : "F6949147", "_id" : { "$oid" : "50551a97ac97d50200000034" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[159]", "startOffset" : 9, "end" : "/div[1]/p[159]", "endOffset" : 15, "_id" : { "$oid" : "50551a97ac97d50200000035" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347754647896 }, "created" : { "$date" : 1347754647896 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50551ac7ac97d50200000036" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347754695690 }, "groups" : [ "21L.448J" ], "id" : "50551ac7ac97d50200000036", "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [] }, "quote" : "Maybe it's always\n\t\t\tpepper that makes people hot-tempered,' she went on, very much pleased at having found out\n\t\t\ta new kind of rule, `and vinegar that makes them sour--and camomile that makes them\n\t\t\tbitter--and--and barley-sugar and such things that make children sweet-tempered.", "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 576, "end" : "/div[1]/div[4]", "endOffset" : 858, "_id" : { "$oid" : "50551ac7ac97d50200000037" } } ], "tags" : [], "text" : "When we consider how rules figure into children's education we often see that to things are explained in black and white. Characterized as all good or all bad. Alice is always pleased to have definite rules to follow, much as children are.", "updated" : { "$date" : 1347754819460 }, "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "user" : "kspielb@mit.edu", "username" : "Katie S.", "uuid" : "FD3BE7F1" } -{ "id" : "50551ad8d42d6e0200000018", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "is this a symbolic number?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "the sixth hour", "uuid" : "A91873D2", "_id" : { "$oid" : "50551ad8d42d6e0200000018" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[159]", "startOffset" : 163, "end" : "/div[1]/p[159]", "endOffset" : 177, "_id" : { "$oid" : "50551ad8d42d6e0200000019" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347754712157 }, "created" : { "$date" : 1347754712157 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50551b0aac97d50200000038", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "church x demon", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "the church of Ingolstadt,", "uuid" : "A1E3C379", "_id" : { "$oid" : "50551b0aac97d50200000038" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[159]", "startOffset" : 91, "end" : "/div[1]/p[159]", "endOffset" : 116, "_id" : { "$oid" : "50551b0aac97d50200000039" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347754762201 }, "created" : { "$date" : 1347754762201 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50551b8eac97d5020000003a", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "Here again, definite rules.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`Everything's got a moral, if only you can find it", "uuid" : "4843CE9C", "_id" : { "$oid" : "50551b8eac97d5020000003a" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 1352, "end" : "/div[1]/div[4]", "endOffset" : 1402, "_id" : { "$oid" : "50551b8eac97d5020000003b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347754894274 }, "created" : { "$date" : 1347754894274 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50551bafd42d6e020000001a", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "where is he going?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I \ntraversed the streets, without any clear conception of where I was, or what I \nwas doing. My heart palpitated in the sickness of fear; and I hurried on with \nirregular steps, not daring to look about me:", "uuid" : "14A2FAB8", "_id" : { "$oid" : "50551bafd42d6e020000001a" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[160]", "startOffset" : 128, "end" : "/div[1]/p[160]", "endOffset" : 335, "_id" : { "$oid" : "50551bafd42d6e020000001b" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347754927504 }, "created" : { "$date" : 1347754927504 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50551bf0d42d6e020000001c", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "search for this", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Like one who, on a lonely road,\n   Doth walk in \nfear and dread,\nAnd, having once \nturn'd round, walks on,\n   And turns no \nmore his head;\nBecause he knows a \nfrightful fiend\n   Doth close \nbehind him tread.* <* Coleridge's \"Ancient Mariner.\">", "uuid" : "D362B5DD", "_id" : { "$oid" : "50551bf0d42d6e020000001c" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[161]", "startOffset" : 0, "end" : "/div[1]/p[166]", "endOffset" : 68, "_id" : { "$oid" : "50551bf0d42d6e020000001d" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347754992837 }, "created" : { "$date" : 1347754992837 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50551c72ac97d5020000003c", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "word", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "alighting", "uuid" : "0029FF74", "_id" : { "$oid" : "50551c72ac97d5020000003c" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[167]", "startOffset" : 603, "end" : "/div[1]/p[167]", "endOffset" : 612, "_id" : { "$oid" : "50551c72ac97d5020000003d" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347755122826 }, "created" : { "$date" : 1347755122826 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50551c90ac97d5020000003e" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347755152543 }, "groups" : [ "21W.041J", "21L.000J" ], "id" : "50551c90ac97d5020000003e", "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "quote" : "it stopped just where I was standing; \nand, on the door being opened, I perceived Henry Clerval, who, on seeing me, \ninstantly sprung out. \"My dear Frankenstein,\" exclaimed he, \"how glad I am to \nsee you! how fortunate that you should be here at the very moment of my \nalighting!\"", "ranges" : [ { "start" : "/div[1]/p[167]", "startOffset" : 334, "end" : "/div[1]/p[167]", "endOffset" : 614, "_id" : { "$oid" : "50551c90ac97d5020000003f" } } ], "tags" : [], "text" : "this was reaaaly weird", "updated" : { "$date" : 1347755231318 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "uuid" : "C4D2BFB5" } -{ "id" : "50551d2aac97d50200000040", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "Rules in our society must be enforced. Though in wonderland they are not defined. When they are not grounded and not supported by those who carry them out they are insignificant.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "You are all pardoned", "uuid" : "2A95B89E", "_id" : { "$oid" : "50551d2aac97d50200000040" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 6744, "end" : "/div[1]/div[4]", "endOffset" : 6764, "_id" : { "$oid" : "50551d2aac97d50200000041" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347755306926 }, "created" : { "$date" : 1347755306926 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50551d77ac97d50200000042", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "Am I the only one who thinks that Clerval's appearance was pretty random?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Nothing could equal my delight on seeing Clerval; his \npresence brought back to my thoughts my father, Elizabeth, and all those scenes \nof home so dear to my recollection. I grasped his hand, and in a moment forgot \nmy horror and misfortune;", "uuid" : "63A75AEB", "_id" : { "$oid" : "50551d77ac97d50200000042" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[168]", "startOffset" : 0, "end" : "/div[1]/p[168]", "endOffset" : 241, "_id" : { "$oid" : "50551d77ac97d50200000043" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347755383173 }, "created" : { "$date" : 1347755383173 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50551dfbd42d6e020000001e", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "to search for and to think about", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "'I have ten thousand florins a year without Greek, I eat heartily \nwithout Greek.'", "uuid" : "AFF2967E", "_id" : { "$oid" : "50551dfbd42d6e020000001e" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[168]", "startOffset" : 932, "end" : "/div[1]/p[168]", "endOffset" : 1014, "_id" : { "$oid" : "50551dfbd42d6e020000001f" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347755515872 }, "created" : { "$date" : 1347755515872 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50551e2bd42d6e0200000020", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "Or... why didn't you send me a letter?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "\"It gives me the greatest delight to see you; but tell me \nhow you left my father, brothers, and Elizabeth.\"", "uuid" : "D644D7A7", "_id" : { "$oid" : "50551e2bd42d6e0200000020" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[169]", "startOffset" : 0, "end" : "/div[1]/p[169]", "endOffset" : 108, "_id" : { "$oid" : "50551e2bd42d6e0200000021" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347755563390 }, "created" : { "$date" : 1347755563390 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50551f12ac97d50200000044", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "so reckless... anyone would wonder the location of the creature", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I could hardly \nbelieve that so great a good-fortune could have befallen me; but when I became \nassured that my enemy had indeed fled, I clapped my hands for joy, and ran down \nto Clerval", "uuid" : "7FB104F4", "_id" : { "$oid" : "50551f12ac97d50200000044" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[172]", "startOffset" : 929, "end" : "/div[1]/p[172]", "endOffset" : 1116, "_id" : { "$oid" : "50551f12ac97d50200000045" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347755794827 }, "created" : { "$date" : 1347755794827 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50551fb1ac97d50200000046", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "fearful or just crazy?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I felt my flesh tingle with excess of sensitiveness, and my pulse \nbeat rapidly. I was unable to remain for a single instant in the same place; I \njumped over the chairs, clapped my hands, and laughed aloud", "uuid" : "EFDB7270", "_id" : { "$oid" : "50551fb1ac97d50200000046" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[173]", "startOffset" : 148, "end" : "/div[1]/p[173]", "endOffset" : 354, "_id" : { "$oid" : "50551fb1ac97d50200000047" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347755953230 }, "created" : { "$date" : 1347755953230 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50552100ac97d50200000048", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "The monster didn't do anything...", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "But I was in reality very ill; and surely nothing but the \nunbounded and unremitting attentions of my friend could have restored me to \nlife. The form of the monster on whom I had bestowed existence was for ever \nbefore my eyes, and I raved incessantly concerning him.", "uuid" : "67788E97", "_id" : { "$oid" : "50552100ac97d50200000048" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[178]", "startOffset" : 0, "end" : "/div[1]/p[178]", "endOffset" : 269, "_id" : { "$oid" : "50552100ac97d50200000049" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347756288721 }, "created" : { "$date" : 1347756288721 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50552153d42d6e0200000022", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "where is/what happened to the King?", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "THE KING AND QUEEN OF\n\t\t\tHEARTS.", "uuid" : "F5C8E092", "_id" : { "$oid" : "50552153d42d6e0200000022" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 2743, "end" : "/div[1]/div[3]", "endOffset" : 2776, "_id" : { "$oid" : "50552153d42d6e0200000023" } } ], "groups" : [ "21L.448J", "21L.448" ], "updated" : { "$date" : 1347756371353 }, "created" : { "$date" : 1347756371353 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5055222aac97d5020000004a" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347756586089 }, "groups" : [ "21L.448J" ], "id" : "5055222aac97d5020000004a", "permissions" : { "admin" : [ "kspielb@mit.edu" ], "delete" : [ "kspielb@mit.edu" ], "read" : [], "update" : [ "kspielb@mit.edu" ] }, "quote" : "If there's no meaning in it,' said the King, `that saves a world of trouble, you know, as\n\t\t\twe needn't try to find any", "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 6698, "end" : "/div[1]/div[6]", "endOffset" : 6817, "_id" : { "$oid" : "5055222aac97d5020000004b" } } ], "tags" : [], "text" : "Here we see searching for meaning. Much as we assume everything has meaning in the natural world, and we try and explain it through physics/biology. I also think this somewhat relates to the Duchess always forcing a moral.", "updated" : { "$date" : 1347756963815 }, "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "user" : "kspielb@mit.edu", "username" : "Katie S.", "uuid" : "BDAA1986" } -{ "id" : "5055228bd42d6e0200000024", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "What is the relationship between the King and the Queen, from both a personal and governmental perspective", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "The King laid his hand upon her arm, and timidly said `Consider, my dear: she is only a\n\t\t\tchild!'", "uuid" : "E499C734", "_id" : { "$oid" : "5055228bd42d6e0200000024" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 4367, "end" : "/div[1]/div[3]", "endOffset" : 4466, "_id" : { "$oid" : "5055228bd42d6e0200000025" } } ], "groups" : [ "21L.448J", "21L.448" ], "updated" : { "$date" : 1347756683439 }, "created" : { "$date" : 1347756683439 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "505522e9d42d6e0200000026" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347756777464 }, "groups" : [ "21L.448J" ], "id" : "505522e9d42d6e0200000026", "permissions" : { "admin" : [ "kspielb@mit.edu" ], "delete" : [ "kspielb@mit.edu" ], "read" : [], "update" : [ "kspielb@mit.edu" ] }, "quote" : "Sentence first--verdict afterwards", "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 8421, "end" : "/div[1]/div[6]", "endOffset" : 8455, "_id" : { "$oid" : "505522e9d42d6e0200000027" } } ], "tags" : [], "text" : "Cause and effect. In class we often discuss that evolving is changing in response to a cause (well selecting random changes that are now favorable because of some new factor. We cannot function the other way. ", "updated" : { "$date" : 1347756977889 }, "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "user" : "kspielb@mit.edu", "username" : "Katie S.", "uuid" : "433246B5" } -{ "id" : "50552357d42d6e0200000028", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "So the Rabbit is on a somewhat political mission. IS CS Lewis trying to reference anything from history?", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`She's under sentence of execution.'", "uuid" : "B5EACE4C", "_id" : { "$oid" : "50552357d42d6e0200000028" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 6428, "end" : "/div[1]/div[3]", "endOffset" : 6465, "_id" : { "$oid" : "50552357d42d6e0200000029" } } ], "groups" : [ "21L.448J", "21L.448" ], "updated" : { "$date" : 1347756887155 }, "created" : { "$date" : 1347756887155 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50552934d42d6e020000002a", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "scenario", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "It was already one in the \nmorning; the rain pattered dismally against the panes, and my candle was nearly \nburnt out, when, by the glimmer of the half-extinguished light", "uuid" : "6809DF5D", "_id" : { "$oid" : "50552934d42d6e020000002a" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[154]", "startOffset" : 262, "end" : "/div[1]/p[154]", "endOffset" : 433, "_id" : { "$oid" : "50552934d42d6e020000002b" } } ], "groups" : [ "21W.041J", "21L.000J" ], "updated" : { "$date" : 1347758388292 }, "created" : { "$date" : 1347758388292 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50552db0d42d6e020000002c", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "If it's commonly known, why does everyone still listen to her so intently?", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`It's all her fancy, that: they never executes nobody, you\n\t\t\tknow. Come on!'", "uuid" : "769E08BD", "_id" : { "$oid" : "50552db0d42d6e020000002c" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 7711, "end" : "/div[1]/div[4]", "endOffset" : 7789, "_id" : { "$oid" : "50552db0d42d6e020000002d" } } ], "groups" : [ "21L.448J", "21L.448" ], "updated" : { "$date" : 1347759536505 }, "created" : { "$date" : 1347759536505 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055301bac97d5020000004c", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Alice seems to lack a bit of self-awareness", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "Alice did not feel encouraged to ask any more questions about it, so she turned to the\n\t\t\tMock Turtle, and said `What else had you to learn?'", "uuid" : "A4EA830A", "_id" : { "$oid" : "5055301bac97d5020000004c" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 11814, "end" : "/div[1]/div[4]", "endOffset" : 11956, "_id" : { "$oid" : "5055301bac97d5020000004d" } } ], "groups" : [ "21L.448J", "21L.448" ], "updated" : { "$date" : 1347760155378 }, "created" : { "$date" : 1347760155378 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505536caac97d5020000004e", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "is this chaos how children perceive adult matters?", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`Alice!'", "uuid" : "9B4B297D", "_id" : { "$oid" : "505536caac97d5020000004e" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 11120, "end" : "/div[1]/div[5]", "endOffset" : 11129, "_id" : { "$oid" : "505536caac97d5020000004f" } } ], "groups" : [ "21L.448J", "21L.448" ], "updated" : { "$date" : 1347761866894 }, "created" : { "$date" : 1347761866894 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505537dcd42d6e020000002e", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "is this complete nonsense? or is there a message", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`They told me you had been to her,\n\t\t\tAnd mentioned me to him:\n\t\t\tShe gave me a good character,\n\t\t\tBut said I could not swim.\n\t\t\t\n\t\t\tHe sent them word I had not gone\n\t\t\t(We know it to be true):\n\t\t\tIf she should push the matter on,\n\t\t\tWhat would become of you?\n\t\t\t\n\t\t\tI gave her one, they gave him two,\n\t\t\tYou gave us three or more;\n\t\t\tThey all returned from him to you,\n\t\t\tThough they were mine before.\n\t\t\t\n\t\t\tIf I or she should chance to be\n\t\t\tInvolved in this affair,\n\t\t\tHe trusts to you to set them free,\n\t\t\tExactly as we were.\n\t\t\t\n\t\t\tMy notion was that you had been\n\t\t\t(Before she had this fit)\n\t\t\tAn obstacle that came between\n\t\t\tHim, and ourselves, and it.\n\t\t\t\n\t\t\tDon't let him know she liked them best,\n\t\t\tFor this must ever be\n\t\t\tA secret, kept from all the rest,\n\t\t\tBetween yourself and me.'", "uuid" : "CE61CA00", "_id" : { "$oid" : "505537dcd42d6e020000002e" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 5362, "end" : "/div[1]/div[6]", "endOffset" : 6162, "_id" : { "$oid" : "505537dcd42d6e020000002f" } } ], "groups" : [ "21L.448J", "21L.448" ], "updated" : { "$date" : 1347762140916 }, "created" : { "$date" : 1347762140916 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50553872ac97d50200000050", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "even though Wonderland isn't \"real\" it impacted Alice's behavior in the \"real\" world", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "Lastly, she pictured to herself how this same little sister of hers would, in the\n\t\t\tafter-time, be herself a grown woman; and how she would keep, through all her riper years,\n\t\t\tthe simple and loving heart of her childhood: and how she would gather about her other\n\t\t\tlittle children, and make THEIR eyes bright and eager with many a strange tale, perhaps\n\t\t\teven with the dream of Wonderland of long ago: and how she would feel with all their\n\t\t\tsimple sorrows, and find a pleasure in all their simple joys, remembering her own\n\t\t\tchild-life, and the happy summer days.", "uuid" : "D77E8878", "_id" : { "$oid" : "50553872ac97d50200000050" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 11827, "end" : "/div[1]/div[6]", "endOffset" : 12399, "_id" : { "$oid" : "50553872ac97d50200000051" } } ], "groups" : [ "21L.448J", "21L.448" ], "updated" : { "$date" : 1347762290024 }, "created" : { "$date" : 1347762290024 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50554239d42d6e0200000030", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "orders/rules/mistakes. ", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "his here ought to have been a RED rose-tree, and we put a white one in\n\t\t\tby mistake;", "uuid" : "A840A870", "_id" : { "$oid" : "50554239d42d6e0200000030" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 1418, "end" : "/div[1]/div[3]", "endOffset" : 1503, "_id" : { "$oid" : "50554239d42d6e0200000031" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347764793270 }, "created" : { "$date" : 1347764793270 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055436e1a807e0200000002", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "Carroll gives time to describe the procession and its order. The idea of orderliness, especially in royal events, translates from the real world into Wonderland. Perhaps this could also be a parody on how arbitrary many royal traditions, and many traditions in general, can seem. When we think of garb, music, and sequence of these traditions they can seem rather bazaar. What is the purpose of some of the rules of modern day processions and what would changing them REALLY mean to the significance of their traditions??", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "First came ten soldiers carrying clubs; these were all shaped like the three gardeners,\n\t\t\toblong and flat, with their hands and feet at the corners: next the ten courtiers; these\n\t\t\twere ornamented all over with diamonds, and walked two and two, as the soldiers did. After\n\t\t\tthese came the royal children; there were ten of them, and the little dears came jumping\n\t\t\tmerrily along hand in hand, in couples: they were all ornamented with hearts. Next came\n\t\t\tthe guests, mostly Kings and Queens, and among them Alice recognised the White Rabbit: it\n\t\t\twas talking in a hurried nervous manner, smiling at everything that was said, and went by\n\t\t\twithout noticing her. Then followed the Knave of Hearts, carrying the King's crown on a\n\t\t\tcrimson velvet cushion; and, last of all this grand procession, came THE KING AND QUEEN OF\n\t\t\tHEARTS. \n\t\t\t\n\t\t\tAlice was rather doubtful whether she ought not to lie down on her face like the three\n\t\t\tgardeners, but she could not remember every having heard of such a rule at processions;", "uuid" : "4A21FEB4", "_id" : { "$oid" : "5055436e1a807e0200000002" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 1937, "end" : "/div[1]/div[3]", "endOffset" : 2961, "_id" : { "$oid" : "5055436e1a807e0200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347765102042 }, "created" : { "$date" : 1347765102042 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "505543c8d42d6e0200000032" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347765192787 }, "groups" : [ "21L.448J" ], "id" : "505543c8d42d6e0200000032", "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "quote" : "she came rather late", "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 6840, "end" : "/div[1]/div[3]", "endOffset" : 6860, "_id" : { "$oid" : "505543c8d42d6e0200000033" } } ], "tags" : [], "text" : "tardiness is against the rules and generally a faux pas. society says be on time. respect others' time. ", "updated" : { "$date" : 1347765534712 }, "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "uuid" : "239BD4B0" } -{ "id" : "505544f11a807e0200000004", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "In sports the rules are meant to keep everything fair and give the players accountability for their actions; they encourage sportsmanship. In Wonderland the rules are extremely arbitrary and rarely spoken of until there has been a foul. This can relate to the rules of society seeing as they change so often and it can be hard to keep up if you are not already aware of that fact. It can be confusing for anybody as they shift from one culture to another and have to adapt to the rules/expectations of those cultures.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`I don't think they play at all fairly,' Alice began, in rather a complaining tone, `and\n\t\t\tthey all quarrel so dreadfully one can't hear oneself speak--and they don't seem to have\n\t\t\tany rules in particular; at least, if there are, nobody attends to them--and you've no\n\t\t\tidea how confusing it is all the things being alive; for instance, there's the arch I've\n\t\t\tgot to go through next walking about at the other end of the ground--and I should have\n\t\t\tcroqueted the Queen's hedgehog just now, only it ran away when it saw mine coming!'", "uuid" : "38407CCF", "_id" : { "$oid" : "505544f11a807e0200000004" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 9859, "end" : "/div[1]/div[3]", "endOffset" : 10399, "_id" : { "$oid" : "505544f11a807e0200000005" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347765489039 }, "created" : { "$date" : 1347765489039 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50554556d42d6e0200000034", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "again, the arbitrariness of rules, especially in a royal context.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`Don't be impertinent,' said the King, `and don't look at me like that!' He got behind\n\t\t\tAlice as he spoke. \n\t\t\t\n\t\t\t`A cat may look at a king,' said Alice. `I've read that in some book, but I don't remember\n\t\t\twhere.'", "uuid" : "5D234E7E", "_id" : { "$oid" : "50554556d42d6e0200000034" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 11094, "end" : "/div[1]/div[3]", "endOffset" : 11313, "_id" : { "$oid" : "50554556d42d6e0200000035" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347765590470 }, "created" : { "$date" : 1347765590470 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505545d5d42d6e0200000036", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "sugar and spice and everything nice...![Alt text](http://upload.wikimedia.org/wikipedia/en/thumb/9/95/Powerpuff_girls_characters.jpg/270px-Powerpuff_girls_characters.jpg)", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "Maybe it's always\n\t\t\tpepper that makes people hot-tempered,' she went on, very much pleased at having found out\n\t\t\ta new kind of rule, `and vinegar that makes them sour--and camomile that makes them\n\t\t\tbitter--and--and barley-sugar and such things that make children sweet-tempered. I only\n\t\t\twish people knew that: then they wouldn't be so stingy about it, you know--'", "uuid" : "AE53CCAE", "_id" : { "$oid" : "505545d5d42d6e0200000036" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 576, "end" : "/div[1]/div[4]", "endOffset" : 946, "_id" : { "$oid" : "505545d5d42d6e0200000037" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347765717581 }, "created" : { "$date" : 1347765717581 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055467e1a807e0200000006", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "quite the after-school-special. always a moral to the story. could be a rule that there's always something to learn from your experiences?", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`I quite agree with you,' said the Duchess; `and the moral of that is--\"Be what you\n\t\t\twould seem to be\"--or if you'd like it put more simply--\"Never imagine yourself\n\t\t\tnot to be otherwise than what it might appear to others that what you were or might have\n\t\t\tbeen was not otherwise than what you had been would have appeared to them to be\n\t\t\totherwise.\"' \n\t\t\t\n\t\t\t`I think I should understand that better,' Alice said very politely, `if I had it written\n\t\t\tdown: but I can't quite follow it as you say it.'", "uuid" : "CDE62889", "_id" : { "$oid" : "5055467e1a807e0200000006" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 3492, "end" : "/div[1]/div[4]", "endOffset" : 4000, "_id" : { "$oid" : "5055467e1a807e0200000007" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347765886107 }, "created" : { "$date" : 1347765886107 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50554710d42d6e0200000038", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "In school it is very rude to interrupt the instructor. It is a rule to raise your hand before you speak. Alice knows this but can't control herself. Again we see how Carroll makes fun of rules in our world. ", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`I'll tell it her,' said the Mock Turtle in a deep, hollow tone: `sit down, both of you,\n\t\t\tand don't speak a word till I've finished.'", "uuid" : "0D94BC1C", "_id" : { "$oid" : "50554710d42d6e0200000038" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 8582, "end" : "/div[1]/div[4]", "endOffset" : 8718, "_id" : { "$oid" : "50554710d42d6e0200000039" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347766032236 }, "created" : { "$date" : 1347766032236 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055483cd42d6e020000003a", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "Here Carroll addresses how unnatural it is for Alice to grow (and shrink) so fast. We are all in some stage of growth (if not in height then hair, fingernails, weight, etc.) but it's not noticeable in just minutes. In the natural world it takes time but in Wonderland it can happen rapidly. ", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "Just at this moment Alice felt a very curious sensation, which puzzled her a good deal\n\t\t\tuntil she made out what it was: she was beginning to grow larger again, and she thought at\n\t\t\tfirst she would get up and leave the court; but on second thoughts she decided to remain\n\t\t\twhere she was as long as there was room for her. \n\t\t\t\n\t\t\t`I wish you wouldn't squeeze so.' said the Dormouse, who was sitting next to her. `I can\n\t\t\thardly breathe.' \n\t\t\t\n\t\t\t`I can't help it,' said Alice very meekly: `I'm growing.' \n\t\t\t\n\t\t\t`You've no right to grow here,' said the Dormouse. \n\t\t\t\n\t\t\t`Don't talk nonsense,' said Alice more boldly: `you know you're growing too.' \n\t\t\t\n\t\t\t`Yes, but I grow at a reasonable pace,' said the Dormouse: `not in that ridiculous\n\t\t\tfashion.'", "uuid" : "E0C1D962", "_id" : { "$oid" : "5055483cd42d6e020000003a" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 5391, "end" : "/div[1]/div[5]", "endOffset" : 6147, "_id" : { "$oid" : "5055483cd42d6e020000003b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347766332513 }, "created" : { "$date" : 1347766332513 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505548e4d42d6e020000003c", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "Rules in society. Guilt can be implied just by avoidance of a topic. Even just asking for legal advice can imply guilt. The only difference is that in our world it's not enough to get your head chopped off. ", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`If you didn't sign it,' said the King, `that only makes the matter worse. You MUST have\n\t\t\tmeant some mischief, or else you'd have signed your name like an honest man.'", "uuid" : "1BCDB94C", "_id" : { "$oid" : "505548e4d42d6e020000003c" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 4605, "end" : "/div[1]/div[6]", "endOffset" : 4775, "_id" : { "$oid" : "505548e4d42d6e020000003d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347766569456 }, "created" : { "$date" : 1347766500044 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50554a131a807e0200000008", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "Rules/process of dreams. When you are fully awake the dream goes away. How quickly do we forget most of our dreams once we wake up and get into our real world routines? We can remember some of the recurring and remarkable dreams that we have but more often than not they just disappear when we wake up. This is another rule/requirement I suppose of not being insane! ", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "So she sat on, with closed eyes, and half believed herself in Wonderland, though she knew\n\t\t\tshe had but to open them again, and all would change to dull reality--the grass would be\n\t\t\tonly rustling in the wind, and the pool rippling to the waving of the reeds--the rattling\n\t\t\tteacups would change to tinkling sheep- bells, and the Queen's shrill cries to the voice\n\t\t\tof the shepherd boy--and the sneeze of the baby, the shriek of the Gryphon, and all thy\n\t\t\tother queer noises, would change (she knew) to the confused clamour of the busy\n\t\t\tfarm-yard--while the lowing of the cattle in the distance would take the place of the Mock\n\t\t\tTurtle's heavy sobs.", "uuid" : "CD8E3D56", "_id" : { "$oid" : "50554a131a807e0200000008" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 11160, "end" : "/div[1]/div[6]", "endOffset" : 11819, "_id" : { "$oid" : "50554a131a807e0200000009" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347766803638 }, "created" : { "$date" : 1347766803638 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5055d5771a807e020000000a" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347802487899 }, "groups" : [ "21L.000J" ], "id" : "5055d5771a807e020000000a", "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "quote" : "dreary night", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 12, "end" : "/div[1]/p[1]", "endOffset" : 24, "_id" : { "$oid" : "5055d5771a807e020000000b" } } ], "tags" : [ "setting" ], "text" : "Sets up the typical, at least for modern times, setting for supernatural/spectacular events to occur", "updated" : { "$date" : 1347802499675 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "uuid" : "C1C4A05A" } -{ "id" : "5055d5cfd42d6e020000003e", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Maybe she chose this month to relate to the spirit of Halloween, if it was celebrated back then", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "November", "uuid" : "8662D893", "_id" : { "$oid" : "5055d5cfd42d6e020000003e" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "setting" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 27, "end" : "/div[1]/p[1]", "endOffset" : 36, "_id" : { "$oid" : "5055d5cfd42d6e020000003f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347802575081 }, "created" : { "$date" : 1347802575081 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055d66ed42d6e0200000040", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Great way to describe the results of his work on the creature, shows how heavily he is anticipating it", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "accomplishment of my toils", "uuid" : "93A4E638", "_id" : { "$oid" : "5055d66ed42d6e0200000040" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "vocabulary" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 55, "end" : "/div[1]/p[1]", "endOffset" : 81, "_id" : { "$oid" : "5055d66ed42d6e0200000041" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347802734207 }, "created" : { "$date" : 1347802734207 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055d7d31a807e020000000c", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Anxiety is compared to agony, a feeling many people can relate to, maybe references to the death of Mary's mother after her birth: the birth of Mary was a cause for high anticipation, but was turned into agony because of her mother's death", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "anxiety that almost amounted to agony", "uuid" : "8215F68F", "_id" : { "$oid" : "5055d7d31a807e020000000c" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "reference" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 91, "end" : "/div[1]/p[1]", "endOffset" : 128, "_id" : { "$oid" : "5055d7d31a807e020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347803091033 }, "created" : { "$date" : 1347803091033 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055d8481a807e020000000e", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "God also had \"instruments\" when he created life, the dust for Adam and a rib bone for Eve", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "instruments of life", "uuid" : "B51500D8", "_id" : { "$oid" : "5055d8481a807e020000000e" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "reference" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 145, "end" : "/div[1]/p[1]", "endOffset" : 165, "_id" : { "$oid" : "5055d8481a807e020000000f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347803208753 }, "created" : { "$date" : 1347803208753 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055d884d42d6e0200000042", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "References the theory at the time that electricity could be used to produce life, I think", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "spark", "uuid" : "CF1964C9", "_id" : { "$oid" : "5055d884d42d6e0200000042" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "reference" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 199, "end" : "/div[1]/p[1]", "endOffset" : 204, "_id" : { "$oid" : "5055d884d42d6e0200000043" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347803268567 }, "created" : { "$date" : 1347803268567 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055d8c41a807e0200000010", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Another piece of the typical setting, and it's interesting to note that rain can patter dismally, as if it has a will of its own", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "rain pattered dismally", "uuid" : "F26B194B", "_id" : { "$oid" : "5055d8c41a807e0200000010" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "setting" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 298, "end" : "/div[1]/p[1]", "endOffset" : 320, "_id" : { "$oid" : "5055d8c41a807e0200000011" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347803332692 }, "created" : { "$date" : 1347803332692 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055d9401a807e0200000012", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "From a writing sense, I wonder why she chose to repeat that the flame of the candle was almost dead, maybe because of the writing style back then", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "my candle was nearly burnt out, when, by the glimmer of the half-extinguished light", "uuid" : "49C1B52D", "_id" : { "$oid" : "5055d9401a807e0200000012" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "vocabulary" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 344, "end" : "/div[1]/p[1]", "endOffset" : 427, "_id" : { "$oid" : "5055d9401a807e0200000013" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347803456404 }, "created" : { "$date" : 1347803456404 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055d9781a807e0200000014", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Eye of the creature is the first thing that comes to life", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "saw the dull yellow eye of the creature open", "uuid" : "566AB8A6", "_id" : { "$oid" : "5055d9781a807e0200000014" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "Eye,", "creature,", "creation" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 431, "end" : "/div[1]/p[1]", "endOffset" : 475, "_id" : { "$oid" : "5055d9781a807e0200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347803512447 }, "created" : { "$date" : 1347803512447 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055d99bd42d6e0200000044", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Might be a reference to the \"breath of life\" that God gave Adam", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "it breathed hard", "uuid" : "1A0E1BB3", "_id" : { "$oid" : "5055d99bd42d6e0200000044" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "reference" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 477, "end" : "/div[1]/p[1]", "endOffset" : 493, "_id" : { "$oid" : "5055d99bd42d6e0200000045" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347803547621 }, "created" : { "$date" : 1347803547621 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055d9d0d42d6e0200000046", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "His work goes from an accomplishment to a catastrophe after it actually comes to life", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "catastrophe", "uuid" : "BDA6F339", "_id" : { "$oid" : "5055d9d0d42d6e0200000046" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "creature,", "creation" ], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 39, "end" : "/div[1]/p[2]", "endOffset" : 50, "_id" : { "$oid" : "5055d9d0d42d6e0200000047" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347803600038 }, "created" : { "$date" : 1347803600038 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5055da0ed42d6e0200000048" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347803662980 }, "groups" : [ "21L.000J" ], "id" : "5055da0ed42d6e0200000048", "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "quote" : "creature", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 462, "end" : "/div[1]/p[1]", "endOffset" : 470, "_id" : { "$oid" : "5055da0ed42d6e0200000049" } } ], "tags" : [ "creature,", "creation,", "name" ], "text" : "First thing he calls his creation is a creature", "updated" : { "$date" : 1347803733377 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "uuid" : "A6389288" } -{ "id" : "5055da42d42d6e020000004a", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Now refers to creature as a wretch", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "wretch", "uuid" : "4248195A", "_id" : { "$oid" : "5055da42d42d6e020000004a" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "creature,", "creation,", "name" ], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 73, "end" : "/div[1]/p[2]", "endOffset" : 79, "_id" : { "$oid" : "5055da42d42d6e020000004b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347803714363 }, "created" : { "$date" : 1347803714363 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055db4f1a807e0200000016", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Appears to have an obsession with the creature's appearance, goes on to describe the other features. Maybe he focuses on the description of ugliness to vent his extreme disappointment over the result, had been imagining something completely different", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Beautiful! Great God!", "uuid" : "901EA9A1", "_id" : { "$oid" : "5055db4f1a807e0200000016" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "accomplishment,", "feelings" ], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 222, "end" : "/div[1]/p[2]", "endOffset" : 243, "_id" : { "$oid" : "5055db4f1a807e0200000017" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347803983425 }, "created" : { "$date" : 1347803983425 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055dc061a807e0200000018", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Imagination is more powerful than reality, there is anguish in accomplishment. He put two years into something and it didn't turn out as he expected so he was extremely disappointed, but maybe also from the actual fact that he had finished. The task had defined his life for those two years and now it was done, and maybe he was overwhelmed with the feeling that he didn't have anything else to look forward to or work toward", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "now that I had finished, the beauty of the dream vanished, and breathless horror and disgust filled my heart", "uuid" : "B66C389D", "_id" : { "$oid" : "5055dc061a807e0200000018" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "feelings", "accomplishment" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 306, "end" : "/div[1]/p[3]", "endOffset" : 414, "_id" : { "$oid" : "5055dc061a807e0200000019" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347804166594 }, "created" : { "$date" : 1347804166594 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5055dcb6d42d6e020000004c" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347804342470 }, "groups" : [ "21L.000J" ], "id" : "5055dcb6d42d6e020000004c", "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "quote" : "aspect", "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 437, "end" : "/div[1]/p[3]", "endOffset" : 443, "_id" : { "$oid" : "5055dcb6d42d6e020000004d" } } ], "tags" : [ "feelings", "vocabulary" ], "text" : "The footnote says appearance, but I think the word aspect itself is even more correct. He seems to hate everything related to his creation, including the being's appearance and his actual accomplishment of creating the being and his utter disappointment over the being's result", "updated" : { "$date" : 1347804384438 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "uuid" : "C32FB05B" } -{ "id" : "5055dd1f1a807e020000001a", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Depict in words or gestures", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "delineate", "uuid" : "A66284F0", "_id" : { "$oid" : "5055dd1f1a807e020000001a" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "vocabulary" ], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 59, "end" : "/div[1]/p[2]", "endOffset" : 68, "_id" : { "$oid" : "5055dd1f1a807e020000001b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347804447409 }, "created" : { "$date" : 1347804447409 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055dd79d42d6e020000004e", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Weariness of body or mind from strain", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "lassitude", "uuid" : "E4BEFB01", "_id" : { "$oid" : "5055dd79d42d6e020000004e" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "vocabulary" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 596, "end" : "/div[1]/p[3]", "endOffset" : 605, "_id" : { "$oid" : "5055dd79d42d6e020000004f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347804537717 }, "created" : { "$date" : 1347804537717 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5055ddac1a807e020000001c" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347804588138 }, "groups" : [ "21L.000J" ], "id" : "5055ddac1a807e020000001c", "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "quote" : "tumult", "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 623, "end" : "/div[1]/p[3]", "endOffset" : 629, "_id" : { "$oid" : "5055ddac1a807e020000001d" } } ], "tags" : [ "vocabulary" ], "text" : "Highly distressing agitation of mind or feeling\nShe uses strong words to describe Victor's condition", "updated" : { "$date" : 1347804621508 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "uuid" : "28EAA83B" } -{ "id" : "5055dde51a807e020000001e", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Why dreary?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "dreary night", "uuid" : "C9151CB6", "_id" : { "$oid" : "5055dde51a807e020000001e" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 12, "end" : "/div[1]/p[1]", "endOffset" : 24, "_id" : { "$oid" : "5055dde51a807e020000001f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347804645320 }, "created" : { "$date" : 1347804645320 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055de231a807e0200000020", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "He wants to escape from the failure of his toils, and he is also tired in general from working so much, so he falls asleep", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I slept", "uuid" : "0F88993B", "_id" : { "$oid" : "5055de231a807e0200000020" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "feelings" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 770, "end" : "/div[1]/p[3]", "endOffset" : 777, "_id" : { "$oid" : "5055de231a807e0200000021" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347804707239 }, "created" : { "$date" : 1347804707239 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055debcd42d6e0200000050", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "The animation of a lifeless body is being considered a catastrophe. On what standards?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "catastrophe", "uuid" : "6B584DF3", "_id" : { "$oid" : "5055debcd42d6e0200000050" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 39, "end" : "/div[1]/p[2]", "endOffset" : 50, "_id" : { "$oid" : "5055debcd42d6e0200000051" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347804860760 }, "created" : { "$date" : 1347804860760 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055df1cd42d6e0200000052", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "A miserable person, a vile person.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "wretch", "uuid" : "674AC1BB", "_id" : { "$oid" : "5055df1cd42d6e0200000052" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 73, "end" : "/div[1]/p[2]", "endOffset" : 79, "_id" : { "$oid" : "5055df1cd42d6e0200000053" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347804956455 }, "created" : { "$date" : 1347804956455 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055df801a807e0200000022", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "describe ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "delineate", "uuid" : "063290E5", "_id" : { "$oid" : "5055df801a807e0200000022" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 59, "end" : "/div[1]/p[2]", "endOffset" : 68, "_id" : { "$oid" : "5055df801a807e0200000023" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347805056850 }, "created" : { "$date" : 1347805056850 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e0ded42d6e0200000054", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "What are the different accidents of life? Is one of them the occurrence of the \"failed\" project. Why are feelings of human nature so changeable? ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "The different accidents of life are not so changeable as the feelings of human nature.", "uuid" : "7C7401D0", "_id" : { "$oid" : "5055e0ded42d6e0200000054" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 0, "end" : "/div[1]/p[3]", "endOffset" : 86, "_id" : { "$oid" : "5055e0ded42d6e0200000055" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347805406159 }, "created" : { "$date" : 1347805406159 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e0f01a807e0200000024", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Dreams of Elizabeth turning into corpse of mother, signifies his dream of creation changing from beautiful to ugly", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I thought I saw Elizabeth, in the bloom of health, walking in the streets of Ingolstadt. Delighted and surprised, I embraced her, but as I imprinted the first kiss on her lips, they became livid with the hue of death; her features appeared to change, and I thought that I held the corpse of my dead mother in my arms; a shroud enveloped her form, and I saw the grave-worms crawling in the folds of the flannel", "uuid" : "D428EF9D", "_id" : { "$oid" : "5055e0f01a807e0200000024" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "dream", "feelings", "family" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 830, "end" : "/div[1]/p[3]", "endOffset" : 1239, "_id" : { "$oid" : "5055e0f01a807e0200000025" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347805424958 }, "created" : { "$date" : 1347805424958 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e10ed42d6e0200000056", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Description of the monster Frankenstein created.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "His limbs were in proportion, and I had selected his features as beautiful.", "uuid" : "33E1402A", "_id" : { "$oid" : "5055e10ed42d6e0200000056" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 146, "end" : "/div[1]/p[2]", "endOffset" : 221, "_id" : { "$oid" : "5055e10ed42d6e0200000057" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347805454768 }, "created" : { "$date" : 1347805454768 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e119d42d6e0200000058", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "First thing he notices when he wakes up are the creature's eyes", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "and his eyes, if eyes they may be called", "uuid" : "59996D48", "_id" : { "$oid" : "5055e119d42d6e0200000058" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "Eyes" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1558, "end" : "/div[1]/p[3]", "endOffset" : 1598, "_id" : { "$oid" : "5055e119d42d6e0200000059" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347805465121 }, "created" : { "$date" : 1347805465121 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e1281a807e0200000026", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "More description of the monster.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "His yellow skin scarcely covered the work of muscles and arteries beneath; his hair was of a lustrous black, and flowing; his teeth of a pearly whiteness", "uuid" : "D0513D22", "_id" : { "$oid" : "5055e1281a807e0200000026" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 244, "end" : "/div[1]/p[2]", "endOffset" : 397, "_id" : { "$oid" : "5055e1281a807e0200000027" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347805480701 }, "created" : { "$date" : 1347805480701 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5055e16f1a807e0200000028" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347805551296 }, "groups" : [ "21L.000J" ], "id" : "5055e16f1a807e0200000028", "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "quote" : "His jaws opened, and he muttered some inarticulate sounds, while a grin wrinkled his cheeks. He might have spoken, but I did not hear; one hand was stretched out", "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1618, "end" : "/div[1]/p[3]", "endOffset" : 1779, "_id" : { "$oid" : "5055e16f1a807e0200000029" } } ], "tags" : [ "creature", "reference", "evil" ], "text" : "Creature didn't make any harmful motions, attempted to talk and smile at his creator and reach out to him, comparable to a baby and its mother", "updated" : { "$date" : 1347805642900 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "uuid" : "9E48592B" } -{ "id" : "5055e1c11a807e020000002a", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Victor sees everything the creature does as evil because it has become a failure to him", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "seemingly to detain me", "uuid" : "880A8CCA", "_id" : { "$oid" : "5055e1c11a807e020000002a" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "creature", "creation", "evil" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1781, "end" : "/div[1]/p[3]", "endOffset" : 1803, "_id" : { "$oid" : "5055e1c11a807e020000002b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347805633506 }, "created" : { "$date" : 1347805633506 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e1d0d42d6e020000005a", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Luxuriance means very elaborate or ornate. Does this mean that Frankenstein wanted to create the most perfect being by putting these features on the creature?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "luxuriances", "uuid" : "E67E2084", "_id" : { "$oid" : "5055e1d0d42d6e020000005a" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 409, "end" : "/div[1]/p[2]", "endOffset" : 420, "_id" : { "$oid" : "5055e1d0d42d6e020000005b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347805648248 }, "created" : { "$date" : 1347805648248 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e1ead42d6e020000005c", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "paranoia sets in", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "walking up and down in the greatest agitation, listening attentively, catching and fearing each sound", "uuid" : "AFA227BC", "_id" : { "$oid" : "5055e1ead42d6e020000005c" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "feelings" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1962, "end" : "/div[1]/p[3]", "endOffset" : 2063, "_id" : { "$oid" : "5055e1ead42d6e020000005d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347805674887 }, "created" : { "$date" : 1347805674887 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e23f1a807e020000002c", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Anxiety that was almost led to agony, the suffering of intense physical of mental pain.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "anxiety that almost amounted to agony", "uuid" : "ADA33EC5", "_id" : { "$oid" : "5055e23f1a807e020000002c" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 91, "end" : "/div[1]/p[1]", "endOffset" : 128, "_id" : { "$oid" : "5055e23f1a807e020000002d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347805759877 }, "created" : { "$date" : 1347805759877 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e23fd42d6e020000005e", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Reference to the creature as a demon", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "demoniacal corpse", "uuid" : "D26247B6", "_id" : { "$oid" : "5055e23fd42d6e020000005e" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "evil", "creature" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 2110, "end" : "/div[1]/p[3]", "endOffset" : 2127, "_id" : { "$oid" : "5055e23fd42d6e020000005f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347805759876 }, "created" : { "$date" : 1347805759876 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e25b1a807e020000002e", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Cool description", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "rain pattered dismally", "uuid" : "02EB0CE0", "_id" : { "$oid" : "5055e25b1a807e020000002e" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 298, "end" : "/div[1]/p[1]", "endOffset" : 320, "_id" : { "$oid" : "5055e25b1a807e020000002f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347805787620 }, "created" : { "$date" : 1347805787620 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e295d42d6e0200000060", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Breathing is a sign of life, and movement is also a sign that something may be possibly alive.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "it breathed hard, and a convulsive motion agitated its limbs.", "uuid" : "05F03D0F", "_id" : { "$oid" : "5055e295d42d6e0200000060" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 477, "end" : "/div[1]/p[1]", "endOffset" : 538, "_id" : { "$oid" : "5055e295d42d6e0200000061" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347805845443 }, "created" : { "$date" : 1347805845443 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e2a9d42d6e0200000062", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Compares creature to worse than a mummy reborn, a familiar idea to movies, at least in modern times, and one that people can relate to", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "mummy again endued with animation could not be so hideous as that wretch", "uuid" : "F793C4F1", "_id" : { "$oid" : "5055e2a9d42d6e0200000062" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "reference", "evil", "creature" ], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 62, "end" : "/div[1]/p[4]", "endOffset" : 134, "_id" : { "$oid" : "5055e2a9d42d6e0200000063" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347805865105 }, "created" : { "$date" : 1347805865105 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e2b2d42d6e0200000064", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "zeal", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "ardour", "uuid" : "750C87D2", "_id" : { "$oid" : "5055e2b2d42d6e0200000064" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 265, "end" : "/div[1]/p[3]", "endOffset" : 271, "_id" : { "$oid" : "5055e2b2d42d6e0200000065" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347805874988 }, "created" : { "$date" : 1347805874988 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e2ec1a807e0200000030", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "The change of feelings of human nature. He was unable to see what he was really doing.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "the beauty of the dream vanished, and breathless horror and disgust filled my heart.", "uuid" : "C568BA08", "_id" : { "$oid" : "5055e2ec1a807e0200000030" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 331, "end" : "/div[1]/p[3]", "endOffset" : 415, "_id" : { "$oid" : "5055e2ec1a807e0200000031" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347805932648 }, "created" : { "$date" : 1347805932648 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e30b1a807e0200000032", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Appearance\nApparently she doesn't like to use the word appearance, maybe wants to avoid making readers think Victor hates the creature strictly because of its appearance by using synonyms", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "countenance", "uuid" : "66FBA738", "_id" : { "$oid" : "5055e30b1a807e0200000032" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "vocabulary" ], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 47, "end" : "/div[1]/p[4]", "endOffset" : 58, "_id" : { "$oid" : "5055e30b1a807e0200000033" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347805963886 }, "created" : { "$date" : 1347805963886 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e341d42d6e0200000066", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "He just accomplished his goal of two years in which he sacrificed his health and his rest and now, after all he did, Frankenstein takes a nap in his bed...", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I slept", "uuid" : "9B30FA13", "_id" : { "$oid" : "5055e341d42d6e0200000066" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 770, "end" : "/div[1]/p[3]", "endOffset" : 777, "_id" : { "$oid" : "5055e341d42d6e0200000067" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806017314 }, "created" : { "$date" : 1347806017314 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e35f1a807e0200000034", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "state of weariness ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "lassitude", "uuid" : "EAF7488B", "_id" : { "$oid" : "5055e35f1a807e0200000034" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 596, "end" : "/div[1]/p[3]", "endOffset" : 605, "_id" : { "$oid" : "5055e35f1a807e0200000035" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806047426 }, "created" : { "$date" : 1347806047426 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e372d42d6e0200000068", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Uses multiple references to relate how much Victor hates the creature, this one to Dante's Inferno I believe", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Dante could not have conceived", "uuid" : "F54893AC", "_id" : { "$oid" : "5055e372d42d6e0200000068" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "evil", "creature" ], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 289, "end" : "/div[1]/p[4]", "endOffset" : 319, "_id" : { "$oid" : "5055e372d42d6e0200000069" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806066776 }, "created" : { "$date" : 1347806066776 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e3911a807e0200000036", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Agitation of the mind or emotions", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "tumult", "uuid" : "7188EA98", "_id" : { "$oid" : "5055e3911a807e0200000036" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 623, "end" : "/div[1]/p[3]", "endOffset" : 629, "_id" : { "$oid" : "5055e3911a807e0200000037" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806097549 }, "created" : { "$date" : 1347806097549 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e3b01a807e0200000038", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Begins to see everything as wretched after the creature's creation", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "wretchedly", "uuid" : "CD9244A8", "_id" : { "$oid" : "5055e3b01a807e0200000038" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "vocabulary", "evil" ], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 19, "end" : "/div[1]/p[5]", "endOffset" : 29, "_id" : { "$oid" : "5055e3b01a807e0200000039" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806128044 }, "created" : { "$date" : 1347806128044 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e3d21a807e020000003a", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "lack of energy", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "languor", "uuid" : "80B63850", "_id" : { "$oid" : "5055e3d21a807e020000003a" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "vocabulary" ], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 169, "end" : "/div[1]/p[5]", "endOffset" : 176, "_id" : { "$oid" : "5055e3d21a807e020000003b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806162655 }, "created" : { "$date" : 1347806162655 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e4101a807e020000003c", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Now mentions that he is also disappointed, delayed reaction maybe because of the shock of the situation ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Mingled with this horror, I felt the bitterness of disappointment", "uuid" : "225EF4F1", "_id" : { "$oid" : "5055e4101a807e020000003c" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "accomplishment", "creation" ], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 199, "end" : "/div[1]/p[5]", "endOffset" : 264, "_id" : { "$oid" : "5055e4101a807e020000003d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806224412 }, "created" : { "$date" : 1347806224412 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e42bd42d6e020000006a", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "In his dream Elizabeth is healthy and then she changes to become the corpse of his dead mother. He did accomplish to create life without woman being present in the process. Also this could foreshadow the death of Elizabeth.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I thought I saw Elizabeth, in the bloom of health, walking in the streets of Ingolstadt. Delighted and surprised, I embraced her, but as I imprinted the first kiss on her lips, they became livid with the hue of death; her features appeared to change, and I thought that I held the corpse of my dead mother in my arms; a shroud enveloped her form, and I saw the grave-worms crawling in the folds of the flannel.", "uuid" : "7B2FECBE", "_id" : { "$oid" : "5055e42bd42d6e020000006a" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 830, "end" : "/div[1]/p[3]", "endOffset" : 1240, "_id" : { "$oid" : "5055e42bd42d6e020000006b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806251338 }, "created" : { "$date" : 1347806251338 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e455d42d6e020000006c", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "wretch", "uuid" : "1C74A29E", "_id" : { "$oid" : "5055e455d42d6e020000006c" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1473, "end" : "/div[1]/p[3]", "endOffset" : 1479, "_id" : { "$oid" : "5055e455d42d6e020000006d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806293333 }, "created" : { "$date" : 1347806293333 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e45ad42d6e020000006e", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "monster", "uuid" : "33FADD47", "_id" : { "$oid" : "5055e45ad42d6e020000006e" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1495, "end" : "/div[1]/p[3]", "endOffset" : 1502, "_id" : { "$oid" : "5055e45ad42d6e020000006f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806298785 }, "created" : { "$date" : 1347806298785 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e49d1a807e020000003e", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "His work had been his \"food\", his only enjoyment and concern/focus for the past two years and it turned into something he saw as evil. His actual dreams also become a hell for him by plaguing him with images that relate to his disappointing creation", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "dreams that had been my food and pleasant rest for so long a space were now become a hell to me", "uuid" : "466BBE64", "_id" : { "$oid" : "5055e49d1a807e020000003e" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "evil", "creature", "creation", "accomplishment" ], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 266, "end" : "/div[1]/p[5]", "endOffset" : 361, "_id" : { "$oid" : "5055e49d1a807e020000003f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806365151 }, "created" : { "$date" : 1347806365151 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e4cad42d6e0200000070", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "A grin was on his face. Does this show that the monster was happy to meet his creator?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "a grin wrinkled his cheeks", "uuid" : "B800D76C", "_id" : { "$oid" : "5055e4cad42d6e0200000070" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1683, "end" : "/div[1]/p[3]", "endOffset" : 1709, "_id" : { "$oid" : "5055e4cad42d6e0200000071" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806410031 }, "created" : { "$date" : 1347806410031 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e4d41a807e0200000040", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Hid from the creature in a church, reference to how he sees it as demonic", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "discovered to my sleepless and aching eyes the church of Ingolstadt, its white steeple and clock, which indicated the sixth hour. The porter opened the gates of the court, which had that night been my asylum", "uuid" : "692400B0", "_id" : { "$oid" : "5055e4d41a807e0200000040" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "evil", "creature" ], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 46, "end" : "/div[1]/p[6]", "endOffset" : 253, "_id" : { "$oid" : "5055e4d41a807e0200000041" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806420969 }, "created" : { "$date" : 1347806420969 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e4edd42d6e0200000072", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Still raining", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "drenched by the rain", "uuid" : "1FE6B4BB", "_id" : { "$oid" : "5055e4edd42d6e0200000072" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "setting" ], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 517, "end" : "/div[1]/p[6]", "endOffset" : 537, "_id" : { "$oid" : "5055e4edd42d6e0200000073" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806445125 }, "created" : { "$date" : 1347806445125 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e5171a807e0200000042", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Personifies the sky to make it comfortless, everything seems to be dismal through Victor's eyes", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "black and comfortless sky", "uuid" : "2CD0B6DF", "_id" : { "$oid" : "5055e5171a807e0200000042" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "setting" ], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 558, "end" : "/div[1]/p[6]", "endOffset" : 583, "_id" : { "$oid" : "5055e5171a807e0200000043" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806487551 }, "created" : { "$date" : 1347806487551 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e527d42d6e0200000074", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "A hand to detain or a hand to keep Frankenstein there so that there may be an explanation. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "one hand was stretched out, seemingly to detain me", "uuid" : "D2601164", "_id" : { "$oid" : "5055e527d42d6e0200000074" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1753, "end" : "/div[1]/p[3]", "endOffset" : 1803, "_id" : { "$oid" : "5055e527d42d6e0200000075" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806503224 }, "created" : { "$date" : 1347806503224 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e53a1a807e0200000044", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "demoniacal corpse", "uuid" : "090DDEBD", "_id" : { "$oid" : "5055e53a1a807e0200000044" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 2110, "end" : "/div[1]/p[3]", "endOffset" : 2127, "_id" : { "$oid" : "5055e53a1a807e0200000045" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806522791 }, "created" : { "$date" : 1347806522791 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e54ad42d6e0200000076", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "wretch", "uuid" : "7EE3E1A3", "_id" : { "$oid" : "5055e54ad42d6e0200000076" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 128, "end" : "/div[1]/p[4]", "endOffset" : 134, "_id" : { "$oid" : "5055e54ad42d6e0200000077" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806538069 }, "created" : { "$date" : 1347806538069 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e54b1a807e0200000046", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Uses physical exertion to assuage mental stress", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "endeavouring by bodily exercise to ease the load that weighed upon my mind", "uuid" : "E268DB91", "_id" : { "$oid" : "5055e54b1a807e0200000046" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "feelings" ], "ranges" : [ { "start" : "/div[1]/p[7]", "startOffset" : 50, "end" : "/div[1]/p[7]", "endOffset" : 124, "_id" : { "$oid" : "5055e54b1a807e0200000047" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806539034 }, "created" : { "$date" : 1347806539034 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e5641a807e0200000048", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "A reference to what?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Dante", "uuid" : "FCBD7E18", "_id" : { "$oid" : "5055e5641a807e0200000048" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 289, "end" : "/div[1]/p[4]", "endOffset" : 294, "_id" : { "$oid" : "5055e5641a807e0200000049" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806564060 }, "created" : { "$date" : 1347806564060 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e577d42d6e0200000078", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Like fear is a disease that is living within him", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "sickness of fear", "uuid" : "DEF397EE", "_id" : { "$oid" : "5055e577d42d6e0200000078" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "feelings" ], "ranges" : [ { "start" : "/div[1]/p[7]", "startOffset" : 242, "end" : "/div[1]/p[7]", "endOffset" : 258, "_id" : { "$oid" : "5055e577d42d6e0200000079" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806583745 }, "created" : { "$date" : 1347806583745 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5055e58a1a807e020000004a" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347806602908 }, "groups" : [ "21L.000J" ], "id" : "5055e58a1a807e020000004a", "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "quote" : "My heart palpitated", "ranges" : [ { "start" : "/div[1]/p[7]", "startOffset" : 215, "end" : "/div[1]/p[7]", "endOffset" : 234, "_id" : { "$oid" : "5055e58a1a807e020000004b" } } ], "tags" : [ "vocabulary", "writing" ], "text" : "", "updated" : { "$date" : 1347806756047 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "uuid" : "68D4C71D" } -{ "id" : "5055e5a6d42d6e020000007a", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "The state or feeling, often pleasant, of tiredness or inertia.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "languor", "uuid" : "28F03665", "_id" : { "$oid" : "5055e5a6d42d6e020000007a" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 169, "end" : "/div[1]/p[5]", "endOffset" : 176, "_id" : { "$oid" : "5055e5a6d42d6e020000007b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806630324 }, "created" : { "$date" : 1347806630324 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e5abd42d6e020000007c", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "palpitation", "uuid" : "3FE8CCAB", "_id" : { "$oid" : "5055e5abd42d6e020000007c" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "vocabulary" ], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 93, "end" : "/div[1]/p[5]", "endOffset" : 104, "_id" : { "$oid" : "5055e5abd42d6e020000007d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806635249 }, "created" : { "$date" : 1347806635249 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e603d42d6e020000007e", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "It was his dream to create the creature yet now its his worse worry. One action can shape the course of your life.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "dreams that had been my food and pleasant rest for so long a space were now become a hell to me; and the change was so rapid, the overthrow so complete!", "uuid" : "FD77137F", "_id" : { "$oid" : "5055e603d42d6e020000007e" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 266, "end" : "/div[1]/p[5]", "endOffset" : 418, "_id" : { "$oid" : "5055e603d42d6e020000007f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806723400 }, "created" : { "$date" : 1347806723400 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e6561a807e020000004c", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "A feeling most everyone can relate to of the paranoia that someone is following you", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Like one who, on a lonely road, Doth walk in fear and dread, And, having once turned round, walks on, And turns no more his head; Because he knows a frightful fiend Doth close behind him tread", "uuid" : "47A4A036", "_id" : { "$oid" : "5055e6561a807e020000004c" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "reference" ], "ranges" : [ { "start" : "/div[1]/p[8]", "startOffset" : 0, "end" : "/div[1]/p[8]", "endOffset" : 192, "_id" : { "$oid" : "5055e6561a807e020000004d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806806754 }, "created" : { "$date" : 1347806806754 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e6d61a807e020000004e", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Interesting ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "sixth hour", "uuid" : "8698B75B", "_id" : { "$oid" : "5055e6d61a807e020000004e" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 164, "end" : "/div[1]/p[6]", "endOffset" : 174, "_id" : { "$oid" : "5055e6d61a807e020000004f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347806934716 }, "created" : { "$date" : 1347806934716 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e719d42d6e0200000080", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Shelter or protection from danger.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "asylum", "uuid" : "04F1F503", "_id" : { "$oid" : "5055e719d42d6e0200000080" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 247, "end" : "/div[1]/p[6]", "endOffset" : 253, "_id" : { "$oid" : "5055e719d42d6e0200000081" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347807001981 }, "created" : { "$date" : 1347807001981 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e7371a807e0200000050", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "wretch", "uuid" : "F6C70DB7", "_id" : { "$oid" : "5055e7371a807e0200000050" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 344, "end" : "/div[1]/p[6]", "endOffset" : 350, "_id" : { "$oid" : "5055e7371a807e0200000051" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347807031586 }, "created" : { "$date" : 1347807031585 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e7381a807e0200000052", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "text" : "Many rules, particularly the laws governing social interaction are often very arbitrary. This passage presents the effect of this comically by presenting an image of people being forced to paint roses, an absolutely ridiculous task.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`Why the fact\n\t\t\tis, you see, Miss, this here ought to have been a RED rose-tree, and we put a white one in\n\t\t\tby mistake; and if the Queen was to find it out, we should all have our heads cut off, you\n\t\t\tknow. So you see, Miss, we're doing our best, afore she comes, to--'", "uuid" : "C13C3139", "_id" : { "$oid" : "5055e7381a807e0200000052" }, "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 1381, "end" : "/div[1]/div[3]", "endOffset" : 1655, "_id" : { "$oid" : "5055e7381a807e0200000053" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347807032954 }, "created" : { "$date" : 1347807032954 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e76c1a807e0200000054", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Awesome description.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "black and comfortless sky", "uuid" : "886F35E7", "_id" : { "$oid" : "5055e76c1a807e0200000054" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 558, "end" : "/div[1]/p[6]", "endOffset" : 583, "_id" : { "$oid" : "5055e76c1a807e0200000055" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347807084432 }, "created" : { "$date" : 1347807084432 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e7b81a807e0200000056", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "State of being lost", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I traversed the streets without any clear conception of where I was or what I was doing.", "uuid" : "61D7C8F2", "_id" : { "$oid" : "5055e7b81a807e0200000056" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[7]", "startOffset" : 126, "end" : "/div[1]/p[7]", "endOffset" : 214, "_id" : { "$oid" : "5055e7b81a807e0200000057" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347807160405 }, "created" : { "$date" : 1347807160405 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e7dc1a807e0200000058", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "fiend", "uuid" : "CB64B433", "_id" : { "$oid" : "5055e7dc1a807e0200000058" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[8]", "startOffset" : 159, "end" : "/div[1]/p[8]", "endOffset" : 165, "_id" : { "$oid" : "5055e7dc1a807e0200000059" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347807196965 }, "created" : { "$date" : 1347807196965 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e802d42d6e0200000082", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "text" : "Symbolic of how dealing with society's rules and constantly needing to please people can turn people into nervous wrecks", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "and among them Alice recognised the White Rabbit: it\n\t\t\twas talking in a hurried nervous manner, smiling at everything that was said, and went by\n\t\t\twithout noticing her.", "uuid" : "C7365920", "_id" : { "$oid" : "5055e802d42d6e0200000082" }, "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 2434, "end" : "/div[1]/div[3]", "endOffset" : 2604, "_id" : { "$oid" : "5055e802d42d6e0200000083" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347807234904 }, "created" : { "$date" : 1347807234904 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e816d42d6e0200000084", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Ancient Mariner ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Like one who, on a lonely road, Doth walk in fear and dread, And, having once turned round, walks on, And turns no more his head; Because he knows a frightful fiend Doth close behind him tread.", "uuid" : "82C53E47", "_id" : { "$oid" : "5055e816d42d6e0200000084" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[8]", "startOffset" : 0, "end" : "/div[1]/p[8]", "endOffset" : 193, "_id" : { "$oid" : "5055e816d42d6e0200000085" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347807254827 }, "created" : { "$date" : 1347807254827 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e84d1a807e020000005a", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Why does Henry Clerval show up all of a sudden?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Henry Clerval", "uuid" : "357CEBF8", "_id" : { "$oid" : "5055e84d1a807e020000005a" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 409, "end" : "/div[1]/p[10]", "endOffset" : 422, "_id" : { "$oid" : "5055e84d1a807e020000005b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347807309342 }, "created" : { "$date" : 1347807309342 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e8621a807e020000005c", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Not coincidence.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "How fortunate that you should be here at the very moment of my alighting!\"", "uuid" : "09B74DD5", "_id" : { "$oid" : "5055e8621a807e020000005c" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 530, "end" : "/div[1]/p[10]", "endOffset" : 604, "_id" : { "$oid" : "5055e8621a807e020000005d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347807330407 }, "created" : { "$date" : 1347807330407 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e8a61a807e020000005e", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "He beings to start feeling better. He has his connection to his past before his incident.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "delight on seeing Clerval; his presence brought back to my thoughts my father, Elizabeth, and all those scenes of home so dear to my recollection.", "uuid" : "80975467", "_id" : { "$oid" : "5055e8a61a807e020000005e" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 23, "end" : "/div[1]/p[11]", "endOffset" : 169, "_id" : { "$oid" : "5055e8a61a807e020000005f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347807398268 }, "created" : { "$date" : 1347807398268 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e93d1a807e0200000060", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Again Clerval starts to \"heal\" him of his misery.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "in a moment forgot my horror and misfortune", "uuid" : "895CC992", "_id" : { "$oid" : "5055e93d1a807e0200000060" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 194, "end" : "/div[1]/p[11]", "endOffset" : 237, "_id" : { "$oid" : "5055e93d1a807e0200000061" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347807549797 }, "created" : { "$date" : 1347807549797 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055e950d42d6e0200000086", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "He suffered for months.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "first time during many months, calm and serene joy.", "uuid" : "5C56F58A", "_id" : { "$oid" : "5055e950d42d6e0200000086" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 268, "end" : "/div[1]/p[11]", "endOffset" : 319, "_id" : { "$oid" : "5055e950d42d6e0200000087" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347807568603 }, "created" : { "$date" : 1347807568603 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055ea05d42d6e0200000088", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Frankenstein's state of health", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "\"I did not before remark how very ill you appear; so thin and pale; you look as if you had been watching for several nights.\"", "uuid" : "0D66D0EF", "_id" : { "$oid" : "5055ea05d42d6e0200000088" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 238, "end" : "/div[1]/p[13]", "endOffset" : 363, "_id" : { "$oid" : "5055ea05d42d6e0200000089" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347807749837 }, "created" : { "$date" : 1347807749837 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055ea171a807e0200000062", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "text" : "I think this is an assault on the harsh treatment of children during the time period this book was written ", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "They're dreadfully fond of beheading people here; the great wonder is, that\n\t\t\tthere's any one left alive!'", "uuid" : "C23D9E40", "_id" : { "$oid" : "5055ea171a807e0200000062" }, "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 8840, "end" : "/div[1]/div[3]", "endOffset" : 8948, "_id" : { "$oid" : "5055ea171a807e0200000063" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347807767399 }, "created" : { "$date" : 1347807767399 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055ea2f1a807e0200000064", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "With someone with him Frankenstein feels safe.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I sincerely hope, that all these employments are now at an end and that I am at length free.\"", "uuid" : "518241F0", "_id" : { "$oid" : "5055ea2f1a807e0200000064" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 152, "end" : "/div[1]/p[14]", "endOffset" : 245, "_id" : { "$oid" : "5055ea2f1a807e0200000065" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347807791286 }, "created" : { "$date" : 1347807791286 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055ea5c1a807e0200000066", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "text" : "How does she know the cat's name?", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "It's the Cheshire Cat: now I shall have somebody to talk to.'", "uuid" : "04ACCFD3", "_id" : { "$oid" : "5055ea5c1a807e0200000066" }, "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 9252, "end" : "/div[1]/div[3]", "endOffset" : 9314, "_id" : { "$oid" : "5055ea5c1a807e0200000067" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347807836905 }, "created" : { "$date" : 1347807836905 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055ea86d42d6e020000008a", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "creature", "uuid" : "E17C0ED7", "_id" : { "$oid" : "5055ea86d42d6e020000008a" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 245, "end" : "/div[1]/p[15]", "endOffset" : 253, "_id" : { "$oid" : "5055ea86d42d6e020000008b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347807878500 }, "created" : { "$date" : 1347807878500 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055ea8cd42d6e020000008c", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "monster", "uuid" : "64B39E1D", "_id" : { "$oid" : "5055ea8cd42d6e020000008c" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 358, "end" : "/div[1]/p[15]", "endOffset" : 365, "_id" : { "$oid" : "5055ea8cd42d6e020000008d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347807884266 }, "created" : { "$date" : 1347807884266 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055eab11a807e0200000068", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "The monster is Frankenstein's spectre", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I threw the door forcibly open, as children are accustomed to do when they expect a spectre to stand in waiting for them on the other side", "uuid" : "53D9E94D", "_id" : { "$oid" : "5055eab11a807e0200000068" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 654, "end" : "/div[1]/p[15]", "endOffset" : 792, "_id" : { "$oid" : "5055eab11a807e0200000069" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347807921168 }, "created" : { "$date" : 1347807921168 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055eacbd42d6e020000008e", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "hideous guest.", "uuid" : "9FFE9C27", "_id" : { "$oid" : "5055eacbd42d6e020000008e" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 904, "end" : "/div[1]/p[15]", "endOffset" : 918, "_id" : { "$oid" : "5055eacbd42d6e020000008f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347807947679 }, "created" : { "$date" : 1347807947679 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055eb44d42d6e0200000090", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "The monster, his creation, is now his enemy.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "enemy", "uuid" : "A3545C78", "_id" : { "$oid" : "5055eb44d42d6e0200000090" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 1029, "end" : "/div[1]/p[15]", "endOffset" : 1034, "_id" : { "$oid" : "5055eb44d42d6e0200000091" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347808068722 }, "created" : { "$date" : 1347808068722 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055ebd1d42d6e0200000092", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "A wilderness attributed to the state of being lost. Finally being safe for a brief moment of time. Victor's laugh was heartless.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "wildness in my eyes for which he could not account, and my loud, unrestrained, heartless laughter frightened and astonished him.", "uuid" : "07DA1DAE", "_id" : { "$oid" : "5055ebd1d42d6e0200000092" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[16]", "startOffset" : 473, "end" : "/div[1]/p[16]", "endOffset" : 601, "_id" : { "$oid" : "5055ebd1d42d6e0200000093" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347808209717 }, "created" : { "$date" : 1347808209717 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055ebe61a807e020000006a", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "monster", "uuid" : "A8C0668A", "_id" : { "$oid" : "5055ebe61a807e020000006a" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 177, "end" : "/div[1]/p[18]", "endOffset" : 184, "_id" : { "$oid" : "5055ebe61a807e020000006b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347808230467 }, "created" : { "$date" : 1347808230467 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055ec1b1a807e020000006c", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "victor's state of mind is so bad he is delusional and things the monster is there in the room.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "\"HE can tell. Oh, save me! Save me!\" I imagined that the monster seized me; I struggled furiously and fell down in a fit.", "uuid" : "00A419A2", "_id" : { "$oid" : "5055ec1b1a807e020000006c" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 120, "end" : "/div[1]/p[18]", "endOffset" : 241, "_id" : { "$oid" : "5055ec1b1a807e020000006d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347808283190 }, "created" : { "$date" : 1347808283190 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055ecac1a807e020000006e", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "text" : "example of how children are often not told the reasoning behind rules", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`You're thinking about something, my dear, and that makes you\n\t\t\tforget to talk. I can't tell you just now what the moral of that is, but I shall remember\n\t\t\tit in a bit.' \n\t\t\t\n\t\t\t`Perhaps it hasn't one,' Alice ventured to remark. \n\t\t\t\n\t\t\t`Tut, tut, child!' said the Duchess. `Everything's got a moral, if only you can find it.'\n\t\t\tAnd she squeezed herself up closer to Alice's side as she spoke.", "uuid" : "B53C2294", "_id" : { "$oid" : "5055ecac1a807e020000006e" }, "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 1076, "end" : "/div[1]/div[4]", "endOffset" : 1473, "_id" : { "$oid" : "5055ecac1a807e020000006f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347808428253 }, "created" : { "$date" : 1347808428253 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055ecbe1a807e0200000070", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Henry is the one who nurses Victor back to health, both physically and mentally.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "He knew that I could not have a more kind and attentive nurse than himself; and, firm in the hope he felt of my recovery, he did not doubt that, instead of doing harm, he performed the kindest action that he could towards them.", "uuid" : "CCF2D91D", "_id" : { "$oid" : "5055ecbe1a807e0200000070" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 344, "end" : "/div[1]/p[20]", "endOffset" : 571, "_id" : { "$oid" : "5055ecbe1a807e0200000071" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347808446872 }, "created" : { "$date" : 1347808446872 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055ed0fd42d6e0200000094", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Strong adjective", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "immense", "uuid" : "2F17E05F", "_id" : { "$oid" : "5055ed0fd42d6e0200000094" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[741]", "startOffset" : 70, "end" : "/div[1]/p[741]", "endOffset" : 77, "_id" : { "$oid" : "5055ed0fd42d6e0200000095" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347808527164 }, "created" : { "$date" : 1347808527164 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055ed361a807e0200000072", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Jumping to conclusions. There could be a normal reason why it is there.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "as if meant to be out of sight", "uuid" : "B7027B3E", "_id" : { "$oid" : "5055ed361a807e0200000072" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[741]", "startOffset" : 157, "end" : "/div[1]/p[741]", "endOffset" : 187, "_id" : { "$oid" : "5055ed361a807e0200000073" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347808566349 }, "created" : { "$date" : 1347808566349 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055ed701a807e0200000074", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Is that a normal occurrence? Do candles tend to go out?", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "candle may go out", "uuid" : "21223FFE", "_id" : { "$oid" : "5055ed701a807e0200000074" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[741]", "startOffset" : 308, "end" : "/div[1]/p[741]", "endOffset" : 325, "_id" : { "$oid" : "5055ed701a807e0200000075" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347808624983 }, "created" : { "$date" : 1347808624983 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055ee03d42d6e0200000096", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Narrator adds adjectives which describe Catherine's thoughts and feelings. Makes the chest more odd and mysterious.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "curiously inlaid with some darker\n\nwood, and raised, about a foot from the ground, on a carved stand of the\n\nsame. The lock was silver, though tarnished from age; at each end\n\nwere the imperfect remains of handles also of silver, broken perhaps\n\nprematurely by some strange violence; and, on the centre of the lid, was\n\na mysterious cipher, in the same metal.", "uuid" : "1B647F60", "_id" : { "$oid" : "5055ee03d42d6e0200000096" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[741]", "startOffset" : 384, "end" : "/div[1]/p[741]", "endOffset" : 744, "_id" : { "$oid" : "5055ee03d42d6e0200000097" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347808771770 }, "created" : { "$date" : 1347808771770 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055ee0dd42d6e0200000098", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "If only Henry knew.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "he at first believed them to be the wanderings of my disturbed imagination, but the pertinacity with which I continually recurred to the same subject persuaded him that my disorder indeed owed its origin to some uncommon and terrible event.", "uuid" : "214FBDA7", "_id" : { "$oid" : "5055ee0dd42d6e0200000098" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 301, "end" : "/div[1]/p[21]", "endOffset" : 541, "_id" : { "$oid" : "5055ee0dd42d6e0200000099" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347808781752 }, "created" : { "$date" : 1347808781752 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055ee47d42d6e020000009a", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "text" : "What does the kings compassion compared to the queens brutality symbolize?", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "Alice heard the King say in a low voice, to the company\n\t\t\tgenerally, `You are all pardoned.'", "uuid" : "D7780317", "_id" : { "$oid" : "5055ee47d42d6e020000009a" }, "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 6673, "end" : "/div[1]/div[4]", "endOffset" : 6766, "_id" : { "$oid" : "5055ee47d42d6e020000009b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347808839915 }, "created" : { "$date" : 1347808839915 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055ee4d1a807e0200000076", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Adhering resolutely to an opinion, purpose, or design", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "pertinacity", "uuid" : "E9C6F4BF", "_id" : { "$oid" : "5055ee4d1a807e0200000076" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 385, "end" : "/div[1]/p[21]", "endOffset" : 397, "_id" : { "$oid" : "5055ee4d1a807e0200000077" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347808845783 }, "created" : { "$date" : 1347808845783 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055ee561a807e0200000078", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "More description that adds to the sense of a mystery.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "strange events", "uuid" : "FFFF1526", "_id" : { "$oid" : "5055ee561a807e0200000078" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[741]", "startOffset" : 1080, "end" : "/div[1]/p[741]", "endOffset" : 1094, "_id" : { "$oid" : "5055ee561a807e0200000079" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347808854681 }, "created" : { "$date" : 1347808854681 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055ee7ad42d6e020000009c", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Fearful, even though she is just looking at a chest.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "fearful curiosity", "uuid" : "923A4C12", "_id" : { "$oid" : "5055ee7ad42d6e020000009c" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[742]", "startOffset" : 5, "end" : "/div[1]/p[742]", "endOffset" : 23, "_id" : { "$oid" : "5055ee7ad42d6e020000009d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347808890823 }, "created" : { "$date" : 1347808890823 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055eebed42d6e020000009e", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "\"Something\" implies a being. Normal explanation: It's old.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "something seemed to resist her efforts", "uuid" : "2DACB28D", "_id" : { "$oid" : "5055eebed42d6e020000009e" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[742]", "startOffset" : 215, "end" : "/div[1]/p[742]", "endOffset" : 253, "_id" : { "$oid" : "5055eebed42d6e020000009f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347808958816 }, "created" : { "$date" : 1347808958816 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055eedbd42d6e02000000a0", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "From gothic scenery at the beginning to this renewal.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I perceived that the fallen leaves had disappeared and that the young buds were shooting forth from the trees that shaded my window.", "uuid" : "DD46EAF4", "_id" : { "$oid" : "5055eedbd42d6e02000000a0" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 197, "end" : "/div[1]/p[22]", "endOffset" : 329, "_id" : { "$oid" : "5055eedbd42d6e02000000a1" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347808987362 }, "created" : { "$date" : 1347808987362 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055eeecd42d6e02000000a2", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "A divine renewal", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "divine spring", "uuid" : "E8C981B3", "_id" : { "$oid" : "5055eeecd42d6e02000000a2" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 339, "end" : "/div[1]/p[22]", "endOffset" : 352, "_id" : { "$oid" : "5055eeecd42d6e02000000a3" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347809004502 }, "created" : { "$date" : 1347809004502 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055ef04d42d6e02000000a4", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "is the gradual recovery of health and strength after illness.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "convalescence", "uuid" : "0C8291E7", "_id" : { "$oid" : "5055ef04d42d6e02000000a4" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 395, "end" : "/div[1]/p[22]", "endOffset" : 408, "_id" : { "$oid" : "5055ef04d42d6e02000000a5" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347809028312 }, "created" : { "$date" : 1347809028312 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055ef08d42d6e02000000a6", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "More description that adds to mood. Also, how could it be that loud if she only raised it a couple of inches.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "with alarming", "uuid" : "3604605E", "_id" : { "$oid" : "5055ef08d42d6e02000000a6" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[742]", "startOffset" : 405, "end" : "/div[1]/p[742]", "endOffset" : 419, "_id" : { "$oid" : "5055ef08d42d6e02000000a7" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347809032690 }, "created" : { "$date" : 1347809032690 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055ef18d42d6e02000000a8", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "His own decision.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "fatal passion", "uuid" : "222ACCBF", "_id" : { "$oid" : "5055ef18d42d6e02000000a8" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 569, "end" : "/div[1]/p[22]", "endOffset" : 582, "_id" : { "$oid" : "5055ef18d42d6e02000000a9" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347809048100 }, "created" : { "$date" : 1347809048100 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055ef7b1a807e020000007a", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "This prompts Victors journey back home.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "your father and cousin would be very happy if they received a letter from you in your own handwriting. They hardly know how ill you have been and are uneasy at your long silence.\"", "uuid" : "11CD6623", "_id" : { "$oid" : "5055ef7b1a807e020000007a" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[25]", "startOffset" : 219, "end" : "/div[1]/p[25]", "endOffset" : 398, "_id" : { "$oid" : "5055ef7b1a807e020000007b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347809147484 }, "created" : { "$date" : 1347809147484 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055ef9ed42d6e02000000aa", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Further support of traveling back home.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "\"If this is your present temper, my friend, you will perhaps be glad to see a letter that has been lying here some days for you; it is from your cousin, I believe.\"", "uuid" : "3F98BB66", "_id" : { "$oid" : "5055ef9ed42d6e02000000aa" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[27]", "startOffset" : 0, "end" : "/div[1]/p[27]", "endOffset" : 164, "_id" : { "$oid" : "5055ef9ed42d6e02000000ab" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347809182466 }, "created" : { "$date" : 1347809182466 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055efb31a807e020000007c", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "It would not really waste that much time: just look in. She might have the idea that all the events that Henry told her about would happen afterwards.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "waste a moment upon\n\na second attempt", "uuid" : "D0162403", "_id" : { "$oid" : "5055efb31a807e020000007c" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[742]", "startOffset" : 922, "end" : "/div[1]/p[742]", "endOffset" : 959, "_id" : { "$oid" : "5055efb31a807e020000007d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347809203636 }, "created" : { "$date" : 1347809203636 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055f043d42d6e02000000ac", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Rational explanation", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "weight makes it difficult to open", "uuid" : "76BF82DD", "_id" : { "$oid" : "5055f043d42d6e02000000ac" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[743]", "startOffset" : 656, "end" : "/div[1]/p[743]", "endOffset" : 689, "_id" : { "$oid" : "5055f043d42d6e02000000ad" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347809347595 }, "created" : { "$date" : 1347809347595 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055f09fd42d6e02000000ae", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Popular word for narrator to use.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "violently", "uuid" : "FB392364", "_id" : { "$oid" : "5055f09fd42d6e02000000ae" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[748]", "startOffset" : 140, "end" : "/div[1]/p[748]", "endOffset" : 149, "_id" : { "$oid" : "5055f09fd42d6e02000000af" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347809439191 }, "created" : { "$date" : 1347809439191 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055f0e91a807e020000007e", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "started with the chest in her room.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "felt\n\nfor the first time that she was really in an abbey", "uuid" : "9D6500D8", "_id" : { "$oid" : "5055f0e91a807e020000007e" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[748]", "startOffset" : 347, "end" : "/div[1]/p[748]", "endOffset" : 403, "_id" : { "$oid" : "5055f0e91a807e020000007f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347809513836 }, "created" : { "$date" : 1347809513836 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055f10a1a807e0200000080", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "recollection from novels. Not from experience.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "recollection", "uuid" : "901B22C1", "_id" : { "$oid" : "5055f10a1a807e0200000080" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[748]", "startOffset" : 465, "end" : "/div[1]/p[748]", "endOffset" : 477, "_id" : { "$oid" : "5055f10a1a807e0200000081" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347809546107 }, "created" : { "$date" : 1347809546107 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055f1a0d42d6e02000000b0", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "How long will that last?", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "wisely fortifying\n\nher mind", "uuid" : "E0DB40D7", "_id" : { "$oid" : "5055f1a0d42d6e02000000b0" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[748]", "startOffset" : 1050, "end" : "/div[1]/p[748]", "endOffset" : 1077, "_id" : { "$oid" : "5055f1a0d42d6e02000000b1" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347809696555 }, "created" : { "$date" : 1347809696555 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055f1c81a807e0200000082", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Again, violence.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "violence", "uuid" : "7B750B99", "_id" : { "$oid" : "5055f1c81a807e0200000082" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[749]", "startOffset" : 96, "end" : "/div[1]/p[749]", "endOffset" : 104, "_id" : { "$oid" : "5055f1c81a807e0200000083" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347809736820 }, "created" : { "$date" : 1347809736820 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055f220d42d6e02000000b2", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Because it is not of particular interest. Like the chest.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "never caught her notice before", "uuid" : "0F24CEC1", "_id" : { "$oid" : "5055f220d42d6e02000000b2" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[749]", "startOffset" : 1252, "end" : "/div[1]/p[749]", "endOffset" : 1282, "_id" : { "$oid" : "5055f220d42d6e02000000b3" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347809824000 }, "created" : { "$date" : 1347809824000 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055f27d1a807e0200000084", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "lack of rules", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "they don't seem to have\n\t\t\tany rules in particular; at least, if there are, nobody attends to them", "uuid" : "73CF5297", "_id" : { "$oid" : "5055f27d1a807e0200000084" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 10016, "end" : "/div[1]/div[3]", "endOffset" : 10114, "_id" : { "$oid" : "5055f27d1a807e0200000085" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347809917952 }, "created" : { "$date" : 1347809917952 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5055f35cd42d6e02000000b4" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347810140875 }, "groups" : [ "21L.448J" ], "id" : "5055f35cd42d6e02000000b4", "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "quote" : "The executioner's argument was, that you couldn't cut off a head unless there was a body\n\t\t\tto cut it off from: that he had never had to do such a thing before, and he wasn't going\n\t\t\tto begin at HIS time of life. \n\t\t\t\n\t\t\tThe King's argument was, that anything that had a head could be beheaded, and that you\n\t\t\tweren't to talk nonsense.", "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 13426, "end" : "/div[1]/div[3]", "endOffset" : 13764, "_id" : { "$oid" : "5055f35cd42d6e02000000b5" } } ], "tags" : [], "text" : "another logic conundrum", "updated" : { "$date" : 1347810158400 }, "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "user" : "mkel@mit.edu", "username" : "Michael K.", "uuid" : "D91E19F8" } -{ "id" : "5055f544d42d6e02000000b6", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Alice seeks rules in contrast to what children usually do", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`When I'M a Duchess,' she said to herself, (not in a very hopeful tone though), `I won't\n\t\t\thave any pepper in my kitchen AT ALL. Soup does very well without--Maybe it's always\n\t\t\tpepper that makes people hot-tempered,' she went on, very much pleased at having found out\n\t\t\ta new kind of rule", "uuid" : "A5FD651A", "_id" : { "$oid" : "5055f544d42d6e02000000b6" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 417, "end" : "/div[1]/div[4]", "endOffset" : 709, "_id" : { "$oid" : "5055f544d42d6e02000000b7" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347810628599 }, "created" : { "$date" : 1347810628599 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055f567d42d6e02000000b8", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "text" : "power coming from physical size", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "she had grown so large in the last few\n\t\t\tminutes that she wasn't a bit afraid of interrupting him,", "uuid" : "E0F195B5", "_id" : { "$oid" : "5055f567d42d6e02000000b8" }, "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 6352, "end" : "/div[1]/div[6]", "endOffset" : 6451, "_id" : { "$oid" : "5055f567d42d6e02000000b9" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347810663898 }, "created" : { "$date" : 1347810663898 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055f5fb1a807e0200000086", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "nonsense", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`Very true,' said the Duchess: `flamingoes and mustard both bite. And the moral of that\n\t\t\tis--\"Birds of a feather flock together.\"'", "uuid" : "38E6E8F1", "_id" : { "$oid" : "5055f5fb1a807e0200000086" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 2785, "end" : "/div[1]/div[4]", "endOffset" : 2918, "_id" : { "$oid" : "5055f5fb1a807e0200000087" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347810811716 }, "created" : { "$date" : 1347810811716 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5055f6a8d42d6e02000000ba", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Trying to figure out the logic structure of this sentence hurts your head", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "\"Never imagine yourself\n\t\t\tnot to be otherwise than what it might appear to others that what you were or might have\n\t\t\tbeen was not otherwise than what you had been would have appeared to them to be\n\t\t\totherwise.\"'", "uuid" : "AFEB75DC", "_id" : { "$oid" : "5055f6a8d42d6e02000000ba" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 3635, "end" : "/div[1]/div[4]", "endOffset" : 3850, "_id" : { "$oid" : "5055f6a8d42d6e02000000bb" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347810984008 }, "created" : { "$date" : 1347810984008 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505603b2d42d6e02000000bc", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Interesting how no other mention of this sudden rain is made.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "sudden scud of rain", "uuid" : "0221CA35", "_id" : { "$oid" : "505603b2d42d6e02000000bc" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[736]", "startOffset" : 481, "end" : "/div[1]/p[736]", "endOffset" : 500, "_id" : { "$oid" : "505603b2d42d6e02000000bd" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347814343401 }, "created" : { "$date" : 1347814322309 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50560724d42d6e02000000be", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "This made me laugh, a very convenient way to introduce Henry", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I knew not why", "uuid" : "B2971C5B", "_id" : { "$oid" : "50560724d42d6e02000000be" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "notes" ], "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 132, "end" : "/div[1]/p[10]", "endOffset" : 146, "_id" : { "$oid" : "50560724d42d6e02000000bf" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347815204689 }, "created" : { "$date" : 1347815204689 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505607551a807e0200000088", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "How fortunate indeed :)", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "How fortunate that you should be here at the very moment of my alighting!", "uuid" : "9B1F31D6", "_id" : { "$oid" : "505607551a807e0200000088" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "notes" ], "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 530, "end" : "/div[1]/p[10]", "endOffset" : 603, "_id" : { "$oid" : "505607551a807e0200000089" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347815253881 }, "created" : { "$date" : 1347815253881 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505607c6d42d6e02000000c0", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Very strong description of feeling for being reunited with an old friend, maybe compounded by the fact that he just went through a traumatizing experience", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Nothing could equal my delight on seeing Clerval", "uuid" : "B204FEED", "_id" : { "$oid" : "505607c6d42d6e02000000c0" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "feelings" ], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 0, "end" : "/div[1]/p[11]", "endOffset" : 48, "_id" : { "$oid" : "505607c6d42d6e02000000c1" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347815366431 }, "created" : { "$date" : 1347815366431 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50560ac9d42d6e02000000c2", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Interesting how all that happened to him the night before with the creature just leaves his mind", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "in a moment forgot my horror and misfortune", "uuid" : "D92B8988", "_id" : { "$oid" : "50560ac9d42d6e02000000c2" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "notes", "feelings" ], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 194, "end" : "/div[1]/p[11]", "endOffset" : 237, "_id" : { "$oid" : "50560ac9d42d6e02000000c3" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347816137832 }, "created" : { "$date" : 1347816137832 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50560b061a807e020000008a", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Interesting how she gives \"joy\" adjectives of its own", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "calm and serene joy", "uuid" : "C2782E95", "_id" : { "$oid" : "50560b061a807e020000008a" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "notes", "writing" ], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 299, "end" : "/div[1]/p[11]", "endOffset" : 318, "_id" : { "$oid" : "50560b061a807e020000008b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347816198437 }, "created" : { "$date" : 1347816198437 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50560b4bd42d6e02000000c4", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Henry is staying in the town now, too. What a coincidence", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "his own good fortune in being permitted to come to Ingolstadt", "uuid" : "941FC4AE", "_id" : { "$oid" : "50560b4bd42d6e02000000c4" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "notes" ], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 484, "end" : "/div[1]/p[11]", "endOffset" : 545, "_id" : { "$oid" : "50560b4bd42d6e02000000c5" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347816267525 }, "created" : { "$date" : 1347816267525 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50560b6a1a807e020000008c", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Education versus employment debate", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "how great was the difficulty to persuade my father that all necessary knowledge was not comprised in the noble art of book-keeping; and, indeed, I believe I left him incredulous to the last, for his constant answer to my unwearied entreaties was the same as that of the Dutch schoolmaster in The Vicar of Wakefield: 'I have ten thousand florins a year without Greek, I eat heartily without Greek.' But his affection for me at length overcame his dislike of learning, and he has permitted me to undertake a voyage of discovery to the land of knowledge.", "uuid" : "B0B19963", "_id" : { "$oid" : "50560b6a1a807e020000008c" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "notes", "reference" ], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 583, "end" : "/div[1]/p[11]", "endOffset" : 1134, "_id" : { "$oid" : "50560b6a1a807e020000008d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347816298605 }, "created" : { "$date" : 1347816298605 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50560baa1a807e020000008e", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Family is worried about Victor's condition, lack of communication=unhealthy", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "a little uneasy that they hear from you so seldom", "uuid" : "B69BC267", "_id" : { "$oid" : "50560baa1a807e020000008e" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "notes", "family" ], "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 33, "end" : "/div[1]/p[13]", "endOffset" : 82, "_id" : { "$oid" : "50560baa1a807e020000008f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347816362834 }, "created" : { "$date" : 1347816362834 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "50560c35d42d6e02000000c6" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347816501360 }, "groups" : [ "21L.000J" ], "id" : "50560c35d42d6e02000000c6", "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "quote" : "I am at length free", "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 224, "end" : "/div[1]/p[14]", "endOffset" : 243, "_id" : { "$oid" : "50560c35d42d6e02000000c7" } } ], "tags" : [ "notes", "creation" ], "text" : "Refers to the end of his toils as freedom. He has been anticipating the results for two years but now just wants to be free of his creation", "updated" : { "$date" : 1347816510018 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "uuid" : "9BA82862" } -{ "id" : "50560c581a807e0200000090", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Uses this and shivered later", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "trembled", "uuid" : "5FA35715", "_id" : { "$oid" : "50560c581a807e0200000090" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "vocabulary" ], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 2, "end" : "/div[1]/p[15]", "endOffset" : 10, "_id" : { "$oid" : "50560c581a807e0200000091" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347816536263 }, "created" : { "$date" : 1347816536263 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50560c741a807e0200000092", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Conveys the image of Victor as a nervous wreck", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "shiver", "uuid" : "29483B99", "_id" : { "$oid" : "50560c741a807e0200000092" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "vocabulary" ], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 228, "end" : "/div[1]/p[15]", "endOffset" : 234, "_id" : { "$oid" : "50560c741a807e0200000093" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347816564489 }, "created" : { "$date" : 1347816564489 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "505618991a807e0200000094" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347819673940 }, "groups" : [ "21L.448J" ], "id" : "505618991a807e0200000094", "permissions" : { "admin" : [ "mkel@mit.edu" ], "delete" : [ "mkel@mit.edu" ], "read" : [], "update" : [ "mkel@mit.edu" ] }, "quote" : "the King say in a low voice, to the company\n\t\t\tgenerally, `You are all pardoned.'", "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 6685, "end" : "/div[1]/div[4]", "endOffset" : 6766, "_id" : { "$oid" : "505618991a807e0200000095" } } ], "tags" : [], "text" : "Instead of confronting the guillotine-happy Queen and revoking her abused authority, the King finds a way to keep her from spreading harm, while still following the law.", "updated" : { "$date" : 1347829640300 }, "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "user" : "mkel@mit.edu", "username" : "Michael K.", "uuid" : "47B68704" } -{ "id" : "50563455d42d6e02000000c8", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "nonsense: the Hatter was a witness even though he knew nothing about the subject", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`You may go,'", "uuid" : "EC505800", "_id" : { "$oid" : "50563455d42d6e02000000c8" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 9170, "end" : "/div[1]/div[5]", "endOffset" : 9183, "_id" : { "$oid" : "50563455d42d6e02000000c9" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347826773809 }, "created" : { "$date" : 1347826773809 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505638b565c4d70200000002", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "made up rule", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "Rule Forty-two. ALL PERSONS MORE THAN\n\t\t\tA MILE HIGH TO LEAVE THE COURT", "uuid" : "CCA6BE62", "_id" : { "$oid" : "505638b565c4d70200000002" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 2819, "end" : "/div[1]/div[6]", "endOffset" : 2890, "_id" : { "$oid" : "505638b565c4d70200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347827893809 }, "created" : { "$date" : 1347827893809 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056395365c4d70200000004", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Like he's talking to a machine", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "Begin at the beginning,' the King said gravely, `and go on till you come to the end: then\n\t\t\tstop.", "uuid" : "1276DDC2", "_id" : { "$oid" : "5056395365c4d70200000004" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 5200, "end" : "/div[1]/div[6]", "endOffset" : 5298, "_id" : { "$oid" : "5056395365c4d70200000005" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347828051128 }, "created" : { "$date" : 1347828051128 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50563ea21a807e0200000096", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Carroll expresses his admiration of a child's mind and his opinion that it is often overly suppressed by rules. He thinks it is nice to be able to escape the world of rules every once in a while.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "Lastly, she pictured to herself how this same little sister of hers would, in the\n\t\t\tafter-time, be herself a grown woman; and how she would keep, through all her riper years,\n\t\t\tthe simple and loving heart of her childhood: and how she would gather about her other\n\t\t\tlittle children, and make THEIR eyes bright and eager with many a strange tale, perhaps\n\t\t\teven with the dream of Wonderland of long ago: and how she would feel with all their\n\t\t\tsimple sorrows, and find a pleasure in all their simple joys, remembering her own\n\t\t\tchild-life, and the happy summer days.", "uuid" : "F867780E", "_id" : { "$oid" : "50563ea21a807e0200000096" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 11827, "end" : "/div[1]/div[6]", "endOffset" : 12399, "_id" : { "$oid" : "50563ea21a807e0200000097" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347829410710 }, "created" : { "$date" : 1347829410710 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056402365c4d70200000006", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Carroll makes the point that with one's imagination one can escape not only the rules of society, but also the rules of nature, which at times seem so constraining.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "So she sat on, with closed eyes, and half believed herself in Wonderland, though she knew\n\t\t\tshe had but to open them again, and all would change to dull reality--the grass would be\n\t\t\tonly rustling in the wind, and the pool rippling to the waving of the reeds--the rattling\n\t\t\tteacups would change to tinkling sheep- bells, and the Queen's shrill cries to the voice\n\t\t\tof the shepherd boy--and the sneeze of the baby, the shriek of the Gryphon, and all thy\n\t\t\tother queer noises, would change (she knew) to the confused clamour of the busy\n\t\t\tfarm-yard--while the lowing of the cattle in the distance would take the place of the Mock\n\t\t\tTurtle's heavy sobs.", "uuid" : "3CAEE15E", "_id" : { "$oid" : "5056402365c4d70200000006" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 11160, "end" : "/div[1]/div[6]", "endOffset" : 11819, "_id" : { "$oid" : "5056402365c4d70200000007" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347829795636 }, "created" : { "$date" : 1347829795636 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5056409b1a807e0200000098" }, "id" : "5056409b1a807e0200000098", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Another instance of her imagination run wild. This stems from her reading books and assuming real life is the same.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Catherine attempted no longer to hide from herself the nature of the\n\nfeelings which, in spite of all his attentions, he had previously\n\nexcited; and what had been terror and dislike before, was now absolute\n\naversion. Yes, aversion! His cruelty to such a charming woman made him\n\nodious to her. She had often read of such characters, characters which\n\nMr. Allen had been used to call unnatural and overdrawn; but here was\n\nproof positive of the contrary.", "uuid" : "78EAF6C4", "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[791]", "startOffset" : 2, "end" : "/div[1]/p[791]", "endOffset" : 459, "_id" : { "$oid" : "5056409b1a807e0200000099" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347829915586 }, "created" : { "$date" : 1347829915586 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5056419c1a807e020000009a" }, "__v" : 1, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347830172162 }, "groups" : [ "21L.003" ], "id" : "5056419c1a807e020000009a", "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "quote" : "\"If I understand you rightly, you had formed a surmise of such horror as\n\nI have hardly words to—Dear Miss Morland, consider the dreadful nature\n\nof the suspicions you have entertained. What have you been judging from?\n\nRemember the country and the age in which we live. Remember that we are\n\nEnglish, that we are Christians. Consult your own understanding, your\n\nown sense of the probable, your own observation of what is passing\n\naround you. Does our education prepare us for such atrocities? Do our\n\nlaws connive at them? Could they be perpetrated without being known, in\n\na country like this, where social and literary intercourse is on such a\n\nfooting, where every man is surrounded by a neighbourhood of voluntary\n\nspies, and where roads and newspapers lay everything open? Dearest Miss\n\nMorland, what ideas have you been admitting?\"", "ranges" : [ { "start" : "/div[1]/p[840]", "startOffset" : 2, "end" : "/div[1]/p[840]", "endOffset" : 843, "_id" : { "$oid" : "505a698b04ebe2020000001e" } } ], "tags" : [], "text" : "Henry corrects her as he learns of her theory. He tells her that they are english chritisians and they do not behave as they might in fictional stories. Ironic because the general will later throw out Catherine all because he thinks she is poor. Not very christian like and I am sure the general is educated. Also interesting to note is that he says to remember that we are English. So, if they were say French then it would be possible for them to have committed these atrocities?", "updated" : { "$date" : 1348103393750 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "slonaker@mit.edu", "username" : "James S.", "uuid" : "C8907E36" } -{ "_id" : { "$oid" : "505642901a807e020000009c" }, "id" : "505642901a807e020000009c", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "She starts the novel off the bat parodying other novels about the heroine being beautiful, smart, and perfect, while instead the heroine of this story is a plain old girl that no one would have expected to be a hero.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "No one who had ever seen Catherine Morland in her infancy would have\n\nsupposed her born to be an heroine.", "uuid" : "83A5E46E", "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 2, "end" : "/div[1]/p[2]", "endOffset" : 107, "_id" : { "$oid" : "505642901a807e020000009d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347830416266 }, "created" : { "$date" : 1347830416266 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 2, "_id" : { "$oid" : "5056458a65c4d70200000009" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347831178253 }, "groups" : [ "21L.003" ], "id" : "5056458a65c4d70200000009", "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "quote" : "as new, or better", "ranges" : [ { "start" : "/div[1]/p[161]", "startOffset" : 139, "end" : "/div[1]/p[161]", "endOffset" : 156, "_id" : { "$oid" : "5056458a65c4d7020000000a" } } ], "tags" : [ "Carriage", "Pride", "Ego" ], "text" : "or better? this guy is surely boasting (although I guess this was already obvious). The carriage is obviously a thing of great pride for him. I wonder if it is such for the rest of the people in the novel...", "updated" : { "$date" : 1347831238505 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "wrutter@mit.edu", "username" : "William R.", "uuid" : "869E0C65" } -{ "id" : "505646a565c4d7020000000b", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "This carriage trip witnessed one of the most extensive introspection of Catherine.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "her grief and agitation\n\nwere excessive", "uuid" : "65D36551", "_id" : { "$oid" : "505646a565c4d7020000000b" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[961]", "startOffset" : 979, "end" : "/div[1]/p[961]", "endOffset" : 1018, "_id" : { "$oid" : "505646a565c4d7020000000c" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347831461646 }, "created" : { "$date" : 1347831461646 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056478a1a807e020000009f", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "He is trying so hard to impress her/give the impression of being impressive. His ego must be gigantic...", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "You will not be frightened, Miss Morland,\" said Thorpe, as he handed\n\nher in, \"if my horse should dance about a little at first setting off.", "uuid" : "0FD18754", "_id" : { "$oid" : "5056478a1a807e020000009f" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [ "ego", "horse", "Thorpe" ], "ranges" : [ { "start" : "/div[1]/p[249]", "startOffset" : 3, "end" : "/div[1]/p[249]", "endOffset" : 143, "_id" : { "$oid" : "5056478a1a807e02000000a0" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347831690714 }, "created" : { "$date" : 1347831690714 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "50564b2a65c4d7020000000d" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347832618039 }, "groups" : [ "21L.003" ], "id" : "50564b2a65c4d7020000000d", "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "quote" : "Thorpe's ideas then all reverted to the merits of his own equipage", "ranges" : [ { "start" : "/div[1]/p[267]", "startOffset" : 2, "end" : "/div[1]/p[267]", "endOffset" : 68, "_id" : { "$oid" : "50564b2a65c4d7020000000e" } } ], "tags" : [ "Thorpe", "carriage", "ego" ], "text" : "All he can talk about is himself, or try and tell her she's wrong. Not a terribly effective courtship tactic methinks", "updated" : { "$date" : 1347832690978 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "wrutter@mit.edu", "username" : "William R.", "uuid" : "ECEFE460" } -{ "id" : "50564d441a807e02000000a1", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "The control of being the driver", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Thorpe only lashed his horse into a brisker trot; the Tilneys", "uuid" : "C08BBFC6", "_id" : { "$oid" : "50564d441a807e02000000a1" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [ "control", "carriage" ], "ranges" : [ { "start" : "/div[1]/p[407]", "startOffset" : 430, "end" : "/div[1]/p[407]", "endOffset" : 491, "_id" : { "$oid" : "50564d441a807e02000000a2" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347833156992 }, "created" : { "$date" : 1347833156992 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50564dfc1a807e02000000a3", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Yikes.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "having\n\nno power of getting away", "uuid" : "3ED550E5", "_id" : { "$oid" : "50564dfc1a807e02000000a3" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [ "control", "carriage" ], "ranges" : [ { "start" : "/div[1]/p[407]", "startOffset" : 993, "end" : "/div[1]/p[407]", "endOffset" : 1025, "_id" : { "$oid" : "50564dfc1a807e02000000a4" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347833340105 }, "created" : { "$date" : 1347833340105 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50564e7b1a807e02000000a5" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347833467401 }, "groups" : [ "21L.003" ], "id" : "50564e7b1a807e02000000a5", "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "quote" : "No, certainly not; and I am glad you do not think of it. These schemes\n\nare not at all the thing. Young men and women driving about the country\n\nin open carriages! Now and then it is very well; but going to inns and\n\npublic places together! It is not right; and I wonder Mrs. Thorpe should\n\nallow it. I am glad you do not think of going; I am sure Mrs. Morland\n\nwould not be pleased. Mrs. Allen, are not you of my way of thinking? Do\n\nnot you think these kind of projects objectionable?\"\n\n\n\n\n\n\"Yes, very much so indeed. Open carriages are nasty things. A clean\n\ngown is not five minutes' wear in them. You are splashed getting in\n\nand getting out; and the wind takes your hair and your bonnet in every\n\ndirection. I hate an open carriage myself.\"", "ranges" : [ { "start" : "/div[1]/p[473]", "startOffset" : 3, "end" : "/div[1]/p[474]", "endOffset" : 255, "_id" : { "$oid" : "50564e7b1a807e02000000a6" } } ], "tags" : [], "text" : "Mr. Allen--worried about the propriety of men and women together in open carriages, Mrs. Allen--worried about her clothes. Interesting distinction.", "updated" : { "$date" : 1347833510440 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "wrutter@mit.edu", "username" : "William R.", "uuid" : "F9F8F558" } -{ "id" : "505650431a807e02000000a7", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Mr. Thorpe had to tell her, Mr. Tilney need not do anything ", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "A very short trial\n\nconvinced her that a curricle was the prettiest equipage in the world;\n\nthe chaise and four wheeled off with some grandeur, to be sure, but it\n\nwas a heavy and troublesome business, and she could not easily forget\n\nits having stopped two hours at Petty France", "uuid" : "441B7868", "_id" : { "$oid" : "505650431a807e02000000a7" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [ "Carriage", "Tilney" ], "ranges" : [ { "start" : "/div[1]/p[716]", "startOffset" : 409, "end" : "/div[1]/p[716]", "endOffset" : 688, "_id" : { "$oid" : "505650431a807e02000000a8" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347833923635 }, "created" : { "$date" : 1347833923635 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505656411a807e02000000a9", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "When traveling is concerned, Catherine seems to rarely be in control... In this instance General Tilney is.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "not even the hour is left to your choice;\n\nthe very carriage is ordered", "uuid" : "62E561DA", "_id" : { "$oid" : "505656411a807e02000000a9" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[947]", "startOffset" : 237, "end" : "/div[1]/p[947]", "endOffset" : 308, "_id" : { "$oid" : "505656411a807e02000000aa" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347835457312 }, "created" : { "$date" : 1347835457312 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056676b65c4d7020000000f", "user" : "mata@mit.edu", "username" : "Matthew A.", "text" : "First mention of a window. Observed Miss Thorpe walking. Shows how fashion and grace make Catherine appreciate Isabella", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Catherine then ran directly upstairs, and watched Miss Thorpe's\n\nprogress down the street from the drawing-room window; admired the\n\ngraceful spirit of her walk, the fashionable air of her figure and\n\ndress; and felt grateful, as well she might, for the chance which had\n\nprocured her such a friend.", "uuid" : "FB0EF859", "_id" : { "$oid" : "5056676b65c4d7020000000f" }, "permissions" : { "delete" : [ "mata@mit.edu" ], "update" : [ "mata@mit.edu" ], "admin" : [ "mata@mit.edu" ], "read" : [ "mata@mit.edu" ] }, "tags" : [ "window", "observation", "wealth" ], "ranges" : [ { "start" : "/div[1]/p[98]", "startOffset" : 1569, "end" : "/div[1]/p[98]", "endOffset" : 1870, "_id" : { "$oid" : "5056676b65c4d70200000010" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347839851248 }, "created" : { "$date" : 1347839851248 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5056688465c4d70200000013" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347840132701 }, "groups" : [ "21L.003" ], "id" : "5056688465c4d70200000013", "permissions" : { "delete" : [ "mata@mit.edu" ], "update" : [ "mata@mit.edu" ], "admin" : [ "mata@mit.edu" ], "read" : [ "mata@mit.edu" ] }, "quote" : "The windows, to which\n\nshe looked with peculiar dependence, from having heard the general talk\n\nof his preserving them in their Gothic form with reverential care, were\n\nyet less what her fancy had portrayed.", "ranges" : [ { "start" : "/div[1]/p[737]", "startOffset" : 483, "end" : "/div[1]/p[737]", "endOffset" : 690, "_id" : { "$oid" : "5057ef4cd265cb020000002e" } } ], "tags" : [ "window", "wealth" ], "text" : "Windows are not even gothic", "updated" : { "$date" : 1347940172822 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "mata@mit.edu", "username" : "Matthew A.", "uuid" : "E539929D" } -{ "id" : "505669fa1a807e02000000ab", "user" : "mata@mit.edu", "username" : "Matthew A.", "text" : "Are the windows in the basement where she believes that Mrs. Tilney is located?", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "if judiciously watched, some rays of light from the general's\n\nlamp might glimmer through the lower windows", "uuid" : "A8B0AD2E", "_id" : { "$oid" : "505669fa1a807e02000000ab" }, "permissions" : { "delete" : [ "mata@mit.edu" ], "update" : [ "mata@mit.edu" ], "admin" : [ "mata@mit.edu" ], "read" : [ "mata@mit.edu" ] }, "tags" : [ "windows", "observation" ], "ranges" : [ { "start" : "/div[1]/p[811]", "startOffset" : 160, "end" : "/div[1]/p[811]", "endOffset" : 267, "_id" : { "$oid" : "505669fa1a807e02000000ac" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347840506095 }, "created" : { "$date" : 1347840506095 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50566c8e1a807e02000000ad", "user" : "mata@mit.edu", "username" : "Matthew A.", "text" : "Catherine not really concerned with the costliness of the furniture", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Catherine had to say, for her indiscriminating eye scarcely discerned\n\nthe colour of the satin; and all minuteness of praise, all praise\n\nthat had much meaning, was supplied by the general: the costliness or\n\nelegance of any room's fitting-up could be nothing to her; she cared for\n\nno furniture of a more modern date than the fifteenth century.", "uuid" : "10FA2B38", "_id" : { "$oid" : "50566c8e1a807e02000000ad" }, "permissions" : { "delete" : [ "mata@mit.edu" ], "update" : [ "mata@mit.edu" ], "admin" : [ "mata@mit.edu" ], "read" : [ "mata@mit.edu" ] }, "tags" : [ "furniture", "wealth" ], "ranges" : [ { "start" : "/div[1]/p[794]", "startOffset" : 417, "end" : "/div[1]/p[794]", "endOffset" : 762, "_id" : { "$oid" : "50566c8e1a807e02000000ae" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347841166940 }, "created" : { "$date" : 1347841166940 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50566e3965c4d70200000015", "user" : "mata@mit.edu", "username" : "Matthew A.", "text" : "Henry's story is heavily focused on furniture. Gothic stories use objects to invoke fear", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "your own\n\napartment. In repassing through the small vaulted room, however, your\n\neyes will be attracted towards a large, old-fashioned cabinet of ebony\n\nand gold, which, though narrowly examining the furniture before, you\n\nhad passed unnoticed. Impelled by an irresistible presentiment, you will\n\neagerly advance to it,", "uuid" : "E4B6895D", "_id" : { "$oid" : "50566e3965c4d70200000015" }, "permissions" : { "delete" : [ "mata@mit.edu" ], "update" : [ "mata@mit.edu" ], "admin" : [ "mata@mit.edu" ], "read" : [ "mata@mit.edu" ] }, "tags" : [ "furniture", "gothic" ], "ranges" : [ { "start" : "/div[1]/p[732]", "startOffset" : 635, "end" : "/div[1]/p[732]", "endOffset" : 955, "_id" : { "$oid" : "50566e3965c4d70200000016" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347841593503 }, "created" : { "$date" : 1347841593503 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505679151a807e02000000af", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "perfect \"scary\" setting", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "dreary night of November", "uuid" : "00BF30C7", "_id" : { "$oid" : "505679151a807e02000000af" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 11, "end" : "/div[1]/p[1]", "endOffset" : 37, "_id" : { "$oid" : "505679151a807e02000000b0" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347844373184 }, "created" : { "$date" : 1347844373184 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505679331a807e02000000b1", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "literally, they did create the monster after all", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "instruments of life", "uuid" : "75AA9AB7", "_id" : { "$oid" : "505679331a807e02000000b1" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 145, "end" : "/div[1]/p[1]", "endOffset" : 165, "_id" : { "$oid" : "505679331a807e02000000b2" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347844403351 }, "created" : { "$date" : 1347844403351 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056795a1a807e02000000b3", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "right off the bat, the author already puts the thought that the monster is more of an animal than a human", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "dull yellow eye of the creature open; it breathed hard, and a convulsive motion agitated its limbs.", "uuid" : "ECB77330", "_id" : { "$oid" : "5056795a1a807e02000000b3" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 439, "end" : "/div[1]/p[1]", "endOffset" : 538, "_id" : { "$oid" : "5056795a1a807e02000000b4" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347844442442 }, "created" : { "$date" : 1347844442442 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056798d65c4d70200000017", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "disgusted not by the monsters sight, but by the lack of perfection after spending so many years of hard work and it not turning out the way he had intended it to", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "selected his features as beautiful. Beautiful! Great God! His yellow skin scarcely covered the work of muscles and arteries beneath; his hair was of a lustrous black, and flowing; his teeth of a pearly whiteness; but these luxuriances only formed a more horrid contrast with his watery eyes, that seemed almost of the same colour as the dun-white sockets in which they were set, his shrivelled complexion and straight black lips.", "uuid" : "D8D393E7", "_id" : { "$oid" : "5056798d65c4d70200000017" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 186, "end" : "/div[1]/p[2]", "endOffset" : 615, "_id" : { "$oid" : "5056798d65c4d70200000018" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347844493790 }, "created" : { "$date" : 1347844493790 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505679c165c4d70200000019", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "sleepy because of failure.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Unable to endure the aspect of the being I had created, I rushed out of the room and continued a long time traversing my bed-chamber, unable to compose my mind to sleep.", "uuid" : "22B034D8", "_id" : { "$oid" : "505679c165c4d70200000019" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 415, "end" : "/div[1]/p[3]", "endOffset" : 585, "_id" : { "$oid" : "505679c165c4d7020000001a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347844545480 }, "created" : { "$date" : 1347844545480 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50567a851a807e02000000b5", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "dreamt about his mother/elizabeth because he essentially \"birthed\" frankenstein with no help from a mother figure. he needed the dream to fill the gap from lack of female figure in its creation.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "wildest dreams", "uuid" : "D74E9900", "_id" : { "$oid" : "50567a851a807e02000000b5" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 814, "end" : "/div[1]/p[3]", "endOffset" : 828, "_id" : { "$oid" : "50567a851a807e02000000b6" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347844741571 }, "created" : { "$date" : 1347844741571 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50567ac265c4d7020000001b", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "already stopped calling it a creature and instead a wretch", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "wretch", "uuid" : "E1744EE2", "_id" : { "$oid" : "50567ac265c4d7020000001b" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 72, "end" : "/div[1]/p[2]", "endOffset" : 79, "_id" : { "$oid" : "50567ac265c4d7020000001c" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347844802366 }, "created" : { "$date" : 1347844802366 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50567b2265c4d7020000001d", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "allusion to Dante's Inferno (hell) . worse than anything dante could have imagined, and he imagined some strange things..", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "became a thing such as even Dante could not have conceived.", "uuid" : "0E65D054", "_id" : { "$oid" : "50567b2265c4d7020000001d" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 261, "end" : "/div[1]/p[4]", "endOffset" : 320, "_id" : { "$oid" : "50567b2265c4d7020000001e" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347844898869 }, "created" : { "$date" : 1347844898869 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50567b4e65c4d7020000001f", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "possible connection to wretch?\nsee's himself like the creature now?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "wretchedly", "uuid" : "CE062AF3", "_id" : { "$oid" : "50567b4e65c4d7020000001f" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 19, "end" : "/div[1]/p[5]", "endOffset" : 29, "_id" : { "$oid" : "50567b4e65c4d70200000020" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347844942422 }, "created" : { "$date" : 1347844942422 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50567b6865c4d70200000021", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "very fitting (depressing) setting", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "although drenched by the rain which poured from a black and comfortless sky.", "uuid" : "AFED5290", "_id" : { "$oid" : "50567b6865c4d70200000021" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 508, "end" : "/div[1]/p[6]", "endOffset" : 584, "_id" : { "$oid" : "50567b6865c4d70200000022" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347844968533 }, "created" : { "$date" : 1347844968533 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50567c121a807e02000000b9", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "from \"ancient mariner\".\nin the \"ancient Mariner\" the mariner is lost and struggling, just like Victor. Victor because he has created a monster that does not belong in the world and the mariner because he is lost at sea.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Like one who, on a lonely road, Doth walk in fear and dread, And, having once turned round, walks on, And turns no more his head; Because he knows a frightful fiend Doth close behind him tread.", "uuid" : "0E65484D", "_id" : { "$oid" : "50567c121a807e02000000b9" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[8]", "startOffset" : 0, "end" : "/div[1]/p[8]", "endOffset" : 193, "_id" : { "$oid" : "50567c121a807e02000000ba" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347845138809 }, "created" : { "$date" : 1347845138809 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50567c571a807e02000000bb", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "back to a time before his life was filled with disappointment ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "his presence brought back to my thoughts my father, Elizabeth, and all those scenes of home so dear to my recollection.", "uuid" : "1852012C", "_id" : { "$oid" : "50567c571a807e02000000bb" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 50, "end" : "/div[1]/p[11]", "endOffset" : 169, "_id" : { "$oid" : "50567c571a807e02000000bc" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347845207710 }, "created" : { "$date" : 1347845207710 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50567c7365c4d70200000023", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "interesting change of pace, bookkeeper to scientist? ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "how great was the difficulty to persuade my father that all necessary knowledge was not comprised in the noble art of book-keeping", "uuid" : "7B2138C9", "_id" : { "$oid" : "50567c7365c4d70200000023" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 583, "end" : "/div[1]/p[11]", "endOffset" : 713, "_id" : { "$oid" : "50567c7365c4d70200000024" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347845235538 }, "created" : { "$date" : 1347845235538 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50567c961a807e02000000bd", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "what?\ni understand it's an allusion, but what in the world is it talking about?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "'I have ten thousand florins a year without Greek, I eat heartily without Greek.", "uuid" : "BBA97A51", "_id" : { "$oid" : "50567c961a807e02000000bd" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 899, "end" : "/div[1]/p[11]", "endOffset" : 979, "_id" : { "$oid" : "50567c961a807e02000000be" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347845270556 }, "created" : { "$date" : 1347845270556 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50567d1e1a807e02000000bf", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "Frankenstein reacts negatively to his creation", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "catastrophe", "uuid" : "261F38FA", "_id" : { "$oid" : "50567d1e1a807e02000000bf" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 39, "end" : "/div[1]/p[2]", "endOffset" : 50, "_id" : { "$oid" : "50567d1e1a807e02000000c0" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347845406675 }, "created" : { "$date" : 1347845406675 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50567d5165c4d70200000025", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "Intended to be beautiful--created in Frankenstein's (God's..?) image", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "His limbs were in proportion, and I had selected his features as beautiful", "uuid" : "8001B51A", "_id" : { "$oid" : "50567d5165c4d70200000025" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 146, "end" : "/div[1]/p[2]", "endOffset" : 220, "_id" : { "$oid" : "50567d5165c4d70200000026" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347845457558 }, "created" : { "$date" : 1347845457558 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50567f371a807e02000000c1", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "free from what? the monster?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I sincerely hope, that all these employments are now at an end and that I am at length free.\"", "uuid" : "E018C277", "_id" : { "$oid" : "50567f371a807e02000000c1" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 152, "end" : "/div[1]/p[14]", "endOffset" : 245, "_id" : { "$oid" : "50567f371a807e02000000c2" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347845943989 }, "created" : { "$date" : 1347845943989 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50567f5165c4d70200000029", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "I feel like he shouldn't be that excited to be away from something he created..", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I clapped my hands for joy and ran down to Clerval.", "uuid" : "891EAB15", "_id" : { "$oid" : "50567f5165c4d70200000029" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 1052, "end" : "/div[1]/p[15]", "endOffset" : 1103, "_id" : { "$oid" : "50567f5165c4d7020000002a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347845969916 }, "created" : { "$date" : 1347845969915 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50567f6d65c4d7020000002b", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "what in the world is wrong with him? i am thoroughly confused.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "\"Do not ask me,\" cried I, putting my hands before my eyes, for I thought I saw the dreaded spectre glide into the room; \"HE can tell. Oh, save me! Save me!\" I imagined that the monster seized me; I struggled furiously and fell down in a fit.", "uuid" : "54CAA8FC", "_id" : { "$oid" : "50567f6d65c4d7020000002b" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 0, "end" : "/div[1]/p[18]", "endOffset" : 241, "_id" : { "$oid" : "50567f6d65c4d7020000002c" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347845997713 }, "created" : { "$date" : 1347845997713 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50567f831a807e02000000c3", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "can failure actually make you that sick?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "But I was in reality very ill,", "uuid" : "362BA170", "_id" : { "$oid" : "50567f831a807e02000000c3" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 0, "end" : "/div[1]/p[21]", "endOffset" : 30, "_id" : { "$oid" : "50567f831a807e02000000c4" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347846019203 }, "created" : { "$date" : 1347846019203 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50567f9d1a807e02000000c5", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "i personally think the sickness is all in his mind", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "disorder indeed owed its origin to some uncommon and terrible event.", "uuid" : "6210A8CC", "_id" : { "$oid" : "50567f9d1a807e02000000c5" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 473, "end" : "/div[1]/p[21]", "endOffset" : 541, "_id" : { "$oid" : "50567f9d1a807e02000000c6" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347846045739 }, "created" : { "$date" : 1347846045739 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056819f65c4d7020000002d", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "he focuses on the eyes of the creature a lot, possibly because eyes tend to denote intelligence in creatures", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "watery eyes, that seemed almost of the same colour as the dun-white sockets in which they were set", "uuid" : "46F15B46", "_id" : { "$oid" : "5056819f65c4d7020000002d" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 465, "end" : "/div[1]/p[2]", "endOffset" : 563, "_id" : { "$oid" : "5056819f65c4d7020000002e" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347846559819 }, "created" : { "$date" : 1347846559819 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056827a65c4d7020000002f", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "dreary", "uuid" : "49406974", "_id" : { "$oid" : "5056827a65c4d7020000002f" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 12, "end" : "/div[1]/p[1]", "endOffset" : 18, "_id" : { "$oid" : "5056827a65c4d70200000030" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347846778201 }, "created" : { "$date" : 1347846778201 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056828365c4d70200000031", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "toils", "uuid" : "E6F2AA40", "_id" : { "$oid" : "5056828365c4d70200000031" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 76, "end" : "/div[1]/p[1]", "endOffset" : 81, "_id" : { "$oid" : "5056828365c4d70200000032" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347846787353 }, "created" : { "$date" : 1347846787353 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "505682991a807e02000000c7" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347846809546 }, "groups" : [ "21L.000J" ], "id" : "505682991a807e02000000c7", "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "quote" : "agony", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 123, "end" : "/div[1]/p[1]", "endOffset" : 128, "_id" : { "$oid" : "505682991a807e02000000c8" } } ], "tags" : [], "text" : "dreary, toils, anxiety, and agony are interesting word choices to describe the birth of a creature you have spent two years creating", "updated" : { "$date" : 1347846857545 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "daniman@mit.edu", "username" : "Danielle M.", "uuid" : "A86A25DB" } -{ "id" : "505682a01a807e02000000c9", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "anxiety", "uuid" : "E26E0B66", "_id" : { "$oid" : "505682a01a807e02000000c9" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 91, "end" : "/div[1]/p[1]", "endOffset" : 99, "_id" : { "$oid" : "505682a01a807e02000000ca" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347846816145 }, "created" : { "$date" : 1347846816145 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505684b41a807e02000000cb", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "But a few seconds into a psychedelic well drop, and Alice's domestic concern hasn't budged. Indicates strong sense of empathy and concern for order... perhaps also a resistance to let the latter go. ", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "she did not like to drop the jar for fear of killing\nsomebody, so managed to put it into one of the cupboards as she fell past it", "uuid" : "02B1BDC8", "_id" : { "$oid" : "505684b41a807e02000000cb" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 2309, "end" : "/div[1]/div[3]", "endOffset" : 2438, "_id" : { "$oid" : "505684b41a807e02000000cc" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347847348880 }, "created" : { "$date" : 1347847348880 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505686851a807e02000000cd", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "Alice shows a fervent yet superficially informed regard for rules and procedure", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "However, this bottle was NOT marked 'poison,' so Alice ventured to taste it, and finding\nit very nice, (it had, in fact, a sort of mixed flavour of cherry-tart, custard,\npine-apple, roast turkey, toffee, and hot buttered toast,) she very soon finished it off.", "uuid" : "9B7B55DC", "_id" : { "$oid" : "505686851a807e02000000cd" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 8294, "end" : "/div[1]/div[3]", "endOffset" : 8553, "_id" : { "$oid" : "505686851a807e02000000ce" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347847813512 }, "created" : { "$date" : 1347847813512 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505687e765c4d70200000033" }, "id" : "505687e765c4d70200000033", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Dreary in order to set the mood. I would have liked to see the monster brought to life on a beautiful spring afternoon--fun for the whole family. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "dreary night", "uuid" : "F516FD95", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 11, "end" : "/div[1]/p[1]", "endOffset" : 25, "_id" : { "$oid" : "505687e765c4d70200000034" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347848167616 }, "created" : { "$date" : 1347848167616 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505688111a807e02000000cf" }, "id" : "505688111a807e02000000cf", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Suggests that it's a different process than God's dark materials...", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "instruments of life", "uuid" : "872926DA", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 146, "end" : "/div[1]/p[1]", "endOffset" : 165, "_id" : { "$oid" : "505688111a807e02000000d0" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347848209531 }, "created" : { "$date" : 1347848209531 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5056882d65c4d70200000035" }, "id" : "5056882d65c4d70200000035", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Are we already getting hints about what Vic thinks about his creation?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "thing", "uuid" : "BF55A462", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 231, "end" : "/div[1]/p[1]", "endOffset" : 238, "_id" : { "$oid" : "5056882d65c4d70200000036" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347848237504 }, "created" : { "$date" : 1347848237504 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505688441a807e02000000d1" }, "id" : "505688441a807e02000000d1", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "See \"dreary night.\"", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "dismally", "uuid" : "19A963CA", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 312, "end" : "/div[1]/p[1]", "endOffset" : 321, "_id" : { "$oid" : "505688441a807e02000000d2" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347848260017 }, "created" : { "$date" : 1347848260017 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505688681a807e02000000d3" }, "id" : "505688681a807e02000000d3", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Again, Shelley couldn't have mentioned that the candle was freshly lit. These are mood-setting sentences. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "and my candle was nearly burnt out", "uuid" : "B32B6194", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 340, "end" : "/div[1]/p[1]", "endOffset" : 374, "_id" : { "$oid" : "505688681a807e02000000d4" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347848296777 }, "created" : { "$date" : 1347848296777 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505688b265c4d70200000037" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347848370949 }, "groups" : [ "21L.000J" ], "id" : "505688b265c4d70200000037", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "quote" : "dull yellow eye of the creature open; it breathed hard, and a convulsive motion agitated its limbs.", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 439, "end" : "/div[1]/p[1]", "endOffset" : 538, "_id" : { "$oid" : "505688b265c4d70200000038" } } ], "tags" : [], "text" : "\"Its brilliant white eyes fluttered with life as my creation gracefully rose like a wilted rose regaining life after an afternoon shower.\"", "updated" : { "$date" : 1347848384777 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "nhall@mit.edu", "username" : "Richard H.", "uuid" : "6E3EF661" } -{ "_id" : { "$oid" : "505688fa65c4d70200000039" }, "id" : "505688fa65c4d70200000039", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "...Good?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "His limbs were in proportion", "uuid" : "C8B9E91D", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 146, "end" : "/div[1]/p[2]", "endOffset" : 174, "_id" : { "$oid" : "505688fa65c4d7020000003a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347848442236 }, "created" : { "$date" : 1347848442236 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5056891d1a807e02000000d5" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347848477404 }, "groups" : [ "21L.448J" ], "id" : "5056891d1a807e02000000d5", "permissions" : { "delete" : [ "sheilaxu@mit.edu" ], "update" : [ "sheilaxu@mit.edu" ], "admin" : [ "sheilaxu@mit.edu" ], "read" : [] }, "quote" : "This question the Dodo could not answer without a great deal of thought, and it sat for a\n\t\t\tlong time with one finger pressed upon its forehead (the position in which you usually see\n\t\t\tShakespeare, in the pictures of him), while the rest waited in silence. At last the Dodo\n\t\t\tsaid, `EVERYBODY has won, and all must have prizes.' \n\t\t\t\n\t\t\t`But who is to give the prizes?' quite a chorus of voices asked.", "ranges" : [ { "start" : "/div[1]/div[5]/p[1]", "startOffset" : 4143, "end" : "/div[1]/div[5]/p[1]", "endOffset" : 4548, "_id" : { "$oid" : "5056891d1a807e02000000d6" } } ], "tags" : [], "text" : "This event is nonsensical where they did a \"race\".. presumably a way to dry themselves...and to demand prizes to be given out, including one for Alice herself. Apparently, this event illustrates a lack of set rules...even for something simple as a \"race\". I am starting to think that there is parts of this world where there is no rules and characters do as they please.", "updated" : { "$date" : 1347848808519 }, "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "user" : "sheilaxu@mit.edu", "username" : "Sheila X.", "uuid" : "EE9A0479" } -{ "_id" : { "$oid" : "505689651a807e02000000d7" }, "id" : "505689651a807e02000000d7", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "His physical description looks quite bad, although I'm not entirely sure why Vic can't stand the sight of his creation after having looked at it for so long before it was given life. I know he clearly states it's different, but I would like to know HOW. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "His yellow skin scarcely covered the work of muscles and arteries beneath; his hair was of a lustrous black, and flowing; his teeth of a pearly whiteness; but these luxuriances only formed a more horrid contrast with his watery eyes, that seemed almost of the same colour as the dun-white sockets in which they were set, his shrivelled complexion and straight black lips.", "uuid" : "D9BFB82B", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 244, "end" : "/div[1]/p[2]", "endOffset" : 615, "_id" : { "$oid" : "505689651a807e02000000d8" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347848549356 }, "created" : { "$date" : 1347848549356 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5056897d65c4d7020000003b" }, "id" : "5056897d65c4d7020000003b", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Can't tell what Shelley is saying...", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "The different accidents of life are not so changeable as the feelings of human nature.", "uuid" : "189E9806", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 0, "end" : "/div[1]/p[3]", "endOffset" : 86, "_id" : { "$oid" : "5056897d65c4d7020000003c" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347848573591 }, "created" : { "$date" : 1347848573591 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50568a1565c4d7020000003d" }, "id" : "50568a1565c4d7020000003d", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Vic is probably disgusted by how much time he devoted to his \"failed\" experiment. Although, I'm not sure why he didn't begin with a small-scale experiment, but that may just be the scientist within speaking. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "For this I had deprived myself of rest and health. I had desired it with an ardour that far exceeded moderation; but now that I had finished, the beauty of the dream vanished, and breathless horror and disgust filled my heart. Unable to endure the aspect of the being I had created,", "uuid" : "B7E24487", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 188, "end" : "/div[1]/p[3]", "endOffset" : 471, "_id" : { "$oid" : "50568a1565c4d7020000003e" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347848725147 }, "created" : { "$date" : 1347848725147 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50568a2d65c4d7020000003f" }, "id" : "50568a2d65c4d7020000003f", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "This is why he takes a nap. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "endeavouring to seek a few moments of forgetfulness.", "uuid" : "85DBF6AF", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 697, "end" : "/div[1]/p[3]", "endOffset" : 749, "_id" : { "$oid" : "50568a2d65c4d70200000040" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347848749637 }, "created" : { "$date" : 1347848749637 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50568a5e65c4d70200000041" }, "id" : "50568a5e65c4d70200000041", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "He has been spending many nights staring at dead bodies. I'm surprised he hasn't had these dreams before that night. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I held the corpse of my dead mother in my arms; a shroud enveloped her form, and I saw the grave-worms crawling in the folds of the flannel.", "uuid" : "A4F9ED25", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1099, "end" : "/div[1]/p[3]", "endOffset" : 1240, "_id" : { "$oid" : "50568a5e65c4d70200000042" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347848798642 }, "created" : { "$date" : 1347848798642 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50568aab1a807e02000000d9" }, "id" : "50568aab1a807e02000000d9", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Almost like the creature 'convulsed'--same word choice. I am reading into it too far, so disregard this. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "and every limb became convulsed;", "uuid" : "FF809249", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1330, "end" : "/div[1]/p[3]", "endOffset" : 1363, "_id" : { "$oid" : "50568aab1a807e02000000da" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347848875800 }, "created" : { "$date" : 1347848875800 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50568ab965c4d70200000043" }, "id" : "50568ab965c4d70200000043", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Everything is dim and yellow. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "dim and yellow light of the moon", "uuid" : "EA8EB9FC", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1376, "end" : "/div[1]/p[3]", "endOffset" : 1408, "_id" : { "$oid" : "50568ab965c4d70200000044" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347848889614 }, "created" : { "$date" : 1347848889614 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50568aef65c4d70200000045" }, "id" : "50568aef65c4d70200000045", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Probably just trying to communicate, but Vic is too blinded by his fright to understand the creation's situation.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "His jaws opened, and he muttered some inarticulate sounds, while a grin wrinkled his cheeks. He might have spoken, but I did not hear; one hand was stretched out, seemingly to detain me, but I escaped and rushed downstairs.", "uuid" : "0D76B06C", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1617, "end" : "/div[1]/p[3]", "endOffset" : 1841, "_id" : { "$oid" : "50568aef65c4d70200000046" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347848943509 }, "created" : { "$date" : 1347848943509 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50568afe65c4d70200000047" }, "id" : "50568afe65c4d70200000047", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Good to know, thanks Shelley. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "belonging to the house which I inhabited", "uuid" : "30483F82", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1873, "end" : "/div[1]/p[3]", "endOffset" : 1913, "_id" : { "$oid" : "50568afe65c4d70200000048" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347848958675 }, "created" : { "$date" : 1347848958675 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50568b161a807e02000000db", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Fear of Henry seeing the creature overcomes his fear of it, maybe reference to general idea that it is human nature to desire to please others more than ourselves", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I dreaded to behold this monster, but I feared still more that Henry should see him", "uuid" : "DCB5F8BA", "_id" : { "$oid" : "50568b161a807e02000000db" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "reference", "notes" ], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 333, "end" : "/div[1]/p[15]", "endOffset" : 416, "_id" : { "$oid" : "50568b161a807e02000000dc" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347848982929 }, "created" : { "$date" : 1347848982929 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50568b1a1a807e02000000dd" }, "id" : "50568b1a1a807e02000000dd", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "He's being a little harsh... Poor creature. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "demoniacal corpse to which I had so miserably given life", "uuid" : "2541A0E2", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 2110, "end" : "/div[1]/p[3]", "endOffset" : 2166, "_id" : { "$oid" : "50568b1a1a807e02000000de" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347848986869 }, "created" : { "$date" : 1347848986869 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50568b2c65c4d70200000049", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "More shivering", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "shivering", "uuid" : "05B71B17", "_id" : { "$oid" : "50568b2c65c4d70200000049" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "vocabulary", "writing" ], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 630, "end" : "/div[1]/p[15]", "endOffset" : 639, "_id" : { "$oid" : "50568b2c65c4d7020000004a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849004756 }, "created" : { "$date" : 1347849004756 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50568b2e65c4d7020000004b" }, "id" : "50568b2e65c4d7020000004b", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "It probably is because the creation is just too ugly... ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "No mortal could support the horror of that countenance", "uuid" : "83078A9F", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 4, "end" : "/div[1]/p[4]", "endOffset" : 58, "_id" : { "$oid" : "50568b2e65c4d7020000004c" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849006611 }, "created" : { "$date" : 1347849006611 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50568b4b65c4d7020000004d" }, "id" : "50568b4b65c4d7020000004d", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Hah. You tell 'em Vic. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "he was ugly then, but when those muscles and joints were rendered capable of motion, it became a thing such as even Dante could not have conceived.", "uuid" : "476406F5", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 172, "end" : "/div[1]/p[4]", "endOffset" : 320, "_id" : { "$oid" : "50568b4b65c4d7020000004e" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849035256 }, "created" : { "$date" : 1347849035256 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50568b5b65c4d7020000004f", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Hesitant to be reunited with his failure of a creation", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I then paused", "uuid" : "2C3BEB15", "_id" : { "$oid" : "50568b5b65c4d7020000004f" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "feelings" ], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 604, "end" : "/div[1]/p[15]", "endOffset" : 617, "_id" : { "$oid" : "50568b5b65c4d70200000050" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849051956 }, "created" : { "$date" : 1347849051956 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50568b671a807e02000000df" }, "id" : "50568b671a807e02000000df", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Wretchedly... you say? ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "wretchedly", "uuid" : "7BF85846", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 19, "end" : "/div[1]/p[5]", "endOffset" : 29, "_id" : { "$oid" : "50568b671a807e02000000e0" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849063620 }, "created" : { "$date" : 1347849063620 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50568b6965c4d70200000051", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Nice simile", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "as children are accustomed to do when they expect a spectre to stand in waiting for them on the other side", "uuid" : "F96CFC9F", "_id" : { "$oid" : "50568b6965c4d70200000051" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "writing" ], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 686, "end" : "/div[1]/p[15]", "endOffset" : 792, "_id" : { "$oid" : "50568b6965c4d70200000052" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849065780 }, "created" : { "$date" : 1347849065780 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50568ba365c4d70200000053", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "She likes to use adverbs; this, forcibly, and hardly are three in the vicinity ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "fearfully", "uuid" : "853F327B", "_id" : { "$oid" : "50568ba365c4d70200000053" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "writing" ], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 826, "end" : "/div[1]/p[15]", "endOffset" : 835, "_id" : { "$oid" : "50568ba365c4d70200000054" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849123780 }, "created" : { "$date" : 1347849123780 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50568bc665c4d70200000055", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Victor becomes crazily ecstatic", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "It was not joy only that possessed me; I felt my flesh tingle with excess of sensitiveness, and my pulse beat rapidly. I was unable to remain for a single instant in the same place; I jumped over the chairs, clapped my hands, and laughed aloud", "uuid" : "48826336", "_id" : { "$oid" : "50568bc665c4d70200000055" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "feelings" ], "ranges" : [ { "start" : "/div[1]/p[16]", "startOffset" : 107, "end" : "/div[1]/p[16]", "endOffset" : 350, "_id" : { "$oid" : "50568bc665c4d70200000056" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849158657 }, "created" : { "$date" : 1347849158657 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50568be01a807e02000000e1" }, "id" : "50568be01a807e02000000e1", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "I like this wording... Overthrow... Complete... Interesting choice. It's not that his perception of his work was changed by Victor's hands, as one does not overthrow oneself... But rather, it was an outside source, most likely the creature itself who changed Vic's perception of his work. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "and the change was so rapid, the overthrow so complete!", "uuid" : "F0E7534B", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 363, "end" : "/div[1]/p[5]", "endOffset" : 418, "_id" : { "$oid" : "50568be01a807e02000000e2" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849184425 }, "created" : { "$date" : 1347849184425 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50568c151a807e02000000e3", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Henry sees the behavior as normal at first, maybe because there was more free expression of feelings back then", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Clerval at first attributed my unusual spirits to joy on his arrival", "uuid" : "06376339", "_id" : { "$oid" : "50568c151a807e02000000e3" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "feelings" ], "ranges" : [ { "start" : "/div[1]/p[16]", "startOffset" : 352, "end" : "/div[1]/p[16]", "endOffset" : 420, "_id" : { "$oid" : "50568c151a807e02000000e4" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849237534 }, "created" : { "$date" : 1347849237534 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50568c3865c4d70200000057", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Victor starts hallucinating", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "putting my hands before my eyes, for I thought I saw the dreaded spectre glide into the room", "uuid" : "BD8F7E5B", "_id" : { "$oid" : "50568c3865c4d70200000057" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "feelings", "notes" ], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 26, "end" : "/div[1]/p[18]", "endOffset" : 118, "_id" : { "$oid" : "50568c3865c4d70200000058" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849272188 }, "created" : { "$date" : 1347849272188 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50568c5065c4d70200000059" }, "id" : "50568c5065c4d70200000059", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "\"I awoke to a beautiful blue sky which invited warmth and hope into my otherwise dismal being.\"", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "rain which poured from a black and comfortless sky.", "uuid" : "8971B79E", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 532, "end" : "/div[1]/p[6]", "endOffset" : 584, "_id" : { "$oid" : "50568c5065c4d7020000005a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849296945 }, "created" : { "$date" : 1347849296945 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50568c631a807e02000000e5" }, "id" : "50568c631a807e02000000e5", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Healthy Vic. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "bodily exercise to ease the load that weighed upon my mind", "uuid" : "940685CC", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[7]", "startOffset" : 65, "end" : "/div[1]/p[7]", "endOffset" : 124, "_id" : { "$oid" : "50568c631a807e02000000e6" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849315190 }, "created" : { "$date" : 1347849315190 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50568c6b1a807e02000000e7", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "The way it says \"he imagined\" makes me think he is doing it on purpose", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I imagined that the monster seized me; I struggled furiously and fell down in a fit.", "uuid" : "86D3F630", "_id" : { "$oid" : "50568c6b1a807e02000000e7" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "writing" ], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 157, "end" : "/div[1]/p[18]", "endOffset" : 241, "_id" : { "$oid" : "50568c6b1a807e02000000e8" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849323594 }, "created" : { "$date" : 1347849323594 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50568c8b65c4d7020000005b" }, "id" : "50568c8b65c4d7020000005b", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Look's like someone's been reading up on literature. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Like one who, on a lonely road, Doth walk in fear and dread, And, having once turned round, walks on, And turns no more his head; Because he knows a frightful fiend Doth close behind him tread.\n[Coleridge's \"Ancient Mariner.\"]", "uuid" : "BEFD8603", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[8]", "startOffset" : 0, "end" : "/div[1]/p[9]", "endOffset" : 32, "_id" : { "$oid" : "50568c8b65c4d7020000005c" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849355273 }, "created" : { "$date" : 1347849355273 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50568cc165c4d7020000005d", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "More of how he's more concerned with Clerval's condition than his own", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Poor Clerval! What must have been his feelings? A meeting, which he anticipated with such joy, so strangely turned to bitterness", "uuid" : "77ADEBF5", "_id" : { "$oid" : "50568cc165c4d7020000005d" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "feelings" ], "ranges" : [ { "start" : "/div[1]/p[19]", "startOffset" : 0, "end" : "/div[1]/p[19]", "endOffset" : 128, "_id" : { "$oid" : "50568cc165c4d7020000005e" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849409370 }, "created" : { "$date" : 1347849409370 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50568cff1a807e02000000e9" }, "id" : "50568cff1a807e02000000e9", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "I know why! Because Shelley needed Vic to meet Clerval, so in order to further the plot without much effort, Shelley uses her powers as the author to construct the inevitable union of Victor and Clerval. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Here I paused, I knew not why", "uuid" : "AFC5700F", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 116, "end" : "/div[1]/p[10]", "endOffset" : 146, "_id" : { "$oid" : "50568cff1a807e02000000ea" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849471848 }, "created" : { "$date" : 1347849471848 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50568d1f1a807e02000000eb" }, "id" : "50568d1f1a807e02000000eb", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Yes... How fortunate. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "How fortunate that you should be here at the very moment of my alighting!\"", "uuid" : "F6B7C343", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 530, "end" : "/div[1]/p[10]", "endOffset" : 604, "_id" : { "$oid" : "50568d1f1a807e02000000ec" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849503840 }, "created" : { "$date" : 1347849503840 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50568d361a807e02000000ed", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Henry was brought into scene to serve as Victor's outlet, maybe she uses him to make the story more believable, he enables Victor to go crazy after what he experienced, which would be the normal reaction", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "This was the commencement of a nervous fever which confined me for several months. During all that time Henry was my only nurse.", "uuid" : "9C1EBAC9", "_id" : { "$oid" : "50568d361a807e02000000ed" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "notes", "writing" ], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 0, "end" : "/div[1]/p[20]", "endOffset" : 128, "_id" : { "$oid" : "50568d361a807e02000000ee" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849526204 }, "created" : { "$date" : 1347849526204 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50568dcb1a807e02000000ef", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Henry also thinks of others before his own morals, withholds Victor's sickness from his family", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "he spared them this grief by concealing the extent of my disorder.", "uuid" : "2B0181D9", "_id" : { "$oid" : "50568dcb1a807e02000000ef" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "notes", "reference" ], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 277, "end" : "/div[1]/p[20]", "endOffset" : 343, "_id" : { "$oid" : "50568dcb1a807e02000000f0" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849675122 }, "created" : { "$date" : 1347849675122 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50568e291a807e02000000f1", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Highlights Victor's reliance on Henry and refers to human interdependence", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "surely nothing but the unbounded and unremitting attentions of my friend could have restored me to life.", "uuid" : "ECFDF3BA", "_id" : { "$oid" : "50568e291a807e02000000f1" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "reference" ], "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 35, "end" : "/div[1]/p[21]", "endOffset" : 139, "_id" : { "$oid" : "50568e291a807e02000000f2" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849769139 }, "created" : { "$date" : 1347849769139 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50568e5e65c4d7020000005f", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Henry was able to determine that a horrible event was causing Victor's sickness", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "persuaded him that my disorder indeed owed its origin to some uncommon and terrible event.", "uuid" : "777D108A", "_id" : { "$oid" : "50568e5e65c4d7020000005f" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "notes" ], "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 451, "end" : "/div[1]/p[21]", "endOffset" : 541, "_id" : { "$oid" : "50568e5e65c4d70200000060" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849822882 }, "created" : { "$date" : 1347849822882 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50568e8b65c4d70200000061" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347849867475 }, "groups" : [ "21L.000J" ], "id" : "50568e8b65c4d70200000061", "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "quote" : "instruments of life", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 146, "end" : "/div[1]/p[1]", "endOffset" : 165, "_id" : { "$oid" : "50568e8b65c4d70200000062" } } ], "tags" : [], "text" : "birth", "updated" : { "$date" : 1347849877667 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "daniman@mit.edu", "username" : "Danielle M.", "uuid" : "E54C7493" } -{ "id" : "50568e9d65c4d70200000063", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Through winter he is sick and with the coming of spring he is better, relation to the seasons somehow?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "the first time I became capable of observing outward objects with any kind of pleasure, I perceived that the fallen leaves had disappeared and that the young buds were shooting forth from the trees that shaded my window. It was a divine spring, and the season contributed greatly to my convalescence", "uuid" : "89BB681E", "_id" : { "$oid" : "50568e9d65c4d70200000063" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "reference", "notes" ], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 109, "end" : "/div[1]/p[22]", "endOffset" : 408, "_id" : { "$oid" : "50568e9d65c4d70200000064" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849885771 }, "created" : { "$date" : 1347849885771 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50568eaa1a807e02000000f3", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "dream, goal", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "might infuse a spark of being into the lifeless thing that lay at my feet", "uuid" : "1A980F4A", "_id" : { "$oid" : "50568eaa1a807e02000000f3" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 184, "end" : "/div[1]/p[1]", "endOffset" : 257, "_id" : { "$oid" : "50568eaa1a807e02000000f4" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849898169 }, "created" : { "$date" : 1347849898169 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50568eb565c4d70200000065", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "dismally", "uuid" : "069DA3FB", "_id" : { "$oid" : "50568eb565c4d70200000065" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 312, "end" : "/div[1]/p[1]", "endOffset" : 320, "_id" : { "$oid" : "50568eb565c4d70200000066" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849909709 }, "created" : { "$date" : 1347849909709 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50568ecc1a807e02000000f5", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "last hope before eye opens", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "glimmer", "uuid" : "2C40FDCB", "_id" : { "$oid" : "50568ecc1a807e02000000f5" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 389, "end" : "/div[1]/p[1]", "endOffset" : 396, "_id" : { "$oid" : "50568ecc1a807e02000000f6" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849932491 }, "created" : { "$date" : 1347849932491 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50568ed965c4d70200000067", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Victor feels obligated to pay Henry back, maybe shows a trait of human nature", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "How shall I ever repay you? I feel the greatest remorse for the disappointment of which I have been the occasion, but you will forgive me.\"", "uuid" : "6EBF0F33", "_id" : { "$oid" : "50568ed965c4d70200000067" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "notes", "reference" ], "ranges" : [ { "start" : "/div[1]/p[23]", "startOffset" : 185, "end" : "/div[1]/p[23]", "endOffset" : 324, "_id" : { "$oid" : "50568ed965c4d70200000068" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849945996 }, "created" : { "$date" : 1347849945996 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50568ede1a807e02000000f7", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "weather fits mood", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "rain", "uuid" : "C3CBDFC0", "_id" : { "$oid" : "50568ede1a807e02000000f7" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 298, "end" : "/div[1]/p[1]", "endOffset" : 302, "_id" : { "$oid" : "50568ede1a807e02000000f8" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849950177 }, "created" : { "$date" : 1347849950177 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50568ef11a807e02000000f9", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "stark contrast to baby birth, eye opens immediately, is dull foggy", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I saw the dull yellow eye of the creature open", "uuid" : "B491C02F", "_id" : { "$oid" : "50568ef11a807e02000000f9" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 429, "end" : "/div[1]/p[1]", "endOffset" : 475, "_id" : { "$oid" : "50568ef11a807e02000000fa" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849969479 }, "created" : { "$date" : 1347849969479 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50568ef665c4d70200000069", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Henry is very observational", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Clerval, who observed my change of colour", "uuid" : "740E1EAB", "_id" : { "$oid" : "50568ef665c4d70200000069" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "notes" ], "ranges" : [ { "start" : "/div[1]/p[25]", "startOffset" : 129, "end" : "/div[1]/p[25]", "endOffset" : 170, "_id" : { "$oid" : "50568ef665c4d7020000006a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347849974436 }, "created" : { "$date" : 1347849974436 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50568efc65c4d7020000006b" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347849980194 }, "groups" : [ "21L.000J" ], "id" : "50568efc65c4d7020000006b", "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "quote" : "catastrophe", "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 39, "end" : "/div[1]/p[2]", "endOffset" : 50, "_id" : { "$oid" : "50568efc65c4d7020000006c" } } ], "tags" : [], "text" : "wretch", "updated" : { "$date" : 1347850114793 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "daniman@mit.edu", "username" : "Danielle M.", "uuid" : "53E45ED5" } -{ "__v" : 0, "_id" : { "$oid" : "50568f1b65c4d7020000006d" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347850011287 }, "groups" : [ "21L.000J" ], "id" : "50568f1b65c4d7020000006d", "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "quote" : "such infinite pains and care I had endeavoured to form", "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 90, "end" : "/div[1]/p[2]", "endOffset" : 144, "_id" : { "$oid" : "50568f1b65c4d7020000006e" } } ], "tags" : [], "text" : "Frankenstein is in labor for twice as long as a woman would have been and his creature is ugly, dissapointment", "updated" : { "$date" : 1347850028398 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "daniman@mit.edu", "username" : "Danielle M.", "uuid" : "70D94B7C" } -{ "id" : "50568f3565c4d7020000006f", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Interesting how he refers to him by his last name", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Clerval", "uuid" : "9EE14D32", "_id" : { "$oid" : "50568f3565c4d7020000006f" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "notes" ], "ranges" : [ { "start" : "/div[1]/p[23]", "startOffset" : 9, "end" : "/div[1]/p[23]", "endOffset" : 16, "_id" : { "$oid" : "50568f3565c4d70200000070" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347850037495 }, "created" : { "$date" : 1347850037495 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50568f6265c4d70200000071" }, "id" : "50568f6265c4d70200000071", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Sorry to break it to you Clerval, but you're being used as a plot device. You're being used as a foil to accentuate a very clear Good/Bad, Light/Dark theme here. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Nothing could equal my delight on seeing Clerval; his presence brought back to my thoughts my father, Elizabeth, and all those scenes of home so dear to my recollection. I grasped his hand, and in a moment forgot my horror and misfortune; I felt suddenly, and for the first time during many months, calm and serene joy.", "uuid" : "47270B50", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 0, "end" : "/div[1]/p[11]", "endOffset" : 319, "_id" : { "$oid" : "50568f6265c4d70200000072" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347850082355 }, "created" : { "$date" : 1347850082355 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50568fa71a807e02000000fb" }, "id" : "50568fa71a807e02000000fb", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Watching? His endeavors were physically draining. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "\"I did not before remark how very ill you appear; so thin and pale; you look as if you had been watching for several nights.", "uuid" : "7CCAEC30", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 238, "end" : "/div[1]/p[13]", "endOffset" : 362, "_id" : { "$oid" : "50568fa71a807e02000000fc" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347850151325 }, "created" : { "$date" : 1347850151325 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50568fc71a807e02000000fd" }, "id" : "50568fc71a807e02000000fd", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "I'm surprised he can't confide in his best friend...", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I trembled excessively; I could not endure to think of, and far less to allude to, the occurrences of the preceding night.", "uuid" : "3514F6B0", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 0, "end" : "/div[1]/p[15]", "endOffset" : 123, "_id" : { "$oid" : "50568fc71a807e02000000fe" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347850183174 }, "created" : { "$date" : 1347850183174 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50568fcd1a807e02000000ff", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "don't judge a book by its cover, monster is beautiful on the outside...", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Beautiful", "uuid" : "044E3E77", "_id" : { "$oid" : "50568fcd1a807e02000000ff" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 222, "end" : "/div[1]/p[2]", "endOffset" : 231, "_id" : { "$oid" : "50568fcd1a807e0200000100" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347850189990 }, "created" : { "$date" : 1347850189990 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50568fec65c4d70200000073", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "not an accident", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "accidents", "uuid" : "0B2EBB2C", "_id" : { "$oid" : "50568fec65c4d70200000073" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 14, "end" : "/div[1]/p[3]", "endOffset" : 23, "_id" : { "$oid" : "50568fec65c4d70200000074" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347850220051 }, "created" : { "$date" : 1347850220051 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5056904665c4d70200000075" }, "__v" : 3, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347850310633 }, "groups" : [ "21L.003" ], "id" : "5056904665c4d70200000075", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "quote" : "Morland is a fool for not keeping a horse and gig of his\n\nown.\"\n\n\n\n\n\n\"No, he is not,\" said Catherine warmly, \"for I am sure he could not\n\nafford it.\"", "ranges" : [ { "start" : "/div[1]/p[410]", "startOffset" : 289, "end" : "/div[1]/p[411]", "endOffset" : 82, "_id" : { "$oid" : "50579f25fe243c0200000096" } } ], "tags" : [ "social", "status", "characters", "romanticism" ], "text" : "Carriages reflect social status and wealth. Catherine's innocence: she doesn't understand John's prod at the Morlands. Comment: Class society, hard to move around, but desire to get ahead exists, especially with John Thorpe. However, Catherine grew up on the countryside; she is not used to the competition and doesn't comprehend it and John Thorpe's comment", "updated" : { "$date" : 1347924477587 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "uuid" : "78D388F4" } -{ "id" : "505690d865c4d70200000077", "user" : "sheilaxu@mit.edu", "username" : "Sheila X.", "text" : "From Alice's perspective, this conversation shows irrational thinking on the Mad Hatter and the Dormouse's part about the treacle-well...especially when how can one live in a well full of water or treacle? But in this kind of world, anything could be possible, including living at the bottom of the treacle-well. ", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "Alice did not wish to offend the Dormouse again, so she began very cautiously: `But I\n\t\t\tdon't understand. Where did they draw the treacle from?' \n\t\t\t\n\t\t\t`You can draw water out of a water-well,' said the Hatter; `so I should think you could\n\t\t\tdraw treacle out of a treacle-well--eh, stupid?' \n\t\t\t\n\t\t\t`But they were IN the well,' Alice said to the Dormouse, not choosing to notice this last\n\t\t\tremark. \n\t\t\t\n\t\t\t`Of course they were', said the Dormouse; `--well in.' \n\t\t\t\n\t\t\tThis answer so confused poor Alice, that she let the Dormouse go on for some time without\n\t\t\tinterrupting it.", "uuid" : "E0DDC88E", "_id" : { "$oid" : "505690d865c4d70200000077" }, "permissions" : { "delete" : [ "sheilaxu@mit.edu" ], "update" : [ "sheilaxu@mit.edu" ], "admin" : [ "sheilaxu@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]/p[1]", "startOffset" : 10928, "end" : "/div[1]/div[8]/p[1]", "endOffset" : 11512, "_id" : { "$oid" : "505690d865c4d70200000078" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347850456405 }, "created" : { "$date" : 1347850456405 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5056918265c4d70200000079" }, "__v" : 1, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347850626950 }, "groups" : [ "21L.003" ], "id" : "5056918265c4d70200000079", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "quote" : "Henry drove so well—so quietly—without making any disturbance,\n\nwithout parading to her, or swearing at them: so different from the only\n\ngentleman-coachman whom it was in her power to compare him with!", "ranges" : [ { "start" : "/div[1]/p[716]", "startOffset" : 994, "end" : "/div[1]/p[716]", "endOffset" : 1196, "_id" : { "$oid" : "5057b224d265cb0200000015" } } ], "tags" : [ "status", "characters", "romanticism" ], "text" : "Comparison: Henry vs John ", "updated" : { "$date" : 1347924516708 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "uuid" : "A8745149" } -{ "id" : "5056926465c4d7020000007b", "user" : "samin@mit.edu", "username" : "Samin H.", "text" : "Rule of procession - Alice questions why they should be faced down... Carroll believes that one should question rules before following blindly", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "Alice was rather doubtful whether she ought not to lie down on her face like the three\n\t\t\tgardeners, but she could not remember every having heard of such a rule at processions;\n\t\t\t`and besides, what would be the use of a procession,' thought she, `if people had all to\n\t\t\tlie down upon their faces, so that they couldn't see it?' So she stood still where she\n\t\t\twas, and waited.", "uuid" : "921EECA9", "_id" : { "$oid" : "5056926465c4d7020000007b" }, "permissions" : { "delete" : [ "samin@mit.edu" ], "update" : [ "samin@mit.edu" ], "admin" : [ "samin@mit.edu" ], "read" : [] }, "tags" : [ "rules,", "non-conformity" ], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 2784, "end" : "/div[1]/div[3]", "endOffset" : 3164, "_id" : { "$oid" : "5056926465c4d7020000007c" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347850852924 }, "created" : { "$date" : 1347850852924 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056932d65c4d7020000007d", "user" : "sheilaxu@mit.edu", "username" : "Sheila X.", "text" : "This is one example of rudeness in Wonderland. This time, the mouse is apparently unsettled and angry with Alice for mentioning cats and how Alice shows a loving attitude towards the cats over the mice. In this case, the Mouse has an instinctual self-preservation need to avoid or dislike cats since obviously the cats must be the mouse's enemy in that world.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "So she began again: `Ou est ma chatte?' which was the first sentence in her\n\t\t\tFrench lesson-book. The Mouse gave a sudden leap out of the water, and seemed to quiver\n\t\t\tall over with fright. `Oh, I beg your pardon!' cried Alice hastily, afraid that she had\n\t\t\thurt the poor animal's feelings. `I quite forgot you didn't like cats.' \n\t\t\t\n\t\t\t`Not like cats!' cried the Mouse, in a shrill, passionate voice. `Would YOU like cats if\n\t\t\tyou were me?' \n\t\t\t\n\t\t\t`Well, perhaps not,' said Alice in a soothing tone: `don't be angry about it. And yet I\n\t\t\twish I could show you our cat Dinah: I think you'd take a fancy to cats if you could only\n\t\t\tsee her. She is such a dear quiet thing,' Alice went on, half to herself, as she swam\n\t\t\tlazily about in the pool, `and she sits purring so nicely by the fire, licking her paws\n\t\t\tand washing her face--and she is such a nice soft thing to nurse--and she's such a capital\n\t\t\tone for catching mice--oh, I beg your pardon!' cried Alice again, for this time the Mouse\n\t\t\twas bristling all over, and she felt certain it must be really offended. `We won't talk\n\t\t\tabout her any more if you'd rather not.' \n\t\t\t\n\t\t\t`We indeed!' cried the Mouse, who was trembling down to the end of his tail. `As if I\n\t\t\twould talk on such a subject! Our family always HATED cats: nasty, low, vulgar things!\n\t\t\tDon't let me hear the name again!'", "uuid" : "A209C756", "_id" : { "$oid" : "5056932d65c4d7020000007d" }, "permissions" : { "delete" : [ "sheilaxu@mit.edu" ], "update" : [ "sheilaxu@mit.edu" ], "admin" : [ "sheilaxu@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]/p[1]", "startOffset" : 8557, "end" : "/div[1]/div[4]/p[1]", "endOffset" : 9917, "_id" : { "$oid" : "5056932d65c4d7020000007e" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347851053651 }, "created" : { "$date" : 1347851053651 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056937ffe243c0200000002", "user" : "samin@mit.edu", "username" : "Samin H.", "text" : "Rules of nature - one needs ears to hear", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "Alice waited till the eyes appeared, and then nodded. `It's no use speaking to it,' she\n\t\t\tthought, `till its ears have come, or at least one of them.'", "uuid" : "8AC14B0E", "_id" : { "$oid" : "5056937ffe243c0200000002" }, "permissions" : { "delete" : [ "samin@mit.edu" ], "update" : [ "samin@mit.edu" ], "admin" : [ "samin@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 9429, "end" : "/div[1]/div[3]", "endOffset" : 9581, "_id" : { "$oid" : "5056937ffe243c0200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347851135948 }, "created" : { "$date" : 1347851135948 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5056945f65c4d7020000007f" }, "__v" : 1, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347851359837 }, "groups" : [ "21L.003" ], "id" : "5056945f65c4d7020000007f", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "quote" : "her admiration of the style\n\nin which they travelled, of the fashionable chaise and four—postilions\n\nhandsomely liveried, rising so regularly in their stirrups, and\n\nnumerous outriders properly mounted, sunk a little under this consequent\n\ninconvenience.", "ranges" : [ { "start" : "/div[1]/p[715]", "startOffset" : 1472, "end" : "/div[1]/p[715]", "endOffset" : 1726, "_id" : { "$oid" : "50579fd7d265cb0200000002" } } ], "tags" : [ "wealth", "class" ], "text" : "Extravagant style of travel still doesn't make up for the discomfort of the situation; wealth doesn't necessarily bring happiness; Catherine as a lower class, sees past the materialistic side and just wishes for a nice journey", "updated" : { "$date" : 1347921207320 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "uuid" : "91BF4CFF" } -{ "id" : "505694d3fe243c0200000004", "user" : "samin@mit.edu", "username" : "Samin H.", "text" : "Alice tries to find rules in people's behavior and nature. People and children's natural inclination to find rules in society. ", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "Soup does very well without--Maybe it's always\n\t\t\tpepper that makes people hot-tempered,' she went on, very much pleased at having found out\n\t\t\ta new kind of rule,", "uuid" : "4ED02E1F", "_id" : { "$oid" : "505694d3fe243c0200000004" }, "permissions" : { "delete" : [ "samin@mit.edu" ], "update" : [ "samin@mit.edu" ], "admin" : [ "samin@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 547, "end" : "/div[1]/div[4]", "endOffset" : 711, "_id" : { "$oid" : "505694d3fe243c0200000005" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347851475896 }, "created" : { "$date" : 1347851475896 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056952465c4d70200000081", "user" : "samin@mit.edu", "username" : "Samin H.", "text" : "Same as rules?", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "morals in things!", "uuid" : "2B86C06C", "_id" : { "$oid" : "5056952465c4d70200000081" }, "permissions" : { "delete" : [ "samin@mit.edu" ], "update" : [ "samin@mit.edu" ], "admin" : [ "samin@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 2406, "end" : "/div[1]/div[4]", "endOffset" : 2423, "_id" : { "$oid" : "5056952465c4d70200000082" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347851556212 }, "created" : { "$date" : 1347851556212 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056956565c4d70200000083", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Alice feels uncomfortable around the Duchess. Another example of this is her pushing the Duchess away when she tries to put her arms around her waist. ", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`I've a right to think,' said Alice sharply, for she was beginning to feel a little\n\t\t\tworried.", "uuid" : "1BB45AA8", "_id" : { "$oid" : "5056956565c4d70200000083" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 4545, "end" : "/div[1]/div[4]", "endOffset" : 4641, "_id" : { "$oid" : "5056956565c4d70200000084" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347851621551 }, "created" : { "$date" : 1347851621551 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50569590fe243c0200000006", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "The Duchess has an obsession with morals. You be able to pull away some lesson from every single thing that happens, which is not always necessarily true", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "and the moral of that is--\"", "uuid" : "2D0B8420", "_id" : { "$oid" : "50569590fe243c0200000006" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 3537, "end" : "/div[1]/div[4]", "endOffset" : 3564, "_id" : { "$oid" : "50569590fe243c0200000007" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347851664772 }, "created" : { "$date" : 1347851664772 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056959afe243c0200000008", "user" : "samin@mit.edu", "username" : "Samin H.", "text" : "Long sentence structure, confusing, hard to follow - does this sentence represent what Carroll thinks of rules?", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "\"Never imagine yourself\n\t\t\tnot to be otherwise than what it might appear to others that what you were or might have\n\t\t\tbeen was not otherwise than what you had been would have appeared to them to be\n\t\t\totherwise.\"'", "uuid" : "F5AC5111", "_id" : { "$oid" : "5056959afe243c0200000008" }, "permissions" : { "delete" : [ "samin@mit.edu" ], "update" : [ "samin@mit.edu" ], "admin" : [ "samin@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 3635, "end" : "/div[1]/div[4]", "endOffset" : 3849, "_id" : { "$oid" : "5056959afe243c0200000009" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347851674008 }, "created" : { "$date" : 1347851674008 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056966dfe243c020000000a", "user" : "samin@mit.edu", "username" : "Samin H.", "text" : "People ordering her around in wonderland, even a world of topsy turvy has rules and order", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`I\n\t\t\tnever was so ordered about in all my life, never!'", "uuid" : "8C488251", "_id" : { "$oid" : "5056966dfe243c020000000a" }, "permissions" : { "delete" : [ "samin@mit.edu" ], "update" : [ "samin@mit.edu" ], "admin" : [ "samin@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 7875, "end" : "/div[1]/div[4]", "endOffset" : 7931, "_id" : { "$oid" : "5056966dfe243c020000000b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347851885623 }, "created" : { "$date" : 1347851885623 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50569707fe243c020000000c", "user" : "samin@mit.edu", "username" : "Samin H.", "text" : "education and structure for children", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "We had the best of educations--in fact, we went to school every day--'", "uuid" : "0C5089A8", "_id" : { "$oid" : "50569707fe243c020000000c" }, "permissions" : { "delete" : [ "samin@mit.edu" ], "update" : [ "samin@mit.edu" ], "admin" : [ "samin@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 10384, "end" : "/div[1]/div[4]", "endOffset" : 10455, "_id" : { "$oid" : "50569707fe243c020000000d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347852039883 }, "created" : { "$date" : 1347852039883 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056988a65c4d70200000085", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Obvious violations of the ostensibly unbroken rules are covered up and dismissed. The truth is distorted to ensure that there are predictable rules.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`Why the fact\n\t\t\tis, you see, Miss, this here ought to have been a RED rose-tree, and we put a white one in\n\t\t\tby mistake; and if the Queen was to find it out, we should all have our heads cut off, you\n\t\t\tknow.", "uuid" : "86ED0301", "_id" : { "$oid" : "5056988a65c4d70200000085" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 1381, "end" : "/div[1]/div[3]", "endOffset" : 1591, "_id" : { "$oid" : "5056988a65c4d70200000086" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347852426240 }, "created" : { "$date" : 1347852426240 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505698da65c4d70200000087", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Card games have very strict rules. They're also fun to consider in studying probability. Evidence of mathematics in Carroll's work, as well as a good context in which to discuss rules.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "THE KING AND QUEEN OF\n\t\t\tHEARTS.", "uuid" : "B848CC1D", "_id" : { "$oid" : "505698da65c4d70200000087" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 2743, "end" : "/div[1]/div[3]", "endOffset" : 2775, "_id" : { "$oid" : "505698da65c4d70200000088" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347852506668 }, "created" : { "$date" : 1347852506668 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505698e565c4d70200000089", "user" : "mata@mit.edu", "username" : "Matthew A.", "text" : "More observation through a window", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Catherine walked to a window in the hope of catching\n\nanother glimpse of his figure. \"This is a somewhat heavy call upon your\n\nbrother's fortitude,\" observed the general to Eleanor. \"Woodston will\n\nmake but a sombre appearance today.\"", "uuid" : "65BEEA9B", "_id" : { "$oid" : "505698e565c4d70200000089" }, "permissions" : { "delete" : [ "mata@mit.edu" ], "update" : [ "mata@mit.edu" ], "admin" : [ "mata@mit.edu" ], "read" : [ "mata@mit.edu" ] }, "tags" : [ "window" ], "ranges" : [ { "start" : "/div[1]/p[764]", "startOffset" : 230, "end" : "/div[1]/p[764]", "endOffset" : 466, "_id" : { "$oid" : "505698e565c4d7020000008a" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347852517434 }, "created" : { "$date" : 1347852517434 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056991665c4d7020000008b", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "The trial is the first example of reason/law being used in Wonderland, but we see that it is still nothing like we would expect. The witnesses are constantly threatened, the jury can't remember their names and so on", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "Chapter XI: Who Stole the Tarts?", "uuid" : "5E17FCE3", "_id" : { "$oid" : "5056991665c4d7020000008b" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/h4[1]", "startOffset" : 0, "end" : "/div[1]/div[5]/h4[1]", "endOffset" : 32, "_id" : { "$oid" : "5056991665c4d7020000008c" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347852566311 }, "created" : { "$date" : 1347852566311 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50569936fe243c020000000e", "user" : "mata@mit.edu", "username" : "Matthew A.", "text" : "No longer preoccupied with the expensiveness of items within the room, but rather the \"honest simplicity\" of the landscape", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Catherine was\n\ndelighted enough even to satisfy the general. It was a prettily shaped\n\nroom, the windows reaching to the ground, and the view from them\n\npleasant, though only over green meadows; and she expressed her\n\nadmiration at the moment with all the honest simplicity with which she\n\nfelt it.", "uuid" : "03FC9CF6", "_id" : { "$oid" : "50569936fe243c020000000e" }, "permissions" : { "delete" : [ "mata@mit.edu" ], "update" : [ "mata@mit.edu" ], "admin" : [ "mata@mit.edu" ], "read" : [ "mata@mit.edu" ] }, "tags" : [ "window", "observation" ], "ranges" : [ { "start" : "/div[1]/p[905]", "startOffset" : 411, "end" : "/div[1]/p[905]", "endOffset" : 709, "_id" : { "$oid" : "50569936fe243c020000000f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347852598426 }, "created" : { "$date" : 1347852598426 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056996765c4d7020000008d", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "strange", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "(As that is rather a hard word, I will just explain to you how it was done. They\n\t\t\thad a large canvas bag, which tied up at the mouth with strings: into this they slipped\n\t\t\tthe guinea-pig, head first, and then sat upon it.)", "uuid" : "518F1D97", "_id" : { "$oid" : "5056996765c4d7020000008d" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 8165, "end" : "/div[1]/div[5]", "endOffset" : 8392, "_id" : { "$oid" : "5056996765c4d7020000008e" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347852647760 }, "created" : { "$date" : 1347852647760 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50569a68fe243c0200000010", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "The rules are familiar but the context is strange and inappropriate. Rules come with a context--you can't apply croquet rules to flamingoes [, you can't apply probability to biology?]", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "Alice thought she had never seen such a curious\n\t\t\tcroquet-ground in her life; it was all ridges and furrows; the balls were live hedgehogs,\n\t\t\tthe mallets live flamingoes, and the soldiers had to double themselves up and to stand on\n\t\t\ttheir hands and feet, to make the arches.", "uuid" : "00D2CC78", "_id" : { "$oid" : "50569a68fe243c0200000010" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 7114, "end" : "/div[1]/div[3]", "endOffset" : 7393, "_id" : { "$oid" : "50569a68fe243c0200000011" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347852904789 }, "created" : { "$date" : 1347852904789 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50569a8efe243c0200000012", "user" : "mata@mit.edu", "username" : "Matthew A.", "text" : "A good quote", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Yet how different now the\n\nsource of her inquietude from what it had been then—how mournfully\n\nsuperior in reality and substance!", "uuid" : "C3DDFDD1", "_id" : { "$oid" : "50569a8efe243c0200000012" }, "permissions" : { "delete" : [ "mata@mit.edu" ], "update" : [ "mata@mit.edu" ], "admin" : [ "mata@mit.edu" ], "read" : [ "mata@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[955]", "startOffset" : 254, "end" : "/div[1]/p[955]", "endOffset" : 384, "_id" : { "$oid" : "50569a8efe243c0200000013" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347852942738 }, "created" : { "$date" : 1347852942738 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50569acdfe243c0200000014" }, "__v" : 1, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347853005462 }, "groups" : [ "21L.003" ], "id" : "50569acdfe243c0200000014", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "quote" : "Young men and women driving about the country\n\nin open carriages! Now and then it is very well; but going to inns and\n\npublic places together! It is not right", "ranges" : [ { "start" : "/div[1]/p[473]", "startOffset" : 101, "end" : "/div[1]/p[473]", "endOffset" : 259, "_id" : { "$oid" : "50569acdfe243c0200000015" } } ], "tags" : [ "social", "characters", "realism" ], "text" : "Negative connotation for carriages; viewed differently by different classes", "updated" : { "$date" : 1347924458057 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "uuid" : "A3CFD073" } -{ "id" : "50569adc65c4d7020000008f", "user" : "mata@mit.edu", "username" : "Matthew A.", "text" : "Light comes through the windows -- symbolism?", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "She saw a large, well-proportioned apartment, an handsome dimity bed,\n\narranged as unoccupied with an housemaid's care, a bright Bath stove,\n\nmahogany wardrobes, and neatly painted chairs, on which the warm beams\n\nof a western sun gaily poured through two sash windows! Catherine had\n\nexpected to have her feelings worked, and worked they were.", "uuid" : "B093BC90", "_id" : { "$oid" : "50569adc65c4d7020000008f" }, "permissions" : { "delete" : [ "mata@mit.edu" ], "update" : [ "mata@mit.edu" ], "admin" : [ "mata@mit.edu" ], "read" : [ "mata@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[817]", "startOffset" : 575, "end" : "/div[1]/p[817]", "endOffset" : 919, "_id" : { "$oid" : "50569adc65c4d70200000090" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347853020191 }, "created" : { "$date" : 1347853020191 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50569b50fe243c0200000016", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "A common proverb, meaning something along the lines of, \"even the supposedly inferior has some advantage over the supposedly superior.\" If the superior is the rule-maker, what advantage do the inferiors have?", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`A cat may look at a king,' said Alice. `I've read that in some book, but I don't remember\n\t\t\twhere.'", "uuid" : "248716AC", "_id" : { "$oid" : "50569b50fe243c0200000016" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 11211, "end" : "/div[1]/div[3]", "endOffset" : 11313, "_id" : { "$oid" : "50569b50fe243c0200000017" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347853136603 }, "created" : { "$date" : 1347853136603 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50569b8cfe243c0200000018", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Inflexibility of rules is bad. Lest we become like the Queen, we must challenge our rules.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "The Queen had only one way of settling all difficulties, great or small.", "uuid" : "6D7B09B2", "_id" : { "$oid" : "50569b8cfe243c0200000018" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 11497, "end" : "/div[1]/div[3]", "endOffset" : 11569, "_id" : { "$oid" : "50569b8cfe243c0200000019" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347853196688 }, "created" : { "$date" : 1347853196688 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50569bb465c4d70200000091", "user" : "alex93@mit.edu", "username" : "Alexander O.", "text" : "It's clear here that Alice is still trying to figure out the rules of this strange world.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "Alice was rather doubtful whether she ought not to lie down on her face like the three\n\t\t\tgardeners, but she could not remember every having heard of such a rule at processions", "uuid" : "175B8A1C", "_id" : { "$oid" : "50569bb465c4d70200000091" }, "permissions" : { "delete" : [ "alex93@mit.edu" ], "update" : [ "alex93@mit.edu" ], "admin" : [ "alex93@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 2784, "end" : "/div[1]/div[3]", "endOffset" : 2960, "_id" : { "$oid" : "50569bb465c4d70200000092" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347853236794 }, "created" : { "$date" : 1347853236794 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50569bb9fe243c020000001a", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Another foolish application of \"universal\" rules.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "that anything that had a head could be beheaded,", "uuid" : "E47E8539", "_id" : { "$oid" : "50569bb9fe243c020000001a" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 13672, "end" : "/div[1]/div[3]", "endOffset" : 13721, "_id" : { "$oid" : "50569bb9fe243c020000001b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347853241548 }, "created" : { "$date" : 1347853241548 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50569bd7fe243c020000001c", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "Familiarity with behavior of various animals on the part of the omniscient author contrasts with Alice's confused notions on the same topic. Prime example- talking about cats and dogs with a field mouse. ", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`I know what \"it\" means well enough, when I find a thing,' said the Duck: `it's\n\t\t\tgenerally a frog or a worm.", "uuid" : "C0543F05", "_id" : { "$oid" : "50569bd7fe243c020000001c" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[1]", "startOffset" : 2053, "end" : "/div[1]/div[5]/p[1]", "endOffset" : 2163, "_id" : { "$oid" : "50569bd7fe243c020000001d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347853271714 }, "created" : { "$date" : 1347853271714 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50569bfcfe243c020000001e", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Circumstances determine development...selective pressure?", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "Maybe it's always\n\t\t\tpepper that makes people hot-tempered,' she went on, very much pleased at having found out\n\t\t\ta new kind of rule, `and vinegar that makes them sour--and camomile that makes them\n\t\t\tbitter--and--and barley-sugar and such things that make children sweet-tempered. I only\n\t\t\twish people knew that: then they wouldn't be so stingy about it, you know--'", "uuid" : "E6434861", "_id" : { "$oid" : "50569bfcfe243c020000001e" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 576, "end" : "/div[1]/div[4]", "endOffset" : 945, "_id" : { "$oid" : "50569bfcfe243c020000001f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347853308639 }, "created" : { "$date" : 1347853308639 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50569d17fe243c0200000020", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Again, use of words to confuse or obscure the rules. That is to say, some would rather that you not know the rules.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "--\"Be what you\n\t\t\twould seem to be\"--or if you'd like it put more simply--\"Never imagine yourself\n\t\t\tnot to be otherwise than what it might appear to others that what you were or might have\n\t\t\tbeen was not otherwise than what you had been would have appeared to them to be\n\t\t\totherwise.\"'", "uuid" : "465B6C1E", "_id" : { "$oid" : "50569d17fe243c0200000020" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 3561, "end" : "/div[1]/div[4]", "endOffset" : 3850, "_id" : { "$oid" : "50569d17fe243c0200000021" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347853591392 }, "created" : { "$date" : 1347853591392 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50569de3fe243c0200000022", "user" : "alex93@mit.edu", "username" : "Alexander O.", "text" : "Alice is reasoning logically, rather than looking for specific rules to comment on how she should behave.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "Why, they're only a pack of cards, after all. I needn't be afraid of them", "uuid" : "93FC8391", "_id" : { "$oid" : "50569de3fe243c0200000022" }, "permissions" : { "delete" : [ "alex93@mit.edu" ], "update" : [ "alex93@mit.edu" ], "admin" : [ "alex93@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 3611, "end" : "/div[1]/div[3]", "endOffset" : 3684, "_id" : { "$oid" : "50569de3fe243c0200000023" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347853809864 }, "created" : { "$date" : 1347853795328 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50569e62fe243c0200000024", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "wow... bona fide natural dynamics certainly pervade the fabric of THIS fantasy world", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "And oh, I wish you could\n\t\t\tsee her after the birds! Why, she'll eat a little bird as soon as look at it", "uuid" : "7C45C8AD", "_id" : { "$oid" : "50569e62fe243c0200000024" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[1]", "startOffset" : 10011, "end" : "/div[1]/div[5]/p[1]", "endOffset" : 10115, "_id" : { "$oid" : "50569e62fe243c0200000025" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347853922618 }, "created" : { "$date" : 1347853922618 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50569f0e65c4d70200000093", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "Pavlovian Conditioning on a young human, one iteration in. ", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`I\n\t\t\tknow SOMETHING interesting is sure to happen,' she said to herself, `whenever I eat or\n\t\t\tdrink anything", "uuid" : "36102648", "_id" : { "$oid" : "50569f0e65c4d70200000093" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]/p[1]", "startOffset" : 2548, "end" : "/div[1]/div[6]/p[1]", "endOffset" : 2658, "_id" : { "$oid" : "50569f0e65c4d70200000094" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347854094030 }, "created" : { "$date" : 1347854094030 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056a01465c4d70200000095", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "wordplay.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "We called him Tortoise because he taught us", "uuid" : "800836E2", "_id" : { "$oid" : "5056a01465c4d70200000095" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 9661, "end" : "/div[1]/div[4]", "endOffset" : 9704, "_id" : { "$oid" : "5056a01465c4d70200000096" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347854356481 }, "created" : { "$date" : 1347854356481 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056a07e65c4d70200000097", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "critique of education which is focused on memorization rather than understanding. Learning the rules without learning the justification for the rules is bad.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`Reeling and Writhing, of course, to begin with,' the Mock Turtle replied; `and then the\n\t\t\tdifferent branches of Arithmetic-- Ambition, Distraction, Uglification, and Derision.'", "uuid" : "DB610E83", "_id" : { "$oid" : "5056a07e65c4d70200000097" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 11209, "end" : "/div[1]/div[4]", "endOffset" : 11388, "_id" : { "$oid" : "5056a07e65c4d70200000098" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347854462052 }, "created" : { "$date" : 1347854462052 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056a0a2fe243c0200000026", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Heh, drawing, sketching, painting in oils.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "Drawling, Stretching, and Fainting in Coils", "uuid" : "3C441795", "_id" : { "$oid" : "5056a0a2fe243c0200000026" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 12219, "end" : "/div[1]/div[4]", "endOffset" : 12262, "_id" : { "$oid" : "5056a0a2fe243c0200000027" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347854498715 }, "created" : { "$date" : 1347854498715 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056a0e5fe243c0200000028", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "when the rules fail to explain something, change the subject.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "That's enough about lessons,' the Gryphon interrupted in a very decided tone: `tell her\n\t\t\tsomething about the games now.'", "uuid" : "26B38175", "_id" : { "$oid" : "5056a0e5fe243c0200000028" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 13428, "end" : "/div[1]/div[4]", "endOffset" : 13551, "_id" : { "$oid" : "5056a0e5fe243c0200000029" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347854565844 }, "created" : { "$date" : 1347854565844 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056a1a9fe243c020000002a", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "The truth is silenced!", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "Pepper, mostly,' said the cook. \n\t\t\t\n\t\t\t`Treacle,' said a sleepy voice behind her. \n\t\t\t\n\t\t\t`Collar that Dormouse,' the Queen shrieked out. `Behead that Dormouse! Turn that Dormouse\n\t\t\tout of court! Suppress him! Pinch him! Off with his whiskers!'", "uuid" : "C0491EF7", "_id" : { "$oid" : "5056a1a9fe243c020000002a" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 10164, "end" : "/div[1]/div[5]", "endOffset" : 10411, "_id" : { "$oid" : "5056a1a9fe243c020000002b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347854761719 }, "created" : { "$date" : 1347854761719 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056a1edfe243c020000002c", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Parsimony is valued.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`Well, I shan't go, at any rate,' said Alice: `besides, that's not a regular rule: you\n\t\t\tinvented it just now.' \n\t\t\t\n\t\t\t`It's the oldest rule in the book,' said the King. \n\t\t\t\n\t\t\t`Then it ought to be Number One,' said Alice.", "uuid" : "92B9A32B", "_id" : { "$oid" : "5056a1edfe243c020000002c" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 3063, "end" : "/div[1]/div[6]", "endOffset" : 3289, "_id" : { "$oid" : "5056a1edfe243c020000002d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347854829479 }, "created" : { "$date" : 1347854829479 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056a28c65c4d70200000099", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "Telepathic caterpillar? ", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`Of the mushroom,' said the Caterpillar, just as if she had asked it aloud; and in another\n\t\t\tmoment it was out of sight.", "uuid" : "4CDC8BDA", "_id" : { "$oid" : "5056a28c65c4d70200000099" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]/p[1]", "startOffset" : 6341, "end" : "/div[1]/div[7]/p[1]", "endOffset" : 6463, "_id" : { "$oid" : "5056a28c65c4d7020000009a" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347854988734 }, "created" : { "$date" : 1347854988734 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056a4a4fe243c020000002e", "user" : "alex93@mit.edu", "username" : "Alexander O.", "text" : "This is a clear demonstration of how Alice feels uncomfortable from being unable to adapt to the Wonderland \"culture\".", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`Why did you call him Tortoise, if he wasn't one?' Alice asked. \n\t\t\t\n\t\t\t`We called him Tortoise because he taught us,' said the Mock Turtle angrily: `really you\n\t\t\tare very dull!' \n\t\t\t\n\t\t\t`You ought to be ashamed of yourself for asking such a simple question,' added the\n\t\t\tGryphon; and then they both sat silent and looked at poor Alice, who felt ready to sink\n\t\t\tinto the earth.", "uuid" : "B398EC66", "_id" : { "$oid" : "5056a4a4fe243c020000002e" }, "permissions" : { "delete" : [ "alex93@mit.edu" ], "update" : [ "alex93@mit.edu" ], "admin" : [ "alex93@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 9588, "end" : "/div[1]/div[4]", "endOffset" : 9968, "_id" : { "$oid" : "5056a4a4fe243c020000002f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347855524538 }, "created" : { "$date" : 1347855524538 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056a4eefe243c0200000030", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "Foreshadowing a glaring incongruity that is forthcoming. The context of perplexing similarities in the watches of Alice's world and of the Hatter's alludes perhaps to future situations where divergent aspects of the two realities deal effects in similar ways. ", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`Which is just the case with MINE,' said the Hatter.", "uuid" : "B844C1C3", "_id" : { "$oid" : "5056a4eefe243c0200000030" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]/p[1]", "startOffset" : 4021, "end" : "/div[1]/div[8]/p[1]", "endOffset" : 4074, "_id" : { "$oid" : "5056a4eefe243c0200000031" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347855598221 }, "created" : { "$date" : 1347855598221 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056a64e65c4d7020000009b", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "As human rules are inherently arbitrary, they require explicit enforcement. ", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : ", `Why the fact\n\t\t\tis, you see, Miss, this here ought to have been a RED rose-tree, and we put a white one in\n\t\t\tby mistake; and if the Queen was to find it out, we should all have our heads cut off, you\n\t\t\tknow.", "uuid" : "3667CCC1", "_id" : { "$oid" : "5056a64e65c4d7020000009b" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [ "chom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 1379, "end" : "/div[1]/div[3]", "endOffset" : 1591, "_id" : { "$oid" : "5056a64e65c4d7020000009c" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347855950321 }, "created" : { "$date" : 1347855950321 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056ac7f65c4d7020000009d", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "Enforcement of human laws also must be deliberate, and is completely at the mercy of natural laws. Commons terms for situations where intrinsic happenings befuddle overt plans include \"corner case\" and \"unforeseen circumstances.\"", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "The executioner's argument was, that you couldn't cut off a head unless there was a body\n\t\t\tto cut it off from:", "uuid" : "EAC56B54", "_id" : { "$oid" : "5056ac7f65c4d7020000009d" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 13426, "end" : "/div[1]/div[3]", "endOffset" : 13537, "_id" : { "$oid" : "5056ac7f65c4d7020000009e" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347857535225 }, "created" : { "$date" : 1347857535225 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056accb65c4d7020000009f", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "The condemned lacking a neck for chopping is prime example of a corner case in this particularly bloody method of dealing with dissent. ", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "the King and the executioner ran wildly\n\t\t\tup and down looking for it, while the rest of the party went back to the game.", "uuid" : "FEEB4E82", "_id" : { "$oid" : "5056accb65c4d7020000009f" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 14383, "end" : "/div[1]/div[3]", "endOffset" : 14506, "_id" : { "$oid" : "5056accb65c4d702000000a0" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347857611784 }, "created" : { "$date" : 1347857611784 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b12a65c4d702000000a1", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "Frankenstein as creator", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "instruments of life around me, that I might infuse a spark of being into the lifeless thing that lay at my feet", "uuid" : "875406E1", "_id" : { "$oid" : "5056b12a65c4d702000000a1" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 146, "end" : "/div[1]/p[1]", "endOffset" : 257, "_id" : { "$oid" : "5056b12a65c4d702000000a2" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347858730252 }, "created" : { "$date" : 1347858730252 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b14ffe243c0200000032", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "dull yellow eye", "uuid" : "A5E56AAC", "_id" : { "$oid" : "5056b14ffe243c0200000032" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [ "eyes" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 439, "end" : "/div[1]/p[1]", "endOffset" : 454, "_id" : { "$oid" : "5056b14ffe243c0200000033" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347858767559 }, "created" : { "$date" : 1347858767559 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b18565c4d702000000a3", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "watery eyes", "uuid" : "B9E33BA9", "_id" : { "$oid" : "5056b18565c4d702000000a3" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [ "eyes" ], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 465, "end" : "/div[1]/p[2]", "endOffset" : 476, "_id" : { "$oid" : "5056b18565c4d702000000a4" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347858821518 }, "created" : { "$date" : 1347858821518 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b1a4fe243c0200000034", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "Why are we \"accidents of life?\"", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "accidents of life", "uuid" : "FDA9B937", "_id" : { "$oid" : "5056b1a4fe243c0200000034" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 14, "end" : "/div[1]/p[3]", "endOffset" : 31, "_id" : { "$oid" : "5056b1a4fe243c0200000035" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347858852580 }, "created" : { "$date" : 1347858852580 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b1d0fe243c0200000036", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "Disillusionment", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "but now that I had finished, the beauty of the dream vanished, and breathless horror and disgust filled my heart", "uuid" : "24207F6A", "_id" : { "$oid" : "5056b1d0fe243c0200000036" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 301, "end" : "/div[1]/p[3]", "endOffset" : 414, "_id" : { "$oid" : "5056b1d0fe243c0200000037" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347858896969 }, "created" : { "$date" : 1347858896969 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b23bfe243c0200000038", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "Frankenstein admits his attempts at escapism", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "endeavouring to seek a few moments of forgetfulness.", "uuid" : "8855817B", "_id" : { "$oid" : "5056b23bfe243c0200000038" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 697, "end" : "/div[1]/p[3]", "endOffset" : 749, "_id" : { "$oid" : "5056b23bfe243c0200000039" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347859003275 }, "created" : { "$date" : 1347859003275 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b26465c4d702000000a5", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "Foreshadowing?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "they became livid with the hue of death", "uuid" : "F2206263", "_id" : { "$oid" : "5056b26465c4d702000000a5" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1007, "end" : "/div[1]/p[3]", "endOffset" : 1046, "_id" : { "$oid" : "5056b26465c4d702000000a6" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347859044427 }, "created" : { "$date" : 1347859044427 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b28165c4d702000000a7", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "Thinking about women--perhaps because he himself has just \"given birth\"?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "my dead mother in my arms", "uuid" : "81B405E8", "_id" : { "$oid" : "5056b28165c4d702000000a7" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1121, "end" : "/div[1]/p[3]", "endOffset" : 1146, "_id" : { "$oid" : "5056b28165c4d702000000a8" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347859073603 }, "created" : { "$date" : 1347859073603 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b2a2fe243c020000003a", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "wretch", "uuid" : "A5658CEA", "_id" : { "$oid" : "5056b2a2fe243c020000003a" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [ "names", "for", "monster" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1473, "end" : "/div[1]/p[3]", "endOffset" : 1479, "_id" : { "$oid" : "5056b2a2fe243c020000003b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347859106048 }, "created" : { "$date" : 1347859106048 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b2bbfe243c020000003c", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "the miserable monster", "uuid" : "FAE7DFF9", "_id" : { "$oid" : "5056b2bbfe243c020000003c" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [ "names", "for", "the", "monster" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1481, "end" : "/div[1]/p[3]", "endOffset" : 1502, "_id" : { "$oid" : "5056b2bbfe243c020000003d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347859131130 }, "created" : { "$date" : 1347859131130 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5056b2be65c4d702000000a9" }, "id" : "5056b2be65c4d702000000a9", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Very good description--it's something we can all relate to. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I threw the door forcibly open, as children are accustomed to do when they expect a spectre to stand in waiting for them on the other side; but nothing appeared.", "uuid" : "7FC248D8", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 653, "end" : "/div[1]/p[15]", "endOffset" : 815, "_id" : { "$oid" : "5056b2be65c4d702000000aa" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347859134763 }, "created" : { "$date" : 1347859134763 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b2e865c4d702000000ab", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "Why can't they be called eyes? Do they lack sight?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "eyes, if eyes they may be called, were fixed on me", "uuid" : "E6179644", "_id" : { "$oid" : "5056b2e865c4d702000000ab" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [ "eyes", "sight" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1566, "end" : "/div[1]/p[3]", "endOffset" : 1616, "_id" : { "$oid" : "5056b2e865c4d702000000ac" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347859176762 }, "created" : { "$date" : 1347859176762 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5056b30765c4d702000000ad" }, "id" : "5056b30765c4d702000000ad", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "He's gone a little loopy. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "It was not joy only that possessed me; I felt my flesh tingle with excess of sensitiveness, and my pulse beat rapidly.", "uuid" : "96D051B9", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[16]", "startOffset" : 107, "end" : "/div[1]/p[16]", "endOffset" : 225, "_id" : { "$oid" : "5056b30765c4d702000000ae" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347859207480 }, "created" : { "$date" : 1347859207480 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b353fe243c020000003e", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "Smiling and babbling, much like the newborn he is--\nThe 'monster' is not malevolent in any way at this point, except in the eyes of his creator", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "he muttered some inarticulate sounds, while a grin wrinkled his cheeks", "uuid" : "A37B665C", "_id" : { "$oid" : "5056b353fe243c020000003e" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1639, "end" : "/div[1]/p[3]", "endOffset" : 1709, "_id" : { "$oid" : "5056b353fe243c020000003f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347859283309 }, "created" : { "$date" : 1347859283309 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5056b35565c4d702000000af" }, "id" : "5056b35565c4d702000000af", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "I like to think of Gene Wilder with frizzy hair running around cackling with joy and mania. He'd do that very well... oh wait... he did. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Clerval at first attributed my unusual spirits to joy on his arrival, but when he observed me more attentively, he saw a wildness in my eyes for which he could not account, and my loud, unrestrained, heartless laughter frightened and astonished him.", "uuid" : "D5470BBD", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[16]", "startOffset" : 351, "end" : "/div[1]/p[16]", "endOffset" : 601, "_id" : { "$oid" : "5056b35565c4d702000000b0" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347859285107 }, "created" : { "$date" : 1347859285107 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b37665c4d702000000b1", "user" : "mata@mit.edu", "username" : "Matthew A.", "text" : "Clothing in a store window", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "I saw the prettiest hat you can imagine, in a shop window in\n\nMilsom Street just now—very like yours, only with coque", "uuid" : "E3F37C00", "_id" : { "$oid" : "5056b37665c4d702000000b1" }, "permissions" : { "delete" : [ "mata@mit.edu" ], "update" : [ "mata@mit.edu" ], "admin" : [ "mata@mit.edu" ], "read" : [ "mata@mit.edu" ] }, "tags" : [ "window", "observation" ], "ranges" : [ { "start" : "/div[1]/p[108]", "startOffset" : 376, "end" : "/div[1]/p[108]", "endOffset" : 494, "_id" : { "$oid" : "5056b37665c4d702000000b2" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347859318301 }, "created" : { "$date" : 1347859318301 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5056b38965c4d702000000b3" }, "id" : "5056b38965c4d702000000b3", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "We finally see the extent to which his traumatic experience left its mark. The wound seems deep...", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "\"HE can tell. Oh, save me! Save me!\"", "uuid" : "BEC73ABD", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 120, "end" : "/div[1]/p[18]", "endOffset" : 156, "_id" : { "$oid" : "5056b38965c4d702000000b4" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347859337490 }, "created" : { "$date" : 1347859337490 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b38efe243c0200000040", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "Remarkably, the monster finds his way to victor--perhaps a sign of an unnaturally close connection between the two?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I beheld the wretch--the miserable monster whom I had created", "uuid" : "B14CC8F0", "_id" : { "$oid" : "5056b38efe243c0200000040" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1460, "end" : "/div[1]/p[3]", "endOffset" : 1521, "_id" : { "$oid" : "5056b38efe243c0200000041" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347859342164 }, "created" : { "$date" : 1347859342164 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5056b3a465c4d702000000b5" }, "id" : "5056b3a465c4d702000000b5", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Vic just can't seem to catch a break. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Poor Clerval! What must have been his feelings? A meeting, which he anticipated with such joy, so strangely turned to bitterness. But I was not the witness of his grief, for I was lifeless and did not recover my senses for a long, long time.", "uuid" : "FE7904D1", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[19]", "startOffset" : 0, "end" : "/div[1]/p[19]", "endOffset" : 241, "_id" : { "$oid" : "5056b3a465c4d702000000b6" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347859364728 }, "created" : { "$date" : 1347859364728 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b3b665c4d702000000b7", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "demoniacal corpse", "uuid" : "6BF8A7AB", "_id" : { "$oid" : "5056b3b665c4d702000000b7" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [ "names" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 2110, "end" : "/div[1]/p[3]", "endOffset" : 2127, "_id" : { "$oid" : "5056b3b665c4d702000000b8" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347859382464 }, "created" : { "$date" : 1347859382464 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5056b3e565c4d702000000b9" }, "id" : "5056b3e565c4d702000000b9", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "There must be some sort of thematic connection between the professions of Henry and Victor that Shelley was trying to make a point of... But I can't quite put my finger on it. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "This was the commencement of a nervous fever which confined me for several months. During all that time Henry was my only nurse. I afterwards learned that, knowing my father's advanced age and unfitness for so long a journey, and how wretched my sickness would make Elizabeth, he spared them this grief by concealing the extent of my disorder. He knew that I could not have a more kind and attentive nurse than himself; and, firm in the hope he felt of my recovery, he did not doubt that, instead of doing harm, he performed the kindest action that he could towards them.", "uuid" : "16BA0B3C", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 0, "end" : "/div[1]/p[20]", "endOffset" : 571, "_id" : { "$oid" : "5056b3e565c4d702000000ba" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347859429334 }, "created" : { "$date" : 1347859429334 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b3f465c4d702000000bb", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "He is turned off simply by aesthetics?\nHow does frankenstein fail to be proud of his having unlocked the secret of life?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "No mortal could support the horror of that countenance", "uuid" : "1E06FEE3", "_id" : { "$oid" : "5056b3f465c4d702000000bb" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 4, "end" : "/div[1]/p[4]", "endOffset" : 58, "_id" : { "$oid" : "5056b3f465c4d702000000bc" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347859444153 }, "created" : { "$date" : 1347859444153 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5056b410fe243c0200000042" }, "id" : "5056b410fe243c0200000042", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "All better!", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "and in a short time I became as cheerful as before I was attacked by the fatal passion.", "uuid" : "FA58F240", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 496, "end" : "/div[1]/p[22]", "endOffset" : 583, "_id" : { "$oid" : "5056b410fe243c0200000043" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347859472211 }, "created" : { "$date" : 1347859472211 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b42465c4d702000000bd", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "The fact that he is actually living makes him more repulsive?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "but when those muscles and joints were rendered capable of motion, it became a thing such as even Dante could not have conceived.", "uuid" : "F9E97991", "_id" : { "$oid" : "5056b42465c4d702000000bd" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 191, "end" : "/div[1]/p[4]", "endOffset" : 320, "_id" : { "$oid" : "5056b42465c4d702000000be" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347859492021 }, "created" : { "$date" : 1347859492021 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b444fe243c0200000044", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "Fear", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "my pulse beat so quickly and hardly that I felt the palpitation of every artery", "uuid" : "60B0BBFA", "_id" : { "$oid" : "5056b444fe243c0200000044" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 40, "end" : "/div[1]/p[5]", "endOffset" : 120, "_id" : { "$oid" : "5056b444fe243c0200000045" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347859524860 }, "created" : { "$date" : 1347859524860 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b44cfe243c0200000046", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "disappointment", "uuid" : "A72FCF75", "_id" : { "$oid" : "5056b44cfe243c0200000046" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 249, "end" : "/div[1]/p[5]", "endOffset" : 264, "_id" : { "$oid" : "5056b44cfe243c0200000047" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347859532720 }, "created" : { "$date" : 1347859532720 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b4a6fe243c0200000048", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "Frankenstein's explanation of his motives.\nWhy does he feel this fear & guilt?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "endeavouring by bodily exercise to ease the load that weighed upon my mind", "uuid" : "E73670A6", "_id" : { "$oid" : "5056b4a6fe243c0200000048" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[7]", "startOffset" : 50, "end" : "/div[1]/p[7]", "endOffset" : 124, "_id" : { "$oid" : "5056b4a6fe243c0200000049" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347859622137 }, "created" : { "$date" : 1347859622137 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b4de65c4d702000000bf", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "His friend's arrival temporarily erases his anxiety", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Nothing could equal my delight on seeing Clerval", "uuid" : "3F3898E7", "_id" : { "$oid" : "5056b4de65c4d702000000bf" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 0, "end" : "/div[1]/p[11]", "endOffset" : 48, "_id" : { "$oid" : "5056b4de65c4d702000000c0" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347859678063 }, "created" : { "$date" : 1347859678063 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b92365c4d702000000c1", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "What is it about clerval that soothes victor so much?\nDoes he provide the mental escape that he is seeking?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I felt suddenly, and for the first time during many months, calm and serene joy", "uuid" : "91EF4054", "_id" : { "$oid" : "5056b92365c4d702000000c1" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 239, "end" : "/div[1]/p[11]", "endOffset" : 318, "_id" : { "$oid" : "5056b92365c4d702000000c2" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347860771694 }, "created" : { "$date" : 1347860771694 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b94efe243c020000004a", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "HOPE", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I hope, I sincerely hope, that all these employments are now at an end and that I am at length free", "uuid" : "4EFAD922", "_id" : { "$oid" : "5056b94efe243c020000004a" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 143, "end" : "/div[1]/p[14]", "endOffset" : 243, "_id" : { "$oid" : "5056b94efe243c020000004b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347860814565 }, "created" : { "$date" : 1347860814565 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b971fe243c020000004c", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "shame for what he has created?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I dreaded to behold this monster, but I feared still more that Henry should see him", "uuid" : "1B53AAC0", "_id" : { "$oid" : "5056b971fe243c020000004c" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 332, "end" : "/div[1]/p[15]", "endOffset" : 416, "_id" : { "$oid" : "5056b971fe243c020000004d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347860849223 }, "created" : { "$date" : 1347860849223 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b9a5fe243c020000004e", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "see other annotation tagged \"convulsion\"", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "a convulsive motion agitated its limbs", "uuid" : "A39C16ED", "_id" : { "$oid" : "5056b9a5fe243c020000004e" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [ "onvulsion" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 499, "end" : "/div[1]/p[1]", "endOffset" : 537, "_id" : { "$oid" : "5056b9a5fe243c020000004f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347860901171 }, "created" : { "$date" : 1347860901171 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056b9e365c4d702000000c3", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "similar to how the monster's birth was described...interesting point to explore, perhaps", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "every limb became convulsed", "uuid" : "97675FA9", "_id" : { "$oid" : "5056b9e365c4d702000000c3" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [ "convulsion" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1334, "end" : "/div[1]/p[3]", "endOffset" : 1361, "_id" : { "$oid" : "5056b9e365c4d702000000c4" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347860963672 }, "created" : { "$date" : 1347860963672 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056ba8465c4d702000000c5", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "Why is the monster all of a sudden victor's enemy?\nthe monster has no grudge against his creator--victor merely projects this feeling onto his creation\nwhich begs the question of whether victor subconsciously (or perhaps even consciously) views his act of creation as deserving of reprimand or reprisal", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "my enemy", "uuid" : "9E2EDC4A", "_id" : { "$oid" : "5056ba8465c4d702000000c5" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 1026, "end" : "/div[1]/p[15]", "endOffset" : 1034, "_id" : { "$oid" : "5056ba8465c4d702000000c6" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347861124314 }, "created" : { "$date" : 1347861124314 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5056baac65c4d702000000c7" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347861164169 }, "groups" : [ "21L.000J" ], "id" : "5056baac65c4d702000000c7", "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "quote" : "a wildness in my eyes", "ranges" : [ { "start" : "/div[1]/p[16]", "startOffset" : 470, "end" : "/div[1]/p[16]", "endOffset" : 492, "_id" : { "$oid" : "5056baac65c4d702000000c8" } } ], "tags" : [ "eyes" ], "text" : "insanity?\nor wildness in the sense of bestiality, and untamedness?", "updated" : { "$date" : 1347861222281 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "uuid" : "DA02EFD2" } -{ "id" : "5056baf565c4d702000000c9", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "\"HE can tell. Oh, save me! Save me!\" I imagined that the monster seized me; I struggled furiously and fell down in a fit", "uuid" : "508A5E0B", "_id" : { "$oid" : "5056baf565c4d702000000c9" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 120, "end" : "/div[1]/p[18]", "endOffset" : 240, "_id" : { "$oid" : "5056baf565c4d702000000ca" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347861237292 }, "created" : { "$date" : 1347861237292 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056bb7a65c4d702000000cb", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "Victor's \"rebirth\" occurs in the spring\nalso potentially a religious connection here", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I remember the first time I became capable of observing outward objects with any kind of pleasure, I perceived that the fallen leaves had disappeared and that the young buds were shooting forth from the trees that shaded my window. It was a divine spring, and the season contributed greatly to my convalescence. I felt also sentiments of joy and affection revive in my bosom; my gloom disappeared, and in a short time I became as cheerful as before I was attacked by the fatal passion.", "uuid" : "A1AEF5A6", "_id" : { "$oid" : "5056bb7a65c4d702000000cb" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 97, "end" : "/div[1]/p[22]", "endOffset" : 583, "_id" : { "$oid" : "5056bb7a65c4d702000000cc" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347861370208 }, "created" : { "$date" : 1347861370208 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056bb97fe243c0200000050", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "Still posessed by the fear of the monster", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I trembled. One subject! What could it be? Could he allude to an object on whom I dared not even think?", "uuid" : "36113831", "_id" : { "$oid" : "5056bb97fe243c0200000050" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[25]", "startOffset" : 0, "end" : "/div[1]/p[25]", "endOffset" : 103, "_id" : { "$oid" : "5056bb97fe243c0200000051" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347861399130 }, "created" : { "$date" : 1347861399130 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056c36465c4d702000000cd", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "... or hyper and diabetic. More misconceptions.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "and barley-sugar and such things that make children sweet-tempered", "uuid" : "5E84186F", "_id" : { "$oid" : "5056c36465c4d702000000cd" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 791, "end" : "/div[1]/div[4]", "endOffset" : 857, "_id" : { "$oid" : "5056c36465c4d702000000ce" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347863396014 }, "created" : { "$date" : 1347863396014 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056c4b7fe243c0200000052", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Why toils?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "toils.", "uuid" : "E50C4F77", "_id" : { "$oid" : "5056c4b7fe243c0200000052" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 76, "end" : "/div[1]/p[1]", "endOffset" : 82, "_id" : { "$oid" : "5056c4b7fe243c0200000053" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347863735460 }, "created" : { "$date" : 1347863735460 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5056c4df65c4d702000000cf", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "For a significant amount of time now this strange world has been systematically pulling at Alice's moors of stiff Victorian social etiquette. Yet, Alice still evaluates most every situation in the context of her understanding rules of social engagement, seemingly undeterred by the lack of efficacy in such an approach.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "she was exactly the right height to rest her chin upon Alice's\n\t\t\tshoulder, and it was an uncomfortably sharp chin. However, she did not like to be rude, so\n\t\t\tshe bore it as well as she could", "uuid" : "3567C881", "_id" : { "$oid" : "5056c4df65c4d702000000cf" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 1597, "end" : "/div[1]/div[4]", "endOffset" : 1789, "_id" : { "$oid" : "5056c4df65c4d702000000d0" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347863775364 }, "created" : { "$date" : 1347863775364 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5056c77ffe243c0200000054" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347864447526 }, "groups" : [ "21L.448J" ], "id" : "5056c77ffe243c0200000054", "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [ "chom@mit.edu" ] }, "quote" : "The other guests had taken advantage of the Queen's absence, and were resting in the\n\t\t\tshade: however, the moment they saw her, they hurried back to the game, the Queen merely\n\t\t\tremarking that a moment's delay would cost them their lives.", "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 5535, "end" : "/div[1]/div[4]", "endOffset" : 5776, "_id" : { "$oid" : "5056c77ffe243c0200000055" } } ], "tags" : [], "text" : "Once again, human laws and directives only exist in the presence of an enforcer to witness their execution. This draws an interesting parallel with a little truth-nugget from the Dutchess- \"Take care of the sense, and the sounds will take care of themselves.\"' While the sounds of the croquet game exist only while the Queen is around to hear them, crickets and birds and the like will sing regardless of who is around to hear them.", "updated" : { "$date" : 1347864555454 }, "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "user" : "chom@mit.edu", "username" : "Colin H.", "uuid" : "B13E0592" } -{ "id" : "50570935fe243c0200000056", "user" : "alex93@mit.edu", "username" : "Alexander O.", "text" : "Alice has definitely shown a change since her first moments in Wonderland. Now, she's not afraid to stand up to the authority, even though she still doesn't quite understand the rules of Wonderland.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`Well, I shan't go, at any rate,' said Alice: `besides, that's not a regular rule: you\n\t\t\tinvented it just now.' \n\t\t\t\n\t\t\t`It's the oldest rule in the book,' said the King. \n\t\t\t\n\t\t\t`Then it ought to be Number One,' said Alice.", "uuid" : "66E7F0F0", "_id" : { "$oid" : "50570935fe243c0200000056" }, "permissions" : { "delete" : [ "alex93@mit.edu" ], "update" : [ "alex93@mit.edu" ], "admin" : [ "alex93@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 3063, "end" : "/div[1]/div[6]", "endOffset" : 3289, "_id" : { "$oid" : "50570935fe243c0200000057" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347881269560 }, "created" : { "$date" : 1347881269560 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057095e65c4d702000000d1", "user" : "samin@mit.edu", "username" : "Samin H.", "text" : "Do we pay attention when we speak?", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "se, I meant,' the King hastily said, and went on to himself in an\n\t\t\tundertone, `important--unimportant-- unimportant--important--' as if he were trying which\n\t\t\tword sounded best.", "uuid" : "0B4AFBF6", "_id" : { "$oid" : "5057095e65c4d702000000d1" }, "permissions" : { "delete" : [ "samin@mit.edu" ], "update" : [ "samin@mit.edu" ], "admin" : [ "samin@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 2281, "end" : "/div[1]/div[6]", "endOffset" : 2462, "_id" : { "$oid" : "5057095e65c4d702000000d2" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347881310288 }, "created" : { "$date" : 1347881310288 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057098e65c4d702000000d3", "user" : "samin@mit.edu", "username" : "Samin H.", "text" : "Alice seeking logic behind rules", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "`It's the oldest rule in the book,' said the King. \n\t\t\t\n\t\t\t`Then it ought to be Number One,' said Alice.", "uuid" : "59A983B2", "_id" : { "$oid" : "5057098e65c4d702000000d3" }, "permissions" : { "delete" : [ "samin@mit.edu" ], "update" : [ "samin@mit.edu" ], "admin" : [ "samin@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 3184, "end" : "/div[1]/div[6]", "endOffset" : 3289, "_id" : { "$oid" : "5057098e65c4d702000000d4" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347881358705 }, "created" : { "$date" : 1347881358705 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505709f9fe243c0200000058", "user" : "alex93@mit.edu", "username" : "Alexander O.", "text" : "Wonderland is constantly showing ways in which logic really doesn't work there how it does in our world, as seen through this example.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "If you didn't sign it,' said the King, `that only makes the matter worse. You MUST have\n\t\t\tmeant some mischief, or else you'd have signed your name like an honest man.", "uuid" : "D80D551D", "_id" : { "$oid" : "505709f9fe243c0200000058" }, "permissions" : { "delete" : [ "alex93@mit.edu" ], "update" : [ "alex93@mit.edu" ], "admin" : [ "alex93@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 4606, "end" : "/div[1]/div[6]", "endOffset" : 4773, "_id" : { "$oid" : "505709f9fe243c0200000059" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347881465099 }, "created" : { "$date" : 1347881465099 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057154665c4d702000000d5", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "hard effort", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "deprived myself of rest and health", "uuid" : "91131B3B", "_id" : { "$oid" : "5057154665c4d702000000d5" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 204, "end" : "/div[1]/p[3]", "endOffset" : 238, "_id" : { "$oid" : "5057154665c4d702000000d6" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347884358737 }, "created" : { "$date" : 1347884358737 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057159e65c4d702000000d7", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "didn't turn out how he had planned", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "the beauty of the dream vanished", "uuid" : "C2257A9C", "_id" : { "$oid" : "5057159e65c4d702000000d7" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 331, "end" : "/div[1]/p[3]", "endOffset" : 363, "_id" : { "$oid" : "5057159e65c4d702000000d8" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347884446832 }, "created" : { "$date" : 1347884446832 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505715d565c4d702000000d9", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "just achieved his biggest goal and he wants to take a nap?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "unable to compose my mind to sleep", "uuid" : "8482F876", "_id" : { "$oid" : "505715d565c4d702000000d9" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 550, "end" : "/div[1]/p[3]", "endOffset" : 584, "_id" : { "$oid" : "505715d565c4d702000000da" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347884501446 }, "created" : { "$date" : 1347884501446 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505715f365c4d702000000db", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "dreams often revealing of true character/desiers", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "seek a few moments of forgetfulness", "uuid" : "35410820", "_id" : { "$oid" : "505715f365c4d702000000db" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 712, "end" : "/div[1]/p[3]", "endOffset" : 748, "_id" : { "$oid" : "505715f365c4d702000000dc" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347884531169 }, "created" : { "$date" : 1347884531169 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057160afe243c020000005a", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "deepest desire", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Elizabeth, in the bloom of healt", "uuid" : "AC20B3D2", "_id" : { "$oid" : "5057160afe243c020000005a" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 846, "end" : "/div[1]/p[3]", "endOffset" : 878, "_id" : { "$oid" : "5057160afe243c020000005b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347884554003 }, "created" : { "$date" : 1347884554003 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057162065c4d702000000dd", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "freud", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I held the corpse of my dead mother in my arms", "uuid" : "828C91C7", "_id" : { "$oid" : "5057162065c4d702000000dd" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1100, "end" : "/div[1]/p[3]", "endOffset" : 1146, "_id" : { "$oid" : "5057162065c4d702000000de" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347884576588 }, "created" : { "$date" : 1347884576588 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50571647fe243c020000005c", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "just wanted to speak to his creator", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "His jaws opened, and he muttered some inarticulate sounds, while a grin wrinkled his cheeks", "uuid" : "AF9BDD20", "_id" : { "$oid" : "50571647fe243c020000005c" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1618, "end" : "/div[1]/p[3]", "endOffset" : 1709, "_id" : { "$oid" : "50571647fe243c020000005d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347884615871 }, "created" : { "$date" : 1347884615871 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057167d65c4d702000000df", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "hates his own creation", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "No mortal could support the horror of that countenance. A mummy again endued with animation could not be so hideous as that wretch", "uuid" : "F2D282B4", "_id" : { "$oid" : "5057167d65c4d702000000df" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 4, "end" : "/div[1]/p[4]", "endOffset" : 134, "_id" : { "$oid" : "5057167d65c4d702000000e0" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347884669654 }, "created" : { "$date" : 1347884669654 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057168bfe243c020000005e", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "allusion", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Dante", "uuid" : "3CB48CBA", "_id" : { "$oid" : "5057168bfe243c020000005e" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 289, "end" : "/div[1]/p[4]", "endOffset" : 294, "_id" : { "$oid" : "5057168bfe243c020000005f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347884683017 }, "created" : { "$date" : 1347884683017 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505716f2fe243c0200000060", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "extreme disappointment, Frankenstein is being annoying/ self centered, doesn't even care that his creature is like a new born child and needs love", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I felt the bitterness of disappointment; dreams that had been my food and pleasant rest for so long a space were now become a hell to me; and the change was so rapid, the overthrow so complete!", "uuid" : "616308E7", "_id" : { "$oid" : "505716f2fe243c0200000060" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 225, "end" : "/div[1]/p[5]", "endOffset" : 418, "_id" : { "$oid" : "505716f2fe243c0200000061" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347884786628 }, "created" : { "$date" : 1347884786628 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057172065c4d702000000e1", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "ashamed, doesn't want to be associated with creation", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "pacing them with quick steps, as if I sought to avoid the wretch whom I feared every turning of the street would present to my view", "uuid" : "0671433E", "_id" : { "$oid" : "5057172065c4d702000000e1" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 286, "end" : "/div[1]/p[6]", "endOffset" : 417, "_id" : { "$oid" : "5057172065c4d702000000e2" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347884832293 }, "created" : { "$date" : 1347884832293 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057173a65c4d702000000e3", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "weather fits mood of events, like it always does in movies", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "drenched by the rain which poured from a black and comfortless sky", "uuid" : "D52CF79D", "_id" : { "$oid" : "5057173a65c4d702000000e3" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 517, "end" : "/div[1]/p[6]", "endOffset" : 583, "_id" : { "$oid" : "5057173a65c4d702000000e4" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347884858299 }, "created" : { "$date" : 1347884858299 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505717a1fe243c0200000062", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "lost himself, his guide", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I traversed the streets without any clear conception of where I was or what I was doing", "uuid" : "B8E7AFEF", "_id" : { "$oid" : "505717a1fe243c0200000062" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[7]", "startOffset" : 126, "end" : "/div[1]/p[7]", "endOffset" : 213, "_id" : { "$oid" : "505717a1fe243c0200000063" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347884961233 }, "created" : { "$date" : 1347884961233 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "505717b865c4d702000000e5" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347884984867 }, "groups" : [ "21L.000J" ], "id" : "505717b865c4d702000000e5", "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "quote" : "Like one who, on a lonely road, Doth walk in fear and dread, And, having once turned round, walks on, And turns no more his head; Because he knows a frightful fiend Doth close behind him tread.", "ranges" : [ { "start" : "/div[1]/p[8]", "startOffset" : 0, "end" : "/div[1]/p[8]", "endOffset" : 193, "_id" : { "$oid" : "505717b865c4d702000000e6" } } ], "tags" : [], "text" : "rhyme of the ancient mariner reference", "updated" : { "$date" : 1347884990310 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "daniman@mit.edu", "username" : "Danielle M.", "uuid" : "EC684611" } -{ "id" : "505717ecfe243c0200000064", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "desires to be normal, perhaps fears the wrath the creature will bring on other innocent people", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "my eyes fixed on a coach that was coming towards me from the other end of the street", "uuid" : "A6901834", "_id" : { "$oid" : "505717ecfe243c0200000064" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 181, "end" : "/div[1]/p[10]", "endOffset" : 265, "_id" : { "$oid" : "505717ecfe243c0200000065" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347885036165 }, "created" : { "$date" : 1347885036165 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50571815fe243c0200000066", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "true companion", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I felt suddenly, and for the first time during many months, calm and serene joy", "uuid" : "841D0A00", "_id" : { "$oid" : "50571815fe243c0200000066" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 238, "end" : "/div[1]/p[11]", "endOffset" : 318, "_id" : { "$oid" : "50571815fe243c0200000067" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347885077557 }, "created" : { "$date" : 1347885077557 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057185365c4d702000000e7", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "clerval makes him feel normal, brings companionship to the lonliness", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "how great was the difficulty to persuade my father that all necessary knowledge was not comprised in the noble art of book-keeping", "uuid" : "A2AC5151", "_id" : { "$oid" : "5057185365c4d702000000e7" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 583, "end" : "/div[1]/p[11]", "endOffset" : 713, "_id" : { "$oid" : "5057185365c4d702000000e8" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347885139231 }, "created" : { "$date" : 1347885139231 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50571873fe243c0200000068", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "everyone cares about victor, he only seems to care about himself", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Very well, and very happy, only a little uneasy that they hear from you so seldom", "uuid" : "9AC29F70", "_id" : { "$oid" : "50571873fe243c0200000068" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 1, "end" : "/div[1]/p[13]", "endOffset" : 82, "_id" : { "$oid" : "50571873fe243c0200000069" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347885171905 }, "created" : { "$date" : 1347885171905 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057189dfe243c020000006a", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "monster sucked nutrients out of him, similar to a baby and mother", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I did not before remark how very ill you appear; so thin and pale; you look as if you had been watching for several nights", "uuid" : "52275C76", "_id" : { "$oid" : "5057189dfe243c020000006a" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 239, "end" : "/div[1]/p[13]", "endOffset" : 361, "_id" : { "$oid" : "5057189dfe243c020000006b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347885213517 }, "created" : { "$date" : 1347885213517 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505718c5fe243c020000006c", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "reminded of reality", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I trembled excessively; I could not endure to think of, and far less to allude to, the occurrences of the preceding night", "uuid" : "CDC518F9", "_id" : { "$oid" : "505718c5fe243c020000006c" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 0, "end" : "/div[1]/p[15]", "endOffset" : 121, "_id" : { "$oid" : "505718c5fe243c020000006d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347885253732 }, "created" : { "$date" : 1347885253732 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505718e565c4d702000000e9", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "ashamed, doesn't want family to know what he has done", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I dreaded to behold this monster, but I feared still more that Henry should see him.", "uuid" : "664A3EDD", "_id" : { "$oid" : "505718e565c4d702000000e9" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 332, "end" : "/div[1]/p[15]", "endOffset" : 417, "_id" : { "$oid" : "505718e565c4d702000000ea" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347885285314 }, "created" : { "$date" : 1347885285314 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50571908fe243c020000006e", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "he is acting like a child", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I threw the door forcibly open, as children are accustomed to do when they expect a spectre to stand in waiting for them on the other side; but nothing appeared", "uuid" : "4DA4F84C", "_id" : { "$oid" : "50571908fe243c020000006e" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 654, "end" : "/div[1]/p[15]", "endOffset" : 814, "_id" : { "$oid" : "50571908fe243c020000006f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347885320710 }, "created" : { "$date" : 1347885320710 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057192bfe243c0200000070", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "he made the monster his enemy, the monster was not born his enemy", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "but when I became assured that my enemy had indeed fle", "uuid" : "382792EA", "_id" : { "$oid" : "5057192bfe243c0200000070" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 995, "end" : "/div[1]/p[15]", "endOffset" : 1049, "_id" : { "$oid" : "5057192bfe243c0200000071" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347885355559 }, "created" : { "$date" : 1347885355559 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057194efe243c0200000072", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "victors emotions are so extreme, intense", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "It was not joy only that possessed me", "uuid" : "08CF6D0B", "_id" : { "$oid" : "5057194efe243c0200000072" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[16]", "startOffset" : 107, "end" : "/div[1]/p[16]", "endOffset" : 144, "_id" : { "$oid" : "5057194efe243c0200000073" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347885390445 }, "created" : { "$date" : 1347885390445 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50571b4165c4d702000000eb", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "eyes seem to be very revealing", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "he saw a wildness in my eyes", "uuid" : "77F3A885", "_id" : { "$oid" : "50571b4165c4d702000000eb" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[16]", "startOffset" : 463, "end" : "/div[1]/p[16]", "endOffset" : 492, "_id" : { "$oid" : "50571b4165c4d702000000ec" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347885889472 }, "created" : { "$date" : 1347885889472 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50571be1fe243c0200000074" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347886049221 }, "groups" : [ "21L.000J" ], "id" : "50571be1fe243c0200000074", "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "quote" : "Do not laugh in that manner. How ill you are! What is the cause of all this?\"", "ranges" : [ { "start" : "/div[1]/p[17]", "startOffset" : 66, "end" : "/div[1]/p[17]", "endOffset" : 143, "_id" : { "$oid" : "50571be1fe243c0200000075" } } ], "tags" : [], "text" : "victors 'mental illness' has translated into physical illness", "updated" : { "$date" : 1347886073411 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "daniman@mit.edu", "username" : "Danielle M.", "uuid" : "FFE2F9E0" } -{ "id" : "50571c1ffe243c0200000076", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "hallucinating", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "HE can tell. Oh, save me! Save me!", "uuid" : "4E911C5E", "_id" : { "$oid" : "50571c1ffe243c0200000076" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 121, "end" : "/div[1]/p[18]", "endOffset" : 155, "_id" : { "$oid" : "50571c1ffe243c0200000077" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347886111061 }, "created" : { "$date" : 1347886111061 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50571c3a65c4d702000000ed", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "Frankenstein turns everything around him bitter", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "A meeting, which he anticipated with such joy, so strangely turned to bitterness", "uuid" : "34CE0E97", "_id" : { "$oid" : "50571c3a65c4d702000000ed" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[19]", "startOffset" : 47, "end" : "/div[1]/p[19]", "endOffset" : 128, "_id" : { "$oid" : "50571c3a65c4d702000000ee" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347886138091 }, "created" : { "$date" : 1347886138091 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50571c5765c4d702000000ef", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "he has many fevers", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "This was the commencement of a nervous fever which confined me for several months", "uuid" : "468BC52D", "_id" : { "$oid" : "50571c5765c4d702000000ef" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 0, "end" : "/div[1]/p[20]", "endOffset" : 81, "_id" : { "$oid" : "50571c5765c4d702000000f0" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347886167473 }, "created" : { "$date" : 1347886167473 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50571c6cfe243c0200000078", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "everyone cares about him so much and he doesn't really care about any of them", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Henry was my only nurse", "uuid" : "F373F973", "_id" : { "$oid" : "50571c6cfe243c0200000078" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 104, "end" : "/div[1]/p[20]", "endOffset" : 127, "_id" : { "$oid" : "50571c6cfe243c0200000079" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347886188621 }, "created" : { "$date" : 1347886188621 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50571c8f65c4d702000000f1", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "so kind to Frankenstein", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "He knew that I could not have a more kind and attentive nurse than himself", "uuid" : "6BAAA45D", "_id" : { "$oid" : "50571c8f65c4d702000000f1" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 344, "end" : "/div[1]/p[20]", "endOffset" : 418, "_id" : { "$oid" : "50571c8f65c4d702000000f2" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347886223666 }, "created" : { "$date" : 1347886223666 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50571cbdfe243c020000007a", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "why create something you only wish to destroy?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "The form of the monster on whom I had bestowed existence was forever before my eyes, and I raved incessantly concerning him", "uuid" : "6EF1137F", "_id" : { "$oid" : "50571cbdfe243c020000007a" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 140, "end" : "/div[1]/p[21]", "endOffset" : 263, "_id" : { "$oid" : "50571cbdfe243c020000007b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347886269272 }, "created" : { "$date" : 1347886269272 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50571cf165c4d702000000f3", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "thats how the monsters creation came to life", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "wanderings of my disturbed imagination", "uuid" : "089C5694", "_id" : { "$oid" : "50571cf165c4d702000000f3" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 336, "end" : "/div[1]/p[21]", "endOffset" : 375, "_id" : { "$oid" : "50571cf165c4d702000000f4" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347886321376 }, "created" : { "$date" : 1347886321376 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50571d3bfe243c020000007c", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "attacked by a fatal poison which he created", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "attacked by the fatal passio", "uuid" : "C79CFED6", "_id" : { "$oid" : "50571d3bfe243c020000007c" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 553, "end" : "/div[1]/p[22]", "endOffset" : 581, "_id" : { "$oid" : "50571d3bfe243c020000007d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347886395198 }, "created" : { "$date" : 1347886395198 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50571d64fe243c020000007e", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "the birth of the monster has re-birthed Frankenstein", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I remember the first time I became capable of observing outward objects with any kind of pleasure", "uuid" : "3F2A79BC", "_id" : { "$oid" : "50571d64fe243c020000007e" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 97, "end" : "/div[1]/p[22]", "endOffset" : 195, "_id" : { "$oid" : "50571d64fe243c020000007f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347886436946 }, "created" : { "$date" : 1347886436946 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50571d8165c4d702000000f5", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "weather opposite of what it was on the monsters creation day", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "divine spring", "uuid" : "4045C980", "_id" : { "$oid" : "50571d8165c4d702000000f5" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 339, "end" : "/div[1]/p[22]", "endOffset" : 352, "_id" : { "$oid" : "50571d8165c4d702000000f6" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347886465160 }, "created" : { "$date" : 1347886465160 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50571db065c4d702000000f7", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "\"Dearest Clerval,\" exclaimed I, \"how kind, how very good you are to me. This whole winter, instead of being spent in study, as you promised yourself, has been consumed in my sick room", "uuid" : "4A1D0204", "_id" : { "$oid" : "50571db065c4d702000000f7" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[23]", "startOffset" : 0, "end" : "/div[1]/p[23]", "endOffset" : 183, "_id" : { "$oid" : "50571db065c4d702000000f8" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347886512931 }, "created" : { "$date" : 1347886512931 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50571dcafe243c0200000080", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "he will fall ill again, many times", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "You will repay me entirely if you do not discompose yourself", "uuid" : "C5907D8A", "_id" : { "$oid" : "50571dcafe243c0200000080" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 1, "end" : "/div[1]/p[24]", "endOffset" : 61, "_id" : { "$oid" : "50571dcafe243c0200000081" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347886538323 }, "created" : { "$date" : 1347886538323 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50571deefe243c0200000082" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347886574253 }, "groups" : [ "21L.000J" ], "id" : "50571deefe243c0200000082", "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "quote" : "One subject", "ranges" : [ { "start" : "/div[1]/p[25]", "startOffset" : 12, "end" : "/div[1]/p[25]", "endOffset" : 23, "_id" : { "$oid" : "50571deefe243c0200000083" } } ], "tags" : [], "text" : "so self absorbed, no body even knows about the monsters existence", "updated" : { "$date" : 1347886591830 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "daniman@mit.edu", "username" : "Danielle M.", "uuid" : "D10E2D18" } -{ "id" : "50571e2365c4d702000000f9", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "so deserving but not receiving, his first thought was not of his family", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "\"Is that all, my dear Henry? How could you suppose that my first thought would not fly towards those dear, dear friends whom I love and who are so deserving of my love", "uuid" : "3F2C1BF4", "_id" : { "$oid" : "50571e2365c4d702000000f9" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[26]", "startOffset" : 0, "end" : "/div[1]/p[26]", "endOffset" : 167, "_id" : { "$oid" : "50571e2365c4d702000000fa" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347886632977 }, "created" : { "$date" : 1347886627869 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057294afe243c0200000084", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Wordsworthian", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-8-9-11-12", "quote" : "Lastly, she pictured to herself how this same little sister of hers would, in the\n\t\t\tafter-time, be herself a grown woman; and how she would keep, through all her riper years,\n\t\t\tthe simple and loving heart of her childhood: and how she would gather about her other\n\t\t\tlittle children, and make THEIR eyes bright and eager with many a strange tale, perhaps\n\t\t\teven with the dream of Wonderland of long ago: and how she would feel with all their\n\t\t\tsimple sorrows, and find a pleasure in all their simple joys, remembering her own\n\t\t\tchild-life, and the happy summer days.", "uuid" : "079012FD", "_id" : { "$oid" : "5057294afe243c0200000084" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 11827, "end" : "/div[1]/div[6]", "endOffset" : 12399, "_id" : { "$oid" : "5057294afe243c0200000085" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1347889482644 }, "created" : { "$date" : 1347889482644 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50576a2bfe243c0200000086" }, "__v" : 1, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347906091368 }, "groups" : [ "21L.003" ], "id" : "50576a2bfe243c0200000086", "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "quote" : "es, novels; for I will not\n\nadopt that ungenerous and impolitic custom so common with novel-writers,\n\nof degrading by their contemptuous censure the very performances, to the\n\nnumber of which they are themselves adding—joining with their greatest\n\nenemies in bestowing the harshest epithets on such works, and scarcely\n\never permitting them to be read by their own heroine, who, if she\n\naccidentally take up a novel, is sure to turn over its insipid pages\n\nwith disgust. Alas! If the heroine of one novel be not patronized by the\n\nheroine of another, from whom can she expect protection and regard? I\n\ncannot approve of it. Let us leave it to the reviewers to abuse such\n\neffusions of fancy at their leisure, and over every new novel to talk in\n\nthreadbare strains of the trash with which the press now groans. Let us\n\nnot desert one another; we are an injured body. Although our productions\n\nhave afforded more extensive and unaffected pleasure than those of any\n\nother literary corporation in the world, no species of composition has\n\nbeen so much decried. From pride, ignorance, or fashion, our foes\n\nare almost as many as our readers. And while the abilities of the\n\nnine-hundredth abridger of the History of England, or of the man who\n\ncollects and publishes in a volume some dozen lines of Milton, Pope, and\n\nPrior, with a paper from the Spectator, and a chapter from Sterne,\n\nare eulogized by a thousand pens—there seems almost a general wish of\n\ndecrying the capacity and undervaluing the labour of the novelist, and\n\nof slighting the performances which have only genius, wit, and taste to\n\nrecommend them. \"I am no novel-reader—I seldom look into novels—Do not\n\nimagine that I often read novels—It is really very well for a novel.\"\n\nSuch is the common cant. \"And what are you reading, Miss—?\" \"Oh! It is\n\nonly a novel!\" replies the young lady, while she lays down her book\n\nwith affected indifference, or momentary shame. \"It is only Cecilia, or\n\nCamilla, or Belinda\"; or, in short, only some work in which the greatest\n\npowers of the mind are displayed, in which the most thorough knowledge\n\nof human nature, the happiest delineation of its varieties, the\n\nliveliest effusions of wit and humour, are conveyed to the world in the\n\nbest-chosen language. Now, had the same young lady been engaged with a\n\nvolume of the Spectator, instead of such a work, how proudly would she\n\nhave produced the book, and told its name; though the chances must be\n\nagainst her being occupied by any part of that voluminous publication,\n\nof which either the matter or manner would not disgust a young person of\n\ntaste: the substance of its papers so often consisting in the statement\n\nof improbable circumstances, unnatural characters, and topics of\n\nconversation which no longer concern anyone living; and their language,\n\ntoo, frequently so coarse as to give no very favourable idea of the age\n\nthat could endure it.", "ranges" : [ { "start" : "/div[1]/p[104]", "startOffset" : 623, "end" : "/div[1]/p[104]", "endOffset" : 3530, "_id" : { "$oid" : "50576a2bfe243c0200000087" } } ], "tags" : [ "http://www.nvcc.edu/home/ataormina/novels/history/origins.htm" ], "text" : "The narrator's view on novels written out about how the narrator believes novels to be just as important, if not more as other works of writing. I wonder why Austen included this? Also wonder if the narrator is supposed to be Austen? This got me curious on when novels first came about. Apparently only in the 18th century. http://www.nvcc.edu/home/ataormina/novels/history/origins.htm", "updated" : { "$date" : 1348101545864 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "slonaker@mit.edu", "username" : "James S.", "uuid" : "B71A1089" } -{ "id" : "505778a865c4d702000000fb", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "Page 16: Object: Journal: Catherine does not have one, but, in general, ladies do. It sets her from the other women about her, and also brings to light her lack of etiquette savvy-ness", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "journal", "uuid" : "42E16FB5", "_id" : { "$oid" : "505778a865c4d702000000fb" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [ "Object", "Journal" ], "ranges" : [ { "start" : "/div[1]/p[66]", "startOffset" : 27, "end" : "/div[1]/p[66]", "endOffset" : 34, "_id" : { "$oid" : "505778a865c4d702000000fc" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347909800454 }, "created" : { "$date" : 1347909800454 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505778cdfe243c020000008a" }, "id" : "505778cdfe243c020000008a", "user" : "cjahn@mit.edu", "username" : "Chantal J.", "text" : "Zeigt dass das lernen einer Sprache nicht nur von Grammatik und Übung abhängt, sondern auch von prägenden Erinnerungen.", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Ich verdanke also mein Gefühl für die deutsche Sprache dem Halbdunkel und dem Geschmack von Kaffee und Kuchen, vorzugsweise Apfelkuchen.", "uuid" : "94C51126", "permissions" : { "delete" : [ "cjahn@mit.edu" ], "update" : [ "cjahn@mit.edu" ], "admin" : [ "cjahn@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[24]", "startOffset" : 0, "end" : "/div[1]/div[1]/p[24]", "endOffset" : 137, "_id" : { "$oid" : "505778cdfe243c020000008b" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347909837951 }, "created" : { "$date" : 1347909837951 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50577a7665c4d702000000ff" }, "id" : "50577a7665c4d702000000ff", "user" : "cjahn@mit.edu", "username" : "Chantal J.", "text" : "Ohne Kauderwelsch ist jede Sprache klar vertreten / bleibt seine eigenen Sprache", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Eine zweisprachige Wohnung mit geregelten Grenzen, die mich zu einem zweisprachigen Menschen gemacht hat.", "uuid" : "30B2B050", "permissions" : { "delete" : [ "cjahn@mit.edu" ], "update" : [ "cjahn@mit.edu" ], "admin" : [ "cjahn@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[27]", "startOffset" : 73, "end" : "/div[1]/div[1]/p[27]", "endOffset" : 179, "_id" : { "$oid" : "50577a7665c4d70200000100" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347910262302 }, "created" : { "$date" : 1347910262302 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50577af165c4d70200000101" }, "__v" : 1, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347910385842 }, "groups" : [ "21F.414" ], "id" : "50577af165c4d70200000101", "permissions" : { "delete" : [ "cjahn@mit.edu" ], "update" : [ "cjahn@mit.edu" ], "admin" : [ "cjahn@mit.edu" ], "read" : [] }, "quote" : "Deutsch und Türkisch vertragen sich wunderbar, wenn sie eine Heimat haben, ein eigenes Territorium.", "ranges" : [ { "start" : "/div[1]/div[1]/p[30]", "startOffset" : 0, "end" : "/div[1]/div[1]/p[30]", "endOffset" : 99, "_id" : { "$oid" : "50577bc565c4d70200000103" } } ], "tags" : [], "text" : "Sprachgrenzen waren bis jetzt abhängig von geographischen Grenzen.", "updated" : { "$date" : 1347910597105 }, "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "user" : "cjahn@mit.edu", "username" : "Chantal J.", "uuid" : "C3C16DCD" } -{ "_id" : { "$oid" : "50577b4dfe243c020000008c" }, "id" : "50577b4dfe243c020000008c", "user" : "cjahn@mit.edu", "username" : "Chantal J.", "text" : "Eine Sprache zu kennen ist eine Heimat zu haben / sich komplett wohl fühlen zu können in dem Gedanken dass man sich klar ausdrücken kann und verstanden wird.", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Ohne Grenzen gibt es keine Geborgenheit", "uuid" : "E6E5DE42", "permissions" : { "delete" : [ "cjahn@mit.edu" ], "update" : [ "cjahn@mit.edu" ], "admin" : [ "cjahn@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[28]", "startOffset" : 215, "end" : "/div[1]/div[1]/p[28]", "endOffset" : 254, "_id" : { "$oid" : "50577b4dfe243c020000008d" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347910477767 }, "created" : { "$date" : 1347910477767 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50577bbefe243c0200000090" }, "id" : "50577bbefe243c0200000090", "user" : "cjahn@mit.edu", "username" : "Chantal J.", "text" : "Sprache als etwas konkretes", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Es ist eine Berührung des Bewusst-seins.", "uuid" : "C8C3336C", "permissions" : { "delete" : [ "cjahn@mit.edu" ], "update" : [ "cjahn@mit.edu" ], "admin" : [ "cjahn@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[33]", "startOffset" : 391, "end" : "/div[1]/div[1]/p[33]", "endOffset" : 432, "_id" : { "$oid" : "50577bbefe243c0200000091" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347910590740 }, "created" : { "$date" : 1347910590740 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50577c68fe243c0200000092" }, "id" : "50577c68fe243c0200000092", "user" : "cjahn@mit.edu", "username" : "Chantal J.", "text" : "Ein echtes Gefühl für eine Sprache kann nur durch auch kulturelle Erfahrungen entwickelt werden.", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Sprachgefühl kann nicht erlernt, aber empathisch erworben werden. Mit der Fähigkeit, sich in andere hineinzuversetzen, verliert das Eigene den Charakter einer Festung.", "uuid" : "57AC9089", "permissions" : { "delete" : [ "cjahn@mit.edu" ], "update" : [ "cjahn@mit.edu" ], "admin" : [ "cjahn@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[38]", "startOffset" : 0, "end" : "/div[1]/div[1]/p[38]", "endOffset" : 168, "_id" : { "$oid" : "50577c68fe243c0200000093" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347910760238 }, "created" : { "$date" : 1347910760238 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50577c9bfe243c0200000094" }, "id" : "50577c9bfe243c0200000094", "user" : "cjahn@mit.edu", "username" : "Chantal J.", "text" : "Wenn sich Sprachen vermischen dann kann man für weder eine noch die andere ein Sprachgefühl behalten und man fängt an sich verloren zu fühlen. ", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Denn was im Sprachengewirr verloren geht, ist die Fähigkeit zum Übersetzen", "uuid" : "5AD5D5F7", "permissions" : { "delete" : [ "cjahn@mit.edu" ], "update" : [ "cjahn@mit.edu" ], "admin" : [ "cjahn@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[41]", "startOffset" : 358, "end" : "/div[1]/div[1]/p[41]", "endOffset" : 433, "_id" : { "$oid" : "50577c9bfe243c0200000095" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1347910811442 }, "created" : { "$date" : 1347910811442 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5057a10bd265cb0200000003" }, "__v" : 2, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347920139938 }, "groups" : [ "21L.003" ], "id" : "5057a10bd265cb0200000003", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "quote" : "Yes, I went to the pump-room as soon as you were gone, and there I met\n\nher, and we had a great deal of talk together. She says there was hardly\n\nany veal to be got at market this morning, it is so uncommonly scarce", "ranges" : [ { "start" : "/div[1]/p[278]", "startOffset" : 3, "end" : "/div[1]/p[278]", "endOffset" : 218, "_id" : { "$oid" : "5057a10bd265cb0200000004" } } ], "tags" : [ "conversation", "pump", "room" ], "text" : "Pump room used for causal conversation", "updated" : { "$date" : 1347920588833 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "uuid" : "1CF79C54" } -{ "id" : "5057a147d265cb0200000005", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "She did never say yes...", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Something was said about it, I remember,\" said Catherine, looking at\n\nMrs. Allen for her opinion; \"but really I did not expect you.\"", "uuid" : "D6345D41", "_id" : { "$oid" : "5057a147d265cb0200000005" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[244]", "startOffset" : 3, "end" : "/div[1]/p[244]", "endOffset" : 135, "_id" : { "$oid" : "5057a147d265cb0200000006" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347920199315 }, "created" : { "$date" : 1347920199315 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5057a15bd265cb0200000007" }, "__v" : 1, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347920219601 }, "groups" : [ "21L.003" ], "id" : "5057a15bd265cb0200000007", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "quote" : "and the pump-room to be\n\nattended, where they paraded up and down for an hour, looking at\n\neverybody and speaking to no one. The wish of a numerous acquaintance\n\nin Bath was still uppermost with Mrs. Allen, and she repeated it after\n\nevery fresh proof, which every morning brought, of her knowing nobody at\n\nall.", "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 117, "end" : "/div[1]/p[42]", "endOffset" : 429, "_id" : { "$oid" : "5057a15bd265cb0200000008" } } ], "tags" : [ "social", "pump", "room" ], "text" : "Used to comment on people", "updated" : { "$date" : 1347920576447 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "uuid" : "3189C958" } -{ "id" : "5057a1bcd265cb0200000009", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "There is a theme of control going on here", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "but he will soon know his master", "uuid" : "927F95ED", "_id" : { "$oid" : "5057a1bcd265cb0200000009" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[249]", "startOffset" : 230, "end" : "/div[1]/p[249]", "endOffset" : 262, "_id" : { "$oid" : "5057a1bcd265cb020000000a" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347920316524 }, "created" : { "$date" : 1347920316524 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5057a21cfe243c0200000097" }, "__v" : 1, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347920412138 }, "groups" : [ "21L.003" ], "id" : "5057a21cfe243c0200000097", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "quote" : "Their increasing attachment was not to be\n\nsatisfied with half a dozen turns in the pump-room, but required, when\n\nthey all quitted it together,", "ranges" : [ { "start" : "/div[1]/p[98]", "startOffset" : 1085, "end" : "/div[1]/p[98]", "endOffset" : 1229, "_id" : { "$oid" : "5057a21cfe243c0200000098" } } ], "tags" : [ "pump", "room" ], "text" : "time for acquaintances", "updated" : { "$date" : 1347920563239 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "uuid" : "AF319ABF" } -{ "id" : "5057a249fe243c0200000099", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "the important phrase here is \"called on,\" the ideas are not her own", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "was called on to admire", "uuid" : "7C458A06", "_id" : { "$oid" : "5057a249fe243c0200000099" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[267]", "startOffset" : 79, "end" : "/div[1]/p[267]", "endOffset" : 102, "_id" : { "$oid" : "5057a249fe243c020000009a" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347920457704 }, "created" : { "$date" : 1347920457704 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057a260d265cb020000000b", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "He is leading in the admiration of himself", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "ollowed him in all\n\nhis admiration", "uuid" : "9CC0BB19", "_id" : { "$oid" : "5057a260d265cb020000000b" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[267]", "startOffset" : 272, "end" : "/div[1]/p[267]", "endOffset" : 307, "_id" : { "$oid" : "5057a260d265cb020000000c" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347920480417 }, "created" : { "$date" : 1347920480417 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057a29efe243c020000009b", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Again, he patently does not care about her opinions", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "To go before or beyond him was\n\nimpossible", "uuid" : "3FB59E1D", "_id" : { "$oid" : "5057a29efe243c020000009b" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[267]", "startOffset" : 329, "end" : "/div[1]/p[267]", "endOffset" : 371, "_id" : { "$oid" : "5057a29efe243c020000009c" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347920542470 }, "created" : { "$date" : 1347920542470 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5057a2a4fe243c020000009d" }, "id" : "5057a2a4fe243c020000009d", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "pump room: daily ritual, time for confidence", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "In the pump-room, one\n\nso newly arrived in Bath must be met with, and that building she had\n\nalready found so favourable for the discovery of female excellence,\n\nand the completion of female intimacy, so admirably adapted for secret\n\ndiscourses and unlimited confidence, that she was most reasonably\n\nencouraged to expect another friend from within its walls.", "uuid" : "EFD9E3AE", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "pump", "room" ], "ranges" : [ { "start" : "/div[1]/p[241]", "startOffset" : 837, "end" : "/div[1]/p[241]", "endOffset" : 1196, "_id" : { "$oid" : "5057a2a4fe243c020000009e" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347920548078 }, "created" : { "$date" : 1347920548078 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057a2d5d265cb020000000d", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "echoed, nothing else", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "echoed\n\nwhatever he chose to assert", "uuid" : "A1C58EF5", "_id" : { "$oid" : "5057a2d5d265cb020000000d" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[267]", "startOffset" : 574, "end" : "/div[1]/p[267]", "endOffset" : 609, "_id" : { "$oid" : "5057a2d5d265cb020000000e" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347920597717 }, "created" : { "$date" : 1347920597717 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057a32cd265cb020000000f", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "The only way there could be difficulty is if he argued with himself", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "without any difficulty", "uuid" : "352E7866", "_id" : { "$oid" : "5057a32cd265cb020000000f" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[267]", "startOffset" : 652, "end" : "/div[1]/p[267]", "endOffset" : 674, "_id" : { "$oid" : "5057a32cd265cb0200000010" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347920684950 }, "created" : { "$date" : 1347920684950 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5057a4eefe243c020000009f" }, "__v" : 2, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347921134751 }, "groups" : [ "21L.003" ], "id" : "5057a4eefe243c020000009f", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "quote" : "Had their party been perfectly agreeable, the delay would\n\nhave been nothing; but General Tilney, though so charming a man, seemed\n\nalways a check upon his children's spirits, and scarcely anything was\n\nsaid but by himself", "ranges" : [ { "start" : "/div[1]/p[715]", "startOffset" : 1727, "end" : "/div[1]/p[715]", "endOffset" : 1949, "_id" : { "$oid" : "505a375580a4ac02000000a4" } } ], "tags" : [ "Realism", "character" ], "text" : "Comment: chaise (realism) Catherine sees General Tilney's true nature and his relationship with his children negative view of General Tilney", "updated" : { "$date" : 1348089706910 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "uuid" : "19E6E33D" } -{ "_id" : { "$oid" : "5057a5bffe243c02000000a1" }, "id" : "5057a5bffe243c02000000a1", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Back to Romanticism that General Tilney allows Catherine to ride with Henry. Immediately takes the view that the curricle is better, though not grander", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "he found herself with Henry\n\nin the curricle, as happy a being as ever existed. A very short trial\n\nconvinced her that a curricle was the prettiest equipage in the world;", "uuid" : "201D3255", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "romanticism" ], "ranges" : [ { "start" : "/div[1]/p[716]", "startOffset" : 329, "end" : "/div[1]/p[716]", "endOffset" : 499, "_id" : { "$oid" : "5057a5bffe243c02000000a2" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347921343850 }, "created" : { "$date" : 1347921343850 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057ad5ad265cb0200000011", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Not your typical setting for birth or of a great accomplishment. Sets the mood but also helps to contrast the miracle of birth with what victor is creating", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "It was on a dreary night of November that I beheld the accomplishment of my toils.", "uuid" : "49FB39AE", "_id" : { "$oid" : "5057ad5ad265cb0200000011" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [ "Setting", "and", "Birth" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 0, "end" : "/div[1]/p[1]", "endOffset" : 82, "_id" : { "$oid" : "5057ad5ad265cb0200000012" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347923290169 }, "created" : { "$date" : 1347923290169 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057af8cfe243c02000000a3", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Very horrific description", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I saw the dull yellow eye of the creature open; it breathed hard, and a convulsive motion agitated its limbs.", "uuid" : "755586BC", "_id" : { "$oid" : "5057af8cfe243c02000000a3" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [ "Description", "feelings", "emotions" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 429, "end" : "/div[1]/p[1]", "endOffset" : 538, "_id" : { "$oid" : "5057af8cfe243c02000000a4" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347923852095 }, "created" : { "$date" : 1347923852095 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057afb5fe243c02000000a5", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "He is dissatisfied by his creation ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "describe my emotions at this catastrophe, or how delineate the wretch whom with such infinite pains and care I had endeavoured to form?", "uuid" : "0F042968", "_id" : { "$oid" : "5057afb5fe243c02000000a5" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [ "Emotions" ], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 10, "end" : "/div[1]/p[2]", "endOffset" : 145, "_id" : { "$oid" : "5057afb5fe243c02000000a6" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347923893787 }, "created" : { "$date" : 1347923893787 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057afe3d265cb0200000013", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Creature is hideous in his opinion", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "ut these luxuriances only formed a more horrid contrast with his watery eye", "uuid" : "8AD0B1F8", "_id" : { "$oid" : "5057afe3d265cb0200000013" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [ "Description" ], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 400, "end" : "/div[1]/p[2]", "endOffset" : 475, "_id" : { "$oid" : "5057afe3d265cb0200000014" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347923939457 }, "created" : { "$date" : 1347923939457 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057b029fe243c02000000a7", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Discuss", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "The different accidents of life are not so changeable as the feelings of human nature.", "uuid" : "EC920787", "_id" : { "$oid" : "5057b029fe243c02000000a7" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [ "philosophical", "point" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 0, "end" : "/div[1]/p[3]", "endOffset" : 86, "_id" : { "$oid" : "5057b029fe243c02000000a8" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347924009639 }, "created" : { "$date" : 1347924009639 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5057b108fe243c02000000ab" }, "id" : "5057b108fe243c02000000ab", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Carriage returning Catherine home; return to realism, disgrace of being sent home so hastily", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "A heroine in a hack post-chaise is such a blow upon sentiment, as no\n\nattempt at grandeur or pathos can withstand. Swiftly therefore shall her\n\npost-boy drive through the village, amid the gaze of Sunday groups, and\n\nspeedy shall be her descent from it.", "uuid" : "6075414B", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "realism" ], "ranges" : [ { "start" : "/div[1]/p[967]", "startOffset" : 628, "end" : "/div[1]/p[967]", "endOffset" : 881, "_id" : { "$oid" : "5057b108fe243c02000000ac" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347924232825 }, "created" : { "$date" : 1347924232825 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057b24bd265cb0200000016", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Aspect can be the appearance to the eye from a particular perspective ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Unable to endure the aspect of the being I had created", "uuid" : "6834E1A1", "_id" : { "$oid" : "5057b24bd265cb0200000016" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [ "Choice", "of", "words" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 416, "end" : "/div[1]/p[3]", "endOffset" : 470, "_id" : { "$oid" : "5057b24bd265cb0200000017" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347924555839 }, "created" : { "$date" : 1347924555839 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057b26cfe243c02000000ad", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "He's trying to run away", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "endeavouring to seek a few moments of forgetfulness. But it was in vain", "uuid" : "B7393EEE", "_id" : { "$oid" : "5057b26cfe243c02000000ad" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [ "emotion", "feelings" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 697, "end" : "/div[1]/p[3]", "endOffset" : 768, "_id" : { "$oid" : "5057b26cfe243c02000000ae" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347924588271 }, "created" : { "$date" : 1347924588271 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057b330fe243c02000000af", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Dream", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "slept, indeed, but I was disturbed by the wildest dreams. I thought I saw Elizabeth, in the bloom of health, walking in the streets of Ingolstadt. Delighted and surprised, I embraced her, but as I imprinted the first kiss on her lips, they became livid with the hue of death; her features appeared to change, and I thought that I held the corpse of my dead mother in my arms; a shroud enveloped her form, and I saw the grave-worms crawling in the folds of the flannel.", "uuid" : "60200928", "_id" : { "$oid" : "5057b330fe243c02000000af" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [ "Philosophical", "interpret", "meaning" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 772, "end" : "/div[1]/p[3]", "endOffset" : 1240, "_id" : { "$oid" : "5057b330fe243c02000000b0" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347924784659 }, "created" : { "$date" : 1347924784659 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057b382fe243c02000000b1", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "He's judging him by the way he looks", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "support the horror of that countenance", "uuid" : "2434E180", "_id" : { "$oid" : "5057b382fe243c02000000b1" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [ "Description", "feelings", "monster" ], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 20, "end" : "/div[1]/p[4]", "endOffset" : 58, "_id" : { "$oid" : "5057b382fe243c02000000b2" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347924866745 }, "created" : { "$date" : 1347924866745 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057b39ed265cb0200000018", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "He calls him a wretch ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I beheld the wretch--the miserable monster whom I had created.", "uuid" : "49741104", "_id" : { "$oid" : "5057b39ed265cb0200000018" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [ "Monster" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1460, "end" : "/div[1]/p[3]", "endOffset" : 1522, "_id" : { "$oid" : "5057b39ed265cb0200000019" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347924894126 }, "created" : { "$date" : 1347924894126 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057b3bcd265cb020000001a", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "He's horrified by the monsters eyes", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "f eyes they may be called", "uuid" : "3C9C86D2", "_id" : { "$oid" : "5057b3bcd265cb020000001a" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [ "Monster" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1573, "end" : "/div[1]/p[3]", "endOffset" : 1598, "_id" : { "$oid" : "5057b3bcd265cb020000001b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347924924166 }, "created" : { "$date" : 1347924924166 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5057cd45d265cb020000001c" }, "id" : "5057cd45d265cb020000001c", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Romantic aspect: driving around, courting", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "judicious manner in which he had then held the\n\nreins, and the singular discernment and dexterity with which he had\n\ndirected his whip.", "uuid" : "B3AAFA27", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "romanticism" ], "ranges" : [ { "start" : "/div[1]/p[250]", "startOffset" : 745, "end" : "/div[1]/p[250]", "endOffset" : 880, "_id" : { "$oid" : "5057cd45d265cb020000001d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347931461612 }, "created" : { "$date" : 1347931461612 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057d2c2d265cb020000001e", "user" : "ccoop@mit.edu", "username" : "Courage C.", "text" : "simple and plain", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "useful\n\nplain sense", "uuid" : "9608CB24", "_id" : { "$oid" : "5057d2c2d265cb020000001e" }, "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 541, "end" : "/div[1]/p[2]", "endOffset" : 560, "_id" : { "$oid" : "5057d2c2d265cb020000001f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347932866913 }, "created" : { "$date" : 1347932866913 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057d2f2d265cb0200000020", "user" : "ccoop@mit.edu", "username" : "Courage C.", "text" : "Catherine described as a child", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Catherine, for many years of her life, as plain as any. She had a thin\n\nawkward figure, a sallow skin without colour, dark lank hair, and strong\n\nfeatures—so much for her person", "uuid" : "674955CE", "_id" : { "$oid" : "5057d2f2d265cb0200000020" }, "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 1121, "end" : "/div[1]/p[2]", "endOffset" : 1298, "_id" : { "$oid" : "5057d2f2d265cb0200000021" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347932914806 }, "created" : { "$date" : 1347932914806 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5057d3b2d265cb0200000022" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347933106948 }, "groups" : [ "21L.003" ], "id" : "5057d3b2d265cb0200000022", "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "quote" : "r heart was affectionate; her disposition cheerful\n\nand open, without conceit or affectation of any kind—her manners just\n\nremoved from the awkwardness and shyness of a girl; her person pleasing,\n\nand, when in good looks, pretty—and her mind about as ignorant and\n\nuninformed as the female mind at seventeen usually is.", "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 375, "end" : "/div[1]/p[14]", "endOffset" : 694, "_id" : { "$oid" : "5057d3b2d265cb0200000023" } } ], "tags" : [ "Catherine" ], "text" : "very good relationship between personality and place, unrefined and secluded", "updated" : { "$date" : 1347935933113 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "ccoop@mit.edu", "username" : "Courage C.", "uuid" : "C5D06423" } -{ "_id" : { "$oid" : "5057d424d265cb0200000024" }, "id" : "5057d424d265cb0200000024", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "as well as the excellence of\n\nthe springs", "uuid" : "EB73D9D2", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[267]", "startOffset" : 191, "end" : "/div[1]/p[267]", "endOffset" : 232, "_id" : { "$oid" : "5057d424d265cb0200000025" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347933220191 }, "created" : { "$date" : 1347933220191 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5057d5f6fe243c02000000b3" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347933686512 }, "groups" : [ "21L.003" ], "id" : "5057d5f6fe243c02000000b3", "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "quote" : "I have not\n\nyet asked you how long you have been in Bath; whether you were ever here\n\nbefore; whether you have been at the Upper Rooms, the theatre, and\n\nthe concert; and how you like the place altogether. I have been\n\nvery negligent—but are you now at leisure to satisfy me in these\n\nparticulars? If you are I will begin directly.\"", "ranges" : [ { "start" : "/div[1]/p[43]", "startOffset" : 982, "end" : "/div[1]/p[43]", "endOffset" : 1315, "_id" : { "$oid" : "5057d5f6fe243c02000000b4" } } ], "tags" : [], "text" : "shows henry's mockery of the high society of Bath. shows that he is simple in that he does not find the facade of high society conventions, and he often mocks them.", "updated" : { "$date" : 1347933825031 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "ccoop@mit.edu", "username" : "Courage C.", "uuid" : "A99180D5" } -{ "__v" : 1, "_id" : { "$oid" : "5057d813fe243c02000000b5" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347934227299 }, "groups" : [ "21L.003" ], "id" : "5057d813fe243c02000000b5", "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "quote" : "\"I shall not pay them any such compliment, I assure you. I have no\n\nnotion of treating men with such respect. That is the way to spoil\n\nthem", "ranges" : [ { "start" : "/div[1]/p[147]", "startOffset" : 2, "end" : "/div[1]/p[147]", "endOffset" : 142, "_id" : { "$oid" : "5057d813fe243c02000000b6" } } ], "tags" : [ "Isabella" ], "text" : "contradictory nature ", "updated" : { "$date" : 1347934242779 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "ccoop@mit.edu", "username" : "Courage C.", "uuid" : "D8BA2E43" } -{ "id" : "5057d8b9d265cb0200000026", "user" : "ccoop@mit.edu", "username" : "Courage C.", "text" : "John Thorpe's superficiality.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "\"Curricle-hung, you see; seat, trunk, sword-case, splashing-board,\n\nlamps, silver moulding, all you see complete; the iron-work as good\n\nas new, or better. He asked fifty guineas; I closed with him directly,\n\nthrew down the money, and the carriage was mine.\"", "uuid" : "83D52D2D", "_id" : { "$oid" : "5057d8b9d265cb0200000026" }, "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "tags" : [ "John", "Thorpe" ], "ranges" : [ { "start" : "/div[1]/p[161]", "startOffset" : 2, "end" : "/div[1]/p[161]", "endOffset" : 260, "_id" : { "$oid" : "5057d8b9d265cb0200000027" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347934393662 }, "created" : { "$date" : 1347934393662 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057dbdafe243c02000000b7", "user" : "ccoop@mit.edu", "username" : "Courage C.", "text" : "John Thorpe's interest in only money", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "\"Old Allen is as rich as a Jew—is not he?\" Catherine did not\n\nunderstand him—and he repeated his question, adding in explanation,\n\n\"Old Allen, the man you are with.\"\n\n\n\n\n\n\"Oh! Mr. Allen, you mean. Yes, I believe, he is very rich.\"\n\n\n\n\n\n\"And no children at all?\"\n\n\n\n\n\n\"No—not any.\"\n\n\n\n\n\n\"A famous thing for his next heirs. He is your godfather, is not he?\"\n\n\n\n\n\n\"My godfather! No.\"\n\n\n\n\n\n\"But you are always very much with them.\"\n\n\n\n\n\n\"Yes, very much.\"", "uuid" : "D2DC6968", "_id" : { "$oid" : "5057dbdafe243c02000000b7" }, "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[250]", "startOffset" : 1648, "end" : "/div[1]/p[257]", "endOffset" : 19, "_id" : { "$oid" : "5057dbdafe243c02000000b8" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347935194669 }, "created" : { "$date" : 1347935194669 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057dea8d265cb0200000028", "user" : "ccoop@mit.edu", "username" : "Courage C.", "text" : "Isabella is a huge liar", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "\"I\n\nassure you,\" said she, \"I would not stand up without your dear sister\n\nfor all the world; for if I did we should certainly be separated the\n\nwhole evening.\" Catherine accepted this kindness with gratitude, and\n\nthey continued as they were for three minutes longer, when Isabella, who\n\nhad been talking to James on the other side of her, turned again to his\n\nsister and whispered, \"My dear creature, I am afraid I must leave you,\n\nyour brother is so amazingly impatient to begin; I know you will not\n\nmind my going away, and I dare say John will be back in a moment,\n\nand then you may easily find me out.\"", "uuid" : "02CCF957", "_id" : { "$oid" : "5057dea8d265cb0200000028" }, "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[204]", "startOffset" : 343, "end" : "/div[1]/p[204]", "endOffset" : 951, "_id" : { "$oid" : "5057dea8d265cb0200000029" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347935912822 }, "created" : { "$date" : 1347935912822 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057e026fe243c02000000b9", "user" : "ccoop@mit.edu", "username" : "Courage C.", "text" : "The general's sterness", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Her tranquillity was not improved by the general's impatience for the\n\nappearance of his eldest son, nor by the displeasure he expressed at his\n\nlaziness when Captain Tilney at last came down. She was quite pained by\n\nthe severity of his father's reproof, which seemed disproportionate to\n\nthe offence; and much was her concern increased when she found herself\n\nthe principal cause of the lecture, and that his tardiness was chiefly\n\nresented from being disrespectful to her.", "uuid" : "842F6906", "_id" : { "$oid" : "5057e026fe243c02000000b9" }, "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[713]", "startOffset" : 708, "end" : "/div[1]/p[713]", "endOffset" : 1183, "_id" : { "$oid" : "5057e026fe243c02000000ba" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347936294734 }, "created" : { "$date" : 1347936294734 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057e16ffe243c02000000bb", "user" : "ccoop@mit.edu", "username" : "Courage C.", "text" : "his good humour increased after this conversation", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "he\n\ndid look upon a tolerably large eating-room as one of the necessaries\n\nof life; he supposed, however, \"that she must have been used to much\n\nbetter-sized apartments at Mr. Allen's?\"\n\n\n\n\n\n\"No, indeed,\" was Catherine's honest assurance; \"Mr. Allen's\n\ndining-parlour was not more than half as large,\" and she had never\n\nseen so large a room as this in her life. The general's good humour\n\nincreased. Why, as he had such rooms, he thought it would be simple not\n\nto make use of them; but, upon his honour, he believed there might be\n\nmore comfort in rooms of only half their size. Mr. Allen's house, he was\n\nsure, must be exactly of the true size for rational happiness.", "uuid" : "BE4D7E3C", "_id" : { "$oid" : "5057e16ffe243c02000000bb" }, "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "tags" : [ "General" ], "ranges" : [ { "start" : "/div[1]/p[745]", "startOffset" : 1270, "end" : "/div[1]/p[746]", "endOffset" : 481, "_id" : { "$oid" : "5057e16ffe243c02000000bc" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347936623677 }, "created" : { "$date" : 1347936623677 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057e18fd265cb020000002a", "user" : "ccoop@mit.edu", "username" : "Courage C.", "text" : "The general's absence is associated with cheerfulness", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "The evening passed without any further disturbance, and, in the\n\noccasional absence of General Tilney, with much positive cheerfulness.", "uuid" : "1A8B1525", "_id" : { "$oid" : "5057e18fd265cb020000002a" }, "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[747]", "startOffset" : 2, "end" : "/div[1]/p[747]", "endOffset" : 138, "_id" : { "$oid" : "5057e18fd265cb020000002b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347936655963 }, "created" : { "$date" : 1347936655963 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057e292fe243c02000000bd", "user" : "ccoop@mit.edu", "username" : "Courage C.", "text" : "Isabella sucks", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Lose no time, my dearest, sweetest\n\nCatherine, in writing to him and to me, Who ever am, etc.\n\n\n\n\n\nSuch a strain of shallow artifice could not impose even upon Catherine.\n\nIts inconsistencies, contradictions, and falsehood struck her from the\n\nvery first. She was ashamed of Isabella, and ashamed of having ever\n\nloved her. Her professions of attachment were now as disgusting as her\n\nexcuses were empty, and her demands impudent.", "uuid" : "6F4367B1", "_id" : { "$oid" : "5057e292fe243c02000000bd" }, "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[915]", "startOffset" : 3807, "end" : "/div[1]/p[916]", "endOffset" : 333, "_id" : { "$oid" : "5057e292fe243c02000000be" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347936914599 }, "created" : { "$date" : 1347936914599 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057e2b3fe243c02000000bf", "user" : "ccoop@mit.edu", "username" : "Courage C.", "text" : "Isabella is vain", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "She is a vain coquette, and her tricks have not answered. I\n\ndo not believe she had ever any regard either for James or for me, and I\n\nwish I had never known her.\"", "uuid" : "B4F3D885", "_id" : { "$oid" : "5057e2b3fe243c02000000bf" }, "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[917]", "startOffset" : 497, "end" : "/div[1]/p[917]", "endOffset" : 660, "_id" : { "$oid" : "5057e2b3fe243c02000000c0" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347936947267 }, "created" : { "$date" : 1347936947267 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057ec8dd265cb020000002c", "user" : "ccoop@mit.edu", "username" : "Courage C.", "text" : "Woodston, independence from father", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Northanger is not more than half my home; I have an establishment at\n\nmy own house in Woodston, which is nearly twenty miles from my father's,\n\nand some of my time is necessarily spent there.\"", "uuid" : "B51A7432", "_id" : { "$oid" : "5057ec8dd265cb020000002c" }, "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[718]", "startOffset" : 3, "end" : "/div[1]/p[718]", "endOffset" : 195, "_id" : { "$oid" : "5057ec8dd265cb020000002d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347939469325 }, "created" : { "$date" : 1347939469325 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5057ed6ecef0a60200000002" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347939694711 }, "groups" : [ "21L.003" ], "id" : "5057ed6ecef0a60200000002", "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "quote" : "It did come, and exactly when it might be reasonably looked for. It\n\ncame—it was fine—and Catherine trod on air. By ten o'clock, the chaise\n\nand four conveyed the two from the abbey; and, after an agreeable drive\n\nof almost twenty miles, they entered Woodston, a large and populous\n\nvillage, in a situation not unpleasant. Catherine was ashamed to say\n\nhow pretty she thought it, as the general seemed to think an apology\n\nnecessary for the flatness of the country, and the size of the village;\n\nbut in her heart she preferred it to any place she had ever been at,\n\nand looked with great admiration at every neat house above the rank of\n\na cottage, and at all the little chandler's shops which they passed. At\n\nthe further end of the village, and tolerably disengaged from the rest\n\nof it, stood the parsonage, a new-built substantial stone house, with\n\nits semicircular sweep and green gates; and, as they drove up to the\n\ndoor, Henry, with the friends of his solitude, a large Newfoundland\n\npuppy and two or three terriers, was ready to receive and make much of\n\nthem.", "ranges" : [ { "start" : "/div[1]/p[901]", "startOffset" : 2, "end" : "/div[1]/p[901]", "endOffset" : 1072, "_id" : { "$oid" : "5057ed6ecef0a60200000003" } } ], "tags" : [ "Woodston" ], "text" : "Woodston", "updated" : { "$date" : 1347939708710 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "ccoop@mit.edu", "username" : "Courage C.", "uuid" : "2E72CB20" } -{ "id" : "5057f1f4d265cb020000002f", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "Austen's discourse on novels and how they are to be received (or how they are received)", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "\"And what are you reading, Miss—?\" \"Oh! It is\n\nonly a novel!\" replies the young lady, while she lays down her book\n\nwith affected indifference, or momentary shame. \"It is only Cecilia, or\n\nCamilla, or Belinda\"; or, in short, only some work in which the greatest\n\npowers of the mind are displayed, in which the most thorough knowledge\n\nof human nature, the happiest delineation of its varieties, the\n\nliveliest effusions of wit and humour, are conveyed to the world in the\n\nbest-chosen language. Now, had the same young lady been engaged with a\n\nvolume of the Spectator, instead of such a work, how proudly would she\n\nhave produced the book, and told its name; though the chances must be\n\nagainst her being occupied by any part of that voluminous publication,\n\nof which either the matter or manner would not disgust a young person of\n\ntaste: the substance of its papers so often consisting in the statement\n\nof improbable circumstances, unnatural characters, and topics of\n\nconversation which no longer concern anyone living; and their language,\n\ntoo, frequently so coarse as to give no very favourable idea of the age\n\nthat could endure it.", "uuid" : "F452174D", "_id" : { "$oid" : "5057f1f4d265cb020000002f" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [ "novels" ], "ranges" : [ { "start" : "/div[1]/p[104]", "startOffset" : 2390, "end" : "/div[1]/p[104]", "endOffset" : 3530, "_id" : { "$oid" : "5057f1f4d265cb0200000030" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347940852082 }, "created" : { "$date" : 1347940852082 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057f350d265cb0200000031", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "The door slamming in the distance, pushed closed by the wind, really makes Catherine feel like she's in an Abbey.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "close with sudden fury a distant door", "uuid" : "B4E524CC", "_id" : { "$oid" : "5057f350d265cb0200000031" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [ "Door" ], "ranges" : [ { "start" : "/div[1]/p[748]", "startOffset" : 308, "end" : "/div[1]/p[748]", "endOffset" : 345, "_id" : { "$oid" : "5057f350d265cb0200000032" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347941200045 }, "created" : { "$date" : 1347941200045 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057fbcad265cb0200000033", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Carriages are a matter of pride", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "did you ever see an animal so made for speed in\n\nyour life?", "uuid" : "CF6E5CA7", "_id" : { "$oid" : "5057fbcad265cb0200000033" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[157]", "startOffset" : 168, "end" : "/div[1]/p[157]", "endOffset" : 227, "_id" : { "$oid" : "5057fbcad265cb0200000034" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347943370119 }, "created" : { "$date" : 1347943370119 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057fbedcef0a60200000005", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "extras on your carriage are also quite good.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Curricle-hung, you see; seat, trunk, sword-case, splashing-board,\n\nlamps, silver moulding, all you see complete; the iron-work as good\n\nas new, or better", "uuid" : "3534FECA", "_id" : { "$oid" : "5057fbedcef0a60200000005" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[161]", "startOffset" : 3, "end" : "/div[1]/p[161]", "endOffset" : 156, "_id" : { "$oid" : "5057fbedcef0a60200000006" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347943405486 }, "created" : { "$date" : 1347943405486 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057fc2bd265cb0200000035", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "One does not want to look cheap, but also does not want to sound free with one's money", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Neither one nor t'other; I might have got it for less, I dare say; but\n\nI hate haggling, and poor Freeman wanted cash", "uuid" : "F70ABABB", "_id" : { "$oid" : "5057fc2bd265cb0200000035" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[163]", "startOffset" : 3, "end" : "/div[1]/p[163]", "endOffset" : 120, "_id" : { "$oid" : "5057fc2bd265cb0200000036" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347943467237 }, "created" : { "$date" : 1347943467237 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057fc6ed265cb0200000037", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "again, horses are a source of great pride", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "I would not sell my horse for a hundred.", "uuid" : "D1331939", "_id" : { "$oid" : "5057fc6ed265cb0200000037" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[169]", "startOffset" : 25, "end" : "/div[1]/p[169]", "endOffset" : 65, "_id" : { "$oid" : "5057fc6ed265cb0200000038" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347943534992 }, "created" : { "$date" : 1347943534992 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057fc9dd265cb0200000039", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "he makes the distinction between open carriages and not, kind of like \"do you like convertibles?", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "open carriage", "uuid" : "F32AF7DC", "_id" : { "$oid" : "5057fc9dd265cb0200000039" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[169]", "startOffset" : 86, "end" : "/div[1]/p[169]", "endOffset" : 99, "_id" : { "$oid" : "5057fc9dd265cb020000003a" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347943581247 }, "created" : { "$date" : 1347943581247 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057fcc2cef0a60200000007", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "A carriage is an item of great use in courting.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "I am glad of it; I will drive you out in mine every day", "uuid" : "FD4F2D6F", "_id" : { "$oid" : "5057fcc2cef0a60200000007" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[171]", "startOffset" : 3, "end" : "/div[1]/p[171]", "endOffset" : 58, "_id" : { "$oid" : "5057fcc2cef0a60200000008" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347943618341 }, "created" : { "$date" : 1347943618341 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057fd15cef0a60200000009", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "again, the horse is a source of pride. He is also seems like he uses horse more than is good for it...", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "nothing ruins horses so much as rest", "uuid" : "0BA95FC0", "_id" : { "$oid" : "5057fd15cef0a60200000009" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[175]", "startOffset" : 71, "end" : "/div[1]/p[175]", "endOffset" : 107, "_id" : { "$oid" : "5057fd15cef0a6020000000a" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347943701524 }, "created" : { "$date" : 1347943701524 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057fd8ccef0a6020000000b", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "The carriage, having arrived already, adds a persuading force. He already made the effort to get the carriage there, she can hardly say no...", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Going to? Why, you have not forgot our engagement!", "uuid" : "FF0FB8D4", "_id" : { "$oid" : "5057fd8ccef0a6020000000b" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[243]", "startOffset" : 3, "end" : "/div[1]/p[243]", "endOffset" : 53, "_id" : { "$oid" : "5057fd8ccef0a6020000000c" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347943820116 }, "created" : { "$date" : 1347943820116 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057fdd4cef0a6020000000d", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "being a good driver is also a covetted skill, and he is setting himself up for it.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "He will, most likely, give a plunge or two, and perhaps take the rest\n\nfor a minute; but he will soon know his master", "uuid" : "C03F9693", "_id" : { "$oid" : "5057fdd4cef0a6020000000d" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[249]", "startOffset" : 145, "end" : "/div[1]/p[249]", "endOffset" : 262, "_id" : { "$oid" : "5057fdd4cef0a6020000000e" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347943892050 }, "created" : { "$date" : 1347943892050 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057fe03cef0a6020000000f", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Thorp makes sure, however, not to disgrace his steed, and makes the idea that his horse may be a little hot-blooded into a good thing for every aspect of him.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "He is full of spirits,\n\nplayful as can be, but there is no vice in him", "uuid" : "4A23EFD1", "_id" : { "$oid" : "5057fe03cef0a6020000000f" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[249]", "startOffset" : 264, "end" : "/div[1]/p[249]", "endOffset" : 334, "_id" : { "$oid" : "5057fe03cef0a60200000010" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347943939813 }, "created" : { "$date" : 1347943939813 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057fe8bd265cb020000003b", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Again, making himself out as a very good driver.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "companion immediately\n\nmade the matter perfectly simple by assuring her that it was entirely\n\nowing to the peculiarly judicious manner in which he had then held the\n\nreins, and the singular discernment and dexterity with which he had\n\ndirected his whip.", "uuid" : "1E1377FE", "_id" : { "$oid" : "5057fe8bd265cb020000003b" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[250]", "startOffset" : 627, "end" : "/div[1]/p[250]", "endOffset" : 880, "_id" : { "$oid" : "5057fe8bd265cb020000003c" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347944075901 }, "created" : { "$date" : 1347944075901 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057febdcef0a60200000011", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Again, ensuring she understand the quality of his equipage", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Thorpe's ideas then all reverted to the merits of his own equipage,", "uuid" : "6577E8A9", "_id" : { "$oid" : "5057febdcef0a60200000011" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[267]", "startOffset" : 2, "end" : "/div[1]/p[267]", "endOffset" : 69, "_id" : { "$oid" : "5057febdcef0a60200000012" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347944125666 }, "created" : { "$date" : 1347944125666 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057fec9d265cb020000003d", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "go the horse", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "spirit and freedom with which his horse\n\nmoved along", "uuid" : "8E295F3A", "_id" : { "$oid" : "5057fec9d265cb020000003d" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[267]", "startOffset" : 107, "end" : "/div[1]/p[267]", "endOffset" : 159, "_id" : { "$oid" : "5057fec9d265cb020000003e" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347944137049 }, "created" : { "$date" : 1347944137049 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5057ff61cef0a60200000013", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Must be sure to outdo James in carriage style.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Did you ever see such a little tittuppy thing in\n\nyour life?", "uuid" : "A70FDBE8", "_id" : { "$oid" : "5057ff61cef0a60200000013" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[268]", "startOffset" : 25, "end" : "/div[1]/p[268]", "endOffset" : 85, "_id" : { "$oid" : "5057ff61cef0a60200000014" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347944289023 }, "created" : { "$date" : 1347944289023 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50580045d265cb020000003f", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Wants to make it seem that he is not afraid of any carriage however, he is completely under control, skill unmatched.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "What is there in that? They will only get a roll if\n\nit does break down; and there is plenty of dirt; it will be excellent\n\nfalling. Oh, curse it! The carriage is safe enough, if a man knows how\n\nto drive it", "uuid" : "0B253ED8", "_id" : { "$oid" : "50580045d265cb020000003f" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[270]", "startOffset" : 21, "end" : "/div[1]/p[270]", "endOffset" : 228, "_id" : { "$oid" : "50580045d265cb0200000040" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347944517757 }, "created" : { "$date" : 1347944517757 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505800eed265cb0200000041", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "a man may be identified by his carriage.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "does he not drive a phaeton with bright chestnuts?\"", "uuid" : "CB6A6377", "_id" : { "$oid" : "505800eed265cb0200000041" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[387]", "startOffset" : 85, "end" : "/div[1]/p[387]", "endOffset" : 136, "_id" : { "$oid" : "505800eed265cb0200000042" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347944686958 }, "created" : { "$date" : 1347944686958 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50580197cef0a60200000015", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "The carriage affords the driver a measure of power over those inside it, control.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Mr.\n\nThorpe only laughed, smacked his whip, encouraged his horse, made odd\n\nnoises, and drove on;", "uuid" : "299EA0FC", "_id" : { "$oid" : "50580197cef0a60200000015" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[407]", "startOffset" : 851, "end" : "/div[1]/p[407]", "endOffset" : 949, "_id" : { "$oid" : "50580197cef0a60200000016" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347944855541 }, "created" : { "$date" : 1347944855541 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50580212d265cb0200000043", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Men without carriages are considered fools, lesser, or miserly, or poor.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Morland is a fool for not keeping a horse and gig of his\n\nown.", "uuid" : "800EECA4", "_id" : { "$oid" : "50580212d265cb0200000043" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[410]", "startOffset" : 289, "end" : "/div[1]/p[410]", "endOffset" : 351, "_id" : { "$oid" : "50580212d265cb0200000044" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347944978502 }, "created" : { "$date" : 1347944978502 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50580292d265cb0200000045", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "again, a carriage is used to show wealth.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "She saw herself at the end of\n\na few weeks, the gaze and admiration of every new acquaintance at\n\nFullerton, the envy of every valued old friend in Putney, with a\n\ncarriage at her command, a new name on her tickets, and a brilliant\n\nexhibition of hoop rings on her finger.", "uuid" : "8FD419D2", "_id" : { "$oid" : "50580292d265cb0200000045" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[566]", "startOffset" : 672, "end" : "/div[1]/p[566]", "endOffset" : 944, "_id" : { "$oid" : "50580292d265cb0200000046" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347945106241 }, "created" : { "$date" : 1347945106241 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50580335cef0a60200000017", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "more details of how fancy the carriage is", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "and her admiration of the style\n\nin which they travelled, of the fashionable chaise and four—postilions\n\nhandsomely liveried, rising so regularly in their stirrups, and\n\nnumerous outriders properly mounted, sunk a little under this consequent\n\ninconvenience.", "uuid" : "0B2E5FF9", "_id" : { "$oid" : "50580335cef0a60200000017" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[715]", "startOffset" : 1468, "end" : "/div[1]/p[715]", "endOffset" : 1726, "_id" : { "$oid" : "50580335cef0a60200000018" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347945269789 }, "created" : { "$date" : 1347945269789 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505803c9cef0a60200000019", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "to be driven by him is so great, driving is a big deal for them", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "To be driven by him", "uuid" : "C5114AD3", "_id" : { "$oid" : "505803c9cef0a60200000019" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[716]", "startOffset" : 1304, "end" : "/div[1]/p[716]", "endOffset" : 1323, "_id" : { "$oid" : "505803c9cef0a6020000001a" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347945417825 }, "created" : { "$date" : 1347945417825 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50580411cef0a6020000001b", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Henry does not boast.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Henry drove so well—so quietly—without making any disturbance", "uuid" : "729B7259", "_id" : { "$oid" : "50580411cef0a6020000001b" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[716]", "startOffset" : 994, "end" : "/div[1]/p[716]", "endOffset" : 1055, "_id" : { "$oid" : "50580411cef0a6020000001c" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347945489101 }, "created" : { "$date" : 1347945489101 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "50581a44cef0a6020000001d" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347951172290 }, "groups" : [ "21L.003" ], "id" : "50581a44cef0a6020000001d", "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "quote" : "pelisse", "ranges" : [ { "start" : "/div[1]/p[93]", "startOffset" : 2334, "end" : "/div[1]/p[93]", "endOffset" : 2341, "_id" : { "$oid" : "50581a44cef0a6020000001e" } } ], "tags" : [ "dd" ], "text" : "some kind of fur jacket. How inaccessible and expensive was fur? ![Alt text](http://farm8.staticflickr.com/7069/6946129091_352ed8c6b3_z.jpg)", "updated" : { "$date" : 1347991504127 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "moverlin@mit.edu", "username" : "Matt O.", "uuid" : "992BF37D" } -{ "id" : "50581b89d265cb0200000047", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "He calls himself a wretch", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "wretchedly", "uuid" : "AA81C0AA", "_id" : { "$oid" : "50581b89d265cb0200000047" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 19, "end" : "/div[1]/p[5]", "endOffset" : 29, "_id" : { "$oid" : "50581b89d265cb0200000048" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347951497958 }, "created" : { "$date" : 1347951497958 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50581ba6cef0a6020000001f", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "We see his dissapointment", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Mingled with this horror, I felt the bitterness of disappointment; dreams that had been my food and pleasant rest for so long a space were now become a hell to me; and the change was so rapid, the overthrow so complete!", "uuid" : "96FB4264", "_id" : { "$oid" : "50581ba6cef0a6020000001f" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 199, "end" : "/div[1]/p[5]", "endOffset" : 418, "_id" : { "$oid" : "50581ba6cef0a60200000020" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347951526440 }, "created" : { "$date" : 1347951526440 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50581da1cef0a60200000021", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Mr. Tilney travels quite a bit", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Northanger is not more than half my home; I have an establishment at\n\nmy own house in Woodston, which is nearly twenty miles from my father's,\n\nand some of my time is necessarily spent there.", "uuid" : "4598036E", "_id" : { "$oid" : "50581da1cef0a60200000021" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[718]", "startOffset" : 3, "end" : "/div[1]/p[718]", "endOffset" : 194, "_id" : { "$oid" : "50581da1cef0a60200000022" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347952033680 }, "created" : { "$date" : 1347952033680 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50587616d265cb0200000049", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "The days reflect his state of affairs", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Morning, dismal and wet, at length dawned and discovered to my sleepless and aching eyes", "uuid" : "83CBD62A", "_id" : { "$oid" : "50587616d265cb0200000049" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [ "Settings", "reflection" ], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 0, "end" : "/div[1]/p[6]", "endOffset" : 88, "_id" : { "$oid" : "50587616d265cb020000004a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347974678786 }, "created" : { "$date" : 1347974678786 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50588b97cef0a60200000023" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347980183859 }, "groups" : [ "21L.003" ], "id" : "50588b97cef0a60200000023", "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "quote" : "Her greedy eye glanced rapidly over a page. She started at its import.\n\nCould it be possible, or did not her senses play her false? An inventory\n\nof linen, in coarse and modern characters, seemed all that was before\n\nher! If the evidence of sight might be trusted, she held a washing-bill\n\nin her hand. She seized another sheet, and saw the same articles with\n\nlittle variation; a third, a fourth, and a fifth presented nothing\n\nnew. Shirts, stockings, cravats, and waistcoats faced her in each. Two\n\nothers, penned by the same hand, marked an expenditure scarcely more\n\ninteresting, in letters, hair-powder, shoe-string, and breeches-ball.\n\nAnd the larger sheet, which had enclosed the rest, seemed by its first\n\ncramp line, \"To poultice chestnut mare\"—a farrier's bill! Such was the\n\ncollection of papers (left perhaps, as she could then suppose, by the\n\nnegligence of a servant in the place whence she had taken them) which\n\nhad filled her with expectation and alarm, and robbed her of half her\n\nnight's rest! She felt humbled to the dust. Could not the adventure of\n\nthe chest have taught her wisdom? A corner of it, catching her eye as\n\nshe lay, seemed to rise up in judgment against her. Nothing could now\n\nbe clearer than the absurdity of her recent fancies. To suppose that a\n\nmanuscript of many generations back could have remained undiscovered in\n\na room such as that, so modern, so habitable!—Or that she should be the\n\nfirst to possess the skill of unlocking a cabinet, the key of which was\n\nopen to all!", "ranges" : [ { "start" : "/div[1]/p[753]", "startOffset" : 2, "end" : "/div[1]/p[753]", "endOffset" : 1518, "_id" : { "$oid" : "50588b97cef0a60200000024" } } ], "tags" : [], "text" : "Catherine disillusioned, but not fully.", "updated" : { "$date" : 1347980842885 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "woursler@mit.edu", "username" : "Will O.", "uuid" : "4F42FBB9" } -{ "id" : "50588bbfcef0a60200000025", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Tries to shift blame off herself.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "And it was in a great measure his\n\nown doing, for had not the cabinet appeared so exactly to agree with his\n\ndescription of her adventures, she should never have felt the smallest\n\ncuriosity about it.", "uuid" : "D5E70C43", "_id" : { "$oid" : "50588bbfcef0a60200000025" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[754]", "startOffset" : 105, "end" : "/div[1]/p[754]", "endOffset" : 305, "_id" : { "$oid" : "50588bbfcef0a60200000026" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347980223213 }, "created" : { "$date" : 1347980223213 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50588be0cef0a60200000027", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Still entertains Gothic fantasy.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Why the locks should have been so difficult to open, however, was still\n\nsomething remarkable, for she could now manage them with perfect ease.\n\nIn this there was surely something mysterious, and she indulged in the\n\nflattering suggestion for half a minute", "uuid" : "85D2CDA6", "_id" : { "$oid" : "50588be0cef0a60200000027" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[755]", "startOffset" : 2, "end" : "/div[1]/p[755]", "endOffset" : 258, "_id" : { "$oid" : "50588be0cef0a60200000028" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347980256174 }, "created" : { "$date" : 1347980256174 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50588c5dd265cb020000004b", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "More disillusionment, but still not enough.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "till the possibility of the\n\ndoor's having been at first unlocked, and of being herself its fastener,\n\ndarted into her head, and cost her another blush.", "uuid" : "7F427279", "_id" : { "$oid" : "50588c5dd265cb020000004b" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[755]", "startOffset" : 260, "end" : "/div[1]/p[755]", "endOffset" : 412, "_id" : { "$oid" : "50588c5dd265cb020000004c" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347980381490 }, "created" : { "$date" : 1347980381490 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50588d85d265cb020000004d", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Catherine might read too much, but Thorpe just doesn't read.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "I never read novels;", "uuid" : "949AF643", "_id" : { "$oid" : "50588d85d265cb020000004d" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[181]", "startOffset" : 29, "end" : "/div[1]/p[181]", "endOffset" : 49, "_id" : { "$oid" : "50588d85d265cb020000004e" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347980677461 }, "created" : { "$date" : 1347980677461 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50588ee7cef0a60200000029", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Thorpe doesn't just not read, he also doesn't understand.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "\"Not I, faith! No, if I read any, it shall be Mrs. Radcliffe's; her\n\nnovels are amusing enough; they are worth reading; some fun and nature\n\nin them.\"\n\n\n\n\n\n\"Udolpho was written by Mrs. Radcliffe,\" said Catherine, with some\n\nhesitation, from the fear of mortifying him.\n\n\n\n\n\n\"No sure; was it? Aye, I remember, so it was; I was thinking of that\n\nother stupid book, written by that woman they make such a fuss about,\n\nshe who married the French emigrant.\"", "uuid" : "C2462EDA", "_id" : { "$oid" : "50588ee7cef0a60200000029" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[184]", "startOffset" : 2, "end" : "/div[1]/p[186]", "endOffset" : 180, "_id" : { "$oid" : "50588ee7cef0a6020000002a" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347981031317 }, "created" : { "$date" : 1347981031317 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50588f16d265cb020000004f", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "???", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "the justness of which was unfortunately lost on poor\n\nCatherine", "uuid" : "5D29CD78", "_id" : { "$oid" : "50588f16d265cb020000004f" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[191]", "startOffset" : 16, "end" : "/div[1]/p[191]", "endOffset" : 80, "_id" : { "$oid" : "50588f16d265cb0200000050" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347981078269 }, "created" : { "$date" : 1347981078269 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50589154d265cb0200000051", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Isabella is using Catherine, and we see that she's found the perfect way to keep her close. Once again, writings", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "\"I will read you their names directly; here they are, in my pocketbook.\n\nCastle of Wolfenbach, Clermont, Mysterious Warnings, Necromancer of the\n\nBlack Forest, Midnight Bell, Orphan of the Rhine, and Horrid Mysteries.\n\nThose will last us some time.\"", "uuid" : "602DEC12", "_id" : { "$oid" : "50589154d265cb0200000051" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[114]", "startOffset" : 2, "end" : "/div[1]/p[114]", "endOffset" : 251, "_id" : { "$oid" : "50589154d265cb0200000052" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347981652459 }, "created" : { "$date" : 1347981652459 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505892efcef0a6020000002b", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Catherine can't read Isabella in person, but she can see the problems with the letter.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Such a strain of shallow artifice could not impose even upon Catherine.\n\nIts inconsistencies, contradictions, and falsehood struck her from the\n\nvery first. She was ashamed of Isabella, and ashamed of having ever\n\nloved her. Her professions of attachment were now as disgusting as her\n\nexcuses were empty, and her demands impudent. \"Write to James on her\n\nbehalf! No, James should never hear Isabella's name mentioned by her\n\nagain.\"", "uuid" : "88E2E2AB", "_id" : { "$oid" : "505892efcef0a6020000002b" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[916]", "startOffset" : 2, "end" : "/div[1]/p[916]", "endOffset" : 435, "_id" : { "$oid" : "505892efcef0a6020000002c" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347982063679 }, "created" : { "$date" : 1347982063679 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5058956bd265cb0200000053", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Washing bills are suddenly important again!", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "I have only to\n\nadd—aware that the rules of composition forbid the introduction of a\n\ncharacter not connected with my fable—that this was the very\n\ngentleman whose negligent servant left behind him that collection of\n\nwashing-bills, resulting from a long visit at Northanger, by which my\n\nheroine was involved in one of her most alarming adventures.", "uuid" : "5D8707BA", "_id" : { "$oid" : "5058956bd265cb0200000053" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1009]", "startOffset" : 1194, "end" : "/div[1]/p[1009]", "endOffset" : 1543, "_id" : { "$oid" : "5058956bd265cb0200000054" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347982699577 }, "created" : { "$date" : 1347982699577 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5058b460cef0a6020000002f" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1347990624681 }, "groups" : [ "21L.003" ], "id" : "5058b460cef0a6020000002f", "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "quote" : "was forced to\n\nsit and appear to listen", "ranges" : [ { "start" : "/div[1]/p[93]", "startOffset" : 2150, "end" : "/div[1]/p[93]", "endOffset" : 2189, "_id" : { "$oid" : "5058b460cef0a60200000030" } } ], "tags" : [], "text" : "...this sounds like it's a chore/undesirable for Mrs. Allen to listen to her....even though she is an \"old friend.\" They just met, and the narrator makes it sounds like Mrs. Allen is already seeming to lose interest in Mrs. Thorpe.", "updated" : { "$date" : 1347990688858 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "moverlin@mit.edu", "username" : "Matt O.", "uuid" : "68213DF5" } -{ "_id" : { "$oid" : "5058bd4bd265cb0200000058" }, "id" : "5058bd4bd265cb0200000058", "user" : "mikaelm@mit.edu", "username" : "Mikael M.", "text" : "An interesting way to characterize the extremities that he was putting together", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I collected the instruments of life around me,", "uuid" : "640CE63C", "permissions" : { "delete" : [ "mikaelm@mit.edu" ], "update" : [ "mikaelm@mit.edu" ], "admin" : [ "mikaelm@mit.edu" ], "read" : [ "mikaelm@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 130, "end" : "/div[1]/p[1]", "endOffset" : 176, "_id" : { "$oid" : "5058bd4bd265cb0200000059" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347992907796 }, "created" : { "$date" : 1347992907796 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5058bd9ccef0a60200000033" }, "id" : "5058bd9ccef0a60200000033", "user" : "mikaelm@mit.edu", "username" : "Mikael M.", "text" : "Frankenstein call the realization of his life's work a catastrophe. It was just in an instate that he changed his mind about his work.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "How can I describe my emotions at this catastrophe,", "uuid" : "8D46BB4E", "permissions" : { "delete" : [ "mikaelm@mit.edu" ], "update" : [ "mikaelm@mit.edu" ], "admin" : [ "mikaelm@mit.edu" ], "read" : [ "mikaelm@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 0, "end" : "/div[1]/p[2]", "endOffset" : 51, "_id" : { "$oid" : "5058bd9ccef0a60200000034" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347992988732 }, "created" : { "$date" : 1347992988732 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5058bdc0cef0a60200000035" }, "id" : "5058bdc0cef0a60200000035", "user" : "mikaelm@mit.edu", "username" : "Mikael M.", "text" : "It seems like the creature didn't meet Frankenstein's expectations.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "wretch whom with such infinite pains and care I had endeavoured to form?", "uuid" : "2FF860BA", "permissions" : { "delete" : [ "mikaelm@mit.edu" ], "update" : [ "mikaelm@mit.edu" ], "admin" : [ "mikaelm@mit.edu" ], "read" : [ "mikaelm@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 73, "end" : "/div[1]/p[2]", "endOffset" : 145, "_id" : { "$oid" : "5058bdc0cef0a60200000036" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347993024588 }, "created" : { "$date" : 1347993024588 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5058be1bd265cb020000005a" }, "id" : "5058be1bd265cb020000005a", "user" : "mikaelm@mit.edu", "username" : "Mikael M.", "text" : "It seems like his need for success prevented him from realizing what he was actually doing. Reaching success was the awakening for the Doctor.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I had desired it with an ardour that far exceeded moderation; but now that I had finished, the beauty of the dream vanished, and breathless horror and disgust filled my heart", "uuid" : "CC12ABB5", "permissions" : { "delete" : [ "mikaelm@mit.edu" ], "update" : [ "mikaelm@mit.edu" ], "admin" : [ "mikaelm@mit.edu" ], "read" : [ "mikaelm@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 240, "end" : "/div[1]/p[3]", "endOffset" : 414, "_id" : { "$oid" : "5058be1bd265cb020000005b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347993115156 }, "created" : { "$date" : 1347993115156 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5058be49cef0a60200000037" }, "id" : "5058be49cef0a60200000037", "user" : "mikaelm@mit.edu", "username" : "Mikael M.", "text" : "Right after he creates life, he dreams of death.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I embraced her, but as I imprinted the first kiss on her lips, they became livid with the hue of death;", "uuid" : "8602522D", "permissions" : { "delete" : [ "mikaelm@mit.edu" ], "update" : [ "mikaelm@mit.edu" ], "admin" : [ "mikaelm@mit.edu" ], "read" : [ "mikaelm@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 943, "end" : "/div[1]/p[3]", "endOffset" : 1047, "_id" : { "$oid" : "5058be49cef0a60200000038" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347993161087 }, "created" : { "$date" : 1347993161087 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5058be86d265cb020000005c" }, "id" : "5058be86d265cb020000005c", "user" : "mikaelm@mit.edu", "username" : "Mikael M.", "text" : "He speaks as if he could not see the creature before its animation. As if it's appearance was a surprise", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "if it were to announce the approach of the demoniacal corpse to which I had so miserably given life.", "uuid" : "ED35DD45", "permissions" : { "delete" : [ "mikaelm@mit.edu" ], "update" : [ "mikaelm@mit.edu" ], "admin" : [ "mikaelm@mit.edu" ], "read" : [ "mikaelm@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 2067, "end" : "/div[1]/p[3]", "endOffset" : 2167, "_id" : { "$oid" : "5058be86d265cb020000005d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347993222021 }, "created" : { "$date" : 1347993222021 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5058bf14d265cb020000005e" }, "id" : "5058bf14d265cb020000005e", "user" : "mikaelm@mit.edu", "username" : "Mikael M.", "text" : "It's interesting how he refers to his great success as horror and misfortune. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "forgot my horror and misfortune;", "uuid" : "C441CB89", "permissions" : { "delete" : [ "mikaelm@mit.edu" ], "update" : [ "mikaelm@mit.edu" ], "admin" : [ "mikaelm@mit.edu" ], "read" : [ "mikaelm@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 206, "end" : "/div[1]/p[11]", "endOffset" : 239, "_id" : { "$oid" : "5058bf14d265cb020000005f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347993364365 }, "created" : { "$date" : 1347993364365 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5058c062cef0a60200000039" }, "id" : "5058c062cef0a60200000039", "user" : "mikaelm@mit.edu", "username" : "Mikael M.", "text" : "Did escaping/abandoning the creature make him free? ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "nd that I am at length free.", "uuid" : "0E1136DC", "permissions" : { "delete" : [ "mikaelm@mit.edu" ], "update" : [ "mikaelm@mit.edu" ], "admin" : [ "mikaelm@mit.edu" ], "read" : [ "mikaelm@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 216, "end" : "/div[1]/p[14]", "endOffset" : 244, "_id" : { "$oid" : "5058c062cef0a6020000003a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347993698900 }, "created" : { "$date" : 1347993698900 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5058c091d265cb0200000060" }, "id" : "5058c091d265cb0200000060", "user" : "mikaelm@mit.edu", "username" : "Mikael M.", "text" : "He just left the creature in his apartment, and doesn't know his whereabouts", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I had left in my apartment might still be there, alive and walking about. I dreaded to behold this monster, b", "uuid" : "2FA4404D", "permissions" : { "delete" : [ "mikaelm@mit.edu" ], "update" : [ "mikaelm@mit.edu" ], "admin" : [ "mikaelm@mit.edu" ], "read" : [ "mikaelm@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 259, "end" : "/div[1]/p[15]", "endOffset" : 368, "_id" : { "$oid" : "5058c091d265cb0200000061" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347993745400 }, "created" : { "$date" : 1347993745400 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5058c0b3d265cb0200000062" }, "id" : "5058c0b3d265cb0200000062", "user" : "mikaelm@mit.edu", "username" : "Mikael M.", "text" : "Frankenstein is losing it", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "\"HE can tell. Oh, save me! Save me!\" I imagined that the monster seized me; I struggled furiously and fell down in a fit.", "uuid" : "CF32C3A7", "permissions" : { "delete" : [ "mikaelm@mit.edu" ], "update" : [ "mikaelm@mit.edu" ], "admin" : [ "mikaelm@mit.edu" ], "read" : [ "mikaelm@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 120, "end" : "/div[1]/p[18]", "endOffset" : 241, "_id" : { "$oid" : "5058c0b3d265cb0200000063" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1347993779929 }, "created" : { "$date" : 1347993779929 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5058d6d3cef0a6020000003d", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "This chest bothers Catherine, but she chooses to ignore it for now.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "old chest", "uuid" : "0A2D824A", "_id" : { "$oid" : "5058d6d3cef0a6020000003d" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[749]", "startOffset" : 470, "end" : "/div[1]/p[749]", "endOffset" : 479, "_id" : { "$oid" : "5058d6d3cef0a6020000003e" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347999443970 }, "created" : { "$date" : 1347999443970 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5058d71dcef0a6020000003f", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "The coincidence here is apparent to Catherine, but she's still horribly curious. She wants to know what is in the cabinet and why its there. She's nervous about what could be lurking within it or what mystery it could contain.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "a high, old-fashioned black cabinet, which, though in\n\na situation conspicuous enough, had never caught her notice before.\n\nHenry's words, his description of the ebony cabinet which was to escape\n\nher observation at first, immediately rushed across her; and though\n\nthere could be nothing really in it, there was something whimsical, it\n\nwas certainly a very remarkable coincidence!", "uuid" : "E4B24957", "_id" : { "$oid" : "5058d71dcef0a6020000003f" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[749]", "startOffset" : 1161, "end" : "/div[1]/p[749]", "endOffset" : 1543, "_id" : { "$oid" : "5058d71dcef0a60200000040" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347999517842 }, "created" : { "$date" : 1347999517842 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5058d74ecef0a60200000041", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "Why was the key in the door? Why did Austen make it so easy for Catherine to fulfill this desire? Did this kill some of the suspense?", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "The key\n\nwas in the door", "uuid" : "40E40D39", "_id" : { "$oid" : "5058d74ecef0a60200000041" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[749]", "startOffset" : 1778, "end" : "/div[1]/p[749]", "endOffset" : 1802, "_id" : { "$oid" : "5058d74ecef0a60200000042" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347999566591 }, "created" : { "$date" : 1347999566591 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5058d795d265cb0200000064", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "The language here shows us how nervous Catherine is.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "tremulous hand", "uuid" : "4C6C1913", "_id" : { "$oid" : "5058d795d265cb0200000064" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[749]", "startOffset" : 2110, "end" : "/div[1]/p[749]", "endOffset" : 2124, "_id" : { "$oid" : "5058d795d265cb0200000065" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347999637658 }, "created" : { "$date" : 1347999637658 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5058d7a6cef0a60200000043", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "Couldn't be that easy, could it?", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "a bolt flew, and she believed herself\n\nsuccessful", "uuid" : "4A11ABF7", "_id" : { "$oid" : "5058d7a6cef0a60200000043" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[749]", "startOffset" : 2242, "end" : "/div[1]/p[749]", "endOffset" : 2291, "_id" : { "$oid" : "5058d7a6cef0a60200000044" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347999654626 }, "created" : { "$date" : 1347999654626 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5058d7aed265cb0200000066", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "The door was still immovable", "uuid" : "18EAB8DA", "_id" : { "$oid" : "5058d7aed265cb0200000066" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[749]", "startOffset" : 2323, "end" : "/div[1]/p[749]", "endOffset" : 2351, "_id" : { "$oid" : "5058d7aed265cb0200000067" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347999662723 }, "created" : { "$date" : 1347999662723 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5058d7dccef0a60200000045", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "To me, this is just silly. I think I was with Austen, being sucked into the mystery of it all until this point. ", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "a cabinet so mysteriously closed\n\nin her immediate vicinity", "uuid" : "5E80153A", "_id" : { "$oid" : "5058d7dccef0a60200000045" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[749]", "startOffset" : 2672, "end" : "/div[1]/p[749]", "endOffset" : 2731, "_id" : { "$oid" : "5058d7dccef0a60200000046" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347999708415 }, "created" : { "$date" : 1347999708415 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5058d811d265cb0200000068", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "\"A cavity of importance\". She assumes so much - that what the cabinet holds must be of utmost importance.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "a small door, closed also with a lock and key, secured in\n\nall probability a cavity of importance", "uuid" : "72D45803", "_id" : { "$oid" : "5058d811d265cb0200000068" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[749]", "startOffset" : 3296, "end" : "/div[1]/p[749]", "endOffset" : 3393, "_id" : { "$oid" : "5058d811d265cb0200000069" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347999761465 }, "created" : { "$date" : 1347999761465 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5058d82dcef0a60200000047", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "All of her efforts thus far have been in vain.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "in vain", "uuid" : "111DF4E0", "_id" : { "$oid" : "5058d82dcef0a60200000047" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[750]", "startOffset" : 552, "end" : "/div[1]/p[750]", "endOffset" : 560, "_id" : { "$oid" : "5058d82dcef0a60200000048" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347999789256 }, "created" : { "$date" : 1347999789256 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5058d882cef0a60200000049", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "This shows us exactly how sucked in to the mystery, the suspense of the whole thing Catherine is. By now we, as readers, certainly feel the humor Austen is trying to get across. However, we still feel a portion of the suspense. Will Catherine find something important? What has she found? ", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Her heart fluttered, her\n\nknees trembled, and her cheeks grew pale.", "uuid" : "1A07EE51", "_id" : { "$oid" : "5058d882cef0a60200000049" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[750]", "startOffset" : 1271, "end" : "/div[1]/p[750]", "endOffset" : 1338, "_id" : { "$oid" : "5058d882cef0a6020000004a" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1347999874955 }, "created" : { "$date" : 1347999874955 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5058d966d265cb020000006a", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "The papers ended up being nothing but a collection of bills left by a negligent servant...", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Such was the\n\ncollection of papers (left perhaps, as she could then suppose, by the\n\nnegligence of a servant in the place whence she had taken them) which\n\nhad filled her with expectation and alarm, and robbed her of half her\n\nnight's rest! She felt humbled to the dust.", "uuid" : "E3959B67", "_id" : { "$oid" : "5058d966d265cb020000006a" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[753]", "startOffset" : 774, "end" : "/div[1]/p[753]", "endOffset" : 1044, "_id" : { "$oid" : "5058d966d265cb020000006b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348000102397 }, "created" : { "$date" : 1348000102397 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5058fb21cef0a6020000004b" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348008737332 }, "groups" : [ "21L.003" ], "id" : "5058fb21cef0a6020000004b", "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "quote" : "Bath is a charming place, sir; there are so many good shops here. We\n\nare sadly off in the country; not but what we have very good shops in\n\nSalisbury, but it is so far to go", "ranges" : [ { "start" : "/div[1]/p[85]", "startOffset" : 3, "end" : "/div[1]/p[85]", "endOffset" : 177, "_id" : { "$oid" : "5058fb21cef0a6020000004c" } } ], "tags" : [], "text" : "where she is from--> realism\nBath and her journey--> romanticism; between these on her journey of character development", "updated" : { "$date" : 1348008787383 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "angelaha@mit.edu", "username" : "Angela H.", "uuid" : "8DE3F4B7" } -{ "_id" : { "$oid" : "50590e6680a4ac0200000002" }, "__v" : 1, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348013670926 }, "groups" : [ "21L.003" ], "id" : "50590e6680a4ac0200000002", "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "quote" : "how she will,\n\nprobably, contribute to reduce poor Catherine to all the desperate\n\nwretchedness of which a last volume is capable—whether by her\n\nimprudence, vulgarity, or jealousy—whether by intercepting her letters,\n\nruining her character, or turning her out of doors.", "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 196, "end" : "/div[1]/p[20]", "endOffset" : 467, "_id" : { "$oid" : "50590e6680a4ac0200000003" } } ], "tags" : [ "Mrs-Allen,", "mentor" ], "text" : "Describes Mrs. Allen negatively in the way of Gothic novels: could she be said to have contributed to Catherine's discomfort for more realistic reasons?", "updated" : { "$date" : 1348013739140 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "csample@mit.edu", "username" : "Caitlin S.", "uuid" : "22CF3268" } -{ "_id" : { "$oid" : "50590e91cef0a6020000004d" }, "__v" : 1, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348013713391 }, "groups" : [ "21L.003" ], "id" : "50590e91cef0a6020000004d", "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "quote" : "She had neither beauty,\n\ngenius, accomplishment, nor manner.", "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 196, "end" : "/div[1]/p[21]", "endOffset" : 256, "_id" : { "$oid" : "50590e91cef0a6020000004e" } } ], "tags" : [ "Mrs-Allen,", "mentor" ], "text" : "Mrs. Allen lacks many good qualities: poor role model", "updated" : { "$date" : 1348013772745 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "csample@mit.edu", "username" : "Caitlin S.", "uuid" : "87BD725A" } -{ "_id" : { "$oid" : "50590efccef0a6020000004f" }, "id" : "50590efccef0a6020000004f", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "\"In one respect\" but not in others?", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "In one respect she was admirably fitted\n\nto introduce a young lady into public, being as fond of going everywhere\n\nand seeing everything herself as any young lady could be.", "uuid" : "CE5949ED", "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "Mrs-Allen,", "mentor" ], "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 459, "end" : "/div[1]/p[21]", "endOffset" : 631, "_id" : { "$oid" : "50590efccef0a60200000050" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348013820287 }, "created" : { "$date" : 1348013820287 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50590f2fcef0a60200000051" }, "id" : "50590f2fcef0a60200000051", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "Fundamental aspect of Mrs. Allen's character: love of dresses and fashion", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Dress was\n\nher passion. She had a most harmless delight in being fine; and our\n\nheroine's entree into life could not take place till after three or four\n\ndays had been spent in learning what was mostly worn, and her chaperone\n\nwas provided with a dress of the newest fashion.", "uuid" : "49D72879", "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "Mrs-Allen,", "dress-obsession" ], "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 632, "end" : "/div[1]/p[21]", "endOffset" : 907, "_id" : { "$oid" : "50590f2fcef0a60200000052" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348013871971 }, "created" : { "$date" : 1348013871971 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50590f50cef0a60200000053" }, "id" : "50590f50cef0a60200000053", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "Dress is highest priority", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "rs. Allen was so long in dressing that they did not enter the ballroom\n\ntill late.", "uuid" : "919069DB", "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "Mrs-Allen,", "dress-obsession" ], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 3, "end" : "/div[1]/p[22]", "endOffset" : 85, "_id" : { "$oid" : "50590f50cef0a60200000054" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348013904393 }, "created" : { "$date" : 1348013904393 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50590f72cef0a60200000055" }, "id" : "50590f72cef0a60200000055", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "Dress more important than people", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "more care for the safety of her new gown than for the comfort of\n\nher protegee", "uuid" : "B251A5C4", "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "Mrs-Allen,", "dress-obsession" ], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 288, "end" : "/div[1]/p[22]", "endOffset" : 366, "_id" : { "$oid" : "50590f72cef0a60200000056" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348013938162 }, "created" : { "$date" : 1348013938162 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50590fc1cef0a60200000057" }, "id" : "50590fc1cef0a60200000057", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "Mrs. Allen feels superior when it comes to fashion", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Mrs. Allen congratulated herself, as soon as they were seated, on having\n\npreserved her gown from injury. \"It would have been very shocking to\n\nhave it torn,\" said she, \"would not it? It is such a delicate muslin.\n\nFor my part I have not seen anything I like so well in the whole room, I\n\nassure you.\"", "uuid" : "15F2944E", "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "Mrs-Allen,", "dress-obsession,", "ego" ], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 2, "end" : "/div[1]/p[24]", "endOffset" : 303, "_id" : { "$oid" : "50590fc1cef0a60200000058" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348014017145 }, "created" : { "$date" : 1348014017145 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5059101680a4ac0200000004" }, "id" : "5059101680a4ac0200000004", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "Mrs. Allen not very well known: cause or effect of her preferring clothes to people?", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "every fresh proof, which every morning brought, of her knowing nobody at\n\nall.", "uuid" : "56189E72", "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "Mrs-Allen,", "mentor" ], "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 351, "end" : "/div[1]/p[42]", "endOffset" : 429, "_id" : { "$oid" : "5059101680a4ac0200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348014102939 }, "created" : { "$date" : 1348014102939 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5059105680a4ac0200000006" }, "__v" : 1, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348014166786 }, "groups" : [ "21L.003" ], "id" : "5059105680a4ac0200000006", "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "quote" : "There goes a strange-looking woman! What an\n\nodd gown she has got on! How old-fashioned it is! Look at the back.", "ranges" : [ { "start" : "/div[1]/p[34]", "startOffset" : 175, "end" : "/div[1]/p[34]", "endOffset" : 287, "_id" : { "$oid" : "5059105680a4ac0200000007" } } ], "tags" : [ "Mrs-Allen,", "judgment,", "dress-obsession" ], "text" : "Mrs. Allen uses clothing to judge others", "updated" : { "$date" : 1348014189921 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "csample@mit.edu", "username" : "Caitlin S.", "uuid" : "A31DCCB6" } -{ "_id" : { "$oid" : "505910af80a4ac0200000008" }, "id" : "505910af80a4ac0200000008", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "Interrupts because of gown", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "do\n\ntake this pin out of my sleeve; I am afraid it has torn a hole already;\n\nI shall be quite sorry if it has, for this is a favourite gown, though\n\nit cost but nine shillings a yard.", "uuid" : "93F1BBB3", "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "Mrs-Allen,", "dress-obsession" ], "ranges" : [ { "start" : "/div[1]/p[74]", "startOffset" : 71, "end" : "/div[1]/p[74]", "endOffset" : 254, "_id" : { "$oid" : "505910af80a4ac0200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348014255260 }, "created" : { "$date" : 1348014255260 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505910d580a4ac020000000a" }, "id" : "505910d580a4ac020000000a", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "Judges Tilney because of his knowledge of muslin (quite accurately, as it turns out)", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Mrs. Allen was quite struck by his genius. \"Men commonly take so little\n\nnotice of those things,\" said she; \"I can never get Mr. Allen to know\n\none of my gowns from another. You must be a great comfort to your\n\nsister, sir.\"", "uuid" : "2C588103", "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "Mrs-Allen,", "judgment,", "dress-obsession" ], "ranges" : [ { "start" : "/div[1]/p[78]", "startOffset" : 2, "end" : "/div[1]/p[78]", "endOffset" : 226, "_id" : { "$oid" : "505910d580a4ac020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348014293516 }, "created" : { "$date" : 1348014293516 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5059112080a4ac020000000c" }, "id" : "5059112080a4ac020000000c", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "Wants to feel better than her friends: uses fashion", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "as the completion of good fortune, had\n\nfound these friends by no means so expensively dressed as herself", "uuid" : "17860B78", "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "Mrs-Allen,", "dress-obsession,", "judgment" ], "ranges" : [ { "start" : "/div[1]/p[103]", "startOffset" : 181, "end" : "/div[1]/p[103]", "endOffset" : 286, "_id" : { "$oid" : "5059112080a4ac020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348014368390 }, "created" : { "$date" : 1348014368390 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5059113c80a4ac020000000e" }, "id" : "5059113c80a4ac020000000e", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "gowns=children?", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Mrs. Thorpe talked chiefly of her children, and Mrs. Allen\n\nof her gowns.", "uuid" : "BB9E0A04", "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "Mrs-Allen,", "dress-obsession" ], "ranges" : [ { "start" : "/div[1]/p[103]", "startOffset" : 804, "end" : "/div[1]/p[103]", "endOffset" : 877, "_id" : { "$oid" : "5059113c80a4ac020000000f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348014396636 }, "created" : { "$date" : 1348014396636 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50591162cef0a60200000059" }, "id" : "50591162cef0a60200000059", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "Takes comfort from being better dressed than friend", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "onsoling\n\nherself, however, with the discovery, which her keen eye soon made, that\n\nthe lace on Mrs. Thorpe's pelisse was not half so handsome as that on\n\nher own", "uuid" : "2870DE57", "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "Mrs-Allen,", "judgment,", "dress-obsession" ], "ranges" : [ { "start" : "/div[1]/p[93]", "startOffset" : 2224, "end" : "/div[1]/p[93]", "endOffset" : 2386, "_id" : { "$oid" : "50591162cef0a6020000005a" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348014434075 }, "created" : { "$date" : 1348014434075 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5059118d80a4ac0200000010" }, "id" : "5059118d80a4ac0200000010", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "Showing off", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "summoned by the latter\n\nto guess the price and weigh the merits of a new muff and tippet", "uuid" : "91B6664B", "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "Mrs-Allen,", "dress-obsession" ], "ranges" : [ { "start" : "/div[1]/p[202]", "startOffset" : 400, "end" : "/div[1]/p[202]", "endOffset" : 488, "_id" : { "$oid" : "5059118d80a4ac0200000011" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348014477328 }, "created" : { "$date" : 1348014477328 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505911d580a4ac0200000012" }, "id" : "505911d580a4ac0200000012", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "Judges Miss Tilney from clothes but does it well", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "They seem\n\nvery agreeable people. Miss Tilney was in a very pretty spotted\n\nmuslin, and I fancy, by what I can learn, that she always dresses very\n\nhandsomely.", "uuid" : "8E9E5500", "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "Mrs-Allen,", "dress-obsession,", "judgment" ], "ranges" : [ { "start" : "/div[1]/p[282]", "startOffset" : 64, "end" : "/div[1]/p[282]", "endOffset" : 223, "_id" : { "$oid" : "505911d580a4ac0200000013" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348014549712 }, "created" : { "$date" : 1348014549712 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505911e9cef0a6020000005b" }, "id" : "505911e9cef0a6020000005b", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "Focus on clothes", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "five hundred to buy wedding-clothes. Mrs. Hughes saw all the\n\nclothes after they came from the warehouse", "uuid" : "63D2DECA", "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "Mrs-Allen,", "dress-obsession,", "judgment" ], "ranges" : [ { "start" : "/div[1]/p[286]", "startOffset" : 295, "end" : "/div[1]/p[286]", "endOffset" : 399, "_id" : { "$oid" : "505911e9cef0a6020000005c" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348014569625 }, "created" : { "$date" : 1348014569625 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50591207cef0a6020000005d" }, "id" : "50591207cef0a6020000005d", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "Marks death with pearls", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "I am sure Mrs. Tilney is dead, because Mrs. Hughes told me there\n\nwas a very beautiful set of pearls that Mr. Drummond gave his daughter\n\non her wedding-day and that Miss Tilney has got now, for they were put\n\nby for her when her mother died.", "uuid" : "DA544A59", "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "Mrs-Allen,", "dress-obsession" ], "ranges" : [ { "start" : "/div[1]/p[288]", "startOffset" : 149, "end" : "/div[1]/p[288]", "endOffset" : 391, "_id" : { "$oid" : "50591207cef0a6020000005e" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348014599231 }, "created" : { "$date" : 1348014599231 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50591238cef0a6020000005f" }, "id" : "50591238cef0a6020000005f", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "Focuses on clothing aspect rather than social implications", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Open carriages are nasty things. A clean\n\ngown is not five minutes' wear in them.", "uuid" : "F75D82E9", "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "Mrs-Allen,", "dress-obsession" ], "ranges" : [ { "start" : "/div[1]/p[474]", "startOffset" : 29, "end" : "/div[1]/p[474]", "endOffset" : 110, "_id" : { "$oid" : "50591238cef0a60200000060" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348014648033 }, "created" : { "$date" : 1348014648033 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5059126dcef0a60200000061" }, "id" : "5059126dcef0a60200000061", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "\"But this was something of real consequence\" -- clothes are of real consequence in Mrs. Allen's eyes", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Young people will be young people,\n\nas your good mother says herself. You know I wanted you, when we first\n\ncame, not to buy that sprigged muslin, but you would. Young people do\n\nnot like to be always thwarted.\"\n\n\n\n\n\n\"But this was something of real consequence;", "uuid" : "22E1ABD1", "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "Mrs-Allen,", "dress-obsession" ], "ranges" : [ { "start" : "/div[1]/p[478]", "startOffset" : 177, "end" : "/div[1]/p[479]", "endOffset" : 46, "_id" : { "$oid" : "5059126dcef0a60200000062" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348014701701 }, "created" : { "$date" : 1348014701701 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505912a380a4ac0200000014" }, "id" : "505912a380a4ac0200000014", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "Gown is priority", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "My dear, you tumble my gown", "uuid" : "5F86BE1D", "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "Mrs-Allen,", "dress-obsession" ], "ranges" : [ { "start" : "/div[1]/p[425]", "startOffset" : 3, "end" : "/div[1]/p[425]", "endOffset" : 30, "_id" : { "$oid" : "505912a380a4ac0200000015" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348014755167 }, "created" : { "$date" : 1348014755167 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505912c7cef0a60200000063" }, "id" : "505912c7cef0a60200000063", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "Only comment is about clothes", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "\"Go, by all means, my dear; only put on a white gown; Miss Tilney always\n\nwears white.\"", "uuid" : "1EC501E1", "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "Mrs-Allen,", "dress-obsession" ], "ranges" : [ { "start" : "/div[1]/p[421]", "startOffset" : 2, "end" : "/div[1]/p[421]", "endOffset" : 89, "_id" : { "$oid" : "505912c7cef0a60200000064" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348014791296 }, "created" : { "$date" : 1348014791296 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5059145380a4ac0200000016", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "raised unlike typical heroine-realism", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "No one who had ever seen Catherine Morland in her infancy would have\n\nsupposed her born to be an heroine.", "uuid" : "1A4544C1", "_id" : { "$oid" : "5059145380a4ac0200000016" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 2, "end" : "/div[1]/p[2]", "endOffset" : 108, "_id" : { "$oid" : "5059145380a4ac0200000017" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348015187816 }, "created" : { "$date" : 1348015187816 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50592dfa80a4ac0200000018", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "setting a bad mood", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "dreary", "uuid" : "8B05701E", "_id" : { "$oid" : "50592dfa80a4ac0200000018" }, "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 12, "end" : "/div[1]/p[1]", "endOffset" : 19, "_id" : { "$oid" : "50592dfa80a4ac0200000019" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348021754533 }, "created" : { "$date" : 1348021754533 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50593db36ee4de0200000002", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "old chest is there with her still", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "old chest,", "uuid" : "17949C63", "_id" : { "$oid" : "50593db36ee4de0200000002" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[749]", "startOffset" : 469, "end" : "/div[1]/p[749]", "endOffset" : 480, "_id" : { "$oid" : "50593db36ee4de0200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348025779695 }, "created" : { "$date" : 1348025779695 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50593e2f80a4ac020000001a", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "examination in a gothic sense", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "from\n\nthis examination", "uuid" : "C63471AA", "_id" : { "$oid" : "50593e2f80a4ac020000001a" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[749]", "startOffset" : 499, "end" : "/div[1]/p[749]", "endOffset" : 522, "_id" : { "$oid" : "50593e2f80a4ac020000001b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348025903972 }, "created" : { "$date" : 1348025903972 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50593e3d6ee4de0200000004", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "gets over the chest", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "causeless\n\nfears of an idle fanc", "uuid" : "E7612D2E", "_id" : { "$oid" : "50593e3d6ee4de0200000004" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[749]", "startOffset" : 565, "end" : "/div[1]/p[749]", "endOffset" : 597, "_id" : { "$oid" : "50593e3d6ee4de0200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348025917193 }, "created" : { "$date" : 1348025917193 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5059423a80a4ac020000001c", "user" : "fendt@mit.edu", "username" : "Kurt F.", "text" : "![Alt text] (http://www.eurofoodimports.com/v/vspfiles/photos/4000521203603-2T.jpg)", "uri" : "http://annotationstudio.mit.edu/documents/tabula-rasa", "quote" : "Dr. Oetker.", "uuid" : "33F54622", "_id" : { "$oid" : "5059423a80a4ac020000001c" }, "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "tags" : [ "Werbung" ], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 10, "end" : "/div[1]/p[4]", "endOffset" : 21, "_id" : { "$oid" : "5059423a80a4ac020000001d" } } ], "groups" : [ "Testing", "21F.414", "Fall 2012" ], "updated" : { "$date" : 1348026938377 }, "created" : { "$date" : 1348026938377 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "505943026ee4de0200000006" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348027138623 }, "groups" : [ "Testing", "21F.414", "Fall 2012" ], "id" : "505943026ee4de0200000006", "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "quote" : "Jan Hus", "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 114, "end" : "/div[1]/p[3]", "endOffset" : 121, "_id" : { "$oid" : "505943026ee4de0200000007" } } ], "tags" : [ "Person" ], "text" : "Theologe, Prediger, Reformator im 14. Jahrhundert\n![Alt text](http://upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Jan_Hus_2.jpg/170px-Jan_Hus_2.jpg)", "updated" : { "$date" : 1348027242026 }, "uri" : "http://annotationstudio.mit.edu/documents/tabula-rasa", "user" : "fendt@mit.edu", "username" : "Kurt F.", "uuid" : "929E08B1" } -{ "id" : "5059432080a4ac020000001e", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "agony", "uuid" : "08B3FD9C", "_id" : { "$oid" : "5059432080a4ac020000001e" }, "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 123, "end" : "/div[1]/p[1]", "endOffset" : 128, "_id" : { "$oid" : "5059432080a4ac020000001f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348027168936 }, "created" : { "$date" : 1348027168936 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5059438680a4ac0200000020", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "accident? He became god and called his creation an accident because of it's appearance", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "accidents", "uuid" : "0FECF7A2", "_id" : { "$oid" : "5059438680a4ac0200000020" }, "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 14, "end" : "/div[1]/p[3]", "endOffset" : 24, "_id" : { "$oid" : "5059438680a4ac0200000021" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348027270098 }, "created" : { "$date" : 1348027270098 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505943b46ee4de0200000008", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "the fact that she is justifying meaningless reasons proving that she is not afraid, indicates that she is indeed still afraid.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "as if\n\nshe wished for the protection of light after she were in bed.", "uuid" : "94A709F8", "_id" : { "$oid" : "505943b46ee4de0200000008" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[749]", "startOffset" : 852, "end" : "/div[1]/p[749]", "endOffset" : 921, "_id" : { "$oid" : "505943b46ee4de0200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348027316045 }, "created" : { "$date" : 1348027316045 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505943e66ee4de020000000a", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "surprising little detail about how he created the creature", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I had worked hard for nearly two years", "uuid" : "42A61932", "_id" : { "$oid" : "505943e66ee4de020000000a" }, "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 86, "end" : "/div[1]/p[3]", "endOffset" : 125, "_id" : { "$oid" : "505943e66ee4de020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348027366778 }, "created" : { "$date" : 1348027366778 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5059440680a4ac0200000022" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348027398326 }, "groups" : [ "Testing", "21F.414", "Fall 2012" ], "id" : "5059440680a4ac0200000022", "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "quote" : "Beate Uhse", "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 47, "end" : "/div[1]/p[5]", "endOffset" : 57, "_id" : { "$oid" : "5059440680a4ac0200000023" } } ], "tags" : [ "Person" ], "text" : "Beate Uhse war Kunstflug-Pilotin und gründete nach dem Zweiten Weltkrieg den ersten Sexshop der Welt", "updated" : { "$date" : 1348027443753 }, "uri" : "http://annotationstudio.mit.edu/documents/tabula-rasa", "user" : "fendt@mit.edu", "username" : "Kurt F.", "uuid" : "5D9CF2DB" } -{ "id" : "505944246ee4de020000000c", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "connecting the women in his life through death, possible foreshadowing of Elizabeth's murder", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I thought that I held the corpse of my dead mother in my arms", "uuid" : "23EE6311", "_id" : { "$oid" : "505944246ee4de020000000c" }, "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1085, "end" : "/div[1]/p[3]", "endOffset" : 1146, "_id" : { "$oid" : "505944246ee4de020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348027428473 }, "created" : { "$date" : 1348027428473 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5059446580a4ac0200000024", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "the monster reaching out to his father and immediately being rejected", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "one hand was stretched out, seemingly to detain me", "uuid" : "B9C7735E", "_id" : { "$oid" : "5059446580a4ac0200000024" }, "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1753, "end" : "/div[1]/p[3]", "endOffset" : 1803, "_id" : { "$oid" : "5059446580a4ac0200000025" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348027493627 }, "created" : { "$date" : 1348027493627 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505944ea6ee4de020000000e", "user" : "fendt@mit.edu", "username" : "Kurt F.", "text" : "![Alt text](http://src.discounto.de/pics/Angebot/49355/69838_00-Null-Null-WC-Aktiv-Gel-Cool-Arctic-49355_xxl.jpg)", "uri" : "http://annotationstudio.mit.edu/documents/tabula-rasa", "quote" : "Nullnull", "uuid" : "E0E59763", "_id" : { "$oid" : "505944ea6ee4de020000000e" }, "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "tags" : [ "Werbung" ], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 145, "end" : "/div[1]/p[6]", "endOffset" : 153, "_id" : { "$oid" : "505944ea6ee4de020000000f" } } ], "groups" : [ "Testing", "21F.414", "Fall 2012" ], "updated" : { "$date" : 1348027626863 }, "created" : { "$date" : 1348027626863 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505945b36ee4de0200000010", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "what does the use of the quote \"Ancient Mariner\" add to the situation and mood of the text", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Like one who, on a lonely road, Doth walk in fear and dread, And, having once turned round, walks on, And turns no more his head; Because he knows a frightful fiend Doth close behind him tread.", "uuid" : "170FBC9D", "_id" : { "$oid" : "505945b36ee4de0200000010" }, "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[8]", "startOffset" : 0, "end" : "/div[1]/p[8]", "endOffset" : 193, "_id" : { "$oid" : "505945b36ee4de0200000011" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348027827955 }, "created" : { "$date" : 1348027827955 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505945ff6ee4de0200000012", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "Instant transition from monster and mad science to the real world", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Nothing could equal my delight on seeing Clerval; his presence brought back to my thoughts my father,", "uuid" : "93BE4B7B", "_id" : { "$oid" : "505945ff6ee4de0200000012" }, "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 0, "end" : "/div[1]/p[11]", "endOffset" : 101, "_id" : { "$oid" : "505945ff6ee4de0200000013" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348027903056 }, "created" : { "$date" : 1348027903056 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5059468e80a4ac0200000026", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "It's funny how Frankenstein forgets the important details.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I then reflected, and the thought made me shiver, that the creature whom I had left in my apartment might still be there, alive and walking about.", "uuid" : "34E56C18", "_id" : { "$oid" : "5059468e80a4ac0200000026" }, "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 185, "end" : "/div[1]/p[15]", "endOffset" : 332, "_id" : { "$oid" : "5059468e80a4ac0200000027" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348028046605 }, "created" : { "$date" : 1348028046605 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505947ec6ee4de0200000014", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "Frankenstein's work has caused him to lose touch with reality, but his friends keep trying to pull him back", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "\"Compose yourself,\" said Clerval, who observed my change of colour, \"I will not mention it if it agitates you; but your father and cousin would be very happy if they received a letter from you in your own handwriting. They hardly know how ill you have been and are uneasy at your long silence.\"", "uuid" : "BD0BAB22", "_id" : { "$oid" : "505947ec6ee4de0200000014" }, "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[25]", "startOffset" : 104, "end" : "/div[1]/p[25]", "endOffset" : 398, "_id" : { "$oid" : "505947ec6ee4de0200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348028396612 }, "created" : { "$date" : 1348028396612 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5059485d6ee4de0200000016", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "The way Frankenstein talks about the creature and tries to forget him creates the illusion that the creature was a dream, or that he never existed in the first place.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "\"Do not ask me,\" cried I, putting my hands before my eyes, for I thought I saw the dreaded spectre glide into the room; \"HE can tell. Oh, save me! Save me!\" I imagined that the monster seized me; I struggled furiously and fell down in a fit.", "uuid" : "CFC29586", "_id" : { "$oid" : "5059485d6ee4de0200000016" }, "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 0, "end" : "/div[1]/p[18]", "endOffset" : 241, "_id" : { "$oid" : "5059485d6ee4de0200000017" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348028509436 }, "created" : { "$date" : 1348028509436 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5059551c80a4ac0200000028", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "again comes to a rationale conclusion, just like with the chest, but it is not enough.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "How could she have so imposed on herself? Heaven forbid that Henry\n\nTilney should ever know her folly! And it was in a great measure his\n\nown doing,", "uuid" : "29DCB45D", "_id" : { "$oid" : "5059551c80a4ac0200000028" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[754]", "startOffset" : 2, "end" : "/div[1]/p[754]", "endOffset" : 151, "_id" : { "$oid" : "5059551c80a4ac0200000029" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348031772996 }, "created" : { "$date" : 1348031772996 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50595d386ee4de0200000018", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "In hindsight, it's obvious", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Her thoughts being still chiefly fixed on what she had\n\nwith such causeless terror felt and done, nothing could shortly be\n\nclearer than that it had been all a voluntary, self-created delusion,\n\neach trifling circumstance receiving importance from an imagination\n\nresolved on alarm, and everything forced to bend to one purpose by\n\na mind which, before she entered the abbey, had been craving to be\n\nfrightened", "uuid" : "7EF12207", "_id" : { "$oid" : "50595d386ee4de0200000018" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[843]", "startOffset" : 311, "end" : "/div[1]/p[843]", "endOffset" : 721, "_id" : { "$oid" : "50595d386ee4de0200000019" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348033848684 }, "created" : { "$date" : 1348033848684 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5059eadb80a4ac0200000084", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Catherine's expectations are broken.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "To pass between lodges of a modern appearance, to find herself with such\n\nease in the very precincts of the abbey, and driven so rapidly along a\n\nsmooth, level road of fine gravel, without obstacle, alarm, or solemnity\n\nof any kind, struck her as odd and inconsistent.", "uuid" : "3FE02842", "_id" : { "$oid" : "5059eadb80a4ac0200000084" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[736]", "startOffset" : 146, "end" : "/div[1]/p[736]", "endOffset" : 415, "_id" : { "$oid" : "5059eadb80a4ac0200000085" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348070107637 }, "created" : { "$date" : 1348070107637 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5059eb086ee4de0200000072", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Again, failed expectations", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "doubted, as she looked round the room, whether anything within her\n\nobservation would have given her the consciousness.", "uuid" : "8D9FAEF9", "_id" : { "$oid" : "5059eb086ee4de0200000072" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[737]", "startOffset" : 70, "end" : "/div[1]/p[737]", "endOffset" : 189, "_id" : { "$oid" : "5059eb086ee4de0200000073" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348070152455 }, "created" : { "$date" : 1348070152455 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5059eb2a6ee4de0200000074", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Fireplace is modern and mundane.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "The fireplace, where she\n\nhad expected the ample width and ponderous carving of former times, was\n\ncontracted to a Rumford, with slabs of plain though handsome marble, and\n\nornaments over it of the prettiest English china", "uuid" : "86C5D4AF", "_id" : { "$oid" : "5059eb2a6ee4de0200000074" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[737]", "startOffset" : 260, "end" : "/div[1]/p[737]", "endOffset" : 481, "_id" : { "$oid" : "5059eb2a6ee4de0200000075" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348070186524 }, "created" : { "$date" : 1348070186524 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5059eb5a6ee4de0200000076", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Again, typical people live here. Things aren't set up to be dark and dingy. They're nice.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "The windows, to which\n\nshe looked with peculiar dependence, from having heard the general talk\n\nof his preserving them in their Gothic form with reverential care, were\n\nyet less what her fancy had portrayed. To be sure, the pointed arch\n\nwas preserved—the form of them was Gothic—they might be even\n\ncasements—but every pane was so large, so clear, so light!", "uuid" : "3FFAFE9E", "_id" : { "$oid" : "5059eb5a6ee4de0200000076" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[737]", "startOffset" : 483, "end" : "/div[1]/p[737]", "endOffset" : 841, "_id" : { "$oid" : "5059eb5a6ee4de0200000077" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348070234952 }, "created" : { "$date" : 1348070234952 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5059eb6f80a4ac0200000086", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Clearly not distressing enough.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "To an\n\nimagination which had hoped for the smallest divisions, and the heaviest\n\nstone-work, for painted glass, dirt, and cobwebs, the difference was\n\nvery distressing.", "uuid" : "A6DBAE30", "_id" : { "$oid" : "5059eb6f80a4ac0200000086" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[737]", "startOffset" : 842, "end" : "/div[1]/p[737]", "endOffset" : 1010, "_id" : { "$oid" : "5059eb6f80a4ac0200000087" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348070255570 }, "created" : { "$date" : 1348070255570 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5059ebde80a4ac0200000088", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Human nature to be curious.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "An\n\nimmense heavy chest! What can it hold? Why should it be placed here?\n\nPushed back too, as if meant to be out of sight!", "uuid" : "03E5DAD0", "_id" : { "$oid" : "5059ebde80a4ac0200000088" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[741]", "startOffset" : 66, "end" : "/div[1]/p[741]", "endOffset" : 189, "_id" : { "$oid" : "5059ebde80a4ac0200000089" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348070366367 }, "created" : { "$date" : 1348070366367 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5059ebfa80a4ac020000008a" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348070394540 }, "groups" : [ "21L.003" ], "id" : "5059ebfa80a4ac020000008a", "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "quote" : "The lock was silver, though tarnished from age; at each end\n\nwere the imperfect remains of handles also of silver, broken perhaps\n\nprematurely by some strange violence; and, on the centre of the lid, was\n\na mysterious cipher, in the same metal. Catherine bent over it intently,\n\nbut without being able to distinguish anything with certainty.", "ranges" : [ { "start" : "/div[1]/p[741]", "startOffset" : 499, "end" : "/div[1]/p[741]", "endOffset" : 840, "_id" : { "$oid" : "5059ebfa80a4ac020000008b" } } ], "tags" : [], "text" : "Because it has a lock, it must contain something interesting, right?", "updated" : { "$date" : 1348070446706 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "woursler@mit.edu", "username" : "Will O.", "uuid" : "10A97F76" } -{ "id" : "5059eca96ee4de0200000078", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Bedspread", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "counterpane", "uuid" : "D57DD435", "_id" : { "$oid" : "5059eca96ee4de0200000078" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[742]", "startOffset" : 1535, "end" : "/div[1]/p[742]", "endOffset" : 1546, "_id" : { "$oid" : "5059eca96ee4de0200000079" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348070569169 }, "created" : { "$date" : 1348070569169 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5059ecc66ee4de020000007a", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Again, things are mundane. They're real. It's not a work of fancy.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "gave to her astonished eyes\n\nthe view of a white cotton counterpane, properly folded, reposing at one\n\nend of the chest in undisputed possession!", "uuid" : "A9214528", "_id" : { "$oid" : "5059ecc66ee4de020000007a" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[742]", "startOffset" : 1479, "end" : "/div[1]/p[742]", "endOffset" : 1624, "_id" : { "$oid" : "5059ecc66ee4de020000007b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348070598628 }, "created" : { "$date" : 1348070598628 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5059ed5f6ee4de020000007c", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Catherine recognizes the mundane, but doesn't internalize it.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "have to wait shivering in the cold till all the\n\nfamily are in bed, as so many poor girls have been obliged to do, and\n\nthen to have a faithful old servant frightening one by coming in with a\n\nfaggot! How glad I am that Northanger is what it is! If it had been like\n\nsome other places, I do not know that, in such a night as this, I could\n\nhave answered for my courage: but now, to be sure, there is nothing to\n\nalarm one.", "uuid" : "59F8B062", "_id" : { "$oid" : "5059ed5f6ee4de020000007c" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[748]", "startOffset" : 1445, "end" : "/div[1]/p[748]", "endOffset" : 1867, "_id" : { "$oid" : "5059ed5f6ee4de020000007d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348070751134 }, "created" : { "$date" : 1348070751134 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5059ed8180a4ac020000008c", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Really?", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "she scorned the causeless\n\nfears of an idle fancy", "uuid" : "631D292E", "_id" : { "$oid" : "5059ed8180a4ac020000008c" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[749]", "startOffset" : 549, "end" : "/div[1]/p[749]", "endOffset" : 598, "_id" : { "$oid" : "5059ed8180a4ac020000008d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348070785243 }, "created" : { "$date" : 1348070785243 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5059eda580a4ac020000008e", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Right away, she finds another \"mystery\"", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "she was struck by the\n\nappearance of a high, old-fashioned black cabinet, which, though in\n\na situation conspicuous enough, had never caught her notice before.", "uuid" : "76B2E174", "_id" : { "$oid" : "5059eda580a4ac020000008e" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[749]", "startOffset" : 1124, "end" : "/div[1]/p[749]", "endOffset" : 1283, "_id" : { "$oid" : "5059eda580a4ac020000008f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348070821245 }, "created" : { "$date" : 1348070821245 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a09d56ee4de020000007f", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Looking like a skinned animal is luxury? Chole,Melanchole,bool good, Phlegm bad? As it is associated with winter?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "luxuriances", "uuid" : "E776C19F", "_id" : { "$oid" : "505a09d56ee4de020000007f" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 409, "end" : "/div[1]/p[2]", "endOffset" : 420, "_id" : { "$oid" : "505a09d56ee4de0200000080" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348078037474 }, "created" : { "$date" : 1348078037474 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a1a6f6ee4de0200000083", "user" : "danweber@mit.edu", "username" : "Dan W.", "text" : "vokab", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "beigemischt", "uuid" : "A075FFAE", "_id" : { "$oid" : "505a1a6f6ee4de0200000083" }, "permissions" : { "delete" : [ "danweber@mit.edu" ], "update" : [ "danweber@mit.edu" ], "admin" : [ "danweber@mit.edu" ], "read" : [ "danweber@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[7]", "startOffset" : 383, "end" : "/div[1]/div[1]/p[7]", "endOffset" : 394, "_id" : { "$oid" : "505a1a6f6ee4de0200000084" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1348082287728 }, "created" : { "$date" : 1348082287728 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a1c8e6ee4de0200000085", "user" : "danweber@mit.edu", "username" : "Dan W.", "text" : "Es ist sehr interessant, dass seine stärkste Erinnerung ein Duft ist.", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Sie war frisch, brannte in der Nase, so als hätte man ihr ein Gewürz beigemischt", "uuid" : "D7392480", "_id" : { "$oid" : "505a1c8e6ee4de0200000085" }, "permissions" : { "delete" : [ "danweber@mit.edu" ], "update" : [ "danweber@mit.edu" ], "admin" : [ "danweber@mit.edu" ], "read" : [ "danweber@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[7]", "startOffset" : 314, "end" : "/div[1]/div[1]/p[7]", "endOffset" : 394, "_id" : { "$oid" : "505a1c8e6ee4de0200000086" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1348082830347 }, "created" : { "$date" : 1348082830347 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a1d4880a4ac0200000090", "user" : "danweber@mit.edu", "username" : "Dan W.", "text" : "vokab", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "vermisste", "uuid" : "16B84C65", "_id" : { "$oid" : "505a1d4880a4ac0200000090" }, "permissions" : { "delete" : [ "danweber@mit.edu" ], "update" : [ "danweber@mit.edu" ], "admin" : [ "danweber@mit.edu" ], "read" : [ "danweber@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[7]", "startOffset" : 763, "end" : "/div[1]/div[1]/p[7]", "endOffset" : 772, "_id" : { "$oid" : "505a1d4880a4ac0200000091" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1348083016164 }, "created" : { "$date" : 1348083016164 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a1e946ee4de0200000087", "user" : "danweber@mit.edu", "username" : "Dan W.", "text" : "Viele Menschen aus Turkei mit Zafer", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Deshalb ist der Zug so überfüllt", "uuid" : "96240691", "_id" : { "$oid" : "505a1e946ee4de0200000087" }, "permissions" : { "delete" : [ "danweber@mit.edu" ], "update" : [ "danweber@mit.edu" ], "admin" : [ "danweber@mit.edu" ], "read" : [ "danweber@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[10]", "startOffset" : 105, "end" : "/div[1]/div[1]/p[10]", "endOffset" : 137, "_id" : { "$oid" : "505a1e946ee4de0200000088" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1348083348008 }, "created" : { "$date" : 1348083348008 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a1f1980a4ac0200000092", "user" : "danweber@mit.edu", "username" : "Dan W.", "text" : "Ich glaube, dass stimmt nicht...", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "keine armen Kinder.", "uuid" : "057B5752", "_id" : { "$oid" : "505a1f1980a4ac0200000092" }, "permissions" : { "delete" : [ "danweber@mit.edu" ], "update" : [ "danweber@mit.edu" ], "admin" : [ "danweber@mit.edu" ], "read" : [ "danweber@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[12]", "startOffset" : 84, "end" : "/div[1]/div[1]/p[12]", "endOffset" : 103, "_id" : { "$oid" : "505a1f1980a4ac0200000093" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1348083481396 }, "created" : { "$date" : 1348083481396 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a21a86ee4de0200000089", "user" : "danweber@mit.edu", "username" : "Dan W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Ein deutsches Wort brauchte mehrere türkische, um verstanden zu werden", "uuid" : "008D08FB", "_id" : { "$oid" : "505a21a86ee4de0200000089" }, "permissions" : { "delete" : [ "danweber@mit.edu" ], "update" : [ "danweber@mit.edu" ], "admin" : [ "danweber@mit.edu" ], "read" : [ "danweber@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[15]", "startOffset" : 844, "end" : "/div[1]/div[1]/p[15]", "endOffset" : 914, "_id" : { "$oid" : "505a21a86ee4de020000008a" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1348084136939 }, "created" : { "$date" : 1348084136939 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "505a21d680a4ac0200000094" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348084182045 }, "groups" : [ "21F.414" ], "id" : "505a21d680a4ac0200000094", "permissions" : { "delete" : [ "danweber@mit.edu" ], "update" : [ "danweber@mit.edu" ], "admin" : [ "danweber@mit.edu" ], "read" : [ "danweber@mit.edu" ] }, "quote" : "kein Land, sondern eine fremde Sprache", "ranges" : [ { "start" : "/div[1]/div[1]/p[15]", "startOffset" : 1241, "end" : "/div[1]/div[1]/p[15]", "endOffset" : 1279, "_id" : { "$oid" : "505a21d680a4ac0200000095" } } ], "tags" : [], "text" : "Wie die Gedicht", "updated" : { "$date" : 1348084223288 }, "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "user" : "danweber@mit.edu", "username" : "Dan W.", "uuid" : "8641A5CC" } -{ "id" : "505a23f66ee4de020000008b", "user" : "danweber@mit.edu", "username" : "Dan W.", "text" : "vokab", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "einprägte", "uuid" : "38FE6BC9", "_id" : { "$oid" : "505a23f66ee4de020000008b" }, "permissions" : { "delete" : [ "danweber@mit.edu" ], "update" : [ "danweber@mit.edu" ], "admin" : [ "danweber@mit.edu" ], "read" : [ "danweber@mit.edu" ] }, "tags" : [ "vokab" ], "ranges" : [ { "start" : "/div[1]/div[1]/p[18]", "startOffset" : 495, "end" : "/div[1]/div[1]/p[18]", "endOffset" : 504, "_id" : { "$oid" : "505a23f66ee4de020000008c" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1348084726917 }, "created" : { "$date" : 1348084726917 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a28d06ee4de020000008d", "user" : "danweber@mit.edu", "username" : "Dan W.", "text" : "Ich glaube, dass das nicht immer wahr ist.", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Ohne Grenzen gibt es keine Geborgenheit.", "uuid" : "B12766B2", "_id" : { "$oid" : "505a28d06ee4de020000008d" }, "permissions" : { "delete" : [ "danweber@mit.edu" ], "update" : [ "danweber@mit.edu" ], "admin" : [ "danweber@mit.edu" ], "read" : [ "danweber@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[28]", "startOffset" : 215, "end" : "/div[1]/div[1]/p[28]", "endOffset" : 255, "_id" : { "$oid" : "505a28d06ee4de020000008e" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1348085968591 }, "created" : { "$date" : 1348085968591 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a29f980a4ac0200000096", "user" : "danweber@mit.edu", "username" : "Dan W.", "text" : "vokab", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "kaum", "uuid" : "956DC6E0", "_id" : { "$oid" : "505a29f980a4ac0200000096" }, "permissions" : { "delete" : [ "danweber@mit.edu" ], "update" : [ "danweber@mit.edu" ], "admin" : [ "danweber@mit.edu" ], "read" : [ "danweber@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[37]", "startOffset" : 233, "end" : "/div[1]/div[1]/p[37]", "endOffset" : 237, "_id" : { "$oid" : "505a29f980a4ac0200000097" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1348086265015 }, "created" : { "$date" : 1348086265015 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a2b6d80a4ac0200000098", "user" : "danweber@mit.edu", "username" : "Dan W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "quote" : "Sprachgefühl kann nicht erlernt, aber empathisch erworben werden.", "uuid" : "4221320B", "_id" : { "$oid" : "505a2b6d80a4ac0200000098" }, "permissions" : { "delete" : [ "danweber@mit.edu" ], "update" : [ "danweber@mit.edu" ], "admin" : [ "danweber@mit.edu" ], "read" : [ "danweber@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[38]", "startOffset" : 0, "end" : "/div[1]/div[1]/p[38]", "endOffset" : 65, "_id" : { "$oid" : "505a2b6d80a4ac0200000099" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1348086637253 }, "created" : { "$date" : 1348086637253 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a2d516ee4de020000008f", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "Sounds like Frankenstein was having an episode", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "he saw a wildness in my eyes for which he could not account, and my loud, unrestrained, heartless laughter frightened and astonished him.", "uuid" : "44CFBB9C", "_id" : { "$oid" : "505a2d516ee4de020000008f" }, "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[16]", "startOffset" : 463, "end" : "/div[1]/p[16]", "endOffset" : 601, "_id" : { "$oid" : "505a2d516ee4de0200000090" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348087121755 }, "created" : { "$date" : 1348087121755 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a2d696ee4de0200000091", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "Chill out Frank!", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "\"My dear Victor,\" cried he, \"what, for God's sake, is the matter? Do not laugh in that manner. How ill you are! What is the cause of all this?\"", "uuid" : "805C6D7C", "_id" : { "$oid" : "505a2d696ee4de0200000091" }, "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[17]", "startOffset" : 0, "end" : "/div[1]/p[17]", "endOffset" : 143, "_id" : { "$oid" : "505a2d696ee4de0200000092" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348087145073 }, "created" : { "$date" : 1348087145073 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "505a2e126ee4de0200000093" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348087314617 }, "groups" : [ "21F.414" ], "id" : "505a2e126ee4de0200000093", "permissions" : { "delete" : [ "danweber@mit.edu" ], "update" : [ "danweber@mit.edu" ], "admin" : [ "danweber@mit.edu" ], "read" : [ "danweber@mit.edu" ] }, "quote" : "Die globalisierte Konsumgesellschaft, die internationale Vernetzung des Verkehrs und der Kommunikation machen die Grenzen porös und definieren neue Erkennungsmerkmale.", "ranges" : [ { "start" : "/div[1]/div[1]/p[49]", "startOffset" : 218, "end" : "/div[1]/div[1]/p[49]", "endOffset" : 385, "_id" : { "$oid" : "505a2e126ee4de0200000094" } } ], "tags" : [], "text" : "Es erscheint wie Friedmans \"The World is Flat\"", "updated" : { "$date" : 1348087359245 }, "uri" : "http://annotationstudio.mit.edu/documents/die-sprache-offnen", "user" : "danweber@mit.edu", "username" : "Dan W.", "uuid" : "FC23C137" } -{ "_id" : { "$oid" : "505a2e4980a4ac020000009a" }, "id" : "505a2e4980a4ac020000009a", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Catherine catches on with John's lack of decorum", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "propensities of a rattle", "uuid" : "2EC03299", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[271]", "startOffset" : 174, "end" : "/div[1]/p[271]", "endOffset" : 198, "_id" : { "$oid" : "505a2e4980a4ac020000009b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348087369287 }, "created" : { "$date" : 1348087369287 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505a2e6e6ee4de0200000095" }, "id" : "505a2e6e6ee4de0200000095", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "parallel to kidnap in Gothic fiction novels", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "\"Good heavens!\" cried Catherine, quite frightened. \"Then pray let us\n\nturn back; they will certainly meet with an accident if we go on. Do let\n\nus turn back, Mr. Thorpe; stop and speak to my brother, and tell him how\n\nvery unsafe it is.\"", "uuid" : "6C5C1205", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "romanticism" ], "ranges" : [ { "start" : "/div[1]/p[269]", "startOffset" : 2, "end" : "/div[1]/p[269]", "endOffset" : 239, "_id" : { "$oid" : "505a2e6e6ee4de0200000096" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348087406358 }, "created" : { "$date" : 1348087406358 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505a2f8b6ee4de0200000097" }, "id" : "505a2f8b6ee4de0200000097", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Catherine already dislikes the idea of riding with John; just based on the way John describes his carriage and drives it", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Their drive, even when this subject was over, was not likely to be very\n\nagreeable.", "uuid" : "FF375706", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[408]", "startOffset" : 2, "end" : "/div[1]/p[408]", "endOffset" : 85, "_id" : { "$oid" : "505a2f8b6ee4de0200000098" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348087691173 }, "created" : { "$date" : 1348087691173 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a34dc6ee4de0200000099", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "the whole ride to northanger abbey henry tickles at catherine's imagination...knowledge of novels come out even though primarily in this time period it was mostly women who read; not high form of \"education\" but this further shows their playful relationship....", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "\"No, certainly. We shall not have to explore our way into a hall dimly\n\nlighted by the expiring embers of a wood fire—nor be obliged to spread\n\nour beds on the floor of a room without windows, doors, or furniture.\n\nBut you must be aware that when a young lady is (by whatever means)\n\nintroduced into a dwelling of this kind, she is always lodged apart from\n\nthe rest of the family. While they snugly repair to their own end of the\n\nhouse, she is formally conducted by Dorothy, the ancient housekeeper, up\n\na different staircase, and along many gloomy passages, into an apartment\n\nnever used since some cousin or kin died in it about twenty years\n\nbefore. Can you stand such a ceremony as this? Will not your mind\n\nmisgive you when you find yourself in this gloomy chamber—too lofty and\n\nextensive for you, with only the feeble rays of a single lamp to take\n\nin its size—its walls hung with tapestry exhibiting figures as large as\n\nlife, and the bed, of dark green stuff or purple velvet, presenting even\n\na funereal appearance? Will not your heart sink within you?\"", "uuid" : "B866468A", "_id" : { "$oid" : "505a34dc6ee4de0200000099" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[726]", "startOffset" : 2, "end" : "/div[1]/p[726]", "endOffset" : 1067, "_id" : { "$oid" : "505a34dc6ee4de020000009a" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348089052356 }, "created" : { "$date" : 1348089052356 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a34fe80a4ac020000009c", "user" : "danweber@mit.edu", "username" : "Dan W.", "text" : "Die Bild des Deutschland war vermittlet, dass Leute gemütlich war, als die Mauer da war. Obwohl viele Deutschen die Mauer, und die Scheidung des Osten und Westen, hasst, haben sie lang vorher die Mauer gekannt und jetzt ist es nicht da.", "uri" : "http://annotationstudio.mit.edu/documents/die-mauer", "quote" : "Die Mauer (1998)", "uuid" : "7F3239FE", "_id" : { "$oid" : "505a34fe80a4ac020000009c" }, "permissions" : { "delete" : [ "danweber@mit.edu" ], "update" : [ "danweber@mit.edu" ], "admin" : [ "danweber@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 0, "end" : "/div[1]/p[2]", "endOffset" : 18, "_id" : { "$oid" : "505a34fe80a4ac020000009d" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1348089086823 }, "created" : { "$date" : 1348089086823 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a35886ee4de020000009b", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "knew not to be surprised--she has never been to a place like Northanger Abbey and did not keep her expectations high, but she still has a small hope inside her that everything she imagined will come true--> her playful/childish/innocent side ", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "e knew not that she had any right to be surprised, but there was a\n\nsomething in this mode of approach which she certainly had not expected.\n\nT", "uuid" : "97231F45", "_id" : { "$oid" : "505a35886ee4de020000009b" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[736]", "startOffset" : 4, "end" : "/div[1]/p[736]", "endOffset" : 147, "_id" : { "$oid" : "505a35886ee4de020000009c" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348089224880 }, "created" : { "$date" : 1348089224880 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a35dd6ee4de020000009d", "user" : "danweber@mit.edu", "username" : "Dan W.", "text" : "Viele Verbrechen sind klein im Vergliech zu der Mauer.", "uri" : "http://annotationstudio.mit.edu/documents/die-mauer", "quote" : "In ihrem schatten warfen\n alle keinen schatten", "uuid" : "5A8B02C5", "_id" : { "$oid" : "505a35dd6ee4de020000009d" }, "permissions" : { "delete" : [ "danweber@mit.edu" ], "update" : [ "danweber@mit.edu" ], "admin" : [ "danweber@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 0, "end" : "/div[1]/p[6]", "endOffset" : 47, "_id" : { "$oid" : "505a35dd6ee4de020000009e" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1348089309238 }, "created" : { "$date" : 1348089309238 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a35ee6ee4de020000009f", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "use of vivid language; descriptions are very clear and personal---seizing, trembling FEARFUL curiosity...really takes readers into catherine's body", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "fearful curiosity was every moment growing greater; and seizing,\n\nwith trembling hands, the hasp of the lock, she resolved at all hazards\n\nto satisfy herself at least as to its contents.", "uuid" : "59C29F6B", "_id" : { "$oid" : "505a35ee6ee4de020000009f" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[742]", "startOffset" : 5, "end" : "/div[1]/p[742]", "endOffset" : 192, "_id" : { "$oid" : "505a35ee6ee4de02000000a0" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348089326071 }, "created" : { "$date" : 1348089326071 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a362180a4ac020000009e", "user" : "danweber@mit.edu", "username" : "Dan W.", "text" : "Was bedeutet das gerade?", "uri" : "http://annotationstudio.mit.edu/documents/die-mauer", "quote" : "schleiften", "uuid" : "92242CC3", "_id" : { "$oid" : "505a362180a4ac020000009e" }, "permissions" : { "delete" : [ "danweber@mit.edu" ], "update" : [ "danweber@mit.edu" ], "admin" : [ "danweber@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 15, "end" : "/div[1]/p[3]", "endOffset" : 25, "_id" : { "$oid" : "505a362180a4ac020000009f" } } ], "groups" : [ "21F.414" ], "updated" : { "$date" : 1348089377853 }, "created" : { "$date" : 1348089377853 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a363c80a4ac02000000a0", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "i've always thought that curiosity was something that related only to the mind; her eyes were straining with curiosity--interesting way to put this; more open for readers to think about what her facial expression is at this point", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "eye straining with curiosity", "uuid" : "42B8F0E3", "_id" : { "$oid" : "505a363c80a4ac02000000a0" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[750]", "startOffset" : 104, "end" : "/div[1]/p[750]", "endOffset" : 132, "_id" : { "$oid" : "505a363c80a4ac02000000a1" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348089404323 }, "created" : { "$date" : 1348089404323 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a368e80a4ac02000000a2", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "steadily--> use of language and choice of austen's vocabulary interest me", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "steadily refused", "uuid" : "86C3300C", "_id" : { "$oid" : "505a368e80a4ac02000000a2" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1004]", "startOffset" : 5, "end" : "/div[1]/p[1004]", "endOffset" : 21, "_id" : { "$oid" : "505a368e80a4ac02000000a3" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348089486802 }, "created" : { "$date" : 1348089486802 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a38366ee4de02000000a1", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "shallowness of mrs. allen; not the most prominent quote that conveys this personality trait yet/ needle and thread--> feminine characteristics as well as domestic thought/ carriage--> wealth and elegance; shows what is important in mrs. allen's life....she is a typical sheltered socialite", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Mrs. Allen, whose vacancy of mind and\n\nincapacity for thinking were such, that as she never talked a great\n\ndeal, so she could never be entirely silent; and, therefore, while she\n\nsat at her work, if she lost her needle or broke her thread, if she\n\nheard a carriage in the street, or saw a speck upon her gown, she must\n\nobserve it aloud, whether there were anyone at leisure to answer her or", "uuid" : "1EFC657C", "_id" : { "$oid" : "505a38366ee4de02000000a1" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[241]", "startOffset" : 1455, "end" : "/div[1]/p[241]", "endOffset" : 1847, "_id" : { "$oid" : "505a38366ee4de02000000a2" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348089910846 }, "created" : { "$date" : 1348089910846 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a392180a4ac02000000a5", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "naive catherine; conveys how little ability she has when it comes to percepting people and relationships; maybe isabella belittling her a bit(?)", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "\"Yes,\n\nmy dear Catherine, it is so indeed; your penetration has not deceived\n\nyou. Oh! That arch eye of yours! It sees through everything.\"", "uuid" : "02857E0C", "_id" : { "$oid" : "505a392180a4ac02000000a5" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[542]", "startOffset" : 214, "end" : "/div[1]/p[542]", "endOffset" : 353, "_id" : { "$oid" : "505a392180a4ac02000000a6" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348090145203 }, "created" : { "$date" : 1348090145203 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a398780a4ac02000000a7", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "now suspects different sides to peoples personalities; breaks from her innocent shell; henry takes her to the world of wealth in which she thinks she will find everything she has been imagining (from books, etc) but then her experiences at the places henry takes her to actually makes her understand reality better", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "nd. But in England it was\n\nnot so; among the English, she believed, in their hearts and habits,\n\nthere was a general though unequal mixture of good and bad. Upon this\n\nconviction, she would not be surprised if even in Henry and Eleanor\n\nTilney, some slight imperfection might hereafter appear; and upon this\n\nconviction she need not fear to acknowledge some actual specks in\n\nthe character of their father, who, though cleared from the grossly\n\ninjurious suspicions which she must ever blush to have entertained, she\n\ndid believe, upon serious consideration, to be not perfectly amiable.", "uuid" : "C825ACA2", "_id" : { "$oid" : "505a398780a4ac02000000a7" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[844]", "startOffset" : 1055, "end" : "/div[1]/p[844]", "endOffset" : 1642, "_id" : { "$oid" : "505a398780a4ac02000000a8" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348090247060 }, "created" : { "$date" : 1348090247060 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a3b4b6ee4de02000000a3", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "doesn't think she will be tired of Bath; yet he thinks she will be--> foreshadows that she will not end up in bath...she will follow him and his journey will become her journey once they are together...there is a reason for why characters say the things they say--all the quotes they say have to do with something in the future, hint at something, or serve a certain purpose...", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "\"I do not think I should be tired, if I were to stay here six months.\"\n\n\n\n\n\n\"Bath, compared with London, has little variety, and so everybody finds\n\nout every year. 'For six weeks, I allow Bath is pleasant enough; but\n\nbeyond that, it is the most tiresome place in the world.'", "uuid" : "3716ADA1", "_id" : { "$oid" : "505a3b4b6ee4de02000000a3" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[337]", "startOffset" : 2, "end" : "/div[1]/p[338]", "endOffset" : 203, "_id" : { "$oid" : "505a3b4b6ee4de02000000a4" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348090699304 }, "created" : { "$date" : 1348090699304 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a3c3a80a4ac02000000a9", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "short sentence at the beginning of a chapter makes an impact...makes you think because it's a short, simple sentence. simple vocab as well. really over? probably not. but i felt for catherine when i read this. the period makes it seem like there is a pause in thought, and this pause made me think and related to a time in my own life", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "visions of romance were over.", "uuid" : "BF356312", "_id" : { "$oid" : "505a3c3a80a4ac02000000a9" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[842]", "startOffset" : 6, "end" : "/div[1]/p[842]", "endOffset" : 36, "_id" : { "$oid" : "505a3c3a80a4ac02000000aa" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348090938026 }, "created" : { "$date" : 1348090938026 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a3d2280a4ac02000000ab", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "whole letter conveys isabella=static character and catherine=dynamic and changing....catherine changes from when she was brought up realistically-->romanticism--> mixture of both... desperation, contradictions present as well", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Pray explain everything to his\n\nsatisfaction; or, if he still harbours any doubt, a line from himself\n\nto me, or a call at Putney when next in town, might set all to rights.\n\nI have not been to the rooms this age, nor to the play, except going in\n\nlast night with the Hodges, for a frolic, at half price: they teased\n\nme into it; and I was determined they should not say I shut myself up\n\nbecause Tilney was gone", "uuid" : "7D6CA170", "_id" : { "$oid" : "505a3d2280a4ac02000000ab" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[915]", "startOffset" : 2682, "end" : "/div[1]/p[915]", "endOffset" : 3094, "_id" : { "$oid" : "505a3d2280a4ac02000000ac" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348091170649 }, "created" : { "$date" : 1348091170649 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a3db180a4ac02000000ad", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "do not imagine that i often read novels...i was always in the mindset as a child that the more books you read, the more your imagination, creativity, and vision of the world grows.....clearly times contrast with the time of the book; this sets up the tone of how books are perceived in Northanger Abbey--> catherine likes books, yet is cautious about how she talks to people about it", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "\"I am no novel-reader—I seldom look into novels—Do not\n\nimagine that I often read novels—It is really very well for a novel.\"\n\nSuch is the common can", "uuid" : "0455A39B", "_id" : { "$oid" : "505a3db180a4ac02000000ad" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[104]", "startOffset" : 2237, "end" : "/div[1]/p[104]", "endOffset" : 2387, "_id" : { "$oid" : "505a3db180a4ac02000000ae" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348091313999 }, "created" : { "$date" : 1348091313999 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a488c04ebe20200000009", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "The delusions of the future are gone, now he is left with the horror of the present", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "but now that I had finished, the beauty of the dream vanished, and breathless horror and disgust filled my heart.", "uuid" : "C6A7A49B", "_id" : { "$oid" : "505a488c04ebe20200000009" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 302, "end" : "/div[1]/p[3]", "endOffset" : 415, "_id" : { "$oid" : "505a488c04ebe2020000000a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348094092227 }, "created" : { "$date" : 1348094092227 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505a49a304ebe2020000000d" }, "id" : "505a49a304ebe2020000000d", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Catherine has by now formed a strong opinion of John through the multiple carriage rides with him; she is able to refuse him readily, showing strength in her character and shows growth in understanding people compared to when she first arrived at Bath", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Catherine, with all the earnestness of truth, expressed her astonishment\n\nat such a charge, protesting her innocence of every thought of Mr.\n\nThorpe's being in love with her, and the consequent impossibility of\n\nher having ever intended to encourage him.", "uuid" : "192F7502", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "maturity" ], "ranges" : [ { "start" : "/div[1]/p[661]", "startOffset" : 2, "end" : "/div[1]/p[661]", "endOffset" : 256, "_id" : { "$oid" : "505a49a304ebe2020000000e" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348094371322 }, "created" : { "$date" : 1348094371322 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a5adb6ee4de02000000c8", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "What a bold assertion!", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "the most\n\ncomplete of its kind in England, his carriage the neatest, his horse the\n\nbest goer, and himself the best coachman", "uuid" : "400E0327", "_id" : { "$oid" : "505a5adb6ee4de02000000c8" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[267]", "startOffset" : 708, "end" : "/div[1]/p[267]", "endOffset" : 832, "_id" : { "$oid" : "505a5adb6ee4de02000000c9" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348098779042 }, "created" : { "$date" : 1348098779042 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a5b156ee4de02000000ca", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Thorpe tries to compliment his own carriage by belittling Morland's.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "you might shake it to pieces yourself with a touch", "uuid" : "25AF8B83", "_id" : { "$oid" : "505a5b156ee4de02000000ca" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[268]", "startOffset" : 230, "end" : "/div[1]/p[268]", "endOffset" : 280, "_id" : { "$oid" : "505a5b156ee4de02000000cb" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348098837935 }, "created" : { "$date" : 1348098837935 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "505a5b7504ebe20200000013" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348098933730 }, "groups" : [ "21L.003" ], "id" : "505a5b7504ebe20200000013", "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "quote" : "undertake for\n\nfive pounds to drive it to York and back again, without losing a nail", "ranges" : [ { "start" : "/div[1]/p[270]", "startOffset" : 348, "end" : "/div[1]/p[270]", "endOffset" : 432, "_id" : { "$oid" : "505a5b7504ebe20200000014" } } ], "tags" : [], "text" : "He reverts his entire speech in less than three paragraphs just to show that he is a good driver! He never seemed to care about the coherence in his logic---maybe he had never been taught to talk properly.", "updated" : { "$date" : 1348099597880 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "uuid" : "6FCF7E40" } -{ "id" : "505a658f6ee4de02000000cc", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Thorpe does not believe what Catherine said; he's convinced that Morland is rich. He will not deign to befriend with anyone unable to own a carriage.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "its being a\n\nd—thing to be miserly", "uuid" : "755F5690", "_id" : { "$oid" : "505a658f6ee4de02000000cc" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[415]", "startOffset" : 124, "end" : "/div[1]/p[415]", "endOffset" : 158, "_id" : { "$oid" : "505a658f6ee4de02000000cd" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348101519354 }, "created" : { "$date" : 1348101519354 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a65f504ebe20200000016", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "A private carriage is an inherent part of the expectations of a materialistic woman like Isabella.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "with a\n\ncarriage at her command, a new name on her tickets, and a brilliant\n\nexhibition of hoop rings on her finger", "uuid" : "AF0AAAF3", "_id" : { "$oid" : "505a65f504ebe20200000016" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[566]", "startOffset" : 828, "end" : "/div[1]/p[566]", "endOffset" : 943, "_id" : { "$oid" : "505a65f504ebe20200000017" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348101621017 }, "created" : { "$date" : 1348101621017 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a669b6ee4de02000000ce", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "The brother test---Henry passes. A good brother is usually benevolent and amiable.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "\"I am always sorry to leave Eleanor.\"", "uuid" : "1744772B", "_id" : { "$oid" : "505a669b6ee4de02000000ce" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[720]", "startOffset" : 2, "end" : "/div[1]/p[720]", "endOffset" : 39, "_id" : { "$oid" : "505a669b6ee4de02000000cf" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348101787299 }, "created" : { "$date" : 1348101787299 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a66c904ebe20200000019", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Thorpe fails the brother test.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "observed that\n\nthey both looked very ugly.", "uuid" : "BF9099AC", "_id" : { "$oid" : "505a66c904ebe20200000019" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[191]", "startOffset" : 909, "end" : "/div[1]/p[191]", "endOffset" : 951, "_id" : { "$oid" : "505a66c904ebe2020000001a" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348101833697 }, "created" : { "$date" : 1348101833697 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "505a689804ebe2020000001b" }, "id" : "505a689804ebe2020000001b", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Henry knows a lot about a dresses. Seems metrosexual.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "\"That is exactly what I should have guessed it, madam,\" said Mr. Tilney,\n\nlooking at the muslin.\n\n\n\n\n\n\"Do you understand muslins, sir?\"\n\n\n\n\n\n\"Particularly well; I always buy my own cravats, and am allowed to be an\n\nexcellent judge; and my sister has often trusted me in the choice of a\n\ngown. I bought one for her the other day, and it was pronounced to be a\n\nprodigious bargain by every lady who saw it. I gave but five shillings a\n\nyard for it, and a true Indian muslin.\"\n\n\n\n\n\nMrs. Allen was quite struck by his genius. \"Men commonly take so little\n\nnotice of those things,\" said she; \"I can never get Mr. Allen to know\n\none of my gowns from another. You must be a great comfort to your\n\nsister, sir.\"\n\n\n\n\n\n\"I hope I am, madam.\"\n\n\n\n\n\n\"And pray, sir, what do you think of Miss Morland's gown?\"\n\n\n\n\n\n\"It is very pretty, madam,\" said he, gravely examining it; \"but I do not\n\nthink it will wash well; I am afraid it will fray.\"\n\n\n\n\n\n\"How can you,\" said Catherine, laughing, \"be so—\" She had almost said\n\n\"strange.\"\n\n\n\n\n\n\"I am quite of your opinion, sir,\" replied Mrs. Allen; \"and so I told\n\nMiss Morland when she bought it.\"\n\n\n\n\n\n\"But then you know, madam, muslin always turns to some account or other;\n\nMiss Morland will get enough out of it for a handkerchief, or a cap, or\n\na cloak. Muslin can never be said to be wasted. I have heard my sister\n\nsay so forty times, when she has been extravagant in buying more than\n\nshe wanted, or careless in cutting it to pieces.\"", "uuid" : "B113CA0A", "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[75]", "startOffset" : 2, "end" : "/div[1]/p[84]", "endOffset" : 343, "_id" : { "$oid" : "505a689804ebe2020000001c" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348102296749 }, "created" : { "$date" : 1348102296749 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a69306ee4de02000000d0", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "How happy Catherine must be!", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "greatest happiness in the world", "uuid" : "4846F3D9", "_id" : { "$oid" : "505a69306ee4de02000000d0" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[716]", "startOffset" : 1376, "end" : "/div[1]/p[716]", "endOffset" : 1407, "_id" : { "$oid" : "505a69306ee4de02000000d1" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348102448639 }, "created" : { "$date" : 1348102448639 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a69b804ebe2020000001f", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Catherine certainly had a vivid imagination at this point. This is the peak of her idealism.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "with solemn awe to afford a glimpse of its massy walls of grey\n\nstone, rising amidst a grove of ancient oaks, with the last beams of the\n\nsun playing in beautiful splendour on its high Gothic windows.", "uuid" : "56D4A84B", "_id" : { "$oid" : "505a69b804ebe2020000001f" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[735]", "startOffset" : 224, "end" : "/div[1]/p[735]", "endOffset" : 424, "_id" : { "$oid" : "505a69b804ebe20200000020" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348102584562 }, "created" : { "$date" : 1348102584562 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a6a3804ebe20200000021", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Her gratifications reached the peak at this confession.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "such sweet proofs of her importance with them", "uuid" : "95A71DC4", "_id" : { "$oid" : "505a6a3804ebe20200000021" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[935]", "startOffset" : 444, "end" : "/div[1]/p[935]", "endOffset" : 489, "_id" : { "$oid" : "505a6a3804ebe20200000022" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348102712836 }, "created" : { "$date" : 1348102712836 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a6a6c6ee4de02000000d2", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "The carriage that brought all the sorrow...", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "a\n\ncarriage was driving up to the door", "uuid" : "61DDAF39", "_id" : { "$oid" : "505a6a6c6ee4de02000000d2" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[936]", "startOffset" : 780, "end" : "/div[1]/p[936]", "endOffset" : 819, "_id" : { "$oid" : "505a6a6c6ee4de02000000d3" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348102764409 }, "created" : { "$date" : 1348102764409 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a6ad06ee4de02000000d4", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "An excellent parallelism. Sleep or mere repose---no rest was possible.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Sleep, or repose that deserved the name\n\nof sleep, was out of the question.", "uuid" : "1CF520D0", "_id" : { "$oid" : "505a6ad06ee4de02000000d4" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[955]", "startOffset" : 28, "end" : "/div[1]/p[955]", "endOffset" : 103, "_id" : { "$oid" : "505a6ad06ee4de02000000d5" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348102864153 }, "created" : { "$date" : 1348102864153 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a6b7904ebe20200000023", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "The conditions of these trips are drastically different: Henry's curricle vs. post chaise; full of company vs. alone; center of attention vs. negligence. Imaginations are crushed by reality.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Catherine was too wretched to be fearful.", "uuid" : "7D605044", "_id" : { "$oid" : "505a6b7904ebe20200000023" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[961]", "startOffset" : 2, "end" : "/div[1]/p[961]", "endOffset" : 43, "_id" : { "$oid" : "505a6b7904ebe20200000024" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348103033671 }, "created" : { "$date" : 1348103033671 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "505a6dba6ee4de02000000d6" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348103610250 }, "groups" : [ "21L.003" ], "id" : "505a6dba6ee4de02000000d6", "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "quote" : "the first object she beheld was a young\n\nman whom she had never seen before", "ranges" : [ { "start" : "/div[1]/p[995]", "startOffset" : 1016, "end" : "/div[1]/p[995]", "endOffset" : 1091, "_id" : { "$oid" : "505a6dba6ee4de02000000d7" } } ], "tags" : [], "text" : "An abrupt arrival. Reminds of Edward Ferrars' sudden arrival telling Elinor that his fiance married his brother. Without this surprise, the ending would be gloomy.", "updated" : { "$date" : 1348103637996 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "uuid" : "E17EE684" } -{ "id" : "505a833a6ee4de02000000da", "user" : "moverlin@mit.edu", "username" : "Matt O.", "text" : "the wording is different in the Penguin text. Mrs. Thorpe seems to think about/take note of her daughters' appearance...This makes her a horrible person.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Isabella, my eldest; is not she a fine young\n\nwoman? The others are very much admired too, but I believe Isabella is\n\nthe handsomest.\"", "uuid" : "7FE798D6", "_id" : { "$oid" : "505a833a6ee4de02000000da" }, "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[94]", "startOffset" : 238, "end" : "/div[1]/p[94]", "endOffset" : 372, "_id" : { "$oid" : "505a833a6ee4de02000000db" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348109114270 }, "created" : { "$date" : 1348109114270 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a83846ee4de02000000dc", "user" : "moverlin@mit.edu", "username" : "Matt O.", "text" : "Isabella says this, but then is not completely loyal to James when they are engaged.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "I have no notion of loving people by halves", "uuid" : "FD5E6FF5", "_id" : { "$oid" : "505a83846ee4de02000000dc" }, "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[118]", "startOffset" : 88, "end" : "/div[1]/p[118]", "endOffset" : 132, "_id" : { "$oid" : "505a83846ee4de02000000dd" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348109188973 }, "created" : { "$date" : 1348109188973 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a841b04ebe20200000025", "user" : "moverlin@mit.edu", "username" : "Matt O.", "text" : "John Thorpe is bragging about his horses here-- an example of how he values material possessions.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Hot! He had not turned a hair till we came to Walcot Church; but look\n\nat his forehand; look at his loins; only see how he moves; that horse\n\ncannot go less than ten miles an hour: tie his legs and he will get on.\n\nWhat do you think of my gig, Miss Morland? A neat one, is not it?\n\nWell hung; town-built; I have not had it a month. It was built for a\n\nChristchurch man, a friend of mine, a very good sort of fellow; he ran\n\nit a few weeks, till, I believe, it was convenient to have done with it.\n\nI happened just then to be looking out for some light thing of the kind,\n\nthough I had pretty well determined on a curricle too; but I chanced to\n\nmeet him on Magdalen Bridge, as he was driving into Oxford, last term:\n\n'Ah! Thorpe,' said he, 'do you happen to want such a little thing as\n\nthis? It is a capital one of the kind, but I am cursed tired of it.'\n\n'Oh! D—,' said I; 'I am your man; what do you ask?' And how much do you\n\nthink he did, Miss Morland?\"", "uuid" : "BC3A6250", "_id" : { "$oid" : "505a841b04ebe20200000025" }, "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[159]", "startOffset" : 3, "end" : "/div[1]/p[159]", "endOffset" : 963, "_id" : { "$oid" : "505a841b04ebe20200000026" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348109339402 }, "created" : { "$date" : 1348109339402 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505a84c36ee4de02000000de", "user" : "moverlin@mit.edu", "username" : "Matt O.", "text" : "Mrs. Allen is saying something that she doesn't exactly believe. Throughout the novel it seems as though some of the women are saying things for the purpose of people respecting them more. It seems as though some of the women are not completely truthful with themselves and others as they observe other people and their actions. ", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "This sentiment had been uttered so often in vain that Mrs. Allen had no\n\nparticular reason to hope it would be followed with more advantage now;", "uuid" : "A266A27C", "_id" : { "$oid" : "505a84c36ee4de02000000de" }, "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[93]", "startOffset" : 2, "end" : "/div[1]/p[93]", "endOffset" : 146, "_id" : { "$oid" : "505a84c36ee4de02000000df" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348109507594 }, "created" : { "$date" : 1348109507594 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505b6a6b36c90e0200000002", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "This opening paragraph starts off with a comparison between dialog and writing as a means to convey instruction. Hume argues that text is superior because of the ease with which you can explain a point and that it is without interruption. Dialog wastes time for several reasons, such as the audience may ask questions, you try and put things in terms that others will understand, and so on. Explanations are more succinct on paper.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Or, if he carries on the dispute in the\nnatural spirit of good company, by throwing in a variety of topics, and\npreserving a proper balance among the speakers, he often loses so much\ntime in preparations and transitions, that the reader will scarcely\nthink himself compensated, by all the graces of dialogue, for the order,\nbrevity, and precision, which are sacrificed to them.", "uuid" : "8F275B1A", "_id" : { "$oid" : "505b6a6b36c90e0200000002" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 957, "end" : "/div[1]/div[3]", "endOffset" : 1335, "_id" : { "$oid" : "505b6a6b36c90e0200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348168299651 }, "created" : { "$date" : 1348168299651 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505b6a9e04ebe20200000027", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Def: instill by persistent instruction", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "inculcated", "uuid" : "9C094A70", "_id" : { "$oid" : "505b6a9e04ebe20200000027" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 1642, "end" : "/div[1]/div[3]", "endOffset" : 1652, "_id" : { "$oid" : "505b6a9e04ebe20200000028" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348168350727 }, "created" : { "$date" : 1348168350727 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505b6b0736c90e0200000004", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "If some concept is so basic and simple, yet important, then it is possible for dialog to be used as the primary means of conveyance ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Any point of doctrine, which is so obvious that it scarcely admits of\ndispute", "uuid" : "8D6F5E5C", "_id" : { "$oid" : "505b6b0736c90e0200000004" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 1501, "end" : "/div[1]/div[3]", "endOffset" : 1578, "_id" : { "$oid" : "505b6b0736c90e0200000005" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348168455357 }, "created" : { "$date" : 1348168455357 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505b6bb004ebe20200000029", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "If the concept is too complex or not easily grasp, such as philosophical ones, text is the best medium for sharing ideas", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "the book carries us, in a manner,\ninto company; and unites the two greatest and purest pleasures of human\nlife, study and society.", "uuid" : "B838FB5C", "_id" : { "$oid" : "505b6bb004ebe20200000029" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 2429, "end" : "/div[1]/div[3]", "endOffset" : 2560, "_id" : { "$oid" : "505b6bb004ebe2020000002a" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348168624532 }, "created" : { "$date" : 1348168624532 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505b6d1f36c90e0200000006", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "He is going to share with us three views, from CLEANTHES, PHILO and DEMEA. It seems like these were arguments that he listened in on, but now feels should be written down because text is a more permanent and serious medium than dialog", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "My youth rendered me a mere auditor\nof their disputes; and that curiosity, natural to the early season of\nlife, has so deeply imprinted in my memory the whole chain and connection\nof their arguments, that, I hope, I shall not omit or confound any\nconsiderable part of them in the recital.", "uuid" : "1646A9FF", "_id" : { "$oid" : "505b6d1f36c90e0200000006" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 4369, "end" : "/div[1]/div[3]", "endOffset" : 4657, "_id" : { "$oid" : "505b6d1f36c90e0200000007" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348168991728 }, "created" : { "$date" : 1348168991728 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505b6e9536c90e0200000008", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "An opinion on the order in which children should be taught certain subjects", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "\"That\nstudents of philosophy ought first to learn logics, then ethics, next\nphysics, last of all the nature of the gods.\"", "uuid" : "F4F17775", "_id" : { "$oid" : "505b6e9536c90e0200000008" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 796, "end" : "/div[1]/div[4]", "endOffset" : 918, "_id" : { "$oid" : "505b6e9536c90e0200000009" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348169365244 }, "created" : { "$date" : 1348169365244 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "505b6ef704ebe2020000002b" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348169463809 }, "groups" : [ "21L.448J" ], "id" : "505b6ef704ebe2020000002b", "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "quote" : "While they pass through every other science, I\nstill remark the uncertainty of each part; the eternal disputations of\nmen; the obscurity of all philosophy; and the strange, ridiculous\nconclusions, which some of the greatest geniuses have derived from the\nprinciples of mere human reason. Having thus tamed their mind to a proper\nsubmission and self-diffidence, I have no longer any scruple of opening\nto them the greatest mysteries of religion; nor apprehend any danger from\nthat assuming arrogance of philosophy, which may lead them to reject the\nmost established doctrines and opinions.", "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 1799, "end" : "/div[1]/div[4]", "endOffset" : 2388, "_id" : { "$oid" : "505b6ef704ebe2020000002c" } } ], "tags" : [], "text" : "By going through the sciences first and explaining that there are so many phenomenon that are still unexplained, they will prep the childrens' minds for religion. It seems to me like they want to make sure that the future generations do not cling to religion, forgoing philosophy and the sciences or that they believe the sciences are above religion. as if they are trying to strike a balance between religion and philosophy", "updated" : { "$date" : 1348169824717 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "mpd91@mit.edu", "username" : "Michael D.", "uuid" : "EB239EF3" } -{ "id" : "505b70d904ebe2020000002d", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "If you can do it once, you can do it 100 times. The Stoics believe that by controlling the mind, you can achieve almost anything, withstanding pain, concentration, etc.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "That what a man can perform\nsometimes, and in some dispositions, he can perform always, and in every\ndisposition.", "uuid" : "6EED9AD1", "_id" : { "$oid" : "505b70d904ebe2020000002d" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 7477, "end" : "/div[1]/div[4]", "endOffset" : 7590, "_id" : { "$oid" : "505b70d904ebe2020000002e" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348169945876 }, "created" : { "$date" : 1348169945876 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505b733436c90e020000000a", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "They feel they can only trust their senses so far. I am not entirely sure, but it seems like the people they are worried about offending are the common man", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "We\nknow not how far we ought to trust our vulgar methods of reasoning in\nsuch a subject; since, even in common life, and in that province which is\npeculiarly appropriated to them, we cannot account for them, and are\nentirely guided by a kind of instinct or necessity in employing them.", "uuid" : "ECE70ACB", "_id" : { "$oid" : "505b733436c90e020000000a" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 12272, "end" : "/div[1]/div[4]", "endOffset" : 12557, "_id" : { "$oid" : "505b733436c90e020000000b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348170548815 }, "created" : { "$date" : 1348170548815 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "505b756a36c90e020000000c" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348171114088 }, "groups" : [ "21L.448J" ], "id" : "505b756a36c90e020000000c", "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "quote" : "Wherever evidence discovers itself, you adhere to it,\nnotwithstanding your pretended scepticism;", "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 13530, "end" : "/div[1]/div[4]", "endOffset" : 13626, "_id" : { "$oid" : "505b756a36c90e020000000d" } } ], "tags" : [], "text" : "Accusing PHILO of not being a real scepticist, instead he, and his followers, are quick to believe evidence proposed by scientists, like Newton and Galileo, despite of how improbable they may seem", "updated" : { "$date" : 1348171142599 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "mpd91@mit.edu", "username" : "Michael D.", "uuid" : "136653B6" } -{ "id" : "505b762b36c90e020000000e", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "When it comes to something not easily understood, people are quick to brush it aside as false. However, in the case of religion, it seems that people are more willing to put their faith in certain things, regardless of how improbable they may seem", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "There is indeed a kind of brutish and ignorant scepticism, as you well\nobserved, which gives the vulgar a general prejudice against what they do\nnot easily understand, and makes them reject every principle which\nrequires elaborate reasoning to prove and establish it. This species of\nscepticism is fatal to knowledge, not to religion; since we find, that\nthose who make greatest profession of it, give often their assent, not\nonly to the great truths of Theism and natural theology, but even to the\nmost absurd tenets which a traditional superstition has recommended to\nthem.", "uuid" : "7D6C149B", "_id" : { "$oid" : "505b762b36c90e020000000e" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 14329, "end" : "/div[1]/div[4]", "endOffset" : 14904, "_id" : { "$oid" : "505b762b36c90e020000000f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348171307914 }, "created" : { "$date" : 1348171307914 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505b77da04ebe2020000002f", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Talking about the battle between philosophy and religion, science and faith. ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "After the\nunion of philosophy with the popular religion, upon the first\nestablishment of Christianity, nothing was more usual, among all\nreligious teachers, than declamations against reason, against the senses,\nagainst every principle derived merely from human research and inquiry.", "uuid" : "C2B310AC", "_id" : { "$oid" : "505b77da04ebe2020000002f" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 18567, "end" : "/div[1]/div[4]", "endOffset" : 18849, "_id" : { "$oid" : "505b77da04ebe20200000030" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348171738854 }, "created" : { "$date" : 1348171738854 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505b790736c90e0200000010", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Certain types of education were a threat to the church because they enabled people to think freely, use reason, and this led to people questioning some aspects of religion", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "During ignorant ages, such as those which\nfollowed the dissolution of the ancient schools, the priests perceived,\nthat Atheism, Deism, or heresy of any kind, could only proceed from the\npresumptuous questioning of received opinions, and from a belief that\nhuman reason was equal to every thing.", "uuid" : "D824E2E6", "_id" : { "$oid" : "505b790736c90e0200000010" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 21357, "end" : "/div[1]/div[4]", "endOffset" : 21651, "_id" : { "$oid" : "505b790736c90e0200000011" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348172039776 }, "created" : { "$date" : 1348172039776 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "505b799704ebe20200000031" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348172183499 }, "groups" : [ "21L.448J" ], "id" : "505b799704ebe20200000031", "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "quote" : "If we distrust human reason, we have now no other principle to\nlead us into religion. Thus, sceptics in one age, dogmatists in another;\nwhichever system best suits the purpose of these reverend gentlemen, in\ngiving them an ascendant over mankind, they are sure to make it their\nfavourite principle, and established tenet.", "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 22242, "end" : "/div[1]/div[4]", "endOffset" : 22563, "_id" : { "$oid" : "505b799704ebe20200000032" } } ], "tags" : [], "text" : "The noble/wealthy class will embrace which ever system keeps them rich and in power. Back in the day, the church had an immense amount of power, and as a result a vast amount of wealth. It would have been in their best interest to quell those who tried to reason against them or prove their beliefs wrong in order to maintain their status", "updated" : { "$date" : 1348172196035 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "mpd91@mit.edu", "username" : "Michael D.", "uuid" : "B1ACAE98" } -{ "id" : "505b853d36c90e0200000012", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Arguing we understand what we can experience, but we have no experience of a divine being, so he is inferring that one cannot exist", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Our ideas reach no further than our experience. We\nhave no experience of divine attributes and operations. I need not\nconclude my syllogism. You can draw the inference yourself. And it is a\npleasure to me (and I hope to you too) that just reasoning and sound\npiety here concur in the same conclusion, and both of them establish the\nadorably mysterious and incomprehensible nature of the Supreme Being.", "uuid" : "E77FD890", "_id" : { "$oid" : "505b853d36c90e0200000012" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 4613, "end" : "/div[1]/div[5]", "endOffset" : 5015, "_id" : { "$oid" : "505b853d36c90e0200000013" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348175165975 }, "created" : { "$date" : 1348175165975 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505b856836c90e0200000014", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "They understand that there are processes that they are unable to observe or experience but still take place", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "You will find it to be\nnothing but one great machine, subdivided into an infinite number of\nlesser machines, which again admit of subdivisions to a degree beyond\nwhat human senses and faculties can trace and explain.", "uuid" : "E774DFEB", "_id" : { "$oid" : "505b856836c90e0200000014" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 5278, "end" : "/div[1]/div[5]", "endOffset" : 5494, "_id" : { "$oid" : "505b856836c90e0200000015" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348175208605 }, "created" : { "$date" : 1348175208605 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505b85da36c90e0200000016", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Looking around you can see proof of intelligent design, but they seem to think that it is the result of man's doing, or a being that is like man, instead of natural processes of selection and evolution", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "The curious adapting of means to ends, throughout all\nnature, resembles exactly, though it much exceeds, the productions of\nhuman contrivance; of human designs, thought, wisdom, and intelligence.\nSince, therefore, the effects resemble each other, we are led to infer,\nby all the rules of analogy, that the causes also resemble; and that the\nAuthor of Nature is somewhat similar to the mind of man, though possessed\nof much larger faculties, proportioned to the grandeur of the work which\nhe has executed. By this argument a posteriori, and by this argument\nalone, do we prove at once the existence of a Deity, and his similarity\nto human mind and intelligence.", "uuid" : "307D678D", "_id" : { "$oid" : "505b85da36c90e0200000016" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 5673, "end" : "/div[1]/div[5]", "endOffset" : 6334, "_id" : { "$oid" : "505b85da36c90e0200000017" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348175322993 }, "created" : { "$date" : 1348175322993 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "505b869336c90e0200000018" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348175507263 }, "groups" : [ "21L.448J" ], "id" : "505b869336c90e0200000018", "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "quote" : "The exact similarity of the cases\ngives us a perfect assurance of a similar event; and a stronger evidence\nis never desired nor sought after. But wherever you depart, in the least,\nfrom the similarity of the cases, you diminish proportionably the\nevidence; and may at last bring it to a very weak analogy, which is\nconfessedly liable to error and uncertainty. After having experienced the\ncirculation of the blood in human creatures, we make no doubt that it\ntakes place in TITIUS and MAEVIUS. But from its circulation in frogs and\nfishes, it is only a presumption, though a strong one, from analogy, that\nit takes place in men and other animals. The analogical reasoning is much\nweaker, when we infer the circulation of the sap in vegetables from our\nexperience that the blood circulates in animals; and those, who hastily\nfollowed that imperfect analogy, are found, by more accurate experiments,\nto have been mistaken.", "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 7510, "end" : "/div[1]/div[5]", "endOffset" : 8431, "_id" : { "$oid" : "505b869336c90e0200000019" } } ], "tags" : [], "text" : "They use solid examples of what they do have an understanding of to make parallels and hypothesize the way other systems may work. For example, the circulation of blood in frogs and fish was used to propose the idea of blood circulating in humans. However, this doesn't always work, since this was not the case in fruit, but they were able to prove this through experimentation", "updated" : { "$date" : 1348175559430 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "mpd91@mit.edu", "username" : "Michael D.", "uuid" : "845E8E5F" } -{ "id" : "505b875136c90e020000001a", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Determining what you can draw similarities between seems to be one of the major problems here. A house is a place where a family lives, while the universe is where \"everything\" exists, yet even though we know a house has to have a builder, we cannot conclude that the same holds for the universe. At least not in the same sense as a house - there could be a different type of origin", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "If we see a house, CLEANTHES, we conclude, with the greatest certainty,\nthat it had an architect or builder; because this is precisely that\nspecies of effect which we have experienced to proceed from that species\nof cause. But surely you will not affirm, that the universe bears such a\nresemblance to a house, that we can with the same certainty infer a\nsimilar cause, or that the analogy is here entire and perfect. The\ndissimilitude is so striking, that the utmost you can here pretend to is\na guess, a conjecture, a presumption concerning a similar cause; and how\nthat pretension will be received in the world, I leave you to consider.", "uuid" : "EC7AB83C", "_id" : { "$oid" : "505b875136c90e020000001a" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 8432, "end" : "/div[1]/div[5]", "endOffset" : 9070, "_id" : { "$oid" : "505b875136c90e020000001b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348175697058 }, "created" : { "$date" : 1348175697058 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505b887636c90e020000001c", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Seems like he is arguing that just having the \"ingredients\" for the universe lying around would not have resulted in its creation, someone with creative ability, such as the human mind, would have had to put the pieces together in the right fashion in order for the universe to come about.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Throw several pieces of steel together, without shape or\nform; they will never arrange themselves so as to compose a watch. Stone,\nand mortar, and wood, without an architect, never erect a house. But the\nideas in a human mind, we see, by an unknown, inexplicable economy,\narrange themselves so as to form the plan of a watch or house.\nExperience, therefore, proves, that there is an original principle of\norder in mind, not in matter. From similar effects we infer similar\ncauses. The adjustment of means to ends is alike in the universe, as in a\nmachine of human contrivance. The causes, therefore, must be resembling.", "uuid" : "C7092039", "_id" : { "$oid" : "505b887636c90e020000001c" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 13014, "end" : "/div[1]/div[5]", "endOffset" : 13634, "_id" : { "$oid" : "505b887636c90e020000001d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348175990942 }, "created" : { "$date" : 1348175990942 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505b8a3104ebe20200000033", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "I think it is interesting that they understand how vast the universe is", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "so immense a\nuniverse?", "uuid" : "C2E03717", "_id" : { "$oid" : "505b8a3104ebe20200000033" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 17731, "end" : "/div[1]/div[5]", "endOffset" : 17753, "_id" : { "$oid" : "505b8a3104ebe20200000034" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348176433150 }, "created" : { "$date" : 1348176433150 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505b8a9104ebe20200000035", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "The probability of life on other planets and whether or not it is structured in the same way as on Earth, because the disparity between humans and other animals is so great. Is this something that nature would have replicated elsewhere? ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Is there any reasonable ground to conclude,\nthat the inhabitants of other planets possess thought, intelligence,\nreason, or any thing similar to these faculties in men? When nature has\nso extremely diversified her manner of operation in this small globe, can\nwe imagine that she incessantly copies herself throughout so immense a\nuniverse? And if thought, as we may well suppose, be confined merely to\nthis narrow corner, and has even there so limited a sphere of action,\nwith what propriety can we assign it for the original cause of all\nthings?", "uuid" : "5796D1EE", "_id" : { "$oid" : "505b8a9104ebe20200000035" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 17413, "end" : "/div[1]/div[5]", "endOffset" : 17960, "_id" : { "$oid" : "505b8a9104ebe20200000036" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348176529765 }, "created" : { "$date" : 1348176529765 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505b8b0f04ebe20200000037", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Once again pointing out a lot of the materials we build with are the result of human ingenuity, not nature. So it follows that the universe had to have some kind of creator", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Admirable conclusion! Stone, wood, brick, iron, brass, have not, at this\ntime, in this minute globe of earth, an order or arrangement without\nhuman art and contrivance; therefore the universe could not originally\nattain its order and arrangement, without something similar to human art.", "uuid" : "C8FB81D0", "_id" : { "$oid" : "505b8b0f04ebe20200000037" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 19385, "end" : "/div[1]/div[5]", "endOffset" : 19671, "_id" : { "$oid" : "505b8b0f04ebe20200000038" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348176655609 }, "created" : { "$date" : 1348176655609 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505b8cf936c90e020000001e", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "No solid conclusions can be drawn about the origin of the universe because no one has seen the creation of a world/universe", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "In this cautious proceeding of the astronomers, you may read your own\ncondemnation, CLEANTHES; or rather may see, that the subject in which you\nare engaged exceeds all human reason and inquiry. Can you pretend to show\nany such similarity between the fabric of a house, and the generation of\na universe? Have you ever seen nature in any such situation as resembles\nthe first arrangement of the elements? Have worlds ever been formed under\nyour eye; and have you had leisure to observe the whole progress of the\nphenomenon, from the first appearance of order to its final consummation?\nIf you have, then cite your experience, and deliver your theory.", "uuid" : "F690D391", "_id" : { "$oid" : "505b8cf936c90e020000001e" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 24813, "end" : "/div[1]/div[5]", "endOffset" : 25462, "_id" : { "$oid" : "505b8cf936c90e020000001f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348177145144 }, "created" : { "$date" : 1348177145144 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505cb46be7e8950200000002", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "Catherine enjoys riding in carriages. Carriages are \"fun\" and recreational in addition to travel", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Are\n\nyou fond of an open carriage, Miss Morland?\"\n\n\n\n\n\n\"Yes, very; I have hardly ever an opportunity of being in one; but I am\n\nparticularly fond of it.\"", "uuid" : "E35474D2", "_id" : { "$oid" : "505cb46be7e8950200000002" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [ "carriage", "activity" ], "ranges" : [ { "start" : "/div[1]/p[169]", "startOffset" : 66, "end" : "/div[1]/p[170]", "endOffset" : 100, "_id" : { "$oid" : "505cb46be7e8950200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348252779390 }, "created" : { "$date" : 1348252779390 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505cb56be7e8950200000004", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "Catherine enjoying the carriage ride", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Catherine, delighted at so happy an escape, spoke\n\nher pleasure aloud with grateful surprise;", "uuid" : "4E0E74E8", "_id" : { "$oid" : "505cb56be7e8950200000004" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [ "carriage" ], "ranges" : [ { "start" : "/div[1]/p[250]", "startOffset" : 525, "end" : "/div[1]/p[250]", "endOffset" : 618, "_id" : { "$oid" : "505cb56be7e8950200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348253035050 }, "created" : { "$date" : 1348253035050 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505cb6bfe7e8950200000006", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "Unmarried men and women driving around in open carriages is objectionable", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "\"No, certainly not; and I am glad you do not think of it. These schemes\n\nare not at all the thing. Young men and women driving about the country\n\nin open carriages! Now and then it is very well; but going to inns and\n\npublic places together! It is not right; and I wonder Mrs. Thorpe should\n\nallow it.", "uuid" : "0ACE04E8", "_id" : { "$oid" : "505cb6bfe7e8950200000006" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [ "carriage" ], "ranges" : [ { "start" : "/div[1]/p[473]", "startOffset" : 2, "end" : "/div[1]/p[473]", "endOffset" : 303, "_id" : { "$oid" : "505cb6bfe7e8950200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348253375778 }, "created" : { "$date" : 1348253375778 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505cb72277ecbd0200000002", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "Personal carriages are a sign of wealth", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "She saw herself at the end of\n\na few weeks, the gaze and admiration of every new acquaintance at\n\nFullerton, the envy of every valued old friend in Putney, with a\n\ncarriage at her command", "uuid" : "D7AE79D8", "_id" : { "$oid" : "505cb72277ecbd0200000002" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [ "carriage" ], "ranges" : [ { "start" : "/div[1]/p[566]", "startOffset" : 672, "end" : "/div[1]/p[566]", "endOffset" : 859, "_id" : { "$oid" : "505cb72277ecbd0200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348253474778 }, "created" : { "$date" : 1348253474778 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505cb75ce7e8950200000008", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "Breaking the \"rules\" of being in an open carriage with an unmarried man -- GASP", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "The remembrance of Mr. Allen's opinion, respecting young men's open\n\ncarriages, made her blush at the mention of such a plan, and her first\n\nthought was to decline it; but her second was of greater deference for\n\nGeneral Tilney's judgment; he could not propose anything improper for\n\nher; and, in the course of a few minutes, she found herself with Henry\n\nin the curricle, as happy a being as ever existed.", "uuid" : "6BAB51C4", "_id" : { "$oid" : "505cb75ce7e8950200000008" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [ "carriage" ], "ranges" : [ { "start" : "/div[1]/p[716]", "startOffset" : 2, "end" : "/div[1]/p[716]", "endOffset" : 408, "_id" : { "$oid" : "505cb75ce7e8950200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348253532361 }, "created" : { "$date" : 1348253532361 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505cb7a677ecbd0200000004", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "Ability to \"drive\" a carriage is an indicator of being a gentleman", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "But the merit of the curricle did not all belong to the horses;\n\nHenry drove so well—so quietly—without making any disturbance,\n\nwithout parading to her, or swearing at them: so different from the only\n\ngentleman-coachman whom it was in her power to compare him with!", "uuid" : "BC777A80", "_id" : { "$oid" : "505cb7a677ecbd0200000004" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [ "carriage" ], "ranges" : [ { "start" : "/div[1]/p[716]", "startOffset" : 929, "end" : "/div[1]/p[716]", "endOffset" : 1196, "_id" : { "$oid" : "505cb7a677ecbd0200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348253606954 }, "created" : { "$date" : 1348253606954 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505cb89577ecbd0200000006", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "There are NO conversations recorded for the first half of the journey where it is just Catherine, Eleanor and the maid. If Eleanor was her friend wouldn't they talk? Even if about inane material Austen would still record it (ex: conversations with Isabella). Additionally, what kind of insensitive jerks would ignore the 3rd person in their cramped carriage for a multiple hour drive.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "At last, however, the door was closed\n\nupon the three females, and they set off", "uuid" : "648456FF", "_id" : { "$oid" : "505cb89577ecbd0200000006" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [ "carriage" ], "ranges" : [ { "start" : "/div[1]/p[715]", "startOffset" : 683, "end" : "/div[1]/p[715]", "endOffset" : 762, "_id" : { "$oid" : "505cb89577ecbd0200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348253845792 }, "created" : { "$date" : 1348253845792 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "505cb96977ecbd0200000008" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348254057124 }, "groups" : [ "21L.003" ], "id" : "505cb96977ecbd0200000008", "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "quote" : "By ten o'clock, the chaise\n\nand four conveyed the two from the abbey; and, after an agreeable drive\n\nof almost twenty miles, they entered Woodston", "ranges" : [ { "start" : "/div[1]/p[901]", "startOffset" : 114, "end" : "/div[1]/p[901]", "endOffset" : 261, "_id" : { "$oid" : "505cb99077ecbd020000000a" } } ], "tags" : [ "carriage" ], "text" : "So, nothing to say - huh? There's really no conversations of note between the General, Eleanor, and Catherine.", "updated" : { "$date" : 1348254096023 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "adin@mit.edu", "username" : "Adin S.", "uuid" : "EF25E62B" } -{ "id" : "505cba6777ecbd020000000b", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "The carriage of doom is coming for Catherine. The fact that it is basically travelling with the mailman is denoted no differently then her carriage ride to Northanger.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "But—how can I tell you?—tomorrow morning is\n\nfixed for your leaving us, and not even the hour is left to your choice;\n\nthe very carriage is ordered, and will be here at seven o'clock, and no\n\nservant will be offered you.\"", "uuid" : "2822E434", "_id" : { "$oid" : "505cba6777ecbd020000000b" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [ "carriage" ], "ranges" : [ { "start" : "/div[1]/p[947]", "startOffset" : 161, "end" : "/div[1]/p[947]", "endOffset" : 382, "_id" : { "$oid" : "505cba6777ecbd020000000c" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348254311314 }, "created" : { "$date" : 1348254311314 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "505cbb23e7e895020000000a" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348254499310 }, "groups" : [ "21L.003" ], "id" : "505cbb23e7e895020000000a", "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "quote" : "Leaning back in one corner of the carriage, in\n\na violent burst of tears, she was conveyed some miles beyond the walls\n\nof the abbey before she raised her head", "ranges" : [ { "start" : "/div[1]/p[961]", "startOffset" : 173, "end" : "/div[1]/p[961]", "endOffset" : 332, "_id" : { "$oid" : "505cbb23e7e895020000000b" } } ], "tags" : [ "carriage" ], "text" : "Somehow, Catherine manages to make her way into the Carriage and magically appear at home without talking to anyone. If this is really a dangerous situation for her, then shouldn't she be at least a little concerned about actually getting home. At the least the equivalent of asking the driver where he's going seems in order.", "updated" : { "$date" : 1348254518479 }, "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "user" : "adin@mit.edu", "username" : "Adin S.", "uuid" : "05BEB2DD" } -{ "id" : "505cbb6ee7e895020000000c", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "Carriages uncommon in Fullerton, clearly not a wealthly area.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "The chaise of a traveller being\n\na rare sight in Fullerton", "uuid" : "4AABFC80", "_id" : { "$oid" : "505cbb6ee7e895020000000c" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [ "carriage" ], "ranges" : [ { "start" : "/div[1]/p[968]", "startOffset" : 315, "end" : "/div[1]/p[968]", "endOffset" : 373, "_id" : { "$oid" : "505cbb6ee7e895020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348254574689 }, "created" : { "$date" : 1348254574689 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505cc142e7e895020000000e", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "does this apply to every human?", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "the two greatest and purest pleasures of human\nlife, study and society.", "uuid" : "A6138C00", "_id" : { "$oid" : "505cc142e7e895020000000e" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 2488, "end" : "/div[1]/div[3]", "endOffset" : 2559, "_id" : { "$oid" : "505cc142e7e895020000000f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348256066492 }, "created" : { "$date" : 1348256066492 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505cc24977ecbd020000000d", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "Man's preoccupation with the existence of God. From \"the most ignorant ages have acknowledged\" to \"the most refined geniuses.\" This is the very beginning of the argument for the existence of God; if God didn't exist then why would there be so much study and search for (or against) one? ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "What truth so obvious, so certain, as the being of a\nGod, which the most ignorant ages have acknowledged, for which the most\nrefined geniuses have ambitiously striven to produce new proofs and\narguments? What truth so important as this, which is the ground of all\nour hopes, the surest foundation of morality, the firmest support of\nsociety, and the only principle which ought never to be a moment absent\nfrom our thoughts and meditations? But, in treating of this obvious and\nimportant truth, what obscure questions occur concerning the nature of\nthat Divine Being, his attributes, his decrees, his plan of providence?\nThese have been always subjected to the disputations of men; concerning\nthese human reason has not reached any certain determination. But these\nare topics so interesting, that we cannot restrain our restless inquiry\nwith regard to them; though nothing but doubt, uncertainty, and\ncontradiction, have as yet been the result of our most accurate\nresearches.", "uuid" : "E3354D06", "_id" : { "$oid" : "505cc24977ecbd020000000d" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 2646, "end" : "/div[1]/div[3]", "endOffset" : 3622, "_id" : { "$oid" : "505cc24977ecbd020000000e" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348256329517 }, "created" : { "$date" : 1348256329517 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505cc30f77ecbd020000000f", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "the education motif found in Alice is also very persistent here...", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "the pains which you bestow in conveying to him every\nuseful branch of literature and science", "uuid" : "09A4B7B6", "_id" : { "$oid" : "505cc30f77ecbd020000000f" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 394, "end" : "/div[1]/div[4]", "endOffset" : 487, "_id" : { "$oid" : "505cc30f77ecbd0200000010" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348256527383 }, "created" : { "$date" : 1348256527383 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505cc555e7e8950200000010", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "DEMEA's opinion is that religion should be taught early and then, with reverence as a weapon/defense, they can study the other sciences. They will be able to see which parts of science were only developed through human reasoning and consider them with an appropriate amount of skepticism. The same can be said for the opposite.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "To season their minds with early piety, is my chief care; and\nby continual precept and instruction, and I hope too by example, I\nimprint deeply on their tender minds an habitual reverence for all the\nprinciples of religion. While they pass through every other science, I\nstill remark the uncertainty of each part; the eternal disputations of\nmen; the obscurity of all philosophy; and the strange, ridiculous\nconclusions, which some of the greatest geniuses have derived from the\nprinciples of mere human reason.", "uuid" : "4D5DF529", "_id" : { "$oid" : "505cc555e7e8950200000010" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 1574, "end" : "/div[1]/div[4]", "endOffset" : 2087, "_id" : { "$oid" : "505cc555e7e8950200000011" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348257109137 }, "created" : { "$date" : 1348257109137 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505cc7de77ecbd0200000011", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "PHILO's argument is very close to DEMEA's so far. He is also skeptical of human reasoning but lends it to be more of a result of humans' inability to explain how things came to be. They can quantify things but that's about it.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "When these topics are displayed in their full\nlight, as they are by some philosophers and almost all divines; who can\nretain such confidence in this frail faculty of reason as to pay any\nregard to its determinations in points so sublime, so abstruse, so remote\nfrom common life and experience? When the coherence of the parts of a\nstone, or even that composition of parts which renders it extended; when\nthese familiar objects, I say, are so inexplicable, and contain\ncircumstances so repugnant and contradictory; with what assurance can we\ndecide concerning the origin of worlds, or trace their history from\neternity to eternity?", "uuid" : "F5AF19CF", "_id" : { "$oid" : "505cc7de77ecbd0200000011" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 4226, "end" : "/div[1]/div[4]", "endOffset" : 4857, "_id" : { "$oid" : "505cc7de77ecbd0200000012" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348257758884 }, "created" : { "$date" : 1348257758884 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "505ccaa7e7e8950200000012" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348258471144 }, "groups" : [ "21L.448J" ], "id" : "505ccaa7e7e8950200000012", "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [] }, "quote" : "Wherever evidence discovers itself, you adhere to it,\nnotwithstanding your pretended scepticism; and I can observe, too, some\nof your sect to be as decisive as those who make greater professions of\ncertainty and assurance. In reality, would not a man be ridiculous, who\npretended to reject NEWTON's explication of the wonderful phenomenon of\nthe rainbow, because that explication gives a minute anatomy of the rays\nof light; a subject, forsooth, too refined for human comprehension? And\nwhat would you say to one, who, having nothing particular to object to\nthe arguments of COPERNICUS and GALILEO for the motion of the earth,\nshould withhold his assent, on that general principle, that these\nsubjects were too magnificent and remote to be explained by the narrow\nand fallacious reason of mankind?", "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 13529, "end" : "/div[1]/div[4]", "endOffset" : 14328, "_id" : { "$oid" : "505ccaa7e7e8950200000013" } } ], "tags" : [], "text" : "CLEANTHES' point is that the philosophers and scientists rely on human reason to explain natural phenomena, and some cannot be denied the validity of there explanations. Formerly, pondering light and the earth seemed too great of a task for a human mind but it was done anyways and the theories hold true. The humans didn't make light or the earth but it would be unfair to say that they cannot understand them. ", "updated" : { "$date" : 1348258665569 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "uuid" : "AA7A92EB" } -{ "id" : "505ccd1c77ecbd0200000013", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "to be skeptical of science is to be skeptical of all reasoning, even religious reasoning.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "faith was nothing but\na species of reason; that religion was only a branch of philosophy; and\nthat a chain of arguments, similar to that which established any truth in\nmorals, politics, or physics, was always employed in discovering all the\nprinciples of theology, natural and revealed.", "uuid" : "58B2E118", "_id" : { "$oid" : "505ccd1c77ecbd0200000013" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 19557, "end" : "/div[1]/div[4]", "endOffset" : 19843, "_id" : { "$oid" : "505ccd1c77ecbd0200000014" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348259100644 }, "created" : { "$date" : 1348259100644 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505ccdca77ecbd0200000015", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "systems of thought, or of rejection", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "If we distrust human reason, we have now no other principle to\nlead us into religion. Thus, sceptics in one age, dogmatists in another;\nwhichever system best suits the purpose of these reverend gentlemen, in\ngiving them an ascendant over mankind, they are sure to make it their\nfavourite principle, and established tenet.", "uuid" : "998BC78E", "_id" : { "$oid" : "505ccdca77ecbd0200000015" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [ "systems" ], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 22241, "end" : "/div[1]/div[4]", "endOffset" : 22564, "_id" : { "$oid" : "505ccdca77ecbd0200000016" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348259274811 }, "created" : { "$date" : 1348259274811 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505cce4477ecbd0200000017", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "absolutely no question of the existence of God but of his nature, which cannot be determined.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "By the\nwhole tenor of your discourse, one would imagine that you were\nmaintaining the Being of a God, against the cavils of Atheists and\nInfidels; and were necessitated to become a champion for that fundamental\nprinciple of all religion. But this, I hope, is not by any means a\nquestion among us. No man, no man at least of common sense, I am\npersuaded, ever entertained a serious doubt with regard to a truth so\ncertain and self-evident. The question is not concerning the being, but\nthe nature of God", "uuid" : "F7A55A8B", "_id" : { "$oid" : "505cce4477ecbd0200000017" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 143, "end" : "/div[1]/div[5]", "endOffset" : 645, "_id" : { "$oid" : "505cce4477ecbd0200000018" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348259396062 }, "created" : { "$date" : 1348259396062 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505ccf14e7e8950200000014", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "God = cause", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Nothing exists without a cause; and the original cause of\nthis universe (whatever it be) we call God; and piously ascribe to him\nevery species of perfection", "uuid" : "5D635AA3", "_id" : { "$oid" : "505ccf14e7e8950200000014" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [ "teleology" ], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 3367, "end" : "/div[1]/div[5]", "endOffset" : 3523, "_id" : { "$oid" : "505ccf14e7e8950200000015" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348259604854 }, "created" : { "$date" : 1348259604854 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505cd02b77ecbd0200000019", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "the nature of the purpose", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "he\nadorably mysterious and incomprehensible nature of the Supreme Being.", "uuid" : "D1E0F151", "_id" : { "$oid" : "505cd02b77ecbd0200000019" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [ "teleology" ], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 4942, "end" : "/div[1]/div[5]", "endOffset" : 5015, "_id" : { "$oid" : "505cd02b77ecbd020000001a" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348259883578 }, "created" : { "$date" : 1348259883578 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "505cd121e7e8950200000016" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348260129511 }, "groups" : [ "21L.448J" ], "id" : "505cd121e7e8950200000016", "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [] }, "quote" : "I shall briefly explain how I conceive this matter. Look round the\nworld: contemplate the whole and every part of it: You will find it to be\nnothing but one great machine, subdivided into an infinite number of\nlesser machines, which again admit of subdivisions to a degree beyond\nwhat human senses and faculties can trace and explain. All these various\nmachines, and even their most minute parts, are adjusted to each other\nwith an accuracy which ravishes into admiration all men who have ever\ncontemplated them. The curious adapting of means to ends, throughout all\nnature, resembles exactly, though it much exceeds, the productions of\nhuman contrivance; of human designs, thought, wisdom, and intelligence.\nSince, therefore, the effects resemble each other, we are led to infer,\nby all the rules of analogy, that the causes also resemble; and that the\nAuthor of Nature is somewhat similar to the mind of man, though possessed\nof much larger faculties, proportioned to the grandeur of the work which\nhe has executed. By this argument a posteriori, and by this argument\nalone, do we prove at once the existence of a Deity, and his similarity\nto human mind and intelligence.", "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 5160, "end" : "/div[1]/div[5]", "endOffset" : 6334, "_id" : { "$oid" : "505cd121e7e8950200000017" } } ], "tags" : [], "text" : "The Deity must exist because man attempts to imitate him in making machines/systems that are also made up of their own systems (think education, industry, government, technology...) but the machines of the world are much bigger and more complex. While the notion of creating systems is found in human minds and nature, CLEANTHES concedes that nature's machines are much more advanced and could not have been set up by humans. I agree most with this philosophy. God did not create man to run wild, but to be productive and fruitful and he gives us the best example. ", "updated" : { "$date" : 1348260310082 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "uuid" : "2CA4A318" } -{ "id" : "505cd369e7e8950200000018", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "But is the whole\nadjustment of means to ends in a house and in the universe so slight a\nresemblance? The economy of final causes? The order, proportion, and\narrangement of every part? Steps of a stair are plainly contrived, that\nhuman legs may use them in mounting; and this inference is certain and\ninfallible. Human legs are also contrived for walking and mounting; and\nthis inference, I allow, is not altogether so certain, because of the\ndissimilarity which you remark; but does it, therefore, deserve the name\nonly of presumption or conjecture?", "uuid" : "345CC4B2", "_id" : { "$oid" : "505cd369e7e8950200000018" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [ "systems,", "analogies" ], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 9265, "end" : "/div[1]/div[5]", "endOffset" : 9814, "_id" : { "$oid" : "505cd369e7e8950200000019" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348260713574 }, "created" : { "$date" : 1348260713574 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505cd4c177ecbd020000001b", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "our capability of thought and reasoning and ordering of materials to create forms implies an 'original principle of order' which we get from God. In Genesis it says man was created in God's image.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Throw several pieces of steel together, without shape or\nform; they will never arrange themselves so as to compose a watch. Stone,\nand mortar, and wood, without an architect, never erect a house. But the\nideas in a human mind, we see, by an unknown, inexplicable economy,\narrange themselves so as to form the plan of a watch or house.\nExperience, therefore, proves, that there is an original principle of\norder in mind, not in matter. From similar effects we infer similar\ncauses. The adjustment of means to ends is alike in the universe, as in a\nmachine of human contrivance. The causes, therefore, must be resembling.", "uuid" : "A0A4CF80", "_id" : { "$oid" : "505cd4c177ecbd020000001b" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [ "systems,", "analogies" ], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 13014, "end" : "/div[1]/div[5]", "endOffset" : 13634, "_id" : { "$oid" : "505cd4c177ecbd020000001c" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348261057947 }, "created" : { "$date" : 1348261057947 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505cd67377ecbd020000001d", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "no \"chance\" that aristotle described", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "That all inferences, CLEANTHES, concerning fact, are founded on\nexperience; and that all experimental reasonings are founded on the\nsupposition that similar causes prove similar effects, and similar\neffects similar causes; I shall not at present much dispute with you.", "uuid" : "66BDF430", "_id" : { "$oid" : "505cd67377ecbd020000001d" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 14213, "end" : "/div[1]/div[5]", "endOffset" : 14481, "_id" : { "$oid" : "505cd67377ecbd020000001e" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348261491272 }, "created" : { "$date" : 1348261491272 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505cd832e7e895020000001a", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "ART!", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Admirable conclusion! Stone, wood, brick, iron, brass, have not, at this\ntime, in this minute globe of earth, an order or arrangement without\nhuman art and contrivance; therefore the universe could not originally\nattain its order and arrangement, without something similar to human art.", "uuid" : "CD42D1D9", "_id" : { "$oid" : "505cd832e7e895020000001a" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 19385, "end" : "/div[1]/div[5]", "endOffset" : 19672, "_id" : { "$oid" : "505cd832e7e895020000001b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348261938212 }, "created" : { "$date" : 1348261938212 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505ce043e7e895020000001c", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "Interesting reference. I'm not sure why he's using it or whether the dock was abandoned or revived", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Ezekiel's Valley\nof Dry Bones", "uuid" : "91F77A08", "_id" : { "$oid" : "505ce043e7e895020000001c" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[9]", "startOffset" : 348, "end" : "/div[1]/p[9]", "endOffset" : 377, "_id" : { "$oid" : "505ce043e7e895020000001d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348264003512 }, "created" : { "$date" : 1348264003512 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505ce1c377ecbd0200000023", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "he likes using ancient/symbolic references", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Castile and Leon, medallioned\nabout by groups of mythological or symbolical\ndevices", "uuid" : "55EA3E62", "_id" : { "$oid" : "505ce1c377ecbd0200000023" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 937, "end" : "/div[1]/p[11]", "endOffset" : 1020, "_id" : { "$oid" : "505ce1c377ecbd0200000024" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348264387162 }, "created" : { "$date" : 1348264387162 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505ce240e7e8950200000022", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "Soooooo much detail. Just keep piling on adjectives, that'll make the book better", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "copper-spike rust; while, like mourning\nweeds, dark festoons of sea-grass slimily swept\nto and fro over the name, with every hearse-like\nroll of the hull.", "uuid" : "09C7493B", "_id" : { "$oid" : "505ce240e7e8950200000022" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[12]", "startOffset" : 570, "end" : "/div[1]/p[12]", "endOffset" : 724, "_id" : { "$oid" : "505ce240e7e8950200000023" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348264512997 }, "created" : { "$date" : 1348264512997 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505d33d77481010200000002", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "is PHILO contradicting himself? He is supporting philosophy here, giving Galileo credit for overcoming the prejudices of his contemporaries. Is this not what CLEANTHES has already argued?", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "It is now become a\nmatter of mere curiosity to study the first writers on that subject, who\nhad the full force of prejudice to encounter, and were obliged to turn\ntheir arguments on every side in order to render them popular and\nconvincing. But if we peruse GALILEO's famous Dialogues concerning the\nsystem of the world, we shall find, that that great genius, one of the\nsublimest that ever existed, first bent all his endeavours to prove, that\nthere was no foundation for the distinction commonly made between\nelementary and celestial substances", "uuid" : "7744C481", "_id" : { "$oid" : "505d33d77481010200000002" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 23405, "end" : "/div[1]/div[5]", "endOffset" : 23951, "_id" : { "$oid" : "505d33d77481010200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348285399522 }, "created" : { "$date" : 1348285399522 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "505d342c7481010200000004" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348285484647 }, "groups" : [ "21L.448J" ], "id" : "505d342c7481010200000004", "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "quote" : "because several philosophers, blinded by old systems, and\nsupported by some sensible appearances, had denied this similarity?", "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 300, "end" : "/div[1]/div[6]", "endOffset" : 426, "_id" : { "$oid" : "505d342c7481010200000005" } } ], "tags" : [], "text" : "almost repeating PHILO", "updated" : { "$date" : 1348285496018 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "uuid" : "D646B9BF" } -{ "id" : "505d3d23e7e8950200000026", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "a direct attack on CLEANTHES' philosophy", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "These ideas are, perhaps, too far stretched; but still it must be\nacknowledged, that, by representing the Deity as so intelligible and\ncomprehensible, and so similar to a human mind, we are guilty of the\ngrossest and most narrow partiality, and make ourselves the model of the\nwhole universe.", "uuid" : "454B7649", "_id" : { "$oid" : "505d3d23e7e8950200000026" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 9742, "end" : "/div[1]/div[6]", "endOffset" : 10036, "_id" : { "$oid" : "505d3d23e7e8950200000027" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348287779338 }, "created" : { "$date" : 1348287779338 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505d3e927481010200000006", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "God not religious, just a name for the universal cause.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Their temerity must be very great, if, after rejecting\nthe production by a mind, I mean a mind resembling the human, (for I know\nof no other,) they pretend to assign, with certainty, any other specific\nintelligible cause: And their conscience must be very scrupulous indeed,\nif they refuse to call the universal unknown cause a God or Deity; and to\nbestow on him as many sublime eulogies and unmeaning epithets as you\nshall please to require of them.", "uuid" : "407D23FD", "_id" : { "$oid" : "505d3e927481010200000006" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]", "startOffset" : 811, "end" : "/div[1]/div[7]", "endOffset" : 1263, "_id" : { "$oid" : "505d3e927481010200000007" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348288146111 }, "created" : { "$date" : 1348288146111 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "505d402b7481010200000008" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348288555027 }, "groups" : [ "21L.448J" ], "id" : "505d402b7481010200000008", "permissions" : { "admin" : [ "mvwagner@mit.edu" ], "delete" : [ "mvwagner@mit.edu" ], "read" : [], "update" : [ "mvwagner@mit.edu" ] }, "quote" : "Nothing seems more delicate, with regard to its causes,\nthan thought; and as these causes never operate in two persons after the\nsame manner, so we never find two persons who think exactly alike. Nor\nindeed does the same person think exactly alike at any two different\nperiods of time. A difference of age, of the disposition of his body, of\nweather, of food, of company, of books, of passions; any of these\nparticulars, or others more minute, are sufficient to alter the curious\nmachinery of thought, and communicate to it very different movements and\noperations.", "ranges" : [ { "start" : "/div[1]/div[7]", "startOffset" : 6569, "end" : "/div[1]/div[7]", "endOffset" : 7135, "_id" : { "$oid" : "505d402b7481010200000009" } } ], "tags" : [ "systems" ], "text" : "thought as a system that cannot operate in the same way in each mind or even at different times in one mind. intriguing to think of this in terms of a functioning system or machine. what good comes from a machine when it's actions cannot be predicted or relied on?", "updated" : { "$date" : 1348288562056 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "uuid" : "4B7F41D7" } -{ "id" : "505d409a748101020000000a", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "I agree. The fact that we do not understand something does not mean God is responsible for it.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "and you think, that if certainty or evidence be\nexpelled from every other subject of inquiry, it will all retire to these\ntheological doctrines, and there acquire a superior force and authority.", "uuid" : "BC0815DC", "_id" : { "$oid" : "505d409a748101020000000a" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 5298, "end" : "/div[1]/div[4]", "endOffset" : 5492, "_id" : { "$oid" : "505d409a748101020000000b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348288666461 }, "created" : { "$date" : 1348288666461 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505d40a9748101020000000c", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "boundaries of the human system. when crossed there is a never-ending inquiry into the system of nature and cause.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "When you go one step\nbeyond the mundane system, you only excite an inquisitive humour which it\nis impossible ever to satisfy.", "uuid" : "8313B247", "_id" : { "$oid" : "505d40a9748101020000000c" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [ "system" ], "ranges" : [ { "start" : "/div[1]/div[7]", "startOffset" : 8360, "end" : "/div[1]/div[7]", "endOffset" : 8485, "_id" : { "$oid" : "505d40a9748101020000000d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348288681481 }, "created" : { "$date" : 1348288681481 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505d41e2748101020000000e", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "in the end, who cares? what does it matter? we cannot ultimately understand everything so we should be satisfied with knowing that we can't know? ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "An ideal system, arranged of\nitself, without a precedent design, is not a whit more explicable than a\nmaterial one, which attains its order in a like manner; nor is there any\nmore difficulty in the latter supposition than in the former.", "uuid" : "44995AD6", "_id" : { "$oid" : "505d41e2748101020000000e" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]", "startOffset" : 13315, "end" : "/div[1]/div[7]", "endOffset" : 13552, "_id" : { "$oid" : "505d41e2748101020000000f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348288994394 }, "created" : { "$date" : 1348288994394 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505d4b797481010200000010", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "The fact that Philo thinks that human reason is insufficient is entertaining given that the examples Cleanthes lists have been explained by science since.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "But the nourishment of\nbodies by food is still an inexplicable mystery. The cohesion of the\nparts of matter is still incomprehensible. These sceptics, therefore, are\nobliged, in every question, to consider each particular evidence apart,\nand proportion their assent to the precise degree of evidence which\noccurs. This is their practice in all natural, mathematical, moral, and\npolitical science. And why not the same, I ask, in the theological and\nreligious? Why must conclusions of this nature be alone rejected on the\ngeneral presumption of the insufficiency of human reason, without any\nparticular discussion of the evidence?", "uuid" : "3152F346", "_id" : { "$oid" : "505d4b797481010200000010" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 15510, "end" : "/div[1]/div[4]", "endOffset" : 16139, "_id" : { "$oid" : "505d4b797481010200000011" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348291449821 }, "created" : { "$date" : 1348291449821 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505dfe2c7481010200000012", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "This argument seems very weak. Cleanthes is arguing that if there is something you cannot understand, isn't it obvious that it has to be the work of some supernatural being. His example of a voice that speaks to every nation at once in their own tongue is also very strange", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Suppose, therefore, that an articulate voice were heard in the clouds,\nmuch louder and more melodious than any which human art could ever reach:\nSuppose, that this voice were extended in the same instant over all\nnations, and spoke to each nation in its own language and dialect:\nSuppose, that the words delivered not only contain a just sense and\nmeaning, but convey some instruction altogether worthy of a benevolent\nBeing, superior to mankind: Could you possibly hesitate a moment\nconcerning the cause of this voice? and must you not instantly ascribe it\nto some design or purpose? Yet I cannot see but all the same objections\n(if they merit that appellation) which lie against the system of Theism,\nmay also be produced against this inference.", "uuid" : "C45DE147", "_id" : { "$oid" : "505dfe2c7481010200000012" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 1032, "end" : "/div[1]/div[6]", "endOffset" : 1779, "_id" : { "$oid" : "505dfe2c7481010200000013" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348337196763 }, "created" : { "$date" : 1348337196763 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505e011e7481010200000014", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Cleanthes argues that because of how complex the eye is, there had to be some kind of design by something, which he implies has to be a God. He says that this type of design requires some kind of higher intellect, time, reflection and study", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Consider, anatomise the eye;\nsurvey its structure and contrivance; and tell me, from your own feeling,\nif the idea of a contriver does not immediately flow in upon you with a\nforce like that of sensation.", "uuid" : "42DAFD73", "_id" : { "$oid" : "505e011e7481010200000014" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 5686, "end" : "/div[1]/div[6]", "endOffset" : 5890, "_id" : { "$oid" : "505e011e7481010200000015" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348337950872 }, "created" : { "$date" : 1348337950872 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505e029cb6a6d60200000002", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "It makes sense that there was some kind of design involved, but not in the sense that Cleanthes thinks. The method of design in this case was natural selection. The eye is in fact, far from perfect, but as humans and animals evolve, so does the eye. I think that at the time Cleanthes made these arguments, they would have been a lot more convincing. But now that we understand the process of natural selection and it is a widely accepted concept, his argument for a benevolent Being in control of all design is less so", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "The most obvious conclusion, surely, is in\nfavour of design; and it requires time, reflection, and study, to summon\nup those frivolous, though abstruse objections, which can support\nInfidelity.", "uuid" : "17929F91", "_id" : { "$oid" : "505e029cb6a6d60200000002" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 5891, "end" : "/div[1]/div[6]", "endOffset" : 6085, "_id" : { "$oid" : "505e029cb6a6d60200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348338332913 }, "created" : { "$date" : 1348338332913 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505e049fb6a6d60200000004", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "It seems like the designing force that Cleanthes is referring to is not necessarily a supreme being or God, but could instead be a natural force unaffected by human sentiments. It is something that is not easily or at all comprehensible by man", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "At least if it appear more pious and respectful (as it really is) still\nto retain these terms, when we mention the Supreme Being, we ought to\nacknowledge, that their meaning, in that case, is totally\nincomprehensible; and that the infirmities of our nature do not permit us\nto reach any ideas which in the least correspond to the ineffable\nsublimity of the Divine attributes.", "uuid" : "D408B36E", "_id" : { "$oid" : "505e049fb6a6d60200000004" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 11311, "end" : "/div[1]/div[6]", "endOffset" : 11686, "_id" : { "$oid" : "505e049fb6a6d60200000005" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348338847120 }, "created" : { "$date" : 1348338847120 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505e0563b6a6d60200000006", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Def: name", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "appellation", "uuid" : "58958BCB", "_id" : { "$oid" : "505e0563b6a6d60200000006" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]", "startOffset" : 1638, "end" : "/div[1]/div[7]", "endOffset" : 1649, "_id" : { "$oid" : "505e0563b6a6d60200000007" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348339043797 }, "created" : { "$date" : 1348339043797 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505e067cb6a6d60200000008", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "The universe was not planned out by a divine being like an architect plans out a house", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "But because I know you are not much swayed by names and authorities, I\nshall endeavour to show you, a little more distinctly, the inconveniences\nof that Anthropomorphism, which you have embraced; and shall prove, that\nthere is no ground to suppose a plan of the world to be formed in the\nDivine mind, consisting of distinct ideas, differently arranged, in the\nsame manner as an architect forms in his head the plan of a house which\nhe intends to execute.", "uuid" : "EFB874F4", "_id" : { "$oid" : "505e067cb6a6d60200000008" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]", "startOffset" : 4728, "end" : "/div[1]/div[7]", "endOffset" : 5182, "_id" : { "$oid" : "505e067cb6a6d60200000009" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348339324156 }, "created" : { "$date" : 1348339324156 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505e09037481010200000016", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "All these hypothesis people and groups have, are just attempts at understanding the world around us", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "These are only\nmore learned and elaborate ways of confessing our ignorance; nor has the\none hypothesis any real advantage above the other, except in its greater\nconformity to vulgar prejudices.", "uuid" : "1BED00B1", "_id" : { "$oid" : "505e09037481010200000016" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]", "startOffset" : 10979, "end" : "/div[1]/div[7]", "endOffset" : 11172, "_id" : { "$oid" : "505e09037481010200000017" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348339971139 }, "created" : { "$date" : 1348339971139 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505e0984b6a6d6020000000a", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Naturalists explain things using phenomena that they don't entirely understand which only leads to more questions ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Naturalists indeed\nvery justly explain particular effects by more general causes, though\nthese general causes themselves should remain in the end totally\ninexplicable; but they never surely thought it satisfactory to explain a\nparticular effect by a particular cause, which was no more to be\naccounted for than the effect itself.", "uuid" : "3FFECA16", "_id" : { "$oid" : "505e0984b6a6d6020000000a" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]", "startOffset" : 12985, "end" : "/div[1]/div[7]", "endOffset" : 13314, "_id" : { "$oid" : "505e0984b6a6d6020000000b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348340100803 }, "created" : { "$date" : 1348340100803 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505e09beb6a6d6020000000c", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "It is possible that there could be an omnipotent designer of the universe or there might not be, it is too difficult to draw conclusion", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "An ideal system, arranged of\nitself, without a precedent design, is not a whit more explicable than a\nmaterial one, which attains its order in a like manner; nor is there any\nmore difficulty in the latter supposition than in the former.", "uuid" : "09FFB0C2", "_id" : { "$oid" : "505e09beb6a6d6020000000c" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]", "startOffset" : 13315, "end" : "/div[1]/div[7]", "endOffset" : 13551, "_id" : { "$oid" : "505e09beb6a6d6020000000d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348340158656 }, "created" : { "$date" : 1348340158656 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f16ca6b07340200000002", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Funeral march for the slaves", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "funeral march", "uuid" : "775BA20C", "_id" : { "$oid" : "505f16ca6b07340200000002" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[17]", "startOffset" : 841, "end" : "/div[1]/p[17]", "endOffset" : 854, "_id" : { "$oid" : "505f16ca6b07340200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348409103443 }, "created" : { "$date" : 1348409034821 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f17066b07340200000004", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Describing Benito Cereno's body/health", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "But the debility, constitutional or induced by\nhardships, bodily and mental, of the Spanish\ncaptain, was too obvious to be overlooked", "uuid" : "D316AF96", "_id" : { "$oid" : "505f17066b07340200000004" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 772, "end" : "/div[1]/p[24]", "endOffset" : 905, "_id" : { "$oid" : "505f17066b07340200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348409094974 }, "created" : { "$date" : 1348409094974 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f1745e3a2960200000002", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "\"a condition that is characterized by walking while asleep or in a hypnotic trance\" http://dictionary.reference.com/browse/somnambulist?s=t ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "somnambulist", "uuid" : "2AD44C15", "_id" : { "$oid" : "505f1745e3a2960200000002" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[33]", "startOffset" : 37, "end" : "/div[1]/p[33]", "endOffset" : 50, "_id" : { "$oid" : "505f1745e3a2960200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348409157135 }, "created" : { "$date" : 1348409157135 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f1763e3a2960200000004", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Contrast in clothes of Benito vs. Babo", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "The scene was heightened\n[pg 136]\n\nby, the contrast in dress, denoting their\nrelative positions", "uuid" : "B67A21D2", "_id" : { "$oid" : "505f1763e3a2960200000004" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[50]", "startOffset" : 237, "end" : "/div[1]/p[50]", "endOffset" : 332, "_id" : { "$oid" : "505f1763e3a2960200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348409187151 }, "created" : { "$date" : 1348409187151 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f17746b07340200000006", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "padlock and key symbols", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "padlock\nand key", "uuid" : "580CA62D", "_id" : { "$oid" : "505f17746b07340200000006" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[113]", "startOffset" : 272, "end" : "/div[1]/p[113]", "endOffset" : 287, "_id" : { "$oid" : "505f17746b07340200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348409204289 }, "created" : { "$date" : 1348409204289 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f178a6b07340200000008", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "whispering about Delano", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "whispering", "uuid" : "7917E039", "_id" : { "$oid" : "505f178a6b07340200000008" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[116]", "startOffset" : 282, "end" : "/div[1]/p[116]", "endOffset" : 293, "_id" : { "$oid" : "505f178a6b07340200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348409226955 }, "created" : { "$date" : 1348409226955 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f17c1e3a2960200000006", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "suspicious questioning by Benito", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "\"Your ships generally go—go more or less\narmed, I believe, Señor?\"", "uuid" : "84E9C57F", "_id" : { "$oid" : "505f17c1e3a2960200000006" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[144]", "startOffset" : 0, "end" : "/div[1]/p[145]", "endOffset" : 0, "_id" : { "$oid" : "505f17c1e3a2960200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348409281019 }, "created" : { "$date" : 1348409281019 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f17db6b0734020000000a", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "clothing of sailor", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "unconfined frock, or\nshirt,", "uuid" : "9397396F", "_id" : { "$oid" : "505f17db6b0734020000000a" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[147]", "startOffset" : 255, "end" : "/div[1]/p[147]", "endOffset" : 282, "_id" : { "$oid" : "505f17db6b0734020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348409307669 }, "created" : { "$date" : 1348409307669 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f18186b0734020000000c", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "description of slave mother and child", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "slumbering\nnegress", "uuid" : "F333F815", "_id" : { "$oid" : "505f18186b0734020000000c" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[181]", "startOffset" : 34, "end" : "/div[1]/p[181]", "endOffset" : 52, "_id" : { "$oid" : "505f18186b0734020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348409368683 }, "created" : { "$date" : 1348409368683 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f18386b0734020000000e", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "description of aged sailor", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "His skin was shrunk up with wrinkles like a\npelican's empty pouch; h", "uuid" : "095C179A", "_id" : { "$oid" : "505f18386b0734020000000e" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[192]", "startOffset" : 2158, "end" : "/div[1]/p[192]", "endOffset" : 2226, "_id" : { "$oid" : "505f18386b0734020000000f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348409400794 }, "created" : { "$date" : 1348409400794 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f184ee3a2960200000008", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "description of elegant steward", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "turban", "uuid" : "7039010B", "_id" : { "$oid" : "505f184ee3a2960200000008" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[282]", "startOffset" : 169, "end" : "/div[1]/p[282]", "endOffset" : 176, "_id" : { "$oid" : "505f184ee3a2960200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348409422416 }, "created" : { "$date" : 1348409422416 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f18626b07340200000010", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "slaves like bats", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "bats", "uuid" : "954DFF94", "_id" : { "$oid" : "505f18626b07340200000010" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[226]", "startOffset" : 722, "end" : "/div[1]/p[226]", "endOffset" : 726, "_id" : { "$oid" : "505f18626b07340200000011" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348409442187 }, "created" : { "$date" : 1348409442187 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f1882e3a296020000000a", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "are the slaves the masters of the ship??", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "you are a bitter hard master", "uuid" : "BDA2A23A", "_id" : { "$oid" : "505f1882e3a296020000000a" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[333]", "startOffset" : 179, "end" : "/div[1]/p[333]", "endOffset" : 207, "_id" : { "$oid" : "505f1882e3a296020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348409474175 }, "created" : { "$date" : 1348409474175 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f189de3a296020000000c", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Babo's facial expressions throughout may be revealing", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "admonitory\neye of the servant", "uuid" : "ACA8E5F8", "_id" : { "$oid" : "505f189de3a296020000000c" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[361]", "startOffset" : 80, "end" : "/div[1]/p[361]", "endOffset" : 109, "_id" : { "$oid" : "505f189de3a296020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348409501702 }, "created" : { "$date" : 1348409501702 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f18c56b07340200000012", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "dkeleton of Don Benito's friend on figurehead", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "open\nocean, death for the figure-head, in a human\nskeleton;", "uuid" : "1FA1D48A", "_id" : { "$oid" : "505f18c56b07340200000012" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[371]", "startOffset" : 308, "end" : "/div[1]/p[371]", "endOffset" : 367, "_id" : { "$oid" : "505f18c56b07340200000013" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348409541347 }, "created" : { "$date" : 1348409541347 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f18d96b07340200000014", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Don Benito's clothing had been a disguise ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "scabbard, artificially\nstiffened, was empty.", "uuid" : "89EA8611", "_id" : { "$oid" : "505f18d96b07340200000014" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[414]", "startOffset" : 525, "end" : "/div[1]/p[414]", "endOffset" : 569, "_id" : { "$oid" : "505f18d96b07340200000015" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348409561933 }, "created" : { "$date" : 1348409561933 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f19036b07340200000016", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "did he become a monk or die? ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "indeed, follow his leader.", "uuid" : "0B3DF2E5", "_id" : { "$oid" : "505f19036b07340200000016" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[416]", "startOffset" : 566, "end" : "/div[1]/p[416]", "endOffset" : 592, "_id" : { "$oid" : "505f19036b07340200000017" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348409603718 }, "created" : { "$date" : 1348409603718 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f2206e3a296020000000e", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Hume seems to believe that the strict relationship between an Author and a Reader actually impedes effective communication. The transfer of information should be more interactive.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "and avoid the appearance of Author and\nReader", "uuid" : "40610DAD", "_id" : { "$oid" : "505f2206e3a296020000000e" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 820, "end" : "/div[1]/div[3]", "endOffset" : 865, "_id" : { "$oid" : "505f2206e3a296020000000f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348411910124 }, "created" : { "$date" : 1348411910124 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "505f25f1e3a2960200000010" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348412913333 }, "groups" : [ "21L.448J" ], "id" : "505f25f1e3a2960200000010", "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "quote" : "Any point of doctrine, which is so obvious that it scarcely admits of\ndispute, but at the same time so important that it cannot be too often\ninculcated, seems to require some such method of handling it; where the\nnovelty of the manner may compensate the triteness of the subject; where\nthe vivacity of conversation may enforce the precept; and where the\nvariety of lights, presented by various personages and characters, may\nappear neither tedious nor redundant.", "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 1501, "end" : "/div[1]/div[3]", "endOffset" : 1964, "_id" : { "$oid" : "50621b7c59fff30200000041" } } ], "tags" : [], "text" : "Dialogue is a great way to reinforce key ideas to an individual without being too boring", "updated" : { "$date" : 1348606844513 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "uuid" : "03326B34" } -{ "__v" : 1, "_id" : { "$oid" : "505f2630e3a2960200000012" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348412976719 }, "groups" : [ "21L.448J" ], "id" : "505f2630e3a2960200000012", "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "quote" : "Any question of philosophy, on the other hand, which is so OBSCURE and\nUNCERTAIN, that human reason can reach no fixed determination with regard\nto it; if it should be treated at all, seems to lead us naturally into\nthe style of dialogue and conversation. Reasonable men may be allowed to\ndiffer, where no one can reasonably be positive. Opposite sentiments,\neven without any decision, afford an agreeable amusement; and if the\nsubject be curious and interesting, the book carries us, in a manner,\ninto company; and unites the two greatest and purest pleasures of human\nlife, study and society.", "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 1965, "end" : "/div[1]/div[3]", "endOffset" : 2560, "_id" : { "$oid" : "50621baab4b40a0200000035" } } ], "tags" : [], "text" : "Dialogue can be an avenue of intellectual stimulation, argument can be entertaining", "updated" : { "$date" : 1348606890580 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "uuid" : "6FBB933F" } -{ "id" : "505f274d6b07340200000018", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Interesting that Hume so strongly accepts the existence of a divine Being. Is this not a topic worthy of dialogue?", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "What truth so obvious", "uuid" : "3FB1B7A9", "_id" : { "$oid" : "505f274d6b07340200000018" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 2646, "end" : "/div[1]/div[3]", "endOffset" : 2667, "_id" : { "$oid" : "505f274d6b07340200000019" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348413261920 }, "created" : { "$date" : 1348413261920 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f28376b0734020000001a", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Shouldn't education be for empowerment of individuals, not to submit them to current beliefs?", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Having thus tamed their mind to a proper\nsubmission and self-diffidence", "uuid" : "D121E242", "_id" : { "$oid" : "505f28376b0734020000001a" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 2087, "end" : "/div[1]/div[4]", "endOffset" : 2158, "_id" : { "$oid" : "505f28376b0734020000001b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348413495921 }, "created" : { "$date" : 1348413495921 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f28fbe3a2960200000014", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Acknowledgement of human imperfection and the limit of human reason encourages us to take on beliefs without certainty of evidence", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "", "uuid" : "DBC63CDE", "_id" : { "$oid" : "505f28fbe3a2960200000014" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 4856, "end" : "/div[1]/div[4]", "endOffset" : 4857, "_id" : { "$oid" : "505f28fbe3a2960200000015" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348413691190 }, "created" : { "$date" : 1348413691190 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f29b06b0734020000001c", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Human ignorance and dogmatic doctrine would not suffice to establish a school of belief. People instinctively use their common sense and logic.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "You propose then, PHILO, said CLEANTHES, to erect religious faith on\nphilosophical scepticism; and you think, that if certainty or evidence be\nexpelled from every other subject of inquiry, it will all retire to these\ntheological doctrines, and there acquire a superior force and authority.\nWhether your scepticism be as absolute and sincere as you pretend, we\nshall learn by and by, when the company breaks up: We shall then see,\nwhether you go out at the door or the window; and whether you really\ndoubt if your body has gravity, or can be injured by its fall; according\nto popular opinion, derived from our fallacious senses, and more\nfallacious experience. And this consideration, DEMEA, may, I think,\nfairly serve to abate our ill-will to this humorous sect of the sceptics.\nIf they be thoroughly in earnest, they will not long trouble the world\nwith their doubts, cavils, and disputes: If they be only in jest, they\nare, perhaps, bad raillers; but can never be very dangerous, either to\nthe state, to philosophy, or to religion.", "uuid" : "B0F38138", "_id" : { "$oid" : "505f29b06b0734020000001c" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 5203, "end" : "/div[1]/div[4]", "endOffset" : 6237, "_id" : { "$oid" : "505f29b06b0734020000001d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348413872836 }, "created" : { "$date" : 1348413872836 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f2b13e3a2960200000018", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "People see what they want to see. People tend to reinforce their own philosophies through observations in the natural world. ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "that the larger experience we\nacquire, and the stronger reason we are endued with,", "uuid" : "BA5B0DBA", "_id" : { "$oid" : "505f2b13e3a2960200000018" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 10380, "end" : "/div[1]/div[4]", "endOffset" : 10462, "_id" : { "$oid" : "505f2b13e3a2960200000019" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348414227980 }, "created" : { "$date" : 1348414227980 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f2b46e3a296020000001a", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Deep awareness at the fact that the philosophical reasoning they have can never be proven or considered correct.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "We are\nlike foreigners in a strange country, to whom every thing must seem\nsuspicious, and who are in danger every moment of transgressing against\nthe laws and customs of the people with whom they live and converse. We\nknow not how far we ought to trust our vulgar methods of reasoning in\nsuch a subject; since, even in common life, and in that province which is\npeculiarly appropriated to them, we cannot account for them, and are\nentirely guided by a kind of instinct or necessity in employing them.", "uuid" : "CA91ECD5", "_id" : { "$oid" : "505f2b46e3a296020000001a" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 12056, "end" : "/div[1]/div[4]", "endOffset" : 12558, "_id" : { "$oid" : "505f2b46e3a296020000001b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348414278232 }, "created" : { "$date" : 1348414278232 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f2beb6b0734020000001e", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Acknowledgement that some things might be impossible to consider with certainty", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "We must be far removed from the smallest\ntendency to scepticism not to be apprehensive, that we have here got\nquite beyond the reach of our faculties", "uuid" : "04D20E92", "_id" : { "$oid" : "505f2beb6b0734020000001e" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 11326, "end" : "/div[1]/div[4]", "endOffset" : 11475, "_id" : { "$oid" : "505f2beb6b0734020000001f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348414443953 }, "created" : { "$date" : 1348414443953 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f2c146b07340200000020", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Cleanthes is arguing that skepticism can go too far. If a skeptic assumes the human mind is incapable of certain understandings, there could be many truths missed. The physical laws that have a lot of evidence should be allowed to be accepted by philosophers.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "In reality, would not a man be ridiculous, who\npretended to reject NEWTON's explication of the wonderful phenomenon of\nthe rainbow, because that explication gives a minute anatomy of the rays\nof light; a subject, forsooth, too refined for human comprehension? And\nwhat would you say to one, who, having nothing particular to object to\nthe arguments of COPERNICUS and GALILEO for the motion of the earth,\nshould withhold his assent, on that general principle, that these\nsubjects were too magnificent and remote to be explained by the narrow\nand fallacious reason of mankind?", "uuid" : "264E061E", "_id" : { "$oid" : "505f2c146b07340200000020" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [ "holjose@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 13753, "end" : "/div[1]/div[4]", "endOffset" : 14328, "_id" : { "$oid" : "505f2c146b07340200000021" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348414484901 }, "created" : { "$date" : 1348414484901 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f2c6d6b07340200000022", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Too much skepticism will lead to ignorance. It's better to be selectively skeptical.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "This species of\nscepticism is fatal to knowledge, not to religion;", "uuid" : "8B7902D7", "_id" : { "$oid" : "505f2c6d6b07340200000022" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 14597, "end" : "/div[1]/div[4]", "endOffset" : 14663, "_id" : { "$oid" : "505f2c6d6b07340200000023" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348414573846 }, "created" : { "$date" : 1348414573846 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "505f2c796b07340200000024" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348414585677 }, "groups" : [ "21L.448J" ], "id" : "505f2c796b07340200000024", "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "quote" : "that these\nsubjects were too magnificent and remote to be explained by the narrow\nand fallacious reason of mankind?", "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 14212, "end" : "/div[1]/div[4]", "endOffset" : 14328, "_id" : { "$oid" : "506227a059fff3020000004c" } } ], "tags" : [], "text" : "cleanthes: there are many everyday facts that are related to \"higher\" ideas. Based on what Philo said, there doesn't seem to be a clear distinction between when to be skeptic and when to acknolwedge evidence", "updated" : { "$date" : 1348609952070 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "uuid" : "A9C30066" } -{ "__v" : 1, "_id" : { "$oid" : "505f3040e3a296020000001c" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348415552941 }, "groups" : [ "21L.448J" ], "id" : "505f3040e3a296020000001c", "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "quote" : "That a little philosophy, replied CLEANTHES, makes a man an\nAtheist: A great deal converts him to religion.", "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 20398, "end" : "/div[1]/div[4]", "endOffset" : 20505, "_id" : { "$oid" : "50622d8359fff30200000057" } } ], "tags" : [], "text" : "religion is the result of philosophy. ", "updated" : { "$date" : 1348611459112 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "uuid" : "6850AB2F" } -{ "id" : "505f30ec6b07340200000026", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Socially accepted ideas are not debated", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "No man, no man at least of common sense, I am\npersuaded, ever entertained a serious doubt with regard to a truth so\ncertain and self-evident.", "uuid" : "24247656", "_id" : { "$oid" : "505f30ec6b07340200000026" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 440, "end" : "/div[1]/div[5]", "endOffset" : 581, "_id" : { "$oid" : "505f30ec6b07340200000027" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348415724357 }, "created" : { "$date" : 1348415724357 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f31356b07340200000028", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "This implies that religion conflicts with philosophy, which I find interesting.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "But lest you should think that my piety has here got the better of my\nphilosophy", "uuid" : "8710E2D0", "_id" : { "$oid" : "505f31356b07340200000028" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 1486, "end" : "/div[1]/div[5]", "endOffset" : 1566, "_id" : { "$oid" : "505f31356b07340200000029" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348415797307 }, "created" : { "$date" : 1348415797307 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f32346b0734020000002a", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "This arguments centers on the claim that lack of complete understanding voids any theory for how a system works. This directly opposes modern philosophies of science.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "In this cautious proceeding of the astronomers, you may read your own\ncondemnation, CLEANTHES; or rather may see, that the subject in which you\nare engaged exceeds all human reason and inquiry. Can you pretend to show\nany such similarity between the fabric of a house, and the generation of\na universe? Have you ever seen nature in any such situation as resembles\nthe first arrangement of the elements? Have worlds ever been formed under\nyour eye; and have you had leisure to observe the whole progress of the\nphenomenon, from the first appearance of order to its final consummation?\nIf you have, then cite your experience, and deliver your theory.", "uuid" : "33BBB17E", "_id" : { "$oid" : "505f32346b0734020000002a" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 24813, "end" : "/div[1]/div[5]", "endOffset" : 25462, "_id" : { "$oid" : "505f32346b0734020000002b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348416052586 }, "created" : { "$date" : 1348416052586 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f57466b0734020000002c", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "It seems that the new boat will be out of the ordinary", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Ships were then not so plenty in\nthose waters as now.", "uuid" : "044E8DF2", "_id" : { "$oid" : "505f57466b0734020000002c" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 146, "end" : "/div[1]/p[2]", "endOffset" : 199, "_id" : { "$oid" : "505f57466b0734020000002d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348425542130 }, "created" : { "$date" : 1348425542130 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f57e16b0734020000002e", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Also strange that they are not flying a flag.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "To Captain Delano's surprise, the stranger,\nviewed through the glass, showed no colors;\nthough to do so upon entering a haven, however\nuninhabited in its shores, where but a\nsingle other ship might be lying, was the custom\namong peaceful seamen of all nations.", "uuid" : "AF7BAC28", "_id" : { "$oid" : "505f57e16b0734020000002e" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 0, "end" : "/div[1]/p[4]", "endOffset" : 260, "_id" : { "$oid" : "505f57e16b0734020000002f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348425697137 }, "created" : { "$date" : 1348425697137 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f58dd6b07340200000030", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Foreshadowing what will later come to pass", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "that in the black he saw a headsman, and in\nthe white a man at the block", "uuid" : "8B04C095", "_id" : { "$oid" : "505f58dd6b07340200000030" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 790, "end" : "/div[1]/p[258]", "endOffset" : 862, "_id" : { "$oid" : "505f58dd6b07340200000031" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348425949748 }, "created" : { "$date" : 1348425949748 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f5922e3a296020000001e", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "This also should have tipped Don Amasa off, since they are using the flag as a towel.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "\"The castle and the lion,\" exclaimed Captain\nDelano—\"why, Don Benito, this is the\nflag of Spain you use here. It's well it's only\nI, and not the King, that sees this,\" he added,\nwith a smile, \"but\"—turning towards the\nblack—\"it's all one, I suppose, so the colors\nbe gay;\" which playful remark did not fail\nsomewhat to tickle the negro.", "uuid" : "1833D77E", "_id" : { "$oid" : "505f5922e3a296020000001e" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[260]", "startOffset" : 0, "end" : "/div[1]/p[260]", "endOffset" : 336, "_id" : { "$oid" : "505f5922e3a296020000001f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348426018263 }, "created" : { "$date" : 1348426018263 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f592de3a2960200000020", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Why is everyone called Don?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Don", "uuid" : "27CF3FFC", "_id" : { "$oid" : "505f592de3a2960200000020" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[262]", "startOffset" : 6, "end" : "/div[1]/p[262]", "endOffset" : 9, "_id" : { "$oid" : "505f592de3a2960200000021" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348426029779 }, "created" : { "$date" : 1348426029779 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "505f599be3a2960200000022" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348426139587 }, "groups" : [ "21L.003" ], "id" : "505f599be3a2960200000022", "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "quote" : "however it was, just then the razor drew\nblood, spots of which stained the creamy lather\nunder the throat: immediately the black barber\ndrew back his steel, and, remaining in his professional\nattitude, back to Captain Delano, and\nface to Don Benito, held up the trickling razor,\nsaying, with a sort of half humorous sorrow,\n\"See, master—you shook so—here's Babo's\nfirst blood.\"\n[pg 206]\n\n\nNo sword drawn before James the First of\nEngland, no assassination in that timid King's\npresence, could have produced a more terrified\naspect than was now presented by Don\nBenito.", "ranges" : [ { "start" : "/div[1]/p[265]", "startOffset" : 233, "end" : "/div[1]/p[266]", "endOffset" : 179, "_id" : { "$oid" : "506a41607258220200000021" } } ], "tags" : [], "text" : "This scene takes much more meaning after finishing reading the whole book. You can understand why Benito is so nervous, versus when I first read it it was confusing.", "updated" : { "$date" : 1349140832097 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "user" : "slonaker@mit.edu", "username" : "James S.", "uuid" : "0D697748" } -{ "__v" : 0, "_id" : { "$oid" : "505f59d2e3a2960200000024" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348426194378 }, "groups" : [ "21L.003" ], "id" : "505f59d2e3a2960200000024", "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "quote" : "Advancing,\nCaptain Delano perceived that the cheek was\nbleeding. He was about to ask the cause,\nwhen the negro's wailing soliloquy enlightened\nhim.\n\n\"Ah, when will master get better from his\nsickness; only the sour heart that sour sickness\nbreeds made him serve Babo so; cutting Babo\nwith the razor, because, only by accident,\nBabo had given master one little scratch; and\nfor the first time in so many a day, too. Ah,\nah, ah,\" holding his hand to his face.", "ranges" : [ { "start" : "/div[1]/p[276]", "startOffset" : 207, "end" : "/div[1]/p[277]", "endOffset" : 308, "_id" : { "$oid" : "505f59d2e3a2960200000025" } } ], "tags" : [], "text" : "Doesn't make since. Why did Babo cut himself? Or did Benito actually retaliate. I think he cut himself to make it seem realistic to Delano, but it seems unnecessary. ", "updated" : { "$date" : 1348426289126 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "user" : "slonaker@mit.edu", "username" : "James S.", "uuid" : "75D5400D" } -{ "id" : "505f5a526b07340200000032", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Seems really rude. Another part of the story that was confusing until you have read the whole story.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "\"I cannot go,\" decisively and repulsively\nrepeated Don Benito.", "uuid" : "76C766AE", "_id" : { "$oid" : "505f5a526b07340200000032" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[344]", "startOffset" : 0, "end" : "/div[1]/p[344]", "endOffset" : 62, "_id" : { "$oid" : "505f5a526b07340200000033" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348426322360 }, "created" : { "$date" : 1348426322360 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f5ab56b07340200000034", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Foreshadows what is about to happen. Especially the last part, \"God guard you better than me.\"", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "aiting a moment for the Spaniard\n[pg 234]\n\nto relinquish his hold, the now embarrassed\nCaptain Delano lifted his foot, to overstep the\nthreshold of the open gangway; but still Don\nBenito would not let go his hand. And\nyet, with an agitated tone, he said, \"I can\ngo no further; here I must bid you adieu.\nAdieu, my dear, dear Don Amasa. Go—go!\"\nsuddenly tearing his hand loose, \"go, and God\nguard you better than me, my best friend.\"", "uuid" : "0E6C516F", "_id" : { "$oid" : "505f5ab56b07340200000034" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[360]", "startOffset" : 107, "end" : "/div[1]/p[360]", "endOffset" : 539, "_id" : { "$oid" : "505f5ab56b07340200000035" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348426421615 }, "created" : { "$date" : 1348426421615 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f70ce6b07340200000036", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "text" : "Cleanthes seems to be supporting the equal use of evidence in all opinions. In this example, he comments on the absurdity of disregarding physics simply because there is no concrete evidence to support the conclusions that have been drawn. Cleanthes also suggests that a philosopher should avoid hypocrisy; if someone accepts evidence in support of their argument, then they must also accept similar evidence in support of opposing arguments. In these subjects, I tend to agree with Cleanthes. Evidence is only important when it is fairly and carefully compared with contradictory evidence.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Many principles of\nmechanics are founded on very abstruse reasoning; yet no man who has any\npretensions to science, even no speculative sceptic, pretends to\nentertain the least doubt with regard to them.", "uuid" : "AAEFB536", "_id" : { "$oid" : "505f70ce6b07340200000036" }, "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 17668, "end" : "/div[1]/div[4]", "endOffset" : 17871, "_id" : { "$oid" : "505f70ce6b07340200000037" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348432078786 }, "created" : { "$date" : 1348432078786 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f93fa6b07340200000038", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Philos explains how skepticism has come to be. Education has less of an influence than it did, allowing people to question the ideas mankind has come up with.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "During ignorant ages, such as those which\nfollowed the dissolution of the ancient schools, the priests perceived,\nthat Atheism, Deism, or heresy of any kind, could only proceed from the\npresumptuous questioning of received opinions, and from a belief that\nhuman reason was equal to every thing. Education had then a mighty\ninfluence over the minds of men, and was almost equal in force to those\nsuggestions of the senses and common understanding, by which the most\ndetermined sceptic must allow himself to be governed. But at present,\nwhen the influence of education is much diminished, and men, from a more\nopen commerce of the world, have learned to compare the popular\nprinciples of different nations and ages, our sagacious divines have\nchanged their whole system of philosophy", "uuid" : "F15A4873", "_id" : { "$oid" : "505f93fa6b07340200000038" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [ "holjose@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 21357, "end" : "/div[1]/div[4]", "endOffset" : 22138, "_id" : { "$oid" : "505f93fa6b07340200000039" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348441082755 }, "created" : { "$date" : 1348441082755 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505f98616b0734020000003a", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : ".... or good cop/bad cop, or maybe skeptic and believer, or really any dichotomous pair will do for conveying philosophical \"meat\" via dialogue.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Pedagogue and Pupil", "uuid" : "0AE9A713", "_id" : { "$oid" : "505f98616b0734020000003a" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 936, "end" : "/div[1]/div[3]", "endOffset" : 955, "_id" : { "$oid" : "505f98616b0734020000003b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348442209351 }, "created" : { "$date" : 1348442209351 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fa428e3a2960200000028", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "Agree's with DEMEA that the frailty of human senses and logic can generally be expected to produce confusion, contradiction and error. Rather than counter such tendencies with rigid doctine, PHILO contends that man should focus most intensely on understanding and respecting the feebleness of his own tools of perception and discovery. It seems to me that PHILO is promoting a doctrine not of theology, but instead of self-doubt. ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Let the\nerrors and deceits of our very senses be set before us; the insuperable\ndifficulties which attend first principles in all systems; the\ncontradictions which adhere to the very ideas of matter, cause and\neffect, extension, space, time, motion; and in a word, quantity of all\nkinds, the object of the only science that can fairly pretend to any\ncertainty or evidence. When these topics are displayed in their full\nlight, as they are by some philosophers and almost all divines; who can\nretain such confidence in this frail faculty of reason as to pay any\nregard to its determinations in points so sublime, so abstruse, so remote\nfrom common life and experience? When the coherence of the parts of a\nstone, or even that composition of parts which renders it extended; when\nthese familiar objects, I say, are so inexplicable, and contain\ncircumstances so repugnant and contradictory; with what assurance can we\ndecide concerning the origin of worlds, or trace their history from\neternity to eternity?", "uuid" : "134DE068", "_id" : { "$oid" : "505fa428e3a2960200000028" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 3853, "end" : "/div[1]/div[4]", "endOffset" : 4857, "_id" : { "$oid" : "505fa428e3a2960200000029" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348445224032 }, "created" : { "$date" : 1348445224032 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fa5426b0734020000003c", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Philos argues that if there is logically something that has created the universe, God, it is not correct to assume that \"He\" is perfect in the human sense of perfect. Focus on nature, not the physical being.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "But as all\nperfection is entirely relative, we ought never to imagine that we\ncomprehend the attributes of this divine Being, or to suppose that his\nperfections have any analogy or likeness to the perfections of a human\ncreature.", "uuid" : "A85C761F", "_id" : { "$oid" : "505fa5426b0734020000003c" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 3696, "end" : "/div[1]/div[5]", "endOffset" : 3925, "_id" : { "$oid" : "505fa5426b0734020000003d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348445506821 }, "created" : { "$date" : 1348445506821 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fa5e8e3a296020000002a", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Cleanthes describes the nature of the world as a machine subdivided into smaller machines. This is similar to the way the human mind works. It seems like a leap of logic to conclude that this proves a humanistic deity.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "By this argument a posteriori, and by this argument\nalone, do we prove at once the existence of a Deity, and his similarity\nto human mind and intelligence.", "uuid" : "473CB8CE", "_id" : { "$oid" : "505fa5e8e3a296020000002a" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 6178, "end" : "/div[1]/div[5]", "endOffset" : 6334, "_id" : { "$oid" : "505fa5e8e3a296020000002b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348445672726 }, "created" : { "$date" : 1348445672726 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fa716e3a296020000002c", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "CLEANTHES points out the ephemeral nature of human inspiration. The line between genius and \"plebian\" lies in the relatively sparse extraordinary periods of state of mind which cannot be overtly obtained or preserved. ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "When the mind, by Stoical reflections, is elevated into a\nsublime enthusiasm of virtue, and strongly smit with any species of\nhonour or public good, the utmost bodily pain and sufferings will not\nprevail over such a high sense of duty; and it is possible, perhaps, by\nits means, even to smile and exult in the midst of tortures. If this\nsometimes may be the case in fact and reality, much more may a\nphilosopher, in his school, or even in his closet, work himself up to\nsuch an enthusiasm, and support in imagination the acutest pain or most\ncalamitous event which he can possibly conceive. But how shall he support\nthis enthusiasm itself? The bent of his mind relaxes, and cannot be\nrecalled at pleasure; avocations lead him astray; misfortunes attack him\nunawares; and the philosopher sinks by degrees into the plebeian.", "uuid" : "5341464F", "_id" : { "$oid" : "505fa716e3a296020000002c" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 7591, "end" : "/div[1]/div[4]", "endOffset" : 8414, "_id" : { "$oid" : "505fa716e3a296020000002d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348445974334 }, "created" : { "$date" : 1348445974334 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fa7a0e3a296020000002e", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "I agree mostly with Philos' conjectures. He is saying you can't make assumptions based on patterns in unrelated natural phenomenons. He criticizes the logical jumps in Demea's and Cleanthes' arguments.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "If we see a house, CLEANTHES, we conclude, with the greatest certainty,\nthat it had an architect or builder; because this is precisely that\nspecies of effect which we have experienced to proceed from that species\nof cause. But surely you will not affirm, that the universe bears such a\nresemblance to a house, that we can with the same certainty infer a\nsimilar cause, or that the analogy is here entire and perfect. The\ndissimilitude is so striking, that the utmost you can here pretend to is\na guess, a conjecture, a presumption concerning a similar cause; and how\nthat pretension will be received in the world, I leave you to consider.", "uuid" : "C76A4B3E", "_id" : { "$oid" : "505fa7a0e3a296020000002e" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 8432, "end" : "/div[1]/div[5]", "endOffset" : 9071, "_id" : { "$oid" : "505fa7a0e3a296020000002f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348446112699 }, "created" : { "$date" : 1348446112699 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505faab2e3a2960200000030", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "Seems to have come around from the \"cult of self-doubt.\" I interpret this as a valid inductive method to reducing the amount of doubt which the observer can justify having in his own observations. Iterative improvements in theories and practice have certainly proved this methodology effective- at least in refining or expanding on existing knowledge. ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "To philosophise on such subjects, is nothing essentially\ndifferent from reasoning on common life; and we may only expect greater\nstability, if not greater truth, from our philosophy, on account of its\nexacter and more scrupulous method of proceeding.", "uuid" : "06A3D3B5", "_id" : { "$oid" : "505faab2e3a2960200000030" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 10637, "end" : "/div[1]/div[4]", "endOffset" : 10888, "_id" : { "$oid" : "505faab2e3a2960200000031" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348446898259 }, "created" : { "$date" : 1348446898259 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fadd86b0734020000003e", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "In the context of this course we often look at how children are educated. Religion is one of these cores and perhaps the only thing that must be absolutely accepted. Here the philosophers worry about using the period in which children accept all as fact to teach religion.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "what I chiefly admire in your\nplan of education, is your method of drawing advantage from the very\nprinciples of philosophy and learning, which, by inspiring pride and\nself-sufficiency, have commonly, in all ages, been found so destructive\nto the principles of religion.", "uuid" : "1576FC4E", "_id" : { "$oid" : "505fadd86b0734020000003e" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 2572, "end" : "/div[1]/div[4]", "endOffset" : 2842, "_id" : { "$oid" : "505fadd86b0734020000003f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348447704085 }, "created" : { "$date" : 1348447704085 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505faeeb6b07340200000040", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "how people come to believe religion. If everything else is proven wrong, then what remains must be correct", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "erect religious faith on\nphilosophical scepticism", "uuid" : "3125EA98", "_id" : { "$oid" : "505faeeb6b07340200000040" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 5247, "end" : "/div[1]/div[4]", "endOffset" : 5296, "_id" : { "$oid" : "505faeeb6b07340200000041" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348447979279 }, "created" : { "$date" : 1348447979279 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505faf75e3a2960200000032", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "Cleanthes makes a point about his distrust in Philo's recommendations on \"how to implement skepticism.\" His case study is religion- religious officials would view religious doctrine as a particularly familiar topic on which they were well versed, and encourage both themselves and others to accept it without any skepticism. The same forces, he contends, will reject the simplest of concepts if they in any way contradict said doctrine.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "This species of\nscepticism is fatal to knowledge, not to religion; since we find, that\nthose who make greatest profession of it, give often their assent, not\nonly to the great truths of Theism and natural theology, but even to the\nmost absurd tenets which a traditional superstition has recommended to\nthem. They firmly believe in witches, though they will not believe nor\nattend to the most simple proposition of Euclid. But the refined and\nphilosophical sceptics fall into an inconsistence of an opposite nature.", "uuid" : "3C8C87F3", "_id" : { "$oid" : "505faf75e3a2960200000032" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [ "chom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 14597, "end" : "/div[1]/div[4]", "endOffset" : 15112, "_id" : { "$oid" : "505faf75e3a2960200000033" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348448117355 }, "created" : { "$date" : 1348448117355 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fb0016b07340200000042", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "Call's PHILO out as a closeted atheist, based on his arguments. ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "And shall PHILO, a man of so liberal a genius and extensive\nknowledge, entertain any general undistinguished scruples with regard to\nthe religious hypothesis, which is founded on the simplest and most\nobvious arguments, and, unless it meets with artificial obstacles, has\nsuch easy access and admission into the mind of man?", "uuid" : "61F04E1B", "_id" : { "$oid" : "505fb0016b07340200000042" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [ "chom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 18109, "end" : "/div[1]/div[4]", "endOffset" : 18434, "_id" : { "$oid" : "505fb0016b07340200000043" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348448257184 }, "created" : { "$date" : 1348448257184 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fb0e3e3a2960200000034", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "A great point against PHILO. In my experiences the people tend to reject concepts they cannot understand (for instance people who still refute that global warming occurs. ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "general prejudice against what they do\nnot easily understand", "uuid" : "185E7F5B", "_id" : { "$oid" : "505fb0e3e3a2960200000034" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 14435, "end" : "/div[1]/div[4]", "endOffset" : 14495, "_id" : { "$oid" : "505fb0e3e3a2960200000035" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348448483924 }, "created" : { "$date" : 1348448483924 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fb0ef6b07340200000044", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "Philo denies being and atheist, and implies that to be one would render a person \"not formidable\" -- AKA, a big time weirdo that no one listens to. ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Atheists nowadays have a\ndouble share of folly; for they are not contented to say in their hearts\nthere is no God, but they also utter that impiety with their lips, and\nare thereby guilty of multiplied indiscretion and imprudence. Such\npeople, though they were ever so much in earnest, cannot, methinks, be\nvery formidable.", "uuid" : "068A9BEC", "_id" : { "$oid" : "505fb0ef6b07340200000044" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [ "chom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 20720, "end" : "/div[1]/div[4]", "endOffset" : 21044, "_id" : { "$oid" : "505fb0ef6b07340200000045" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348448495174 }, "created" : { "$date" : 1348448495174 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fb1d6e3a2960200000036", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "skeptics can attempt to refute everything, and thus seem to only consider points to prove them wrong as a means of entertainment", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "sect of jesters or raillers", "uuid" : "ECEF91D4", "_id" : { "$oid" : "505fb1d6e3a2960200000036" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 17020, "end" : "/div[1]/div[4]", "endOffset" : 17047, "_id" : { "$oid" : "505fb1d6e3a2960200000037" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348448726651 }, "created" : { "$date" : 1348448726651 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fb1e261ebcd0200000002", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "DEMEA says that the true nature of GOD is intrinsically beyond human understanding, and furthermore implies that such a relationship between humans and the essence of their spiritual beliefs is itself divine. blah", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "No man, no man at least of common sense, I am\npersuaded, ever entertained a serious doubt with regard to a truth so\ncertain and self-evident. The question is not concerning the being, but\nthe nature of God. This, I affirm, from the infirmities of human\nunderstanding, to be altogether incomprehensible and unknown to us", "uuid" : "0BE95B73", "_id" : { "$oid" : "505fb1e261ebcd0200000002" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [ "chom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 440, "end" : "/div[1]/div[5]", "endOffset" : 759, "_id" : { "$oid" : "505fb1e261ebcd0200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348448738334 }, "created" : { "$date" : 1348448738334 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fb261e3a2960200000038", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "Philo makes sure to make clear that he not only believes in GOD, but has reconciled the incomprehensibility of the divine with his skeptical theory of the universe. Since we have no empirical evidence that alludes to the nature of the GOD and the divine, it MUST be beyond the realm of human understanding. ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "But let us beware, lest we think that our ideas anywise correspond\nto his perfections, or that his attributes have any resemblance to these\nqualities among men. He is infinitely superior to our limited view and\ncomprehension; and is more the object of worship in the temple, than of\ndisputation in the schools.", "uuid" : "311CD51D", "_id" : { "$oid" : "505fb261e3a2960200000038" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [ "chom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 4137, "end" : "/div[1]/div[5]", "endOffset" : 4448, "_id" : { "$oid" : "505fb261e3a2960200000039" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348448865911 }, "created" : { "$date" : 1348448865911 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fb2d2e3a296020000003a", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "Love this line. I wonder if they are saying that too much thought creates a new religion, or if after deep consideration religion is the natural answer...", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "That a little philosophy, replied CLEANTHES, makes a man an\nAtheist: A great deal converts him to religion.", "uuid" : "43720D9A", "_id" : { "$oid" : "505fb2d2e3a296020000003a" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 20398, "end" : "/div[1]/div[4]", "endOffset" : 20505, "_id" : { "$oid" : "505fb2d2e3a296020000003b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348448978748 }, "created" : { "$date" : 1348448978748 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fb384e3a296020000003c", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "Again they are making a point that human reason is what leads to religion.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "If we distrust human reason, we have now no other principle to\nlead us into religion", "uuid" : "1F77B94C", "_id" : { "$oid" : "505fb384e3a296020000003c" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 22242, "end" : "/div[1]/div[4]", "endOffset" : 22326, "_id" : { "$oid" : "505fb384e3a296020000003d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348449156880 }, "created" : { "$date" : 1348449156880 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "505fb42b61ebcd0200000004" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348449323633 }, "groups" : [ "21L.448J" ], "id" : "505fb42b61ebcd0200000004", "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [ "chom@mit.edu" ] }, "quote" : "Since, therefore, the effects resemble each other, we are led to infer,\nby all the rules of analogy, that the causes also resemble; and that the\nAuthor of Nature is somewhat similar to the mind of man, though possessed\nof much larger faculties, proportioned to the grandeur of the work which\nhe has executed.", "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 5869, "end" : "/div[1]/div[5]", "endOffset" : 6177, "_id" : { "$oid" : "505fb42b61ebcd0200000005" } } ], "tags" : [], "text" : "CLEANTHES brings out the old \"the fingerprint of god is nature\" argument. PHILO should like this one, on the basis that CLEANTHES has presented an empirical, data-driven methodology for making inductive observations about divine nature through observing it's creations.", "updated" : { "$date" : 1348449466912 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "chom@mit.edu", "username" : "Colin H.", "uuid" : "B3B14056" } -{ "id" : "505fbd13e3a296020000003e", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "This could be said about religious doctrine as well... ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "What! No demonstration of the\nBeing of God! No abstract arguments! No proofs a priori!", "uuid" : "A48E2A4D", "_id" : { "$oid" : "505fbd13e3a296020000003e" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [ "chom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 6585, "end" : "/div[1]/div[5]", "endOffset" : 6671, "_id" : { "$oid" : "505fbd13e3a296020000003f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348451603869 }, "created" : { "$date" : 1348451603869 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fbe9161ebcd0200000006", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "Philo, though approving of a posteriori arguments in general, he again reverts to the dubious distinction he makes between the intrinsically knowable and unknowable to invalidate Cleanthe's argument that the essence of creation can be understood by observing the continued echoes in the universe it left behind. Philo's point relies on the assertion that the universe's creation and root cause is a distinctly different phenomena, removed and inherently different from all that we observe around us. He gives no real evidence for this, other than that mankind has insofar failed at 1) Producing any hard facts about it and 2) Reproducing it (though all 3 learned men agree that any arguments regarding the creation of the universe must be a posteriori, as there will never be another. They disagree on the implications this has)", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "In this cautious proceeding of the astronomers, you may read your own\ncondemnation, CLEANTHES; or rather may see, that the subject in which you\nare engaged exceeds all human reason and inquiry. Can you pretend to show\nany such similarity between the fabric of a house, and the generation of\na universe?", "uuid" : "9EF9951A", "_id" : { "$oid" : "505fbe9161ebcd0200000006" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [ "chom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 24813, "end" : "/div[1]/div[5]", "endOffset" : 25115, "_id" : { "$oid" : "505fbe9161ebcd0200000007" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348451985551 }, "created" : { "$date" : 1348451985551 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fc5f8e3a2960200000040", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Philos is arguing that it is hard to believe something without physically witnessing it.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Have worlds ever been formed under\nyour eye; and have you had leisure to observe the whole progress of the\nphenomenon, from the first appearance of order to its final consummation?", "uuid" : "90CBEFBA", "_id" : { "$oid" : "505fc5f8e3a2960200000040" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 25216, "end" : "/div[1]/div[5]", "endOffset" : 25396, "_id" : { "$oid" : "505fc5f8e3a2960200000041" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348453880747 }, "created" : { "$date" : 1348453880747 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "505fc6d2e3a2960200000042" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348454098287 }, "groups" : [ "21L.448J" ], "id" : "505fc6d2e3a2960200000042", "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [ "chom@mit.edu" ] }, "quote" : "And as the ideas of internal sentiment, added to those of\nthe external senses, compose the whole furniture of human understanding,\nwe may conclude, that none of the materials of thought are in any respect\nsimilar in the human and in the divine intelligence.", "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 10683, "end" : "/div[1]/div[6]", "endOffset" : 10941, "_id" : { "$oid" : "505fc6d2e3a2960200000043" } } ], "tags" : [], "text" : "Demea asserts that the divine nature is entirely removed from the physical phenomena to which the reach of human perception is limited.... (cont'd)", "updated" : { "$date" : 1348454110611 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "chom@mit.edu", "username" : "Colin H.", "uuid" : "57EBE3C9" } -{ "id" : "505fc74a61ebcd0200000008", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "...(cont'd) and that the very process by which we deduce worldly truths (science, rigorous natural philosophy) is inherently at odds with the very nature of GOD. Hence, humans should refrain from attempting to understand the divine in any analytic way.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Our thought is fluctuating, uncertain,\nfleeting, successive, and compounded; and were we to remove these\ncircumstances, we absolutely annihilate its essence, and it would in such\na case be an abuse of terms to apply to it the name of thought or reason.", "uuid" : "B02FCACC", "_id" : { "$oid" : "505fc74a61ebcd0200000008" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [ "chom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 11058, "end" : "/div[1]/div[6]", "endOffset" : 11310, "_id" : { "$oid" : "505fc74a61ebcd0200000009" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348454218454 }, "created" : { "$date" : 1348454218454 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fc9b961ebcd020000000a", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "text" : "This is similar to the argument made by many non-evolutionists that the large gaps in the fossil record do not support the theory of evolution. The fact that there are no intermediate forms of many organisms (or in this case, of components of the eye) is seen as a counterargument against gradual evolution of species and, in this context, the non-existence of a creator. My guess is that, at the time, this argument would have been very convincing. It would be difficult to imagine a fully-formed eye coming without some design or designated creator. Now, however, there are many theories as to what intermediate forms produced the eye, or filled in the gaps in the fossil record. This argument is still relevant, as many questions remain unanswered about the gaps, but as someone raised in the twenty-first century, it is far easier for me to disagree with Cleanthes on the conclusion he draws from this evidence. In fact, the functionality and precision of the eye is, in many ways, evidence that supports evolution. This structure has been optimized to provide humans with much of the sensory information necessary for survival, and has arisen due to the gradual improvement of inferior structures through natural selection.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "idea of a contriver does not immediately flow in upon you with a\nforce like that of sensation.", "uuid" : "6E5249F3", "_id" : { "$oid" : "505fc9b961ebcd020000000a" }, "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 5796, "end" : "/div[1]/div[6]", "endOffset" : 5890, "_id" : { "$oid" : "505fc9b961ebcd020000000b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348454841810 }, "created" : { "$date" : 1348454841810 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fcccae3a2960200000044", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Observes that the existence of a God is obvious but difficult to prove, and notes that attempting to explore a God leads to doubt, uncertainty, and contradiction, yet it is a human tendency to attempt it. Appeals to human nature to question though dismissively.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "What truth so obvious, so certain, as the being of a\nGod, which the most ignorant ages have acknowledged, for which the most\nrefined geniuses have ambitiously striven to produce new proofs and\narguments? What truth so important as this, which is the ground of all\nour hopes, the surest foundation of morality, the firmest support of\nsociety, and the only principle which ought never to be a moment absent\nfrom our thoughts and meditations? But, in treating of this obvious and\nimportant truth, what obscure questions occur concerning the nature of\nthat Divine Being, his attributes, his decrees, his plan of providence?\nThese have been always subjected to the disputations of men; concerning\nthese human reason has not reached any certain determination. But these\nare topics so interesting, that we cannot restrain our restless inquiry\nwith regard to them; though nothing but doubt, uncertainty, and\ncontradiction, have as yet been the result of our most accurate\nresearches.", "uuid" : "EFE59C61", "_id" : { "$oid" : "505fcccae3a2960200000044" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 2646, "end" : "/div[1]/div[3]", "endOffset" : 3622, "_id" : { "$oid" : "505fcccae3a2960200000045" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348455626864 }, "created" : { "$date" : 1348455626864 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fcdc8e3a2960200000046", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Demea introduces bias as he indoctrinates his children with an orthodoxy before inviting them to question it. ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "It is only as a science, replied DEMEA, subjected to\nhuman reasoning and disputation, that I postpone the study of Natural\nTheology. To season their minds with early piety, is my chief care; and\nby continual precept and instruction, and I hope too by example, I\nimprint deeply on their tender minds an habitual reverence for all the\nprinciples of religion", "uuid" : "916298B2", "_id" : { "$oid" : "505fcdc8e3a2960200000046" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 1442, "end" : "/div[1]/div[4]", "endOffset" : 1797, "_id" : { "$oid" : "505fcdc8e3a2960200000047" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348455880681 }, "created" : { "$date" : 1348455880681 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fced261ebcd020000000c", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "text" : "In this sentence, it appears that Cleanthes is making a distinction between a creator and a design; Nature intends to propagate each species, but there is not necessarily a single entity deciding the course of creation.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "that\nthe propagation of the species is intended by Nature?", "uuid" : "CD804438", "_id" : { "$oid" : "505fced261ebcd020000000c" }, "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 6278, "end" : "/div[1]/div[6]", "endOffset" : 6336, "_id" : { "$oid" : "505fced261ebcd020000000d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348456146687 }, "created" : { "$date" : 1348456146687 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fd03f61ebcd020000000e", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "A very utilitarian view. Is using human reason to investigate points \"so sublime, so abstruse\" worth the contradictions encountered? Is it easier to simply admit a fault on the part of human reason?", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Let DEMEA's principles be improved and cultivated: Let us become\nthoroughly sensible of the weakness, blindness, and narrow limits of\nhuman reason: Let us duly consider its uncertainty and endless\ncontrarieties, even in subjects of common life and practice: Let the\nerrors and deceits of our very senses be set before us; the insuperable\ndifficulties which attend first principles in all systems; the\ncontradictions which adhere to the very ideas of matter, cause and\neffect, extension, space, time, motion; and in a word, quantity of all\nkinds, the object of the only science that can fairly pretend to any\ncertainty or evidence. When these topics are displayed in their full\nlight, as they are by some philosophers and almost all divines; who can\nretain such confidence in this frail faculty of reason as to pay any\nregard to its determinations in points so sublime, so abstruse, so remote\nfrom common life and experience?", "uuid" : "23F732EA", "_id" : { "$oid" : "505fd03f61ebcd020000000e" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 3595, "end" : "/div[1]/div[4]", "endOffset" : 4519, "_id" : { "$oid" : "505fd03f61ebcd020000000f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348456511644 }, "created" : { "$date" : 1348456511644 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fd118e3a2960200000048", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Cleanthes: But human reason does make concrete predictions. It explains so much about the physical world.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "We shall then see,\nwhether you go out at the door or the window; and whether you really\ndoubt if your body has gravity, or can be injured by its fall; according\nto popular opinion, derived from our fallacious senses, and more\nfallacious experience.", "uuid" : "14BBC02D", "_id" : { "$oid" : "505fd118e3a2960200000048" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 5614, "end" : "/div[1]/div[4]", "endOffset" : 5862, "_id" : { "$oid" : "505fd118e3a2960200000049" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348456728865 }, "created" : { "$date" : 1348456728865 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fd19b61ebcd0200000010", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Cleanthes argues that things in nature are designed for a purpsoe just like things in the natural world. There is some force behind this purpose, deliberately designing to achieve the purpose. He criticizes Philos' lack of acceptance of the idea of the machine. However, some of CLeanthes' examples seem to be pulled out of thin air to me. The example of the sound especially seems random. ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Who can behold the male and female of each species, the\ncorrespondence of their parts and instincts, their passions, and whole\ncourse of life before and after generation, but must be sensible, that\nthe propagation of the species is intended by Nature?", "uuid" : "646A0C06", "_id" : { "$oid" : "505fd19b61ebcd0200000010" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 6085, "end" : "/div[1]/div[6]", "endOffset" : 6336, "_id" : { "$oid" : "505fd19b61ebcd0200000011" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348456859175 }, "created" : { "$date" : 1348456859175 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fd21ae3a296020000004a", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Demea is upset by the continued representation of god as \"perfect\" according to human attributes. Humanizing god can not be proven, and \"perfection\" has to do with the context.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "by representing the Deity as so intelligible and\ncomprehensible, and so similar to a human mind, we are guilty of the\ngrossest and most narrow partiality, and make ourselves the model of the\nwhole universe.", "uuid" : "33942A41", "_id" : { "$oid" : "505fd21ae3a296020000004a" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 9828, "end" : "/div[1]/div[6]", "endOffset" : 10036, "_id" : { "$oid" : "505fd21ae3a296020000004b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348456986257 }, "created" : { "$date" : 1348456986257 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fd35be3a296020000004c", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Cleanthes claims that people who believe in God without assuming God's nature are atheists. It's equivalent to saying you don't know what created the world.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "those who maintain the perfect\nsimplicity of the Supreme Being, to the extent in which you have\nexplained it, are complete Mystics, and chargeable with all the\nconsequences which I have drawn from their opinion. They are, in a word,\nAtheists, without knowing it.", "uuid" : "680ACB54", "_id" : { "$oid" : "505fd35be3a296020000004c" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]", "startOffset" : 3333, "end" : "/div[1]/div[7]", "endOffset" : 3595, "_id" : { "$oid" : "505fd35be3a296020000004d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348457307658 }, "created" : { "$date" : 1348457307658 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fd366e3a296020000004e", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Philo suggests that total skepticism is difficult to maintain and against human nature--we must believe in something, we cannot be truly objective. There is some truth in this statement, especially in light of recent research into the neurobiological origins of religious belief.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "External objects press\nin upon him; passions solicit him; his philosophical melancholy\ndissipates; and even the utmost violence upon his own temper will not be\nable, during any time, to preserve the poor appearance of scepticism.", "uuid" : "562D035E", "_id" : { "$oid" : "505fd366e3a296020000004e" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 6577, "end" : "/div[1]/div[4]", "endOffset" : 6806, "_id" : { "$oid" : "505fd366e3a296020000004f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348457318463 }, "created" : { "$date" : 1348457318463 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fd3f9e3a2960200000050", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "The lack of understanding and desire to undestand how the world was formed is a never ending chain of events. Who invented the world? How did these thoughts enter the creator's mind? etc.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "If the material world rests upon\na similar ideal world, this ideal world must rest upon some other; and so\non, without end.", "uuid" : "7F48BBE8", "_id" : { "$oid" : "505fd3f9e3a2960200000050" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]", "startOffset" : 7992, "end" : "/div[1]/div[7]", "endOffset" : 8116, "_id" : { "$oid" : "505fd3f9e3a2960200000051" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348457465662 }, "created" : { "$date" : 1348457465662 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fd54361ebcd0200000012", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Philo notes that our authority to make certain arguments regarding theology is questionable--do we really know what we think we know?", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "We must be far removed from the smallest\ntendency to scepticism not to be apprehensive, that we have here got\nquite beyond the reach of our faculties. So long as we confine our\nspeculations to trade, or morals, or politics, or criticism, we make\nappeals, every moment, to common sense and experience, which strengthen\nour philosophical conclusions, and remove, at least in part, the\nsuspicion which we so justly entertain with regard to every reasoning\nthat is very subtle and refined. But, in theological reasonings, we have\nnot this advantage; while, at the same time, we are employed upon\nobjects, which, we must be sensible, are too large for our grasp, and of\nall others, require most to be familiarised to our apprehension. We are\nlike foreigners in a strange country, to whom every thing must seem\nsuspicious, and who are in danger every moment of transgressing against\nthe laws and customs of the people with whom they live and converse. We\nknow not how far we ought to trust our vulgar methods of reasoning in\nsuch a subject; since, even in common life, and in that province which is\npeculiarly appropriated to them, we cannot account for them, and are\nentirely guided by a kind of instinct or necessity in employing them.", "uuid" : "5A553784", "_id" : { "$oid" : "505fd54361ebcd0200000012" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 11326, "end" : "/div[1]/div[4]", "endOffset" : 12558, "_id" : { "$oid" : "505fd54361ebcd0200000013" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348457795790 }, "created" : { "$date" : 1348457795790 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fd58561ebcd0200000014", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Importance of impartiality.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "The one has no more weight than the other. The\nmind must remain in suspense between them; and it is that very suspense\nor balance, which is the triumph of scepticism.", "uuid" : "4DD489E3", "_id" : { "$oid" : "505fd58561ebcd0200000014" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 13146, "end" : "/div[1]/div[4]", "endOffset" : 13313, "_id" : { "$oid" : "505fd58561ebcd0200000015" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348457861650 }, "created" : { "$date" : 1348457861650 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fd64fe3a2960200000052", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Cleanthes: impartiality is irrelevant in matters of fact. The fact is, Newton's theories of light and Copernicus' theories on the motions of the earth and planets explain the observations. They are more correct, objectively, than theories that don't successfully do so.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Wherever evidence discovers itself, you adhere to it,\nnotwithstanding your pretended scepticism; and I can observe, too, some\nof your sect to be as decisive as those who make greater professions of\ncertainty and assurance. In reality, would not a man be ridiculous, who\npretended to reject NEWTON's explication of the wonderful phenomenon of\nthe rainbow, because that explication gives a minute anatomy of the rays\nof light; a subject, forsooth, too refined for human comprehension? And\nwhat would you say to one, who, having nothing particular to object to\nthe arguments of COPERNICUS and GALILEO for the motion of the earth,\nshould withhold his assent, on that general principle, that these\nsubjects were too magnificent and remote to be explained by the narrow\nand fallacious reason of mankind?", "uuid" : "C26EB598", "_id" : { "$oid" : "505fd64fe3a2960200000052" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 13530, "end" : "/div[1]/div[4]", "endOffset" : 14328, "_id" : { "$oid" : "505fd64fe3a2960200000053" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348458063258 }, "created" : { "$date" : 1348458063258 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fd6dae3a2960200000054", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Science and theology are founded upon a similar level of subjectivity, asserts Demea.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "In vain would the sceptic make a distinction between science and common\nlife, or between one science and another. The arguments employed in all,\nif just, are of a similar nature, and contain the same force and\nevidence.", "uuid" : "5E5FD13F", "_id" : { "$oid" : "505fd6dae3a2960200000054" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 17332, "end" : "/div[1]/div[4]", "endOffset" : 17551, "_id" : { "$oid" : "505fd6dae3a2960200000055" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348458202809 }, "created" : { "$date" : 1348458202809 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fd72661ebcd0200000016", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "To the outside observer, philosophy and science are just as abstruse and nonsensical.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Many principles of\nmechanics are founded on very abstruse reasoning; yet no man who has any\npretensions to science, even no speculative sceptic, pretends to\nentertain the least doubt with regard to them.", "uuid" : "632735F7", "_id" : { "$oid" : "505fd72661ebcd0200000016" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 17668, "end" : "/div[1]/div[4]", "endOffset" : 17871, "_id" : { "$oid" : "505fd72661ebcd0200000017" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348458278481 }, "created" : { "$date" : 1348458278481 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fd7ece3a2960200000056", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Despite the similarity of science and theology, Christianity opposes religion.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "After the\nunion of philosophy with the popular religion, upon the first\nestablishment of Christianity, nothing was more usual, among all\nreligious teachers, than declamations against reason, against the senses,\nagainst every principle derived merely from human research and inquiry.", "uuid" : "B624E5E6", "_id" : { "$oid" : "505fd7ece3a2960200000056" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 18567, "end" : "/div[1]/div[4]", "endOffset" : 18849, "_id" : { "$oid" : "505fd7ece3a2960200000057" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348458476219 }, "created" : { "$date" : 1348458476219 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fd87de3a2960200000058", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Scientists are also analogical, declaring the non-existence of a God which they too feel in their hearts.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "That a little philosophy, replied CLEANTHES, makes a man an\nAtheist: A great deal converts him to religion. That is a very judicious\nremark too, said PHILO. But what I have in my eye is another passage,\nwhere, having mentioned DAVID's fool, who said in his heart there is no\nGod, this great philosopher observes, that the Atheists nowadays have a\ndouble share of folly; for they are not contented to say in their hearts\nthere is no God, but they also utter that impiety with their lips, and\nare thereby guilty of multiplied indiscretion and imprudence.", "uuid" : "D796FA6C", "_id" : { "$oid" : "505fd87de3a2960200000058" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 20398, "end" : "/div[1]/div[4]", "endOffset" : 20950, "_id" : { "$oid" : "505fd87de3a2960200000059" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348458621958 }, "created" : { "$date" : 1348458621958 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fd90f61ebcd0200000018", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "The question of God's existence is brushed over. Without realizing it, the three philosophers are selectively using reason.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "No man, no man at least of common sense, I am\npersuaded, ever entertained a serious doubt with regard to a truth so\ncertain and self-evident.", "uuid" : "CBA36C87", "_id" : { "$oid" : "505fd90f61ebcd0200000018" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 440, "end" : "/div[1]/div[5]", "endOffset" : 581, "_id" : { "$oid" : "505fd90f61ebcd0200000019" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348458767252 }, "created" : { "$date" : 1348458767252 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fdab9e3a296020000005c", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Bias of human perspective is acknowledged, but the bias of being indoctrinated with religion is not...", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "But in the same manner as\nwe ought not to imagine, even supposing him corporeal, that he is clothed\nwith a human body, as the ANTHROPOMORPHITES asserted, under colour that\nthat figure was the most perfect of any; so, neither ought we to imagine\nthat the spirit of God has human ideas, or bears any resemblance to our\nspirit, under colour that we know nothing more perfect than a human mind", "uuid" : "5DE0916E", "_id" : { "$oid" : "505fdab9e3a296020000005c" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 2192, "end" : "/div[1]/div[5]", "endOffset" : 2581, "_id" : { "$oid" : "505fdab9e3a296020000005d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348459193689 }, "created" : { "$date" : 1348459193689 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fdb0061ebcd020000001a", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "The \"bow your head and don't think dogma,\" one I disagree with. Regardless of the existence of God, asking questions is a good thing.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "They are covered in a deep\ncloud from human curiosity. It is profaneness to attempt penetrating\nthrough these sacred obscurities. And, next to the impiety of denying his\nexistence, is the temerity of prying into his nature and essence, decrees\nand attributes.", "uuid" : "4CA79FA4", "_id" : { "$oid" : "505fdb0061ebcd020000001a" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 1225, "end" : "/div[1]/div[5]", "endOffset" : 1485, "_id" : { "$oid" : "505fdb0061ebcd020000001b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348459264106 }, "created" : { "$date" : 1348459264106 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fdb04e3a296020000005e", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Very abstract definition of God. If you make your definitions super general, you can prove anything exists.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Nothing exists without a cause; and the original cause of\nthis universe (whatever it be) we call God; and piously ascribe to him\nevery species of perfection. Whoever scruples this fundamental truth,\ndeserves every punishment which can be inflicted among philosophers, to\nwit, the greatest ridicule, contempt, and disapprobation.", "uuid" : "7F9EDD25", "_id" : { "$oid" : "505fdb04e3a296020000005e" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 3366, "end" : "/div[1]/div[5]", "endOffset" : 3695, "_id" : { "$oid" : "505fdb04e3a296020000005f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348459268835 }, "created" : { "$date" : 1348459268835 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fdbcd61ebcd020000001c", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "We cannot so broadly define similarity and evidence of design when nature is truly not similar to art.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Might you not say, that all conclusions concerning fact were founded on\nexperience: that when we hear an articulate voice in the dark, and thence\ninfer a man, it is only the resemblance of the effects which leads us to\nconclude that there is a like resemblance in the cause: but that this\nextraordinary voice, by its loudness, extent, and flexibility to all\nlanguages, bears so little analogy to any human voice, that we have no\nreason to suppose any analogy in their causes: and consequently, that a\nrational, wise, coherent speech proceeded, you know not whence, from some\naccidental whistling of the winds, not from any divine reason or\nintelligence? You see clearly your own objections in these cavils, and I\nhope too you see clearly, that they cannot possibly have more force in\nthe one case than in the other.", "uuid" : "436B4764", "_id" : { "$oid" : "505fdbcd61ebcd020000001c" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 1781, "end" : "/div[1]/div[6]", "endOffset" : 2597, "_id" : { "$oid" : "505fdbcd61ebcd020000001d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348459469382 }, "created" : { "$date" : 1348459469382 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fdc2fe3a2960200000060", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Yet there are still very compelling signs of design.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Let me here observe too, continued CLEANTHES, that this religious\nargument, instead of being weakened by that scepticism so much affected\nby you, rather acquires force from it, and becomes more firm and\nundisputed. To exclude all argument or reasoning of every kind, is either\naffectation or madness. The declared profession of every reasonable\nsceptic is only to reject abstruse, remote, and refined arguments; to\nadhere to common sense and the plain instincts of nature; and to assent,\nwherever any reasons strike him with so full a force that he cannot,\nwithout the greatest violence, prevent it. Now the arguments for Natural\nReligion are plainly of this kind; and nothing but the most perverse,\nobstinate metaphysics can reject them.", "uuid" : "5E8C0147", "_id" : { "$oid" : "505fdc2fe3a2960200000060" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 4947, "end" : "/div[1]/div[6]", "endOffset" : 5685, "_id" : { "$oid" : "505fdc2fe3a2960200000061" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348459567267 }, "created" : { "$date" : 1348459567267 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fdc5f61ebcd020000001e", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Things work, so they must have been designed, is the gist of this argument.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Who can behold the male and female of each species, the\ncorrespondence of their parts and instincts, their passions, and whole\ncourse of life before and after generation, but must be sensible, that\nthe propagation of the species is intended by Nature? Millions and\nmillions of such instances present themselves through every part of the\nuniverse; and no language can convey a more intelligible irresistible\nmeaning, than the curious adjustment of final causes. To what degree,\ntherefore, of blind dogmatism must one have attained, to reject such\nnatural and such convincing arguments?", "uuid" : "BFD2DE66", "_id" : { "$oid" : "505fdc5f61ebcd020000001e" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 6085, "end" : "/div[1]/div[6]", "endOffset" : 6669, "_id" : { "$oid" : "505fdc5f61ebcd020000001f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348459615531 }, "created" : { "$date" : 1348459615531 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fe410e3a2960200000062", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "This argument is perfectly logical. And it is true to some extent that our ideas come from our experience. This is why one can't rationalize about God.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Our ideas reach no further than our experience. We\nhave no experience of divine attributes and operations. I need not\nconclude my syllogism. You can draw the inference yourself.", "uuid" : "0403DD4C", "_id" : { "$oid" : "505fe410e3a2960200000062" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 4613, "end" : "/div[1]/div[5]", "endOffset" : 4790, "_id" : { "$oid" : "505fe410e3a2960200000063" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348461584050 }, "created" : { "$date" : 1348461584050 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fe44561ebcd0200000020", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "definition of design given by the professor in class", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "adapting of means to ends", "uuid" : "C04707F3", "_id" : { "$oid" : "505fe44561ebcd0200000020" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 5685, "end" : "/div[1]/div[5]", "endOffset" : 5710, "_id" : { "$oid" : "505fe44561ebcd0200000021" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348461637751 }, "created" : { "$date" : 1348461637751 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fe494e3a2960200000064", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "proof by similarity. Lacks rigor and I don't buy it.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "the effects resemble each other, we are led to infer,\nby all the rules of analogy, that the causes also resemble", "uuid" : "8A50B592", "_id" : { "$oid" : "505fe494e3a2960200000064" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 5887, "end" : "/div[1]/div[5]", "endOffset" : 5999, "_id" : { "$oid" : "505fe494e3a2960200000065" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348461716570 }, "created" : { "$date" : 1348461716570 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fe4f461ebcd0200000022", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "He is saying that God is essentially a really smart, really powerful human.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "By this argument a posteriori, and by this argument\nalone, do we prove at once the existence of a Deity, and his similarity\nto human mind and intelligence.", "uuid" : "20AB7328", "_id" : { "$oid" : "505fe4f461ebcd0200000022" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 6178, "end" : "/div[1]/div[5]", "endOffset" : 6333, "_id" : { "$oid" : "505fe4f461ebcd0200000023" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348461812756 }, "created" : { "$date" : 1348461812756 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fe58061ebcd0200000024", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "From everyday experience, I find that religious people tend to lose in debates with Atheists when they try to rationalize about or \"prove\" the existence of God.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "But surely, by this affected candour, you give advantages to Atheists,\nwhich they never could obtain by the mere dint of argument and reasoning.", "uuid" : "F35124A3", "_id" : { "$oid" : "505fe58061ebcd0200000024" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 6904, "end" : "/div[1]/div[5]", "endOffset" : 7049, "_id" : { "$oid" : "505fe58061ebcd0200000025" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348461952746 }, "created" : { "$date" : 1348461952746 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505fefc461ebcd0200000026", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "Here we see a teleological argument. If we have an effect there must be a cause. If we have a design there must be a designer.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Nothing exists without a cause; and the original cause of\nthis universe (whatever it be) we call God", "uuid" : "720E3F8D", "_id" : { "$oid" : "505fefc461ebcd0200000026" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 3367, "end" : "/div[1]/div[5]", "endOffset" : 3467, "_id" : { "$oid" : "505fefc461ebcd0200000027" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348464580564 }, "created" : { "$date" : 1348464580564 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "505ff2f4277b5a0200000002", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "It is ok to ask the cause but not cause of the cause, this seems like he is giving up to me.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "You ask me,\nwhat is the cause of this cause? I know not; I care not; that concerns\nnot me.", "uuid" : "0600DD93", "_id" : { "$oid" : "505ff2f4277b5a0200000002" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]", "startOffset" : 12234, "end" : "/div[1]/div[7]", "endOffset" : 12324, "_id" : { "$oid" : "505ff2f4277b5a0200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348465396651 }, "created" : { "$date" : 1348465396651 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50600746277b5a0200000004", "user" : "sheilaxu@mit.edu", "username" : "Sheila X.", "text" : "It appears here that Cleanthes is arguing that the system we see around us can only seem to be designed as someone as intelligent as humans, but more grander and far-reaching, which he tries to make a case that God exists. ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "The curious adapting of means to ends, throughout all\nnature, resembles exactly, though it much exceeds, the productions of\nhuman contrivance; of human designs, thought, wisdom, and intelligence.\nSince, therefore, the effects resemble each other, we are led to infer,\nby all the rules of analogy, that the causes also resemble; and that the\nAuthor of Nature is somewhat similar to the mind of man, though possessed\nof much larger faculties, proportioned to the grandeur of the work which\nhe has executed.", "uuid" : "21A63B9E", "_id" : { "$oid" : "50600746277b5a0200000004" }, "permissions" : { "delete" : [ "sheilaxu@mit.edu" ], "update" : [ "sheilaxu@mit.edu" ], "admin" : [ "sheilaxu@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 5673, "end" : "/div[1]/div[5]", "endOffset" : 6178, "_id" : { "$oid" : "50600746277b5a0200000005" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348470598094 }, "created" : { "$date" : 1348470598094 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506007e6277b5a0200000006", "user" : "sheilaxu@mit.edu", "username" : "Sheila X.", "text" : "In here, Philo refutes Cleanthes' previous statement saying Cleanthes drew a conclusion by looking, especially that looking tends to be prone to \"error and uncertainty\"", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "That a stone will fall, that fire will burn, that the\nearth has solidity, we have observed a thousand and a thousand times; and\nwhen any new instance of this nature is presented, we draw without\nhesitation the accustomed inference. The exact similarity of the cases\ngives us a perfect assurance of a similar event; and a stronger evidence\nis never desired nor sought after. But wherever you depart, in the least,\nfrom the similarity of the cases, you diminish proportionably the\nevidence; and may at last bring it to a very weak analogy, which is\nconfessedly liable to error and uncertainty.", "uuid" : "6FEA785B", "_id" : { "$oid" : "506007e6277b5a0200000006" }, "permissions" : { "delete" : [ "sheilaxu@mit.edu" ], "update" : [ "sheilaxu@mit.edu" ], "admin" : [ "sheilaxu@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 7278, "end" : "/div[1]/div[5]", "endOffset" : 7869, "_id" : { "$oid" : "506007e6277b5a0200000007" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348470779175 }, "created" : { "$date" : 1348470758909 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5060086b61ebcd0200000028", "user" : "sheilaxu@mit.edu", "username" : "Sheila X.", "text" : "This appears to be in line with the Aristotelian view of the world, especially that everything has a purpose (teleology) ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "It would surely be very ill received, replied CLEANTHES; and I should be\ndeservedly blamed and detested, did I allow, that the proofs of a Deity\namounted to no more than a guess or conjecture. But is the whole\nadjustment of means to ends in a house and in the universe so slight a\nresemblance? The economy of final causes? The order, proportion, and\narrangement of every part? Steps of a stair are plainly contrived, that\nhuman legs may use them in mounting; and this inference is certain and\ninfallible.", "uuid" : "D712AEE8", "_id" : { "$oid" : "5060086b61ebcd0200000028" }, "permissions" : { "delete" : [ "sheilaxu@mit.edu" ], "update" : [ "sheilaxu@mit.edu" ], "admin" : [ "sheilaxu@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 9072, "end" : "/div[1]/div[5]", "endOffset" : 9576, "_id" : { "$oid" : "5060086b61ebcd0200000029" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348470891763 }, "created" : { "$date" : 1348470891763 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50604aa3277b5a0200000008", "user" : "alex93@mit.edu", "username" : "Alexander O.", "text" : "This shows that Hume is aware of the consequences of discussing in the eighteenth century radical ideas such as natural religion.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "though nothing but doubt, uncertainty, and\ncontradiction, have as yet been the result of our most accurate\nresearches", "uuid" : "7D8C6C27", "_id" : { "$oid" : "50604aa3277b5a0200000008" }, "permissions" : { "delete" : [ "alex93@mit.edu" ], "update" : [ "alex93@mit.edu" ], "admin" : [ "alex93@mit.edu" ], "read" : [ "alex93@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 3503, "end" : "/div[1]/div[3]", "endOffset" : 3620, "_id" : { "$oid" : "50604aa3277b5a0200000009" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348487843898 }, "created" : { "$date" : 1348487843898 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50604b7c277b5a020000000a" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348488060980 }, "groups" : [ "21L.448J" ], "id" : "50604b7c277b5a020000000a", "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [] }, "quote" : "Consider, anatomise the eye;\nsurvey its structure and contrivance; and tell me, from your own feeling,\nif the idea of a contriver does not immediately flow in upon you with a\nforce like that of sensation. The most obvious conclusion, surely, is in\nfavour of design", "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 5686, "end" : "/div[1]/div[6]", "endOffset" : 5950, "_id" : { "$oid" : "50604b7c277b5a020000000b" } } ], "tags" : [], "text" : "My main objection to this argument is that in recent years we have discovered that through evolution, nature can produce extraordinarily complex structures. All of which arise not by design but trial and error. Evolution is not trying to produce more advanced or well adapted organisms, it is simply a matter of survival of the fittest. In the end, animals are nothing but matter just like everything else and thereby follow the same rules of physics. However, on a more philosophical note, I think the biggest flaw in Cleanthes' argument is that it limits god to merely being an entity to accredit everything we cannot understand to. BY our nature humans are always striving to learn more about our world and when we cannot find an answer it can be very frustrating. As in this example, the eye is one of the most complex parts of our anatomy and until recently humans had no idea how it worked. It is easy to conclude that God must have designed it and in a similar fashion we can easily state that anything we dont understand is attributable to God. THis is very dangerous. It makes god simply a placeholder and whenever we discover new information his size shrinks slightly. ", "updated" : { "$date" : 1348488882539 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "uuid" : "DD3B0D99" } -{ "id" : "50604c87277b5a020000000c", "user" : "alex93@mit.edu", "username" : "Alexander O.", "text" : "Now the discussion of logic and reason are being brought up with empirical evidence. This shows that it is ridiculous to reject these scientific beliefs, and would it not be similar to reject logic in religion?", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "In reality, would not a man be ridiculous, who\npretended to reject NEWTON's explication of the wonderful phenomenon of\nthe rainbow, because that explication gives a minute anatomy of the rays\nof light; a subject, forsooth, too refined for human comprehension? And\nwhat would you say to one, who, having nothing particular to object to\nthe arguments of COPERNICUS and GALILEO for the motion of the earth,\nshould withhold his assent, on that general principle, that these\nsubjects were too magnificent and remote to be explained by the narrow\nand fallacious reason of mankind?", "uuid" : "D89968E1", "_id" : { "$oid" : "50604c87277b5a020000000c" }, "permissions" : { "delete" : [ "alex93@mit.edu" ], "update" : [ "alex93@mit.edu" ], "admin" : [ "alex93@mit.edu" ], "read" : [ "alex93@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 13752, "end" : "/div[1]/div[4]", "endOffset" : 14328, "_id" : { "$oid" : "50604c87277b5a020000000d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348488327986 }, "created" : { "$date" : 1348488327986 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "50605048277b5a020000000e" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348489288587 }, "groups" : [ "21L.448J" ], "id" : "50605048277b5a020000000e", "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [] }, "quote" : "Who can behold the male and female of each species, the\ncorrespondence of their parts and instincts, their passions, and whole\ncourse of life before and after generation, but must be sensible, that\nthe propagation of the species is intended by Nature?", "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 6085, "end" : "/div[1]/div[6]", "endOffset" : 6336, "_id" : { "$oid" : "5061be19b4b40a0200000006" } } ], "tags" : [], "text" : "Although it is incredibly improbable that the beautifully complex world we live in has come into existence, the fact is that (accepting that the universe came into existance) the world had to develop one way or the other.", "updated" : { "$date" : 1348582937370 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "uuid" : "BD0C3F6F" } -{ "__v" : 1, "_id" : { "$oid" : "5060a34461ebcd020000002a" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348510532459 }, "groups" : [ "21L.000J" ], "id" : "5060a34461ebcd020000002a", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "quote" : "glimmer of the half-extinguished light", "ranges" : [ { "start" : "/div[1]/p[154]", "startOffset" : 394, "end" : "/div[1]/p[154]", "endOffset" : 433, "_id" : { "$oid" : "5088255d2d2903020000003e" } } ], "tags" : [], "text" : " \"gleams of half-extinguished thought\"?", "updated" : { "$date" : 1351099741321 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "uuid" : "DA62C5B9" } -{ "id" : "5060a38561ebcd020000002c", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : " Their colours and their forms, were then to me\n An appetite; a feeling and a love, 80\n That had no need of a remoter charm,\n By thought supplied, nor any interest\n Unborrowed from the eye.--That time is past,\n And all its aching joys are now no more,\n And all its dizzy raptures. Not for this\n Faint I, nor mourn nor murmur, other gifts\n Have followed; for such loss, I would believe,\n Abundant recompence. For I have learned\n To look on nature, not as in the hour\n Of thoughtless youth; but hearing oftentimes 90\n The still, sad music of humanity,\n Nor harsh nor grating, though of ample power\n To chasten and subdue. And I have felt\n A presence that disturbs me with the joy\n Of elevated thoughts; a sense sublime\n Of something far more deeply interfused,", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "A human being in perfection ought always to preserve a calm and peaceful \nmind, and never to allow passion or a transitory desire to disturb his \ntranquillity. I do not think that the pursuit of knowledge is an exception to \nthis rule. If the study to which you apply yourself has a tendency to weaken \nyour affections, and to destroy your taste for those simple pleasures in which \nno alloy can possibly mix, then that study is certainly unlawful, that is to \nsay, not befitting the human mind.", "uuid" : "B43B9CE7", "_id" : { "$oid" : "5060a38561ebcd020000002c" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[151]", "startOffset" : 218, "end" : "/div[1]/p[151]", "endOffset" : 714, "_id" : { "$oid" : "5060a38561ebcd020000002d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348510597155 }, "created" : { "$date" : 1348510597155 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5060a3bb277b5a0200000010", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Thoughtless youth", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "One of the phænomena which had peculiarly attracted my \nattention was the structure of the human frame, and, indeed, any animal endued \nwith life. Whence, I often asked myself, did the principle of life proceed? It \nwas a bold question, and one which has ever been considered as a mystery; yet \nwith how many things are we upon the brink of becoming acquainted, if cowardice \nor carelessness did not restrain our inquiries. I revolved these circumstances \nin my mind, and determined thenceforth to apply myself more particularly to \nthose branches of natural philosophy which relate to physiology. Unless I had \nbeen animated by an almost supernatural enthusiasm, my application to this study \nwould have been irksome, and almost intolerable. To examine the causes of life, \nwe must first have recourse to death. I became acquainted with the science of \nanatomy: but this was not sufficient; I must also observe the natural decay and \ncorruption of the human body. In my education my father had taken the greatest \nprecautions that my mind should be impressed with no supernatural horrors. I do \nnot ever remember to have trembled at a tale of superstition, or to have feared \nthe apparition of a spirit. Darkness had no effect upon my fancy; and a \nchurchyard was to me merely the receptacle of bodies deprived of life, which, \nfrom being the seat of beauty and strength, had become food for the worm. Now I \nwas led to examine the cause and progress of this decay, and forced to spend \ndays and nights in vaults and charnel houses. My attention was fixed upon every \nobject the most insupportable to the delicacy of the human feelings. I saw how \nthe fine form of man was degraded and wasted; I beheld the corruption of death \nsucceed to the blooming cheek of life; I saw how the worm inherited the wonders \nof the eye and brain. I paused, examining and analysing all the minutiae of \ncausation, as exemplified in the change from life to death, and death to life, \nuntil from the midst of this darkness a sudden light broke in upon me -- a light \nso brilliant and wondrous, yet so simple, that while I became dizzy with the \nimmensity of the prospect which it illustrated, I was surprised that among so \nmany men of genius, who had directed their inquiries towards the same science, \nthat I alone should be reserved to discover so astonishing a secret.", "uuid" : "B4329F18", "_id" : { "$oid" : "5060a3bb277b5a0200000010" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[142]", "startOffset" : 0, "end" : "/div[1]/p[142]", "endOffset" : 2354, "_id" : { "$oid" : "5060a3bb277b5a0200000011" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348510651519 }, "created" : { "$date" : 1348510651519 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5060a43161ebcd020000002e" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348510769397 }, "groups" : [ "21L.000J" ], "id" : "5060a43161ebcd020000002e", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "quote" : "I see by your eagerness, and the wonder and hope which your \neyes express, my friend, that you expect to be informed of the secret with which \nI am acquainted; that cannot be: listen patiently until the end of my story, and \nyou will easily perceive why I am reserved upon that subject. I will not lead \nyou on, unguarded and ardent as I then was, to your destruction and infallible \nmisery", "ranges" : [ { "start" : "/div[1]/p[145]", "startOffset" : 0, "end" : "/div[1]/p[145]", "endOffset" : 390, "_id" : { "$oid" : "508822762d29030200000002" } } ], "tags" : [], "text" : "in thy voice I catch\n The language of my former heart, and read\n My former pleasures in the shooting lights\n Of thy wild eyes.\nTintern Abbey, Wordsworth", "updated" : { "$date" : 1351099030664 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "uuid" : "E00E83FA" } -{ "id" : "5060a457277b5a0200000012", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Thoughtless youth. Death as a necessary end with come when it comes.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "No one can conceive the variety of feelings which bore me \nonwards, like a hurricane, in the first enthusiasm of success. Life and death \nappeared to me ideal bounds, which I should first break through, and pour a \ntorrent of light into our dark world. A new species would bless me as its \ncreator and source; many happy and excellent natures would owe their being to \nme. No father could claim the gratitude of his child so completely as I should \ndeserve their's. Pursuing these reflections, I thought, that if I could bestow \nanimation upon lifeless matter, I might in process of time (although I now found \nit impossible) renew life where death had apparently devoted the body to \ncorruption.", "uuid" : "DD5C99E0", "_id" : { "$oid" : "5060a457277b5a0200000012" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[147]", "startOffset" : 0, "end" : "/div[1]/p[147]", "endOffset" : 697, "_id" : { "$oid" : "5060a457277b5a0200000013" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348510807835 }, "created" : { "$date" : 1348510807835 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5060a4a5277b5a0200000014" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348510885625 }, "groups" : [ "21L.000J" ], "id" : "5060a4a5277b5a0200000014", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "quote" : "that man is who \nbelieves his native town to be the world, than he who aspires to become greater \nthan his nature will allow.", "ranges" : [ { "start" : "/div[1]/p[145]", "startOffset" : 522, "end" : "/div[1]/p[145]", "endOffset" : 648, "_id" : { "$oid" : "5082c8e84097460200000002" } } ], "tags" : [], "text" : "Why should a man desire in any way\nTo vary from the kindly race of men\nOr pass beyond the goal of ordinance\nWhere all should pause, as is most meet for all? \nTithonus Tennyson.", "updated" : { "$date" : 1350748392909 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "uuid" : "183E6CF0" } -{ "id" : "50610bfe59fff30200000002", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "we are but a speck...", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "If this argument, I say, had any force in former ages, how much greater\nmust it have at present, when the bounds of Nature are so infinitely\nenlarged, and such a magnificent scene is opened to us? It is still more\nunreasonable to form our idea of so unlimited a cause from our experience\nof the narrow productions of human design and invention.", "uuid" : "2BC1C035", "_id" : { "$oid" : "50610bfe59fff30200000002" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 1775, "end" : "/div[1]/div[8]", "endOffset" : 2119, "_id" : { "$oid" : "50610bfe59fff30200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348537342757 }, "created" : { "$date" : 1348537342757 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50610c4859fff30200000004", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "could humans possibly think in such a large or such a small scale? aren't humans clumsy and careless?", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "vastly different from mankind, or from\nany object of human experience and observation.", "uuid" : "78293475", "_id" : { "$oid" : "50610c4859fff30200000004" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 2370, "end" : "/div[1]/div[8]", "endOffset" : 2458, "_id" : { "$oid" : "50610c4859fff30200000005" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348537416152 }, "created" : { "$date" : 1348537416152 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50610e4859fff30200000006", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "why the need to improve and use trial and error, if that is what happened, if there were no intention? why make anything at all if there is no intention? every system and organism serves some purpose, whether immediate or delayed. A ship is made to carry objects over water safely. The earth was made as a home for objects and people. every system on earth, and beyond earth, serves this purpose. (sunlight, moon's gravitational pull and night light, balance of gravity by other planets that allows earth to move in a way to have seasons, seasons allow growth, etc..)", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "gradually improving", "uuid" : "AA989254", "_id" : { "$oid" : "50610e4859fff30200000006" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 5112, "end" : "/div[1]/div[8]", "endOffset" : 5131, "_id" : { "$oid" : "50610e4859fff30200000007" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348537928117 }, "created" : { "$date" : 1348537928117 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50610f1b59fff30200000008", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "lending to DEMEA's position", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "An intelligent being of such vast power and\ncapacity as is necessary to produce the universe, or, to speak in the\nlanguage of ancient philosophy, so prodigious an animal exceeds all\nanalogy, and even comprehension.", "uuid" : "8BEEFF18", "_id" : { "$oid" : "50610f1b59fff30200000008" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 7413, "end" : "/div[1]/div[8]", "endOffset" : 7628, "_id" : { "$oid" : "50610f1b59fff30200000009" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348538139528 }, "created" : { "$date" : 1348538139528 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50610f5f277b5a0200000016", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "i don't agree that this is what CLEANTHES point was..", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "according to\nyou, solid and philosophical", "uuid" : "B017224B", "_id" : { "$oid" : "50610f5f277b5a0200000016" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 8342, "end" : "/div[1]/div[8]", "endOffset" : 8384, "_id" : { "$oid" : "50610f5f277b5a0200000017" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348538207879 }, "created" : { "$date" : 1348538207879 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50611108277b5a0200000018", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "PHILO is suggesting this only to say that it's not his thought but it's the absurdity of CLEANTHES' argument. This is brought back to his example of the ship builder, who only made a good ship after learning from the mistakes of those before him. Earth is the first mistake, in this sense. But this would mean that there are other, better worlds that exist that came to be after Earth. The idea is very contradictory to the beliefs of really any era; at all times our world is supposed as being the only one sustaining intelligent life. But to defend this world, it is humans that ran amok, not the natural world that was designed in the first place.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "nly the first rude essay of some infant deity, who\nafterwards abandoned it, ashamed of his lame performance", "uuid" : "091476EC", "_id" : { "$oid" : "50611108277b5a0200000018" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 8827, "end" : "/div[1]/div[8]", "endOffset" : 8934, "_id" : { "$oid" : "50611108277b5a0200000019" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348538632210 }, "created" : { "$date" : 1348538632210 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50611183277b5a020000001a", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "if we say that God is limited, then how could this be his last step? wouldn't he try harder next time? if he is not limited, then he would make a perfect world on the first try.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "From the moment the attributes of the Deity are\nsupposed finite, all these have place", "uuid" : "05A470F2", "_id" : { "$oid" : "50611183277b5a020000001a" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 9391, "end" : "/div[1]/div[8]", "endOffset" : 9476, "_id" : { "$oid" : "50611183277b5a020000001b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348538755742 }, "created" : { "$date" : 1348538755742 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50611774277b5a020000001c" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348540276959 }, "groups" : [ "21L.448J" ], "id" : "50611774277b5a020000001c", "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "quote" : "These words, generation,\nreason, mark only certain powers and energies in nature, whose effects\nare known, but whose essence is incomprehensible; and one of these\nprinciples, more than the other, has no privilege for being made a\nstandard to the whole of nature.", "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 4703, "end" : "/div[1]/div[10]", "endOffset" : 4966, "_id" : { "$oid" : "50611774277b5a020000001d" } } ], "tags" : [], "text" : "PHILO is saying that the world is more like a vegetable or an animal than it is like any artificial machine. It is a better analogy, he says, than machines because, while they are reasonable, they are not of man and their cause, or essence, is unknown. PHILO is not making a joke, I think he is making a good point. As complex as we think man-made machines are, they cannot compare to nature. And here is where God is far superior to man and cannot be likened to man. Vegetables don't need batteries or electricity, they take care of themselves, in a way. ", "updated" : { "$date" : 1348540368792 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "uuid" : "F908E980" } -{ "id" : "5061180a59fff3020000000a", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "reason, instinct, generation, vegetation,", "uuid" : "62CBB474", "_id" : { "$oid" : "5061180a59fff3020000000a" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [ "4", "causes" ], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 5253, "end" : "/div[1]/div[10]", "endOffset" : 5294, "_id" : { "$oid" : "5061180a59fff3020000000b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348540426242 }, "created" : { "$date" : 1348540426242 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506119a8277b5a020000001e", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "lol", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "I must confess, PHILO, replied CLEANTHES, that of all men living, the\ntask which you have undertaken, of raising doubts and objections, suits\nyou best, and seems, in a manner, natural and unavoidable to you. So\ngreat is your fertility of invention, that I am not ashamed to\nacknowledge myself unable, on a sudden, to solve regularly such\nout-of-the-way difficulties as you incessantly start upon me: though I\nclearly see, in general, their fallacy and error. And I question not, but\nyou are yourself, at present, in the same case, and have not the solution\nso ready as the objection: while you must be sensible, that common sense\nand reason are entirely against you; and that such whimsies as you have\ndelivered, may puzzle, but never can convince us.", "uuid" : "CC9C86F7", "_id" : { "$oid" : "506119a8277b5a020000001e" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 11316, "end" : "/div[1]/div[10]", "endOffset" : 12068, "_id" : { "$oid" : "506119a8277b5a020000001f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348540840993 }, "created" : { "$date" : 1348540840993 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50611a5859fff3020000000c", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "This is quite a leap. Assuming an ordered world must needs be the work of a creator, for the sake of sanity. Philo makes a practical suggestion here.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "By supposing it to contain the principle of its\norder within itself, we really assert it to be God; and the sooner we\narrive at that Divine Being, so much the better. When you go one step\nbeyond the mundane system, you only excite an inquisitive humour which it\nis impossible ever to satisfy.", "uuid" : "DE03623D", "_id" : { "$oid" : "50611a5859fff3020000000c" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]", "startOffset" : 8193, "end" : "/div[1]/div[7]", "endOffset" : 8485, "_id" : { "$oid" : "50611a5859fff3020000000d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348541016203 }, "created" : { "$date" : 1348541016203 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50611d0659fff30200000010", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Evidence too is subjectively interpreted.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "All the new discoveries in astronomy, which prove the immense grandeur\nand magnificence of the works of Nature, are so many additional arguments\nfor a Deity, according to the true system of Theism; but, according to\nyour hypothesis of experimental Theism, they become so many objections,\nby removing the effect still further from all resemblance to the effects\nof human art and contrivance.", "uuid" : "017888A3", "_id" : { "$oid" : "50611d0659fff30200000010" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [ "vvachh@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 597, "end" : "/div[1]/div[8]", "endOffset" : 988, "_id" : { "$oid" : "50611d0659fff30200000011" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348541702746 }, "created" : { "$date" : 1348541702746 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50611df7277b5a0200000020", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "The sheer scale of the universe makes it so difficult to imagine a human-like design process creating it all.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "If this argument, I say, had any force in former ages, how much greater\nmust it have at present, when the bounds of Nature are so infinitely\nenlarged, and such a magnificent scene is opened to us? It is still more\nunreasonable to form our idea of so unlimited a cause from our experience\nof the narrow productions of human design and invention.", "uuid" : "EAD2DB8E", "_id" : { "$oid" : "50611df7277b5a0200000020" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 1775, "end" : "/div[1]/div[8]", "endOffset" : 2119, "_id" : { "$oid" : "50611df7277b5a0200000021" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348541943587 }, "created" : { "$date" : 1348541943587 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "50611e6b59fff30200000012" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348542059092 }, "groups" : [ "21L.448J" ], "id" : "50611e6b59fff30200000012", "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "quote" : "Now, CLEANTHES, said PHILO, with an air of alacrity and triumph, mark the\nconsequences. First, By this method of reasoning, you renounce all claim\nto infinity in any of the attributes of the Deity. For, as the cause\nought only to be proportioned to the effect, and the effect, so far as it\nfalls under our cognisance, is not infinite; what pretensions have we,\nupon your suppositions, to ascribe that attribute to the Divine Being?\nYou will still insist, that, by removing him so much from all similarity\nto human creatures, we give in to the most arbitrary hypothesis, and at\nthe same time weaken all proofs of his existence.", "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 2859, "end" : "/div[1]/div[8]", "endOffset" : 3486, "_id" : { "$oid" : "50611ee559fff30200000014" } } ], "tags" : [], "text" : "Comparing the mind of a deity to that of a human profanes the deity and renounces any claim of infinity of the deity. Then, how could such a deity create something infinite?", "updated" : { "$date" : 1348542181585 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "uuid" : "9E437866" } -{ "id" : "50611f37277b5a0200000022", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Do we have enough perspective to make any claims as to a God?", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Could a peasant, if the Aeneid were read to him, pronounce that\npoem to be absolutely faultless, or even assign to it its proper rank\namong the productions of human wit, he, who had never seen any other\nproduction?", "uuid" : "FE0F5605", "_id" : { "$oid" : "50611f37277b5a0200000022" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 4345, "end" : "/div[1]/div[8]", "endOffset" : 4560, "_id" : { "$oid" : "50611f37277b5a0200000023" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348542263982 }, "created" : { "$date" : 1348542263982 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50611f81277b5a0200000024", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Assuming a creator gives no information about the nature of that creator. Again, we lack the perspective necessary to make those judgements.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "If we survey a ship, what an exalted idea must we form of\nthe ingenuity of the carpenter who framed so complicated, useful, and\nbeautiful a machine? And what surprise must we feel, when we find him a\nstupid mechanic, who imitated others, and copied an art, which, through a\nlong succession of ages, after multiplied trials, mistakes, corrections,\ndeliberations, and controversies, had been gradually improving? Many\nworlds might have been botched and bungled, throughout an eternity, ere\nthis system was struck out; much labour lost, many fruitless trials made;\nand a slow, but continued improvement carried on during infinite ages in\nthe art of world-making. In such subjects, who can determine, where the\ntruth; nay, who can conjecture where the probability lies, amidst a great\nnumber of hypotheses which may be proposed, and a still greater which may\nbe imagined?", "uuid" : "14A51863", "_id" : { "$oid" : "50611f81277b5a0200000024" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 4722, "end" : "/div[1]/div[8]", "endOffset" : 5589, "_id" : { "$oid" : "50611f81277b5a0200000025" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348542337583 }, "created" : { "$date" : 1348542337583 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50611fd759fff30200000015", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "We could not comprehend a creator were there one.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Where we see a body raised in a scale, we are sure that there is in the\nopposite scale, however concealed from sight, some counterpoising weight\nequal to it; but it is still allowed to doubt, whether that weight be an\naggregate of several distinct bodies, or one uniform united mass. And if\nthe weight requisite very much exceeds any thing which we have ever seen\nconjoined in any single body, the former supposition becomes still more\nprobable and natural. An intelligent being of such vast power and\ncapacity as is necessary to produce the universe, or, to speak in the\nlanguage of ancient philosophy, so prodigious an animal exceeds all\nanalogy, and even comprehension.", "uuid" : "A38E20E6", "_id" : { "$oid" : "50611fd759fff30200000015" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 6955, "end" : "/div[1]/div[8]", "endOffset" : 7628, "_id" : { "$oid" : "50611fd759fff30200000016" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348542423063 }, "created" : { "$date" : 1348542423063 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061202459fff30200000017", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "we cannot use rational logic to ascertain the origin of a logical system. Compare to Godel's idea of formal undecidability.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "In a word, CLEANTHES, a man who follows your hypothesis is able perhaps\nto assert, or conjecture, that the universe, sometime, arose from\nsomething like design: but beyond that position he cannot ascertain one\nsingle circumstance; and is left afterwards to fix every point of his\ntheology by the utmost license of fancy and hypothesis.", "uuid" : "07260CA7", "_id" : { "$oid" : "5061202459fff30200000017" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 8387, "end" : "/div[1]/div[8]", "endOffset" : 8722, "_id" : { "$oid" : "5061202459fff30200000018" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348542500279 }, "created" : { "$date" : 1348542500279 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50612174277b5a0200000026", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Hysterics. Essentially, if we ascribe human-like reason to a creator, we open up uncomfortable possibilities which are undecidable. That is madness! For shame!", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "for\naught he knows, is very faulty and imperfect, compared to a superior\nstandard; and was only the first rude essay of some infant deity, who\nafterwards abandoned it, ashamed of his lame performance: it is the work\nonly of some dependent, inferior deity; and is the object of derision to\nhis superiors: it is the production of old age and dotage in some\nsuperannuated deity; and ever since his death, has run on at adventures,\nfrom the first impulse and active force which it received from him. You\njustly give signs of horror, DEMEA, at these strange suppositions; but\nthese, and a thousand more of the same kind, are CLEANTHES's\nsuppositions, not mine. From the moment the attributes of the Deity are\nsupposed finite, all these have place. And I cannot, for my part, think\nthat so wild and unsettled a system of theology is, in any respect,\npreferable to none at all.", "uuid" : "B3324528", "_id" : { "$oid" : "50612174277b5a0200000026" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 8735, "end" : "/div[1]/div[8]", "endOffset" : 9606, "_id" : { "$oid" : "50612174277b5a0200000027" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348542836032 }, "created" : { "$date" : 1348542836032 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061228c59fff30200000019", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "This too is analogy--more of extrapolation.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "But there is another principle of the same kind, no less\ncertain, and derived from the same source of experience; that where\nseveral known circumstances are observed to be similar, the unknown will\nalso be found similar. Thus, if we see the limbs of a human body, we\nconclude that it is also attended with a human head, though hid from us.\nThus, if we see, through a chink in a wall, a small part of the sun, we\nconclude, that, were the wall removed, we should see the whole body. In\nshort, this method of reasoning is so obvious and familiar, that no\nscruple can ever be made with regard to its solidity.", "uuid" : "9DFD045C", "_id" : { "$oid" : "5061228c59fff30200000019" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[9]", "startOffset" : 938, "end" : "/div[1]/div[9]", "endOffset" : 1543, "_id" : { "$oid" : "5061228c59fff3020000001a" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348543116846 }, "created" : { "$date" : 1348543116846 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506122fa277b5a0200000028", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Still thinking a posteriori, but somehow this is a more acceptable (to Philo) form of a posteriori thinking?", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "A continual\ncirculation of matter in it produces no disorder: a continual waste in\nevery part is incessantly repaired: the closest sympathy is perceived\nthroughout the entire system: and each part or member, in performing its\nproper offices, operates both to its own preservation and to that of the\nwhole. The world, therefore, I infer, is an animal; and the Deity is the\nSOUL of the world, actuating it, and actuated by it.", "uuid" : "F5815CF7", "_id" : { "$oid" : "506122fa277b5a0200000028" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[9]", "startOffset" : 1738, "end" : "/div[1]/div[9]", "endOffset" : 2164, "_id" : { "$oid" : "506122fa277b5a0200000029" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348543226346 }, "created" : { "$date" : 1348543226346 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061238959fff3020000001b", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Now we are separating the idea of ordered physical systems from an ordered design process. Philo points out the inability to reconcile a rejection of this separation with a belief in the inadequacy of human thought to understand creation.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "But the vulgar prejudice, that body and mind ought always\nto accompany each other, ought not, one should think, to be entirely\nneglected; since it is founded on vulgar experience, the only guide which\nyou profess to follow in all these theological inquiries. And if you\nassert, that our limited experience is an unequal standard, by which to\njudge of the unlimited extent of nature; you entirely abandon your own\nhypothesis, and must thenceforward adopt our Mysticism, as you call it,\nand admit of the absolute incomprehensibility of the Divine Nature.", "uuid" : "DF0C5DBD", "_id" : { "$oid" : "5061238959fff3020000001b" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[9]", "startOffset" : 4145, "end" : "/div[1]/div[9]", "endOffset" : 4697, "_id" : { "$oid" : "5061238959fff3020000001c" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348543369731 }, "created" : { "$date" : 1348543369731 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061242059fff3020000001d", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Again, an undecidable proposition. If we strictly adhere to this analogy, we find a similarity (to a vegetable) that we don't know what to do with.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Why then, replied CLEANTHES, it seems to me, that, though the world does,\nin many circumstances, resemble an animal body; yet is the analogy also\ndefective in many circumstances the most material: no organs of sense; no\nseat of thought or reason; no one precise origin of motion and action. In\nshort, it seems to bear a stronger resemblance to a vegetable than to an\nanimal, and your inference would be so far inconclusive in favour of the\nsoul of the world.", "uuid" : "F450B700", "_id" : { "$oid" : "5061242059fff3020000001d" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[9]", "startOffset" : 5170, "end" : "/div[1]/div[9]", "endOffset" : 5629, "_id" : { "$oid" : "5061242059fff3020000001e" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348543520359 }, "created" : { "$date" : 1348543520359 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061250259fff3020000001f", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "A young earth--perhaps a developing earth? Philo points out examples of development, though in a global social context.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "All these seem convincing proofs of the\nyouth, or rather infancy, of the world; as being founded on the operation\nof principles more constant and steady than those by which human society\nis governed and directed.", "uuid" : "AD8C932D", "_id" : { "$oid" : "5061250259fff3020000001f" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[9]", "startOffset" : 8661, "end" : "/div[1]/div[9]", "endOffset" : 8873, "_id" : { "$oid" : "5061250259fff30200000020" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348543746434 }, "created" : { "$date" : 1348543746434 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50613d4559fff30200000021", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Philo argues that if Cleanthes is looking at effect to come up with a cause, the idea of an \"infinite\" deity would not match at all because there was no natural proof of an infinite universe.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "First, By this method of reasoning, you renounce all claim\nto infinity in any of the attributes of the Deity.", "uuid" : "D0818BA7", "_id" : { "$oid" : "50613d4559fff30200000021" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [ "holjose@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 2946, "end" : "/div[1]/div[8]", "endOffset" : 3057, "_id" : { "$oid" : "50613d4559fff30200000022" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348549957733 }, "created" : { "$date" : 1348549957733 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50613d9959fff30200000023", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Why do we consider what we have perfection? it's possible that there could be something much better that humans just do not know about. There is a good chance that God is not perfect either.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "it is impossible for us to tell, from our limited\nviews, whether this system contains any great faults, or deserves any\nconsiderable praise, if compared to other possible, and even real\nsystems.", "uuid" : "15DA64A9", "_id" : { "$oid" : "50613d9959fff30200000023" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [ "holjose@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 4150, "end" : "/div[1]/div[8]", "endOffset" : 4344, "_id" : { "$oid" : "50613d9959fff30200000024" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348550041431 }, "created" : { "$date" : 1348550041431 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50613fa4277b5a020000002a", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Philo is suggesting that to further build on the finding a cause for an observed effect, it would be logical to assume that the world is a product of another world's reproduction. He does not seem to seriously believe this, but it serves to show that there really is no evidence of any of this and there is no reason that a more common explanation should be considered truth because there is no proof yet.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Very easily, replied PHILO. In like manner as a tree sheds its seed into\nthe neighbouring fields, and produces other trees; so the great\nvegetable, the world, or this planetary system, produces within itself\ncertain seeds, which, being scattered into the surrounding chaos,\nvegetate into new worlds. A comet, for instance, is the seed of a world;\nand after it has been fully ripened, by passing from sun to sun, and star\nto star, it is at last tossed into the unformed elements which every\nwhere surround this universe, and immediately sprouts up into a new\nsystem.", "uuid" : "1AF261C1", "_id" : { "$oid" : "50613fa4277b5a020000002a" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [ "holjose@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 2280, "end" : "/div[1]/div[10]", "endOffset" : 2846, "_id" : { "$oid" : "50613fa4277b5a020000002b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348550564151 }, "created" : { "$date" : 1348550564151 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061bbb6b4b40a0200000002", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "text" : "an almighty being would be able to stop any accident from happening because if you model everything well enough nothing appears to happen by chance.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "There are many\ninexplicable difficulties in the works of Nature, which, if we allow a\nperfect author to be proved a priori, are easily solved, and become only\nseeming difficulties, from the narrow capacity of man, who cannot trace\ninfinite relations.", "uuid" : "D1B6C6E7", "_id" : { "$oid" : "5061bbb6b4b40a0200000002" }, "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [ "jpaggi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 3691, "end" : "/div[1]/div[8]", "endOffset" : 3941, "_id" : { "$oid" : "5061bbb6b4b40a0200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348582326848 }, "created" : { "$date" : 1348582326848 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5061bd14b4b40a0200000004" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348582676927 }, "groups" : [ "21L.448J" ], "id" : "5061bd14b4b40a0200000004", "permissions" : { "admin" : [ "jpaggi@mit.edu" ], "delete" : [ "jpaggi@mit.edu" ], "read" : [], "update" : [ "jpaggi@mit.edu" ] }, "quote" : "At least, you must\nacknowledge, that it is impossible for us to tell, from our limited\nviews, whether this system contains any great faults, or deserves any\nconsiderable praise, if compared to other possible, and even real\nsystems. Could a peasant, if the Aeneid were read to him, pronounce that\npoem to be absolutely faultless, or even assign to it its proper rank\namong the productions of human wit, he, who had never seen any other\nproduction?", "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 4113, "end" : "/div[1]/div[8]", "endOffset" : 4560, "_id" : { "$oid" : "5061bd14b4b40a0200000005" } } ], "tags" : [], "text" : "Our world does have many problems: poverty, natural disaster, death. But would a \"perfect world\" be better. I think it would be very boring, not that I find pleasure in misfortune. But if you woke up everyday knowing your day would go perfectly what would you have to strive for.", "updated" : { "$date" : 1348582926082 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "uuid" : "37E2219C" } -{ "id" : "5061bdf759fff30200000025", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "text" : "insinuation that humans and the world might be inherently evil ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "vicious creatures as man, can yet often unite in framing\nand executing one plan, how much more those deities or demons,", "uuid" : "C30C07B4", "_id" : { "$oid" : "5061bdf759fff30200000025" }, "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [ "jpaggi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 6227, "end" : "/div[1]/div[8]", "endOffset" : 6346, "_id" : { "$oid" : "5061bdf759fff30200000026" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348582903004 }, "created" : { "$date" : 1348582903004 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061be7359fff30200000027", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "Mankind's increased capabilities since antiquity have only served to further accentuate the gap between human understanding and the natural world. ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "If this argument, I say, had any force in former ages, how much greater\nmust it have at present, when the bounds of Nature are so infinitely\nenlarged, and such a magnificent scene is opened to us? It is still more\nunreasonable to form our idea of so unlimited a cause from our experience\nof the narrow productions of human design and invention.", "uuid" : "C949010C", "_id" : { "$oid" : "5061be7359fff30200000027" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [ "chom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 1775, "end" : "/div[1]/div[8]", "endOffset" : 2120, "_id" : { "$oid" : "5061be7359fff30200000028" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348583027911 }, "created" : { "$date" : 1348583027911 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061c02359fff30200000029", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "The ever-believing CLEANTHES misread's Philo's willingness to entertain the possibility of intelligent design as the long-winded concession of a skeptic. What he seems to have missed was that PHILO's point was that the notion of a creator is orthogonal to contemplating the true nature of reality, and more pertinently the idea of creator does not in anyway necessitate the existence of a sublime perfection or divine existence- just the existence of some creator or creators, somewhere. ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "These suppositions I absolutely disown, cried CLEANTHES: they strike me,\nhowever, with no horror, especially when proposed in that rambling way in\nwhich they drop from you. On the contrary, they give me pleasure, when I\nsee, that, by the utmost indulgence of your imagination, you never get\nrid of the hypothesis of design in the universe, but are obliged at every\nturn to have recourse to it. To this concession I adhere steadily; and\nthis I regard as a sufficient foundation for religion.", "uuid" : "DC874540", "_id" : { "$oid" : "5061c02359fff30200000029" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [ "chom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 9607, "end" : "/div[1]/div[8]", "endOffset" : 10098, "_id" : { "$oid" : "5061c02359fff3020000002a" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348583459344 }, "created" : { "$date" : 1348583459344 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061c08db4b40a0200000007", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "text" : "We really wouldnt have any way of knowing. After the big bang, there hasnt really been anything that has happened that science cannot at least hope to explain. But who is to say that gods presence isnt needed always and everywhere to keep the universe in check. In addition to creating the laws of physics he could also be the one enforcing them", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "This world, for\naught he knows, is very faulty and imperfect, compared to a superior\nstandard; and was only the first rude essay of some infant deity, who\nafterwards abandoned it, ashamed of his lame performance", "uuid" : "77A1C845", "_id" : { "$oid" : "5061c08db4b40a0200000007" }, "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 8723, "end" : "/div[1]/div[8]", "endOffset" : 8934, "_id" : { "$oid" : "5061c08db4b40a0200000008" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348583565443 }, "created" : { "$date" : 1348583565443 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061c0c8b4b40a0200000009", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "And I cannot, for my part, think\nthat so wild and unsettled a system of theology is, in any respect,\npreferable to none at all.", "uuid" : "CB7EDFBB", "_id" : { "$oid" : "5061c0c8b4b40a0200000009" }, "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [ "jpaggi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 9478, "end" : "/div[1]/div[8]", "endOffset" : 9605, "_id" : { "$oid" : "5061c0c8b4b40a020000000a" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348583624849 }, "created" : { "$date" : 1348583624849 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061c1a7b4b40a020000000b", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "text" : "Cleanthes has a point Demea was never able to disprove the existence of a designer. Even if this designer isnt perfect and all powerful like most religions preach, they are clearly still far superior to humans. ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "On the contrary, they give me pleasure, when I\nsee, that, by the utmost indulgence of your imagination, you never get\nrid of the hypothesis of design in the universe, but are obliged at every\nturn to have recourse to it. To this concession I adhere steadily; and\nthis I regard as a sufficient foundation for religion.", "uuid" : "81691FB2", "_id" : { "$oid" : "5061c1a7b4b40a020000000b" }, "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [ "jpaggi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 9780, "end" : "/div[1]/div[8]", "endOffset" : 10098, "_id" : { "$oid" : "5061c1a7b4b40a020000000c" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348583847614 }, "created" : { "$date" : 1348583847614 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061c287b4b40a020000000d", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "text" : "Humans generally rely on religion to explain the unexplainable most notably what happens after death. I would hypothesis that a religion that makes no mention of the afterlife could never become widely practiced", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "What devotion or\nworship address to them? What veneration or obedience pay them? To all\nthe purposes of life the theory of religion becomes altogether useless:\nand even with regard to speculative consequences, its uncertainty,\naccording to you, must render it totally precarious and unsatisfactory.", "uuid" : "7CE93ACB", "_id" : { "$oid" : "5061c287b4b40a020000000d" }, "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[9]", "startOffset" : 342, "end" : "/div[1]/div[9]", "endOffset" : 641, "_id" : { "$oid" : "5061c287b4b40a020000000e" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348584071504 }, "created" : { "$date" : 1348584071504 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061c32159fff3020000002b", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "text" : "this theory is very compatible with modern science", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "If the universe bears a\ngreater likeness to animal bodies and to vegetables, than to the works of\nhuman art, it is more probable that its cause resembles the cause of the\nformer than that of the latter, and its origin ought rather to be\nascribed to generation or vegetation, than to reason or design.", "uuid" : "7D757D15", "_id" : { "$oid" : "5061c32159fff3020000002b" }, "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 281, "end" : "/div[1]/div[10]", "endOffset" : 581, "_id" : { "$oid" : "5061c32159fff3020000002c" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348584225265 }, "created" : { "$date" : 1348584225265 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5061c49759fff3020000002d" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348584599434 }, "groups" : [ "21L.448J" ], "id" : "5061c49759fff3020000002d", "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [ "chom@mit.edu" ] }, "quote" : "Here is a species of cosmogony, which\nappears to us ridiculous; because a spider is a little contemptible\nanimal, whose operations we are never likely to take for a model of the\nwhole universe. But still here is a new species of analogy, even in our\nglobe. And were there a planet wholly inhabited by spiders, (which is\nvery possible,) this inference would there appear as natural and\nirrefragable as that which in our planet ascribes the origin of all\nthings to design and intelligence, as explained by CLEANTHES. Why an\norderly system may not be spun from the belly as well as from the brain,\nit will be difficult for him to give a satisfactory reason.", "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 10660, "end" : "/div[1]/div[10]", "endOffset" : 11315, "_id" : { "$oid" : "5061c49759fff3020000002e" } } ], "tags" : [], "text" : "Philo has been pointing out how easy it is to draw analogies between such a diverse set of examples and the workings of the universe. Here, though, he takes it a step further and suggests the \"allegorical malleability\" of the \"origin of the universe\" topic may incite contemplating minds to use the topic as a funny house mirror, squinting and staring into it, making what they please of the shapes.", "updated" : { "$date" : 1348584663065 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "chom@mit.edu", "username" : "Colin H.", "uuid" : "3AE686BC" } -{ "id" : "5061c65e59fff3020000002f", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "Knowledge of the designer does tell us about the source of order which gave rise to the designer. PHILO has found the dinosaur in this chicken or the egg argument.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "To say, that all this order in animals and\nvegetables proceeds ultimately from design, is begging the question; nor\ncan that great point be ascertained otherwise than by proving, a priori,\nboth that order is, from its nature, inseparably attached to thought; and\nthat it can never of itself, or from original unknown principles, belong\nto matter.", "uuid" : "74F85C39", "_id" : { "$oid" : "5061c65e59fff3020000002f" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [ "chom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 7407, "end" : "/div[1]/div[10]", "endOffset" : 7754, "_id" : { "$oid" : "5061c65e59fff30200000030" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348585054675 }, "created" : { "$date" : 1348585054675 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061c962b4b40a020000000f", "user" : "chom@mit.edu", "username" : "Colin H.", "text" : "DEMEA's argument for a benevolent creator and higher reality rests on the uniform wretchedness of the one which humans exist.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Were a stranger to drop on a sudden into this world, I would show him, as\na specimen of its ills, a hospital full of diseases, a prison crowded\nwith malefactors and debtors, a field of battle strewed with carcasses, a\nfleet foundering in the ocean, a nation languishing under tyranny,\nfamine, or pestilence. To turn the gay side of life to him, and give him\na notion of its pleasures; whither should I conduct him? to a ball, to an\nopera, to court? He might justly think, that I was only showing him a\ndiversity of distress and sorrow.", "uuid" : "706C4BD7", "_id" : { "$oid" : "5061c962b4b40a020000000f" }, "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [ "chom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[13]", "startOffset" : 7833, "end" : "/div[1]/div[13]", "endOffset" : 8369, "_id" : { "$oid" : "5061c962b4b40a0200000010" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348585826658 }, "created" : { "$date" : 1348585826658 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5061c9f0b4b40a0200000011" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348585968322 }, "groups" : [ "21L.448J" ], "id" : "5061c9f0b4b40a0200000011", "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [ "chom@mit.edu" ] }, "quote" : "EPICURUS's old questions are yet unanswered. Is he willing to prevent evil,\nbut not able? then is he impotent. Is he able, but not willing? then is he\nmalevolent. Is he both able and willing? whence then is evil?", "ranges" : [ { "start" : "/div[1]/div[13]", "startOffset" : 12543, "end" : "/div[1]/div[13]", "endOffset" : 12755, "_id" : { "$oid" : "5061c9f0b4b40a0200000012" } } ], "tags" : [], "text" : "Ahh, the old if He can he must not care, and if He can't then he's not a GOD. While PHILO's argument is convincing at a gut level, I still find the argument of pareto-optimality compelling as well. Look at what it takes to get in competition shape- crappy food, torturous workouts, early mornings and muscle aches. Progress in this world has little to due with happiness, smiling or recreation, unfortunately. ", "updated" : { "$date" : 1348586014801 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "chom@mit.edu", "username" : "Colin H.", "uuid" : "637404E4" } -{ "__v" : 0, "_id" : { "$oid" : "5061cb35b4b40a0200000013" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348586293819 }, "groups" : [ "21L.448J" ], "id" : "5061cb35b4b40a0200000013", "permissions" : { "delete" : [ "chom@mit.edu" ], "update" : [ "chom@mit.edu" ], "admin" : [ "chom@mit.edu" ], "read" : [ "chom@mit.edu" ] }, "quote" : "that they are endowed with perfect goodness; that they have\nperfect malice; that they are opposite, and have both goodness and\nmalice; that they have neither goodness nor malice. Mixed phenomena can\nnever prove the two former unmixed principles; and the uniformity and\nsteadiness of general laws seem to oppose the third. The fourth,\ntherefore, seems by far the most probable.", "ranges" : [ { "start" : "/div[1]/div[14]", "startOffset" : 21304, "end" : "/div[1]/div[14]", "endOffset" : 21681, "_id" : { "$oid" : "5061cb35b4b40a0200000014" } } ], "tags" : [], "text" : "I find PHILO's whole spiel in this chapter unfounded for two reasons. 1) He seems to take for granted that human have, from our worldy and flesh-bound vantage points, the ability to accurately assess the morality of an otherwise similar but omnipotent being who is responsible for the entirety of the universe by observing the minutia of his actions over the course of days, months or years. Taking such a statement for granted sounds a little presumptuous, and also a convenient way for PHILO to segway in to the morally neutral argument. 2) PHILO never considers the energy and interplay and novel information brought on by the nature and progression of the human condition in the natural world as a tangible by-product from the perspective of a greater power.... he (and the rest of the crew) contemplate ideas centered around happiness, morality and the physicality of human life when discussing the motives of GOD. Any discussion of a purpose seems to fall out of concepts in this realm, which annoys me. I guess the idea of the universe and all it's inhabitants providing the computational fodder for a giant tabulating device was a little beyond the scope of existing technology. A human-built machine with billions upon billions of discrete computational nodes was at the time as fanciful as CLEANTHE's voice from the sky, if not more.", "updated" : { "$date" : 1348586844589 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "chom@mit.edu", "username" : "Colin H.", "uuid" : "D3AF9858" } -{ "id" : "5061e37cb4b40a0200000019", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "PHILO argues that nature is not perfect and that humans are not capable of pointing out or noticing all these imperfections", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "At least, you must\nacknowledge, that it is impossible for us to tell, from our limited\nviews, whether this system contains any great faults, or deserves any\nconsiderable praise, if compared to other possible, and even real\nsystems.", "uuid" : "6B1AC0F4", "_id" : { "$oid" : "5061e37cb4b40a0200000019" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 4113, "end" : "/div[1]/div[8]", "endOffset" : 4344, "_id" : { "$oid" : "5061e37cb4b40a020000001a" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348592508208 }, "created" : { "$date" : 1348592508208 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061e3b2b4b40a020000001b", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "There is no way for us to know what perfect would be since we cannot experience everything. We can make comparisons between things, for example, this animal is better than that animal at so and so", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Could a peasant, if the Aeneid were read to him, pronounce that\npoem to be absolutely faultless, or even assign to it its proper rank\namong the productions of human wit, he, who had never seen any other\nproduction?", "uuid" : "9B303B3D", "_id" : { "$oid" : "5061e3b2b4b40a020000001b" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 4345, "end" : "/div[1]/div[8]", "endOffset" : 4559, "_id" : { "$oid" : "5061e3b2b4b40a020000001c" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348592562788 }, "created" : { "$date" : 1348592562788 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061e40359fff30200000031", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Things did not just appear as they are today, they were developed over time. It makes sense that something similar could have happened with animals (Darwin's theory of natural selection)", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "If we survey a ship, what an exalted idea must we form of\nthe ingenuity of the carpenter who framed so complicated, useful, and\nbeautiful a machine? And what surprise must we feel, when we find him a\nstupid mechanic, who imitated others, and copied an art, which, through a\nlong succession of ages, after multiplied trials, mistakes, corrections,\ndeliberations, and controversies, had been gradually improving?", "uuid" : "97E02BA4", "_id" : { "$oid" : "5061e40359fff30200000031" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 4722, "end" : "/div[1]/div[8]", "endOffset" : 5132, "_id" : { "$oid" : "5061e40359fff30200000032" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348592643236 }, "created" : { "$date" : 1348592643236 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061e44559fff30200000033", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "The world could have come about as the result of multiple \"forces\" working together, not necessarily the work of a single deity", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "to prove the unity of the Deity? A great number of men\njoin in building a house or ship, in rearing a city, in framing a\ncommonwealth; why may not several deities combine in contriving and\nframing a world? This is only so much greater similarity to human\naffairs.", "uuid" : "54CDF354", "_id" : { "$oid" : "5061e44559fff30200000033" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 5678, "end" : "/div[1]/div[8]", "endOffset" : 5942, "_id" : { "$oid" : "5061e44559fff30200000034" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348592709267 }, "created" : { "$date" : 1348592709267 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061ef2f59fff30200000035", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Since reproduction is the driving force behind all life in our world, it makes sense that it is something that would be required of deities as well", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Why must this\ncircumstance, so universal, so essential, be excluded from those numerous\nand limited deities?", "uuid" : "3A8CCC94", "_id" : { "$oid" : "5061ef2f59fff30200000035" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 7824, "end" : "/div[1]/div[8]", "endOffset" : 7932, "_id" : { "$oid" : "5061ef2f59fff30200000036" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348595503107 }, "created" : { "$date" : 1348595503107 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061f1e2b4b40a020000001d", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Def: having a body", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "corporeal", "uuid" : "89D194FC", "_id" : { "$oid" : "5061f1e2b4b40a020000001d" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 8089, "end" : "/div[1]/div[8]", "endOffset" : 8098, "_id" : { "$oid" : "5061f1e2b4b40a020000001e" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348596194495 }, "created" : { "$date" : 1348596194495 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061f22cb4b40a020000001f", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "It is clear the universe arose from something, but it is impossible to say what it came from.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "In a word, CLEANTHES, a man who follows your hypothesis is able perhaps\nto assert, or conjecture, that the universe, sometime, arose from\nsomething like design: but beyond that position he cannot ascertain one\nsingle circumstance; and is left afterwards to fix every point of his\ntheology by the utmost license of fancy and hypothesis.", "uuid" : "77CEDE5D", "_id" : { "$oid" : "5061f22cb4b40a020000001f" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 8387, "end" : "/div[1]/div[8]", "endOffset" : 8723, "_id" : { "$oid" : "5061f22cb4b40a0200000020" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348596268604 }, "created" : { "$date" : 1348596268604 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061f2acb4b40a0200000021", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "CLEANTHES clings to his belief that the indications that the world was designed by some \"force\" as the basis for religion", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "To this concession I adhere steadily; and\nthis I regard as a sufficient foundation for religion.", "uuid" : "05EBE63B", "_id" : { "$oid" : "5061f2acb4b40a0200000021" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 10001, "end" : "/div[1]/div[8]", "endOffset" : 10098, "_id" : { "$oid" : "5061f2acb4b40a0200000022" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348596396847 }, "created" : { "$date" : 1348596396847 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061f400b4b40a0200000023", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "CLEANTHES believes that the only way for us to know something is to experience. Yet we cannot/have not experienced a Deity. But he argues that out cities and so on are the result of human design, so it follows that the world must be the result of some high Deity's design. However this is not an accurate assumption because man made cities are not naturally of the Earth, whereas animals and vegetables are. In order to get a good picture of where our world came from, we need to look at the animals and vegetables. --> Generation and vegetation. Therefore we can infer that our world came about as a result of generations of change, rather than a \"perfect\" design", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "The cause, therefore, of the world, we may infer to be\nsomething similar or analogous to generation or vegetation.", "uuid" : "95C50043", "_id" : { "$oid" : "5061f400b4b40a0200000023" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 2047, "end" : "/div[1]/div[10]", "endOffset" : 2161, "_id" : { "$oid" : "5061f400b4b40a0200000024" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348596736463 }, "created" : { "$date" : 1348596736463 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061f44cb4b40a0200000025", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Kind of saying that the planets reproduced to form other planets. The idea they are trying to get across is that things happened gradually and generationally ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Very easily, replied PHILO. In like manner as a tree sheds its seed into\nthe neighbouring fields, and produces other trees; so the great\nvegetable, the world, or this planetary system, produces within itself\ncertain seeds, which, being scattered into the surrounding chaos,\nvegetate into new worlds. A comet, for instance, is the seed of a world;\nand after it has been fully ripened, by passing from sun to sun, and star\nto star, it is at last tossed into the unformed elements which every\nwhere surround this universe, and immediately sprouts up into a new\nsystem.", "uuid" : "EAF420B5", "_id" : { "$oid" : "5061f44cb4b40a0200000025" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 2280, "end" : "/div[1]/div[10]", "endOffset" : 2845, "_id" : { "$oid" : "5061f44cb4b40a0200000026" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348596812230 }, "created" : { "$date" : 1348596812230 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061f4a959fff30200000037", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Humans cannot begin to understand the origin of the world, but this is the closest we can get. It makes more sense to look at nature than at art", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "I have still asserted, that we have no data to establish any system of\ncosmogony. Our experience, so imperfect in itself, and so limited both in\nextent and duration, can afford us no probable conjecture concerning the\nwhole of things. But if we must needs fix on some hypothesis; by what\nrule, pray, ought we to determine our choice? Is there any other rule\nthan the greater similarity of the objects compared? And does not a plant\nor an animal, which springs from vegetation or generation, bear a\nstronger resemblance to the world, than does any artificial machine,\nwhich arises from reason and design?", "uuid" : "EB4D0D6D", "_id" : { "$oid" : "5061f4a959fff30200000037" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 3584, "end" : "/div[1]/div[10]", "endOffset" : 4187, "_id" : { "$oid" : "5061f4a959fff30200000038" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348596905202 }, "created" : { "$date" : 1348596905202 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061f5d359fff30200000039", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "CLEANTHES: there is only so much that humans can understand. Beyond this point we will not be able to explain phenomena", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "\"We must\nstop somewhere\", says he; \"nor is it ever within the reach of human\ncapacity to explain ultimate causes, or show the last connections of any\nobjects. It is sufficient, if any steps, so far as we go, are supported\nby experience and observation.\"", "uuid" : "C6C523B5", "_id" : { "$oid" : "5061f5d359fff30200000039" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 8176, "end" : "/div[1]/div[10]", "endOffset" : 8429, "_id" : { "$oid" : "5061f5d359fff3020000003a" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348597203513 }, "created" : { "$date" : 1348597203513 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061f618b4b40a0200000027", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "PHILO: The world is an animal and has developed in the way that animals do, through generations of change and adaptation", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Compare, I beseech you, the consequences on both sides. The world, say I,\nresembles an animal; therefore it is an animal, therefore it arose from\ngeneration. The steps, I confess, are wide; yet there is some small\nappearance of analogy in each step.", "uuid" : "1581AF4D", "_id" : { "$oid" : "5061f618b4b40a0200000027" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 9177, "end" : "/div[1]/div[10]", "endOffset" : 9426, "_id" : { "$oid" : "5061f618b4b40a0200000028" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348597272712 }, "created" : { "$date" : 1348597272712 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5061f64759fff3020000003b", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "CLEANTHES: The world is a machine and therefore had to be designed and built by someone", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "The world, says CLEANTHES, resembles\na machine; therefore it is a machine, therefore it arose from design. The\nsteps are here equally wide, and the analogy less striking.", "uuid" : "B6E1235B", "_id" : { "$oid" : "5061f64759fff3020000003b" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 9427, "end" : "/div[1]/div[10]", "endOffset" : 9597, "_id" : { "$oid" : "5061f64759fff3020000003c" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348597319490 }, "created" : { "$date" : 1348597319490 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5062165eb4b40a020000002b", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "In the Christian creation, God did make mistakes and kills off the entire world save one ship. I think it is interesting that here he tries to argue that God isn't perfect, because the Bible argues that people use the free will given to them and mess themselves up. I think it is a good point either way, and one that would resound with all philosophers present.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "multiplied trials, mistakes, corrections,\ndeliberations, and controversies, had been gradually improving?", "uuid" : "D906A1A9", "_id" : { "$oid" : "5062165eb4b40a020000002b" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 5027, "end" : "/div[1]/div[8]", "endOffset" : 5132, "_id" : { "$oid" : "5062165eb4b40a020000002c" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348605534278 }, "created" : { "$date" : 1348605534278 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506217abb4b40a020000002f", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "I think this serves well as an argument against one perfect deity, but as Cleanthes points out we are back to there being a creator.. It also reminds me of Candide and how he Pangloss determined that everything had to be the best because it was made that way. How many times have you tried to make something and had it come out perfectly the first time?", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "first rude essay of some infant deity, who\nafterwards abandoned it", "uuid" : "294D1004", "_id" : { "$oid" : "506217abb4b40a020000002f" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 8835, "end" : "/div[1]/div[8]", "endOffset" : 8901, "_id" : { "$oid" : "506217abb4b40a0200000030" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348605867848 }, "created" : { "$date" : 1348605867848 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506218b159fff3020000003f", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "I don't know that this is obvious to me. ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "The world plainly resembles more an animal or a vegetable, than it does a\nwatch or a knitting-loom.", "uuid" : "A1FA0DD9", "_id" : { "$oid" : "506218b159fff3020000003f" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 1815, "end" : "/div[1]/div[10]", "endOffset" : 1915, "_id" : { "$oid" : "506218b159fff30200000040" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348606129991 }, "created" : { "$date" : 1348606129991 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50621932b4b40a0200000031", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "I think that this is meant to be comical. He is trying to use Cleanthes reasoning to infer something that no one believes to be true. Then he would create doubt in cleanthes previous conclusion.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "so the great\nvegetable, the world, or this planetary system, produces within itself\ncertain seeds, which, being scattered into the surrounding chaos,\nvegetate into new worlds", "uuid" : "9C64F340", "_id" : { "$oid" : "50621932b4b40a0200000031" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 2404, "end" : "/div[1]/div[10]", "endOffset" : 2578, "_id" : { "$oid" : "50621932b4b40a0200000032" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348606258035 }, "created" : { "$date" : 1348606258035 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50621994b4b40a0200000033", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "and my previous comment is affirmed", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "eplied PHILO, as CLEANTHES can explain the operations\nof reason", "uuid" : "123A0212", "_id" : { "$oid" : "50621994b4b40a0200000033" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 4383, "end" : "/div[1]/div[10]", "endOffset" : 4446, "_id" : { "$oid" : "50621994b4b40a0200000034" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348606356376 }, "created" : { "$date" : 1348606356376 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50621c3a59fff30200000042", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "this is hume's real question", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "But, in treating of this obvious and\nimportant truth, what obscure questions occur concerning the nature of\nthat Divine Being, his attributes, his decrees, his plan of providence?", "uuid" : "7A4BBB87", "_id" : { "$oid" : "50621c3a59fff30200000042" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 3086, "end" : "/div[1]/div[3]", "endOffset" : 3265, "_id" : { "$oid" : "50621c3a59fff30200000043" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348607034145 }, "created" : { "$date" : 1348607034145 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50621efdb4b40a0200000036", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "accurate philosophical?", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "CLEANTHES", "uuid" : "03131DA7", "_id" : { "$oid" : "50621efdb4b40a0200000036" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 4235, "end" : "/div[1]/div[3]", "endOffset" : 4244, "_id" : { "$oid" : "50621efdb4b40a0200000037" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348607741577 }, "created" : { "$date" : 1348607741577 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50621f0859fff30200000044", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "\"careless\"", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "PHILO", "uuid" : "95324AB7", "_id" : { "$oid" : "50621f0859fff30200000044" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 4275, "end" : "/div[1]/div[3]", "endOffset" : 4280, "_id" : { "$oid" : "50621f0859fff30200000045" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348607752638 }, "created" : { "$date" : 1348607752638 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50621f1859fff30200000046", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "\"inflexible\"", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "rigid inflexible orthodoxy", "uuid" : "B89D4653", "_id" : { "$oid" : "50621f1859fff30200000046" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 4332, "end" : "/div[1]/div[3]", "endOffset" : 4358, "_id" : { "$oid" : "50621f1859fff30200000047" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348607768753 }, "created" : { "$date" : 1348607768753 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50621f4359fff30200000048", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Cleanthes is the host", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "CLEANTHES's library", "uuid" : "76C8E43C", "_id" : { "$oid" : "50621f4359fff30200000048" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 64, "end" : "/div[1]/div[4]", "endOffset" : 83, "_id" : { "$oid" : "50621f4359fff30200000049" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348607811588 }, "created" : { "$date" : 1348607811588 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506220bab4b40a0200000038", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "weakness of Demea's Philosophy: what if the established doctrine is faulty? then there is no hope for correction", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "which may lead them to reject the\nmost established doctrines and opinions.", "uuid" : "03A4DE17", "_id" : { "$oid" : "506220bab4b40a0200000038" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 2313, "end" : "/div[1]/div[4]", "endOffset" : 2388, "_id" : { "$oid" : "506220bab4b40a0200000039" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348608186345 }, "created" : { "$date" : 1348608186345 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5062223b59fff3020000004a", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Cleanthes believes that philo's doubts can be overcome by observing nature?", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "CLEANTHES's\nfeatures, I could distinguish an air of finesse; as if he perceived some\nraillery or artificial malice in the reasonings of PHILO.", "uuid" : "CE536666", "_id" : { "$oid" : "5062223b59fff3020000004a" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 5059, "end" : "/div[1]/div[4]", "endOffset" : 5202, "_id" : { "$oid" : "5062223b59fff3020000004b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348608571750 }, "created" : { "$date" : 1348608571750 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506224a8b4b40a020000003a", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "skeptism is not possible to hold to in the long term", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "", "uuid" : "4A8773B1", "_id" : { "$oid" : "506224a8b4b40a020000003a" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 7293, "end" : "/div[1]/div[4]", "endOffset" : 7294, "_id" : { "$oid" : "506224a8b4b40a020000003b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348609192284 }, "created" : { "$date" : 1348609192284 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506225bcb4b40a020000003c", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Philo: skepticism can be maintained because the more you practice it, the more you believe it. positive feedback", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "", "uuid" : "3C460657", "_id" : { "$oid" : "506225bcb4b40a020000003c" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 10887, "end" : "/div[1]/div[4]", "endOffset" : 10888, "_id" : { "$oid" : "506225bcb4b40a020000003d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348609468530 }, "created" : { "$date" : 1348609468530 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506226aeb4b40a020000003e", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "philo: we have no reason to be skeptic in everyday life because we are familiar with everyday life. we are not familiar with the true world of religion, so we must remain skeptical", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "", "uuid" : "9A0E8369", "_id" : { "$oid" : "506226aeb4b40a020000003e" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 12557, "end" : "/div[1]/div[4]", "endOffset" : 12558, "_id" : { "$oid" : "506226aeb4b40a020000003f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348609710415 }, "created" : { "$date" : 1348609710415 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50622872b4b40a0200000040", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Humans make conjectures by observations in every field. Why do skeptics reject conjectures in the religious realm?", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "", "uuid" : "CDA36BDA", "_id" : { "$oid" : "50622872b4b40a0200000040" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 16210, "end" : "/div[1]/div[4]", "endOffset" : 16211, "_id" : { "$oid" : "50622872b4b40a0200000041" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348610162595 }, "created" : { "$date" : 1348610162595 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50622ae659fff3020000004d", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Many aspects of science appear even more out-of-reach than religion does. Why do skeptics accept scientific discoveries but reject theology?", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "", "uuid" : "700C7D9F", "_id" : { "$oid" : "50622ae659fff3020000004d" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 18433, "end" : "/div[1]/div[4]", "endOffset" : 18434, "_id" : { "$oid" : "50622ae659fff3020000004e" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348610790201 }, "created" : { "$date" : 1348610790201 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50622c1359fff3020000004f", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "The food chain is set up so everything is in a sort of check and balance system.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Observe too, says PHILO, the curious artifices of Nature, in order to\nembitter the life of every living being. The stronger prey upon the\nweaker, and keep them in perpetual terror and anxiety. The weaker too, in\ntheir turn, often prey upon the stronger, and vex and molest them without\nrelaxation. Consider that innumerable race of insects, which either are\nbred on the body of each animal, or, flying about, infix their stings in\nhim. These insects have others still less than themselves, which torment\nthem. And thus on each hand, before and behind, above and below, every\nanimal is surrounded with enemies, which incessantly seek his misery and\ndestruction.", "uuid" : "8E5992B3", "_id" : { "$oid" : "50622c1359fff3020000004f" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[13]", "startOffset" : 4032, "end" : "/div[1]/div[13]", "endOffset" : 4692, "_id" : { "$oid" : "50622c1359fff30200000050" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348611091833 }, "created" : { "$date" : 1348611091833 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50622c4f59fff30200000051", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "It seems as if man is the top of the food chain, but we have created our own enemies: worry, superstition and so on. This effectively keeps us in check", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "On the contrary, it is here chiefly, cried PHILO, that the uniform and\nequal maxims of Nature are most apparent. Man, it is true, can, by\ncombination, surmount all his real enemies, and become master of the\nwhole animal creation: but does he not immediately raise up to himself\nimaginary enemies, the demons of his fancy, who haunt him with\nsuperstitious terrors, and blast every enjoyment of life? His pleasure,\nas he imagines, becomes, in their eyes, a crime: his food and repose give\nthem umbrage and offence: his very sleep and dreams furnish new materials\nto anxious fear: and even death, his refuge from every other ill,\npresents only the dread of endless and innumerable woes. Nor does the\nwolf molest more the timid flock, than superstition does the anxious\nbreast of wretched mortals.", "uuid" : "BDDE938D", "_id" : { "$oid" : "50622c4f59fff30200000051" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[13]", "startOffset" : 4920, "end" : "/div[1]/div[13]", "endOffset" : 5713, "_id" : { "$oid" : "50622c4f59fff30200000052" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348611151871 }, "created" : { "$date" : 1348611151871 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50622c6eb4b40a0200000042", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "We also keep ourselves in check. Humans kill and torment the most humans", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Man is the greatest enemy\nof man. Oppression, injustice, contempt, contumely, violence, sedition,\nwar, calumny, treachery, fraud; by these they mutually torment each\nother; and they would soon dissolve that society which they had formed,\nwere it not for the dread of still greater ills, which must attend their\nseparation.", "uuid" : "4F9D1487", "_id" : { "$oid" : "50622c6eb4b40a0200000042" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[13]", "startOffset" : 5905, "end" : "/div[1]/div[13]", "endOffset" : 6227, "_id" : { "$oid" : "50622c6eb4b40a0200000043" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348611182667 }, "created" : { "$date" : 1348611182667 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50622d0859fff30200000053", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "cleanthes claims that religion arises from reason. ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "", "uuid" : "FDB001B7", "_id" : { "$oid" : "50622d0859fff30200000053" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 20315, "end" : "/div[1]/div[4]", "endOffset" : 20316, "_id" : { "$oid" : "50622d0859fff30200000054" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348611336214 }, "created" : { "$date" : 1348611336214 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50622d3ab4b40a0200000044", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "cleanthes claims that religion arises from reason", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "most determined PYRRHONISM. LOCKE seems to have been the\nfirst Christian who ventured openly to assert, that faith was nothing but\na species of reason; that religion was only a branch of philosophy; and\nthat a chain of arguments, similar to that which established any truth in\nmorals, politics, or physics, was always employed in discovering all the\nprinciples of theology, natural and revealed. The ill use which BAYLE and\nother libertines made of the philosophical scepticism of the fathers and\nfirst reformers, still further propagated the judicious sentiment of Mr.\nLOCKE: And it is now in a manner avowed, by all pretenders to reasoning\nand philosophy, that Atheist and Sceptic are almost synonymous. And as it\nis certain that no man is in earnest when he professes the latter\nprinciple, I would fain hope that there are as few who seriously maintain\nthe former.", "uuid" : "1757D617", "_id" : { "$oid" : "50622d3ab4b40a0200000044" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]", "startOffset" : 19448, "end" : "/div[1]/div[4]", "endOffset" : 20316, "_id" : { "$oid" : "50622d3ab4b40a0200000045" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348611386178 }, "created" : { "$date" : 1348611386178 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50622d4659fff30200000055" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348611398705 }, "groups" : [ "21L.448J" ], "id" : "50622d4659fff30200000055", "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "quote" : "Ask yourself, ask any of your acquaintance, whether they would live over\nagain the last ten or twenty years of their life. No! but the next\ntwenty, they say, will be better:", "ranges" : [ { "start" : "/div[1]/div[13]", "startOffset" : 11194, "end" : "/div[1]/div[13]", "endOffset" : 11368, "_id" : { "$oid" : "50622d4659fff30200000056" } } ], "tags" : [], "text" : "Humans have created their own problems, discontentment, misery and so on", "updated" : { "$date" : 1348611410825 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "mpd91@mit.edu", "username" : "Michael D.", "uuid" : "B32462A9" } -{ "id" : "50622db359fff30200000058", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "If humans were made in the image of a Deity, the Deity must have similar flaws to those of humans. Humans are not very virtuous beings", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "And is it possible, CLEANTHES, said PHILO, that after all these\nreflections, and infinitely more, which might be suggested, you can still\npersevere in your Anthropomorphism, and assert the moral attributes of\nthe Deity, his justice, benevolence, mercy, and rectitude, to be of the\nsame nature with these virtues in human creatures? His power we allow is\ninfinite: whatever he wills is executed: but neither man nor any other\nanimal is happy: therefore he does not will their happiness. His wisdom\nis infinite: He is never mistaken in choosing the means to any end: But\nthe course of Nature tends not to human or animal felicity: therefore it\nis not established for that purpose. Through the whole compass of human\nknowledge, there are no inferences more certain and infallible than\nthese. In what respect, then, do his benevolence and mercy resemble the\nbenevolence and mercy of men?", "uuid" : "326B7528", "_id" : { "$oid" : "50622db359fff30200000058" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[13]", "startOffset" : 11658, "end" : "/div[1]/div[13]", "endOffset" : 12542, "_id" : { "$oid" : "50622db359fff30200000059" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348611507446 }, "created" : { "$date" : 1348611507446 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50622ea059fff3020000005a", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "The amount of pain in the world greatly outweighs the amount of happiness. CLEANTHES said that if you can prove that there is no happinesss in the world, then there is no need for religion", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Admitting your position, replied PHILO, which yet is extremely doubtful,\nyou must at the same time allow, that if pain be less frequent than\npleasure, it is infinitely more violent and durable. One hour of it is\noften able to outweigh a day, a week, a month of our common insipid\nenjoyments; and how many days, weeks, and months, are passed by several\nin the most acute torments? Pleasure, scarcely in one instance, is ever\nable to reach ecstasy and rapture; and in no one instance can it continue\nfor any time at its highest pitch and altitude. The spirits evaporate,\nthe nerves relax, the fabric is disordered, and the enjoyment quickly\ndegenerates into fatigue and uneasiness. But pain often, good God, how\noften! rises to torture and agony; and the longer it continues, it\nbecomes still more genuine agony and torture. Patience is exhausted,\ncourage languishes, melancholy seizes us, and nothing terminates our\nmisery but the removal of its cause, or another event, which is the sole\ncure of all evil, but which, from our natural folly, we regard with still\ngreater horror and consternation.", "uuid" : "525D9C46", "_id" : { "$oid" : "50622ea059fff3020000005a" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[13]", "startOffset" : 16773, "end" : "/div[1]/div[13]", "endOffset" : 17868, "_id" : { "$oid" : "50622ea059fff3020000005b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348611778851 }, "created" : { "$date" : 1348611744104 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50622ed259fff3020000005c", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Man is not inherently evil because of religion", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "The only method of supporting Divine benevolence, and it is what I\nwillingly embrace, is to deny absolutely the misery and wickedness of\nman.", "uuid" : "629E9A1F", "_id" : { "$oid" : "50622ed259fff3020000005c" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[13]", "startOffset" : 16330, "end" : "/div[1]/div[13]", "endOffset" : 16471, "_id" : { "$oid" : "50622ed259fff3020000005d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348611794506 }, "created" : { "$date" : 1348611794506 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50622f3c59fff3020000005e", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "If there was a benevolent creator, then there should not be any misery in the world at all.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Why is there any misery at all in the world? Not by\nchance surely. From some cause then. Is it from the intention of the\nDeity? But he is perfectly benevolent. Is it contrary to his intention?\nBut he is almighty.", "uuid" : "CCFCB8C4", "_id" : { "$oid" : "50622f3c59fff3020000005e" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[13]", "startOffset" : 19272, "end" : "/div[1]/div[13]", "endOffset" : 19484, "_id" : { "$oid" : "50622f3c59fff3020000005f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348611900349 }, "created" : { "$date" : 1348611900349 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50623325b4b40a0200000046", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Why can't life be without pain? It seems as if pain is necessary in response to certain stimuli in order to ensure that creatures survive. Hunger when we need food, thirst when we need water..", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "The first circumstance which introduces evil, is that contrivance or\neconomy of the animal creation, by which pains, as well as pleasures, are\nemployed to excite all creatures to action, and make them vigilant in the\ngreat work of self-preservation. Now pleasure alone, in its various\ndegrees, seems to human understanding sufficient for this purpose. All\nanimals might be constantly in a state of enjoyment: but when urged by\nany of the necessities of nature, such as thirst, hunger, weariness;\ninstead of pain, they might feel a diminution of pleasure, by which they\nmight be prompted to seek that object which is necessary to their\nsubsistence. Men pursue pleasure as eagerly as they avoid pain; at least\nthey might have been so constituted. It seems, therefore, plainly\npossible to carry on the business of life without any pain. Why then is\nany animal ever rendered susceptible of such a sensation? If animals can\nbe free from it an hour, they might enjoy a perpetual exemption from it;\nand it required as particular a contrivance of their organs to produce\nthat feeling, as to endow them with sight, hearing, or any of the senses.\nShall we conjecture, that such a contrivance was necessary, without any\nappearance of reason? and shall we build on that conjecture as on the\nmost certain truth?", "uuid" : "6B997D1F", "_id" : { "$oid" : "50623325b4b40a0200000046" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[14]", "startOffset" : 6638, "end" : "/div[1]/div[14]", "endOffset" : 7936, "_id" : { "$oid" : "50623325b4b40a0200000047" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348612901642 }, "created" : { "$date" : 1348612901642 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5062338859fff30200000060", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "The natural world is ordered to an extent. It seems to have general laws that everyone follows, otherwise there would be complete chaos", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "But a capacity of pain would not alone produce pain, were it not for the\nsecond circumstance, viz. the conducting of the world by general laws;\nand this seems nowise necessary to a very perfect Being. It is true, if\neverything were conducted by particular volitions, the course of nature\nwould be perpetually broken, and no man could employ his reason in the\nconduct of life. But might not other particular volitions remedy this\ninconvenience? In short, might not the Deity exterminate all ill,\nwherever it were to be found; and produce all good, without any\npreparation, or long progress of causes and effects?", "uuid" : "743392A4", "_id" : { "$oid" : "5062338859fff30200000060" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[14]", "startOffset" : 7938, "end" : "/div[1]/div[14]", "endOffset" : 8550, "_id" : { "$oid" : "5062338859fff30200000061" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348613000193 }, "created" : { "$date" : 1348613000193 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50623481b4b40a0200000048", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Nature has made sure that all the species have the traits distributed so that they excel in some areas but lack in others, but still have the ability to survive. For example, a creature cannot be both very fast and very powerful. Humans are very intelligent, but a very fragile species", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "the great frugality with which all powers and faculties are\ndistributed to every particular being. So well adjusted are the organs\nand capacities of all animals, and so well fitted to their preservation,\nthat, as far as history or tradition reaches, there appears not to be any\nsingle species which has yet been extinguished in the universe. Every\nanimal has the requisite endowments; but these endowments are bestowed\nwith so scrupulous an economy, that any considerable diminution must\nentirely destroy the creature. Wherever one power is increased, there is\na proportional abatement in the others. Animals which excel in swiftness\nare commonly defective in force. Those which possess both are either\nimperfect in some of their senses, or are oppressed with the most craving\nwants. The human species, whose chief excellency is reason and sagacity,\nis of all others the most necessitous, and the most deficient in bodily\nadvantages; without clothes, without arms, without food, without lodging,\nwithout any convenience of life, except what they owe to their own skill\nand industry. In short, nature seems to have formed an exact calculation\nof the necessities of her creatures; and, like a rigid master, has\nafforded them little more powers or endowments than what are strictly\nsufficient to supply those necessities.", "uuid" : "8F2102BA", "_id" : { "$oid" : "50623481b4b40a0200000048" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[14]", "startOffset" : 10765, "end" : "/div[1]/div[14]", "endOffset" : 12083, "_id" : { "$oid" : "50623481b4b40a0200000049" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348613249145 }, "created" : { "$date" : 1348613249145 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506234a7b4b40a020000004a", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "A benevolent Deity would have given everyone everything, or more, making life more comfortable and less wrought with sorrow", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "An indulgent parent would have\nbestowed a large stock, in order to guard against accidents, and secure\nthe happiness and welfare of the creature in the most unfortunate\nconcurrence of circumstances. Every course of life would not have been so\nsurrounded with precipices, that the least departure from the true path,\nby mistake or necessity, must involve us in misery and ruin.", "uuid" : "0DCA407A", "_id" : { "$oid" : "506234a7b4b40a020000004a" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[14]", "startOffset" : 12084, "end" : "/div[1]/div[14]", "endOffset" : 12460, "_id" : { "$oid" : "506234a7b4b40a020000004b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348613287136 }, "created" : { "$date" : 1348613287136 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5062351659fff30200000062", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "If there was a supernatural deisgner, and his power was limited, resulting in the frugal distribution of skills and abilities we have now, he should have made fewer animals and given each more gifts or not taken on such a daunting task. PHILOS is trying to indicate that there may not be an omnipotent creator for this reason", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "It would have been better, were his power\nextremely limited, to have created fewer animals, and to have endowed\nthese with more faculties for their happiness and preservation. A builder\nis never esteemed prudent, who undertakes a plan beyond what his stock\nwill enable him to finish.", "uuid" : "12069B3B", "_id" : { "$oid" : "5062351659fff30200000062" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[14]", "startOffset" : 12855, "end" : "/div[1]/div[14]", "endOffset" : 13139, "_id" : { "$oid" : "5062351659fff30200000063" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348613398110 }, "created" : { "$date" : 1348613398110 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50624d1ab4b40a020000004c", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "innocent, in a way", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "singularly\nundistrustful good-nature", "uuid" : "717BC227", "_id" : { "$oid" : "50624d1ab4b40a020000004c" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 480, "end" : "/div[1]/p[4]", "endOffset" : 516, "_id" : { "$oid" : "50624d1ab4b40a020000004d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348619546884 }, "created" : { "$date" : 1348619546884 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50624d36b4b40a020000004e", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "e.g. multiple hints", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "repeated incentives", "uuid" : "DB9242EB", "_id" : { "$oid" : "50624d36b4b40a020000004e" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 558, "end" : "/div[1]/p[4]", "endOffset" : 577, "_id" : { "$oid" : "50624d36b4b40a020000004f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348619574749 }, "created" : { "$date" : 1348619574749 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50624d4e59fff30200000064", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Important theme in the book", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "evil in man", "uuid" : "2D8FBA22", "_id" : { "$oid" : "50624d4e59fff30200000064" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 670, "end" : "/div[1]/p[4]", "endOffset" : 681, "_id" : { "$oid" : "50624d4e59fff30200000065" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348619598874 }, "created" : { "$date" : 1348619598874 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50625801b4b40a0200000050", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "a bit hypocritical, no?", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Whoever scruples this fundamental truth,\ndeserves every punishment which can be inflicted among philosophers, to\nwit, the greatest ridicule, contempt, and disapprobation", "uuid" : "F8564CB4", "_id" : { "$oid" : "50625801b4b40a0200000050" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 3525, "end" : "/div[1]/div[5]", "endOffset" : 3694, "_id" : { "$oid" : "50625801b4b40a0200000051" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348622391743 }, "created" : { "$date" : 1348622337527 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50625a24b4b40a0200000052", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Bit hypocritical. The claim that He is superior implies that you have a metric for comparison", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "He is infinitely superior to our limited view and\ncomprehension; and is more the object of worship in the temple, than of\ndisputation in the schools.", "uuid" : "748BE0D9", "_id" : { "$oid" : "50625a24b4b40a0200000052" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 4298, "end" : "/div[1]/div[5]", "endOffset" : 4448, "_id" : { "$oid" : "50625a24b4b40a0200000053" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348622884231 }, "created" : { "$date" : 1348622884231 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50625a9fb4b40a0200000054", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Possible counterargument: we experience nature, which is the creation of a divine being", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "We\nhave no experience of divine attributes and operations.", "uuid" : "C4B4E67B", "_id" : { "$oid" : "50625a9fb4b40a0200000054" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 4661, "end" : "/div[1]/div[5]", "endOffset" : 4719, "_id" : { "$oid" : "50625a9fb4b40a0200000055" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348623007980 }, "created" : { "$date" : 1348623007980 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50625b935e0f8c0200000002", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "similarity is not very solid evidence", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Nature is somewhat similar to the mind of man, though possessed\nof much larger faculties, proportioned to the grandeur of the work which\nhe has executed. By this argument a posteriori, and by this argument\nalone, do we prove at once the existence of a Deity, and his similarity\nto human mind and intelligence.", "uuid" : "153AD710", "_id" : { "$oid" : "50625b935e0f8c0200000002" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 6024, "end" : "/div[1]/div[5]", "endOffset" : 6334, "_id" : { "$oid" : "50625b935e0f8c0200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348623251907 }, "created" : { "$date" : 1348623251907 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50625c02b4b40a0200000056", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "dema claims hubris", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "I shall be so free, CLEANTHES, said DEMEA, as to tell you, that from the\nbeginning, I could not approve of your conclusion concerning the\nsimilarity of the Deity to men; still less can I approve of the mediums\nby which you endeavour to establish it. What! No demonstration of the\nBeing of God! No abstract arguments! No proofs a priori! Are these, which\nhave hitherto been so much insisted on by philosophers, all fallacy, all\nsophism? Can we reach no further in this subject than experience and\nprobability? I will not say that this is betraying the cause of a Deity:\nBut surely, by this affected candour, you give advantages to Atheists,\nwhich they never could obtain by the mere dint of argument and reasoning.", "uuid" : "663E8868", "_id" : { "$oid" : "50625c02b4b40a0200000056" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 6335, "end" : "/div[1]/div[5]", "endOffset" : 7049, "_id" : { "$oid" : "50625c02b4b40a0200000057" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348623362210 }, "created" : { "$date" : 1348623362210 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50625c965e0f8c0200000004", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "cleanthes: function implies purposeful design", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Steps of a stair are plainly contrived, that\nhuman legs may use them in mounting; and this inference is certain and\ninfallible. Human legs are also contrived for walking and mounting;", "uuid" : "CA3C2509", "_id" : { "$oid" : "50625c965e0f8c0200000004" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 9449, "end" : "/div[1]/div[5]", "endOffset" : 9632, "_id" : { "$oid" : "50625c965e0f8c0200000005" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348623510358 }, "created" : { "$date" : 1348623510358 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50625db85e0f8c0200000006", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "text" : "I agree with Philo's arguments concerning the world's similarities with animals or vegetables. While part of my agreement may be due to my education in evolution, it does seem that natural causes of origination would be more similar to the creation of the world than human or mechanical causes. While aspects of the world as a system can be compared to a machine, they are more similar to an organism, which can be considered to have machine-like behavior that comes by natural means (generation- as Philo calls it- and evolution). I think that Philo's argument here is a strong one.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "I affirm,\nthat there are other parts of the universe (besides the machines of human\ninvention) which bear still a greater resemblance to the fabric of the\nworld, and which, therefore, afford a better conjecture concerning the\nuniversal origin of this system. These parts are animals and vegetables.\nThe world plainly resembles more an animal or a vegetable, than it does a\nwatch or a knitting-loom.", "uuid" : "3BF1D3D2", "_id" : { "$oid" : "50625db85e0f8c0200000006" }, "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 1517, "end" : "/div[1]/div[10]", "endOffset" : 1915, "_id" : { "$oid" : "50625db85e0f8c0200000007" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348623800226 }, "created" : { "$date" : 1348623800226 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50625e0fb4b40a0200000058", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Is this a problem? Philo doens't believe in inferring from experience. Is it possible for him to infer anything at all?", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "experience", "uuid" : "1D008A98", "_id" : { "$oid" : "50625e0fb4b40a0200000058" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 14277, "end" : "/div[1]/div[5]", "endOffset" : 14287, "_id" : { "$oid" : "50625e0fb4b40a0200000059" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348623887288 }, "created" : { "$date" : 1348623887288 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50625e3d5e0f8c0200000008", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Everything in nature interacts with everything else. Sometimes there is a high degree of interaction, sometimes it is barely noticeable. This does not restrict the way some things can behave, they are still free to behave at one extreme or another", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "The fourth circumstance, whence arises the misery and ill of the\nuniverse, is the inaccurate workmanship of all the springs and principles\nof the great machine of nature. It must be acknowledged, that there are\nfew parts of the universe, which seem not to serve some purpose, and\nwhose removal would not produce a visible defect and disorder in the\nwhole. The parts hang all together; nor can one be touched without\naffecting the rest, in a greater or less degree. But at the same time, it\nmust be observed, that none of these parts or principles, however useful,\nare so accurately adjusted, as to keep precisely within those bounds in\nwhich their utility consists; but they are, all of them, apt, on every\noccasion, to run into the one extreme or the other.", "uuid" : "A34CE8CE", "_id" : { "$oid" : "50625e3d5e0f8c0200000008" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[14]", "startOffset" : 15755, "end" : "/div[1]/div[14]", "endOffset" : 16513, "_id" : { "$oid" : "50625e3d5e0f8c0200000009" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348623933326 }, "created" : { "$date" : 1348623933326 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50625f19b4b40a020000005a", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "text" : "Philo challenges Demea to prove that order stems only from thought. In some ways, Philo here refers to something like DNA, a material origin of order that is passed from generation to generation. An argument could, however, be made that a deity created the system of genetic inheritance, and instilled order in that way. ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "A tree bestows order and organisation on that\ntree which springs from it, without knowing the order; an animal in the\nsame manner on its offspring; a bird on its nest; and instances of this\nkind are even more frequent in the world than those of order, which arise\nfrom reason and contrivance. To say, that all this order in animals and\nvegetables proceeds ultimately from design, is begging the question; nor\ncan that great point be ascertained otherwise than by proving, a priori,\nboth that order is, from its nature, inseparably attached to thought; and\nthat it can never of itself, or from original unknown principles, belong\nto matter.", "uuid" : "CF5F2D44", "_id" : { "$oid" : "50625f19b4b40a020000005a" }, "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 7114, "end" : "/div[1]/div[10]", "endOffset" : 7753, "_id" : { "$oid" : "50625f19b4b40a020000005b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348624153669 }, "created" : { "$date" : 1348624153669 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50625f525e0f8c020000000a", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "a bit fatalist: nothing we think has any chance of being close to the right answer", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "ur partiality in our own favour does\nindeed present it on all occasions; but sound philosophy ought carefully\nto guard against so natural an illusion.", "uuid" : "94369768", "_id" : { "$oid" : "50625f525e0f8c020000000a" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 17013, "end" : "/div[1]/div[5]", "endOffset" : 17164, "_id" : { "$oid" : "50625f525e0f8c020000000b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348624210429 }, "created" : { "$date" : 1348624210429 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5062600db4b40a020000005c", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Philo believes that we can never make significant progress on the question", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "pretend\nto determine.", "uuid" : "F76D081A", "_id" : { "$oid" : "5062600db4b40a020000005c" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 19182, "end" : "/div[1]/div[5]", "endOffset" : 19205, "_id" : { "$oid" : "5062600db4b40a020000005d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348624397928 }, "created" : { "$date" : 1348624397928 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50626071b4b40a020000005e", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "if you have no way to fathom a definition or description, how can you be certain of His existence?", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "definition or descriptio", "uuid" : "6E448FF1", "_id" : { "$oid" : "50626071b4b40a020000005e" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 20222, "end" : "/div[1]/div[5]", "endOffset" : 20246, "_id" : { "$oid" : "50626071b4b40a020000005f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348624497925 }, "created" : { "$date" : 1348624497925 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50626348b4b40a0200000060", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Philo seems to be ok with proof by similarity in this case...", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "that the similarity of their nature enabled us to extend the same\narguments and phenomena from one to the other.", "uuid" : "06F46B33", "_id" : { "$oid" : "50626348b4b40a0200000060" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]", "startOffset" : 24699, "end" : "/div[1]/div[5]", "endOffset" : 24812, "_id" : { "$oid" : "50626348b4b40a0200000061" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348625224911 }, "created" : { "$date" : 1348625224911 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506263d25e0f8c020000000c", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "science!", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "conclusions concerning fact were founded on\nexperience", "uuid" : "207DBBB3", "_id" : { "$oid" : "506263d25e0f8c020000000c" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 1809, "end" : "/div[1]/div[6]", "endOffset" : 1863, "_id" : { "$oid" : "506263d25e0f8c020000000d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348625362215 }, "created" : { "$date" : 1348625362215 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506265185e0f8c020000000e", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "complexity implies design", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "To what degree,\ntherefore, of blind dogmatism must one have attained, to reject such\nnatural and such convincing arguments?", "uuid" : "CB8EC7ED", "_id" : { "$oid" : "506265185e0f8c020000000e" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 6546, "end" : "/div[1]/div[6]", "endOffset" : 6670, "_id" : { "$oid" : "506265185e0f8c020000000f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348625688139 }, "created" : { "$date" : 1348625688139 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5062659ab4b40a0200000062", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Philo lost?", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "DEMEA broke in upon the discourse, and saved his countenance.", "uuid" : "10BA2580", "_id" : { "$oid" : "5062659ab4b40a0200000062" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 8410, "end" : "/div[1]/div[6]", "endOffset" : 8472, "_id" : { "$oid" : "5062659ab4b40a0200000063" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348625818900 }, "created" : { "$date" : 1348625818900 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5062662db4b40a0200000064", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Demea has a habit of quoting the beliefs of people of the past. How is culture supposed to progress if its caught in history?", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "The ancient", "uuid" : "4A564214", "_id" : { "$oid" : "5062662db4b40a0200000064" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 9317, "end" : "/div[1]/div[6]", "endOffset" : 9328, "_id" : { "$oid" : "5062662db4b40a0200000065" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348625965906 }, "created" : { "$date" : 1348625965906 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5062667eb4b40a0200000066", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "the argument here shifts from \"is it fair to claim that we have a sense of God's nature?\" to \"Is Cleanthes's hypothesis that God's nature is humanlike correct?\"", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "It seems, therefore, unreasonable to transfer such\nsentiments to a supreme existence, or to suppose him actuated by them;\nand the phenomena besides of the universe will not support us in such a\ntheory.", "uuid" : "768C5B5F", "_id" : { "$oid" : "5062667eb4b40a0200000066" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]", "startOffset" : 10331, "end" : "/div[1]/div[6]", "endOffset" : 10532, "_id" : { "$oid" : "5062667eb4b40a0200000067" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348626046794 }, "created" : { "$date" : 1348626046794 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506266c35e0f8c0200000010", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "demea, by his own principles, should not be taking a side as to God's nature. Doesn't he believe that we humans have no ability to fathom it in the first place?", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "and should insist so strenuously\nthat he has no manner of likeness or resemblance to human creatures.", "uuid" : "311E6B20", "_id" : { "$oid" : "506266c35e0f8c0200000010" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]", "startOffset" : 190, "end" : "/div[1]/div[7]", "endOffset" : 291, "_id" : { "$oid" : "506266c35e0f8c0200000011" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348626115482 }, "created" : { "$date" : 1348626115482 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50626849b4b40a0200000068", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "demea is doing the same thing...", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "bigots", "uuid" : "F22E6E19", "_id" : { "$oid" : "50626849b4b40a0200000068" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]", "startOffset" : 1441, "end" : "/div[1]/div[7]", "endOffset" : 1447, "_id" : { "$oid" : "50626849b4b40a0200000069" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348626505394 }, "created" : { "$date" : 1348626505394 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5062699bb4b40a020000006a", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Isn't this speculating about God's nature?", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "By the same act, say they, he sees past, present, and\nfuture: His love and hatred, his mercy and justice, are one individual\noperation: He is entire in every point of space; and complete in every\ninstant of duration.", "uuid" : "FB38A1F3", "_id" : { "$oid" : "5062699bb4b40a020000006a" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]", "startOffset" : 2565, "end" : "/div[1]/div[7]", "endOffset" : 2782, "_id" : { "$oid" : "5062699bb4b40a020000006b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348626843682 }, "created" : { "$date" : 1348626843682 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50626cf75e0f8c0200000012", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Here Philo captures, without knowing it, one of the central ideas of evolution. Trial and error is a very important technique in the design of anything functional. Imagining God as all-powerful leads to paradoxes such as \"can he make a rock that he can't lift?\" So if God is indeed bound by rules, it is reasonable to suggest that He couldn't have made a perfect design without a process of trial and error. Even Genesis hints at this, when it repeatedly says that \"it was good.\"", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "through a\nlong succession of ages, after multiplied trials, mistakes, corrections,\ndeliberations, and controversies, had been gradually improving?", "uuid" : "8331C6D8", "_id" : { "$oid" : "50626cf75e0f8c0200000012" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 4986, "end" : "/div[1]/div[8]", "endOffset" : 5132, "_id" : { "$oid" : "50626cf75e0f8c0200000013" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348627703917 }, "created" : { "$date" : 1348627703917 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50626d31b4b40a020000006c", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "origins of multiverse theory?", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "improvement carried on during infinite ages in\nthe art of world-making", "uuid" : "E5C2820D", "_id" : { "$oid" : "50626d31b4b40a020000006c" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 5310, "end" : "/div[1]/div[8]", "endOffset" : 5380, "_id" : { "$oid" : "50626d31b4b40a020000006d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348627761971 }, "created" : { "$date" : 1348627761971 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50626ea8b4b40a020000006e", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "text" : "Philo makes an interesting point here, commenting that we have a tendency to lend our own habits and attributes to being of power (or deities). Our preconceptions of what is \"normal\" or \"acceptable\" carry over into our understanding of the divine, such that these three discuss solely whether or not God is similar to humans, rather than whether her resembles a fish or a stone. In our (their) minds, the only beings of reason are humans, and a God must therefore be either of human-type mind or something beyond human and utterly incomparable.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "And were there a planet wholly inhabited by spiders, (which is\nvery possible,) this inference would there appear as natural and\nirrefragable as that which in our planet ascribes the origin of all\nthings to design and intelligence, as explained by CLEANTHES", "uuid" : "6DFA1DAB", "_id" : { "$oid" : "50626ea8b4b40a020000006e" }, "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 10917, "end" : "/div[1]/div[10]", "endOffset" : 11173, "_id" : { "$oid" : "50626ea8b4b40a020000006f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348628136091 }, "created" : { "$date" : 1348628136091 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506271355e0f8c0200000014", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Philo's position in one sentence: it is impossible to reason by your experiences", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Reason or by Experience", "uuid" : "3DE3CEAA", "_id" : { "$oid" : "506271355e0f8c0200000014" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]", "startOffset" : 5284, "end" : "/div[1]/div[7]", "endOffset" : 5307, "_id" : { "$oid" : "506271355e0f8c0200000015" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348628789217 }, "created" : { "$date" : 1348628789217 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506272f75e0f8c0200000016", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "ANy supposed order you try to ascribe to the world is human-made and lacks greater meaning", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "can any other reason be assigned by you, Anthropomorphites, than that it\nis a rational faculty, and that such is the nature of the Deity?", "uuid" : "6617E60B", "_id" : { "$oid" : "506272f75e0f8c0200000016" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]", "startOffset" : 10491, "end" : "/div[1]/div[7]", "endOffset" : 10628, "_id" : { "$oid" : "506272f75e0f8c0200000017" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348629239842 }, "created" : { "$date" : 1348629239842 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5062732bb4b40a0200000070" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348629291450 }, "groups" : [ "21L.448J" ], "id" : "5062732bb4b40a0200000070", "permissions" : { "admin" : [ "mvwagner@mit.edu" ], "delete" : [ "mvwagner@mit.edu" ], "read" : [], "update" : [ "mvwagner@mit.edu" ] }, "quote" : "the learned are perfectly agreed with the\nvulgar;", "ranges" : [ { "start" : "/div[1]/div[13]", "startOffset" : 1709, "end" : "/div[1]/div[13]", "endOffset" : 1758, "_id" : { "$oid" : "5062732bb4b40a0200000071" } } ], "tags" : [], "text" : "is a head of lettuce any better than a carrot?", "updated" : { "$date" : 1348629302066 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "uuid" : "836658EA" } -{ "id" : "506273e3b4b40a0200000072", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "is there ever an end? as long as debate and curiosity exist in men then there are discoveries, or theories, that will be made.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "For is this a subject in which philosophers can propose to\nmake discoveries especially in so late an age?", "uuid" : "134D2C57", "_id" : { "$oid" : "506273e3b4b40a0200000072" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[13]", "startOffset" : 3228, "end" : "/div[1]/div[13]", "endOffset" : 3334, "_id" : { "$oid" : "506273e3b4b40a0200000073" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348629475381 }, "created" : { "$date" : 1348629475381 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50627445b4b40a0200000074", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "teeeeellll me about it! ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "The first entrance into\nlife gives anguish to the new-born infant and to its wretched parent:", "uuid" : "67196370", "_id" : { "$oid" : "50627445b4b40a0200000074" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[13]", "startOffset" : 3826, "end" : "/div[1]/div[13]", "endOffset" : 3919, "_id" : { "$oid" : "50627445b4b40a0200000075" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348629573958 }, "created" : { "$date" : 1348629573958 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506274ac5e0f8c0200000018", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "could explain why bad things happen or why widely accepted miracles have not occured in almost two millenia", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "afterwards abandoned it", "uuid" : "173C338D", "_id" : { "$oid" : "506274ac5e0f8c0200000018" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 8878, "end" : "/div[1]/div[8]", "endOffset" : 8901, "_id" : { "$oid" : "506274ac5e0f8c0200000019" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348629676967 }, "created" : { "$date" : 1348629676967 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506274ba5e0f8c020000001a", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "argument for evil forces behind creation", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Man is the greatest enemy\nof man. Oppression, injustice, contempt, contumely, violence, sedition,\nwar, calumny, treachery, fraud; by these they mutually torment each\nother; and they would soon dissolve that society which they had formed,\nwere it not for the dread of still greater ills, which must attend their\nseparation.", "uuid" : "C3105520", "_id" : { "$oid" : "506274ba5e0f8c020000001a" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[13]", "startOffset" : 5905, "end" : "/div[1]/div[13]", "endOffset" : 6228, "_id" : { "$oid" : "506274ba5e0f8c020000001b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348629690293 }, "created" : { "$date" : 1348629690293 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50627622b4b40a0200000076", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "It's too difficult to quantify similitidue and dissimiltude", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Now, it is certain, that\nthe liker the effects are which are seen, and the liker the causes which\nare inferred, the stronger is the argument. Every departure on either\nside diminishes the probability, and renders the experiment less\nconclusive. You cannot doubt of the principle; neither ought you to\nreject its consequences.", "uuid" : "66C841D4", "_id" : { "$oid" : "50627622b4b40a0200000076" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 270, "end" : "/div[1]/div[8]", "endOffset" : 596, "_id" : { "$oid" : "50627622b4b40a0200000077" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348630050757 }, "created" : { "$date" : 1348630050757 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506279c05e0f8c020000001c", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "The peasant could attempt to learn poetry", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Could a peasant, if the Aeneid were read to him, pronounce that\npoem to be absolutely faultless, or even assign to it its proper rank\namong the productions of human wit, he, who had never seen any other\nproduction?", "uuid" : "1B1A2E9A", "_id" : { "$oid" : "506279c05e0f8c020000001c" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 4345, "end" : "/div[1]/div[8]", "endOffset" : 4560, "_id" : { "$oid" : "506279c05e0f8c020000001d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348630976182 }, "created" : { "$date" : 1348630976182 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50627b105e0f8c020000001e", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Odd that Philo even considers that a possibility. ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "several deities", "uuid" : "EDAE0F1D", "_id" : { "$oid" : "50627b105e0f8c020000001e" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 5826, "end" : "/div[1]/div[8]", "endOffset" : 5841, "_id" : { "$oid" : "50627b105e0f8c020000001f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348631312307 }, "created" : { "$date" : 1348631312307 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50627bb05e0f8c0200000020", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "PHILO using CLEANTHES' analogy.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "His ignorance, or even your\nown ignorance of such a plan, will never convince you of the\nimpossibility of it. If you find any inconveniences and deformities in\nthe building, you will always, without entering into any detail, condemn\nthe architect.", "uuid" : "680AE000", "_id" : { "$oid" : "50627bb05e0f8c0200000020" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [ "analogy" ], "ranges" : [ { "start" : "/div[1]/div[14]", "startOffset" : 4700, "end" : "/div[1]/div[14]", "endOffset" : 4948, "_id" : { "$oid" : "50627bb05e0f8c0200000021" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348631472722 }, "created" : { "$date" : 1348631472722 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50627bd5b4b40a0200000078", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "does this mean that humans can't attempt to make progress towards understanding? is the attempt an act of heresy?", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "exceeds all\nanalogy, and even comprehension.", "uuid" : "40A719D8", "_id" : { "$oid" : "50627bd5b4b40a0200000078" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 7583, "end" : "/div[1]/div[8]", "endOffset" : 7628, "_id" : { "$oid" : "50627bd5b4b40a0200000079" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348631509379 }, "created" : { "$date" : 1348631509379 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50627c715e0f8c0200000022" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348631665136 }, "groups" : [ "21L.448J" ], "id" : "50627c715e0f8c0200000022", "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "quote" : "The first circumstance which introduces evil, is that contrivance or\neconomy of the animal creation, by which pains, as well as pleasures, are\nemployed to excite all creatures to action, and make them vigilant in the\ngreat work of self-preservation.", "ranges" : [ { "start" : "/div[1]/div[14]", "startOffset" : 6638, "end" : "/div[1]/div[14]", "endOffset" : 6888, "_id" : { "$oid" : "50627c715e0f8c0200000023" } } ], "tags" : [ "circumstance" ], "text" : "1. self-preservation", "updated" : { "$date" : 1348632022178 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "uuid" : "D4AF2C5D" } -{ "id" : "50627d385e0f8c0200000024", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "thats not cleanthes' point.. Cleanthes says that you CAN reason from experiences, but it is not the only method of reason", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "proved otherwise than by experience", "uuid" : "35370BF1", "_id" : { "$oid" : "50627d385e0f8c0200000024" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 922, "end" : "/div[1]/div[10]", "endOffset" : 957, "_id" : { "$oid" : "50627d385e0f8c0200000025" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348631864800 }, "created" : { "$date" : 1348631864800 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50627da85e0f8c0200000026", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "2. nature's course; inability to control events", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "conducting of the world by general laws;\nand this seems nowise necessary to a very perfect Being. It is true, if\neverything were conducted by particular volitions", "uuid" : "DFEEDCAA", "_id" : { "$oid" : "50627da85e0f8c0200000026" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[14]", "startOffset" : 8041, "end" : "/div[1]/div[14]", "endOffset" : 8203, "_id" : { "$oid" : "50627da85e0f8c0200000027" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348632001612 }, "created" : { "$date" : 1348631976106 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50627e145e0f8c0200000028", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "I don't understand how demea \"naturally supposes\" things but refuses to make deductions from observations", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "naturally suppose", "uuid" : "09B5F7F0", "_id" : { "$oid" : "50627e145e0f8c0200000028" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 5407, "end" : "/div[1]/div[10]", "endOffset" : 5425, "_id" : { "$oid" : "50627e145e0f8c0200000029" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348632084307 }, "created" : { "$date" : 1348632084307 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50627e4db4b40a020000007a", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "logical misstep here... resemblance does not demonstrate anything close to equality", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "The\nsteps are here equally wide,", "uuid" : "700AD766", "_id" : { "$oid" : "50627e4db4b40a020000007a" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 9534, "end" : "/div[1]/div[10]", "endOffset" : 9566, "_id" : { "$oid" : "50627e4db4b40a020000007b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348632141358 }, "created" : { "$date" : 1348632141358 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50627e965e0f8c020000002a", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "3. balance of power; ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "the great frugality with which all powers and faculties are\ndistributed to every particular being. So well adjusted are the organs\nand capacities of all animals, and so well fitted to their preservation,\nthat, as far as history or tradition reaches, there appears not to be any\nsingle species which has yet been extinguished in the universe. Every\nanimal has the requisite endowments; but these endowments are bestowed\nwith so scrupulous an economy, that any considerable diminution must\nentirely destroy the creature. Wherever one power is increased, there is\na proportional abatement in the others. Animals which excel in swiftness\nare commonly defective in force. Those which possess both are either\nimperfect in some of their senses, or are oppressed with the most craving\nwants.", "uuid" : "DFBD02AE", "_id" : { "$oid" : "50627e965e0f8c020000002a" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[14]", "startOffset" : 10765, "end" : "/div[1]/div[14]", "endOffset" : 11548, "_id" : { "$oid" : "50627e965e0f8c020000002b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348632214806 }, "created" : { "$date" : 1348632214806 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5062804cb4b40a020000007c", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Evil exists", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "The weaker too, in\ntheir turn, often prey upon the stronger, and vex and molest them without\nrelaxation. Consider that innumerable race of insects, which either are\nbred on the body of each animal, or, flying about, infix their stings in\nhim. These insects have others still less than themselves, which torment\nthem. And thus on each hand, before and behind, above and below, every\nanimal is surrounded with enemies, which incessantly seek his misery and\ndestruction.", "uuid" : "507C5B09", "_id" : { "$oid" : "5062804cb4b40a020000007c" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[13]", "startOffset" : 4225, "end" : "/div[1]/div[13]", "endOffset" : 4693, "_id" : { "$oid" : "5062804cb4b40a020000007d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348632652231 }, "created" : { "$date" : 1348632652231 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5062804db4b40a020000007e" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348632653666 }, "groups" : [ "21L.448J" ], "id" : "5062804db4b40a020000007e", "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "quote" : "The fourth circumstance, whence arises the misery and ill of the\nuniverse, is the inaccurate workmanship of all the springs and principles\nof the great machine of nature. It must be acknowledged, that there are\nfew parts of the universe, which seem not to serve some purpose, and\nwhose removal would not produce a visible defect and disorder in the\nwhole", "ranges" : [ { "start" : "/div[1]/div[14]", "startOffset" : 15755, "end" : "/div[1]/div[14]", "endOffset" : 16109, "_id" : { "$oid" : "5062804db4b40a020000007f" } } ], "tags" : [], "text" : "4. extreme behavior; things don't always happen in a useful way; excess and defect", "updated" : { "$date" : 1348632689069 }, "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "uuid" : "581EB6B3" } -{ "id" : "5062806a5e0f8c020000002c", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "this is rather arrogant. humans are still limited by disease and perhaps most significantly other humans", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Man alone, said DEMEA, seems to be, in part, an exception to this rule.\nFor by combination in society, he can easily master lions, tigers, and\nbears, whose greater strength and agility naturally enable them to prey\nupon him.", "uuid" : "65F3FE06", "_id" : { "$oid" : "5062806a5e0f8c020000002c" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[13]", "startOffset" : 4694, "end" : "/div[1]/div[13]", "endOffset" : 4919, "_id" : { "$oid" : "5062806a5e0f8c020000002d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348632682870 }, "created" : { "$date" : 1348632682870 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506281975e0f8c020000002e", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "How does he know that God is perfectly benevolent?", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "benevolence and mercy", "uuid" : "C585F7B5", "_id" : { "$oid" : "506281975e0f8c020000002e" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[13]", "startOffset" : 12477, "end" : "/div[1]/div[13]", "endOffset" : 12498, "_id" : { "$oid" : "506281975e0f8c020000002f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348632983672 }, "created" : { "$date" : 1348632983672 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506281ba5e0f8c0200000030", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "nature of the conditions", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "There may four hypotheses be framed concerning the first causes of the\nuniverse: that they are endowed with perfect goodness; that they have\nperfect malice; that they are opposite, and have both goodness and\nmalice; that they have neither goodness nor malice. Mixed phenomena can\nnever prove the two former unmixed principles; and the uniformity and\nsteadiness of general laws seem to oppose the third. The fourth,\ntherefore, seems by far the most probable.", "uuid" : "9B406C00", "_id" : { "$oid" : "506281ba5e0f8c0200000030" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[14]", "startOffset" : 21223, "end" : "/div[1]/div[14]", "endOffset" : 21681, "_id" : { "$oid" : "506281ba5e0f8c0200000031" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348633018433 }, "created" : { "$date" : 1348633018433 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50628390b4b40a0200000080", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "I am not convinced. Most of the world consists of objects that are not and never were alive. All he's saying is that animals and vegetables look like animals and vegetables.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "But to waive all objections drawn from this topic, I affirm,\nthat there are other parts of the universe (besides the machines of human\ninvention) which bear still a greater resemblance to the fabric of the\nworld, and which, therefore, afford a better conjecture concerning the\nuniversal origin of this system. These parts are animals and vegetables.", "uuid" : "73129D1D", "_id" : { "$oid" : "50628390b4b40a0200000080" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 1466, "end" : "/div[1]/div[10]", "endOffset" : 1815, "_id" : { "$oid" : "50628390b4b40a0200000081" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348633488640 }, "created" : { "$date" : 1348633488640 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506283feb4b40a0200000082", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "reference to panspermia? (the theory that life on earth came from a comet)", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "A comet, for instance, is the seed of a world;\nand after it has been fully ripened, by passing from sun to sun, and star\nto star, it is at last tossed into the unformed elements which every\nwhere surround this universe, and immediately sprouts up into a new\nsystem.", "uuid" : "68A6AB35", "_id" : { "$oid" : "506283feb4b40a0200000082" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 2580, "end" : "/div[1]/div[10]", "endOffset" : 2846, "_id" : { "$oid" : "506283feb4b40a0200000083" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348633598449 }, "created" : { "$date" : 1348633598449 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506293d5b4b40a0200000084", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "text" : "world created through evolutionary and natural forces", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "I affirm,\nthat there are other parts of the universe (besides the machines of human\ninvention) which bear still a greater resemblance to the fabric of the\nworld, and which, therefore, afford a better conjecture concerning the\nuniversal origin of this system. These parts are animals and vegetables.\nThe world plainly resembles more an animal or a vegetable, than it does a\nwatch or a knitting-loom. Its cause, therefore, it is more probable,\nresembles the cause of the former. The cause of the former is generation\nor vegetation. The cause, therefore, of the world, we may infer to be\nsomething similar or analogous to generation or vegetation.", "uuid" : "09E87E23", "_id" : { "$oid" : "506293d5b4b40a0200000084" }, "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 1517, "end" : "/div[1]/div[10]", "endOffset" : 2162, "_id" : { "$oid" : "506293d5b4b40a0200000085" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348637653562 }, "created" : { "$date" : 1348637653562 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5062965f5e0f8c0200000032", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Right out of Darwin's book: the reason we feel pain and pleasure is that it motivates us to preserve ourselves and reproduce.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "The first circumstance which introduces evil, is that contrivance or\neconomy of the animal creation, by which pains, as well as pleasures, are\nemployed to excite all creatures to action, and make them vigilant in the\ngreat work of self-preservation.", "uuid" : "2782ED0E", "_id" : { "$oid" : "5062965f5e0f8c0200000032" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[14]", "startOffset" : 6638, "end" : "/div[1]/div[14]", "endOffset" : 6887, "_id" : { "$oid" : "5062965f5e0f8c0200000033" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348638303681 }, "created" : { "$date" : 1348638303681 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50629ba0b4b40a0200000086", "user" : "sheilaxu@mit.edu", "username" : "Sheila X.", "text" : "In here, Philo commented that the world resembles a vegetable, but it seems in here that he was trying to illustrate a point that a vegetable is something to help to fuel the world and its processes. ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "If the universe bears a\ngreater likeness to animal bodies and to vegetables, than to the works of\nhuman art, it is more probable that its cause resembles the cause of the\nformer than that of the latter, and its origin ought rather to be\nascribed to generation or vegetation, than to reason or design.", "uuid" : "FE6E9A52", "_id" : { "$oid" : "50629ba0b4b40a0200000086" }, "permissions" : { "delete" : [ "sheilaxu@mit.edu" ], "update" : [ "sheilaxu@mit.edu" ], "admin" : [ "sheilaxu@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 280, "end" : "/div[1]/div[10]", "endOffset" : 581, "_id" : { "$oid" : "50629ba0b4b40a0200000087" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348639648781 }, "created" : { "$date" : 1348639648781 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50629c4bb4b40a0200000088", "user" : "sheilaxu@mit.edu", "username" : "Sheila X.", "text" : "He makes it sound like there are multiple gods of varying \"widsom\" and \"intelligence\" in designing the worlds, but in this case, it is interesting how he Cleanthes pointed out that the world is imperfect just because the infant God decided to not to complete his work in creating the world. ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "This world, for\naught he knows, is very faulty and imperfect, compared to a superior\nstandard; and was only the first rude essay of some infant deity, who\nafterwards abandoned it, ashamed of his lame performance: it is the work\nonly of some dependent, inferior deity; and is the object of derision to\nhis superiors: it is the production of old age and dotage in some\nsuperannuated deity; and ever since his death, has run on at adventures,\nfrom the first impulse and active force which it received from him.", "uuid" : "442F9F2F", "_id" : { "$oid" : "50629c4bb4b40a0200000088" }, "permissions" : { "delete" : [ "sheilaxu@mit.edu" ], "update" : [ "sheilaxu@mit.edu" ], "admin" : [ "sheilaxu@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 8723, "end" : "/div[1]/div[8]", "endOffset" : 9230, "_id" : { "$oid" : "50629c4bb4b40a0200000089" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348639819738 }, "created" : { "$date" : 1348639819738 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50629cd3b4b40a020000008a", "user" : "sheilaxu@mit.edu", "username" : "Sheila X.", "text" : "He's referring to incremental improvements over a long period of time through many people who had done trial and error, and the subsequent generations then improve upon the previous generations' mistakes. It makes sense, especially that it sounds mostly similar to the Darwinian evolution theory. ", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "If we survey a ship, what an exalted idea must we form of\nthe ingenuity of the carpenter who framed so complicated, useful, and\nbeautiful a machine? And what surprise must we feel, when we find him a\nstupid mechanic, who imitated others, and copied an art, which, through a\nlong succession of ages, after multiplied trials, mistakes, corrections,\ndeliberations, and controversies, had been gradually improving? Many\nworlds might have been botched and bungled, throughout an eternity, ere\nthis system was struck out; much labour lost, many fruitless trials made;\nand a slow, but continued improvement carried on during infinite ages in\nthe art of world-making.", "uuid" : "3FA8524A", "_id" : { "$oid" : "50629cd3b4b40a020000008a" }, "permissions" : { "delete" : [ "sheilaxu@mit.edu" ], "update" : [ "sheilaxu@mit.edu" ], "admin" : [ "sheilaxu@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 4722, "end" : "/div[1]/div[8]", "endOffset" : 5382, "_id" : { "$oid" : "50629cd3b4b40a020000008b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348639955018 }, "created" : { "$date" : 1348639955018 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5062b70db504800200000002", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "This is a sign of respect, but here, Babo is just trying to uphold the ruse", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "bowing his\nface", "uuid" : "ED958104", "_id" : { "$oid" : "5062b70db504800200000002" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [ "Bowing" ], "ranges" : [ { "start" : "/div[1]/p[48]", "startOffset" : 32, "end" : "/div[1]/p[48]", "endOffset" : 47, "_id" : { "$oid" : "5062b70db504800200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348646669514 }, "created" : { "$date" : 1348646669514 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5062b7d35e0f8c0200000034", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "Perhaps this could be a sign of Babo's hidden power. He is holding up the captain, the leader of the ship, representing his rule. Cereno only has the ability to delegate the ship because Babo is there with him, aiding him in more ways than one.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "black upholding the white", "uuid" : "9152D26D", "_id" : { "$oid" : "5062b7d35e0f8c0200000034" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [ "Upholding", "Body" ], "ranges" : [ { "start" : "/div[1]/p[50]", "startOffset" : 40, "end" : "/div[1]/p[50]", "endOffset" : 65, "_id" : { "$oid" : "5062b7d35e0f8c0200000035" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348646867027 }, "created" : { "$date" : 1348646867027 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5062b8085e0f8c0200000036", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "This can be translated as \"all according to plan\" I believe", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "a\ngood-natured grin", "uuid" : "40EAF58F", "_id" : { "$oid" : "5062b8085e0f8c0200000036" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [ "smile" ], "ranges" : [ { "start" : "/div[1]/p[149]", "startOffset" : 38, "end" : "/div[1]/p[149]", "endOffset" : 57, "_id" : { "$oid" : "5062b8085e0f8c0200000037" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348646920989 }, "created" : { "$date" : 1348646920989 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5062b8245e0f8c0200000038", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "I believe this to be the same as the other smile", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "an intelligent smile", "uuid" : "B0564981", "_id" : { "$oid" : "5062b8245e0f8c0200000038" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [ "smile" ], "ranges" : [ { "start" : "/div[1]/p[150]", "startOffset" : 64, "end" : "/div[1]/p[150]", "endOffset" : 84, "_id" : { "$oid" : "5062b8245e0f8c0200000039" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348646948549 }, "created" : { "$date" : 1348646948549 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5062b8795e0f8c020000003a", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "Babo's closeness has to do more with his careful watch of the captain to prevent any slip up on his part than his duty as a \"servant.\"", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "dutifully remaining within\ncall of a whisper.", "uuid" : "D2D3729F", "_id" : { "$oid" : "5062b8795e0f8c020000003a" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [ "closeness" ], "ranges" : [ { "start" : "/div[1]/p[166]", "startOffset" : 337, "end" : "/div[1]/p[166]", "endOffset" : 382, "_id" : { "$oid" : "5062b8795e0f8c020000003b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348647033844 }, "created" : { "$date" : 1348647033844 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5062b988b504800200000004", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "With every lie the captain tells, he appears ill. Now I know he is under duress, but could this also be one of his nervous habits?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "cringed the Spaniard", "uuid" : "768B0FA5", "_id" : { "$oid" : "5062b988b504800200000004" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[230]", "startOffset" : 19, "end" : "/div[1]/p[230]", "endOffset" : 39, "_id" : { "$oid" : "5062b988b504800200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348647304882 }, "created" : { "$date" : 1348647304882 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5062ba1e5e0f8c020000003c", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "Not only does he appear to be a responsible barber, but he has the ability to slit the captain's throat at a moment's notice.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "searched\namong the razors, as for the sharpest, and having\nfound it, gave it an additional edge by\nexpertly strapping it on the firm, smooth, oily\nskin of his open palm;", "uuid" : "FFA80FF8", "_id" : { "$oid" : "5062ba1e5e0f8c020000003c" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 34, "end" : "/div[1]/p[258]", "endOffset" : 203, "_id" : { "$oid" : "5062ba1e5e0f8c020000003d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348647454073 }, "created" : { "$date" : 1348647454073 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5062bcbab504800200000006", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "If done on purpose, cutting the captain served as a warning to the captain to stay better on top of things and cover up the rebellion more smoothly.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "here's Babo's\nfirst blood", "uuid" : "1EE897A8", "_id" : { "$oid" : "5062bcbab504800200000006" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[265]", "startOffset" : 583, "end" : "/div[1]/p[265]", "endOffset" : 608, "_id" : { "$oid" : "5062bcbab504800200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348648122392 }, "created" : { "$date" : 1348648122392 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5062bcfcb504800200000008", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "Or he wants to make sure that the captain got his hint that he was inches away from death at all times.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "seemed, by\nits expression, to hint, that he was desirous, by\ngetting his master to go on with the conversation,\nconsiderately to withdraw his attention\nfrom the recent annoying accident", "uuid" : "07DFA6F3", "_id" : { "$oid" : "5062bcfcb504800200000008" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[269]", "startOffset" : 127, "end" : "/div[1]/p[269]", "endOffset" : 313, "_id" : { "$oid" : "5062bcfcb504800200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348648188987 }, "created" : { "$date" : 1348648188987 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5062bdb75e0f8c020000003e" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348648375757 }, "groups" : [ "21L.003" ], "id" : "5062bdb75e0f8c020000003e", "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "quote" : "the creature of his own tasteful\nhands.", "ranges" : [ { "start" : "/div[1]/p[273]", "startOffset" : 461, "end" : "/div[1]/p[273]", "endOffset" : 500, "_id" : { "$oid" : "5062bdb75e0f8c020000003f" } } ], "tags" : [ "creature" ], "text" : "This is true in more ways than one. Babo has created the persona of a captain on this ship, and he wishes to make sure that Cereno is presented adequately so that the plan can continue.", "updated" : { "$date" : 1348648426872 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "uuid" : "61037034" } -{ "id" : "5062be30b50480020000000a", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "I believe that Babo cut himself. He wouldn't trust his captive with any type of weapon that close to his neck.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "holding his hand to his face", "uuid" : "E4E3CFEA", "_id" : { "$oid" : "5062be30b50480020000000a" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[277]", "startOffset" : 279, "end" : "/div[1]/p[277]", "endOffset" : 307, "_id" : { "$oid" : "5062be30b50480020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348648602537 }, "created" : { "$date" : 1348648496360 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5062be85b50480020000000c", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "Well played, Babo. He has shown himself to be powerless yet again, when he is actually the ringleader of the whole operation.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "timid reluctance he now re-entered\nthe cuddy", "uuid" : "F350AAC3", "_id" : { "$oid" : "5062be85b50480020000000c" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [ "acting" ], "ranges" : [ { "start" : "/div[1]/p[279]", "startOffset" : 58, "end" : "/div[1]/p[279]", "endOffset" : 103, "_id" : { "$oid" : "5062be85b50480020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348648581244 }, "created" : { "$date" : 1348648581244 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5062ef505e0f8c0200000040", "user" : "alex93@mit.edu", "username" : "Alexander O.", "text" : "This is clearly a point in which Cleanthes questions Demea's motives in thinking what he does. It almost seems irrelevant that being sincere in religion has anything to do with the belief that a deity doesn't resemble humans.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "It seems strange to me, said CLEANTHES, that you, DEMEA, who are so\nsincere in the cause of religion, should still maintain the mysterious,\nincomprehensible nature of the Deity, and should insist so strenuously\nthat he has no manner of likeness or resemblance to human creatures.", "uuid" : "8EA482B5", "_id" : { "$oid" : "5062ef505e0f8c0200000040" }, "permissions" : { "delete" : [ "alex93@mit.edu" ], "update" : [ "alex93@mit.edu" ], "admin" : [ "alex93@mit.edu" ], "read" : [ "alex93@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]", "startOffset" : 12, "end" : "/div[1]/div[7]", "endOffset" : 291, "_id" : { "$oid" : "5062ef505e0f8c0200000041" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348661072599 }, "created" : { "$date" : 1348661072599 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5062f036b50480020000000e", "user" : "alex93@mit.edu", "username" : "Alexander O.", "text" : "\"According to the true system of Theism\" demonstrates the strong view the speaker has on the topic. This is a solid example of how \"Natural Religion\" is supported in the piece.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "All the new discoveries in astronomy, which prove the immense grandeur\nand magnificence of the works of Nature, are so many additional arguments\nfor a Deity, according to the true system of Theism", "uuid" : "40FD1FE8", "_id" : { "$oid" : "5062f036b50480020000000e" }, "permissions" : { "delete" : [ "alex93@mit.edu" ], "update" : [ "alex93@mit.edu" ], "admin" : [ "alex93@mit.edu" ], "read" : [ "alex93@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]", "startOffset" : 597, "end" : "/div[1]/div[8]", "endOffset" : 793, "_id" : { "$oid" : "5062f036b50480020000000f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348661302624 }, "created" : { "$date" : 1348661302624 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5062f12db504800200000010", "user" : "alex93@mit.edu", "username" : "Alexander O.", "text" : "Although this analogy seems very stretched, it shows the connection Philo tries to bridge between modern replication with the creation of years and years ago.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "A comet, for instance, is the seed of a world;\nand after it has been fully ripened, by passing from sun to sun, and star\nto star, it is at last tossed into the unformed elements which every\nwhere surround this universe, and immediately sprouts up into a new\nsystem.", "uuid" : "5661E33E", "_id" : { "$oid" : "5062f12db504800200000010" }, "permissions" : { "delete" : [ "alex93@mit.edu" ], "update" : [ "alex93@mit.edu" ], "admin" : [ "alex93@mit.edu" ], "read" : [ "alex93@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 2580, "end" : "/div[1]/div[10]", "endOffset" : 2846, "_id" : { "$oid" : "5062f12db504800200000011" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348661549135 }, "created" : { "$date" : 1348661549135 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5062f1b15e0f8c0200000042", "user" : "alex93@mit.edu", "username" : "Alexander O.", "text" : "At this point, the arguments are shifting to a more emotional side of proving natural religion. It seems as though it isn't enough to prove natural religion; one must \"feel\" it as well.", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "The miseries of life; the unhappiness of man;\nthe general corruptions of our nature; the unsatisfactory enjoyment of\npleasures, riches, honours; these phrases have become almost proverbial\nin all languages", "uuid" : "FC6390B0", "_id" : { "$oid" : "5062f1b15e0f8c0200000042" }, "permissions" : { "delete" : [ "alex93@mit.edu" ], "update" : [ "alex93@mit.edu" ], "admin" : [ "alex93@mit.edu" ], "read" : [ "alex93@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[13]", "startOffset" : 1383, "end" : "/div[1]/div[13]", "endOffset" : 1588, "_id" : { "$oid" : "5062f1b15e0f8c0200000043" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348661681883 }, "created" : { "$date" : 1348661681883 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50634c2fb504800200000012", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Cereno is as if already dead?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "skeleton", "uuid" : "7ED8C212", "_id" : { "$oid" : "50634c2fb504800200000012" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 1831, "end" : "/div[1]/p[24]", "endOffset" : 1839, "_id" : { "$oid" : "50634c2fb504800200000013" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348684847862 }, "created" : { "$date" : 1348684847862 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50634c6bb504800200000014", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Excellent foreshadowing. Babo is up to something with his servitude.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "But the good conduct of Babo, hardly more\nthan the ill-behavior of others, seemed to withdraw\nthe half-lunatic Don Benito from his\ncloudy languor.", "uuid" : "C61A14FA", "_id" : { "$oid" : "50634c6bb504800200000014" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[26]", "startOffset" : 0, "end" : "/div[1]/p[26]", "endOffset" : 146, "_id" : { "$oid" : "50634c6bb504800200000015" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348684907000 }, "created" : { "$date" : 1348684907000 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50634caab504800200000016", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "High density of body related words.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "opened out far down the chest, revealing\na soiled under garment of what seemed the\nfinest linen, edged, about the neck, with a\nnarrow blue ribbon, sadly faded and worn.", "uuid" : "40ACF63C", "_id" : { "$oid" : "50634caab504800200000016" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[147]", "startOffset" : 323, "end" : "/div[1]/p[147]", "endOffset" : 493, "_id" : { "$oid" : "50634caab504800200000017" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348684970521 }, "created" : { "$date" : 1348684970521 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50634cfe5e0f8c0200000045", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Body language is important to self too.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "And\nyet, when he roused himself, dilated his chest,\nfelt himself strong on his legs, and coolly considered\nit—what did all these phantoms amount\nto?", "uuid" : "2F936ED7", "_id" : { "$oid" : "50634cfe5e0f8c0200000045" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[156]", "startOffset" : 357, "end" : "/div[1]/p[156]", "endOffset" : 506, "_id" : { "$oid" : "50634cfe5e0f8c0200000046" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348685054119 }, "created" : { "$date" : 1348685054119 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50634d405e0f8c0200000047", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Pretty gigantic clue.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Suddenly, one of the\nblack boys, enraged at a word dropped by one\nof his white companions, seized a knife, and,\n[pg 141]\n\nthough called to forbear by one of the oakum-pickers,\nstruck the lad over the head, inflicting\na gash from which blood flowed.", "uuid" : "0A0584F0", "_id" : { "$oid" : "50634d405e0f8c0200000047" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[61]", "startOffset" : 324, "end" : "/div[1]/p[61]", "endOffset" : 572, "_id" : { "$oid" : "50634d405e0f8c0200000048" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348685120702 }, "created" : { "$date" : 1348685120702 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50634d73b504800200000018", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Body language replaces actual language. Also, there is a lot of irony in this scene.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Upon this, the black, slowly raising both\narms, let them lifelessly fall, his links clanking,\nhis head bowed; as much as to say, \"no, I am\ncontent.\"", "uuid" : "F1BAF79B", "_id" : { "$oid" : "50634d73b504800200000018" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[96]", "startOffset" : 0, "end" : "/div[1]/p[96]", "endOffset" : 148, "_id" : { "$oid" : "50634d73b504800200000019" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348685171463 }, "created" : { "$date" : 1348685171463 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50634d83b50480020000001a", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Heh?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "\"Go,\" said Don Benito, with inkept and\nunknown emotion.", "uuid" : "8C875B82", "_id" : { "$oid" : "50634d83b50480020000001a" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[97]", "startOffset" : 0, "end" : "/div[1]/p[97]", "endOffset" : 55, "_id" : { "$oid" : "50634d83b50480020000001b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348685187280 }, "created" : { "$date" : 1348685187010 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50634daf5e0f8c0200000049", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Great sense of irony here.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "\"He may have some right to it,\" bitterly returned\nDon Benito, \"he says he was king in his\nown land.\"", "uuid" : "FBAEF89C", "_id" : { "$oid" : "50634daf5e0f8c0200000049" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[108]", "startOffset" : 0, "end" : "/div[1]/p[108]", "endOffset" : 101, "_id" : { "$oid" : "50634daf5e0f8c020000004a" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348685231662 }, "created" : { "$date" : 1348685231662 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50634de5b50480020000001c", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Body-3$%5ing-Language.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Biting his lip, Don Benito faltered.", "uuid" : "1725F91E", "_id" : { "$oid" : "50634de5b50480020000001c" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[114]", "startOffset" : 0, "end" : "/div[1]/p[114]", "endOffset" : 36, "_id" : { "$oid" : "50634de5b50480020000001d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348685285462 }, "created" : { "$date" : 1348685285462 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50634e65b50480020000001e", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Is the head truly the subtle part here?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "that hive of subtlety", "uuid" : "8E730391", "_id" : { "$oid" : "50634e65b50480020000001e" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[416]", "startOffset" : 165, "end" : "/div[1]/p[416]", "endOffset" : 187, "_id" : { "$oid" : "50634e65b50480020000001f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348685413869 }, "created" : { "$date" : 1348685413869 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50634ea85e0f8c020000004b", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Obvious signs of nervousness. Misinterpreted as hypochondria.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "like some\nhypochondriac abbot he moved slowly about,\nat times suddenly pausing, starting, or staring,\nbiting his lip, biting his finger-nail, flushing,\npaling, twitching his beard, with other symptoms\nof an absent or moody mind.", "uuid" : "16BB6C21", "_id" : { "$oid" : "50634ea85e0f8c020000004b" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 1411, "end" : "/div[1]/p[24]", "endOffset" : 1640, "_id" : { "$oid" : "50634ea85e0f8c020000004c" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348685480952 }, "created" : { "$date" : 1348685480952 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50634f75b504800200000020", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : "Babo is brilliant at marking. Keeps the focus off suspicious things or moments of stillness. No time to think, only time to make moves, Babo sees farther.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "\"His mind wanders. He was thinking of\nthe plague that followed the gales,\" plaintively\nsighed the servant; \"my poor, poor master!\"\nwringing one hand, and with the other\nwiping the mouth.", "uuid" : "30A85743", "_id" : { "$oid" : "50634f75b504800200000020" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[40]", "startOffset" : 0, "end" : "/div[1]/p[40]", "endOffset" : 186, "_id" : { "$oid" : "50634f75b504800200000021" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348685685123 }, "created" : { "$date" : 1348685685123 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506356235e0f8c020000005d", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "I don't know how usual this would be during slave times, for a slave and a master to go on as if nothing had happened after the master cut them.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Don\nBenito leaning on his servant as if nothing had\nhappened.", "uuid" : "F6777C7F", "_id" : { "$oid" : "506356235e0f8c020000005d" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[280]", "startOffset" : 37, "end" : "/div[1]/p[280]", "endOffset" : 98, "_id" : { "$oid" : "506356235e0f8c020000005e" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348687395704 }, "created" : { "$date" : 1348687395704 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5063691db50480020000002c" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348692253611 }, "groups" : [ "21L.000", "21L.000J" ], "id" : "5063691db50480020000002c", "permissions" : { "delete" : [ "deldar@mit.edu" ], "update" : [ "deldar@mit.edu" ], "admin" : [ "deldar@mit.edu" ], "read" : [ "deldar@mit.edu" ] }, "quote" : "But I was in reality very ill, and surely nothing but the unbounded and unremitting attentions of my friend could have restored me to life.", "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 0, "end" : "/div[1]/p[21]", "endOffset" : 139, "_id" : { "$oid" : "5063691db50480020000002d" } } ], "tags" : [ "Life" ], "text" : "How interesting that such a dichotomy in health exists between Frankenstein and his monster. As Victor grants the sad wretch life, he must be reanimated himself.", "updated" : { "$date" : 1348692325023 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "deldar@mit.edu", "username" : "Daniel E.", "uuid" : "45BAFBE6" } -{ "id" : "50636a2eb50480020000002e", "user" : "deldar@mit.edu", "username" : "Daniel E.", "text" : "According to Frankenstein, that which was once alive and reanimated is not worth as much disgust as his hacked-together novel creature", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "A mummy again endued with animation could not be so hideous as that wretch.", "uuid" : "B1DD01B7", "_id" : { "$oid" : "50636a2eb50480020000002e" }, "permissions" : { "delete" : [ "deldar@mit.edu" ], "update" : [ "deldar@mit.edu" ], "admin" : [ "deldar@mit.edu" ], "read" : [ "deldar@mit.edu" ] }, "tags" : [ "Creation" ], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 60, "end" : "/div[1]/p[4]", "endOffset" : 135, "_id" : { "$oid" : "50636a2eb50480020000002f" } } ], "groups" : [ "21L.000", "21L.000J" ], "updated" : { "$date" : 1348692526761 }, "created" : { "$date" : 1348692526761 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 2, "_id" : { "$oid" : "50636b53b504800200000030" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348692819411 }, "groups" : [ "21L.000", "21L.000J" ], "id" : "50636b53b504800200000030", "permissions" : { "delete" : [ "deldar@mit.edu" ], "update" : [ "deldar@mit.edu" ], "admin" : [ "deldar@mit.edu" ], "read" : [ "deldar@mit.edu" ] }, "quote" : "I had worked hard for nearly two years, for the sole purpose of infusing life into an inanimate body. For this I had deprived myself of rest and health.", "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 87, "end" : "/div[1]/p[3]", "endOffset" : 239, "_id" : { "$oid" : "50636b53b504800200000031" } } ], "tags" : [ "Life", "Exchange" ], "text" : "He essentially extracts life energy from himself in his torment and fervent passion for years in order to make his greatest discovery corporeal.", "updated" : { "$date" : 1348692866834 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "user" : "deldar@mit.edu", "username" : "Daniel E.", "uuid" : "2CECF987" } -{ "id" : "50636eecb504800200000032", "user" : "deldar@mit.edu", "username" : "Daniel E.", "text" : "The joy of discovery and the zeal he once possessed so quickly turns into words of more negative connotation like anxiety, and agony. There's some drastic change in language from the previous chapter to this one. What changed exactly?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "With an anxiety that almost amounted to agony", "uuid" : "58113BC8", "_id" : { "$oid" : "50636eecb504800200000032" }, "permissions" : { "delete" : [ "deldar@mit.edu" ], "update" : [ "deldar@mit.edu" ], "admin" : [ "deldar@mit.edu" ], "read" : [ "deldar@mit.edu" ] }, "tags" : [ "Language" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 83, "end" : "/div[1]/p[1]", "endOffset" : 128, "_id" : { "$oid" : "50636eecb504800200000033" } } ], "groups" : [ "21L.000", "21L.000J" ], "updated" : { "$date" : 1348693740986 }, "created" : { "$date" : 1348693740986 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50644bfecf36f30200000002", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "He was thinking of getting his ship taken over", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "He was thinking of\nthe plague that followed the gales", "uuid" : "C6C75C1E", "_id" : { "$oid" : "50644bfecf36f30200000002" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[40]", "startOffset" : 19, "end" : "/div[1]/p[40]", "endOffset" : 72, "_id" : { "$oid" : "50644bfecf36f30200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348750334882 }, "created" : { "$date" : 1348750334882 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5064a2d0cf36f30200000004", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Which is the truth; at this point he is not a slave.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "slave\nI cannot call him", "uuid" : "88D7CA27", "_id" : { "$oid" : "5064a2d0cf36f30200000004" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[49]", "startOffset" : 80, "end" : "/div[1]/p[49]", "endOffset" : 103, "_id" : { "$oid" : "5064a2d0cf36f30200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348772560499 }, "created" : { "$date" : 1348772560499 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5064bcf3cf36f30200000006", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "This is probably the reason why Benito's face lit up", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "three of his best seamen for temporary deck\nofficers", "uuid" : "02953F29", "_id" : { "$oid" : "5064bcf3cf36f30200000006" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[54]", "startOffset" : 454, "end" : "/div[1]/p[54]", "endOffset" : 506, "_id" : { "$oid" : "5064bcf3cf36f30200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348779251915 }, "created" : { "$date" : 1348779251915 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5064cda8e390bc0200000002", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Body is gone, head on a spike. But still, Babo looks over in pseudo victory--he has wrought the death of his captor, and of the man who was his end. The Body is gone, but Babo's spirit lives on in the aftermath of the events he set in motion.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "The body was burned to ashes; but for\nmany days, the head, that hive of subtlety,\nfixed on a pole in the Plaza, met, unabashed,\nthe gaze of the whites; and across the Plaza\nlooked towards St. Bartholomew's church, in\nwhose vaults slept then, as now, the recovered\nbones of Aranda: and across the Rimac bridge\nlooked towards the monastery, on Mount Agonia\nwithout; where, three months after being\ndismissed by the court, Benito Cereno, borne\non the bier, did, indeed, follow his leader.", "uuid" : "C6E181BB", "_id" : { "$oid" : "5064cda8e390bc0200000002" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[416]", "startOffset" : 107, "end" : "/div[1]/p[416]", "endOffset" : 592, "_id" : { "$oid" : "5064cda8e390bc0200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348783528024 }, "created" : { "$date" : 1348783528024 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5064cef5e390bc0200000004", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "A refreshing image in my opinion, however, something you'd see in a painting, not actually in the woods. hmmm", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "like a doe in the shade of a woodland\nrock", "uuid" : "1F785CF9", "_id" : { "$oid" : "5064cef5e390bc0200000004" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[181]", "startOffset" : 188, "end" : "/div[1]/p[181]", "endOffset" : 230, "_id" : { "$oid" : "5064cef5e390bc0200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348783861441 }, "created" : { "$date" : 1348783861441 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5064d253cf36f30200000008", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Captain Delano believes exactly what he sees, he believes the body an exact expression of the mind.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "There's naked nature, now; pure tenderness\nand love, thought Captain Delano,\nwell pleased.", "uuid" : "FA808C9A", "_id" : { "$oid" : "5064d253cf36f30200000008" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[183]", "startOffset" : 0, "end" : "/div[1]/p[183]", "endOffset" : 90, "_id" : { "$oid" : "5064d253cf36f30200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348784723113 }, "created" : { "$date" : 1348784723113 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5064d2a9cf36f3020000000a", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Important distinction", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "as if", "uuid" : "BFC52795", "_id" : { "$oid" : "5064d2a9cf36f3020000000a" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[182]", "startOffset" : 117, "end" : "/div[1]/p[182]", "endOffset" : 123, "_id" : { "$oid" : "5064d2a9cf36f3020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348784809592 }, "created" : { "$date" : 1348784809592 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50650840e390bc020000000c", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Delano observed B/C to be feeble", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "debility, constitutional or induced by\nhardships, bodily and mental, of the Spanish\ncaptain", "uuid" : "5B36015E", "_id" : { "$oid" : "50650840e390bc020000000c" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [ "B/C", "weak" ], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 780, "end" : "/div[1]/p[24]", "endOffset" : 871, "_id" : { "$oid" : "50650840e390bc020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348798528268 }, "created" : { "$date" : 1348798528268 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50650980cf36f3020000000c", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Delano perceived B/C to be spiritless, empty-minded.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "hypochondriac abbot he moved slowly about,\nat times suddenly pausing, starting, or staring,\nbiting his lip, biting his finger-nail, flushing,\npaling, twitching his beard, with other symptoms\nof an absent or moody mind.", "uuid" : "0031C048", "_id" : { "$oid" : "50650980cf36f3020000000c" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [ "B/C", "sad" ], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 1421, "end" : "/div[1]/p[24]", "endOffset" : 1639, "_id" : { "$oid" : "50650980cf36f3020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348798848681 }, "created" : { "$date" : 1348798848681 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506509a0cf36f3020000000e", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "B/C was not a fit person.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "tall,\nbut seemed never to have been robust, and now\nwith nervous suffering was almost worn to a\nskeleton", "uuid" : "D636CF40", "_id" : { "$oid" : "506509a0cf36f3020000000e" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [ "B/C", "weak" ], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 1735, "end" : "/div[1]/p[24]", "endOffset" : 1839, "_id" : { "$oid" : "506509a0cf36f3020000000f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348798880186 }, "created" : { "$date" : 1348798880186 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50650a2ccf36f30200000010", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "B/C's voice---hallow.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "His voice was like that of one with\nlungs half gone—hoarsely suppressed, a husky\nwhisper.", "uuid" : "D6B0C88B", "_id" : { "$oid" : "50650a2ccf36f30200000010" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [ "B/C", "voice" ], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 1920, "end" : "/div[1]/p[24]", "endOffset" : 2009, "_id" : { "$oid" : "50650a2ccf36f30200000011" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348799020259 }, "created" : { "$date" : 1348799020259 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50650ba1e390bc020000000e", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Pale like he always is, or pale because he has to continue to lie?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "pale", "uuid" : "0009443F", "_id" : { "$oid" : "50650ba1e390bc020000000e" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[62]", "startOffset" : 68, "end" : "/div[1]/p[62]", "endOffset" : 72, "_id" : { "$oid" : "50650ba1e390bc020000000f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348799393154 }, "created" : { "$date" : 1348799393154 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50650bcce390bc0200000010", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "state of mental inactivity", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "torpor,", "uuid" : "141472A9", "_id" : { "$oid" : "50650bcce390bc0200000010" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[64]", "startOffset" : 125, "end" : "/div[1]/p[64]", "endOffset" : 133, "_id" : { "$oid" : "50650bcce390bc0200000011" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348799436534 }, "created" : { "$date" : 1348799436534 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50650c582fbadc0200000002", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "B/C was reluctant to tell this ship's story.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Don Benito faltered; then, like some somnambulist\nsuddenly interfered with, vacantly\nstared at his visitor, and ended by looking\ndown on the deck.", "uuid" : "B277C886", "_id" : { "$oid" : "50650c582fbadc0200000002" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [ "B/C", "uneasy" ], "ranges" : [ { "start" : "/div[1]/p[33]", "startOffset" : 0, "end" : "/div[1]/p[33]", "endOffset" : 146, "_id" : { "$oid" : "50650c582fbadc0200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348799576269 }, "created" : { "$date" : 1348799576269 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50650c7d2fbadc0200000004", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "throwing dead men overboard", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "all—like scraps to the dogs—to throw all to\nthe sharks!", "uuid" : "6A0C313E", "_id" : { "$oid" : "50650c7d2fbadc0200000004" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[82]", "startOffset" : 443, "end" : "/div[1]/p[82]", "endOffset" : 499, "_id" : { "$oid" : "50650c7d2fbadc0200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348799613749 }, "created" : { "$date" : 1348799613749 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50650cb62fbadc0200000006" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348799670989 }, "groups" : [ "21L.003" ], "id" : "50650cb62fbadc0200000006", "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "quote" : "Here there was a sudden fainting attack of\nhis cough, brought on, no doubt, by his mental\ndistress.", "ranges" : [ { "start" : "/div[1]/p[36]", "startOffset" : 0, "end" : "/div[1]/p[36]", "endOffset" : 99, "_id" : { "$oid" : "50650cb62fbadc0200000007" } } ], "tags" : [ "B/C", "uneasy" ], "text" : "B/C fainted in the midst of telling the story. When compelled to tell a lie, he could not help being terrified at what was done to his men.", "updated" : { "$date" : 1348799848782 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "uuid" : "BD1F9747" } -{ "id" : "50650ce32fbadc0200000008", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "His conclusion is sound, but based on false conditions. The friend remains on the ship, but not in a good way.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Were\nyour friend's remains now on board this ship,\nDon Benito, not thus strangely would the\nmention of his name affect you.\"", "uuid" : "FF6A45BE", "_id" : { "$oid" : "50650ce32fbadc0200000008" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[82]", "startOffset" : 713, "end" : "/div[1]/p[82]", "endOffset" : 837, "_id" : { "$oid" : "50650ce32fbadc0200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348799715718 }, "created" : { "$date" : 1348799715718 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50650ce6cf36f30200000012", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Babo fixed his eyes on B/C's face when he fainted---seemingly expressing concern, actually enforcing control?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "keeping his eye\nfixed on his face", "uuid" : "20D68BBF", "_id" : { "$oid" : "50650ce6cf36f30200000012" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [ "Babo", "control" ], "ranges" : [ { "start" : "/div[1]/p[36]", "startOffset" : 348, "end" : "/div[1]/p[36]", "endOffset" : 381, "_id" : { "$oid" : "50650ce6cf36f30200000013" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348799718660 }, "created" : { "$date" : 1348799718660 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50650d51cf36f30200000014", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "So in a sense, Aranda got a proper burial on solid ground because he was tied to the ship the whole time, instead of thrown overboard.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "or embalming his\nmortal part for interment on shore", "uuid" : "179ADCF5", "_id" : { "$oid" : "50650d51cf36f30200000014" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[82]", "startOffset" : 660, "end" : "/div[1]/p[82]", "endOffset" : 711, "_id" : { "$oid" : "50650d51cf36f30200000015" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348799825777 }, "created" : { "$date" : 1348799825777 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50650d90cf36f30200000016", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Babo was trying to make sure that B/C stays on the right track of the story.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "He was thinking of\nthe plague that followed the gales", "uuid" : "D0491E4A", "_id" : { "$oid" : "50650d90cf36f30200000016" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [ "Babo", "control" ], "ranges" : [ { "start" : "/div[1]/p[40]", "startOffset" : 19, "end" : "/div[1]/p[40]", "endOffset" : 72, "_id" : { "$oid" : "50650d90cf36f30200000017" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348799888715 }, "created" : { "$date" : 1348799888715 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50650f47cf36f30200000018", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "B/C fainted when he said he needed to thank the blacks for surviving the disasters.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "huskily\ncontinued Don Benito, painfully turning in the\nhalf embrace of his servant, \"I have to thank\nthose negroes you see, who, though to your\ninexperienced eyes appearing unruly, have, indeed,\nconducted themselves with less of restlessness\nthan even their owner could have\nthought possible under such circumstances.\"\n\nHere he again fell faintly back.", "uuid" : "079CDA93", "_id" : { "$oid" : "50650f47cf36f30200000018" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [ "B/C", "uneasy" ], "ranges" : [ { "start" : "/div[1]/p[43]", "startOffset" : 35, "end" : "/div[1]/p[44]", "endOffset" : 32, "_id" : { "$oid" : "50650f47cf36f30200000019" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348800327859 }, "created" : { "$date" : 1348800327859 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50650f88cf36f3020000001a" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348800392624 }, "groups" : [ "21L.003" ], "id" : "50650f88cf36f3020000001a", "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "quote" : "Once more the faintness returned", "ranges" : [ { "start" : "/div[1]/p[46]", "startOffset" : 0, "end" : "/div[1]/p[46]", "endOffset" : 32, "_id" : { "$oid" : "50650f88cf36f3020000001b" } } ], "tags" : [ "B/C", "uneasy" ], "text" : "B/C fainted when he admitted that the Negroes did not need to be constrained with fetters.", "updated" : { "$date" : 1348800408793 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "uuid" : "3554017B" } -{ "id" : "506510752fbadc020000000a", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "But indeed, a fallacy.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "denoting their\nrelative positions", "uuid" : "E68359F5", "_id" : { "$oid" : "506510752fbadc020000000a" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[50]", "startOffset" : 299, "end" : "/div[1]/p[50]", "endOffset" : 332, "_id" : { "$oid" : "506510752fbadc020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348800629649 }, "created" : { "$date" : 1348800629649 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50651117cf36f3020000001e", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "indeed, he is.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "o, I am\ncontent", "uuid" : "C3932712", "_id" : { "$oid" : "50651117cf36f3020000001e" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[96]", "startOffset" : 131, "end" : "/div[1]/p[96]", "endOffset" : 146, "_id" : { "$oid" : "50651117cf36f3020000001f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348800791871 }, "created" : { "$date" : 1348800791871 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506517abcf36f30200000022", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "B/C also exhibits vacancy in his speech when he agrees to Delano's ideas yet could not do anything about it.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "vacant response", "uuid" : "40B123A0", "_id" : { "$oid" : "506517abcf36f30200000022" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [ "B/C", "uneasy" ], "ranges" : [ { "start" : "/div[1]/p[69]", "startOffset" : 21, "end" : "/div[1]/p[69]", "endOffset" : 36, "_id" : { "$oid" : "506517abcf36f30200000023" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348802475415 }, "created" : { "$date" : 1348802475415 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "506517dbcf36f30200000024" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348802523266 }, "groups" : [ "21L.003" ], "id" : "506517dbcf36f30200000024", "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "quote" : "his air was\nheart-broken; his knees shook", "ranges" : [ { "start" : "/div[1]/p[76]", "startOffset" : 27, "end" : "/div[1]/p[76]", "endOffset" : 68, "_id" : { "$oid" : "5067b6b2bddb24020000000c" } } ], "tags" : [ "B/C", "uneasy" ], "text" : "Air---Delano perceives/feels; knees---Delano observes. Heartbroken---grief; shaken knees---fear.", "updated" : { "$date" : 1348981454352 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "uuid" : "171A02FE" } -{ "id" : "50651aad2fbadc020000000e", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "B/C's attitude is a consequence of his not being in control.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "nervously averting\nhis glance, as if shunning, by anticipation,\nsome rebellious response, in a disconcerted\nvoice", "uuid" : "EB1118E8", "_id" : { "$oid" : "50651aad2fbadc020000000e" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [ "B/C", "uneasy" ], "ranges" : [ { "start" : "/div[1]/p[91]", "startOffset" : 27, "end" : "/div[1]/p[91]", "endOffset" : 140, "_id" : { "$oid" : "50651aad2fbadc020000000f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348803245296 }, "created" : { "$date" : 1348803245296 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50651ccd2fbadc0200000010", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "B/C has no power at all---yet he cannot reveal the truth.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Biting his lip, Don Benito faltered.", "uuid" : "ABD14E51", "_id" : { "$oid" : "50651ccd2fbadc0200000010" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[114]", "startOffset" : 0, "end" : "/div[1]/p[114]", "endOffset" : 36, "_id" : { "$oid" : "50651ccd2fbadc0200000011" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348803789634 }, "created" : { "$date" : 1348803789634 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065226a2fbadc0200000012", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Babo is good at acting", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "silent\nappeal", "uuid" : "BD886ED5", "_id" : { "$oid" : "5065226a2fbadc0200000012" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[83]", "startOffset" : 180, "end" : "/div[1]/p[83]", "endOffset" : 193, "_id" : { "$oid" : "5065226a2fbadc0200000013" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348805226406 }, "created" : { "$date" : 1348805226406 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506527d6cf36f30200000028", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "B/C's appearance.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : ", whose clearness of cut was refined\nby the thinness, incident to ill-health, as\nwell as ennobled about the chin by the beard.", "uuid" : "548CFAFD", "_id" : { "$oid" : "506527d6cf36f30200000028" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [ "B/C" ], "ranges" : [ { "start" : "/div[1]/p[122]", "startOffset" : 142, "end" : "/div[1]/p[122]", "endOffset" : 268, "_id" : { "$oid" : "506527d6cf36f30200000029" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348806614877 }, "created" : { "$date" : 1348806614877 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50652856cf36f3020000002a", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "He's embarrassed because he does not wish to obtain the information about Delano's ship.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "even more than his usual embarrassment, and a\nstrange sort of intriguing intonation in his\nhusky whisper", "uuid" : "AF50D9CE", "_id" : { "$oid" : "50652856cf36f3020000002a" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [ "B/C", "uneasy" ], "ranges" : [ { "start" : "/div[1]/p[124]", "startOffset" : 138, "end" : "/div[1]/p[124]", "endOffset" : 242, "_id" : { "$oid" : "50652856cf36f3020000002b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348806742151 }, "created" : { "$date" : 1348806742151 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506529112fbadc0200000014", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "B/C no longer wants to proceed on this topic, thus looking down; yet Babo forces him to continue.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "instead of meeting the\nglance, with every token of craven discomposure\ndropped his eyes to the deck; presenting\nan unworthy contrast to his servant, who, just\nthen, was kneeling at his feet, adjusting a loose\nshoe-buckle; his disengaged face meantime,\n[pg 157]\n\nwith humble curiosity, turned openly up into\nhis master's downcast one.", "uuid" : "89A38301", "_id" : { "$oid" : "506529112fbadc0200000014" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [ "B/C", "Babo" ], "ranges" : [ { "start" : "/div[1]/p[140]", "startOffset" : 152, "end" : "/div[1]/p[140]", "endOffset" : 486, "_id" : { "$oid" : "506529112fbadc0200000015" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348806929314 }, "created" : { "$date" : 1348806929314 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50652a6ccf36f3020000002c", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "What is his facial expression while he is looking away?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "averting\nhis glance", "uuid" : "849F0272", "_id" : { "$oid" : "50652a6ccf36f3020000002c" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[95]", "startOffset" : 33, "end" : "/div[1]/p[95]", "endOffset" : 52, "_id" : { "$oid" : "50652a6ccf36f3020000002d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348807276062 }, "created" : { "$date" : 1348807276062 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50652b052fbadc0200000016", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "because the slave is in control, so there is some truth to the statement", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "bitterly", "uuid" : "0C3A5C10", "_id" : { "$oid" : "50652b052fbadc0200000016" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[108]", "startOffset" : 31, "end" : "/div[1]/p[108]", "endOffset" : 41, "_id" : { "$oid" : "50652b052fbadc0200000017" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348807429553 }, "created" : { "$date" : 1348807429553 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50652b61cf36f3020000002e", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Makes the issue of good vs evil more complex", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Babo here, in his own land,\nwas only a poor slave; a black man's slave was\nBabo, who now is the white's.\"", "uuid" : "9C8A0D7C", "_id" : { "$oid" : "50652b61cf36f3020000002e" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[109]", "startOffset" : 107, "end" : "/div[1]/p[109]", "endOffset" : 212, "_id" : { "$oid" : "50652b61cf36f3020000002f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348807521752 }, "created" : { "$date" : 1348807521752 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50652beccf36f30200000030", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Babo is putting him up to it.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "The Spaniard, still with a guilty shuffle, repeated\nhis question", "uuid" : "35B1B8BC", "_id" : { "$oid" : "50652beccf36f30200000030" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[141]", "startOffset" : 0, "end" : "/div[1]/p[141]", "endOffset" : 64, "_id" : { "$oid" : "50652beccf36f30200000031" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348807660592 }, "created" : { "$date" : 1348807660592 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50652d59cf36f30200000032", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Scene of interest", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "[pg 172]", "uuid" : "A6A126C8", "_id" : { "$oid" : "50652d59cf36f30200000032" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[176]/i[1]", "startOffset" : 0, "end" : "/div[1]/p[176]/i[1]", "endOffset" : 8, "_id" : { "$oid" : "50652d59cf36f30200000033" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348808025825 }, "created" : { "$date" : 1348808025825 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "506536e52fbadc0200000018" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348810469531 }, "groups" : [ "21L.000J" ], "id" : "506536e52fbadc0200000018", "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "quote" : "no mortal could support the horror of that countenance. \nA mummy again endued with animation could not be so hideous as that wretch", "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 4, "end" : "/div[1]/p[4]", "endOffset" : 135, "_id" : { "$oid" : "506536e52fbadc0200000019" } } ], "tags" : [], "text" : "Why is Frankentstein not proud that he has essentially found the formula for the secret of life?", "updated" : { "$date" : 1348810584409 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "uuid" : "C6109585" } -{ "id" : "506539802fbadc020000001a", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "It's interesting how Victors dreams (both in the scientific pursuit sense and physical sleeping dreams) are the current source of his pain and suffering. Very ironic.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "Mingled with \nthis horror, I felt the bitterness of disappointment: dreams that had been my \nfood and pleasant rest for so long a space, were now become a hell to me; and \nthe change was so rapid, the overthrow so complete!", "uuid" : "BA55D01F", "_id" : { "$oid" : "506539802fbadc020000001a" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 202, "end" : "/div[1]/p[5]", "endOffset" : 425, "_id" : { "$oid" : "506539802fbadc020000001b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348811136316 }, "created" : { "$date" : 1348811136316 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506539f12fbadc020000001c", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "While still being the perfect \"scary setting\" it also helps to sorta set the mood for the monster in which he was about to create.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "IT was on a dreary night of November", "uuid" : "F13E90A0", "_id" : { "$oid" : "506539f12fbadc020000001c" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 0, "end" : "/div[1]/p[1]", "endOffset" : 36, "_id" : { "$oid" : "506539f12fbadc020000001d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348811249851 }, "created" : { "$date" : 1348811249851 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50653a8ecf36f30200000034", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "It's funny how he's complaining about his pains because when a female gives birth she actually has physical pains. In contrast though, Frankentstein was in \"labor\" for twice as long as your typical female. Yet somehow his creature was still and ugly dissapointment.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "How can I describe my emotions at this catastrophe, or how \ndelineate the wretch whom with such infinite pains and care I had endeavoured to \nform?", "uuid" : "DCFC8D64", "_id" : { "$oid" : "50653a8ecf36f30200000034" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 0, "end" : "/div[1]/p[2]", "endOffset" : 147, "_id" : { "$oid" : "50653a8ecf36f30200000035" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348811406834 }, "created" : { "$date" : 1348811406834 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50653d5acf36f30200000036", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "Interesting how Victor seems to care so much more about Clerval's condition now than his own. Usually it's the otherway around in which everyone cares about Victor and yet Victor cares about no one but himself.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "Poor Clerval! what must have been his feelings?", "uuid" : "B782C684", "_id" : { "$oid" : "50653d5acf36f30200000036" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[23]", "startOffset" : 0, "end" : "/div[1]/p[23]", "endOffset" : 48, "_id" : { "$oid" : "50653d5acf36f30200000037" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348812122546 }, "created" : { "$date" : 1348812122546 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065a1ce38bb460200000002", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "He hung his head so that he does not have to speak with him", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "necessary for business", "uuid" : "D100A954", "_id" : { "$oid" : "5065a1ce38bb460200000002" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[178]", "startOffset" : 96, "end" : "/div[1]/p[178]", "endOffset" : 118, "_id" : { "$oid" : "5065a1ce38bb460200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348837838791 }, "created" : { "$date" : 1348837838791 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065a24338bb460200000004", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "loyalty, originally meaning duty to a lord or king", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "fidelity", "uuid" : "996B384C", "_id" : { "$oid" : "5065a24338bb460200000004" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[178]", "startOffset" : 195, "end" : "/div[1]/p[178]", "endOffset" : 203, "_id" : { "$oid" : "5065a24338bb460200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348837955786 }, "created" : { "$date" : 1348837955786 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065a3c92fbadc020000001e", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "He is not already", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "he desired to be thought absorbed", "uuid" : "9FE3B733", "_id" : { "$oid" : "5065a3c92fbadc020000001e" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[178]", "startOffset" : 138, "end" : "/div[1]/p[178]", "endOffset" : 171, "_id" : { "$oid" : "5065a3c92fbadc020000001f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348838345346 }, "created" : { "$date" : 1348838345346 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065a45738bb460200000006", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "hesitant to speak because of lack of self-confidence, reserved; [older meaning] distrustful", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "diffident", "uuid" : "F3CEBD3B", "_id" : { "$oid" : "5065a45738bb460200000006" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[178]", "startOffset" : 282, "end" : "/div[1]/p[178]", "endOffset" : 291, "_id" : { "$oid" : "5065a45738bb460200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348838487477 }, "created" : { "$date" : 1348838487477 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065a4b62fbadc0200000020", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "He acts differently than what would be expected by his appearance.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "if a grizzly bear, instead\nof growling and biting, should simper\nand cast sheep's eyes.", "uuid" : "32A7C9C3", "_id" : { "$oid" : "5065a4b62fbadc0200000020" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[178]", "startOffset" : 362, "end" : "/div[1]/p[178]", "endOffset" : 449, "_id" : { "$oid" : "5065a4b62fbadc0200000021" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348838582695 }, "created" : { "$date" : 1348838582695 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065a51738bb460200000008", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Indicates that everyone had been told what to say and what to do.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "confirming all that\nremained to be confirmed of the story.", "uuid" : "1D6F423D", "_id" : { "$oid" : "5065a51738bb460200000008" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[178]", "startOffset" : 730, "end" : "/div[1]/p[178]", "endOffset" : 788, "_id" : { "$oid" : "5065a51738bb460200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348838679164 }, "created" : { "$date" : 1348838679164 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065a9412fbadc0200000022", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Centaur are in between two natures.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "centau", "uuid" : "D6849B02", "_id" : { "$oid" : "5065a9412fbadc0200000022" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[179]", "startOffset" : 58, "end" : "/div[1]/p[179]", "endOffset" : 64, "_id" : { "$oid" : "5065a9412fbadc0200000023" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348839745978 }, "created" : { "$date" : 1348839745978 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065a9e52fbadc0200000024", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "interesting", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "earnestly eying me", "uuid" : "AA923E2B", "_id" : { "$oid" : "5065a9e52fbadc0200000024" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[180]", "startOffset" : 382, "end" : "/div[1]/p[180]", "endOffset" : 400, "_id" : { "$oid" : "5065a9e52fbadc0200000025" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348839909819 }, "created" : { "$date" : 1348839909819 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065aaca38bb46020000000a", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "serious, solemn, severe", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "grave", "uuid" : "C9B35DC1", "_id" : { "$oid" : "5065aaca38bb46020000000a" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[192]", "startOffset" : 2259, "end" : "/div[1]/p[192]", "endOffset" : 2265, "_id" : { "$oid" : "5065aaca38bb46020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348840138570 }, "created" : { "$date" : 1348840138570 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065aaf838bb46020000000c", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "dipping the strands as needed", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "exigencies of the operation\ndemanded.", "uuid" : "83F31EC8", "_id" : { "$oid" : "5065aaf838bb46020000000c" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[192]", "startOffset" : 2438, "end" : "/div[1]/p[192]", "endOffset" : 2476, "_id" : { "$oid" : "5065aaf838bb46020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348840184517 }, "created" : { "$date" : 1348840184517 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065b49c2fbadc0200000026", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Did I show you a house or palace, where there was not one apartment\nconvenient or agreeable; where the windows, doors, fires, passages,\nstairs, and the whole economy of the building, were the source of noise,\nconfusion, fatigue, darkness, and the extremes of heat and cold; you\nwould certainly blame the contrivance, without any further examination.\nThe architect would in vain display his subtlety, and prove to you, that\nif this door or that window were altered, greater ills would ensue. What\nhe says may be strictly true: The alteration of one particular, while the\nother parts of the building remain, may only augment the inconveniences.\nBut still you would assert in general, that, if the architect had had\nskill and good intentions, he might have formed such a plan of the whole,\nand might have adjusted the parts in such a manner, as would have\nremedied all or most of these inconveniences. His ignorance, or even your\nown ignorance of such a plan, will never convince you of the\nimpossibility of it. If you find any inconveniences and deformities in\nthe building, you will always, without entering into any detail, condemn\nthe architect.", "uuid" : "95E3D84D", "_id" : { "$oid" : "5065b49c2fbadc0200000026" }, "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [ "jpaggi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[14]", "startOffset" : 3802, "end" : "/div[1]/div[14]", "endOffset" : 4949, "_id" : { "$oid" : "5065b49c2fbadc0200000027" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348842652765 }, "created" : { "$date" : 1348842652765 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065c3562fbadc0200000028", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "Meeting the captain. This seems like an odd greeting", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "But as if not unwilling to let nature make\nknown her own case among his suffering charge,\nor else in despair of restraining it for the time,\nthe Spanish captain, a gentlemanly, reserved-looking,\nand rather young man to a stranger's\neye, dressed with singular richness, but bearing\nplain traces of recent sleepless cares and disquietudes,\nstood passively by, leaning against\nthe main-mast, at one moment casting a dreary,\nspiritless look upon his excited people, at the\nnext an unhappy glance toward his visitor. By\nhis side stood a black of small stature, in whose\nrude face, as occasionally, like a shepherd's dog,\nhe mutely turned it up into the Spaniard's, sorrow\nand affection were equally blended.", "uuid" : "519628BD", "_id" : { "$oid" : "5065c3562fbadc0200000028" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 0, "end" : "/div[1]/p[20]", "endOffset" : 702, "_id" : { "$oid" : "5065c3562fbadc0200000029" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348846422017 }, "created" : { "$date" : 1348846422017 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065c55e2fbadc020000002a", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "Benito is resolved himself to his fate", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "But the debility, constitutional or induced by\nhardships, bodily and mental, of the Spanish\ncaptain, was too obvious to be overlooked. A\nprey to settled dejection", "uuid" : "16807F4E", "_id" : { "$oid" : "5065c55e2fbadc020000002a" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 772, "end" : "/div[1]/p[24]", "endOffset" : 934, "_id" : { "$oid" : "5065c55e2fbadc020000002b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348846942561 }, "created" : { "$date" : 1348846942561 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065c6152fbadc020000002c", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "Benito is nervous", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "at times suddenly pausing, starting, or staring,\nbiting his lip, biting his finger-nail, flushing,\npaling, twitching his beard, with other symptoms\nof an absent or moody mind.", "uuid" : "BC0AD8D5", "_id" : { "$oid" : "5065c6152fbadc020000002c" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 1464, "end" : "/div[1]/p[24]", "endOffset" : 1639, "_id" : { "$oid" : "5065c6152fbadc020000002d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348847125184 }, "created" : { "$date" : 1348847125184 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065c63d38bb46020000000e", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "Babo on roughly equal terms with Benito", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "whom a master need be on no\nstiffly superior terms with, but may treat with\nfamiliar trust; less a servant than a devoted\ncompanion.", "uuid" : "66AD5936", "_id" : { "$oid" : "5065c63d38bb46020000000e" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 2477, "end" : "/div[1]/p[24]", "endOffset" : 2609, "_id" : { "$oid" : "5065c63d38bb46020000000f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348847165051 }, "created" : { "$date" : 1348847165051 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065c8d038bb460200000010", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "Benito not able to figure out how to tell his own story", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "He maintained this posture\nso long", "uuid" : "95EB9620", "_id" : { "$oid" : "5065c8d038bb460200000010" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[33]", "startOffset" : 147, "end" : "/div[1]/p[33]", "endOffset" : 181, "_id" : { "$oid" : "5065c8d038bb460200000011" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348847824384 }, "created" : { "$date" : 1348847824384 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065cba038bb460200000012", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "Let him be endowed with a greater propensity to industry and\nlabour; a more vigorous spring and activity of mind; a more constant bent\nto business and application. Let the whole species possess naturally an\nequal diligence with that which many individuals are able to attain by\nhabit and reflection; and the most beneficial consequences, without any\nallay of ill, is the immediate and necessary result of this endowment.", "uuid" : "56D04C08", "_id" : { "$oid" : "5065cba038bb460200000012" }, "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [ "jpaggi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[14]", "startOffset" : 13500, "end" : "/div[1]/div[14]", "endOffset" : 13920, "_id" : { "$oid" : "5065cba038bb460200000013" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348848544149 }, "created" : { "$date" : 1348848544149 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065cdaa2fbadc020000002e", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "There may four hypotheses be framed concerning the first causes of the\nuniverse: that they are endowed with perfect goodness; that they have\nperfect malice; that they are opposite, and have both goodness and\nmalice; that they have neither goodness nor malice. Mixed phenomena can\nnever prove the two former unmixed principles; and the uniformity and\nsteadiness of general laws seem to oppose the third. The fourth,\ntherefore, seems by far the most probable.", "uuid" : "24962070", "_id" : { "$oid" : "5065cdaa2fbadc020000002e" }, "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [ "jpaggi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[14]", "startOffset" : 21223, "end" : "/div[1]/div[14]", "endOffset" : 21681, "_id" : { "$oid" : "5065cdaa2fbadc020000002f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348849066492 }, "created" : { "$date" : 1348849066492 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065d4c338bb460200000014", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Inadequate is an interesting word here--I think Babo realized that his body was but a tool for his mind, and he used it to its fullest potential. That said, the one time he fails is when he uses his body, not his mind, to reach his ends (attempting to stab Don Benito).", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "his\nslight frame, inadequate to that which it\nheld", "uuid" : "25A41E4B", "_id" : { "$oid" : "5065d4c338bb460200000014" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[415]", "startOffset" : 86, "end" : "/div[1]/p[415]", "endOffset" : 136, "_id" : { "$oid" : "5065d4c338bb460200000015" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348850883396 }, "created" : { "$date" : 1348850883396 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065d4f32fbadc0200000030", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Yes, he lost that fight. Babo's strength lay in his wit, not his bones.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "had at once yielded to the superior muscular\nstrength of his captor", "uuid" : "894B1002", "_id" : { "$oid" : "5065d4f32fbadc0200000030" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[415]", "startOffset" : 138, "end" : "/div[1]/p[415]", "endOffset" : 205, "_id" : { "$oid" : "5065d4f32fbadc0200000031" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348850931449 }, "created" : { "$date" : 1348850931449 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065d51238bb460200000016", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "I wonder why this is. Perhaps to underscore the fact that he would get no say anyway?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "uttered no sound", "uuid" : "2607338F", "_id" : { "$oid" : "5065d51238bb460200000016" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[415]", "startOffset" : 244, "end" : "/div[1]/p[415]", "endOffset" : 260, "_id" : { "$oid" : "5065d51238bb460200000017" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348850962455 }, "created" : { "$date" : 1348850962455 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065d5872fbadc0200000032", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Definitely points out that Babo (or \"the black\" as they call him) would not be given a say. I think this is social commentary on how blacks have no voice in society.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "voiceless\n[pg 270]\n\nend", "uuid" : "66668263", "_id" : { "$oid" : "5065d5872fbadc0200000032" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[416]", "startOffset" : 82, "end" : "/div[1]/p[416]", "endOffset" : 105, "_id" : { "$oid" : "5065d5872fbadc0200000033" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348851079189 }, "created" : { "$date" : 1348851079189 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065d79138bb460200000018", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "interesting", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "never seen in\nan American ship, nor indeed any other", "uuid" : "FBB227A3", "_id" : { "$oid" : "5065d79138bb460200000018" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[193]", "startOffset" : 211, "end" : "/div[1]/p[193]", "endOffset" : 263, "_id" : { "$oid" : "5065d79138bb460200000019" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348851601571 }, "created" : { "$date" : 1348851601571 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065d8db2fbadc0200000034", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Gordian knot= intricate problem, insoluble in its own terms: Alexander the Great cut the knot to untie it", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Gordian knots", "uuid" : "2FC0F3A2", "_id" : { "$oid" : "5065d8db2fbadc0200000034" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[193]", "startOffset" : 316, "end" : "/div[1]/p[193]", "endOffset" : 330, "_id" : { "$oid" : "5065d8db2fbadc0200000035" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348851931367 }, "created" : { "$date" : 1348851931367 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5065d98238bb46020000001a" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348852098724 }, "groups" : [ "21L.003" ], "id" : "5065d98238bb46020000001a", "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "quote" : "knot seemed a combination of double-bowline-knot,\ntreble-crown-knot, back-handed-well-knot,\nknot-in-and-out-knot, and jamming-knot.", "ranges" : [ { "start" : "/div[1]/p[193]", "startOffset" : 358, "end" : "/div[1]/p[193]", "endOffset" : 490, "_id" : { "$oid" : "5065d98238bb46020000001b" } } ], "tags" : [], "text" : "complicated and complex: Is this how the man feels? Why does the author add in those details?", "updated" : { "$date" : 1348886788966 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "user" : "opaco@mit.edu", "username" : "Francisco H.", "uuid" : "45F8930C" } -{ "id" : "5065d9ee38bb46020000001c", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "He's not saying more than he needs to", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "The knot,\" was the brief reply, without\nlooking up.", "uuid" : "4DFBA22A", "_id" : { "$oid" : "5065d9ee38bb46020000001c" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[196]", "startOffset" : 1, "end" : "/div[1]/p[196]", "endOffset" : 53, "_id" : { "$oid" : "5065d9ee38bb46020000001d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348852206035 }, "created" : { "$date" : 1348852206035 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065e60e2fbadc0200000036", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Probably not", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "here's Babo's\nfirst blood.\"", "uuid" : "92AA019A", "_id" : { "$oid" : "5065e60e2fbadc0200000036" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[265]", "startOffset" : 583, "end" : "/div[1]/p[265]", "endOffset" : 610, "_id" : { "$oid" : "5065e60e2fbadc0200000037" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348855310345 }, "created" : { "$date" : 1348855310345 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5065ea4e38bb46020000001e", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "duh! Would he really be that nervous if he trusted Babo and had done this everyday?!", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Not\nunaffected by the close sight of the gleaming\nsteel, Don Benito nervously shuddered;", "uuid" : "5347E4D3", "_id" : { "$oid" : "5065ea4e38bb46020000001e" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 413, "end" : "/div[1]/p[258]", "endOffset" : 501, "_id" : { "$oid" : "5065ea4e38bb46020000001f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348856398747 }, "created" : { "$date" : 1348856398747 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5066308d38bb460200000020", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "I think the use of \"clamorous\" here is interesting. Its also the first sign that something is amiss that Delano ignores. Why are blacks and the whites intermingling on the ship so much instead of being separated?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "clamorous throng of whites\nand blacks", "uuid" : "2673A2B9", "_id" : { "$oid" : "5066308d38bb460200000020" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 59, "end" : "/div[1]/p[14]", "endOffset" : 96, "_id" : { "$oid" : "5066308d38bb460200000021" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348874381223 }, "created" : { "$date" : 1348874381223 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506630b138bb460200000022", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "Again \"one voice\", \"one language\" - strange for a slave ship.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "But, in one language, and as with\none voice, all poured out a common tale of\n[pg 117]\n\nsuffering", "uuid" : "4AEDEFB7", "_id" : { "$oid" : "506630b138bb460200000022" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 228, "end" : "/div[1]/p[14]", "endOffset" : 324, "_id" : { "$oid" : "506630b138bb460200000023" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348874417408 }, "created" : { "$date" : 1348874417408 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506631852fbadc0200000038", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "Delano notices here that the Spaniards are lacking in authority over the blacks.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "impairing the Spaniard's authority\nover them", "uuid" : "4608F592", "_id" : { "$oid" : "506631852fbadc0200000038" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 374, "end" : "/div[1]/p[24]", "endOffset" : 418, "_id" : { "$oid" : "506631852fbadc0200000039" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348874629425 }, "created" : { "$date" : 1348874629425 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506631cc2fbadc020000003a", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "Delano notices here the poor condition of the Benito Cereno.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "But the debility, constitutional or induced by\nhardships, bodily and mental, of the Spanish\ncaptain, was too obvious to be overlooked", "uuid" : "5BAF7DD4", "_id" : { "$oid" : "506631cc2fbadc020000003a" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 772, "end" : "/div[1]/p[24]", "endOffset" : 905, "_id" : { "$oid" : "506631cc2fbadc020000003b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348874700733 }, "created" : { "$date" : 1348874700733 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506631ef2fbadc020000003c", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "Don Benito's mind - unstrung. He then describes how he knows this.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "unstrung", "uuid" : "13B37BDD", "_id" : { "$oid" : "506631ef2fbadc020000003c" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 1259, "end" : "/div[1]/p[24]", "endOffset" : 1268, "_id" : { "$oid" : "506631ef2fbadc020000003d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348874735616 }, "created" : { "$date" : 1348874735616 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506632962fbadc020000003e", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "I love how Melville uses language here to describe why Benito is absent in the mind or moody. Twitching, nail biting, nervous habits. There's also a duality here - Benito is showing signs of absentness, but these also could be signs of nervousness rooted in trying to play along with the uprising of the blacks on his ship. Delano misses this second reason.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "moved slowly about,\nat times suddenly pausing, starting, or staring,\nbiting his lip, biting his finger-nail, flushing,\npaling, twitching his beard, with other symptoms\nof an absent or moody mind", "uuid" : "269545E4", "_id" : { "$oid" : "506632962fbadc020000003e" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 1444, "end" : "/div[1]/p[24]", "endOffset" : 1638, "_id" : { "$oid" : "506632962fbadc020000003f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348874902083 }, "created" : { "$date" : 1348874902083 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506632b62fbadc0200000040", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "Benito is so worn down, but Delano can tell its not normal for him that this is the cause of some stress.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "with nervous suffering was almost worn to a\nskeleton", "uuid" : "7C08CE49", "_id" : { "$oid" : "506632b62fbadc0200000040" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 1787, "end" : "/div[1]/p[24]", "endOffset" : 1839, "_id" : { "$oid" : "506632b62fbadc0200000041" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348874934882 }, "created" : { "$date" : 1348874934882 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506632f538bb460200000026", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "Great description - you can almost hear his voice. I imagine it something like a heavy smoker. ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "His voice was like that of one with\nlungs half gone—hoarsely suppressed, a husky\nwhisper", "uuid" : "1303A732", "_id" : { "$oid" : "506632f538bb460200000026" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 1920, "end" : "/div[1]/p[24]", "endOffset" : 2008, "_id" : { "$oid" : "506632f538bb460200000027" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348874997502 }, "created" : { "$date" : 1348874997502 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506634aa38bb460200000028", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "Benito's demeanor doesn't offend Delano, in fact, doesn't seem to phase him much at all. Why?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "The Spaniard's manner,\n[pg 125]\n\ntoo, conveyed a sort of sour and gloomy disdain,\nwhich he seemed at no pains to disguise.", "uuid" : "A8AB8850", "_id" : { "$oid" : "506634aa38bb460200000028" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[26]", "startOffset" : 518, "end" : "/div[1]/p[26]", "endOffset" : 640, "_id" : { "$oid" : "506634aa38bb460200000029" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348875434792 }, "created" : { "$date" : 1348875434792 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506635d638bb46020000002a", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "He notes here that there is something different about the way Benito treats his attendent.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "At bottom it was\nDon Benito's reserve which displeased him;\nbut the same reserve was shown towards all\nbut his faithful personal attendant", "uuid" : "8255D968", "_id" : { "$oid" : "506635d638bb46020000002a" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[27]", "startOffset" : 163, "end" : "/div[1]/p[27]", "endOffset" : 301, "_id" : { "$oid" : "506635d638bb46020000002b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348875734211 }, "created" : { "$date" : 1348875734211 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5066360838bb46020000002c", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "This is very interesting imagery describing Benito.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "transforming the man into\na block, or rather into a loaded cannon, which,\nuntil there is call for thunder, has nothing to\nsay.", "uuid" : "984F1679", "_id" : { "$oid" : "5066360838bb46020000002c" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[29]", "startOffset" : 440, "end" : "/div[1]/p[29]", "endOffset" : 566, "_id" : { "$oid" : "5066360838bb46020000002d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348875784595 }, "created" : { "$date" : 1348875784595 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506636f92fbadc0200000042", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "What is Melville trying to tell the reader and Delano here?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "vacantly\nstared", "uuid" : "59B83B4D", "_id" : { "$oid" : "506636f92fbadc0200000042" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[33]", "startOffset" : 76, "end" : "/div[1]/p[33]", "endOffset" : 91, "_id" : { "$oid" : "506636f92fbadc0200000043" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348876025009 }, "created" : { "$date" : 1348876025009 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5066384d2fbadc0200000044", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "This adds suspense to what he's saying.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "husky whisper", "uuid" : "72A8352D", "_id" : { "$oid" : "5066384d2fbadc0200000044" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[35]", "startOffset" : 66, "end" : "/div[1]/p[35]", "endOffset" : 79, "_id" : { "$oid" : "5066384d2fbadc0200000045" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348876365855 }, "created" : { "$date" : 1348876365855 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506638712fbadc0200000046", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "Benito is obviously very distressed.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "brokenly and\nobscurely, as one in a dream.", "uuid" : "AF852D11", "_id" : { "$oid" : "506638712fbadc0200000046" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[37]", "startOffset" : 27, "end" : "/div[1]/p[37]", "endOffset" : 70, "_id" : { "$oid" : "506638712fbadc0200000047" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348876401962 }, "created" : { "$date" : 1348876401962 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506638b938bb46020000002e", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "This could be signs of sea-worn sickness...or signs of mental and/or physical torture and neglect inflicted by his mutinous crew. What does Delano see it as?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "His cough returned and with increased violence;\nthis subsiding; with reddened lips and\nclosed eyes he fell heavily against his supporter", "uuid" : "0562FAC8", "_id" : { "$oid" : "506638b938bb46020000002e" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[39]", "startOffset" : 0, "end" : "/div[1]/p[39]", "endOffset" : 136, "_id" : { "$oid" : "506638b938bb46020000002f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348876473737 }, "created" : { "$date" : 1348876473737 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50663f9738bb460200000030", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "Don Benito isn't necessarily comfortable with his over zealous servant. ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "painfully", "uuid" : "8023FF8D", "_id" : { "$oid" : "50663f9738bb460200000030" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[43]", "startOffset" : 65, "end" : "/div[1]/p[43]", "endOffset" : 74, "_id" : { "$oid" : "50663f9738bb460200000031" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348878231353 }, "created" : { "$date" : 1348878231353 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5066400438bb460200000032", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "To me, this indicates that while the mutinous slaves can control his dress and appearance, they cannot completely control his behavior.s", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "The Spaniard wore a loose\nChili jacket of dark velvet; white small-clothes\nand stockings, with silver buckles at the\nknee and instep; a high-crowned sombrero, of\nfine grass; a slender sword, silver mounted,\nhung from a knot in his sash—the last being an\nalmost invariable adjunct, more for utility than\nornament, of a South American gentleman's\ndress to this hour. Excepting when his occasional\nnervous contortions brought about disarray,\nthere was a certain precision in his attire\ncuriously at variance with the unsightly disorder\naround; especially in the belittered\nGhetto, forward of the main-mast, wholly occupied\nby the blacks.", "uuid" : "E8430F8B", "_id" : { "$oid" : "5066400438bb460200000032" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[50]", "startOffset" : 334, "end" : "/div[1]/p[50]", "endOffset" : 968, "_id" : { "$oid" : "5066400438bb460200000033" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348878340367 }, "created" : { "$date" : 1348878340367 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5066405b2fbadc0200000048", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "what is significant about his hands being small and yellow?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "small,\nyellow hands", "uuid" : "C5437651", "_id" : { "$oid" : "5066405b2fbadc0200000048" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[53]", "startOffset" : 410, "end" : "/div[1]/p[53]", "endOffset" : 429, "_id" : { "$oid" : "5066405b2fbadc0200000049" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348878427717 }, "created" : { "$date" : 1348878427717 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5066412438bb460200000034", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "\"eager and hectic\" interesting word choice for someone expressing gratitude for an act of kindness.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "His face lighted up;\neager and hectic, he met the honest glance of\nhis visitor. With gratitude he seemed overcome.", "uuid" : "0212C0D6", "_id" : { "$oid" : "5066412438bb460200000034" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[55]", "startOffset" : 67, "end" : "/div[1]/p[55]", "endOffset" : 182, "_id" : { "$oid" : "5066412438bb460200000035" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348878628056 }, "created" : { "$date" : 1348878628056 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5066417e38bb460200000036", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "Funny that the servant says the excitement is bad, when Delano describes Benito as being \"eager\". Which sounds to me like a good thing.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "This excitement is bad for master", "uuid" : "E598E855", "_id" : { "$oid" : "5066417e38bb460200000036" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[56]", "startOffset" : 1, "end" : "/div[1]/p[56]", "endOffset" : 34, "_id" : { "$oid" : "5066417e38bb460200000037" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348878718696 }, "created" : { "$date" : 1348878718696 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506641f82fbadc020000004a", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "Funny Melville included that Benito was pale, right before describing that he \"dully muttered\" in response to the violence on his ship. Could this be a subtle hint that it bothered Benito more than he is able to let on? Or is Melville just reinforcing that Benito is and has been pale all along?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "pale Don Benito\ndully", "uuid" : "F2D2BD40", "_id" : { "$oid" : "506641f82fbadc020000004a" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[62]", "startOffset" : 68, "end" : "/div[1]/p[62]", "endOffset" : 89, "_id" : { "$oid" : "506641f82fbadc020000004b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348878840915 }, "created" : { "$date" : 1348878840915 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5066429b2fbadc020000004c", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "Benito is obviously very upset here - he is quivering and he has paused his speech.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Again quivering, the Spaniard paused.", "uuid" : "F15F966D", "_id" : { "$oid" : "5066429b2fbadc020000004c" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[81]", "startOffset" : 0, "end" : "/div[1]/p[81]", "endOffset" : 37, "_id" : { "$oid" : "5066429b2fbadc020000004d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348879003210 }, "created" : { "$date" : 1348879003210 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506642e138bb460200000038", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "Benito is afraid of his prisoner.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "At the first glimpse of his approach, Don\nBenito had started, a resentful shadow swept\nover his face; and, as with the sudden memory\nof bootless rage, his white lips glued together.", "uuid" : "833D567C", "_id" : { "$oid" : "506642e138bb460200000038" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[88]", "startOffset" : 0, "end" : "/div[1]/p[88]", "endOffset" : 181, "_id" : { "$oid" : "506642e138bb460200000039" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348879073189 }, "created" : { "$date" : 1348879073189 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506655fc38bb46020000003a", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "if he's forced to", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "ver heard of a white so far a renegade as\nto apostatize from his very species almost, by\nleaguing in against it with negroes", "uuid" : "A6F26B45", "_id" : { "$oid" : "506655fc38bb46020000003a" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[192]", "startOffset" : 1792, "end" : "/div[1]/p[192]", "endOffset" : 1916, "_id" : { "$oid" : "506655fc38bb46020000003b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348883964025 }, "created" : { "$date" : 1348883964025 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5066568238bb46020000003c", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "his attention has been shifted to the mysterious knot", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "own entanglements to those of the hemp", "uuid" : "7F2036F4", "_id" : { "$oid" : "5066568238bb46020000003c" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[193]", "startOffset" : 136, "end" : "/div[1]/p[193]", "endOffset" : 175, "_id" : { "$oid" : "5066568238bb46020000003d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348884098654 }, "created" : { "$date" : 1348884098654 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506657202fbadc020000004e", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "thus, a congenial transition; he wanted to stop thinking about Cereno", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "not uncongenial transition", "uuid" : "A20B2714", "_id" : { "$oid" : "506657202fbadc020000004e" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[193]", "startOffset" : 92, "end" : "/div[1]/p[193]", "endOffset" : 118, "_id" : { "$oid" : "506657202fbadc020000004f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348884256157 }, "created" : { "$date" : 1348884256157 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506657962fbadc0200000050", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "The man is symbolically making something that can change the leadership (just like in the Gordian knot story)", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "old man looked like an Egyptian priest, makin", "uuid" : "1D9FB747", "_id" : { "$oid" : "506657962fbadc0200000050" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[193]", "startOffset" : 269, "end" : "/div[1]/p[193]", "endOffset" : 314, "_id" : { "$oid" : "506657962fbadc0200000051" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348884374599 }, "created" : { "$date" : 1348884374599 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5066614038bb46020000003e", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Author has repeated the word \"knot\" over and over again.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "knotting", "uuid" : "A2227476", "_id" : { "$oid" : "5066614038bb46020000003e" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[195]", "startOffset" : 14, "end" : "/div[1]/p[195]", "endOffset" : 22, "_id" : { "$oid" : "5066614038bb46020000003f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348886848330 }, "created" : { "$date" : 1348886848330 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5066624b2fbadc0200000052", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "What's this about?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "in an acrid tone, as if\nresenting some supposed satiric reflection.", "uuid" : "287DC4EB", "_id" : { "$oid" : "5066624b2fbadc0200000052" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[71]", "startOffset" : 65, "end" : "/div[1]/p[71]", "endOffset" : 132, "_id" : { "$oid" : "5066624b2fbadc0200000053" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348887115543 }, "created" : { "$date" : 1348887115543 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506663d038bb460200000040", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "clever wordplay", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "knot in hand, and knot in\nhead", "uuid" : "3C395C1F", "_id" : { "$oid" : "506663d038bb460200000040" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[200]", "startOffset" : 13, "end" : "/div[1]/p[200]", "endOffset" : 44, "_id" : { "$oid" : "506663d038bb460200000041" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348887504919 }, "created" : { "$date" : 1348887504919 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50666491bddb240200000002", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "hints that the slaves are in control", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "detective\ncustom-house officer", "uuid" : "8B68DCDE", "_id" : { "$oid" : "50666491bddb240200000002" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[201]", "startOffset" : 546, "end" : "/div[1]/p[201]", "endOffset" : 576, "_id" : { "$oid" : "50666491bddb240200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348887697601 }, "created" : { "$date" : 1348887697601 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5067741a1cda070200000002", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Does the universe resemble a house or a vegetable? The conclusion we arrive at will depend on the perspective we choose to look at the question from. Therefore we must first choose the correct perspective", "uri" : "http://annotationstudio.mit.edu/documents/dialogues", "quote" : "If the universe bears a\ngreater likeness to animal bodies and to vegetables, than to the works of\nhuman art, it is more probable that its cause resembles the cause of the\nformer than that of the latter, and its origin ought rather to be\nascribed to generation or vegetation, than to reason or design.", "uuid" : "380721B9", "_id" : { "$oid" : "5067741a1cda070200000002" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[10]", "startOffset" : 281, "end" : "/div[1]/div[10]", "endOffset" : 581, "_id" : { "$oid" : "5067741a1cda070200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1348957210605 }, "created" : { "$date" : 1348957210605 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506799dbbddb240200000004", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "The creature is portrayed as ugly, and Victor sees it as evil, relating the idea that we are more willing to associate evilness with a being that is unpleasing to our eyes", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "Great God! His yellow skin scarcely covered the work of \nmuscles and arteries beneath; his hair was of a lustrous black, and flowing; his \nteeth of a pearly whiteness; but these luxuriances only formed a more horrid \ncontrast with his watery eyes, that seemed almost of the same colour as the dun \nwhite sockets in which they were set, his shrivelled complexion, and straight \nblack lips.", "uuid" : "29B03F9E", "_id" : { "$oid" : "506799dbbddb240200000004" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "reference,", "human", "nature" ], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 239, "end" : "/div[1]/p[2]", "endOffset" : 627, "_id" : { "$oid" : "506799dcbddb240200000005" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348966875468 }, "created" : { "$date" : 1348966875468 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50679b9ebddb240200000006", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "When I first read this, I didn't see these actions as harmless. I imagined a horrific monster with a sinister grin spread across his face, growling menacingly and stretching out a beefy hand that would strangle Victor to death. It was only after the substitute talked to us about it that I realized the monster didn't necessarily have to be evil. My reaction seems to affirm my previous observation.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "his eyes, if eyes they may be called, were fixed on me. \nHis jaws opened, and he muttered some inarticulate sounds, while a grin wrinkled \nhis cheeks. He might have spoken, but I did not hear; one hand was stretched \nout, seemingly to detain me, but I escaped", "uuid" : "C33B50ED", "_id" : { "$oid" : "50679b9ebddb240200000006" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "reference", "human", "nature" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1583, "end" : "/div[1]/p[3]", "endOffset" : 1843, "_id" : { "$oid" : "50679b9ebddb240200000007" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348967326320 }, "created" : { "$date" : 1348967326320 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5067ab4a1cda070200000004" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348971338457 }, "groups" : [ "21L.000J" ], "id" : "5067ab4a1cda070200000004", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "quote" : "infusing life into an inanimate body", "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 153, "end" : "/div[1]/p[3]", "endOffset" : 189, "_id" : { "$oid" : "5067ab4a1cda070200000005" } } ], "tags" : [], "text" : "very technical description of bringing something into life. could it be that Victor has estranged his emotions from his work? it would explain why he did not truly perceive the horror of his work until it was done.", "updated" : { "$date" : 1348971396580 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "uuid" : "A55EE6E0" } -{ "id" : "5067ac46bddb240200000008", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "Victor is trying to justify his not accepting the creature.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "no mortal could support the horror of that countenance", "uuid" : "69CEADC9", "_id" : { "$oid" : "5067ac46bddb240200000008" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 4, "end" : "/div[1]/p[4]", "endOffset" : 58, "_id" : { "$oid" : "5067ac46bddb240200000009" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348971590633 }, "created" : { "$date" : 1348971590633 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5067ac9fbddb24020000000a", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "he had some compassion for the creature?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "gazed", "uuid" : "4C0B9965", "_id" : { "$oid" : "5067ac9fbddb24020000000a" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 144, "end" : "/div[1]/p[4]", "endOffset" : 150, "_id" : { "$oid" : "5067ac9fbddb24020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1348971679664 }, "created" : { "$date" : 1348971679664 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5067aff11cda070200000006" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348972529794 }, "groups" : [ "21L.000J" ], "id" : "5067aff11cda070200000006", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "quote" : "Like one who, on a lonely road,\n   Doth walk in \nfear and dread,\nAnd, having once \nturn'd round, walks on,\n   And turns no \nmore his head;\nBecause he knows a \nfrightful fiend\n   Doth close \nbehind him tread.", "ranges" : [ { "start" : "/div[1]/p[8]", "startOffset" : 0, "end" : "/div[1]/p[13]", "endOffset" : 32, "_id" : { "$oid" : "5067aff11cda070200000007" } } ], "tags" : [], "text" : "Victor is running away from the creature. Why? Is it because Victor realizes his responsibility for the creature and is trying to run away from doing his duty?", "updated" : { "$date" : 1348972538857 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "uuid" : "D22146B0" } -{ "id" : "5067ba2b1cda070200000008", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Divine: To conjecture using intuition or sagacity.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "divined", "uuid" : "00CF184D", "_id" : { "$oid" : "5067ba2b1cda070200000008" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[77]", "startOffset" : 12, "end" : "/div[1]/p[77]", "endOffset" : 20, "_id" : { "$oid" : "5067ba2b1cda070200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348975147244 }, "created" : { "$date" : 1348975147244 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5067be2f1cda07020000000a", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "term gentlemen indicates someone polished/sophisticated--->expensive clothing", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "gentlemanly", "uuid" : "58ADB80F", "_id" : { "$oid" : "5067be2f1cda07020000000a" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "Cereno" ], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 164, "end" : "/div[1]/p[20]", "endOffset" : 175, "_id" : { "$oid" : "5067be2f1cda07020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348976175404 }, "created" : { "$date" : 1348976175404 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5067be6b8825f50200000002", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "must mean rich, cultural clothing underneath layer of filth and rips, indicating hardship", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "earing\nplain traces of recent sleepless cares and disquietudes", "uuid" : "5DA4D0B6", "_id" : { "$oid" : "5067be6b8825f50200000002" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "Cereno" ], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 274, "end" : "/div[1]/p[20]", "endOffset" : 336, "_id" : { "$oid" : "5067be6b8825f50200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348976235633 }, "created" : { "$date" : 1348976235633 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5067be8e8825f50200000004", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Why is he standing passively after going through hard times?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "stood passively", "uuid" : "0A844036", "_id" : { "$oid" : "5067be8e8825f50200000004" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "Cereno" ], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 338, "end" : "/div[1]/p[20]", "endOffset" : 353, "_id" : { "$oid" : "5067be8e8825f50200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348976270667 }, "created" : { "$date" : 1348976270667 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5067bef01cda07020000000c", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "high contrast to captain; \"small\" stature--> negative connotation, strong men usually tall; \"rude\" face-->coarse, fierce", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "a black of small stature, in whose\nrude face", "uuid" : "213AFCF5", "_id" : { "$oid" : "5067bef01cda07020000000c" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "Babo" ], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 530, "end" : "/div[1]/p[20]", "endOffset" : 574, "_id" : { "$oid" : "5067bef01cda07020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348976368281 }, "created" : { "$date" : 1348976368281 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5067bf618825f50200000006", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "awkward movements; hints that something is awry ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "he moved slowly about,\nat times suddenly pausing, starting, or staring,\nbiting his lip, biting his finger-nail, flushing,\npaling, twitching his beard, with other symptoms\nof an absent or moody mind.", "uuid" : "CFE69726", "_id" : { "$oid" : "5067bf618825f50200000006" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "Cereno" ], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 1441, "end" : "/div[1]/p[24]", "endOffset" : 1639, "_id" : { "$oid" : "5067bf618825f50200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348976481095 }, "created" : { "$date" : 1348976481095 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5067bfa58825f50200000008", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Cereno compared to a skeleton (white, thin) like previous captain and owner of the slaves who is now a skeleton as well--->analogy?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "He was rather tall,\nbut seemed never to have been robust, and now\nwith nervous suffering was almost worn to a\nskeleton.", "uuid" : "E9D2DD80", "_id" : { "$oid" : "5067bfa58825f50200000008" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "skeleton", "Cereno" ], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 1721, "end" : "/div[1]/p[24]", "endOffset" : 1840, "_id" : { "$oid" : "5067bfa58825f50200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348976549941 }, "created" : { "$date" : 1348976549941 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5067bff31cda07020000000e", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Babo puts on a show for Delano", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Sometimes the negro\ngave his master his arm, or took his handkerchief\nout of his pocket for him; performing\nthese and similar offices with that affectionate\n[pg 124]\n\nzeal which transmutes into something filial or\nfraternal acts in themselves but menial;", "uuid" : "92325BB1", "_id" : { "$oid" : "5067bff31cda07020000000e" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "Babo", "movement" ], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 2111, "end" : "/div[1]/p[24]", "endOffset" : 2365, "_id" : { "$oid" : "5067bff31cda07020000000f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348976627712 }, "created" : { "$date" : 1348976627712 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5067c0f28825f5020000000a", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Why would Delano consider B/C's affliction \"unusual\"? He suggests that he originally assumed that Aranda would not be travelling with the slaves.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "unusual", "uuid" : "9BFA84CA", "_id" : { "$oid" : "5067c0f28825f5020000000a" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[77]", "startOffset" : 38, "end" : "/div[1]/p[77]", "endOffset" : 46, "_id" : { "$oid" : "5067c0f28825f5020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348976882706 }, "created" : { "$date" : 1348976882706 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5067c1481cda070200000010", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "As demanded by the slaves, B/C tries to assure Delano that he is in control.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "owner of all", "uuid" : "7DD20171", "_id" : { "$oid" : "5067c1481cda070200000010" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[75]", "startOffset" : 6, "end" : "/div[1]/p[75]", "endOffset" : 18, "_id" : { "$oid" : "5067c1481cda070200000011" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348976968591 }, "created" : { "$date" : 1348976968591 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5067c1578825f5020000000c", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "diligent in work; hard to keep clothes clean when sailing", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "they were clean,", "uuid" : "29557BF4", "_id" : { "$oid" : "5067c1578825f5020000000c" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "Babo", "appearance" ], "ranges" : [ { "start" : "/div[1]/p[51]", "startOffset" : 121, "end" : "/div[1]/p[51]", "endOffset" : 137, "_id" : { "$oid" : "5067c1578825f5020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348976983035 }, "created" : { "$date" : 1348976983035 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5067c19f8825f5020000000e" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348977055030 }, "groups" : [ "21L.003" ], "id" : "5067c19f8825f5020000000e", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "quote" : "nothing but wide trowsers", "ranges" : [ { "start" : "/div[1]/p[51]", "startOffset" : 17, "end" : "/div[1]/p[51]", "endOffset" : 42, "_id" : { "$oid" : "5067c19f8825f5020000000f" } } ], "tags" : [ "Babo", "appearance" ], "text" : "simple, part of the show put on for Delano? trying to be inconspicuous", "updated" : { "$date" : 1348977448517 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "uuid" : "40A57796" } -{ "id" : "5067c1a88825f50200000010", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Delano made this conjecture because on previous occasions, such as the slave kid hurting the white kid, B/C demonstrated lack of control.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "none of the slaves, perhaps", "uuid" : "D6DD01C2", "_id" : { "$oid" : "5067c1a88825f50200000010" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[74]", "startOffset" : 82, "end" : "/div[1]/p[74]", "endOffset" : 109, "_id" : { "$oid" : "5067c1a88825f50200000011" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348977064092 }, "created" : { "$date" : 1348977064092 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5067c1b78825f50200000012", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "patches-->takes time to fix tears ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "coarseness and patches", "uuid" : "5687C2EE", "_id" : { "$oid" : "5067c1b78825f50200000012" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "Babo", "appearance" ], "ranges" : [ { "start" : "/div[1]/p[51]", "startOffset" : 67, "end" : "/div[1]/p[51]", "endOffset" : 89, "_id" : { "$oid" : "5067c1b78825f50200000013" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348977079769 }, "created" : { "$date" : 1348977079769 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5067c1cc8825f50200000014", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "B/C grows weary as Delano keeps expressing doubts regarding his authority.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "impatiently", "uuid" : "35B67058", "_id" : { "$oid" : "5067c1cc8825f50200000014" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[75]", "startOffset" : 29, "end" : "/div[1]/p[75]", "endOffset" : 41, "_id" : { "$oid" : "5067c1cc8825f50200000015" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348977100695 }, "created" : { "$date" : 1348977100695 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5067c2ae1cda070200000012", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Delano illustrated his prudence by carefully inquiring B/C about the details. Notice \"after a pause\" (waiting for B/C to recover), \"may I ask\", and the em-dashes.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "may I ask,\nDon Benito", "uuid" : "9A2C67D8", "_id" : { "$oid" : "5067c2ae1cda070200000012" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[77]", "startOffset" : 121, "end" : "/div[1]/p[77]", "endOffset" : 142, "_id" : { "$oid" : "5067c2ae1cda070200000013" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348977326063 }, "created" : { "$date" : 1348977326063 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5067c47c1cda070200000014", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "anomaly to be dressed so nicely in the midst of disorder", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "a certain precision in his attire\ncuriously at variance with the unsightly disorder\naround", "uuid" : "8B504074", "_id" : { "$oid" : "5067c47c1cda070200000014" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "cereno", "appearance" ], "ranges" : [ { "start" : "/div[1]/p[50]", "startOffset" : 783, "end" : "/div[1]/p[50]", "endOffset" : 873, "_id" : { "$oid" : "5067c47c1cda070200000015" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348977788562 }, "created" : { "$date" : 1348977788562 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5067c4838825f50200000016", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "B/C simply repeated what Delano said, \"died of fever\". It indicates lack of opinion--B/C was unable to provide any further information (lest he would leak the truth) other than repeating. This sentence may have drastically different meanings when stated in different tones. For example, when stated with emphasis, it may mean, \"", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Died of the fever", "uuid" : "370DC87F", "_id" : { "$oid" : "5067c4838825f50200000016" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[80]", "startOffset" : 1, "end" : "/div[1]/p[80]", "endOffset" : 18, "_id" : { "$oid" : "5067c4838825f50200000017" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348977795817 }, "created" : { "$date" : 1348977795817 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5067c4c88825f50200000018", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "contrast to Babo: many more articles of clothing, specific details \"silver\" \"fine\" \"slender\" all of high status", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "wore a loose\nChili jacket of dark velvet; white small-clothes\nand stockings, with silver buckles at the\nknee and instep; a high-crowned sombrero, of\nfine grass; a slender sword, silver mounted,\nhung from a knot in his sash—the last being an\nalmost invariable adjunct, more for utility than\nornament, o", "uuid" : "06422DEE", "_id" : { "$oid" : "5067c4c88825f50200000018" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "cereno", "appearance" ], "ranges" : [ { "start" : "/div[1]/p[50]", "startOffset" : 347, "end" : "/div[1]/p[50]", "endOffset" : 648, "_id" : { "$oid" : "5067c4c88825f50200000019" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348977864938 }, "created" : { "$date" : 1348977864938 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5067c5038825f5020000001a", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Delano justifying Cereno's dress by stating its the fashion", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "the toilette of Don Benito\nmight not, in fashion at least, have gone beyond\nthe style of the day among South Americans\nof his class.", "uuid" : "6111778B", "_id" : { "$oid" : "5067c5038825f5020000001a" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "cereno", "appearance" ], "ranges" : [ { "start" : "/div[1]/p[52]", "startOffset" : 170, "end" : "/div[1]/p[52]", "endOffset" : 302, "_id" : { "$oid" : "5067c5038825f5020000001b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348977923846 }, "created" : { "$date" : 1348977923846 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5067c5201cda070200000016", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Delano still sees something obviously wrong, but chooses to ignore it", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Still, relatively to the pale history of\nthe voyage, and his own pale face, there seemed\nsomething so incongruous in the Spaniard's\napparel, as almost to suggest the image of an\ninvalid courtier tottering about London streets\nin the time of the plague.", "uuid" : "B531D1C3", "_id" : { "$oid" : "5067c5201cda070200000016" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[52]", "startOffset" : 610, "end" : "/div[1]/p[52]", "endOffset" : 862, "_id" : { "$oid" : "5067c5201cda070200000017" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348977952500 }, "created" : { "$date" : 1348977952500 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5067c8ce8825f5020000001c", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "terrifying, unwell-->description of whiteness ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "his\nusual ghastliness", "uuid" : "4E2964FB", "_id" : { "$oid" : "5067c8ce8825f5020000001c" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "Cereno" ], "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 502, "end" : "/div[1]/p[258]", "endOffset" : 523, "_id" : { "$oid" : "5067c8ce8825f5020000001d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348978894358 }, "created" : { "$date" : 1348978894358 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5067d5258825f5020000001e", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Babo demonstrated unusual composure. If he is indeed a great servant as he seems, he should share B/C's affliction and pain. The fact that he remained calm throughout suggests that he approved what had happened on board.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "his servant", "uuid" : "DBD4F5FF", "_id" : { "$oid" : "5067d5258825f5020000001e" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[76]", "startOffset" : 70, "end" : "/div[1]/p[76]", "endOffset" : 81, "_id" : { "$oid" : "5067d5258825f5020000001f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348982053895 }, "created" : { "$date" : 1348982053895 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5067d7431cda070200000018" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348982595096 }, "groups" : [ "21L.003" ], "id" : "5067d7431cda070200000018", "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "quote" : "could I but—", "ranges" : [ { "start" : "/div[1]/p[80]", "startOffset" : 24, "end" : "/div[1]/p[80]", "endOffset" : 36, "_id" : { "$oid" : "5068b778fbb0ee020000001c" } } ], "tags" : [], "text" : "This em-dash leaves out numerous possibilities. \"Could I but ....?\"\nDie with Aranda---desperation, desire to escape the eternal torment;\nInsist the slaves be fetted---regret, thinking he would have been able to prevent the calamity;\nTell you the truth---eagerness to let Delano to be aware of the current situation.", "updated" : { "$date" : 1349039992541 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "uuid" : "7FE6AD43" } -{ "id" : "5067d8e58825f50200000020", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Quiver: to shake or vibrate with slight rapid motion. Often associated with coldness, rage, and fear. In this context, it suggests rage (for Babo's inhumane acts) and panic (as he constantly recalls these incidents).", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "quivering", "uuid" : "40BA1D98", "_id" : { "$oid" : "5067d8e58825f50200000020" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[81]", "startOffset" : 6, "end" : "/div[1]/p[81]", "endOffset" : 15, "_id" : { "$oid" : "5067d8e58825f50200000021" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1348983013752 }, "created" : { "$date" : 1348983013752 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5067d95a1cda07020000001a" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1348983130169 }, "groups" : [ "21L.003" ], "id" : "5067d95a1cda07020000001a", "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "quote" : "paused", "ranges" : [ { "start" : "/div[1]/p[81]", "startOffset" : 30, "end" : "/div[1]/p[81]", "endOffset" : 36, "_id" : { "$oid" : "5068b79afbb0ee020000001d" } } ], "tags" : [], "text" : "Here B/C feels that it has become nearly impossible for him to continue. Since this story is based on falsehood, he believes that it's beyond his ability to resume the story without revealing obvious hints (which will bring him death) or betraying his own feelings.", "updated" : { "$date" : 1349040026667 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "uuid" : "957FFCD6" } -{ "__v" : 0, "_id" : { "$oid" : "50683667fbb0ee0200000002" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1349006951862 }, "groups" : [ "21L.003" ], "id" : "50683667fbb0ee0200000002", "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "quote" : "mulatto", "ranges" : [ { "start" : "/div[1]/p[282]", "startOffset" : 127, "end" : "/div[1]/p[282]", "endOffset" : 134, "_id" : { "$oid" : "50683667fbb0ee0200000003" } } ], "tags" : [], "text" : "The turban, \"saalam,\" and \"rajah-looking\" descriptor make him seem of South Asian ethnicity, but we can take it as a fact that he is a mulatto - \"a person of mixed white and black ancestry\" (http://www.merriam-webster.com/dictionary/mulatto)", "updated" : { "$date" : 1349006983953 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "uuid" : "DB333F0D" } -{ "id" : "506836c38825f50200000022", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "\"with a side-glance\" or \"with disapproval or distrust\" (http://www.merriam-webster.com/dictionary/askance?show=0&t=1349007006)", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "askance", "uuid" : "DFC4BBB6", "_id" : { "$oid" : "506836c38825f50200000022" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[283]", "startOffset" : 295, "end" : "/div[1]/p[283]", "endOffset" : 303, "_id" : { "$oid" : "506836c38825f50200000023" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349007043109 }, "created" : { "$date" : 1349007043109 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506837038825f50200000024", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "This is a place in India.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Madras", "uuid" : "FE258D20", "_id" : { "$oid" : "506837038825f50200000024" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[282]", "startOffset" : 200, "end" : "/div[1]/p[282]", "endOffset" : 207, "_id" : { "$oid" : "506837038825f50200000025" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349007107920 }, "created" : { "$date" : 1349007107920 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506837348825f50200000026", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "\"an employee on a ship, airplane, bus, or train who manages the provisioning of food and attends passengers\" (http://www.merriam-webster.com/dictionary/steward)", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "steward", "uuid" : "E8172AE5", "_id" : { "$oid" : "506837348825f50200000026" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[282]", "startOffset" : 97, "end" : "/div[1]/p[282]", "endOffset" : 104, "_id" : { "$oid" : "506837348825f50200000027" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349007156854 }, "created" : { "$date" : 1349007156854 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50683754fbb0ee0200000004", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "The turban probably makes him look even taller; taller --> \"rajah-looking\"", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "tall", "uuid" : "821DAE39", "_id" : { "$oid" : "50683754fbb0ee0200000004" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[282]", "startOffset" : 107, "end" : "/div[1]/p[282]", "endOffset" : 111, "_id" : { "$oid" : "50683754fbb0ee0200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349007188439 }, "created" : { "$date" : 1349007188439 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506837defbb0ee0200000006", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Multiple definitions: \"1. of superior grade, luster, or value\n2. capitalized : of, relating to, or constituting the biogeographic region that includes Asia south and southeast of the Himalayas and the Malay Archipelago west of Wallace's line\" (so it could possibly refer to the Indian-subcontinent as well).\ninteresting point! oriental is \"sometimes offensive\"\n(http://www.merriam-webster.com/dictionary/orientally)", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "orientally", "uuid" : "1B19BF94", "_id" : { "$oid" : "506837defbb0ee0200000006" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[282]", "startOffset" : 136, "end" : "/div[1]/p[282]", "endOffset" : 147, "_id" : { "$oid" : "506837defbb0ee0200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349007326568 }, "created" : { "$date" : 1349007326568 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506837ee8825f50200000028", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "adds to the tallness", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "tier on tier", "uuid" : "7BFE7A76", "_id" : { "$oid" : "506837ee8825f50200000028" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[282]", "startOffset" : 243, "end" : "/div[1]/p[282]", "endOffset" : 255, "_id" : { "$oid" : "506837ee8825f50200000029" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349007342983 }, "created" : { "$date" : 1349007342983 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5068383bfbb0ee0200000008", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Babo is probably putting on a charade - he obviously is not in reality inferior to Francesco, but he manages to use expressions to show that he is jealous of Francesco's elegant appearance - which in actuality, Babo probably made him feign! ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Babo", "uuid" : "3F5D0D3A", "_id" : { "$oid" : "5068383bfbb0ee0200000008" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[283]", "startOffset" : 241, "end" : "/div[1]/p[283]", "endOffset" : 245, "_id" : { "$oid" : "5068383bfbb0ee0200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349007419696 }, "created" : { "$date" : 1349007419696 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506838b48825f5020000002a", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "\"not unconscious\" double negative - ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "not unconscious", "uuid" : "F60F304F", "_id" : { "$oid" : "506838b48825f5020000002a" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[283]", "startOffset" : 257, "end" : "/div[1]/p[283]", "endOffset" : 273, "_id" : { "$oid" : "506838b48825f5020000002b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349007540522 }, "created" : { "$date" : 1349007540522 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506838eafbb0ee020000000a", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "could have just said, \"conscious of inferiority,\" but the \"as if\" suggests that he's putting on an act", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "as if", "uuid" : "1E1AC436", "_id" : { "$oid" : "506838eafbb0ee020000000a" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[283]", "startOffset" : 252, "end" : "/div[1]/p[283]", "endOffset" : 257, "_id" : { "$oid" : "506838eafbb0ee020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349007594788 }, "created" : { "$date" : 1349007594788 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5068395a8825f5020000002c", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "adulterated has a bad connotation (kind of like polluted), but that's kind of contrary to what we would suspect Delano to think. To a racist person, wouldn't a mulatto being half-white and half-black be kind of like half-good and half-bad? ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "adulterated", "uuid" : "9A09F4C7", "_id" : { "$oid" : "5068395a8825f5020000002c" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[283]", "startOffset" : 471, "end" : "/div[1]/p[283]", "endOffset" : 483, "_id" : { "$oid" : "5068395a8825f5020000002d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349007706808 }, "created" : { "$date" : 1349007706808 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506839708825f5020000002e", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Full-blooded doesn't necessarily have a bad connotation (see next annotation)", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "full-blooded", "uuid" : "3BF442A7", "_id" : { "$oid" : "506839708825f5020000002e" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[283]", "startOffset" : 430, "end" : "/div[1]/p[283]", "endOffset" : 443, "_id" : { "$oid" : "506839708825f5020000002f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349007728433 }, "created" : { "$date" : 1349007728433 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50683997fbb0ee020000000c", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Babo clearly has Delano fooled. ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "jealous watchfulness", "uuid" : "25B65F78", "_id" : { "$oid" : "50683997fbb0ee020000000c" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[283]", "startOffset" : 375, "end" : "/div[1]/p[283]", "endOffset" : 395, "_id" : { "$oid" : "50683997fbb0ee020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349007777727 }, "created" : { "$date" : 1349007767640 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50683a0efbb0ee020000000e", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Babo is not \"jealous\" (or pretending to be) of Francesco's self-respect or dignity, which is actually lacking in Delano's view. Instead, he is \"jealous\" of Francesco's \"extreme desire to please,\" since that is what Babo pretends to pride himself in. ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "if not bespeaking much dignity of self-respect,\nyet evidenced his extreme desire to\nplease; which is doubly meritorious,", "uuid" : "B7224444", "_id" : { "$oid" : "50683a0efbb0ee020000000e" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[283]", "startOffset" : 519, "end" : "/div[1]/p[283]", "endOffset" : 641, "_id" : { "$oid" : "50683a0efbb0ee020000000f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349007886452 }, "created" : { "$date" : 1349007886452 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50683a4ffbb0ee0200000010", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "\"of, pertaining to, or like the 4th Earl of Chesterfield or his writings; elegant; urbane; suave.\"\n(http://dictionary.reference.com/browse/Chesterfieldian)", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Chesterfieldian", "uuid" : "B6562272", "_id" : { "$oid" : "50683a4ffbb0ee0200000010" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[283]", "startOffset" : 666, "end" : "/div[1]/p[283]", "endOffset" : 681, "_id" : { "$oid" : "50683a4ffbb0ee0200000011" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349007951419 }, "created" : { "$date" : 1349007951419 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50683a84fbb0ee0200000012", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "\"the art of discovering temperament and character from outward appearance\"\n(http://www.merriam-webster.com/dictionary/physiognomy)", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "physiognomy", "uuid" : "CC549AAC", "_id" : { "$oid" : "50683a84fbb0ee0200000012" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[284]", "startOffset" : 95, "end" : "/div[1]/p[284]", "endOffset" : 107, "_id" : { "$oid" : "50683a84fbb0ee0200000013" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349008004165 }, "created" : { "$date" : 1349008004165 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50683aaf8825f50200000030", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "This is racist - Delano sees Francesco as \"elegant,\" so in his mind, Africans are not so", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "European", "uuid" : "B9CCD9DD", "_id" : { "$oid" : "50683aaf8825f50200000030" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[284]", "startOffset" : 111, "end" : "/div[1]/p[284]", "endOffset" : 119, "_id" : { "$oid" : "50683aaf8825f50200000031" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349008047981 }, "created" : { "$date" : 1349008047981 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50683b688825f50200000032", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "something to do with the Civil War \n(see what looks like a narrative/ story from a newspaper from 1863 - http://www.sonofthesouth.net/leefoundation/civil-war/1863/march/vicksburg-map.htm)", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "usher-of-the-golden-rod", "uuid" : "6392D14A", "_id" : { "$oid" : "50683b688825f50200000032" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[285]", "startOffset" : 51, "end" : "/div[1]/p[285]", "endOffset" : 74, "_id" : { "$oid" : "50683b688825f50200000033" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349008232502 }, "created" : { "$date" : 1349008232502 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50683b878825f50200000034", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "For Delano, the Barabadoes planter was right. ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Barbadoes planter; that when a mulatto\nhas a regular European face, look out for him;\nhe is a devil.", "uuid" : "954FB48C", "_id" : { "$oid" : "50683b878825f50200000034" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[285]", "startOffset" : 139, "end" : "/div[1]/p[285]", "endOffset" : 239, "_id" : { "$oid" : "50683b878825f50200000035" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349008263393 }, "created" : { "$date" : 1349008263393 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50683bfd8825f50200000036", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Delano really emphasizes the \"Europeanness\" of Francesco. ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "King George'", "uuid" : "AD79EF63", "_id" : { "$oid" : "50683bfd8825f50200000036" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[285]", "startOffset" : 298, "end" : "/div[1]/p[285]", "endOffset" : 310, "_id" : { "$oid" : "50683bfd8825f50200000037" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349008381968 }, "created" : { "$date" : 1349008381968 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50683c1c8825f50200000038", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "rajah-like, king, etc. repeated", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "king", "uuid" : "74B286A7", "_id" : { "$oid" : "50683c1c8825f50200000038" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[285]", "startOffset" : 371, "end" : "/div[1]/p[285]", "endOffset" : 375, "_id" : { "$oid" : "50683c1c8825f50200000039" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349008412914 }, "created" : { "$date" : 1349008412914 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50683c6f8825f5020000003a", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "\"to act in a servile or deferential manner\" (http://dictionary.reference.com/browse/genu'flexion)", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "genuflexion", "uuid" : "62EA5A1A", "_id" : { "$oid" : "50683c6f8825f5020000003a" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[287]", "startOffset" : 153, "end" : "/div[1]/p[287]", "endOffset" : 165, "_id" : { "$oid" : "50683c6f8825f5020000003b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349008495918 }, "created" : { "$date" : 1349008495918 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50683cb38825f5020000003c", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "\"not easily excited to action or display of emotion; apathetic; sluggish\" \n(http://dictionary.reference.com/browse/phlegmatic)", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "\"Francesco is a good man,\" a sort of sluggishly\nresponded Don Benito, like a phlegmatic\nappreciator, who would neither find fault nor\nflatter.", "uuid" : "9A46C8B2", "_id" : { "$oid" : "50683cb38825f5020000003c" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[288]", "startOffset" : 0, "end" : "/div[1]/p[289]", "endOffset" : 0, "_id" : { "$oid" : "50683cb38825f5020000003d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349008563909 }, "created" : { "$date" : 1349008563909 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50683d088825f5020000003e", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "strong language", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "pouring\nvitriolic acid into black brot", "uuid" : "21A395E9", "_id" : { "$oid" : "50683d088825f5020000003e" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[289]", "startOffset" : 214, "end" : "/div[1]/p[289]", "endOffset" : 252, "_id" : { "$oid" : "50683d088825f5020000003f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349008648927 }, "created" : { "$date" : 1349008648927 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50683d258825f50200000040", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "checking if Babo's listening?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "glancing\nat Babo", "uuid" : "36D6C4B6", "_id" : { "$oid" : "50683d258825f50200000040" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[290]", "startOffset" : 35, "end" : "/div[1]/p[290]", "endOffset" : 51, "_id" : { "$oid" : "50683d258825f50200000041" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349008677430 }, "created" : { "$date" : 1349008677430 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50683d488825f50200000042", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "is he trying to hint that Delano's assumption is incorrect?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "But I know nothing about the matter,", "uuid" : "84EC4A43", "_id" : { "$oid" : "50683d488825f50200000042" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[290]", "startOffset" : 179, "end" : "/div[1]/p[290]", "endOffset" : 215, "_id" : { "$oid" : "50683d488825f50200000043" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349008712938 }, "created" : { "$date" : 1349008712938 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50683d78fbb0ee0200000014", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "\"characterized by lack of interest, energy, or spirit\" (http://www.merriam-webster.com/dictionary/listless)", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "listlessly", "uuid" : "C300472B", "_id" : { "$oid" : "50683d78fbb0ee0200000014" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[290]", "startOffset" : 220, "end" : "/div[1]/p[290]", "endOffset" : 231, "_id" : { "$oid" : "50683d78fbb0ee0200000015" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349008760222 }, "created" : { "$date" : 1349008760222 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50683d89fbb0ee0200000016", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : " a lot of talk about the actual color of Francesco's skin", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "hue", "uuid" : "6C2A1A97", "_id" : { "$oid" : "50683d89fbb0ee0200000016" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[289]", "startOffset" : 269, "end" : "/div[1]/p[289]", "endOffset" : 272, "_id" : { "$oid" : "50683d89fbb0ee0200000017" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349008777991 }, "created" : { "$date" : 1349008777991 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50683da48825f50200000044", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "something said just in case Babo's listening", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "not to speak of negroes", "uuid" : "794540CE", "_id" : { "$oid" : "50683da48825f50200000044" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[290]", "startOffset" : 53, "end" : "/div[1]/p[290]", "endOffset" : 76, "_id" : { "$oid" : "50683da48825f50200000045" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349008804770 }, "created" : { "$date" : 1349008804770 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50683e33fbb0ee0200000018", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "\"formal permission to depart\" (check exact definition) (http://www.merriam-webster.com/dictionary/cong%C3%A9)", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "congé", "uuid" : "0F70BF8B", "_id" : { "$oid" : "50683e33fbb0ee0200000018" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[293]", "startOffset" : 188, "end" : "/div[1]/p[293]", "endOffset" : 193, "_id" : { "$oid" : "50683e33fbb0ee0200000019" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349008947761 }, "created" : { "$date" : 1349008947761 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50683e60fbb0ee020000001a", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "\"difficult to please\" (http://www.merriam-webster.com/dictionary/fastidious)", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "fastidiously", "uuid" : "1BFF6F97", "_id" : { "$oid" : "50683e60fbb0ee020000001a" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[293]", "startOffset" : 249, "end" : "/div[1]/p[293]", "endOffset" : 262, "_id" : { "$oid" : "50683e60fbb0ee020000001b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349008992455 }, "created" : { "$date" : 1349008992455 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50683e898825f50200000046", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "any attendance he gets will be superfluous - he's not really getting any!", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "superfluous", "uuid" : "17AD3C76", "_id" : { "$oid" : "50683e898825f50200000046" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[293]", "startOffset" : 310, "end" : "/div[1]/p[293]", "endOffset" : 322, "_id" : { "$oid" : "50683e898825f50200000047" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349009033589 }, "created" : { "$date" : 1349009033589 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506840d18825f50200000048", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "not rough and worn as should be from work? good servant after all?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "firm, smooth, oily\nskin", "uuid" : "B472A593", "_id" : { "$oid" : "506840d18825f50200000048" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "babo" ], "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 162, "end" : "/div[1]/p[258]", "endOffset" : 186, "_id" : { "$oid" : "506840d18825f50200000049" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349009617474 }, "created" : { "$date" : 1349009617474 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "506840eb8825f5020000004a" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1349009643628 }, "groups" : [ "21L.003" ], "id" : "506840eb8825f5020000004a", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "quote" : "sootiness", "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 620, "end" : "/div[1]/p[258]", "endOffset" : 631, "_id" : { "$oid" : "5069d85b7258220200000008" } } ], "tags" : [ "Babo" ], "text" : "back again to negative connotation of blacks; hard to tell what Melville is trying to point out to readers ; first he gives blacks intelligence-->equal to whites ,but also includes stereotypical derogatory terms ", "updated" : { "$date" : 1349113947296 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "uuid" : "1C0DB06F" } -{ "id" : "5068b8048825f5020000004c", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Both of these echo B/C's memories. He vividly remembers Aranda's body being teared from his skeleton.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "honest\neye, that honest hand", "uuid" : "CFE6E6ED", "_id" : { "$oid" : "5068b8048825f5020000004c" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[82]", "startOffset" : 353, "end" : "/div[1]/p[82]", "endOffset" : 381, "_id" : { "$oid" : "5068b8048825f5020000004d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349040132692 }, "created" : { "$date" : 1349040132692 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5068b8a4fbb0ee020000001e", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "The reality is the exact opposite. Melville lets Delano tell this unique experience in order to correspond to the situation on this ship, thus creating contrast.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "not thus strangely would the\nmention of his name affect you", "uuid" : "EBE2071B", "_id" : { "$oid" : "5068b8a4fbb0ee020000001e" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[82]", "startOffset" : 776, "end" : "/div[1]/p[82]", "endOffset" : 835, "_id" : { "$oid" : "5068b8a4fbb0ee020000001f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349040292877 }, "created" : { "$date" : 1349040292877 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5068b8f08825f5020000004e", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "B/C here repeats Delano's words again. May need to find other instances when this happens. Emotions related: fear, grief.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "On board this ship", "uuid" : "D2455F12", "_id" : { "$oid" : "5068b8f08825f5020000004e" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[83]", "startOffset" : 1, "end" : "/div[1]/p[83]", "endOffset" : 19, "_id" : { "$oid" : "5068b8f08825f5020000004f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349040368447 }, "created" : { "$date" : 1349040368447 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5068b95e8825f50200000050", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Spectre: an apparition, phantom, ghost esp. of terrifying nature. Here may refer to the sight of Aranda's body.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "spectre", "uuid" : "911D7C62", "_id" : { "$oid" : "5068b95e8825f50200000050" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[83]", "startOffset" : 99, "end" : "/div[1]/p[83]", "endOffset" : 106, "_id" : { "$oid" : "5068b95e8825f50200000051" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349040478233 }, "created" : { "$date" : 1349040478233 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5068bc668825f50200000052", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Babo is always ready to support B/C. This can be attributed to his attentiveness on one hand; on the hand, he expects B/C to be hurt constantly during this process and knows what topics will hurt him. Since he also underwent this \"tragedy\", his indifference at these scenes makes him suspicious.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "ready arms", "uuid" : "D7D91566", "_id" : { "$oid" : "5068bc668825f50200000052" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[83]", "startOffset" : 139, "end" : "/div[1]/p[83]", "endOffset" : 149, "_id" : { "$oid" : "5068bc668825f50200000053" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349041254827 }, "created" : { "$date" : 1349041254827 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5068c0bf8825f50200000054", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "In fact, Babo does not care if B/C gets hurt. He is only afraid of extended interrogation will induce B/C to leak the truth.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "silent\nappeal", "uuid" : "3DBD2796", "_id" : { "$oid" : "5068c0bf8825f50200000054" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[83]", "startOffset" : 180, "end" : "/div[1]/p[83]", "endOffset" : 193, "_id" : { "$oid" : "5068c0bf8825f50200000055" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349042367522 }, "created" : { "$date" : 1349042367522 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5068c25c8825f50200000056", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Goblin: A mischievous and ugly demon.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "goblins", "uuid" : "31763814", "_id" : { "$oid" : "5068c25c8825f50200000056" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[84]", "startOffset" : 107, "end" : "/div[1]/p[84]", "endOffset" : 115, "_id" : { "$oid" : "5068c25c8825f50200000057" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349042780719 }, "created" : { "$date" : 1349042780719 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5068c2bb8825f50200000058", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Melville writes the direct discourse (including Delano's thoughts) to deceive us. However, he leaves out Delano's observations---which are accurate and discerning---at various places to serve as clues to the truth.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "deserted\nbody of man", "uuid" : "6C33D64F", "_id" : { "$oid" : "5068c2bb8825f50200000058" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[84]", "startOffset" : 124, "end" : "/div[1]/p[84]", "endOffset" : 144, "_id" : { "$oid" : "5068c2bb8825f50200000059" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349042875868 }, "created" : { "$date" : 1349042875868 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5068c49afbb0ee0200000020", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Trance: A state of extreme apprehension or dread.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "trance", "uuid" : "7F5AF74B", "_id" : { "$oid" : "5068c49afbb0ee0200000020" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[84]", "startOffset" : 330, "end" : "/div[1]/p[84]", "endOffset" : 336, "_id" : { "$oid" : "5068c49afbb0ee0200000021" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349043354982 }, "created" : { "$date" : 1349043354982 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5068fada8825f5020000005a", "user" : "mata@mit.edu", "username" : "Matthew A.", "text" : "Black/white imagery. Muteness?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Captain Delano's attention was\ncaught by the moving figure of a gigantic\nblack, emerging from the general crowd below,\nand slowly advancing towards the elevated\npoop. An iron collar was about his neck,\nfrom which depended a chain, thrice wound\nround his body; the terminating links padlocked\ntogether at a broad band of iron, his girdle.\n\n\"How like a mute Atufal moves,\" murmured\nthe servant.\n\nThe black mounted the steps of the poop,\nand, like a brave prisoner, brought up to receive\nsentence, stood in unquailing muteness\nbefore Don Benito, now recovered from his\nattack.", "uuid" : "260C7EFC", "_id" : { "$oid" : "5068fada8825f5020000005a" }, "permissions" : { "delete" : [ "mata@mit.edu" ], "update" : [ "mata@mit.edu" ], "admin" : [ "mata@mit.edu" ], "read" : [ "mata@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[85]", "startOffset" : 192, "end" : "/div[1]/p[87]", "endOffset" : 179, "_id" : { "$oid" : "5068fada8825f5020000005b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349057242440 }, "created" : { "$date" : 1349057242440 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5068fcc5fbb0ee0200000022" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1349057733046 }, "groups" : [ "21L.003" ], "id" : "5068fcc5fbb0ee0200000022", "permissions" : { "delete" : [ "mata@mit.edu" ], "update" : [ "mata@mit.edu" ], "admin" : [ "mata@mit.edu" ], "read" : [ "mata@mit.edu" ] }, "quote" : "\"Yes,\" said the servant, entering a word,\n\"those slits in Atufal's ears once held wedges\nof gold; but poor Babo here, in his own land,\nwas only a poor slave; a black man's slave was\nBabo, who now is the white's.\"\n\nSomewhat annoyed by these conversational\nfamiliarities, Captain Delano turned curiously\nupon the attendant, then glanced inquiringly\nat his master; but, as if long wonted to these\nlittle informalities, neither master nor man\nseemed to understand him.", "ranges" : [ { "start" : "/div[1]/p[108]/i[1]", "startOffset" : 8, "end" : "/div[1]/p[110]", "endOffset" : 250, "_id" : { "$oid" : "506b7ce88859b50200000026" } } ], "tags" : [], "text" : "First time Babo speaks about himself *", "updated" : { "$date" : 1349221608386 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "user" : "mata@mit.edu", "username" : "Matthew A.", "uuid" : "057787D3" } -{ "id" : "5069028efbb0ee0200000024", "user" : "mata@mit.edu", "username" : "Matthew A.", "text" : "\"Slender silken cord\" -- what is the significance of this?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "No, no, master never will do that,\" here\nmurmured the servant to himself, \"proud Atufal\nmust first ask master's pardon. The slave\nthere carries the padlock, but master here\ncarries the key.\"\n\nHis attention thus directed, Captain Delano\nnow noticed for the first, that, suspended by a\nslender silken cord, from Don Benito's neck,\n[pg 150]\n\nhung a key. At once, from the servant's muttered\nsyllables, divining the key's purpose, he\nsmiled, and said:—\"So, Don Benito—padlock\nand key—significant symbols, truly.\"", "uuid" : "0C0A62FB", "_id" : { "$oid" : "5069028efbb0ee0200000024" }, "permissions" : { "delete" : [ "mata@mit.edu" ], "update" : [ "mata@mit.edu" ], "admin" : [ "mata@mit.edu" ], "read" : [ "mata@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[112]", "startOffset" : 1, "end" : "/div[1]/p[113]", "endOffset" : 316, "_id" : { "$oid" : "5069028efbb0ee0200000025" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349059214249 }, "created" : { "$date" : 1349059214249 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50690349fbb0ee0200000026", "user" : "mata@mit.edu", "username" : "Matthew A.", "text" : "Seems to highly regard Atufal's physical aspects", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Upon gaining the deck, Captain Delano started\nat the unexpected figure of Atufal, monumentally\nfixed at the threshold, like one of\nthose sculptured porters of black marble guarding\nthe porches of Egyptian tombs.", "uuid" : "088D4717", "_id" : { "$oid" : "50690349fbb0ee0200000026" }, "permissions" : { "delete" : [ "mata@mit.edu" ], "update" : [ "mata@mit.edu" ], "admin" : [ "mata@mit.edu" ], "read" : [ "mata@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[312]/i[1]", "startOffset" : 8, "end" : "/div[1]/p[313]", "endOffset" : 211, "_id" : { "$oid" : "50690349fbb0ee0200000027" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349059401404 }, "created" : { "$date" : 1349059401404 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506916ed8825f5020000005c", "user" : "deldar@mit.edu", "username" : "Daniel E.", "text" : "Silly to think that Frankenstein bothered to make his monster so life-like, and so ironic that in his efforts he entered the \"uncanny valley.\"", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "his hair was of a lustrous black", "uuid" : "82877C21", "_id" : { "$oid" : "506916ed8825f5020000005c" }, "permissions" : { "delete" : [ "deldar@mit.edu" ], "update" : [ "deldar@mit.edu" ], "admin" : [ "deldar@mit.edu" ], "read" : [ "deldar@mit.edu" ] }, "tags" : [ "Irony" ], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 319, "end" : "/div[1]/p[2]", "endOffset" : 351, "_id" : { "$oid" : "506916ed8825f5020000005d" } } ], "groups" : [ "21L.000", "21L.000J" ], "updated" : { "$date" : 1349064429747 }, "created" : { "$date" : 1349064429747 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506917cafbb0ee0200000028", "user" : "deldar@mit.edu", "username" : "Daniel E.", "text" : "Ingolstadt. Loved ones. Perhaps Victor is acting as his all-consuming research and monster. What gives him life consumes and threatens to kill his sister, just as how his monster consumes the life energy of Victor.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I thought I saw Elizabeth, in the bloom of health, walking in the streets of Ingolstadt. Delighted and surprised, I embraced her, but as I imprinted the first kiss on her lips, they became livid with the hue of death; her features appeared to change, and I thought that I held the corpse of my dead mother in my arms; a shroud enveloped her form, and I saw the grave-worms crawling in the folds of the flannel.", "uuid" : "EBE1466A", "_id" : { "$oid" : "506917cafbb0ee0200000028" }, "permissions" : { "delete" : [ "deldar@mit.edu" ], "update" : [ "deldar@mit.edu" ], "admin" : [ "deldar@mit.edu" ], "read" : [ "deldar@mit.edu" ] }, "tags" : [ "Exchange" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 830, "end" : "/div[1]/p[3]", "endOffset" : 1240, "_id" : { "$oid" : "506917cafbb0ee0200000029" } } ], "groups" : [ "21L.000", "21L.000J" ], "updated" : { "$date" : 1349064650758 }, "created" : { "$date" : 1349064650758 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50691813db988b0200000002", "user" : "deldar@mit.edu", "username" : "Daniel E.", "text" : "\"Bestowed existence\" vs. \"restored me to life\"", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "bestowed existence", "uuid" : "883F182C", "_id" : { "$oid" : "50691813db988b0200000002" }, "permissions" : { "delete" : [ "deldar@mit.edu" ], "update" : [ "deldar@mit.edu" ], "admin" : [ "deldar@mit.edu" ], "read" : [ "deldar@mit.edu" ] }, "tags" : [ "Reanimation" ], "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 178, "end" : "/div[1]/p[21]", "endOffset" : 196, "_id" : { "$oid" : "50691813db988b0200000003" } } ], "groups" : [ "21L.000", "21L.000J" ], "updated" : { "$date" : 1349064723326 }, "created" : { "$date" : 1349064723326 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50691afcdb988b0200000004", "user" : "deldar@mit.edu", "username" : "Daniel E.", "text" : "This manic state has driven Victor back into a child-like state?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "as children are accustomed to do when they expect a spectre to stand in waiting for them on the other side;", "uuid" : "BD2818D8", "_id" : { "$oid" : "50691afcdb988b0200000004" }, "permissions" : { "delete" : [ "deldar@mit.edu" ], "update" : [ "deldar@mit.edu" ], "admin" : [ "deldar@mit.edu" ], "read" : [ "deldar@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 686, "end" : "/div[1]/p[15]", "endOffset" : 793, "_id" : { "$oid" : "50691afcdb988b0200000005" } } ], "groups" : [ "21L.000", "21L.000J" ], "updated" : { "$date" : 1349065468018 }, "created" : { "$date" : 1349065468018 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50691b21db988b0200000006", "user" : "deldar@mit.edu", "username" : "Daniel E.", "text" : "Following the theme of child-like actions", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I clapped my hands for joy", "uuid" : "7417D745", "_id" : { "$oid" : "50691b21db988b0200000006" }, "permissions" : { "delete" : [ "deldar@mit.edu" ], "update" : [ "deldar@mit.edu" ], "admin" : [ "deldar@mit.edu" ], "read" : [ "deldar@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 1051, "end" : "/div[1]/p[15]", "endOffset" : 1078, "_id" : { "$oid" : "50691b21db988b0200000007" } } ], "groups" : [ "21L.000", "21L.000J" ], "updated" : { "$date" : 1349065505809 }, "created" : { "$date" : 1349065505809 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50692402db988b0200000008", "user" : "samin@mit.edu", "username" : "Samin H.", "text" : "Alice's traditional education", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "(for, you see, Alice\nhad learnt several things of this sort in her lessons in the schoolroom, and though this\nwas not a VERY good opportunity for showing off her knowledge, as there was no one to\nlisten to her, still it was good practice to say it over) '--yes, that's about the right\ndistance--but then I wonder what Latitude or Longitude I've got to?' (Alice had no idea\nwhat Latitude was, or Longitude either, but thought they were nice grand words to say.)", "uuid" : "2C64BF59", "_id" : { "$oid" : "50692402db988b0200000008" }, "permissions" : { "delete" : [ "samin@mit.edu" ], "update" : [ "samin@mit.edu" ], "admin" : [ "samin@mit.edu" ], "read" : [ "samin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 2949, "end" : "/div[1]/div[3]", "endOffset" : 3410, "_id" : { "$oid" : "50692402db988b0200000009" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1349067778829 }, "created" : { "$date" : 1349067778829 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5069251fdb988b020000000a", "user" : "deldar@mit.edu", "username" : "Daniel E.", "text" : "What quality does motion give to a beast to make it so disgusting?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I had gazed on him while unfinished; he was ugly then, but when those muscles and joints were rendered capable of motion, it became a thing such as even Dante could not have conceived.", "uuid" : "2B7B2C9B", "_id" : { "$oid" : "5069251fdb988b020000000a" }, "permissions" : { "delete" : [ "deldar@mit.edu" ], "update" : [ "deldar@mit.edu" ], "admin" : [ "deldar@mit.edu" ], "read" : [ "deldar@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 136, "end" : "/div[1]/p[4]", "endOffset" : 320, "_id" : { "$oid" : "5069251fdb988b020000000b" } } ], "groups" : [ "21L.000", "21L.000J" ], "updated" : { "$date" : 1349068063460 }, "created" : { "$date" : 1349068063460 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5069257cdb988b020000000c", "user" : "samin@mit.edu", "username" : "Samin H.", "text" : "aging and learning lesssons", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`But then,' thought Alice, `shall I NEVER get any older than I am now? That'll be a\n\t\t\tcomfort, one way--never to be an old woman- -but then--always to have lessons to learn!\n\t\t\tOh, I shouldn't like THAT!' \n\t\t\t\n\t\t\t`Oh, you foolish Alice!' she answered herself. `How can you learn lessons in here? Why,\n\t\t\tthere's hardly room for YOU, and no room at all for any lesson-books!'", "uuid" : "72A54751", "_id" : { "$oid" : "5069257cdb988b020000000c" }, "permissions" : { "delete" : [ "samin@mit.edu" ], "update" : [ "samin@mit.edu" ], "admin" : [ "samin@mit.edu" ], "read" : [ "samin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]/p[1]", "startOffset" : 4642, "end" : "/div[1]/div[6]/p[1]", "endOffset" : 5022, "_id" : { "$oid" : "5069257cdb988b020000000d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1349068156242 }, "created" : { "$date" : 1349068156242 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506925e5fbb0ee020000002a", "user" : "deldar@mit.edu", "username" : "Daniel E.", "text" : "The environment lends itself to the scene.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "the rain pattered dismally against the panes", "uuid" : "66F9534D", "_id" : { "$oid" : "506925e5fbb0ee020000002a" }, "permissions" : { "delete" : [ "deldar@mit.edu" ], "update" : [ "deldar@mit.edu" ], "admin" : [ "deldar@mit.edu" ], "read" : [ "deldar@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 294, "end" : "/div[1]/p[1]", "endOffset" : 338, "_id" : { "$oid" : "506925e5fbb0ee020000002b" } } ], "groups" : [ "21L.000", "21L.000J" ], "updated" : { "$date" : 1349068261002 }, "created" : { "$date" : 1349068261002 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506925fcdb988b020000000e", "user" : "samin@mit.edu", "username" : "Samin H.", "text" : "Even early on Alice quickly learns that Wonderland operates an entirely different way from what she's used to back home", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "ut Alice had got so much into the way of expecting nothing but out-of-the-way\nthings to happen", "uuid" : "8980E57D", "_id" : { "$oid" : "506925fcdb988b020000000e" }, "permissions" : { "delete" : [ "samin@mit.edu" ], "update" : [ "samin@mit.edu" ], "admin" : [ "samin@mit.edu" ], "read" : [ "samin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 11173, "end" : "/div[1]/div[3]", "endOffset" : 11267, "_id" : { "$oid" : "506925fcdb988b020000000f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1349068284795 }, "created" : { "$date" : 1349068284795 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5069d40c7258220200000002", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "whites have assumptions and standards when they view blacks; here, Delano expects Babo to be a good servant, a quality he thinks is good to have in a slave", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "humane satisfaction that Captain Delano witnessed\nthe steady good conduct of Babo.", "uuid" : "55A779A6", "_id" : { "$oid" : "5069d40c7258220200000002" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "stereotypes" ], "ranges" : [ { "start" : "/div[1]/p[25]", "startOffset" : 135, "end" : "/div[1]/p[25]", "endOffset" : 217, "_id" : { "$oid" : "5069d40c7258220200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349112844043 }, "created" : { "$date" : 1349112844043 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5069d46b7258220200000004" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1349112939752 }, "groups" : [ "21L.003" ], "id" : "5069d46b7258220200000004", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "quote" : "sour and gloomy disdain,\nwhich he seemed at no pains to disguise", "ranges" : [ { "start" : "/div[1]/p[26]", "startOffset" : 575, "end" : "/div[1]/p[26]", "endOffset" : 639, "_id" : { "$oid" : "5069d46b7258220200000005" } } ], "tags" : [ "movement", "Cereno" ], "text" : "his manner-->relates to body message? is Cereno standing in such a way that contributes to his mood?", "updated" : { "$date" : 1349112953818 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "uuid" : "BED99BC9" } -{ "id" : "5069d51bdb988b0200000010", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "odd behavior; when someone looks down while talking, it means they are uncomfortable with the subject or are lying ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "vacantly\nstared at his visitor, and ended by looking\ndown on the deck. He maintained this posture\nso long,", "uuid" : "F51FEC8F", "_id" : { "$oid" : "5069d51bdb988b0200000010" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "movement", "Cereno" ], "ranges" : [ { "start" : "/div[1]/p[33]", "startOffset" : 76, "end" : "/div[1]/p[33]", "endOffset" : 182, "_id" : { "$oid" : "5069d51bdb988b0200000011" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349113115442 }, "created" : { "$date" : 1349113115442 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5069d55cdb988b0200000012", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "cough-->an interruption when Cereno is thinking about the truth (how the blacks took over)", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Here there was a sudden fainting attack of\nhis cough, brought on, no doubt, by his mental\ndistress.", "uuid" : "A3AAD5FF", "_id" : { "$oid" : "5069d55cdb988b0200000012" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "movement" ], "ranges" : [ { "start" : "/div[1]/p[36]", "startOffset" : 0, "end" : "/div[1]/p[36]", "endOffset" : 100, "_id" : { "$oid" : "5069d55cdb988b0200000013" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349113180604 }, "created" : { "$date" : 1349113180604 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5069d586db988b0200000014" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1349113222613 }, "groups" : [ "21L.003" ], "id" : "5069d586db988b0200000014", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "quote" : "the black with one arm still encircled\nhis master, at the same time keeping his eye\nfixed on his face, as if to watch for the first\nsign of complete restoration, or relapse, as the\nevent might prove.", "ranges" : [ { "start" : "/div[1]/p[36]", "startOffset" : 280, "end" : "/div[1]/p[36]", "endOffset" : 480, "_id" : { "$oid" : "5069d586db988b0200000015" } } ], "tags" : [ "Hierarchy", "switch" ], "text" : "Babo has Cereno in his arms--> in control \"Eye fixed on his face\" --> watching Cereno, making sure he doesn't spill out the truth to Delano", "updated" : { "$date" : 1349113275310 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "uuid" : "1E422612" } -{ "id" : "5069d5fcdb988b0200000016", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "as one in a dream-->was this story practiced?...Cereno should feel strong emotion when relating the story, not in a hazy state", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "proceeded, but brokenly and\nobscurely, as one in a dream.", "uuid" : "A664B905", "_id" : { "$oid" : "5069d5fcdb988b0200000016" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "movement" ], "ranges" : [ { "start" : "/div[1]/p[37]", "startOffset" : 13, "end" : "/div[1]/p[37]", "endOffset" : 70, "_id" : { "$oid" : "5069d5fcdb988b0200000017" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349113340933 }, "created" : { "$date" : 1349113340933 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5069d65bdb988b0200000018", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Delano sees the hierarchy switch, but chooses to ignore it", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "the\nblack upholding the white,", "uuid" : "B6D1B36A", "_id" : { "$oid" : "5069d65bdb988b0200000018" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "hierarchy" ], "ranges" : [ { "start" : "/div[1]/p[50]", "startOffset" : 35, "end" : "/div[1]/p[50]", "endOffset" : 67, "_id" : { "$oid" : "5069d65bdb988b0200000019" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349113435664 }, "created" : { "$date" : 1349113435664 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5069d7577258220200000006", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Delano thinks Babo is trying to take Cereno's mind off whatever is bothering him, but really Babo is constantly keeping his threat known to Cereno", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "But he deemed it more than likely\nthat the servant's anxious fidelity had something\nto do with the matter; inasmuch as the timely\ninterruption served to rally his master from the\nmood which had evidently been coming upon\nhim.", "uuid" : "B4F59B41", "_id" : { "$oid" : "5069d7577258220200000006" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "movement", "Delano" ], "ranges" : [ { "start" : "/div[1]/p[241]", "startOffset" : 191, "end" : "/div[1]/p[241]", "endOffset" : 416, "_id" : { "$oid" : "5069d7577258220200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349113687412 }, "created" : { "$date" : 1349113687412 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5069d793db988b020000001a", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Delano's stereotypes; so many assumptions made ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Most negroes are natural valets\nand hair-dressers; taking to the comb and\nbrush congenially as to the castinets, and flourishing\nthem apparently with almost equal satisfaction.", "uuid" : "CE4181E3", "_id" : { "$oid" : "5069d793db988b020000001a" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "stereotypes" ], "ranges" : [ { "start" : "/div[1]/p[251]", "startOffset" : 102, "end" : "/div[1]/p[251]", "endOffset" : 278, "_id" : { "$oid" : "5069d793db988b020000001b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349113747457 }, "created" : { "$date" : 1349113747457 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5069d80bdb988b020000001c", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Babo wielding a blade-->he is the executioner while Cereno, in the chair is the victim ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "the negro searched\namong the razors, as for the sharpest,", "uuid" : "79654D6D", "_id" : { "$oid" : "5069d80bdb988b020000001c" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "hierarchy" ], "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 24, "end" : "/div[1]/p[258]", "endOffset" : 81, "_id" : { "$oid" : "5069d80bdb988b020000001d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349113867924 }, "created" : { "$date" : 1349113867924 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5069d878db988b020000001e", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "image of the executioner and the criminal", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "that in the black he saw a headsman, and in\nthe white a man at the block.", "uuid" : "AFDEDF35", "_id" : { "$oid" : "5069d878db988b020000001e" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "hierarchy" ], "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 790, "end" : "/div[1]/p[258]", "endOffset" : 863, "_id" : { "$oid" : "5069d878db988b020000001f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349113976968 }, "created" : { "$date" : 1349113976968 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5069d8dedb988b0200000020", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Cereno just going by the plan Babo has set", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "there was something so\nhollow in the Spaniard's manner,", "uuid" : "A0BEFBD3", "_id" : { "$oid" : "5069d8dedb988b0200000020" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[270]", "startOffset" : 62, "end" : "/div[1]/p[270]", "endOffset" : 119, "_id" : { "$oid" : "5069d8dedb988b0200000021" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349114078603 }, "created" : { "$date" : 1349114078603 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5069decadb988b0200000022", "user" : "woursler@mit.edu", "username" : "Will O.", "text" : ".... Come on.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Though the remark of Captain Delano, a\nman of such native simplicity as to be incapable\nof satire or irony, had been dropped in\nplayful allusion to the Spaniard's singularly\nevidenced lordship over the black; yet the\nhypochondriac seemed some way to have taken\nit as a malicious reflection upon his confessed\ninability thus far to break down, at least, on a\nverbal summons, the entrenched will of the\nslave. Deploring this supposed misconception,\nyet despairing of correcting it, Captain Delano\nshifted the subject; but finding his companion\nmore than ever withdrawn, as if still sourly\ndigesting the lees of the presumed affront\nabove-mentioned, by-and-by Captain Delano\nlikewise became less talkative, oppressed,\nagainst his own will, by what seemed the secret\nvindictiveness of the morbidly sensitive Spaniard.\nBut the good sailor, himself of a quite\ncontrary disposition, refrained, on his part,", "uuid" : "5C9AB175", "_id" : { "$oid" : "5069decadb988b0200000022" }, "permissions" : { "delete" : [ "woursler@mit.edu" ], "update" : [ "woursler@mit.edu" ], "admin" : [ "woursler@mit.edu" ], "read" : [ "woursler@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[115]", "startOffset" : 0, "end" : "/div[1]/p[115]/i[1]", "endOffset" : 0, "_id" : { "$oid" : "5069decadb988b0200000023" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349115594863 }, "created" : { "$date" : 1349115594863 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5069e4f17258220200000009", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "An example of Benito's body giving away clues as to what happened.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "As he mentioned this name, his air was\nheart-broken; his knees shook; his servant\nsupported him.", "uuid" : "9C164738", "_id" : { "$oid" : "5069e4f17258220200000009" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[76]", "startOffset" : 0, "end" : "/div[1]/p[76]", "endOffset" : 96, "_id" : { "$oid" : "5069e4f1725822020000000a" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349117169191 }, "created" : { "$date" : 1349117169191 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5069e7d8725822020000000b", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Describing the appearance of Babo and Benito. Contrasts how well dressed Benito is and how Babo is in clothes that have patches. Also interesting that Babo is compared to a friar of St. Francis.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "As master and man stood before him, the\nblack upholding the white, Captain Delano\ncould not but bethink him of the beauty of\nthat relationship which could present such a\nspectacle of fidelity on the one hand and confidence\non the other. The scene was heightened\n[pg 136]\n\nby, the contrast in dress, denoting their\nrelative positions. The Spaniard wore a loose\nChili jacket of dark velvet; white small-clothes\nand stockings, with silver buckles at the\nknee and instep; a high-crowned sombrero, of\nfine grass; a slender sword, silver mounted,\nhung from a knot in his sash—the last being an\nalmost invariable adjunct, more for utility than\nornament, of a South American gentleman's\ndress to this hour. Excepting when his occasional\nnervous contortions brought about disarray,\nthere was a certain precision in his attire\ncuriously at variance with the unsightly disorder\naround; especially in the belittered\nGhetto, forward of the main-mast, wholly occupied\nby the blacks.\n\nThe servant wore nothing but wide trowsers,\napparently, from their coarseness and patches,\nmade out of some old topsail; they were clean,\nand confined at the waist by a bit of unstranded\nrope, which, with his composed, deprecatory\nair at times, made him look something like a\nbegging friar of St. Francis.", "uuid" : "AD693001", "_id" : { "$oid" : "5069e7d8725822020000000b" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[50]", "startOffset" : 0, "end" : "/div[1]/p[51]", "endOffset" : 305, "_id" : { "$oid" : "5069e7d8725822020000000c" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349117912107 }, "created" : { "$date" : 1349117912107 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5069e8d5725822020000000d", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "The young Spanish sailor is clearly trying to alert Delano to what it is really going on. By staring at Delano, he should have been tipped off that something weird was going on.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "n his embarrassment, the visitor turned his\nface to the other side of the ship. By so doing,\nhis glance accidentally fell on a young\nSpanish sailor, a coil of rope in his hand, just\nstepped from the deck to the first round of\nthe mizzen-rigging. Perhaps the man would\nnot have been particularly noticed, were it\nnot that, during his ascent to one of the yards,\n[pg 152]\n\nhe, with a sort of covert intentness, kept his\neye fixed on Captain Delano, from whom, presently,\nit passed, as if by a natural sequence, to\nthe two whisperers.\n\nHis own attention thus redirected to that\nquarter, Captain Delano gave a slight start.\nFrom something in Don Benito's manner just\nthen, it seemed as if the visitor had, at least\npartly, been the subject of the withdrawn consultation\ngoing on—a conjecture as little agreeable\nto the guest as it was little flattering to\nthe host.", "uuid" : "787EC94E", "_id" : { "$oid" : "5069e8d5725822020000000d" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[117]", "startOffset" : 1, "end" : "/div[1]/p[118]", "endOffset" : 328, "_id" : { "$oid" : "5069e8d5725822020000000e" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349118165711 }, "created" : { "$date" : 1349118165711 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5069e943725822020000000f", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Was not sure what this meant. Apparently someone of the lower nobility in Spain.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "hidalgo", "uuid" : "7001C44C", "_id" : { "$oid" : "5069e943725822020000000f" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[122]", "startOffset" : 324, "end" : "/div[1]/p[122]", "endOffset" : 331, "_id" : { "$oid" : "5069e9437258220200000010" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349118275822 }, "created" : { "$date" : 1349118275822 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5069e993db988b0200000024", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Another reference to Benito's sickly appearance. Interesting he is called an off-shoot of a true hidalgo Cereno.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Glancing over once more towards his host—whose\nside-face, revealed above the skylight,\nwas now turned towards him—he was struck\nby the profile, whose clearness of cut was refined\nby the thinness, incident to ill-health, as\nwell as ennobled about the chin by the beard.\nAway with suspicion. He was a true off-shoot\nof a true hidalgo Cereno.", "uuid" : "6D67D0BB", "_id" : { "$oid" : "5069e993db988b0200000024" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[122]", "startOffset" : 0, "end" : "/div[1]/p[122]", "endOffset" : 339, "_id" : { "$oid" : "5069e993db988b0200000025" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349118355023 }, "created" : { "$date" : 1349118355023 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5069ea7adb988b0200000026", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Shows the importance of body movements as the spanish sailor clearly was communicating with the \"silent signs\".", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "At this moment, and ere Captain Delano\ncould cast a cool thought upon what had just\n[pg 158]\n\npassed, the young Spanish sailor, before mentioned,\nwas seen descending from the rigging.\nIn act of stooping over to spring inboard to\nthe deck, his voluminous, unconfined frock, or\nshirt, of coarse woolen, much spotted with\ntar, opened out far down the chest, revealing\na soiled under garment of what seemed the\nfinest linen, edged, about the neck, with a\nnarrow blue ribbon, sadly faded and worn. At\nthis moment the young sailor's eye was again\nfixed on the whisperers, and Captain Delano\nthought he observed a lurking significance in\nit, as if silent signs, of some Freemason sort,\nhad that instant been interchanged.", "uuid" : "D439FD5E", "_id" : { "$oid" : "5069ea7adb988b0200000026" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[147]", "startOffset" : 0, "end" : "/div[1]/p[147]", "endOffset" : 714, "_id" : { "$oid" : "5069ea7adb988b0200000027" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349118586332 }, "created" : { "$date" : 1349118586332 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5069eaafdb988b0200000028", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Benito is clearly uncomfortable asking the questions.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Presently, his pale face twitching and overcast,\nthe Spaniard, still supported by his attendant,\nmoved over towards his guest, when, with\neven more than his usual embarrassment, and a\nstrange sort of intriguing intonation in his\nhusky whisper, the following conversation began:—", "uuid" : "A0754C4E", "_id" : { "$oid" : "5069eaafdb988b0200000028" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[124]", "startOffset" : 0, "end" : "/div[1]/p[124]", "endOffset" : 278, "_id" : { "$oid" : "5069eaafdb988b0200000029" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349118639243 }, "created" : { "$date" : 1349118639243 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5069eadf7258220200000011", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Contrast between Benito and Babo as Babo is composed during the questioning, while Benito is definitely uncomfortable. ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "instead of meeting the\nglance, with every token of craven discomposure\ndropped his eyes to the deck; presenting\nan unworthy contrast to his servant, who, just\nthen, was kneeling at his feet, adjusting a loose\nshoe-buckle; his disengaged face meantime,\n[pg 157]\n\nwith humble curiosity, turned openly up into\nhis master's downcast one.\n\nThe Spaniard, still with a guilty shuffle, repeated\nhis question:", "uuid" : "18142834", "_id" : { "$oid" : "5069eadf7258220200000011" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[140]", "startOffset" : 153, "end" : "/div[1]/p[141]", "endOffset" : 65, "_id" : { "$oid" : "5069eadf7258220200000012" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349118687225 }, "created" : { "$date" : 1349118687225 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5069eb9cdb988b020000002a", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Interesting passage, as Delano says that Babo appears in Benitos trust. Benito is clearly disgusted at that remark, while Babo knows it means their dsiguise is working.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "\"Ha, Don Benito, your black\nhere seems high in your trust; a sort of privy-counselor,\nin fact.\"\n\nUpon this, the servant looked up with a\ngood-natured grin, but the master started as\nfrom a venomous bite. It was a moment or\ntwo before the Spaniard sufficiently recovered\nhimself to reply; which he did, at last, with\ncold constraint:—\"Yes, Señor, I have trust in\nBabo.\"\n\nHere Babo, changing his previous grin of\nmere animal humor into an intelligent smile,\nnot ungratefully eyed his master.\n\nFinding that the Spaniard now stood silent\nand reserved, as if involuntarily, or purposely\ngiving hint that his guest's proximity was inconvenient\njust then", "uuid" : "02A9A462", "_id" : { "$oid" : "5069eb9cdb988b020000002a" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[148]", "startOffset" : 610, "end" : "/div[1]/p[151]", "endOffset" : 156, "_id" : { "$oid" : "5069eb9cdb988b020000002b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349118876682 }, "created" : { "$date" : 1349118876682 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5069ebf2db988b020000002c", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "The same sailor is again trying to give a sign to Delano and he cannot perceive it.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "leading down into the steerage,\nwhen, perceiving motion there, he looked to\nsee what moved. The same instant there was\na sparkle in the shadowy hatchway, and he\nsaw one of the Spanish sailors, prowling there\nhurriedly placing his hand in the bosom of his\nfrock, as if hiding something. Before the man\ncould have been certain who it was that was\npassing, he slunk below out of sight. But\nenough was seen of him to make it sure that\nhe was the same young sailor before noticed in\nthe rigging.", "uuid" : "C08D9823", "_id" : { "$oid" : "5069ebf2db988b020000002c" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[152]", "startOffset" : 101, "end" : "/div[1]/p[152]", "endOffset" : 591, "_id" : { "$oid" : "5069ebf2db988b020000002d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349118962546 }, "created" : { "$date" : 1349118962546 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5069ecd37258220200000013", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Another passage where the body is used. She seems happy which would be strange for a slave who is still enslaved on the ship.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "His attention had been drawn to a slumbering\nnegress, partly disclosed through the lacework\nof some rigging, lying, with youthful\nlimbs carelessly disposed, under the lee of the\nbulwarks, like a doe in the shade of a woodland\nrock. Sprawling at her lapped breasts,\nwas her wide-awake fawn, stark naked, its\nblack little body half lifted from the deck,\ncrosswise with its dam's; its hands, like two\npaws, clambering upon her; its mouth and\nnose ineffectually rooting to get at the mark;\nand meantime giving a vexatious half-grunt,\nblending with the composed snore of the\nnegress.\n[pg 175]\n\n\nThe uncommon vigor of the child at length\nroused the mother. She started up, at a distance\nfacing Captain Delano. But as if not, at\nall concerned at the attitude in which she had\nbeen caught, delightedly she caught the child\nup, with maternal transports, covering it with\nkisses.", "uuid" : "A82AAAF1", "_id" : { "$oid" : "5069ecd37258220200000013" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[181]", "startOffset" : 0, "end" : "/div[1]/p[182]", "endOffset" : 279, "_id" : { "$oid" : "5069ecd37258220200000014" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349119187509 }, "created" : { "$date" : 1349119187509 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506a3d5e7258220200000015", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Causing, attended by, or affected with physical pain", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "dolorous", "uuid" : "A3F2BDEA", "_id" : { "$oid" : "506a3d5e7258220200000015" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 409, "end" : "/div[1]/p[14]", "endOffset" : 417, "_id" : { "$oid" : "506a3d5e7258220200000016" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349139806295 }, "created" : { "$date" : 1349139806295 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506a3dbedb988b020000002e", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "undistinguished or insignificant", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "nondescript", "uuid" : "CF3A8163", "_id" : { "$oid" : "506a3dbedb988b020000002e" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[16]", "startOffset" : 94, "end" : "/div[1]/p[16]", "endOffset" : 105, "_id" : { "$oid" : "506a3dbedb988b020000002f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349139902600 }, "created" : { "$date" : 1349139902600 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506a3e377258220200000017", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Philippino", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Manilla", "uuid" : "E9E9F58A", "_id" : { "$oid" : "506a3e377258220200000017" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[16]", "startOffset" : 130, "end" : "/div[1]/p[16]", "endOffset" : 138, "_id" : { "$oid" : "506a3e377258220200000018" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349140023859 }, "created" : { "$date" : 1349140023859 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506a3e4fdb988b0200000030", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Asian (esp. Indian)", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Lascars", "uuid" : "05E6A6D6", "_id" : { "$oid" : "506a3e4fdb988b0200000030" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[16]", "startOffset" : 119, "end" : "/div[1]/p[16]", "endOffset" : 127, "_id" : { "$oid" : "506a3e4fdb988b0200000031" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349140047164 }, "created" : { "$date" : 1349140047164 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506a3f437258220200000019", "user" : "ccoop@mit.edu", "username" : "Courage C.", "text" : "very powerful", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Not\nunaffected by the close sight of the gleaming\nsteel, Don Benito nervously shuddered; his\nusual ghastliness was heightened by the lather,\nwhich lather, again, was intensified in its hue\nby the contrasting sootiness of the negro's body.", "uuid" : "5DF30DCC", "_id" : { "$oid" : "506a3f437258220200000019" }, "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 413, "end" : "/div[1]/p[258]", "endOffset" : 651, "_id" : { "$oid" : "506a3f43725822020000001a" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349140291198 }, "created" : { "$date" : 1349140291198 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "506a3faddb988b0200000032" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1349140397364 }, "groups" : [ "21L.003" ], "id" : "506a3faddb988b0200000032", "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "quote" : "This distempered\nspirit was lodged, as before hinted, in\nas distempered a frame. He was rather tall,\nbut seemed never to have been robust, and now\nwith nervous suffering was almost worn to a\nskeleton", "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 1640, "end" : "/div[1]/p[24]", "endOffset" : 1839, "_id" : { "$oid" : "506a3faddb988b0200000033" } } ], "tags" : [], "text" : "skeleton #1 Benito", "updated" : { "$date" : 1349140798483 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "user" : "ccoop@mit.edu", "username" : "Courage C.", "uuid" : "5C60AFA1" } -{ "id" : "506a3fd7725822020000001b", "user" : "ccoop@mit.edu", "username" : "Courage C.", "text" : "San Dominick as a skeleton", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "the\nAmerican expressed his regrets that the San\nDominick had no boats; none, at least, but the\nunseaworthy old hulk of the long-boat, which,\nwarped as a camel's skeleton in the desert, and\nalmost as bleached, lay pot-wise inverted amidships,\none side a little tipped, furnishing a subterraneous\nsort of den for family groups of the\nblacks, mostly women and small children; who,\nsquatting on old mats below, or perched above", "uuid" : "E6DC4C93", "_id" : { "$oid" : "506a3fd7725822020000001b" }, "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[226]", "startOffset" : 186, "end" : "/div[1]/p[226]", "endOffset" : 610, "_id" : { "$oid" : "506a3fd7725822020000001c" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349140439904 }, "created" : { "$date" : 1349140439904 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506a4018725822020000001d", "user" : "ccoop@mit.edu", "username" : "Courage C.", "text" : "Skeleton of Aranda", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "But by this time the cable of the San\nDominick had been cut; and the fag-end, in\nlashing out, whipped away the canvas shroud\n[pg 239]\n\nabout the beak, suddenly revealing, as the\nbleached hull swung round towards the open\nocean, death for the figure-head, in a human\nskeleton; chalky comment on the chalked\nwords below, \"Follow your leader.\"", "uuid" : "05F3FA59", "_id" : { "$oid" : "506a4018725822020000001d" }, "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[371]", "startOffset" : 92, "end" : "/div[1]/p[371]", "endOffset" : 432, "_id" : { "$oid" : "506a4018725822020000001e" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349140504994 }, "created" : { "$date" : 1349140504994 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506a4052db988b0200000034", "user" : "ccoop@mit.edu", "username" : "Courage C.", "text" : "skeleton shining in the moonlight; an end to the scheme", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "With creaking masts, she came heavily round\nto the wind; the prow slowly swinging into\nview of the boats, its skeleton gleaming in the\nhorizontal moonlight, and casting a gigantic\nribbed shadow upon the water. One extended\narm of the ghost seemed beckoning the whites\nto avenge it.", "uuid" : "544B7200", "_id" : { "$oid" : "506a4052db988b0200000034" }, "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[385]", "startOffset" : 0, "end" : "/div[1]/p[385]", "endOffset" : 281, "_id" : { "$oid" : "506a4052db988b0200000035" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349140562335 }, "created" : { "$date" : 1349140562335 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506a4089725822020000001f", "user" : "ccoop@mit.edu", "username" : "Courage C.", "text" : "interesting conversation about the skin color of a skeleton", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Babo showed him a skeleton, which had been\nsubstituted for the ship's proper figure-head—the image of\nChristopher Colon, the discoverer of the New World; that\nthe negro Babo asked him whose skeleton that was, and\nwhether, from its whiteness, he should not think it a white's;\nthat, upon discovering his face, the negro Babo, coming\nclose, said words to this effect: \"Keep faith with the blacks\nfrom here to Senegal, or you shall in spirit, as now in body,\nfollow your leader,\" pointing to the prow; * * * that the\nsame morning the negro Babo took by succession each\nSpaniard forward, and asked him whose skeleton that was,\nand whether, from its whiteness, he should not think it a\nwhite's;", "uuid" : "E6D153AF", "_id" : { "$oid" : "506a4089725822020000001f" }, "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[6]", "startOffset" : 8353, "end" : "/div[1]/blockquote[1]/p[6]", "endOffset" : 9042, "_id" : { "$oid" : "506a40897258220200000020" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349140617579 }, "created" : { "$date" : 1349140617579 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506a42b87258220200000022", "user" : "ccoop@mit.edu", "username" : "Courage C.", "text" : "horrible preparation of the body, which Benito may have known about, and scared him into submitting to Babo", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "that Yan was the man who, by Babo's command,\nwillingly prepared the skeleton of Don Alexandro, in a way\nthe negroes afterwards told the deponent, but which he, so\nlong as reason is left him, can never divulge", "uuid" : "D28C5E82", "_id" : { "$oid" : "506a42b87258220200000022" }, "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[18]", "startOffset" : 2062, "end" : "/div[1]/blockquote[1]/p[18]", "endOffset" : 2271, "_id" : { "$oid" : "506a42b87258220200000023" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349141176552 }, "created" : { "$date" : 1349141176552 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506a42c5db988b0200000036", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Anything which obstructs the light or sight", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "blinds", "uuid" : "7B570E9A", "_id" : { "$oid" : "506a42c5db988b0200000036" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[16]", "startOffset" : 321, "end" : "/div[1]/p[16]", "endOffset" : 327, "_id" : { "$oid" : "506a42c5db988b0200000037" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349141189917 }, "created" : { "$date" : 1349141189917 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506a430fdb988b0200000038", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "A substantial defensive work of earth", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "bulwarks", "uuid" : "32286E49", "_id" : { "$oid" : "506a430fdb988b0200000038" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[16]", "startOffset" : 351, "end" : "/div[1]/p[16]", "endOffset" : 360, "_id" : { "$oid" : "506a430fdb988b0200000039" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349141263601 }, "created" : { "$date" : 1349141263601 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506a4411db988b020000003a", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Describing the appearance of the oakum pickers and Delano's initial impression of them.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "eightened whatever, upon a\nstaid scrutiny, might have seemed unusual;\nespecially the conspicuous figures of four elderly\ngrizzled negroes, their heads like black, doddered\nwillow tops, who, in venerable contrast\nto the tumult below them, were couched,\nsphynx-like, one on the starboard cat-head,\nanother on the larboard, and the remaining pair\nface to face on the opposite bulwarks above\nthe main-chains.", "uuid" : "D15CFDF8", "_id" : { "$oid" : "506a4411db988b020000003a" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[17]", "startOffset" : 109, "end" : "/div[1]/p[17]", "endOffset" : 513, "_id" : { "$oid" : "506a4411db988b020000003b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349141521099 }, "created" : { "$date" : 1349141521099 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506a450f7258220200000024", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Delano's first impression of Benito and Babo. Benito's body movements definitely tell a different story of what has happened.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "panish captain, a gentlemanly, reserved-looking,\nand rather young man to a stranger's\neye, dressed with singular richness, but bearing\nplain traces of recent sleepless cares and disquietudes,\nstood passively by, leaning against\nthe main-mast, at one moment casting a dreary,\nspiritless look upon his excited people, at the\nnext an unhappy glance toward his visitor. By\nhis side stood a black of small stature, in whose\nrude face, as occasionally, like a shepherd's dog,\nhe mutely turned it up into the Spaniard's, sorrow\nand affection were equally blended.", "uuid" : "EBD55B97", "_id" : { "$oid" : "506a450f7258220200000024" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 146, "end" : "/div[1]/p[21]", "endOffset" : 0, "_id" : { "$oid" : "506a450f7258220200000025" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349141775236 }, "created" : { "$date" : 1349141775236 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506a4816db988b020000003c", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Benito telling the story, it is clear he has to think about what he is supposed to tell Delano.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Don Benito faltered; then, like some somnambulist\nsuddenly interfered with, vacantly\nstared at his visitor, and ended by looking\ndown on the deck. He maintained this posture\nso long, that Captain Delano, almost equally\ndisconcerted, and involuntarily almost as rude,\nturned suddenly from him, walking forward to\naccost one of the Spanish seamen for the desired\ninformation. But he had hardly gone\nfive paces, when, with a sort of eagerness, Don\nBenito invited him back, regretting his momentary\nabsence of mind, and professing readiness\nto gratify him.", "uuid" : "759E7B86", "_id" : { "$oid" : "506a4816db988b020000003c" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[33]", "startOffset" : 0, "end" : "/div[1]/p[34]", "endOffset" : 0, "_id" : { "$oid" : "506a4816db988b020000003d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349142550880 }, "created" : { "$date" : 1349142550880 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506a482bdb988b020000003e", "user" : "ccoop@mit.edu", "username" : "Courage C.", "text" : "A reminder of the death of his officers", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "but since their\ndeath all the partitioning had been thrown\ndown, and the whole interior converted into one\nspacious and airy marine hall; for absence of\nfine furniture and picturesque disarray of odd\nappurtenances, somewhat answering to the\nwide, cluttered hall of some eccentric bachelor-squire\nin the country, who hangs his shooting-jacket\nand tobacco-pouch on deer antlers, and\nkeeps his fishing-rod, tongs, and walking-stick\nin the same corner.", "uuid" : "02193D69", "_id" : { "$oid" : "506a482bdb988b020000003e" }, "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[242]", "startOffset" : 180, "end" : "/div[1]/p[242]", "endOffset" : 629, "_id" : { "$oid" : "506a482bdb988b020000003f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349142571397 }, "created" : { "$date" : 1349142571397 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506a4a567258220200000026", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Babo is seen as comfortable and gracious.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "d seeing the colored servant,\nnapkin on arm, so debonair about his\nmaster,", "uuid" : "0CC9B40D", "_id" : { "$oid" : "506a4a567258220200000026" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[253]", "startOffset" : 237, "end" : "/div[1]/p[253]", "endOffset" : 311, "_id" : { "$oid" : "506a4a567258220200000027" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349143126482 }, "created" : { "$date" : 1349143126482 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506a4bc17258220200000028", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Not unaffected - double negative stressing he is affected. Also, it stresses the whiteness of Delano as we talked about in class.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Not\nunaffected by the close sight of the gleaming\nsteel, Don Benito nervously shuddered; his\nusual ghastliness was heightened by the lather,\nwhich lather, again, was intensified in its hue\nby the contrasting sootiness of the negro's body.\nAltogether the scene was somewhat peculiar,\nat least to Captain Delano, nor, as he saw the\ntwo thus postured, could he resist the vagary,\nthat in the black he saw a headsman, and in\nthe white a man at the block. But this was\none of those antic conceits, appearing and vanishing\nin a breath, from which, perhaps, the\nbest regulated mind is not always free.", "uuid" : "346C9A04", "_id" : { "$oid" : "506a4bc17258220200000028" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 413, "end" : "/div[1]/p[258]", "endOffset" : 1007, "_id" : { "$oid" : "506a4bc17258220200000029" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349143489183 }, "created" : { "$date" : 1349143489183 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506a4c00725822020000002a", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Benito clearly very nervous.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Here an involuntary expression came over\nthe Spaniard, similar to that just before on the\ndeck,", "uuid" : "3EC5EA7B", "_id" : { "$oid" : "506a4c00725822020000002a" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[265]", "startOffset" : 0, "end" : "/div[1]/p[265]", "endOffset" : 95, "_id" : { "$oid" : "506a4c00725822020000002b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349143552216 }, "created" : { "$date" : 1349143552216 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506a4c49db988b0200000040", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Nubian - empire that rivaled Egypt", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Don Benito bore\nall, much less uneasily, at least than he had\ndone the razoring; indeed, he sat so pale and\nrigid now, that the negro seemed a Nubian\nsculptor finishing off a white statue-head.", "uuid" : "15CA9968", "_id" : { "$oid" : "506a4c49db988b0200000040" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[272]", "startOffset" : 308, "end" : "/div[1]/p[272]", "endOffset" : 501, "_id" : { "$oid" : "506a4c49db988b0200000041" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349143625566 }, "created" : { "$date" : 1349143625566 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506a4def725822020000002c", "user" : "mata@mit.edu", "username" : "Matthew A.", "text" : "color", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "white lips", "uuid" : "43F7E69E", "_id" : { "$oid" : "506a4def725822020000002c" }, "permissions" : { "delete" : [ "mata@mit.edu" ], "update" : [ "mata@mit.edu" ], "admin" : [ "mata@mit.edu" ], "read" : [ "mata@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[88]", "startOffset" : 155, "end" : "/div[1]/p[88]", "endOffset" : 165, "_id" : { "$oid" : "506a4def725822020000002d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349144047489 }, "created" : { "$date" : 1349144047489 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506a4dff725822020000002e", "user" : "mata@mit.edu", "username" : "Matthew A.", "text" : "color", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "a resentful shadow swept\nover his face", "uuid" : "44BBA1D2", "_id" : { "$oid" : "506a4dff725822020000002e" }, "permissions" : { "delete" : [ "mata@mit.edu" ], "update" : [ "mata@mit.edu" ], "admin" : [ "mata@mit.edu" ], "read" : [ "mata@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[88]", "startOffset" : 61, "end" : "/div[1]/p[88]", "endOffset" : 100, "_id" : { "$oid" : "506a4dff725822020000002f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349144063712 }, "created" : { "$date" : 1349144063712 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506a5454db988b0200000042", "user" : "mata@mit.edu", "username" : "Matthew A.", "text" : "many layers of irony here", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Though the remark of Captain Delano, a\nman of such native simplicity as to be incapable\nof satire or irony, had been dropped in\nplayful allusion to the Spaniard's singularly\nevidenced lordship over the black; yet the\nhypochondriac seemed some way to have taken\nit as a malicious reflection upon his confessed\ninability thus far to break down, at least, on a\nverbal summons, the entrenched will of the\nslave.", "uuid" : "B763BA87", "_id" : { "$oid" : "506a5454db988b0200000042" }, "permissions" : { "delete" : [ "mata@mit.edu" ], "update" : [ "mata@mit.edu" ], "admin" : [ "mata@mit.edu" ], "read" : [ "mata@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[114]", "startOffset" : 36, "end" : "/div[1]/p[115]", "endOffset" : 407, "_id" : { "$oid" : "506a5454db988b0200000043" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349145684274 }, "created" : { "$date" : 1349145684274 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506a57dfdb988b0200000044", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Another instance of Benito's nervousness", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "that the\nidea flashed across him, that possibly master\nand man, for some unknown purpose, were\nacting out, both in word and deed, nay, to the\nvery tremor of Don Benito's limbs, some juggling\nplay before him.", "uuid" : "DCE732A8", "_id" : { "$oid" : "506a57dfdb988b0200000044" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[270]", "startOffset" : 215, "end" : "/div[1]/p[270]", "endOffset" : 422, "_id" : { "$oid" : "506a57dfdb988b0200000045" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349146591655 }, "created" : { "$date" : 1349146591655 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506a57f07258220200000030", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "muschles twitching", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "the vehemence of the exercise\ncausing the muscles of his face to twitch\nrather strangely.", "uuid" : "8EFB9C12", "_id" : { "$oid" : "506a57f07258220200000030" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[271]", "startOffset" : 149, "end" : "/div[1]/p[271]", "endOffset" : 238, "_id" : { "$oid" : "506a57f07258220200000031" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349146608373 }, "created" : { "$date" : 1349146608373 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506add5012b0300200000002", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Realization at last, eh?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "the beauty of the dream vanished, and \nbreathless horror and disgust filled my heart", "uuid" : "9D1706EC", "_id" : { "$oid" : "506add5012b0300200000002" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 335, "end" : "/div[1]/p[3]", "endOffset" : 419, "_id" : { "$oid" : "506add5012b0300200000003" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349180752081 }, "created" : { "$date" : 1349180752081 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506add8712b0300200000004", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Well, at least you can admit your sins. Pity that is of no practical use though, you are damned through and through.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "I had desired it with an ardour that far exceeded \nmoderation", "uuid" : "DA25B547", "_id" : { "$oid" : "506add8712b0300200000004" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 243, "end" : "/div[1]/p[3]", "endOffset" : 304, "_id" : { "$oid" : "506add8712b0300200000005" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349180807212 }, "created" : { "$date" : 1349180807212 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506addae8859b50200000002", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Too idealistic.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "such infinite pains and care I had endeavoured to \nform?", "uuid" : "ABB50F30", "_id" : { "$oid" : "506addae8859b50200000002" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 91, "end" : "/div[1]/p[2]", "endOffset" : 147, "_id" : { "$oid" : "506addae8859b50200000003" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349180846339 }, "created" : { "$date" : 1349180846339 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506addcd12b0300200000006", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "THIS IS NOT TYPICAL OF A MAN OF SCIENCE!", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "Unable to endure the aspect of \nthe being I had created", "uuid" : "ECD21F39", "_id" : { "$oid" : "506addcd12b0300200000006" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 420, "end" : "/div[1]/p[3]", "endOffset" : 476, "_id" : { "$oid" : "506addcd12b0300200000007" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349180877155 }, "created" : { "$date" : 1349180877155 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506b113e12b0300200000008", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Undoing the knot means becoming the leader.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "For some one else to undo", "uuid" : "B84BD1A6", "_id" : { "$oid" : "506b113e12b0300200000008" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[198]", "startOffset" : 1, "end" : "/div[1]/p[198]", "endOffset" : 26, "_id" : { "$oid" : "506b113e12b0300200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349194046406 }, "created" : { "$date" : 1349194046406 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506b624112b0300200000017", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "We have a dreary night of November. Why is this relevant to the idea of creation? ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "dreary night of November,", "uuid" : "0AF52541", "_id" : { "$oid" : "506b624112b0300200000017" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 12, "end" : "/div[1]/p[1]", "endOffset" : 37, "_id" : { "$oid" : "506b624112b0300200000018" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349214785059 }, "created" : { "$date" : 1349214785059 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506b62608859b50200000014", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Toils is being used as hard work and Victor holds this an accomplishment.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "beheld the \naccomplishment of my toils.", "uuid" : "807DF718", "_id" : { "$oid" : "506b62608859b50200000014" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 45, "end" : "/div[1]/p[1]", "endOffset" : 84, "_id" : { "$oid" : "506b62608859b50200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349214816385 }, "created" : { "$date" : 1349214816385 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506b62c08859b50200000016", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "what are the instruments of life. It is really never specified.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "instruments of life", "uuid" : "47608B0C", "_id" : { "$oid" : "506b62c08859b50200000016" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 149, "end" : "/div[1]/p[1]", "endOffset" : 169, "_id" : { "$oid" : "506b62c08859b50200000017" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349214912566 }, "created" : { "$date" : 1349214912566 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506b62f88859b50200000018", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Infuse a spark is just saying give life to the creature. At this point the creature is just a thing, yet he remains this monster, this unnatural thing throughout.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "infuse a spark of \nbeing into the lifeless thing", "uuid" : "02D19D82", "_id" : { "$oid" : "506b62f88859b50200000018" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 193, "end" : "/div[1]/p[1]", "endOffset" : 241, "_id" : { "$oid" : "506b62f88859b50200000019" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349214968487 }, "created" : { "$date" : 1349214968487 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506b63758859b5020000001a", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "At one in the morning one can be considered fatigued. It goes well with the sleep he takes later. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "one in the \nmorning", "uuid" : "66A1AE91", "_id" : { "$oid" : "506b63758859b5020000001a" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 278, "end" : "/div[1]/p[1]", "endOffset" : 297, "_id" : { "$oid" : "506b63758859b5020000001b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349215093880 }, "created" : { "$date" : 1349215093880 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506b63ae12b0300200000019", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Imagery ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "rain pattered dismally against the panes, and my candle was nearly \nburnt out, when, by the glimmer of the half-extinguished light", "uuid" : "CAAF46A3", "_id" : { "$oid" : "506b63ae12b0300200000019" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 303, "end" : "/div[1]/p[1]", "endOffset" : 433, "_id" : { "$oid" : "506b63ae12b030020000001a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349215150243 }, "created" : { "$date" : 1349215150243 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506b652e8859b5020000001c", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "The great scientific moment of creating life has just been called a catastrophe.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "catastrophe", "uuid" : "9690E742", "_id" : { "$oid" : "506b652e8859b5020000001c" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 39, "end" : "/div[1]/p[2]", "endOffset" : 50, "_id" : { "$oid" : "506b652e8859b5020000001d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349215534040 }, "created" : { "$date" : 1349215534040 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506b653a8859b5020000001e", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "wretch", "uuid" : "85591A7B", "_id" : { "$oid" : "506b653a8859b5020000001e" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [ "monster" ], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 74, "end" : "/div[1]/p[2]", "endOffset" : 80, "_id" : { "$oid" : "506b653a8859b5020000001f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349215546968 }, "created" : { "$date" : 1349215546968 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506b659c12b030020000001b", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "A contrast of what was the ideal product vs the product produced. Victor is not a deity, he can not do the work of one. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "His limbs were in proportion, and I had selected his features as \nbeautiful. Beautiful! -- Great God! His yellow skin scarcely covered the work of \nmuscles and arteries beneath; his hair was of a lustrous black, and flowing; his \nteeth of a pearly whiteness; but these luxuriances only formed a more horrid \ncontrast with his watery eyes, that seemed almost of the same colour as the dun \nwhite sockets in which they were set, his shrivelled complexion, and straight \nblack lips.", "uuid" : "8175EFBE", "_id" : { "$oid" : "506b659c12b030020000001b" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 148, "end" : "/div[1]/p[2]", "endOffset" : 627, "_id" : { "$oid" : "506b659c12b030020000001c" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349215644709 }, "created" : { "$date" : 1349215644709 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506b65ee12b030020000001d", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Human nature is easily changeable due to the situation at hand. He was happy at one point, this was all his work. Now he is terrified of what he has in front of him.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "The different accidents of life are not so changeable as \nthe feelings of human nature", "uuid" : "A5F86E37", "_id" : { "$oid" : "506b65ee12b030020000001d" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 0, "end" : "/div[1]/p[3]", "endOffset" : 86, "_id" : { "$oid" : "506b65ee12b030020000001e" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349215726183 }, "created" : { "$date" : 1349215726183 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506b664212b030020000001f", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "It was his sole purpose for two years. He deprived himself of rest and health. It is understandable why he needs the rest from creating.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "sole purpose of infusing life into an inanimate body.", "uuid" : "87049C12", "_id" : { "$oid" : "506b664212b030020000001f" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 137, "end" : "/div[1]/p[3]", "endOffset" : 190, "_id" : { "$oid" : "506b664212b0300200000020" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349215810047 }, "created" : { "$date" : 1349215810047 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506b673e8859b50200000020", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Again, it was his only hope/work for two years.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "I had desired it with an ardour that far exceeded \nmoderation", "uuid" : "6D366F25", "_id" : { "$oid" : "506b673e8859b50200000020" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 243, "end" : "/div[1]/p[3]", "endOffset" : 304, "_id" : { "$oid" : "506b673e8859b50200000021" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349216062771 }, "created" : { "$date" : 1349216062771 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506b6d7712b0300200000023", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Babo was careful to the last detail", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "The dress, so precise and costly, worn by him\non the day whose events have been narrated,\nhad not willingly been put on. And that\nsilver-mounted sword, apparent symbol of despotic\ncommand, was not, indeed, a sword, but\nthe ghost of one. The scabbard, artificially\nstiffened, was empty.", "uuid" : "0389FE35", "_id" : { "$oid" : "506b6d7712b0300200000023" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[414]", "startOffset" : 284, "end" : "/div[1]/p[414]", "endOffset" : 569, "_id" : { "$oid" : "506b6d7712b0300200000024" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349217655287 }, "created" : { "$date" : 1349217655287 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506b6dd812b0300200000025", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "not master and slave... subtly implying that Babo is the master and Cereno the man?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "master and man", "uuid" : "AFE3CDB2", "_id" : { "$oid" : "506b6dd812b0300200000025" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[50]", "startOffset" : 3, "end" : "/div[1]/p[50]", "endOffset" : 17, "_id" : { "$oid" : "506b6dd812b0300200000026" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349217752050 }, "created" : { "$date" : 1349217752050 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "506b6e868859b50200000022" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1349217926719 }, "groups" : [ "21L.003" ], "id" : "506b6e868859b50200000022", "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "quote" : "Excepting when his occasional\nnervous contortions", "ranges" : [ { "start" : "/div[1]/p[50]", "startOffset" : 699, "end" : "/div[1]/p[50]", "endOffset" : 748, "_id" : { "$oid" : "506b6e868859b50200000023" } } ], "tags" : [], "text" : "Nervous contortions, the only flaw in Don Benito's appearance, but and important one, as it is evidence of Babo hand in the proceedings.", "updated" : { "$date" : 1349217962485 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "user" : "wrutter@mit.edu", "username" : "William R.", "uuid" : "F13E8B15" } -{ "id" : "506b714812b0300200000027", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "Saturnine:dark, moody, mysterious", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "saturnine", "uuid" : "652ED132", "_id" : { "$oid" : "506b714812b0300200000027" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 305, "end" : "/div[1]/p[21]", "endOffset" : 314, "_id" : { "$oid" : "506b714812b0300200000028" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349218632781 }, "created" : { "$date" : 1349218632781 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506b7a968859b50200000024", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Well, at least we know your delusion is about to end.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "accomplishment", "uuid" : "FFB456D6", "_id" : { "$oid" : "506b7a968859b50200000024" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 56, "end" : "/div[1]/p[1]", "endOffset" : 71, "_id" : { "$oid" : "506b7a968859b50200000025" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349221014713 }, "created" : { "$date" : 1349221014713 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506b978d8859b50200000027", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "hypochondriac is someone who worries about their health a lot...an abbot is the person at the head of a monestary", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "hypochondriac abbot", "uuid" : "8076B2B6", "_id" : { "$oid" : "506b978d8859b50200000027" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 1421, "end" : "/div[1]/p[24]", "endOffset" : 1440, "_id" : { "$oid" : "506b978d8859b50200000028" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349228429581 }, "created" : { "$date" : 1349228429581 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506ba33f8859b50200000029", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Oh yeah, your earlier dreams had sooooooo pleasant consequences. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "disturbed by the wildest dreams", "uuid" : "C0053EAE", "_id" : { "$oid" : "506ba33f8859b50200000029" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 807, "end" : "/div[1]/p[3]", "endOffset" : 838, "_id" : { "$oid" : "506ba33f8859b5020000002a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349231423702 }, "created" : { "$date" : 1349231423702 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506ba81e8859b5020000002b", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Why is it that the dream had vanished. What is so disgusting about the monster? why is it a breathless horror?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "beauty of the dream vanished, and \nbreathless horror and disgust filled my heart.", "uuid" : "B6BF665A", "_id" : { "$oid" : "506ba81e8859b5020000002b" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 339, "end" : "/div[1]/p[3]", "endOffset" : 420, "_id" : { "$oid" : "506ba81e8859b5020000002c" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349232670497 }, "created" : { "$date" : 1349232670497 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb00612b030020000002b", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Why?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "Unable to endure the aspect of \nthe being I had created", "uuid" : "5EED2EE5", "_id" : { "$oid" : "506bb00612b030020000002b" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 421, "end" : "/div[1]/p[3]", "endOffset" : 476, "_id" : { "$oid" : "506bb00612b030020000002c" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349234694983 }, "created" : { "$date" : 1349234694983 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb01f8859b5020000002d", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "He had a nightmare while he slept.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "I slept indeed, but I was disturbed by the wildest dreams.", "uuid" : "DC1DA26C", "_id" : { "$oid" : "506bb01f8859b5020000002d" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 781, "end" : "/div[1]/p[3]", "endOffset" : 839, "_id" : { "$oid" : "506bb01f8859b5020000002e" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349234719596 }, "created" : { "$date" : 1349234719596 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb05f12b030020000002d", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Elizabeth dies in the dream, the sentence further explains that she changes into Victor's mother who had died earlier. Foreshadowing to Elizabeth's death.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "they became livid with the hue of death", "uuid" : "1EE43E9A", "_id" : { "$oid" : "506bb05f12b030020000002d" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1020, "end" : "/div[1]/p[3]", "endOffset" : 1059, "_id" : { "$oid" : "506bb05f12b030020000002e" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349234783430 }, "created" : { "$date" : 1349234783430 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb08e12b030020000002f", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Someone that Victor finds so much beauty in, can also look disgusting, and so unwanted.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "I saw the grave-worms crawling in the \nfolds of the flannel", "uuid" : "069DB42E", "_id" : { "$oid" : "506bb08e12b030020000002f" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1196, "end" : "/div[1]/p[3]", "endOffset" : 1255, "_id" : { "$oid" : "506bb08e12b0300200000030" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349234830216 }, "created" : { "$date" : 1349234830216 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb0a18859b5020000002f", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "wretch", "uuid" : "F938204F", "_id" : { "$oid" : "506bb0a18859b5020000002f" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [ "monster" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1492, "end" : "/div[1]/p[3]", "endOffset" : 1498, "_id" : { "$oid" : "506bb0a18859b50200000030" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349234849883 }, "created" : { "$date" : 1349234849883 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb1028859b50200000031", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "In what sense is the monster miserable? Miserable as in looks, or as in feeling?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "miserable monster whom I had created.", "uuid" : "8687EC91", "_id" : { "$oid" : "506bb1028859b50200000031" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1506, "end" : "/div[1]/p[3]", "endOffset" : 1543, "_id" : { "$oid" : "506bb1028859b50200000032" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349234946264 }, "created" : { "$date" : 1349234946264 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb13a8859b50200000033", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Not the act of wanting to harm but the act of wanting to meet a mother/father type figure.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "held up the \ncurtain of the bed; and his eyes, if eyes they may be called, were fixed on me. \nHis jaws opened, and he muttered some inarticulate sounds, while a grin wrinkled \nhis cheeks.", "uuid" : "2A7D44B9", "_id" : { "$oid" : "506bb13a8859b50200000033" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1547, "end" : "/div[1]/p[3]", "endOffset" : 1734, "_id" : { "$oid" : "506bb13a8859b50200000034" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349235002878 }, "created" : { "$date" : 1349235002878 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb15612b0300200000031", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "wretch", "uuid" : "C49B6E8D", "_id" : { "$oid" : "506bb15612b0300200000031" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [ "monster" ], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 129, "end" : "/div[1]/p[4]", "endOffset" : 135, "_id" : { "$oid" : "506bb15612b0300200000032" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349235030369 }, "created" : { "$date" : 1349235030369 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb1a48859b50200000035", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Why is a mummy not as bad as the monster? A mummy was once alive and mummified dead. The monster was never alive to begin with. He is brought to life from unnatural beginnings.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "A mummy again endued with animation could not be so hideous as that wretch.", "uuid" : "38F074B3", "_id" : { "$oid" : "506bb1a48859b50200000035" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 61, "end" : "/div[1]/p[4]", "endOffset" : 136, "_id" : { "$oid" : "506bb1a48859b50200000036" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349235108265 }, "created" : { "$date" : 1349235108265 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb1bf12b0300200000033", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Was Victor that miserable?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "I passed the night wretchedly", "uuid" : "45DE94BA", "_id" : { "$oid" : "506bb1bf12b0300200000033" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 0, "end" : "/div[1]/p[5]", "endOffset" : 29, "_id" : { "$oid" : "506bb1bf12b0300200000034" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349235135969 }, "created" : { "$date" : 1349235135969 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb1e812b0300200000035", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "It was his dream to create the creature yet now its his worse worry. One action can shape the course of your life.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "dreams that had been my \nfood and pleasant rest for so long a space, were now become a hell to me; and \nthe change was so rapid, the overthrow so complete!", "uuid" : "97FE24EC", "_id" : { "$oid" : "506bb1e812b0300200000035" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 270, "end" : "/div[1]/p[5]", "endOffset" : 425, "_id" : { "$oid" : "506bb1e812b0300200000036" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349235176082 }, "created" : { "$date" : 1349235176082 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb22612b0300200000037", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "He took refuge in a church, a place where a demon can not reach. Even then, he fears running into the monster. Victor is running away due to fear.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "The porter opened the gates of the court, \nwhich had that night been my asylum, and I issued into the streets, pacing them \nwith quick steps, as if I sought to avoid the wretch whom I feared every turning \nof the street would present to my view.", "uuid" : "46505C01", "_id" : { "$oid" : "506bb22612b0300200000037" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 179, "end" : "/div[1]/p[6]", "endOffset" : 424, "_id" : { "$oid" : "506bb22612b0300200000038" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349235238466 }, "created" : { "$date" : 1349235238466 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb2d412b0300200000039", "user" : "njl@mit.edu", "username" : "Nicholas L.", "text" : "Considers his creature to be a \"catastrophe\". Emotionally distraught with his failure.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "How can I describe my emotions at this catastrophe", "uuid" : "DCBD4FAC", "_id" : { "$oid" : "506bb2d412b0300200000039" }, "permissions" : { "delete" : [ "njl@mit.edu" ], "update" : [ "njl@mit.edu" ], "admin" : [ "njl@mit.edu" ], "read" : [ "njl@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 0, "end" : "/div[1]/p[2]", "endOffset" : 50, "_id" : { "$oid" : "506bb2d412b030020000003a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349235412192 }, "created" : { "$date" : 1349235412192 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb2e88859b50200000037", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Not even nature shows compassion. There has been an unbalance.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "black and comfortless sky", "uuid" : "6050FD74", "_id" : { "$oid" : "506bb2e88859b50200000037" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 565, "end" : "/div[1]/p[6]", "endOffset" : 590, "_id" : { "$oid" : "506bb2e88859b50200000038" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349235432907 }, "created" : { "$date" : 1349235432907 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb2fd8859b50200000039", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "True fear", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "My heart palpitated in the sickness of fear", "uuid" : "45E5A6C1", "_id" : { "$oid" : "506bb2fd8859b50200000039" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[7]", "startOffset" : 222, "end" : "/div[1]/p[7]", "endOffset" : 265, "_id" : { "$oid" : "506bb2fd8859b5020000003a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349235453245 }, "created" : { "$date" : 1349235453245 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb32c12b030020000003b", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Unexpected arrival of Henry Clerval", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "Henry Clerval", "uuid" : "78F4879B", "_id" : { "$oid" : "506bb32c12b030020000003b" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 416, "end" : "/div[1]/p[14]", "endOffset" : 429, "_id" : { "$oid" : "506bb32c12b030020000003c" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349235500401 }, "created" : { "$date" : 1349235500401 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb3b38859b5020000003b", "user" : "njl@mit.edu", "username" : "Nicholas L.", "text" : "Trying to rationalize and justify his expectations. Has difficulty coming to terms with the discrepancy in expectations and reality.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "I had selected his features as \nbeautiful. Beautiful!", "uuid" : "33294060", "_id" : { "$oid" : "506bb3b38859b5020000003b" }, "permissions" : { "delete" : [ "njl@mit.edu" ], "update" : [ "njl@mit.edu" ], "admin" : [ "njl@mit.edu" ], "read" : [ "njl@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 182, "end" : "/div[1]/p[2]", "endOffset" : 236, "_id" : { "$oid" : "506bb3b38859b5020000003c" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349235635413 }, "created" : { "$date" : 1349235635413 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb44f12b030020000003d", "user" : "njl@mit.edu", "username" : "Nicholas L.", "text" : "Emphasis on his disappointment. Again references the failure of reality to meet his expectations.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "disappointment: dreams that had been my \nfood and pleasant rest for so long a space", "uuid" : "D3A55154", "_id" : { "$oid" : "506bb44f12b030020000003d" }, "permissions" : { "delete" : [ "njl@mit.edu" ], "update" : [ "njl@mit.edu" ], "admin" : [ "njl@mit.edu" ], "read" : [ "njl@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 254, "end" : "/div[1]/p[5]", "endOffset" : 337, "_id" : { "$oid" : "506bb44f12b030020000003e" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349235791245 }, "created" : { "$date" : 1349235791245 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb5d112b030020000003f", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Not coincidence at all", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "how fortunate that you should be here at the very moment of my \nalighting!", "uuid" : "7CF16FBA", "_id" : { "$oid" : "506bb5d112b030020000003f" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 539, "end" : "/div[1]/p[14]", "endOffset" : 613, "_id" : { "$oid" : "506bb5d112b0300200000040" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349236177329 }, "created" : { "$date" : 1349236177329 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb7208859b5020000003d", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "He beings to start feeling better. He has his connection to his past before his incident.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "his \npresence brought back to my thoughts my father, Elizabeth, and all those scenes \nof home so dear to my recollection.", "uuid" : "55A0D6FF", "_id" : { "$oid" : "506bb7208859b5020000003d" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 50, "end" : "/div[1]/p[15]", "endOffset" : 171, "_id" : { "$oid" : "506bb7208859b5020000003e" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349236512118 }, "created" : { "$date" : 1349236512117 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb7508859b5020000003f", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "He suffered for months yet in one moment of time he now feels better from an unexpected surprise.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "for the first time during many \nmonths, calm and serene joy", "uuid" : "22909FEF", "_id" : { "$oid" : "506bb7508859b5020000003f" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 263, "end" : "/div[1]/p[15]", "endOffset" : 322, "_id" : { "$oid" : "506bb7508859b50200000040" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349236560397 }, "created" : { "$date" : 1349236560397 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb7a58859b50200000041", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Frankenstein's state of health is lamentable.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "\"I did not before remark how very ill you appear; so \nthin and pale; you look as if you had been watching for several nights.\"", "uuid" : "D297FB52", "_id" : { "$oid" : "506bb7a58859b50200000041" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[17]", "startOffset" : 246, "end" : "/div[1]/p[17]", "endOffset" : 372, "_id" : { "$oid" : "506bb7a58859b50200000042" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349236645717 }, "created" : { "$date" : 1349236645717 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb7c712b0300200000041", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Frankenstein feels safe now that he has Henry with him.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "I sincerely hope, that all these employments are now at an \nend, and that I am at length free.\"", "uuid" : "380C6AD3", "_id" : { "$oid" : "506bb7c712b0300200000041" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 155, "end" : "/div[1]/p[18]", "endOffset" : 250, "_id" : { "$oid" : "506bb7c712b0300200000042" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349236679700 }, "created" : { "$date" : 1349236679700 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb8f58859b50200000043", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "creature", "uuid" : "59C5BB21", "_id" : { "$oid" : "506bb8f58859b50200000043" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [ "monster" ], "ranges" : [ { "start" : "/div[1]/p[19]", "startOffset" : 247, "end" : "/div[1]/p[19]", "endOffset" : 255, "_id" : { "$oid" : "506bb8f58859b50200000044" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349236981431 }, "created" : { "$date" : 1349236981431 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb8fa12b0300200000043", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "monster", "uuid" : "F8A92ABC", "_id" : { "$oid" : "506bb8fa12b0300200000043" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [ "monster" ], "ranges" : [ { "start" : "/div[1]/p[19]", "startOffset" : 362, "end" : "/div[1]/p[19]", "endOffset" : 369, "_id" : { "$oid" : "506bb8fa12b0300200000044" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349236986658 }, "created" : { "$date" : 1349236986658 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb94b12b0300200000045", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "The child that Frankenstein created is now his own spectre.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "I threw the door forcibly open, as children \nare accustomed to do when they expect a spectre to stand in waiting for them on \nthe other side; but nothing appeared.", "uuid" : "FA5665FB", "_id" : { "$oid" : "506bb94b12b0300200000045" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[19]", "startOffset" : 660, "end" : "/div[1]/p[19]", "endOffset" : 823, "_id" : { "$oid" : "506bb94b12b0300200000046" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349237067217 }, "created" : { "$date" : 1349237067217 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bb95f12b0300200000047", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Yet the monster is a \"guest\" in his house.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "hideous guest", "uuid" : "8AA2153C", "_id" : { "$oid" : "506bb95f12b0300200000047" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[19]", "startOffset" : 914, "end" : "/div[1]/p[19]", "endOffset" : 927, "_id" : { "$oid" : "506bb95f12b0300200000048" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349237087957 }, "created" : { "$date" : 1349237087957 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bba8512b0300200000049", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "A wilderness attributed to the state of being lost. Finally being safe for a brief moment of time. Victor's laugh was heartless.\n", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "he saw a wildness in my eyes for which he could not account; \nand my loud, unrestrained, heartless laughter, frightened and astonished him.", "uuid" : "9AA9F4D9", "_id" : { "$oid" : "506bba8512b0300200000049" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 470, "end" : "/div[1]/p[20]", "endOffset" : 609, "_id" : { "$oid" : "506bba8512b030020000004a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349237381893 }, "created" : { "$date" : 1349237381893 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bbac38859b50200000045", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "victor's state of mind is so bad he is delusional and things the monster is there in the room. This is his suffering like Prometheus.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "Oh, save me! save me!\" I imagined that the monster seized me; I struggled \nfuriously, and fell down in a fit.", "uuid" : "EEBB9018", "_id" : { "$oid" : "506bbac38859b50200000045" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 139, "end" : "/div[1]/p[22]", "endOffset" : 248, "_id" : { "$oid" : "506bbac38859b50200000046" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349237443959 }, "created" : { "$date" : 1349237443959 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bbade8859b50200000047", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Clerval can be a Hercules", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "Poor Clerval! what must have been his feelings?", "uuid" : "796BB19C", "_id" : { "$oid" : "506bbade8859b50200000047" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[23]", "startOffset" : 0, "end" : "/div[1]/p[23]", "endOffset" : 47, "_id" : { "$oid" : "506bbade8859b50200000048" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349237470188 }, "created" : { "$date" : 1349237470188 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bbb488859b50200000049", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Henry is the one who nurses Victor back to health, both physically and mentally. He saves Victor from a life of suffering.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "He knew that I could \nnot have a more kind and attentive nurse than himself; and, firm in the hope he \nfelt of my recovery, he did not doubt that, instead of doing harm, he performed \nthe kindest action that he could towards them.", "uuid" : "83259F4C", "_id" : { "$oid" : "506bbb488859b50200000049" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 350, "end" : "/div[1]/p[24]", "endOffset" : 580, "_id" : { "$oid" : "506bbb488859b5020000004a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349237576428 }, "created" : { "$date" : 1349237576428 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bbc2c12b030020000004b", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "He fully recovers who he was before the creation of the monster. He is saved by the actions that Henry took.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "young buds were shooting forth \nfrom the trees that shaded my window. It was a divine spring; and the season \ncontributed greatly to my convalescence. I felt also sentiments of joy and \naffection revive in my bosom; my gloom disappeared, and in a short time I became \nas cheerful as before I was attacked by the fatal passion.", "uuid" : "863B3034", "_id" : { "$oid" : "506bbc2c12b030020000004b" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[26]", "startOffset" : 265, "end" : "/div[1]/p[26]", "endOffset" : 591, "_id" : { "$oid" : "506bbc2c12b030020000004c" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349237804568 }, "created" : { "$date" : 1349237804568 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bbc5612b030020000004d", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "If only he knew what Frankenstein had done in reality.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "Doubtless my words \nsurprised Henry: he at first believed them to be the wanderings of my disturbed \nimagination; but the pertinacity with which I continually recurred to the same \nsubject persuaded him that my disorder indeed owed its origin to some uncommon \nand terrible event.", "uuid" : "38897334", "_id" : { "$oid" : "506bbc5612b030020000004d" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[25]", "startOffset" : 269, "end" : "/div[1]/p[25]", "endOffset" : 549, "_id" : { "$oid" : "506bbc5612b030020000004e" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349237846262 }, "created" : { "$date" : 1349237846262 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bbc798859b5020000004b", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Prompts the journey back home.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "father and cousin \nwould be very happy if they received a letter from you in your own handwriting. \nThey hardly know how ill you have been, and are uneasy at your long silence.\"", "uuid" : "F8BB9EA7", "_id" : { "$oid" : "506bbc798859b5020000004b" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[30]", "startOffset" : 122, "end" : "/div[1]/p[30]", "endOffset" : 299, "_id" : { "$oid" : "506bbc798859b5020000004c" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349237881126 }, "created" : { "$date" : 1349237881126 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bbcf98859b5020000004d", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "Note once again the multiple instances of dehumanizing language", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "A mummy again endued with animation could not be so hideous as that wretch.", "uuid" : "82F9F06D", "_id" : { "$oid" : "506bbcf98859b5020000004d" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 59, "end" : "/div[1]/p[4]", "endOffset" : 136, "_id" : { "$oid" : "506bbcf98859b5020000004e" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349238009657 }, "created" : { "$date" : 1349238009657 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bbd2612b030020000004f", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "Frankenstein rushing away from his creation, perhaps as God rushed away from earth after the Fall?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "I rushed out of the room", "uuid" : "1710F501", "_id" : { "$oid" : "506bbd2612b030020000004f" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 477, "end" : "/div[1]/p[3]", "endOffset" : 502, "_id" : { "$oid" : "506bbd2612b0300200000050" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349238054303 }, "created" : { "$date" : 1349238054303 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bbddb8859b5020000004f", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "Frankenstein's explanation for his abandonment of his creation.\nSeems rather shallow...", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "Unable to endure the aspect of \nthe being I had created", "uuid" : "3F887D2C", "_id" : { "$oid" : "506bbddb8859b5020000004f" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 420, "end" : "/div[1]/p[3]", "endOffset" : 476, "_id" : { "$oid" : "506bbddb8859b50200000050" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349238235359 }, "created" : { "$date" : 1349238235359 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "506bc3d98859b50200000051" }, "id" : "506bc3d98859b50200000051", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "Just how far from the bedroom did he leave the monster? If he was going to run away you think he would have run further than another room. Or perhaps he was just too tired and still could not comprehend the magnitude of his achievement/blunder.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Unable to endure the aspect of the being I had created, I rushed out of the room and continued a long time traversing my bed-chamber,", "uuid" : "06FB9C15", "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 416, "end" : "/div[1]/p[3]", "endOffset" : 549, "_id" : { "$oid" : "506bc3d98859b50200000052" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349239769774 }, "created" : { "$date" : 1349239769774 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "506bc56812b0300200000051" }, "id" : "506bc56812b0300200000051", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "An odd and scary moment. The monster escaped without a trace but he could have just as easily still been inside the room yet Frankenstein opens the door anyway like a kid afraid of a ghost.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "I then paused, and a cold shivering came over me. I threw the door forcibly open, as children are accustomed to do when they expect a spectre to stand in waiting for them on the other side; but nothing appeared. I stepped fearfully in: the apartment was empty, and my bedroom was also freed from its hideous guest.", "uuid" : "988536E0", "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 603, "end" : "/div[1]/p[15]", "endOffset" : 919, "_id" : { "$oid" : "506bc56812b0300200000052" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349240168043 }, "created" : { "$date" : 1349240168043 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "506bc5e512b0300200000053" }, "id" : "506bc5e512b0300200000053", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "What about the monster... nothing...it was 2 paragraphs ago...", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "Nothing could equal my delight on seeing Clerval; his presence brought back to my thoughts my father, Elizabeth, and all those scenes of home so dear to my recollection.", "uuid" : "16D0D652", "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 0, "end" : "/div[1]/p[11]", "endOffset" : 169, "_id" : { "$oid" : "506bc5e512b0300200000054" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349240293825 }, "created" : { "$date" : 1349240293825 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bdbe712b0300200000055", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "This is a word that is not used often with people that are viewed as cargo during this time, a hint at Babo's dominance in this situation.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "expertl", "uuid" : "771D5AA6", "_id" : { "$oid" : "506bdbe712b0300200000055" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [ "words" ], "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 133, "end" : "/div[1]/p[258]", "endOffset" : 140, "_id" : { "$oid" : "506bdbe712b0300200000056" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349245927819 }, "created" : { "$date" : 1349245927819 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506bfb93ed8fca0200000002", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "Uh oh. Keeping track of lies is tough isn't it", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Yourself did, when giving me an account\nof your voyage,\" answered Captain Delano, with\nalmost equal astonishment at this eating of his\nown words, even as he ever seemed eating his\n[pg 195]\n\nown heart, on the part of the Spaniard. \"You\nyourself, Don Benito, spoke of Cape Horn,\" he\nemphatically repeated.", "uuid" : "F869A7F0", "_id" : { "$oid" : "506bfb93ed8fca0200000002" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[233]", "startOffset" : 1, "end" : "/div[1]/p[233]", "endOffset" : 304, "_id" : { "$oid" : "506bfb93ed8fca0200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349254035879 }, "created" : { "$date" : 1349254035879 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506c016fed8fca0200000004", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "This is an aggressive action. This is true for both an eager servant and a master attempting to assert his dominance", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "by throwing back his master's collar and loosening\nhis cravat.", "uuid" : "05CD84E9", "_id" : { "$oid" : "506c016fed8fca0200000004" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[250]", "startOffset" : 270, "end" : "/div[1]/p[250]", "endOffset" : 333, "_id" : { "$oid" : "506c016fed8fca0200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349255535721 }, "created" : { "$date" : 1349255535721 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506c0478f9d5d50200000002", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "As if to revel in the instant of power", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "he then made a gesture\n[pg 203]\n\nas if to begin, but midway stood suspended for\nan instant, one hand elevating the razor", "uuid" : "1C7CEE67", "_id" : { "$oid" : "506c0478f9d5d50200000002" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 203, "end" : "/div[1]/p[258]", "endOffset" : 324, "_id" : { "$oid" : "506c0478f9d5d50200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349256312430 }, "created" : { "$date" : 1349256312430 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506c05b5ed8fca0200000006", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "more nervous shuddering", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Again Don Benito faintly shuddered.", "uuid" : "58D6E88C", "_id" : { "$oid" : "506c05b5ed8fca0200000006" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[262]", "startOffset" : 0, "end" : "/div[1]/p[262]", "endOffset" : 35, "_id" : { "$oid" : "506c05b5ed8fca0200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349256629452 }, "created" : { "$date" : 1349256629452 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506c514ced8fca0200000008", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "Benito thinking about giving away secret -> him getting cut. Babo, is telling him to think twice and be careful", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Here an involuntary expression came over\nthe Spaniard, similar to that just before on the\ndeck, and whether it was the start he gave, or\na sudden gawky roll of the hull in the calm,\nor a momentary unsteadiness of the servant's\nhand, however it was, just then the razor drew\nblood, spots of which stained the creamy lather\nunder the throat:", "uuid" : "3FBD5787", "_id" : { "$oid" : "506c514ced8fca0200000008" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[265]", "startOffset" : 0, "end" : "/div[1]/p[265]", "endOffset" : 339, "_id" : { "$oid" : "506c514ced8fca0200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349275980429 }, "created" : { "$date" : 1349275980429 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506c587ef9d5d50200000004", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "so, he's clearly rehearsing a lie and having trouble keeping it straight ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "rehearsing to Captain Delano, that not\nonly were the calms of unusual duration, but\nthe ship had fallen in with obstinate currents;\nand other things he added, some of which were\nbut repetitions of former statements,", "uuid" : "7B539AEB", "_id" : { "$oid" : "506c587ef9d5d50200000004" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[269]", "startOffset" : 375, "end" : "/div[1]/p[269]", "endOffset" : 591, "_id" : { "$oid" : "506c587ef9d5d50200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349277822990 }, "created" : { "$date" : 1349277822990 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506c5913f9d5d50200000006", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Slave has, in a way, broken character, and has put the rest of the play in danger of falling apart...", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "In amazement, Captain Delano inquired what\nthis meant.", "uuid" : "1C49E4EF", "_id" : { "$oid" : "506c5913f9d5d50200000006" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[62]", "startOffset" : 0, "end" : "/div[1]/p[62]", "endOffset" : 55, "_id" : { "$oid" : "506c5913f9d5d50200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349277971144 }, "created" : { "$date" : 1349277971144 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506c5927ed8fca020000000a", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "This language suggests that Babo has skill and may in fact be the master/orchestrator instead of the slave", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Nubian\nsculptor", "uuid" : "31E11161", "_id" : { "$oid" : "506c5927ed8fca020000000a" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[272]", "startOffset" : 451, "end" : "/div[1]/p[272]", "endOffset" : 466, "_id" : { "$oid" : "506c5927ed8fca020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349277991665 }, "created" : { "$date" : 1349277991665 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506c71aef9d5d50200000008", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "It's interesting how all of these death and catastrophe descriptions/images are describing a birth", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "How can I describe my emotions at this catastrophe, or how \ndelineate the wretch whom with such infinite pains and care I had endeavoured to \nform", "uuid" : "EBEB797E", "_id" : { "$oid" : "506c71aef9d5d50200000008" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 0, "end" : "/div[1]/p[2]", "endOffset" : 146, "_id" : { "$oid" : "506c71aef9d5d50200000009" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349284270095 }, "created" : { "$date" : 1349284270095 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506c7272ed8fca020000000c", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "The environment reflects his mood, or it shows his new point of view", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "Morning, dismal and wet, at length dawned", "uuid" : "F61879EA", "_id" : { "$oid" : "506c7272ed8fca020000000c" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [ "Setting", "perspective" ], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 0, "end" : "/div[1]/p[6]", "endOffset" : 41, "_id" : { "$oid" : "506c7272ed8fca020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349284466457 }, "created" : { "$date" : 1349284466457 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506c727fed8fca020000000e", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "I trembled excessively", "uuid" : "425A4CAE", "_id" : { "$oid" : "506c727fed8fca020000000e" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[19]", "startOffset" : 0, "end" : "/div[1]/p[19]", "endOffset" : 22, "_id" : { "$oid" : "506c727fed8fca020000000f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349284479524 }, "created" : { "$date" : 1349284479524 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506c7284f9d5d5020000000a", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "It's interesting how quickly the chapter shifts from being focused on the monster to on Clerval; Victor treats Clerval with lots of love, like he should be treating the monster", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "Nothing could equal my delight on seeing Clerval;", "uuid" : "9DFBCEE1", "_id" : { "$oid" : "506c7284f9d5d5020000000a" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 0, "end" : "/div[1]/p[15]", "endOffset" : 49, "_id" : { "$oid" : "506c7284f9d5d5020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349284484599 }, "created" : { "$date" : 1349284484599 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506c72cdf9d5d5020000000c", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "Clerval attends to Victor like like victor should be attending to the monster", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "But I was in reality very ill; and surely nothing but the \nunbounded and unremitting attentions of my friend could have restored me to \nlife", "uuid" : "79C81CBC", "_id" : { "$oid" : "506c72cdf9d5d5020000000c" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[25]", "startOffset" : 0, "end" : "/div[1]/p[25]", "endOffset" : 140, "_id" : { "$oid" : "506c72cdf9d5d5020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349284557024 }, "created" : { "$date" : 1349284557024 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "506c730fed8fca0200000010" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1349284623051 }, "groups" : [ "21L.000J" ], "id" : "506c730fed8fca0200000010", "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "quote" : "How could you suppose that my \nfirst thought would not fly towards those dear, dear friends whom I love, and \nwho are so deserving of my love", "ranges" : [ { "start" : "/div[1]/p[31]", "startOffset" : 29, "end" : "/div[1]/p[31]", "endOffset" : 170, "_id" : { "$oid" : "506c730fed8fca0200000011" } } ], "tags" : [], "text" : "Victor doesn't really think about other people but just sulks about how terrible his life is and it's really annoying. His friends are \"deserving\" of his love, but they don't really receive it.", "updated" : { "$date" : 1349284814685 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "user" : "daniman@mit.edu", "username" : "Danielle M.", "uuid" : "6ABD251C" } -{ "id" : "506c7517ed8fca0200000012", "user" : "mikaelm@mit.edu", "username" : "Mikael M.", "text" : "It's interesting that Frankenstein says accidents of life when this creation was very intentional.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "The different accidents of life are not so c", "uuid" : "7C08EFFB", "_id" : { "$oid" : "506c7517ed8fca0200000012" }, "permissions" : { "delete" : [ "mikaelm@mit.edu" ], "update" : [ "mikaelm@mit.edu" ], "admin" : [ "mikaelm@mit.edu" ], "read" : [ "mikaelm@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 0, "end" : "/div[1]/p[3]", "endOffset" : 44, "_id" : { "$oid" : "506c7517ed8fca0200000013" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349285143191 }, "created" : { "$date" : 1349285143191 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506c75f3ed8fca0200000014", "user" : "mikaelm@mit.edu", "username" : "Mikael M.", "text" : "A mummy while still hideous , is physically covered, hiding his deformed exterior. Possible reasoning. A mummy is only a single human being as well. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "A mummy again endued with animation could not be so hideous as that wretch", "uuid" : "0E141582", "_id" : { "$oid" : "506c75f3ed8fca0200000014" }, "permissions" : { "delete" : [ "mikaelm@mit.edu" ], "update" : [ "mikaelm@mit.edu" ], "admin" : [ "mikaelm@mit.edu" ], "read" : [ "mikaelm@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 60, "end" : "/div[1]/p[4]", "endOffset" : 134, "_id" : { "$oid" : "506c75f3ed8fca0200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349285363090 }, "created" : { "$date" : 1349285363090 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506c7c90ed8fca0200000016", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Historical context may have impacted her decision", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "It is true that I am very averse to bringing myself forward in \n print", "uuid" : "88E956BB", "_id" : { "$oid" : "506c7c90ed8fca0200000016" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[8]", "startOffset" : 437, "end" : "/div[1]/p[8]", "endOffset" : 512, "_id" : { "$oid" : "506c7c90ed8fca0200000017" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349287056854 }, "created" : { "$date" : 1349287056854 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506c7cfeed8fca0200000018", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Writing became here solace to issue of life", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I \n accounted for them to nobody; they were my refuge when annoyed -- my \n dearest pleasure when free.", "uuid" : "A23B8D5C", "_id" : { "$oid" : "506c7cfeed8fca0200000018" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[9]", "startOffset" : 909, "end" : "/div[1]/p[9]", "endOffset" : 1021, "_id" : { "$oid" : "506c7cfeed8fca0200000019" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349287166774 }, "created" : { "$date" : 1349287166774 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506c8c43ed8fca020000001a", "user" : "kristies@mit.edu", "username" : "Kristie S.", "text" : "out of humour, vexed, troubled", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "distempered", "uuid" : "A6D91C9B", "_id" : { "$oid" : "506c8c43ed8fca020000001a" }, "permissions" : { "delete" : [ "kristies@mit.edu" ], "update" : [ "kristies@mit.edu" ], "admin" : [ "kristies@mit.edu" ], "read" : [ "kristies@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 1645, "end" : "/div[1]/p[24]", "endOffset" : 1656, "_id" : { "$oid" : "506c8c43ed8fca020000001b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349291075910 }, "created" : { "$date" : 1349291075910 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506c8e80f9d5d5020000000e", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Henry's treatment of Victor can be contrasted to Victor's treatment of his own creation and brings the harshness of Victor's actions to the minds of the readers, making us wonder if he really is in the right with his thinking", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "But I was in reality very ill; and surely nothing but the \nunbounded and unremitting attentions of my friend could have restored me to \nlife. The form of the monster on whom I had bestowed existence was for ever \nbefore my eyes, and I raved incessantly concerning him. Doubtless my words \nsurprised Henry: he at first believed them to be the wanderings of my disturbed \nimagination; but the pertinacity with which I continually recurred to the same \nsubject persuaded him that my disorder indeed owed its origin to some uncommon \nand terrible event.\nBy very slow degrees, and with frequent relapses that \nalarmed and grieved my friend, I recovered.", "uuid" : "A6B07ECE", "_id" : { "$oid" : "506c8e80f9d5d5020000000e" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "connection" ], "ranges" : [ { "start" : "/div[1]/p[25]", "startOffset" : 0, "end" : "/div[1]/p[26]", "endOffset" : 98, "_id" : { "$oid" : "506c8e80f9d5d5020000000f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349291648832 }, "created" : { "$date" : 1349291648832 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "506c952ded8fca020000001c" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1349293357937 }, "groups" : [ "21L.003" ], "id" : "506c952ded8fca020000001c", "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "quote" : "Shut up in these oaken\nwalls, chained to one dull round of command", "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 1308, "end" : "/div[1]/p[24]", "endOffset" : 1374, "_id" : { "$oid" : "506c952ded8fca020000001d" } } ], "tags" : [ "clues" ], "text" : "Cereno is literally a captive: not to his position but to the slaves.", "updated" : { "$date" : 1349293629700 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "user" : "csample@mit.edu", "username" : "Caitlin S.", "uuid" : "5F3BA1B6" } -{ "id" : "506c954aed8fca020000001e", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "\"hypochondria\" : organ thought in Middle Ages to be source of depression", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "hypochondriac", "uuid" : "88A46788", "_id" : { "$oid" : "506c954aed8fca020000001e" }, "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "illness" ], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 1421, "end" : "/div[1]/p[24]", "endOffset" : 1434, "_id" : { "$oid" : "506c954aed8fca020000001f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349293386059 }, "created" : { "$date" : 1349293386059 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506c957fed8fca0200000020", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "Cereno has nervous habits: worried about making mistake", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "at times suddenly pausing, starting, or staring,\nbiting his lip, biting his finger-nail, flushing,\npaling, twitching his beard, with other symptoms\nof an absent or moody mind", "uuid" : "10861099", "_id" : { "$oid" : "506c957fed8fca0200000020" }, "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "nervous,", "contradiction" ], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 1464, "end" : "/div[1]/p[24]", "endOffset" : 1638, "_id" : { "$oid" : "506c957fed8fca0200000021" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349293439926 }, "created" : { "$date" : 1349293439926 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506c9599ed8fca0200000022", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "Imbalance of humours", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "distempered", "uuid" : "D5B4770F", "_id" : { "$oid" : "506c9599ed8fca0200000022" }, "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "illness" ], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 1645, "end" : "/div[1]/p[24]", "endOffset" : 1656, "_id" : { "$oid" : "506c9599ed8fca0200000023" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349293465407 }, "created" : { "$date" : 1349293465407 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506c95b9f9d5d50200000010", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "Reminiscent of friend's skeleton: \"follow your leader\"", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "skeleton", "uuid" : "3D23EFD1", "_id" : { "$oid" : "506c95b9f9d5d50200000010" }, "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "death" ], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 1831, "end" : "/div[1]/p[24]", "endOffset" : 1839, "_id" : { "$oid" : "506c95b9f9d5d50200000011" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349293497016 }, "created" : { "$date" : 1349293497016 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506c95c8ed8fca0200000024", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "Shown as weak again", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "tendency to some pulmonary\ncomplaint", "uuid" : "A03B28EF", "_id" : { "$oid" : "506c95c8ed8fca0200000024" }, "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "illness" ], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 1843, "end" : "/div[1]/p[24]", "endOffset" : 1879, "_id" : { "$oid" : "506c95c8ed8fca0200000025" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349293512818 }, "created" : { "$date" : 1349293512818 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "506c961bed8fca0200000026" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1349293595269 }, "groups" : [ "21L.003" ], "id" : "506c961bed8fca0200000026", "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "quote" : "one with\nlungs half gone—hoarsely suppressed, a husky\nwhisper", "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 1947, "end" : "/div[1]/p[24]", "endOffset" : 2008, "_id" : { "$oid" : "506c961bed8fca0200000027" } } ], "tags" : [ "clues" ], "text" : "Is not just suppressed by illness but also by slaves", "updated" : { "$date" : 1349293614544 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "user" : "csample@mit.edu", "username" : "Caitlin S.", "uuid" : "663F90B7" } -{ "id" : "506c964eed8fca0200000028", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "Apprehensive because worried about betrayal", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "apprehensively", "uuid" : "16678D6A", "_id" : { "$oid" : "506c964eed8fca0200000028" }, "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "clues" ], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 2082, "end" : "/div[1]/p[24]", "endOffset" : 2096, "_id" : { "$oid" : "506c964eed8fca0200000029" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349293646284 }, "created" : { "$date" : 1349293646284 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506c969df9d5d50200000012", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "less a servant than a watchful tyrant", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "less a servant than a devoted\ncompanion", "uuid" : "43C13A3B", "_id" : { "$oid" : "506c969df9d5d50200000012" }, "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "misleading" ], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 2569, "end" : "/div[1]/p[24]", "endOffset" : 2608, "_id" : { "$oid" : "506c969df9d5d50200000013" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349293725358 }, "created" : { "$date" : 1349293725358 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506c96beed8fca020000002a", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "Blames disorder on Cereno's weakness", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "had Benito\nCereno been a man of greater energy, misrule\nwould hardly have come to the present pass", "uuid" : "4271C084", "_id" : { "$oid" : "506c96beed8fca020000002a" }, "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 672, "end" : "/div[1]/p[24]", "endOffset" : 770, "_id" : { "$oid" : "506c96beed8fca020000002b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349293758484 }, "created" : { "$date" : 1349293758484 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506c96dbed8fca020000002c", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "Mirroring: distempered spirit, distempered frame", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "distempered", "uuid" : "DB033C32", "_id" : { "$oid" : "506c96dbed8fca020000002c" }, "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "weakness" ], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 1700, "end" : "/div[1]/p[24]", "endOffset" : 1711, "_id" : { "$oid" : "506c96dbed8fca020000002d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349293787969 }, "created" : { "$date" : 1349293787969 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506c9703f9d5d50200000014", "user" : "csample@mit.edu", "username" : "Caitlin S.", "text" : "Babo's affection is very misleading: hides true intention", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "gave his master his arm, or took his handkerchief\nout of his pocket for him; performing\nthese and similar offices with that affectionate\n[pg 124]\n\nzeal which transmutes into something filial or\nfraternal acts in themselves but menial", "uuid" : "2AB3BDC9", "_id" : { "$oid" : "506c9703f9d5d50200000014" }, "permissions" : { "delete" : [ "csample@mit.edu" ], "update" : [ "csample@mit.edu" ], "admin" : [ "csample@mit.edu" ], "read" : [ "csample@mit.edu" ] }, "tags" : [ "misleading" ], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 2131, "end" : "/div[1]/p[24]", "endOffset" : 2364, "_id" : { "$oid" : "506c9703f9d5d50200000015" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349293827012 }, "created" : { "$date" : 1349293827012 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506ca9e1ed8fca020000002e", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "early in this century, malacca was known as the \"king of canes\"--> interesting that now it is black with age...reference to benito? was the captain but now taken over by Babo and blacks?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Malacca cane, black with age", "uuid" : "FCE3AF41", "_id" : { "$oid" : "506ca9e1ed8fca020000002e" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[244]", "startOffset" : 469, "end" : "/div[1]/p[244]", "endOffset" : 497, "_id" : { "$oid" : "506ca9e1ed8fca020000002f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349298657814 }, "created" : { "$date" : 1349298657814 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506caa86ed8fca0200000030", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "tried adding commentary about these earlier, but my internet kept going in and out and my comments wouldnt save...so i had to wait until i could go to starbucks and use their wifi...but this part was what sparked my decision to write my paper on this section; messenger-boy was white--> unusual at the time--> foreshadows interesting scene", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "At this moment a messenger-boy, a white,\nhurried by, in the regular performance of his\nfunction carrying the last expired half hour forward\nto the forecastle, from the cabin time-piece,\nto have it struck at the ship's large bell.", "uuid" : "112F4490", "_id" : { "$oid" : "506caa86ed8fca0200000030" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[235]", "startOffset" : 0, "end" : "/div[1]/p[235]", "endOffset" : 229, "_id" : { "$oid" : "506caa86ed8fca0200000031" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349298822443 }, "created" : { "$date" : 1349298822443 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506caaaef9d5d50200000016", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "cuddy=benito's situation; used to be one thing and now isn't....cuddy has been transformed; it is now like a jail where benito is taken whenever his master, babo, wants", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "been the quarters of the officers; but since their\ndeath all the partitioning had been thrown\ndown, and the whole interior converted into one\nspacious and airy marine hall; for absence of\nfine furniture and picturesque disarray of odd\nappurtenances, somewhat answering to the\nwide, cluttered hall of some eccentric bachelor-squire\nin the country, who hangs his shooting-jacket\nand tobacco-pouch on deer antlers, and\nkeeps his fishing-rod, tongs, and walking-stick\nin the same corner.", "uuid" : "974BF373", "_id" : { "$oid" : "506caaaef9d5d50200000016" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[242]", "startOffset" : 146, "end" : "/div[1]/p[242]", "endOffset" : 629, "_id" : { "$oid" : "506caaaef9d5d50200000017" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349298862500 }, "created" : { "$date" : 1349298862500 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cab04f9d5d50200000018", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "at the end, the intelligent blacks weren't able to complete their goal, gain complete freedom from the whites. arises a question about slavery. why did melville not let the blacks succeed? ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : ",\nfixed on a pole in the Plaza, met, unabashed,\nthe gaze of the whites; and across the Plaza\nlooked towards St. Bartholomew's church, in\nwhose vaults slept then, as now, the recovered\nbones of Aranda: and across the Rimac bridge\nlooked towards the monastery, on Mount Agonia\nwithout; where, three months after being\ndismissed by the court, Benito Cereno, borne\non the bier, did, indeed, follow his leader", "uuid" : "30B00A3D", "_id" : { "$oid" : "506cab04f9d5d50200000018" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "slavery" ], "ranges" : [ { "start" : "/div[1]/p[416]", "startOffset" : 187, "end" : "/div[1]/p[416]", "endOffset" : 591, "_id" : { "$oid" : "506cab04f9d5d50200000019" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349298948889 }, "created" : { "$date" : 1349298948889 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cab0bed8fca0200000032", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "messenger-boy comes up to Benito and says “master,” yet is he really talking about him? This quote suggests that the very person who had imposed the duty would be annoyed. Benito is probably scared to reveal his true situation. Yet the one who is annoyed is most likely Babo, for Benito’s slight slip up. Also, the sudden change of scene seems like the story is almost disjointed, maybe even not true, looking back on it. Why do they suddenly start shaving? Why shaving? Seems like a random act.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "addressing the\nrapt Spaniard with a sort of timid apprehensiveness,\nas one charged with a duty, the discharge\nof which, it was foreseen, would prove irksome\nto the very person who had imposed it, and for\nwhose benefit it was intended, \"master told me\nnever mind where he was, or how engaged, always\nto remind him to a minute, when shaving-time\ncomes. Miguel has gone to strike the half-hour\nafternoon. It is now, master. Will master\ngo into the cuddy?\"", "uuid" : "15FFEC62", "_id" : { "$oid" : "506cab0bed8fca0200000032" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[236]", "startOffset" : 75, "end" : "/div[1]/p[236]", "endOffset" : 527, "_id" : { "$oid" : "506cab0bed8fca0200000033" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349298955990 }, "created" : { "$date" : 1349298955990 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cab45ed8fca0200000034", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "drawing blood-->threat again to Benito Cereno", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "unsteadiness of the servant's\nhand, however it was, just then the razor drew\nblood, spots of which stained the creamy lather\nunder the throat: immediately the black barber\ndrew back his steel, and, remaining in his professional\nattitude, back to Captain Delano, and\nface to Don Benito, held up the trickling razor,\nsaying, with a sort of half humorous sorrow,\n\"See, master—you shook so—here's Babo's\nfirst blood.\"", "uuid" : "9FBAF65B", "_id" : { "$oid" : "506cab45ed8fca0200000034" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "Babo", "threat" ], "ranges" : [ { "start" : "/div[1]/p[265]", "startOffset" : 197, "end" : "/div[1]/p[265]", "endOffset" : 611, "_id" : { "$oid" : "506cab45ed8fca0200000035" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349299013425 }, "created" : { "$date" : 1349299013425 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cab68ed8fca0200000036", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "razor= shows strained, very close relationship between babo and benito--> this one object can make a difference in benito's life; delano should think, why would you trust a black with that kind of power?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Setting down his basin, the negro searched\namong the razors, as for the sharpest, and having\nfound it, gave it an additional edge by\nexpertly strapping it on the firm, smooth, oily\nskin of his open palm; he then made a gesture\n[pg 203]\n\nas if to begin, but midway stood suspended for\nan instant, one hand elevating the razor, the\nother professionally dabbling among the bubbling\nsuds on the Spaniard's lank neck", "uuid" : "ED1CCA81", "_id" : { "$oid" : "506cab68ed8fca0200000036" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 0, "end" : "/div[1]/p[258]", "endOffset" : 411, "_id" : { "$oid" : "506cab68ed8fca0200000037" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349299048508 }, "created" : { "$date" : 1349299048508 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cabb1f9d5d5020000001a", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "sootiness--> black and perhaps dirty; but not even dirty in the physical sense but also the mental sense--what exactly is babo trying to show here?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "hue\nby the contrasting sootiness of the negro's body.", "uuid" : "31157F9D", "_id" : { "$oid" : "506cabb1f9d5d5020000001a" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 598, "end" : "/div[1]/p[258]", "endOffset" : 652, "_id" : { "$oid" : "506cabb1f9d5d5020000001b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349299121885 }, "created" : { "$date" : 1349299121885 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cabd9f9d5d5020000001c", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "babo makes pain a reality for benito--shows he is not afraid to hurt him if he needs to", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : ", just then the razor drew\nblood,", "uuid" : "568B079C", "_id" : { "$oid" : "506cabd9f9d5d5020000001c" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[265]", "startOffset" : 247, "end" : "/div[1]/p[265]", "endOffset" : 280, "_id" : { "$oid" : "506cabd9f9d5d5020000001d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349299161174 }, "created" : { "$date" : 1349299161174 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cac4bed8fca0200000038", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "nubians--> overtook egyptians every once in a while; this can parallel with the fact that babo and his crew took over this white man's ship, although it doesnt happen often....sculptor=artist that creates--> orchestrated this whole story for delano! genius.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Nubian\nsculptor finishing off a white statue-head.", "uuid" : "086142A0", "_id" : { "$oid" : "506cac4bed8fca0200000038" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[272]", "startOffset" : 451, "end" : "/div[1]/p[272]", "endOffset" : 501, "_id" : { "$oid" : "506cac4bed8fca0200000039" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349299275956 }, "created" : { "$date" : 1349299275956 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cacf0f9d5d5020000001e", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "this short story explores relationship between whites and blacks but doesn't truly make clear what melville's take on it is; he here explicitly draws attention to the question of slavery and racism", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "\"You are saved,\" cried Captain Delano,\nmore and more astonished and pained; \"you\nare saved: what has cast such a shadow upon\nyou?\"\n\n\"The negro.\"", "uuid" : "1489E40B", "_id" : { "$oid" : "506cacf0f9d5d5020000001e" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[410]", "startOffset" : 0, "end" : "/div[1]/p[411]", "endOffset" : 12, "_id" : { "$oid" : "506cacf0f9d5d5020000001f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349299440025 }, "created" : { "$date" : 1349299440025 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cadd3f9d5d50200000020", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "first use of negro; made me feel a bit uncomfortable because i grew up always learning about what to say and what not to say, as well as being respectful of others...in history classes we had discussed the horrible language whites used to use; we've watched terrible videos that really plays an effect on african americans...was cautious of melville's language usage after this. maybe there is a point to all of it", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "negro slaves", "uuid" : "BEB503D6", "_id" : { "$oid" : "506cadd3f9d5d50200000020" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[8]", "startOffset" : 158, "end" : "/div[1]/p[8]", "endOffset" : 170, "_id" : { "$oid" : "506cadd3f9d5d50200000021" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349299667270 }, "created" : { "$date" : 1349299667270 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506caef5ed8fca020000003a", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "thoughtful end--> leaves an open end in terms of who his master is. so many questions arise from this short story!! so many different ways to read it.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "did, indeed, follow his leader.", "uuid" : "FB31A4EE", "_id" : { "$oid" : "506caef5ed8fca020000003a" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[416]", "startOffset" : 561, "end" : "/div[1]/p[416]", "endOffset" : 592, "_id" : { "$oid" : "506caef5ed8fca020000003b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349299957210 }, "created" : { "$date" : 1349299957210 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506caf56ed8fca020000003c", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "introduces the ship here...now going back on it, this simple description invokes more thought and analysis--could look into the canvas idea...what is hiding behind there? look into the ship's name...everything seems to have meaning.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "below the canvas,\nwas the sentence, \"Seguid vuestro jefe\" (follow\nyour leader); while upon the tarnished headboards,\nnear by, appeared, in stately capitals,\nonce gilt, the ship's name, \"SAN DOMINICK,\"", "uuid" : "5A7806E8", "_id" : { "$oid" : "506caf56ed8fca020000003c" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[12]", "startOffset" : 317, "end" : "/div[1]/p[12]", "endOffset" : 517, "_id" : { "$oid" : "506caf56ed8fca020000003d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349300054504 }, "created" : { "$date" : 1349300054504 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cb162f9d5d50200000022", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "funny looking back because i think maybe these slaves are just well trained; i have read stories of blacks having friendly relationships with their masters....should've known that this was all part of the tactic", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Yes, their owner was quite right in assuring\nme that no fetters would be needed with\n[pg 135]\n\nhis blacks; so that while, as is wont in this\ntransportation, those negroes have always remained\nupon deck—not thrust below, as in the\nGuinea-men—they have, also, from the beginning,\nbeen freely permitted to range within\ngiven bounds at their pleasure.\"", "uuid" : "4239B219", "_id" : { "$oid" : "506cb162f9d5d50200000022" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[45]", "startOffset" : 1, "end" : "/div[1]/p[45]", "endOffset" : 349, "_id" : { "$oid" : "506cb162f9d5d50200000023" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349300578697 }, "created" : { "$date" : 1349300578697 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cb1f3ed8fca020000003e", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "awkward pauses before talking about his late friend....what was the real reason he died? short stories don't have forever to create a huge plot; must pack intricate details without making it too obvious...so, death of a friend doesn't immediately raise flags but definitely a possibility of creepiness", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Thinking he divined the cause of such unusual\nemotion, to confirm his surmise, Captain\nDelano, after a pause, said: \"And may I ask,\nDon Benito, whether—since awhile ago you\nspoke of some cabin passengers—the friend,\nwhose loss so afflicts you, at the outset of the\nvoyage accompanied his blacks?\"\n\n\"Yes.\"\n\n\"But died of the fever?\"\n\n\"Died of the fever. Oh, could I but—\"", "uuid" : "479A79B6", "_id" : { "$oid" : "506cb1f3ed8fca020000003e" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[77]", "startOffset" : 0, "end" : "/div[1]/p[80]", "endOffset" : 37, "_id" : { "$oid" : "506cb1f3ed8fca020000003f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349300723252 }, "created" : { "$date" : 1349300723252 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cb25df9d5d50200000024", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "delano begins to inquire--> his thoughts are always cut off by benito or take a different direction...these examples are questionable, but none of them are blatantly obvious for delano to figure out the truth to the story until the end.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "ed. Suddenly, one of the\nblack boys, enraged at a word dropped by one\nof his white companions, seized a knife, and,\n[pg 141]\n\nthough called to forbear by one of the oakum-pickers,\nstruck the lad over the head, inflicting\na gash from which blood flowed.\n\nIn amazement, Captain Delano inquired what\nthis meant. To which the pale Don Benito\ndully muttered, that it was merely the sport\nof the lad.", "uuid" : "F1BDA204", "_id" : { "$oid" : "506cb25df9d5d50200000024" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[61]", "startOffset" : 320, "end" : "/div[1]/p[62]", "endOffset" : 140, "_id" : { "$oid" : "506cb25df9d5d50200000025" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349300829282 }, "created" : { "$date" : 1349300829282 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cb37cf9d5d50200000026", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "maybe delano didn't act because he was trying to be considerate of what benito wanted; even though we think he may not be very aware of anything, maybe he is but we just don't dig deep into his thoughts...the narrator speaks of delano's actions, but doesn't go deeply into his thoughts...", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "but recalling\nsomething that Don Benito had said touching\ntheir ill conduct, he refrained; as a shipmaster\nindisposed to countenance cowardice\nor unfaithfulness in seamen.", "uuid" : "A9BA5AC8", "_id" : { "$oid" : "506cb37cf9d5d50200000026" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[171]", "startOffset" : 157, "end" : "/div[1]/p[171]", "endOffset" : 328, "_id" : { "$oid" : "506cb37cf9d5d50200000027" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349301116410 }, "created" : { "$date" : 1349301116410 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cb3eff9d5d50200000028", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "more aware than it seems at first!! everything can be seen with multiple perspectives.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "suffering from thirst; in all these points, as\nwell as others, Don Benito's story had corroborated\nnot only the wailing ejaculations of\nthe indiscriminate multitude, white and black,\nbut likewise—what seemed impossible to be\ncounterfeit—by the very expression and play\nof every human feature, which Captain Delano\nsaw.", "uuid" : "981B7AF9", "_id" : { "$oid" : "506cb3eff9d5d50200000028" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[158]", "startOffset" : 546, "end" : "/div[1]/p[158]", "endOffset" : 864, "_id" : { "$oid" : "506cb3eff9d5d50200000029" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349301231518 }, "created" : { "$date" : 1349301231518 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cd3cfed8fca0200000040", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Shelley starts the volume with darkness and despair. Sets the tone for what is to come", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "IT was on a dreary night of November", "uuid" : "C87A244E", "_id" : { "$oid" : "506cd3cfed8fca0200000040" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 0, "end" : "/div[1]/p[1]", "endOffset" : 36, "_id" : { "$oid" : "506cd3cfed8fca0200000041" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349309391901 }, "created" : { "$date" : 1349309391901 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cd421f9d5d5020000002a", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Why was this so important to him? Why was he desperate to create a living being from dead corpse? Aren't there enough people around? It seems to be more of an ego thing", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "my toils", "uuid" : "C4514BB3", "_id" : { "$oid" : "506cd421f9d5d5020000002a" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 75, "end" : "/div[1]/p[1]", "endOffset" : 83, "_id" : { "$oid" : "506cd421f9d5d5020000002b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349309473953 }, "created" : { "$date" : 1349309473953 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cd536f9d5d5020000002c", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "This is quite telling. The creature lays at his feet before and during life. During life as he seeks his creator's affection and relationship. He is almost lifeless when he is alive as something he greatly desires (a relationship with his creature) is missing and he seems to spend his life looking for this.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "lifeless thing that lay at my feet", "uuid" : "C0532F07", "_id" : { "$oid" : "506cd536f9d5d5020000002c" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 227, "end" : "/div[1]/p[1]", "endOffset" : 261, "_id" : { "$oid" : "506cd536f9d5d5020000002d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349309750406 }, "created" : { "$date" : 1349309750406 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cd5a4ed8fca0200000042", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Why does Victor refer to him as the creature? Why didn't he name him? Isn't he a person?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "the creature", "uuid" : "633418F2", "_id" : { "$oid" : "506cd5a4ed8fca0200000042" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 464, "end" : "/div[1]/p[1]", "endOffset" : 478, "_id" : { "$oid" : "506cd5a4ed8fca0200000043" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349309860098 }, "created" : { "$date" : 1349309860098 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cd6c1ed8fca0200000044", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "So while his physical features were well chosen they just did not cooperatively emanate beauty and that turned off Victor. Alludes to the fact that now matter how humans try hey cannot successfully match the work of God. Another question is raised here. Why was he disappointed because of the creature's looks? Was he aiming to create beauty or to create life? Why the huge disappointment?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "How can I describe my emotions at this catastrophe, or how \ndelineate the wretch whom with such infinite pains and care I had endeavoured to \nform? His limbs were in proportion, and I had selected his features as \nbeautiful. Beautiful! -- Great God! His yellow skin scarcely covered the work of \nmuscles and arteries beneath; his hair was of a lustrous black, and flowing; his \nteeth of a pearly whiteness; but these luxuriances only formed a more horrid \ncontrast with his watery eyes, that seemed almost of the same colour as the dun \nwhite sockets in which they were set, his shrivelled complexion, and straight \nblack lips.", "uuid" : "5897F8B8", "_id" : { "$oid" : "506cd6c1ed8fca0200000044" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 0, "end" : "/div[1]/p[2]", "endOffset" : 627, "_id" : { "$oid" : "506cd6c1ed8fca0200000045" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349310194768 }, "created" : { "$date" : 1349310145781 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cd73ded8fca0200000046", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Yes! Glad you realize this. He was so pumped and then is turned off because the creature doesn't look good? S we humans are.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "The different accidents of life are not so changeable as \nthe feelings of human nature", "uuid" : "50BBA930", "_id" : { "$oid" : "506cd73ded8fca0200000046" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 0, "end" : "/div[1]/p[3]", "endOffset" : 86, "_id" : { "$oid" : "506cd73ded8fca0200000047" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349310269724 }, "created" : { "$date" : 1349310269724 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cd780ed8fca0200000048", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Two years. God did it in one day. Speaks to the struggle of humanity to do the work of God.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "I had worked hard for nearly two years", "uuid" : "4EBEDB0B", "_id" : { "$oid" : "506cd780ed8fca0200000048" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 88, "end" : "/div[1]/p[3]", "endOffset" : 126, "_id" : { "$oid" : "506cd780ed8fca0200000049" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349310336807 }, "created" : { "$date" : 1349310336807 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cd930ed8fca020000004a", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Its funny, the bible records God as using dirt to form man then breathing into man the breath of lie.....frankenstein uses dead bodies and electricity. lololol Victor uses a product of God's creation to make life, ie the bodies and electricity as electrons are apart of creation. Is he really \"original\" in essence? Is he really \"giving life\" or merely diverting it to a carrier?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "inanimate body", "uuid" : "11D187A2", "_id" : { "$oid" : "506cd930ed8fca020000004a" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 175, "end" : "/div[1]/p[3]", "endOffset" : 189, "_id" : { "$oid" : "506cd930ed8fca020000004b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349310768836 }, "created" : { "$date" : 1349310768836 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cd9b9ed8fca020000004c", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Why? Your ego? I feel like you're an egotistic man looking for recognition. Your aim was to have credit for \"giving life\" without seeing the bigger picture of taking someone into the world.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "I had desired it with an ardour that far exceeded \nmoderation", "uuid" : "58DFA57D", "_id" : { "$oid" : "506cd9b9ed8fca020000004c" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 243, "end" : "/div[1]/p[3]", "endOffset" : 304, "_id" : { "$oid" : "506cd9b9ed8fca020000004d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349310905794 }, "created" : { "$date" : 1349310905794 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cda59ed8fca020000004e", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Yea, much like most dreams. Once we attain it isn't as valuable. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "but now that I had finished, the beauty of the dream vanished", "uuid" : "0494D5F5", "_id" : { "$oid" : "506cda59ed8fca020000004e" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 306, "end" : "/div[1]/p[3]", "endOffset" : 367, "_id" : { "$oid" : "506cda59ed8fca020000004f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349311065314 }, "created" : { "$date" : 1349311065314 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cdac5f9d5d5020000002e", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Unable or unwilling? ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "Unable to endure the aspect of \nthe being I had created", "uuid" : "7966F3D3", "_id" : { "$oid" : "506cdac5f9d5d5020000002e" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 421, "end" : "/div[1]/p[3]", "endOffset" : 476, "_id" : { "$oid" : "506cdac5f9d5d5020000002f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349311173242 }, "created" : { "$date" : 1349311173242 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "506ce686f9d5d50200000030" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1349314182663 }, "groups" : [ "21L.000J" ], "id" : "506ce686f9d5d50200000030", "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "quote" : "dreary night of November", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 12, "end" : "/div[1]/p[1]", "endOffset" : 36, "_id" : { "$oid" : "506ce686f9d5d50200000031" } } ], "tags" : [], "text" : "Atypical setting for birth.", "updated" : { "$date" : 1349314309942 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "user" : "wandia@mit.edu", "username" : "Sarah W.", "uuid" : "7CF3455C" } -{ "id" : "506ce7e0f9d5d50200000032", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Ironical, since accomplishment is associated with success. Did Victor really feel successful?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "accomplishment", "uuid" : "10DDD13C", "_id" : { "$oid" : "506ce7e0f9d5d50200000032" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 57, "end" : "/div[1]/p[1]", "endOffset" : 71, "_id" : { "$oid" : "506ce7e0f9d5d50200000033" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349314528027 }, "created" : { "$date" : 1349314528027 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506ce808ed8fca0200000050", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Opposite of what a murderer does.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "infuse a spark of \nbeing into the lifeless", "uuid" : "79644F4C", "_id" : { "$oid" : "506ce808ed8fca0200000050" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 193, "end" : "/div[1]/p[1]", "endOffset" : 235, "_id" : { "$oid" : "506ce808ed8fca0200000051" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349314568202 }, "created" : { "$date" : 1349314568202 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506ce813f9d5d50200000034", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "one in the \nmorning", "uuid" : "9E887C80", "_id" : { "$oid" : "506ce813f9d5d50200000034" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 278, "end" : "/div[1]/p[1]", "endOffset" : 297, "_id" : { "$oid" : "506ce813f9d5d50200000035" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349314579812 }, "created" : { "$date" : 1349314579812 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506ce81df9d5d50200000036", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "dismally", "uuid" : "60B62713", "_id" : { "$oid" : "506ce81df9d5d50200000036" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 317, "end" : "/div[1]/p[1]", "endOffset" : 325, "_id" : { "$oid" : "506ce81df9d5d50200000037" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349314589980 }, "created" : { "$date" : 1349314589980 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506ce827ed8fca0200000052", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "my candle was nearly \nburnt out", "uuid" : "56D75316", "_id" : { "$oid" : "506ce827ed8fca0200000052" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 349, "end" : "/div[1]/p[1]", "endOffset" : 380, "_id" : { "$oid" : "506ce827ed8fca0200000053" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349314599615 }, "created" : { "$date" : 1349314599615 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506ce861f9d5d50200000038", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Why not half-lit? Sounds like the glass is half-empty view.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "half-extinguished light", "uuid" : "3002A058", "_id" : { "$oid" : "506ce861f9d5d50200000038" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 410, "end" : "/div[1]/p[1]", "endOffset" : 433, "_id" : { "$oid" : "506ce861f9d5d50200000039" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349314657434 }, "created" : { "$date" : 1349314657434 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506ce936f9d5d5020000003a", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Atypical setting for a birth.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "dreary night of November", "uuid" : "17ADEF94", "_id" : { "$oid" : "506ce936f9d5d5020000003a" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 12, "end" : "/div[1]/p[1]", "endOffset" : 36, "_id" : { "$oid" : "506ce936f9d5d5020000003b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349314870304 }, "created" : { "$date" : 1349314870304 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506ce979f9d5d5020000003c", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Usually used to mean successful results. Is this sarcastic?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "accomplishment", "uuid" : "CCB90D28", "_id" : { "$oid" : "506ce979f9d5d5020000003c" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 57, "end" : "/div[1]/p[1]", "endOffset" : 71, "_id" : { "$oid" : "506ce979f9d5d5020000003d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349314937622 }, "created" : { "$date" : 1349314937622 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506ce99fed8fca0200000054", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "A murderer would take away life.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "infuse a spark of \nbeing into the lifeless thing", "uuid" : "ED92C9D8", "_id" : { "$oid" : "506ce99fed8fca0200000054" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 193, "end" : "/div[1]/p[1]", "endOffset" : 241, "_id" : { "$oid" : "506ce99fed8fca0200000055" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349314975936 }, "created" : { "$date" : 1349314975936 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506ce9a7ed8fca0200000056", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "one in the \nmorning", "uuid" : "B0A12C35", "_id" : { "$oid" : "506ce9a7ed8fca0200000056" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 278, "end" : "/div[1]/p[1]", "endOffset" : 297, "_id" : { "$oid" : "506ce9a7ed8fca0200000057" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349314983470 }, "created" : { "$date" : 1349314983470 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506ce9aeed8fca0200000058", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "dismally", "uuid" : "A72EF718", "_id" : { "$oid" : "506ce9aeed8fca0200000058" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 317, "end" : "/div[1]/p[1]", "endOffset" : 325, "_id" : { "$oid" : "506ce9aeed8fca0200000059" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349314990578 }, "created" : { "$date" : 1349314990578 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506ce9d3f9d5d5020000003e", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Why not half-lit? Sounds like the half-empty glass view.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "half-extinguished", "uuid" : "C489DE4F", "_id" : { "$oid" : "506ce9d3f9d5d5020000003e" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 410, "end" : "/div[1]/p[1]", "endOffset" : 427, "_id" : { "$oid" : "506ce9d3f9d5d5020000003f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349315027198 }, "created" : { "$date" : 1349315027198 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506ce9eff9d5d50200000040", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "The fact that he has upset the balance of nature.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "catastrophe", "uuid" : "12DD9920", "_id" : { "$oid" : "506ce9eff9d5d50200000040" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 39, "end" : "/div[1]/p[2]", "endOffset" : 50, "_id" : { "$oid" : "506ce9eff9d5d50200000041" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349315055933 }, "created" : { "$date" : 1349315055933 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cea07ed8fca020000005a", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Sarcasm?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "Beautiful! -- Great God!", "uuid" : "5DC5E1AC", "_id" : { "$oid" : "506cea07ed8fca020000005a" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 225, "end" : "/div[1]/p[2]", "endOffset" : 249, "_id" : { "$oid" : "506cea07ed8fca020000005b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349315079191 }, "created" : { "$date" : 1349315079191 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cea69ed8fca020000005c", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "The different accidents of life are not so changeable as \nthe feelings of human nature.", "uuid" : "D83506A1", "_id" : { "$oid" : "506cea69ed8fca020000005c" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 0, "end" : "/div[1]/p[3]", "endOffset" : 87, "_id" : { "$oid" : "506cea69ed8fca020000005d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349315177272 }, "created" : { "$date" : 1349315177272 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cea75f9d5d50200000042", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "infusing life into an inanimate body", "uuid" : "50F562AB", "_id" : { "$oid" : "506cea75f9d5d50200000042" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 153, "end" : "/div[1]/p[3]", "endOffset" : 189, "_id" : { "$oid" : "506cea75f9d5d50200000043" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349315189336 }, "created" : { "$date" : 1349315189336 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cea94f9d5d50200000044", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Devotion to create life.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "worked hard for nearly two years, for the \nsole purpose of infusing life into an inanimate body. For this I had deprived \nmyself of rest and health.", "uuid" : "6393EC42", "_id" : { "$oid" : "506cea94f9d5d50200000044" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 94, "end" : "/div[1]/p[3]", "endOffset" : 242, "_id" : { "$oid" : "506cea94f9d5d50200000045" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349315220752 }, "created" : { "$date" : 1349315220752 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506ceaacf9d5d50200000046", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "He's running away.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "rushed out", "uuid" : "2D7221B6", "_id" : { "$oid" : "506ceaacf9d5d50200000046" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 480, "end" : "/div[1]/p[3]", "endOffset" : 491, "_id" : { "$oid" : "506ceaacf9d5d50200000047" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349315244631 }, "created" : { "$date" : 1349315244631 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cead7ed8fca020000005e", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Trying to flee from his actions.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "forgetfulness", "uuid" : "7ED1B2AC", "_id" : { "$oid" : "506cead7ed8fca020000005e" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 745, "end" : "/div[1]/p[3]", "endOffset" : 758, "_id" : { "$oid" : "506cead7ed8fca020000005f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349315287751 }, "created" : { "$date" : 1349315287751 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "506ceb4aed8fca0200000060" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1349315402365 }, "groups" : [ "21L.000J" ], "id" : "506ceb4aed8fca0200000060", "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "quote" : "Delighted and surprised, I embraced her; but as I imprinted the \nfirst kiss on her lips, they became livid with the hue of death; her features \nappeared to change, and I thought that I held the corpse of my dead mother in my \narms; a shroud enveloped her form, and I saw the grave-worms crawling in the \nfolds of the flannel.", "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 930, "end" : "/div[1]/p[3]", "endOffset" : 1256, "_id" : { "$oid" : "506ceb4aed8fca0200000061" } } ], "tags" : [], "text" : "Why this dream? Why not dream about the creature which one would assume has preoccupied his thoughts?\nPerhaps this a fore-shadow of Elizabeth's death. It could also be that his guilty conscience would wander to his loved ones, since he cares what they would think about his actions.", "updated" : { "$date" : 1349315522855 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "user" : "wandia@mit.edu", "username" : "Sarah W.", "uuid" : "FB2E39E5" } -{ "id" : "506cebe8f9d5d50200000048", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Reaching out like a child would.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "one hand was stretched \nout", "uuid" : "95BB2B2D", "_id" : { "$oid" : "506cebe8f9d5d50200000048" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1777, "end" : "/div[1]/p[3]", "endOffset" : 1804, "_id" : { "$oid" : "506cebe8f9d5d50200000049" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349315560986 }, "created" : { "$date" : 1349315560986 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cec1cf9d5d5020000004a", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "fearing each sound", "uuid" : "00A11562", "_id" : { "$oid" : "506cec1cf9d5d5020000004a" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 2076, "end" : "/div[1]/p[3]", "endOffset" : 2094, "_id" : { "$oid" : "506cec1cf9d5d5020000004b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349315612901 }, "created" : { "$date" : 1349315612901 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cec52f9d5d5020000004c", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "no mortal could support the horror of that countenance.", "uuid" : "C84A73C0", "_id" : { "$oid" : "506cec52f9d5d5020000004c" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 4, "end" : "/div[1]/p[4]", "endOffset" : 59, "_id" : { "$oid" : "506cec52f9d5d5020000004d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349315666433 }, "created" : { "$date" : 1349315666433 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cec7aed8fca0200000062", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Panic.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "pulse beat so \nquickly and hardly, that I felt the palpitation of every artery", "uuid" : "94B37ED6", "_id" : { "$oid" : "506cec7aed8fca0200000062" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 44, "end" : "/div[1]/p[5]", "endOffset" : 122, "_id" : { "$oid" : "506cec7aed8fca0200000063" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349315706867 }, "created" : { "$date" : 1349315706867 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cec8df9d5d5020000004e", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "The panic is overwhelming.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "I \nnearly sank to the ground through languor and extreme weakness.", "uuid" : "49DB01F5", "_id" : { "$oid" : "506cec8df9d5d5020000004e" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 135, "end" : "/div[1]/p[5]", "endOffset" : 201, "_id" : { "$oid" : "506cec8df9d5d5020000004f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349315725852 }, "created" : { "$date" : 1349315725852 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506ced0df9d5d50200000050", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "This is not what he had expected. This is surprising since had he really thought that he could create life with dead bodies; life that was already destroyed?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "bitterness of disappointment", "uuid" : "B981B674", "_id" : { "$oid" : "506ced0df9d5d50200000050" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 240, "end" : "/div[1]/p[5]", "endOffset" : 268, "_id" : { "$oid" : "506ced0df9d5d50200000051" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349315853621 }, "created" : { "$date" : 1349315853621 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506ced3ef9d5d50200000052", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "This sounds like a very very guilty conscience. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "hell", "uuid" : "829FA852", "_id" : { "$oid" : "506ced3ef9d5d50200000052" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 357, "end" : "/div[1]/p[5]", "endOffset" : 361, "_id" : { "$oid" : "506ced3ef9d5d50200000053" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349315902725 }, "created" : { "$date" : 1349315902725 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506ced4aed8fca0200000064", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "dismal and wet", "uuid" : "27261C4E", "_id" : { "$oid" : "506ced4aed8fca0200000064" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 9, "end" : "/div[1]/p[6]", "endOffset" : 23, "_id" : { "$oid" : "506ced4aed8fca0200000065" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349315914046 }, "created" : { "$date" : 1349315914046 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506ced80ed8fca0200000066", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "What exactly does he fear? The consequences of his actions?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "palpitated in the sickness of fear", "uuid" : "B17C92AA", "_id" : { "$oid" : "506ced80ed8fca0200000066" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[7]", "startOffset" : 231, "end" : "/div[1]/p[7]", "endOffset" : 265, "_id" : { "$oid" : "506ced80ed8fca0200000067" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349315968746 }, "created" : { "$date" : 1349315968746 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cedf1f9d5d50200000054", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Guilty people always appear to run and don't look at others as a way to lie to themselves that they can't be seen.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "I hurried on with \nirregular steps, not daring to look about me:", "uuid" : "EA73032C", "_id" : { "$oid" : "506cedf1f9d5d50200000054" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[7]", "startOffset" : 271, "end" : "/div[1]/p[7]", "endOffset" : 335, "_id" : { "$oid" : "506cedf1f9d5d50200000055" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349316081910 }, "created" : { "$date" : 1349316081910 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cee2aed8fca0200000068", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Relief! A refuge. Somewhere to hide at last?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "my delight", "uuid" : "425E41DD", "_id" : { "$oid" : "506cee2aed8fca0200000068" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 20, "end" : "/div[1]/p[15]", "endOffset" : 30, "_id" : { "$oid" : "506cee2aed8fca0200000069" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349316138452 }, "created" : { "$date" : 1349316138452 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cee53ed8fca020000006a", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "He is finally able to momentarily flee from his thoughts.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "forgot \nmy horror and misfortune", "uuid" : "8CDCFBD2", "_id" : { "$oid" : "506cee53ed8fca020000006a" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 208, "end" : "/div[1]/p[15]", "endOffset" : 240, "_id" : { "$oid" : "506cee53ed8fca020000006b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349316179065 }, "created" : { "$date" : 1349316179065 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cee95ed8fca020000006c", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "What kind of life had he led before this? A sad life one somehow shrouded from his actual actions.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "first time during many \nmonths, calm and serene joy", "uuid" : "09520237", "_id" : { "$oid" : "506cee95ed8fca020000006c" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 271, "end" : "/div[1]/p[15]", "endOffset" : 322, "_id" : { "$oid" : "506cee95ed8fca020000006d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349316245585 }, "created" : { "$date" : 1349316245585 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506ceed2f9d5d50200000056", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Fear again.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "trembled", "uuid" : "E1A2CA22", "_id" : { "$oid" : "506ceed2f9d5d50200000056" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[19]", "startOffset" : 2, "end" : "/div[1]/p[19]", "endOffset" : 10, "_id" : { "$oid" : "506ceed2f9d5d50200000057" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349316306419 }, "created" : { "$date" : 1349316306419 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cef3fed8fca020000006e", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "He fears to see the creature again since it is the embodiment of his 'sin'.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "a cold shivering", "uuid" : "1CE546A4", "_id" : { "$oid" : "506cef3fed8fca020000006e" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[19]", "startOffset" : 629, "end" : "/div[1]/p[19]", "endOffset" : 645, "_id" : { "$oid" : "506cef3fed8fca020000006f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349316415724 }, "created" : { "$date" : 1349316415724 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cef48f9d5d50200000058", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "fearfully", "uuid" : "6C204E9A", "_id" : { "$oid" : "506cef48f9d5d50200000058" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[19]", "startOffset" : 834, "end" : "/div[1]/p[19]", "endOffset" : 843, "_id" : { "$oid" : "506cef48f9d5d50200000059" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349316424369 }, "created" : { "$date" : 1349316424369 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cefa9f9d5d5020000005a", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Hysteria. He actually manages to convince himself that he has rid himself of the creature", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "a wildness in my eyes for which he could not account; \nand my loud, unrestrained, heartless laughter, frightened and astonished him.", "uuid" : "784D10A7", "_id" : { "$oid" : "506cefa9f9d5d5020000005a" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 477, "end" : "/div[1]/p[20]", "endOffset" : 609, "_id" : { "$oid" : "506cefa9f9d5d5020000005b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349316521814 }, "created" : { "$date" : 1349316521814 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cefb2f9d5d5020000005c", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "Do not ask me", "uuid" : "EE2B18D3", "_id" : { "$oid" : "506cefb2f9d5d5020000005c" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 1, "end" : "/div[1]/p[22]", "endOffset" : 14, "_id" : { "$oid" : "506cefb2f9d5d5020000005d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349316530185 }, "created" : { "$date" : 1349316530185 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cefc3f9d5d5020000005e", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "putting my hands before my eyes, \nfor I thought I saw the dreaded spectre glide into the room", "uuid" : "F2000969", "_id" : { "$oid" : "506cefc3f9d5d5020000005e" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 26, "end" : "/div[1]/p[22]", "endOffset" : 119, "_id" : { "$oid" : "506cefc3f9d5d5020000005f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349316547747 }, "created" : { "$date" : 1349316547747 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506ceff9f9d5d50200000060", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "restored me to \nlife", "uuid" : "9645293C", "_id" : { "$oid" : "506ceff9f9d5d50200000060" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[25]", "startOffset" : 119, "end" : "/div[1]/p[25]", "endOffset" : 140, "_id" : { "$oid" : "506ceff9f9d5d50200000061" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349316601920 }, "created" : { "$date" : 1349316601920 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cf01bf9d5d50200000062", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "It still haunts him no matter what he does.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "pertinacity with which I continually recurred to the same \nsubject persuaded him that my disorder indeed owed its origin to some uncommon \nand terrible event.", "uuid" : "B0D4CD89", "_id" : { "$oid" : "506cf01bf9d5d50200000062" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[25]", "startOffset" : 391, "end" : "/div[1]/p[25]", "endOffset" : 549, "_id" : { "$oid" : "506cf01bf9d5d50200000063" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349316635588 }, "created" : { "$date" : 1349316635588 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cf067f9d5d50200000064", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "This failure to observe his surroundings was something he had being doing for two years?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "first time I became \ncapable of observing outward objects with any kind of pleasure", "uuid" : "0EA819C5", "_id" : { "$oid" : "506cf067f9d5d50200000064" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[26]", "startOffset" : 114, "end" : "/div[1]/p[26]", "endOffset" : 197, "_id" : { "$oid" : "506cf067f9d5d50200000065" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349316711638 }, "created" : { "$date" : 1349316711638 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cf08bed8fca0200000070", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Finally a typical setting for birth. Birth of hope?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "young buds were shooting forth \nfrom the trees that shaded my window. It was a divine spring;", "uuid" : "C37F5104", "_id" : { "$oid" : "506cf08bed8fca0200000070" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[26]", "startOffset" : 265, "end" : "/div[1]/p[26]", "endOffset" : 358, "_id" : { "$oid" : "506cf08bed8fca0200000071" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349316747672 }, "created" : { "$date" : 1349316747672 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cf0d5f9d5d50200000066", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Guilty people don't like dealing with their transgressions.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "Could he allude \nto an object on whom I dared not even think?", "uuid" : "BED80EF0", "_id" : { "$oid" : "506cf0d5f9d5d50200000066" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[29]", "startOffset" : 43, "end" : "/div[1]/p[29]", "endOffset" : 104, "_id" : { "$oid" : "506cf0d5f9d5d50200000067" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349316821646 }, "created" : { "$date" : 1349316821646 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cf453f9d5d50200000068", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Shelley zeros in on Victor's reaction.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "How can I describe my emotions at this catastrophe, or how \ndelineate the wretch whom with such infinite pains and care I had endeavoured to \nform?", "uuid" : "69F3AEA1", "_id" : { "$oid" : "506cf453f9d5d50200000068" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 0, "end" : "/div[1]/p[2]", "endOffset" : 147, "_id" : { "$oid" : "506cf453f9d5d50200000069" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349317715009 }, "created" : { "$date" : 1349317715009 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cf859ed8fca0200000072", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "It's all happening really fast. Victor is really stressed.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "I had desired it with an ardour that far exceeded \nmoderation; but now that I had finished, the beauty of the dream vanished, and \nbreathless horror and disgust filled my heart.", "uuid" : "736F332F", "_id" : { "$oid" : "506cf859ed8fca0200000072" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 243, "end" : "/div[1]/p[3]", "endOffset" : 421, "_id" : { "$oid" : "506cf859ed8fca0200000073" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349318745724 }, "created" : { "$date" : 1349318745724 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cf8b0f9d5d5020000006a", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "Another element of illusion: focus on the creature's eyes and inability to understand sounds", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "and his eyes, if eyes they may be called, were fixed on me. \nHis jaws opened, and he muttered some inarticulate sounds, while a grin wrinkled \nhis cheeks. He might have spoken, but I did not hear;", "uuid" : "05035356", "_id" : { "$oid" : "506cf8b0f9d5d5020000006a" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1580, "end" : "/div[1]/p[3]", "endOffset" : 1776, "_id" : { "$oid" : "506cf8b0f9d5d5020000006b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349318832161 }, "created" : { "$date" : 1349318832161 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cf92fed8fca0200000074", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "Another passage that has no explanation: he is wandering and then, suddenly, he's at the church. Something is missing", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "I passed the night wretchedly. Sometimes my pulse beat so \nquickly and hardly, that I felt the palpitation of every artery; at others, I \nnearly sank to the ground through languor and extreme weakness. Mingled with \nthis horror, I felt the bitterness of disappointment: dreams that had been my \nfood and pleasant rest for so long a space, were now become a hell to me; and \nthe change was so rapid, the overthrow so complete! \nMorning, dismal and wet, at length dawned, and discovered \nto my sleepless and aching eyes the church of Ingolstadt, its white steeple and \nclock, which indicated the sixth hour.", "uuid" : "8E509C21", "_id" : { "$oid" : "506cf92fed8fca0200000074" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 0, "end" : "/div[1]/p[6]", "endOffset" : 179, "_id" : { "$oid" : "506cf92fed8fca0200000075" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349318959195 }, "created" : { "$date" : 1349318959195 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506cf994f9d5d5020000006c", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "Only now he remembers about the creature. Did he forget about it?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "I trembled excessively; I could not endure to think of, and \nfar less to allude to the occurrences of the preceding night. I walked with a \nquick pace, and we soon arrived at my college. I then reflected, and the thought \nmade me shiver, that the creature whom I had left in my apartment might still be \nthere, alive, and walking about.", "uuid" : "4F692F7C", "_id" : { "$oid" : "506cf994f9d5d5020000006c" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[19]", "startOffset" : 0, "end" : "/div[1]/p[19]", "endOffset" : 337, "_id" : { "$oid" : "506cf994f9d5d5020000006d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349319060559 }, "created" : { "$date" : 1349319060559 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506d06b9f9d5d5020000006e", "user" : "mikaelm@mit.edu", "username" : "Mikael M.", "text" : "Clerval comes to Victor's aid. He act's as Victor's Hercules or even possibly his Eve. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "This was the commencement of a nervous fever which confined me for several months. During all that time Henry was my only nurse.", "uuid" : "D4FC685E", "_id" : { "$oid" : "506d06b9f9d5d5020000006e" }, "permissions" : { "delete" : [ "mikaelm@mit.edu" ], "update" : [ "mikaelm@mit.edu" ], "admin" : [ "mikaelm@mit.edu" ], "read" : [ "mikaelm@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 0, "end" : "/div[1]/p[20]", "endOffset" : 128, "_id" : { "$oid" : "506d06b9f9d5d5020000006f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349322425854 }, "created" : { "$date" : 1349322425854 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506d07aced8fca0200000076", "user" : "mikaelm@mit.edu", "username" : "Mikael M.", "text" : "Gates - Garden of Eden image popped into my head", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "The porter opened the gates of the court, which had that night been my asylum, and I issued into the street", "uuid" : "FCD11345", "_id" : { "$oid" : "506d07aced8fca0200000076" }, "permissions" : { "delete" : [ "mikaelm@mit.edu" ], "update" : [ "mikaelm@mit.edu" ], "admin" : [ "mikaelm@mit.edu" ], "read" : [ "mikaelm@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 175, "end" : "/div[1]/p[6]", "endOffset" : 283, "_id" : { "$oid" : "506d07aced8fca0200000077" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349322668474 }, "created" : { "$date" : 1349322668474 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506d0818ed8fca0200000078", "user" : "mikaelm@mit.edu", "username" : "Mikael M.", "text" : "Victor is horrified by the fruits of his labor. He only now truly realizes the terrible external appearance of the creature and and is disgusted. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-or-the-modern-prometheus-i-iv", "quote" : "How can I describe my emotions at this catastrophe, or how delineate the wretch whom with such infinite pains and care I had endeavoured to form?", "uuid" : "1F33666B", "_id" : { "$oid" : "506d0818ed8fca0200000078" }, "permissions" : { "delete" : [ "mikaelm@mit.edu" ], "update" : [ "mikaelm@mit.edu" ], "admin" : [ "mikaelm@mit.edu" ], "read" : [ "mikaelm@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 0, "end" : "/div[1]/p[2]", "endOffset" : 146, "_id" : { "$oid" : "506d0818ed8fca0200000079" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349322776275 }, "created" : { "$date" : 1349322776275 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506d1605f9d5d50200000070", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Alludes to the turn in events", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "Delighted and surprised, I embraced her; but as I imprinted the \nfirst kiss on her lips, they became livid with the hue of death;", "uuid" : "B2895E3A", "_id" : { "$oid" : "506d1605f9d5d50200000070" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 931, "end" : "/div[1]/p[3]", "endOffset" : 1060, "_id" : { "$oid" : "506d1605f9d5d50200000071" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349326341917 }, "created" : { "$date" : 1349326341917 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506d2bccf9d5d50200000074", "user" : "moverlin@mit.edu", "username" : "Matt O.", "text" : "Don Benito tells Delano about the past events of the San Dominick. With only Babo present, Don Benito tries to satisfy Babo and Delano.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "While most part of the story was being\ngiven, the two captains stood on the after part\nof the main-deck, a privileged spot, no one\nbeing near but the servant.", "uuid" : "474C3CBB", "_id" : { "$oid" : "506d2bccf9d5d50200000074" }, "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[34]", "startOffset" : 0, "end" : "/div[1]/p[34]", "endOffset" : 158, "_id" : { "$oid" : "506d2bccf9d5d50200000075" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349331916371 }, "created" : { "$date" : 1349331916371 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "506d2caba8708f0200000002" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1349332139872 }, "groups" : [ "21L.003" ], "id" : "506d2caba8708f0200000002", "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "quote" : "The Spaniard's manner,\n[pg 125]\n\ntoo, conveyed a sort of sour and gloomy disdain,\nwhich he seemed at no pains to disguise.", "ranges" : [ { "start" : "/div[1]/p[26]", "startOffset" : 518, "end" : "/div[1]/p[26]", "endOffset" : 640, "_id" : { "$oid" : "506d2caba8708f0200000003" } } ], "tags" : [], "text" : "\"gloomy\"...Don Benito seems to have given up hope-- he does not \"disguise\" his sadness. With Don Benito already acting sour and gloomy, he already seems to be exhibiting qualities that the reader or Delano may not expect from a leader.", "updated" : { "$date" : 1349332254486 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "user" : "moverlin@mit.edu", "username" : "Matt O.", "uuid" : "4F805604" } -{ "id" : "506d2da9a8708f0200000004", "user" : "moverlin@mit.edu", "username" : "Matt O.", "text" : "I find it interesting that Don Benito is saying this about Babo. He may not say it if Babo were present. It seems a little strange that the captain of the ship has chosen as a slave as his confidant instead of another white sailor on board.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "confidant", "uuid" : "5F99723B", "_id" : { "$oid" : "506d2da9a8708f0200000004" }, "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[301]", "startOffset" : 447, "end" : "/div[1]/p[301]", "endOffset" : 456, "_id" : { "$oid" : "506d2da9a8708f0200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349332393661 }, "created" : { "$date" : 1349332393661 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506d2decf9d5d50200000078", "user" : "moverlin@mit.edu", "username" : "Matt O.", "text" : "a \"malady\" is a sickness or an illness of some kind. Here, the malady is scurvy.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "maladies", "uuid" : "63E8A1D5", "_id" : { "$oid" : "506d2decf9d5d50200000078" }, "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[298]", "startOffset" : 952, "end" : "/div[1]/p[298]", "endOffset" : 960, "_id" : { "$oid" : "506d2decf9d5d50200000079" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349332460598 }, "created" : { "$date" : 1349332460598 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506d2ed7f9d5d5020000007a", "user" : "moverlin@mit.edu", "username" : "Matt O.", "text" : "Don Benito attempts to escape.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "With infinite pity\nhe withdrew his hold from Don Benito. Not\nCaptain Delano, but Don Benito, the black, in\nleaping into the boat, had intended to stab.", "uuid" : "CA48C014", "_id" : { "$oid" : "506d2ed7f9d5d5020000007a" }, "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[369]", "startOffset" : 339, "end" : "/div[1]/p[369]", "endOffset" : 490, "_id" : { "$oid" : "506d2ed7f9d5d5020000007b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349332695711 }, "created" : { "$date" : 1349332695711 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "506d310af9d5d5020000007c" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1349333258113 }, "groups" : [ "21L.003" ], "id" : "506d310af9d5d5020000007c", "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "quote" : "\"Ah, I thought so. For it were strange,\nindeed, and not very creditable to us white-skins,\nif a little of our blood mixed with the\nAfrican's, should, far from improving the\nlatter's quality, have the sad effect of pouring\nvitriolic acid into black broth; improving\nthe hue, perhaps, but not the wholesomeness.\"", "ranges" : [ { "start" : "/div[1]/p[289]", "startOffset" : 0, "end" : "/div[1]/p[289]", "endOffset" : 310, "_id" : { "$oid" : "506d310af9d5d5020000007d" } } ], "tags" : [], "text" : "I find this comment very interesting. It looks like we may get some insight into Delano's thoughts regarding the hierarchy of blacks and whites. He mentions that the hue would be improved if a white mixed with a black and also the wholesomeness. It seems as though Delano expected this of whites, though. He says, \"Ah, I thought so.\" So, Delano expected whites to be superior to blacks in these ways: wholesomeness and hue. Melville's narrator is painting this picture of Delano, but I kind of wonder if Melville was surrounded by whites like this in his time who just immediately accepted blacks as inferior. Then, with this quote from Delano Melville may be pointing out that it is kind of a ridiculous/absurd comment for a white to make.", "updated" : { "$date" : 1349333305565 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "user" : "moverlin@mit.edu", "username" : "Matt O.", "uuid" : "B7D5FB53" } -{ "id" : "506d347aa8708f0200000006", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "He is miserable because of how you treat him. Wretch eh? ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "I beheld the wretch -- the miserable monster whom I had created", "uuid" : "E9D85018", "_id" : { "$oid" : "506d347aa8708f0200000006" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1479, "end" : "/div[1]/p[3]", "endOffset" : 1542, "_id" : { "$oid" : "506d347aa8708f0200000007" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349334138436 }, "created" : { "$date" : 1349334138436 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506d34acf9d5d5020000007e", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "His eyes are fixed on you because he wants your attention. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "He held up the \ncurtain of the bed; and his eyes, if eyes they may be called, were fixed on me", "uuid" : "65638718", "_id" : { "$oid" : "506d34acf9d5d5020000007e" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1544, "end" : "/div[1]/p[3]", "endOffset" : 1638, "_id" : { "$oid" : "506d34acf9d5d5020000007f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349334188164 }, "created" : { "$date" : 1349334188164 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506d34c2a8708f0200000008", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "His desire to communicate his thoughts to Victor", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "inarticulate sounds", "uuid" : "9AE18C59", "_id" : { "$oid" : "506d34c2a8708f0200000008" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1679, "end" : "/div[1]/p[3]", "endOffset" : 1698, "_id" : { "$oid" : "506d34c2a8708f0200000009" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349334210636 }, "created" : { "$date" : 1349334210636 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506d34f7a8708f020000000a", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "I wonder if they were really trying to \"detain\" or embrace Victor. Victor's perception may be utterly warped", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "He might have spoken, but I did not hear; one hand was stretched \nout, seemingly to detain me, but I escaped, and rushed down stairs.", "uuid" : "1E4C9C33", "_id" : { "$oid" : "506d34f7a8708f020000000a" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1735, "end" : "/div[1]/p[3]", "endOffset" : 1868, "_id" : { "$oid" : "506d34f7a8708f020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349334263298 }, "created" : { "$date" : 1349334263298 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506d3530a8708f020000000c", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "He isn't a person but a demoniacal corpse that has been given life. there is a difference", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "the demoniacal corpse", "uuid" : "632059E5", "_id" : { "$oid" : "506d3530a8708f020000000c" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 2138, "end" : "/div[1]/p[3]", "endOffset" : 2160, "_id" : { "$oid" : "506d3530a8708f020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349334320737 }, "created" : { "$date" : 1349334320737 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506d3532a8708f020000000e", "user" : "moverlin@mit.edu", "username" : "Matt O.", "text" : "I don't consider Don Benito naive for not getting the hint. Rather, I think that Don Benito (ever since the slave revolt on the ship) has been at the receiving end for many of the orders on the ship (from Babo). It seems like he has lost a lot of the confidence and insight that he would have had when he was captain. Out of the position as captain, he probably has to reconsider everything he says since Babo is present, and he is probably careful so that he doesn't say anything disrespectful about/to Babo.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Presently Captain Delano, intending to say\nsomething to his host concerning the pecuniary\npart of the business he had undertaken for him,\nespecially—since he was strictly accountable\nto his owners—with reference to the new suit\nof sails, and other things of that sort; and\nnaturally preferring to conduct such affairs in\nprivate, was desirous that the servant should\nwithdraw; imagining that Don Benito for a\nfew minutes could dispense with his attendance.\nHe, however, waited awhile; thinking that, as\nthe conversation proceeded, Don Benito, without\nbeing prompted, would perceive the propriety\nof the step.", "uuid" : "2E036441", "_id" : { "$oid" : "506d3532a8708f020000000e" }, "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[299]", "startOffset" : 0, "end" : "/div[1]/p[299]", "endOffset" : 608, "_id" : { "$oid" : "506d3532a8708f020000000f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349334322316 }, "created" : { "$date" : 1349334322316 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506d35ada8708f0200000010", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "YYY? Why is he disappointed? Was your aim to give life or create beauty? If it was to create beauty...dead bodies to do it? You don't need science to see the flaw there.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "I felt the bitterness of disappointment:", "uuid" : "21DCAE3D", "_id" : { "$oid" : "506d35ada8708f0200000010" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 228, "end" : "/div[1]/p[5]", "endOffset" : 270, "_id" : { "$oid" : "506d35ada8708f0200000011" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349334445064 }, "created" : { "$date" : 1349334445064 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506d35d7f9d5d50200000080", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Victor invested much of his time into this. Was it ego?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "dreams that had been my \nfood and pleasant rest for so long a space", "uuid" : "7E4F8052", "_id" : { "$oid" : "506d35d7f9d5d50200000080" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 270, "end" : "/div[1]/p[5]", "endOffset" : 337, "_id" : { "$oid" : "506d35d7f9d5d50200000081" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349334487246 }, "created" : { "$date" : 1349334487246 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506d35f7f9d5d50200000082", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Morning would suggest hope. Yet the words dismal and wet re-affirm the idea of gloom and doom", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "Morning, dismal and wet", "uuid" : "AE6AB1DD", "_id" : { "$oid" : "506d35f7f9d5d50200000082" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 0, "end" : "/div[1]/p[6]", "endOffset" : 23, "_id" : { "$oid" : "506d35f7f9d5d50200000083" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349334519970 }, "created" : { "$date" : 1349334519970 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506d3613f9d5d50200000084", "user" : "moverlin@mit.edu", "username" : "Matt O.", "text" : "I can't help but think Melville is exaggerating some of Babo's actions as a slave. I don't know if it was normal for a slave to pamper his master as much as Babo is doing in front of Delano, but it seems like Babo is doing a lot of it. At least, he narrator is noting it many times when Babo does something like this to pamper Don Benito. I would guess that, at sea, the negro sailors on a ship would be doing other kinds of tasks besides putting pillows behind their masters' backs or fanning them with large feathers.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Meantime his servant knelt before him, with\na large fan of feathers", "uuid" : "3A879E8B", "_id" : { "$oid" : "506d3613f9d5d50200000084" }, "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[307]", "startOffset" : 0, "end" : "/div[1]/p[307]", "endOffset" : 67, "_id" : { "$oid" : "506d3613f9d5d50200000085" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349334547879 }, "created" : { "$date" : 1349334547879 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506d361af9d5d50200000086", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "hiding place for the creature. it was an \"asylum\" because you made it so", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "my asylum", "uuid" : "F61E8CC0", "_id" : { "$oid" : "506d361af9d5d50200000086" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 248, "end" : "/div[1]/p[6]", "endOffset" : 257, "_id" : { "$oid" : "506d361af9d5d50200000087" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349334554535 }, "created" : { "$date" : 1349334554535 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506d3630f9d5d50200000088", "user" : "moverlin@mit.edu", "username" : "Matt O.", "text" : "the pillow seems like quite a nice luxury for Don Benito.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "the servant placing a pillow\nbehind his master.", "uuid" : "7F605740", "_id" : { "$oid" : "506d3630f9d5d50200000088" }, "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[305]", "startOffset" : 58, "end" : "/div[1]/p[305]", "endOffset" : 105, "_id" : { "$oid" : "506d3630f9d5d50200000089" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349334576947 }, "created" : { "$date" : 1349334576947 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506d364da8708f0200000012", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "the setting is so bleak. This represents victors mood and quite possibly that of the creature", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "the rain, \nwhich poured from a black and comfortless sky.", "uuid" : "66A1D722", "_id" : { "$oid" : "506d364da8708f0200000012" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 534, "end" : "/div[1]/p[6]", "endOffset" : 591, "_id" : { "$oid" : "506d364da8708f0200000013" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349334605312 }, "created" : { "$date" : 1349334605312 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506d368da8708f0200000014", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Who's really the fiend here? the creature or victor? the creature seems to be more of a victor to me than Victor", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "Like one who, on a lonely road,\n   Doth walk in \nfear and dread,\nAnd, having once \nturn'd round, walks on,\n   And turns no \nmore his head;\nBecause he knows a \nfrightful fiend", "uuid" : "450F50C5", "_id" : { "$oid" : "506d368da8708f0200000014" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[8]", "startOffset" : 0, "end" : "/div[1]/p[12]", "endOffset" : 35, "_id" : { "$oid" : "506d368da8708f0200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349334669393 }, "created" : { "$date" : 1349334669393 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "506d36a6a8708f0200000016" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1349334694864 }, "groups" : [ "21L.003" ], "id" : "506d36a6a8708f0200000016", "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "quote" : "Setting down his basin, the negro searched\namong the razors, as for the sharpest, and having\nfound it, gave it an additional edge by\nexpertly strapping it on the firm, smooth, oily\nskin of his open palm; he then made a gesture\n[pg 203]\n\nas if to begin, but midway stood suspended for\nan instant, one hand elevating the razor, the\nother professionally dabbling among the bubbling\nsuds on the Spaniard's lank neck. Not\nunaffected by the close sight of the gleaming\nsteel, Don Benito nervously shuddered; his\nusual ghastliness was heightened by the lather,\nwhich lather, again, was intensified in its hue\nby the contrasting sootiness of the negro's body.\nAltogether the scene was somewhat peculiar,\nat least to Captain Delano, nor, as he saw the\ntwo thus postured, could he resist the vagary,\nthat in the black he saw a headsman, and in\nthe white a man at the block. But this was\none of those antic conceits, appearing and vanishing\nin a breath, from which, perhaps, the\nbest regulated mind is not always free.", "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 0, "end" : "/div[1]/p[258]", "endOffset" : 1007, "_id" : { "$oid" : "506d36a6a8708f0200000017" } } ], "tags" : [], "text" : "i think we talked about this passage in class. There is a clear distinction here between Babo and Don Benito in many ways. white vs. black. Also, Babo is \"in command\" on the ship as well as in this scene since he's holding a very sharp knife while perched over Don Benito shaving him. ", "updated" : { "$date" : 1349334771115 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "user" : "moverlin@mit.edu", "username" : "Matt O.", "uuid" : "96B1FC37" } -{ "id" : "506d3774a8708f0200000018", "user" : "moverlin@mit.edu", "username" : "Matt O.", "text" : "i think this is one of many examples where Don Benito's fears/weaknesses are clues to Delano about Babo's scheme.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "No sword drawn before James the First of\nEngland, no assassination in that timid King's\npresence, could have produced a more terrified\naspect than was now presented by Don\nBenito.", "uuid" : "11111F6E", "_id" : { "$oid" : "506d3774a8708f0200000018" }, "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[266]", "startOffset" : 0, "end" : "/div[1]/p[266]", "endOffset" : 179, "_id" : { "$oid" : "506d3774a8708f0200000019" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349334900252 }, "created" : { "$date" : 1349334900252 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506d382ef9d5d5020000008a", "user" : "moverlin@mit.edu", "username" : "Matt O.", "text" : "This is another example where he watches his master. It's interesting that body language plays an important role in the book, and perhaps the person paying attention to a lot of the body language (Don Benito's) is Babo. Babo watches his master very closely when he accompanies him around. It's necessary for Babo to closely watch Don Benito to keep control of the situation.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "He only rested his eye on his\nmaster's, as if, amid all Don Benito's distress,", "uuid" : "2F0D10EA", "_id" : { "$oid" : "506d382ef9d5d5020000008a" }, "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[307]", "startOffset" : 290, "end" : "/div[1]/p[307]", "endOffset" : 369, "_id" : { "$oid" : "506d382ef9d5d5020000008b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349335086030 }, "created" : { "$date" : 1349335086030 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506db454a8708f020000001a", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Drama queen much? Is the creature endeavoring to harm you?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "I \ntraversed the streets, without any clear conception of where I was, or what I \nwas doing. My heart palpitated in the sickness of fear; and I hurried on with \nirregular steps, not daring to look about me", "uuid" : "1A21DE41", "_id" : { "$oid" : "506db454a8708f020000001a" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[7]", "startOffset" : 129, "end" : "/div[1]/p[7]", "endOffset" : 334, "_id" : { "$oid" : "506db454a8708f020000001b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349366868544 }, "created" : { "$date" : 1349366868544 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506dc691c076a30200000014", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "You recognize the value of friendship and those dear to you. Cant you see how dear you are tot he creature?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "his \npresence brought back to my thoughts my father, Elizabeth, and all those scenes \nof home so dear to my recollection.", "uuid" : "59BBA4C0", "_id" : { "$oid" : "506dc691c076a30200000014" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 50, "end" : "/div[1]/p[15]", "endOffset" : 171, "_id" : { "$oid" : "506dc691c076a30200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349371537992 }, "created" : { "$date" : 1349371537992 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506dc718a8708f0200000024", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Clerval had a desire for learning. Such was it in that era", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "But his affection for me at length overcame his dislike of \nlearning, and he has permitted me to undertake a voyage of discovery to the land \nof knowledge", "uuid" : "E836664D", "_id" : { "$oid" : "506dc718a8708f0200000024" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 1015, "end" : "/div[1]/p[15]", "endOffset" : 1169, "_id" : { "$oid" : "506dc718a8708f0200000025" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349371672829 }, "created" : { "$date" : 1349371672829 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506dc74da8708f0200000026", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "His father seems to be one those contented with knowledge in their specific area without searching for the unknown ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "'I have ten thousand florins a year without Greek, I eat heartily \nwithout Greek", "uuid" : "BF0E8F3C", "_id" : { "$oid" : "506dc74da8708f0200000026" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 932, "end" : "/div[1]/p[15]", "endOffset" : 1012, "_id" : { "$oid" : "506dc74da8708f0200000027" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349371725719 }, "created" : { "$date" : 1349371725719 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506dc798c076a30200000018", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Piecing together body parts does that to you", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "\"I did not before remark how very ill you appear; so \nthin and pale; you look as if you had been watching for several nights.\"", "uuid" : "60903CE5", "_id" : { "$oid" : "506dc798c076a30200000018" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[17]", "startOffset" : 246, "end" : "/div[1]/p[17]", "endOffset" : 372, "_id" : { "$oid" : "506dc798c076a30200000019" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349371800527 }, "created" : { "$date" : 1349371800527 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506dc7dac076a3020000001a", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "The reality of the creature's life shock him gravely at this point yet it was his bread for two years sustaining him on his quest to his goal.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "I trembled excessively", "uuid" : "A3DF3C87", "_id" : { "$oid" : "506dc7dac076a3020000001a" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[19]", "startOffset" : 0, "end" : "/div[1]/p[19]", "endOffset" : 22, "_id" : { "$oid" : "506dc7dac076a3020000001b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349371866094 }, "created" : { "$date" : 1349371866094 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506e72e5c076a3020000001c", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "This example shows a quick reversal in the pace of the narrative. We begin with grand expectations which turn sour as quickly as Frankenstein notes his dismay. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "I had selected his features as \nbeautiful. Beautiful! -- Great God!", "uuid" : "FC4ED8FB", "_id" : { "$oid" : "506e72e5c076a3020000001c" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 181, "end" : "/div[1]/p[2]", "endOffset" : 250, "_id" : { "$oid" : "506e72e5c076a3020000001d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349415653392 }, "created" : { "$date" : 1349415653392 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506e732aa8708f0200000029", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Still trying to figure out the cryptic meaning behind this seemingly out of place sentence. Accidents of life may refer to the creature as an accident of life--Pretty harsh. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "The different accidents of life are not so changeable as \nthe feelings of human nature.", "uuid" : "DC17C641", "_id" : { "$oid" : "506e732aa8708f0200000029" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 0, "end" : "/div[1]/p[3]", "endOffset" : 87, "_id" : { "$oid" : "506e732aa8708f020000002a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349415722244 }, "created" : { "$date" : 1349415722244 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506e7346a8708f020000002b", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Another change of pace. He is now off to nap. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "Unable to endure the aspect of \nthe being I had created, I rushed out of the room, and continued a long time \ntraversing my bed-chamber, unable to compose my mind to sleep.", "uuid" : "D0052FD3", "_id" : { "$oid" : "506e7346a8708f020000002b" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 421, "end" : "/div[1]/p[3]", "endOffset" : 593, "_id" : { "$oid" : "506e7346a8708f020000002c" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349415750054 }, "created" : { "$date" : 1349415750054 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506e737ca8708f020000002d", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Death/Life, seems like a natural dream to have given the circumstances. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "by the wildest dreams. I \nthought I saw Elizabeth, in the bloom of health, walking in the streets of \nIngolstadt. Delighted and surprised, I embraced her; but as I imprinted the \nfirst kiss on her lips, they became livid with the hue of death; her features \nappeared to change, and I thought that I held the corpse of my dead mother in my \narms; a shroud enveloped her form, and I saw the grave-worms crawling in the \nfolds of the flannel.", "uuid" : "5F53FC92", "_id" : { "$oid" : "506e737ca8708f020000002d" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 817, "end" : "/div[1]/p[3]", "endOffset" : 1257, "_id" : { "$oid" : "506e737ca8708f020000002e" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349415804215 }, "created" : { "$date" : 1349415804215 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506e73a3c076a3020000001e", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "I think he simply regrets having given the creature life, that is, being responsible for another creature. Good thing he's not a daddy. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "demoniacal corpse to which I had so miserably \ngiven life.", "uuid" : "70FCA48B", "_id" : { "$oid" : "506e73a3c076a3020000001e" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 2142, "end" : "/div[1]/p[3]", "endOffset" : 2200, "_id" : { "$oid" : "506e73a3c076a3020000001f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349415843016 }, "created" : { "$date" : 1349415843016 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506e73e1a8708f020000002f", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "This pretty well sums up both Frankenstein's own sentiment, but also it serves to directly recognize the quick shift in narrative that gave rise to the dramatic tension. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "dreams that had been my \nfood and pleasant rest for so long a space, were now become a hell to me; and \nthe change was so rapid, the overthrow so complete!", "uuid" : "DE4C2C85", "_id" : { "$oid" : "506e73e1a8708f020000002f" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 270, "end" : "/div[1]/p[5]", "endOffset" : 425, "_id" : { "$oid" : "506e73e1a8708f0200000030" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349415905745 }, "created" : { "$date" : 1349415905745 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506e7406a8708f0200000031", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Sudden shift in mood. Misery gives way to relief and gladness. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "As it drew nearer, I \nobserved that it was the Swiss diligence: it stopped just where I was standing; \nand, on the door being opened, I perceived Henry Clerval, who, on seeing me, \ninstantly sprung out. \"My dear Frankenstein,\" exclaimed he, \"how glad I am to \nsee you! how fortunate that you should be here at the very moment of my \nalighting!\"", "uuid" : "CE2C7E78", "_id" : { "$oid" : "506e7406a8708f0200000031" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 270, "end" : "/div[1]/p[14]", "endOffset" : 614, "_id" : { "$oid" : "506e7406a8708f0200000032" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349415942375 }, "created" : { "$date" : 1349415942375 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506e75d8a8708f0200000033", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Pleasant diction for a change. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "delight", "uuid" : "F2ECD9A7", "_id" : { "$oid" : "506e75d8a8708f0200000033" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 23, "end" : "/div[1]/p[15]", "endOffset" : 30, "_id" : { "$oid" : "506e75d8a8708f0200000034" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349416408158 }, "created" : { "$date" : 1349416408158 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506e75f9c076a30200000020", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Very Romantic, Shelley. Very Romantic. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "But his affection for me at length overcame his dislike of \nlearning, and he has permitted me to undertake a voyage of discovery to the land \nof knowledge.\"", "uuid" : "235363DA", "_id" : { "$oid" : "506e75f9c076a30200000020" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 1015, "end" : "/div[1]/p[15]", "endOffset" : 1171, "_id" : { "$oid" : "506e75f9c076a30200000021" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349416441596 }, "created" : { "$date" : 1349416441596 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506e7618a8708f0200000035", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Like a true scientist!", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "\"You have guessed right; I have lately been so deeply \nengaged in one occupation, that I have not allowed myself sufficient rest", "uuid" : "F913D29D", "_id" : { "$oid" : "506e7618a8708f0200000035" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 0, "end" : "/div[1]/p[18]", "endOffset" : 128, "_id" : { "$oid" : "506e7618a8708f0200000036" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349416472396 }, "created" : { "$date" : 1349416472396 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506e7631c076a30200000022", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "He doesn't think too many steps ahead given his intelligence. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "I trembled excessively; I could not endure to think of, and \nfar less to allude to the occurrences of the preceding night. I walked with a \nquick pace, and we soon arrived at my college. I then reflected, and the thought \nmade me shiver, that the creature whom I had left in my apartment might still be \nthere, alive, and walking about.", "uuid" : "4E29E083", "_id" : { "$oid" : "506e7631c076a30200000022" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[19]", "startOffset" : 0, "end" : "/div[1]/p[19]", "endOffset" : 336, "_id" : { "$oid" : "506e7631c076a30200000023" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349416497621 }, "created" : { "$date" : 1349416497621 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506e768ba8708f0200000037", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Very child-like. I remember doing similar things. I was a very scared kid. Perhaps this implies some child-like qualities of Victor, perhaps explaining why he couldn't control himself in his studies. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "as children \nare accustomed to do when they expect a spectre to stand in waiting for them on \nthe other side; but nothing appeared", "uuid" : "9578B139", "_id" : { "$oid" : "506e768ba8708f0200000037" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[19]", "startOffset" : 692, "end" : "/div[1]/p[19]", "endOffset" : 822, "_id" : { "$oid" : "506e768ba8708f0200000038" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349416587166 }, "created" : { "$date" : 1349416587166 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "506e7699c076a30200000024" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1349416601250 }, "groups" : [ "21L.000J" ], "id" : "506e7699c076a30200000024", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "quote" : "servant", "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 34, "end" : "/div[1]/p[20]", "endOffset" : 41, "_id" : { "$oid" : "506e7699c076a30200000025" } } ], "tags" : [], "text" : "He has a servant!? Shelley's got the wrong idea thinking that an unemployed research scientist has money. ", "updated" : { "$date" : 1349416643365 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "user" : "nhall@mit.edu", "username" : "Richard H.", "uuid" : "6C2C0292" } -{ "id" : "506e76ebc076a30200000026", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Again with the child-like attitude. It seems to be a dramatic change from the usual Victor we're accustomed to seeing. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "he saw a wildness in my eyes for which he could not account; \nand my loud, unrestrained, heartless laughter, frightened and astonished him.\n\"My dear Victor,\" cried he, \"what, for God's sake, is the \nmatter? Do not laugh in that manner. How ill you are! What is the cause of all \nthis?\" \n\"Do not ask me,\" cried I, putting my hands before my eyes, \nfor I thought I saw the dreaded spectre glide into the room; \"he can tell. -- \nOh, save me! save me!\" I imagined that the monster seized me; I struggled \nfuriously, and fell down in a fit.", "uuid" : "3AE3D3FE", "_id" : { "$oid" : "506e76ebc076a30200000026" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 470, "end" : "/div[1]/p[22]", "endOffset" : 248, "_id" : { "$oid" : "506e76ebc076a30200000027" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349416683815 }, "created" : { "$date" : 1349416683815 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "506e7721c076a30200000028", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "While Victor neglects the Creation, Henry devotes his time to caring for Victor. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "\"Dearest Clerval,\" exclaimed I, \"how kind, how very good \nyou are to me. This whole winter, instead of being spent in study, as you \npromised yourself, has been consumed in my sick room. How shall I ever repay \nyou? I feel the greatest remorse for the disappointment of which I have been the \noccasion; but you will forgive me.\"", "uuid" : "768E39CA", "_id" : { "$oid" : "506e7721c076a30200000028" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[27]", "startOffset" : 0, "end" : "/div[1]/p[27]", "endOffset" : 328, "_id" : { "$oid" : "506e7721c076a30200000029" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1349416737389 }, "created" : { "$date" : 1349416737389 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "506e774dc076a3020000002a" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1349416781427 }, "groups" : [ "21L.000J" ], "id" : "506e774dc076a3020000002a", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "quote" : "\"You will repay me entirely, if you do not discompose \nyourself, but get well as fast as you can; and since you appear in such good \nspirits, I may speak to you on one subject, may I not?\" \nI trembled. One subject! what could it be? Could he allude \nto an object on whom I dared not even think?", "ranges" : [ { "start" : "/div[1]/p[28]", "startOffset" : 0, "end" : "/div[1]/p[29]", "endOffset" : 104, "_id" : { "$oid" : "506e774dc076a3020000002b" } } ], "tags" : [], "text" : "Intense paranoia. ", "updated" : { "$date" : 1349416806283 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "user" : "nhall@mit.edu", "username" : "Richard H.", "uuid" : "4235363A" } -{ "id" : "506efd902b67860200000002", "user" : "agursoy@mit.edu", "username" : "Ayse G.", "text" : "A day like yesterday.", "uri" : "http://annotationstudio.mit.edu/documents/moby-dick-chapters-1-5", "quote" : "damp, drizzly November", "uuid" : "C4B3ECB0", "_id" : { "$oid" : "506efd902b67860200000002" }, "permissions" : { "delete" : [ "agursoy@mit.edu" ], "update" : [ "agursoy@mit.edu" ], "admin" : [ "agursoy@mit.edu" ], "read" : [ "agursoy@mit.edu" ] }, "tags" : [ "weather", "question" ], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 395, "end" : "/div[1]/div[3]", "endOffset" : 417, "_id" : { "$oid" : "506efd902b67860200000003" } } ], "groups" : [ "Testing", "21L.003", "21L.000J" ], "updated" : { "$date" : 1349451152315 }, "created" : { "$date" : 1349451152315 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507596adbf35a20200000002", "user" : "moverlin@mit.edu", "username" : "Matt O.", "text" : "The author depicts Jane as inferior in many ways. The Reeds think she is less deserving of respect, and she is physically inferior.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "my physical inferiority to Eliza, John, and \nGeorgiana Reed.", "uuid" : "B6A6F032", "_id" : { "$oid" : "507596adbf35a20200000002" }, "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]/p[2]", "startOffset" : 262, "end" : "/div[1]/div[3]/p[2]", "endOffset" : 322, "_id" : { "$oid" : "507596adbf35a20200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349883565683 }, "created" : { "$date" : 1349883565683 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5075c42aa94a230200000008", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "timid character? already can start to characterize Jane", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "and humbled by the \nconsciousness of my physical inferiority", "uuid" : "C62084BC", "_id" : { "$oid" : "5075c42aa94a230200000008" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "Jane", "characteristics" ], "ranges" : [ { "start" : "/div[1]/div[3]/p[2]", "startOffset" : 225, "end" : "/div[1]/div[3]/p[2]", "endOffset" : 285, "_id" : { "$oid" : "5075c42aa94a230200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349895210457 }, "created" : { "$date" : 1349895210457 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5075c496bf35a20200000006", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "first novel Jane is reading in the story...significance?", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Bewick’s History of British \nBirds", "uuid" : "096913CE", "_id" : { "$oid" : "5075c496bf35a20200000006" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "source" ], "ranges" : [ { "start" : "/div[1]/div[3]/p[8]", "startOffset" : 22, "end" : "/div[1]/div[3]/p[8]", "endOffset" : 56, "_id" : { "$oid" : "5075c496bf35a20200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349895318737 }, "created" : { "$date" : 1349895318737 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5075c61cbf35a20200000008", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Goldsmith’s History of Rome – book by Oliver Goldsmith (c. 1730-74), published in 1769; the Roman emperors Nero and Caligula are famous for their cruelty", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Goldsmith’s History of Rome, and had formed \nmy opinion of Nero, Caligula, &c.", "uuid" : "FD74F0EE", "_id" : { "$oid" : "5075c61cbf35a20200000008" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "sources" ], "ranges" : [ { "start" : "/div[1]/div[3]/p[35]", "startOffset" : 11, "end" : "/div[1]/div[3]/p[35]", "endOffset" : 89, "_id" : { "$oid" : "5075c61cbf35a20200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349895708718 }, "created" : { "$date" : 1349895708718 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5075c659a94a23020000000a", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "is usually very obedient, subservient", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "a new thing for me", "uuid" : "F44381A7", "_id" : { "$oid" : "5075c659a94a23020000000a" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "Jane", "characteristic" ], "ranges" : [ { "start" : "/div[1]/div[4]/p[1]", "startOffset" : 24, "end" : "/div[1]/div[4]/p[1]", "endOffset" : 42, "_id" : { "$oid" : "5075c659a94a23020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349895769746 }, "created" : { "$date" : 1349895769746 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5075c701bf35a2020000000a", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "does this say something about her earlier life?", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Bewick’s History of British \nBirds", "uuid" : "6FB9C92F", "_id" : { "$oid" : "5075c701bf35a2020000000a" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]/p[8]", "startOffset" : 22, "end" : "/div[1]/div[3]/p[8]", "endOffset" : 56, "_id" : { "$oid" : "5075c701bf35a2020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349895937696 }, "created" : { "$date" : 1349895937696 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5075c70ca94a23020000000c", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "influenced by writing", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "History of Rome", "uuid" : "55D94BAF", "_id" : { "$oid" : "5075c70ca94a23020000000c" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]/p[35]", "startOffset" : 23, "end" : "/div[1]/div[3]/p[35]", "endOffset" : 38, "_id" : { "$oid" : "5075c70ca94a23020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349895948600 }, "created" : { "$date" : 1349895948600 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5075c723a94a23020000000e", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "book she enjoys", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Gulliver’s Travels", "uuid" : "61B7053D", "_id" : { "$oid" : "5075c723a94a23020000000e" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[21]", "startOffset" : 907, "end" : "/div[1]/div[5]/p[21]", "endOffset" : 927, "_id" : { "$oid" : "5075c723a94a23020000000f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349895971368 }, "created" : { "$date" : 1349895971368 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5075c731a94a230200000010", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "instructive book", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Child’s Guide", "uuid" : "853E60AD", "_id" : { "$oid" : "5075c731a94a230200000010" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]/p[70]", "startOffset" : 60, "end" : "/div[1]/div[6]/p[70]", "endOffset" : 73, "_id" : { "$oid" : "5075c731a94a230200000011" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349895985935 }, "created" : { "$date" : 1349895985935 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5075c73abf35a2020000000c", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "really sad hymn ", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "ballad", "uuid" : "A1DD0D4D", "_id" : { "$oid" : "5075c73abf35a2020000000c" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[23]", "startOffset" : 402, "end" : "/div[1]/div[5]/p[23]", "endOffset" : 408, "_id" : { "$oid" : "5075c73abf35a2020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349895994398 }, "created" : { "$date" : 1349895994398 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5075c747a94a230200000012", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "significance of this book?", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Arabian tales;", "uuid" : "EDDFB3F1", "_id" : { "$oid" : "5075c747a94a230200000012" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]/p[97]", "startOffset" : 181, "end" : "/div[1]/div[6]/p[97]", "endOffset" : 195, "_id" : { "$oid" : "5075c747a94a230200000013" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349896007463 }, "created" : { "$date" : 1349896007463 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5075c74ebf35a2020000000e", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Helen's book", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Rasselas", "uuid" : "75ACF7E6", "_id" : { "$oid" : "5075c74ebf35a2020000000e" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]/p[65]", "startOffset" : 521, "end" : "/div[1]/div[7]/p[65]", "endOffset" : 529, "_id" : { "$oid" : "5075c74ebf35a2020000000f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349896014449 }, "created" : { "$date" : 1349896014449 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5075c77ca94a230200000014", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "\"weekly\" http://www.merriam-webster.com/dictionary/hebdomadal", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "hebdomadal", "uuid" : "A604BCC6", "_id" : { "$oid" : "5075c77ca94a230200000014" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[9]/p[7]", "startOffset" : 179, "end" : "/div[1]/div[9]/p[7]", "endOffset" : 190, "_id" : { "$oid" : "5075c77ca94a230200000015" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349896060115 }, "created" : { "$date" : 1349896060115 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5075c7a5a94a230200000016", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "very harsh ", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Brocklehurst", "uuid" : "186CF6D7", "_id" : { "$oid" : "5075c7a5a94a230200000016" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[9]/p[37]", "startOffset" : 28, "end" : "/div[1]/div[9]/p[37]", "endOffset" : 40, "_id" : { "$oid" : "5075c7a5a94a230200000017" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349896101994 }, "created" : { "$date" : 1349896101994 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5075c7bfbf35a20200000010", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "\"I shall rise again\" http://en.wikipedia.org/wiki/Resurgam", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Resurgam", "uuid" : "957EB253", "_id" : { "$oid" : "5075c7bfbf35a20200000010" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[11]/p[61]", "startOffset" : 202, "end" : "/div[1]/div[11]/p[61]", "endOffset" : 210, "_id" : { "$oid" : "5075c7bfbf35a20200000011" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349896127577 }, "created" : { "$date" : 1349896127577 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5075c865a94a230200000018", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "room of the master's death-->harsh punishment for 10 year old girl", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "and a miniature of her deceased \nhusband; and in those last words lies the secret of the \nred-room—the spell which kept it so lonely in spite of its \ngrandeur.", "uuid" : "5CC8898F", "_id" : { "$oid" : "5075c865a94a230200000018" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]/p[21]", "startOffset" : 454, "end" : "/div[1]/div[4]/p[21]", "endOffset" : 613, "_id" : { "$oid" : "5075c865a94a230200000019" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349896293805 }, "created" : { "$date" : 1349896293805 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5075c951a94a23020000001a", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "seen as an object, inhumane", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "affection a thing that could not sympathise with one amongst \nthem; a heterogeneous thing,", "uuid" : "8AD50E91", "_id" : { "$oid" : "5075c951a94a23020000001a" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "jane" ], "ranges" : [ { "start" : "/div[1]/div[4]/p[29]", "startOffset" : 244, "end" : "/div[1]/div[4]/p[29]", "endOffset" : 335, "_id" : { "$oid" : "5075c951a94a23020000001b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349896529876 }, "created" : { "$date" : 1349896529876 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5075c976a94a23020000001c", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Othello!", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "head and front of his \noffending", "uuid" : "B83FDB83", "_id" : { "$oid" : "5075c976a94a23020000001c" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[15]/p[75]", "startOffset" : 18, "end" : "/div[1]/div[15]/p[75]", "endOffset" : 50, "_id" : { "$oid" : "5075c976a94a23020000001d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349896566617 }, "created" : { "$date" : 1349896566617 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 3, "_id" : { "$oid" : "5075c98aa94a23020000001e" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1349896586704 }, "groups" : [ "21L.003" ], "id" : "5075c98aa94a23020000001e", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "quote" : "after life’s fitful fever they \nsleep well", "ranges" : [ { "start" : "/div[1]/div[13]/p[109]", "startOffset" : 6, "end" : "/div[1]/div[13]/p[109]", "endOffset" : 48, "_id" : { "$oid" : "509ad26673cd330200000004" } } ], "tags" : [ "macbeth" ], "text" : "After a troubling life, they are rewarded with peace in death---> macbeth: safer to be dead than face all the worry Direct reference to macbeth; after macbeth murders Duncan, the king, macbeth envies his victim because he is peaceful in death while Macbeth must live with his guilt Interesting how Jane says this quote: She is suspicious of mysteries surrounding Rochester", "updated" : { "$date" : 1352323723329 }, "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "uuid" : "C0F54207" } -{ "id" : "5075c99fbf35a20200000012", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Midsummer Night's Dream", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "mustard-seed", "uuid" : "B95A140C", "_id" : { "$oid" : "5075c99fbf35a20200000012" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[26]/p[10]", "startOffset" : 132, "end" : "/div[1]/div[26]/p[10]", "endOffset" : 145, "_id" : { "$oid" : "5075c99fbf35a20200000013" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349896607345 }, "created" : { "$date" : 1349896607345 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5075c9b1a94a230200000020", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Hamlet!", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "I lay that pleasant unction to my soul", "uuid" : "8C209AE8", "_id" : { "$oid" : "5075c9b1a94a230200000020" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[26]/p[68]", "startOffset" : 123, "end" : "/div[1]/div[26]/p[68]", "endOffset" : 161, "_id" : { "$oid" : "5075c9b1a94a230200000021" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1349896625807 }, "created" : { "$date" : 1349896625807 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5079b227b27ad80200000002" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1350152743694 }, "groups" : [ "21L.000", "21L.000J" ], "id" : "5079b227b27ad80200000002", "permissions" : { "delete" : [ "deldar@mit.edu" ], "update" : [ "deldar@mit.edu" ], "admin" : [ "deldar@mit.edu" ], "read" : [ "deldar@mit.edu" ] }, "quote" : "\"These wonderful narrations inspired me with \nstrange feelings. Was man, indeed, at once so powerful, so virtuous and \nmagnificent, yet so vicious and base? He appeared at one time a mere scion of \nthe evil principle, and at another as all that can be conceived of noble and \ngodlike. To be a great and virtuous man appeared the highest honour that can \nbefall a sensitive being; to be base and vicious, as many on record have been, \nappeared the lowest degradation, a condition more abject than that of the blind \nmole or harmless worm. For a long time I could not conceive how one man could go \nforth to murder his fellow, or even why there were laws and governments; but \nwhen I heard details of vice and bloodshed, my wonder ceased, and I turned away \nwith disgust and loathing.\n\n\"Every conversation of the cottagers now opened \nnew wonders to me. While I listened to the instructions which Felix bestowed \nupon the Arabian, the strange system of human society was explained to me. I \nheard of the division of property, of immense wealth and squalid poverty; of \nrank, descent, and noble blood.\n\n\"The words induced me to turn towards myself. I \nlearned that the possessions most esteemed by your fellow-creatures were high \nand unsullied descent united with riches. A man might be respected with only one \nof these acquisitions; but, without either, he was considered, except in very rare \ninstances, as a vagabond and a slave, doomed to waste his powers for the profit \nof the chosen few! And what was I? Of my creation and creator I was absolutely \nignorant; but I knew that I possessed no money, no friends, no kind of property. \nI was, besides, endowed with a figure hideously deformed and loathsome; I was not \neven of the same nature as men. I was more agile than they, and could subsist \nupon coarser diet; I bore the extremes of heat and cold with less injury to my \nframe; my stature far exceeded theirs. When I looked around, I saw and heard of \nnone like me. Was I then a monster, a blot upon the earth, from which all men \nfled, and whom all men disowned?", "ranges" : [ { "start" : "/div[1]/p[379]", "startOffset" : 1, "end" : "/div[1]/p[381]", "endOffset" : 972, "_id" : { "$oid" : "507a1a281dfbca0200000008" } } ], "tags" : [], "text" : "The monster's perception of man and what he is.", "updated" : { "$date" : 1350179368221 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "user" : "deldar@mit.edu", "username" : "Daniel E.", "uuid" : "FD241127" } -{ "id" : "5079b25f1dfbca0200000002", "user" : "deldar@mit.edu", "username" : "Daniel E.", "text" : "So alien an upbringing, but could he still be human?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "\"But where were my friends and relations? No \nfather had watched my infant days, no mother had blessed me with smiles and \ncaresses; or if they had, all my past life was now a blot, a blind vacancy in \nwhich I distinguished nothing. From my earliest remembrance I had been as I then \nwas in height and proportion. I ha never yet seen a being resembling me, or who \nclaimed any intercourse with me. What was I? The question again recurred, to be \nanswered only with groans.", "uuid" : "1FED3998", "_id" : { "$oid" : "5079b25f1dfbca0200000002" }, "permissions" : { "delete" : [ "deldar@mit.edu" ], "update" : [ "deldar@mit.edu" ], "admin" : [ "deldar@mit.edu" ], "read" : [ "deldar@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[385]", "startOffset" : 1, "end" : "/div[1]/p[385]", "endOffset" : 473, "_id" : { "$oid" : "5079b25f1dfbca0200000003" } } ], "groups" : [ "21L.000", "21L.000J" ], "updated" : { "$date" : 1350152799682 }, "created" : { "$date" : 1350152799682 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "507a0654b27ad80200000004" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1350174292839 }, "groups" : [ "21L.000", "21L.000J" ], "id" : "507a0654b27ad80200000004", "permissions" : { "delete" : [ "deldar@mit.edu" ], "update" : [ "deldar@mit.edu" ], "admin" : [ "deldar@mit.edu" ], "read" : [ "deldar@mit.edu" ] }, "quote" : "I enjoyed this scene; and yet my enjoyment was \nembittered both by the memory of the past, and the anticipation of the future. I \nwas formed for peaceful happiness. During my youthful days discontent never \nvisited my mind; and if I was ever overcome by ennui, the sight of what is \nbeautiful in nature, or the study of what is excellent and sublime in the \nproductions of man, could always interest my heart, and communicate elasticity \nto my spirits. But I am a blasted tree; the bolt has entered my soul; and I felt \nthen that I should survive to exhibit, what I shall soon cease to be—a \nmiserable spectacle of wrecked humanity, pitiable to others, and abhorrent to \nmyself.", "ranges" : [ { "start" : "/div[1]/p[537]", "startOffset" : 1, "end" : "/div[1]/p[537]", "endOffset" : 679, "_id" : { "$oid" : "507a0654b27ad80200000005" } } ], "tags" : [], "text" : "Frankenstein takes a moment to comment on his own state, his humanity.", "updated" : { "$date" : 1350174323692 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "user" : "deldar@mit.edu", "username" : "Daniel E.", "uuid" : "2310E24D" } -{ "id" : "507a0a7f1dfbca0200000004", "user" : "deldar@mit.edu", "username" : "Daniel E.", "text" : "Almost feels as though he murdered this new monster, as if it were a human", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "The remains of the half-finished \ncreature, whom I had destroyed, lay scattered on the floor, and I almost felt as \nif I had mangled the living flesh of a human being.", "uuid" : "ADC7D240", "_id" : { "$oid" : "507a0a7f1dfbca0200000004" }, "permissions" : { "delete" : [ "deldar@mit.edu" ], "update" : [ "deldar@mit.edu" ], "admin" : [ "deldar@mit.edu" ], "read" : [ "deldar@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[576]", "startOffset" : 393, "end" : "/div[1]/p[576]", "endOffset" : 560, "_id" : { "$oid" : "507a0a7f1dfbca0200000005" } } ], "groups" : [ "21L.000", "21L.000J" ], "updated" : { "$date" : 1350175359431 }, "created" : { "$date" : 1350175359431 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507a17151dfbca0200000006", "user" : "deldar@mit.edu", "username" : "Daniel E.", "text" : "The monster's own monstrousness led to his conversion from good to evil, if his aesthetic is evil, how can his inner being stand to be good?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Evil \nthenceforth became my good. Urged thus far, I had no choice but to adapt my \nnature to an element which I had willingly chosen. The completion of my dæmoniacal design became an insatiable passion. And now it is ended; there is \nmy last victim!\"", "uuid" : "2A78D50B", "_id" : { "$oid" : "507a17151dfbca0200000006" }, "permissions" : { "delete" : [ "deldar@mit.edu" ], "update" : [ "deldar@mit.edu" ], "admin" : [ "deldar@mit.edu" ], "read" : [ "deldar@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[784]", "startOffset" : 900, "end" : "/div[1]/p[784]", "endOffset" : 1151, "_id" : { "$oid" : "507a17151dfbca0200000007" } } ], "groups" : [ "21L.000", "21L.000J" ], "updated" : { "$date" : 1350178581384 }, "created" : { "$date" : 1350178581384 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507a2a8f1dfbca0200000009", "user" : "deldar@mit.edu", "username" : "Daniel E.", "text" : "Colored with the hue of death. Frankenstein's monster skin is the hue of death along with his \"straight black lips\"", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "they became livid with the hue of death", "uuid" : "9839F9CC", "_id" : { "$oid" : "507a2a8f1dfbca0200000009" }, "permissions" : { "delete" : [ "deldar@mit.edu" ], "update" : [ "deldar@mit.edu" ], "admin" : [ "deldar@mit.edu" ], "read" : [ "deldar@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1020, "end" : "/div[1]/p[3]", "endOffset" : 1059, "_id" : { "$oid" : "507a2a8f1dfbca020000000a" } } ], "groups" : [ "21L.000", "21L.000J" ], "updated" : { "$date" : 1350183567378 }, "created" : { "$date" : 1350183567378 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507a360a1dfbca020000000b", "user" : "deldar@mit.edu", "username" : "Daniel E.", "text" : "\"Mothers\" are supposed to be delighted when they gaze upon their living breathing \"baby\" for the first time.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "but now that I had finished, the beauty of the dream vanished, and \nbreathless horror and disgust filled my heart.", "uuid" : "D9A31D3D", "_id" : { "$oid" : "507a360a1dfbca020000000b" }, "permissions" : { "delete" : [ "deldar@mit.edu" ], "update" : [ "deldar@mit.edu" ], "admin" : [ "deldar@mit.edu" ], "read" : [ "deldar@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 306, "end" : "/div[1]/p[3]", "endOffset" : 420, "_id" : { "$oid" : "507a360a1dfbca020000000c" } } ], "groups" : [ "21L.000", "21L.000J" ], "updated" : { "$date" : 1350186506631 }, "created" : { "$date" : 1350186506631 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "507a376c1dfbca020000000d" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1350186860125 }, "groups" : [ "21L.000", "21L.000J" ], "id" : "507a376c1dfbca020000000d", "permissions" : { "delete" : [ "deldar@mit.edu" ], "update" : [ "deldar@mit.edu" ], "admin" : [ "deldar@mit.edu" ], "read" : [ "deldar@mit.edu" ] }, "quote" : "Unable to endure the aspect of \nthe being I had created, I rushed out of the room,", "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 421, "end" : "/div[1]/p[3]", "endOffset" : 503, "_id" : { "$oid" : "507a376c1dfbca020000000e" } } ], "tags" : [], "text" : "\"Aspect\" meaning the unnatural quality of the creature he created, that very spark of being that he infused. Additionally, it was very inhumane of him to leave a \"newborn\" alone at its birth.", "updated" : { "$date" : 1350186888938 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "user" : "deldar@mit.edu", "username" : "Daniel E.", "uuid" : "A9AD6D56" } -{ "id" : "507a4d1c1dfbca020000000f", "user" : "deldar@mit.edu", "username" : "Daniel E.", "text" : "Empathetic humane character, perfect qualities of a human.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein-i-iv-revision", "quote" : "He knew that I could \nnot have a more kind and attentive nurse than himself; and, firm in the hope he \nfelt of my recovery, he did not doubt that, instead of doing harm, he performed \nthe kindest action that he could towards them.", "uuid" : "2F64FD07", "_id" : { "$oid" : "507a4d1c1dfbca020000000f" }, "permissions" : { "delete" : [ "deldar@mit.edu" ], "update" : [ "deldar@mit.edu" ], "admin" : [ "deldar@mit.edu" ], "read" : [ "deldar@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 350, "end" : "/div[1]/p[24]", "endOffset" : 580, "_id" : { "$oid" : "507a4d1c1dfbca0200000010" } } ], "groups" : [ "21L.000", "21L.000J" ], "updated" : { "$date" : 1350192412959 }, "created" : { "$date" : 1350192412959 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "507c55337093690200000002" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1350325555271 }, "groups" : [ "21L.003" ], "id" : "507c55337093690200000002", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "quote" : "a hag like one of those who appeared to Macbeth\non the heath of Forres", "ranges" : [ { "start" : "/div[1]/div[17]/p[10]", "startOffset" : 124, "end" : "/div[1]/div[17]/p[10]", "endOffset" : 194, "_id" : { "$oid" : "5093ffe8d1a495020000000e" } } ], "tags" : [ "Macbeth" ], "text" : "direct reference to Macbeth: the 3 witches that appear to Macbeth dictate the story saying that Macbeth will become king..leads to murder plot", "updated" : { "$date" : 1351876584541 }, "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "uuid" : "7104701B" } -{ "id" : "507c843a7093690200000004", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "It's funny how Darwin has to argue about this, when people already used selective breeding on their livestock.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "I am fully convinced that species are not immutable", "uuid" : "33415DFF", "_id" : { "$oid" : "507c843a7093690200000004" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 20190, "end" : "/div[1]", "endOffset" : 20241, "_id" : { "$oid" : "507c843a7093690200000005" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350337594777 }, "created" : { "$date" : 1350337594777 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507c870222ebba0200000003", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Some mutations tend to be very noticeable. It begs the question whether people in Darwin's time even witnessed such sudden mutations. They, not living in the age of information distribution,very large human and livestock populations, and genetic material altering substances and radiation, definitely were not exposed to as many as we are today.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Some variations useful to him have probably\narisen suddenly, or by one step", "uuid" : "DA3306EE", "_id" : { "$oid" : "507c870222ebba0200000003" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 64379, "end" : "/div[1]", "endOffset" : 64454, "_id" : { "$oid" : "507c870222ebba0200000004" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350338306103 }, "created" : { "$date" : 1350338306103 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507cf91e22ebba0200000005", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Very important reference to hard evidence.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "we must, I think, look further than to mere\nvariability. We cannot suppose that all the breeds were suddenly produced\nas perfect and as useful as we now see them; indeed, in several cases, we\nknow that this has not been their history.", "uuid" : "DAA3AF6B", "_id" : { "$oid" : "507cf91e22ebba0200000005" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 65532, "end" : "/div[1]", "endOffset" : 65766, "_id" : { "$oid" : "507cf91e22ebba0200000006" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350367518364 }, "created" : { "$date" : 1350367518364 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507cf95e22ebba0200000007", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Prelude to the mechanism of evolution: cumulative effect of selected variation", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "nature gives successive variations; man adds them\nup in certain directions useful to him.", "uuid" : "F480A794", "_id" : { "$oid" : "507cf95e22ebba0200000007" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 65817, "end" : "/div[1]", "endOffset" : 65906, "_id" : { "$oid" : "507cf95e22ebba0200000008" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350367582303 }, "created" : { "$date" : 1350367582303 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507cfead22ebba0200000009", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "All these distinct and unrelated instances indicate that the technique is universally accepted and must have some legitimate evidence supporting it.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "The\nprinciple of selection I find distinctly given in an ancient Chinese\nencyclopædia. Explicit rules are laid down by some of the Roman classical\nwriters. From passages in Genesis, it is clear that the colour of domestic\nanimals was at that early period attended to. Savages now sometimes cross\ntheir dogs with wild canine animals, to improve the breed, and they\nformerly did so, as is attested by passages in Pliny. The savages in South\nAfrica match their draught cattle by colour, as do some of the Esquimaux\ntheir teams of dogs. Livingstone shows how much good domestic breeds are\nvalued by the negroes of the interior of Africa who have not associated\nwith Europeans.", "uuid" : "719F0A29", "_id" : { "$oid" : "507cfead22ebba0200000009" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 72155, "end" : "/div[1]", "endOffset" : 72827, "_id" : { "$oid" : "507cfead22ebba020000000a" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350368941586 }, "created" : { "$date" : 1350368941586 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507d05cc7093690200000006", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "An important step in the thought process. If modification can occur by conscious choice, it can perhaps occur without it.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "unconscious selection", "uuid" : "DD28D2A6", "_id" : { "$oid" : "507d05cc7093690200000006" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 84508, "end" : "/div[1]", "endOffset" : 84529, "_id" : { "$oid" : "507d05cc7093690200000007" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350370764776 }, "created" : { "$date" : 1350370764776 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507d05ea7093690200000008", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "perhaps a need for deep time?", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "slowly", "uuid" : "AE088B2C", "_id" : { "$oid" : "507d05ea7093690200000008" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 84740, "end" : "/div[1]", "endOffset" : 84746, "_id" : { "$oid" : "507d05ea7093690200000009" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350370794994 }, "created" : { "$date" : 1350370794994 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "507d57af8139d20200000002" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1350391727606 }, "groups" : [ "21L.448J" ], "id" : "507d57af8139d20200000002", "permissions" : { "admin" : [ "jpaggi@mit.edu" ], "delete" : [ "jpaggi@mit.edu" ], "read" : [], "update" : [ "jpaggi@mit.edu" ] }, "quote" : "It is well worth while carefully to\nstudy the several treatises published on some of our old cultivated plants,\nas on the hyacinth, potato, even the dahlia, &c.; and it is really\nsurprising to note the endless points in structure and constitution in\nwhich the varieties and sub-varieties differ slightly from each other. The\nwhole organisation seems to have become plastic, and tends to depart in\nsome small degree from that of the parental type.", "ranges" : [ { "start" : "/div[1]", "startOffset" : 30765, "end" : "/div[1]", "endOffset" : 31211, "_id" : { "$oid" : "507d57af8139d20200000003" } } ], "tags" : [], "text" : "The characteristics of a species are not constant over time. also, species tend to form \"varieties and sub-varieties\" hinting to that there is some natural mechanism for a species to diverge into several species with different characteristics.", "updated" : { "$date" : 1350391738324 }, "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "uuid" : "AA3819EA" } -{ "id" : "507d58b38139d20200000004", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "text" : "The fact that changes only occur in one out of several million animals is consistant with the often slow progress of evolution. It also explains how people believed that species were static for so long because change occurs so infrequently.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "say, once amongst several million individuals--and\nit reappears in the child, the mere doctrine of chances almost compels us\nto attribute its reappearance to inheritance.", "uuid" : "32E71F4A", "_id" : { "$oid" : "507d58b38139d20200000004" }, "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 32052, "end" : "/div[1]", "endOffset" : 32222, "_id" : { "$oid" : "507d58b38139d20200000005" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350391987207 }, "created" : { "$date" : 1350391987207 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "507da8fcd9b47d0200000002" }, "id" : "507da8fcd9b47d0200000002", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "who?", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "-that mystery of mysteries, as it has been called by one of our\ngreatest philosophers.", "uuid" : "445FA144", "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 10677, "end" : "/div[1]", "endOffset" : 10764, "_id" : { "$oid" : "507da8fcd9b47d0200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350412540240 }, "created" : { "$date" : 1350412540240 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "507daa4e8139d20200000006" }, "id" : "507daa4e8139d20200000006", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "the bottom line?", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "reflecting on the mutual affinities of organic beings, on their\nembryological relations, their geographical distribution, geological\nsuccession, and other such facts, might come to the conclusion that each\nspecies had not been independently created, but had descended, like\nvarieties, from other species.", "uuid" : "BB2BFE71", "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 13802, "end" : "/div[1]", "endOffset" : 14106, "_id" : { "$oid" : "507daa4e8139d20200000007" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350412878993 }, "created" : { "$date" : 1350412878993 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "507dab168139d20200000008" }, "id" : "507dab168139d20200000008", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "humans control the adaptation of certain organisms in order to suit our needs. ", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "variation under domestication, afforded the best\nand safest clue. I may venture to express my conviction of the high value\nof such studies, although they have been very commonly neglected by\nnaturalists.", "uuid" : "7D631A24", "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 16208, "end" : "/div[1]", "endOffset" : 16413, "_id" : { "$oid" : "507dab168139d20200000009" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350413078586 }, "created" : { "$date" : 1350413078586 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "507dababd9b47d0200000006" }, "id" : "507dababd9b47d0200000006", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "take directly from Malthus's essay and using it to back up his own conclusions", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "In the next chapter the Struggle for Existence amongst all\norganic beings throughout the world, which inevitably follows from the high\ngeometrical ratio of their {5} increase, will be treated of. This is the\ndoctrine of Malthus, applied to the whole animal and vegetable kingdoms. As\nmany more individuals of each species are born than can possibly survive;\nand as, consequently, there is a frequently recurring struggle for\nexistence, it follows that any being, if it vary however slightly in any\nmanner profitable to itself, under the complex and sometimes varying\nconditions of life, will have a better chance of surviving, and thus be\n_naturally selected_. From the strong principle of inheritance, any\nselected variety will tend to propagate its new and modified form.", "uuid" : "761B0830", "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 17075, "end" : "/div[1]", "endOffset" : 17849, "_id" : { "$oid" : "507dababd9b47d0200000007" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350413227709 }, "created" : { "$date" : 1350413227709 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "507dac22d9b47d0200000008" }, "id" : "507dac22d9b47d0200000008", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "the most\napparent and gravest difficulties on the theory will be given: namely,\nfirst, the difficulties of transitions, or in understanding how a simple\nbeing or a simple organ can be changed and perfected into a highly\ndeveloped being or elaborately constructed organ; secondly, the subject of\nInstinct, or the mental powers of animals; thirdly, Hybridism, or the\ninfertility of species and the fertility of varieties when intercrossed;\nand fourthly, the imperfection of the Geological Record.", "uuid" : "35DA226F", "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [ "psummary,", "direct" ], "ranges" : [ { "start" : "/div[1]", "startOffset" : 18274, "end" : "/div[1]", "endOffset" : 18768, "_id" : { "$oid" : "507dac22d9b47d0200000009" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350413346768 }, "created" : { "$date" : 1350413346768 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "507db104d9b47d020000000a" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1350414596122 }, "groups" : [ "21L.448J" ], "id" : "507db104d9b47d020000000a", "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [ "holjose@mit.edu" ] }, "quote" : "it is preposterous to attribute to mere external conditions,\nthe structure, for instance, of the woodpecker, with its feet, tail, beak,\nand tongue, so admirably adapted to catch insects under the bark of trees.\nIn the case of the misseltoe, which draws its nourishment from certain\ntrees, which has seeds that must be transported by certain birds, and which\nhas flowers with separate sexes absolutely requiring the agency of certain\ninsects to bring pollen from one flower to the other, it is equally\npreposterous to account for the structure of this parasite, with its\nrelations to several distinct organic beings, by the effects of external\nconditions, or of habit, or of the volition of the plant itself.", "ranges" : [ { "start" : "/div[1]", "startOffset" : 14585, "end" : "/div[1]", "endOffset" : 15293, "_id" : { "$oid" : "507db104d9b47d020000000b" } } ], "tags" : [], "text" : "This is analogous to the watch argument. To have something so complexly designed, for such a specific purpose, it must have a designer. Darwin is acknowledging does not believe it was just due to random chance. However, he does indicate what he believes the reason is behind such intricate design.", "updated" : { "$date" : 1350414875436 }, "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "user" : "holjose@mit.edu", "username" : "Holly J.", "uuid" : "15430AA0" } -{ "id" : "507db2d48139d2020000000a", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Introduces the idea of natural selection as a means of evolution. He does not claim it is the only means.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Furthermore, I am convinced that Natural Selection has been the\nmain but not exclusive means of modification.", "uuid" : "A5329055", "_id" : { "$oid" : "507db2d48139d2020000000a" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [ "holjose@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 20476, "end" : "/div[1]", "endOffset" : 20586, "_id" : { "$oid" : "507db2d48139d2020000000b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350415060312 }, "created" : { "$date" : 1350415060312 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507db5938139d2020000000c", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "More knowledge of genetics would help this argument more.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "if it be in any degree profitable to an\nindividual of any species, in its infinitely complex relations to other\norganic beings and to external nature, will tend to the preservation of\nthat individual, and will generally be inherited by its offspring.", "uuid" : "46FBBAE3", "_id" : { "$oid" : "507db5938139d2020000000c" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [ "holjose@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 123130, "end" : "/div[1]", "endOffset" : 123380, "_id" : { "$oid" : "507db5938139d2020000000d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350415763102 }, "created" : { "$date" : 1350415763102 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507db761d9b47d020000000c", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Analogous to Malthus' assertion. Malthus would explain this by the fact that food production increases linearly and there is not enough food to support a geometrically growing population.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "as more individuals are produced than can possibly survive,\nthere must in every case be a struggle for existence", "uuid" : "92266905", "_id" : { "$oid" : "507db761d9b47d020000000c" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [ "holjose@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 127422, "end" : "/div[1]", "endOffset" : 127535, "_id" : { "$oid" : "507db761d9b47d020000000d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350416225810 }, "created" : { "$date" : 1350416225810 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507dbab58139d2020000000e", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Suggesting that humans can actively utilize the concept of natural selection to breed plants that have a desired trait.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "It is not that these countries, so rich in species, do not by a\nstrange chance possess the aboriginal stocks of any useful plants, but that\nthe native plants have not been improved by continued selection up to a\nstandard of perfection comparable with that given to the plants in\ncountries anciently civilised.", "uuid" : "A86FBEC3", "_id" : { "$oid" : "507dbab58139d2020000000e" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [ "holjose@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 79707, "end" : "/div[1]", "endOffset" : 80017, "_id" : { "$oid" : "507dbab58139d2020000000f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350417077959 }, "created" : { "$date" : 1350417077959 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507dddf3d9b47d020000000e", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "It is evident that our domestication of different plants and animals has had dramatic effects on their development. e.g. household dogs vs wolves", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "When we\nreflect on the vast diversity of the plants and animals which have been\ncultivated, and which have varied during all ages under the most different\nclimates and treatment, I think we are driven to conclude that this great\nvariability is simply due to our domestic productions having been raised\nunder conditions of life not so uniform as, and somewhat different from,\nthose to which the parent-species have been exposed under nature.", "uuid" : "5FB69CAD", "_id" : { "$oid" : "507dddf3d9b47d020000000e" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 21458, "end" : "/div[1]", "endOffset" : 21898, "_id" : { "$oid" : "507dddf3d9b47d020000000f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350426099002 }, "created" : { "$date" : 1350426099002 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507dde2b8139d20200000010", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Darwin is trying to understand when this variation occurs: at conception or during development in the womb (for animals)", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "It has been disputed at what period of life the causes of variability,\nwhatever they may be, generally act; whether during the early or late\nperiod of development of the embryo, or at the instant of conception.", "uuid" : "1D0B5B77", "_id" : { "$oid" : "507dde2b8139d20200000010" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 22571, "end" : "/div[1]", "endOffset" : 22782, "_id" : { "$oid" : "507dde2b8139d20200000011" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350426155448 }, "created" : { "$date" : 1350426155448 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507dde3ad9b47d0200000010", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Frost at Midnight-Coleridge.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "the only unquiet thing", "uuid" : "E86240FD", "_id" : { "$oid" : "507dde3ad9b47d0200000010" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[300]", "startOffset" : 694, "end" : "/div[1]/p[300]", "endOffset" : 717, "_id" : { "$oid" : "507dde3ad9b47d0200000011" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350426170824 }, "created" : { "$date" : 1350426170824 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507dde6ad9b47d0200000012", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "You have sinned and Nature no longer will heal you.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I wept bitterly, and wished that \npeace would revisit my mind only that I might afford them consolation and \nhappiness. But that could not be.", "uuid" : "51A0F779", "_id" : { "$oid" : "507dde6ad9b47d0200000012" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[300]", "startOffset" : 1359, "end" : "/div[1]/p[300]", "endOffset" : 1501, "_id" : { "$oid" : "507dde6ad9b47d0200000013" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350426218179 }, "created" : { "$date" : 1350426218179 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "507ddea3d9b47d0200000014" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1350426275873 }, "groups" : [ "21L.000J" ], "id" : "507ddea3d9b47d0200000014", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "quote" : "although they did not remove my grief, they subdued and tranquillized it", "ranges" : [ { "start" : "/div[1]/p[310]", "startOffset" : 336, "end" : "/div[1]/p[310]", "endOffset" : 409, "_id" : { "$oid" : "507ddea3d9b47d0200000015" } } ], "tags" : [], "text" : "That is all that can happen. To be healed, ah Nevermore!", "updated" : { "$date" : 1350426297985 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "uuid" : "AE8F1723" } -{ "__v" : 0, "_id" : { "$oid" : "507ddebdd9b47d0200000016" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1350426301875 }, "groups" : [ "21L.448J" ], "id" : "507ddebdd9b47d0200000016", "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "quote" : "Several reasons make me believe in this; but the chief\none is the remarkable effect which confinement or cultivation has on the\nfunction of the reproductive system; this system appearing to be far more\nsusceptible than any other part of the organisation, to the action of any\nchange in the conditions of life.", "ranges" : [ { "start" : "/div[1]", "startOffset" : 23174, "end" : "/div[1]", "endOffset" : 23483, "_id" : { "$oid" : "507ddebdd9b47d0200000017" } } ], "tags" : [], "text" : "The reproductive system and rate of reproduction seems to be the most susceptible to change in an organisms environment. Some animals and plants do not mate or seed once placed in captivity, while others will continue to reproduce just fine", "updated" : { "$date" : 1350426347109 }, "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "user" : "mpd91@mit.edu", "username" : "Michael D.", "uuid" : "B8ECC60E" } -{ "__v" : 1, "_id" : { "$oid" : "507ddee78139d20200000012" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1350426343808 }, "groups" : [ "21L.000J" ], "id" : "507ddee78139d20200000012", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "quote" : "I remembered the effect that the \nview of the tremendous and ever-moving glacier had produced upon my mind when I \nfirst saw it. It had then filled me with a sublime ecstasy that gave wings to \nthe soul, and allowed it to soar from the obscure world to light and joy.", "ranges" : [ { "start" : "/div[1]/p[311]", "startOffset" : 589, "end" : "/div[1]/p[311]", "endOffset" : 857, "_id" : { "$oid" : "508822c92d29030200000005" } } ], "tags" : [], "text" : "No interested unborrowed form the eye.", "updated" : { "$date" : 1351099081646 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "uuid" : "75733E69" } -{ "id" : "507ddf3b8139d20200000014", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "There are some random, invisible factors that affect the way organisms vary in new generations", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Seedlings from the same fruit, and the young of the same litter, sometimes\ndiffer considerably from each other, though both the young and the parents,\nas Müller has remarked, have apparently been exposed to exactly the same\nconditions of life; and this shows how unimportant the direct effects of\nthe conditions of life are in comparison with the laws of reproduction, of\ngrowth, and of inheritance; for had the action of the conditions been\ndirect, if any of the young had varied, all would probably have varied in\nthe same manner.", "uuid" : "EB54999C", "_id" : { "$oid" : "507ddf3b8139d20200000014" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 26821, "end" : "/div[1]", "endOffset" : 27353, "_id" : { "$oid" : "507ddf3b8139d20200000015" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350426427572 }, "created" : { "$date" : 1350426427572 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507ddf9bd9b47d0200000018", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Development of the idea that changes in organisms happen to achieve a purpose", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "In animals it has a\nmore marked effect; for instance, I find in the domestic duck that the\nbones of the wing weigh less and the bones of the leg more, in proportion\nto the whole skeleton, than do the same bones in the wild-duck; and I\npresume that this change may be safely attributed to the domestic duck\nflying much less, and walking more, than its wild parent.", "uuid" : "02D6849D", "_id" : { "$oid" : "507ddf9bd9b47d0200000018" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 28401, "end" : "/div[1]", "endOffset" : 28764, "_id" : { "$oid" : "507ddf9bd9b47d0200000019" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350426523209 }, "created" : { "$date" : 1350426523209 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507ddfc8d9b47d020000001a", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Another interesting example of the way in which animals have adapted for life in domestication", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Not a single\ndomestic animal can be named which has not in some country drooping ears;\nand the view suggested by some authors, that the drooping is due to the\ndisuse of the muscles of the ear, from the animals not being much alarmed\nby danger, seems probable.", "uuid" : "AECA73AC", "_id" : { "$oid" : "507ddfc8d9b47d020000001a" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 28987, "end" : "/div[1]", "endOffset" : 29247, "_id" : { "$oid" : "507ddfc8d9b47d020000001b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350426568327 }, "created" : { "$date" : 1350426568327 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507de0c0d9b47d020000001c", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Changing the embryo will cause changes in the mature animal", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Any change in the embryo or larva\nwill almost certainly entail changes in the mature animal.", "uuid" : "44BD5E08", "_id" : { "$oid" : "507de0c0d9b47d020000001c" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 29437, "end" : "/div[1]", "endOffset" : 29529, "_id" : { "$oid" : "507de0c0d9b47d020000001d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350426816633 }, "created" : { "$date" : 1350426816633 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507de16ed9b47d020000001e", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Darwin understands that there are some traits which can appear randomly, but then be passed on genetically.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "When any deviation of structure\noften appears, and we see it in the {13} father and child, we cannot tell\nwhether it may not be due to the same cause having acted on both; but when\namongst individuals, apparently exposed to the same conditions, any very\nrare deviation, due to some extraordinary combination of circumstances,\nappears in the parent--say, once amongst several million individuals--and\nit reappears in the child, the mere doctrine of chances almost compels us\nto attribute its reappearance to inheritance.", "uuid" : "7244E6FC", "_id" : { "$oid" : "507de16ed9b47d020000001e" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 31703, "end" : "/div[1]", "endOffset" : 32222, "_id" : { "$oid" : "507de16ed9b47d020000001f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350426990205 }, "created" : { "$date" : 1350426990205 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507de1bbd9b47d0200000020", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "You are likely to inherit traits from your parents, but are then also able to acquire other traits through random changes which are not the result of inheritance", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Perhaps the correct way of viewing the whole\nsubject, would be, to look at the inheritance of every character whatever\nas the rule, and non-inheritance as the anomaly.", "uuid" : "844EF827", "_id" : { "$oid" : "507de1bbd9b47d0200000020" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 32497, "end" : "/div[1]", "endOffset" : 32664, "_id" : { "$oid" : "507de1bbd9b47d0200000021" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350427067678 }, "created" : { "$date" : 1350427067678 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507de21c8139d20200000016", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "These are the results of genes and they way genes are combined in new offspring, which is a concept that was not yet understood in Darwin's time", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "The laws governing inheritance are quite unknown; no one can say why a\npeculiarity in different individuals of the same species, or in individuals\nof different species, is sometimes inherited and sometimes not so; why the\nchild often reverts in certain characters to its grandfather or grandmother\nor other more remote ancestor; why a peculiarity is often transmitted from\none sex to both sexes, or to one sex alone, more commonly but not\nexclusively to the like sex. It is a fact of some little importance to us,\nthat peculiarities appearing in the males of our domestic breeds are often\ntransmitted either exclusively, or in a much greater degree, to males\nalone.", "uuid" : "42D79227", "_id" : { "$oid" : "507de21c8139d20200000016" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 32666, "end" : "/div[1]", "endOffset" : 33331, "_id" : { "$oid" : "507de21c8139d20200000017" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350427164297 }, "created" : { "$date" : 1350427164297 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e01548139d20200000018", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Darwin here refers to changes within a generation, perhaps--that woodpeckers, for example, do not get their beak from prolonged pecking at bark per se.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : ". In one very limited sense, as we shall hereafter see, this may\nbe true; but it is preposterous to attribute to mere external conditions,\nthe structure, for instance, of the woodpecker, with its feet, tail, beak,\nand tongue, so admirably adapted to catch insects under the bark of trees.\nIn the case of the misseltoe, which draws its nourishment from certain\ntrees, which has seeds that must be transported by certain birds, and which\nhas flowers with separate sexes absolutely requiring the agency of certain\ninsects to bring pollen from one flower to the other, it is equally\npreposterous to account for the structure of this parasite, with its\nrelations to several distinct organic beings, by the effects of external\nconditions, or of habit, or of the volition of the plant itself.", "uuid" : "5EF5DEF7", "_id" : { "$oid" : "507e01548139d20200000018" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 14507, "end" : "/div[1]", "endOffset" : 15293, "_id" : { "$oid" : "507e01548139d20200000019" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350435156366 }, "created" : { "$date" : 1350435156366 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e0cd98139d2020000001a", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "variable beings--this is novel, especially with respect to Voltaire's tragically static beings.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "No case is on record of a\nvariable being ceasing to be variable under cultivation.", "uuid" : "3A6AA46B", "_id" : { "$oid" : "507e0cd98139d2020000001a" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 22321, "end" : "/div[1]", "endOffset" : 22403, "_id" : { "$oid" : "507e0cd98139d2020000001b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350438105566 }, "created" : { "$date" : 1350438105566 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e0d678139d2020000001c", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "...something like that. This is before any gene theories, or even Mendel's work into heredity (which wasn't even popular until years after the fact).", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "But I am strongly inclined\nto suspect that the most frequent cause of variability may be attributed to\nthe male and female reproductive elements having been affected prior to the\nact of conception. Several reasons make me believe in this; but the chief\none is the remarkable effect which confinement or cultivation has on the\nfunction of the reproductive system; this system appearing to be far more\nsusceptible than any other part of the organisation, to the action of any\nchange in the conditions of life. Nothing is more easy than to tame an\nanimal, and few things more difficult than to get it to breed freely under\nconfinement, even in the many cases when the male and female unite. How\nmany animals there are which will not breed, though living long under not\nvery close confinement in their native country!", "uuid" : "25E34CBE", "_id" : { "$oid" : "507e0d678139d2020000001c" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 22976, "end" : "/div[1]", "endOffset" : 23789, "_id" : { "$oid" : "507e0d678139d2020000001d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350438247236 }, "created" : { "$date" : 1350438247236 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "507e0dabd9b47d0200000022" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1350438315951 }, "groups" : [ "21L.448J" ], "id" : "507e0dabd9b47d0200000022", "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "quote" : "Sterility has been said to be the bane of horticulture; but on this view we\nowe variability to the same cause which produces sterility; and variability\nis the source of all the choicest productions of the garden. I may add,\nthat as some organisms will breed freely under the most unnatural\nconditions (for instance, the rabbit and ferret kept in hutches), showing\nthat their reproductive system has not been thus affected; so will some\nanimals and plants withstand domestication or cultivation, and vary very\nslightly--perhaps hardly more than in a state of nature.", "ranges" : [ { "start" : "/div[1]", "startOffset" : 25281, "end" : "/div[1]", "endOffset" : 25847, "_id" : { "$oid" : "507e0dabd9b47d0200000023" } } ], "tags" : [], "text" : "objective evolution. We're throwing teleology out of the window, finally.", "updated" : { "$date" : 1350438327135 }, "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "uuid" : "683938DE" } -{ "id" : "507e0f998139d2020000001e", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "genetic drift?", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "These\n\"sports\" are extremely rare under nature, but far from rare under\ncultivation; and in this case we see that the treatment of the parent has\naffected a bud or offset, and not the ovules or pollen. But it is the\nopinion of most physiologists that there is no essential difference between\na bud and an ovule in their earliest stages of formation; so that, in fact,\n\"sports\" support my view, that variability may be largely attributed to the\novules or pollen, or to both, having been affected by the treatment of the\nparent prior to the act of conception.", "uuid" : "9C89A107", "_id" : { "$oid" : "507e0f998139d2020000001e" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 26134, "end" : "/div[1]", "endOffset" : 26691, "_id" : { "$oid" : "507e0f998139d2020000001f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350438809772 }, "created" : { "$date" : 1350438809772 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e0fe88139d20200000020", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "There is no mechanism here--he acknowledges above that it's not \"purpose\" per se that drives variation, but then what?", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Habit also has a decided influence, as in the period of flowering with\nplants when transported from one climate to another. In animals it has a\nmore marked effect; for instance, I find in the domestic duck that the\nbones of the wing weigh less and the bones of the leg more, in proportion\nto the whole skeleton, than do the same bones in the wild-duck; and I\npresume that this change may be safely attributed to the domestic duck\nflying much less, and walking more, than its wild parent. The great and\ninherited development of the udders in cows and goats in countries where\nthey are habitually milked, in comparison with the state of these organs in\nother countries, is another instance of the effect of use. Not a single\ndomestic animal can be named which has not in some country drooping ears;\nand the view suggested by some authors, that the drooping is due to the\ndisuse of the muscles of the ear, from the animals not being much alarmed\nby danger, seems probable.", "uuid" : "E55CA57A", "_id" : { "$oid" : "507e0fe88139d20200000020" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 28277, "end" : "/div[1]", "endOffset" : 29247, "_id" : { "$oid" : "507e0fe88139d20200000021" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350438888441 }, "created" : { "$date" : 1350438888441 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e10268139d20200000022", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "Correlation of growth--gene linkage, genes that control multiple phenotypes, etc. If only Darwin had genes at his disposal.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "cats with blue eyes are invariably deaf; colour\nand constitutional peculiarities go together, of which many remarkable\ncases could be given amongst animals and plants. From the facts collected\nby Heusinger, it appears that white sheep and pigs are differently affected\nfrom coloured individuals by certain vegetable poisons. Hairless dogs have\nimperfect teeth: long-haired and coarse-haired animals are apt to have, as\nis asserted, long or many horns; pigeons with feathered feet have skin\nbetween their outer toes; pigeons with short beaks have small feet, and\nthose with long beaks large feet. Hence, if man goes on selecting, and thus\naugmenting, any peculiarity, he will almost certainly unconsciously modify\nother parts of the structure, owing to the mysterious laws of the\ncorrelation of growth.", "uuid" : "52961741", "_id" : { "$oid" : "507e10268139d20200000022" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 29849, "end" : "/div[1]", "endOffset" : 30651, "_id" : { "$oid" : "507e10268139d20200000023" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350438950871 }, "created" : { "$date" : 1350438950871 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e1186d9b47d0200000024", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "text" : "variation producing species--again novel. Now we have proposed that 1) species are not static, and 2) species can diverge.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "When we attempt to estimate the amount of structural difference between the\ndomestic races of the same species, we are soon involved in doubt, from not\nknowing whether they have descended from one or several parent-species.\nThis point, if it could be cleared up, would be interesting; if, for\ninstance, it could be shown that the greyhound, bloodhound, terrier,\nspaniel, and bull-dog, which we all know propagate their kind so truly,\nwere the {17} offspring of any single species, then such facts would have\ngreat weight in making us doubt about the immutability of the many very\nclosely allied natural species--for instance, of the many foxes--inhabiting\ndifferent quarters of the world. I do not believe, as we shall presently\nsee, that the whole amount of difference between the several breeds of the\ndog has been produced under domestication; I believe that some small part\nof the difference is due to their being descended from distinct species. In\nthe case of some other domesticated species, there is presumptive, or even\nstrong evidence, that all the breeds have descended from a single wild\nstock.", "uuid" : "3CA500CB", "_id" : { "$oid" : "507e1186d9b47d0200000024" }, "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 38951, "end" : "/div[1]", "endOffset" : 40058, "_id" : { "$oid" : "507e1186d9b47d0200000025" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350439302850 }, "created" : { "$date" : 1350439302850 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "507e141f8139d20200000024" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1350439967951 }, "groups" : [ "21L.448J" ], "id" : "507e141f8139d20200000024", "permissions" : { "delete" : [ "vvachh@mit.edu" ], "update" : [ "vvachh@mit.edu" ], "admin" : [ "vvachh@mit.edu" ], "read" : [] }, "quote" : "The\noffspring, also, will thus have a better chance of surviving, for, of the\nmany individuals of any species which are periodically born, but a small\nnumber can survive. I have called this principle, by which each slight\nvariation, if useful, is preserved, by the term of Natural Selection, in\norder to mark its relation to man's power of selection.", "ranges" : [ { "start" : "/div[1]", "startOffset" : 123381, "end" : "/div[1]", "endOffset" : 123731, "_id" : { "$oid" : "507e141f8139d20200000025" } } ], "tags" : [], "text" : "Here's the mechanism finally. And it's free of teleology", "updated" : { "$date" : 1350439977101 }, "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "user" : "vvachh@mit.edu", "username" : "Vipul V.", "uuid" : "21364A02" } -{ "id" : "507e1d7f8139d20200000026", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Did different dogs descend from one ancestor or different, yet similar ancestors/", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "I believe that some small part\nof the difference is due to their being descended from distinct species. In\nthe case of some other domesticated species, there is presumptive, or even\nstrong evidence, that all the breeds have descended from a single wild\nstock.", "uuid" : "2E8D8004", "_id" : { "$oid" : "507e1d7f8139d20200000026" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 39798, "end" : "/div[1]", "endOffset" : 40058, "_id" : { "$oid" : "507e1d7f8139d20200000027" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350442367814 }, "created" : { "$date" : 1350442367814 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e23aed9b47d0200000026", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "He started as a naturalist according to the opening sentence (on the ship). What caused his change, how does his view differ.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Naturalists continually refer to external\nconditions, such as climate, food, &c., as the only possible cause of\nvariation.", "uuid" : "FB3F2793", "_id" : { "$oid" : "507e23aed9b47d0200000026" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 14386, "end" : "/div[1]", "endOffset" : 14509, "_id" : { "$oid" : "507e23aed9b47d0200000027" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350443950230 }, "created" : { "$date" : 1350443950230 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e24568139d20200000028", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "Why domesticated? Because they are easy to watch between generations, because we don't see much variation? Do we see variation?", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "careful study of domesticated\nanimals and of cultivated plants would offer the best chance of making out\nthis obscure problem", "uuid" : "CA033075", "_id" : { "$oid" : "507e24568139d20200000028" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 15939, "end" : "/div[1]", "endOffset" : 16064, "_id" : { "$oid" : "507e24568139d20200000029" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350444118026 }, "created" : { "$date" : 1350444118026 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e25eed9b47d0200000028", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "How long was he in south america for?", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "in 1837", "uuid" : "59D23880", "_id" : { "$oid" : "507e25eed9b47d0200000028" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 10802, "end" : "/div[1]", "endOffset" : 10809, "_id" : { "$oid" : "507e25eed9b47d0200000029" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350444526958 }, "created" : { "$date" : 1350444526958 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e28c5d9b47d020000002a", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Darwin seems to acknowledge the potential controversy around his following claims. How significantly did his opinions contrast with esetablished societal plans?", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "No doubt\nerrors will have crept in, though I hope I have always been cautious in\ntrusting to good authorities alone.", "uuid" : "A26D5838", "_id" : { "$oid" : "507e28c5d9b47d020000002a" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 12451, "end" : "/div[1]", "endOffset" : 12567, "_id" : { "$oid" : "507e28c5d9b47d020000002b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350445253984 }, "created" : { "$date" : 1350445253984 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e2d568139d2020000002a", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "A well though-out argumentation. he begins his argument by pointing out flaws in the currently proposed hypotheses", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Naturalists continually refer to external\nconditions, such as climate, food, &c., as the only possible cause of\nvariation. In one very limited sense, as we shall hereafter see, this may\nbe true; but it is preposterous to attribute to mere external conditions,\nthe structure, for instance, of the woodpecker, with its feet, tail, beak,\nand tongue, so admirably adapted to catch insects under the bark of trees.\nIn the case of the misseltoe, which draws its nourishment from certain\ntrees, which has seeds that must be transported by certain birds, and which\nhas flowers with separate sexes absolutely requiring the agency of certain\ninsects to bring pollen from one flower to the other, it is equally\npreposterous to account for the structure of this parasite, with its\nrelations to several distinct organic beings, by the effects of external\nconditions, or of habit, or of the volition of the plant itself.", "uuid" : "1084C3FA", "_id" : { "$oid" : "507e2d568139d2020000002a" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 14386, "end" : "/div[1]", "endOffset" : 15293, "_id" : { "$oid" : "507e2d568139d2020000002b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350446422066 }, "created" : { "$date" : 1350446422066 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e2e13d9b47d020000002c", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Darwin seems confident that the notion of modification and adapation has been well-established. he doesn't seem to spend too much efffort to demonstrate those", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "the means of modification and coadaptation", "uuid" : "78452B84", "_id" : { "$oid" : "507e2e13d9b47d020000002c" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 15824, "end" : "/div[1]", "endOffset" : 15866, "_id" : { "$oid" : "507e2e13d9b47d020000002d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350446611639 }, "created" : { "$date" : 1350446611639 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e2e668139d2020000002c", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "Here they discuss the use of plastic like the material. It is something we engineer, and that varies. It can be shaped and molded to model almost anything.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Breeders habitually speak of an animal's organisation as\nsomething quite plastic, which they can model almost as they please.", "uuid" : "51A1BDA7", "_id" : { "$oid" : "507e2e668139d2020000002c" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 66354, "end" : "/div[1]", "endOffset" : 66479, "_id" : { "$oid" : "507e2e668139d2020000002d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350446694041 }, "created" : { "$date" : 1350446694041 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e2f1ad9b47d020000002e", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "Selection, Change and later Power capitalized here. Darwin talks on natural selection often, and that was pretty much my understanding of his works prior to the course. Now reading I find it interesting that he thinks the change as more methodically selected (less random, more shaped toward a purpose)", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Over all these causes of Change I am convinced that the accumulative action\nof Selection", "uuid" : "359BFA3C", "_id" : { "$oid" : "507e2f1ad9b47d020000002e" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 90644, "end" : "/div[1]", "endOffset" : 90732, "_id" : { "$oid" : "507e2f1ad9b47d020000002f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350446874020 }, "created" : { "$date" : 1350446874020 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e3087d9b47d0200000030", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Darwin seems very cautious about being firm in the presentation of his ideas", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Although much remains obscure,\nand will long remain obscure, I can entertain no doubt, after the most\ndeliberate study and dispassionate judgment of which I am capable, that the\nview which most naturalists entertain, and which I formerly\nentertained--namely, that each species has been independently created--is\nerroneous.", "uuid" : "5B3DA7EA", "_id" : { "$oid" : "507e3087d9b47d0200000030" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 19867, "end" : "/div[1]", "endOffset" : 20190, "_id" : { "$oid" : "507e3087d9b47d0200000031" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350447239804 }, "created" : { "$date" : 1350447239804 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e323f8139d2020000002e", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Variety vs Species. Genus and species are used to refer to a specific plant. A variety is a plant that is similar to a particular species, but the differences are not as insignificant as the differences in a form", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Hence, in determining whether a form should be ranked as a species or a\nvariety, the opinion of naturalists having sound judgment and wide\nexperience seems the only guide to follow.", "uuid" : "E9A13E7A", "_id" : { "$oid" : "507e323f8139d2020000002e" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 97905, "end" : "/div[1]", "endOffset" : 98086, "_id" : { "$oid" : "507e323f8139d2020000002f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350447679828 }, "created" : { "$date" : 1350447679828 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e32e9d9b47d0200000032", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "Here is one point of problem with association with variation and Species, Everything varies slightly, that does not determine a new species.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "we have many slight differences which may be called individual\ndifferences, such as are known frequently to appear in the offspring from\nthe same parents", "uuid" : "59A8EC78", "_id" : { "$oid" : "507e32e9d9b47d0200000032" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 92893, "end" : "/div[1]", "endOffset" : 93046, "_id" : { "$oid" : "507e32e9d9b47d0200000033" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350447849095 }, "created" : { "$date" : 1350447849095 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e334f8139d20200000030", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "change is slow", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "It seems\npretty clear that organic beings must be exposed during several generations\nto the new conditions of life to cause any appreciable amount of variation", "uuid" : "729B38C4", "_id" : { "$oid" : "507e334f8139d20200000030" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 22047, "end" : "/div[1]", "endOffset" : 22207, "_id" : { "$oid" : "507e334f8139d20200000031" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350447951521 }, "created" : { "$date" : 1350447951521 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e33ca8139d20200000032", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "change is constant", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Our oldest\ncultivated plants, such as wheat, still often yield new varieties: our\noldest domesticated animals are still capable of rapid improvement or\nmodification.", "uuid" : "4324B051", "_id" : { "$oid" : "507e33ca8139d20200000032" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 22404, "end" : "/div[1]", "endOffset" : 22570, "_id" : { "$oid" : "507e33ca8139d20200000033" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350448074356 }, "created" : { "$date" : 1350448074356 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e36618139d20200000034", "user" : "sheilaxu@mit.edu", "username" : "Sheila X.", "text" : "Just want to point out that the Mendelian Laws of Inheritance isn't known at that time yet, so Darwin doesn't know the exacts of the laws...but it appears that Darwin makes very good observation about inherited traits that fits with the Mendelian Laws of Inheritance. ", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "The laws governing inheritance are quite unknown; no one can say why a\npeculiarity in different individuals of the same species, or in individuals\nof different species, is sometimes inherited and sometimes not so; why the\nchild often reverts in certain characters to its grandfather or grandmother\nor other more remote ancestor; why a peculiarity is often transmitted from\none sex to both sexes, or to one sex alone, more commonly but not\nexclusively to the like sex.", "uuid" : "66AE41B2", "_id" : { "$oid" : "507e36618139d20200000034" }, "permissions" : { "delete" : [ "sheilaxu@mit.edu" ], "update" : [ "sheilaxu@mit.edu" ], "admin" : [ "sheilaxu@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 32666, "end" : "/div[1]", "endOffset" : 33133, "_id" : { "$oid" : "507e36618139d20200000035" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350448737987 }, "created" : { "$date" : 1350448737987 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e380cd9b47d0200000034", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "It is curious that Darwin has reached these conclusions, even though the immediate differences between a parent generation and its offspring are unnoticeable", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "and tends to depart in\nsome small degree from that of the parental type.", "uuid" : "0A5A69FD", "_id" : { "$oid" : "507e380cd9b47d0200000034" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 31139, "end" : "/div[1]", "endOffset" : 31212, "_id" : { "$oid" : "507e380cd9b47d0200000035" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350449164847 }, "created" : { "$date" : 1350449164847 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e38fcd9b47d0200000036", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "darwin is quick to conclude that environmental factors are unimportant", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Any variation which is not inherited is unimportant for us", "uuid" : "997C957F", "_id" : { "$oid" : "507e38fcd9b47d0200000036" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 31213, "end" : "/div[1]", "endOffset" : 31271, "_id" : { "$oid" : "507e38fcd9b47d0200000037" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350449404270 }, "created" : { "$date" : 1350449404270 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e3b348139d20200000036", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Is there a logical connection between human domesitcated organisms and all wild plants?", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "It has often been assumed that man has chosen for domestication animals and\nplants having an extraordinary inherent tendency to vary, and likewise to\nwithstand diverse climates. I do not dispute that these capacities have\nadded largely to the value of most of our domesticated productions; but how\ncould a savage possibly know, when he first tamed an animal, whether it\nwould vary in succeeding generations, and whether it would endure other\nclimates? Has the little variability of the ass or guinea-fowl, or the\nsmall power of endurance of warmth by the reindeer, or of cold by the\ncommon camel, prevented their domestication? I cannot doubt that if other\nanimals and plants, equal in number to our domesticated productions, and\nbelonging to equally diverse classes and countries, were taken from a state\nof nature, and could be made to breed for an equal number of generations\nunder domestication, they would vary on an average as largely as the parent\nspecies of our existing domesticated productions have varied.", "uuid" : "BBDD1B2C", "_id" : { "$oid" : "507e3b348139d20200000036" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 40059, "end" : "/div[1]", "endOffset" : 41075, "_id" : { "$oid" : "507e3b348139d20200000037" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350449972685 }, "created" : { "$date" : 1350449972685 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e477dd9b47d0200000038", "user" : "sheilaxu@mit.edu", "username" : "Sheila X.", "text" : "Darwin here is making an observation that breeders are able to change the animals into any way they want the animal to become--->selecting for desirable traits...as if they were able to mold those animals into desirable animals..hence the use of the word \"plastic\" to indicate the the wide-ranging possibilities for variability of traits ibreeders can select for n the animals.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Breeders habitually speak of an animal's organisation as\nsomething quite plastic, which they can model almost as they please.", "uuid" : "12A1EB0D", "_id" : { "$oid" : "507e477dd9b47d0200000038" }, "permissions" : { "delete" : [ "sheilaxu@mit.edu" ], "update" : [ "sheilaxu@mit.edu" ], "admin" : [ "sheilaxu@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 66354, "end" : "/div[1]", "endOffset" : 66479, "_id" : { "$oid" : "507e477dd9b47d0200000039" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350453117243 }, "created" : { "$date" : 1350453117243 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e48d3d9b47d020000003a", "user" : "sheilaxu@mit.edu", "username" : "Sheila X.", "text" : "This particularly highlights how the naturalists were struggling to identify if a particular organism exhibits traits that would be considered a variety of a species or a species in its own right...especially if the organism look similar to each other. I am guessing that \"species\" implies that everybody look like each other, but \"variability\" would mean that there is a diversity in traits amongst similar-looking organism...in fact, a species can have variability! It would seem that those two concepts would conflict with each other", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : ". Practically, when a naturalist can\nunite two forms together by others having intermediate characters, he\ntreats the one as a variety of the other, ranking the most common, but\nsometimes the one first described, as the species, and the other as the\nvariety. But cases of great difficulty, which I will not here enumerate,\nsometimes occur in deciding whether or not to rank one form as a variety of\nanother, even when they are closely connected by intermediate links; nor\nwill the commonly-assumed hybrid nature of the intermediate links always\nremove the difficulty.", "uuid" : "AD965DAB", "_id" : { "$oid" : "507e48d3d9b47d020000003a" }, "permissions" : { "delete" : [ "sheilaxu@mit.edu" ], "update" : [ "sheilaxu@mit.edu" ], "admin" : [ "sheilaxu@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 97011, "end" : "/div[1]", "endOffset" : 97578, "_id" : { "$oid" : "507e48d3d9b47d020000003b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350453459020 }, "created" : { "$date" : 1350453459020 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507e4c868139d20200000038", "user" : "alex93@mit.edu", "username" : "Alexander O.", "text" : "Here, Darwin takes Malthus's idea of humans and applies it to nature as a whole.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "This is the\ndoctrine of Malthus, applied to the whole animal and vegetable kingdoms.", "uuid" : "20721CDE", "_id" : { "$oid" : "507e4c868139d20200000038" }, "permissions" : { "delete" : [ "alex93@mit.edu" ], "update" : [ "alex93@mit.edu" ], "admin" : [ "alex93@mit.edu" ], "read" : [ "alex93@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 17271, "end" : "/div[1]", "endOffset" : 17355, "_id" : { "$oid" : "507e4c868139d20200000039" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350454406694 }, "created" : { "$date" : 1350454406694 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507ea2646dced90200000002", "user" : "alex93@mit.edu", "username" : "Alexander O.", "text" : "Darwin often gives examples of evolution and gives credit to similar thinkers. This raises the reliability of his argument and makes it appear less radical.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Van Mons, in his treatise\non pears and apples, shows how utterly he disbelieves that the several\nsorts, for instance a Ribston-pippin or Codlin-apple, could ever have\nproceeded from the seeds of the same tree.", "uuid" : "994842FD", "_id" : { "$oid" : "507ea2646dced90200000002" }, "permissions" : { "delete" : [ "alex93@mit.edu" ], "update" : [ "alex93@mit.edu" ], "admin" : [ "alex93@mit.edu" ], "read" : [ "alex93@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 62697, "end" : "/div[1]", "endOffset" : 62906, "_id" : { "$oid" : "507ea2646dced90200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350476388255 }, "created" : { "$date" : 1350476388255 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507ea99a6dced90200000004", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "What is darwin's rationalization here?", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "from reasons which I cannot give here", "uuid" : "D4A67FAE", "_id" : { "$oid" : "507ea99a6dced90200000004" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 43089, "end" : "/div[1]", "endOffset" : 43126, "_id" : { "$oid" : "507ea99a6dced90200000005" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350478234079 }, "created" : { "$date" : 1350478234079 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507eaaa06dced90200000006", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Darwin seems to have independently come up with Gregor Mendel's observations", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "extremely uniform, and everything seems simple enough; but\nwhen these mongrels are crossed one with another for several generations,\nhardly two of them will be alike,", "uuid" : "6A97C5B0", "_id" : { "$oid" : "507eaaa06dced90200000006" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 46100, "end" : "/div[1]", "endOffset" : 46266, "_id" : { "$oid" : "507eaaa06dced90200000007" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350478496764 }, "created" : { "$date" : 1350478496764 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507eb2844da92c0200000002", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Darwin fails to offer a mechanism for how this \"reversion\" might work. In the sense of evolutionary pressures, what type of pressure would favor a reversion to ancestral state?", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "for instance, I crossed some uniformly white\nfantails with some uniformly black barbs, and they produced mottled brown\nand black birds; these I again crossed together, and one grandchild of the\npure white fantail and pure black barb was of as beautiful a blue colour,\nwith the white rump, double black wing-bar, and barred and white-edged\ntail-feathers, as any wild rock-pigeon!", "uuid" : "333F472B", "_id" : { "$oid" : "507eb2844da92c0200000002" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 55749, "end" : "/div[1]", "endOffset" : 56127, "_id" : { "$oid" : "507eb2844da92c0200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350480516197 }, "created" : { "$date" : 1350480516197 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507eb51a4da92c0200000004", "user" : "yuqingz@mit.edu", "username" : "Yuqing Z.", "text" : "Darwin grasps the idea that accumulation of minute changes can lead to large-scale changes", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Thus, a man who intends keeping pointers naturally tries to get\nas good dogs as he can, and afterwards breeds from his own best dogs, but\nhe has no wish or expectation of permanently altering the breed.\nNevertheless I cannot doubt that this process, continued during centuries,", "uuid" : "D4D69CE5", "_id" : { "$oid" : "507eb51a4da92c0200000004" }, "permissions" : { "delete" : [ "yuqingz@mit.edu" ], "update" : [ "yuqingz@mit.edu" ], "admin" : [ "yuqingz@mit.edu" ], "read" : [ "yuqingz@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 73537, "end" : "/div[1]", "endOffset" : 73815, "_id" : { "$oid" : "507eb51a4da92c0200000005" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350481178718 }, "created" : { "$date" : 1350481178718 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507f24206dced9020000000a", "user" : "moverlin@mit.edu", "username" : "Matt O.", "text" : "concerned with her appearance here", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "What gown and what head-dress she should wear on the\n\noccasion became her chief concern.", "uuid" : "314457F2", "_id" : { "$oid" : "507f24206dced9020000000a" }, "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[313]", "startOffset" : 159, "end" : "/div[1]/p[313]", "endOffset" : 247, "_id" : { "$oid" : "507f24206dced9020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1350509600862 }, "created" : { "$date" : 1350509600862 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507f3b454da92c0200000006", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "This also serves to show Babo's cruelty, somewhat painting him in a negative light. Might actually help the argument that Melville thinks slaves should be free by displaying them as realistic human beings, not just perfect beings.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "however it was, just then the razor drew\nblood, spots of which stained the creamy lather\nunder the throat: immediately the black barber\ndrew back his steel, and, remaining in his professional\nattitude, back to Captain Delano, and\nface to Don Benito, held up the trickling razor,\nsaying, with a sort of half humorous sorrow,\n\"See, master—you shook so—here's Babo's\nfirst blood.\"\n[pg 206]", "uuid" : "F5D926F0", "_id" : { "$oid" : "507f3b454da92c0200000006" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[265]", "startOffset" : 232, "end" : "/div[1]/p[265]/i[1]", "endOffset" : 8, "_id" : { "$oid" : "507f3b454da92c0200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1350515525902 }, "created" : { "$date" : 1350515525902 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507f3b776dced9020000000c", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Shows Babo's power and the role reversal. He is indeed an artist, just a playwright not a sculptor.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "ith other impromptu touches evincing\nthe hand of a master; while, like any resigned\ngentleman in barber's hands, Don Benito bore\nall, much less uneasily, at least than he had\ndone the razoring; indeed, he sat so pale and\nrigid now, that the negro seemed a Nubian\nsculptor finishing off a white statue-head.", "uuid" : "5C8D1D75", "_id" : { "$oid" : "507f3b776dced9020000000c" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[272]", "startOffset" : 195, "end" : "/div[1]/p[272]", "endOffset" : 501, "_id" : { "$oid" : "507f3b776dced9020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1350515575059 }, "created" : { "$date" : 1350515575059 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507f3bb84da92c0200000008", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "This whole scene displays Babo as incredibly intelligent, opposite of what the stereotype would have been. It also displays the change of power that has occured.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "All being over at last, the standard of Spain\nremoved, tumbled up, and tossed back into the\nflag-locker, the negro's warm breath blowing\naway any stray hair, which might have lodged\ndown his master's neck; collar and cravat\nreadjusted; a speck of lint whisked off the\nvelvet lapel; all this being done; backing off\na little space, and pausing with an expression\nof subdued self-complacency, the servant\nfor a moment surveyed his master, as, in\ntoilet at least, the creature of his own tasteful\nhands.", "uuid" : "ECC3410D", "_id" : { "$oid" : "507f3bb84da92c0200000008" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[273]", "startOffset" : 0, "end" : "/div[1]/p[273]", "endOffset" : 500, "_id" : { "$oid" : "507f3bb84da92c0200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1350515640840 }, "created" : { "$date" : 1350515640840 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507f8e7b4da92c020000000a", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "the definition I know is that animals in the same species can produce fertile offspring by mating", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "various definitions which have\nbeen given of the term species. No one definition has as yet satisfied all\nnaturalists", "uuid" : "0454D01F", "_id" : { "$oid" : "507f8e7b4da92c020000000a" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 91683, "end" : "/div[1]", "endOffset" : 91800, "_id" : { "$oid" : "507f8e7b4da92c020000000b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350536827794 }, "created" : { "$date" : 1350536827794 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "507f96d86dced9020000000e", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "the doctrine of Malthus extended to animals", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "In such cases the geometrical\nratio of increase, the result of which never fails to be surprising, simply\nexplains the extraordinarily rapid increase and wide diffusion of\nnaturalised productions in their new homes.", "uuid" : "8CCA24CF", "_id" : { "$oid" : "507f96d86dced9020000000e" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 130598, "end" : "/div[1]", "endOffset" : 130814, "_id" : { "$oid" : "507f96d86dced9020000000f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350538968241 }, "created" : { "$date" : 1350538968241 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5082d90c4097460200000003", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Nature the healer.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I remember the first time I became \ncapable of observing outward objects with any kind of pleasure, I perceived that \nthe fallen leaves had disappeared, and that the young buds were shooting forth \nfrom the trees that shaded my window. It was a divine spring; and the season \ncontributed greatly to my convalescence.", "uuid" : "F5AD187C", "_id" : { "$oid" : "5082d90c4097460200000003" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[179]", "startOffset" : 98, "end" : "/div[1]/p[179]", "endOffset" : 415, "_id" : { "$oid" : "5082d90c4097460200000004" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350752524715 }, "created" : { "$date" : 1350752524715 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "508317872c51360200000002" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1350768519207 }, "groups" : [ "21L.000J" ], "id" : "508317872c51360200000002", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "quote" : "The \nsight of the awful and majestic in nature had indeed always the effect of \nsolemnizing my mind, and causing me to forget the passing cares of life.", "ranges" : [ { "start" : "/div[1]/p[311]", "startOffset" : 858, "end" : "/div[1]/p[311]", "endOffset" : 1010, "_id" : { "$oid" : "508317872c51360200000003" } } ], "tags" : [], "text" : "Exactly like Wordsworth. \" Once again \t\nDo I behold these steep and lofty cliffs, \t\nWhich on a wild secluded scene impress \t\nThoughts of more deep seclusion; and connect \t\nThe landscape with the quiet of the sky.\"", "updated" : { "$date" : 1350768551805 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "uuid" : "C7EEDE18" } -{ "id" : "5084292683a9a40200000002", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "text" : "Variation occurs slowly over a period of time, in small steps not giant leaps", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Hence I look at individual differences, though of small interest to the\nsystematist, as of high importance for us, as being the first step towards\nsuch slight varieties as are barely thought worth recording in works on\nnatural history. And I look at varieties which are in any degree more\ndistinct and permanent, as steps leading to more {52} strongly marked and\nmore permanent varieties; and at these latter, as leading to sub-species,\nand to species.", "uuid" : "BD19F67A", "_id" : { "$oid" : "5084292683a9a40200000002" }, "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [ "jpaggi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 105401, "end" : "/div[1]", "endOffset" : 105853, "_id" : { "$oid" : "5084292783a9a40200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350838566998 }, "created" : { "$date" : 1350838566998 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50843e5a25d3df0200000002", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "text" : "Man's use of selection in breeding is certainly inferior to natural selection in many respects, such as the ability to select for traits that are advantageous in terms of survival. However, I can think of many ways in which human selection is more effective than natural selection: variations are encouraged and spread far more rapidly when treated with the intention of spreading them; breeders work with far more control over a system than nature ever could, deciding which specific dogs to breed, and preventing \"accidental\" breeding which could theoretically occur in nature, provided the animal did not die before maturity; and there is the general benefit of intention on the part of the breeder, who plans what he/she wants to select for, whereas natural selection relies solely on the existence of lethal or less advantageous adaptations to prevent breeding, which means that traits which provide little survival value or cost will not propagate by natural selection.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "and is as\n{62} immeasurably superior to man's feeble efforts, as the works of Nature\nare to those of Art", "uuid" : "A909D1F2", "_id" : { "$oid" : "50843e5a25d3df0200000002" }, "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 124035, "end" : "/div[1]", "endOffset" : 124139, "_id" : { "$oid" : "50843e5a25d3df0200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350843994979 }, "created" : { "$date" : 1350843994979 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50844a1925d3df0200000006", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "text" : "This observation concerns the occupation of various ecological niches by similar (or, in some cases, dissimilar) organisms, as is mentioned a few sentences later (\"We can dimly see why the competition should be most severe between allied forms, which fill nearly the same place in the economy of nature\"). This is a good use of the economy analogy, as the struggle between species or individuals occupying the same niche is very closely related to the struggle between companies or businesses that offer similar services. Just as a business would need to change something in this situation (price, service, or target audience, for example) an organism must adapt. Two companies vying for the same position will either force one another to have lower prices and better services or cause one company to fail and the other succeed, such that only on survives. The same is true for organic organisms; either they compensate so that the population of each species is of a size that is small enough to be maintained by the available resources and large enough to continue as a species, or one species adapts to another niche or dies out, leaving the other to occupy the disputed niche.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "As species of the same genus have usually, though by no means invariably,\nsome similarity in habits and constitution, and always in structure, the\nstruggle will generally be more severe between species of the same genus,\nwhen they come into competition with each other, than between species of\ndistinct genera", "uuid" : "4FDCC3E6", "_id" : { "$oid" : "50844a1925d3df0200000006" }, "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 151005, "end" : "/div[1]", "endOffset" : 151314, "_id" : { "$oid" : "50844a1925d3df0200000007" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350847001420 }, "created" : { "$date" : 1350847001420 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50844cff25d3df0200000008", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "text" : "Smith's idea of an economy in which the majority is benefited by individual self-interest fails in a Darwinian economy. It is true that self-interest is necessary in order to survive, as selection would favor those that are working for their own survival over those that concern themselves with the survival of others, but it is not necessarily true that more opportunity would arise due to individuals acting in their interest. It is more likely that the opposite would happen, as what is in one person's favor is harmful to the opportunities of their competitor. When competition is involved, anything done with self-interest in mind is harmful to someone else, and unless it is met with the same self-interest one group will not survive the competition.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "the economy of nature", "uuid" : "0341378B", "_id" : { "$oid" : "50844cff25d3df0200000008" }, "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 151956, "end" : "/div[1]", "endOffset" : 151977, "_id" : { "$oid" : "50844cff25d3df0200000009" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350847743654 }, "created" : { "$date" : 1350847743654 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508453bb83a9a40200000006", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "text" : "The crux of natural selection", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Owing to this struggle for life, any variation, however slight,\nand from whatever cause proceeding, if it be in any degree profitable to an\nindividual of any species, in its infinitely complex relations to other\norganic beings and to external nature, will tend to the preservation of\nthat individual, and will generally be inherited by its offspring.", "uuid" : "8AE61987", "_id" : { "$oid" : "508453bb83a9a40200000006" }, "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [ "jpaggi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 123030, "end" : "/div[1]", "endOffset" : 123380, "_id" : { "$oid" : "508453bb83a9a40200000007" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350849467837 }, "created" : { "$date" : 1350849467837 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508459bb25d3df020000000a", "user" : "jpaggi@mit.edu", "username" : "Joseph P.", "text" : "niche", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "which fill nearly the same place in\nthe economy of nature", "uuid" : "BF88473A", "_id" : { "$oid" : "508459bb25d3df020000000a" }, "permissions" : { "delete" : [ "jpaggi@mit.edu" ], "update" : [ "jpaggi@mit.edu" ], "admin" : [ "jpaggi@mit.edu" ], "read" : [ "jpaggi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 151920, "end" : "/div[1]", "endOffset" : 151977, "_id" : { "$oid" : "508459bb25d3df020000000b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350851003838 }, "created" : { "$date" : 1350851003838 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "508467c725d3df020000000c" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1350854599401 }, "groups" : [ "21L.003" ], "id" : "508467c725d3df020000000c", "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "quote" : "This pale crescent was “the likeness of a kingly \ncrown;” what it diademed was “the shape which shape \nhad none.", "ranges" : [ { "start" : "/div[1]/div[15]/p[108]", "startOffset" : 745, "end" : "/div[1]/div[15]/p[108]", "endOffset" : 859, "_id" : { "$oid" : "50984152ab5e720200000004" } } ], "tags" : [], "text" : "Reference to what death looks like in Paradise Lost at the gates of hell. (PL BK II, ll. 666,672-3)", "updated" : { "$date" : 1352155474792 }, "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "user" : "slonaker@mit.edu", "username" : "James S.", "uuid" : "06AD09DC" } -{ "__v" : 0, "_id" : { "$oid" : "508499d383a9a40200000008" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1350867411200 }, "groups" : [ "21L.448J" ], "id" : "508499d383a9a40200000008", "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "quote" : "Hence, also, we can see that when a plant or animal is placed in a new\ncountry amongst new competitors, though the climate may be exactly the same\nas in its former home, yet the conditions of its life will generally be\nchanged in an essential manner. If we wished to increase its average\nnumbers in its new home, we should have to modify it in a different way to\nwhat we should have done in its native country; for we should have to give\nit some advantage over a different set of competitors or enemies.", "ranges" : [ { "start" : "/div[1]", "startOffset" : 154722, "end" : "/div[1]", "endOffset" : 155225, "_id" : { "$oid" : "508499d383a9a40200000009" } } ], "tags" : [], "text" : "Often, species introduced to a new environment thrive and dominate local organisms to such a degree that they even cause extinctions in some cases. An example I know of is how cats have caused the extinction of a number of bird species in Australia.", "updated" : { "$date" : 1350880163131 }, "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "user" : "mkel@mit.edu", "username" : "Michael K.", "uuid" : "2D94973E" } -{ "id" : "50849afe83a9a4020000000a", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "example: whether the ear lobe is attached to your head or not", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Variations neither useful nor injurious would not be affected by\nnatural selection, and would be left a fluctuating element, as perhaps we\nsee in the species called polymorphic.", "uuid" : "2D13C520", "_id" : { "$oid" : "50849afe83a9a4020000000a" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 158367, "end" : "/div[1]", "endOffset" : 158545, "_id" : { "$oid" : "50849afe83a9a4020000000b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350867710862 }, "created" : { "$date" : 1350867710862 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50849cad25d3df020000000e", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Darwin explaining the effects of climate change on the ecosystem. Interestingly, his explanation applies to Global Warming and, in his time, it had not even started yet.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "We shall best understand the probable course of natural selection by taking\nthe case of a country undergoing some physical change, for instance, of\nclimate. The proportional numbers of its inhabitants would almost\nimmediately undergo a change, and some species might become extinct. We may\nconclude, from what we have seen of the intimate and complex manner in\nwhich the inhabitants of each country are bound together, that any change\nin the numerical proportions of some of the inhabitants, independently of\nthe change of climate itself, would seriously affect many of the others. If\nthe country were open on its borders, new forms would certainly immigrate,\nand this also would seriously disturb the relations of some of the former\ninhabitants. Let it be remembered how powerful the influence of a single\nintroduced tree or mammal has been shown to be. But in the case of an\nisland, or of a country partly surrounded by barriers, into which new and\nbetter adapted forms could not freely enter, we should then have places in\nthe economy of nature which would assuredly be better filled up, if some of\nthe original inhabitants were in some manner modified; for, had the area\nbeen open to immigration, these same {82} places would have been seized on\nby intruders. In such case, every slight modification, which in the course\nof ages chanced to arise, and which in any way favoured the individuals of\nany of the species, by better adapting them to their altered conditions,\nwould tend to be preserved; and natural selection would thus have free\nscope for the work of improvement.", "uuid" : "6579CDFB", "_id" : { "$oid" : "50849cad25d3df020000000e" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 158546, "end" : "/div[1]", "endOffset" : 160125, "_id" : { "$oid" : "50849cad25d3df020000000f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350868141861 }, "created" : { "$date" : 1350868141861 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5084a41c83a9a4020000000c" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1350870044838 }, "groups" : [ "21L.003" ], "id" : "5084a41c83a9a4020000000c", "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "quote" : "Oh, I had forgotten \nCéline!  Well, to resume.  When I saw my charmer\nthus come in accompanied by a cavalier, I seemed to hear a hiss, \nand the green snake of jealousy, rising on undulating coils from \nthe moonlit balcony, glided within my waistcoat, and ate its way \nin two minutes to my heart’s core.", "ranges" : [ { "start" : "/div[1]/div[17]/p[14]", "startOffset" : 206, "end" : "/div[1]/div[17]/p[14]", "endOffset" : 509, "_id" : { "$oid" : "50984388ab5e720200000009" } } ], "tags" : [], "text" : "Another reference to the snake in paradise lost where Mr. Rochester is jealous of Celine and her new lover. rom (bk IX, l. 499) Milton describes the snake as \"Fold above fold, a surging maze\"", "updated" : { "$date" : 1352156040133 }, "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "user" : "slonaker@mit.edu", "username" : "James S.", "uuid" : "F82E1366" } -{ "id" : "5084a6ad83a9a4020000000e", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "I really like the example that follows about the lions main providing defense. Seems very logical, but was never something I questioned. Sexual selection, can be anything that results in increased fitness( more offspring). It is the generation gap in the ability to survive, though in my mind it is difficult to separate these tow ideas. Anything that improves odds of existence would most likely also improve reproductive success.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "depends, not on a struggle for\nexistence, but on a struggle between the males for possession of the\nfemales; the result is not death to the unsuccessful competitor, but few or\nno offspring.", "uuid" : "C898F6FC", "_id" : { "$oid" : "5084a6ad83a9a4020000000e" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 171044, "end" : "/div[1]", "endOffset" : 171233, "_id" : { "$oid" : "5084a6ad83a9a4020000000f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350870701688 }, "created" : { "$date" : 1350870701688 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084aa6f83a9a40200000010", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "You wonder if it's ever the other way around.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Sexual Selection. This depends, not on a struggle for\nexistence, but on a struggle between the males for possession of the\nfemales; the result is not death to the unsuccessful competitor, but few or\nno offspring.", "uuid" : "0CF79CA0", "_id" : { "$oid" : "5084aa6f83a9a40200000010" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 171021, "end" : "/div[1]", "endOffset" : 171233, "_id" : { "$oid" : "5084aa6f83a9a40200000011" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350871663110 }, "created" : { "$date" : 1350871663110 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084ad2183a9a40200000012", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "This sort of selection only emerges when Natural Selection is not effective enough in reducing a population.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Sexual Selection", "uuid" : "A92D4626", "_id" : { "$oid" : "5084ad2183a9a40200000012" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 170571, "end" : "/div[1]", "endOffset" : 170587, "_id" : { "$oid" : "5084ad2183a9a40200000013" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350872353653 }, "created" : { "$date" : 1350872353653 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5084b07925d3df0200000010" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1350873209029 }, "groups" : [ "21L.000J" ], "id" : "5084b07925d3df0200000010", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "quote" : "The disquisitions upon death and \nsuicide were calculated to fill me with wonder", "ranges" : [ { "start" : "/div[1]/p[410]", "startOffset" : 885, "end" : "/div[1]/p[410]", "endOffset" : 965, "_id" : { "$oid" : "5084b07925d3df0200000011" } } ], "tags" : [ "Sorrows", "of", "Young", "Werther" ], "text" : "The creature learns of suicide in a Romantic way- Werther uses suicide as an expression of love", "updated" : { "$date" : 1350873526831 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "uuid" : "AA008AD6" } -{ "id" : "5084b09425d3df0200000012", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "This idea of intermittent action interests me. I have always considered it to be something slow but continuous, and with the previous discussion of sexual selection, that was more the case. With natural selection by geographical change, it makes sense that there are periods of downtime in between changes to which organisms must respond/ adapt", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "intermittent action", "uuid" : "CC22AD33", "_id" : { "$oid" : "5084b09425d3df0200000012" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 210684, "end" : "/div[1]", "endOffset" : 210703, "_id" : { "$oid" : "5084b09425d3df0200000013" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350873236627 }, "created" : { "$date" : 1350873236627 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5084b0e925d3df0200000014" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1350873321133 }, "groups" : [ "21L.000J" ], "id" : "5084b0e925d3df0200000014", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "quote" : "yet I inclined towards the opinions of the hero", "ranges" : [ { "start" : "/div[1]/p[410]", "startOffset" : 1024, "end" : "/div[1]/p[410]", "endOffset" : 1071, "_id" : { "$oid" : "5084b0e925d3df0200000015" } } ], "tags" : [ "Sorrows", "of", "Young", "Werther" ], "text" : "Romantic view of suicide.", "updated" : { "$date" : 1350873541266 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "uuid" : "ABBC324D" } -{ "id" : "5084b14d25d3df0200000016", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "specifically on the y chromosome", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Thus it is, as I believe, that when the males and females of any animal\nhave the same general habits of life, but differ in structure, colour, or\nornament, such differences have been mainly caused by sexual selection;", "uuid" : "C8C49B87", "_id" : { "$oid" : "5084b14d25d3df0200000016" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 174384, "end" : "/div[1]", "endOffset" : 174602, "_id" : { "$oid" : "5084b14d25d3df0200000017" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350873421858 }, "created" : { "$date" : 1350873421858 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084b19d25d3df0200000018", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "He embraces suicide and death", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I shall ascend my funeral pile triumphantly, \nand exult in the agony of the torturing flames. The light of that conflagration \nwill fade away; my ashes will be swept into the sea by the winds. My spirit will \nsleep in peace;", "uuid" : "641F1E75", "_id" : { "$oid" : "5084b19d25d3df0200000018" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "Sorrows", "of", "Young", "Werther" ], "ranges" : [ { "start" : "/div[1]/p[791]", "startOffset" : 154, "end" : "/div[1]/p[791]", "endOffset" : 380, "_id" : { "$oid" : "5084b19d25d3df0200000019" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350873501411 }, "created" : { "$date" : 1350873501411 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084b35583a9a40200000014", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "The body was surreptitiously made to look like it drowned and washed up. The creature is aware of the concept of suicide and manipulates it. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Their \nfirst supposition was that it was the corpse of some person who had been \ndrowned, and was thrown on shore by the waves;", "uuid" : "28AE2648", "_id" : { "$oid" : "5084b35583a9a40200000014" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "Sorrows", "of", "Young", "Werther" ], "ranges" : [ { "start" : "/div[1]/p[593]", "startOffset" : 844, "end" : "/div[1]/p[593]", "endOffset" : 971, "_id" : { "$oid" : "5084b35583a9a40200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350873941556 }, "created" : { "$date" : 1350873941556 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084b39683a9a40200000016", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "The creature appreciates nature", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I gradually saw plainly the clear stream that supplied me with \ndrink, and the trees that shaded me with their foliage. I was delighted when I \nfirst discovered that a pleasant sound, which often saluted my ears, proceeded \nfrom the throats of the little winged animals who had often intercepted the \nlight from my eyes. I began also to observe, with greater accuracy, the forms \nthat surrounded me, and to perceive the boundaries of the radiant roof of light which \ncanopied me. Sometimes I tried to imitate the pleasant songs of the birds, but \nwas unable.", "uuid" : "9B6F0E01", "_id" : { "$oid" : "5084b39683a9a40200000016" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[330]", "startOffset" : 147, "end" : "/div[1]/p[330]", "endOffset" : 705, "_id" : { "$oid" : "5084b39683a9a40200000017" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350874006572 }, "created" : { "$date" : 1350874006572 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084b3c425d3df020000001a", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "We can best fit if in the limited space if we each adapt to utilize one resource or set of resources well. In order to eat meat and vegetables, some energy must be wasted for our body develop that combined ability.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "So in the general economy of any land, the more widely and\nperfectly the animals and plants are diversified for different habits of\nlife, so will a greater number of individuals be capable of there\nsupporting themselves.", "uuid" : "80463418", "_id" : { "$oid" : "5084b3c425d3df020000001a" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 223857, "end" : "/div[1]", "endOffset" : 224077, "_id" : { "$oid" : "5084b3c425d3df020000001b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350874052020 }, "created" : { "$date" : 1350874052020 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084b43a83a9a40200000018", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "Once you use up your resources you try and take over someone elses. It is interesting to consider the natural economy and how it resembles a societal one.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "enabled to encroach on places occupied by other beings", "uuid" : "901FD711", "_id" : { "$oid" : "5084b43a83a9a40200000018" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 224886, "end" : "/div[1]", "endOffset" : 224940, "_id" : { "$oid" : "5084b43a83a9a40200000019" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350874170174 }, "created" : { "$date" : 1350874170174 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084b7c283a9a4020000001a", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "Appreciation of nature", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "The birds sang in more cheerful notes, and the leaves began to \nbud forth on the trees.Happy, happy earth! fit habitation for gods, \nwhich, so short a time before, was bleak, damp, and unwholesome. My spirits were \nelevated by the enchanting appearance of nature;", "uuid" : "1FFF0488", "_id" : { "$oid" : "5084b7c283a9a4020000001a" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[364]", "startOffset" : 229, "end" : "/div[1]/p[364]", "endOffset" : 492, "_id" : { "$oid" : "5084b7c283a9a4020000001b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350875074386 }, "created" : { "$date" : 1350875074386 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084b84c83a9a4020000001c", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "text" : "This view of natural selection as a force that consciously looks to improve and preserve organisms is incorrect and impractical. There are no natural forces with minds of their own to consider what is advantageous to an organism and what is not. Natural selection does not dictate that an organism with an injurious mutation will die; it is certainly more likely, but if all organisms with negative defects died before procreating, then there would be no genetic illnesses. Natural selection does not seek anything, as it is merely a process. It most definitely does not seek \"the improvement of each organic being,\" but rather points to the greater likelihood that a disadvantaged individual will die. In other words, natural selection does not help those individuals with useful adaptations, but rather harms those with harmful mutations.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "It may metaphorically be said that natural selection is daily and hourly\nscrutinising, throughout the world, every variation, even the slightest;\nrejecting that which is bad, preserving and adding up all that is good;\nsilently and insensibly working, whenever and wherever opportunity offers,\nat the improvement of each organic being in relation to its organic and\ninorganic conditions of life", "uuid" : "6269BFD7", "_id" : { "$oid" : "5084b84c83a9a4020000001c" }, "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 163946, "end" : "/div[1]", "endOffset" : 164339, "_id" : { "$oid" : "5084b84c83a9a4020000001d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350875212411 }, "created" : { "$date" : 1350875212411 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084b84f83a9a4020000001e", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "The creature understands that death of a loved one causes misery", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "this death will carry despair \nto him, and a thousand other miseries shall torment and destroy him.", "uuid" : "CB9C6075", "_id" : { "$oid" : "5084b84f83a9a4020000001e" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "Sorrows", "of", "Young", "Werther" ], "ranges" : [ { "start" : "/div[1]/p[476]", "startOffset" : 177, "end" : "/div[1]/p[476]", "endOffset" : 276, "_id" : { "$oid" : "5084b84f83a9a4020000001f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350875215729 }, "created" : { "$date" : 1350875215729 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084b98b83a9a40200000020", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "Death as release", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I shall no longer feel the \nagonies which now consume me, or be the prey of feelings unsatisfied, yet \nunquenched.", "uuid" : "B28E2548", "_id" : { "$oid" : "5084b98b83a9a40200000020" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[789]", "startOffset" : 637, "end" : "/div[1]/p[789]", "endOffset" : 752, "_id" : { "$oid" : "5084b98b83a9a40200000021" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350875531740 }, "created" : { "$date" : 1350875531740 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084b9b183a9a40200000022", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "Appreciation of nature", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I shall no longer see the sun \nor stars, or feel the winds play on my cheeks. Light, feeling, and sense will \npass away; and in this condition must I find my happiness. Some years ago, when \nthe images which this world affords first opened upon me, when I felt the \ncheering warmth of summer, and heard the rustling of the leaves and the chirping \nof the birds,", "uuid" : "A5BCA12A", "_id" : { "$oid" : "5084b9b183a9a40200000022" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[789]", "startOffset" : 872, "end" : "/div[1]/p[789]", "endOffset" : 1233, "_id" : { "$oid" : "5084b9b183a9a40200000023" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350875569258 }, "created" : { "$date" : 1350875569258 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084bcb125d3df020000001c", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "text" : "This passage, too, contains an incorrect description of natural selection's process. It cannot make a plant create more seeds, but can merely act on a mutant plant that appears that produces more seeds. Natural selection acts on organisms with mutations, but cannot cause the appearance of a mutation. This means that even if some trait would be advantageous to an organism, it cannot appear in the population until by some chance it first shows up as a random mutation. In that case, it could then be acted on by natural selection in order to increase its prevalence in the population.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "If\nit profit a plant to have its seeds more and more widely disseminated by\nthe wind, I can see no greater difficulty in this being effected through\nnatural selection, than in the cotton-planter increasing and improving by\nselection the down in the pods on his cotton-trees", "uuid" : "279E9C70", "_id" : { "$oid" : "5084bcb125d3df020000001c" }, "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 167948, "end" : "/div[1]", "endOffset" : 168221, "_id" : { "$oid" : "5084bcb125d3df020000001d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350876337464 }, "created" : { "$date" : 1350876337464 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084c4ff83a9a40200000024", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "I think these are the arguments that make it most difficult to follow the complete theory of evolution. I can accept that links my be missing. But there are some jumps that seem crazy to have been selected for. What advantage was the first sensitivity to light?", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "I may remark that several facts make me\nsuspect that any sensitive nerve may be rendered sensitive to light", "uuid" : "0719D206", "_id" : { "$oid" : "5084c4ff83a9a40200000024" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 353309, "end" : "/div[1]", "endOffset" : 353417, "_id" : { "$oid" : "5084c4ff83a9a40200000025" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350878463881 }, "created" : { "$date" : 1350878463881 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084cb5925d3df020000001e", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "text" : "This sentence relates back to an earlier comment about the role of self-interest in a Darwinian economy. The improvement of a particular species cannot help another species directly by natural selection, as the second species is being acted on by natural selection as well, and the advantage gained is not an inheritable factor. The fact that adaptation can lead to harm, but not help, to other species emphasizes natural selection's roles as a natural force that relies on death and injury more so than it does even on health and survival.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Natural selection cannot possibly produce any modification in any one\nspecies exclusively for the good of another species; though throughout\nnature one species incessantly takes advantage of, and profits by, the\nstructure of another.", "uuid" : "3CE4E650", "_id" : { "$oid" : "5084cb5925d3df020000001e" }, "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 378875, "end" : "/div[1]", "endOffset" : 379108, "_id" : { "$oid" : "5084cb5925d3df020000001f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350880089806 }, "created" : { "$date" : 1350880089806 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084cf9783a9a40200000026", "user" : "sheilaxu@mit.edu", "username" : "Sheila X.", "text" : "I find it interesting that he used the word \"economy\". It seems that he is drawing an analogy between natural selection to the process of \"economy\"... perhaps...natural selection is the \"invisible hand\" of the nature?", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "But isolation\nprobably acts more efficiently in checking the immigration of better\nadapted organisms, after any physical change, such as of climate or\nelevation of the land, &c.; and thus new places in the natural economy of\nthe country are left open for the old inhabitants to struggle for, and\nbecome adapted to, through {105} modifications in their structure and\nconstitution. Lastly, isolation, by checking immigration and consequently\ncompetition, will give time for any new variety to be slowly improved; and\nthis may sometimes be of importance in the production of new species.", "uuid" : "482AFDE4", "_id" : { "$oid" : "5084cf9783a9a40200000026" }, "permissions" : { "delete" : [ "sheilaxu@mit.edu" ], "update" : [ "sheilaxu@mit.edu" ], "admin" : [ "sheilaxu@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 202772, "end" : "/div[1]", "endOffset" : 203356, "_id" : { "$oid" : "5084cf9783a9a40200000027" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350881175527 }, "created" : { "$date" : 1350881175527 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084d52725d3df0200000020", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "the creature is unloved", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "but I am solitary and detested.", "uuid" : "CE2DE9D9", "_id" : { "$oid" : "5084d52725d3df0200000020" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[414]", "startOffset" : 1336, "end" : "/div[1]/p[414]", "endOffset" : 1367, "_id" : { "$oid" : "5084d52725d3df0200000021" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350882599120 }, "created" : { "$date" : 1350882599120 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084d56383a9a40200000028", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "creature is unloved/alone", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I am alone, and miserable; man will not associate \nwith me; but one as deformed and horrible as myself would not deny herself to \nme", "uuid" : "7899A67E", "_id" : { "$oid" : "5084d56383a9a40200000028" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[480]", "startOffset" : 393, "end" : "/div[1]/p[480]", "endOffset" : 525, "_id" : { "$oid" : "5084d56383a9a40200000029" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350882659808 }, "created" : { "$date" : 1350882659808 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084d71125d3df0200000022", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "definition of natural selection", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "This preservation of favourable\nvariations and the rejection of injurious variations, I call Natural\nSelection.", "uuid" : "08CFF1FB", "_id" : { "$oid" : "5084d71125d3df0200000022" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 158255, "end" : "/div[1]", "endOffset" : 158367, "_id" : { "$oid" : "5084d71125d3df0200000023" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350883089097 }, "created" : { "$date" : 1350883089097 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084d8db83a9a4020000002a", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Organisms change by chance. The chance changes that prove to be beneficial are the ones that survive more easily. These surviving organisms reproduce and pass their \"good\" genes to the next generation.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "In such case, every slight modification, which in the course\nof ages chanced to arise, and which in any way favoured the individuals of\nany of the species, by better adapting them to their altered conditions,\nwould tend to be preserved; and natural selection would thus have free\nscope for the work of improvement.", "uuid" : "581F89DF", "_id" : { "$oid" : "5084d8db83a9a4020000002a" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 159810, "end" : "/div[1]", "endOffset" : 160124, "_id" : { "$oid" : "5084d8db83a9a4020000002b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350883547869 }, "created" : { "$date" : 1350883547869 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084d98d83a9a4020000002c", "user" : "sheilaxu@mit.edu", "username" : "Sheila X.", "text" : "In this paragraph, Darwin acknowledged that it is difficult to find evidence for an organ that is so \"perfect\" such as the eye. He pointed out that it is difficult to find graduations of an organ like eye in animals. I think this is where anti-evolution believers could have attacked the theory of evolution by pointing out the lack of graduations. ", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "In looking for the gradations by which an organ in any species has been\nperfected, we ought to look exclusively to its lineal ancestors; but this\nis scarcely ever possible, and we are forced in each case to look to\nspecies of the same group, that is to the collateral descendants from the\nsame original parent-form, in order to see what gradations are possible,\nand for the chance of some gradations having been transmitted from the\nearlier stages of descent, in an unaltered or little altered condition.\nAmongst existing Vertebrata, we find but a small amount of gradation in the\nstructure of the eye, and from fossil species we can learn nothing on this\nhead. In this great class we should probably have to descend far beneath\nthe lowest known fossiliferous stratum to discover the earlier stages, by\nwhich the eye has been perfected.", "uuid" : "B1B59706", "_id" : { "$oid" : "5084d98d83a9a4020000002c" }, "permissions" : { "delete" : [ "sheilaxu@mit.edu" ], "update" : [ "sheilaxu@mit.edu" ], "admin" : [ "sheilaxu@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 353493, "end" : "/div[1]", "endOffset" : 354330, "_id" : { "$oid" : "5084d98d83a9a4020000002d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350883725986 }, "created" : { "$date" : 1350883725986 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084dad725d3df0200000024", "user" : "sheilaxu@mit.edu", "username" : "Sheila X.", "text" : "In this case, the animals will not die since natural selection is more about selecting traits that ensure the survival of a particular organism. But since the particular organism lack certain traits (but not necessary for survival) to attract mates, they cannot pass on their genes to their children...hence, they are left out of the gene pool so future generations will not have those organisms' traits. ", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "A hornless stag or spurless cock would have a\npoor chance of leaving offspring. Sexual selection by always allowing the\nvictor to breed might surely give indomitable courage, length to the spur,\nand strength to the wing to strike in the spurred leg, as well as the\nbrutal cock-fighter, who knows well that he can improve his breed by\ncareful selection of the best cocks.", "uuid" : "5C71034D", "_id" : { "$oid" : "5084dad725d3df0200000024" }, "permissions" : { "delete" : [ "sheilaxu@mit.edu" ], "update" : [ "sheilaxu@mit.edu" ], "admin" : [ "sheilaxu@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 171535, "end" : "/div[1]", "endOffset" : 171906, "_id" : { "$oid" : "5084dad725d3df0200000025" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350884055568 }, "created" : { "$date" : 1350884055568 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084db6d83a9a4020000002e", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "A perfect organism does not exist. There is always some improvement that can be made which leads to continuous changing and improvement", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "No country can be named in which all the native inhabitants\nare now so perfectly adapted to each other and to the physical conditions\nunder which they live", "uuid" : "F2CAF83C", "_id" : { "$oid" : "5084db6d83a9a4020000002e" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 161460, "end" : "/div[1]", "endOffset" : 161615, "_id" : { "$oid" : "5084db6d83a9a4020000002f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350884205196 }, "created" : { "$date" : 1350884205196 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084dc5c25d3df0200000026", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Certain organisms are better prepared for mating. This is not a survival advantage, but a reproductive advantage. The offspring of these \"better mating\" organisms receive the hereditary material to be better at mating themselves. Therefore, these traits are selected for.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "This depends, not on a struggle for\nexistence, but on a struggle between the males for possession of the\nfemales; the result is not death to the unsuccessful competitor, but few or\nno offspring. Sexual selection is, therefore, less rigorous than natural\nselection.", "uuid" : "ECE3E97F", "_id" : { "$oid" : "5084dc5c25d3df0200000026" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 171039, "end" : "/div[1]", "endOffset" : 171303, "_id" : { "$oid" : "5084dc5c25d3df0200000027" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350884444073 }, "created" : { "$date" : 1350884444073 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084dd1025d3df0200000028", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Asexual reproduction cannot last on its own.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "but in none, as I suspect, can self-fertilisation go on for\nperpetuity.", "uuid" : "4FD76BEC", "_id" : { "$oid" : "5084dd1025d3df0200000028" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 197231, "end" : "/div[1]", "endOffset" : 197304, "_id" : { "$oid" : "5084dd1025d3df0200000029" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350884624788 }, "created" : { "$date" : 1350884624788 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084dd7883a9a40200000030", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Isolated areas create unique niches to be filled.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Isolation, also, is an important element in the process of natural\nselection.", "uuid" : "FC92D761", "_id" : { "$oid" : "5084dd7883a9a40200000030" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 202216, "end" : "/div[1]", "endOffset" : 202293, "_id" : { "$oid" : "5084dd7883a9a40200000031" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350884728338 }, "created" : { "$date" : 1350884728338 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084de0783a9a40200000032", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "This is a slightly Lamarckian view.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "But the much greater variability, as well as\nthe greater frequency of monstrosities, under domestication or cultivation,\nthan under nature, leads me to believe that deviations of structure are in\nsome way due to the nature of the conditions of life, to which the parents\nand their more remote ancestors have been exposed during several\ngenerations.", "uuid" : "85C29FD8", "_id" : { "$oid" : "5084de0783a9a40200000032" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 252049, "end" : "/div[1]", "endOffset" : 252398, "_id" : { "$oid" : "5084de0783a9a40200000033" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350884871580 }, "created" : { "$date" : 1350884871580 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084de8425d3df020000002a", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "As an organism evolves, its predecessors naturally die off.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Hence, if we look at each species\nas descended from some other unknown form, both the parent and all the\ntransitional varieties will generally have been exterminated by the very\nprocess of formation and perfection of the new form.", "uuid" : "C08432DF", "_id" : { "$oid" : "5084de8425d3df020000002a" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 326619, "end" : "/div[1]", "endOffset" : 326850, "_id" : { "$oid" : "5084de8425d3df020000002b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350884996389 }, "created" : { "$date" : 1350884996389 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084eb6f83a9a40200000034", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Appropriate counter-argument to Cleanthes.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Yet reason tells me, that if numerous gradations from a perfect and complex\neye to one very imperfect and simple, each grade being useful to its\npossessor, can be shown to exist; if further, the eye does vary ever so\nslightly, and the variations be inherited, which is certainly the case; and\nif any variation or modification in the organ be ever useful to an animal\nunder changing conditions of life, then the difficulty of believing that a\nperfect and complex eye could be formed by natural selection, though\ninsuperable by our imagination, can hardly be considered real. How a nerve\ncomes to be sensitive to {187} light, hardly concerns us more than how life\nitself first originated; but I may remark that several facts make me\nsuspect that any sensitive nerve may be rendered sensitive to light, and\nlikewise to those coarser vibrations of the air which produce sound.", "uuid" : "F9951891", "_id" : { "$oid" : "5084eb6f83a9a40200000034" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 352619, "end" : "/div[1]", "endOffset" : 353492, "_id" : { "$oid" : "5084eb6f83a9a40200000035" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350888303955 }, "created" : { "$date" : 1350888303955 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5084ed1b83a9a40200000036", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Pain? Yes, all nerves. Injury? Only to avoid worse injury (ex. a lizard cutting off its tail).", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "No\norgan will be formed, as Paley has remarked, for the purpose of causing\npain or for doing an injury to its possessor.", "uuid" : "9CA1C0B3", "_id" : { "$oid" : "5084ed1b83a9a40200000036" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 380317, "end" : "/div[1]", "endOffset" : 380437, "_id" : { "$oid" : "5084ed1b83a9a40200000037" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1350888731260 }, "created" : { "$date" : 1350888731260 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50859b7daae2610200000004", "user" : "qinxuan@mit.edu", "username" : "Qinxuan P.", "text" : "Seems to suggest that Isabella is always going to hide the truth from Catherine.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "I would not tell you what is\n\nbehind the black veil for the world!", "uuid" : "B550090D", "_id" : { "$oid" : "50859b7daae2610200000004" }, "permissions" : { "delete" : [ "qinxuan@mit.edu" ], "update" : [ "qinxuan@mit.edu" ], "admin" : [ "qinxuan@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[110]", "startOffset" : 40, "end" : "/div[1]/p[110]", "endOffset" : 106, "_id" : { "$oid" : "50859b7daae2610200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1350933373544 }, "created" : { "$date" : 1350933373544 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50859b9daae2610200000006", "user" : "qinxuan@mit.edu", "username" : "Qinxuan P.", "text" : "long-term plan to exploit Catherine", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Those will last us some time.", "uuid" : "6AC7EFD0", "_id" : { "$oid" : "50859b9daae2610200000006" }, "permissions" : { "delete" : [ "qinxuan@mit.edu" ], "update" : [ "qinxuan@mit.edu" ], "admin" : [ "qinxuan@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[114]", "startOffset" : 221, "end" : "/div[1]/p[114]", "endOffset" : 250, "_id" : { "$oid" : "50859b9daae2610200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1350933405115 }, "created" : { "$date" : 1350933405115 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50859be6aae2610200000008", "user" : "qinxuan@mit.edu", "username" : "Qinxuan P.", "text" : "that's mean, contradicting what she just said", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "for I must confess there is something amazingly\n\ninsipid about her", "uuid" : "5575A65E", "_id" : { "$oid" : "50859be6aae2610200000008" }, "permissions" : { "delete" : [ "qinxuan@mit.edu" ], "update" : [ "qinxuan@mit.edu" ], "admin" : [ "qinxuan@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[120]", "startOffset" : 96, "end" : "/div[1]/p[120]", "endOffset" : 162, "_id" : { "$oid" : "50859be6aae2610200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1350933478506 }, "created" : { "$date" : 1350933478506 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50859d403df6040200000002", "user" : "qinxuan@mit.edu", "username" : "Qinxuan P.", "text" : "Maybe Henry deliberately planted that to tease with Catherine's imagination and to add mysteriousness?", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Henry's words, his description of the ebony cabinet which was to escape\n\nher observation at first, immediately rushed across her; and though\n\nthere could be nothing really in it, there was something whimsical, it\n\nwas certainly a very remarkable coincidence!", "uuid" : "54E5F1CD", "_id" : { "$oid" : "50859d403df6040200000002" }, "permissions" : { "delete" : [ "qinxuan@mit.edu" ], "update" : [ "qinxuan@mit.edu" ], "admin" : [ "qinxuan@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[749]", "startOffset" : 1285, "end" : "/div[1]/p[749]", "endOffset" : 1543, "_id" : { "$oid" : "50859d403df6040200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1350933824132 }, "created" : { "$date" : 1350933824132 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50859deb3df6040200000004", "user" : "qinxuan@mit.edu", "username" : "Qinxuan P.", "text" : "Henry heightened Catherine's imagination himself over the trip. Now he is reproaching her for it. Ruthless exploitation!", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "\"If I understand you rightly, you had formed a surmise of such horror as\n\nI have hardly words to—Dear Miss Morland, consider the dreadful nature\n\nof the suspicions you have entertained. What have you been judging from?\n\nRemember the country and the age in which we live. Remember that we are\n\nEnglish, that we are Christians. Consult your own understanding, your\n\nown sense of the probable, your own observation of what is passing\n\naround you. Does our education prepare us for such atrocities? Do our\n\nlaws connive at them? Could they be perpetrated without being known, in\n\na country like this, where social and literary intercourse is on such a\n\nfooting, where every man is surrounded by a neighbourhood of voluntary\n\nspies, and where roads and newspapers lay everything open? Dearest Miss\n\nMorland, what ideas have you been admitting?\"", "uuid" : "33939A11", "_id" : { "$oid" : "50859deb3df6040200000004" }, "permissions" : { "delete" : [ "qinxuan@mit.edu" ], "update" : [ "qinxuan@mit.edu" ], "admin" : [ "qinxuan@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[840]", "startOffset" : 2, "end" : "/div[1]/p[840]", "endOffset" : 841, "_id" : { "$oid" : "50859deb3df6040200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1350933995933 }, "created" : { "$date" : 1350933995933 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50859e4d3df6040200000006", "user" : "qinxuan@mit.edu", "username" : "Qinxuan P.", "text" : "Isabella is not interested in Gothic stuff at all, otherwise she would have been disappointed.", "uri" : "http://annotationstudio.mit.edu/documents/northanger-abbey", "quote" : "Isabella seemed to find a pool of commerce", "uuid" : "DB9BF349", "_id" : { "$oid" : "50859e4d3df6040200000006" }, "permissions" : { "delete" : [ "qinxuan@mit.edu" ], "update" : [ "qinxuan@mit.edu" ], "admin" : [ "qinxuan@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[417]", "startOffset" : 100, "end" : "/div[1]/p[417]", "endOffset" : 142, "_id" : { "$oid" : "50859e4d3df6040200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1350934099955 }, "created" : { "$date" : 1350934093407 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5085bfdcaae261020000000a" }, "id" : "5085bfdcaae261020000000a", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "The monster drew inspiration from ancient Greek and Roman figures", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Plutarch \ntaught me high thoughts; he elevated me above the wretched sphere of my own \nreflections to admire and love the heroes of past ages. Many things I read \nsurpassed my understanding and experience.", "uuid" : "BD84319F", "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[412]", "startOffset" : 263, "end" : "/div[1]/p[412]", "endOffset" : 468, "_id" : { "$oid" : "5085bfdcaae261020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350942684213 }, "created" : { "$date" : 1350942684213 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5085c0973df6040200000008" }, "id" : "5085c0973df6040200000008", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "Interesting, even though the monster goes on to become a murderer, here he admires lawgivers, but he dislikes fighters like Theseus and Romulus.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I read of men concerned \nin public affairs, governing or massacring their species. I felt the greatest \nardour for virtue rise within me, and abhorrence for vice, as far as I \nunderstood the signification of those terms, relative as they were, as I applied \nthem, to pleasure and pain alone. Induced by these feelings, I was of course led \nto admire peaceable lawgivers, Numa, Solon, and Lycurgus, in preference to \nRomulus and Theseus.", "uuid" : "18A1C8CD", "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[412]", "startOffset" : 802, "end" : "/div[1]/p[412]", "endOffset" : 1239, "_id" : { "$oid" : "5085c0973df6040200000009" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350942871074 }, "created" : { "$date" : 1350942871074 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5085c123aae261020000000c" }, "id" : "5085c123aae261020000000c", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "So the monster is saying the people in the cottage steered him toward peacemaker before soldier, and that had it been any other way he would would be even more violent. Yet the monster ends up becoming violent anyway, why the change in heart?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "The patriarchal lives of my protectors caused these \nimpressions to take a firm hold on my mind; perhaps, if my first introduction to \nhumanity had been made by a young soldier, burning for glory and slaughter, I \nshould have been imbued with different sensations.", "uuid" : "56D80D25", "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[412]", "startOffset" : 1240, "end" : "/div[1]/p[412]", "endOffset" : 1504, "_id" : { "$oid" : "5085c123aae261020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350943011210 }, "created" : { "$date" : 1350943011210 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5085f770aae261020000000e", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Shelley uses beautiful to describe Elizabeth when she was a young child.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "beautiful", "uuid" : "D15B60D2", "_id" : { "$oid" : "5085f770aae261020000000e" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[100]", "startOffset" : 195, "end" : "/div[1]/p[100]", "endOffset" : 204, "_id" : { "$oid" : "5085f770aae261020000000f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350956912587 }, "created" : { "$date" : 1350956912587 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5085f7e3aae2610200000010", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Shelley uses beautiful to describe an oak tree, which is contradictory when the oak tree was on fire and later on burned into the ground.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "beautiful", "uuid" : "55DC6EAD", "_id" : { "$oid" : "5085f7e3aae2610200000010" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[114]", "startOffset" : 452, "end" : "/div[1]/p[114]", "endOffset" : 461, "_id" : { "$oid" : "5085f7e3aae2610200000011" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350957027896 }, "created" : { "$date" : 1350957027896 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5085f82faae2610200000012", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "uses beautiful to portrait young and innocent William ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "beautiful", "uuid" : "03BF43B9", "_id" : { "$oid" : "5085f82faae2610200000012" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[119]", "startOffset" : 419, "end" : "/div[1]/p[119]", "endOffset" : 428, "_id" : { "$oid" : "5085f82faae2610200000013" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350957103950 }, "created" : { "$date" : 1350957103950 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5085f87f3df604020000000a", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Did Shelley use beautiful in this case to be sarcastic, or did she use it because Victor actually thinks that the monster was beautiful at first?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Beautiful", "uuid" : "16C54EEB", "_id" : { "$oid" : "5085f87f3df604020000000a" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[155]", "startOffset" : 225, "end" : "/div[1]/p[155]", "endOffset" : 234, "_id" : { "$oid" : "5085f87f3df604020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350957183928 }, "created" : { "$date" : 1350957183928 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5085f9003df604020000000c", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "uses beautiful in a quotation from Victor. It paints a tranquil scene here. However, in this case, Victor actually feel mocked by the lake and mountain that he considers beautiful", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "beautiful", "uuid" : "1A82AB25", "_id" : { "$oid" : "5085f9003df604020000000c" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[233]", "startOffset" : 231, "end" : "/div[1]/p[233]", "endOffset" : 240, "_id" : { "$oid" : "5085f9003df604020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350957312898 }, "created" : { "$date" : 1350957312898 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5085f9363df604020000000e" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1350957366026 }, "groups" : [ "21L.000J" ], "id" : "5085f9363df604020000000e", "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "quote" : "beautiful", "ranges" : [ { "start" : "/div[1]/p[236]", "startOffset" : 530, "end" : "/div[1]/p[236]", "endOffset" : 539, "_id" : { "$oid" : "5085fa1caae2610200000014" } } ], "tags" : [], "text" : "Shelley used beautiful to describe the lightnings playing on the summit of Mont Blanc. Contradicts with Burke's definition of beautiful. Might be because the Victor is already out of his mind, so he actually felt at peace when he saw lightnings.", "updated" : { "$date" : 1350957596580 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "uuid" : "1307503B" } -{ "id" : "5085facfaae2610200000015", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "notice how Shelley used \"beautiful \"\"yet\"\" terrific\". it suggests her use of beautiful over here might be the opposite of terrific.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "beautiful", "uuid" : "EE9206A8", "_id" : { "$oid" : "5085facfaae2610200000015" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[238]", "startOffset" : 29, "end" : "/div[1]/p[238]", "endOffset" : 40, "_id" : { "$oid" : "5085facfaae2610200000016" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350957775620 }, "created" : { "$date" : 1350957775620 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5085fb153df6040200000010", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "a sad use of beautiful in this case. might even be sarcasm.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "beautiful.", "uuid" : "609E1B61", "_id" : { "$oid" : "5085fb153df6040200000010" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[262]", "startOffset" : 165, "end" : "/div[1]/p[262]", "endOffset" : 175, "_id" : { "$oid" : "5085fb153df6040200000011" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350957845518 }, "created" : { "$date" : 1350957845518 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5085fb9f3df6040200000012", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "used with heavenly, which means happiness , just like in heaven.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "beautiful", "uuid" : "CBA1B19B", "_id" : { "$oid" : "5085fb9f3df6040200000012" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[300]", "startOffset" : 754, "end" : "/div[1]/p[300]", "endOffset" : 763, "_id" : { "$oid" : "5085fb9f3df6040200000013" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350957983594 }, "created" : { "$date" : 1350957983594 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5085fd35aae2610200000017", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "what is the definition of beautiful here? it should be the oppostie of wonderful and sublime, but in the same time, has to be something similar to picturesque. best guess is that shelley already knew the total difference between beautiful and sublime in this case. A SPECIFIC PROOF.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "beautiful", "uuid" : "B950A493", "_id" : { "$oid" : "5085fd35aae2610200000017" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[307]", "startOffset" : 254, "end" : "/div[1]/p[307]", "endOffset" : 263, "_id" : { "$oid" : "5085fd35aae2610200000018" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350958389191 }, "created" : { "$date" : 1350958389191 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5085fe4faae2610200000019", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "uses beautiful to describe the \"lovely\" scene. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "beautiful", "uuid" : "3D1C853A", "_id" : { "$oid" : "5085fe4faae2610200000019" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[341]", "startOffset" : 841, "end" : "/div[1]/p[341]", "endOffset" : 850, "_id" : { "$oid" : "5085fe4faae261020000001a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350958671427 }, "created" : { "$date" : 1350958671427 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5085fe8faae261020000001b", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "just to describe flowers. nothing special. Anyone would use beautiful to describe flowers.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "beautiful", "uuid" : "3D731A54", "_id" : { "$oid" : "5085fe8faae261020000001b" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[366]", "startOffset" : 165, "end" : "/div[1]/p[366]", "endOffset" : 174, "_id" : { "$oid" : "5085fe8faae261020000001c" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350958735900 }, "created" : { "$date" : 1350958735900 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5085ff923df6040200000014", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "means that Felix is totally in love with the Arabian.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "beautiful", "uuid" : "F0EEF6A4", "_id" : { "$oid" : "5085ff923df6040200000014" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[369]", "startOffset" : 297, "end" : "/div[1]/p[369]", "endOffset" : 306, "_id" : { "$oid" : "5085ff923df6040200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350958994662 }, "created" : { "$date" : 1350958994662 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5085ffc0aae261020000001d", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "uses to describe the music", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "beautiful", "uuid" : "85C61E36", "_id" : { "$oid" : "5085ffc0aae261020000001d" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[372]", "startOffset" : 209, "end" : "/div[1]/p[372]", "endOffset" : 218, "_id" : { "$oid" : "5085ffc0aae261020000001e" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350959040312 }, "created" : { "$date" : 1350959040312 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5086077e3df6040200000016", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "obviously, the monster is just jealous that men are more good-looking than himself. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "beautiful", "uuid" : "4627D0CB", "_id" : { "$oid" : "5086077e3df6040200000016" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[414]", "startOffset" : 1139, "end" : "/div[1]/p[414]", "endOffset" : 1148, "_id" : { "$oid" : "5086077e3df6040200000017" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350961022698 }, "created" : { "$date" : 1350961022698 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508607c5aae261020000001f", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "in this case is used to describe Victor's little brother William, who later on got killed", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "beautiful", "uuid" : "365358E9", "_id" : { "$oid" : "508607c5aae261020000001f" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[469]", "startOffset" : 113, "end" : "/div[1]/p[469]", "endOffset" : 122, "_id" : { "$oid" : "508607c5aae2610200000020" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350961093219 }, "created" : { "$date" : 1350961093219 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508608393df6040200000018", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "sad that the monster can never be acquainted with Elizabeth, the beautiful creature he described here, because he killed her. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "beautiful", "uuid" : "C0953D87", "_id" : { "$oid" : "508608393df6040200000018" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[477]", "startOffset" : 389, "end" : "/div[1]/p[477]", "endOffset" : 399, "_id" : { "$oid" : "508608393df6040200000019" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1350961209760 }, "created" : { "$date" : 1350961209760 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "508705760f948d0200000002" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1351026038094 }, "groups" : [ "21L.000J" ], "id" : "508705760f948d0200000002", "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "quote" : "Natural philosophy is the genius that has regulated my fate; I desire \ntherefore, in this narration, to state those facts which led to my predilection \nfor that\n\nscience.", "ranges" : [ { "start" : "/div[1]/p[107]", "startOffset" : 1, "end" : "/div[1]/p[107]", "endOffset" : 171, "_id" : { "$oid" : "508705760f948d0200000003" } } ], "tags" : [], "text" : "What is this natural philosophy? Science was the thing he used to create the monster yet what lead him to science?", "updated" : { "$date" : 1351026072310 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "uuid" : "B9CD36C9" } -{ "id" : "508705e20f948d0200000004", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Works of Cornelius Agrippa, Three books of Occult Philosophy?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "volume of the works of\nCornelius Agrippa.", "uuid" : "6C4C8A7F", "_id" : { "$oid" : "508705e20f948d0200000004" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[107]", "startOffset" : 382, "end" : "/div[1]/p[107]", "endOffset" : 423, "_id" : { "$oid" : "508705e20f948d0200000005" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351026146560 }, "created" : { "$date" : 1351026146560 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508705f70f948d0200000006", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "New way of thinking.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "new light seemed to dawn upon my mind;", "uuid" : "68ADBE69", "_id" : { "$oid" : "508705f70f948d0200000006" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[107]", "startOffset" : 583, "end" : "/div[1]/p[107]", "endOffset" : 621, "_id" : { "$oid" : "508705f70f948d0200000007" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351026167704 }, "created" : { "$date" : 1351026167704 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508714e283631f0200000002", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "charts about this are very interesting.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "sting department of natural history, and may be said to be its very\nsoul. What can be more curious than that the hand of a man, formed for\ngrasping, that of a mole for digging, the leg of the horse, the paddle of\nthe porpoise, and the wing of the bat, should all be constructed on the\nsame pattern, and should include similar bones, in the same relative\npositions?", "uuid" : "CF310246", "_id" : { "$oid" : "508714e283631f0200000002" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 807986, "end" : "/div[1]", "endOffset" : 808350, "_id" : { "$oid" : "508714e283631f0200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351029986278 }, "created" : { "$date" : 1351029986277 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50871f4d0f948d0200000008", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "It was Agrippa who was his first teacher but his reading of Alchemy was too much, he did not fully go into the sciences", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "that the principles of Agrippa had been entirely exploded, and that a modern \nsystem of science had been introduced, which possessed much greater powers than \nthe ancient, because the powers of the latter were\nchimerical, while those of the former were real and practical; under such \ncircumstances, I should certainly have thrown Agrippa aside, and, with my \nimagination warmed as it was, should probably have applied myself to the more\nrational theory of chemistry which has resulted from modern discoveries.", "uuid" : "DF7482C0", "_id" : { "$oid" : "50871f4d0f948d0200000008" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[108]", "startOffset" : 77, "end" : "/div[1]/p[108]", "endOffset" : 587, "_id" : { "$oid" : "50871f4d0f948d0200000009" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351032653821 }, "created" : { "$date" : 1351032653821 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508720280f948d020000000a", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "His other two alchemist teachers.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Paracelsus and\nAlbertus Magnus", "uuid" : "926402C2", "_id" : { "$oid" : "508720280f948d020000000a" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[109]", "startOffset" : 102, "end" : "/div[1]/p[109]", "endOffset" : 132, "_id" : { "$oid" : "508720280f948d020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351032872931 }, "created" : { "$date" : 1351032872931 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5087203b0f948d020000000c", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "They are only wild fancies, he sees this.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "wild fancies", "uuid" : "DA24FA30", "_id" : { "$oid" : "5087203b0f948d020000000c" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[109]", "startOffset" : 157, "end" : "/div[1]/p[109]", "endOffset" : 169, "_id" : { "$oid" : "5087203b0f948d020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351032891759 }, "created" : { "$date" : 1351032891759 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5087205d83631f0200000004", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Alchemy was his study for a while. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I was left by her\nto \npursue my studies alone.", "uuid" : "D5581BB1", "_id" : { "$oid" : "5087205d83631f0200000004" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[109]", "startOffset" : 571, "end" : "/div[1]/p[109]", "endOffset" : 617, "_id" : { "$oid" : "5087205d83631f0200000005" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351032925724 }, "created" : { "$date" : 1351032925724 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5087206c0f948d020000000e", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Age dominated by science", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "a\ndisciple of Albertus Magnus should arise in the eighteenth century", "uuid" : "AB29DAFF", "_id" : { "$oid" : "5087206c0f948d020000000e" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[110]", "startOffset" : 33, "end" : "/div[1]/p[110]", "endOffset" : 101, "_id" : { "$oid" : "5087206c0f948d020000000f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351032940714 }, "created" : { "$date" : 1351032940714 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5087208e0f948d0200000010", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "This is the reason why he goes after alchemy and not science right away.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "our \nfamily was not scientifical", "uuid" : "19B99975", "_id" : { "$oid" : "5087208e0f948d0200000010" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[110]", "startOffset" : 107, "end" : "/div[1]/p[110]", "endOffset" : 139, "_id" : { "$oid" : "5087208e0f948d0200000011" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351032974101 }, "created" : { "$date" : 1351032974101 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5087216b0f948d0200000012", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "He is ignorant of other studies, he therefore searches for the EoL and the PS.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "My dreams were therefore undisturbed by reality; and I \nentered with the greatest diligence into the search of the\nphilosopher's stone and the elixir of life.", "uuid" : "0F35E867", "_id" : { "$oid" : "5087216b0f948d0200000012" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[110]", "startOffset" : 217, "end" : "/div[1]/p[110]", "endOffset" : 375, "_id" : { "$oid" : "5087216b0f948d0200000013" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351033195832 }, "created" : { "$date" : 1351033195832 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5087217f83631f0200000006", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Search for eternal life.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "latter \nobtained my undivided attention", "uuid" : "06C3463E", "_id" : { "$oid" : "5087217f83631f0200000006" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[110]", "startOffset" : 384, "end" : "/div[1]/p[110]", "endOffset" : 423, "_id" : { "$oid" : "5087217f83631f0200000007" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351033215052 }, "created" : { "$date" : 1351033215052 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5087219c0f948d0200000014", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "This eventually leads up to the creation of the monster. IT IS ALL ALCHEMY up to this point.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "wealth was an inferior object; but\nwhat \nglory would attend the discovery, if I could banish disease from the human \nframe, and render man invulnerable to any but a violent death!", "uuid" : "5EE40C23", "_id" : { "$oid" : "5087219c0f948d0200000014" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[110]", "startOffset" : 425, "end" : "/div[1]/p[110]", "endOffset" : 604, "_id" : { "$oid" : "5087219c0f948d0200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351033244270 }, "created" : { "$date" : 1351033244270 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508722e183631f0200000008", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "He never blames alchemy, it is his own ignorance to the skill.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "incantations \nwere always unsuccessful, I attributed the failure rather to my own inexperience \nand mistake than to a want of skill or fidelity in my instructors.", "uuid" : "D5E45880", "_id" : { "$oid" : "508722e183631f0200000008" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[111]", "startOffset" : 181, "end" : "/div[1]/p[111]", "endOffset" : 343, "_id" : { "$oid" : "508722e183631f0200000009" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351033569290 }, "created" : { "$date" : 1351033569290 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508723060f948d0200000016", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "This is a spiritual reference to alchemists, and not the puffers.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "raising of ghosts or devils was a promise liberally accorded by my favourite \nauthors", "uuid" : "53F286BE", "_id" : { "$oid" : "508723060f948d0200000016" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[111]", "startOffset" : 36, "end" : "/div[1]/p[111]", "endOffset" : 121, "_id" : { "$oid" : "508723060f948d0200000017" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351033606939 }, "created" : { "$date" : 1351033606939 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5087237e0f948d0200000018", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Alchemists did not fully search everything. They did not work with the natural world as much as other things.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "The ignorance of the early philosophers on these and several other points \nserved to decrease their credit with me: but I could not entirely throw them \naside, before some other system should occupy their place in my mind.", "uuid" : "FA52C9A9", "_id" : { "$oid" : "5087237e0f948d0200000018" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[113]", "startOffset" : 0, "end" : "/div[1]/p[114]", "endOffset" : 0, "_id" : { "$oid" : "5087237e0f948d0200000019" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351033726709 }, "created" : { "$date" : 1351033726709 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50872fde83631f020000000a", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "I will now superimpose a passage from Discourse over the following speech by Waldman.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "--", "uuid" : "CB42FD11", "_id" : { "$oid" : "50872fde83631f020000000a" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[134]", "startOffset" : 914, "end" : "/div[1]/p[134]", "endOffset" : 916, "_id" : { "$oid" : "50872fde83631f020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351036894832 }, "created" : { "$date" : 1351036894831 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508730050f948d020000001a", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Men either were astonished and deluded by their first inventions so as to become visionaries, and to institute researches after imaginary things, or they employed them as instruments for astonishing and deluding others, influenced by their dearest passions and interests, by ambition, or the love of money. Hence arose the dreams of alchemy concerning the philosopher's stone, and the elixir of life. Hence, for a long while the other metals were destroyed or rendered useless by experiments designed to transmute them into gold; and for a long while the means of obtaining earthly immortality were sought for amidst the unhealthy vapours of the laboratory. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "\"The ancient teachers of this science,\" said he, \"promised \nimpossibilities, and performed nothing.", "uuid" : "70F1AFA0", "_id" : { "$oid" : "508730050f948d020000001a" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[135]", "startOffset" : 0, "end" : "/div[1]/p[135]", "endOffset" : 99, "_id" : { "$oid" : "508730050f948d020000001b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351036933683 }, "created" : { "$date" : 1351036933683 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508758900f948d020000001c", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "He still thinks that alchemy is the most important thing even thought he acknowledges that they have flaw in their observations", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "ignorance of the early philosophers on these and several other points \nserved to decrease their credit with me: but I could not entirely throw them \naside, before some other system should occupy their place in my mind.", "uuid" : "60FA71DB", "_id" : { "$oid" : "508758900f948d020000001c" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[113]", "startOffset" : 4, "end" : "/div[1]/p[113]", "endOffset" : 222, "_id" : { "$oid" : "508758900f948d020000001d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351047312699 }, "created" : { "$date" : 1351047312699 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508758c083631f020000000c", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Galvanism is the thing that overthrows alchemy, which is mentioned to be just imagination.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "This last stroke completed the overthrow of\nCornelius Agrippa,\nAlbertus Magnus, and\nParacelsus, who had so long reigned the lords of my imagination.", "uuid" : "47597205", "_id" : { "$oid" : "508758c083631f020000000c" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[116]", "startOffset" : 0, "end" : "/div[1]/p[116]", "endOffset" : 148, "_id" : { "$oid" : "508758c083631f020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351047360201 }, "created" : { "$date" : 1351047360201 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50875a1a83631f020000000e", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Krempe's reaction to alchemy, shows his utmost dislike.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I little \nexpected in this enlightened and scientific age to find a disciple of Albertus \nMagnus and Paracelsus.", "uuid" : "3D59B3D9", "_id" : { "$oid" : "50875a1a83631f020000000e" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[130]", "startOffset" : 441, "end" : "/div[1]/p[130]", "endOffset" : 554, "_id" : { "$oid" : "50875a1a83631f020000000f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351047706489 }, "created" : { "$date" : 1351047706489 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50875ad883631f0200000010", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "referring to agrippa, magnus and paracelsus", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I had long \nconsidered those authors", "uuid" : "3D2D7AFA", "_id" : { "$oid" : "50875ad883631f0200000010" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[132]", "startOffset" : 38, "end" : "/div[1]/p[132]", "endOffset" : 75, "_id" : { "$oid" : "50875ad883631f0200000011" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351047896578 }, "created" : { "$date" : 1351047896578 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "50875b0683631f0200000012" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1351047942857 }, "groups" : [ "21L.000J" ], "id" : "50875b0683631f0200000012", "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "quote" : "Besides, I had a contempt for the uses of modern natural \nphilosophy. It was very different, when the masters of the science sought \nimmortality and power; such views, although futile, were grand: but now the \nscene was changed. The ambition of the inquirer seemed to limit itself to the \nannihilation of those visions on which my interest in science was chiefly \nfounded.", "ranges" : [ { "start" : "/div[1]/p[132]", "startOffset" : 384, "end" : "/div[1]/p[132]", "endOffset" : 756, "_id" : { "$oid" : "50875b0683631f0200000013" } } ], "tags" : [ "important" ], "text" : "His foundation of science is based on seeking immortality.", "updated" : { "$date" : 1351047957246 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "uuid" : "A2AE321F" } -{ "id" : "50875b9883631f0200000014", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Waldman's view of what science is. Reference to alchemy", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "\"The ancient teachers of this science,\" said he, \"promised \nimpossibilities, and performed nothing. The modern masters promise very little; \nthey know that metals cannot be transmuted, and that the elixir of life is a \nchimera. But these philosophers, whose hands seem only made to dabble in dirt, \nand their eyes to pore over the microscope or crucible, have indeed performed \nmiracles. They penetrate into the recesses of nature, and shew how she works in \nher hiding places. They ascend into the heavens; they have discovered how the \nblood circulates, and the nature of the air we breathe. They have acquired new \nand almost unlimited powers; they can command the thunders of heaven, mimic the \nearthquake, and even mock the invisible world with its own shadows.\"", "uuid" : "1F72B5DF", "_id" : { "$oid" : "50875b9883631f0200000014" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[135]", "startOffset" : 0, "end" : "/div[1]/p[135]", "endOffset" : 767, "_id" : { "$oid" : "50875b9883631f0200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351048088867 }, "created" : { "$date" : 1351048088867 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50875c040f948d020000001e", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "His close inspection to why life exists in humans", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "One of the phænomena which had peculiarly attracted my \nattention was the structure of the human frame, and, indeed, any animal endued \nwith life.", "uuid" : "08BD4142", "_id" : { "$oid" : "50875c040f948d020000001e" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[142]", "startOffset" : 0, "end" : "/div[1]/p[142]", "endOffset" : 146, "_id" : { "$oid" : "50875c040f948d020000001f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351048196723 }, "created" : { "$date" : 1351048196723 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50875d0e0f948d0200000020", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Victor's looking for the elixir", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I paused, examining and analysing all the minutiae of \ncausation, as exemplified in the change from life to death, and death to life, \nuntil from the midst of this darkness a sudden light broke in upon me -- a light \nso brilliant and wondrous, yet so simple, that while I became dizzy with the \nimmensity of the prospect which it illustrated, I was surprised that among so \nmany men of genius, who had directed their inquiries towards the same science, \nthat I alone should be reserved to discover so astonishing a secret.", "uuid" : "AEB57766", "_id" : { "$oid" : "50875d0e0f948d0200000020" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[142]", "startOffset" : 1832, "end" : "/div[1]/p[142]", "endOffset" : 2354, "_id" : { "$oid" : "50875d0e0f948d0200000021" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351048462567 }, "created" : { "$date" : 1351048462567 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50875d250f948d0200000022", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "His accomplishment", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I succeeded in discovering the cause of generation and life; nay, more, \nI became myself capable of bestowing animation upon lifeless matter.", "uuid" : "A4B77BF6", "_id" : { "$oid" : "50875d250f948d0200000022" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[143]", "startOffset" : 302, "end" : "/div[1]/p[143]", "endOffset" : 443, "_id" : { "$oid" : "50875d250f948d0200000023" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351048485988 }, "created" : { "$date" : 1351048485988 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50875d9183631f0200000016", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "His warning to all people. It was caused by his own learning and what he was after. He was after the elixir of life, something that humans should not have access to.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "how \ndangerous is the acquirement of knowledge, and how much happier that man is who \nbelieves his native town to be the world, than he who aspires to become greater \nthan his nature will allow.", "uuid" : "936C5DC0", "_id" : { "$oid" : "50875d9183631f0200000016" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[145]", "startOffset" : 454, "end" : "/div[1]/p[145]", "endOffset" : 648, "_id" : { "$oid" : "50875d9183631f0200000017" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351048593035 }, "created" : { "$date" : 1351048593035 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50875e2d83631f0200000018", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "His thoughts of creating the ultimate being, one who escapes death", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Although I possessed the capacity of bestowing animation, yet to prepare a frame \nfor the reception of it, with all its intricacies of fibres, muscles, and veins, \nstill remained a work of inconceivable difficulty and labour. I doubted at first \nwhether I should attempt the creation of a being like myself or one of simpler \norganization; but my imagination was too much exalted by my first success to \npermit me to doubt of my ability to give life to an animal as complex and \nwonderful as man.", "uuid" : "770049C8", "_id" : { "$oid" : "50875e2d83631f0200000018" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[146]", "startOffset" : 137, "end" : "/div[1]/p[146]", "endOffset" : 633, "_id" : { "$oid" : "50875e2d83631f0200000019" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351048749304 }, "created" : { "$date" : 1351048749304 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50875ebd0f948d0200000024", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Base materials?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "After having formed this determination, and having spent \nsome months in successfully collecting and arranging my materials, I began.", "uuid" : "6AB77775", "_id" : { "$oid" : "50875ebd0f948d0200000024" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[146]", "startOffset" : 1509, "end" : "/div[1]/p[146]", "endOffset" : 1642, "_id" : { "$oid" : "50875ebd0f948d0200000025" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351048893222 }, "created" : { "$date" : 1351048893222 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50875ed983631f020000001a", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Concept of creating life", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Pursuing these reflections, I thought, that if I could bestow \nanimation upon lifeless matter, I might in process of time (although I now found \nit impossible) renew life where death had apparently devoted the body to \ncorruption.", "uuid" : "F2621FD1", "_id" : { "$oid" : "50875ed983631f020000001a" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[147]", "startOffset" : 466, "end" : "/div[1]/p[147]", "endOffset" : 696, "_id" : { "$oid" : "50875ed983631f020000001b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351048921172 }, "created" : { "$date" : 1351048921172 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50875f3a83631f020000001c", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "More discussion of base materials", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I \ncollected bones from charnel houses; and disturbed, with profane fingers, the \ntremendous secrets of the human frame. In a solitary chamber, or rather cell, at \nthe top of the house, and separated from all the other apartments by a gallery \nand staircase, I kept my workshop of filthy creation; my eyeballs were starting \nfrom their sockets in attending to the details of my employment. The dissecting \nroom and the slaughter-house furnished many of my materials; and often did my \nhuman nature turn with loathing from my occupation, whilst, still urged on by an \neagerness which perpetually increased, I brought my work near to a conclusion.", "uuid" : "CA37D191", "_id" : { "$oid" : "50875f3a83631f020000001c" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[148]", "startOffset" : 1074, "end" : "/div[1]/p[148]", "endOffset" : 1719, "_id" : { "$oid" : "50875f3a83631f020000001d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351049018752 }, "created" : { "$date" : 1351049018752 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50875f6783631f020000001e", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "It was his only goal", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I had worked hard for nearly two years, for the \nsole purpose of infusing life into an inanimate body.", "uuid" : "1F7E24BE", "_id" : { "$oid" : "50875f6783631f020000001e" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[156]", "startOffset" : 88, "end" : "/div[1]/p[156]", "endOffset" : 190, "_id" : { "$oid" : "50875f6783631f020000001f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351049063937 }, "created" : { "$date" : 1351049063937 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508762b783631f0200000020", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "non-artificial", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "NATURAL SELECTION.", "uuid" : "F7381C77", "_id" : { "$oid" : "508762b783631f0200000020" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 4318, "end" : "/div[1]", "endOffset" : 4337, "_id" : { "$oid" : "508762b783631f0200000021" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351049911401 }, "created" : { "$date" : 1351049911401 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508764c90f948d0200000026", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "is not concerned with origin of CREATION", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "I must premise, that I\nhave nothing to do with the origin of the primary mental powers, any more\nthan I have with that of life itself. We are concerned only with the\ndiversities of instinct and of the other mental qualities of animals within\nthe same class.", "uuid" : "BD2D4775", "_id" : { "$oid" : "508764c90f948d0200000026" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 391097, "end" : "/div[1]", "endOffset" : 391356, "_id" : { "$oid" : "508764c90f948d0200000027" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351050441167 }, "created" : { "$date" : 1351050441167 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5087653a83631f0200000022", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "most generalized definition of instinct. he only gives the most basic definition so as not to pose any conflict", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "An\naction, which we ourselves should require experience to enable us to\nperform, when performed by an animal, more especially by a very young one,\nwithout any experience, and when performed by many individuals in the same\nway, without their knowing for what purpose it is performed, is usually\nsaid to be instinctive", "uuid" : "F60857A0", "_id" : { "$oid" : "5087653a83631f0200000022" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 391644, "end" : "/div[1]", "endOffset" : 391961, "_id" : { "$oid" : "5087653a83631f0200000023" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351050554707 }, "created" : { "$date" : 1351050554707 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5087665583631f0200000024", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "no jumping steps or taking shortcuts. instincts, and evolution, work in a sequential way, and the idea here is that each step must be completed to achieve the next stage. this ties into his theory of selection/evolution. even though we have not witnessed all of the iterations, we can be sure that they did happen or we would not be in the stage we are in now. ", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "forced to go\nback to recover the habitual train of thought", "uuid" : "D35253EC", "_id" : { "$oid" : "5087665583631f0200000024" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 393040, "end" : "/div[1]", "endOffset" : 393099, "_id" : { "$oid" : "5087665583631f0200000025" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351050837319 }, "created" : { "$date" : 1351050837319 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5087674983631f0200000026", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "giving the performed instincts \"plastic\" attributes", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "instincts are as important as\ncorporeal structure for the welfare of each species, under its present\nconditions of life. Under changed conditions of life, it is at least\npossible that slight modifications of instinct might be profitable to a\nspecies; and if it can be shown that instincts do vary ever so little, then\nI can see no difficulty in natural selection preserving and continually\naccumulating variations of instinct to any extent that may be profitable.", "uuid" : "7C596B3A", "_id" : { "$oid" : "5087674983631f0200000026" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 394722, "end" : "/div[1]", "endOffset" : 395187, "_id" : { "$oid" : "5087674983631f0200000027" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351051081092 }, "created" : { "$date" : 1351051081092 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508768320f948d0200000028", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "text" : "The comparison of instinct to a corporeal structure is an apt one. In order for natural selection to work on an organism's instincts, part of the origin or execution of the instinct must be genetically determined. I do not know precisely how instincts are carried out, but they function as a physical trait in that they provide an advantage while also be genetically determined and therefore subject to selection.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "It will be universally admitted that instincts are as important as\ncorporeal structure for the welfare of each species, under its present\nconditions of life.", "uuid" : "776546BA", "_id" : { "$oid" : "508768320f948d0200000028" }, "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 394686, "end" : "/div[1]", "endOffset" : 394843, "_id" : { "$oid" : "508768320f948d0200000029" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351051314270 }, "created" : { "$date" : 1351051314270 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50876a9b83631f0200000028", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "what reasons could possibly cause this? is the sea more stable? are there more niches to fill so less competition? ", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "The productions of the land\nseem to change at a quicker rate than those of the sea, of which a striking\ninstance has lately been observed in Switzerland. There is some reason to\nbelieve that organisms, considered high in the scale of nature, change more\nquickly than those that are low", "uuid" : "8EDEF647", "_id" : { "$oid" : "50876a9b83631f0200000028" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 584211, "end" : "/div[1]", "endOffset" : 584496, "_id" : { "$oid" : "50876a9b83631f0200000029" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351051931243 }, "created" : { "$date" : 1351051931243 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50876bd40f948d020000002a", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "i suppose this isn't necessarily contradictory to his theory of webs of complex relations. just because one change can cause a chain-reaction in all surrounding organisms doesn't mean that the change will be beneficial or be carried through. this is where the possibility of extinction comes into play. and if something doesn't change, then does that mean it will inevitably become extinct?", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "The variability of each species is\nquite independent of that of all others. Whether such variability be taken\nadvantage of by natural selection, and whether the variations be\naccumulated to a greater or lesser amount, thus causing a greater or lesser\namount of modification in the varying species, depends on many complex\ncontingencies,--on the variability being of a beneficial nature, on the\npower of intercrossing, on the rate of breeding, on the slowly changing\nphysical conditions of the country, and more especially on the nature of\nthe other inhabitants with which the varying species comes into\ncompetition", "uuid" : "686432A4", "_id" : { "$oid" : "50876bd40f948d020000002a" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 585658, "end" : "/div[1]", "endOffset" : 586273, "_id" : { "$oid" : "50876bd40f948d020000002b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351052244632 }, "created" : { "$date" : 1351052244632 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50876dd783631f020000002a", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "which is a precursor to extinction...", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "rarity", "uuid" : "EAAD6898", "_id" : { "$oid" : "50876dd783631f020000002a" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 594906, "end" : "/div[1]", "endOffset" : 594913, "_id" : { "$oid" : "50876dd783631f020000002b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351052759743 }, "created" : { "$date" : 1351052759743 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50876e5583631f020000002c", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "idea of a niche to fill. taking something's place is to occupy the same space as that organism, which leads to competition", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "place being seized on by some more\nsuccessful competitor.", "uuid" : "DECB6E6C", "_id" : { "$oid" : "50876e5583631f020000002c" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 595980, "end" : "/div[1]", "endOffset" : 596038, "_id" : { "$oid" : "50876e5583631f020000002d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351052885136 }, "created" : { "$date" : 1351052885136 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50876f3683631f020000002e", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "text" : "Classification of organisms into groups of varying similarity helps to visualize Darwin's theories. You can trace the development of various features as the groups become smaller and more specific, finally resulting in a species in which the only variation is between individuals. While taxonomy does not show intermediate forms, it is a similar idea, as it shows various branches of adaptation and the connections and order in which various traits were acquired.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "On this idea of the natural system being,\nin so far as it has been perfected, genealogical in its arrangement, with\nthe grades of difference between the descendants from a common parent,\nexpressed by the terms genera, families, orders, &c., we can understand the\nrules which we are compelled to follow in our classification", "uuid" : "F0C168DC", "_id" : { "$oid" : "50876f3683631f020000002e" }, "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 806393, "end" : "/div[1]", "endOffset" : 806716, "_id" : { "$oid" : "50876f3683631f020000002f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351053110470 }, "created" : { "$date" : 1351053110470 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50876f650f948d020000002c", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "again, the physical space = place. but also, place as in rights, or hierarchy, or spot in line.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "But it must often have happened that a\nnew species belonging to some one group will have seized on the place\noccupied by a species belonging to a distinct group, and thus caused its\nextermination; and if many allied forms be developed from the successful\nintruder, many will have to yield their places; and it will generally be\nallied forms, which will suffer from some inherited inferiority in common.", "uuid" : "06BBECC9", "_id" : { "$oid" : "50876f650f948d020000002c" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 598800, "end" : "/div[1]", "endOffset" : 599204, "_id" : { "$oid" : "50876f650f948d020000002d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351053157152 }, "created" : { "$date" : 1351053157152 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508770c50f948d020000002e", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "text" : "Like the natural system (classification), the similarities between closely related species suggest a common starting point from which adaptation could begin and produce new forms. It is the morphological similarities that lend so much significance to the organization of organisms into genera, families, etc.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "the parts may change\nto almost any extent in form and size, and yet they always remain connected\ntogether in the same order.", "uuid" : "192705EE", "_id" : { "$oid" : "508770c50f948d020000002e" }, "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 808461, "end" : "/div[1]", "endOffset" : 808585, "_id" : { "$oid" : "508770c50f948d020000002f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351053509188 }, "created" : { "$date" : 1351053509188 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508771db0f948d0200000030", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "the natural system is the direct, physical, observable realm in which natural selection performs", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "On this idea of the natural system being,\nin so far as it has been perfected, genealogical in its arrangement, with\nthe grades of difference between the descendants from a common parent,\nexpressed by the terms genera, families, orders, &c., we can understand the\nrules which we are compelled to follow in our classification. We can\nunderstand why we value certain resemblances far more than others; why we\nare permitted to use rudimentary and useless organs, or others of trifling\nphysiological importance; why, in comparing one group with a distinct\ngroup, we summarily reject analogical or adaptive characters, and yet use\nthese same characters within the limits of the same group. We can clearly\nsee how it is that all living and extinct forms can be grouped together in\none great system; and how the several members of each class are connected\ntogether by the most complex and radiating lines of affinities.", "uuid" : "952FF09B", "_id" : { "$oid" : "508771db0f948d0200000030" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 806392, "end" : "/div[1]", "endOffset" : 807304, "_id" : { "$oid" : "508771db0f948d0200000031" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351053787087 }, "created" : { "$date" : 1351053787087 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508774c783631f0200000030", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "archetype or general skeletal base?", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "The bones of a limb might be shortened and widened to any extent,\nand become gradually enveloped in thick membrane, so as to serve as a fin;\nor a webbed foot might have all its bones, or certain bones, lengthened to\nany extent, and the membrane connecting them increased to any extent, so as\nto serve as a wing: yet in all this great amount of modification there will\nbe no tendency to alter the framework of bones or the relative connexion of\nthe several parts. If we suppose that the ancient progenitor, the archetype\nas it may be called, of all mammals, had its limbs constructed on the\nexisting general pattern, for whatever purpose they served, we can at once\nperceive the plain signification of the homologous construction of the\nlimbs throughout the whole class", "uuid" : "BF52FFAD", "_id" : { "$oid" : "508774c783631f0200000030" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [ "Morphology,", "Natural", "History" ], "ranges" : [ { "start" : "/div[1]", "startOffset" : 810108, "end" : "/div[1]", "endOffset" : 810876, "_id" : { "$oid" : "508774c783631f0200000031" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351054535507 }, "created" : { "$date" : 1351054535507 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508775950f948d0200000032", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : ". All\nthe members of whole classes can be connected together by chains of\naffinities, and all can be classified on the same principle, in groups\nsubordinate to groups. Fossil remains sometimes tend to fill up very wide\nintervals between existing orders. Organs in a rudimentary condition\nplainly show that an early progenitor had the organ in a fully developed\nstate; and this in some instances necessarily implies an enormous amount of\nmodification in the descendants. Throughout whole classes various\nstructures are formed on the same pattern, and at an embryonic age the\nspecies closely resemble each other. Therefore I cannot doubt that the\ntheory of descent with modification embraces all the members of the same\nclass. I believe that animals have descended from at most only four or five\nprogenitors, and plants from an equal or lesser number.", "uuid" : "BAF34624", "_id" : { "$oid" : "508775950f948d0200000032" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [ "summary" ], "ranges" : [ { "start" : "/div[1]", "startOffset" : 899993, "end" : "/div[1]", "endOffset" : 900843, "_id" : { "$oid" : "508775950f948d0200000033" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351054741451 }, "created" : { "$date" : 1351054741451 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5087776b83631f0200000032", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Organisms seem to be very fit for their respective tasks, yet the general structure among organisms is approximately the same.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "What can be more curious than that the hand of a man, formed for\ngrasping, that of a mole for digging, the leg of the horse, the paddle of\nthe porpoise, and the wing of the bat, should all be constructed on the\nsame pattern, and should include similar bones, in the same relative\npositions?", "uuid" : "104CAD4E", "_id" : { "$oid" : "5087776b83631f0200000032" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [ "holjose@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 808060, "end" : "/div[1]", "endOffset" : 808350, "_id" : { "$oid" : "5087776b83631f0200000033" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351055211577 }, "created" : { "$date" : 1351055211577 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508777710f948d0200000034", "user" : "sheilaxu@mit.edu", "username" : "Sheila X.", "text" : "Darwin seems to implies that \"Place\" is equivalent to \"niche\". Every species has their own niche in the ecosystem of nature, so when that species disappear their own niche, another species will take over the niche and make it its own niche.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "For though the offspring of one species might be adapted (and\nno doubt this has occurred in innumerable instances) to fill the exact\nplace of another species in the economy of nature, and thus supplant it;\nyet the two forms--the old and the new--would not be identically the same;\nfor both would almost certainly inherit different characters from their\ndistinct progenitors.", "uuid" : "402AFD39", "_id" : { "$oid" : "508777710f948d0200000034" }, "permissions" : { "delete" : [ "sheilaxu@mit.edu" ], "update" : [ "sheilaxu@mit.edu" ], "admin" : [ "sheilaxu@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 588327, "end" : "/div[1]", "endOffset" : 588702, "_id" : { "$oid" : "508777710f948d0200000035" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351055217755 }, "created" : { "$date" : 1351055217755 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508777990f948d0200000036", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Body parts that serve the same function are often similar in structure.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "yet all these organs, serving for such different purposes, are\nformed by infinitely numerous modifications of an upper lip, mandibles, and\ntwo pairs of maxillæ.", "uuid" : "B221A7A0", "_id" : { "$oid" : "508777990f948d0200000036" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [ "holjose@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 809004, "end" : "/div[1]", "endOffset" : 809165, "_id" : { "$oid" : "508777990f948d0200000037" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351055257608 }, "created" : { "$date" : 1351055257608 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508777ee0f948d0200000038", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "The idea of creating a diagram to visualize evolution is revolutionary. It allows the ideas to make sense to the common person.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "As it is difficult to\nshow the blood-relationship between the numerous kindred {431} of any\nancient and noble family, even by the aid of a genealogical tree, and\nalmost impossible to do this without this aid, we can understand the\nextraordinary difficulty which naturalists have experienced in describing", "uuid" : "BEA2D297", "_id" : { "$oid" : "508777ee0f948d0200000038" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [ "holjose@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 802261, "end" : "/div[1]", "endOffset" : 802566, "_id" : { "$oid" : "508777ee0f948d0200000039" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351055342365 }, "created" : { "$date" : 1351055342365 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5087786f83631f0200000034", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Puts this in context for the human-centric mind. Why can an animal perform some tasks after birth when humans would need to be trained to perform the same task?", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "An\naction, which we ourselves should require experience to enable us to\nperform, when performed by an animal, more especially by a very young one,\nwithout any experience, and when performed by many individuals in the same\nway, without their knowing for what purpose it is performed, is usually\nsaid to be instinctive", "uuid" : "ACF57CAF", "_id" : { "$oid" : "5087786f83631f0200000034" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [ "holjose@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 391645, "end" : "/div[1]", "endOffset" : 391961, "_id" : { "$oid" : "5087786f83631f0200000035" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351055471993 }, "created" : { "$date" : 1351055471993 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5087787783631f0200000036", "user" : "sheilaxu@mit.edu", "username" : "Sheila X.", "text" : "Used geological time scales and geographic areas to support his arguments about finding similar marine animals in different continents far away from each other.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "for if all the marine\nanimals which live at the present day in Europe, and all those that lived\nin Europe during the pleistocene period (an enormously remote period as\nmeasured by years, including the whole glacial epoch), were to be compared\nwith those now living in South America or in Australia, the most skilful\nnaturalist would hardly be able to say whether the existing or the\npleistocene inhabitants of Europe resembled most closely those of the\nsouthern hemisphere. So, again, several highly competent observers believe\nthat the existing productions of the United States are more closely related\nto those which lived in Europe during certain later tertiary stages, than\nto those which now live here; and if this be so, it is evident that\nfossiliferous beds deposited at the present day on the shores of North\nAmerica would hereafter be liable to be classed with somewhat older\nEuropean beds.", "uuid" : "EAD6CEAA", "_id" : { "$oid" : "5087787783631f0200000036" }, "permissions" : { "delete" : [ "sheilaxu@mit.edu" ], "update" : [ "sheilaxu@mit.edu" ], "admin" : [ "sheilaxu@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 604180, "end" : "/div[1]", "endOffset" : 605080, "_id" : { "$oid" : "5087787783631f0200000037" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351055479307 }, "created" : { "$date" : 1351055479307 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508779950f948d020000003a", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Speciation begins with one different individual. It's not when an entire species suddenly changes collectively.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "I believe in no fixed law\nof development, causing all the inhabitants of a country to change\nabruptly, or simultaneously, or to an equal degree. The process of\nmodification must be extremely slow.", "uuid" : "E6A9A48B", "_id" : { "$oid" : "508779950f948d020000003a" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [ "holjose@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 585462, "end" : "/div[1]", "endOffset" : 585659, "_id" : { "$oid" : "508779950f948d020000003b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351055765266 }, "created" : { "$date" : 1351055765266 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508779ae83631f0200000038", "user" : "sheilaxu@mit.edu", "username" : "Sheila X.", "text" : "Darwin pointed out that the embryos all resemble each other in early stages, and that there is a huge difference between in the early and mature forms since the embryos will undergo modification. But that would mean all embryos at the beginning are extremely similar, right?", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "The fore-limbs, for instance, which\nserved as legs in the parent-species, may have become, by a long course of\nmodification, adapted in one descendant to act as hands, in another as\npaddles, in another as wings; and on the above two principles--namely of\neach successive modification supervening at a rather late age, and being\ninherited at a {447} corresponding late age--the fore-limbs in the embryos\nof the several descendants of the parent-species will still resemble each\nother closely, for they will not have been modified. But in each of our new\nspecies, the embryonic fore-limbs will differ greatly from the fore-limbs\nin the mature animal; the limbs in the latter having undergone much\nmodification at a rather late period of life, and having thus been\nconverted into hands, or paddles, or wings.", "uuid" : "38196CFD", "_id" : { "$oid" : "508779ae83631f0200000038" }, "permissions" : { "delete" : [ "sheilaxu@mit.edu" ], "update" : [ "sheilaxu@mit.edu" ], "admin" : [ "sheilaxu@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 831778, "end" : "/div[1]", "endOffset" : 832584, "_id" : { "$oid" : "508779ae83631f0200000039" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351055790707 }, "created" : { "$date" : 1351055790707 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50877ea50f948d020000003c", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Competition leads to one form of an organism surviving while the other dies out.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "If two\ngreat regions had been for a long period favourably circumstanced in an\nequal degree, whenever their inhabitants met, the battle would be prolonged\nand severe; and some from one birthplace and some from the other might be\nvictorious. But in the course of time, the {327} forms dominant in the\nhighest degree, wherever produced, would tend everywhere to prevail. As\nthey prevailed, they would cause the extinction of other and inferior\nforms; and as these inferior forms would be allied in groups by\ninheritance, whole groups would tend slowly to disappear; though here and\nthere a single member might long be enabled to survive.", "uuid" : "5352FD7E", "_id" : { "$oid" : "50877ea50f948d020000003c" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [ "holjose@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 609218, "end" : "/div[1]", "endOffset" : 609854, "_id" : { "$oid" : "50877ea50f948d020000003d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351057061638 }, "created" : { "$date" : 1351057061638 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5087afa583631f020000003a", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "I tend to agree with this. It is amazing how much some animals are born able to do (think of horses or cows walking right after being born.) Human's are one of the least independent newborns. In he world though animals can survive only with what they are born knowing how to do, most likely those animals were selected for naturally.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "But it would be\nthe most serious error to suppose that the greater number of instincts have\nbeen acquired by habit in one generation, and then transmitted by\ninheritance to succeeding generations", "uuid" : "A060F4E1", "_id" : { "$oid" : "5087afa583631f020000003a" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 394308, "end" : "/div[1]", "endOffset" : 394503, "_id" : { "$oid" : "5087afa583631f020000003b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351069605928 }, "created" : { "$date" : 1351069605928 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "508821f9c202200200000004" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1351098873047 }, "groups" : [ "21L.000J" ], "id" : "508821f9c202200200000004", "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "quote" : "Did I request thee, Maker, from my clay\n To mould me man? Did I solicit thee\n From darkness to promote me?—", "ranges" : [ { "start" : "/div[1]/center[2]/table[1]", "startOffset" : 0, "end" : "/div[1]/center[2]/table[1]/tbody[1]/tr[1]/td[1]/font[1]", "endOffset" : 1, "_id" : { "$oid" : "508821f9c202200200000005" } } ], "tags" : [], "text" : "first introduction of creator/creation relationship\nforeshadows monster cursing victor\nvictor \"molds\" a living being\ncreature will be bitter about being thrust into a life he never asked for", "updated" : { "$date" : 1351098943242 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "uuid" : "2647B3AD" } -{ "id" : "50882289c202200200000006", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Direct Reference to Paradise Lost", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I cannot believe that I am he \nwhose thoughts were once filled with sublime and transcendent visions of the \nbeauty and the majesty of goodness. But it is even so; the fallen angel becomes \na malignant devil. Yet even that enemy of God and man had friends and associates \nin his desolation; I am alone.", "uuid" : "81D49FF5", "_id" : { "$oid" : "50882289c202200200000006" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[786]", "startOffset" : 1192, "end" : "/div[1]/p[786]", "endOffset" : 1495, "_id" : { "$oid" : "50882289c202200200000007" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099017381 }, "created" : { "$date" : 1351099017381 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508822b5c202200200000008", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "first time monster compares himself to satan\nhe sees himself as a defective version of adam and desires to be treated the same way by victor as adam is by god", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Like Adam, I was apparently united by no link to any other being \nin existence; but his state was far different from mine in every other respect. \nHe had come forth from the hands of God a perfect creature, happy and \nprosperous, guarded by the especial care of his Creator; he was allowed to \nconverse with, and acquire knowledge from, beings of a superior nature: but I \nwas wretched, helpless, and alone.", "uuid" : "0C5FCD55", "_id" : { "$oid" : "508822b5c202200200000008" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[413]", "startOffset" : 374, "end" : "/div[1]/p[413]", "endOffset" : 783, "_id" : { "$oid" : "508822b5c202200200000009" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099061567 }, "created" : { "$date" : 1351099061567 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508822c72d29030200000003", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Another Perspective, shows the monster as evil", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "You throw a \ntorch into a pile of buildings; and when they are consumed you sit among the \nruins and lament the fall. Hypocritical fiend! if he whom you mourn still lived, \nstill would he be the object, again would he become the prey, of your accursed \nvengeance.", "uuid" : "8646FCFB", "_id" : { "$oid" : "508822c72d29030200000003" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[785]", "startOffset" : 359, "end" : "/div[1]/p[785]", "endOffset" : 622, "_id" : { "$oid" : "508822c72d29030200000004" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099079554 }, "created" : { "$date" : 1351099079554 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508822fc2d29030200000006", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "the monster is bitter that he has no eve. he realizes adams creator gave him someone to love and be loved by, but the monster is completely alone in the world with no one else like him", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "But it was all a dream; no Eve soothed my sorrows, or shared my \nthoughts; I was alone. I remembered Adam's supplication to his Creator; but \nwhere was mine?", "uuid" : "AC78CB46", "_id" : { "$oid" : "508822fc2d29030200000006" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[417]", "startOffset" : 380, "end" : "/div[1]/p[417]", "endOffset" : 538, "_id" : { "$oid" : "508822fc2d29030200000007" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099132069 }, "created" : { "$date" : 1351099132069 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508822fd2d29030200000008", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Show's how he had an evil impulse, was this innate in him or did it manifest ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I was \nthe slave, not the master, of an impulse which I detested, yet could not \ndisobey.", "uuid" : "F0F205BD", "_id" : { "$oid" : "508822fd2d29030200000008" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[784]", "startOffset" : 673, "end" : "/div[1]/p[784]", "endOffset" : 762, "_id" : { "$oid" : "508822fd2d29030200000009" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099133419 }, "created" : { "$date" : 1351099133419 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508823312d2903020000000a", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "The ancient teachers promised impossibilities and produced nothing--surely a waste of time.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "\"Ah! Cornelius Agrippa! My dear Victor, do not waste your time upon this; it is \nsad trash.\"", "uuid" : "D1F3FAFC", "_id" : { "$oid" : "508823312d2903020000000a" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[107]", "startOffset" : 923, "end" : "/div[1]/p[107]", "endOffset" : 1017, "_id" : { "$oid" : "508823312d2903020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099185862 }, "created" : { "$date" : 1351099185862 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088233f2d2903020000000c", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Says how other's see him is not how he really is", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "\"Oh, it not thus—not thus,\" \ninterrupted the being; \"yet such must be the impression conveyed to you by what \nappears to be the purport of my actions.", "uuid" : "8E5884DC", "_id" : { "$oid" : "5088233f2d2903020000000c" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[786]", "startOffset" : 1, "end" : "/div[1]/p[786]", "endOffset" : 151, "_id" : { "$oid" : "5088233f2d2903020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099199464 }, "created" : { "$date" : 1351099199464 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088235ac20220020000000a", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "monsters sense of isolation increases, as does his hostility\nboth being conflicted by their inner feelings of solitude", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "wretched, helpless, and alone", "uuid" : "DAA8450A", "_id" : { "$oid" : "5088235ac20220020000000a" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[413]", "startOffset" : 751, "end" : "/div[1]/p[413]", "endOffset" : 781, "_id" : { "$oid" : "5088235ac20220020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099226078 }, "created" : { "$date" : 1351099226078 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508823642d2903020000000e", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Perhaps Percy Shelley threw this one in?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "——————\"The sounding cataract\nHaunted him like a passion: the tall rock,\nThe \nmountain, and the deep and gloomy wood,\nTheir colours and their forms, were then \nto him\nAn appetite; a feeling, and a love\nThat had no need of a remoter charm,\nBy \nthought supplied, or any interest\nUnborrow’d from the eye.*\"  <*Wordsworth’s \n\"Tintern Abbey.\">", "uuid" : "F2BAA03B", "_id" : { "$oid" : "508823642d2903020000000e" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/blockquote[1]/p[1]/font[1]", "startOffset" : 0, "end" : "/div[1]/blockquote[1]/blockquote[1]/p[1]", "endOffset" : 338, "_id" : { "$oid" : "508823642d2903020000000f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099236026 }, "created" : { "$date" : 1351099236026 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088236cc20220020000000c", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "The early philosophers were guided more by imagination than by natural evidence,a theme played with in Davy's Elements and Discourse.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "My dreams were therefore undisturbed by reality; and I \nentered with the greatest diligence into the search of the\nphilosopher's stone and the elixir of life.", "uuid" : "30C89B94", "_id" : { "$oid" : "5088236cc20220020000000c" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[110]", "startOffset" : 217, "end" : "/div[1]/p[110]", "endOffset" : 376, "_id" : { "$oid" : "5088236cc20220020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099244403 }, "created" : { "$date" : 1351099244403 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508823772d29030200000010", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "creature is good with language", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "eloquent", "uuid" : "5654ECE0", "_id" : { "$oid" : "508823772d29030200000010" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "Sorrows", "of", "Young", "Werther" ], "ranges" : [ { "start" : "/div[1]/p[738]", "startOffset" : 622, "end" : "/div[1]/p[738]", "endOffset" : 630, "_id" : { "$oid" : "508823772d29030200000011" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099255954 }, "created" : { "$date" : 1351099255954 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088238cc20220020000000e", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "here the monster begins to actually become vicious and malicious. you can see where the parallels between satan and the monster are", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Yet even that enemy of God and man had friends and associates \nin his desolation; I am alone.", "uuid" : "83C65D11", "_id" : { "$oid" : "5088238cc20220020000000e" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[786]", "startOffset" : 1402, "end" : "/div[1]/p[786]", "endOffset" : 1495, "_id" : { "$oid" : "5088238cc20220020000000f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099276367 }, "created" : { "$date" : 1351099276367 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088239a2d29030200000012", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "He admits to doing evil deeds, does his upbringing really give him just reason to do so.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I have strangled the innocent as they \nslept, and grasped to death his throat who never injured me or any other living \nthing.", "uuid" : "B1E2EC5B", "_id" : { "$oid" : "5088239a2d29030200000012" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[788]", "startOffset" : 83, "end" : "/div[1]/p[788]", "endOffset" : 209, "_id" : { "$oid" : "5088239a2d29030200000013" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099290511 }, "created" : { "$date" : 1351099290511 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508823c1c202200200000010", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "He tries to justify his actions, just as Lucifer did in Paradise Lost", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Was there no injustice in \nthis? Am I to be thought the only criminal when all human kind sinned against \nme?", "uuid" : "B08367CE", "_id" : { "$oid" : "508823c1c202200200000010" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[787]", "startOffset" : 417, "end" : "/div[1]/p[787]", "endOffset" : 526, "_id" : { "$oid" : "508823c1c202200200000011" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099329153 }, "created" : { "$date" : 1351099329153 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508823c22d29030200000014", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "So unlike Wordsworth in Tintern Abbey, who turns to Nature to escape the Fever of the world. You try, but can not succeed .", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "The weather was uncommonly fine; and if mine had been a sorrow to be chased away \nby any fleeting circumstances, this excursion would certainly have had the \neffect intended by my father. As it was, I was somewhat interested in the scene; \nit sometimes lulled, although it could not extinguish my grief.", "uuid" : "7B85E986", "_id" : { "$oid" : "508823c22d29030200000014" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[305]", "startOffset" : 1, "end" : "/div[1]/p[305]", "endOffset" : 305, "_id" : { "$oid" : "508823c22d29030200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099330389 }, "created" : { "$date" : 1351099330389 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508823dcc202200200000012", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "The monster truly sets out on his quest for revenge. another chance to see the parallels between satan and the monster. both satan and the monster were rejected by their creators, making them vengeful ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "For the first time the \nfeelings of revenge and hatred filled my bosom, and I did not strive to control \nthem; but, allowing myself to be borne away by the stream, I bent my mind \ntowards injury and death.", "uuid" : "DE84CD5F", "_id" : { "$oid" : "508823dcc202200200000012" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[456]", "startOffset" : 181, "end" : "/div[1]/p[456]", "endOffset" : 386, "_id" : { "$oid" : "508823dcc202200200000013" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099356115 }, "created" : { "$date" : 1351099356115 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508823e02d29030200000018", "user" : "njl@mit.edu", "username" : "Nicholas L.", "text" : "The creature demonstrates his manual labor skill of woodchopping. Oblique reference to Emile learning carpentry as part of his education.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "\"I discovered also another means through which I \nwas enabled to assist their labours. I found that the youth spent a great part \nof each day in collecting woo for the family fire; and, during the night, I \noften took his tools, the use of which I quickly discovered, and brought home \nfiring sufficient for the consumption of several days.", "uuid" : "ADCB9958", "_id" : { "$oid" : "508823e02d29030200000018" }, "permissions" : { "delete" : [ "njl@mit.edu" ], "update" : [ "njl@mit.edu" ], "admin" : [ "njl@mit.edu" ], "read" : [ "njl@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[352]", "startOffset" : 1, "end" : "/div[1]/p[352]", "endOffset" : 341, "_id" : { "$oid" : "508823e02d29030200000019" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099360000 }, "created" : { "$date" : 1351099360000 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508823ea2d2903020000001a", "user" : "mikaelm@mit.edu", "username" : "Mikael M.", "text" : "The monster was able to expand the potential of his mind by reading these books and learning about the various stories. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "\"I can hardly describe to you the effect of these \nbooks. They produced in me an infinity of new images and feelings that sometimes \nraised me to ecstasy,", "uuid" : "6E5F5C95", "_id" : { "$oid" : "508823ea2d2903020000001a" }, "permissions" : { "delete" : [ "mikaelm@mit.edu" ], "update" : [ "mikaelm@mit.edu" ], "admin" : [ "mikaelm@mit.edu" ], "read" : [ "mikaelm@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[410]", "startOffset" : 1, "end" : "/div[1]/p[410]", "endOffset" : 156, "_id" : { "$oid" : "508823ea2d2903020000001b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099370889 }, "created" : { "$date" : 1351099370889 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508823fec202200200000014", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Victor's fascination with electricity starts at an early age, the same energy that Davy credits as possibly revealing the secrets of life. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "The catastrophe of this tree excited my extreme astonishment; and I eagerly \ninquired of my father the nature and origin of thunder and lightning. He \nreplied, \"\nElectricity;\" \ndescribing at the same time the various effects of that power. He constructed a \nsmall electrical machine, and exhibited a few experiments; he made also a\nkite, \nwith a wire and string, which drew down that fluid from the clouds.", "uuid" : "194D95B2", "_id" : { "$oid" : "508823fec202200200000014" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[115]", "startOffset" : 0, "end" : "/div[1]/p[115]", "endOffset" : 406, "_id" : { "$oid" : "508823fec202200200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099390507 }, "created" : { "$date" : 1351099390507 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50882400c202200200000016", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "So much ice and so little green? What is Shelley trying to say?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : ". Immense glaciers approached the road;", "uuid" : "20CA5E16", "_id" : { "$oid" : "50882400c202200200000016" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[307]", "startOffset" : 449, "end" : "/div[1]/p[307]", "endOffset" : 489, "_id" : { "$oid" : "50882400c202200200000017" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099392990 }, "created" : { "$date" : 1351099392990 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508824032d2903020000001c", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "Creature is aware of the power of language- how language has the power to sway people.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "voice", "uuid" : "D13CD3EE", "_id" : { "$oid" : "508824032d2903020000001c" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "Sorrows", "of", "Young", "Werther" ], "ranges" : [ { "start" : "/div[1]/p[419]", "startOffset" : 509, "end" : "/div[1]/p[419]", "endOffset" : 514, "_id" : { "$oid" : "508824032d2903020000001d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099395779 }, "created" : { "$date" : 1351099395779 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088241a2d2903020000001e", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "the monster suggested that Elizabeth is more good looking than Justine", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "beautiful", "uuid" : "86203DD8", "_id" : { "$oid" : "5088241a2d2903020000001e" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[479]", "startOffset" : 211, "end" : "/div[1]/p[479]", "endOffset" : 220, "_id" : { "$oid" : "5088241a2d2903020000001f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099418878 }, "created" : { "$date" : 1351099418878 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50882420c202200200000018", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "This is true we do not know of the entirety of the creatures troubles, we only see things from the point of view of Victor and others. On that note we may not truly know if the feelings of the creature are genuine, or if like Lucifer the creature is simply majestic in his words", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "he could not sum up the hours and months of misery which I \nendured, wasting in impotent passions", "uuid" : "33B324F3", "_id" : { "$oid" : "50882420c202200200000018" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[787]", "startOffset" : 147, "end" : "/div[1]/p[787]", "endOffset" : 244, "_id" : { "$oid" : "50882420c202200200000019" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099424927 }, "created" : { "$date" : 1351099424927 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088242c2d29030200000020", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Not joy is it? Only a shadow that you are allowed to feel to remind you of your loss.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "something", "uuid" : "0A90EEA6", "_id" : { "$oid" : "5088242c2d29030200000020" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[314]", "startOffset" : 1013, "end" : "/div[1]/p[314]", "endOffset" : 1022, "_id" : { "$oid" : "5088242c2d29030200000021" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099436099 }, "created" : { "$date" : 1351099436099 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088242e2d29030200000022", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "disappointment from the creatures lack of aesthetic pleasantries\nshows how self centered victor is and the difference between him and god because god is a good person (being?)", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I felt the bitterness of disappointment: dreams that had been my \nfood and pleasant rest for so long a space, were now become a hell to me;", "uuid" : "74EC21F7", "_id" : { "$oid" : "5088242e2d29030200000022" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[158]", "startOffset" : 228, "end" : "/div[1]/p[158]", "endOffset" : 369, "_id" : { "$oid" : "5088242e2d29030200000023" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099438090 }, "created" : { "$date" : 1351099438090 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508824352d29030200000024", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I abhorred myself", "uuid" : "7C2E15D7", "_id" : { "$oid" : "508824352d29030200000024" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[784]", "startOffset" : 135, "end" : "/div[1]/p[784]", "endOffset" : 152, "_id" : { "$oid" : "508824352d29030200000025" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099445147 }, "created" : { "$date" : 1351099445147 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50882442c20220020000001a", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "They reigned as lords of Victor's imagination because they too were captured by their respective imaginations.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "This last stroke completed the overthrow of\nCornelius Agrippa,\nAlbertus Magnus, and\nParacelsus, who had so long reigned the lords of my imagination. But by some \nfatality I did not feel inclined to commence the study of any modern system; and \nthis disinclination was influenced by the following circumstance.", "uuid" : "90B9B045", "_id" : { "$oid" : "50882442c20220020000001a" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[116]", "startOffset" : 0, "end" : "/div[1]/p[116]", "endOffset" : 309, "_id" : { "$oid" : "50882442c20220020000001b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099458281 }, "created" : { "$date" : 1351099458281 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508824462d29030200000026", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "Reading increases his awareness of his place in society", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "wretched", "uuid" : "8280E28B", "_id" : { "$oid" : "508824462d29030200000026" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[416]", "startOffset" : 521, "end" : "/div[1]/p[416]", "endOffset" : 529, "_id" : { "$oid" : "508824462d29030200000027" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099462037 }, "created" : { "$date" : 1351099462037 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088244c2d29030200000028", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "mentions the story of Colombus and the egg when explaining the creativity behind her work. She proposes that invention is birthed out of chaos and not out of null and void. Shelley’s view contradicts the Romantic view of invention which believes creativity is birth out of nothingness as a spark that just goes off in the mind.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "he \nstory of Columbus and his egg. Invention consists in the capacity of seizing \non the capabilities of a subject, and in the power of moulding and fashioning \nideas suggested to it.", "uuid" : "26789F03", "_id" : { "$oid" : "5088244c2d29030200000028" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[16]", "startOffset" : 615, "end" : "/div[1]/p[16]", "endOffset" : 798, "_id" : { "$oid" : "5088244c2d29030200000029" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099468926 }, "created" : { "$date" : 1351099468926 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088245d2d2903020000002a", "user" : "njl@mit.edu", "username" : "Nicholas L.", "text" : "Creature has natural urge to find mate. Rousseau discusses this greatly in Emile, regarding a female counterpart as the ultimate step in education.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "\"Shall each man,\" cried he, \"find a \nwife for his bosom, and each beast have his mate, and I be alone?", "uuid" : "FC2FF6BA", "_id" : { "$oid" : "5088245d2d2903020000002a" }, "permissions" : { "delete" : [ "njl@mit.edu" ], "update" : [ "njl@mit.edu" ], "admin" : [ "njl@mit.edu" ], "read" : [ "njl@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[567]", "startOffset" : 95, "end" : "/div[1]/p[567]", "endOffset" : 198, "_id" : { "$oid" : "5088245d2d2903020000002b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099485159 }, "created" : { "$date" : 1351099485159 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508824682d2903020000002c", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Shows the importance of Paradise lost", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "most especially Milton, in Paradise Lost, conform \nto this rule; and the most humble novelist", "uuid" : "9B5F901F", "_id" : { "$oid" : "508824682d2903020000002c" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 258, "end" : "/div[1]/p[3]", "endOffset" : 352, "_id" : { "$oid" : "508824682d2903020000002d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099496713 }, "created" : { "$date" : 1351099496713 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50882488c20220020000001c", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Part of his education", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Paradise Lost,", "uuid" : "EA517CB1", "_id" : { "$oid" : "50882488c20220020000001c" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[409]", "startOffset" : 427, "end" : "/div[1]/p[409]", "endOffset" : 442, "_id" : { "$oid" : "50882488c20220020000001d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099528887 }, "created" : { "$date" : 1351099528887 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50882495c20220020000001e", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "the creature means to study more before facing the cottagers", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "fit", "uuid" : "FB45BA0C", "_id" : { "$oid" : "50882495c20220020000001e" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[415]", "startOffset" : 494, "end" : "/div[1]/p[415]", "endOffset" : 497, "_id" : { "$oid" : "50882495c20220020000001f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099541695 }, "created" : { "$date" : 1351099541695 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508824a1c202200200000020", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "So much ice. Beautiful and yet sublime.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "the sea of ice. A \nmist covered both that and the surrounding mountains. Presently a breeze \ndissipated the cloud, and I descende upon the glacier. The surface is very \nuneven, rising like the waves of a troubled sea, descending low, and \ninterspersed by rifts that sink deep. The field of ice is almost a league in \nwidth, but I spent nearly two hours in crossing it. The opposite mountain is a \nbare perpendicular rock. From the side where I now stood Montanvert was exactly \nopposite, at the distance of a league; and above it rose Mont Blanc, in awful \nmajesty. I remained in a recess of the rock, gazing on this wonderful and \nstupendous scene. The sea, or rather the vast river of ice, wound among its \ndependent mountains, whose aerial summits hung over its recesses. Their icy and \nglittering peaks shone in the sunlight over the clouds.", "uuid" : "FD968A17", "_id" : { "$oid" : "508824a1c202200200000020" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[314]", "startOffset" : 111, "end" : "/div[1]/p[314]", "endOffset" : 956, "_id" : { "$oid" : "508824a1c202200200000021" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099553784 }, "created" : { "$date" : 1351099553784 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508824ad2d2903020000002e", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Its interesting that the egg was crushed to prove a point. This is similar to what Victor did by replacing natural childbearing with science", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "reminded", "uuid" : "8E3FF849", "_id" : { "$oid" : "508824ad2d2903020000002e" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[16]", "startOffset" : 602, "end" : "/div[1]/p[16]", "endOffset" : 611, "_id" : { "$oid" : "508824ad2d2903020000002f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099565127 }, "created" : { "$date" : 1351099565127 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508824ad2d29030200000030", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "wisdom used interchangeably with eloquence here", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "wisdom", "uuid" : "99A013E6", "_id" : { "$oid" : "508824ad2d29030200000030" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[415]", "startOffset" : 884, "end" : "/div[1]/p[415]", "endOffset" : 890, "_id" : { "$oid" : "508824ad2d29030200000031" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099565429 }, "created" : { "$date" : 1351099565429 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508824b2c202200200000022", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "to create an irony that suggested although the scenes around Victor is gorgeous, he is not in the mood of enjoying the scenes", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "beautiful", "uuid" : "10AC1E69", "_id" : { "$oid" : "508824b2c202200200000022" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[520]", "startOffset" : 432, "end" : "/div[1]/p[520]", "endOffset" : 441, "_id" : { "$oid" : "508824b2c202200200000023" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099570813 }, "created" : { "$date" : 1351099570813 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508824bfc202200200000024", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Shows the process of his physical learning, this chapter is full of examples of how his upbringing helped shape him", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "\"IT IS with considerable difficulty that I \nremember the original aera of being: all the events of that period appear confused and \nindistinct. A strange multiplicity of sensations seized me, and I saw, felt, \nheard, and smelt, at the same time; and it was, indeed, a long time before I \nlearned to distinguish between the operations of my various senses.", "uuid" : "601C4017", "_id" : { "$oid" : "508824bfc202200200000024" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[327]", "startOffset" : 1, "end" : "/div[1]/p[327]", "endOffset" : 356, "_id" : { "$oid" : "508824bfc202200200000025" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099583266 }, "created" : { "$date" : 1351099583266 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508824c92d29030200000032", "user" : "njl@mit.edu", "username" : "Nicholas L.", "text" : "Victor destroying the monster is the final straw to the creature's civility. Rousseau says that the finding of a mate \"makes or mars\" a life. Here, it has marred the creature's.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "The wretch saw me destroy the creature \non whose future existence he depended for happiness, and, with a howl of \ndevilish despair and revenge, withdrew.", "uuid" : "973CDFFB", "_id" : { "$oid" : "508824c92d29030200000032" }, "permissions" : { "delete" : [ "njl@mit.edu" ], "update" : [ "njl@mit.edu" ], "admin" : [ "njl@mit.edu" ], "read" : [ "njl@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[558]", "startOffset" : 249, "end" : "/div[1]/p[558]", "endOffset" : 403, "_id" : { "$oid" : "508824c92d29030200000033" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099593354 }, "created" : { "$date" : 1351099593354 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508824d72d29030200000034", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "•\tColombus returns from voyage.\n•\tAt a celebratory banquet a guest challenges the worth of his discoveries suggesting anyone else could have done it.\n•\tIn response, Colombus takes an egg and asks if anyone could make it stand on one end.\n•\tNo one is able to.\n•\tColombus then takes the egg and sets it down sharply on the table. This slightly cracks the shell and causes it to stand on end.\n•\tMoral: Tasks that look difficult or even impossible look easy once someone has mastered them.\n", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Columbu", "uuid" : "14AC704D", "_id" : { "$oid" : "508824d72d29030200000034" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[16]", "startOffset" : 628, "end" : "/div[1]/p[16]", "endOffset" : 635, "_id" : { "$oid" : "508824d72d29030200000035" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099607693 }, "created" : { "$date" : 1351099607693 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508824dfc202200200000026", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Wonderful thought for a scientist!", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "how \ndangerous is the acquirement of knowledge,", "uuid" : "16E918D4", "_id" : { "$oid" : "508824dfc202200200000026" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[145]", "startOffset" : 454, "end" : "/div[1]/p[145]", "endOffset" : 501, "_id" : { "$oid" : "508824dfc202200200000027" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099615671 }, "created" : { "$date" : 1351099615671 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508824e72d29030200000036", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "just to describe a wonderful town. nothing special.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "beautiful", "uuid" : "35D818B6", "_id" : { "$oid" : "508824e72d29030200000036" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[522]", "startOffset" : 188, "end" : "/div[1]/p[522]", "endOffset" : 197, "_id" : { "$oid" : "508824e72d29030200000037" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099623983 }, "created" : { "$date" : 1351099623983 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508824f6c202200200000028", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "So unlike Dorothy being taught by William", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Learn from me, if not by my precepts, at least by my example,", "uuid" : "C83CE46F", "_id" : { "$oid" : "508824f6c202200200000028" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[145]", "startOffset" : 392, "end" : "/div[1]/p[145]", "endOffset" : 453, "_id" : { "$oid" : "508824f6c202200200000029" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099638193 }, "created" : { "$date" : 1351099638193 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508825122d29030200000038", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "Plutarch was the monster's first exposure to the history of people and to a world other than his own.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "but Plutarch \ntaught me high thoughts; he elevated me above the wretched sphere of my own \nreflections to admire and love the heroes of past ages.", "uuid" : "7394A032", "_id" : { "$oid" : "508825122d29030200000038" }, "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[412]", "startOffset" : 259, "end" : "/div[1]/p[412]", "endOffset" : 405, "_id" : { "$oid" : "508825122d29030200000039" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099666898 }, "created" : { "$date" : 1351099666898 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088251f2d2903020000003a", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Along with her laws as well. Double betrayal?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "my eyes were insensible to the charms of nature", "uuid" : "51A19BE8", "_id" : { "$oid" : "5088251f2d2903020000003a" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[149]", "startOffset" : 220, "end" : "/div[1]/p[149]", "endOffset" : 268, "_id" : { "$oid" : "5088251f2d2903020000003b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099679327 }, "created" : { "$date" : 1351099679327 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50882522c20220020000002a", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "He relates most with this", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "\"But Paradise Lost excited different and far \ndeeper emotions", "uuid" : "99EA94E4", "_id" : { "$oid" : "50882522c20220020000002a" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[413]", "startOffset" : 1, "end" : "/div[1]/p[413]", "endOffset" : 62, "_id" : { "$oid" : "50882522c20220020000002b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099682989 }, "created" : { "$date" : 1351099682989 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50882526c20220020000002c", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Here, Mary Shelley uses beautiful to describe the wind, which is somewhat interesting", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "beautiful", "uuid" : "7E00A304", "_id" : { "$oid" : "50882526c20220020000002c" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[522]", "startOffset" : 461, "end" : "/div[1]/p[522]", "endOffset" : 470, "_id" : { "$oid" : "50882526c20220020000002d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099686026 }, "created" : { "$date" : 1351099686026 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088253cc20220020000002e", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Such was the case with her...she listened in on convos between Lord Byron and her husband and this sparked her imagination.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Invention, it must be humbly admitted, does \nnot consist in creating out of void, but out of chaos; the materials must, in \nthe first place, be afforded: it can give form to dark, shapeless substances, \nbut cannot bring into being the substance itself", "uuid" : "73886378", "_id" : { "$oid" : "5088253cc20220020000002e" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[16]", "startOffset" : 236, "end" : "/div[1]/p[16]", "endOffset" : 487, "_id" : { "$oid" : "5088253cc20220020000002f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099708214 }, "created" : { "$date" : 1351099708214 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088253dc202200200000030", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Atoms are abstract concepts, difficult for Victor to grasp, and thus, he became \"\"disgusted with the science of natural philosophy\"", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "greatest fluency \nof potassium and boron, of sulphates and oxyds, terms to which I could affix no \nidea; and I became disgusted with the science of natural philosophy, although I \nstill read Pliny \nand\nBuffon with delight, authors, in my estimation, of nearly equal interest and\nutility.", "uuid" : "C2C4EB86", "_id" : { "$oid" : "5088253dc202200200000030" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[117]", "startOffset" : 337, "end" : "/div[1]/p[117]", "endOffset" : 625, "_id" : { "$oid" : "5088253dc202200200000031" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099709629 }, "created" : { "$date" : 1351099709629 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088254e2d2903020000003c", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "similar to William here.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "sights which before always yielded \nme supreme delight, so deeply was I engrossed in my occupation", "uuid" : "43D0DC2B", "_id" : { "$oid" : "5088254e2d2903020000003c" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[153]", "startOffset" : 262, "end" : "/div[1]/p[153]", "endOffset" : 360, "_id" : { "$oid" : "5088254e2d2903020000003d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099726933 }, "created" : { "$date" : 1351099726933 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50882565c202200200000032", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Says he is like Adam", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Like Adam", "uuid" : "9014B1C2", "_id" : { "$oid" : "50882565c202200200000032" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[413]", "startOffset" : 375, "end" : "/div[1]/p[413]", "endOffset" : 384, "_id" : { "$oid" : "50882565c202200200000033" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099749164 }, "created" : { "$date" : 1351099749164 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508825672d2903020000003f", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "to describe the scenes of victor's country.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "beautiful", "uuid" : "1BFD2F9E", "_id" : { "$oid" : "508825672d2903020000003f" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[523]", "startOffset" : 565, "end" : "/div[1]/p[523]", "endOffset" : 575, "_id" : { "$oid" : "508825672d29030200000040" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099751489 }, "created" : { "$date" : 1351099751489 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088257c2d29030200000041", "user" : "njl@mit.edu", "username" : "Nicholas L.", "text" : "Shelley exploring the boundaries of life and death. Deviating from Rousseau in his strict beliefs on the finality of inanimation.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Whence, I often asked myself, did the principle of life proceed? It \nwas a bold question, and one which has ever been considered as a mystery; yet \nwith how many things are we upon the brink of becoming acquainted, if cowardice \nor carelessness did not restrain our inquiries.", "uuid" : "7DE7F876", "_id" : { "$oid" : "5088257c2d29030200000041" }, "permissions" : { "delete" : [ "njl@mit.edu" ], "update" : [ "njl@mit.edu" ], "admin" : [ "njl@mit.edu" ], "read" : [ "njl@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[142]", "startOffset" : 147, "end" : "/div[1]/p[142]", "endOffset" : 423, "_id" : { "$oid" : "5088257c2d29030200000042" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099772155 }, "created" : { "$date" : 1351099772155 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088259f2d29030200000043", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "Interesting considering the monster would give into the vice of his own revenge and throw away whatever virtue that he learned from Plutarch.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I felt the greatest \nardour for virtue rise within me, and abhorrence for vice,", "uuid" : "216EF6A9", "_id" : { "$oid" : "5088259f2d29030200000043" }, "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[412]", "startOffset" : 886, "end" : "/div[1]/p[412]", "endOffset" : 965, "_id" : { "$oid" : "5088259f2d29030200000044" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099807813 }, "created" : { "$date" : 1351099807813 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508825a6c202200200000034", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "She was the one who actually came up with it", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Have you thought of a \nstory", "uuid" : "261A1297", "_id" : { "$oid" : "508825a6c202200200000034" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]/i[2]", "startOffset" : 0, "end" : "/div[1]/p[15]/i[2]", "endOffset" : 28, "_id" : { "$oid" : "508825a6c202200200000035" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099814581 }, "created" : { "$date" : 1351099814581 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508825ac2d29030200000045", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Relates with the evil creature", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Many times I considered Satan as the fitter \nemblem of my condition; for often, like him, when I viewed the bliss of my \nprotectors, the bitter gall of envy rose within me.", "uuid" : "67C85D30", "_id" : { "$oid" : "508825ac2d29030200000045" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[413]", "startOffset" : 783, "end" : "/div[1]/p[413]", "endOffset" : 955, "_id" : { "$oid" : "508825ac2d29030200000046" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099820581 }, "created" : { "$date" : 1351099820581 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508825e7c202200200000036", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "Powerful irony, is it being used to make the reader sympathetic with the creature or something else?", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I was of course led \nto admire peaceable lawgivers, Numa, Solon, and Lycurgus, in preference to \nRomulus and Theseus.", "uuid" : "CDFE3F20", "_id" : { "$oid" : "508825e7c202200200000036" }, "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[412]", "startOffset" : 1122, "end" : "/div[1]/p[412]", "endOffset" : 1240, "_id" : { "$oid" : "508825e7c202200200000037" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099879750 }, "created" : { "$date" : 1351099879750 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508825e82d29030200000047", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "Creature is made aware of his being unloved.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "father", "uuid" : "815C3C98", "_id" : { "$oid" : "508825e82d29030200000047" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "sorrows", "of", "young", "werther" ], "ranges" : [ { "start" : "/div[1]/p[385]", "startOffset" : 47, "end" : "/div[1]/p[385]", "endOffset" : 53, "_id" : { "$oid" : "508825e82d29030200000048" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099880492 }, "created" : { "$date" : 1351099880492 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508825fd2d29030200000049", "user" : "mikaelm@mit.edu", "username" : "Mikael M.", "text" : "It's sad that the blind man treats the monster normally, implying that it is only his appearance that turns society away from him. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "\"'Do not despair. To be friendless is indeed to \nbe unfortunate; but the hearts of men, when unprejudiced by any obvious \nself-interest, are full of brotherly love and charity. Rely, therefore, on your \nhopes; and if these friends are good and amiable, do not despair.'", "uuid" : "35BEED63", "_id" : { "$oid" : "508825fd2d29030200000049" }, "permissions" : { "delete" : [ "mikaelm@mit.edu" ], "update" : [ "mikaelm@mit.edu" ], "admin" : [ "mikaelm@mit.edu" ], "read" : [ "mikaelm@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[431]", "startOffset" : 1, "end" : "/div[1]/p[432]", "endOffset" : 0, "_id" : { "$oid" : "508825fd2d2903020000004a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099901808 }, "created" : { "$date" : 1351099901808 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508825fd2d2903020000004b", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "direct quote from the ancient mariner. It's interesting that Shelley places this quote in this place because this is the point in The Rime of the Ancient Mariner that the Mariner is seemingly relieved of his curse, and repents", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Like one who, on a lonely road,\n   Doth walk in \nfear and dread,\nAnd, having once \nturn'd round, walks on,\n   And turns no \nmore his head;\nBecause he knows a \nfrightful fiend\n   Doth close \nbehind him tread.", "uuid" : "891FE35C", "_id" : { "$oid" : "508825fd2d2903020000004b" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[161]", "startOffset" : 0, "end" : "/div[1]/p[166]", "endOffset" : 32, "_id" : { "$oid" : "508825fd2d2903020000004c" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351099901989 }, "created" : { "$date" : 1351099901989 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508826842d2903020000004d", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Shows his kindness before his great rejections", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "another means through which I \nwas enabled to assist their labours. I found that the youth spent a great part \nof each day in collecting woo for the family fire; and, during the night, I \noften took his tools, the use of which I quickly discovered, and brought home \nfiring sufficient for the consumption of several days.", "uuid" : "3DAB9210", "_id" : { "$oid" : "508826842d2903020000004d" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[352]", "startOffset" : 20, "end" : "/div[1]/p[352]", "endOffset" : 341, "_id" : { "$oid" : "508826842d2903020000004e" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351100036673 }, "created" : { "$date" : 1351100036673 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088269ac202200200000038", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "he only experienced humanity through a looking glass, but when he reaches out to people for the first time he experiences violence and rage, perhaps Mary is using this to explain how the monster became evil.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "perhaps, if my first introduction to \nhumanity had been made by a young soldier, burning for glory and slaughter, I \nshould have been imbued with different sensations.", "uuid" : "A14BDE20", "_id" : { "$oid" : "5088269ac202200200000038" }, "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[412]", "startOffset" : 1336, "end" : "/div[1]/p[412]", "endOffset" : 1504, "_id" : { "$oid" : "5088269ac202200200000039" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351100058519 }, "created" : { "$date" : 1351100058519 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508826a5c20220020000003a", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Shows he has remorse and empathy", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "when I found that in doing this I inflicted pain on the \ncottagers, I abstained", "uuid" : "79919499", "_id" : { "$oid" : "508826a5c20220020000003a" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[351]", "startOffset" : 145, "end" : "/div[1]/p[351]", "endOffset" : 224, "_id" : { "$oid" : "508826a5c20220020000003b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351100069435 }, "created" : { "$date" : 1351100069435 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508826ee2d2903020000004f", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Eyes mirror to the soul", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "looking on him with yellow, watery, but \n speculative eyes", "uuid" : "62133A1C", "_id" : { "$oid" : "508826ee2d2903020000004f" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 1536, "end" : "/div[1]/p[18]", "endOffset" : 1599, "_id" : { "$oid" : "508826ee2d29030200000050" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351100142216 }, "created" : { "$date" : 1351100142216 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088280e2d29030200000051", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Devilish feelings", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "howl of \ndevilish despair and revenge, withdrew.", "uuid" : "8905B314", "_id" : { "$oid" : "5088280e2d29030200000051" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[558]", "startOffset" : 354, "end" : "/div[1]/p[558]", "endOffset" : 403, "_id" : { "$oid" : "5088280e2d29030200000052" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351100430739 }, "created" : { "$date" : 1351100430739 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088282ec20220020000003c", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Ghastly ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "A \nghastly grin", "uuid" : "6F9C5BEB", "_id" : { "$oid" : "5088282ec20220020000003c" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[557]", "startOffset" : 126, "end" : "/div[1]/p[557]", "endOffset" : 142, "_id" : { "$oid" : "5088282ec20220020000003d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351100462101 }, "created" : { "$date" : 1351100462101 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508829bfc202200200000040", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Her husband wasnt feminist.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "My \nhusband, however, was from the first, very anxious that I should prove \nmyself\nworthy of my parentage", "uuid" : "378A0BBF", "_id" : { "$oid" : "508829bfc202200200000040" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 73, "end" : "/div[1]/p[11]", "endOffset" : 178, "_id" : { "$oid" : "508829bfc202200200000041" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351100888100 }, "created" : { "$date" : 1351100863205 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "508829efc202200200000042" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1351100911529 }, "groups" : [ "21L.000J" ], "id" : "508829efc202200200000042", "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "quote" : "Travelling, and the cares of a family, occupied my time;", "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 617, "end" : "/div[1]/p[11]", "endOffset" : 674, "_id" : { "$oid" : "508829efc202200200000043" } } ], "tags" : [], "text" : "Duties of a woman.....or so they say", "updated" : { "$date" : 1351100924894 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "uuid" : "7E636532" } -{ "id" : "50882a06c202200200000044", "user" : "mikaelm@mit.edu", "username" : "Mikael M.", "text" : "This is a demonstration of the monsters point of contemplation that parallels Hamlet's. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "\"CURSED, cursed creator! Why did I live? Why, in \nthat instant, did I not extinguish the spark of existence which you had so \nwantonly bestowed? I know not; despair had not yet taken possession of me; my \nfeelings were those of rage and revenge. I could with pleasure have destroyed \nthe cottage and its inhabitants, and have glutted myself with their shrieks and \nmisery", "uuid" : "066A909B", "_id" : { "$oid" : "50882a06c202200200000044" }, "permissions" : { "delete" : [ "mikaelm@mit.edu" ], "update" : [ "mikaelm@mit.edu" ], "admin" : [ "mikaelm@mit.edu" ], "read" : [ "mikaelm@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[445]", "startOffset" : 1, "end" : "/div[1]/p[445]", "endOffset" : 372, "_id" : { "$oid" : "50882a06c202200200000045" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351100934014 }, "created" : { "$date" : 1351100934014 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50882a5bc202200200000048", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I saw the hideous phantasm of a man stretched out, and \n then, on\n the working of some powerful engine, show signs of life, and stir with \n an uneasy, half vital motion.", "uuid" : "D65B70EC", "_id" : { "$oid" : "50882a5bc202200200000048" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 528, "end" : "/div[1]/p[18]", "endOffset" : 713, "_id" : { "$oid" : "50882a5bc202200200000049" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351101019767 }, "created" : { "$date" : 1351101019767 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50882aabc20220020000004a", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "So similar to the scene where Victor see his dead mother.....I think this is where she got her inspiration", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "There was the History of \nthe Inconstant Lover, who, when he thought to clasp the bride to whom he had \npledged his vows, found himself in the arms of the pale ghost of her whom he had \ndeserted.", "uuid" : "E8CCEB15", "_id" : { "$oid" : "50882aabc20220020000004a" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 194, "end" : "/div[1]/p[13]", "endOffset" : 389, "_id" : { "$oid" : "50882aabc20220020000004b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351101099919 }, "created" : { "$date" : 1351101099919 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50882be7c20220020000004c", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "An apparition, spirit, or ghost; a visible but incorporeal being. Now arch. and rare", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "phantasm", "uuid" : "0A403651", "_id" : { "$oid" : "50882be7c20220020000004c" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 546, "end" : "/div[1]/p[18]", "endOffset" : 554, "_id" : { "$oid" : "50882be7c20220020000004d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351101415398 }, "created" : { "$date" : 1351101415398 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "50882dab2d29030200000053" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1351101867055 }, "groups" : [ "21L.000J" ], "id" : "50882dab2d29030200000053", "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "quote" : "Every thing must have a beginning, to speak in \nSanchean phrase; and that beginning must be linked to something that went \nbefore.", "ranges" : [ { "start" : "/div[1]/p[16]", "startOffset" : 0, "end" : "/div[1]/p[16]", "endOffset" : 130, "_id" : { "$oid" : "5089906d77194f0200000006" } } ], "tags" : [ "reference" ], "text" : "Direct reference to Don Quixote, most likely to Sancho's line that states, \"...in my opinion, as the the business of governing, the whole lies in the beginning.\" This is interesting to contemplate because the way Shelley words her sentence, it appears as though she is trying to justify her incorporation of a multitude of ideas and texts into Frankenstein. I guess it could also be looked at in the way that she is recognizing the origins of the concepts in her novel by redefining the term \"Sanchean phrase\". Miguel Cervantes would most likely define the term in relation to Don Quixote, as simply speaking in parables like Sancho Panza. However, Shelley appears to be creating a new definition that goes beneath the surface of the narration by implying that Sancho didn't just say words that other people had said, he pulled ideas from the past in the form of the parables and applied them to his current situation in order to better convey his thoughts to Don Quixote. In a similar way, Shelley integrates different texts and ideas into her own novel that give readers a more clear understanding of what she is trying to convey and makes readers really contemplate the events that occur. But I digress. These observations are things that we have gone over in class and that would be obvious to most readers with a little knowledge on the subject. I think the real significance behind this reference to Don Quixote lies in the connections between the concepts embedded in each of the novels that the reference prompts us to explore.", "updated" : { "$date" : 1351195291549 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "uuid" : "3B76BF1D" } -{ "id" : "508831dcc20220020000004e", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Felt the need to prove herself", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I busied myself to think of a story, -- a story to rival those which \nhad excited us to this task", "uuid" : "7EFE448E", "_id" : { "$oid" : "508831dcc20220020000004e" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 0, "end" : "/div[1]/p[15]", "endOffset" : 97, "_id" : { "$oid" : "508831dcc20220020000004f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351102940427 }, "created" : { "$date" : 1351102940427 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5088599c2d29030200000055" }, "id" : "5088599c2d29030200000055", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "The cottagers gave the monster a sense of class struggle, which impressed onto him his early views of mankind.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "SUCH was the history of my beloved cottagers. It \nimpressed me deeply. I learned, from the views of social life which it \ndeveloped, to admire their virtues, and to deprecate the vices of mankind.", "uuid" : "4650EE60", "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[407]", "startOffset" : 2, "end" : "/div[1]/p[407]", "endOffset" : 198, "_id" : { "$oid" : "5088599c2d29030200000056" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351113116272 }, "created" : { "$date" : 1351113116272 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50885db82d29030200000057", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "happy, as if an all-consuming curse has been lifted", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Nothing could equal my delight on seeing Clerval", "uuid" : "7331C8C0", "_id" : { "$oid" : "50885db82d29030200000057" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[168]", "startOffset" : 0, "end" : "/div[1]/p[168]", "endOffset" : 48, "_id" : { "$oid" : "50885db82d29030200000058" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351114168579 }, "created" : { "$date" : 1351114168579 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50885de52d29030200000059", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "corpses reawakened like in the Ancient Mariner", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "His jaws opened, and he muttered some inarticulate sounds, while a grin wrinkled \nhis cheeks", "uuid" : "A7873AAC", "_id" : { "$oid" : "50885de52d29030200000059" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[156]", "startOffset" : 1641, "end" : "/div[1]/p[156]", "endOffset" : 1733, "_id" : { "$oid" : "50885de52d2903020000005a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351114213325 }, "created" : { "$date" : 1351114213325 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088a5dcc202200200000050", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Locke Idea", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "found a \nfire which had been left by some wandering beggars, and was overcome with \ndelight at the warmth I experienced from it. In my joy I thrust my hand into the \nlive embers, but quickly drew it out again with a cry of pain. How strange, I \nthought, that the same cause should produce such opposite effects!", "uuid" : "EC8080AA", "_id" : { "$oid" : "5088a5dcc202200200000050" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[332]", "startOffset" : 42, "end" : "/div[1]/p[332]", "endOffset" : 354, "_id" : { "$oid" : "5088a5dcc202200200000051" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351132636274 }, "created" : { "$date" : 1351132636274 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088ada0c202200200000052", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Education", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "I was of course led \nto admire peaceable lawgivers, Numa, Solon, and Lycurgus, in preference to \nRomulus and Theseus. The patriarchal lives of my protectors caused these \nimpressions to take a firm hold on my mind; perhaps, if my first introduction to \nhumanity had been made by a young soldier, burning for glory and slaughter, I \nshould have been imbued with different sensations.", "uuid" : "4CFB5205", "_id" : { "$oid" : "5088ada0c202200200000052" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[412]", "startOffset" : 1121, "end" : "/div[1]/p[412]", "endOffset" : 1504, "_id" : { "$oid" : "5088ada0c202200200000053" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351134624875 }, "created" : { "$date" : 1351134624875 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088b7b5c202200200000054", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Parallels Davy's statement, \"These views of things have passed away, and a new science has gradually arisen. The dim and uncertain twilight of discovery, which gave to objects false or indefinite appearances, has been succeeded by the steady light of truth, which has shown the external world in its distinct forms, and in its true relations to human powers.\" They penetrate the hard exterior of the universe to reveal the gooey and delicious mathematical expressions within.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "But these philosophers, whose hands seem only made to dabble in dirt, \nand their eyes to pore over the microscope or crucible, have indeed performed \nmiracles. They penetrate into the recesses of nature, and shew how she works in \nher hiding places.", "uuid" : "DAFAD82C", "_id" : { "$oid" : "5088b7b5c202200200000054" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[135]", "startOffset" : 228, "end" : "/div[1]/p[135]", "endOffset" : 477, "_id" : { "$oid" : "5088b7b5c202200200000055" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351137205478 }, "created" : { "$date" : 1351137205478 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088b7e62d2903020000005b", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Power trip. Davy has the same power trip. \"The composition of the atmosphere, and the properties of the gases, have been ascertained; the phænomena of electricity have been developed; the lightnings have been taken from the clouds; and lastly, a new influence has been discovered, which has enabled man to produce from combinations of dead matter effects which were formerly occasioned only by animal organs.\" Davy even begins talking about Frankenstein's area of research. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "They have acquired new \nand almost unlimited powers; they can command the thunders of heaven, mimic the \nearthquake, and even mock the invisible world with its own shadows.\"", "uuid" : "BA66C3D7", "_id" : { "$oid" : "5088b7e62d2903020000005b" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[135]", "startOffset" : 594, "end" : "/div[1]/p[135]", "endOffset" : 767, "_id" : { "$oid" : "5088b7e62d2903020000005c" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351137254336 }, "created" : { "$date" : 1351137254336 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088b817c202200200000056", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "The paragraph following in the 1831 edition reveals Frankenstein's moment of revelation after listening to Waldman's lecture. “Such were the professor's words rather let me say such the words of fate, enounced to destroy me. As he went on, I felt as if my soul were grappling with a palpable enemy ; one by one the various keys were touched which formed the mechanism of my being : chord after chord was sounded, and soon my mind was filled with one thought, one conception, one purpose.”", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "\"", "uuid" : "23F5F53D", "_id" : { "$oid" : "5088b817c202200200000056" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[135]", "startOffset" : 766, "end" : "/div[1]/p[135]", "endOffset" : 767, "_id" : { "$oid" : "5088b817c202200200000057" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351137303584 }, "created" : { "$date" : 1351137303584 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088b83ec202200200000058", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "This is the same way Elements of Chemical Philosophy begins. Only... He goes on for a REALLY LONG TIME talking about each scientist in history. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "He \nbegan his lecture by a recapitulation of the history of chemistry, and the \nvarious improvements made by different men of learning, pronouncing with fervour \nthe names of the most distinguished discoverers.", "uuid" : "35B83707", "_id" : { "$oid" : "5088b83ec202200200000058" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[134]", "startOffset" : 449, "end" : "/div[1]/p[134]", "endOffset" : 659, "_id" : { "$oid" : "5088b83ec202200200000059" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351137342070 }, "created" : { "$date" : 1351137342070 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088b84e2d2903020000005d", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Like honey.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "sweetest I had ever heard.", "uuid" : "D7B4A4DD", "_id" : { "$oid" : "5088b84e2d2903020000005d" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[134]", "startOffset" : 421, "end" : "/div[1]/p[134]", "endOffset" : 448, "_id" : { "$oid" : "5088b84e2d2903020000005e" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351137358362 }, "created" : { "$date" : 1351137358362 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5088b86d2d2903020000005f" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1351137389818 }, "groups" : [ "21L.000J" ], "id" : "5088b86d2d2903020000005f", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "quote" : "\"these were men \nto whose indefatigable zeal modern philosophers were indebted for most of the \nfoundations of their knowledge. They had left to us, as an easier task, to give \nnew names,", "ranges" : [ { "start" : "/div[1]/p[136]", "startOffset" : 519, "end" : "/div[1]/p[136]", "endOffset" : 706, "_id" : { "$oid" : "5088b86d2d29030200000060" } } ], "tags" : [], "text" : "He's thankful for their work, but he holds reservations about their work as SCIENTISTS. Davy expresses the same reservation in both texts. ", "updated" : { "$date" : 1351137407628 }, "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "user" : "nhall@mit.edu", "username" : "Richard H.", "uuid" : "8239411B" } -{ "id" : "5088b8dac20220020000005a", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "\"[the ancient philosophers] failed not from a want of genius, or even of application, but merely because they pursued a false path\" Taken from Elements, more than just a paraphrasing.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "The labours of men of \ngenius, however erroneously directed,", "uuid" : "5210A464", "_id" : { "$oid" : "5088b8dac20220020000005a" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[136]", "startOffset" : 832, "end" : "/div[1]/p[136]", "endOffset" : 892, "_id" : { "$oid" : "5088b8dac20220020000005b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351137498787 }, "created" : { "$date" : 1351137498787 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088b908c20220020000005c", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "I suppose this is the 1818 edition's way of showing how Victor was heavily influenced by Waldman. ", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Thus ended a day memorable to me; it decided my future \ndestiny.", "uuid" : "D1E59E0B", "_id" : { "$oid" : "5088b908c20220020000005c" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[139]", "startOffset" : 0, "end" : "/div[1]/p[139]", "endOffset" : 64, "_id" : { "$oid" : "5088b908c20220020000005d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351137544354 }, "created" : { "$date" : 1351137544354 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088bd6e2d29030200000061", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "About as explicit a reference to Prometheus as you could possibly ask for", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "THE \nMODERN PROMETHEUS.", "uuid" : "D3B56239", "_id" : { "$oid" : "5088bd6e2d29030200000061" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/h2[1]", "startOffset" : 1, "end" : "/div[1]/h2[1]", "endOffset" : 24, "_id" : { "$oid" : "5088bd6e2d29030200000062" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351138670765 }, "created" : { "$date" : 1351138670765 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088be3f2d29030200000063", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "Interesting--being angry at his maker for what he did\nreminds me of how Prometheus' actions on behalf of man had undesirable effects for humankind", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Did I request thee, Maker, from my clay\n To mould me man?", "uuid" : "1046BD48", "_id" : { "$oid" : "5088be3f2d29030200000063" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/center[2]/table[1]/tbody[1]/tr[1]/td[1]", "startOffset" : 0, "end" : "/div[1]/center[2]/table[1]/tbody[1]/tr[1]/td[1]", "endOffset" : 60, "_id" : { "$oid" : "5088be3f2d29030200000064" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351138879588 }, "created" : { "$date" : 1351138879588 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088be9fc20220020000005e", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "A dismal scene for a miraculous birth to take place--seems more like dark magic than a heavenly work", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "the rain pattered dismally against the panes, and my candle was nearly \nburnt out", "uuid" : "FB1804DE", "_id" : { "$oid" : "5088be9fc20220020000005e" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[154]", "startOffset" : 298, "end" : "/div[1]/p[154]", "endOffset" : 380, "_id" : { "$oid" : "5088be9fc20220020000005f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351138975218 }, "created" : { "$date" : 1351138975218 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088bf00c202200200000060", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "Frankenstein is just downright awful as a creator--God wouldn't run away from his creations, he would embrace them", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "escaped, and rushed down stairs. I took \nrefuge in the court-yard belonging to the house which I inhabited", "uuid" : "EFF66927", "_id" : { "$oid" : "5088bf00c202200200000060" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[156]", "startOffset" : 1835, "end" : "/div[1]/p[156]", "endOffset" : 1942, "_id" : { "$oid" : "5088bf00c202200200000061" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351139072411 }, "created" : { "$date" : 1351139072411 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5088bf282d29030200000065", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "once again, not a loving way to refer to his creation", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "demoniacal corpse", "uuid" : "C2BB96F3", "_id" : { "$oid" : "5088bf282d29030200000065" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[156]", "startOffset" : 2142, "end" : "/div[1]/p[156]", "endOffset" : 2159, "_id" : { "$oid" : "5088bf282d29030200000066" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351139112824 }, "created" : { "$date" : 1351139112824 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5089354ac202200200000062", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Many and long were the conversations between Lord Byron and Shelley, to which \nI was a devout but nearly silent listener. During one of these, various \nphilosophical doctrines were discussed, and among others the nature of the \nprinciple of life, and whether there was any probability of its ever being \ndiscovered and communicated. They talked of the experiments of Dr. \nDarwin, (I speak not of what the Doctor really did, or said that he did, \nbut, as more to my purpose, of what was then spoken of as having been done by \nhim,) who preserved a piece of vermicelli in a glass case, till by some \nextraordinary means it \nbegan to move with voluntary motion. Not thus, after all, would life be \ngiven. Perhaps a corpse would be re-animated;\ngalvanism had given token of such things: perhaps the component parts of a \ncreature might be manufactured, brought together, and endued with vital warmth.", "uuid" : "0A682868", "_id" : { "$oid" : "5089354ac202200200000062" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[17]", "startOffset" : 0, "end" : "/div[1]/p[17]", "endOffset" : 896, "_id" : { "$oid" : "5089354ac202200200000063" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351169354388 }, "created" : { "$date" : 1351169354388 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50893564c202200200000064", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "he would rush away from his \n odious handywork, horror-stricken.", "uuid" : "98E6F250", "_id" : { "$oid" : "50893564c202200200000064" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 922, "end" : "/div[1]/p[18]", "endOffset" : 992, "_id" : { "$oid" : "50893564c202200200000065" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351169380242 }, "created" : { "$date" : 1351169380242 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50893591c202200200000066", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "behold the horrid thing stands at his \n bedside,", "uuid" : "9C533848", "_id" : { "$oid" : "50893591c202200200000066" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 1456, "end" : "/div[1]/p[18]", "endOffset" : 1509, "_id" : { "$oid" : "50893591c202200200000067" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351169425681 }, "created" : { "$date" : 1351169425681 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508935a12d29030200000067", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "hideous phantom", "uuid" : "42889D32", "_id" : { "$oid" : "508935a12d29030200000067" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[19]", "startOffset" : 436, "end" : "/div[1]/p[19]", "endOffset" : 452, "_id" : { "$oid" : "508935a12d29030200000068" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351169441198 }, "created" : { "$date" : 1351169441198 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5089366ac202200200000068", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "natural decay", "uuid" : "2DE6B67B", "_id" : { "$oid" : "5089366ac202200200000068" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[142]", "startOffset" : 916, "end" : "/div[1]/p[142]", "endOffset" : 929, "_id" : { "$oid" : "5089366ac202200200000069" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351169642931 }, "created" : { "$date" : 1351169642931 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508936952d29030200000069", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "he science of \nanatomy", "uuid" : "04F5268E", "_id" : { "$oid" : "508936952d29030200000069" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[142]", "startOffset" : 839, "end" : "/div[1]/p[142]", "endOffset" : 861, "_id" : { "$oid" : "508936952d2903020000006a" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351169685524 }, "created" : { "$date" : 1351169685524 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508936e32d2903020000006b", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "nfuse a spark of \nbeing into the lifeless", "uuid" : "235BFBAA", "_id" : { "$oid" : "508936e32d2903020000006b" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[154]", "startOffset" : 194, "end" : "/div[1]/p[154]", "endOffset" : 235, "_id" : { "$oid" : "508936e32d2903020000006c" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351169763431 }, "created" : { "$date" : 1351169763431 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508936ef2d2903020000006d", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "a convulsive motion \nagitated its limbs.", "uuid" : "E27D2F5A", "_id" : { "$oid" : "508936ef2d2903020000006d" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[154]", "startOffset" : 505, "end" : "/div[1]/p[154]", "endOffset" : 546, "_id" : { "$oid" : "508936ef2d2903020000006e" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351169775485 }, "created" : { "$date" : 1351169775485 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5089ac9777194f0200000007", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "These works of literature were the foundation of the creature's education and, being one of the first basic group of ideas he was introduced to, he took them very seriously. This is very similar to Don Quixote's fanatic obsession with the chivalric novels that inspired him to become a knight. It is interesting to note that Shelley could have gotten her idea for setting the foundation of Frankenstein on literature, both references to it and learning from/getting motivated by it with the characters themselves straight from Don Quixote. After all, everything has a beginning.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "\"One night, during my accustomed visit to the \nneighbouring wood, where I collected my own food, and brought home firing for my \nprotectors, I found on the ground a leathern portmanteau, containing several \narticles of dress and some books. I eagerly seized the prize, and returned with \nit to my hovel. Fortunately the books were written in the language the elements \nof which I had acquired at the cottage; they consisted of Paradise Lost, a \nvolume of Plutarch's Lives, and the Sorrows of Werter. The possession of these \ntreasures gave me extreme delight; I now continually studied and exercised my \nmind upon these histories, whilst my friends were employed in their ordinary \noccupations.\n\n\"I can hardly describe to you the effect of these \nbooks. They produced in me an infinity of new images and feelings that sometimes \nraised me to ecstasy, but more frequently sunk me into the lowest dejection. In \nthe Sorrows of Werter, besides the interest of its simple and affecting story, \nso many opinions are canvassed, and so many lights thrown upon what had hitherto \nbeen to me obscure subjects, that I found in it a never-ending source of \nspeculation and astonishment. The gentle and domestic manners it described, \ncombined with lofty sentiments and feelings, which had for their object \nsomething out of self, accorded well with my experience among my protectors, and \nwith the wants which were for ever alive in my own bosom. But I thought Werter \nhimself a more divine being than I had ever beheld or imagined; his character \ncontained no pretension, but it sunk deep. The disquisitions upon death and \nsuicide were calculated to fill me with wonder. I did not pretend to enter into \nthe merits of the case, yet I inclined towards the opinions of the hero, whose \nextinction I wept, without precisely understanding it.\n\n\"As I read, however, I applied much personally to \nmy own feelings and condition. I found myself similar, yet at the same time \nstrangely unlike to the beings concerning whom I read, and to whose conversation \nI was a listener. I sympathised with, and partly understood them, but I was \nunformed in mind; I was dependent on none and related to none. 'The path of my \ndeparture was free'; and there was none to lament my annihilation. My person was \nhideous and my stature gigantic. What did this mean? Who was I? What was I? \nWhence did I come? What was my destination? These questions continually \nrecurred, but I was unable to solve them.\n\n\"The volume of Plutarch's Lives which I \npossessed, contained the histories of the first founders of the ancient \nrepublics. This book had a far different effect upon me from the Sorrows of Werter. I learned from Werter's imaginations despondency and gloom: but Plutarch \ntaught me high thoughts; he elevated me above the wretched sphere of my own \nreflections to admire and love the heroes of past ages. Many things I read \nsurpassed my understanding and experience. I had a very confused knowledge of \nkingdoms, wide extents of country, mighty rivers, and boundless seas. But I was \nperfectly unacquainted with towns, and large assemblages of men. The cottage of \nmy protectors had been the only school in which I had studied human nature; but \nthis book developed new and mightier scenes of action. I read of men concerned \nin public affairs, governing or massacring their species. I felt the greatest \nardour for virtue rise within me, and abhorrence for vice, as far as I \nunderstood the signification of those terms, relative as they were, as I applied \nthem, to pleasure and pain alone. Induced by these feelings, I was of course led \nto admire peaceable lawgivers, Numa, Solon, and Lycurgus, in preference to \nRomulus and Theseus. The patriarchal lives of my protectors caused these \nimpressions to take a firm hold on my mind; perhaps, if my first introduction to \nhumanity had been made by a young soldier, burning for glory and slaughter, I \nshould have been imbued with different sensations.\n\n\"But Paradise Lost excited different and far \ndeeper emotions. I read it, as I had read the other volumes which had fallen \ninto my hands, as a true history. It moved every feeling of wonder and awe that \nthe picture of an omnipotent Go warring with his creatures was capable of \nexciting. I often referred the several situations, as their similarity struck \nme, to my own. Like Adam, I was apparently united by no link to any other being \nin existence; but his state was far different from mine in every other respect. \nHe had come forth from the hands of God a perfect creature, happy and \nprosperous, guarded by the especial care of his Creator; he was allowed to \nconverse with, and acquire knowledge from, beings of a superior nature: but I \nwas wretched, helpless, and alone. Many times I considered Satan as the fitter \nemblem of my condition; for often, like him, when I viewed the bliss of my \nprotectors, the bitter gall of envy rose within me.", "uuid" : "E957E011", "_id" : { "$oid" : "5089ac9777194f0200000007" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "reference" ], "ranges" : [ { "start" : "/div[1]/p[409]", "startOffset" : 1, "end" : "/div[1]/p[413]", "endOffset" : 955, "_id" : { "$oid" : "5089ac9777194f0200000008" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351199895254 }, "created" : { "$date" : 1351199895254 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5089cdaff9bda10200000008", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "This is the beginning of Victor's education on natural philosophy, and he learns it through books. In a similar way, Don Quixote reads books and becomes inspired to become a knight. In Victor's case, the books on natural philosophy inspire him to reach the destinations that the philosophers dreamed of, make them reality. He accomplished this by giving birth to the creature.", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "Natural philosophy is the genius that has regulated my fate; I desire \ntherefore, in this narration, to state those facts which led to my predilection \nfor that\n\nscience. When I was thirteen years of age, we all went on a party of \npleasure to the baths near Thonon: \nthe inclemency of the weather obliged us to remain a day confined to the inn. In \nthis house I chanced to find a volume of the works of\nCornelius Agrippa. I opened it with apathy; the theory which he attempts to \ndemonstrate, and the wonderful facts which he relates, soon changed this feeling \ninto enthusiasm. A new light seemed to dawn upon my mind; and, bounding with \njoy, I communicated my discovery to my\nfather. \nI cannot help remarking here the many opportunities instructors possess of \ndirecting the attention of their pupils to useful knowledge, which they utterly \nneglect. My father looked carelessly at the title-page of my book, and said, \n\"Ah! Cornelius Agrippa! My dear Victor, do not waste your time upon this; it is \nsad trash.\"", "uuid" : "955B6A9F", "_id" : { "$oid" : "5089cdaff9bda10200000008" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "reference", "books" ], "ranges" : [ { "start" : "/div[1]/p[107]", "startOffset" : 1, "end" : "/div[1]/p[107]", "endOffset" : 1017, "_id" : { "$oid" : "5089cdaff9bda10200000009" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1351208367148 }, "created" : { "$date" : 1351208367148 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "508b39a53d78bf0200000002" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1351301541570 }, "groups" : [ "21L.003" ], "id" : "508b39a53d78bf0200000002", "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "quote" : "Julius Caesar wrote The Calico Belly.", "ranges" : [ { "start" : "/div[1]/p[435]", "startOffset" : 2, "end" : "/div[1]/p[435]", "endOffset" : 39, "_id" : { "$oid" : "508b39a53d78bf0200000003" } } ], "tags" : [], "text" : "From Latin lessons; play on the actual work by Caesar \"Commentarii de Bello Gallico\" (\"Commentaries on the Gallic War\")", "updated" : { "$date" : 1351301761781 }, "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "user" : "opaco@mit.edu", "username" : "Francisco H.", "uuid" : "57B72097" } -{ "__v" : 0, "_id" : { "$oid" : "508b39da76030e0200000002" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1351301594752 }, "groups" : [ "21L.003" ], "id" : "508b39da76030e0200000002", "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "quote" : "Balbus was building a wall.", "ranges" : [ { "start" : "/div[1]/p[433]", "startOffset" : 2, "end" : "/div[1]/p[433]", "endOffset" : 29, "_id" : { "$oid" : "508b39da76030e0200000003" } } ], "tags" : [], "text" : "from Cicero's \"Letters To Atticus\"; learned from his Latin lessons. Balbus \"is building [new mansions for himself]: for what cares he?\"", "updated" : { "$date" : 1351437780266 }, "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "user" : "opaco@mit.edu", "username" : "Francisco H.", "uuid" : "0A342041" } -{ "__v" : 0, "_id" : { "$oid" : "508c9eb2c7a37c0200000002" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1351392946422 }, "groups" : [ "21L.448J" ], "id" : "508c9eb2c7a37c0200000002", "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "quote" : "When we reflect on the\nvast diversity of the plants and animals which have been cultivated, and which have varied during all ages under the most different climates and treatment, I\nthink we are driven to conclude that this greater variability is simply due to our domestic productions having been raised under conditions of life not so\nuniform as, and somewhat different from, those to which the parent-species have been exposed under nature.", "ranges" : [ { "start" : "/div[1]/div[1]/p[12]", "startOffset" : 288, "end" : "/div[1]/div[1]/p[12]", "endOffset" : 730, "_id" : { "$oid" : "508c9eb2c7a37c0200000003" } } ], "tags" : [], "text" : "1. Domesticated animals are exposed to different conditions of life, resulting in different traits being selected for. Also affected by selection for specific traits by humans", "updated" : { "$date" : 1351393124825 }, "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "user" : "mpd91@mit.edu", "username" : "Michael D.", "uuid" : "0F9836A1" } -{ "id" : "508ca021c7a37c0200000004", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "1. Examples of selection for specific traits by humans", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "The great and inherited development of the udders in cows and goats in countries where they are habitually milked, in comparison with the\nstate of these organs in other countries, is another instance of the effect of use. Not a single domestic animal can be named which has not in some country\ndrooping ears; and the view suggested by some authors, that the drooping is due to the disuse of the muscles of the ear, from the animals not being much\nalarmed by danger, seems probable.", "uuid" : "C5F9269B", "_id" : { "$oid" : "508ca021c7a37c0200000004" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[17]", "startOffset" : 489, "end" : "/div[1]/div[1]/p[17]", "endOffset" : 970, "_id" : { "$oid" : "508ca021c7a37c0200000005" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351393313225 }, "created" : { "$date" : 1351393313225 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "508ca0b566d2620200000002" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1351393461956 }, "groups" : [ "21L.448J" ], "id" : "508ca0b566d2620200000002", "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "quote" : "When a deviation appears not unfrequently, and we see it in the father and child, we cannot tell whether it may not be due to the\nsame original cause acting on both; but when amongst individuals, apparently exposed to the same conditions, any very rare deviation, due to some extraordinary\ncombination of circumstances, appears in the parent—say, once amongst several million individuals—and it reappears in the child, the mere doctrine\nof chances almost compels us to attribute its reappearance to inheritance.", "ranges" : [ { "start" : "/div[1]/div[1]/p[20]", "startOffset" : 491, "end" : "/div[1]/div[1]/p[20]", "endOffset" : 1002, "_id" : { "$oid" : "508ca0b566d2620200000003" } } ], "tags" : [], "text" : "2.Inheritance of traits through genetics. Not always able to tell whether it is the result of genetics or environment, but when it is a rare case and you see the same thing in the parent as you do in the child, then you suspect that it is the result of inheritance", "updated" : { "$date" : 1351393484975 }, "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "user" : "mpd91@mit.edu", "username" : "Michael D.", "uuid" : "C9C04E42" } -{ "id" : "508ca0e466d2620200000004", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "2.Example of 2", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "Every one must have heard of cases of albinism, prickly skin, hairy bodies, etc.,\nappearing in several members of the same family. If strange and rare deviations of structure are truly inherited, less strange and commoner deviations may be\nfreely admitted to be inheritable. Perhaps the correct way of viewing the whole subject, would be, to look at the inheritance of every character whatever as\nthe rule, and non-inheritance as the anomaly.", "uuid" : "623F6D25", "_id" : { "$oid" : "508ca0e466d2620200000004" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[20]", "startOffset" : 1003, "end" : "/div[1]/div[1]/p[20]", "endOffset" : 1445, "_id" : { "$oid" : "508ca0e466d2620200000005" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351393508428 }, "created" : { "$date" : 1351393508428 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508ca15966d2620200000006", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "2.Hereditary traits", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "The laws governing inheritance are quite unknown; no one can say why the same peculiarity in different individuals of the same species, and in individuals\nof different species, is sometimes inherited and sometimes not so; why the child often reverts in certain characters to its grandfather or grandmother or other\nmuch more remote ancestor; why a peculiarity is often transmitted from one sex to both sexes or to one sex alone, more commonly but not exclusively to the like\nsex. It is a fact of some little importance to us, that peculiarities appearing in the males of our domestic breeds are often transmitted either exclusively,\nor in a much greater degree, to males alone. A much more important rule, which I think may be trusted, is that, at whatever period of life a peculiarity first\nappears, it tends to appear in the offspring at a corresponding age, though sometimes earlier. In many cases this could not be otherwise: thus the inherited\npeculiarities in the horns of cattle could appear only in the offspring when nearly mature; peculiarities in the silkworm are known to appear at the\ncorresponding caterpillar or cocoon stage. But hereditary diseases and some other facts make me believe that the rule has a wider extension, and that when\nthere is no apparent reason why a peculiarity should appear at any particular age, yet that it does tend to appear in the offspring at the same period at which\nit first appeared in the parent. I believe this rule to be of the highest importance in explaining the laws of embryology. These remarks are of course confined\nto the first APPEARANCE of the peculiarity, and not to its primary cause, which may have acted on the ovules or male element; in nearly the same manner as in\nthe crossed offspring from a short-horned cow by a long-horned bull, the greater length of horn, though appearing late in life, is clearly due to the male\nelement.", "uuid" : "090CDF9B", "_id" : { "$oid" : "508ca15966d2620200000006" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[21]", "startOffset" : 1, "end" : "/div[1]/div[1]/p[21]", "endOffset" : 1895, "_id" : { "$oid" : "508ca15966d2620200000007" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351393625529 }, "created" : { "$date" : 1351393625529 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508ca1a366d2620200000008", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "3.Reversion of traits. When domesticated animals are placed back in to the wild, they will very quickly revert to their feral forms or die", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "Having alluded to the subject of reversion, I may here refer to a statement often made by naturalists—namely, that our domestic varieties, when run\nwild, gradually but certainly revert in character to their aboriginal stocks. Hence it has been argued that no deductions can be drawn from domestic races to\nspecies in a state of nature. I have in vain endeavoured to discover on what decisive facts the above statement has so often and so boldly been made. There\nwould be great difficulty in proving its truth: we may safely conclude that very many of the most strongly-marked domestic varieties could not possibly live in\na wild state. In many cases we do not know what the aboriginal stock was, and so could not tell whether or not nearly perfect reversion had ensued. It would be\nquite necessary, in order to prevent the effects of intercrossing, that only a single variety should be turned loose in its new home. Nevertheless, as our\nvarieties certainly do occasionally revert in some of their characters to ancestral forms, it seems to me not improbable, that if we could succeed in\nnaturalising, or were to cultivate, during many generations, the several races, for instance, of the cabbage, in very poor soil (in which case, however, some\neffect would have to be attributed to the direct action of the poor soil), that they would to a large extent, or even wholly, revert to the wild aboriginal\nstock. Whether or not the experiment would succeed, is not of great importance for our line of argument; for by the experiment itself the conditions of life\nare changed. If it could be shown that our domestic varieties manifested a strong tendency to reversion,—that is, to lose their acquired characters,\nwhilst kept under unchanged conditions, and whilst kept in a considerable body, so that free intercrossing might check, by blending together, any slight\ndeviations of structure, in such case, I grant that we could deduce nothing from domestic varieties in regard to species. But there is not a shadow of evidence\nin favour of this view: to assert that we could not breed our cart and race-horses, long and short-horned cattle, and poultry of various breeds, and esculent\nvegetables, for an almost infinite number of generations, would be opposed to all experience. I may add, that when under nature the conditions of life do\nchange, variations and reversions of character probably do occur; but natural selection, as will hereafter be explained, will determine how far the new\ncharacters thus arising shall be preserved.", "uuid" : "6679B91E", "_id" : { "$oid" : "508ca1a366d2620200000008" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[22]", "startOffset" : 1, "end" : "/div[1]/div[1]/p[22]", "endOffset" : 2528, "_id" : { "$oid" : "508ca1a366d2620200000009" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351393699929 }, "created" : { "$date" : 1351393699929 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508ca38fc7a37c0200000006", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "1,3.In domestic animals, there is a lot more variety in character (behaviour) because the rigors of life are much less severe. A domestic animal can do whatever it wants and survive, wheres as a wild animal has to follow very strict guidelines in order to do so. e.g. very specific ways lions hunt, otherwise they wouldn't be able to get enough food to survive", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "When we look to the hereditary varieties or races of our domestic animals and plants, and compare them with species closely allied together, we generally\nperceive in each domestic race, as already remarked, less uniformity of character than in true species. Domestic races of the same species, also, often have a\nsomewhat monstrous character; by which I mean, that, although differing from each other, and from the other species of the same genus, in several trifling\nrespects, they often differ in an extreme degree in some one part, both when compared one with another, and more especially when compared with all the species\nin nature to which they are nearest allied.", "uuid" : "37FE77E4", "_id" : { "$oid" : "508ca38fc7a37c0200000006" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[23]", "startOffset" : 1, "end" : "/div[1]/div[1]/p[23]", "endOffset" : 671, "_id" : { "$oid" : "508ca38fc7a37c0200000007" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351394191066 }, "created" : { "$date" : 1351394191066 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508ca58766d262020000000a", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "4.The struggle for existence - more organisms are created than there is space for in the world, therefore they must compete with themselves, each other and the environment to secure their place in the world", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "Hence, as more individuals are\nproduced than can possibly survive, there must in every case be a struggle for existence, either one individual with another of the same species, or with the\nindividuals of distinct species, or with the physical conditions of life. It is the doctrine of Malthus applied with manifold force to the whole animal and\nvegetable kingdoms; for in this case there can be no artificial increase of food, and no prudential restraint from marriage. Although some species may be now\nincreasing, more or less rapidly, in numbers, all cannot do so, for the world would not hold them.", "uuid" : "1FA0D6C4", "_id" : { "$oid" : "508ca58766d262020000000a" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[87]", "startOffset" : 439, "end" : "/div[1]/div[1]/p[87]", "endOffset" : 1040, "_id" : { "$oid" : "508ca58766d262020000000b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351394695236 }, "created" : { "$date" : 1351394695236 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508ca5c966d262020000000c", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "4.If left alone, each animal would reproduce, given enough time, to cover the earth in its own progeny", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "There is no exception to the rule that every organic being naturally increases at so high a rate, that if not destroyed, the earth would soon be covered by\nthe progeny of a single pair. Even slow-breeding man has doubled in twenty-five years, and at this rate, in a few thousand years, there would literally not be\nstanding room for his progeny. Linnaeus has calculated that if an annual plant produced only two seeds—and there is no plant so unproductive as\nthis—and their seedlings next year produced two, and so on, then in twenty years there would be a million plants. The elephant is reckoned to be the\nslowest breeder of all known animals, and I have taken some pains to estimate its probable minimum rate of natural increase: it will be under the mark to\nassume that it breeds when thirty years old, and goes on breeding till ninety years old, bringing forth three pair of young in this interval; if this be so, at\nthe end of the fifth century there would be alive fifteen million elephants, descended from the first pair.", "uuid" : "FD0ADD3C", "_id" : { "$oid" : "508ca5c966d262020000000c" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[88]", "startOffset" : 1, "end" : "/div[1]/div[1]/p[88]", "endOffset" : 1030, "_id" : { "$oid" : "508ca5c966d262020000000d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351394761741 }, "created" : { "$date" : 1351394761741 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508ca65cc7a37c0200000008", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "4.The number of seeds an organism produces depends on its rate of destruction and how easily it can protect and ensure the survival of its young", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "A large number of eggs is of some importance to those species, which\ndepend on a rapidly fluctuating amount of food, for it allows them rapidly to increase in number. But the real importance of a large number of eggs or seeds is\nto make up for much destruction at some period of life; and this period in the great majority of cases is an early one. If an animal can in any way protect its\nown eggs or young, a small number may be produced, and yet the average stock be fully kept up; but if many eggs or young are destroyed, many must be produced,\nor the species will become extinct. It would suffice to keep up the full number of a tree, which lived on an average for a thousand years, if a single seed\nwere produced once in a thousand years, supposing that this seed were never destroyed, and could be ensured to germinate in a fitting place. So that in all\ncases, the average number of any animal or plant depends only indirectly on the number of its eggs or seeds.", "uuid" : "21258581", "_id" : { "$oid" : "508ca65cc7a37c0200000008" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[91]", "startOffset" : 699, "end" : "/div[1]/div[1]/p[91]", "endOffset" : 1667, "_id" : { "$oid" : "508ca65cc7a37c0200000009" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351394908837 }, "created" : { "$date" : 1351394908837 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508ca6b466d262020000000e", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "4.If you give any organism the chance, by lightening the destruction it normally faces, its population will undoubtedly increase dramatically", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "Lighten any check, mitigate the destruction ever so little, and the number\nof the species will almost instantaneously increase to any amount.", "uuid" : "81ACF538", "_id" : { "$oid" : "508ca6b466d262020000000e" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[92]", "startOffset" : 395, "end" : "/div[1]/div[1]/p[92]", "endOffset" : 537, "_id" : { "$oid" : "508ca6b466d262020000000f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351394996869 }, "created" : { "$date" : 1351394996869 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508ca73ac7a37c020000000a", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "4.Climate is an important factor in the struggle for existence, but it tends to affect the availability of food more than directly affecting the survival of the organism", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "Climate plays an important part in determining the average numbers of a species, and periodical seasons of extreme cold or drought, I believe to be the\nmost effective of all checks. I estimated that the winter of 1854-55 destroyed four-fifths of the birds in my own grounds; and this is a tremendous\ndestruction, when we remember that ten per cent. is an extraordinarily severe mortality from epidemics with man. The action of climate seems at first sight to\nbe quite independent of the struggle for existence; but in so far as climate chiefly acts in reducing food, it brings on the most severe struggle between the\nindividuals, whether of the same or of distinct species, which subsist on the same kind of food. Even when climate, for instance extreme cold, acts directly,\nit will be the least vigorous, or those which have got least food through the advancing winter, which will suffer most.", "uuid" : "D20D4E19", "_id" : { "$oid" : "508ca73ac7a37c020000000a" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[95]", "startOffset" : 1, "end" : "/div[1]/div[1]/p[95]", "endOffset" : 896, "_id" : { "$oid" : "508ca73ac7a37c020000000b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351395130492 }, "created" : { "$date" : 1351395130492 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508ca822c7a37c020000000c", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "5.Natural Selection - Due to the struggle for existence, any organism that has an advantage over another, will survive. Thereby passing on its desirable traits. Evident in the selection of traits of domestic animals that are desirable by humans", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "Can it, then, be thought improbable,\nseeing that variations useful to man have undoubtedly occurred, that other variations useful in some way to each being in the great and complex battle of life,\nshould sometimes occur in the course of thousands of generations? If such do occur, can we doubt (remembering that many more individuals are born than can\npossibly survive) that individuals having any advantage, however slight, over others, would have the best chance of surviving and of procreating their kind? On\nthe other hand, we may feel sure that any variation in the least degree injurious would be rigidly destroyed. This preservation of favourable variations and\nthe rejection of injurious variations, I call Natural Selection. Variations neither useful nor injurious would not be affected by natural selection, and would\nbe left a fluctuating element, as perhaps we see in the species called polymorphic.", "uuid" : "3A892529", "_id" : { "$oid" : "508ca822c7a37c020000000c" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[112]", "startOffset" : 731, "end" : "/div[1]/div[1]/p[112]", "endOffset" : 1642, "_id" : { "$oid" : "508ca822c7a37c020000000d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351395362291 }, "created" : { "$date" : 1351395362291 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508ca91b66d2620200000010", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "6.The rate of natural selection - In ecosystems that are more open and accessible, adaptation and change happen at a much higher rate, because better organisms can come in and change things -- much more input into the system. In an isolated system, such as an island, outside animals cannot interfere, so once something on the island works, there is really no reason to change further, so the process of natural selection will slow drastically", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "We may conclude, from\nwhat we have seen of the intimate and complex manner in which the inhabitants of each country are bound together, that any change in the numerical proportions\nof some of the inhabitants, independently of the change of climate itself, would most seriously affect many of the others. If the country were open on its\nborders, new forms would certainly immigrate, and this also would seriously disturb the relations of some of the former inhabitants. Let it be remembered how\npowerful the influence of a single introduced tree or mammal has been shown to be. But in the case of an island, or of a country partly surrounded by barriers,\ninto which new and better adapted forms could not freely enter, we should then have places in the economy of nature which would assuredly be better filled up,\nif some of the original inhabitants were in some manner modified; for, had the area been open to immigration, these same places would have been seized on by\nintruders. In such case, every slight modification, which in the course of ages chanced to arise, and which in any way favoured the individuals of any of the\nspecies, by better adapting them to their altered conditions, would tend to be preserved; and natural selection would thus have free scope for the work of\nimprovement.", "uuid" : "7C80BEA7", "_id" : { "$oid" : "508ca91b66d2620200000010" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[113]", "startOffset" : 284, "end" : "/div[1]/div[1]/p[113]", "endOffset" : 1579, "_id" : { "$oid" : "508ca91b66d2620200000011" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351395611152 }, "created" : { "$date" : 1351395611152 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508caaa266d2620200000012", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "6.Because natural selection has slowed in a region does not mean that the species there is nearing perfection, it just means that they haven't had a reason to change yet. If some threat from the outside were to come in, they would not necessarily be able to hold it off", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "No country can be named in which all the native inhabitants are now so\nperfectly adapted to each other and to the physical conditions under which they live, that none of them could anyhow be improved; for in all countries, the\nnatives have been so far conquered by naturalised productions, that they have allowed foreigners to take firm possession of the land. And as foreigners have\nthus everywhere beaten some of the natives, we may safely conclude that the natives might have been modified with advantage, so as to have better resisted such\nintruders.", "uuid" : "5DBFCBE1", "_id" : { "$oid" : "508caaa266d2620200000012" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[114]", "startOffset" : 1335, "end" : "/div[1]/div[1]/p[114]", "endOffset" : 1889, "_id" : { "$oid" : "508caaa266d2620200000013" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351396002908 }, "created" : { "$date" : 1351396002908 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "508cae34c7a37c020000000e" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1351396916303 }, "groups" : [ "21L.448J" ], "id" : "508cae34c7a37c020000000e", "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "quote" : "But as from the high geometrical powers of increase of all organic beings, each\narea is already fully stocked with inhabitants, it follows that as each selected and favoured form increases in number, so will the less favoured forms\ndecrease and become rare. Rarity, as geology tells us, is the precursor to extinction. We can, also, see that any form represented by few individuals will,\nduring fluctuations in the seasons or in the number of its enemies, run a good chance of utter extinction. But we may go further than this; for as new forms\nare continually and slowly being produced, unless we believe that the number of specific forms goes on perpetually and almost indefinitely increasing, numbers\ninevitably must become extinct. That the number of specific forms has not indefinitely increased, geology shows us plainly; and indeed we can see reason why\nthey should not have thus increased, for the number of places in the polity of nature is not indefinitely great,—not that we have any means of knowing\nthat any one region has as yet got its maximum of species. Probably no region is as yet fully stocked, for at the Cape of Good Hope, where more species of\nplants are crowded together than in any other quarter of the world, some foreign plants have become naturalised, without causing, as far as we know, the\nextinction of any natives. \n\n Furthermore, the species which are most numerous in individuals will have the best chance of producing within any given period favourable variations. We\nhave evidence of this, in the facts given in the second chapter, showing that it is the common species which afford the greatest number of recorded varieties,\nor incipient species. Hence, rare species will be less quickly modified or improved within any given period, and they will consequently be beaten in the race\nfor life by the modified descendants of the commoner species.", "ranges" : [ { "start" : "/div[1]/div[1]/p[150]", "startOffset" : 279, "end" : "/div[1]/div[1]/p[151]", "endOffset" : 532, "_id" : { "$oid" : "508cae34c7a37c020000000f" } } ], "tags" : [], "text" : "7.As a result of natural selection, as better adapted species move in, the old ones must die out. The rarer a species is, the less it reproduces, and the less it will adapt, leading to it eventually being beaten out of survival in that environment. Rarity of a species is a sign that it is on its way out of existence", "updated" : { "$date" : 1351396972480 }, "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "user" : "mpd91@mit.edu", "username" : "Michael D.", "uuid" : "63620C08" } -{ "id" : "508caf0066d2620200000014", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "8.The effects of use and disuse of traits either strengthens or diminishes them, and then these qualities are passed on to their young. This is what Darwin thought, but we now know that acquired traits are not passed on genetically and this would not actually happen", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "From the facts alluded to in\nthe first chapter, I think there can be little doubt that use in our domestic animals strengthens and enlarges certain parts, and disuse diminishes them; and\nthat such modifications are inherited. Under free nature, we can have no standard of comparison, by which to judge of the effects of long-continued use or\ndisuse, for we know not the parent-forms; but many animals have structures which can be explained by the effects of disuse. As Professor Owen has remarked,\nthere is no greater anomaly in nature than a bird that cannot fly; yet there are several in this state. The logger-headed duck of South America can only flap\nalong the surface of the water, and has its wings in nearly the same condition as the domestic Aylesbury duck. As the larger ground-feeding birds seldom take\nflight except to escape danger, I believe that the nearly wingless condition of several birds, which now inhabit or have lately inhabited several oceanic\nislands, tenanted by no beast of prey, has been caused by disuse. The ostrich indeed inhabits continents and is exposed to danger from which it cannot escape\nby flight, but by kicking it can defend itself from enemies, as well as any of the smaller quadrupeds. We may imagine that the early progenitor of the ostrich\nhad habits like those of a bustard, and that as natural selection increased in successive generations the size and weight of its body, its legs were used more,\nand its wings less, until they became incapable of flight.", "uuid" : "F5C31A70", "_id" : { "$oid" : "508caf0066d2620200000014" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[188]", "startOffset" : 1, "end" : "/div[1]/div[1]/p[188]", "endOffset" : 1504, "_id" : { "$oid" : "508caf0066d2620200000015" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351397120515 }, "created" : { "$date" : 1351397120515 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508caf9dc7a37c0200000010", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "8.The eyes did not shrink because of disuse from being underground. It worked out that the smaller, covered up eyes got infected less so the version with that mutation survived better and pushed out the versions with larger eyes -- natural selection", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "The eyes of moles and of some burrowing rodents are rudimentary in size, and in some cases are quite covered up by skin and fur. This state of the eyes is\nprobably due to gradual reduction from disuse, but aided perhaps by natural selection. In South America, a burrowing rodent, the tuco-tuco, or Ctenomys, is\neven more subterranean in its habits than the mole; and I was assured by a Spaniard, who had often caught them, that they were frequently blind; one which I\nkept alive was certainly in this condition, the cause, as appeared on dissection, having been inflammation of the nictitating membrane. As frequent\ninflammation of the eyes must be injurious to any animal, and as eyes are certainly not indispensable to animals with subterranean habits, a reduction in their\nsize with the adhesion of the eyelids and growth of fur over them, might in such case be an advantage; and if so, natural selection would constantly aid the\neffects of disuse.", "uuid" : "30E65F45", "_id" : { "$oid" : "508caf9dc7a37c0200000010" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[192]", "startOffset" : 1, "end" : "/div[1]/div[1]/p[192]", "endOffset" : 952, "_id" : { "$oid" : "508caf9dc7a37c0200000011" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351397277897 }, "created" : { "$date" : 1351397277897 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508cafe1c7a37c0200000012", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "8.Example of the crabs that have no reason to lose their eyes because in this case it was not detrimental to their survival. Could have happened purely by chance", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "It is well known that several animals, belonging to the most different classes, which inhabit the caves of Styria and of Kentucky, are blind. In some of\nthe crabs the foot-stalk for the eye remains, though the eye is gone; the stand for the telescope is there, though the telescope with its glasses has been\nlost. As it is difficult to imagine that eyes, though useless, could be in any way injurious to animals living in darkness, I attribute their loss wholly to\ndisuse. In one of the blind animals, namely, the cave-rat, the eyes are of immense size; and Professor Silliman thought that it regained, after living some\ndays in the light, some slight power of vision. In the same manner as in Madeira the wings of some of the insects have been enlarged, and the wings of others\nhave been reduced by natural selection aided by use and disuse, so in the case of the cave-rat natural selection seems to have struggled with the loss of light\nand to have increased the size of the eyes; whereas with all the other inhabitants of the caves, disuse by itself seems to have done its work.", "uuid" : "F409A97A", "_id" : { "$oid" : "508cafe1c7a37c0200000012" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[193]", "startOffset" : 1, "end" : "/div[1]/div[1]/p[193]", "endOffset" : 1082, "_id" : { "$oid" : "508cafe1c7a37c0200000013" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351397345820 }, "created" : { "$date" : 1351397345820 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508d38ca66d2620200000016", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "9.Since every organism is the result of multiple variations of is ancestor, why do we not see these intermediate varieties around us? The parent and transitional varities have gone extinct, yet we have no fossils. This is due more to a lack in geological record than that these intermediate varieties may not have existed at all", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "As natural selection acts solely by the preservation of profitable modifications, each new form will tend in a fully-stocked country\nto take the place of, and finally to exterminate, its own less improved parent or other less-favoured forms with which it comes into competition. Thus\nextinction and natural selection will, as we have seen, go hand in hand. Hence, if we look at each species as descended from some other unknown form, both the\nparent and all the transitional varieties will generally have been exterminated by the very process of formation and perfection of the new form. \n\n But, as by this theory innumerable transitional forms must have existed, why do we not find them embedded in countless numbers in the crust of the earth?\nIt will be much more convenient to discuss this question in the chapter on the Imperfection of the geological record; and I will here only state that I believe\nthe answer mainly lies in the record being incomparably less perfect than is generally supposed; the imperfection of the record being chiefly due to organic\nbeings not inhabiting profound depths of the sea, and to their remains being embedded and preserved to a future age only in masses of sediment sufficiently\nthick and extensive to withstand an enormous amount of future degradation; and such fossiliferous masses can be accumulated only where much sediment is\ndeposited on the shallow bed of the sea, whilst it slowly subsides. These contingencies will concur only rarely, and after enormously long intervals. Whilst\nthe bed of the sea is stationary or is rising, or when very little sediment is being deposited, there will be blanks in our geological history. The crust of\nthe earth is a vast museum; but the natural collections have been made only at intervals of time immensely remote.", "uuid" : "1595D104", "_id" : { "$oid" : "508d38ca66d2620200000016" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[243]", "startOffset" : 1, "end" : "/div[1]/div[1]/p[244]", "endOffset" : 1208, "_id" : { "$oid" : "508d38ca66d2620200000017" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351432394655 }, "created" : { "$date" : 1351432394655 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508d39c8c7a37c0200000014", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "9.Variation is a very slow and gradual process, so we will only see a few variations of a species at a time", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "To sum up, I believe that species come to be tolerably well-defined objects, and do not at any one period present an inextricable chaos of varying and\nintermediate links: firstly, because new varieties are very slowly formed, for variation is a very slow process, and natural selection can do nothing until\nfavourable variations chance to occur, and until a place in the natural polity of the country can be better filled by some modification of some one or more of\nits inhabitants. And such new places will depend on slow changes of climate, or on the occasional immigration of new inhabitants, and, probably, in a still\nmore important degree, on some of the old inhabitants becoming slowly modified, with the new forms thus produced and the old ones acting and reacting on each\nother. So that, in any one region and at any one time, we ought only to see a few species presenting slight modifications of structure in some degree\npermanent; and this assuredly we do see.", "uuid" : "E332973D", "_id" : { "$oid" : "508d39c8c7a37c0200000014" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[250]", "startOffset" : 1, "end" : "/div[1]/div[1]/p[250]", "endOffset" : 971, "_id" : { "$oid" : "508d39c8c7a37c0200000015" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351432648454 }, "created" : { "$date" : 1351432648454 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508d3a3cc7a37c0200000016", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "9.Intermediate variations that form in intermediate zones are generally less populous than the main species, and thus more vulnerable to extermination ", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "Thirdly, when two or more varieties have been formed in different portions of a strictly continuous area, intermediate varieties will, it is probable, at\nfirst have been formed in the intermediate zones, but they will generally have had a short duration. For these intermediate varieties will, from reasons\nalready assigned (namely from what we know of the actual distribution of closely allied or representative species, and likewise of acknowledged varieties),\nexist in the intermediate zones in lesser numbers than the varieties which they tend to connect. From this cause alone the intermediate varieties will be\nliable to accidental extermination; and during the process of further modification through natural selection, they will almost certainly be beaten and\nsupplanted by the forms which they connect; for these from existing in greater numbers will, in the aggregate, present more variation, and thus be further\nimproved through natural selection and gain further advantages.", "uuid" : "E6AED5EC", "_id" : { "$oid" : "508d3a3cc7a37c0200000016" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[252]", "startOffset" : 1, "end" : "/div[1]/div[1]/p[252]", "endOffset" : 987, "_id" : { "$oid" : "508d3a3cc7a37c0200000017" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351432764695 }, "created" : { "$date" : 1351432764695 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508d3a6dc7a37c0200000018", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "9.It is difficult to look at intermediate zones and expect intermediate species to have developed there because that zone may not have always been intermediate. May have been entirely detached at some point", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "Secondly, areas now continuous must often have existed within the recent period in isolated portions, in which many forms, more especially amongst the\nclasses which unite for each birth and wander much, may have separately been rendered sufficiently distinct to rank as representative species. In this case,\nintermediate varieties between the several representative species and their common parent, must formerly have existed in each broken portion of the land, but\nthese links will have been supplanted and exterminated during the process of natural selection, so that they will no longer exist in a living state.", "uuid" : "4AF6B26D", "_id" : { "$oid" : "508d3a6dc7a37c0200000018" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[251]", "startOffset" : 1, "end" : "/div[1]/div[1]/p[251]", "endOffset" : 615, "_id" : { "$oid" : "508d3a6dc7a37c0200000019" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351432813327 }, "created" : { "$date" : 1351432813327 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508d3a9ac7a37c020000001a", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "9.Existence of these intermediate varieties would be shown in fossils, which may not have been able to unearth yet", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "Lastly, looking not to any one time, but to all time, if my theory be true, numberless intermediate varieties, linking most closely all the species of the\nsame group together, must assuredly have existed; but the very process of natural selection constantly tends, as has been so often remarked, to exterminate the\nparent forms and the intermediate links. Consequently evidence of their former existence could be found only amongst fossil remains, which are preserved, as we\nshall in a future chapter attempt to show, in an extremely imperfect and intermittent record.", "uuid" : "DB7BDECE", "_id" : { "$oid" : "508d3a9ac7a37c020000001a" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[253]", "startOffset" : 1, "end" : "/div[1]/div[1]/p[253]", "endOffset" : 569, "_id" : { "$oid" : "508d3a9ac7a37c020000001b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351432858774 }, "created" : { "$date" : 1351432858774 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508d3d2e66d2620200000018", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "10.Darwin is unsure how to explain how land animals transformed into sea animals, yet his theory of natural selection perfectly explains this. Gradual random mutations that allowed varieties to move into the water would eventually have led to land to sea movement and vice versa", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "It has been asked by the opponents of such views as I hold, how, for instance, a land carnivorous animal could have been converted into one with aquatic\nhabits; for how could the animal in its transitional state have subsisted? It would be easy to show that within the same group carnivorous animals exist having\nevery intermediate grade between truly aquatic and strictly terrestrial habits; and as each exists by a struggle for life, it is clear that each is well\nadapted in its habits to its place in nature. Look at the Mustela vison of North America, which has webbed feet and which resembles an otter in its fur, short\nlegs, and form of tail; during summer this animal dives for and preys on fish, but during the long winter it leaves the frozen waters, and preys like other\npolecats on mice and land animals. If a different case had been taken, and it had been asked how an insectivorous quadruped could possibly have been converted\ninto a flying bat, the question would have been far more difficult, and I could have given no answer. Yet I think such difficulties have very little weight.", "uuid" : "F29EC5B3", "_id" : { "$oid" : "508d3d2e66d2620200000018" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[255]", "startOffset" : 1, "end" : "/div[1]/div[1]/p[255]", "endOffset" : 1097, "_id" : { "$oid" : "508d3d2e66d2620200000019" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351433518484 }, "created" : { "$date" : 1351433518484 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508d3dbfc7a37c020000001c", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "11.How could natural selection have resulted in organs of perfection and such high level of complexity such as the eye? The eye is not perfect and it is the result of millions of years of change", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "To suppose that the eye, with all its inimitable contrivances for adjusting the focus to different distances, for\nadmitting different amounts of light, and for the correction of spherical and chromatic aberration, could have been formed by natural selection, seems, I\nfreely confess, absurd in the highest possible degree. Yet reason tells me, that if numerous gradations from a perfect and complex eye to one very imperfect\nand simple, each grade being useful to its possessor, can be shown to exist; if further, the eye does vary ever so slightly, and the variations be inherited,\nwhich is certainly the case; and if any variation or modification in the organ be ever useful to an animal under changing conditions of life, then the\ndifficulty of believing that a perfect and complex eye could be formed by natural selection, though insuperable by our imagination, can hardly be considered\nreal. How a nerve comes to be sensitive to light, hardly concerns us more than how life itself first originated; but I may remark that several facts make me\nsuspect that any sensitive nerve may be rendered sensitive to light, and likewise to those coarser vibrations of the air which produce sound.", "uuid" : "A07D1E1B", "_id" : { "$oid" : "508d3dbfc7a37c020000001c" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[267]", "startOffset" : 1, "end" : "/div[1]/div[1]/p[267]", "endOffset" : 1190, "_id" : { "$oid" : "508d3dbfc7a37c020000001d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351433663226 }, "created" : { "$date" : 1351433663226 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508d3e3566d262020000001a", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "11.Comparing the eye to a telescope, which was the result of intelligent design, therefore the eye must be so as well. A lack of understanding about how the eye works is clouding judgment ", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "It is scarcely possible to avoid comparing the eye to a telescope. We know that this instrument has been perfected by the long-continued efforts of the\nhighest human intellects; and we naturally infer that the eye has been formed by a somewhat analogous process. But may not this inference be presumptuous? Have\nwe any right to assume that the Creator works by intellectual powers like those of man? If we must compare the eye to an optical instrument, we ought in\nimagination to take a thick layer of transparent tissue, with a nerve sensitive to light beneath, and then suppose every part of this layer to be continually\nchanging slowly in density, so as to separate into layers of different densities and thicknesses, placed at different distances from each other, and with the\nsurfaces of each layer slowly changing in form. Further we must suppose that there is a power always intently watching each slight accidental alteration in the\ntransparent layers; and carefully selecting each alteration which, under varied circumstances, may in any way, or in any degree, tend to produce a distincter\nimage. We must suppose each new state of the instrument to be multiplied by the million; and each to be preserved till a better be produced, and then the old\nones to be destroyed. In living bodies, variation will cause the slight alterations, generation will multiply them almost infinitely, and natural selection\nwill pick out with unerring skill each improvement. Let this process go on for millions on millions of years; and during each year on millions of individuals\nof many kinds; and may we not believe that a living optical instrument might thus be formed as superior to one of glass, as the works of the Creator are to\nthose of man?", "uuid" : "D77D0ED2", "_id" : { "$oid" : "508d3e3566d262020000001a" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[271]", "startOffset" : 1, "end" : "/div[1]/div[1]/p[271]", "endOffset" : 1741, "_id" : { "$oid" : "508d3e3566d262020000001b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351433781293 }, "created" : { "$date" : 1351433781293 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508d3e6ec7a37c020000001e", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "11.Since so many organisms have eyes, it must have first formed very far back, before a lot of the branching we have today began", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "If it could be demonstrated that any complex organ existed, which could not possibly have been formed by numerous, successive, slight modifications, my\ntheory would absolutely break down. But I can find out no such case. No doubt many organs exist of which we do not know the transitional grades, more\nespecially if we look to much-isolated species, round which, according to my theory, there has been much extinction. Or again, if we look to an organ common to\nall the members of a large class, for in this latter case the organ must have been first formed at an extremely remote period, since which all the many members\nof the class have been developed; and in order to discover the early transitional grades through which the organ has passed, we should have to look to very\nancient ancestral forms, long since become extinct.", "uuid" : "5634C7CE", "_id" : { "$oid" : "508d3e6ec7a37c020000001e" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[272]", "startOffset" : 1, "end" : "/div[1]/div[1]/p[272]", "endOffset" : 830, "_id" : { "$oid" : "508d3e6ec7a37c020000001f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351433838347 }, "created" : { "$date" : 1351433838347 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508d3ff166d262020000001c", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "11.Complexity and difference in organs between species could be the result of transitional gradations - random changes over time that changed the nature of an organism and sent it down a completely different pathway?", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "We should be extremely cautious in concluding that an organ could not have been formed by transitional gradations of some kind. Numerous cases could be\ngiven amongst the lower animals of the same organ performing at the same time wholly distinct functions; thus the alimentary canal respires, digests, and\nexcretes in the larva of the dragon-fly and in the fish Cobites. In the Hydra, the animal may be turned inside out, and the exterior surface will then digest\nand the stomach respire. In such cases natural selection might easily specialise, if any advantage were thus gained, a part or organ, which had performed two\nfunctions, for one function alone, and thus wholly change its nature by insensible steps. Two distinct organs sometimes perform simultaneously the same\nfunction in the same individual; to give one instance, there are fish with gills or branchiae that breathe the air dissolved in the water, at the same time\nthat they breathe free air in their swimbladders, this latter organ having a ductus pneumaticus for its supply, and being divided by highly vascular\npartitions. In these cases, one of the two organs might with ease be modified and perfected so as to perform all the work by itself, being aided during the\nprocess of modification by the other organ; and then this other organ might be modified for some other and quite distinct purpose, or be quite obliterated.", "uuid" : "8953FEAC", "_id" : { "$oid" : "508d3ff166d262020000001c" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[273]", "startOffset" : 1, "end" : "/div[1]/div[1]/p[273]", "endOffset" : 1391, "_id" : { "$oid" : "508d3ff166d262020000001d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351434225962 }, "created" : { "$date" : 1351434225962 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508d4089c7a37c0200000020", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "12.Organs of little apparent importance - we cannot always tell what is important and what is not, but some trait that may have been extremely beneficial a million years ago, may have been \"perfected\" through natural selection and passed on, but not nearly as necessary now. As long as this trait is not detrimental, whether or not it will be continued to be passed on is random", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "Organs now of trifling importance have probably in some cases been of high importance to an early progenitor, and, after having been slowly perfected at a\nformer period, have been transmitted in nearly the same state, although now become of very slight use; and any actually injurious deviations in their structure\nwill always have been checked by natural selection. Seeing how important an organ of locomotion the tail is in most aquatic animals, its general presence and\nuse for many purposes in so many land animals, which in their lungs or modified swim-bladders betray their aquatic origin, may perhaps be thus accounted for. A\nwell-developed tail having been formed in an aquatic animal, it might subsequently come to be worked in for all sorts of purposes, as a fly-flapper, an organ\nof prehension, or as an aid in turning, as with the dog, though the aid must be slight, for the hare, with hardly any tail, can double quickly enough.", "uuid" : "18B2AF1B", "_id" : { "$oid" : "508d4089c7a37c0200000020" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[283]", "startOffset" : 1, "end" : "/div[1]/div[1]/p[283]", "endOffset" : 942, "_id" : { "$oid" : "508d4089c7a37c0200000021" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1351434377587 }, "created" : { "$date" : 1351434377587 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508d87f401e0db0200000002", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "detailed description of red-room; beginning of novel able to set tone; as a reader i could feel the creepy/supernatural mood of the book right from the start", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "The red-room was a square chamber, very seldom slept in, I \nmight say never, indeed, unless when a chance influx of visitors \nat Gateshead Hall rendered it necessary to turn to account all \nthe accommodation it contained: yet it was one of the largest and\nstateliest chambers in the mansion.  A bed supported on \nmassive pillars of mahogany, hung with curtains of deep red \ndamask, stood out like a tabernacle in the centre; the two large \nwindows, with their blinds always drawn down, were half shrouded \nin festoons and falls of similar drapery; the carpet was red; the\ntable at the foot of the bed was covered with a crimson cloth; \nthe walls were a soft fawn colour with a blush of pink in it; the\nwardrobe, the toilet-table, the chairs were of darkly polished \nold mahogany.  Out of these deep surrounding shades rose \nhigh, and glared white, the piled-up mattresses and pillows of \nthe bed, spread with a snowy Marseilles counterpane.  \nScarcely less prominent was an ample cushioned easy-chair near \nthe head of the bed, also white, with a footstool before it; and \nlooking, as I thought, like a pale throne", "uuid" : "B81717BB", "_id" : { "$oid" : "508d87f401e0db0200000002" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]/p[20]", "startOffset" : 0, "end" : "/div[1]/div[4]/p[20]", "endOffset" : 1114, "_id" : { "$oid" : "508d87f401e0db0200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351452660586 }, "created" : { "$date" : 1351452660586 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "508d887901e0db0200000004" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1351452793985 }, "groups" : [ "21L.003" ], "id" : "508d887901e0db0200000004", "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "quote" : "I was a discord in Gateshead Hall: I was like nobody there; I \nhad nothing in harmony with Mrs. Reed or her children, or her \nchosen vassalage.  If they did not love me, in fact, as \nlittle did I love them.", "ranges" : [ { "start" : "/div[1]/div[4]/p[29]", "startOffset" : 0, "end" : "/div[1]/div[4]/p[29]", "endOffset" : 208, "_id" : { "$oid" : "508d887901e0db0200000005" } } ], "tags" : [], "text" : "challenges as an orphan; feeling of sympathy. bronte foreshadows exploration of social class and relations/unfair treatment", "updated" : { "$date" : 1351452810198 }, "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "user" : "angelaha@mit.edu", "username" : "Angela H.", "uuid" : "E7611C1E" } -{ "id" : "508d893801e0db0200000006", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "\"i will rise again\"--helen's impact on jane's life; represents love, forgiveness, kindness--jane is opposite in way she behaves...thought of perhaps good people win in the end?", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "“Resurgam.”", "uuid" : "001398F2", "_id" : { "$oid" : "508d893801e0db0200000006" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[11]/p[61]", "startOffset" : 201, "end" : "/div[1]/div[11]/p[61]", "endOffset" : 212, "_id" : { "$oid" : "508d893801e0db0200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351452984185 }, "created" : { "$date" : 1351452984185 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508d8a3301e0db0200000008", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "jane saying what is on her mind; blunt; brocklehurst depicted as religious hypocrite/uses his piety for control and for himself which is not what piety is about, obviously.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "“No? oh, shocking!  I have a little boy, younger \nthan you, who knows six Psalms by heart: and when you ask him \nwhich he would rather have, a gingerbread-nut to eat or a verse \nof a Psalm to learn, he says: ‘Oh! the verse of a Psalm! \nangels sing Psalms;’ says he, ‘I wish to be a little \nangel here below;’ he then gets two nuts in recompense for \nhis infant piety.”\n“Psalms are not interesting,” I remarked.", "uuid" : "6C818A58", "_id" : { "$oid" : "508d8a3301e0db0200000008" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]/p[53]", "startOffset" : 0, "end" : "/div[1]/div[6]/p[54]", "endOffset" : 41, "_id" : { "$oid" : "508d8a3301e0db0200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351453235649 }, "created" : { "$date" : 1351453235649 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508d8ae101e0db020000000a", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "liberty from mrs. reed? jane is restricted by her surroundings throughout the novel...yet she stands up for herself. interesting contrast between her and helen's reactions to things in novel", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "“How dare I, Mrs. Reed?  How dare I?  Because \nit is the truth.  You think I have no feelings, and \nthat I can do without one bit of love or kindness; but I cannot \nlive so: and you have no pity.  I shall remember how you \nthrust me back—roughly and violently thrust me \nback—into the red-room, and locked me up there, to my dying\nday; though I was in agony; though I cried out, while suffocating\nwith distress, ‘Have mercy!  Have mercy, Aunt \nReed!’  And that punishment you made me suffer because\nyour wicked boy struck me—knocked me down for \nnothing.  I will tell anybody who asks me questions, this \nexact tale.  People think you a good woman, but you are bad,\nhard-hearted.  You are deceitful!”", "uuid" : "FC5DE39E", "_id" : { "$oid" : "508d8ae101e0db020000000a" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[6]/p[83]", "startOffset" : 0, "end" : "/div[1]/div[6]/p[83]", "endOffset" : 700, "_id" : { "$oid" : "508d8ae101e0db020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351453409180 }, "created" : { "$date" : 1351453409180 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "508db8a64f786e0200000002" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1351465126990 }, "groups" : [ "21L.003" ], "id" : "508db8a64f786e0200000002", "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "quote" : "heroic-lookin", "ranges" : [ { "start" : "/div[1]/div[14]/p[22]", "startOffset" : 579, "end" : "/div[1]/div[14]/p[22]", "endOffset" : 592, "_id" : { "$oid" : "508db8a64f786e0200000003" } } ], "tags" : [], "text" : "shuns heroic features", "updated" : { "$date" : 1351465135094 }, "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "uuid" : "4A93754D" } -{ "id" : "508db8dd4f786e0200000004", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Jane and Celine are opposites", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Céline", "uuid" : "4A93087A", "_id" : { "$oid" : "508db8dd4f786e0200000004" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[17]/p[2]", "startOffset" : 66, "end" : "/div[1]/div[17]/p[2]", "endOffset" : 73, "_id" : { "$oid" : "508db8dd4f786e0200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351465181759 }, "created" : { "$date" : 1351465181759 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508db94b4f786e0200000006", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "the tree is mentioned several times; does it parallel Jane and Rochester's relationship in any way?", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "chestnut \ntree", "uuid" : "B9B3EDBC", "_id" : { "$oid" : "508db94b4f786e0200000006" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[25]/p[48]", "startOffset" : 285, "end" : "/div[1]/div[25]/p[48]", "endOffset" : 300, "_id" : { "$oid" : "508db94b4f786e0200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351465291860 }, "created" : { "$date" : 1351465291860 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508db96801e0db020000000c", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "tree split! bad omen?", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "chestnut", "uuid" : "DE5B6BE8", "_id" : { "$oid" : "508db96801e0db020000000c" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[25]/p[120]", "startOffset" : 99, "end" : "/div[1]/div[25]/p[120]", "endOffset" : 107, "_id" : { "$oid" : "508db96801e0db020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351465320363 }, "created" : { "$date" : 1351465320363 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508db98901e0db020000000e", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Jane has an interesting take on religion and nature", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "religion", "uuid" : "5FC1252F", "_id" : { "$oid" : "508db98901e0db020000000e" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[34]/p[60]", "startOffset" : 802, "end" : "/div[1]/div[34]/p[60]", "endOffset" : 811, "_id" : { "$oid" : "508db98901e0db020000000f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351465353023 }, "created" : { "$date" : 1351465353023 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508e047b4f786e0200000008", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "uncomfortable feeling jane endures; blanche's disrespectful comments/ common theme throughout book, tension!!", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "“Why, I suppose you have a governess for her: I saw a \nperson with her just now—is she gone?  Oh, no! there \nshe is still, behind the window-curtain.  You pay her, of \ncourse; I should think it quite as expensive,—more so; for \nyou have them both to keep in addition.”\nI feared—or should I say, hoped?—the allusion to \nme would make Mr. Rochester glance my way; and I involuntarily \nshrank farther into the shade: but he never turned his eyes.\n“I have not considered the subject,” said he \nindifferently, looking straight before him.\n“No, you men never do consider economy and common \nsense.  You should hear mama on the chapter of governesses: \nMary and I have had, I should think, a dozen at least in our day;\nhalf of them detestable and the rest ridiculous, and all \nincubi—were they not, mama?”\n“Did you speak, my own?”\nThe young lady thus claimed as the dowager’s special \nproperty, reiterated her question with an explanation.\n“My dearest, don’t mention governesses; the word \nmakes me nervous.  I have suffered a martyrdom from their \nincompetency and caprice.  I thank Heaven I have now done \nwith them!”", "uuid" : "B59B2B6F", "_id" : { "$oid" : "508e047b4f786e0200000008" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[19]/p[94]", "startOffset" : 0, "end" : "/div[1]/div[19]/p[100]", "endOffset" : 179, "_id" : { "$oid" : "508e047b4f786e0200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351484539490 }, "created" : { "$date" : 1351484539490 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508e060401e0db0200000010", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "what was coming next? love? blanche stays in way of their love. this love/relationship part of the story interested me because....it appeals to girl i feel lol more romantic side of things. begin to question will they end up together?!", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Now go, and send Sophie for \nAdèle.  Good-night, my—”  He \nstopped, bit his lip, and abruptly left me.", "uuid" : "43665885", "_id" : { "$oid" : "508e060401e0db0200000010" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[19]/p[156]", "startOffset" : 511, "end" : "/div[1]/div[19]/p[156]", "endOffset" : 614, "_id" : { "$oid" : "508e060401e0db0200000011" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351484932781 }, "created" : { "$date" : 1351484932781 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508e0a064f786e020000000a", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "jane falling for rochester; perhaps saw him in a light that presented him as better than he actually was, just because she is interested in him...reality is that he still lives in the world at this time period where social status, money, etc. are real and prominent issues", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "I have not yet said anything condemnatory of Mr. \nRochester’s project of marrying for interest and \nconnections.  It surprised me when I first discovered that \nsuch was his intention: I had thought him a man unlikely to be \ninfluenced by motives so commonplace in his choice of a wife; but\nthe longer I considered the position, education, &c., of the \nparties, the less I felt justified in judging and blaming either \nhim or Miss Ingram for acting in conformity to ideas and \nprinciples instilled into them, doubtless, from their \nchildhood.  All their class held these principles: I \nsupposed, then, they had reasons for holding them such as I could\nnot fathom.  It seemed to me that, were I a gentleman like \nhim, I would take to my bosom only such a wife as I could love; \nbut the very obviousness of the advantages to the husband’s\nown happiness offered by this plan convinced me that there must \nbe arguments against its general adoption of which I was quite \nignorant: otherwise I felt sure all the world would act as I \nwished to act.", "uuid" : "E8178088", "_id" : { "$oid" : "508e0a064f786e020000000a" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[20]/p[31]", "startOffset" : 0, "end" : "/div[1]/div[20]/p[31]", "endOffset" : 1041, "_id" : { "$oid" : "508e0a064f786e020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351485958554 }, "created" : { "$date" : 1351485958554 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508e0ab84f786e020000000c", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "rochester=home; contrast from beginning of novel when she says that she does not want to relate herself to her real family--now she has gone out and found her real sense of place", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Pass, Janet,” said he, making room for me to \ncross the stile: “go up home, and stay your weary little \nwandering feet at a friend’s threshold.”\nAll I had now to do was to obey him in silence: no need for me\nto colloquise further.  I got over the stile without a word,\nand meant to leave him calmly.  An impulse held me \nfast—a force turned me round.  I said—or \nsomething in me said for me, and in spite of me—\n“Thank you, Mr. Rochester, for your great \nkindness.  I am strangely glad to get back again to you: and\nwherever you are is my home—my only home.”", "uuid" : "9C9D81E0", "_id" : { "$oid" : "508e0ab84f786e020000000c" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[24]/p[32]", "startOffset" : 1, "end" : "/div[1]/div[24]/p[34]", "endOffset" : 146, "_id" : { "$oid" : "508e0ab84f786e020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351486136218 }, "created" : { "$date" : 1351486136218 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508e0ba14f786e020000000e", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "i must flee--what she wants is mr. rochester, but she is afraid at the same time--conflicting; perhaps because marrying him would be a form of her being tied down again? ", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Sweet-briar and southernwood, jasmine, pink, and rose have \nlong been yielding their evening sacrifice of incense: this new \nscent is neither of shrub nor flower; it is—I know it \nwell—it is Mr. Rochester’s cigar.  I look round \nand I listen.  I see trees laden with ripening fruit.  \nI hear a nightingale warbling in a wood half a mile off; no \nmoving form is visible, no coming step audible; but that perfume \nincreases: I must flee.  I make for the wicket leading to \nthe shrubbery, and I see Mr. Rochester entering.  I step \naside into the ivy recess; he will not stay long: he will soon \nreturn whence he came, and if I sit still he will never see \nme.", "uuid" : "50F77784", "_id" : { "$oid" : "508e0ba14f786e020000000e" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[25]/p[5]", "startOffset" : 0, "end" : "/div[1]/div[25]/p[5]", "endOffset" : 657, "_id" : { "$oid" : "508e0ba14f786e020000000f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351486369767 }, "created" : { "$date" : 1351486369767 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508e0df601e0db0200000012", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "recognizes social differences between her and mr. rochester; doesn't want to feel like he is baby-ing her...searching for independence but her feelings gravitate towards him ", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "“It would, indeed, be a relief,” I thought, “if\nI had ever so small an independency; I never can bear being \ndressed like a doll by Mr. Rochester, or sitting like a second \nDanae with the golden shower falling daily round me.", "uuid" : "F5877FF6", "_id" : { "$oid" : "508e0df601e0db0200000012" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[26]/p[126]", "startOffset" : 432, "end" : "/div[1]/div[26]/p[126]", "endOffset" : 659, "_id" : { "$oid" : "508e0df601e0db0200000013" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351486966475 }, "created" : { "$date" : 1351486966475 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508e17ab4f786e0200000010", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "cheated into espousing? was he really cheated...what made bertha become like that? maybe him...", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Bertha Mason is mad; and she came of a mad \nfamily; idiots and maniacs through three generations!  Her \nmother, the Creole, was both a madwoman and a drunkard!—as \nI found out after I had wed the daughter: for they were silent on\nfamily secrets before.  Bertha, like a dutiful child, copied\nher parent in both points.  I had a charming \npartner—pure, wise, modest: you can fancy I was a happy \nman.  I went through rich scenes!  Oh! my experience \nhas been heavenly, if you only knew it!  But I owe you no \nfurther explanation.  Briggs, Wood, Mason, I invite you all \nto come up to the house and visit Mrs. Poole’s patient, and\nmy wife!  You shall see what sort of a being I was \ncheated into espousing,", "uuid" : "53B234E8", "_id" : { "$oid" : "508e17ab4f786e0200000010" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[28]/p[60]", "startOffset" : 1126, "end" : "/div[1]/div[28]/p[60]", "endOffset" : 1830, "_id" : { "$oid" : "508e17ab4f786e0200000011" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351489451204 }, "created" : { "$date" : 1351489451204 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508e264e01e0db0200000014", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "multiple mentions of creole--trying to reference creole(?) she has european background? mixed descent? locally born people with foreign ancestry", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Creole", "uuid" : "00B3C271", "_id" : { "$oid" : "508e264e01e0db0200000014" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[29]/p[92]", "startOffset" : 901, "end" : "/div[1]/div[29]/p[92]", "endOffset" : 908, "_id" : { "$oid" : "508e264e01e0db0200000015" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351493198425 }, "created" : { "$date" : 1351493198425 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "508e270c4f786e0200000012" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1351493388625 }, "groups" : [ "21L.003" ], "id" : "508e270c4f786e0200000012", "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "quote" : "Still indomitable was the reply—“I care for\nmyself.  The more solitary, the more friendless, the more \nunsustained I am, the more I will respect myself.  I will \nkeep the law given by God; sanctioned by man.  I will hold \nto the principles received by me when I was sane, and not \nmad—as I am now.  Laws and principles are not for the \ntimes when there is no temptation: they are for such moments as \nthis, when body and soul rise in mutiny against their rigour; \nstringent are they; inviolate they shall be.  If at my \nindividual convenience I might break them, what would be their \nworth?  They have a worth—so I have always believed; \nand if I cannot believe it now, it is because I am \ninsane—quite insane: with my veins running fire, and my \nheart beating faster than I can count its throbs.  \nPreconceived opinions, foregone determinations, are all I have at\nthis hour to stand by: there I plant my foot.”", "ranges" : [ { "start" : "/div[1]/div[29]/p[132]", "startOffset" : 0, "end" : "/div[1]/div[29]/p[132]", "endOffset" : 911, "_id" : { "$oid" : "508e270c4f786e0200000013" } } ], "tags" : [], "text" : "takes care of herself; self independent and confident which helps her relationships with others be more stable in the end...", "updated" : { "$date" : 1351554203393 }, "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "user" : "angelaha@mit.edu", "username" : "Angela H.", "uuid" : "7E4A973F" } -{ "id" : "508e3f554f786e0200000014", "user" : "qinxuan@mit.edu", "username" : "Qinxuan P.", "text" : "shows clear distinction between the dominant and the dominated, promprts the readers to categorize people on board into those two categoryies.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "a dark satyr in a mask, holding his foot on the\nprostrate neck of a writhing figure, likewise\nmasked", "uuid" : "7AE870D6", "_id" : { "$oid" : "508e3f554f786e0200000014" }, "permissions" : { "delete" : [ "qinxuan@mit.edu" ], "update" : [ "qinxuan@mit.edu" ], "admin" : [ "qinxuan@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 1057, "end" : "/div[1]/p[11]", "endOffset" : 1157, "_id" : { "$oid" : "508e3f554f786e0200000015" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351499605152 }, "created" : { "$date" : 1351499605152 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508e3f8c4f786e0200000016", "user" : "qinxuan@mit.edu", "username" : "Qinxuan P.", "text" : "showing extreme care, but in fact close-monitoring", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "remaining within\ncall of a whisper", "uuid" : "0A42362E", "_id" : { "$oid" : "508e3f8c4f786e0200000016" }, "permissions" : { "delete" : [ "qinxuan@mit.edu" ], "update" : [ "qinxuan@mit.edu" ], "admin" : [ "qinxuan@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[166]", "startOffset" : 347, "end" : "/div[1]/p[166]", "endOffset" : 381, "_id" : { "$oid" : "508e3f8c4f786e0200000017" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351499660295 }, "created" : { "$date" : 1351499660295 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508e3ffb4f786e0200000018", "user" : "qinxuan@mit.edu", "username" : "Qinxuan P.", "text" : "suggesting dual attitude towards blood", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "humorous sorrow", "uuid" : "FA34A008", "_id" : { "$oid" : "508e3ffb4f786e0200000018" }, "permissions" : { "delete" : [ "qinxuan@mit.edu" ], "update" : [ "qinxuan@mit.edu" ], "admin" : [ "qinxuan@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[265]", "startOffset" : 540, "end" : "/div[1]/p[265]", "endOffset" : 555, "_id" : { "$oid" : "508e3ffb4f786e0200000019" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351499771167 }, "created" : { "$date" : 1351499771167 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508e401d01e0db0200000016", "user" : "qinxuan@mit.edu", "username" : "Qinxuan P.", "text" : "warns Don Benito against any possible deviation by blood", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "See, master—you shook so—here's Babo's\nfirst blood.", "uuid" : "FE13C984", "_id" : { "$oid" : "508e401d01e0db0200000016" }, "permissions" : { "delete" : [ "qinxuan@mit.edu" ], "update" : [ "qinxuan@mit.edu" ], "admin" : [ "qinxuan@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[265]", "startOffset" : 558, "end" : "/div[1]/p[265]", "endOffset" : 609, "_id" : { "$oid" : "508e401d01e0db0200000017" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351499805418 }, "created" : { "$date" : 1351499805418 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508e406c4f786e020000001a", "user" : "qinxuan@mit.edu", "username" : "Qinxuan P.", "text" : "Babo is absent from the scene, as he can't fit in any of his dual roles.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Seating himself in the stern, Captain Delano,\nmaking a last salute, ordered the boat shoved\noff. The crew had their oars on end. The\nbowsmen pushed the boat a sufficient distance\nfor the oars to be lengthwise dropped. The\ninstant that was done, Don Benito sprang over\nthe bulwarks, falling at the feet of Captain\nDelano; at the same time calling towards his\nship, but in tones so frenzied, that none in the\nboat could understand him. But, as if not\n[pg 235]\n\nequally obtuse, three sailors, from three different\nand distant parts of the ship, splashed into\nthe sea, swimming after their captain, as if intent\nupon his rescue.", "uuid" : "6B166C90", "_id" : { "$oid" : "508e406c4f786e020000001a" }, "permissions" : { "delete" : [ "qinxuan@mit.edu" ], "update" : [ "qinxuan@mit.edu" ], "admin" : [ "qinxuan@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[362]", "startOffset" : 0, "end" : "/div[1]/p[362]", "endOffset" : 624, "_id" : { "$oid" : "508e406c4f786e020000001b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351499884457 }, "created" : { "$date" : 1351499884457 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508e40c34f786e020000001c", "user" : "qinxuan@mit.edu", "username" : "Qinxuan P.", "text" : "echos the carved writhing figure on the ship, suggesting Babo's final place.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "ground the prostrate negro", "uuid" : "2EF4BC49", "_id" : { "$oid" : "508e40c34f786e020000001c" }, "permissions" : { "delete" : [ "qinxuan@mit.edu" ], "update" : [ "qinxuan@mit.edu" ], "admin" : [ "qinxuan@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[366]", "startOffset" : 194, "end" : "/div[1]/p[366]", "endOffset" : 220, "_id" : { "$oid" : "508e40c34f786e020000001d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351499971172 }, "created" : { "$date" : 1351499971172 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508f14fa51a1290200000002", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "she can control herself mentally--knows that staying with him will be a different sort of imprisonment/inequality--even though she will suffer emotionally, she does the right thing for herself", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "mentally, I still possessed my soul, and with it the \ncertainty of ultimate safety.", "uuid" : "C4F728CA", "_id" : { "$oid" : "508f14fa51a1290200000002" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[29]/p[133]", "startOffset" : 373, "end" : "/div[1]/div[29]/p[133]", "endOffset" : 457, "_id" : { "$oid" : "508f14fa51a1290200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351554298935 }, "created" : { "$date" : 1351554298935 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508f1580ca75c50200000004", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "by leaving, she is leaving a part of herself behind. a part of her home...if i were in her situation, i would not have been able to leave...conveys her self discipline and strength", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "“You are going, Jane?”\n“I am going, sir.”\n“You are leaving me?”\n“Yes.”\n“You will not come?  You will not be my comforter, \nmy rescuer?  My deep love, my wild woe, my frantic prayer, \nare all nothing to you?”\nWhat unutterable pathos was in his voice!  How hard it \nwas to reiterate firmly, “I am going.”\n“Jane!”\n“Mr. Rochester!”\n“Withdraw, then,—I consent; but remember, you \nleave me here in anguish.  Go up to your own room; think \nover all I have said, and, Jane, cast a glance on my \nsufferings—think of me.”", "uuid" : "DB618E43", "_id" : { "$oid" : "508f1580ca75c50200000004" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[29]/p[136]", "startOffset" : 0, "end" : "/div[1]/div[29]/p[144]", "endOffset" : 183, "_id" : { "$oid" : "508f1580ca75c50200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351554432177 }, "created" : { "$date" : 1351554432177 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508f29e7ca75c50200000006", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "powerful character, forceful st. john/replaces rochester in her life in the sense of a authoritative figure in the novel...yet, contrasts rochester as well", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "“Is it you, Mr. St. John?” cried Hannah.\n“Yes—yes; open quickly.”\n“Well, how wet and cold you must be, such a wild night \nas it is!  Come in—your sisters are quite uneasy about\nyou, and I believe there are bad folks about.  There has \nbeen a beggar-woman—I declare she is not gone \nyet!—laid down there.  Get up! for shame!  Move \noff, I say!”\n“Hush, Hannah!  I have a word to say to the \nwoman.  You have done your duty in excluding, now let me do \nmine in admitting her.  I was near, and listened to both you\nand her.  I think this is a peculiar case—I must at \nleast examine into it.  Young woman, rise, and pass before \nme into the house.”\n\n\n\n\nWith difficulty I obeyed him.", "uuid" : "CF6E1DD6", "_id" : { "$oid" : "508f29e7ca75c50200000006" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[30]/p[114]", "startOffset" : 0, "end" : "/div[1]/div[30]/p[119]", "endOffset" : 30, "_id" : { "$oid" : "508f29e7ca75c50200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351559655261 }, "created" : { "$date" : 1351559655261 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508f2b7f51a1290200000004", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "temptation; she has suffered throughout her journey and now this would be for a cause...however, st. john oppresses her and his morals do not line with hers. he is trying to control her and she recognizes that she must think for herself and what is truly good for herself", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "idea his \nwife.  Oh! it would never do!  As his curate, his \ncomrade, all would be right: I would cross oceans with him in \nthat capacity; toil under Eastern suns, in Asian deserts with him\nin that office; admire and emulate his courage and devotion and \nvigour; accommodate quietly to his masterhood; smile undisturbed \nat his ineradicable ambition; discriminate the Christian from the\nman: profoundly esteem the one, and freely forgive the \nother.  I should suffer often, no doubt, attached to him \nonly in this capacity: my body would be under rather a stringent \nyoke, but my heart and mind would be free.  I should still \nhave my unblighted self to turn to: my natural unenslaved \nfeelings with which to communicate in moments of \nloneliness.  There would be recesses in my mind which would \nbe only mine, to which he never came, and sentiments growing \nthere fresh and sheltered which his austerity could never blight,\nnor his measured warrior-march trample down: but as his \nwife—at his side always, and always restrained, and always \nchecked—forced to keep the fire of my nature continually \nlow, to compel it to burn inwardly and never utter a cry, though \nthe imprisoned flame consumed vital after vital—this\nwould be unendurable.", "uuid" : "9585BFAB", "_id" : { "$oid" : "508f2b7f51a1290200000004" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[36]/p[137]", "startOffset" : 286, "end" : "/div[1]/div[36]/p[137]", "endOffset" : 1527, "_id" : { "$oid" : "508f2b7f51a1290200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351560063467 }, "created" : { "$date" : 1351560063467 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "508f2f18ca75c50200000008", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "reflective; now been married for ten years. contrasting thoughts on the end...she goes back to rochester, so in a way she didnt find the true independence she's been searching for...yet at the same time, situation has changed because of rochester's physical disabilities which makes them more equal, and she loves him and finds true happiness.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "I have now been married ten years.  I know what it is to \nlive entirely for and with what I love best on earth.  I \nhold myself supremely blest—blest beyond what language can \nexpress; because I am my husband’s life as fully as he is \nmine.  No woman was ever nearer to her mate than I am: ever \nmore absolutely bone of his bone and flesh of his flesh.  I \nknow no weariness of my Edward’s society: he knows none of \nmine, any more than we each do of the pulsation of the heart that\nbeats in our separate bosoms; consequently, we are ever \ntogether.  To be together is for us to be at once as free as\nin solitude, as gay as in company.  We talk, I believe, all \nday long: to talk to each other is but a more animated and an \naudible thinking.  All my confidence is bestowed on him, all\nhis confidence is devoted to me; we are precisely suited in \ncharacter—perfect concord is the result.\nMr. Rochester continued blind the first two years of our \nunion; perhaps it was that circumstance that drew us so very \nnear—that knit us so very close: for I was then his vision,\nas I am still his right hand.  Literally, I was (what he \noften called me) the apple of his eye.  He saw \nnature—he saw books through me; and never did I weary of \ngazing for his behalf, and of putting into words the effect of \nfield, tree, town, river, cloud, sunbeam—of the landscape \nbefore us; of the weather round us—and impressing by sound \non his ear what light could no longer stamp on his eye.  \nNever did I weary of reading to him; never did I weary of \nconducting him where he wished to go: of doing for him what he \nwished to be done.  And there was a pleasure in my services,\nmost full, most exquisite, even though sad—because he \nclaimed these services without painful shame or damping \nhumiliation.  He loved me so truly, that he knew no \nreluctance in profiting by my attendance: he felt I loved him so \nfondly, that to yield that attendance was to indulge my sweetest \nwishes.\nOne morning at the end of the two years, as I was writing a \nletter to his dictation, he came and bent over me, and \nsaid—“Jane, have you a glittering ornament round your\nneck?”\nI had a gold watch-chain: I answered “Yes.”\n“And have you a pale blue dress on?”\n\n\n\n\nI had.  He informed me then, that for some time he had \nfancied the obscurity clouding one eye was becoming less dense; \nand that now he was sure of it.\nHe and I went up to London.  He had the advice of an \neminent oculist; and he eventually recovered the sight of that \none eye.  He cannot now see very distinctly: he cannot read \nor write much; but he can find his way without being led by the \nhand: the sky is no longer a blank to him—the earth no \nlonger a void.  When his first-born was put into his arms, \nhe could see that the boy had inherited his own eyes, as they \nonce were—large, brilliant, and black.  On that \noccasion, he again, with a full heart, acknowledged that God had \ntempered judgment with mercy.\nMy Edward and I, then, are happy: and the more so, because \nthose we most love are happy likewise.  Diana and Mary \nRivers are both married: alternately, once every year, they come \nto see us, and we go to see them.  Diana’s husband is \na captain in the navy, a gallant officer and a good man.  \nMary’s is a clergyman, a college friend of her \nbrother’s, and, from his attainments and principles, worthy\nof the connection.  Both Captain Fitzjames and Mr. Wharton \nlove their wives, and are loved by them.\nAs to St. John Rivers, he left England: he went to \nIndia.  He entered on the path he had marked for himself; he\npursues it still.  A more resolute, indefatigable pioneer \nnever wrought amidst rocks and dangers.  Firm, faithful, and\ndevoted, full of energy, and zeal, and truth, he labours for his \nrace; he clears their painful way to improvement; he hews down \nlike a giant the prejudices of creed and caste that encumber \nit.  He may be stern; he may be exacting; he may be \nambitious yet; but his is the sternness of the warrior \nGreatheart, who guards his pilgrim convoy from the onslaught of \nApollyon.  His is the exaction of the apostle, who speaks \nbut for Christ, when he says—“Whosoever will come \nafter me, let him deny himself, and take up his cross and follow \nme.”  His is the ambition of the high master-spirit, \nwhich aims to fill a place in the first rank of those who are \nredeemed from the earth—who stand without fault before the \nthrone of God, who share the last mighty victories of the Lamb, \nwho are called, and chosen, and faithful.\nSt. John is unmarried: he never will marry now.  Himself \nhas hitherto sufficed to the toil, and the toil draws near its \nclose: his glorious sun hastens to its setting.  The last \nletter I received from him drew from my eyes human tears, and yet\nfilled my heart with divine joy: he anticipated his sure reward, \nhis incorruptible crown.  I know that a stranger’s \nhand will write to me next, to say that the good and faithful \nservant has been called at length into the joy of his Lord. \nAnd why weep for this?  No fear of death will darken St. \nJohn’s last hour: his mind will be unclouded, his heart \nwill be undaunted, his hope will be sure, his faith \nsteadfast.  His own words are a pledge of this—\n“My Master,” he says, “has forewarned \nme.  Daily He announces more distinctly,—‘Surely\nI come quickly!’ and hourly I more eagerly \nrespond,—‘Amen; even so come, Lord \nJesus!’”", "uuid" : "4EE0EC39", "_id" : { "$oid" : "508f2f18ca75c50200000008" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[40]/p[13]", "startOffset" : 0, "end" : "/div[1]/div[40]/p[24]", "endOffset" : 176, "_id" : { "$oid" : "508f2f18ca75c50200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351560984455 }, "created" : { "$date" : 1351560984455 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509040dd43dfc10200000002", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "member of local judiciary, magistrates at this time were frequently protestants, but by late decades of 19th century catholics were sometimes appointed", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "magistrate?", "uuid" : "1F35DEBA", "_id" : { "$oid" : "509040dd43dfc10200000002" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[28]", "startOffset" : 11, "end" : "/div[1]/p[28]", "endOffset" : 22, "_id" : { "$oid" : "509040dd43dfc10200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351631069381 }, "created" : { "$date" : 1351631069381 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5090423743dfc10200000004", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "different religious backgrounds--> his family gets mad; clearly a big deal in this time...yet he turns it into a song?", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "The Vances lived in number seven. They had a different father and\n\nmother. They were Eileen's father and mother. When they were grown up\n\nhe was going to marry Eileen. He hid under the table. His mother said:\n\n\n\n\n\n\n\n—O, Stephen will apologize.\n\n\n\n\n\n\n\nDante said:\n\n\n\n\n\n\n\n—O, if not, the eagles will come and pull out his eyes.—\n\n\n\n\n\n\n\n Pull out his eyes,\n\n Apologize,\n\n Apologize,\n\n Pull out his eyes.\n\n Apologize,\n\n Pull out his eyes,\n\n Pull out his eyes,\n\n Apologize.", "uuid" : "8CEC4DE2", "_id" : { "$oid" : "5090423743dfc10200000004" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[12]", "startOffset" : 2, "end" : "/div[1]", "endOffset" : 1877, "_id" : { "$oid" : "5090423743dfc10200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351631415387 }, "created" : { "$date" : 1351631415387 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5090458cffebd20200000002", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "he is clearly different than other boys; what is this barrier? religious differences?", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "Nasty Roche and Saurin drank cocoa that\n\ntheir people sent them in tins. They said they could not drink the tea;\n\nthat it was hogwash. Their fathers were magistrates, the fellows said.\n\n\n\n\n\n\n\nAll the boys seemed to him very strange. They had all fathers and\n\nmothers and different clothes and voices. He longed to be at home and\n\nlay his head on his mother's lap. But he could not: and so he longed\n\nfor the play and study and prayers to be over and to be in bed.", "uuid" : "A370DA88", "_id" : { "$oid" : "5090458cffebd20200000002" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[54]", "startOffset" : 454, "end" : "/div[1]/p[55]", "endOffset" : 273, "_id" : { "$oid" : "5090458cffebd20200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351632268664 }, "created" : { "$date" : 1351632268664 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509046ef43dfc10200000006", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "thinking about god from different perspectives", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "Nothing. But was there anything round the universe to show where it\n\nstopped before the nothing place began?\n\n\n\n\n\n\n\nIt could not be a wall; but there could be a thin thin line there all\n\nround everything. It was very big to think about everything and\n\neverywhere. Only God could do that. He tried to think what a big\n\nthought that must be; but he could only think of God. God was God's\n\nname just as his name was Stephen. DIEU was the French for God and that\n\nwas God's name too; and when anyone prayed to God and said DIEU then\n\nGod knew at once that it was a French person that was praying. But,\n\nthough there were different names for God in all the different\n\nlanguages in the world and God understood what all the people who\n\nprayed said in their different languages, still God remained always the\n\nsame God and God's real name was God.", "uuid" : "FE3B47B9", "_id" : { "$oid" : "509046ef43dfc10200000006" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[84]", "startOffset" : 2, "end" : "/div[1]/p[85]", "endOffset" : 726, "_id" : { "$oid" : "509046ef43dfc10200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351632623000 }, "created" : { "$date" : 1351632623000 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509047f5ffebd20200000004", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "prayer is a big part of his life; yet stephen has his own prayers separate from that of his college...", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "fingers trembled as he undressed himself in the dormitory. He told\n\nhis fingers to hurry up. He had to undress and then kneel and say his\n\nown prayers and be in bed before the gas was lowered so that he might\n\nnot go to hell when he died. He rolled his stockings off and put on his\n\nnightshirt quickly and knelt trembling at his bedside and repeated his\n\nprayers quickly, fearing that the gas would go down. He felt his\n\nshoulders shaking as he murmured:\n\n\n\n\n\n\n\n God bless my father and my mother and spare them to me!\n\n God bless my little brothers and sisters and spare them to me!\n\n God bless Dante and Uncle Charles and spare them to me!\n\n\n\n\n\n\n\n\n\n\n\nHe blessed himself and climbed quickly into bed and, tucking the end of\n\nthe nightshirt under his feet, curled himself together under the cold\n\nwhite sheets, shaking and trembling. But he would not go to hell when\n\nhe died; and the shaking would stop. A voice bade the boys in the\n\ndormitory good night. He peered out for an instant over the coverlet\n\nand saw the yellow curtains round and before his bed that shut him off\n\non all sides. The light was lowered quietly.", "uuid" : "BE1DED35", "_id" : { "$oid" : "509047f5ffebd20200000004" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[94]", "startOffset" : 6, "end" : "/div[1]/p[96]", "endOffset" : 470, "_id" : { "$oid" : "509047f5ffebd20200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351632885123 }, "created" : { "$date" : 1351632885123 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50904903ffebd20200000006", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "self-conscious of what the other boys think; their question got into his head; also thinks about his family's rankings due to other boys' influence", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "All the people. Welcome home, Stephen! Noises of welcome. His mother\n\nkissed him. Was that right? His father was a marshal now: higher than a\n\nmagistrate. Welcome home, Stephen!", "uuid" : "EE681D67", "_id" : { "$oid" : "50904903ffebd20200000006" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[106]", "startOffset" : 2, "end" : "/div[1]/p[106]", "endOffset" : 179, "_id" : { "$oid" : "50904903ffebd20200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351633155265 }, "created" : { "$date" : 1351633155265 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509049b743dfc10200000008", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "connects things back to songs, poems, artwork in general...how he finds peace", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "ingdong! The castle bell!\n\n Farewell, my mother!\n\n Bury me in the old churchyard\n\n Beside my eldest brother.\n\n My coffin shall be black,\n\n Six angels at my back,\n\n Two to sing and two to pray\n\n And two to carry my soul away.", "uuid" : "F76D3D93", "_id" : { "$oid" : "509049b743dfc10200000008" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[152]", "startOffset" : 7, "end" : "/div[1]", "endOffset" : 32908, "_id" : { "$oid" : "509049b743dfc10200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351633335123 }, "created" : { "$date" : 1351633335123 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50904ec7ffebd20200000008", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "story of a saint's life", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "The class must be doing the themes or perhaps\n\nFather Arnall was reading out of the book.", "uuid" : "95D5E2FF", "_id" : { "$oid" : "50904ec7ffebd20200000008" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[183]", "startOffset" : 166, "end" : "/div[1]/p[183]", "endOffset" : 255, "_id" : { "$oid" : "50904ec7ffebd20200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351634631481 }, "created" : { "$date" : 1351634631481 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5090549e98d1b10200000002", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "more reference to holy spirit, the third part of the holy trinity...use religious words as support for argument", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "—WOE BE TO THE MAN BY WHOM THE SCANDAL COMETH! said Mrs Riordan. IT\n\nWOULD BE BETTER FOR HIM THAT A MILLSTONE WERE TIED ABOUT HIS NECK AND\n\nTHAT HE WERE CAST INTO THE DEPTHS OF THE SEA RATHER THAN THAT HE SHOULD\n\nSCANDALIZE ONE OF THESE, MY LEAST LITTLE ONES. That is the language of\n\nthe Holy Ghost.", "uuid" : "C4CBE222", "_id" : { "$oid" : "5090549e98d1b10200000002" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[270]", "startOffset" : 2, "end" : "/div[1]/p[270]", "endOffset" : 302, "_id" : { "$oid" : "5090549e98d1b10200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351636126168 }, "created" : { "$date" : 1351636126168 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5090552b98d1b10200000004", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "many things in his life thus far relate to religious issues and differences", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "TOWER OF IVORY, they used to say,\n\nHOUSE OF GOLD! How could a woman be a tower of ivory or a house of\n\ngold? Who was right then? And he remembered the evening in the\n\ninfirmary in Clongowes, the dark waters, the light at the pierhead and\n\nthe moan of sorrow from the people when they had heard.\n\n\n\n\n\n\n\nEileen had long white hands. One evening when playing tig she had put\n\nher hands over his eyes: long and white and thin and cold and soft.\n\nThat was ivory: a cold white thing. That was the meaning of TOWER OF\n\nIVORY.", "uuid" : "A2729343", "_id" : { "$oid" : "5090552b98d1b10200000004" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[318]", "startOffset" : 821, "end" : "/div[1]/p[320]", "endOffset" : 0, "_id" : { "$oid" : "5090552b98d1b10200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351636267536 }, "created" : { "$date" : 1351636267536 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50905e9198d1b10200000006" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1351638673265 }, "groups" : [ "21L.003" ], "id" : "50905e9198d1b10200000006", "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "quote" : "rose", "ranges" : [ { "start" : "/div[1]/p[51]", "startOffset" : 111, "end" : "/div[1]/p[51]", "endOffset" : 116, "_id" : { "$oid" : "50905e9198d1b10200000007" } } ], "tags" : [], "text" : "First mention of roses", "updated" : { "$date" : 1351638680691 }, "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "uuid" : "BDAB5382" } -{ "id" : "50905eb498d1b10200000008", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "significance? ", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "white cloak of a marshal;", "uuid" : "3C37B881", "_id" : { "$oid" : "50905eb498d1b10200000008" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[97]", "startOffset" : 589, "end" : "/div[1]/p[97]", "endOffset" : 615, "_id" : { "$oid" : "50905eb498d1b10200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351638708313 }, "created" : { "$date" : 1351638708313 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50905ed543dfc1020000000a", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Stephen's family is very split on the line of religion vs. politics", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "unfortunate\n\npriest-ridden race", "uuid" : "E32C2CCE", "_id" : { "$oid" : "50905ed543dfc1020000000a" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[345]", "startOffset" : 53, "end" : "/div[1]/p[345]", "endOffset" : 84, "_id" : { "$oid" : "50905ed543dfc1020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351638741409 }, "created" : { "$date" : 1351638741409 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50905eec43dfc1020000000c", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Stephen's initial take on women", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "TOWER OF IVORY", "uuid" : "CF91E58F", "_id" : { "$oid" : "50905eec43dfc1020000000c" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[318]", "startOffset" : 821, "end" : "/div[1]/p[318]", "endOffset" : 835, "_id" : { "$oid" : "50905eec43dfc1020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351638764556 }, "created" : { "$date" : 1351638764556 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50905f1243dfc1020000000e", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Even as a child, he has goals different from those of his peers.", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "He did not\n\nwant to play", "uuid" : "7715F191", "_id" : { "$oid" : "50905f1243dfc1020000000e" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[618]", "startOffset" : 485, "end" : "/div[1]/p[618]", "endOffset" : 509, "_id" : { "$oid" : "50905f1243dfc1020000000f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351638802031 }, "created" : { "$date" : 1351638802031 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50905f2f43dfc10200000010", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "very different from the usual kid", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "causes\n\nof his embitterment were many", "uuid" : "E00DFCBC", "_id" : { "$oid" : "50905f2f43dfc10200000010" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[624]", "startOffset" : 201, "end" : "/div[1]/p[624]", "endOffset" : 239, "_id" : { "$oid" : "50905f2f43dfc10200000011" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351638831548 }, "created" : { "$date" : 1351638831548 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50905f4e43dfc10200000012", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "decreasing spirituality (or altogether lack of it)", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "Nothing stirred within his soul", "uuid" : "FA269E2D", "_id" : { "$oid" : "50905f4e43dfc10200000012" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[859]", "startOffset" : 507, "end" : "/div[1]/p[859]", "endOffset" : 538, "_id" : { "$oid" : "50905f4e43dfc10200000013" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351638862010 }, "created" : { "$date" : 1351638862010 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50905f7b43dfc10200000014", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "spiraling downwards", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "unfolding itself sin by\n\nsin", "uuid" : "3167793C", "_id" : { "$oid" : "50905f7b43dfc10200000014" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[897]", "startOffset" : 193, "end" : "/div[1]/p[897]", "endOffset" : 221, "_id" : { "$oid" : "50905f7b43dfc10200000015" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351638907243 }, "created" : { "$date" : 1351638907243 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50905f8a98d1b1020000000a", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "strong sentiment", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "soul\n\nlusted after its own destruction?", "uuid" : "06FF94AC", "_id" : { "$oid" : "50905f8a98d1b1020000000a" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[898]", "startOffset" : 1048, "end" : "/div[1]/p[898]", "endOffset" : 1087, "_id" : { "$oid" : "50905f8a98d1b1020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351638922989 }, "created" : { "$date" : 1351638922989 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50905fa643dfc10200000016" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1351638950235 }, "groups" : [ "21L.003" ], "id" : "50905fa643dfc10200000016", "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "quote" : "pierce the fog of his mind.", "ranges" : [ { "start" : "/div[1]/p[933]", "startOffset" : 536, "end" : "/div[1]/p[933]", "endOffset" : 563, "_id" : { "$oid" : "50905fa643dfc10200000017" } } ], "tags" : [], "text" : "He's starting to recognize his sins", "updated" : { "$date" : 1351638960692 }, "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "uuid" : "A6A19717" } -{ "id" : "50905fc043dfc10200000018", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "I thought he was older...", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "Sixteen", "uuid" : "5178462E", "_id" : { "$oid" : "50905fc043dfc10200000018" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1075]", "startOffset" : 3, "end" : "/div[1]/p[1075]", "endOffset" : 10, "_id" : { "$oid" : "50905fc043dfc10200000019" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351638976968 }, "created" : { "$date" : 1351638976968 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50905fcb98d1b1020000000c", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "symbolize purity", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "white\n\nflowers", "uuid" : "CD90CE60", "_id" : { "$oid" : "50905fcb98d1b1020000000c" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1088]", "startOffset" : 135, "end" : "/div[1]/p[1088]", "endOffset" : 149, "_id" : { "$oid" : "50905fcb98d1b1020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351638987148 }, "created" : { "$date" : 1351638987148 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50905fe298d1b1020000000e", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "another mention of flowers", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "flowers", "uuid" : "4374BE87", "_id" : { "$oid" : "50905fe298d1b1020000000e" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1100]", "startOffset" : 193, "end" : "/div[1]/p[1100]", "endOffset" : 201, "_id" : { "$oid" : "50905fe298d1b1020000000f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351639010774 }, "created" : { "$date" : 1351639010774 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5090603c43dfc1020000001a", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "He's going downhill again! ", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "still unfallen, but about to fall.", "uuid" : "F4EA3973", "_id" : { "$oid" : "5090603c43dfc1020000001a" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1151]", "startOffset" : 288, "end" : "/div[1]/p[1151]", "endOffset" : 322, "_id" : { "$oid" : "5090603c43dfc1020000001b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351639100919 }, "created" : { "$date" : 1351639100919 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5090604c98d1b10200000010", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "another flower", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "opening flower,", "uuid" : "5BAAEB9A", "_id" : { "$oid" : "5090604c98d1b10200000010" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1216]", "startOffset" : 433, "end" : "/div[1]/p[1216]", "endOffset" : 448, "_id" : { "$oid" : "5090604c98d1b10200000011" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351639116043 }, "created" : { "$date" : 1351639116043 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50906d8643dfc1020000001c", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "Zechariah s 2.8 in old testament; not words of Christ but reference to bible", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "If we are a priest-ridden race we ought to be proud of it! They are the\n\napple of God's eye. TOUCH THEM NOT, says Christ, FOR THEY ARE THE APPLE\n\nOF MY EYE.", "uuid" : "304B2F39", "_id" : { "$oid" : "50906d8643dfc1020000001c" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[353]", "startOffset" : 3, "end" : "/div[1]/p[353]", "endOffset" : 159, "_id" : { "$oid" : "50906d8643dfc1020000001d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351642502862 }, "created" : { "$date" : 1351642502862 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509076fe43dfc1020000001e", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "references back to eileen and house of gold...what does this mean?", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "She had put her hand into his pocket\n\nwhere his hand was and he had felt how cool and thin and soft her hand\n\nwas. She had said that pockets were funny things to have: and then all\n\nof a sudden she had broken away and had run laughing down the sloping\n\ncurve of the path. Her fair hair had streamed out behind her like gold\n\nin the sun. TOWER OF IVORY. HOUSE OF GOLD. By thinking of things you\n\ncould understand them.\n\n\n\n\n\n\n\nBut why in the square? You went there when you wanted to do something.\n\nIt was all thick slabs of slate and water trickled all day", "uuid" : "D21C4D0B", "_id" : { "$oid" : "509076fe43dfc1020000001e" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[431]", "startOffset" : 392, "end" : "/div[1]/p[432]", "endOffset" : 132, "_id" : { "$oid" : "509076fe43dfc1020000001f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351644926448 }, "created" : { "$date" : 1351644926448 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5090779243dfc10200000020", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "what happens when the people you are supposed to follow and obey, the priests, sin? is stephen questioning the authorities?", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "Was that a sin for Father Arnall to be in a wax or was he allowed to\n\nget into a wax when the boys were idle because that made them study\n\nbetter or was he only letting on to be in a wax? It was because he was\n\nallowed, because a priest would know what a sin was and would not do\n\nit. But if he did it one time by mistake what would he do to go to\n\nconfession? Perhaps he would go to confession to the minister. And if\n\nthe minister did it he would go to the rector: and the rector to the\n\nprovincial: and the provincial to the general of the jesuits. That was\n\ncalled the order: and he had heard his father say that they were all\n\nclever men. They could all have become high-up people in the world if\n\nthey had not become jesuits. And he wondered what Father Arnall and\n\nPaddy Barrett would have become and what Mr McGlade and Mr Gleeson\n\nwould have become if they had not become jesuits. It was hard to think\n\nwhat because you would have to think of them in a different way with\n\ndifferent coloured coats and trousers and with beards and moustaches\n\nand different kinds of hats.", "uuid" : "8CF2A235", "_id" : { "$oid" : "5090779243dfc10200000020" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[470]", "startOffset" : 2, "end" : "/div[1]/p[470]", "endOffset" : 1082, "_id" : { "$oid" : "5090779243dfc10200000021" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351645074942 }, "created" : { "$date" : 1351645074942 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509078a243dfc10200000022", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "prefect of studies...whipping him...jesus also whipped...not sure at this point if joyce thought of this punishment whilst thinking about jesus's situation? maybe? have to keep reading and thinking about novel overall.", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "Stephen closed his eyes and held out in the air his trembling hand with\n\nthe palm upwards. He felt the prefect of studies touch it for a moment\n\nat the fingers to straighten it and then the swish of the sleeve of the\n\nsoutane as the pandybat was lifted to strike. A hot burning stinging\n\ntingling blow like the loud crack of a broken stick made his trembling\n\nhand crumple together like a leaf in the fire: and at the sound and the\n\npain scalding tears were driven into his eyes. His whole body was shaking\n\nwith fright, his arm was shaking and his crumpled burning livid hand shook\n\nlike a loose leaf in the air. A cry sprang to his lips, a prayer to be let\n\noff. But though the tears scalded his eyes and his limbs quivered with\n\npain and fright he held back the hot tears and the cry that scalded his\n\nthroat.\n\n\n\n\n\n\n\n—Other hand! shouted the prefect of studies.", "uuid" : "22929DF6", "_id" : { "$oid" : "509078a243dfc10200000022" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[509]", "startOffset" : 2, "end" : "/div[1]/p[510]", "endOffset" : 46, "_id" : { "$oid" : "509078a243dfc10200000023" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351645346252 }, "created" : { "$date" : 1351645346252 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50908ef598d1b10200000012", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Related to earlier reference to Rome", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "rebellion", "uuid" : "A3B719DD", "_id" : { "$oid" : "50908ef598d1b10200000012" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[442]", "startOffset" : 19, "end" : "/div[1]/p[442]", "endOffset" : 28, "_id" : { "$oid" : "50908ef598d1b10200000013" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351651061563 }, "created" : { "$date" : 1351651061563 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50908f6b43dfc10200000024", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "typical punishment of education from those times (especially in a religious school)", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "to be flogged", "uuid" : "E068CD5C", "_id" : { "$oid" : "50908f6b43dfc10200000024" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[446]", "startOffset" : 37, "end" : "/div[1]/p[446]", "endOffset" : 50, "_id" : { "$oid" : "50908f6b43dfc10200000025" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351651179403 }, "created" : { "$date" : 1351651179403 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5090a16b98d1b10200000014", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "connects to religion--transfigured carries religious meaning in a way that transfiguration was high point of jesus's public life..his divinity is ravishingly revealed to some of his disciples. perhaps stephen hopes to escape reality and go somewhere better", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "He returned to Mercedes and, as he brooded upon her image, a strange\n\nunrest crept into his blood. Sometimes a fever gathered within him and\n\nled him to rove alone in the evening along the quiet avenue. The peace\n\nof the gardens and the kindly lights in the windows poured a tender\n\ninfluence into his restless heart. The noise of children at play\n\nannoyed him and their silly voices made him feel, even more keenly than\n\nhe had felt at Clongowes, that he was different from others. He did not\n\nwant to play. He wanted to meet in the real world the unsubstantial\n\nimage which his soul so constantly beheld. He did not know where to\n\nseek it or how, but a premonition which led him on told him that this\n\nimage would, without any overt act of his, encounter him. They would\n\nmeet quietly as if they had known each other and had made their tryst,\n\nperhaps at one of the gates or in some more secret place. They would be\n\nalone, surrounded by darkness and silence: and in that moment of\n\nsupreme tenderness he would be transfigured.\n\n\n\n\n\n\n\nHe would fade into something impalpable under her eyes and then in a\n\nmoment he would be transfigured. Weakness and timidity and inexperience\n\nwould fall from him in that magic moment.", "uuid" : "A8A22553", "_id" : { "$oid" : "5090a16b98d1b10200000014" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[618]", "startOffset" : 2, "end" : "/div[1]/p[619]", "endOffset" : 186, "_id" : { "$oid" : "5090a16b98d1b10200000015" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351655787245 }, "created" : { "$date" : 1351655787245 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5090a31298d1b10200000016", "user" : "angelaha@mit.edu", "username" : "Angela H.", "text" : "i like this language. can feel the anxiety and frustration stephen describes and feels", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "e was angry with\n\nhimself for being young and the prey of restless foolish impulses,\n\nangry also with the change of fortune which was reshaping the world\n\nabout him into a vision of squalor and insincerity. Yet his anger lent\n\nnothing to the vision. He chronicled with patience what he saw,\n\ndetaching himself from it and tasting its mortifying flavour in secret.", "uuid" : "849973FE", "_id" : { "$oid" : "5090a31298d1b10200000016" }, "permissions" : { "delete" : [ "angelaha@mit.edu" ], "update" : [ "angelaha@mit.edu" ], "admin" : [ "angelaha@mit.edu" ], "read" : [ "angelaha@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[624]", "startOffset" : 259, "end" : "/div[1]/p[624]", "endOffset" : 622, "_id" : { "$oid" : "5090a31298d1b10200000017" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351656210411 }, "created" : { "$date" : 1351656210411 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5091cb06ed74d10200000002" }, "id" : "5091cb06ed74d10200000002", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "direct reference to Macbeth: the 3 witches that appear to Macbeth dictate the story saying that Macbeth will become king..leads to murder plot", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "a hag like one of those who appeared to Macbeth\non the heath of Forres.", "uuid" : "313B4849", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "macbeth", "reference" ], "ranges" : [ { "start" : "/div[1]/div[17]/p[10]", "startOffset" : 124, "end" : "/div[1]/div[17]/p[10]", "endOffset" : 196, "_id" : { "$oid" : "5091cb06ed74d10200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351731974767 }, "created" : { "$date" : 1351731974767 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5091cb81ed74d10200000004" }, "id" : "5091cb81ed74d10200000004", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Direct reference to macbeth; after macbeth murders Duncan, the king, macbeth envies his victim because he is peaceful in death while Macbeth must live with his guilt", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "after life’s fitful fever they \nsleep well,", "uuid" : "B28D233B", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "macbeth" ], "ranges" : [ { "start" : "/div[1]/div[13]/p[109]", "startOffset" : 6, "end" : "/div[1]/div[13]/p[109]", "endOffset" : 49, "_id" : { "$oid" : "5091cb81ed74d10200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351732097650 }, "created" : { "$date" : 1351732097650 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5091cbc68ef0420200000002" }, "id" : "5091cbc68ef0420200000002", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "CLOTHING IMAGERY: jane portrayed as uncomfortable in this attire-->not fit for her, not the right place for her in life ", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "robed and veiled figure, so \nunlike my usual self that it seemed almost the image of a \nstranger.", "uuid" : "E55465F4", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "clothing" ], "ranges" : [ { "start" : "/div[1]/div[28]/p[3]", "startOffset" : 33, "end" : "/div[1]/div[28]/p[3]", "endOffset" : 131, "_id" : { "$oid" : "5091cbc68ef0420200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351732166202 }, "created" : { "$date" : 1351732166202 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5091cf94ed74d10200000006" }, "id" : "5091cf94ed74d10200000006", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Rochestor acting as a gypsy part of the clothing imagery-->hiding a truth from Jane, secrets ", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "“You did not act the character of a gipsy with \nme.”\n“What character did I act?  My own?”\n“No; some unaccountable one.  In short, I believe \nyou have been trying to draw me out—or in; you have been \ntalking nonsense to make me talk nonsense.  It is scarcely \nfair, sir.", "uuid" : "E5E1DB05", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "clothing" ], "ranges" : [ { "start" : "/div[1]/div[21]/p[94]", "startOffset" : 0, "end" : "/div[1]/div[21]/p[96]", "endOffset" : 179, "_id" : { "$oid" : "5091cf94ed74d10200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351733140496 }, "created" : { "$date" : 1351733140496 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5093d7f3d1a4950200000002" }, "__v" : 1, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1351866355477 }, "groups" : [ "21L.003" ], "id" : "5093d7f3d1a4950200000002", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "quote" : "I saw a grim smile contort Mr. Rochester’s lips, and he \nmuttered—\n“No, by God!  I took care that none should hear of \nit—or of her under that name.”", "ranges" : [ { "start" : "/div[1]/div[28]/p[57]", "startOffset" : 0, "end" : "/div[1]/div[28]/p[58]", "endOffset" : 82, "_id" : { "$oid" : "5093d7f3d1a4950200000003" } } ], "tags" : [ "secrets" ], "text" : "Mr. Rochester is indeed hiding secrets ---> like the end of Macbeth, leads to a bad ending though not death, ends the marriage", "updated" : { "$date" : 1351866453140 }, "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "uuid" : "DE6B92EC" } -{ "_id" : { "$oid" : "5093f4e4d1a4950200000004" }, "id" : "5093f4e4d1a4950200000004", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "blame fate for his actions; family forced him into marriage-->obligated to hide the secret of his mad wife ", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "but \nfate has out-manoeuvred me", "uuid" : "976B8882", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "fate" ], "ranges" : [ { "start" : "/div[1]/div[28]/p[60]", "startOffset" : 110, "end" : "/div[1]/div[28]/p[60]", "endOffset" : 141, "_id" : { "$oid" : "5093f4e4d1a4950200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351873764814 }, "created" : { "$date" : 1351873764814 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5093f9171256110200000002" }, "id" : "5093f9171256110200000002", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Is this really reality? Sure truth is revealed and they will get married, but live in a secluded place away from society-->Is Bronte hinting at something else?", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "The manor-house of Ferndean was a building of considerable \nantiquity, moderate size, and no architectural pretensions, deep \nburied in a wood", "uuid" : "F837FAF6", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "Reality" ], "ranges" : [ { "start" : "/div[1]/div[39]/p[1]", "startOffset" : 0, "end" : "/div[1]/div[39]/p[1]", "endOffset" : 142, "_id" : { "$oid" : "5093f9171256110200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351874839819 }, "created" : { "$date" : 1351874839819 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "5093fa2b1256110200000004" }, "id" : "5093fa2b1256110200000004", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Now together, Jane is \"free\" she has found her place and identity ", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "To be together is for us to be at once as free as\nin solitude, as gay as in company.", "uuid" : "878FCC6B", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[40]/p[13]", "startOffset" : 551, "end" : "/div[1]/div[40]/p[13]", "endOffset" : 636, "_id" : { "$oid" : "5093fa2b1256110200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351875115894 }, "created" : { "$date" : 1351875115894 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5093ff00d1a4950200000006", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Rochestor acting as a gypsy part of the clothing imagery-->hiding a truth from Jane", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "“You did not act the character of a gipsy with \nme.”\n“What character did I act?  My own?”\n“No; some unaccountable one.  In short, I believe \nyou have been trying to draw me out", "uuid" : "C5E47BAD", "_id" : { "$oid" : "5093ff00d1a4950200000006" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "secrets" ], "ranges" : [ { "start" : "/div[1]/div[21]/p[94]", "startOffset" : 0, "end" : "/div[1]/div[21]/p[96]", "endOffset" : 86, "_id" : { "$oid" : "5093ff00d1a4950200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351876352065 }, "created" : { "$date" : 1351876352065 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5093ff28d1a4950200000008", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Mr. Rochester is indeed hiding secrets ---> like the end of Macbeth, leads to a bad ending though not death, ends the marriage", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "I saw a grim smile contort Mr. Rochester’s lips, and he \nmuttered—\n“No, by God!  I took care that none should hear of \nit—or of her under that name.”", "uuid" : "67CAD403", "_id" : { "$oid" : "5093ff28d1a4950200000008" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "secrets" ], "ranges" : [ { "start" : "/div[1]/div[28]/p[57]", "startOffset" : 0, "end" : "/div[1]/div[28]/p[58]", "endOffset" : 82, "_id" : { "$oid" : "5093ff28d1a4950200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351876392763 }, "created" : { "$date" : 1351876392763 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5093ff6bd1a495020000000a", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "Is this really reality? Sure truth is revealed and they will get married, but live in a secluded place away from society-->Is Bronte hinting at something else", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "The manor-house of Ferndean was a building of considerable \nantiquity, moderate size, and no architectural pretensions, deep \nburied in a wood.  I had heard of it before.", "uuid" : "1EDCC140", "_id" : { "$oid" : "5093ff6bd1a495020000000a" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "reality" ], "ranges" : [ { "start" : "/div[1]/div[39]/p[1]", "startOffset" : 0, "end" : "/div[1]/div[39]/p[1]", "endOffset" : 171, "_id" : { "$oid" : "5093ff6bd1a495020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351876459408 }, "created" : { "$date" : 1351876459408 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5093ffb31256110200000007", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "CLOTHING IMAGERY: jane portrayed as uncomfortable in this attire-->not fit for her, not the right place for her in life", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "I saw a robed and veiled figure, so \nunlike my usual self that it seemed almost the image of a \nstranger.", "uuid" : "E212DECE", "_id" : { "$oid" : "5093ffb31256110200000007" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "clothing" ], "ranges" : [ { "start" : "/div[1]/div[28]/p[3]", "startOffset" : 25, "end" : "/div[1]/div[28]/p[3]", "endOffset" : 130, "_id" : { "$oid" : "5093ffb31256110200000008" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351876531295 }, "created" : { "$date" : 1351876531295 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5093ffced1a495020000000c", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "text" : "blame fate for his actions; family forced him into marriage-->obligated to hide the secret of his mad wife", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "but \nfate has out-manoeuvred me,", "uuid" : "4D912123", "_id" : { "$oid" : "5093ffced1a495020000000c" }, "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "tags" : [ "fate" ], "ranges" : [ { "start" : "/div[1]/div[28]/p[60]", "startOffset" : 110, "end" : "/div[1]/div[28]/p[60]", "endOffset" : 143, "_id" : { "$oid" : "5093ffced1a495020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351876558323 }, "created" : { "$date" : 1351876558323 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "509400021256110200000009" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1351876610084 }, "groups" : [ "21L.003" ], "id" : "509400021256110200000009", "permissions" : { "delete" : [ "slakshmi@mit.edu" ], "update" : [ "slakshmi@mit.edu" ], "admin" : [ "slakshmi@mit.edu" ], "read" : [ "slakshmi@mit.edu" ] }, "quote" : "To be together is for us to be at once as free as\nin solitude, as gay as in company.", "ranges" : [ { "start" : "/div[1]/div[40]/p[13]", "startOffset" : 551, "end" : "/div[1]/div[40]/p[13]", "endOffset" : 637, "_id" : { "$oid" : "509ad2cf73cd330200000005" } } ], "tags" : [ "freedom" ], "text" : "Now together, Jane is \"free\" she has found her place and identity; ending goal for her bildungsroman", "updated" : { "$date" : 1352323791332 }, "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "user" : "slakshmi@mit.edu", "username" : "Lakshmi S.", "uuid" : "6B5BE6CB" } -{ "id" : "509446e6c2e2a50200000002", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Line from Macbeth", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "Tomorrow and tomorrow and tomorrow,", "uuid" : "245AE536", "_id" : { "$oid" : "509446e6c2e2a50200000002" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[492]", "startOffset" : 3, "end" : "/div[1]/p[492]", "endOffset" : 38, "_id" : { "$oid" : "509446e6c2e2a50200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351894758184 }, "created" : { "$date" : 1351894758184 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50944717d1a495020000000f", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Like Macbeth lusting after a prophecy which he knows will lead to his destruction", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "What did it avail to pray when he knew that his soul\n\nlusted after its own destruction?", "uuid" : "9F1F3104", "_id" : { "$oid" : "50944717d1a495020000000f" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[898]", "startOffset" : 1000, "end" : "/div[1]/p[898]", "endOffset" : 1087, "_id" : { "$oid" : "50944717d1a4950200000010" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351894807218 }, "created" : { "$date" : 1351894807218 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5095342b771bcf0200000004", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "backhand is not considered \"beautiful.\" Usually means left-handed writing.", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "backhand in beautiful writing:", "uuid" : "A49DC8A6", "_id" : { "$oid" : "5095342b771bcf0200000004" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[434]", "startOffset" : 161, "end" : "/div[1]/p[434]", "endOffset" : 192, "_id" : { "$oid" : "5095342b771bcf0200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351955499725 }, "created" : { "$date" : 1351955499725 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50953447771bcf0200000006", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "their interpretation of what they are learning", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "drawn it there for a cod", "uuid" : "6A2254D0", "_id" : { "$oid" : "50953447771bcf0200000006" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[434]", "startOffset" : 18, "end" : "/div[1]/p[434]", "endOffset" : 42, "_id" : { "$oid" : "50953447771bcf0200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1351955527856 }, "created" : { "$date" : 1351955527856 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509626013d485f0200000002", "user" : "samin@mit.edu", "username" : "Samin H.", "text" : "Darwin's disclaimer", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "This Abstract, which I now publish, must necessarily be imperfect.", "uuid" : "DE95815A", "_id" : { "$oid" : "509626013d485f0200000002" }, "permissions" : { "delete" : [ "samin@mit.edu" ], "update" : [ "samin@mit.edu" ], "admin" : [ "samin@mit.edu" ], "read" : [ "samin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[3]", "startOffset" : 1, "end" : "/div[1]/div[1]/p[3]", "endOffset" : 68, "_id" : { "$oid" : "509626013d485f0200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1352017409031 }, "created" : { "$date" : 1352017409031 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096264181943f0200000002", "user" : "samin@mit.edu", "username" : "Samin H.", "text" : "I wonder if people who deny evolution have ever used this introduction to reduce Darwin's credibility", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "No doubt errors will have crept in,", "uuid" : "3F18BE62", "_id" : { "$oid" : "5096264181943f0200000002" }, "permissions" : { "delete" : [ "samin@mit.edu" ], "update" : [ "samin@mit.edu" ], "admin" : [ "samin@mit.edu" ], "read" : [ "samin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[3]", "startOffset" : 213, "end" : "/div[1]/div[1]/p[3]", "endOffset" : 248, "_id" : { "$oid" : "5096264181943f0200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1352017473976 }, "created" : { "$date" : 1352017473976 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096357c81943f0200000004", "user" : "samin@mit.edu", "username" : "Samin H.", "text" : "appears in figure ", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "But if variations\nuseful to any organic being do occur, assuredly individuals thus characterised will have the best chance of being preserved in the struggle for life;", "uuid" : "2C309E2A", "_id" : { "$oid" : "5096357c81943f0200000004" }, "permissions" : { "delete" : [ "samin@mit.edu" ], "update" : [ "samin@mit.edu" ], "admin" : [ "samin@mit.edu" ], "read" : [ "samin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[178]", "startOffset" : 772, "end" : "/div[1]/div[1]/p[178]", "endOffset" : 939, "_id" : { "$oid" : "5096357c81943f0200000005" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1352021372755 }, "created" : { "$date" : 1352021372755 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509635ae3d485f0200000004", "user" : "samin@mit.edu", "username" : "Samin H.", "text" : "Darwin's metaphor reflected in his diagram", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "The\ngreen and budding twigs may represent existing species", "uuid" : "2A9E2805", "_id" : { "$oid" : "509635ae3d485f0200000004" }, "permissions" : { "delete" : [ "samin@mit.edu" ], "update" : [ "samin@mit.edu" ], "admin" : [ "samin@mit.edu" ], "read" : [ "samin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[181]", "startOffset" : 149, "end" : "/div[1]/div[1]/p[181]", "endOffset" : 207, "_id" : { "$oid" : "509635ae3d485f0200000005" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1352021422462 }, "created" : { "$date" : 1352021422462 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509635c83d485f0200000006", "user" : "samin@mit.edu", "username" : "Samin H.", "text" : "competition", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "to overtop and kill the surrounding twigs and branches,", "uuid" : "DA2B90F1", "_id" : { "$oid" : "509635c83d485f0200000006" }, "permissions" : { "delete" : [ "samin@mit.edu" ], "update" : [ "samin@mit.edu" ], "admin" : [ "samin@mit.edu" ], "read" : [ "samin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[181]", "startOffset" : 396, "end" : "/div[1]/div[1]/p[181]", "endOffset" : 452, "_id" : { "$oid" : "509635c83d485f0200000007" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1352021448060 }, "created" : { "$date" : 1352021448060 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509635fb3d485f0200000008", "user" : "samin@mit.edu", "username" : "Samin H.", "text" : "ancestry", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "and this connexion of the former and present buds by ramifying\nbranches may well represent the classification of all extinct and living species in groups subordinate to groups.", "uuid" : "1CF5166B", "_id" : { "$oid" : "509635fb3d485f0200000008" }, "permissions" : { "delete" : [ "samin@mit.edu" ], "update" : [ "samin@mit.edu" ], "admin" : [ "samin@mit.edu" ], "read" : [ "samin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[181]", "startOffset" : 717, "end" : "/div[1]/div[1]/p[181]", "endOffset" : 893, "_id" : { "$oid" : "509635fb3d485f0200000009" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1352021499886 }, "created" : { "$date" : 1352021499886 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096372e81943f0200000006", "user" : "samin@mit.edu", "username" : "Samin H.", "text" : "extinction", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "From the first growth of the tree, many a limb and branch has decayed and\ndropped off;", "uuid" : "550E6320", "_id" : { "$oid" : "5096372e81943f0200000006" }, "permissions" : { "delete" : [ "samin@mit.edu" ], "update" : [ "samin@mit.edu" ], "admin" : [ "samin@mit.edu" ], "read" : [ "samin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[181]", "startOffset" : 1175, "end" : "/div[1]/div[1]/p[181]", "endOffset" : 1261, "_id" : { "$oid" : "5096372e81943f0200000007" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1352021806446 }, "created" : { "$date" : 1352021806446 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096375c81943f0200000008", "user" : "samin@mit.edu", "username" : "Samin H.", "text" : "niche", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "by having\ninhabited a protected station", "uuid" : "00525808", "_id" : { "$oid" : "5096375c81943f0200000008" }, "permissions" : { "delete" : [ "samin@mit.edu" ], "update" : [ "samin@mit.edu" ], "admin" : [ "samin@mit.edu" ], "read" : [ "samin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[181]", "startOffset" : 1857, "end" : "/div[1]/div[1]/p[181]", "endOffset" : 1896, "_id" : { "$oid" : "5096375c81943f0200000009" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1352021852914 }, "created" : { "$date" : 1352021852914 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509641f23d485f020000000a", "user" : "samin@mit.edu", "username" : "Samin H.", "text" : "transitional forms speculated by darwin", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "I can see no difficulty in a race of bears being rendered, by natural selection, more and more\naquatic in their structure and habits, with larger and larger mouths, till a creature was produced as monstrous as a whale.", "uuid" : "32C7EE6B", "_id" : { "$oid" : "509641f23d485f020000000a" }, "permissions" : { "delete" : [ "samin@mit.edu" ], "update" : [ "samin@mit.edu" ], "admin" : [ "samin@mit.edu" ], "read" : [ "samin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[262]", "startOffset" : 1637, "end" : "/div[1]/div[1]/p[262]", "endOffset" : 1855, "_id" : { "$oid" : "509641f23d485f020000000b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1352024562467 }, "created" : { "$date" : 1352024562467 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509644933d485f020000000c", "user" : "samin@mit.edu", "username" : "Samin H.", "text" : "organs from ancestral forms", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "If it could be demonstrated that any complex organ existed, which could not possibly have been formed by numerous, successive, slight modifications, my\ntheory would absolutely break down. But I can find out no such case. No doubt many organs exist of which we do not know the transitional grades, more\nespecially if we look to much-isolated species, round which, according to my theory, there has been much extinction. Or again, if we look to an organ common to\nall the members of a large class, for in this latter case the organ must have been first formed at an extremely remote period, since which all the many members\nof the class have been developed; and in order to discover the early transitional grades through which the organ has passed, we should have to look to very\nancient ancestral forms, long since become extinct.", "uuid" : "CA7EB38D", "_id" : { "$oid" : "509644933d485f020000000c" }, "permissions" : { "delete" : [ "samin@mit.edu" ], "update" : [ "samin@mit.edu" ], "admin" : [ "samin@mit.edu" ], "read" : [ "samin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[272]", "startOffset" : 1, "end" : "/div[1]/div[1]/p[272]", "endOffset" : 830, "_id" : { "$oid" : "509644933d485f020000000d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1352025235385 }, "created" : { "$date" : 1352025235385 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509658613d485f020000000e", "user" : "samin@mit.edu", "username" : "Samin H.", "text" : "bidirectionality", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "t might further be expected that the species of the same genus would occasionally exhibit reversions to lost\nancestral characters.", "uuid" : "0303228E", "_id" : { "$oid" : "509658613d485f020000000e" }, "permissions" : { "delete" : [ "samin@mit.edu" ], "update" : [ "samin@mit.edu" ], "admin" : [ "samin@mit.edu" ], "read" : [ "samin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[224]", "startOffset" : 673, "end" : "/div[1]/div[1]/p[224]", "endOffset" : 804, "_id" : { "$oid" : "509658613d485f020000000f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1352030305601 }, "created" : { "$date" : 1352030305601 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50965b303d485f0200000010", "user" : "samin@mit.edu", "username" : "Samin H.", "text" : "competition and the taxa chart", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "here is no exception to the rule that every organic being naturally increases at so high a rate, that if not destroyed, the earth would soon be covered by\nthe progeny of a single pair.", "uuid" : "DEC0CA28", "_id" : { "$oid" : "50965b303d485f0200000010" }, "permissions" : { "delete" : [ "samin@mit.edu" ], "update" : [ "samin@mit.edu" ], "admin" : [ "samin@mit.edu" ], "read" : [ "samin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[88]", "startOffset" : 2, "end" : "/div[1]/div[1]/p[88]", "endOffset" : 186, "_id" : { "$oid" : "50965b303d485f0200000011" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1352031024607 }, "created" : { "$date" : 1352031024607 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096b689a4d0cd0200000002", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Mr. Rochester is not only broken down emotionally with the leaving of jane, but now also physically.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "No—perhaps it would have been better if there \nhad.”", "uuid" : "F53CAAC5", "_id" : { "$oid" : "5096b689a4d0cd0200000002" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[38]/p[63]", "startOffset" : 1, "end" : "/div[1]/div[38]/p[63]", "endOffset" : 53, "_id" : { "$oid" : "5096b689a4d0cd0200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352054409087 }, "created" : { "$date" : 1352054409087 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096b7e1a4d0cd0200000004", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Premise of the book. He will find out who he is.", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "And when Stephen had not been able to answer", "uuid" : "8DDEE308", "_id" : { "$oid" : "5096b7e1a4d0cd0200000004" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[23]", "startOffset" : 2, "end" : "/div[1]/p[23]", "endOffset" : 46, "_id" : { "$oid" : "5096b7e1a4d0cd0200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352054753663 }, "created" : { "$date" : 1352054753663 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096b861a4d0cd0200000006", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "How can she just go back to bed after seeing his master almost get burned to death?", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "“Good-night, then, sir,” said I, departing.", "uuid" : "10E92C2B", "_id" : { "$oid" : "5096b861a4d0cd0200000006" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[17]/p[60]", "startOffset" : 0, "end" : "/div[1]/div[17]/p[61]", "endOffset" : 0, "_id" : { "$oid" : "5096b861a4d0cd0200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352054881755 }, "created" : { "$date" : 1352054881755 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096b8e7a4d0cd0200000008", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "How is she still around the house? Why did Mr. Rochester not immediately have her arrested if she tried to kill him.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "She was intent on her work, in which her whole \nthoughts seemed absorbed: on her hard forehead, and in her \ncommonplace features, was nothing either of the paleness or \ndesperation one would have expected to see marking the \ncountenance of a woman who had attempted murder, and whose \nintended victim had followed her last night to her lair, and (as \nI believed), charged her with the crime she wished to \nperpetrate.  I was amazed—confounded.", "uuid" : "B2814AFB", "_id" : { "$oid" : "5096b8e7a4d0cd0200000008" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[18]/p[4]", "startOffset" : 127, "end" : "/div[1]/div[18]/p[4]", "endOffset" : 571, "_id" : { "$oid" : "5096b8e7a4d0cd0200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352055015363 }, "created" : { "$date" : 1352055015363 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096ba573d485f0200000012", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Why did she run off without any money. She is almost committing suicide because of a sin Mr. Rochester committed and not her.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Well, I would rather die yonder than in a street or on \na frequented road,” I reflected.  “And far \nbetter that crows and ravens—if any ravens there be in \nthese regions—should pick my flesh from my bones, than that\nthey should be prisoned in a workhouse coffin and moulder in a \npauper’s grave.”", "uuid" : "15882B0D", "_id" : { "$oid" : "5096ba573d485f0200000012" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[30]/p[59]", "startOffset" : 1, "end" : "/div[1]/div[30]/p[59]", "endOffset" : 297, "_id" : { "$oid" : "5096ba573d485f0200000013" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352055383663 }, "created" : { "$date" : 1352055383663 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096bb363d485f0200000014", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "As in, that's not who he is", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "He read the verses backwards but then they were not poetry", "uuid" : "8C833CA2", "_id" : { "$oid" : "5096bb363d485f0200000014" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[83]", "startOffset" : 2, "end" : "/div[1]/p[83]", "endOffset" : 60, "_id" : { "$oid" : "5096bb363d485f0200000015" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352055606143 }, "created" : { "$date" : 1352055606143 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096bbd3a4d0cd020000000a", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "He is definitely referring to the incident with grace Poole. After reading you can see that this is also referring to his hidden wife.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "You are welcome to all my confidence that is worth \nhaving, Jane; but for God’s sake, don’t desire a \nuseless burden!  Don’t long for \npoison—don’t turn out a downright Eve on my \nhands!”", "uuid" : "9E21B122", "_id" : { "$oid" : "5096bbd3a4d0cd020000000a" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[26]/p[52]", "startOffset" : 1, "end" : "/div[1]/div[26]/p[52]", "endOffset" : 188, "_id" : { "$oid" : "5096bbd3a4d0cd020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352055763343 }, "created" : { "$date" : 1352055763343 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096bc073d485f0200000016", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Why wouldn't she ask what the deal was with Grace poole? I feel like I would be much more concerned with that issue instead.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Why did you take such pains to make me believe you \nwished to marry Miss Ingram?”", "uuid" : "B9733304", "_id" : { "$oid" : "5096bc073d485f0200000016" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[26]/p[57]", "startOffset" : 163, "end" : "/div[1]/div[26]/p[57]", "endOffset" : 244, "_id" : { "$oid" : "5096bc073d485f0200000017" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352055815167 }, "created" : { "$date" : 1352055815167 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096bc2ca4d0cd020000000c", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "e.g. the people he's studying, like Cicero", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "fellows in poetry and rhetoric", "uuid" : "2942DDC1", "_id" : { "$oid" : "5096bc2ca4d0cd020000000c" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[87]", "startOffset" : 165, "end" : "/div[1]/p[87]", "endOffset" : 195, "_id" : { "$oid" : "5096bc2ca4d0cd020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352055852981 }, "created" : { "$date" : 1352055852981 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096bc563d485f0200000018", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "he wants to be like them; to have answers", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "When\n\nwould he be like the fellows in poetry and rhetoric?", "uuid" : "AD0E986B", "_id" : { "$oid" : "5096bc563d485f0200000018" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[87]", "startOffset" : 138, "end" : "/div[1]/p[87]", "endOffset" : 197, "_id" : { "$oid" : "5096bc563d485f0200000019" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352055894408 }, "created" : { "$date" : 1352055894408 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096bc84a4d0cd020000000e", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Not sure I would love someone who wanted to make me jealous so I would be madly in love with him.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "“Well, I feigned courtship of Miss Ingram, because I \nwished to render you as madly in love with me as I was with you; \nand I knew jealousy would be the best ally I could call in for \nthe furtherance of that end.”", "uuid" : "04409490", "_id" : { "$oid" : "5096bc84a4d0cd020000000e" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[26]/p[60]", "startOffset" : 0, "end" : "/div[1]/div[26]/p[60]", "endOffset" : 213, "_id" : { "$oid" : "5096bc84a4d0cd020000000f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352055940135 }, "created" : { "$date" : 1352055940135 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096bc8ba4d0cd0200000010", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "he is only a child. He is very far from becoming like them.", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "That was very far\n\naway", "uuid" : "004170C3", "_id" : { "$oid" : "5096bc8ba4d0cd0200000010" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[87]", "startOffset" : 263, "end" : "/div[1]/p[87]", "endOffset" : 286, "_id" : { "$oid" : "5096bc8ba4d0cd0200000011" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352055947168 }, "created" : { "$date" : 1352055947168 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096bcda3d485f020000001c", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Foreshadowing what we find out later about his wife and his unholy marriage attempt to Jane.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "I am afraid your principles on some points are \neccentric.”", "uuid" : "95FEE129", "_id" : { "$oid" : "5096bcda3d485f020000001c" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[26]/p[65]", "startOffset" : 54, "end" : "/div[1]/div[26]/p[65]", "endOffset" : 113, "_id" : { "$oid" : "5096bcda3d485f020000001d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352056026567 }, "created" : { "$date" : 1352056026567 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096bd8e3d485f020000001e", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Interesting point.", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "Your name is like Latin.", "uuid" : "FC7EC05E", "_id" : { "$oid" : "5096bd8e3d485f020000001e" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[160]", "startOffset" : 102, "end" : "/div[1]/p[160]", "endOffset" : 126, "_id" : { "$oid" : "5096bd8e3d485f020000001f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352056206548 }, "created" : { "$date" : 1352056206548 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096bf0fa4d0cd0200000012", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "This is similar to in Paradise Lost as both her and eve face temptation with good reason to sin, but jane resists it, while eve eats the apple. In the end everything turns out well for jane, while eve is thrown out of eden.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "“Mr. Rochester, I will not be yours.”", "uuid" : "6096279D", "_id" : { "$oid" : "5096bf0fa4d0cd0200000012" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[29]/p[111]", "startOffset" : 0, "end" : "/div[1]/div[29]/p[111]", "endOffset" : 37, "_id" : { "$oid" : "5096bf0fa4d0cd0200000013" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352056591013 }, "created" : { "$date" : 1352056591013 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096c08a3d485f0200000020", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Another reference to the snake in paradise lost.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "On \nrecognising him, the fang of the snake Jealousy was instantly \nbroken; because at the same moment my love for Céline sank\nunder an extinguisher.  A woman who could betray me for such\na rival was not worth contending for; she deserved only scorn; \nless, however, than I, who had been her dupe.", "uuid" : "C53413C7", "_id" : { "$oid" : "5096c08a3d485f0200000020" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[17]/p[15]", "startOffset" : 947, "end" : "/div[1]/div[17]/p[15]", "endOffset" : 1243, "_id" : { "$oid" : "5096c08a3d485f0200000021" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352056970010 }, "created" : { "$date" : 1352056970010 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096c0e2a4d0cd0200000014", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Here Jane references the snake in paradise lost saying she did not give in to temptation by marrying St. John since she did not love him.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "I perceived, of course, the drift of my interlocutor.  \nJealousy had got hold of him: she stung him; but the sting was \nsalutary: it gave him respite from the gnawing fang of \nmelancholy.  I would not, therefore, immediately charm the \nsnake.", "uuid" : "D02C17FC", "_id" : { "$oid" : "5096c0e2a4d0cd0200000014" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[39]/p[141]", "startOffset" : 0, "end" : "/div[1]/div[39]/p[141]", "endOffset" : 242, "_id" : { "$oid" : "5096c0e2a4d0cd0200000015" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352057058051 }, "created" : { "$date" : 1352057058051 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096c1e13d485f0200000022", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Criticism, Balbus is building mansions, he does not care about the state", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "Balbus was building a wall.", "uuid" : "2562D784", "_id" : { "$oid" : "5096c1e13d485f0200000022" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[433]", "startOffset" : 2, "end" : "/div[1]/p[433]", "endOffset" : 29, "_id" : { "$oid" : "5096c1e13d485f0200000023" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352057313241 }, "created" : { "$date" : 1352057313241 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096c1ff3d485f0200000024", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Could be a reference to paradise lost as he talks about temptation and the devil.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "And who talks of error now?  I scarcely think the \nnotion that flittered across my brain was an error.  I \nbelieve it was an inspiration rather than a temptation: it was \nvery genial, very soothing—I know that.  Here it comes\nagain!  It is no devil, I assure you; or if it be, it has \nput on the robes of an angel of light.  I think I must admit\nso fair a guest when it asks entrance to my heart.”", "uuid" : "DCD4AE5D", "_id" : { "$oid" : "5096c1ff3d485f0200000024" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[16]/p[71]", "startOffset" : 1, "end" : "/div[1]/div[16]/p[71]", "endOffset" : 398, "_id" : { "$oid" : "5096c1ff3d485f0200000025" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352057343306 }, "created" : { "$date" : 1352057343306 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096c2f2a4d0cd0200000016", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Reference to Satan being the arch-traitor. From paradise lost.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "According as the shifting obscurity and flickering gleam \nhovered here or glanced there, it was now the bearded physician, \nLuke, that bent his brow; now St. John’s long hair that \nwaved; and anon the devilish face of Judas, that grew out of the \npanel, and seemed gathering life and threatening a revelation of \nthe arch-traitor—of Satan himself—in his \nsubordinate’s form", "uuid" : "3E6E2ACD", "_id" : { "$oid" : "5096c2f2a4d0cd0200000016" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[22]/p[52]", "startOffset" : 0, "end" : "/div[1]/div[22]/p[52]", "endOffset" : 373, "_id" : { "$oid" : "5096c2f2a4d0cd0200000017" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352057586318 }, "created" : { "$date" : 1352057586318 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096c37e3d485f0200000026", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "He is similar to the devil in that he tempted Jane with sin, just as the devil tempted eve.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "I am little better than a devil\nat this moment", "uuid" : "D1BA3E83", "_id" : { "$oid" : "5096c37e3d485f0200000026" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[28]/p[60]", "startOffset" : 193, "end" : "/div[1]/div[28]/p[60]", "endOffset" : 239, "_id" : { "$oid" : "5096c37e3d485f0200000027" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352057726360 }, "created" : { "$date" : 1352057726360 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5096c3de3d485f0200000028", "user" : "opaco@mit.edu", "username" : "Francisco H.", "text" : "Cicero and Caesar are set side by side for comparison: they were sort of like rivals. Cicero wanted a republic and Caesar made Rome an empire.", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "wall of another closet", "uuid" : "36227890", "_id" : { "$oid" : "5096c3de3d485f0200000028" }, "permissions" : { "delete" : [ "opaco@mit.edu" ], "update" : [ "opaco@mit.edu" ], "admin" : [ "opaco@mit.edu" ], "read" : [ "opaco@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[434]", "startOffset" : 117, "end" : "/div[1]/p[434]", "endOffset" : 139, "_id" : { "$oid" : "5096c3de3d485f0200000029" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352057822395 }, "created" : { "$date" : 1352057822395 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509703b93d485f020000002a", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "inspiration", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-v2", "quote" : "He\ncan never act by selection, excepting on variations which are first given to him in some slight degree by nature. No man would ever try to make a fantail, till\nhe saw a pigeon with a tail developed in some slight degree in an unusual manner, or a pouter till he saw a pigeon with a crop of somewhat unusual size; and\nthe more abnormal or unusual any character was when it first appeared, the more likely it would be to catch his attention.", "uuid" : "51E7C137", "_id" : { "$oid" : "509703b93d485f020000002a" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[1]/p[52]", "startOffset" : 614, "end" : "/div[1]/div[1]/p[52]", "endOffset" : 1056, "_id" : { "$oid" : "509703b93d485f020000002b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1352074169563 }, "created" : { "$date" : 1352074169563 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509722dd1a8db60200000002", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "So, jealousy is impossible without love. Or, perhaps, love always leads to jealousy? hmmm...", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "because you never felt \nlove.", "uuid" : "338E6317", "_id" : { "$oid" : "509722dd1a8db60200000002" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[17]/p[6]", "startOffset" : 83, "end" : "/div[1]/div[17]/p[6]", "endOffset" : 112, "_id" : { "$oid" : "509722dd1a8db60200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352082141336 }, "created" : { "$date" : 1352082141336 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5097237b1a8db60200000004", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "This is very similar to what Jane says about Blanch Ingram later in the novel...", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "A woman who could betray me for such\na rival was not worth contending for; she deserved only scorn; \nless, however, than I, who had been her dupe", "uuid" : "2AC0695C", "_id" : { "$oid" : "5097237b1a8db60200000004" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[17]/p[15]", "startOffset" : 1097, "end" : "/div[1]/div[17]/p[15]", "endOffset" : 1242, "_id" : { "$oid" : "5097237b1a8db60200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352082299726 }, "created" : { "$date" : 1352082299726 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509724781a8db60200000006", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Jane thinks herself below even jealousy of Miss Ingram--a strange idea, as station may affect realities but usually not feelings.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "if a woman, in my \nposition, could presume to be jealous of a woman in Miss \nIngram’s", "uuid" : "536B0D75", "_id" : { "$oid" : "509724781a8db60200000006" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[20]/p[26]", "startOffset" : 154, "end" : "/div[1]/div[20]/p[26]", "endOffset" : 239, "_id" : { "$oid" : "509724781a8db60200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352082552731 }, "created" : { "$date" : 1352082552731 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5097248d1a8db60200000008", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "This is key I think, very rarely, but she was, at times, jealous", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "or very \nrarely", "uuid" : "D49C56E8", "_id" : { "$oid" : "5097248d1a8db60200000008" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[20]/p[26]", "startOffset" : 265, "end" : "/div[1]/div[20]/p[26]", "endOffset" : 280, "_id" : { "$oid" : "5097248d1a8db60200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352082573522 }, "created" : { "$date" : 1352082573522 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509724a8a4d0cd0200000018", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "We've heard of this sort of feeling before...", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "she was too inferior to excite the feeling", "uuid" : "4A23DDD1", "_id" : { "$oid" : "509724a8a4d0cd0200000018" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[20]/p[26]", "startOffset" : 397, "end" : "/div[1]/div[20]/p[26]", "endOffset" : 439, "_id" : { "$oid" : "509724a8a4d0cd0200000019" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352082600532 }, "created" : { "$date" : 1352082600532 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509725d71a8db6020000000a", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Jane is not jealous of Miss Ingram and Mr. Rochester becuase she sees that there is actually no love there--and, in the end, love is what she believes in", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Miss Ingram’s efforts at fascinating Mr. Rochester, \nto witness their repeated failure—herself unconscious that \nthey did fail; vainly fancying that each shaft launched hit the \nmark, and infatuatedly pluming herself on success, when her pride\nand self-complacency repelled further and further what she wished\nto allure—to witness this, was to be at once under \nceaseless excitation and ruthless restraint.", "uuid" : "5B56D2F2", "_id" : { "$oid" : "509725d71a8db6020000000a" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[20]/p[28]", "startOffset" : 661, "end" : "/div[1]/div[20]/p[28]", "endOffset" : 1067, "_id" : { "$oid" : "509725d71a8db6020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352082903048 }, "created" : { "$date" : 1352082903048 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50972664a4d0cd020000001a", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Jealousy begets love eh? I know other's who may suggest differently...", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "I knew jealousy would be the best ally I could call in for \nthe furtherance of that end.”", "uuid" : "20417F99", "_id" : { "$oid" : "50972664a4d0cd020000001a" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[26]/p[60]", "startOffset" : 124, "end" : "/div[1]/div[26]/p[60]", "endOffset" : 213, "_id" : { "$oid" : "50972664a4d0cd020000001b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352083044310 }, "created" : { "$date" : 1352083044310 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509752f0a4d0cd020000001c", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "a reference, if oblique, to Othello. Rochest wants to unearth something worse in Mr. Brocklehurst... worse, perhaps, than the head and fron of Mr. Rochester's offending?", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "And was that the head and front of his \noffending?", "uuid" : "5AF8CD5E", "_id" : { "$oid" : "509752f0a4d0cd020000001c" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[15]/p[75]", "startOffset" : 1, "end" : "/div[1]/div[15]/p[75]", "endOffset" : 51, "_id" : { "$oid" : "509752f0a4d0cd020000001d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352094448155 }, "created" : { "$date" : 1352094448155 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "509753091a8db6020000000c" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1352094473091 }, "groups" : [ "21L.003" ], "id" : "509753091a8db6020000000c", "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "quote" : "demanded", "ranges" : [ { "start" : "/div[1]/div[15]/p[75]", "startOffset" : 53, "end" : "/div[1]/div[15]/p[75]", "endOffset" : 62, "_id" : { "$oid" : "509753091a8db6020000000d" } } ], "tags" : [], "text" : "This is not petty interest, this is demand. Perhaps Mr. Rochester is a bit desperate?", "updated" : { "$date" : 1352094482235 }, "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "user" : "wrutter@mit.edu", "username" : "William R.", "uuid" : "B93F6FC6" } -{ "id" : "50976894a4d0cd020000001e", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "Here we see some example of logical thinking. It isn't important what the question is if there is no answer. I think in the world of Alice and Wonderland", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "Do cats eat bats?\nDo cats eat bats?' and sometimes, 'Do bats eat cats?' for, you see, as she couldn't answer\neither question, it didn't much matter which way she put it.", "uuid" : "DDC68D66", "_id" : { "$oid" : "50976894a4d0cd020000001e" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 4604, "end" : "/div[1]/div[3]", "endOffset" : 4773, "_id" : { "$oid" : "50976894a4d0cd020000001f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1352099988105 }, "created" : { "$date" : 1352099988105 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50976eafa4d0cd0200000020", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "THe first case of Alice being rude. WHy does it matter? Here she loses social interactions. Mental health. MIT campus again- value to things beyond knowledge.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`I wish I hadn't mentioned Dinah!'", "uuid" : "BEB28E7E", "_id" : { "$oid" : "50976eafa4d0cd0200000020" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[1]", "startOffset" : 10578, "end" : "/div[1]/div[5]/p[1]", "endOffset" : 10612, "_id" : { "$oid" : "50976eafa4d0cd0200000021" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1352101551065 }, "created" : { "$date" : 1352101551065 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509770b4a4d0cd0200000022", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "Here again Alice offends the caterpiller. He is still willing to help her. No consequence for her actions.", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`But I'm not used to it!' pleaded poor Alice in a piteous tone. And she thought of\n\t\t\therself, `I wish the creatures wouldn't be so easily offended!'", "uuid" : "ED22B6E5", "_id" : { "$oid" : "509770b4a4d0cd0200000022" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]/p[1]", "startOffset" : 5601, "end" : "/div[1]/div[7]/p[1]", "endOffset" : 5751, "_id" : { "$oid" : "509770b4a4d0cd0200000023" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1352102068623 }, "created" : { "$date" : 1352102068623 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509771e81a8db6020000000e", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "circular reasoning, we see this many times in the class. Using someone else's poor logic to lose their validity in arguments (think dialogues)", "uri" : "http://annotationstudio.mit.edu/documents/alice-s-adventures-in-wonderland-chapters-1-5-7", "quote" : "`You might just as well say,' added the March Hare, `that \"I like what I get\" is\n\t\t\tthe same thing as \"I get what I like\"!' \n\t\t\t\n\t\t\t`You might just as well say,' added the Dormouse, who seemed to be talking in his sleep,\n\t\t\t`that \"I breathe when I sleep\" is the same thing as \"I sleep when I\n\t\t\tbreathe\"!'", "uuid" : "298FB9B6", "_id" : { "$oid" : "509771e81a8db6020000000e" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]/p[1]", "startOffset" : 2183, "end" : "/div[1]/div[8]/p[1]", "endOffset" : 2489, "_id" : { "$oid" : "509771e81a8db6020000000f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1352102376398 }, "created" : { "$date" : 1352102376398 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5097e00c1a8db60200000010", "user" : "alex93@mit.edu", "username" : "Alexander O.", "text" : "Darwin understands that his ideas will appear to some as offensive, almost blasphemous. Still, he sees no reason why scientific evidence should have to disprove religion; in fact, he says clearly they are capable of complementing one another.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "I see no good reason why the views given in this volume should\nshock the religious feelings of any one.", "uuid" : "3F6608AC", "_id" : { "$oid" : "5097e00c1a8db60200000010" }, "permissions" : { "delete" : [ "alex93@mit.edu" ], "update" : [ "alex93@mit.edu" ], "admin" : [ "alex93@mit.edu" ], "read" : [ "alex93@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 894532, "end" : "/div[1]", "endOffset" : 894635, "_id" : { "$oid" : "5097e00c1a8db60200000011" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1352130572071 }, "created" : { "$date" : 1352130572071 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5097e0dba4d0cd0200000024", "user" : "alex93@mit.edu", "username" : "Alexander O.", "text" : "Darwin here is demonstrating that his ideas are very, very delicate, but at the same time extremely supported by natural evidence.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "If it could be demonstrated that any complex organ existed, which could not\npossibly have been formed by numerous, successive, slight modifications, my\ntheory would absolutely break down. But I can find out no such case.", "uuid" : "B92822C9", "_id" : { "$oid" : "5097e0dba4d0cd0200000024" }, "permissions" : { "delete" : [ "alex93@mit.edu" ], "update" : [ "alex93@mit.edu" ], "admin" : [ "alex93@mit.edu" ], "read" : [ "alex93@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 358012, "end" : "/div[1]", "endOffset" : 358232, "_id" : { "$oid" : "5097e0dba4d0cd0200000025" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1352130779915 }, "created" : { "$date" : 1352130779915 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5097e3161a8db60200000012", "user" : "alex93@mit.edu", "username" : "Alexander O.", "text" : "Here, Darwin is explaining the effect of human culture on our ability to affect natural selection. Whereas nature chooses as a whole, humans choose specifically for our own species and appearance.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "Man selects only for his own\ngood; Nature only for that of the being which she tends.", "uuid" : "CA059C8E", "_id" : { "$oid" : "5097e3161a8db60200000012" }, "permissions" : { "delete" : [ "alex93@mit.edu" ], "update" : [ "alex93@mit.edu" ], "admin" : [ "alex93@mit.edu" ], "read" : [ "alex93@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 162422, "end" : "/div[1]", "endOffset" : 162507, "_id" : { "$oid" : "5097e3161a8db60200000013" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1352131350780 }, "created" : { "$date" : 1352131350780 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5097e4351a8db60200000014", "user" : "alex93@mit.edu", "username" : "Alexander O.", "text" : "This is one of the biggest discoveries Darwin made to support his theory. To find a theory that takes into account this evidence yet debunks Darwin's theory is impossible.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "What can be more curious than that the hand of a man, formed for\ngrasping, that of a mole for digging, the leg of the horse, the paddle of\nthe porpoise, and the wing of the bat, should all be constructed on the\nsame pattern, and should include similar bones, in the same relative\npositions?", "uuid" : "2C25E4AD", "_id" : { "$oid" : "5097e4351a8db60200000014" }, "permissions" : { "delete" : [ "alex93@mit.edu" ], "update" : [ "alex93@mit.edu" ], "admin" : [ "alex93@mit.edu" ], "read" : [ "alex93@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 808060, "end" : "/div[1]", "endOffset" : 808350, "_id" : { "$oid" : "5097e4351a8db60200000015" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1352131637329 }, "created" : { "$date" : 1352131637329 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5097e54d1a8db60200000016", "user" : "alex93@mit.edu", "username" : "Alexander O.", "text" : "Man is limited in time, which limits the amount that he can accomplish. Nature's time is infinite compared to man's, so the extent of its creation will always be greater than that of man.", "uri" : "http://annotationstudio.mit.edu/documents/origin-of-species-first-edition", "quote" : "How fleeting are the wishes and efforts of\nman! how short his time! and consequently how poor will his products be,\ncompared with those accumulated by Nature during whole geological periods.\nCan we wonder, then, that Nature's productions should be far \"truer\" in\ncharacter than man's productions; that they should be infinitely better\nadapted to the most complex conditions of life, and should plainly bear the\nstamp of far higher workmanship?", "uuid" : "EFE0A6C8", "_id" : { "$oid" : "5097e54d1a8db60200000016" }, "permissions" : { "delete" : [ "alex93@mit.edu" ], "update" : [ "alex93@mit.edu" ], "admin" : [ "alex93@mit.edu" ], "read" : [ "alex93@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 163501, "end" : "/div[1]", "endOffset" : 163945, "_id" : { "$oid" : "5097e54d1a8db60200000017" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1352131917301 }, "created" : { "$date" : 1352131917301 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50983e38ab5e720200000002", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Reference to paradise lost Bk I, ll. 66-7 and Bk I, ll. 242, 254. Refers to the word regions as Satan views regions as places where peace and rest can never dwell.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Gulliver a most\ndesolate wanderer in most dread and dangerous regions.", "uuid" : "4AB72561", "_id" : { "$oid" : "50983e38ab5e720200000002" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[21]", "startOffset" : 2144, "end" : "/div[1]/div[5]/p[21]", "endOffset" : 2214, "_id" : { "$oid" : "50983e38ab5e720200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352154680568 }, "created" : { "$date" : 1352154680568 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50983f7e1a8db6020000001a", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Refers to the end of PL BK XII, ll. 646-7. Refers to the world being before them when adam and eve are banished from eden", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "My world had \nfor some years been in Lowood: my experience had been of its \nrules and systems; now I remembered that the real world was wide,\nand that a varied field of hopes and fears, of sensations and \nexcitements, awaited those who had courage to go forth into its \nexpanse, to seek real knowledge of life amidst its perils.", "uuid" : "4D011018", "_id" : { "$oid" : "50983f7e1a8db6020000001a" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[12]/p[8]", "startOffset" : 801, "end" : "/div[1]/div[12]/p[8]", "endOffset" : 1129, "_id" : { "$oid" : "50983f7e1a8db6020000001b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352155006556 }, "created" : { "$date" : 1352155006556 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509840fc1a8db6020000001c", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Reference to PL. The penguin edition states: The 'first picture alludes to milton's sinister image of satan 'like a cormorant' on the tree of live, 'devising death/to those who lived' (PL Bk IV, ll. 196-8)", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "The first \nrepresented clouds low and livid, rolling over a swollen sea: all\nthe distance was in eclipse; so, too, was the foreground; or \nrather, the nearest billows, for there was no land.  One \ngleam of light lifted into relief a half-submerged mast, on which\nsat a cormorant, dark and large, with wings flecked with foam; \nits beak held a gold bracelet set with gems, that I had touched \nwith as brilliant tints as my palette could yield, and as \nglittering distinctness as my pencil could impart.  Sinking \nbelow the bird and mast, a drowned corpse glanced through the \ngreen water; a fair arm was the only limb clearly visible, whence\nthe bracelet had been washed or torn.", "uuid" : "C2300C72", "_id" : { "$oid" : "509840fc1a8db6020000001c" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[15]/p[106]", "startOffset" : 39, "end" : "/div[1]/div[15]/p[106]", "endOffset" : 717, "_id" : { "$oid" : "509840fc1a8db6020000001d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352155388568 }, "created" : { "$date" : 1352155388568 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50984192ab5e720200000005", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Reference to the fall of Mulciber (Vulcan). (PL Bk I, ll. 740-47)", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "morning till noon, and from noon till \nnight:", "uuid" : "40BC7184", "_id" : { "$oid" : "50984192ab5e720200000005" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[15]/p[112]", "startOffset" : 80, "end" : "/div[1]/div[15]/p[112]", "endOffset" : 125, "_id" : { "$oid" : "50984192ab5e720200000006" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352155538631 }, "created" : { "$date" : 1352155538631 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509841d81a8db6020000001e", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Mt. Latmos is from Classical mythology as the place where the moon-goddess Selene seduced Endymion in his sleep.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Where did you \nsee Latmos?  For that is Latmos.  There! put the \ndrawings away!", "uuid" : "696DA672", "_id" : { "$oid" : "509841d81a8db6020000001e" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[15]/p[115]", "startOffset" : 567, "end" : "/div[1]/div[15]/p[115]", "endOffset" : 646, "_id" : { "$oid" : "509841d81a8db6020000001f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352155608633 }, "created" : { "$date" : 1352155608633 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509842f7ab5e720200000007", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Reference to PL Bk II, ll. 5-6 \"Satan exalted sat by merit raised/ To that bad eminence\"", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "bad eminence", "uuid" : "8D2A3F7D", "_id" : { "$oid" : "509842f7ab5e720200000007" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[16]/p[61]", "startOffset" : 547, "end" : "/div[1]/div[16]/p[61]", "endOffset" : 559, "_id" : { "$oid" : "509842f7ab5e720200000008" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352155895120 }, "created" : { "$date" : 1352155895120 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50984457ab5e72020000000a", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Another direct line from Paradise lost. Bronte replaced 'they' with she and is referring to 'the fallen Eve'. (PL Bk XII, l. 645)", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Some natural tears she \nshed”", "uuid" : "31F59A90", "_id" : { "$oid" : "50984457ab5e72020000000a" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[19]/p[30]", "startOffset" : 387, "end" : "/div[1]/div[19]/p[30]", "endOffset" : 416, "_id" : { "$oid" : "50984457ab5e72020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352156247241 }, "created" : { "$date" : 1352156247241 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5098456c1a8db60200000020", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Reference to PL as Eve says something similar to Adam at the end of the epic. (bk XII, ll. 615-17)", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "wherever you are is my home—my only home", "uuid" : "94CE9979", "_id" : { "$oid" : "5098456c1a8db60200000020" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[24]/p[34]", "startOffset" : 104, "end" : "/div[1]/div[24]/p[34]", "endOffset" : 144, "_id" : { "$oid" : "5098456c1a8db60200000021" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352156524797 }, "created" : { "$date" : 1352156524797 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509845e8ab5e72020000000c", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Eden in PL also had a 'verdurous' wall. (bk IV l. 143)", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "No nook \nin the grounds more sheltered and more Eden-like; it was full of \ntrees, it bloomed with flowers: a very high wall shut it out from\nthe court", "uuid" : "BCB4EC0E", "_id" : { "$oid" : "509845e8ab5e72020000000c" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[25]/p[4]", "startOffset" : 224, "end" : "/div[1]/div[25]/p[4]", "endOffset" : 374, "_id" : { "$oid" : "509845e8ab5e72020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352156648620 }, "created" : { "$date" : 1352156648620 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5098465a1a8db60200000022", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "From PL (Bk IV, ll. 598-609). Foreshadows the fall to come as the garden is 'eden'.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "silence \nreigned, such gloaming gathered, I felt as if I could haunt such \nshade for ever; but in threading the flower and fruit parterres \nat the upper part of the enclosure, enticed there by the light \nthe now rising moon", "uuid" : "DCB49936", "_id" : { "$oid" : "5098465a1a8db60200000022" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[25]/p[4]", "startOffset" : 721, "end" : "/div[1]/div[25]/p[4]", "endOffset" : 944, "_id" : { "$oid" : "5098465a1a8db60200000023" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352156762115 }, "created" : { "$date" : 1352156762115 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5098473fab5e72020000000e", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Used in PL (bk IX, l. 166) as imbrute meaning 'make bestial' used to refer to Satan entering the body of the serpent.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "embruted", "uuid" : "DEA8C38E", "_id" : { "$oid" : "5098473fab5e72020000000e" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[28]/p[60]", "startOffset" : 2204, "end" : "/div[1]/div[28]/p[60]", "endOffset" : 2212, "_id" : { "$oid" : "5098473fab5e72020000000f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352156991713 }, "created" : { "$date" : 1352156991713 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509848b91a8db60200000024", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Refers to PL (Book XI, ll. 242-4) where Satan recognizes hell.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "‘This life,’ said I at last, ‘is \nhell: this is the air—those are the sounds of the \nbottomless pit!  I have a right to deliver myself from it if\nI can", "uuid" : "2D6BEC86", "_id" : { "$oid" : "509848b91a8db60200000024" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[29]/p[76]", "startOffset" : 1, "end" : "/div[1]/div[29]/p[76]", "endOffset" : 152, "_id" : { "$oid" : "509848b91a8db60200000025" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352157369930 }, "created" : { "$date" : 1352157369930 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509848e91a8db60200000026", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Directly from PL (Bk II, l. 996).", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "confusion worse confounded", "uuid" : "C5992C4A", "_id" : { "$oid" : "509848e91a8db60200000026" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[36]/p[24]", "startOffset" : 246, "end" : "/div[1]/div[36]/p[24]", "endOffset" : 272, "_id" : { "$oid" : "509848e91a8db60200000027" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352157417282 }, "created" : { "$date" : 1352157417282 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509849911a8db60200000028", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Reference to PL (BK I, ll. 600-601). Romanticization of Satan.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "scar of fire on your forehead", "uuid" : "E659EA95", "_id" : { "$oid" : "509849911a8db60200000028" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[39]/p[74]", "startOffset" : 62, "end" : "/div[1]/div[39]/p[74]", "endOffset" : 91, "_id" : { "$oid" : "509849911a8db60200000029" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352157585223 }, "created" : { "$date" : 1352157585223 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50984a401a8db6020000002a", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Reference to PL (Bk III, ll. 48-9). Blank refers to the page left blank by a printer. This quote talks about Milton's 'lament for his blindness'.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "the sky is no longer a blank to him—the earth no \nlonger a void.", "uuid" : "2F7AB550", "_id" : { "$oid" : "50984a401a8db6020000002a" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[40]/p[20]", "startOffset" : 250, "end" : "/div[1]/div[40]/p[20]", "endOffset" : 314, "_id" : { "$oid" : "50984a401a8db6020000002b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352157760165 }, "created" : { "$date" : 1352157760165 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5098605b1a8db60200000030" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1352163419235 }, "groups" : [ "21L.003" ], "id" : "5098605b1a8db60200000030", "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "quote" : "strange, and \nconsequently attractive", "ranges" : [ { "start" : "/div[1]/div[7]/p[65]", "startOffset" : 557, "end" : "/div[1]/div[7]/p[65]", "endOffset" : 594, "_id" : { "$oid" : "5098605b1a8db60200000031" } } ], "tags" : [], "text" : "The book name Rasselas was strange and attractive. So were the ideas in Rasselas; they are also novel to JE. This is the Young JE voice.", "updated" : { "$date" : 1352163793896 }, "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "uuid" : "F0E14E73" } -{ "id" : "509861b0ab5e72020000001a", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Intent: adj. firmly or steadfastly fixed or directed, as the eyes or mind", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "intent", "uuid" : "E920DB59", "_id" : { "$oid" : "509861b0ab5e72020000001a" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]/p[65]", "startOffset" : 463, "end" : "/div[1]/div[7]/p[65]", "endOffset" : 469, "_id" : { "$oid" : "509861b0ab5e72020000001b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352163760764 }, "created" : { "$date" : 1352163760764 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509861eeab5e72020000001c", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "lending the book = lending ideas?", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "lend it to me", "uuid" : "5B632D04", "_id" : { "$oid" : "509861eeab5e72020000001c" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]/p[66]", "startOffset" : 82, "end" : "/div[1]/div[7]/p[66]", "endOffset" : 95, "_id" : { "$oid" : "509861eeab5e72020000001d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352163822933 }, "created" : { "$date" : 1352163822933 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509862e51a8db60200000032", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : " Hardihood: n. Boldness, hardiness; audacity.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "hardihood", "uuid" : "7A430A1E", "_id" : { "$oid" : "509862e51a8db60200000032" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]/p[68]", "startOffset" : 67, "end" : "/div[1]/div[7]/p[68]", "endOffset" : 76, "_id" : { "$oid" : "509862e51a8db60200000033" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352164069301 }, "created" : { "$date" : 1352164069301 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50986533ab5e72020000001e", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "A precursor of change", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "the step was contrary to my nature and habits", "uuid" : "5E1FF764", "_id" : { "$oid" : "50986533ab5e72020000001e" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]/p[68]", "startOffset" : 122, "end" : "/div[1]/div[7]/p[68]", "endOffset" : 167, "_id" : { "$oid" : "50986533ab5e72020000001f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352164659836 }, "created" : { "$date" : 1352164659836 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50986ad19638180200000002", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : " Chord: fig. Of the emotions, feelings, etc.: the mind being viewed as a musical instrument of which these are the strings.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "chord", "uuid" : "940F520C", "_id" : { "$oid" : "50986ad19638180200000002" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]/p[68]", "startOffset" : 207, "end" : "/div[1]/div[7]/p[68]", "endOffset" : 213, "_id" : { "$oid" : "50986ad19638180200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352166097054 }, "created" : { "$date" : 1352166097054 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50986c069638180200000004", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "This is also the Old JE's recollection. Proud as she was, the Young JE would not have called herself frivolous and childish.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "though of a frivolous and childish kind; I \ncould not digest or comprehend the serious or substantial", "uuid" : "4D3C253A", "_id" : { "$oid" : "50986c069638180200000004" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]/p[68]", "startOffset" : 261, "end" : "/div[1]/div[7]/p[68]", "endOffset" : 362, "_id" : { "$oid" : "50986c069638180200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352166406951 }, "created" : { "$date" : 1352166406951 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50986cb29638180200000006", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Taking: adj. That takes the fancy or affection; captivating, engaging, alluring, fascinating, charming, attractive", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "taking", "uuid" : "DA527A6E", "_id" : { "$oid" : "50986cb29638180200000006" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]/p[70]", "startOffset" : 72, "end" : "/div[1]/div[7]/p[70]", "endOffset" : 79, "_id" : { "$oid" : "50986cb29638180200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352166578030 }, "created" : { "$date" : 1352166578030 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50986cfe9638180200000008", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Trifling: Of little moment or value; paltry, trumpery; insignificant, petty. Again this is the Old JE.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "trifling", "uuid" : "FFB53D48", "_id" : { "$oid" : "50986cfe9638180200000008" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]/p[70]", "startOffset" : 125, "end" : "/div[1]/div[7]/p[70]", "endOffset" : 134, "_id" : { "$oid" : "50986cfe9638180200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352166654169 }, "created" : { "$date" : 1352166654169 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509870e3963818020000000a", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "This is the opinion of the Young JE. She dislikes it because it lacks fantasy.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "nothing about fairies, nothing \nabout genii; no bright variety seemed spread over the \nclosely-printed pages", "uuid" : "A4D38214", "_id" : { "$oid" : "509870e3963818020000000a" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]/p[70]", "startOffset" : 147, "end" : "/div[1]/div[7]/p[70]", "endOffset" : 255, "_id" : { "$oid" : "509870e3963818020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352167651755 }, "created" : { "$date" : 1352167651755 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50987304ab5e720200000020", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Father Dolan might be quoting the phrase to show the dreariness of his repeated presence. He also in some ways represents religion; a life which Stephen deems monotonous when offered priesthood.", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "Every day Father Dolan.", "uuid" : "04553506", "_id" : { "$oid" : "50987304ab5e720200000020" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[492]", "startOffset" : 98, "end" : "/div[1]/p[492]", "endOffset" : 121, "_id" : { "$oid" : "50987304ab5e720200000021" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352168196393 }, "created" : { "$date" : 1352168196393 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50987366963818020000000c", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "why does he specify women and girls? role of women", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "confessional under the shame of a darkened chapel by the lips of women\n\nand of girls", "uuid" : "BD2E3063", "_id" : { "$oid" : "50987366963818020000000c" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1143]", "startOffset" : 569, "end" : "/div[1]/p[1143]", "endOffset" : 653, "_id" : { "$oid" : "50987366963818020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352168294630 }, "created" : { "$date" : 1352168294630 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509873b4ab5e720200000022", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Stephen's ultimate view of a life of priesthood. ", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "It was a grave and\n\nordered and passionless life that awaited him, a life without material\n\ncares.", "uuid" : "73A49489", "_id" : { "$oid" : "509873b4ab5e720200000022" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1146]", "startOffset" : 259, "end" : "/div[1]/p[1146]", "endOffset" : 359, "_id" : { "$oid" : "509873b4ab5e720200000023" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352168372850 }, "created" : { "$date" : 1352168372850 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50987522ab5e720200000024", "user" : "rahmanr@mit.edu", "username" : "Rafa R.", "text" : "Stephen is feeling very guilty after hearing the sermon --> Macbeth's guilt", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "He came down the aisle of the chapel, his legs shaking and the scalp of\n\nhis head trembling as though it had been touched by ghostly fingers.", "uuid" : "7A66ABB0", "_id" : { "$oid" : "50987522ab5e720200000024" }, "permissions" : { "delete" : [ "rahmanr@mit.edu" ], "update" : [ "rahmanr@mit.edu" ], "admin" : [ "rahmanr@mit.edu" ], "read" : [ "rahmanr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[968]", "startOffset" : 2, "end" : "/div[1]/p[968]", "endOffset" : 143, "_id" : { "$oid" : "50987522ab5e720200000025" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352168738366 }, "created" : { "$date" : 1352168738366 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50988724963818020000000e", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Evening Star was also visible when God created Eve in PL. Also, the reference to twilight is interesting since satan slithered up the tree of knowledge at twilight.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "The second picture contained for foreground only the dim peak \nof a hill, with grass and some leaves slanting as if by a \nbreeze.  Beyond and above spread an expanse of sky, dark \nblue as at twilight: rising into the sky was a woman’s \nshape to the bust, portrayed in tints as dusk and soft as I could\ncombine.  The dim forehead was crowned with a star; the \nlineaments below were seen as through the suffusion of vapour; \nthe eyes shone dark and wild; the hair streamed shadowy, like a \nbeamless cloud torn by storm or by electric travail.  On the\nneck lay a pale reflection like moonlight; the same faint lustre \ntouched the train of thin clouds from which rose and bowed this \nvision of the Evening Star.", "uuid" : "718C244D", "_id" : { "$oid" : "50988724963818020000000e" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[15]/p[107]", "startOffset" : 0, "end" : "/div[1]/div[15]/p[107]", "endOffset" : 707, "_id" : { "$oid" : "50988724963818020000000f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352173348757 }, "created" : { "$date" : 1352173348757 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50994922ab5e720200000026", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Recall that Helen just got beaten. By indulging herself in Rasselas, she's seeking comfort from it.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "absorbed, silent, abstracted", "uuid" : "2389D3E9", "_id" : { "$oid" : "50994922ab5e720200000026" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]/p[14]", "startOffset" : 146, "end" : "/div[1]/div[8]/p[14]", "endOffset" : 174, "_id" : { "$oid" : "50994922ab5e720200000027" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352223010857 }, "created" : { "$date" : 1352223010857 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5099495eab5e720200000028", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "This further demonstrates Helen's desire to read Rasselas despite the difficulty to read under poor lighting.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "dim glare of the embers", "uuid" : "CABCD8CA", "_id" : { "$oid" : "5099495eab5e720200000028" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]/p[14]", "startOffset" : 250, "end" : "/div[1]/div[8]/p[14]", "endOffset" : 273, "_id" : { "$oid" : "5099495eab5e720200000029" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352223070019 }, "created" : { "$date" : 1352223070019 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509949b99638180200000010", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "She does not talk to Jane immediately after she finishes the book, but after five minutes. Although she risks being rude and ignorant, she takes the time to mediate. Perhaps about Rasselas.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "in five minutes more", "uuid" : "14AA707F", "_id" : { "$oid" : "509949b99638180200000010" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]/p[17]", "startOffset" : 4, "end" : "/div[1]/div[8]/p[17]", "endOffset" : 24, "_id" : { "$oid" : "509949b99638180200000011" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352223161546 }, "created" : { "$date" : 1352223161546 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50994ae99638180200000012", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Quite similar to the theme in Rasselas.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Yet it would be your duty to bear it, if you could not \navoid it: it is weak and silly to say you cannot bear what\nit is your fate to be required to bear.", "uuid" : "22EBF9AF", "_id" : { "$oid" : "50994ae99638180200000012" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[8]/p[31]", "startOffset" : 1, "end" : "/div[1]/div[8]/p[31]", "endOffset" : 155, "_id" : { "$oid" : "50994ae99638180200000013" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352223465262 }, "created" : { "$date" : 1352223465262 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50994e45ab5e72020000002a", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "A resemblance to Rasselas", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Human beings never enjoy complete happiness in this world.", "uuid" : "07B1F417", "_id" : { "$oid" : "50994e45ab5e72020000002a" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[26]/p[17]", "startOffset" : 51, "end" : "/div[1]/div[26]/p[17]", "endOffset" : 109, "_id" : { "$oid" : "50994e45ab5e72020000002b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352224325234 }, "created" : { "$date" : 1352224325234 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509952429638180200000014", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "R and JE have a difference in ideology. R searches for perfection and believes that he can realize it. He also rejects anything that does not fit his meticulous standards. JE believes in plainness and endurance.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "I can and will realise.  I shall begin \nto-day", "uuid" : "692C5B70", "_id" : { "$oid" : "509952429638180200000014" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[26]/p[18]", "startOffset" : 7, "end" : "/div[1]/div[26]/p[18]", "endOffset" : 53, "_id" : { "$oid" : "509952429638180200000015" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352225346342 }, "created" : { "$date" : 1352225346342 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50998c169638180200000016", "user" : "mata@mit.edu", "username" : "Matthew A.", "text" : "Direct King Lear quote (Shakespeare 3.4.113)", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Off, ye \nlendings", "uuid" : "549180AA", "_id" : { "$oid" : "50998c169638180200000016" }, "permissions" : { "delete" : [ "mata@mit.edu" ], "update" : [ "mata@mit.edu" ], "admin" : [ "mata@mit.edu" ], "read" : [ "mata@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[21]/p[89]", "startOffset" : 14, "end" : "/div[1]/div[21]/p[89]", "endOffset" : 31, "_id" : { "$oid" : "50998c169638180200000017" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352240150585 }, "created" : { "$date" : 1352240150585 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50998c37fdcc6c0200000002", "user" : "mata@mit.edu", "username" : "Matthew A.", "text" : "Direct King Lear quote (Shakespeare 4.7.36-8)", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "“you wished to turn me from the door, on a night when you \nshould not have shut out a dog", "uuid" : "5F4DDED6", "_id" : { "$oid" : "50998c37fdcc6c0200000002" }, "permissions" : { "delete" : [ "mata@mit.edu" ], "update" : [ "mata@mit.edu" ], "admin" : [ "mata@mit.edu" ], "read" : [ "mata@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[31]/p[57]", "startOffset" : 45, "end" : "/div[1]/div[31]/p[57]", "endOffset" : 134, "_id" : { "$oid" : "50998c37fdcc6c0200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352240183089 }, "created" : { "$date" : 1352240183089 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50998c909638180200000018", "user" : "mata@mit.edu", "username" : "Matthew A.", "text" : "Silence when asked to speak - relates to Shakespeare 1.1.94-5", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Accordingly I sat and said nothing: “If he expects me to\ntalk for the mere sake of talking and showing off, he will find \nhe has addressed himself to the wrong person,” I \nthought.", "uuid" : "3C4B944F", "_id" : { "$oid" : "50998c909638180200000018" }, "permissions" : { "delete" : [ "mata@mit.edu" ], "update" : [ "mata@mit.edu" ], "admin" : [ "mata@mit.edu" ], "read" : [ "mata@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[16]/p[39]", "startOffset" : 0, "end" : "/div[1]/div[16]/p[39]", "endOffset" : 180, "_id" : { "$oid" : "50998c909638180200000019" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352240272036 }, "created" : { "$date" : 1352240272036 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50998ec0fdcc6c0200000004", "user" : "mata@mit.edu", "username" : "Matthew A.", "text" : "Personification of the heart", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "heart full and eager to overflow", "uuid" : "B96BA56D", "_id" : { "$oid" : "50998ec0fdcc6c0200000004" }, "permissions" : { "delete" : [ "mata@mit.edu" ], "update" : [ "mata@mit.edu" ], "admin" : [ "mata@mit.edu" ], "read" : [ "mata@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[19]/p[82]", "startOffset" : 555, "end" : "/div[1]/div[19]/p[82]", "endOffset" : 587, "_id" : { "$oid" : "50998ec0fdcc6c0200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352240832443 }, "created" : { "$date" : 1352240832443 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50998f09fdcc6c0200000006", "user" : "mata@mit.edu", "username" : "Matthew A.", "text" : "Connection between listening (speaking) and the heart", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "finding a way through the ear to the heart, and there \nwaking sensation strangely", "uuid" : "933DB431", "_id" : { "$oid" : "50998f09fdcc6c0200000006" }, "permissions" : { "delete" : [ "mata@mit.edu" ], "update" : [ "mata@mit.edu" ], "admin" : [ "mata@mit.edu" ], "read" : [ "mata@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[19]/p[139]", "startOffset" : 244, "end" : "/div[1]/div[19]/p[139]", "endOffset" : 325, "_id" : { "$oid" : "50998f09fdcc6c0200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352240905108 }, "created" : { "$date" : 1352240905108 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50999013fdcc6c0200000008", "user" : "mata@mit.edu", "username" : "Matthew A.", "text" : "Connection between the heart and physical senses", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "I know not whether the day was fair or foul; in descending the\ndrive, I gazed neither on sky nor earth: my heart was with my \neyes; and both seemed migrated into Mr. Rochester’s \nframe.", "uuid" : "389EA647", "_id" : { "$oid" : "50999013fdcc6c0200000008" }, "permissions" : { "delete" : [ "mata@mit.edu" ], "update" : [ "mata@mit.edu" ], "admin" : [ "mata@mit.edu" ], "read" : [ "mata@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[28]/p[18]", "startOffset" : 592, "end" : "/div[1]/div[28]/p[19]", "endOffset" : 185, "_id" : { "$oid" : "50999013fdcc6c0200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352241171225 }, "created" : { "$date" : 1352241171225 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50999106fdcc6c020000000a", "user" : "mata@mit.edu", "username" : "Matthew A.", "text" : "Once again connection between heart and voice", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "“My heart is mute,—my heart is mute,” I \nanswered, struck and thrilled.", "uuid" : "40F7CC2C", "_id" : { "$oid" : "50999106fdcc6c020000000a" }, "permissions" : { "delete" : [ "mata@mit.edu" ], "update" : [ "mata@mit.edu" ], "admin" : [ "mata@mit.edu" ], "read" : [ "mata@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[36]/p[100]", "startOffset" : 0, "end" : "/div[1]/div[36]/p[100]", "endOffset" : 71, "_id" : { "$oid" : "50999106fdcc6c020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352241414808 }, "created" : { "$date" : 1352241414808 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5099914b963818020000001a", "user" : "mata@mit.edu", "username" : "Matthew A.", "text" : "Scene when Jane thinks of Rochester", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "All the house was still; for I believe all, except St. John \nand myself, were now retired to rest.  The one candle was \ndying out: the room was full of moonlight.  My heart beat \nfast and thick: I heard its throb.  Suddenly it stood still \nto an inexpressible feeling that thrilled it through, and passed \nat once to my head and extremities.  The feeling was not \nlike an electric shock, but it was quite as sharp, as strange, as\nstartling: it acted on my senses as if their utmost activity \nhitherto had been but torpor, from which they were now summoned \nand forced to wake.  They rose expectant: eye and ear waited\nwhile the flesh quivered on my bones.", "uuid" : "DC63EC0D", "_id" : { "$oid" : "5099914b963818020000001a" }, "permissions" : { "delete" : [ "mata@mit.edu" ], "update" : [ "mata@mit.edu" ], "admin" : [ "mata@mit.edu" ], "read" : [ "mata@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[37]/p[89]", "startOffset" : 0, "end" : "/div[1]/div[37]/p[89]", "endOffset" : 655, "_id" : { "$oid" : "5099914b963818020000001b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352241483821 }, "created" : { "$date" : 1352241483821 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5099b75e963818020000001c", "user" : "sl1995@mit.edu", "username" : "Songtai L.", "text" : "Notice the present tense here. This is the Old JE speaking.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "know", "uuid" : "B286880F", "_id" : { "$oid" : "5099b75e963818020000001c" }, "permissions" : { "delete" : [ "sl1995@mit.edu" ], "update" : [ "sl1995@mit.edu" ], "admin" : [ "sl1995@mit.edu" ], "read" : [ "sl1995@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]/p[68]", "startOffset" : 44, "end" : "/div[1]/div[7]/p[68]", "endOffset" : 49, "_id" : { "$oid" : "5099b75e963818020000001d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352251230824 }, "created" : { "$date" : 1352251230824 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5099da58fdcc6c020000000c", "user" : "slonaker@mit.edu", "username" : "James S.", "text" : "Display of how she is rebellious at the beginning of the story", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "I was conscious that a moment’s mutiny \nhad already rendered me liable to strange penalties, and, like \nany other rebel slave, I felt resolved, in my desperation, to go \nall lengths.", "uuid" : "0172B955", "_id" : { "$oid" : "5099da58fdcc6c020000000c" }, "permissions" : { "delete" : [ "slonaker@mit.edu" ], "update" : [ "slonaker@mit.edu" ], "admin" : [ "slonaker@mit.edu" ], "read" : [ "slonaker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]/p[1]", "startOffset" : 259, "end" : "/div[1]/div[4]/p[1]", "endOffset" : 441, "_id" : { "$oid" : "5099da58fdcc6c020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352260184608 }, "created" : { "$date" : 1352260184608 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "509a0bf6fdcc6c020000000e" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1352272886890 }, "groups" : [ "21L.000J" ], "id" : "509a0bf6fdcc6c020000000e", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "quote" : "Amasa Delano", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 25, "end" : "/div[1]/p[1]", "endOffset" : 38, "_id" : { "$oid" : "509a0bf6fdcc6c020000000f" } } ], "tags" : [], "text" : "General notes to be made: Beginning with the Botany Bay sailors. It should be noted that a likely reason for the omission of that detail is to preserve the stark contrast between the situation upon the Spanish ship and that of Delano's ship. Melville wanted to create contrast between the two boats, and by using creative liberties, he's able to achieve this to a greater degree by omitting something that may suggest the level of control on Delano's ship was something more like that of the Spanish ship, something that Melville didn't want conveyed. ", "updated" : { "$date" : 1352273014417 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "user" : "nhall@mit.edu", "username" : "Richard H.", "uuid" : "64103235" } -{ "id" : "509a0ce5fdcc6c0200000010", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Another general note: Melville probably made Delano's trip a success in the novella to make it clear that Delano's in a position to be charitable, in good spirits, trustworthy, etc. The somber account of Delano's travels in the source text doesn't make one think that Delano would be in any position to give such charities on a whim. ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "of Duxbury,", "uuid" : "CFDB361E", "_id" : { "$oid" : "509a0ce5fdcc6c0200000010" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 40, "end" : "/div[1]/p[1]", "endOffset" : 51, "_id" : { "$oid" : "509a0ce5fdcc6c0200000011" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352273125500 }, "created" : { "$date" : 1352273125500 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509a0e31fdcc6c0200000012", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Another general note: The omission of Captain Jonathan Barney... Melville's work of fiction is just that: a work of fiction. It's trying to look at themes and motifs in a simulated environment. Jonathan Barney is just another variable in the experiment, and with him, the story would lose some of its potency. The tension is created by knowing that Delano is aboard a ship whose captain has been taken hostage. We learn this before Delano does, and by knowing that only Delano is not privy to this simplifies the scenario and keeps us on track with the characters we're supposed to be focusing on. If Jonathan was a relevant character in the novel, we''d have that sense of solitude shattered. ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Massachusetts,", "uuid" : "B4168348", "_id" : { "$oid" : "509a0e31fdcc6c0200000012" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 55, "end" : "/div[1]/p[1]", "endOffset" : 69, "_id" : { "$oid" : "509a0e31fdcc6c0200000013" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352273457938 }, "created" : { "$date" : 1352273457938 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509a0f6dfdcc6c0200000014", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "In the Delano source, he mentions that, \"the act of the negro, who kept constantly at the elbows of don bonito and myself, I should, at any other time, have immediately resented; and although it excited my wonder, that his commander should allow this extraordinary liberty, I did not remonstrate against it, until it became troublesome to myself.\" He actually recognizes the unusual amount of freedom given to Babo, a sign that something was wrong. Delano in the fiction didn't quite pick up on that and attributed it to a very trusting relationship. ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "By\nhis side stood a black of small stature, in whose\nrude face, as occasionally, like a shepherd's dog,\nhe mutely turned it up into the Spaniard's, sorrow\nand affection were equally blended.", "uuid" : "91E9A473", "_id" : { "$oid" : "509a0f6dfdcc6c0200000014" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 511, "end" : "/div[1]/p[20]", "endOffset" : 702, "_id" : { "$oid" : "509a0f6dfdcc6c0200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352273773285 }, "created" : { "$date" : 1352273773285 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509a3dbcf7b3810200000002", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "Focusing on this passage", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "“I like Revelations, and the book of Daniel, and Genesis\nand Samuel, and a little bit of Exodus, and some parts of Kings \nand Chronicles, and Job and Jonah.”\n“And the Psalms?  I hope you like them?”\n“No, sir.”\n“No? oh, shocking!  I have a little boy, younger \nthan you, who knows six Psalms by heart: and when you ask him \nwhich he would rather have, a gingerbread-nut to eat or a verse \nof a Psalm to learn, he says: ‘Oh! the verse of a Psalm! \nangels sing Psalms;’ says he, ‘I wish to be a little \nangel here below;’ he then gets two nuts in recompense for \nhis infant piety.”\n“Psalms are not interesting,” I remarked.\n“That proves you have a wicked heart; and you must pray \nto God to change it: to give you a new and clean one: to take \naway your heart of stone and give you a heart of \nflesh.”", "uuid" : "C6777B0B", "_id" : { "$oid" : "509a3dbcf7b3810200000002" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [ "Focus" ], "ranges" : [ { "start" : "/div[1]/div[6]/p[50]", "startOffset" : 0, "end" : "/div[1]/div[6]/p[55]", "endOffset" : 177, "_id" : { "$oid" : "509a3dbcf7b3810200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352285628010 }, "created" : { "$date" : 1352285628010 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509a3e38fdcc6c0200000016", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "Falsely accused/ the mention of pathos here means that the arguement isn't that good.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "“My dear children,” pursued the black marble \nclergyman, with pathos, “this is a sad, a melancholy \noccasion; for it becomes my duty to warn you, that this girl, who\nmight be one of God’s own lambs, is a little castaway: not \na member of the true flock, but evidently an interloper and an \nalien.  You must be on your guard against her; you must shun\nher example; if necessary, avoid her company, exclude her from \nyour sports, and shut her out from your converse.  Teachers,\nyou must watch her: keep your eyes on her movements, weigh well \nher words, scrutinise her actions, punish her body to save her \nsoul: if, indeed, such salvation be possible, for (my tongue \nfalters while I tell it) this girl, this child, the native of a \nChristian land, worse than many a little heathen who says its \nprayers to Brahma and kneels before Juggernaut—this girl \nis—a liar!”", "uuid" : "1CD4C234", "_id" : { "$oid" : "509a3e38fdcc6c0200000016" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[9]/p[50]", "startOffset" : 0, "end" : "/div[1]/div[9]/p[50]", "endOffset" : 864, "_id" : { "$oid" : "509a3e38fdcc6c0200000017" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352285752520 }, "created" : { "$date" : 1352285752520 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509a3e9efdcc6c0200000018", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "More false accusations.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "“This I learned from her benefactress; from the pious \nand charitable lady who adopted her in her orphan state, reared \nher as her own daughter, and whose kindness, whose generosity the\nunhappy girl repaid by an ingratitude so bad, so dreadful, that \nat last her excellent patroness was obliged to separate her from \nher own young ones, fearful lest her vicious example should \ncontaminate their purity: she has sent her here to be healed, \neven as the Jews of old sent their diseased to the troubled pool \nof Bethesda; and, teachers, superintendent, I beg of you not to \nallow the waters to stagnate round her.”", "uuid" : "C2D48277", "_id" : { "$oid" : "509a3e9efdcc6c0200000018" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[9]/p[52]", "startOffset" : 0, "end" : "/div[1]/div[9]/p[52]", "endOffset" : 612, "_id" : { "$oid" : "509a3e9efdcc6c0200000019" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352285854335 }, "created" : { "$date" : 1352285854335 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509a3f02f7b3810200000004", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "The dropping of the slate was blown out of proportion; she must suffer for a charge that is not true, and must do it for the sole reason that Brocklehurst ordered so.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "“Let her stand half-an-hour longer on that stool, and \nlet no one speak to her during the remainder of the \nday.”", "uuid" : "752A3FC1", "_id" : { "$oid" : "509a3f02f7b3810200000004" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[9]/p[54]", "startOffset" : 0, "end" : "/div[1]/div[9]/p[54]", "endOffset" : 113, "_id" : { "$oid" : "509a3f02f7b3810200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352285954740 }, "created" : { "$date" : 1352285954740 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509a3f90f7b3810200000006", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "Once again, Jane suffers under affliction and is powerless to do anything about it because no one listens.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "He bullied and punished me; not two or \nthree times in the week, nor once or twice in the day, but \ncontinually: every nerve I had feared him, and every morsel of \nflesh in my bones shrank when he came near.", "uuid" : "D640FF42", "_id" : { "$oid" : "509a3f90f7b3810200000006" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]/p[24]", "startOffset" : 81, "end" : "/div[1]/div[3]/p[24]", "endOffset" : 288, "_id" : { "$oid" : "509a3f90f7b3810200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352286096395 }, "created" : { "$date" : 1352286096395 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509a41ebf7b3810200000008", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "The fact that Reed sees this and does nothing about it is horrifying. Here she not only reinforces her own child's rude behavior, but also causes intense psychological pain to Jane.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Mrs. Reed was blind and\ndeaf on the subject", "uuid" : "7254847F", "_id" : { "$oid" : "509a41ebf7b3810200000008" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]/p[24]", "startOffset" : 532, "end" : "/div[1]/div[3]/p[24]", "endOffset" : 575, "_id" : { "$oid" : "509a41ebf7b3810200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352286699188 }, "created" : { "$date" : 1352286699188 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509a4245f7b381020000000a", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "This hurts. This is no way to treat family.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "“Master!  How is he my master?  Am I a \nservant?”\n“No; you are less than a servant, for you do nothing for\nyour keep.  There, sit down, and think over your \nwickedness.”", "uuid" : "A3A1E8BD", "_id" : { "$oid" : "509a4245f7b381020000000a" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]/p[4]", "startOffset" : 0, "end" : "/div[1]/div[4]/p[5]", "endOffset" : 119, "_id" : { "$oid" : "509a4245f7b381020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352286789166 }, "created" : { "$date" : 1352286789166 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509a432af7b381020000000c", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "Now in the Bible, there are few mentions of fairies and geniis, but there is \"bright variety\" in the books that she picks that she likes.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "I saw nothing about fairies, nothing \nabout genii; no bright variety seemed spread over the \nclosely-printed pages", "uuid" : "EC99A372", "_id" : { "$oid" : "509a432af7b381020000000c" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[7]/p[70]", "startOffset" : 140, "end" : "/div[1]/div[7]/p[70]", "endOffset" : 255, "_id" : { "$oid" : "509a432af7b381020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352287018623 }, "created" : { "$date" : 1352287018623 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b0fca73cd330200000008", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "Questions her present predicament", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Why \nwas I always suffering, always browbeaten, always accused, for \never condemned?  Why could I never please?  Why was it \nuseless to try to win any one’s favour?", "uuid" : "1F15712A", "_id" : { "$oid" : "509b0fca73cd330200000008" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]/p[25]", "startOffset" : 202, "end" : "/div[1]/div[4]/p[25]", "endOffset" : 366, "_id" : { "$oid" : "509b0fca73cd330200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352339402051 }, "created" : { "$date" : 1352339402051 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b100b73cd33020000000a", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "Job must have said something similar", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "I dared commit no \nfault: I strove to fulfil every duty; and I was termed naughty \nand tiresome, sullen and sneaking, from morning to noon, and from\nnoon to night.", "uuid" : "92A69B99", "_id" : { "$oid" : "509b100b73cd33020000000a" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]/p[25]", "startOffset" : 1159, "end" : "/div[1]/div[4]/p[25]", "endOffset" : 1323, "_id" : { "$oid" : "509b100b73cd33020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352339467447 }, "created" : { "$date" : 1352339467447 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b105b73cd33020000000c", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "Is this why she doesn't love psalms", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "I could not answer\nthe ceaseless inward question—why I thus suffered; \nnow, at the distance of—I will not say how many years, I \nsee it clearly.", "uuid" : "BB4C2BCD", "_id" : { "$oid" : "509b105b73cd33020000000c" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]/p[28]", "startOffset" : 204, "end" : "/div[1]/div[4]/p[28]", "endOffset" : 350, "_id" : { "$oid" : "509b105b73cd33020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352339547160 }, "created" : { "$date" : 1352339547160 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b10cb73cd33020000000e", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "Job 2", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "“Unjust!—unjust!” said my reason, forced by \nthe agonising stimulus into precocious though transitory power: \nand Resolve, equally wrought up, instigated some strange \nexpedient to achieve escape from insupportable \noppression—as running away, or, if that could not be \neffected, never eating or drinking more, and letting myself \ndie.", "uuid" : "8A0D58AC", "_id" : { "$oid" : "509b10cb73cd33020000000e" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[4]/p[27]", "startOffset" : 0, "end" : "/div[1]/div[4]/p[27]", "endOffset" : 335, "_id" : { "$oid" : "509b10cb73cd33020000000f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352339659521 }, "created" : { "$date" : 1352339659521 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b172273cd330200000010", "user" : "ccoop@mit.edu", "username" : "Courage C.", "text" : "Marrying Eileen", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "They had a different father and\n\nmother. They were Eileen's father and mother. When they were grown up\n\nhe was going to marry Eileen. He hid under the table. His mother said:\n\n\n\n\n\n\n\n—O, Stephen will apologize.", "uuid" : "137FBAFE", "_id" : { "$oid" : "509b172273cd330200000010" }, "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[12]", "startOffset" : 35, "end" : "/div[1]/p[13]", "endOffset" : 29, "_id" : { "$oid" : "509b172273cd330200000011" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352341282886 }, "created" : { "$date" : 1352341282886 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b1cf20034660200000002", "user" : "ccoop@mit.edu", "username" : "Courage C.", "text" : "fall", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "He would fade into something impalpable under her eyes and then in a\n\nmoment he would be transfigured. Weakness and timidity and inexperience\n\nwould fall from him in that magic moment.", "uuid" : "C06CB90D", "_id" : { "$oid" : "509b1cf20034660200000002" }, "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[619]", "startOffset" : 2, "end" : "/div[1]/p[619]", "endOffset" : 186, "_id" : { "$oid" : "509b1cf20034660200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352342770065 }, "created" : { "$date" : 1352342770065 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b1eac73cd330200000012", "user" : "ccoop@mit.edu", "username" : "Courage C.", "text" : "Dublin", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "Dublin was a new and complex sensation.", "uuid" : "509307DF", "_id" : { "$oid" : "509b1eac73cd330200000012" }, "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[623]", "startOffset" : 2, "end" : "/div[1]/p[623]", "endOffset" : 41, "_id" : { "$oid" : "509b1eac73cd330200000013" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352343212924 }, "created" : { "$date" : 1352343212924 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b2cc273cd330200000014", "user" : "ccoop@mit.edu", "username" : "Courage C.", "text" : "penitence", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "Every morning he hallowed himself anew in the presence of some holy\n\nimage or mystery. His day began with an heroic offering of its every\n\nmoment of thought or action for the intentions of the sovereign pontiff\n\nand with an early mass. The raw morning air whetted his resolute piety;\n\nand often as he knelt among the few worshippers at the side-altar,\n\nfollowing with his interleaved prayer-book the murmur of the priest, he\n\nglanced up for an instant towards the vested figure standing in the\n\ngloom between the two candles, which were the old and the new\n\ntestaments, and imagined that he was kneeling at mass in the catacombs.\n\n\n\n\n\n\n\nHis daily life was laid out in devotional areas. By means of\n\nejaculations and prayers he stored up ungrudgingly for the souls in\n\npurgatory centuries of days and quarantines and years; yet the\n\nspiritual triumph which he felt in achieving with ease so many fabulous\n\nages of canonical penances did not wholly reward his zeal of prayer,\n\nsince he could never know how much temporal punishment he had remitted\n\nby way of suffrage for the agonizing souls; and fearful lest in the\n\nmidst of the purgatorial fire, which differed from the infernal only in\n\nthat it was not everlasting, his penance might avail no more than a\n\ndrop of moisture, he drove his soul daily through an increasing circle\n\nof works of supererogation.", "uuid" : "94C8A779", "_id" : { "$oid" : "509b2cc273cd330200000014" }, "permissions" : { "delete" : [ "ccoop@mit.edu" ], "update" : [ "ccoop@mit.edu" ], "admin" : [ "ccoop@mit.edu" ], "read" : [ "ccoop@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1097]", "startOffset" : 2, "end" : "/div[1]/p[1098]", "endOffset" : 722, "_id" : { "$oid" : "509b2cc273cd330200000015" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352346818139 }, "created" : { "$date" : 1352346818139 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b45b073cd330200000016", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Emphasis on youth and age difference.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "young lady", "uuid" : "65D49C65", "_id" : { "$oid" : "509b45b073cd330200000016" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[17]/p[14]", "startOffset" : 642, "end" : "/div[1]/div[17]/p[14]", "endOffset" : 652, "_id" : { "$oid" : "509b45b073cd330200000017" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352353200371 }, "created" : { "$date" : 1352353200371 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b464473cd330200000018", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "most ladies would not?", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "passing strange that you should listen to me \nquietly", "uuid" : "2A13E4DE", "_id" : { "$oid" : "509b464473cd330200000018" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[17]/p[14]", "startOffset" : 654, "end" : "/div[1]/div[17]/p[14]", "endOffset" : 707, "_id" : { "$oid" : "509b464473cd330200000019" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352353348951 }, "created" : { "$date" : 1352353348951 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b464d0034660200000004", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Shakespeare reference.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "young lady; passing strange that you should listen to me \nquietly", "uuid" : "CD4A583B", "_id" : { "$oid" : "509b464d0034660200000004" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[17]/p[14]", "startOffset" : 642, "end" : "/div[1]/div[17]/p[14]", "endOffset" : 707, "_id" : { "$oid" : "509b464d0034660200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352353357639 }, "created" : { "$date" : 1352353357639 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b562f0034660200000006", "user" : "wrutter@mit.edu", "username" : "William R.", "text" : "Rochester rejoices in the sound of Janes voice--and loves the fact that she talks to him.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "All the melody on earth is concentrated in my Jane’s tongue\nto my ear (I am glad it is not naturally a silent one)", "uuid" : "AE8591E6", "_id" : { "$oid" : "509b562f0034660200000006" }, "permissions" : { "delete" : [ "wrutter@mit.edu" ], "update" : [ "wrutter@mit.edu" ], "admin" : [ "wrutter@mit.edu" ], "read" : [ "wrutter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[39]/p[114]", "startOffset" : 229, "end" : "/div[1]/div[39]/p[114]", "endOffset" : 343, "_id" : { "$oid" : "509b562f0034660200000007" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352357423348 }, "created" : { "$date" : 1352357423348 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "509b5fdf73cd33020000001a" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1352359903039 }, "groups" : [ "21L.003" ], "id" : "509b5fdf73cd33020000001a", "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "quote" : "This book I had again and again perused with \ndelight.", "ranges" : [ { "start" : "/div[1]/div[5]/p[21]", "startOffset" : 946, "end" : "/div[1]/div[5]/p[21]", "endOffset" : 1000, "_id" : { "$oid" : "509b5fdf73cd33020000001b" } } ], "tags" : [], "text" : "maybe jane just reads it every once in awhile when she feels like being entertained since she thinks of books as \"transient\" stimuli", "updated" : { "$date" : 1352359945606 }, "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "user" : "moverlin@mit.edu", "username" : "Matt O.", "uuid" : "BAF92208" } -{ "id" : "509b607e73cd33020000001c", "user" : "moverlin@mit.edu", "username" : "Matt O.", "text" : "a little interesting she would respect the book enough to call it a narrative of facts- but it maybe seems like she just picks it up every now and then for her \"delight\"/temporary enjoyment", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "I considered it a narrative of facts", "uuid" : "57F6DA42", "_id" : { "$oid" : "509b607e73cd33020000001c" }, "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[21]", "startOffset" : 1002, "end" : "/div[1]/div[5]/p[21]", "endOffset" : 1038, "_id" : { "$oid" : "509b607e73cd33020000001d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352360062950 }, "created" : { "$date" : 1352360062950 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b614a73cd33020000001e", "user" : "moverlin@mit.edu", "username" : "Matt O.", "text" : "Jane seems to be a little practical. She seems to be more interested in Gulliver's Travels more because she hasn't convinced herself it's completely untrue.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "had at length made up my \nmind to the sad truth, that they were all gone out of England to \nsome savage country where the woods were wilder and thicker", "uuid" : "88C77103", "_id" : { "$oid" : "509b614a73cd33020000001e" }, "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[21]", "startOffset" : 1276, "end" : "/div[1]/div[5]/p[21]", "endOffset" : 1427, "_id" : { "$oid" : "509b614a73cd33020000001f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352360266660 }, "created" : { "$date" : 1352360266660 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b623f73cd330200000020", "user" : "moverlin@mit.edu", "username" : "Matt O.", "text" : "This might be another sign of Jane growing up. She seems to be becoming more practical. That is, she seems to be more interested in Gulliver's travels as opposed to other books because she's convinced the book has more truth to it than some of the fairy tales she has read. ", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "I \ndoubted not that I might one day, by taking a long voyage, see \nwith my own eyes the little fields, houses, and trees, the \ndiminutive people, the tiny cows, sheep, and birds of the one \nrealm", "uuid" : "189C3CA0", "_id" : { "$oid" : "509b623f73cd330200000020" }, "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[21]", "startOffset" : 1551, "end" : "/div[1]/div[5]/p[21]", "endOffset" : 1746, "_id" : { "$oid" : "509b623f73cd330200000021" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352360511440 }, "created" : { "$date" : 1352360511440 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b6a470034660200000008", "user" : "moverlin@mit.edu", "username" : "Matt O.", "text" : "Jane is no longer interested in the book- her loss of interest is kind of given by the fact that it's right next to the untasted tart which she also does not like. ", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "I \nclosed the book, which I dared no longer peruse, and put it on \nthe table, beside the untasted tart.", "uuid" : "5CB99608", "_id" : { "$oid" : "509b6a470034660200000008" }, "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[21]", "startOffset" : 2216, "end" : "/div[1]/div[5]/p[21]", "endOffset" : 2319, "_id" : { "$oid" : "509b6a470034660200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352362567316 }, "created" : { "$date" : 1352362567316 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b6ce3003466020000000a", "user" : "moverlin@mit.edu", "username" : "Matt O.", "text" : "It looks like Jane is growing up because she doesn't get very excited about the book anymore.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "all was eerie and dreary", "uuid" : "4B3F9A2E", "_id" : { "$oid" : "509b6ce3003466020000000a" }, "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[5]/p[21]", "startOffset" : 2045, "end" : "/div[1]/div[5]/p[21]", "endOffset" : 2069, "_id" : { "$oid" : "509b6ce3003466020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352363235922 }, "created" : { "$date" : 1352363235922 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b6e7f003466020000000c", "user" : "moverlin@mit.edu", "username" : "Matt O.", "text" : "Jane is having some kind of a minor flashback. She is an adult now, but she was young when she first met Mr. Brocklehurst. We see a reference to Gulliver's Travels earlier when she was a child and again when she is an adult. Similarly, the book Gulliver's Travels is enjoyed by children and adults.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "as it did on the morning \nI was first introduced to Mr. Brocklehurst", "uuid" : "CCA7D541", "_id" : { "$oid" : "509b6e7f003466020000000c" }, "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[23]/p[116]", "startOffset" : 98, "end" : "/div[1]/div[23]/p[116]", "endOffset" : 166, "_id" : { "$oid" : "509b6e7f003466020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352363647879 }, "created" : { "$date" : 1352363647879 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b6f7b73cd330200000022", "user" : "moverlin@mit.edu", "username" : "Matt O.", "text" : "I can't see a lot of significance in this sentence. It looks like it's probably important, though. It looks like Bronte is saying that people change, and the books that we've always enjoyed don't change. I'm not sure if she believes that the books (or something else) are what change people. ", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "The inanimate objects were not changed; \nbut the living things had altered past recognition.", "uuid" : "43F5176E", "_id" : { "$oid" : "509b6f7b73cd330200000022" }, "permissions" : { "delete" : [ "moverlin@mit.edu" ], "update" : [ "moverlin@mit.edu" ], "admin" : [ "moverlin@mit.edu" ], "read" : [ "moverlin@mit.edu" ] }, "tags" : [ "a" ], "ranges" : [ { "start" : "/div[1]/div[23]/p[116]", "startOffset" : 442, "end" : "/div[1]/div[23]/p[116]", "endOffset" : 534, "_id" : { "$oid" : "509b6f7b73cd330200000023" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352363899668 }, "created" : { "$date" : 1352363899668 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b7e6d73cd330200000024", "user" : "qinxuan@mit.edu", "username" : "Qinxuan P.", "text" : "Rochester uses the name of one of the spirits in A Midsummer Night's Dream to call Jane Eyre, suggesting that his love is somewhat capricious.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "Is this my mustard-seed?", "uuid" : "ADB2756E", "_id" : { "$oid" : "509b7e6d73cd330200000024" }, "permissions" : { "delete" : [ "qinxuan@mit.edu" ], "update" : [ "qinxuan@mit.edu" ], "admin" : [ "qinxuan@mit.edu" ], "read" : [ "qinxuan@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[26]/p[10]", "startOffset" : 122, "end" : "/div[1]/div[26]/p[10]", "endOffset" : 146, "_id" : { "$oid" : "509b7e6d73cd330200000025" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352367725917 }, "created" : { "$date" : 1352367725917 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b7e9673cd330200000026", "user" : "qinxuan@mit.edu", "username" : "Qinxuan P.", "text" : "She doesn't like fancy descriptions and simply wants to be herself.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "It is Jane Eyre, sir.", "uuid" : "E682969A", "_id" : { "$oid" : "509b7e9673cd330200000026" }, "permissions" : { "delete" : [ "qinxuan@mit.edu" ], "update" : [ "qinxuan@mit.edu" ], "admin" : [ "qinxuan@mit.edu" ], "read" : [ "qinxuan@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[26]/p[11]", "startOffset" : 1, "end" : "/div[1]/div[26]/p[11]", "endOffset" : 22, "_id" : { "$oid" : "509b7e9673cd330200000027" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352367766354 }, "created" : { "$date" : 1352367766354 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b7eea003466020000000e", "user" : "qinxuan@mit.edu", "username" : "Qinxuan P.", "text" : "Jane Eyre is very far-sighted and cautious of the transientness of male love.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "For a little while you will perhaps be as you are \nnow,—a very little while; and then you will turn cool; and \nthen you will be capricious; and then you will be stern, and I \nshall have much ado to please you: but when you get well used to \nme, you will perhaps like me again,—like me, I say, \nnot love me.  I suppose your love will effervesce in \nsix months, or less.  I have observed in books written by \nmen, that period assigned as the farthest to which a \nhusband’s ardour extends.  Yet, after all, as a friend\nand companion, I hope never to become quite distasteful to my \ndear master.”", "uuid" : "89DC0B3D", "_id" : { "$oid" : "509b7eea003466020000000e" }, "permissions" : { "delete" : [ "qinxuan@mit.edu" ], "update" : [ "qinxuan@mit.edu" ], "admin" : [ "qinxuan@mit.edu" ], "read" : [ "qinxuan@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[26]/p[31]", "startOffset" : 1, "end" : "/div[1]/div[26]/p[31]", "endOffset" : 593, "_id" : { "$oid" : "509b7eea003466020000000f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352367850049 }, "created" : { "$date" : 1352367850049 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b7f460034660200000010", "user" : "qinxuan@mit.edu", "username" : "Qinxuan P.", "text" : "objective analysis of nature of love", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "I felt the truth of these words; and I drew from them the \ncertain inference, that if I were so far to forget myself and all\nthe teaching that had ever been instilled into me, as—under\nany pretext—with any justification—through any \ntemptation—to become the successor of these poor girls, he \nwould one day regard me with the same feeling which now in his \nmind desecrated their memory.  I did not give utterance to \nthis conviction: it was enough to feel it.  I impressed it \non my heart, that it might remain there to serve me as aid in the\ntime of trial.", "uuid" : "7713D324", "_id" : { "$oid" : "509b7f460034660200000010" }, "permissions" : { "delete" : [ "qinxuan@mit.edu" ], "update" : [ "qinxuan@mit.edu" ], "admin" : [ "qinxuan@mit.edu" ], "read" : [ "qinxuan@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[29]/p[96]", "startOffset" : 0, "end" : "/div[1]/div[29]/p[96]", "endOffset" : 557, "_id" : { "$oid" : "509b7f460034660200000011" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352367942235 }, "created" : { "$date" : 1352367942235 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b800f73cd330200000028", "user" : "qinxuan@mit.edu", "username" : "Qinxuan P.", "text" : "more elfish descriptions", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "It seemed as if a linnet had hopped to my foot \nand proposed to bear me on its tiny wing.", "uuid" : "8E4B49DC", "_id" : { "$oid" : "509b800f73cd330200000028" }, "permissions" : { "delete" : [ "qinxuan@mit.edu" ], "update" : [ "qinxuan@mit.edu" ], "admin" : [ "qinxuan@mit.edu" ], "read" : [ "qinxuan@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[29]/p[98]", "startOffset" : 570, "end" : "/div[1]/div[29]/p[98]", "endOffset" : 660, "_id" : { "$oid" : "509b800f73cd330200000029" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352368143305 }, "created" : { "$date" : 1352368143305 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b805c73cd33020000002a", "user" : "qinxuan@mit.edu", "username" : "Qinxuan P.", "text" : "The fact the novels ends with St.John's experience kind of makes him seems heroic.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "", "uuid" : "2677C617", "_id" : { "$oid" : "509b805c73cd33020000002a" }, "permissions" : { "delete" : [ "qinxuan@mit.edu" ], "update" : [ "qinxuan@mit.edu" ], "admin" : [ "qinxuan@mit.edu" ], "read" : [ "qinxuan@mit.edu" ] }, "tags" : [], "ranges" : [], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352368220325 }, "created" : { "$date" : 1352368220325 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b80720034660200000012", "user" : "qinxuan@mit.edu", "username" : "Qinxuan P.", "text" : "The ending makes St.John seem heroic.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "", "uuid" : "11A47ECE", "_id" : { "$oid" : "509b80720034660200000012" }, "permissions" : { "delete" : [ "qinxuan@mit.edu" ], "update" : [ "qinxuan@mit.edu" ], "admin" : [ "qinxuan@mit.edu" ], "read" : [ "qinxuan@mit.edu" ] }, "tags" : [], "ranges" : [], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352368242372 }, "created" : { "$date" : 1352368242372 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509b80b10034660200000013", "user" : "qinxuan@mit.edu", "username" : "Qinxuan P.", "text" : "The ending makes St.John seem heroic.", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "As to St. John Rivers, he left England: he went to \nIndia.  He entered on the path he had marked for himself; he\npursues it still.  A more resolute, indefatigable pioneer \nnever wrought amidst rocks and dangers.  Firm, faithful, and\ndevoted, full of energy, and zeal, and truth, he labours for his \nrace; he clears their painful way to improvement; he hews down \nlike a giant the prejudices of creed and caste that encumber \nit.  He may be stern; he may be exacting; he may be \nambitious yet; but his is the sternness of the warrior \nGreatheart, who guards his pilgrim convoy from the onslaught of \nApollyon.  His is the exaction of the apostle, who speaks \nbut for Christ, when he says—“Whosoever will come \nafter me, let him deny himself, and take up his cross and follow \nme.”  His is the ambition of the high master-spirit, \nwhich aims to fill a place in the first rank of those who are \nredeemed from the earth—who stand without fault before the \nthrone of God, who share the last mighty victories of the Lamb, \nwho are called, and chosen, and faithful.\nSt. John is unmarried: he never will marry now.  Himself \nhas hitherto sufficed to the toil, and the toil draws near its \nclose: his glorious sun hastens to its setting.  The last \nletter I received from him drew from my eyes human tears, and yet\nfilled my heart with divine joy: he anticipated his sure reward, \nhis incorruptible crown.  I know that a stranger’s \nhand will write to me next, to say that the good and faithful \nservant has been called at length into the joy of his Lord. \nAnd why weep for this?  No fear of death will darken St. \nJohn’s last hour: his mind will be unclouded, his heart \nwill be undaunted, his hope will be sure, his faith \nsteadfast.  His own words are a pledge of this—\n“My Master,” he says, “has forewarned \nme.  Daily He announces more distinctly,—‘Surely\nI come quickly!’ and hourly I more eagerly \nrespond,—‘Amen; even so come, Lord \nJesus!’”", "uuid" : "E73D60BA", "_id" : { "$oid" : "509b80b10034660200000013" }, "permissions" : { "delete" : [ "qinxuan@mit.edu" ], "update" : [ "qinxuan@mit.edu" ], "admin" : [ "qinxuan@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[40]/p[22]", "startOffset" : 0, "end" : "/div[1]/div[40]/p[24]", "endOffset" : 176, "_id" : { "$oid" : "509b80b10034660200000014" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352368305282 }, "created" : { "$date" : 1352368305282 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509d45f6894ca90200000002", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "The unlisted epigraph \"And he applies his mind to unknown arts\" conveniently leaves out the rest \"and changes the laws of nature\". Joyce seems to have no problem massaging quotes/ideas/characters from different stories in his comparisons to his own characters and stories", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "Chapter 1", "uuid" : "D46A6FAE", "_id" : { "$oid" : "509d45f6894ca90200000002" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/h3[1]", "startOffset" : 2, "end" : "/div[1]/h3[1]", "endOffset" : 11, "_id" : { "$oid" : "509d45f6894ca90200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352484342215 }, "created" : { "$date" : 1352484342215 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "509d462a894ca90200000004" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1352484394668 }, "groups" : [ "21L.003" ], "id" : "509d462a894ca90200000004", "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "quote" : "if not, the eagles will come and pull out his eyes", "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 6, "end" : "/div[1]/p[15]", "endOffset" : 56, "_id" : { "$oid" : "509d462a894ca90200000005" } } ], "tags" : [], "text" : "Reference to Prometheus, whose eyes are attacked by eagles after he gives man fire. Interesting that the religious Dante uses a Greek myth in analogy", "updated" : { "$date" : 1352484435134 }, "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "user" : "adin@mit.edu", "username" : "Adin S.", "uuid" : "58E56BD8" } -{ "__v" : 0, "_id" : { "$oid" : "509d46a7894ca90200000006" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1352484519371 }, "groups" : [ "21L.003" ], "id" : "509d46a7894ca90200000006", "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "quote" : "His throat ached with a desire to cry aloud, the cry of a hawk or eagle\n\non high, to cry piercingly of his deliverance to the winds. This was\n\nthe call of life to his soul not the dull gross voice of the world of\n\nduties and despair, not the inhuman voice that had called him to the\n\npale service of the altar. An instant of wild flight had delivered him\n\nand the cry of triumph which his lips withheld cleft his brain.", "ranges" : [ { "start" : "/div[1]/p[1198]", "startOffset" : 2, "end" : "/div[1]/p[1198]", "endOffset" : 421, "_id" : { "$oid" : "509d46a7894ca90200000007" } } ], "tags" : [], "text" : "Steven's wish for flight parallels Icarus'. This almost directly references the wish to fly away rather than deal with real life's \"world of duties\". Additionally this is a reference to Steven's desire to leave religion, Ireland, and everything he knows behind him", "updated" : { "$date" : 1352484594373 }, "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "user" : "adin@mit.edu", "username" : "Adin S.", "uuid" : "1242838E" } -{ "id" : "509d47481480d70200000002", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "Steven is proud to be in any way connected to the great artist Daedalus", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "Their banter was not new to him and now it flattered his mild proud\n\nsovereignty.", "uuid" : "425D5DBE", "_id" : { "$oid" : "509d47481480d70200000002" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1190]", "startOffset" : 2, "end" : "/div[1]/p[1190]", "endOffset" : 83, "_id" : { "$oid" : "509d47481480d70200000003" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352484680709 }, "created" : { "$date" : 1352484680709 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509d4759894ca90200000008", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "Prophecy of who Daedalus/Icarus", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "Now, as never before, his strange name seemed to him a\n\nprophecy.", "uuid" : "9D7418EE", "_id" : { "$oid" : "509d4759894ca90200000008" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1190]", "startOffset" : 84, "end" : "/div[1]/p[1190]", "endOffset" : 149, "_id" : { "$oid" : "509d4759894ca90200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352484697692 }, "created" : { "$date" : 1352484697692 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509d478b1480d70200000004", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "When Steven hear Daedalus he thinks of flight. But of Daedalus or Icarus?", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "Now, at the name of the fabulous\n\nartificer, he seemed to hear the noise of dim waves and to see a winged\n\nform flying above the waves and slowly climbing the air", "uuid" : "D70FA5A8", "_id" : { "$oid" : "509d478b1480d70200000004" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1190]", "startOffset" : 387, "end" : "/div[1]/p[1190]", "endOffset" : 549, "_id" : { "$oid" : "509d478b1480d70200000005" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352484747463 }, "created" : { "$date" : 1352484747463 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509d47a1894ca9020000000a", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "It looks like Icarus is the winner here", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "hawk-like man flying sunward above the sea, a\n\nprophecy of the end he had been born to serve", "uuid" : "9D184BD1", "_id" : { "$oid" : "509d47a1894ca9020000000a" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1190]", "startOffset" : 659, "end" : "/div[1]/p[1190]", "endOffset" : 753, "_id" : { "$oid" : "509d47a1894ca9020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352484769183 }, "created" : { "$date" : 1352484769183 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509d480b894ca9020000000c", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "The symbol of the artist is the flying away leaving all earthly thoughts (like staying alive, I guess?) behind. Interesting how he thinks Icarus, who never made anything useful or otherwise, is the symbol of the artist", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "a symbol of the artist\n\nforging anew in his workshop", "uuid" : "BBE80759", "_id" : { "$oid" : "509d480b894ca9020000000c" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1190]", "startOffset" : 820, "end" : "/div[1]/p[1190]", "endOffset" : 873, "_id" : { "$oid" : "509d480b894ca9020000000d" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352484875631 }, "created" : { "$date" : 1352484875631 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509d488f894ca9020000000e", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "Steven Explicitly saying he wants to \"fly\" away from nationality, language, religion. Yep, running away is a great solution and Icarus a fantastic role model.", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "When the soul of a man is born in this country there are nets\n\nflung at it to hold it back from flight. You talk to me of nationality,\n\nlanguage, religion. I shall try to fly by those nets.", "uuid" : "1882A735", "_id" : { "$oid" : "509d488f894ca9020000000e" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1532]", "startOffset" : 151, "end" : "/div[1]/p[1532]", "endOffset" : 341, "_id" : { "$oid" : "509d488f894ca9020000000f" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352485007061 }, "created" : { "$date" : 1352485007061 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509d49b3894ca90200000010", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "An interesting synthesis of words, very important to Steven, combined with flight, a desire of Steven in that it represents leaving", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "A phrase of Cornelius Agrippa flew through his mind", "uuid" : "DEBFE709", "_id" : { "$oid" : "509d49b3894ca90200000010" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1710]", "startOffset" : 147, "end" : "/div[1]/p[1710]", "endOffset" : 199, "_id" : { "$oid" : "509d49b3894ca90200000011" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352485299888 }, "created" : { "$date" : 1352485299888 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509d4a24894ca90200000012", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "Interesting that he starts with Daedalus and Icarus a story related to his name and hence a hook into the Greek world. But it doesn't stop there he references the \"god of writers\", which is at least somewhat heretical", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "hawk-like man whose\n\nname he bore soaring out of his captivity on osier-woven wings, of\n\nThoth, the god of writers, writing with a reed upon a tablet and\n\nbearing on his narrow ibis head the cusped moon.", "uuid" : "80642FEA", "_id" : { "$oid" : "509d4a24894ca90200000012" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1711]", "startOffset" : 328, "end" : "/div[1]/p[1711]", "endOffset" : 532, "_id" : { "$oid" : "509d4a24894ca90200000013" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352485412654 }, "created" : { "$date" : 1352485412654 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509d4b191480d70200000008", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "Interesting contradiction of Steven, since he wishes the powers of Daedalus but applied to liberal arts instead of useful arts", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "One moment now, Mr Dedalus, and you will see. There is an art in\n\nlighting a fire. We have the liberal arts and we have the useful arts.\n\nThis is one of the useful arts.", "uuid" : "501AA9C1", "_id" : { "$oid" : "509d4b191480d70200000008" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1290]", "startOffset" : 3, "end" : "/div[1]/p[1290]", "endOffset" : 172, "_id" : { "$oid" : "509d4b191480d70200000009" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352485657629 }, "created" : { "$date" : 1352485657629 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509d4b3b1480d7020000000a", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "I can't do the useful thing -> you must be an artist. Amusing.", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "I am sure I could not light a fire.\n\n\n\n\n\n\n\n—You are an artist, are you not, Mr Dedalus?", "uuid" : "09CBABD9", "_id" : { "$oid" : "509d4b3b1480d7020000000a" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1295]", "startOffset" : 3, "end" : "/div[1]/p[1296]", "endOffset" : 46, "_id" : { "$oid" : "509d4b3b1480d7020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352485691519 }, "created" : { "$date" : 1352485691519 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "509d4be51480d7020000000c" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1352485861424 }, "groups" : [ "21L.003" ], "id" : "509d4be51480d7020000000c", "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "quote" : "Aquinas, answered Stephen, says PULCRA SUNT QUAE VISA PLACENT.", "ranges" : [ { "start" : "/div[1]/p[1299]", "startOffset" : 3, "end" : "/div[1]/p[1299]", "endOffset" : 65, "_id" : { "$oid" : "509d4be51480d7020000000d" } } ], "tags" : [], "text" : "This is the beginning of a whole lot of philosophy of aesthetics. Interesting that this book is published only 30 years after \"The Picture of Dorian Gray\" which also has a VERY heavy use of the philosophy of aesthetics and an interesting view of portraits. Additionally, since all sorts of philosophy used to be combined it is as if the the natural philosophy of Daedalus is being turned into the aesthetic philosophy of Steven", "updated" : { "$date" : 1352485932869 }, "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "user" : "adin@mit.edu", "username" : "Adin S.", "uuid" : "0DFA2866" } -{ "id" : "509d4c9a894ca90200000014", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "Asks for the help of Daedalus and his parents/past experiences for help. All this despite his total rejection of his past and his skill set being completely independent from Daedalus'", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "Old father, old artificer, stand me now and ever in good\n\nstead.", "uuid" : "ECD3F21E", "_id" : { "$oid" : "509d4c9a894ca90200000014" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2087]", "startOffset" : 12, "end" : "/div[1]/p[2087]", "endOffset" : 76, "_id" : { "$oid" : "509d4c9a894ca90200000015" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352486042383 }, "created" : { "$date" : 1352486042383 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509d4f00894ca90200000016", "user" : "adin@mit.edu", "username" : "Adin S.", "text" : "Steven is aware of his last name, Dedalus, and the associated mythology.", "uri" : "http://annotationstudio.mit.edu/documents/a-portrait-of-the-artist-as-a-young-man", "quote" : "The great men in the history had names like that and nobody\n\nmade fun of them", "uuid" : "0A7AB9AC", "_id" : { "$oid" : "509d4f00894ca90200000016" }, "permissions" : { "delete" : [ "adin@mit.edu" ], "update" : [ "adin@mit.edu" ], "admin" : [ "adin@mit.edu" ], "read" : [ "adin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[540]", "startOffset" : 441, "end" : "/div[1]/p[540]", "endOffset" : 518, "_id" : { "$oid" : "509d4f00894ca90200000017" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1352486656493 }, "created" : { "$date" : 1352486656493 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509d5200894ca90200000018", "user" : "jfolsom@mit.edu", "username" : "Jamie F.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "quote" : "", "uuid" : "5CF26C7E", "_id" : { "$oid" : "509d5200894ca90200000018" }, "permissions" : { "delete" : [ "jfolsom@mit.edu" ], "update" : [ "jfolsom@mit.edu" ], "admin" : [ "jfolsom@mit.edu" ], "read" : [ "jfolsom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 50, "end" : "/div[1]/p[2]/em[1]", "endOffset" : 0, "_id" : { "$oid" : "509d5200894ca90200000019" } } ], "groups" : [ "21L.448J", "21L.003", "21L.000J", "21F-414", "Testing" ], "updated" : { "$date" : 1352487424299 }, "created" : { "$date" : 1352487424299 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "509ecdfb23b58f0200000002" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1352584699571 }, "groups" : [ "21L.000J" ], "id" : "509ecdfb23b58f0200000002", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "quote" : "dark satyr in a mask, holding his foot on the\nprostrate neck of a writhing figure, likewise\nmasked.", "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 1059, "end" : "/div[1]/p[11]", "endOffset" : 1158, "_id" : { "$oid" : "509ecdfb23b58f0200000003" } } ], "tags" : [ "symbolism" ], "text" : "a figure holding power over another, both of whom are masked - who holds the power really?", "updated" : { "$date" : 1352584824479 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "uuid" : "0CC5448E" } -{ "__v" : 0, "_id" : { "$oid" : "509ecf1a23b58f0200000004" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1352584986407 }, "groups" : [ "21L.000J" ], "id" : "509ecf1a23b58f0200000004", "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "quote" : "either to protect\nit while undergoing a re-furbishing, or else\ndecently to hide its decay", "ranges" : [ { "start" : "/div[1]/p[12]", "startOffset" : 122, "end" : "/div[1]/p[12]", "endOffset" : 211, "_id" : { "$oid" : "509ecf1a23b58f0200000005" } } ], "tags" : [ "Delano" ], "text" : "Delano's trusting nature is reflected in his thoughts. He does not suspect foul play. Introduced by Melville to reinforce the idea that Delano is trusting.", "updated" : { "$date" : 1352600237808 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "uuid" : "8893793D" } -{ "id" : "509ecfb8d3ef590200000002", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "\"mourning\" weeds and \"hearse-like\" roll? in the description of the ship itself, Melville is giving us reason to suspect something is amiss.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "like mourning\nweeds, dark festoons of sea-grass slimily swept\nto and fro over the name, with every hearse-like\nroll of the hull.", "uuid" : "23781976", "_id" : { "$oid" : "509ecfb8d3ef590200000002" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[12]", "startOffset" : 595, "end" : "/div[1]/p[12]", "endOffset" : 724, "_id" : { "$oid" : "509ecfb8d3ef590200000003" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352585144569 }, "created" : { "$date" : 1352585144569 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509ed33ed3ef590200000004", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "Again the reference to death", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "gray-headed\nbag-pipers playing a funeral march.", "uuid" : "BEBEDE7B", "_id" : { "$oid" : "509ed33ed3ef590200000004" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "Symbolism" ], "ranges" : [ { "start" : "/div[1]/p[17]", "startOffset" : 808, "end" : "/div[1]/p[17]", "endOffset" : 855, "_id" : { "$oid" : "509ed33ed3ef590200000005" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352586046621 }, "created" : { "$date" : 1352586046621 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "509ed41d23b58f0200000008" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1352586269273 }, "groups" : [ "21L.000J" ], "id" : "509ed41d23b58f0200000008", "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "quote" : "uppermost and central of which was\na dark satyr in a mask, holding his foot on the\nprostrate neck of a writhing figure, likewise\nmasked.", "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 1021, "end" : "/div[1]/p[11]", "endOffset" : 1158, "_id" : { "$oid" : "509ed41d23b58f0200000009" } } ], "tags" : [], "text" : "Who is the Oppressor and who is the Oppressed? Not there in Delano,", "updated" : { "$date" : 1352587264770 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "uuid" : "F3C81014" } -{ "id" : "509ed728d3ef590200000006", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "Giving the illusion of being completely under control", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "An iron collar was about his neck,\nfrom which depended a chain, thrice wound\nround his body; the terminating links padlocked\ntogether at a broad band of iron, his girdle.", "uuid" : "A7B66335", "_id" : { "$oid" : "509ed728d3ef590200000006" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "Symbolism" ], "ranges" : [ { "start" : "/div[1]/p[85]", "startOffset" : 359, "end" : "/div[1]/p[85]", "endOffset" : 529, "_id" : { "$oid" : "509ed728d3ef590200000007" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352587048369 }, "created" : { "$date" : 1352587048369 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509ed777d3ef590200000008", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "Illusion of master and slave", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "The slave\nthere carries the padlock, but master here\ncarries the key.", "uuid" : "B968C56C", "_id" : { "$oid" : "509ed777d3ef590200000008" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "Symbolism" ], "ranges" : [ { "start" : "/div[1]/p[112]", "startOffset" : 121, "end" : "/div[1]/p[112]", "endOffset" : 190, "_id" : { "$oid" : "509ed777d3ef590200000009" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352587127865 }, "created" : { "$date" : 1352587127865 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509ed81923b58f020000000a", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Again a detail not from Delano.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "\"Seguid vuestro jefe\" (follow\nyour leader)", "uuid" : "B9699AFB", "_id" : { "$oid" : "509ed81923b58f020000000a" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[12]", "startOffset" : 353, "end" : "/div[1]/p[12]", "endOffset" : 395, "_id" : { "$oid" : "509ed81923b58f020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352587289017 }, "created" : { "$date" : 1352587289017 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509ed832d3ef59020000000a", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "2 out of 4 are plays", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "First, the affair of the Spanish lad assailed\nwith a knife by the slave boy; an act winked\nat by Don Benito. Second, the tyranny in\nDon Benito's treatment of Atufal, the black;\nas if a child should lead a bull of the Nile by\nthe ring in his nose. Third, the trampling of\nthe sailor by the two negroes; a piece of insolence\npassed over without so much as a reprimand.\nFourth, the cringing submission to\ntheir master, of all the ship's underlings, mostly\nblacks; as if by the least inadvertence\nthey feared to draw down his despotic displeasure.", "uuid" : "15D43ABF", "_id" : { "$oid" : "509ed832d3ef59020000000a" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[215]", "startOffset" : 0, "end" : "/div[1]/p[215]", "endOffset" : 543, "_id" : { "$oid" : "509ed832d3ef59020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352587314744 }, "created" : { "$date" : 1352587314744 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509ed8f2d3ef59020000000c", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "Don Benito is to sit in this, alluding to the torture he is put under", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "inquisitors' racks", "uuid" : "78967522", "_id" : { "$oid" : "509ed8f2d3ef59020000000c" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "Symbolism" ], "ranges" : [ { "start" : "/div[1]/p[244]", "startOffset" : 531, "end" : "/div[1]/p[244]", "endOffset" : 549, "_id" : { "$oid" : "509ed8f2d3ef59020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352587506870 }, "created" : { "$date" : 1352587506870 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509ed91423b58f020000000c", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "further exemplifies the previous annotation regarding torture", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "grotesque engine\nof torment", "uuid" : "263EA7C8", "_id" : { "$oid" : "509ed91423b58f020000000c" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "Symbolism" ], "ranges" : [ { "start" : "/div[1]/p[244]", "startOffset" : 678, "end" : "/div[1]/p[244]", "endOffset" : 705, "_id" : { "$oid" : "509ed91423b58f020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352587540308 }, "created" : { "$date" : 1352587540308 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509ed92323b58f020000000e", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Indeed you do. True enough, else you would be six feet (make that six miles, or whatever the depth of the sea be) under.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "\"But it is Babo here to whom, under God, I\nowe not only my own preservation, but likewise\nto him, chiefly, the merit is due, of pacifying\nhis more ignorant brethren, when at intervals\ntempted to murmurings.\"", "uuid" : "09DAFE0C", "_id" : { "$oid" : "509ed92323b58f020000000e" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[47]", "startOffset" : 0, "end" : "/div[1]/p[47]", "endOffset" : 207, "_id" : { "$oid" : "509ed92323b58f020000000f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352587555708 }, "created" : { "$date" : 1352587555708 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509ed991d3ef59020000000e", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "The scene gives Delano a feeling that Babo holds power of Benito", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "that in the black he saw a headsman, and in\nthe white a man at the block", "uuid" : "82F1B5BC", "_id" : { "$oid" : "509ed991d3ef59020000000e" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "Symbolism" ], "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 789, "end" : "/div[1]/p[258]", "endOffset" : 862, "_id" : { "$oid" : "509ed991d3ef59020000000f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352587665720 }, "created" : { "$date" : 1352587665720 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509ed9af23b58f0200000010", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "You'd be surprised to know the full story.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "slave\nI cannot call him", "uuid" : "4158BAA0", "_id" : { "$oid" : "509ed9af23b58f0200000010" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[49]", "startOffset" : 80, "end" : "/div[1]/p[49]", "endOffset" : 103, "_id" : { "$oid" : "509ed9af23b58f0200000011" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352587695415 }, "created" : { "$date" : 1352587695415 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509eda7fd3ef590200000010", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "In this scene, Benito speaks little. Babo answers for him in more than one occasion. Feels like Babo is in power.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "\"Now, master,\" he said, readjusting the\nflag, and pressing the head gently further back\ninto the crotch of the chair; \"now, master,\"\nand the steel glanced nigh the throat.\n\nAgain Don Benito faintly shuddered.\n\n\"You must not shake so, master. See, Don\nAmasa, master always shakes when I shave\nhim. And yet master knows I never yet have\ndrawn blood, though it's true, if master will\nshake so, I may some of these times. Now\nmaster,\" he continued. \"And now, Don Amasa,\nplease go on with your talk about the gale,\nand all that; master can hear, and, between\ntimes, master can answer.\"", "uuid" : "38830294", "_id" : { "$oid" : "509eda7fd3ef590200000010" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[261]", "startOffset" : 0, "end" : "/div[1]/p[263]", "endOffset" : 370, "_id" : { "$oid" : "509eda7fd3ef590200000011" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352587903234 }, "created" : { "$date" : 1352587903234 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509edcc023b58f0200000012", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Gothic. Delano's account does not say anything about a skeleton.The effect is admittedly great. ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "the beak, suddenly revealing, as the\nbleached hull swung round towards the open\nocean, death for the figure-head, in a human\nskeleton; chalky comment on the chalked\nwords below, \"Follow your leader.\"", "uuid" : "486BFD11", "_id" : { "$oid" : "509edcc023b58f0200000012" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[371]", "startOffset" : 233, "end" : "/div[1]/p[371]", "endOffset" : 432, "_id" : { "$oid" : "509edcc023b58f0200000013" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352588480213 }, "created" : { "$date" : 1352588480213 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509edcd4d3ef590200000012", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "The emotional Benito Cereno.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Don Benito, covering his face,\nwailed out: \"'Tis he, Aranda! my murdered,\nunburied friend!", "uuid" : "869DC71E", "_id" : { "$oid" : "509edcd4d3ef590200000012" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[372]", "startOffset" : 14, "end" : "/div[1]/p[372]", "endOffset" : 104, "_id" : { "$oid" : "509edcd4d3ef590200000013" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352588500456 }, "created" : { "$date" : 1352588500456 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509edcf2d3ef590200000014", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "game over.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "who made\nno resistance", "uuid" : "36D44C15", "_id" : { "$oid" : "509edcf2d3ef590200000014" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[373]", "startOffset" : 77, "end" : "/div[1]/p[373]", "endOffset" : 99, "_id" : { "$oid" : "509edcf2d3ef590200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352588530051 }, "created" : { "$date" : 1352588530051 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509edd7b23b58f0200000014", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "A bit different from the Babo mentioned in Delano. This one apparently knows Spanish culture, and perhaps more importantly a psyche.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "And a small\nnegro of Senegal, but some years among the Spaniards, aged\n[pg 250]\n\nabout thirty, which negro's name was Babo", "uuid" : "090DA3FC", "_id" : { "$oid" : "509edd7b23b58f0200000014" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[4]", "startOffset" : 1076, "end" : "/div[1]/blockquote[1]/p[4]", "endOffset" : 1198, "_id" : { "$oid" : "509edd7b23b58f0200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352588667415 }, "created" : { "$date" : 1352588667415 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509ede24d3ef590200000016", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Delano mentions multiple. Yet here there are only two ring leaders.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Babo and Atufal", "uuid" : "70FC1348", "_id" : { "$oid" : "509ede24d3ef590200000016" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[6]", "startOffset" : 4266, "end" : "/div[1]/blockquote[1]/p[6]", "endOffset" : 4281, "_id" : { "$oid" : "509ede24d3ef590200000017" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352588836864 }, "created" : { "$date" : 1352588836864 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509ede5ed3ef590200000018", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Same except Mure is replaced by Babo.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "that\neight days after parting from the coast of Nasca, the deponent\nbeing on the watch a little after day-break, and soon\nafter the negroes had their meeting, the negro Babo came to\nthe place where the deponent was, and told him that", "uuid" : "39667399", "_id" : { "$oid" : "509ede5ed3ef590200000018" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[6]", "startOffset" : 4466, "end" : "/div[1]/blockquote[1]/p[6]", "endOffset" : 4700, "_id" : { "$oid" : "509ede5ed3ef590200000019" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352588894019 }, "created" : { "$date" : 1352588894019 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509ede7ad3ef59020000001a", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "no comrades. Now he is the alpha and the omega.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "he", "uuid" : "1EFDE5BC", "_id" : { "$oid" : "509ede7ad3ef59020000001a" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[6]", "startOffset" : 4701, "end" : "/div[1]/blockquote[1]/p[6]", "endOffset" : 4703, "_id" : { "$oid" : "509ede7ad3ef59020000001b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352588922925 }, "created" : { "$date" : 1352588922925 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509ede97d3ef59020000001c", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "same", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "had\ndetermined to kill his master, Don Alexandro Aranda", "uuid" : "26D15677", "_id" : { "$oid" : "509ede97d3ef59020000001c" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[6]", "startOffset" : 4704, "end" : "/div[1]/blockquote[1]/p[6]", "endOffset" : 4759, "_id" : { "$oid" : "509ede97d3ef59020000001d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352588951545 }, "created" : { "$date" : 1352588951545 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509edee0d3ef59020000001e", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Emphasis on he. Delano's version says \"they\"", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "he and his companions", "uuid" : "6CA02838", "_id" : { "$oid" : "509edee0d3ef59020000001e" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[6]", "startOffset" : 4774, "end" : "/div[1]/blockquote[1]/p[6]", "endOffset" : 4795, "_id" : { "$oid" : "509edee0d3ef59020000001f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352589024307 }, "created" : { "$date" : 1352589024307 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509edf0623b58f0200000016", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "basically same as Delano.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "could not otherwise be sure\nof their liberty,", "uuid" : "21885735", "_id" : { "$oid" : "509edf0623b58f0200000016" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[6]", "startOffset" : 4796, "end" : "/div[1]/blockquote[1]/p[6]", "endOffset" : 4841, "_id" : { "$oid" : "509edf0623b58f0200000017" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352589062980 }, "created" : { "$date" : 1352589062980 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509edf57d3ef590200000020", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "The secondary (although I suspect de-facto Primary) motive is new. Delano did not have this.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "both", "uuid" : "DAE332F4", "_id" : { "$oid" : "509edf57d3ef590200000020" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[6]", "startOffset" : 4761, "end" : "/div[1]/blockquote[1]/p[6]", "endOffset" : 4765, "_id" : { "$oid" : "509edf57d3ef590200000021" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352589143462 }, "created" : { "$date" : 1352589143462 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509edf71d3ef590200000022", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Added by Melville.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "that to keep the seamen in subjection,\nhe wanted to prepare a warning of what road they should\nbe made to take did they or any of them oppose him; and\nthat, by means of the death of Don Alexandro, that warning\nwould best be given; but, that what this last meant, the deponent\ndid not at the time comprehend, nor could not, further\nthan that the death of Don Alexandro was intended;", "uuid" : "D6C044D3", "_id" : { "$oid" : "509edf71d3ef590200000022" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[6]", "startOffset" : 4846, "end" : "/div[1]/blockquote[1]/p[6]", "endOffset" : 5227, "_id" : { "$oid" : "509edf71d3ef590200000023" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352589169322 }, "created" : { "$date" : 1352589169322 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509edfc7d3ef590200000024", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "similar to Delano.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "the negro Babo proposed to the deponent to\ncall the mate Raneds, who was sleeping in the cabin, before\nthe thing was done, for fear, as the deponent understood it,\nthat the mate, who was a good navigator, should be killed\nwith", "uuid" : "FB873F36", "_id" : { "$oid" : "509edfc7d3ef590200000024" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[6]", "startOffset" : 5241, "end" : "/div[1]/blockquote[1]/p[6]", "endOffset" : 5468, "_id" : { "$oid" : "509edfc7d3ef590200000025" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352589255286 }, "created" : { "$date" : 1352589255286 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509edfec23b58f0200000018", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Emphasis on him, unlike \"the rest\"in Delano.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Don Alexandro", "uuid" : "E15BC3A5", "_id" : { "$oid" : "509edfec23b58f0200000018" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[6]", "startOffset" : 5468, "end" : "/div[1]/blockquote[1]/p[6]", "endOffset" : 5481, "_id" : { "$oid" : "509edfec23b58f0200000019" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352589292682 }, "created" : { "$date" : 1352589292682 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509ee02523b58f020000001a", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "similar with Babo replacing Mure.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "that the deponent, who\nwas the friend, from youth, of Don Alexandro, prayed and\nconjured, but all was useless; for the negro Babo answered\n[pg 253]\n\nhim that the thing could not be prevented, and that all the\nSpaniards risked their death if they should attempt", "uuid" : "29C59BFF", "_id" : { "$oid" : "509ee02523b58f020000001a" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[6]", "startOffset" : 5496, "end" : "/div[1]/blockquote[1]/p[6]", "endOffset" : 5757, "_id" : { "$oid" : "509ee02523b58f020000001b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352589349089 }, "created" : { "$date" : 1352589349089 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509ee03ed3ef590200000026", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "HIS WILL. Very important.So now he is God or at the very least a leader.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "his will", "uuid" : "9B2B58AC", "_id" : { "$oid" : "509ee03ed3ef590200000026" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[6]", "startOffset" : 5770, "end" : "/div[1]/blockquote[1]/p[6]", "endOffset" : 5778, "_id" : { "$oid" : "509ee03ed3ef590200000027" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352589374495 }, "created" : { "$date" : 1352589374495 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509ef84223b58f020000001c", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "same", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "that, in this conflict,\nthe deponent called the mate", "uuid" : "7AEF9018", "_id" : { "$oid" : "509ef84223b58f020000001c" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[6]", "startOffset" : 5809, "end" : "/div[1]/blockquote[1]/p[6]", "endOffset" : 5861, "_id" : { "$oid" : "509ef84223b58f020000001d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352595522179 }, "created" : { "$date" : 1352595522179 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509ef8b6d3ef590200000028", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Race of the slaves not mentioned earlier. Aranda was thrown overboard in the Delano, but here Babo stops them from making him Sharkfeed.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "nd immediately the negro Babo commanded\nthe Ashantee Martinqui and the Ashantee Lecbe to go and\ncommit the murder; that those two went down with hatchets\nto the berth of Don Alexandro; that, yet half alive and\nmangled, they dragged him on deck; that they were going\nto throw him overboard", "uuid" : "2AF35526", "_id" : { "$oid" : "509ef8b6d3ef590200000028" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[6]", "startOffset" : 5900, "end" : "/div[1]/blockquote[1]/p[6]", "endOffset" : 6188, "_id" : { "$oid" : "509ef8b6d3ef590200000029" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352595638107 }, "created" : { "$date" : 1352595638107 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509ef8cbd3ef59020000002a", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Lord and Master.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "by his orders", "uuid" : "C53556DA", "_id" : { "$oid" : "509ef8cbd3ef59020000002a" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[6]", "startOffset" : 6315, "end" : "/div[1]/blockquote[1]/p[6]", "endOffset" : 6328, "_id" : { "$oid" : "509ef8cbd3ef59020000002b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352595659123 }, "created" : { "$date" : 1352595659123 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509ef8d823b58f020000001e", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Wants to see and confirm?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "bidding the murder be completed on the deck\nbefore him, which was done,", "uuid" : "ADFB0097", "_id" : { "$oid" : "509ef8d823b58f020000001e" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[6]", "startOffset" : 6236, "end" : "/div[1]/blockquote[1]/p[6]", "endOffset" : 6308, "_id" : { "$oid" : "509ef8d823b58f020000001f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352595672920 }, "created" : { "$date" : 1352595672920 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509ef943d3ef59020000002c", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Name changed", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Alonzo\nSidonia", "uuid" : "AF4A933F", "_id" : { "$oid" : "509ef943d3ef59020000002c" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[6]", "startOffset" : 6446, "end" : "/div[1]/blockquote[1]/p[6]", "endOffset" : 6461, "_id" : { "$oid" : "509ef943d3ef59020000002d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352595779244 }, "created" : { "$date" : 1352595779244 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509ef96e23b58f0200000020", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "was the clerk in the Delano account.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "an old man, long resident at Valparaiso, and lately\nappointed to a civil office in Peru, whither he had taken\npassage, was at the time sleeping in the berth opposite Don\nAlexandro's", "uuid" : "BFA068AE", "_id" : { "$oid" : "509ef96e23b58f0200000020" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[6]", "startOffset" : 6463, "end" : "/div[1]/blockquote[1]/p[6]", "endOffset" : 6644, "_id" : { "$oid" : "509ef96e23b58f0200000021" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352595822731 }, "created" : { "$date" : 1352595822731 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509ef9a1d3ef59020000002e", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "almost same. Well , hatchet instead of dagger and no \"miserable\"", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "that awakening at his cries, surprised by them,\nand at the sight of the negroes with their bloody hatchets in\ntheir hands, he threw himself into the sea through a window\nwhich was near him, and was drowned", "uuid" : "89C7D1B0", "_id" : { "$oid" : "509ef9a1d3ef59020000002e" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[6]", "startOffset" : 6645, "end" : "/div[1]/blockquote[1]/p[6]", "endOffset" : 6851, "_id" : { "$oid" : "509ef9a1d3ef59020000002f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352595873437 }, "created" : { "$date" : 1352595873437 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509efa08d3ef590200000030", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Similar to Delano.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "that a short time after killing Aranda, they brought upon\ndeck his german-cousin, of middle-age, Don Francisco Masa,\nof Mendoza, and the young Don Joaquin, Marques de Aramboalaza,\nthen lately from Spain, with his Spanish servant\nPonce, and the three young clerks of Aranda, José Mozairi\nLorenzo Bargas, and Hermenegildo Gandix, all of Cadiz;\nthat Don Joaquin and Hermenegildo Gandix, the negro Babo,\nfor purposes hereafter to appear, preserved alive; but\nDon Francisco Masa, José Mozairi, and Lorenzo Bargas,\nwith Ponce the servant, beside the boatswain, Juan Robles,\nthe boatswain's mates, Manuel Viscaya and Roderigo Hurta,\nand four of the sailors, the negro Babo ordered to be thrown\nalive into the sea, although they made no resistance, nor\n[pg 254]", "uuid" : "51552396", "_id" : { "$oid" : "509efa08d3ef590200000030" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[6]", "startOffset" : 6931, "end" : "/div[1]/blockquote[1]/p[6]/i[4]", "endOffset" : 8, "_id" : { "$oid" : "509efa08d3ef590200000031" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352595976445 }, "created" : { "$date" : 1352595976445 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509efa2823b58f0200000022", "user" : "diptarka@mit.edu", "username" : "Diptarka H.", "text" : "Exactly the same.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "although they made no resistance, nor\n[pg 254]\n\nbegged for anything else but mercy; that the boatswain,\nJuan Robles, who knew how to swim, kept the longest\nabove water, making acts of contrition, and, in the last words\nhe uttered, charged this deponent to cause mass to be said\nfor his soul to our Lady of Succor", "uuid" : "329F4FB4", "_id" : { "$oid" : "509efa2823b58f0200000022" }, "permissions" : { "delete" : [ "diptarka@mit.edu" ], "update" : [ "diptarka@mit.edu" ], "admin" : [ "diptarka@mit.edu" ], "read" : [ "diptarka@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[6]", "startOffset" : 7637, "end" : "/div[1]/blockquote[1]/p[6]", "endOffset" : 7950, "_id" : { "$oid" : "509efa2823b58f0200000023" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352596008010 }, "created" : { "$date" : 1352596008010 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509f16f0d3ef590200000032", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "A shroud is typically used to cover corpse", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "canvas shroud", "uuid" : "E1508369", "_id" : { "$oid" : "509f16f0d3ef590200000032" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[371]", "startOffset" : 203, "end" : "/div[1]/p[371]", "endOffset" : 217, "_id" : { "$oid" : "509f16f0d3ef590200000033" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352603376179 }, "created" : { "$date" : 1352603376179 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509fc029d3ef590200000036", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "another example to show that don benito is acting weird. He doesn't even remember what he said a few days ago!", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "You\nyourself, Don Benito, spoke of Cape Horn,\" he\nemphatically repeated", "uuid" : "5F44B776", "_id" : { "$oid" : "509fc029d3ef590200000036" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[233]", "startOffset" : 232, "end" : "/div[1]/p[233]", "endOffset" : 303, "_id" : { "$oid" : "509fc029d3ef590200000037" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352646697977 }, "created" : { "$date" : 1352646697977 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509fc066d3ef590200000038", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "bending his head and body forward and downward.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "stooping", "uuid" : "EFCE3993", "_id" : { "$oid" : "509fc066d3ef590200000038" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[234]", "startOffset" : 34, "end" : "/div[1]/p[234]", "endOffset" : 42, "_id" : { "$oid" : "509fc066d3ef590200000039" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352646758434 }, "created" : { "$date" : 1352646758434 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509fc0bdd3ef59020000003a", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "an uncommon analogy. it is to some degree strange to me.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "as one about to\nmake a plunging exchange of elements, as from\nair to water.", "uuid" : "113C341C", "_id" : { "$oid" : "509fc0bdd3ef59020000003a" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[234]", "startOffset" : 72, "end" : "/div[1]/p[234]", "endOffset" : 147, "_id" : { "$oid" : "509fc0bdd3ef59020000003b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352646845588 }, "created" : { "$date" : 1352646845588 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509fc1aed622ab0200000004", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "babo tries to interrupt the conversation by shoving him into the cuddy", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "\"Master,\" said the servant, discontinuing his\nwork on the coat sleeve, and addressing the\nrapt Spaniard with a sort of timid apprehensiveness,\nas one charged with a duty, the discharge\nof which, it was foreseen, would prove irksome\nto the very person who had imposed it, and for\nwhose benefit it was intended, \"master told me\nnever mind where he was, or how engaged, always\nto remind him to a minute, when shaving-time\ncomes. Miguel has gone to strike the half-hour\nafternoon. It is now, master. Will master\ngo into the cuddy?\"", "uuid" : "BADAA9CE", "_id" : { "$oid" : "509fc1aed622ab0200000004" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[236]", "startOffset" : 0, "end" : "/div[1]/p[236]", "endOffset" : 527, "_id" : { "$oid" : "509fc1aed622ab0200000005" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352647086554 }, "created" : { "$date" : 1352647086554 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509fc260d3ef59020000003c", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "sounds like the Spaniard is obeying Babo instead of taking control of Babo. It is even strange to have a fixed time to shave everyday. As long as Don Benito's beard doesn't grow too long, why does he need to shave every single day at a specific time?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Ah—yes", "uuid" : "C4B70797", "_id" : { "$oid" : "509fc260d3ef59020000003c" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[237]", "startOffset" : 1, "end" : "/div[1]/p[237]", "endOffset" : 7, "_id" : { "$oid" : "509fc260d3ef59020000003d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352647264298 }, "created" : { "$date" : 1352647264298 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509fc2ccd3ef59020000003e", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "means \"before\". it is an obscure word nowadays.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "ere", "uuid" : "84BD21EE", "_id" : { "$oid" : "509fc2ccd3ef59020000003e" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[237]", "startOffset" : 131, "end" : "/div[1]/p[237]", "endOffset" : 134, "_id" : { "$oid" : "509fc2ccd3ef59020000003f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352647372174 }, "created" : { "$date" : 1352647372174 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509fc336d622ab0200000006", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "another hint that Boba wants to hear the conversation between those two. However, Delano just considers it thoughtful.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Then if master means to talk more to Don\nAmasa,\" said the servant, \"why not let Don\nAmasa sit by master in the cuddy, and master\ncan talk, and Don Amasa can listen, while Babo\nhere lathers and strops.\"", "uuid" : "DCE5FD97", "_id" : { "$oid" : "509fc336d622ab0200000006" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[238]", "startOffset" : 1, "end" : "/div[1]/p[239]", "endOffset" : 0, "_id" : { "$oid" : "509fc336d622ab0200000007" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352647478853 }, "created" : { "$date" : 1352647478853 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509fc3aad622ab0200000008", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "apparently it has two entirely different kinds of meanings...", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "poop", "uuid" : "44035216", "_id" : { "$oid" : "509fc3aad622ab0200000008" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[242]", "startOffset" : 64, "end" : "/div[1]/p[242]", "endOffset" : 68, "_id" : { "$oid" : "509fc3aad622ab0200000009" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352647594344 }, "created" : { "$date" : 1352647594344 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509fc4a6d3ef590200000040", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Melville did a fascinating job describing the cuddy as if he were there the whole time. Very vivid and persuading.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "The floor of the cuddy was matted. Overhead,\nfour or five old muskets were stuck into\nhorizontal holes along the beams. On one side\nwas a claw-footed old table lashed to the deck;\na thumbed missal on it, and over it a small,\nmeagre crucifix attached to the bulk-head. Under\nthe table lay a dented cutlass or two, with\na hacked harpoon, among some; melancholy\nold rigging, like a heap of poor friars' girdles.\nThere were also two long, sharp-ribbed settees\n[pg 198]\n\nof Malacca cane, black with age, and uncomfortable\nto look at as inquisitors' racks, with a\nlarge, misshapen arm-chair, which, furnished\nwith a rude barber's crotch at the back, working\nwith a screw, seemed some grotesque engine\nof torment. A flag locker was in one corner,\nopen, exposing various colored bunting, some\nrolled up, others half unrolled, still others tumbled.\nOpposite was a cumbrous washstand, of\nblack mahogany, all of one block, with a pedestal,\nlike a font, and over it a railed shelf,\ncontaining combs, brushes, and other implements\nof the toilet. A torn hammock of stained\ngrass swung near; the sheets tossed, and\nthe pillow wrinkled up like a brow, as if who\never slept here slept but illy, with alternate\nvisitations of sad thoughts and bad dreams.\n\nThe further extremity of the cuddy, overhanging\nthe ship's stern, was pierced with three\nopenings, windows or port-holes, according as\nmen or cannon might peer, socially or unsocially,\nout of them. At present neither men nor\ncannon were seen, though huge ring-bolts and\nother rusty iron fixtures of the wood-work hinted\nof twenty-four-pounders.", "uuid" : "77EA5347", "_id" : { "$oid" : "509fc4a6d3ef590200000040" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[244]", "startOffset" : 0, "end" : "/div[1]/p[245]", "endOffset" : 345, "_id" : { "$oid" : "509fc4a6d3ef590200000041" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352647846008 }, "created" : { "$date" : 1352647846008 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509fc5f4d622ab020000000a", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "I am pretty doubtful about this statement. I do not see any clue that leads to this thought. Maybe it's because most of the black people back then are slaves and can only do cheap labors.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Most negroes are natural valets\nand hair-dressers", "uuid" : "1825E94E", "_id" : { "$oid" : "509fc5f4d622ab020000000a" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[251]", "startOffset" : 102, "end" : "/div[1]/p[251]", "endOffset" : 151, "_id" : { "$oid" : "509fc5f4d622ab020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352648180085 }, "created" : { "$date" : 1352648180085 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509fc6a2d622ab020000000c", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "means \"uncommon, weird, strange\" back then. Melville uses a lot of \"singular\" in this text.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "singularly", "uuid" : "28D9D6D2", "_id" : { "$oid" : "509fc6a2d622ab020000000c" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[251]", "startOffset" : 424, "end" : "/div[1]/p[251]", "endOffset" : 434, "_id" : { "$oid" : "509fc6a2d622ab020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352648354612 }, "created" : { "$date" : 1352648354612 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509fc768d3ef590200000042", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "this is clearly seen when Babo tells both Don Benito and Delano that Don Benito has a regular shaving time every day.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "When at ease with respect to exterior things,", "uuid" : "0723A4AB", "_id" : { "$oid" : "509fc768d3ef590200000042" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[252]", "startOffset" : 619, "end" : "/div[1]/p[252]", "endOffset" : 664, "_id" : { "$oid" : "509fc768d3ef590200000043" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352648552340 }, "created" : { "$date" : 1352648552340 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509fc848d622ab020000000e", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "indicates that Melville did some research before writing this book.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "The mode of shaving among the Spaniards is\na little different from what it is with other\nnations. They have a basin, specifically called\na barber's basin, which on one side is scooped\nout, so as accurately to receive the chin, against\nwhich it is closely held in lathering; which is\ndone, not with a brush, but with soap dipped\nin the water of the basin and rubbed on the\nface.", "uuid" : "13BA2A71", "_id" : { "$oid" : "509fc848d622ab020000000e" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[255]", "startOffset" : 0, "end" : "/div[1]/p[255]", "endOffset" : 377, "_id" : { "$oid" : "509fc848d622ab020000000f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352648776113 }, "created" : { "$date" : 1352648776113 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509fc8a6d622ab0200000010", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "because Don Benito clearly understand if he speaks too much, he will get himself and Delano killed by Babo", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "nor, for the\npresent, did Don Benito appear disposed to\nrenew any.", "uuid" : "07FADD76", "_id" : { "$oid" : "509fc8a6d622ab0200000010" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[257]", "startOffset" : 123, "end" : "/div[1]/p[257]", "endOffset" : 189, "_id" : { "$oid" : "509fc8a6d622ab0200000011" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352648870901 }, "created" : { "$date" : 1352648870901 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509fc8bed622ab0200000012", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "does not sound too right.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "as for the sharpest,", "uuid" : "8BC8CA29", "_id" : { "$oid" : "509fc8bed622ab0200000012" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 61, "end" : "/div[1]/p[258]", "endOffset" : 81, "_id" : { "$oid" : "509fc8bed622ab0200000013" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352648894176 }, "created" : { "$date" : 1352648894176 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509fc90fd622ab0200000014", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "why doesn't Melville just wrote \"affected by\"? It is a bit redundant and wordy here.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Not\nunaffected", "uuid" : "3863BFBC", "_id" : { "$oid" : "509fc90fd622ab0200000014" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 412, "end" : "/div[1]/p[258]", "endOffset" : 427, "_id" : { "$oid" : "509fc90fd622ab0200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352648975506 }, "created" : { "$date" : 1352648975506 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509fc9bed622ab0200000016", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Again, Don Benito knows that Babo can easily harm him with the razor now, therefore he seems nervous", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Again Don Benito faintly shuddered", "uuid" : "C28E7308", "_id" : { "$oid" : "509fc9bed622ab0200000016" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[262]", "startOffset" : 0, "end" : "/div[1]/p[262]", "endOffset" : 34, "_id" : { "$oid" : "509fc9bed622ab0200000017" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352649150357 }, "created" : { "$date" : 1352649150357 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509fca2bd3ef590200000044", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Although the word from Babo's mouth sounds polite and thoughtful, Babo actually wants to dominate the entire situation.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "\"And now, Don Amasa,\nplease go on with your talk about the gale,\nand all that; master can hear, and, between\ntimes, master can answer.\"", "uuid" : "1E506963", "_id" : { "$oid" : "509fca2bd3ef590200000044" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[263]", "startOffset" : 235, "end" : "/div[1]/p[263]", "endOffset" : 370, "_id" : { "$oid" : "509fca2bd3ef590200000045" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352649259466 }, "created" : { "$date" : 1352649259466 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509fcad4d3ef590200000046", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Babo's intention is to warn Don Benito not to give away the story that really happened on the ship. Of course, Don Benito is terrified.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "\"See, master—you shook so—here's Babo's\nfirst blood.\"", "uuid" : "B00C9E55", "_id" : { "$oid" : "509fcad4d3ef590200000046" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[265]", "startOffset" : 557, "end" : "/div[1]/p[265]", "endOffset" : 611, "_id" : { "$oid" : "509fcad4d3ef590200000047" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352649428002 }, "created" : { "$date" : 1352649428002 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509fcb0fd3ef590200000048", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "Suggests that Don Benito is truly scared of Babo's capability to hurt him", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "produced a more terrified\naspect than was now presented by Don\nBenito.", "uuid" : "1AEBFB74", "_id" : { "$oid" : "509fcb0fd3ef590200000048" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[266]", "startOffset" : 109, "end" : "/div[1]/p[266]", "endOffset" : 179, "_id" : { "$oid" : "509fcb0fd3ef590200000049" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352649487423 }, "created" : { "$date" : 1352649487423 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "509fcb82d3ef59020000004a", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "the lesson means that Delano abandoned the idea that Don Benito is planning on taking his his life and his ship.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Well, well, this\nday's experience shall be a good lesson.", "uuid" : "3F169DF8", "_id" : { "$oid" : "509fcb82d3ef59020000004a" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[267]", "startOffset" : 459, "end" : "/div[1]/p[267]", "endOffset" : 516, "_id" : { "$oid" : "509fcb82d3ef59020000004b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352649602103 }, "created" : { "$date" : 1352649602103 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a01f45d622ab0200000018", "user" : "rhsu0529@mit.edu", "username" : "Shau-Chieh H.", "text" : "perfectly demonstrates that Babo is a villain. ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "As he said the words, his face was turned\nhalf round, so as to be alike visible to the\n[pg 207]\n\nSpaniard and the American, and seemed, by\nits expression, to hint, that he was desirous, by\ngetting his master to go on with the conversation,\nconsiderately to withdraw his attention\nfrom the recent annoying accident.", "uuid" : "89ECA476", "_id" : { "$oid" : "50a01f45d622ab0200000018" }, "permissions" : { "delete" : [ "rhsu0529@mit.edu" ], "update" : [ "rhsu0529@mit.edu" ], "admin" : [ "rhsu0529@mit.edu" ], "read" : [ "rhsu0529@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[269]", "startOffset" : 0, "end" : "/div[1]/p[269]", "endOffset" : 314, "_id" : { "$oid" : "50a01f45d622ab0200000019" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352671045405 }, "created" : { "$date" : 1352671045404 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a1767878fec40200000002", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Who is Delano? He is a sealer and a general trader who comes from Massachusetts. American and possibly protestant. ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Captain Amasa Delano", "uuid" : "AF49D82E", "_id" : { "$oid" : "50a1767878fec40200000002" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 18, "end" : "/div[1]/p[1]", "endOffset" : 38, "_id" : { "$oid" : "50a1767878fec40200000003" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352758904106 }, "created" : { "$date" : 1352758904106 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a176bf8aa88a0200000002", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "The location of the happening. It is small, desert, and uninhabited, yet why would a valuable cargo be at anchor in such a place?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "St.\nMaria", "uuid" : "49B4A2D2", "_id" : { "$oid" : "50a176bf8aa88a0200000002" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 170, "end" : "/div[1]/p[1]", "endOffset" : 179, "_id" : { "$oid" : "50a176bf8aa88a0200000003" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352758975216 }, "created" : { "$date" : 1352758975216 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a177cb8aa88a0200000004", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "His mate is the one that informs Delano that a unknown ship was heading his way.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "his mate", "uuid" : "8DAEF43C", "_id" : { "$oid" : "50a177cb8aa88a0200000004" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 66, "end" : "/div[1]/p[2]", "endOffset" : 74, "_id" : { "$oid" : "50a177cb8aa88a0200000005" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352759243234 }, "created" : { "$date" : 1352759243234 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a178fc78fec40200000004", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "I understand why he rose. To find out about the ship. Why did he dress? To appear more like a captain? ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "He rose, dressed, and\nwent on deck.", "uuid" : "41EFCEF7", "_id" : { "$oid" : "50a178fc78fec40200000004" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 200, "end" : "/div[1]/p[2]", "endOffset" : 235, "_id" : { "$oid" : "50a178fc78fec40200000005" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352759548191 }, "created" : { "$date" : 1352759548191 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a1799c78fec40200000006", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "So the coast was normally not gray, calm and mute? Grey could signify boredom, as well the color of lead. It could also be hard to see through, so confusion?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "morning was one peculiar to that coast", "uuid" : "F6CD3AE9", "_id" : { "$oid" : "50a1799c78fec40200000006" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 4, "end" : "/div[1]/p[3]", "endOffset" : 42, "_id" : { "$oid" : "50a1799c78fec40200000007" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352759708880 }, "created" : { "$date" : 1352759708880 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a179b78aa88a0200000006", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Shadows give a sense of mystery and confusion.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Shadows present,\nforeshadowing deeper shadows to come.", "uuid" : "BDD70A79", "_id" : { "$oid" : "50a179b78aa88a0200000006" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 486, "end" : "/div[1]/p[3]", "endOffset" : 540, "_id" : { "$oid" : "50a179b78aa88a0200000007" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352759735100 }, "created" : { "$date" : 1352759735100 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a179fb78fec40200000008", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "So the captain of the ship had no color, no race as of yet. Also showed that he was entering with peace and bearing no desire to harm.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "the stranger", "uuid" : "9FC0C1BF", "_id" : { "$oid" : "50a179fb78fec40200000008" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 30, "end" : "/div[1]/p[4]", "endOffset" : 42, "_id" : { "$oid" : "50a179fb78fec40200000009" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352759803336 }, "created" : { "$date" : 1352759803336 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a17a5d8aa88a0200000008", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "There are no rules of the sea to follow and no one to witness the consequences of being lawless. ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "lawlessness and loneliness", "uuid" : "AE14DEB3", "_id" : { "$oid" : "50a17a5d8aa88a0200000008" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 277, "end" : "/div[1]/p[4]", "endOffset" : 303, "_id" : { "$oid" : "50a17a5d8aa88a0200000009" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352759901356 }, "created" : { "$date" : 1352759901356 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a17aab78fec4020000000a", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Delano doesn't believe that the ship coming towards them will harm them. His good nature prevents him from seeing harm in this case.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "singularly\nundistrustful good-nature", "uuid" : "DF13045B", "_id" : { "$oid" : "50a17aab78fec4020000000a" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 480, "end" : "/div[1]/p[4]", "endOffset" : 516, "_id" : { "$oid" : "50a17aab78fec4020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352759979875 }, "created" : { "$date" : 1352759979875 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50a17bb48aa88a020000000a" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1352760244274 }, "groups" : [ "21L.000J" ], "id" : "50a17bb48aa88a020000000a", "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "quote" : "Whether, in view of what humanity is capable,\nsuch a trait implies, along with a benevolent\nheart, more than ordinary quickness and accuracy\nof intellectual perception, may be left to\nthe wise to determine.", "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 683, "end" : "/div[1]/p[4]", "endOffset" : 890, "_id" : { "$oid" : "50a17bb48aa88a020000000b" } } ], "tags" : [], "text" : "I don't really quite get what this means. ", "updated" : { "$date" : 1352760256189 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "uuid" : "58B5DA3A" } -{ "id" : "50a1db878aa88a020000000c", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "His mate opposes to the fact that Delano wants to go and help the mystery ship.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Captain Delano ordered his whale-boat\nto be dropped, and, much to the wary opposition\nof his mate", "uuid" : "12951798", "_id" : { "$oid" : "50a1db878aa88a020000000c" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 476, "end" : "/div[1]/p[6]", "endOffset" : 573, "_id" : { "$oid" : "50a1db878aa88a020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352784775775 }, "created" : { "$date" : 1352784775775 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a1dbb112fa2c0200000002", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "This food is to make only if they had been in trouble.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Presuming that the stranger might\nhave been long off soundings, the good captain\nput several baskets of the fish", "uuid" : "257DCAEF", "_id" : { "$oid" : "50a1dbb112fa2c0200000002" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 847, "end" : "/div[1]/p[6]", "endOffset" : 959, "_id" : { "$oid" : "50a1dbb112fa2c0200000003" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352784817273 }, "created" : { "$date" : 1352784817273 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a1dbdc8aa88a020000000e", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Detail, lots and lots of detail of the ship", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Upon gaining a less remote view, the ship,\nwhen made signally visible on the verge of the\nleaden-hued swells, with the shreds of fog here\nand there raggedly furring her, appeared like a\nwhite-washed monastery after a thunder-storm,\nseen perched upon some dun cliff among the\nPyrenees.", "uuid" : "127223C2", "_id" : { "$oid" : "50a1dbdc8aa88a020000000e" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[7]", "startOffset" : 0, "end" : "/div[1]/p[7]", "endOffset" : 284, "_id" : { "$oid" : "50a1dbdc8aa88a020000000f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352784860667 }, "created" : { "$date" : 1352784860667 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a1e19c8aa88a0200000010", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Benito Cereno's front. ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "a Spanish merchantman of\nthe first class, carrying negro slaves, amongst\nother valuable freight, from one colonial port to\nanother", "uuid" : "81D30C6A", "_id" : { "$oid" : "50a1e19c8aa88a0200000010" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[8]", "startOffset" : 107, "end" : "/div[1]/p[8]", "endOffset" : 237, "_id" : { "$oid" : "50a1e19c8aa88a0200000011" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352786332881 }, "created" : { "$date" : 1352786332881 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a1e24012fa2c0200000004", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "Start Here: End at end.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "As", "uuid" : "DD2A7904", "_id" : { "$oid" : "50a1e24012fa2c0200000004" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[9]", "startOffset" : 0, "end" : "/div[1]/p[9]", "endOffset" : 2, "_id" : { "$oid" : "50a1e24012fa2c0200000005" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352786496877 }, "created" : { "$date" : 1352786496877 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a1e2718aa88a0200000012", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "End: We have here the description of the boat in detail. Why would an author go in so much detail? what is the importance.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "pattern", "uuid" : "778E6EA8", "_id" : { "$oid" : "50a1e2718aa88a0200000012" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 171, "end" : "/div[1]/p[10]", "endOffset" : 178, "_id" : { "$oid" : "50a1e2718aa88a0200000013" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352786545526 }, "created" : { "$date" : 1352786545526 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a1e2f912fa2c0200000006", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "This is their tale of how they got to where they are now.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Off Cape Horn they had narrowly escaped shipwreck;\nthen, for days together, they had lain\ntranced without wind; their provisions were\nlow; their water next to none; their lips that\nmoment were baked.", "uuid" : "5547CEB6", "_id" : { "$oid" : "50a1e2f912fa2c0200000006" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 541, "end" : "/div[1]/p[14]", "endOffset" : 740, "_id" : { "$oid" : "50a1e2f912fa2c0200000007" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352786681184 }, "created" : { "$date" : 1352786681183 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a1e3c58aa88a0200000014", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "The fish served its purpose, to share with the other sailors. Use food as an method to bring together. He went to go fetch food but why? ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "But losing no time in mere compliments,\nCaptain Delano, returning to the gangway, had\nhis basket of fish brought up; and as the wind\nstill continued light, so that some hours at\nleast must elapse ere the ship could be brought\nto the anchorage, he bade his men return to the\nsealer, and fetch back as much water as the\nwhale-boat could carry, with whatever soft\nbread the steward might have, all the remaining\npumpkins on board, with a box of sugar,\nand a dozen of his private bottles of cider.", "uuid" : "48B7374B", "_id" : { "$oid" : "50a1e3c58aa88a0200000014" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 0, "end" : "/div[1]/p[22]", "endOffset" : 493, "_id" : { "$oid" : "50a1e3c58aa88a0200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352786885074 }, "created" : { "$date" : 1352786885074 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a1e7d68aa88a0200000016", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "It seems that Benito has no authority", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Benito\nCereno been a man of greater energy, misrule\nwould hardly have come to the present pass.", "uuid" : "FA757D44", "_id" : { "$oid" : "50a1e7d68aa88a0200000016" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 676, "end" : "/div[1]/p[24]", "endOffset" : 771, "_id" : { "$oid" : "50a1e7d68aa88a0200000017" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352787926631 }, "created" : { "$date" : 1352787926631 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a301ab91b44d0200000002", "user" : "mikaelm@mit.edu", "username" : "Mikael M.", "text" : "Describes the scene as if it were a play. The slaves were actors, and there were coming out of character.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Captain\nDelano, now with scales dropped from his\neyes, saw the negroes, not in misrule, not in\ntumult, not as if frantically concerned for Don\nBenito, but with mask torn away, flourishing\nhatchets and knives,", "uuid" : "A4336E0F", "_id" : { "$oid" : "50a301ab91b44d0200000002" }, "permissions" : { "delete" : [ "mikaelm@mit.edu" ], "update" : [ "mikaelm@mit.edu" ], "admin" : [ "mikaelm@mit.edu" ], "read" : [ "mikaelm@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[370]", "startOffset" : 76, "end" : "/div[1]/p[370]", "endOffset" : 284, "_id" : { "$oid" : "50a301ab91b44d0200000003" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352860075583 }, "created" : { "$date" : 1352860075583 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a301b512fa2c0200000008", "user" : "mikaelm@mit.edu", "username" : "Mikael M.", "text" : "The truth comes out", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "about the beak, suddenly revealing, as the\nbleached hull swung round towards the open\nocean, death for the figure-head, in a human\nskeleton; chalky comment on the chalked\nwords below, \"Follow your leader.\"", "uuid" : "3E118987", "_id" : { "$oid" : "50a301b512fa2c0200000008" }, "permissions" : { "delete" : [ "mikaelm@mit.edu" ], "update" : [ "mikaelm@mit.edu" ], "admin" : [ "mikaelm@mit.edu" ], "read" : [ "mikaelm@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[371]", "startOffset" : 227, "end" : "/div[1]/p[371]", "endOffset" : 432, "_id" : { "$oid" : "50a301b512fa2c0200000009" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352860085100 }, "created" : { "$date" : 1352860085100 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a3023212fa2c020000000a", "user" : "mikaelm@mit.edu", "username" : "Mikael M.", "text" : "Why did he give up so easily after all that work and coordination. He had risked death before, I would have expected him to fight to the death.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "calling for ropes,\nCaptain Delano bound the negro, who made\nno resistance,", "uuid" : "AA462431", "_id" : { "$oid" : "50a3023212fa2c020000000a" }, "permissions" : { "delete" : [ "mikaelm@mit.edu" ], "update" : [ "mikaelm@mit.edu" ], "admin" : [ "mikaelm@mit.edu" ], "read" : [ "mikaelm@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[373]", "startOffset" : 26, "end" : "/div[1]/p[373]", "endOffset" : 100, "_id" : { "$oid" : "50a3023212fa2c020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352860210176 }, "created" : { "$date" : 1352860210176 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a323ac91b44d0200000004", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "First appearance of Babo. Is Delano as bothered with Babo as he shows to be in his narrative?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "By\nhis side stood a black of small stature, in whose\nrude face, as occasionally, like a shepherd's dog,\nhe mutely turned it up into the Spaniard's, sorrow\nand affection were equally blended.", "uuid" : "CE7F7ECE", "_id" : { "$oid" : "50a323ac91b44d0200000004" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 512, "end" : "/div[1]/p[20]", "endOffset" : 702, "_id" : { "$oid" : "50a323ac91b44d0200000005" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352868780802 }, "created" : { "$date" : 1352868780802 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50a32a9e12fa2c020000000c" }, "id" : "50a32a9e12fa2c020000000c", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "Melville gives Babo dialogue in order to establish him as a major character. The irony in his words here are that he was dismissed as nothing in the Amasa's account, but in Melville's story he plays a much bigger role.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "\"Ah, master,\" sighed the black, bowing his\nface, \"don't speak of me; Babo is nothing;\nwhat Babo has done was but duty.\"", "uuid" : "3C107447", "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[48]", "startOffset" : 0, "end" : "/div[1]/p[48]", "endOffset" : 119, "_id" : { "$oid" : "50a32a9e12fa2c020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352870558360 }, "created" : { "$date" : 1352870558360 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50a32afa91b44d0200000006" }, "id" : "50a32afa91b44d0200000006", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "recurring themes: the slave master relationship, seen through Captain Delano's eyes as a noble bond between servant and master ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Captain Delano\ncould not but bethink him of the beauty of\nthat relationship which could present such a\nspectacle of fidelity on the one hand and confidence\non the other. The scene was heightened", "uuid" : "FDDDB16F", "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[50]", "startOffset" : 67, "end" : "/div[1]/p[50]", "endOffset" : 261, "_id" : { "$oid" : "50a32afa91b44d0200000007" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352870650356 }, "created" : { "$date" : 1352870650356 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50a32b4e12fa2c020000000e" }, "id" : "50a32b4e12fa2c020000000e", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "A begging friar?! The irony is palpable.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "The servant wore nothing but wide trowsers,\napparently, from their coarseness and patches,\nmade out of some old topsail; they were clean,\nand confined at the waist by a bit of unstranded\nrope, which, with his composed, deprecatory\nair at times, made him look something like a\nbegging friar of St. Francis", "uuid" : "51996A64", "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[51]", "startOffset" : 0, "end" : "/div[1]/p[51]", "endOffset" : 304, "_id" : { "$oid" : "50a32b4e12fa2c020000000f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352870734424 }, "created" : { "$date" : 1352870734424 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50a32cb591b44d0200000008" }, "id" : "50a32cb591b44d0200000008", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "Interesting that Delano would call Babo a counselor when he's probably giving Benito instructions on how to maintain the facade.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Ha, Don Benito, your black\nhere seems high in your trust; a sort of privy-counselor,\nin fact.", "uuid" : "B074D479", "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[148]", "startOffset" : 611, "end" : "/div[1]/p[148]", "endOffset" : 704, "_id" : { "$oid" : "50a32cb591b44d0200000009" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352871093177 }, "created" : { "$date" : 1352871093177 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a32e2357e44b0200000002", "user" : "mikaelm@mit.edu", "username" : "Mikael M.", "text" : "Benito is genuinely concerned for Delano, while the crew just want to make sure that he can complete their original journey ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "\"What! have you saved my life, Señor, and\nare you now going to throw away your own?\"\n\nThe officers also, for reasons connected with\ntheir interests and those of the voyage, and a\nduty owing to the owners, strongly objected\nagainst their commander's going", "uuid" : "4C452EAE", "_id" : { "$oid" : "50a32e2357e44b0200000002" }, "permissions" : { "delete" : [ "mikaelm@mit.edu" ], "update" : [ "mikaelm@mit.edu" ], "admin" : [ "mikaelm@mit.edu" ], "read" : [ "mikaelm@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[378]", "startOffset" : 0, "end" : "/div[1]/p[379]", "endOffset" : 168, "_id" : { "$oid" : "50a32e2357e44b0200000003" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352871459019 }, "created" : { "$date" : 1352871459019 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a32e6c57e44b0200000004", "user" : "mikaelm@mit.edu", "username" : "Mikael M.", "text" : "This is where Babo's theater begins to fall", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "The\ninstant that was done, Don Benito sprang over\nthe bulwarks, falling at the feet of Captain\nDelano; at", "uuid" : "26F59E1E", "_id" : { "$oid" : "50a32e6c57e44b0200000004" }, "permissions" : { "delete" : [ "mikaelm@mit.edu" ], "update" : [ "mikaelm@mit.edu" ], "admin" : [ "mikaelm@mit.edu" ], "read" : [ "mikaelm@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[362]", "startOffset" : 218, "end" : "/div[1]/p[362]", "endOffset" : 324, "_id" : { "$oid" : "50a32e6c57e44b0200000005" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352871532974 }, "created" : { "$date" : 1352871532974 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50a32ea591b44d020000000a" }, "id" : "50a32ea591b44d020000000a", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "Once again, Delano puts his trust in slaves because he underestimates them here, mainly due to his prejudice. Melville adds many moments like these, perhaps to increase the effect on the reader when the pretending ends.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "In\nfact, like most men of a good, blithe heart,\nCaptain Delano took to negroes, not philanthropically,\nbut genially, just as other men to\nNewfoundland dogs.", "uuid" : "FDC38677", "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[252]", "startOffset" : 989, "end" : "/div[1]/p[252]", "endOffset" : 1145, "_id" : { "$oid" : "50a32ea591b44d020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352871589264 }, "created" : { "$date" : 1352871589264 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50a32fe457e44b0200000006" }, "id" : "50a32fe457e44b0200000006", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "Scary, threatening, the scene plays on the reader's perception of who's in control. To the audience: Delano, it appears as though the master is receiving a shave when actually he's threatening Benito's life.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "\"See, master—you shook so—here's Babo's\nfirst blood.\"", "uuid" : "DD81930F", "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[265]", "startOffset" : 557, "end" : "/div[1]/p[265]", "endOffset" : 610, "_id" : { "$oid" : "50a32fe457e44b0200000007" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352871908727 }, "created" : { "$date" : 1352871908727 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50a3312657e44b0200000008" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1352872230341 }, "groups" : [ "21L.000J" ], "id" : "50a3312657e44b0200000008", "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "quote" : "but some years among the Spaniards, aged\n[pg 250]\n\nabout thirty, which negro's name was Babo; * * * that he\ndoes not remember the names of the others, but that still expecting\nthe residue of Don Alexandra's papers will be found,\nwill then take due account of them all, and remit to the\ncourt;", "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[4]", "startOffset" : 1106, "end" : "/div[1]/blockquote[1]/p[4]", "endOffset" : 1398, "_id" : { "$oid" : "50a3312657e44b0200000009" } } ], "tags" : [], "text" : "Why is Babo the last name? The order of names that were listed has been changed from the original account by Melville, perhaps it was meant by him to set Babo apart from the rest of the slaves on the ship as a sort of mastermind.", "updated" : { "$date" : 1352872376633 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "uuid" : "013FA15F" } -{ "_id" : { "$oid" : "50a3326591b44d020000000c" }, "id" : "50a3326591b44d020000000c", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "Huge contrast now from before when Delano was comparing to a loyal animal.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "the negro Babo came to\nthe place where the deponent was, and told him that he had\ndetermined to kill his master, Don Alexandro Aranda", "uuid" : "D8793860", "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[6]", "startOffset" : 4625, "end" : "/div[1]/blockquote[1]/p[6]", "endOffset" : 4759, "_id" : { "$oid" : "50a3326591b44d020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352872549129 }, "created" : { "$date" : 1352872549129 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "50a3331691b44d020000000e" }, "id" : "50a3331691b44d020000000e", "user" : "ramaez@mit.edu", "username" : "Ruben A.", "text" : "Interesting again that Melville chooses to set Babo apart and make him the main act", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "that\nthe negro Babo was the plotter from first to last; he ordered\nevery murder, and was the helm and keel of the revolt;", "uuid" : "4158FF27", "permissions" : { "delete" : [ "ramaez@mit.edu" ], "update" : [ "ramaez@mit.edu" ], "admin" : [ "ramaez@mit.edu" ], "read" : [ "ramaez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[18]", "startOffset" : 2459, "end" : "/div[1]/blockquote[1]/p[18]", "endOffset" : 2581, "_id" : { "$oid" : "50a3331691b44d020000000f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352872726096 }, "created" : { "$date" : 1352872726096 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a3370b57e44b020000000a", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "Although Delano's narrative doesn't provide rich descriptions of Cereno, Melville adds some facts in this paragraph that seem to be important to the construction of the character.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Shut up in these oaken\nwalls, chained to one dull round of command,\nwhose unconditionality cloyed him, like some\nhypochondriac abbot he moved slowly about,\nat times suddenly pausing, starting, or staring,\nbiting his lip, biting his finger-nail, flushing,\npaling, twitching his beard, with other symptoms\nof an absent or moody mind. This distempered\nspirit was lodged, as before hinted, in\nas distempered a frame. He was rather tall,\nbut seemed never to have been robust, and now\nwith nervous suffering was almost worn to a\nskeleton. A tendency to some pulmonary\ncomplaint appeared to have been lately confirmed.\nHis voice was like that of one with\nlungs half gone—hoarsely suppressed, a husky\nwhisper.", "uuid" : "92AEFF27", "_id" : { "$oid" : "50a3370b57e44b020000000a" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 1308, "end" : "/div[1]/p[24]", "endOffset" : 2010, "_id" : { "$oid" : "50a3370b57e44b020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352873739914 }, "created" : { "$date" : 1352873739914 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a3376457e44b020000000c", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "In Melville's version, Babo's proximity to Cereno is admired by Delano, unlike what the narrative describes", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "No wonder that, as in this state he\ntottered about, his private servant apprehensively\nfollowed him. Sometimes the negro\ngave his master his arm, or took his handkerchief\nout of his pocket for him; performing\nthese and similar offices with that affectionate\n[pg 124]\n\nzeal which transmutes into something filial or\nfraternal acts in themselves but menial; and\nwhich has gained for the negro the repute of\nmaking the most pleasing body-servant in the\nworld; one, too, whom a master need be on no\nstiffly superior terms with, but may treat with\nfamiliar trust; less a servant than a devoted\ncompanion.", "uuid" : "90B93132", "_id" : { "$oid" : "50a3376457e44b020000000c" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 2010, "end" : "/div[1]/p[24]", "endOffset" : 2609, "_id" : { "$oid" : "50a3376457e44b020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352873828794 }, "created" : { "$date" : 1352873828794 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a33c1f91b44d0200000010", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "Again, Delano ignores the presence of Babo in Melville's story. In this version, he is not bothered by the servant's continuous presence.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Don Benito faltered; then, like some somnambulist\nsuddenly interfered with, vacantly\nstared at his visitor, and ended by looking\ndown on the deck. He maintained this posture\nso long, that Captain Delano, almost equally\ndisconcerted, and involuntarily almost as rude,\nturned suddenly from him, walking forward to\naccost one of the Spanish seamen for the desired\ninformation. But he had hardly gone\nfive paces, when, with a sort of eagerness, Don\nBenito invited him back, regretting his momentary\nabsence of mind, and professing readiness\nto gratify him.\n\nWhile most part of the story was being\ngiven, the two captains stood on the after part\nof the main-deck, a privileged spot, no one\nbeing near but the servant.", "uuid" : "E113E4CA", "_id" : { "$oid" : "50a33c1f91b44d0200000010" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[33]", "startOffset" : 0, "end" : "/div[1]/p[34]", "endOffset" : 158, "_id" : { "$oid" : "50a33c1f91b44d0200000011" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352875039013 }, "created" : { "$date" : 1352875039013 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a33cd591b44d0200000012", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "Signs of Babo's control over Cereno", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "the black with one arm still encircled\nhis master, at the same time keeping his eye\nfixed on his face, as if to watch for the first\nsign of complete restoration, or relapse, as the\nevent might prove.", "uuid" : "B7ABF4E9", "_id" : { "$oid" : "50a33cd591b44d0200000012" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[36]", "startOffset" : 280, "end" : "/div[1]/p[36]", "endOffset" : 480, "_id" : { "$oid" : "50a33cd591b44d0200000013" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352875221302 }, "created" : { "$date" : 1352875221302 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a33d3791b44d0200000014", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "Babo now speaks for Cereno", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "\"His mind wanders. He was thinking of\nthe plague that followed the gales,\" plaintively\nsighed the servant; \"my poor, poor master!\"\nwringing one hand, and with the other\nwiping the mouth. \"But be patient, Señor,\"\nagain turning to Captain Delano, \"these fits\ndo not last long; master will soon be himself.\"", "uuid" : "E4C0C108", "_id" : { "$oid" : "50a33d3791b44d0200000014" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[40]", "startOffset" : 0, "end" : "/div[1]/p[41]", "endOffset" : 0, "_id" : { "$oid" : "50a33d3791b44d0200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352875319414 }, "created" : { "$date" : 1352875319414 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a3404291b44d0200000016", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "Again, Delano likes Babo.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "\"But it is Babo here to whom, under God, I\nowe not only my own preservation, but likewise\nto him, chiefly, the merit is due, of pacifying\nhis more ignorant brethren, when at intervals\ntempted to murmurings.\"\n\n\"Ah, master,\" sighed the black, bowing his\nface, \"don't speak of me; Babo is nothing;\nwhat Babo has done was but duty.\"\n\n\"Faithful fellow!\" cried Captain Delano.\n\"Don Benito, I envy you such a friend; slave\nI cannot call him.\"", "uuid" : "B37374B1", "_id" : { "$oid" : "50a3404291b44d0200000016" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[47]", "startOffset" : 0, "end" : "/div[1]/p[50]", "endOffset" : 0, "_id" : { "$oid" : "50a3404291b44d0200000017" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352876098173 }, "created" : { "$date" : 1352876098173 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a3424857e44b020000000e", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "Babo's command is represented her in a very subtle way", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "\"This excitement is bad for master,\" whispered\nthe servant, taking his arm, and with\nsoothing words gently drawing him aside.", "uuid" : "24CE96C9", "_id" : { "$oid" : "50a3424857e44b020000000e" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[56]", "startOffset" : 0, "end" : "/div[1]/p[56]", "endOffset" : 125, "_id" : { "$oid" : "50a3424857e44b020000000f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352876616124 }, "created" : { "$date" : 1352876616124 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a3427457e44b0200000010", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "The narrator sounds to tell Delano's perspective.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "gently", "uuid" : "D299C4B6", "_id" : { "$oid" : "50a3427457e44b0200000010" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[56]", "startOffset" : 100, "end" : "/div[1]/p[56]", "endOffset" : 106, "_id" : { "$oid" : "50a3427457e44b0200000011" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352876660515 }, "created" : { "$date" : 1352876660515 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50a342cf57e44b0200000012" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1352876751642 }, "groups" : [ "21L.000J" ], "id" : "50a342cf57e44b0200000012", "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "quote" : "When Don Benito returned, the American\nwas pained to observe that his hopefulness, like\nthe sudden kindling in his cheek, was but\nfebrile and transient.", "ranges" : [ { "start" : "/div[1]/p[57]", "startOffset" : 0, "end" : "/div[1]/p[57]", "endOffset" : 152, "_id" : { "$oid" : "50a342cf57e44b0200000013" } } ], "tags" : [], "text" : "Babo destroys him.", "updated" : { "$date" : 1352876768232 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "uuid" : "6410D63A" } -{ "id" : "50a3461f57e44b0200000014", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "F#!%...", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Presently, while standing with his host,\nlooking forward upon the decks below, he was\nstruck by one of those instances of insubordination\npreviously alluded to. Three black\nboys, with two Spanish boys, were sitting\ntogether on the hatches, scraping a rude wooden\nplatter, in which some scanty mess had\nrecently been cooked. Suddenly, one of the\nblack boys, enraged at a word dropped by one\nof his white companions, seized a knife, and,\n[pg 141]\n\nthough called to forbear by one of the oakum-pickers,\nstruck the lad over the head, inflicting\na gash from which blood flowed.", "uuid" : "5F34CB48", "_id" : { "$oid" : "50a3461f57e44b0200000014" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[61]", "startOffset" : 0, "end" : "/div[1]/p[61]", "endOffset" : 572, "_id" : { "$oid" : "50a3461f57e44b0200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352877599607 }, "created" : { "$date" : 1352877599607 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a3463757e44b0200000016", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "Yeah, sure...", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "To which the pale Don Benito\ndully muttered, that it was merely the sport\nof the lad.", "uuid" : "829BF23C", "_id" : { "$oid" : "50a3463757e44b0200000016" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[62]", "startOffset" : 55, "end" : "/div[1]/p[62]", "endOffset" : 140, "_id" : { "$oid" : "50a3463757e44b0200000017" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352877623132 }, "created" : { "$date" : 1352877623132 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a3468f57e44b0200000018", "user" : "jlucas16@mit.edu", "username" : "João Lucas C.", "text" : "this is the second appearance of the expression half-lunatic. it represents signs Cereno tries to pass to Delano", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "At these words the Spaniard turned upon\nthe American one of his sudden, staring, half-lunatic\nlooks", "uuid" : "BDDBAD0E", "_id" : { "$oid" : "50a3468f57e44b0200000018" }, "permissions" : { "delete" : [ "jlucas16@mit.edu" ], "update" : [ "jlucas16@mit.edu" ], "admin" : [ "jlucas16@mit.edu" ], "read" : [ "jlucas16@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[64]", "startOffset" : 0, "end" : "/div[1]/p[64]", "endOffset" : 99, "_id" : { "$oid" : "50a3468f57e44b0200000019" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352877711010 }, "created" : { "$date" : 1352877711010 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a4157457e44b020000001e", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Shows Babo in a scene of power, superior to scared Cereno", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Not\nunaffected by the close sight of the gleaming\nsteel, Don Benito nervously shuddered; his\nusual ghastliness was heightened by the lather,\nwhich lather, again, was intensified in its hue\nby the contrasting sootiness of the negro's body.", "uuid" : "85AF0569", "_id" : { "$oid" : "50a4157457e44b020000001e" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 413, "end" : "/div[1]/p[258]", "endOffset" : 651, "_id" : { "$oid" : "50a4157457e44b020000001f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352930676076 }, "created" : { "$date" : 1352930676076 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a415a057e44b0200000020", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Black was in power again, shows the peculiarity of the scene as well as reflects message of Babo being the one who's actually in control", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "that in the black he saw a headsman, and in\nthe white a man at the block", "uuid" : "DACD895F", "_id" : { "$oid" : "50a415a057e44b0200000020" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 790, "end" : "/div[1]/p[258]", "endOffset" : 862, "_id" : { "$oid" : "50a415a057e44b0200000021" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352930720796 }, "created" : { "$date" : 1352930720796 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a415be91b44d020000001a", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Shows how people deny the truth in that time", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "But this was\none of those antic conceits, appearing and vanishing\nin a breath, from which, perhaps, the\nbest regulated mind is not always free.", "uuid" : "D70DBE8B", "_id" : { "$oid" : "50a415be91b44d020000001a" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 864, "end" : "/div[1]/p[258]", "endOffset" : 1007, "_id" : { "$oid" : "50a415be91b44d020000001b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352930750008 }, "created" : { "$date" : 1352930750008 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a4163557e44b0200000022", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "A threat as well as a very overpowering scene, really shows how Babo is in control. Sort of talking to Benito as if he's a child", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "\"You must not shake so, master. See, Don\nAmasa, master always shakes when I shave\nhim. And yet master knows I never yet have\ndrawn blood, though it's true, if master will\nshake so, I may some of these times.", "uuid" : "612F92DD", "_id" : { "$oid" : "50a4163557e44b0200000022" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[263]", "startOffset" : 0, "end" : "/div[1]/p[263]", "endOffset" : 207, "_id" : { "$oid" : "50a4163557e44b0200000023" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352930869099 }, "created" : { "$date" : 1352930869099 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a4168491b44d020000001c", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Amasa sees the truth but yet again pushes it aside", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "No sword drawn before James the First of\nEngland, no assassination in that timid King's\npresence, could have produced a more terrified\naspect than was now presented by Don\nBenito.", "uuid" : "B3AD0F49", "_id" : { "$oid" : "50a4168491b44d020000001c" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[266]", "startOffset" : 0, "end" : "/div[1]/p[266]", "endOffset" : 179, "_id" : { "$oid" : "50a4168491b44d020000001d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352930948845 }, "created" : { "$date" : 1352930948845 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a4179a91b44d020000001e", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Shows Babo in power again", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "All being over at last, the standard of Spain\nremoved, tumbled up, and tossed back into the\nflag-locker, the negro's warm breath blowing\naway any stray hair, which might have lodged\ndown his master's neck; collar and cravat\nreadjusted; a speck of lint whisked off the\nvelvet lapel; all this being done; backing off\na little space, and pausing with an expression\nof subdued self-complacency, the servant\nfor a moment surveyed his master, as, in\ntoilet at least, the creature of his own tasteful\nhands.", "uuid" : "E4F2D4DC", "_id" : { "$oid" : "50a4179a91b44d020000001e" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[273]", "startOffset" : 0, "end" : "/div[1]/p[273]", "endOffset" : 500, "_id" : { "$oid" : "50a4179a91b44d020000001f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352931226854 }, "created" : { "$date" : 1352931226854 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a41b7191b44d0200000020", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "as if", "uuid" : "A9BD34BF", "_id" : { "$oid" : "50a41b7191b44d0200000020" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[250]", "startOffset" : 46, "end" : "/div[1]/p[250]", "endOffset" : 53, "_id" : { "$oid" : "50a41b7191b44d0200000021" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352932209473 }, "created" : { "$date" : 1352932209473 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a41b8b57e44b0200000024", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "events have not been favorable\nto much order in my arrangements.\"", "uuid" : "E679921B", "_id" : { "$oid" : "50a41b8b57e44b0200000024" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[249]", "startOffset" : 12, "end" : "/div[1]/p[249]", "endOffset" : 78, "_id" : { "$oid" : "50a41b8b57e44b0200000025" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352932235309 }, "created" : { "$date" : 1352932235309 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50a421fc57e44b0200000026" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1352933884764 }, "groups" : [ "21L.000J" ], "id" : "50a421fc57e44b0200000026", "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "quote" : "now", "ranges" : [ { "start" : "/div[1]/p[236]", "startOffset" : 482, "end" : "/div[1]/p[236]/span[1]", "endOffset" : 3, "_id" : { "$oid" : "50a421fc57e44b0200000027" } } ], "tags" : [], "text" : "Time to somewhat reinstall discipline. Cereno nearly forgot the script.", "updated" : { "$date" : 1352934040798 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "user" : "wandia@mit.edu", "username" : "Sarah W.", "uuid" : "09BBFFFA" } -{ "id" : "50a422cc57e44b0200000028", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Benito reiterates the cause of his seemingly unfriendly behavior. he is repentant", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Ah, my dear friend,\" Don Benito once\nsaid, \"at those very times when you thought\nme so morose and ungrateful, nay, when, as\nyou now admit, you half thought me plotting\nyour murder, at those very times my heart was\nfrozen; I could not look at you, thinking of\nwhat, both on board this ship and your own,\nhung, from other hands, over my kind benefactor.\nAnd as God lives, Don Amasa, I know\nnot whether desire for my own safety alone\ncould have nerved me to that leap into your\nboat, had it not been for the thought that, did\nyou, unenlightened, return to your ship, you,\nmy best friend, with all who might be with\nyou, stolen upon, that night, in your hammocks,\nwould never in this world have wakened\nagain. Do but think how you walked this\ndeck, how you sat in this cabin, every inch of\nground mined into honey-combs under you.\nHad I dropped the least hint, made the least", "uuid" : "E874CF81", "_id" : { "$oid" : "50a422cc57e44b0200000028" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[401]", "startOffset" : 1, "end" : "/div[1]/p[401]", "endOffset" : 873, "_id" : { "$oid" : "50a422cc57e44b0200000029" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352934092653 }, "created" : { "$date" : 1352934092653 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a422f731c41e0200000002", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Benito Christian? ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "\"God\ncharmed your life", "uuid" : "3BF7A1FF", "_id" : { "$oid" : "50a422f731c41e0200000002" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[403]", "startOffset" : 82, "end" : "/div[1]/p[403]", "endOffset" : 104, "_id" : { "$oid" : "50a422f731c41e0200000003" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352934135754 }, "created" : { "$date" : 1352934135754 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a4234357e44b020000002a", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "He is owing his life to Providence and luck the he was of a good temper....was it good temper or being naive??", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "Yes, all is owing to Providence, I know:\nbut the temper of my mind that morning was\nmore than commonly pleasant, while the sight\nof so much suffering, more apparent than real,\nadded to my good-nature, compassion, and\ncharity, happily interweaving the three. Had\nit been otherwise, doubtless, as you hint, some\nof my interferences might have ended unhappily\nenough", "uuid" : "6AA1B442", "_id" : { "$oid" : "50a4234357e44b020000002a" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[404]", "startOffset" : 1, "end" : "/div[1]/p[404]", "endOffset" : 364, "_id" : { "$oid" : "50a4234357e44b020000002b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352934211378 }, "created" : { "$date" : 1352934211378 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a423a657e44b020000002c", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Awww Benito.....he expresses his gratitude and recognized Delano didnt have to help. Very contrasting to Delano's account where Benito tries to ruin Delano's reputation. ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "\"you were with me all day; stood with me,\nsat with me, talked with me, looked at me, ate\nwith me, drank with me; and yet, your last\nact was to clutch for a monster, not only an\ninnocent man, but the most pitiable of all men.\nTo such degree may malign machinations and\ndeceptions impose. So far may even the best\nman err, in judging the conduct of one with\nthe recesses of whose condition he is not acquainted.\nBut you were forced to it; and you\nwere in time undeceived. Would that, in\nboth respects, it was so ever, and with all\nmen.\"", "uuid" : "CE6799BF", "_id" : { "$oid" : "50a423a657e44b020000002c" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[405]", "startOffset" : 40, "end" : "/div[1]/p[405]", "endOffset" : 574, "_id" : { "$oid" : "50a423a657e44b020000002d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352934310187 }, "created" : { "$date" : 1352934310187 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a423f957e44b020000002e", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Slavery....not matter from who....yokes the human spirit. Melville may have been using irony to show this. irony because the ones who usually inflict slavery are the ones who suffer tremendously from it", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "You are saved,\" cried Captain Delano,\nmore and more astonished and pained; \"you\nare saved: what has cast such a shadow upon\nyou?\"\n\n\"The negro.\"", "uuid" : "BA22CB1E", "_id" : { "$oid" : "50a423f957e44b020000002e" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[410]", "startOffset" : 1, "end" : "/div[1]/p[411]", "endOffset" : 12, "_id" : { "$oid" : "50a423f957e44b020000002f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352934393178 }, "created" : { "$date" : 1352934393178 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a4245557e44b0200000030", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "He was never able to recover from the traumatizing experience. The threats, watching his companions be murdered and also just having to bend to a slave. His spirit is fatally crushed", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "follow his leader.", "uuid" : "6A76BCAF", "_id" : { "$oid" : "50a4245557e44b0200000030" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[416]", "startOffset" : 574, "end" : "/div[1]/p[416]", "endOffset" : 592, "_id" : { "$oid" : "50a4245557e44b0200000031" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352934485524 }, "created" : { "$date" : 1352934485524 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a424d857e44b0200000032", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "Interesting description. He is obv trying to paint a bad picture of these men", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "four elderly\ngrizzled negroes, their heads like black, doddered\nwillow tops, who, in venerable contrast\nto the tumult below them, were couched,\nsphynx-like, one on the starboard cat-head,\nanother on the larboard, and the remaining pair\nface to face on the opposite bulwarks above\nthe main-chains. They each had bits of unstranded\nold junk in their hands, and, with a\nsort of stoical self-content, were picking the\njunk into oakum, a small heap of which lay\nby their sides. They accompanied the task with\na continuous, low, monotonous, chant; droning\n[pg 119]\n\nand drilling away like so many gray-headed\nbag-pipers playing a funeral march.", "uuid" : "47923FE9", "_id" : { "$oid" : "50a424d857e44b0200000032" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[17]", "startOffset" : 217, "end" : "/div[1]/p[17]", "endOffset" : 855, "_id" : { "$oid" : "50a424d857e44b0200000033" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352934616576 }, "created" : { "$date" : 1352934616576 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50a4261757e44b0200000034" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1352934935481 }, "groups" : [ "21L.000J" ], "id" : "50a4261757e44b0200000034", "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "quote" : "master", "ranges" : [ { "start" : "/div[1]/p[238]", "startOffset" : 9, "end" : "/div[1]/p[238]", "endOffset" : 15, "_id" : { "$oid" : "50a4261757e44b0200000035" } } ], "tags" : [], "text" : "Who is the master?", "updated" : { "$date" : 1352946828491 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "user" : "wandia@mit.edu", "username" : "Sarah W.", "uuid" : "24CAA730" } -{ "id" : "50a4261d31c41e0200000004", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "master", "uuid" : "4212655C", "_id" : { "$oid" : "50a4261d31c41e0200000004" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[238]", "startOffset" : 98, "end" : "/div[1]/p[238]", "endOffset" : 104, "_id" : { "$oid" : "50a4261d31c41e0200000005" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352934941724 }, "created" : { "$date" : 1352934941724 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a4262331c41e0200000006", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "master", "uuid" : "E582C1D7", "_id" : { "$oid" : "50a4262331c41e0200000006" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[238]", "startOffset" : 123, "end" : "/div[1]/p[238]", "endOffset" : 129, "_id" : { "$oid" : "50a4262331c41e0200000007" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352934947334 }, "created" : { "$date" : 1352934947334 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a4265d57e44b0200000036", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "in the middle of\nthe day", "uuid" : "5845B937", "_id" : { "$oid" : "50a4265d57e44b0200000036" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[241]", "startOffset" : 165, "end" : "/div[1]/p[241]", "endOffset" : 189, "_id" : { "$oid" : "50a4265d57e44b0200000037" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352935005744 }, "created" : { "$date" : 1352935005744 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a4266557e44b0200000038", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "anxious fidelity", "uuid" : "D35E980C", "_id" : { "$oid" : "50a4266557e44b0200000038" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[241]", "startOffset" : 244, "end" : "/div[1]/p[241]", "endOffset" : 260, "_id" : { "$oid" : "50a4266557e44b0200000039" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352935013619 }, "created" : { "$date" : 1352935013619 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a426b257e44b020000003a", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "timely\ninterruption served to rally his master from the\nmood which had evidently been coming upon\nhim.", "uuid" : "3AD96B2F", "_id" : { "$oid" : "50a426b257e44b020000003a" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[241]", "startOffset" : 313, "end" : "/div[1]/p[241]", "endOffset" : 416, "_id" : { "$oid" : "50a426b257e44b020000003b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352935090188 }, "created" : { "$date" : 1352935090188 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a428e557e44b020000003c", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "slept but illy, with alternate\nvisitations of sad thoughts and bad dreams.", "uuid" : "265B2812", "_id" : { "$oid" : "50a428e557e44b020000003c" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[244]", "startOffset" : 1161, "end" : "/div[1]/p[244]", "endOffset" : 1236, "_id" : { "$oid" : "50a428e557e44b020000003d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352935653159 }, "created" : { "$date" : 1352935653159 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50a4293657e44b020000003e" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1352935734324 }, "groups" : [ "21L.000J" ], "id" : "50a4293657e44b020000003e", "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "quote" : "Here", "ranges" : [ { "start" : "/div[1]/p[250]", "startOffset" : 0, "end" : "/div[1]/p[250]", "endOffset" : 4, "_id" : { "$oid" : "50a4293657e44b020000003f" } } ], "tags" : [], "text" : "Babo again, high on his guard to ensure that Cereno stays in line. Cereno has given a subtle hint as to what is happening.", "updated" : { "$date" : 1352935847559 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "user" : "wandia@mit.edu", "username" : "Sarah W.", "uuid" : "158FD87B" } -{ "id" : "50a42ab057e44b0200000040", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "What Delano thinks. The description is quite derogatory, but the next paragraph makes one dispel this thought. ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "There is something in the negro which, in a\npeculiar way, fits him for avocations about\none's person. Most negroes are natural valets\nand hair-dressers; taking to the comb and\nbrush congenially as to the castinets, and flourishing\nthem apparently with almost equal satisfaction.\nThere is, too, a smooth tact about\n[pg 200]\n\nthem in this employment, with a marvelous,\nnoiseless, gliding briskness, not ungraceful in\nits way, singularly pleasing to behold, and still\nmore so to be the manipulated subject of.\nAnd above all is the great gift of good-humor.\nNot the mere grin or laugh is here meant.\nThose were unsuitable. But a certain easy\ncheerfulness, harmonious in every glance and\ngesture; as though God had set the whole\nnegro to some pleasant tune.", "uuid" : "8B889AF2", "_id" : { "$oid" : "50a42ab057e44b0200000040" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[251]", "startOffset" : 0, "end" : "/div[1]/p[251]", "endOffset" : 752, "_id" : { "$oid" : "50a42ab057e44b0200000041" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352936112271 }, "created" : { "$date" : 1352936112271 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a42b1b57e44b0200000042", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Of course he wouldn't want to talk, he's scared!", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Don Benito appear disposed to\nrenew any.", "uuid" : "6E5861F0", "_id" : { "$oid" : "50a42b1b57e44b0200000042" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[257]", "startOffset" : 149, "end" : "/div[1]/p[257]", "endOffset" : 189, "_id" : { "$oid" : "50a42b1b57e44b0200000043" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352936219630 }, "created" : { "$date" : 1352936219630 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a42b6457e44b0200000044", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "This sounds menacing. ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "sharpest", "uuid" : "7D0F0FAB", "_id" : { "$oid" : "50a42b6457e44b0200000044" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 72, "end" : "/div[1]/p[258]", "endOffset" : 80, "_id" : { "$oid" : "50a42b6457e44b0200000045" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352936292396 }, "created" : { "$date" : 1352936292396 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a42bca57e44b0200000046", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "This sounds like an execution. The moment of cold suspense just before the kill.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "made a gesture\n[pg 203]\n\nas if to begin, but midway stood suspended for\nan instant, one hand elevating the razor, the\nother professionally dabbling among the bubbling\nsuds on the Spaniard's lank neck.", "uuid" : "1B7C0196", "_id" : { "$oid" : "50a42bca57e44b0200000046" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 212, "end" : "/div[1]/p[258]", "endOffset" : 412, "_id" : { "$oid" : "50a42bca57e44b0200000047" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352936394258 }, "created" : { "$date" : 1352936394258 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a42c6257e44b0200000048", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Why isn't Delano interpreting all these hints? A master usually wields all authority and is in full control of his subjects so the fact that Cereno is frightened should make Delano suspicious. ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Don Benito nervously shuddered", "uuid" : "60AFA13F", "_id" : { "$oid" : "50a42c6257e44b0200000048" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 470, "end" : "/div[1]/p[258]", "endOffset" : 500, "_id" : { "$oid" : "50a42c6257e44b0200000049" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352936546987 }, "created" : { "$date" : 1352936546987 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a42c8431c41e0200000008", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "It's VERY strange!", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "somewhat peculiar", "uuid" : "82D93D59", "_id" : { "$oid" : "50a42c8431c41e0200000008" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 677, "end" : "/div[1]/p[258]", "endOffset" : 694, "_id" : { "$oid" : "50a42c8431c41e0200000009" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352936580342 }, "created" : { "$date" : 1352936580342 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a42d8757e44b020000004a", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Why isn't this man interpreting all these? He notices so much but still can't join the dots. Or is he so used to slaves being 'inferior' that his mind cannot conjure the thought that things can be different.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "saw the\ntwo thus postured, could he resist the vagary,\nthat in the black he saw a headsman, and in\nthe white a man at the block.", "uuid" : "67D061C8", "_id" : { "$oid" : "50a42d8757e44b020000004a" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 735, "end" : "/div[1]/p[258]", "endOffset" : 863, "_id" : { "$oid" : "50a42d8757e44b020000004b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352936839753 }, "created" : { "$date" : 1352936839753 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a42dbe57e44b020000004c", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "antic conceits", "uuid" : "9C30491E", "_id" : { "$oid" : "50a42dbe57e44b020000004c" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[258]", "startOffset" : 890, "end" : "/div[1]/p[258]", "endOffset" : 904, "_id" : { "$oid" : "50a42dbe57e44b020000004d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352936894824 }, "created" : { "$date" : 1352936894824 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a42e0d31c41e020000000a", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Again Don Benito faintly shuddered.", "uuid" : "2904BC7B", "_id" : { "$oid" : "50a42e0d31c41e020000000a" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[262]", "startOffset" : 0, "end" : "/div[1]/p[262]", "endOffset" : 35, "_id" : { "$oid" : "50a42e0d31c41e020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352936973489 }, "created" : { "$date" : 1352936973489 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a42e3657e44b020000004e", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Babo keeps controlling everything.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "please go on with your talk about the gale,\nand all that; master can hear, and, between\ntimes, master can answer.\"", "uuid" : "DD541F55", "_id" : { "$oid" : "50a42e3657e44b020000004e" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[263]", "startOffset" : 256, "end" : "/div[1]/p[263]", "endOffset" : 370, "_id" : { "$oid" : "50a42e3657e44b020000004f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352937014008 }, "created" : { "$date" : 1352937014008 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a42ec031c41e020000000c", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Babo again tightening his leash on Cereno, though in a more extreme manner. Nothing bypasses him.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "start he gave, or\na sudden gawky roll of the hull in the calm,\nor a momentary unsteadiness of the servant's\nhand, however it was, just then the razor drew\nblood, spots of which stained the creamy lather\nunder the throat:", "uuid" : "32DFA370", "_id" : { "$oid" : "50a42ec031c41e020000000c" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[265]", "startOffset" : 119, "end" : "/div[1]/p[265]", "endOffset" : 339, "_id" : { "$oid" : "50a42ec031c41e020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352937152248 }, "created" : { "$date" : 1352937152248 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a42f1331c41e020000000e", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "This sound like a threat; like more blood shall be drawn.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "See, master—you shook so—here's Babo's\nfirst blood.\"", "uuid" : "598C2D12", "_id" : { "$oid" : "50a42f1331c41e020000000e" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[265]", "startOffset" : 558, "end" : "/div[1]/p[265]", "endOffset" : 611, "_id" : { "$oid" : "50a42f1331c41e020000000f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352937235475 }, "created" : { "$date" : 1352937235475 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a42f2631c41e0200000010", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "a more terrified\naspect than was now presented by Don\nBenito.", "uuid" : "19D718E1", "_id" : { "$oid" : "50a42f2631c41e0200000010" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[266]", "startOffset" : 118, "end" : "/div[1]/p[266]", "endOffset" : 179, "_id" : { "$oid" : "50a42f2631c41e0200000011" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352937254714 }, "created" : { "$date" : 1352937254714 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a42f6757e44b0200000050", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Poor fellow? This is the captain of a ship, just like Delano, this ought to look strange to Delano.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Poor fellow, thought Captain Delano, so\nnervous he can't even bear the sight of barber's\nblood", "uuid" : "8487C1FA", "_id" : { "$oid" : "50a42f6757e44b0200000050" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[267]", "startOffset" : 0, "end" : "/div[1]/p[267]", "endOffset" : 94, "_id" : { "$oid" : "50a42f6757e44b0200000051" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352937319028 }, "created" : { "$date" : 1352937319028 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a42f8a31c41e0200000012", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "But answer Don Amasa,\nplease, master, while I wipe this ugly stuff\noff the razor, and strop it again.\"", "uuid" : "2E160911", "_id" : { "$oid" : "50a42f8a31c41e0200000012" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[268]", "startOffset" : 151, "end" : "/div[1]/p[268]", "endOffset" : 253, "_id" : { "$oid" : "50a42f8a31c41e0200000013" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352937354033 }, "created" : { "$date" : 1352937354033 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a42fbe31c41e0200000014", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "the vehemence of the exercise\ncausing the muscles of his face to twitch\nrather strangely.", "uuid" : "F63C13AE", "_id" : { "$oid" : "50a42fbe31c41e0200000014" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[271]", "startOffset" : 148, "end" : "/div[1]/p[271]", "endOffset" : 238, "_id" : { "$oid" : "50a42fbe31c41e0200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352937406636 }, "created" : { "$date" : 1352937406636 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a43da257e44b0200000052", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "indeed, he sat so pale and\nrigid now, that the negro seemed a Nubian\nsculptor finishing off a white statue-head.", "uuid" : "86C7F0CD", "_id" : { "$oid" : "50a43da257e44b0200000052" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[272]", "startOffset" : 389, "end" : "/div[1]/p[272]", "endOffset" : 501, "_id" : { "$oid" : "50a43da257e44b0200000053" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352940962568 }, "created" : { "$date" : 1352940962568 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a43e6b57e44b0200000054", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "He relapses into gloom since the shaving scene is a reinforcement that Cereno is no longer in charge. The reversal of the master-slave roles is well defined in this scene.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Seeing him relapsing into forbidding\n[pg 210]\n\ngloom", "uuid" : "F6F9BB6C", "_id" : { "$oid" : "50a43e6b57e44b0200000054" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[275]", "startOffset" : 95, "end" : "/div[1]/p[275]", "endOffset" : 147, "_id" : { "$oid" : "50a43e6b57e44b0200000055" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352941163257 }, "created" : { "$date" : 1352941163257 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a44fd857e44b0200000056", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "The time for Cereno to be reminded who is in charge.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "shaving-time", "uuid" : "5C53B53B", "_id" : { "$oid" : "50a44fd857e44b0200000056" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[236]", "startOffset" : 405, "end" : "/div[1]/p[236]", "endOffset" : 419, "_id" : { "$oid" : "50a44fd857e44b0200000057" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352945624844 }, "created" : { "$date" : 1352945624844 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a45c6831c41e0200000016", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "possible reference to Saint Dominic\nlot's of his followers (wore black robes i think?) played key roles in the Spanish Inquisition", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "San Dominick", "uuid" : "6FA606B9", "_id" : { "$oid" : "50a45c6831c41e0200000016" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[30]", "startOffset" : 332, "end" : "/div[1]/p[30]", "endOffset" : 344, "_id" : { "$oid" : "50a45c6831c41e0200000017" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352948840069 }, "created" : { "$date" : 1352948840069 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a45cc331c41e0200000018", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "set six years before delano's narrative. wasn't there a slave rebellion around that timish?\n\nYES! \"slaves revolted on the island of San Domingo in the year 1799\"\n\nboom.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "1799", "uuid" : "3D56EDCC", "_id" : { "$oid" : "50a45cc331c41e0200000018" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 12, "end" : "/div[1]/p[1]", "endOffset" : 16, "_id" : { "$oid" : "50a45cc331c41e0200000019" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352948931560 }, "created" : { "$date" : 1352948931560 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a45d0757e44b0200000058", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "possible links to ships representing the introduction of slavery to the new world by the spaniards?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "principal\nrelic of faded grandeur was the ample oval of\nthe shield-like stern-piece, intricately carved\nwith the arms of Castile and Leon", "uuid" : "AEB68D49", "_id" : { "$oid" : "50a45d0757e44b0200000058" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 816, "end" : "/div[1]/p[11]", "endOffset" : 953, "_id" : { "$oid" : "50a45d0757e44b0200000059" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352948999542 }, "created" : { "$date" : 1352948999542 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a45d7d57e44b020000005a", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "different usage of the razor between here and delano.\nin delano's narrative the razor is used as a weapon-\"He seemed to aim at his throat, and it bled shockingly\" (120)\nhere it's a sculpting tool for babos' role in the story", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "with other impromptu touches evincing\nthe hand of a master; while, like any resigned\ngentleman in barber's hands, Don Benito bore\nall, much less uneasily, at least than he had\ndone the razoring; indeed, he sat so pale and\nrigid now, that the negro seemed a Nubian\nsculptor finishing off a white statue-head.", "uuid" : "48BD0B91", "_id" : { "$oid" : "50a45d7d57e44b020000005a" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[272]", "startOffset" : 194, "end" : "/div[1]/p[272]", "endOffset" : 501, "_id" : { "$oid" : "50a45d7d57e44b020000005b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352949117080 }, "created" : { "$date" : 1352949117080 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a45f2431c41e020000001a", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "captain appears compassionate towards the slaves when showing restraint in how he treats them and by not letting his men kill slaves unnecessarily.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Martinez Gola, who, having found a razor\nin the pocket of an old jacket of his, which one of the shackled\nnegroes had on, was aiming it at the negro's throat; that\nthe noble Captain Amasa Delano also wrenched from the\nhand of Bartholomew Barlo a dagger, secreted at the time\nof the massacre of the whites, with which he was in the act\nof stabbing a shackled negro", "uuid" : "91D2D126", "_id" : { "$oid" : "50a45f2431c41e020000001a" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[20]", "startOffset" : 4155, "end" : "/div[1]/blockquote[1]/p[20]", "endOffset" : 4518, "_id" : { "$oid" : "50a45f2431c41e020000001b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352949540614 }, "created" : { "$date" : 1352949540614 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50a461e031c41e020000001c" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1352950240382 }, "groups" : [ "21L.000J" ], "id" : "50a461e031c41e020000001c", "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "quote" : "genially, just as other men to\nNewfoundland dogs.", "ranges" : [ { "start" : "/div[1]/p[252]", "startOffset" : 1096, "end" : "/div[1]/p[253]", "endOffset" : 0, "_id" : { "$oid" : "50a461e031c41e020000001d" } } ], "tags" : [], "text" : "This is racist as much as Delano seems to mean well. He places black people at the same level as dogs; that they are inferior.", "updated" : { "$date" : 1352950368851 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "user" : "wandia@mit.edu", "username" : "Sarah W.", "uuid" : "C0601048" } -{ "__v" : 0, "_id" : { "$oid" : "50a4636731c41e020000001e" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1352950631791 }, "groups" : [ "21L.000J" ], "id" : "50a4636731c41e020000001e", "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "quote" : "the black's informally\ntaking from the flag-locker a great piece of\n[pg 202]\n\nbunting of all hues, and lavishly tucking it\nunder his master's chin for an apron.", "ranges" : [ { "start" : "/div[1]/p[254]", "startOffset" : 110, "end" : "/div[1]/p[254]", "endOffset" : 271, "_id" : { "$oid" : "50a4636731c41e020000001f" } } ], "tags" : [], "text" : "This is disrespectful. Obviously a display of Babo's contempt towards Spain. Flags are usually used as a symbol of loyalty for citizens towards their country. Is this showing that Cereno's loyalty is no longer towards Spain? That it's to Babo? ", "updated" : { "$date" : 1352950741233 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "user" : "wandia@mit.edu", "username" : "Sarah W.", "uuid" : "C9785F23" } -{ "id" : "50a4658931c41e0200000020", "user" : "rachelcr@mit.edu", "username" : "Rachel R.", "text" : "captain delano believes the best in people and is not quick to judge", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "inflicting\na gash from which blood flowed.\n\nIn amazement, Captain Delano inquired what\nthis meant. To which the pale Don Benito\ndully muttered, that it was merely the sport\nof the lad.", "uuid" : "9F38CEB6", "_id" : { "$oid" : "50a4658931c41e0200000020" }, "permissions" : { "delete" : [ "rachelcr@mit.edu" ], "update" : [ "rachelcr@mit.edu" ], "admin" : [ "rachelcr@mit.edu" ], "read" : [ "rachelcr@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[61]", "startOffset" : 529, "end" : "/div[1]/p[62]", "endOffset" : 140, "_id" : { "$oid" : "50a4658931c41e0200000021" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352951177498 }, "created" : { "$date" : 1352951177498 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50a4669a31c41e0200000022" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1352951450111 }, "groups" : [ "21L.000", "21L.000J" ], "id" : "50a4669a31c41e0200000022", "permissions" : { "delete" : [ "deldar@mit.edu" ], "update" : [ "deldar@mit.edu" ], "admin" : [ "deldar@mit.edu" ], "read" : [ "deldar@mit.edu" ] }, "quote" : "Yes, all is owing to Providence, I know:\nbut the temper of my mind that morning was\nmore than commonly pleasant, while the sight\nof so much suffering, more apparent than real,\nadded to my good-nature, compassion, and\ncharity, happily interweaving the three. Had\nit been otherwise, doubtless, as you hint, some\nof my interferences might have ended unhappily\nenough.", "ranges" : [ { "start" : "/div[1]/p[404]", "startOffset" : 1, "end" : "/div[1]/p[404]", "endOffset" : 365, "_id" : { "$oid" : "50a4669a31c41e0200000023" } } ], "tags" : [], "text" : "Delano's key \"trustful\" passage. ", "updated" : { "$date" : 1352951941220 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "user" : "deldar@mit.edu", "username" : "Daniel E.", "uuid" : "7E4EEC7D" } -{ "__v" : 0, "_id" : { "$oid" : "50a48c4031c41e0200000024" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1352961088104 }, "groups" : [ "21L.000J" ], "id" : "50a48c4031c41e0200000024", "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "quote" : "Whether the ship had a figure-head, or only\na plain beak, was not quite certain, owing to\ncanvas wrapped about that part, either to protect\nit while undergoing a re-furbishing, or else\ndecently to hide its decay. Rudely painted or\nchalked, as in a sailor freak, along the forward", "ranges" : [ { "start" : "/div[1]/p[12]", "startOffset" : 0, "end" : "/div[1]/p[12]", "endOffset" : 280, "_id" : { "$oid" : "50a48c4031c41e0200000025" } } ], "tags" : [], "text" : "This is eerie since I know that Aranda is under the canvas... Also it says 'decently to hide its decay' and we know that Aranda is decaying in there.", "updated" : { "$date" : 1352961159328 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "user" : "daniman@mit.edu", "username" : "Danielle M.", "uuid" : "77295BCE" } -{ "id" : "50a48c8e31c41e0200000026", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "Delano in a nutshell--really slow, lacking good perceptive powers, and embodying the American complacency with slavery", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "blunt-thinking American", "uuid" : "C2EA9C58", "_id" : { "$oid" : "50a48c8e31c41e0200000026" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[52]", "startOffset" : 59, "end" : "/div[1]/p[52]", "endOffset" : 82, "_id" : { "$oid" : "50a48c8e31c41e0200000027" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352961166489 }, "created" : { "$date" : 1352961166489 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a48cf9f016530200000002", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "Delano doesn't realize what is going on until it literally falls in front of him", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Don Benito sprang over\nthe bulwarks, falling at the feet of Captain\nDelano", "uuid" : "1FA2C86E", "_id" : { "$oid" : "50a48cf9f016530200000002" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[362]", "startOffset" : 245, "end" : "/div[1]/p[362]", "endOffset" : 319, "_id" : { "$oid" : "50a48cf9f016530200000003" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352961273214 }, "created" : { "$date" : 1352961273214 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a48cfe31c41e0200000028", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "Melville really plays up this relationsihp", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "\"But it is Babo here to whom, under God, I\nowe not only my own preservation, but likewise\nto him, chiefly, the merit is due, of pacifying\nhis more ignorant brethren, when at intervals\ntempted to murmurings.\"", "uuid" : "35C71CBC", "_id" : { "$oid" : "50a48cfe31c41e0200000028" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[47]", "startOffset" : 0, "end" : "/div[1]/p[47]", "endOffset" : 207, "_id" : { "$oid" : "50a48cfe31c41e0200000029" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352961278689 }, "created" : { "$date" : 1352961278689 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a48d08f016530200000004", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "Everything is a charade", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "\"Ah, master,\" sighed the black, bowing his\nface, \"don't speak of me; Babo is nothing;\nwhat Babo has done was but duty.\"", "uuid" : "95C8AF9B", "_id" : { "$oid" : "50a48d08f016530200000004" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[48]", "startOffset" : 0, "end" : "/div[1]/p[48]", "endOffset" : 119, "_id" : { "$oid" : "50a48d08f016530200000005" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352961288895 }, "created" : { "$date" : 1352961288895 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a48d2f31c41e020000002a", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "too precise?", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "precision in his attire", "uuid" : "A33A0008", "_id" : { "$oid" : "50a48d2f31c41e020000002a" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[50]", "startOffset" : 793, "end" : "/div[1]/p[50]", "endOffset" : 816, "_id" : { "$oid" : "50a48d2f31c41e020000002b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352961327985 }, "created" : { "$date" : 1352961327985 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a48d43f016530200000006", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "Benito falters multiple times, yet delano still disregards all the signs that something is up", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Don Benito faltered", "uuid" : "B5E7FB08", "_id" : { "$oid" : "50a48d43f016530200000006" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[33]", "startOffset" : 0, "end" : "/div[1]/p[33]", "endOffset" : 19, "_id" : { "$oid" : "50a48d43f016530200000007" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352961347687 }, "created" : { "$date" : 1352961347687 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a48d60f016530200000008", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "Babo sees the facade dwindling", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "\"This excitement is bad for master,\" whispered\nthe servant, taking his arm, and with\nsoothing words gently drawing him aside.", "uuid" : "08E831B8", "_id" : { "$oid" : "50a48d60f016530200000008" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[56]", "startOffset" : 0, "end" : "/div[1]/p[56]", "endOffset" : 125, "_id" : { "$oid" : "50a48d60f016530200000009" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352961376390 }, "created" : { "$date" : 1352961376390 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a48da2f01653020000000a", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "You can tell that something is wrong in this scene. It is just another example of Delano being extremely unobservant...", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Three black\nboys, with two Spanish boys, were sitting\ntogether on the hatches, scraping a rude wooden\nplatter, in which some scanty mess had\nrecently been cooked. Suddenly, one of the\nblack boys, enraged at a word dropped by one\nof his white companions, seized a knife, and,\n[pg 141]\n\nthough called to forbear by one of the oakum-pickers,\nstruck the lad over the head, inflicting\na gash from which blood flowed.", "uuid" : "022AC096", "_id" : { "$oid" : "50a48da2f01653020000000a" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[61]", "startOffset" : 161, "end" : "/div[1]/p[61]", "endOffset" : 572, "_id" : { "$oid" : "50a48da2f01653020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352961442923 }, "created" : { "$date" : 1352961442923 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a48db1f01653020000000c", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "this is about as obvious as it gets, and STILL delano doesn't smell a rat", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "struck the lad over the head, inflicting\na gash from which blood flowed.", "uuid" : "28337B01", "_id" : { "$oid" : "50a48db1f01653020000000c" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[61]", "startOffset" : 500, "end" : "/div[1]/p[61]", "endOffset" : 572, "_id" : { "$oid" : "50a48db1f01653020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352961457057 }, "created" : { "$date" : 1352961457057 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a48dcff01653020000000e", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "to buy this excuse he must have been reeeallllly stupid", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "it was merely the sport\nof the lad", "uuid" : "6D7B3DC6", "_id" : { "$oid" : "50a48dcff01653020000000e" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[62]", "startOffset" : 105, "end" : "/div[1]/p[62]", "endOffset" : 139, "_id" : { "$oid" : "50a48dcff01653020000000f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352961487516 }, "created" : { "$date" : 1352961487516 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a48ddcf016530200000010", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "Another example of the facade fading", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Again quivering, the Spaniard paused.", "uuid" : "77575AFB", "_id" : { "$oid" : "50a48ddcf016530200000010" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[81]", "startOffset" : 0, "end" : "/div[1]/p[81]", "endOffset" : 37, "_id" : { "$oid" : "50a48ddcf016530200000011" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352961500690 }, "created" : { "$date" : 1352961500690 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a48e56f016530200000012", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "More of a charade, seems like a desperate attempt", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "\"How like a mute Atufal moves,\" murmured\nthe servant.", "uuid" : "21831D49", "_id" : { "$oid" : "50a48e56f016530200000012" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[86]", "startOffset" : 0, "end" : "/div[1]/p[86]", "endOffset" : 53, "_id" : { "$oid" : "50a48e56f016530200000013" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352961622134 }, "created" : { "$date" : 1352961622134 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a48e6ff016530200000014", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "Babo is acting strange", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Atufal, will you ask my pardon, now?\"\n\nThe black was silent.\n\n\"Again, master,\" murmured the servant,\nwith bitter upbraiding eyeing his countryman,\n\"Again, master; he will bend to master yet.\"", "uuid" : "F2C72CA5", "_id" : { "$oid" : "50a48e6ff016530200000014" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[92]", "startOffset" : 1, "end" : "/div[1]/p[94]", "endOffset" : 129, "_id" : { "$oid" : "50a48e6ff016530200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352961647325 }, "created" : { "$date" : 1352961647325 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50a48f2c31c41e020000002c" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1352961836972 }, "groups" : [ "21L.000J" ], "id" : "50a48f2c31c41e020000002c", "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "quote" : "death for the figure-head, in a human\nskeleton; chalky comment on the chalked\nwords below, \"Follow your leader.\"", "ranges" : [ { "start" : "/div[1]/p[371]", "startOffset" : 320, "end" : "/div[1]/p[371]", "endOffset" : 432, "_id" : { "$oid" : "50a48f2c31c41e020000002d" } } ], "tags" : [], "text" : "Aranda is found, creepy, relates to foreshadowing at the beginning of the novella", "updated" : { "$date" : 1352961858512 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "user" : "daniman@mit.edu", "username" : "Danielle M.", "uuid" : "080D546F" } -{ "id" : "50a48f8231c41e020000002e", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "embellishment of Melville, did not happen in Delano's text", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "that with dagger presented at Captain\nDelano's heart, the black seemed of purpose\nto have leaped there as to his mark.", "uuid" : "5DE67B60", "_id" : { "$oid" : "50a48f8231c41e020000002e" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[365]", "startOffset" : 233, "end" : "/div[1]/p[365]", "endOffset" : 351, "_id" : { "$oid" : "50a48f8231c41e020000002f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352961922728 }, "created" : { "$date" : 1352961922728 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a48feef016530200000016", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "Delano will finally realize the charade the slaves have been hosting", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "Or else—give\nway for your lives,\" he wildly added,\nstarting at a clattering hubbub in the ship,\nabove which rang the tocsin of the hatchet-polishers;\nand seizing Don Benito by the\nthroat he added, \"this plotting pirate means\nmurder!\" Here, in apparent verification of\nthe words, the servant, a dagger in his hand,\nwas seen on the rail overhead, poised, in the\nact of leaping, as if with desperate fidelity to\nbefriend his master to the last; while, seemingly\nto aid the black, the three white sailors\nwere trying to clamber into the hampered\nbow. Meantime, the whole host of negroes, as\n[pg 236]", "uuid" : "F905F61B", "_id" : { "$oid" : "50a48feef016530200000016" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[363]", "startOffset" : 344, "end" : "/div[1]/p[363]/i[1]", "endOffset" : 8, "_id" : { "$oid" : "50a48feef016530200000017" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352962030791 }, "created" : { "$date" : 1352962030791 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a4905e31c41e0200000030", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "Copied almost word for word from Delano's text, though there are a few key additions of words like the presence of pirates", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "The boats were got ready and armed. Captain\nDelano ordered his men into them. He\nwas going himself when Don Benito grasped\nhis arm.\n\n\"What! have you saved my life, Señor, and\nare you now going to throw away your own?\"\n\nThe officers also, for reasons connected with\ntheir interests and those of the voyage, and a\nduty owing to the owners, strongly objected\nagainst their commander's going. Weighing\ntheir remonstrances a moment, Captain Delano\nfelt bound to remain; appointing his chief mate—an\nathletic and resolute man, who had been\na privateer's-man—to head the party.", "uuid" : "ABAAE345", "_id" : { "$oid" : "50a4905e31c41e0200000030" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[377]", "startOffset" : 0, "end" : "/div[1]/p[379]", "endOffset" : 351, "_id" : { "$oid" : "50a4905e31c41e0200000031" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352962142890 }, "created" : { "$date" : 1352962142890 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a490f4f016530200000018", "user" : "daniman@mit.edu", "username" : "Danielle M.", "text" : "Cereno follows his leader but though Melville is led by Delano he doesn't completely follow Delano and has different implications throughout the text", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "follow his leader", "uuid" : "218DC8BA", "_id" : { "$oid" : "50a490f4f016530200000018" }, "permissions" : { "delete" : [ "daniman@mit.edu" ], "update" : [ "daniman@mit.edu" ], "admin" : [ "daniman@mit.edu" ], "read" : [ "daniman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[416]", "startOffset" : 574, "end" : "/div[1]/p[416]", "endOffset" : 591, "_id" : { "$oid" : "50a490f4f016530200000019" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352962292355 }, "created" : { "$date" : 1352962292355 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a4a28f31c41e0200000032", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Much of Delano's feelings towards the Spaniards and Slaves are those of pity... It's almost condescending the way he talks about them all. Maybe it's some kind of 18th century thing...", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "pity", "uuid" : "288D3E1A", "_id" : { "$oid" : "50a4a28f31c41e0200000032" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 137, "end" : "/div[1]/p[24]", "endOffset" : 141, "_id" : { "$oid" : "50a4a28f31c41e0200000033" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352966799557 }, "created" : { "$date" : 1352966799557 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a4a32f31c41e0200000034", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "That would be a convenient trait for the guest have upon a secretly overthrown ship. Babo's lucky. ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "singularly\nundistrustful good-nature", "uuid" : "DDA491DC", "_id" : { "$oid" : "50a4a32f31c41e0200000034" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 480, "end" : "/div[1]/p[4]", "endOffset" : 516, "_id" : { "$oid" : "50a4a32f31c41e0200000035" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352966959506 }, "created" : { "$date" : 1352966959506 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a4a37131c41e0200000036", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Melville pretty much bluntly states that Delano is a nice guy... but he's quite slow. Very slow. ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "along with a benevolent\nheart, more than ordinary quickness and accuracy\nof intellectual perception, may be left to\nthe wise to determine.", "uuid" : "CB81CFAE", "_id" : { "$oid" : "50a4a37131c41e0200000036" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 751, "end" : "/div[1]/p[4]", "endOffset" : 890, "_id" : { "$oid" : "50a4a37131c41e0200000037" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352967025146 }, "created" : { "$date" : 1352967025146 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a4a38cf01653020000001a", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Charitable act.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "presents", "uuid" : "7561F569", "_id" : { "$oid" : "50a4a38cf01653020000001a" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 964, "end" : "/div[1]/p[6]", "endOffset" : 973, "_id" : { "$oid" : "50a4a38cf01653020000001b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352967052522 }, "created" : { "$date" : 1352967052522 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a4a3c531c41e0200000038", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "This phrase is much more haunting after reading the story once...", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "side of a sort of pedestal below the canvas,\nwas the sentence, \"Seguid vuestro jefe\" (follow\nyour leader); while upon the tarnished headboards", "uuid" : "FD671954", "_id" : { "$oid" : "50a4a3c531c41e0200000038" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[12]", "startOffset" : 290, "end" : "/div[1]/p[12]", "endOffset" : 432, "_id" : { "$oid" : "50a4a3c531c41e0200000039" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352967109662 }, "created" : { "$date" : 1352967109662 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a4a40c31c41e020000003a", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Suspicion! ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "in Captain\nDelano's mind, heightened whatever, upon a\nstaid scrutiny, might have seemed unusual;", "uuid" : "F90A50DA", "_id" : { "$oid" : "50a4a40c31c41e020000003a" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[17]", "startOffset" : 82, "end" : "/div[1]/p[17]", "endOffset" : 178, "_id" : { "$oid" : "50a4a40c31c41e020000003b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352967180892 }, "created" : { "$date" : 1352967180892 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a4a44231c41e020000003c", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "How nice of Delano...", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "and a dozen of his private bottles of cider.", "uuid" : "3159EB10", "_id" : { "$oid" : "50a4a44231c41e020000003c" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 448, "end" : "/div[1]/p[22]", "endOffset" : 493, "_id" : { "$oid" : "50a4a44231c41e020000003d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352967234422 }, "created" : { "$date" : 1352967234422 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a4a4b8f01653020000001c", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Don Benito's story about the Cape... ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "It appeared that after the ship had been\nmany days tossed in storms off the Cape,", "uuid" : "B5DCCC5D", "_id" : { "$oid" : "50a4a4b8f01653020000001c" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 0, "end" : "/div[1]/p[42]", "endOffset" : 81, "_id" : { "$oid" : "50a4a4b8f01653020000001d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352967352951 }, "created" : { "$date" : 1352967352951 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a4a509f01653020000001e", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "The gig's up! If only Babo would come along and save the faltering Don Benito from spilling the beans. ", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "\"Cape Horn?—who spoke of Cape Horn?\"\n\n\"Yourself did, when giving me an account\nof your voyage,\" a", "uuid" : "3E195EB8", "_id" : { "$oid" : "50a4a509f01653020000001e" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[232]", "startOffset" : 0, "end" : "/div[1]/p[233]", "endOffset" : 59, "_id" : { "$oid" : "50a4a509f01653020000001f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352967433762 }, "created" : { "$date" : 1352967433762 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50a4a53ef016530200000020" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1352967486243 }, "groups" : [ "21L.000J" ], "id" : "50a4a53ef016530200000020", "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "quote" : "Captain Delano took to negroes, not philanthropically,\nbut genially, just as other men to\nNewfoundland dogs.", "ranges" : [ { "start" : "/div[1]/p[252]", "startOffset" : 1037, "end" : "/div[1]/p[252]", "endOffset" : 1145, "_id" : { "$oid" : "50a4a53ef016530200000021" } } ], "tags" : [], "text" : "\"Almost politically correct Delano\" So close yet so far.", "updated" : { "$date" : 1352967498699 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "user" : "nhall@mit.edu", "username" : "Richard H.", "uuid" : "B27A296C" } -{ "id" : "50a4a57bf016530200000022", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "FALSE. Babo orchestrated the murder of the original slave master. Babo's second blood would be more accurate.", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno-for-21l-000", "quote" : "here's Babo's\nfirst blood.\"", "uuid" : "4D360745", "_id" : { "$oid" : "50a4a57bf016530200000022" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[265]", "startOffset" : 583, "end" : "/div[1]/p[265]", "endOffset" : 611, "_id" : { "$oid" : "50a4a57bf016530200000023" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1352967547017 }, "created" : { "$date" : 1352967547017 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a67b4467c6890200000004", "user" : "jfolsom@mit.edu", "username" : "Jamie F.", "text" : "Wonderful turn of phrase", "uri" : "http://staging-annotationstudio.herokuapp.com/documents/moby-dick", "quote" : "The ribs and terrors in the whale, Arched over me a dismal gloom, While all God's sun-lit waves rolled by, And lift me deepening down to doom", "uuid" : "0CE9CE53", "_id" : { "$oid" : "50a67b4467c6890200000004" }, "permissions" : { "delete" : [ "jfolsom@mit.edu" ], "update" : [ "jfolsom@mit.edu" ], "admin" : [ "jfolsom@mit.edu" ], "read" : [ "jfolsom@mit.edu" ] }, "tags" : [ "poetry", "rhyme", "song", "sermon", "religion" ], "ranges" : [ { "start" : "/div[1]/pre[1]", "startOffset" : 1, "end" : "/div[1]/pre[1]", "endOffset" : 142, "_id" : { "$oid" : "50a67b4467c6890200000005" } } ], "groups" : [ "21L.448J", "21L.003", "21L.000J", "21F-414", "Testing" ], "updated" : { "$date" : 1353087812830 }, "created" : { "$date" : 1353087812830 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a694277c7115020000000a", "user" : "jfolsom@mit.edu", "username" : "Jamie F.", "text" : "Quite an image", "uri" : "http://staging-annotationstudio.herokuapp.com/documents/moby-dick", "quote" : "methodically knocking people's hats off", "uuid" : "7EA55FF9", "_id" : { "$oid" : "50a694277c7115020000000a" }, "permissions" : { "delete" : [ "jfolsom@mit.edu" ], "update" : [ "jfolsom@mit.edu" ], "admin" : [ "jfolsom@mit.edu" ], "read" : [ "jfolsom@mit.edu" ] }, "tags" : [ "hats" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 699, "end" : "/div[1]/p[1]", "endOffset" : 738, "_id" : { "$oid" : "50a694277c7115020000000b" } } ], "groups" : [ "21L.448J", "21L.003", "21L.000J", "21F-414", "Testing" ], "updated" : { "$date" : 1353094183644 }, "created" : { "$date" : 1353094183644 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a694927c7115020000000c", "user" : "jfolsom@mit.edu", "username" : "Jamie F.", "text" : "", "uri" : "http://staging-annotationstudio.herokuapp.com/documents/moby-dick", "quote" : "Manhattoes", "uuid" : "038FDD39", "_id" : { "$oid" : "50a694927c7115020000000c" }, "permissions" : { "delete" : [ "jfolsom@mit.edu" ], "update" : [ "jfolsom@mit.edu" ], "admin" : [ "jfolsom@mit.edu" ], "read" : [ "jfolsom@mit.edu" ] }, "tags" : [ "place" ], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 38, "end" : "/div[1]/p[2]", "endOffset" : 48, "_id" : { "$oid" : "50a694927c7115020000000d" } } ], "groups" : [ "21L.448J", "21L.003", "21L.000J", "21F-414", "Testing" ], "updated" : { "$date" : 1353094290822 }, "created" : { "$date" : 1353094290822 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a6949c67c6890200000008", "user" : "jfolsom@mit.edu", "username" : "Jamie F.", "text" : "", "uri" : "http://staging-annotationstudio.herokuapp.com/documents/moby-dick", "quote" : "Corlears Hook", "uuid" : "C7346ED3", "_id" : { "$oid" : "50a6949c67c6890200000008" }, "permissions" : { "delete" : [ "jfolsom@mit.edu" ], "update" : [ "jfolsom@mit.edu" ], "admin" : [ "jfolsom@mit.edu" ], "read" : [ "jfolsom@mit.edu" ] }, "tags" : [ "place" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 63, "end" : "/div[1]/p[3]", "endOffset" : 76, "_id" : { "$oid" : "50a6949c67c6890200000009" } } ], "groups" : [ "21L.448J", "21L.003", "21L.000J", "21F-414", "Testing" ], "updated" : { "$date" : 1353094300178 }, "created" : { "$date" : 1353094300178 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "50a694a37c7115020000000e" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1353094307360 }, "groups" : [ "21L.448J", "21L.003", "21L.000J", "21F-414", "Testing" ], "id" : "50a694a37c7115020000000e", "permissions" : { "delete" : [ "jfolsom@mit.edu" ], "update" : [ "jfolsom@mit.edu" ], "admin" : [ "jfolsom@mit.edu" ], "read" : [ "jfolsom@mit.edu" ] }, "quote" : "Whitehall", "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 115, "end" : "/div[1]/p[3]", "endOffset" : 124, "_id" : { "$oid" : "50a694a37c7115020000000f" } } ], "tags" : [ "place", "color" ], "text" : "", "updated" : { "$date" : 1353094807721 }, "uri" : "http://staging-annotationstudio.herokuapp.com/documents/moby-dick", "user" : "jfolsom@mit.edu", "username" : "Jamie F.", "uuid" : "7B5A8526" } -{ "id" : "50a694b47c71150200000010", "user" : "jfolsom@mit.edu", "username" : "Jamie F.", "text" : "", "uri" : "http://staging-annotationstudio.herokuapp.com/documents/moby-dick", "quote" : "woodlands", "uuid" : "419EED40", "_id" : { "$oid" : "50a694b47c71150200000010" }, "permissions" : { "delete" : [ "jfolsom@mit.edu" ], "update" : [ "jfolsom@mit.edu" ], "admin" : [ "jfolsom@mit.edu" ], "read" : [ "jfolsom@mit.edu" ] }, "tags" : [ "landscape" ], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 407, "end" : "/div[1]/p[6]", "endOffset" : 416, "_id" : { "$oid" : "50a694b47c71150200000011" } } ], "groups" : [ "21L.448J", "21L.003", "21L.000J", "21F-414", "Testing" ], "updated" : { "$date" : 1353094324821 }, "created" : { "$date" : 1353094324821 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50a6f3f73b6b680200000002" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1353118711220 }, "groups" : [ "21F.414", "Fall 2012", "Testing" ], "id" : "50a6f3f73b6b680200000002", "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "quote" : "Nearly all joined in singing this hymn, which swelled high above the howling of the storm.", "ranges" : [ { "start" : "/div[1]/p[147]", "startOffset" : 0, "end" : "/div[1]/p[147]", "endOffset" : 90, "_id" : { "$oid" : "50a6f3f73b6b680200000003" } } ], "tags" : [ "singing", "storm" ], "text" : "Must have been some quite powerful singing. Maybe not too melodic.", "updated" : { "$date" : 1353118765654 }, "uri" : "http://staging-annotationstudio.herokuapp.com/documents/moby-dick", "user" : "fendt@mit.edu", "username" : "Kurt F.", "uuid" : "81FDCA99" } -{ "id" : "50a6f4953b6b680200000004", "user" : "fendt@mit.edu", "username" : "Kurt F.", "text" : "So, so!", "uri" : "http://staging-annotationstudio.herokuapp.com/documents/moby-dick", "quote" : "We had lain thus in bed, chatting and napping at short intervals", "uuid" : "24F8A682", "_id" : { "$oid" : "50a6f4953b6b680200000004" }, "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[175]", "startOffset" : 0, "end" : "/div[1]/p[175]", "endOffset" : 64, "_id" : { "$oid" : "50a6f4953b6b680200000005" } } ], "groups" : [ "21F.414", "Fall 2012", "Testing" ], "updated" : { "$date" : 1353118869844 }, "created" : { "$date" : 1353118869844 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a6f90c3b6b680200000006", "user" : "fendt@mit.edu", "username" : "Kurt F.", "text" : "![Handy](http://img.mit.edu/newsoffice/images/article_images/20121109160116-0.jpg)", "uri" : "http://staging-annotationstudio.herokuapp.com/documents/die-sprache-offnen", "quote" : "Grammatik", "uuid" : "ED015FC7", "_id" : { "$oid" : "50a6f90c3b6b680200000006" }, "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 350, "end" : "/div[1]/p[24]", "endOffset" : 359, "_id" : { "$oid" : "50a6f90c3b6b680200000007" } } ], "groups" : [ "21F.414", "Fall 2012", "Testing" ], "updated" : { "$date" : 1353120012277 }, "created" : { "$date" : 1353120012277 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a6f9343b6b680200000008", "user" : "fendt@mit.edu", "username" : "Kurt F.", "text" : "test", "uri" : "http://staging-annotationstudio.herokuapp.com/documents/die-sprache-offnen", "quote" : "Grad erlernen", "uuid" : "FD57FA24", "_id" : { "$oid" : "50a6f9343b6b680200000008" }, "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 485, "end" : "/div[1]/p[24]", "endOffset" : 498, "_id" : { "$oid" : "50a6f9343b6b680200000009" } } ], "groups" : [ "21F.414", "Fall 2012", "Testing" ], "updated" : { "$date" : 1353120052563 }, "created" : { "$date" : 1353120052563 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a6f95c3b6b68020000000a", "user" : "fendt@mit.edu", "username" : "Kurt F.", "text" : "Wirklich interessant!", "uri" : "http://staging-annotationstudio.herokuapp.com/documents/die-sprache-offnen", "quote" : "Für die Sprache, die mir so gut schmeckte, hätte ich damals alles hergegeben. Sogar das Büffeln der komplizierten Grammatik, die mir wie ein Labyrinth vorkam, nahm ich widerstandslos hin. Mit Fleiß lässt sich jede Fremdsprache bis zu einem gewissen Grad erlernen.", "uuid" : "5DC59B3B", "_id" : { "$oid" : "50a6f95c3b6b68020000000a" }, "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[24]", "startOffset" : 236, "end" : "/div[1]/p[24]", "endOffset" : 500, "_id" : { "$oid" : "50a6f95c3b6b68020000000b" } } ], "groups" : [ "21F.414", "Fall 2012", "Testing" ], "updated" : { "$date" : 1353120092635 }, "created" : { "$date" : 1353120092635 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a6fa0c3b6b68020000000c", "user" : "fendt@mit.edu", "username" : "Kurt F.", "text" : "[an example](http://web.mit.edu/)", "uri" : "http://staging-annotationstudio.herokuapp.com/documents/die-sprache-offnen", "quote" : "türkischen Büchern", "uuid" : "6DDC781A", "_id" : { "$oid" : "50a6fa0c3b6b68020000000c" }, "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[25]", "startOffset" : 256, "end" : "/div[1]/p[25]", "endOffset" : 274, "_id" : { "$oid" : "50a6fa0c3b6b68020000000d" } } ], "groups" : [ "21F.414", "Fall 2012", "Testing" ], "updated" : { "$date" : 1353120268517 }, "created" : { "$date" : 1353120268517 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a889830b69fc0200000002", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "Here I think of people puzzling over the process of evolution. We connect the dots in fossil records to make the connections as species evolve. Here Holmes connects the dots, and jumps over the small steps. I think the reason many people have trouble following is because the do not see the intermediate steps.", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "I arrived at the conclusion without being conscious of intermediate steps. There -18-were such steps, however.", "uuid" : "74C2483F", "_id" : { "$oid" : "50a889830b69fc0200000002" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[118]", "startOffset" : 140, "end" : "/div[1]/term[1]/term[1]", "endOffset" : 34101, "_id" : { "$oid" : "50a889830b69fc0200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353222531183 }, "created" : { "$date" : 1353222531183 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a928900b69fc0200000004", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "The author often uses energetic as on of the highest compliments, in the scheme of education, it is energy that allows us to keep interest, to be devoted and passionate to our studies/ careers.", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "They are both quick and energetic, but conventional -- shockingly so", "uuid" : "35DEF56E", "_id" : { "$oid" : "50a928900b69fc0200000004" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]", "startOffset" : 41831, "end" : "/div[1]/term[1]/term[1]", "endOffset" : 41910, "_id" : { "$oid" : "50a928900b69fc0200000005" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353263248403 }, "created" : { "$date" : 1353263248403 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a933e60b69fc0200000006", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "Darwin reference", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "\"Do you remember what Darwin says about music? He claims that the power of producing and appreciating it existed among the human race long before the power of speech was arrived at.", "uuid" : "0835DD0A", "_id" : { "$oid" : "50a933e60b69fc0200000006" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[313]", "startOffset" : 59, "end" : "/div[1]/term[1]/term[1]/p[313]", "endOffset" : 244, "_id" : { "$oid" : "50a933e60b69fc0200000007" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353266150135 }, "created" : { "$date" : 1353266150135 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a99908c903ba0200000002", "user" : "kspielb@mit.edu", "username" : "Katie S.", "text" : "This reminds me of the definition of miracles", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "\"I ought to know by this time that when a fact appears to be opposed to a long train of deductions, it invariably proves to be capable of bearing some other interpretation.", "uuid" : "81058CF4", "_id" : { "$oid" : "50a99908c903ba0200000002" }, "permissions" : { "delete" : [ "kspielb@mit.edu" ], "update" : [ "kspielb@mit.edu" ], "admin" : [ "kspielb@mit.edu" ], "read" : [ "kspielb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[507]", "startOffset" : 127, "end" : "/div[1]/term[1]/term[1]/p[507]", "endOffset" : 301, "_id" : { "$oid" : "50a99908c903ba0200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353292040265 }, "created" : { "$date" : 1353292040265 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a99c67c903ba0200000004", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "sherlock - Philo type in his unfocused intentions? arbitrary nature of school; learning doesn't need to happen in a classroom in order to be valuable? emergence of anatomy/body as a dissectable machine?", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "\"No -- I have no idea what he intends to go in for. I believe he is well up in anatomy, and he is a first-class chemist; but, as far as I know, he has never taken out any systematic medical classes. His studies are very desultory and eccentric, but he has amassed a lot of out-of-the-way knowledge which would astonish his professors.\"", "uuid" : "9756FC5F", "_id" : { "$oid" : "50a99c67c903ba0200000004" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[21]", "startOffset" : 4, "end" : "/div[1]/term[1]/term[1]/p[21]", "endOffset" : 358, "_id" : { "$oid" : "50a99c67c903ba0200000005" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353292903866 }, "created" : { "$date" : 1353292903866 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a99cefc903ba0200000006", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "dr. jekyll's curiosity. chemicals producing effects on the mind/body", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "Holmes is a little too scientific for my tastes -- it approaches to cold-bloodedness. I could imagine his giving a friend a little pinch of the latest vegetable alkaloid, not out of malevolence, you understand, but simply out of a spirit of inquiry in order to have an accurate idea of the effects. To do him justice, I think that he would take it himself with the same readiness. He appears to have a passion for definite and exact knowledge.\"", "uuid" : "F8104119", "_id" : { "$oid" : "50a99cefc903ba0200000006" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[31]", "startOffset" : 81, "end" : "/div[1]/term[1]/term[1]/p[31]", "endOffset" : 548, "_id" : { "$oid" : "50a99cefc903ba0200000007" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353293039142 }, "created" : { "$date" : 1353293039142 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a99ea33805810200000002", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "social sciences. telling marks and life histories. ", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "\"The proper study of mankind is man,\"", "uuid" : "EC3856A1", "_id" : { "$oid" : "50a99ea33805810200000002" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[75]", "startOffset" : 136, "end" : "/div[1]/term[1]/term[1]/p[75]", "endOffset" : 174, "_id" : { "$oid" : "50a99ea33805810200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353293475015 }, "created" : { "$date" : 1353293475015 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a99f40c903ba0200000008", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "dr jekyll/mr hyde syndrome? split personality or, multiple personality. also a recognized disorder in abnormal psychology. manic depressive? psychology IS the baby of human/social sciences...", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "Holmes was certainly not a difficult man to live with. He was quiet in his ways, and his habits were regular. It was rare for him to be up after ten at night, and he had invariably breakfasted and gone out before I rose in the morning. Sometimes he spent his day at the chemical laboratory, sometimes in the dissecting-rooms, and occasionally in long walks, which appeared to take him into the lowest portions of the city. Nothing could exceed his energy when the working fit was upon him; but now and again a reaction would seize him, and for days on end he would lie upon the sofa in the sitting-room, hardly uttering a word or moving a muscle from morning to night. On these occasions I have noticed such a dreamy, vacant expression in his eyes, that I might have suspected him of being addicted to the use of some narcotic, had not the temperance and cleanliness of his whole life forbidden such a notion.", "uuid" : "E5FDF8B9", "_id" : { "$oid" : "50a99f40c903ba0200000008" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[80]", "startOffset" : 4, "end" : "/div[1]/term[1]/term[1]/p[80]", "endOffset" : 937, "_id" : { "$oid" : "50a99f40c903ba0200000009" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353293632780 }, "created" : { "$date" : 1353293632780 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a99fc5c903ba020000000a", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "shift from humanist tradition to naturalism/social sciences", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "course of reading which might fit him for a degree", "uuid" : "BB9D8FA2", "_id" : { "$oid" : "50a99fc5c903ba020000000a" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[84]", "startOffset" : 168, "end" : "/div[1]/term[1]/term[1]/p[84]", "endOffset" : 219, "_id" : { "$oid" : "50a99fc5c903ba020000000b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353293765841 }, "created" : { "$date" : 1353293765841 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9a996c903ba020000000c", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "split personality", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "I meditated upon the many-sidedness of the human mind.", "uuid" : "88D3ADD3", "_id" : { "$oid" : "50a9a996c903ba020000000c" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[308]", "startOffset" : 86, "end" : "/div[1]/term[1]/term[1]/p[308]", "endOffset" : 141, "_id" : { "$oid" : "50a9a996c903ba020000000d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353296278179 }, "created" : { "$date" : 1353296278179 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9a9b0c903ba020000000e", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "As\nfar as the piano is concerned, sentiment is my forte.  I\nkeep science for Life.", "uuid" : "6187915C", "_id" : { "$oid" : "50a9a9b0c903ba020000000e" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[16]", "startOffset" : 138, "end" : "/div[1]/p[16]", "endOffset" : 220, "_id" : { "$oid" : "50a9a9b0c903ba020000000f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353296304292 }, "created" : { "$date" : 1353296304292 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9a9c93805810200000004", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "non-sequitur?", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "And, speaking of the science of Life,\nhave you got the cucumber sandwiches cut for Lady Bracknell?", "uuid" : "DACC9015", "_id" : { "$oid" : "50a9a9c93805810200000004" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 11, "end" : "/div[1]/p[18]", "endOffset" : 109, "_id" : { "$oid" : "50a9a9c93805810200000005" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353296329605 }, "created" : { "$date" : 1353296329605 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9abba3805810200000006", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "evolution, not only in physical appearance but also in the mental capabilities of man and animals. that speech was developed over time, instead of always being what is, can be correlated with darwin's theory of gradualism", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "\"Do you remember what Darwin says about music? He claims that the power of producing and appreciating it existed among the human race long before the power of speech was arrived at. Perhaps that is why we are so subtly influenced by it. There are vague memories in our souls of those misty centuries when the world was in its childhood.\"", "uuid" : "1DF1C258", "_id" : { "$oid" : "50a9abba3805810200000006" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[313]", "startOffset" : 59, "end" : "/div[1]/term[1]/term[1]/p[313]", "endOffset" : 407, "_id" : { "$oid" : "50a9abba3805810200000007" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353296826161 }, "created" : { "$date" : 1353296826161 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9abcf3805810200000008", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "cynicism?", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "I have only been married once. \nThat was in consequence of a misunderstanding between myself and\na young person.", "uuid" : "E941FE76", "_id" : { "$oid" : "50a9abcf3805810200000008" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[25]", "startOffset" : 119, "end" : "/div[1]/p[25]", "endOffset" : 231, "_id" : { "$oid" : "50a9abcf3805810200000009" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353296847203 }, "created" : { "$date" : 1353296847203 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9ac0f380581020000000a", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "hume's controversy of humans being capable of understanding and explaining nature. do humans have the capacity to understand nature even tho they did not create it? man-made machines < nature's machines...", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "\"One's ideas must be as broad as Nature if they are to interpret Nature,", "uuid" : "15B69B9B", "_id" : { "$oid" : "50a9ac0f380581020000000a" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[315]", "startOffset" : 2, "end" : "/div[1]/term[1]/term[1]/p[315]", "endOffset" : 77, "_id" : { "$oid" : "50a9ac0f380581020000000b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353296911531 }, "created" : { "$date" : 1353296911531 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9ac36380581020000000c", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "stark contrast between Jack's gregariousness and algernon's stiffness", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Eating as usual, I see,\nAlgy!\nAlgernon.  [Stiffly.]  I believe it is\ncustomary in good society to take some slight refreshment at five\no’clock.  Where have you been since last Thursday?", "uuid" : "B32BE5A3", "_id" : { "$oid" : "50a9ac36380581020000000c" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[36]", "startOffset" : 70, "end" : "/div[1]/p[37]", "endOffset" : 155, "_id" : { "$oid" : "50a9ac36380581020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353296950412 }, "created" : { "$date" : 1353296950412 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9ac64c903ba0200000010", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "emergence of the grotesque in surrealism. the grotesque in the other. ", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "where there is no imagination there is no horror", "uuid" : "41D7D56D", "_id" : { "$oid" : "50a9ac64c903ba0200000010" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[317]", "startOffset" : 90, "end" : "/div[1]/term[1]/term[1]/p[317]", "endOffset" : 139, "_id" : { "$oid" : "50a9ac64c903ba0200000011" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353296996063 }, "created" : { "$date" : 1353296996063 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9ac6dc903ba0200000012", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Sherlock Holme's eccentric personality", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "\"It is not easy to express the inexpressible,\" he answered with a laugh. \"Holmes is a little too scientific for my tastes -- it approaches to cold-bloodedness. I could imagine his giving a friend a little pinch of the latest vegetable alkaloid, not out of malevolence, you understand, but simply out of a spirit of inquiry in order to have an accurate idea of the effects. To do him justice, I think that he would take it himself with the same readiness. He appears to have a passion for definite and exact knowledge.\"", "uuid" : "BB8CE4F8", "_id" : { "$oid" : "50a9ac6dc903ba0200000012" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[31]", "startOffset" : 4, "end" : "/div[1]/term[1]/term[1]/p[31]", "endOffset" : 548, "_id" : { "$oid" : "50a9ac6dc903ba0200000013" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353297005457 }, "created" : { "$date" : 1353297005457 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9ac84380581020000000e", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "The very\nessence of romance is uncertainty", "uuid" : "E01EDCAF", "_id" : { "$oid" : "50a9ac84380581020000000e" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[55]", "startOffset" : 246, "end" : "/div[1]/p[55]", "endOffset" : 288, "_id" : { "$oid" : "50a9ac84380581020000000f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353297028028 }, "created" : { "$date" : 1353297028028 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9acafc903ba0200000014", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "reversal from the common phrase \"a match made in heaven\"", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Divorces are made in Heaven", "uuid" : "E35CCA8A", "_id" : { "$oid" : "50a9acafc903ba0200000014" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[57]", "startOffset" : 60, "end" : "/div[1]/p[57]", "endOffset" : 88, "_id" : { "$oid" : "50a9acafc903ba0200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353297071913 }, "created" : { "$date" : 1353297071913 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9acbd3805810200000010", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Told from the point of view of Dr. Watson", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "Chapter 1.1: Mr. Sherlock Holmes", "uuid" : "13C6D87B", "_id" : { "$oid" : "50a9acbd3805810200000010" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/center[2]/h3[1]", "startOffset" : 1, "end" : "/div[1]/term[1]/term[1]/center[2]/h3[1]", "endOffset" : 33, "_id" : { "$oid" : "50a9acbd3805810200000011" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353297085136 }, "created" : { "$date" : 1353297085136 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9ad92c903ba0200000016", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "pun/double entendre on \"e(a)rnest\"", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Ernest.  You are the most earnest", "uuid" : "1637719A", "_id" : { "$oid" : "50a9ad92c903ba0200000016" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[88]", "startOffset" : 162, "end" : "/div[1]/p[88]", "endOffset" : 195, "_id" : { "$oid" : "50a9ad92c903ba0200000017" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353297298452 }, "created" : { "$date" : 1353297298452 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9ae37c903ba0200000018", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "??", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Bunburyist", "uuid" : "25898B2E", "_id" : { "$oid" : "50a9ae37c903ba0200000018" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[92]", "startOffset" : 177, "end" : "/div[1]/p[92]", "endOffset" : 187, "_id" : { "$oid" : "50a9ae37c903ba0200000019" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353297463767 }, "created" : { "$date" : 1353297463767 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9ae673805810200000012", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Watson is observing Holmes and trying to understand his unusual personality", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "Sherlock Holmes -- his limits 1. Knowledge of Literature. -- Nil. 2. \"\" Philosophy. -- Nil. 3. \"\" Astronomy. -- Nil. 4. \"\" Politics. -- Feeble. 5. \"\" Botany. -- Variable. Well up in belladonna, opium, and poisons generally. Knows nothing of practical gardening. 6. Knowledge of Geology. -- Practical, but limited. Tells at a glance different soils from each other. After walks has shown me splashes upon his trousers, and told me by their colour and consistence in what part of London he had received them. 7. Knowledge of Chemistry. -- Profound. 8. \"\" Anatomy. -- Accurate, but unsystematic 9. \"\" Sensational Literature. -- Immense. He appears to know every detail of every horror perpetrated in the century. 10. Plays the violin well. 11. Is an expert singlestick player, boxer, and swordsman. 12. Has a good practical knowledge of British law.", "uuid" : "28916E16", "_id" : { "$oid" : "50a9ae673805810200000012" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[94]", "startOffset" : 3, "end" : "/div[1]/term[1]/term[1]/p[94]", "endOffset" : 1016, "_id" : { "$oid" : "50a9ae673805810200000013" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353297511427 }, "created" : { "$date" : 1353297511427 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9af0b3805810200000014", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "literary and social references. name dropping", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : ". After alluding airily to the Vehmgericht, aqua tofana, Carbonari, the Marchioness de Brinvilliers, the Darwinian theory, the principles of Malthus, and the Ratcliff Highway murders, the article concluded by admonishing the government and advocating a closer watch over foreigners in England.", "uuid" : "1D374CFF", "_id" : { "$oid" : "50a9af0b3805810200000014" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[371]", "startOffset" : 456, "end" : "/div[1]/term[1]/term[1]/p[371]", "endOffset" : 756, "_id" : { "$oid" : "50a9af0b3805810200000015" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353297675225 }, "created" : { "$date" : 1353297675225 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9af103805810200000016", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "For heaven’s sake, don’t try to\nbe cynical.  It’s perfectly easy to be cynical.", "uuid" : "0CD2EF82", "_id" : { "$oid" : "50a9af103805810200000016" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[117]", "startOffset" : 7, "end" : "/div[1]/p[117]", "endOffset" : 86, "_id" : { "$oid" : "50a9af103805810200000017" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353297680451 }, "created" : { "$date" : 1353297680451 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9af2f3805810200000018", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Sherlock's \"profession\"", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "\"Well, I have a trade of my own. I suppose I am the only one in the world. I'm a consulting detective, if you can understand what that is. Here in London we have lots of government detectives and lots of private ones. When these fellows are at fault, they come to me, and I manage to put them on the right scent. They lay all the evidence before me, and I am generally able, by the help of my knowledge of the history of crime, to set them straight.", "uuid" : "9CDEED7C", "_id" : { "$oid" : "50a9af2f3805810200000018" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[112]", "startOffset" : 4, "end" : "/div[1]/term[1]/term[1]/p[112]", "endOffset" : 471, "_id" : { "$oid" : "50a9af2f3805810200000019" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353297711458 }, "created" : { "$date" : 1353297711458 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9af5e380581020000001a", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "must be quite the artistic ring...", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "ring in that Wagnerian\nmanner", "uuid" : "FCC808FF", "_id" : { "$oid" : "50a9af5e380581020000001a" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[118]", "startOffset" : 226, "end" : "/div[1]/p[118]", "endOffset" : 256, "_id" : { "$oid" : "50a9af5e380581020000001b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353297758281 }, "created" : { "$date" : 1353297758281 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9b002c903ba020000001a", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Up til this part in the story is very similar to the beginning of the crime drama \"Sherlock\"", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "\"They are mostly sent on by private inquiry agencies. They are all people who are in trouble about something and want a little enlightening. I listen to their story, they listen to my comments, and then I pocket my fee.\"", "uuid" : "A9F37679", "_id" : { "$oid" : "50a9b002c903ba020000001a" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[114]", "startOffset" : 4, "end" : "/div[1]/term[1]/term[1]/p[114]", "endOffset" : 231, "_id" : { "$oid" : "50a9b002c903ba020000001b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353297922753 }, "created" : { "$date" : 1353297922753 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9b0b8c903ba020000001c", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "First time Watson goes to a crime scene with Holmes", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "\"Yes, if you have nothing better to do.\" A minute later we were both in a hansom, driving furiously for the Brixton Road.", "uuid" : "B3A7467C", "_id" : { "$oid" : "50a9b0b8c903ba020000001c" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[164]", "startOffset" : 4, "end" : "/div[1]/term[1]/term[1]/p[164]", "endOffset" : 129, "_id" : { "$oid" : "50a9b0b8c903ba020000001d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353298104567 }, "created" : { "$date" : 1353298104567 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9b302380581020000001c", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Sherlock loves to be admired", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "My companion flushed up with pleasure at my words, and the earnest way in which I uttered them. I had already observed that he was as sensitive to flattery on the score of his art as any girl could be of her beauty.", "uuid" : "26AB3DFD", "_id" : { "$oid" : "50a9b302380581020000001c" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[266]", "startOffset" : 4, "end" : "/div[1]/term[1]/term[1]/p[266]", "endOffset" : 224, "_id" : { "$oid" : "50a9b302380581020000001d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353298690422 }, "created" : { "$date" : 1353298690422 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9b393c903ba020000001e", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "This is reminiscent of the arguments between Cleanthes, Demea and Philo. This quote is something that could have been said by Philo.", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "\"No data yet,\" he answered. It is a capital mistake to theorize before you have all the evidence. It biases the judgement.\"", "uuid" : "2D860C1F", "_id" : { "$oid" : "50a9b393c903ba020000001e" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [ "holjose@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[168]", "startOffset" : 3, "end" : "/div[1]/term[1]/term[1]/p[168]", "endOffset" : 133, "_id" : { "$oid" : "50a9b393c903ba020000001f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353298835873 }, "created" : { "$date" : 1353298835873 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9b4afc903ba0200000020", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Interesting twist in the case. Old woman comes to claim ring, Holmes follows her, she disappears out of cab while in motion so most likely a young, athletic man", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "\"Old woman be damned!\" said Sherlock Holmes, sharply. \"We were the old women to be so taken in. It must have been a young man, and an active one, too, besides being an incomparable actor. The get-up was inimitable. He saw that he was followed, no doubt, and used this means of giving me the slip. It shows that the man we are after is not as lonely as I imagined he was, but has friends who are ready to risk something for him. Now, Doctor, you are looking done-up. Take my advice and turn in.", "uuid" : "EC081ECA", "_id" : { "$oid" : "50a9b4afc903ba0200000020" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[367]", "startOffset" : 4, "end" : "/div[1]/term[1]/term[1]/p[367]", "endOffset" : 519, "_id" : { "$oid" : "50a9b4afc903ba0200000021" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353299119120 }, "created" : { "$date" : 1353299119120 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9b565c903ba0200000022", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Oh! I hope I am not that.  It\nwould leave no room for developments, and I intend to develop in\nmany directions", "uuid" : "57193D4F", "_id" : { "$oid" : "50a9b565c903ba0200000022" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[130]", "startOffset" : 12, "end" : "/div[1]/p[130]", "endOffset" : 122, "_id" : { "$oid" : "50a9b565c903ba0200000023" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353299301624 }, "created" : { "$date" : 1353299301624 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9b58f380581020000001e", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "her own version of bunbury?", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "I was obliged to call on dear Lady\nHarbury", "uuid" : "34A221AC", "_id" : { "$oid" : "50a9b58f380581020000001e" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[131]", "startOffset" : 66, "end" : "/div[1]/p[131]", "endOffset" : 108, "_id" : { "$oid" : "50a9b58f380581020000001f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353299343017 }, "created" : { "$date" : 1353299343017 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9b600c903ba0200000024", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "is this passage biting sarcasm or just plain ignorance?", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "I should be much obliged if you would ask Mr.\nBunbury, from me, to be kind enough not to have a relapse on\nSaturday", "uuid" : "C5F35653", "_id" : { "$oid" : "50a9b600c903ba0200000024" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[150]", "startOffset" : 532, "end" : "/div[1]/p[150]", "endOffset" : 648, "_id" : { "$oid" : "50a9b600c903ba0200000025" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353299456365 }, "created" : { "$date" : 1353299456365 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9b65dc903ba0200000026", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Gregson's theory for how the murder happened. Not well thought through ", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "\"Well, my theory is that he followed Drebber as far as the Brixton Road. When there, a fresh altercation arose between them, in the course of which Drebber received a blow from the stick, in the pit of the stomach perhaps, which killed him without leaving any mark. The night was so wet that no one was about, so Charpentier dragged the body of his victim into the empty house. As to the candle, and the blood, and the writing on the wall, and the ring, they may all be so many tricks to throw the police on to the wrong scent.\"", "uuid" : "ACE23DFD", "_id" : { "$oid" : "50a9b65dc903ba0200000026" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[457]", "startOffset" : 3, "end" : "/div[1]/term[1]/term[1]/p[457]", "endOffset" : 546, "_id" : { "$oid" : "50a9b65dc903ba0200000027" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353299549473 }, "created" : { "$date" : 1353299549473 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9b66f3805810200000020", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "We live, as I hope you know, Mr. Worthing, in\nan age of ideals.  The fact is constantly mentioned in the\nmore expensive monthly magazines, and has reached the provincial\npulpits, I am told; and my ideal has always been to love some one\nof the name of Ernest.  There is something in that name that\ninspires absolute confidence.  The moment Algernon first\nmentioned to me that he had a friend called Ernest, I knew I was\ndestined to love you.", "uuid" : "BCFBA82F", "_id" : { "$oid" : "50a9b66f3805810200000020" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[162]", "startOffset" : 283, "end" : "/div[1]/p[162]", "endOffset" : 723, "_id" : { "$oid" : "50a9b66f3805810200000021" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353299567129 }, "created" : { "$date" : 1353299567129 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9b69f3805810200000022", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Another murder", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "\"The secretary, Mr. Joseph Stangerson,\" said Lestrade, gravely, \"was murdered at Halliday's Private Hotel about six o'clock this morning.\"", "uuid" : "00E2416D", "_id" : { "$oid" : "50a9b69f3805810200000022" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[463]", "startOffset" : 3, "end" : "/div[1]/term[1]/term[1]/p[463]", "endOffset" : 144, "_id" : { "$oid" : "50a9b69f3805810200000023" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353299615465 }, "created" : { "$date" : 1353299615465 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9b6f8c903ba0200000028", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "This murder is linked to the first murder. Murderer wrote \"Rache\" at the scene of this crime as well", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "\"The word RACHE, written in letters of blood,\" he said,", "uuid" : "5FC9FF07", "_id" : { "$oid" : "50a9b6f8c903ba0200000028" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[479]", "startOffset" : 3, "end" : "/div[1]/term[1]/term[1]/p[479]", "endOffset" : 59, "_id" : { "$oid" : "50a9b6f8c903ba0200000029" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353299704587 }, "created" : { "$date" : 1353299704587 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9b724c903ba020000002a", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Sherlock has developed a theory", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "\"I have now in my hands,\" my companion said, confidently, \"all the threads which have formed such a tangle. There are, of course, details to be filled in, but I am as certain of all the main facts, from the time that Drebber parted from Stangerson at the station, up to the discovery of the body of the latter, as if I had seen them with my own eyes. I will give you a proof of my knowledge. Could you lay your hand upon those pills?\"", "uuid" : "8B395AB9", "_id" : { "$oid" : "50a9b724c903ba020000002a" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[493]", "startOffset" : 2, "end" : "/div[1]/term[1]/term[1]/p[493]", "endOffset" : 451, "_id" : { "$oid" : "50a9b724c903ba020000002b" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353299748651 }, "created" : { "$date" : 1353299748651 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9b747c903ba020000002c", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "The glass of water and pills are something that were not at the scene of the first murder", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "a glass of water on the table, and on the window-sill a small chip ointment box containing a couple of pills.\"     Sherlock Holmes sprang from his chair with an exclamation of delight.", "uuid" : "168652FD", "_id" : { "$oid" : "50a9b747c903ba020000002c" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]", "startOffset" : 115701, "end" : "/div[1]/term[1]/term[1]/p[490]", "endOffset" : 74, "_id" : { "$oid" : "50a9b747c903ba020000002d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353299783087 }, "created" : { "$date" : 1353299783087 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9b768c903ba020000002e", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "these super-conservative views clash a lot with the liberal, free \"metaphysical\" views of gwendolen", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "An engagement should come on a young girl as a\nsurprise, pleasant or unpleasant, as the case may be", "uuid" : "E8AF30D0", "_id" : { "$oid" : "50a9b768c903ba020000002e" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[193]", "startOffset" : 179, "end" : "/div[1]/p[193]", "endOffset" : 279, "_id" : { "$oid" : "50a9b768c903ba020000002f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353299816421 }, "created" : { "$date" : 1353299816421 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9b7b63805810200000024", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Ignorance is like a delicate exotic fruit; touch\nit and the bloom is gone.", "uuid" : "5720406D", "_id" : { "$oid" : "50a9b7b63805810200000024" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[206]", "startOffset" : 109, "end" : "/div[1]/p[206]", "endOffset" : 184, "_id" : { "$oid" : "50a9b7b63805810200000025" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353299894848 }, "created" : { "$date" : 1353299894848 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9b7d53805810200000026", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "The box of pills was a mix of poison and placebo", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "Sherlock Holmes drew a long breath, and wiped the perspiration from his forehead. \"I should have more faith,\" he said; \"I ought to know by this time that when a fact appears to be opposed to a long train of deductions, it invariably proves to be capable of bearing some other interpretation. Of the two pills in that box, one was of the most deadly poison, and the other was entirely harmless. I ought to have known that before ever I saw the box at all.\"", "uuid" : "FB9727E8", "_id" : { "$oid" : "50a9b7d53805810200000026" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[507]", "startOffset" : 4, "end" : "/div[1]/term[1]/term[1]/p[507]", "endOffset" : 472, "_id" : { "$oid" : "50a9b7d53805810200000027" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353299925854 }, "created" : { "$date" : 1353299925854 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9b7e03805810200000028", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "advocating oppressing the middle class?\nsaying we shouldn't educate them so they cant rebel", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "The whole theory of modern\neducation is radically unsound.  Fortunately in England, at\nany rate, education produces no effect whatsoever.  If it\ndid, it would prove a serious danger to the upper classes, and\nprobably lead to acts of violence in Grosvenor Square.", "uuid" : "5999CBB6", "_id" : { "$oid" : "50a9b7e03805810200000028" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[206]", "startOffset" : 186, "end" : "/div[1]/p[206]", "endOffset" : 448, "_id" : { "$oid" : "50a9b7e03805810200000029" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353299936035 }, "created" : { "$date" : 1353299936035 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9b832380581020000002a", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "the callous, ridiculous remarks just keep coming...", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "To lose one parent, Mr. Worthing,\nmay be regarded as a misfortune; to lose both looks like\ncarelessness.", "uuid" : "6C684C0A", "_id" : { "$oid" : "50a9b832380581020000002a" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[224]", "startOffset" : 17, "end" : "/div[1]/p[224]", "endOffset" : 121, "_id" : { "$oid" : "50a9b832380581020000002b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353300018863 }, "created" : { "$date" : 1353300018863 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9b899380581020000002c", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "she arrogantly considers his circumstances to be a conscious choice of his, not something he gets stuck in", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "To be born, or at any rate bred, in a\nhand-bag, whether it had handles or not, seems to me to display a\ncontempt for the ordinary decencies of family life that reminds\none of the worst excesses of the French Revolution.", "uuid" : "3E3D859F", "_id" : { "$oid" : "50a9b899380581020000002c" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[236]", "startOffset" : 125, "end" : "/div[1]/p[236]", "endOffset" : 344, "_id" : { "$oid" : "50a9b899380581020000002d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353300121286 }, "created" : { "$date" : 1353300121286 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9b8ad380581020000002e", "user" : "mpd91@mit.edu", "username" : "Michael D.", "text" : "Capture the cab man who Holmes accuses of being the murderer", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "\"We have his cab,\" said Sherlock Holmes. It will serve to take him to Scotland Yard. And now, gentlemen,\" he continued, with a pleasant smile, \"we have reached the end of our little mystery. You are very welcome to put any questions that you like to me now, and there is no danger that I will refuse to answer them.\"", "uuid" : "F4CA7EF5", "_id" : { "$oid" : "50a9b8ad380581020000002e" }, "permissions" : { "delete" : [ "mpd91@mit.edu" ], "update" : [ "mpd91@mit.edu" ], "admin" : [ "mpd91@mit.edu" ], "read" : [ "mpd91@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[528]", "startOffset" : 4, "end" : "/div[1]/term[1]/term[1]/p[528]", "endOffset" : 331, "_id" : { "$oid" : "50a9b8ad380581020000002f" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353300141271 }, "created" : { "$date" : 1353300141271 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9b8fd3805810200000030", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "I am sick to death of cleverness. \nEverybody is clever nowadays.  You can’t go anywhere\nwithout meeting clever people.  The thing has become an\nabsolute public nuisance.  I wish to goodness we had a few\nfools left.", "uuid" : "7AB2413F", "_id" : { "$oid" : "50a9b8fd3805810200000030" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[255]", "startOffset" : 6, "end" : "/div[1]/p[255]", "endOffset" : 221, "_id" : { "$oid" : "50a9b8fd3805810200000031" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353300221502 }, "created" : { "$date" : 1353300221502 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9b97c3805810200000032", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Algy, you always adopt a strictly\nimmoral attitude towards life.  You are not quite old enough\nto do that.", "uuid" : "13901DF4", "_id" : { "$oid" : "50a9b97c3805810200000032" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[295]", "startOffset" : 12, "end" : "/div[1]/p[295]", "endOffset" : 119, "_id" : { "$oid" : "50a9b97c3805810200000033" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353300348291 }, "created" : { "$date" : 1353300348291 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9b9b6c903ba0200000030", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "This is analogous to saying that human nature is a science. Echos the themes of Jeckyll and Hyde...trying to apply science to control/fully understand human nature.", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "\"I shall never do that,\" I answered; you have brought detection as near an exact science as it ever will be brought in this world.\"", "uuid" : "C4BC32A6", "_id" : { "$oid" : "50a9b9b6c903ba0200000030" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [ "holjose@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[265]", "startOffset" : 0, "end" : "/div[1]/term[1]/term[1]/p[265]", "endOffset" : 137, "_id" : { "$oid" : "50a9b9b6c903ba0200000031" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353300406930 }, "created" : { "$date" : 1353300406930 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9bbf53805810200000034", "user" : "holjose@mit.edu", "username" : "Holly J.", "text" : "Sometimes the most obvious solutions are the hardest to think of because the mind is so concentrated on coming up with something complex. Similar to how humans theorize on the origin of man. The theories are often very complex and out-of-the-box, but maybe the simplest, most focused idea is correct.", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "The most commonplace crime is often the most mysterious, because it presents no new or special features from which deductions may be drawn.", "uuid" : "BA3806B9", "_id" : { "$oid" : "50a9bbf53805810200000034" }, "permissions" : { "delete" : [ "holjose@mit.edu" ], "update" : [ "holjose@mit.edu" ], "admin" : [ "holjose@mit.edu" ], "read" : [ "holjose@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[509]", "startOffset" : 561, "end" : "/div[1]/term[1]/term[1]/p[509]", "endOffset" : 706, "_id" : { "$oid" : "50a9bbf53805810200000035" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353300981135 }, "created" : { "$date" : 1353300981135 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9c4d53805810200000036", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "probably not true", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "there comes a time when for every addition of knowledge you forget something that you knew before", "uuid" : "EF6441F4", "_id" : { "$oid" : "50a9c4d53805810200000036" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[89]", "startOffset" : 776, "end" : "/div[1]/term[1]/term[1]/p[89]", "endOffset" : 875, "_id" : { "$oid" : "50a9c4d53805810200000037" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353303253972 }, "created" : { "$date" : 1353303253972 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9c541c903ba0200000032", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "This reaction of his is decidedly against the human nature.", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "\"What the deuce is it to me?\" he interrupted impatiently: \"you say that we go round the sun. If we went round the moon it would not make a pennyworth of difference to me or to my work.\"", "uuid" : "DDEC4C64", "_id" : { "$oid" : "50a9c541c903ba0200000032" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[91]", "startOffset" : 4, "end" : "/div[1]/term[1]/term[1]/p[91]", "endOffset" : 194, "_id" : { "$oid" : "50a9c541c903ba0200000033" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353303361249 }, "created" : { "$date" : 1353303361249 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9c906c903ba0200000034", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "text" : "In some ways, Holmes is a an organism outside of Darwinian natural selection. He possesses skills and intelligence that render him a remarkably superior detective to Lestrade and Gregson, and yet he gains little from these talents, whereas they profit from their careers. Holmes does not seem to be overly concerned by this fact, however; he readily agrees to go to the murder scene, even after acknowledging that he would not get anything from the case other than satisfaction. Holmes acts not in self-interest or self-preservation, but purely out of curiosity and hubris, largely because of his attitude of disregard in terms of his personal success.", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "Supposing I unravel the whole matter, you may be sure that Gregson, Lestrade, and Co. will pocket all the credit. That comes of being an unofficial personage", "uuid" : "067A03B7", "_id" : { "$oid" : "50a9c906c903ba0200000034" }, "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[158]", "startOffset" : 51, "end" : "/div[1]/term[1]/term[1]/p[158]", "endOffset" : 212, "_id" : { "$oid" : "50a9c906c903ba0200000035" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353304326379 }, "created" : { "$date" : 1353304326379 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9c9f3c903ba0200000036", "user" : "cpotter@mit.edu", "username" : "Catherine P.", "text" : "Holmes' opinion about scientific discoveries and advancements is the opposite of that of the Erewhonians. Holmes searches for new ways to use inventions and comes up with creative solutions for problems with modern technology, whereas the citizens of Erewhon preferred to outlaw mechanical objects out of fear of their future superiority. Holmes develops and researches more advanced forms, but the Erewhonians shunned them.", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "\"I have found a re-agent which is precipitated by haemoglobin, and by nothing else.\" Had he discovered a gold mine, greater delight could not have shone upon his features.", "uuid" : "473B1F30", "_id" : { "$oid" : "50a9c9f3c903ba0200000036" }, "permissions" : { "delete" : [ "cpotter@mit.edu" ], "update" : [ "cpotter@mit.edu" ], "admin" : [ "cpotter@mit.edu" ], "read" : [ "cpotter@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]", "startOffset" : 10316, "end" : "/div[1]/term[1]/term[1]", "endOffset" : 10492, "_id" : { "$oid" : "50a9c9f3c903ba0200000037" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353304563743 }, "created" : { "$date" : 1353304563743 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9d3753805810200000038", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "commentary on the subjectiveness of memory", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Memory, my dear Cecily, is the diary\nthat we all carry about with us.\nCecily.  Yes, but it usually chronicles the things\nthat have never happened, and couldn’t possibly have\nhappened.  I believe that Memory is responsible for nearly\nall the three-volume novels that Mudie sends us.", "uuid" : "584A3FCB", "_id" : { "$oid" : "50a9d3753805810200000038" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[345]", "startOffset" : 11, "end" : "/div[1]/p[346]", "endOffset" : 211, "_id" : { "$oid" : "50a9d3753805810200000039" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353306997917 }, "created" : { "$date" : 1353306997917 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9dd90c903ba0200000038", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "this seems to be a central belief for Holmes", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "There is nothing new under the sun. It has all been done before", "uuid" : "CC4BF258", "_id" : { "$oid" : "50a9dd90c903ba0200000038" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[197]", "startOffset" : 50, "end" : "/div[1]/term[1]/term[1]/p[197]", "endOffset" : 116, "_id" : { "$oid" : "50a9dd90c903ba0200000039" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353309584645 }, "created" : { "$date" : 1353309584645 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9e1b9380581020000003a", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Outside the family circle, papa, I am\nglad to say, is entirely unknown.  I think that is quite as\nit should be.  The home seems to me to be the proper sphere\nfor the man.  And certainly once a man begins to neglect his\ndomestic duties he becomes painfully effeminate, does he\nnot?  And I don’t like that.  It makes men so\nvery attractive.  Cecily, mamma, whose views on education\nare remarkably strict, has brought me up to be extremely\nshort-sighted; it is part of her system; so do you mind my\nlooking at you through my glasses?", "uuid" : "D02E6074", "_id" : { "$oid" : "50a9e1b9380581020000003a" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[621]", "startOffset" : 12, "end" : "/div[1]/p[621]", "endOffset" : 542, "_id" : { "$oid" : "50a9e1b9380581020000003b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353310649211 }, "created" : { "$date" : 1353310649211 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9e383380581020000003c", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "title explained", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "a study in scarlet, eh? Why shouldn't we use a little art jargon. There's the scarlet thread of murder running through the colourless skein of life, and our duty is to unravel it, and isolate it, and expose every inch of it.", "uuid" : "AE7F1474", "_id" : { "$oid" : "50a9e383380581020000003c" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[307]", "startOffset" : 358, "end" : "/div[1]/term[1]/term[1]/p[307]", "endOffset" : 590, "_id" : { "$oid" : "50a9e383380581020000003d" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353311107802 }, "created" : { "$date" : 1353311107802 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9e43ae5db920200000002", "user" : "mkel@mit.edu", "username" : "Michael K.", "text" : "Darwin reference!", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "\"Do you remember what Darwin says about music? He claims that the power of producing and appreciating it existed among the human race long before the power of speech was arrived at. Perhaps that is why we are so subtly influenced by it. There are vague memories in our souls of those misty centuries when the world was in its childhood.\"", "uuid" : "BA8F4E5F", "_id" : { "$oid" : "50a9e43ae5db920200000002" }, "permissions" : { "delete" : [ "mkel@mit.edu" ], "update" : [ "mkel@mit.edu" ], "admin" : [ "mkel@mit.edu" ], "read" : [ "mkel@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[313]", "startOffset" : 59, "end" : "/div[1]/term[1]/term[1]/p[313]", "endOffset" : 407, "_id" : { "$oid" : "50a9e43ae5db920200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353311290907 }, "created" : { "$date" : 1353311290907 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50a9e6efe5db920200000004", "user" : "rchipman@mit.edu", "username" : "Ryan C.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Gwendolen, it is a terrible thing for a man\nto find out suddenly that all his life he has been speaking\nnothing but the truth.  Can you forgive me?", "uuid" : "A022E911", "_id" : { "$oid" : "50a9e6efe5db920200000004" }, "permissions" : { "delete" : [ "rchipman@mit.edu" ], "update" : [ "rchipman@mit.edu" ], "admin" : [ "rchipman@mit.edu" ], "read" : [ "rchipman@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[938]", "startOffset" : 7, "end" : "/div[1]/p[938]", "endOffset" : 154, "_id" : { "$oid" : "50a9e6efe5db920200000005" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353311983415 }, "created" : { "$date" : 1353311983415 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50aa8500380581020000003e", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Funny", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Algernon.  The truth is rarely pure and never\nsimple.  Modern life would be very tedious if it were\neither, and modern literature a complete impossibility!", "uuid" : "F331B5AC", "_id" : { "$oid" : "50aa8500380581020000003e" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[102]/b[1]", "startOffset" : 0, "end" : "/div[1]/p[102]", "endOffset" : 155, "_id" : { "$oid" : "50aa8500380581020000003f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353352448572 }, "created" : { "$date" : 1353352448572 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50aa85d2e5db920200000006", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Social marker, symbol of class", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "cigarette case", "uuid" : "B8187C02", "_id" : { "$oid" : "50aa85d2e5db920200000006" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[70]", "startOffset" : 25, "end" : "/div[1]/p[70]", "endOffset" : 40, "_id" : { "$oid" : "50aa85d2e5db920200000007" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353352658523 }, "created" : { "$date" : 1353352658523 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50aa9ca93805810200000040", "user" : "jfolsom@mit.edu", "username" : "Jamie F.", "text" : "Was denn?", "uri" : "http://staging-annotationstudio.herokuapp.com/documents/moby-dick", "quote" : "But look!", "uuid" : "89D7AE90", "_id" : { "$oid" : "50aa9ca93805810200000040" }, "permissions" : { "delete" : [ "jfolsom@mit.edu" ], "update" : [ "jfolsom@mit.edu" ], "admin" : [ "jfolsom@mit.edu" ], "read" : [ "jfolsom@mit.edu" ] }, "tags" : [ "sehen", "gesehenwerden" ], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 0, "end" : "/div[1]/p[4]", "endOffset" : 9, "_id" : { "$oid" : "50aa9ca93805810200000041" } } ], "groups" : [ "21L.448J", "21L.003", "21L.000J", "21F-414", "Testing" ], "updated" : { "$date" : 1353358505923 }, "created" : { "$date" : 1353358505923 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "50aacbb33805810200000042" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1353370547430 }, "groups" : [ "21L.000J" ], "id" : "50aacbb33805810200000042", "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "quote" : "Do but think how you walked this\ndeck, how you sat in this cabin, every inch of\nground mined into honey-combs under you.\nHad I dropped the least hint, made the least\n[pg 266]\n\nadvance towards an understanding between us,\ndeath, explosive death—yours as mine—would\nhave ended the scene.\"", "ranges" : [ { "start" : "/div[1]/p[401]", "startOffset" : 707, "end" : "/div[1]/p[401]", "endOffset" : 993, "_id" : { "$oid" : "50aacbb33805810200000043" } } ], "tags" : [ "thoughtfulness,", "charcter" ], "text" : "Reflective comment from Benito on the situation he had been in on the ship, really shows his thoughtfulness for having the self-control to restrain himself from trying to alert Delano of the situation because, even though he must have wanted to badly to see if Delano could help him out of it, he knew that telling Delano would only result in his death. ", "updated" : { "$date" : 1353379404517 }, "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "uuid" : "C40E6D6C" } -{ "id" : "50aaf528e5db920200000008", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Example of how Melville alters a part of Delano's account of the event. Melville's alteration makes Benito look like a better character in the eyes of the readers because he isn't the one stabbing the slave", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "that\nthe noble Captain Amasa Delano also wrenched from the\nhand of Bartholomew Barlo a dagger, secreted at the time\nof the massacre of the whites, with which he was in the act\nof stabbing a shackled negro, who, the same day, with another\nnegro, had thrown him down and jumped upon him", "uuid" : "A38C33E4", "_id" : { "$oid" : "50aaf528e5db920200000008" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "alteration,", "character" ], "ranges" : [ { "start" : "/div[1]/blockquote[1]/p[20]", "startOffset" : 4313, "end" : "/div[1]/blockquote[1]/p[20]", "endOffset" : 4598, "_id" : { "$oid" : "50aaf528e5db920200000009" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353381160447 }, "created" : { "$date" : 1353381160447 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50aafe55bac9f40200000002", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "The three characteristics that I believe Melville most wanted to portray in his main characters", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "good-nature, compassion, and\ncharity", "uuid" : "12ED3E3C", "_id" : { "$oid" : "50aafe55bac9f40200000002" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "character" ], "ranges" : [ { "start" : "/div[1]/p[404]", "startOffset" : 189, "end" : "/div[1]/p[404]", "endOffset" : 225, "_id" : { "$oid" : "50aafe55bac9f40200000003" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353383509145 }, "created" : { "$date" : 1353383509145 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50aafea4e5db92020000000a", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Ends with Benito Cereno dying, instead of showing ungratitude by trying to get out of paying Delano for rescuing him. This change leaves the reader with a good impression of Benito at the conclusion of the story", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "three months after being\ndismissed by the court, Benito Cereno, borne\non the bier, did, indeed, follow his leader.", "uuid" : "2EFDBC1F", "_id" : { "$oid" : "50aafea4e5db92020000000a" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "character" ], "ranges" : [ { "start" : "/div[1]/p[416]", "startOffset" : 478, "end" : "/div[1]/p[416]", "endOffset" : 592, "_id" : { "$oid" : "50aafea4e5db92020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1353383588968 }, "created" : { "$date" : 1353383588968 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50acef5fe4ae530200000002", "user" : "jfolsom@mit.edu", "username" : "Jamie F.", "text" : "", "uri" : "http://staging-annotationstudio.herokuapp.com/documents/moby-dick", "quote" : "What, perhaps, with other things, made Stubb such an easy-going, unfearing man, so cheerily trudging off with the burden of life in a world full of grave pedlars, all bowed to the ground with their packs; what helped to bring about that almost impious good-humor of his; that thing must have been his pipe. For, like his nose, his short, black little pipe was one of the regular features of his face. You would almost as soon have expected him to turn out of his bunk without his nose as without his pipe. He kept a whole row of pipes there ready loaded, stuck in a rack, within easy reach of his hand; and, whenever he turned in, he smoked them all out in succession, lighting one from the other to the end of the chapter; then loading them again to be in readiness anew. For, when Stubb dressed, instead of first putting his legs into his trowsers, he put his pipe into his mouth.", "uuid" : "05295A5F", "_id" : { "$oid" : "50acef5fe4ae530200000002" }, "permissions" : { "delete" : [ "jfolsom@mit.edu" ], "update" : [ "jfolsom@mit.edu" ], "admin" : [ "jfolsom@mit.edu" ], "read" : [ "jfolsom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[503]", "startOffset" : 0, "end" : "/div[1]/p[504]", "endOffset" : 0, "_id" : { "$oid" : "50acef5fe4ae530200000003" } } ], "groups" : [ "21L.448J", "21L.003", "21L.000J", "21F-414", "Testing" ], "updated" : { "$date" : 1353510751013 }, "created" : { "$date" : 1353510751013 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50acef80e4ae530200000004", "user" : "jfolsom@mit.edu", "username" : "Jamie F.", "text" : "", "uri" : "http://staging-annotationstudio.herokuapp.com/documents/moby-dick", "quote" : "must", "uuid" : "E61202EF", "_id" : { "$oid" : "50acef80e4ae530200000004" }, "permissions" : { "delete" : [ "jfolsom@mit.edu" ], "update" : [ "jfolsom@mit.edu" ], "admin" : [ "jfolsom@mit.edu" ], "read" : [ "jfolsom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[504]", "startOffset" : 29, "end" : "/div[1]/p[504]", "endOffset" : 33, "_id" : { "$oid" : "50acef80e4ae530200000005" } } ], "groups" : [ "21L.448J", "21L.003", "21L.000J", "21F-414", "Testing" ], "updated" : { "$date" : 1353510784078 }, "created" : { "$date" : 1353510784078 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50ae79d0bf10aa0200000002", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "creating landscape of despair, setting the scene for ill-happenings. giving the terrain human characteristics", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "barrenness, inhospitality, and misery", "uuid" : "01F2418A", "_id" : { "$oid" : "50ae79d0bf10aa0200000002" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[529]", "startOffset" : 743, "end" : "/div[1]/term[1]/term[1]/p[529]", "endOffset" : 781, "_id" : { "$oid" : "50ae79d0bf10aa0200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353611728740 }, "created" : { "$date" : 1353611728740 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50ae7e6eabc9e20200000002", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "imagery of contrast. old and rugged vs. young and soft. compliments notion of competing identity", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "On the little plateau which crowned the barren hill there stood a single giant boulder, and against this boulder there lay a tall man, long-bearded and hard-featured, but of an excessive thinness. His placid face and regular breathing showed that he was fast asleep. Beside him lay a child, with her round white arms encircling his brown sinewy neck, and her golden-haired head resting upon the breast of his velveteen tunic. Her rosy lips were parted, showing the regular line of snow-white teeth within, and a playful smile played over her infantile features. Her plump little white legs, terminating in white socks and neat shoes with shining buckles, offered a strange contrast to the long shrivelled members of her companion", "uuid" : "E68DD01E", "_id" : { "$oid" : "50ae7e6eabc9e20200000002" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[584]", "startOffset" : 2, "end" : "/div[1]/term[1]/term[1]/p[584]", "endOffset" : 752, "_id" : { "$oid" : "50ae7e6eabc9e20200000003" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353612910572 }, "created" : { "$date" : 1353612910572 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50ae8010abc9e20200000004", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "the violent man; something to be avoided. but of course in any selection of men there will be those more wicked than the others. ", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "We have come to seek a refuge from the violent man and from the godless, even though it be the heart of the desert.\"", "uuid" : "3176C594", "_id" : { "$oid" : "50ae8010abc9e20200000004" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[593]", "startOffset" : 325, "end" : "/div[1]/term[1]/term[1]", "endOffset" : 146985, "_id" : { "$oid" : "50ae8010abc9e20200000005" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353613328106 }, "created" : { "$date" : 1353613328106 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50ae8087bf10aa0200000004", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "also the little speck of evil that corrupts the self?", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "that little speck of decay which in time corrupts the whole fruit", "uuid" : "CE5CEC87", "_id" : { "$oid" : "50ae8087bf10aa0200000004" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[599]", "startOffset" : 240, "end" : "/div[1]/term[1]/term[1]/p[599]", "endOffset" : 306, "_id" : { "$oid" : "50ae8087bf10aa0200000005" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353613447119 }, "created" : { "$date" : 1353613447119 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50ae83bfbf10aa0200000006", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "pious torturers?", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "The victims of persecution had now turned persecutors on their own account, and persecutors of the most terrible description. Not the Inquisition of Seville, nor the German Vehmgericht, nor the secret societies of Italy, were ever able to put a more formidable machinery in motion than that which cast a cloud over the state of Utah.", "uuid" : "5A6A2100", "_id" : { "$oid" : "50ae83bfbf10aa0200000006" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[645]", "startOffset" : 257, "end" : "/div[1]/term[1]/term[1]/p[645]", "endOffset" : 601, "_id" : { "$oid" : "50ae83bfbf10aa0200000007" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353614271428 }, "created" : { "$date" : 1353614271428 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50ae8bcdbf10aa0200000008", "user" : "mvwagner@mit.edu", "username" : "Mali W.", "text" : "inner emotions and desires can alter the owner's appearance?", "uri" : "http://annotationstudio.mit.edu/documents/a-study-in-scarlet", "quote" : "Year passed into year, his black hair turned grizzled, but still he wandered on, a human bloodhound, with his mind wholly set upon the one object to -106-which he had devoted his life. At last his perseverance was rewarded. It was but a glance of a face in a window, but that one glance told him that Cleveland in Ohio possessed the men whom he was in pursuit of. He returned to his miserable lodgings with his plan of vengeance all arranged. It chanced, however, that Drebber, looking from his window, had recognized the vagrant in the street, and had read murder in his eyes.", "uuid" : "6E73F3A6", "_id" : { "$oid" : "50ae8bcdbf10aa0200000008" }, "permissions" : { "delete" : [ "mvwagner@mit.edu" ], "update" : [ "mvwagner@mit.edu" ], "admin" : [ "mvwagner@mit.edu" ], "read" : [ "mvwagner@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/term[1]/term[1]/p[791]", "startOffset" : 342, "end" : "/div[1]/term[1]/term[1]", "endOffset" : 214360, "_id" : { "$oid" : "50ae8bcdbf10aa0200000009" } } ], "groups" : [ "21L.448J" ], "updated" : { "$date" : 1353616333930 }, "created" : { "$date" : 1353616333930 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "50b3b2f481771b0200000004" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1353954036917 }, "groups" : [ "21L.000J" ], "id" : "50b3b2f481771b0200000004", "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "quote" : "Serious Bunburyist!", "ranges" : [ { "start" : "/div[1]/p[721]", "startOffset" : 6, "end" : "/div[1]/p[721]", "endOffset" : 27, "_id" : { "$oid" : "50b3b2f481771b0200000005" } } ], "tags" : [], "text" : "an oxymoron", "updated" : { "$date" : 1353954050714 }, "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "user" : "wandia@mit.edu", "username" : "Sarah W.", "uuid" : "26D675D7" } -{ "id" : "50b5167cdbc72a0200000002", "user" : "jfolsom@mit.edu", "username" : "Jamie F.", "text" : "", "uri" : "http://staging-annotationstudio.herokuapp.com/documents/moby-dick", "quote" : "Upon waking", "uuid" : "83ED3328", "_id" : { "$oid" : "50b5167cdbc72a0200000002" }, "permissions" : { "delete" : [ "jfolsom@mit.edu" ], "update" : [ "jfolsom@mit.edu" ], "admin" : [ "jfolsom@mit.edu" ], "read" : [ "jfolsom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[101]", "startOffset" : 0, "end" : "/div[1]/p[101]", "endOffset" : 11, "_id" : { "$oid" : "50b5167cdbc72a0200000003" } } ], "groups" : [ "21L.448J", "21L.003", "21L.000J", "21F-414", "Testing" ], "updated" : { "$date" : 1354045052285 }, "created" : { "$date" : 1354045052285 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50b5187fdd21200200000002", "user" : "jfolsom@mit.edu", "username" : "Jamie F.", "text" : "", "uri" : "http://staging-annotationstudio.herokuapp.com/documents/moby-dick", "quote" : "crowds, pacing straight", "uuid" : "BB0CD932", "_id" : { "$oid" : "50b5187fdd21200200000002" }, "permissions" : { "delete" : [ "jfolsom@mit.edu" ], "update" : [ "jfolsom@mit.edu" ], "admin" : [ "jfolsom@mit.edu" ], "read" : [ "jfolsom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 25, "end" : "/div[1]/p[4]", "endOffset" : 48, "_id" : { "$oid" : "50b5187fdd21200200000003" } } ], "groups" : [ "21L.448J", "21L.003", "21L.000J", "21F-414", "Testing" ], "updated" : { "$date" : 1354045567417 }, "created" : { "$date" : 1354045567417 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50b519ebdbc72a0200000004", "user" : "randall.leeds@gmail.com", "username" : "Randall L.", "text" : "Notice \"Call me...\" and not \"My name is...\". We never do find out.", "uri" : "http://staging-annotationstudio.herokuapp.com/documents/moby-dick", "quote" : "Call me Ishmael", "uuid" : "FF97649E", "_id" : { "$oid" : "50b519ebdbc72a0200000004" }, "permissions" : { "delete" : [ "randall.leeds@gmail.com" ], "update" : [ "randall.leeds@gmail.com" ], "admin" : [ "randall.leeds@gmail.com" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 0, "end" : "/div[1]/p[1]", "endOffset" : 15, "_id" : { "$oid" : "50b519ebdbc72a0200000005" } } ], "groups" : [ "21F.414", "21L.003" ], "updated" : { "$date" : 1354045931576 }, "created" : { "$date" : 1354045931576 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50b519f4dd21200200000004", "user" : "jfolsom@mit.edu", "username" : "Jamie F.", "text" : "", "uri" : "http://staging-annotationstudio.herokuapp.com/documents/moby-dick", "quote" : "dive. Strange", "uuid" : "03731785", "_id" : { "$oid" : "50b519f4dd21200200000004" }, "permissions" : { "delete" : [ "jfolsom@mit.edu" ], "update" : [ "jfolsom@mit.edu" ], "admin" : [ "jfolsom@mit.edu" ], "read" : [ "jfolsom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 90, "end" : "/div[1]/p[4]", "endOffset" : 103, "_id" : { "$oid" : "50b519f4dd21200200000005" } } ], "groups" : [ "21L.448J", "21L.003", "21L.000J", "21F-414", "Testing" ], "updated" : { "$date" : 1354045940877 }, "created" : { "$date" : 1354045940877 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50b64890ebef5c0200000002", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Yet the play has none", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "in\nan age of ideals", "uuid" : "4E6A889F", "_id" : { "$oid" : "50b64890ebef5c0200000002" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[162]", "startOffset" : 325, "end" : "/div[1]/p[162]", "endOffset" : 345, "_id" : { "$oid" : "50b64890ebef5c0200000003" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1354123408337 }, "created" : { "$date" : 1354123408337 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50b648b1f9412f0200000002", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Ironic", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Ah! that is clearly a\nmetaphysical speculation, and like most metaphysical speculations\nhas very little reference at all to the actual facts of real\nlife, as we know them.", "uuid" : "B3BE7E7C", "_id" : { "$oid" : "50b648b1f9412f0200000002" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[170]", "startOffset" : 23, "end" : "/div[1]/p[170]", "endOffset" : 194, "_id" : { "$oid" : "50b648b1f9412f0200000003" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1354123441714 }, "created" : { "$date" : 1354123441714 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50b64906ebef5c0200000004", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Of course, absurd line", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "I am afraid you have had very\nlittle experience in how to propose.", "uuid" : "F338D4CE", "_id" : { "$oid" : "50b64906ebef5c0200000004" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[186]", "startOffset" : 74, "end" : "/div[1]/p[186]", "endOffset" : 140, "_id" : { "$oid" : "50b64906ebef5c0200000005" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1354123526808 }, "created" : { "$date" : 1354123526808 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50b6493bebef5c0200000006", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "compares a handbag to parents", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Well, I don’t see how I could\npossibly manage to do that.  I can produce the hand-bag at\nany moment.  It is in my dressing-room at home.  I\nreally think that should satisfy you, Lady Bracknell.", "uuid" : "0251D941", "_id" : { "$oid" : "50b6493bebef5c0200000006" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[239]", "startOffset" : 7, "end" : "/div[1]/p[239]", "endOffset" : 200, "_id" : { "$oid" : "50b6493bebef5c0200000007" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1354123579962 }, "created" : { "$date" : 1354123579962 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50b64972ebef5c0200000008", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "closest thing to an actual insult", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Never met such a Gorgon\n. . . I don’t really know what a Gorgon is like, but I am\nquite sure that Lady Bracknell is one.", "uuid" : "05BCE06B", "_id" : { "$oid" : "50b64972ebef5c0200000008" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[245]", "startOffset" : 129, "end" : "/div[1]/p[245]", "endOffset" : 249, "_id" : { "$oid" : "50b64972ebef5c0200000009" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1354123634167 }, "created" : { "$date" : 1354123634167 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50b64c68f9412f0200000004", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Funny", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "You need hardly remind me of that,\nErnest.  I remember only too well that I was forced to write\nyour letters for you.  I wrote always three times a week,\nand sometimes oftener.", "uuid" : "E30C32E9", "_id" : { "$oid" : "50b64c68f9412f0200000004" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[569]", "startOffset" : 9, "end" : "/div[1]/p[569]", "endOffset" : 185, "_id" : { "$oid" : "50b64c68f9412f0200000005" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1354124392214 }, "created" : { "$date" : 1354124392214 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50b64da6ebef5c020000000a", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Very fake greeting, remnants of jealousy ", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Oh!  It is strange he never\nmentioned to me that he had a ward.  How secretive of\nhim!  He grows more interesting hourly.  I am not sure,\nhowever, that the news inspires me with feelings of unmixed\ndelight.  [Rising and going to her.]  I am very fond of\nyou, Cecily; I have liked you ever since I met you!  But I\nam bound to state that now that I know that you are Mr.\nWorthing’s ward, I cannot help expressing a wish you\nwere—well, just a little older than you seem to\nbe—and not quite so very alluring in appearance.  In\nfact, if I may speak candidly—", "uuid" : "53AF19C1", "_id" : { "$oid" : "50b64da6ebef5c020000000a" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[631]", "startOffset" : 11, "end" : "/div[1]/p[631]", "endOffset" : 565, "_id" : { "$oid" : "50b64da6ebef5c020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1354124710430 }, "created" : { "$date" : 1354124710430 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50b64daff9412f0200000006", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Funny", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Pray do!  I think that whenever one\nhas anything unpleasant to say, one should always be quite\ncandid.", "uuid" : "647CDE4F", "_id" : { "$oid" : "50b64daff9412f0200000006" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[632]", "startOffset" : 8, "end" : "/div[1]/p[632]", "endOffset" : 111, "_id" : { "$oid" : "50b64daff9412f0200000007" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1354124719393 }, "created" : { "$date" : 1354124719393 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50b64dc7ebef5c020000000c", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "You'd think not true", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "But\neven men of the noblest possible moral character are extremely\nsusceptible to the influence of the physical charms of\nothers.", "uuid" : "62676303", "_id" : { "$oid" : "50b64dc7ebef5c020000000c" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[633]", "startOffset" : 273, "end" : "/div[1]/p[633]", "endOffset" : 403, "_id" : { "$oid" : "50b64dc7ebef5c020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1354124743256 }, "created" : { "$date" : 1354124743256 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50b64debebef5c020000000e", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "THings get ugly", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Cecily.  Quite sure.  [A pause.]  In\nfact, I am going to be his.\nGwendolen.  [Inquiringly.]  I beg your\npardon?", "uuid" : "78064517", "_id" : { "$oid" : "50b64debebef5c020000000e" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[640]/b[1]", "startOffset" : 0, "end" : "/div[1]/p[641]", "endOffset" : 46, "_id" : { "$oid" : "50b64debebef5c020000000f" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1354124779699 }, "created" : { "$date" : 1354124779699 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50b64fa5ebef5c0200000010", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Simple humour", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Cecily.  Yes! to good heavens, Gwendolen, I mean\nto Gwendolen.", "uuid" : "BFDDE87D", "_id" : { "$oid" : "50b64fa5ebef5c0200000010" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[691]/b[1]", "startOffset" : 0, "end" : "/div[1]/p[691]", "endOffset" : 62, "_id" : { "$oid" : "50b64fa5ebef5c0200000011" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1354125221155 }, "created" : { "$date" : 1354125221155 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50b65b04f9412f0200000008", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Clever play on words, like a pun", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Exploded!  Was he the victim\nof a revolutionary outrage?  I was not aware that Mr.\nBunbury was interested in social legislation.  If so, he is\nwell punished for his morbidity.", "uuid" : "8776AFE5", "_id" : { "$oid" : "50b65b04f9412f0200000008" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[815]", "startOffset" : 17, "end" : "/div[1]/p[815]", "endOffset" : 192, "_id" : { "$oid" : "50b65b04f9412f0200000009" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1354128132777 }, "created" : { "$date" : 1354128132777 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50b65bebebef5c0200000012", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Stle", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Style largely depends on the\nway the chin is worn.  They are worn very high, just at\npresent.  Algernon!", "uuid" : "957CDB79", "_id" : { "$oid" : "50b65bebebef5c0200000012" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[834]", "startOffset" : 437, "end" : "/div[1]/p[834]", "endOffset" : 541, "_id" : { "$oid" : "50b65bebebef5c0200000013" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1354128363971 }, "created" : { "$date" : 1354128363971 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50b65c13f9412f020000000a", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "spoken outrage of society and its norms", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Cecily is the sweetest, dearest,\nprettiest girl in the whole world.  And I don’t care\ntwopence about social possibilities", "uuid" : "8B0ED062", "_id" : { "$oid" : "50b65c13f9412f020000000a" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[837]", "startOffset" : 11, "end" : "/div[1]/p[837]", "endOffset" : 132, "_id" : { "$oid" : "50b65c13f9412f020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1354128403025 }, "created" : { "$date" : 1354128403025 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50b65c59ebef5c0200000014", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Reversal of words", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "To speak frankly, I am not in\nfavour of long engagements.  They give people the\nopportunity of finding out each other’s character before\nmarriage, which I think is never advisable.", "uuid" : "7251C8B7", "_id" : { "$oid" : "50b65c59ebef5c0200000014" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[847]", "startOffset" : 17, "end" : "/div[1]/p[847]", "endOffset" : 197, "_id" : { "$oid" : "50b65c59ebef5c0200000015" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1354128473546 }, "created" : { "$date" : 1354128473546 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50b65c79ebef5c0200000016", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "What you'd expect to be the other way around", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Upon what grounds may I\nask?  Algernon is an extremely, I may almost say an\nostentatiously, eligible young man.  He has nothing, but he\nlooks everything.  What more can one desire?", "uuid" : "9DBAC5B3", "_id" : { "$oid" : "50b65c79ebef5c0200000016" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[849]", "startOffset" : 17, "end" : "/div[1]/p[849]", "endOffset" : 197, "_id" : { "$oid" : "50b65c79ebef5c0200000017" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1354128505046 }, "created" : { "$date" : 1354128505046 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50b65cd9f9412f020000000c", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "High strung of her", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Ahem!  Mr. Worthing, after\ncareful consideration I have decided entirely to overlook my\nnephew’s conduct to you.", "uuid" : "E2771CFF", "_id" : { "$oid" : "50b65cd9f9412f020000000c" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[853]", "startOffset" : 17, "end" : "/div[1]/p[853]", "endOffset" : 129, "_id" : { "$oid" : "50b65cd9f9412f020000000d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1354128601909 }, "created" : { "$date" : 1354128601909 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50b65d0aebef5c0200000018", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "absurd", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Thirty-five is a very attractive\nage.  London society is full of women of the very highest\nbirth who have, of their own free choice, remained thirty-five\nfor years", "uuid" : "2145CD42", "_id" : { "$oid" : "50b65d0aebef5c0200000018" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[859]", "startOffset" : 68, "end" : "/div[1]/p[859]", "endOffset" : 231, "_id" : { "$oid" : "50b65d0aebef5c0200000019" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1354128650901 }, "created" : { "$date" : 1354128650901 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50b65d23ebef5c020000001a", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "very romantic and sentimental ", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "f course I could, Cecily.  You\nknow I could.", "uuid" : "E3876BBF", "_id" : { "$oid" : "50b65d23ebef5c020000001a" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[861]", "startOffset" : 12, "end" : "/div[1]/p[861]", "endOffset" : 56, "_id" : { "$oid" : "50b65d23ebef5c020000001b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1354128675940 }, "created" : { "$date" : 1354128675940 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50b65d37ebef5c020000001c", "user" : "azuniga@mit.edu", "username" : "Alejandro Z.", "text" : "Not the usual reaction", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Yes, I felt it instinctively, but I\ncouldn’t wait all that time.  I hate waiting even five\nminutes for anybody.  It always makes me rather cross. \nI am not punctual myself, I know, but I do like punctuality in\nothers, and waiting, even to be married, is quite out of the\nquestion.", "uuid" : "18CA872A", "_id" : { "$oid" : "50b65d37ebef5c020000001c" }, "permissions" : { "delete" : [ "azuniga@mit.edu" ], "update" : [ "azuniga@mit.edu" ], "admin" : [ "azuniga@mit.edu" ], "read" : [ "azuniga@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[862]", "startOffset" : 9, "end" : "/div[1]/p[862]", "endOffset" : 289, "_id" : { "$oid" : "50b65d37ebef5c020000001d" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1354128695082 }, "created" : { "$date" : 1354128695082 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50b7960d0bf4cd0200000002", "user" : "wkelley@mit.edu", "username" : "Wyn K.", "text" : "Suicide?", "uri" : "http://annotationstudio.mit.edu/documents/moby-dick-chapters-1-5", "quote" : "This is my substitute for pistol and ball.", "uuid" : "3BBEDCB0", "_id" : { "$oid" : "50b7960d0bf4cd0200000002" }, "permissions" : { "delete" : [ "wkelley@mit.edu" ], "update" : [ "wkelley@mit.edu" ], "admin" : [ "wkelley@mit.edu" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[3]", "startOffset" : 819, "end" : "/div[1]/div[3]", "endOffset" : 862, "_id" : { "$oid" : "50b7960d0bf4cd0200000003" } } ], "groups" : [ "21L.003", "21L.000J" ], "updated" : { "$date" : 1354208781229 }, "created" : { "$date" : 1354208781229 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50bcdfae14cb170200000002", "user" : "fendt@mit.edu", "username" : "Kurt F.", "text" : "Каждое новое произведение Михаила Шишкина вызывает у критиков бурные эмоции. Особенно после присуждения премии «Глобус» роману «Взятие Измаила». Не стал исключением и «Письмовник».", "uri" : "http://staging-annotationstudio.herokuapp.com/documents/--2", "quote" : "наискосок", "uuid" : "96E54B4A", "_id" : { "$oid" : "50bcdfae14cb170200000002" }, "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 27, "end" : "/div[1]/p[3]", "endOffset" : 36, "_id" : { "$oid" : "50bcdfae14cb170200000003" } } ], "groups" : [ "21F.414", "Fall 2012", "Testing" ], "updated" : { "$date" : 1354555310401 }, "created" : { "$date" : 1354555310401 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50bd9a5314cb170200000004", "user" : "krystalj@mit.edu", "username" : "Krystal J.", "text" : "tsk tsk Bracknell. tsk tsk", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "There are distinct social\npossibilities in Miss Cardew’s profile.", "uuid" : "08867D2F", "_id" : { "$oid" : "50bd9a5314cb170200000004" }, "permissions" : { "delete" : [ "krystalj@mit.edu" ], "update" : [ "krystalj@mit.edu" ], "admin" : [ "krystalj@mit.edu" ], "read" : [ "krystalj@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[836]", "startOffset" : 17, "end" : "/div[1]/p[836]", "endOffset" : 82, "_id" : { "$oid" : "50bd9a5314cb170200000005" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1354603091165 }, "created" : { "$date" : 1354603091165 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c3a8756d2b0a0200000002", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "earnest implies seriousness or sincerity, which is contrary to the tone of the whole play", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Importance\nof Being Earnest.", "uuid" : "D89C5061", "_id" : { "$oid" : "50c3a8756d2b0a0200000002" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[946]", "startOffset" : 96, "end" : "/div[1]/p[946]", "endOffset" : 124, "_id" : { "$oid" : "50c3a8756d2b0a0200000003" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1354999931633 }, "created" : { "$date" : 1354999925875 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c3a89cd229cb0200000002", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "sincerity?", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "triviality", "uuid" : "CD623409", "_id" : { "$oid" : "50c3a89cd229cb0200000002" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "inversion" ], "ranges" : [ { "start" : "/div[1]/p[945]", "startOffset" : 63, "end" : "/div[1]/p[945]", "endOffset" : 73, "_id" : { "$oid" : "50c3a89cd229cb0200000003" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1354999964047 }, "created" : { "$date" : 1354999964047 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c3ac0b6d2b0a0200000004", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "name - a triviality takes precedence over something as serious as marriage", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Your decision on the subject of my name is\nirrevocable", "uuid" : "392EF4EA", "_id" : { "$oid" : "50c3ac0b6d2b0a0200000004" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[922]", "startOffset" : 62, "end" : "/div[1]/p[922]", "endOffset" : 116, "_id" : { "$oid" : "50c3ac0b6d2b0a0200000005" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1355000843699 }, "created" : { "$date" : 1355000843699 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c3adf4d229cb0200000004", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "a simple lie", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "I\ndon’t know any one of the name of Cecily.", "uuid" : "2260AF6D", "_id" : { "$oid" : "50c3adf4d229cb0200000004" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "deceit" ], "ranges" : [ { "start" : "/div[1]/p[68]", "startOffset" : 80, "end" : "/div[1]/p[68]", "endOffset" : 123, "_id" : { "$oid" : "50c3adf4d229cb0200000005" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1355001332112 }, "created" : { "$date" : 1355001332112 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c3ae0cd229cb0200000006", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "lie is escalating", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Cecily happens\nto be my aunt", "uuid" : "A1C67D8A", "_id" : { "$oid" : "50c3ae0cd229cb0200000006" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "deceit" ], "ranges" : [ { "start" : "/div[1]/p[81]", "startOffset" : 34, "end" : "/div[1]/p[81]", "endOffset" : 62, "_id" : { "$oid" : "50c3ae0cd229cb0200000007" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1355001356081 }, "created" : { "$date" : 1355001356081 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c3ae346d2b0a0200000006", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "more lies", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Some aunts are tall, some aunts are not tall.  That is a\nmatter that surely an aunt may be allowed to decide for\nherself.", "uuid" : "BE49C1BC", "_id" : { "$oid" : "50c3ae346d2b0a0200000006" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [ "deceit" ], "ranges" : [ { "start" : "/div[1]/p[85]", "startOffset" : 96, "end" : "/div[1]/p[85]", "endOffset" : 217, "_id" : { "$oid" : "50c3ae346d2b0a0200000007" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1355001396483 }, "created" : { "$date" : 1355001396483 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c3ae4bd229cb0200000008", "user" : "leowylin@mit.edu", "username" : "Yen Lin L.", "text" : "some truth is eventually uncovered", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "It isn’t Ernest; it’s Jack.", "uuid" : "CCCCEDBC", "_id" : { "$oid" : "50c3ae4bd229cb0200000008" }, "permissions" : { "delete" : [ "leowylin@mit.edu" ], "update" : [ "leowylin@mit.edu" ], "admin" : [ "leowylin@mit.edu" ], "read" : [ "leowylin@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[87]", "startOffset" : 7, "end" : "/div[1]/p[87]", "endOffset" : 34, "_id" : { "$oid" : "50c3ae4bd229cb0200000009" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1355001419348 }, "created" : { "$date" : 1355001419348 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c57f603a51640200000002", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "The comment about cuffs. This will help lead into Fun Home by comparing what the cuffs say here and what they lead up to in Fun Home. Here the cuffs are a symbol. Algernon is from the city, he has money and cuffs help show this.", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Well, I can’t eat muffins in an\nagitated manner.  The butter would probably get on my\ncuffs.  One should always eat muffins quite calmly.  It\nis the only way to eat them.", "uuid" : "44047134", "_id" : { "$oid" : "50c57f603a51640200000002" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[734]", "startOffset" : 11, "end" : "/div[1]/p[734]", "endOffset" : 181, "_id" : { "$oid" : "50c57f603a51640200000003" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1355120480419 }, "created" : { "$date" : 1355120480419 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c6a36968c8c10200000004", "user" : "hmalpica@mit.edu", "username" : "Hugo M.", "text" : "This one quote tells of how a simple change in clothing can give a person a different identity. Earnest in the city dresses with a suit, high end class, and in the country Jack dresses a bit less because he doesn't need to hide who he is there.", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Well, my name is Ernest in town and Jack in\nthe country, and the cigarette case was given to me in the\ncountry.", "uuid" : "85CDC96E", "_id" : { "$oid" : "50c6a36968c8c10200000004" }, "permissions" : { "delete" : [ "hmalpica@mit.edu" ], "update" : [ "hmalpica@mit.edu" ], "admin" : [ "hmalpica@mit.edu" ], "read" : [ "hmalpica@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[89]", "startOffset" : 7, "end" : "/div[1]/p[89]", "endOffset" : 118, "_id" : { "$oid" : "50c6a36968c8c10200000005" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1355195241183 }, "created" : { "$date" : 1355195241183 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c750cde24c420200000002", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Makes sense. Algernon likes scrapes because they are exciting and certainly not normal. Jack says Algy's always spouting nonsense. Algernon replies by saying that he does so because nobody else ever does--therefore, to keep life from getting too serious, he takes it upon himself to become to bearer of nonsense. ", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Algernon.  I love scrapes.  They are the only\nthings that are never serious.\nJack.  Oh, that’s nonsense, Algy.  You\nnever talk anything but nonsense.\nAlgernon.  Nobody ever does.", "uuid" : "13A2049B", "_id" : { "$oid" : "50c750cde24c420200000002" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[328]/b[1]", "startOffset" : 0, "end" : "/div[1]/p[330]", "endOffset" : 28, "_id" : { "$oid" : "50c750cde24c420200000003" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1355239629381 }, "created" : { "$date" : 1355239629381 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c75171e24c420200000004", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Makes sense. Some of the most culturally significant pieces of literature have been placed on restricted reading lists and censored for fear of impacting society, as in the USSR and USA. ", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Algernon.  Oh! it is absurd to have a hard and\nfast rule about what one should read and what one\nshouldn’t.  More than half of modern culture depends\non what one shouldn’t read.", "uuid" : "11ABDA12", "_id" : { "$oid" : "50c75171e24c420200000004" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[78]/b[1]", "startOffset" : 0, "end" : "/div[1]/p[78]", "endOffset" : 177, "_id" : { "$oid" : "50c75171e24c420200000005" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1355239793814 }, "created" : { "$date" : 1355239793814 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c752e7e24c420200000006", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Remember that the type of world they live in, while mostly nonsensical, remains mostly consistent with itself, so if all of the characters constantly speak nonsense, what would there to talk about to a sensible man--not much, I presume. ", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Cecily.  Oh, I don’t think I would care to\ncatch a sensible man.  I shouldn’t know what to talk\nto him about.\n[They pass into the house.  Miss Prism and Dr.\nChasuble return.]", "uuid" : "C02098AB", "_id" : { "$oid" : "50c752e7e24c420200000006" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[419]/b[1]", "startOffset" : 0, "end" : "/div[1]/p[420]", "endOffset" : 64, "_id" : { "$oid" : "50c752e7e24c420200000007" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1355240167969 }, "created" : { "$date" : 1355240167969 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c7539ae24c420200000008", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Makes sense. It sure would be terrible to go through the hassle of a lie when you never had to. ", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Jack.  Gwendolen, it is a terrible thing for a man\nto find out suddenly that all his life he has been speaking\nnothing but the truth.", "uuid" : "06A5ADD8", "_id" : { "$oid" : "50c7539ae24c420200000008" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[938]/b[1]", "startOffset" : 0, "end" : "/div[1]/p[938]", "endOffset" : 133, "_id" : { "$oid" : "50c7539ae24c420200000009" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1355240346138 }, "created" : { "$date" : 1355240346138 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c75a8cdacf520200000002", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "...improbable...why?... Still mulling this one over. ", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Algernon.  Here it is.  [Hands cigarette\ncase.]  Now produce your explanation, and pray make it\nimprobable.  [Sits on sofa.]", "uuid" : "F6118C2B", "_id" : { "$oid" : "50c75a8cdacf520200000002" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[96]/b[1]", "startOffset" : 0, "end" : "/div[1]/p[96]", "endOffset" : 124, "_id" : { "$oid" : "50c75a8cdacf520200000003" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1355242124486 }, "created" : { "$date" : 1355242124486 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c75ca3e24c42020000000a", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "The kind of music Algernon is likely referring to is traditional 18th century ambiance music, the kind that would be playing in the background while at a social gathering. If the music is good (the default) then the party will proceed with people talking and having a great time, but nobody sits down and simply listens to the music. On the other hand, if the music is bad, people take notice and the party grinds to a staggering halt, an awkward situation for the host. ", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Of course the music\nis a great difficulty.  You see, if one plays good music,\npeople don’t listen, and if one plays bad music people\ndon’t talk.", "uuid" : "E2C721F0", "_id" : { "$oid" : "50c75ca3e24c42020000000a" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[151]", "startOffset" : 136, "end" : "/div[1]/p[151]", "endOffset" : 282, "_id" : { "$oid" : "50c75ca3e24c42020000000b" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1355242659260 }, "created" : { "$date" : 1355242659260 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c791ece24c420200000012", "user" : "fendt@mit.edu", "username" : "Kurt F.", "text" : "Whaling ship crew experiences ", "uri" : "http://staging-annotationstudio.herokuapp.com/documents/moby-dick", "quote" : "I thought I would sail about a little and see the watery part of the world", "uuid" : "31556DFC", "_id" : { "$oid" : "50c791ece24c420200000012" }, "permissions" : { "delete" : [ "fendt@mit.edu" ], "update" : [ "fendt@mit.edu" ], "admin" : [ "fendt@mit.edu" ], "read" : [ "fendt@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 153, "end" : "/div[1]/p[1]", "endOffset" : 227, "_id" : { "$oid" : "50c791ece24c420200000013" } } ], "groups" : [ "21F.414", "Fall 2012", "Testing" ], "updated" : { "$date" : 1355256300592 }, "created" : { "$date" : 1355256300592 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c7eda4e24c420200000030", "user" : "nhall@mit.edu", "username" : "Richard H.", "text" : "Confused? How about this: novels that end happily depress her because when she compares her life to the happy ending of the novel, she realizes that it's simply a work of Fiction and that her life perhaps will not have a happy ending. ", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Cecily.  Did you really, Miss Prism?  How\nwonderfully clever you are!  I hope it did not end\nhappily?  I don’t like novels that end happily. \nThey depress me so much.", "uuid" : "C4378F4F", "_id" : { "$oid" : "50c7eda4e24c420200000030" }, "permissions" : { "delete" : [ "nhall@mit.edu" ], "update" : [ "nhall@mit.edu" ], "admin" : [ "nhall@mit.edu" ], "read" : [ "nhall@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[348]/b[1]", "startOffset" : 0, "end" : "/div[1]/p[348]", "endOffset" : 166, "_id" : { "$oid" : "50c7eda4e24c420200000031" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1355279780324 }, "created" : { "$date" : 1355279780324 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c7fe85e24c420200000032", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "The importance of not being earnest (1)", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "It’s one’s duty to do so.  And\nas a high moral tone can hardly be said to conduce very much to\neither one’s health or one’s happiness, in order to\nget up to town I have always pretended to have a younger brother\nof the name of Ernest, who lives in the Albany, and gets into the\nmost dreadful scrapes", "uuid" : "131D44E2", "_id" : { "$oid" : "50c7fe85e24c420200000032" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[101]", "startOffset" : 227, "end" : "/div[1]/p[101]", "endOffset" : 528, "_id" : { "$oid" : "50c7fe85e24c420200000033" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1355284101640 }, "created" : { "$date" : 1355284101640 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c7fec7e24c420200000034", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "(2)", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Nothing will induce me to part with\nBunbury, and if you ever get married, which seems to me extremely\nproblematic, you will be very glad to know Bunbury.  A man\nwho marries without knowing Bunbury has a very tedious time of\nit.", "uuid" : "73C24973", "_id" : { "$oid" : "50c7fec7e24c420200000034" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[112]", "startOffset" : 11, "end" : "/div[1]/p[112]", "endOffset" : 238, "_id" : { "$oid" : "50c7fec7e24c420200000035" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1355284167731 }, "created" : { "$date" : 1355284167731 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c80004f8541e0200000022", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Marriage had ruined her.", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "I hadn’t been there since her poor\nhusband’s death.  I never saw a woman so altered; she\nlooks quite twenty years younger.", "uuid" : "6D325F67", "_id" : { "$oid" : "50c80004f8541e0200000022" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[131]", "startOffset" : 111, "end" : "/div[1]/p[131]", "endOffset" : 233, "_id" : { "$oid" : "50c80004f8541e0200000023" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1355284484599 }, "created" : { "$date" : 1355284484599 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c80041f8541e0200000024", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "(2)", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "I have often observed that in married\nhouseholds the champagne is rarely of a first-rate brand.\nAlgernon.  Good heavens!  Is marriage so\ndemoralising as that?", "uuid" : "BA585C60", "_id" : { "$oid" : "50c80041f8541e0200000024" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[23]", "startOffset" : 64, "end" : "/div[1]/p[24]", "endOffset" : 62, "_id" : { "$oid" : "50c80041f8541e0200000025" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1355284545056 }, "created" : { "$date" : 1355284545056 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c805c3f8541e0200000026", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "He stays sane by Bunburying.", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Cecily.  Dear Uncle Jack is so very serious! \nSometimes he is so serious that I think he cannot be quite\nwell.", "uuid" : "A417D536", "_id" : { "$oid" : "50c805c3f8541e0200000026" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[338]/b[1]", "startOffset" : 0, "end" : "/div[1]/p[338]", "endOffset" : 110, "_id" : { "$oid" : "50c805c3f8541e0200000027" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1355285955884 }, "created" : { "$date" : 1355285955884 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c8627de24c420200000036", "user" : "wandia@mit.edu", "username" : "Sarah W.", "text" : "Gwendolen's obsession with the name Ernest", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "es, I am quite well aware of the\nfact.  And I often wish that in public, at any rate, you had\nbeen more demonstrative.  For me you have always had an\nirresistible fascination.  Even before I met you I was far\nfrom indifferent to you.  [Jack looks at her in\namazement.]  We live, as I hope you know, Mr. Worthing, in\nan age of ideals.  The fact is constantly mentioned in the\nmore expensive monthly magazines, and has reached the provincial\npulpits, I am told; and my ideal has always been to love some one\nof the name of Ernest.  There is something in that name that\ninspires absolute confidence.  The moment Algernon first\nmentioned to me that he had a friend called Ernest, I knew I was\ndestined to love you.", "uuid" : "858808F6", "_id" : { "$oid" : "50c8627de24c420200000036" }, "permissions" : { "delete" : [ "wandia@mit.edu" ], "update" : [ "wandia@mit.edu" ], "admin" : [ "wandia@mit.edu" ], "read" : [ "wandia@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[162]", "startOffset" : 13, "end" : "/div[1]/p[162]", "endOffset" : 723, "_id" : { "$oid" : "50c8627de24c420200000037" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1355309693325 }, "created" : { "$date" : 1355309693325 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c8be631a17c90200000002", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Throughout the play, Algernon seems to have an obsession for food, and this is where it is first recognized. This particular case is even more interesting since he is obviously eating something that he shouldn't be, which shows his inability to resist his obsession.", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "Please don’t touch the cucumber\nsandwiches.  They are ordered specially for Aunt\nAugusta.  [Takes one and eats it.]", "uuid" : "A00E5116", "_id" : { "$oid" : "50c8be631a17c90200000002" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [ "obsession" ], "ranges" : [ { "start" : "/div[1]/p[57]", "startOffset" : 165, "end" : "/div[1]/p[57]", "endOffset" : 280, "_id" : { "$oid" : "50c8be631a17c90200000003" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1355333219252 }, "created" : { "$date" : 1355333219252 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c8c15fbefe420200000002", "user" : "simpri21@mit.edu", "username" : "Emmanuel S.", "text" : "Gwendolyn has an obsession with the name Ernest that persists throughout the story and is the driving force behind her actions. She goes against her mother's will to fulfill her ideal of loving someone named Ernest", "uri" : "http://annotationstudio.mit.edu/documents/the-importance-of-being-earnest", "quote" : "my ideal has always been to love some one\nof the name of Ernest.  There is something in that name that\ninspires absolute confidence.  The moment Algernon first\nmentioned to me that he had a friend called Ernest, I knew I was\ndestined to love you.", "uuid" : "E7E57D10", "_id" : { "$oid" : "50c8c15fbefe420200000002" }, "permissions" : { "delete" : [ "simpri21@mit.edu" ], "update" : [ "simpri21@mit.edu" ], "admin" : [ "simpri21@mit.edu" ], "read" : [ "simpri21@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[162]", "startOffset" : 477, "end" : "/div[1]/p[162]", "endOffset" : 723, "_id" : { "$oid" : "50c8c15fbefe420200000003" } } ], "groups" : [ "21L.000J" ], "updated" : { "$date" : 1355333983886 }, "created" : { "$date" : 1355333983886 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "50c944dd1a17c9020000000a", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "qwertyuiop", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "His attention had been drawn to a slumbering\nnegress", "uuid" : "BD7ECBA5", "_id" : { "$oid" : "50c944dd1a17c9020000000a" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[181]", "startOffset" : 0, "end" : "/div[1]/p[181]", "endOffset" : 52, "_id" : { "$oid" : "50c944dd1a17c9020000000b" } } ], "groups" : [ "21L.003" ], "updated" : { "$date" : 1355367645959 }, "created" : { "$date" : 1355367645959 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510a92c072901e0200000002", "user" : "jamiefolsom@gmail.com", "username" : "Jamie F.", "text" : "", "uri" : "http://localhost:3000/documents/a-study-in-scarlet", "quote" : "Creation of machine-readable version: Almanac Information Server at Oregon State University", "uuid" : "26DB87B3", "_id" : { "$oid" : "510a92c072901e0200000002" }, "permissions" : { "delete" : [ "jamiefolsom@gmail.com" ], "update" : [ "jamiefolsom@gmail.com" ], "admin" : [ "jamiefolsom@gmail.com" ], "read" : [ "jamiefolsom@gmail.com" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 77, "end" : "/div[1]", "endOffset" : 168, "_id" : { "$oid" : "510a92c072901e0200000003" } } ], "updated" : { "$date" : 1359647424127 }, "created" : { "$date" : 1359647424127 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510a933472901e0200000006", "user" : "jfolsom@mit.edu", "username" : "Jamie F.", "text" : "", "uri" : "http://localhost:3000/documents/a-study-in-scarlet", "quote" : "-conformant markup", "uuid" : "9473B0D0", "_id" : { "$oid" : "510a933472901e0200000006" }, "permissions" : { "delete" : [ "jfolsom@mit.edu" ], "update" : [ "jfolsom@mit.edu" ], "admin" : [ "jfolsom@mit.edu" ], "read" : [ "jfolsom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 188, "end" : "/div[1]", "endOffset" : 206, "_id" : { "$oid" : "510a933472901e0200000007" } } ], "updated" : { "$date" : 1359647547758 }, "created" : { "$date" : 1359647540695 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ace6b72901e0200000018", "user" : "lindsay.whitacre@bc.edu", "username" : "Lindsay W.", "text" : "test", "uri" : "http://app.annotationstudio.org/documents/il-principe", "quote" : "NICOLAUS MACLAVELLUS AD MAGNIFICUM LAURENTIUM MEDICEM.", "uuid" : "7163A3E1", "_id" : { "$oid" : "510ace6b72901e0200000018" }, "permissions" : { "delete" : [ "lindsay.whitacre@bc.edu" ], "update" : [ "lindsay.whitacre@bc.edu" ], "admin" : [ "lindsay.whitacre@bc.edu" ], "read" : [ "lindsay.whitacre@bc.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 0, "end" : "/div[1]/p[3]", "endOffset" : 54, "_id" : { "$oid" : "510ace6b72901e0200000019" } } ], "updated" : { "$date" : 1359662699409 }, "created" : { "$date" : 1359662699409 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad38172901e020000001a", "user" : "jamiefolsom@gmail.com", "username" : "Jamie F.", "text" : "Here's my comment", "uri" : "http://app.annotationstudio.org/documents/la-divina-commedia", "quote" : "SAPIENZA E 'L PRIMO AMORE.\nDINANZI A ME NON FUOR COSE CREATE\nSE NON ETTERNE, E IO ETTERNO DURO.\nLASCIATE OGNE", "uuid" : "AD75F030", "_id" : { "$oid" : "510ad38172901e020000001a" }, "permissions" : { "delete" : [ "jamiefolsom@gmail.com" ], "update" : [ "jamiefolsom@gmail.com" ], "admin" : [ "jamiefolsom@gmail.com" ], "read" : [ "jamiefolsom@gmail.com" ] }, "tags" : [ "some", "tags" ], "ranges" : [ { "start" : "/div[1]/pre[3]", "startOffset" : 178, "end" : "/div[1]/pre[3]", "endOffset" : 287, "_id" : { "$oid" : "510ad38172901e020000001b" } } ], "updated" : { "$date" : 1359664001547 }, "created" : { "$date" : 1359664001547 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad39972901e020000001c", "user" : "jamiefolsom@gmail.com", "username" : "Jamie F.", "text" : "", "uri" : "http://app.annotationstudio.org/documents/la-divina-commedia", "quote" : "sua mano a la mia puose\ncon lieto volto, ond'io mi confortai,\nmi mise dentro a le segrete cose.\nQuivi sospiri, pianti", "uuid" : "5E0BFCD6", "_id" : { "$oid" : "510ad39972901e020000001c" }, "permissions" : { "delete" : [ "jamiefolsom@gmail.com" ], "update" : [ "jamiefolsom@gmail.com" ], "admin" : [ "jamiefolsom@gmail.com" ], "read" : [ "jamiefolsom@gmail.com" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/pre[3]", "startOffset" : 669, "end" : "/div[1]/pre[3]", "endOffset" : 786, "_id" : { "$oid" : "510ad39972901e020000001d" } } ], "updated" : { "$date" : 1359664025245 }, "created" : { "$date" : 1359664025245 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad39b72901e020000001e", "user" : "wedaman@brandeis.edu", "username" : "D Grainger W.", "text" : "I'm adding a comment in the annotation studio workshop. Hope this is ok!", "uri" : "http://app.annotationstudio.org/documents/la-divina-commedia", "quote" : "mezzo del cammin di nostra vita\nmi ritrovai per", "uuid" : "69644CE6", "_id" : { "$oid" : "510ad39b72901e020000001e" }, "permissions" : { "delete" : [ "wedaman@brandeis.edu" ], "update" : [ "wedaman@brandeis.edu" ], "admin" : [ "wedaman@brandeis.edu" ], "read" : [ "wedaman@brandeis.edu" ] }, "tags" : [ "Learning" ], "ranges" : [ { "start" : "/div[1]/pre[1]", "startOffset" : 4, "end" : "/div[1]/pre[1]", "endOffset" : 51, "_id" : { "$oid" : "510ad39b72901e020000001f" } } ], "updated" : { "$date" : 1359664027669 }, "created" : { "$date" : 1359664027669 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad3a372901e0200000022", "user" : "jamiefolsom@gmail.com", "username" : "Jamie F.", "text" : "", "uri" : "http://app.annotationstudio.org/documents/la-divina-commedia", "quote" : "convien lasciare ogne sospetto;\nogne viltà convien", "uuid" : "02800162", "_id" : { "$oid" : "510ad3a372901e0200000022" }, "permissions" : { "delete" : [ "jamiefolsom@gmail.com" ], "update" : [ "jamiefolsom@gmail.com" ], "admin" : [ "jamiefolsom@gmail.com" ], "read" : [ "jamiefolsom@gmail.com" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/pre[3]", "startOffset" : 472, "end" : "/div[1]/pre[3]", "endOffset" : 522, "_id" : { "$oid" : "510ad3a372901e0200000023" } } ], "updated" : { "$date" : 1359664035866 }, "created" : { "$date" : 1359664035866 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad47d72901e0200000024", "user" : "jamiefolsom@gmail.com", "username" : "Jamie F.", "text" : "", "uri" : "http://app.annotationstudio.org/documents/la-divina-commedia", "quote" : "vedrai le genti", "uuid" : "5F212276", "_id" : { "$oid" : "510ad47d72901e0200000024" }, "permissions" : { "delete" : [ "jamiefolsom@gmail.com" ], "update" : [ "jamiefolsom@gmail.com" ], "admin" : [ "jamiefolsom@gmail.com" ], "read" : [ "jamiefolsom@gmail.com" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/pre[3]", "startOffset" : 590, "end" : "/div[1]/pre[3]", "endOffset" : 605, "_id" : { "$oid" : "510ad47d72901e0200000025" } } ], "updated" : { "$date" : 1359664253301 }, "created" : { "$date" : 1359664253301 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad48772901e0200000026", "user" : "jamiefolsom@gmail.com", "username" : "Jamie F.", "text" : "", "uri" : "http://app.annotationstudio.org/documents/la-divina-commedia", "quote" : "Maestro, il senso", "uuid" : "6C62C8B8", "_id" : { "$oid" : "510ad48772901e0200000026" }, "permissions" : { "delete" : [ "jamiefolsom@gmail.com" ], "update" : [ "jamiefolsom@gmail.com" ], "admin" : [ "jamiefolsom@gmail.com" ], "read" : [ "jamiefolsom@gmail.com" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/pre[3]", "startOffset" : 395, "end" : "/div[1]/pre[3]", "endOffset" : 412, "_id" : { "$oid" : "510ad48772901e0200000027" } } ], "updated" : { "$date" : 1359664263590 }, "created" : { "$date" : 1359664263590 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad4e872901e0200000028", "user" : "anayanez@mit.edu", "username" : "Ana Y.", "text" : "lkjlk", "uri" : "http://app.annotationstudio.org/documents/la-divina-commedia", "quote" : "s'ammoglia,", "uuid" : "B05F63F5", "_id" : { "$oid" : "510ad4e872901e0200000028" }, "permissions" : { "delete" : [ "anayanez@mit.edu" ], "update" : [ "anayanez@mit.edu" ], "admin" : [ "anayanez@mit.edu" ], "read" : [ "anayanez@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/pre[1]", "startOffset" : 3656, "end" : "/div[1]/pre[1]", "endOffset" : 3667, "_id" : { "$oid" : "510ad4e872901e0200000029" } } ], "updated" : { "$date" : 1359664360667 }, "created" : { "$date" : 1359664360667 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad7c472901e020000002a", "user" : "ezimmer@bu.edu", "username" : "Mary Erica Z.", "text" : "Word 1!", "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "quote" : "Alice", "uuid" : "B5F2A803", "_id" : { "$oid" : "510ad7c472901e020000002a" }, "permissions" : { "delete" : [ "ezimmer@bu.edu" ], "update" : [ "ezimmer@bu.edu" ], "admin" : [ "ezimmer@bu.edu" ], "read" : [ "ezimmer@bu.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 245, "end" : "/div[1]", "endOffset" : 250, "_id" : { "$oid" : "510ad7c472901e020000002b" } } ], "updated" : { "$date" : 1359665092746 }, "created" : { "$date" : 1359665092746 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad7d572901e020000002c", "user" : "ezimmer@bu.edu", "username" : "Mary Erica Z.", "text" : "Working with the Hill ideas here.", "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "quote" : "'without pictures or conversation?'", "uuid" : "699F7321", "_id" : { "$oid" : "510ad7d572901e020000002c" }, "permissions" : { "delete" : [ "ezimmer@bu.edu" ], "update" : [ "ezimmer@bu.edu" ], "admin" : [ "ezimmer@bu.edu" ], "read" : [ "ezimmer@bu.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 510, "end" : "/div[1]", "endOffset" : 546, "_id" : { "$oid" : "510ad7d572901e020000002d" } } ], "updated" : { "$date" : 1359665109858 }, "created" : { "$date" : 1359665109858 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad7f572901e020000002e", "user" : "ezimmer@bu.edu", "username" : "Mary Erica Z.", "text" : "A la Harvey", "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "quote" : "a White Rabbit with pink\neyes", "uuid" : "DE374332", "_id" : { "$oid" : "510ad7f572901e020000002e" }, "permissions" : { "delete" : [ "ezimmer@bu.edu" ], "update" : [ "ezimmer@bu.edu" ], "admin" : [ "ezimmer@bu.edu" ], "read" : [ "ezimmer@bu.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 791, "end" : "/div[1]", "endOffset" : 820, "_id" : { "$oid" : "510ad7f572901e020000002f" } } ], "updated" : { "$date" : 1359665141114 }, "created" : { "$date" : 1359665141114 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "510ad7fa72901e0200000030" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1359665146542 }, "id" : "510ad7fa72901e0200000030", "permissions" : { "delete" : [ "alicia.morris@tufts.edu" ], "update" : [ "alicia.morris@tufts.edu" ], "admin" : [ "alicia.morris@tufts.edu" ], "read" : [ "alicia.morris@tufts.edu" ] }, "quote" : "Alice Looking Behind the Curtain.", "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 1, "end" : "/div[1]/p[5]", "endOffset" : 34, "_id" : { "$oid" : "510ad7fa72901e0200000031" } } ], "tags" : [ "illustration" ], "text" : "Chapter 1 first image - woodcut", "updated" : { "$date" : 1359665230410 }, "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "user" : "alicia.morris@tufts.edu", "username" : "Alicia M.", "uuid" : "60A0DFA5" } -{ "id" : "510ad80872901e0200000032", "user" : "ezimmer@bu.edu", "username" : "Mary Erica Z.", "text" : "As they do.", "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "quote" : "but when the Rabbit actually TOOK A WATCH\nOUT OF ITS WAISTCOAT- POCKET", "uuid" : "E04423F4", "_id" : { "$oid" : "510ad80872901e0200000032" }, "permissions" : { "delete" : [ "ezimmer@bu.edu" ], "update" : [ "ezimmer@bu.edu" ], "admin" : [ "ezimmer@bu.edu" ], "read" : [ "ezimmer@bu.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 1153, "end" : "/div[1]", "endOffset" : 1223, "_id" : { "$oid" : "510ad80872901e0200000033" } } ], "updated" : { "$date" : 1359665160621 }, "created" : { "$date" : 1359665160621 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad85072901e0200000034", "user" : "ezimmer@bu.edu", "username" : "Mary Erica Z.", "text" : "Think about the imagery at this point. ", "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "quote" : "abbit-hole went straight on like a tunnel for some way, and then dipped suddenly\ndown, so suddenly that Alice had not a moment to think about stopping herself before she\nfound herself falling down a very deep well.", "uuid" : "F5A09138", "_id" : { "$oid" : "510ad85072901e0200000034" }, "permissions" : { "delete" : [ "ezimmer@bu.edu" ], "update" : [ "ezimmer@bu.edu" ], "admin" : [ "ezimmer@bu.edu" ], "read" : [ "ezimmer@bu.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 1695, "end" : "/div[1]", "endOffset" : 1910, "_id" : { "$oid" : "510ad85072901e0200000035" } } ], "updated" : { "$date" : 1359665725964 }, "created" : { "$date" : 1359665232115 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "510ad89572901e0200000036" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1359665301033 }, "id" : "510ad89572901e0200000036", "permissions" : { "delete" : [ "alicia.morris@tufts.edu" ], "update" : [ "alicia.morris@tufts.edu" ], "admin" : [ "alicia.morris@tufts.edu" ], "read" : [ "alicia.morris@tufts.edu" ] }, "quote" : "CHAPTER II: The Pool of Tears", "ranges" : [ { "start" : "/div[1]/h4[2]", "startOffset" : 0, "end" : "/div[1]/h4[2]", "endOffset" : 29, "_id" : { "$oid" : "510ad89572901e0200000037" } } ], "tags" : [], "text" : "Start Chapter 2 - The Pool of Tears", "updated" : { "$date" : 1359665383603 }, "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "user" : "alicia.morris@tufts.edu", "username" : "Alicia M.", "uuid" : "5A280190" } -{ "id" : "510ad89d72901e0200000038", "user" : "irr@brandeis.edu", "username" : "Caren I.", "text" : "This is a metaphorical use of \"orphan,\" comparing the soul to an infant whose mother dies in childbirth. A sense of spiritual loss is most important.", "uri" : "http://app.annotationstudio.org/documents/moby-dick", "quote" : "orphan", "uuid" : "283A17A9", "_id" : { "$oid" : "510ad89d72901e0200000038" }, "permissions" : { "delete" : [ "irr@brandeis.edu" ], "update" : [ "irr@brandeis.edu" ], "admin" : [ "irr@brandeis.edu" ], "read" : [ "irr@brandeis.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1964]", "startOffset" : 1064, "end" : "/div[1]/p[1964]", "endOffset" : 1070, "_id" : { "$oid" : "510ad89d72901e0200000039" } } ], "updated" : { "$date" : 1359665309004 }, "created" : { "$date" : 1359665309004 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad8ad72901e020000003a", "user" : "e.dillon@neu.edu", "username" : "Elizabeth D.", "text" : "Geography", "uri" : "http://app.annotationstudio.org/documents/moby-dick", "quote" : "There now is your insular city of the Manhattoes,", "uuid" : "85565CC8", "_id" : { "$oid" : "510ad8ad72901e020000003a" }, "permissions" : { "delete" : [ "e.dillon@neu.edu" ], "update" : [ "e.dillon@neu.edu" ], "admin" : [ "e.dillon@neu.edu" ], "read" : [ "e.dillon@neu.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 0, "end" : "/div[1]/p[2]", "endOffset" : 49, "_id" : { "$oid" : "510ad8ad72901e020000003b" } } ], "updated" : { "$date" : 1359665325076 }, "created" : { "$date" : 1359665325076 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad8c072901e020000003c", "user" : "lobrien@wellesley.edu", "username" : "Laura O.", "text" : "why not blue?", "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "quote" : "pink", "uuid" : "456860DD", "_id" : { "$oid" : "510ad8c072901e020000003c" }, "permissions" : { "delete" : [ "lobrien@wellesley.edu" ], "update" : [ "lobrien@wellesley.edu" ], "admin" : [ "lobrien@wellesley.edu" ], "read" : [ "lobrien@wellesley.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 811, "end" : "/div[1]", "endOffset" : 815, "_id" : { "$oid" : "510ad8c072901e020000003d" } } ], "updated" : { "$date" : 1359665344190 }, "created" : { "$date" : 1359665344190 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad8c172901e020000003e", "user" : "rdarling@wellesley.edu", "username" : "Rebecca D.", "text" : "I can add my own overlapping annotation at this point as well. ", "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "quote" : "ddenly\ndown, so suddenly that Alice had not a moment to think about stopping herself before she\nfound herself falling down a very deep well.", "uuid" : "D8B3016D", "_id" : { "$oid" : "510ad8c172901e020000003e" }, "permissions" : { "delete" : [ "rdarling@wellesley.edu" ], "update" : [ "rdarling@wellesley.edu" ], "admin" : [ "rdarling@wellesley.edu" ], "read" : [ "rdarling@wellesley.edu" ] }, "tags" : [ "notaboutcontent" ], "ranges" : [ { "start" : "/div[1]", "startOffset" : 1769, "end" : "/div[1]", "endOffset" : 1910, "_id" : { "$oid" : "510ad8c172901e020000003f" } } ], "updated" : { "$date" : 1359665345041 }, "created" : { "$date" : 1359665345041 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad8c372901e0200000040", "user" : "alicia.morris@tufts.edu", "username" : "Alicia M.", "text" : "Start Chapter 1 - Down the Rabbit-Hole", "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "quote" : "CHAPTER I: Down the Rabbit-Hole", "uuid" : "7BFEE0EE", "_id" : { "$oid" : "510ad8c372901e0200000040" }, "permissions" : { "delete" : [ "alicia.morris@tufts.edu" ], "update" : [ "alicia.morris@tufts.edu" ], "admin" : [ "alicia.morris@tufts.edu" ], "read" : [ "alicia.morris@tufts.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/h4[1]", "startOffset" : 0, "end" : "/div[1]/h4[1]", "endOffset" : 31, "_id" : { "$oid" : "510ad8c372901e0200000041" } } ], "updated" : { "$date" : 1359665347173 }, "created" : { "$date" : 1359665347173 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad8eb72901e0200000042", "user" : "jconnolly@masshist.org", "username" : "Jim C.", "text" : "This is curious, because most people are much larger.", "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "quote" : "ten inches high", "uuid" : "9ADF4CFC", "_id" : { "$oid" : "510ad8eb72901e0200000042" }, "permissions" : { "delete" : [ "jconnolly@masshist.org" ], "update" : [ "jconnolly@masshist.org" ], "admin" : [ "jconnolly@masshist.org" ], "read" : [ "jconnolly@masshist.org" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 8948, "end" : "/div[1]", "endOffset" : 8964, "_id" : { "$oid" : "510ad8eb72901e0200000043" } } ], "updated" : { "$date" : 1359665387127 }, "created" : { "$date" : 1359665387127 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad90872901e0200000044", "user" : "alicia.morris@tufts.edu", "username" : "Alicia M.", "text" : "Start Chapter 3 - A Caucus-Race and a Long Tale", "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "quote" : "CHAPTER III: A Caucus-Race and a Long Tale", "uuid" : "CFFBF9F0", "_id" : { "$oid" : "510ad90872901e0200000044" }, "permissions" : { "delete" : [ "alicia.morris@tufts.edu" ], "update" : [ "alicia.morris@tufts.edu" ], "admin" : [ "alicia.morris@tufts.edu" ], "read" : [ "alicia.morris@tufts.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/h4[3]", "startOffset" : 0, "end" : "/div[1]/h4[3]", "endOffset" : 42, "_id" : { "$oid" : "510ad90872901e0200000045" } } ], "updated" : { "$date" : 1359665416079 }, "created" : { "$date" : 1359665416079 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "510ad91e72901e0200000046" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1359665438697 }, "groups" : [], "id" : "510ad91e72901e0200000046", "permissions" : { "delete" : [ "irr@brandeis.edu" ], "update" : [ "irr@brandeis.edu" ], "admin" : [ "irr@brandeis.edu" ], "read" : [ "irr@brandeis.edu" ] }, "quote" : "orphans", "ranges" : [ { "start" : "/div[1]/p[25]", "startOffset" : 336, "end" : "/div[1]/p[25]", "endOffset" : 343, "_id" : { "$oid" : "510adbf472901e020000006e" } } ], "tags" : [ "metaphor" ], "text" : "here, the orphan is a minor feature of an extended allusion to Biblical story of Lazarus. ", "updated" : { "$date" : 1359666340820 }, "uri" : "http://app.annotationstudio.org/documents/moby-dick", "user" : "irr@brandeis.edu", "username" : "Caren I.", "uuid" : "9B9B310F" } -{ "id" : "510ad92072901e0200000048", "user" : "ecrocker@mit.edu", "username" : "Ellen C.", "text" : "Wie klingt ein Trauermarsch auf Guitarre, ich denke meistens an Orgelmusik.", "uri" : "http://app.annotationstudio.org/documents/der-besuch-der-alten-dame-bahnhofszene", "quote" : "Trauermarsch von der Guitarre gespielt.", "uuid" : "F9FCF21C", "_id" : { "$oid" : "510ad92072901e0200000048" }, "permissions" : { "delete" : [ "ecrocker@mit.edu" ], "update" : [ "ecrocker@mit.edu" ], "admin" : [ "ecrocker@mit.edu" ], "read" : [ "ecrocker@mit.edu" ] }, "tags" : [ "Musik,", "Trauer" ], "ranges" : [ { "start" : "/div[1]/i[1]", "startOffset" : 0, "end" : "/div[1]/i[1]", "endOffset" : 39, "_id" : { "$oid" : "510ad92072901e0200000049" } } ], "updated" : { "$date" : 1359665440603 }, "created" : { "$date" : 1359665440603 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad92872901e020000004a", "user" : "lobrien@wellesley.edu", "username" : "Laura O.", "text" : "", "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "quote" : "The rabbit-hole went straight on like a tunnel for some way, and then dipped suddenly\ndown, so suddenly that Alice had not a moment to think about stopping herself before she\nfound herself falling down a very deep well.", "uuid" : "EABE6678", "_id" : { "$oid" : "510ad92872901e020000004a" }, "permissions" : { "delete" : [ "lobrien@wellesley.edu" ], "update" : [ "lobrien@wellesley.edu" ], "admin" : [ "lobrien@wellesley.edu" ], "read" : [ "lobrien@wellesley.edu" ] }, "tags" : [ "tunnel,", "image,", "psychological" ], "ranges" : [ { "start" : "/div[1]", "startOffset" : 1690, "end" : "/div[1]", "endOffset" : 1910, "_id" : { "$oid" : "510ad92872901e020000004b" } } ], "updated" : { "$date" : 1359665448161 }, "created" : { "$date" : 1359665448161 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad93972901e020000004c", "user" : "alicia.morris@tufts.edu", "username" : "Alicia M.", "text" : "Start Chapter 4 - The Rabbit Sends in a Little Bill", "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "quote" : "CHAPTER IV: The Rabbit Sends in a Little Bill", "uuid" : "A0FB550A", "_id" : { "$oid" : "510ad93972901e020000004c" }, "permissions" : { "delete" : [ "alicia.morris@tufts.edu" ], "update" : [ "alicia.morris@tufts.edu" ], "admin" : [ "alicia.morris@tufts.edu" ], "read" : [ "alicia.morris@tufts.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/h4[4]", "startOffset" : 0, "end" : "/div[1]/h4[4]", "endOffset" : 45, "_id" : { "$oid" : "510ad93972901e020000004d" } } ], "updated" : { "$date" : 1359665465177 }, "created" : { "$date" : 1359665465177 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad93b72901e020000004e", "user" : "rdarling@wellesley.edu", "username" : "Rebecca D.", "text" : "I can't select exactly the same text as someone else a second time. Not with the same start/end points. Comments are thus less collaborative?", "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "quote" : "eyes", "uuid" : "BF85FFDD", "_id" : { "$oid" : "510ad93b72901e020000004e" }, "permissions" : { "delete" : [ "rdarling@wellesley.edu" ], "update" : [ "rdarling@wellesley.edu" ], "admin" : [ "rdarling@wellesley.edu" ], "read" : [ "rdarling@wellesley.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 815, "end" : "/div[1]", "endOffset" : 820, "_id" : { "$oid" : "510ad93b72901e020000004f" } } ], "updated" : { "$date" : 1359665467067 }, "created" : { "$date" : 1359665467067 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad95172901e0200000050", "user" : "rdarling@wellesley.edu", "username" : "Rebecca D.", "text" : "The more selections, the brighter the yellow", "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "quote" : "pink\neyes", "uuid" : "56DA5487", "_id" : { "$oid" : "510ad95172901e0200000050" }, "permissions" : { "delete" : [ "rdarling@wellesley.edu" ], "update" : [ "rdarling@wellesley.edu" ], "admin" : [ "rdarling@wellesley.edu" ], "read" : [ "rdarling@wellesley.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 811, "end" : "/div[1]", "endOffset" : 821, "_id" : { "$oid" : "510ad95172901e0200000051" } } ], "updated" : { "$date" : 1359665489203 }, "created" : { "$date" : 1359665489203 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad95b72901e0200000052", "user" : "alicia.morris@tufts.edu", "username" : "Alicia M.", "text" : "Start Chapter 5 - Advice from a Caterpillar", "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "quote" : "CHAPTER V: Advice from a Caterpillar", "uuid" : "E2D4CEEC", "_id" : { "$oid" : "510ad95b72901e0200000052" }, "permissions" : { "delete" : [ "alicia.morris@tufts.edu" ], "update" : [ "alicia.morris@tufts.edu" ], "admin" : [ "alicia.morris@tufts.edu" ], "read" : [ "alicia.morris@tufts.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/h4[5]", "startOffset" : 0, "end" : "/div[1]/h4[5]", "endOffset" : 36, "_id" : { "$oid" : "510ad95b72901e0200000053" } } ], "updated" : { "$date" : 1359665499856 }, "created" : { "$date" : 1359665499856 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad97172901e0200000054", "user" : "irr@brandeis.edu", "username" : "Caren I.", "text" : "literal usage, referring to widows and orphans as investors in the ship", "uri" : "http://app.annotationstudio.org/documents/moby-dick", "quote" : "orphans", "uuid" : "DA1ACB3C", "_id" : { "$oid" : "510ad97172901e0200000054" }, "permissions" : { "delete" : [ "irr@brandeis.edu" ], "update" : [ "irr@brandeis.edu" ], "admin" : [ "irr@brandeis.edu" ], "read" : [ "irr@brandeis.edu" ] }, "tags" : [ "literal" ], "ranges" : [ { "start" : "/div[1]/p[285]", "startOffset" : 199, "end" : "/div[1]/p[285]", "endOffset" : 206, "_id" : { "$oid" : "510ad97172901e0200000055" } } ], "updated" : { "$date" : 1359665521713 }, "created" : { "$date" : 1359665521713 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad97c72901e0200000056", "user" : "ecrocker@mit.edu", "username" : "Ellen C.", "text" : "In Norddeutschland sagt man \"Guten Tag\" - wie könnte man dieses Drama anders für den Norden schreiben?", "uri" : "http://app.annotationstudio.org/documents/der-besuch-der-alten-dame-bahnhofszene", "quote" : "Grüß Gott,", "uuid" : "8D440A1A", "_id" : { "$oid" : "510ad97c72901e0200000056" }, "permissions" : { "delete" : [ "ecrocker@mit.edu" ], "update" : [ "ecrocker@mit.edu" ], "admin" : [ "ecrocker@mit.edu" ], "read" : [ "ecrocker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]/span[2]", "startOffset" : 0, "end" : "/div[1]/p[1]/span[2]", "endOffset" : 10, "_id" : { "$oid" : "510ad97c72901e0200000057" } } ], "updated" : { "$date" : 1359665532216 }, "created" : { "$date" : 1359665532216 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad9ae72901e0200000058", "user" : "alicia.morris@tufts.edu", "username" : "Alicia M.", "text" : "Start Chapter 7 - A Mad Tea-Party", "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "quote" : "CHAPTER VII: A Mad Tea-Party", "uuid" : "B1C94527", "_id" : { "$oid" : "510ad9ae72901e0200000058" }, "permissions" : { "delete" : [ "alicia.morris@tufts.edu" ], "update" : [ "alicia.morris@tufts.edu" ], "admin" : [ "alicia.morris@tufts.edu" ], "read" : [ "alicia.morris@tufts.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/h4[6]", "startOffset" : 0, "end" : "/div[1]/h4[6]", "endOffset" : 28, "_id" : { "$oid" : "510ad9ae72901e0200000059" } } ], "updated" : { "$date" : 1359665582582 }, "created" : { "$date" : 1359665582582 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad9c872901e020000005a", "user" : "irr@brandeis.edu", "username" : "Caren I.", "text" : "", "uri" : "http://app.annotationstudio.org/documents/moby-dick", "quote" : "orphans", "uuid" : "FCE247AE", "_id" : { "$oid" : "510ad9c872901e020000005a" }, "permissions" : { "delete" : [ "irr@brandeis.edu" ], "update" : [ "irr@brandeis.edu" ], "admin" : [ "irr@brandeis.edu" ], "read" : [ "irr@brandeis.edu" ] }, "tags" : [ "metaphor" ], "ranges" : [ { "start" : "/div[1]/p[1927]", "startOffset" : 204, "end" : "/div[1]/p[1927]", "endOffset" : 211, "_id" : { "$oid" : "510ad9c872901e020000005b" } } ], "updated" : { "$date" : 1359665608434 }, "created" : { "$date" : 1359665608434 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad9e572901e020000005c", "user" : "egarrels@mit.edu", "username" : "Elizabeth G.", "text" : "flanneur - urban space ", "uri" : "http://app.annotationstudio.org/documents/moby-dick", "quote" : "Circumambulate the city of a dreamy Sabbath afternoo", "uuid" : "76E59109", "_id" : { "$oid" : "510ad9e572901e020000005c" }, "permissions" : { "delete" : [ "egarrels@mit.edu" ], "update" : [ "egarrels@mit.edu" ], "admin" : [ "egarrels@mit.edu" ], "read" : [ "egarrels@mit.edu" ] }, "tags" : [ "U.S.", "Urban", "space,", "leisure" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 0, "end" : "/div[1]/p[3]", "endOffset" : 52, "_id" : { "$oid" : "510ad9e572901e020000005d" } } ], "updated" : { "$date" : 1359665637917 }, "created" : { "$date" : 1359665637917 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ad9ec72901e020000005e", "user" : "lobrien@wellesley.edu", "username" : "Laura O.", "text" : "", "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "quote" : "she did not like to drop the jar for fear of killing\nsomebody", "uuid" : "DD6A5413", "_id" : { "$oid" : "510ad9ec72901e020000005e" }, "permissions" : { "delete" : [ "lobrien@wellesley.edu" ], "update" : [ "lobrien@wellesley.edu" ], "admin" : [ "lobrien@wellesley.edu" ], "read" : [ "lobrien@wellesley.edu" ] }, "tags" : [ "psychological" ], "ranges" : [ { "start" : "/div[1]", "startOffset" : 2486, "end" : "/div[1]", "endOffset" : 2547, "_id" : { "$oid" : "510ad9ec72901e020000005f" } } ], "updated" : { "$date" : 1359665644269 }, "created" : { "$date" : 1359665644269 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "510ada1972901e0200000060" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1359665689440 }, "id" : "510ada1972901e0200000060", "permissions" : { "delete" : [ "ecrocker@mit.edu" ], "update" : [ "ecrocker@mit.edu" ], "admin" : [ "ecrocker@mit.edu" ], "read" : [ "ecrocker@mit.edu" ] }, "quote" : "die Passionsspiele in Oberammergau.", "ranges" : [ { "start" : "/div[1]/span[3]/i[1]", "startOffset" : 29, "end" : "/div[1]/span[3]/i[1]", "endOffset" : 64, "_id" : { "$oid" : "510ada1972901e0200000061" } } ], "tags" : [ "BIlder,", "Landeskunde" ], "text" : "[link](http://www.google.com/search?client=safari&rls=en&q=oberammergau+passion+play&oe=UTF-8&um=1&ie=UTF-8&hl=en&tbm=isch&source=og&sa=N&tab=wi&ei=7dkKUfSUD-eW0QHj04GwBw&biw=1178&bih=660&sei=9dkKUZ7gMYvU0gH8rYG4Bg#imgrc=Q2H7QwVI7_ZTnM%3A%3BVLfrS8Dma-oV8M%3Bhttp%253A%252F%252Fwww.ruijstravel.com%252Fpage45%252FOberammergau%252Ffiles%252Fpage40_1.jpg%3Bhttp%253A%252F%252Fwww.ruijstravel.com%252Fpage45%252FOberammergau%252F%3B693%3B341) Was in Gottes Namen machen die Leute in diesem Ort?", "updated" : { "$date" : 1359665938158 }, "uri" : "http://app.annotationstudio.org/documents/der-besuch-der-alten-dame-bahnhofszene", "user" : "ecrocker@mit.edu", "username" : "Ellen C.", "uuid" : "330CA9D1" } -{ "id" : "510ada9072901e0200000062", "user" : "njackson@mit.edu", "username" : "Noel J.", "text" : "The soliloquy begins by noting the conditions in which soliloquy can begin.", "uri" : "http://app.annotationstudio.org/documents/hamlet", "quote" : "Now   I   am   alone .", "uuid" : "98A68C60", "_id" : { "$oid" : "510ada9072901e0200000062" }, "permissions" : { "delete" : [ "njackson@mit.edu" ], "update" : [ "njackson@mit.edu" ], "admin" : [ "njackson@mit.edu" ], "read" : [ "njackson@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[2]/div[2]/p[358]", "startOffset" : 44, "end" : "/div[1]/div[2]/div[2]/p[358]", "endOffset" : 67, "_id" : { "$oid" : "510ada9072901e0200000063" } } ], "updated" : { "$date" : 1359665808169 }, "created" : { "$date" : 1359665808169 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510adae072901e0200000064", "user" : "irr@brandeis.edu", "username" : "Caren I.", "text" : "Ishmael is the orphan, abandoned by the ship as mother.", "uri" : "http://app.annotationstudio.org/documents/moby-dick", "quote" : "orphan", "uuid" : "C5C259D1", "_id" : { "$oid" : "510adae072901e0200000064" }, "permissions" : { "delete" : [ "irr@brandeis.edu" ], "update" : [ "irr@brandeis.edu" ], "admin" : [ "irr@brandeis.edu" ], "read" : [ "irr@brandeis.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2402]", "startOffset" : 1348, "end" : "/div[1]/p[2402]", "endOffset" : 1354, "_id" : { "$oid" : "510adae072901e0200000065" } } ], "updated" : { "$date" : 1359665888921 }, "created" : { "$date" : 1359665888921 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510adb0572901e0200000066", "user" : "njackson@mit.edu", "username" : "Noel J.", "text" : "The soliloquy begins by noting the condition of solitude on which all soliloquies depend.", "uri" : "http://app.annotationstudio.org/documents/hamlet", "quote" : "Now   I   am   alone .", "uuid" : "30F1EFA1", "_id" : { "$oid" : "510adb0572901e0200000066" }, "permissions" : { "delete" : [ "njackson@mit.edu" ], "update" : [ "njackson@mit.edu" ], "admin" : [ "njackson@mit.edu" ], "read" : [ "njackson@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[2]/div[2]/p[358]", "startOffset" : 44, "end" : "/div[1]/div[2]/div[2]/p[358]", "endOffset" : 67, "_id" : { "$oid" : "510adb0572901e0200000067" } } ], "updated" : { "$date" : 1359665925205 }, "created" : { "$date" : 1359665925205 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "510adb7872901e0200000068" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1359666040789 }, "id" : "510adb7872901e0200000068", "permissions" : { "delete" : [ "njackson@mit.edu" ], "update" : [ "njackson@mit.edu" ], "admin" : [ "njackson@mit.edu" ], "read" : [ "njackson@mit.edu" ] }, "quote" : "suiting \nWith   forms   to   his   conceit", "ranges" : [ { "start" : "/div[1]/div[2]/div[2]/p[358]", "startOffset" : 484, "end" : "/div[1]/div[2]/div[2]/p[358]", "endOffset" : 526, "_id" : { "$oid" : "510adb7872901e0200000069" } } ], "tags" : [ "drama,", "performance,", "meta-theater" ], "text" : "\"Suit the words to the actions, the actions to the words\" -- Hamlet's charge to the players; advice he can't take himself", "updated" : { "$date" : 1359666151902 }, "uri" : "http://app.annotationstudio.org/documents/hamlet", "user" : "njackson@mit.edu", "username" : "Noel J.", "uuid" : "FB5AB67A" } -{ "__v" : 1, "_id" : { "$oid" : "510adbd672901e020000006a" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1359666134603 }, "groups" : [], "id" : "510adbd672901e020000006a", "permissions" : { "delete" : [ "njackson@mit.edu" ], "update" : [ "njackson@mit.edu" ], "admin" : [ "njackson@mit.edu" ], "read" : [ "njackson@mit.edu" ] }, "quote" : "cue", "ranges" : [ { "start" : "/div[1]/div[2]/div[2]/p[358]", "startOffset" : 734, "end" : "/div[1]/div[2]/div[2]/p[358]", "endOffset" : 737, "_id" : { "$oid" : "510ade5172901e0200000081" } } ], "tags" : [ "drama,", "performance,", "meta-theater" ], "text" : "The terms of theater throughout the passage are appropriate, given 1) that Hamlet here compares his own (in)action to that of the actor 2) the soliloquy ends with his plan for the play within a play. ", "updated" : { "$date" : 1359666769096 }, "uri" : "http://app.annotationstudio.org/documents/hamlet", "user" : "njackson@mit.edu", "username" : "Noel J.", "uuid" : "9A8C8E98" } -{ "id" : "510adbd872901e020000006c", "user" : "alicia.morris@tufts.edu", "username" : "Alicia M.", "text" : "Alice talking nonsense", "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "quote" : "ALICE'S RIGHT FOOT, ESQ.\n\t\t\t        HEARTHRUG,\n\t\t\t               \n\t\t\tNEAR THE FENDER,\n\t\t\t                       \n\t\t\t(WITH ALICE'S LOVE).", "uuid" : "0E1161BB", "_id" : { "$oid" : "510adbd872901e020000006c" }, "permissions" : { "delete" : [ "alicia.morris@tufts.edu" ], "update" : [ "alicia.morris@tufts.edu" ], "admin" : [ "alicia.morris@tufts.edu" ], "read" : [ "alicia.morris@tufts.edu" ] }, "tags" : [ "nonsense,", "gibberish" ], "ranges" : [ { "start" : "/div[1]/p[9]", "startOffset" : 962, "end" : "/div[1]/p[9]", "endOffset" : 1098, "_id" : { "$oid" : "510adbd872901e020000006d" } } ], "updated" : { "$date" : 1359666136998 }, "created" : { "$date" : 1359666136998 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510adc2372901e020000006f", "user" : "jconnolly@masshist.org", "username" : "Jim C.", "text" : "This is [Picture of Lewis Carroll](http://www.biography.com/imported/images/Biography/Images/Profiles/C/Lewis-Carroll-9239598-1-402.jpg) inline link.", "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "quote" : "Lewis Carroll", "uuid" : "C867B24E", "_id" : { "$oid" : "510adc2372901e020000006f" }, "permissions" : { "delete" : [ "jconnolly@masshist.org" ], "update" : [ "jconnolly@masshist.org" ], "admin" : [ "jconnolly@masshist.org" ], "read" : [ "jconnolly@masshist.org" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 37, "end" : "/div[1]/p[1]", "endOffset" : 50, "_id" : { "$oid" : "510adc2372901e0200000070" } } ], "updated" : { "$date" : 1359666211355 }, "created" : { "$date" : 1359666211355 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510adc7a72901e0200000073", "user" : "wedaman@brandeis.edu", "username" : "D Grainger W.", "text" : "I need to remember this line the next time I see a ghost . . .", "uri" : "http://app.annotationstudio.org/documents/hamlet", "quote" : "Or   if   thou   hast   uphoarded   in   thy   life \nExtorted   treasure   in   the   womb   of   earth , \nFor   which ,   they   say ,   you   spirits   oft   walk   in   death ,", "uuid" : "29B18301", "_id" : { "$oid" : "510adc7a72901e0200000073" }, "permissions" : { "delete" : [ "wedaman@brandeis.edu" ], "update" : [ "wedaman@brandeis.edu" ], "admin" : [ "wedaman@brandeis.edu" ], "read" : [ "wedaman@brandeis.edu" ] }, "tags" : [ "horde,", "treasure,", "funds,", "reimbursement" ], "ranges" : [ { "start" : "/div[1]/div[1]/div[1]", "startOffset" : 519, "end" : "/div[1]/div[1]/div[1]", "endOffset" : 699, "_id" : { "$oid" : "510adc7a72901e0200000074" } } ], "updated" : { "$date" : 1359666298887 }, "created" : { "$date" : 1359666298887 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "510adcf072901e0200000075" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1359666416892 }, "id" : "510adcf072901e0200000075", "permissions" : { "delete" : [ "njackson@mit.edu" ], "update" : [ "njackson@mit.edu" ], "admin" : [ "njackson@mit.edu" ], "read" : [ "njackson@mit.edu" ] }, "quote" : "unpregnant   of   my   cause", "ranges" : [ { "start" : "/div[1]/div[2]/div[2]/p[358]", "startOffset" : 1132, "end" : "/div[1]/div[2]/div[2]/p[358]", "endOffset" : 1160, "_id" : { "$oid" : "510adcf072901e0200000076" } } ], "tags" : [ "gender" ], "text" : "Cause: motivating force (Aristotle's efficient cause) OR final purpose in a teleological scheme (the \"final cause\"). Hamlet is \"unpregnant\" of both causes -- uninspired to act, he is also stripped of his purpose as an actor (to avenge his father's death). ", "updated" : { "$date" : 1359666429269 }, "uri" : "http://app.annotationstudio.org/documents/hamlet", "user" : "njackson@mit.edu", "username" : "Noel J.", "uuid" : "2E021EBA" } -{ "id" : "510add6372901e0200000079", "user" : "carol.chiodo@yale.edu", "username" : "Carol C.", "text" : "[audio](http://homes.chass.utoronto.ca/~ngargano/millennio/audio/dante.mp3)", "uri" : "http://app.annotationstudio.org/documents/la-divina-commedia", "quote" : "Nel mezzo del cammin di nostra vita\nmi ritrovai per una selva oscura\nché la diritta via era smarrita.\nAhi quanto a dir qual era è cosa dura\nesta selva selvaggia e aspra e forte\nche nel pensier rinova la paura!", "uuid" : "9740F1FE", "_id" : { "$oid" : "510add6372901e0200000079" }, "permissions" : { "delete" : [ "carol.chiodo@yale.edu" ], "update" : [ "carol.chiodo@yale.edu" ], "admin" : [ "carol.chiodo@yale.edu" ], "read" : [ "carol.chiodo@yale.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/pre[1]", "startOffset" : 0, "end" : "/div[1]/pre[1]", "endOffset" : 209, "_id" : { "$oid" : "510add6372901e020000007a" } } ], "updated" : { "$date" : 1359666531737 }, "created" : { "$date" : 1359666531737 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "510add6f72901e020000007b" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1359666543934 }, "id" : "510add6f72901e020000007b", "permissions" : { "delete" : [ "ecrocker@mit.edu" ], "update" : [ "ecrocker@mit.edu" ], "admin" : [ "ecrocker@mit.edu" ], "read" : [ "ecrocker@mit.edu" ] }, "quote" : "Der Bahn­hof", "ranges" : [ { "start" : "/div[1]/span[1]/i[1]", "startOffset" : 54, "end" : "/div[1]/span[2]/i[1]", "endOffset" : 3, "_id" : { "$oid" : "510add6f72901e020000007c" } } ], "tags" : [], "text" : "[link](http://www.youtube.com/watch?v=2vOtW8yErks&feature=player_detailpage#t=3873s) Aufführung in Kantonschule Wohlen", "updated" : { "$date" : 1359666562772 }, "uri" : "http://app.annotationstudio.org/documents/der-besuch-der-alten-dame-bahnhofszene", "user" : "ecrocker@mit.edu", "username" : "Ellen C.", "uuid" : "38043415" } -{ "id" : "510add9b72901e020000007d", "user" : "njackson@mit.edu", "username" : "Noel J.", "text" : "\"I must be a coward; for If I weren't one I would already have cut him open and let the birds feast on his guts. ", "uri" : "http://app.annotationstudio.org/documents/hamlet", "quote" : "t   cannot   be \nBut   I   am   pigeon-livered   and   lack   gall \nTo   make   oppression   bitter ,   or   ere   this \nI   should   have   fatted   all   the   region   kites \nWith   this   slave’s   offal", "uuid" : "775394E7", "_id" : { "$oid" : "510add9b72901e020000007d" }, "permissions" : { "delete" : [ "njackson@mit.edu" ], "update" : [ "njackson@mit.edu" ], "admin" : [ "njackson@mit.edu" ], "read" : [ "njackson@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[2]/div[2]/p[358]", "startOffset" : 1660, "end" : "/div[1]/div[2]/div[2]/p[358]", "endOffset" : 1868, "_id" : { "$oid" : "510add9b72901e020000007e" } } ], "updated" : { "$date" : 1359666587282 }, "created" : { "$date" : 1359666587282 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510addfe72901e020000007f", "user" : "njackson@mit.edu", "username" : "Noel J.", "text" : "\"Focus, man...\"", "uri" : "http://app.annotationstudio.org/documents/hamlet", "quote" : "About ,   my   brains", "uuid" : "2DEED96C", "_id" : { "$oid" : "510addfe72901e020000007f" }, "permissions" : { "delete" : [ "njackson@mit.edu" ], "update" : [ "njackson@mit.edu" ], "admin" : [ "njackson@mit.edu" ], "read" : [ "njackson@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/div[2]/div[2]/p[358]", "startOffset" : 2372, "end" : "/div[1]/div[2]/div[2]/p[358]", "endOffset" : 2393, "_id" : { "$oid" : "510addfe72901e0200000080" } } ], "updated" : { "$date" : 1359666686578 }, "created" : { "$date" : 1359666686578 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "510ade8772901e0200000082" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1359666823439 }, "id" : "510ade8772901e0200000082", "permissions" : { "delete" : [ "njackson@mit.edu" ], "update" : [ "njackson@mit.edu" ], "admin" : [ "njackson@mit.edu" ], "read" : [ "njackson@mit.edu" ] }, "quote" : "stallion13 scullion13", "ranges" : [ { "start" : "/div[1]/div[2]/div[2]/p[358]", "startOffset" : 2319, "end" : "/div[1]/div[2]/div[2]/p[358]", "endOffset" : 2340, "_id" : { "$oid" : "510ade8772901e0200000083" } } ], "tags" : [ "query,", "textual", "history" ], "text" : "Textual variants?", "updated" : { "$date" : 1359666836751 }, "uri" : "http://app.annotationstudio.org/documents/hamlet", "user" : "njackson@mit.edu", "username" : "Noel J.", "uuid" : "7B7E547F" } -{ "id" : "510adee872901e0200000084", "user" : "ecrocker@mit.edu", "username" : "Ellen C.", "text" : "![link](http://joschramm.de/wp-content/uploads/2010/11/der-besuch-der-alten-dame_bild_13-640x420.jpg) Güllen", "uri" : "http://app.annotationstudio.org/documents/der-besuch-der-alten-dame-bahnhofszene", "quote" : "Er geht wieder auf den Bahnhof zu.", "uuid" : "AEE03FE5", "_id" : { "$oid" : "510adee872901e0200000084" }, "permissions" : { "delete" : [ "ecrocker@mit.edu" ], "update" : [ "ecrocker@mit.edu" ], "admin" : [ "ecrocker@mit.edu" ], "read" : [ "ecrocker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[16]/span[1]/i[1]", "startOffset" : 0, "end" : "/div[1]/p[17]/span[1]/span[1]", "endOffset" : 0, "_id" : { "$oid" : "510adee872901e0200000085" } } ], "updated" : { "$date" : 1359666920484 }, "created" : { "$date" : 1359666920484 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510adf0672901e0200000086", "user" : "carol.chiodo@yale.edu", "username" : "Carol C.", "text" : "pianeta/queta/pieta", "uri" : "http://app.annotationstudio.org/documents/la-divina-commedia", "quote" : "pianeta", "uuid" : "947E1F44", "_id" : { "$oid" : "510adf0672901e0200000086" }, "permissions" : { "delete" : [ "carol.chiodo@yale.edu" ], "update" : [ "carol.chiodo@yale.edu" ], "admin" : [ "carol.chiodo@yale.edu" ], "read" : [ "carol.chiodo@yale.edu" ] }, "tags" : [ "rhyme", "words" ], "ranges" : [ { "start" : "/div[1]/pre[1]", "startOffset" : 603, "end" : "/div[1]/pre[1]", "endOffset" : 610, "_id" : { "$oid" : "510adf0672901e0200000087" } } ], "updated" : { "$date" : 1359666950471 }, "created" : { "$date" : 1359666950471 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "510adf2872901e0200000088" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1359666984870 }, "id" : "510adf2872901e0200000088", "permissions" : { "delete" : [ "carol.chiodo@yale.edu" ], "update" : [ "carol.chiodo@yale.edu" ], "admin" : [ "carol.chiodo@yale.edu" ], "read" : [ "carol.chiodo@yale.edu" ] }, "quote" : "molto", "ranges" : [ { "start" : "/div[1]/pre[1]", "startOffset" : 1159, "end" : "/div[1]/pre[1]", "endOffset" : 1164, "_id" : { "$oid" : "510adf2872901e0200000089" } } ], "tags" : [ "rhyme_words", "ambiguity" ], "text" : "molto/volto/volto", "updated" : { "$date" : 1359667118556 }, "uri" : "http://app.annotationstudio.org/documents/la-divina-commedia", "user" : "carol.chiodo@yale.edu", "username" : "Carol C.", "uuid" : "512E5F87" } -{ "id" : "510ae1cb72901e020000008a", "user" : "njackson@mit.edu", "username" : "Noel J.", "text" : "", "uri" : "http://app.annotationstudio.org/documents/hamlet", "quote" : "fiction", "uuid" : "2B03F616", "_id" : { "$oid" : "510ae1cb72901e020000008a" }, "permissions" : { "delete" : [ "njackson@mit.edu" ], "update" : [ "njackson@mit.edu" ], "admin" : [ "njackson@mit.edu" ], "read" : [ "njackson@mit.edu" ] }, "tags" : [ "meta-theater" ], "ranges" : [ { "start" : "/div[1]/div[2]/div[2]/p[358]", "startOffset" : 201, "end" : "/div[1]/div[2]/div[2]/p[358]", "endOffset" : 208, "_id" : { "$oid" : "510ae1cb72901e020000008b" } } ], "updated" : { "$date" : 1359667659015 }, "created" : { "$date" : 1359667659015 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510ae47e72901e020000008c", "user" : "lindsay.whitacre@bc.edu", "username" : "Lindsay W.", "text" : "This is a second instance of a test annotation", "uri" : "http://app.annotationstudio.org/documents/il-principe", "quote" : "Non", "uuid" : "8C05CF8F", "_id" : { "$oid" : "510ae47e72901e020000008c" }, "permissions" : { "delete" : [ "lindsay.whitacre@bc.edu" ], "update" : [ "lindsay.whitacre@bc.edu" ], "admin" : [ "lindsay.whitacre@bc.edu" ], "read" : [ "lindsay.whitacre@bc.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[273]", "startOffset" : 0, "end" : "/div[1]/p[273]", "endOffset" : 4, "_id" : { "$oid" : "510ae47e72901e020000008d" } } ], "updated" : { "$date" : 1359668350893 }, "created" : { "$date" : 1359668350893 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510b11ce72901e020000008e", "user" : "captionbox@gmail.com", "username" : "A. David L.", "text" : "The scene, the act, and the play begin with a sense of tension; a guard -- what need is there for an armed guard, exactly? -- pointedly asks who is there. The audience is the first, most obvious answer, but the unnamed Francisco only replies with his own mirrored anxiety.", "uri" : "http://app.annotationstudio.org/documents/hamlet", "quote" : "Who’s   there ?", "uuid" : "743EF3C3", "_id" : { "$oid" : "510b11ce72901e020000008e" }, "permissions" : { "delete" : [ "captionbox@gmail.com" ], "update" : [ "captionbox@gmail.com" ], "admin" : [ "captionbox@gmail.com" ], "read" : [ "captionbox@gmail.com" ] }, "tags" : [ "anxiety,", "act", "I,", "audience" ], "ranges" : [ { "start" : "/div[1]/div[1]/p[2]", "startOffset" : 1, "end" : "/div[1]/div[1]/p[2]", "endOffset" : 16, "_id" : { "$oid" : "510b11ce72901e020000008f" } } ], "updated" : { "$date" : 1359680147958 }, "created" : { "$date" : 1359679950134 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "510dc72227ccd00200000002", "user" : "ryneeverett@gmail.com", "username" : "Ryne E.", "text" : "This should be a beer brand.", "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "quote" : "DRINK ME", "uuid" : "C1C801B1", "_id" : { "$oid" : "510dc72227ccd00200000002" }, "permissions" : { "delete" : [ "ryneeverett@gmail.com" ], "update" : [ "ryneeverett@gmail.com" ], "admin" : [ "ryneeverett@gmail.com" ], "read" : [ "ryneeverett@gmail.com" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 7719, "end" : "/div[1]", "endOffset" : 7727, "_id" : { "$oid" : "510dc72227ccd00200000003" } } ], "updated" : { "$date" : 1359857442683 }, "created" : { "$date" : 1359857442683 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5110165794b10f0200000002", "user" : "jfolsom@mit.edu", "username" : "Jamie F.", "text" : "Some comment", "uri" : "http://app.annotationstudio.org/documents/la-divina-commedia", "quote" : "ben ridir com'i", "uuid" : "226D83D7", "_id" : { "$oid" : "5110165794b10f0200000002" }, "permissions" : { "delete" : [ "jfolsom@mit.edu" ], "update" : [ "jfolsom@mit.edu" ], "admin" : [ "jfolsom@mit.edu" ], "read" : [ "jfolsom@mit.edu" ] }, "tags" : [ "some", "tags" ], "ranges" : [ { "start" : "/div[1]/pre[1]", "startOffset" : 335, "end" : "/div[1]/pre[1]", "endOffset" : 350, "_id" : { "$oid" : "5110165794b10f0200000003" } } ], "updated" : { "$date" : 1360008791898 }, "created" : { "$date" : 1360008791898 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51110da5843bf60200000002", "user" : "lmskay@gmail.com", "username" : "Lindsaytest W.", "text" : "This is a test using the username lmskay", "uri" : "http://app.annotationstudio.org/documents/il-principe", "quote" : "Sogliono, el più delle", "uuid" : "B62656C0", "_id" : { "$oid" : "51110da5843bf60200000002" }, "permissions" : { "delete" : [ "lmskay@gmail.com" ], "update" : [ "lmskay@gmail.com" ], "admin" : [ "lmskay@gmail.com" ], "read" : [ "lmskay@gmail.com" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 0, "end" : "/div[1]/p[5]", "endOffset" : 22, "_id" : { "$oid" : "51110da5843bf60200000003" } } ], "updated" : { "$date" : 1360072101691 }, "created" : { "$date" : 1360072101691 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511125db843bf60200000004", "user" : "shepardl@bc.edu", "username" : "Laurie S.", "text" : "Quanti capitoli cominciano con una parola temporale.", "uri" : "http://app.annotationstudio.org/documents/il-principe", "quote" : "Quando", "uuid" : "CF02D3F1", "_id" : { "$oid" : "511125db843bf60200000004" }, "permissions" : { "delete" : [ "shepardl@bc.edu" ], "update" : [ "shepardl@bc.edu" ], "admin" : [ "shepardl@bc.edu" ], "read" : [ "shepardl@bc.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[45]", "startOffset" : 0, "end" : "/div[1]/p[45]", "endOffset" : 6, "_id" : { "$oid" : "511125db843bf60200000005" } } ], "updated" : { "$date" : 1360078299439 }, "created" : { "$date" : 1360078299439 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511279357101240200000002", "user" : "wkelley@mit.edu", "username" : "Wyn K.", "text" : "Gives the year of the story", "uri" : "http://annotationstudio.mit.edu/documents/benito-cereno", "quote" : "n the year 1799, Captain Amasa Delano,", "uuid" : "BC26FF6D", "_id" : { "$oid" : "511279357101240200000002" }, "permissions" : { "delete" : [ "wkelley@mit.edu" ], "update" : [ "wkelley@mit.edu" ], "admin" : [ "wkelley@mit.edu" ], "read" : [ "wkelley@mit.edu" ] }, "tags" : [ "dates,", "Delano" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1, "end" : "/div[1]/p[1]", "endOffset" : 39, "_id" : { "$oid" : "511279357101240200000003" } } ], "updated" : { "$date" : 1360165173651 }, "created" : { "$date" : 1360165173651 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "511289980341d60200000002" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360169368121 }, "groups" : [], "id" : "511289980341d60200000002", "permissions" : { "delete" : [ "jfolsom@mit.edu" ], "update" : [ "jfolsom@mit.edu" ], "admin" : [ "jfolsom@mit.edu" ], "read" : [ "jfolsom@mit.edu" ] }, "quote" : "complete escape", "ranges" : [ { "start" : "/div[1]/p[803]", "startOffset" : 104, "end" : "/div[1]/p[803]", "endOffset" : 119, "_id" : { "$oid" : "51129e8d0341d60200000006" } } ], "tags" : [], "text" : "", "updated" : { "$date" : 1360174733214 }, "uri" : "http://localhost:3000/documents/moby-dick", "user" : "[object Object]", "username" : "Jamie F.", "uuid" : "518D1BAB" } -{ "id" : "511289a20341d60200000004", "user" : "jfolsom@mit.edu", "username" : "Jamie F.", "text" : "", "uri" : "http://localhost:3000/documents/moby-dick", "quote" : "three years intervened", "uuid" : "A344640E", "_id" : { "$oid" : "511289a20341d60200000004" }, "permissions" : { "delete" : [ "jfolsom@mit.edu" ], "update" : [ "jfolsom@mit.edu" ], "admin" : [ "jfolsom@mit.edu" ], "read" : [ "jfolsom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[803]", "startOffset" : 342, "end" : "/div[1]/p[803]", "endOffset" : 364, "_id" : { "$oid" : "511289a20341d60200000005" } } ], "updated" : { "$date" : 1360169378023 }, "created" : { "$date" : 1360169378023 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51129f7d7101240200000004", "username" : "Jamie F.", "text" : "", "uri" : "http://localhost:3000/documents/moby-dick", "quote" : "desired impression by separate citations of items, practically or reliably known to me as a whaleman", "uuid" : "3E505FBF", "_id" : { "$oid" : "51129f7d7101240200000004" }, "permissions" : { "delete" : [ "2" ], "update" : [ "2" ], "admin" : [ "2" ], "read" : [ "2", "workshop" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[802]", "startOffset" : 93, "end" : "/div[1]/p[802]", "endOffset" : 193, "_id" : { "$oid" : "51129f7d7101240200000005" } } ], "updated" : { "$date" : 1360174973147 }, "created" : { "$date" : 1360174973147 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51129fd90341d60200000007", "username" : "Jamie F.", "text" : "", "uri" : "http://localhost:3000/documents/moby-dick", "quote" : "main points of this affair", "uuid" : "F4E0ADAB", "_id" : { "$oid" : "51129fd90341d60200000007" }, "permissions" : { "delete" : [ "2" ], "update" : [ "2" ], "admin" : [ "2" ], "read" : [ "2", "workshop" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[801]", "startOffset" : 555, "end" : "/div[1]/p[801]", "endOffset" : 581, "_id" : { "$oid" : "51129fd90341d60200000008" } } ], "groups" : [ "workshop" ], "updated" : { "$date" : 1360175065742 }, "created" : { "$date" : 1360175065742 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5112a0150341d60200000009", "username" : "Jamie F.", "text" : "", "uri" : "http://localhost:3000/documents/moby-dick", "quote" : "First: I have personally known", "uuid" : "727E9A4B", "_id" : { "$oid" : "5112a0150341d60200000009" }, "permissions" : { "delete" : [ "2" ], "update" : [ "2" ], "admin" : [ "2" ], "read" : [ "2", "workshop" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[803]", "startOffset" : 0, "end" : "/div[1]/p[803]", "endOffset" : 30, "_id" : { "$oid" : "5112a0150341d6020000000a" } } ], "groups" : [ "workshop" ], "updated" : { "$date" : 1360175125477 }, "created" : { "$date" : 1360175125477 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5112b83d0341d6020000000b", "username" : "Jamie F.", "text" : "Eww", "uri" : "http://localhost:3000/documents/moby-dick", "quote" : "dead fish", "uuid" : "EEE32076", "_id" : { "$oid" : "5112b83d0341d6020000000b" }, "permissions" : { "delete" : [ "2" ], "update" : [ "2" ], "admin" : [ "2" ], "read" : [ "2", "workshop" ] }, "tags" : [ "yuck,", "pee-yoo" ], "ranges" : [ { "start" : "/div[1]/p[803]", "startOffset" : 1342, "end" : "/div[1]/p[803]", "endOffset" : 1351, "_id" : { "$oid" : "5112b83d0341d6020000000c" } } ], "groups" : [ "workshop" ], "updated" : { "$date" : 1360181309760 }, "created" : { "$date" : 1360181309760 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5112baae0341d6020000000d", "username" : "Jamie F.", "text" : "", "uri" : "http://localhost:3000/documents/moby-dick", "quote" : "fishery there hung a terrible prestige", "uuid" : "ABA6672E", "_id" : { "$oid" : "5112baae0341d6020000000d" }, "permissions" : { "delete" : [ "2" ], "update" : [ "2" ], "admin" : [ "2" ], "read" : [ "2", "workshop" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[804]", "startOffset" : 637, "end" : "/div[1]/p[804]", "endOffset" : 675, "_id" : { "$oid" : "5112baae0341d6020000000e" } } ], "groups" : [ "workshop" ], "updated" : { "$date" : 1360181934702 }, "created" : { "$date" : 1360181934702 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5112bae20341d6020000000f", "username" : "Jamie F.", "text" : "", "uri" : "http://localhost:3000/documents/moby-dick", "quote" : "each of these", "uuid" : "1A11C498", "_id" : { "$oid" : "5112bae20341d6020000000f" }, "permissions" : { "delete" : [ "2" ], "update" : [ "2" ], "admin" : [ "2" ], "read" : [ "2", "workshop" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[805]", "startOffset" : 17, "end" : "/div[1]/p[805]", "endOffset" : 30, "_id" : { "$oid" : "5112bae20341d60200000010" } } ], "groups" : [ "workshop" ], "updated" : { "$date" : 1360181986032 }, "created" : { "$date" : 1360181986032 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5112cd7b7101240200000006", "user" : "lgordis@barnard.edu", "username" : "Lisa G.", "text" : "Is there a way for one annotator to respond to another person's annotation directly?", "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "quote" : "pink\neyes", "uuid" : "7607D3ED", "_id" : { "$oid" : "5112cd7b7101240200000006" }, "permissions" : { "delete" : [ "lgordis@barnard.edu" ], "update" : [ "lgordis@barnard.edu" ], "admin" : [ "lgordis@barnard.edu" ], "read" : [ "lgordis@barnard.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 811, "end" : "/div[1]", "endOffset" : 820, "_id" : { "$oid" : "5112cd7b7101240200000007" } } ], "updated" : { "$date" : 1360186747864 }, "created" : { "$date" : 1360186747864 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5112e2b50341d60200000011", "user" : "lgordis@barnard.edu", "username" : "Lisa G.", "text" : "A very long sentence.", "uri" : "http://app.annotationstudio.org/documents/moby-dick", "quote" : "blood", "uuid" : "C1B31141", "_id" : { "$oid" : "5112e2b50341d60200000011" }, "permissions" : { "delete" : [ "lgordis@barnard.edu" ], "update" : [ "lgordis@barnard.edu" ], "admin" : [ "lgordis@barnard.edu" ], "read" : [ "lgordis@barnard.edu" ] }, "tags" : [ "syntax" ], "ranges" : [ { "start" : "/div[1]/p[748]", "startOffset" : 2763, "end" : "/div[1]/p[748]", "endOffset" : 2768, "_id" : { "$oid" : "5112e2b50341d60200000012" } } ], "updated" : { "$date" : 1360192275029 }, "created" : { "$date" : 1360192181763 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5112e34b0341d60200000013", "user" : "lgordis@barnard.edu", "username" : "Lisa G.", "text" : "This is a very long sentence.", "uri" : "http://app.annotationstudio.org/documents/moby-dick", "quote" : "blood", "uuid" : "4E3CA6F3", "_id" : { "$oid" : "5112e34b0341d60200000013" }, "permissions" : { "delete" : [ "lgordis@barnard.edu" ], "update" : [ "lgordis@barnard.edu" ], "admin" : [ "lgordis@barnard.edu" ], "read" : [ "lgordis@barnard.edu" ] }, "tags" : [ "syntax" ], "ranges" : [ { "start" : "/div[1]/p[748]", "startOffset" : 2763, "end" : "/div[1]/p[748]", "endOffset" : 2768, "_id" : { "$oid" : "5112e34b0341d60200000014" } } ], "updated" : { "$date" : 1360192331201 }, "created" : { "$date" : 1360192331201 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51133ae4b8cdc80200000002", "user" : "filip_goc@mail.harvard.edu", "username" : "Filip G.", "text" : "A note for the sake of a note.", "uri" : "http://app.annotationstudio.org/documents/applying-explanatory-style-to-academic-procrastination", "quote" : "To better understand procrastination, researchers have sought to identify cognitive", "uuid" : "EDA40A29", "_id" : { "$oid" : "51133ae4b8cdc80200000002" }, "permissions" : { "delete" : [ "filip_goc@mail.harvard.edu" ], "update" : [ "filip_goc@mail.harvard.edu" ], "admin" : [ "filip_goc@mail.harvard.edu" ], "read" : [ "filip_goc@mail.harvard.edu" ] }, "tags" : [ "note" ], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 0, "end" : "/div[1]/p[2]", "endOffset" : 84, "_id" : { "$oid" : "51133ae4b8cdc80200000003" } } ], "updated" : { "$date" : 1360214756233 }, "created" : { "$date" : 1360214756233 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5113ed0eb8cdc80200000004", "user" : "jfolsom@mit.edu", "username" : "Jamie F.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/frankenstein", "quote" : "LACKINGTON", "uuid" : "996EDA60", "_id" : { "$oid" : "5113ed0eb8cdc80200000004" }, "permissions" : { "delete" : [ "jfolsom@mit.edu" ], "update" : [ "jfolsom@mit.edu" ], "admin" : [ "jfolsom@mit.edu" ], "read" : [ "jfolsom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/center[3]/p[1]", "startOffset" : 21, "end" : "/div[1]/center[3]/p[1]", "endOffset" : 31, "_id" : { "$oid" : "5113ed0eb8cdc80200000005" } } ], "updated" : { "$date" : 1360260366156 }, "created" : { "$date" : 1360260366156 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5113edf3b8cdc80200000006" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360260595128 }, "id" : "5113edf3b8cdc80200000006", "permissions" : { "delete" : [ "jfolsom@mit.edu" ], "update" : [ "jfolsom@mit.edu" ], "admin" : [ "jfolsom@mit.edu" ], "read" : [ "jfolsom@mit.edu" ] }, "quote" : "THACKERAY", "ranges" : [ { "start" : "/div[1]/div[2]/p[7]", "startOffset" : 9, "end" : "/div[1]/div[2]/p[7]", "endOffset" : 18, "_id" : { "$oid" : "5113edf3b8cdc80200000007" } } ], "tags" : [], "text" : "comment", "updated" : { "$date" : 1360260616609 }, "uri" : "http://annotationstudio.mit.edu/documents/jane-eyre", "user" : "jfolsom@mit.edu", "username" : "Jamie F.", "uuid" : "7A061AEB" } -{ "id" : "51141436dc52860200000002", "user" : "dbeeby@columbia.edu", "username" : "Daniel B.", "text" : "asdf", "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "quote" : "`Oh! So Bill's got to come down the chimney, has he?' said Alice to herself. `Shy, they\n\t\t\tseem to put everything upon Bill! I wouldn't be in Bill's place for a good deal: this\n\t\t\tfireplace is narrow, to be sure; but I THINK I can kick a little!'", "uuid" : "069A1A8A", "_id" : { "$oid" : "51141436dc52860200000002" }, "permissions" : { "delete" : [ "dbeeby@columbia.edu" ], "update" : [ "dbeeby@columbia.edu" ], "admin" : [ "dbeeby@columbia.edu" ], "read" : [ "dbeeby@columbia.edu" ] }, "tags" : [ "asdf" ], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 8312, "end" : "/div[1]/p[15]", "endOffset" : 8559, "_id" : { "$oid" : "51141436dc52860200000003" } } ], "updated" : { "$date" : 1360270390637 }, "created" : { "$date" : 1360270390637 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511548c8ee51640200000002", "user" : "hsilver@mit.edu", "username" : "Howard S.", "text" : "Just playing in this space", "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "quote" : "the way to hear th", "uuid" : "2036EDE6", "_id" : { "$oid" : "511548c8ee51640200000002" }, "permissions" : { "delete" : [ "hsilver@mit.edu" ], "update" : [ "hsilver@mit.edu" ], "admin" : [ "hsilver@mit.edu" ], "read" : [ "hsilver@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 929, "end" : "/div[1]", "endOffset" : 948, "_id" : { "$oid" : "511548c8ee51640200000003" } } ], "updated" : { "$date" : 1360349384232 }, "created" : { "$date" : 1360349384232 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5115ca25669ab20200000002", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "sadness", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "dolefulness", "uuid" : "CD9D4CE3", "_id" : { "$oid" : "5115ca25669ab20200000002" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 969, "end" : "/div[1]/p[6]", "endOffset" : 981, "_id" : { "$oid" : "5115ca25669ab20200000003" } } ], "updated" : { "$date" : 1360382501942 }, "created" : { "$date" : 1360382501942 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5115ca47669ab20200000004", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "gloominess", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "dismalness", "uuid" : "DB49206E", "_id" : { "$oid" : "5115ca47669ab20200000004" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 1008, "end" : "/div[1]/p[6]", "endOffset" : 1019, "_id" : { "$oid" : "5115ca47669ab20200000005" } } ], "updated" : { "$date" : 1360382535991 }, "created" : { "$date" : 1360382535991 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5115ca5955d1320200000002", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "a person who has suffered", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "bereaved", "uuid" : "8150F4AC", "_id" : { "$oid" : "5115ca5955d1320200000002" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 1080, "end" : "/div[1]/p[6]", "endOffset" : 1088, "_id" : { "$oid" : "5115ca5955d1320200000003" } } ], "updated" : { "$date" : 1360382553732 }, "created" : { "$date" : 1360382553732 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5115caa655d1320200000004", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "describing how she can't explain it", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "It is not my tongue, or pen, can express the sorrows of my heart, and\nbitterness of my spirit that I had at this departure", "uuid" : "9F49BA37", "_id" : { "$oid" : "5115caa655d1320200000004" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[8]", "startOffset" : 143, "end" : "/div[1]/p[8]", "endOffset" : 265, "_id" : { "$oid" : "5115caa655d1320200000005" } } ], "updated" : { "$date" : 1360382630411 }, "created" : { "$date" : 1360382630411 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5115cab8669ab20200000006", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "shows her faith", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "God was with\nme in a wonderful manner", "uuid" : "5E303AE9", "_id" : { "$oid" : "5115cab8669ab20200000006" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "faith" ], "ranges" : [ { "start" : "/div[1]/p[8]", "startOffset" : 271, "end" : "/div[1]/p[8]", "endOffset" : 308, "_id" : { "$oid" : "5115cab8669ab20200000007" } } ], "updated" : { "$date" : 1360382648640 }, "created" : { "$date" : 1360382648640 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5115cae255d1320200000006", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "the Lord renewed my\nstrength still, and carried me along", "uuid" : "0DDF293E", "_id" : { "$oid" : "5115cae255d1320200000006" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "faith" ], "ranges" : [ { "start" : "/div[1]/p[8]", "startOffset" : 1030, "end" : "/div[1]/p[8]", "endOffset" : 1086, "_id" : { "$oid" : "5115cae255d1320200000007" } } ], "updated" : { "$date" : 1360382690044 }, "created" : { "$date" : 1360382690044 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5115cb4055d1320200000008", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "unfortunate", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "lamentable", "uuid" : "0ECC770F", "_id" : { "$oid" : "5115cb4055d1320200000008" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 283, "end" : "/div[1]/p[10]", "endOffset" : 293, "_id" : { "$oid" : "5115cb4055d1320200000009" } } ], "updated" : { "$date" : 1360382784191 }, "created" : { "$date" : 1360382784191 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5115cb6155d132020000000a", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "it was easy for me to see how\nrighteous it was with God to cut off the thread of my life and cast me\nout of His presence forever", "uuid" : "A0A5CA73", "_id" : { "$oid" : "5115cb6155d132020000000a" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "faith" ], "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 1091, "end" : "/div[1]/p[10]", "endOffset" : 1219, "_id" : { "$oid" : "5115cb6155d132020000000b" } } ], "updated" : { "$date" : 1360382817123 }, "created" : { "$date" : 1360382817123 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5115cbc755d132020000000c", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "describing the death of her child", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I must and could lie down by my dead babe, side by side all\nthe night after", "uuid" : "EFADC886", "_id" : { "$oid" : "5115cbc755d132020000000c" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 857, "end" : "/div[1]/p[11]", "endOffset" : 932, "_id" : { "$oid" : "5115cbc755d132020000000d" } } ], "updated" : { "$date" : 1360382919940 }, "created" : { "$date" : 1360382919940 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5115cc1755d132020000000e", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "her children ", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I had one child\ndead, another in the wilderness, I knew not where, the third they\nwould not let me come near to:", "uuid" : "FA56C57D", "_id" : { "$oid" : "5115cc1755d132020000000e" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 2596, "end" : "/div[1]/p[11]", "endOffset" : 2709, "_id" : { "$oid" : "5115cc1755d132020000000f" } } ], "updated" : { "$date" : 1360382999210 }, "created" : { "$date" : 1360382999210 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5115ccc7669ab20200000008", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "describes her negative feelings turning positive after reading the Bible", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "that there was no mercy for me, that the blessings\nwere gone, and the curses come in their room, and that I had lost my\nopportunity", "uuid" : "8E746664", "_id" : { "$oid" : "5115ccc7669ab20200000008" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "faith" ], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 5835, "end" : "/div[1]/p[11]", "endOffset" : 5966, "_id" : { "$oid" : "5115ccc7669ab20200000009" } } ], "updated" : { "$date" : 1360383175306 }, "created" : { "$date" : 1360383175306 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5115ce7855d1320200000010", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "no Christian soul near me,\nand yet how hath the Lord preserved me in safety?", "uuid" : "4C333502", "_id" : { "$oid" : "5115ce7855d1320200000010" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "faith" ], "ranges" : [ { "start" : "/div[1]/p[17]", "startOffset" : 1038, "end" : "/div[1]/p[17]", "endOffset" : 1114, "_id" : { "$oid" : "5115ce7855d1320200000011" } } ], "updated" : { "$date" : 1360383608901 }, "created" : { "$date" : 1360383608901 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5115cecf669ab2020000000a", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "Why was the cattle comforting?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I saw a place where\nEnglish cattle had been. That was comfort to me, such as it was", "uuid" : "55095B01", "_id" : { "$oid" : "5115cecf669ab2020000000a" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 404, "end" : "/div[1]/p[18]", "endOffset" : 487, "_id" : { "$oid" : "5115cecf669ab2020000000b" } } ], "updated" : { "$date" : 1360383695520 }, "created" : { "$date" : 1360383695520 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5115cf2c55d1320200000012", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "they were taking her food away from her", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "they got half of it\naway from me", "uuid" : "DFEDC490", "_id" : { "$oid" : "5115cf2c55d1320200000012" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 1394, "end" : "/div[1]/p[18]", "endOffset" : 1426, "_id" : { "$oid" : "5115cf2c55d1320200000013" } } ], "updated" : { "$date" : 1360383788349 }, "created" : { "$date" : 1360383788349 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5115cfc5669ab2020000000c", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "first time she cries before them", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "the first time to my remembrance, that\nI wept before them", "uuid" : "E75BDA77", "_id" : { "$oid" : "5115cfc5669ab2020000000c" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[19]", "startOffset" : 2341, "end" : "/div[1]/p[19]", "endOffset" : 2398, "_id" : { "$oid" : "5115cfc5669ab2020000000d" } } ], "updated" : { "$date" : 1360383941188 }, "created" : { "$date" : 1360383941188 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5115d03855d1320200000014", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "she begins knitting for things", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "he asked me to make a cap for his boy", "uuid" : "D9449040", "_id" : { "$oid" : "5115d03855d1320200000014" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 523, "end" : "/div[1]/p[20]", "endOffset" : 560, "_id" : { "$oid" : "5115d03855d1320200000015" } } ], "updated" : { "$date" : 1360384056456 }, "created" : { "$date" : 1360384056456 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5115d0a9669ab2020000000e", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "granted permission to go see her son", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I asked liberty to go and\nsee him; they bade me go, and away I went; but quickly lost myself,\ntraveling over hills and through swamps, and could not find the way to\nhim", "uuid" : "01D0027D", "_id" : { "$oid" : "5115d0a9669ab2020000000e" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 1032, "end" : "/div[1]/p[22]", "endOffset" : 1200, "_id" : { "$oid" : "5115d0a9669ab2020000000f" } } ], "updated" : { "$date" : 1360384169913 }, "created" : { "$date" : 1360384169913 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5115d0d4669ab20200000010", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "no Christian friend was\nnear him, to do any office of love for him, either for soul or body", "uuid" : "CE00B678", "_id" : { "$oid" : "5115d0d4669ab20200000010" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "faith" ], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 2013, "end" : "/div[1]/p[22]", "endOffset" : 2104, "_id" : { "$oid" : "5115d0d4669ab20200000011" } } ], "updated" : { "$date" : 1360384212289 }, "created" : { "$date" : 1360384212289 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5115d173669ab20200000012", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "does this mean she is waiting to die? \"heavenly rest\"", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I hope all these\nwearisome steps that I have taken, are but a forewarning to me of the\nheavenly rest", "uuid" : "3FE3700C", "_id" : { "$oid" : "5115d173669ab20200000012" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[26]", "startOffset" : 412, "end" : "/div[1]/p[26]", "endOffset" : 512, "_id" : { "$oid" : "5115d173669ab20200000013" } } ], "updated" : { "$date" : 1360384371482 }, "created" : { "$date" : 1360384371482 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5115d1c255d1320200000016", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Which stilled my spirit for the\npresent", "uuid" : "EE85BB2A", "_id" : { "$oid" : "5115d1c255d1320200000016" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "faith" ], "ranges" : [ { "start" : "/div[1]/p[28]", "startOffset" : 883, "end" : "/div[1]/p[28]", "endOffset" : 922, "_id" : { "$oid" : "5115d1c255d1320200000017" } } ], "updated" : { "$date" : 1360384450450 }, "created" : { "$date" : 1360384450450 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "511637e2669ab20200000014" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360410594536 }, "groups" : [], "id" : "511637e2669ab20200000014", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "On the tenth of February 1675, came the Indians with great numbers upon\nLancaster", "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 1, "end" : "/div[1]/p[2]", "endOffset" : 82, "_id" : { "$oid" : "511642cf669ab20200000050" } } ], "tags" : [], "text" : "February 1675, Lancaster. King Philip's war is from June 1675-April 1678.", "updated" : { "$date" : 1360413391526 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "5C166A6B" } -{ "id" : "51163842669ab20200000016", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "House on fire.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "About two hours (according to my observation, in that\namazing time) they had been about the house before they prevailed to\nfire it (which they did with flax and hemp, which they brought out of\nthe barn, and there being no defense about the house, only two flankers\nat two opposite corners and one of them not finished); they fired it\nonce and one ventured out and quenched it, but they quickly fired it\nagain, and that took.", "uuid" : "67090CB3", "_id" : { "$oid" : "51163842669ab20200000016" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 436, "end" : "/div[1]/p[3]", "endOffset" : 860, "_id" : { "$oid" : "51163842669ab20200000017" } } ], "updated" : { "$date" : 1360410690343 }, "created" : { "$date" : 1360410690343 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51163868669ab20200000018", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Indians shoot at her and her kids as they try to leave.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Then I took my children (and one of\nmy sisters', hers) to go forth and leave the house: but as soon as\nwe came to the door and appeared, the Indians shot so thick that the\nbullets rattled against the house, as if one had taken an handful of\nstones and threw them, so that we were fain to give back.", "uuid" : "97D2BACE", "_id" : { "$oid" : "51163868669ab20200000018" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1291, "end" : "/div[1]/p[3]", "endOffset" : 1589, "_id" : { "$oid" : "51163868669ab20200000019" } } ], "updated" : { "$date" : 1360410728289 }, "created" : { "$date" : 1360410728289 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116389655d1320200000018", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Brother-in-law dead.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "No sooner were we out of the house, but my\nbrother-in-law (being before wounded, in defending the house, in or near\nthe throat) fell down dead", "uuid" : "6CD38553", "_id" : { "$oid" : "5116389655d1320200000018" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 2043, "end" : "/div[1]/p[3]", "endOffset" : 2185, "_id" : { "$oid" : "5116389655d1320200000019" } } ], "updated" : { "$date" : 1360410774130 }, "created" : { "$date" : 1360410774130 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511638a955d132020000001a", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "She and her kid in arm are shot.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "ne went through my side, and the same (as would\nseem) through the bowels and hand of my dear child in my arms", "uuid" : "3CC5BBC9", "_id" : { "$oid" : "511638a955d132020000001a" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 2324, "end" : "/div[1]/p[3]", "endOffset" : 2433, "_id" : { "$oid" : "511638a955d132020000001b" } } ], "updated" : { "$date" : 1360410793556 }, "created" : { "$date" : 1360410793556 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511638c755d132020000001c", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Nephew beaten. (dead or unconscious? unclear)", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "One of my\nelder sisters' children, named William, had then his leg broken, which\nthe Indians perceiving, they knocked him on [his] head.", "uuid" : "F77C30E4", "_id" : { "$oid" : "511638c755d132020000001c" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 2435, "end" : "/div[1]/p[3]", "endOffset" : 2571, "_id" : { "$oid" : "511638c755d132020000001d" } } ], "updated" : { "$date" : 1360410823032 }, "created" : { "$date" : 1360410823032 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511638e4669ab2020000001a", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Sister shot and died.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "she\nsaid, \"And Lord, let me die with them,\" which was no sooner said, but\nshe was struck with a bullet, and fell down dead over the threshold.", "uuid" : "B8FE698B", "_id" : { "$oid" : "511638e4669ab2020000001a" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 2935, "end" : "/div[1]/p[3]", "endOffset" : 3077, "_id" : { "$oid" : "511638e4669ab2020000001b" } } ], "updated" : { "$date" : 1360410852328 }, "created" : { "$date" : 1360410852328 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51163908669ab2020000001c", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Indians separate her from her children.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "the Indians laid hold of us, pulling me one\nway, and the children another, and said, \"Come go along with us\"; I told\nthem they would kill me: they answered, if I were willing to go along\nwith them, they would not hurt me.", "uuid" : "1DE57F0A", "_id" : { "$oid" : "51163908669ab2020000001c" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 3523, "end" : "/div[1]/p[3]", "endOffset" : 3744, "_id" : { "$oid" : "51163908669ab2020000001d" } } ], "updated" : { "$date" : 1360410888729 }, "created" : { "$date" : 1360410888729 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5116392e55d132020000001e" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360410926058 }, "id" : "5116392e55d132020000001e", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Of\nthirty-seven persons who were in this one house, none escaped either\npresent death, or a bitter captivity, save only one, who might say as\nhe, \"And I only am escaped alone to tell the News\" (Job 1.15). There\nwere twelve killed, some shot, some stabbed with their spears, some\nknocked down with their hatchets.", "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 141, "end" : "/div[1]/p[4]", "endOffset" : 453, "_id" : { "$oid" : "5116392e55d132020000001f" } } ], "tags" : [], "text" : "12 out of 37 people killed. 1 escapes to tell the news. (Big house!)", "updated" : { "$date" : 1360410955208 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "2A2C1F0C" } -{ "id" : "51163971669ab2020000001e", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "24 captives", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "for there\nwere twenty-four of us taken alive and carried captive.", "uuid" : "FF4846C4", "_id" : { "$oid" : "51163971669ab2020000001e" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 1097, "end" : "/div[1]/p[4]", "endOffset" : 1162, "_id" : { "$oid" : "51163971669ab2020000001f" } } ], "updated" : { "$date" : 1360410993546 }, "created" : { "$date" : 1360410993546 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511639b4669ab20200000020", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "They also took livestock from the town?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "And as miserable was the waste that was there made\nof horses, cattle, sheep, swine, calves, lambs, roasting pigs, and fowl\n(which they had plundered in the town), some roasting, some lying and\nburning, and some boiling to feed our merciless enemies; who were joyful\nenough, though we were disconsolate.", "uuid" : "683F5AC4", "_id" : { "$oid" : "511639b4669ab20200000020" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 651, "end" : "/div[1]/p[6]", "endOffset" : 954, "_id" : { "$oid" : "511639b4669ab20200000021" } } ], "updated" : { "$date" : 1360411060045 }, "created" : { "$date" : 1360411060045 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511639dd55d1320200000020", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "What happened to her kids? Confused. And her husband's away at sea.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "All was gone, my husband\ngone (at least separated from me, he being in the Bay; and to add to my\ngrief, the Indians told me they would kill him as he came homeward), my\nchildren gone, my relations and friends gone, our house and home and all\nour comforts—within door and without—all was gone (except my life),\nand I knew not but the next moment that might go too.", "uuid" : "77C14705", "_id" : { "$oid" : "511639dd55d1320200000020" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 1100, "end" : "/div[1]/p[6]", "endOffset" : 1463, "_id" : { "$oid" : "511639dd55d1320200000021" } } ], "updated" : { "$date" : 1360411101819 }, "created" : { "$date" : 1360411101819 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51163a0a55d1320200000022", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "But she has a dying baby.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "There remained\nnothing to me but one poor wounded babe, and it seemed at present\nworse than death that it was in such a pitiful condition, bespeaking\ncompassion, and I had no refreshing for it, nor suitable things to\nrevive it.", "uuid" : "33AEE1F7", "_id" : { "$oid" : "51163a0a55d1320200000022" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 1464, "end" : "/div[1]/p[6]", "endOffset" : 1691, "_id" : { "$oid" : "51163a0a55d1320200000023" } } ], "updated" : { "$date" : 1360411146108 }, "created" : { "$date" : 1360411146108 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "51163a4655d1320200000024" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360411206058 }, "id" : "51163a4655d1320200000024", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "THE FIRST REMOVE", "ranges" : [ { "start" : "/div[1]/h2[1]", "startOffset" : 5, "end" : "/div[1]/h2[1]", "endOffset" : 21, "_id" : { "$oid" : "51163a4655d1320200000025" } } ], "tags" : [ "remove", "location" ], "text" : "An abandoned house on a hill still in sight of Lancaster.", "updated" : { "$date" : 1360411221750 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "C689CDD8" } -{ "id" : "51163a6355d1320200000026", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "About a\nmile we went that night, up upon a hill within sight of the town", "uuid" : "38D409C0", "_id" : { "$oid" : "51163a6355d1320200000026" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "remove", "location" ], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 131, "end" : "/div[1]/p[6]", "endOffset" : 203, "_id" : { "$oid" : "51163a6355d1320200000027" } } ], "updated" : { "$date" : 1360411235025 }, "created" : { "$date" : 1360411235025 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51163a8655d1320200000028", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Her kid is an \"it?\" And old enough to talk.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "One of the Indians carried my poor wounded\nbabe upon a horse; it went moaning all along, \"I shall die, I shall\ndie.\" I went on foot after it, with sorrow that cannot be expressed.", "uuid" : "5CB4C788", "_id" : { "$oid" : "51163a8655d1320200000028" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[8]", "startOffset" : 383, "end" : "/div[1]/p[8]", "endOffset" : 563, "_id" : { "$oid" : "51163a8655d1320200000029" } } ], "updated" : { "$date" : 1360411270837 }, "created" : { "$date" : 1360411270837 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "51163aa9669ab20200000022" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360411305781 }, "id" : "51163aa9669ab20200000022", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "At length I took it off the horse, and carried it in my arms till my\nstrength failed, and I fell down with it.", "ranges" : [ { "start" : "/div[1]/p[8]", "startOffset" : 563, "end" : "/div[1]/p[8]", "endOffset" : 673, "_id" : { "$oid" : "51163aa9669ab20200000023" } } ], "tags" : [], "text" : "Was she or wasn't she shot? ", "updated" : { "$date" : 1360411352420 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "31DB1DC9" } -{ "__v" : 1, "_id" : { "$oid" : "51163aff55d132020000002a" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360411391371 }, "id" : "51163aff55d132020000002a", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "After this it quickly began to snow, and when night came on, they\nstopped, and now down I must sit in the snow, by a little fire, and a\nfew boughs behind me, with my sick child in my lap; and calling much for\nwater, being now (through the wound) fallen into a violent fever.", "ranges" : [ { "start" : "/div[1]/p[9]", "startOffset" : 1, "end" : "/div[1]/p[9]", "endOffset" : 275, "_id" : { "$oid" : "51163aff55d132020000002b" } } ], "tags" : [ "remove", "location" ], "text" : "Stopped at a campfire in the snow.", "updated" : { "$date" : 1360411426193 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "22A76388" } -{ "id" : "51163b1655d132020000002c", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Snowy campfire.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "THE SECOND REMOVE", "uuid" : "E19A46E4", "_id" : { "$oid" : "51163b1655d132020000002c" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "remove", "location" ], "ranges" : [ { "start" : "/div[1]/h2[2]", "startOffset" : 5, "end" : "/div[1]/h2[2]", "endOffset" : 22, "_id" : { "$oid" : "51163b1655d132020000002d" } } ], "updated" : { "$date" : 1360411414865 }, "created" : { "$date" : 1360411414865 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51163b2a55d132020000002e", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "She was shot.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "My own\nwound also growing so stiff that I could scarce sit down or rise up;", "uuid" : "ECAE106F", "_id" : { "$oid" : "51163b2a55d132020000002e" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[9]", "startOffset" : 276, "end" : "/div[1]/p[9]", "endOffset" : 351, "_id" : { "$oid" : "51163b2a55d132020000002f" } } ], "updated" : { "$date" : 1360411434817 }, "created" : { "$date" : 1360411434817 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51163b65669ab20200000024", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "It's her daughter.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "A very wearisome and tedious day I had of it; what\nwith my own wound, and my child's being so exceeding sick, and in a\nlamentable condition with her wound.", "uuid" : "FE0D9408", "_id" : { "$oid" : "51163b65669ab20200000024" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 164, "end" : "/div[1]/p[10]", "endOffset" : 319, "_id" : { "$oid" : "51163b65669ab20200000025" } } ], "updated" : { "$date" : 1360411493675 }, "created" : { "$date" : 1360411493675 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51163b7a55d1320200000030", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "3 days w/o food.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Wednesday night\nto Saturday night", "uuid" : "7D4C94A5", "_id" : { "$oid" : "51163b7a55d1320200000030" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 474, "end" : "/div[1]/p[10]", "endOffset" : 507, "_id" : { "$oid" : "51163b7a55d1320200000031" } } ], "updated" : { "$date" : 1360411514525 }, "created" : { "$date" : 1360411514525 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51163bb1669ab20200000026", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Wenimesset", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Wenimesset, northward of Quabaug", "uuid" : "E620D875", "_id" : { "$oid" : "51163bb1669ab20200000026" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "remove", "location" ], "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 661, "end" : "/div[1]/p[10]", "endOffset" : 693, "_id" : { "$oid" : "51163bb1669ab20200000027" } } ], "updated" : { "$date" : 1360411569066 }, "created" : { "$date" : 1360411569066 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "51163bb7669ab20200000028" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360411575260 }, "id" : "51163bb7669ab20200000028", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "THE THIRD REMOVE", "ranges" : [ { "start" : "/div[1]/h2[3]", "startOffset" : 5, "end" : "/div[1]/h2[3]", "endOffset" : 21, "_id" : { "$oid" : "51163bb7669ab20200000029" } } ], "tags" : [ "remove", "location" ], "text" : "Wenimesset", "updated" : { "$date" : 1360411581875 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "01952A2C" } -{ "id" : "51163c72669ab2020000002a", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "What do the Indians want with English captives for so long?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "This day there came to me one Robert Pepper (a man belonging\nto Roxbury) who was taken in Captain Beers's fight, and had been now a\nconsiderable time with the Indians", "uuid" : "1B9407AD", "_id" : { "$oid" : "51163c72669ab2020000002a" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 1343, "end" : "/div[1]/p[10]", "endOffset" : 1509, "_id" : { "$oid" : "51163c72669ab2020000002b" } } ], "updated" : { "$date" : 1360411762494 }, "created" : { "$date" : 1360411762494 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51163c8a669ab2020000002c", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "And they let their captives travel?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Hearing, I say, that I was in this Indian town, he\nobtained leave to come and see me.", "uuid" : "E8FE488E", "_id" : { "$oid" : "51163c8a669ab2020000002c" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 1635, "end" : "/div[1]/p[10]", "endOffset" : 1721, "_id" : { "$oid" : "51163c8a669ab2020000002d" } } ], "updated" : { "$date" : 1360411786211 }, "created" : { "$date" : 1360411786211 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51163ca7669ab2020000002e", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Threats to kill her wounded daughter. ", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "one Indian would come and tell me one hour that \"your master\nwill knock your child in the head,\" and then a second, and then a third,\n\"your master will quickly knock your child in the head.\"", "uuid" : "3B2C195E", "_id" : { "$oid" : "51163ca7669ab2020000002e" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 2408, "end" : "/div[1]/p[10]", "endOffset" : 2598, "_id" : { "$oid" : "51163ca7669ab2020000002f" } } ], "updated" : { "$date" : 1360411815329 }, "created" : { "$date" : 1360411815329 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51163cd4669ab20200000030", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Her daughter dies.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "About two hours in the night, my sweet babe like a lamb departed\nthis life on Feb. 18, 1675.", "uuid" : "8A9C8C94", "_id" : { "$oid" : "51163cd4669ab20200000030" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 435, "end" : "/div[1]/p[11]", "endOffset" : 527, "_id" : { "$oid" : "51163cd4669ab20200000031" } } ], "updated" : { "$date" : 1360411860769 }, "created" : { "$date" : 1360411860769 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "51163d06669ab20200000032" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360411910818 }, "id" : "51163d06669ab20200000032", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Quinnapin, who was a Sagamore, and\nmarried King Philip's wife's sister", "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 1299, "end" : "/div[1]/p[11]", "endOffset" : 1369, "_id" : { "$oid" : "51163d06669ab20200000033" } } ], "tags" : [ "Metacomet" ], "text" : "Quinnapin, married King Philip's wife's sister?", "updated" : { "$date" : 1360413604964 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "05A017B6" } -{ "id" : "51163d30669ab20200000034", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "But she has another living daughter, Mary (10).", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I went to see my daughter Mary, who\nwas at this same Indian town, at a wigwam not very far off", "uuid" : "7720FCDC", "_id" : { "$oid" : "51163d30669ab20200000034" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 2155, "end" : "/div[1]/p[11]", "endOffset" : 2249, "_id" : { "$oid" : "51163d30669ab20200000035" } } ], "updated" : { "$date" : 1360411952746 }, "created" : { "$date" : 1360411952746 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51163d6955d1320200000032", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Her son was also captured, but alive.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I knew not where he was, till I was\ninformed by himself, that he was amongst a smaller parcel of Indians,\nwhose place was about six miles off", "uuid" : "AB114F27", "_id" : { "$oid" : "51163d6955d1320200000032" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 3543, "end" : "/div[1]/p[11]", "endOffset" : 3684, "_id" : { "$oid" : "51163d6955d1320200000033" } } ], "updated" : { "$date" : 1360412009942 }, "created" : { "$date" : 1360412009942 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51163dc7669ab20200000036", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "An Indian brings her a Bible from Medfield.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "One of the Indians that\ncame from Medfield fight, had brought some plunder, came to me, and\nasked me, if I would have a Bible, he had got one in his basket.", "uuid" : "28F2CE9E", "_id" : { "$oid" : "51163dc7669ab20200000036" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 5384, "end" : "/div[1]/p[11]", "endOffset" : 5540, "_id" : { "$oid" : "51163dc7669ab20200000037" } } ], "updated" : { "$date" : 1360412103334 }, "created" : { "$date" : 1360412103334 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51163de855d1320200000034", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Indians have 8 children, 2 women captives.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "There were now besides myself nine English captives\nin this place (all of them children, except one woman).", "uuid" : "28B3207A", "_id" : { "$oid" : "51163de855d1320200000034" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[12]", "startOffset" : 89, "end" : "/div[1]/p[12]", "endOffset" : 196, "_id" : { "$oid" : "51163de855d1320200000035" } } ], "updated" : { "$date" : 1360412136369 }, "created" : { "$date" : 1360412136369 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "51163e0c669ab20200000038" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360412172184 }, "id" : "51163e0c669ab20200000038", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "thirty miles from any English town", "ranges" : [ { "start" : "/div[1]/p[12]", "startOffset" : 661, "end" : "/div[1]/p[12]", "endOffset" : 695, "_id" : { "$oid" : "51163e0c669ab20200000039" } } ], "tags" : [ "location" ], "text" : "30 miles away from English towns", "updated" : { "$date" : 1360412452538 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "FBE4E937" } -{ "id" : "51163e4855d1320200000036", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "last time she sees Mary", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Here I parted from\nmy daughter Mary", "uuid" : "81601C36", "_id" : { "$oid" : "51163e4855d1320200000036" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 53, "end" : "/div[1]/p[13]", "endOffset" : 88, "_id" : { "$oid" : "51163e4855d1320200000037" } } ], "updated" : { "$date" : 1360412232171 }, "created" : { "$date" : 1360412232171 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51163e8455d1320200000038", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Pregnant woman wants to go home; Indians strip her, beat her and her child, and dance around her.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "gathered\na great company together about her and stripped her naked, and set her\nin the midst of them, and when they had sung and danced about her (in\ntheir hellish manner) as long as they pleased they knocked her on head,\nand the child in her arms with her", "uuid" : "61267D50", "_id" : { "$oid" : "51163e8455d1320200000038" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 630, "end" : "/div[1]/p[13]", "endOffset" : 886, "_id" : { "$oid" : "51163e8455d1320200000039" } } ], "updated" : { "$date" : 1360412292463 }, "created" : { "$date" : 1360412292463 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "51163eb355d132020000003a" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360412339379 }, "id" : "51163eb355d132020000003a", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "we traveled about half a day\nor little more, and came to a desolate place in the wilderness, where\nthere were no wigwams or inhabitants before; we came about the middle\nof the afternoon to this place", "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 1181, "end" : "/div[1]/p[13]", "endOffset" : 1380, "_id" : { "$oid" : "51163eb355d132020000003b" } } ], "tags" : [ "remove", "location" ], "text" : "half day's travel. stop in the middle of nowhere", "updated" : { "$date" : 1360412477176 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "DAA61EFB" } -{ "id" : "51163ee1669ab2020000003a", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "stayed for 4 days", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "At this place we continued about\nfour days.", "uuid" : "DFB3023D", "_id" : { "$oid" : "51163ee1669ab2020000003a" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 813, "end" : "/div[1]/p[14]", "endOffset" : 856, "_id" : { "$oid" : "51163ee1669ab2020000003b" } } ], "updated" : { "$date" : 1360412385806 }, "created" : { "$date" : 1360412385806 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "51163ef6669ab2020000003c" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360412406924 }, "id" : "51163ef6669ab2020000003c", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "THE FOURTH REMOVE", "ranges" : [ { "start" : "/div[1]/h2[4]", "startOffset" : 5, "end" : "/div[1]/h2[4]", "endOffset" : 22, "_id" : { "$oid" : "51163ef6669ab2020000003d" } } ], "tags" : [ "remove", "location" ], "text" : "middle of nowhere", "updated" : { "$date" : 1360412468633 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "2C986163" } -{ "id" : "51163f2d669ab2020000003e", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Medfield", "uuid" : "EAEB2E62", "_id" : { "$oid" : "51163f2d669ab2020000003e" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 4434, "end" : "/div[1]/p[11]", "endOffset" : 4442, "_id" : { "$oid" : "51163f2d669ab2020000003f" } } ], "updated" : { "$date" : 1360412461299 }, "created" : { "$date" : 1360412461299 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51163f71669ab20200000040", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Indians are running from the English.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "For they went as if they had\ngone for their lives, for some considerable way, and then they made a\nstop, and chose some of their stoutest men, and sent them back to hold\nthe English army in play whilst the rest escaped.", "uuid" : "6B7E89B4", "_id" : { "$oid" : "51163f71669ab20200000040" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 114, "end" : "/div[1]/p[15]", "endOffset" : 333, "_id" : { "$oid" : "51163f71669ab20200000041" } } ], "updated" : { "$date" : 1360412529507 }, "created" : { "$date" : 1360412529507 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51163f84669ab20200000042", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Banquaug river", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Banquaug river", "uuid" : "B14BBAAE", "_id" : { "$oid" : "51163f84669ab20200000042" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 723, "end" : "/div[1]/p[15]", "endOffset" : 737, "_id" : { "$oid" : "51163f84669ab20200000043" } } ], "updated" : { "$date" : 1360412548960 }, "created" : { "$date" : 1360412548960 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51163fb0669ab20200000044", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Took 2 days to cross the river.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "A certain number of us got over\nthe river that night, but it was the night after the Sabbath before all\nthe company was got over.", "uuid" : "6C0308AF", "_id" : { "$oid" : "51163fb0669ab20200000044" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 1792, "end" : "/div[1]/p[15]", "endOffset" : 1921, "_id" : { "$oid" : "51163fb0669ab20200000045" } } ], "updated" : { "$date" : 1360412592857 }, "created" : { "$date" : 1360412592857 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51163fe8669ab20200000046", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Banquaug river", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "THE FIFTH REMOVE", "uuid" : "EE58235A", "_id" : { "$oid" : "51163fe8669ab20200000046" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "remove", "location" ], "ranges" : [ { "start" : "/div[1]/h2[5]", "startOffset" : 5, "end" : "/div[1]/h2[5]", "endOffset" : 21, "_id" : { "$oid" : "51163fe8669ab20200000047" } } ], "updated" : { "$date" : 1360412648060 }, "created" : { "$date" : 1360412648060 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51164012669ab20200000048", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "English army gives up the chase at the river.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "On that very day came the English army after them to\nthis river, and saw the smoke of their wigwams, and yet this river put a\nstop to them. God did not give them courage or activity to go over after\nus.", "uuid" : "2383B1AC", "_id" : { "$oid" : "51164012669ab20200000048" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[16]", "startOffset" : 1145, "end" : "/div[1]/p[16]", "endOffset" : 1347, "_id" : { "$oid" : "51164012669ab20200000049" } } ], "updated" : { "$date" : 1360412690620 }, "created" : { "$date" : 1360412690620 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116405b669ab2020000004a", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Stopped near a swamp", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "We came that day to a great\nswamp, by the side of which we took up our lodging that night.", "uuid" : "E38F7143", "_id" : { "$oid" : "5116405b669ab2020000004a" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "remove", "location" ], "ranges" : [ { "start" : "/div[1]/p[17]", "startOffset" : 535, "end" : "/div[1]/p[17]", "endOffset" : 626, "_id" : { "$oid" : "5116405b669ab2020000004b" } } ], "updated" : { "$date" : 1360412763637 }, "created" : { "$date" : 1360412763637 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116406555d132020000003c", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "swamp", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "THE SIXTH REMOVE", "uuid" : "4612D232", "_id" : { "$oid" : "5116406555d132020000003c" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "remove", "location" ], "ranges" : [ { "start" : "/div[1]/h2[6]", "startOffset" : 5, "end" : "/div[1]/h2[6]", "endOffset" : 21, "_id" : { "$oid" : "5116406555d132020000003d" } } ], "updated" : { "$date" : 1360412773983 }, "created" : { "$date" : 1360412773983 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116408455d132020000003e", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Squakeag", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Squakeag", "uuid" : "45149B8F", "_id" : { "$oid" : "5116408455d132020000003e" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 656, "end" : "/div[1]/p[18]", "endOffset" : 664, "_id" : { "$oid" : "5116408455d132020000003f" } } ], "updated" : { "$date" : 1360412804234 }, "created" : { "$date" : 1360412804234 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511640a555d1320200000040", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Come across an abandoned English place.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "As we went along, I saw a place where\nEnglish cattle had been. That was comfort to me, such as it was.", "uuid" : "B0309B53", "_id" : { "$oid" : "511640a555d1320200000040" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 386, "end" : "/div[1]/p[18]", "endOffset" : 488, "_id" : { "$oid" : "511640a555d1320200000041" } } ], "updated" : { "$date" : 1360412837187 }, "created" : { "$date" : 1360412837187 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511640bc55d1320200000042", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Did the Indians drive out the English?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "deserted English fields,", "uuid" : "E9B0FBD6", "_id" : { "$oid" : "511640bc55d1320200000042" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 719, "end" : "/div[1]/p[18]", "endOffset" : 743, "_id" : { "$oid" : "511640bc55d1320200000043" } } ], "updated" : { "$date" : 1360412860129 }, "created" : { "$date" : 1360412860129 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511640c955d1320200000044", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Squakeag", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "THE SEVENTH REMOVE", "uuid" : "8F2525BD", "_id" : { "$oid" : "511640c955d1320200000044" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "remove", "location" ], "ranges" : [ { "start" : "/div[1]/h2[7]", "startOffset" : 5, "end" : "/div[1]/h2[7]", "endOffset" : 23, "_id" : { "$oid" : "511640c955d1320200000045" } } ], "updated" : { "$date" : 1360412873770 }, "created" : { "$date" : 1360412873770 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5116412255d1320200000046" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360412962560 }, "id" : "5116412255d1320200000046", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "On the morrow morning we must go over the river, i.e. Connecticut, to\nmeet with King Philip.", "ranges" : [ { "start" : "/div[1]/p[19]", "startOffset" : 1, "end" : "/div[1]/p[19]", "endOffset" : 93, "_id" : { "$oid" : "5116412255d1320200000047" } } ], "tags" : [ "location", "metacomet" ], "text" : "Connecticut river?", "updated" : { "$date" : 1360413674510 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "23C278CB" } -{ "id" : "5116413555d1320200000048", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "English scouts are spotted.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "The cause of this rout was, as I thought, their espying some English\nscouts, who were thereabout.", "uuid" : "B4E2B90A", "_id" : { "$oid" : "5116413555d1320200000048" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[19]", "startOffset" : 421, "end" : "/div[1]/p[19]", "endOffset" : 518, "_id" : { "$oid" : "5116413555d1320200000049" } } ], "updated" : { "$date" : 1360412981448 }, "created" : { "$date" : 1360412981448 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116414755d132020000004a", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "She meets her son again.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "As I sat amongst them, musing of things past, my son Joseph unexpectedly\ncame to me.", "uuid" : "CC78704E", "_id" : { "$oid" : "5116414755d132020000004a" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[19]", "startOffset" : 635, "end" : "/div[1]/p[19]", "endOffset" : 719, "_id" : { "$oid" : "5116414755d132020000004b" } } ], "updated" : { "$date" : 1360412999941 }, "created" : { "$date" : 1360412999941 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "511641cc669ab2020000004c" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360413132050 }, "id" : "511641cc669ab2020000004c", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "But to\nreturn, we traveled on till night; and in the morning, we must go over\nthe river to Philip's crew.", "ranges" : [ { "start" : "/div[1]/p[19]", "startOffset" : 1872, "end" : "/div[1]/p[19]", "endOffset" : 1977, "_id" : { "$oid" : "511641cc669ab2020000004d" } } ], "tags" : [ "location", "metacomet" ], "text" : "Traveled through the night and crossed the river.", "updated" : { "$date" : 1360413691426 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "42729B96" } -{ "id" : "51164218669ab2020000004e", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Babylon and Zion", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "But now I may say as Psalm 137.1, \"By the Rivers of Babylon,\nthere we sate down: yea, we wept when we remembered Zion.\"", "uuid" : "74DAA1E5", "_id" : { "$oid" : "51164218669ab2020000004e" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location", "bible" ], "ranges" : [ { "start" : "/div[1]/p[19]", "startOffset" : 2605, "end" : "/div[1]/p[19]", "endOffset" : 2724, "_id" : { "$oid" : "51164218669ab2020000004f" } } ], "updated" : { "$date" : 1360413208467 }, "created" : { "$date" : 1360413208467 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5116429655d132020000004c" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360413334913 }, "id" : "5116429655d132020000004c", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Then I went to see King Philip.", "ranges" : [ { "start" : "/div[1]/p[19]", "startOffset" : 3038, "end" : "/div[1]/p[19]", "endOffset" : 3069, "_id" : { "$oid" : "5116429655d132020000004d" } } ], "tags" : [ "time,", "Metacomet" ], "text" : "Ah, King Philip is an Indian. Aka Metacomet (http://en.wikipedia.org/wiki/Metacomet). This is taking place shortly before King Philip's war.", "updated" : { "$date" : 1360413409469 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "0B93A690" } -{ "id" : "5116437055d132020000004e", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Marlborough. Confused by rest of this passage. I assume \"Praying\" means Christian.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Marlborough's Praying Indians, which Capt. Mosely brought to Boston", "uuid" : "C14FA4A2", "_id" : { "$oid" : "5116437055d132020000004e" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[7]", "startOffset" : 203, "end" : "/div[1]/p[7]", "endOffset" : 270, "_id" : { "$oid" : "5116437055d132020000004f" } } ], "updated" : { "$date" : 1360413552027 }, "created" : { "$date" : 1360413552027 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116438b669ab20200000051", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "King Philip", "uuid" : "012D45CE", "_id" : { "$oid" : "5116438b669ab20200000051" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "Metacomet" ], "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 1560, "end" : "/div[1]/p[10]", "endOffset" : 1571, "_id" : { "$oid" : "5116438b669ab20200000052" } } ], "updated" : { "$date" : 1360413579237 }, "created" : { "$date" : 1360413579237 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116442155d1320200000050", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Northampton", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Northampton", "uuid" : "39EFAC30", "_id" : { "$oid" : "5116442155d1320200000050" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 51, "end" : "/div[1]/p[20]", "endOffset" : 62, "_id" : { "$oid" : "5116442155d1320200000051" } } ], "updated" : { "$date" : 1360413729675 }, "created" : { "$date" : 1360413729675 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116444055d1320200000052", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "King Philip gives her English money for a knitted shirt.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Philip spake to me to make a shirt for\nhis boy, which I did, for which he gave me a shilling.", "uuid" : "2E4C21C5", "_id" : { "$oid" : "5116444055d1320200000052" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "metacomet" ], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 315, "end" : "/div[1]/p[20]", "endOffset" : 408, "_id" : { "$oid" : "5116444055d1320200000053" } } ], "updated" : { "$date" : 1360413760204 }, "created" : { "$date" : 1360413760204 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116445c669ab20200000053", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Indian master lets her keep the English money?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I offered the\nmoney to my master, but he bade me keep it", "uuid" : "C91FCEE3", "_id" : { "$oid" : "5116445c669ab20200000053" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 409, "end" : "/div[1]/p[20]", "endOffset" : 465, "_id" : { "$oid" : "5116445c669ab20200000054" } } ], "updated" : { "$date" : 1360413788452 }, "created" : { "$date" : 1360413788452 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51164471669ab20200000055", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "She visits her son.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Hearing\nthat my son was come to this place, I went to see him, and found him\nlying flat upon the ground.", "uuid" : "5C15B0B4", "_id" : { "$oid" : "51164471669ab20200000055" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 1197, "end" : "/div[1]/p[20]", "endOffset" : 1301, "_id" : { "$oid" : "51164471669ab20200000056" } } ], "updated" : { "$date" : 1360413809364 }, "created" : { "$date" : 1360413809364 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511644a355d1320200000054", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "King Philip's camp. In Connecticut?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "THE EIGHTH REMOVE", "uuid" : "43E8D23A", "_id" : { "$oid" : "511644a355d1320200000054" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "remove", "location" ], "ranges" : [ { "start" : "/div[1]/h2[8]", "startOffset" : 5, "end" : "/div[1]/h2[8]", "endOffset" : 22, "_id" : { "$oid" : "511644a355d1320200000055" } } ], "updated" : { "$date" : 1360413859768 }, "created" : { "$date" : 1360413859768 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511644b7669ab20200000057", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "She wants to be taken to Albany", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I desired them that\nthey would carry me to Albany upon one of those horses, and sell me for\npowder", "uuid" : "4E129CC1", "_id" : { "$oid" : "511644b7669ab20200000057" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 122, "end" : "/div[1]/p[21]", "endOffset" : 220, "_id" : { "$oid" : "511644b7669ab20200000058" } } ], "updated" : { "$date" : 1360413879871 }, "created" : { "$date" : 1360413879871 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511644ed55d1320200000056", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "almost as far as\nAlbany,", "uuid" : "4EAF06F4", "_id" : { "$oid" : "511644ed55d1320200000056" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 1528, "end" : "/div[1]/p[10]", "endOffset" : 1552, "_id" : { "$oid" : "511644ed55d1320200000057" } } ], "updated" : { "$date" : 1360413933651 }, "created" : { "$date" : 1360413933651 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116450255d1320200000058", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Recrossing the river?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "we must go five miles\nup the river, and then go over it.", "uuid" : "AF337B69", "_id" : { "$oid" : "5116450255d1320200000058" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 52, "end" : "/div[1]/p[22]", "endOffset" : 108, "_id" : { "$oid" : "5116450255d1320200000059" } } ], "updated" : { "$date" : 1360413954529 }, "created" : { "$date" : 1360413954529 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116453155d132020000005a", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Stopped at place of an Indian (many indians?)", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Here lived a\nsorry Indian,", "uuid" : "7752E3AF", "_id" : { "$oid" : "5116453155d132020000005a" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 132, "end" : "/div[1]/p[22]", "endOffset" : 158, "_id" : { "$oid" : "5116453155d132020000005b" } } ], "updated" : { "$date" : 1360414001346 }, "created" : { "$date" : 1360414001346 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51164544669ab20200000059", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "5 miles up river from Philip's camp", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "THE NINTH REMOVE", "uuid" : "71247EC4", "_id" : { "$oid" : "51164544669ab20200000059" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "remove", "location" ], "ranges" : [ { "start" : "/div[1]/h2[9]", "startOffset" : 5, "end" : "/div[1]/h2[9]", "endOffset" : 21, "_id" : { "$oid" : "51164544669ab2020000005a" } } ], "updated" : { "$date" : 1360414020841 }, "created" : { "$date" : 1360414020841 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116456b55d132020000005c", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "She gives her master a knife and is glad that she's made him happy.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I carried the knife in, and my master asked me to give\nit him, and I was not a little glad that I had anything that they would\naccept of, and be pleased with.", "uuid" : "59600746", "_id" : { "$oid" : "5116456b55d132020000005c" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 510, "end" : "/div[1]/p[22]", "endOffset" : 668, "_id" : { "$oid" : "5116456b55d132020000005d" } } ], "updated" : { "$date" : 1360414059544 }, "created" : { "$date" : 1360414059544 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116458955d132020000005e", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "They have corn stores in Narragansett country.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "she had been gone three weeks into the Narragansett\ncountry to fetch corn", "uuid" : "069523DF", "_id" : { "$oid" : "5116458955d132020000005e" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 725, "end" : "/div[1]/p[22]", "endOffset" : 798, "_id" : { "$oid" : "5116458955d132020000005f" } } ], "updated" : { "$date" : 1360414089039 }, "created" : { "$date" : 1360414089039 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511645b755d1320200000060", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "None of the Indians she passed were at all bad to her.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "yet not one of them offered the least imaginable\nmiscarriage to me.", "uuid" : "7704770F", "_id" : { "$oid" : "511645b755d1320200000060" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 1425, "end" : "/div[1]/p[22]", "endOffset" : 1492, "_id" : { "$oid" : "511645b755d1320200000061" } } ], "updated" : { "$date" : 1360414135124 }, "created" : { "$date" : 1360414135124 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511645d6669ab2020000005b", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "She gets lost visiting her son a mile away.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "My son being now about a mile from me, I asked liberty to go and\nsee him; they bade me go, and away I went; but quickly lost myself,\ntraveling over hills and through swamps, and could not find the way to\nhim.", "uuid" : "E48DB117", "_id" : { "$oid" : "511645d6669ab2020000005b" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 993, "end" : "/div[1]/p[22]", "endOffset" : 1202, "_id" : { "$oid" : "511645d6669ab2020000005c" } } ], "updated" : { "$date" : 1360414166091 }, "created" : { "$date" : 1360414166091 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511645e2669ab2020000005d", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "But her master shows her the way.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "He\nshowed me the way to my son.", "uuid" : "6CED01A2", "_id" : { "$oid" : "511645e2669ab2020000005d" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 1542, "end" : "/div[1]/p[22]", "endOffset" : 1573, "_id" : { "$oid" : "511645e2669ab2020000005e" } } ], "updated" : { "$date" : 1360414178832 }, "created" : { "$date" : 1360414178832 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116460f669ab2020000005f", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "This woman is very nice to her.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I went to the same\nsquaw, who had a kettle of ground nuts boiling. I asked her to let me\nboil my piece of bear in her kettle, which she did, and gave me some\nground nuts to eat with it: and I cannot but think how pleasant it\nwas to me.", "uuid" : "65EF14B6", "_id" : { "$oid" : "5116460f669ab2020000005f" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[23]", "startOffset" : 404, "end" : "/div[1]/p[23]", "endOffset" : 639, "_id" : { "$oid" : "5116460f669ab20200000060" } } ], "updated" : { "$date" : 1360414223808 }, "created" : { "$date" : 1360414223808 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116463f55d1320200000062", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "3/4 of a mile further up river", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "THE TENTH REMOVE", "uuid" : "ABF704B7", "_id" : { "$oid" : "5116463f55d1320200000062" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "remove", "location" ], "ranges" : [ { "start" : "/div[1]/h2[10]", "startOffset" : 5, "end" : "/div[1]/h2[10]", "endOffset" : 21, "_id" : { "$oid" : "5116463f55d1320200000063" } } ], "updated" : { "$date" : 1360414271534 }, "created" : { "$date" : 1360414271534 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116465955d1320200000064", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "She walks back to ninth remove to get food.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "being hungry, I\nwent again back to the place we were before at, to get something to eat", "uuid" : "9EE70957", "_id" : { "$oid" : "5116465955d1320200000064" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[25]", "startOffset" : 199, "end" : "/div[1]/p[25]", "endOffset" : 286, "_id" : { "$oid" : "5116465955d1320200000065" } } ], "updated" : { "$date" : 1360414297390 }, "created" : { "$date" : 1360414297390 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51164674669ab20200000061", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "But another Indian makes her go back to her master's camp.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "When I\nwas there, there came an Indian to look after me, who when he had found\nme, kicked me all along.", "uuid" : "C2C2C60D", "_id" : { "$oid" : "51164674669ab20200000061" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[25]", "startOffset" : 354, "end" : "/div[1]/p[25]", "endOffset" : 458, "_id" : { "$oid" : "51164674669ab20200000062" } } ], "updated" : { "$date" : 1360414324460 }, "created" : { "$date" : 1360414324460 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51164698669ab20200000063", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Crossed the river and took to hilly land.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I took my load at my back, and quickly we came to\nwade over the river; and passed over tiresome and wearisome hills.", "uuid" : "9E63144F", "_id" : { "$oid" : "51164698669ab20200000063" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[26]", "startOffset" : 93, "end" : "/div[1]/p[26]", "endOffset" : 209, "_id" : { "$oid" : "51164698669ab20200000064" } } ], "updated" : { "$date" : 1360414360624 }, "created" : { "$date" : 1360414360624 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511646ad669ab20200000065", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "travelling up river and over hills", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "THE ELEVENTH REMOVE", "uuid" : "58D4A101", "_id" : { "$oid" : "511646ad669ab20200000065" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "remove", "location" ], "ranges" : [ { "start" : "/div[1]/h2[11]", "startOffset" : 5, "end" : "/div[1]/h2[11]", "endOffset" : 24, "_id" : { "$oid" : "511646ad669ab20200000066" } } ], "updated" : { "$date" : 1360414381208 }, "created" : { "$date" : 1360414381208 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51164703669ab20200000067", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Presumably a good thing. Seems to mean \"a thing of no value.\" Actually means \"nut\" or similar.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Nux", "uuid" : "F83F81CB", "_id" : { "$oid" : "51164703669ab20200000067" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[27]", "startOffset" : 160, "end" : "/div[1]/p[27]", "endOffset" : 163, "_id" : { "$oid" : "51164703669ab20200000068" } } ], "updated" : { "$date" : 1360414467944 }, "created" : { "$date" : 1360414467944 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116471f55d1320200000066", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Mistress tries to throw away her bible.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "My mistress,\nbefore we went, was gone to the burial of a papoose, and returning, she\nfound me sitting and reading in my Bible; she snatched it hastily out of\nmy hand, and threw it out of doors. I ran out and catched it up, and put\nit into my pocket, and never let her see it afterward.", "uuid" : "4C4BBB6F", "_id" : { "$oid" : "5116471f55d1320200000066" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[27]", "startOffset" : 200, "end" : "/div[1]/p[27]", "endOffset" : 486, "_id" : { "$oid" : "5116471f55d1320200000067" } } ], "updated" : { "$date" : 1360414495797 }, "created" : { "$date" : 1360414495797 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116473555d1320200000068", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "They seem to be going back to English territory.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "But the thoughts of my going homeward (for so we bent our course)", "uuid" : "DFFDF792", "_id" : { "$oid" : "5116473555d1320200000068" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[28]", "startOffset" : 1, "end" : "/div[1]/p[28]", "endOffset" : 66, "_id" : { "$oid" : "5116473555d1320200000069" } } ], "updated" : { "$date" : 1360414517146 }, "created" : { "$date" : 1360414517146 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116476b669ab20200000069", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Mistress demands to go back and she has to go with her.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "a sudden my mistress gives\nout; she would go no further, but turn back again, and said I must go\nback again with her", "uuid" : "697F06D1", "_id" : { "$oid" : "5116476b669ab20200000069" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[28]", "startOffset" : 257, "end" : "/div[1]/p[28]", "endOffset" : 373, "_id" : { "$oid" : "5116476b669ab2020000006a" } } ], "updated" : { "$date" : 1360414571066 }, "created" : { "$date" : 1360414571066 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116478e55d132020000006a", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Master continues onwards.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "he would not, but said he would go on, and come\nto us again in three days.", "uuid" : "E65986B7", "_id" : { "$oid" : "5116478e55d132020000006a" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[28]", "startOffset" : 445, "end" : "/div[1]/p[28]", "endOffset" : 520, "_id" : { "$oid" : "5116478e55d132020000006b" } } ], "updated" : { "$date" : 1360414606805 }, "created" : { "$date" : 1360414606805 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511647c0669ab2020000006b", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "She wasn't allowed to sleep in the wigwam that night.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "but when we came to lie down they\nbade me to go out, and lie somewhere else", "uuid" : "8D5093F2", "_id" : { "$oid" : "511647c0669ab2020000006b" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[28]", "startOffset" : 1444, "end" : "/div[1]/p[28]", "endOffset" : 1519, "_id" : { "$oid" : "511647c0669ab2020000006c" } } ], "updated" : { "$date" : 1360414656542 }, "created" : { "$date" : 1360414656542 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511647e355d132020000006c", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "An old Indian couple took her in for the night.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "last an old Indian bade me to come to him, and his squaw gave\nme some ground nuts; she gave me also something to lay under my head,\nand a good fire we had", "uuid" : "D83454E4", "_id" : { "$oid" : "511647e355d132020000006c" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[28]", "startOffset" : 2187, "end" : "/div[1]/p[28]", "endOffset" : 2341, "_id" : { "$oid" : "511647e355d132020000006d" } } ], "updated" : { "$date" : 1360414691421 }, "created" : { "$date" : 1360414691421 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511647f455d132020000006e", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "2 miles from the Connecticut river.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "We\nwere at this place and time about two miles from [the] Connecticut\nriver.", "uuid" : "15AF881F", "_id" : { "$oid" : "511647f455d132020000006e" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[28]", "startOffset" : 2528, "end" : "/div[1]/p[28]", "endOffset" : 2605, "_id" : { "$oid" : "511647f455d132020000006f" } } ], "updated" : { "$date" : 1360414708222 }, "created" : { "$date" : 1360414708222 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51164802669ab2020000006d", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "2 miles from the Connecticut river", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "THE TWELFTH REMOVE", "uuid" : "6845FF7C", "_id" : { "$oid" : "51164802669ab2020000006d" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "remove", "location" ], "ranges" : [ { "start" : "/div[1]/h2[12]", "startOffset" : 5, "end" : "/div[1]/h2[12]", "endOffset" : 23, "_id" : { "$oid" : "51164802669ab2020000006e" } } ], "updated" : { "$date" : 1360414722820 }, "created" : { "$date" : 1360414722820 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51164cf055d1320200000070", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "5 or 6 miles down river (not towards the bay)", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "five or six miles down the river into a mighty thicket of\nbrush; where we abode almost a fortnight.", "uuid" : "267D77C4", "_id" : { "$oid" : "51164cf055d1320200000070" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[29]", "startOffset" : 80, "end" : "/div[1]/p[29]", "endOffset" : 179, "_id" : { "$oid" : "51164cf055d1320200000071" } } ], "updated" : { "$date" : 1360415984799 }, "created" : { "$date" : 1360415984799 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51164d0855d1320200000072", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "in the brush, further downriver", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "THE THIRTEENTH REMOVE", "uuid" : "05B87B09", "_id" : { "$oid" : "51164d0855d1320200000072" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "remove", "location" ], "ranges" : [ { "start" : "/div[1]/h2[13]", "startOffset" : 5, "end" : "/div[1]/h2[13]", "endOffset" : 26, "_id" : { "$oid" : "51164d0855d1320200000073" } } ], "updated" : { "$date" : 1360416008799 }, "created" : { "$date" : 1360416008799 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51164d3555d1320200000074", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Random Indian tells her her son's been eaten. She doesn't fall for it.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "He answered me that such a time his master roasted him, and that himself\ndid eat a piece of him, as big as his two fingers, and that he was very\ngood meat.", "uuid" : "DFA35766", "_id" : { "$oid" : "51164d3555d1320200000074" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[29]", "startOffset" : 557, "end" : "/div[1]/p[29]", "endOffset" : 712, "_id" : { "$oid" : "51164d3555d1320200000075" } } ], "updated" : { "$date" : 1360416053128 }, "created" : { "$date" : 1360416053128 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51164d5b55d1320200000076", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "The Indians are kind of jerks.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "A squaw moved it down again, at which I\nlooked up, and she threw a handful of ashes in mine eyes.", "uuid" : "D2340BEB", "_id" : { "$oid" : "51164d5b55d1320200000076" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[29]", "startOffset" : 1014, "end" : "/div[1]/p[29]", "endOffset" : 1111, "_id" : { "$oid" : "51164d5b55d1320200000077" } } ], "updated" : { "$date" : 1360416091541 }, "created" : { "$date" : 1360416091541 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51164d7955d1320200000078", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Hadley", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Hadley", "uuid" : "6BE4890E", "_id" : { "$oid" : "51164d7955d1320200000078" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[29]", "startOffset" : 3390, "end" : "/div[1]/p[29]", "endOffset" : 3396, "_id" : { "$oid" : "51164d7955d1320200000079" } } ], "updated" : { "$date" : 1360416121503 }, "created" : { "$date" : 1360416121503 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51164db655d132020000007a", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Attempted defiance", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "With that my mistress rises up, and take up a stick big enough to have\nkilled me, and struck at me with it. But I stepped out, and she struck\nthe stick into the mat of the wigwam.", "uuid" : "EBC8F1DB", "_id" : { "$oid" : "51164db655d132020000007a" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[30]", "startOffset" : 361, "end" : "/div[1]/p[30]", "endOffset" : 540, "_id" : { "$oid" : "51164db655d132020000007b" } } ], "updated" : { "$date" : 1360416182936 }, "created" : { "$date" : 1360416182936 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51164de8669ab2020000006f", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Her son's Indians attempt to trade with the French, but the Mohawks prevent them from doing so.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "He told me also, that awhile before, his master (together with\nother Indians) were going to the French for powder; but by the way the\nMohawks met with them, and killed four of their company, which made the\nrest turn back again, for it might have been worse with him, had he\nbeen sold to the French, than it proved to be in his remaining with the\nIndians.", "uuid" : "D9A0B850", "_id" : { "$oid" : "51164de8669ab2020000006f" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[31]", "startOffset" : 361, "end" : "/div[1]/p[31]", "endOffset" : 715, "_id" : { "$oid" : "51164de8669ab20200000070" } } ], "updated" : { "$date" : 1360416232059 }, "created" : { "$date" : 1360416232059 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51164e2f669ab20200000071", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Englishman laying on the ground in a shirt with an orphaned baby. ", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "They had turned him out of the wigwam, and with him an\nIndian papoose, almost dead (whose parents had been killed), in a bitter\ncold day, without fire or clothes.", "uuid" : "154BECBD", "_id" : { "$oid" : "51164e2f669ab20200000071" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[32]", "startOffset" : 220, "end" : "/div[1]/p[32]", "endOffset" : 382, "_id" : { "$oid" : "51164e2f669ab20200000072" } } ], "updated" : { "$date" : 1360416303884 }, "created" : { "$date" : 1360416303884 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51164e5855d132020000007c", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "She's no longer allowed out of the wigwam.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "They told me I lied, and taking up a hatchet, they came\nto me, and said they would knock me down if I stirred out again, and so\nconfined me to the wigwam.", "uuid" : "B431C14A", "_id" : { "$oid" : "51164e5855d132020000007c" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[32]", "startOffset" : 1566, "end" : "/div[1]/p[32]", "endOffset" : 1720, "_id" : { "$oid" : "51164e5855d132020000007d" } } ], "updated" : { "$date" : 1360416344992 }, "created" : { "$date" : 1360416344992 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51164f0655d132020000007e", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "She gets her son sold to a new master because he was gone too long.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Which he did, and it seems\ntarried a little too long; for his master was angry with him, and beat\nhim, and then sold him. Then he came running to tell me he had a new\nmaster, and that he had given him some ground nuts already.", "uuid" : "29ADB3AC", "_id" : { "$oid" : "51164f0655d132020000007e" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[33]", "startOffset" : 756, "end" : "/div[1]/p[33]", "endOffset" : 982, "_id" : { "$oid" : "51164f0655d132020000007f" } } ], "updated" : { "$date" : 1360416518395 }, "created" : { "$date" : 1360416518395 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51164f1955d1320200000080", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Last time she sees her son. He seems to be in good hands.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "So his master carried him away, and I never saw him afterward,\ntill I saw him at Piscataqua in Portsmouth.", "uuid" : "67FF9621", "_id" : { "$oid" : "51164f1955d1320200000080" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[33]", "startOffset" : 1078, "end" : "/div[1]/p[33]", "endOffset" : 1184, "_id" : { "$oid" : "51164f1955d1320200000081" } } ], "updated" : { "$date" : 1360416537756 }, "created" : { "$date" : 1360416537756 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51164f30669ab20200000073", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Her mistress's baby dies, and she gets put out of the wigwam again.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "My mistress's\npapoose was sick, and it died that night, and there was one benefit in\nit—that there was more room.", "uuid" : "1A4C68DF", "_id" : { "$oid" : "51164f30669ab20200000073" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[34]", "startOffset" : 53, "end" : "/div[1]/p[34]", "endOffset" : 166, "_id" : { "$oid" : "51164f30669ab20200000074" } } ], "updated" : { "$date" : 1360416560983 }, "created" : { "$date" : 1360416560983 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51164f4955d1320200000082", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "She didn't feel bad for her mistress losing a child. There's a surprise. ", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I confess I could not much condole\nwith them.", "uuid" : "B34F344B", "_id" : { "$oid" : "51164f4955d1320200000082" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[34]", "startOffset" : 456, "end" : "/div[1]/p[34]", "endOffset" : 501, "_id" : { "$oid" : "51164f4955d1320200000083" } } ], "updated" : { "$date" : 1360416585602 }, "created" : { "$date" : 1360416585602 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51164f7055d1320200000084", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "headed towards Baytowns", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "our course\ntoward the Baytowns", "uuid" : "FE33A702", "_id" : { "$oid" : "51164f7055d1320200000084" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[35]", "startOffset" : 60, "end" : "/div[1]/p[35]", "endOffset" : 90, "_id" : { "$oid" : "51164f7055d1320200000085" } } ], "updated" : { "$date" : 1360416624077 }, "created" : { "$date" : 1360416624077 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51164f8a55d1320200000086", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "on the move towards Baytowns", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "THE FOURTEENTH REMOVE", "uuid" : "347E32FE", "_id" : { "$oid" : "51164f8a55d1320200000086" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "remove", "location" ], "ranges" : [ { "start" : "/div[1]/h2[14]", "startOffset" : 5, "end" : "/div[1]/h2[14]", "endOffset" : 26, "_id" : { "$oid" : "51164f8a55d1320200000087" } } ], "updated" : { "$date" : 1360416650660 }, "created" : { "$date" : 1360416650660 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51164fd555d1320200000088", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Banquaug river again", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "We came to Banquang river again that day, near which we abode\na few days.", "uuid" : "A9CCCC48", "_id" : { "$oid" : "51164fd555d1320200000088" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[36]", "startOffset" : 225, "end" : "/div[1]/p[36]", "endOffset" : 298, "_id" : { "$oid" : "51164fd555d1320200000089" } } ], "updated" : { "$date" : 1360416725658 }, "created" : { "$date" : 1360416725658 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116512055d132020000008a", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Banquang river", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "THE FIFTEENTH REMOVE", "uuid" : "F17AC707", "_id" : { "$oid" : "5116512055d132020000008a" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "remove", "location" ], "ranges" : [ { "start" : "/div[1]/h2[15]", "startOffset" : 5, "end" : "/div[1]/h2[15]", "endOffset" : 25, "_id" : { "$oid" : "5116512055d132020000008b" } } ], "updated" : { "$date" : 1360417056946 }, "created" : { "$date" : 1360417056946 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511651ab55d132020000008c", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "across the Banquang river", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "THE SIXTEENTH REMOVAL", "uuid" : "C9F0570A", "_id" : { "$oid" : "511651ab55d132020000008c" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "remove", "location" ], "ranges" : [ { "start" : "/div[1]/h2[16]", "startOffset" : 5, "end" : "/div[1]/h2[16]", "endOffset" : 26, "_id" : { "$oid" : "511651ab55d132020000008d" } } ], "updated" : { "$date" : 1360417195237 }, "created" : { "$date" : 1360417195237 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511651bc55d132020000008e", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "She has a lot of problems crossing the river.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I was so weak and feeble, that I reeled\nas I went along, and thought there I must end my days at last, after\nmy bearing and getting through so many difficulties.", "uuid" : "057A6F6B", "_id" : { "$oid" : "511651bc55d132020000008e" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[37]", "startOffset" : 172, "end" : "/div[1]/p[37]", "endOffset" : 333, "_id" : { "$oid" : "511651bc55d132020000008f" } } ], "updated" : { "$date" : 1360417212041 }, "created" : { "$date" : 1360417212041 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511651da55d1320200000090", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "She's Wachusett-bound, where her master is.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I must go\nto Wachusett to my master", "uuid" : "3E7565D3", "_id" : { "$oid" : "511651da55d1320200000090" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[37]", "startOffset" : 832, "end" : "/div[1]/p[37]", "endOffset" : 867, "_id" : { "$oid" : "511651da55d1320200000091" } } ], "updated" : { "$date" : 1360417242941 }, "created" : { "$date" : 1360417242941 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511651f5669ab20200000075", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Only moved one mile, and stayed there two days.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Yet it pleased them to go but\none mile that night, and there we stayed two days.", "uuid" : "644D7C73", "_id" : { "$oid" : "511651f5669ab20200000075" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[37]", "startOffset" : 1239, "end" : "/div[1]/p[37]", "endOffset" : 1319, "_id" : { "$oid" : "511651f5669ab20200000076" } } ], "updated" : { "$date" : 1360417269985 }, "created" : { "$date" : 1360417269985 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116520b55d1320200000092", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Indians in English clothing.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "first sight\nof them, for they were dressed in English apparel, with hats, white\nneckcloths, and sashes about their waists; and ribbons upon their\nshoulders", "uuid" : "5B8AE6D5", "_id" : { "$oid" : "5116520b55d1320200000092" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[37]", "startOffset" : 1466, "end" : "/div[1]/p[37]", "endOffset" : 1621, "_id" : { "$oid" : "5116520b55d1320200000093" } } ], "updated" : { "$date" : 1360417291094 }, "created" : { "$date" : 1360417291094 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511652bd55d1320200000094", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Indian town", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "At night we came to an Indian town", "uuid" : "4A150A5B", "_id" : { "$oid" : "511652bd55d1320200000094" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[38]", "startOffset" : 507, "end" : "/div[1]/p[38]", "endOffset" : 541, "_id" : { "$oid" : "511652bd55d1320200000095" } } ], "updated" : { "$date" : 1360417469662 }, "created" : { "$date" : 1360417469662 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511652c755d1320200000096", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "indian town", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "THE SEVENTEENTH REMOVE", "uuid" : "196204F7", "_id" : { "$oid" : "511652c755d1320200000096" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "remove", "location" ], "ranges" : [ { "start" : "/div[1]/h2[17]", "startOffset" : 5, "end" : "/div[1]/h2[17]", "endOffset" : 27, "_id" : { "$oid" : "511652c755d1320200000097" } } ], "updated" : { "$date" : 1360417479699 }, "created" : { "$date" : 1360417479699 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511652df55d1320200000098", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "dead naked Englishman", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Englishman stripped naked, and lying dead\nupon the ground, but knew not who it was.", "uuid" : "37B15D36", "_id" : { "$oid" : "511652df55d1320200000098" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[39]", "startOffset" : 100, "end" : "/div[1]/p[39]", "endOffset" : 183, "_id" : { "$oid" : "511652df55d1320200000099" } } ], "updated" : { "$date" : 1360417503086 }, "created" : { "$date" : 1360417503086 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511652ea669ab20200000077", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "a second indian town", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "THE EIGHTEENTH REMOVE", "uuid" : "6C6214CE", "_id" : { "$oid" : "511652ea669ab20200000077" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "remove", "location" ], "ranges" : [ { "start" : "/div[1]/h2[18]", "startOffset" : 5, "end" : "/div[1]/h2[18]", "endOffset" : 26, "_id" : { "$oid" : "511652ea669ab20200000078" } } ], "updated" : { "$date" : 1360417514124 }, "created" : { "$date" : 1360417514124 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511652f9669ab20200000079", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "She comes across one of her nieces.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "In this town there were four English\nchildren, captives; and one of them my own sister's.", "uuid" : "AE48C02D", "_id" : { "$oid" : "511652f9669ab20200000079" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[39]", "startOffset" : 248, "end" : "/div[1]/p[39]", "endOffset" : 337, "_id" : { "$oid" : "511652f9669ab2020000007a" } } ], "updated" : { "$date" : 1360417529316 }, "created" : { "$date" : 1360417529316 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116531d55d132020000009a", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "She stole food from a child?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Then I took it of the child, and\neat it myself, and savory it was to my taste.", "uuid" : "A457BC91", "_id" : { "$oid" : "5116531d55d132020000009a" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[39]", "startOffset" : 1031, "end" : "/div[1]/p[39]", "endOffset" : 1109, "_id" : { "$oid" : "5116531d55d132020000009b" } } ], "updated" : { "$date" : 1360417565307 }, "created" : { "$date" : 1360417565307 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51165341669ab2020000007b", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Her mistress tells her to stop begging for food. She tells them they can beat her or kill her by starvation.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Then I went home to my mistress's wigwam; and\nthey told me I disgraced my master with begging, and if I did so any\nmore, they would knock me in the head. I told them, they had as good\nknock me in head as starve me to death.", "uuid" : "D501FE79", "_id" : { "$oid" : "51165341669ab2020000007b" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[39]", "startOffset" : 1302, "end" : "/div[1]/p[39]", "endOffset" : 1525, "_id" : { "$oid" : "51165341669ab2020000007c" } } ], "updated" : { "$date" : 1360417601096 }, "created" : { "$date" : 1360417601096 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5116536b669ab2020000007d" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360417643727 }, "id" : "5116536b669ab2020000007d", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "THE NINETEENTH REMOVE", "ranges" : [ { "start" : "/div[1]/h2[19]", "startOffset" : 5, "end" : "/div[1]/h2[19]", "endOffset" : 26, "_id" : { "$oid" : "5116536b669ab2020000007e" } } ], "tags" : [ "remove", "location" ], "text" : "trying to get to Wachusett, near Sudbury", "updated" : { "$date" : 1360418335841 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "5D4E41CC" } -{ "id" : "5116537655d132020000009c", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "within sight of Wachusett", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I\nsaw Wachusett hills", "uuid" : "E5421E44", "_id" : { "$oid" : "5116537655d132020000009c" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[40]", "startOffset" : 210, "end" : "/div[1]/p[40]", "endOffset" : 231, "_id" : { "$oid" : "5116537655d132020000009d" } } ], "updated" : { "$date" : 1360417654707 }, "created" : { "$date" : 1360417654707 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511653a455d132020000009e", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "King Philip tells her she's going to see her master?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Going\nalong, having indeed my life, but little spirit, Philip, who was in the\ncompany, came up and took me by the hand, and said, two weeks more and\nyou shall be mistress again.", "uuid" : "30E77BC1", "_id" : { "$oid" : "511653a455d132020000009e" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "Metacomet" ], "ranges" : [ { "start" : "/div[1]/p[40]", "startOffset" : 559, "end" : "/div[1]/p[40]", "endOffset" : 736, "_id" : { "$oid" : "511653a455d132020000009f" } } ], "updated" : { "$date" : 1360417700986 }, "created" : { "$date" : 1360417700986 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511653c0669ab2020000007f", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Her master lets her bathe and gets her food.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "He asked me, when I washed me? I told\nhim not this month. Then he fetched me some water himself, and bid me\nwash, and gave me the glass to see how I looked; and bid his squaw give\nme something to eat.", "uuid" : "2DC04090", "_id" : { "$oid" : "511653c0669ab2020000007f" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[40]", "startOffset" : 962, "end" : "/div[1]/p[40]", "endOffset" : 1163, "_id" : { "$oid" : "511653c0669ab20200000080" } } ], "updated" : { "$date" : 1360417728857 }, "created" : { "$date" : 1360417728857 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511653e8669ab20200000081", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "She had been traveling with her master's second wife.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Another was Wattimore [Weetamoo]\nwith whom I had lived and served all this while.", "uuid" : "677E4660", "_id" : { "$oid" : "511653e8669ab20200000081" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[41]", "startOffset" : 179, "end" : "/div[1]/p[41]", "endOffset" : 260, "_id" : { "$oid" : "511653e8669ab20200000082" } } ], "updated" : { "$date" : 1360417768837 }, "created" : { "$date" : 1360417768837 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116540d55d13202000000a0", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Second wife wants her back; first wife tells her to come to her for food and shelter at night.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Weetamoo's maid came to call me home, at which I fell\naweeping. Then the old squaw told me, to encourage me, that if I wanted\nvictuals, I should come to her, and that I should lie there in her\nwigwam.", "uuid" : "F360E688", "_id" : { "$oid" : "5116540d55d13202000000a0" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[41]", "startOffset" : 721, "end" : "/div[1]/p[41]", "endOffset" : 921, "_id" : { "$oid" : "5116540d55d13202000000a1" } } ], "updated" : { "$date" : 1360417805498 }, "created" : { "$date" : 1360417805498 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116542d669ab20200000083", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Second wife wants to keep her in her wigwam so she gets paid the ransom, basically.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I understood that Weetamoo\nthought that if she should let me go and serve with the old squaw, she\nwould be in danger to lose not only my service, but the redemption pay\nalso.", "uuid" : "78B98C29", "_id" : { "$oid" : "5116542d669ab20200000083" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[41]", "startOffset" : 1095, "end" : "/div[1]/p[41]", "endOffset" : 1269, "_id" : { "$oid" : "5116542d669ab20200000084" } } ], "updated" : { "$date" : 1360417837676 }, "created" : { "$date" : 1360417837676 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51165446669ab20200000085", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Tom and Peter?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Tom and Peter", "uuid" : "A9D7E14F", "_id" : { "$oid" : "51165446669ab20200000085" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 11, "end" : "/div[1]/p[42]", "endOffset" : 24, "_id" : { "$oid" : "51165446669ab20200000086" } } ], "updated" : { "$date" : 1360417862112 }, "created" : { "$date" : 1360417862112 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116547c55d13202000000a2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "How would she have sent for her husband?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "So that fearing the worst, I durst not send\nto my husband, though there were some thoughts of his coming to redeem\nand fetch me, not knowing what might follow.", "uuid" : "8A21DE32", "_id" : { "$oid" : "5116547c55d13202000000a2" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 873, "end" : "/div[1]/p[42]", "endOffset" : 1032, "_id" : { "$oid" : "5116547c55d13202000000a3" } } ], "updated" : { "$date" : 1360417916755 }, "created" : { "$date" : 1360417916755 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511654a2669ab20200000087", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "The General Court of the Sagamores sets her ransom.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Sagamores met to consult about the captives, and called me to them\nto inquire how much my husband would give to redeem me.", "uuid" : "0AE7D4E6", "_id" : { "$oid" : "511654a2669ab20200000087" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 1134, "end" : "/div[1]/p[42]", "endOffset" : 1257, "_id" : { "$oid" : "511654a2669ab20200000088" } } ], "updated" : { "$date" : 1360417954937 }, "created" : { "$date" : 1360417954937 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511654c155d13202000000a4", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "A Christian Indian writes to Boston for her ransom.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "ut they would not\nhear of that, but sent that message to Boston, that for twenty pounds I\nshould be redeemed. It was a Praying Indian that wrote their letter\nfor them.", "uuid" : "DDE9B633", "_id" : { "$oid" : "511654c155d13202000000a4" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 1751, "end" : "/div[1]/p[42]", "endOffset" : 1918, "_id" : { "$oid" : "511654c155d13202000000a5" } } ], "updated" : { "$date" : 1360417985127 }, "created" : { "$date" : 1360417985127 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116550655d13202000000a6", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Lots of Praying Indian stories follow:", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "There was another Praying Indian, who told me, that he had\na brother, that would not eat horse", "uuid" : "8B597E09", "_id" : { "$oid" : "5116550655d13202000000a6" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 1919, "end" : "/div[1]/p[42]", "endOffset" : 2013, "_id" : { "$oid" : "5116550655d13202000000a7" } } ], "updated" : { "$date" : 1360418054157 }, "created" : { "$date" : 1360418054157 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116554f55d13202000000a8", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Then they go out and attack Sudbury?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "One Englishman they brought along with them: and he\nsaid, it was too true, for they had made sad work at Sudbury, as indeed\nit proved.", "uuid" : "9DD40341", "_id" : { "$oid" : "5116554f55d13202000000a8" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 5039, "end" : "/div[1]/p[42]", "endOffset" : 5174, "_id" : { "$oid" : "5116554f55d13202000000a9" } } ], "updated" : { "$date" : 1360418127561 }, "created" : { "$date" : 1360418127561 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511655a0669ab20200000089", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "They left happy and rejoicing, came back quietly and as if they'd lost. But she didn't think they'd lost any men.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "When\nthey went, they acted as if the devil had told them that they should\ngain the victory; and now they acted as if the devil had told them they\nshould have a fall.", "uuid" : "1DDCC068", "_id" : { "$oid" : "511655a0669ab20200000089" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 5510, "end" : "/div[1]/p[42]", "endOffset" : 5676, "_id" : { "$oid" : "511655a0669ab2020000008a" } } ], "updated" : { "$date" : 1360418208601 }, "created" : { "$date" : 1360418208601 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511655ba55d13202000000aa", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "They did eventually get destroyed (by the english presumably).", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Whither it were so or no, I cannot tell, but so it\nproved, for quickly they began to fall, and so held on that summer, till\nthey came to utter ruin.", "uuid" : "B005704B", "_id" : { "$oid" : "511655ba55d13202000000aa" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 5676, "end" : "/div[1]/p[42]", "endOffset" : 5824, "_id" : { "$oid" : "511655ba55d13202000000ab" } } ], "updated" : { "$date" : 1360418234402 }, "created" : { "$date" : 1360418234402 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511655ec669ab2020000008b", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "An Indian that would feed her often told her he'd killed two Englishmen at Sudbury and had their clothing.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Which I did, and as I\nwas eating, another Indian said to me, he seems to be your good friend,\nbut he killed two Englishmen at Sudbury, and there lie their clothes\nbehind you: I looked behind me, and there I saw bloody clothes, with\nbullet-holes in them", "uuid" : "7AD063DB", "_id" : { "$oid" : "511655ec669ab2020000008b" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 6207, "end" : "/div[1]/p[42]", "endOffset" : 6459, "_id" : { "$oid" : "511655ec669ab2020000008c" } } ], "updated" : { "$date" : 1360418284329 }, "created" : { "$date" : 1360418284329 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116560d669ab2020000008d", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "3 or 4 miles away from the camp they attacked Sudbury from", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "THE TWENTIETH REMOVE", "uuid" : "CECECA91", "_id" : { "$oid" : "5116560d669ab2020000008d" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "remove", "location" ], "ranges" : [ { "start" : "/div[1]/h2[20]", "startOffset" : 5, "end" : "/div[1]/h2[20]", "endOffset" : 25, "_id" : { "$oid" : "5116560d669ab2020000008e" } } ], "updated" : { "$date" : 1360418317946 }, "created" : { "$date" : 1360418317946 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116563155d13202000000ac", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "We went\nabout three or four miles, and there they built a great wigwam, big\nenough to hold an hundred Indians, which they did in preparation to a\ngreat day of dancing.", "uuid" : "CE181A39", "_id" : { "$oid" : "5116563155d13202000000ac" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[43]", "startOffset" : 132, "end" : "/div[1]/p[43]", "endOffset" : 299, "_id" : { "$oid" : "5116563155d13202000000ad" } } ], "updated" : { "$date" : 1360418353387 }, "created" : { "$date" : 1360418353387 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51165648669ab2020000008f", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Her sister tries to see her, but doesn't.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Then he overtook her, and began to rant as if he had been mad, and made\nher go back again in the rain; so that I never saw her till I saw her\nin Charlestown.", "uuid" : "CCBB395A", "_id" : { "$oid" : "51165648669ab2020000008f" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[43]", "startOffset" : 774, "end" : "/div[1]/p[43]", "endOffset" : 931, "_id" : { "$oid" : "51165648669ab20200000090" } } ], "updated" : { "$date" : 1360418376451 }, "created" : { "$date" : 1360418376451 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116566555d13202000000ae", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Her daughter was also near, but she didn't get to see her.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "My daughter was also now about a\nmile off,", "uuid" : "A9626E97", "_id" : { "$oid" : "5116566555d13202000000ae" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[43]", "startOffset" : 1460, "end" : "/div[1]/p[43]", "endOffset" : 1502, "_id" : { "$oid" : "5116566555d13202000000af" } } ], "updated" : { "$date" : 1360418405092 }, "created" : { "$date" : 1360418405092 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51165692669ab20200000091", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "They terrorize an Englishman that shows up.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I told them I thought they had killed the Englishman (for they\nhad in the meantime informed me that an Englishman was come). They said,\nno. They shot over his horse and under and before his horse, and they\npushed him this way and that way, at their pleasure, showing what they\ncould do.", "uuid" : "51D3AB11", "_id" : { "$oid" : "51165692669ab20200000091" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[44]", "startOffset" : 572, "end" : "/div[1]/p[44]", "endOffset" : 858, "_id" : { "$oid" : "51165692669ab20200000092" } } ], "updated" : { "$date" : 1360418450176 }, "created" : { "$date" : 1360418450176 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511656b355d13202000000b0", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Her husband sent her tobacco?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Amongst other things which my husband sent me,\nthere came a pound of tobacco, which I sold for nine shillings in money;\nfor many of the Indians for want of tobacco, smoked hemlock, and ground\nivy.", "uuid" : "4000AD64", "_id" : { "$oid" : "511656b355d13202000000b0" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[44]", "startOffset" : 1225, "end" : "/div[1]/p[44]", "endOffset" : 1421, "_id" : { "$oid" : "511656b355d13202000000b1" } } ], "updated" : { "$date" : 1360418483762 }, "created" : { "$date" : 1360418483762 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511656d855d13202000000b2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "The Indians stole food and cloth from the Englishman.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "In\nthe morning Mr. Hoar invited the Sagamores to dinner; but when we went\nto get it ready we found that they had stolen the greatest part of the\nprovision Mr. Hoar had brought, out of his bags, in the night", "uuid" : "BD2C9779", "_id" : { "$oid" : "511656d855d13202000000b2" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[44]", "startOffset" : 1691, "end" : "/div[1]/p[44]", "endOffset" : 1897, "_id" : { "$oid" : "511656d855d13202000000b3" } } ], "updated" : { "$date" : 1360418520036 }, "created" : { "$date" : 1360418520036 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511656fc669ab20200000093", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Her master and mistress get dressed up to dance.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "He was dressed in his holland shirt, with great\nlaces sewed at the tail of it; he had his silver buttons, his white\nstockings, his garters were hung round with shillings, and he had\ngirdles of wampum upon his head and shoulders. She had a kersey coat,\nand covered with girdles of wampum from the loins upward. Her arms from\nher elbows to her hands were covered with bracelets; there were handfuls\nof necklaces about her neck, and several sorts of jewels in her ears.\nShe had fine red stockings, and white shoes, her hair powdered and face\npainted red, that was always before black.", "uuid" : "D05EF445", "_id" : { "$oid" : "511656fc669ab20200000093" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[44]", "startOffset" : 2834, "end" : "/div[1]/p[44]", "endOffset" : 3415, "_id" : { "$oid" : "511656fc669ab20200000094" } } ], "updated" : { "$date" : 1360418556769 }, "created" : { "$date" : 1360418556769 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116571f669ab20200000095", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Her master says he'll give her back for a pint of alcohol.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "When we were lain down, my master went out of the wigwam, and\nby and by sent in an Indian called James the Printer, who told Mr. Hoar,\nthat my master would let me go home tomorrow, if he would let him have\none pint of liquors.", "uuid" : "DC5CE54D", "_id" : { "$oid" : "5116571f669ab20200000095" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[44]", "startOffset" : 3877, "end" : "/div[1]/p[44]", "endOffset" : 4103, "_id" : { "$oid" : "5116571f669ab20200000096" } } ], "updated" : { "$date" : 1360418591191 }, "created" : { "$date" : 1360418591191 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116573555d13202000000b4", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "The Englishman gets \"his Indians\" to find him alcohol.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Then Mr. Hoar called his own Indians, Tom and\nPeter, and bid them go and see whether he would promise it before them\nthree; and if he would, he should have it; which he did, and he had it.", "uuid" : "F86F941B", "_id" : { "$oid" : "5116573555d13202000000b4" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[44]", "startOffset" : 4104, "end" : "/div[1]/p[44]", "endOffset" : 4292, "_id" : { "$oid" : "5116573555d13202000000b5" } } ], "updated" : { "$date" : 1360418613171 }, "created" : { "$date" : 1360418613171 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116576055d13202000000b6", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Her master gets drunk off of a pint.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "My master after he had had his drink, quickly came\nranting into the wigwam again, and called for Mr. Hoar, drinking to him,\nand saying, he was a good man, and then again he would say, \"hang him\nrogue.\"", "uuid" : "017F18CC", "_id" : { "$oid" : "5116576055d13202000000b6" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[44]", "startOffset" : 4732, "end" : "/div[1]/p[44]", "endOffset" : 4933, "_id" : { "$oid" : "5116576055d13202000000b7" } } ], "updated" : { "$date" : 1360418656217 }, "created" : { "$date" : 1360418656217 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116579d55d13202000000b8", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Then the General Court decides she should go home?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "On Tuesday morning they called their general court (as they call it) to\nconsult and determine, whether I should go home or no. And they all\nas one man did seemingly consent to it, that I should go home; except\nPhilip, who would not come among them.", "uuid" : "D0B28095", "_id" : { "$oid" : "5116579d55d13202000000b8" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "metacomet" ], "ranges" : [ { "start" : "/div[1]/p[45]", "startOffset" : 1, "end" : "/div[1]/p[45]", "endOffset" : 249, "_id" : { "$oid" : "5116579d55d13202000000b9" } } ], "updated" : { "$date" : 1360418717881 }, "created" : { "$date" : 1360418717881 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511657d2669ab20200000097", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Metacomet shows up and makes her give him things in return for good news.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Then Philip smelling the business called me to him, and asked me what I\nwould give him, to tell me some good news, and speak a good word for\nme. I told him I could not tell what to give him. I would [give him]\nanything I had, and asked him what he would have? He said two coats\nand twenty shillings in money, and half a bushel of seed corn, and some\ntobacco. I thanked him for his love; but I knew the good news as well\nas the crafty fox.", "uuid" : "6BB60CD9", "_id" : { "$oid" : "511657d2669ab20200000097" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "metacomet" ], "ranges" : [ { "start" : "/div[1]/p[44]", "startOffset" : 4293, "end" : "/div[1]/p[44]", "endOffset" : 4731, "_id" : { "$oid" : "511657d2669ab20200000098" } } ], "updated" : { "$date" : 1360418770421 }, "created" : { "$date" : 1360418770421 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116584d669ab20200000099", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "There had been army men at her town until they left to get more provisions a week before the attack. (Unsurprisingly, the Indians had been starving too.)", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I say, that then our army should want provision, and be forced to leave\ntheir pursuit and return homeward; and the very next week the enemy came\nupon our town, like bears bereft of their whelps, or so many ravenous\nwolves, rending us and our lambs to death.", "uuid" : "7B913004", "_id" : { "$oid" : "5116584d669ab20200000099" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[47]", "startOffset" : 358, "end" : "/div[1]/p[47]", "endOffset" : 615, "_id" : { "$oid" : "5116584d669ab2020000009a" } } ], "updated" : { "$date" : 1360418893878 }, "created" : { "$date" : 1360418893878 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51165869669ab2020000009b", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "The Indians were scornful of the English army.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Thus did they scoff at us, as if the English would be a quarter of a\nyear getting ready.", "uuid" : "FCBF919D", "_id" : { "$oid" : "51165869669ab2020000009b" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[48]", "startOffset" : 343, "end" : "/div[1]/p[48]", "endOffset" : 431, "_id" : { "$oid" : "51165869669ab2020000009c" } } ], "updated" : { "$date" : 1360418921087 }, "created" : { "$date" : 1360418921087 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116589c55d13202000000ba", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "The Indians had been running from the fresh English army by crossing an impassable river.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "fled before them till they came to Banquang river", "uuid" : "9A56BEA6", "_id" : { "$oid" : "5116589c55d13202000000ba" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[49]", "startOffset" : 147, "end" : "/div[1]/p[49]", "endOffset" : 196, "_id" : { "$oid" : "5116589c55d13202000000bb" } } ], "updated" : { "$date" : 1360418972285 }, "created" : { "$date" : 1360418972285 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511658bc669ab2020000009d", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "None of the Indians died of hunger, even though the English strategy was starve them out.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I did not see\n(all the time I was among them) one man, woman, or child, die with\nhunger.", "uuid" : "4B3B800C", "_id" : { "$oid" : "511658bc669ab2020000009d" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[50]", "startOffset" : 407, "end" : "/div[1]/p[50]", "endOffset" : 495, "_id" : { "$oid" : "511658bc669ab2020000009e" } } ], "updated" : { "$date" : 1360419004064 }, "created" : { "$date" : 1360419004064 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511658eb669ab2020000009f", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "The Indians ate everything.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "They would eat horse's guts, and ears, and all sorts of wild birds\nwhich they could catch; also bear, venison, beaver, tortoise, frogs,\nsquirrels, dogs, skunks, rattlesnakes; yea, the very bark of trees", "uuid" : "89D09881", "_id" : { "$oid" : "511658eb669ab2020000009f" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[53]", "startOffset" : 291, "end" : "/div[1]/p[53]", "endOffset" : 493, "_id" : { "$oid" : "511658eb669ab202000000a0" } } ], "updated" : { "$date" : 1360419051234 }, "created" : { "$date" : 1360419051234 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511658fe669ab202000000a1", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "eleven weeks and five\ndays", "uuid" : "046F0FCA", "_id" : { "$oid" : "511658fe669ab202000000a1" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "time" ], "ranges" : [ { "start" : "/div[1]/p[54]", "startOffset" : 186, "end" : "/div[1]/p[54]", "endOffset" : 212, "_id" : { "$oid" : "511658fe669ab202000000a2" } } ], "updated" : { "$date" : 1360419070502 }, "created" : { "$date" : 1360419070502 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51165926669ab202000000a3", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "The Indians attacked Englishpeople a lot.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "one week passed without the fury of the enemy, and some\ndesolation by fire and sword upon one place or other. They mourned (with\ntheir black faces) for their own losses, yet triumphed and rejoiced in\ntheir inhumane, and many times devilish cruelty to the English.", "uuid" : "3834A470", "_id" : { "$oid" : "51165926669ab202000000a3" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[54]", "startOffset" : 222, "end" : "/div[1]/p[54]", "endOffset" : 486, "_id" : { "$oid" : "51165926669ab202000000a4" } } ], "updated" : { "$date" : 1360419110351 }, "created" : { "$date" : 1360419110351 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116594a55d13202000000bc", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "They didn't want her to go home until they did. Then they wanted her to send them things.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "At first they were all against it, except my\nhusband would come for me, but afterwards they assented to it, and\nseemed much to rejoice in it; some asked me to send them some bread,\nothers some tobacco, others shaking me by the hand, offering me a hood\nand scarfe to ride in; not one moving hand or tongue against it.", "uuid" : "6D662D58", "_id" : { "$oid" : "5116594a55d13202000000bc" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[55]", "startOffset" : 91, "end" : "/div[1]/p[55]", "endOffset" : 407, "_id" : { "$oid" : "5116594a55d13202000000bd" } } ], "updated" : { "$date" : 1360419146397 }, "created" : { "$date" : 1360419146397 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5116597055d13202000000be" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360419184076 }, "id" : "5116597055d13202000000be", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "About\nthe sun going down, Mr. Hoar, and myself, and the two Indians came\nto Lancaster, and a solemn sight it was to me.", "ranges" : [ { "start" : "/div[1]/p[55]", "startOffset" : 1971, "end" : "/div[1]/p[55]", "endOffset" : 2090, "_id" : { "$oid" : "5116597055d13202000000bf" } } ], "tags" : [ "location" ], "text" : "She finally returns to Lancaster.", "updated" : { "$date" : 1360419205895 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "C6594511" } -{ "id" : "5116597f669ab202000000a5", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Lancaster was destroyed.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "now not one\nChristian to be seen, nor one house left standing.", "uuid" : "3DDA7CFE", "_id" : { "$oid" : "5116597f669ab202000000a5" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[55]", "startOffset" : 2172, "end" : "/div[1]/p[55]", "endOffset" : 2235, "_id" : { "$oid" : "5116597f669ab202000000a6" } } ], "updated" : { "$date" : 1360419199209 }, "created" : { "$date" : 1360419199209 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116599455d13202000000c0", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Concord", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "we came to Concord.", "uuid" : "4AB05C62", "_id" : { "$oid" : "5116599455d13202000000c0" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[55]", "startOffset" : 2501, "end" : "/div[1]/p[55]", "endOffset" : 2520, "_id" : { "$oid" : "5116599455d13202000000c1" } } ], "updated" : { "$date" : 1360419220283 }, "created" : { "$date" : 1360419220283 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511659af55d13202000000c2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Meets her brother and brother-in-law.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "There\nI met with my brother, and my brother-in-law, who asked me, if I knew\nwhere his wife was?", "uuid" : "CD6B17C8", "_id" : { "$oid" : "511659af55d13202000000c2" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[55]", "startOffset" : 2664, "end" : "/div[1]/p[55]", "endOffset" : 2759, "_id" : { "$oid" : "511659af55d13202000000c3" } } ], "updated" : { "$date" : 1360419247469 }, "created" : { "$date" : 1360419247469 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511659d1669ab202000000a7", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Her brother-in-law had buried his own wife without recognizing her (burnt).", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "She being shot down by the house was partly burnt, so that\nthose who were at Boston at the desolation of the town, and came back\nafterward, and buried the dead, did not know her.", "uuid" : "BE638EFC", "_id" : { "$oid" : "511659d1669ab202000000a7" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[55]", "startOffset" : 2816, "end" : "/div[1]/p[55]", "endOffset" : 2995, "_id" : { "$oid" : "511659d1669ab202000000a8" } } ], "updated" : { "$date" : 1360419281620 }, "created" : { "$date" : 1360419281620 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511659ec55d13202000000c4", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "She goes to Boston and meets her husband.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Being recruited\nwith food and raiment we went to Boston that day, where I met with my\ndear husband, but the thoughts of our dear children, one being dead, and\nthe other we could not tell where, abated our comfort each to other.", "uuid" : "49700CA9", "_id" : { "$oid" : "511659ec55d13202000000c4" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[55]", "startOffset" : 3215, "end" : "/div[1]/p[55]", "endOffset" : 3442, "_id" : { "$oid" : "511659ec55d13202000000c5" } } ], "updated" : { "$date" : 1360419308852 }, "created" : { "$date" : 1360419308852 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51165a04669ab202000000a9", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Her ransom was raised by charity.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "The twenty pounds, the price of my redemption,\nwas raised by some Boston gentlemen, and Mrs. Usher, whose bounty and\nreligious charity, I would not forget to make mention of.", "uuid" : "6C89D916", "_id" : { "$oid" : "51165a04669ab202000000a9" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[55]", "startOffset" : 3952, "end" : "/div[1]/p[55]", "endOffset" : 4126, "_id" : { "$oid" : "51165a04669ab202000000aa" } } ], "updated" : { "$date" : 1360419332718 }, "created" : { "$date" : 1360419332718 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51165a1c669ab202000000ab", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Her sister and a woman she knew were also ransomed/returned.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "they brought in my sister, and goodwife Kettle.", "uuid" : "0B986FEC", "_id" : { "$oid" : "51165a1c669ab202000000ab" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[55]", "startOffset" : 4625, "end" : "/div[1]/p[55]", "endOffset" : 4672, "_id" : { "$oid" : "51165a1c669ab202000000ac" } } ], "updated" : { "$date" : 1360419356686 }, "created" : { "$date" : 1360419356686 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "51165a4b669ab202000000ad" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360419403873 }, "id" : "51165a4b669ab202000000ad", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "And as we were\nriding along (God is the wise disposer of all things) between Ipswich\nand Rowley we met with Mr. William Hubbard, who told us that our son\nJoseph was come in to Major Waldron's, and another with him, which was\nmy sister's son.", "ranges" : [ { "start" : "/div[1]/p[55]", "startOffset" : 5599, "end" : "/div[1]/p[55]", "endOffset" : 5840, "_id" : { "$oid" : "51165a4b669ab202000000ae" } } ], "tags" : [ "location" ], "text" : "She gets news of her son and nephew (who are at Major Waldron's). Between Ipswich and Rowley. ", "updated" : { "$date" : 1360419420487 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "5CFAAD63" } -{ "id" : "51165a6d55d13202000000c6", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Newbury", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Newbury", "uuid" : "7D462FF4", "_id" : { "$oid" : "51165a6d55d13202000000c6" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[55]", "startOffset" : 5941, "end" : "/div[1]/p[55]", "endOffset" : 5948, "_id" : { "$oid" : "51165a6d55d13202000000c7" } } ], "updated" : { "$date" : 1360419437215 }, "created" : { "$date" : 1360419437215 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51165a75669ab202000000af", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Salisbury", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Salisbury", "uuid" : "19DDEC57", "_id" : { "$oid" : "51165a75669ab202000000af" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[55]", "startOffset" : 6114, "end" : "/div[1]/p[55]", "endOffset" : 6123, "_id" : { "$oid" : "51165a75669ab202000000b0" } } ], "updated" : { "$date" : 1360419445132 }, "created" : { "$date" : 1360419445132 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51165a8c669ab202000000b1", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "They hear her daughters is at Providence.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "his daughter was come in at\nProvidence.", "uuid" : "675C18A3", "_id" : { "$oid" : "51165a8c669ab202000000b1" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[55]", "startOffset" : 6271, "end" : "/div[1]/p[55]", "endOffset" : 6310, "_id" : { "$oid" : "51165a8c669ab202000000b2" } } ], "updated" : { "$date" : 1360419468452 }, "created" : { "$date" : 1360419468452 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51165ab3669ab202000000b3", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "They retrieve their son from Portsmouth for 7 pounds.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Our son being nearest, we\nwent to him first, to Portsmouth, where we met with him, and with the\nMajor also,", "uuid" : "5E698186", "_id" : { "$oid" : "51165ab3669ab202000000b3" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[55]", "startOffset" : 6970, "end" : "/div[1]/p[55]", "endOffset" : 7077, "_id" : { "$oid" : "51165ab3669ab202000000b4" } } ], "updated" : { "$date" : 1360419507365 }, "created" : { "$date" : 1360419507365 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51165ac655d13202000000c8", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "return to Newbury", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Newbury", "uuid" : "09174671", "_id" : { "$oid" : "51165ac655d13202000000c8" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[55]", "startOffset" : 7494, "end" : "/div[1]/p[55]", "endOffset" : 7501, "_id" : { "$oid" : "51165ac655d13202000000c9" } } ], "updated" : { "$date" : 1360419526257 }, "created" : { "$date" : 1360419526257 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51165ad4669ab202000000b5", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Charlestown", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Charlestown", "uuid" : "21A4F86D", "_id" : { "$oid" : "51165ad4669ab202000000b5" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[56]", "startOffset" : 22, "end" : "/div[1]/p[56]", "endOffset" : 33, "_id" : { "$oid" : "51165ad4669ab202000000b6" } } ], "updated" : { "$date" : 1360419540596 }, "created" : { "$date" : 1360419540596 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51165aed55d13202000000ca", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Rehoboth and Rhode Island", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Rehoboth than Rhode Island", "uuid" : "A27F9F78", "_id" : { "$oid" : "51165aed55d13202000000ca" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[56]", "startOffset" : 243, "end" : "/div[1]/p[56]", "endOffset" : 270, "_id" : { "$oid" : "51165aed55d13202000000cb" } } ], "updated" : { "$date" : 1360419565511 }, "created" : { "$date" : 1360419565511 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51165b0a669ab202000000b7", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "They retrieved her daughter at Dorchester.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "But the carts which\ncarried provision to the English army, being guarded, brought her with\nthem to Dorchester, where we received her safe.", "uuid" : "B5BA03C7", "_id" : { "$oid" : "51165b0a669ab202000000b7" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[56]", "startOffset" : 611, "end" : "/div[1]/p[56]", "endOffset" : 749, "_id" : { "$oid" : "51165b0a669ab202000000b8" } } ], "updated" : { "$date" : 1360419594055 }, "created" : { "$date" : 1360419594055 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51165b32669ab202000000b9", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "She traveled 3 days with an Indian woman to come to Providence", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Thus she\ntraveled three days together, not knowing whither she was going;", "uuid" : "406F8C98", "_id" : { "$oid" : "51165b32669ab202000000b9" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[56]", "startOffset" : 1182, "end" : "/div[1]/p[56]", "endOffset" : 1255, "_id" : { "$oid" : "51165b32669ab202000000ba" } } ], "updated" : { "$date" : 1360419634260 }, "created" : { "$date" : 1360419634260 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51165b5755d13202000000cc", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "The family moves to Boston", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "the South Church in Boston hired an house for us. Then we removed from\nMr. Shepard's, those cordial friends, and went to Boston, where we\ncontinued about three-quarters of a year.", "uuid" : "E7BC7387", "_id" : { "$oid" : "51165b5755d13202000000cc" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [ "location" ], "ranges" : [ { "start" : "/div[1]/p[57]", "startOffset" : 71, "end" : "/div[1]/p[57]", "endOffset" : 251, "_id" : { "$oid" : "51165b5755d13202000000cd" } } ], "updated" : { "$date" : 1360419671989 }, "created" : { "$date" : 1360419671989 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116a2ac55d13202000000ce", "user" : "alvarom@mit.edu", "username" : "Alvaro M.", "text" : "Graphic detail, carnage", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "split open\nhis bowels", "uuid" : "23C02849", "_id" : { "$oid" : "5116a2ac55d13202000000ce" }, "permissions" : { "delete" : [ "alvarom@mit.edu" ], "update" : [ "alvarom@mit.edu" ], "admin" : [ "alvarom@mit.edu" ], "read" : [ "alvarom@mit.edu" ] }, "tags" : [ "language" ], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 765, "end" : "/div[1]/p[2]", "endOffset" : 786, "_id" : { "$oid" : "5116a2ac55d13202000000cf" } } ], "updated" : { "$date" : 1360437932677 }, "created" : { "$date" : 1360437932677 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116a34a55d13202000000d0", "user" : "alvarom@mit.edu", "username" : "Alvaro M.", "text" : "\"pagan\". Descriptions of Indians have a religious backdrop.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "heathen", "uuid" : "32407706", "_id" : { "$oid" : "5116a34a55d13202000000d0" }, "permissions" : { "delete" : [ "alvarom@mit.edu" ], "update" : [ "alvarom@mit.edu" ], "admin" : [ "alvarom@mit.edu" ], "read" : [ "alvarom@mit.edu" ] }, "tags" : [ "language" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1124, "end" : "/div[1]/p[3]", "endOffset" : 1131, "_id" : { "$oid" : "5116a34a55d13202000000d1" } } ], "updated" : { "$date" : 1360438090662 }, "created" : { "$date" : 1360438090662 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116a3db669ab202000000bb", "user" : "alvarom@mit.edu", "username" : "Alvaro M.", "text" : "explicit reference to blood. Third or so mention in this passage", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "blood\nrunning down to our heels", "uuid" : "8AB5E253", "_id" : { "$oid" : "5116a3db669ab202000000bb" }, "permissions" : { "delete" : [ "alvarom@mit.edu" ], "update" : [ "alvarom@mit.edu" ], "admin" : [ "alvarom@mit.edu" ], "read" : [ "alvarom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 2649, "end" : "/div[1]/p[3]", "endOffset" : 2680, "_id" : { "$oid" : "5116a3db669ab202000000bc" } } ], "updated" : { "$date" : 1360438235598 }, "created" : { "$date" : 1360438235598 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5116a53c669ab202000000bd" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360438588927 }, "id" : "5116a53c669ab202000000bd", "permissions" : { "delete" : [ "alvarom@mit.edu" ], "update" : [ "alvarom@mit.edu" ], "admin" : [ "alvarom@mit.edu" ], "read" : [ "alvarom@mit.edu" ] }, "quote" : "I must turn my back upon the town", "ranges" : [ { "start" : "/div[1]/p[8]", "startOffset" : 28, "end" : "/div[1]/p[8]", "endOffset" : 61, "_id" : { "$oid" : "5116a53c669ab202000000be" } } ], "tags" : [ "language" ], "text" : "note how removes/chapters begin in the present tense, and position the reader in the middle of the scene. Verb tense occasionally changes in the middle of a passage", "updated" : { "$date" : 1360438770626 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "user" : "alvarom@mit.edu", "username" : "Alvaro M.", "uuid" : "F583C719" } -{ "id" : "5116a6c255d13202000000d2", "user" : "alvarom@mit.edu", "username" : "Alvaro M.", "text" : "repeated mention of \"knocking in the head\". Why?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "knock your child in the head", "uuid" : "FC3F7D1A", "_id" : { "$oid" : "5116a6c255d13202000000d2" }, "permissions" : { "delete" : [ "alvarom@mit.edu" ], "update" : [ "alvarom@mit.edu" ], "admin" : [ "alvarom@mit.edu" ], "read" : [ "alvarom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 2568, "end" : "/div[1]/p[10]", "endOffset" : 2596, "_id" : { "$oid" : "5116a6c255d13202000000d3" } } ], "updated" : { "$date" : 1360438978368 }, "created" : { "$date" : 1360438978368 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116c4a455d13202000000d4", "user" : "alvarom@mit.edu", "username" : "Alvaro M.", "text" : "opens the Bible at random", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "and that Scripture came to my hand", "uuid" : "5321449C", "_id" : { "$oid" : "5116c4a455d13202000000d4" }, "permissions" : { "delete" : [ "alvarom@mit.edu" ], "update" : [ "alvarom@mit.edu" ], "admin" : [ "alvarom@mit.edu" ], "read" : [ "alvarom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[22]", "startOffset" : 2280, "end" : "/div[1]/p[22]", "endOffset" : 2314, "_id" : { "$oid" : "5116c4a455d13202000000d5" } } ], "updated" : { "$date" : 1360446628877 }, "created" : { "$date" : 1360446628877 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5116cdd6669ab202000000bf", "user" : "alvarom@mit.edu", "username" : "Alvaro M.", "text" : "oddly matter-of-factly. The narrator has grown numb to death", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "there was one benefit in\nit—that there was more room", "uuid" : "211778B5", "_id" : { "$oid" : "5116cdd6669ab202000000bf" }, "permissions" : { "delete" : [ "alvarom@mit.edu" ], "update" : [ "alvarom@mit.edu" ], "admin" : [ "alvarom@mit.edu" ], "read" : [ "alvarom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[34]", "startOffset" : 113, "end" : "/div[1]/p[34]", "endOffset" : 165, "_id" : { "$oid" : "5116cdd6669ab202000000c0" } } ], "updated" : { "$date" : 1360448982210 }, "created" : { "$date" : 1360448982210 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5117f0f770da470200000002", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "doubting herself", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I began to think that all my\nhopes of restoration would come to nothing", "uuid" : "38A09862", "_id" : { "$oid" : "5117f0f770da470200000002" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[29]", "startOffset" : 2005, "end" : "/div[1]/p[29]", "endOffset" : 2076, "_id" : { "$oid" : "5117f0f770da470200000003" } } ], "updated" : { "$date" : 1360523511154 }, "created" : { "$date" : 1360523511154 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5117f343c3b3f40200000002", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "what does this mean", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I would tell the world what a blessing the Lord gave\nto such mean food", "uuid" : "AA20A431", "_id" : { "$oid" : "5117f343c3b3f40200000002" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[35]", "startOffset" : 586, "end" : "/div[1]/p[35]", "endOffset" : 656, "_id" : { "$oid" : "5117f343c3b3f40200000003" } } ], "updated" : { "$date" : 1360524099055 }, "created" : { "$date" : 1360524099055 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5117f3b370da470200000004", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "food/ provisions", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "victuals", "uuid" : "D7B5713A", "_id" : { "$oid" : "5117f3b370da470200000004" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[36]", "startOffset" : 426, "end" : "/div[1]/p[36]", "endOffset" : 434, "_id" : { "$oid" : "5117f3b370da470200000005" } } ], "updated" : { "$date" : 1360524211589 }, "created" : { "$date" : 1360524211589 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5117f3db70da470200000006", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "justifying not being satisfied after her meal", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Thou shalt eat and not\nbe satisfied", "uuid" : "3F339228", "_id" : { "$oid" : "5117f3db70da470200000006" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "faith" ], "ranges" : [ { "start" : "/div[1]/p[36]", "startOffset" : 1044, "end" : "/div[1]/p[36]", "endOffset" : 1079, "_id" : { "$oid" : "5117f3db70da470200000007" } } ], "updated" : { "$date" : 1360524251050 }, "created" : { "$date" : 1360524251050 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5117f47f70da470200000008", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "When thou\npassest through the waters, I will be with thee; and through the rivers,\nthey shall not overflow thee", "uuid" : "300DD1E6", "_id" : { "$oid" : "5117f47f70da470200000008" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "faith" ], "ranges" : [ { "start" : "/div[1]/p[37]", "startOffset" : 481, "end" : "/div[1]/p[37]", "endOffset" : 592, "_id" : { "$oid" : "5117f47f70da470200000009" } } ], "updated" : { "$date" : 1360524415164 }, "created" : { "$date" : 1360524415164 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5117f4b6c3b3f40200000004", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "false hope", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "My heart\nskipped within me, thinking they had been Englishmen", "uuid" : "4DBF235F", "_id" : { "$oid" : "5117f4b6c3b3f40200000004" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[37]", "startOffset" : 1397, "end" : "/div[1]/p[37]", "endOffset" : 1458, "_id" : { "$oid" : "5117f4b6c3b3f40200000005" } } ], "updated" : { "$date" : 1360524470221 }, "created" : { "$date" : 1360524470221 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5117fb3dc3b3f40200000006", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "what does this mean?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "samp", "uuid" : "30486505", "_id" : { "$oid" : "5117fb3dc3b3f40200000006" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[38]", "startOffset" : 1100, "end" : "/div[1]/p[38]", "endOffset" : 1104, "_id" : { "$oid" : "5117fb3dc3b3f40200000007" } } ], "updated" : { "$date" : 1360526141108 }, "created" : { "$date" : 1360526141108 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5117feb6c3b3f40200000008", "user" : "jamiefolsom@gmail.com", "username" : "Jamie F.", "text" : "Test", "uri" : "http://localhost:3000/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "eBook is for the use of anyone anywhere at no cost and with\nalmost no restrictions", "uuid" : "27E9588E", "_id" : { "$oid" : "5117feb6c3b3f40200000008" }, "permissions" : { "delete" : [ "jamiefolsom@gmail.com" ], "update" : [ "jamiefolsom@gmail.com" ], "admin" : [ "jamiefolsom@gmail.com" ], "read" : [ "jamiefolsom@gmail.com" ] }, "tags" : [ "jf", "notadmin" ], "ranges" : [ { "start" : "/div[1]/pre[1]", "startOffset" : 78, "end" : "/div[1]/pre[1]", "endOffset" : 160, "_id" : { "$oid" : "5117feb6c3b3f40200000009" } } ], "updated" : { "$date" : 1360527030754 }, "created" : { "$date" : 1360527030754 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5117fedc70da47020000000a", "user" : "jfolsom@mit.edu", "username" : "Jamie F.", "text" : "", "uri" : "http://localhost:3000/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "online at www.gutenberg.org", "uuid" : "A8A4371C", "_id" : { "$oid" : "5117fedc70da47020000000a" }, "permissions" : { "delete" : [ "jfolsom@mit.edu" ], "update" : [ "jfolsom@mit.edu" ], "admin" : [ "jfolsom@mit.edu" ], "read" : [ "jfolsom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/pre[1]", "startOffset" : 294, "end" : "/div[1]/pre[1]", "endOffset" : 321, "_id" : { "$oid" : "5117fedc70da47020000000b" } } ], "updated" : { "$date" : 1360527068759 }, "created" : { "$date" : 1360527068759 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118030c70da47020000000c", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "hope ", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Yes, and quickly you shall come to your master again; who had been gone\nfrom us three weeks", "uuid" : "9F25D357", "_id" : { "$oid" : "5118030c70da47020000000c" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[40]", "startOffset" : 782, "end" : "/div[1]/p[40]", "endOffset" : 873, "_id" : { "$oid" : "5118030c70da47020000000d" } } ], "updated" : { "$date" : 1360528140837 }, "created" : { "$date" : 1360528140837 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118039c70da47020000000e", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "more hope", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "being by it raised in\nmy hopes, that in God's due time there would be an end of this sorrowful\nhour", "uuid" : "7F599BAB", "_id" : { "$oid" : "5118039c70da47020000000e" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[41]", "startOffset" : 1312, "end" : "/div[1]/p[41]", "endOffset" : 1411, "_id" : { "$oid" : "5118039c70da47020000000f" } } ], "updated" : { "$date" : 1360528284847 }, "created" : { "$date" : 1360528284847 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51180477c3b3f4020000000a", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "describing horrible Indian actions", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "so wicked and cruel,\nas to wear a string about his neck,", "uuid" : "8FFE0CB6", "_id" : { "$oid" : "51180477c3b3f4020000000a" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 2878, "end" : "/div[1]/p[42]", "endOffset" : 2934, "_id" : { "$oid" : "51180477c3b3f4020000000b" } } ], "updated" : { "$date" : 1360528503038 }, "created" : { "$date" : 1360528503038 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511804e4c3b3f4020000000c", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "intense, passionate, violent", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "vehemency", "uuid" : "6CD3F225", "_id" : { "$oid" : "511804e4c3b3f4020000000c" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 4397, "end" : "/div[1]/p[42]", "endOffset" : 4406, "_id" : { "$oid" : "511804e4c3b3f4020000000d" } } ], "updated" : { "$date" : 1360528612917 }, "created" : { "$date" : 1360528612917 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511805b4c3b3f4020000000e", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "hope diminishing ", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "the\ngovernor would be so angry for his loss at Sudbury, that he would send\nno more about the captives", "uuid" : "ADA9C3E9", "_id" : { "$oid" : "511805b4c3b3f4020000000e" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[43]", "startOffset" : 344, "end" : "/div[1]/p[43]", "endOffset" : 445, "_id" : { "$oid" : "511805b4c3b3f4020000000f" } } ], "updated" : { "$date" : 1360528820432 }, "created" : { "$date" : 1360528820432 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118060d70da470200000010", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "wouldn't let her go see her daughter, who was only a mile away", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "They made use of their tyrannical power whilst they\nhad it; but through the Lord's wonderful mercy, their time was now but\nshort", "uuid" : "211470EA", "_id" : { "$oid" : "5118060d70da470200000010" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[43]", "startOffset" : 1795, "end" : "/div[1]/p[43]", "endOffset" : 1923, "_id" : { "$oid" : "5118060d70da470200000011" } } ], "updated" : { "$date" : 1360528909371 }, "created" : { "$date" : 1360528909371 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118077370da470200000012", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "God many times leaving us most in the dark, when\ndeliverance is nearest", "uuid" : "B59BBADC", "_id" : { "$oid" : "5118077370da470200000012" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "faith" ], "ranges" : [ { "start" : "/div[1]/p[44]", "startOffset" : 5659, "end" : "/div[1]/p[44]", "endOffset" : 5730, "_id" : { "$oid" : "5118077370da470200000013" } } ], "updated" : { "$date" : 1360529267302 }, "created" : { "$date" : 1360529267302 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118082670da470200000014", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "God had an over-ruling hand in all those things", "uuid" : "6AEA0A81", "_id" : { "$oid" : "5118082670da470200000014" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "faith" ], "ranges" : [ { "start" : "/div[1]/p[49]", "startOffset" : 480, "end" : "/div[1]/p[49]", "endOffset" : 527, "_id" : { "$oid" : "5118082670da470200000015" } } ], "updated" : { "$date" : 1360529446314 }, "created" : { "$date" : 1360529446314 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118084f70da470200000016", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "food they ate", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "The chief and commonest food was ground nuts. They eat also nuts and\nacorns, artichokes, lilly roots, ground beans, and several other weeds\nand roots, that I know not.", "uuid" : "8A8B3389", "_id" : { "$oid" : "5118084f70da470200000016" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[52]", "startOffset" : 1, "end" : "/div[1]/p[52]", "endOffset" : 168, "_id" : { "$oid" : "5118084f70da470200000017" } } ], "updated" : { "$date" : 1360529487458 }, "created" : { "$date" : 1360529487458 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51180882c3b3f40200000010", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "total time she was taken", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "eleven weeks and five\ndays", "uuid" : "F1A8B3E2", "_id" : { "$oid" : "51180882c3b3f40200000010" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[54]", "startOffset" : 186, "end" : "/div[1]/p[54]", "endOffset" : 212, "_id" : { "$oid" : "51180882c3b3f40200000011" } } ], "updated" : { "$date" : 1360529538154 }, "created" : { "$date" : 1360529538154 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511808ad70da470200000018", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "Indians would boast about their accomplishments", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "boast\nhow many towns they had destroyed,", "uuid" : "627BD2C7", "_id" : { "$oid" : "511808ad70da470200000018" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[54]", "startOffset" : 629, "end" : "/div[1]/p[54]", "endOffset" : 669, "_id" : { "$oid" : "511808ad70da470200000019" } } ], "updated" : { "$date" : 1360529581526 }, "created" : { "$date" : 1360529581526 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511809cb70da47020000001a", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "family back together", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Our family being now gathered together", "uuid" : "D2CA51B7", "_id" : { "$oid" : "511809cb70da47020000001a" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[57]", "startOffset" : 1, "end" : "/div[1]/p[57]", "endOffset" : 39, "_id" : { "$oid" : "511809cb70da47020000001b" } } ], "updated" : { "$date" : 1360529867276 }, "created" : { "$date" : 1360529867276 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51180a1bc3b3f40200000012", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "appreciating what she has now", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "It is then hard work to persuade myself, that ever I should be satisfied\nwith bread again. But now we are fed with the finest of the wheat", "uuid" : "F2FC77A9", "_id" : { "$oid" : "51180a1bc3b3f40200000012" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[58]", "startOffset" : 568, "end" : "/div[1]/p[58]", "endOffset" : 707, "_id" : { "$oid" : "51180a1bc3b3f40200000013" } } ], "updated" : { "$date" : 1360529947775 }, "created" : { "$date" : 1360529947775 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51180a3570da47020000001c", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "friends came to help them", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "house\nfurnished with love.", "uuid" : "1C881A36", "_id" : { "$oid" : "51180a3570da47020000001c" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[57]", "startOffset" : 621, "end" : "/div[1]/p[57]", "endOffset" : 647, "_id" : { "$oid" : "51180a3570da47020000001d" } } ], "updated" : { "$date" : 1360529973894 }, "created" : { "$date" : 1360529973894 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51180a5f70da47020000001e", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "something that causes pain or suffering", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "affliction", "uuid" : "F51328DA", "_id" : { "$oid" : "51180a5f70da47020000001e" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[60]", "startOffset" : 20, "end" : "/div[1]/p[60]", "endOffset" : 30, "_id" : { "$oid" : "51180a5f70da47020000001f" } } ], "updated" : { "$date" : 1360530015930 }, "created" : { "$date" : 1360530015930 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51180ab3c3b3f40200000014", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "interesting comment", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "That they are the vanity of vanities, and vexation of spirit, that they\nare but a shadow, a blast, a bubble, and things of no continuance.", "uuid" : "CE9556DA", "_id" : { "$oid" : "51180ab3c3b3f40200000014" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[60]", "startOffset" : 1338, "end" : "/div[1]/p[60]", "endOffset" : 1476, "_id" : { "$oid" : "51180ab3c3b3f40200000015" } } ], "updated" : { "$date" : 1360530099439 }, "created" : { "$date" : 1360530099439 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51180ac6c3b3f40200000016", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "more appreciation", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I have learned to\nlook beyond present and smaller troubles, and to be quieted under them", "uuid" : "9B3576C6", "_id" : { "$oid" : "51180ac6c3b3f40200000016" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[60]", "startOffset" : 1816, "end" : "/div[1]/p[60]", "endOffset" : 1905, "_id" : { "$oid" : "51180ac6c3b3f40200000017" } } ], "updated" : { "$date" : 1360530118569 }, "created" : { "$date" : 1360530118569 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51188f1c5a85590200000002", "user" : "alvarom@mit.edu", "username" : "Alvaro M.", "text" : "338 years ago today", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "tenth of February 1675", "uuid" : "00DEE0AC", "_id" : { "$oid" : "51188f1c5a85590200000002" }, "permissions" : { "delete" : [ "alvarom@mit.edu" ], "update" : [ "alvarom@mit.edu" ], "admin" : [ "alvarom@mit.edu" ], "read" : [ "alvarom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 7, "end" : "/div[1]/p[2]", "endOffset" : 30, "_id" : { "$oid" : "51188f1c5a85590200000003" } } ], "updated" : { "$date" : 1360563996705 }, "created" : { "$date" : 1360563996705 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51188f436b36830200000002", "user" : "alvarom@mit.edu", "username" : "Alvaro M.", "text" : "'Removal' instead of 'Remove'. Typo?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "REMOVAL", "uuid" : "2077ACF2", "_id" : { "$oid" : "51188f436b36830200000002" }, "permissions" : { "delete" : [ "alvarom@mit.edu" ], "update" : [ "alvarom@mit.edu" ], "admin" : [ "alvarom@mit.edu" ], "read" : [ "alvarom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/h2[16]", "startOffset" : 19, "end" : "/div[1]/h2[16]", "endOffset" : 26, "_id" : { "$oid" : "51188f446b36830200000003" } } ], "updated" : { "$date" : 1360564035998 }, "created" : { "$date" : 1360564035998 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118dbff5a85590200000004", "user" : "nicolas.sauret@iri.centrepompidou.fr", "username" : "Nicolas S.", "text" : "old english", "uri" : "http://app.annotationstudio.org/documents/frankenstein", "quote" : "commenced", "uuid" : "1E88262E", "_id" : { "$oid" : "5118dbff5a85590200000004" }, "permissions" : { "delete" : [ "nicolas.sauret@iri.centrepompidou.fr" ], "update" : [ "nicolas.sauret@iri.centrepompidou.fr" ], "admin" : [ "nicolas.sauret@iri.centrepompidou.fr" ], "read" : [ "nicolas.sauret@iri.centrepompidou.fr" ] }, "tags" : [ "langage", "litterature" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 86, "end" : "/div[1]/p[3]", "endOffset" : 96, "_id" : { "$oid" : "5118dbff5a85590200000005" } } ], "updated" : { "$date" : 1360583726308 }, "created" : { "$date" : 1360583679535 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118e2d36b36830200000004", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "A young North American Indian child", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "papoose", "uuid" : "F086D625", "_id" : { "$oid" : "5118e2d36b36830200000004" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [ "definition" ], "ranges" : [ { "start" : "/div[1]/p[27]", "startOffset" : 257, "end" : "/div[1]/p[27]", "endOffset" : 264, "_id" : { "$oid" : "5118e2d36b36830200000005" } } ], "updated" : { "$date" : 1360585427191 }, "created" : { "$date" : 1360585427191 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118e3206b36830200000006", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "A married male Native American", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "sannup", "uuid" : "26382E90", "_id" : { "$oid" : "5118e3206b36830200000006" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [ "definition" ], "ranges" : [ { "start" : "/div[1]/p[28]", "startOffset" : 394, "end" : "/div[1]/p[28]", "endOffset" : 400, "_id" : { "$oid" : "5118e3206b36830200000007" } } ], "updated" : { "$date" : 1360585504176 }, "created" : { "$date" : 1360585504176 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118e43e5a85590200000006", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "they want her alive?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I told them the skin was off my back, but I had no other\ncomforting answer from them than this: that it would be no matter if my\nhead were off too.", "uuid" : "F9F3E0B4", "_id" : { "$oid" : "5118e43e5a85590200000006" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[28]", "startOffset" : 2826, "end" : "/div[1]/p[28]", "endOffset" : 2973, "_id" : { "$oid" : "5118e43e5a85590200000007" } } ], "updated" : { "$date" : 1360585790311 }, "created" : { "$date" : 1360585790311 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118e4e85a85590200000008", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "abuse", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "A squaw moved it down again, at which I\nlooked up, and she threw a handful of ashes in mine eyes.", "uuid" : "E7565680", "_id" : { "$oid" : "5118e4e85a85590200000008" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[29]", "startOffset" : 1014, "end" : "/div[1]/p[29]", "endOffset" : 1112, "_id" : { "$oid" : "5118e4e85a85590200000009" } } ], "updated" : { "$date" : 1360585960167 }, "created" : { "$date" : 1360585960167 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118e52e5a8559020000000a", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "feelings of hopelessness and desperation", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "About this time I began to think that all my\nhopes of restoration would come to nothing. I thought of the English\narmy, and hoped for their coming, and being taken by them, but that\nfailed. I hoped to be carried to Albany, as the Indians had discoursed\nbefore, but that failed also.", "uuid" : "D17E35AA", "_id" : { "$oid" : "5118e52e5a8559020000000a" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[29]", "startOffset" : 1989, "end" : "/div[1]/p[29]", "endOffset" : 2271, "_id" : { "$oid" : "5118e52e5a8559020000000b" } } ], "updated" : { "$date" : 1360586030822 }, "created" : { "$date" : 1360586030822 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118e5e16b36830200000008", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "conflict. example of Mary Rowlandson retaliating against her captors. ", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I told her I would not. Then my mistress bade me give it,\nbut still I said no. The maid told me if I would not give her a piece,\nshe would tear a piece off it. I told her I would tear her coat then.\nWith that my mistress rises up, and take up a stick big enough to have\nkilled me, and struck at me with it.", "uuid" : "F8C5C619", "_id" : { "$oid" : "5118e5e16b36830200000008" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[30]", "startOffset" : 162, "end" : "/div[1]/p[30]", "endOffset" : 468, "_id" : { "$oid" : "5118e5e16b36830200000009" } } ], "updated" : { "$date" : 1360586209931 }, "created" : { "$date" : 1360586209931 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118e8616b3683020000000a", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "justified stealing meat from a child", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Thus the Lord made that pleasant refreshing, which another time would\nhave been an abomination.", "uuid" : "90DB884C", "_id" : { "$oid" : "5118e8616b3683020000000a" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[39]", "startOffset" : 1206, "end" : "/div[1]/p[39]", "endOffset" : 1302, "_id" : { "$oid" : "5118e8616b3683020000000b" } } ], "updated" : { "$date" : 1360586849560 }, "created" : { "$date" : 1360586849560 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118e8785a8559020000000c", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "she would rather die quickly than slowly", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I told them, they had as good\nknock me in head as starve me to death.", "uuid" : "9D59EF49", "_id" : { "$oid" : "5118e8785a8559020000000c" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[39]", "startOffset" : 1456, "end" : "/div[1]/p[39]", "endOffset" : 1525, "_id" : { "$oid" : "5118e8785a8559020000000d" } } ], "updated" : { "$date" : 1360586872622 }, "created" : { "$date" : 1360586872622 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118e8f86b3683020000000c", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "An American Indian wife or woman", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "squaw", "uuid" : "E31D7187", "_id" : { "$oid" : "5118e8f86b3683020000000c" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [ "definition" ], "ranges" : [ { "start" : "/div[1]/p[40]", "startOffset" : 1131, "end" : "/div[1]/p[40]", "endOffset" : 1136, "_id" : { "$oid" : "5118e8f86b3683020000000d" } } ], "updated" : { "$date" : 1360587000545 }, "created" : { "$date" : 1360587000545 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118e9306b3683020000000e", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "food or provisions", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "victuals", "uuid" : "7020EEDB", "_id" : { "$oid" : "5118e9306b3683020000000e" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [ "definition" ], "ranges" : [ { "start" : "/div[1]/p[41]", "startOffset" : 847, "end" : "/div[1]/p[41]", "endOffset" : 855, "_id" : { "$oid" : "5118e9306b3683020000000f" } } ], "updated" : { "$date" : 1360587056594 }, "created" : { "$date" : 1360587056594 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118e9e05a8559020000000e", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "\"Praying Indians\" were punished ", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Praying Indian", "uuid" : "D93FABE4", "_id" : { "$oid" : "5118e9e05a8559020000000e" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 1870, "end" : "/div[1]/p[42]", "endOffset" : 1884, "_id" : { "$oid" : "5118e9e05a8559020000000f" } } ], "updated" : { "$date" : 1360587232616 }, "created" : { "$date" : 1360587232616 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118ec575a85590200000010", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "time elapsed", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "nine or ten weeks", "uuid" : "21299A9B", "_id" : { "$oid" : "5118ec575a85590200000010" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[43]", "startOffset" : 1529, "end" : "/div[1]/p[43]", "endOffset" : 1546, "_id" : { "$oid" : "5118ec575a85590200000011" } } ], "updated" : { "$date" : 1360587863433 }, "created" : { "$date" : 1360587863433 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118edd85a85590200000012", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "demonstration of resiliency in nature", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "that I did not see\n(all the time I was among them) one man, woman, or child, die with\nhunger", "uuid" : "3066606E", "_id" : { "$oid" : "5118edd85a85590200000012" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[50]", "startOffset" : 402, "end" : "/div[1]/p[50]", "endOffset" : 494, "_id" : { "$oid" : "5118edd85a85590200000013" } } ], "updated" : { "$date" : 1360588248813 }, "created" : { "$date" : 1360588248813 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118ef886b36830200000010", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "her tastes have changed", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "It is then hard work to persuade myself, that ever I should be satisfied\nwith bread again.", "uuid" : "59D4CDE4", "_id" : { "$oid" : "5118ef886b36830200000010" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[58]", "startOffset" : 569, "end" : "/div[1]/p[58]", "endOffset" : 659, "_id" : { "$oid" : "5118ef886b36830200000011" } } ], "updated" : { "$date" : 1360588680900 }, "created" : { "$date" : 1360588680900 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118efa65a85590200000014", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "she observes how quickly life can change without warning", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I have seen the extreme vanity of this world: One hour I have been in\nhealth, and wealthy, wanting nothing. But the next hour in sickness and\nwounds, and death, having nothing but sorrow and affliction.", "uuid" : "8F6B7C8A", "_id" : { "$oid" : "5118efa65a85590200000014" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[59]", "startOffset" : 1, "end" : "/div[1]/p[59]", "endOffset" : 203, "_id" : { "$oid" : "5118efa65a85590200000015" } } ], "updated" : { "$date" : 1360588710629 }, "created" : { "$date" : 1360588710629 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118effa6b36830200000012", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "she wished for affliction when she recognized that she was living in great prosperity", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "When I lived in prosperity, having the comforts of the world about\nme, my relations by me, my heart cheerful, and taking little care for\nanything, and yet seeing many, whom I preferred before myself, under\nmany trials and afflictions, in sickness, weakness, poverty, losses,\ncrosses, and cares of the world, I should be sometimes jealous least I\nshould have my portion in this life, and that Scripture would come to my\nmind", "uuid" : "62593499", "_id" : { "$oid" : "5118effa6b36830200000012" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[60]", "startOffset" : 76, "end" : "/div[1]/p[60]", "endOffset" : 499, "_id" : { "$oid" : "5118effa6b36830200000013" } } ], "updated" : { "$date" : 1360588794825 }, "created" : { "$date" : 1360588794825 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118f0846b36830200000014", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "King Philips War (1675-78)", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "tenth of February 1675, came the Indians with great numbers upon\nLancaster", "uuid" : "5B442594", "_id" : { "$oid" : "5118f0846b36830200000014" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 8, "end" : "/div[1]/p[2]", "endOffset" : 82, "_id" : { "$oid" : "5118f0846b36830200000015" } } ], "updated" : { "$date" : 1360588932696 }, "created" : { "$date" : 1360588932696 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118f0e25a85590200000016", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "she would not be killed, she would be held captive", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "But to return: the Indians laid hold of us, pulling me one\nway, and the children another, and said, \"Come go along with us\"; I told\nthem they would kill me: they answered, if I were willing to go along\nwith them, they would not hurt me.", "uuid" : "BD71205B", "_id" : { "$oid" : "5118f0e25a85590200000016" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 3508, "end" : "/div[1]/p[3]", "endOffset" : 3744, "_id" : { "$oid" : "5118f0e25a85590200000017" } } ], "updated" : { "$date" : 1360589026475 }, "created" : { "$date" : 1360589026475 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5118f11b5a85590200000018", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "change of perspective. she had thought about being captured by Native Americans before?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I had often before this said that if the Indians should come, I should\nchoose rather to be killed by them than taken alive, but when it came\nto the trial my mind changed", "uuid" : "0A0537C2", "_id" : { "$oid" : "5118f11b5a85590200000018" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 1, "end" : "/div[1]/p[5]", "endOffset" : 170, "_id" : { "$oid" : "5118f11b5a85590200000019" } } ], "updated" : { "$date" : 1360589083697 }, "created" : { "$date" : 1360589083697 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511b1ddc57641d0200000002", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "interesting biblical reference", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "See now that I, even I am he, and there is no\ngod with me, I kill and I make alive, I wound and I heal, neither is\nthere any can deliver out of my hand.", "uuid" : "7469FE72", "_id" : { "$oid" : "511b1ddc57641d0200000002" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 514, "end" : "/div[1]/p[1]", "endOffset" : 666, "_id" : { "$oid" : "511b1ddc57641d0200000003" } } ], "updated" : { "$date" : 1360731612712 }, "created" : { "$date" : 1360731612712 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511b1df7d2fd810200000002", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "dead", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "knocked on the head", "uuid" : "9936C4E4", "_id" : { "$oid" : "511b1df7d2fd810200000002" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 332, "end" : "/div[1]/p[2]", "endOffset" : 351, "_id" : { "$oid" : "511b1df7d2fd810200000003" } } ], "updated" : { "$date" : 1360731639599 }, "created" : { "$date" : 1360731639599 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511b1e2557641d0200000004", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "graphic", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "split open\nhis bowels", "uuid" : "F8B83F4B", "_id" : { "$oid" : "511b1e2557641d0200000004" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 765, "end" : "/div[1]/p[2]", "endOffset" : 786, "_id" : { "$oid" : "511b1e2557641d0200000005" } } ], "updated" : { "$date" : 1360731685103 }, "created" : { "$date" : 1360731685103 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511b1e4557641d0200000006", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "saddest", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "dolefulest", "uuid" : "617014BD", "_id" : { "$oid" : "511b1e4557641d0200000006" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 69, "end" : "/div[1]/p[3]", "endOffset" : 79, "_id" : { "$oid" : "511b1e4557641d0200000007" } } ], "updated" : { "$date" : 1360731717511 }, "created" : { "$date" : 1360731717511 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511b1e88d2fd810200000006", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "what is the dreadful hour?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "Now is the dreadful hour come", "uuid" : "58096EBA", "_id" : { "$oid" : "511b1e88d2fd810200000006" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 861, "end" : "/div[1]/p[3]", "endOffset" : 890, "_id" : { "$oid" : "511b1e88d2fd810200000007" } } ], "updated" : { "$date" : 1360731784975 }, "created" : { "$date" : 1360731784975 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511b1efad2fd810200000008", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "very puritan, as we discussed on Monday", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I\nhope she is reaping the fruit of her good labors, being faithful to the\nservice of God in her place", "uuid" : "22904139", "_id" : { "$oid" : "511b1efad2fd810200000008" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 3078, "end" : "/div[1]/p[3]", "endOffset" : 3179, "_id" : { "$oid" : "511b1efad2fd810200000009" } } ], "updated" : { "$date" : 1360731898422 }, "created" : { "$date" : 1360731898422 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511b1f2457641d0200000008", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "What?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "More than twenty\nyears after, I have heard her tell how sweet and comfortable that place\nwas to her.", "uuid" : "5BA1B571", "_id" : { "$oid" : "511b1f2457641d0200000008" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 3407, "end" : "/div[1]/p[3]", "endOffset" : 3507, "_id" : { "$oid" : "511b1f2457641d0200000009" } } ], "updated" : { "$date" : 1360731940261 }, "created" : { "$date" : 1360731940261 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511b1fed57641d020000000a", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "Are they asking if she intends to still love an English man? In other words, the only way for her to sleep in a tipi is to sleep with an Indian ", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "What,\nwill you love English men still", "uuid" : "02FDF42D", "_id" : { "$oid" : "511b1fed57641d020000000a" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 416, "end" : "/div[1]/p[6]", "endOffset" : 453, "_id" : { "$oid" : "511b1fed57641d020000000b" } } ], "updated" : { "$date" : 1360732141735 }, "created" : { "$date" : 1360732141735 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511b2041d2fd81020000000a", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "where", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "whither", "uuid" : "E1840E21", "_id" : { "$oid" : "511b2041d2fd81020000000a" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[8]", "startOffset" : 134, "end" : "/div[1]/p[8]", "endOffset" : 141, "_id" : { "$oid" : "511b2041d2fd81020000000b" } } ], "updated" : { "$date" : 1360732225220 }, "created" : { "$date" : 1360732225220 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511b20d7d2fd81020000000c", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "she thinks that this suffering is designed for her and her alone, she appreciates the solitude and sees it as a chance to become closer to her religion since it is a significant affliction", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "yet\nso it must be, that I must sit all this cold winter night upon the cold\nsnowy ground, with my sick child in my arms, looking that every hour\nwould be the last of its life; and having no Christian friend near me,\neither to comfort or help me", "uuid" : "52C35C7E", "_id" : { "$oid" : "511b20d7d2fd81020000000c" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[9]", "startOffset" : 352, "end" : "/div[1]/p[9]", "endOffset" : 596, "_id" : { "$oid" : "511b20d7d2fd81020000000d" } } ], "updated" : { "$date" : 1360732375788 }, "created" : { "$date" : 1360732375788 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511b21efd2fd81020000000e", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "is there any comfort gained from having her child \"quickly\" knocked in the head? Is this their attempts to make things a little (very little) easier/", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "\"your master\nwill knock your child in the head,\" and then a second, and then a third,\n\"your master will quickly knock your child in the head.\"", "uuid" : "6E657158", "_id" : { "$oid" : "511b21efd2fd81020000000e" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 2456, "end" : "/div[1]/p[10]", "endOffset" : 2598, "_id" : { "$oid" : "511b21efd2fd81020000000f" } } ], "updated" : { "$date" : 1360732655706 }, "created" : { "$date" : 1360732655706 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511b21f9d2fd810200000010", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "yes", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "This was the comfort I had from them", "uuid" : "CA740C7E", "_id" : { "$oid" : "511b21f9d2fd810200000010" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 1, "end" : "/div[1]/p[11]", "endOffset" : 37, "_id" : { "$oid" : "511b21f9d2fd810200000011" } } ], "updated" : { "$date" : 1360732665122 }, "created" : { "$date" : 1360732665122 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "511b234fd2fd810200000012" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360733007368 }, "id" : "511b234fd2fd810200000012", "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "quote" : "I have thought since of the wonderful goodness of\nGod to me in preserving me in the use of my reason and senses in that\ndistressed time, that I did not use wicked and violent means to end my\nown miserable life", "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 934, "end" : "/div[1]/p[11]", "endOffset" : 1143, "_id" : { "$oid" : "511b234fd2fd810200000013" } } ], "tags" : [], "text" : "thanking God for the strength not to commit suicide; it's interesting that she refers to her emotions as opposed to actually expressing them", "updated" : { "$date" : 1360733019649 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "user" : "ersafai@mit.edu", "username" : "Eric S.", "uuid" : "D9A0B923" } -{ "id" : "511b246b57641d020000000c", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "2nd daughter, still alive", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I went to see my daughter Mary", "uuid" : "E3993F13", "_id" : { "$oid" : "511b246b57641d020000000c" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 2155, "end" : "/div[1]/p[11]", "endOffset" : 2185, "_id" : { "$oid" : "511b246b57641d020000000d" } } ], "updated" : { "$date" : 1360733291712 }, "created" : { "$date" : 1360733291712 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "511b24c057641d020000000e" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360733376041 }, "id" : "511b24c057641d020000000e", "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "quote" : "my son came\nto me", "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 3434, "end" : "/div[1]/p[11]", "endOffset" : 3451, "_id" : { "$oid" : "511b24c057641d020000000f" } } ], "tags" : [], "text" : "she has a son", "updated" : { "$date" : 1360733382845 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "user" : "ersafai@mit.edu", "username" : "Eric S.", "uuid" : "21AFB27D" } -{ "id" : "511b253357641d0200000010", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "Where were all the quotes coming from before?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "So I took the Bible", "uuid" : "C8554450", "_id" : { "$oid" : "511b253357641d0200000010" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 5642, "end" : "/div[1]/p[11]", "endOffset" : 5661, "_id" : { "$oid" : "511b253357641d0200000011" } } ], "updated" : { "$date" : 1360733491664 }, "created" : { "$date" : 1360733491664 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511ba6b357641d0200000012", "user" : "jamiefolsom@gmail.com", "username" : "Jamie F.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "heart-blood upon the\nground", "uuid" : "FB4CE9C4", "_id" : { "$oid" : "511ba6b357641d0200000012" }, "permissions" : { "delete" : [ "jamiefolsom@gmail.com" ], "update" : [ "jamiefolsom@gmail.com" ], "admin" : [ "jamiefolsom@gmail.com" ], "read" : [ "jamiefolsom@gmail.com" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 600, "end" : "/div[1]/p[4]", "endOffset" : 627, "_id" : { "$oid" : "511ba6b357641d0200000013" } } ], "updated" : { "$date" : 1360766643688 }, "created" : { "$date" : 1360766643688 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "511ba755d2fd810200000014" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360766805726 }, "id" : "511ba755d2fd810200000014", "permissions" : { "delete" : [ "jamiefolsom@gmail.com" ], "update" : [ "jamiefolsom@gmail.com" ], "admin" : [ "jamiefolsom@gmail.com" ], "read" : [ "jamiefolsom@gmail.com" ] }, "quote" : "there, like a company of sheep torn by wolves, all of them stripped\nnaked by a company of hell", "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 832, "end" : "/div[1]/p[4]", "endOffset" : 926, "_id" : { "$oid" : "511ba755d2fd810200000015" } } ], "tags" : [ "group-one", "location" ], "text" : "My comment on locations", "updated" : { "$date" : 1360767819828 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "user" : "jamiefolsom@gmail.com", "username" : "Jamie F.", "uuid" : "AFE9F56B" } -{ "id" : "511ba8bed2fd810200000016", "user" : "jamiefolsom@gmail.com", "username" : "Jamie F.", "text" : "[Joseph Rowlandson](http://www.library.unh.edu/special/index.php/rowlandson-joseph)", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "husband", "uuid" : "A02BAAD9", "_id" : { "$oid" : "511ba8bed2fd810200000016" }, "permissions" : { "delete" : [ "jamiefolsom@gmail.com" ], "update" : [ "jamiefolsom@gmail.com" ], "admin" : [ "jamiefolsom@gmail.com" ], "read" : [ "jamiefolsom@gmail.com" ] }, "tags" : [ "relation" ], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 1117, "end" : "/div[1]/p[6]", "endOffset" : 1124, "_id" : { "$oid" : "511ba8bed2fd810200000017" } } ], "updated" : { "$date" : 1360767166262 }, "created" : { "$date" : 1360767166262 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511ba960d2fd810200000018", "user" : "jamiefolsom@gmail.com", "username" : "Jamie F.", "text" : "![Mary referring to herself](http://upload.wikimedia.org/wikipedia/commons/4/48/1770_MaryRowlandson_Captivity.png) Also add a comment", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson", "quote" : "I", "uuid" : "D7A0C9EC", "_id" : { "$oid" : "511ba960d2fd810200000018" }, "permissions" : { "delete" : [ "jamiefolsom@gmail.com" ], "update" : [ "jamiefolsom@gmail.com" ], "admin" : [ "jamiefolsom@gmail.com" ], "read" : [ "jamiefolsom@gmail.com" ] }, "tags" : [ "person", "one" ], "ranges" : [ { "start" : "/div[1]/p[6]", "startOffset" : 327, "end" : "/div[1]/p[6]", "endOffset" : 328, "_id" : { "$oid" : "511ba960d2fd810200000019" } } ], "updated" : { "$date" : 1360767328485 }, "created" : { "$date" : 1360767328485 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "511bed8f57641d0200000017" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360784783159 }, "groups" : [], "id" : "511bed8f57641d0200000017", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "On the tenth of February 1675, came the Indians with great numbers upon Lancaster", "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 1, "end" : "/div[1]/p[2]", "endOffset" : 82, "_id" : { "$oid" : "511fb338f13c1a0200000004" } } ], "tags" : [], "text" : "Feb 20, 1676 (new style), Lancaster. King Philip's war is from June 1675-April 1678.", "updated" : { "$date" : 1361032204338 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "F63AF17D" } -{ "__v" : 1, "_id" : { "$oid" : "511bef3764db220200000008" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360785207027 }, "groups" : [], "id" : "511bef3764db220200000008", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "THE FIRST REMOVE", "ranges" : [ { "start" : "/div[1]/h2[1]", "startOffset" : 1, "end" : "/div[1]/h2[1]", "endOffset" : 17, "_id" : { "$oid" : "511fb9134b945a0200000004" } } ], "tags" : [ "remove", "location" ], "text" : "Lancaster town to an abandoned house on a hill still in sight of Lancaster.", "updated" : { "$date" : 1361033491236 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "FA96060F" } -{ "_id" : { "$oid" : "511bef6664db22020000000a" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360785254892 }, "id" : "511bef6664db22020000000a", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "About a mile we went that night, up upon a hill within sight of the town", "ranges" : [ { "start" : "/div[1]/p[7]", "startOffset" : 131, "end" : "/div[1]/p[7]", "endOffset" : 203, "_id" : { "$oid" : "511bef6664db22020000000b" } } ], "tags" : [ "location", "remove" ], "text" : "", "updated" : { "$date" : 1360785254892 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "EA11EB03" } -{ "_id" : { "$oid" : "511befbe57641d0200000021" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360785342400 }, "id" : "511befbe57641d0200000021", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "After this it quickly began to snow, and when night came on, they stopped, and now down I must sit in the snow, by a little fire, and a few boughs behind me, with my sick child in my lap; and calling much for water, being now (through the wound) fallen into a violent fever", "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 1, "end" : "/div[1]/p[11]", "endOffset" : 274, "_id" : { "$oid" : "511befbe57641d0200000022" } } ], "tags" : [ "remove", "location" ], "text" : "Stopped at a campfire in the snow.", "updated" : { "$date" : 1360785342400 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "145E1357" } -{ "__v" : 1, "_id" : { "$oid" : "511befd157641d0200000023" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360785361685 }, "groups" : [], "id" : "511befd157641d0200000023", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "THE SECOND REMOVE", "ranges" : [ { "start" : "/div[1]/h2[2]", "startOffset" : 1, "end" : "/div[1]/h2[2]", "endOffset" : 18, "_id" : { "$oid" : "511fb9984b945a0200000006" } } ], "tags" : [ "remove", "location" ], "text" : "To a snowy campfire.", "updated" : { "$date" : 1361033624322 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "8A1F4D09" } -{ "_id" : { "$oid" : "511bf02557641d0200000027" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360785445009 }, "id" : "511bf02557641d0200000027", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Wenimesset, northward of Quabaug.", "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 661, "end" : "/div[1]/p[13]", "endOffset" : 694, "_id" : { "$oid" : "511bf02557641d0200000028" } } ], "tags" : [ "remove", "location" ], "text" : "Wenimesset", "updated" : { "$date" : 1360785445009 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "E6689472" } -{ "_id" : { "$oid" : "511bf03a64db220200000012" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360785466707 }, "id" : "511bf03a64db220200000012", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "THE THIRD REMOVE", "ranges" : [ { "start" : "/div[1]/h2[3]", "startOffset" : 1, "end" : "/div[1]/h2[3]", "endOffset" : 17, "_id" : { "$oid" : "511bf03a64db220200000013" } } ], "tags" : [ "remove", "location" ], "text" : "Wenimesset", "updated" : { "$date" : 1360785466707 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "C4B959B7" } -{ "_id" : { "$oid" : "511bf0a864db220200000014" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360785576415 }, "id" : "511bf0a864db220200000014", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "About two hours in the night, my sweet babe like a lamb departed this life on Feb. 18, 1675.", "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 435, "end" : "/div[1]/p[14]", "endOffset" : 527, "_id" : { "$oid" : "511bf0a864db220200000015" } } ], "tags" : [], "text" : "Her daughter dies.", "updated" : { "$date" : 1360785576415 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "FBA06C73" } -{ "__v" : 1, "_id" : { "$oid" : "511bf0c657641d020000002f" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360785606747 }, "groups" : [], "id" : "511bf0c657641d020000002f", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Quinnapin, who was a Sagamore, and married King Philip's wife's sister;", "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 1299, "end" : "/div[1]/p[14]", "endOffset" : 1370, "_id" : { "$oid" : "511fba874b945a0200000007" } } ], "tags" : [ "Metacomet" ], "text" : "Quinnapin, of Sagamores, close to Metacomet", "updated" : { "$date" : 1361033863371 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "A10C89C8" } -{ "_id" : { "$oid" : "511bf25964db220200000016" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360786009507 }, "id" : "511bf25964db220200000016", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "I went to see my daughter Mary, who was at this same Indian town, at a wigwam not very far off,", "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 2155, "end" : "/div[1]/p[14]", "endOffset" : 2250, "_id" : { "$oid" : "511bf25964db220200000017" } } ], "tags" : [], "text" : "But she has another living daughter, Mary (10).", "updated" : { "$date" : 1360786009507 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "90796F19" } -{ "_id" : { "$oid" : "511bf2e664db22020000001a" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360786150075 }, "id" : "511bf2e664db22020000001a", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "thirty miles from any English town", "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 661, "end" : "/div[1]/p[15]", "endOffset" : 695, "_id" : { "$oid" : "511bf2e664db22020000001b" } } ], "tags" : [ "location" ], "text" : "30 miles away from English towns", "updated" : { "$date" : 1360786150075 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "897A4F34" } -{ "_id" : { "$oid" : "511bf37164db220200000020" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360786289233 }, "id" : "511bf37164db220200000020", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "At this place we continued about four days.", "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 813, "end" : "/div[1]/p[18]", "endOffset" : 856, "_id" : { "$oid" : "511bf37164db220200000021" } } ], "tags" : [], "text" : "stayed for 4 days", "updated" : { "$date" : 1360786289233 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "D4A3AA91" } -{ "_id" : { "$oid" : "511bf38457641d0200000039" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360786308194 }, "id" : "511bf38457641d0200000039", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "THE FOURTH REMOVE", "ranges" : [ { "start" : "/div[1]/h2[4]", "startOffset" : 1, "end" : "/div[1]/h2[4]", "endOffset" : 18, "_id" : { "$oid" : "511bf38457641d020000003a" } } ], "tags" : [ "remove", "location" ], "text" : "middle of nowhere", "updated" : { "$date" : 1360786308194 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "2BED3483" } -{ "_id" : { "$oid" : "511bf43e64db220200000024" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360786494429 }, "id" : "511bf43e64db220200000024", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Banquaug river", "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 723, "end" : "/div[1]/p[20]", "endOffset" : 737, "_id" : { "$oid" : "511bf43e64db220200000025" } } ], "tags" : [ "location" ], "text" : "Banquaug river", "updated" : { "$date" : 1360786494429 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "14D29E93" } -{ "_id" : { "$oid" : "511bf45864db220200000026" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360786520856 }, "id" : "511bf45864db220200000026", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "A certain number of us got over the river that night, but it was the night after the Sabbath before all", "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 1792, "end" : "/div[1]/p[20]", "endOffset" : 1895, "_id" : { "$oid" : "511bf45864db220200000027" } } ], "tags" : [], "text" : "Took 2 days to cross the river.", "updated" : { "$date" : 1360786520856 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "FBCF04F4" } -{ "_id" : { "$oid" : "511bfbe964db220200000028" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360788457167 }, "id" : "511bfbe964db220200000028", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "THE FIFTH REMOVE", "ranges" : [ { "start" : "/div[1]/h2[5]", "startOffset" : 1, "end" : "/div[1]/h2[5]", "endOffset" : 17, "_id" : { "$oid" : "511bfbe964db220200000029" } } ], "tags" : [ "remove", "location" ], "text" : "Banquaug river", "updated" : { "$date" : 1360788457167 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "F01A53A7" } -{ "_id" : { "$oid" : "511bfc1f64db22020000002c" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360788511608 }, "id" : "511bfc1f64db22020000002c", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "We came that day to a great swamp, by the side of which we took up our lodging that night", "ranges" : [ { "start" : "/div[1]/p[23]", "startOffset" : 535, "end" : "/div[1]/p[23]", "endOffset" : 624, "_id" : { "$oid" : "511bfc1f64db22020000002d" } } ], "tags" : [ "remove", "location" ], "text" : "Stopped near a swamp", "updated" : { "$date" : 1360788511608 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "58AF1A9A" } -{ "_id" : { "$oid" : "511bfc3257641d020000003b" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360788530475 }, "id" : "511bfc3257641d020000003b", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "THE SIXTH REMOVE", "ranges" : [ { "start" : "/div[1]/h2[6]", "startOffset" : 1, "end" : "/div[1]/h2[6]", "endOffset" : 17, "_id" : { "$oid" : "511bfc3257641d020000003c" } } ], "tags" : [ "remove", "location" ], "text" : "swamp", "updated" : { "$date" : 1360788530475 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "DB3D181D" } -{ "_id" : { "$oid" : "511bfc4057641d020000003d" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360788544947 }, "id" : "511bfc4057641d020000003d", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Squakeag", "ranges" : [ { "start" : "/div[1]/p[25]", "startOffset" : 656, "end" : "/div[1]/p[25]", "endOffset" : 664, "_id" : { "$oid" : "511bfc4057641d020000003e" } } ], "tags" : [ "location" ], "text" : "Squakeag", "updated" : { "$date" : 1360788544947 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "EFD1DEA9" } -{ "_id" : { "$oid" : "511bfc7457641d020000003f" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360788596329 }, "id" : "511bfc7457641d020000003f", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "As we went along, I saw a place where English cattle had been. That was comfort to me, such as it was", "ranges" : [ { "start" : "/div[1]/p[25]", "startOffset" : 386, "end" : "/div[1]/p[25]", "endOffset" : 487, "_id" : { "$oid" : "511bfc7457641d0200000040" } } ], "tags" : [], "text" : "Come across an abandoned English place.", "updated" : { "$date" : 1360788596329 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "E715D5F5" } -{ "_id" : { "$oid" : "511bfc8464db22020000002e" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360788612163 }, "id" : "511bfc8464db22020000002e", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "deserted English fields", "ranges" : [ { "start" : "/div[1]/p[25]", "startOffset" : 719, "end" : "/div[1]/p[25]", "endOffset" : 742, "_id" : { "$oid" : "511bfc8464db22020000002f" } } ], "tags" : [], "text" : "Did the Indians drive out the English?", "updated" : { "$date" : 1360788612163 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "128ACC1C" } -{ "_id" : { "$oid" : "511bfca164db220200000030" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360788641861 }, "id" : "511bfca164db220200000030", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "THE SEVENTH REMOVE", "ranges" : [ { "start" : "/div[1]/h2[7]", "startOffset" : 1, "end" : "/div[1]/h2[7]", "endOffset" : 19, "_id" : { "$oid" : "511bfca164db220200000031" } } ], "tags" : [ "remove", "location" ], "text" : "Squakeag", "updated" : { "$date" : 1360788641861 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "3A080828" } -{ "__v" : 1, "_id" : { "$oid" : "511bfcd264db220200000032" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360788690599 }, "groups" : [], "id" : "511bfcd264db220200000032", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "On the morrow morning we must go over the river, i.e. Connecticut, to meet with King Philip", "ranges" : [ { "start" : "/div[1]/p[27]", "startOffset" : 1, "end" : "/div[1]/p[27]", "endOffset" : 92, "_id" : { "$oid" : "511fbb514b945a0200000008" } } ], "tags" : [ "location", "metacomet" ], "text" : "Connecticut river", "updated" : { "$date" : 1361034065335 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "F22464ED" } -{ "__v" : 1, "_id" : { "$oid" : "511bfd9464db220200000036" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360788884372 }, "groups" : [], "id" : "511bfd9464db220200000036", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Then I went to see King Philip", "ranges" : [ { "start" : "/div[1]/p[27]", "startOffset" : 3038, "end" : "/div[1]/p[27]", "endOffset" : 3068, "_id" : { "$oid" : "511fbb70f13c1a020000000c" } } ], "tags" : [ "time", "metacomet" ], "text" : "Ah, King Philip is an Indian. Aka [Metacomet](http://en.wikipedia.org/wiki/Metacomet). This is taking place during King Philip's war.", "updated" : { "$date" : 1361034096151 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "28330623" } -{ "_id" : { "$oid" : "511bfdd457641d0200000047" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360788948906 }, "id" : "511bfdd457641d0200000047", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Marlborough's Praying Indians, which Capt. Mosely brought to Boston", "ranges" : [ { "start" : "/div[1]/p[8]", "startOffset" : 203, "end" : "/div[1]/p[8]", "endOffset" : 270, "_id" : { "$oid" : "511bfdd457641d0200000048" } } ], "tags" : [ "location" ], "text" : "Marlborough. Confused by rest of this passage. I assume \"Praying\" means Christian.", "updated" : { "$date" : 1360788948906 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "438C135C" } -{ "_id" : { "$oid" : "511bfe2257641d020000004b" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360789026645 }, "id" : "511bfe2257641d020000004b", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Northampton", "ranges" : [ { "start" : "/div[1]/p[28]", "startOffset" : 51, "end" : "/div[1]/p[28]", "endOffset" : 62, "_id" : { "$oid" : "511bfe2257641d020000004c" } } ], "tags" : [ "location" ], "text" : "Northampton", "updated" : { "$date" : 1360789026645 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "91DE9F28" } -{ "__v" : 1, "_id" : { "$oid" : "511bfe8a57641d0200000053" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360789130912 }, "groups" : [], "id" : "511bfe8a57641d0200000053", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "THE EIGHTH REMOVE", "ranges" : [ { "start" : "/div[1]/h2[8]", "startOffset" : 1, "end" : "/div[1]/h2[8]", "endOffset" : 18, "_id" : { "$oid" : "511fc164f13c1a020000000d" } } ], "tags" : [ "location" ], "text" : "King Philip's camp.", "updated" : { "$date" : 1361035620408 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "A85F36A9" } -{ "_id" : { "$oid" : "511bff1157641d0200000059" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360789265711 }, "id" : "511bff1157641d0200000059", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "THE NINTH REMOVE", "ranges" : [ { "start" : "/div[1]/h2[9]", "startOffset" : 1, "end" : "/div[1]/h2[9]", "endOffset" : 17, "_id" : { "$oid" : "511bff1157641d020000005a" } } ], "tags" : [ "remove", "location" ], "text" : "5 miles up river from Philip's camp", "updated" : { "$date" : 1360789265711 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "C66DDC2B" } -{ "id" : "511c062564db220200000044", "user" : "jonah@ccnmtl.columbia.edu", "username" : "Jonah B.", "text" : "Down!", "uri" : "http://app.annotationstudio.org/documents/alices-adventures-in-wonderland-chapters-1-5-7", "quote" : "Down, down, down.", "uuid" : "4DE99960", "_id" : { "$oid" : "511c062564db220200000044" }, "permissions" : { "delete" : [ "jonah@ccnmtl.columbia.edu" ], "update" : [ "jonah@ccnmtl.columbia.edu" ], "admin" : [ "jonah@ccnmtl.columbia.edu" ], "read" : [ "jonah@ccnmtl.columbia.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 2881, "end" : "/div[1]", "endOffset" : 2898, "_id" : { "$oid" : "511c062564db220200000045" } } ], "updated" : { "$date" : 1360791077608 }, "created" : { "$date" : 1360791077608 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "_id" : { "$oid" : "511c069057641d020000005f" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360791184594 }, "id" : "511c069057641d020000005f", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "THE TENTH REMOVE", "ranges" : [ { "start" : "/div[1]/h2[10]", "startOffset" : 1, "end" : "/div[1]/h2[10]", "endOffset" : 17, "_id" : { "$oid" : "511c069057641d0200000060" } } ], "tags" : [ "remove", "location" ], "text" : "3/4 of a mile further up river", "updated" : { "$date" : 1360791184594 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "18DE38EA" } -{ "_id" : { "$oid" : "511c06d264db220200000046" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360791250095 }, "id" : "511c06d264db220200000046", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "I took my load at my back, and quickly we came to wade over the river; and passed over tiresome and wearisome hills", "ranges" : [ { "start" : "/div[1]/p[37]", "startOffset" : 93, "end" : "/div[1]/p[37]", "endOffset" : 208, "_id" : { "$oid" : "511c06d264db220200000047" } } ], "tags" : [ "location" ], "text" : "Crossed the river and took to hilly land.", "updated" : { "$date" : 1360791250095 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "09340F29" } -{ "_id" : { "$oid" : "511c06e757641d0200000065" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360791271025 }, "id" : "511c06e757641d0200000065", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "THE ELEVENTH REMOVE", "ranges" : [ { "start" : "/div[1]/h2[11]", "startOffset" : 1, "end" : "/div[1]/h2[11]", "endOffset" : 20, "_id" : { "$oid" : "511c06e757641d0200000066" } } ], "tags" : [ "remove", "location" ], "text" : "travelling up river and over hills", "updated" : { "$date" : 1360791271025 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "2ED326E9" } -{ "_id" : { "$oid" : "511c074b64db22020000004a" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360791371459 }, "id" : "511c074b64db22020000004a", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "But the thoughts of my going homeward (for so we bent our course)", "ranges" : [ { "start" : "/div[1]/p[40]", "startOffset" : 1, "end" : "/div[1]/p[40]", "endOffset" : 66, "_id" : { "$oid" : "511c074b64db22020000004b" } } ], "tags" : [ "location" ], "text" : "They seem to be going back to English territory.", "updated" : { "$date" : 1360791371459 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "176F3C33" } -{ "_id" : { "$oid" : "511c07d657641d0200000071" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360791510871 }, "id" : "511c07d657641d0200000071", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "THE TWELFTH REMOVE", "ranges" : [ { "start" : "/div[1]/h2[12]", "startOffset" : 1, "end" : "/div[1]/h2[12]", "endOffset" : 19, "_id" : { "$oid" : "511c07d657641d0200000072" } } ], "tags" : [ "location" ], "text" : "2 miles from the Connecticut river.", "updated" : { "$date" : 1360791510871 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "25682287" } -{ "_id" : { "$oid" : "511c07ff57641d0200000075" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360791551365 }, "id" : "511c07ff57641d0200000075", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "five or six miles down the river into a mighty thicket of brush; where we abode almost a fortnight", "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 80, "end" : "/div[1]/p[42]", "endOffset" : 178, "_id" : { "$oid" : "511c07ff57641d0200000076" } } ], "tags" : [ "location" ], "text" : "5 or 6 miles down river (not towards the bay)", "updated" : { "$date" : 1360791551365 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "7B133565" } -{ "_id" : { "$oid" : "511c081664db22020000004c" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360791574750 }, "id" : "511c081664db22020000004c", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "THE THIRTEENTH REMOVE", "ranges" : [ { "start" : "/div[1]/h2[13]", "startOffset" : 1, "end" : "/div[1]/h2[13]", "endOffset" : 22, "_id" : { "$oid" : "511c081664db22020000004d" } } ], "tags" : [ "remove", "location" ], "text" : "in the brush, further downriver", "updated" : { "$date" : 1360791574750 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "FBD1263C" } -{ "_id" : { "$oid" : "511c086864db220200000052" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360791656037 }, "id" : "511c086864db220200000052", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Hadley", "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 3390, "end" : "/div[1]/p[42]", "endOffset" : 3396, "_id" : { "$oid" : "511c086864db220200000053" } } ], "tags" : [ "location" ], "text" : "Hadley", "updated" : { "$date" : 1360791656037 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "707086E1" } -{ "_id" : { "$oid" : "511c092557641d020000007b" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360791845496 }, "id" : "511c092557641d020000007b", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "So his master carried him away, and I never saw him afterward, till I saw him at Piscataqua in Portsmouth", "ranges" : [ { "start" : "/div[1]/p[46]", "startOffset" : 1078, "end" : "/div[1]/p[46]", "endOffset" : 1183, "_id" : { "$oid" : "511c092557641d020000007c" } } ], "tags" : [], "text" : "Last time she sees her son. He seems to be in good hands.", "updated" : { "$date" : 1360791845496 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "339B2BC3" } -{ "_id" : { "$oid" : "511c097d57641d020000007d" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360791933110 }, "id" : "511c097d57641d020000007d", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "THE FOURTEENTH REMOVE", "ranges" : [ { "start" : "/div[1]/h2[14]", "startOffset" : 1, "end" : "/div[1]/h2[14]", "endOffset" : 22, "_id" : { "$oid" : "511c097d57641d020000007e" } } ], "tags" : [ "remove", "location" ], "text" : "on the move towards Baytowns", "updated" : { "$date" : 1360791933110 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "3521EF4F" } -{ "_id" : { "$oid" : "511c0cbc64db220200000064" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360792764215 }, "id" : "511c0cbc64db220200000064", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "THE FIFTEENTH REMOVE", "ranges" : [ { "start" : "/div[1]/h2[15]", "startOffset" : 1, "end" : "/div[1]/h2[15]", "endOffset" : 21, "_id" : { "$oid" : "511c0cbc64db220200000065" } } ], "tags" : [ "remove", "location" ], "text" : "Banquang river", "updated" : { "$date" : 1360792764215 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "D864234F" } -{ "_id" : { "$oid" : "511c0ccb64db220200000066" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360792779706 }, "id" : "511c0ccb64db220200000066", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "THE SIXTEENTH REMOVE", "ranges" : [ { "start" : "/div[1]/h2[16]", "startOffset" : 1, "end" : "/div[1]/h2[16]", "endOffset" : 21, "_id" : { "$oid" : "511c0ccb64db220200000067" } } ], "tags" : [ "remove", "location" ], "text" : "across the Banquang river", "updated" : { "$date" : 1360792779706 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "A7BC976C" } -{ "_id" : { "$oid" : "511c0d5164db22020000006a" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360792913641 }, "id" : "511c0d5164db22020000006a", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "At night we came to an Indian town", "ranges" : [ { "start" : "/div[1]/p[55]", "startOffset" : 507, "end" : "/div[1]/p[55]", "endOffset" : 541, "_id" : { "$oid" : "511c0d5164db22020000006b" } } ], "tags" : [ "location" ], "text" : "Indian town", "updated" : { "$date" : 1360792913641 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "31F5C907" } -{ "_id" : { "$oid" : "511c0d6264db22020000006c" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360792930370 }, "id" : "511c0d6264db22020000006c", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "THE SEVENTEENTH REMOVE", "ranges" : [ { "start" : "/div[1]/h2[17]", "startOffset" : 1, "end" : "/div[1]/h2[17]", "endOffset" : 23, "_id" : { "$oid" : "511c0d6264db22020000006d" } } ], "tags" : [ "remove", "location" ], "text" : "indian town", "updated" : { "$date" : 1360792930370 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "A2BB3D96" } -{ "_id" : { "$oid" : "511c0d9864db220200000070" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360792984844 }, "id" : "511c0d9864db220200000070", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "THE EIGHTEENTH REMOVE", "ranges" : [ { "start" : "/div[1]/h2[18]", "startOffset" : 1, "end" : "/div[1]/h2[18]", "endOffset" : 22, "_id" : { "$oid" : "511c0d9864db220200000071" } } ], "tags" : [ "remove", "location" ], "text" : "a second indian town", "updated" : { "$date" : 1360792984844 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "A4B91B3B" } -{ "_id" : { "$oid" : "511c0e2564db220200000074" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360793125529 }, "id" : "511c0e2564db220200000074", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "THE NINETEENTH REMOVE", "ranges" : [ { "start" : "/div[1]/h2[19]", "startOffset" : 1, "end" : "/div[1]/h2[19]", "endOffset" : 22, "_id" : { "$oid" : "511c0e2564db220200000075" } } ], "tags" : [ "location", "remove" ], "text" : "trying to get to Wachusett, near Sudbury", "updated" : { "$date" : 1360793125529 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "693BDB2F" } -{ "_id" : { "$oid" : "511d04b664db220200000078" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360856246073 }, "id" : "511d04b664db220200000078", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "I saw Wachusett hills", "ranges" : [ { "start" : "/div[1]/p[59]", "startOffset" : 210, "end" : "/div[1]/p[59]", "endOffset" : 231, "_id" : { "$oid" : "511d04b664db220200000079" } } ], "tags" : [ "location" ], "text" : "within sight of Wachusett", "updated" : { "$date" : 1360856246073 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "44BE7B11" } -{ "_id" : { "$oid" : "511d04d364db22020000007a" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360856275635 }, "id" : "511d04d364db22020000007a", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Going along, having indeed my life, but little spirit, Philip, who was in the company, came up and took me by the hand, and said, two weeks more and you shall be mistress again", "ranges" : [ { "start" : "/div[1]/p[59]", "startOffset" : 559, "end" : "/div[1]/p[59]", "endOffset" : 735, "_id" : { "$oid" : "511d04d364db22020000007b" } } ], "tags" : [ "metacomet" ], "text" : "King Philip tells her she's going to see her master?", "updated" : { "$date" : 1360856275635 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "140953B4" } -{ "__v" : 1, "_id" : { "$oid" : "511d050c64db22020000007e" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360856332809 }, "groups" : [], "id" : "511d050c64db22020000007e", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Another was Wattimore [Weetamoo] with whom I had lived and served all this while.", "ranges" : [ { "start" : "/div[1]/p[60]", "startOffset" : 179, "end" : "/div[1]/p[60]", "endOffset" : 260, "_id" : { "$oid" : "511fbd084b945a0200000009" } } ], "tags" : [ "weetamoo" ], "text" : "She had been traveling with her master's second wife. WEETAMOO", "updated" : { "$date" : 1361034504571 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "986E6DCB" } -{ "_id" : { "$oid" : "511d052264db220200000080" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360856354371 }, "id" : "511d052264db220200000080", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Weetamoo's maid came to call me home, at which I fell aweeping. Then the old squaw told me, to encourage me, that if I wanted victuals, I should come to her, and that I should lie there in her wigwam.", "ranges" : [ { "start" : "/div[1]/p[60]", "startOffset" : 721, "end" : "/div[1]/p[60]", "endOffset" : 921, "_id" : { "$oid" : "511d052264db220200000081" } } ], "tags" : [], "text" : "Second wife wants her back; first wife tells her to come to her for food and shelter at night.", "updated" : { "$date" : 1360856354371 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "46BDDE24" } -{ "_id" : { "$oid" : "511d0531b92b2d0200000002" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360856369496 }, "id" : "511d0531b92b2d0200000002", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "I understood that Weetamoo thought that if she should let me go and serve with the old squaw, she would be in danger to lose not only my service, but the redemption pay also.", "ranges" : [ { "start" : "/div[1]/p[60]", "startOffset" : 1095, "end" : "/div[1]/p[60]", "endOffset" : 1269, "_id" : { "$oid" : "511d0531b92b2d0200000003" } } ], "tags" : [], "text" : "Second wife wants to keep her in her wigwam so she gets paid the ransom, basically.", "updated" : { "$date" : 1360856369496 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "7C58C31A" } -{ "_id" : { "$oid" : "511d054164db220200000082" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360856385906 }, "id" : "511d054164db220200000082", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Tom and Peter", "ranges" : [ { "start" : "/div[1]/p[61]", "startOffset" : 11, "end" : "/div[1]/p[61]", "endOffset" : 24, "_id" : { "$oid" : "511d054164db220200000083" } } ], "tags" : [], "text" : "Tom and Peter?", "updated" : { "$date" : 1360856385906 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "25BAEAF1" } -{ "_id" : { "$oid" : "511d0558b92b2d0200000004" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360856408367 }, "id" : "511d0558b92b2d0200000004", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "So that fearing the worst, I durst not send to my husband, though there were some thoughts of his coming to redeem and fetch me, not knowing what might follow.", "ranges" : [ { "start" : "/div[1]/p[61]", "startOffset" : 873, "end" : "/div[1]/p[61]", "endOffset" : 1032, "_id" : { "$oid" : "511d0558b92b2d0200000005" } } ], "tags" : [], "text" : "How would she have sent for her husband?", "updated" : { "$date" : 1360856408367 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "D1FD9A13" } -{ "_id" : { "$oid" : "511d0563b92b2d0200000006" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360856419389 }, "id" : "511d0563b92b2d0200000006", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Sagamores met to consult about the captives, and called me to them to inquire how much my husband would give to redeem me.", "ranges" : [ { "start" : "/div[1]/p[61]", "startOffset" : 1135, "end" : "/div[1]/p[61]", "endOffset" : 1257, "_id" : { "$oid" : "511d0563b92b2d0200000007" } } ], "tags" : [], "text" : "The General Court of the Sagamores sets her ransom.", "updated" : { "$date" : 1360856419389 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "5F66080A" } -{ "_id" : { "$oid" : "511d058a64db220200000084" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360856458008 }, "id" : "511d058a64db220200000084", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "ut they would not hear of that, but sent that message to Boston, that for twenty pounds I should be redeemed. It was a Praying Indian that wrote their letter for them.", "ranges" : [ { "start" : "/div[1]/p[61]", "startOffset" : 1751, "end" : "/div[1]/p[61]", "endOffset" : 1918, "_id" : { "$oid" : "511d058a64db220200000085" } } ], "tags" : [], "text" : "A Christian Indian writes to Boston for her ransom.", "updated" : { "$date" : 1360856458008 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "9CFD2694" } -{ "_id" : { "$oid" : "511d05a964db220200000086" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360856489420 }, "id" : "511d05a964db220200000086", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "One Englishman they brought along with them: and he said, it was too true, for they had made sad work at Sudbury, as indeed it proved.", "ranges" : [ { "start" : "/div[1]/p[61]", "startOffset" : 5039, "end" : "/div[1]/p[61]", "endOffset" : 5173, "_id" : { "$oid" : "511d05a964db220200000087" } } ], "tags" : [ "location" ], "text" : "Then they go out and attack Sudbury?", "updated" : { "$date" : 1360856489420 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "62BD5936" } -{ "_id" : { "$oid" : "511d05bf64db220200000088" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360856511832 }, "id" : "511d05bf64db220200000088", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "When they went, they acted as if the devil had told them that they should gain the victory; and now they acted as if the devil had told them they should have a fall", "ranges" : [ { "start" : "/div[1]/p[61]", "startOffset" : 5510, "end" : "/div[1]/p[61]", "endOffset" : 5674, "_id" : { "$oid" : "511d05bf64db220200000089" } } ], "tags" : [], "text" : "They left happy and rejoicing, came back quietly and as if they'd lost. But she didn't think they'd lost any men.", "updated" : { "$date" : 1360856511832 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "5BF26CFA" } -{ "_id" : { "$oid" : "511d05cdb92b2d020000000a" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360856525430 }, "id" : "511d05cdb92b2d020000000a", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Whither it were so or no, I cannot tell, but so it proved, for quickly they began to fall, and so held on that summer, till they came to utter ruin.", "ranges" : [ { "start" : "/div[1]/p[61]", "startOffset" : 5676, "end" : "/div[1]/p[61]", "endOffset" : 5824, "_id" : { "$oid" : "511d05cdb92b2d020000000b" } } ], "tags" : [], "text" : "They did eventually get destroyed (by the english presumably).", "updated" : { "$date" : 1360856525430 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "7CB2FC6D" } -{ "_id" : { "$oid" : "511d05e2b92b2d020000000c" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360856546410 }, "id" : "511d05e2b92b2d020000000c", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Which I did, and as I was eating, another Indian said to me, he seems to be your good friend, but he killed two Englishmen at Sudbury, and there lie their clothes behind you: I looked behind me, and there I saw bloody clothes, with bullet-holes in them.", "ranges" : [ { "start" : "/div[1]/p[61]", "startOffset" : 6207, "end" : "/div[1]/p[61]", "endOffset" : 6460, "_id" : { "$oid" : "511d05e2b92b2d020000000d" } } ], "tags" : [], "text" : "An Indian that would feed her often told her he'd killed two Englishmen at Sudbury and had their clothing.", "updated" : { "$date" : 1360856546410 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "FF01F9BC" } -{ "_id" : { "$oid" : "511d05f2b92b2d020000000e" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360856562445 }, "id" : "511d05f2b92b2d020000000e", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "THE TWENTIETH REMOVE", "ranges" : [ { "start" : "/div[1]/h2[20]", "startOffset" : 1, "end" : "/div[1]/h2[20]", "endOffset" : 21, "_id" : { "$oid" : "511d05f2b92b2d020000000f" } } ], "tags" : [ "remove", "location" ], "text" : "3 or 4 miles away from the camp they attacked Sudbury from", "updated" : { "$date" : 1360856562445 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "D083ACDC" } -{ "_id" : { "$oid" : "511d060264db22020000008a" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360856578556 }, "id" : "511d060264db22020000008a", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "We went about three or four miles, and there they built a great wigwam, big enough to hold an hundred Indians, which they did in preparation to a great day of dancing.", "ranges" : [ { "start" : "/div[1]/p[63]", "startOffset" : 132, "end" : "/div[1]/p[63]", "endOffset" : 299, "_id" : { "$oid" : "511d060264db22020000008b" } } ], "tags" : [], "text" : "", "updated" : { "$date" : 1360856578556 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "2A75F5C8" } -{ "_id" : { "$oid" : "511d061ab92b2d0200000010" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360856602389 }, "id" : "511d061ab92b2d0200000010", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Then he overtook her, and began to rant as if he had been mad, and made her go back again in the rain; so that I never saw her till I saw her in Charlestown.", "ranges" : [ { "start" : "/div[1]/p[63]", "startOffset" : 774, "end" : "/div[1]/p[63]", "endOffset" : 931, "_id" : { "$oid" : "511d061ab92b2d0200000011" } } ], "tags" : [], "text" : "Her sister tries to see her, but doesn't.", "updated" : { "$date" : 1360856602389 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "F7800EEC" } -{ "_id" : { "$oid" : "511d062f64db22020000008c" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360856623299 }, "id" : "511d062f64db22020000008c", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "My daughter was also now about a mile off", "ranges" : [ { "start" : "/div[1]/p[63]", "startOffset" : 1460, "end" : "/div[1]/p[63]", "endOffset" : 1501, "_id" : { "$oid" : "511d062f64db22020000008d" } } ], "tags" : [], "text" : "Her daughter was also near, but she didn't get to see her.", "updated" : { "$date" : 1360856623299 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "A00E366D" } -{ "_id" : { "$oid" : "511d0703b92b2d020000001a" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360856835251 }, "id" : "511d0703b92b2d020000001a", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "On Tuesday morning they called their general court (as they call it) to consult and determine, whether I should go home or no. And they all as one man did seemingly consent to it, that I should go home; except Philip, who would not come among them.", "ranges" : [ { "start" : "/div[1]/p[65]", "startOffset" : 1, "end" : "/div[1]/p[65]", "endOffset" : 249, "_id" : { "$oid" : "511d0703b92b2d020000001b" } } ], "tags" : [ "metacomet" ], "text" : "Then the General Court decides she should go home?", "updated" : { "$date" : 1360856835251 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "C4A55457" } -{ "_id" : { "$oid" : "511d074764db220200000094" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360856903210 }, "id" : "511d074764db220200000094", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "I say, that then our army should want provision, and be forced to leave their pursuit and return homeward; and the very next week the enemy came upon our town, like bears bereft of their whelps, or so many ravenous wolves, rending us and our lambs to death.", "ranges" : [ { "start" : "/div[1]/p[67]", "startOffset" : 358, "end" : "/div[1]/p[67]", "endOffset" : 615, "_id" : { "$oid" : "511d074764db220200000095" } } ], "tags" : [], "text" : "There had been army men at her town until they left to get more provisions a week before the attack. (Unsurprisingly, the Indians had been starving too.)", "updated" : { "$date" : 1360856903210 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "49932B33" } -{ "_id" : { "$oid" : "511d075764db220200000096" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360856919674 }, "id" : "511d075764db220200000096", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Thus did they scoff at us, as if the English would be a quarter of a year getting ready.", "ranges" : [ { "start" : "/div[1]/p[68]", "startOffset" : 343, "end" : "/div[1]/p[68]", "endOffset" : 431, "_id" : { "$oid" : "511d075764db220200000097" } } ], "tags" : [], "text" : "The Indians were scornful of the English army.", "updated" : { "$date" : 1360856919674 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "B25FDF72" } -{ "_id" : { "$oid" : "511d076fb92b2d020000001e" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360856943151 }, "id" : "511d076fb92b2d020000001e", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "fled before them till they came to Banquang river", "ranges" : [ { "start" : "/div[1]/p[69]", "startOffset" : 147, "end" : "/div[1]/p[69]", "endOffset" : 196, "_id" : { "$oid" : "511d076fb92b2d020000001f" } } ], "tags" : [], "text" : "The Indians had been running from the fresh English army by crossing an impassable river.", "updated" : { "$date" : 1360856943151 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "409F7580" } -{ "_id" : { "$oid" : "511d07b864db22020000009a" }, "__v" : 1, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360857016675 }, "id" : "511d07b864db22020000009a", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "eleven weeks and five days", "ranges" : [ { "start" : "/div[1]/p[74]", "startOffset" : 186, "end" : "/div[1]/p[74]", "endOffset" : 212, "_id" : { "$oid" : "511d07b864db22020000009b" } } ], "tags" : [ "time" ], "text" : "", "updated" : { "$date" : 1360857024744 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "8B23E797" } -{ "_id" : { "$oid" : "511d07da64db22020000009c" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360857050614 }, "id" : "511d07da64db22020000009c", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "one week passed without the fury of the enemy, and some desolation by fire and sword upon one place or other. They mourned (with their black faces) for their own losses, yet triumphed and rejoiced in their inhumane, and many times devilish cruelty to the English.", "ranges" : [ { "start" : "/div[1]/p[74]", "startOffset" : 222, "end" : "/div[1]/p[74]", "endOffset" : 485, "_id" : { "$oid" : "511d07da64db22020000009d" } } ], "tags" : [], "text" : "The Indians attacked Englishpeople a lot.", "updated" : { "$date" : 1360857050614 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "5529CFE2" } -{ "_id" : { "$oid" : "511d080bb92b2d0200000022" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360857099125 }, "id" : "511d080bb92b2d0200000022", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "About the sun going down, Mr. Hoar, and myself, and the two Indians came to Lancaster, and a solemn sight it was to me.", "ranges" : [ { "start" : "/div[1]/p[75]", "startOffset" : 1971, "end" : "/div[1]/p[75]", "endOffset" : 2090, "_id" : { "$oid" : "511d080bb92b2d0200000023" } } ], "tags" : [ "location" ], "text" : "She finally returns to Lancaster.", "updated" : { "$date" : 1360857099125 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "A2BFC3D0" } -{ "_id" : { "$oid" : "511d08dfb92b2d0200000024" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360857311091 }, "id" : "511d08dfb92b2d0200000024", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "now not one Christian to be seen, nor one house left standing", "ranges" : [ { "start" : "/div[1]/p[75]", "startOffset" : 2172, "end" : "/div[1]/p[75]", "endOffset" : 2233, "_id" : { "$oid" : "511d08dfb92b2d0200000025" } } ], "tags" : [], "text" : "Lancaster was destroyed.", "updated" : { "$date" : 1360857311091 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "1FDCD88E" } -{ "_id" : { "$oid" : "511d08f364db2202000000a0" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360857331622 }, "id" : "511d08f364db2202000000a0", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "we came to Concord", "ranges" : [ { "start" : "/div[1]/p[75]", "startOffset" : 2501, "end" : "/div[1]/p[75]", "endOffset" : 2519, "_id" : { "$oid" : "511d08f364db2202000000a1" } } ], "tags" : [ "location" ], "text" : "Concord", "updated" : { "$date" : 1360857331622 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "3062F53E" } -{ "_id" : { "$oid" : "511d093cb92b2d0200000026" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360857404541 }, "id" : "511d093cb92b2d0200000026", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Being recruited with food and raiment we went to Boston that day, where I met with my dear husband, but the thoughts of our dear children, one being dead, and the other we could not tell where, abated our comfort each to other", "ranges" : [ { "start" : "/div[1]/p[75]", "startOffset" : 3215, "end" : "/div[1]/p[75]", "endOffset" : 3441, "_id" : { "$oid" : "511d093cb92b2d0200000027" } } ], "tags" : [ "location" ], "text" : "She goes to Boston and meets her husband.", "updated" : { "$date" : 1360857404541 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "9F484837" } -{ "_id" : { "$oid" : "511d09ad64db2202000000aa" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360857517965 }, "id" : "511d09ad64db2202000000aa", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "And as we were riding along (God is the wise disposer of all things) between Ipswich and Rowley we met with Mr. William Hubbard, who told us that our son Joseph was come in to Major Waldron's, and another with him, which was my sister's son.", "ranges" : [ { "start" : "/div[1]/p[75]", "startOffset" : 5599, "end" : "/div[1]/p[75]", "endOffset" : 5840, "_id" : { "$oid" : "511d09ad64db2202000000ab" } } ], "tags" : [ "location" ], "text" : "She gets news of her son and nephew (who are at Major Waldron's). Between Ipswich and Rowley. ", "updated" : { "$date" : 1360857517965 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "7A04500E" } -{ "_id" : { "$oid" : "511d09bf64db2202000000ac" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360857535363 }, "id" : "511d09bf64db2202000000ac", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Newbury", "ranges" : [ { "start" : "/div[1]/p[75]", "startOffset" : 5941, "end" : "/div[1]/p[75]", "endOffset" : 5948, "_id" : { "$oid" : "511d09bf64db2202000000ad" } } ], "tags" : [ "location" ], "text" : "Newbury", "updated" : { "$date" : 1360857535363 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "EC9B5F22" } -{ "_id" : { "$oid" : "511d09ccb92b2d0200000028" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360857548440 }, "id" : "511d09ccb92b2d0200000028", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Salisbury", "ranges" : [ { "start" : "/div[1]/p[75]", "startOffset" : 6114, "end" : "/div[1]/p[75]", "endOffset" : 6123, "_id" : { "$oid" : "511d09ccb92b2d0200000029" } } ], "tags" : [ "location" ], "text" : "Salisbury", "updated" : { "$date" : 1360857548440 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "14D6737D" } -{ "_id" : { "$oid" : "511d09dfb92b2d020000002a" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360857567228 }, "id" : "511d09dfb92b2d020000002a", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "his daughter was come in at Providence", "ranges" : [ { "start" : "/div[1]/p[75]", "startOffset" : 6271, "end" : "/div[1]/p[75]", "endOffset" : 6309, "_id" : { "$oid" : "511d09dfb92b2d020000002b" } } ], "tags" : [ "location" ], "text" : "They hear her daughters is at Providence.", "updated" : { "$date" : 1360857578335 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "56E787E2" } -{ "_id" : { "$oid" : "511d0a11b92b2d020000002c" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360857617723 }, "id" : "511d0a11b92b2d020000002c", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Our son being nearest, we went to him first, to Portsmouth, where we met with him, and with the Major also,", "ranges" : [ { "start" : "/div[1]/p[75]", "startOffset" : 6970, "end" : "/div[1]/p[75]", "endOffset" : 7077, "_id" : { "$oid" : "511d0a11b92b2d020000002d" } } ], "tags" : [ "location" ], "text" : "They retrieve their son from Portsmouth for 7 pounds.", "updated" : { "$date" : 1360857617723 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "A1916231" } -{ "_id" : { "$oid" : "511d0a1eb92b2d020000002e" }, "__v" : 1, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360857630324 }, "id" : "511d0a1eb92b2d020000002e", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Newbury", "ranges" : [ { "start" : "/div[1]/p[75]", "startOffset" : 7494, "end" : "/div[1]/p[75]", "endOffset" : 7501, "_id" : { "$oid" : "511d0a1eb92b2d020000002f" } } ], "tags" : [ "location" ], "text" : "return to Newbury", "updated" : { "$date" : 1360857636145 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "F57EB2FC" } -{ "_id" : { "$oid" : "511d0a3364db2202000000ae" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360857651940 }, "id" : "511d0a3364db2202000000ae", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Charlestown", "ranges" : [ { "start" : "/div[1]/p[76]", "startOffset" : 22, "end" : "/div[1]/p[76]", "endOffset" : 33, "_id" : { "$oid" : "511d0a3364db2202000000af" } } ], "tags" : [ "location" ], "text" : "Charlestown", "updated" : { "$date" : 1360857651940 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "79E5C308" } -{ "_id" : { "$oid" : "511d0a4164db2202000000b0" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360857665490 }, "id" : "511d0a4164db2202000000b0", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Rehoboth than Rhode Island", "ranges" : [ { "start" : "/div[1]/p[76]", "startOffset" : 244, "end" : "/div[1]/p[76]", "endOffset" : 270, "_id" : { "$oid" : "511d0a4164db2202000000b1" } } ], "tags" : [ "location" ], "text" : "Rehoboth and Rhode Island", "updated" : { "$date" : 1360857665490 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "ED95331A" } -{ "_id" : { "$oid" : "511d0a6464db2202000000b2" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360857700403 }, "id" : "511d0a6464db2202000000b2", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "But the carts which carried provision to the English army, being guarded, brought her with them to Dorchester, where we received her safe.", "ranges" : [ { "start" : "/div[1]/p[76]", "startOffset" : 611, "end" : "/div[1]/p[76]", "endOffset" : 749, "_id" : { "$oid" : "511d0a6464db2202000000b3" } } ], "tags" : [ "location" ], "text" : "They retrieved her daughter at Dorchester.", "updated" : { "$date" : 1360857700403 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "C18789B5" } -{ "_id" : { "$oid" : "511d0a7db92b2d0200000030" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360857725991 }, "id" : "511d0a7db92b2d0200000030", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Thus she traveled three days together, not knowing whither she was going", "ranges" : [ { "start" : "/div[1]/p[76]", "startOffset" : 1182, "end" : "/div[1]/p[76]", "endOffset" : 1254, "_id" : { "$oid" : "511d0a7db92b2d0200000031" } } ], "tags" : [ "location" ], "text" : "She traveled 3 days with an Indian woman to come to Providence", "updated" : { "$date" : 1360857725991 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "49DE517E" } -{ "_id" : { "$oid" : "511d0a96b92b2d0200000032" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360857750531 }, "id" : "511d0a96b92b2d0200000032", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "the South Church in Boston hired an house for us. Then we removed from Mr. Shepard's, those cordial friends, and went to Boston, where we continued about three-quarters of a year", "ranges" : [ { "start" : "/div[1]/p[77]", "startOffset" : 72, "end" : "/div[1]/p[77]", "endOffset" : 250, "_id" : { "$oid" : "511d0a96b92b2d0200000033" } } ], "tags" : [ "location" ], "text" : "The family moves to Boston", "updated" : { "$date" : 1360857750531 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "520005FE" } -{ "__v" : 1, "_id" : { "$oid" : "511d4e4927e8960200000008" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360875081683 }, "groups" : [], "id" : "511d4e4927e8960200000008", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Of thirty-seven persons who were in this one house, none escaped either present death, or a bitter captivity, save only one, who might say as he, \"And I only am escaped alone to tell the News\" (Job 1.15). There were twelve killed, some shot, some stabbed with their spears, some knocked down with their hatchets.", "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 141, "end" : "/div[1]/p[4]", "endOffset" : 453, "_id" : { "$oid" : "511fb898f13c1a0200000007" } } ], "tags" : [], "text" : "12 out of 37 people killed. 1 escapes to tell the news.", "updated" : { "$date" : 1361033368657 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "2C00BD30" } -{ "_id" : { "$oid" : "511d4e6db92b2d0200000036" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360875117146 }, "id" : "511d4e6db92b2d0200000036", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "for there were twenty-four of us taken alive and carried captive.", "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 1097, "end" : "/div[1]/p[4]", "endOffset" : 1162, "_id" : { "$oid" : "511d4e6db92b2d0200000037" } } ], "tags" : [], "text" : "24 captives", "updated" : { "$date" : 1360875117146 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "9BB1268F" } -{ "__v" : 1, "_id" : { "$oid" : "511d4ed3b92b2d0200000038" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360875219567 }, "groups" : [], "id" : "511d4ed3b92b2d0200000038", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "There remained nothing to me but one poor wounded babe, and it seemed at present worse than death that it was in such a pitiful condition, bespeaking compassion, and I had no refreshing for it, nor suitable things to revive it.", "ranges" : [ { "start" : "/div[1]/p[7]", "startOffset" : 1464, "end" : "/div[1]/p[7]", "endOffset" : 1691, "_id" : { "$oid" : "511fb9544b945a0200000005" } } ], "tags" : [], "text" : "But she has a dying child.", "updated" : { "$date" : 1361033556940 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "EDB6751E" } -{ "_id" : { "$oid" : "511d5046b92b2d0200000042" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360875590271 }, "id" : "511d5046b92b2d0200000042", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "One of the Indians that came from Medfield fight, had brought some plunder, came to me, and asked me, if I would have a Bible, he had got one in his basket.", "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 5384, "end" : "/div[1]/p[14]", "endOffset" : 5540, "_id" : { "$oid" : "511d5046b92b2d0200000043" } } ], "tags" : [], "text" : "An Indian brings her a Bible from Medfield.", "updated" : { "$date" : 1360875590271 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "36305393" } -{ "_id" : { "$oid" : "511d507bb92b2d0200000044" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360875643577 }, "id" : "511d507bb92b2d0200000044", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Here I parted from my daughter Mary", "ranges" : [ { "start" : "/div[1]/p[17]", "startOffset" : 53, "end" : "/div[1]/p[17]", "endOffset" : 88, "_id" : { "$oid" : "511d507bb92b2d0200000045" } } ], "tags" : [], "text" : "last time she sees Mary", "updated" : { "$date" : 1360875643577 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "F05EC20C" } -{ "_id" : { "$oid" : "511d50b527e8960200000014" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360875701032 }, "id" : "511d50b527e8960200000014", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "we traveled about half a day or little more, and came to a desolate place in the wilderness, where there were no wigwams or inhabitants before; we came about the middle of the afternoon to this place,", "ranges" : [ { "start" : "/div[1]/p[17]", "startOffset" : 1181, "end" : "/div[1]/p[17]", "endOffset" : 1381, "_id" : { "$oid" : "511d50b527e8960200000015" } } ], "tags" : [ "remove", "location" ], "text" : "half day's travel. stop in the middle of nowhere", "updated" : { "$date" : 1360875701032 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "AE7FF969" } -{ "_id" : { "$oid" : "511d50f2b92b2d0200000046" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360875762593 }, "id" : "511d50f2b92b2d0200000046", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Medfield", "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 4220, "end" : "/div[1]/p[14]", "endOffset" : 4228, "_id" : { "$oid" : "511d50f2b92b2d0200000047" } } ], "tags" : [ "location" ], "text" : "Medfield", "updated" : { "$date" : 1360875762593 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "F1E3EC4A" } -{ "_id" : { "$oid" : "511d5115b92b2d0200000048" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360875797947 }, "id" : "511d5115b92b2d0200000048", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "For they went as if they had gone for their lives, for some considerable way, and then they made a stop, and chose some of their stoutest men, and sent them back to hold the English army in play whilst the rest escaped", "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 114, "end" : "/div[1]/p[20]", "endOffset" : 332, "_id" : { "$oid" : "511d5115b92b2d0200000049" } } ], "tags" : [], "text" : "Indians are running from the English.", "updated" : { "$date" : 1360875797947 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "D576C469" } -{ "_id" : { "$oid" : "511d5146b92b2d020000004a" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360875846481 }, "id" : "511d5146b92b2d020000004a", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "On that very day came the English army after them to this river, and saw the smoke of their wigwams, and yet this river put a stop to them. God did not give them courage or activity to go over after us.", "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 1145, "end" : "/div[1]/p[21]", "endOffset" : 1347, "_id" : { "$oid" : "511d5146b92b2d020000004b" } } ], "tags" : [], "text" : "English army gives up the chase at the river.", "updated" : { "$date" : 1360875846481 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "DD067F75" } -{ "_id" : { "$oid" : "511d51b027e8960200000018" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360875952593 }, "id" : "511d51b027e8960200000018", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "The cause of this rout was, as I thought, their espying some English scouts, who were thereabout.", "ranges" : [ { "start" : "/div[1]/p[27]", "startOffset" : 421, "end" : "/div[1]/p[27]", "endOffset" : 518, "_id" : { "$oid" : "511d51b027e8960200000019" } } ], "tags" : [], "text" : "English scouts are spotted.", "updated" : { "$date" : 1360875952593 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "C46C3090" } -{ "_id" : { "$oid" : "511d51d027e896020000001a" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360875984249 }, "id" : "511d51d027e896020000001a", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "But to return, we traveled on till night; and in the morning, we must go over the river to Philip's crew.", "ranges" : [ { "start" : "/div[1]/p[27]", "startOffset" : 1872, "end" : "/div[1]/p[27]", "endOffset" : 1977, "_id" : { "$oid" : "511d51d027e896020000001b" } } ], "tags" : [ "location", "metacomet" ], "text" : "Traveled through the night and crossed the river.", "updated" : { "$date" : 1360875984249 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "BB7FE38D" } -{ "_id" : { "$oid" : "511d528c27e8960200000020" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360876172113 }, "id" : "511d528c27e8960200000020", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "I desired them that they would carry me to Albany upon one of those horses, and sell me for powder", "ranges" : [ { "start" : "/div[1]/p[29]", "startOffset" : 122, "end" : "/div[1]/p[29]", "endOffset" : 220, "_id" : { "$oid" : "511d528c27e8960200000021" } } ], "tags" : [ "location" ], "text" : "She wants to be taken to Albany", "updated" : { "$date" : 1360876172113 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "DA8AAD8C" } -{ "_id" : { "$oid" : "511d52ef27e8960200000022" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360876271686 }, "id" : "511d52ef27e8960200000022", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "we must go five miles up the river, and then go over it.", "ranges" : [ { "start" : "/div[1]/p[31]", "startOffset" : 52, "end" : "/div[1]/p[31]", "endOffset" : 108, "_id" : { "$oid" : "511d52ef27e8960200000023" } } ], "tags" : [ "location" ], "text" : "Recrossing the river?", "updated" : { "$date" : 1360876271686 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "D467442A" } -{ "_id" : { "$oid" : "511d5311b92b2d0200000050" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360876305685 }, "id" : "511d5311b92b2d0200000050", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "Here lived a sorry Indian", "ranges" : [ { "start" : "/div[1]/p[31]", "startOffset" : 132, "end" : "/div[1]/p[31]", "endOffset" : 157, "_id" : { "$oid" : "511d5311b92b2d0200000051" } } ], "tags" : [ "location" ], "text" : "Stopped at place of an Indian (many indians?)", "updated" : { "$date" : 1360876305685 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "8E4A93BC" } -{ "_id" : { "$oid" : "511d534f27e8960200000026" }, "__v" : 1, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360876367633 }, "id" : "511d534f27e8960200000026", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "she had been gone three weeks into the Narragansett country to fetch corn", "ranges" : [ { "start" : "/div[1]/p[31]", "startOffset" : 725, "end" : "/div[1]/p[31]", "endOffset" : 798, "_id" : { "$oid" : "511d534f27e8960200000027" } } ], "tags" : [ "location" ], "text" : "They have corn stores in Narragansett country.", "updated" : { "$date" : 1360876376345 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "46CE967F" } -{ "_id" : { "$oid" : "511d53eeb92b2d0200000056" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360876526577 }, "id" : "511d53eeb92b2d0200000056", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "being hungry, I went again back to the place we were before at, to get something to eat", "ranges" : [ { "start" : "/div[1]/p[35]", "startOffset" : 199, "end" : "/div[1]/p[35]", "endOffset" : 286, "_id" : { "$oid" : "511d53eeb92b2d0200000057" } } ], "tags" : [], "text" : "She walks back to ninth remove to get food.", "updated" : { "$date" : 1360876526577 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "EB8FE2B2" } -{ "_id" : { "$oid" : "511d54d1b92b2d0200000058" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360876753780 }, "id" : "511d54d1b92b2d0200000058", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "a sudden my mistress gives out; she would go no further, but turn back again, and said I must go back again with her", "ranges" : [ { "start" : "/div[1]/p[40]", "startOffset" : 257, "end" : "/div[1]/p[40]", "endOffset" : 373, "_id" : { "$oid" : "511d54d1b92b2d0200000059" } } ], "tags" : [ "location" ], "text" : "Mistress demands to go back and she has to go with her.", "updated" : { "$date" : 1360876753780 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "193E20AD" } -{ "_id" : { "$oid" : "511d54ef27e8960200000030" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360876783520 }, "id" : "511d54ef27e8960200000030", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "he would not, but said he would go on, and come to us again in three days", "ranges" : [ { "start" : "/div[1]/p[40]", "startOffset" : 445, "end" : "/div[1]/p[40]", "endOffset" : 518, "_id" : { "$oid" : "511d54ef27e8960200000031" } } ], "tags" : [ "location" ], "text" : "Master continues onwards.", "updated" : { "$date" : 1360876783520 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "A28005A4" } -{ "_id" : { "$oid" : "511d561ab92b2d020000005e" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360877082827 }, "id" : "511d561ab92b2d020000005e", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "We were at this place and time about two miles from [the] Connecticut river.", "ranges" : [ { "start" : "/div[1]/p[40]", "startOffset" : 2528, "end" : "/div[1]/p[40]", "endOffset" : 2604, "_id" : { "$oid" : "511d561ab92b2d020000005f" } } ], "tags" : [ "location" ], "text" : "2 miles from the Connecticut river.", "updated" : { "$date" : 1360877082827 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "4A1C3ABF" } -{ "_id" : { "$oid" : "511d568ab92b2d0200000060" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360877194347 }, "id" : "511d568ab92b2d0200000060", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "He told me also, that awhile before, his master (together with other Indians) were going to the French for powder; but by the way the Mohawks met with them, and killed four of their company, which made the rest turn back again, for it might have been worse with him, had he been sold to the French, than it proved to be in his remaining with the Indians.", "ranges" : [ { "start" : "/div[1]/p[44]", "startOffset" : 361, "end" : "/div[1]/p[44]", "endOffset" : 715, "_id" : { "$oid" : "511d568ab92b2d0200000061" } } ], "tags" : [], "text" : "Her son's Indians attempt to trade with the French, but the Mohawks prevent them from doing so.", "updated" : { "$date" : 1360877194347 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "0BD0AEB8" } -{ "_id" : { "$oid" : "511d56d1b92b2d0200000066" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360877265950 }, "id" : "511d56d1b92b2d0200000066", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "My mistress's papoose was sick, and it died that night, and there was one benefit in it—that there was more room.", "ranges" : [ { "start" : "/div[1]/p[47]", "startOffset" : 53, "end" : "/div[1]/p[47]", "endOffset" : 166, "_id" : { "$oid" : "511d56d1b92b2d0200000067" } } ], "tags" : [], "text" : "Her mistress's baby dies, and she gets put out of the wigwam again.", "updated" : { "$date" : 1360877265950 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "E11B05E6" } -{ "_id" : { "$oid" : "511d56f327e8960200000034" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360877299499 }, "id" : "511d56f327e8960200000034", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "our course toward the Baytowns;", "ranges" : [ { "start" : "/div[1]/p[49]", "startOffset" : 60, "end" : "/div[1]/p[49]", "endOffset" : 92, "_id" : { "$oid" : "511d56f327e8960200000035" } } ], "tags" : [ "location" ], "text" : "headed towards Baytowns", "updated" : { "$date" : 1360877299499 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "397910BA" } -{ "_id" : { "$oid" : "511d571327e8960200000036" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360877331856 }, "id" : "511d571327e8960200000036", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "We came to Banquang river again that day, near which we abode a few days.", "ranges" : [ { "start" : "/div[1]/p[51]", "startOffset" : 225, "end" : "/div[1]/p[51]", "endOffset" : 298, "_id" : { "$oid" : "511d571327e8960200000037" } } ], "tags" : [ "location" ], "text" : "Banquaug river again", "updated" : { "$date" : 1360877331856 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "EF0E2B05" } -{ "_id" : { "$oid" : "511d574127e896020000003a" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360877377931 }, "id" : "511d574127e896020000003a", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "I must go to Wachusett to my master", "ranges" : [ { "start" : "/div[1]/p[53]", "startOffset" : 832, "end" : "/div[1]/p[53]", "endOffset" : 867, "_id" : { "$oid" : "511d574127e896020000003b" } } ], "tags" : [ "location" ], "text" : "She's Wachusett-bound, where her master is.", "updated" : { "$date" : 1360877377931 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "C3FA9E54" } -{ "_id" : { "$oid" : "511d578db92b2d020000006e" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360877453442 }, "id" : "511d578db92b2d020000006e", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "In this town there were four English children, captives; and one of them my own sister's.", "ranges" : [ { "start" : "/div[1]/p[57]", "startOffset" : 248, "end" : "/div[1]/p[57]", "endOffset" : 337, "_id" : { "$oid" : "511d578db92b2d020000006f" } } ], "tags" : [], "text" : "She comes across one of her nieces.", "updated" : { "$date" : 1360877453442 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "52D88F08" } -{ "_id" : { "$oid" : "511e8ce5e21ebc0200000002" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360956645813 }, "id" : "511e8ce5e21ebc0200000002", "permissions" : { "delete" : [ "alvarom@mit.edu" ], "update" : [ "alvarom@mit.edu" ], "admin" : [ "alvarom@mit.edu" ], "read" : [ "alvarom@mit.edu" ] }, "quote" : "split open his bowels", "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 765, "end" : "/div[1]/p[2]", "endOffset" : 786, "_id" : { "$oid" : "511e8ce5e21ebc0200000003" } } ], "tags" : [ "language" ], "text" : "Graphic detail, carnage", "updated" : { "$date" : 1360956645813 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "alvarom@mit.edu", "username" : "Alvaro M.", "uuid" : "C4995219" } -{ "__v" : 1, "_id" : { "$oid" : "511e8cfa27e8960200000040" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360956666506 }, "groups" : [], "id" : "511e8cfa27e8960200000040", "permissions" : { "delete" : [ "alvarom@mit.edu" ], "update" : [ "alvarom@mit.edu" ], "admin" : [ "alvarom@mit.edu" ], "read" : [ "alvarom@mit.edu" ] }, "quote" : "heathen", "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1124, "end" : "/div[1]/p[3]", "endOffset" : 1131, "_id" : { "$oid" : "51231a49e3e4120200000002" } } ], "tags" : [ "group-one", "language" ], "text" : "\"pagan\". Descriptions of Indians have a religious backdrop.", "updated" : { "$date" : 1361254985754 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "alvarom@mit.edu", "username" : "Alvaro M.", "uuid" : "7113ADF5" } -{ "_id" : { "$oid" : "511e8d0a27e8960200000042" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360956682190 }, "id" : "511e8d0a27e8960200000042", "permissions" : { "delete" : [ "alvarom@mit.edu" ], "update" : [ "alvarom@mit.edu" ], "admin" : [ "alvarom@mit.edu" ], "read" : [ "alvarom@mit.edu" ] }, "quote" : "blood running down to our heels", "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 2649, "end" : "/div[1]/p[3]", "endOffset" : 2680, "_id" : { "$oid" : "511e8d0a27e8960200000043" } } ], "tags" : [], "text" : "explicit reference to blood. Third or so mention in this passage", "updated" : { "$date" : 1360956682214 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "alvarom@mit.edu", "username" : "Alvaro M.", "uuid" : "41CE0FC6" } -{ "_id" : { "$oid" : "511e8d25e21ebc0200000004" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360956709858 }, "id" : "511e8d25e21ebc0200000004", "permissions" : { "delete" : [ "alvarom@mit.edu" ], "update" : [ "alvarom@mit.edu" ], "admin" : [ "alvarom@mit.edu" ], "read" : [ "alvarom@mit.edu" ] }, "quote" : "I must turn my back upon the town", "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 28, "end" : "/div[1]/p[10]", "endOffset" : 61, "_id" : { "$oid" : "511e8d25e21ebc0200000005" } } ], "tags" : [ "language" ], "text" : "note how removes/chapters begin in the present tense, and position the reader in the middle of the scene. Verb tense occasionally changes in the middle of a passage", "updated" : { "$date" : 1360956709858 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "alvarom@mit.edu", "username" : "Alvaro M.", "uuid" : "F34B6C2A" } -{ "_id" : { "$oid" : "511e8d4a27e8960200000044" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360956746274 }, "id" : "511e8d4a27e8960200000044", "permissions" : { "delete" : [ "alvarom@mit.edu" ], "update" : [ "alvarom@mit.edu" ], "admin" : [ "alvarom@mit.edu" ], "read" : [ "alvarom@mit.edu" ] }, "quote" : "knock your child in the head", "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 2568, "end" : "/div[1]/p[13]", "endOffset" : 2596, "_id" : { "$oid" : "511e8d4a27e8960200000045" } } ], "tags" : [], "text" : "repeated mention of \"knocking in the head\". Why?", "updated" : { "$date" : 1360956746274 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "alvarom@mit.edu", "username" : "Alvaro M.", "uuid" : "EAE80061" } -{ "_id" : { "$oid" : "511e8d69e21ebc0200000006" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360956777535 }, "id" : "511e8d69e21ebc0200000006", "permissions" : { "delete" : [ "alvarom@mit.edu" ], "update" : [ "alvarom@mit.edu" ], "admin" : [ "alvarom@mit.edu" ], "read" : [ "alvarom@mit.edu" ] }, "quote" : "and that Scripture came to my hand", "ranges" : [ { "start" : "/div[1]/p[31]", "startOffset" : 2280, "end" : "/div[1]/p[31]", "endOffset" : 2314, "_id" : { "$oid" : "511e8d69e21ebc0200000007" } } ], "tags" : [], "text" : "opens the Bible at random", "updated" : { "$date" : 1360956777535 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "alvarom@mit.edu", "username" : "Alvaro M.", "uuid" : "96AD2A23" } -{ "_id" : { "$oid" : "511e8d7de21ebc0200000008" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360956797974 }, "id" : "511e8d7de21ebc0200000008", "permissions" : { "delete" : [ "alvarom@mit.edu" ], "update" : [ "alvarom@mit.edu" ], "admin" : [ "alvarom@mit.edu" ], "read" : [ "alvarom@mit.edu" ] }, "quote" : "there was one benefit in it—that there was more room", "ranges" : [ { "start" : "/div[1]/p[47]", "startOffset" : 113, "end" : "/div[1]/p[47]", "endOffset" : 165, "_id" : { "$oid" : "511e8d7de21ebc0200000009" } } ], "tags" : [], "text" : "oddly matter-of-factly. The narrator has grown numb to death", "updated" : { "$date" : 1360956797974 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "alvarom@mit.edu", "username" : "Alvaro M.", "uuid" : "20C6B071" } -{ "_id" : { "$oid" : "511e8d8a27e8960200000046" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360956810929 }, "id" : "511e8d8a27e8960200000046", "permissions" : { "delete" : [ "alvarom@mit.edu" ], "update" : [ "alvarom@mit.edu" ], "admin" : [ "alvarom@mit.edu" ], "read" : [ "alvarom@mit.edu" ] }, "quote" : "tenth of February 1675", "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 8, "end" : "/div[1]/p[2]", "endOffset" : 30, "_id" : { "$oid" : "511e8d8a27e8960200000047" } } ], "tags" : [], "text" : "338 years ago today", "updated" : { "$date" : 1360956810929 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "alvarom@mit.edu", "username" : "Alvaro M.", "uuid" : "5EFBAB01" } -{ "_id" : { "$oid" : "511e8f6f27e8960200000048" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360957295034 }, "id" : "511e8f6f27e8960200000048", "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "quote" : "papoose", "ranges" : [ { "start" : "/div[1]/p[31]", "startOffset" : 429, "end" : "/div[1]/p[31]", "endOffset" : 436, "_id" : { "$oid" : "511e8f6f27e8960200000049" } } ], "tags" : [ "defnition" ], "text" : "A young North American Indian child", "updated" : { "$date" : 1360957295034 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "uuid" : "405272E2" } -{ "_id" : { "$oid" : "511e8f7e27e896020000004a" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360957310198 }, "id" : "511e8f7e27e896020000004a", "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "quote" : "sannup", "ranges" : [ { "start" : "/div[1]/p[28]", "startOffset" : 841, "end" : "/div[1]/p[28]", "endOffset" : 847, "_id" : { "$oid" : "511e8f7e27e896020000004b" } } ], "tags" : [ "definition" ], "text" : "A married male Native American", "updated" : { "$date" : 1360957310198 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "uuid" : "5772E9A4" } -{ "_id" : { "$oid" : "511e8f9f27e896020000004c" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360957343720 }, "id" : "511e8f9f27e896020000004c", "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "quote" : "I told them the skin was off my back, but I had no other comforting answer from them than this: that it would be no matter if my head were off too.", "ranges" : [ { "start" : "/div[1]/p[40]", "startOffset" : 2826, "end" : "/div[1]/p[40]", "endOffset" : 2973, "_id" : { "$oid" : "511e8f9f27e896020000004d" } } ], "tags" : [], "text" : "they want her alive?", "updated" : { "$date" : 1360957343720 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "uuid" : "D9705CE0" } -{ "_id" : { "$oid" : "511e8ff4e21ebc020000000a" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360957428634 }, "id" : "511e8ff4e21ebc020000000a", "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "quote" : "A squaw moved it down again, at which I looked up, and she threw a handful of ashes in mine eyes.", "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 1014, "end" : "/div[1]/p[42]", "endOffset" : 1111, "_id" : { "$oid" : "511e8ff4e21ebc020000000b" } } ], "tags" : [], "text" : "abuse", "updated" : { "$date" : 1360957428634 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "uuid" : "D0885823" } -{ "_id" : { "$oid" : "511e9011e21ebc020000000c" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360957457511 }, "id" : "511e9011e21ebc020000000c", "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "quote" : "About this time I began to think that all my hopes of restoration would come to nothing. I thought of the English army, and hoped for their coming, and being taken by them, but that failed. I hoped to be carried to Albany, as the Indians had discoursed before, but that failed also.", "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 1989, "end" : "/div[1]/p[42]", "endOffset" : 2271, "_id" : { "$oid" : "511e9011e21ebc020000000d" } } ], "tags" : [], "text" : "feelings of hopelessness and desperation", "updated" : { "$date" : 1360957457511 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "uuid" : "3F7FAE45" } -{ "_id" : { "$oid" : "511e902727e896020000004e" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360957479241 }, "id" : "511e902727e896020000004e", "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "quote" : "I told her I would not. Then my mistress bade me give it, but still I said no. The maid told me if I would not give her a piece, she would tear a piece off it. I told her I would tear her coat then. With that my mistress rises up, and take up a stick big enough to have killed me, and struck at me with it.", "ranges" : [ { "start" : "/div[1]/p[43]", "startOffset" : 162, "end" : "/div[1]/p[43]", "endOffset" : 468, "_id" : { "$oid" : "511e902727e896020000004f" } } ], "tags" : [], "text" : "conflict. example of Mary Rowlandson retaliating against her captors. ", "updated" : { "$date" : 1360957479241 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "uuid" : "7D5E27AF" } -{ "_id" : { "$oid" : "511e9036e21ebc020000000e" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360957494418 }, "id" : "511e9036e21ebc020000000e", "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "quote" : "Thus the Lord made that pleasant refreshing, which another time would have been an abomination.", "ranges" : [ { "start" : "/div[1]/p[57]", "startOffset" : 1206, "end" : "/div[1]/p[57]", "endOffset" : 1301, "_id" : { "$oid" : "511e9036e21ebc020000000f" } } ], "tags" : [], "text" : "justified stealing meat from a child", "updated" : { "$date" : 1360957494418 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "uuid" : "05A31759" } -{ "_id" : { "$oid" : "511e904a27e8960200000050" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360957514876 }, "id" : "511e904a27e8960200000050", "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "quote" : "I told them, they had as good knock me in head as starve me to death.", "ranges" : [ { "start" : "/div[1]/p[57]", "startOffset" : 1456, "end" : "/div[1]/p[57]", "endOffset" : 1525, "_id" : { "$oid" : "511e904a27e8960200000051" } } ], "tags" : [], "text" : "she would rather die quickly than slowly", "updated" : { "$date" : 1360957514876 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "uuid" : "1AB88F4F" } -{ "_id" : { "$oid" : "511e9062e21ebc0200000010" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360957538744 }, "id" : "511e9062e21ebc0200000010", "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "quote" : "squaw", "ranges" : [ { "start" : "/div[1]/p[59]", "startOffset" : 1131, "end" : "/div[1]/p[59]", "endOffset" : 1136, "_id" : { "$oid" : "511e9062e21ebc0200000011" } } ], "tags" : [ "definition" ], "text" : "An American Indian wife or woman", "updated" : { "$date" : 1360957538744 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "uuid" : "B2CD39F0" } -{ "_id" : { "$oid" : "511e907127e8960200000052" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360957553158 }, "id" : "511e907127e8960200000052", "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "quote" : "victuals", "ranges" : [ { "start" : "/div[1]/p[51]", "startOffset" : 426, "end" : "/div[1]/p[51]", "endOffset" : 434, "_id" : { "$oid" : "511e907127e8960200000053" } } ], "tags" : [ "definition" ], "text" : "food or provisions", "updated" : { "$date" : 1360957553158 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "uuid" : "FC0D45A8" } -{ "_id" : { "$oid" : "511e90bce21ebc0200000012" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360957628314 }, "id" : "511e90bce21ebc0200000012", "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "quote" : "Praying Indian", "ranges" : [ { "start" : "/div[1]/p[61]", "startOffset" : 1870, "end" : "/div[1]/p[61]", "endOffset" : 1884, "_id" : { "$oid" : "511e90bce21ebc0200000013" } } ], "tags" : [], "text" : "\"Praying Indians\" were punished ", "updated" : { "$date" : 1360957628314 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "uuid" : "8FD141E9" } -{ "_id" : { "$oid" : "511e90cbe21ebc0200000014" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360957643195 }, "id" : "511e90cbe21ebc0200000014", "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "quote" : "nine or ten weeks", "ranges" : [ { "start" : "/div[1]/p[63]", "startOffset" : 1529, "end" : "/div[1]/p[63]", "endOffset" : 1546, "_id" : { "$oid" : "511e90cbe21ebc0200000015" } } ], "tags" : [], "text" : "time elapsed", "updated" : { "$date" : 1360957643195 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "uuid" : "73CB4D1B" } -{ "_id" : { "$oid" : "511e90dfe21ebc0200000016" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360957663986 }, "id" : "511e90dfe21ebc0200000016", "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "quote" : "that I did not see (all the time I was among them) one man, woman, or child, die with hunger.", "ranges" : [ { "start" : "/div[1]/p[70]", "startOffset" : 402, "end" : "/div[1]/p[70]", "endOffset" : 495, "_id" : { "$oid" : "511e90dfe21ebc0200000017" } } ], "tags" : [], "text" : "demonstration of resiliency in nature", "updated" : { "$date" : 1360957663986 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "uuid" : "82A2F039" } -{ "_id" : { "$oid" : "511e90ee27e8960200000054" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360957678870 }, "id" : "511e90ee27e8960200000054", "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "quote" : "It is then hard work to persuade myself, that ever I should be satisfied with bread again", "ranges" : [ { "start" : "/div[1]/p[78]", "startOffset" : 569, "end" : "/div[1]/p[78]", "endOffset" : 658, "_id" : { "$oid" : "511e90ee27e8960200000055" } } ], "tags" : [], "text" : "her tastes have changed", "updated" : { "$date" : 1360957678870 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "uuid" : "A2EBC8CA" } -{ "_id" : { "$oid" : "511e90ff27e8960200000056" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360957695598 }, "id" : "511e90ff27e8960200000056", "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "quote" : "I have seen the extreme vanity of this world: One hour I have been in health, and wealthy, wanting nothing. But the next hour in sickness and wounds, and death, having nothing but sorrow and affliction.", "ranges" : [ { "start" : "/div[1]/p[79]", "startOffset" : 1, "end" : "/div[1]/p[79]", "endOffset" : 203, "_id" : { "$oid" : "511e90ff27e8960200000057" } } ], "tags" : [], "text" : "she observes how quickly life can change without warning", "updated" : { "$date" : 1360957695598 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "uuid" : "72BB6EDD" } -{ "_id" : { "$oid" : "511e9122e21ebc0200000018" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360957730217 }, "id" : "511e9122e21ebc0200000018", "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "quote" : "When I lived in prosperity, having the comforts of the world about me, my relations by me, my heart cheerful, and taking little care for anything, and yet seeing many, whom I preferred before myself, under many trials and afflictions, in sickness, weakness, poverty, losses, crosses, and cares of the world, I should be sometimes jealous least I should have my portion in this life, and that Scripture would come to my mind", "ranges" : [ { "start" : "/div[1]/p[80]", "startOffset" : 76, "end" : "/div[1]/p[80]", "endOffset" : 499, "_id" : { "$oid" : "511e9122e21ebc0200000019" } } ], "tags" : [], "text" : "she wished for affliction when she recognized that she was living in great prosperity", "updated" : { "$date" : 1360957730217 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "uuid" : "A0AB74EF" } -{ "_id" : { "$oid" : "511e9146e21ebc020000001a" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360957766741 }, "id" : "511e9146e21ebc020000001a", "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "quote" : "tenth of February 1675, came the Indians with great numbers upon Lancaster", "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 8, "end" : "/div[1]/p[2]", "endOffset" : 82, "_id" : { "$oid" : "511e9146e21ebc020000001b" } } ], "tags" : [], "text" : "King Philips War (1675-78)", "updated" : { "$date" : 1360957766741 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "uuid" : "69B6904E" } -{ "_id" : { "$oid" : "511e915e27e8960200000058" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360957790315 }, "id" : "511e915e27e8960200000058", "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "quote" : "But to return: the Indians laid hold of us, pulling me one way, and the children another, and said, \"Come go along with us\"; I told them they would kill me: they answered, if I were willing to go along with them, they would not hurt me.", "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 3508, "end" : "/div[1]/p[3]", "endOffset" : 3744, "_id" : { "$oid" : "511e915e27e8960200000059" } } ], "tags" : [], "text" : "she would not be killed, she would be held captive", "updated" : { "$date" : 1360957790315 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "uuid" : "4E416016" } -{ "_id" : { "$oid" : "511e918227e896020000005a" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360957826225 }, "id" : "511e918227e896020000005a", "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "quote" : "I had often before this said that if the Indians should come, I should choose rather to be killed by them than taken alive, but when it came to the trial my mind changed", "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 1, "end" : "/div[1]/p[5]", "endOffset" : 170, "_id" : { "$oid" : "511e918227e896020000005b" } } ], "tags" : [], "text" : "change of perspective. she had thought about being captured by Native Americans before?", "updated" : { "$date" : 1360957826225 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "uuid" : "D5DE5C57" } -{ "_id" : { "$oid" : "511e92bce21ebc020000001c" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958140340 }, "id" : "511e92bce21ebc020000001c", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "dolefulness", "ranges" : [ { "start" : "/div[1]/p[7]", "startOffset" : 969, "end" : "/div[1]/p[7]", "endOffset" : 980, "_id" : { "$oid" : "511e92bce21ebc020000001d" } } ], "tags" : [], "text" : "sadness", "updated" : { "$date" : 1360958140340 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "CDEF166E" } -{ "_id" : { "$oid" : "511e92c7e21ebc020000001e" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958151832 }, "id" : "511e92c7e21ebc020000001e", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "dismalness", "ranges" : [ { "start" : "/div[1]/p[7]", "startOffset" : 1008, "end" : "/div[1]/p[7]", "endOffset" : 1018, "_id" : { "$oid" : "511e92c7e21ebc020000001f" } } ], "tags" : [], "text" : "gloominess", "updated" : { "$date" : 1360958151832 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "EBDA3B49" } -{ "_id" : { "$oid" : "511e92d227e896020000005c" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958162334 }, "id" : "511e92d227e896020000005c", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "bereaved", "ranges" : [ { "start" : "/div[1]/p[7]", "startOffset" : 1080, "end" : "/div[1]/p[7]", "endOffset" : 1088, "_id" : { "$oid" : "511e92d227e896020000005d" } } ], "tags" : [], "text" : "a person who has suffered", "updated" : { "$date" : 1360958162334 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "41C1821F" } -{ "_id" : { "$oid" : "511e92e2e21ebc0200000020" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958178954 }, "id" : "511e92e2e21ebc0200000020", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "It is not my tongue, or pen, can express the sorrows of my heart, and bitterness of my spirit that I had at this departure", "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 143, "end" : "/div[1]/p[10]", "endOffset" : 265, "_id" : { "$oid" : "511e92e2e21ebc0200000021" } } ], "tags" : [], "text" : "describing how she can't explain it", "updated" : { "$date" : 1360958178954 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "3243D177" } -{ "_id" : { "$oid" : "511e92ef27e896020000005e" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958191981 }, "id" : "511e92ef27e896020000005e", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "God was with", "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 271, "end" : "/div[1]/p[10]", "endOffset" : 283, "_id" : { "$oid" : "511e92ef27e896020000005f" } } ], "tags" : [ "faith" ], "text" : "shows her faith", "updated" : { "$date" : 1360958191981 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "5643AF50" } -{ "_id" : { "$oid" : "511e9306e21ebc0200000022" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958214417 }, "id" : "511e9306e21ebc0200000022", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "the Lord renewed my strength still, and carried me along", "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 1030, "end" : "/div[1]/p[10]", "endOffset" : 1086, "_id" : { "$oid" : "511e9306e21ebc0200000023" } } ], "tags" : [ "faith" ], "text" : "", "updated" : { "$date" : 1360958214417 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "7D64E190" } -{ "_id" : { "$oid" : "511e931327e8960200000060" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958227432 }, "id" : "511e931327e8960200000060", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "lamentable", "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 283, "end" : "/div[1]/p[13]", "endOffset" : 293, "_id" : { "$oid" : "511e931327e8960200000061" } } ], "tags" : [], "text" : "unfortunate", "updated" : { "$date" : 1360958227432 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "6B4A8E7E" } -{ "_id" : { "$oid" : "511e9332e21ebc0200000024" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958258617 }, "id" : "511e9332e21ebc0200000024", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "it was easy for me to see how righteous it was with God to cut off the thread of my life and cast me out of His presence forever", "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 1091, "end" : "/div[1]/p[13]", "endOffset" : 1219, "_id" : { "$oid" : "511e9332e21ebc0200000025" } } ], "tags" : [ "faith" ], "text" : "", "updated" : { "$date" : 1360958258617 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "7F6DAD28" } -{ "_id" : { "$oid" : "511e9386e21ebc0200000026" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958342528 }, "id" : "511e9386e21ebc0200000026", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "I must and could lie down by my dead babe, side by side all the night after.", "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 857, "end" : "/div[1]/p[14]", "endOffset" : 933, "_id" : { "$oid" : "511e9386e21ebc0200000027" } } ], "tags" : [], "text" : "describing the death of her child", "updated" : { "$date" : 1360958342528 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "3DBA2D11" } -{ "_id" : { "$oid" : "511e93a8e21ebc0200000028" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958376552 }, "id" : "511e93a8e21ebc0200000028", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "I had one child dead, another in the wilderness, I knew not where, the third they would not let me come near to", "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 2596, "end" : "/div[1]/p[14]", "endOffset" : 2707, "_id" : { "$oid" : "511e93a8e21ebc0200000029" } } ], "tags" : [], "text" : "her children", "updated" : { "$date" : 1360958376552 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "D9DC2C70" } -{ "_id" : { "$oid" : "511e93c7e21ebc020000002a" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958407116 }, "id" : "511e93c7e21ebc020000002a", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "that there was no mercy for me, that the blessings were gone, and the curses come in their room, and that I had lost my opportunity", "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 5835, "end" : "/div[1]/p[14]", "endOffset" : 5966, "_id" : { "$oid" : "511e93c7e21ebc020000002b" } } ], "tags" : [ "faith" ], "text" : "describes her negative feelings turning positive after reading the Bible", "updated" : { "$date" : 1360958407116 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "2F53D199" } -{ "_id" : { "$oid" : "511e93f427e8960200000062" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958452531 }, "id" : "511e93f427e8960200000062", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "I saw a place where English cattle had been. That was comfort to me, such as it was", "ranges" : [ { "start" : "/div[1]/p[25]", "startOffset" : 404, "end" : "/div[1]/p[25]", "endOffset" : 487, "_id" : { "$oid" : "511e93f427e8960200000063" } } ], "tags" : [], "text" : "Why was the cattle comforting?", "updated" : { "$date" : 1360958452531 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "C5805510" } -{ "_id" : { "$oid" : "511e940627e8960200000064" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958470936 }, "id" : "511e940627e8960200000064", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "they got half of it away from me", "ranges" : [ { "start" : "/div[1]/p[25]", "startOffset" : 1394, "end" : "/div[1]/p[25]", "endOffset" : 1426, "_id" : { "$oid" : "511e940627e8960200000065" } } ], "tags" : [], "text" : "they were taking her food away from her", "updated" : { "$date" : 1360958470936 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "5F190118" } -{ "_id" : { "$oid" : "511e941e27e8960200000066" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958494084 }, "id" : "511e941e27e8960200000066", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "the first time to my remembrance, that I wept before them.", "ranges" : [ { "start" : "/div[1]/p[27]", "startOffset" : 2341, "end" : "/div[1]/p[27]", "endOffset" : 2399, "_id" : { "$oid" : "511e941e27e8960200000067" } } ], "tags" : [], "text" : "first time she cries before them", "updated" : { "$date" : 1360958494084 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "81B6DF07" } -{ "_id" : { "$oid" : "511e942c27e8960200000068" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958508555 }, "id" : "511e942c27e8960200000068", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "he asked me to make a cap for his boy", "ranges" : [ { "start" : "/div[1]/p[28]", "startOffset" : 523, "end" : "/div[1]/p[28]", "endOffset" : 560, "_id" : { "$oid" : "511e942c27e8960200000069" } } ], "tags" : [], "text" : "she begins knitting for things", "updated" : { "$date" : 1360958508555 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "450120AA" } -{ "_id" : { "$oid" : "511e943f27e896020000006a" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958527102 }, "id" : "511e943f27e896020000006a", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "I asked liberty to go and see him; they bade me go, and away I went; but quickly lost myself, traveling over hills and through swamps, and could not find the way to him", "ranges" : [ { "start" : "/div[1]/p[31]", "startOffset" : 1032, "end" : "/div[1]/p[31]", "endOffset" : 1200, "_id" : { "$oid" : "511e943f27e896020000006b" } } ], "tags" : [], "text" : "granted permission to go see her son", "updated" : { "$date" : 1360958527102 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "1B8A4EB1" } -{ "_id" : { "$oid" : "511e9452e21ebc020000002c" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958546017 }, "id" : "511e9452e21ebc020000002c", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "Christian friend was near him, to do any office of love for him, either for soul or body", "ranges" : [ { "start" : "/div[1]/p[31]", "startOffset" : 2015, "end" : "/div[1]/p[31]", "endOffset" : 2104, "_id" : { "$oid" : "511e9452e21ebc020000002d" } } ], "tags" : [ "faith" ], "text" : "", "updated" : { "$date" : 1360958546017 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "89FC18B8" } -{ "_id" : { "$oid" : "511e946ee21ebc020000002e" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958574859 }, "id" : "511e946ee21ebc020000002e", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "I hope all these wearisome steps that I have taken, are but a forewarning to me of the heavenly rest", "ranges" : [ { "start" : "/div[1]/p[37]", "startOffset" : 412, "end" : "/div[1]/p[37]", "endOffset" : 512, "_id" : { "$oid" : "511e946ee21ebc020000002f" } } ], "tags" : [], "text" : "does this mean she is waiting to die? \"heavenly rest\"", "updated" : { "$date" : 1360958574859 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "76AAD1CB" } -{ "_id" : { "$oid" : "511e947e27e896020000006c" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958590642 }, "id" : "511e947e27e896020000006c", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "Which stilled my spirit for the present", "ranges" : [ { "start" : "/div[1]/p[40]", "startOffset" : 883, "end" : "/div[1]/p[40]", "endOffset" : 922, "_id" : { "$oid" : "511e947e27e896020000006d" } } ], "tags" : [], "text" : "faith", "updated" : { "$date" : 1360958590642 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "352B647A" } -{ "_id" : { "$oid" : "511e9499e21ebc0200000030" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958617099 }, "id" : "511e9499e21ebc0200000030", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "samp", "ranges" : [ { "start" : "/div[1]/p[55]", "startOffset" : 1005, "end" : "/div[1]/p[55]", "endOffset" : 1009, "_id" : { "$oid" : "511e9499e21ebc0200000031" } } ], "tags" : [], "text" : "what does this mean?", "updated" : { "$date" : 1360958617099 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "5DDD80EE" } -{ "_id" : { "$oid" : "511e94a4e21ebc0200000032" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958628762 }, "id" : "511e94a4e21ebc0200000032", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "vehemency", "ranges" : [ { "start" : "/div[1]/p[61]", "startOffset" : 4397, "end" : "/div[1]/p[61]", "endOffset" : 4406, "_id" : { "$oid" : "511e94a4e21ebc0200000033" } } ], "tags" : [], "text" : "intense, passionate, violent", "updated" : { "$date" : 1360958628762 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "EE15A28E" } -{ "_id" : { "$oid" : "511e94b127e896020000006e" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958641603 }, "id" : "511e94b127e896020000006e", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "I began to think that all my hopes of restoration would come to nothing", "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 2005, "end" : "/div[1]/p[42]", "endOffset" : 2076, "_id" : { "$oid" : "511e94b127e896020000006f" } } ], "tags" : [], "text" : "doubting herself", "updated" : { "$date" : 1360958641603 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "85BA63CC" } -{ "_id" : { "$oid" : "511e94c027e8960200000070" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958656085 }, "id" : "511e94c027e8960200000070", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "I would tell the world what a blessing the Lord gave to such mean food", "ranges" : [ { "start" : "/div[1]/p[49]", "startOffset" : 586, "end" : "/div[1]/p[49]", "endOffset" : 656, "_id" : { "$oid" : "511e94c027e8960200000071" } } ], "tags" : [], "text" : "what does this mean?", "updated" : { "$date" : 1360958662628 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "2ACE2738" } -{ "_id" : { "$oid" : "511e94e127e8960200000072" }, "__v" : 1, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958689231 }, "id" : "511e94e127e8960200000072", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "Thou shalt eat and not be satisfied", "ranges" : [ { "start" : "/div[1]/p[51]", "startOffset" : 1044, "end" : "/div[1]/p[51]", "endOffset" : 1079, "_id" : { "$oid" : "511e94e127e8960200000073" } } ], "tags" : [ "faith" ], "text" : "justifying not being satisfied after her meal", "updated" : { "$date" : 1360958695035 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "49901120" } -{ "_id" : { "$oid" : "511e94fbe21ebc0200000034" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958715699 }, "id" : "511e94fbe21ebc0200000034", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "When thou passest through the waters, I will be with thee; and through the rivers, they shall not overflow thee", "ranges" : [ { "start" : "/div[1]/p[53]", "startOffset" : 481, "end" : "/div[1]/p[53]", "endOffset" : 592, "_id" : { "$oid" : "511e94fbe21ebc0200000035" } } ], "tags" : [ "faith" ], "text" : "", "updated" : { "$date" : 1360958715699 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "0BBAB0C4" } -{ "_id" : { "$oid" : "511e9515e21ebc0200000036" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958741603 }, "id" : "511e9515e21ebc0200000036", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "My heart skipped within me, thinking they had been Englishmen", "ranges" : [ { "start" : "/div[1]/p[53]", "startOffset" : 1397, "end" : "/div[1]/p[53]", "endOffset" : 1458, "_id" : { "$oid" : "511e9515e21ebc0200000037" } } ], "tags" : [], "text" : "false hope", "updated" : { "$date" : 1360958741603 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "0F296478" } -{ "_id" : { "$oid" : "511e952d27e8960200000074" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958765226 }, "id" : "511e952d27e8960200000074", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "Yes, and quickly you shall come to your master again; who had been gone from us three weeks.", "ranges" : [ { "start" : "/div[1]/p[59]", "startOffset" : 782, "end" : "/div[1]/p[59]", "endOffset" : 874, "_id" : { "$oid" : "511e952d27e8960200000075" } } ], "tags" : [], "text" : "hope", "updated" : { "$date" : 1360958765226 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "72410E42" } -{ "_id" : { "$oid" : "511e9545e21ebc0200000038" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958789934 }, "id" : "511e9545e21ebc0200000038", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "being by it raised in my hopes, that in God's due time there would be an end of this sorrowful hour", "ranges" : [ { "start" : "/div[1]/p[60]", "startOffset" : 1312, "end" : "/div[1]/p[60]", "endOffset" : 1411, "_id" : { "$oid" : "511e9545e21ebc0200000039" } } ], "tags" : [], "text" : "more hope", "updated" : { "$date" : 1360958789934 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "CEE8471A" } -{ "_id" : { "$oid" : "511e955de21ebc020000003a" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958813784 }, "id" : "511e955de21ebc020000003a", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "so wicked and cruel, as to wear a string about his neck", "ranges" : [ { "start" : "/div[1]/p[61]", "startOffset" : 2878, "end" : "/div[1]/p[61]", "endOffset" : 2933, "_id" : { "$oid" : "511e955de21ebc020000003b" } } ], "tags" : [], "text" : "describing horrible Indian actions", "updated" : { "$date" : 1360958813784 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "C02ED84D" } -{ "_id" : { "$oid" : "511e957a27e8960200000076" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958842176 }, "id" : "511e957a27e8960200000076", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "the governor would be so angry for his loss at Sudbury, that he would send no more about the captives", "ranges" : [ { "start" : "/div[1]/p[63]", "startOffset" : 344, "end" : "/div[1]/p[63]", "endOffset" : 445, "_id" : { "$oid" : "511e957a27e8960200000077" } } ], "tags" : [], "text" : "hope diminishing ", "updated" : { "$date" : 1360958842176 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "BA514A58" } -{ "_id" : { "$oid" : "511e95a127e8960200000078" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958881598 }, "id" : "511e95a127e8960200000078", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "They made use of their tyrannical power whilst they had it; but through the Lord's wonderful mercy, their time was now but short", "ranges" : [ { "start" : "/div[1]/p[63]", "startOffset" : 1795, "end" : "/div[1]/p[63]", "endOffset" : 1923, "_id" : { "$oid" : "511e95a127e8960200000079" } } ], "tags" : [], "text" : "wouldn't let her go see her daughter, who was only a mile away", "updated" : { "$date" : 1360958881598 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "E2791614" } -{ "_id" : { "$oid" : "511e95cfe21ebc020000003c" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958927965 }, "id" : "511e95cfe21ebc020000003c", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "God many times leaving us most in the dark, when deliverance is nearest", "ranges" : [ { "start" : "/div[1]/p[64]", "startOffset" : 5659, "end" : "/div[1]/p[64]", "endOffset" : 5730, "_id" : { "$oid" : "511e95cfe21ebc020000003d" } } ], "tags" : [ "faith" ], "text" : "", "updated" : { "$date" : 1360958927965 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "4DA20BDF" } -{ "_id" : { "$oid" : "511e95e327e896020000007a" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958947883 }, "id" : "511e95e327e896020000007a", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "God had an over-ruling hand in all those things", "ranges" : [ { "start" : "/div[1]/p[69]", "startOffset" : 480, "end" : "/div[1]/p[69]", "endOffset" : 527, "_id" : { "$oid" : "511e95e327e896020000007b" } } ], "tags" : [ "faith" ], "text" : "", "updated" : { "$date" : 1360958947883 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "FEB6CCD9" } -{ "_id" : { "$oid" : "511e95f9e21ebc020000003e" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958969000 }, "id" : "511e95f9e21ebc020000003e", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "The chief and commonest food was ground nuts. They eat also nuts and acorns, artichokes, lilly roots, ground beans, and several other weeds and roots, that I know not", "ranges" : [ { "start" : "/div[1]/p[72]", "startOffset" : 1, "end" : "/div[1]/p[72]", "endOffset" : 167, "_id" : { "$oid" : "511e95f9e21ebc020000003f" } } ], "tags" : [], "text" : "food they ate", "updated" : { "$date" : 1360958969000 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "957CED0E" } -{ "_id" : { "$oid" : "511e960f27e896020000007c" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360958991547 }, "id" : "511e960f27e896020000007c", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "eleven weeks and five days", "ranges" : [ { "start" : "/div[1]/p[74]", "startOffset" : 186, "end" : "/div[1]/p[74]", "endOffset" : 212, "_id" : { "$oid" : "511e960f27e896020000007d" } } ], "tags" : [], "text" : "total time she was taken", "updated" : { "$date" : 1360958991547 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "5C4DDEDD" } -{ "_id" : { "$oid" : "511e961f27e896020000007e" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360959007296 }, "id" : "511e961f27e896020000007e", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "boast how many towns they had destroyed", "ranges" : [ { "start" : "/div[1]/p[74]", "startOffset" : 629, "end" : "/div[1]/p[74]", "endOffset" : 668, "_id" : { "$oid" : "511e961f27e896020000007f" } } ], "tags" : [], "text" : "Indians would boast about their accomplishments", "updated" : { "$date" : 1360959007296 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "69AAA8DB" } -{ "_id" : { "$oid" : "511e963a27e8960200000080" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360959034729 }, "id" : "511e963a27e8960200000080", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "Our family being now gathered together", "ranges" : [ { "start" : "/div[1]/p[77]", "startOffset" : 1, "end" : "/div[1]/p[77]", "endOffset" : 39, "_id" : { "$oid" : "511e963a27e8960200000081" } } ], "tags" : [], "text" : "family back together", "updated" : { "$date" : 1360959034729 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "C0DC286B" } -{ "_id" : { "$oid" : "511e965627e8960200000082" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360959062600 }, "id" : "511e965627e8960200000082", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "It is then hard work to persuade myself, that ever I should be satisfied with bread again. But now we are fed with the finest of the wheat,", "ranges" : [ { "start" : "/div[1]/p[78]", "startOffset" : 569, "end" : "/div[1]/p[78]", "endOffset" : 708, "_id" : { "$oid" : "511e965627e8960200000083" } } ], "tags" : [], "text" : "appreciating what she has now", "updated" : { "$date" : 1360959062600 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "DCE61104" } -{ "_id" : { "$oid" : "511e966327e8960200000084" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360959075288 }, "id" : "511e966327e8960200000084", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "house furnished with love.", "ranges" : [ { "start" : "/div[1]/p[77]", "startOffset" : 621, "end" : "/div[1]/p[77]", "endOffset" : 647, "_id" : { "$oid" : "511e966327e8960200000085" } } ], "tags" : [], "text" : "friends came to help them", "updated" : { "$date" : 1360959075288 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "55CB8D69" } -{ "_id" : { "$oid" : "511e967de21ebc0200000040" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360959101679 }, "id" : "511e967de21ebc0200000040", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "affliction", "ranges" : [ { "start" : "/div[1]/p[67]", "startOffset" : 820, "end" : "/div[1]/p[67]", "endOffset" : 830, "_id" : { "$oid" : "511e967de21ebc0200000041" } } ], "tags" : [], "text" : "something that causes pain or suffering", "updated" : { "$date" : 1360959101679 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "079147FE" } -{ "_id" : { "$oid" : "511e969227e8960200000086" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360959122698 }, "id" : "511e969227e8960200000086", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "That they are the vanity of vanities, and vexation of spirit, that they are but a shadow, a blast, a bubble, and things of no continuance", "ranges" : [ { "start" : "/div[1]/p[80]", "startOffset" : 1338, "end" : "/div[1]/p[80]", "endOffset" : 1475, "_id" : { "$oid" : "511e969227e8960200000087" } } ], "tags" : [], "text" : "interesting comment", "updated" : { "$date" : 1360959122698 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "59D9ED3F" } -{ "_id" : { "$oid" : "511e96b027e8960200000088" }, "__v" : 0, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360959152218 }, "id" : "511e96b027e8960200000088", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "I have learned to look beyond present and smaller troubles, and to be quieted under them.", "ranges" : [ { "start" : "/div[1]/p[80]", "startOffset" : 1817, "end" : "/div[1]/p[80]", "endOffset" : 1906, "_id" : { "$oid" : "511e96b027e8960200000089" } } ], "tags" : [], "text" : "more appreciation", "updated" : { "$date" : 1360959152218 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "B8D9CAEE" } -{ "__v" : 0, "_id" : { "$oid" : "511e979b27e896020000008c" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360959387536 }, "id" : "511e979b27e896020000008c", "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "quote" : "split open his bowels", "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 765, "end" : "/div[1]/p[2]", "endOffset" : 786, "_id" : { "$oid" : "511e979b27e896020000008d" } } ], "tags" : [], "text" : "graphic", "updated" : { "$date" : 1360959387536 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "ersafai@mit.edu", "username" : "Eric S.", "uuid" : "0564546F" } -{ "__v" : 0, "_id" : { "$oid" : "511e97a7e21ebc0200000042" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360959399633 }, "id" : "511e97a7e21ebc0200000042", "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "quote" : "dolefulest", "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 69, "end" : "/div[1]/p[3]", "endOffset" : 79, "_id" : { "$oid" : "511e97a7e21ebc0200000043" } } ], "tags" : [], "text" : "saddest", "updated" : { "$date" : 1360959399633 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "ersafai@mit.edu", "username" : "Eric S.", "uuid" : "09B4C756" } -{ "__v" : 0, "_id" : { "$oid" : "511e97b027e896020000008e" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360959408996 }, "id" : "511e97b027e896020000008e", "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "quote" : "whither", "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 134, "end" : "/div[1]/p[10]", "endOffset" : 141, "_id" : { "$oid" : "511e97b027e896020000008f" } } ], "tags" : [], "text" : "where", "updated" : { "$date" : 1360959408996 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "ersafai@mit.edu", "username" : "Eric S.", "uuid" : "AC3E23CC" } -{ "__v" : 0, "_id" : { "$oid" : "511e97bc27e8960200000090" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360959420626 }, "id" : "511e97bc27e8960200000090", "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "quote" : "my son came to me", "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 3434, "end" : "/div[1]/p[14]", "endOffset" : 3451, "_id" : { "$oid" : "511e97bc27e8960200000091" } } ], "tags" : [], "text" : "she has a son", "updated" : { "$date" : 1360959420626 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "ersafai@mit.edu", "username" : "Eric S.", "uuid" : "2F3232B6" } -{ "__v" : 0, "_id" : { "$oid" : "511e97df27e8960200000092" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360959455787 }, "id" : "511e97df27e8960200000092", "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "quote" : "See now that I, even I am he, and there is no god with me, I kill and I make alive, I wound and I heal, neither is there any can deliver out of my hand", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 514, "end" : "/div[1]/p[1]", "endOffset" : 665, "_id" : { "$oid" : "511e97df27e8960200000093" } } ], "tags" : [], "text" : "interesting biblical reference", "updated" : { "$date" : 1360959455787 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "ersafai@mit.edu", "username" : "Eric S.", "uuid" : "FA6CA8EE" } -{ "__v" : 0, "_id" : { "$oid" : "511e97ee27e8960200000094" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360959470383 }, "id" : "511e97ee27e8960200000094", "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "quote" : "Now is the dreadful hour come", "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 861, "end" : "/div[1]/p[3]", "endOffset" : 890, "_id" : { "$oid" : "511e97ee27e8960200000095" } } ], "tags" : [], "text" : "what is the dreadful hour?", "updated" : { "$date" : 1360959470383 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "ersafai@mit.edu", "username" : "Eric S.", "uuid" : "E020C5F7" } -{ "__v" : 0, "_id" : { "$oid" : "511e980ce21ebc0200000044" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360959500191 }, "id" : "511e980ce21ebc0200000044", "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "quote" : "I hope she is reaping the fruit of her good labors, being faithful to the service of God in her place", "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 3078, "end" : "/div[1]/p[3]", "endOffset" : 3179, "_id" : { "$oid" : "511e980ce21ebc0200000045" } } ], "tags" : [], "text" : "very puritan, as we discussed on Monday", "updated" : { "$date" : 1360959500191 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "ersafai@mit.edu", "username" : "Eric S.", "uuid" : "E1ABCE7B" } -{ "__v" : 0, "_id" : { "$oid" : "511e981727e8960200000096" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360959511484 }, "id" : "511e981727e8960200000096", "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "quote" : "More than twenty years after, I have heard her tell how sweet and comfortable that place was to her", "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 3407, "end" : "/div[1]/p[3]", "endOffset" : 3506, "_id" : { "$oid" : "511e981727e8960200000097" } } ], "tags" : [], "text" : "What?", "updated" : { "$date" : 1360959511484 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "ersafai@mit.edu", "username" : "Eric S.", "uuid" : "30C88F09" } -{ "__v" : 0, "_id" : { "$oid" : "511e982627e8960200000098" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360959526083 }, "id" : "511e982627e8960200000098", "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "quote" : "What, will you love English men still?", "ranges" : [ { "start" : "/div[1]/p[7]", "startOffset" : 416, "end" : "/div[1]/p[7]", "endOffset" : 454, "_id" : { "$oid" : "511e982627e8960200000099" } } ], "tags" : [], "text" : "Are they asking if she intends to still love an English man? In other words, the only way for her to sleep in a tipi is to sleep with an Indian ", "updated" : { "$date" : 1360959526083 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "ersafai@mit.edu", "username" : "Eric S.", "uuid" : "55717C59" } -{ "__v" : 1, "_id" : { "$oid" : "511e983827e896020000009a" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360959544738 }, "groups" : [], "id" : "511e983827e896020000009a", "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "quote" : "so it must be, that I must sit all this cold winter night upon the cold snowy ground, with my sick child in my arms, looking that every hour would be the last of its life; and having no Christian friend near me, either to comfort or help me", "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 355, "end" : "/div[1]/p[11]", "endOffset" : 596, "_id" : { "$oid" : "511fcb59f13c1a0200000016" } } ], "tags" : [ "captivity" ], "text" : "she thinks that this suffering is designed for her and her alone, she appreciates the solitude and sees it as a chance to become closer to her religion since it is a significant affliction", "updated" : { "$date" : 1361038169200 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "ersafai@mit.edu", "username" : "Eric S.", "uuid" : "C867975E" } -{ "__v" : 0, "_id" : { "$oid" : "511e9853e21ebc0200000046" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360959571232 }, "id" : "511e9853e21ebc0200000046", "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "quote" : "your master will knock your child in the head,\" and then a second, and then a third, \"your master will quickly knock your child in the head.", "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 2457, "end" : "/div[1]/p[13]", "endOffset" : 2597, "_id" : { "$oid" : "511e9853e21ebc0200000047" } } ], "tags" : [], "text" : "is there any comfort gained from having her child \"quickly\" knocked in the head? Is this their attempts to make things a little (very little) easier/", "updated" : { "$date" : 1360959571232 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "ersafai@mit.edu", "username" : "Eric S.", "uuid" : "F9433A46" } -{ "__v" : 0, "_id" : { "$oid" : "511e9868e21ebc0200000048" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360959592137 }, "id" : "511e9868e21ebc0200000048", "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "quote" : "This was the comfort I had from them", "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 1, "end" : "/div[1]/p[14]", "endOffset" : 37, "_id" : { "$oid" : "511e9868e21ebc0200000049" } } ], "tags" : [], "text" : "yes", "updated" : { "$date" : 1360959592137 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "ersafai@mit.edu", "username" : "Eric S.", "uuid" : "69CCF2B4" } -{ "__v" : 0, "_id" : { "$oid" : "511e987927e896020000009c" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360959609781 }, "id" : "511e987927e896020000009c", "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "quote" : "I have thought since of the wonderful goodness of God to me in preserving me in the use of my reason and senses in that distressed time, that I did not use wicked and violent means to end my own miserable life", "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 934, "end" : "/div[1]/p[14]", "endOffset" : 1143, "_id" : { "$oid" : "511e987927e896020000009d" } } ], "tags" : [], "text" : "thanking God for the strength not to commit suicide; it's interesting that she refers to her emotions as opposed to actually expressing them", "updated" : { "$date" : 1360959609781 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "ersafai@mit.edu", "username" : "Eric S.", "uuid" : "B7F97B74" } -{ "__v" : 2, "_id" : { "$oid" : "511e988d27e896020000009e" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1360959629087 }, "groups" : [], "id" : "511e988d27e896020000009e", "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "quote" : "I went to see my daughter Mary", "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 2155, "end" : "/div[1]/p[14]", "endOffset" : 2185, "_id" : { "$oid" : "511fcc874b945a0200000012" } } ], "tags" : [ "captivity" ], "text" : "2nd daughter, still alive", "updated" : { "$date" : 1361038477994 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "ersafai@mit.edu", "username" : "Eric S.", "uuid" : "65B68E53" } -{ "__v" : 0, "_id" : { "$oid" : "511fab9af13c1a0200000002" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361030042422 }, "id" : "511fab9af13c1a0200000002", "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "quote" : "one-eyed John", "ranges" : [ { "start" : "/div[1]/p[8]", "startOffset" : 184, "end" : "/div[1]/p[8]", "endOffset" : 197, "_id" : { "$oid" : "511fab9af13c1a0200000003" } } ], "tags" : [], "text" : "aka, Monoco. Leader of previous attack on Lancaster in August 1675.", "updated" : { "$date" : 1361031964683 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "uuid" : "DC2DB1A0" } -{ "id" : "511fb36d4b945a0200000002", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "garrison's were created for better defenses after last attack (Salisbury)", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "garrison", "uuid" : "AD8A4149", "_id" : { "$oid" : "511fb36d4b945a0200000002" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1629, "end" : "/div[1]/p[3]", "endOffset" : 1637, "_id" : { "$oid" : "511fb36d4b945a0200000003" } } ], "updated" : { "$date" : 1361032045370 }, "created" : { "$date" : 1361032045370 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511fb86af13c1a0200000005", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Summary: The Indians shot at her house, set it on fire. They're trapped -- they'll be shot if they leave, and burn to death if they stay. She leaves the house and gets shot.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "At length they came and beset our own house", "uuid" : "05A8E0BD", "_id" : { "$oid" : "511fb86af13c1a0200000005" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 1, "end" : "/div[1]/p[3]", "endOffset" : 44, "_id" : { "$oid" : "511fb86af13c1a0200000006" } } ], "updated" : { "$date" : 1361033322695 }, "created" : { "$date" : 1361033322695 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511fb983f13c1a0200000008", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "Describing previous attack. Look into Marlborough's Praying Indians.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Those seven", "uuid" : "44A9D442", "_id" : { "$oid" : "511fb983f13c1a0200000008" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[8]", "startOffset" : 1, "end" : "/div[1]/p[8]", "endOffset" : 13, "_id" : { "$oid" : "511fb983f13c1a0200000009" } } ], "updated" : { "$date" : 1361033603679 }, "created" : { "$date" : 1361033603679 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511fba47f13c1a020000000a", "user" : "klawhorn@mit.edu", "username" : "Jay L.", "text" : "English Captive from Roxbury", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Robert Pepper", "uuid" : "987A1348", "_id" : { "$oid" : "511fba47f13c1a020000000a" }, "permissions" : { "delete" : [ "klawhorn@mit.edu" ], "update" : [ "klawhorn@mit.edu" ], "admin" : [ "klawhorn@mit.edu" ], "read" : [ "klawhorn@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 1373, "end" : "/div[1]/p[13]", "endOffset" : 1386, "_id" : { "$oid" : "511fba47f13c1a020000000b" } } ], "updated" : { "$date" : 1361033799820 }, "created" : { "$date" : 1361033799820 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511fc90f4b945a020000000c", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "killed mother, father, and baby, took other people away, who were they?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "There were five persons taken in one house; the father, and the mother and a sucking child, they knocked on the head; the other two they took and carried away alive", "uuid" : "32B19C0F", "_id" : { "$oid" : "511fc90f4b945a020000000c" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[2]", "startOffset" : 235, "end" : "/div[1]/p[2]", "endOffset" : 399, "_id" : { "$oid" : "511fc90f4b945a020000000d" } } ], "updated" : { "$date" : 1361037583155 }, "created" : { "$date" : 1361037583155 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511fc9a1f13c1a0200000010", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "why do they always take off the clothing?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "stripping off his clothes", "uuid" : "D029BC45", "_id" : { "$oid" : "511fc9a1f13c1a0200000010" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 2270, "end" : "/div[1]/p[3]", "endOffset" : 2295, "_id" : { "$oid" : "511fc9a1f13c1a0200000011" } } ], "updated" : { "$date" : 1361037729194 }, "created" : { "$date" : 1361037729194 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511fc9eaf13c1a0200000012", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "what made them spare her life?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "But to return: the Indians laid hold of us, pulling me one way, and the children another, and said, \"Come go along with us\"; I told them they would kill me: they answered, if I were willing to go along with them, they would not hurt me.", "uuid" : "7609AD81", "_id" : { "$oid" : "511fc9eaf13c1a0200000012" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 3508, "end" : "/div[1]/p[3]", "endOffset" : 3744, "_id" : { "$oid" : "511fc9eaf13c1a0200000013" } } ], "updated" : { "$date" : 1361037802555 }, "created" : { "$date" : 1361037802555 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "511fca1f4b945a020000000e" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361037855024 }, "id" : "511fca1f4b945a020000000e", "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "quote" : "\"And I only am escaped alone to tell the News\" (Job 1.15)", "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 287, "end" : "/div[1]/p[4]", "endOffset" : 344, "_id" : { "$oid" : "511fca1f4b945a020000000f" } } ], "tags" : [ "captivity" ], "text" : "did the N. Am. want other settlements to know about their raid?", "updated" : { "$date" : 1361037864790 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "ersafai@mit.edu", "username" : "Eric S.", "uuid" : "0347187F" } -{ "id" : "511fca4d4b945a0200000010", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "I had often before this said that if the Indians should come, I should choose rather to be killed by them than taken alive, but when it came to the trial my mind changed; their glittering weapons so daunted my spirit, that I chose rather to go along with those (as I may say) ravenous beasts, than that moment to end my days; and that I may the better declare what happened to me during that grievous captivity, I shall particularly speak of the several removes we had up and down the wilderness", "uuid" : "B11D5A44", "_id" : { "$oid" : "511fca4d4b945a0200000010" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 1, "end" : "/div[1]/p[5]", "endOffset" : 496, "_id" : { "$oid" : "511fca4d4b945a0200000011" } } ], "updated" : { "$date" : 1361037901772 }, "created" : { "$date" : 1361037901772 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511fcaf7f13c1a0200000014", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Little do many think what is the savageness and brutishness of this barbarous enemy, Ay, even those that seem to profess more than others among them, when the English have fallen into their hands.", "uuid" : "4E507CE2", "_id" : { "$oid" : "511fcaf7f13c1a0200000014" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[7]", "startOffset" : 1692, "end" : "/div[1]/p[7]", "endOffset" : 1888, "_id" : { "$oid" : "511fcaf7f13c1a0200000015" } } ], "updated" : { "$date" : 1361038071478 }, "created" : { "$date" : 1361038071478 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511fcbd0f13c1a0200000017", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "they let prisoners converse with each other?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "This day there came to me one Robert Pepper (a man belonging to Roxbury) who was taken in Captain Beers's fight, and had been now a considerable time with the Indians", "uuid" : "3E90C4E4", "_id" : { "$oid" : "511fcbd0f13c1a0200000017" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 1343, "end" : "/div[1]/p[13]", "endOffset" : 1509, "_id" : { "$oid" : "511fcbd0f13c1a0200000018" } } ], "updated" : { "$date" : 1361038288349 }, "created" : { "$date" : 1361038288349 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511fcd1a4b945a0200000013", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "did he walk there freely?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "that he was amongst a smaller parcel of Indians, whose place was about six miles off", "uuid" : "F1A24919", "_id" : { "$oid" : "511fcd1a4b945a0200000013" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 3599, "end" : "/div[1]/p[14]", "endOffset" : 3684, "_id" : { "$oid" : "511fcd1a4b945a0200000014" } } ], "updated" : { "$date" : 1361038618087 }, "created" : { "$date" : 1361038618087 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511fcd3ff13c1a0200000019", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "indians?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Ind.", "uuid" : "C818DD07", "_id" : { "$oid" : "511fcd3ff13c1a0200000019" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 4103, "end" : "/div[1]/p[14]", "endOffset" : 4107, "_id" : { "$oid" : "511fcd3ff13c1a020000001a" } } ], "updated" : { "$date" : 1361038655999 }, "created" : { "$date" : 1361038655999 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511fcd8af13c1a020000001b", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "why is he giving a prisoner spoils?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "One of the Indians that came from Medfield fight, had brought some plunder, came to me, and asked me, if I would have a Bible, he had got one in his basket. I was glad of it, and asked him, whether he thought the Indians would let me read? He answered, yes. So I took the Bible", "uuid" : "628459E6", "_id" : { "$oid" : "511fcd8af13c1a020000001b" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 5384, "end" : "/div[1]/p[14]", "endOffset" : 5661, "_id" : { "$oid" : "511fcd8af13c1a020000001c" } } ], "updated" : { "$date" : 1361038730987 }, "created" : { "$date" : 1361038730987 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511fce534b945a0200000015", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "that's messed up", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Amongst them also was that poor woman before mentioned, who came to a sad end, as some of the company told me in my travel: she having much grief upon her spirit about her miserable condition, being so near her time, she would be often asking the Indians to let her go home; they not being willing to that, and yet vexed with her importunity, gathered a great company together about her and stripped her naked, and set her in the midst of them, and when they had sung and danced about her (in their hellish manner) as long as they pleased they knocked her on head, and the child in her arms with her. When they had done that they made a fire and put them both into it, and told the other children that were with them that if they attempted to go home, they would serve them in like manner", "uuid" : "92E0DF18", "_id" : { "$oid" : "511fce534b945a0200000015" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[17]", "startOffset" : 287, "end" : "/div[1]/p[17]", "endOffset" : 1075, "_id" : { "$oid" : "511fce534b945a0200000016" } } ], "updated" : { "$date" : 1361038931742 }, "created" : { "$date" : 1361038931742 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511fce924b945a0200000017", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "who?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Jeh", "uuid" : "F853311E", "_id" : { "$oid" : "511fce924b945a0200000017" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 349, "end" : "/div[1]/p[20]", "endOffset" : 352, "_id" : { "$oid" : "511fce924b945a0200000018" } } ], "updated" : { "$date" : 1361038994042 }, "created" : { "$date" : 1361038994042 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511fcebff13c1a020000001d", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "didn't carry a whole lot", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "I carried only my knitting work and two quarts of parched meal", "uuid" : "2BC99C03", "_id" : { "$oid" : "511fcebff13c1a020000001d" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 1048, "end" : "/div[1]/p[20]", "endOffset" : 1110, "_id" : { "$oid" : "511fcebff13c1a020000001e" } } ], "updated" : { "$date" : 1361039039016 }, "created" : { "$date" : 1361039039016 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511fcf0a4b945a0200000019", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "The first week of my being among them I hardly ate any thing; the second week I found my stomach grow very faint for want of something; and yet it was very hard to get down their filthy trash; but the third week, though I could think how formerly my stomach would turn against this or that, and I could starve and die before I could eat such things, yet they were sweet and savory to my taste", "uuid" : "8D9357EE", "_id" : { "$oid" : "511fcf0a4b945a0200000019" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 1, "end" : "/div[1]/p[21]", "endOffset" : 393, "_id" : { "$oid" : "511fcf0a4b945a020000001a" } } ], "updated" : { "$date" : 1361039114853 }, "created" : { "$date" : 1361039114853 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511fcf67f13c1a020000001f", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Oh the experience that I have had of the goodness of God, to me and mine!", "uuid" : "17F18DD9", "_id" : { "$oid" : "511fcf67f13c1a020000001f" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[23]", "startOffset" : 1115, "end" : "/div[1]/p[23]", "endOffset" : 1188, "_id" : { "$oid" : "511fcf67f13c1a0200000020" } } ], "updated" : { "$date" : 1361039207778 }, "created" : { "$date" : 1361039207778 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511fd02e4b945a020000001b", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "why would she be troubled by this?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Myself got two ears of Indian corn, and whilst I did but turn my back, one of them was stolen from me, which much troubled me", "uuid" : "8AF21119", "_id" : { "$oid" : "511fd02e4b945a020000001b" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[25]", "startOffset" : 988, "end" : "/div[1]/p[25]", "endOffset" : 1113, "_id" : { "$oid" : "511fd02e4b945a020000001c" } } ], "updated" : { "$date" : 1361039406387 }, "created" : { "$date" : 1361039406387 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511fd062f13c1a0200000021", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "who?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "King Philip", "uuid" : "9F648023", "_id" : { "$oid" : "511fd062f13c1a0200000021" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[27]", "startOffset" : 81, "end" : "/div[1]/p[27]", "endOffset" : 92, "_id" : { "$oid" : "511fd062f13c1a0200000022" } } ], "updated" : { "$date" : 1361039458057 }, "created" : { "$date" : 1361039458057 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511fd106f13c1a0200000023", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "they are surprisingly considerate upon her weeping", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Then my heart began to fail: and I fell aweeping, which was the first time to my remembrance, that I wept before them. Although I had met with so much affliction, and my heart was many times ready to break, yet could I not shed one tear in their sight; but rather had been all this while in a maze, and like one astonished. But now I may say as Psalm 137.1, \"By the Rivers of Babylon, there we sate down: yea, we wept when we remembered Zion.\" There one of them asked me why I wept. I could hardly tell what to say: Yet I answered, they would kill me. \"No,\" said he, \"none will hurt you.\" Then came one of them and gave me two spoonfuls of meal to comfort me, and another gave me half a pint of peas; which was more worth than many bushels at another time.", "uuid" : "77B74B67", "_id" : { "$oid" : "511fd106f13c1a0200000023" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[27]", "startOffset" : 2281, "end" : "/div[1]/p[27]", "endOffset" : 3037, "_id" : { "$oid" : "511fd106f13c1a0200000024" } } ], "updated" : { "$date" : 1361039622770 }, "created" : { "$date" : 1361039622770 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511fd186f13c1a0200000025", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "it almost seems that she is becoming a part of the community", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "During my abode in this place, Philip spake to me to make a shirt for his boy, which I did, for which he gave me a shilling. I offered the money to my master, but he bade me keep it; and with it I bought a piece of horse flesh. Afterwards he asked me to make a cap for his boy, for which he invited me to dinner. I went, and he gave me a pancake, about as big as two fingers. It was made of parched wheat, beaten, and fried in bear's grease, but I thought I never tasted pleasanter meat in my life. There was a squaw who spake to me to make a shirt for her sannup, for which she gave me a piece of bear. Another asked me to knit a pair of stockings, for which she gave me a quart of peas. I boiled my peas and bear together, and invited my master and mistress to dinner; but the proud gossip, because I served them both in one dish, would eat nothing, except one bit that he gave her upon the point of his knife", "uuid" : "978C4982", "_id" : { "$oid" : "511fd186f13c1a0200000025" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[28]", "startOffset" : 284, "end" : "/div[1]/p[28]", "endOffset" : 1195, "_id" : { "$oid" : "511fd186f13c1a0200000026" } } ], "updated" : { "$date" : 1361039750858 }, "created" : { "$date" : 1361039750858 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511fd1c0f13c1a0200000027", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "is this why she can't run away", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "I was utterly hopeless of getting home on foot, the way that I came", "uuid" : "31DF6C6C", "_id" : { "$oid" : "511fd1c0f13c1a0200000027" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[29]", "startOffset" : 260, "end" : "/div[1]/p[29]", "endOffset" : 327, "_id" : { "$oid" : "511fd1c0f13c1a0200000028" } } ], "updated" : { "$date" : 1361039808608 }, "created" : { "$date" : 1361039808608 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511fd2354b945a020000001d", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "he gave her a knife?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "At last he told me if I would make another shirt, for a papoose not yet born, he would give me a knife, which he did when I had done it", "uuid" : "0C922D66", "_id" : { "$oid" : "511fd2354b945a020000001d" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[31]", "startOffset" : 373, "end" : "/div[1]/p[31]", "endOffset" : 508, "_id" : { "$oid" : "511fd2354b945a020000001e" } } ], "updated" : { "$date" : 1361039925839 }, "created" : { "$date" : 1361039925839 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "511fd2604b945a020000001f", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "they let her walk off oon her own?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "My son being now about a mile from me, I asked liberty to go and see him; they bade me go, and away I went", "uuid" : "EC83D364", "_id" : { "$oid" : "511fd2604b945a020000001f" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[31]", "startOffset" : 993, "end" : "/div[1]/p[31]", "endOffset" : 1099, "_id" : { "$oid" : "511fd2604b945a0200000020" } } ], "updated" : { "$date" : 1361039968538 }, "created" : { "$date" : 1361039968538 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51203c24814aad0200000002", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "interesting dynamic", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "I went into one and there found a squaw who showed herself very kind to me, and gave me a piece of bear. I put it into my pocket, and came home, but could not find an opportunity to broil it, for fear they would get it from me, and there it lay all that day and night in my stinking pocket. In the morning I went to the same squaw, who had a kettle of ground nuts boiling. I asked her to let me boil my piece of bear in her kettle, which she did, and gave me some ground nuts to eat with it: and I cannot but think how pleasant it was to me", "uuid" : "949E702D", "_id" : { "$oid" : "51203c24814aad0200000002" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[32]", "startOffset" : 98, "end" : "/div[1]/p[32]", "endOffset" : 638, "_id" : { "$oid" : "51203c24814aad0200000003" } } ], "updated" : { "$date" : 1361067044339 }, "created" : { "$date" : 1361067044339 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51203c424b945a0200000021", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "ne bitter cold day I could find no room to sit down before the fire. I went out, and could not tell what to do, but I went in to another wigwam, where they were also sitting round the fire, but the squaw laid a skin for me, and bid me sit down, and gave me some ground nuts, and bade me come again; and told me they would buy me, if they were able, and yet these were strangers to me that I never saw before.", "uuid" : "79BC808C", "_id" : { "$oid" : "51203c424b945a0200000021" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[33]", "startOffset" : 2, "end" : "/div[1]/p[33]", "endOffset" : 410, "_id" : { "$oid" : "51203c424b945a0200000022" } } ], "updated" : { "$date" : 1361067074706 }, "created" : { "$date" : 1361067074706 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5120403e814aad0200000004", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "good summary", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Sometimes I met with favor, and sometimes with nothing but frowns.", "uuid" : "F40BA1CC", "_id" : { "$oid" : "5120403e814aad0200000004" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[35]", "startOffset" : 550, "end" : "/div[1]/p[35]", "endOffset" : 617, "_id" : { "$oid" : "5120403e814aad0200000005" } } ], "updated" : { "$date" : 1361068094818 }, "created" : { "$date" : 1361068094818 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51204130814aad0200000006", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "went to one wigwam, and they told me they had no room. Then I went to another, and they said the same; at last an old Indian bade me to come to him, and his squaw gave me some ground nuts; she gave me also something to lay under my head, and a good fire we had", "uuid" : "31629713", "_id" : { "$oid" : "51204130814aad0200000006" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[40]", "startOffset" : 2080, "end" : "/div[1]/p[40]", "endOffset" : 2341, "_id" : { "$oid" : "51204130814aad0200000007" } } ], "updated" : { "$date" : 1361068336602 }, "created" : { "$date" : 1361068336602 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512041824b945a0200000023", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "A squaw moved it down again, at which I looked up, and she threw a handful of ashes in mine eyes", "uuid" : "74120554", "_id" : { "$oid" : "512041824b945a0200000023" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 1014, "end" : "/div[1]/p[42]", "endOffset" : 1110, "_id" : { "$oid" : "512041824b945a0200000024" } } ], "updated" : { "$date" : 1361068418514 }, "created" : { "$date" : 1361068418514 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512041ad4b945a0200000025", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "thinking of escape", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "I should suddenly leap up and run out, as if I had been at home, forgetting where I was, and what my condition was; but when I was without, and saw nothing but wilderness, and woods, and a company of barbarous heathens,", "uuid" : "F5BC9329", "_id" : { "$oid" : "512041ad4b945a0200000025" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 1566, "end" : "/div[1]/p[42]", "endOffset" : 1785, "_id" : { "$oid" : "512041ad4b945a0200000026" } } ], "updated" : { "$date" : 1361068461810 }, "created" : { "$date" : 1361068461810 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512042274b945a0200000027", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "As I was sitting once in the wigwam here, Philip's maid came in with the child in her arms, and asked me to give her a piece of my apron, to make a flap for it. I told her I would not. Then my mistress bade me give it, but still I said no. The maid told me if I would not give her a piece, she would tear a piece off it. I told her I would tear her coat then. With that my mistress rises up, and take up a stick big enough to have killed me, and struck at me with it. But I stepped out, and she struck the stick into the mat of the wigwam. But while she was pulling of it out I ran to the maid and gave her all my apron, and so that storm went over.", "uuid" : "A6266131", "_id" : { "$oid" : "512042274b945a0200000027" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[43]", "startOffset" : 1, "end" : "/div[1]/p[44]", "endOffset" : 0, "_id" : { "$oid" : "512042274b945a0200000028" } } ], "updated" : { "$date" : 1361068583628 }, "created" : { "$date" : 1361068583628 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51204286814aad0200000008", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "asking me where I had been, and what I had been doing? and saying they would knock him on the head.", "uuid" : "F6D4AAFB", "_id" : { "$oid" : "51204286814aad0200000008" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[45]", "startOffset" : 1385, "end" : "/div[1]/p[45]", "endOffset" : 1485, "_id" : { "$oid" : "51204286814aad0200000009" } } ], "updated" : { "$date" : 1361068678550 }, "created" : { "$date" : 1361068678550 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512043d7814aad020000000a", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "Council of Sagamores?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Quickly there came up to us an Indian, who informed them that I must go to Wachusett to my master, for there was a letter come from the council to the Sagamores, about redeeming the captives, and that there would be another in fourteen days, and that I must be there ready", "uuid" : "8925B82B", "_id" : { "$oid" : "512043d7814aad020000000a" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[53]", "startOffset" : 770, "end" : "/div[1]/p[53]", "endOffset" : 1042, "_id" : { "$oid" : "512043d7814aad020000000b" } } ], "updated" : { "$date" : 1361069015245 }, "created" : { "$date" : 1361069015245 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51204446814aad020000000c", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "she stole the kids food", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Then I went to another wigwam, where there were two of the English children; the squaw was boiling horses feet; then she cut me off a little piece, and gave one of the English children a piece also. Being very hungry I had quickly eat up mine, but the child could not bite it, it was so tough and sinewy, but lay sucking, gnawing, chewing and slabbering of it in the mouth and hand. Then I took it of the child, and eat it myself, and savory it was to my taste", "uuid" : "F38D5298", "_id" : { "$oid" : "51204446814aad020000000c" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[57]", "startOffset" : 648, "end" : "/div[1]/p[57]", "endOffset" : 1108, "_id" : { "$oid" : "51204446814aad020000000d" } } ], "updated" : { "$date" : 1361069126904 }, "created" : { "$date" : 1361069126904 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512044b3814aad020000000e", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "why was he so nice?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "After many weary steps we came to Wachusett, where he was: and glad I was to see him. He asked me, when I washed me? I told him not this month. Then he fetched me some water himself, and bid me wash, and gave me the glass to see how I looked; and bid his squaw give me something to eat. So she gave me a mess of beans and meat, and a little ground nut cake. I was wonderfully revived with this favor showed me: \"He made them also to be pitied of all those that carried them captives\" (Psalm 106.46).", "uuid" : "4232D4B2", "_id" : { "$oid" : "512044b3814aad020000000e" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[59]", "startOffset" : 876, "end" : "/div[1]/p[59]", "endOffset" : 1375, "_id" : { "$oid" : "512044b3814aad020000000f" } } ], "updated" : { "$date" : 1361069235726 }, "created" : { "$date" : 1361069235726 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51204e714b945a0200000029", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "interesting", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Yea, instead of that, he many times refreshed me; five or six times did he and his squaw refresh my feeble carcass. If I went to their wigwam at any time, they would always give me something, and yet they were strangers that I never saw before. Another squaw gave me a piece of fresh pork, and a little salt with it, and lent me her pan to fry it in; and I cannot but remember what a sweet, pleasant and delightful relish that bit had to me, to this day. So little do we prize common mercies when we have them to the full.", "uuid" : "22923A50", "_id" : { "$oid" : "51204e714b945a0200000029" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[61]", "startOffset" : 6518, "end" : "/div[1]/p[61]", "endOffset" : 7040, "_id" : { "$oid" : "51204e714b945a020000002a" } } ], "updated" : { "$date" : 1361071729890 }, "created" : { "$date" : 1361071729890 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51204ff3814aad0200000010", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "they vote on who goes home?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "On Tuesday morning they called their general court (as they call it) to consult and determine, whether I should go home or no. And they all as one man did seemingly consent to it, that I should go home; except Philip, who would not come among them.", "uuid" : "FFDA673C", "_id" : { "$oid" : "51204ff3814aad0200000010" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[65]", "startOffset" : 1, "end" : "/div[1]/p[65]", "endOffset" : 249, "_id" : { "$oid" : "51204ff3814aad0200000011" } } ], "updated" : { "$date" : 1361072115717 }, "created" : { "$date" : 1361072115717 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512050f8814aad0200000012", "user" : "ersafai@mit.edu", "username" : "Eric S.", "text" : "interesting", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "In my travels an Indian came to me and told me, if I were willing, he and his squaw would run away, and go home along with me. I told him no", "uuid" : "613DD32B", "_id" : { "$oid" : "512050f8814aad0200000012" }, "permissions" : { "delete" : [ "ersafai@mit.edu" ], "update" : [ "ersafai@mit.edu" ], "admin" : [ "ersafai@mit.edu" ], "read" : [ "ersafai@mit.edu" ] }, "tags" : [ "captivity" ], "ranges" : [ { "start" : "/div[1]/p[75]", "startOffset" : 516, "end" : "/div[1]/p[75]", "endOffset" : 656, "_id" : { "$oid" : "512050f8814aad0200000013" } } ], "updated" : { "$date" : 1361072376213 }, "created" : { "$date" : 1361072376213 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51217e24e490da0200000002", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "Psalm 46:8", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"Come, behold the works of the Lord, what desolations he has made in the earth.\"", "uuid" : "E8525EFE", "_id" : { "$oid" : "51217e24e490da0200000002" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 60, "end" : "/div[1]/p[4]", "endOffset" : 140, "_id" : { "$oid" : "51217e24e490da0200000003" } } ], "updated" : { "$date" : 1361149476175 }, "created" : { "$date" : 1361149476175 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122792ad6401d0200000002", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "I may say, as it is in Psalm 38.5-6 \"My wounds stink and are corrupt, I am troubled, I am bowed down greatly, I go mourning all the day long.\"", "uuid" : "57BF8112", "_id" : { "$oid" : "5122792ad6401d0200000002" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "psalms" ], "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 2087, "end" : "/div[1]/p[13]", "endOffset" : 2230, "_id" : { "$oid" : "5122792ad6401d0200000003" } } ], "updated" : { "$date" : 1361213738900 }, "created" : { "$date" : 1361213738900 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122794dd6401d0200000004", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "When we were come, Oh the number of pagans (now merciless enemies) that there came about me, that I may say as David, \"I had fainted, unless I had believed, etc\" (Psalm 27.13).", "uuid" : "CA9D9ED5", "_id" : { "$oid" : "5122794dd6401d0200000004" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "psalms" ], "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 695, "end" : "/div[1]/p[13]", "endOffset" : 871, "_id" : { "$oid" : "5122794dd6401d0200000005" } } ], "updated" : { "$date" : 1361213773602 }, "created" : { "$date" : 1361213773602 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51227983d6401d0200000006", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "We opened the Bible and lighted on Psalm 27, in which Psalm we especially took notice of that, ver. ult., \"Wait on the Lord, Be of good courage, and he shall strengthen thine Heart, wait I say on the Lord.\"", "uuid" : "945A0466", "_id" : { "$oid" : "51227983d6401d0200000006" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "psalms" ], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 981, "end" : "/div[1]/p[15]", "endOffset" : 1187, "_id" : { "$oid" : "51227983d6401d0200000007" } } ], "updated" : { "$date" : 1361213827213 }, "created" : { "$date" : 1361213827212 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512279978f0ee50200000002", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"Oh that my people had hearkened to me, and Israel had walked in my ways, I should soon have subdued their enemies, and turned my hand against their adversaries\" (Psalm 81.13-14).", "uuid" : "0BECD7B2", "_id" : { "$oid" : "512279978f0ee50200000002" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "psalms" ], "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 1586, "end" : "/div[1]/p[21]", "endOffset" : 1765, "_id" : { "$oid" : "512279978f0ee50200000003" } } ], "updated" : { "$date" : 1361213847492 }, "created" : { "$date" : 1361213847492 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512279b28f0ee50200000004", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "I shall not die but live, and declare the works of the Lord: the Lord hath chastened me sore yet he hath not given me over to death\" (Psalm 118.17-18).", "uuid" : "5990F873", "_id" : { "$oid" : "512279b28f0ee50200000004" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "psalms" ], "ranges" : [ { "start" : "/div[1]/p[27]", "startOffset" : 1268, "end" : "/div[1]/p[27]", "endOffset" : 1419, "_id" : { "$oid" : "512279b28f0ee50200000005" } } ], "updated" : { "$date" : 1361213874932 }, "created" : { "$date" : 1361213874932 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122864cd6401d0200000008", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "But now I may say as Psalm 137.1, \"By the Rivers of Babylon, there we sate down: yea, we wept when we remembered Zion.\"", "uuid" : "EFAA2FB7", "_id" : { "$oid" : "5122864cd6401d0200000008" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "psalms" ], "ranges" : [ { "start" : "/div[1]/p[27]", "startOffset" : 2605, "end" : "/div[1]/p[27]", "endOffset" : 2724, "_id" : { "$oid" : "5122864cd6401d0200000009" } } ], "updated" : { "$date" : 1361217100196 }, "created" : { "$date" : 1361217100196 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512286d68f0ee50200000006", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"Cast thy burden upon the Lord, and He shall sustain thee\" (Psalm 55.22).", "uuid" : "9F8D035F", "_id" : { "$oid" : "512286d68f0ee50200000006" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "psalms" ], "ranges" : [ { "start" : "/div[1]/p[31]", "startOffset" : 2316, "end" : "/div[1]/p[31]", "endOffset" : 2389, "_id" : { "$oid" : "512286d68f0ee50200000007" } } ], "updated" : { "$date" : 1361217238660 }, "created" : { "$date" : 1361217238660 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512287d4d6401d020000000a", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "I know, O Lord, that thy judgments are right, and that thou in faithfulness hast afflicted me\" (Psalm 119.75).", "uuid" : "6295E9C6", "_id" : { "$oid" : "512287d4d6401d020000000a" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "psalms" ], "ranges" : [ { "start" : "/div[1]/p[37]", "startOffset" : 515, "end" : "/div[1]/p[37]", "endOffset" : 625, "_id" : { "$oid" : "512287d4d6401d020000000b" } } ], "updated" : { "$date" : 1361217492725 }, "created" : { "$date" : 1361217492725 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51228849d6401d020000000c", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"Be still, and know that I am God\" (Psalm 46.10)", "uuid" : "E1641CC6", "_id" : { "$oid" : "51228849d6401d020000000c" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "psalms" ], "ranges" : [ { "start" : "/div[1]/p[40]", "startOffset" : 833, "end" : "/div[1]/p[40]", "endOffset" : 881, "_id" : { "$oid" : "51228849d6401d020000000d" } } ], "updated" : { "$date" : 1361217609598 }, "created" : { "$date" : 1361217609598 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512288f88f0ee50200000008", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Psalm 37.5: \"Commit thy way unto the Lord; trust also in him; and he shall bring it to pass.\"", "uuid" : "3F1944E9", "_id" : { "$oid" : "512288f88f0ee50200000008" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "psalms" ], "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 3257, "end" : "/div[1]/p[42]", "endOffset" : 3351, "_id" : { "$oid" : "512288f88f0ee50200000009" } } ], "updated" : { "$date" : 1361217784693 }, "created" : { "$date" : 1361217784693 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51228ad98f0ee5020000000a", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Yet I can say, that in all my sorrows and afflictions, God did not leave me to have my impatience work towards Himself, as if His ways were unrighteous. But I knew that He laid upon me less than I deserved. Afterward, before this doleful time ended with me, I was turning the leaves of my Bible, and the Lord brought to me some Scriptures, which did a little revive me,", "uuid" : "B2890412", "_id" : { "$oid" : "51228ad98f0ee5020000000a" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 2754, "end" : "/div[1]/p[42]", "endOffset" : 3123, "_id" : { "$oid" : "51228ad98f0ee5020000000b" } } ], "updated" : { "$date" : 1361218265767 }, "created" : { "$date" : 1361218265767 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51228b00d6401d020000000e", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"I am poor and needy, and my heart is wounded within me. I am gone like the shadow when it declineth: I am tossed up and down like the locust; my knees are weak through fasting, and my flesh faileth of fatness\"", "uuid" : "0A0C0704", "_id" : { "$oid" : "51228b00d6401d020000000e" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "psalms" ], "ranges" : [ { "start" : "/div[1]/p[55]", "startOffset" : 277, "end" : "/div[1]/p[55]", "endOffset" : 487, "_id" : { "$oid" : "51228b00d6401d020000000f" } } ], "updated" : { "$date" : 1361218304875 }, "created" : { "$date" : 1361218304875 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51228bb68f0ee5020000000c", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Psalm 94.18, \"When my foot slipped, thy mercy, O Lord, held me up.\"", "uuid" : "21304081", "_id" : { "$oid" : "51228bb68f0ee5020000000c" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "psalms" ], "ranges" : [ { "start" : "/div[1]/p[59]", "startOffset" : 491, "end" : "/div[1]/p[59]", "endOffset" : 559, "_id" : { "$oid" : "51228bb68f0ee5020000000d" } } ], "updated" : { "$date" : 1361218486281 }, "created" : { "$date" : 1361218486281 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51228c77d6401d0200000010", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"He made them also to be pitied of all those that carried them captives\" (Psalm 106.46).", "uuid" : "116EA6A5", "_id" : { "$oid" : "51228c77d6401d0200000010" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "psalms" ], "ranges" : [ { "start" : "/div[1]/p[59]", "startOffset" : 1287, "end" : "/div[1]/p[59]", "endOffset" : 1375, "_id" : { "$oid" : "51228c77d6401d0200000011" } } ], "updated" : { "$date" : 1361218679211 }, "created" : { "$date" : 1361218679211 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51228d828f0ee5020000000e", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"Oh, that my People had hearkened to me, and Israel had walked in my ways, I should soon have subdued their Enemies, and turned my hand against their Adversaries\"", "uuid" : "01B32E48", "_id" : { "$oid" : "51228d828f0ee5020000000e" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "psalms" ], "ranges" : [ { "start" : "/div[1]/p[73]", "startOffset" : 914, "end" : "/div[1]/p[73]", "endOffset" : 1077, "_id" : { "$oid" : "51228d828f0ee5020000000f" } } ], "updated" : { "$date" : 1361218946947 }, "created" : { "$date" : 1361218946947 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51228de9d6401d0200000012", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"Oh give thanks unto the Lord for he is good, for his mercy endureth for ever.\"", "uuid" : "33C1A423", "_id" : { "$oid" : "51228de9d6401d0200000012" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "psalms" ], "ranges" : [ { "start" : "/div[1]/p[75]", "startOffset" : 1470, "end" : "/div[1]/p[75]", "endOffset" : 1550, "_id" : { "$oid" : "51228de9d6401d0200000013" } } ], "updated" : { "$date" : 1361219049934 }, "created" : { "$date" : 1361219049934 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51229de98f0ee50200000010", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"I watered my Couch with my tears\" (Psalm 6.6)", "uuid" : "48996B7D", "_id" : { "$oid" : "51229de98f0ee50200000010" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "psalms" ], "ranges" : [ { "start" : "/div[1]/p[78]", "startOffset" : 955, "end" : "/div[1]/p[78]", "endOffset" : 1001, "_id" : { "$oid" : "51229de98f0ee50200000011" } } ], "updated" : { "$date" : 1361223145632 }, "created" : { "$date" : 1361223145632 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5122a273d6401d0200000014" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361224307662 }, "id" : "5122a273d6401d0200000014", "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "quote" : "\"It is good for me that I have been afflicted", "ranges" : [ { "start" : "/div[1]/p[80]", "startOffset" : 1230, "end" : "/div[1]/p[80]", "endOffset" : 1275, "_id" : { "$oid" : "5122a273d6401d0200000015" } } ], "tags" : [ "psalms" ], "text" : "119.7", "updated" : { "$date" : 1361224381191 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "liadigi@mit.edu", "username" : "Lia D.", "uuid" : "2D9E78D6" } -{ "id" : "5122a4db8f0ee50200000012", "user" : "lydiaa@mit.edu", "username" : "Lydia A.", "text" : "alliteration", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "seems suspended", "uuid" : "148A80D8", "_id" : { "$oid" : "5122a4db8f0ee50200000012" }, "permissions" : { "delete" : [ "lydiaa@mit.edu" ], "update" : [ "lydiaa@mit.edu" ], "admin" : [ "lydiaa@mit.edu" ], "read" : [ "lydiaa@mit.edu" ] }, "tags" : [ "form" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2558, "end" : "/div[1]/p[1]", "endOffset" : 2573, "_id" : { "$oid" : "5122a4db8f0ee50200000013" } } ], "updated" : { "$date" : 1361224923578 }, "created" : { "$date" : 1361224923577 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122a4f58f0ee50200000014", "user" : "lydiaa@mit.edu", "username" : "Lydia A.", "text" : "alliteration", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "same sea", "uuid" : "E486B4D1", "_id" : { "$oid" : "5122a4f58f0ee50200000014" }, "permissions" : { "delete" : [ "lydiaa@mit.edu" ], "update" : [ "lydiaa@mit.edu" ], "admin" : [ "lydiaa@mit.edu" ], "read" : [ "lydiaa@mit.edu" ] }, "tags" : [ "form" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2653, "end" : "/div[1]/p[1]", "endOffset" : 2661, "_id" : { "$oid" : "5122a4f58f0ee50200000015" } } ], "updated" : { "$date" : 1361224949939 }, "created" : { "$date" : 1361224949939 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122a4ff8f0ee50200000016", "user" : "lydiaa@mit.edu", "username" : "Lydia A.", "text" : "alliteration", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "same", "uuid" : "4E5E6B90", "_id" : { "$oid" : "5122a4ff8f0ee50200000016" }, "permissions" : { "delete" : [ "lydiaa@mit.edu" ], "update" : [ "lydiaa@mit.edu" ], "admin" : [ "lydiaa@mit.edu" ], "read" : [ "lydiaa@mit.edu" ] }, "tags" : [ "form" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2667, "end" : "/div[1]/p[1]", "endOffset" : 2671, "_id" : { "$oid" : "5122a4ff8f0ee50200000017" } } ], "updated" : { "$date" : 1361224959813 }, "created" : { "$date" : 1361224959813 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122a50ad6401d0200000016", "user" : "lydiaa@mit.edu", "username" : "Lydia A.", "text" : "alliteration", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "seen", "uuid" : "9ABDE807", "_id" : { "$oid" : "5122a50ad6401d0200000016" }, "permissions" : { "delete" : [ "lydiaa@mit.edu" ], "update" : [ "lydiaa@mit.edu" ], "admin" : [ "lydiaa@mit.edu" ], "read" : [ "lydiaa@mit.edu" ] }, "tags" : [ "form" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2626, "end" : "/div[1]/p[1]", "endOffset" : 2630, "_id" : { "$oid" : "5122a50ad6401d0200000017" } } ], "updated" : { "$date" : 1361224970530 }, "created" : { "$date" : 1361224970530 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122a572d6401d0200000018", "user" : "lydiaa@mit.edu", "username" : "Lydia A.", "text" : "The many \"s\" sounds in these lines make me think of the sounds of the sea, which relates to what she is talking about.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "The water seems suspended\nabove the rounded gray and blue-gray stones.\nI have seen it over and over, the same sea, the same,\nslightly, indifferently swinging above the stones,\nicily free above the stones,\nabove the stones and then the world.", "uuid" : "A7666D34", "_id" : { "$oid" : "5122a572d6401d0200000018" }, "permissions" : { "delete" : [ "lydiaa@mit.edu" ], "update" : [ "lydiaa@mit.edu" ], "admin" : [ "lydiaa@mit.edu" ], "read" : [ "lydiaa@mit.edu" ] }, "tags" : [ "form,", "content" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2548, "end" : "/div[1]/p[1]", "endOffset" : 2789, "_id" : { "$oid" : "5122a572d6401d0200000019" } } ], "updated" : { "$date" : 1361225074645 }, "created" : { "$date" : 1361225074645 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5122dc7cd6401d020000001a" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361239164147 }, "id" : "5122dc7cd6401d020000001a", "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "quote" : "Bluish", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2453, "end" : "/div[1]/p[1]", "endOffset" : 2459, "_id" : { "$oid" : "5122dc7cd6401d020000001b" } } ], "tags" : [ "word", "choice" ], "text" : "Commonly associated with the ocean, but here is referring to Christmas trees.", "updated" : { "$date" : 1361239384872 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "kgero@mit.edu", "username" : "Katy G.", "uuid" : "75DBEAA4" } -{ "id" : "5122dcf8d6401d020000001c", "user" : "brianb@mit.edu", "username" : "Brian B.", "text" : "\"S\" section", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "I have seen it over and over, the same sea, the same,\nslightly, indifferently swinging above the stones,\nicily free above the stones,\nabove the stones", "uuid" : "CDA99A8C", "_id" : { "$oid" : "5122dcf8d6401d020000001c" }, "permissions" : { "delete" : [ "brianb@mit.edu" ], "update" : [ "brianb@mit.edu" ], "admin" : [ "brianb@mit.edu" ], "read" : [ "brianb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2619, "end" : "/div[1]/p[1]", "endOffset" : 2769, "_id" : { "$oid" : "5122dcf8d6401d020000001d" } } ], "updated" : { "$date" : 1361239288995 }, "created" : { "$date" : 1361239288995 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122dd0fd6401d020000001e", "user" : "brianb@mit.edu", "username" : "Brian B.", "text" : "\"F\" section", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "forever, flowing and drawn, and since\nour knowledge is historical, flowing, and flown.", "uuid" : "DFEE772A", "_id" : { "$oid" : "5122dd0fd6401d020000001e" }, "permissions" : { "delete" : [ "brianb@mit.edu" ], "update" : [ "brianb@mit.edu" ], "admin" : [ "brianb@mit.edu" ], "read" : [ "brianb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3263, "end" : "/div[1]/p[1]", "endOffset" : 3349, "_id" : { "$oid" : "5122dd0fd6401d020000001f" } } ], "updated" : { "$date" : 1361239311217 }, "created" : { "$date" : 1361239311217 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122dd50d6401d0200000020", "user" : "brianb@mit.edu", "username" : "Brian B.", "text" : "\"B\" section", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "If you tasted it, it would first taste bitter,\nthen briny, then surely burn your tongue.", "uuid" : "6ABA9B96", "_id" : { "$oid" : "5122dd50d6401d0200000020" }, "permissions" : { "delete" : [ "brianb@mit.edu" ], "update" : [ "brianb@mit.edu" ], "admin" : [ "brianb@mit.edu" ], "read" : [ "brianb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3013, "end" : "/div[1]/p[1]", "endOffset" : 3101, "_id" : { "$oid" : "5122dd50d6401d0200000021" } } ], "updated" : { "$date" : 1361239376482 }, "created" : { "$date" : 1361239376482 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122df8e2eee0e0200000002", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "lots of 's' sounds", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "I have seen it over and over, the same sea, the same,\nslightly, indifferently swinging above the stones,\nicily free above the stones,\nabove the stones", "uuid" : "01F96E2D", "_id" : { "$oid" : "5122df8e2eee0e0200000002" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [ "sounds" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2619, "end" : "/div[1]/p[1]", "endOffset" : 2769, "_id" : { "$oid" : "5122df8e2eee0e0200000003" } } ], "updated" : { "$date" : 1361239950186 }, "created" : { "$date" : 1361239950186 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122dfc3d6401d0200000022", "user" : "lu16j@mit.edu", "username" : "Richard L.", "text" : "Many words that begin with S", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "I have seen it over and over, the same sea, the same,\nslightly, indifferently swinging above the stones,\nicily free above the stones,\nabove the stones and then the world.", "uuid" : "F6AC990B", "_id" : { "$oid" : "5122dfc3d6401d0200000022" }, "permissions" : { "delete" : [ "lu16j@mit.edu" ], "update" : [ "lu16j@mit.edu" ], "admin" : [ "lu16j@mit.edu" ], "read" : [ "lu16j@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2619, "end" : "/div[1]/p[1]", "endOffset" : 2789, "_id" : { "$oid" : "5122dfc3d6401d0200000023" } } ], "updated" : { "$date" : 1361240003702 }, "created" : { "$date" : 1361240003702 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5122dfcdd6401d0200000024" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361240013351 }, "id" : "5122dfcdd6401d0200000024", "permissions" : { "delete" : [ "brianb@mit.edu" ], "update" : [ "brianb@mit.edu" ], "admin" : [ "brianb@mit.edu" ], "read" : [ "brianb@mit.edu" ] }, "quote" : "dark, salt, clear, moving, utterly free,", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3146, "end" : "/div[1]/p[1]", "endOffset" : 3186, "_id" : { "$oid" : "5122dfcdd6401d0200000025" } } ], "tags" : [], "text" : "Very staccato rhythm here. We move from hard sounds in the beginning of the line \"dark, salt\" to much softer sounds \"clear, moving, free\". We move to light-er free-er sounds as we read through to \"utterly free\".", "updated" : { "$date" : 1361241437943 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "brianb@mit.edu", "username" : "Brian B.", "uuid" : "0D24721B" } -{ "id" : "5122dfd3d6401d0200000026", "user" : "artsy568@mit.edu", "username" : "Kira S.", "text" : "The commas accentuate the rhythm. It makes you slow down.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "dark, salt, clear, moving, utterly free,", "uuid" : "177B8859", "_id" : { "$oid" : "5122dfd3d6401d0200000026" }, "permissions" : { "delete" : [ "artsy568@mit.edu" ], "update" : [ "artsy568@mit.edu" ], "admin" : [ "artsy568@mit.edu" ], "read" : [ "artsy568@mit.edu" ] }, "tags" : [ "rhythm", "slow", "down" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3146, "end" : "/div[1]/p[1]", "endOffset" : 3186, "_id" : { "$oid" : "5122dfd3d6401d0200000027" } } ], "updated" : { "$date" : 1361240019148 }, "created" : { "$date" : 1361240019148 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122dfeb2eee0e0200000006", "user" : "lu16j@mit.edu", "username" : "Richard L.", "text" : "forever, flowing, flown = F", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "forever, flowing and drawn, and since\nour knowledge is historical, flowing, and flown.", "uuid" : "E6753DBB", "_id" : { "$oid" : "5122dfeb2eee0e0200000006" }, "permissions" : { "delete" : [ "lu16j@mit.edu" ], "update" : [ "lu16j@mit.edu" ], "admin" : [ "lu16j@mit.edu" ], "read" : [ "lu16j@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3263, "end" : "/div[1]/p[1]", "endOffset" : 3349, "_id" : { "$oid" : "5122dfeb2eee0e0200000007" } } ], "updated" : { "$date" : 1361240043436 }, "created" : { "$date" : 1361240043436 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122dff3d6401d0200000028", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "another color commonly associated with the ocean, but here used for stones.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "blue-gray", "uuid" : "568D9C67", "_id" : { "$oid" : "5122dff3d6401d0200000028" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [ "word", "choice" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2601, "end" : "/div[1]/p[1]", "endOffset" : 2610, "_id" : { "$oid" : "5122dff3d6401d0200000029" } } ], "updated" : { "$date" : 1361240051555 }, "created" : { "$date" : 1361240051555 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122dff9d6401d020000002a", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "latinate word", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "transmutation", "uuid" : "729142A6", "_id" : { "$oid" : "5122dff9d6401d020000002a" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2936, "end" : "/div[1]/p[1]", "endOffset" : 2949, "_id" : { "$oid" : "5122dff9d6401d020000002b" } } ], "updated" : { "$date" : 1361240057562 }, "created" : { "$date" : 1361240057562 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e022d6401d020000002c", "user" : "brianb@mit.edu", "username" : "Brian B.", "text" : "Latinate word", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "transmutation", "uuid" : "21915468", "_id" : { "$oid" : "5122e022d6401d020000002c" }, "permissions" : { "delete" : [ "brianb@mit.edu" ], "update" : [ "brianb@mit.edu" ], "admin" : [ "brianb@mit.edu" ], "read" : [ "brianb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2936, "end" : "/div[1]/p[1]", "endOffset" : 2949, "_id" : { "$oid" : "5122e022d6401d020000002d" } } ], "updated" : { "$date" : 1361240098377 }, "created" : { "$date" : 1361240098377 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e038d6401d020000002e", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "lots of 'b' sounds", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "your bones would begin to ache and your hand would burn", "uuid" : "D10011FB", "_id" : { "$oid" : "5122e038d6401d020000002e" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2857, "end" : "/div[1]/p[1]", "endOffset" : 2912, "_id" : { "$oid" : "5122e038d6401d020000002f" } } ], "updated" : { "$date" : 1361240120008 }, "created" : { "$date" : 1361240120008 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e042d6401d0200000030", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "latinate word", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "immediately", "uuid" : "617D2D96", "_id" : { "$oid" : "5122e042d6401d0200000030" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2844, "end" : "/div[1]/p[1]", "endOffset" : 2855, "_id" : { "$oid" : "5122e042d6401d0200000031" } } ], "updated" : { "$date" : 1361240130823 }, "created" : { "$date" : 1361240130823 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5122e048d6401d0200000032" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361240136654 }, "id" : "5122e048d6401d0200000032", "permissions" : { "delete" : [ "brianb@mit.edu" ], "update" : [ "brianb@mit.edu" ], "admin" : [ "brianb@mit.edu" ], "read" : [ "brianb@mit.edu" ] }, "quote" : "immediately", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2844, "end" : "/div[1]/p[1]", "endOffset" : 2855, "_id" : { "$oid" : "5122e048d6401d0200000033" } } ], "tags" : [], "text" : "Latinate", "updated" : { "$date" : 1361240145850 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "brianb@mit.edu", "username" : "Brian B.", "uuid" : "5D2EDF5B" } -{ "id" : "5122e054d6401d0200000034", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "very rhythmic", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "I have seen it over and over, the same sea, the same,", "uuid" : "F667CD24", "_id" : { "$oid" : "5122e054d6401d0200000034" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2619, "end" : "/div[1]/p[1]", "endOffset" : 2672, "_id" : { "$oid" : "5122e054d6401d0200000035" } } ], "updated" : { "$date" : 1361240148693 }, "created" : { "$date" : 1361240148693 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e0a82eee0e0200000008", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "lots of 'd' sounds", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "drawn from the cold hard mouth\nof the world, derived", "uuid" : "766BF3E6", "_id" : { "$oid" : "5122e0a82eee0e0200000008" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3187, "end" : "/div[1]/p[1]", "endOffset" : 3239, "_id" : { "$oid" : "5122e0a82eee0e0200000009" } } ], "updated" : { "$date" : 1361240232438 }, "created" : { "$date" : 1361240232438 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e0b42eee0e020000000a", "user" : "lu16j@mit.edu", "username" : "Richard L.", "text" : "dark, drawn, derived", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "dark, salt, clear, moving, utterly free,\ndrawn from the cold hard mouth\nof the world, derived from the rocky breasts", "uuid" : "47C2FF71", "_id" : { "$oid" : "5122e0b42eee0e020000000a" }, "permissions" : { "delete" : [ "lu16j@mit.edu" ], "update" : [ "lu16j@mit.edu" ], "admin" : [ "lu16j@mit.edu" ], "read" : [ "lu16j@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3146, "end" : "/div[1]/p[1]", "endOffset" : 3262, "_id" : { "$oid" : "5122e0b42eee0e020000000b" } } ], "updated" : { "$date" : 1361240244347 }, "created" : { "$date" : 1361240244347 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e0b4d6401d0200000036", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "very rhythmic", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "dark, salt, clear, moving, utterly free,", "uuid" : "1A736F64", "_id" : { "$oid" : "5122e0b4d6401d0200000036" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3146, "end" : "/div[1]/p[1]", "endOffset" : 3186, "_id" : { "$oid" : "5122e0b4d6401d0200000037" } } ], "updated" : { "$date" : 1361240244350 }, "created" : { "$date" : 1361240244350 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e0cf2eee0e020000000c", "user" : "artsy568@mit.edu", "username" : "Kira S.", "text" : "Repetition of the \"d\" sound. Similar to the groupings of other letter sounds like \"b\" and \"s\"", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "drawn from the cold hard mouth\nof the world, derived", "uuid" : "C150D936", "_id" : { "$oid" : "5122e0cf2eee0e020000000c" }, "permissions" : { "delete" : [ "artsy568@mit.edu" ], "update" : [ "artsy568@mit.edu" ], "admin" : [ "artsy568@mit.edu" ], "read" : [ "artsy568@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3187, "end" : "/div[1]/p[1]", "endOffset" : 3239, "_id" : { "$oid" : "5122e0cf2eee0e020000000d" } } ], "updated" : { "$date" : 1361240271850 }, "created" : { "$date" : 1361240271850 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5122e11cd6401d0200000038" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361240348588 }, "id" : "5122e11cd6401d0200000038", "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "quote" : "flowing and drawn", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3272, "end" : "/div[1]/p[1]", "endOffset" : 3289, "_id" : { "$oid" : "5122e11cd6401d0200000039" } } ], "tags" : [], "text" : "opposites? in meaning and verb form", "updated" : { "$date" : 1361240364494 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "kgero@mit.edu", "username" : "Katy G.", "uuid" : "B77DAE27" } -{ "id" : "5122e15fd6401d020000003a", "user" : "lu16j@mit.edu", "username" : "Richard L.", "text" : "5 stresses - smatterings of regular rhythm here and there", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "waiting for Christmas. The water seems suspended\nabove the rounded gray and blue-gray stones.", "uuid" : "7CF82DB2", "_id" : { "$oid" : "5122e15fd6401d020000003a" }, "permissions" : { "delete" : [ "lu16j@mit.edu" ], "update" : [ "lu16j@mit.edu" ], "admin" : [ "lu16j@mit.edu" ], "read" : [ "lu16j@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2525, "end" : "/div[1]/p[1]", "endOffset" : 2618, "_id" : { "$oid" : "5122e15fd6401d020000003b" } } ], "updated" : { "$date" : 1361240415469 }, "created" : { "$date" : 1361240415469 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e18a2eee0e020000000e", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "difference between flown and drawn is important - perhaps drawn means to pull back, which we can never do with history as we remember everything.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "flown", "uuid" : "7BC6C976", "_id" : { "$oid" : "5122e18a2eee0e020000000e" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3343, "end" : "/div[1]/p[1]", "endOffset" : 3348, "_id" : { "$oid" : "5122e18a2eee0e020000000f" } } ], "updated" : { "$date" : 1361240458801 }, "created" : { "$date" : 1361240458801 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e1932eee0e0200000010", "user" : "lu16j@mit.edu", "username" : "Richard L.", "text" : "emphasis - broken rhythm", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "dark, salt, clear, moving, utterly free,", "uuid" : "BD83DA8A", "_id" : { "$oid" : "5122e1932eee0e0200000010" }, "permissions" : { "delete" : [ "lu16j@mit.edu" ], "update" : [ "lu16j@mit.edu" ], "admin" : [ "lu16j@mit.edu" ], "read" : [ "lu16j@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3146, "end" : "/div[1]/p[1]", "endOffset" : 3186, "_id" : { "$oid" : "5122e1932eee0e0200000011" } } ], "updated" : { "$date" : 1361240467776 }, "created" : { "$date" : 1361240467776 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e1a2d6401d020000003c", "user" : "artsy568@mit.edu", "username" : "Kira S.", "text" : "relates the flowing of water to time. History does not go back to the past but rather keeps flowing on through time in the present", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "flowing, and flown.", "uuid" : "95EC59D9", "_id" : { "$oid" : "5122e1a2d6401d020000003c" }, "permissions" : { "delete" : [ "artsy568@mit.edu" ], "update" : [ "artsy568@mit.edu" ], "admin" : [ "artsy568@mit.edu" ], "read" : [ "artsy568@mit.edu" ] }, "tags" : [ "time" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3330, "end" : "/div[1]/p[1]", "endOffset" : 3349, "_id" : { "$oid" : "5122e1a2d6401d020000003d" } } ], "updated" : { "$date" : 1361240482801 }, "created" : { "$date" : 1361240482801 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e1bbd6401d020000003e", "user" : "jsandov@mit.edu", "username" : "Joe S.", "text" : "This seems like a peculiar word to describe the colors of shadows, which are always black in my experience. However the ocean-setting is also blue and perhaps that is what is creating these 'bluish' shadows.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Bluish,", "uuid" : "C18D75E6", "_id" : { "$oid" : "5122e1bbd6401d020000003e" }, "permissions" : { "delete" : [ "jsandov@mit.edu" ], "update" : [ "jsandov@mit.edu" ], "admin" : [ "jsandov@mit.edu" ], "read" : [ "jsandov@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2453, "end" : "/div[1]/p[1]", "endOffset" : 2460, "_id" : { "$oid" : "5122e1bbd6401d020000003f" } } ], "updated" : { "$date" : 1361240507502 }, "created" : { "$date" : 1361240507502 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e1d42eee0e0200000012", "user" : "lu16j@mit.edu", "username" : "Richard L.", "text" : "If-then causation", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "If", "uuid" : "AFC6E494", "_id" : { "$oid" : "5122e1d42eee0e0200000012" }, "permissions" : { "delete" : [ "lu16j@mit.edu" ], "update" : [ "lu16j@mit.edu" ], "admin" : [ "lu16j@mit.edu" ], "read" : [ "lu16j@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2790, "end" : "/div[1]/p[1]", "endOffset" : 2792, "_id" : { "$oid" : "5122e1d42eee0e0200000013" } } ], "updated" : { "$date" : 1361240532884 }, "created" : { "$date" : 1361240532884 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e1ebd6401d0200000040", "user" : "lu16j@mit.edu", "username" : "Richard L.", "text" : "If-then causation", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "If", "uuid" : "028065C3", "_id" : { "$oid" : "5122e1ebd6401d0200000040" }, "permissions" : { "delete" : [ "lu16j@mit.edu" ], "update" : [ "lu16j@mit.edu" ], "admin" : [ "lu16j@mit.edu" ], "read" : [ "lu16j@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3013, "end" : "/div[1]/p[1]", "endOffset" : 3015, "_id" : { "$oid" : "5122e1ebd6401d0200000041" } } ], "updated" : { "$date" : 1361240555484 }, "created" : { "$date" : 1361240555484 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e1fa2eee0e0200000014", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "goes against traditional sense of water being constructive, regenerative", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "If you should dip your hand in,\nyour wrist would ache immediately,", "uuid" : "2DDE778D", "_id" : { "$oid" : "5122e1fa2eee0e0200000014" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2790, "end" : "/div[1]/p[1]", "endOffset" : 2856, "_id" : { "$oid" : "5122e1fa2eee0e0200000015" } } ], "updated" : { "$date" : 1361240570500 }, "created" : { "$date" : 1361240570500 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e20cd6401d0200000042", "user" : "jsandov@mit.edu", "username" : "Joe S.", "text" : "The repetition of the 's' sound (sibilance) here creates a sort of sing-songy rhythm", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "same sea, the same,\nslightly, indifferently swinging above the stones,\nicily free above the stones,", "uuid" : "C8B24A37", "_id" : { "$oid" : "5122e20cd6401d0200000042" }, "permissions" : { "delete" : [ "jsandov@mit.edu" ], "update" : [ "jsandov@mit.edu" ], "admin" : [ "jsandov@mit.edu" ], "read" : [ "jsandov@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2653, "end" : "/div[1]/p[1]", "endOffset" : 2752, "_id" : { "$oid" : "5122e20cd6401d0200000043" } } ], "updated" : { "$date" : 1361240588871 }, "created" : { "$date" : 1361240588871 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e2222eee0e0200000016", "user" : "artsy568@mit.edu", "username" : "Kira S.", "text" : "Opposite description of water, especially comparing it to fire. It's as if she says that water burns through your arm like fire.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "If you should dip your hand in,\nyour wrist would ache immediately,\nyour bones would begin to ache and your hand would burn\nas if the water were a transmutation of fire\nthat feeds on stones and burns with a dark gray flame.", "uuid" : "F108DDD9", "_id" : { "$oid" : "5122e2222eee0e0200000016" }, "permissions" : { "delete" : [ "artsy568@mit.edu" ], "update" : [ "artsy568@mit.edu" ], "admin" : [ "artsy568@mit.edu" ], "read" : [ "artsy568@mit.edu" ] }, "tags" : [ "opposite", "water", "and", "fire" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2790, "end" : "/div[1]/p[1]", "endOffset" : 3012, "_id" : { "$oid" : "5122e2222eee0e0200000017" } } ], "updated" : { "$date" : 1361240610010 }, "created" : { "$date" : 1361240610010 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e232d6401d0200000044", "user" : "lu16j@mit.edu", "username" : "Richard L.", "text" : "from a pain to a burn", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "your wrist would ache immediately,\nyour bones would begin to ache and your hand would burn", "uuid" : "D66DB01B", "_id" : { "$oid" : "5122e232d6401d0200000044" }, "permissions" : { "delete" : [ "lu16j@mit.edu" ], "update" : [ "lu16j@mit.edu" ], "admin" : [ "lu16j@mit.edu" ], "read" : [ "lu16j@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2822, "end" : "/div[1]/p[1]", "endOffset" : 2912, "_id" : { "$oid" : "5122e233d6401d0200000045" } } ], "updated" : { "$date" : 1361240626998 }, "created" : { "$date" : 1361240626998 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e234d6401d0200000046", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "strange image of water", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "The water seems suspended\nabove the rounded gray and blue-gray stones", "uuid" : "556656D9", "_id" : { "$oid" : "5122e234d6401d0200000046" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2548, "end" : "/div[1]/p[1]", "endOffset" : 2617, "_id" : { "$oid" : "5122e234d6401d0200000047" } } ], "updated" : { "$date" : 1361240628529 }, "created" : { "$date" : 1361240628529 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e23dd6401d0200000048", "user" : "lu16j@mit.edu", "username" : "Richard L.", "text" : "from a pain to a burn again", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "it would first taste bitter,\nthen briny, then surely burn your tongue.", "uuid" : "514BD099", "_id" : { "$oid" : "5122e23dd6401d0200000048" }, "permissions" : { "delete" : [ "lu16j@mit.edu" ], "update" : [ "lu16j@mit.edu" ], "admin" : [ "lu16j@mit.edu" ], "read" : [ "lu16j@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3031, "end" : "/div[1]/p[1]", "endOffset" : 3101, "_id" : { "$oid" : "5122e23dd6401d0200000049" } } ], "updated" : { "$date" : 1361240637315 }, "created" : { "$date" : 1361240637315 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e2492eee0e0200000018", "user" : "jsandov@mit.edu", "username" : "Joe S.", "text" : "This is another instance of describing something as an out-of-the-ordinary color. Rather than being bright and red, this fire is simply dark grey.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "dark gray", "uuid" : "52D9F90E", "_id" : { "$oid" : "5122e2492eee0e0200000018" }, "permissions" : { "delete" : [ "jsandov@mit.edu" ], "update" : [ "jsandov@mit.edu" ], "admin" : [ "jsandov@mit.edu" ], "read" : [ "jsandov@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2995, "end" : "/div[1]/p[1]", "endOffset" : 3006, "_id" : { "$oid" : "5122e2492eee0e0200000019" } } ], "updated" : { "$date" : 1361240649513 }, "created" : { "$date" : 1361240649513 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e24cd6401d020000004a", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "why call them Christmas trees specifically?", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Christmas", "uuid" : "22CE2379", "_id" : { "$oid" : "5122e24cd6401d020000004a" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2503, "end" : "/div[1]/p[1]", "endOffset" : 2512, "_id" : { "$oid" : "5122e24cd6401d020000004b" } } ], "updated" : { "$date" : 1361240652779 }, "created" : { "$date" : 1361240652779 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e24e2eee0e020000001a", "user" : "brianb@mit.edu", "username" : "Brian B.", "text" : "This is unusual, water is nothing like fire, and here instead of being rejuvenating as water is normally described, this water burns and destroys, and isn't good to drink.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "water were a transmutation of fire\nthat feeds on stones and burns with a dark gray flame.", "uuid" : "98630489", "_id" : { "$oid" : "5122e24e2eee0e020000001a" }, "permissions" : { "delete" : [ "brianb@mit.edu" ], "update" : [ "brianb@mit.edu" ], "admin" : [ "brianb@mit.edu" ], "read" : [ "brianb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2923, "end" : "/div[1]/p[1]", "endOffset" : 3012, "_id" : { "$oid" : "5122e24e2eee0e020000001b" } } ], "updated" : { "$date" : 1361240654258 }, "created" : { "$date" : 1361240654258 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e26ed6401d020000004c", "user" : "jsandov@mit.edu", "username" : "Joe S.", "text" : "There are a lot of commas in this section,forcing a choppy rhythm with a lot of pauses.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "dark, salt, clear, moving, utterly free,", "uuid" : "8DE04FD2", "_id" : { "$oid" : "5122e26ed6401d020000004c" }, "permissions" : { "delete" : [ "jsandov@mit.edu" ], "update" : [ "jsandov@mit.edu" ], "admin" : [ "jsandov@mit.edu" ], "read" : [ "jsandov@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3146, "end" : "/div[1]/p[1]", "endOffset" : 3186, "_id" : { "$oid" : "5122e26ed6401d020000004d" } } ], "updated" : { "$date" : 1361240686233 }, "created" : { "$date" : 1361240686233 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e2a12eee0e020000001c", "user" : "artsy568@mit.edu", "username" : "Kira S.", "text" : "Odd that she would describe a dark and shadowy scene with \"Christmas\" a word that's usually associated with happiness and lightness.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Bluish, associating with their shadows,\na million Christmas trees stand\nwaiting for Christmas.", "uuid" : "0632221C", "_id" : { "$oid" : "5122e2a12eee0e020000001c" }, "permissions" : { "delete" : [ "artsy568@mit.edu" ], "update" : [ "artsy568@mit.edu" ], "admin" : [ "artsy568@mit.edu" ], "read" : [ "artsy568@mit.edu" ] }, "tags" : [ "Christmas", "dark" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2453, "end" : "/div[1]/p[1]", "endOffset" : 2547, "_id" : { "$oid" : "5122e2a12eee0e020000001d" } } ], "updated" : { "$date" : 1361240737305 }, "created" : { "$date" : 1361240737305 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e2af2eee0e020000001e", "user" : "jsandov@mit.edu", "username" : "Joe S.", "text" : "I wonder why the word briny was chosen, rather than salty. Perhaps because the subject is water and brine is used to describe water exclusively.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "briny", "uuid" : "65B11EEC", "_id" : { "$oid" : "5122e2af2eee0e020000001e" }, "permissions" : { "delete" : [ "jsandov@mit.edu" ], "update" : [ "jsandov@mit.edu" ], "admin" : [ "jsandov@mit.edu" ], "read" : [ "jsandov@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3065, "end" : "/div[1]/p[1]", "endOffset" : 3070, "_id" : { "$oid" : "5122e2af2eee0e020000001f" } } ], "updated" : { "$date" : 1361240751898 }, "created" : { "$date" : 1361240751898 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e2ddd6401d020000004e", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "saying water is above things a lot", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "above", "uuid" : "48F4B683", "_id" : { "$oid" : "5122e2ddd6401d020000004e" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2735, "end" : "/div[1]/p[1]", "endOffset" : 2740, "_id" : { "$oid" : "5122e2ddd6401d020000004f" } } ], "updated" : { "$date" : 1361240797595 }, "created" : { "$date" : 1361240797595 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e30ed6401d0200000050", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "uncaring", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "icily free", "uuid" : "711BE69F", "_id" : { "$oid" : "5122e30ed6401d0200000050" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2724, "end" : "/div[1]/p[1]", "endOffset" : 2734, "_id" : { "$oid" : "5122e30ed6401d0200000051" } } ], "updated" : { "$date" : 1361240846901 }, "created" : { "$date" : 1361240846901 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e3142eee0e0200000020", "user" : "jsandov@mit.edu", "username" : "Joe S.", "text" : "This is a very long section without any commas, as such it stands out from the rest of the poem. The strong negative imagery and the speed at which it is read adds to the drama of the already dark statement", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "your bones would begin to ache and your hand would burn\nas if the water were a transmutation of fire\nthat feeds on stones and burns with a dark gray flame", "uuid" : "F30F5962", "_id" : { "$oid" : "5122e3142eee0e0200000020" }, "permissions" : { "delete" : [ "jsandov@mit.edu" ], "update" : [ "jsandov@mit.edu" ], "admin" : [ "jsandov@mit.edu" ], "read" : [ "jsandov@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2857, "end" : "/div[1]/p[1]", "endOffset" : 3011, "_id" : { "$oid" : "5122e3142eee0e0200000021" } } ], "updated" : { "$date" : 1361240852329 }, "created" : { "$date" : 1361240852329 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e32e2eee0e0200000022", "user" : "brianb@mit.edu", "username" : "Brian B.", "text" : "This section's suspended water makes me think of clouds, as if the stones were a rocky landscape/the earths crust.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "The water seems suspended\nabove the rounded gray and blue-gray stones.", "uuid" : "72D44454", "_id" : { "$oid" : "5122e32e2eee0e0200000022" }, "permissions" : { "delete" : [ "brianb@mit.edu" ], "update" : [ "brianb@mit.edu" ], "admin" : [ "brianb@mit.edu" ], "read" : [ "brianb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2548, "end" : "/div[1]/p[1]", "endOffset" : 2618, "_id" : { "$oid" : "5122e32e2eee0e0200000023" } } ], "updated" : { "$date" : 1361240878068 }, "created" : { "$date" : 1361240878068 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e331d6401d0200000052", "user" : "artsy568@mit.edu", "username" : "Kira S.", "text" : "Odd adjective to describe something that's free, because ice isn't free.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "icily free", "uuid" : "9FB9E4FC", "_id" : { "$oid" : "5122e331d6401d0200000052" }, "permissions" : { "delete" : [ "artsy568@mit.edu" ], "update" : [ "artsy568@mit.edu" ], "admin" : [ "artsy568@mit.edu" ], "read" : [ "artsy568@mit.edu" ] }, "tags" : [ "icily", "ice", "free" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2724, "end" : "/div[1]/p[1]", "endOffset" : 2734, "_id" : { "$oid" : "5122e331d6401d0200000053" } } ], "updated" : { "$date" : 1361240881515 }, "created" : { "$date" : 1361240881515 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e34c2eee0e0200000024", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "continue image of water as fire", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "burn your tongue", "uuid" : "6A4BE581", "_id" : { "$oid" : "5122e34c2eee0e0200000024" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3084, "end" : "/div[1]/p[1]", "endOffset" : 3100, "_id" : { "$oid" : "5122e34c2eee0e0200000025" } } ], "updated" : { "$date" : 1361240908261 }, "created" : { "$date" : 1361240908261 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e352d6401d0200000054", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "image of water as fire", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "transmutation of fire", "uuid" : "ACFF2A32", "_id" : { "$oid" : "5122e352d6401d0200000054" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2936, "end" : "/div[1]/p[1]", "endOffset" : 2957, "_id" : { "$oid" : "5122e352d6401d0200000055" } } ], "updated" : { "$date" : 1361240914936 }, "created" : { "$date" : 1361240914936 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e356d6401d0200000056", "user" : "brianb@mit.edu", "username" : "Brian B.", "text" : "Double meaning - could mean literally icy, but could also mean uncaring or aloof/detached", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "icily free", "uuid" : "16163382", "_id" : { "$oid" : "5122e356d6401d0200000056" }, "permissions" : { "delete" : [ "brianb@mit.edu" ], "update" : [ "brianb@mit.edu" ], "admin" : [ "brianb@mit.edu" ], "read" : [ "brianb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2724, "end" : "/div[1]/p[1]", "endOffset" : 2735, "_id" : { "$oid" : "5122e356d6401d0200000057" } } ], "updated" : { "$date" : 1361240918122 }, "created" : { "$date" : 1361240918122 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e360d6401d0200000058", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "gray again", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "gray", "uuid" : "207CA5BB", "_id" : { "$oid" : "5122e360d6401d0200000058" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3001, "end" : "/div[1]/p[1]", "endOffset" : 3005, "_id" : { "$oid" : "5122e360d6401d0200000059" } } ], "updated" : { "$date" : 1361240928854 }, "created" : { "$date" : 1361240928854 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e3ddd6401d020000005a", "user" : "artsy568@mit.edu", "username" : "Kira S.", "text" : "Not really an adjective like the others.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "salt", "uuid" : "888FCAE1", "_id" : { "$oid" : "5122e3ddd6401d020000005a" }, "permissions" : { "delete" : [ "artsy568@mit.edu" ], "update" : [ "artsy568@mit.edu" ], "admin" : [ "artsy568@mit.edu" ], "read" : [ "artsy568@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3152, "end" : "/div[1]/p[1]", "endOffset" : 3156, "_id" : { "$oid" : "5122e3ddd6401d020000005b" } } ], "updated" : { "$date" : 1361241053773 }, "created" : { "$date" : 1361241053773 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5122e3fb2eee0e0200000026" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361241083923 }, "id" : "5122e3fb2eee0e0200000026", "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "quote" : "salt", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3152, "end" : "/div[1]/p[1]", "endOffset" : 3156, "_id" : { "$oid" : "5122e3fb2eee0e0200000027" } } ], "tags" : [], "text" : "salt doesn't fit grammatically with the others, unless we consider it as a verb, maybe to give something taste", "updated" : { "$date" : 1361241145912 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "kgero@mit.edu", "username" : "Katy G.", "uuid" : "1FC76FC9" } -{ "id" : "5122e445d6401d020000005c", "user" : "brianb@mit.edu", "username" : "Brian B.", "text" : "This word \"salt\" is very jarring. It could be elemental here and refer to the mineral and condiment, or it could be a verb, \"salting\" or bringing out the flavors in other things.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "salt,", "uuid" : "A8501477", "_id" : { "$oid" : "5122e445d6401d020000005c" }, "permissions" : { "delete" : [ "brianb@mit.edu" ], "update" : [ "brianb@mit.edu" ], "admin" : [ "brianb@mit.edu" ], "read" : [ "brianb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3152, "end" : "/div[1]/p[1]", "endOffset" : 3157, "_id" : { "$oid" : "5122e445d6401d020000005d" } } ], "updated" : { "$date" : 1361241157123 }, "created" : { "$date" : 1361241157123 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e4522eee0e0200000028", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "maternal image", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "mouth", "uuid" : "415FD58E", "_id" : { "$oid" : "5122e4522eee0e0200000028" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3212, "end" : "/div[1]/p[1]", "endOffset" : 3217, "_id" : { "$oid" : "5122e4522eee0e0200000029" } } ], "updated" : { "$date" : 1361241170993 }, "created" : { "$date" : 1361241170993 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e457d6401d020000005e", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "maternal image", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "breasts", "uuid" : "7831233A", "_id" : { "$oid" : "5122e457d6401d020000005e" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3255, "end" : "/div[1]/p[1]", "endOffset" : 3262, "_id" : { "$oid" : "5122e457d6401d020000005f" } } ], "updated" : { "$date" : 1361241175884 }, "created" : { "$date" : 1361241175884 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e464d6401d0200000060", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "how does salt fit with stones?", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "salt", "uuid" : "3B9CC6E9", "_id" : { "$oid" : "5122e464d6401d0200000060" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3152, "end" : "/div[1]/p[1]", "endOffset" : 3156, "_id" : { "$oid" : "5122e464d6401d0200000061" } } ], "updated" : { "$date" : 1361241188676 }, "created" : { "$date" : 1361241188676 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e493d6401d0200000062", "user" : "lu16j@mit.edu", "username" : "Richard L.", "text" : "suspended, and ache later - more formal words", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "suspended", "uuid" : "3D3119B8", "_id" : { "$oid" : "5122e493d6401d0200000062" }, "permissions" : { "delete" : [ "lu16j@mit.edu" ], "update" : [ "lu16j@mit.edu" ], "admin" : [ "lu16j@mit.edu" ], "read" : [ "lu16j@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2564, "end" : "/div[1]/p[1]", "endOffset" : 2573, "_id" : { "$oid" : "5122e493d6401d0200000063" } } ], "updated" : { "$date" : 1361241235916 }, "created" : { "$date" : 1361241235916 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e4d82eee0e020000002a", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "can consider how dark and salt have hard endings, clear gets softer and we end with free with is very open", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "dark,", "uuid" : "97BC8500", "_id" : { "$oid" : "5122e4d82eee0e020000002a" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3146, "end" : "/div[1]/p[1]", "endOffset" : 3152, "_id" : { "$oid" : "5122e4d82eee0e020000002b" } } ], "updated" : { "$date" : 1361241304758 }, "created" : { "$date" : 1361241304758 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e4ded6401d0200000064", "user" : "brianb@mit.edu", "username" : "Brian B.", "text" : "Salt is also notable here because it comes from the sea, and is a sort of rock-like, which works with the rocky themes in this passage", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "salt, clear", "uuid" : "49D432D4", "_id" : { "$oid" : "5122e4ded6401d0200000064" }, "permissions" : { "delete" : [ "brianb@mit.edu" ], "update" : [ "brianb@mit.edu" ], "admin" : [ "brianb@mit.edu" ], "read" : [ "brianb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3152, "end" : "/div[1]/p[1]", "endOffset" : 3163, "_id" : { "$oid" : "5122e4ded6401d0200000065" } } ], "updated" : { "$date" : 1361241310125 }, "created" : { "$date" : 1361241310125 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e4f4d6401d0200000066", "user" : "lu16j@mit.edu", "username" : "Richard L.", "text" : "suspended, (later on) ache - formal words", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "suspended", "uuid" : "9B93C3F3", "_id" : { "$oid" : "5122e4f4d6401d0200000066" }, "permissions" : { "delete" : [ "lu16j@mit.edu" ], "update" : [ "lu16j@mit.edu" ], "admin" : [ "lu16j@mit.edu" ], "read" : [ "lu16j@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2564, "end" : "/div[1]/p[1]", "endOffset" : 2573, "_id" : { "$oid" : "5122e4f4d6401d0200000067" } } ], "updated" : { "$date" : 1361241332078 }, "created" : { "$date" : 1361241332078 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e512d6401d0200000068", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "still talking about stones", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "cold hard mouth\nof the world", "uuid" : "4E42391F", "_id" : { "$oid" : "5122e512d6401d0200000068" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3202, "end" : "/div[1]/p[1]", "endOffset" : 3230, "_id" : { "$oid" : "5122e512d6401d0200000069" } } ], "updated" : { "$date" : 1361241362735 }, "created" : { "$date" : 1361241362735 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e519d6401d020000006a", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "talking about stones again", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "rocky", "uuid" : "3E35C7D3", "_id" : { "$oid" : "5122e519d6401d020000006a" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3249, "end" : "/div[1]/p[1]", "endOffset" : 3254, "_id" : { "$oid" : "5122e519d6401d020000006b" } } ], "updated" : { "$date" : 1361241369427 }, "created" : { "$date" : 1361241369427 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e53a2eee0e020000002c", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "micro to macro", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "stones and then the world", "uuid" : "F6E7ACEC", "_id" : { "$oid" : "5122e53a2eee0e020000002c" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2763, "end" : "/div[1]/p[1]", "endOffset" : 2788, "_id" : { "$oid" : "5122e53a2eee0e020000002d" } } ], "updated" : { "$date" : 1361241402886 }, "created" : { "$date" : 1361241402886 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e56c2eee0e020000002e", "user" : "artsy568@mit.edu", "username" : "Kira S.", "text" : "She goes from micro to macro, relating the stones in the water to the world, a big stone with the sky as the water.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "above the stones and then the world.", "uuid" : "1E2D1591", "_id" : { "$oid" : "5122e56c2eee0e020000002e" }, "permissions" : { "delete" : [ "artsy568@mit.edu" ], "update" : [ "artsy568@mit.edu" ], "admin" : [ "artsy568@mit.edu" ], "read" : [ "artsy568@mit.edu" ] }, "tags" : [ "micro", "macro" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2753, "end" : "/div[1]/p[1]", "endOffset" : 2789, "_id" : { "$oid" : "5122e56c2eee0e020000002f" } } ], "updated" : { "$date" : 1361241452018 }, "created" : { "$date" : 1361241452018 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5122e5972eee0e0200000030" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361241495643 }, "id" : "5122e5972eee0e0200000030", "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "quote" : "drawn from the cold hard mouth", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3187, "end" : "/div[1]/p[1]", "endOffset" : 3217, "_id" : { "$oid" : "5122e5972eee0e0200000031" } } ], "tags" : [], "text" : "draw from the mouth is unnatural, we expect to eat with the mouth and have things go in, not drawn out, evokes vomit", "updated" : { "$date" : 1361241523379 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "kgero@mit.edu", "username" : "Katy G.", "uuid" : "11AAAB4F" } -{ "id" : "5122e5bed6401d020000006c", "user" : "brianb@mit.edu", "username" : "Brian B.", "text" : "Very evocative here. When I think of a mouth, I think of eating, consuming, and a sort of one-way passage. The thought of something being drawn out is foreign, almost like vomiting. It makes me think of sickness.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "drawn from the cold hard mouth", "uuid" : "D6B5229C", "_id" : { "$oid" : "5122e5bed6401d020000006c" }, "permissions" : { "delete" : [ "brianb@mit.edu" ], "update" : [ "brianb@mit.edu" ], "admin" : [ "brianb@mit.edu" ], "read" : [ "brianb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3187, "end" : "/div[1]/p[1]", "endOffset" : 3217, "_id" : { "$oid" : "5122e5bed6401d020000006d" } } ], "updated" : { "$date" : 1361241534157 }, "created" : { "$date" : 1361241534157 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e5fcd6401d020000006e", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "irregular or personification", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "indifferently swinging", "uuid" : "1EC7B35C", "_id" : { "$oid" : "5122e5fcd6401d020000006e" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2683, "end" : "/div[1]/p[1]", "endOffset" : 2705, "_id" : { "$oid" : "5122e5fcd6401d020000006f" } } ], "updated" : { "$date" : 1361241596566 }, "created" : { "$date" : 1361241596566 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5122e67e2eee0e0200000032" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361241726988 }, "id" : "5122e67e2eee0e0200000032", "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "quote" : "indifferently swinging", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2683, "end" : "/div[1]/p[1]", "endOffset" : 2705, "_id" : { "$oid" : "5122e67e2eee0e0200000033" } } ], "tags" : [], "text" : "pendulum like, waves, tides, a very ancient idea/observation", "updated" : { "$date" : 1361241760653 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "kgero@mit.edu", "username" : "Katy G.", "uuid" : "6C8B7345" } -{ "id" : "5122e6b1d6401d0200000070", "user" : "brianb@mit.edu", "username" : "Brian B.", "text" : "Very interesting here. Is the personification of the water here, or does the indifferent swinging refer to very regular, pendulum-like motion of the water? This makes me think of how regular wave motions and tide motions are, such that hundreds of years ago their indifferent swinging motions could be predicted.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "slightly, indifferently swinging", "uuid" : "CEB2CC30", "_id" : { "$oid" : "5122e6b1d6401d0200000070" }, "permissions" : { "delete" : [ "brianb@mit.edu" ], "update" : [ "brianb@mit.edu" ], "admin" : [ "brianb@mit.edu" ], "read" : [ "brianb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2673, "end" : "/div[1]/p[1]", "endOffset" : 2705, "_id" : { "$oid" : "5122e6b1d6401d0200000071" } } ], "updated" : { "$date" : 1361241777055 }, "created" : { "$date" : 1361241777055 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e6ec2eee0e0200000034", "user" : "kgero@mit.edu", "username" : "Katy G.", "text" : "are not near the ocean, are they?", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Christmas trees", "uuid" : "B381DF48", "_id" : { "$oid" : "5122e6ec2eee0e0200000034" }, "permissions" : { "delete" : [ "kgero@mit.edu" ], "update" : [ "kgero@mit.edu" ], "admin" : [ "kgero@mit.edu" ], "read" : [ "kgero@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2503, "end" : "/div[1]/p[1]", "endOffset" : 2518, "_id" : { "$oid" : "5122e6ec2eee0e0200000035" } } ], "updated" : { "$date" : 1361241836039 }, "created" : { "$date" : 1361241836039 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e78cd6401d0200000072", "user" : "brianb@mit.edu", "username" : "Brian B.", "text" : "I think of Christmas trees growing in a fresh-water environment, not a salt water one or sea described in the passage. Could this be the great lakes?", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Bluish, associating with their shadows,\na million Christmas trees stand\nwaiting for Christmas.", "uuid" : "D65E21E2", "_id" : { "$oid" : "5122e78cd6401d0200000072" }, "permissions" : { "delete" : [ "brianb@mit.edu" ], "update" : [ "brianb@mit.edu" ], "admin" : [ "brianb@mit.edu" ], "read" : [ "brianb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2453, "end" : "/div[1]/p[1]", "endOffset" : 2548, "_id" : { "$oid" : "5122e78cd6401d0200000073" } } ], "updated" : { "$date" : 1361241996815 }, "created" : { "$date" : 1361241996815 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e8a7d6401d0200000074", "user" : "brianb@mit.edu", "username" : "Brian B.", "text" : "This is very weird phrasing here. Why does the pain go from hand to wrist to bones and then back to the hand. Why does it have to come full circle? Is it like a wave, flowing inward then out again?", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "If you should dip your hand in,\nyour wrist would ache immediately,\nyour bones would begin to ache and your hand would burn", "uuid" : "FC32D564", "_id" : { "$oid" : "5122e8a7d6401d0200000074" }, "permissions" : { "delete" : [ "brianb@mit.edu" ], "update" : [ "brianb@mit.edu" ], "admin" : [ "brianb@mit.edu" ], "read" : [ "brianb@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2790, "end" : "/div[1]/p[1]", "endOffset" : 2912, "_id" : { "$oid" : "5122e8a7d6401d0200000075" } } ], "updated" : { "$date" : 1361242279584 }, "created" : { "$date" : 1361242279584 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5122e8dfd6401d0200000076", "user" : "artsy568@mit.edu", "username" : "Kira S.", "text" : "The commas and the repetition of the \"s\" sound force you speak in a rhythm, it might be irregular but it's still a rhythm", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "I have seen it over and over, the same sea, the same,\nslightly, indifferently swinging above the stones,\nicily free above the stones,", "uuid" : "4ADDC934", "_id" : { "$oid" : "5122e8dfd6401d0200000076" }, "permissions" : { "delete" : [ "artsy568@mit.edu" ], "update" : [ "artsy568@mit.edu" ], "admin" : [ "artsy568@mit.edu" ], "read" : [ "artsy568@mit.edu" ] }, "tags" : [ "s", "sound", "rhythm", "commas" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2619, "end" : "/div[1]/p[1]", "endOffset" : 2752, "_id" : { "$oid" : "5122e8dfd6401d0200000077" } } ], "updated" : { "$date" : 1361242335970 }, "created" : { "$date" : 1361242335970 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5123137d2eee0e0200000036", "user" : "alvarom@mit.edu", "username" : "Alvaro M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "I have learned to look beyond present and smaller troubles, and to be quieted under them. As Moses said, \"Stand still and see the salvation of the Lord\" (Exodus 14.13).", "uuid" : "F0D70878", "_id" : { "$oid" : "5123137d2eee0e0200000036" }, "permissions" : { "delete" : [ "alvarom@mit.edu" ], "update" : [ "alvarom@mit.edu" ], "admin" : [ "alvarom@mit.edu" ], "read" : [ "alvarom@mit.edu" ] }, "tags" : [ "group-one" ], "ranges" : [ { "start" : "/div[1]/p[80]", "startOffset" : 1817, "end" : "/div[1]/p[80]", "endOffset" : 1985, "_id" : { "$oid" : "5123137d2eee0e0200000037" } } ], "updated" : { "$date" : 1361253245967 }, "created" : { "$date" : 1361253245967 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 2, "_id" : { "$oid" : "51235af8754e900200000002" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361271544180 }, "id" : "51235af8754e900200000002", "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "quote" : "\"And I only am escaped alone to tell the News\" (Job 1.15).", "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 287, "end" : "/div[1]/p[4]", "endOffset" : 345, "_id" : { "$oid" : "51235af8754e900200000003" } } ], "tags" : [ "thesis", "verses" ], "text" : "Reference to Job", "updated" : { "$date" : 1361271780115 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "uuid" : "7C820898" } -{ "__v" : 1, "_id" : { "$oid" : "51235b49754e900200000004" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361271625069 }, "id" : "51235b49754e900200000004", "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "quote" : "There was one who was chopped into the head with a hatchet, and stripped naked, and yet was crawling up and down.", "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 629, "end" : "/div[1]/p[4]", "endOffset" : 743, "_id" : { "$oid" : "51235b49754e900200000005" } } ], "tags" : [ "imagery", "grotesque" ], "text" : "Beautifully grotesque", "updated" : { "$date" : 1361271769441 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "uuid" : "CC542715" } -{ "__v" : 3, "_id" : { "$oid" : "51235bbe754e900200000006" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361271742543 }, "id" : "51235bbe754e900200000006", "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "quote" : "yet the Lord by His almighty power preserved a number of us from death, for there were twenty-four of us taken alive and carried captive.", "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 1024, "end" : "/div[1]/p[4]", "endOffset" : 1163, "_id" : { "$oid" : "51235bbe754e900200000007" } } ], "tags" : [ "Lord", "power" ], "text" : "Ascribes their \"salvation\" to the \"almighty power\" of the Lord. ", "updated" : { "$date" : 1361272082770 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "uuid" : "07F93496" } -{ "id" : "51235c55e3e4120200000003", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "Allude to hell", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Oh the roaring, and singing and dancing, and yelling of those black creatures in the night, which made the place a lively resemblance of hell.", "uuid" : "FA9F9466", "_id" : { "$oid" : "51235c55e3e4120200000003" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "imagery", "hell" ], "ranges" : [ { "start" : "/div[1]/p[7]", "startOffset" : 509, "end" : "/div[1]/p[7]", "endOffset" : 651, "_id" : { "$oid" : "51235c55e3e4120200000004" } } ], "updated" : { "$date" : 1361271893134 }, "created" : { "$date" : 1361271893134 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51235c97e3e4120200000005", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "Lost everything, similar to Job", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "All was gone, my husband gone (at least separated from me, he being in the Bay; and to add to my grief, the Indians told me they would kill him as he came homeward), my children gone, my relations and friends gone, our house and home and all our comforts—within door and without—all was gone (except my life), and I knew not but the next moment that might go too.", "uuid" : "54C57D91", "_id" : { "$oid" : "51235c97e3e4120200000005" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "condition", "job" ], "ranges" : [ { "start" : "/div[1]/p[7]", "startOffset" : 1099, "end" : "/div[1]/p[7]", "endOffset" : 1463, "_id" : { "$oid" : "51235c97e3e4120200000006" } } ], "updated" : { "$date" : 1361271959649 }, "created" : { "$date" : 1361271959649 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51235ce3754e900200000008", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "Another reference to God and some sort of saving grace.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "but God was with me in a wonderful manner, carrying me along, and bearing up my spirit, that it did not quite fail.", "uuid" : "3BBB137F", "_id" : { "$oid" : "51235ce3754e900200000008" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "lord" ], "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 267, "end" : "/div[1]/p[10]", "endOffset" : 382, "_id" : { "$oid" : "51235ce3754e900200000009" } } ], "updated" : { "$date" : 1361272035717 }, "created" : { "$date" : 1361272035717 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51235d36e3e4120200000007", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "The Lord kept her going", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "But the Lord renewed my strength still, and carried me along, that I might see more of His power; yea, so much that I could never have thought of, had I not experienced it.", "uuid" : "C556DCDD", "_id" : { "$oid" : "51235d36e3e4120200000007" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "lord", "power" ], "ranges" : [ { "start" : "/div[1]/p[10]", "startOffset" : 1026, "end" : "/div[1]/p[10]", "endOffset" : 1199, "_id" : { "$oid" : "51235d36e3e4120200000008" } } ], "updated" : { "$date" : 1361272118577 }, "created" : { "$date" : 1361272118577 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51235d5ee3e4120200000009", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "Lord saved her", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Oh, I may see the wonderful power of God, that my Spirit did not utterly sink under my affliction: still the Lord upheld me with His gracious and merciful spirit, and we were both alive to see the light of the next morning.", "uuid" : "B90F12CC", "_id" : { "$oid" : "51235d5ee3e4120200000009" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "lord", "power" ], "ranges" : [ { "start" : "/div[1]/p[11]", "startOffset" : 598, "end" : "/div[1]/p[11]", "endOffset" : 822, "_id" : { "$oid" : "51235d5ee3e412020000000a" } } ], "updated" : { "$date" : 1361272158654 }, "created" : { "$date" : 1361272158654 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512360d7e3e412020000000b", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "Reference to Job", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "We had husband and father, and children, and sisters, and friends, and relations, and house, and home, and many comforts of this life: but now we may say, as Job, \"Naked came I out of my mother's womb, and naked shall I return: the Lord gave, the Lord hath taken away, blessed be the name of the Lord.\"", "uuid" : "CB6A2BA3", "_id" : { "$oid" : "512360d7e3e412020000000b" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "condition", "job" ], "ranges" : [ { "start" : "/div[1]/p[27]", "startOffset" : 825, "end" : "/div[1]/p[27]", "endOffset" : 1127, "_id" : { "$oid" : "512360d7e3e412020000000c" } } ], "updated" : { "$date" : 1361273047306 }, "created" : { "$date" : 1361273047306 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "51236191e3e412020000000d" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361273233813 }, "id" : "51236191e3e412020000000d", "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "quote" : "Then I may say as Job 6.7, \"The things that my soul refused to touch are as my sorrowful meat.\" Thus the Lord made that pleasant refreshing, which another time would have been an abomination.", "ranges" : [ { "start" : "/div[1]/p[57]", "startOffset" : 1110, "end" : "/div[1]/p[57]", "endOffset" : 1302, "_id" : { "$oid" : "51236191e3e412020000000e" } } ], "tags" : [ "Job", "condition" ], "text" : "Reference to Job. Her poor condition has driven her to do things she would have normally considered crude, \"abominations\".", "updated" : { "$date" : 1361273242096 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "uuid" : "BB1EBA11" } -{ "id" : "51236620754e90020000000c", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "No food for days.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "there being not the least crumb of refreshing that came within either of our mouths from Wednesday night to Saturday night, except only a little cold water.", "uuid" : "AB6BC51F", "_id" : { "$oid" : "51236620754e90020000000c" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "condition" ], "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 385, "end" : "/div[1]/p[13]", "endOffset" : 542, "_id" : { "$oid" : "51236620754e90020000000d" } } ], "updated" : { "$date" : 1361274400250 }, "created" : { "$date" : 1361274400250 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5123665d754e90020000000e", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"I had fainted, unless I had believed, etc\"", "uuid" : "D0D5BF7C", "_id" : { "$oid" : "5123665d754e90020000000e" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 813, "end" : "/div[1]/p[13]", "endOffset" : 857, "_id" : { "$oid" : "5123665d754e90020000000f" } } ], "updated" : { "$date" : 1361274461972 }, "created" : { "$date" : 1361274461972 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51236696e3e412020000000f", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "She can justify why God would want to punish her", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "I then remembered how careless I had been of God's holy time; how many Sabbaths I had lost and misspent, and how evilly I had walked in God's sight; which lay so close unto my spirit, that it was easy for me to see how righteous it was with God to cut off the thread of my life and cast me out of His presence forever", "uuid" : "DF4CB5F3", "_id" : { "$oid" : "51236696e3e412020000000f" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "condtion", "Lord", "power" ], "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 902, "end" : "/div[1]/p[13]", "endOffset" : 1219, "_id" : { "$oid" : "51236696e3e4120200000010" } } ], "updated" : { "$date" : 1361274518559 }, "created" : { "$date" : 1361274518559 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512366ab754e900200000010", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "Duality of God?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "He wounded me with one hand, so he healed me with the other.", "uuid" : "98038C3F", "_id" : { "$oid" : "512366ab754e900200000010" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "imagery", "Lord" ], "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 1282, "end" : "/div[1]/p[13]", "endOffset" : 1342, "_id" : { "$oid" : "512366ab754e900200000011" } } ], "updated" : { "$date" : 1361274539851 }, "created" : { "$date" : 1361274539851 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512366e4754e900200000012", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"My wounds stink and are corrupt, I am troubled, I am bowed down greatly, I go mourning all the day long.\"", "uuid" : "085942FB", "_id" : { "$oid" : "512366e4754e900200000012" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[13]", "startOffset" : 2124, "end" : "/div[1]/p[13]", "endOffset" : 2230, "_id" : { "$oid" : "512366e4754e900200000013" } } ], "updated" : { "$date" : 1361274596477 }, "created" : { "$date" : 1361274596477 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51236753e3e4120200000011", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "It? Strange twist of events", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "It being about six years, and five months old.", "uuid" : "41B9EC61", "_id" : { "$oid" : "51236753e3e4120200000011" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 528, "end" : "/div[1]/p[14]", "endOffset" : 574, "_id" : { "$oid" : "51236753e3e4120200000012" } } ], "updated" : { "$date" : 1361274707434 }, "created" : { "$date" : 1361274707434 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51236809e3e4120200000013", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "Praying to God. Praying for sign of relief. ", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Whereupon I earnestly entreated the Lord, that He would consider my low estate, and show me a token for good, and if it were His blessed will, some sign and hope of some relief.", "uuid" : "41A57266", "_id" : { "$oid" : "51236809e3e4120200000013" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "prayer", "condtion", "Lord" ], "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 3116, "end" : "/div[1]/p[14]", "endOffset" : 3293, "_id" : { "$oid" : "51236809e3e4120200000014" } } ], "updated" : { "$date" : 1361274889886 }, "created" : { "$date" : 1361274889886 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5123685f754e900200000014", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "Answer to her prayer?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "I took this to be some gracious answer to my earnest and unfeigned desire.", "uuid" : "D7EB8EE5", "_id" : { "$oid" : "5123685f754e900200000014" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "prayer", "Lord" ], "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 4305, "end" : "/div[1]/p[14]", "endOffset" : 4380, "_id" : { "$oid" : "5123685f754e900200000015" } } ], "updated" : { "$date" : 1361274975780 }, "created" : { "$date" : 1361274975780 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5123699ce3e4120200000015", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"Wait on the Lord, Be of good courage, and he shall strengthen thine Heart, wait I say on the Lord.\"", "uuid" : "DEF980FD", "_id" : { "$oid" : "5123699ce3e4120200000015" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[15]", "startOffset" : 1087, "end" : "/div[1]/p[15]", "endOffset" : 1188, "_id" : { "$oid" : "5123699ce3e4120200000016" } } ], "updated" : { "$date" : 1361275292708 }, "created" : { "$date" : 1361275292708 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51236a37754e900200000016", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"Thus saith the Lord, refrain thy voice from weeping, and thine eyes from tears, for thy work shall be rewarded, and they shall come again from the land of the enemy\"", "uuid" : "13B0997E", "_id" : { "$oid" : "51236a37754e900200000016" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[18]", "startOffset" : 495, "end" : "/div[1]/p[18]", "endOffset" : 661, "_id" : { "$oid" : "51236a37754e900200000017" } } ], "updated" : { "$date" : 1361275447388 }, "created" : { "$date" : 1361275447388 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51236be4754e900200000018", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "Quick to accredit good fortune to God.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "which cannot but be acknowledged as a favor of God to my weakened body", "uuid" : "891A66A9", "_id" : { "$oid" : "51236be4754e900200000018" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "Lord", "power" ], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 1501, "end" : "/div[1]/p[20]", "endOffset" : 1571, "_id" : { "$oid" : "51236be4754e900200000019" } } ], "updated" : { "$date" : 1361275876431 }, "created" : { "$date" : 1361275876431 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51236bf7e3e4120200000017", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"When thou passeth through the waters I will be with thee, and through the rivers they shall not overflow thee\"", "uuid" : "3CC6FBE1", "_id" : { "$oid" : "51236bf7e3e4120200000017" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[20]", "startOffset" : 1665, "end" : "/div[1]/p[20]", "endOffset" : 1776, "_id" : { "$oid" : "51236bf7e3e4120200000018" } } ], "updated" : { "$date" : 1361275895491 }, "created" : { "$date" : 1361275895491 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51236c54e3e4120200000019", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "A child", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "papooses", "uuid" : "F200004B", "_id" : { "$oid" : "51236c54e3e4120200000019" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 902, "end" : "/div[1]/p[21]", "endOffset" : 910, "_id" : { "$oid" : "51236c54e3e412020000001a" } } ], "updated" : { "$date" : 1361275988654 }, "created" : { "$date" : 1361275988654 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51236c7de3e412020000001b", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "A flickering possibility of questioning.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "And here I cannot but take notice of the strange providence of God in preserving the heathen.", "uuid" : "0C934E50", "_id" : { "$oid" : "51236c7de3e412020000001b" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "Lord", "questioning" ], "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 733, "end" : "/div[1]/p[21]", "endOffset" : 826, "_id" : { "$oid" : "51236c7de3e412020000001c" } } ], "updated" : { "$date" : 1361276029366 }, "created" : { "$date" : 1361276029366 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51236cd1754e90020000001a", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "As with good fortune, bad fortune is ascribed to God", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "God did not give them courage or activity to go over after us.", "uuid" : "97DCD4FD", "_id" : { "$oid" : "51236cd1754e90020000001a" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "Lord" ], "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 1285, "end" : "/div[1]/p[21]", "endOffset" : 1347, "_id" : { "$oid" : "51236cd1754e90020000001b" } } ], "updated" : { "$date" : 1361276113916 }, "created" : { "$date" : 1361276113916 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51236cea754e90020000001c", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"Oh that my people had hearkened to me, and Israel had walked in my ways, I should soon have subdued their enemies, and turned my hand against their adversaries\"", "uuid" : "8DD13FC5", "_id" : { "$oid" : "51236cea754e90020000001c" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[21]", "startOffset" : 1586, "end" : "/div[1]/p[21]", "endOffset" : 1748, "_id" : { "$oid" : "51236cea754e90020000001d" } } ], "updated" : { "$date" : 1361276138852 }, "created" : { "$date" : 1361276138852 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51236da8754e90020000001e", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"For to the hungry soul every bitter thing is sweet.\"", "uuid" : "EA575580", "_id" : { "$oid" : "51236da8754e90020000001e" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "Verses" ], "ranges" : [ { "start" : "/div[1]/p[25]", "startOffset" : 1552, "end" : "/div[1]/p[25]", "endOffset" : 1605, "_id" : { "$oid" : "51236da8754e90020000001f" } } ], "updated" : { "$date" : 1361276328965 }, "created" : { "$date" : 1361276328965 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51236df8e3e412020000001d", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"I shall not die but live, and declare the works of the Lord: the Lord hath chastened me sore yet he hath not given me over to death\"", "uuid" : "FEBF88E0", "_id" : { "$oid" : "51236df8e3e412020000001d" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[27]", "startOffset" : 1267, "end" : "/div[1]/p[27]", "endOffset" : 1400, "_id" : { "$oid" : "51236df8e3e412020000001e" } } ], "updated" : { "$date" : 1361276408912 }, "created" : { "$date" : 1361276408912 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51236e4a754e900200000020", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "First time crying.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Then my heart began to fail: and I fell aweeping, which was the first time to my remembrance, that I wept before them.", "uuid" : "2E4C8695", "_id" : { "$oid" : "51236e4a754e900200000020" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[27]", "startOffset" : 2281, "end" : "/div[1]/p[27]", "endOffset" : 2400, "_id" : { "$oid" : "51236e4a754e900200000021" } } ], "updated" : { "$date" : 1361276490058 }, "created" : { "$date" : 1361276490058 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51236e5ae3e412020000001f", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"By the Rivers of Babylon, there we sate down: yea, we wept when we remembered Zion.\"", "uuid" : "F53BA667", "_id" : { "$oid" : "51236e5ae3e412020000001f" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[27]", "startOffset" : 2639, "end" : "/div[1]/p[27]", "endOffset" : 2724, "_id" : { "$oid" : "51236e5ae3e4120200000020" } } ], "updated" : { "$date" : 1361276506617 }, "created" : { "$date" : 1361276506617 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51236fb6754e900200000022", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"Cast thy burden upon the Lord, and He shall sustain thee\"", "uuid" : "10FCC3D8", "_id" : { "$oid" : "51236fb6754e900200000022" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[31]", "startOffset" : 2316, "end" : "/div[1]/p[31]", "endOffset" : 2374, "_id" : { "$oid" : "51236fb6754e900200000023" } } ], "updated" : { "$date" : 1361276854321 }, "created" : { "$date" : 1361276854321 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5123707f754e900200000024" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361277055036 }, "id" : "5123707f754e900200000024", "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "quote" : "Sometimes I met with favor, and sometimes with nothing but frowns.", "ranges" : [ { "start" : "/div[1]/p[35]", "startOffset" : 551, "end" : "/div[1]/p[35]", "endOffset" : 618, "_id" : { "$oid" : "5123707f754e900200000025" } } ], "tags" : [ "Lord" ], "text" : "Does not seem to assign the whims of these indians to God. Strange, since she has already readily assigned previous \"random\" events to God", "updated" : { "$date" : 1361277064701 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "uuid" : "D0A0C0F3" } -{ "id" : "512370a3754e900200000026", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"I know, O Lord, that thy judgments are right, and that thou in faithfulness hast afflicted me\"", "uuid" : "96AE3CEF", "_id" : { "$oid" : "512370a3754e900200000026" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[37]", "startOffset" : 514, "end" : "/div[1]/p[37]", "endOffset" : 610, "_id" : { "$oid" : "512370a3754e900200000027" } } ], "updated" : { "$date" : 1361277091348 }, "created" : { "$date" : 1361277091348 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51237168754e900200000028", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "Married male indian", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "sannup", "uuid" : "76B98C9F", "_id" : { "$oid" : "51237168754e900200000028" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[40]", "startOffset" : 394, "end" : "/div[1]/p[40]", "endOffset" : 400, "_id" : { "$oid" : "51237168754e900200000029" } } ], "updated" : { "$date" : 1361277288515 }, "created" : { "$date" : 1361277288515 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 2, "_id" : { "$oid" : "51237196e3e4120200000021" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361277334542 }, "id" : "51237196e3e4120200000021", "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "quote" : "But (to my amazement and great perplexity) the scale was soon turned", "ranges" : [ { "start" : "/div[1]/p[40]", "startOffset" : 149, "end" : "/div[1]/p[40]", "endOffset" : 217, "_id" : { "$oid" : "51237196e3e4120200000022" } } ], "tags" : [ "Lord" ], "text" : "Perplexity? Shouldn't she just believe that whatever happens is God's will?", "updated" : { "$date" : 1361277347179 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "uuid" : "19984352" } -{ "id" : "512371bde3e4120200000023", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"Be still, and know that I am God\"", "uuid" : "81114849", "_id" : { "$oid" : "512371bde3e4120200000023" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[40]", "startOffset" : 833, "end" : "/div[1]/p[40]", "endOffset" : 867, "_id" : { "$oid" : "512371bde3e4120200000024" } } ], "updated" : { "$date" : 1361277373761 }, "created" : { "$date" : 1361277373761 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512372b0e3e4120200000025", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "verses", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"I will go out and shake myself as at other times, but he wist not that the Lord was departed from him.\"", "uuid" : "B9344F2F", "_id" : { "$oid" : "512372b0e3e4120200000025" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 1884, "end" : "/div[1]/p[42]", "endOffset" : 1988, "_id" : { "$oid" : "512372b0e3e4120200000026" } } ], "updated" : { "$date" : 1361277616570 }, "created" : { "$date" : 1361277616570 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512372ec754e90020000002a", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "No comfort in the bible...?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Then also I took my Bible to read, but I found no comfort here neither, which many times I was wont to find.", "uuid" : "17B2F953", "_id" : { "$oid" : "512372ec754e90020000002a" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "questioning" ], "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 2562, "end" : "/div[1]/p[42]", "endOffset" : 2671, "_id" : { "$oid" : "512372ec754e90020000002b" } } ], "updated" : { "$date" : 1361277676213 }, "created" : { "$date" : 1361277676213 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51237334754e90020000002c", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"For my thoughts are not your thoughts, neither are your ways my ways, saith the Lord.\"", "uuid" : "040E782F", "_id" : { "$oid" : "51237334754e90020000002c" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 3150, "end" : "/div[1]/p[42]", "endOffset" : 3237, "_id" : { "$oid" : "51237334754e90020000002d" } } ], "updated" : { "$date" : 1361277748713 }, "created" : { "$date" : 1361277748713 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5123733c754e90020000002e", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"Commit thy way unto the Lord; trust also in him; and he shall bring it to pass.\"", "uuid" : "75247BE4", "_id" : { "$oid" : "5123733c754e90020000002e" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 3269, "end" : "/div[1]/p[42]", "endOffset" : 3350, "_id" : { "$oid" : "5123733c754e90020000002f" } } ], "updated" : { "$date" : 1361277756403 }, "created" : { "$date" : 1361277756403 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51237391754e900200000030", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "Satan?", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "So like were these barbarous creatures to him who was a liar from the beginning.", "uuid" : "5A93AF27", "_id" : { "$oid" : "51237391754e900200000030" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 4278, "end" : "/div[1]/p[42]", "endOffset" : 4359, "_id" : { "$oid" : "51237391754e900200000031" } } ], "updated" : { "$date" : 1361277841069 }, "created" : { "$date" : 1361277841069 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512374ec754e900200000032", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"That we may be delivered from unreasonable and wicked men\"", "uuid" : "4C1C92EC", "_id" : { "$oid" : "512374ec754e900200000032" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[45]", "startOffset" : 1058, "end" : "/div[1]/p[45]", "endOffset" : 1117, "_id" : { "$oid" : "512374ec754e900200000033" } } ], "updated" : { "$date" : 1361278188080 }, "created" : { "$date" : 1361278188080 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51237509e3e4120200000027", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"I am in a great strait\"", "uuid" : "284FFB34", "_id" : { "$oid" : "51237509e3e4120200000027" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[45]", "startOffset" : 1747, "end" : "/div[1]/p[45]", "endOffset" : 1772, "_id" : { "$oid" : "51237509e3e4120200000028" } } ], "updated" : { "$date" : 1361278217688 }, "created" : { "$date" : 1361278217688 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5123753be3e4120200000029", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"For a small moment have I forsaken thee, but with great mercies will I gather thee\"", "uuid" : "C31F3157", "_id" : { "$oid" : "5123753be3e4120200000029" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[46]", "startOffset" : 187, "end" : "/div[1]/p[46]", "endOffset" : 271, "_id" : { "$oid" : "5123753be3e412020000002a" } } ], "updated" : { "$date" : 1361278267577 }, "created" : { "$date" : 1361278267577 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51237585754e900200000034", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"Like a crane, or a swallow, so did I chatter; I did mourn as a dove, mine eyes ail with looking upward. Oh, Lord, I am oppressed; undertake for me\"", "uuid" : "B79D29A3", "_id" : { "$oid" : "51237585754e900200000034" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[47]", "startOffset" : 564, "end" : "/div[1]/p[47]", "endOffset" : 712, "_id" : { "$oid" : "51237585754e900200000035" } } ], "updated" : { "$date" : 1361278341505 }, "created" : { "$date" : 1361278341505 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51237596e3e412020000002b", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"Remember now O Lord, I beseech thee, how I have walked before thee in truth.\"", "uuid" : "74226A5F", "_id" : { "$oid" : "51237596e3e412020000002b" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[47]", "startOffset" : 764, "end" : "/div[1]/p[47]", "endOffset" : 844, "_id" : { "$oid" : "51237596e3e412020000002c" } } ], "updated" : { "$date" : 1361278358817 }, "created" : { "$date" : 1361278358817 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512375ade3e412020000002d", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"Against thee, thee only have I sinned\"", "uuid" : "87C109C0", "_id" : { "$oid" : "512375ade3e412020000002d" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[47]", "startOffset" : 1037, "end" : "/div[1]/p[47]", "endOffset" : 1076, "_id" : { "$oid" : "512375ade3e412020000002e" } } ], "updated" : { "$date" : 1361278381855 }, "created" : { "$date" : 1361278381855 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512375b7754e900200000036", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"God be merciful unto me a sinner.\"", "uuid" : "E7537E3C", "_id" : { "$oid" : "512375b7754e900200000036" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[47]", "startOffset" : 1118, "end" : "/div[1]/p[47]", "endOffset" : 1153, "_id" : { "$oid" : "512375b7754e900200000037" } } ], "updated" : { "$date" : 1361278391055 }, "created" : { "$date" : 1361278391055 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512375cde3e412020000002f", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"He would fain have filled his belly with the husks that the swine did eat, and no man gave unto him\"", "uuid" : "2EE62F53", "_id" : { "$oid" : "512375cde3e412020000002f" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[47]", "startOffset" : 1388, "end" : "/div[1]/p[47]", "endOffset" : 1489, "_id" : { "$oid" : "512375cde3e4120200000030" } } ], "updated" : { "$date" : 1361278413798 }, "created" : { "$date" : 1361278413798 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512375dee3e4120200000031", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"Father, I have sinned against Heaven and in thy sight.\"", "uuid" : "717B01E8", "_id" : { "$oid" : "512375dee3e4120200000031" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[47]", "startOffset" : 1529, "end" : "/div[1]/p[47]", "endOffset" : 1585, "_id" : { "$oid" : "512375dee3e4120200000032" } } ], "updated" : { "$date" : 1361278430512 }, "created" : { "$date" : 1361278430512 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512375ffe3e4120200000033", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"For a small moment have I forsaken thee, but with great mercies will I gather thee.\"", "uuid" : "D2D92176", "_id" : { "$oid" : "512375ffe3e4120200000033" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[47]", "startOffset" : 2097, "end" : "/div[1]/p[47]", "endOffset" : 2182, "_id" : { "$oid" : "512375ffe3e4120200000034" } } ], "updated" : { "$date" : 1361278463441 }, "created" : { "$date" : 1361278463441 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5123769b754e900200000038", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"Thou shalt eat and not be satisfied\"", "uuid" : "6A9F3C9A", "_id" : { "$oid" : "5123769b754e900200000038" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[51]", "startOffset" : 1043, "end" : "/div[1]/p[51]", "endOffset" : 1080, "_id" : { "$oid" : "5123769b754e900200000039" } } ], "updated" : { "$date" : 1361278619077 }, "created" : { "$date" : 1361278619077 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512376ac754e90020000003a", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"Shall there be evil in a City and the Lord hath not done it?\"", "uuid" : "E178080C", "_id" : { "$oid" : "512376ac754e90020000003a" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[51]", "startOffset" : 1275, "end" : "/div[1]/p[51]", "endOffset" : 1337, "_id" : { "$oid" : "512376ac754e90020000003b" } } ], "updated" : { "$date" : 1361278636848 }, "created" : { "$date" : 1361278636848 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512376c0e3e4120200000035", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"He hath showed thee (Oh Man) what is good, and what doth the Lord require of thee, but to do justly, and love mercy, and walk humbly with thy God? Hear ye the rod, and who hath appointed it\"", "uuid" : "DF76A3B6", "_id" : { "$oid" : "512376c0e3e4120200000035" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[51]", "startOffset" : 1450, "end" : "/div[1]/p[51]", "endOffset" : 1641, "_id" : { "$oid" : "512376c0e3e4120200000036" } } ], "updated" : { "$date" : 1361278656333 }, "created" : { "$date" : 1361278656333 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51237702754e90020000003c", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"When thou passest through the waters, I will be with thee; and through the rivers, they shall not overflow thee\"", "uuid" : "D5476B37", "_id" : { "$oid" : "51237702754e90020000003c" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[53]", "startOffset" : 480, "end" : "/div[1]/p[53]", "endOffset" : 593, "_id" : { "$oid" : "51237702754e90020000003d" } } ], "updated" : { "$date" : 1361278722357 }, "created" : { "$date" : 1361278722357 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51237748e3e4120200000037", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"I am poor and needy, and my heart is wounded within me. I am gone like the shadow when it declineth: I am tossed up and down like the locust; my knees are weak through fasting, and my flesh faileth of fatness\"", "uuid" : "68B6ECD5", "_id" : { "$oid" : "51237748e3e4120200000037" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[55]", "startOffset" : 277, "end" : "/div[1]/p[55]", "endOffset" : 487, "_id" : { "$oid" : "51237748e3e4120200000038" } } ], "updated" : { "$date" : 1361278792519 }, "created" : { "$date" : 1361278792519 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51237782e3e4120200000039", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"See, I pray you, how mine eyes have been enlightened, because I tasted a little of this honey\"", "uuid" : "C3BEB001", "_id" : { "$oid" : "51237782e3e4120200000039" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[55]", "startOffset" : 1279, "end" : "/div[1]/p[55]", "endOffset" : 1374, "_id" : { "$oid" : "51237782e3e412020000003a" } } ], "updated" : { "$date" : 1361278850632 }, "created" : { "$date" : 1361278850632 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512377fae3e412020000003b", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"When my foot slipped, thy mercy, O Lord, held me up.\"", "uuid" : "6171BBFC", "_id" : { "$oid" : "512377fae3e412020000003b" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[59]", "startOffset" : 504, "end" : "/div[1]/p[59]", "endOffset" : 558, "_id" : { "$oid" : "512377fae3e412020000003c" } } ], "updated" : { "$date" : 1361278970828 }, "created" : { "$date" : 1361278970828 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5123782d754e90020000003e", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"He made them also to be pitied of all those that carried them captives\"", "uuid" : "D1C906AB", "_id" : { "$oid" : "5123782d754e90020000003e" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[59]", "startOffset" : 1287, "end" : "/div[1]/p[59]", "endOffset" : 1360, "_id" : { "$oid" : "5123782d754e90020000003f" } } ], "updated" : { "$date" : 1361279021700 }, "created" : { "$date" : 1361279021700 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51237902e3e412020000003d", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"There was a famine in Samaria, and behold they besieged it, until an ass's head was sold for four-score pieces of silver, and the fourth part of a cab of dove's dung for five pieces of silver\"", "uuid" : "29874AA2", "_id" : { "$oid" : "51237902e3e412020000003d" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[61]", "startOffset" : 2171, "end" : "/div[1]/p[61]", "endOffset" : 2364, "_id" : { "$oid" : "51237902e3e412020000003e" } } ], "updated" : { "$date" : 1361279234572 }, "created" : { "$date" : 1361279234572 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51237c10754e900200000040", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"Oh, that my People had hearkened to me, and Israel had walked in my ways, I should soon have subdued their Enemies, and turned my hand against their Adversaries\"", "uuid" : "4239C857", "_id" : { "$oid" : "51237c10754e900200000040" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[73]", "startOffset" : 915, "end" : "/div[1]/p[73]", "endOffset" : 1078, "_id" : { "$oid" : "51237c10754e900200000041" } } ], "updated" : { "$date" : 1361280016647 }, "created" : { "$date" : 1361280016647 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51237c47e3e412020000003f", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "The \"evil\" ways of the Puritans has led God to strengthen their enemies, as opposed to defeating them.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "But now our perverse and evil carriages in the sight of the Lord, have so offended Him, that instead of turning His hand against them, the Lord feeds and nourishes them up to be a scourge to the whole land.", "uuid" : "0F1FDCC9", "_id" : { "$oid" : "51237c47e3e412020000003f" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "Lord", "power" ], "ranges" : [ { "start" : "/div[1]/p[73]", "startOffset" : 1095, "end" : "/div[1]/p[73]", "endOffset" : 1303, "_id" : { "$oid" : "51237c47e3e4120200000040" } } ], "updated" : { "$date" : 1361280071707 }, "created" : { "$date" : 1361280071707 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51237c84754e900200000042", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"The bitterness of Death is past.\"", "uuid" : "27945BB9", "_id" : { "$oid" : "51237c84754e900200000042" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[74]", "startOffset" : 927, "end" : "/div[1]/p[74]", "endOffset" : 962, "_id" : { "$oid" : "51237c84754e900200000043" } } ], "updated" : { "$date" : 1361280132644 }, "created" : { "$date" : 1361280132644 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51237ce0754e900200000044", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "Powerful testament of faith", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "but desired to wait God's time, that I might go home quietly, and without fear.", "uuid" : "E3DF2C94", "_id" : { "$oid" : "51237ce0754e900200000044" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "Lord" ], "ranges" : [ { "start" : "/div[1]/p[75]", "startOffset" : 689, "end" : "/div[1]/p[75]", "endOffset" : 768, "_id" : { "$oid" : "51237ce0754e900200000045" } } ], "updated" : { "$date" : 1361280224796 }, "created" : { "$date" : 1361280224796 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51237cf7e3e4120200000041", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "O the wonderful power of God that I have seen", "uuid" : "ACB442AD", "_id" : { "$oid" : "51237cf7e3e4120200000041" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "Lord", "power" ], "ranges" : [ { "start" : "/div[1]/p[75]", "startOffset" : 807, "end" : "/div[1]/p[75]", "endOffset" : 853, "_id" : { "$oid" : "51237cf7e3e4120200000042" } } ], "updated" : { "$date" : 1361280247254 }, "created" : { "$date" : 1361280247254 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51237d15e3e4120200000043", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"Oh give thanks unto the Lord for he is good, for his mercy endureth for ever.\"", "uuid" : "A279FAE2", "_id" : { "$oid" : "51237d15e3e4120200000043" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[75]", "startOffset" : 1470, "end" : "/div[1]/p[75]", "endOffset" : 1550, "_id" : { "$oid" : "51237d15e3e4120200000044" } } ], "updated" : { "$date" : 1361280277849 }, "created" : { "$date" : 1361280277849 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51237e17754e900200000046", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"Thus saith the Lord, Refrain thy voice from weeping, and thine eyes from tears, for thy Work shall be rewarded, saith the Lord, and they shall come again from the Land of the Enemy.\"", "uuid" : "4885BDF2", "_id" : { "$oid" : "51237e17754e900200000046" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[75]", "startOffset" : 6712, "end" : "/div[1]/p[75]", "endOffset" : 6895, "_id" : { "$oid" : "51237e17754e900200000047" } } ], "updated" : { "$date" : 1361280535824 }, "created" : { "$date" : 1361280535824 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51237e8e754e900200000048", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"If any of thine be driven out to the outmost parts of heaven, from thence will the Lord thy God gather thee, and from thence will he fetch thee. And the Lord thy God will put all these curses upon thine enemies, and on them which hate thee, which persecuted thee\"", "uuid" : "0323CC78", "_id" : { "$oid" : "51237e8e754e900200000048" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[76]", "startOffset" : 1679, "end" : "/div[1]/p[76]", "endOffset" : 1944, "_id" : { "$oid" : "51237e8e754e900200000049" } } ], "updated" : { "$date" : 1361280654865 }, "created" : { "$date" : 1361280654865 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51237f2ce3e4120200000045", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "\"For whom the Lord loveth he chasteneth, and scourgeth every Son whom he receiveth\"", "uuid" : "C5F01244", "_id" : { "$oid" : "51237f2ce3e4120200000045" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "verses" ], "ranges" : [ { "start" : "/div[1]/p[80]", "startOffset" : 501, "end" : "/div[1]/p[80]", "endOffset" : 584, "_id" : { "$oid" : "51237f2ce3e4120200000046" } } ], "updated" : { "$date" : 1361280812369 }, "created" : { "$date" : 1361280812369 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "512384fde3e4120200000047" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361282301734 }, "id" : "512384fde3e4120200000047", "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "quote" : "guns, spears, and hatchets", "ranges" : [ { "start" : "/div[1]/p[3]", "startOffset" : 2002, "end" : "/div[1]/p[3]", "endOffset" : 2028, "_id" : { "$oid" : "512384fde3e4120200000048" } } ], "tags" : [ "weapons" ], "text" : "\"By then the Indians had almost universally adopted steel knives, tomahawks and flintlock muskets as their weapons of choice.\" -Wikipedia", "updated" : { "$date" : 1361283059774 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "uuid" : "20E43C0A" } -{ "id" : "51238520e3e4120200000049", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "There were twelve killed, some shot, some stabbed with their spears, some knocked down with their hatchets.", "uuid" : "9ECC9739", "_id" : { "$oid" : "51238520e3e4120200000049" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [ "weapons" ], "ranges" : [ { "start" : "/div[1]/p[4]", "startOffset" : 346, "end" : "/div[1]/p[4]", "endOffset" : 454, "_id" : { "$oid" : "51238520e3e412020000004a" } } ], "updated" : { "$date" : 1361282336177 }, "created" : { "$date" : 1361282336177 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5123854ee3e412020000004b", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "use of the word \"glittering\" to describe their weapons ", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "their glittering weapons", "uuid" : "2C337C77", "_id" : { "$oid" : "5123854ee3e412020000004b" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [ "weapons" ], "ranges" : [ { "start" : "/div[1]/p[5]", "startOffset" : 172, "end" : "/div[1]/p[5]", "endOffset" : 196, "_id" : { "$oid" : "5123854ee3e412020000004c" } } ], "updated" : { "$date" : 1361282382468 }, "created" : { "$date" : 1361282382468 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "51238648754e90020000004a" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361282632892 }, "id" : "51238648754e90020000004a", "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "quote" : "God having taken away this dear child, I went to see my daughter Mary, who was at this same Indian town, at a wigwam not very far off, though we had little liberty or opportunity to see one another. She was about ten years old, and taken from the door at first by a Praying Ind. and afterward sold for a gun.", "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 2116, "end" : "/div[1]/p[14]", "endOffset" : 2425, "_id" : { "$oid" : "51238648754e90020000004b" } } ], "tags" : [ "weapons", "currency" ], "text" : "guns were of the same value as a human life", "updated" : { "$date" : 1361282641957 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "uuid" : "01DECCFE" } -{ "id" : "512388cae3e412020000004d", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "shirt = 1 shilling = a piece of horse flesh", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "During my abode in this place, Philip spake to me to make a shirt for his boy, which I did, for which he gave me a shilling. I offered the money to my master, but he bade me keep it; and with it I bought a piece of horse flesh.", "uuid" : "DB1A4638", "_id" : { "$oid" : "512388cae3e412020000004d" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [ "currency" ], "ranges" : [ { "start" : "/div[1]/p[28]", "startOffset" : 284, "end" : "/div[1]/p[28]", "endOffset" : 511, "_id" : { "$oid" : "512388cae3e412020000004e" } } ], "updated" : { "$date" : 1361283274553 }, "created" : { "$date" : 1361283274553 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51238901e3e412020000004f", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "The Native Americans considered selling her for gunpowder - shows how valuable weapons were to them.", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "I desired them that they would carry me to Albany upon one of those horses, and sell me for powder: for so they had sometimes discoursed.", "uuid" : "86FAD41A", "_id" : { "$oid" : "51238901e3e412020000004f" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [ "weapons", "currency" ], "ranges" : [ { "start" : "/div[1]/p[29]", "startOffset" : 122, "end" : "/div[1]/p[29]", "endOffset" : 259, "_id" : { "$oid" : "51238901e3e4120200000050" } } ], "updated" : { "$date" : 1361283329795 }, "created" : { "$date" : 1361283329795 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51238920e3e4120200000051", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "a shirt = a knife", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "At last he told me if I would make another shirt, for a papoose not yet born, he would give me a knife, which he did when I had done it.", "uuid" : "EC2EA9FD", "_id" : { "$oid" : "51238920e3e4120200000051" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [ "currency" ], "ranges" : [ { "start" : "/div[1]/p[31]", "startOffset" : 373, "end" : "/div[1]/p[31]", "endOffset" : 509, "_id" : { "$oid" : "51238920e3e4120200000052" } } ], "updated" : { "$date" : 1361283360922 }, "created" : { "$date" : 1361283360922 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51238b47754e90020000004c", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "exchange of goods", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Then came an Indian, and asked me to knit him three pair of stockings, for which I had a hat, and a silk handkerchief. Then another asked me to make her a shift, for which she gave me an apron.", "uuid" : "8F8547C1", "_id" : { "$oid" : "51238b47754e90020000004c" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [ "currency" ], "ranges" : [ { "start" : "/div[1]/p[60]", "startOffset" : 1413, "end" : "/div[1]/p[60]", "endOffset" : 1606, "_id" : { "$oid" : "51238b47754e90020000004d" } } ], "updated" : { "$date" : 1361283911594 }, "created" : { "$date" : 1361283911594 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51238b97e3e4120200000053", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "Rowlandson would be redeemed for 20 pounds", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Yet at a venture I said \"Twenty pounds,\" yet desired them to take less. But they would not hear of that, but sent that message to Boston, that for twenty pounds I should be redeemed.", "uuid" : "C3A48F0A", "_id" : { "$oid" : "51238b97e3e4120200000053" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [ "currency" ], "ranges" : [ { "start" : "/div[1]/p[61]", "startOffset" : 1678, "end" : "/div[1]/p[61]", "endOffset" : 1860, "_id" : { "$oid" : "51238b97e3e4120200000054" } } ], "updated" : { "$date" : 1361283991983 }, "created" : { "$date" : 1361283991983 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51238cb1e3e4120200000055", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "shows their skills with English weapons", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "They said, no. They shot over his horse and under and before his horse, and they pushed him this way and that way, at their pleasure, showing what they could do.", "uuid" : "E3136D3A", "_id" : { "$oid" : "51238cb1e3e4120200000055" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [ "weapons" ], "ranges" : [ { "start" : "/div[1]/p[64]", "startOffset" : 697, "end" : "/div[1]/p[64]", "endOffset" : 858, "_id" : { "$oid" : "51238cb1e3e4120200000056" } } ], "updated" : { "$date" : 1361284273518 }, "created" : { "$date" : 1361284273518 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51238ccce3e4120200000057", "user" : "s_fung@mit.edu", "username" : "Stephanie F.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Amongst other things which my husband sent me, there came a pound of tobacco, which I sold for nine shillings in money; for many of the Indians for want of tobacco, smoked hemlock, and ground ivy.", "uuid" : "90907907", "_id" : { "$oid" : "51238ccce3e4120200000057" }, "permissions" : { "delete" : [ "s_fung@mit.edu" ], "update" : [ "s_fung@mit.edu" ], "admin" : [ "s_fung@mit.edu" ], "read" : [ "s_fung@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[64]", "startOffset" : 1225, "end" : "/div[1]/p[64]", "endOffset" : 1422, "_id" : { "$oid" : "51238ccce3e4120200000058" } } ], "updated" : { "$date" : 1361284300924 }, "created" : { "$date" : 1361284300924 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51239bed754e90020000004e", "user" : "alvarom@mit.edu", "username" : "Alvaro M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Deut. 32.39. See now that I, even I am he, and there is no god with me, I kill and I make alive, I wound and I heal, neither is there any can deliver out of my hand.", "uuid" : "AE288AF7", "_id" : { "$oid" : "51239bed754e90020000004e" }, "permissions" : { "delete" : [ "alvarom@mit.edu" ], "update" : [ "alvarom@mit.edu" ], "admin" : [ "alvarom@mit.edu" ], "read" : [ "alvarom@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 501, "end" : "/div[1]/p[1]", "endOffset" : 666, "_id" : { "$oid" : "51239bed754e90020000004f" } } ], "updated" : { "$date" : 1361288173802 }, "created" : { "$date" : 1361288173802 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51239efe754e900200000050", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Project Gutenberg's Captivity and Restoration, by Mrs. Mary Rowlandson", "uuid" : "77A62C62", "_id" : { "$oid" : "51239efe754e900200000050" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [ "group-1" ], "ranges" : [ { "start" : "/div[1]/pre[1]", "startOffset" : 0, "end" : "/div[1]/pre[1]", "endOffset" : 70, "_id" : { "$oid" : "51239efe754e900200000051" } } ], "updated" : { "$date" : 1361288958446 }, "created" : { "$date" : 1361288958446 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "512402d6754e900200000052" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361314518157 }, "groups" : [], "id" : "512402d6754e900200000052", "permissions" : { "delete" : [ "adnicker@mit.edu" ], "update" : [ "adnicker@mit.edu" ], "admin" : [ "adnicker@mit.edu" ], "read" : [ "adnicker@mit.edu" ] }, "quote" : "gloaming", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 102, "end" : "/div[1]/p[1]", "endOffset" : 110, "_id" : { "$oid" : "51259f9b599a81020000005b" } } ], "tags" : [], "text" : "This stands out to me as a strange word-- will need to look up.\n\nMeans twilight or dusk, but the word choice seems important. Gloaming sounds a lot like gloomy, which is kind of the feel I get from the opening sentences. ", "updated" : { "$date" : 1361420187329 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "adnicker@mit.edu", "username" : "Andrea N.", "uuid" : "8813CEFB" } -{ "__v" : 0, "_id" : { "$oid" : "51240338754e900200000054" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361314616351 }, "id" : "51240338754e900200000054", "permissions" : { "delete" : [ "adnicker@mit.edu" ], "update" : [ "adnicker@mit.edu" ], "admin" : [ "adnicker@mit.edu" ], "read" : [ "adnicker@mit.edu" ] }, "quote" : "silver: the heavy surface of the sea,", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 438, "end" : "/div[1]/p[1]", "endOffset" : 475, "_id" : { "$oid" : "51240338754e900200000055" } } ], "tags" : [], "text" : "I like the alliteration in this line. Even continues into next line with \"s\" sound", "updated" : { "$date" : 1361314637671 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "adnicker@mit.edu", "username" : "Andrea N.", "uuid" : "BCF1139C" } -{ "id" : "51242d76e3e4120200000059", "user" : "alvarom@mit.edu", "username" : "Alvaro M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "So I took the Bible, and in that melancholy time, it came into my mind to read first the 28th chapter of Deuteronomy, which I did, and when I had read it, my dark heart wrought on this manner: that there was no mercy for me, that the blessings were gone, and the curses come in their room, and that I had lost my opportunity. But the Lord helped me still to go on reading till I came to Chap. 30, the seven first verses, where I found, there was mercy promised again, if we would return to Him by repentance; and though we were scattered from one end of the earth to the other, yet the Lord would gather us together, and turn all those curses upon our enemies. I do not desire to live to forget this Scripture, and what comfort it was to me.", "uuid" : "FF12302C", "_id" : { "$oid" : "51242d76e3e4120200000059" }, "permissions" : { "delete" : [ "alvarom@mit.edu" ], "update" : [ "alvarom@mit.edu" ], "admin" : [ "alvarom@mit.edu" ], "read" : [ "alvarom@mit.edu" ] }, "tags" : [ "deuteronomy" ], "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 5642, "end" : "/div[1]/p[14]", "endOffset" : 6383, "_id" : { "$oid" : "51242d76e3e412020000005a" } } ], "updated" : { "$date" : 1361325430792 }, "created" : { "$date" : 1361325430792 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51242d88e3e412020000005b", "user" : "alvarom@mit.edu", "username" : "Alvaro M.", "text" : "", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Now have I seen that Scripture also fulfilled, \"If any of thine be driven out to the outmost parts of heaven, from thence will the Lord thy God gather thee, and from thence will he fetch thee. And the Lord thy God will put all these curses upon thine enemies, and on them which hate thee, which persecuted thee\" (Deuteronomy 30.4-7). Thus hath the Lord brought me and mine out of that horrible pit, and hath set us in the midst of tender-hearted and compassionate Christians. It is the desire of my soul that we may walk worthy of the mercies received, and which we are receiving.", "uuid" : "CA04496C", "_id" : { "$oid" : "51242d88e3e412020000005b" }, "permissions" : { "delete" : [ "alvarom@mit.edu" ], "update" : [ "alvarom@mit.edu" ], "admin" : [ "alvarom@mit.edu" ], "read" : [ "alvarom@mit.edu" ] }, "tags" : [ "deuteronomy" ], "ranges" : [ { "start" : "/div[1]/p[76]", "startOffset" : 1632, "end" : "/div[1]/p[76]", "endOffset" : 2212, "_id" : { "$oid" : "51242d88e3e412020000005c" } } ], "updated" : { "$date" : 1361325448848 }, "created" : { "$date" : 1361325448848 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512456e9e3e412020000005d", "user" : "liadigi@mit.edu", "username" : "Lia D.", "text" : "Incorrect-this is from Psalm 109", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "119", "uuid" : "1BFBB7AF", "_id" : { "$oid" : "512456e9e3e412020000005d" }, "permissions" : { "delete" : [ "liadigi@mit.edu" ], "update" : [ "liadigi@mit.edu" ], "admin" : [ "liadigi@mit.edu" ], "read" : [ "liadigi@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[55]", "startOffset" : 494, "end" : "/div[1]/p[55]", "endOffset" : 498, "_id" : { "$oid" : "512456e9e3e412020000005e" } } ], "updated" : { "$date" : 1361336041322 }, "created" : { "$date" : 1361336041322 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "51245eea754e900200000056" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361338090366 }, "groups" : [], "id" : "51245eea754e900200000056", "permissions" : { "delete" : [ "junek@mit.edu" ], "update" : [ "junek@mit.edu" ], "admin" : [ "junek@mit.edu" ], "read" : [ "junek@mit.edu" ] }, "quote" : "Down at the water’s edge, at the place\nwhere they haul up the boats, up the long ramp\ndescending into the water, thin silver", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1562, "end" : "/div[1]/p[1]", "endOffset" : 1686, "_id" : { "$oid" : "512461d3e3e4120200000061" } } ], "tags" : [ "syntax" ], "text" : "There is a syntax pattern here. The things behind a comma describes some part of the things in front of the comma. For example, \"up the long ramp\" describes the path \"the boats\" took. This pattern is mostly true through out this stanza. It's interesting how only this stanza visibly has that syntax pattern.", "updated" : { "$date" : 1361339228416 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "junek@mit.edu", "username" : "June K.", "uuid" : "603F73C7" } -{ "__v" : 0, "_id" : { "$oid" : "5124607f754e900200000058" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361338495987 }, "id" : "5124607f754e900200000058", "permissions" : { "delete" : [ "junek@mit.edu" ], "update" : [ "junek@mit.edu" ], "admin" : [ "junek@mit.edu" ], "read" : [ "junek@mit.edu" ] }, "quote" : "s . . .", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1882, "end" : "/div[1]/p[1]", "endOffset" : 1890, "_id" : { "$oid" : "5124607f754e900200000059" } } ], "tags" : [ "syntax" ], "text" : "The part around the \"...\"s describe one particular seal. After the \"...\" that closes the description, the poem moves on from the sea to landscape behind the narrator. ", "updated" : { "$date" : 1361338811922 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "junek@mit.edu", "username" : "June K.", "uuid" : "A614CDC9" } -{ "__v" : 0, "_id" : { "$oid" : "51246198e3e412020000005f" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361338776348 }, "id" : "51246198e3e412020000005f", "permissions" : { "delete" : [ "junek@mit.edu" ], "update" : [ "junek@mit.edu" ], "admin" : [ "junek@mit.edu" ], "read" : [ "junek@mit.edu" ] }, "quote" : "immersion", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2033, "end" : "/div[1]/p[1]", "endOffset" : 2042, "_id" : { "$oid" : "51246198e3e4120200000060" } } ], "tags" : [ "Word" ], "text" : "immersion: late Latin immersiōn-em (Arnobius)\nThis word has a formal tone.", "updated" : { "$date" : 1361338992804 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "junek@mit.edu", "username" : "June K.", "uuid" : "35D9BB7F" } -{ "__v" : 0, "_id" : { "$oid" : "51246416754e90020000005c" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361339414778 }, "id" : "51246416754e90020000005c", "permissions" : { "delete" : [ "junek@mit.edu" ], "update" : [ "junek@mit.edu" ], "admin" : [ "junek@mit.edu" ], "read" : [ "junek@mit.edu" ] }, "quote" : "same spot", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2262, "end" : "/div[1]/p[1]", "endOffset" : 2271, "_id" : { "$oid" : "51246416754e90020000005d" } } ], "tags" : [ "sound", "patterns" ], "text" : "There is a consonance of \"s\" sound: same and spot.", "updated" : { "$date" : 1361339538783 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "junek@mit.edu", "username" : "June K.", "uuid" : "13F5A712" } -{ "id" : "51246600754e90020000005e", "user" : "junek@mit.edu", "username" : "June K.", "text" : "This almost follows an iambic meter. \"As if it were against\" has iambic meter, but the pattern starts to differ at \"his better judgment.\" ", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "as if it were against his better judgment.", "uuid" : "FE7D72BB", "_id" : { "$oid" : "51246600754e90020000005e" }, "permissions" : { "delete" : [ "junek@mit.edu" ], "update" : [ "junek@mit.edu" ], "admin" : [ "junek@mit.edu" ], "read" : [ "junek@mit.edu" ] }, "tags" : [ "sound", "patterns" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2294, "end" : "/div[1]/p[1]", "endOffset" : 2336, "_id" : { "$oid" : "51246600754e90020000005f" } } ], "updated" : { "$date" : 1361339904380 }, "created" : { "$date" : 1361339904380 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51246669599a810200000002", "user" : "junek@mit.edu", "username" : "June K.", "text" : "Why does the title of this song get mentioned? Does it have to do with the Fishhouse? ", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "“A Mighty Fortress Is Our God.”", "uuid" : "429E2081", "_id" : { "$oid" : "51246669599a810200000002" }, "permissions" : { "delete" : [ "junek@mit.edu" ], "update" : [ "junek@mit.edu" ], "admin" : [ "junek@mit.edu" ], "read" : [ "junek@mit.edu" ] }, "tags" : [ "question" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2093, "end" : "/div[1]/p[1]", "endOffset" : 2124, "_id" : { "$oid" : "51246669599a810200000003" } } ], "updated" : { "$date" : 1361340009719 }, "created" : { "$date" : 1361340009719 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512466db599a810200000004", "user" : "junek@mit.edu", "username" : "June K.", "text" : "This odd sentence structure, at first, made me misunderstand it as element that is unbearable to mortal, fish and seals.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "element bearable to no mortal,\nto fish and t", "uuid" : "E1B99CF7", "_id" : { "$oid" : "512466db599a810200000004" }, "permissions" : { "delete" : [ "junek@mit.edu" ], "update" : [ "junek@mit.edu" ], "admin" : [ "junek@mit.edu" ], "read" : [ "junek@mit.edu" ] }, "tags" : [ "syntax" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1832, "end" : "/div[1]/p[1]", "endOffset" : 1876, "_id" : { "$oid" : "512466db599a810200000005" } } ], "updated" : { "$date" : 1361340123458 }, "created" : { "$date" : 1361340123458 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "512467d9754e900200000060" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361340377963 }, "id" : "512467d9754e900200000060", "permissions" : { "delete" : [ "junek@mit.edu" ], "update" : [ "junek@mit.edu" ], "admin" : [ "junek@mit.edu" ], "read" : [ "junek@mit.edu" ] }, "quote" : "seal particularly\nI have seen here", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1893, "end" : "/div[1]/p[1]", "endOffset" : 1929, "_id" : { "$oid" : "512467d9754e900200000061" } } ], "tags" : [ "syntax" ], "text" : "Instead of \"I have seen a seal here evening after evening.\", the poem is inverts the order. By doing so, the emphasis falls on the seal instead of the narrator. ", "updated" : { "$date" : 1361340429385 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "junek@mit.edu", "username" : "June K.", "uuid" : "A62570C8" } -{ "id" : "5124683b754e900200000062", "user" : "junek@mit.edu", "username" : "June K.", "text" : "By having those two sentences back to back, it almost suggests that the narrator IS music.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "He was curious about me. He was interested in music;", "uuid" : "C8C4332C", "_id" : { "$oid" : "5124683b754e900200000062" }, "permissions" : { "delete" : [ "junek@mit.edu" ], "update" : [ "junek@mit.edu" ], "admin" : [ "junek@mit.edu" ], "read" : [ "junek@mit.edu" ] }, "tags" : [ "pattern" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1952, "end" : "/div[1]/p[1]", "endOffset" : 2004, "_id" : { "$oid" : "5124683b754e900200000063" } } ], "updated" : { "$date" : 1361340475725 }, "created" : { "$date" : 1361340475725 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512506727fabe10200000002", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "God preserves her", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "I have thought since of the wonderful goodness of God to me in preserving me in the use of my reason and senses in that distressed time, that I did not use wicked and violent means to end my own miserable life.", "uuid" : "4C75D230", "_id" : { "$oid" : "512506727fabe10200000002" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "lord" ], "ranges" : [ { "start" : "/div[1]/p[14]", "startOffset" : 934, "end" : "/div[1]/p[14]", "endOffset" : 1144, "_id" : { "$oid" : "512506727fabe10200000003" } } ], "updated" : { "$date" : 1361380978258 }, "created" : { "$date" : 1361380978258 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "512539197fabe10200000006" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361393945834 }, "id" : "512539197fabe10200000006", "permissions" : { "delete" : [ "manningk@mit.edu" ], "update" : [ "manningk@mit.edu" ], "admin" : [ "manningk@mit.edu" ], "read" : [ "manningk@mit.edu" ] }, "quote" : "iridescent", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 923, "end" : "/div[1]/p[1]", "endOffset" : 933, "_id" : { "$oid" : "512539197fabe10200000007" } } ], "tags" : [], "text" : "Iridescent has a Latin ending. It also sounds formal/complex, but does not stand out as much in this poem as it would have in some of the other poem's we've read. ", "updated" : { "$date" : 1361394013546 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "manningk@mit.edu", "username" : "Kristen M.", "uuid" : "19F5B886" } -{ "__v" : 1, "_id" : { "$oid" : "512539f8599a810200000008" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361394168796 }, "groups" : [], "id" : "512539f8599a810200000008", "permissions" : { "delete" : [ "manningk@mit.edu" ], "update" : [ "manningk@mit.edu" ], "admin" : [ "manningk@mit.edu" ], "read" : [ "manningk@mit.edu" ] }, "quote" : "sparse bright", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1011, "end" : "/div[1]/p[1]", "endOffset" : 1024, "_id" : { "$oid" : "512570ad7fabe1020000002f" } } ], "tags" : [ "NounsAdjectives" ], "text" : "Nearly all of the nouns in the poem are described an adjective, and many of them are described by two. It is interesting that the usual punctuation rules seem to be followed throughout the poem, but commas are not used between multiple adjectives ", "updated" : { "$date" : 1361408173748 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "manningk@mit.edu", "username" : "Kristen M.", "uuid" : "BDAF01FF" } -{ "id" : "51253c70599a81020000000a", "user" : "manningk@mit.edu", "username" : "Kristen M.", "text" : "Capstan has a French root. Used on ships to lift sails, anchors, etc ", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "capstan", "uuid" : "2A9AF3B2", "_id" : { "$oid" : "51253c70599a81020000000a" }, "permissions" : { "delete" : [ "manningk@mit.edu" ], "update" : [ "manningk@mit.edu" ], "admin" : [ "manningk@mit.edu" ], "read" : [ "manningk@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1065, "end" : "/div[1]/p[1]", "endOffset" : 1072, "_id" : { "$oid" : "51253c70599a81020000000b" } } ], "updated" : { "$date" : 1361394800349 }, "created" : { "$date" : 1361394800349 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51253d1a599a81020000000c", "user" : "manningk@mit.edu", "username" : "Kristen M.", "text" : "The lines in this poem are not always full sentences, but many of them are complete thoughts/phrases", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "with small iridescent flies crawling on them.\nUp on the little slope behind the houses,\nset in the sparse bright sprinkle of grass,\nis an ancient wooden capstan,", "uuid" : "EFE62EAB", "_id" : { "$oid" : "51253d1a599a81020000000c" }, "permissions" : { "delete" : [ "manningk@mit.edu" ], "update" : [ "manningk@mit.edu" ], "admin" : [ "manningk@mit.edu" ], "read" : [ "manningk@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 912, "end" : "/div[1]/p[1]", "endOffset" : 1073, "_id" : { "$oid" : "51253d1a599a81020000000d" } } ], "updated" : { "$date" : 1361394970164 }, "created" : { "$date" : 1361394970164 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51253e047fabe10200000008", "user" : "manningk@mit.edu", "username" : "Kristen M.", "text" : "Alliteration (Set, Sparse, Sprinkle) ", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "set in the sparse bright sprinkle of grass,", "uuid" : "F5AFB16C", "_id" : { "$oid" : "51253e047fabe10200000008" }, "permissions" : { "delete" : [ "manningk@mit.edu" ], "update" : [ "manningk@mit.edu" ], "admin" : [ "manningk@mit.edu" ], "read" : [ "manningk@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1000, "end" : "/div[1]/p[1]", "endOffset" : 1043, "_id" : { "$oid" : "51253e047fabe10200000009" } } ], "updated" : { "$date" : 1361395204150 }, "created" : { "$date" : 1361395204150 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51253ed67fabe1020000000a", "user" : "manningk@mit.edu", "username" : "Kristen M.", "text" : "French (/Latin) root ", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "ancient", "uuid" : "BF759C24", "_id" : { "$oid" : "51253ed67fabe1020000000a" }, "permissions" : { "delete" : [ "manningk@mit.edu" ], "update" : [ "manningk@mit.edu" ], "admin" : [ "manningk@mit.edu" ], "read" : [ "manningk@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1049, "end" : "/div[1]/p[1]", "endOffset" : 1058, "_id" : { "$oid" : "51253ed67fabe1020000000b" } } ], "updated" : { "$date" : 1361395414922 }, "created" : { "$date" : 1361395414922 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "51253ef0599a81020000000e" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361395440923 }, "id" : "51253ef0599a81020000000e", "permissions" : { "delete" : [ "manningk@mit.edu" ], "update" : [ "manningk@mit.edu" ], "admin" : [ "manningk@mit.edu" ], "read" : [ "manningk@mit.edu" ] }, "quote" : "Up on the little slope behind the houses,\nset in the sparse bright sprinkle of grass,\nis an ancient wooden capstan,", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 958, "end" : "/div[1]/p[1]", "endOffset" : 1073, "_id" : { "$oid" : "51253ef0599a81020000000f" } } ], "tags" : [], "text" : "The \"ancient wooden capstan\" seems out of place in this setting... \"little,\" \"sparse,\" \"bright,\" \"sprinkle,\" are words that made me imagine a subtle landscape. An old, stained capstan seems imposing ", "updated" : { "$date" : 1361395687172 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "manningk@mit.edu", "username" : "Kristen M.", "uuid" : "487126F7" } -{ "id" : "512546eb7fabe1020000000c", "user" : "fmmoret@mit.edu", "username" : "Forrest M.", "text" : "This section is largely Anglo-Saxon in origin. Lucky Strike is an American brand of cigarettes. Introduced in 1871, Lucky Strike became the top selling cigarette in the US during the 1930's. Bishop seems to typically write blank verse poetry.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "cracked, with two long bleached handles\nand some melancholy stains, like dried blood,\nwhere the ironwork has rusted.\nThe old man accepts a Lucky Strike.", "uuid" : "B4AEDD2A", "_id" : { "$oid" : "512546eb7fabe1020000000c" }, "permissions" : { "delete" : [ "fmmoret@mit.edu" ], "update" : [ "fmmoret@mit.edu" ], "admin" : [ "fmmoret@mit.edu" ], "read" : [ "fmmoret@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1074, "end" : "/div[1]/p[1]", "endOffset" : 1226, "_id" : { "$oid" : "512546eb7fabe1020000000d" } } ], "updated" : { "$date" : 1361397483760 }, "created" : { "$date" : 1361397483760 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51254f10599a810200000010", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "Drastically different from Job's reaction ", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Yet I can say, that in all my sorrows and afflictions, God did not leave me to have my impatience work towards Himself, as if His ways were unrighteous. But I knew that He laid upon me less than I deserved. Afterward, before this doleful time ended with me, I was turning the leaves of my Bible, and the Lord brought to me some Scriptures, which did a little revive me, as that [in] Isaiah 55.8: \"For my thoughts are not your thoughts, neither are your ways my ways, saith the Lord.\" And also that [in] Psalm 37.5: \"Commit thy way unto the Lord; trust also in him; and he shall bring it to pass.\"", "uuid" : "B90AE342", "_id" : { "$oid" : "51254f10599a810200000010" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "Job" ], "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 2754, "end" : "/div[1]/p[42]", "endOffset" : 3350, "_id" : { "$oid" : "51254f10599a810200000011" } } ], "updated" : { "$date" : 1361399568483 }, "created" : { "$date" : 1361399568483 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51254f3c599a810200000012", "user" : "rachel13@mit.edu", "username" : "Rachel F.", "text" : "This isn't typically a verb. I think this means creating his net.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "netting", "uuid" : "BFC3EB2C", "_id" : { "$oid" : "51254f3c599a810200000012" }, "permissions" : { "delete" : [ "rachel13@mit.edu" ], "update" : [ "rachel13@mit.edu" ], "admin" : [ "rachel13@mit.edu" ], "read" : [ "rachel13@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 77, "end" : "/div[1]/p[1]", "endOffset" : 84, "_id" : { "$oid" : "51254f3c599a810200000013" } } ], "updated" : { "$date" : 1361399612310 }, "created" : { "$date" : 1361399612310 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51254f607fabe10200000010", "user" : "rachel13@mit.edu", "username" : "Rachel F.", "text" : "This means twilight or dusk.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "gloaming", "uuid" : "3B6CD812", "_id" : { "$oid" : "51254f607fabe10200000010" }, "permissions" : { "delete" : [ "rachel13@mit.edu" ], "update" : [ "rachel13@mit.edu" ], "admin" : [ "rachel13@mit.edu" ], "read" : [ "rachel13@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 102, "end" : "/div[1]/p[1]", "endOffset" : 110, "_id" : { "$oid" : "51254f607fabe10200000011" } } ], "updated" : { "$date" : 1361399648253 }, "created" : { "$date" : 1361399648253 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "51254f877fabe10200000012" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361399687259 }, "id" : "51254f877fabe10200000012", "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "quote" : "that in God's due time there would be an end of this sorrowful hour.", "ranges" : [ { "start" : "/div[1]/p[60]", "startOffset" : 1344, "end" : "/div[1]/p[60]", "endOffset" : 1412, "_id" : { "$oid" : "51254f877fabe10200000013" } } ], "tags" : [ "Job" ], "text" : "Not how Job felt.", "updated" : { "$date" : 1361399699524 }, "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "uuid" : "B95600B8" } -{ "id" : "51254fb47fabe10200000014", "user" : "rachel13@mit.edu", "username" : "Rachel F.", "text" : "I think this is the weight that keeps a fishing line down, so here it could be the weight to keep the net down.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "shuttle", "uuid" : "FEE754A7", "_id" : { "$oid" : "51254fb47fabe10200000014" }, "permissions" : { "delete" : [ "rachel13@mit.edu" ], "update" : [ "rachel13@mit.edu" ], "admin" : [ "rachel13@mit.edu" ], "read" : [ "rachel13@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 158, "end" : "/div[1]/p[1]", "endOffset" : 165, "_id" : { "$oid" : "51254fb47fabe10200000015" } } ], "updated" : { "$date" : 1361399732264 }, "created" : { "$date" : 1361399732264 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 2, "_id" : { "$oid" : "512550a97fabe10200000016" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361399977276 }, "id" : "512550a97fabe10200000016", "permissions" : { "delete" : [ "jennli@mit.edu" ], "update" : [ "jennli@mit.edu" ], "admin" : [ "jennli@mit.edu" ], "read" : [ "jennli@mit.edu" ] }, "quote" : "herring", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 814, "end" : "/div[1]/p[1]", "endOffset" : 821, "_id" : { "$oid" : "512550a97fabe10200000017" } } ], "tags" : [ "Latin,", "Unusual,", "Beautiful", "Juxtaposition" ], "text" : "\"herring\" is derived from the Latin hālec. This specific word contrasts with the colloquial \"fish\" in the previous line. I feel that this contrast illuminates Bishop's view of the fishhouse and describes how this common scene becomes beautiful. See \"fish\" comment.", "updated" : { "$date" : 1361403446432 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "jennli@mit.edu", "username" : "Jennifer L.", "uuid" : "C0B45BFB" } -{ "__v" : 2, "_id" : { "$oid" : "51255138599a810200000014" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361400120667 }, "id" : "51255138599a810200000014", "permissions" : { "delete" : [ "jennli@mit.edu" ], "update" : [ "jennli@mit.edu" ], "admin" : [ "jennli@mit.edu" ], "read" : [ "jennli@mit.edu" ] }, "quote" : "fish", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 758, "end" : "/div[1]/p[1]", "endOffset" : 762, "_id" : { "$oid" : "51255138599a810200000015" } } ], "tags" : [ "Anglo-Saxon", "Unusual", "Juxtaposition" ], "text" : "\"fish\" can be derived from the Anglo-Saxon fisc, which contrasts with the Latinate \"herring\" in the next line. See the \"herring\" comment.", "updated" : { "$date" : 1361403461066 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "jennli@mit.edu", "username" : "Jennifer L.", "uuid" : "4FF33E9E" } -{ "id" : "51255e00599a81020000001b", "user" : "jennli@mit.edu", "username" : "Jennifer L.", "text" : "derived from Latin scala", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "scales", "uuid" : "78BFB628", "_id" : { "$oid" : "51255e00599a81020000001b" }, "permissions" : { "delete" : [ "jennli@mit.edu" ], "update" : [ "jennli@mit.edu" ], "admin" : [ "jennli@mit.edu" ], "read" : [ "jennli@mit.edu" ] }, "tags" : [ "Latin" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 822, "end" : "/div[1]/p[1]", "endOffset" : 828, "_id" : { "$oid" : "51255e00599a81020000001c" } } ], "updated" : { "$date" : 1361403392371 }, "created" : { "$date" : 1361403392371 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51255e6b599a81020000001d", "user" : "jennli@mit.edu", "username" : "Jennifer L.", "text" : "Bishop uses \"iridescent\" in both this line and the subsequent line. It originates from the Latin irid with the escent suffix. In this line, Bishop describes coats of mail with the Latinate iridescent, and coats of mail have a medieval connotation. Please see comment about iridescent in the next line.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "iridescent coats of mail", "uuid" : "F674CFA6", "_id" : { "$oid" : "51255e6b599a81020000001d" }, "permissions" : { "delete" : [ "jennli@mit.edu" ], "update" : [ "jennli@mit.edu" ], "admin" : [ "jennli@mit.edu" ], "read" : [ "jennli@mit.edu" ] }, "tags" : [ "Latin", "Unusual", "Beautiful", "Juxtaposition" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 885, "end" : "/div[1]/p[1]", "endOffset" : 910, "_id" : { "$oid" : "51255e6b599a81020000001e" } } ], "updated" : { "$date" : 1361403499962 }, "created" : { "$date" : 1361403499962 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51255fd57fabe10200000019", "user" : "jennli@mit.edu", "username" : "Jennifer L.", "text" : "\"beautiful\" is derived from beauty and the suffix -ful, in which beauty originates from the Latin bellitātem and bellus. ", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "beautiful", "uuid" : "B475C65E", "_id" : { "$oid" : "51255fd57fabe10200000019" }, "permissions" : { "delete" : [ "jennli@mit.edu" ], "update" : [ "jennli@mit.edu" ], "admin" : [ "jennli@mit.edu" ], "read" : [ "jennli@mit.edu" ] }, "tags" : [ "Latin" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 804, "end" : "/div[1]/p[1]", "endOffset" : 813, "_id" : { "$oid" : "51255fd57fabe1020000001a" } } ], "updated" : { "$date" : 1361403861825 }, "created" : { "$date" : 1361403861825 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512561bc7fabe1020000001b", "user" : "jennli@mit.edu", "username" : "Jennifer L.", "text" : "The phrase \"big fish tubs\" is colloquial and general, whereas the following descriptions in this sentence have more specific and colorful language. When reading this part of the poem, I feel that I am first looking only at the overall picture, which is commonplace and mundane. However, as I read on and can see the fish tub more closely, the scene becomes more rich and beautiful. ", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "big fish tubs", "uuid" : "A388A267", "_id" : { "$oid" : "512561bc7fabe1020000001b" }, "permissions" : { "delete" : [ "jennli@mit.edu" ], "update" : [ "jennli@mit.edu" ], "admin" : [ "jennli@mit.edu" ], "read" : [ "jennli@mit.edu" ] }, "tags" : [ "Colloquial", "Theme", "Contrast" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 753, "end" : "/div[1]/p[1]", "endOffset" : 768, "_id" : { "$oid" : "512561bc7fabe1020000001c" } } ], "updated" : { "$date" : 1361404371890 }, "created" : { "$date" : 1361404348969 }, "consumer" : "annotationstudio.mit.edu", "__v" : 1 } -{ "id" : "5125638d7fabe1020000001d", "user" : "jennli@mit.edu", "username" : "Jennifer L.", "text" : "For the following 5 lines, the syntax of this part of the poem is that each line is a phrase of a larger sentence and is coterminous. Overall, this sentence has a usual word order with: noun, verb, and modifier, and there are two parts of the sentence connected by \"and\", so the sentence structure is not extremely complicated. An interesting aspect of this poem's sentence is that there are 3 modifiers that begin with \"with\".", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "T", "uuid" : "122499F1", "_id" : { "$oid" : "5125638d7fabe1020000001d" }, "permissions" : { "delete" : [ "jennli@mit.edu" ], "update" : [ "jennli@mit.edu" ], "admin" : [ "jennli@mit.edu" ], "read" : [ "jennli@mit.edu" ] }, "tags" : [ "Syntax", "Coterminous" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 750, "end" : "/div[1]/p[1]", "endOffset" : 751, "_id" : { "$oid" : "5125638d7fabe1020000001e" } } ], "updated" : { "$date" : 1361404813013 }, "created" : { "$date" : 1361404813013 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "512565237fabe10200000021" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361405219579 }, "id" : "512565237fabe10200000021", "permissions" : { "delete" : [ "jennli@mit.edu" ], "update" : [ "jennli@mit.edu" ], "admin" : [ "jennli@mit.edu" ], "read" : [ "jennli@mit.edu" ] }, "quote" : "small iridescent flies", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 917, "end" : "/div[1]/p[1]", "endOffset" : 940, "_id" : { "$oid" : "512565237fabe10200000022" } } ], "tags" : [ "Latin", "Anglo-Saxon", "Repetition", "Juxtaposition", "Theme" ], "text" : "(cont. from previous comment)The \"iridescent\" is repeated from the previous line. However, in this line, this beautiful word is used to describe small flies, both are derived from Anglo-Saxon. \"flies\" is derived from the Anglo-Saxon fléoge and flýge, and \"small\" is from the Anglo-Saxon smal. I feel that this contrast sheds light on how the common aspects of life are very beautiful. ", "updated" : { "$date" : 1361405342613 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "jennli@mit.edu", "username" : "Jennifer L.", "uuid" : "E74D73C6" } -{ "__v" : 0, "_id" : { "$oid" : "512566927fabe10200000023" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361405586673 }, "id" : "512566927fabe10200000023", "permissions" : { "delete" : [ "jennli@mit.edu" ], "update" : [ "jennli@mit.edu" ], "admin" : [ "jennli@mit.edu" ], "read" : [ "jennli@mit.edu" ] }, "quote" : "plastered", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 863, "end" : "/div[1]/p[1]", "endOffset" : 873, "_id" : { "$oid" : "512566927fabe10200000024" } } ], "tags" : [ "Latin", "Unusual", "Contrast" ], "text" : "I felt that it was unusual that Bishop used the word \"plastered\". \"plastered\" is derived from Latin plastrare with the \"ed\" suffix. It contrasts with the simple wheelbarrow. Also, this verb is very specific.", "updated" : { "$date" : 1361405623731 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "jennli@mit.edu", "username" : "Jennifer L.", "uuid" : "E7BB3EDB" } -{ "id" : "512567707fabe10200000025", "user" : "jennli@mit.edu", "username" : "Jennifer L.", "text" : "\"lined\" originates from the Latin līnum. It is interesting how Bishop uses (as with \"plastered\") these very formal verbs to describe these common objects.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "lined", "uuid" : "C3A90CE4", "_id" : { "$oid" : "512567707fabe10200000025" }, "permissions" : { "delete" : [ "jennli@mit.edu" ], "update" : [ "jennli@mit.edu" ], "admin" : [ "jennli@mit.edu" ], "read" : [ "jennli@mit.edu" ] }, "tags" : [ "Latin", "Unusual" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 783, "end" : "/div[1]/p[1]", "endOffset" : 788, "_id" : { "$oid" : "512567707fabe10200000026" } } ], "updated" : { "$date" : 1361405808003 }, "created" : { "$date" : 1361405808003 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51256bf17fabe10200000027", "user" : "jennli@mit.edu", "username" : "Jennifer L.", "text" : "\"completely\" rhymes with \"similarly\"", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "completely", "uuid" : "AF8FAB3F", "_id" : { "$oid" : "51256bf17fabe10200000027" }, "permissions" : { "delete" : [ "jennli@mit.edu" ], "update" : [ "jennli@mit.edu" ], "admin" : [ "jennli@mit.edu" ], "read" : [ "jennli@mit.edu" ] }, "tags" : [ "Rhythm", "Rhyme" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 772, "end" : "/div[1]/p[1]", "endOffset" : 782, "_id" : { "$oid" : "51256bf17fabe10200000028" } } ], "updated" : { "$date" : 1361406961564 }, "created" : { "$date" : 1361406961564 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51256c05599a810200000021", "user" : "jennli@mit.edu", "username" : "Jennifer L.", "text" : "\"similarly\" rhymes with \"completely\"", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "similarly", "uuid" : "EA1F9131", "_id" : { "$oid" : "51256c05599a810200000021" }, "permissions" : { "delete" : [ "jennli@mit.edu" ], "update" : [ "jennli@mit.edu" ], "admin" : [ "jennli@mit.edu" ], "read" : [ "jennli@mit.edu" ] }, "tags" : [ "Rhyme" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 854, "end" : "/div[1]/p[1]", "endOffset" : 863, "_id" : { "$oid" : "51256c05599a810200000022" } } ], "updated" : { "$date" : 1361406981731 }, "created" : { "$date" : 1361406981731 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51256d11599a810200000023", "user" : "jennli@mit.edu", "username" : "Jennifer L.", "text" : "These fours terms are all stressed, which may be for emphasis.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "The big fish tubs", "uuid" : "7E0A01C9", "_id" : { "$oid" : "51256d11599a810200000023" }, "permissions" : { "delete" : [ "jennli@mit.edu" ], "update" : [ "jennli@mit.edu" ], "admin" : [ "jennli@mit.edu" ], "read" : [ "jennli@mit.edu" ] }, "tags" : [ "Rhythm" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 750, "end" : "/div[1]/p[1]", "endOffset" : 767, "_id" : { "$oid" : "51256d11599a810200000024" } } ], "updated" : { "$date" : 1361407249783 }, "created" : { "$date" : 1361407249783 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51256de7599a810200000025", "user" : "jennli@mit.edu", "username" : "Jennifer L.", "text" : "This part of the line seems to have a pattern of unstressed then stressed, which shifts from the stressed syllables in the beginning.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "are completely lined", "uuid" : "356F359C", "_id" : { "$oid" : "51256de7599a810200000025" }, "permissions" : { "delete" : [ "jennli@mit.edu" ], "update" : [ "jennli@mit.edu" ], "admin" : [ "jennli@mit.edu" ], "read" : [ "jennli@mit.edu" ] }, "tags" : [ "Rhythm" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 768, "end" : "/div[1]/p[1]", "endOffset" : 788, "_id" : { "$oid" : "51256de7599a810200000026" } } ], "updated" : { "$date" : 1361407463249 }, "created" : { "$date" : 1361407463249 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "51256eb0599a810200000027" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361407664662 }, "id" : "51256eb0599a810200000027", "permissions" : { "delete" : [ "jennli@mit.edu" ], "update" : [ "jennli@mit.edu" ], "admin" : [ "jennli@mit.edu" ], "read" : [ "jennli@mit.edu" ] }, "quote" : "with layers of beautiful herring scales", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 789, "end" : "/div[1]/p[1]", "endOffset" : 828, "_id" : { "$oid" : "51256eb0599a810200000028" } } ], "tags" : [ "Rhythm", "Iambic" ], "text" : "It seems that this line is iambic pentameter.", "updated" : { "$date" : 1361407812517 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "jennli@mit.edu", "username" : "Jennifer L.", "uuid" : "C043A243" } -{ "id" : "51256f0a599a810200000029", "user" : "benolds@mit.edu", "username" : "Benjamin R.", "text" : "The first line has a regular rhythm: one stressed beat followed by two unstressed beats, while the rest of the lines have no continuous pattern in their rhythm. I think this sets the first line apart, and adds to its soothing qualities. “He was a friend of my grandfather.” In a poem that begins with an ambiguous, unknown environment, this line introduces us to something familiar; an old friend. The pattern in its rhythm adds to its familiarity.\n\nWhile the first two lines don’t seem to rhyme, there are a lot of similarities between the last two lines. The word “herring”, at the end of the third line, is repeated in the fourth line, and forms a near rhyme with “in”, which ends the fourth line. Additionally, there is assonance of the soft “o” sound in “codfish” and “population.” \n\nThere seems to be a bit of a mismatch between the simple, rustic words used, such as “codfish,” “talk,” “boat,” and “come in,” versus the longer words ending the first two lines: “grandfather” and “population.”\n\nAnother thing that I found interesting is how the first line forms a sentence of its own, while most other sentences in the poem are at least several lines in length. This allows you to catch your breath when you are reading, and slows down these few lines.\n\nOverall I found these lines to be in contrast with much of the rest of the poem. The poem mostly focuses on the crisp, icy, harsh beauty of the scene. These lines, however, comment on the more familiar, mundane, friendly atmosphere of talking with an old friend.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "He was a friend of my grandfather.\nWe talk of the decline in the population\nand of codfish and herring\nwhile he waits for a herring boat to come in.", "uuid" : "95995C9F", "_id" : { "$oid" : "51256f0a599a810200000029" }, "permissions" : { "delete" : [ "benolds@mit.edu" ], "update" : [ "benolds@mit.edu" ], "admin" : [ "benolds@mit.edu" ], "read" : [ "benolds@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1227, "end" : "/div[1]/p[1]", "endOffset" : 1375, "_id" : { "$oid" : "51256f0a599a81020000002a" } } ], "updated" : { "$date" : 1361407754669 }, "created" : { "$date" : 1361407754669 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51256f2f7fabe10200000029", "user" : "jennli@mit.edu", "username" : "Jennifer L.", "text" : "It seems this line is in iambic pentameter.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "with creamy iridescent coats of mail,", "uuid" : "DD1C1B3F", "_id" : { "$oid" : "51256f2f7fabe10200000029" }, "permissions" : { "delete" : [ "jennli@mit.edu" ], "update" : [ "jennli@mit.edu" ], "admin" : [ "jennli@mit.edu" ], "read" : [ "jennli@mit.edu" ] }, "tags" : [ "Rhythm", "Iambic" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 874, "end" : "/div[1]/p[1]", "endOffset" : 911, "_id" : { "$oid" : "51256f2f7fabe1020000002a" } } ], "updated" : { "$date" : 1361407791085 }, "created" : { "$date" : 1361407791085 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "51256fac599a81020000002b" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361407916780 }, "id" : "51256fac599a81020000002b", "permissions" : { "delete" : [ "jennli@mit.edu" ], "update" : [ "jennli@mit.edu" ], "admin" : [ "jennli@mit.edu" ], "read" : [ "jennli@mit.edu" ] }, "quote" : "and the wheelbarrows are similarly plastered", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 829, "end" : "/div[1]/p[1]", "endOffset" : 873, "_id" : { "$oid" : "51256fac599a81020000002c" } } ], "tags" : [ "Rhythm" ], "text" : "Since the previous and subsequent line are in iambic pentameter, this line in-between breaks that pattern.", "updated" : { "$date" : 1361407935662 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "jennli@mit.edu", "username" : "Jennifer L.", "uuid" : "4FF9FC9D" } -{ "id" : "512570107fabe1020000002b", "user" : "jennli@mit.edu", "username" : "Jennifer L.", "text" : "Interesting shift in subject: change from setting description to more personal subject matter. 1st person \"We\" is used.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "The old man accepts a Lucky Strike.\nHe was a friend of my grandfather.\nWe", "uuid" : "000F0CE0", "_id" : { "$oid" : "512570107fabe1020000002b" }, "permissions" : { "delete" : [ "jennli@mit.edu" ], "update" : [ "jennli@mit.edu" ], "admin" : [ "jennli@mit.edu" ], "read" : [ "jennli@mit.edu" ] }, "tags" : [ "First-person" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1191, "end" : "/div[1]/p[1]", "endOffset" : 1264, "_id" : { "$oid" : "512570107fabe1020000002c" } } ], "updated" : { "$date" : 1361408016856 }, "created" : { "$date" : 1361408016856 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "5125705e7fabe1020000002d" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361408094078 }, "id" : "5125705e7fabe1020000002d", "permissions" : { "delete" : [ "jennli@mit.edu" ], "update" : [ "jennli@mit.edu" ], "admin" : [ "jennli@mit.edu" ], "read" : [ "jennli@mit.edu" ] }, "quote" : "scraped the scales", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1431, "end" : "/div[1]/p[1]", "endOffset" : 1449, "_id" : { "$oid" : "5125705e7fabe1020000002e" } } ], "tags" : [ "Sound" ], "text" : "Both \"scaped\" and \"scales\" have the \"sc\" sound.", "updated" : { "$date" : 1361408253349 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "jennli@mit.edu", "username" : "Jennifer L.", "uuid" : "0ABE58A2" } -{ "id" : "512570d37fabe10200000030", "user" : "manningk@mit.edu", "username" : "Kristen M.", "text" : "Nearly all of the nouns in the poem are described an adjective, and many of them are described by two.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "creamy iridescent coats", "uuid" : "214C40B1", "_id" : { "$oid" : "512570d37fabe10200000030" }, "permissions" : { "delete" : [ "manningk@mit.edu" ], "update" : [ "manningk@mit.edu" ], "admin" : [ "manningk@mit.edu" ], "read" : [ "manningk@mit.edu" ] }, "tags" : [ "NounsAdjectives" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 879, "end" : "/div[1]/p[1]", "endOffset" : 902, "_id" : { "$oid" : "512570d37fabe10200000031" } } ], "updated" : { "$date" : 1361408211395 }, "created" : { "$date" : 1361408211395 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512570e67fabe10200000032", "user" : "jennli@mit.edu", "username" : "Jennifer L.", "text" : "There is an interesting contrast between \"principal\" vs. \"unnumbered\". I feel that this contrast highlights that the beauty in the details.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "principal beauty,\nfrom unnumbered fish", "uuid" : "8BC3FA2D", "_id" : { "$oid" : "512570e67fabe10200000032" }, "permissions" : { "delete" : [ "jennli@mit.edu" ], "update" : [ "jennli@mit.edu" ], "admin" : [ "jennli@mit.edu" ], "read" : [ "jennli@mit.edu" ] }, "tags" : [ "Contrast", "Unusual" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1455, "end" : "/div[1]/p[1]", "endOffset" : 1494, "_id" : { "$oid" : "512570e67fabe10200000033" } } ], "updated" : { "$date" : 1361408230350 }, "created" : { "$date" : 1361408230350 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512570f2599a81020000002d", "user" : "manningk@mit.edu", "username" : "Kristen M.", "text" : "The capitalization here is interesting", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Lucky Strike", "uuid" : "31E65D62", "_id" : { "$oid" : "512570f2599a81020000002d" }, "permissions" : { "delete" : [ "manningk@mit.edu" ], "update" : [ "manningk@mit.edu" ], "admin" : [ "manningk@mit.edu" ], "read" : [ "manningk@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1213, "end" : "/div[1]/p[1]", "endOffset" : 1225, "_id" : { "$oid" : "512570f2599a81020000002e" } } ], "updated" : { "$date" : 1361408242968 }, "created" : { "$date" : 1361408242968 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51257139599a81020000002f", "user" : "manningk@mit.edu", "username" : "Kristen M.", "text" : "The repetition of iridescent really stands out ", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "iridescent", "uuid" : "F49401D1", "_id" : { "$oid" : "51257139599a81020000002f" }, "permissions" : { "delete" : [ "manningk@mit.edu" ], "update" : [ "manningk@mit.edu" ], "admin" : [ "manningk@mit.edu" ], "read" : [ "manningk@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 885, "end" : "/div[1]/p[1]", "endOffset" : 896, "_id" : { "$oid" : "51257139599a810200000030" } } ], "updated" : { "$date" : 1361408313901 }, "created" : { "$date" : 1361408313901 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125714e7fabe10200000034", "user" : "manningk@mit.edu", "username" : "Kristen M.", "text" : "Nearly all of the nouns in the poem are described an adjective, and many of them are described by two.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "long bleached handles", "uuid" : "9459CFE9", "_id" : { "$oid" : "5125714e7fabe10200000034" }, "permissions" : { "delete" : [ "manningk@mit.edu" ], "update" : [ "manningk@mit.edu" ], "admin" : [ "manningk@mit.edu" ], "read" : [ "manningk@mit.edu" ] }, "tags" : [ "NounsAdjectives" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1091, "end" : "/div[1]/p[1]", "endOffset" : 1113, "_id" : { "$oid" : "5125714e7fabe10200000035" } } ], "updated" : { "$date" : 1361408334168 }, "created" : { "$date" : 1361408334168 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512571887fabe10200000036", "user" : "manningk@mit.edu", "username" : "Kristen M.", "text" : "Nearly all of the nouns in the poem are described an adjective, and many of them are described by two.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "black old knife", "uuid" : "FECD9F37", "_id" : { "$oid" : "512571887fabe10200000036" }, "permissions" : { "delete" : [ "manningk@mit.edu" ], "update" : [ "manningk@mit.edu" ], "admin" : [ "manningk@mit.edu" ], "read" : [ "manningk@mit.edu" ] }, "tags" : [ "NounsAdjectives" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1504, "end" : "/div[1]/p[1]", "endOffset" : 1519, "_id" : { "$oid" : "512571887fabe10200000037" } } ], "updated" : { "$date" : 1361408392100 }, "created" : { "$date" : 1361408392100 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512571b37fabe10200000038", "user" : "manningk@mit.edu", "username" : "Kristen M.", "text" : "alliteration- W ", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "the blade of which is almost worn away.", "uuid" : "4AAA3366", "_id" : { "$oid" : "512571b37fabe10200000038" }, "permissions" : { "delete" : [ "manningk@mit.edu" ], "update" : [ "manningk@mit.edu" ], "admin" : [ "manningk@mit.edu" ], "read" : [ "manningk@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1521, "end" : "/div[1]/p[1]", "endOffset" : 1560, "_id" : { "$oid" : "512571b37fabe10200000039" } } ], "updated" : { "$date" : 1361408435697 }, "created" : { "$date" : 1361408435697 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512571f37fabe1020000003a", "user" : "jennli@mit.edu", "username" : "Jennifer L.", "text" : "This sentence of the poem uses more complex syntax. Moreover, in this sentence, it seems that Bishop first describes on the broad picture and then focuses in on the knife's blade. ", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "that black old knife,\nthe blade of which is almost worn away.", "uuid" : "D0712165", "_id" : { "$oid" : "512571f37fabe1020000003a" }, "permissions" : { "delete" : [ "jennli@mit.edu" ], "update" : [ "jennli@mit.edu" ], "admin" : [ "jennli@mit.edu" ], "read" : [ "jennli@mit.edu" ] }, "tags" : [ "Syntax" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1498, "end" : "/div[1]/p[1]", "endOffset" : 1560, "_id" : { "$oid" : "512571f37fabe1020000003b" } } ], "updated" : { "$date" : 1361408499858 }, "created" : { "$date" : 1361408499858 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125726d7fabe1020000003c", "user" : "jennli@mit.edu", "username" : "Jennifer L.", "text" : "\"sequins\" is a very exotic word choice, especially to describe a relatively ordinary's man's vest and thumb. This shows Bishop's beautiful and precise imagery.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "sequins", "uuid" : "7154D056", "_id" : { "$oid" : "5125726d7fabe1020000003c" }, "permissions" : { "delete" : [ "jennli@mit.edu" ], "update" : [ "jennli@mit.edu" ], "admin" : [ "jennli@mit.edu" ], "read" : [ "jennli@mit.edu" ] }, "tags" : [ "Unusual", "Beautiful" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1386, "end" : "/div[1]/p[1]", "endOffset" : 1393, "_id" : { "$oid" : "5125726d7fabe1020000003d" } } ], "updated" : { "$date" : 1361408621201 }, "created" : { "$date" : 1361408621201 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125800d599a810200000031", "user" : "mmunoz17@mit.edu", "username" : "Marcos M.", "text" : "compares herself with job", "uri" : "http://annotationstudio.mit.edu/documents/narrative-of-the-captivity-and-restoration-of-mrs-mary-rowlandson-v-2", "quote" : "Yet upon this, and the like occasions, I hope it is not too much to say with Job, \"Have pity upon me, O ye my Friends, for the Hand of the Lord has touched me", "uuid" : "8A48A8CD", "_id" : { "$oid" : "5125800d599a810200000031" }, "permissions" : { "delete" : [ "mmunoz17@mit.edu" ], "update" : [ "mmunoz17@mit.edu" ], "admin" : [ "mmunoz17@mit.edu" ], "read" : [ "mmunoz17@mit.edu" ] }, "tags" : [ "job" ], "ranges" : [ { "start" : "/div[1]/p[42]", "startOffset" : 1306, "end" : "/div[1]/p[42]", "endOffset" : 1464, "_id" : { "$oid" : "5125800d599a810200000032" } } ], "updated" : { "$date" : 1361412109081 }, "created" : { "$date" : 1361412109081 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51258363599a810200000033", "user" : "mgull@mit.edu", "username" : "Morgan G.", "text" : "all have more than nine syllables", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Down at the water’s edge, at the place\nwhere they haul up the boats, up the long ramp\ndescending into the water, thin silver\ntree trunks are laid horizontally\nacross the gray stones, down and down\nat intervals of four or five feet.", "uuid" : "02DDC0E9", "_id" : { "$oid" : "51258363599a810200000033" }, "permissions" : { "delete" : [ "mgull@mit.edu" ], "update" : [ "mgull@mit.edu" ], "admin" : [ "mgull@mit.edu" ], "read" : [ "mgull@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1562, "end" : "/div[1]/p[1]", "endOffset" : 1793, "_id" : { "$oid" : "51258363599a810200000034" } } ], "updated" : { "$date" : 1361412963854 }, "created" : { "$date" : 1361412963854 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512583da599a810200000035", "user" : "mgull@mit.edu", "username" : "Morgan G.", "text" : "alliteration", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "dark deep", "uuid" : "DEBD7249", "_id" : { "$oid" : "512583da599a810200000035" }, "permissions" : { "delete" : [ "mgull@mit.edu" ], "update" : [ "mgull@mit.edu" ], "admin" : [ "mgull@mit.edu" ], "read" : [ "mgull@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1800, "end" : "/div[1]/p[1]", "endOffset" : 1809, "_id" : { "$oid" : "512583da599a810200000036" } } ], "updated" : { "$date" : 1361413082343 }, "created" : { "$date" : 1361413082343 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512583e87fabe1020000003e", "user" : "mgull@mit.edu", "username" : "Morgan G.", "text" : "alliteration ", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "four or five feet", "uuid" : "C04076BF", "_id" : { "$oid" : "512583e87fabe1020000003e" }, "permissions" : { "delete" : [ "mgull@mit.edu" ], "update" : [ "mgull@mit.edu" ], "admin" : [ "mgull@mit.edu" ], "read" : [ "mgull@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1775, "end" : "/div[1]/p[1]", "endOffset" : 1792, "_id" : { "$oid" : "512583e87fabe1020000003f" } } ], "updated" : { "$date" : 1361413096797 }, "created" : { "$date" : 1361413096797 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125846c599a810200000037", "user" : "mgull@mit.edu", "username" : "Morgan G.", "text" : "immersion and hymns- off rhyme ", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "like me a believer in total immersion,\nso I used to sing him Baptist hymns.", "uuid" : "B9405B2B", "_id" : { "$oid" : "5125846c599a810200000037" }, "permissions" : { "delete" : [ "mgull@mit.edu" ], "update" : [ "mgull@mit.edu" ], "admin" : [ "mgull@mit.edu" ], "read" : [ "mgull@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2005, "end" : "/div[1]/p[1]", "endOffset" : 2080, "_id" : { "$oid" : "5125846c599a810200000038" } } ], "updated" : { "$date" : 1361413228508 }, "created" : { "$date" : 1361413228508 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125848d599a810200000039", "user" : "mgull@mit.edu", "username" : "Morgan G.", "text" : "repetition of first line", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Cold dark deep", "uuid" : "B3A1B75E", "_id" : { "$oid" : "5125848d599a810200000039" }, "permissions" : { "delete" : [ "mgull@mit.edu" ], "update" : [ "mgull@mit.edu" ], "admin" : [ "mgull@mit.edu" ], "read" : [ "mgull@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2337, "end" : "/div[1]/p[1]", "endOffset" : 2351, "_id" : { "$oid" : "5125848d599a81020000003a" } } ], "updated" : { "$date" : 1361413261481 }, "created" : { "$date" : 1361413261481 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125849d7fabe10200000040", "user" : "mgull@mit.edu", "username" : "Morgan G.", "text" : "alliteration", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Back, behind", "uuid" : "CF780764", "_id" : { "$oid" : "5125849d7fabe10200000040" }, "permissions" : { "delete" : [ "mgull@mit.edu" ], "update" : [ "mgull@mit.edu" ], "admin" : [ "mgull@mit.edu" ], "read" : [ "mgull@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2405, "end" : "/div[1]/p[1]", "endOffset" : 2417, "_id" : { "$oid" : "5125849d7fabe10200000041" } } ], "updated" : { "$date" : 1361413277429 }, "created" : { "$date" : 1361413277429 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125859a599a81020000003b", "user" : "mgull@mit.edu", "username" : "Morgan G.", "text" : "repeats the \"s\" sound... almoSt, Same, Spot, Sort, Shrug", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "almost in the same spot, with a sort of shrug", "uuid" : "8F1220B8", "_id" : { "$oid" : "5125859a599a81020000003b" }, "permissions" : { "delete" : [ "mgull@mit.edu" ], "update" : [ "mgull@mit.edu" ], "admin" : [ "mgull@mit.edu" ], "read" : [ "mgull@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2248, "end" : "/div[1]/p[1]", "endOffset" : 2293, "_id" : { "$oid" : "5125859a599a81020000003c" } } ], "updated" : { "$date" : 1361413530262 }, "created" : { "$date" : 1361413530262 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512585e77fabe10200000042", "user" : "mgull@mit.edu", "username" : "Morgan G.", "text" : "iambic meter for as if it were against, after that you have 3 stresses on bet ter judg", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "as if it were against his better judgment", "uuid" : "3E5658B9", "_id" : { "$oid" : "512585e77fabe10200000042" }, "permissions" : { "delete" : [ "mgull@mit.edu" ], "update" : [ "mgull@mit.edu" ], "admin" : [ "mgull@mit.edu" ], "read" : [ "mgull@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2294, "end" : "/div[1]/p[1]", "endOffset" : 2335, "_id" : { "$oid" : "512585e77fabe10200000043" } } ], "updated" : { "$date" : 1361413607904 }, "created" : { "$date" : 1361413607904 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512586127fabe10200000044", "user" : "mgull@mit.edu", "username" : "Morgan G.", "text" : "all hard sounds", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Cold dark deep", "uuid" : "989963D1", "_id" : { "$oid" : "512586127fabe10200000044" }, "permissions" : { "delete" : [ "mgull@mit.edu" ], "update" : [ "mgull@mit.edu" ], "admin" : [ "mgull@mit.edu" ], "read" : [ "mgull@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1795, "end" : "/div[1]/p[1]", "endOffset" : 1809, "_id" : { "$oid" : "512586127fabe10200000045" } } ], "updated" : { "$date" : 1361413650549 }, "created" : { "$date" : 1361413650549 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512586fa599a81020000003d", "user" : "mgull@mit.edu", "username" : "Morgan G.", "text" : "iambic meter", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "across the gray stones, down and down", "uuid" : "EDFDFD19", "_id" : { "$oid" : "512586fa599a81020000003d" }, "permissions" : { "delete" : [ "mgull@mit.edu" ], "update" : [ "mgull@mit.edu" ], "admin" : [ "mgull@mit.edu" ], "read" : [ "mgull@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1721, "end" : "/div[1]/p[1]", "endOffset" : 1758, "_id" : { "$oid" : "512586fa599a81020000003e" } } ], "updated" : { "$date" : 1361413882477 }, "created" : { "$date" : 1361413882477 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512587e17fabe10200000046", "user" : "mgull@mit.edu", "username" : "Morgan G.", "text" : "this is a moment of particular emphasis by using an ellipsis it makes the reader take a pause and draws attention on the one particular seal- making it a bit more personal as it is not just any seal.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "One seal particularly", "uuid" : "3ADDC664", "_id" : { "$oid" : "512587e17fabe10200000046" }, "permissions" : { "delete" : [ "mgull@mit.edu" ], "update" : [ "mgull@mit.edu" ], "admin" : [ "mgull@mit.edu" ], "read" : [ "mgull@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1890, "end" : "/div[1]/p[1]", "endOffset" : 1911, "_id" : { "$oid" : "512587e17fabe10200000047" } } ], "updated" : { "$date" : 1361414113082 }, "created" : { "$date" : 1361414113082 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5125891c7fabe10200000048" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361414428491 }, "id" : "5125891c7fabe10200000048", "permissions" : { "delete" : [ "mgull@mit.edu" ], "update" : [ "mgull@mit.edu" ], "admin" : [ "mgull@mit.edu" ], "read" : [ "mgull@mit.edu" ] }, "quote" : "Cold dark deep and absolutely clear,\nelement bearable to no mortal,", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1795, "end" : "/div[1]/p[1]", "endOffset" : 1862, "_id" : { "$oid" : "5125891c7fabe10200000049" } } ], "tags" : [], "text" : "in the previous stanza no commas were used at the end of a line, yet here commas separate the end of these lines", "updated" : { "$date" : 1361414567930 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "mgull@mit.edu", "username" : "Morgan G.", "uuid" : "115A5708" } -{ "id" : "5125893e599a81020000003f", "user" : "mgull@mit.edu", "username" : "Morgan G.", "text" : "semicolon, slows the reader down", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "music;", "uuid" : "1A170687", "_id" : { "$oid" : "5125893e599a81020000003f" }, "permissions" : { "delete" : [ "mgull@mit.edu" ], "update" : [ "mgull@mit.edu" ], "admin" : [ "mgull@mit.edu" ], "read" : [ "mgull@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1997, "end" : "/div[1]/p[1]", "endOffset" : 2004, "_id" : { "$oid" : "5125893e599a810200000040" } } ], "updated" : { "$date" : 1361414462297 }, "created" : { "$date" : 1361414462297 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51258959599a810200000041", "user" : "mgull@mit.edu", "username" : "Morgan G.", "text" : "uses a period mid sentence, this differes from the other lines that we are looking at in this poem", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "e. He w", "uuid" : "83B1C662", "_id" : { "$oid" : "51258959599a810200000041" }, "permissions" : { "delete" : [ "mgull@mit.edu" ], "update" : [ "mgull@mit.edu" ], "admin" : [ "mgull@mit.edu" ], "read" : [ "mgull@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1974, "end" : "/div[1]/p[1]", "endOffset" : 1981, "_id" : { "$oid" : "51258959599a810200000042" } } ], "updated" : { "$date" : 1361414489124 }, "created" : { "$date" : 1361414489124 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512589c4599a810200000043", "user" : "mgull@mit.edu", "username" : "Morgan G.", "text" : "here again commas are used to end the lines of these sentence", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Cold dark deep and absolutely clear,\nthe clear gray icy water . . . Back, behind us,", "uuid" : "9445E602", "_id" : { "$oid" : "512589c4599a810200000043" }, "permissions" : { "delete" : [ "mgull@mit.edu" ], "update" : [ "mgull@mit.edu" ], "admin" : [ "mgull@mit.edu" ], "read" : [ "mgull@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2337, "end" : "/div[1]/p[1]", "endOffset" : 2421, "_id" : { "$oid" : "512589c4599a810200000044" } } ], "updated" : { "$date" : 1361414596219 }, "created" : { "$date" : 1361414596219 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512589fc599a810200000045", "user" : "mgull@mit.edu", "username" : "Morgan G.", "text" : "ellipse used to break up the line again.. it changes the topic of discussion in the story.. brings a new idea up", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "icy water . . . Back, behind us,", "uuid" : "802C0CFE", "_id" : { "$oid" : "512589fc599a810200000045" }, "permissions" : { "delete" : [ "mgull@mit.edu" ], "update" : [ "mgull@mit.edu" ], "admin" : [ "mgull@mit.edu" ], "read" : [ "mgull@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2389, "end" : "/div[1]/p[1]", "endOffset" : 2421, "_id" : { "$oid" : "512589fc599a810200000046" } } ], "updated" : { "$date" : 1361414652641 }, "created" : { "$date" : 1361414652641 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "51258a8e599a810200000047" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361414798486 }, "groups" : [], "id" : "51258a8e599a810200000047", "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "quote" : "There are sequins on his vest and on his thumb.\nHe has scraped the scales, the principal beauty,\nfrom unnumbered fish with that black old knife,\nthe blade of which is almost worn away.", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1376, "end" : "/div[1]/p[1]", "endOffset" : 1560, "_id" : { "$oid" : "5125afa27fabe1020000006b" } } ], "tags" : [], "text" : "These are my lines. There are many like them but these are mine", "updated" : { "$date" : 1361424290785 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "uuid" : "7242A0D7" } -{ "id" : "51258d13599a810200000049", "user" : "mcfuller@mit.edu", "username" : "Mary F.", "text" : "Rhythm comes from repetition", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "I have seen it over and over, the same sea, the same,", "uuid" : "39037419", "_id" : { "$oid" : "51258d13599a810200000049" }, "permissions" : { "delete" : [ "mcfuller@mit.edu" ], "update" : [ "mcfuller@mit.edu" ], "admin" : [ "mcfuller@mit.edu" ], "read" : [ "mcfuller@mit.edu" ] }, "tags" : [ "Rhythm,", "repetition" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2619, "end" : "/div[1]/p[1]", "endOffset" : 2672, "_id" : { "$oid" : "51258d13599a81020000004a" } } ], "updated" : { "$date" : 1361415443893 }, "created" : { "$date" : 1361415443893 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512590d37fabe1020000004a", "user" : "mcfuller@mit.edu", "username" : "Mary F.", "text" : "People are wondering about the location: we're in a fishing village in Nova Scotia. Yes, firs would grow there!", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Christmas trees", "uuid" : "77D12A6C", "_id" : { "$oid" : "512590d37fabe1020000004a" }, "permissions" : { "delete" : [ "mcfuller@mit.edu" ], "update" : [ "mcfuller@mit.edu" ], "admin" : [ "mcfuller@mit.edu" ], "read" : [ "mcfuller@mit.edu" ] }, "tags" : [ "incongruity,", "question" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2503, "end" : "/div[1]/p[1]", "endOffset" : 2518, "_id" : { "$oid" : "512590d37fabe1020000004b" } } ], "updated" : { "$date" : 1361416403489 }, "created" : { "$date" : 1361416403489 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "512590e5599a81020000004d" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361416421032 }, "id" : "512590e5599a81020000004d", "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "quote" : "There are sequins on his vest and on his thumb.", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1376, "end" : "/div[1]/p[1]", "endOffset" : 1423, "_id" : { "$oid" : "512590e5599a81020000004e" } } ], "tags" : [], "text" : "[sequins](http://en.wikipedia.org/wiki/Sequin): A small spangle used in the ornamentation of dresses, etc. They are usually bright. I can see these being on his vest in the literal sense; however, Bishop also uses it to refer to the calluses on the man's hand, a lasting symbol of hard work. Like sequins, they are bright (or brighter than the skins about them). ", "updated" : { "$date" : 1361418489822 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "uuid" : "FCFD157B" } -{ "id" : "51259208599a81020000004f", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "Unnumbered can mean not counted or uncountable. The man has cut up so many fish that he couldn't bother himself with counting them all.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "unnumbered", "uuid" : "B2CC0E23", "_id" : { "$oid" : "51259208599a81020000004f" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1478, "end" : "/div[1]/p[1]", "endOffset" : 1489, "_id" : { "$oid" : "51259208599a810200000050" } } ], "updated" : { "$date" : 1361416712590 }, "created" : { "$date" : 1361416712590 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "512592617fabe1020000004c" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361416801738 }, "id" : "512592617fabe1020000004c", "permissions" : { "delete" : [ "mcfuller@mit.edu" ], "update" : [ "mcfuller@mit.edu" ], "admin" : [ "mcfuller@mit.edu" ], "read" : [ "mcfuller@mit.edu" ] }, "quote" : "A Mighty Fortress Is Our God.", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2094, "end" : "/div[1]/p[1]", "endOffset" : 2123, "_id" : { "$oid" : "512592617fabe1020000004d" } } ], "tags" : [ "question,", "answer" ], "text" : "This is the title of a famous hymn written by Martin Luther (thus, a Lutheran hymn as distinct from the Baptist hymns).", "updated" : { "$date" : 1361418754254 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "mcfuller@mit.edu", "username" : "Mary F.", "uuid" : "EAF45D7E" } -{ "id" : "512594587fabe1020000004e", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "When I heard this, I immediately thought obsidian. Obsidian blades are known for their sharpness (so sharp that they are being experimentally used as scalpels according to Wikipedia). I think, however, that Bishop may be referring to some old typical knife.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "black old knife", "uuid" : "589ED686", "_id" : { "$oid" : "512594587fabe1020000004e" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1503, "end" : "/div[1]/p[1]", "endOffset" : 1519, "_id" : { "$oid" : "512594587fabe1020000004f" } } ], "updated" : { "$date" : 1361417304038 }, "created" : { "$date" : 1361417304038 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "512594fd599a810200000051" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361417469632 }, "id" : "512594fd599a810200000051", "permissions" : { "delete" : [ "mcfuller@mit.edu" ], "update" : [ "mcfuller@mit.edu" ], "admin" : [ "mcfuller@mit.edu" ], "read" : [ "mcfuller@mit.edu" ] }, "quote" : "shuttle", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 158, "end" : "/div[1]/p[1]", "endOffset" : 166, "_id" : { "$oid" : "512594fd599a810200000052" } } ], "tags" : [ "question,", "gloss" ], "text" : "The shuttle is an instrument for weaving (moves the cross-ways thread through the up-and- down threads). He's repairing, reweaving, a fishing net.", "updated" : { "$date" : 1361417506699 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "mcfuller@mit.edu", "username" : "Mary F.", "uuid" : "29A48229" } -{ "id" : "51259557599a810200000053", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "This word is Anglo Norman. The definition I think fits best here is \"first or highest in rank or importance; that is at the head of all the rest; of the greatest account or value.\" This ties in with the beauty Bishop described the wheelbarrows and tubs with before.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "principal", "uuid" : "553DAA29", "_id" : { "$oid" : "51259557599a810200000053" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1455, "end" : "/div[1]/p[1]", "endOffset" : 1465, "_id" : { "$oid" : "51259557599a810200000054" } } ], "updated" : { "$date" : 1361417559717 }, "created" : { "$date" : 1361417559717 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512595af7fabe10200000050", "user" : "mcfuller@mit.edu", "username" : "Mary F.", "text" : "Hmm, MY OED has herring as Anglo-Saxon, NOT Latin!", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "herring", "uuid" : "10CF8A3B", "_id" : { "$oid" : "512595af7fabe10200000050" }, "permissions" : { "delete" : [ "mcfuller@mit.edu" ], "update" : [ "mcfuller@mit.edu" ], "admin" : [ "mcfuller@mit.edu" ], "read" : [ "mcfuller@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 814, "end" : "/div[1]/p[1]", "endOffset" : 821, "_id" : { "$oid" : "512595af7fabe10200000051" } } ], "updated" : { "$date" : 1361417647638 }, "created" : { "$date" : 1361417647638 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "512596c37fabe10200000052" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361417923893 }, "id" : "512596c37fabe10200000052", "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "quote" : "worn", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1550, "end" : "/div[1]/p[1]", "endOffset" : 1555, "_id" : { "$oid" : "512596c37fabe10200000053" } } ], "tags" : [], "text" : "Blades wear away over time. Using it the right way (e.g. not dragging it across the sidewalk), this process can take years to do. This blade could be as old as the man himself. This got me to thinking though: this blade is the whole reason that this man can do his job. Why can he not keep it sharp, as to perform his duties to his utmost ability?", "updated" : { "$date" : 1361418830931 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "uuid" : "D33216B6" } -{ "__v" : 1, "_id" : { "$oid" : "512597837fabe10200000054" }, "annotator_schema_version" : "v1.0", "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361418115081 }, "groups" : [], "id" : "512597837fabe10200000054", "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "quote" : ".", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1559, "end" : "/div[1]/p[1]", "endOffset" : 1560, "_id" : { "$oid" : "5125a8e47fabe10200000068" } } ], "tags" : [], "text" : "Something notable: I do not see any Latin words at first glance. In addition, there is no rhyme. As for rhythm, there does not seem to be any in the first two line, but the last two lines appear to have it. I interpreted the lines as follows (I have bolded the stressed syllables): **There** are **seq**uins on his **vest** and on his **thumb.**|\nHe has **scraped** the **scales**, the **prin**cipal **beau**ty,|\nfrom un**numb**ered **fish** with that **black** old **knife**,|\nthe **blade** of **which** is **al**most **worn** a**way.**", "updated" : { "$date" : 1361423148759 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "uuid" : "82B88892" } -{ "id" : "51259ba77fabe10200000056", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "Repetition of the \"sc\" sound here. I believe that makes this alliteration.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "scraped the scales", "uuid" : "30E936F4", "_id" : { "$oid" : "51259ba77fabe10200000056" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1431, "end" : "/div[1]/p[1]", "endOffset" : 1449, "_id" : { "$oid" : "51259ba77fabe10200000057" } } ], "updated" : { "$date" : 1361419175925 }, "created" : { "$date" : 1361419175925 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51259d837fabe10200000058", "user" : "adnicker@mit.edu", "username" : "Andrea N.", "text" : "The poem started very focused on the fisherman then zooms out to his surroundings in just the few opening lines.\nIt feels like it keeps the fisherman in focus but we’re gradually getting more and more info of where he is. ", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "ls.", "uuid" : "021E53E5", "_id" : { "$oid" : "51259d837fabe10200000058" }, "permissions" : { "delete" : [ "adnicker@mit.edu" ], "update" : [ "adnicker@mit.edu" ], "admin" : [ "adnicker@mit.edu" ], "read" : [ "adnicker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 746, "end" : "/div[1]/p[1]", "endOffset" : 749, "_id" : { "$oid" : "51259d837fabe10200000059" } } ], "updated" : { "$date" : 1361419651697 }, "created" : { "$date" : 1361419651697 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51259da2599a810200000055", "user" : "adnicker@mit.edu", "username" : "Andrea N.", "text" : "This seems like a near rhyme with codfish...?", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "polished", "uuid" : "E059AF96", "_id" : { "$oid" : "51259da2599a810200000055" }, "permissions" : { "delete" : [ "adnicker@mit.edu" ], "update" : [ "adnicker@mit.edu" ], "admin" : [ "adnicker@mit.edu" ], "read" : [ "adnicker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 175, "end" : "/div[1]/p[1]", "endOffset" : 183, "_id" : { "$oid" : "51259da2599a810200000056" } } ], "updated" : { "$date" : 1361419682113 }, "created" : { "$date" : 1361419682113 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51259dd97fabe1020000005a", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "Possible fish Bishop may be referencing: [codfish](http://en.wikipedia.org/wiki/Atlantic_Cod) and [herring](http://en.wikipedia.org/wiki/Blueback_herring)", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "codfish and herring", "uuid" : "46D5E11E", "_id" : { "$oid" : "51259dd97fabe1020000005a" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1310, "end" : "/div[1]/p[1]", "endOffset" : 1329, "_id" : { "$oid" : "51259dd97fabe1020000005b" } } ], "updated" : { "$date" : 1361419737888 }, "created" : { "$date" : 1361419737888 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51259dde599a810200000057", "user" : "adnicker@mit.edu", "username" : "Andrea N.", "text" : "Rocks and moss have assonance between them. The \"s\" at the end also makes me think it could be a near rhyme, but I might be stretching it. ", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "rocks", "uuid" : "CF4D308F", "_id" : { "$oid" : "51259dde599a810200000057" }, "permissions" : { "delete" : [ "adnicker@mit.edu" ], "update" : [ "adnicker@mit.edu" ], "admin" : [ "adnicker@mit.edu" ], "read" : [ "adnicker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 628, "end" : "/div[1]/p[1]", "endOffset" : 633, "_id" : { "$oid" : "51259dde599a810200000058" } } ], "updated" : { "$date" : 1361419742249 }, "created" : { "$date" : 1361419742249 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51259ed67fabe1020000005c", "user" : "adnicker@mit.edu", "username" : "Andrea N.", "text" : "Uses a lot of adjectives. Usually multiple per noun. ", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "wild jagged", "uuid" : "AA284D2D", "_id" : { "$oid" : "51259ed67fabe1020000005c" }, "permissions" : { "delete" : [ "adnicker@mit.edu" ], "update" : [ "adnicker@mit.edu" ], "admin" : [ "adnicker@mit.edu" ], "read" : [ "adnicker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 616, "end" : "/div[1]/p[1]", "endOffset" : 627, "_id" : { "$oid" : "51259ed67fabe1020000005d" } } ], "updated" : { "$date" : 1361419990890 }, "created" : { "$date" : 1361419990890 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "51259f52599a810200000059" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361420114808 }, "id" : "51259f52599a810200000059", "permissions" : { "delete" : [ "adnicker@mit.edu" ], "update" : [ "adnicker@mit.edu" ], "admin" : [ "adnicker@mit.edu" ], "read" : [ "adnicker@mit.edu" ] }, "quote" : "apparent translucence", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 644, "end" : "/div[1]/p[1]", "endOffset" : 665, "_id" : { "$oid" : "51259f52599a81020000005a" } } ], "tags" : [], "text" : "Both of these are latinate words. Other Latinate words are consider and emerald. They are all used in close proximity to each other-- same sentence actually. They are very descriptive words. ", "updated" : { "$date" : 1361420178058 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "adnicker@mit.edu", "username" : "Andrea N.", "uuid" : "8297BD12" } -{ "id" : "51259fce599a81020000005c", "user" : "adnicker@mit.edu", "username" : "Andrea N.", "text" : "This word is bugging me. All the other words in this passage are pretty simple and straightforward. Maybe it's a lack of vocabulary on my part, but this is the only word I didn't know.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "gloaming", "uuid" : "291E8B99", "_id" : { "$oid" : "51259fce599a81020000005c" }, "permissions" : { "delete" : [ "adnicker@mit.edu" ], "update" : [ "adnicker@mit.edu" ], "admin" : [ "adnicker@mit.edu" ], "read" : [ "adnicker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 102, "end" : "/div[1]/p[1]", "endOffset" : 111, "_id" : { "$oid" : "51259fce599a81020000005d" } } ], "updated" : { "$date" : 1361420238522 }, "created" : { "$date" : 1361420238522 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "51259fd47fabe1020000005e" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361420244553 }, "id" : "51259fd47fabe1020000005e", "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "quote" : "beauty", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1465, "end" : "/div[1]/p[1]", "endOffset" : 1471, "_id" : { "$oid" : "51259fd47fabe1020000005f" } } ], "tags" : [], "text" : "I have thought more about this phrase \"principal beauty.\" Is Bishop referring to the scales as the most beautiful part of the fish, or are the scales the most beautiful thing in the world. Looking at [pictures of the herring](http://www.dnr.state.md.us/fisheries/fishfacts/image/river_herring.gif), I am inclined to say the former, but I my be biased a bit.", "updated" : { "$date" : 1361420400842 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "uuid" : "1422A11C" } -{ "id" : "5125a109599a81020000005e", "user" : "rachel13@mit.edu", "username" : "Rachel F.", "text" : "The line lengths ebb and flow similar to waves (look at the rag- how the right edge looks)", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Although it is a cold evening,\ndown by one of the fishhouses\nan old man sits netting,\nhis net, in the gloaming almost invisible,\na dark purple-brown,\nand his shuttle worn and polished.\nThe air smells so strong of codfish\nit makes one’s nose run and one’s eyes water.\nThe five fishhouses have steeply peaked roofs\nand narrow, cleated gangplanks slant up\nto storerooms in the gables\nfor the wheelbarrows to be pushed up and down on.\nAll is silver: the heavy surface of the sea,\nswelling slowly as if considering spilling over,\nis opaque, but the silver of the benches,\nthe lobster pots, and masts, scattered\namong the wild jagged rocks,\nis of an apparent translucence\nlike the small old buildings with an emerald moss\ngrowing on their shoreward walls.", "uuid" : "2D49E06C", "_id" : { "$oid" : "5125a109599a81020000005e" }, "permissions" : { "delete" : [ "rachel13@mit.edu" ], "update" : [ "rachel13@mit.edu" ], "admin" : [ "rachel13@mit.edu" ], "read" : [ "rachel13@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 0, "end" : "/div[1]/p[1]", "endOffset" : 749, "_id" : { "$oid" : "5125a109599a81020000005f" } } ], "updated" : { "$date" : 1361420553753 }, "created" : { "$date" : 1361420553753 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125a1257fabe10200000060", "user" : "rachel13@mit.edu", "username" : "Rachel F.", "text" : "The first line is iambic metered but then it stops", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Although it is a cold evening,\ndown by one of the fishhouses", "uuid" : "D840FAF8", "_id" : { "$oid" : "5125a1257fabe10200000060" }, "permissions" : { "delete" : [ "rachel13@mit.edu" ], "update" : [ "rachel13@mit.edu" ], "admin" : [ "rachel13@mit.edu" ], "read" : [ "rachel13@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 0, "end" : "/div[1]/p[1]", "endOffset" : 60, "_id" : { "$oid" : "5125a1257fabe10200000061" } } ], "updated" : { "$date" : 1361420581790 }, "created" : { "$date" : 1361420581790 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125a12d7fabe10200000062", "user" : "adnicker@mit.edu", "username" : "Andrea N.", "text" : "Long sentences, that are fairly complex in structure. ", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "All is silver: the heavy surface of the sea,\nswelling slowly as if considering spilling over,\nis opaque, but the silver of the benches,\nthe lobster pots, and masts, scattered\namong the wild jagged rocks,\nis of an apparent translucence\nlike the small old buildings with an emerald moss\ngrowing on their shoreward walls.", "uuid" : "5D437185", "_id" : { "$oid" : "5125a12d7fabe10200000062" }, "permissions" : { "delete" : [ "adnicker@mit.edu" ], "update" : [ "adnicker@mit.edu" ], "admin" : [ "adnicker@mit.edu" ], "read" : [ "adnicker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 431, "end" : "/div[1]/p[1]", "endOffset" : 749, "_id" : { "$oid" : "5125a12d7fabe10200000063" } } ], "updated" : { "$date" : 1361420589216 }, "created" : { "$date" : 1361420589216 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125a341599a810200000060", "user" : "rachel13@mit.edu", "username" : "Rachel F.", "text" : "The syntax is interesting because there isn’t very many nouns/main words per line but rather a lot of verbs and adjectives. There are a lot of adjectives used, specifically colors for the last part - silver, emerald. The sentences get longer by adding more adjectives.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Although it is a cold evening,\ndown by one of the fishhouses\nan old man sits netting,\nhis net, in the gloaming almost invisible,\na dark purple-brown,\nand his shuttle worn and polished.\nThe air smells so strong of codfish\nit makes one’s nose run and one’s eyes water.\nThe five fishhouses have steeply peaked roofs\nand narrow, cleated gangplanks slant up\nto storerooms in the gables\nfor the wheelbarrows to be pushed up and down on.\nAll is silver: the heavy surface of the sea,\nswelling slowly as if considering spilling over,\nis opaque, but the silver of the benches,\nthe lobster pots, and masts, scattered\namong the wild jagged rocks,\nis of an apparent translucence\nlike the small old buildings with an emerald moss\ngrowing on their shoreward walls.", "uuid" : "776759EE", "_id" : { "$oid" : "5125a341599a810200000060" }, "permissions" : { "delete" : [ "rachel13@mit.edu" ], "update" : [ "rachel13@mit.edu" ], "admin" : [ "rachel13@mit.edu" ], "read" : [ "rachel13@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 0, "end" : "/div[1]/p[1]", "endOffset" : 749, "_id" : { "$oid" : "5125a341599a810200000061" } } ], "updated" : { "$date" : 1361421121548 }, "created" : { "$date" : 1361421121548 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125a351599a810200000062", "user" : "rachel13@mit.edu", "username" : "Rachel F.", "text" : "The sentence structure is complicated - there are line breaks both in the middle and end of sentences. Some sentences end in commas, nothing, or periods, but others end in the middle of a thought. They are long and made of many phrases put together - they are run-ons.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Although it is a cold evening,\ndown by one of the fishhouses\nan old man sits netting,\nhis net, in the gloaming almost invisible,\na dark purple-brown,\nand his shuttle worn and polished.", "uuid" : "D3E4E493", "_id" : { "$oid" : "5125a351599a810200000062" }, "permissions" : { "delete" : [ "rachel13@mit.edu" ], "update" : [ "rachel13@mit.edu" ], "admin" : [ "rachel13@mit.edu" ], "read" : [ "rachel13@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 0, "end" : "/div[1]/p[1]", "endOffset" : 184, "_id" : { "$oid" : "5125a351599a810200000063" } } ], "updated" : { "$date" : 1361421137819 }, "created" : { "$date" : 1361421137819 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125a3737fabe10200000064", "user" : "rachel13@mit.edu", "username" : "Rachel F.", "text" : "This is more like Whitman because it is more like a stream of consciousness.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "All is silver: the heavy surface of the sea,\nswelling slowly as if considering spilling over,\nis opaque, but the silver of the benches,\nthe lobster pots, and masts, scattered\namong the wild jagged rocks,\nis of an apparent translucence\nlike the small old buildings with an emerald moss\ngrowing on their shoreward walls.", "uuid" : "F9C7800E", "_id" : { "$oid" : "5125a3737fabe10200000064" }, "permissions" : { "delete" : [ "rachel13@mit.edu" ], "update" : [ "rachel13@mit.edu" ], "admin" : [ "rachel13@mit.edu" ], "read" : [ "rachel13@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 431, "end" : "/div[1]/p[1]", "endOffset" : 749, "_id" : { "$oid" : "5125a3737fabe10200000065" } } ], "updated" : { "$date" : 1361421171196 }, "created" : { "$date" : 1361421171196 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125a484599a810200000064", "user" : "rachel13@mit.edu", "username" : "Rachel F.", "text" : "Strong imagery", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "The air smells so strong of codfish\nit makes one’s nose run and one’s eyes water.", "uuid" : "8FFFDDFD", "_id" : { "$oid" : "5125a484599a810200000064" }, "permissions" : { "delete" : [ "rachel13@mit.edu" ], "update" : [ "rachel13@mit.edu" ], "admin" : [ "rachel13@mit.edu" ], "read" : [ "rachel13@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 185, "end" : "/div[1]/p[1]", "endOffset" : 266, "_id" : { "$oid" : "5125a484599a810200000065" } } ], "updated" : { "$date" : 1361421444856 }, "created" : { "$date" : 1361421444856 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125a4b87fabe10200000066", "user" : "rachel13@mit.edu", "username" : "Rachel F.", "text" : "This means twilight or dusk.It goes along with the tone of the opening few sentences which sound gloomy, and he probably chose this word to fit into that feel. Twilight/dusk definitely portrays a more mystical picture.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "his net, in the gloaming almost invisible,", "uuid" : "CE24189F", "_id" : { "$oid" : "5125a4b87fabe10200000066" }, "permissions" : { "delete" : [ "rachel13@mit.edu" ], "update" : [ "rachel13@mit.edu" ], "admin" : [ "rachel13@mit.edu" ], "read" : [ "rachel13@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 86, "end" : "/div[1]/p[1]", "endOffset" : 128, "_id" : { "$oid" : "5125a4b87fabe10200000067" } } ], "updated" : { "$date" : 1361421496292 }, "created" : { "$date" : 1361421496292 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125ac4c7fabe10200000069", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "I had to slow down at this phrase when I read through this poem quickly. ", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "the principal beauty", "uuid" : "0600AE08", "_id" : { "$oid" : "5125ac4c7fabe10200000069" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1450, "end" : "/div[1]/p[1]", "endOffset" : 1471, "_id" : { "$oid" : "5125ac4c7fabe1020000006a" } } ], "updated" : { "$date" : 1361423436538 }, "created" : { "$date" : 1361423436538 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5125af01599a810200000066" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361424129945 }, "id" : "5125af01599a810200000066", "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "quote" : "the blade of which is almost worn away.", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1521, "end" : "/div[1]/p[1]", "endOffset" : 1560, "_id" : { "$oid" : "5125af01599a810200000067" } } ], "tags" : [], "text" : "This whole line is iambic pentameter. As a result, it sounded slower than the other lines. The line itself is also different than the other lines because it sounds so proper. There is repetition of the \"w\" sound as well.", "updated" : { "$date" : 1361424258316 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "uuid" : "53E1E359" } -{ "id" : "5125afe2599a810200000068", "user" : "rboyland@mit.edu", "username" : "Roosevelt B.", "text" : "This line has an alternating anapestic and iambic foot.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "from unnumbered fish with that black old knife,", "uuid" : "ED01B6D2", "_id" : { "$oid" : "5125afe2599a810200000068" }, "permissions" : { "delete" : [ "rboyland@mit.edu" ], "update" : [ "rboyland@mit.edu" ], "admin" : [ "rboyland@mit.edu" ], "read" : [ "rboyland@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1473, "end" : "/div[1]/p[1]", "endOffset" : 1520, "_id" : { "$oid" : "5125afe2599a810200000069" } } ], "updated" : { "$date" : 1361424354893 }, "created" : { "$date" : 1361424354893 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125b9017fabe1020000006c", "user" : "lydiaa@mit.edu", "username" : "Lydia A.", "text" : "Referring to the trees. Why are they blue?", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Bluish", "uuid" : "7134A778", "_id" : { "$oid" : "5125b9017fabe1020000006c" }, "permissions" : { "delete" : [ "lydiaa@mit.edu" ], "update" : [ "lydiaa@mit.edu" ], "admin" : [ "lydiaa@mit.edu" ], "read" : [ "lydiaa@mit.edu" ] }, "tags" : [ "questions" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2453, "end" : "/div[1]/p[1]", "endOffset" : 2459, "_id" : { "$oid" : "5125b9017fabe1020000006d" } } ], "updated" : { "$date" : 1361426689603 }, "created" : { "$date" : 1361426689603 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125b9267fabe1020000006e", "user" : "lydiaa@mit.edu", "username" : "Lydia A.", "text" : "here we see the color blue again. It seems to be setting a mood or tone.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "blue", "uuid" : "7C2B608E", "_id" : { "$oid" : "5125b9267fabe1020000006e" }, "permissions" : { "delete" : [ "lydiaa@mit.edu" ], "update" : [ "lydiaa@mit.edu" ], "admin" : [ "lydiaa@mit.edu" ], "read" : [ "lydiaa@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2601, "end" : "/div[1]/p[1]", "endOffset" : 2605, "_id" : { "$oid" : "5125b9267fabe1020000006f" } } ], "updated" : { "$date" : 1361426726078 }, "created" : { "$date" : 1361426726078 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125bb57ce3b720200000002", "user" : "lydiaa@mit.edu", "username" : "Lydia A.", "text" : "this word (indifferently) makes the sea seem like a harsh part of nature.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "indifferently", "uuid" : "6DD04421", "_id" : { "$oid" : "5125bb57ce3b720200000002" }, "permissions" : { "delete" : [ "lydiaa@mit.edu" ], "update" : [ "lydiaa@mit.edu" ], "admin" : [ "lydiaa@mit.edu" ], "read" : [ "lydiaa@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2683, "end" : "/div[1]/p[1]", "endOffset" : 2696, "_id" : { "$oid" : "5125bb57ce3b720200000003" } } ], "updated" : { "$date" : 1361427287821 }, "created" : { "$date" : 1361427287821 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125bb92ce3b720200000004", "user" : "lydiaa@mit.edu", "username" : "Lydia A.", "text" : "again, coupled with the word indifferently in the previous line, the word 'icily' gives the impression that the sea is very harsh and cold.", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "icily", "uuid" : "A43B4C39", "_id" : { "$oid" : "5125bb92ce3b720200000004" }, "permissions" : { "delete" : [ "lydiaa@mit.edu" ], "update" : [ "lydiaa@mit.edu" ], "admin" : [ "lydiaa@mit.edu" ], "read" : [ "lydiaa@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2724, "end" : "/div[1]/p[1]", "endOffset" : 2729, "_id" : { "$oid" : "5125bb92ce3b720200000005" } } ], "updated" : { "$date" : 1361427346857 }, "created" : { "$date" : 1361427346857 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125bbf67fabe10200000070", "user" : "lydiaa@mit.edu", "username" : "Lydia A.", "text" : "juxtaposition of the icy cold water of the sea with the word \"fire\"", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "fire", "uuid" : "6536BAE7", "_id" : { "$oid" : "5125bbf67fabe10200000070" }, "permissions" : { "delete" : [ "lydiaa@mit.edu" ], "update" : [ "lydiaa@mit.edu" ], "admin" : [ "lydiaa@mit.edu" ], "read" : [ "lydiaa@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2953, "end" : "/div[1]/p[1]", "endOffset" : 2957, "_id" : { "$oid" : "5125bbf67fabe10200000071" } } ], "updated" : { "$date" : 1361427446879 }, "created" : { "$date" : 1361427446879 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125bc287fabe10200000072", "user" : "lydiaa@mit.edu", "username" : "Lydia A.", "text" : "alliteration. the repeated \"fl\" sound", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "flowing, and flown.", "uuid" : "8A19515E", "_id" : { "$oid" : "5125bc287fabe10200000072" }, "permissions" : { "delete" : [ "lydiaa@mit.edu" ], "update" : [ "lydiaa@mit.edu" ], "admin" : [ "lydiaa@mit.edu" ], "read" : [ "lydiaa@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3330, "end" : "/div[1]/p[1]", "endOffset" : 3349, "_id" : { "$oid" : "5125bc287fabe10200000073" } } ], "updated" : { "$date" : 1361427496686 }, "created" : { "$date" : 1361427496686 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5125bfadce3b720200000006" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361428397878 }, "id" : "5125bfadce3b720200000006", "permissions" : { "delete" : [ "lydiaa@mit.edu" ], "update" : [ "lydiaa@mit.edu" ], "admin" : [ "lydiaa@mit.edu" ], "read" : [ "lydiaa@mit.edu" ] }, "quote" : "bones would begin to ache and your hand would burn", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2861, "end" : "/div[1]/p[1]", "endOffset" : 2912, "_id" : { "$oid" : "5125bfadce3b720200000007" } } ], "tags" : [], "text" : "the same \"b\" sound is repeated: \"burn\" \"bones\" and \"begin\" and \"bitter\" (3 lines down)", "updated" : { "$date" : 1361428455046 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "lydiaa@mit.edu", "username" : "Lydia A.", "uuid" : "CFEF1A40" } -{ "id" : "5125c6ff7fabe10200000074", "user" : "lydiaa@mit.edu", "username" : "Lydia A.", "text" : "The poem describes mostly. It is very descriptive, painting a picture of the scene with the old fisherman at the five fish houses. Towards the end, she begins to become more abstract; in the end she relates the sea to knowledge. ", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : ".", "uuid" : "29EAF8FD", "_id" : { "$oid" : "5125c6ff7fabe10200000074" }, "permissions" : { "delete" : [ "lydiaa@mit.edu" ], "update" : [ "lydiaa@mit.edu" ], "admin" : [ "lydiaa@mit.edu" ], "read" : [ "lydiaa@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 3348, "end" : "/div[1]/p[1]", "endOffset" : 3349, "_id" : { "$oid" : "5125c6ff7fabe10200000075" } } ], "updated" : { "$date" : 1361430271670 }, "created" : { "$date" : 1361430271670 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5125ce317fabe10200000076" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361432113951 }, "id" : "5125ce317fabe10200000076", "permissions" : { "delete" : [ "jwyune@mit.edu" ], "update" : [ "jwyune@mit.edu" ], "admin" : [ "jwyune@mit.edu" ], "read" : [ "jwyune@mit.edu" ] }, "quote" : "gloaming", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 102, "end" : "/div[1]/p[1]", "endOffset" : 110, "_id" : { "$oid" : "5125ce317fabe10200000077" } } ], "tags" : [], "text" : "Old English glómung\nEvening twilight", "updated" : { "$date" : 1361432131022 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "jwyune@mit.edu", "username" : "Jiwon Y.", "uuid" : "EC456F85" } -{ "__v" : 0, "_id" : { "$oid" : "5125cf56e73d220200000002" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361432406980 }, "id" : "5125cf56e73d220200000002", "permissions" : { "delete" : [ "jwyune@mit.edu" ], "update" : [ "jwyune@mit.edu" ], "admin" : [ "jwyune@mit.edu" ], "read" : [ "jwyune@mit.edu" ] }, "quote" : "cleated", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 325, "end" : "/div[1]/p[1]", "endOffset" : 332, "_id" : { "$oid" : "5125cf56e73d220200000003" } } ], "tags" : [], "text" : "Old English cléat\nto fasten to, or with, a cleat", "updated" : { "$date" : 1361432443111 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "jwyune@mit.edu", "username" : "Jiwon Y.", "uuid" : "DC961205" } -{ "id" : "5125cfa5ce3b720200000008", "user" : "jwyune@mit.edu", "username" : "Jiwon Y.", "text" : "Old English gang + plank\na landing-plank\na gang-board", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "gangplanks", "uuid" : "534E768C", "_id" : { "$oid" : "5125cfa5ce3b720200000008" }, "permissions" : { "delete" : [ "jwyune@mit.edu" ], "update" : [ "jwyune@mit.edu" ], "admin" : [ "jwyune@mit.edu" ], "read" : [ "jwyune@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 333, "end" : "/div[1]/p[1]", "endOffset" : 344, "_id" : { "$oid" : "5125cfa5ce3b720200000009" } } ], "updated" : { "$date" : 1361432485453 }, "created" : { "$date" : 1361432485453 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125cfcae73d220200000004", "user" : "jwyune@mit.edu", "username" : "Jiwon Y.", "text" : "to strike obliquely on, upon, or against something", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "slant", "uuid" : "63D4F06D", "_id" : { "$oid" : "5125cfcae73d220200000004" }, "permissions" : { "delete" : [ "jwyune@mit.edu" ], "update" : [ "jwyune@mit.edu" ], "admin" : [ "jwyune@mit.edu" ], "read" : [ "jwyune@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 344, "end" : "/div[1]/p[1]", "endOffset" : 350, "_id" : { "$oid" : "5125cfcae73d220200000005" } } ], "updated" : { "$date" : 1361432522482 }, "created" : { "$date" : 1361432522482 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125cff2e73d220200000006", "user" : "jwyune@mit.edu", "username" : "Jiwon Y.", "text" : "The vertical triangular piece of wall at the end of a ridged roof, from the level of the eaves to the summit", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "gables", "uuid" : "945FFD9D", "_id" : { "$oid" : "5125cff2e73d220200000006" }, "permissions" : { "delete" : [ "jwyune@mit.edu" ], "update" : [ "jwyune@mit.edu" ], "admin" : [ "jwyune@mit.edu" ], "read" : [ "jwyune@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 374, "end" : "/div[1]/p[1]", "endOffset" : 380, "_id" : { "$oid" : "5125cff2e73d220200000007" } } ], "updated" : { "$date" : 1361432562359 }, "created" : { "$date" : 1361432562359 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125d120e73d220200000008", "user" : "jwyune@mit.edu", "username" : "Jiwon Y.", "text" : "wheel + barrow\nOld English hweogol + Middle English barewe\nA barrow or shallow open box mounted between two shafts that receive the axle of a wheel at the front ends, the rear ends being shaped into handles and having legs on which it rests; also applied to similar contrivances with more than one wheel", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "wheelbarrows", "uuid" : "03F97F60", "_id" : { "$oid" : "5125d120e73d220200000008" }, "permissions" : { "delete" : [ "jwyune@mit.edu" ], "update" : [ "jwyune@mit.edu" ], "admin" : [ "jwyune@mit.edu" ], "read" : [ "jwyune@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 389, "end" : "/div[1]/p[1]", "endOffset" : 402, "_id" : { "$oid" : "5125d120e73d220200000009" } } ], "updated" : { "$date" : 1361432864387 }, "created" : { "$date" : 1361432864387 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125d15ce73d22020000000a", "user" : "jwyune@mit.edu", "username" : "Jiwon Y.", "text" : "classical Latin opācus\nLying in shadow; dark, dim, not illuminated", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "opaque", "uuid" : "B9AA7E7D", "_id" : { "$oid" : "5125d15ce73d22020000000a" }, "permissions" : { "delete" : [ "jwyune@mit.edu" ], "update" : [ "jwyune@mit.edu" ], "admin" : [ "jwyune@mit.edu" ], "read" : [ "jwyune@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 528, "end" : "/div[1]/p[1]", "endOffset" : 534, "_id" : { "$oid" : "5125d15ce73d22020000000b" } } ], "updated" : { "$date" : 1361432924679 }, "created" : { "$date" : 1361432924679 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125d188e73d22020000000c", "user" : "jwyune@mit.edu", "username" : "Jiwon Y.", "text" : "Middle Dutch mast\nAn upright pole or spar, usually raked, which is fixed or stepped in the keel of a sailing ship in order to support the sails, either directly or by means of horizontal spars. Also in extended use", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "masts", "uuid" : "0DD34CBC", "_id" : { "$oid" : "5125d188e73d22020000000c" }, "permissions" : { "delete" : [ "jwyune@mit.edu" ], "update" : [ "jwyune@mit.edu" ], "admin" : [ "jwyune@mit.edu" ], "read" : [ "jwyune@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 589, "end" : "/div[1]/p[1]", "endOffset" : 594, "_id" : { "$oid" : "5125d188e73d22020000000d" } } ], "updated" : { "$date" : 1361432968130 }, "created" : { "$date" : 1361432968130 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125d1a2e73d22020000000e", "user" : "jwyune@mit.edu", "username" : "Jiwon Y.", "text" : "The action or fact of shining through", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "translucence", "uuid" : "9B4BE8AD", "_id" : { "$oid" : "5125d1a2e73d22020000000e" }, "permissions" : { "delete" : [ "jwyune@mit.edu" ], "update" : [ "jwyune@mit.edu" ], "admin" : [ "jwyune@mit.edu" ], "read" : [ "jwyune@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 653, "end" : "/div[1]/p[1]", "endOffset" : 665, "_id" : { "$oid" : "5125d1a2e73d22020000000f" } } ], "updated" : { "$date" : 1361432994470 }, "created" : { "$date" : 1361432994470 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125d1eece3b72020000000a", "user" : "jwyune@mit.edu", "username" : "Jiwon Y.", "text" : "Latin īrid + escent\ndisplaying colours like those of the rainbow, or those reflected from soap-bubbles and the like; glittering or flashing with colours which change according to the position from which they are viewed", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "iridescent", "uuid" : "0981F332", "_id" : { "$oid" : "5125d1eece3b72020000000a" }, "permissions" : { "delete" : [ "jwyune@mit.edu" ], "update" : [ "jwyune@mit.edu" ], "admin" : [ "jwyune@mit.edu" ], "read" : [ "jwyune@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 886, "end" : "/div[1]/p[1]", "endOffset" : 897, "_id" : { "$oid" : "5125d1eece3b72020000000b" } } ], "updated" : { "$date" : 1361433070003 }, "created" : { "$date" : 1361433070003 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125d229ce3b72020000000c", "user" : "jwyune@mit.edu", "username" : "Jiwon Y.", "text" : "French cabestan\nA piece of mechanism, working on the principle of the wheel and axle, on a vertical axis, the power being applied by movable bars or levers inserted in horizontal sockets made round the top, and pushed by men walking round, whereby the apparatus is made to revolve and wind up a cable round its cylinder or barrel; it is used especially on board ship for weighing the anchor, also for hoisting heavy sails, etc., and for raising weights out of quarries, mines, coal-pits, and the like", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "capstan", "uuid" : "116F8F30", "_id" : { "$oid" : "5125d229ce3b72020000000c" }, "permissions" : { "delete" : [ "jwyune@mit.edu" ], "update" : [ "jwyune@mit.edu" ], "admin" : [ "jwyune@mit.edu" ], "read" : [ "jwyune@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1065, "end" : "/div[1]/p[1]", "endOffset" : 1072, "_id" : { "$oid" : "5125d229ce3b72020000000d" } } ], "updated" : { "$date" : 1361433129030 }, "created" : { "$date" : 1361433129030 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125d252e73d220200000010", "user" : "jwyune@mit.edu", "username" : "Jiwon Y.", "text" : "Anglo-Norman malencolie\nIll temper, sullenness, brooding, anger", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "melancholy", "uuid" : "705F0E1C", "_id" : { "$oid" : "5125d252e73d220200000010" }, "permissions" : { "delete" : [ "jwyune@mit.edu" ], "update" : [ "jwyune@mit.edu" ], "admin" : [ "jwyune@mit.edu" ], "read" : [ "jwyune@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1123, "end" : "/div[1]/p[1]", "endOffset" : 1134, "_id" : { "$oid" : "5125d252e73d220200000011" } } ], "updated" : { "$date" : 1361433170001 }, "created" : { "$date" : 1361433170001 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125d28ce73d220200000012", "user" : "jwyune@mit.edu", "username" : "Jiwon Y.", "text" : "Hist. An Italian gold coin (originally Venetian); for its value. 1788. Also used as a name for a former Turkish coin, the sultanin", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "sequins", "uuid" : "C62B108E", "_id" : { "$oid" : "5125d28ce73d220200000012" }, "permissions" : { "delete" : [ "jwyune@mit.edu" ], "update" : [ "jwyune@mit.edu" ], "admin" : [ "jwyune@mit.edu" ], "read" : [ "jwyune@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1386, "end" : "/div[1]/p[1]", "endOffset" : 1394, "_id" : { "$oid" : "5125d28ce73d220200000013" } } ], "updated" : { "$date" : 1361433228695 }, "created" : { "$date" : 1361433228695 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125d2bfce3b72020000000e", "user" : "jwyune@mit.edu", "username" : "Jiwon Y.", "text" : "to pull or draw with force or violence; to drag, tug", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "haul", "uuid" : "90BFE07A", "_id" : { "$oid" : "5125d2bfce3b72020000000e" }, "permissions" : { "delete" : [ "jwyune@mit.edu" ], "update" : [ "jwyune@mit.edu" ], "admin" : [ "jwyune@mit.edu" ], "read" : [ "jwyune@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1612, "end" : "/div[1]/p[1]", "endOffset" : 1617, "_id" : { "$oid" : "5125d2bfce3b72020000000f" } } ], "updated" : { "$date" : 1361433279192 }, "created" : { "$date" : 1361433279192 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125d2f2ce3b720200000010", "user" : "jwyune@mit.edu", "username" : "Jiwon Y.", "text" : " late Latin immersiōn\ndipping or plunging into water or other liquid", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "immersion", "uuid" : "1956344E", "_id" : { "$oid" : "5125d2f2ce3b720200000010" }, "permissions" : { "delete" : [ "jwyune@mit.edu" ], "update" : [ "jwyune@mit.edu" ], "admin" : [ "jwyune@mit.edu" ], "read" : [ "jwyune@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2033, "end" : "/div[1]/p[1]", "endOffset" : 2042, "_id" : { "$oid" : "5125d2f2ce3b720200000011" } } ], "updated" : { "$date" : 1361433330549 }, "created" : { "$date" : 1361433330549 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125d317ce3b720200000012", "user" : "jwyune@mit.edu", "username" : "Jiwon Y.", "text" : "blue + ish", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Bluish", "uuid" : "9887719C", "_id" : { "$oid" : "5125d317ce3b720200000012" }, "permissions" : { "delete" : [ "jwyune@mit.edu" ], "update" : [ "jwyune@mit.edu" ], "admin" : [ "jwyune@mit.edu" ], "read" : [ "jwyune@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2453, "end" : "/div[1]/p[1]", "endOffset" : 2459, "_id" : { "$oid" : "5125d317ce3b720200000013" } } ], "updated" : { "$date" : 1361433367074 }, "created" : { "$date" : 1361433367074 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5125d341ce3b720200000014", "user" : "jwyune@mit.edu", "username" : "Jiwon Y.", "text" : "late Latin transmūtātiōn-em\nchange of condition; mutation; sometimes implying alternation or exchange", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "transmutation", "uuid" : "2B81360B", "_id" : { "$oid" : "5125d341ce3b720200000014" }, "permissions" : { "delete" : [ "jwyune@mit.edu" ], "update" : [ "jwyune@mit.edu" ], "admin" : [ "jwyune@mit.edu" ], "read" : [ "jwyune@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2936, "end" : "/div[1]/p[1]", "endOffset" : 2950, "_id" : { "$oid" : "5125d341ce3b720200000015" } } ], "updated" : { "$date" : 1361433409456 }, "created" : { "$date" : 1361433409456 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5126261fe73d220200000014", "user" : "jvagts@mit.edu", "username" : "Joshua V.", "text" : "alliteration", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "dark deep", "uuid" : "26E2B791", "_id" : { "$oid" : "5126261fe73d220200000014" }, "permissions" : { "delete" : [ "jvagts@mit.edu" ], "update" : [ "jvagts@mit.edu" ], "admin" : [ "jvagts@mit.edu" ], "read" : [ "jvagts@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1800, "end" : "/div[1]/p[1]", "endOffset" : 1809, "_id" : { "$oid" : "5126261fe73d220200000015" } } ], "updated" : { "$date" : 1361454623276 }, "created" : { "$date" : 1361454623276 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51262647e73d220200000018", "user" : "jvagts@mit.edu", "username" : "Joshua V.", "text" : "a lot of adjectives", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Cold dark deep and absolutely clear", "uuid" : "5C488C99", "_id" : { "$oid" : "51262647e73d220200000018" }, "permissions" : { "delete" : [ "jvagts@mit.edu" ], "update" : [ "jvagts@mit.edu" ], "admin" : [ "jvagts@mit.edu" ], "read" : [ "jvagts@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1795, "end" : "/div[1]/p[1]", "endOffset" : 1830, "_id" : { "$oid" : "51262647e73d220200000019" } } ], "updated" : { "$date" : 1361454663460 }, "created" : { "$date" : 1361454663460 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 1, "_id" : { "$oid" : "51262698e73d22020000001a" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361454744697 }, "id" : "51262698e73d22020000001a", "permissions" : { "delete" : [ "jvagts@mit.edu" ], "update" : [ "jvagts@mit.edu" ], "admin" : [ "jvagts@mit.edu" ], "read" : [ "jvagts@mit.edu" ] }, "quote" : ",", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1830, "end" : "/div[1]/p[1]", "endOffset" : 1831, "_id" : { "$oid" : "51262698e73d22020000001b" } } ], "tags" : [ "pausing" ], "text" : "there is a lot of pausing in the rhythm, almost after every line and sometimes in the middle. it makes for a pretty irregular poem. ", "updated" : { "$date" : 1361454761033 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "jvagts@mit.edu", "username" : "Joshua V.", "uuid" : "C8BBABA2" } -{ "id" : "512626f2e73d22020000001c", "user" : "jvagts@mit.edu", "username" : "Joshua V.", "text" : "the poem is full of lost concentration and losing focus and this is the longest he talks about one this in particular. ", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "I have seen here evening after evening.\nHe was curious about me. He was interested in music;\nlike me a believer in total immersion,\nso I used to sing him Baptist hymns.\nI also sang “A Mighty Fortress Is Our God.”\nHe stood up in the water and regarded me\nsteadily, moving his head a little.\nThen he would disappear, then suddenly emerge\nalmost in the same spot, with a sort of shrug\nas if it were against his better judgment.", "uuid" : "E7017C4A", "_id" : { "$oid" : "512626f2e73d22020000001c" }, "permissions" : { "delete" : [ "jvagts@mit.edu" ], "update" : [ "jvagts@mit.edu" ], "admin" : [ "jvagts@mit.edu" ], "read" : [ "jvagts@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1912, "end" : "/div[1]/p[1]", "endOffset" : 2336, "_id" : { "$oid" : "512626f2e73d22020000001d" } } ], "updated" : { "$date" : 1361454878840 }, "created" : { "$date" : 1361454834039 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51262762ce3b720200000016", "user" : "jvagts@mit.edu", "username" : "Joshua V.", "text" : "instead of a believer like me, it is like me a believer. And there is no punctuation between like me and a believer so it rolls off the tongue a little more easier. ", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "like me a believer", "uuid" : "DBEEC27E", "_id" : { "$oid" : "51262762ce3b720200000016" }, "permissions" : { "delete" : [ "jvagts@mit.edu" ], "update" : [ "jvagts@mit.edu" ], "admin" : [ "jvagts@mit.edu" ], "read" : [ "jvagts@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2005, "end" : "/div[1]/p[1]", "endOffset" : 2024, "_id" : { "$oid" : "51262762ce3b720200000017" } } ], "updated" : { "$date" : 1361454946659 }, "created" : { "$date" : 1361454946659 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5126276ce73d22020000001e", "user" : "jvagts@mit.edu", "username" : "Joshua V.", "text" : "Repetition", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Cold dark deep and absolutely clear,", "uuid" : "226344B9", "_id" : { "$oid" : "5126276ce73d22020000001e" }, "permissions" : { "delete" : [ "jvagts@mit.edu" ], "update" : [ "jvagts@mit.edu" ], "admin" : [ "jvagts@mit.edu" ], "read" : [ "jvagts@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2337, "end" : "/div[1]/p[1]", "endOffset" : 2373, "_id" : { "$oid" : "5126276ce73d22020000001f" } } ], "updated" : { "$date" : 1361454956663 }, "created" : { "$date" : 1361454956663 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512627e6ce3b720200000018", "user" : "jvagts@mit.edu", "username" : "Joshua V.", "text" : "this phrase seems to signify a shift in focus from the water and the seal to the trees behind the speaker at the edge of the fishing village. Also, between the shift there is a quick reminder of the sea as though the speaker can not stop thinking about it. ", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Cold dark deep", "uuid" : "2DA52070", "_id" : { "$oid" : "512627e6ce3b720200000018" }, "permissions" : { "delete" : [ "jvagts@mit.edu" ], "update" : [ "jvagts@mit.edu" ], "admin" : [ "jvagts@mit.edu" ], "read" : [ "jvagts@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2337, "end" : "/div[1]/p[1]", "endOffset" : 2351, "_id" : { "$oid" : "512627e6ce3b720200000019" } } ], "updated" : { "$date" : 1361455078381 }, "created" : { "$date" : 1361455078381 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "51262a9fce3b72020000001a" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361455775567 }, "id" : "51262a9fce3b72020000001a", "permissions" : { "delete" : [ "jvagts@mit.edu" ], "update" : [ "jvagts@mit.edu" ], "admin" : [ "jvagts@mit.edu" ], "read" : [ "jvagts@mit.edu" ] }, "quote" : "up the long ramp\ndescending", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1631, "end" : "/div[1]/p[1]", "endOffset" : 1658, "_id" : { "$oid" : "51262a9fce3b72020000001b" } } ], "tags" : [], "text" : "kind of a juxtaposition. It just sounded a bit weird to me. up and then descending", "updated" : { "$date" : 1361455795159 }, "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "user" : "jvagts@mit.edu", "username" : "Joshua V.", "uuid" : "62377494" } -{ "id" : "51262ce5e73d220200000020", "user" : "jvagts@mit.edu", "username" : "Joshua V.", "text" : "there are a lot of adjectives and pauses which make this long sentence even more complex ", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Down at the water’s edge, at the place\nwhere they haul up the boats, up the long ramp\ndescending into the water, thin silver\ntree trunks are laid horizontally\nacross the gray stones, down and down\nat intervals of four or five feet.", "uuid" : "605A05AD", "_id" : { "$oid" : "51262ce5e73d220200000020" }, "permissions" : { "delete" : [ "jvagts@mit.edu" ], "update" : [ "jvagts@mit.edu" ], "admin" : [ "jvagts@mit.edu" ], "read" : [ "jvagts@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1562, "end" : "/div[1]/p[1]", "endOffset" : 1793, "_id" : { "$oid" : "51262ce5e73d220200000021" } } ], "updated" : { "$date" : 1361456357881 }, "created" : { "$date" : 1361456357881 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51262d00ce3b72020000001c", "user" : "jvagts@mit.edu", "username" : "Joshua V.", "text" : "why are the trees silver? from the gray water?", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "thin silver\ntree trunks", "uuid" : "DBEBC2A3", "_id" : { "$oid" : "51262d00ce3b72020000001c" }, "permissions" : { "delete" : [ "jvagts@mit.edu" ], "update" : [ "jvagts@mit.edu" ], "admin" : [ "jvagts@mit.edu" ], "read" : [ "jvagts@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1675, "end" : "/div[1]/p[1]", "endOffset" : 1698, "_id" : { "$oid" : "51262d00ce3b72020000001d" } } ], "updated" : { "$date" : 1361456393627 }, "created" : { "$date" : 1361456384899 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51262d91e73d220200000022", "user" : "adnicker@mit.edu", "username" : "Andrea N.", "text" : "Simile here", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "like the small old buildings", "uuid" : "E86BC98D", "_id" : { "$oid" : "51262d91e73d220200000022" }, "permissions" : { "delete" : [ "adnicker@mit.edu" ], "update" : [ "adnicker@mit.edu" ], "admin" : [ "adnicker@mit.edu" ], "read" : [ "adnicker@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 666, "end" : "/div[1]/p[1]", "endOffset" : 694, "_id" : { "$oid" : "51262d91e73d220200000023" } } ], "updated" : { "$date" : 1361456529507 }, "created" : { "$date" : 1361456529507 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51262ee8e73d220200000024", "user" : "jvagts@mit.edu", "username" : "Joshua V.", "text" : "this uncertainty seems out of place in a poem that is full of exact descriptions. I expected her to break out her ruler and go measure the exact distance", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "four or five", "uuid" : "6A93E07F", "_id" : { "$oid" : "51262ee8e73d220200000024" }, "permissions" : { "delete" : [ "jvagts@mit.edu" ], "update" : [ "jvagts@mit.edu" ], "admin" : [ "jvagts@mit.edu" ], "read" : [ "jvagts@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1775, "end" : "/div[1]/p[1]", "endOffset" : 1787, "_id" : { "$oid" : "51262ee8e73d220200000025" } } ], "updated" : { "$date" : 1361456872143 }, "created" : { "$date" : 1361456872143 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51263246ce3b72020000001e", "user" : "mphox@mit.edu", "username" : "Michael P.", "text" : "There's no rhyming scheeme or a well defined rhythmic pattern but each of these lines has 4-5 stressed syllables in it", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Down at the water’s edge, at the place\nwhere they haul up the boats, up the long ramp\ndescending into the water, thin silver\ntree trunks are laid horizontally\nacross the gray stones, down and down\nat intervals of four or five feet.", "uuid" : "7996D3A7", "_id" : { "$oid" : "51263246ce3b72020000001e" }, "permissions" : { "delete" : [ "mphox@mit.edu" ], "update" : [ "mphox@mit.edu" ], "admin" : [ "mphox@mit.edu" ], "read" : [ "mphox@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1562, "end" : "/div[1]/p[1]", "endOffset" : 1793, "_id" : { "$oid" : "51263246ce3b72020000001f" } } ], "updated" : { "$date" : 1361457734905 }, "created" : { "$date" : 1361457734905 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51263262ce3b720200000020", "user" : "mphox@mit.edu", "username" : "Michael P.", "text" : "down is repeated for additional emphasis", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "down and down", "uuid" : "5D05B3BE", "_id" : { "$oid" : "51263262ce3b720200000020" }, "permissions" : { "delete" : [ "mphox@mit.edu" ], "update" : [ "mphox@mit.edu" ], "admin" : [ "mphox@mit.edu" ], "read" : [ "mphox@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1745, "end" : "/div[1]/p[1]", "endOffset" : 1758, "_id" : { "$oid" : "51263262ce3b720200000021" } } ], "updated" : { "$date" : 1361457762690 }, "created" : { "$date" : 1361457762690 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5126326ece3b720200000022", "user" : "jvagts@mit.edu", "username" : "Joshua V.", "text" : "emphasis on the second to because it would otherwise be written as to fish and seals. This second to makes the poem sound pretty formal", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "to", "uuid" : "D0CB7411", "_id" : { "$oid" : "5126326ece3b720200000022" }, "permissions" : { "delete" : [ "jvagts@mit.edu" ], "update" : [ "jvagts@mit.edu" ], "admin" : [ "jvagts@mit.edu" ], "read" : [ "jvagts@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1875, "end" : "/div[1]/p[1]", "endOffset" : 1877, "_id" : { "$oid" : "5126326ece3b720200000023" } } ], "updated" : { "$date" : 1361457774052 }, "created" : { "$date" : 1361457774052 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5126328cce3b720200000024", "user" : "mphox@mit.edu", "username" : "Michael P.", "text" : "This is an instance of alliteration based around the letter \"f\"", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "of four or five feet.", "uuid" : "88A4554B", "_id" : { "$oid" : "5126328cce3b720200000024" }, "permissions" : { "delete" : [ "mphox@mit.edu" ], "update" : [ "mphox@mit.edu" ], "admin" : [ "mphox@mit.edu" ], "read" : [ "mphox@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1772, "end" : "/div[1]/p[1]", "endOffset" : 1793, "_id" : { "$oid" : "5126328cce3b720200000025" } } ], "updated" : { "$date" : 1361457804881 }, "created" : { "$date" : 1361457804881 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5126332fce3b720200000026", "user" : "mphox@mit.edu", "username" : "Michael P.", "text" : "two examples of alliteration in this line, it starts and ends with a hard \"c,\" the second and third words start with \"d,\" and the fourth and fifth words start with \"a\"", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Cold dark deep and absolutely clear", "uuid" : "93D304DD", "_id" : { "$oid" : "5126332fce3b720200000026" }, "permissions" : { "delete" : [ "mphox@mit.edu" ], "update" : [ "mphox@mit.edu" ], "admin" : [ "mphox@mit.edu" ], "read" : [ "mphox@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1795, "end" : "/div[1]/p[1]", "endOffset" : 1830, "_id" : { "$oid" : "5126332fce3b720200000027" } } ], "updated" : { "$date" : 1361457967566 }, "created" : { "$date" : 1361457967566 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "512633f7ce3b720200000028", "user" : "mphox@mit.edu", "username" : "Michael P.", "text" : "\"evening\" is repeated to emphasize the passage of time", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "evening after evening", "uuid" : "DCC51F93", "_id" : { "$oid" : "512633f7ce3b720200000028" }, "permissions" : { "delete" : [ "mphox@mit.edu" ], "update" : [ "mphox@mit.edu" ], "admin" : [ "mphox@mit.edu" ], "read" : [ "mphox@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1929, "end" : "/div[1]/p[1]", "endOffset" : 1950, "_id" : { "$oid" : "512633f7ce3b720200000029" } } ], "updated" : { "$date" : 1361458167162 }, "created" : { "$date" : 1361458167162 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51263468e73d220200000026", "user" : "mphox@mit.edu", "username" : "Michael P.", "text" : "This line is repeated again, the line with alliteration is repeated again to bring the image back to the front of the reader's mind", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Cold dark deep and absolutely clear,", "uuid" : "A3240B16", "_id" : { "$oid" : "51263468e73d220200000026" }, "permissions" : { "delete" : [ "mphox@mit.edu" ], "update" : [ "mphox@mit.edu" ], "admin" : [ "mphox@mit.edu" ], "read" : [ "mphox@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2337, "end" : "/div[1]/p[1]", "endOffset" : 2373, "_id" : { "$oid" : "51263468e73d220200000027" } } ], "updated" : { "$date" : 1361458280409 }, "created" : { "$date" : 1361458280409 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51263485ce3b72020000002a", "user" : "mphox@mit.edu", "username" : "Michael P.", "text" : "This line contains alliteration based around \"b\"", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Back, behind", "uuid" : "110AF193", "_id" : { "$oid" : "51263485ce3b72020000002a" }, "permissions" : { "delete" : [ "mphox@mit.edu" ], "update" : [ "mphox@mit.edu" ], "admin" : [ "mphox@mit.edu" ], "read" : [ "mphox@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 2405, "end" : "/div[1]/p[1]", "endOffset" : 2417, "_id" : { "$oid" : "51263485ce3b72020000002b" } } ], "updated" : { "$date" : 1361458309758 }, "created" : { "$date" : 1361458309758 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51263869e73d220200000028", "user" : "jvagts@mit.edu", "username" : "Joshua V.", "text" : "cold dark deep seems to contradict absolutely clear", "uri" : "http://annotationstudio.mit.edu/documents/at-the-fishhouses", "quote" : "Cold dark deep and absolutely clear", "uuid" : "62F0133F", "_id" : { "$oid" : "51263869e73d220200000028" }, "permissions" : { "delete" : [ "jvagts@mit.edu" ], "update" : [ "jvagts@mit.edu" ], "admin" : [ "jvagts@mit.edu" ], "read" : [ "jvagts@mit.edu" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1795, "end" : "/div[1]/p[1]", "endOffset" : 1830, "_id" : { "$oid" : "51263869e73d220200000029" } } ], "updated" : { "$date" : 1361459305353 }, "created" : { "$date" : 1361459305353 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5126554d095597331d000002" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361466701602 }, "id" : "5126554d095597331d000002", "permissions" : { "delete" : [ "jfolsom@mit.edu" ], "update" : [ "jfolsom@mit.edu" ], "admin" : [ "jfolsom@mit.edu" ], "read" : [] }, "quote" : "Ishmael. Some years ago — never mind how long precisely — having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world. It is a way I have of driving", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 8, "end" : "/div[1]/p[1]", "endOffset" : 258, "_id" : { "$oid" : "5126554d095597331d000003" } } ], "tags" : [], "text" : "", "updated" : { "$date" : 1361466723209 }, "uri" : "http://localhost:3000/documents/moby-dick", "user" : "jfolsom@mit.edu", "username" : "Jamie F.", "uuid" : "3035C124" } -{ "id" : "512655a5095597331d000004", "user" : "jamiefolsom@gmail.com", "username" : "Jamie F.", "text" : "", "uri" : "http://localhost:3000/documents/a-study-in-scarlet", "quote" : "conformant markup", "uuid" : "67CD035B", "_id" : { "$oid" : "512655a5095597331d000004" }, "permissions" : { "delete" : [ "jamiefolsom@gmail.com" ], "update" : [ "jamiefolsom@gmail.com" ], "admin" : [ "jamiefolsom@gmail.com" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]", "startOffset" : 189, "end" : "/div[1]", "endOffset" : 206, "_id" : { "$oid" : "512655a5095597331d000005" } } ], "updated" : { "$date" : 1361466789841 }, "created" : { "$date" : 1361466789841 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5126942a095597331d000006", "user" : "jamiefolsom@gmail.com", "username" : "Jamie F.", "text" : "", "uri" : "http://localhost:3000/documents/moby-dick", "quote" : "Call me Ishmael", "uuid" : "CF4F1A1D", "_id" : { "$oid" : "5126942a095597331d000006" }, "permissions" : { "delete" : [ "jamiefolsom@gmail.com" ], "update" : [ "jamiefolsom@gmail.com" ], "admin" : [ "jamiefolsom@gmail.com" ], "read" : [ "jamiefolsom@gmail.com" ] }, "tags" : [ "THIS" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 0, "end" : "/div[1]/p[1]", "endOffset" : 15, "_id" : { "$oid" : "5126942a095597331d000007" } } ], "updated" : { "$date" : 1361482794736 }, "created" : { "$date" : 1361482794736 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51269438095597331d000008", "user" : "jamiefolsom@gmail.com", "username" : "Jamie F.", "text" : "THAT", "uri" : "http://localhost:3000/documents/moby-dick", "quote" : "Cato throws", "uuid" : "D1ED9040", "_id" : { "$oid" : "51269438095597331d000008" }, "permissions" : { "delete" : [ "jamiefolsom@gmail.com" ], "update" : [ "jamiefolsom@gmail.com" ], "admin" : [ "jamiefolsom@gmail.com" ], "read" : [ "jamiefolsom@gmail.com" ] }, "tags" : [ "that" ], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 875, "end" : "/div[1]/p[1]", "endOffset" : 886, "_id" : { "$oid" : "51269438095597331d000009" } } ], "updated" : { "$date" : 1361482808566 }, "created" : { "$date" : 1361482808566 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "51269b6f095597331d00000a", "user" : "jamiefolsom@gmail.com", "username" : "Jamie F.", "text" : "", "uri" : "http://localhost:3000/documents/moby-dick", "quote" : "whenever I find myself involuntarily pausing before coffin warehouses, and bringing up the rear of every funeral I meet; and especially whenever my hypos get such an upper", "uuid" : "0A3BFE0F", "_id" : { "$oid" : "51269b6f095597331d00000a" }, "permissions" : { "delete" : [ "jamiefolsom@gmail.com" ], "update" : [ "jamiefolsom@gmail.com" ], "admin" : [ "jamiefolsom@gmail.com" ], "read" : [] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 411, "end" : "/div[1]/p[1]", "endOffset" : 582, "_id" : { "$oid" : "51269b6f095597331d00000b" } } ], "updated" : { "$date" : 1361484655686 }, "created" : { "$date" : 1361484655686 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "id" : "5126a945095597331d00000c", "user" : "jamiefolsom@gmail.com", "username" : "Jamie F.", "text" : "", "uri" : "http://localhost:3000/documents/moby-dick", "quote" : "towards the", "uuid" : "76A68A19", "_id" : { "$oid" : "5126a945095597331d00000c" }, "permissions" : { "delete" : [ "jamiefolsom@gmail.com" ], "update" : [ "jamiefolsom@gmail.com" ], "admin" : [ "jamiefolsom@gmail.com" ], "read" : [ "jamiefolsom@gmail.com" ] }, "tags" : [], "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 1087, "end" : "/div[1]/p[1]", "endOffset" : 1098, "_id" : { "$oid" : "5126a945095597331d00000d" } } ], "groups" : [ "demo", "2013" ], "updated" : { "$date" : 1361488215737 }, "created" : { "$date" : 1361488197960 }, "consumer" : "annotationstudio.mit.edu", "__v" : 0 } -{ "__v" : 0, "_id" : { "$oid" : "5126ab28095597331d00000e" }, "consumer" : "annotationstudio.mit.edu", "created" : { "$date" : 1361488680602 }, "groups" : [ "demo", "2013" ], "id" : "5126ab28095597331d00000e", "permissions" : { "delete" : [ "jamiefolsom@gmail.com" ], "update" : [ "jamiefolsom@gmail.com" ], "admin" : [ "jamiefolsom@gmail.com" ], "read" : [] }, "quote" : "driving", "ranges" : [ { "start" : "/div[1]/p[1]", "startOffset" : 251, "end" : "/div[1]/p[1]", "endOffset" : 258, "_id" : { "$oid" : "5126ab28095597331d00000f" } } ], "tags" : [], "text" : "", "updated" : { "$date" : 1361488735398 }, "uri" : "http://localhost:3000/documents/moby-dick", "user" : "jamiefolsom@gmail.com", "username" : "Jamie F.", "uuid" : "FF4A9A73" } diff --git a/node_modules/.bin/express b/node_modules/.bin/express deleted file mode 120000 index b741d99..0000000 --- a/node_modules/.bin/express +++ /dev/null @@ -1 +0,0 @@ -../express/bin/express \ No newline at end of file diff --git a/node_modules/cors/cors.js b/node_modules/cors/cors.js deleted file mode 100644 index 7701b0f..0000000 --- a/node_modules/cors/cors.js +++ /dev/null @@ -1,21 +0,0 @@ -// NOTE: Not in use. - -app.use(express.methodOverride()); - -// ## CORS middleware -// -// see: http://stackoverflow.com/questions/7067966/how-to-allow-cors-in-express-nodejs -var allowCrossDomain = function(req, res, next) { - res.header('Access-Control-Allow-Origin', '*'); - res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); - res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization'); - - // intercept OPTIONS method - if ('OPTIONS' == req.method) { - res.send(200); - } - else { - next(); - } -}; -app.use(allowCrossDomain); \ No newline at end of file diff --git a/node_modules/express/.npmignore b/node_modules/express/.npmignore deleted file mode 100644 index caf574d..0000000 --- a/node_modules/express/.npmignore +++ /dev/null @@ -1,9 +0,0 @@ -.git* -docs/ -examples/ -support/ -test/ -testing.js -.DS_Store -coverage.html -lib-cov diff --git a/node_modules/express/.travis.yml b/node_modules/express/.travis.yml deleted file mode 100644 index 895dbd3..0000000 --- a/node_modules/express/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.6 - - 0.8 diff --git a/node_modules/express/History.md b/node_modules/express/History.md deleted file mode 100644 index 1a2b171..0000000 --- a/node_modules/express/History.md +++ /dev/null @@ -1,1091 +0,0 @@ - -3.1.0 / 2013-01-25 -================== - - * add support for leading "." in "view engine" setting - * add array support to `res.set()` - * add node 0.8.x to travis.yml - * add "subdomain offset" setting for tweaking `req.subdomains` - * add `res.location(url)` implementing `res.redirect()`-like setting of Location - * use app.get() for x-powered-by setting for inheritance - * fix colons in passwords for `req.auth` - -3.0.6 / 2013-01-04 -================== - - * add http verb methods to Router - * update connect - * fix mangling of the `res.cookie()` options object - * fix jsonp whitespace escape. Closes #1132 - -3.0.5 / 2012-12-19 -================== - - * add throwing when a non-function is passed to a route - * fix: explicitly remove Transfer-Encoding header from 204 and 304 responses - * revert "add 'etag' option" - -3.0.4 / 2012-12-05 -================== - - * add 'etag' option to disable `res.send()` Etags - * add escaping of urls in text/plain in `res.redirect()` - for old browsers interpreting as html - * change crc32 module for a more liberal license - * update connect - -3.0.3 / 2012-11-13 -================== - - * update connect - * update cookie module - * fix cookie max-age - -3.0.2 / 2012-11-08 -================== - - * add OPTIONS to cors example. Closes #1398 - * fix route chaining regression. Closes #1397 - -3.0.1 / 2012-11-01 -================== - - * update connect - -3.0.0 / 2012-10-23 -================== - - * add `make clean` - * add "Basic" check to req.auth - * add `req.auth` test coverage - * add cb && cb(payload) to `res.jsonp()`. Closes #1374 - * add backwards compat for `res.redirect()` status. Closes #1336 - * add support for `res.json()` to retain previously defined Content-Types. Closes #1349 - * update connect - * change `res.redirect()` to utilize a pathname-relative Location again. Closes #1382 - * remove non-primitive string support for `res.send()` - * fix view-locals example. Closes #1370 - * fix route-separation example - -3.0.0rc5 / 2012-09-18 -================== - - * update connect - * add redis search example - * add static-files example - * add "x-powered-by" setting (`app.disable('x-powered-by')`) - * add "application/octet-stream" redirect Accept test case. Closes #1317 - -3.0.0rc4 / 2012-08-30 -================== - - * add `res.jsonp()`. Closes #1307 - * add "verbose errors" option to error-pages example - * add another route example to express(1) so people are not so confused - * add redis online user activity tracking example - * update connect dep - * fix etag quoting. Closes #1310 - * fix error-pages 404 status - * fix jsonp callback char restrictions - * remove old OPTIONS default response - -3.0.0rc3 / 2012-08-13 -================== - - * update connect dep - * fix signed cookies to work with `connect.cookieParser()` ("s:" prefix was missing) [tnydwrds] - * fix `res.render()` clobbering of "locals" - -3.0.0rc2 / 2012-08-03 -================== - - * add CORS example - * update connect dep - * deprecate `.createServer()` & remove old stale examples - * fix: escape `res.redirect()` link - * fix vhost example - -3.0.0rc1 / 2012-07-24 -================== - - * add more examples to view-locals - * add scheme-relative redirects (`res.redirect("//foo.com")`) support - * update cookie dep - * update connect dep - * update send dep - * fix `express(1)` -h flag, use -H for hogan. Closes #1245 - * fix `res.sendfile()` socket error handling regression - -3.0.0beta7 / 2012-07-16 -================== - - * update connect dep for `send()` root normalization regression - -3.0.0beta6 / 2012-07-13 -================== - - * add `err.view` property for view errors. Closes #1226 - * add "jsonp callback name" setting - * add support for "/foo/:bar*" non-greedy matches - * change `res.sendfile()` to use `send()` module - * change `res.send` to use "response-send" module - * remove `app.locals.use` and `res.locals.use`, use regular middleware - -3.0.0beta5 / 2012-07-03 -================== - - * add "make check" support - * add route-map example - * add `res.json(obj, status)` support back for BC - * add "methods" dep, remove internal methods module - * update connect dep - * update auth example to utilize cores pbkdf2 - * updated tests to use "supertest" - -3.0.0beta4 / 2012-06-25 -================== - - * Added `req.auth` - * Added `req.range(size)` - * Added `res.links(obj)` - * Added `res.send(body, status)` support back for backwards compat - * Added `.default()` support to `res.format()` - * Added 2xx / 304 check to `req.fresh` - * Revert "Added + support to the router" - * Fixed `res.send()` freshness check, respect res.statusCode - -3.0.0beta3 / 2012-06-15 -================== - - * Added hogan `--hjs` to express(1) [nullfirm] - * Added another example to content-negotiation - * Added `fresh` dep - * Changed: `res.send()` always checks freshness - * Fixed: expose connects mime module. Cloases #1165 - -3.0.0beta2 / 2012-06-06 -================== - - * Added `+` support to the router - * Added `req.host` - * Changed `req.param()` to check route first - * Update connect dep - -3.0.0beta1 / 2012-06-01 -================== - - * Added `res.format()` callback to override default 406 behaviour - * Fixed `res.redirect()` 406. Closes #1154 - -3.0.0alpha5 / 2012-05-30 -================== - - * Added `req.ip` - * Added `{ signed: true }` option to `res.cookie()` - * Removed `res.signedCookie()` - * Changed: dont reverse `req.ips` - * Fixed "trust proxy" setting check for `req.ips` - -3.0.0alpha4 / 2012-05-09 -================== - - * Added: allow `[]` in jsonp callback. Closes #1128 - * Added `PORT` env var support in generated template. Closes #1118 [benatkin] - * Updated: connect 2.2.2 - -3.0.0alpha3 / 2012-05-04 -================== - - * Added public `app.routes`. Closes #887 - * Added _view-locals_ example - * Added _mvc_ example - * Added `res.locals.use()`. Closes #1120 - * Added conditional-GET support to `res.send()` - * Added: coerce `res.set()` values to strings - * Changed: moved `static()` in generated apps below router - * Changed: `res.send()` only set ETag when not previously set - * Changed connect 2.2.1 dep - * Changed: `make test` now runs unit / acceptance tests - * Fixed req/res proto inheritance - -3.0.0alpha2 / 2012-04-26 -================== - - * Added `make benchmark` back - * Added `res.send()` support for `String` objects - * Added client-side data exposing example - * Added `res.header()` and `req.header()` aliases for BC - * Added `express.createServer()` for BC - * Perf: memoize parsed urls - * Perf: connect 2.2.0 dep - * Changed: make `expressInit()` middleware self-aware - * Fixed: use app.get() for all core settings - * Fixed redis session example - * Fixed session example. Closes #1105 - * Fixed generated express dep. Closes #1078 - -3.0.0alpha1 / 2012-04-15 -================== - - * Added `app.locals.use(callback)` - * Added `app.locals` object - * Added `app.locals(obj)` - * Added `res.locals` object - * Added `res.locals(obj)` - * Added `res.format()` for content-negotiation - * Added `app.engine()` - * Added `res.cookie()` JSON cookie support - * Added "trust proxy" setting - * Added `req.subdomains` - * Added `req.protocol` - * Added `req.secure` - * Added `req.path` - * Added `req.ips` - * Added `req.fresh` - * Added `req.stale` - * Added comma-delmited / array support for `req.accepts()` - * Added debug instrumentation - * Added `res.set(obj)` - * Added `res.set(field, value)` - * Added `res.get(field)` - * Added `app.get(setting)`. Closes #842 - * Added `req.acceptsLanguage()` - * Added `req.acceptsCharset()` - * Added `req.accepted` - * Added `req.acceptedLanguages` - * Added `req.acceptedCharsets` - * Added "json replacer" setting - * Added "json spaces" setting - * Added X-Forwarded-Proto support to `res.redirect()`. Closes #92 - * Added `--less` support to express(1) - * Added `express.response` prototype - * Added `express.request` prototype - * Added `express.application` prototype - * Added `app.path()` - * Added `app.render()` - * Added `res.type()` to replace `res.contentType()` - * Changed: `res.redirect()` to add relative support - * Changed: enable "jsonp callback" by default - * Changed: renamed "case sensitive routes" to "case sensitive routing" - * Rewrite of all tests with mocha - * Removed "root" setting - * Removed `res.redirect('home')` support - * Removed `req.notify()` - * Removed `app.register()` - * Removed `app.redirect()` - * Removed `app.is()` - * Removed `app.helpers()` - * Removed `app.dynamicHelpers()` - * Fixed `res.sendfile()` with non-GET. Closes #723 - * Fixed express(1) public dir for windows. Closes #866 - -2.5.9/ 2012-04-02 -================== - - * Added support for PURGE request method [pbuyle] - * Fixed `express(1)` generated app `app.address()` before `listening` [mmalecki] - -2.5.8 / 2012-02-08 -================== - - * Update mkdirp dep. Closes #991 - -2.5.7 / 2012-02-06 -================== - - * Fixed `app.all` duplicate DELETE requests [mscdex] - -2.5.6 / 2012-01-13 -================== - - * Updated hamljs dev dep. Closes #953 - -2.5.5 / 2012-01-08 -================== - - * Fixed: set `filename` on cached templates [matthewleon] - -2.5.4 / 2012-01-02 -================== - - * Fixed `express(1)` eol on 0.4.x. Closes #947 - -2.5.3 / 2011-12-30 -================== - - * Fixed `req.is()` when a charset is present - -2.5.2 / 2011-12-10 -================== - - * Fixed: express(1) LF -> CRLF for windows - -2.5.1 / 2011-11-17 -================== - - * Changed: updated connect to 1.8.x - * Removed sass.js support from express(1) - -2.5.0 / 2011-10-24 -================== - - * Added ./routes dir for generated app by default - * Added npm install reminder to express(1) app gen - * Added 0.5.x support - * Removed `make test-cov` since it wont work with node 0.5.x - * Fixed express(1) public dir for windows. Closes #866 - -2.4.7 / 2011-10-05 -================== - - * Added mkdirp to express(1). Closes #795 - * Added simple _json-config_ example - * Added shorthand for the parsed request's pathname via `req.path` - * Changed connect dep to 1.7.x to fix npm issue... - * Fixed `res.redirect()` __HEAD__ support. [reported by xerox] - * Fixed `req.flash()`, only escape args - * Fixed absolute path checking on windows. Closes #829 [reported by andrewpmckenzie] - -2.4.6 / 2011-08-22 -================== - - * Fixed multiple param callback regression. Closes #824 [reported by TroyGoode] - -2.4.5 / 2011-08-19 -================== - - * Added support for routes to handle errors. Closes #809 - * Added `app.routes.all()`. Closes #803 - * Added "basepath" setting to work in conjunction with reverse proxies etc. - * Refactored `Route` to use a single array of callbacks - * Added support for multiple callbacks for `app.param()`. Closes #801 -Closes #805 - * Changed: removed .call(self) for route callbacks - * Dependency: `qs >= 0.3.1` - * Fixed `res.redirect()` on windows due to `join()` usage. Closes #808 - -2.4.4 / 2011-08-05 -================== - - * Fixed `res.header()` intention of a set, even when `undefined` - * Fixed `*`, value no longer required - * Fixed `res.send(204)` support. Closes #771 - -2.4.3 / 2011-07-14 -================== - - * Added docs for `status` option special-case. Closes #739 - * Fixed `options.filename`, exposing the view path to template engines - -2.4.2. / 2011-07-06 -================== - - * Revert "removed jsonp stripping" for XSS - -2.4.1 / 2011-07-06 -================== - - * Added `res.json()` JSONP support. Closes #737 - * Added _extending-templates_ example. Closes #730 - * Added "strict routing" setting for trailing slashes - * Added support for multiple envs in `app.configure()` calls. Closes #735 - * Changed: `res.send()` using `res.json()` - * Changed: when cookie `path === null` don't default it - * Changed; default cookie path to "home" setting. Closes #731 - * Removed _pids/logs_ creation from express(1) - -2.4.0 / 2011-06-28 -================== - - * Added chainable `res.status(code)` - * Added `res.json()`, an explicit version of `res.send(obj)` - * Added simple web-service example - -2.3.12 / 2011-06-22 -================== - - * \#express is now on freenode! come join! - * Added `req.get(field, param)` - * Added links to Japanese documentation, thanks @hideyukisaito! - * Added; the `express(1)` generated app outputs the env - * Added `content-negotiation` example - * Dependency: connect >= 1.5.1 < 2.0.0 - * Fixed view layout bug. Closes #720 - * Fixed; ignore body on 304. Closes #701 - -2.3.11 / 2011-06-04 -================== - - * Added `npm test` - * Removed generation of dummy test file from `express(1)` - * Fixed; `express(1)` adds express as a dep - * Fixed; prune on `prepublish` - -2.3.10 / 2011-05-27 -================== - - * Added `req.route`, exposing the current route - * Added _package.json_ generation support to `express(1)` - * Fixed call to `app.param()` function for optional params. Closes #682 - -2.3.9 / 2011-05-25 -================== - - * Fixed bug-ish with `../' in `res.partial()` calls - -2.3.8 / 2011-05-24 -================== - - * Fixed `app.options()` - -2.3.7 / 2011-05-23 -================== - - * Added route `Collection`, ex: `app.get('/user/:id').remove();` - * Added support for `app.param(fn)` to define param logic - * Removed `app.param()` support for callback with return value - * Removed module.parent check from express(1) generated app. Closes #670 - * Refactored router. Closes #639 - -2.3.6 / 2011-05-20 -================== - - * Changed; using devDependencies instead of git submodules - * Fixed redis session example - * Fixed markdown example - * Fixed view caching, should not be enabled in development - -2.3.5 / 2011-05-20 -================== - - * Added export `.view` as alias for `.View` - -2.3.4 / 2011-05-08 -================== - - * Added `./examples/say` - * Fixed `res.sendfile()` bug preventing the transfer of files with spaces - -2.3.3 / 2011-05-03 -================== - - * Added "case sensitive routes" option. - * Changed; split methods supported per rfc [slaskis] - * Fixed route-specific middleware when using the same callback function several times - -2.3.2 / 2011-04-27 -================== - - * Fixed view hints - -2.3.1 / 2011-04-26 -================== - - * Added `app.match()` as `app.match.all()` - * Added `app.lookup()` as `app.lookup.all()` - * Added `app.remove()` for `app.remove.all()` - * Added `app.remove.VERB()` - * Fixed template caching collision issue. Closes #644 - * Moved router over from connect and started refactor - -2.3.0 / 2011-04-25 -================== - - * Added options support to `res.clearCookie()` - * Added `res.helpers()` as alias of `res.locals()` - * Added; json defaults to UTF-8 with `res.send()`. Closes #632. [Daniel * Dependency `connect >= 1.4.0` - * Changed; auto set Content-Type in res.attachement [Aaron Heckmann] - * Renamed "cache views" to "view cache". Closes #628 - * Fixed caching of views when using several apps. Closes #637 - * Fixed gotcha invoking `app.param()` callbacks once per route middleware. -Closes #638 - * Fixed partial lookup precedence. Closes #631 -Shaw] - -2.2.2 / 2011-04-12 -================== - - * Added second callback support for `res.download()` connection errors - * Fixed `filename` option passing to template engine - -2.2.1 / 2011-04-04 -================== - - * Added `layout(path)` helper to change the layout within a view. Closes #610 - * Fixed `partial()` collection object support. - Previously only anything with `.length` would work. - When `.length` is present one must still be aware of holes, - however now `{ collection: {foo: 'bar'}}` is valid, exposes - `keyInCollection` and `keysInCollection`. - - * Performance improved with better view caching - * Removed `request` and `response` locals - * Changed; errorHandler page title is now `Express` instead of `Connect` - -2.2.0 / 2011-03-30 -================== - - * Added `app.lookup.VERB()`, ex `app.lookup.put('/user/:id')`. Closes #606 - * Added `app.match.VERB()`, ex `app.match.put('/user/12')`. Closes #606 - * Added `app.VERB(path)` as alias of `app.lookup.VERB()`. - * Dependency `connect >= 1.2.0` - -2.1.1 / 2011-03-29 -================== - - * Added; expose `err.view` object when failing to locate a view - * Fixed `res.partial()` call `next(err)` when no callback is given [reported by aheckmann] - * Fixed; `res.send(undefined)` responds with 204 [aheckmann] - -2.1.0 / 2011-03-24 -================== - - * Added `/_?` partial lookup support. Closes #447 - * Added `request`, `response`, and `app` local variables - * Added `settings` local variable, containing the app's settings - * Added `req.flash()` exception if `req.session` is not available - * Added `res.send(bool)` support (json response) - * Fixed stylus example for latest version - * Fixed; wrap try/catch around `res.render()` - -2.0.0 / 2011-03-17 -================== - - * Fixed up index view path alternative. - * Changed; `res.locals()` without object returns the locals - -2.0.0rc3 / 2011-03-17 -================== - - * Added `res.locals(obj)` to compliment `res.local(key, val)` - * Added `res.partial()` callback support - * Fixed recursive error reporting issue in `res.render()` - -2.0.0rc2 / 2011-03-17 -================== - - * Changed; `partial()` "locals" are now optional - * Fixed `SlowBuffer` support. Closes #584 [reported by tyrda01] - * Fixed .filename view engine option [reported by drudge] - * Fixed blog example - * Fixed `{req,res}.app` reference when mounting [Ben Weaver] - -2.0.0rc / 2011-03-14 -================== - - * Fixed; expose `HTTPSServer` constructor - * Fixed express(1) default test charset. Closes #579 [reported by secoif] - * Fixed; default charset to utf-8 instead of utf8 for lame IE [reported by NickP] - -2.0.0beta3 / 2011-03-09 -================== - - * Added support for `res.contentType()` literal - The original `res.contentType('.json')`, - `res.contentType('application/json')`, and `res.contentType('json')` - will work now. - * Added `res.render()` status option support back - * Added charset option for `res.render()` - * Added `.charset` support (via connect 1.0.4) - * Added view resolution hints when in development and a lookup fails - * Added layout lookup support relative to the page view. - For example while rendering `./views/user/index.jade` if you create - `./views/user/layout.jade` it will be used in favour of the root layout. - * Fixed `res.redirect()`. RFC states absolute url [reported by unlink] - * Fixed; default `res.send()` string charset to utf8 - * Removed `Partial` constructor (not currently used) - -2.0.0beta2 / 2011-03-07 -================== - - * Added res.render() `.locals` support back to aid in migration process - * Fixed flash example - -2.0.0beta / 2011-03-03 -================== - - * Added HTTPS support - * Added `res.cookie()` maxAge support - * Added `req.header()` _Referrer_ / _Referer_ special-case, either works - * Added mount support for `res.redirect()`, now respects the mount-point - * Added `union()` util, taking place of `merge(clone())` combo - * Added stylus support to express(1) generated app - * Added secret to session middleware used in examples and generated app - * Added `res.local(name, val)` for progressive view locals - * Added default param support to `req.param(name, default)` - * Added `app.disabled()` and `app.enabled()` - * Added `app.register()` support for omitting leading ".", either works - * Added `res.partial()`, using the same interface as `partial()` within a view. Closes #539 - * Added `app.param()` to map route params to async/sync logic - * Added; aliased `app.helpers()` as `app.locals()`. Closes #481 - * Added extname with no leading "." support to `res.contentType()` - * Added `cache views` setting, defaulting to enabled in "production" env - * Added index file partial resolution, eg: partial('user') may try _views/user/index.jade_. - * Added `req.accepts()` support for extensions - * Changed; `res.download()` and `res.sendfile()` now utilize Connect's - static file server `connect.static.send()`. - * Changed; replaced `connect.utils.mime()` with npm _mime_ module - * Changed; allow `req.query` to be pre-defined (via middleware or other parent - * Changed view partial resolution, now relative to parent view - * Changed view engine signature. no longer `engine.render(str, options, callback)`, now `engine.compile(str, options) -> Function`, the returned function accepts `fn(locals)`. - * Fixed `req.param()` bug returning Array.prototype methods. Closes #552 - * Fixed; using `Stream#pipe()` instead of `sys.pump()` in `res.sendfile()` - * Fixed; using _qs_ module instead of _querystring_ - * Fixed; strip unsafe chars from jsonp callbacks - * Removed "stream threshold" setting - -1.0.8 / 2011-03-01 -================== - - * Allow `req.query` to be pre-defined (via middleware or other parent app) - * "connect": ">= 0.5.0 < 1.0.0". Closes #547 - * Removed the long deprecated __EXPRESS_ENV__ support - -1.0.7 / 2011-02-07 -================== - - * Fixed `render()` setting inheritance. - Mounted apps would not inherit "view engine" - -1.0.6 / 2011-02-07 -================== - - * Fixed `view engine` setting bug when period is in dirname - -1.0.5 / 2011-02-05 -================== - - * Added secret to generated app `session()` call - -1.0.4 / 2011-02-05 -================== - - * Added `qs` dependency to _package.json_ - * Fixed namespaced `require()`s for latest connect support - -1.0.3 / 2011-01-13 -================== - - * Remove unsafe characters from JSONP callback names [Ryan Grove] - -1.0.2 / 2011-01-10 -================== - - * Removed nested require, using `connect.router` - -1.0.1 / 2010-12-29 -================== - - * Fixed for middleware stacked via `createServer()` - previously the `foo` middleware passed to `createServer(foo)` - would not have access to Express methods such as `res.send()` - or props like `req.query` etc. - -1.0.0 / 2010-11-16 -================== - - * Added; deduce partial object names from the last segment. - For example by default `partial('forum/post', postObject)` will - give you the _post_ object, providing a meaningful default. - * Added http status code string representation to `res.redirect()` body - * Added; `res.redirect()` supporting _text/plain_ and _text/html_ via __Accept__. - * Added `req.is()` to aid in content negotiation - * Added partial local inheritance [suggested by masylum]. Closes #102 - providing access to parent template locals. - * Added _-s, --session[s]_ flag to express(1) to add session related middleware - * Added _--template_ flag to express(1) to specify the - template engine to use. - * Added _--css_ flag to express(1) to specify the - stylesheet engine to use (or just plain css by default). - * Added `app.all()` support [thanks aheckmann] - * Added partial direct object support. - You may now `partial('user', user)` providing the "user" local, - vs previously `partial('user', { object: user })`. - * Added _route-separation_ example since many people question ways - to do this with CommonJS modules. Also view the _blog_ example for - an alternative. - * Performance; caching view path derived partial object names - * Fixed partial local inheritance precedence. [reported by Nick Poulden] Closes #454 - * Fixed jsonp support; _text/javascript_ as per mailinglist discussion - -1.0.0rc4 / 2010-10-14 -================== - - * Added _NODE_ENV_ support, _EXPRESS_ENV_ is deprecated and will be removed in 1.0.0 - * Added route-middleware support (very helpful, see the [docs](http://expressjs.com/guide.html#Route-Middleware)) - * Added _jsonp callback_ setting to enable/disable jsonp autowrapping [Dav Glass] - * Added callback query check on response.send to autowrap JSON objects for simple webservice implementations [Dav Glass] - * Added `partial()` support for array-like collections. Closes #434 - * Added support for swappable querystring parsers - * Added session usage docs. Closes #443 - * Added dynamic helper caching. Closes #439 [suggested by maritz] - * Added authentication example - * Added basic Range support to `res.sendfile()` (and `res.download()` etc) - * Changed; `express(1)` generated app using 2 spaces instead of 4 - * Default env to "development" again [aheckmann] - * Removed _context_ option is no more, use "scope" - * Fixed; exposing _./support_ libs to examples so they can run without installs - * Fixed mvc example - -1.0.0rc3 / 2010-09-20 -================== - - * Added confirmation for `express(1)` app generation. Closes #391 - * Added extending of flash formatters via `app.flashFormatters` - * Added flash formatter support. Closes #411 - * Added streaming support to `res.sendfile()` using `sys.pump()` when >= "stream threshold" - * Added _stream threshold_ setting for `res.sendfile()` - * Added `res.send()` __HEAD__ support - * Added `res.clearCookie()` - * Added `res.cookie()` - * Added `res.render()` headers option - * Added `res.redirect()` response bodies - * Added `res.render()` status option support. Closes #425 [thanks aheckmann] - * Fixed `res.sendfile()` responding with 403 on malicious path - * Fixed `res.download()` bug; when an error occurs remove _Content-Disposition_ - * Fixed; mounted apps settings now inherit from parent app [aheckmann] - * Fixed; stripping Content-Length / Content-Type when 204 - * Fixed `res.send()` 204. Closes #419 - * Fixed multiple _Set-Cookie_ headers via `res.header()`. Closes #402 - * Fixed bug messing with error handlers when `listenFD()` is called instead of `listen()`. [thanks guillermo] - - -1.0.0rc2 / 2010-08-17 -================== - - * Added `app.register()` for template engine mapping. Closes #390 - * Added `res.render()` callback support as second argument (no options) - * Added callback support to `res.download()` - * Added callback support for `res.sendfile()` - * Added support for middleware access via `express.middlewareName()` vs `connect.middlewareName()` - * Added "partials" setting to docs - * Added default expresso tests to `express(1)` generated app. Closes #384 - * Fixed `res.sendfile()` error handling, defer via `next()` - * Fixed `res.render()` callback when a layout is used [thanks guillermo] - * Fixed; `make install` creating ~/.node_libraries when not present - * Fixed issue preventing error handlers from being defined anywhere. Closes #387 - -1.0.0rc / 2010-07-28 -================== - - * Added mounted hook. Closes #369 - * Added connect dependency to _package.json_ - - * Removed "reload views" setting and support code - development env never caches, production always caches. - - * Removed _param_ in route callbacks, signature is now - simply (req, res, next), previously (req, res, params, next). - Use _req.params_ for path captures, _req.query_ for GET params. - - * Fixed "home" setting - * Fixed middleware/router precedence issue. Closes #366 - * Fixed; _configure()_ callbacks called immediately. Closes #368 - -1.0.0beta2 / 2010-07-23 -================== - - * Added more examples - * Added; exporting `Server` constructor - * Added `Server#helpers()` for view locals - * Added `Server#dynamicHelpers()` for dynamic view locals. Closes #349 - * Added support for absolute view paths - * Added; _home_ setting defaults to `Server#route` for mounted apps. Closes #363 - * Added Guillermo Rauch to the contributor list - * Added support for "as" for non-collection partials. Closes #341 - * Fixed _install.sh_, ensuring _~/.node_libraries_ exists. Closes #362 [thanks jf] - * Fixed `res.render()` exceptions, now passed to `next()` when no callback is given [thanks guillermo] - * Fixed instanceof `Array` checks, now `Array.isArray()` - * Fixed express(1) expansion of public dirs. Closes #348 - * Fixed middleware precedence. Closes #345 - * Fixed view watcher, now async [thanks aheckmann] - -1.0.0beta / 2010-07-15 -================== - - * Re-write - - much faster - - much lighter - - Check [ExpressJS.com](http://expressjs.com) for migration guide and updated docs - -0.14.0 / 2010-06-15 -================== - - * Utilize relative requires - * Added Static bufferSize option [aheckmann] - * Fixed caching of view and partial subdirectories [aheckmann] - * Fixed mime.type() comments now that ".ext" is not supported - * Updated haml submodule - * Updated class submodule - * Removed bin/express - -0.13.0 / 2010-06-01 -================== - - * Added node v0.1.97 compatibility - * Added support for deleting cookies via Request#cookie('key', null) - * Updated haml submodule - * Fixed not-found page, now using using charset utf-8 - * Fixed show-exceptions page, now using using charset utf-8 - * Fixed view support due to fs.readFile Buffers - * Changed; mime.type() no longer accepts ".type" due to node extname() changes - -0.12.0 / 2010-05-22 -================== - - * Added node v0.1.96 compatibility - * Added view `helpers` export which act as additional local variables - * Updated haml submodule - * Changed ETag; removed inode, modified time only - * Fixed LF to CRLF for setting multiple cookies - * Fixed cookie complation; values are now urlencoded - * Fixed cookies parsing; accepts quoted values and url escaped cookies - -0.11.0 / 2010-05-06 -================== - - * Added support for layouts using different engines - - this.render('page.html.haml', { layout: 'super-cool-layout.html.ejs' }) - - this.render('page.html.haml', { layout: 'foo' }) // assumes 'foo.html.haml' - - this.render('page.html.haml', { layout: false }) // no layout - * Updated ext submodule - * Updated haml submodule - * Fixed EJS partial support by passing along the context. Issue #307 - -0.10.1 / 2010-05-03 -================== - - * Fixed binary uploads. - -0.10.0 / 2010-04-30 -================== - - * Added charset support via Request#charset (automatically assigned to 'UTF-8' when respond()'s - encoding is set to 'utf8' or 'utf-8'. - * Added "encoding" option to Request#render(). Closes #299 - * Added "dump exceptions" setting, which is enabled by default. - * Added simple ejs template engine support - * Added error reponse support for text/plain, application/json. Closes #297 - * Added callback function param to Request#error() - * Added Request#sendHead() - * Added Request#stream() - * Added support for Request#respond(304, null) for empty response bodies - * Added ETag support to Request#sendfile() - * Added options to Request#sendfile(), passed to fs.createReadStream() - * Added filename arg to Request#download() - * Performance enhanced due to pre-reversing plugins so that plugins.reverse() is not called on each request - * Performance enhanced by preventing several calls to toLowerCase() in Router#match() - * Changed; Request#sendfile() now streams - * Changed; Renamed Request#halt() to Request#respond(). Closes #289 - * Changed; Using sys.inspect() instead of JSON.encode() for error output - * Changed; run() returns the http.Server instance. Closes #298 - * Changed; Defaulting Server#host to null (INADDR_ANY) - * Changed; Logger "common" format scale of 0.4f - * Removed Logger "request" format - * Fixed; Catching ENOENT in view caching, preventing error when "views/partials" is not found - * Fixed several issues with http client - * Fixed Logger Content-Length output - * Fixed bug preventing Opera from retaining the generated session id. Closes #292 - -0.9.0 / 2010-04-14 -================== - - * Added DSL level error() route support - * Added DSL level notFound() route support - * Added Request#error() - * Added Request#notFound() - * Added Request#render() callback function. Closes #258 - * Added "max upload size" setting - * Added "magic" variables to collection partials (\_\_index\_\_, \_\_length\_\_, \_\_isFirst\_\_, \_\_isLast\_\_). Closes #254 - * Added [haml.js](http://github.com/visionmedia/haml.js) submodule; removed haml-js - * Added callback function support to Request#halt() as 3rd/4th arg - * Added preprocessing of route param wildcards using param(). Closes #251 - * Added view partial support (with collections etc) - * Fixed bug preventing falsey params (such as ?page=0). Closes #286 - * Fixed setting of multiple cookies. Closes #199 - * Changed; view naming convention is now NAME.TYPE.ENGINE (for example page.html.haml) - * Changed; session cookie is now httpOnly - * Changed; Request is no longer global - * Changed; Event is no longer global - * Changed; "sys" module is no longer global - * Changed; moved Request#download to Static plugin where it belongs - * Changed; Request instance created before body parsing. Closes #262 - * Changed; Pre-caching views in memory when "cache view contents" is enabled. Closes #253 - * Changed; Pre-caching view partials in memory when "cache view partials" is enabled - * Updated support to node --version 0.1.90 - * Updated dependencies - * Removed set("session cookie") in favour of use(Session, { cookie: { ... }}) - * Removed utils.mixin(); use Object#mergeDeep() - -0.8.0 / 2010-03-19 -================== - - * Added coffeescript example app. Closes #242 - * Changed; cache api now async friendly. Closes #240 - * Removed deprecated 'express/static' support. Use 'express/plugins/static' - -0.7.6 / 2010-03-19 -================== - - * Added Request#isXHR. Closes #229 - * Added `make install` (for the executable) - * Added `express` executable for setting up simple app templates - * Added "GET /public/*" to Static plugin, defaulting to /public - * Added Static plugin - * Fixed; Request#render() only calls cache.get() once - * Fixed; Namespacing View caches with "view:" - * Fixed; Namespacing Static caches with "static:" - * Fixed; Both example apps now use the Static plugin - * Fixed set("views"). Closes #239 - * Fixed missing space for combined log format - * Deprecated Request#sendfile() and 'express/static' - * Removed Server#running - -0.7.5 / 2010-03-16 -================== - - * Added Request#flash() support without args, now returns all flashes - * Updated ext submodule - -0.7.4 / 2010-03-16 -================== - - * Fixed session reaper - * Changed; class.js replacing js-oo Class implementation (quite a bit faster, no browser cruft) - -0.7.3 / 2010-03-16 -================== - - * Added package.json - * Fixed requiring of haml / sass due to kiwi removal - -0.7.2 / 2010-03-16 -================== - - * Fixed GIT submodules (HAH!) - -0.7.1 / 2010-03-16 -================== - - * Changed; Express now using submodules again until a PM is adopted - * Changed; chat example using millisecond conversions from ext - -0.7.0 / 2010-03-15 -================== - - * Added Request#pass() support (finds the next matching route, or the given path) - * Added Logger plugin (default "common" format replaces CommonLogger) - * Removed Profiler plugin - * Removed CommonLogger plugin - -0.6.0 / 2010-03-11 -================== - - * Added seed.yml for kiwi package management support - * Added HTTP client query string support when method is GET. Closes #205 - - * Added support for arbitrary view engines. - For example "foo.engine.html" will now require('engine'), - the exports from this module are cached after the first require(). - - * Added async plugin support - - * Removed usage of RESTful route funcs as http client - get() etc, use http.get() and friends - - * Removed custom exceptions - -0.5.0 / 2010-03-10 -================== - - * Added ext dependency (library of js extensions) - * Removed extname() / basename() utils. Use path module - * Removed toArray() util. Use arguments.values - * Removed escapeRegexp() util. Use RegExp.escape() - * Removed process.mixin() dependency. Use utils.mixin() - * Removed Collection - * Removed ElementCollection - * Shameless self promotion of ebook "Advanced JavaScript" (http://dev-mag.com) ;) - -0.4.0 / 2010-02-11 -================== - - * Added flash() example to sample upload app - * Added high level restful http client module (express/http) - * Changed; RESTful route functions double as HTTP clients. Closes #69 - * Changed; throwing error when routes are added at runtime - * Changed; defaulting render() context to the current Request. Closes #197 - * Updated haml submodule - -0.3.0 / 2010-02-11 -================== - - * Updated haml / sass submodules. Closes #200 - * Added flash message support. Closes #64 - * Added accepts() now allows multiple args. fixes #117 - * Added support for plugins to halt. Closes #189 - * Added alternate layout support. Closes #119 - * Removed Route#run(). Closes #188 - * Fixed broken specs due to use(Cookie) missing - -0.2.1 / 2010-02-05 -================== - - * Added "plot" format option for Profiler (for gnuplot processing) - * Added request number to Profiler plugin - * Fixed binary encoding for multi-part file uploads, was previously defaulting to UTF8 - * Fixed issue with routes not firing when not files are present. Closes #184 - * Fixed process.Promise -> events.Promise - -0.2.0 / 2010-02-03 -================== - - * Added parseParam() support for name[] etc. (allows for file inputs with "multiple" attr) Closes #180 - * Added Both Cache and Session option "reapInterval" may be "reapEvery". Closes #174 - * Added expiration support to cache api with reaper. Closes #133 - * Added cache Store.Memory#reap() - * Added Cache; cache api now uses first class Cache instances - * Added abstract session Store. Closes #172 - * Changed; cache Memory.Store#get() utilizing Collection - * Renamed MemoryStore -> Store.Memory - * Fixed use() of the same plugin several time will always use latest options. Closes #176 - -0.1.0 / 2010-02-03 -================== - - * Changed; Hooks (before / after) pass request as arg as well as evaluated in their context - * Updated node support to 0.1.27 Closes #169 - * Updated dirname(__filename) -> __dirname - * Updated libxmljs support to v0.2.0 - * Added session support with memory store / reaping - * Added quick uid() helper - * Added multi-part upload support - * Added Sass.js support / submodule - * Added production env caching view contents and static files - * Added static file caching. Closes #136 - * Added cache plugin with memory stores - * Added support to StaticFile so that it works with non-textual files. - * Removed dirname() helper - * Removed several globals (now their modules must be required) - -0.0.2 / 2010-01-10 -================== - - * Added view benchmarks; currently haml vs ejs - * Added Request#attachment() specs. Closes #116 - * Added use of node's parseQuery() util. Closes #123 - * Added `make init` for submodules - * Updated Haml - * Updated sample chat app to show messages on load - * Updated libxmljs parseString -> parseHtmlString - * Fixed `make init` to work with older versions of git - * Fixed specs can now run independant specs for those who cant build deps. Closes #127 - * Fixed issues introduced by the node url module changes. Closes 126. - * Fixed two assertions failing due to Collection#keys() returning strings - * Fixed faulty Collection#toArray() spec due to keys() returning strings - * Fixed `make test` now builds libxmljs.node before testing - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/node_modules/express/LICENSE b/node_modules/express/LICENSE deleted file mode 100644 index 36075a3..0000000 --- a/node_modules/express/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2009-2011 TJ Holowaychuk - -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 diff --git a/node_modules/express/Makefile b/node_modules/express/Makefile deleted file mode 100644 index e820e31..0000000 --- a/node_modules/express/Makefile +++ /dev/null @@ -1,33 +0,0 @@ - -MOCHA_OPTS= -REPORTER = dot - -check: test - -test: test-unit test-acceptance - -test-unit: - @NODE_ENV=test ./node_modules/.bin/mocha \ - --reporter $(REPORTER) \ - $(MOCHA_OPTS) - -test-acceptance: - @NODE_ENV=test ./node_modules/.bin/mocha \ - --reporter $(REPORTER) \ - --bail \ - test/acceptance/*.js - -test-cov: lib-cov - @EXPRESS_COV=1 $(MAKE) test REPORTER=html-cov > coverage.html - -lib-cov: - @jscoverage lib lib-cov - -benchmark: - @./support/bench - -clean: - rm -f coverage.html - rm -fr lib-cov - -.PHONY: test test-unit test-acceptance benchmark clean diff --git a/node_modules/express/Readme.md b/node_modules/express/Readme.md deleted file mode 100644 index 6bb8b95..0000000 --- a/node_modules/express/Readme.md +++ /dev/null @@ -1,179 +0,0 @@ -![express logo](http://f.cl.ly/items/0V2S1n0K1i3y1c122g04/Screen%20Shot%202012-04-11%20at%209.59.42%20AM.png) - - Fast, unopinionated, minimalist web framework for [node](http://nodejs.org). [![Build Status](https://secure.travis-ci.org/visionmedia/express.png)](http://travis-ci.org/visionmedia/express) - -```js -var express = require('express'); -var app = express(); - -app.get('/', function(req, res){ - res.send('Hello World'); -}); - -app.listen(3000); -``` - -## Installation - - $ npm install -g express - -## Quick Start - - The quickest way to get started with express is to utilize the executable `express(1)` to generate an application as shown below: - - Create the app: - - $ npm install -g express - $ express /tmp/foo && cd /tmp/foo - - Install dependencies: - - $ npm install - - Start the server: - - $ node app - -## Features - - * Built on [Connect](http://github.com/senchalabs/connect) - * Robust routing - * HTTP helpers (redirection, caching, etc) - * View system supporting 14+ template engines - * Content negotiation - * Focus on high performance - * Environment based configuration - * Executable for generating applications quickly - * High test coverage - -## Philosophy - - The Express philosophy is to provide small, robust tooling for HTTP servers. Making - it a great solution for single page applications, web sites, hybrids, or public - HTTP APIs. - - Built on Connect you can use _only_ what you need, and nothing more, applications - can be as big or as small as you like, even a single file. Express does - not force you to use any specific ORM or template engine. With support for over - 14 template engines via [Consolidate.js](http://github.com/visionmedia/consolidate.js) - you can quickly craft your perfect framework. - -## More Information - - * Join #express on freenode - * [Google Group](http://groups.google.com/group/express-js) for discussion - * Follow [tjholowaychuk](http://twitter.com/tjholowaychuk) on twitter for updates - * Visit the [Wiki](http://github.com/visionmedia/express/wiki) - * [日本語ドキュメンテーション](http://hideyukisaito.com/doc/expressjs/) by [hideyukisaito](https://github.com/hideyukisaito) - * [Русскоязычная документация](http://express-js.ru/) - -## Viewing Examples - -Clone the Express repo, then install the dev dependencies to install all the example / test suite deps: - - $ git clone git://github.com/visionmedia/express.git --depth 1 - $ cd express - $ npm install - -then run whichever tests you want: - - $ node examples/content-negotiation - -## Running Tests - -To run the test suite first invoke the following command within the repo, installing the development dependencies: - - $ npm install - -then run the tests: - - $ make test - -## Contributors - -``` -project: express -commits: 3559 -active : 468 days -files : 237 -authors: - 1891 Tj Holowaychuk 53.1% - 1285 visionmedia 36.1% - 182 TJ Holowaychuk 5.1% - 54 Aaron Heckmann 1.5% - 34 csausdev 1.0% - 26 ciaranj 0.7% - 21 Robert Sköld 0.6% - 6 Guillermo Rauch 0.2% - 3 Dav Glass 0.1% - 3 Nick Poulden 0.1% - 2 Randy Merrill 0.1% - 2 Benny Wong 0.1% - 2 Hunter Loftis 0.1% - 2 Jake Gordon 0.1% - 2 Brian McKinney 0.1% - 2 Roman Shtylman 0.1% - 2 Ben Weaver 0.1% - 2 Dave Hoover 0.1% - 2 Eivind Fjeldstad 0.1% - 2 Daniel Shaw 0.1% - 1 Matt Colyer 0.0% - 1 Pau Ramon 0.0% - 1 Pero Pejovic 0.0% - 1 Peter Rekdal Sunde 0.0% - 1 Raynos 0.0% - 1 Teng Siong Ong 0.0% - 1 Viktor Kelemen 0.0% - 1 ctide 0.0% - 1 8bitDesigner 0.0% - 1 isaacs 0.0% - 1 mgutz 0.0% - 1 pikeas 0.0% - 1 shuwatto 0.0% - 1 tstrimple 0.0% - 1 ewoudj 0.0% - 1 Adam Sanderson 0.0% - 1 Andrii Kostenko 0.0% - 1 Andy Hiew 0.0% - 1 Arpad Borsos 0.0% - 1 Ashwin Purohit 0.0% - 1 Benjen 0.0% - 1 Darren Torpey 0.0% - 1 Greg Ritter 0.0% - 1 Gregory Ritter 0.0% - 1 James Herdman 0.0% - 1 Jim Snodgrass 0.0% - 1 Joe McCann 0.0% - 1 Jonathan Dumaine 0.0% - 1 Jonathan Palardy 0.0% - 1 Jonathan Zacsh 0.0% - 1 Justin Lilly 0.0% - 1 Ken Sato 0.0% - 1 Maciej Małecki 0.0% - 1 Masahiro Hayashi 0.0% -``` - -## License - -(The MIT License) - -Copyright (c) 2009-2012 TJ Holowaychuk <tj@vision-media.ca> - -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. diff --git a/node_modules/express/bin/express b/node_modules/express/bin/express deleted file mode 100755 index 3c0090c..0000000 --- a/node_modules/express/bin/express +++ /dev/null @@ -1,422 +0,0 @@ -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var exec = require('child_process').exec - , program = require('commander') - , mkdirp = require('mkdirp') - , pkg = require('../package.json') - , version = pkg.version - , os = require('os') - , fs = require('fs'); - -// CLI - -program - .version(version) - .option('-s, --sessions', 'add session support') - .option('-e, --ejs', 'add ejs engine support (defaults to jade)') - .option('-J, --jshtml', 'add jshtml engine support (defaults to jade)') - .option('-H, --hogan', 'add hogan.js engine support') - .option('-c, --css ', 'add stylesheet support (less|stylus) (defaults to plain css)') - .option('-f, --force', 'force on non-empty directory') - .parse(process.argv); - -// Path - -var path = program.args.shift() || '.'; - -// end-of-line code - -var eol = 'win32' == os.platform() ? '\r\n' : '\n' - -// Template engine - -program.template = 'jade'; -if (program.ejs) program.template = 'ejs'; -if (program.jshtml) program.template = 'jshtml'; -if (program.hogan) program.template = 'hjs'; - -/** - * Routes index template. - */ - -var index = [ - '' - , '/*' - , ' * GET home page.' - , ' */' - , '' - , 'exports.index = function(req, res){' - , ' res.render(\'index\', { title: \'Express\' });' - , '};' -].join(eol); - -/** - * Routes users template. - */ - -var users = [ - '' - , '/*' - , ' * GET users listing.' - , ' */' - , '' - , 'exports.list = function(req, res){' - , ' res.send("respond with a resource");' - , '};' -].join(eol); - -/** - * Jade layout template. - */ - -var jadeLayout = [ - 'doctype 5' - , 'html' - , ' head' - , ' title= title' - , ' link(rel=\'stylesheet\', href=\'/stylesheets/style.css\')' - , ' body' - , ' block content' -].join(eol); - -/** - * Jade index template. - */ - -var jadeIndex = [ - 'extends layout' - , '' - , 'block content' - , ' h1= title' - , ' p Welcome to #{title}' -].join(eol); - -/** - * EJS index template. - */ - -var ejsIndex = [ - '' - , '' - , ' ' - , ' <%= title %>' - , ' ' - , ' ' - , ' ' - , '

      <%= title %>

      ' - , '

      Welcome to <%= title %>

      ' - , ' ' - , '' -].join(eol); - -/** - * JSHTML layout template. - */ - -var jshtmlLayout = [ - '' - , '' - , ' ' - , ' @write(title) ' - , ' ' - , ' ' - , ' ' - , ' @write(body)' - , ' ' - , '' -].join(eol); - -/** - * JSHTML index template. - */ - -var jshtmlIndex = [ - '

      @write(title)

      ' - , '

      Welcome to @write(title)

      ' -].join(eol); - -/** - * Hogan.js index template. - */ -var hoganIndex = [ - '' - , '' - , ' ' - , ' {{ title }}' - , ' ' - , ' ' - , ' ' - , '

      {{ title }}

      ' - , '

      Welcome to {{ title }}

      ' - , ' ' - , '' -].join(eol); - -/** - * Default css template. - */ - -var css = [ - 'body {' - , ' padding: 50px;' - , ' font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;' - , '}' - , '' - , 'a {' - , ' color: #00B7FF;' - , '}' -].join(eol); - -/** - * Default less template. - */ - -var less = [ - 'body {' - , ' padding: 50px;' - , ' font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;' - , '}' - , '' - , 'a {' - , ' color: #00B7FF;' - , '}' -].join(eol); - -/** - * Default stylus template. - */ - -var stylus = [ - 'body' - , ' padding: 50px' - , ' font: 14px "Lucida Grande", Helvetica, Arial, sans-serif' - , 'a' - , ' color: #00B7FF' -].join(eol); - -/** - * App template. - */ - -var app = [ - '' - , '/**' - , ' * Module dependencies.' - , ' */' - , '' - , 'var express = require(\'express\')' - , ' , routes = require(\'./routes\')' - , ' , user = require(\'./routes/user\')' - , ' , http = require(\'http\')' - , ' , path = require(\'path\');' - , '' - , 'var app = express();' - , '' - , 'app.configure(function(){' - , ' app.set(\'port\', process.env.PORT || 3000);' - , ' app.set(\'views\', __dirname + \'/views\');' - , ' app.set(\'view engine\', \':TEMPLATE\');' - , ' app.use(express.favicon());' - , ' app.use(express.logger(\'dev\'));' - , ' app.use(express.bodyParser());' - , ' app.use(express.methodOverride());{sess}' - , ' app.use(app.router);{css}' - , ' app.use(express.static(path.join(__dirname, \'public\')));' - , '});' - , '' - , 'app.configure(\'development\', function(){' - , ' app.use(express.errorHandler());' - , '});' - , '' - , 'app.get(\'/\', routes.index);' - , 'app.get(\'/users\', user.list);' - , '' - , 'http.createServer(app).listen(app.get(\'port\'), function(){' - , ' console.log("Express server listening on port " + app.get(\'port\'));' - , '});' - , '' -].join(eol); - -// Generate application - -(function createApplication(path) { - emptyDirectory(path, function(empty){ - if (empty || program.force) { - createApplicationAt(path); - } else { - program.confirm('destination is not empty, continue? ', function(ok){ - if (ok) { - process.stdin.destroy(); - createApplicationAt(path); - } else { - abort('aborting'); - } - }); - } - }); -})(path); - -/** - * Create application at the given directory `path`. - * - * @param {String} path - */ - -function createApplicationAt(path) { - console.log(); - process.on('exit', function(){ - console.log(); - console.log(' install dependencies:'); - console.log(' $ cd %s && npm install', path); - console.log(); - console.log(' run the app:'); - console.log(' $ node app'); - console.log(); - }); - - mkdir(path, function(){ - mkdir(path + '/public'); - mkdir(path + '/public/javascripts'); - mkdir(path + '/public/images'); - mkdir(path + '/public/stylesheets', function(){ - switch (program.css) { - case 'less': - write(path + '/public/stylesheets/style.less', less); - break; - case 'stylus': - write(path + '/public/stylesheets/style.styl', stylus); - break; - default: - write(path + '/public/stylesheets/style.css', css); - } - }); - - mkdir(path + '/routes', function(){ - write(path + '/routes/index.js', index); - write(path + '/routes/user.js', users); - }); - - mkdir(path + '/views', function(){ - switch (program.template) { - case 'ejs': - write(path + '/views/index.ejs', ejsIndex); - break; - case 'jade': - write(path + '/views/layout.jade', jadeLayout); - write(path + '/views/index.jade', jadeIndex); - break; - case 'jshtml': - write(path + '/views/layout.jshtml', jshtmlLayout); - write(path + '/views/index.jshtml', jshtmlIndex); - break; - case 'hjs': - write(path + '/views/index.hjs', hoganIndex); - break; - - } - }); - - // CSS Engine support - switch (program.css) { - case 'less': - app = app.replace('{css}', eol + ' app.use(require(\'less-middleware\')({ src: __dirname + \'/public\' }));'); - break; - case 'stylus': - app = app.replace('{css}', eol + ' app.use(require(\'stylus\').middleware(__dirname + \'/public\'));'); - break; - default: - app = app.replace('{css}', ''); - } - - // Session support - app = app.replace('{sess}', program.sessions - ? eol + ' app.use(express.cookieParser(\'your secret here\'));' + eol + ' app.use(express.session());' - : ''); - - // Template support - app = app.replace(':TEMPLATE', program.template); - - // package.json - var pkg = { - name: 'application-name' - , version: '0.0.1' - , private: true - , scripts: { start: 'node app' } - , dependencies: { - express: version - } - } - - if (program.template) pkg.dependencies[program.template] = '*'; - - // CSS Engine support - switch (program.css) { - case 'less': - pkg.dependencies['less-middleware'] = '*'; - break; - default: - if (program.css) { - pkg.dependencies[program.css] = '*'; - } - } - - write(path + '/package.json', JSON.stringify(pkg, null, 2)); - write(path + '/app.js', app); - }); -} - -/** - * Check if the given directory `path` is empty. - * - * @param {String} path - * @param {Function} fn - */ - -function emptyDirectory(path, fn) { - fs.readdir(path, function(err, files){ - if (err && 'ENOENT' != err.code) throw err; - fn(!files || !files.length); - }); -} - -/** - * echo str > path. - * - * @param {String} path - * @param {String} str - */ - -function write(path, str) { - fs.writeFile(path, str); - console.log(' \x1b[36mcreate\x1b[0m : ' + path); -} - -/** - * Mkdir -p. - * - * @param {String} path - * @param {Function} fn - */ - -function mkdir(path, fn) { - mkdirp(path, 0755, function(err){ - if (err) throw err; - console.log(' \033[36mcreate\033[0m : ' + path); - fn && fn(); - }); -} - -/** - * Exit with the given `str`. - * - * @param {String} str - */ - -function abort(str) { - console.error(str); - process.exit(1); -} diff --git a/node_modules/express/client.js b/node_modules/express/client.js deleted file mode 100644 index 8984c44..0000000 --- a/node_modules/express/client.js +++ /dev/null @@ -1,25 +0,0 @@ - -var http = require('http'); - -var times = 50; - -while (times--) { - var req = http.request({ - port: 3000 - , method: 'POST' - , headers: { 'Content-Type': 'application/x-www-form-urlencoded' } - }); - - req.on('response', function(res){ - console.log(res.statusCode); - }); - - var n = 500000; - while (n--) { - req.write('foo=bar&bar=baz&'); - } - - req.write('foo=bar&bar=baz'); - - req.end(); -} \ No newline at end of file diff --git a/node_modules/express/index.js b/node_modules/express/index.js deleted file mode 100644 index bfe9934..0000000 --- a/node_modules/express/index.js +++ /dev/null @@ -1,4 +0,0 @@ - -module.exports = process.env.EXPRESS_COV - ? require('./lib-cov/express') - : require('./lib/express'); \ No newline at end of file diff --git a/node_modules/express/lib/application.js b/node_modules/express/lib/application.js deleted file mode 100644 index 7ebc6f6..0000000 --- a/node_modules/express/lib/application.js +++ /dev/null @@ -1,534 +0,0 @@ -/** - * Module dependencies. - */ - -var connect = require('connect') - , Router = require('./router') - , methods = require('methods') - , middleware = require('./middleware') - , debug = require('debug')('express:application') - , locals = require('./utils').locals - , View = require('./view') - , utils = connect.utils - , path = require('path') - , http = require('http') - , join = path.join; - -/** - * Application prototype. - */ - -var app = exports = module.exports = {}; - -/** - * Initialize the server. - * - * - setup default configuration - * - setup default middleware - * - setup route reflection methods - * - * @api private - */ - -app.init = function(){ - this.cache = {}; - this.settings = {}; - this.engines = {}; - this.viewCallbacks = []; - this.defaultConfiguration(); -}; - -/** - * Initialize application configuration. - * - * @api private - */ - -app.defaultConfiguration = function(){ - // default settings - this.enable('x-powered-by'); - this.set('env', process.env.NODE_ENV || 'development'); - this.set('subdomain offset', 2); - debug('booting in %s mode', this.get('env')); - - // implicit middleware - this.use(connect.query()); - this.use(middleware.init(this)); - - // inherit protos - this.on('mount', function(parent){ - this.request.__proto__ = parent.request; - this.response.__proto__ = parent.response; - this.engines.__proto__ = parent.engines; - }); - - // router - this._router = new Router(this); - this.routes = this._router.map; - this.__defineGetter__('router', function(){ - this._usedRouter = true; - this._router.caseSensitive = this.enabled('case sensitive routing'); - this._router.strict = this.enabled('strict routing'); - return this._router.middleware; - }); - - // setup locals - this.locals = locals(this); - - // default locals - this.locals.settings = this.settings; - - // default configuration - this.set('views', process.cwd() + '/views'); - this.set('jsonp callback name', 'callback'); - - this.configure('development', function(){ - this.set('json spaces', 2); - }); - - this.configure('production', function(){ - this.enable('view cache'); - }); -}; - -/** - * Proxy `connect#use()` to apply settings to - * mounted applications. - * - * @param {String|Function|Server} route - * @param {Function|Server} fn - * @return {app} for chaining - * @api public - */ - -app.use = function(route, fn){ - var app; - - // default route to '/' - if ('string' != typeof route) fn = route, route = '/'; - - // express app - if (fn.handle && fn.set) app = fn; - - // restore .app property on req and res - if (app) { - app.route = route; - fn = function(req, res, next) { - var orig = req.app; - app.handle(req, res, function(err){ - req.app = res.app = orig; - req.__proto__ = orig.request; - res.__proto__ = orig.response; - next(err); - }); - }; - } - - connect.proto.use.call(this, route, fn); - - // mounted an app - if (app) { - app.parent = this; - app.emit('mount', this); - } - - return this; -}; - -/** - * Register the given template engine callback `fn` - * as `ext`. - * - * By default will `require()` the engine based on the - * file extension. For example if you try to render - * a "foo.jade" file Express will invoke the following internally: - * - * app.engine('jade', require('jade').__express); - * - * For engines that do not provide `.__express` out of the box, - * or if you wish to "map" a different extension to the template engine - * you may use this method. For example mapping the EJS template engine to - * ".html" files: - * - * app.engine('html', require('ejs').renderFile); - * - * In this case EJS provides a `.renderFile()` method with - * the same signature that Express expects: `(path, options, callback)`, - * though note that it aliases this method as `ejs.__express` internally - * so if you're using ".ejs" extensions you dont need to do anything. - * - * Some template engines do not follow this convention, the - * [Consolidate.js](https://github.com/visionmedia/consolidate.js) - * library was created to map all of node's popular template - * engines to follow this convention, thus allowing them to - * work seeessly within Express. - * - * @param {String} ext - * @param {Function} fn - * @return {app} for chaining - * @api public - */ - -app.engine = function(ext, fn){ - if ('function' != typeof fn) throw new Error('callback function required'); - if ('.' != ext[0]) ext = '.' + ext; - this.engines[ext] = fn; - return this; -}; - -/** - * Map the given param placeholder `name`(s) to the given callback(s). - * - * Parameter mapping is used to provide pre-conditions to routes - * which use normalized placeholders. For example a _:user_id_ parameter - * could automatically load a user's information from the database without - * any additional code, - * - * The callback uses the samesignature as middleware, the only differencing - * being that the value of the placeholder is passed, in this case the _id_ - * of the user. Once the `next()` function is invoked, just like middleware - * it will continue on to execute the route, or subsequent parameter functions. - * - * app.param('user_id', function(req, res, next, id){ - * User.find(id, function(err, user){ - * if (err) { - * next(err); - * } else if (user) { - * req.user = user; - * next(); - * } else { - * next(new Error('failed to load user')); - * } - * }); - * }); - * - * @param {String|Array} name - * @param {Function} fn - * @return {app} for chaining - * @api public - */ - -app.param = function(name, fn){ - var self = this - , fns = [].slice.call(arguments, 1); - - // array - if (Array.isArray(name)) { - name.forEach(function(name){ - fns.forEach(function(fn){ - self.param(name, fn); - }); - }); - // param logic - } else if ('function' == typeof name) { - this._router.param(name); - // single - } else { - if (':' == name[0]) name = name.substr(1); - fns.forEach(function(fn){ - self._router.param(name, fn); - }); - } - - return this; -}; - -/** - * Assign `setting` to `val`, or return `setting`'s value. - * - * app.set('foo', 'bar'); - * app.get('foo'); - * // => "bar" - * - * Mounted servers inherit their parent server's settings. - * - * @param {String} setting - * @param {String} val - * @return {Server} for chaining - * @api public - */ - -app.set = function(setting, val){ - if (1 == arguments.length) { - if (this.settings.hasOwnProperty(setting)) { - return this.settings[setting]; - } else if (this.parent) { - return this.parent.set(setting); - } - } else { - this.settings[setting] = val; - return this; - } -}; - -/** - * Return the app's absolute pathname - * based on the parent(s) that have - * mounted it. - * - * For example if the application was - * mounted as "/admin", which itself - * was mounted as "/blog" then the - * return value would be "/blog/admin". - * - * @return {String} - * @api private - */ - -app.path = function(){ - return this.parent - ? this.parent.path() + this.route - : ''; -}; - -/** - * Check if `setting` is enabled (truthy). - * - * app.enabled('foo') - * // => false - * - * app.enable('foo') - * app.enabled('foo') - * // => true - * - * @param {String} setting - * @return {Boolean} - * @api public - */ - -app.enabled = function(setting){ - return !!this.set(setting); -}; - -/** - * Check if `setting` is disabled. - * - * app.disabled('foo') - * // => true - * - * app.enable('foo') - * app.disabled('foo') - * // => false - * - * @param {String} setting - * @return {Boolean} - * @api public - */ - -app.disabled = function(setting){ - return !this.set(setting); -}; - -/** - * Enable `setting`. - * - * @param {String} setting - * @return {app} for chaining - * @api public - */ - -app.enable = function(setting){ - return this.set(setting, true); -}; - -/** - * Disable `setting`. - * - * @param {String} setting - * @return {app} for chaining - * @api public - */ - -app.disable = function(setting){ - return this.set(setting, false); -}; - -/** - * Configure callback for zero or more envs, - * when no `env` is specified that callback will - * be invoked for all environments. Any combination - * can be used multiple times, in any order desired. - * - * Examples: - * - * app.configure(function(){ - * // executed for all envs - * }); - * - * app.configure('stage', function(){ - * // executed staging env - * }); - * - * app.configure('stage', 'production', function(){ - * // executed for stage and production - * }); - * - * Note: - * - * These callbacks are invoked immediately, and - * are effectively sugar for the following: - * - * var env = process.env.NODE_ENV || 'development'; - * - * switch (env) { - * case 'development': - * ... - * break; - * case 'stage': - * ... - * break; - * case 'production': - * ... - * break; - * } - * - * @param {String} env... - * @param {Function} fn - * @return {app} for chaining - * @api public - */ - -app.configure = function(env, fn){ - var envs = 'all' - , args = [].slice.call(arguments); - fn = args.pop(); - if (args.length) envs = args; - if ('all' == envs || ~envs.indexOf(this.settings.env)) fn.call(this); - return this; -}; - -/** - * Delegate `.VERB(...)` calls to `router.VERB(...)`. - */ - -methods.forEach(function(method){ - app[method] = function(path){ - if ('get' == method && 1 == arguments.length) return this.set(path); - - // if no router attacked yet, attach the router - if (!this._usedRouter) this.use(this.router); - - // setup route - this._router[method].apply(this._router, arguments); - return this; - }; -}); - -/** - * Special-cased "all" method, applying the given route `path`, - * middleware, and callback to _every_ HTTP method. - * - * @param {String} path - * @param {Function} ... - * @return {app} for chaining - * @api public - */ - -app.all = function(path){ - var args = arguments; - methods.forEach(function(method){ - app[method].apply(this, args); - }, this); - return this; -}; - -// del -> delete alias - -app.del = app.delete; - -/** - * Render the given view `name` name with `options` - * and a callback accepting an error and the - * rendered template string. - * - * Example: - * - * app.render('email', { name: 'Tobi' }, function(err, html){ - * // ... - * }) - * - * @param {String} name - * @param {String|Function} options or fn - * @param {Function} fn - * @api public - */ - -app.render = function(name, options, fn){ - var opts = {} - , cache = this.cache - , engines = this.engines - , view; - - // support callback function as second arg - if ('function' == typeof options) { - fn = options, options = {}; - } - - // merge app.locals - utils.merge(opts, this.locals); - - // merge options._locals - if (options._locals) utils.merge(opts, options._locals); - - // merge options - utils.merge(opts, options); - - // set .cache unless explicitly provided - opts.cache = null == opts.cache - ? this.enabled('view cache') - : opts.cache; - - // primed cache - if (opts.cache) view = cache[name]; - - // view - if (!view) { - view = new View(name, { - defaultEngine: this.get('view engine'), - root: this.get('views'), - engines: engines - }); - - if (!view.path) { - var err = new Error('Failed to lookup view "' + name + '"'); - err.view = view; - return fn(err); - } - - // prime the cache - if (opts.cache) cache[name] = view; - } - - // render - try { - view.render(opts, fn); - } catch (err) { - fn(err); - } -}; - -/** - * Listen for connections. - * - * A node `http.Server` is returned, with this - * application (which is a `Function`) as its - * callback. If you wish to create both an HTTP - * and HTTPS server you may do so with the "http" - * and "https" modules as shown here: - * - * var http = require('http') - * , https = require('https') - * , express = require('express') - * , app = express(); - * - * http.createServer(app).listen(80); - * https.createServer({ ... }, app).listen(443); - * - * @return {http.Server} - * @api public - */ - -app.listen = function(){ - var server = http.createServer(this); - return server.listen.apply(server, arguments); -}; diff --git a/node_modules/express/lib/express.js b/node_modules/express/lib/express.js deleted file mode 100644 index 2a704b2..0000000 --- a/node_modules/express/lib/express.js +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Module dependencies. - */ - -var connect = require('connect') - , proto = require('./application') - , Route = require('./router/route') - , Router = require('./router') - , req = require('./request') - , res = require('./response') - , utils = connect.utils; - -/** - * Expose `createApplication()`. - */ - -exports = module.exports = createApplication; - -/** - * Framework version. - */ - -exports.version = '3.1.0'; - -/** - * Expose mime. - */ - -exports.mime = connect.mime; - -/** - * Create an express application. - * - * @return {Function} - * @api public - */ - -function createApplication() { - var app = connect(); - utils.merge(app, proto); - app.request = { __proto__: req }; - app.response = { __proto__: res }; - app.init(); - return app; -} - -/** - * Expose connect.middleware as express.* - * for example `express.logger` etc. - */ - -for (var key in connect.middleware) { - Object.defineProperty( - exports - , key - , Object.getOwnPropertyDescriptor(connect.middleware, key)); -} - -/** - * Error on createServer(). - */ - -exports.createServer = function(){ - console.warn('Warning: express.createServer() is deprecated, express'); - console.warn('applications no longer inherit from http.Server,'); - console.warn('please use:'); - console.warn(''); - console.warn(' var express = require("express");'); - console.warn(' var app = express();'); - console.warn(''); - return createApplication(); -}; - -/** - * Expose the prototypes. - */ - -exports.application = proto; -exports.request = req; -exports.response = res; - -/** - * Expose constructors. - */ - -exports.Route = Route; -exports.Router = Router; - -// Error handler title - -exports.errorHandler.title = 'Express'; - diff --git a/node_modules/express/lib/middleware.js b/node_modules/express/lib/middleware.js deleted file mode 100644 index 308c5bb..0000000 --- a/node_modules/express/lib/middleware.js +++ /dev/null @@ -1,33 +0,0 @@ - -/** - * Module dependencies. - */ - -var utils = require('./utils'); - -/** - * Initialization middleware, exposing the - * request and response to eachother, as well - * as defaulting the X-Powered-By header field. - * - * @param {Function} app - * @return {Function} - * @api private - */ - -exports.init = function(app){ - return function expressInit(req, res, next){ - req.app = res.app = app; - if (app.enabled('x-powered-by')) res.setHeader('X-Powered-By', 'Express'); - req.res = res; - res.req = req; - req.next = next; - - req.__proto__ = app.request; - res.__proto__ = app.response; - - res.locals = res.locals || utils.locals(res); - - next(); - } -}; diff --git a/node_modules/express/lib/request.js b/node_modules/express/lib/request.js deleted file mode 100644 index 1c6048d..0000000 --- a/node_modules/express/lib/request.js +++ /dev/null @@ -1,493 +0,0 @@ - -/** - * Module dependencies. - */ - -var http = require('http') - , utils = require('./utils') - , connect = require('connect') - , fresh = require('fresh') - , parseRange = require('range-parser') - , parse = connect.utils.parseUrl - , mime = connect.mime; - -/** - * Request prototype. - */ - -var req = exports = module.exports = { - __proto__: http.IncomingMessage.prototype -}; - -/** - * Return request header. - * - * The `Referrer` header field is special-cased, - * both `Referrer` and `Referer` are interchangeable. - * - * Examples: - * - * req.get('Content-Type'); - * // => "text/plain" - * - * req.get('content-type'); - * // => "text/plain" - * - * req.get('Something'); - * // => undefined - * - * Aliased as `req.header()`. - * - * @param {String} name - * @return {String} - * @api public - */ - -req.get = -req.header = function(name){ - switch (name = name.toLowerCase()) { - case 'referer': - case 'referrer': - return this.headers.referrer - || this.headers.referer; - default: - return this.headers[name]; - } -}; - -/** - * 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", a comma-delimted list such as "json, html, text/plain", - * 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 - * req.accepts('html'); - * // => "html" - * - * // Accept: text/*, application/json - * req.accepts('html'); - * // => "html" - * req.accepts('text/html'); - * // => "text/html" - * req.accepts('json, text'); - * // => "json" - * req.accepts('application/json'); - * // => "application/json" - * - * // Accept: text/*, application/json - * req.accepts('image/png'); - * req.accepts('png'); - * // => undefined - * - * // Accept: text/*;q=.5, application/json - * req.accepts(['html', 'json']); - * req.accepts('html, json'); - * // => "json" - * - * @param {String|Array} type(s) - * @return {String} - * @api public - */ - -req.accepts = function(type){ - return utils.accepts(type, this.get('Accept')); -}; - -/** - * Check if the given `charset` is acceptable, - * otherwise you should respond with 406 "Not Acceptable". - * - * @param {String} charset - * @return {Boolean} - * @api public - */ - -req.acceptsCharset = function(charset){ - var accepted = this.acceptedCharsets; - return accepted.length - ? ~accepted.indexOf(charset) - : true; -}; - -/** - * Check if the given `lang` is acceptable, - * otherwise you should respond with 406 "Not Acceptable". - * - * @param {String} lang - * @return {Boolean} - * @api public - */ - -req.acceptsLanguage = function(lang){ - var accepted = this.acceptedLanguages; - return accepted.length - ? ~accepted.indexOf(lang) - : true; -}; - -/** - * Parse Range header field, - * capping to the given `size`. - * - * Unspecified ranges such as "0-" require - * knowledge of your resource length. In - * the case of a byte range this is of course - * the total number of bytes. If the Range - * header field is not given `null` is returned, - * `-1` when unsatisfiable, `-2` when syntactically invalid. - * - * NOTE: remember that ranges are inclusive, so - * for example "Range: users=0-3" should respond - * with 4 users when available, not 3. - * - * @param {Number} size - * @return {Array} - * @api public - */ - -req.range = function(size){ - var range = this.get('Range'); - if (!range) return; - return parseRange(size, range); -}; - -/** - * Return an array of Accepted media types - * ordered from highest quality to lowest. - * - * Examples: - * - * [ { value: 'application/json', - * quality: 1, - * type: 'application', - * subtype: 'json' }, - * { value: 'text/html', - * quality: 0.5, - * type: 'text', - * subtype: 'html' } ] - * - * @return {Array} - * @api public - */ - -req.__defineGetter__('accepted', function(){ - var accept = this.get('Accept'); - return accept - ? utils.parseAccept(accept) - : []; -}); - -/** - * Return an array of Accepted languages - * ordered from highest quality to lowest. - * - * Examples: - * - * Accept-Language: en;q=.5, en-us - * ['en-us', 'en'] - * - * @return {Array} - * @api public - */ - -req.__defineGetter__('acceptedLanguages', function(){ - var accept = this.get('Accept-Language'); - return accept - ? utils - .parseQuality(accept) - .map(function(obj){ - return obj.value; - }) - : []; -}); - -/** - * Return an array of Accepted charsets - * ordered from highest quality to lowest. - * - * Examples: - * - * Accept-Charset: iso-8859-5;q=.2, unicode-1-1;q=0.8 - * ['unicode-1-1', 'iso-8859-5'] - * - * @return {Array} - * @api public - */ - -req.__defineGetter__('acceptedCharsets', function(){ - var accept = this.get('Accept-Charset'); - return accept - ? utils - .parseQuality(accept) - .map(function(obj){ - return obj.value; - }) - : []; -}); - -/** - * Return the value of param `name` when present or `defaultValue`. - * - * - Checks route placeholders, ex: _/user/:id_ - * - Checks body params, ex: id=12, {"id":12} - * - Checks query string params, ex: ?id=12 - * - * To utilize request bodies, `req.body` - * should be an object. This can be done by using - * the `connect.bodyParser()` middleware. - * - * @param {String} name - * @param {Mixed} defaultValue - * @return {String} - * @api public - */ - -req.param = function(name, defaultValue){ - var params = this.params || {}; - var body = this.body || {}; - var query = this.query || {}; - if (null != params[name] && params.hasOwnProperty(name)) return params[name]; - if (null != body[name]) return body[name]; - if (null != query[name]) return query[name]; - return defaultValue; -}; - -/** - * Check if the incoming request contains the "Content-Type" - * header field, and it contains the give mime `type`. - * - * Examples: - * - * // With Content-Type: text/html; charset=utf-8 - * req.is('html'); - * req.is('text/html'); - * req.is('text/*'); - * // => true - * - * // When Content-Type is application/json - * req.is('json'); - * req.is('application/json'); - * req.is('application/*'); - * // => true - * - * req.is('html'); - * // => false - * - * @param {String} type - * @return {Boolean} - * @api public - */ - -req.is = function(type){ - var ct = this.get('Content-Type'); - if (!ct) return false; - ct = ct.split(';')[0]; - if (!~type.indexOf('/')) type = mime.lookup(type); - if (~type.indexOf('*')) { - type = type.split('/'); - ct = ct.split('/'); - if ('*' == type[0] && type[1] == ct[1]) return true; - if ('*' == type[1] && type[0] == ct[0]) return true; - return false; - } - return !! ~ct.indexOf(type); -}; - -/** - * Return the protocol string "http" or "https" - * when requested with TLS. When the "trust proxy" - * setting is enabled the "X-Forwarded-Proto" header - * field will be trusted. If you're running behind - * a reverse proxy that supplies https for you this - * may be enabled. - * - * @return {String} - * @api public - */ - -req.__defineGetter__('protocol', function(){ - var trustProxy = this.app.get('trust proxy'); - return this.connection.encrypted - ? 'https' - : trustProxy - ? (this.get('X-Forwarded-Proto') || 'http') - : 'http'; -}); - -/** - * Short-hand for: - * - * req.protocol == 'https' - * - * @return {Boolean} - * @api public - */ - -req.__defineGetter__('secure', function(){ - return 'https' == this.protocol; -}); - -/** - * Return the remote address, or when - * "trust proxy" is `true` return - * the upstream addr. - * - * @return {String} - * @api public - */ - -req.__defineGetter__('ip', function(){ - return this.ips[0] || this.connection.remoteAddress; -}); - -/** - * When "trust proxy" is `true`, parse - * the "X-Forwarded-For" ip address list. - * - * For example if the value were "client, proxy1, proxy2" - * you would receive the array `["client", "proxy1", "proxy2"]` - * where "proxy2" is the furthest down-stream. - * - * @return {Array} - * @api public - */ - -req.__defineGetter__('ips', function(){ - var trustProxy = this.app.get('trust proxy'); - var val = this.get('X-Forwarded-For'); - return trustProxy && val - ? val.split(/ *, */) - : []; -}); - -/** - * Return basic auth credentials. - * - * Examples: - * - * // http://tobi:hello@example.com - * req.auth - * // => { username: 'tobi', password: 'hello' } - * - * @return {Object} or undefined - * @api public - */ - -req.__defineGetter__('auth', function(){ - // missing - var auth = this.get('Authorization'); - if (!auth) return; - - // malformed - var parts = auth.split(' '); - if ('basic' != parts[0].toLowerCase()) return; - if (!parts[1]) return; - auth = parts[1]; - - // credentials - auth = new Buffer(auth, 'base64').toString().match(/^([^:]*):(.*)$/); - if (!auth) return; - return { username: auth[1], password: auth[2] }; -}); - -/** - * Return subdomains as an array. - * - * Subdomains are the dot-separated parts of the host before the main domain of - * the app. By default, the domain of the app is assumed to be the last two - * parts of the host. This can be changed by setting "subdomain offset". - * - * For example, if the domain is "tobi.ferrets.example.com": - * If "subdomain offset" is not set, req.subdomains is `["ferrets", "tobi"]`. - * If "subdomain offset" is 3, req.subdomains is `["tobi"]`. - * - * @return {Array} - * @api public - */ - -req.__defineGetter__('subdomains', function(){ - var offset = this.app.get('subdomain offset'); - return this.get('Host') - .split('.') - .reverse() - .slice(offset); -}); - -/** - * Short-hand for `url.parse(req.url).pathname`. - * - * @return {String} - * @api public - */ - -req.__defineGetter__('path', function(){ - return parse(this).pathname; -}); - -/** - * Parse the "Host" header field hostname. - * - * @return {String} - * @api public - */ - -req.__defineGetter__('host', function(){ - return this.get('Host').split(':')[0]; -}); - -/** - * Check if the request is fresh, aka - * Last-Modified and/or the ETag - * still match. - * - * @return {Boolean} - * @api public - */ - -req.__defineGetter__('fresh', function(){ - var method = this.method; - var s = this.res.statusCode; - - // GET or HEAD for weak freshness validation only - if ('GET' != method && 'HEAD' != method) return false; - - // 2xx or 304 as per rfc2616 14.26 - if ((s >= 200 && s < 300) || 304 == s) { - return fresh(this.headers, this.res._headers); - } - - return false; -}); - -/** - * Check if the request is stale, aka - * "Last-Modified" and / or the "ETag" for the - * resource has changed. - * - * @return {Boolean} - * @api public - */ - -req.__defineGetter__('stale', function(){ - return !this.fresh; -}); - -/** - * Check if the request was an _XMLHttpRequest_. - * - * @return {Boolean} - * @api public - */ - -req.__defineGetter__('xhr', function(){ - var val = this.get('X-Requested-With') || ''; - return 'xmlhttprequest' == val.toLowerCase(); -}); diff --git a/node_modules/express/lib/response.js b/node_modules/express/lib/response.js deleted file mode 100644 index 2b66c88..0000000 --- a/node_modules/express/lib/response.js +++ /dev/null @@ -1,754 +0,0 @@ -/** - * Module dependencies. - */ - -var http = require('http') - , path = require('path') - , connect = require('connect') - , utils = connect.utils - , sign = require('cookie-signature').sign - , normalizeType = require('./utils').normalizeType - , normalizeTypes = require('./utils').normalizeTypes - , etag = require('./utils').etag - , statusCodes = http.STATUS_CODES - , cookie = require('cookie') - , send = require('send') - , mime = connect.mime - , basename = path.basename - , extname = path.extname - , join = path.join; - -/** - * Response prototype. - */ - -var res = module.exports = { - __proto__: http.ServerResponse.prototype -}; - -/** - * Set status `code`. - * - * @param {Number} code - * @return {ServerResponse} - * @api public - */ - -res.status = function(code){ - this.statusCode = code; - return this; -}; - -/** - * Set Link header field with the given `links`. - * - * Examples: - * - * res.links({ - * next: 'http://api.example.com/users?page=2', - * last: 'http://api.example.com/users?page=5' - * }); - * - * @param {Object} links - * @return {ServerResponse} - * @api public - */ - -res.links = function(links){ - return this.set('Link', Object.keys(links).map(function(rel){ - return '<' + links[rel] + '>; rel="' + rel + '"'; - }).join(', ')); -}; - -/** - * Send a response. - * - * Examples: - * - * res.send(new Buffer('wahoo')); - * res.send({ some: 'json' }); - * res.send('

      some html

      '); - * res.send(404, 'Sorry, cant find that'); - * res.send(404); - * - * @param {Mixed} body or status - * @param {Mixed} body - * @return {ServerResponse} - * @api public - */ - -res.send = function(body){ - var req = this.req - , head = 'HEAD' == req.method - , len; - - // allow status / body - if (2 == arguments.length) { - // res.send(body, status) backwards compat - if ('number' != typeof body && 'number' == typeof arguments[1]) { - this.statusCode = arguments[1]; - } else { - this.statusCode = body; - body = arguments[1]; - } - } - - switch (typeof body) { - // response status - case 'number': - this.get('Content-Type') || this.type('txt'); - this.statusCode = body; - body = http.STATUS_CODES[body]; - break; - // string defaulting to html - case 'string': - if (!this.get('Content-Type')) { - this.charset = this.charset || 'utf-8'; - this.type('html'); - } - break; - case 'boolean': - case 'object': - if (null == body) { - body = ''; - } else if (Buffer.isBuffer(body)) { - this.get('Content-Type') || this.type('bin'); - } else { - return this.json(body); - } - break; - } - - // populate Content-Length - if (undefined !== body && !this.get('Content-Length')) { - this.set('Content-Length', len = Buffer.isBuffer(body) - ? body.length - : Buffer.byteLength(body)); - } - - // ETag support - // TODO: W/ support - if (len > 1024) { - if (!this.get('ETag')) { - this.set('ETag', etag(body)); - } - } - - // freshness - if (req.fresh) this.statusCode = 304; - - // strip irrelevant headers - if (204 == this.statusCode || 304 == this.statusCode) { - this.removeHeader('Content-Type'); - this.removeHeader('Content-Length'); - this.removeHeader('Transfer-Encoding'); - body = ''; - } - - // respond - this.end(head ? null : body); - return this; -}; - -/** - * Send JSON response. - * - * Examples: - * - * res.json(null); - * res.json({ user: 'tj' }); - * res.json(500, 'oh noes!'); - * res.json(404, 'I dont have that'); - * - * @param {Mixed} obj or status - * @param {Mixed} obj - * @return {ServerResponse} - * @api public - */ - -res.json = function(obj){ - // allow status / body - if (2 == arguments.length) { - // res.json(body, status) backwards compat - if ('number' == typeof arguments[1]) { - this.statusCode = arguments[1]; - } else { - this.statusCode = obj; - obj = arguments[1]; - } - } - - // settings - var app = this.app; - var replacer = app.get('json replacer'); - var spaces = app.get('json spaces'); - var body = JSON.stringify(obj, replacer, spaces); - - // content-type - this.charset = this.charset || 'utf-8'; - this.get('Content-Type') || this.set('Content-Type', 'application/json'); - - return this.send(body); -}; - -/** - * Send JSON response with JSONP callback support. - * - * Examples: - * - * res.jsonp(null); - * res.jsonp({ user: 'tj' }); - * res.jsonp(500, 'oh noes!'); - * res.jsonp(404, 'I dont have that'); - * - * @param {Mixed} obj or status - * @param {Mixed} obj - * @return {ServerResponse} - * @api public - */ - -res.jsonp = function(obj){ - // allow status / body - if (2 == arguments.length) { - // res.json(body, status) backwards compat - if ('number' == typeof arguments[1]) { - this.statusCode = arguments[1]; - } else { - this.statusCode = obj; - obj = arguments[1]; - } - } - - // settings - var app = this.app; - var replacer = app.get('json replacer'); - var spaces = app.get('json spaces'); - var body = JSON.stringify(obj, replacer, spaces) - .replace(/\u2028/g, '\\u2028') - .replace(/\u2029/g, '\\u2029'); - var callback = this.req.query[app.get('jsonp callback name')]; - - // content-type - this.charset = this.charset || 'utf-8'; - this.set('Content-Type', 'application/json'); - - // jsonp - if (callback) { - this.set('Content-Type', 'text/javascript'); - var cb = callback.replace(/[^\[\]\w$.]/g, ''); - body = cb + ' && ' + cb + '(' + body + ');'; - } - - return this.send(body); -}; - -/** - * Transfer the file at the given `path`. - * - * Automatically sets the _Content-Type_ response header field. - * The callback `fn(err)` is invoked when the transfer is complete - * or when an error occurs. Be sure to check `res.sentHeader` - * if you wish to attempt responding, as the header and some data - * may have already been transferred. - * - * Options: - * - * - `maxAge` defaulting to 0 - * - `root` root directory for relative filenames - * - * Examples: - * - * The following example illustrates how `res.sendfile()` may - * be used as an alternative for the `static()` middleware for - * dynamic situations. The code backing `res.sendfile()` is actually - * the same code, so HTTP cache support etc is identical. - * - * app.get('/user/:uid/photos/:file', function(req, res){ - * var uid = req.params.uid - * , file = req.params.file; - * - * req.user.mayViewFilesFrom(uid, function(yes){ - * if (yes) { - * res.sendfile('/uploads/' + uid + '/' + file); - * } else { - * res.send(403, 'Sorry! you cant see that.'); - * } - * }); - * }); - * - * @param {String} path - * @param {Object|Function} options or fn - * @param {Function} fn - * @api public - */ - -res.sendfile = function(path, options, fn){ - var self = this - , req = self.req - , next = this.req.next - , options = options || {} - , done; - - // support function as second arg - if ('function' == typeof options) { - fn = options; - options = {}; - } - - // socket errors - req.socket.on('error', error); - - // errors - function error(err) { - if (done) return; - done = true; - - // clean up - cleanup(); - if (!self.headerSent) self.removeHeader('Content-Disposition'); - - // callback available - if (fn) return fn(err); - - // list in limbo if there's no callback - if (self.headerSent) return; - - // delegate - next(err); - } - - // streaming - function stream() { - if (done) return; - cleanup(); - if (fn) self.on('finish', fn); - } - - // cleanup - function cleanup() { - req.socket.removeListener('error', error); - } - - // transfer - var file = send(req, path); - if (options.root) file.root(options.root); - file.maxage(options.maxAge || 0); - file.on('error', error); - file.on('directory', next); - file.on('stream', stream); - file.pipe(this); - this.on('finish', cleanup); -}; - -/** - * Transfer the file at the given `path` as an attachment. - * - * Optionally providing an alternate attachment `filename`, - * and optional callback `fn(err)`. The callback is invoked - * when the data transfer is complete, or when an error has - * ocurred. Be sure to check `res.headerSent` if you plan to respond. - * - * This method uses `res.sendfile()`. - * - * @param {String} path - * @param {String|Function} filename or fn - * @param {Function} fn - * @api public - */ - -res.download = function(path, filename, fn){ - // support function as second arg - if ('function' == typeof filename) { - fn = filename; - filename = null; - } - - filename = filename || path; - this.set('Content-Disposition', 'attachment; filename="' + basename(filename) + '"'); - return this.sendfile(path, fn); -}; - -/** - * Set _Content-Type_ response header with `type` through `mime.lookup()` - * when it does not contain "/", or set the Content-Type to `type` otherwise. - * - * Examples: - * - * res.type('.html'); - * res.type('html'); - * res.type('json'); - * res.type('application/json'); - * res.type('png'); - * - * @param {String} type - * @return {ServerResponse} for chaining - * @api public - */ - -res.contentType = -res.type = function(type){ - return this.set('Content-Type', ~type.indexOf('/') - ? type - : mime.lookup(type)); -}; - -/** - * Respond to the Acceptable formats using an `obj` - * of mime-type callbacks. - * - * This method uses `req.accepted`, an array of - * acceptable types ordered by their quality values. - * When "Accept" is not present the _first_ callback - * is invoked, otherwise the first match is used. When - * no match is performed the server responds with - * 406 "Not Acceptable". - * - * Content-Type is set for you, however if you choose - * you may alter this within the callback using `res.type()` - * or `res.set('Content-Type', ...)`. - * - * res.format({ - * 'text/plain': function(){ - * res.send('hey'); - * }, - * - * 'text/html': function(){ - * res.send('

      hey

      '); - * }, - * - * 'appliation/json': function(){ - * res.send({ message: 'hey' }); - * } - * }); - * - * In addition to canonicalized MIME types you may - * also use extnames mapped to these types: - * - * res.format({ - * text: function(){ - * res.send('hey'); - * }, - * - * html: function(){ - * res.send('

      hey

      '); - * }, - * - * json: function(){ - * res.send({ message: 'hey' }); - * } - * }); - * - * By default Express passes an `Error` - * with a `.status` of 406 to `next(err)` - * if a match is not made. If you provide - * a `.default` callback it will be invoked - * instead. - * - * @param {Object} obj - * @return {ServerResponse} for chaining - * @api public - */ - -res.format = function(obj){ - var req = this.req - , next = req.next; - - var fn = obj.default; - if (fn) delete obj.default; - var keys = Object.keys(obj); - - var key = req.accepts(keys); - - this.set('Vary', 'Accept'); - - if (key) { - this.set('Content-Type', normalizeType(key)); - obj[key](req, this, next); - } else if (fn) { - fn(); - } else { - var err = new Error('Not Acceptable'); - err.status = 406; - err.types = normalizeTypes(keys); - next(err); - } - - return this; -}; - -/** - * Set _Content-Disposition_ header to _attachment_ with optional `filename`. - * - * @param {String} filename - * @return {ServerResponse} - * @api public - */ - -res.attachment = function(filename){ - if (filename) this.type(extname(filename)); - this.set('Content-Disposition', filename - ? 'attachment; filename="' + basename(filename) + '"' - : 'attachment'); - return this; -}; - -/** - * Set header `field` to `val`, or pass - * an object of header fields. - * - * Examples: - * - * res.set('Foo', ['bar', 'baz']); - * res.set('Accept', 'application/json'); - * res.set({ Accept: 'text/plain', 'X-API-Key': 'tobi' }); - * - * Aliased as `res.header()`. - * - * @param {String|Object|Array} field - * @param {String} val - * @return {ServerResponse} for chaining - * @api public - */ - -res.set = -res.header = function(field, val){ - if (2 == arguments.length) { - if (Array.isArray(val)) val = val.map(String); - else val = String(val); - this.setHeader(field, val); - } else { - for (var key in field) { - this.set(key, field[key]); - } - } - return this; -}; - -/** - * Get value for header `field`. - * - * @param {String} field - * @return {String} - * @api public - */ - -res.get = function(field){ - return this.getHeader(field); -}; - -/** - * Clear cookie `name`. - * - * @param {String} name - * @param {Object} options - * @param {ServerResponse} for chaining - * @api public - */ - -res.clearCookie = function(name, options){ - var opts = { expires: new Date(1), path: '/' }; - return this.cookie(name, '', options - ? utils.merge(opts, options) - : opts); -}; - -/** - * Set cookie `name` to `val`, with the given `options`. - * - * Options: - * - * - `maxAge` max-age in milliseconds, converted to `expires` - * - `signed` sign the cookie - * - `path` defaults to "/" - * - * Examples: - * - * // "Remember Me" for 15 minutes - * res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true }); - * - * // save as above - * res.cookie('rememberme', '1', { maxAge: 900000, httpOnly: true }) - * - * @param {String} name - * @param {String|Object} val - * @param {Options} options - * @api public - */ - -res.cookie = function(name, val, options){ - options = utils.merge({}, options); - var secret = this.req.secret; - var signed = options.signed; - if (signed && !secret) throw new Error('connect.cookieParser("secret") required for signed cookies'); - if ('object' == typeof val) val = 'j:' + JSON.stringify(val); - if (signed) val = 's:' + sign(val, secret); - if ('maxAge' in options) { - options.expires = new Date(Date.now() + options.maxAge); - options.maxAge /= 1000; - } - if (null == options.path) options.path = '/'; - this.set('Set-Cookie', cookie.serialize(name, String(val), options)); - return this; -}; - - -/** - * Set the location header to `url`. - * - * The given `url` can also be the name of a mapped url, for - * example by default express supports "back" which redirects - * to the _Referrer_ or _Referer_ headers or "/". - * - * Examples: - * - * res.location('/foo/bar').; - * res.location('http://example.com'); - * res.location('../login'); // /blog/post/1 -> /blog/login - * - * Mounting: - * - * When an application is mounted and `res.location()` - * is given a path that does _not_ lead with "/" it becomes - * relative to the mount-point. For example if the application - * is mounted at "/blog", the following would become "/blog/login". - * - * res.location('login'); - * - * While the leading slash would result in a location of "/login": - * - * res.location('/login'); - * - * @param {String} url - * @api public - */ - -res.location = function(url){ - var app = this.app - , req = this.req; - - // setup redirect map - var map = { back: req.get('Referrer') || '/' }; - - // perform redirect - url = map[url] || url; - - // relative - if (!~url.indexOf('://') && 0 != url.indexOf('//')) { - var path = app.path(); - - // relative to path - if ('.' == url[0]) { - url = req.path + '/' + url; - // relative to mount-point - } else if ('/' != url[0]) { - url = path + '/' + url; - } - } - - // Respond - this.set('Location', url); - return this; -}; - -/** - * Redirect to the given `url` with optional response `status` - * defaulting to 302. - * - * The resulting `url` is determined by `res.location()`, so - * it will play nicely with mounted apps, relative paths, - * `"back"` etc. - * - * Examples: - * - * res.redirect('/foo/bar'); - * res.redirect('http://example.com'); - * res.redirect(301, 'http://example.com'); - * res.redirect('http://example.com', 301); - * res.redirect('../login'); // /blog/post/1 -> /blog/login - * - * @param {String} url - * @param {Number} code - * @api public - */ - -res.redirect = function(url){ - var app = this.app - , head = 'HEAD' == this.req.method - , status = 302 - , body; - - // allow status / url - if (2 == arguments.length) { - if ('number' == typeof url) { - status = url; - url = arguments[1]; - } else { - status = arguments[1]; - } - } - - // Set location header - this.location(url); - url = this.get('Location'); - - // Support text/{plain,html} by default - this.format({ - text: function(){ - body = statusCodes[status] + '. Redirecting to ' + encodeURI(url); - }, - - html: function(){ - var u = utils.escape(url); - body = '
      '; - }, - - default: function(){ - body = ''; - } - }); - - // Respond - this.statusCode = status; - this.set('Content-Length', Buffer.byteLength(body)); - this.end(head ? null : body); -}; - -/** - * Render `view` with the given `options` and optional callback `fn`. - * When a callback function is given a response will _not_ be made - * automatically, otherwise a response of _200_ and _text/html_ is given. - * - * Options: - * - * - `cache` boolean hinting to the engine it should cache - * - `filename` filename of the view being rendered - * - * @param {String} view - * @param {Object|Function} options or callback function - * @param {Function} fn - * @api public - */ - -res.render = function(view, options, fn){ - var self = this - , options = options || {} - , req = this.req - , app = req.app; - - // support callback function as second arg - if ('function' == typeof options) { - fn = options, options = {}; - } - - // merge res.locals - options._locals = self.locals; - - // default callback to respond - fn = fn || function(err, str){ - if (err) return req.next(err); - self.send(str); - }; - - // render - app.render(view, options, fn); -}; diff --git a/node_modules/express/lib/router/index.js b/node_modules/express/lib/router/index.js deleted file mode 100644 index 662dc29..0000000 --- a/node_modules/express/lib/router/index.js +++ /dev/null @@ -1,273 +0,0 @@ -/** - * Module dependencies. - */ - -var Route = require('./route') - , utils = require('../utils') - , methods = require('methods') - , debug = require('debug')('express:router') - , parse = require('connect').utils.parseUrl; - -/** - * Expose `Router` constructor. - */ - -exports = module.exports = Router; - -/** - * Initialize a new `Router` with the given `options`. - * - * @param {Object} options - * @api private - */ - -function Router(options) { - options = options || {}; - var self = this; - this.map = {}; - this.params = {}; - this._params = []; - this.caseSensitive = options.caseSensitive; - this.strict = options.strict; - this.middleware = function router(req, res, next){ - self._dispatch(req, res, next); - }; -} - -/** - * Register a param callback `fn` for the given `name`. - * - * @param {String|Function} name - * @param {Function} fn - * @return {Router} for chaining - * @api public - */ - -Router.prototype.param = function(name, fn){ - // param logic - if ('function' == typeof name) { - this._params.push(name); - return; - } - - // apply param functions - var params = this._params - , len = params.length - , ret; - - for (var i = 0; i < len; ++i) { - if (ret = params[i](name, fn)) { - fn = ret; - } - } - - // ensure we end up with a - // middleware function - if ('function' != typeof fn) { - throw new Error('invalid param() call for ' + name + ', got ' + fn); - } - - (this.params[name] = this.params[name] || []).push(fn); - return this; -}; - -/** - * Route dispatcher aka the route "middleware". - * - * @param {IncomingMessage} req - * @param {ServerResponse} res - * @param {Function} next - * @api private - */ - -Router.prototype._dispatch = function(req, res, next){ - var params = this.params - , self = this; - - debug('dispatching %s %s (%s)', req.method, req.url, req.originalUrl); - - // route dispatch - (function pass(i, err){ - var paramCallbacks - , paramIndex = 0 - , paramVal - , route - , keys - , key; - - // match next route - function nextRoute(err) { - pass(req._route_index + 1, err); - } - - // match route - req.route = route = self.matchRequest(req, i); - - // no route - if (!route) return next(err); - debug('matched %s %s', route.method, route.path); - - // we have a route - // start at param 0 - req.params = route.params; - keys = route.keys; - i = 0; - - // param callbacks - function param(err) { - paramIndex = 0; - key = keys[i++]; - paramVal = key && req.params[key.name]; - paramCallbacks = key && params[key.name]; - - try { - if ('route' == err) { - nextRoute(); - } else if (err) { - i = 0; - callbacks(err); - } else if (paramCallbacks && undefined !== paramVal) { - paramCallback(); - } else if (key) { - param(); - } else { - i = 0; - callbacks(); - } - } catch (err) { - param(err); - } - }; - - param(err); - - // single param callbacks - function paramCallback(err) { - var fn = paramCallbacks[paramIndex++]; - if (err || !fn) return param(err); - fn(req, res, paramCallback, paramVal, key.name); - } - - // invoke route callbacks - function callbacks(err) { - var fn = route.callbacks[i++]; - try { - if ('route' == err) { - nextRoute(); - } else if (err && fn) { - if (fn.length < 4) return callbacks(err); - fn(err, req, res, callbacks); - } else if (fn) { - if (fn.length < 4) return fn(req, res, callbacks); - callbacks(); - } else { - nextRoute(err); - } - } catch (err) { - callbacks(err); - } - } - })(0); -}; - -/** - * Attempt to match a route for `req` - * with optional starting index of `i` - * defaulting to 0. - * - * @param {IncomingMessage} req - * @param {Number} i - * @return {Route} - * @api private - */ - -Router.prototype.matchRequest = function(req, i, head){ - var method = req.method.toLowerCase() - , url = parse(req) - , path = url.pathname - , routes = this.map - , i = i || 0 - , route; - - // HEAD support - if (!head && 'head' == method) { - route = this.matchRequest(req, i, true); - if (route) return route; - method = 'get'; - } - - // routes for this method - if (routes = routes[method]) { - - // matching routes - for (var len = routes.length; i < len; ++i) { - route = routes[i]; - if (route.match(path)) { - req._route_index = i; - return route; - } - } - } -}; - -/** - * Attempt to match a route for `method` - * and `url` with optional starting - * index of `i` defaulting to 0. - * - * @param {String} method - * @param {String} url - * @param {Number} i - * @return {Route} - * @api private - */ - -Router.prototype.match = function(method, url, i, head){ - var req = { method: method, url: url }; - return this.matchRequest(req, i, head); -}; - -/** - * Route `method`, `path`, and one or more callbacks. - * - * @param {String} method - * @param {String} path - * @param {Function} callback... - * @return {Router} for chaining - * @api private - */ - -Router.prototype.route = function(method, path, callbacks){ - var method = method.toLowerCase() - , callbacks = utils.flatten([].slice.call(arguments, 2)); - - // ensure path was given - if (!path) throw new Error('Router#' + method + '() requires a path'); - - // ensure all callbacks are functions - callbacks.forEach(function(fn, i){ - if ('function' == typeof fn) return; - var type = {}.toString.call(fn); - var msg = '.' + method + '() requires callback functions but got a ' + type; - throw new Error(msg); - }); - - // create the route - debug('defined %s %s', method, path); - var route = new Route(method, path, callbacks, { - sensitive: this.caseSensitive, - strict: this.strict - }); - - // add it - (this.map[method] = this.map[method] || []).push(route); - return this; -}; - -methods.forEach(function(method){ - Router.prototype[method] = function(path){ - var args = [method].concat([].slice.call(arguments)); - this.route.apply(this, args); - return this; - }; -}); diff --git a/node_modules/express/lib/router/route.js b/node_modules/express/lib/router/route.js deleted file mode 100644 index c1a0b5e..0000000 --- a/node_modules/express/lib/router/route.js +++ /dev/null @@ -1,72 +0,0 @@ - -/** - * Module dependencies. - */ - -var utils = require('../utils'); - -/** - * Expose `Route`. - */ - -module.exports = Route; - -/** - * Initialize `Route` with the given HTTP `method`, `path`, - * and an array of `callbacks` and `options`. - * - * Options: - * - * - `sensitive` enable case-sensitive routes - * - `strict` enable strict matching for trailing slashes - * - * @param {String} method - * @param {String} path - * @param {Array} callbacks - * @param {Object} options. - * @api private - */ - -function Route(method, path, callbacks, options) { - options = options || {}; - this.path = path; - this.method = method; - this.callbacks = callbacks; - this.regexp = utils.pathRegexp(path - , this.keys = [] - , options.sensitive - , options.strict); -} - -/** - * Check if this route matches `path`, if so - * populate `.params`. - * - * @param {String} path - * @return {Boolean} - * @api private - */ - -Route.prototype.match = function(path){ - var keys = this.keys - , params = this.params = [] - , m = this.regexp.exec(path); - - if (!m) return false; - - for (var i = 1, len = m.length; i < len; ++i) { - var key = keys[i - 1]; - - var val = 'string' == typeof m[i] - ? decodeURIComponent(m[i]) - : m[i]; - - if (key) { - params[key.name] = val; - } else { - params.push(val); - } - } - - return true; -}; diff --git a/node_modules/express/lib/utils.js b/node_modules/express/lib/utils.js deleted file mode 100644 index 8b1da1a..0000000 --- a/node_modules/express/lib/utils.js +++ /dev/null @@ -1,282 +0,0 @@ - -/** - * Module dependencies. - */ - -var mime = require('connect').mime - , crc32 = require('buffer-crc32'); - -/** - * Return ETag for `body`. - * - * @param {String|Buffer} body - * @return {String} - * @api private - */ - -exports.etag = function(body){ - return '"' + crc32.signed(body) + '"'; -}; - -/** - * Make `locals()` bound to the given `obj`. - * - * This is used for `app.locals` and `res.locals`. - * - * @param {Object} obj - * @return {Function} - * @api private - */ - -exports.locals = function(obj){ - obj.viewCallbacks = obj.viewCallbacks || []; - - function locals(obj){ - for (var key in obj) locals[key] = obj[key]; - return obj; - }; - - return locals; -}; - -/** - * Check if `path` looks absolute. - * - * @param {String} path - * @return {Boolean} - * @api private - */ - -exports.isAbsolute = function(path){ - if ('/' == path[0]) return true; - if (':' == path[1] && '\\' == path[2]) return true; -}; - -/** - * Flatten the given `arr`. - * - * @param {Array} arr - * @return {Array} - * @api private - */ - -exports.flatten = function(arr, ret){ - var ret = ret || [] - , len = arr.length; - for (var i = 0; i < len; ++i) { - if (Array.isArray(arr[i])) { - exports.flatten(arr[i], ret); - } else { - ret.push(arr[i]); - } - } - return ret; -}; - -/** - * Normalize the given `type`, for example "html" becomes "text/html". - * - * @param {String} type - * @return {String} - * @api private - */ - -exports.normalizeType = function(type){ - return ~type.indexOf('/') ? type : mime.lookup(type); -}; - -/** - * Normalize `types`, for example "html" becomes "text/html". - * - * @param {Array} types - * @return {Array} - * @api private - */ - -exports.normalizeTypes = function(types){ - var ret = []; - - for (var i = 0; i < types.length; ++i) { - ret.push(~types[i].indexOf('/') - ? types[i] - : mime.lookup(types[i])); - } - - return ret; -}; - -/** - * Return the acceptable type in `types`, if any. - * - * @param {Array} types - * @param {String} str - * @return {String} - * @api private - */ - -exports.acceptsArray = function(types, str){ - // accept anything when Accept is not present - if (!str) return types[0]; - - // parse - var accepted = exports.parseAccept(str) - , normalized = exports.normalizeTypes(types) - , len = accepted.length; - - for (var i = 0; i < len; ++i) { - for (var j = 0, jlen = types.length; j < jlen; ++j) { - if (exports.accept(normalized[j].split('/'), accepted[i])) { - return types[j]; - } - } - } -}; - -/** - * Check if `type(s)` are acceptable based on - * the given `str`. - * - * @param {String|Array} type(s) - * @param {String} str - * @return {Boolean|String} - * @api private - */ - -exports.accepts = function(type, str){ - if ('string' == typeof type) type = type.split(/ *, */); - return exports.acceptsArray(type, str); -}; - -/** - * Check if `type` array is acceptable for `other`. - * - * @param {Array} type - * @param {Object} other - * @return {Boolean} - * @api private - */ - -exports.accept = function(type, other){ - return (type[0] == other.type || '*' == other.type) - && (type[1] == other.subtype || '*' == other.subtype); -}; - -/** - * Parse accept `str`, returning - * an array objects containing - * `.type` and `.subtype` along - * with the values provided by - * `parseQuality()`. - * - * @param {Type} name - * @return {Type} - * @api private - */ - -exports.parseAccept = function(str){ - return exports - .parseQuality(str) - .map(function(obj){ - var parts = obj.value.split('/'); - obj.type = parts[0]; - obj.subtype = parts[1]; - return obj; - }); -}; - -/** - * Parse quality `str`, returning an - * array of objects with `.value` and - * `.quality`. - * - * @param {Type} name - * @return {Type} - * @api private - */ - -exports.parseQuality = function(str){ - return str - .split(/ *, */) - .map(quality) - .filter(function(obj){ - return obj.quality; - }) - .sort(function(a, b){ - return b.quality - a.quality; - }); -}; - -/** - * Parse quality `str` returning an - * object with `.value` and `.quality`. - * - * @param {String} str - * @return {Object} - * @api private - */ - -function quality(str) { - var parts = str.split(/ *; */) - , val = parts[0]; - - var q = parts[1] - ? parseFloat(parts[1].split(/ *= */)[1]) - : 1; - - return { value: val, quality: q }; -} - -/** - * Escape special characters in the given string of html. - * - * @param {String} html - * @return {String} - * @api private - */ - -exports.escape = function(html) { - return String(html) - .replace(/&/g, '&') - .replace(/"/g, '"') - .replace(//g, '>'); -}; - -/** - * Normalize the given path string, - * returning a regular expression. - * - * An empty array should be passed, - * which will contain the placeholder - * key names. For example "/user/:id" will - * then contain ["id"]. - * - * @param {String|RegExp|Array} path - * @param {Array} keys - * @param {Boolean} sensitive - * @param {Boolean} strict - * @return {RegExp} - * @api private - */ - -exports.pathRegexp = function(path, keys, sensitive, strict) { - if (path instanceof RegExp) return path; - if (Array.isArray(path)) path = '(' + path.join('|') + ')'; - path = path - .concat(strict ? '' : '/?') - .replace(/\/\(/g, '(?:/') - .replace(/(\/)?(\.)?:(\w+)(?:(\(.*?\)))?(\?)?(\*)?/g, function(_, slash, format, key, capture, optional, star){ - keys.push({ name: key, optional: !! optional }); - slash = slash || ''; - return '' - + (optional ? '' : slash) - + '(?:' - + (optional ? slash : '') - + (format || '') + (capture || (format && '([^/.]+?)' || '([^/]+?)')) + ')' - + (optional || '') - + (star ? '(/*)?' : ''); - }) - .replace(/([\/.])/g, '\\$1') - .replace(/\*/g, '(.*)'); - return new RegExp('^' + path + '$', sensitive ? '' : 'i'); -} \ No newline at end of file diff --git a/node_modules/express/lib/view.js b/node_modules/express/lib/view.js deleted file mode 100644 index c7399a4..0000000 --- a/node_modules/express/lib/view.js +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Module dependencies. - */ - -var path = require('path') - , fs = require('fs') - , utils = require('./utils') - , dirname = path.dirname - , basename = path.basename - , extname = path.extname - , exists = fs.existsSync || path.existsSync - , join = path.join; - -/** - * Expose `View`. - */ - -module.exports = View; - -/** - * Initialize a new `View` with the given `name`. - * - * Options: - * - * - `defaultEngine` the default template engine name - * - `engines` template engine require() cache - * - `root` root path for view lookup - * - * @param {String} name - * @param {Object} options - * @api private - */ - -function View(name, options) { - options = options || {}; - this.name = name; - this.root = options.root; - var engines = options.engines; - this.defaultEngine = options.defaultEngine; - var ext = this.ext = extname(name); - if (!ext) name += (ext = this.ext = ('.' != this.defaultEngine[0] ? '.' : '') + this.defaultEngine); - this.engine = engines[ext] || (engines[ext] = require(ext.slice(1)).__express); - this.path = this.lookup(name); -} - -/** - * Lookup view by the given `path` - * - * @param {String} path - * @return {String} - * @api private - */ - -View.prototype.lookup = function(path){ - var ext = this.ext; - - // . - if (!utils.isAbsolute(path)) path = join(this.root, path); - if (exists(path)) return path; - - // /index. - path = join(dirname(path), basename(path, ext), 'index' + ext); - if (exists(path)) return path; -}; - -/** - * Render with the given `options` and callback `fn(err, str)`. - * - * @param {Object} options - * @param {Function} fn - * @api private - */ - -View.prototype.render = function(options, fn){ - this.engine(this.path, options, fn); -}; diff --git a/node_modules/express/node_modules/buffer-crc32/.npmignore b/node_modules/express/node_modules/buffer-crc32/.npmignore deleted file mode 100644 index b512c09..0000000 --- a/node_modules/express/node_modules/buffer-crc32/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules \ No newline at end of file diff --git a/node_modules/express/node_modules/buffer-crc32/.travis.yml b/node_modules/express/node_modules/buffer-crc32/.travis.yml deleted file mode 100644 index 7a902e8..0000000 --- a/node_modules/express/node_modules/buffer-crc32/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -language: node_js -node_js: - - 0.6 - - 0.8 -notifications: - email: - recipients: - - brianloveswords@gmail.com \ No newline at end of file diff --git a/node_modules/express/node_modules/buffer-crc32/README.md b/node_modules/express/node_modules/buffer-crc32/README.md deleted file mode 100644 index 4ad5d64..0000000 --- a/node_modules/express/node_modules/buffer-crc32/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# buffer-crc32 - -[![Build Status](https://secure.travis-ci.org/brianloveswords/buffer-crc32.png?branch=master)](http://travis-ci.org/brianloveswords/buffer-crc32) - -crc32 that works with binary data and fancy character sets, outputs -buffer, signed or unsigned data and has tests. - -Derived from the sample CRC implementation in the PNG specification: http://www.w3.org/TR/PNG/#D-CRCAppendix - -# install -``` -npm install buffer-crc32 -``` - -# example -```js -var crc32 = require('buffer-crc32'); -// works with buffers -var buf = Buffer([[0x00, 0x73, 0x75, 0x70, 0x20, 0x62, 0x72, 0x6f, 0x00]) -crc32(buf) // -> - -// has convenience methods for getting signed or unsigned ints -crc32.signed(buf) // -> -1805997238 -crc32.unsigned(buf) // -> 2488970058 - -// will cast to buffer if given a string, so you can -// directly use foreign characters safely -crc32('自動販売機') // -> -``` - -# tests -This was tested against the output of zlib's crc32 method. You can run -the tests with`npm test` (requires tap) diff --git a/node_modules/express/node_modules/buffer-crc32/index.js b/node_modules/express/node_modules/buffer-crc32/index.js deleted file mode 100644 index ab0e19e..0000000 --- a/node_modules/express/node_modules/buffer-crc32/index.js +++ /dev/null @@ -1,84 +0,0 @@ -var Buffer = require('buffer').Buffer; - -var CRC_TABLE = [ - 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, - 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, - 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, - 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, - 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, - 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, - 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, - 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, - 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, - 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, - 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, - 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, - 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, - 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, - 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, - 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, - 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, - 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, - 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, - 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, - 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, - 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, - 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, - 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, - 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, - 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, - 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, - 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, - 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, - 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, - 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, - 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, - 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, - 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, - 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, - 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, - 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, - 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, - 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, - 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, - 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, - 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, - 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, - 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, - 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, - 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, - 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, - 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, - 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, - 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, - 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, - 0x2d02ef8d -]; - -function bufferizeInt(num) { - var tmp = Buffer(4); - tmp.writeInt32BE(num, 0); - return tmp; -} - -function _crc32(buf) { - if (!Buffer.isBuffer(buf)) - buf = Buffer(buf); - var crc = 0xffffffff; - for (var n = 0; n < buf.length; n++) { - crc = CRC_TABLE[(crc ^ buf[n]) & 0xff] ^ (crc >>> 8); - } - return (crc ^ 0xffffffff); -} - -function crc32() { - return bufferizeInt(_crc32.apply(null, arguments)); -} -crc32.signed = function () { - return _crc32.apply(null, arguments); -}; -crc32.unsigned = function () { - return crc32.apply(null, arguments).readUInt32BE(0); -}; - -module.exports = crc32; diff --git a/node_modules/express/node_modules/buffer-crc32/package.json b/node_modules/express/node_modules/buffer-crc32/package.json deleted file mode 100644 index d9b0b51..0000000 --- a/node_modules/express/node_modules/buffer-crc32/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "author": { - "name": "Brian J. Brennan", - "email": "brianloveswords@gmail.com", - "url": "http://bjb.io" - }, - "name": "buffer-crc32", - "description": "A pure javascript CRC32 algorithm that plays nice with binary data", - "version": "0.1.1", - "homepage": "https://github.com/brianloveswords/buffer-crc32", - "repository": { - "type": "git", - "url": "git://github.com/brianloveswords/buffer-crc32.git" - }, - "main": "index.js", - "scripts": { - "test": "./node_modules/.bin/tap tests/*.test.js" - }, - "dependencies": {}, - "devDependencies": { - "tap": "~0.2.5" - }, - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "readme": "# buffer-crc32\n\n[![Build Status](https://secure.travis-ci.org/brianloveswords/buffer-crc32.png?branch=master)](http://travis-ci.org/brianloveswords/buffer-crc32)\n\ncrc32 that works with binary data and fancy character sets, outputs\nbuffer, signed or unsigned data and has tests.\n\nDerived from the sample CRC implementation in the PNG specification: http://www.w3.org/TR/PNG/#D-CRCAppendix\n\n# install\n```\nnpm install buffer-crc32\n```\n\n# example\n```js\nvar crc32 = require('buffer-crc32');\n// works with buffers\nvar buf = Buffer([[0x00, 0x73, 0x75, 0x70, 0x20, 0x62, 0x72, 0x6f, 0x00])\ncrc32(buf) // -> \n\n// has convenience methods for getting signed or unsigned ints\ncrc32.signed(buf) // -> -1805997238\ncrc32.unsigned(buf) // -> 2488970058\n\n// will cast to buffer if given a string, so you can\n// directly use foreign characters safely\ncrc32('自動販売機') // -> \n```\n\n# tests\nThis was tested against the output of zlib's crc32 method. You can run\nthe tests with`npm test` (requires tap)\n", - "_id": "buffer-crc32@0.1.1", - "_from": "buffer-crc32@0.1.1" -} diff --git a/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js b/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js deleted file mode 100644 index d4767e3..0000000 --- a/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js +++ /dev/null @@ -1,52 +0,0 @@ -var crc32 = require('..'); -var test = require('tap').test; - -test('simple crc32 is no problem', function (t) { - var input = Buffer('hey sup bros'); - var expected = Buffer([0x47, 0xfa, 0x55, 0x70]); - t.same(crc32(input), expected); - t.end(); -}); - -test('another simple one', function (t) { - var input = Buffer('IEND'); - var expected = Buffer([0xae, 0x42, 0x60, 0x82]); - t.same(crc32(input), expected); - t.end(); -}); - -test('slightly more complex', function (t) { - var input = Buffer([0x00, 0x00, 0x00]); - var expected = Buffer([0xff, 0x41, 0xd9, 0x12]); - t.same(crc32(input), expected); - t.end(); -}); - -test('complex crc32 gets calculated like a champ', function (t) { - var input = Buffer('शीर्षक'); - var expected = Buffer([0x17, 0xb8, 0xaf, 0xf1]); - t.same(crc32(input), expected); - t.end(); -}); - -test('casts to buffer if necessary', function (t) { - var input = 'शीर्षक'; - var expected = Buffer([0x17, 0xb8, 0xaf, 0xf1]); - t.same(crc32(input), expected); - t.end(); -}); - -test('can do unsigned', function (t) { - var input = 'ham sandwich'; - var expected = -1891873021; - t.same(crc32.signed(input), expected); - t.end(); -}); - -test('can do signed', function (t) { - var input = 'bear sandwich'; - var expected = 3711466352; - t.same(crc32.unsigned(input), expected); - t.end(); -}); - diff --git a/node_modules/express/node_modules/commander/.npmignore b/node_modules/express/node_modules/commander/.npmignore deleted file mode 100644 index f1250e5..0000000 --- a/node_modules/express/node_modules/commander/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -support -test -examples -*.sock diff --git a/node_modules/express/node_modules/commander/.travis.yml b/node_modules/express/node_modules/commander/.travis.yml deleted file mode 100644 index f1d0f13..0000000 --- a/node_modules/express/node_modules/commander/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.4 - - 0.6 diff --git a/node_modules/express/node_modules/commander/History.md b/node_modules/express/node_modules/commander/History.md deleted file mode 100644 index 4961d2e..0000000 --- a/node_modules/express/node_modules/commander/History.md +++ /dev/null @@ -1,107 +0,0 @@ - -0.6.1 / 2012-06-01 -================== - - * Added: append (yes or no) on confirmation - * Added: allow node.js v0.7.x - -0.6.0 / 2012-04-10 -================== - - * Added `.prompt(obj, callback)` support. Closes #49 - * Added default support to .choose(). Closes #41 - * Fixed the choice example - -0.5.1 / 2011-12-20 -================== - - * Fixed `password()` for recent nodes. Closes #36 - -0.5.0 / 2011-12-04 -================== - - * Added sub-command option support [itay] - -0.4.3 / 2011-12-04 -================== - - * Fixed custom help ordering. Closes #32 - -0.4.2 / 2011-11-24 -================== - - * Added travis support - * Fixed: line-buffered input automatically trimmed. Closes #31 - -0.4.1 / 2011-11-18 -================== - - * Removed listening for "close" on --help - -0.4.0 / 2011-11-15 -================== - - * Added support for `--`. Closes #24 - -0.3.3 / 2011-11-14 -================== - - * Fixed: wait for close event when writing help info [Jerry Hamlet] - -0.3.2 / 2011-11-01 -================== - - * Fixed long flag definitions with values [felixge] - -0.3.1 / 2011-10-31 -================== - - * Changed `--version` short flag to `-V` from `-v` - * Changed `.version()` so it's configurable [felixge] - -0.3.0 / 2011-10-31 -================== - - * Added support for long flags only. Closes #18 - -0.2.1 / 2011-10-24 -================== - - * "node": ">= 0.4.x < 0.7.0". Closes #20 - -0.2.0 / 2011-09-26 -================== - - * Allow for defaults that are not just boolean. Default peassignment only occurs for --no-*, optional, and required arguments. [Jim Isaacs] - -0.1.0 / 2011-08-24 -================== - - * Added support for custom `--help` output - -0.0.5 / 2011-08-18 -================== - - * Changed: when the user enters nothing prompt for password again - * Fixed issue with passwords beginning with numbers [NuckChorris] - -0.0.4 / 2011-08-15 -================== - - * Fixed `Commander#args` - -0.0.3 / 2011-08-15 -================== - - * Added default option value support - -0.0.2 / 2011-08-15 -================== - - * Added mask support to `Command#password(str[, mask], fn)` - * Added `Command#password(str, fn)` - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/node_modules/express/node_modules/commander/Makefile b/node_modules/express/node_modules/commander/Makefile deleted file mode 100644 index 0074625..0000000 --- a/node_modules/express/node_modules/commander/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - -TESTS = $(shell find test/test.*.js) - -test: - @./test/run $(TESTS) - -.PHONY: test \ No newline at end of file diff --git a/node_modules/express/node_modules/commander/Readme.md b/node_modules/express/node_modules/commander/Readme.md deleted file mode 100644 index b8328c3..0000000 --- a/node_modules/express/node_modules/commander/Readme.md +++ /dev/null @@ -1,262 +0,0 @@ -# Commander.js - - The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/visionmedia/commander). - - [![Build Status](https://secure.travis-ci.org/visionmedia/commander.js.png)](http://travis-ci.org/visionmedia/commander.js) - -## Installation - - $ npm install commander - -## Option parsing - - Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options. - -```js -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var program = require('commander'); - -program - .version('0.0.1') - .option('-p, --peppers', 'Add peppers') - .option('-P, --pineapple', 'Add pineapple') - .option('-b, --bbq', 'Add bbq sauce') - .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble') - .parse(process.argv); - -console.log('you ordered a pizza with:'); -if (program.peppers) console.log(' - peppers'); -if (program.pineapple) console.log(' - pineappe'); -if (program.bbq) console.log(' - bbq'); -console.log(' - %s cheese', program.cheese); -``` - - Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc. - -## Automated --help - - The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free: - -``` - $ ./examples/pizza --help - - Usage: pizza [options] - - Options: - - -V, --version output the version number - -p, --peppers Add peppers - -P, --pineapple Add pineappe - -b, --bbq Add bbq sauce - -c, --cheese Add the specified type of cheese [marble] - -h, --help output usage information - -``` - -## Coercion - -```js -function range(val) { - return val.split('..').map(Number); -} - -function list(val) { - return val.split(','); -} - -program - .version('0.0.1') - .usage('[options] ') - .option('-i, --integer ', 'An integer argument', parseInt) - .option('-f, --float ', 'A float argument', parseFloat) - .option('-r, --range ..', 'A range', range) - .option('-l, --list ', 'A list', list) - .option('-o, --optional [value]', 'An optional value') - .parse(process.argv); - -console.log(' int: %j', program.integer); -console.log(' float: %j', program.float); -console.log(' optional: %j', program.optional); -program.range = program.range || []; -console.log(' range: %j..%j', program.range[0], program.range[1]); -console.log(' list: %j', program.list); -console.log(' args: %j', program.args); -``` - -## Custom help - - You can display arbitrary `-h, --help` information - by listening for "--help". Commander will automatically - exit once you are done so that the remainder of your program - does not execute causing undesired behaviours, for example - in the following executable "stuff" will not output when - `--help` is used. - -```js -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var program = require('../'); - -function list(val) { - return val.split(',').map(Number); -} - -program - .version('0.0.1') - .option('-f, --foo', 'enable some foo') - .option('-b, --bar', 'enable some bar') - .option('-B, --baz', 'enable some baz'); - -// must be before .parse() since -// node's emit() is immediate - -program.on('--help', function(){ - console.log(' Examples:'); - console.log(''); - console.log(' $ custom-help --help'); - console.log(' $ custom-help -h'); - console.log(''); -}); - -program.parse(process.argv); - -console.log('stuff'); -``` - -yielding the following help output: - -``` - -Usage: custom-help [options] - -Options: - - -h, --help output usage information - -V, --version output the version number - -f, --foo enable some foo - -b, --bar enable some bar - -B, --baz enable some baz - -Examples: - - $ custom-help --help - $ custom-help -h - -``` - -## .prompt(msg, fn) - - Single-line prompt: - -```js -program.prompt('name: ', function(name){ - console.log('hi %s', name); -}); -``` - - Multi-line prompt: - -```js -program.prompt('description:', function(name){ - console.log('hi %s', name); -}); -``` - - Coercion: - -```js -program.prompt('Age: ', Number, function(age){ - console.log('age: %j', age); -}); -``` - -```js -program.prompt('Birthdate: ', Date, function(date){ - console.log('date: %s', date); -}); -``` - -## .password(msg[, mask], fn) - -Prompt for password without echoing: - -```js -program.password('Password: ', function(pass){ - console.log('got "%s"', pass); - process.stdin.destroy(); -}); -``` - -Prompt for password with mask char "*": - -```js -program.password('Password: ', '*', function(pass){ - console.log('got "%s"', pass); - process.stdin.destroy(); -}); -``` - -## .confirm(msg, fn) - - Confirm with the given `msg`: - -```js -program.confirm('continue? ', function(ok){ - console.log(' got %j', ok); -}); -``` - -## .choose(list, fn) - - Let the user choose from a `list`: - -```js -var list = ['tobi', 'loki', 'jane', 'manny', 'luna']; - -console.log('Choose the coolest pet:'); -program.choose(list, function(i){ - console.log('you chose %d "%s"', i, list[i]); -}); -``` - -## Links - - - [API documentation](http://visionmedia.github.com/commander.js/) - - [ascii tables](https://github.com/LearnBoost/cli-table) - - [progress bars](https://github.com/visionmedia/node-progress) - - [more progress bars](https://github.com/substack/node-multimeter) - - [examples](https://github.com/visionmedia/commander.js/tree/master/examples) - -## License - -(The MIT License) - -Copyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca> - -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 diff --git a/node_modules/express/node_modules/commander/index.js b/node_modules/express/node_modules/commander/index.js deleted file mode 100644 index 06ec1e4..0000000 --- a/node_modules/express/node_modules/commander/index.js +++ /dev/null @@ -1,2 +0,0 @@ - -module.exports = require('./lib/commander'); \ No newline at end of file diff --git a/node_modules/express/node_modules/commander/lib/commander.js b/node_modules/express/node_modules/commander/lib/commander.js deleted file mode 100644 index 5ba87eb..0000000 --- a/node_modules/express/node_modules/commander/lib/commander.js +++ /dev/null @@ -1,1026 +0,0 @@ - -/*! - * commander - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var EventEmitter = require('events').EventEmitter - , path = require('path') - , tty = require('tty') - , basename = path.basename; - -/** - * Expose the root command. - */ - -exports = module.exports = new Command; - -/** - * Expose `Command`. - */ - -exports.Command = Command; - -/** - * Expose `Option`. - */ - -exports.Option = Option; - -/** - * Initialize a new `Option` with the given `flags` and `description`. - * - * @param {String} flags - * @param {String} description - * @api public - */ - -function Option(flags, description) { - this.flags = flags; - this.required = ~flags.indexOf('<'); - this.optional = ~flags.indexOf('['); - this.bool = !~flags.indexOf('-no-'); - flags = flags.split(/[ ,|]+/); - if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift(); - this.long = flags.shift(); - this.description = description; -} - -/** - * Return option name. - * - * @return {String} - * @api private - */ - -Option.prototype.name = function(){ - return this.long - .replace('--', '') - .replace('no-', ''); -}; - -/** - * Check if `arg` matches the short or long flag. - * - * @param {String} arg - * @return {Boolean} - * @api private - */ - -Option.prototype.is = function(arg){ - return arg == this.short - || arg == this.long; -}; - -/** - * Initialize a new `Command`. - * - * @param {String} name - * @api public - */ - -function Command(name) { - this.commands = []; - this.options = []; - this.args = []; - this.name = name; -} - -/** - * Inherit from `EventEmitter.prototype`. - */ - -Command.prototype.__proto__ = EventEmitter.prototype; - -/** - * Add command `name`. - * - * The `.action()` callback is invoked when the - * command `name` is specified via __ARGV__, - * and the remaining arguments are applied to the - * function for access. - * - * When the `name` is "*" an un-matched command - * will be passed as the first arg, followed by - * the rest of __ARGV__ remaining. - * - * Examples: - * - * program - * .version('0.0.1') - * .option('-C, --chdir ', 'change the working directory') - * .option('-c, --config ', 'set config path. defaults to ./deploy.conf') - * .option('-T, --no-tests', 'ignore test hook') - * - * program - * .command('setup') - * .description('run remote setup commands') - * .action(function(){ - * console.log('setup'); - * }); - * - * program - * .command('exec ') - * .description('run the given remote command') - * .action(function(cmd){ - * console.log('exec "%s"', cmd); - * }); - * - * program - * .command('*') - * .description('deploy the given env') - * .action(function(env){ - * console.log('deploying "%s"', env); - * }); - * - * program.parse(process.argv); - * - * @param {String} name - * @return {Command} the new command - * @api public - */ - -Command.prototype.command = function(name){ - var args = name.split(/ +/); - var cmd = new Command(args.shift()); - this.commands.push(cmd); - cmd.parseExpectedArgs(args); - cmd.parent = this; - return cmd; -}; - -/** - * Parse expected `args`. - * - * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`. - * - * @param {Array} args - * @return {Command} for chaining - * @api public - */ - -Command.prototype.parseExpectedArgs = function(args){ - if (!args.length) return; - var self = this; - args.forEach(function(arg){ - switch (arg[0]) { - case '<': - self.args.push({ required: true, name: arg.slice(1, -1) }); - break; - case '[': - self.args.push({ required: false, name: arg.slice(1, -1) }); - break; - } - }); - return this; -}; - -/** - * Register callback `fn` for the command. - * - * Examples: - * - * program - * .command('help') - * .description('display verbose help') - * .action(function(){ - * // output help here - * }); - * - * @param {Function} fn - * @return {Command} for chaining - * @api public - */ - -Command.prototype.action = function(fn){ - var self = this; - this.parent.on(this.name, function(args, unknown){ - // Parse any so-far unknown options - unknown = unknown || []; - var parsed = self.parseOptions(unknown); - - // Output help if necessary - outputHelpIfNecessary(self, parsed.unknown); - - // If there are still any unknown options, then we simply - // die, unless someone asked for help, in which case we give it - // to them, and then we die. - if (parsed.unknown.length > 0) { - self.unknownOption(parsed.unknown[0]); - } - - self.args.forEach(function(arg, i){ - if (arg.required && null == args[i]) { - self.missingArgument(arg.name); - } - }); - - // Always append ourselves to the end of the arguments, - // to make sure we match the number of arguments the user - // expects - if (self.args.length) { - args[self.args.length] = self; - } else { - args.push(self); - } - - fn.apply(this, args); - }); - return this; -}; - -/** - * Define option with `flags`, `description` and optional - * coercion `fn`. - * - * The `flags` string should contain both the short and long flags, - * separated by comma, a pipe or space. The following are all valid - * all will output this way when `--help` is used. - * - * "-p, --pepper" - * "-p|--pepper" - * "-p --pepper" - * - * Examples: - * - * // simple boolean defaulting to false - * program.option('-p, --pepper', 'add pepper'); - * - * --pepper - * program.pepper - * // => Boolean - * - * // simple boolean defaulting to false - * program.option('-C, --no-cheese', 'remove cheese'); - * - * program.cheese - * // => true - * - * --no-cheese - * program.cheese - * // => true - * - * // required argument - * program.option('-C, --chdir ', 'change the working directory'); - * - * --chdir /tmp - * program.chdir - * // => "/tmp" - * - * // optional argument - * program.option('-c, --cheese [type]', 'add cheese [marble]'); - * - * @param {String} flags - * @param {String} description - * @param {Function|Mixed} fn or default - * @param {Mixed} defaultValue - * @return {Command} for chaining - * @api public - */ - -Command.prototype.option = function(flags, description, fn, defaultValue){ - var self = this - , option = new Option(flags, description) - , oname = option.name() - , name = camelcase(oname); - - // default as 3rd arg - if ('function' != typeof fn) defaultValue = fn, fn = null; - - // preassign default value only for --no-*, [optional], or - if (false == option.bool || option.optional || option.required) { - // when --no-* we make sure default is true - if (false == option.bool) defaultValue = true; - // preassign only if we have a default - if (undefined !== defaultValue) self[name] = defaultValue; - } - - // register the option - this.options.push(option); - - // when it's passed assign the value - // and conditionally invoke the callback - this.on(oname, function(val){ - // coercion - if (null != val && fn) val = fn(val); - - // unassigned or bool - if ('boolean' == typeof self[name] || 'undefined' == typeof self[name]) { - // if no value, bool true, and we have a default, then use it! - if (null == val) { - self[name] = option.bool - ? defaultValue || true - : false; - } else { - self[name] = val; - } - } else if (null !== val) { - // reassign - self[name] = val; - } - }); - - return this; -}; - -/** - * Parse `argv`, settings options and invoking commands when defined. - * - * @param {Array} argv - * @return {Command} for chaining - * @api public - */ - -Command.prototype.parse = function(argv){ - // store raw args - this.rawArgs = argv; - - // guess name - if (!this.name) this.name = basename(argv[1]); - - // process argv - var parsed = this.parseOptions(this.normalize(argv.slice(2))); - this.args = parsed.args; - return this.parseArgs(this.args, parsed.unknown); -}; - -/** - * Normalize `args`, splitting joined short flags. For example - * the arg "-abc" is equivalent to "-a -b -c". - * - * @param {Array} args - * @return {Array} - * @api private - */ - -Command.prototype.normalize = function(args){ - var ret = [] - , arg; - - for (var i = 0, len = args.length; i < len; ++i) { - arg = args[i]; - if (arg.length > 1 && '-' == arg[0] && '-' != arg[1]) { - arg.slice(1).split('').forEach(function(c){ - ret.push('-' + c); - }); - } else { - ret.push(arg); - } - } - - return ret; -}; - -/** - * Parse command `args`. - * - * When listener(s) are available those - * callbacks are invoked, otherwise the "*" - * event is emitted and those actions are invoked. - * - * @param {Array} args - * @return {Command} for chaining - * @api private - */ - -Command.prototype.parseArgs = function(args, unknown){ - var cmds = this.commands - , len = cmds.length - , name; - - if (args.length) { - name = args[0]; - if (this.listeners(name).length) { - this.emit(args.shift(), args, unknown); - } else { - this.emit('*', args); - } - } else { - outputHelpIfNecessary(this, unknown); - - // If there were no args and we have unknown options, - // then they are extraneous and we need to error. - if (unknown.length > 0) { - this.unknownOption(unknown[0]); - } - } - - return this; -}; - -/** - * Return an option matching `arg` if any. - * - * @param {String} arg - * @return {Option} - * @api private - */ - -Command.prototype.optionFor = function(arg){ - for (var i = 0, len = this.options.length; i < len; ++i) { - if (this.options[i].is(arg)) { - return this.options[i]; - } - } -}; - -/** - * Parse options from `argv` returning `argv` - * void of these options. - * - * @param {Array} argv - * @return {Array} - * @api public - */ - -Command.prototype.parseOptions = function(argv){ - var args = [] - , len = argv.length - , literal - , option - , arg; - - var unknownOptions = []; - - // parse options - for (var i = 0; i < len; ++i) { - arg = argv[i]; - - // literal args after -- - if ('--' == arg) { - literal = true; - continue; - } - - if (literal) { - args.push(arg); - continue; - } - - // find matching Option - option = this.optionFor(arg); - - // option is defined - if (option) { - // requires arg - if (option.required) { - arg = argv[++i]; - if (null == arg) return this.optionMissingArgument(option); - if ('-' == arg[0]) return this.optionMissingArgument(option, arg); - this.emit(option.name(), arg); - // optional arg - } else if (option.optional) { - arg = argv[i+1]; - if (null == arg || '-' == arg[0]) { - arg = null; - } else { - ++i; - } - this.emit(option.name(), arg); - // bool - } else { - this.emit(option.name()); - } - continue; - } - - // looks like an option - if (arg.length > 1 && '-' == arg[0]) { - unknownOptions.push(arg); - - // If the next argument looks like it might be - // an argument for this option, we pass it on. - // If it isn't, then it'll simply be ignored - if (argv[i+1] && '-' != argv[i+1][0]) { - unknownOptions.push(argv[++i]); - } - continue; - } - - // arg - args.push(arg); - } - - return { args: args, unknown: unknownOptions }; -}; - -/** - * Argument `name` is missing. - * - * @param {String} name - * @api private - */ - -Command.prototype.missingArgument = function(name){ - console.error(); - console.error(" error: missing required argument `%s'", name); - console.error(); - process.exit(1); -}; - -/** - * `Option` is missing an argument, but received `flag` or nothing. - * - * @param {String} option - * @param {String} flag - * @api private - */ - -Command.prototype.optionMissingArgument = function(option, flag){ - console.error(); - if (flag) { - console.error(" error: option `%s' argument missing, got `%s'", option.flags, flag); - } else { - console.error(" error: option `%s' argument missing", option.flags); - } - console.error(); - process.exit(1); -}; - -/** - * Unknown option `flag`. - * - * @param {String} flag - * @api private - */ - -Command.prototype.unknownOption = function(flag){ - console.error(); - console.error(" error: unknown option `%s'", flag); - console.error(); - process.exit(1); -}; - -/** - * Set the program version to `str`. - * - * This method auto-registers the "-V, --version" flag - * which will print the version number when passed. - * - * @param {String} str - * @param {String} flags - * @return {Command} for chaining - * @api public - */ - -Command.prototype.version = function(str, flags){ - if (0 == arguments.length) return this._version; - this._version = str; - flags = flags || '-V, --version'; - this.option(flags, 'output the version number'); - this.on('version', function(){ - console.log(str); - process.exit(0); - }); - return this; -}; - -/** - * Set the description `str`. - * - * @param {String} str - * @return {String|Command} - * @api public - */ - -Command.prototype.description = function(str){ - if (0 == arguments.length) return this._description; - this._description = str; - return this; -}; - -/** - * Set / get the command usage `str`. - * - * @param {String} str - * @return {String|Command} - * @api public - */ - -Command.prototype.usage = function(str){ - var args = this.args.map(function(arg){ - return arg.required - ? '<' + arg.name + '>' - : '[' + arg.name + ']'; - }); - - var usage = '[options' - + (this.commands.length ? '] [command' : '') - + ']' - + (this.args.length ? ' ' + args : ''); - if (0 == arguments.length) return this._usage || usage; - this._usage = str; - - return this; -}; - -/** - * Return the largest option length. - * - * @return {Number} - * @api private - */ - -Command.prototype.largestOptionLength = function(){ - return this.options.reduce(function(max, option){ - return Math.max(max, option.flags.length); - }, 0); -}; - -/** - * Return help for options. - * - * @return {String} - * @api private - */ - -Command.prototype.optionHelp = function(){ - var width = this.largestOptionLength(); - - // Prepend the help information - return [pad('-h, --help', width) + ' ' + 'output usage information'] - .concat(this.options.map(function(option){ - return pad(option.flags, width) - + ' ' + option.description; - })) - .join('\n'); -}; - -/** - * Return command help documentation. - * - * @return {String} - * @api private - */ - -Command.prototype.commandHelp = function(){ - if (!this.commands.length) return ''; - return [ - '' - , ' Commands:' - , '' - , this.commands.map(function(cmd){ - var args = cmd.args.map(function(arg){ - return arg.required - ? '<' + arg.name + '>' - : '[' + arg.name + ']'; - }).join(' '); - - return cmd.name - + (cmd.options.length - ? ' [options]' - : '') + ' ' + args - + (cmd.description() - ? '\n' + cmd.description() - : ''); - }).join('\n\n').replace(/^/gm, ' ') - , '' - ].join('\n'); -}; - -/** - * Return program help documentation. - * - * @return {String} - * @api private - */ - -Command.prototype.helpInformation = function(){ - return [ - '' - , ' Usage: ' + this.name + ' ' + this.usage() - , '' + this.commandHelp() - , ' Options:' - , '' - , '' + this.optionHelp().replace(/^/gm, ' ') - , '' - , '' - ].join('\n'); -}; - -/** - * Prompt for a `Number`. - * - * @param {String} str - * @param {Function} fn - * @api private - */ - -Command.prototype.promptForNumber = function(str, fn){ - var self = this; - this.promptSingleLine(str, function parseNumber(val){ - val = Number(val); - if (isNaN(val)) return self.promptSingleLine(str + '(must be a number) ', parseNumber); - fn(val); - }); -}; - -/** - * Prompt for a `Date`. - * - * @param {String} str - * @param {Function} fn - * @api private - */ - -Command.prototype.promptForDate = function(str, fn){ - var self = this; - this.promptSingleLine(str, function parseDate(val){ - val = new Date(val); - if (isNaN(val.getTime())) return self.promptSingleLine(str + '(must be a date) ', parseDate); - fn(val); - }); -}; - -/** - * Single-line prompt. - * - * @param {String} str - * @param {Function} fn - * @api private - */ - -Command.prototype.promptSingleLine = function(str, fn){ - if ('function' == typeof arguments[2]) { - return this['promptFor' + (fn.name || fn)](str, arguments[2]); - } - - process.stdout.write(str); - process.stdin.setEncoding('utf8'); - process.stdin.once('data', function(val){ - fn(val.trim()); - }).resume(); -}; - -/** - * Multi-line prompt. - * - * @param {String} str - * @param {Function} fn - * @api private - */ - -Command.prototype.promptMultiLine = function(str, fn){ - var buf = []; - console.log(str); - process.stdin.setEncoding('utf8'); - process.stdin.on('data', function(val){ - if ('\n' == val || '\r\n' == val) { - process.stdin.removeAllListeners('data'); - fn(buf.join('\n')); - } else { - buf.push(val.trimRight()); - } - }).resume(); -}; - -/** - * Prompt `str` and callback `fn(val)` - * - * Commander supports single-line and multi-line prompts. - * To issue a single-line prompt simply add white-space - * to the end of `str`, something like "name: ", whereas - * for a multi-line prompt omit this "description:". - * - * - * Examples: - * - * program.prompt('Username: ', function(name){ - * console.log('hi %s', name); - * }); - * - * program.prompt('Description:', function(desc){ - * console.log('description was "%s"', desc.trim()); - * }); - * - * @param {String|Object} str - * @param {Function} fn - * @api public - */ - -Command.prototype.prompt = function(str, fn){ - var self = this; - - if ('string' == typeof str) { - if (/ $/.test(str)) return this.promptSingleLine.apply(this, arguments); - this.promptMultiLine(str, fn); - } else { - var keys = Object.keys(str) - , obj = {}; - - function next() { - var key = keys.shift() - , label = str[key]; - - if (!key) return fn(obj); - self.prompt(label, function(val){ - obj[key] = val; - next(); - }); - } - - next(); - } -}; - -/** - * Prompt for password with `str`, `mask` char and callback `fn(val)`. - * - * The mask string defaults to '', aka no output is - * written while typing, you may want to use "*" etc. - * - * Examples: - * - * program.password('Password: ', function(pass){ - * console.log('got "%s"', pass); - * process.stdin.destroy(); - * }); - * - * program.password('Password: ', '*', function(pass){ - * console.log('got "%s"', pass); - * process.stdin.destroy(); - * }); - * - * @param {String} str - * @param {String} mask - * @param {Function} fn - * @api public - */ - -Command.prototype.password = function(str, mask, fn){ - var self = this - , buf = ''; - - // default mask - if ('function' == typeof mask) { - fn = mask; - mask = ''; - } - - process.stdin.resume(); - tty.setRawMode(true); - process.stdout.write(str); - - // keypress - process.stdin.on('keypress', function(c, key){ - if (key && 'enter' == key.name) { - console.log(); - process.stdin.removeAllListeners('keypress'); - tty.setRawMode(false); - if (!buf.trim().length) return self.password(str, mask, fn); - fn(buf); - return; - } - - if (key && key.ctrl && 'c' == key.name) { - console.log('%s', buf); - process.exit(); - } - - process.stdout.write(mask); - buf += c; - }).resume(); -}; - -/** - * Confirmation prompt with `str` and callback `fn(bool)` - * - * Examples: - * - * program.confirm('continue? ', function(ok){ - * console.log(' got %j', ok); - * process.stdin.destroy(); - * }); - * - * @param {String} str - * @param {Function} fn - * @api public - */ - - -Command.prototype.confirm = function(str, fn, verbose){ - var self = this; - this.prompt(str, function(ok){ - if (!ok.trim()) { - if (!verbose) str += '(yes or no) '; - return self.confirm(str, fn, true); - } - fn(parseBool(ok)); - }); -}; - -/** - * Choice prompt with `list` of items and callback `fn(index, item)` - * - * Examples: - * - * var list = ['tobi', 'loki', 'jane', 'manny', 'luna']; - * - * console.log('Choose the coolest pet:'); - * program.choose(list, function(i){ - * console.log('you chose %d "%s"', i, list[i]); - * process.stdin.destroy(); - * }); - * - * @param {Array} list - * @param {Number|Function} index or fn - * @param {Function} fn - * @api public - */ - -Command.prototype.choose = function(list, index, fn){ - var self = this - , hasDefault = 'number' == typeof index; - - if (!hasDefault) { - fn = index; - index = null; - } - - list.forEach(function(item, i){ - if (hasDefault && i == index) { - console.log('* %d) %s', i + 1, item); - } else { - console.log(' %d) %s', i + 1, item); - } - }); - - function again() { - self.prompt(' : ', function(val){ - val = parseInt(val, 10) - 1; - if (hasDefault && isNaN(val)) val = index; - - if (null == list[val]) { - again(); - } else { - fn(val, list[val]); - } - }); - } - - again(); -}; - -/** - * Camel-case the given `flag` - * - * @param {String} flag - * @return {String} - * @api private - */ - -function camelcase(flag) { - return flag.split('-').reduce(function(str, word){ - return str + word[0].toUpperCase() + word.slice(1); - }); -} - -/** - * Parse a boolean `str`. - * - * @param {String} str - * @return {Boolean} - * @api private - */ - -function parseBool(str) { - return /^y|yes|ok|true$/i.test(str); -} - -/** - * Pad `str` to `width`. - * - * @param {String} str - * @param {Number} width - * @return {String} - * @api private - */ - -function pad(str, width) { - var len = Math.max(0, width - str.length); - return str + Array(len + 1).join(' '); -} - -/** - * Output help information if necessary - * - * @param {Command} command to output help for - * @param {Array} array of options to search for -h or --help - * @api private - */ - -function outputHelpIfNecessary(cmd, options) { - options = options || []; - for (var i = 0; i < options.length; i++) { - if (options[i] == '--help' || options[i] == '-h') { - process.stdout.write(cmd.helpInformation()); - cmd.emit('--help'); - process.exit(0); - } - } -} diff --git a/node_modules/express/node_modules/commander/package.json b/node_modules/express/node_modules/commander/package.json deleted file mode 100644 index 764dece..0000000 --- a/node_modules/express/node_modules/commander/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "commander", - "version": "0.6.1", - "description": "the complete solution for node.js command-line programs", - "keywords": [ - "command", - "option", - "parser", - "prompt", - "stdin" - ], - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "repository": { - "type": "git", - "url": "https://github.com/visionmedia/commander.js.git" - }, - "dependencies": {}, - "devDependencies": { - "should": ">= 0.0.1" - }, - "scripts": { - "test": "make test" - }, - "main": "index", - "engines": { - "node": ">= 0.4.x" - }, - "readme": "# Commander.js\n\n The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/visionmedia/commander).\n\n [![Build Status](https://secure.travis-ci.org/visionmedia/commander.js.png)](http://travis-ci.org/visionmedia/commander.js)\n\n## Installation\n\n $ npm install commander\n\n## Option parsing\n\n Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options.\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('commander');\n\nprogram\n .version('0.0.1')\n .option('-p, --peppers', 'Add peppers')\n .option('-P, --pineapple', 'Add pineapple')\n .option('-b, --bbq', 'Add bbq sauce')\n .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')\n .parse(process.argv);\n\nconsole.log('you ordered a pizza with:');\nif (program.peppers) console.log(' - peppers');\nif (program.pineapple) console.log(' - pineappe');\nif (program.bbq) console.log(' - bbq');\nconsole.log(' - %s cheese', program.cheese);\n```\n\n Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as \"--template-engine\" are camel-cased, becoming `program.templateEngine` etc.\n\n## Automated --help\n\n The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free:\n\n``` \n $ ./examples/pizza --help\n\n Usage: pizza [options]\n\n Options:\n\n -V, --version output the version number\n -p, --peppers Add peppers\n -P, --pineapple Add pineappe\n -b, --bbq Add bbq sauce\n -c, --cheese Add the specified type of cheese [marble]\n -h, --help output usage information\n\n```\n\n## Coercion\n\n```js\nfunction range(val) {\n return val.split('..').map(Number);\n}\n\nfunction list(val) {\n return val.split(',');\n}\n\nprogram\n .version('0.0.1')\n .usage('[options] ')\n .option('-i, --integer ', 'An integer argument', parseInt)\n .option('-f, --float ', 'A float argument', parseFloat)\n .option('-r, --range ..', 'A range', range)\n .option('-l, --list ', 'A list', list)\n .option('-o, --optional [value]', 'An optional value')\n .parse(process.argv);\n\nconsole.log(' int: %j', program.integer);\nconsole.log(' float: %j', program.float);\nconsole.log(' optional: %j', program.optional);\nprogram.range = program.range || [];\nconsole.log(' range: %j..%j', program.range[0], program.range[1]);\nconsole.log(' list: %j', program.list);\nconsole.log(' args: %j', program.args);\n```\n\n## Custom help\n\n You can display arbitrary `-h, --help` information\n by listening for \"--help\". Commander will automatically\n exit once you are done so that the remainder of your program\n does not execute causing undesired behaviours, for example\n in the following executable \"stuff\" will not output when\n `--help` is used.\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('../');\n\nfunction list(val) {\n return val.split(',').map(Number);\n}\n\nprogram\n .version('0.0.1')\n .option('-f, --foo', 'enable some foo')\n .option('-b, --bar', 'enable some bar')\n .option('-B, --baz', 'enable some baz');\n\n// must be before .parse() since\n// node's emit() is immediate\n\nprogram.on('--help', function(){\n console.log(' Examples:');\n console.log('');\n console.log(' $ custom-help --help');\n console.log(' $ custom-help -h');\n console.log('');\n});\n\nprogram.parse(process.argv);\n\nconsole.log('stuff');\n```\n\nyielding the following help output:\n\n```\n\nUsage: custom-help [options]\n\nOptions:\n\n -h, --help output usage information\n -V, --version output the version number\n -f, --foo enable some foo\n -b, --bar enable some bar\n -B, --baz enable some baz\n\nExamples:\n\n $ custom-help --help\n $ custom-help -h\n\n```\n\n## .prompt(msg, fn)\n\n Single-line prompt:\n\n```js\nprogram.prompt('name: ', function(name){\n console.log('hi %s', name);\n});\n```\n\n Multi-line prompt:\n\n```js\nprogram.prompt('description:', function(name){\n console.log('hi %s', name);\n});\n```\n\n Coercion:\n\n```js\nprogram.prompt('Age: ', Number, function(age){\n console.log('age: %j', age);\n});\n```\n\n```js\nprogram.prompt('Birthdate: ', Date, function(date){\n console.log('date: %s', date);\n});\n```\n\n## .password(msg[, mask], fn)\n\nPrompt for password without echoing:\n\n```js\nprogram.password('Password: ', function(pass){\n console.log('got \"%s\"', pass);\n process.stdin.destroy();\n});\n```\n\nPrompt for password with mask char \"*\":\n\n```js\nprogram.password('Password: ', '*', function(pass){\n console.log('got \"%s\"', pass);\n process.stdin.destroy();\n});\n```\n\n## .confirm(msg, fn)\n\n Confirm with the given `msg`:\n\n```js\nprogram.confirm('continue? ', function(ok){\n console.log(' got %j', ok);\n});\n```\n\n## .choose(list, fn)\n\n Let the user choose from a `list`:\n\n```js\nvar list = ['tobi', 'loki', 'jane', 'manny', 'luna'];\n\nconsole.log('Choose the coolest pet:');\nprogram.choose(list, function(i){\n console.log('you chose %d \"%s\"', i, list[i]);\n});\n```\n\n## Links\n\n - [API documentation](http://visionmedia.github.com/commander.js/)\n - [ascii tables](https://github.com/LearnBoost/cli-table)\n - [progress bars](https://github.com/visionmedia/node-progress)\n - [more progress bars](https://github.com/substack/node-multimeter)\n - [examples](https://github.com/visionmedia/commander.js/tree/master/examples)\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", - "_id": "commander@0.6.1", - "_from": "commander@0.6.1" -} diff --git a/node_modules/express/node_modules/connect/.npmignore b/node_modules/express/node_modules/connect/.npmignore deleted file mode 100644 index 9046dde..0000000 --- a/node_modules/express/node_modules/connect/.npmignore +++ /dev/null @@ -1,12 +0,0 @@ -*.markdown -*.md -.git* -Makefile -benchmarks/ -docs/ -examples/ -install.sh -support/ -test/ -.DS_Store -coverage.html diff --git a/node_modules/express/node_modules/connect/.travis.yml b/node_modules/express/node_modules/connect/.travis.yml deleted file mode 100644 index 3aeb3c5..0000000 --- a/node_modules/express/node_modules/connect/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - 0.6 - - 0.8 - - 0.9 \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/LICENSE b/node_modules/express/node_modules/connect/LICENSE deleted file mode 100644 index 0c5d22d..0000000 --- a/node_modules/express/node_modules/connect/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -(The MIT License) - -Copyright (c) 2010 Sencha Inc. -Copyright (c) 2011 LearnBoost -Copyright (c) 2011 TJ Holowaychuk - -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 diff --git a/node_modules/express/node_modules/connect/Readme.md b/node_modules/express/node_modules/connect/Readme.md deleted file mode 100644 index 7d65f9c..0000000 --- a/node_modules/express/node_modules/connect/Readme.md +++ /dev/null @@ -1,133 +0,0 @@ -[![build status](https://secure.travis-ci.org/senchalabs/connect.png)](http://travis-ci.org/senchalabs/connect) -# Connect - - Connect is an extensible HTTP server framework for [node](http://nodejs.org), providing high performance "plugins" known as _middleware_. - - Connect is bundled with over _20_ commonly used middleware, including - a logger, session support, cookie parser, and [more](http://senchalabs.github.com/connect). Be sure to view the 2.x [documentation](http://senchalabs.github.com/connect/). - -```js -var connect = require('connect') - , http = require('http'); - -var app = connect() - .use(connect.favicon()) - .use(connect.logger('dev')) - .use(connect.static('public')) - .use(connect.directory('public')) - .use(connect.cookieParser()) - .use(connect.session({ secret: 'my secret here' })) - .use(function(req, res){ - res.end('Hello from Connect!\n'); - }); - -http.createServer(app).listen(3000); -``` - -## Middleware - - - [csrf](http://www.senchalabs.org/connect/csrf.html) - - [basicAuth](http://www.senchalabs.org/connect/basicAuth.html) - - [bodyParser](http://www.senchalabs.org/connect/bodyParser.html) - - [json](http://www.senchalabs.org/connect/json.html) - - [multipart](http://www.senchalabs.org/connect/multipart.html) - - [urlencoded](http://www.senchalabs.org/connect/urlencoded.html) - - [cookieParser](http://www.senchalabs.org/connect/cookieParser.html) - - [directory](http://www.senchalabs.org/connect/directory.html) - - [compress](http://www.senchalabs.org/connect/compress.html) - - [errorHandler](http://www.senchalabs.org/connect/errorHandler.html) - - [favicon](http://www.senchalabs.org/connect/favicon.html) - - [limit](http://www.senchalabs.org/connect/limit.html) - - [logger](http://www.senchalabs.org/connect/logger.html) - - [methodOverride](http://www.senchalabs.org/connect/methodOverride.html) - - [query](http://www.senchalabs.org/connect/query.html) - - [responseTime](http://www.senchalabs.org/connect/responseTime.html) - - [session](http://www.senchalabs.org/connect/session.html) - - [static](http://www.senchalabs.org/connect/static.html) - - [staticCache](http://www.senchalabs.org/connect/staticCache.html) - - [vhost](http://www.senchalabs.org/connect/vhost.html) - - [subdomains](http://www.senchalabs.org/connect/subdomains.html) - - [cookieSession](http://www.senchalabs.org/connect/cookieSession.html) - -## Running Tests - -first: - - $ npm install -d - -then: - - $ make test - -## Authors - - Below is the output from [git-summary](http://github.com/visionmedia/git-extras). - - - project: connect - commits: 2033 - active : 301 days - files : 171 - authors: - 1414 Tj Holowaychuk 69.6% - 298 visionmedia 14.7% - 191 Tim Caswell 9.4% - 51 TJ Holowaychuk 2.5% - 10 Ryan Olds 0.5% - 8 Astro 0.4% - 5 Nathan Rajlich 0.2% - 5 Jakub Nešetřil 0.2% - 3 Daniel Dickison 0.1% - 3 David Rio Deiros 0.1% - 3 Alexander Simmerl 0.1% - 3 Andreas Lind Petersen 0.1% - 2 Aaron Heckmann 0.1% - 2 Jacques Crocker 0.1% - 2 Fabian Jakobs 0.1% - 2 Brian J Brennan 0.1% - 2 Adam Malcontenti-Wilson 0.1% - 2 Glen Mailer 0.1% - 2 James Campos 0.1% - 1 Trent Mick 0.0% - 1 Troy Kruthoff 0.0% - 1 Wei Zhu 0.0% - 1 comerc 0.0% - 1 darobin 0.0% - 1 nateps 0.0% - 1 Marco Sanson 0.0% - 1 Arthur Taylor 0.0% - 1 Aseem Kishore 0.0% - 1 Bart Teeuwisse 0.0% - 1 Cameron Howey 0.0% - 1 Chad Weider 0.0% - 1 Craig Barnes 0.0% - 1 Eran Hammer-Lahav 0.0% - 1 Gregory McWhirter 0.0% - 1 Guillermo Rauch 0.0% - 1 Jae Kwon 0.0% - 1 Jakub Nesetril 0.0% - 1 Joshua Peek 0.0% - 1 Jxck 0.0% - 1 AJ ONeal 0.0% - 1 Michael Hemesath 0.0% - 1 Morten Siebuhr 0.0% - 1 Samori Gorse 0.0% - 1 Tom Jensen 0.0% - -## Node Compatibility - - Connect `< 1.x` is compatible with node 0.2.x - - - Connect `1.x` is compatible with node 0.4.x - - - Connect (_master_) `2.x` is compatible with node 0.6.x - -## CLA - - [http://sencha.com/cla](http://sencha.com/cla) - -## License - -View the [LICENSE](https://github.com/senchalabs/connect/blob/master/LICENSE) file. The [Silk](http://www.famfamfam.com/lab/icons/silk/) icons used by the `directory` middleware created by/copyright of [FAMFAMFAM](http://www.famfamfam.com/). diff --git a/node_modules/express/node_modules/connect/index.js b/node_modules/express/node_modules/connect/index.js deleted file mode 100644 index 23240ee..0000000 --- a/node_modules/express/node_modules/connect/index.js +++ /dev/null @@ -1,4 +0,0 @@ - -module.exports = process.env.CONNECT_COV - ? require('./lib-cov/connect') - : require('./lib/connect'); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/lib-cov/cache.js b/node_modules/express/node_modules/connect/lib-cov/cache.js deleted file mode 100644 index af6cd2f..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/cache.js +++ /dev/null @@ -1,68 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['cache.js']) { - _$jscoverage['cache.js'] = []; - _$jscoverage['cache.js'][12] = 0; - _$jscoverage['cache.js'][21] = 0; - _$jscoverage['cache.js'][22] = 0; - _$jscoverage['cache.js'][23] = 0; - _$jscoverage['cache.js'][24] = 0; - _$jscoverage['cache.js'][35] = 0; - _$jscoverage['cache.js'][36] = 0; - _$jscoverage['cache.js'][37] = 0; - _$jscoverage['cache.js'][47] = 0; - _$jscoverage['cache.js'][48] = 0; - _$jscoverage['cache.js'][59] = 0; - _$jscoverage['cache.js'][60] = 0; - _$jscoverage['cache.js'][71] = 0; - _$jscoverage['cache.js'][73] = 0; - _$jscoverage['cache.js'][76] = 0; - _$jscoverage['cache.js'][78] = 0; - _$jscoverage['cache.js'][79] = 0; - _$jscoverage['cache.js'][80] = 0; -} -_$jscoverage['cache.js'][12]++; -module.exports = Cache; -_$jscoverage['cache.js'][21]++; -function Cache(limit) { - _$jscoverage['cache.js'][22]++; - this.store = {}; - _$jscoverage['cache.js'][23]++; - this.keys = []; - _$jscoverage['cache.js'][24]++; - this.limit = limit; -} -_$jscoverage['cache.js'][35]++; -Cache.prototype.touch = (function (key, i) { - _$jscoverage['cache.js'][36]++; - this.keys.splice(i, 1); - _$jscoverage['cache.js'][37]++; - this.keys.push(key); -}); -_$jscoverage['cache.js'][47]++; -Cache.prototype.remove = (function (key) { - _$jscoverage['cache.js'][48]++; - delete this.store[key]; -}); -_$jscoverage['cache.js'][59]++; -Cache.prototype.get = (function (key) { - _$jscoverage['cache.js'][60]++; - return this.store[key]; -}); -_$jscoverage['cache.js'][71]++; -Cache.prototype.add = (function (key) { - _$jscoverage['cache.js'][73]++; - var len = this.keys.push(key); - _$jscoverage['cache.js'][76]++; - if (len > this.limit) { - _$jscoverage['cache.js'][76]++; - this.remove(this.keys.shift()); - } - _$jscoverage['cache.js'][78]++; - var arr = this.store[key] = []; - _$jscoverage['cache.js'][79]++; - arr.createdAt = new Date(); - _$jscoverage['cache.js'][80]++; - return arr; -}); -_$jscoverage['cache.js'].source = ["","/*!"," * Connect - Cache"," * Copyright(c) 2011 Sencha Inc."," * MIT Licensed"," */","","/**"," * Expose `Cache`."," */","","module.exports = Cache;","","/**"," * LRU cache store."," *"," * @param {Number} limit"," * @api private"," */","","function Cache(limit) {"," this.store = {};"," this.keys = [];"," this.limit = limit;","}","","/**"," * Touch `key`, promoting the object."," *"," * @param {String} key"," * @param {Number} i"," * @api private"," */","","Cache.prototype.touch = function(key, i){"," this.keys.splice(i,1);"," this.keys.push(key);","};","","/**"," * Remove `key`."," *"," * @param {String} key"," * @api private"," */","","Cache.prototype.remove = function(key){"," delete this.store[key];","};","","/**"," * Get the object stored for `key`."," *"," * @param {String} key"," * @return {Array}"," * @api private"," */","","Cache.prototype.get = function(key){"," return this.store[key];","};","","/**"," * Add a cache `key`."," *"," * @param {String} key"," * @return {Array}"," * @api private"," */","","Cache.prototype.add = function(key){"," // initialize store"," var len = this.keys.push(key);",""," // limit reached, invalidate LRU"," if (len > this.limit) this.remove(this.keys.shift());",""," var arr = this.store[key] = [];"," arr.createdAt = new Date;"," return arr;","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/connect.js b/node_modules/express/node_modules/connect/lib-cov/connect.js deleted file mode 100644 index f811bb8..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/connect.js +++ /dev/null @@ -1,93 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['connect.js']) { - _$jscoverage['connect.js'] = []; - _$jscoverage['connect.js'][13] = 0; - _$jscoverage['connect.js'][22] = 0; - _$jscoverage['connect.js'][26] = 0; - _$jscoverage['connect.js'][32] = 0; - _$jscoverage['connect.js'][38] = 0; - _$jscoverage['connect.js'][44] = 0; - _$jscoverage['connect.js'][50] = 0; - _$jscoverage['connect.js'][56] = 0; - _$jscoverage['connect.js'][65] = 0; - _$jscoverage['connect.js'][66] = 0; - _$jscoverage['connect.js'][67] = 0; - _$jscoverage['connect.js'][68] = 0; - _$jscoverage['connect.js'][69] = 0; - _$jscoverage['connect.js'][70] = 0; - _$jscoverage['connect.js'][71] = 0; - _$jscoverage['connect.js'][72] = 0; - _$jscoverage['connect.js'][74] = 0; - _$jscoverage['connect.js'][75] = 0; - _$jscoverage['connect.js'][81] = 0; - _$jscoverage['connect.js'][87] = 0; - _$jscoverage['connect.js'][88] = 0; - _$jscoverage['connect.js'][89] = 0; - _$jscoverage['connect.js'][90] = 0; - _$jscoverage['connect.js'][91] = 0; - _$jscoverage['connect.js'][92] = 0; -} -_$jscoverage['connect.js'][13]++; -var EventEmitter = require("events").EventEmitter, proto = require("./proto"), utils = require("./utils"), path = require("path"), basename = path.basename, fs = require("fs"); -_$jscoverage['connect.js'][22]++; -require("./patch"); -_$jscoverage['connect.js'][26]++; -exports = module.exports = createServer; -_$jscoverage['connect.js'][32]++; -exports.version = "2.6.1"; -_$jscoverage['connect.js'][38]++; -exports.mime = require("./middleware/static").mime; -_$jscoverage['connect.js'][44]++; -exports.proto = proto; -_$jscoverage['connect.js'][50]++; -exports.middleware = {}; -_$jscoverage['connect.js'][56]++; -exports.utils = utils; -_$jscoverage['connect.js'][65]++; -function createServer() { - _$jscoverage['connect.js'][66]++; - function app(req, res) { - _$jscoverage['connect.js'][66]++; - app.handle(req, res); -} - _$jscoverage['connect.js'][67]++; - utils.merge(app, proto); - _$jscoverage['connect.js'][68]++; - utils.merge(app, EventEmitter.prototype); - _$jscoverage['connect.js'][69]++; - app.route = "/"; - _$jscoverage['connect.js'][70]++; - app.stack = []; - _$jscoverage['connect.js'][71]++; - for (var i = 0; i < arguments.length; ++i) { - _$jscoverage['connect.js'][72]++; - app.use(arguments[i]); -} - _$jscoverage['connect.js'][74]++; - return app; -} -_$jscoverage['connect.js'][75]++; -; -_$jscoverage['connect.js'][81]++; -createServer.createServer = createServer; -_$jscoverage['connect.js'][87]++; -fs.readdirSync(__dirname + "/middleware").forEach((function (filename) { - _$jscoverage['connect.js'][88]++; - if (! /\.js$/.test(filename)) { - _$jscoverage['connect.js'][88]++; - return; - } - _$jscoverage['connect.js'][89]++; - var name = basename(filename, ".js"); - _$jscoverage['connect.js'][90]++; - function load() { - _$jscoverage['connect.js'][90]++; - return require("./middleware/" + name); -} - _$jscoverage['connect.js'][91]++; - exports.middleware.__defineGetter__(name, load); - _$jscoverage['connect.js'][92]++; - exports.__defineGetter__(name, load); -})); -_$jscoverage['connect.js'].source = ["","/*!"," * Connect"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var EventEmitter = require('events').EventEmitter"," , proto = require('./proto')"," , utils = require('./utils')"," , path = require('path')"," , basename = path.basename"," , fs = require('fs');","","// node patches","","require('./patch');","","// expose createServer() as the module","","exports = module.exports = createServer;","","/**"," * Framework version."," */","","exports.version = '2.6.1';","","/**"," * Expose mime module."," */","","exports.mime = require('./middleware/static').mime;","","/**"," * Expose the prototype."," */","","exports.proto = proto;","","/**"," * Auto-load middleware getters."," */","","exports.middleware = {};","","/**"," * Expose utilities."," */","","exports.utils = utils;","","/**"," * Create a new connect server."," *"," * @return {Function}"," * @api public"," */","","function createServer() {"," function app(req, res){ app.handle(req, res); }"," utils.merge(app, proto);"," utils.merge(app, EventEmitter.prototype);"," app.route = '/';"," app.stack = [];"," for (var i = 0; i < arguments.length; ++i) {"," app.use(arguments[i]);"," }"," return app;","};","","/**"," * Support old `.createServer()` method."," */","","createServer.createServer = createServer;","","/**"," * Auto-load bundled middleware with getters."," */","","fs.readdirSync(__dirname + '/middleware').forEach(function(filename){"," if (!/\\.js$/.test(filename)) return;"," var name = basename(filename, '.js');"," function load(){ return require('./middleware/' + name); }"," exports.middleware.__defineGetter__(name, load);"," exports.__defineGetter__(name, load);","});"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/index.js b/node_modules/express/node_modules/connect/lib-cov/index.js deleted file mode 100644 index e6bb1c7..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/index.js +++ /dev/null @@ -1,6 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['index.js']) { - _$jscoverage['index.js'] = []; -} -_$jscoverage['index.js'].source = ["","/**"," * Connect is a middleware framework for node,"," * shipping with over 18 bundled middleware and a rich selection of"," * 3rd-party middleware."," *"," * var app = connect()"," * .use(connect.logger('dev'))"," * .use(connect.static('public'))"," * .use(function(req, res){"," * res.end('hello world\\n');"," * })"," * .listen(3000);"," * "," * Installation:"," * "," * $ npm install connect"," *"," * Middleware:"," *"," * - [logger](logger.html) request logger with custom format support"," * - [csrf](csrf.html) Cross-site request forgery protection"," * - [compress](compress.html) Gzip compression middleware"," * - [basicAuth](basicAuth.html) basic http authentication"," * - [bodyParser](bodyParser.html) extensible request body parser"," * - [json](json.html) application/json parser"," * - [urlencoded](urlencoded.html) application/x-www-form-urlencoded parser"," * - [multipart](multipart.html) multipart/form-data parser"," * - [timeout](timeout.html) request timeouts"," * - [cookieParser](cookieParser.html) cookie parser"," * - [session](session.html) session management support with bundled MemoryStore"," * - [cookieSession](cookieSession.html) cookie-based session support"," * - [methodOverride](methodOverride.html) faux HTTP method support"," * - [responseTime](responseTime.html) calculates response-time and exposes via X-Response-Time"," * - [staticCache](staticCache.html) memory cache layer for the static() middleware"," * - [static](static.html) streaming static file server supporting `Range` and more"," * - [directory](directory.html) directory listing middleware"," * - [vhost](vhost.html) virtual host sub-domain mapping middleware"," * - [favicon](favicon.html) efficient favicon server (with default icon)"," * - [limit](limit.html) limit the bytesize of request bodies"," * - [query](query.html) automatic querystring parser, populating `req.query`"," * - [errorHandler](errorHandler.html) flexible error handler"," *"," * Links:"," * "," * - list of [3rd-party](https://github.com/senchalabs/connect/wiki) middleware"," * - GitHub [repository](http://github.com/senchalabs/connect)"," * - [test documentation](https://github.com/senchalabs/connect/blob/gh-pages/tests.md)"," * "," */"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/basicAuth.js b/node_modules/express/node_modules/connect/lib-cov/middleware/basicAuth.js deleted file mode 100644 index c9e7d63..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/basicAuth.js +++ /dev/null @@ -1,128 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/basicAuth.js']) { - _$jscoverage['middleware/basicAuth.js'] = []; - _$jscoverage['middleware/basicAuth.js'][13] = 0; - _$jscoverage['middleware/basicAuth.js'][48] = 0; - _$jscoverage['middleware/basicAuth.js'][49] = 0; - _$jscoverage['middleware/basicAuth.js'][52] = 0; - _$jscoverage['middleware/basicAuth.js'][53] = 0; - _$jscoverage['middleware/basicAuth.js'][54] = 0; - _$jscoverage['middleware/basicAuth.js'][55] = 0; - _$jscoverage['middleware/basicAuth.js'][56] = 0; - _$jscoverage['middleware/basicAuth.js'][57] = 0; - _$jscoverage['middleware/basicAuth.js'][58] = 0; - _$jscoverage['middleware/basicAuth.js'][62] = 0; - _$jscoverage['middleware/basicAuth.js'][64] = 0; - _$jscoverage['middleware/basicAuth.js'][65] = 0; - _$jscoverage['middleware/basicAuth.js'][67] = 0; - _$jscoverage['middleware/basicAuth.js'][68] = 0; - _$jscoverage['middleware/basicAuth.js'][70] = 0; - _$jscoverage['middleware/basicAuth.js'][72] = 0; - _$jscoverage['middleware/basicAuth.js'][74] = 0; - _$jscoverage['middleware/basicAuth.js'][78] = 0; - _$jscoverage['middleware/basicAuth.js'][80] = 0; - _$jscoverage['middleware/basicAuth.js'][84] = 0; - _$jscoverage['middleware/basicAuth.js'][85] = 0; - _$jscoverage['middleware/basicAuth.js'][86] = 0; - _$jscoverage['middleware/basicAuth.js'][87] = 0; - _$jscoverage['middleware/basicAuth.js'][88] = 0; - _$jscoverage['middleware/basicAuth.js'][89] = 0; - _$jscoverage['middleware/basicAuth.js'][90] = 0; - _$jscoverage['middleware/basicAuth.js'][94] = 0; - _$jscoverage['middleware/basicAuth.js'][95] = 0; - _$jscoverage['middleware/basicAuth.js'][96] = 0; - _$jscoverage['middleware/basicAuth.js'][98] = 0; -} -_$jscoverage['middleware/basicAuth.js'][13]++; -var utils = require("../utils"), unauthorized = utils.unauthorized; -_$jscoverage['middleware/basicAuth.js'][48]++; -module.exports = (function basicAuth(callback, realm) { - _$jscoverage['middleware/basicAuth.js'][49]++; - var username, password; - _$jscoverage['middleware/basicAuth.js'][52]++; - if ("string" == typeof callback) { - _$jscoverage['middleware/basicAuth.js'][53]++; - username = callback; - _$jscoverage['middleware/basicAuth.js'][54]++; - password = realm; - _$jscoverage['middleware/basicAuth.js'][55]++; - if ("string" != typeof password) { - _$jscoverage['middleware/basicAuth.js'][55]++; - throw new Error("password argument required"); - } - _$jscoverage['middleware/basicAuth.js'][56]++; - realm = arguments[2]; - _$jscoverage['middleware/basicAuth.js'][57]++; - callback = (function (user, pass) { - _$jscoverage['middleware/basicAuth.js'][58]++; - return user == username && pass == password; -}); - } - _$jscoverage['middleware/basicAuth.js'][62]++; - realm = realm || "Authorization Required"; - _$jscoverage['middleware/basicAuth.js'][64]++; - return (function (req, res, next) { - _$jscoverage['middleware/basicAuth.js'][65]++; - var authorization = req.headers.authorization; - _$jscoverage['middleware/basicAuth.js'][67]++; - if (req.user) { - _$jscoverage['middleware/basicAuth.js'][67]++; - return next(); - } - _$jscoverage['middleware/basicAuth.js'][68]++; - if (! authorization) { - _$jscoverage['middleware/basicAuth.js'][68]++; - return unauthorized(res, realm); - } - _$jscoverage['middleware/basicAuth.js'][70]++; - var parts = authorization.split(" "); - _$jscoverage['middleware/basicAuth.js'][72]++; - if (parts.length !== 2) { - _$jscoverage['middleware/basicAuth.js'][72]++; - return next(utils.error(400)); - } - _$jscoverage['middleware/basicAuth.js'][74]++; - var scheme = parts[0], credentials = new Buffer(parts[1], "base64").toString(), index = credentials.indexOf(":"); - _$jscoverage['middleware/basicAuth.js'][78]++; - if ("Basic" != scheme || index < 0) { - _$jscoverage['middleware/basicAuth.js'][78]++; - return next(utils.error(400)); - } - _$jscoverage['middleware/basicAuth.js'][80]++; - var user = credentials.slice(0, index), pass = credentials.slice(index + 1); - _$jscoverage['middleware/basicAuth.js'][84]++; - if (callback.length >= 3) { - _$jscoverage['middleware/basicAuth.js'][85]++; - var pause = utils.pause(req); - _$jscoverage['middleware/basicAuth.js'][86]++; - callback(user, pass, (function (err, user) { - _$jscoverage['middleware/basicAuth.js'][87]++; - if (err || ! user) { - _$jscoverage['middleware/basicAuth.js'][87]++; - return unauthorized(res, realm); - } - _$jscoverage['middleware/basicAuth.js'][88]++; - req.user = req.remoteUser = user; - _$jscoverage['middleware/basicAuth.js'][89]++; - next(); - _$jscoverage['middleware/basicAuth.js'][90]++; - pause.resume(); -})); - } - else { - _$jscoverage['middleware/basicAuth.js'][94]++; - if (callback(user, pass)) { - _$jscoverage['middleware/basicAuth.js'][95]++; - req.user = req.remoteUser = user; - _$jscoverage['middleware/basicAuth.js'][96]++; - next(); - } - else { - _$jscoverage['middleware/basicAuth.js'][98]++; - unauthorized(res, realm); - } - } -}); -}); -_$jscoverage['middleware/basicAuth.js'].source = ["","/*!"," * Connect - basicAuth"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils')"," , unauthorized = utils.unauthorized;","","/**"," * Basic Auth:"," *"," * Enfore basic authentication by providing a `callback(user, pass)`,"," * which must return `true` in order to gain access. Alternatively an async"," * method is provided as well, invoking `callback(user, pass, callback)`. Populates"," * `req.user`. The final alternative is simply passing username / password"," * strings."," *"," * Simple username and password"," *"," * connect(connect.basicAuth('username', 'password'));"," *"," * Callback verification"," *"," * connect()"," * .use(connect.basicAuth(function(user, pass){"," * return 'tj' == user & 'wahoo' == pass;"," * }))"," *"," * Async callback verification, accepting `fn(err, user)`."," *"," * connect()"," * .use(connect.basicAuth(function(user, pass, fn){"," * User.authenticate({ user: user, pass: pass }, fn);"," * }))"," *"," * @param {Function|String} callback or username"," * @param {String} realm"," * @api public"," */","","module.exports = function basicAuth(callback, realm) {"," var username, password;",""," // user / pass strings"," if ('string' == typeof callback) {"," username = callback;"," password = realm;"," if ('string' != typeof password) throw new Error('password argument required');"," realm = arguments[2];"," callback = function(user, pass){"," return user == username && pass == password;"," }"," }",""," realm = realm || 'Authorization Required';",""," return function(req, res, next) {"," var authorization = req.headers.authorization;",""," if (req.user) return next();"," if (!authorization) return unauthorized(res, realm);",""," var parts = authorization.split(' ');",""," if (parts.length !== 2) return next(utils.error(400));",""," var scheme = parts[0]"," , credentials = new Buffer(parts[1], 'base64').toString()"," , index = credentials.indexOf(':');",""," if ('Basic' != scheme || index < 0) return next(utils.error(400));"," "," var user = credentials.slice(0, index)"," , pass = credentials.slice(index + 1);",""," // async"," if (callback.length >= 3) {"," var pause = utils.pause(req);"," callback(user, pass, function(err, user){"," if (err || !user) return unauthorized(res, realm);"," req.user = req.remoteUser = user;"," next();"," pause.resume();"," });"," // sync"," } else {"," if (callback(user, pass)) {"," req.user = req.remoteUser = user;"," next();"," } else {"," unauthorized(res, realm);"," }"," }"," }","};",""]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/bodyParser.js b/node_modules/express/node_modules/connect/lib-cov/middleware/bodyParser.js deleted file mode 100644 index a108b97..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/bodyParser.js +++ /dev/null @@ -1,43 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/bodyParser.js']) { - _$jscoverage['middleware/bodyParser.js'] = []; - _$jscoverage['middleware/bodyParser.js'][13] = 0; - _$jscoverage['middleware/bodyParser.js'][47] = 0; - _$jscoverage['middleware/bodyParser.js'][48] = 0; - _$jscoverage['middleware/bodyParser.js'][52] = 0; - _$jscoverage['middleware/bodyParser.js'][53] = 0; - _$jscoverage['middleware/bodyParser.js'][54] = 0; - _$jscoverage['middleware/bodyParser.js'][55] = 0; - _$jscoverage['middleware/bodyParser.js'][56] = 0; - _$jscoverage['middleware/bodyParser.js'][57] = 0; -} -_$jscoverage['middleware/bodyParser.js'][13]++; -var multipart = require("./multipart"), urlencoded = require("./urlencoded"), json = require("./json"); -_$jscoverage['middleware/bodyParser.js'][47]++; -exports = module.exports = (function bodyParser(options) { - _$jscoverage['middleware/bodyParser.js'][48]++; - var _urlencoded = urlencoded(options), _multipart = multipart(options), _json = json(options); - _$jscoverage['middleware/bodyParser.js'][52]++; - return (function bodyParser(req, res, next) { - _$jscoverage['middleware/bodyParser.js'][53]++; - _json(req, res, (function (err) { - _$jscoverage['middleware/bodyParser.js'][54]++; - if (err) { - _$jscoverage['middleware/bodyParser.js'][54]++; - return next(err); - } - _$jscoverage['middleware/bodyParser.js'][55]++; - _urlencoded(req, res, (function (err) { - _$jscoverage['middleware/bodyParser.js'][56]++; - if (err) { - _$jscoverage['middleware/bodyParser.js'][56]++; - return next(err); - } - _$jscoverage['middleware/bodyParser.js'][57]++; - _multipart(req, res, next); -})); -})); -}); -}); -_$jscoverage['middleware/bodyParser.js'].source = ["","/*!"," * Connect - bodyParser"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var multipart = require('./multipart')"," , urlencoded = require('./urlencoded')"," , json = require('./json');","","/**"," * Body parser:"," * "," * Parse request bodies, supports _application/json_,"," * _application/x-www-form-urlencoded_, and _multipart/form-data_."," *"," * This is equivalent to: "," *"," * app.use(connect.json());"," * app.use(connect.urlencoded());"," * app.use(connect.multipart());"," *"," * Examples:"," *"," * connect()"," * .use(connect.bodyParser())"," * .use(function(req, res) {"," * res.end('viewing user ' + req.body.user.name);"," * });"," *"," * $ curl -d 'user[name]=tj' http://local/"," * $ curl -d '{\"user\":{\"name\":\"tj\"}}' -H \"Content-Type: application/json\" http://local/"," *"," * View [json](json.html), [urlencoded](urlencoded.html), and [multipart](multipart.html) for more info."," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function bodyParser(options){"," var _urlencoded = urlencoded(options)"," , _multipart = multipart(options)"," , _json = json(options);",""," return function bodyParser(req, res, next) {"," _json(req, res, function(err){"," if (err) return next(err);"," _urlencoded(req, res, function(err){"," if (err) return next(err);"," _multipart(req, res, next);"," });"," });"," }","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/compress.js b/node_modules/express/node_modules/connect/lib-cov/middleware/compress.js deleted file mode 100644 index aebd5f1..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/compress.js +++ /dev/null @@ -1,159 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/compress.js']) { - _$jscoverage['middleware/compress.js'] = []; - _$jscoverage['middleware/compress.js'][12] = 0; - _$jscoverage['middleware/compress.js'][18] = 0; - _$jscoverage['middleware/compress.js'][27] = 0; - _$jscoverage['middleware/compress.js'][28] = 0; - _$jscoverage['middleware/compress.js'][61] = 0; - _$jscoverage['middleware/compress.js'][62] = 0; - _$jscoverage['middleware/compress.js'][63] = 0; - _$jscoverage['middleware/compress.js'][66] = 0; - _$jscoverage['middleware/compress.js'][67] = 0; - _$jscoverage['middleware/compress.js'][74] = 0; - _$jscoverage['middleware/compress.js'][78] = 0; - _$jscoverage['middleware/compress.js'][79] = 0; - _$jscoverage['middleware/compress.js'][80] = 0; - _$jscoverage['middleware/compress.js'][85] = 0; - _$jscoverage['middleware/compress.js'][86] = 0; - _$jscoverage['middleware/compress.js'][87] = 0; - _$jscoverage['middleware/compress.js'][92] = 0; - _$jscoverage['middleware/compress.js'][93] = 0; - _$jscoverage['middleware/compress.js'][96] = 0; - _$jscoverage['middleware/compress.js'][99] = 0; - _$jscoverage['middleware/compress.js'][102] = 0; - _$jscoverage['middleware/compress.js'][105] = 0; - _$jscoverage['middleware/compress.js'][108] = 0; - _$jscoverage['middleware/compress.js'][111] = 0; - _$jscoverage['middleware/compress.js'][112] = 0; - _$jscoverage['middleware/compress.js'][113] = 0; - _$jscoverage['middleware/compress.js'][114] = 0; - _$jscoverage['middleware/compress.js'][115] = 0; - _$jscoverage['middleware/compress.js'][121] = 0; - _$jscoverage['middleware/compress.js'][124] = 0; - _$jscoverage['middleware/compress.js'][127] = 0; - _$jscoverage['middleware/compress.js'][128] = 0; - _$jscoverage['middleware/compress.js'][132] = 0; - _$jscoverage['middleware/compress.js'][133] = 0; - _$jscoverage['middleware/compress.js'][136] = 0; - _$jscoverage['middleware/compress.js'][137] = 0; - _$jscoverage['middleware/compress.js'][140] = 0; - _$jscoverage['middleware/compress.js'][141] = 0; - _$jscoverage['middleware/compress.js'][145] = 0; -} -_$jscoverage['middleware/compress.js'][12]++; -var zlib = require("zlib"); -_$jscoverage['middleware/compress.js'][18]++; -exports.methods = {gzip: zlib.createGzip, deflate: zlib.createDeflate}; -_$jscoverage['middleware/compress.js'][27]++; -exports.filter = (function (req, res) { - _$jscoverage['middleware/compress.js'][28]++; - return /json|text|javascript/.test(res.getHeader("Content-Type")); -}); -_$jscoverage['middleware/compress.js'][61]++; -module.exports = (function compress(options) { - _$jscoverage['middleware/compress.js'][62]++; - options = options || {}; - _$jscoverage['middleware/compress.js'][63]++; - var names = Object.keys(exports.methods), filter = options.filter || exports.filter; - _$jscoverage['middleware/compress.js'][66]++; - return (function (req, res, next) { - _$jscoverage['middleware/compress.js'][67]++; - var accept = req.headers["accept-encoding"], write = res.write, end = res.end, stream, method; - _$jscoverage['middleware/compress.js'][74]++; - res.setHeader("Vary", "Accept-Encoding"); - _$jscoverage['middleware/compress.js'][78]++; - res.write = (function (chunk, encoding) { - _$jscoverage['middleware/compress.js'][79]++; - if (! this.headerSent) { - _$jscoverage['middleware/compress.js'][79]++; - this._implicitHeader(); - } - _$jscoverage['middleware/compress.js'][80]++; - return stream? stream.write(new Buffer(chunk, encoding)): write.call(res, chunk, encoding); -}); - _$jscoverage['middleware/compress.js'][85]++; - res.end = (function (chunk, encoding) { - _$jscoverage['middleware/compress.js'][86]++; - if (chunk) { - _$jscoverage['middleware/compress.js'][86]++; - this.write(chunk, encoding); - } - _$jscoverage['middleware/compress.js'][87]++; - return stream? stream.end(): end.call(res); -}); - _$jscoverage['middleware/compress.js'][92]++; - res.on("header", (function () { - _$jscoverage['middleware/compress.js'][93]++; - var encoding = res.getHeader("Content-Encoding") || "identity"; - _$jscoverage['middleware/compress.js'][96]++; - if ("identity" != encoding) { - _$jscoverage['middleware/compress.js'][96]++; - return; - } - _$jscoverage['middleware/compress.js'][99]++; - if (! filter(req, res)) { - _$jscoverage['middleware/compress.js'][99]++; - return; - } - _$jscoverage['middleware/compress.js'][102]++; - if (! accept) { - _$jscoverage['middleware/compress.js'][102]++; - return; - } - _$jscoverage['middleware/compress.js'][105]++; - if ("HEAD" == req.method) { - _$jscoverage['middleware/compress.js'][105]++; - return; - } - _$jscoverage['middleware/compress.js'][108]++; - if ("*" == accept.trim()) { - _$jscoverage['middleware/compress.js'][108]++; - method = "gzip"; - } - _$jscoverage['middleware/compress.js'][111]++; - if (! method) { - _$jscoverage['middleware/compress.js'][112]++; - for (var i = 0, len = names.length; i < len; ++i) { - _$jscoverage['middleware/compress.js'][113]++; - if (~ accept.indexOf(names[i])) { - _$jscoverage['middleware/compress.js'][114]++; - method = names[i]; - _$jscoverage['middleware/compress.js'][115]++; - break; - } -} - } - _$jscoverage['middleware/compress.js'][121]++; - if (! method) { - _$jscoverage['middleware/compress.js'][121]++; - return; - } - _$jscoverage['middleware/compress.js'][124]++; - stream = exports.methods[method](options); - _$jscoverage['middleware/compress.js'][127]++; - res.setHeader("Content-Encoding", method); - _$jscoverage['middleware/compress.js'][128]++; - res.removeHeader("Content-Length"); - _$jscoverage['middleware/compress.js'][132]++; - stream.on("data", (function (chunk) { - _$jscoverage['middleware/compress.js'][133]++; - write.call(res, chunk); -})); - _$jscoverage['middleware/compress.js'][136]++; - stream.on("end", (function () { - _$jscoverage['middleware/compress.js'][137]++; - end.call(res); -})); - _$jscoverage['middleware/compress.js'][140]++; - stream.on("drain", (function () { - _$jscoverage['middleware/compress.js'][141]++; - res.emit("drain"); -})); -})); - _$jscoverage['middleware/compress.js'][145]++; - next(); -}); -}); -_$jscoverage['middleware/compress.js'].source = ["/*!"," * Connect - compress"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var zlib = require('zlib');","","/**"," * Supported content-encoding methods."," */","","exports.methods = {"," gzip: zlib.createGzip"," , deflate: zlib.createDeflate","};","","/**"," * Default filter function."," */","","exports.filter = function(req, res){"," return /json|text|javascript/.test(res.getHeader('Content-Type'));","};","","/**"," * Compress:"," *"," * Compress response data with gzip/deflate."," *"," * Filter:"," *"," * A `filter` callback function may be passed to"," * replace the default logic of:"," *"," * exports.filter = function(req, res){"," * return /json|text|javascript/.test(res.getHeader('Content-Type'));"," * };"," *"," * Options:"," *"," * All remaining options are passed to the gzip/deflate"," * creation functions. Consult node's docs for additional details."," *"," * - `chunkSize` (default: 16*1024)"," * - `windowBits`"," * - `level`: 0-9 where 0 is no compression, and 9 is slow but best compression"," * - `memLevel`: 1-9 low is slower but uses less memory, high is fast but uses more"," * - `strategy`: compression strategy"," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","module.exports = function compress(options) {"," options = options || {};"," var names = Object.keys(exports.methods)"," , filter = options.filter || exports.filter;",""," return function(req, res, next){"," var accept = req.headers['accept-encoding']"," , write = res.write"," , end = res.end"," , stream"," , method;",""," // vary"," res.setHeader('Vary', 'Accept-Encoding');",""," // proxy",""," res.write = function(chunk, encoding){"," if (!this.headerSent) this._implicitHeader();"," return stream"," ? stream.write(new Buffer(chunk, encoding))"," : write.call(res, chunk, encoding);"," };",""," res.end = function(chunk, encoding){"," if (chunk) this.write(chunk, encoding);"," return stream"," ? stream.end()"," : end.call(res);"," };",""," res.on('header', function(){"," var encoding = res.getHeader('Content-Encoding') || 'identity';",""," // already encoded"," if ('identity' != encoding) return; ",""," // default request filter"," if (!filter(req, res)) return;",""," // SHOULD use identity"," if (!accept) return;",""," // head"," if ('HEAD' == req.method) return;",""," // default to gzip"," if ('*' == accept.trim()) method = 'gzip';",""," // compression method"," if (!method) {"," for (var i = 0, len = names.length; i < len; ++i) {"," if (~accept.indexOf(names[i])) {"," method = names[i];"," break;"," }"," }"," }",""," // compression method"," if (!method) return;",""," // compression stream"," stream = exports.methods[method](options);",""," // header fields"," res.setHeader('Content-Encoding', method);"," res.removeHeader('Content-Length');",""," // compression",""," stream.on('data', function(chunk){"," write.call(res, chunk);"," });",""," stream.on('end', function(){"," end.call(res);"," });",""," stream.on('drain', function() {"," res.emit('drain');"," });"," });",""," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/cookieParser.js b/node_modules/express/node_modules/connect/lib-cov/middleware/cookieParser.js deleted file mode 100644 index 7f462d1..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/cookieParser.js +++ /dev/null @@ -1,70 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/cookieParser.js']) { - _$jscoverage['middleware/cookieParser.js'] = []; - _$jscoverage['middleware/cookieParser.js'][13] = 0; - _$jscoverage['middleware/cookieParser.js'][38] = 0; - _$jscoverage['middleware/cookieParser.js'][39] = 0; - _$jscoverage['middleware/cookieParser.js'][40] = 0; - _$jscoverage['middleware/cookieParser.js'][41] = 0; - _$jscoverage['middleware/cookieParser.js'][43] = 0; - _$jscoverage['middleware/cookieParser.js'][44] = 0; - _$jscoverage['middleware/cookieParser.js'][45] = 0; - _$jscoverage['middleware/cookieParser.js'][47] = 0; - _$jscoverage['middleware/cookieParser.js'][48] = 0; - _$jscoverage['middleware/cookieParser.js'][49] = 0; - _$jscoverage['middleware/cookieParser.js'][50] = 0; - _$jscoverage['middleware/cookieParser.js'][51] = 0; - _$jscoverage['middleware/cookieParser.js'][52] = 0; - _$jscoverage['middleware/cookieParser.js'][54] = 0; - _$jscoverage['middleware/cookieParser.js'][56] = 0; - _$jscoverage['middleware/cookieParser.js'][57] = 0; - _$jscoverage['middleware/cookieParser.js'][60] = 0; -} -_$jscoverage['middleware/cookieParser.js'][13]++; -var utils = require("./../utils"), cookie = require("cookie"); -_$jscoverage['middleware/cookieParser.js'][38]++; -module.exports = (function cookieParser(secret) { - _$jscoverage['middleware/cookieParser.js'][39]++; - return (function cookieParser(req, res, next) { - _$jscoverage['middleware/cookieParser.js'][40]++; - if (req.cookies) { - _$jscoverage['middleware/cookieParser.js'][40]++; - return next(); - } - _$jscoverage['middleware/cookieParser.js'][41]++; - var cookies = req.headers.cookie; - _$jscoverage['middleware/cookieParser.js'][43]++; - req.secret = secret; - _$jscoverage['middleware/cookieParser.js'][44]++; - req.cookies = {}; - _$jscoverage['middleware/cookieParser.js'][45]++; - req.signedCookies = {}; - _$jscoverage['middleware/cookieParser.js'][47]++; - if (cookies) { - _$jscoverage['middleware/cookieParser.js'][48]++; - try { - _$jscoverage['middleware/cookieParser.js'][49]++; - req.cookies = cookie.parse(cookies); - _$jscoverage['middleware/cookieParser.js'][50]++; - if (secret) { - _$jscoverage['middleware/cookieParser.js'][51]++; - req.signedCookies = utils.parseSignedCookies(req.cookies, secret); - _$jscoverage['middleware/cookieParser.js'][52]++; - req.signedCookies = utils.parseJSONCookies(req.signedCookies); - } - _$jscoverage['middleware/cookieParser.js'][54]++; - req.cookies = utils.parseJSONCookies(req.cookies); - } - catch (err) { - _$jscoverage['middleware/cookieParser.js'][56]++; - err.status = 400; - _$jscoverage['middleware/cookieParser.js'][57]++; - return next(err); - } - } - _$jscoverage['middleware/cookieParser.js'][60]++; - next(); -}); -}); -_$jscoverage['middleware/cookieParser.js'].source = ["","/*!"," * Connect - cookieParser"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('./../utils')"," , cookie = require('cookie');","","/**"," * Cookie parser:"," *"," * Parse _Cookie_ header and populate `req.cookies`"," * with an object keyed by the cookie names. Optionally"," * you may enabled signed cookie support by passing"," * a `secret` string, which assigns `req.secret` so"," * it may be used by other middleware."," *"," * Examples:"," *"," * connect()"," * .use(connect.cookieParser('optional secret string'))"," * .use(function(req, res, next){"," * res.end(JSON.stringify(req.cookies));"," * })"," *"," * @param {String} secret"," * @return {Function}"," * @api public"," */","","module.exports = function cookieParser(secret){"," return function cookieParser(req, res, next) {"," if (req.cookies) return next();"," var cookies = req.headers.cookie;",""," req.secret = secret;"," req.cookies = {};"," req.signedCookies = {};",""," if (cookies) {"," try {"," req.cookies = cookie.parse(cookies);"," if (secret) {"," req.signedCookies = utils.parseSignedCookies(req.cookies, secret);"," req.signedCookies = utils.parseJSONCookies(req.signedCookies);"," }"," req.cookies = utils.parseJSONCookies(req.cookies);"," } catch (err) {"," err.status = 400;"," return next(err);"," }"," }"," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/cookieSession.js b/node_modules/express/node_modules/connect/lib-cov/middleware/cookieSession.js deleted file mode 100644 index e54fa47..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/cookieSession.js +++ /dev/null @@ -1,132 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/cookieSession.js']) { - _$jscoverage['middleware/cookieSession.js'] = []; - _$jscoverage['middleware/cookieSession.js'][12] = 0; - _$jscoverage['middleware/cookieSession.js'][46] = 0; - _$jscoverage['middleware/cookieSession.js'][48] = 0; - _$jscoverage['middleware/cookieSession.js'][49] = 0; - _$jscoverage['middleware/cookieSession.js'][52] = 0; - _$jscoverage['middleware/cookieSession.js'][55] = 0; - _$jscoverage['middleware/cookieSession.js'][56] = 0; - _$jscoverage['middleware/cookieSession.js'][59] = 0; - _$jscoverage['middleware/cookieSession.js'][60] = 0; - _$jscoverage['middleware/cookieSession.js'][63] = 0; - _$jscoverage['middleware/cookieSession.js'][66] = 0; - _$jscoverage['middleware/cookieSession.js'][67] = 0; - _$jscoverage['middleware/cookieSession.js'][70] = 0; - _$jscoverage['middleware/cookieSession.js'][71] = 0; - _$jscoverage['middleware/cookieSession.js'][72] = 0; - _$jscoverage['middleware/cookieSession.js'][73] = 0; - _$jscoverage['middleware/cookieSession.js'][74] = 0; - _$jscoverage['middleware/cookieSession.js'][75] = 0; - _$jscoverage['middleware/cookieSession.js'][80] = 0; - _$jscoverage['middleware/cookieSession.js'][82] = 0; - _$jscoverage['middleware/cookieSession.js'][83] = 0; - _$jscoverage['middleware/cookieSession.js'][84] = 0; - _$jscoverage['middleware/cookieSession.js'][85] = 0; - _$jscoverage['middleware/cookieSession.js'][86] = 0; - _$jscoverage['middleware/cookieSession.js'][89] = 0; - _$jscoverage['middleware/cookieSession.js'][92] = 0; - _$jscoverage['middleware/cookieSession.js'][97] = 0; - _$jscoverage['middleware/cookieSession.js'][100] = 0; - _$jscoverage['middleware/cookieSession.js'][101] = 0; - _$jscoverage['middleware/cookieSession.js'][104] = 0; - _$jscoverage['middleware/cookieSession.js'][107] = 0; - _$jscoverage['middleware/cookieSession.js'][108] = 0; - _$jscoverage['middleware/cookieSession.js'][109] = 0; - _$jscoverage['middleware/cookieSession.js'][110] = 0; - _$jscoverage['middleware/cookieSession.js'][113] = 0; -} -_$jscoverage['middleware/cookieSession.js'][12]++; -var utils = require("./../utils"), Cookie = require("./session/cookie"), debug = require("debug")("connect:cookieSession"), signature = require("cookie-signature"), crc16 = require("crc").crc16; -_$jscoverage['middleware/cookieSession.js'][46]++; -module.exports = (function cookieSession(options) { - _$jscoverage['middleware/cookieSession.js'][48]++; - options = options || {}; - _$jscoverage['middleware/cookieSession.js'][49]++; - var key = options.key || "connect.sess", trustProxy = options.proxy; - _$jscoverage['middleware/cookieSession.js'][52]++; - return (function cookieSession(req, res, next) { - _$jscoverage['middleware/cookieSession.js'][55]++; - var secret = options.secret || req.secret; - _$jscoverage['middleware/cookieSession.js'][56]++; - if (! secret) { - _$jscoverage['middleware/cookieSession.js'][56]++; - throw new Error("`secret` option required for cookie sessions"); - } - _$jscoverage['middleware/cookieSession.js'][59]++; - req.session = {}; - _$jscoverage['middleware/cookieSession.js'][60]++; - var cookie = req.session.cookie = new Cookie(options.cookie); - _$jscoverage['middleware/cookieSession.js'][63]++; - if (0 != req.originalUrl.indexOf(cookie.path)) { - _$jscoverage['middleware/cookieSession.js'][63]++; - return next(); - } - _$jscoverage['middleware/cookieSession.js'][66]++; - if (! options.secret && req.secret) { - _$jscoverage['middleware/cookieSession.js'][67]++; - req.session = req.signedCookies[key] || {}; - } - else { - _$jscoverage['middleware/cookieSession.js'][70]++; - var rawCookie = req.cookies[key]; - _$jscoverage['middleware/cookieSession.js'][71]++; - if (rawCookie) { - _$jscoverage['middleware/cookieSession.js'][72]++; - var unsigned = utils.parseSignedCookie(rawCookie, secret); - _$jscoverage['middleware/cookieSession.js'][73]++; - if (unsigned) { - _$jscoverage['middleware/cookieSession.js'][74]++; - var originalHash = crc16(unsigned); - _$jscoverage['middleware/cookieSession.js'][75]++; - req.session = utils.parseJSONCookie(unsigned) || {}; - } - } - } - _$jscoverage['middleware/cookieSession.js'][80]++; - res.on("header", (function () { - _$jscoverage['middleware/cookieSession.js'][82]++; - if (! req.session) { - _$jscoverage['middleware/cookieSession.js'][83]++; - debug("clear session"); - _$jscoverage['middleware/cookieSession.js'][84]++; - cookie.expires = new Date(0); - _$jscoverage['middleware/cookieSession.js'][85]++; - res.setHeader("Set-Cookie", cookie.serialize(key, "")); - _$jscoverage['middleware/cookieSession.js'][86]++; - return; - } - _$jscoverage['middleware/cookieSession.js'][89]++; - delete req.session.cookie; - _$jscoverage['middleware/cookieSession.js'][92]++; - var proto = (req.headers["x-forwarded-proto"] || "").toLowerCase(), tls = req.connection.encrypted || (trustProxy && "https" == proto), secured = cookie.secure && tls; - _$jscoverage['middleware/cookieSession.js'][97]++; - if (cookie.secure && ! secured) { - _$jscoverage['middleware/cookieSession.js'][97]++; - return debug("not secured"); - } - _$jscoverage['middleware/cookieSession.js'][100]++; - debug("serializing %j", req.session); - _$jscoverage['middleware/cookieSession.js'][101]++; - var val = "j:" + JSON.stringify(req.session); - _$jscoverage['middleware/cookieSession.js'][104]++; - if (originalHash == crc16(val)) { - _$jscoverage['middleware/cookieSession.js'][104]++; - return debug("unmodified session"); - } - _$jscoverage['middleware/cookieSession.js'][107]++; - val = "s:" + signature.sign(val, secret); - _$jscoverage['middleware/cookieSession.js'][108]++; - val = cookie.serialize(key, val); - _$jscoverage['middleware/cookieSession.js'][109]++; - debug("set-cookie %j", cookie); - _$jscoverage['middleware/cookieSession.js'][110]++; - res.setHeader("Set-Cookie", val); -})); - _$jscoverage['middleware/cookieSession.js'][113]++; - next(); -}); -}); -_$jscoverage['middleware/cookieSession.js'].source = ["","/*!"," * Connect - cookieSession"," * Copyright(c) 2011 Sencha Inc."," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('./../utils')"," , Cookie = require('./session/cookie')"," , debug = require('debug')('connect:cookieSession')"," , signature = require('cookie-signature')"," , crc16 = require('crc').crc16;","","/**"," * Cookie Session:"," *"," * Cookie session middleware."," *"," * var app = connect();"," * app.use(connect.cookieParser());"," * app.use(connect.cookieSession({ secret: 'tobo!', cookie: { maxAge: 60 * 60 * 1000 }}));"," *"," * Options:"," *"," * - `key` cookie name defaulting to `connect.sess`"," * - `secret` prevents cookie tampering"," * - `cookie` session cookie settings, defaulting to `{ path: '/', httpOnly: true, maxAge: null }`"," * - `proxy` trust the reverse proxy when setting secure cookies (via \"x-forwarded-proto\")"," *"," * Clearing sessions:"," *"," * To clear the session simply set its value to `null`,"," * `cookieSession()` will then respond with a 1970 Set-Cookie."," *"," * req.session = null;"," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","module.exports = function cookieSession(options){"," // TODO: utilize Session/Cookie to unify API"," options = options || {};"," var key = options.key || 'connect.sess'"," , trustProxy = options.proxy;",""," return function cookieSession(req, res, next) {",""," // req.secret is for backwards compatibility"," var secret = options.secret || req.secret;"," if (!secret) throw new Error('`secret` option required for cookie sessions');",""," // default session"," req.session = {};"," var cookie = req.session.cookie = new Cookie(options.cookie);",""," // pathname mismatch"," if (0 != req.originalUrl.indexOf(cookie.path)) return next();",""," // cookieParser secret"," if (!options.secret && req.secret) {"," req.session = req.signedCookies[key] || {};"," } else {"," // TODO: refactor"," var rawCookie = req.cookies[key];"," if (rawCookie) {"," var unsigned = utils.parseSignedCookie(rawCookie, secret);"," if (unsigned) {"," var originalHash = crc16(unsigned);"," req.session = utils.parseJSONCookie(unsigned) || {};"," }"," }"," }",""," res.on('header', function(){"," // removed"," if (!req.session) {"," debug('clear session');"," cookie.expires = new Date(0);"," res.setHeader('Set-Cookie', cookie.serialize(key, ''));"," return;"," }",""," delete req.session.cookie;",""," // check security"," var proto = (req.headers['x-forwarded-proto'] || '').toLowerCase()"," , tls = req.connection.encrypted || (trustProxy && 'https' == proto)"," , secured = cookie.secure && tls;",""," // only send secure cookies via https"," if (cookie.secure && !secured) return debug('not secured');",""," // serialize"," debug('serializing %j', req.session);"," var val = 'j:' + JSON.stringify(req.session);",""," // compare hashes, no need to set-cookie if unchanged"," if (originalHash == crc16(val)) return debug('unmodified session');",""," // set-cookie"," val = 's:' + signature.sign(val, secret);"," val = cookie.serialize(key, val);"," debug('set-cookie %j', cookie);"," res.setHeader('Set-Cookie', val);"," });",""," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/csrf.js b/node_modules/express/node_modules/connect/lib-cov/middleware/csrf.js deleted file mode 100644 index f3919ed..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/csrf.js +++ /dev/null @@ -1,51 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/csrf.js']) { - _$jscoverage['middleware/csrf.js'] = []; - _$jscoverage['middleware/csrf.js'][11] = 0; - _$jscoverage['middleware/csrf.js'][39] = 0; - _$jscoverage['middleware/csrf.js'][40] = 0; - _$jscoverage['middleware/csrf.js'][41] = 0; - _$jscoverage['middleware/csrf.js'][43] = 0; - _$jscoverage['middleware/csrf.js'][45] = 0; - _$jscoverage['middleware/csrf.js'][48] = 0; - _$jscoverage['middleware/csrf.js'][51] = 0; - _$jscoverage['middleware/csrf.js'][54] = 0; - _$jscoverage['middleware/csrf.js'][56] = 0; - _$jscoverage['middleware/csrf.js'][69] = 0; - _$jscoverage['middleware/csrf.js'][70] = 0; -} -_$jscoverage['middleware/csrf.js'][11]++; -var utils = require("../utils"); -_$jscoverage['middleware/csrf.js'][39]++; -module.exports = (function csrf(options) { - _$jscoverage['middleware/csrf.js'][40]++; - options = options || {}; - _$jscoverage['middleware/csrf.js'][41]++; - var value = options.value || defaultValue; - _$jscoverage['middleware/csrf.js'][43]++; - return (function (req, res, next) { - _$jscoverage['middleware/csrf.js'][45]++; - var token = req.session._csrf || (req.session._csrf = utils.uid(24)); - _$jscoverage['middleware/csrf.js'][48]++; - if ("GET" == req.method || "HEAD" == req.method || "OPTIONS" == req.method) { - _$jscoverage['middleware/csrf.js'][48]++; - return next(); - } - _$jscoverage['middleware/csrf.js'][51]++; - var val = value(req); - _$jscoverage['middleware/csrf.js'][54]++; - if (val != token) { - _$jscoverage['middleware/csrf.js'][54]++; - return next(utils.error(403)); - } - _$jscoverage['middleware/csrf.js'][56]++; - next(); -}); -}); -_$jscoverage['middleware/csrf.js'][69]++; -function defaultValue(req) { - _$jscoverage['middleware/csrf.js'][70]++; - return (req.body && req.body._csrf) || (req.query && req.query._csrf) || req.headers["x-csrf-token"]; -} -_$jscoverage['middleware/csrf.js'].source = ["/*!"," * Connect - csrf"," * Copyright(c) 2011 Sencha Inc."," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils');","","/**"," * Anti CSRF:"," *"," * CRSF protection middleware."," *"," * By default this middleware generates a token named \"_csrf\""," * which should be added to requests which mutate"," * state, within a hidden form field, query-string etc. This"," * token is validated against the visitor's `req.session._csrf`"," * property."," *"," * The default `value` function checks `req.body` generated"," * by the `bodyParser()` middleware, `req.query` generated"," * by `query()`, and the \"X-CSRF-Token\" header field."," *"," * This middleware requires session support, thus should be added"," * somewhere _below_ `session()` and `cookieParser()`."," *"," * Options:"," *"," * - `value` a function accepting the request, returning the token "," *"," * @param {Object} options"," * @api public"," */","","module.exports = function csrf(options) {"," options = options || {};"," var value = options.value || defaultValue;",""," return function(req, res, next){"," // generate CSRF token"," var token = req.session._csrf || (req.session._csrf = utils.uid(24));",""," // ignore these methods"," if ('GET' == req.method || 'HEAD' == req.method || 'OPTIONS' == req.method) return next();",""," // determine value"," var val = value(req);",""," // check"," if (val != token) return next(utils.error(403));"," "," next();"," }","};","","/**"," * Default value function, checking the `req.body`"," * and `req.query` for the CSRF token."," *"," * @param {IncomingMessage} req"," * @return {String}"," * @api private"," */","","function defaultValue(req) {"," return (req.body && req.body._csrf)"," || (req.query && req.query._csrf)"," || (req.headers['x-csrf-token']);","}"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/directory.js b/node_modules/express/node_modules/connect/lib-cov/middleware/directory.js deleted file mode 100644 index bc86b60..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/directory.js +++ /dev/null @@ -1,256 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/directory.js']) { - _$jscoverage['middleware/directory.js'] = []; - _$jscoverage['middleware/directory.js'][17] = 0; - _$jscoverage['middleware/directory.js'][29] = 0; - _$jscoverage['middleware/directory.js'][48] = 0; - _$jscoverage['middleware/directory.js'][49] = 0; - _$jscoverage['middleware/directory.js'][52] = 0; - _$jscoverage['middleware/directory.js'][53] = 0; - _$jscoverage['middleware/directory.js'][58] = 0; - _$jscoverage['middleware/directory.js'][59] = 0; - _$jscoverage['middleware/directory.js'][61] = 0; - _$jscoverage['middleware/directory.js'][70] = 0; - _$jscoverage['middleware/directory.js'][73] = 0; - _$jscoverage['middleware/directory.js'][76] = 0; - _$jscoverage['middleware/directory.js'][77] = 0; - _$jscoverage['middleware/directory.js'][81] = 0; - _$jscoverage['middleware/directory.js'][84] = 0; - _$jscoverage['middleware/directory.js'][85] = 0; - _$jscoverage['middleware/directory.js'][86] = 0; - _$jscoverage['middleware/directory.js'][87] = 0; - _$jscoverage['middleware/directory.js'][88] = 0; - _$jscoverage['middleware/directory.js'][91] = 0; - _$jscoverage['middleware/directory.js'][92] = 0; - _$jscoverage['middleware/directory.js'][93] = 0; - _$jscoverage['middleware/directory.js'][94] = 0; - _$jscoverage['middleware/directory.js'][99] = 0; - _$jscoverage['middleware/directory.js'][109] = 0; - _$jscoverage['middleware/directory.js'][110] = 0; - _$jscoverage['middleware/directory.js'][111] = 0; - _$jscoverage['middleware/directory.js'][112] = 0; - _$jscoverage['middleware/directory.js'][113] = 0; - _$jscoverage['middleware/directory.js'][114] = 0; - _$jscoverage['middleware/directory.js'][115] = 0; - _$jscoverage['middleware/directory.js'][120] = 0; - _$jscoverage['middleware/directory.js'][121] = 0; - _$jscoverage['middleware/directory.js'][122] = 0; - _$jscoverage['middleware/directory.js'][131] = 0; - _$jscoverage['middleware/directory.js'][132] = 0; - _$jscoverage['middleware/directory.js'][133] = 0; - _$jscoverage['middleware/directory.js'][134] = 0; - _$jscoverage['middleware/directory.js'][135] = 0; - _$jscoverage['middleware/directory.js'][142] = 0; - _$jscoverage['middleware/directory.js'][143] = 0; - _$jscoverage['middleware/directory.js'][144] = 0; - _$jscoverage['middleware/directory.js'][145] = 0; - _$jscoverage['middleware/directory.js'][146] = 0; - _$jscoverage['middleware/directory.js'][153] = 0; - _$jscoverage['middleware/directory.js'][154] = 0; - _$jscoverage['middleware/directory.js'][155] = 0; - _$jscoverage['middleware/directory.js'][156] = 0; - _$jscoverage['middleware/directory.js'][157] = 0; - _$jscoverage['middleware/directory.js'][165] = 0; - _$jscoverage['middleware/directory.js'][166] = 0; - _$jscoverage['middleware/directory.js'][167] = 0; - _$jscoverage['middleware/directory.js'][170] = 0; - _$jscoverage['middleware/directory.js'][171] = 0; - _$jscoverage['middleware/directory.js'][172] = 0; - _$jscoverage['middleware/directory.js'][173] = 0; - _$jscoverage['middleware/directory.js'][176] = 0; - _$jscoverage['middleware/directory.js'][194] = 0; - _$jscoverage['middleware/directory.js'][195] = 0; - _$jscoverage['middleware/directory.js'][196] = 0; - _$jscoverage['middleware/directory.js'][208] = 0; - _$jscoverage['middleware/directory.js'][209] = 0; - _$jscoverage['middleware/directory.js'][210] = 0; - _$jscoverage['middleware/directory.js'][218] = 0; -} -_$jscoverage['middleware/directory.js'][17]++; -var fs = require("fs"), parse = require("url").parse, utils = require("../utils"), path = require("path"), normalize = path.normalize, extname = path.extname, join = path.join; -_$jscoverage['middleware/directory.js'][29]++; -var cache = {}; -_$jscoverage['middleware/directory.js'][48]++; -exports = module.exports = (function directory(root, options) { - _$jscoverage['middleware/directory.js'][49]++; - options = options || {}; - _$jscoverage['middleware/directory.js'][52]++; - if (! root) { - _$jscoverage['middleware/directory.js'][52]++; - throw new Error("directory() root path required"); - } - _$jscoverage['middleware/directory.js'][53]++; - var hidden = options.hidden, icons = options.icons, filter = options.filter, root = normalize(root); - _$jscoverage['middleware/directory.js'][58]++; - return (function directory(req, res, next) { - _$jscoverage['middleware/directory.js'][59]++; - if ("GET" != req.method && "HEAD" != req.method) { - _$jscoverage['middleware/directory.js'][59]++; - return next(); - } - _$jscoverage['middleware/directory.js'][61]++; - var accept = req.headers.accept || "text/plain", url = parse(req.url), dir = decodeURIComponent(url.pathname), path = normalize(join(root, dir)), originalUrl = parse(req.originalUrl), originalDir = decodeURIComponent(originalUrl.pathname), showUp = path != root && path != root + "/"; - _$jscoverage['middleware/directory.js'][70]++; - if (~ path.indexOf("\u0000")) { - _$jscoverage['middleware/directory.js'][70]++; - return next(utils.error(400)); - } - _$jscoverage['middleware/directory.js'][73]++; - if (0 != path.indexOf(root)) { - _$jscoverage['middleware/directory.js'][73]++; - return next(utils.error(403)); - } - _$jscoverage['middleware/directory.js'][76]++; - fs.stat(path, (function (err, stat) { - _$jscoverage['middleware/directory.js'][77]++; - if (err) { - _$jscoverage['middleware/directory.js'][77]++; - return "ENOENT" == err.code? next(): next(err); - } - _$jscoverage['middleware/directory.js'][81]++; - if (! stat.isDirectory()) { - _$jscoverage['middleware/directory.js'][81]++; - return next(); - } - _$jscoverage['middleware/directory.js'][84]++; - fs.readdir(path, (function (err, files) { - _$jscoverage['middleware/directory.js'][85]++; - if (err) { - _$jscoverage['middleware/directory.js'][85]++; - return next(err); - } - _$jscoverage['middleware/directory.js'][86]++; - if (! hidden) { - _$jscoverage['middleware/directory.js'][86]++; - files = removeHidden(files); - } - _$jscoverage['middleware/directory.js'][87]++; - if (filter) { - _$jscoverage['middleware/directory.js'][87]++; - files = files.filter(filter); - } - _$jscoverage['middleware/directory.js'][88]++; - files.sort(); - _$jscoverage['middleware/directory.js'][91]++; - for (var key in exports) { - _$jscoverage['middleware/directory.js'][92]++; - if (~ accept.indexOf(key) || ~ accept.indexOf("*/*")) { - _$jscoverage['middleware/directory.js'][93]++; - exports[key](req, res, files, next, originalDir, showUp, icons); - _$jscoverage['middleware/directory.js'][94]++; - return; - } -} - _$jscoverage['middleware/directory.js'][99]++; - next(utils.error(406)); -})); -})); -}); -}); -_$jscoverage['middleware/directory.js'][109]++; -exports.html = (function (req, res, files, next, dir, showUp, icons) { - _$jscoverage['middleware/directory.js'][110]++; - fs.readFile(__dirname + "/../public/directory.html", "utf8", (function (err, str) { - _$jscoverage['middleware/directory.js'][111]++; - if (err) { - _$jscoverage['middleware/directory.js'][111]++; - return next(err); - } - _$jscoverage['middleware/directory.js'][112]++; - fs.readFile(__dirname + "/../public/style.css", "utf8", (function (err, style) { - _$jscoverage['middleware/directory.js'][113]++; - if (err) { - _$jscoverage['middleware/directory.js'][113]++; - return next(err); - } - _$jscoverage['middleware/directory.js'][114]++; - if (showUp) { - _$jscoverage['middleware/directory.js'][114]++; - files.unshift(".."); - } - _$jscoverage['middleware/directory.js'][115]++; - str = str.replace("{style}", style).replace("{files}", html(files, dir, icons)).replace("{directory}", dir).replace("{linked-path}", htmlPath(dir)); - _$jscoverage['middleware/directory.js'][120]++; - res.setHeader("Content-Type", "text/html"); - _$jscoverage['middleware/directory.js'][121]++; - res.setHeader("Content-Length", str.length); - _$jscoverage['middleware/directory.js'][122]++; - res.end(str); -})); -})); -}); -_$jscoverage['middleware/directory.js'][131]++; -exports.json = (function (req, res, files) { - _$jscoverage['middleware/directory.js'][132]++; - files = JSON.stringify(files); - _$jscoverage['middleware/directory.js'][133]++; - res.setHeader("Content-Type", "application/json"); - _$jscoverage['middleware/directory.js'][134]++; - res.setHeader("Content-Length", files.length); - _$jscoverage['middleware/directory.js'][135]++; - res.end(files); -}); -_$jscoverage['middleware/directory.js'][142]++; -exports.plain = (function (req, res, files) { - _$jscoverage['middleware/directory.js'][143]++; - files = files.join("\n") + "\n"; - _$jscoverage['middleware/directory.js'][144]++; - res.setHeader("Content-Type", "text/plain"); - _$jscoverage['middleware/directory.js'][145]++; - res.setHeader("Content-Length", files.length); - _$jscoverage['middleware/directory.js'][146]++; - res.end(files); -}); -_$jscoverage['middleware/directory.js'][153]++; -function htmlPath(dir) { - _$jscoverage['middleware/directory.js'][154]++; - var curr = []; - _$jscoverage['middleware/directory.js'][155]++; - return dir.split("/").map((function (part) { - _$jscoverage['middleware/directory.js'][156]++; - curr.push(part); - _$jscoverage['middleware/directory.js'][157]++; - return "" + part + ""; -})).join(" / "); -} -_$jscoverage['middleware/directory.js'][165]++; -function html(files, dir, useIcons) { - _$jscoverage['middleware/directory.js'][166]++; - return "
        " + files.map((function (file) { - _$jscoverage['middleware/directory.js'][167]++; - var icon = "", classes = []; - _$jscoverage['middleware/directory.js'][170]++; - if (useIcons && ".." != file) { - _$jscoverage['middleware/directory.js'][171]++; - icon = icons[extname(file)] || icons["default"]; - _$jscoverage['middleware/directory.js'][172]++; - icon = ""; - _$jscoverage['middleware/directory.js'][173]++; - classes.push("icon"); - } - _$jscoverage['middleware/directory.js'][176]++; - return "
      • " + icon + file + "
      • "; -})).join("\n") + "
      "; -} -_$jscoverage['middleware/directory.js'][194]++; -function load(icon) { - _$jscoverage['middleware/directory.js'][195]++; - if (cache[icon]) { - _$jscoverage['middleware/directory.js'][195]++; - return cache[icon]; - } - _$jscoverage['middleware/directory.js'][196]++; - return cache[icon] = fs.readFileSync(__dirname + "/../public/icons/" + icon, "base64"); -} -_$jscoverage['middleware/directory.js'][208]++; -function removeHidden(files) { - _$jscoverage['middleware/directory.js'][209]++; - return files.filter((function (file) { - _$jscoverage['middleware/directory.js'][210]++; - return "." != file[0]; -})); -} -_$jscoverage['middleware/directory.js'][218]++; -var icons = {".js": "page_white_code_red.png", ".c": "page_white_c.png", ".h": "page_white_h.png", ".cc": "page_white_cplusplus.png", ".php": "page_white_php.png", ".rb": "page_white_ruby.png", ".cpp": "page_white_cplusplus.png", ".swf": "page_white_flash.png", ".pdf": "page_white_acrobat.png", "default": "page_white.png"}; -_$jscoverage['middleware/directory.js'].source = ["","/*!"," * Connect - directory"," * Copyright(c) 2011 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","// TODO: icon / style for directories","// TODO: arrow key navigation","// TODO: make icons extensible","","/**"," * Module dependencies."," */","","var fs = require('fs')"," , parse = require('url').parse"," , utils = require('../utils')"," , path = require('path')"," , normalize = path.normalize"," , extname = path.extname"," , join = path.join;","","/*!"," * Icon cache."," */","","var cache = {};","","/**"," * Directory:"," *"," * Serve directory listings with the given `root` path."," *"," * Options:"," *"," * - `hidden` display hidden (dot) files. Defaults to false."," * - `icons` display icons. Defaults to false."," * - `filter` Apply this filter function to files. Defaults to false."," *"," * @param {String} root"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function directory(root, options){"," options = options || {};",""," // root required"," if (!root) throw new Error('directory() root path required');"," var hidden = options.hidden"," , icons = options.icons"," , filter = options.filter"," , root = normalize(root);",""," return function directory(req, res, next) {"," if ('GET' != req.method && 'HEAD' != req.method) return next();",""," var accept = req.headers.accept || 'text/plain'"," , url = parse(req.url)"," , dir = decodeURIComponent(url.pathname)"," , path = normalize(join(root, dir))"," , originalUrl = parse(req.originalUrl)"," , originalDir = decodeURIComponent(originalUrl.pathname)"," , showUp = path != root && path != root + '/';",""," // null byte(s), bad request"," if (~path.indexOf('\\0')) return next(utils.error(400));",""," // malicious path, forbidden"," if (0 != path.indexOf(root)) return next(utils.error(403));",""," // check if we have a directory"," fs.stat(path, function(err, stat){"," if (err) return 'ENOENT' == err.code"," ? next()"," : next(err);",""," if (!stat.isDirectory()) return next();",""," // fetch files"," fs.readdir(path, function(err, files){"," if (err) return next(err);"," if (!hidden) files = removeHidden(files);"," if (filter) files = files.filter(filter);"," files.sort();",""," // content-negotiation"," for (var key in exports) {"," if (~accept.indexOf(key) || ~accept.indexOf('*/*')) {"," exports[key](req, res, files, next, originalDir, showUp, icons);"," return;"," }"," }",""," // not acceptable"," next(utils.error(406));"," });"," });"," };","};","","/**"," * Respond with text/html."," */","","exports.html = function(req, res, files, next, dir, showUp, icons){"," fs.readFile(__dirname + '/../public/directory.html', 'utf8', function(err, str){"," if (err) return next(err);"," fs.readFile(__dirname + '/../public/style.css', 'utf8', function(err, style){"," if (err) return next(err);"," if (showUp) files.unshift('..');"," str = str"," .replace('{style}', style)"," .replace('{files}', html(files, dir, icons))"," .replace('{directory}', dir)"," .replace('{linked-path}', htmlPath(dir));"," res.setHeader('Content-Type', 'text/html');"," res.setHeader('Content-Length', str.length);"," res.end(str);"," });"," });","};","","/**"," * Respond with application/json."," */","","exports.json = function(req, res, files){"," files = JSON.stringify(files);"," res.setHeader('Content-Type', 'application/json');"," res.setHeader('Content-Length', files.length);"," res.end(files);","};","","/**"," * Respond with text/plain."," */","","exports.plain = function(req, res, files){"," files = files.join('\\n') + '\\n';"," res.setHeader('Content-Type', 'text/plain');"," res.setHeader('Content-Length', files.length);"," res.end(files);","};","","/**"," * Map html `dir`, returning a linked path."," */","","function htmlPath(dir) {"," var curr = [];"," return dir.split('/').map(function(part){"," curr.push(part);"," return '<a href=\"' + curr.join('/') + '\">' + part + '</a>';"," }).join(' / ');","}","","/**"," * Map html `files`, returning an html unordered list."," */","","function html(files, dir, useIcons) {"," return '<ul id=\"files\">' + files.map(function(file){"," var icon = ''"," , classes = [];",""," if (useIcons && '..' != file) {"," icon = icons[extname(file)] || icons.default;"," icon = '<img src=\"data:image/png;base64,' + load(icon) + '\" />';"," classes.push('icon');"," }",""," return '<li><a href=\"'"," + join(dir, file)"," + '\" class=\"'"," + classes.join(' ') + '\"'"," + ' title=\"' + file + '\">'"," + icon + file + '</a></li>';",""," }).join('\\n') + '</ul>';","}","","/**"," * Load and cache the given `icon`."," *"," * @param {String} icon"," * @return {String}"," * @api private"," */","","function load(icon) {"," if (cache[icon]) return cache[icon];"," return cache[icon] = fs.readFileSync(__dirname + '/../public/icons/' + icon, 'base64');","}","","/**"," * Filter \"hidden\" `files`, aka files"," * beginning with a `.`."," *"," * @param {Array} files"," * @return {Array}"," * @api private"," */","","function removeHidden(files) {"," return files.filter(function(file){"," return '.' != file[0];"," });","}","","/**"," * Icon map."," */","","var icons = {"," '.js': 'page_white_code_red.png'"," , '.c': 'page_white_c.png'"," , '.h': 'page_white_h.png'"," , '.cc': 'page_white_cplusplus.png'"," , '.php': 'page_white_php.png'"," , '.rb': 'page_white_ruby.png'"," , '.cpp': 'page_white_cplusplus.png'"," , '.swf': 'page_white_flash.png'"," , '.pdf': 'page_white_acrobat.png'"," , 'default': 'page_white.png'","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/errorHandler.js b/node_modules/express/node_modules/connect/lib-cov/middleware/errorHandler.js deleted file mode 100644 index 9a87bfa..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/errorHandler.js +++ /dev/null @@ -1,104 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/errorHandler.js']) { - _$jscoverage['middleware/errorHandler.js'] = []; - _$jscoverage['middleware/errorHandler.js'][12] = 0; - _$jscoverage['middleware/errorHandler.js'][17] = 0; - _$jscoverage['middleware/errorHandler.js'][44] = 0; - _$jscoverage['middleware/errorHandler.js'][45] = 0; - _$jscoverage['middleware/errorHandler.js'][46] = 0; - _$jscoverage['middleware/errorHandler.js'][47] = 0; - _$jscoverage['middleware/errorHandler.js'][48] = 0; - _$jscoverage['middleware/errorHandler.js'][49] = 0; - _$jscoverage['middleware/errorHandler.js'][51] = 0; - _$jscoverage['middleware/errorHandler.js'][52] = 0; - _$jscoverage['middleware/errorHandler.js'][53] = 0; - _$jscoverage['middleware/errorHandler.js'][54] = 0; - _$jscoverage['middleware/errorHandler.js'][56] = 0; - _$jscoverage['middleware/errorHandler.js'][57] = 0; - _$jscoverage['middleware/errorHandler.js'][63] = 0; - _$jscoverage['middleware/errorHandler.js'][64] = 0; - _$jscoverage['middleware/errorHandler.js'][68] = 0; - _$jscoverage['middleware/errorHandler.js'][69] = 0; - _$jscoverage['middleware/errorHandler.js'][70] = 0; - _$jscoverage['middleware/errorHandler.js'][71] = 0; - _$jscoverage['middleware/errorHandler.js'][72] = 0; - _$jscoverage['middleware/errorHandler.js'][73] = 0; - _$jscoverage['middleware/errorHandler.js'][76] = 0; - _$jscoverage['middleware/errorHandler.js'][77] = 0; - _$jscoverage['middleware/errorHandler.js'][86] = 0; -} -_$jscoverage['middleware/errorHandler.js'][12]++; -var utils = require("../utils"), fs = require("fs"); -_$jscoverage['middleware/errorHandler.js'][17]++; -var env = process.env.NODE_ENV || "development"; -_$jscoverage['middleware/errorHandler.js'][44]++; -exports = module.exports = (function errorHandler() { - _$jscoverage['middleware/errorHandler.js'][45]++; - return (function errorHandler(err, req, res, next) { - _$jscoverage['middleware/errorHandler.js'][46]++; - if (err.status) { - _$jscoverage['middleware/errorHandler.js'][46]++; - res.statusCode = err.status; - } - _$jscoverage['middleware/errorHandler.js'][47]++; - if (res.statusCode < 400) { - _$jscoverage['middleware/errorHandler.js'][47]++; - res.statusCode = 500; - } - _$jscoverage['middleware/errorHandler.js'][48]++; - if ("test" != env) { - _$jscoverage['middleware/errorHandler.js'][48]++; - console.error(err.stack); - } - _$jscoverage['middleware/errorHandler.js'][49]++; - var accept = req.headers.accept || ""; - _$jscoverage['middleware/errorHandler.js'][51]++; - if (~ accept.indexOf("html")) { - _$jscoverage['middleware/errorHandler.js'][52]++; - fs.readFile(__dirname + "/../public/style.css", "utf8", (function (e, style) { - _$jscoverage['middleware/errorHandler.js'][53]++; - fs.readFile(__dirname + "/../public/error.html", "utf8", (function (e, html) { - _$jscoverage['middleware/errorHandler.js'][54]++; - var stack = (err.stack || "").split("\n").slice(1).map((function (v) { - _$jscoverage['middleware/errorHandler.js'][56]++; - return "
    1. " + v + "
    2. "; -})).join(""); - _$jscoverage['middleware/errorHandler.js'][57]++; - html = html.replace("{style}", style).replace("{stack}", stack).replace("{title}", exports.title).replace("{statusCode}", res.statusCode).replace(/\{error\}/g, utils.escape(err.toString())); - _$jscoverage['middleware/errorHandler.js'][63]++; - res.setHeader("Content-Type", "text/html; charset=utf-8"); - _$jscoverage['middleware/errorHandler.js'][64]++; - res.end(html); -})); -})); - } - else { - _$jscoverage['middleware/errorHandler.js'][68]++; - if (~ accept.indexOf("json")) { - _$jscoverage['middleware/errorHandler.js'][69]++; - var error = {message: err.message, stack: err.stack}; - _$jscoverage['middleware/errorHandler.js'][70]++; - for (var prop in err) { - _$jscoverage['middleware/errorHandler.js'][70]++; - error[prop] = err[prop]; -} - _$jscoverage['middleware/errorHandler.js'][71]++; - var json = JSON.stringify({error: error}); - _$jscoverage['middleware/errorHandler.js'][72]++; - res.setHeader("Content-Type", "application/json"); - _$jscoverage['middleware/errorHandler.js'][73]++; - res.end(json); - } - else { - _$jscoverage['middleware/errorHandler.js'][76]++; - res.writeHead(res.statusCode, {"Content-Type": "text/plain"}); - _$jscoverage['middleware/errorHandler.js'][77]++; - res.end(err.stack); - } - } -}); -}); -_$jscoverage['middleware/errorHandler.js'][86]++; -exports.title = "Connect"; -_$jscoverage['middleware/errorHandler.js'].source = ["/*!"," * Connect - errorHandler"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils')"," , fs = require('fs');","","// environment","","var env = process.env.NODE_ENV || 'development';","","/**"," * Error handler:"," *"," * Development error handler, providing stack traces"," * and error message responses for requests accepting text, html,"," * or json."," *"," * Text:"," *"," * By default, and when _text/plain_ is accepted a simple stack trace"," * or error message will be returned."," *"," * JSON:"," *"," * When _application/json_ is accepted, connect will respond with"," * an object in the form of `{ \"error\": error }`."," *"," * HTML:"," *"," * When accepted connect will output a nice html stack trace."," *"," * @return {Function}"," * @api public"," */","","exports = module.exports = function errorHandler(){"," return function errorHandler(err, req, res, next){"," if (err.status) res.statusCode = err.status;"," if (res.statusCode < 400) res.statusCode = 500;"," if ('test' != env) console.error(err.stack);"," var accept = req.headers.accept || '';"," // html"," if (~accept.indexOf('html')) {"," fs.readFile(__dirname + '/../public/style.css', 'utf8', function(e, style){"," fs.readFile(__dirname + '/../public/error.html', 'utf8', function(e, html){"," var stack = (err.stack || '')"," .split('\\n').slice(1)"," .map(function(v){ return '<li>' + v + '</li>'; }).join('');"," html = html"," .replace('{style}', style)"," .replace('{stack}', stack)"," .replace('{title}', exports.title)"," .replace('{statusCode}', res.statusCode)"," .replace(/\\{error\\}/g, utils.escape(err.toString()));"," res.setHeader('Content-Type', 'text/html; charset=utf-8');"," res.end(html);"," });"," });"," // json"," } else if (~accept.indexOf('json')) {"," var error = { message: err.message, stack: err.stack };"," for (var prop in err) error[prop] = err[prop];"," var json = JSON.stringify({ error: error });"," res.setHeader('Content-Type', 'application/json');"," res.end(json);"," // plain text"," } else {"," res.writeHead(res.statusCode, { 'Content-Type': 'text/plain' });"," res.end(err.stack);"," }"," };","};","","/**"," * Template title, framework authors may override this value."," */","","exports.title = 'Connect';"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/favicon.js b/node_modules/express/node_modules/connect/lib-cov/middleware/favicon.js deleted file mode 100644 index 6228079..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/favicon.js +++ /dev/null @@ -1,60 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/favicon.js']) { - _$jscoverage['middleware/favicon.js'] = []; - _$jscoverage['middleware/favicon.js'][13] = 0; - _$jscoverage['middleware/favicon.js'][50] = 0; - _$jscoverage['middleware/favicon.js'][51] = 0; - _$jscoverage['middleware/favicon.js'][56] = 0; - _$jscoverage['middleware/favicon.js'][57] = 0; - _$jscoverage['middleware/favicon.js'][58] = 0; - _$jscoverage['middleware/favicon.js'][59] = 0; - _$jscoverage['middleware/favicon.js'][60] = 0; - _$jscoverage['middleware/favicon.js'][62] = 0; - _$jscoverage['middleware/favicon.js'][63] = 0; - _$jscoverage['middleware/favicon.js'][64] = 0; - _$jscoverage['middleware/favicon.js'][73] = 0; - _$jscoverage['middleware/favicon.js'][74] = 0; - _$jscoverage['middleware/favicon.js'][78] = 0; -} -_$jscoverage['middleware/favicon.js'][13]++; -var fs = require("fs"), utils = require("../utils"); -_$jscoverage['middleware/favicon.js'][50]++; -module.exports = (function favicon(path, options) { - _$jscoverage['middleware/favicon.js'][51]++; - var options = options || {}, path = path || __dirname + "/../public/favicon.ico", maxAge = options.maxAge || 86400000, icon; - _$jscoverage['middleware/favicon.js'][56]++; - return (function favicon(req, res, next) { - _$jscoverage['middleware/favicon.js'][57]++; - if ("/favicon.ico" == req.url) { - _$jscoverage['middleware/favicon.js'][58]++; - if (icon) { - _$jscoverage['middleware/favicon.js'][59]++; - res.writeHead(200, icon.headers); - _$jscoverage['middleware/favicon.js'][60]++; - res.end(icon.body); - } - else { - _$jscoverage['middleware/favicon.js'][62]++; - fs.readFile(path, (function (err, buf) { - _$jscoverage['middleware/favicon.js'][63]++; - if (err) { - _$jscoverage['middleware/favicon.js'][63]++; - return next(err); - } - _$jscoverage['middleware/favicon.js'][64]++; - icon = {headers: {"Content-Type": "image/x-icon", "Content-Length": buf.length, "ETag": "\"" + utils.md5(buf) + "\"", "Cache-Control": "public, max-age=" + (maxAge / 1000)}, body: buf}; - _$jscoverage['middleware/favicon.js'][73]++; - res.writeHead(200, icon.headers); - _$jscoverage['middleware/favicon.js'][74]++; - res.end(icon.body); -})); - } - } - else { - _$jscoverage['middleware/favicon.js'][78]++; - next(); - } -}); -}); -_$jscoverage['middleware/favicon.js'].source = ["","/*!"," * Connect - favicon"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var fs = require('fs')"," , utils = require('../utils');","","/**"," * Favicon:"," *"," * By default serves the connect favicon, or the favicon"," * located by the given `path`."," *"," * Options:"," *"," * - `maxAge` cache-control max-age directive, defaulting to 1 day"," *"," * Examples:"," *"," * Serve default favicon:"," *"," * connect()"," * .use(connect.favicon())"," *"," * Serve favicon before logging for brevity:"," *"," * connect()"," * .use(connect.favicon())"," * .use(connect.logger('dev'))"," *"," * Serve custom favicon:"," *"," * connect()"," * .use(connect.favicon('public/favicon.ico))"," *"," * @param {String} path"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","module.exports = function favicon(path, options){"," var options = options || {}"," , path = path || __dirname + '/../public/favicon.ico'"," , maxAge = options.maxAge || 86400000"," , icon; // favicon cache",""," return function favicon(req, res, next){"," if ('/favicon.ico' == req.url) {"," if (icon) {"," res.writeHead(200, icon.headers);"," res.end(icon.body);"," } else {"," fs.readFile(path, function(err, buf){"," if (err) return next(err);"," icon = {"," headers: {"," 'Content-Type': 'image/x-icon'"," , 'Content-Length': buf.length"," , 'ETag': '\"' + utils.md5(buf) + '\"'"," , 'Cache-Control': 'public, max-age=' + (maxAge / 1000)"," },"," body: buf"," };"," res.writeHead(200, icon.headers);"," res.end(icon.body);"," });"," }"," } else {"," next();"," }"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/json.js b/node_modules/express/node_modules/connect/lib-cov/middleware/json.js deleted file mode 100644 index 87236cf..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/json.js +++ /dev/null @@ -1,117 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/json.js']) { - _$jscoverage['middleware/json.js'] = []; - _$jscoverage['middleware/json.js'][13] = 0; - _$jscoverage['middleware/json.js'][20] = 0; - _$jscoverage['middleware/json.js'][21] = 0; - _$jscoverage['middleware/json.js'][41] = 0; - _$jscoverage['middleware/json.js'][42] = 0; - _$jscoverage['middleware/json.js'][45] = 0; - _$jscoverage['middleware/json.js'][49] = 0; - _$jscoverage['middleware/json.js'][50] = 0; - _$jscoverage['middleware/json.js'][51] = 0; - _$jscoverage['middleware/json.js'][53] = 0; - _$jscoverage['middleware/json.js'][56] = 0; - _$jscoverage['middleware/json.js'][59] = 0; - _$jscoverage['middleware/json.js'][62] = 0; - _$jscoverage['middleware/json.js'][63] = 0; - _$jscoverage['middleware/json.js'][64] = 0; - _$jscoverage['middleware/json.js'][65] = 0; - _$jscoverage['middleware/json.js'][66] = 0; - _$jscoverage['middleware/json.js'][67] = 0; - _$jscoverage['middleware/json.js'][68] = 0; - _$jscoverage['middleware/json.js'][70] = 0; - _$jscoverage['middleware/json.js'][71] = 0; - _$jscoverage['middleware/json.js'][74] = 0; - _$jscoverage['middleware/json.js'][75] = 0; - _$jscoverage['middleware/json.js'][76] = 0; - _$jscoverage['middleware/json.js'][77] = 0; - _$jscoverage['middleware/json.js'][79] = 0; - _$jscoverage['middleware/json.js'][80] = 0; - _$jscoverage['middleware/json.js'][81] = 0; -} -_$jscoverage['middleware/json.js'][13]++; -var utils = require("../utils"), _limit = require("./limit"); -_$jscoverage['middleware/json.js'][20]++; -function noop(req, res, next) { - _$jscoverage['middleware/json.js'][21]++; - next(); -} -_$jscoverage['middleware/json.js'][41]++; -exports = module.exports = (function (options) { - _$jscoverage['middleware/json.js'][42]++; - var options = options || {}, strict = options.strict !== false; - _$jscoverage['middleware/json.js'][45]++; - var limit = options.limit? _limit(options.limit): noop; - _$jscoverage['middleware/json.js'][49]++; - return (function json(req, res, next) { - _$jscoverage['middleware/json.js'][50]++; - if (req._body) { - _$jscoverage['middleware/json.js'][50]++; - return next(); - } - _$jscoverage['middleware/json.js'][51]++; - req.body = req.body || {}; - _$jscoverage['middleware/json.js'][53]++; - if (! utils.hasBody(req)) { - _$jscoverage['middleware/json.js'][53]++; - return next(); - } - _$jscoverage['middleware/json.js'][56]++; - if ("application/json" != utils.mime(req)) { - _$jscoverage['middleware/json.js'][56]++; - return next(); - } - _$jscoverage['middleware/json.js'][59]++; - req._body = true; - _$jscoverage['middleware/json.js'][62]++; - limit(req, res, (function (err) { - _$jscoverage['middleware/json.js'][63]++; - if (err) { - _$jscoverage['middleware/json.js'][63]++; - return next(err); - } - _$jscoverage['middleware/json.js'][64]++; - var buf = ""; - _$jscoverage['middleware/json.js'][65]++; - req.setEncoding("utf8"); - _$jscoverage['middleware/json.js'][66]++; - req.on("data", (function (chunk) { - _$jscoverage['middleware/json.js'][66]++; - buf += chunk; -})); - _$jscoverage['middleware/json.js'][67]++; - req.on("end", (function () { - _$jscoverage['middleware/json.js'][68]++; - var first = buf.trim()[0]; - _$jscoverage['middleware/json.js'][70]++; - if (0 == buf.length) { - _$jscoverage['middleware/json.js'][71]++; - return next(utils.error(400, "invalid json, empty body")); - } - _$jscoverage['middleware/json.js'][74]++; - if (strict && "{" != first && "[" != first) { - _$jscoverage['middleware/json.js'][74]++; - return next(utils.error(400, "invalid json")); - } - _$jscoverage['middleware/json.js'][75]++; - try { - _$jscoverage['middleware/json.js'][76]++; - req.body = JSON.parse(buf, options.reviver); - _$jscoverage['middleware/json.js'][77]++; - next(); - } - catch (err) { - _$jscoverage['middleware/json.js'][79]++; - err.body = buf; - _$jscoverage['middleware/json.js'][80]++; - err.status = 400; - _$jscoverage['middleware/json.js'][81]++; - next(err); - } -})); -})); -}); -}); -_$jscoverage['middleware/json.js'].source = ["","/*!"," * Connect - json"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils')"," , _limit = require('./limit');","","/**"," * noop middleware."," */","","function noop(req, res, next) {"," next();","}","","/**"," * JSON:"," *"," * Parse JSON request bodies, providing the"," * parsed object as `req.body`."," *"," * Options:"," *"," * - `strict` when `false` anything `JSON.parse()` accepts will be parsed"," * - `reviver` used as the second \"reviver\" argument for JSON.parse"," * - `limit` byte limit disabled by default"," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function(options){"," var options = options || {}"," , strict = options.strict !== false;",""," var limit = options.limit"," ? _limit(options.limit)"," : noop;",""," return function json(req, res, next) {"," if (req._body) return next();"," req.body = req.body || {};",""," if (!utils.hasBody(req)) return next();",""," // check Content-Type"," if ('application/json' != utils.mime(req)) return next();",""," // flag as parsed"," req._body = true;",""," // parse"," limit(req, res, function(err){"," if (err) return next(err);"," var buf = '';"," req.setEncoding('utf8');"," req.on('data', function(chunk){ buf += chunk });"," req.on('end', function(){"," var first = buf.trim()[0];",""," if (0 == buf.length) {"," return next(utils.error(400, 'invalid json, empty body'));"," }"," "," if (strict && '{' != first && '[' != first) return next(utils.error(400, 'invalid json'));"," try {"," req.body = JSON.parse(buf, options.reviver);"," next();"," } catch (err){"," err.body = buf;"," err.status = 400;"," next(err);"," }"," });"," });"," }","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/limit.js b/node_modules/express/node_modules/connect/lib-cov/middleware/limit.js deleted file mode 100644 index fa8ea34..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/limit.js +++ /dev/null @@ -1,63 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/limit.js']) { - _$jscoverage['middleware/limit.js'] = []; - _$jscoverage['middleware/limit.js'][12] = 0; - _$jscoverage['middleware/limit.js'][31] = 0; - _$jscoverage['middleware/limit.js'][32] = 0; - _$jscoverage['middleware/limit.js'][33] = 0; - _$jscoverage['middleware/limit.js'][34] = 0; - _$jscoverage['middleware/limit.js'][35] = 0; - _$jscoverage['middleware/limit.js'][41] = 0; - _$jscoverage['middleware/limit.js'][42] = 0; - _$jscoverage['middleware/limit.js'][45] = 0; - _$jscoverage['middleware/limit.js'][48] = 0; - _$jscoverage['middleware/limit.js'][49] = 0; - _$jscoverage['middleware/limit.js'][50] = 0; - _$jscoverage['middleware/limit.js'][53] = 0; -} -_$jscoverage['middleware/limit.js'][12]++; -var utils = require("../utils"); -_$jscoverage['middleware/limit.js'][31]++; -module.exports = (function limit(bytes) { - _$jscoverage['middleware/limit.js'][32]++; - if ("string" == typeof bytes) { - _$jscoverage['middleware/limit.js'][32]++; - bytes = utils.parseBytes(bytes); - } - _$jscoverage['middleware/limit.js'][33]++; - if ("number" != typeof bytes) { - _$jscoverage['middleware/limit.js'][33]++; - throw new Error("limit() bytes required"); - } - _$jscoverage['middleware/limit.js'][34]++; - return (function limit(req, res, next) { - _$jscoverage['middleware/limit.js'][35]++; - var received = 0, len = req.headers["content-length"]? parseInt(req.headers["content-length"], 10): null; - _$jscoverage['middleware/limit.js'][41]++; - if (req._limit) { - _$jscoverage['middleware/limit.js'][41]++; - return next(); - } - _$jscoverage['middleware/limit.js'][42]++; - req._limit = true; - _$jscoverage['middleware/limit.js'][45]++; - if (len && len > bytes) { - _$jscoverage['middleware/limit.js'][45]++; - return next(utils.error(413)); - } - _$jscoverage['middleware/limit.js'][48]++; - req.on("data", (function (chunk) { - _$jscoverage['middleware/limit.js'][49]++; - received += chunk.length; - _$jscoverage['middleware/limit.js'][50]++; - if (received > bytes) { - _$jscoverage['middleware/limit.js'][50]++; - req.destroy(); - } -})); - _$jscoverage['middleware/limit.js'][53]++; - next(); -}); -}); -_$jscoverage['middleware/limit.js'].source = ["","/*!"," * Connect - limit"," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils');","","/**"," * Limit:"," *"," * Limit request bodies to the given size in `bytes`."," *"," * A string representation of the bytesize may also be passed,"," * for example \"5mb\", \"200kb\", \"1gb\", etc."," *"," * connect()"," * .use(connect.limit('5.5mb'))"," * .use(handleImageUpload)"," *"," * @param {Number|String} bytes"," * @return {Function}"," * @api public"," */","","module.exports = function limit(bytes){"," if ('string' == typeof bytes) bytes = utils.parseBytes(bytes);"," if ('number' != typeof bytes) throw new Error('limit() bytes required');"," return function limit(req, res, next){"," var received = 0"," , len = req.headers['content-length']"," ? parseInt(req.headers['content-length'], 10)"," : null;",""," // self-awareness"," if (req._limit) return next();"," req._limit = true;",""," // limit by content-length"," if (len && len > bytes) return next(utils.error(413));",""," // limit"," req.on('data', function(chunk){"," received += chunk.length;"," if (received > bytes) req.destroy();"," });",""," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/logger.js b/node_modules/express/node_modules/connect/lib-cov/middleware/logger.js deleted file mode 100644 index 75c7a00..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/logger.js +++ /dev/null @@ -1,312 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/logger.js']) { - _$jscoverage['middleware/logger.js'] = []; - _$jscoverage['middleware/logger.js'][12] = 0; - _$jscoverage['middleware/logger.js'][18] = 0; - _$jscoverage['middleware/logger.js'][24] = 0; - _$jscoverage['middleware/logger.js'][90] = 0; - _$jscoverage['middleware/logger.js'][91] = 0; - _$jscoverage['middleware/logger.js'][92] = 0; - _$jscoverage['middleware/logger.js'][93] = 0; - _$jscoverage['middleware/logger.js'][94] = 0; - _$jscoverage['middleware/logger.js'][96] = 0; - _$jscoverage['middleware/logger.js'][100] = 0; - _$jscoverage['middleware/logger.js'][103] = 0; - _$jscoverage['middleware/logger.js'][106] = 0; - _$jscoverage['middleware/logger.js'][109] = 0; - _$jscoverage['middleware/logger.js'][113] = 0; - _$jscoverage['middleware/logger.js'][114] = 0; - _$jscoverage['middleware/logger.js'][120] = 0; - _$jscoverage['middleware/logger.js'][121] = 0; - _$jscoverage['middleware/logger.js'][122] = 0; - _$jscoverage['middleware/logger.js'][123] = 0; - _$jscoverage['middleware/logger.js'][128] = 0; - _$jscoverage['middleware/logger.js'][130] = 0; - _$jscoverage['middleware/logger.js'][135] = 0; - _$jscoverage['middleware/logger.js'][136] = 0; - _$jscoverage['middleware/logger.js'][139] = 0; - _$jscoverage['middleware/logger.js'][140] = 0; - _$jscoverage['middleware/logger.js'][141] = 0; - _$jscoverage['middleware/logger.js'][142] = 0; - _$jscoverage['middleware/logger.js'][145] = 0; - _$jscoverage['middleware/logger.js'][146] = 0; - _$jscoverage['middleware/logger.js'][147] = 0; - _$jscoverage['middleware/logger.js'][148] = 0; - _$jscoverage['middleware/logger.js'][149] = 0; - _$jscoverage['middleware/logger.js'][150] = 0; - _$jscoverage['middleware/logger.js'][151] = 0; - _$jscoverage['middleware/logger.js'][156] = 0; - _$jscoverage['middleware/logger.js'][168] = 0; - _$jscoverage['middleware/logger.js'][169] = 0; - _$jscoverage['middleware/logger.js'][170] = 0; - _$jscoverage['middleware/logger.js'][171] = 0; - _$jscoverage['middleware/logger.js'][173] = 0; - _$jscoverage['middleware/logger.js'][174] = 0; - _$jscoverage['middleware/logger.js'][186] = 0; - _$jscoverage['middleware/logger.js'][187] = 0; - _$jscoverage['middleware/logger.js'][188] = 0; - _$jscoverage['middleware/logger.js'][200] = 0; - _$jscoverage['middleware/logger.js'][201] = 0; - _$jscoverage['middleware/logger.js'][202] = 0; - _$jscoverage['middleware/logger.js'][209] = 0; - _$jscoverage['middleware/logger.js'][215] = 0; - _$jscoverage['middleware/logger.js'][221] = 0; - _$jscoverage['middleware/logger.js'][227] = 0; - _$jscoverage['middleware/logger.js'][228] = 0; - _$jscoverage['middleware/logger.js'][232] = 0; - _$jscoverage['middleware/logger.js'][233] = 0; - _$jscoverage['middleware/logger.js'][234] = 0; - _$jscoverage['middleware/logger.js'][236] = 0; - _$jscoverage['middleware/logger.js'][240] = 0; - _$jscoverage['middleware/logger.js'][253] = 0; - _$jscoverage['middleware/logger.js'][254] = 0; - _$jscoverage['middleware/logger.js'][261] = 0; - _$jscoverage['middleware/logger.js'][262] = 0; - _$jscoverage['middleware/logger.js'][269] = 0; - _$jscoverage['middleware/logger.js'][270] = 0; - _$jscoverage['middleware/logger.js'][277] = 0; - _$jscoverage['middleware/logger.js'][278] = 0; - _$jscoverage['middleware/logger.js'][285] = 0; - _$jscoverage['middleware/logger.js'][286] = 0; - _$jscoverage['middleware/logger.js'][293] = 0; - _$jscoverage['middleware/logger.js'][294] = 0; - _$jscoverage['middleware/logger.js'][301] = 0; - _$jscoverage['middleware/logger.js'][302] = 0; - _$jscoverage['middleware/logger.js'][303] = 0; - _$jscoverage['middleware/logger.js'][304] = 0; - _$jscoverage['middleware/logger.js'][305] = 0; - _$jscoverage['middleware/logger.js'][312] = 0; - _$jscoverage['middleware/logger.js'][313] = 0; - _$jscoverage['middleware/logger.js'][320] = 0; - _$jscoverage['middleware/logger.js'][321] = 0; - _$jscoverage['middleware/logger.js'][328] = 0; - _$jscoverage['middleware/logger.js'][329] = 0; - _$jscoverage['middleware/logger.js'][336] = 0; - _$jscoverage['middleware/logger.js'][337] = 0; -} -_$jscoverage['middleware/logger.js'][12]++; -var bytes = require("bytes"); -_$jscoverage['middleware/logger.js'][18]++; -var buf = []; -_$jscoverage['middleware/logger.js'][24]++; -var defaultBufferDuration = 1000; -_$jscoverage['middleware/logger.js'][90]++; -exports = module.exports = (function logger(options) { - _$jscoverage['middleware/logger.js'][91]++; - if ("object" == typeof options) { - _$jscoverage['middleware/logger.js'][92]++; - options = options || {}; - } - else { - _$jscoverage['middleware/logger.js'][93]++; - if (options) { - _$jscoverage['middleware/logger.js'][94]++; - options = {format: options}; - } - else { - _$jscoverage['middleware/logger.js'][96]++; - options = {}; - } - } - _$jscoverage['middleware/logger.js'][100]++; - var immediate = options.immediate; - _$jscoverage['middleware/logger.js'][103]++; - var fmt = exports[options.format] || options.format || exports["default"]; - _$jscoverage['middleware/logger.js'][106]++; - if ("function" != typeof fmt) { - _$jscoverage['middleware/logger.js'][106]++; - fmt = compile(fmt); - } - _$jscoverage['middleware/logger.js'][109]++; - var stream = options.stream || process.stdout, buffer = options.buffer; - _$jscoverage['middleware/logger.js'][113]++; - if (buffer) { - _$jscoverage['middleware/logger.js'][114]++; - var realStream = stream, interval = "number" == typeof buffer? buffer: defaultBufferDuration; - _$jscoverage['middleware/logger.js'][120]++; - setInterval((function () { - _$jscoverage['middleware/logger.js'][121]++; - if (buf.length) { - _$jscoverage['middleware/logger.js'][122]++; - realStream.write(buf.join("")); - _$jscoverage['middleware/logger.js'][123]++; - buf.length = 0; - } -}), interval); - _$jscoverage['middleware/logger.js'][128]++; - stream = {write: (function (str) { - _$jscoverage['middleware/logger.js'][130]++; - buf.push(str); -})}; - } - _$jscoverage['middleware/logger.js'][135]++; - return (function logger(req, res, next) { - _$jscoverage['middleware/logger.js'][136]++; - req._startTime = new Date(); - _$jscoverage['middleware/logger.js'][139]++; - if (immediate) { - _$jscoverage['middleware/logger.js'][140]++; - var line = fmt(exports, req, res); - _$jscoverage['middleware/logger.js'][141]++; - if (null == line) { - _$jscoverage['middleware/logger.js'][141]++; - return; - } - _$jscoverage['middleware/logger.js'][142]++; - stream.write(line + "\n"); - } - else { - _$jscoverage['middleware/logger.js'][145]++; - var end = res.end; - _$jscoverage['middleware/logger.js'][146]++; - res.end = (function (chunk, encoding) { - _$jscoverage['middleware/logger.js'][147]++; - res.end = end; - _$jscoverage['middleware/logger.js'][148]++; - res.end(chunk, encoding); - _$jscoverage['middleware/logger.js'][149]++; - var line = fmt(exports, req, res); - _$jscoverage['middleware/logger.js'][150]++; - if (null == line) { - _$jscoverage['middleware/logger.js'][150]++; - return; - } - _$jscoverage['middleware/logger.js'][151]++; - stream.write(line + "\n"); -}); - } - _$jscoverage['middleware/logger.js'][156]++; - next(); -}); -}); -_$jscoverage['middleware/logger.js'][168]++; -function compile(fmt) { - _$jscoverage['middleware/logger.js'][169]++; - fmt = fmt.replace(/"/g, "\\\""); - _$jscoverage['middleware/logger.js'][170]++; - var js = " return \"" + fmt.replace(/:([-\w]{2,})(?:\[([^\]]+)\])?/g, (function (_, name, arg) { - _$jscoverage['middleware/logger.js'][171]++; - return "\"\n + (tokens[\"" + name + "\"](req, res, \"" + arg + "\") || \"-\") + \""; -})) + "\";"; - _$jscoverage['middleware/logger.js'][173]++; - return new Function("tokens, req, res", js); -} -_$jscoverage['middleware/logger.js'][174]++; -; -_$jscoverage['middleware/logger.js'][186]++; -exports.token = (function (name, fn) { - _$jscoverage['middleware/logger.js'][187]++; - exports[name] = fn; - _$jscoverage['middleware/logger.js'][188]++; - return this; -}); -_$jscoverage['middleware/logger.js'][200]++; -exports.format = (function (name, str) { - _$jscoverage['middleware/logger.js'][201]++; - exports[name] = str; - _$jscoverage['middleware/logger.js'][202]++; - return this; -}); -_$jscoverage['middleware/logger.js'][209]++; -exports.format("default", ":remote-addr - - [:date] \":method :url HTTP/:http-version\" :status :res[content-length] \":referrer\" \":user-agent\""); -_$jscoverage['middleware/logger.js'][215]++; -exports.format("short", ":remote-addr - :method :url HTTP/:http-version :status :res[content-length] - :response-time ms"); -_$jscoverage['middleware/logger.js'][221]++; -exports.format("tiny", ":method :url :status :res[content-length] - :response-time ms"); -_$jscoverage['middleware/logger.js'][227]++; -exports.format("dev", (function (tokens, req, res) { - _$jscoverage['middleware/logger.js'][228]++; - var status = res.statusCode, len = parseInt(res.getHeader("Content-Length"), 10), color = 32; - _$jscoverage['middleware/logger.js'][232]++; - if (status >= 500) { - _$jscoverage['middleware/logger.js'][232]++; - color = 31; - } - else { - _$jscoverage['middleware/logger.js'][233]++; - if (status >= 400) { - _$jscoverage['middleware/logger.js'][233]++; - color = 33; - } - else { - _$jscoverage['middleware/logger.js'][234]++; - if (status >= 300) { - _$jscoverage['middleware/logger.js'][234]++; - color = 36; - } - } - } - _$jscoverage['middleware/logger.js'][236]++; - len = isNaN(len)? "": len = " - " + bytes(len); - _$jscoverage['middleware/logger.js'][240]++; - return "\u001b[90m" + req.method + " " + req.originalUrl + " " + "\u001b[" + color + "m" + res.statusCode + " \u001b[90m" + (new Date() - req._startTime) + "ms" + len + "\u001b[0m"; -})); -_$jscoverage['middleware/logger.js'][253]++; -exports.token("url", (function (req) { - _$jscoverage['middleware/logger.js'][254]++; - return req.originalUrl || req.url; -})); -_$jscoverage['middleware/logger.js'][261]++; -exports.token("method", (function (req) { - _$jscoverage['middleware/logger.js'][262]++; - return req.method; -})); -_$jscoverage['middleware/logger.js'][269]++; -exports.token("response-time", (function (req) { - _$jscoverage['middleware/logger.js'][270]++; - return new Date() - req._startTime; -})); -_$jscoverage['middleware/logger.js'][277]++; -exports.token("date", (function () { - _$jscoverage['middleware/logger.js'][278]++; - return new Date().toUTCString(); -})); -_$jscoverage['middleware/logger.js'][285]++; -exports.token("status", (function (req, res) { - _$jscoverage['middleware/logger.js'][286]++; - return res.statusCode; -})); -_$jscoverage['middleware/logger.js'][293]++; -exports.token("referrer", (function (req) { - _$jscoverage['middleware/logger.js'][294]++; - return req.headers.referer || req.headers.referrer; -})); -_$jscoverage['middleware/logger.js'][301]++; -exports.token("remote-addr", (function (req) { - _$jscoverage['middleware/logger.js'][302]++; - if (req.ip) { - _$jscoverage['middleware/logger.js'][302]++; - return req.ip; - } - _$jscoverage['middleware/logger.js'][303]++; - var sock = req.socket; - _$jscoverage['middleware/logger.js'][304]++; - if (sock.socket) { - _$jscoverage['middleware/logger.js'][304]++; - return sock.socket.remoteAddress; - } - _$jscoverage['middleware/logger.js'][305]++; - return sock.remoteAddress; -})); -_$jscoverage['middleware/logger.js'][312]++; -exports.token("http-version", (function (req) { - _$jscoverage['middleware/logger.js'][313]++; - return req.httpVersionMajor + "." + req.httpVersionMinor; -})); -_$jscoverage['middleware/logger.js'][320]++; -exports.token("user-agent", (function (req) { - _$jscoverage['middleware/logger.js'][321]++; - return req.headers["user-agent"]; -})); -_$jscoverage['middleware/logger.js'][328]++; -exports.token("req", (function (req, res, field) { - _$jscoverage['middleware/logger.js'][329]++; - return req.headers[field.toLowerCase()]; -})); -_$jscoverage['middleware/logger.js'][336]++; -exports.token("res", (function (req, res, field) { - _$jscoverage['middleware/logger.js'][337]++; - return (res._headers || {})[field.toLowerCase()]; -})); -_$jscoverage['middleware/logger.js'].source = ["/*!"," * Connect - logger"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var bytes = require('bytes');","","/*!"," * Log buffer."," */","","var buf = [];","","/*!"," * Default log buffer duration."," */","","var defaultBufferDuration = 1000;","","/**"," * Logger:"," *"," * Log requests with the given `options` or a `format` string."," *"," * Options:"," *"," * - `format` Format string, see below for tokens"," * - `stream` Output stream, defaults to _stdout_"," * - `buffer` Buffer duration, defaults to 1000ms when _true_"," * - `immediate` Write log line on request instead of response (for response times)"," *"," * Tokens:"," *"," * - `:req[header]` ex: `:req[Accept]`"," * - `:res[header]` ex: `:res[Content-Length]`"," * - `:http-version`"," * - `:response-time`"," * - `:remote-addr`"," * - `:date`"," * - `:method`"," * - `:url`"," * - `:referrer`"," * - `:user-agent`"," * - `:status`"," *"," * Formats:"," *"," * Pre-defined formats that ship with connect:"," *"," * - `default` ':remote-addr - - [:date] \":method :url HTTP/:http-version\" :status :res[content-length] \":referrer\" \":user-agent\"'"," * - `short` ':remote-addr - :method :url HTTP/:http-version :status :res[content-length] - :response-time ms'"," * - `tiny` ':method :url :status :res[content-length] - :response-time ms'"," * - `dev` concise output colored by response status for development use"," *"," * Examples:"," *"," * connect.logger() // default"," * connect.logger('short')"," * connect.logger('tiny')"," * connect.logger({ immediate: true, format: 'dev' })"," * connect.logger(':method :url - :referrer')"," * connect.logger(':req[content-type] -> :res[content-type]')"," * connect.logger(function(tokens, req, res){ return 'some format string' })"," *"," * Defining Tokens:"," *"," * To define a token, simply invoke `connect.logger.token()` with the"," * name and a callback function. The value returned is then available"," * as \":type\" in this case."," *"," * connect.logger.token('type', function(req, res){ return req.headers['content-type']; })"," *"," * Defining Formats:"," *"," * All default formats are defined this way, however it's public API as well:"," *"," * connect.logger.format('name', 'string or function')"," *"," * @param {String|Function|Object} format or options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function logger(options) {"," if ('object' == typeof options) {"," options = options || {};"," } else if (options) {"," options = { format: options };"," } else {"," options = {};"," }",""," // output on request instead of response"," var immediate = options.immediate;",""," // format name"," var fmt = exports[options.format] || options.format || exports.default;",""," // compile format"," if ('function' != typeof fmt) fmt = compile(fmt);",""," // options"," var stream = options.stream || process.stdout"," , buffer = options.buffer;",""," // buffering support"," if (buffer) {"," var realStream = stream"," , interval = 'number' == typeof buffer"," ? buffer"," : defaultBufferDuration;",""," // flush interval"," setInterval(function(){"," if (buf.length) {"," realStream.write(buf.join(''));"," buf.length = 0;"," }"," }, interval); ",""," // swap the stream"," stream = {"," write: function(str){"," buf.push(str);"," }"," };"," }",""," return function logger(req, res, next) {"," req._startTime = new Date;",""," // immediate"," if (immediate) {"," var line = fmt(exports, req, res);"," if (null == line) return;"," stream.write(line + '\\n');"," // proxy end to output logging"," } else {"," var end = res.end;"," res.end = function(chunk, encoding){"," res.end = end;"," res.end(chunk, encoding);"," var line = fmt(exports, req, res);"," if (null == line) return;"," stream.write(line + '\\n');"," };"," }","",""," next();"," };","};","","/**"," * Compile `fmt` into a function."," *"," * @param {String} fmt"," * @return {Function}"," * @api private"," */","","function compile(fmt) {"," fmt = fmt.replace(/\"/g, '\\\\\"');"," var js = ' return \"' + fmt.replace(/:([-\\w]{2,})(?:\\[([^\\]]+)\\])?/g, function(_, name, arg){"," return '\"\\n + (tokens[\"' + name + '\"](req, res, \"' + arg + '\") || \"-\") + \"';"," }) + '\";'"," return new Function('tokens, req, res', js);","};","","/**"," * Define a token function with the given `name`,"," * and callback `fn(req, res)`."," *"," * @param {String} name"," * @param {Function} fn"," * @return {Object} exports for chaining"," * @api public"," */","","exports.token = function(name, fn) {"," exports[name] = fn;"," return this;","};","","/**"," * Define a `fmt` with the given `name`."," *"," * @param {String} name"," * @param {String|Function} fmt"," * @return {Object} exports for chaining"," * @api public"," */","","exports.format = function(name, str){"," exports[name] = str;"," return this;","};","","/**"," * Default format."," */","","exports.format('default', ':remote-addr - - [:date] \":method :url HTTP/:http-version\" :status :res[content-length] \":referrer\" \":user-agent\"');","","/**"," * Short format."," */","","exports.format('short', ':remote-addr - :method :url HTTP/:http-version :status :res[content-length] - :response-time ms');","","/**"," * Tiny format."," */","","exports.format('tiny', ':method :url :status :res[content-length] - :response-time ms');","","/**"," * dev (colored)"," */","","exports.format('dev', function(tokens, req, res){"," var status = res.statusCode"," , len = parseInt(res.getHeader('Content-Length'), 10)"," , color = 32;",""," if (status >= 500) color = 31"," else if (status >= 400) color = 33"," else if (status >= 300) color = 36;",""," len = isNaN(len)"," ? ''"," : len = ' - ' + bytes(len);",""," return '\\033[90m' + req.method"," + ' ' + req.originalUrl + ' '"," + '\\033[' + color + 'm' + res.statusCode"," + ' \\033[90m'"," + (new Date - req._startTime)"," + 'ms' + len"," + '\\033[0m';","});","","/**"," * request url"," */","","exports.token('url', function(req){"," return req.originalUrl || req.url;","});","","/**"," * request method"," */","","exports.token('method', function(req){"," return req.method;","});","","/**"," * response time in milliseconds"," */","","exports.token('response-time', function(req){"," return new Date - req._startTime;","});","","/**"," * UTC date"," */","","exports.token('date', function(){"," return new Date().toUTCString();","});","","/**"," * response status code"," */","","exports.token('status', function(req, res){"," return res.statusCode;","});","","/**"," * normalized referrer"," */","","exports.token('referrer', function(req){"," return req.headers['referer'] || req.headers['referrer'];","});","","/**"," * remote address"," */","","exports.token('remote-addr', function(req){"," if (req.ip) return req.ip;"," var sock = req.socket;"," if (sock.socket) return sock.socket.remoteAddress;"," return sock.remoteAddress;","});","","/**"," * HTTP version"," */","","exports.token('http-version', function(req){"," return req.httpVersionMajor + '.' + req.httpVersionMinor;","});","","/**"," * UA string"," */","","exports.token('user-agent', function(req){"," return req.headers['user-agent'];","});","","/**"," * request header"," */","","exports.token('req', function(req, res, field){"," return req.headers[field.toLowerCase()];","});","","/**"," * response header"," */","","exports.token('res', function(req, res, field){"," return (res._headers || {})[field.toLowerCase()];","});",""]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/methodOverride.js b/node_modules/express/node_modules/connect/lib-cov/middleware/methodOverride.js deleted file mode 100644 index 0a9118c..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/methodOverride.js +++ /dev/null @@ -1,42 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/methodOverride.js']) { - _$jscoverage['middleware/methodOverride.js'] = []; - _$jscoverage['middleware/methodOverride.js'][23] = 0; - _$jscoverage['middleware/methodOverride.js'][24] = 0; - _$jscoverage['middleware/methodOverride.js'][25] = 0; - _$jscoverage['middleware/methodOverride.js'][26] = 0; - _$jscoverage['middleware/methodOverride.js'][29] = 0; - _$jscoverage['middleware/methodOverride.js'][30] = 0; - _$jscoverage['middleware/methodOverride.js'][31] = 0; - _$jscoverage['middleware/methodOverride.js'][33] = 0; - _$jscoverage['middleware/methodOverride.js'][34] = 0; - _$jscoverage['middleware/methodOverride.js'][37] = 0; -} -_$jscoverage['middleware/methodOverride.js'][23]++; -module.exports = (function methodOverride(key) { - _$jscoverage['middleware/methodOverride.js'][24]++; - key = key || "_method"; - _$jscoverage['middleware/methodOverride.js'][25]++; - return (function methodOverride(req, res, next) { - _$jscoverage['middleware/methodOverride.js'][26]++; - req.originalMethod = req.originalMethod || req.method; - _$jscoverage['middleware/methodOverride.js'][29]++; - if (req.body && key in req.body) { - _$jscoverage['middleware/methodOverride.js'][30]++; - req.method = req.body[key].toUpperCase(); - _$jscoverage['middleware/methodOverride.js'][31]++; - delete req.body[key]; - } - else { - _$jscoverage['middleware/methodOverride.js'][33]++; - if (req.headers["x-http-method-override"]) { - _$jscoverage['middleware/methodOverride.js'][34]++; - req.method = req.headers["x-http-method-override"].toUpperCase(); - } - } - _$jscoverage['middleware/methodOverride.js'][37]++; - next(); -}); -}); -_$jscoverage['middleware/methodOverride.js'].source = ["","/*!"," * Connect - methodOverride"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Method Override:"," * "," * Provides faux HTTP method support."," * "," * Pass an optional `key` to use when checking for"," * a method override, othewise defaults to _\\_method_."," * The original method is available via `req.originalMethod`."," *"," * @param {String} key"," * @return {Function}"," * @api public"," */","","module.exports = function methodOverride(key){"," key = key || \"_method\";"," return function methodOverride(req, res, next) {"," req.originalMethod = req.originalMethod || req.method;",""," // req.body"," if (req.body && key in req.body) {"," req.method = req.body[key].toUpperCase();"," delete req.body[key];"," // check X-HTTP-Method-Override"," } else if (req.headers['x-http-method-override']) {"," req.method = req.headers['x-http-method-override'].toUpperCase();"," }"," "," next();"," };","};",""]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/multipart.js b/node_modules/express/node_modules/connect/lib-cov/middleware/multipart.js deleted file mode 100644 index dfcde09..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/multipart.js +++ /dev/null @@ -1,183 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/multipart.js']) { - _$jscoverage['middleware/multipart.js'] = []; - _$jscoverage['middleware/multipart.js'][12] = 0; - _$jscoverage['middleware/multipart.js'][21] = 0; - _$jscoverage['middleware/multipart.js'][22] = 0; - _$jscoverage['middleware/multipart.js'][52] = 0; - _$jscoverage['middleware/multipart.js'][53] = 0; - _$jscoverage['middleware/multipart.js'][55] = 0; - _$jscoverage['middleware/multipart.js'][59] = 0; - _$jscoverage['middleware/multipart.js'][60] = 0; - _$jscoverage['middleware/multipart.js'][61] = 0; - _$jscoverage['middleware/multipart.js'][62] = 0; - _$jscoverage['middleware/multipart.js'][64] = 0; - _$jscoverage['middleware/multipart.js'][67] = 0; - _$jscoverage['middleware/multipart.js'][70] = 0; - _$jscoverage['middleware/multipart.js'][73] = 0; - _$jscoverage['middleware/multipart.js'][76] = 0; - _$jscoverage['middleware/multipart.js'][77] = 0; - _$jscoverage['middleware/multipart.js'][79] = 0; - _$jscoverage['middleware/multipart.js'][84] = 0; - _$jscoverage['middleware/multipart.js'][85] = 0; - _$jscoverage['middleware/multipart.js'][88] = 0; - _$jscoverage['middleware/multipart.js'][89] = 0; - _$jscoverage['middleware/multipart.js'][90] = 0; - _$jscoverage['middleware/multipart.js'][91] = 0; - _$jscoverage['middleware/multipart.js'][92] = 0; - _$jscoverage['middleware/multipart.js'][94] = 0; - _$jscoverage['middleware/multipart.js'][98] = 0; - _$jscoverage['middleware/multipart.js'][99] = 0; - _$jscoverage['middleware/multipart.js'][102] = 0; - _$jscoverage['middleware/multipart.js'][103] = 0; - _$jscoverage['middleware/multipart.js'][106] = 0; - _$jscoverage['middleware/multipart.js'][107] = 0; - _$jscoverage['middleware/multipart.js'][108] = 0; - _$jscoverage['middleware/multipart.js'][109] = 0; - _$jscoverage['middleware/multipart.js'][111] = 0; - _$jscoverage['middleware/multipart.js'][114] = 0; - _$jscoverage['middleware/multipart.js'][115] = 0; - _$jscoverage['middleware/multipart.js'][116] = 0; - _$jscoverage['middleware/multipart.js'][117] = 0; - _$jscoverage['middleware/multipart.js'][118] = 0; - _$jscoverage['middleware/multipart.js'][119] = 0; - _$jscoverage['middleware/multipart.js'][121] = 0; - _$jscoverage['middleware/multipart.js'][125] = 0; - _$jscoverage['middleware/multipart.js'][127] = 0; - _$jscoverage['middleware/multipart.js'][128] = 0; - _$jscoverage['middleware/multipart.js'][129] = 0; -} -_$jscoverage['middleware/multipart.js'][12]++; -var formidable = require("formidable"), _limit = require("./limit"), utils = require("../utils"), qs = require("qs"); -_$jscoverage['middleware/multipart.js'][21]++; -function noop(req, res, next) { - _$jscoverage['middleware/multipart.js'][22]++; - next(); -} -_$jscoverage['middleware/multipart.js'][52]++; -exports = module.exports = (function (options) { - _$jscoverage['middleware/multipart.js'][53]++; - options = options || {}; - _$jscoverage['middleware/multipart.js'][55]++; - var limit = options.limit? _limit(options.limit): noop; - _$jscoverage['middleware/multipart.js'][59]++; - return (function multipart(req, res, next) { - _$jscoverage['middleware/multipart.js'][60]++; - if (req._body) { - _$jscoverage['middleware/multipart.js'][60]++; - return next(); - } - _$jscoverage['middleware/multipart.js'][61]++; - req.body = req.body || {}; - _$jscoverage['middleware/multipart.js'][62]++; - req.files = req.files || {}; - _$jscoverage['middleware/multipart.js'][64]++; - if (! utils.hasBody(req)) { - _$jscoverage['middleware/multipart.js'][64]++; - return next(); - } - _$jscoverage['middleware/multipart.js'][67]++; - if ("GET" == req.method || "HEAD" == req.method) { - _$jscoverage['middleware/multipart.js'][67]++; - return next(); - } - _$jscoverage['middleware/multipart.js'][70]++; - if ("multipart/form-data" != utils.mime(req)) { - _$jscoverage['middleware/multipart.js'][70]++; - return next(); - } - _$jscoverage['middleware/multipart.js'][73]++; - req._body = true; - _$jscoverage['middleware/multipart.js'][76]++; - limit(req, res, (function (err) { - _$jscoverage['middleware/multipart.js'][77]++; - if (err) { - _$jscoverage['middleware/multipart.js'][77]++; - return next(err); - } - _$jscoverage['middleware/multipart.js'][79]++; - var form = new formidable.IncomingForm(), data = {}, files = {}, done; - _$jscoverage['middleware/multipart.js'][84]++; - Object.keys(options).forEach((function (key) { - _$jscoverage['middleware/multipart.js'][85]++; - form[key] = options[key]; -})); - _$jscoverage['middleware/multipart.js'][88]++; - function ondata(name, val, data) { - _$jscoverage['middleware/multipart.js'][89]++; - if (Array.isArray(data[name])) { - _$jscoverage['middleware/multipart.js'][90]++; - data[name].push(val); - } - else { - _$jscoverage['middleware/multipart.js'][91]++; - if (data[name]) { - _$jscoverage['middleware/multipart.js'][92]++; - data[name] = [data[name], val]; - } - else { - _$jscoverage['middleware/multipart.js'][94]++; - data[name] = val; - } - } -} - _$jscoverage['middleware/multipart.js'][98]++; - form.on("field", (function (name, val) { - _$jscoverage['middleware/multipart.js'][99]++; - ondata(name, val, data); -})); - _$jscoverage['middleware/multipart.js'][102]++; - form.on("file", (function (name, val) { - _$jscoverage['middleware/multipart.js'][103]++; - ondata(name, val, files); -})); - _$jscoverage['middleware/multipart.js'][106]++; - form.on("error", (function (err) { - _$jscoverage['middleware/multipart.js'][107]++; - if (! options.defer) { - _$jscoverage['middleware/multipart.js'][108]++; - err.status = 400; - _$jscoverage['middleware/multipart.js'][109]++; - next(err); - } - _$jscoverage['middleware/multipart.js'][111]++; - done = true; -})); - _$jscoverage['middleware/multipart.js'][114]++; - form.on("end", (function () { - _$jscoverage['middleware/multipart.js'][115]++; - if (done) { - _$jscoverage['middleware/multipart.js'][115]++; - return; - } - _$jscoverage['middleware/multipart.js'][116]++; - try { - _$jscoverage['middleware/multipart.js'][117]++; - req.body = qs.parse(data); - _$jscoverage['middleware/multipart.js'][118]++; - req.files = qs.parse(files); - _$jscoverage['middleware/multipart.js'][119]++; - if (! options.defer) { - _$jscoverage['middleware/multipart.js'][119]++; - next(); - } - } - catch (err) { - _$jscoverage['middleware/multipart.js'][121]++; - form.emit("error", err); - } -})); - _$jscoverage['middleware/multipart.js'][125]++; - form.parse(req); - _$jscoverage['middleware/multipart.js'][127]++; - if (options.defer) { - _$jscoverage['middleware/multipart.js'][128]++; - req.form = form; - _$jscoverage['middleware/multipart.js'][129]++; - next(); - } -})); -}); -}); -_$jscoverage['middleware/multipart.js'].source = ["/*!"," * Connect - multipart"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var formidable = require('formidable')"," , _limit = require('./limit')"," , utils = require('../utils')"," , qs = require('qs');","","/**"," * noop middleware."," */","","function noop(req, res, next) {"," next();","}","","/**"," * Multipart:"," * "," * Parse multipart/form-data request bodies,"," * providing the parsed object as `req.body`"," * and `req.files`."," *"," * Configuration:"," *"," * The options passed are merged with [formidable](https://github.com/felixge/node-formidable)'s"," * `IncomingForm` object, allowing you to configure the upload directory,"," * size limits, etc. For example if you wish to change the upload dir do the following."," *"," * app.use(connect.multipart({ uploadDir: path }));"," *"," * Options:"," *"," * - `limit` byte limit defaulting to none"," * - `defer` defers processing and exposes the Formidable form object as `req.form`."," * `next()` is called without waiting for the form's \"end\" event."," * This option is useful if you need to bind to the \"progress\" event, for example."," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function(options){"," options = options || {};",""," var limit = options.limit"," ? _limit(options.limit)"," : noop;",""," return function multipart(req, res, next) {"," if (req._body) return next();"," req.body = req.body || {};"," req.files = req.files || {};",""," if (!utils.hasBody(req)) return next();",""," // ignore GET"," if ('GET' == req.method || 'HEAD' == req.method) return next();",""," // check Content-Type"," if ('multipart/form-data' != utils.mime(req)) return next();",""," // flag as parsed"," req._body = true;",""," // parse"," limit(req, res, function(err){"," if (err) return next(err);",""," var form = new formidable.IncomingForm"," , data = {}"," , files = {}"," , done;",""," Object.keys(options).forEach(function(key){"," form[key] = options[key];"," });",""," function ondata(name, val, data){"," if (Array.isArray(data[name])) {"," data[name].push(val);"," } else if (data[name]) {"," data[name] = [data[name], val];"," } else {"," data[name] = val;"," }"," }",""," form.on('field', function(name, val){"," ondata(name, val, data);"," });",""," form.on('file', function(name, val){"," ondata(name, val, files);"," });",""," form.on('error', function(err){"," if (!options.defer) {"," err.status = 400;"," next(err);"," }"," done = true;"," });",""," form.on('end', function(){"," if (done) return;"," try {"," req.body = qs.parse(data);"," req.files = qs.parse(files);"," if (!options.defer) next();"," } catch (err) {"," form.emit('error', err);"," }"," });",""," form.parse(req);",""," if (options.defer) {"," req.form = form;"," next();"," }"," });"," }","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/query.js b/node_modules/express/node_modules/connect/lib-cov/middleware/query.js deleted file mode 100644 index bd27ff6..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/query.js +++ /dev/null @@ -1,27 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/query.js']) { - _$jscoverage['middleware/query.js'] = []; - _$jscoverage['middleware/query.js'][12] = 0; - _$jscoverage['middleware/query.js'][36] = 0; - _$jscoverage['middleware/query.js'][37] = 0; - _$jscoverage['middleware/query.js'][38] = 0; - _$jscoverage['middleware/query.js'][39] = 0; - _$jscoverage['middleware/query.js'][44] = 0; -} -_$jscoverage['middleware/query.js'][12]++; -var qs = require("qs"), parse = require("../utils").parseUrl; -_$jscoverage['middleware/query.js'][36]++; -module.exports = (function query(options) { - _$jscoverage['middleware/query.js'][37]++; - return (function query(req, res, next) { - _$jscoverage['middleware/query.js'][38]++; - if (! req.query) { - _$jscoverage['middleware/query.js'][39]++; - req.query = ~ req.url.indexOf("?")? qs.parse(parse(req).query, options): {}; - } - _$jscoverage['middleware/query.js'][44]++; - next(); -}); -}); -_$jscoverage['middleware/query.js'].source = ["/*!"," * Connect - query"," * Copyright(c) 2011 TJ Holowaychuk"," * Copyright(c) 2011 Sencha Inc."," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var qs = require('qs')"," , parse = require('../utils').parseUrl;","","/**"," * Query:"," *"," * Automatically parse the query-string when available,"," * populating the `req.query` object."," *"," * Examples:"," *"," * connect()"," * .use(connect.query())"," * .use(function(req, res){"," * res.end(JSON.stringify(req.query));"," * });"," *"," * The `options` passed are provided to qs.parse function."," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","module.exports = function query(options){"," return function query(req, res, next){"," if (!req.query) {"," req.query = ~req.url.indexOf('?')"," ? qs.parse(parse(req).query, options)"," : {};"," }",""," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/responseTime.js b/node_modules/express/node_modules/connect/lib-cov/middleware/responseTime.js deleted file mode 100644 index 954e040..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/responseTime.js +++ /dev/null @@ -1,39 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/responseTime.js']) { - _$jscoverage['middleware/responseTime.js'] = []; - _$jscoverage['middleware/responseTime.js'][18] = 0; - _$jscoverage['middleware/responseTime.js'][19] = 0; - _$jscoverage['middleware/responseTime.js'][20] = 0; - _$jscoverage['middleware/responseTime.js'][22] = 0; - _$jscoverage['middleware/responseTime.js'][23] = 0; - _$jscoverage['middleware/responseTime.js'][25] = 0; - _$jscoverage['middleware/responseTime.js'][26] = 0; - _$jscoverage['middleware/responseTime.js'][27] = 0; - _$jscoverage['middleware/responseTime.js'][30] = 0; -} -_$jscoverage['middleware/responseTime.js'][18]++; -module.exports = (function responseTime() { - _$jscoverage['middleware/responseTime.js'][19]++; - return (function (req, res, next) { - _$jscoverage['middleware/responseTime.js'][20]++; - var start = new Date(); - _$jscoverage['middleware/responseTime.js'][22]++; - if (res._responseTime) { - _$jscoverage['middleware/responseTime.js'][22]++; - return next(); - } - _$jscoverage['middleware/responseTime.js'][23]++; - res._responseTime = true; - _$jscoverage['middleware/responseTime.js'][25]++; - res.on("header", (function () { - _$jscoverage['middleware/responseTime.js'][26]++; - var duration = new Date() - start; - _$jscoverage['middleware/responseTime.js'][27]++; - res.setHeader("X-Response-Time", duration + "ms"); -})); - _$jscoverage['middleware/responseTime.js'][30]++; - next(); -}); -}); -_$jscoverage['middleware/responseTime.js'].source = ["","/*!"," * Connect - responseTime"," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Reponse time:"," *"," * Adds the `X-Response-Time` header displaying the response"," * duration in milliseconds."," *"," * @return {Function}"," * @api public"," */","","module.exports = function responseTime(){"," return function(req, res, next){"," var start = new Date;",""," if (res._responseTime) return next();"," res._responseTime = true;",""," res.on('header', function(){"," var duration = new Date - start;"," res.setHeader('X-Response-Time', duration + 'ms');"," });",""," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/session.js b/node_modules/express/node_modules/connect/lib-cov/middleware/session.js deleted file mode 100644 index 5ff99f8..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/session.js +++ /dev/null @@ -1,321 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/session.js']) { - _$jscoverage['middleware/session.js'] = []; - _$jscoverage['middleware/session.js'][13] = 0; - _$jscoverage['middleware/session.js'][25] = 0; - _$jscoverage['middleware/session.js'][31] = 0; - _$jscoverage['middleware/session.js'][37] = 0; - _$jscoverage['middleware/session.js'][38] = 0; - _$jscoverage['middleware/session.js'][39] = 0; - _$jscoverage['middleware/session.js'][40] = 0; - _$jscoverage['middleware/session.js'][46] = 0; - _$jscoverage['middleware/session.js'][188] = 0; - _$jscoverage['middleware/session.js'][189] = 0; - _$jscoverage['middleware/session.js'][198] = 0; - _$jscoverage['middleware/session.js'][199] = 0; - _$jscoverage['middleware/session.js'][203] = 0; - _$jscoverage['middleware/session.js'][204] = 0; - _$jscoverage['middleware/session.js'][205] = 0; - _$jscoverage['middleware/session.js'][206] = 0; - _$jscoverage['middleware/session.js'][209] = 0; - _$jscoverage['middleware/session.js'][210] = 0; - _$jscoverage['middleware/session.js'][212] = 0; - _$jscoverage['middleware/session.js'][214] = 0; - _$jscoverage['middleware/session.js'][218] = 0; - _$jscoverage['middleware/session.js'][221] = 0; - _$jscoverage['middleware/session.js'][225] = 0; - _$jscoverage['middleware/session.js'][228] = 0; - _$jscoverage['middleware/session.js'][231] = 0; - _$jscoverage['middleware/session.js'][235] = 0; - _$jscoverage['middleware/session.js'][238] = 0; - _$jscoverage['middleware/session.js'][241] = 0; - _$jscoverage['middleware/session.js'][243] = 0; - _$jscoverage['middleware/session.js'][244] = 0; - _$jscoverage['middleware/session.js'][248] = 0; - _$jscoverage['middleware/session.js'][249] = 0; - _$jscoverage['middleware/session.js'][250] = 0; - _$jscoverage['middleware/session.js'][257] = 0; - _$jscoverage['middleware/session.js'][260] = 0; - _$jscoverage['middleware/session.js'][261] = 0; - _$jscoverage['middleware/session.js'][263] = 0; - _$jscoverage['middleware/session.js'][264] = 0; - _$jscoverage['middleware/session.js'][267] = 0; - _$jscoverage['middleware/session.js'][268] = 0; - _$jscoverage['middleware/session.js'][269] = 0; - _$jscoverage['middleware/session.js'][270] = 0; - _$jscoverage['middleware/session.js'][274] = 0; - _$jscoverage['middleware/session.js'][275] = 0; - _$jscoverage['middleware/session.js'][276] = 0; - _$jscoverage['middleware/session.js'][277] = 0; - _$jscoverage['middleware/session.js'][278] = 0; - _$jscoverage['middleware/session.js'][279] = 0; - _$jscoverage['middleware/session.js'][280] = 0; - _$jscoverage['middleware/session.js'][281] = 0; - _$jscoverage['middleware/session.js'][282] = 0; - _$jscoverage['middleware/session.js'][287] = 0; - _$jscoverage['middleware/session.js'][288] = 0; - _$jscoverage['middleware/session.js'][292] = 0; - _$jscoverage['middleware/session.js'][295] = 0; - _$jscoverage['middleware/session.js'][296] = 0; - _$jscoverage['middleware/session.js'][297] = 0; - _$jscoverage['middleware/session.js'][298] = 0; - _$jscoverage['middleware/session.js'][299] = 0; - _$jscoverage['middleware/session.js'][303] = 0; - _$jscoverage['middleware/session.js'][304] = 0; - _$jscoverage['middleware/session.js'][305] = 0; - _$jscoverage['middleware/session.js'][307] = 0; - _$jscoverage['middleware/session.js'][308] = 0; - _$jscoverage['middleware/session.js'][309] = 0; - _$jscoverage['middleware/session.js'][310] = 0; - _$jscoverage['middleware/session.js'][314] = 0; - _$jscoverage['middleware/session.js'][315] = 0; - _$jscoverage['middleware/session.js'][316] = 0; - _$jscoverage['middleware/session.js'][317] = 0; - _$jscoverage['middleware/session.js'][318] = 0; - _$jscoverage['middleware/session.js'][320] = 0; - _$jscoverage['middleware/session.js'][323] = 0; - _$jscoverage['middleware/session.js'][324] = 0; - _$jscoverage['middleware/session.js'][325] = 0; - _$jscoverage['middleware/session.js'][326] = 0; - _$jscoverage['middleware/session.js'][329] = 0; - _$jscoverage['middleware/session.js'][330] = 0; - _$jscoverage['middleware/session.js'][331] = 0; - _$jscoverage['middleware/session.js'][332] = 0; - _$jscoverage['middleware/session.js'][333] = 0; - _$jscoverage['middleware/session.js'][337] = 0; - _$jscoverage['middleware/session.js'][348] = 0; - _$jscoverage['middleware/session.js'][349] = 0; - _$jscoverage['middleware/session.js'][350] = 0; -} -_$jscoverage['middleware/session.js'][13]++; -var Session = require("./session/session"), debug = require("debug")("connect:session"), MemoryStore = require("./session/memory"), signature = require("cookie-signature"), Cookie = require("./session/cookie"), Store = require("./session/store"), utils = require("./../utils"), parse = utils.parseUrl, crc16 = require("crc").crc16; -_$jscoverage['middleware/session.js'][25]++; -var env = process.env.NODE_ENV; -_$jscoverage['middleware/session.js'][31]++; -exports = module.exports = session; -_$jscoverage['middleware/session.js'][37]++; -exports.Store = Store; -_$jscoverage['middleware/session.js'][38]++; -exports.Cookie = Cookie; -_$jscoverage['middleware/session.js'][39]++; -exports.Session = Session; -_$jscoverage['middleware/session.js'][40]++; -exports.MemoryStore = MemoryStore; -_$jscoverage['middleware/session.js'][46]++; -var warning = "Warning: connection.session() MemoryStore is not\ndesigned for a production environment, as it will leak\nmemory, and will not scale past a single process."; -_$jscoverage['middleware/session.js'][188]++; -function session(options) { - _$jscoverage['middleware/session.js'][189]++; - var options = options || {}, key = options.key || "connect.sid", store = options.store || new MemoryStore(), cookie = options.cookie || {}, trustProxy = options.proxy, storeReady = true; - _$jscoverage['middleware/session.js'][198]++; - if ("production" == env && store instanceof MemoryStore) { - _$jscoverage['middleware/session.js'][199]++; - console.warn(warning); - } - _$jscoverage['middleware/session.js'][203]++; - store.generate = (function (req) { - _$jscoverage['middleware/session.js'][204]++; - req.sessionID = utils.uid(24); - _$jscoverage['middleware/session.js'][205]++; - req.session = new Session(req); - _$jscoverage['middleware/session.js'][206]++; - req.session.cookie = new Cookie(cookie); -}); - _$jscoverage['middleware/session.js'][209]++; - store.on("disconnect", (function () { - _$jscoverage['middleware/session.js'][209]++; - storeReady = false; -})); - _$jscoverage['middleware/session.js'][210]++; - store.on("connect", (function () { - _$jscoverage['middleware/session.js'][210]++; - storeReady = true; -})); - _$jscoverage['middleware/session.js'][212]++; - return (function session(req, res, next) { - _$jscoverage['middleware/session.js'][214]++; - if (req.session) { - _$jscoverage['middleware/session.js'][214]++; - return next(); - } - _$jscoverage['middleware/session.js'][218]++; - if (! storeReady) { - _$jscoverage['middleware/session.js'][218]++; - return debug("store is disconnected"), next(); - } - _$jscoverage['middleware/session.js'][221]++; - if (0 != req.originalUrl.indexOf(cookie.path || "/")) { - _$jscoverage['middleware/session.js'][221]++; - return next(); - } - _$jscoverage['middleware/session.js'][225]++; - var secret = options.secret || req.secret; - _$jscoverage['middleware/session.js'][228]++; - if (! secret) { - _$jscoverage['middleware/session.js'][228]++; - throw new Error("`secret` option required for sessions"); - } - _$jscoverage['middleware/session.js'][231]++; - var originalHash, originalId; - _$jscoverage['middleware/session.js'][235]++; - req.sessionStore = store; - _$jscoverage['middleware/session.js'][238]++; - var rawCookie = req.cookies[key]; - _$jscoverage['middleware/session.js'][241]++; - var unsignedCookie = req.signedCookies[key]; - _$jscoverage['middleware/session.js'][243]++; - if (! unsignedCookie && rawCookie) { - _$jscoverage['middleware/session.js'][244]++; - unsignedCookie = utils.parseSignedCookie(rawCookie, secret); - } - _$jscoverage['middleware/session.js'][248]++; - res.on("header", (function () { - _$jscoverage['middleware/session.js'][249]++; - if (! req.session) { - _$jscoverage['middleware/session.js'][249]++; - return; - } - _$jscoverage['middleware/session.js'][250]++; - var cookie = req.session.cookie, proto = (req.headers["x-forwarded-proto"] || "").toLowerCase(), tls = req.connection.encrypted || (trustProxy && "https" == proto), secured = cookie.secure && tls, isNew = unsignedCookie != req.sessionID; - _$jscoverage['middleware/session.js'][257]++; - if (cookie.secure && ! secured) { - _$jscoverage['middleware/session.js'][257]++; - return debug("not secured"); - } - _$jscoverage['middleware/session.js'][260]++; - if (null == cookie.expires) { - _$jscoverage['middleware/session.js'][261]++; - if (! isNew) { - _$jscoverage['middleware/session.js'][261]++; - return debug("already set browser-session cookie"); - } - } - else { - _$jscoverage['middleware/session.js'][263]++; - if (originalHash == hash(req.session) && originalId == req.session.id) { - _$jscoverage['middleware/session.js'][264]++; - return debug("unmodified session"); - } - } - _$jscoverage['middleware/session.js'][267]++; - var val = "s:" + signature.sign(req.sessionID, secret); - _$jscoverage['middleware/session.js'][268]++; - val = cookie.serialize(key, val); - _$jscoverage['middleware/session.js'][269]++; - debug("set-cookie %s", val); - _$jscoverage['middleware/session.js'][270]++; - res.setHeader("Set-Cookie", val); -})); - _$jscoverage['middleware/session.js'][274]++; - var end = res.end; - _$jscoverage['middleware/session.js'][275]++; - res.end = (function (data, encoding) { - _$jscoverage['middleware/session.js'][276]++; - res.end = end; - _$jscoverage['middleware/session.js'][277]++; - if (! req.session) { - _$jscoverage['middleware/session.js'][277]++; - return res.end(data, encoding); - } - _$jscoverage['middleware/session.js'][278]++; - debug("saving"); - _$jscoverage['middleware/session.js'][279]++; - req.session.resetMaxAge(); - _$jscoverage['middleware/session.js'][280]++; - req.session.save((function () { - _$jscoverage['middleware/session.js'][281]++; - debug("saved"); - _$jscoverage['middleware/session.js'][282]++; - res.end(data, encoding); -})); -}); - _$jscoverage['middleware/session.js'][287]++; - function generate() { - _$jscoverage['middleware/session.js'][288]++; - store.generate(req); -} - _$jscoverage['middleware/session.js'][292]++; - req.sessionID = unsignedCookie; - _$jscoverage['middleware/session.js'][295]++; - if (! req.sessionID) { - _$jscoverage['middleware/session.js'][296]++; - debug("no SID sent, generating session"); - _$jscoverage['middleware/session.js'][297]++; - generate(); - _$jscoverage['middleware/session.js'][298]++; - next(); - _$jscoverage['middleware/session.js'][299]++; - return; - } - _$jscoverage['middleware/session.js'][303]++; - var pause = utils.pause(req); - _$jscoverage['middleware/session.js'][304]++; - debug("fetching %s", req.sessionID); - _$jscoverage['middleware/session.js'][305]++; - store.get(req.sessionID, (function (err, sess) { - _$jscoverage['middleware/session.js'][307]++; - var _next = next; - _$jscoverage['middleware/session.js'][308]++; - next = (function (err) { - _$jscoverage['middleware/session.js'][309]++; - _next(err); - _$jscoverage['middleware/session.js'][310]++; - pause.resume(); -}); - _$jscoverage['middleware/session.js'][314]++; - if (err) { - _$jscoverage['middleware/session.js'][315]++; - debug("error"); - _$jscoverage['middleware/session.js'][316]++; - if ("ENOENT" == err.code) { - _$jscoverage['middleware/session.js'][317]++; - generate(); - _$jscoverage['middleware/session.js'][318]++; - next(); - } - else { - _$jscoverage['middleware/session.js'][320]++; - next(err); - } - } - else { - _$jscoverage['middleware/session.js'][323]++; - if (! sess) { - _$jscoverage['middleware/session.js'][324]++; - debug("no session found"); - _$jscoverage['middleware/session.js'][325]++; - generate(); - _$jscoverage['middleware/session.js'][326]++; - next(); - } - else { - _$jscoverage['middleware/session.js'][329]++; - debug("session found"); - _$jscoverage['middleware/session.js'][330]++; - store.createSession(req, sess); - _$jscoverage['middleware/session.js'][331]++; - originalId = req.sessionID; - _$jscoverage['middleware/session.js'][332]++; - originalHash = hash(sess); - _$jscoverage['middleware/session.js'][333]++; - next(); - } - } -})); -}); -} -_$jscoverage['middleware/session.js'][337]++; -; -_$jscoverage['middleware/session.js'][348]++; -function hash(sess) { - _$jscoverage['middleware/session.js'][349]++; - return crc16(JSON.stringify(sess, (function (key, val) { - _$jscoverage['middleware/session.js'][350]++; - if ("cookie" != key) { - _$jscoverage['middleware/session.js'][350]++; - return val; - } -}))); -} -_$jscoverage['middleware/session.js'].source = ["","/*!"," * Connect - session"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var Session = require('./session/session')"," , debug = require('debug')('connect:session')"," , MemoryStore = require('./session/memory')"," , signature = require('cookie-signature')"," , Cookie = require('./session/cookie')"," , Store = require('./session/store')"," , utils = require('./../utils')"," , parse = utils.parseUrl"," , crc16 = require('crc').crc16;","","// environment","","var env = process.env.NODE_ENV;","","/**"," * Expose the middleware."," */","","exports = module.exports = session;","","/**"," * Expose constructors."," */","","exports.Store = Store;","exports.Cookie = Cookie;","exports.Session = Session;","exports.MemoryStore = MemoryStore;","","/**"," * Warning message for `MemoryStore` usage in production."," */","","var warning = 'Warning: connection.session() MemoryStore is not\\n'"," + 'designed for a production environment, as it will leak\\n'"," + 'memory, and will not scale past a single process.';","","/**"," * Session:"," * "," * Setup session store with the given `options`."," *"," * Session data is _not_ saved in the cookie itself, however"," * cookies are used, so we must use the [cookieParser()](cookieParser.html)"," * middleware _before_ `session()`."," *"," * Examples:"," *"," * connect()"," * .use(connect.cookieParser())"," * .use(connect.session({ secret: 'keyboard cat', key: 'sid', cookie: { secure: true }}))"," *"," * Options:"," *"," * - `key` cookie name defaulting to `connect.sid`"," * - `store` session store instance"," * - `secret` session cookie is signed with this secret to prevent tampering"," * - `cookie` session cookie settings, defaulting to `{ path: '/', httpOnly: true, maxAge: null }`"," * - `proxy` trust the reverse proxy when setting secure cookies (via \"x-forwarded-proto\")"," *"," * Cookie option:"," *"," * By default `cookie.maxAge` is `null`, meaning no \"expires\" parameter is set"," * so the cookie becomes a browser-session cookie. When the user closes the "," * browser the cookie (and session) will be removed."," *"," * ## req.session"," *"," * To store or access session data, simply use the request property `req.session`,"," * which is (generally) serialized as JSON by the store, so nested objects "," * are typically fine. For example below is a user-specific view counter:"," *"," * connect()"," * .use(connect.favicon())"," * .use(connect.cookieParser())"," * .use(connect.session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }}))"," * .use(function(req, res, next){"," * var sess = req.session;"," * if (sess.views) {"," * res.setHeader('Content-Type', 'text/html');"," * res.write('<p>views: ' + sess.views + '</p>');"," * res.write('<p>expires in: ' + (sess.cookie.maxAge / 1000) + 's</p>');"," * res.end();"," * sess.views++;"," * } else {"," * sess.views = 1;"," * res.end('welcome to the session demo. refresh!');"," * }"," * }"," * )).listen(3000);"," *"," * ## Session#regenerate()"," *"," * To regenerate the session simply invoke the method, once complete"," * a new SID and `Session` instance will be initialized at `req.session`."," *"," * req.session.regenerate(function(err){"," * // will have a new session here"," * });"," *"," * ## Session#destroy()"," *"," * Destroys the session, removing `req.session`, will be re-generated next request."," *"," * req.session.destroy(function(err){"," * // cannot access session here"," * });"," * "," * ## Session#reload()"," *"," * Reloads the session data."," *"," * req.session.reload(function(err){"," * // session updated"," * });"," *"," * ## Session#save()"," *"," * Save the session."," *"," * req.session.save(function(err){"," * // session saved"," * });"," *"," * ## Session#touch()"," *"," * Updates the `.maxAge` property. Typically this is"," * not necessary to call, as the session middleware does this for you."," *"," * ## Session#cookie"," *"," * Each session has a unique cookie object accompany it. This allows"," * you to alter the session cookie per visitor. For example we can"," * set `req.session.cookie.expires` to `false` to enable the cookie"," * to remain for only the duration of the user-agent."," *"," * ## Session#maxAge"," *"," * Alternatively `req.session.cookie.maxAge` will return the time"," * remaining in milliseconds, which we may also re-assign a new value"," * to adjust the `.expires` property appropriately. The following"," * are essentially equivalent"," *"," * var hour = 3600000;"," * req.session.cookie.expires = new Date(Date.now() + hour);"," * req.session.cookie.maxAge = hour;"," *"," * For example when `maxAge` is set to `60000` (one minute), and 30 seconds"," * has elapsed it will return `30000` until the current request has completed,"," * at which time `req.session.touch()` is called to reset `req.session.maxAge`"," * to its original value."," *"," * req.session.cookie.maxAge;"," * // => 30000"," *"," * Session Store Implementation:"," *"," * Every session store _must_ implement the following methods"," *"," * - `.get(sid, callback)`"," * - `.set(sid, session, callback)`"," * - `.destroy(sid, callback)`"," *"," * Recommended methods include, but are not limited to:"," *"," * - `.length(callback)`"," * - `.clear(callback)`"," *"," * For an example implementation view the [connect-redis](http://github.com/visionmedia/connect-redis) repo."," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","function session(options){"," var options = options || {}"," , key = options.key || 'connect.sid'"," , store = options.store || new MemoryStore"," , cookie = options.cookie || {}"," , trustProxy = options.proxy"," , storeReady = true;",""," // notify user that this store is not"," // meant for a production environment"," if ('production' == env && store instanceof MemoryStore) {"," console.warn(warning);"," }",""," // generates the new session"," store.generate = function(req){"," req.sessionID = utils.uid(24);"," req.session = new Session(req);"," req.session.cookie = new Cookie(cookie);"," };",""," store.on('disconnect', function(){ storeReady = false; });"," store.on('connect', function(){ storeReady = true; });",""," return function session(req, res, next) {"," // self-awareness"," if (req.session) return next();",""," // Handle connection as if there is no session if"," // the store has temporarily disconnected etc"," if (!storeReady) return debug('store is disconnected'), next();",""," // pathname mismatch"," if (0 != req.originalUrl.indexOf(cookie.path || '/')) return next();",""," // backwards compatibility for signed cookies"," // req.secret is passed from the cookie parser middleware"," var secret = options.secret || req.secret;",""," // ensure secret is available or bail"," if (!secret) throw new Error('`secret` option required for sessions');",""," // parse url"," var originalHash"," , originalId;",""," // expose store"," req.sessionStore = store;",""," // grab the session cookie value and check the signature"," var rawCookie = req.cookies[key];",""," // get signedCookies for backwards compat with signed cookies"," var unsignedCookie = req.signedCookies[key];",""," if (!unsignedCookie && rawCookie) {"," unsignedCookie = utils.parseSignedCookie(rawCookie, secret);"," }",""," // set-cookie"," res.on('header', function(){"," if (!req.session) return;"," var cookie = req.session.cookie"," , proto = (req.headers['x-forwarded-proto'] || '').toLowerCase()"," , tls = req.connection.encrypted || (trustProxy && 'https' == proto)"," , secured = cookie.secure && tls"," , isNew = unsignedCookie != req.sessionID;",""," // only send secure cookies via https"," if (cookie.secure && !secured) return debug('not secured');",""," // browser-session length cookie"," if (null == cookie.expires) {"," if (!isNew) return debug('already set browser-session cookie');"," // compare hashes and ids"," } else if (originalHash == hash(req.session) && originalId == req.session.id) {"," return debug('unmodified session');"," }",""," var val = 's:' + signature.sign(req.sessionID, secret);"," val = cookie.serialize(key, val);"," debug('set-cookie %s', val);"," res.setHeader('Set-Cookie', val);"," });",""," // proxy end() to commit the session"," var end = res.end;"," res.end = function(data, encoding){"," res.end = end;"," if (!req.session) return res.end(data, encoding);"," debug('saving');"," req.session.resetMaxAge();"," req.session.save(function(){"," debug('saved');"," res.end(data, encoding);"," });"," };",""," // generate the session"," function generate() {"," store.generate(req);"," }",""," // get the sessionID from the cookie"," req.sessionID = unsignedCookie;",""," // generate a session if the browser doesn't send a sessionID"," if (!req.sessionID) {"," debug('no SID sent, generating session');"," generate();"," next();"," return;"," }",""," // generate the session object"," var pause = utils.pause(req);"," debug('fetching %s', req.sessionID);"," store.get(req.sessionID, function(err, sess){"," // proxy to resume() events"," var _next = next;"," next = function(err){"," _next(err);"," pause.resume();"," };",""," // error handling"," if (err) {"," debug('error');"," if ('ENOENT' == err.code) {"," generate();"," next();"," } else {"," next(err);"," }"," // no session"," } else if (!sess) {"," debug('no session found');"," generate();"," next();"," // populate req.session"," } else {"," debug('session found');"," store.createSession(req, sess);"," originalId = req.sessionID;"," originalHash = hash(sess);"," next();"," }"," });"," };","};","","/**"," * Hash the given `sess` object omitting changes"," * to `.cookie`."," *"," * @param {Object} sess"," * @return {String}"," * @api private"," */","","function hash(sess) {"," return crc16(JSON.stringify(sess, function(key, val){"," if ('cookie' != key) return val;"," }));","}"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/session/cookie.js b/node_modules/express/node_modules/connect/lib-cov/middleware/session/cookie.js deleted file mode 100644 index 279afe5..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/session/cookie.js +++ /dev/null @@ -1,65 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/session/cookie.js']) { - _$jscoverage['middleware/session/cookie.js'] = []; - _$jscoverage['middleware/session/cookie.js'][13] = 0; - _$jscoverage['middleware/session/cookie.js'][24] = 0; - _$jscoverage['middleware/session/cookie.js'][25] = 0; - _$jscoverage['middleware/session/cookie.js'][26] = 0; - _$jscoverage['middleware/session/cookie.js'][27] = 0; - _$jscoverage['middleware/session/cookie.js'][28] = 0; - _$jscoverage['middleware/session/cookie.js'][29] = 0; - _$jscoverage['middleware/session/cookie.js'][38] = 0; - _$jscoverage['middleware/session/cookie.js'][48] = 0; - _$jscoverage['middleware/session/cookie.js'][49] = 0; - _$jscoverage['middleware/session/cookie.js'][60] = 0; - _$jscoverage['middleware/session/cookie.js'][71] = 0; - _$jscoverage['middleware/session/cookie.js'][84] = 0; - _$jscoverage['middleware/session/cookie.js'][97] = 0; - _$jscoverage['middleware/session/cookie.js'][115] = 0; - _$jscoverage['middleware/session/cookie.js'][126] = 0; -} -_$jscoverage['middleware/session/cookie.js'][13]++; -var utils = require("../../utils"), cookie = require("cookie"); -_$jscoverage['middleware/session/cookie.js'][24]++; -var Cookie = module.exports = (function Cookie(options) { - _$jscoverage['middleware/session/cookie.js'][25]++; - this.path = "/"; - _$jscoverage['middleware/session/cookie.js'][26]++; - this.maxAge = null; - _$jscoverage['middleware/session/cookie.js'][27]++; - this.httpOnly = true; - _$jscoverage['middleware/session/cookie.js'][28]++; - if (options) { - _$jscoverage['middleware/session/cookie.js'][28]++; - utils.merge(this, options); - } - _$jscoverage['middleware/session/cookie.js'][29]++; - this.originalMaxAge = undefined == this.originalMaxAge? this.maxAge: this.originalMaxAge; -}); -_$jscoverage['middleware/session/cookie.js'][38]++; -Cookie.prototype = {set expires (date) { - _$jscoverage['middleware/session/cookie.js'][48]++; - this._expires = date; - _$jscoverage['middleware/session/cookie.js'][49]++; - this.originalMaxAge = this.maxAge; -}, get expires () { - _$jscoverage['middleware/session/cookie.js'][60]++; - return this._expires; -}, set maxAge (ms) { - _$jscoverage['middleware/session/cookie.js'][71]++; - this.expires = "number" == typeof ms? new Date(Date.now() + ms): ms; -}, get maxAge () { - _$jscoverage['middleware/session/cookie.js'][84]++; - return this.expires instanceof Date? this.expires.valueOf() - Date.now(): this.expires; -}, get data () { - _$jscoverage['middleware/session/cookie.js'][97]++; - return ({originalMaxAge: this.originalMaxAge, expires: this._expires, secure: this.secure, httpOnly: this.httpOnly, domain: this.domain, path: this.path}); -}, serialize: (function (name, val) { - _$jscoverage['middleware/session/cookie.js'][115]++; - return cookie.serialize(name, val, this.data); -}), toJSON: (function () { - _$jscoverage['middleware/session/cookie.js'][126]++; - return this.data; -})}; -_$jscoverage['middleware/session/cookie.js'].source = ["","/*!"," * Connect - session - Cookie"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../../utils')"," , cookie = require('cookie');","","/**"," * Initialize a new `Cookie` with the given `options`."," *"," * @param {IncomingMessage} req"," * @param {Object} options"," * @api private"," */","","var Cookie = module.exports = function Cookie(options) {"," this.path = '/';"," this.maxAge = null;"," this.httpOnly = true;"," if (options) utils.merge(this, options);"," this.originalMaxAge = undefined == this.originalMaxAge"," ? this.maxAge"," : this.originalMaxAge;","};","","/*!"," * Prototype."," */","","Cookie.prototype = {",""," /**"," * Set expires `date`."," *"," * @param {Date} date"," * @api public"," */"," "," set expires(date) {"," this._expires = date;"," this.originalMaxAge = this.maxAge;"," },",""," /**"," * Get expires `date`."," *"," * @return {Date}"," * @api public"," */",""," get expires() {"," return this._expires;"," },"," "," /**"," * Set expires via max-age in `ms`."," *"," * @param {Number} ms"," * @api public"," */"," "," set maxAge(ms) {"," this.expires = 'number' == typeof ms"," ? new Date(Date.now() + ms)"," : ms;"," },",""," /**"," * Get expires max-age in `ms`."," *"," * @return {Number}"," * @api public"," */",""," get maxAge() {"," return this.expires instanceof Date"," ? this.expires.valueOf() - Date.now()"," : this.expires;"," },",""," /**"," * Return cookie data object."," *"," * @return {Object}"," * @api private"," */",""," get data() {"," return {"," originalMaxAge: this.originalMaxAge"," , expires: this._expires"," , secure: this.secure"," , httpOnly: this.httpOnly"," , domain: this.domain"," , path: this.path"," }"," },",""," /**"," * Return a serialized cookie string."," *"," * @return {String}"," * @api public"," */",""," serialize: function(name, val){"," return cookie.serialize(name, val, this.data);"," },",""," /**"," * Return JSON representation of this cookie."," *"," * @return {Object}"," * @api private"," */"," "," toJSON: function(){"," return this.data;"," }","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/session/memory.js b/node_modules/express/node_modules/connect/lib-cov/middleware/session/memory.js deleted file mode 100644 index f140187..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/session/memory.js +++ /dev/null @@ -1,128 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/session/memory.js']) { - _$jscoverage['middleware/session/memory.js'] = []; - _$jscoverage['middleware/session/memory.js'][13] = 0; - _$jscoverage['middleware/session/memory.js'][21] = 0; - _$jscoverage['middleware/session/memory.js'][22] = 0; - _$jscoverage['middleware/session/memory.js'][29] = 0; - _$jscoverage['middleware/session/memory.js'][39] = 0; - _$jscoverage['middleware/session/memory.js'][40] = 0; - _$jscoverage['middleware/session/memory.js'][41] = 0; - _$jscoverage['middleware/session/memory.js'][42] = 0; - _$jscoverage['middleware/session/memory.js'][44] = 0; - _$jscoverage['middleware/session/memory.js'][45] = 0; - _$jscoverage['middleware/session/memory.js'][46] = 0; - _$jscoverage['middleware/session/memory.js'][49] = 0; - _$jscoverage['middleware/session/memory.js'][50] = 0; - _$jscoverage['middleware/session/memory.js'][52] = 0; - _$jscoverage['middleware/session/memory.js'][55] = 0; - _$jscoverage['middleware/session/memory.js'][69] = 0; - _$jscoverage['middleware/session/memory.js'][70] = 0; - _$jscoverage['middleware/session/memory.js'][71] = 0; - _$jscoverage['middleware/session/memory.js'][72] = 0; - _$jscoverage['middleware/session/memory.js'][73] = 0; - _$jscoverage['middleware/session/memory.js'][84] = 0; - _$jscoverage['middleware/session/memory.js'][85] = 0; - _$jscoverage['middleware/session/memory.js'][86] = 0; - _$jscoverage['middleware/session/memory.js'][87] = 0; - _$jscoverage['middleware/session/memory.js'][88] = 0; - _$jscoverage['middleware/session/memory.js'][99] = 0; - _$jscoverage['middleware/session/memory.js'][100] = 0; - _$jscoverage['middleware/session/memory.js'][102] = 0; - _$jscoverage['middleware/session/memory.js'][103] = 0; - _$jscoverage['middleware/session/memory.js'][105] = 0; - _$jscoverage['middleware/session/memory.js'][115] = 0; - _$jscoverage['middleware/session/memory.js'][116] = 0; - _$jscoverage['middleware/session/memory.js'][117] = 0; - _$jscoverage['middleware/session/memory.js'][127] = 0; - _$jscoverage['middleware/session/memory.js'][128] = 0; -} -_$jscoverage['middleware/session/memory.js'][13]++; -var Store = require("./store"); -_$jscoverage['middleware/session/memory.js'][21]++; -var MemoryStore = module.exports = (function MemoryStore() { - _$jscoverage['middleware/session/memory.js'][22]++; - this.sessions = {}; -}); -_$jscoverage['middleware/session/memory.js'][29]++; -MemoryStore.prototype.__proto__ = Store.prototype; -_$jscoverage['middleware/session/memory.js'][39]++; -MemoryStore.prototype.get = (function (sid, fn) { - _$jscoverage['middleware/session/memory.js'][40]++; - var self = this; - _$jscoverage['middleware/session/memory.js'][41]++; - process.nextTick((function () { - _$jscoverage['middleware/session/memory.js'][42]++; - var expires, sess = self.sessions[sid]; - _$jscoverage['middleware/session/memory.js'][44]++; - if (sess) { - _$jscoverage['middleware/session/memory.js'][45]++; - sess = JSON.parse(sess); - _$jscoverage['middleware/session/memory.js'][46]++; - expires = "string" == typeof sess.cookie.expires? new Date(sess.cookie.expires): sess.cookie.expires; - _$jscoverage['middleware/session/memory.js'][49]++; - if (! expires || new Date() < expires) { - _$jscoverage['middleware/session/memory.js'][50]++; - fn(null, sess); - } - else { - _$jscoverage['middleware/session/memory.js'][52]++; - self.destroy(sid, fn); - } - } - else { - _$jscoverage['middleware/session/memory.js'][55]++; - fn(); - } -})); -}); -_$jscoverage['middleware/session/memory.js'][69]++; -MemoryStore.prototype.set = (function (sid, sess, fn) { - _$jscoverage['middleware/session/memory.js'][70]++; - var self = this; - _$jscoverage['middleware/session/memory.js'][71]++; - process.nextTick((function () { - _$jscoverage['middleware/session/memory.js'][72]++; - self.sessions[sid] = JSON.stringify(sess); - _$jscoverage['middleware/session/memory.js'][73]++; - fn && fn(); -})); -}); -_$jscoverage['middleware/session/memory.js'][84]++; -MemoryStore.prototype.destroy = (function (sid, fn) { - _$jscoverage['middleware/session/memory.js'][85]++; - var self = this; - _$jscoverage['middleware/session/memory.js'][86]++; - process.nextTick((function () { - _$jscoverage['middleware/session/memory.js'][87]++; - delete self.sessions[sid]; - _$jscoverage['middleware/session/memory.js'][88]++; - fn && fn(); -})); -}); -_$jscoverage['middleware/session/memory.js'][99]++; -MemoryStore.prototype.all = (function (fn) { - _$jscoverage['middleware/session/memory.js'][100]++; - var arr = [], keys = Object.keys(this.sessions); - _$jscoverage['middleware/session/memory.js'][102]++; - for (var i = 0, len = keys.length; i < len; ++i) { - _$jscoverage['middleware/session/memory.js'][103]++; - arr.push(this.sessions[keys[i]]); -} - _$jscoverage['middleware/session/memory.js'][105]++; - fn(null, arr); -}); -_$jscoverage['middleware/session/memory.js'][115]++; -MemoryStore.prototype.clear = (function (fn) { - _$jscoverage['middleware/session/memory.js'][116]++; - this.sessions = {}; - _$jscoverage['middleware/session/memory.js'][117]++; - fn && fn(); -}); -_$jscoverage['middleware/session/memory.js'][127]++; -MemoryStore.prototype.length = (function (fn) { - _$jscoverage['middleware/session/memory.js'][128]++; - fn(null, Object.keys(this.sessions).length); -}); -_$jscoverage['middleware/session/memory.js'].source = ["","/*!"," * Connect - session - MemoryStore"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var Store = require('./store');","","/**"," * Initialize a new `MemoryStore`."," *"," * @api public"," */","","var MemoryStore = module.exports = function MemoryStore() {"," this.sessions = {};","};","","/**"," * Inherit from `Store.prototype`."," */","","MemoryStore.prototype.__proto__ = Store.prototype;","","/**"," * Attempt to fetch session by the given `sid`."," *"," * @param {String} sid"," * @param {Function} fn"," * @api public"," */","","MemoryStore.prototype.get = function(sid, fn){"," var self = this;"," process.nextTick(function(){"," var expires"," , sess = self.sessions[sid];"," if (sess) {"," sess = JSON.parse(sess);"," expires = 'string' == typeof sess.cookie.expires"," ? new Date(sess.cookie.expires)"," : sess.cookie.expires;"," if (!expires || new Date < expires) {"," fn(null, sess);"," } else {"," self.destroy(sid, fn);"," }"," } else {"," fn();"," }"," });","};","","/**"," * Commit the given `sess` object associated with the given `sid`."," *"," * @param {String} sid"," * @param {Session} sess"," * @param {Function} fn"," * @api public"," */","","MemoryStore.prototype.set = function(sid, sess, fn){"," var self = this;"," process.nextTick(function(){"," self.sessions[sid] = JSON.stringify(sess);"," fn && fn();"," });","};","","/**"," * Destroy the session associated with the given `sid`."," *"," * @param {String} sid"," * @api public"," */","","MemoryStore.prototype.destroy = function(sid, fn){"," var self = this;"," process.nextTick(function(){"," delete self.sessions[sid];"," fn && fn();"," });","};","","/**"," * Invoke the given callback `fn` with all active sessions."," *"," * @param {Function} fn"," * @api public"," */","","MemoryStore.prototype.all = function(fn){"," var arr = []"," , keys = Object.keys(this.sessions);"," for (var i = 0, len = keys.length; i < len; ++i) {"," arr.push(this.sessions[keys[i]]);"," }"," fn(null, arr);","};","","/**"," * Clear all sessions."," *"," * @param {Function} fn"," * @api public"," */","","MemoryStore.prototype.clear = function(fn){"," this.sessions = {};"," fn && fn();","};","","/**"," * Fetch number of sessions."," *"," * @param {Function} fn"," * @api public"," */","","MemoryStore.prototype.length = function(fn){"," fn(null, Object.keys(this.sessions).length);","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/session/session.js b/node_modules/express/node_modules/connect/lib-cov/middleware/session/session.js deleted file mode 100644 index 73e85e0..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/session/session.js +++ /dev/null @@ -1,108 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/session/session.js']) { - _$jscoverage['middleware/session/session.js'] = []; - _$jscoverage['middleware/session/session.js'][13] = 0; - _$jscoverage['middleware/session/session.js'][23] = 0; - _$jscoverage['middleware/session/session.js'][24] = 0; - _$jscoverage['middleware/session/session.js'][25] = 0; - _$jscoverage['middleware/session/session.js'][26] = 0; - _$jscoverage['middleware/session/session.js'][38] = 0; - _$jscoverage['middleware/session/session.js'][39] = 0; - _$jscoverage['middleware/session/session.js'][49] = 0; - _$jscoverage['middleware/session/session.js'][50] = 0; - _$jscoverage['middleware/session/session.js'][51] = 0; - _$jscoverage['middleware/session/session.js'][62] = 0; - _$jscoverage['middleware/session/session.js'][63] = 0; - _$jscoverage['middleware/session/session.js'][64] = 0; - _$jscoverage['middleware/session/session.js'][79] = 0; - _$jscoverage['middleware/session/session.js'][80] = 0; - _$jscoverage['middleware/session/session.js'][82] = 0; - _$jscoverage['middleware/session/session.js'][83] = 0; - _$jscoverage['middleware/session/session.js'][84] = 0; - _$jscoverage['middleware/session/session.js'][85] = 0; - _$jscoverage['middleware/session/session.js'][86] = 0; - _$jscoverage['middleware/session/session.js'][88] = 0; - _$jscoverage['middleware/session/session.js'][99] = 0; - _$jscoverage['middleware/session/session.js'][100] = 0; - _$jscoverage['middleware/session/session.js'][101] = 0; - _$jscoverage['middleware/session/session.js'][102] = 0; - _$jscoverage['middleware/session/session.js'][113] = 0; - _$jscoverage['middleware/session/session.js'][114] = 0; - _$jscoverage['middleware/session/session.js'][115] = 0; -} -_$jscoverage['middleware/session/session.js'][13]++; -var utils = require("../../utils"); -_$jscoverage['middleware/session/session.js'][23]++; -var Session = module.exports = (function Session(req, data) { - _$jscoverage['middleware/session/session.js'][24]++; - Object.defineProperty(this, "req", {value: req}); - _$jscoverage['middleware/session/session.js'][25]++; - Object.defineProperty(this, "id", {value: req.sessionID}); - _$jscoverage['middleware/session/session.js'][26]++; - if ("object" == typeof data) { - _$jscoverage['middleware/session/session.js'][26]++; - utils.merge(this, data); - } -}); -_$jscoverage['middleware/session/session.js'][38]++; -Session.prototype.touch = (function () { - _$jscoverage['middleware/session/session.js'][39]++; - return this.resetMaxAge(); -}); -_$jscoverage['middleware/session/session.js'][49]++; -Session.prototype.resetMaxAge = (function () { - _$jscoverage['middleware/session/session.js'][50]++; - this.cookie.maxAge = this.cookie.originalMaxAge; - _$jscoverage['middleware/session/session.js'][51]++; - return this; -}); -_$jscoverage['middleware/session/session.js'][62]++; -Session.prototype.save = (function (fn) { - _$jscoverage['middleware/session/session.js'][63]++; - this.req.sessionStore.set(this.id, this, fn || (function () { -})); - _$jscoverage['middleware/session/session.js'][64]++; - return this; -}); -_$jscoverage['middleware/session/session.js'][79]++; -Session.prototype.reload = (function (fn) { - _$jscoverage['middleware/session/session.js'][80]++; - var req = this.req, store = this.req.sessionStore; - _$jscoverage['middleware/session/session.js'][82]++; - store.get(this.id, (function (err, sess) { - _$jscoverage['middleware/session/session.js'][83]++; - if (err) { - _$jscoverage['middleware/session/session.js'][83]++; - return fn(err); - } - _$jscoverage['middleware/session/session.js'][84]++; - if (! sess) { - _$jscoverage['middleware/session/session.js'][84]++; - return fn(new Error("failed to load session")); - } - _$jscoverage['middleware/session/session.js'][85]++; - store.createSession(req, sess); - _$jscoverage['middleware/session/session.js'][86]++; - fn(); -})); - _$jscoverage['middleware/session/session.js'][88]++; - return this; -}); -_$jscoverage['middleware/session/session.js'][99]++; -Session.prototype.destroy = (function (fn) { - _$jscoverage['middleware/session/session.js'][100]++; - delete this.req.session; - _$jscoverage['middleware/session/session.js'][101]++; - this.req.sessionStore.destroy(this.id, fn); - _$jscoverage['middleware/session/session.js'][102]++; - return this; -}); -_$jscoverage['middleware/session/session.js'][113]++; -Session.prototype.regenerate = (function (fn) { - _$jscoverage['middleware/session/session.js'][114]++; - this.req.sessionStore.regenerate(this.req, fn); - _$jscoverage['middleware/session/session.js'][115]++; - return this; -}); -_$jscoverage['middleware/session/session.js'].source = ["","/*!"," * Connect - session - Session"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../../utils');","","/**"," * Create a new `Session` with the given request and `data`."," *"," * @param {IncomingRequest} req"," * @param {Object} data"," * @api private"," */","","var Session = module.exports = function Session(req, data) {"," Object.defineProperty(this, 'req', { value: req });"," Object.defineProperty(this, 'id', { value: req.sessionID });"," if ('object' == typeof data) utils.merge(this, data);","};","","/**"," * Update reset `.cookie.maxAge` to prevent"," * the cookie from expiring when the"," * session is still active."," *"," * @return {Session} for chaining"," * @api public"," */","","Session.prototype.touch = function(){"," return this.resetMaxAge();","};","","/**"," * Reset `.maxAge` to `.originalMaxAge`."," *"," * @return {Session} for chaining"," * @api public"," */","","Session.prototype.resetMaxAge = function(){"," this.cookie.maxAge = this.cookie.originalMaxAge;"," return this;","};","","/**"," * Save the session data with optional callback `fn(err)`."," *"," * @param {Function} fn"," * @return {Session} for chaining"," * @api public"," */","","Session.prototype.save = function(fn){"," this.req.sessionStore.set(this.id, this, fn || function(){});"," return this;","};","","/**"," * Re-loads the session data _without_ altering"," * the maxAge properties. Invokes the callback `fn(err)`,"," * after which time if no exception has occurred the"," * `req.session` property will be a new `Session` object,"," * although representing the same session."," *"," * @param {Function} fn"," * @return {Session} for chaining"," * @api public"," */","","Session.prototype.reload = function(fn){"," var req = this.req"," , store = this.req.sessionStore;"," store.get(this.id, function(err, sess){"," if (err) return fn(err);"," if (!sess) return fn(new Error('failed to load session'));"," store.createSession(req, sess);"," fn();"," });"," return this;","};","","/**"," * Destroy `this` session."," *"," * @param {Function} fn"," * @return {Session} for chaining"," * @api public"," */","","Session.prototype.destroy = function(fn){"," delete this.req.session;"," this.req.sessionStore.destroy(this.id, fn);"," return this;","};","","/**"," * Regenerate this request's session."," *"," * @param {Function} fn"," * @return {Session} for chaining"," * @api public"," */","","Session.prototype.regenerate = function(fn){"," this.req.sessionStore.regenerate(this.req, fn);"," return this;","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/session/store.js b/node_modules/express/node_modules/connect/lib-cov/middleware/session/store.js deleted file mode 100644 index 2d79aa2..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/session/store.js +++ /dev/null @@ -1,90 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/session/store.js']) { - _$jscoverage['middleware/session/store.js'] = []; - _$jscoverage['middleware/session/store.js'][13] = 0; - _$jscoverage['middleware/session/store.js'][23] = 0; - _$jscoverage['middleware/session/store.js'][29] = 0; - _$jscoverage['middleware/session/store.js'][39] = 0; - _$jscoverage['middleware/session/store.js'][40] = 0; - _$jscoverage['middleware/session/store.js'][41] = 0; - _$jscoverage['middleware/session/store.js'][42] = 0; - _$jscoverage['middleware/session/store.js'][43] = 0; - _$jscoverage['middleware/session/store.js'][56] = 0; - _$jscoverage['middleware/session/store.js'][57] = 0; - _$jscoverage['middleware/session/store.js'][58] = 0; - _$jscoverage['middleware/session/store.js'][59] = 0; - _$jscoverage['middleware/session/store.js'][60] = 0; - _$jscoverage['middleware/session/store.js'][61] = 0; - _$jscoverage['middleware/session/store.js'][62] = 0; - _$jscoverage['middleware/session/store.js'][63] = 0; - _$jscoverage['middleware/session/store.js'][76] = 0; - _$jscoverage['middleware/session/store.js'][77] = 0; - _$jscoverage['middleware/session/store.js'][79] = 0; - _$jscoverage['middleware/session/store.js'][80] = 0; - _$jscoverage['middleware/session/store.js'][81] = 0; - _$jscoverage['middleware/session/store.js'][82] = 0; - _$jscoverage['middleware/session/store.js'][83] = 0; -} -_$jscoverage['middleware/session/store.js'][13]++; -var EventEmitter = require("events").EventEmitter, Session = require("./session"), Cookie = require("./cookie"); -_$jscoverage['middleware/session/store.js'][23]++; -var Store = module.exports = (function Store(options) { -}); -_$jscoverage['middleware/session/store.js'][29]++; -Store.prototype.__proto__ = EventEmitter.prototype; -_$jscoverage['middleware/session/store.js'][39]++; -Store.prototype.regenerate = (function (req, fn) { - _$jscoverage['middleware/session/store.js'][40]++; - var self = this; - _$jscoverage['middleware/session/store.js'][41]++; - this.destroy(req.sessionID, (function (err) { - _$jscoverage['middleware/session/store.js'][42]++; - self.generate(req); - _$jscoverage['middleware/session/store.js'][43]++; - fn(err); -})); -}); -_$jscoverage['middleware/session/store.js'][56]++; -Store.prototype.load = (function (sid, fn) { - _$jscoverage['middleware/session/store.js'][57]++; - var self = this; - _$jscoverage['middleware/session/store.js'][58]++; - this.get(sid, (function (err, sess) { - _$jscoverage['middleware/session/store.js'][59]++; - if (err) { - _$jscoverage['middleware/session/store.js'][59]++; - return fn(err); - } - _$jscoverage['middleware/session/store.js'][60]++; - if (! sess) { - _$jscoverage['middleware/session/store.js'][60]++; - return fn(); - } - _$jscoverage['middleware/session/store.js'][61]++; - var req = {sessionID: sid, sessionStore: self}; - _$jscoverage['middleware/session/store.js'][62]++; - sess = self.createSession(req, sess); - _$jscoverage['middleware/session/store.js'][63]++; - fn(null, sess); -})); -}); -_$jscoverage['middleware/session/store.js'][76]++; -Store.prototype.createSession = (function (req, sess) { - _$jscoverage['middleware/session/store.js'][77]++; - var expires = sess.cookie.expires, orig = sess.cookie.originalMaxAge; - _$jscoverage['middleware/session/store.js'][79]++; - sess.cookie = new Cookie(sess.cookie); - _$jscoverage['middleware/session/store.js'][80]++; - if ("string" == typeof expires) { - _$jscoverage['middleware/session/store.js'][80]++; - sess.cookie.expires = new Date(expires); - } - _$jscoverage['middleware/session/store.js'][81]++; - sess.cookie.originalMaxAge = orig; - _$jscoverage['middleware/session/store.js'][82]++; - req.session = new Session(req, sess); - _$jscoverage['middleware/session/store.js'][83]++; - return req.session; -}); -_$jscoverage['middleware/session/store.js'].source = ["","/*!"," * Connect - session - Store"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var EventEmitter = require('events').EventEmitter"," , Session = require('./session')"," , Cookie = require('./cookie');","","/**"," * Initialize abstract `Store`."," *"," * @api private"," */","","var Store = module.exports = function Store(options){};","","/**"," * Inherit from `EventEmitter.prototype`."," */","","Store.prototype.__proto__ = EventEmitter.prototype;","","/**"," * Re-generate the given requests's session."," *"," * @param {IncomingRequest} req"," * @return {Function} fn"," * @api public"," */","","Store.prototype.regenerate = function(req, fn){"," var self = this;"," this.destroy(req.sessionID, function(err){"," self.generate(req);"," fn(err);"," });","};","","/**"," * Load a `Session` instance via the given `sid`"," * and invoke the callback `fn(err, sess)`."," *"," * @param {String} sid"," * @param {Function} fn"," * @api public"," */","","Store.prototype.load = function(sid, fn){"," var self = this;"," this.get(sid, function(err, sess){"," if (err) return fn(err);"," if (!sess) return fn();"," var req = { sessionID: sid, sessionStore: self };"," sess = self.createSession(req, sess);"," fn(null, sess);"," });","};","","/**"," * Create session from JSON `sess` data."," *"," * @param {IncomingRequest} req"," * @param {Object} sess"," * @return {Session}"," * @api private"," */","","Store.prototype.createSession = function(req, sess){"," var expires = sess.cookie.expires"," , orig = sess.cookie.originalMaxAge;"," sess.cookie = new Cookie(sess.cookie);"," if ('string' == typeof expires) sess.cookie.expires = new Date(expires);"," sess.cookie.originalMaxAge = orig;"," req.session = new Session(req, sess);"," return req.session;","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/static.js b/node_modules/express/node_modules/connect/lib-cov/middleware/static.js deleted file mode 100644 index c52b1c0..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/static.js +++ /dev/null @@ -1,92 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/static.js']) { - _$jscoverage['middleware/static.js'] = []; - _$jscoverage['middleware/static.js'][13] = 0; - _$jscoverage['middleware/static.js'][45] = 0; - _$jscoverage['middleware/static.js'][46] = 0; - _$jscoverage['middleware/static.js'][49] = 0; - _$jscoverage['middleware/static.js'][52] = 0; - _$jscoverage['middleware/static.js'][54] = 0; - _$jscoverage['middleware/static.js'][55] = 0; - _$jscoverage['middleware/static.js'][56] = 0; - _$jscoverage['middleware/static.js'][57] = 0; - _$jscoverage['middleware/static.js'][59] = 0; - _$jscoverage['middleware/static.js'][60] = 0; - _$jscoverage['middleware/static.js'][61] = 0; - _$jscoverage['middleware/static.js'][64] = 0; - _$jscoverage['middleware/static.js'][65] = 0; - _$jscoverage['middleware/static.js'][66] = 0; - _$jscoverage['middleware/static.js'][67] = 0; - _$jscoverage['middleware/static.js'][68] = 0; - _$jscoverage['middleware/static.js'][69] = 0; - _$jscoverage['middleware/static.js'][72] = 0; - _$jscoverage['middleware/static.js'][73] = 0; - _$jscoverage['middleware/static.js'][74] = 0; - _$jscoverage['middleware/static.js'][77] = 0; - _$jscoverage['middleware/static.js'][94] = 0; -} -_$jscoverage['middleware/static.js'][13]++; -var send = require("send"), utils = require("../utils"), parse = utils.parseUrl, url = require("url"); -_$jscoverage['middleware/static.js'][45]++; -exports = module.exports = (function static(root, options) { - _$jscoverage['middleware/static.js'][46]++; - options = options || {}; - _$jscoverage['middleware/static.js'][49]++; - if (! root) { - _$jscoverage['middleware/static.js'][49]++; - throw new Error("static() root path required"); - } - _$jscoverage['middleware/static.js'][52]++; - var redirect = false !== options.redirect; - _$jscoverage['middleware/static.js'][54]++; - return (function static(req, res, next) { - _$jscoverage['middleware/static.js'][55]++; - if ("GET" != req.method && "HEAD" != req.method) { - _$jscoverage['middleware/static.js'][55]++; - return next(); - } - _$jscoverage['middleware/static.js'][56]++; - var path = parse(req).pathname; - _$jscoverage['middleware/static.js'][57]++; - var pause = utils.pause(req); - _$jscoverage['middleware/static.js'][59]++; - function resume() { - _$jscoverage['middleware/static.js'][60]++; - next(); - _$jscoverage['middleware/static.js'][61]++; - pause.resume(); -} - _$jscoverage['middleware/static.js'][64]++; - function directory() { - _$jscoverage['middleware/static.js'][65]++; - if (! redirect) { - _$jscoverage['middleware/static.js'][65]++; - return resume(); - } - _$jscoverage['middleware/static.js'][66]++; - var pathname = url.parse(req.originalUrl).pathname; - _$jscoverage['middleware/static.js'][67]++; - res.statusCode = 301; - _$jscoverage['middleware/static.js'][68]++; - res.setHeader("Location", pathname + "/"); - _$jscoverage['middleware/static.js'][69]++; - res.end("Redirecting to " + utils.escape(pathname) + "/"); -} - _$jscoverage['middleware/static.js'][72]++; - function error(err) { - _$jscoverage['middleware/static.js'][73]++; - if (404 == err.status) { - _$jscoverage['middleware/static.js'][73]++; - return resume(); - } - _$jscoverage['middleware/static.js'][74]++; - next(err); -} - _$jscoverage['middleware/static.js'][77]++; - send(req, path).maxage(options.maxAge || 0).root(root).hidden(options.hidden).on("error", error).on("directory", directory).pipe(res); -}); -}); -_$jscoverage['middleware/static.js'][94]++; -exports.mime = send.mime; -_$jscoverage['middleware/static.js'].source = ["","/*!"," * Connect - static"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var send = require('send')"," , utils = require('../utils')"," , parse = utils.parseUrl"," , url = require('url');","","/**"," * Static:"," *"," * Static file server with the given `root` path."," *"," * Examples:"," *"," * var oneDay = 86400000;"," *"," * connect()"," * .use(connect.static(__dirname + '/public'))"," *"," * connect()"," * .use(connect.static(__dirname + '/public', { maxAge: oneDay }))"," *"," * Options:"," *"," * - `maxAge` Browser cache maxAge in milliseconds. defaults to 0"," * - `hidden` Allow transfer of hidden files. defaults to false"," * - `redirect` Redirect to trailing \"/\" when the pathname is a dir. defaults to true"," *"," * @param {String} root"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function static(root, options){"," options = options || {};",""," // root required"," if (!root) throw new Error('static() root path required');",""," // default redirect"," var redirect = false !== options.redirect;",""," return function static(req, res, next) {"," if ('GET' != req.method && 'HEAD' != req.method) return next();"," var path = parse(req).pathname;"," var pause = utils.pause(req);",""," function resume() {"," next();"," pause.resume();"," }",""," function directory() {"," if (!redirect) return resume();"," var pathname = url.parse(req.originalUrl).pathname;"," res.statusCode = 301;"," res.setHeader('Location', pathname + '/');"," res.end('Redirecting to ' + utils.escape(pathname) + '/');"," }",""," function error(err) {"," if (404 == err.status) return resume();"," next(err);"," }",""," send(req, path)"," .maxage(options.maxAge || 0)"," .root(root)"," .hidden(options.hidden)"," .on('error', error)"," .on('directory', directory)"," .pipe(res);"," };","};","","/**"," * Expose mime module."," * "," * If you wish to extend the mime table use this"," * reference to the \"mime\" module in the npm registry."," */","","exports.mime = send.mime;"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/staticCache.js b/node_modules/express/node_modules/connect/lib-cov/middleware/staticCache.js deleted file mode 100644 index e8c2940..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/staticCache.js +++ /dev/null @@ -1,276 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/staticCache.js']) { - _$jscoverage['middleware/staticCache.js'] = []; - _$jscoverage['middleware/staticCache.js'][12] = 0; - _$jscoverage['middleware/staticCache.js'][51] = 0; - _$jscoverage['middleware/staticCache.js'][52] = 0; - _$jscoverage['middleware/staticCache.js'][56] = 0; - _$jscoverage['middleware/staticCache.js'][57] = 0; - _$jscoverage['middleware/staticCache.js'][59] = 0; - _$jscoverage['middleware/staticCache.js'][60] = 0; - _$jscoverage['middleware/staticCache.js'][68] = 0; - _$jscoverage['middleware/staticCache.js'][69] = 0; - _$jscoverage['middleware/staticCache.js'][75] = 0; - _$jscoverage['middleware/staticCache.js'][78] = 0; - _$jscoverage['middleware/staticCache.js'][81] = 0; - _$jscoverage['middleware/staticCache.js'][84] = 0; - _$jscoverage['middleware/staticCache.js'][88] = 0; - _$jscoverage['middleware/staticCache.js'][91] = 0; - _$jscoverage['middleware/staticCache.js'][94] = 0; - _$jscoverage['middleware/staticCache.js'][95] = 0; - _$jscoverage['middleware/staticCache.js'][96] = 0; - _$jscoverage['middleware/staticCache.js'][97] = 0; - _$jscoverage['middleware/staticCache.js'][99] = 0; - _$jscoverage['middleware/staticCache.js'][104] = 0; - _$jscoverage['middleware/staticCache.js'][107] = 0; - _$jscoverage['middleware/staticCache.js'][110] = 0; - _$jscoverage['middleware/staticCache.js'][111] = 0; - _$jscoverage['middleware/staticCache.js'][115] = 0; - _$jscoverage['middleware/staticCache.js'][116] = 0; - _$jscoverage['middleware/staticCache.js'][117] = 0; - _$jscoverage['middleware/staticCache.js'][118] = 0; - _$jscoverage['middleware/staticCache.js'][119] = 0; - _$jscoverage['middleware/staticCache.js'][120] = 0; - _$jscoverage['middleware/staticCache.js'][124] = 0; - _$jscoverage['middleware/staticCache.js'][125] = 0; - _$jscoverage['middleware/staticCache.js'][126] = 0; - _$jscoverage['middleware/staticCache.js'][127] = 0; - _$jscoverage['middleware/staticCache.js'][128] = 0; - _$jscoverage['middleware/staticCache.js'][129] = 0; - _$jscoverage['middleware/staticCache.js'][131] = 0; - _$jscoverage['middleware/staticCache.js'][132] = 0; - _$jscoverage['middleware/staticCache.js'][135] = 0; - _$jscoverage['middleware/staticCache.js'][151] = 0; - _$jscoverage['middleware/staticCache.js'][152] = 0; - _$jscoverage['middleware/staticCache.js'][156] = 0; - _$jscoverage['middleware/staticCache.js'][158] = 0; - _$jscoverage['middleware/staticCache.js'][160] = 0; - _$jscoverage['middleware/staticCache.js'][161] = 0; - _$jscoverage['middleware/staticCache.js'][162] = 0; - _$jscoverage['middleware/staticCache.js'][164] = 0; - _$jscoverage['middleware/staticCache.js'][165] = 0; - _$jscoverage['middleware/staticCache.js'][166] = 0; - _$jscoverage['middleware/staticCache.js'][167] = 0; - _$jscoverage['middleware/staticCache.js'][169] = 0; - _$jscoverage['middleware/staticCache.js'][171] = 0; - _$jscoverage['middleware/staticCache.js'][172] = 0; - _$jscoverage['middleware/staticCache.js'][173] = 0; - _$jscoverage['middleware/staticCache.js'][174] = 0; - _$jscoverage['middleware/staticCache.js'][175] = 0; - _$jscoverage['middleware/staticCache.js'][178] = 0; - _$jscoverage['middleware/staticCache.js'][181] = 0; - _$jscoverage['middleware/staticCache.js'][183] = 0; - _$jscoverage['middleware/staticCache.js'][186] = 0; - _$jscoverage['middleware/staticCache.js'][187] = 0; - _$jscoverage['middleware/staticCache.js'][200] = 0; - _$jscoverage['middleware/staticCache.js'][201] = 0; - _$jscoverage['middleware/staticCache.js'][206] = 0; - _$jscoverage['middleware/staticCache.js'][208] = 0; - _$jscoverage['middleware/staticCache.js'][210] = 0; - _$jscoverage['middleware/staticCache.js'][212] = 0; - _$jscoverage['middleware/staticCache.js'][214] = 0; - _$jscoverage['middleware/staticCache.js'][216] = 0; - _$jscoverage['middleware/staticCache.js'][229] = 0; - _$jscoverage['middleware/staticCache.js'][230] = 0; -} -_$jscoverage['middleware/staticCache.js'][12]++; -var utils = require("../utils"), Cache = require("../cache"), fresh = require("fresh"); -_$jscoverage['middleware/staticCache.js'][51]++; -module.exports = (function staticCache(options) { - _$jscoverage['middleware/staticCache.js'][52]++; - var options = options || {}, cache = new Cache(options.maxObjects || 128), maxlen = options.maxLength || 262144; - _$jscoverage['middleware/staticCache.js'][56]++; - console.warn("connect.staticCache() is deprecated and will be removed in 3.0"); - _$jscoverage['middleware/staticCache.js'][57]++; - console.warn("use varnish or similar reverse proxy caches."); - _$jscoverage['middleware/staticCache.js'][59]++; - return (function staticCache(req, res, next) { - _$jscoverage['middleware/staticCache.js'][60]++; - var key = cacheKey(req), ranges = req.headers.range, hasCookies = req.headers.cookie, hit = cache.get(key); - _$jscoverage['middleware/staticCache.js'][68]++; - req.on("static", (function (stream) { - _$jscoverage['middleware/staticCache.js'][69]++; - var headers = res._headers, cc = utils.parseCacheControl(headers["cache-control"] || ""), contentLength = headers["content-length"], hit; - _$jscoverage['middleware/staticCache.js'][75]++; - if (headers["set-cookie"]) { - _$jscoverage['middleware/staticCache.js'][75]++; - return hasCookies = true; - } - _$jscoverage['middleware/staticCache.js'][78]++; - if (hasCookies) { - _$jscoverage['middleware/staticCache.js'][78]++; - return; - } - _$jscoverage['middleware/staticCache.js'][81]++; - if (! contentLength || contentLength > maxlen) { - _$jscoverage['middleware/staticCache.js'][81]++; - return; - } - _$jscoverage['middleware/staticCache.js'][84]++; - if (headers["content-range"]) { - _$jscoverage['middleware/staticCache.js'][84]++; - return; - } - _$jscoverage['middleware/staticCache.js'][88]++; - if (cc["no-cache"] || cc["no-store"] || cc["private"] || cc["must-revalidate"]) { - _$jscoverage['middleware/staticCache.js'][91]++; - return; - } - _$jscoverage['middleware/staticCache.js'][94]++; - if (hit = cache.get(key)) { - _$jscoverage['middleware/staticCache.js'][95]++; - if (headers.etag == hit[0].etag) { - _$jscoverage['middleware/staticCache.js'][96]++; - hit[0].date = new Date(); - _$jscoverage['middleware/staticCache.js'][97]++; - return; - } - else { - _$jscoverage['middleware/staticCache.js'][99]++; - cache.remove(key); - } - } - _$jscoverage['middleware/staticCache.js'][104]++; - if (null == stream) { - _$jscoverage['middleware/staticCache.js'][104]++; - return; - } - _$jscoverage['middleware/staticCache.js'][107]++; - var arr = []; - _$jscoverage['middleware/staticCache.js'][110]++; - stream.on("data", (function (chunk) { - _$jscoverage['middleware/staticCache.js'][111]++; - arr.push(chunk); -})); - _$jscoverage['middleware/staticCache.js'][115]++; - stream.on("end", (function () { - _$jscoverage['middleware/staticCache.js'][116]++; - var cacheEntry = cache.add(key); - _$jscoverage['middleware/staticCache.js'][117]++; - delete headers["x-cache"]; - _$jscoverage['middleware/staticCache.js'][118]++; - cacheEntry.push(200); - _$jscoverage['middleware/staticCache.js'][119]++; - cacheEntry.push(headers); - _$jscoverage['middleware/staticCache.js'][120]++; - cacheEntry.push.apply(cacheEntry, arr); -})); -})); - _$jscoverage['middleware/staticCache.js'][124]++; - if (req.method == "GET" || req.method == "HEAD") { - _$jscoverage['middleware/staticCache.js'][125]++; - if (ranges) { - _$jscoverage['middleware/staticCache.js'][126]++; - next(); - } - else { - _$jscoverage['middleware/staticCache.js'][127]++; - if (! hasCookies && hit && ! mustRevalidate(req, hit)) { - _$jscoverage['middleware/staticCache.js'][128]++; - res.setHeader("X-Cache", "HIT"); - _$jscoverage['middleware/staticCache.js'][129]++; - respondFromCache(req, res, hit); - } - else { - _$jscoverage['middleware/staticCache.js'][131]++; - res.setHeader("X-Cache", "MISS"); - _$jscoverage['middleware/staticCache.js'][132]++; - next(); - } - } - } - else { - _$jscoverage['middleware/staticCache.js'][135]++; - next(); - } -}); -}); -_$jscoverage['middleware/staticCache.js'][151]++; -function respondFromCache(req, res, cacheEntry) { - _$jscoverage['middleware/staticCache.js'][152]++; - var status = cacheEntry[0], headers = utils.merge({}, cacheEntry[1]), content = cacheEntry.slice(2); - _$jscoverage['middleware/staticCache.js'][156]++; - headers.age = (new Date() - new Date(headers.date)) / 1000 || 0; - _$jscoverage['middleware/staticCache.js'][158]++; - switch (req.method) { - case "HEAD": - _$jscoverage['middleware/staticCache.js'][160]++; - res.writeHead(status, headers); - _$jscoverage['middleware/staticCache.js'][161]++; - res.end(); - _$jscoverage['middleware/staticCache.js'][162]++; - break; - case "GET": - _$jscoverage['middleware/staticCache.js'][164]++; - if (utils.conditionalGET(req) && fresh(req.headers, headers)) { - _$jscoverage['middleware/staticCache.js'][165]++; - headers["content-length"] = 0; - _$jscoverage['middleware/staticCache.js'][166]++; - res.writeHead(304, headers); - _$jscoverage['middleware/staticCache.js'][167]++; - res.end(); - } - else { - _$jscoverage['middleware/staticCache.js'][169]++; - res.writeHead(status, headers); - _$jscoverage['middleware/staticCache.js'][171]++; - function write() { - _$jscoverage['middleware/staticCache.js'][172]++; - while (content.length) { - _$jscoverage['middleware/staticCache.js'][173]++; - if (false === res.write(content.shift())) { - _$jscoverage['middleware/staticCache.js'][174]++; - res.once("drain", write); - _$jscoverage['middleware/staticCache.js'][175]++; - return; - } -} - _$jscoverage['middleware/staticCache.js'][178]++; - res.end(); -} - _$jscoverage['middleware/staticCache.js'][181]++; - write(); - } - _$jscoverage['middleware/staticCache.js'][183]++; - break; - default: - _$jscoverage['middleware/staticCache.js'][186]++; - res.writeHead(500, ""); - _$jscoverage['middleware/staticCache.js'][187]++; - res.end(); - } -} -_$jscoverage['middleware/staticCache.js'][200]++; -function mustRevalidate(req, cacheEntry) { - _$jscoverage['middleware/staticCache.js'][201]++; - var cacheHeaders = cacheEntry[1], reqCC = utils.parseCacheControl(req.headers["cache-control"] || ""), cacheCC = utils.parseCacheControl(cacheHeaders["cache-control"] || ""), cacheAge = (new Date() - new Date(cacheHeaders.date)) / 1000 || 0; - _$jscoverage['middleware/staticCache.js'][206]++; - if (cacheCC["no-cache"] || cacheCC["must-revalidate"] || cacheCC["proxy-revalidate"]) { - _$jscoverage['middleware/staticCache.js'][208]++; - return true; - } - _$jscoverage['middleware/staticCache.js'][210]++; - if (reqCC["no-cache"]) { - _$jscoverage['middleware/staticCache.js'][210]++; - return true; - } - _$jscoverage['middleware/staticCache.js'][212]++; - if (null != reqCC["max-age"]) { - _$jscoverage['middleware/staticCache.js'][212]++; - return reqCC["max-age"] < cacheAge; - } - _$jscoverage['middleware/staticCache.js'][214]++; - if (null != cacheCC["max-age"]) { - _$jscoverage['middleware/staticCache.js'][214]++; - return cacheCC["max-age"] < cacheAge; - } - _$jscoverage['middleware/staticCache.js'][216]++; - return false; -} -_$jscoverage['middleware/staticCache.js'][229]++; -function cacheKey(req) { - _$jscoverage['middleware/staticCache.js'][230]++; - return utils.parseUrl(req).path; -} -_$jscoverage['middleware/staticCache.js'].source = ["","/*!"," * Connect - staticCache"," * Copyright(c) 2011 Sencha Inc."," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils')"," , Cache = require('../cache')"," , fresh = require('fresh');","","/**"," * Static cache:"," *"," * Enables a memory cache layer on top of"," * the `static()` middleware, serving popular"," * static files."," *"," * By default a maximum of 128 objects are"," * held in cache, with a max of 256k each,"," * totalling ~32mb."," *"," * A Least-Recently-Used (LRU) cache algo"," * is implemented through the `Cache` object,"," * simply rotating cache objects as they are"," * hit. This means that increasingly popular"," * objects maintain their positions while"," * others get shoved out of the stack and"," * garbage collected."," *"," * Benchmarks:"," *"," * static(): 2700 rps"," * node-static: 5300 rps"," * static() + staticCache(): 7500 rps"," *"," * Options:"," *"," * - `maxObjects` max cache objects [128]"," * - `maxLength` max cache object length 256kb"," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","module.exports = function staticCache(options){"," var options = options || {}"," , cache = new Cache(options.maxObjects || 128)"," , maxlen = options.maxLength || 1024 * 256;",""," console.warn('connect.staticCache() is deprecated and will be removed in 3.0');"," console.warn('use varnish or similar reverse proxy caches.');",""," return function staticCache(req, res, next){"," var key = cacheKey(req)"," , ranges = req.headers.range"," , hasCookies = req.headers.cookie"," , hit = cache.get(key);",""," // cache static"," // TODO: change from staticCache() -> cache()"," // and make this work for any request"," req.on('static', function(stream){"," var headers = res._headers"," , cc = utils.parseCacheControl(headers['cache-control'] || '')"," , contentLength = headers['content-length']"," , hit;",""," // dont cache set-cookie responses"," if (headers['set-cookie']) return hasCookies = true;",""," // dont cache when cookies are present"," if (hasCookies) return;",""," // ignore larger files"," if (!contentLength || contentLength > maxlen) return;",""," // don't cache partial files"," if (headers['content-range']) return;",""," // dont cache items we shouldn't be"," // TODO: real support for must-revalidate / no-cache"," if ( cc['no-cache']"," || cc['no-store']"," || cc['private']"," || cc['must-revalidate']) return;",""," // if already in cache then validate"," if (hit = cache.get(key)){"," if (headers.etag == hit[0].etag) {"," hit[0].date = new Date;"," return;"," } else {"," cache.remove(key);"," }"," }",""," // validation notifiactions don't contain a steam"," if (null == stream) return;",""," // add the cache object"," var arr = [];",""," // store the chunks"," stream.on('data', function(chunk){"," arr.push(chunk);"," });",""," // flag it as complete"," stream.on('end', function(){"," var cacheEntry = cache.add(key);"," delete headers['x-cache']; // Clean up (TODO: others)"," cacheEntry.push(200);"," cacheEntry.push(headers);"," cacheEntry.push.apply(cacheEntry, arr);"," });"," });",""," if (req.method == 'GET' || req.method == 'HEAD') {"," if (ranges) {"," next();"," } else if (!hasCookies && hit && !mustRevalidate(req, hit)) {"," res.setHeader('X-Cache', 'HIT');"," respondFromCache(req, res, hit);"," } else {"," res.setHeader('X-Cache', 'MISS');"," next();"," }"," } else {"," next();"," }"," }","};","","/**"," * Respond with the provided cached value."," * TODO: Assume 200 code, that's iffy."," *"," * @param {Object} req"," * @param {Object} res"," * @param {Object} cacheEntry"," * @return {String}"," * @api private"," */","","function respondFromCache(req, res, cacheEntry) {"," var status = cacheEntry[0]"," , headers = utils.merge({}, cacheEntry[1])"," , content = cacheEntry.slice(2);",""," headers.age = (new Date - new Date(headers.date)) / 1000 || 0;",""," switch (req.method) {"," case 'HEAD':"," res.writeHead(status, headers);"," res.end();"," break;"," case 'GET':"," if (utils.conditionalGET(req) && fresh(req.headers, headers)) {"," headers['content-length'] = 0;"," res.writeHead(304, headers);"," res.end();"," } else {"," res.writeHead(status, headers);",""," function write() {"," while (content.length) {"," if (false === res.write(content.shift())) {"," res.once('drain', write);"," return;"," }"," }"," res.end();"," }",""," write();"," }"," break;"," default:"," // This should never happen."," res.writeHead(500, '');"," res.end();"," }","}","","/**"," * Determine whether or not a cached value must be revalidated."," *"," * @param {Object} req"," * @param {Object} cacheEntry"," * @return {String}"," * @api private"," */","","function mustRevalidate(req, cacheEntry) {"," var cacheHeaders = cacheEntry[1]"," , reqCC = utils.parseCacheControl(req.headers['cache-control'] || '')"," , cacheCC = utils.parseCacheControl(cacheHeaders['cache-control'] || '')"," , cacheAge = (new Date - new Date(cacheHeaders.date)) / 1000 || 0;",""," if ( cacheCC['no-cache']"," || cacheCC['must-revalidate']"," || cacheCC['proxy-revalidate']) return true;",""," if (reqCC['no-cache']) return true;",""," if (null != reqCC['max-age']) return reqCC['max-age'] < cacheAge;",""," if (null != cacheCC['max-age']) return cacheCC['max-age'] < cacheAge;",""," return false;","}","","/**"," * The key to use in the cache. For now, this is the URL path and query."," *"," * 'http://example.com?key=value' -> '/?key=value'"," *"," * @param {Object} req"," * @return {String}"," * @api private"," */","","function cacheKey(req) {"," return utils.parseUrl(req).path;","}"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/timeout.js b/node_modules/express/node_modules/connect/lib-cov/middleware/timeout.js deleted file mode 100644 index de0e573..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/timeout.js +++ /dev/null @@ -1,66 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/timeout.js']) { - _$jscoverage['middleware/timeout.js'] = []; - _$jscoverage['middleware/timeout.js'][12] = 0; - _$jscoverage['middleware/timeout.js'][30] = 0; - _$jscoverage['middleware/timeout.js'][31] = 0; - _$jscoverage['middleware/timeout.js'][33] = 0; - _$jscoverage['middleware/timeout.js'][34] = 0; - _$jscoverage['middleware/timeout.js'][35] = 0; - _$jscoverage['middleware/timeout.js'][38] = 0; - _$jscoverage['middleware/timeout.js'][39] = 0; - _$jscoverage['middleware/timeout.js'][40] = 0; - _$jscoverage['middleware/timeout.js'][41] = 0; - _$jscoverage['middleware/timeout.js'][42] = 0; - _$jscoverage['middleware/timeout.js'][43] = 0; - _$jscoverage['middleware/timeout.js'][46] = 0; - _$jscoverage['middleware/timeout.js'][47] = 0; - _$jscoverage['middleware/timeout.js'][50] = 0; - _$jscoverage['middleware/timeout.js'][51] = 0; - _$jscoverage['middleware/timeout.js'][54] = 0; -} -_$jscoverage['middleware/timeout.js'][12]++; -var debug = require("debug")("connect:timeout"); -_$jscoverage['middleware/timeout.js'][30]++; -module.exports = (function timeout(ms) { - _$jscoverage['middleware/timeout.js'][31]++; - ms = ms || 5000; - _$jscoverage['middleware/timeout.js'][33]++; - return (function (req, res, next) { - _$jscoverage['middleware/timeout.js'][34]++; - var id = setTimeout((function () { - _$jscoverage['middleware/timeout.js'][35]++; - req.emit("timeout", ms); -}), ms); - _$jscoverage['middleware/timeout.js'][38]++; - req.on("timeout", (function () { - _$jscoverage['middleware/timeout.js'][39]++; - if (req.headerSent) { - _$jscoverage['middleware/timeout.js'][39]++; - return debug("response started, cannot timeout"); - } - _$jscoverage['middleware/timeout.js'][40]++; - var err = new Error("Request timeout"); - _$jscoverage['middleware/timeout.js'][41]++; - err.timeout = ms; - _$jscoverage['middleware/timeout.js'][42]++; - err.status = 408; - _$jscoverage['middleware/timeout.js'][43]++; - next(err); -})); - _$jscoverage['middleware/timeout.js'][46]++; - req.clearTimeout = (function () { - _$jscoverage['middleware/timeout.js'][47]++; - clearTimeout(id); -}); - _$jscoverage['middleware/timeout.js'][50]++; - res.on("header", (function () { - _$jscoverage['middleware/timeout.js'][51]++; - clearTimeout(id); -})); - _$jscoverage['middleware/timeout.js'][54]++; - next(); -}); -}); -_$jscoverage['middleware/timeout.js'].source = ["","/*!"," * Connect - timeout"," * Ported from https://github.com/LearnBoost/connect-timeout"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var debug = require('debug')('connect:timeout');","","/**"," * Timeout:"," *"," * Times out the request in `ms`, defaulting to `5000`. The"," * method `req.clearTimeout()` is added to revert this behaviour"," * programmatically within your application's middleware, routes, etc."," *"," * The timeout error is passed to `next()` so that you may customize"," * the response behaviour. This error has the `.timeout` property as"," * well as `.status == 408`."," *"," * @param {Number} ms"," * @return {Function}"," * @api public"," */","","module.exports = function timeout(ms) {"," ms = ms || 5000;",""," return function(req, res, next) {"," var id = setTimeout(function(){"," req.emit('timeout', ms);"," }, ms);",""," req.on('timeout', function(){"," if (req.headerSent) return debug('response started, cannot timeout');"," var err = new Error('Request timeout');"," err.timeout = ms;"," err.status = 408;"," next(err);"," });",""," req.clearTimeout = function(){"," clearTimeout(id);"," };",""," res.on('header', function(){"," clearTimeout(id);"," });",""," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/urlencoded.js b/node_modules/express/node_modules/connect/lib-cov/middleware/urlencoded.js deleted file mode 100644 index c8dbcef..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/urlencoded.js +++ /dev/null @@ -1,98 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/urlencoded.js']) { - _$jscoverage['middleware/urlencoded.js'] = []; - _$jscoverage['middleware/urlencoded.js'][13] = 0; - _$jscoverage['middleware/urlencoded.js'][21] = 0; - _$jscoverage['middleware/urlencoded.js'][22] = 0; - _$jscoverage['middleware/urlencoded.js'][40] = 0; - _$jscoverage['middleware/urlencoded.js'][41] = 0; - _$jscoverage['middleware/urlencoded.js'][43] = 0; - _$jscoverage['middleware/urlencoded.js'][47] = 0; - _$jscoverage['middleware/urlencoded.js'][48] = 0; - _$jscoverage['middleware/urlencoded.js'][49] = 0; - _$jscoverage['middleware/urlencoded.js'][51] = 0; - _$jscoverage['middleware/urlencoded.js'][54] = 0; - _$jscoverage['middleware/urlencoded.js'][57] = 0; - _$jscoverage['middleware/urlencoded.js'][60] = 0; - _$jscoverage['middleware/urlencoded.js'][61] = 0; - _$jscoverage['middleware/urlencoded.js'][62] = 0; - _$jscoverage['middleware/urlencoded.js'][63] = 0; - _$jscoverage['middleware/urlencoded.js'][64] = 0; - _$jscoverage['middleware/urlencoded.js'][65] = 0; - _$jscoverage['middleware/urlencoded.js'][66] = 0; - _$jscoverage['middleware/urlencoded.js'][67] = 0; - _$jscoverage['middleware/urlencoded.js'][70] = 0; - _$jscoverage['middleware/urlencoded.js'][72] = 0; - _$jscoverage['middleware/urlencoded.js'][73] = 0; -} -_$jscoverage['middleware/urlencoded.js'][13]++; -var utils = require("../utils"), _limit = require("./limit"), qs = require("qs"); -_$jscoverage['middleware/urlencoded.js'][21]++; -function noop(req, res, next) { - _$jscoverage['middleware/urlencoded.js'][22]++; - next(); -} -_$jscoverage['middleware/urlencoded.js'][40]++; -exports = module.exports = (function (options) { - _$jscoverage['middleware/urlencoded.js'][41]++; - options = options || {}; - _$jscoverage['middleware/urlencoded.js'][43]++; - var limit = options.limit? _limit(options.limit): noop; - _$jscoverage['middleware/urlencoded.js'][47]++; - return (function urlencoded(req, res, next) { - _$jscoverage['middleware/urlencoded.js'][48]++; - if (req._body) { - _$jscoverage['middleware/urlencoded.js'][48]++; - return next(); - } - _$jscoverage['middleware/urlencoded.js'][49]++; - req.body = req.body || {}; - _$jscoverage['middleware/urlencoded.js'][51]++; - if (! utils.hasBody(req)) { - _$jscoverage['middleware/urlencoded.js'][51]++; - return next(); - } - _$jscoverage['middleware/urlencoded.js'][54]++; - if ("application/x-www-form-urlencoded" != utils.mime(req)) { - _$jscoverage['middleware/urlencoded.js'][54]++; - return next(); - } - _$jscoverage['middleware/urlencoded.js'][57]++; - req._body = true; - _$jscoverage['middleware/urlencoded.js'][60]++; - limit(req, res, (function (err) { - _$jscoverage['middleware/urlencoded.js'][61]++; - if (err) { - _$jscoverage['middleware/urlencoded.js'][61]++; - return next(err); - } - _$jscoverage['middleware/urlencoded.js'][62]++; - var buf = ""; - _$jscoverage['middleware/urlencoded.js'][63]++; - req.setEncoding("utf8"); - _$jscoverage['middleware/urlencoded.js'][64]++; - req.on("data", (function (chunk) { - _$jscoverage['middleware/urlencoded.js'][64]++; - buf += chunk; -})); - _$jscoverage['middleware/urlencoded.js'][65]++; - req.on("end", (function () { - _$jscoverage['middleware/urlencoded.js'][66]++; - try { - _$jscoverage['middleware/urlencoded.js'][67]++; - req.body = buf.length? qs.parse(buf, options): {}; - _$jscoverage['middleware/urlencoded.js'][70]++; - next(); - } - catch (err) { - _$jscoverage['middleware/urlencoded.js'][72]++; - err.body = buf; - _$jscoverage['middleware/urlencoded.js'][73]++; - next(err); - } -})); -})); -}); -}); -_$jscoverage['middleware/urlencoded.js'].source = ["","/*!"," * Connect - urlencoded"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils')"," , _limit = require('./limit')"," , qs = require('qs');","","/**"," * noop middleware."," */","","function noop(req, res, next) {"," next();","}","","/**"," * Urlencoded:"," * "," * Parse x-ww-form-urlencoded request bodies,"," * providing the parsed object as `req.body`."," *"," * Options:"," *"," * - `limit` byte limit disabled by default"," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function(options){"," options = options || {};",""," var limit = options.limit"," ? _limit(options.limit)"," : noop;",""," return function urlencoded(req, res, next) {"," if (req._body) return next();"," req.body = req.body || {};",""," if (!utils.hasBody(req)) return next();",""," // check Content-Type"," if ('application/x-www-form-urlencoded' != utils.mime(req)) return next();",""," // flag as parsed"," req._body = true;",""," // parse"," limit(req, res, function(err){"," if (err) return next(err);"," var buf = '';"," req.setEncoding('utf8');"," req.on('data', function(chunk){ buf += chunk });"," req.on('end', function(){"," try {"," req.body = buf.length"," ? qs.parse(buf, options)"," : {};"," next();"," } catch (err){"," err.body = buf;"," next(err);"," }"," });"," });"," }","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/vhost.js b/node_modules/express/node_modules/connect/lib-cov/middleware/vhost.js deleted file mode 100644 index b069e5c..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/vhost.js +++ /dev/null @@ -1,59 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/vhost.js']) { - _$jscoverage['middleware/vhost.js'] = []; - _$jscoverage['middleware/vhost.js'][28] = 0; - _$jscoverage['middleware/vhost.js'][29] = 0; - _$jscoverage['middleware/vhost.js'][30] = 0; - _$jscoverage['middleware/vhost.js'][31] = 0; - _$jscoverage['middleware/vhost.js'][32] = 0; - _$jscoverage['middleware/vhost.js'][33] = 0; - _$jscoverage['middleware/vhost.js'][34] = 0; - _$jscoverage['middleware/vhost.js'][35] = 0; - _$jscoverage['middleware/vhost.js'][36] = 0; - _$jscoverage['middleware/vhost.js'][37] = 0; - _$jscoverage['middleware/vhost.js'][38] = 0; -} -_$jscoverage['middleware/vhost.js'][28]++; -module.exports = (function vhost(hostname, server) { - _$jscoverage['middleware/vhost.js'][29]++; - if (! hostname) { - _$jscoverage['middleware/vhost.js'][29]++; - throw new Error("vhost hostname required"); - } - _$jscoverage['middleware/vhost.js'][30]++; - if (! server) { - _$jscoverage['middleware/vhost.js'][30]++; - throw new Error("vhost server required"); - } - _$jscoverage['middleware/vhost.js'][31]++; - var regexp = new RegExp("^" + hostname.replace(/[*]/g, "(.*?)") + "$", "i"); - _$jscoverage['middleware/vhost.js'][32]++; - if (server.onvhost) { - _$jscoverage['middleware/vhost.js'][32]++; - server.onvhost(hostname); - } - _$jscoverage['middleware/vhost.js'][33]++; - return (function vhost(req, res, next) { - _$jscoverage['middleware/vhost.js'][34]++; - if (! req.headers.host) { - _$jscoverage['middleware/vhost.js'][34]++; - return next(); - } - _$jscoverage['middleware/vhost.js'][35]++; - var host = req.headers.host.split(":")[0]; - _$jscoverage['middleware/vhost.js'][36]++; - if (! regexp.test(host)) { - _$jscoverage['middleware/vhost.js'][36]++; - return next(); - } - _$jscoverage['middleware/vhost.js'][37]++; - if ("function" == typeof server) { - _$jscoverage['middleware/vhost.js'][37]++; - return server(req, res, next); - } - _$jscoverage['middleware/vhost.js'][38]++; - server.emit("request", req, res); -}); -}); -_$jscoverage['middleware/vhost.js'].source = ["","/*!"," * Connect - vhost"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Vhost:"," * "," * Setup vhost for the given `hostname` and `server`."," *"," * connect()"," * .use(connect.vhost('foo.com', fooApp))"," * .use(connect.vhost('bar.com', barApp))"," * .use(connect.vhost('*.com', mainApp))"," *"," * The `server` may be a Connect server or"," * a regular Node `http.Server`. "," *"," * @param {String} hostname"," * @param {Server} server"," * @return {Function}"," * @api public"," */","","module.exports = function vhost(hostname, server){"," if (!hostname) throw new Error('vhost hostname required');"," if (!server) throw new Error('vhost server required');"," var regexp = new RegExp('^' + hostname.replace(/[*]/g, '(.*?)') + '$', 'i');"," if (server.onvhost) server.onvhost(hostname);"," return function vhost(req, res, next){"," if (!req.headers.host) return next();"," var host = req.headers.host.split(':')[0];"," if (!regexp.test(host)) return next();"," if ('function' == typeof server) return server(req, res, next);"," server.emit('request', req, res);"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/patch.js b/node_modules/express/node_modules/connect/lib-cov/patch.js deleted file mode 100644 index 7d59643..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/patch.js +++ /dev/null @@ -1,85 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['patch.js']) { - _$jscoverage['patch.js'] = []; - _$jscoverage['patch.js'][12] = 0; - _$jscoverage['patch.js'][20] = 0; - _$jscoverage['patch.js'][30] = 0; - _$jscoverage['patch.js'][31] = 0; - _$jscoverage['patch.js'][43] = 0; - _$jscoverage['patch.js'][44] = 0; - _$jscoverage['patch.js'][48] = 0; - _$jscoverage['patch.js'][49] = 0; - _$jscoverage['patch.js'][50] = 0; - _$jscoverage['patch.js'][55] = 0; - _$jscoverage['patch.js'][56] = 0; - _$jscoverage['patch.js'][59] = 0; - _$jscoverage['patch.js'][66] = 0; - _$jscoverage['patch.js'][67] = 0; - _$jscoverage['patch.js'][68] = 0; - _$jscoverage['patch.js'][69] = 0; - _$jscoverage['patch.js'][72] = 0; - _$jscoverage['patch.js'][73] = 0; - _$jscoverage['patch.js'][74] = 0; - _$jscoverage['patch.js'][75] = 0; - _$jscoverage['patch.js'][78] = 0; -} -_$jscoverage['patch.js'][12]++; -var http = require("http"), res = http.ServerResponse.prototype, setHeader = res.setHeader, _renderHeaders = res._renderHeaders, writeHead = res.writeHead; -_$jscoverage['patch.js'][20]++; -if (! res._hasConnectPatch) { - _$jscoverage['patch.js'][30]++; - res.__defineGetter__("headerSent", (function () { - _$jscoverage['patch.js'][31]++; - return this._header; -})); - _$jscoverage['patch.js'][43]++; - res.setHeader = (function (field, val) { - _$jscoverage['patch.js'][44]++; - var key = field.toLowerCase(), prev; - _$jscoverage['patch.js'][48]++; - if (this._headers && "set-cookie" == key) { - _$jscoverage['patch.js'][49]++; - if (prev = this.getHeader(field)) { - _$jscoverage['patch.js'][50]++; - val = Array.isArray(prev)? prev.concat(val): [prev, val]; - } - } - else { - _$jscoverage['patch.js'][55]++; - if ("content-type" == key && this.charset) { - _$jscoverage['patch.js'][56]++; - val += "; charset=" + this.charset; - } - } - _$jscoverage['patch.js'][59]++; - return setHeader.call(this, field, val); -}); - _$jscoverage['patch.js'][66]++; - res._renderHeaders = (function () { - _$jscoverage['patch.js'][67]++; - if (! this._emittedHeader) { - _$jscoverage['patch.js'][67]++; - this.emit("header"); - } - _$jscoverage['patch.js'][68]++; - this._emittedHeader = true; - _$jscoverage['patch.js'][69]++; - return _renderHeaders.call(this); -}); - _$jscoverage['patch.js'][72]++; - res.writeHead = (function () { - _$jscoverage['patch.js'][73]++; - if (! this._emittedHeader) { - _$jscoverage['patch.js'][73]++; - this.emit("header"); - } - _$jscoverage['patch.js'][74]++; - this._emittedHeader = true; - _$jscoverage['patch.js'][75]++; - return writeHead.apply(this, arguments); -}); - _$jscoverage['patch.js'][78]++; - res._hasConnectPatch = true; -} -_$jscoverage['patch.js'].source = ["","/*!"," * Connect"," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var http = require('http')"," , res = http.ServerResponse.prototype"," , setHeader = res.setHeader"," , _renderHeaders = res._renderHeaders"," , writeHead = res.writeHead;","","// apply only once","","if (!res._hasConnectPatch) {",""," /**"," * Provide a public \"header sent\" flag"," * until node does."," *"," * @return {Boolean}"," * @api public"," */",""," res.__defineGetter__('headerSent', function(){"," return this._header;"," });",""," /**"," * Set header `field` to `val`, special-casing"," * the `Set-Cookie` field for multiple support."," *"," * @param {String} field"," * @param {String} val"," * @api public"," */",""," res.setHeader = function(field, val){"," var key = field.toLowerCase()"," , prev;",""," // special-case Set-Cookie"," if (this._headers && 'set-cookie' == key) {"," if (prev = this.getHeader(field)) {"," val = Array.isArray(prev)"," ? prev.concat(val)"," : [prev, val];"," }"," // charset"," } else if ('content-type' == key && this.charset) {"," val += '; charset=' + this.charset;"," }",""," return setHeader.call(this, field, val);"," };",""," /**"," * Proxy to emit \"header\" event."," */",""," res._renderHeaders = function(){"," if (!this._emittedHeader) this.emit('header');"," this._emittedHeader = true;"," return _renderHeaders.call(this);"," };",""," res.writeHead = function(){"," if (!this._emittedHeader) this.emit('header');"," this._emittedHeader = true;"," return writeHead.apply(this, arguments);"," };",""," res._hasConnectPatch = true;","}"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/proto.js b/node_modules/express/node_modules/connect/lib-cov/proto.js deleted file mode 100644 index e8ecb99..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/proto.js +++ /dev/null @@ -1,285 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['proto.js']) { - _$jscoverage['proto.js'] = []; - _$jscoverage['proto.js'][13] = 0; - _$jscoverage['proto.js'][19] = 0; - _$jscoverage['proto.js'][23] = 0; - _$jscoverage['proto.js'][62] = 0; - _$jscoverage['proto.js'][64] = 0; - _$jscoverage['proto.js'][65] = 0; - _$jscoverage['proto.js'][66] = 0; - _$jscoverage['proto.js'][70] = 0; - _$jscoverage['proto.js'][71] = 0; - _$jscoverage['proto.js'][72] = 0; - _$jscoverage['proto.js'][73] = 0; - _$jscoverage['proto.js'][74] = 0; - _$jscoverage['proto.js'][79] = 0; - _$jscoverage['proto.js'][80] = 0; - _$jscoverage['proto.js'][84] = 0; - _$jscoverage['proto.js'][85] = 0; - _$jscoverage['proto.js'][89] = 0; - _$jscoverage['proto.js'][90] = 0; - _$jscoverage['proto.js'][92] = 0; - _$jscoverage['proto.js'][102] = 0; - _$jscoverage['proto.js'][103] = 0; - _$jscoverage['proto.js'][109] = 0; - _$jscoverage['proto.js'][110] = 0; - _$jscoverage['proto.js'][112] = 0; - _$jscoverage['proto.js'][113] = 0; - _$jscoverage['proto.js'][114] = 0; - _$jscoverage['proto.js'][117] = 0; - _$jscoverage['proto.js'][118] = 0; - _$jscoverage['proto.js'][119] = 0; - _$jscoverage['proto.js'][122] = 0; - _$jscoverage['proto.js'][125] = 0; - _$jscoverage['proto.js'][127] = 0; - _$jscoverage['proto.js'][130] = 0; - _$jscoverage['proto.js'][132] = 0; - _$jscoverage['proto.js'][133] = 0; - _$jscoverage['proto.js'][136] = 0; - _$jscoverage['proto.js'][139] = 0; - _$jscoverage['proto.js'][144] = 0; - _$jscoverage['proto.js'][145] = 0; - _$jscoverage['proto.js'][146] = 0; - _$jscoverage['proto.js'][147] = 0; - _$jscoverage['proto.js'][148] = 0; - _$jscoverage['proto.js'][149] = 0; - _$jscoverage['proto.js'][151] = 0; - _$jscoverage['proto.js'][152] = 0; - _$jscoverage['proto.js'][153] = 0; - _$jscoverage['proto.js'][154] = 0; - _$jscoverage['proto.js'][155] = 0; - _$jscoverage['proto.js'][157] = 0; - _$jscoverage['proto.js'][160] = 0; - _$jscoverage['proto.js'][161] = 0; - _$jscoverage['proto.js'][162] = 0; - _$jscoverage['proto.js'][165] = 0; - _$jscoverage['proto.js'][167] = 0; - _$jscoverage['proto.js'][168] = 0; - _$jscoverage['proto.js'][172] = 0; - _$jscoverage['proto.js'][173] = 0; - _$jscoverage['proto.js'][176] = 0; - _$jscoverage['proto.js'][177] = 0; - _$jscoverage['proto.js'][178] = 0; - _$jscoverage['proto.js'][181] = 0; - _$jscoverage['proto.js'][182] = 0; - _$jscoverage['proto.js'][183] = 0; - _$jscoverage['proto.js'][184] = 0; - _$jscoverage['proto.js'][185] = 0; - _$jscoverage['proto.js'][187] = 0; - _$jscoverage['proto.js'][189] = 0; - _$jscoverage['proto.js'][190] = 0; - _$jscoverage['proto.js'][192] = 0; - _$jscoverage['proto.js'][195] = 0; - _$jscoverage['proto.js'][198] = 0; - _$jscoverage['proto.js'][227] = 0; - _$jscoverage['proto.js'][228] = 0; - _$jscoverage['proto.js'][229] = 0; -} -_$jscoverage['proto.js'][13]++; -var http = require("http"), utils = require("./utils"), debug = require("debug")("connect:dispatcher"); -_$jscoverage['proto.js'][19]++; -var app = module.exports = {}; -_$jscoverage['proto.js'][23]++; -var env = process.env.NODE_ENV || "development"; -_$jscoverage['proto.js'][62]++; -app.use = (function (route, fn) { - _$jscoverage['proto.js'][64]++; - if ("string" != typeof route) { - _$jscoverage['proto.js'][65]++; - fn = route; - _$jscoverage['proto.js'][66]++; - route = "/"; - } - _$jscoverage['proto.js'][70]++; - if ("function" == typeof fn.handle) { - _$jscoverage['proto.js'][71]++; - var server = fn; - _$jscoverage['proto.js'][72]++; - fn.route = route; - _$jscoverage['proto.js'][73]++; - fn = (function (req, res, next) { - _$jscoverage['proto.js'][74]++; - server.handle(req, res, next); -}); - } - _$jscoverage['proto.js'][79]++; - if (fn instanceof http.Server) { - _$jscoverage['proto.js'][80]++; - fn = fn.listeners("request")[0]; - } - _$jscoverage['proto.js'][84]++; - if ("/" == route[route.length - 1]) { - _$jscoverage['proto.js'][85]++; - route = route.slice(0, -1); - } - _$jscoverage['proto.js'][89]++; - debug("use %s %s", route || "/", fn.name || "anonymous"); - _$jscoverage['proto.js'][90]++; - this.stack.push({route: route, handle: fn}); - _$jscoverage['proto.js'][92]++; - return this; -}); -_$jscoverage['proto.js'][102]++; -app.handle = (function (req, res, out) { - _$jscoverage['proto.js'][103]++; - var stack = this.stack, fqdn = ~ req.url.indexOf("://"), removed = "", slashAdded = false, index = 0; - _$jscoverage['proto.js'][109]++; - function next(err) { - _$jscoverage['proto.js'][110]++; - var layer, path, status, c; - _$jscoverage['proto.js'][112]++; - if (slashAdded) { - _$jscoverage['proto.js'][113]++; - req.url = req.url.substr(1); - _$jscoverage['proto.js'][114]++; - slashAdded = false; - } - _$jscoverage['proto.js'][117]++; - req.url = removed + req.url; - _$jscoverage['proto.js'][118]++; - req.originalUrl = req.originalUrl || req.url; - _$jscoverage['proto.js'][119]++; - removed = ""; - _$jscoverage['proto.js'][122]++; - layer = stack[index++]; - _$jscoverage['proto.js'][125]++; - if (! layer || res.headerSent) { - _$jscoverage['proto.js'][127]++; - if (out) { - _$jscoverage['proto.js'][127]++; - return out(err); - } - _$jscoverage['proto.js'][130]++; - if (err) { - _$jscoverage['proto.js'][132]++; - if (res.statusCode < 400) { - _$jscoverage['proto.js'][132]++; - res.statusCode = 500; - } - _$jscoverage['proto.js'][133]++; - debug("default %s", res.statusCode); - _$jscoverage['proto.js'][136]++; - if (err.status) { - _$jscoverage['proto.js'][136]++; - res.statusCode = err.status; - } - _$jscoverage['proto.js'][139]++; - var msg = "production" == env? http.STATUS_CODES[res.statusCode]: err.stack || err.toString(); - _$jscoverage['proto.js'][144]++; - if ("test" != env) { - _$jscoverage['proto.js'][144]++; - console.error(err.stack || err.toString()); - } - _$jscoverage['proto.js'][145]++; - if (res.headerSent) { - _$jscoverage['proto.js'][145]++; - return req.socket.destroy(); - } - _$jscoverage['proto.js'][146]++; - res.setHeader("Content-Type", "text/plain"); - _$jscoverage['proto.js'][147]++; - res.setHeader("Content-Length", Buffer.byteLength(msg)); - _$jscoverage['proto.js'][148]++; - if ("HEAD" == req.method) { - _$jscoverage['proto.js'][148]++; - return res.end(); - } - _$jscoverage['proto.js'][149]++; - res.end(msg); - } - else { - _$jscoverage['proto.js'][151]++; - debug("default 404"); - _$jscoverage['proto.js'][152]++; - res.statusCode = 404; - _$jscoverage['proto.js'][153]++; - res.setHeader("Content-Type", "text/plain"); - _$jscoverage['proto.js'][154]++; - if ("HEAD" == req.method) { - _$jscoverage['proto.js'][154]++; - return res.end(); - } - _$jscoverage['proto.js'][155]++; - res.end("Cannot " + req.method + " " + utils.escape(req.originalUrl)); - } - _$jscoverage['proto.js'][157]++; - return; - } - _$jscoverage['proto.js'][160]++; - try { - _$jscoverage['proto.js'][161]++; - path = utils.parseUrl(req).pathname; - _$jscoverage['proto.js'][162]++; - if (undefined == path) { - _$jscoverage['proto.js'][162]++; - path = "/"; - } - _$jscoverage['proto.js'][165]++; - if (0 != path.toLowerCase().indexOf(layer.route.toLowerCase())) { - _$jscoverage['proto.js'][165]++; - return next(err); - } - _$jscoverage['proto.js'][167]++; - c = path[layer.route.length]; - _$jscoverage['proto.js'][168]++; - if (c && "/" != c && "." != c) { - _$jscoverage['proto.js'][168]++; - return next(err); - } - _$jscoverage['proto.js'][172]++; - removed = layer.route; - _$jscoverage['proto.js'][173]++; - req.url = req.url.substr(removed.length); - _$jscoverage['proto.js'][176]++; - if (! fqdn && "/" != req.url[0]) { - _$jscoverage['proto.js'][177]++; - req.url = "/" + req.url; - _$jscoverage['proto.js'][178]++; - slashAdded = true; - } - _$jscoverage['proto.js'][181]++; - debug("%s", layer.handle.name || "anonymous"); - _$jscoverage['proto.js'][182]++; - var arity = layer.handle.length; - _$jscoverage['proto.js'][183]++; - if (err) { - _$jscoverage['proto.js'][184]++; - if (arity === 4) { - _$jscoverage['proto.js'][185]++; - layer.handle(err, req, res, next); - } - else { - _$jscoverage['proto.js'][187]++; - next(err); - } - } - else { - _$jscoverage['proto.js'][189]++; - if (arity < 4) { - _$jscoverage['proto.js'][190]++; - layer.handle(req, res, next); - } - else { - _$jscoverage['proto.js'][192]++; - next(); - } - } - } - catch (e) { - _$jscoverage['proto.js'][195]++; - next(e); - } -} - _$jscoverage['proto.js'][198]++; - next(); -}); -_$jscoverage['proto.js'][227]++; -app.listen = (function () { - _$jscoverage['proto.js'][228]++; - var server = http.createServer(this); - _$jscoverage['proto.js'][229]++; - return server.listen.apply(server, arguments); -}); -_$jscoverage['proto.js'].source = ["","/*!"," * Connect - HTTPServer"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var http = require('http')"," , utils = require('./utils')"," , debug = require('debug')('connect:dispatcher');","","// prototype","","var app = module.exports = {};","","// environment","","var env = process.env.NODE_ENV || 'development';","","/**"," * Utilize the given middleware `handle` to the given `route`,"," * defaulting to _/_. This \"route\" is the mount-point for the"," * middleware, when given a value other than _/_ the middleware"," * is only effective when that segment is present in the request's"," * pathname."," *"," * For example if we were to mount a function at _/admin_, it would"," * be invoked on _/admin_, and _/admin/settings_, however it would"," * not be invoked for _/_, or _/posts_."," *"," * Examples:"," *"," * var app = connect();"," * app.use(connect.favicon());"," * app.use(connect.logger());"," * app.use(connect.static(__dirname + '/public'));"," *"," * If we wanted to prefix static files with _/public_, we could"," * \"mount\" the `static()` middleware:"," *"," * app.use('/public', connect.static(__dirname + '/public'));"," *"," * This api is chainable, so the following is valid:"," *"," * connect()"," * .use(connect.favicon())"," * .use(connect.logger())"," * .use(connect.static(__dirname + '/public'))"," * .listen(3000);"," *"," * @param {String|Function|Server} route, callback or server"," * @param {Function|Server} callback or server"," * @return {Server} for chaining"," * @api public"," */","","app.use = function(route, fn){"," // default route to '/'"," if ('string' != typeof route) {"," fn = route;"," route = '/';"," }",""," // wrap sub-apps"," if ('function' == typeof fn.handle) {"," var server = fn;"," fn.route = route;"," fn = function(req, res, next){"," server.handle(req, res, next);"," };"," }",""," // wrap vanilla http.Servers"," if (fn instanceof http.Server) {"," fn = fn.listeners('request')[0];"," }",""," // strip trailing slash"," if ('/' == route[route.length - 1]) {"," route = route.slice(0, -1);"," }",""," // add the middleware"," debug('use %s %s', route || '/', fn.name || 'anonymous');"," this.stack.push({ route: route, handle: fn });",""," return this;","};","","/**"," * Handle server requests, punting them down"," * the middleware stack."," *"," * @api private"," */","","app.handle = function(req, res, out) {"," var stack = this.stack"," , fqdn = ~req.url.indexOf('://')"," , removed = ''"," , slashAdded = false"," , index = 0;",""," function next(err) {"," var layer, path, status, c;",""," if (slashAdded) {"," req.url = req.url.substr(1);"," slashAdded = false;"," }",""," req.url = removed + req.url;"," req.originalUrl = req.originalUrl || req.url;"," removed = '';",""," // next callback"," layer = stack[index++];",""," // all done"," if (!layer || res.headerSent) {"," // delegate to parent"," if (out) return out(err);",""," // unhandled error"," if (err) {"," // default to 500"," if (res.statusCode < 400) res.statusCode = 500;"," debug('default %s', res.statusCode);",""," // respect err.status"," if (err.status) res.statusCode = err.status;",""," // production gets a basic error message"," var msg = 'production' == env"," ? http.STATUS_CODES[res.statusCode]"," : err.stack || err.toString();",""," // log to stderr in a non-test env"," if ('test' != env) console.error(err.stack || err.toString());"," if (res.headerSent) return req.socket.destroy();"," res.setHeader('Content-Type', 'text/plain');"," res.setHeader('Content-Length', Buffer.byteLength(msg));"," if ('HEAD' == req.method) return res.end();"," res.end(msg);"," } else {"," debug('default 404');"," res.statusCode = 404;"," res.setHeader('Content-Type', 'text/plain');"," if ('HEAD' == req.method) return res.end();"," res.end('Cannot ' + req.method + ' ' + utils.escape(req.originalUrl));"," }"," return;"," }",""," try {"," path = utils.parseUrl(req).pathname;"," if (undefined == path) path = '/';",""," // skip this layer if the route doesn't match."," if (0 != path.toLowerCase().indexOf(layer.route.toLowerCase())) return next(err);",""," c = path[layer.route.length];"," if (c && '/' != c && '.' != c) return next(err);",""," // Call the layer handler"," // Trim off the part of the url that matches the route"," removed = layer.route;"," req.url = req.url.substr(removed.length);",""," // Ensure leading slash"," if (!fqdn && '/' != req.url[0]) {"," req.url = '/' + req.url;"," slashAdded = true;"," }",""," debug('%s', layer.handle.name || 'anonymous');"," var arity = layer.handle.length;"," if (err) {"," if (arity === 4) {"," layer.handle(err, req, res, next);"," } else {"," next(err);"," }"," } else if (arity < 4) {"," layer.handle(req, res, next);"," } else {"," next();"," }"," } catch (e) {"," next(e);"," }"," }"," next();","};","","/**"," * Listen for connections."," *"," * This method takes the same arguments"," * as node's `http.Server#listen()`. "," *"," * HTTP and HTTPS:"," *"," * If you run your application both as HTTP"," * and HTTPS you may wrap them individually,"," * since your Connect \"server\" is really just"," * a JavaScript `Function`."," *"," * var connect = require('connect')"," * , http = require('http')"," * , https = require('https');"," * "," * var app = connect();"," * "," * http.createServer(app).listen(80);"," * https.createServer(options, app).listen(443);"," *"," * @return {http.Server}"," * @api public"," */","","app.listen = function(){"," var server = http.createServer(this);"," return server.listen.apply(server, arguments);","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/public/directory.html b/node_modules/express/node_modules/connect/lib-cov/public/directory.html deleted file mode 100644 index 15164bb..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/public/directory.html +++ /dev/null @@ -1,75 +0,0 @@ - - - listing directory {directory} - - - - - -
      -

      {linked-path}

      - {files} -
      - - \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/lib-cov/public/error.html b/node_modules/express/node_modules/connect/lib-cov/public/error.html deleted file mode 100644 index c5ae73a..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/public/error.html +++ /dev/null @@ -1,13 +0,0 @@ - - - {error} - - - -
      -

      {title}

      -

      {statusCode} {error}

      -
        {stack}
      -
      - - diff --git a/node_modules/express/node_modules/connect/lib-cov/public/favicon.ico b/node_modules/express/node_modules/connect/lib-cov/public/favicon.ico deleted file mode 100644 index 895fc96a76b68b4924f1c51d022e1b82fa0f461f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1406 zcmZQzU<5(|0R}M0U}azs1F|%L7$l?s#Ec9aKoZP=&}i&OouUjIY8@C}uZw4x5z5N2 zvEG^C^vXtt_xtJ?p3O32c(KTx;lsgZhW%5M85Sf}k-mf`L80)|7ga~M{a znlL=>m1Q`#uoPkbC~GtXMnhnDh5$DU1D6mx+;2QAKt3ZQFH}H~1y~00GcqzVg9QXw z_<%(a7y$V|wJgF=E>MgE#Aid|14}IyCM5MhEnxFF;pTzOK(>#80puP=gnOXwAd33` mpMe2}f66m3eB@_fcnmb^7!b1nO#opK8zcsj1F30)+jEP);68^d)m`eN0o>(5%D`Q(1;j>g@G;xlf`0VBQ`PFY?6)!N&f?*K}$p; zB!U=NBn{eB8${1}&-2_L*HuZp@ZP1@clS@cHp)4iM1ewzw59vko7eMM{e9z|%NNdX z0V;`?KKSzTCvTm5bc{L^CIKLUxc2X{i{ISz$8Sgf{q)1nXTP{`{s?9mQ$4&hPiKC- zY8q7(Y1Xu5iCf33=O4Vy(+|zQ?rW#gkKB0f%}?+6{G*qT22|DQB-73`YzA{N4W^=s zq0kQYcbtFfz zLz)H<&|z(Y4kBG67=JY6c|L1R-#TR>fC$3^Y%QEnYO1xHsf)+GU`3F<{J0kR(;pbF3)zyg$H+idfnl-wl5Wkh!vUH z4Z32YP=l_}1rZd1W_D&^$A($A+&a0e&P?xx0!ctY2}*<#p+qPVN*B(YzvAWXa*%bzq z7Fz41LKILT(GWohi9|LgIzSZBhb*Zf6R6O}WYQ4GOi&71s9lmll0x6;8&ILOl$j(c z0Z1T(6Tg09{?wd{moFHNN6PS?$|e>1MxSJ(0Z7o2)J-Zv|>acY@f`(Y@g7GwsEj5NLQo+q|HsxQ5}XSX_d@*^A9ZT9=A{W~j+$GyI1 zc4oqTHx@1FlRjw4XWyPN5i2~l_F3@aBk!0yu^aoRDvXy}8@HCjUVQUsuSH4$T5|r< zzZOn^?Wfa6y|Q($Hx4{ws+)wX6-HP4zo!S?4KJ@7PG@G3G{CjXs(p*kIrj6rHs7_y z+=<-=Q62s9FuWa^X~WKgJIAAZJR&XBB002ovPDHLkV1jCMPILeO diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_attach.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_attach.png deleted file mode 100644 index 89ee2da0753040d1ba0a3487473a715a8fe89322..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 794 zcmV+#1LgdQP)i_t#ewV_0K6;=bl;e_Jt7$~$sQ)q$+ia<4Ec+jeaGt9oWH@O|2`W6&O0t!k{B9sUvLWxkCaPsd9W(`fa z;j-|^ZI^2XnzhgZWYRW-kP&J>DWPo`%;JaBX}or79k=+Jo@h%4Eo72tqev+cB?PjP zO<|ByL#>Tehyq$jR74O$B9WDW1`tK`LzYyL3A9iAcRxLkJ`I)n}v%Od-3H>j$OTBtk>(k-9o?8PqI=0 zB&f-+KOXVnjyKJlf4iHOtnuiE_4+ZVJ$dHjU<^o^YCjQ-wt^!;rPpBv(@pFO{9rdw98 z_s@3+yta93oyfL>7AD5}r=|`zS3Gm$_|(iSl8XBd9k%=91J0j2=ivT5cJ18ZmDjh{ z$-RMd{jQ#X79#Sc diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_code.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_code.png deleted file mode 100644 index f7ea90419d950f9e69d977a1f5847456d96a5f0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 818 zcmV-21I_%2P)@LCln44|RX7Ti z0HI3&7jPq){odH{?_{%nYVq_;n_c4WbUpvU(&Cvnj!vq|kVC-vpF6vp^;;e0mm6HW z+WPzA`AZ|;pPp$&dNjzrc??4rt`k%Q1l*u-BPD0MQ}Fbm8jnsyezNt7+u{23>t7Em zJtETY?ja9KrVs^!LJ$xEMF3-bAZO;-IQJavE60KA7fO$VY_%N)R6s>g5mW>fL4&aR z*EVgKKTBXm!=L?S0?xM zYqL@C$|EDF2q*3zWW7;PDZ}SK*IE8;i!3U62=qn80C&*I1Le7WwNP5EcX;_oh2dJn zf#HgBe4@r$GcjHjmj2vAfT%(YN?}kK=(*+1*DkNNc1H5R++vfBMhACi<5uFUU+N4+ z<&U*CPmWi}REa7C6-t>2im1CWv5Jkefxa6>)dEj-CAW wWa{_}BJ!}~75?MkfaCnj>Dn=~vkLS70Pk`;z)@TQj{pDw07*qoM6N<$f@imYHUIzs diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_copy.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_copy.png deleted file mode 100644 index 195dc6d6c365d298e466026b37c1959d96119ea7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 663 zcmV;I0%-k-P)^@R5;6Z z(>-WZK@^7J_sq=QY_e{46@P+~LNG}sRzZsxQHvCsN*h5ir6^j7pq-$xu$N#V1gx}9 zClV7;5)7zih-s3DB)G=7|99>ji@So7-P24n=VQ(@GctDX!^_@$bj%oviY6e4Dh;od zooe%Wvs8LEKQ&&bL&@bwi=STIAI@!-gB2jC5+?y?VR~VkrNxam-`6*8&po|RZ5LpS zNKdJ%c4bTX`XjKsnecf%W>1%6WT?pKNdLLq{=(f(Col?P1+oq@R>)W(n=x!|*BIIh z6DJGw_w`)u6yN|vAhMteYK5#b%r5^v+VCFl1IGssaclZZMS{vs-LJ2$)n7DAr6==K z<29#%AXsBsDoO}SBaXR#_Ap!JKx)(1)3O2pj0_dYWz5By*X74fRT01$Fk%P_RzOMDtV?GU{nsYq#K8iy zb6qzLYDj`_f5$BwC*WE(t0m#xYJ*=jC2|HQYHh=pf#QG7oowi`h!L!{DB$8|qY{~X zu8@sU1tWq;n$XThR0%;45mdqXM892|{CJ@0DS*}>?ami06Q_^tvM~Y3K(_-`#m!8f z8f!QIrH4y#61;0Ym0cCoLl8{IPombPHtnn7%SbTdI&G-d>ZQo!_wBMF9nzX!g8HVY xYTJPGciz9XMh3w2fmZ(7v{)r*QZD48?mrio{~IaoqP z|1Ep}yDQG09bP~E^Dk?@JiKQJ z6-pO(3~IOP)IYisL6D6;oAEd;E%zR}{U$rMRNuD6nQV7nesKS>)yLo7JuDCrD>Abi zbj3uW23?^GA}9jQ{M^8v?ejL?HaT7AX5WPZNkBmfN`w-jL?{tT7ykZt$%Yln?p_m~ z-?>&d(LD(jAd}h=LPltPQbO$*Wbyl@G-_k5jXbb#qffHY03>M1jfEqoPJQ6Mr=Byp=^jfzePZV1 zLjCmNi31hdIJHa%e;5g=1(`u3BRzfeExY%=VCu{loOr{`%2hUR*x>tL^W_TTaj);0 zpPR6CUD1+0>4TQ6zVfH3TQ;%l6#(_%yspK@3gcmG#Q4!WCPyLU93nMKk7E2pcA=l45({2jNho>sdF*A~bA zxX?-cp~y_z_kFf+yqu3m#QiB}03?Z&9vvR5TNgj<)($Vm)xq5G>|o2sFMag&6aNF+ WAT1?sQBYt20000iHtsh1EzPArg^Q zIZrOk#rNsfjaSbMAL;<4h;Z=jvu8dzyz8N&Nb7=z03ZUw?9z%8KQEa6yM5=kUnka& z3?FJk2}L7q>na=T#;<7U*P91xfF`;`6%pVgWgRy0?1ZryL@%z52=-!fGXWGEn4M351L4<+7eDgwo|moqXT+s1&Kmn>-uQQ8mL7XY)w5Zk*(g+<3Y3tmkR!bL zOUKaUtj_pX26sH+=Iorwu}MGd`_%O-_sS}8VpG#fJA)Fcs#ezwtZf?q?Ac70mDv`rVs{$od?VPKeqf<-kUjNtS6ecB*mq<&M97K^6IVsDO zt2$Ru!b+>2S<}_H>$RcInusU_8PMNdf(W{sNlJ3FkrwMJPeBPO#d}Y^a{9TH(#{Y) l0D?dWAV4eUJX#h`!2gmISk&ZKd4B)^002ovPDHLkV1g&sd|Lnj diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_error.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_error.png deleted file mode 100644 index f07f449a44ff2761bfc7b752db3d08d0e1238b02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 793 zcmV+!1LpjRP)lHwhvrAu0-@MQwt}+5~MQTtu}C0%;W( z1<{R?aHBz*g;pk%AyQVBR_Zu5m~;ES_vxI-O!vIF|H*|T{l`n#garr?$RMk>)?Y48 z(ZF2yTneKb};DNWF+jK)IF`6_IfJ{i|F3o%Q+l&4_HGBD|ACE8na_6>L z=s{^>-C(a7J$6=8A_%h5W!1K6dcL!D?XX+Ndk)oei?UundDpX_E&1Y&`)3P8#Ny0s z2Ag7_&ZPhyGj%)g&S6V2LNun1;iBQm#Fwlfv zgyESZR$X}2P;=RW!2zid1r$hBL{K7>2qi*f7>pT1=RdT3@-anEoH{ z={KFOO;Dh#bV*jaN>}M>RZqQd`S=6O9C3KpI~I>l%QFYfo;jqQYe5fcn`)+)zMm6P z4X&L(>gnN0!%J4^rhX->?$S5bY<=GEU%jc!KLL8sww-Eg;h z`H-yBHa)yfojYT}&G*GFc$<(Yja_q=lZvj66DC^O5%$B)|Z(CeD=n`|eM04SP; z>-=-l+xdJjA~vR6^xB#o{ehf~tSM`iwaQv$O<8NIHA}W_WOw*~ XD^gE}t;YAo00000NkvXXu0mjfl6ZQ> diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_excel.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_excel.png deleted file mode 100644 index eb6158eb5ca9c4b64c81e70e0fd894dbc8e2bed9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 817 zcmV-11J3-3P)hdKqhFO_H1|Vn1E?(=|cjAh_&P}y{{^`u< zcYD@PK?$)4i~7o9*6F_$F$4lR(d4AAvrez^(88Hk+)+B7E)M3jc=Ewl4$S^`_qwSF zA%qz@=c2EOsz@0qB1IqsqJU)HaG&+}%`-OM8YqW{K85hqj@4&V9vz!Cm_n0-W#f;# zeEpJde%vdgRn5?(+PY=W*z~|lT2-mtown({ll8&3S5+lWz5K}LTRW{k{eJn3Qz!SU zQ`@qI_n2;K?RG~pYJ9=dj-RWgG;P&wEuoAxL~Q)<>x0b=dED^Outj&xQ^rA;u3pw| zca_ClTh_d9cxXg_U!lLRl0`xU@$=UXO|_dRdtXfKwPawmnf(LC7u}-U>8k6}3u|{8 zs9LHr>MIJZGD^r9h|q2yF24Wuh+PM^yMN9GP1$khlDkdyCY}D{kg}jEf-(kW5jBY> z0rB29ZhG-r=i_R{;+1k0?A-sBM;AP6(k1i9ZuixR4?MqXOvphQgCYj~RnXKKL~J9Q zIDNz~XMfO{ZhUg&BTtMyXJqDVqc<x643?SvKHx004lTvR=0a5$dUw z>Xb470000$S;ka1sfH4I-R8njUol7M4dtApOahDylptpYswf1hD#CwFoz6oEA>(SIECU&IQ%a}GXdnC!9$70`0uH1B00000NkvXXu0mjf!8w72 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_find.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_find.png deleted file mode 100644 index 2f193889f7ea091c292acdd684c595dcb206b5c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 879 zcmV-#1CacQP)@+1&aazfGU7ezSm^v zpACwO+tu0su66!(dT=`e05DeeCnCFJW(8|RKtKa{4LGONnx2V85A4m%PEQ?MEtR-esdM$pB-`H542D0)N2zSC6Imf)4L8?>%ZrW+H>xCKi$unm zvGZq-*Q%Aahx;C*=l+K%-?>XB)6TB$-L$r*`RUvlA`xP1NG2?)ge8@TQ4EN|Jks0u zcDg;oFC#-#R`YbWB`D?Q`1#y7l$LXhjSLf8AvQuB84}i#j0^!#g{VE#(K7h@5pFHy zSenl=@XBEdxp`h2Ji>CR%=qXJ7!e|?paKet-~;#ok#jETyeB(5&Bkhp;!+;51~G=) zH?L7xmDUu_h+a$+xuWom;AWW!mS$%%+436Rjc@}y?l1134kgD0AOf$OmjOR zstUlshZk$ZC!bAyIg{Y29z#&@3SJ;6D4+_eFume9^#TmMccC5u0J!ZCTnO6m$lnD| z5JeFHf`Xs~1vP>RLKI1GKDY<~pjr2&bi(fX;6Nj-ss@Ds0CcoO0H{JsEQkm{q03skAA);_bv3q{k31qwVo&s-q`Z?_e+j^w(WL? zl+uETs5+~xBU2};OqEE9ETLGwsMGe1%iTRNue)9}|0~E4B*@5#oRXZ9oRXZ9TqRep zPrGZuoOON4n@=uPbyP1y4G=+HktC6l(gZoFD>@_lXDrN?wo+zozGt3P=Qh+3L7+}q z2!WK7geXLnO3Vw;o12Skp%_E#+N#9;DDWP?Q-VS3B$v~Ha)dDzWn0zG~O(^_1!n0HYp-( z+;wPIdoFgQlpYV!10V>5@a)1LyGBMvoa}miyp(bxbMTM-FYNyx;V@TfYddyT00000 LNkvXXu0mjf90!wr diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_go.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_go.png deleted file mode 100644 index 80fe1ed0cc75fbb67e9398ae686641f8fb287238..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 779 zcmV+m1N8ifP)JNR2Ufr z!Apo%Wf%b9=l#x^8AolrB&K9H?Pg_|78WA8(M3toqE%3B#7*srcF`i*xhupr27%Nr ziguah1+mN)U5GNmyEfQ3-e%_i&-vb-Co#(>FJ+EhQEwjRYVQ(&UYy{U@%vbY||>@4x=B^vIqabI?L* z;-S&DS^V3-ni4^fl|HMkOEbgX)(390>A}|VIypb5Xee4g;7ck zwKh^A3Mi1Mh@eC$5lV!}Fw%sP623U`g3pd_Hr5sunLvTskx4}&Gm%Q6L}(l4x}jCe z*81q1_4-O*ffi~_nMslo?EQ8t*&Ec(pzEw$vc}pKn_Qp0>D7Jr>ATNC3w@9f|Y+U&+)#!t7l&wKp+nP{PQsb+fb=Yf!Fu&5j8vpRj{FT>jD z>d>$sx;A&+`n$HcF}&sYKSyR;=(=9tvvOj@hUG;~4qTYk^_@E=?$*^_pVh_bGnOt~ z;pEw)j{SK$XVc;qy181rT655gW9NG{(yeablViIL>cDI_ux8m>Pp{tY$J0lgo4#ax za?j0EA3s0S!f>{~ykN9h_RhM&g3K(E`q(dE(Rd49+%xMeR9{qlWnmd{s#(SQ>PmFtSQqUjAtB;_Vvt6}AS_5YgM`Uqu`yva+H8^=4U$e4gHb}u zAQ2N{V3A%pO|?Pv?tb6z=jC}SiRa$G^v3q?*6XcYz$p|cq{uLj@#~Fi`J(>5{@&&N zy%T^+;>8cXx%|o77anP?&W1?1A(>-T49z9pyeCl@7YI+Si zKti7=B~``}TImz(G{0PnlQA3P#MAd}sorMjkP!50B7$nAkU^%#nl{Q9lW0@}9fE-> zN(q7tRuiC_T1r|BBtVBTlQ2+70$Rf;eF`Z;lx46Cpu-rEgb)EBKq(b^W8l<^We(`D z43?0=01z<3G6+UUv6`CsWCk6^93!#+<;ws7007{zS3k2k9-zZKFO~(k`>s0y006+1 zgF_jyIhsL-`FMf~JL~C=cV75(CrJ|q;MVO961G=O zm9d)YpJg5g(4i_HKL75eSE}mq$Y}r}hyVdcV~p>6a}oXr80q`oj%+s700000NkvXX Hu0mjfPs|!l diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_key.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_key.png deleted file mode 100644 index d6626cb09eb11a298b90a8a27b0d8eab41f49a82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 801 zcmV++1K#|JP)$lC4gU2-`f*>nhR-;k6IP7e>YO!0^w)WK%3$w02v-#>5Ep64PCP| zJihT#O|N+nT7XR2h7dAB?UEAOhJF^mol1i`QtQB`HSY}RE7=r! z)zaVIHr5?>v2Gz&fdYw&2ug$!p+txby(aWZ7(4QT)l2`jX7eMQ{>)lG6ev(fWKxmH zOr%mM5$6B%u~qGtCf40#`mbGj3s!n+^%wnJ&#rl>g<4Z)lB5J6f!?|AP275)Zswr* z%T}4~{;_(?waU!#?JabbF3Cy-kf0{R{z}6$e=5yMQKt3BPcl2>zoTPMqMwF;3!_n|>sT?~bK_-2O_m+o>GJ6h zt=+g$4n7y%1qVJI7*5Yw(hqM=JusY{d}*?U(Oj*gT655eZ>Ksn(qrd7v3}DX1}C>` z+X+8@+4-pVq_fxG zlU}~Ye!0+%>J+pPk+0wV{GM$QaYM?5ux)w2z59=S&H2+K?;gH$bZGzL&g5>G ft+noNiyiPkP9r@8gT|RZ00000NkvXXu0mjfuqTIu diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_lightning.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_lightning.png deleted file mode 100644 index 7e568703d6432c530224e443771a04fc1e2e59c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 839 zcmV-N1GxN&P)73{`^;G#xwAtHz%LU)4b zqTRU=ve1RNa3QT=ZM7C`iJ~QFQ*9t7<~pX$d^7W%^M8FFCkcQj-~0ZRTBCB(J0^iD z-~e!d9LR`f3#|=(>$bPvx_D-~2jC%pJ=n_e_OK zeJ_2b-KdDDh@@UlzBSMC;EPygH_MwjWBnPGQegihBV73D?-x9PlHL9A=(Vg=8^d<4 z<9r=UkxuIm)*CO=9e###7PztDxUv}e?$0)rQicmYhV`pQ%S!g@;K(?TVfhM#E?bM| z=B0gfb6h@a8bf5FVT-SV~6}?X}9lK@@Yynoty&1zdZP@?RfODsl=2XzzU% zS8gIN43How+9%bK2S@Xbc`O>`z5`%^;pXGy8^4f>9^3!Sp@|O&)m;dOa3q6d;4P-l zca|=H_{G&m?D_+&-}r{u-J$5T=(X4R&)q|O^gN8cgv;s#@5sEPT5_Z)oFo9Ac>l+I zc4ng5zHpps|9)<_Rw>5bKzE(M1j)dFWI_%OH$BJSz0?T+02W0)_a>#vFqb!*d|5wB zzBUN|M&ty51O@=i?kiDrjQ{{}e|^rU?OS|RdxxP1p5mAw36cX72#`R6UsoeCQFI~! z0ATITp!vfeYyQ?Dr=^5BAshfEa0nB~JG?nUa2Aur006MC*<9`)86SPS(W^`H2n+xi ztOWohsFfVfVWrI7PSKW}BmkyPoj(-|J?ES|BGd-}fIxr{00@ANnO*ZR`#)pee4I5T Rmm>fG002ovPDHLkV1i|Hc$okI diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_link.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_link.png deleted file mode 100644 index 312eab0914ab59271384686255d1be913a6b3add..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 830 zcmV-E1Ht@>P)VWgGzD=Y79#JI$lhEn`|2MpRa?Bt#-nSD~P0P(mbVe{KrOBoKnSsk>m|ML{6l zBosu@om4j#WzNLRAk+{k1JRvL(MfE&vvbb->v>W{*z*1_uMP}0cIRX*?mz+wk%*#O z%0D-+$B*g1nRkvI+_3E8Pr1NC6@5M&4vWaLCnNlr;lNlr4i91z&)eBGqL{L{GNu;Fof}GS9{gM5BJuH;2QWk8yuOZdB3pGR#s8bd~ zAmt<>3Q=YH$t5YJ5;7@+8Uh6=ktBgY6#6Pa%2F?h910?U8cLT43KAj$Z1*==ra&gILO{WkHfs(--F=bly9l~${z@AT>V$oat!YAD@M zBE0v_F{`g#^wOSP-u~!wvlmXdd*uqFqoZ0^{&nEMDU+=!>({S0wrQhFmoB}Yq1)~0 z^{A)L8Xjzdr(W4_exYO6u3a{4*kIeXZMJUR>Q=ksjW_p!rAwDKYUs90>6Q|C>56o@ zbrSq^Xk7Gq#>dAsn@un`Hz$?w$;Ss`%jV7L%9ShgHFV~C)6M>B`Tp%|nqPc&G*A3| z)Qe+}vT4-x^t1~XE@(6wR;^lPWMo9n*~E!cy~)YRsT2{`?fqeIw-e7N@mOA%UcCIq z_kH(_EK7|>pM*1Wt2^DaDAp|cvp*@(ZZDKpYkKC^?97(`0sb&XTXy7N#sB~S07*qo IM6N<$f;YmCWB>pF diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_paintbrush.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_paintbrush.png deleted file mode 100644 index 246a2f0b426faa0c7f5ba009e32b1deaf88d1288..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 813 zcmV+|1JeA7P)otxGRZMDZ!_a~nK|b_-`n%VosaL{KDuPV10`(1LIen8kX2Xff$3BE zah#djvFGJ&eE^89Pk*-O^+&d>FC~^GjRYVQ(uuPJyS|-v?9lxA-+tM5>1Qu*n+Ir1 z6KhA>X4$XDH6?-|E5oe1E?pQ5-M;2xw_ex!x}I2+b=}mPFW$U%^;o(Zg*LP!K^1kP%8ynsD^= z1y^6xD1#GLjO{VLdh@0GKY7;d$+NGukV)GRLPn^=q=dF%B#XaJrNP`0E6=}e&Gj3d zKJbQre*WXt!60_DnIzgMQc6S#fvjXxsE1v7;T;njHkdy2miIqAS(nX~o%cO+q+b#h z5tIleLWvL=dQE8OC#{%y*Tnku&K`Tuub&_ELI0t_ea{@3f>Jv&sYqld(%}3_GY3Dm z;O{3*Y?v^A`a|D;^qrM=ykI)U6QHd%WhO~VF!SGjGn0GOZrc3mGZudNl9{Q#X5&-F zuGwVReFLBjE5jr!!^-5*L%!I%PkYH#Hs5rMrEBl^)9)9XTD;xjHFxVZMc3~Dw6#k$ z(-S}RE$bgMHv6Z`mS5|u$$78sp4G-8b@lVkl`HtEv+MGn!F&bKcHPi$$oP_;=BrPf z$(~b3&p3CsuQxhoV$%jIR;`lB-s7FDX)xCTXuJ7ZyIQk96uIR=HBt%-P?N*bp`)EF zq14c}QM+O70NTOa@V~_)&GMZ$^cQDlkyOCa(H3Mf+6xhCuZh`VSN{cQBl5Ys9{cp( rh`2H3A^=GuC6HjQ*7|*0>;m{7QlnX3z3MSD00000NkvXXu0mjfR5FYo diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_paste.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_paste.png deleted file mode 100644 index 968f073fdddc1cc0f0800b1ac4001cd9a55f053d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 703 zcmV;w0zmzVP)AVs!l4K}n~L(tL`6d4Up4iSWnZ3Qg~4n+_J zDGk-qQdogO5JUtO-d5pRp7Nd7_r1^a|M&Zq%mn9Oe((|e0sw%Ur!K7T1pojj=U#f? zQM`qbQrM^DPkwa?DK_be^~z<~RgSMIa<`xP_4P7gg2jCwJ{9^k!fsU=#Ti|%I3p;>90Qd+7|~0h&mIklA#nb>ATL2+v$&u)OBgB z;nsHb)I&QRKeX40H~~cIZxCd}5C} z=79lXoXK%6YlyLtsV$~bSm?Upq|DJh#{|*a7XMm`4QJWZ>s6nL2R1|&J z0VPEwJ9?!n`o5PKAjc->P1Gi8BY*%!5&FVp=#)$mMJYul1Jton}gujiUf??eOy!x&!tsjxy;=Q3_DdcXx=a^OBhW0N~`A@4xB0a*%F? l+@c^sQA%W+?pa#c`9H5UNfS6T{e=Jk002ovPDHLkV1grvM=byV diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_red.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_red.png deleted file mode 100644 index 0b18247da5850f3c2486373a3e179acd2772e8aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 641 zcmV-{0)G98P);68^@7JE5sw#jpE*579S@TLkU(6yap1yN*Zuy>-hV%Q_v4Ar&!63c8OBr(ZRhFu z_kWs36-AmgZCT>x!RqM;Zu9tqvoHI~k@UmYo_g(*J3c%2{N8}7I+|qKPQzv}7t>%W zsu&9G)UmCzkDYSw{fBnuW4j;1fKV_nicw`$8C6D=F_qu`zUiK$2Oc?5UVY+D(`I@R zW`KlwqLftWHH3Z2_XVNfKn>VgT~k=@- z+N>c>0|@A_HbI9Jn`v0~7cfIF(TS69zaomDS1QtgvaBBfGEPLHccO2~3jc>n^6}^HAEh-2#VxC7YYcDXv!L9X= z-R*SOUvIs;n`8(LxP4~^2|JsiN^hq6cU}5dn4v1~Kl{eT7pm&f$PoY`hyVe%y8G*S bxB&kH@RuR86sIAS00000NkvXXu0mjfZBi!% diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_refresh.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_refresh.png deleted file mode 100644 index cf347c7d4685128a4a447abb9fb8e939417644f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 858 zcmV-g1Eu_lP)`6pHR2Ufr z!EI=jWf;Km|8+n2IrHqe<9xxFVk)&(Nh?w$Xk`TAyvb=#e=0aySC z00NkRDM597_LiNIJ2M^qhuTvB004REvvU8@of{r?P8tmo3;+Pk0F0@*jAMhdOkS&1 zhJPPfQa;pP0|4+Yk%#j>X}o-s#EF1_DMV93FsfPP`G*>Ks>L&)Q}w2g%slu0kBfW1 z+*$*0BC^oTl6>OGIq(9BgG4|C90Dk-N_mPazGrQ7uHZ|>BLD!-KmZ)z1e^#?1Sf(M z!6m}K(^b|i%$TcA5bC}r$tAA?0C)g1@CgWliJ;NAk&ZF+-w#}$`-3nZ32C6IVKrHp zr+(!L2hRfF&AsTw>_@ z1y23;E%Oz}?q^Q2d($ayO;-sON2t7$w(Z|o0Pw1YnSp^}0PI+I5HnDNsFCA?oorkG z5sUIGIq=FSyxcj+xlhkm0en=52Bx3@02o12gdAU$_i?v6iyFMuc7P9#zQ-Hf; zVuV$t9P5`m)F2w1?t6{<8%wk{w-PP#Sj#%1MbsjrSI6n;D_@8q9`~W98dNQf$j=iI z6~hpgww&be%X_HI50Hhx@W==u4TLPB;ei-J-1}G8wH}|{i#Lk-WZAyfv}k4y0|fvU zZTy^$u6L>2nWo(NDSV2@MRD}JQ4(c%G%=dG@_vxH?>gcH#*Ue2HC}9sapf8X?R$Z;XEnm&g zW99mh)5jNw008mK8)r^`_{yH0rNn%u1|SpC(tjf#om=+r#lh+?Kb>DVb9`|C0Bvbv zN3U(>f4-tAC1hosRoA7p(b(hL*V}(j>ug<`&U)|l$6o$)!>PBQ9RQSwn9asj2p*|xhU*R^vq?*Twb0t!lm5}`yW5lRy-U0ZYK?8to!;o!r!XeOE$ z0HB3T+6EEoI4PlR=wonwqJ+TvCoWh&$?CAPVYcU= zD{DS0?AkOtb@-hh^ZLq~FMjxYf19X?pa_YqtgZGvv2TaxcF#KT?O%=_*a-kW_;N|D zakkWsOe!)HsT5WRBiC+p;N-c>0Qwy(1D2MDBC595oXSiR07)sKNk-%9*rDBOO^HUD zZW#;)R&EZpqha<(HK$(tZYU#V29<@0qCXgU{gXeGpc_|pTqQD-WO|}%yKZbeX7k*H z2W~CK$v8NBAq~czrc5A(v51g0Wma7`G8}f=ZcuAiYYxZan@gP(;Ku66M6?bquGiHe z3Q0ya)%Lvk@kLixZfZyU@#UFbv+>pYhcj8TRKSr_sWG8i^X~UA**LvbD3(_Lba3xm ziYcpup*A9qJ$?AA=Og05lndxfwr`!C+O~h|B~4 z01q8H`StcY);%&mId7_+)76ovRpeNWRp&4M?#jx@|E-)x%P*A6t^fc407*qoM6N<$ Ef@ddc(f|Me diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white.png deleted file mode 100644 index 8b8b1ca0000bc8fa8d0379926736029f8fabe364..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-&H;pyTSqH(@-Vl>|&1p(LP>kg~E zYiz5X^`c$+%8#zC{u)yfe-5 zmgid={Z3k(ERKCKrE7DF;=x4^O+ pzO8rLO8p|Ip=x)jHOtWj`bJBmKdh_V<`47(gQu&X%Q~loCIFbEay|e6 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_acrobat.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_acrobat.png deleted file mode 100644 index 8f8095e46fa4965700afe1f9d065d8a37b101676..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 591 zcmV-V0~O9lw>B8WRlD)Gm}Jrz31u-X&&gn2lvjs=i{7nIaL6v2==uw+8Lcs(8j27 z;|c`rmSv@Lx!heopGP^^Ieb3f=R!%Lpp$}iMS-&P3EJ)s48wrJ_Ni0~k|c47D2nj= z{jS6bt|kFpFf|p5cM`_&0Zh|`rfEp0(}=}lT#(6RpzAsUfxv^LSYX>WlAaN$>)*J5 z0#sE+JRUD8iT9*fz{)_^7@6P&!sEjTcD+I9Z4YjT1`wH@fV{cEvneYGFU%maIEU2s55&K(LixD|{p-uiS@?KNj zk-Go8G$hH6g002ovPDHLkV1hVj1#|!a diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_actionscript.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_actionscript.png deleted file mode 100644 index 159b24075191fc259cfd80c797a1b0d74c168422..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 664 zcmV;J0%!e+P)7Z7t2}reCh0o`+ zAlt$F2tW%oO@m<=(B8a-_VgLl#~yUMUDWG!0qFPppd^03e+x1WpkO1NhIaKD2A)-@ z=Py8(Wi%R%JtYZG#sTKH@6Z+&!S3Edf8jFJJNKuva#KJQD3X^7;H^fd2di znEN&c58aUG>`>P{Vqq$kLb+TP{?I!d4(|o59X_%|nVEZq2Rk60n7072SWJ{64CV?3 zgS!EB=eYxwQ>P2&$}(iT6UMvuFgHHIEdNA29!EBtg=v~X!DxxEH~}L2zn|52%xalaq@DTdhh{EVwv0IaQ=!?daer zTKp4I`l8SDt;d{8Q`5Ko;BXUi&oAG1l4}59P-{|^S(Rmord5s6qsh<&m@Ab^wqCD) zHyRD}lKLDzpYN&@q5&*47mGzGiqcXpmqR9#K|CH8kXS4RNs`(iEF%HjP%f8ItyaZK z6$%Apvsok(2>~dTO5jTZfq;N?0ch4l01f$k9?4{~Youl-#x{UDMr#AFIkz@SDwPtQ z$gQ^$2|*(Ps9LQiav_8o8Ne<=Zx1*M*syo80sEO1tB%>5 zfdHB`1z+!R@?ghPRKmL)hWEvZE$=*54ose*0JiUNTM_)cMDXhxEKg(?-pD=y<)L4J zT0dSyD0&NhJ$^_8Ko9uom%-ZM4BTM{Tw$9qyPj=-9W;N(Wi@3*-Q4pq`Gcp}^vvNr zyd&PsmG>fpCSZz?K}UIEd;HGgG%0MG>ymxKPwy{>wy(m*Atq7)0000~7 zMNw2LQirBVQoa8G3P(rY+l;L4iy+JwSqmy$9JlSkk z&*$^Eg+c)@!R|v4gdc8+TTn&eWHO0VD&>$!B%o;;WLf4CNs=Inq9d`xA4otCWHK38 zmc{pkX`0Y=9g3oGK{}lVy~OYL|C5lQ&U^l;wrg|7w=BcA9L4-r411?K7f`@348&rw zXD#uW)DK;H`hxO}u%=@Cj{;#u#_;bb1_KgUOT2Hp6;)MvC6P$vQP3=g1O5#aU%I!K zZ1dc@f}YvG&*Spnplm2rIp^VdA^HydZ0X1axdms2!RKi5x-SFA4p@ zC@N|PI$ryHL@t-(!zBsf2-+sYAukhDHU7Lxm88-p zDk^c;sHj}OKUc4lGZU}6umlGVNAJx0%sKDOFwQx|V2pVvxhYKe|L9TNk!~md3BVrm zYPDL8Hk*yU-ER3~LGwJ7N`0ZV&nOhBI{~~A;@ND*=kxg?#^W&`4u`zk?Mg_e)8XlK z`T#M+OaR1!<#Nf_>$S`xrqd}OjYhoJ>q)?3vEX8pY&I()ERjfjrXM$k7e+-Qs3Ihj zNyOuEQ2EGYG7ro!o6VOBQEwuV2z)*tR8>WxP{616FY)p1Pn1d}#9}cxolZC$4n(6- z35hJq0;FlHC{ zp*iF(lgUK(E`($(s9pJ8Kn?(M734H_63WHtf}6SQQ_MXEP!#0|&@>J8dL5TfG&tBw z#tYn{TCGZvAr>cca%YYn^!t73tg8OOJ2FvJ(`YpCyVZi*?Ur+1uUA$hAg8-aK)c;e zQ<)!XwHh|n&ND=$@^)>aF-`~n}#*WMkD*M|f8r$i*z7+W! qF|A!t*4fE(R`<_YIkN&?Jng?3oQ|aAqClPi0000t>5xmo{nArfL4CJwMMm+N`pQ3p^Le$?rMud6Rbxz!-yG7bz2z$^USP5(;udf(gfQ zG~f68y^)EvcNWp#bUoDt2=h+^%o-?-|mo~iieWqLNP<0m@2PTB7ftyb= z@H`K$>v9Pr5X`L|rw&CEN2(9SB7A2SE;d|j9@*F}sd(@*2l|P*fWfK>1drZUrtUA7 zNXO~pKn1cjf~~TLbje1g>EPPzN2GH#UIBxJ{}S9=E`{zs-w#hO?vcH+hJxroI5v?j zD!4lP0WXq8zUx3RAP@|Gq$}6wXCjFLZY^YSWBxN9#&g)ro$%5}aYn#y=tJ_aIT%4d z5d4u`rlp!};XGmbZkJE*kYJoi&N0pd*yxY{0${xD;;Q1h^8f$<07*qoM6N<$f(}t7 Ae*gdg diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_code.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_code.png deleted file mode 100644 index 0c76bd1297751b66230f74719504b2adb02b1615..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 603 zcmV-h0;K(kP)^~*-1fljz_B$LUvK}k?BNXe#Y!m=zM!!V#}8bncK5m;8VP zw86G*RI63?Cd%b9bX|ueNlZ|wR6rj|r_)VIP@r2imh3?SN+^{|kY%~8B{maJ@F*OK z&VH9LwOeGt#DRjj0~v~8`>iO7!Ybi;zE$va`A^T#yW`y44;k^#O~K5*jD=qcUhPSc zvyy~q;5H_1WT1l~cqje9yfa+l!hu6xjdOJ8s;8E^+=QQ$tw p?%p!Hy#YapB=@+^9(46X{{RQg%9y;OKjr`c002ovPDHLkV1g7l326WT diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_code_red.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_code_red.png deleted file mode 100644 index 87a69145075afd8f8fd8b391c5da1249ec8b2889..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 587 zcmV-R0<`^!P)LWh{^|hy<@Q*xw+qo|KpY<+vaXbbW{L4q( zTsjXEJvb}e%bgb=o%W0h?4u1;^bWTqH8}5Th002ovPDHLkV1nrS0P+9; diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_coldfusion.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_coldfusion.png deleted file mode 100644 index c66011fb0fbdcbf210483d676b7131542a0e282b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 592 zcmV-W0k7R5;6x zlV4BMP#DI+Z{WQcKZBTk0lfkj5F$ztWhP#lcuyb@0@rA^#Kpu5KLA&Rgc}o#aSmis zrZC__xY^&#cI&!!{c|4Q_tcec*#b>|Y15wPcY2=o3;-Bl=(t4;6Ok*pL)-{*A;GX^ zS(@WGp6j~k1wBVR9)BB_gar`}HyRBXh7nM!)u5^>N~MyN6bc0-5{W?44iB<`2biXb zR;wk?jIQg@G!5l)SqhrXCU}x$GU-dY1sra}0uCq@153FUULT=jNwSk}0WBjKz}Jdu z<5gB*<^XtpAmp3m^ZEXQZWd1krhft}CoYaF4cSMvTJ01}X3X37KYdx-D0$c{doUe8 ztY{vlGr-e*;N!WAV%_hgUawyYrhegW>^F)pv%uUTFslHn; zvJ)l{%w(~{!O4`KTmK{Q{zCYltLfs&4?nz|6IdlqHCvX;|HGv~!QW?8P~_d#e0$v$ z)5XHEz{3>qMiH`1+qNYf?huS+@L`J9_$cjJF)Hf?@pu;)`9}BXwGUM{2!{y-4|Z{L zG>z?O%Cp8P5T#j1DID7u_*(Jg?7iss8AZQ+&;u_J{FmILf((9eoiL5nGUe>Fgq*U$z0000 zJ3A|*qoWOonz+4ZQ0KNhDB07SX1?#FrNy8%K)_l}y&kh`*KYdy`Y99&tgNgMLSSrc z?B?+B@HO@P-jS~z2Rgc6yy~Y~%>oJpBxsb$5<&nRLqiuR7K=@0SZj~jTs|sv_jWVX zGe?WflejOaq|Vec=s9+ahmXbyJ|T)Sl*?s82sr2H?Ce~HD5WI+Sz&tmWrN()wI2}+ zKqg92t*l^-#ae~;9%KFlWkmwnY=-UK`_|%ICZ#P1gdjK<2n38VXsuC7{WiU!fZFmm zW~Sda9(Qi@pxO}$ARY+;t##Ao27usOqNt7Hwq6K7G1il@xitj=LIM&{N&#SuX;x4x zmG6FhCg-$PI;hQ=;1iZ>F>^~@)IPi;l}fX?SZ!QiO=X<|pSVkNpJuLHzW(FT_~W-v z?vFpkyE>8ee4d=7wKauH5~dd_M7d2Aa=ICC{Nj7Blqv&DQEP#j_VeWV&WXL>c=LLK zsmYg^_JiDb;%U!UxO%qjFAvsDFj-kzT2$GbV(ZopPM$i$z`!7jvEk07BcC=6FMt4` z*0u3Sy`0b~%#(0000K diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_copy.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_copy.png deleted file mode 100644 index a9f31a278e17993d8d4e13beac2f9d5f7b42d08f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 309 zcmV-50m}Y~P)sF~CC`eaI+m%Y8jfzomMvZQaNUIT3LIrJ$h)_W{ zwF|LDNlB-g`Hb_G$;>3F$9JF3WYR|3fy2C+_wH}*xp!_4fF2UN4lt#d26oXwru}hT z0+0%Vz-l&|Tdh_L-Ng1G2*RBtBncRx;99K)&+}s0whhxXp{go}$g&Jk6k|vfypI5M z!1sNGVaV?!*L7i87Bo%cfO@?S`bajL{R<($@$|PtgBRcCGIJ_2a|&kO>G-s2aR3E4 zjssoScUa;zIdOeGHBnH13G)W-zt$kUQgNfG;96b=v&4NzRt&@7nN%v3HsG`<<+F$cumMs448N!W3r&2Z*b~D5^$^d6Jxn@SFK5Q8*uKSR7x{I|H-_N1f+AD zSYC5@2K4OKL$==F9U@CH;ONNL(W}oZICHn;d?~pw?GRIsH*x-68Oy6SuK`)`{E)46 z9^3(-HXa#X89SBv?u_YP)WjsQrp;}0X?Bxrvf12IKW8>3t`e~W9|JS<{btTNbNT@EQIWBSNJTX8AMGXD z-SsH|s#>j9Xf~VMtyT-YMD}5^SWHTY5->o`k|d#AE_YQd79j`%GMS7FNvG3b7^Vy9 zn0HYCJy5MyQLoqKnW|JOp-?D*<2V^msZ>BOv0ANd2n7t@{=V;sZrQ>3c})5_%ms4z z7!qXwHHe~!QFj8aR~&*-3F?O|;#(ESIXP~Os%|~y^7c15*q5`gz2-5ol!fU92NIGT z_ves+>+Tf3gfcL?!nimYmR}cw*|BGULzI^7!;k#3K^YO#;!+vM@N~(99+<;fdqr zYPJm+pXYFYk;neQyXXEcTQDNQx57i`Okp9A#n?<7!{#tnKJdsF>utb@JH7dU01gfL zEK2hoPZAnO5+je3&^i*hWM`qCW^vLK!O*?U-#IvXV?#6koWqrwnD{j&K`7N>^tR3G z8zr1(qVOzcF#nF1&0MZ5C$l8*E^Uth0000zE0Ay_3@1Z_7#f-XWL#E{8Al7>L$ z0Rx7lnddoqAyfT%&#`$;v0@*5YdW3w z7mLNoa=FAshK% zDiy@zakyMAxr-H?iQDZi^!t5;Eno2A=?>mMx`Vg(Z!?<53LHLvfTPa`$mjDcX*Qdv zR;ylN4OH+m)fVX&Z#yZpUae;ss@a$K&})gHovkhr@w#xyPVlfVgXti1_357y%I-UHDvRWYvPEX+#g+j4Q9ayba zh7uQN1j%HQgA=Fp9DfODAU^*3*FCs^6IpO7xg`RUXyP)(;=d!ly=#I^l3e0Cub`{H Z`5PU3+D2e&<<>s`J(VpX#y^kqzQ;#=2x({YMw9Q&ndHT&`BD$#%Ql?{+)-OuSA`r}MWJ zVg+2Gc(GW}a=BERPNy^;kEz$|38dTYlFQ{%5S!g@|8f8D_!Nu9_Ni2glF1}xG8xi! zorc39&F6EPOeWOt_XS`W2H_Bo$MXugy}SEctJQj=(TLXTHL(jRXfzs>NF=0SHk;94 zF!&HjdZNX(3U3;LY64IMX__Xv%_wjLC!J2`0Jw?X=zPK$C$`&dYPDKaC={e16bcE@ zgun^<0k;ak*=xLE)@(Lqu~MmsFoMCLY&0Qog`NO(h@kyxaA%EbwJLy8sU*Vi`~52K zX0wrqW;_LmMq@evX4iAM9Od(Q0eHP$1%L|xAh@vrqB`HPQLon}f3aAka=9!3hr=O- z5F9`#J_7Jhah=U(4RjaRhkS4Xkk98kDz-`i!r|~~AQ1TFcDw(@<8g{aBE)l)PNxNE zI(RPyc>9e{@WGSMU%i7*v{!&P$WLz25)0oc=Dl-yy%xYZAm4b-rttL7UjR#%`#j_F R;_m(?iiXTHIMmcoLoO94I8;j@ zv^2DJ5#orqydFJX|Gm$_Bi_vyew+j6{r}$Qc@D1%fQqeAhJj)1!z4pP83k2MV2~s! zSt^w(<#HLFVBg_#xz1W8ioi(WY&Hu~6zil?DI^jJgu`K35(hkP)H%@Imesbg#5!Ps_$Ni*SiR8&sKb9?M`0-mH)gtg&YgRX#*TXz@Z+| z;|2H@xzE0TfuORhuO2k6#K8#sW^J`mQ0+E@$K`QkFV+DTlI$w{GJ;zid{*v9xeIe_ z$|Bp`@iKkgoFK3{4Z)#DWKV~W4K@5WZN+Ql_7%YxNqSx7%cWud&cX>)_PvD*UzxZg a%Kia9Rjz_59@~-t0000)l$0ECbfb-0$}>7z|u>IvuoHEmW&j4lzv=KA+EpIObc7e7{sGA)QVmnM@*^ z%|h38^m;wC+ilpk%>l#V5LCqP_y2_Cayd^XlX;j*r54R*lW!zbqtSpQNyz8(JVmWm zyV4S$2{Uhyc{Cb0QQbf{ZGT{Kr zvJi{K_&f+q^Pv4MK$hhS4TgFj_FD*rLOePdE-E^T7ZzTFCRUB`*?9&h(a#C!-v8lWG#k3AOJQaUey6Oasked^kDPe=Khg@7s584 zg`XfS1)&u*_c;I76#%`kkBfiZgKKo@0)9d6vZw=ExQUtV?eW{Y1Xv}=4X(2zy85d> Y0C^(qLv?Ui{{R3007*qoM6N<$f-gW7od5s; diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_edit.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_edit.png deleted file mode 100644 index b93e77600def75c9a144d3d0a5088a62c02cbb0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmV-w0+s!VP)$>5Y&axjp2O=VLu>*f>1L;s0)kkvKC!*u?s6CVL=HJ6oP~pNfZc; zsKr=bq;7MITw8NXw{SZm%59TId2x_9BQ zV86`NuvGI!>o^V!Na!=$7GJE{Cq`b+XwknM{UcGHFTTfmuS+ zm-zYC!P3+zmY;SG$?!fYkOih`QYaLxyF}A86h$GGN}kFj)_o*0e zjPMP%zTG7FYMAfO2Nn1D`D0Cj?Wl>5q%@CE10nX)KxpNmwk+!IWkzywiYD( zqUXiYYIq3qcRyMGJ;IY`(Gz~E$J$zu2+R{)xGlE*88b3WK6V*J>}2iPY1HH|tER0W z_+^^FdppY?o)Gt5M2`%xwRDH@R3G}^i1l4|6uchm0X0f!@&YdVLB5K&dd7Rv{)DXX zt^&vP;}kqj3f>94j+4xd93>s|Q!Ezi>?r8(Il$P}PFxSqu{d*!Y%*#cX(R0f|Juz# z3o0_xI14Al->1uky@W-rCI_%l&>PK^TXNSN{byMk2AI5vbwp!K-%-@!-vPR3iikL1L7HA!^!~ChCFU#lnGzp88=I z67V8PHBo4(l$u?-AKmT8?#_0rKW9dUNRbpLc`}piywAM9$xZ-3fR1C75T(BjCn-l* zjUcci2oXXo-}iqun@#)+`W@kL_-U&|2>MxZy~3IdmRm&8b)9!2%ksg3R)nNnT*TJOC=6{2hG86Dz+<^p6qfG5$i^UNUh+u)CD7O2 zK>Ioazn;U|+X0x$=feveYZL1W*Fm%e5P1sajd#eW#^5(ddx76*pt$^)b}$Q4oPabL zLc^HF>Z{8za;f$LtN0P$6C?1{X*jtXkRJ8IEeyiSzencvH3Ux_y>y^}wfJrRCQN#9 z?&e+C>sSAfrE%mZD5RfZ`gSndD)=P?+nG5Oq$zmY&-v+gc7R6c0u8^Ke#|XOq?gF@othF3zFpM8Il<8BJrWqBtF>b#_ye4{0)Xbu6j&@UIhRE002ov JPDHLkV1nWI9dZBw diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_excel.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_excel.png deleted file mode 100644 index b977d7e52e2446ea01201c5c7209ac3a05f12c9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 663 zcmV;I0%-k-P)^@R5;6x zlTS!gQ5431_q{u#M2 zg&W%y6a}>qj1Z|7Vu&-DW6d~k-n;jnHsjb-q#u0C^W!_5^C=MlKq<8oNCQ6qS00!X z5eI;XP=g!^f}j{hku}E1zZ?XCjE;`p19k(Rh%^AQQ54xysU+ocx$c#f61Z4HnT#3u~FR(3>BnZniMIF4DouI8Hi4u>cAK%EN)5PO(ip3(% zIgBx+QYirR){Z8QwV$9Z(Mpt=L-Or3#bf-G@66}txq0yc*T(zNTBDT0T8rO^JeNbSI-Tzf5!pBioy4NwAN^?iN#{;fH1Jke4Xa`^fR8m z%h6dq%xX)S?7`zae))(Xst^Scp6B8FejQW?RLTM8@0=vnnntuRGBM2dpo>gbCnTD= z^<;=JuqdSf@O>Z8^XdR?s+KEfhDdB_#ahFj^giCtzT(s8kA$AViyTqaAR;KGaLzUU z<=GqA4bRwpX|IG~*x>pZ!@zLr`XQ`od>m(`;jz|M_*1GDO#$7;n74ppb8=eiqh760 x0yt}J1#p`gw$`o!R{d7zU9~!Un@nJV{4bstt4Au+Up@c;002ovPDHLkV1kWhGjjj{ diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_find.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_find.png deleted file mode 100644 index 581843637079359a6a58fcdccf0763690c67b063..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 676 zcmV;V0$crwP)_k3`4d{s8lK_6bi^@vq&To98fNoK}7)fx$e2^Y&@<^jR_Ee+8}KG;X`@ z@bCyiolqX>bb1ZIs%QGnjzFU~L8H~d?e;*XP(h(S262}XyZ3a0h07r{KV?E70l+e- zE`%3x|M5#q+;HOC(h@A^M)7Rn13dm0&>K$j%k_F4wOWlsNCIH+!c_#{eS&TL8v4yc zcpnPEY`cQzZ$ILq{U-MA6Z6Z|1p!FZjQ}tXSb25J@HphEqX-6Hqo?-_Zn@{d#>2Ml zJGhxTAd&emK$lV-QK&VM&ix0Xy{GyS3Wp(+E1^8BhD3T0a)m-Lw@Lu4zQRrP)9(3F z^>$hh@N>OAXrmPYunLi|fJ$_*5i`46;M>~*5D{bp>-OL3{+!MJa`3kv~Q#QfQ%c z)1s}QE<_XaYBG;IuRF=td#+}fi4h(6HgoUyJLi0t(*dA^B)%@8kkG&bdM5P5^Z5WF z%d%>m^SbN0XeV)wbUOXn5Ag#A$gJx+7-OCkMM1S%MWIlTkbFLmOeW(&n&wUd&;`>p zVcRy$Z{K0=?SpNnP^;BYEEXleFbq(UY&LrXX$6qkJ~)8+b{=jj3HEXds;Z(?D%}}L zX3`39&dy=Zyar!ehA}e>w)(*vrCct{PI9^2Jpj&OZS8<3-@{0(gNv%1{)zAiLY+_^ zl}e>Ofd4&#Irj#7>=o=Uhv5IJ@?sN0^J|(WL2Uun$4}si6}TG-s3T#p&6GE<<2W)O zf{^Y2HlO#*QDvTp3v&d@;8*}aUC4lisG9(w7@d5Y8y)}U#FwCkqp*Mcgme4{&gGRf zlBfd`nF9cQBKB2_L{F8G2)7pAf$i)Ds`|}-c>pc^LRW{w4SQ)3N^BbZx)6BlCZts! zKph%`(m#xg-q3I7=(us;9<)*2%iuQ1J`oV3gU6V~T}^JU5714JN33&GwEEru0d}Uo U{MPL+lmGw#07*qoM6N<$f^vibe*gdg diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_freehand.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_freehand.png deleted file mode 100644 index 8d719df5205f7415ce657e5c277db4533c82f346..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 639 zcmV-_0)YLAP)p{{sC7)XB-g4w*W1a1)XtvxrMYa1o?wn&v~3 zHnC|#(>B_M1d`_7gfzLiHy=0c<2kQQdXu*33(xYN_xYW39(cz9jEVT%VokB8|DoF~ z8u%Q5sdl@4VB7X#uh+v_;yOGY&pRi?378ghv)P1cngiAAb<}D#l*?rWDV0j_dc6Zk z-|P~AJZQCA=yWcQjG8fYnimzj*3KqTfN0Cy!G^$7)+bQ$+mHVd1J zvwOR^5Lm<|R+uyB1Nu4vL?d4qa3tn?9H7SZH@~u=fFHEDfSH|bHU6kh0O3%cLdyny z{`9S2Sw~WMy0MPy!64i`jdk4Z3>^+KIL_fN2V_d&ywBt`^IJpxUI$=YAph~5`;xCe Z{s%Y0vkUXDnO6V+002ovPDHLkV1loX8z=w( diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_gear.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_gear.png deleted file mode 100644 index 106f5aa3611a4807ec8c21701c631730275089a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 402 zcmV;D0d4+?P)<@FR}JvtGRKa0_WfK^c7uXaFH3q@Y!Hnl8VySc`OtkPN3;#l*y*l23+99h*9JzA00}rAC!#M1dZ#v9YOBH|eC*${MmzzYjBu!!-< zK8tujf&(6i)1biy*F>4{f*Kd(IU-JsG&#b_@NgTnx@40)2@2%c;*=?-2Za=}O}7&( w%_K#(S>e1j&gfY?mR})n>>0+8p`iTe2d1K2h8#$+)&Kwi07*qoM6N<$f(2cptN;K2 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_get.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_get.png deleted file mode 100644 index e4a1ecba1b60e54f3777717ed105cdde745b7184..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 516 zcmV+f0{i`mP)o)wchR-92qq~y6`XqbKmElbB3z{pkZs0VPF`CFvS?7jDn^mFo>d9Y&06* z&1MsS!M-CH3ee+h_sy)Ms%B*ec3R0RpVi9?*mU84yoq(Bw8 z<4(999dJJE!V%pWT~HGRIAb;(#O%2K3?uRpz}AfgE8e9q&OSdr^e^}lC$QXZz;S2A z)w>^oHy>?v)q--`!pmuBe96PxP0u*inQvyFW(llfv9 zXV1s*Jh`y2H%B3ZTA(AzpsQ?hb6_PyZ=c1?_B4fbl>G%!@ubJln=!)x0000#DY{xaiib^#X=YT4@yE_&2#eBulEdzjE`u&@G%2(&u{J-<}d(^uY4W_kMfEX z@!X)AR9F&FL?RJyJRUzvBoeqN{5kY`z3wcM0+du73~_0|*lac! z42Dw(Eg1o{Ash}P8jXrqN+1w`*XxDD;ShmPCZC7#4;wWbHoMvBl$=zF-`?*9j*Nbjd=v@OWt_BgKxP-3wd zy37?ATx&$b+&zRM!K;BD%Okw`Sb@&Pak8$KRX19jWZmC0&n*Ggv%j8nvSPDFw zEkV65AGOoBQ8kf`R|}Px*&INNS%osq9b{Fq2I(x6@xM>tg=vRLF?I`0rWzHyRc>}g~)F_Qn`A>)C_iwK%Z zrIJ;xR)UI1Y4Ozts|-Nho;q zVk9-bX)%F~!;63iu$Fk=VJn3~fmb5S@@)ZqjBT2{f`vT`b2}zxb0$o;EF@G3&BHK^ zc)`1kUzo^Qkk$?KFKHNBD?nP-MJ3b@&4fg;g5l2wMi^g?9qj+~@b;62o_U1_S1J`g z7m^UMg25FX1MJ5AQxAJ5F5WDt=$=-@JV-!LHA2vuxl9kN>PS8x??^AINH6LjF*#nbk4}=n3gfWp$kEX5IpHS zYiQ{@d7Nl&d$#+7-TckP&Q}N91e-C#5QQ<|d}62BjvZR2H60wE-&H<>}%WqH(_V;zPbB1rgSSSC(0? zWlQ#?N3UgnJ9m2C29w!SwoOo5_2Iq!<8vCyEoDoj@#oV($oJEg6Bj@;nD|2g8 s%L|>IZ381yx9RvPhV4J)*SeoEV4lyr#k*`nfWBbxboFyt=akR{0DpOPi2wiq diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_key.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_key.png deleted file mode 100644 index d61648452284da1bc28b10385f95b5d2bf027901..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 616 zcmV-u0+;=XP)-tZUVHjYHp;RjQ0M0pRlXN=mLv{hk9Ebp9&~+Wj-T9IkpzWPWd#fZ)d=zV^~S`;LE*!&u-?g42^wwN&Xr1~#d5ifl_2*B1OoS}CDno^8a50ArfE8;stQF>AP54J@H~%T zFz84s;dO!QJKD36(~!QOg!t_^gfFcSKDU4yK0+Ypg$NT^mIYcQ6bk*3P(lBLh7Df_ zTu=2xC#+-_%)|{Cv8zz0t|0y4D5M`xAc{gwOKc`ou<*&VjUREFHs1qd<_xSkKeTBt zgyCi=@jj;&Ns^GsWWaIUl0Y2azcDlF@u{(P*!+EH;lnU~b|Lv{4|4Hdkh!qoQHiE$ zY#y>KFA0QEw=4Z|uV{0A^`Y=D}hB$GP&<$bi8q(u;p^0(my3Rz7fP}|# zGZ&#uor4@c3q9r|f?H6-UZmfgKx(iV(MQ`MPWB>iC~SxnN5H*zb*A3#zWwgu&c|}3 zn^g87H{pdeasl%Lhmab&jC?lES}7C?4BFDNA<}20hoY@w_IU%i*T;}}wh!589}7~7 z#Ug`-R~4j&+K_y4kW@X7qLr-)S5qVKU)tO;+kXJ++{vPI@{hVK|PhMVVx_`)vx~zUs}c9O-Ok{00000NkvXXu0mjf DS5_-g diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_link.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_link.png deleted file mode 100644 index bf7bd1c9bfd78d689c73ba67cf914182933ee68c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 614 zcmV-s0-61ZP)OOAS;jTeL{ZSdz-%)SMH9tDF;N4B6%j=d15J&5qy`F#vB?Ar zqS1nH@%ny_XSI*Y>) z1f5QYdmzT>YciP<3WehS<{GovEaLGv27>{*-7f0&I$yJ^L%ZGPv1YT$V|u;*+ZCWz ztHI~CDVsuy($SfR6-`N~K?9GTB#l%%0h7 z-q`K-y~E)+s8lMyTrPL8^_pUo)9G|SluG5pPqw6!LJB_PzyJUM07*qoM6N<$f^=yZ AYybcN diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_magnify.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_magnify.png deleted file mode 100644 index f6b74cc40f82fc83e4dfa6e9647ccc1b34e6ed7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 554 zcmV+_0@eMAP)Vb2f>2}Fa82O3m(Ob=t*sniin`NpInLyMJgI`saru@YOPfh zy4g0#G*cV!#N%;Gq9_VH9?v%kjS3Rb1j8^;C={$Gp=lbj z*(?%?geA!5^Pok%UauwjA)v4g2`HedDw4_Mk4hhBQt?e7YJ5(hcj|3dNu^TOPGnjB zTTsqd3GIZ=Bb`n=7no)dflv&K(lsWw?lH6T1Yht0F9qgIuzh}ym0%n<3d3EBWB*pg z+G!I0lbAEXyd>k|QNuwr4=KX1D+tLPv)j@C1=N4sA4NF9A>HcO3G47*Y6!+SrUH-7 z1hb;^#S=r|`aMh>J#dWruAEf}gcR(DRUC`ZUev&$Sbh0SgLiTXeeHEU<$_YV;9281 zym`igIE%Sm8DpDw7@71Tv^EB5xSdUR*0$Mqp+Wq8OoaZtOg52&)zZ;;M=7#C1Yd6x svjx>8ad4e2x|*xHHwRjcjs6zA0XLDUqKT6dS^xk507*qoM6N<$f*wetruo^Ag2=LamM1T#~4RmC^m`_ zs}H7d&XJ}mg+hU?tu0noRvyjI&o2SRAeYZFesYkts79I^jJ7!A7%6nJwq8O?iT55M z1OQ` zbL{!Cp5o*IRmE9PInMCSPjTwfT~J+EYkz}tjxY=fg5Yf6EQ@DG$0kMJ9h^&$W}9BU zP1oj2;?MWVkKIEl)r=Y;L^Cx2q|>!)qJJ8zE7-V*-Cf7V8_2#1c0N975t~+&QUpQJ z5(uo(-O_`%Rj@U@t>JYAgd!>L?0Idxtd#oW2gc!jinsAEva8|kF4#Ic**mmml_{d^$s}Q5Q)KCys4sfck5bP1SyeHwh2`A<@N&t2j0^lgHC_^(pAAPCNjwl+>AN%C4Ll>_8Hjda%9 oS~i=#*e)>KsPlg0=2)Qg6BCqJ=F8HdGXMYp07*qoM6N<$f@i)wr~m)} diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_office.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_office.png deleted file mode 100644 index a65bcb3e1e9613cd9e4950850db43d7025a5fdf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 779 zcmV+m1N8ifP)JNR5;6x zll@CmQ5eTZ^k*a#RQf}fVOdd`5NJh6S(>6Cf$wEW#f&JyAR#GAn9>Gml;nOf3WCDa z5({5&UB$(IF?G#$x4X@Ickg!Y-HU!Z_rzX=qAq-XI_LS^=lOCT0|0{#{kBkYDS7{3 zD`iu%E=`cDX_^#^#n$5SIQ|4Zhsk8>N|zXHXG@*41$i-7`Jr{8`3S_OEcmY|RF48wXkk?WpdVM4OePBSbfh z#4_=eXJg@3epx~gi>QbUmO}Bm(ENN3+@c?jWiKvSrm(o|W}Ud*?vy~fn1!V~Cl4kB zI-;c!8f~-v)jX82%EG($>?;KSD$64f2&4qQ#=Yyrcpy$57RAVuV#vKMP)0hT$r6m# zc^F^XaJ8R9Q|}x^NoJYIvYZkq-z}Tnj@UJK2l2H zG}p+VvtjP2Z%bsb$~7QLJ9#pC0dKi`ppOd^_V;ME6tdzC0PtV|r=@e@37O`%0k^=5^`%cf$eu00N17Ro!{^30krz>a%3j34C?*{Mt2^a4~ zK=P+Qq%|f;Tc&+9ps;@Mw`EE%rgs&#y=j6BUGg96oIqdwj9-fiy*N(|@o)eD002ov JPDHLkV1j#pUPb@_ diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_paint.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_paint.png deleted file mode 100644 index 23a37b891c2f5faa3b8128d45373ceab794ca609..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 688 zcmV;h0#E&kP)PK^TXt2QS_@2qt2T|9~baC-vaPn=ziepcfAwB$0!O2Q)E}1e8!q+9)KT5JVKU z7HNY}h##OS-BxWHWjD0wrPDeEfUClHs%Q6&2u@FTOJkKMQN|_Rlw6rQz$gPzqGNtj z#ruSeFeh835JJFiM6vp@6M5bXj%k7CMt%SIwfbF_fD-3*Os`9Ly_Q3WQ_SX33E{pX z9_WIeeTCGQ3wYALpBcK+P-iuw;3i&7xCua37k5# z`>c`M@sGeC7cdsdz`aE9lOz!hPholbyz%T85LYf6O*@SA+9&+^7k>+4M8$A8iNQq{ zQvn8k?-+dU`Z@gK0z$EtPV#+`^OH`R@cE-cuE&_!D)SZGxmQxeobP_Zwq zMEgi6ePN45N`|V1so0uE8^}1xw8s;VM%Ai@7} z2-&Cyvez_-O4?6uv{zTaj|YeYEk34i~K@`8YW2g{x* zc;7z3lItpVy_et{Z-ZZ)<@*%{l7Ao8mu@V7*gz<_1##mwW*%LEwCdzNsVLYx2*T-J z#HeQ*_a=R~KDdVNk$EVgAIRl$oQi_(`_IrdJciDpH|Xe{K-YsMtc!cRnFi$qzsr4z z5*$;ecov%3->1{YNy6-Gf(Ecy&_I$CjI#laeuE+S120^|Vjsf)W&i*H07*qoM6N<$ Ef)^4A_ab^avY?n0hpS-#mn_4{O$e%cm-@NH=3`90Wq+3`~HKArSdfX`&Z12 z(CY$VW-MNtXX4xy%yUeE?}*~0-|iByA@ZrwXgph4S*bhcc5{HB!DFVm_v}P*g7+Q~K}7K0lcp(^N@X>U zV`{ZpeIf${R6Hgg4FL^`X$Eu75k(PE6ycl$AW0Ic)#@rR7Z(7;V?i-dR1K935Jgcx zPfkwK>2wGokf!Nih^ARp6-6arYFG#(9Ta!x93nFEjoA==z(g?#sDg?Owk?Mg7K+>l zWYsf(<`#+$h9Sp6gFOg_dd+80SkUpk&xM7h0`Sov9W73spU;GP073|VfZ&Gd$J$*0<~TV5aPS|qWH57|VJz+d0000vYep8SaFV10Q$h+;hIUPX_=v5b}%>Tm<(&j1&5;I!55C)oN0s(P%ZB zP3Q#ahfpXKWF@S?jm4U#fv)QovMhrriclyNs6-G12#3R##4PSZ0VY(dRWJ;Lwuq{# zAW0Gwi$yA^R4RZ!;W+L`f&%x{=D^VK#BBWL4Ys{;*!A7Q;!=dN<&D8*GzGaF4`hV4 zDbY0{NrMX>ZqF=0((gR5-zL$kC*b)!fwu{Euru|XrG<$^n#@)7i_>rCmRxnDq>$Y%gJaCkRd|tE*a2x05Pe!I^e13o69#&RQZ36s0 zB=O|K2Yi(jsMqThn}9t?f5E-)L^naZ+db$&%M$!bCdm=jv7?t_lB?3&%Ltq(>ESw? c;MI421LCcoDG!2@;{X5v07*qoM6N<$f`UZt7XSbN diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_picture.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_picture.png deleted file mode 100644 index 134b6693687b2fa5fe36d48a9c0b8001f937c741..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 650 zcmV;50(Jd~P)VHAd+bMNh~)LLRqN>D)-jd9UvB%+hyKX5U|&4t0)fzgD-MPpQ$nHU%yoz=vI zMGb>1Xu!6Hw$NT~@Au<4P-+{9;Uw?&oj31uzH>xX0T7Xkz!(tn|Ed9-s_FqyReC13 z(ll)vW1O{Ck5ihay12Ob2ABc@RUI;zHpaMiyRDs0r>|D4rHw{ItJSJnYjt~jTbGuW z`X(~}?!&86q40R8<4zYw;$qi0^3ec=c&<&H;r`8W%H=Xymf^i;Wo6~<+}zx2UMzpC z*6MZN?(FMv`n|KO3(KFiUaucP0;Z!@LcUNa%8#vGK5aZ>wDgB0Gi=t*argWJcdlMQ z2#MpEX0wU+9&0U?N(F#OgpviU_Y{jYMsj65U3|PjwUOY}lUYj?MTiK_Il}NCVx-Eh zDx-TzMk7se+M#W_>?A1-x}ZXw3kkyz5kW)_hkjsi@RhKadN#H$Hq)$07*qoM6N<$f}lhwPXGV_ diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_powerpoint.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_powerpoint.png deleted file mode 100644 index c4eff0387d5888c638ba09473ba6d2369f7b56f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 588 zcmV-S0<-;zP)HU2HvUSp%6 z*n}iP63IK?dpo;h@sj9~pcxo;VVTc-XLiP@DgefqE#NE=@oyUd-&HjLpsLIuSFXV-EMck)oQ(A`s%*^&wf0(rNiNHsU%=0Rw;WC z(kbc37l6fo`-0uR!pYkYv8U^3?nsh^@pw!K0TH3uYyx1_2>|JbXPmfskJ|1YAw9w! z9`N)1^Aesr;y5Nr5-ODn)oOL|CGi}f9!&iVwpK$khlIX10X$H6^A_stBJqvLhU$?V`QXqKme*s~gVDJ4A;LTs_e15jhc1;By a82kqHEPVYFAD2!50000JNR5;6( zlS@kiVHAe7MZY2;Xi-5)WxDDgv@tCUl*&p14T@Z~3ThM5LP4tuQfLu@EnG;nXc<8S z6&3BN?fx-cv-Kp6>HRiNTHE>$X( zD&=w+?GWC>?RLAGC6Yix;an~UmSt)tSf}1VS6N1N2ONORdD? zaj}w6DAZZdOud9Ep?M?{iQWbE5^9HLLZZF|1kdy0Tu4InEuboP9@nvbZ-P0n4AZTy zyMRIxRDmUE#LdqYuD=-Qz4N^bC`_#S7vcLn1M}{J(Wl3#c4VWczu&)AjUlh(11>gp>f`wv{KnjF%!aA*Jk N002ovPDHLkV1kkt*XsZP diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_ruby.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_ruby.png deleted file mode 100644 index f59b7c4365fa1720af1aa04eb47167ddaa6eeed4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 626 zcmV-&0*(ENP)ZS(e|#C2>JN4>y}l*tQ*E7zP@R2CCJnkW?xa6bgk%(hgtZ z0=~d?U3i`+Mvi4!&~+WPT1^NX#{u6&QIx+DE(oR{&T5&-ovF?@wGw)P&AtpHZa|G%V*GUUqL@@!d4V$`8=##4)ytY959JG zdc&Kho)&AL70^i z!PEmeeDWCB-UbK(*4JST44^tV2z_J(dn~+vBMJT97_7rzFio=~XczIv?PQ5$v%u~y zu(bteXb5I1h2zCV{Jc2~V{{yzZipgsP6;k264$*#5q?GzCm|CPa9CKqm4b116h3Pu z?+%Cm52plC8|5P0@igf2GV1KkCfk{Zecu=G@VNrf>s%g9c5D%@cfxVb6$nY`1IW=4 zt10QqSps_2JLp0f3I0j0u>#qA;v!+T))KEbCg|mo3q0pG{OR}p0fPds8+K~d>Hq)$ M07*qoM6N<$g1S2e3jhEB diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_stack.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_stack.png deleted file mode 100644 index 44084add79b9a0fc3354d16bbd4b4b5ff8095da7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$R@9E+gqH(@-qA%AW0|7U8+xDRI z0k`B18}ImRw2g{jTGP$Pmx3yI6F_2s&$|`cJ!i0UN zB3H;=r{#{FwLaNVJ&hZl9+MTHGx1T^-A=Q0?hRb#8a~x50X%;`b6ik3cw=#XdxWy= zgrpBoDjpwP&g9<9h3x!k_B!?vuTJVkmIJ-U N;OXk;vd$@?2>|rNdMN+^ diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_star.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_star.png deleted file mode 100644 index 3a1441c9a12062a4bb3d706000d3ca14399aebca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmV-50?Pe~P)SCZIX8XZzY2l?gCw6LlgWJ5Avz#QX4|&mI8LN)w~J1vgL=KLAhlWz*=#m~gyvxa z&;iC6gb?aZvMdXxX`<0+D1hs_pqJ!wxqlEH;CJ)je~uL(gpi@v>!I0f_Kl=E(E+Tq z26na*9gribxx-Oft(HnstyXUUy!39&E-cI%J5Rsy;(PGZH{g{ty!HVC&yGPT3H8x# zw{^gBPW)O0FMoh{k%l<`1a|To_Wl&u&-GXm8izU|&<&utILc4wc6s@u1bmTz6x{qg zTw@7=FQRcg&r`h+gcR$*Jbv+*DPk7v)B@e0o2 z6IlBXW&8xh@9)YKiV~2>+z&XKd24JT55YWz&JtfvCg4r^~bLP79-yS@n$OW00000NkvXXu0mjf DStt2z diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_swoosh.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_swoosh.png deleted file mode 100644 index e7708292adabf4821612bfca032cbd019c63180b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 634 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 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_width.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_width.png deleted file mode 100644 index 1eb880947ddf3e745c29e8d9dc90f09c7e6e323c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$R?&;zfqH(@;q9b3Efq-lM(nr^( z=EYR73-9e)UYMWsXy%?aZsD68Yyv^2$~6QgEcljw%kx>O(f-gQ?@fOOx3A-0+Qw?O zRx~W)kn~Qe2d6f9nMG#g9Q04Mk==M~N!Dglvxk!fgVh#w@ZV$IY1+Xc`d{d2UcaP~ zfWp)_Ivqj}l2SPy^9ZWy6rG9Yx4v67_uA&&9|XA~5-#3)W3%em1peD8RWH^#O%XoM zxMPud%}GTj#~*+7JMxTd!`{^Q+>(D3*|@KV`*G2;{QnANOxu1$r2xIe;OXk;vd$@? F2>@zac~<}c diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_word.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_word.png deleted file mode 100644 index ae8ecbf47672a874c0958d0d113a56162c2bd364..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 651 zcmV;60(AX}P)hkjP zNW|QGv-YFNLN^qH@tJycPNG5ti6B7;r4mEr#lr@*T8*M85D`{ZR^BWwF23T<%MYIh zdC)S*p=|xk^!~H=+HSZ183~y8v4|mYmZxt&)5{{~>J`>E223Q5>T$=~mtA71q-jdG z+eJhOAyBW^0k9Gk1+rX8)zFx((CG^&tDY>6XaS~Fy!WJON|Gdujg5^~Vzt@o%BcYLiNiTQSD`zL^ociBz_>bDlpw3kriQ@Z`bVsGz-_6N>$&gTDiKDTKR^ z-hB*tHa^>!oD~5TK^0UK5rZ}RBm50Bv}S-yA%s=Ha5RYb{)!z2N&$&64gfhybBu8p lh~_|?8^bu;BRYt{<}Yrwd83Y=s?Goa002ovPDHLkV1l%3CP4rI diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_world.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_world.png deleted file mode 100644 index 6ed2490ed1432d5d667a76235360824a1088e928..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 734 zcmV<40wMj0P)JT{hN;C#tgf#9krG=I>5!<*aE1_(spcgF}<`n4i zJi-}^6UUeU4jUFwdCiVPDm%`Zx^UBa8J(mnR6wEgz^}o8;)M*Y(@l_!Kfv)}4+NuM zaPXE50z)r)9=D=SR|RIqfQ^j}Hu!fzMeQBo+@PZk1G8hOw|vBTvkx`HM)Xe9q3xao z@`p0`NO!2904FHSLA6E@Y-O6zH$DQzvq@aHsz}}<(!v(Z_+EodX%R&NZW75g+nENo zV0020rxE^;7d!067AN>6*+&YLp$9uH6F-=In`XC{Cn%+o|5)b&boEPr02w@|P*oGm QmjD0&07*qoM6N<$g78X0Q~&?~ diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_wrench.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_wrench.png deleted file mode 100644 index fecadd08afed92536be91ab12d8e37b6bf410d5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 613 zcmV-r0-F7aP)wK%m(L+9IV|s|#(WRl-O^4GvaQsnHq|OstfO zIJ3}3<01}YGARE4m!7=)QisvlHUo!Qymx-@-t*p_129Ko-#pVI)6#!*kLj-AGXWNR zyA_{wKii_amK7^YT-v z6#plaNm#8`-kz@OvjIt^4%IN{@J3bR zRI}ME1Mv85p|%;RK>ViR>APPLB4;;BpCtqE@P+*7!G>I4UjNx~e>r3HA^tWCQ@S)l z{BslcSwL-CxQ&_ZZSv_g0Tu{yi*X){Mt|W7)lbE`SQxFP00000NkvXXu0mjf;)M*S diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_zip.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_zip.png deleted file mode 100644 index fd4bbccdf1643f4ff5022fbc59b82546e259317e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 386 zcmV-|0e$|7P)_QM!1S$Bhw4w+iRuFWf;tfR6D%SMJrb+tx zC9R6{2>Ou6#juIy6u(I?|;&Owi$sRB4^20apB5xE2 z#B9XekY66S6lzfCL!eEQRgo0LokTA55@Y#%_wN!TXPw^Q4IIXsG~v#u_4t;x_HM16EQ@QRY+rut&97&UefsPmLrQ5P zBC2kcbux9L%2bJz$P$XV$*zSxb2e@6_3O#;&!FD<&hLjGn%~%en;7)djE^d6!t$lW7GyIOKlQ46hr`Z zjLNuRDP_53dNoN?wd&HMgL^m1DXFU<5dQsrceN>fSz00000)O9XRTN^$%%`*Fg>ryDtc(lF@?b>dE!20r+y z#Q*>(wbV5H`-E4Do={CJp7=ERhw15hgZi)?jRG88 zzVz(5;g?Td1izJyO33bhjg2Qc7FVY@f9!o)Gu?DII~vm-Dc?}3M!fsgjP?F(7`rgg z+xOk8XD)e?Zl=5+un`5!7kr?F=eq)K-5uqr%yU$1hLv){Vlm=)*5~`lwMciiXFu*g z)*Jkz6AF>#zb(Vx`Iv{bdGZHtlW)v(y5k^|xgSUc9%0}S20nrYrO}78ofk?bV!5)4 z=Ngz@+$9N1>>mA%IWx`Fqa240bWkiW;2TZgd8CZS0U}@mknC;!2;wi$eI@`h0y2JS`Eae0CW}q(2(%!m8 zWq$`PDU>LT1_y*bBv#P5<@q0@ttz$hIH}YMDvAigCc=y*)jY-VOpTd;A8@3t7Xh4r z0KTWOk;N2Ox4!&&^4B*no$WtTX!BXB)rg!y8dvGgKBQKLJNXRRp0}Bsjd1|LNQX~c zbC~fjrk2iL@4dYF*vt;}dFn(%h)n_-vzEIHMOKRkdF%3Lq|zBgKm_h>TEq!))nWjq zzn;B!?!(dQcHu$#=JF`cS&W~C`WHFW^B!~MI#k)>1Vk&eQy8P1O`J6V04{D@|7d6^ zyBABnh-d^H0FX&L07M||E0n_dp4v&Q%PSE9p#R#Hq)`5I_(B5CE#q dxjPz0{s-<+c#AC!i7@~G002ovPDHLkV1iPlpuqqD diff --git a/node_modules/express/node_modules/connect/lib-cov/public/style.css b/node_modules/express/node_modules/connect/lib-cov/public/style.css deleted file mode 100644 index 32b6507..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/public/style.css +++ /dev/null @@ -1,141 +0,0 @@ -body { - margin: 0; - padding: 80px 100px; - font: 13px "Helvetica Neue", "Lucida Grande", "Arial"; - background: #ECE9E9 -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fff), to(#ECE9E9)); - background: #ECE9E9 -moz-linear-gradient(top, #fff, #ECE9E9); - background-repeat: no-repeat; - color: #555; - -webkit-font-smoothing: antialiased; -} -h1, h2, h3 { - margin: 0; - font-size: 22px; - color: #343434; -} -h1 em, h2 em { - padding: 0 5px; - font-weight: normal; -} -h1 { - font-size: 60px; -} -h2 { - margin-top: 10px; -} -h3 { - margin: 5px 0 10px 0; - padding-bottom: 5px; - border-bottom: 1px solid #eee; - font-size: 18px; -} -ul { - margin: 0; - padding: 0; -} -ul li { - margin: 5px 0; - padding: 3px 8px; - list-style: none; -} -ul li:hover { - cursor: pointer; - color: #2e2e2e; -} -ul li .path { - padding-left: 5px; - font-weight: bold; -} -ul li .line { - padding-right: 5px; - font-style: italic; -} -ul li:first-child .path { - padding-left: 0; -} -p { - line-height: 1.5; -} -a { - color: #555; - text-decoration: none; -} -a:hover { - color: #303030; -} -#stacktrace { - margin-top: 15px; -} -.directory h1 { - margin-bottom: 15px; - font-size: 18px; -} -ul#files { - width: 100%; - height: 500px; -} -ul#files li { - padding: 0; -} -ul#files li img { - position: absolute; - top: 5px; - left: 5px; -} -ul#files li a { - position: relative; - display: block; - margin: 1px; - width: 30%; - height: 25px; - line-height: 25px; - text-indent: 8px; - float: left; - border: 1px solid transparent; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - overflow: hidden; - text-overflow: ellipsis; -} -ul#files li a.icon { - text-indent: 25px; -} -ul#files li a:focus, -ul#files li a:hover { - outline: none; - background: rgba(255,255,255,0.65); - border: 1px solid #ececec; -} -ul#files li a.highlight { - -webkit-transition: background .4s ease-in-out; - background: #ffff4f; - border-color: #E9DC51; -} -#search { - display: block; - position: fixed; - top: 20px; - right: 20px; - width: 90px; - -webkit-transition: width ease 0.2s, opacity ease 0.4s; - -moz-transition: width ease 0.2s, opacity ease 0.4s; - -webkit-border-radius: 32px; - -moz-border-radius: 32px; - -webkit-box-shadow: inset 0px 0px 3px rgba(0, 0, 0, 0.25), inset 0px 1px 3px rgba(0, 0, 0, 0.7), 0px 1px 0px rgba(255, 255, 255, 0.03); - -moz-box-shadow: inset 0px 0px 3px rgba(0, 0, 0, 0.25), inset 0px 1px 3px rgba(0, 0, 0, 0.7), 0px 1px 0px rgba(255, 255, 255, 0.03); - -webkit-font-smoothing: antialiased; - text-align: left; - font: 13px "Helvetica Neue", Arial, sans-serif; - padding: 4px 10px; - border: none; - background: transparent; - margin-bottom: 0; - outline: none; - opacity: 0.7; - color: #888; -} -#search:focus { - width: 120px; - opacity: 1.0; -} diff --git a/node_modules/express/node_modules/connect/lib-cov/utils.js b/node_modules/express/node_modules/connect/lib-cov/utils.js deleted file mode 100644 index 2200dce..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/utils.js +++ /dev/null @@ -1,282 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['utils.js']) { - _$jscoverage['utils.js'] = []; - _$jscoverage['utils.js'][13] = 0; - _$jscoverage['utils.js'][26] = 0; - _$jscoverage['utils.js'][27] = 0; - _$jscoverage['utils.js'][39] = 0; - _$jscoverage['utils.js'][40] = 0; - _$jscoverage['utils.js'][41] = 0; - _$jscoverage['utils.js'][54] = 0; - _$jscoverage['utils.js'][55] = 0; - _$jscoverage['utils.js'][56] = 0; - _$jscoverage['utils.js'][57] = 0; - _$jscoverage['utils.js'][73] = 0; - _$jscoverage['utils.js'][74] = 0; - _$jscoverage['utils.js'][95] = 0; - _$jscoverage['utils.js'][96] = 0; - _$jscoverage['utils.js'][97] = 0; - _$jscoverage['utils.js'][98] = 0; - _$jscoverage['utils.js'][101] = 0; - _$jscoverage['utils.js'][112] = 0; - _$jscoverage['utils.js'][113] = 0; - _$jscoverage['utils.js'][132] = 0; - _$jscoverage['utils.js'][133] = 0; - _$jscoverage['utils.js'][147] = 0; - _$jscoverage['utils.js'][148] = 0; - _$jscoverage['utils.js'][149] = 0; - _$jscoverage['utils.js'][166] = 0; - _$jscoverage['utils.js'][167] = 0; - _$jscoverage['utils.js'][168] = 0; - _$jscoverage['utils.js'][169] = 0; - _$jscoverage['utils.js'][184] = 0; - _$jscoverage['utils.js'][185] = 0; - _$jscoverage['utils.js'][186] = 0; - _$jscoverage['utils.js'][187] = 0; - _$jscoverage['utils.js'][188] = 0; - _$jscoverage['utils.js'][189] = 0; - _$jscoverage['utils.js'][190] = 0; - _$jscoverage['utils.js'][191] = 0; - _$jscoverage['utils.js'][192] = 0; - _$jscoverage['utils.js'][196] = 0; - _$jscoverage['utils.js'][208] = 0; - _$jscoverage['utils.js'][209] = 0; - _$jscoverage['utils.js'][222] = 0; - _$jscoverage['utils.js'][223] = 0; - _$jscoverage['utils.js'][224] = 0; - _$jscoverage['utils.js'][225] = 0; - _$jscoverage['utils.js'][226] = 0; - _$jscoverage['utils.js'][228] = 0; - _$jscoverage['utils.js'][239] = 0; - _$jscoverage['utils.js'][240] = 0; - _$jscoverage['utils.js'][241] = 0; - _$jscoverage['utils.js'][242] = 0; - _$jscoverage['utils.js'][267] = 0; - _$jscoverage['utils.js'][276] = 0; - _$jscoverage['utils.js'][277] = 0; - _$jscoverage['utils.js'][278] = 0; - _$jscoverage['utils.js'][279] = 0; - _$jscoverage['utils.js'][292] = 0; - _$jscoverage['utils.js'][293] = 0; - _$jscoverage['utils.js'][305] = 0; - _$jscoverage['utils.js'][306] = 0; - _$jscoverage['utils.js'][307] = 0; - _$jscoverage['utils.js'][308] = 0; - _$jscoverage['utils.js'][319] = 0; - _$jscoverage['utils.js'][320] = 0; - _$jscoverage['utils.js'][321] = 0; - _$jscoverage['utils.js'][322] = 0; - _$jscoverage['utils.js'][334] = 0; - _$jscoverage['utils.js'][335] = 0; - _$jscoverage['utils.js'][346] = 0; - _$jscoverage['utils.js'][347] = 0; - _$jscoverage['utils.js'][350] = 0; - _$jscoverage['utils.js'][351] = 0; - _$jscoverage['utils.js'][355] = 0; - _$jscoverage['utils.js'][358] = 0; - _$jscoverage['utils.js'][369] = 0; - _$jscoverage['utils.js'][370] = 0; - _$jscoverage['utils.js'][371] = 0; - _$jscoverage['utils.js'][372] = 0; - _$jscoverage['utils.js'][374] = 0; - _$jscoverage['utils.js'][386] = 0; -} -_$jscoverage['utils.js'][13]++; -var http = require("http"), crypto = require("crypto"), parse = require("url").parse, signature = require("cookie-signature"); -_$jscoverage['utils.js'][26]++; -exports.hasBody = (function (req) { - _$jscoverage['utils.js'][27]++; - return "transfer-encoding" in req.headers || "content-length" in req.headers; -}); -_$jscoverage['utils.js'][39]++; -exports.mime = (function (req) { - _$jscoverage['utils.js'][40]++; - var str = req.headers["content-type"] || ""; - _$jscoverage['utils.js'][41]++; - return str.split(";")[0]; -}); -_$jscoverage['utils.js'][54]++; -exports.error = (function (code, msg) { - _$jscoverage['utils.js'][55]++; - var err = new Error(msg || http.STATUS_CODES[code]); - _$jscoverage['utils.js'][56]++; - err.status = code; - _$jscoverage['utils.js'][57]++; - return err; -}); -_$jscoverage['utils.js'][73]++; -exports.md5 = (function (str, encoding) { - _$jscoverage['utils.js'][74]++; - return crypto.createHash("md5").update(str).digest(encoding || "hex"); -}); -_$jscoverage['utils.js'][95]++; -exports.merge = (function (a, b) { - _$jscoverage['utils.js'][96]++; - if (a && b) { - _$jscoverage['utils.js'][97]++; - for (var key in b) { - _$jscoverage['utils.js'][98]++; - a[key] = b[key]; -} - } - _$jscoverage['utils.js'][101]++; - return a; -}); -_$jscoverage['utils.js'][112]++; -exports.escape = (function (html) { - _$jscoverage['utils.js'][113]++; - return String(html).replace(/&(?!\w+;)/g, "&").replace(//g, ">").replace(/"/g, """); -}); -_$jscoverage['utils.js'][132]++; -exports.uid = (function (len) { - _$jscoverage['utils.js'][133]++; - return crypto.randomBytes(Math.ceil(len * 3 / 4)).toString("base64").slice(0, len); -}); -_$jscoverage['utils.js'][147]++; -exports.sign = (function (val, secret) { - _$jscoverage['utils.js'][148]++; - console.warn("do not use utils.sign(), use https://github.com/visionmedia/node-cookie-signature"); - _$jscoverage['utils.js'][149]++; - return val + "." + crypto.createHmac("sha256", secret).update(val).digest("base64").replace(/=+$/, ""); -}); -_$jscoverage['utils.js'][166]++; -exports.unsign = (function (val, secret) { - _$jscoverage['utils.js'][167]++; - console.warn("do not use utils.unsign(), use https://github.com/visionmedia/node-cookie-signature"); - _$jscoverage['utils.js'][168]++; - var str = val.slice(0, val.lastIndexOf(".")); - _$jscoverage['utils.js'][169]++; - return exports.sign(str, secret) == val? str: false; -}); -_$jscoverage['utils.js'][184]++; -exports.parseSignedCookies = (function (obj, secret) { - _$jscoverage['utils.js'][185]++; - var ret = {}; - _$jscoverage['utils.js'][186]++; - Object.keys(obj).forEach((function (key) { - _$jscoverage['utils.js'][187]++; - var val = obj[key]; - _$jscoverage['utils.js'][188]++; - if (0 == val.indexOf("s:")) { - _$jscoverage['utils.js'][189]++; - val = signature.unsign(val.slice(2), secret); - _$jscoverage['utils.js'][190]++; - if (val) { - _$jscoverage['utils.js'][191]++; - ret[key] = val; - _$jscoverage['utils.js'][192]++; - delete obj[key]; - } - } -})); - _$jscoverage['utils.js'][196]++; - return ret; -}); -_$jscoverage['utils.js'][208]++; -exports.parseSignedCookie = (function (str, secret) { - _$jscoverage['utils.js'][209]++; - return 0 == str.indexOf("s:")? signature.unsign(str.slice(2), secret): str; -}); -_$jscoverage['utils.js'][222]++; -exports.parseJSONCookies = (function (obj) { - _$jscoverage['utils.js'][223]++; - Object.keys(obj).forEach((function (key) { - _$jscoverage['utils.js'][224]++; - var val = obj[key]; - _$jscoverage['utils.js'][225]++; - var res = exports.parseJSONCookie(val); - _$jscoverage['utils.js'][226]++; - if (res) { - _$jscoverage['utils.js'][226]++; - obj[key] = res; - } -})); - _$jscoverage['utils.js'][228]++; - return obj; -}); -_$jscoverage['utils.js'][239]++; -exports.parseJSONCookie = (function (str) { - _$jscoverage['utils.js'][240]++; - if (0 == str.indexOf("j:")) { - _$jscoverage['utils.js'][241]++; - try { - _$jscoverage['utils.js'][242]++; - return JSON.parse(str.slice(2)); - } - catch (err) { - } - } -}); -_$jscoverage['utils.js'][267]++; -exports.pause = require("pause"); -_$jscoverage['utils.js'][276]++; -exports.removeContentHeaders = (function (res) { - _$jscoverage['utils.js'][277]++; - Object.keys(res._headers).forEach((function (field) { - _$jscoverage['utils.js'][278]++; - if (0 == field.indexOf("content")) { - _$jscoverage['utils.js'][279]++; - res.removeHeader(field); - } -})); -}); -_$jscoverage['utils.js'][292]++; -exports.conditionalGET = (function (req) { - _$jscoverage['utils.js'][293]++; - return req.headers["if-modified-since"] || req.headers["if-none-match"]; -}); -_$jscoverage['utils.js'][305]++; -exports.unauthorized = (function (res, realm) { - _$jscoverage['utils.js'][306]++; - res.statusCode = 401; - _$jscoverage['utils.js'][307]++; - res.setHeader("WWW-Authenticate", "Basic realm=\"" + realm + "\""); - _$jscoverage['utils.js'][308]++; - res.end("Unauthorized"); -}); -_$jscoverage['utils.js'][319]++; -exports.notModified = (function (res) { - _$jscoverage['utils.js'][320]++; - exports.removeContentHeaders(res); - _$jscoverage['utils.js'][321]++; - res.statusCode = 304; - _$jscoverage['utils.js'][322]++; - res.end(); -}); -_$jscoverage['utils.js'][334]++; -exports.etag = (function (stat) { - _$jscoverage['utils.js'][335]++; - return "\"" + stat.size + "-" + Number(stat.mtime) + "\""; -}); -_$jscoverage['utils.js'][346]++; -exports.parseCacheControl = (function (str) { - _$jscoverage['utils.js'][347]++; - var directives = str.split(","), obj = {}; - _$jscoverage['utils.js'][350]++; - for (var i = 0, len = directives.length; i < len; i++) { - _$jscoverage['utils.js'][351]++; - var parts = directives[i].split("="), key = parts.shift().trim(), val = parseInt(parts.shift(), 10); - _$jscoverage['utils.js'][355]++; - obj[key] = isNaN(val)? true: val; -} - _$jscoverage['utils.js'][358]++; - return obj; -}); -_$jscoverage['utils.js'][369]++; -exports.parseUrl = (function (req) { - _$jscoverage['utils.js'][370]++; - var parsed = req._parsedUrl; - _$jscoverage['utils.js'][371]++; - if (parsed && parsed.href == req.url) { - _$jscoverage['utils.js'][372]++; - return parsed; - } - else { - _$jscoverage['utils.js'][374]++; - return req._parsedUrl = parse(req.url); - } -}); -_$jscoverage['utils.js'][386]++; -exports.parseBytes = require("bytes"); -_$jscoverage['utils.js'].source = ["","/*!"," * Connect - utils"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var http = require('http')"," , crypto = require('crypto')"," , parse = require('url').parse"," , signature = require('cookie-signature');","","/**"," * Return `true` if the request has a body, otherwise return `false`."," *"," * @param {IncomingMessage} req"," * @return {Boolean}"," * @api private"," */","","exports.hasBody = function(req) {"," return 'transfer-encoding' in req.headers || 'content-length' in req.headers;","};","","/**"," * Extract the mime type from the given request's"," * _Content-Type_ header."," *"," * @param {IncomingMessage} req"," * @return {String}"," * @api private"," */","","exports.mime = function(req) {"," var str = req.headers['content-type'] || '';"," return str.split(';')[0];","};","","/**"," * Generate an `Error` from the given status `code`"," * and optional `msg`."," *"," * @param {Number} code"," * @param {String} msg"," * @return {Error}"," * @api private"," */","","exports.error = function(code, msg){"," var err = new Error(msg || http.STATUS_CODES[code]);"," err.status = code;"," return err;","};","","/**"," * Return md5 hash of the given string and optional encoding,"," * defaulting to hex."," *"," * utils.md5('wahoo');"," * // => \"e493298061761236c96b02ea6aa8a2ad\""," *"," * @param {String} str"," * @param {String} encoding"," * @return {String}"," * @api private"," */","","exports.md5 = function(str, encoding){"," return crypto"," .createHash('md5')"," .update(str)"," .digest(encoding || 'hex');","};","","/**"," * Merge object b with object a."," *"," * var a = { foo: 'bar' }"," * , b = { bar: 'baz' };"," * "," * utils.merge(a, b);"," * // => { foo: 'bar', bar: 'baz' }"," *"," * @param {Object} a"," * @param {Object} b"," * @return {Object}"," * @api private"," */","","exports.merge = function(a, b){"," if (a && b) {"," for (var key in b) {"," a[key] = b[key];"," }"," }"," return a;","};","","/**"," * Escape the given string of `html`."," *"," * @param {String} html"," * @return {String}"," * @api private"," */","","exports.escape = function(html){"," return String(html)"," .replace(/&(?!\\w+;)/g, '&amp;')"," .replace(/</g, '&lt;')"," .replace(/>/g, '&gt;')"," .replace(/\"/g, '&quot;');","};","","","/**"," * Return a unique identifier with the given `len`."," *"," * utils.uid(10);"," * // => \"FDaS435D2z\""," *"," * @param {Number} len"," * @return {String}"," * @api private"," */","","exports.uid = function(len) {"," return crypto.randomBytes(Math.ceil(len * 3 / 4))"," .toString('base64')"," .slice(0, len);","};","","/**"," * Sign the given `val` with `secret`."," *"," * @param {String} val"," * @param {String} secret"," * @return {String}"," * @api private"," */","","exports.sign = function(val, secret){"," console.warn('do not use utils.sign(), use https://github.com/visionmedia/node-cookie-signature')"," return val + '.' + crypto"," .createHmac('sha256', secret)"," .update(val)"," .digest('base64')"," .replace(/=+$/, '');","};","","/**"," * Unsign and decode the given `val` with `secret`,"," * returning `false` if the signature is invalid."," *"," * @param {String} val"," * @param {String} secret"," * @return {String|Boolean}"," * @api private"," */","","exports.unsign = function(val, secret){"," console.warn('do not use utils.unsign(), use https://github.com/visionmedia/node-cookie-signature')"," var str = val.slice(0, val.lastIndexOf('.'));"," return exports.sign(str, secret) == val"," ? str"," : false;","};","","/**"," * Parse signed cookies, returning an object"," * containing the decoded key/value pairs,"," * while removing the signed key from `obj`."," *"," * @param {Object} obj"," * @return {Object}"," * @api private"," */","","exports.parseSignedCookies = function(obj, secret){"," var ret = {};"," Object.keys(obj).forEach(function(key){"," var val = obj[key];"," if (0 == val.indexOf('s:')) {"," val = signature.unsign(val.slice(2), secret);"," if (val) {"," ret[key] = val;"," delete obj[key];"," }"," }"," });"," return ret;","};","","/**"," * Parse a signed cookie string, return the decoded value"," *"," * @param {String} str signed cookie string"," * @param {String} secret"," * @return {String} decoded value"," * @api private"," */","","exports.parseSignedCookie = function(str, secret){"," return 0 == str.indexOf('s:')"," ? signature.unsign(str.slice(2), secret)"," : str;","};","","/**"," * Parse JSON cookies."," *"," * @param {Object} obj"," * @return {Object}"," * @api private"," */","","exports.parseJSONCookies = function(obj){"," Object.keys(obj).forEach(function(key){"," var val = obj[key];"," var res = exports.parseJSONCookie(val);"," if (res) obj[key] = res;"," });"," return obj;","};","","/**"," * Parse JSON cookie string"," *"," * @param {String} str"," * @return {Object} Parsed object or null if not json cookie"," * @api private"," */","","exports.parseJSONCookie = function(str) {"," if (0 == str.indexOf('j:')) {"," try {"," return JSON.parse(str.slice(2));"," } catch (err) {"," // no op"," }"," }","};","","/**"," * Pause `data` and `end` events on the given `obj`."," * Middleware performing async tasks _should_ utilize"," * this utility (or similar), to re-emit data once"," * the async operation has completed, otherwise these"," * events may be lost."," *"," * var pause = utils.pause(req);"," * fs.readFile(path, function(){"," * next();"," * pause.resume();"," * });"," *"," * @param {Object} obj"," * @return {Object}"," * @api private"," */","","exports.pause = require('pause');","","/**"," * Strip `Content-*` headers from `res`."," *"," * @param {ServerResponse} res"," * @api private"," */","","exports.removeContentHeaders = function(res){"," Object.keys(res._headers).forEach(function(field){"," if (0 == field.indexOf('content')) {"," res.removeHeader(field);"," }"," });","};","","/**"," * Check if `req` is a conditional GET request."," *"," * @param {IncomingMessage} req"," * @return {Boolean}"," * @api private"," */","","exports.conditionalGET = function(req) {"," return req.headers['if-modified-since']"," || req.headers['if-none-match'];","};","","/**"," * Respond with 401 \"Unauthorized\"."," *"," * @param {ServerResponse} res"," * @param {String} realm"," * @api private"," */","","exports.unauthorized = function(res, realm) {"," res.statusCode = 401;"," res.setHeader('WWW-Authenticate', 'Basic realm=\"' + realm + '\"');"," res.end('Unauthorized');","};","","/**"," * Respond with 304 \"Not Modified\"."," *"," * @param {ServerResponse} res"," * @param {Object} headers"," * @api private"," */","","exports.notModified = function(res) {"," exports.removeContentHeaders(res);"," res.statusCode = 304;"," res.end();","};","","/**"," * Return an ETag in the form of `\"<size>-<mtime>\"`"," * from the given `stat`."," *"," * @param {Object} stat"," * @return {String}"," * @api private"," */","","exports.etag = function(stat) {"," return '\"' + stat.size + '-' + Number(stat.mtime) + '\"';","};","","/**"," * Parse the given Cache-Control `str`."," *"," * @param {String} str"," * @return {Object}"," * @api private"," */","","exports.parseCacheControl = function(str){"," var directives = str.split(',')"," , obj = {};",""," for(var i = 0, len = directives.length; i < len; i++) {"," var parts = directives[i].split('=')"," , key = parts.shift().trim()"," , val = parseInt(parts.shift(), 10);",""," obj[key] = isNaN(val) ? true : val;"," }",""," return obj;","};","","/**"," * Parse the `req` url with memoization."," *"," * @param {ServerRequest} req"," * @return {Object}"," * @api private"," */","","exports.parseUrl = function(req){"," var parsed = req._parsedUrl;"," if (parsed && parsed.href == req.url) {"," return parsed;"," } else {"," return req._parsedUrl = parse(req.url);"," }","};","","/**"," * Parse byte `size` string."," *"," * @param {String} size"," * @return {Number}"," * @api private"," */","","exports.parseBytes = require('bytes');"]; diff --git a/node_modules/express/node_modules/connect/lib/cache.js b/node_modules/express/node_modules/connect/lib/cache.js deleted file mode 100644 index 052fcdb..0000000 --- a/node_modules/express/node_modules/connect/lib/cache.js +++ /dev/null @@ -1,81 +0,0 @@ - -/*! - * Connect - Cache - * Copyright(c) 2011 Sencha Inc. - * MIT Licensed - */ - -/** - * Expose `Cache`. - */ - -module.exports = Cache; - -/** - * LRU cache store. - * - * @param {Number} limit - * @api private - */ - -function Cache(limit) { - this.store = {}; - this.keys = []; - this.limit = limit; -} - -/** - * Touch `key`, promoting the object. - * - * @param {String} key - * @param {Number} i - * @api private - */ - -Cache.prototype.touch = function(key, i){ - this.keys.splice(i,1); - this.keys.push(key); -}; - -/** - * Remove `key`. - * - * @param {String} key - * @api private - */ - -Cache.prototype.remove = function(key){ - delete this.store[key]; -}; - -/** - * Get the object stored for `key`. - * - * @param {String} key - * @return {Array} - * @api private - */ - -Cache.prototype.get = function(key){ - return this.store[key]; -}; - -/** - * Add a cache `key`. - * - * @param {String} key - * @return {Array} - * @api private - */ - -Cache.prototype.add = function(key){ - // initialize store - var len = this.keys.push(key); - - // limit reached, invalidate LRU - if (len > this.limit) this.remove(this.keys.shift()); - - var arr = this.store[key] = []; - arr.createdAt = new Date; - return arr; -}; diff --git a/node_modules/express/node_modules/connect/lib/connect.js b/node_modules/express/node_modules/connect/lib/connect.js deleted file mode 100644 index a067e24..0000000 --- a/node_modules/express/node_modules/connect/lib/connect.js +++ /dev/null @@ -1,93 +0,0 @@ - -/*! - * Connect - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var EventEmitter = require('events').EventEmitter - , proto = require('./proto') - , utils = require('./utils') - , path = require('path') - , basename = path.basename - , fs = require('fs'); - -// node patches - -require('./patch'); - -// expose createServer() as the module - -exports = module.exports = createServer; - -/** - * Framework version. - */ - -exports.version = '2.7.2'; - -/** - * Expose mime module. - */ - -exports.mime = require('./middleware/static').mime; - -/** - * Expose the prototype. - */ - -exports.proto = proto; - -/** - * Auto-load middleware getters. - */ - -exports.middleware = {}; - -/** - * Expose utilities. - */ - -exports.utils = utils; - -/** - * Create a new connect server. - * - * @return {Function} - * @api public - */ - -function createServer() { - function app(req, res){ app.handle(req, res); } - utils.merge(app, proto); - utils.merge(app, EventEmitter.prototype); - app.route = '/'; - app.stack = []; - for (var i = 0; i < arguments.length; ++i) { - app.use(arguments[i]); - } - return app; -}; - -/** - * Support old `.createServer()` method. - */ - -createServer.createServer = createServer; - -/** - * Auto-load bundled middleware with getters. - */ - -fs.readdirSync(__dirname + '/middleware').forEach(function(filename){ - if (!/\.js$/.test(filename)) return; - var name = basename(filename, '.js'); - function load(){ return require('./middleware/' + name); } - exports.middleware.__defineGetter__(name, load); - exports.__defineGetter__(name, load); -}); diff --git a/node_modules/express/node_modules/connect/lib/index.js b/node_modules/express/node_modules/connect/lib/index.js deleted file mode 100644 index 2618ddc..0000000 --- a/node_modules/express/node_modules/connect/lib/index.js +++ /dev/null @@ -1,50 +0,0 @@ - -/** - * Connect is a middleware framework for node, - * shipping with over 18 bundled middleware and a rich selection of - * 3rd-party middleware. - * - * var app = connect() - * .use(connect.logger('dev')) - * .use(connect.static('public')) - * .use(function(req, res){ - * res.end('hello world\n'); - * }) - * .listen(3000); - * - * Installation: - * - * $ npm install connect - * - * Middleware: - * - * - [logger](logger.html) request logger with custom format support - * - [csrf](csrf.html) Cross-site request forgery protection - * - [compress](compress.html) Gzip compression middleware - * - [basicAuth](basicAuth.html) basic http authentication - * - [bodyParser](bodyParser.html) extensible request body parser - * - [json](json.html) application/json parser - * - [urlencoded](urlencoded.html) application/x-www-form-urlencoded parser - * - [multipart](multipart.html) multipart/form-data parser - * - [timeout](timeout.html) request timeouts - * - [cookieParser](cookieParser.html) cookie parser - * - [session](session.html) session management support with bundled MemoryStore - * - [cookieSession](cookieSession.html) cookie-based session support - * - [methodOverride](methodOverride.html) faux HTTP method support - * - [responseTime](responseTime.html) calculates response-time and exposes via X-Response-Time - * - [staticCache](staticCache.html) memory cache layer for the static() middleware - * - [static](static.html) streaming static file server supporting `Range` and more - * - [directory](directory.html) directory listing middleware - * - [vhost](vhost.html) virtual host sub-domain mapping middleware - * - [favicon](favicon.html) efficient favicon server (with default icon) - * - [limit](limit.html) limit the bytesize of request bodies - * - [query](query.html) automatic querystring parser, populating `req.query` - * - [errorHandler](errorHandler.html) flexible error handler - * - * Links: - * - * - list of [3rd-party](https://github.com/senchalabs/connect/wiki) middleware - * - GitHub [repository](http://github.com/senchalabs/connect) - * - [test documentation](https://github.com/senchalabs/connect/blob/gh-pages/tests.md) - * - */ \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/lib/middleware/basicAuth.js b/node_modules/express/node_modules/connect/lib/middleware/basicAuth.js deleted file mode 100644 index 0205812..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/basicAuth.js +++ /dev/null @@ -1,103 +0,0 @@ - -/*! - * Connect - basicAuth - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var utils = require('../utils') - , unauthorized = utils.unauthorized; - -/** - * Basic Auth: - * - * Enfore basic authentication by providing a `callback(user, pass)`, - * which must return `true` in order to gain access. Alternatively an async - * method is provided as well, invoking `callback(user, pass, callback)`. Populates - * `req.user`. The final alternative is simply passing username / password - * strings. - * - * Simple username and password - * - * connect(connect.basicAuth('username', 'password')); - * - * Callback verification - * - * connect() - * .use(connect.basicAuth(function(user, pass){ - * return 'tj' == user & 'wahoo' == pass; - * })) - * - * Async callback verification, accepting `fn(err, user)`. - * - * connect() - * .use(connect.basicAuth(function(user, pass, fn){ - * User.authenticate({ user: user, pass: pass }, fn); - * })) - * - * @param {Function|String} callback or username - * @param {String} realm - * @api public - */ - -module.exports = function basicAuth(callback, realm) { - var username, password; - - // user / pass strings - if ('string' == typeof callback) { - username = callback; - password = realm; - if ('string' != typeof password) throw new Error('password argument required'); - realm = arguments[2]; - callback = function(user, pass){ - return user == username && pass == password; - } - } - - realm = realm || 'Authorization Required'; - - return function(req, res, next) { - var authorization = req.headers.authorization; - - if (req.user) return next(); - if (!authorization) return unauthorized(res, realm); - - var parts = authorization.split(' '); - - if (parts.length !== 2) return next(400); - - var scheme = parts[0] - , credentials = new Buffer(parts[1], 'base64').toString() - , index = credentials.indexOf(':'); - - if ('Basic' != scheme || index < 0) return next(400); - - var user = credentials.slice(0, index) - , pass = credentials.slice(index + 1); - - // async - if (callback.length >= 3) { - var pause = utils.pause(req); - callback(user, pass, function(err, user){ - if (err || !user) return unauthorized(res, realm); - req.user = req.remoteUser = user; - next(); - pause.resume(); - }); - // sync - } else { - if (callback(user, pass)) { - req.user = req.remoteUser = user; - next(); - } else { - unauthorized(res, realm); - } - } - } -}; - diff --git a/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js b/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js deleted file mode 100644 index 9f692cd..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js +++ /dev/null @@ -1,61 +0,0 @@ - -/*! - * Connect - bodyParser - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var multipart = require('./multipart') - , urlencoded = require('./urlencoded') - , json = require('./json'); - -/** - * Body parser: - * - * Parse request bodies, supports _application/json_, - * _application/x-www-form-urlencoded_, and _multipart/form-data_. - * - * This is equivalent to: - * - * app.use(connect.json()); - * app.use(connect.urlencoded()); - * app.use(connect.multipart()); - * - * Examples: - * - * connect() - * .use(connect.bodyParser()) - * .use(function(req, res) { - * res.end('viewing user ' + req.body.user.name); - * }); - * - * $ curl -d 'user[name]=tj' http://local/ - * $ curl -d '{"user":{"name":"tj"}}' -H "Content-Type: application/json" http://local/ - * - * View [json](json.html), [urlencoded](urlencoded.html), and [multipart](multipart.html) for more info. - * - * @param {Object} options - * @return {Function} - * @api public - */ - -exports = module.exports = function bodyParser(options){ - var _urlencoded = urlencoded(options) - , _multipart = multipart(options) - , _json = json(options); - - return function bodyParser(req, res, next) { - _json(req, res, function(err){ - if (err) return next(err); - _urlencoded(req, res, function(err){ - if (err) return next(err); - _multipart(req, res, next); - }); - }); - } -}; \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/lib/middleware/compress.js b/node_modules/express/node_modules/connect/lib/middleware/compress.js deleted file mode 100644 index 2dc6437..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/compress.js +++ /dev/null @@ -1,147 +0,0 @@ -/*! - * Connect - compress - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var zlib = require('zlib'); - -/** - * Supported content-encoding methods. - */ - -exports.methods = { - gzip: zlib.createGzip - , deflate: zlib.createDeflate -}; - -/** - * Default filter function. - */ - -exports.filter = function(req, res){ - return /json|text|javascript/.test(res.getHeader('Content-Type')); -}; - -/** - * Compress: - * - * Compress response data with gzip/deflate. - * - * Filter: - * - * A `filter` callback function may be passed to - * replace the default logic of: - * - * exports.filter = function(req, res){ - * return /json|text|javascript/.test(res.getHeader('Content-Type')); - * }; - * - * Options: - * - * All remaining options are passed to the gzip/deflate - * creation functions. Consult node's docs for additional details. - * - * - `chunkSize` (default: 16*1024) - * - `windowBits` - * - `level`: 0-9 where 0 is no compression, and 9 is slow but best compression - * - `memLevel`: 1-9 low is slower but uses less memory, high is fast but uses more - * - `strategy`: compression strategy - * - * @param {Object} options - * @return {Function} - * @api public - */ - -module.exports = function compress(options) { - options = options || {}; - var names = Object.keys(exports.methods) - , filter = options.filter || exports.filter; - - return function(req, res, next){ - var accept = req.headers['accept-encoding'] - , write = res.write - , end = res.end - , stream - , method; - - // vary - res.setHeader('Vary', 'Accept-Encoding'); - - // proxy - - res.write = function(chunk, encoding){ - if (!this.headerSent) this._implicitHeader(); - return stream - ? stream.write(new Buffer(chunk, encoding)) - : write.call(res, chunk, encoding); - }; - - res.end = function(chunk, encoding){ - if (chunk) this.write(chunk, encoding); - return stream - ? stream.end() - : end.call(res); - }; - - res.on('header', function(){ - var encoding = res.getHeader('Content-Encoding') || 'identity'; - - // already encoded - if ('identity' != encoding) return; - - // default request filter - if (!filter(req, res)) return; - - // SHOULD use identity - if (!accept) return; - - // head - if ('HEAD' == req.method) return; - - // default to gzip - if ('*' == accept.trim()) method = 'gzip'; - - // compression method - if (!method) { - for (var i = 0, len = names.length; i < len; ++i) { - if (~accept.indexOf(names[i])) { - method = names[i]; - break; - } - } - } - - // compression method - if (!method) return; - - // compression stream - stream = exports.methods[method](options); - - // header fields - res.setHeader('Content-Encoding', method); - res.removeHeader('Content-Length'); - - // compression - - stream.on('data', function(chunk){ - write.call(res, chunk); - }); - - stream.on('end', function(){ - end.call(res); - }); - - stream.on('drain', function() { - res.emit('drain'); - }); - }); - - next(); - }; -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/cookieParser.js b/node_modules/express/node_modules/connect/lib/middleware/cookieParser.js deleted file mode 100644 index 5da23f2..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/cookieParser.js +++ /dev/null @@ -1,62 +0,0 @@ - -/*! - * Connect - cookieParser - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var utils = require('./../utils') - , cookie = require('cookie'); - -/** - * Cookie parser: - * - * Parse _Cookie_ header and populate `req.cookies` - * with an object keyed by the cookie names. Optionally - * you may enabled signed cookie support by passing - * a `secret` string, which assigns `req.secret` so - * it may be used by other middleware. - * - * Examples: - * - * connect() - * .use(connect.cookieParser('optional secret string')) - * .use(function(req, res, next){ - * res.end(JSON.stringify(req.cookies)); - * }) - * - * @param {String} secret - * @return {Function} - * @api public - */ - -module.exports = function cookieParser(secret){ - return function cookieParser(req, res, next) { - if (req.cookies) return next(); - var cookies = req.headers.cookie; - - req.secret = secret; - req.cookies = {}; - req.signedCookies = {}; - - if (cookies) { - try { - req.cookies = cookie.parse(cookies); - if (secret) { - req.signedCookies = utils.parseSignedCookies(req.cookies, secret); - req.signedCookies = utils.parseJSONCookies(req.signedCookies); - } - req.cookies = utils.parseJSONCookies(req.cookies); - } catch (err) { - err.status = 400; - return next(err); - } - } - next(); - }; -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/cookieSession.js b/node_modules/express/node_modules/connect/lib/middleware/cookieSession.js deleted file mode 100644 index 1a23d57..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/cookieSession.js +++ /dev/null @@ -1,115 +0,0 @@ - -/*! - * Connect - cookieSession - * Copyright(c) 2011 Sencha Inc. - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var utils = require('./../utils') - , Cookie = require('./session/cookie') - , debug = require('debug')('connect:cookieSession') - , signature = require('cookie-signature') - , crc32 = require('buffer-crc32'); - -/** - * Cookie Session: - * - * Cookie session middleware. - * - * var app = connect(); - * app.use(connect.cookieParser()); - * app.use(connect.cookieSession({ secret: 'tobo!', cookie: { maxAge: 60 * 60 * 1000 }})); - * - * Options: - * - * - `key` cookie name defaulting to `connect.sess` - * - `secret` prevents cookie tampering - * - `cookie` session cookie settings, defaulting to `{ path: '/', httpOnly: true, maxAge: null }` - * - `proxy` trust the reverse proxy when setting secure cookies (via "x-forwarded-proto") - * - * Clearing sessions: - * - * To clear the session simply set its value to `null`, - * `cookieSession()` will then respond with a 1970 Set-Cookie. - * - * req.session = null; - * - * @param {Object} options - * @return {Function} - * @api public - */ - -module.exports = function cookieSession(options){ - // TODO: utilize Session/Cookie to unify API - options = options || {}; - var key = options.key || 'connect.sess' - , trustProxy = options.proxy; - - return function cookieSession(req, res, next) { - - // req.secret is for backwards compatibility - var secret = options.secret || req.secret; - if (!secret) throw new Error('`secret` option required for cookie sessions'); - - // default session - req.session = {}; - var cookie = req.session.cookie = new Cookie(options.cookie); - - // pathname mismatch - if (0 != req.originalUrl.indexOf(cookie.path)) return next(); - - // cookieParser secret - if (!options.secret && req.secret) { - req.session = req.signedCookies[key] || {}; - } else { - // TODO: refactor - var rawCookie = req.cookies[key]; - if (rawCookie) { - var unsigned = utils.parseSignedCookie(rawCookie, secret); - if (unsigned) { - var originalHash = crc32.signed(unsigned); - req.session = utils.parseJSONCookie(unsigned) || {}; - } - } - } - - res.on('header', function(){ - // removed - if (!req.session) { - debug('clear session'); - cookie.expires = new Date(0); - res.setHeader('Set-Cookie', cookie.serialize(key, '')); - return; - } - - delete req.session.cookie; - - // check security - var proto = (req.headers['x-forwarded-proto'] || '').toLowerCase() - , tls = req.connection.encrypted || (trustProxy && 'https' == proto) - , secured = cookie.secure && tls; - - // only send secure cookies via https - if (cookie.secure && !secured) return debug('not secured'); - - // serialize - debug('serializing %j', req.session); - var val = 'j:' + JSON.stringify(req.session); - - // compare hashes, no need to set-cookie if unchanged - if (originalHash == crc32.signed(val)) return debug('unmodified session'); - - // set-cookie - val = 's:' + signature.sign(val, secret); - val = cookie.serialize(key, val); - debug('set-cookie %j', cookie); - res.setHeader('Set-Cookie', val); - }); - - next(); - }; -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/csrf.js b/node_modules/express/node_modules/connect/lib/middleware/csrf.js deleted file mode 100644 index 5d5e7c6..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/csrf.js +++ /dev/null @@ -1,73 +0,0 @@ -/*! - * Connect - csrf - * Copyright(c) 2011 Sencha Inc. - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var utils = require('../utils'); - -/** - * Anti CSRF: - * - * CRSF protection middleware. - * - * By default this middleware generates a token named "_csrf" - * which should be added to requests which mutate - * state, within a hidden form field, query-string etc. This - * token is validated against the visitor's `req.session._csrf` - * property. - * - * The default `value` function checks `req.body` generated - * by the `bodyParser()` middleware, `req.query` generated - * by `query()`, and the "X-CSRF-Token" header field. - * - * This middleware requires session support, thus should be added - * somewhere _below_ `session()` and `cookieParser()`. - * - * Options: - * - * - `value` a function accepting the request, returning the token - * - * @param {Object} options - * @api public - */ - -module.exports = function csrf(options) { - options = options || {}; - var value = options.value || defaultValue; - - return function(req, res, next){ - // generate CSRF token - var token = req.session._csrf || (req.session._csrf = utils.uid(24)); - - // ignore these methods - if ('GET' == req.method || 'HEAD' == req.method || 'OPTIONS' == req.method) return next(); - - // determine value - var val = value(req); - - // check - if (val != token) return next(403); - - next(); - } -}; - -/** - * Default value function, checking the `req.body` - * and `req.query` for the CSRF token. - * - * @param {IncomingMessage} req - * @return {String} - * @api private - */ - -function defaultValue(req) { - return (req.body && req.body._csrf) - || (req.query && req.query._csrf) - || (req.headers['x-csrf-token']); -} diff --git a/node_modules/express/node_modules/connect/lib/middleware/directory.js b/node_modules/express/node_modules/connect/lib/middleware/directory.js deleted file mode 100644 index 8fa008c..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/directory.js +++ /dev/null @@ -1,228 +0,0 @@ - -/*! - * Connect - directory - * Copyright(c) 2011 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -// TODO: icon / style for directories -// TODO: arrow key navigation -// TODO: make icons extensible - -/** - * Module dependencies. - */ - -var fs = require('fs') - , parse = require('url').parse - , path = require('path') - , normalize = path.normalize - , extname = path.extname - , join = path.join; - -/*! - * Icon cache. - */ - -var cache = {}; - -/** - * Directory: - * - * Serve directory listings with the given `root` path. - * - * Options: - * - * - `hidden` display hidden (dot) files. Defaults to false. - * - `icons` display icons. Defaults to false. - * - `filter` Apply this filter function to files. Defaults to false. - * - * @param {String} root - * @param {Object} options - * @return {Function} - * @api public - */ - -exports = module.exports = function directory(root, options){ - options = options || {}; - - // root required - if (!root) throw new Error('directory() root path required'); - var hidden = options.hidden - , icons = options.icons - , filter = options.filter - , root = normalize(root); - - return function directory(req, res, next) { - if ('GET' != req.method && 'HEAD' != req.method) return next(); - - var accept = req.headers.accept || 'text/plain' - , url = parse(req.url) - , dir = decodeURIComponent(url.pathname) - , path = normalize(join(root, dir)) - , originalUrl = parse(req.originalUrl) - , originalDir = decodeURIComponent(originalUrl.pathname) - , showUp = path != root && path != root + '/'; - - // null byte(s), bad request - if (~path.indexOf('\0')) return next(400); - - // malicious path, forbidden - if (0 != path.indexOf(root)) return next(403); - - // check if we have a directory - fs.stat(path, function(err, stat){ - if (err) return 'ENOENT' == err.code - ? next() - : next(err); - - if (!stat.isDirectory()) return next(); - - // fetch files - fs.readdir(path, function(err, files){ - if (err) return next(err); - if (!hidden) files = removeHidden(files); - if (filter) files = files.filter(filter); - files.sort(); - - // content-negotiation - for (var key in exports) { - if (~accept.indexOf(key) || ~accept.indexOf('*/*')) { - exports[key](req, res, files, next, originalDir, showUp, icons); - return; - } - } - - // not acceptable - next(406); - }); - }); - }; -}; - -/** - * Respond with text/html. - */ - -exports.html = function(req, res, files, next, dir, showUp, icons){ - fs.readFile(__dirname + '/../public/directory.html', 'utf8', function(err, str){ - if (err) return next(err); - fs.readFile(__dirname + '/../public/style.css', 'utf8', function(err, style){ - if (err) return next(err); - if (showUp) files.unshift('..'); - str = str - .replace('{style}', style) - .replace('{files}', html(files, dir, icons)) - .replace('{directory}', dir) - .replace('{linked-path}', htmlPath(dir)); - res.setHeader('Content-Type', 'text/html'); - res.setHeader('Content-Length', str.length); - res.end(str); - }); - }); -}; - -/** - * Respond with application/json. - */ - -exports.json = function(req, res, files){ - files = JSON.stringify(files); - res.setHeader('Content-Type', 'application/json'); - res.setHeader('Content-Length', files.length); - res.end(files); -}; - -/** - * Respond with text/plain. - */ - -exports.plain = function(req, res, files){ - files = files.join('\n') + '\n'; - res.setHeader('Content-Type', 'text/plain'); - res.setHeader('Content-Length', files.length); - res.end(files); -}; - -/** - * Map html `dir`, returning a linked path. - */ - -function htmlPath(dir) { - var curr = []; - return dir.split('/').map(function(part){ - curr.push(part); - return '' + part + ''; - }).join(' / '); -} - -/** - * Map html `files`, returning an html unordered list. - */ - -function html(files, dir, useIcons) { - return '
        ' + files.map(function(file){ - var icon = '' - , classes = []; - - if (useIcons && '..' != file) { - icon = icons[extname(file)] || icons.default; - icon = ''; - classes.push('icon'); - } - - return '
      • ' - + icon + file + '
      • '; - - }).join('\n') + '
      '; -} - -/** - * Load and cache the given `icon`. - * - * @param {String} icon - * @return {String} - * @api private - */ - -function load(icon) { - if (cache[icon]) return cache[icon]; - return cache[icon] = fs.readFileSync(__dirname + '/../public/icons/' + icon, 'base64'); -} - -/** - * Filter "hidden" `files`, aka files - * beginning with a `.`. - * - * @param {Array} files - * @return {Array} - * @api private - */ - -function removeHidden(files) { - return files.filter(function(file){ - return '.' != file[0]; - }); -} - -/** - * Icon map. - */ - -var icons = { - '.js': 'page_white_code_red.png' - , '.c': 'page_white_c.png' - , '.h': 'page_white_h.png' - , '.cc': 'page_white_cplusplus.png' - , '.php': 'page_white_php.png' - , '.rb': 'page_white_ruby.png' - , '.cpp': 'page_white_cplusplus.png' - , '.swf': 'page_white_flash.png' - , '.pdf': 'page_white_acrobat.png' - , 'default': 'page_white.png' -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/errorHandler.js b/node_modules/express/node_modules/connect/lib/middleware/errorHandler.js deleted file mode 100644 index 4a84edc..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/errorHandler.js +++ /dev/null @@ -1,86 +0,0 @@ -/*! - * Connect - errorHandler - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var utils = require('../utils') - , fs = require('fs'); - -// environment - -var env = process.env.NODE_ENV || 'development'; - -/** - * Error handler: - * - * Development error handler, providing stack traces - * and error message responses for requests accepting text, html, - * or json. - * - * Text: - * - * By default, and when _text/plain_ is accepted a simple stack trace - * or error message will be returned. - * - * JSON: - * - * When _application/json_ is accepted, connect will respond with - * an object in the form of `{ "error": error }`. - * - * HTML: - * - * When accepted connect will output a nice html stack trace. - * - * @return {Function} - * @api public - */ - -exports = module.exports = function errorHandler(){ - return function errorHandler(err, req, res, next){ - if (err.status) res.statusCode = err.status; - if (res.statusCode < 400) res.statusCode = 500; - if ('test' != env) console.error(err.stack); - var accept = req.headers.accept || ''; - // html - if (~accept.indexOf('html')) { - fs.readFile(__dirname + '/../public/style.css', 'utf8', function(e, style){ - fs.readFile(__dirname + '/../public/error.html', 'utf8', function(e, html){ - var stack = (err.stack || '') - .split('\n').slice(1) - .map(function(v){ return '
    3. ' + v + '
    4. '; }).join(''); - html = html - .replace('{style}', style) - .replace('{stack}', stack) - .replace('{title}', exports.title) - .replace('{statusCode}', res.statusCode) - .replace(/\{error\}/g, utils.escape(err.toString())); - res.setHeader('Content-Type', 'text/html; charset=utf-8'); - res.end(html); - }); - }); - // json - } else if (~accept.indexOf('json')) { - var error = { message: err.message, stack: err.stack }; - for (var prop in err) error[prop] = err[prop]; - var json = JSON.stringify({ error: error }); - res.setHeader('Content-Type', 'application/json'); - res.end(json); - // plain text - } else { - res.writeHead(res.statusCode, { 'Content-Type': 'text/plain' }); - res.end(err.stack); - } - }; -}; - -/** - * Template title, framework authors may override this value. - */ - -exports.title = 'Connect'; diff --git a/node_modules/express/node_modules/connect/lib/middleware/favicon.js b/node_modules/express/node_modules/connect/lib/middleware/favicon.js deleted file mode 100644 index c57bf34..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/favicon.js +++ /dev/null @@ -1,81 +0,0 @@ - -/*! - * Connect - favicon - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var fs = require('fs') - , utils = require('../utils'); - -/** - * Favicon: - * - * By default serves the connect favicon, or the favicon - * located by the given `path`. - * - * Options: - * - * - `maxAge` cache-control max-age directive, defaulting to 1 day - * - * Examples: - * - * Serve default favicon: - * - * connect() - * .use(connect.favicon()) - * - * Serve favicon before logging for brevity: - * - * connect() - * .use(connect.favicon()) - * .use(connect.logger('dev')) - * - * Serve custom favicon: - * - * connect() - * .use(connect.favicon('public/favicon.ico)) - * - * @param {String} path - * @param {Object} options - * @return {Function} - * @api public - */ - -module.exports = function favicon(path, options){ - var options = options || {} - , path = path || __dirname + '/../public/favicon.ico' - , maxAge = options.maxAge || 86400000 - , icon; // favicon cache - - return function favicon(req, res, next){ - if ('/favicon.ico' == req.url) { - if (icon) { - res.writeHead(200, icon.headers); - res.end(icon.body); - } else { - fs.readFile(path, function(err, buf){ - if (err) return next(err); - icon = { - headers: { - 'Content-Type': 'image/x-icon' - , 'Content-Length': buf.length - , 'ETag': '"' + utils.md5(buf) + '"' - , 'Cache-Control': 'public, max-age=' + (maxAge / 1000) - }, - body: buf - }; - res.writeHead(200, icon.headers); - res.end(icon.body); - }); - } - } else { - next(); - } - }; -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/json.js b/node_modules/express/node_modules/connect/lib/middleware/json.js deleted file mode 100644 index 200006b..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/json.js +++ /dev/null @@ -1,86 +0,0 @@ - -/*! - * Connect - json - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var utils = require('../utils') - , _limit = require('./limit'); - -/** - * noop middleware. - */ - -function noop(req, res, next) { - next(); -} - -/** - * JSON: - * - * Parse JSON request bodies, providing the - * parsed object as `req.body`. - * - * Options: - * - * - `strict` when `false` anything `JSON.parse()` accepts will be parsed - * - `reviver` used as the second "reviver" argument for JSON.parse - * - `limit` byte limit disabled by default - * - * @param {Object} options - * @return {Function} - * @api public - */ - -exports = module.exports = function(options){ - var options = options || {} - , strict = options.strict !== false; - - var limit = options.limit - ? _limit(options.limit) - : noop; - - return function json(req, res, next) { - if (req._body) return next(); - req.body = req.body || {}; - - if (!utils.hasBody(req)) return next(); - - // check Content-Type - if ('application/json' != utils.mime(req)) return next(); - - // flag as parsed - req._body = true; - - // parse - limit(req, res, function(err){ - if (err) return next(err); - var buf = ''; - req.setEncoding('utf8'); - req.on('data', function(chunk){ buf += chunk }); - req.on('end', function(){ - var first = buf.trim()[0]; - - if (0 == buf.length) { - return next(400, 'invalid json, empty body'); - } - - if (strict && '{' != first && '[' != first) return next(400, 'invalid json'); - try { - req.body = JSON.parse(buf, options.reviver); - next(); - } catch (err){ - err.body = buf; - err.status = 400; - next(err); - } - }); - }); - } -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/limit.js b/node_modules/express/node_modules/connect/lib/middleware/limit.js deleted file mode 100644 index 614787d..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/limit.js +++ /dev/null @@ -1,55 +0,0 @@ - -/*! - * Connect - limit - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var utils = require('../utils'); - -/** - * Limit: - * - * Limit request bodies to the given size in `bytes`. - * - * A string representation of the bytesize may also be passed, - * for example "5mb", "200kb", "1gb", etc. - * - * connect() - * .use(connect.limit('5.5mb')) - * .use(handleImageUpload) - * - * @param {Number|String} bytes - * @return {Function} - * @api public - */ - -module.exports = function limit(bytes){ - if ('string' == typeof bytes) bytes = utils.parseBytes(bytes); - if ('number' != typeof bytes) throw new Error('limit() bytes required'); - return function limit(req, res, next){ - var received = 0 - , len = req.headers['content-length'] - ? parseInt(req.headers['content-length'], 10) - : null; - - // self-awareness - if (req._limit) return next(); - req._limit = true; - - // limit by content-length - if (len && len > bytes) return next(413); - - // limit - req.on('data', function(chunk){ - received += chunk.length; - if (received > bytes) req.destroy(); - }); - - next(); - }; -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/logger.js b/node_modules/express/node_modules/connect/lib/middleware/logger.js deleted file mode 100644 index de72244..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/logger.js +++ /dev/null @@ -1,339 +0,0 @@ -/*! - * Connect - logger - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var bytes = require('bytes'); - -/*! - * Log buffer. - */ - -var buf = []; - -/*! - * Default log buffer duration. - */ - -var defaultBufferDuration = 1000; - -/** - * Logger: - * - * Log requests with the given `options` or a `format` string. - * - * Options: - * - * - `format` Format string, see below for tokens - * - `stream` Output stream, defaults to _stdout_ - * - `buffer` Buffer duration, defaults to 1000ms when _true_ - * - `immediate` Write log line on request instead of response (for response times) - * - * Tokens: - * - * - `:req[header]` ex: `:req[Accept]` - * - `:res[header]` ex: `:res[Content-Length]` - * - `:http-version` - * - `:response-time` - * - `:remote-addr` - * - `:date` - * - `:method` - * - `:url` - * - `:referrer` - * - `:user-agent` - * - `:status` - * - * Formats: - * - * Pre-defined formats that ship with connect: - * - * - `default` ':remote-addr - - [:date] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent"' - * - `short` ':remote-addr - :method :url HTTP/:http-version :status :res[content-length] - :response-time ms' - * - `tiny` ':method :url :status :res[content-length] - :response-time ms' - * - `dev` concise output colored by response status for development use - * - * Examples: - * - * connect.logger() // default - * connect.logger('short') - * connect.logger('tiny') - * connect.logger({ immediate: true, format: 'dev' }) - * connect.logger(':method :url - :referrer') - * connect.logger(':req[content-type] -> :res[content-type]') - * connect.logger(function(tokens, req, res){ return 'some format string' }) - * - * Defining Tokens: - * - * To define a token, simply invoke `connect.logger.token()` with the - * name and a callback function. The value returned is then available - * as ":type" in this case. - * - * connect.logger.token('type', function(req, res){ return req.headers['content-type']; }) - * - * Defining Formats: - * - * All default formats are defined this way, however it's public API as well: - * - * connect.logger.format('name', 'string or function') - * - * @param {String|Function|Object} format or options - * @return {Function} - * @api public - */ - -exports = module.exports = function logger(options) { - if ('object' == typeof options) { - options = options || {}; - } else if (options) { - options = { format: options }; - } else { - options = {}; - } - - // output on request instead of response - var immediate = options.immediate; - - // format name - var fmt = exports[options.format] || options.format || exports.default; - - // compile format - if ('function' != typeof fmt) fmt = compile(fmt); - - // options - var stream = options.stream || process.stdout - , buffer = options.buffer; - - // buffering support - if (buffer) { - var realStream = stream - , interval = 'number' == typeof buffer - ? buffer - : defaultBufferDuration; - - // flush interval - setInterval(function(){ - if (buf.length) { - realStream.write(buf.join('')); - buf.length = 0; - } - }, interval); - - // swap the stream - stream = { - write: function(str){ - buf.push(str); - } - }; - } - - return function logger(req, res, next) { - req._startTime = new Date; - - // immediate - if (immediate) { - var line = fmt(exports, req, res); - if (null == line) return; - stream.write(line + '\n'); - // proxy end to output logging - } else { - var end = res.end; - res.end = function(chunk, encoding){ - res.end = end; - res.end(chunk, encoding); - var line = fmt(exports, req, res); - if (null == line) return; - stream.write(line + '\n'); - }; - } - - - next(); - }; -}; - -/** - * Compile `fmt` into a function. - * - * @param {String} fmt - * @return {Function} - * @api private - */ - -function compile(fmt) { - fmt = fmt.replace(/"/g, '\\"'); - var js = ' return "' + fmt.replace(/:([-\w]{2,})(?:\[([^\]]+)\])?/g, function(_, name, arg){ - return '"\n + (tokens["' + name + '"](req, res, "' + arg + '") || "-") + "'; - }) + '";' - return new Function('tokens, req, res', js); -}; - -/** - * Define a token function with the given `name`, - * and callback `fn(req, res)`. - * - * @param {String} name - * @param {Function} fn - * @return {Object} exports for chaining - * @api public - */ - -exports.token = function(name, fn) { - exports[name] = fn; - return this; -}; - -/** - * Define a `fmt` with the given `name`. - * - * @param {String} name - * @param {String|Function} fmt - * @return {Object} exports for chaining - * @api public - */ - -exports.format = function(name, str){ - exports[name] = str; - return this; -}; - -/** - * Default format. - */ - -exports.format('default', ':remote-addr - - [:date] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent"'); - -/** - * Short format. - */ - -exports.format('short', ':remote-addr - :method :url HTTP/:http-version :status :res[content-length] - :response-time ms'); - -/** - * Tiny format. - */ - -exports.format('tiny', ':method :url :status :res[content-length] - :response-time ms'); - -/** - * dev (colored) - */ - -exports.format('dev', function(tokens, req, res){ - var status = res.statusCode - , len = parseInt(res.getHeader('Content-Length'), 10) - , color = 32; - - if (status >= 500) color = 31 - else if (status >= 400) color = 33 - else if (status >= 300) color = 36; - - len = isNaN(len) - ? '' - : len = ' - ' + bytes(len); - - return '\033[90m' + req.method - + ' ' + req.originalUrl + ' ' - + '\033[' + color + 'm' + res.statusCode - + ' \033[90m' - + (new Date - req._startTime) - + 'ms' + len - + '\033[0m'; -}); - -/** - * request url - */ - -exports.token('url', function(req){ - return req.originalUrl || req.url; -}); - -/** - * request method - */ - -exports.token('method', function(req){ - return req.method; -}); - -/** - * response time in milliseconds - */ - -exports.token('response-time', function(req){ - return new Date - req._startTime; -}); - -/** - * UTC date - */ - -exports.token('date', function(){ - return new Date().toUTCString(); -}); - -/** - * response status code - */ - -exports.token('status', function(req, res){ - return res.statusCode; -}); - -/** - * normalized referrer - */ - -exports.token('referrer', function(req){ - return req.headers['referer'] || req.headers['referrer']; -}); - -/** - * remote address - */ - -exports.token('remote-addr', function(req){ - if (req.ip) return req.ip; - var sock = req.socket; - if (sock.socket) return sock.socket.remoteAddress; - return sock.remoteAddress; -}); - -/** - * HTTP version - */ - -exports.token('http-version', function(req){ - return req.httpVersionMajor + '.' + req.httpVersionMinor; -}); - -/** - * UA string - */ - -exports.token('user-agent', function(req){ - return req.headers['user-agent']; -}); - -/** - * request header - */ - -exports.token('req', function(req, res, field){ - return req.headers[field.toLowerCase()]; -}); - -/** - * response header - */ - -exports.token('res', function(req, res, field){ - return (res._headers || {})[field.toLowerCase()]; -}); - diff --git a/node_modules/express/node_modules/connect/lib/middleware/methodOverride.js b/node_modules/express/node_modules/connect/lib/middleware/methodOverride.js deleted file mode 100644 index aaf4014..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/methodOverride.js +++ /dev/null @@ -1,40 +0,0 @@ - -/*! - * Connect - methodOverride - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Method Override: - * - * Provides faux HTTP method support. - * - * Pass an optional `key` to use when checking for - * a method override, othewise defaults to _\_method_. - * The original method is available via `req.originalMethod`. - * - * @param {String} key - * @return {Function} - * @api public - */ - -module.exports = function methodOverride(key){ - key = key || "_method"; - return function methodOverride(req, res, next) { - req.originalMethod = req.originalMethod || req.method; - - // req.body - if (req.body && key in req.body) { - req.method = req.body[key].toUpperCase(); - delete req.body[key]; - // check X-HTTP-Method-Override - } else if (req.headers['x-http-method-override']) { - req.method = req.headers['x-http-method-override'].toUpperCase(); - } - - next(); - }; -}; - diff --git a/node_modules/express/node_modules/connect/lib/middleware/multipart.js b/node_modules/express/node_modules/connect/lib/middleware/multipart.js deleted file mode 100644 index 7b26fae..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/multipart.js +++ /dev/null @@ -1,133 +0,0 @@ -/*! - * Connect - multipart - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var formidable = require('formidable') - , _limit = require('./limit') - , utils = require('../utils') - , qs = require('qs'); - -/** - * noop middleware. - */ - -function noop(req, res, next) { - next(); -} - -/** - * Multipart: - * - * Parse multipart/form-data request bodies, - * providing the parsed object as `req.body` - * and `req.files`. - * - * Configuration: - * - * The options passed are merged with [formidable](https://github.com/felixge/node-formidable)'s - * `IncomingForm` object, allowing you to configure the upload directory, - * size limits, etc. For example if you wish to change the upload dir do the following. - * - * app.use(connect.multipart({ uploadDir: path })); - * - * Options: - * - * - `limit` byte limit defaulting to none - * - `defer` defers processing and exposes the Formidable form object as `req.form`. - * `next()` is called without waiting for the form's "end" event. - * This option is useful if you need to bind to the "progress" event, for example. - * - * @param {Object} options - * @return {Function} - * @api public - */ - -exports = module.exports = function(options){ - options = options || {}; - - var limit = options.limit - ? _limit(options.limit) - : noop; - - return function multipart(req, res, next) { - if (req._body) return next(); - req.body = req.body || {}; - req.files = req.files || {}; - - if (!utils.hasBody(req)) return next(); - - // ignore GET - if ('GET' == req.method || 'HEAD' == req.method) return next(); - - // check Content-Type - if ('multipart/form-data' != utils.mime(req)) return next(); - - // flag as parsed - req._body = true; - - // parse - limit(req, res, function(err){ - if (err) return next(err); - - var form = new formidable.IncomingForm - , data = {} - , files = {} - , done; - - Object.keys(options).forEach(function(key){ - form[key] = options[key]; - }); - - function ondata(name, val, data){ - if (Array.isArray(data[name])) { - data[name].push(val); - } else if (data[name]) { - data[name] = [data[name], val]; - } else { - data[name] = val; - } - } - - form.on('field', function(name, val){ - ondata(name, val, data); - }); - - form.on('file', function(name, val){ - ondata(name, val, files); - }); - - form.on('error', function(err){ - if (!options.defer) { - err.status = 400; - next(err); - } - done = true; - }); - - form.on('end', function(){ - if (done) return; - try { - req.body = qs.parse(data); - req.files = qs.parse(files); - if (!options.defer) next(); - } catch (err) { - form.emit('error', err); - } - }); - - form.parse(req); - - if (options.defer) { - req.form = form; - next(); - } - }); - } -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/query.js b/node_modules/express/node_modules/connect/lib/middleware/query.js deleted file mode 100644 index 93fc5d3..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/query.js +++ /dev/null @@ -1,46 +0,0 @@ -/*! - * Connect - query - * Copyright(c) 2011 TJ Holowaychuk - * Copyright(c) 2011 Sencha Inc. - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var qs = require('qs') - , parse = require('../utils').parseUrl; - -/** - * Query: - * - * Automatically parse the query-string when available, - * populating the `req.query` object. - * - * Examples: - * - * connect() - * .use(connect.query()) - * .use(function(req, res){ - * res.end(JSON.stringify(req.query)); - * }); - * - * The `options` passed are provided to qs.parse function. - * - * @param {Object} options - * @return {Function} - * @api public - */ - -module.exports = function query(options){ - return function query(req, res, next){ - if (!req.query) { - req.query = ~req.url.indexOf('?') - ? qs.parse(parse(req).query, options) - : {}; - } - - next(); - }; -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/responseTime.js b/node_modules/express/node_modules/connect/lib/middleware/responseTime.js deleted file mode 100644 index 62abc04..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/responseTime.js +++ /dev/null @@ -1,32 +0,0 @@ - -/*! - * Connect - responseTime - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Reponse time: - * - * Adds the `X-Response-Time` header displaying the response - * duration in milliseconds. - * - * @return {Function} - * @api public - */ - -module.exports = function responseTime(){ - return function(req, res, next){ - var start = new Date; - - if (res._responseTime) return next(); - res._responseTime = true; - - res.on('header', function(){ - var duration = new Date - start; - res.setHeader('X-Response-Time', duration + 'ms'); - }); - - next(); - }; -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/session.js b/node_modules/express/node_modules/connect/lib/middleware/session.js deleted file mode 100644 index f97b8d6..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/session.js +++ /dev/null @@ -1,352 +0,0 @@ - -/*! - * Connect - session - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Session = require('./session/session') - , debug = require('debug')('connect:session') - , MemoryStore = require('./session/memory') - , signature = require('cookie-signature') - , Cookie = require('./session/cookie') - , Store = require('./session/store') - , utils = require('./../utils') - , parse = utils.parseUrl - , crc32 = require('buffer-crc32'); - -// environment - -var env = process.env.NODE_ENV; - -/** - * Expose the middleware. - */ - -exports = module.exports = session; - -/** - * Expose constructors. - */ - -exports.Store = Store; -exports.Cookie = Cookie; -exports.Session = Session; -exports.MemoryStore = MemoryStore; - -/** - * Warning message for `MemoryStore` usage in production. - */ - -var warning = 'Warning: connection.session() MemoryStore is not\n' - + 'designed for a production environment, as it will leak\n' - + 'memory, and will not scale past a single process.'; - -/** - * Session: - * - * Setup session store with the given `options`. - * - * Session data is _not_ saved in the cookie itself, however - * cookies are used, so we must use the [cookieParser()](cookieParser.html) - * middleware _before_ `session()`. - * - * Examples: - * - * connect() - * .use(connect.cookieParser()) - * .use(connect.session({ secret: 'keyboard cat', key: 'sid', cookie: { secure: true }})) - * - * Options: - * - * - `key` cookie name defaulting to `connect.sid` - * - `store` session store instance - * - `secret` session cookie is signed with this secret to prevent tampering - * - `cookie` session cookie settings, defaulting to `{ path: '/', httpOnly: true, maxAge: null }` - * - `proxy` trust the reverse proxy when setting secure cookies (via "x-forwarded-proto") - * - * Cookie option: - * - * By default `cookie.maxAge` is `null`, meaning no "expires" parameter is set - * so the cookie becomes a browser-session cookie. When the user closes the - * browser the cookie (and session) will be removed. - * - * ## req.session - * - * To store or access session data, simply use the request property `req.session`, - * which is (generally) serialized as JSON by the store, so nested objects - * are typically fine. For example below is a user-specific view counter: - * - * connect() - * .use(connect.favicon()) - * .use(connect.cookieParser()) - * .use(connect.session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }})) - * .use(function(req, res, next){ - * var sess = req.session; - * if (sess.views) { - * res.setHeader('Content-Type', 'text/html'); - * res.write('

      views: ' + sess.views + '

      '); - * res.write('

      expires in: ' + (sess.cookie.maxAge / 1000) + 's

      '); - * res.end(); - * sess.views++; - * } else { - * sess.views = 1; - * res.end('welcome to the session demo. refresh!'); - * } - * } - * )).listen(3000); - * - * ## Session#regenerate() - * - * To regenerate the session simply invoke the method, once complete - * a new SID and `Session` instance will be initialized at `req.session`. - * - * req.session.regenerate(function(err){ - * // will have a new session here - * }); - * - * ## Session#destroy() - * - * Destroys the session, removing `req.session`, will be re-generated next request. - * - * req.session.destroy(function(err){ - * // cannot access session here - * }); - * - * ## Session#reload() - * - * Reloads the session data. - * - * req.session.reload(function(err){ - * // session updated - * }); - * - * ## Session#save() - * - * Save the session. - * - * req.session.save(function(err){ - * // session saved - * }); - * - * ## Session#touch() - * - * Updates the `.maxAge` property. Typically this is - * not necessary to call, as the session middleware does this for you. - * - * ## Session#cookie - * - * Each session has a unique cookie object accompany it. This allows - * you to alter the session cookie per visitor. For example we can - * set `req.session.cookie.expires` to `false` to enable the cookie - * to remain for only the duration of the user-agent. - * - * ## Session#maxAge - * - * Alternatively `req.session.cookie.maxAge` will return the time - * remaining in milliseconds, which we may also re-assign a new value - * to adjust the `.expires` property appropriately. The following - * are essentially equivalent - * - * var hour = 3600000; - * req.session.cookie.expires = new Date(Date.now() + hour); - * req.session.cookie.maxAge = hour; - * - * For example when `maxAge` is set to `60000` (one minute), and 30 seconds - * has elapsed it will return `30000` until the current request has completed, - * at which time `req.session.touch()` is called to reset `req.session.maxAge` - * to its original value. - * - * req.session.cookie.maxAge; - * // => 30000 - * - * Session Store Implementation: - * - * Every session store _must_ implement the following methods - * - * - `.get(sid, callback)` - * - `.set(sid, session, callback)` - * - `.destroy(sid, callback)` - * - * Recommended methods include, but are not limited to: - * - * - `.length(callback)` - * - `.clear(callback)` - * - * For an example implementation view the [connect-redis](http://github.com/visionmedia/connect-redis) repo. - * - * @param {Object} options - * @return {Function} - * @api public - */ - -function session(options){ - var options = options || {} - , key = options.key || 'connect.sid' - , store = options.store || new MemoryStore - , cookie = options.cookie || {} - , trustProxy = options.proxy - , storeReady = true; - - // notify user that this store is not - // meant for a production environment - if ('production' == env && store instanceof MemoryStore) { - console.warn(warning); - } - - // generates the new session - store.generate = function(req){ - req.sessionID = utils.uid(24); - req.session = new Session(req); - req.session.cookie = new Cookie(cookie); - }; - - store.on('disconnect', function(){ storeReady = false; }); - store.on('connect', function(){ storeReady = true; }); - - return function session(req, res, next) { - // self-awareness - if (req.session) return next(); - - // Handle connection as if there is no session if - // the store has temporarily disconnected etc - if (!storeReady) return debug('store is disconnected'), next(); - - // pathname mismatch - if (0 != req.originalUrl.indexOf(cookie.path || '/')) return next(); - - // backwards compatibility for signed cookies - // req.secret is passed from the cookie parser middleware - var secret = options.secret || req.secret; - - // ensure secret is available or bail - if (!secret) throw new Error('`secret` option required for sessions'); - - // parse url - var originalHash - , originalId; - - // expose store - req.sessionStore = store; - - // grab the session cookie value and check the signature - var rawCookie = req.cookies[key]; - - // get signedCookies for backwards compat with signed cookies - var unsignedCookie = req.signedCookies[key]; - - if (!unsignedCookie && rawCookie) { - unsignedCookie = utils.parseSignedCookie(rawCookie, secret); - } - - // set-cookie - res.on('header', function(){ - if (!req.session) return; - var cookie = req.session.cookie - , proto = (req.headers['x-forwarded-proto'] || '').toLowerCase() - , tls = req.connection.encrypted || (trustProxy && 'https' == proto) - , secured = cookie.secure && tls - , isNew = unsignedCookie != req.sessionID; - - // only send secure cookies via https - if (cookie.secure && !secured) return debug('not secured'); - - // browser-session length cookie - if (null == cookie.expires) { - if (!isNew) return debug('already set browser-session cookie'); - // compare hashes and ids - } else if (originalHash == hash(req.session) && originalId == req.session.id) { - return debug('unmodified session'); - } - - var val = 's:' + signature.sign(req.sessionID, secret); - val = cookie.serialize(key, val); - debug('set-cookie %s', val); - res.setHeader('Set-Cookie', val); - }); - - // proxy end() to commit the session - var end = res.end; - res.end = function(data, encoding){ - res.end = end; - if (!req.session) return res.end(data, encoding); - debug('saving'); - req.session.resetMaxAge(); - req.session.save(function(){ - debug('saved'); - res.end(data, encoding); - }); - }; - - // generate the session - function generate() { - store.generate(req); - } - - // get the sessionID from the cookie - req.sessionID = unsignedCookie; - - // generate a session if the browser doesn't send a sessionID - if (!req.sessionID) { - debug('no SID sent, generating session'); - generate(); - next(); - return; - } - - // generate the session object - var pause = utils.pause(req); - debug('fetching %s', req.sessionID); - store.get(req.sessionID, function(err, sess){ - // proxy to resume() events - var _next = next; - next = function(err){ - _next(err); - pause.resume(); - }; - - // error handling - if (err) { - debug('error'); - if ('ENOENT' == err.code) { - generate(); - next(); - } else { - next(err); - } - // no session - } else if (!sess) { - debug('no session found'); - generate(); - next(); - // populate req.session - } else { - debug('session found'); - store.createSession(req, sess); - originalId = req.sessionID; - originalHash = hash(sess); - next(); - } - }); - }; -}; - -/** - * Hash the given `sess` object omitting changes - * to `.cookie`. - * - * @param {Object} sess - * @return {String} - * @api private - */ - -function hash(sess) { - return crc32.signed(JSON.stringify(sess, function(key, val){ - if ('cookie' != key) return val; - })); -} diff --git a/node_modules/express/node_modules/connect/lib/middleware/session/cookie.js b/node_modules/express/node_modules/connect/lib/middleware/session/cookie.js deleted file mode 100644 index e8ff862..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/session/cookie.js +++ /dev/null @@ -1,128 +0,0 @@ - -/*! - * Connect - session - Cookie - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var utils = require('../../utils') - , cookie = require('cookie'); - -/** - * Initialize a new `Cookie` with the given `options`. - * - * @param {IncomingMessage} req - * @param {Object} options - * @api private - */ - -var Cookie = module.exports = function Cookie(options) { - this.path = '/'; - this.maxAge = null; - this.httpOnly = true; - if (options) utils.merge(this, options); - this.originalMaxAge = undefined == this.originalMaxAge - ? this.maxAge - : this.originalMaxAge; -}; - -/*! - * Prototype. - */ - -Cookie.prototype = { - - /** - * Set expires `date`. - * - * @param {Date} date - * @api public - */ - - set expires(date) { - this._expires = date; - this.originalMaxAge = this.maxAge; - }, - - /** - * Get expires `date`. - * - * @return {Date} - * @api public - */ - - get expires() { - return this._expires; - }, - - /** - * Set expires via max-age in `ms`. - * - * @param {Number} ms - * @api public - */ - - set maxAge(ms) { - this.expires = 'number' == typeof ms - ? new Date(Date.now() + ms) - : ms; - }, - - /** - * Get expires max-age in `ms`. - * - * @return {Number} - * @api public - */ - - get maxAge() { - return this.expires instanceof Date - ? this.expires.valueOf() - Date.now() - : this.expires; - }, - - /** - * Return cookie data object. - * - * @return {Object} - * @api private - */ - - get data() { - return { - originalMaxAge: this.originalMaxAge - , expires: this._expires - , secure: this.secure - , httpOnly: this.httpOnly - , domain: this.domain - , path: this.path - } - }, - - /** - * Return a serialized cookie string. - * - * @return {String} - * @api public - */ - - serialize: function(name, val){ - return cookie.serialize(name, val, this.data); - }, - - /** - * Return JSON representation of this cookie. - * - * @return {Object} - * @api private - */ - - toJSON: function(){ - return this.data; - } -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/session/memory.js b/node_modules/express/node_modules/connect/lib/middleware/session/memory.js deleted file mode 100644 index fb93939..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/session/memory.js +++ /dev/null @@ -1,129 +0,0 @@ - -/*! - * Connect - session - MemoryStore - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Store = require('./store'); - -/** - * Initialize a new `MemoryStore`. - * - * @api public - */ - -var MemoryStore = module.exports = function MemoryStore() { - this.sessions = {}; -}; - -/** - * Inherit from `Store.prototype`. - */ - -MemoryStore.prototype.__proto__ = Store.prototype; - -/** - * Attempt to fetch session by the given `sid`. - * - * @param {String} sid - * @param {Function} fn - * @api public - */ - -MemoryStore.prototype.get = function(sid, fn){ - var self = this; - process.nextTick(function(){ - var expires - , sess = self.sessions[sid]; - if (sess) { - sess = JSON.parse(sess); - expires = 'string' == typeof sess.cookie.expires - ? new Date(sess.cookie.expires) - : sess.cookie.expires; - if (!expires || new Date < expires) { - fn(null, sess); - } else { - self.destroy(sid, fn); - } - } else { - fn(); - } - }); -}; - -/** - * Commit the given `sess` object associated with the given `sid`. - * - * @param {String} sid - * @param {Session} sess - * @param {Function} fn - * @api public - */ - -MemoryStore.prototype.set = function(sid, sess, fn){ - var self = this; - process.nextTick(function(){ - self.sessions[sid] = JSON.stringify(sess); - fn && fn(); - }); -}; - -/** - * Destroy the session associated with the given `sid`. - * - * @param {String} sid - * @api public - */ - -MemoryStore.prototype.destroy = function(sid, fn){ - var self = this; - process.nextTick(function(){ - delete self.sessions[sid]; - fn && fn(); - }); -}; - -/** - * Invoke the given callback `fn` with all active sessions. - * - * @param {Function} fn - * @api public - */ - -MemoryStore.prototype.all = function(fn){ - var arr = [] - , keys = Object.keys(this.sessions); - for (var i = 0, len = keys.length; i < len; ++i) { - arr.push(this.sessions[keys[i]]); - } - fn(null, arr); -}; - -/** - * Clear all sessions. - * - * @param {Function} fn - * @api public - */ - -MemoryStore.prototype.clear = function(fn){ - this.sessions = {}; - fn && fn(); -}; - -/** - * Fetch number of sessions. - * - * @param {Function} fn - * @api public - */ - -MemoryStore.prototype.length = function(fn){ - fn(null, Object.keys(this.sessions).length); -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/session/session.js b/node_modules/express/node_modules/connect/lib/middleware/session/session.js deleted file mode 100644 index 0dd4b40..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/session/session.js +++ /dev/null @@ -1,116 +0,0 @@ - -/*! - * Connect - session - Session - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var utils = require('../../utils'); - -/** - * Create a new `Session` with the given request and `data`. - * - * @param {IncomingRequest} req - * @param {Object} data - * @api private - */ - -var Session = module.exports = function Session(req, data) { - Object.defineProperty(this, 'req', { value: req }); - Object.defineProperty(this, 'id', { value: req.sessionID }); - if ('object' == typeof data) utils.merge(this, data); -}; - -/** - * Update reset `.cookie.maxAge` to prevent - * the cookie from expiring when the - * session is still active. - * - * @return {Session} for chaining - * @api public - */ - -Session.prototype.touch = function(){ - return this.resetMaxAge(); -}; - -/** - * Reset `.maxAge` to `.originalMaxAge`. - * - * @return {Session} for chaining - * @api public - */ - -Session.prototype.resetMaxAge = function(){ - this.cookie.maxAge = this.cookie.originalMaxAge; - return this; -}; - -/** - * Save the session data with optional callback `fn(err)`. - * - * @param {Function} fn - * @return {Session} for chaining - * @api public - */ - -Session.prototype.save = function(fn){ - this.req.sessionStore.set(this.id, this, fn || function(){}); - return this; -}; - -/** - * Re-loads the session data _without_ altering - * the maxAge properties. Invokes the callback `fn(err)`, - * after which time if no exception has occurred the - * `req.session` property will be a new `Session` object, - * although representing the same session. - * - * @param {Function} fn - * @return {Session} for chaining - * @api public - */ - -Session.prototype.reload = function(fn){ - var req = this.req - , store = this.req.sessionStore; - store.get(this.id, function(err, sess){ - if (err) return fn(err); - if (!sess) return fn(new Error('failed to load session')); - store.createSession(req, sess); - fn(); - }); - return this; -}; - -/** - * Destroy `this` session. - * - * @param {Function} fn - * @return {Session} for chaining - * @api public - */ - -Session.prototype.destroy = function(fn){ - delete this.req.session; - this.req.sessionStore.destroy(this.id, fn); - return this; -}; - -/** - * Regenerate this request's session. - * - * @param {Function} fn - * @return {Session} for chaining - * @api public - */ - -Session.prototype.regenerate = function(fn){ - this.req.sessionStore.regenerate(this.req, fn); - return this; -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/session/store.js b/node_modules/express/node_modules/connect/lib/middleware/session/store.js deleted file mode 100644 index 54294cb..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/session/store.js +++ /dev/null @@ -1,84 +0,0 @@ - -/*! - * Connect - session - Store - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var EventEmitter = require('events').EventEmitter - , Session = require('./session') - , Cookie = require('./cookie'); - -/** - * Initialize abstract `Store`. - * - * @api private - */ - -var Store = module.exports = function Store(options){}; - -/** - * Inherit from `EventEmitter.prototype`. - */ - -Store.prototype.__proto__ = EventEmitter.prototype; - -/** - * Re-generate the given requests's session. - * - * @param {IncomingRequest} req - * @return {Function} fn - * @api public - */ - -Store.prototype.regenerate = function(req, fn){ - var self = this; - this.destroy(req.sessionID, function(err){ - self.generate(req); - fn(err); - }); -}; - -/** - * Load a `Session` instance via the given `sid` - * and invoke the callback `fn(err, sess)`. - * - * @param {String} sid - * @param {Function} fn - * @api public - */ - -Store.prototype.load = function(sid, fn){ - var self = this; - this.get(sid, function(err, sess){ - if (err) return fn(err); - if (!sess) return fn(); - var req = { sessionID: sid, sessionStore: self }; - sess = self.createSession(req, sess); - fn(null, sess); - }); -}; - -/** - * Create session from JSON `sess` data. - * - * @param {IncomingRequest} req - * @param {Object} sess - * @return {Session} - * @api private - */ - -Store.prototype.createSession = function(req, sess){ - var expires = sess.cookie.expires - , orig = sess.cookie.originalMaxAge; - sess.cookie = new Cookie(sess.cookie); - if ('string' == typeof expires) sess.cookie.expires = new Date(expires); - sess.cookie.originalMaxAge = orig; - req.session = new Session(req, sess); - return req.session; -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/static.js b/node_modules/express/node_modules/connect/lib/middleware/static.js deleted file mode 100644 index bb29d07..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/static.js +++ /dev/null @@ -1,94 +0,0 @@ - -/*! - * Connect - static - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var send = require('send') - , utils = require('../utils') - , parse = utils.parseUrl - , url = require('url'); - -/** - * Static: - * - * Static file server with the given `root` path. - * - * Examples: - * - * var oneDay = 86400000; - * - * connect() - * .use(connect.static(__dirname + '/public')) - * - * connect() - * .use(connect.static(__dirname + '/public', { maxAge: oneDay })) - * - * Options: - * - * - `maxAge` Browser cache maxAge in milliseconds. defaults to 0 - * - `hidden` Allow transfer of hidden files. defaults to false - * - `redirect` Redirect to trailing "/" when the pathname is a dir. defaults to true - * - * @param {String} root - * @param {Object} options - * @return {Function} - * @api public - */ - -exports = module.exports = function static(root, options){ - options = options || {}; - - // root required - if (!root) throw new Error('static() root path required'); - - // default redirect - var redirect = false !== options.redirect; - - return function static(req, res, next) { - if ('GET' != req.method && 'HEAD' != req.method) return next(); - var path = parse(req).pathname; - var pause = utils.pause(req); - - function resume() { - next(); - pause.resume(); - } - - function directory() { - if (!redirect) return resume(); - var pathname = url.parse(req.originalUrl).pathname; - res.statusCode = 301; - res.setHeader('Location', pathname + '/'); - res.end('Redirecting to ' + utils.escape(pathname) + '/'); - } - - function error(err) { - if (404 == err.status) return resume(); - next(err); - } - - send(req, path) - .maxage(options.maxAge || 0) - .root(root) - .hidden(options.hidden) - .on('error', error) - .on('directory', directory) - .pipe(res); - }; -}; - -/** - * Expose mime module. - * - * If you wish to extend the mime table use this - * reference to the "mime" module in the npm registry. - */ - -exports.mime = send.mime; diff --git a/node_modules/express/node_modules/connect/lib/middleware/staticCache.js b/node_modules/express/node_modules/connect/lib/middleware/staticCache.js deleted file mode 100644 index 7354a8f..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/staticCache.js +++ /dev/null @@ -1,231 +0,0 @@ - -/*! - * Connect - staticCache - * Copyright(c) 2011 Sencha Inc. - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var utils = require('../utils') - , Cache = require('../cache') - , fresh = require('fresh'); - -/** - * Static cache: - * - * Enables a memory cache layer on top of - * the `static()` middleware, serving popular - * static files. - * - * By default a maximum of 128 objects are - * held in cache, with a max of 256k each, - * totalling ~32mb. - * - * A Least-Recently-Used (LRU) cache algo - * is implemented through the `Cache` object, - * simply rotating cache objects as they are - * hit. This means that increasingly popular - * objects maintain their positions while - * others get shoved out of the stack and - * garbage collected. - * - * Benchmarks: - * - * static(): 2700 rps - * node-static: 5300 rps - * static() + staticCache(): 7500 rps - * - * Options: - * - * - `maxObjects` max cache objects [128] - * - `maxLength` max cache object length 256kb - * - * @param {Object} options - * @return {Function} - * @api public - */ - -module.exports = function staticCache(options){ - var options = options || {} - , cache = new Cache(options.maxObjects || 128) - , maxlen = options.maxLength || 1024 * 256; - - console.warn('connect.staticCache() is deprecated and will be removed in 3.0'); - console.warn('use varnish or similar reverse proxy caches.'); - - return function staticCache(req, res, next){ - var key = cacheKey(req) - , ranges = req.headers.range - , hasCookies = req.headers.cookie - , hit = cache.get(key); - - // cache static - // TODO: change from staticCache() -> cache() - // and make this work for any request - req.on('static', function(stream){ - var headers = res._headers - , cc = utils.parseCacheControl(headers['cache-control'] || '') - , contentLength = headers['content-length'] - , hit; - - // dont cache set-cookie responses - if (headers['set-cookie']) return hasCookies = true; - - // dont cache when cookies are present - if (hasCookies) return; - - // ignore larger files - if (!contentLength || contentLength > maxlen) return; - - // don't cache partial files - if (headers['content-range']) return; - - // dont cache items we shouldn't be - // TODO: real support for must-revalidate / no-cache - if ( cc['no-cache'] - || cc['no-store'] - || cc['private'] - || cc['must-revalidate']) return; - - // if already in cache then validate - if (hit = cache.get(key)){ - if (headers.etag == hit[0].etag) { - hit[0].date = new Date; - return; - } else { - cache.remove(key); - } - } - - // validation notifiactions don't contain a steam - if (null == stream) return; - - // add the cache object - var arr = []; - - // store the chunks - stream.on('data', function(chunk){ - arr.push(chunk); - }); - - // flag it as complete - stream.on('end', function(){ - var cacheEntry = cache.add(key); - delete headers['x-cache']; // Clean up (TODO: others) - cacheEntry.push(200); - cacheEntry.push(headers); - cacheEntry.push.apply(cacheEntry, arr); - }); - }); - - if (req.method == 'GET' || req.method == 'HEAD') { - if (ranges) { - next(); - } else if (!hasCookies && hit && !mustRevalidate(req, hit)) { - res.setHeader('X-Cache', 'HIT'); - respondFromCache(req, res, hit); - } else { - res.setHeader('X-Cache', 'MISS'); - next(); - } - } else { - next(); - } - } -}; - -/** - * Respond with the provided cached value. - * TODO: Assume 200 code, that's iffy. - * - * @param {Object} req - * @param {Object} res - * @param {Object} cacheEntry - * @return {String} - * @api private - */ - -function respondFromCache(req, res, cacheEntry) { - var status = cacheEntry[0] - , headers = utils.merge({}, cacheEntry[1]) - , content = cacheEntry.slice(2); - - headers.age = (new Date - new Date(headers.date)) / 1000 || 0; - - switch (req.method) { - case 'HEAD': - res.writeHead(status, headers); - res.end(); - break; - case 'GET': - if (utils.conditionalGET(req) && fresh(req.headers, headers)) { - headers['content-length'] = 0; - res.writeHead(304, headers); - res.end(); - } else { - res.writeHead(status, headers); - - function write() { - while (content.length) { - if (false === res.write(content.shift())) { - res.once('drain', write); - return; - } - } - res.end(); - } - - write(); - } - break; - default: - // This should never happen. - res.writeHead(500, ''); - res.end(); - } -} - -/** - * Determine whether or not a cached value must be revalidated. - * - * @param {Object} req - * @param {Object} cacheEntry - * @return {String} - * @api private - */ - -function mustRevalidate(req, cacheEntry) { - var cacheHeaders = cacheEntry[1] - , reqCC = utils.parseCacheControl(req.headers['cache-control'] || '') - , cacheCC = utils.parseCacheControl(cacheHeaders['cache-control'] || '') - , cacheAge = (new Date - new Date(cacheHeaders.date)) / 1000 || 0; - - if ( cacheCC['no-cache'] - || cacheCC['must-revalidate'] - || cacheCC['proxy-revalidate']) return true; - - if (reqCC['no-cache']) return true; - - if (null != reqCC['max-age']) return reqCC['max-age'] < cacheAge; - - if (null != cacheCC['max-age']) return cacheCC['max-age'] < cacheAge; - - return false; -} - -/** - * The key to use in the cache. For now, this is the URL path and query. - * - * 'http://example.com?key=value' -> '/?key=value' - * - * @param {Object} req - * @return {String} - * @api private - */ - -function cacheKey(req) { - return utils.parseUrl(req).path; -} diff --git a/node_modules/express/node_modules/connect/lib/middleware/timeout.js b/node_modules/express/node_modules/connect/lib/middleware/timeout.js deleted file mode 100644 index a6dc087..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/timeout.js +++ /dev/null @@ -1,56 +0,0 @@ - -/*! - * Connect - timeout - * Ported from https://github.com/LearnBoost/connect-timeout - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var debug = require('debug')('connect:timeout'); - -/** - * Timeout: - * - * Times out the request in `ms`, defaulting to `5000`. The - * method `req.clearTimeout()` is added to revert this behaviour - * programmatically within your application's middleware, routes, etc. - * - * The timeout error is passed to `next()` so that you may customize - * the response behaviour. This error has the `.timeout` property as - * well as `.status == 408`. - * - * @param {Number} ms - * @return {Function} - * @api public - */ - -module.exports = function timeout(ms) { - ms = ms || 5000; - - return function(req, res, next) { - var id = setTimeout(function(){ - req.emit('timeout', ms); - }, ms); - - req.on('timeout', function(){ - if (req.headerSent) return debug('response started, cannot timeout'); - var err = new Error('Response timeout'); - err.timeout = ms; - err.status = 503; - next(err); - }); - - req.clearTimeout = function(){ - clearTimeout(id); - }; - - res.on('header', function(){ - clearTimeout(id); - }); - - next(); - }; -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/urlencoded.js b/node_modules/express/node_modules/connect/lib/middleware/urlencoded.js deleted file mode 100644 index cceafc0..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/urlencoded.js +++ /dev/null @@ -1,78 +0,0 @@ - -/*! - * Connect - urlencoded - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var utils = require('../utils') - , _limit = require('./limit') - , qs = require('qs'); - -/** - * noop middleware. - */ - -function noop(req, res, next) { - next(); -} - -/** - * Urlencoded: - * - * Parse x-ww-form-urlencoded request bodies, - * providing the parsed object as `req.body`. - * - * Options: - * - * - `limit` byte limit disabled by default - * - * @param {Object} options - * @return {Function} - * @api public - */ - -exports = module.exports = function(options){ - options = options || {}; - - var limit = options.limit - ? _limit(options.limit) - : noop; - - return function urlencoded(req, res, next) { - if (req._body) return next(); - req.body = req.body || {}; - - if (!utils.hasBody(req)) return next(); - - // check Content-Type - if ('application/x-www-form-urlencoded' != utils.mime(req)) return next(); - - // flag as parsed - req._body = true; - - // parse - limit(req, res, function(err){ - if (err) return next(err); - var buf = ''; - req.setEncoding('utf8'); - req.on('data', function(chunk){ buf += chunk }); - req.on('end', function(){ - try { - req.body = buf.length - ? qs.parse(buf, options) - : {}; - next(); - } catch (err){ - err.body = buf; - next(err); - } - }); - }); - } -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/vhost.js b/node_modules/express/node_modules/connect/lib/middleware/vhost.js deleted file mode 100644 index 897a9d8..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/vhost.js +++ /dev/null @@ -1,40 +0,0 @@ - -/*! - * Connect - vhost - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Vhost: - * - * Setup vhost for the given `hostname` and `server`. - * - * connect() - * .use(connect.vhost('foo.com', fooApp)) - * .use(connect.vhost('bar.com', barApp)) - * .use(connect.vhost('*.com', mainApp)) - * - * The `server` may be a Connect server or - * a regular Node `http.Server`. - * - * @param {String} hostname - * @param {Server} server - * @return {Function} - * @api public - */ - -module.exports = function vhost(hostname, server){ - if (!hostname) throw new Error('vhost hostname required'); - if (!server) throw new Error('vhost server required'); - var regexp = new RegExp('^' + hostname.replace(/[*]/g, '(.*?)') + '$', 'i'); - if (server.onvhost) server.onvhost(hostname); - return function vhost(req, res, next){ - if (!req.headers.host) return next(); - var host = req.headers.host.split(':')[0]; - if (!regexp.test(host)) return next(); - if ('function' == typeof server) return server(req, res, next); - server.emit('request', req, res); - }; -}; diff --git a/node_modules/express/node_modules/connect/lib/patch.js b/node_modules/express/node_modules/connect/lib/patch.js deleted file mode 100644 index 7cf0012..0000000 --- a/node_modules/express/node_modules/connect/lib/patch.js +++ /dev/null @@ -1,79 +0,0 @@ - -/*! - * Connect - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var http = require('http') - , res = http.ServerResponse.prototype - , setHeader = res.setHeader - , _renderHeaders = res._renderHeaders - , writeHead = res.writeHead; - -// apply only once - -if (!res._hasConnectPatch) { - - /** - * Provide a public "header sent" flag - * until node does. - * - * @return {Boolean} - * @api public - */ - - res.__defineGetter__('headerSent', function(){ - return this._header; - }); - - /** - * Set header `field` to `val`, special-casing - * the `Set-Cookie` field for multiple support. - * - * @param {String} field - * @param {String} val - * @api public - */ - - res.setHeader = function(field, val){ - var key = field.toLowerCase() - , prev; - - // special-case Set-Cookie - if (this._headers && 'set-cookie' == key) { - if (prev = this.getHeader(field)) { - val = Array.isArray(prev) - ? prev.concat(val) - : [prev, val]; - } - // charset - } else if ('content-type' == key && this.charset) { - val += '; charset=' + this.charset; - } - - return setHeader.call(this, field, val); - }; - - /** - * Proxy to emit "header" event. - */ - - res._renderHeaders = function(){ - if (!this._emittedHeader) this.emit('header'); - this._emittedHeader = true; - return _renderHeaders.call(this); - }; - - res.writeHead = function(){ - if (!this._emittedHeader) this.emit('header'); - this._emittedHeader = true; - return writeHead.apply(this, arguments); - }; - - res._hasConnectPatch = true; -} diff --git a/node_modules/express/node_modules/connect/lib/proto.js b/node_modules/express/node_modules/connect/lib/proto.js deleted file mode 100644 index 889c237..0000000 --- a/node_modules/express/node_modules/connect/lib/proto.js +++ /dev/null @@ -1,239 +0,0 @@ - -/*! - * Connect - HTTPServer - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var http = require('http') - , utils = require('./utils') - , debug = require('debug')('connect:dispatcher'); - -// prototype - -var app = module.exports = {}; - -// environment - -var env = process.env.NODE_ENV || 'development'; - -/** - * Utilize the given middleware `handle` to the given `route`, - * defaulting to _/_. This "route" is the mount-point for the - * middleware, when given a value other than _/_ the middleware - * is only effective when that segment is present in the request's - * pathname. - * - * For example if we were to mount a function at _/admin_, it would - * be invoked on _/admin_, and _/admin/settings_, however it would - * not be invoked for _/_, or _/posts_. - * - * Examples: - * - * var app = connect(); - * app.use(connect.favicon()); - * app.use(connect.logger()); - * app.use(connect.static(__dirname + '/public')); - * - * If we wanted to prefix static files with _/public_, we could - * "mount" the `static()` middleware: - * - * app.use('/public', connect.static(__dirname + '/public')); - * - * This api is chainable, so the following is valid: - * - * connect() - * .use(connect.favicon()) - * .use(connect.logger()) - * .use(connect.static(__dirname + '/public')) - * .listen(3000); - * - * @param {String|Function|Server} route, callback or server - * @param {Function|Server} callback or server - * @return {Server} for chaining - * @api public - */ - -app.use = function(route, fn){ - // default route to '/' - if ('string' != typeof route) { - fn = route; - route = '/'; - } - - // wrap sub-apps - if ('function' == typeof fn.handle) { - var server = fn; - fn.route = route; - fn = function(req, res, next){ - server.handle(req, res, next); - }; - } - - // wrap vanilla http.Servers - if (fn instanceof http.Server) { - fn = fn.listeners('request')[0]; - } - - // strip trailing slash - if ('/' == route[route.length - 1]) { - route = route.slice(0, -1); - } - - // add the middleware - debug('use %s %s', route || '/', fn.name || 'anonymous'); - this.stack.push({ route: route, handle: fn }); - - return this; -}; - -/** - * Handle server requests, punting them down - * the middleware stack. - * - * @api private - */ - -app.handle = function(req, res, out) { - var stack = this.stack - , fqdn = ~req.url.indexOf('://') - , removed = '' - , slashAdded = false - , index = 0; - - function next(err, msg) { - var layer, path, status, c; - - if (slashAdded) { - req.url = req.url.substr(1); - slashAdded = false; - } - - req.url = removed + req.url; - req.originalUrl = req.originalUrl || req.url; - removed = ''; - - // next(status, msg) support - if (typeof err === 'number') { - var status = err; - var name = http.STATUS_CODES[status]; - err = new Error(msg || name); - err.name = name; - err.status = status; - } - - // next callback - layer = stack[index++]; - - // all done - if (!layer || res.headerSent) { - // delegate to parent - if (out) return out(err); - - // unhandled error - if (err) { - // default to 500 - if (res.statusCode < 400) res.statusCode = 500; - debug('default %s', res.statusCode); - - // respect err.status - if (err.status) res.statusCode = err.status; - - // production gets a basic error message - var msg = 'production' == env - ? http.STATUS_CODES[res.statusCode] - : err.stack || err.toString(); - - // log to stderr in a non-test env - if ('test' != env) console.error(err.stack || err.toString()); - if (res.headerSent) return req.socket.destroy(); - res.setHeader('Content-Type', 'text/plain'); - res.setHeader('Content-Length', Buffer.byteLength(msg)); - if ('HEAD' == req.method) return res.end(); - res.end(msg); - } else { - debug('default 404'); - res.statusCode = 404; - res.setHeader('Content-Type', 'text/plain'); - if ('HEAD' == req.method) return res.end(); - res.end('Cannot ' + req.method + ' ' + utils.escape(req.originalUrl)); - } - return; - } - - try { - path = utils.parseUrl(req).pathname; - if (undefined == path) path = '/'; - - // skip this layer if the route doesn't match. - if (0 != path.toLowerCase().indexOf(layer.route.toLowerCase())) return next(err); - - c = path[layer.route.length]; - if (c && '/' != c && '.' != c) return next(err); - - // Call the layer handler - // Trim off the part of the url that matches the route - removed = layer.route; - req.url = req.url.substr(removed.length); - - // Ensure leading slash - if (!fqdn && '/' != req.url[0]) { - req.url = '/' + req.url; - slashAdded = true; - } - - debug('%s', layer.handle.name || 'anonymous'); - var arity = layer.handle.length; - if (err) { - if (arity === 4) { - layer.handle(err, req, res, next); - } else { - next(err); - } - } else if (arity < 4) { - layer.handle(req, res, next); - } else { - next(); - } - } catch (e) { - next(e); - } - } - next(); -}; - -/** - * Listen for connections. - * - * This method takes the same arguments - * as node's `http.Server#listen()`. - * - * HTTP and HTTPS: - * - * If you run your application both as HTTP - * and HTTPS you may wrap them individually, - * since your Connect "server" is really just - * a JavaScript `Function`. - * - * var connect = require('connect') - * , http = require('http') - * , https = require('https'); - * - * var app = connect(); - * - * http.createServer(app).listen(80); - * https.createServer(options, app).listen(443); - * - * @return {http.Server} - * @api public - */ - -app.listen = function(){ - var server = http.createServer(this); - return server.listen.apply(server, arguments); -}; diff --git a/node_modules/express/node_modules/connect/lib/public/directory.html b/node_modules/express/node_modules/connect/lib/public/directory.html deleted file mode 100644 index 2d63704..0000000 --- a/node_modules/express/node_modules/connect/lib/public/directory.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - listing directory {directory} - - - - - -
      -

      {linked-path}

      - {files} -
      - - \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/lib/public/error.html b/node_modules/express/node_modules/connect/lib/public/error.html deleted file mode 100644 index a6d3faf..0000000 --- a/node_modules/express/node_modules/connect/lib/public/error.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - {error} - - - -
      -

      {title}

      -

      {statusCode} {error}

      -
        {stack}
      -
      - - diff --git a/node_modules/express/node_modules/connect/lib/public/favicon.ico b/node_modules/express/node_modules/connect/lib/public/favicon.ico deleted file mode 100644 index 895fc96a76b68b4924f1c51d022e1b82fa0f461f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1406 zcmZQzU<5(|0R}M0U}azs1F|%L7$l?s#Ec9aKoZP=&}i&OouUjIY8@C}uZw4x5z5N2 zvEG^C^vXtt_xtJ?p3O32c(KTx;lsgZhW%5M85Sf}k-mf`L80)|7ga~M{a znlL=>m1Q`#uoPkbC~GtXMnhnDh5$DU1D6mx+;2QAKt3ZQFH}H~1y~00GcqzVg9QXw z_<%(a7y$V|wJgF=E>MgE#Aid|14}IyCM5MhEnxFF;pTzOK(>#80puP=gnOXwAd33` mpMe2}f66m3eB@_fcnmb^7!b1nO#opK8zcsj1F30)+jEP);68^d)m`eN0o>(5%D`Q(1;j>g@G;xlf`0VBQ`PFY?6)!N&f?*K}$p; zB!U=NBn{eB8${1}&-2_L*HuZp@ZP1@clS@cHp)4iM1ewzw59vko7eMM{e9z|%NNdX z0V;`?KKSzTCvTm5bc{L^CIKLUxc2X{i{ISz$8Sgf{q)1nXTP{`{s?9mQ$4&hPiKC- zY8q7(Y1Xu5iCf33=O4Vy(+|zQ?rW#gkKB0f%}?+6{G*qT22|DQB-73`YzA{N4W^=s zq0kQYcbtFfz zLz)H<&|z(Y4kBG67=JY6c|L1R-#TR>fC$3^Y%QEnYO1xHsf)+GU`3F<{J0kR(;pbF3)zyg$H+idfnl-wl5Wkh!vUH z4Z32YP=l_}1rZd1W_D&^$A($A+&a0e&P?xx0!ctY2}*<#p+qPVN*B(YzvAWXa*%bzq z7Fz41LKILT(GWohi9|LgIzSZBhb*Zf6R6O}WYQ4GOi&71s9lmll0x6;8&ILOl$j(c z0Z1T(6Tg09{?wd{moFHNN6PS?$|e>1MxSJ(0Z7o2)J-Zv|>acY@f`(Y@g7GwsEj5NLQo+q|HsxQ5}XSX_d@*^A9ZT9=A{W~j+$GyI1 zc4oqTHx@1FlRjw4XWyPN5i2~l_F3@aBk!0yu^aoRDvXy}8@HCjUVQUsuSH4$T5|r< zzZOn^?Wfa6y|Q($Hx4{ws+)wX6-HP4zo!S?4KJ@7PG@G3G{CjXs(p*kIrj6rHs7_y z+=<-=Q62s9FuWa^X~WKgJIAAZJR&XBB002ovPDHLkV1jCMPILeO diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_attach.png b/node_modules/express/node_modules/connect/lib/public/icons/page_attach.png deleted file mode 100644 index 89ee2da0753040d1ba0a3487473a715a8fe89322..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 794 zcmV+#1LgdQP)i_t#ewV_0K6;=bl;e_Jt7$~$sQ)q$+ia<4Ec+jeaGt9oWH@O|2`W6&O0t!k{B9sUvLWxkCaPsd9W(`fa z;j-|^ZI^2XnzhgZWYRW-kP&J>DWPo`%;JaBX}or79k=+Jo@h%4Eo72tqev+cB?PjP zO<|ByL#>Tehyq$jR74O$B9WDW1`tK`LzYyL3A9iAcRxLkJ`I)n}v%Od-3H>j$OTBtk>(k-9o?8PqI=0 zB&f-+KOXVnjyKJlf4iHOtnuiE_4+ZVJ$dHjU<^o^YCjQ-wt^!;rPpBv(@pFO{9rdw98 z_s@3+yta93oyfL>7AD5}r=|`zS3Gm$_|(iSl8XBd9k%=91J0j2=ivT5cJ18ZmDjh{ z$-RMd{jQ#X79#Sc diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_code.png b/node_modules/express/node_modules/connect/lib/public/icons/page_code.png deleted file mode 100644 index f7ea90419d950f9e69d977a1f5847456d96a5f0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 818 zcmV-21I_%2P)@LCln44|RX7Ti z0HI3&7jPq){odH{?_{%nYVq_;n_c4WbUpvU(&Cvnj!vq|kVC-vpF6vp^;;e0mm6HW z+WPzA`AZ|;pPp$&dNjzrc??4rt`k%Q1l*u-BPD0MQ}Fbm8jnsyezNt7+u{23>t7Em zJtETY?ja9KrVs^!LJ$xEMF3-bAZO;-IQJavE60KA7fO$VY_%N)R6s>g5mW>fL4&aR z*EVgKKTBXm!=L?S0?xM zYqL@C$|EDF2q*3zWW7;PDZ}SK*IE8;i!3U62=qn80C&*I1Le7WwNP5EcX;_oh2dJn zf#HgBe4@r$GcjHjmj2vAfT%(YN?}kK=(*+1*DkNNc1H5R++vfBMhACi<5uFUU+N4+ z<&U*CPmWi}REa7C6-t>2im1CWv5Jkefxa6>)dEj-CAW wWa{_}BJ!}~75?MkfaCnj>Dn=~vkLS70Pk`;z)@TQj{pDw07*qoM6N<$f@imYHUIzs diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_copy.png b/node_modules/express/node_modules/connect/lib/public/icons/page_copy.png deleted file mode 100644 index 195dc6d6c365d298e466026b37c1959d96119ea7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 663 zcmV;I0%-k-P)^@R5;6Z z(>-WZK@^7J_sq=QY_e{46@P+~LNG}sRzZsxQHvCsN*h5ir6^j7pq-$xu$N#V1gx}9 zClV7;5)7zih-s3DB)G=7|99>ji@So7-P24n=VQ(@GctDX!^_@$bj%oviY6e4Dh;od zooe%Wvs8LEKQ&&bL&@bwi=STIAI@!-gB2jC5+?y?VR~VkrNxam-`6*8&po|RZ5LpS zNKdJ%c4bTX`XjKsnecf%W>1%6WT?pKNdLLq{=(f(Col?P1+oq@R>)W(n=x!|*BIIh z6DJGw_w`)u6yN|vAhMteYK5#b%r5^v+VCFl1IGssaclZZMS{vs-LJ2$)n7DAr6==K z<29#%AXsBsDoO}SBaXR#_Ap!JKx)(1)3O2pj0_dYWz5By*X74fRT01$Fk%P_RzOMDtV?GU{nsYq#K8iy zb6qzLYDj`_f5$BwC*WE(t0m#xYJ*=jC2|HQYHh=pf#QG7oowi`h!L!{DB$8|qY{~X zu8@sU1tWq;n$XThR0%;45mdqXM892|{CJ@0DS*}>?ami06Q_^tvM~Y3K(_-`#m!8f z8f!QIrH4y#61;0Ym0cCoLl8{IPombPHtnn7%SbTdI&G-d>ZQo!_wBMF9nzX!g8HVY xYTJPGciz9XMh3w2fmZ(7v{)r*QZD48?mrio{~IaoqP z|1Ep}yDQG09bP~E^Dk?@JiKQJ z6-pO(3~IOP)IYisL6D6;oAEd;E%zR}{U$rMRNuD6nQV7nesKS>)yLo7JuDCrD>Abi zbj3uW23?^GA}9jQ{M^8v?ejL?HaT7AX5WPZNkBmfN`w-jL?{tT7ykZt$%Yln?p_m~ z-?>&d(LD(jAd}h=LPltPQbO$*Wbyl@G-_k5jXbb#qffHY03>M1jfEqoPJQ6Mr=Byp=^jfzePZV1 zLjCmNi31hdIJHa%e;5g=1(`u3BRzfeExY%=VCu{loOr{`%2hUR*x>tL^W_TTaj);0 zpPR6CUD1+0>4TQ6zVfH3TQ;%l6#(_%yspK@3gcmG#Q4!WCPyLU93nMKk7E2pcA=l45({2jNho>sdF*A~bA zxX?-cp~y_z_kFf+yqu3m#QiB}03?Z&9vvR5TNgj<)($Vm)xq5G>|o2sFMag&6aNF+ WAT1?sQBYt20000iHtsh1EzPArg^Q zIZrOk#rNsfjaSbMAL;<4h;Z=jvu8dzyz8N&Nb7=z03ZUw?9z%8KQEa6yM5=kUnka& z3?FJk2}L7q>na=T#;<7U*P91xfF`;`6%pVgWgRy0?1ZryL@%z52=-!fGXWGEn4M351L4<+7eDgwo|moqXT+s1&Kmn>-uQQ8mL7XY)w5Zk*(g+<3Y3tmkR!bL zOUKaUtj_pX26sH+=Iorwu}MGd`_%O-_sS}8VpG#fJA)Fcs#ezwtZf?q?Ac70mDv`rVs{$od?VPKeqf<-kUjNtS6ecB*mq<&M97K^6IVsDO zt2$Ru!b+>2S<}_H>$RcInusU_8PMNdf(W{sNlJ3FkrwMJPeBPO#d}Y^a{9TH(#{Y) l0D?dWAV4eUJX#h`!2gmISk&ZKd4B)^002ovPDHLkV1g&sd|Lnj diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_error.png b/node_modules/express/node_modules/connect/lib/public/icons/page_error.png deleted file mode 100644 index f07f449a44ff2761bfc7b752db3d08d0e1238b02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 793 zcmV+!1LpjRP)lHwhvrAu0-@MQwt}+5~MQTtu}C0%;W( z1<{R?aHBz*g;pk%AyQVBR_Zu5m~;ES_vxI-O!vIF|H*|T{l`n#garr?$RMk>)?Y48 z(ZF2yTneKb};DNWF+jK)IF`6_IfJ{i|F3o%Q+l&4_HGBD|ACE8na_6>L z=s{^>-C(a7J$6=8A_%h5W!1K6dcL!D?XX+Ndk)oei?UundDpX_E&1Y&`)3P8#Ny0s z2Ag7_&ZPhyGj%)g&S6V2LNun1;iBQm#Fwlfv zgyESZR$X}2P;=RW!2zid1r$hBL{K7>2qi*f7>pT1=RdT3@-anEoH{ z={KFOO;Dh#bV*jaN>}M>RZqQd`S=6O9C3KpI~I>l%QFYfo;jqQYe5fcn`)+)zMm6P z4X&L(>gnN0!%J4^rhX->?$S5bY<=GEU%jc!KLL8sww-Eg;h z`H-yBHa)yfojYT}&G*GFc$<(Yja_q=lZvj66DC^O5%$B)|Z(CeD=n`|eM04SP; z>-=-l+xdJjA~vR6^xB#o{ehf~tSM`iwaQv$O<8NIHA}W_WOw*~ XD^gE}t;YAo00000NkvXXu0mjfl6ZQ> diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_excel.png b/node_modules/express/node_modules/connect/lib/public/icons/page_excel.png deleted file mode 100644 index eb6158eb5ca9c4b64c81e70e0fd894dbc8e2bed9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 817 zcmV-11J3-3P)hdKqhFO_H1|Vn1E?(=|cjAh_&P}y{{^`u< zcYD@PK?$)4i~7o9*6F_$F$4lR(d4AAvrez^(88Hk+)+B7E)M3jc=Ewl4$S^`_qwSF zA%qz@=c2EOsz@0qB1IqsqJU)HaG&+}%`-OM8YqW{K85hqj@4&V9vz!Cm_n0-W#f;# zeEpJde%vdgRn5?(+PY=W*z~|lT2-mtown({ll8&3S5+lWz5K}LTRW{k{eJn3Qz!SU zQ`@qI_n2;K?RG~pYJ9=dj-RWgG;P&wEuoAxL~Q)<>x0b=dED^Outj&xQ^rA;u3pw| zca_ClTh_d9cxXg_U!lLRl0`xU@$=UXO|_dRdtXfKwPawmnf(LC7u}-U>8k6}3u|{8 zs9LHr>MIJZGD^r9h|q2yF24Wuh+PM^yMN9GP1$khlDkdyCY}D{kg}jEf-(kW5jBY> z0rB29ZhG-r=i_R{;+1k0?A-sBM;AP6(k1i9ZuixR4?MqXOvphQgCYj~RnXKKL~J9Q zIDNz~XMfO{ZhUg&BTtMyXJqDVqc<x643?SvKHx004lTvR=0a5$dUw z>Xb470000$S;ka1sfH4I-R8njUol7M4dtApOahDylptpYswf1hD#CwFoz6oEA>(SIECU&IQ%a}GXdnC!9$70`0uH1B00000NkvXXu0mjf!8w72 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_find.png b/node_modules/express/node_modules/connect/lib/public/icons/page_find.png deleted file mode 100644 index 2f193889f7ea091c292acdd684c595dcb206b5c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 879 zcmV-#1CacQP)@+1&aazfGU7ezSm^v zpACwO+tu0su66!(dT=`e05DeeCnCFJW(8|RKtKa{4LGONnx2V85A4m%PEQ?MEtR-esdM$pB-`H542D0)N2zSC6Imf)4L8?>%ZrW+H>xCKi$unm zvGZq-*Q%Aahx;C*=l+K%-?>XB)6TB$-L$r*`RUvlA`xP1NG2?)ge8@TQ4EN|Jks0u zcDg;oFC#-#R`YbWB`D?Q`1#y7l$LXhjSLf8AvQuB84}i#j0^!#g{VE#(K7h@5pFHy zSenl=@XBEdxp`h2Ji>CR%=qXJ7!e|?paKet-~;#ok#jETyeB(5&Bkhp;!+;51~G=) zH?L7xmDUu_h+a$+xuWom;AWW!mS$%%+436Rjc@}y?l1134kgD0AOf$OmjOR zstUlshZk$ZC!bAyIg{Y29z#&@3SJ;6D4+_eFume9^#TmMccC5u0J!ZCTnO6m$lnD| z5JeFHf`Xs~1vP>RLKI1GKDY<~pjr2&bi(fX;6Nj-ss@Ds0CcoO0H{JsEQkm{q03skAA);_bv3q{k31qwVo&s-q`Z?_e+j^w(WL? zl+uETs5+~xBU2};OqEE9ETLGwsMGe1%iTRNue)9}|0~E4B*@5#oRXZ9oRXZ9TqRep zPrGZuoOON4n@=uPbyP1y4G=+HktC6l(gZoFD>@_lXDrN?wo+zozGt3P=Qh+3L7+}q z2!WK7geXLnO3Vw;o12Skp%_E#+N#9;DDWP?Q-VS3B$v~Ha)dDzWn0zG~O(^_1!n0HYp-( z+;wPIdoFgQlpYV!10V>5@a)1LyGBMvoa}miyp(bxbMTM-FYNyx;V@TfYddyT00000 LNkvXXu0mjf90!wr diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_go.png b/node_modules/express/node_modules/connect/lib/public/icons/page_go.png deleted file mode 100644 index 80fe1ed0cc75fbb67e9398ae686641f8fb287238..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 779 zcmV+m1N8ifP)JNR2Ufr z!Apo%Wf%b9=l#x^8AolrB&K9H?Pg_|78WA8(M3toqE%3B#7*srcF`i*xhupr27%Nr ziguah1+mN)U5GNmyEfQ3-e%_i&-vb-Co#(>FJ+EhQEwjRYVQ(&UYy{U@%vbY||>@4x=B^vIqabI?L* z;-S&DS^V3-ni4^fl|HMkOEbgX)(390>A}|VIypb5Xee4g;7ck zwKh^A3Mi1Mh@eC$5lV!}Fw%sP623U`g3pd_Hr5sunLvTskx4}&Gm%Q6L}(l4x}jCe z*81q1_4-O*ffi~_nMslo?EQ8t*&Ec(pzEw$vc}pKn_Qp0>D7Jr>ATNC3w@9f|Y+U&+)#!t7l&wKp+nP{PQsb+fb=Yf!Fu&5j8vpRj{FT>jD z>d>$sx;A&+`n$HcF}&sYKSyR;=(=9tvvOj@hUG;~4qTYk^_@E=?$*^_pVh_bGnOt~ z;pEw)j{SK$XVc;qy181rT655gW9NG{(yeablViIL>cDI_ux8m>Pp{tY$J0lgo4#ax za?j0EA3s0S!f>{~ykN9h_RhM&g3K(E`q(dE(Rd49+%xMeR9{qlWnmd{s#(SQ>PmFtSQqUjAtB;_Vvt6}AS_5YgM`Uqu`yva+H8^=4U$e4gHb}u zAQ2N{V3A%pO|?Pv?tb6z=jC}SiRa$G^v3q?*6XcYz$p|cq{uLj@#~Fi`J(>5{@&&N zy%T^+;>8cXx%|o77anP?&W1?1A(>-T49z9pyeCl@7YI+Si zKti7=B~``}TImz(G{0PnlQA3P#MAd}sorMjkP!50B7$nAkU^%#nl{Q9lW0@}9fE-> zN(q7tRuiC_T1r|BBtVBTlQ2+70$Rf;eF`Z;lx46Cpu-rEgb)EBKq(b^W8l<^We(`D z43?0=01z<3G6+UUv6`CsWCk6^93!#+<;ws7007{zS3k2k9-zZKFO~(k`>s0y006+1 zgF_jyIhsL-`FMf~JL~C=cV75(CrJ|q;MVO961G=O zm9d)YpJg5g(4i_HKL75eSE}mq$Y}r}hyVdcV~p>6a}oXr80q`oj%+s700000NkvXX Hu0mjfPs|!l diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_key.png b/node_modules/express/node_modules/connect/lib/public/icons/page_key.png deleted file mode 100644 index d6626cb09eb11a298b90a8a27b0d8eab41f49a82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 801 zcmV++1K#|JP)$lC4gU2-`f*>nhR-;k6IP7e>YO!0^w)WK%3$w02v-#>5Ep64PCP| zJihT#O|N+nT7XR2h7dAB?UEAOhJF^mol1i`QtQB`HSY}RE7=r! z)zaVIHr5?>v2Gz&fdYw&2ug$!p+txby(aWZ7(4QT)l2`jX7eMQ{>)lG6ev(fWKxmH zOr%mM5$6B%u~qGtCf40#`mbGj3s!n+^%wnJ&#rl>g<4Z)lB5J6f!?|AP275)Zswr* z%T}4~{;_(?waU!#?JabbF3Cy-kf0{R{z}6$e=5yMQKt3BPcl2>zoTPMqMwF;3!_n|>sT?~bK_-2O_m+o>GJ6h zt=+g$4n7y%1qVJI7*5Yw(hqM=JusY{d}*?U(Oj*gT655eZ>Ksn(qrd7v3}DX1}C>` z+X+8@+4-pVq_fxG zlU}~Ye!0+%>J+pPk+0wV{GM$QaYM?5ux)w2z59=S&H2+K?;gH$bZGzL&g5>G ft+noNiyiPkP9r@8gT|RZ00000NkvXXu0mjfuqTIu diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_lightning.png b/node_modules/express/node_modules/connect/lib/public/icons/page_lightning.png deleted file mode 100644 index 7e568703d6432c530224e443771a04fc1e2e59c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 839 zcmV-N1GxN&P)73{`^;G#xwAtHz%LU)4b zqTRU=ve1RNa3QT=ZM7C`iJ~QFQ*9t7<~pX$d^7W%^M8FFCkcQj-~0ZRTBCB(J0^iD z-~e!d9LR`f3#|=(>$bPvx_D-~2jC%pJ=n_e_OK zeJ_2b-KdDDh@@UlzBSMC;EPygH_MwjWBnPGQegihBV73D?-x9PlHL9A=(Vg=8^d<4 z<9r=UkxuIm)*CO=9e###7PztDxUv}e?$0)rQicmYhV`pQ%S!g@;K(?TVfhM#E?bM| z=B0gfb6h@a8bf5FVT-SV~6}?X}9lK@@Yynoty&1zdZP@?RfODsl=2XzzU% zS8gIN43How+9%bK2S@Xbc`O>`z5`%^;pXGy8^4f>9^3!Sp@|O&)m;dOa3q6d;4P-l zca|=H_{G&m?D_+&-}r{u-J$5T=(X4R&)q|O^gN8cgv;s#@5sEPT5_Z)oFo9Ac>l+I zc4ng5zHpps|9)<_Rw>5bKzE(M1j)dFWI_%OH$BJSz0?T+02W0)_a>#vFqb!*d|5wB zzBUN|M&ty51O@=i?kiDrjQ{{}e|^rU?OS|RdxxP1p5mAw36cX72#`R6UsoeCQFI~! z0ATITp!vfeYyQ?Dr=^5BAshfEa0nB~JG?nUa2Aur006MC*<9`)86SPS(W^`H2n+xi ztOWohsFfVfVWrI7PSKW}BmkyPoj(-|J?ES|BGd-}fIxr{00@ANnO*ZR`#)pee4I5T Rmm>fG002ovPDHLkV1i|Hc$okI diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_link.png b/node_modules/express/node_modules/connect/lib/public/icons/page_link.png deleted file mode 100644 index 312eab0914ab59271384686255d1be913a6b3add..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 830 zcmV-E1Ht@>P)VWgGzD=Y79#JI$lhEn`|2MpRa?Bt#-nSD~P0P(mbVe{KrOBoKnSsk>m|ML{6l zBosu@om4j#WzNLRAk+{k1JRvL(MfE&vvbb->v>W{*z*1_uMP}0cIRX*?mz+wk%*#O z%0D-+$B*g1nRkvI+_3E8Pr1NC6@5M&4vWaLCnNlr;lNlr4i91z&)eBGqL{L{GNu;Fof}GS9{gM5BJuH;2QWk8yuOZdB3pGR#s8bd~ zAmt<>3Q=YH$t5YJ5;7@+8Uh6=ktBgY6#6Pa%2F?h910?U8cLT43KAj$Z1*==ra&gILO{WkHfs(--F=bly9l~${z@AT>V$oat!YAD@M zBE0v_F{`g#^wOSP-u~!wvlmXdd*uqFqoZ0^{&nEMDU+=!>({S0wrQhFmoB}Yq1)~0 z^{A)L8Xjzdr(W4_exYO6u3a{4*kIeXZMJUR>Q=ksjW_p!rAwDKYUs90>6Q|C>56o@ zbrSq^Xk7Gq#>dAsn@un`Hz$?w$;Ss`%jV7L%9ShgHFV~C)6M>B`Tp%|nqPc&G*A3| z)Qe+}vT4-x^t1~XE@(6wR;^lPWMo9n*~E!cy~)YRsT2{`?fqeIw-e7N@mOA%UcCIq z_kH(_EK7|>pM*1Wt2^DaDAp|cvp*@(ZZDKpYkKC^?97(`0sb&XTXy7N#sB~S07*qo IM6N<$f;YmCWB>pF diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_paintbrush.png b/node_modules/express/node_modules/connect/lib/public/icons/page_paintbrush.png deleted file mode 100644 index 246a2f0b426faa0c7f5ba009e32b1deaf88d1288..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 813 zcmV+|1JeA7P)otxGRZMDZ!_a~nK|b_-`n%VosaL{KDuPV10`(1LIen8kX2Xff$3BE zah#djvFGJ&eE^89Pk*-O^+&d>FC~^GjRYVQ(uuPJyS|-v?9lxA-+tM5>1Qu*n+Ir1 z6KhA>X4$XDH6?-|E5oe1E?pQ5-M;2xw_ex!x}I2+b=}mPFW$U%^;o(Zg*LP!K^1kP%8ynsD^= z1y^6xD1#GLjO{VLdh@0GKY7;d$+NGukV)GRLPn^=q=dF%B#XaJrNP`0E6=}e&Gj3d zKJbQre*WXt!60_DnIzgMQc6S#fvjXxsE1v7;T;njHkdy2miIqAS(nX~o%cO+q+b#h z5tIleLWvL=dQE8OC#{%y*Tnku&K`Tuub&_ELI0t_ea{@3f>Jv&sYqld(%}3_GY3Dm z;O{3*Y?v^A`a|D;^qrM=ykI)U6QHd%WhO~VF!SGjGn0GOZrc3mGZudNl9{Q#X5&-F zuGwVReFLBjE5jr!!^-5*L%!I%PkYH#Hs5rMrEBl^)9)9XTD;xjHFxVZMc3~Dw6#k$ z(-S}RE$bgMHv6Z`mS5|u$$78sp4G-8b@lVkl`HtEv+MGn!F&bKcHPi$$oP_;=BrPf z$(~b3&p3CsuQxhoV$%jIR;`lB-s7FDX)xCTXuJ7ZyIQk96uIR=HBt%-P?N*bp`)EF zq14c}QM+O70NTOa@V~_)&GMZ$^cQDlkyOCa(H3Mf+6xhCuZh`VSN{cQBl5Ys9{cp( rh`2H3A^=GuC6HjQ*7|*0>;m{7QlnX3z3MSD00000NkvXXu0mjfR5FYo diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_paste.png b/node_modules/express/node_modules/connect/lib/public/icons/page_paste.png deleted file mode 100644 index 968f073fdddc1cc0f0800b1ac4001cd9a55f053d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 703 zcmV;w0zmzVP)AVs!l4K}n~L(tL`6d4Up4iSWnZ3Qg~4n+_J zDGk-qQdogO5JUtO-d5pRp7Nd7_r1^a|M&Zq%mn9Oe((|e0sw%Ur!K7T1pojj=U#f? zQM`qbQrM^DPkwa?DK_be^~z<~RgSMIa<`xP_4P7gg2jCwJ{9^k!fsU=#Ti|%I3p;>90Qd+7|~0h&mIklA#nb>ATL2+v$&u)OBgB z;nsHb)I&QRKeX40H~~cIZxCd}5C} z=79lXoXK%6YlyLtsV$~bSm?Upq|DJh#{|*a7XMm`4QJWZ>s6nL2R1|&J z0VPEwJ9?!n`o5PKAjc->P1Gi8BY*%!5&FVp=#)$mMJYul1Jton}gujiUf??eOy!x&!tsjxy;=Q3_DdcXx=a^OBhW0N~`A@4xB0a*%F? l+@c^sQA%W+?pa#c`9H5UNfS6T{e=Jk002ovPDHLkV1grvM=byV diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_red.png b/node_modules/express/node_modules/connect/lib/public/icons/page_red.png deleted file mode 100644 index 0b18247da5850f3c2486373a3e179acd2772e8aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 641 zcmV-{0)G98P);68^@7JE5sw#jpE*579S@TLkU(6yap1yN*Zuy>-hV%Q_v4Ar&!63c8OBr(ZRhFu z_kWs36-AmgZCT>x!RqM;Zu9tqvoHI~k@UmYo_g(*J3c%2{N8}7I+|qKPQzv}7t>%W zsu&9G)UmCzkDYSw{fBnuW4j;1fKV_nicw`$8C6D=F_qu`zUiK$2Oc?5UVY+D(`I@R zW`KlwqLftWHH3Z2_XVNfKn>VgT~k=@- z+N>c>0|@A_HbI9Jn`v0~7cfIF(TS69zaomDS1QtgvaBBfGEPLHccO2~3jc>n^6}^HAEh-2#VxC7YYcDXv!L9X= z-R*SOUvIs;n`8(LxP4~^2|JsiN^hq6cU}5dn4v1~Kl{eT7pm&f$PoY`hyVe%y8G*S bxB&kH@RuR86sIAS00000NkvXXu0mjfZBi!% diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_refresh.png b/node_modules/express/node_modules/connect/lib/public/icons/page_refresh.png deleted file mode 100644 index cf347c7d4685128a4a447abb9fb8e939417644f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 858 zcmV-g1Eu_lP)`6pHR2Ufr z!EI=jWf;Km|8+n2IrHqe<9xxFVk)&(Nh?w$Xk`TAyvb=#e=0aySC z00NkRDM597_LiNIJ2M^qhuTvB004REvvU8@of{r?P8tmo3;+Pk0F0@*jAMhdOkS&1 zhJPPfQa;pP0|4+Yk%#j>X}o-s#EF1_DMV93FsfPP`G*>Ks>L&)Q}w2g%slu0kBfW1 z+*$*0BC^oTl6>OGIq(9BgG4|C90Dk-N_mPazGrQ7uHZ|>BLD!-KmZ)z1e^#?1Sf(M z!6m}K(^b|i%$TcA5bC}r$tAA?0C)g1@CgWliJ;NAk&ZF+-w#}$`-3nZ32C6IVKrHp zr+(!L2hRfF&AsTw>_@ z1y23;E%Oz}?q^Q2d($ayO;-sON2t7$w(Z|o0Pw1YnSp^}0PI+I5HnDNsFCA?oorkG z5sUIGIq=FSyxcj+xlhkm0en=52Bx3@02o12gdAU$_i?v6iyFMuc7P9#zQ-Hf; zVuV$t9P5`m)F2w1?t6{<8%wk{w-PP#Sj#%1MbsjrSI6n;D_@8q9`~W98dNQf$j=iI z6~hpgww&be%X_HI50Hhx@W==u4TLPB;ei-J-1}G8wH}|{i#Lk-WZAyfv}k4y0|fvU zZTy^$u6L>2nWo(NDSV2@MRD}JQ4(c%G%=dG@_vxH?>gcH#*Ue2HC}9sapf8X?R$Z;XEnm&g zW99mh)5jNw008mK8)r^`_{yH0rNn%u1|SpC(tjf#om=+r#lh+?Kb>DVb9`|C0Bvbv zN3U(>f4-tAC1hosRoA7p(b(hL*V}(j>ug<`&U)|l$6o$)!>PBQ9RQSwn9asj2p*|xhU*R^vq?*Twb0t!lm5}`yW5lRy-U0ZYK?8to!;o!r!XeOE$ z0HB3T+6EEoI4PlR=wonwqJ+TvCoWh&$?CAPVYcU= zD{DS0?AkOtb@-hh^ZLq~FMjxYf19X?pa_YqtgZGvv2TaxcF#KT?O%=_*a-kW_;N|D zakkWsOe!)HsT5WRBiC+p;N-c>0Qwy(1D2MDBC595oXSiR07)sKNk-%9*rDBOO^HUD zZW#;)R&EZpqha<(HK$(tZYU#V29<@0qCXgU{gXeGpc_|pTqQD-WO|}%yKZbeX7k*H z2W~CK$v8NBAq~czrc5A(v51g0Wma7`G8}f=ZcuAiYYxZan@gP(;Ku66M6?bquGiHe z3Q0ya)%Lvk@kLixZfZyU@#UFbv+>pYhcj8TRKSr_sWG8i^X~UA**LvbD3(_Lba3xm ziYcpup*A9qJ$?AA=Og05lndxfwr`!C+O~h|B~4 z01q8H`StcY);%&mId7_+)76ovRpeNWRp&4M?#jx@|E-)x%P*A6t^fc407*qoM6N<$ Ef@ddc(f|Me diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white.png deleted file mode 100644 index 8b8b1ca0000bc8fa8d0379926736029f8fabe364..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-&H;pyTSqH(@-Vl>|&1p(LP>kg~E zYiz5X^`c$+%8#zC{u)yfe-5 zmgid={Z3k(ERKCKrE7DF;=x4^O+ pzO8rLO8p|Ip=x)jHOtWj`bJBmKdh_V<`47(gQu&X%Q~loCIFbEay|e6 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_acrobat.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_acrobat.png deleted file mode 100644 index 8f8095e46fa4965700afe1f9d065d8a37b101676..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 591 zcmV-V0~O9lw>B8WRlD)Gm}Jrz31u-X&&gn2lvjs=i{7nIaL6v2==uw+8Lcs(8j27 z;|c`rmSv@Lx!heopGP^^Ieb3f=R!%Lpp$}iMS-&P3EJ)s48wrJ_Ni0~k|c47D2nj= z{jS6bt|kFpFf|p5cM`_&0Zh|`rfEp0(}=}lT#(6RpzAsUfxv^LSYX>WlAaN$>)*J5 z0#sE+JRUD8iT9*fz{)_^7@6P&!sEjTcD+I9Z4YjT1`wH@fV{cEvneYGFU%maIEU2s55&K(LixD|{p-uiS@?KNj zk-Go8G$hH6g002ovPDHLkV1hVj1#|!a diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_actionscript.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_actionscript.png deleted file mode 100644 index 159b24075191fc259cfd80c797a1b0d74c168422..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 664 zcmV;J0%!e+P)7Z7t2}reCh0o`+ zAlt$F2tW%oO@m<=(B8a-_VgLl#~yUMUDWG!0qFPppd^03e+x1WpkO1NhIaKD2A)-@ z=Py8(Wi%R%JtYZG#sTKH@6Z+&!S3Edf8jFJJNKuva#KJQD3X^7;H^fd2di znEN&c58aUG>`>P{Vqq$kLb+TP{?I!d4(|o59X_%|nVEZq2Rk60n7072SWJ{64CV?3 zgS!EB=eYxwQ>P2&$}(iT6UMvuFgHHIEdNA29!EBtg=v~X!DxxEH~}L2zn|52%xalaq@DTdhh{EVwv0IaQ=!?daer zTKp4I`l8SDt;d{8Q`5Ko;BXUi&oAG1l4}59P-{|^S(Rmord5s6qsh<&m@Ab^wqCD) zHyRD}lKLDzpYN&@q5&*47mGzGiqcXpmqR9#K|CH8kXS4RNs`(iEF%HjP%f8ItyaZK z6$%Apvsok(2>~dTO5jTZfq;N?0ch4l01f$k9?4{~Youl-#x{UDMr#AFIkz@SDwPtQ z$gQ^$2|*(Ps9LQiav_8o8Ne<=Zx1*M*syo80sEO1tB%>5 zfdHB`1z+!R@?ghPRKmL)hWEvZE$=*54ose*0JiUNTM_)cMDXhxEKg(?-pD=y<)L4J zT0dSyD0&NhJ$^_8Ko9uom%-ZM4BTM{Tw$9qyPj=-9W;N(Wi@3*-Q4pq`Gcp}^vvNr zyd&PsmG>fpCSZz?K}UIEd;HGgG%0MG>ymxKPwy{>wy(m*Atq7)0000~7 zMNw2LQirBVQoa8G3P(rY+l;L4iy+JwSqmy$9JlSkk z&*$^Eg+c)@!R|v4gdc8+TTn&eWHO0VD&>$!B%o;;WLf4CNs=Inq9d`xA4otCWHK38 zmc{pkX`0Y=9g3oGK{}lVy~OYL|C5lQ&U^l;wrg|7w=BcA9L4-r411?K7f`@348&rw zXD#uW)DK;H`hxO}u%=@Cj{;#u#_;bb1_KgUOT2Hp6;)MvC6P$vQP3=g1O5#aU%I!K zZ1dc@f}YvG&*Spnplm2rIp^VdA^HydZ0X1axdms2!RKi5x-SFA4p@ zC@N|PI$ryHL@t-(!zBsf2-+sYAukhDHU7Lxm88-p zDk^c;sHj}OKUc4lGZU}6umlGVNAJx0%sKDOFwQx|V2pVvxhYKe|L9TNk!~md3BVrm zYPDL8Hk*yU-ER3~LGwJ7N`0ZV&nOhBI{~~A;@ND*=kxg?#^W&`4u`zk?Mg_e)8XlK z`T#M+OaR1!<#Nf_>$S`xrqd}OjYhoJ>q)?3vEX8pY&I()ERjfjrXM$k7e+-Qs3Ihj zNyOuEQ2EGYG7ro!o6VOBQEwuV2z)*tR8>WxP{616FY)p1Pn1d}#9}cxolZC$4n(6- z35hJq0;FlHC{ zp*iF(lgUK(E`($(s9pJ8Kn?(M734H_63WHtf}6SQQ_MXEP!#0|&@>J8dL5TfG&tBw z#tYn{TCGZvAr>cca%YYn^!t73tg8OOJ2FvJ(`YpCyVZi*?Ur+1uUA$hAg8-aK)c;e zQ<)!XwHh|n&ND=$@^)>aF-`~n}#*WMkD*M|f8r$i*z7+W! qF|A!t*4fE(R`<_YIkN&?Jng?3oQ|aAqClPi0000t>5xmo{nArfL4CJwMMm+N`pQ3p^Le$?rMud6Rbxz!-yG7bz2z$^USP5(;udf(gfQ zG~f68y^)EvcNWp#bUoDt2=h+^%o-?-|mo~iieWqLNP<0m@2PTB7ftyb= z@H`K$>v9Pr5X`L|rw&CEN2(9SB7A2SE;d|j9@*F}sd(@*2l|P*fWfK>1drZUrtUA7 zNXO~pKn1cjf~~TLbje1g>EPPzN2GH#UIBxJ{}S9=E`{zs-w#hO?vcH+hJxroI5v?j zD!4lP0WXq8zUx3RAP@|Gq$}6wXCjFLZY^YSWBxN9#&g)ro$%5}aYn#y=tJ_aIT%4d z5d4u`rlp!};XGmbZkJE*kYJoi&N0pd*yxY{0${xD;;Q1h^8f$<07*qoM6N<$f(}t7 Ae*gdg diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_code.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_code.png deleted file mode 100644 index 0c76bd1297751b66230f74719504b2adb02b1615..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 603 zcmV-h0;K(kP)^~*-1fljz_B$LUvK}k?BNXe#Y!m=zM!!V#}8bncK5m;8VP zw86G*RI63?Cd%b9bX|ueNlZ|wR6rj|r_)VIP@r2imh3?SN+^{|kY%~8B{maJ@F*OK z&VH9LwOeGt#DRjj0~v~8`>iO7!Ybi;zE$va`A^T#yW`y44;k^#O~K5*jD=qcUhPSc zvyy~q;5H_1WT1l~cqje9yfa+l!hu6xjdOJ8s;8E^+=QQ$tw p?%p!Hy#YapB=@+^9(46X{{RQg%9y;OKjr`c002ovPDHLkV1g7l326WT diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_code_red.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_code_red.png deleted file mode 100644 index 87a69145075afd8f8fd8b391c5da1249ec8b2889..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 587 zcmV-R0<`^!P)LWh{^|hy<@Q*xw+qo|KpY<+vaXbbW{L4q( zTsjXEJvb}e%bgb=o%W0h?4u1;^bWTqH8}5Th002ovPDHLkV1nrS0P+9; diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_coldfusion.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_coldfusion.png deleted file mode 100644 index c66011fb0fbdcbf210483d676b7131542a0e282b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 592 zcmV-W0k7R5;6x zlV4BMP#DI+Z{WQcKZBTk0lfkj5F$ztWhP#lcuyb@0@rA^#Kpu5KLA&Rgc}o#aSmis zrZC__xY^&#cI&!!{c|4Q_tcec*#b>|Y15wPcY2=o3;-Bl=(t4;6Ok*pL)-{*A;GX^ zS(@WGp6j~k1wBVR9)BB_gar`}HyRBXh7nM!)u5^>N~MyN6bc0-5{W?44iB<`2biXb zR;wk?jIQg@G!5l)SqhrXCU}x$GU-dY1sra}0uCq@153FUULT=jNwSk}0WBjKz}Jdu z<5gB*<^XtpAmp3m^ZEXQZWd1krhft}CoYaF4cSMvTJ01}X3X37KYdx-D0$c{doUe8 ztY{vlGr-e*;N!WAV%_hgUawyYrhegW>^F)pv%uUTFslHn; zvJ)l{%w(~{!O4`KTmK{Q{zCYltLfs&4?nz|6IdlqHCvX;|HGv~!QW?8P~_d#e0$v$ z)5XHEz{3>qMiH`1+qNYf?huS+@L`J9_$cjJF)Hf?@pu;)`9}BXwGUM{2!{y-4|Z{L zG>z?O%Cp8P5T#j1DID7u_*(Jg?7iss8AZQ+&;u_J{FmILf((9eoiL5nGUe>Fgq*U$z0000 zJ3A|*qoWOonz+4ZQ0KNhDB07SX1?#FrNy8%K)_l}y&kh`*KYdy`Y99&tgNgMLSSrc z?B?+B@HO@P-jS~z2Rgc6yy~Y~%>oJpBxsb$5<&nRLqiuR7K=@0SZj~jTs|sv_jWVX zGe?WflejOaq|Vec=s9+ahmXbyJ|T)Sl*?s82sr2H?Ce~HD5WI+Sz&tmWrN()wI2}+ zKqg92t*l^-#ae~;9%KFlWkmwnY=-UK`_|%ICZ#P1gdjK<2n38VXsuC7{WiU!fZFmm zW~Sda9(Qi@pxO}$ARY+;t##Ao27usOqNt7Hwq6K7G1il@xitj=LIM&{N&#SuX;x4x zmG6FhCg-$PI;hQ=;1iZ>F>^~@)IPi;l}fX?SZ!QiO=X<|pSVkNpJuLHzW(FT_~W-v z?vFpkyE>8ee4d=7wKauH5~dd_M7d2Aa=ICC{Nj7Blqv&DQEP#j_VeWV&WXL>c=LLK zsmYg^_JiDb;%U!UxO%qjFAvsDFj-kzT2$GbV(ZopPM$i$z`!7jvEk07BcC=6FMt4` z*0u3Sy`0b~%#(0000K diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_copy.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_copy.png deleted file mode 100644 index a9f31a278e17993d8d4e13beac2f9d5f7b42d08f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 309 zcmV-50m}Y~P)sF~CC`eaI+m%Y8jfzomMvZQaNUIT3LIrJ$h)_W{ zwF|LDNlB-g`Hb_G$;>3F$9JF3WYR|3fy2C+_wH}*xp!_4fF2UN4lt#d26oXwru}hT z0+0%Vz-l&|Tdh_L-Ng1G2*RBtBncRx;99K)&+}s0whhxXp{go}$g&Jk6k|vfypI5M z!1sNGVaV?!*L7i87Bo%cfO@?S`bajL{R<($@$|PtgBRcCGIJ_2a|&kO>G-s2aR3E4 zjssoScUa;zIdOeGHBnH13G)W-zt$kUQgNfG;96b=v&4NzRt&@7nN%v3HsG`<<+F$cumMs448N!W3r&2Z*b~D5^$^d6Jxn@SFK5Q8*uKSR7x{I|H-_N1f+AD zSYC5@2K4OKL$==F9U@CH;ONNL(W}oZICHn;d?~pw?GRIsH*x-68Oy6SuK`)`{E)46 z9^3(-HXa#X89SBv?u_YP)WjsQrp;}0X?Bxrvf12IKW8>3t`e~W9|JS<{btTNbNT@EQIWBSNJTX8AMGXD z-SsH|s#>j9Xf~VMtyT-YMD}5^SWHTY5->o`k|d#AE_YQd79j`%GMS7FNvG3b7^Vy9 zn0HYCJy5MyQLoqKnW|JOp-?D*<2V^msZ>BOv0ANd2n7t@{=V;sZrQ>3c})5_%ms4z z7!qXwHHe~!QFj8aR~&*-3F?O|;#(ESIXP~Os%|~y^7c15*q5`gz2-5ol!fU92NIGT z_ves+>+Tf3gfcL?!nimYmR}cw*|BGULzI^7!;k#3K^YO#;!+vM@N~(99+<;fdqr zYPJm+pXYFYk;neQyXXEcTQDNQx57i`Okp9A#n?<7!{#tnKJdsF>utb@JH7dU01gfL zEK2hoPZAnO5+je3&^i*hWM`qCW^vLK!O*?U-#IvXV?#6koWqrwnD{j&K`7N>^tR3G z8zr1(qVOzcF#nF1&0MZ5C$l8*E^Uth0000zE0Ay_3@1Z_7#f-XWL#E{8Al7>L$ z0Rx7lnddoqAyfT%&#`$;v0@*5YdW3w z7mLNoa=FAshK% zDiy@zakyMAxr-H?iQDZi^!t5;Eno2A=?>mMx`Vg(Z!?<53LHLvfTPa`$mjDcX*Qdv zR;ylN4OH+m)fVX&Z#yZpUae;ss@a$K&})gHovkhr@w#xyPVlfVgXti1_357y%I-UHDvRWYvPEX+#g+j4Q9ayba zh7uQN1j%HQgA=Fp9DfODAU^*3*FCs^6IpO7xg`RUXyP)(;=d!ly=#I^l3e0Cub`{H Z`5PU3+D2e&<<>s`J(VpX#y^kqzQ;#=2x({YMw9Q&ndHT&`BD$#%Ql?{+)-OuSA`r}MWJ zVg+2Gc(GW}a=BERPNy^;kEz$|38dTYlFQ{%5S!g@|8f8D_!Nu9_Ni2glF1}xG8xi! zorc39&F6EPOeWOt_XS`W2H_Bo$MXugy}SEctJQj=(TLXTHL(jRXfzs>NF=0SHk;94 zF!&HjdZNX(3U3;LY64IMX__Xv%_wjLC!J2`0Jw?X=zPK$C$`&dYPDKaC={e16bcE@ zgun^<0k;ak*=xLE)@(Lqu~MmsFoMCLY&0Qog`NO(h@kyxaA%EbwJLy8sU*Vi`~52K zX0wrqW;_LmMq@evX4iAM9Od(Q0eHP$1%L|xAh@vrqB`HPQLon}f3aAka=9!3hr=O- z5F9`#J_7Jhah=U(4RjaRhkS4Xkk98kDz-`i!r|~~AQ1TFcDw(@<8g{aBE)l)PNxNE zI(RPyc>9e{@WGSMU%i7*v{!&P$WLz25)0oc=Dl-yy%xYZAm4b-rttL7UjR#%`#j_F R;_m(?iiXTHIMmcoLoO94I8;j@ zv^2DJ5#orqydFJX|Gm$_Bi_vyew+j6{r}$Qc@D1%fQqeAhJj)1!z4pP83k2MV2~s! zSt^w(<#HLFVBg_#xz1W8ioi(WY&Hu~6zil?DI^jJgu`K35(hkP)H%@Imesbg#5!Ps_$Ni*SiR8&sKb9?M`0-mH)gtg&YgRX#*TXz@Z+| z;|2H@xzE0TfuORhuO2k6#K8#sW^J`mQ0+E@$K`QkFV+DTlI$w{GJ;zid{*v9xeIe_ z$|Bp`@iKkgoFK3{4Z)#DWKV~W4K@5WZN+Ql_7%YxNqSx7%cWud&cX>)_PvD*UzxZg a%Kia9Rjz_59@~-t0000)l$0ECbfb-0$}>7z|u>IvuoHEmW&j4lzv=KA+EpIObc7e7{sGA)QVmnM@*^ z%|h38^m;wC+ilpk%>l#V5LCqP_y2_Cayd^XlX;j*r54R*lW!zbqtSpQNyz8(JVmWm zyV4S$2{Uhyc{Cb0QQbf{ZGT{Kr zvJi{K_&f+q^Pv4MK$hhS4TgFj_FD*rLOePdE-E^T7ZzTFCRUB`*?9&h(a#C!-v8lWG#k3AOJQaUey6Oasked^kDPe=Khg@7s584 zg`XfS1)&u*_c;I76#%`kkBfiZgKKo@0)9d6vZw=ExQUtV?eW{Y1Xv}=4X(2zy85d> Y0C^(qLv?Ui{{R3007*qoM6N<$f-gW7od5s; diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_edit.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_edit.png deleted file mode 100644 index b93e77600def75c9a144d3d0a5088a62c02cbb0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmV-w0+s!VP)$>5Y&axjp2O=VLu>*f>1L;s0)kkvKC!*u?s6CVL=HJ6oP~pNfZc; zsKr=bq;7MITw8NXw{SZm%59TId2x_9BQ zV86`NuvGI!>o^V!Na!=$7GJE{Cq`b+XwknM{UcGHFTTfmuS+ zm-zYC!P3+zmY;SG$?!fYkOih`QYaLxyF}A86h$GGN}kFj)_o*0e zjPMP%zTG7FYMAfO2Nn1D`D0Cj?Wl>5q%@CE10nX)KxpNmwk+!IWkzywiYD( zqUXiYYIq3qcRyMGJ;IY`(Gz~E$J$zu2+R{)xGlE*88b3WK6V*J>}2iPY1HH|tER0W z_+^^FdppY?o)Gt5M2`%xwRDH@R3G}^i1l4|6uchm0X0f!@&YdVLB5K&dd7Rv{)DXX zt^&vP;}kqj3f>94j+4xd93>s|Q!Ezi>?r8(Il$P}PFxSqu{d*!Y%*#cX(R0f|Juz# z3o0_xI14Al->1uky@W-rCI_%l&>PK^TXNSN{byMk2AI5vbwp!K-%-@!-vPR3iikL1L7HA!^!~ChCFU#lnGzp88=I z67V8PHBo4(l$u?-AKmT8?#_0rKW9dUNRbpLc`}piywAM9$xZ-3fR1C75T(BjCn-l* zjUcci2oXXo-}iqun@#)+`W@kL_-U&|2>MxZy~3IdmRm&8b)9!2%ksg3R)nNnT*TJOC=6{2hG86Dz+<^p6qfG5$i^UNUh+u)CD7O2 zK>Ioazn;U|+X0x$=feveYZL1W*Fm%e5P1sajd#eW#^5(ddx76*pt$^)b}$Q4oPabL zLc^HF>Z{8za;f$LtN0P$6C?1{X*jtXkRJ8IEeyiSzencvH3Ux_y>y^}wfJrRCQN#9 z?&e+C>sSAfrE%mZD5RfZ`gSndD)=P?+nG5Oq$zmY&-v+gc7R6c0u8^Ke#|XOq?gF@othF3zFpM8Il<8BJrWqBtF>b#_ye4{0)Xbu6j&@UIhRE002ov JPDHLkV1nWI9dZBw diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_excel.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_excel.png deleted file mode 100644 index b977d7e52e2446ea01201c5c7209ac3a05f12c9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 663 zcmV;I0%-k-P)^@R5;6x zlTS!gQ5431_q{u#M2 zg&W%y6a}>qj1Z|7Vu&-DW6d~k-n;jnHsjb-q#u0C^W!_5^C=MlKq<8oNCQ6qS00!X z5eI;XP=g!^f}j{hku}E1zZ?XCjE;`p19k(Rh%^AQQ54xysU+ocx$c#f61Z4HnT#3u~FR(3>BnZniMIF4DouI8Hi4u>cAK%EN)5PO(ip3(% zIgBx+QYirR){Z8QwV$9Z(Mpt=L-Or3#bf-G@66}txq0yc*T(zNTBDT0T8rO^JeNbSI-Tzf5!pBioy4NwAN^?iN#{;fH1Jke4Xa`^fR8m z%h6dq%xX)S?7`zae))(Xst^Scp6B8FejQW?RLTM8@0=vnnntuRGBM2dpo>gbCnTD= z^<;=JuqdSf@O>Z8^XdR?s+KEfhDdB_#ahFj^giCtzT(s8kA$AViyTqaAR;KGaLzUU z<=GqA4bRwpX|IG~*x>pZ!@zLr`XQ`od>m(`;jz|M_*1GDO#$7;n74ppb8=eiqh760 x0yt}J1#p`gw$`o!R{d7zU9~!Un@nJV{4bstt4Au+Up@c;002ovPDHLkV1kWhGjjj{ diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_find.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_find.png deleted file mode 100644 index 581843637079359a6a58fcdccf0763690c67b063..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 676 zcmV;V0$crwP)_k3`4d{s8lK_6bi^@vq&To98fNoK}7)fx$e2^Y&@<^jR_Ee+8}KG;X`@ z@bCyiolqX>bb1ZIs%QGnjzFU~L8H~d?e;*XP(h(S262}XyZ3a0h07r{KV?E70l+e- zE`%3x|M5#q+;HOC(h@A^M)7Rn13dm0&>K$j%k_F4wOWlsNCIH+!c_#{eS&TL8v4yc zcpnPEY`cQzZ$ILq{U-MA6Z6Z|1p!FZjQ}tXSb25J@HphEqX-6Hqo?-_Zn@{d#>2Ml zJGhxTAd&emK$lV-QK&VM&ix0Xy{GyS3Wp(+E1^8BhD3T0a)m-Lw@Lu4zQRrP)9(3F z^>$hh@N>OAXrmPYunLi|fJ$_*5i`46;M>~*5D{bp>-OL3{+!MJa`3kv~Q#QfQ%c z)1s}QE<_XaYBG;IuRF=td#+}fi4h(6HgoUyJLi0t(*dA^B)%@8kkG&bdM5P5^Z5WF z%d%>m^SbN0XeV)wbUOXn5Ag#A$gJx+7-OCkMM1S%MWIlTkbFLmOeW(&n&wUd&;`>p zVcRy$Z{K0=?SpNnP^;BYEEXleFbq(UY&LrXX$6qkJ~)8+b{=jj3HEXds;Z(?D%}}L zX3`39&dy=Zyar!ehA}e>w)(*vrCct{PI9^2Jpj&OZS8<3-@{0(gNv%1{)zAiLY+_^ zl}e>Ofd4&#Irj#7>=o=Uhv5IJ@?sN0^J|(WL2Uun$4}si6}TG-s3T#p&6GE<<2W)O zf{^Y2HlO#*QDvTp3v&d@;8*}aUC4lisG9(w7@d5Y8y)}U#FwCkqp*Mcgme4{&gGRf zlBfd`nF9cQBKB2_L{F8G2)7pAf$i)Ds`|}-c>pc^LRW{w4SQ)3N^BbZx)6BlCZts! zKph%`(m#xg-q3I7=(us;9<)*2%iuQ1J`oV3gU6V~T}^JU5714JN33&GwEEru0d}Uo U{MPL+lmGw#07*qoM6N<$f^vibe*gdg diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_freehand.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_freehand.png deleted file mode 100644 index 8d719df5205f7415ce657e5c277db4533c82f346..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 639 zcmV-_0)YLAP)p{{sC7)XB-g4w*W1a1)XtvxrMYa1o?wn&v~3 zHnC|#(>B_M1d`_7gfzLiHy=0c<2kQQdXu*33(xYN_xYW39(cz9jEVT%VokB8|DoF~ z8u%Q5sdl@4VB7X#uh+v_;yOGY&pRi?378ghv)P1cngiAAb<}D#l*?rWDV0j_dc6Zk z-|P~AJZQCA=yWcQjG8fYnimzj*3KqTfN0Cy!G^$7)+bQ$+mHVd1J zvwOR^5Lm<|R+uyB1Nu4vL?d4qa3tn?9H7SZH@~u=fFHEDfSH|bHU6kh0O3%cLdyny z{`9S2Sw~WMy0MPy!64i`jdk4Z3>^+KIL_fN2V_d&ywBt`^IJpxUI$=YAph~5`;xCe Z{s%Y0vkUXDnO6V+002ovPDHLkV1loX8z=w( diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_gear.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_gear.png deleted file mode 100644 index 106f5aa3611a4807ec8c21701c631730275089a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 402 zcmV;D0d4+?P)<@FR}JvtGRKa0_WfK^c7uXaFH3q@Y!Hnl8VySc`OtkPN3;#l*y*l23+99h*9JzA00}rAC!#M1dZ#v9YOBH|eC*${MmzzYjBu!!-< zK8tujf&(6i)1biy*F>4{f*Kd(IU-JsG&#b_@NgTnx@40)2@2%c;*=?-2Za=}O}7&( w%_K#(S>e1j&gfY?mR})n>>0+8p`iTe2d1K2h8#$+)&Kwi07*qoM6N<$f(2cptN;K2 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_get.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_get.png deleted file mode 100644 index e4a1ecba1b60e54f3777717ed105cdde745b7184..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 516 zcmV+f0{i`mP)o)wchR-92qq~y6`XqbKmElbB3z{pkZs0VPF`CFvS?7jDn^mFo>d9Y&06* z&1MsS!M-CH3ee+h_sy)Ms%B*ec3R0RpVi9?*mU84yoq(Bw8 z<4(999dJJE!V%pWT~HGRIAb;(#O%2K3?uRpz}AfgE8e9q&OSdr^e^}lC$QXZz;S2A z)w>^oHy>?v)q--`!pmuBe96PxP0u*inQvyFW(llfv9 zXV1s*Jh`y2H%B3ZTA(AzpsQ?hb6_PyZ=c1?_B4fbl>G%!@ubJln=!)x0000#DY{xaiib^#X=YT4@yE_&2#eBulEdzjE`u&@G%2(&u{J-<}d(^uY4W_kMfEX z@!X)AR9F&FL?RJyJRUzvBoeqN{5kY`z3wcM0+du73~_0|*lac! z42Dw(Eg1o{Ash}P8jXrqN+1w`*XxDD;ShmPCZC7#4;wWbHoMvBl$=zF-`?*9j*Nbjd=v@OWt_BgKxP-3wd zy37?ATx&$b+&zRM!K;BD%Okw`Sb@&Pak8$KRX19jWZmC0&n*Ggv%j8nvSPDFw zEkV65AGOoBQ8kf`R|}Px*&INNS%osq9b{Fq2I(x6@xM>tg=vRLF?I`0rWzHyRc>}g~)F_Qn`A>)C_iwK%Z zrIJ;xR)UI1Y4Ozts|-Nho;q zVk9-bX)%F~!;63iu$Fk=VJn3~fmb5S@@)ZqjBT2{f`vT`b2}zxb0$o;EF@G3&BHK^ zc)`1kUzo^Qkk$?KFKHNBD?nP-MJ3b@&4fg;g5l2wMi^g?9qj+~@b;62o_U1_S1J`g z7m^UMg25FX1MJ5AQxAJ5F5WDt=$=-@JV-!LHA2vuxl9kN>PS8x??^AINH6LjF*#nbk4}=n3gfWp$kEX5IpHS zYiQ{@d7Nl&d$#+7-TckP&Q}N91e-C#5QQ<|d}62BjvZR2H60wE-&H<>}%WqH(_V;zPbB1rgSSSC(0? zWlQ#?N3UgnJ9m2C29w!SwoOo5_2Iq!<8vCyEoDoj@#oV($oJEg6Bj@;nD|2g8 s%L|>IZ381yx9RvPhV4J)*SeoEV4lyr#k*`nfWBbxboFyt=akR{0DpOPi2wiq diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_key.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_key.png deleted file mode 100644 index d61648452284da1bc28b10385f95b5d2bf027901..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 616 zcmV-u0+;=XP)-tZUVHjYHp;RjQ0M0pRlXN=mLv{hk9Ebp9&~+Wj-T9IkpzWPWd#fZ)d=zV^~S`;LE*!&u-?g42^wwN&Xr1~#d5ifl_2*B1OoS}CDno^8a50ArfE8;stQF>AP54J@H~%T zFz84s;dO!QJKD36(~!QOg!t_^gfFcSKDU4yK0+Ypg$NT^mIYcQ6bk*3P(lBLh7Df_ zTu=2xC#+-_%)|{Cv8zz0t|0y4D5M`xAc{gwOKc`ou<*&VjUREFHs1qd<_xSkKeTBt zgyCi=@jj;&Ns^GsWWaIUl0Y2azcDlF@u{(P*!+EH;lnU~b|Lv{4|4Hdkh!qoQHiE$ zY#y>KFA0QEw=4Z|uV{0A^`Y=D}hB$GP&<$bi8q(u;p^0(my3Rz7fP}|# zGZ&#uor4@c3q9r|f?H6-UZmfgKx(iV(MQ`MPWB>iC~SxnN5H*zb*A3#zWwgu&c|}3 zn^g87H{pdeasl%Lhmab&jC?lES}7C?4BFDNA<}20hoY@w_IU%i*T;}}wh!589}7~7 z#Ug`-R~4j&+K_y4kW@X7qLr-)S5qVKU)tO;+kXJ++{vPI@{hVK|PhMVVx_`)vx~zUs}c9O-Ok{00000NkvXXu0mjf DS5_-g diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_link.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_link.png deleted file mode 100644 index bf7bd1c9bfd78d689c73ba67cf914182933ee68c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 614 zcmV-s0-61ZP)OOAS;jTeL{ZSdz-%)SMH9tDF;N4B6%j=d15J&5qy`F#vB?Ar zqS1nH@%ny_XSI*Y>) z1f5QYdmzT>YciP<3WehS<{GovEaLGv27>{*-7f0&I$yJ^L%ZGPv1YT$V|u;*+ZCWz ztHI~CDVsuy($SfR6-`N~K?9GTB#l%%0h7 z-q`K-y~E)+s8lMyTrPL8^_pUo)9G|SluG5pPqw6!LJB_PzyJUM07*qoM6N<$f^=yZ AYybcN diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_magnify.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_magnify.png deleted file mode 100644 index f6b74cc40f82fc83e4dfa6e9647ccc1b34e6ed7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 554 zcmV+_0@eMAP)Vb2f>2}Fa82O3m(Ob=t*sniin`NpInLyMJgI`saru@YOPfh zy4g0#G*cV!#N%;Gq9_VH9?v%kjS3Rb1j8^;C={$Gp=lbj z*(?%?geA!5^Pok%UauwjA)v4g2`HedDw4_Mk4hhBQt?e7YJ5(hcj|3dNu^TOPGnjB zTTsqd3GIZ=Bb`n=7no)dflv&K(lsWw?lH6T1Yht0F9qgIuzh}ym0%n<3d3EBWB*pg z+G!I0lbAEXyd>k|QNuwr4=KX1D+tLPv)j@C1=N4sA4NF9A>HcO3G47*Y6!+SrUH-7 z1hb;^#S=r|`aMh>J#dWruAEf}gcR(DRUC`ZUev&$Sbh0SgLiTXeeHEU<$_YV;9281 zym`igIE%Sm8DpDw7@71Tv^EB5xSdUR*0$Mqp+Wq8OoaZtOg52&)zZ;;M=7#C1Yd6x svjx>8ad4e2x|*xHHwRjcjs6zA0XLDUqKT6dS^xk507*qoM6N<$f*wetruo^Ag2=LamM1T#~4RmC^m`_ zs}H7d&XJ}mg+hU?tu0noRvyjI&o2SRAeYZFesYkts79I^jJ7!A7%6nJwq8O?iT55M z1OQ` zbL{!Cp5o*IRmE9PInMCSPjTwfT~J+EYkz}tjxY=fg5Yf6EQ@DG$0kMJ9h^&$W}9BU zP1oj2;?MWVkKIEl)r=Y;L^Cx2q|>!)qJJ8zE7-V*-Cf7V8_2#1c0N975t~+&QUpQJ z5(uo(-O_`%Rj@U@t>JYAgd!>L?0Idxtd#oW2gc!jinsAEva8|kF4#Ic**mmml_{d^$s}Q5Q)KCys4sfck5bP1SyeHwh2`A<@N&t2j0^lgHC_^(pAAPCNjwl+>AN%C4Ll>_8Hjda%9 oS~i=#*e)>KsPlg0=2)Qg6BCqJ=F8HdGXMYp07*qoM6N<$f@i)wr~m)} diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_office.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_office.png deleted file mode 100644 index a65bcb3e1e9613cd9e4950850db43d7025a5fdf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 779 zcmV+m1N8ifP)JNR5;6x zll@CmQ5eTZ^k*a#RQf}fVOdd`5NJh6S(>6Cf$wEW#f&JyAR#GAn9>Gml;nOf3WCDa z5({5&UB$(IF?G#$x4X@Ickg!Y-HU!Z_rzX=qAq-XI_LS^=lOCT0|0{#{kBkYDS7{3 zD`iu%E=`cDX_^#^#n$5SIQ|4Zhsk8>N|zXHXG@*41$i-7`Jr{8`3S_OEcmY|RF48wXkk?WpdVM4OePBSbfh z#4_=eXJg@3epx~gi>QbUmO}Bm(ENN3+@c?jWiKvSrm(o|W}Ud*?vy~fn1!V~Cl4kB zI-;c!8f~-v)jX82%EG($>?;KSD$64f2&4qQ#=Yyrcpy$57RAVuV#vKMP)0hT$r6m# zc^F^XaJ8R9Q|}x^NoJYIvYZkq-z}Tnj@UJK2l2H zG}p+VvtjP2Z%bsb$~7QLJ9#pC0dKi`ppOd^_V;ME6tdzC0PtV|r=@e@37O`%0k^=5^`%cf$eu00N17Ro!{^30krz>a%3j34C?*{Mt2^a4~ zK=P+Qq%|f;Tc&+9ps;@Mw`EE%rgs&#y=j6BUGg96oIqdwj9-fiy*N(|@o)eD002ov JPDHLkV1j#pUPb@_ diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_paint.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_paint.png deleted file mode 100644 index 23a37b891c2f5faa3b8128d45373ceab794ca609..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 688 zcmV;h0#E&kP)PK^TXt2QS_@2qt2T|9~baC-vaPn=ziepcfAwB$0!O2Q)E}1e8!q+9)KT5JVKU z7HNY}h##OS-BxWHWjD0wrPDeEfUClHs%Q6&2u@FTOJkKMQN|_Rlw6rQz$gPzqGNtj z#ruSeFeh835JJFiM6vp@6M5bXj%k7CMt%SIwfbF_fD-3*Os`9Ly_Q3WQ_SX33E{pX z9_WIeeTCGQ3wYALpBcK+P-iuw;3i&7xCua37k5# z`>c`M@sGeC7cdsdz`aE9lOz!hPholbyz%T85LYf6O*@SA+9&+^7k>+4M8$A8iNQq{ zQvn8k?-+dU`Z@gK0z$EtPV#+`^OH`R@cE-cuE&_!D)SZGxmQxeobP_Zwq zMEgi6ePN45N`|V1so0uE8^}1xw8s;VM%Ai@7} z2-&Cyvez_-O4?6uv{zTaj|YeYEk34i~K@`8YW2g{x* zc;7z3lItpVy_et{Z-ZZ)<@*%{l7Ao8mu@V7*gz<_1##mwW*%LEwCdzNsVLYx2*T-J z#HeQ*_a=R~KDdVNk$EVgAIRl$oQi_(`_IrdJciDpH|Xe{K-YsMtc!cRnFi$qzsr4z z5*$;ecov%3->1{YNy6-Gf(Ecy&_I$CjI#laeuE+S120^|Vjsf)W&i*H07*qoM6N<$ Ef)^4A_ab^avY?n0hpS-#mn_4{O$e%cm-@NH=3`90Wq+3`~HKArSdfX`&Z12 z(CY$VW-MNtXX4xy%yUeE?}*~0-|iByA@ZrwXgph4S*bhcc5{HB!DFVm_v}P*g7+Q~K}7K0lcp(^N@X>U zV`{ZpeIf${R6Hgg4FL^`X$Eu75k(PE6ycl$AW0Ic)#@rR7Z(7;V?i-dR1K935Jgcx zPfkwK>2wGokf!Nih^ARp6-6arYFG#(9Ta!x93nFEjoA==z(g?#sDg?Owk?Mg7K+>l zWYsf(<`#+$h9Sp6gFOg_dd+80SkUpk&xM7h0`Sov9W73spU;GP073|VfZ&Gd$J$*0<~TV5aPS|qWH57|VJz+d0000vYep8SaFV10Q$h+;hIUPX_=v5b}%>Tm<(&j1&5;I!55C)oN0s(P%ZB zP3Q#ahfpXKWF@S?jm4U#fv)QovMhrriclyNs6-G12#3R##4PSZ0VY(dRWJ;Lwuq{# zAW0Gwi$yA^R4RZ!;W+L`f&%x{=D^VK#BBWL4Ys{;*!A7Q;!=dN<&D8*GzGaF4`hV4 zDbY0{NrMX>ZqF=0((gR5-zL$kC*b)!fwu{Euru|XrG<$^n#@)7i_>rCmRxnDq>$Y%gJaCkRd|tE*a2x05Pe!I^e13o69#&RQZ36s0 zB=O|K2Yi(jsMqThn}9t?f5E-)L^naZ+db$&%M$!bCdm=jv7?t_lB?3&%Ltq(>ESw? c;MI421LCcoDG!2@;{X5v07*qoM6N<$f`UZt7XSbN diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_picture.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_picture.png deleted file mode 100644 index 134b6693687b2fa5fe36d48a9c0b8001f937c741..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 650 zcmV;50(Jd~P)VHAd+bMNh~)LLRqN>D)-jd9UvB%+hyKX5U|&4t0)fzgD-MPpQ$nHU%yoz=vI zMGb>1Xu!6Hw$NT~@Au<4P-+{9;Uw?&oj31uzH>xX0T7Xkz!(tn|Ed9-s_FqyReC13 z(ll)vW1O{Ck5ihay12Ob2ABc@RUI;zHpaMiyRDs0r>|D4rHw{ItJSJnYjt~jTbGuW z`X(~}?!&86q40R8<4zYw;$qi0^3ec=c&<&H;r`8W%H=Xymf^i;Wo6~<+}zx2UMzpC z*6MZN?(FMv`n|KO3(KFiUaucP0;Z!@LcUNa%8#vGK5aZ>wDgB0Gi=t*argWJcdlMQ z2#MpEX0wU+9&0U?N(F#OgpviU_Y{jYMsj65U3|PjwUOY}lUYj?MTiK_Il}NCVx-Eh zDx-TzMk7se+M#W_>?A1-x}ZXw3kkyz5kW)_hkjsi@RhKadN#H$Hq)$07*qoM6N<$f}lhwPXGV_ diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_powerpoint.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_powerpoint.png deleted file mode 100644 index c4eff0387d5888c638ba09473ba6d2369f7b56f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 588 zcmV-S0<-;zP)HU2HvUSp%6 z*n}iP63IK?dpo;h@sj9~pcxo;VVTc-XLiP@DgefqE#NE=@oyUd-&HjLpsLIuSFXV-EMck)oQ(A`s%*^&wf0(rNiNHsU%=0Rw;WC z(kbc37l6fo`-0uR!pYkYv8U^3?nsh^@pw!K0TH3uYyx1_2>|JbXPmfskJ|1YAw9w! z9`N)1^Aesr;y5Nr5-ODn)oOL|CGi}f9!&iVwpK$khlIX10X$H6^A_stBJqvLhU$?V`QXqKme*s~gVDJ4A;LTs_e15jhc1;By a82kqHEPVYFAD2!50000JNR5;6( zlS@kiVHAe7MZY2;Xi-5)WxDDgv@tCUl*&p14T@Z~3ThM5LP4tuQfLu@EnG;nXc<8S z6&3BN?fx-cv-Kp6>HRiNTHE>$X( zD&=w+?GWC>?RLAGC6Yix;an~UmSt)tSf}1VS6N1N2ONORdD? zaj}w6DAZZdOud9Ep?M?{iQWbE5^9HLLZZF|1kdy0Tu4InEuboP9@nvbZ-P0n4AZTy zyMRIxRDmUE#LdqYuD=-Qz4N^bC`_#S7vcLn1M}{J(Wl3#c4VWczu&)AjUlh(11>gp>f`wv{KnjF%!aA*Jk N002ovPDHLkV1kkt*XsZP diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_ruby.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_ruby.png deleted file mode 100644 index f59b7c4365fa1720af1aa04eb47167ddaa6eeed4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 626 zcmV-&0*(ENP)ZS(e|#C2>JN4>y}l*tQ*E7zP@R2CCJnkW?xa6bgk%(hgtZ z0=~d?U3i`+Mvi4!&~+WPT1^NX#{u6&QIx+DE(oR{&T5&-ovF?@wGw)P&AtpHZa|G%V*GUUqL@@!d4V$`8=##4)ytY959JG zdc&Kho)&AL70^i z!PEmeeDWCB-UbK(*4JST44^tV2z_J(dn~+vBMJT97_7rzFio=~XczIv?PQ5$v%u~y zu(bteXb5I1h2zCV{Jc2~V{{yzZipgsP6;k264$*#5q?GzCm|CPa9CKqm4b116h3Pu z?+%Cm52plC8|5P0@igf2GV1KkCfk{Zecu=G@VNrf>s%g9c5D%@cfxVb6$nY`1IW=4 zt10QqSps_2JLp0f3I0j0u>#qA;v!+T))KEbCg|mo3q0pG{OR}p0fPds8+K~d>Hq)$ M07*qoM6N<$g1S2e3jhEB diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_stack.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_stack.png deleted file mode 100644 index 44084add79b9a0fc3354d16bbd4b4b5ff8095da7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$R@9E+gqH(@-qA%AW0|7U8+xDRI z0k`B18}ImRw2g{jTGP$Pmx3yI6F_2s&$|`cJ!i0UN zB3H;=r{#{FwLaNVJ&hZl9+MTHGx1T^-A=Q0?hRb#8a~x50X%;`b6ik3cw=#XdxWy= zgrpBoDjpwP&g9<9h3x!k_B!?vuTJVkmIJ-U N;OXk;vd$@?2>|rNdMN+^ diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_star.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_star.png deleted file mode 100644 index 3a1441c9a12062a4bb3d706000d3ca14399aebca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmV-50?Pe~P)SCZIX8XZzY2l?gCw6LlgWJ5Avz#QX4|&mI8LN)w~J1vgL=KLAhlWz*=#m~gyvxa z&;iC6gb?aZvMdXxX`<0+D1hs_pqJ!wxqlEH;CJ)je~uL(gpi@v>!I0f_Kl=E(E+Tq z26na*9gribxx-Oft(HnstyXUUy!39&E-cI%J5Rsy;(PGZH{g{ty!HVC&yGPT3H8x# zw{^gBPW)O0FMoh{k%l<`1a|To_Wl&u&-GXm8izU|&<&utILc4wc6s@u1bmTz6x{qg zTw@7=FQRcg&r`h+gcR$*Jbv+*DPk7v)B@e0o2 z6IlBXW&8xh@9)YKiV~2>+z&XKd24JT55YWz&JtfvCg4r^~bLP79-yS@n$OW00000NkvXXu0mjf DStt2z diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_swoosh.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_swoosh.png deleted file mode 100644 index e7708292adabf4821612bfca032cbd019c63180b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 634 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 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_width.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_width.png deleted file mode 100644 index 1eb880947ddf3e745c29e8d9dc90f09c7e6e323c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$R?&;zfqH(@;q9b3Efq-lM(nr^( z=EYR73-9e)UYMWsXy%?aZsD68Yyv^2$~6QgEcljw%kx>O(f-gQ?@fOOx3A-0+Qw?O zRx~W)kn~Qe2d6f9nMG#g9Q04Mk==M~N!Dglvxk!fgVh#w@ZV$IY1+Xc`d{d2UcaP~ zfWp)_Ivqj}l2SPy^9ZWy6rG9Yx4v67_uA&&9|XA~5-#3)W3%em1peD8RWH^#O%XoM zxMPud%}GTj#~*+7JMxTd!`{^Q+>(D3*|@KV`*G2;{QnANOxu1$r2xIe;OXk;vd$@? F2>@zac~<}c diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_word.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_word.png deleted file mode 100644 index ae8ecbf47672a874c0958d0d113a56162c2bd364..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 651 zcmV;60(AX}P)hkjP zNW|QGv-YFNLN^qH@tJycPNG5ti6B7;r4mEr#lr@*T8*M85D`{ZR^BWwF23T<%MYIh zdC)S*p=|xk^!~H=+HSZ183~y8v4|mYmZxt&)5{{~>J`>E223Q5>T$=~mtA71q-jdG z+eJhOAyBW^0k9Gk1+rX8)zFx((CG^&tDY>6XaS~Fy!WJON|Gdujg5^~Vzt@o%BcYLiNiTQSD`zL^ociBz_>bDlpw3kriQ@Z`bVsGz-_6N>$&gTDiKDTKR^ z-hB*tHa^>!oD~5TK^0UK5rZ}RBm50Bv}S-yA%s=Ha5RYb{)!z2N&$&64gfhybBu8p lh~_|?8^bu;BRYt{<}Yrwd83Y=s?Goa002ovPDHLkV1l%3CP4rI diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_world.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_world.png deleted file mode 100644 index 6ed2490ed1432d5d667a76235360824a1088e928..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 734 zcmV<40wMj0P)JT{hN;C#tgf#9krG=I>5!<*aE1_(spcgF}<`n4i zJi-}^6UUeU4jUFwdCiVPDm%`Zx^UBa8J(mnR6wEgz^}o8;)M*Y(@l_!Kfv)}4+NuM zaPXE50z)r)9=D=SR|RIqfQ^j}Hu!fzMeQBo+@PZk1G8hOw|vBTvkx`HM)Xe9q3xao z@`p0`NO!2904FHSLA6E@Y-O6zH$DQzvq@aHsz}}<(!v(Z_+EodX%R&NZW75g+nENo zV0020rxE^;7d!067AN>6*+&YLp$9uH6F-=In`XC{Cn%+o|5)b&boEPr02w@|P*oGm QmjD0&07*qoM6N<$g78X0Q~&?~ diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_wrench.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_wrench.png deleted file mode 100644 index fecadd08afed92536be91ab12d8e37b6bf410d5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 613 zcmV-r0-F7aP)wK%m(L+9IV|s|#(WRl-O^4GvaQsnHq|OstfO zIJ3}3<01}YGARE4m!7=)QisvlHUo!Qymx-@-t*p_129Ko-#pVI)6#!*kLj-AGXWNR zyA_{wKii_amK7^YT-v z6#plaNm#8`-kz@OvjIt^4%IN{@J3bR zRI}ME1Mv85p|%;RK>ViR>APPLB4;;BpCtqE@P+*7!G>I4UjNx~e>r3HA^tWCQ@S)l z{BslcSwL-CxQ&_ZZSv_g0Tu{yi*X){Mt|W7)lbE`SQxFP00000NkvXXu0mjf;)M*S diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_zip.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_zip.png deleted file mode 100644 index fd4bbccdf1643f4ff5022fbc59b82546e259317e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 386 zcmV-|0e$|7P)_QM!1S$Bhw4w+iRuFWf;tfR6D%SMJrb+tx zC9R6{2>Ou6#juIy6u(I?|;&Owi$sRB4^20apB5xE2 z#B9XekY66S6lzfCL!eEQRgo0LokTA55@Y#%_wN!TXPw^Q4IIXsG~v#u_4t;x_HM16EQ@QRY+rut&97&UefsPmLrQ5P zBC2kcbux9L%2bJz$P$XV$*zSxb2e@6_3O#;&!FD<&hLjGn%~%en;7)djE^d6!t$lW7GyIOKlQ46hr`Z zjLNuRDP_53dNoN?wd&HMgL^m1DXFU<5dQsrceN>fSz00000)O9XRTN^$%%`*Fg>ryDtc(lF@?b>dE!20r+y z#Q*>(wbV5H`-E4Do={CJp7=ERhw15hgZi)?jRG88 zzVz(5;g?Td1izJyO33bhjg2Qc7FVY@f9!o)Gu?DII~vm-Dc?}3M!fsgjP?F(7`rgg z+xOk8XD)e?Zl=5+un`5!7kr?F=eq)K-5uqr%yU$1hLv){Vlm=)*5~`lwMciiXFu*g z)*Jkz6AF>#zb(Vx`Iv{bdGZHtlW)v(y5k^|xgSUc9%0}S20nrYrO}78ofk?bV!5)4 z=Ngz@+$9N1>>mA%IWx`Fqa240bWkiW;2TZgd8CZS0U}@mknC;!2;wi$eI@`h0y2JS`Eae0CW}q(2(%!m8 zWq$`PDU>LT1_y*bBv#P5<@q0@ttz$hIH}YMDvAigCc=y*)jY-VOpTd;A8@3t7Xh4r z0KTWOk;N2Ox4!&&^4B*no$WtTX!BXB)rg!y8dvGgKBQKLJNXRRp0}Bsjd1|LNQX~c zbC~fjrk2iL@4dYF*vt;}dFn(%h)n_-vzEIHMOKRkdF%3Lq|zBgKm_h>TEq!))nWjq zzn;B!?!(dQcHu$#=JF`cS&W~C`WHFW^B!~MI#k)>1Vk&eQy8P1O`J6V04{D@|7d6^ zyBABnh-d^H0FX&L07M||E0n_dp4v&Q%PSE9p#R#Hq)`5I_(B5CE#q dxjPz0{s-<+c#AC!i7@~G002ovPDHLkV1iPlpuqqD diff --git a/node_modules/express/node_modules/connect/lib/public/style.css b/node_modules/express/node_modules/connect/lib/public/style.css deleted file mode 100644 index 32b6507..0000000 --- a/node_modules/express/node_modules/connect/lib/public/style.css +++ /dev/null @@ -1,141 +0,0 @@ -body { - margin: 0; - padding: 80px 100px; - font: 13px "Helvetica Neue", "Lucida Grande", "Arial"; - background: #ECE9E9 -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fff), to(#ECE9E9)); - background: #ECE9E9 -moz-linear-gradient(top, #fff, #ECE9E9); - background-repeat: no-repeat; - color: #555; - -webkit-font-smoothing: antialiased; -} -h1, h2, h3 { - margin: 0; - font-size: 22px; - color: #343434; -} -h1 em, h2 em { - padding: 0 5px; - font-weight: normal; -} -h1 { - font-size: 60px; -} -h2 { - margin-top: 10px; -} -h3 { - margin: 5px 0 10px 0; - padding-bottom: 5px; - border-bottom: 1px solid #eee; - font-size: 18px; -} -ul { - margin: 0; - padding: 0; -} -ul li { - margin: 5px 0; - padding: 3px 8px; - list-style: none; -} -ul li:hover { - cursor: pointer; - color: #2e2e2e; -} -ul li .path { - padding-left: 5px; - font-weight: bold; -} -ul li .line { - padding-right: 5px; - font-style: italic; -} -ul li:first-child .path { - padding-left: 0; -} -p { - line-height: 1.5; -} -a { - color: #555; - text-decoration: none; -} -a:hover { - color: #303030; -} -#stacktrace { - margin-top: 15px; -} -.directory h1 { - margin-bottom: 15px; - font-size: 18px; -} -ul#files { - width: 100%; - height: 500px; -} -ul#files li { - padding: 0; -} -ul#files li img { - position: absolute; - top: 5px; - left: 5px; -} -ul#files li a { - position: relative; - display: block; - margin: 1px; - width: 30%; - height: 25px; - line-height: 25px; - text-indent: 8px; - float: left; - border: 1px solid transparent; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - overflow: hidden; - text-overflow: ellipsis; -} -ul#files li a.icon { - text-indent: 25px; -} -ul#files li a:focus, -ul#files li a:hover { - outline: none; - background: rgba(255,255,255,0.65); - border: 1px solid #ececec; -} -ul#files li a.highlight { - -webkit-transition: background .4s ease-in-out; - background: #ffff4f; - border-color: #E9DC51; -} -#search { - display: block; - position: fixed; - top: 20px; - right: 20px; - width: 90px; - -webkit-transition: width ease 0.2s, opacity ease 0.4s; - -moz-transition: width ease 0.2s, opacity ease 0.4s; - -webkit-border-radius: 32px; - -moz-border-radius: 32px; - -webkit-box-shadow: inset 0px 0px 3px rgba(0, 0, 0, 0.25), inset 0px 1px 3px rgba(0, 0, 0, 0.7), 0px 1px 0px rgba(255, 255, 255, 0.03); - -moz-box-shadow: inset 0px 0px 3px rgba(0, 0, 0, 0.25), inset 0px 1px 3px rgba(0, 0, 0, 0.7), 0px 1px 0px rgba(255, 255, 255, 0.03); - -webkit-font-smoothing: antialiased; - text-align: left; - font: 13px "Helvetica Neue", Arial, sans-serif; - padding: 4px 10px; - border: none; - background: transparent; - margin-bottom: 0; - outline: none; - opacity: 0.7; - color: #888; -} -#search:focus { - width: 120px; - opacity: 1.0; -} diff --git a/node_modules/express/node_modules/connect/lib/utils.js b/node_modules/express/node_modules/connect/lib/utils.js deleted file mode 100644 index 47b30e0..0000000 --- a/node_modules/express/node_modules/connect/lib/utils.js +++ /dev/null @@ -1,370 +0,0 @@ - -/*! - * Connect - utils - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var http = require('http') - , crypto = require('crypto') - , parse = require('url').parse - , signature = require('cookie-signature'); - -/** - * Return `true` if the request has a body, otherwise return `false`. - * - * @param {IncomingMessage} req - * @return {Boolean} - * @api private - */ - -exports.hasBody = function(req) { - return 'transfer-encoding' in req.headers || 'content-length' in req.headers; -}; - -/** - * Extract the mime type from the given request's - * _Content-Type_ header. - * - * @param {IncomingMessage} req - * @return {String} - * @api private - */ - -exports.mime = function(req) { - var str = req.headers['content-type'] || ''; - return str.split(';')[0]; -}; - -/** - * Return md5 hash of the given string and optional encoding, - * defaulting to hex. - * - * utils.md5('wahoo'); - * // => "e493298061761236c96b02ea6aa8a2ad" - * - * @param {String} str - * @param {String} encoding - * @return {String} - * @api private - */ - -exports.md5 = function(str, encoding){ - return crypto - .createHash('md5') - .update(str) - .digest(encoding || 'hex'); -}; - -/** - * Merge object b with object a. - * - * var a = { foo: 'bar' } - * , b = { bar: 'baz' }; - * - * utils.merge(a, b); - * // => { foo: 'bar', bar: 'baz' } - * - * @param {Object} a - * @param {Object} b - * @return {Object} - * @api private - */ - -exports.merge = function(a, b){ - if (a && b) { - for (var key in b) { - a[key] = b[key]; - } - } - return a; -}; - -/** - * Escape the given string of `html`. - * - * @param {String} html - * @return {String} - * @api private - */ - -exports.escape = function(html){ - return String(html) - .replace(/&(?!\w+;)/g, '&') - .replace(//g, '>') - .replace(/"/g, '"'); -}; - - -/** - * Return a unique identifier with the given `len`. - * - * utils.uid(10); - * // => "FDaS435D2z" - * - * @param {Number} len - * @return {String} - * @api private - */ - -exports.uid = function(len) { - return crypto.randomBytes(Math.ceil(len * 3 / 4)) - .toString('base64') - .slice(0, len); -}; - -/** - * Sign the given `val` with `secret`. - * - * @param {String} val - * @param {String} secret - * @return {String} - * @api private - */ - -exports.sign = function(val, secret){ - console.warn('do not use utils.sign(), use https://github.com/visionmedia/node-cookie-signature') - return val + '.' + crypto - .createHmac('sha256', secret) - .update(val) - .digest('base64') - .replace(/=+$/, ''); -}; - -/** - * Unsign and decode the given `val` with `secret`, - * returning `false` if the signature is invalid. - * - * @param {String} val - * @param {String} secret - * @return {String|Boolean} - * @api private - */ - -exports.unsign = function(val, secret){ - console.warn('do not use utils.unsign(), use https://github.com/visionmedia/node-cookie-signature') - var str = val.slice(0, val.lastIndexOf('.')); - return exports.sign(str, secret) == val - ? str - : false; -}; - -/** - * Parse signed cookies, returning an object - * containing the decoded key/value pairs, - * while removing the signed key from `obj`. - * - * @param {Object} obj - * @return {Object} - * @api private - */ - -exports.parseSignedCookies = function(obj, secret){ - var ret = {}; - Object.keys(obj).forEach(function(key){ - var val = obj[key]; - if (0 == val.indexOf('s:')) { - val = signature.unsign(val.slice(2), secret); - if (val) { - ret[key] = val; - delete obj[key]; - } - } - }); - return ret; -}; - -/** - * Parse a signed cookie string, return the decoded value - * - * @param {String} str signed cookie string - * @param {String} secret - * @return {String} decoded value - * @api private - */ - -exports.parseSignedCookie = function(str, secret){ - return 0 == str.indexOf('s:') - ? signature.unsign(str.slice(2), secret) - : str; -}; - -/** - * Parse JSON cookies. - * - * @param {Object} obj - * @return {Object} - * @api private - */ - -exports.parseJSONCookies = function(obj){ - Object.keys(obj).forEach(function(key){ - var val = obj[key]; - var res = exports.parseJSONCookie(val); - if (res) obj[key] = res; - }); - return obj; -}; - -/** - * Parse JSON cookie string - * - * @param {String} str - * @return {Object} Parsed object or null if not json cookie - * @api private - */ - -exports.parseJSONCookie = function(str) { - if (0 == str.indexOf('j:')) { - try { - return JSON.parse(str.slice(2)); - } catch (err) { - // no op - } - } -}; - -/** - * Pause `data` and `end` events on the given `obj`. - * Middleware performing async tasks _should_ utilize - * this utility (or similar), to re-emit data once - * the async operation has completed, otherwise these - * events may be lost. - * - * var pause = utils.pause(req); - * fs.readFile(path, function(){ - * next(); - * pause.resume(); - * }); - * - * @param {Object} obj - * @return {Object} - * @api private - */ - -exports.pause = require('pause'); - -/** - * Strip `Content-*` headers from `res`. - * - * @param {ServerResponse} res - * @api private - */ - -exports.removeContentHeaders = function(res){ - Object.keys(res._headers).forEach(function(field){ - if (0 == field.indexOf('content')) { - res.removeHeader(field); - } - }); -}; - -/** - * Check if `req` is a conditional GET request. - * - * @param {IncomingMessage} req - * @return {Boolean} - * @api private - */ - -exports.conditionalGET = function(req) { - return req.headers['if-modified-since'] - || req.headers['if-none-match']; -}; - -/** - * Respond with 401 "Unauthorized". - * - * @param {ServerResponse} res - * @param {String} realm - * @api private - */ - -exports.unauthorized = function(res, realm) { - res.statusCode = 401; - res.setHeader('WWW-Authenticate', 'Basic realm="' + realm + '"'); - res.end('Unauthorized'); -}; - -/** - * Respond with 304 "Not Modified". - * - * @param {ServerResponse} res - * @param {Object} headers - * @api private - */ - -exports.notModified = function(res) { - exports.removeContentHeaders(res); - res.statusCode = 304; - res.end(); -}; - -/** - * Return an ETag in the form of `"-"` - * from the given `stat`. - * - * @param {Object} stat - * @return {String} - * @api private - */ - -exports.etag = function(stat) { - return '"' + stat.size + '-' + Number(stat.mtime) + '"'; -}; - -/** - * Parse the given Cache-Control `str`. - * - * @param {String} str - * @return {Object} - * @api private - */ - -exports.parseCacheControl = function(str){ - var directives = str.split(',') - , obj = {}; - - for(var i = 0, len = directives.length; i < len; i++) { - var parts = directives[i].split('=') - , key = parts.shift().trim() - , val = parseInt(parts.shift(), 10); - - obj[key] = isNaN(val) ? true : val; - } - - return obj; -}; - -/** - * Parse the `req` url with memoization. - * - * @param {ServerRequest} req - * @return {Object} - * @api private - */ - -exports.parseUrl = function(req){ - var parsed = req._parsedUrl; - if (parsed && parsed.href == req.url) { - return parsed; - } else { - return req._parsedUrl = parse(req.url); - } -}; - -/** - * Parse byte `size` string. - * - * @param {String} size - * @return {Number} - * @api private - */ - -exports.parseBytes = require('bytes'); diff --git a/node_modules/express/node_modules/connect/node_modules/bytes/.npmignore b/node_modules/express/node_modules/connect/node_modules/bytes/.npmignore deleted file mode 100644 index 9daeafb..0000000 --- a/node_modules/express/node_modules/connect/node_modules/bytes/.npmignore +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/node_modules/express/node_modules/connect/node_modules/bytes/History.md b/node_modules/express/node_modules/connect/node_modules/bytes/History.md deleted file mode 100644 index db1f759..0000000 --- a/node_modules/express/node_modules/connect/node_modules/bytes/History.md +++ /dev/null @@ -1,5 +0,0 @@ - -0.1.0 / 2012-07-04 -================== - - * add bytes to string conversion [yields] diff --git a/node_modules/express/node_modules/connect/node_modules/bytes/Makefile b/node_modules/express/node_modules/connect/node_modules/bytes/Makefile deleted file mode 100644 index 8e8640f..0000000 --- a/node_modules/express/node_modules/connect/node_modules/bytes/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - -test: - @./node_modules/.bin/mocha \ - --reporter spec \ - --require should - -.PHONY: test \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/bytes/Readme.md b/node_modules/express/node_modules/connect/node_modules/bytes/Readme.md deleted file mode 100644 index 9325d5b..0000000 --- a/node_modules/express/node_modules/connect/node_modules/bytes/Readme.md +++ /dev/null @@ -1,51 +0,0 @@ -# node-bytes - - Byte string parser / formatter. - -## Example: - -```js -bytes('1kb') -// => 1024 - -bytes('2mb') -// => 2097152 - -bytes('1gb') -// => 1073741824 - -bytes(1073741824) -// => 1gb -``` - -## Installation - -``` -$ npm install bytes -$ component install visionmedia/bytes.js -``` - -## License - -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca> - -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. diff --git a/node_modules/express/node_modules/connect/node_modules/bytes/component.json b/node_modules/express/node_modules/connect/node_modules/bytes/component.json deleted file mode 100644 index 76a6057..0000000 --- a/node_modules/express/node_modules/connect/node_modules/bytes/component.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "bytes", - "description": "byte size string parser / serializer", - "keywords": ["bytes", "utility"], - "version": "0.1.0", - "scripts": ["index.js"] -} diff --git a/node_modules/express/node_modules/connect/node_modules/bytes/index.js b/node_modules/express/node_modules/connect/node_modules/bytes/index.js deleted file mode 100644 index 3eaafc7..0000000 --- a/node_modules/express/node_modules/connect/node_modules/bytes/index.js +++ /dev/null @@ -1,39 +0,0 @@ - -/** - * Parse byte `size` string. - * - * @param {String} size - * @return {Number} - * @api public - */ - -module.exports = function(size) { - if ('number' == typeof size) return convert(size); - var parts = size.match(/^(\d+(?:\.\d+)?) *(kb|mb|gb)$/) - , n = parseFloat(parts[1]) - , type = parts[2]; - - var map = { - kb: 1 << 10 - , mb: 1 << 20 - , gb: 1 << 30 - }; - - return map[type] * n; -}; - -/** - * convert bytes into string. - * - * @param {Number} b - bytes to convert - * @return {String}i - * @api public - */ - -function convert (b) { - var gb = 1 << 30, mb = 1 << 20, kb = 1 << 10; - if (b >= gb) return (Math.round(b / gb * 100) / 100) + 'gb'; - if (b >= mb) return (Math.round(b / mb * 100) / 100) + 'mb'; - if (b >= kb) return (Math.round(b / kb * 100) / 100) + 'kb'; - return b; -} \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/bytes/package.json b/node_modules/express/node_modules/connect/node_modules/bytes/package.json deleted file mode 100644 index 05f17ec..0000000 --- a/node_modules/express/node_modules/connect/node_modules/bytes/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "bytes", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - }, - "description": "byte size string parser / serializer", - "version": "0.1.0", - "main": "index.js", - "dependencies": {}, - "devDependencies": { - "mocha": "*", - "should": "*" - }, - "component": { - "scripts": { - "bytes": "index.js" - } - }, - "readme": "# node-bytes\n\n Byte string parser / formatter.\n\n## Example:\n\n```js\nbytes('1kb')\n// => 1024\n\nbytes('2mb')\n// => 2097152\n\nbytes('1gb')\n// => 1073741824\n\nbytes(1073741824)\n// => 1gb\n```\n\n## Installation\n\n```\n$ npm install bytes\n$ component install visionmedia/bytes.js\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", - "_id": "bytes@0.1.0", - "_from": "bytes@0.1.0" -} diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/.npmignore b/node_modules/express/node_modules/connect/node_modules/formidable/.npmignore deleted file mode 100644 index 4fbabb3..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -/test/tmp/ -*.upload -*.un~ -*.http diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/.travis.yml b/node_modules/express/node_modules/connect/node_modules/formidable/.travis.yml deleted file mode 100644 index f1d0f13..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.4 - - 0.6 diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/Makefile b/node_modules/express/node_modules/connect/node_modules/formidable/Makefile deleted file mode 100644 index 8945872..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -SHELL := /bin/bash - -test: - @./test/run.js - -build: npm test - -npm: - npm install . - -clean: - rm test/tmp/* - -.PHONY: test clean build diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/Readme.md b/node_modules/express/node_modules/connect/node_modules/formidable/Readme.md deleted file mode 100644 index a5ca104..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/Readme.md +++ /dev/null @@ -1,311 +0,0 @@ -# Formidable - -[![Build Status](https://secure.travis-ci.org/felixge/node-formidable.png?branch=master)](http://travis-ci.org/felixge/node-formidable) - -## Purpose - -A node.js module for parsing form data, especially file uploads. - -## Current status - -This module was developed for [Transloadit](http://transloadit.com/), a service focused on uploading -and encoding images and videos. It has been battle-tested against hundreds of GB of file uploads from -a large variety of clients and is considered production-ready. - -## Features - -* Fast (~500mb/sec), non-buffering multipart parser -* Automatically writing file uploads to disk -* Low memory footprint -* Graceful error handling -* Very high test coverage - -## Changelog - -### v1.0.9 - -* Emit progress when content length header parsed (Tim Koschützki) -* Fix Readme syntax due to GitHub changes (goob) -* Replace references to old 'sys' module in Readme with 'util' (Peter Sugihara) - -### v1.0.8 - -* Strip potentially unsafe characters when using `keepExtensions: true`. -* Switch to utest / urun for testing -* Add travis build - -### v1.0.7 - -* Remove file from package that was causing problems when installing on windows. (#102) -* Fix typos in Readme (Jason Davies). - -### v1.0.6 - -* Do not default to the default to the field name for file uploads where - filename="". - -### v1.0.5 - -* Support filename="" in multipart parts -* Explain unexpected end() errors in parser better - -**Note:** Starting with this version, formidable emits 'file' events for empty -file input fields. Previously those were incorrectly emitted as regular file -input fields with value = "". - -### v1.0.4 - -* Detect a good default tmp directory regardless of platform. (#88) - -### v1.0.3 - -* Fix problems with utf8 characters (#84) / semicolons in filenames (#58) -* Small performance improvements -* New test suite and fixture system - -### v1.0.2 - -* Exclude node\_modules folder from git -* Implement new `'aborted'` event -* Fix files in example folder to work with recent node versions -* Make gently a devDependency - -[See Commits](https://github.com/felixge/node-formidable/compare/v1.0.1...v1.0.2) - -### v1.0.1 - -* Fix package.json to refer to proper main directory. (#68, Dean Landolt) - -[See Commits](https://github.com/felixge/node-formidable/compare/v1.0.0...v1.0.1) - -### v1.0.0 - -* Add support for multipart boundaries that are quoted strings. (Jeff Craig) - -This marks the beginning of development on version 2.0 which will include -several architectural improvements. - -[See Commits](https://github.com/felixge/node-formidable/compare/v0.9.11...v1.0.0) - -### v0.9.11 - -* Emit `'progress'` event when receiving data, regardless of parsing it. (Tim Koschützki) -* Use [W3C FileAPI Draft](http://dev.w3.org/2006/webapi/FileAPI/) properties for File class - -**Important:** The old property names of the File class will be removed in a -future release. - -[See Commits](https://github.com/felixge/node-formidable/compare/v0.9.10...v0.9.11) - -### Older releases - -These releases were done before starting to maintain the above Changelog: - -* [v0.9.10](https://github.com/felixge/node-formidable/compare/v0.9.9...v0.9.10) -* [v0.9.9](https://github.com/felixge/node-formidable/compare/v0.9.8...v0.9.9) -* [v0.9.8](https://github.com/felixge/node-formidable/compare/v0.9.7...v0.9.8) -* [v0.9.7](https://github.com/felixge/node-formidable/compare/v0.9.6...v0.9.7) -* [v0.9.6](https://github.com/felixge/node-formidable/compare/v0.9.5...v0.9.6) -* [v0.9.5](https://github.com/felixge/node-formidable/compare/v0.9.4...v0.9.5) -* [v0.9.4](https://github.com/felixge/node-formidable/compare/v0.9.3...v0.9.4) -* [v0.9.3](https://github.com/felixge/node-formidable/compare/v0.9.2...v0.9.3) -* [v0.9.2](https://github.com/felixge/node-formidable/compare/v0.9.1...v0.9.2) -* [v0.9.1](https://github.com/felixge/node-formidable/compare/v0.9.0...v0.9.1) -* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0) -* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0) -* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0) -* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0) -* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0) -* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0) -* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0) -* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0) -* [v0.1.0](https://github.com/felixge/node-formidable/commits/v0.1.0) - -## Installation - -Via [npm](http://github.com/isaacs/npm): - - npm install formidable@latest - -Manually: - - git clone git://github.com/felixge/node-formidable.git formidable - vim my.js - # var formidable = require('./formidable'); - -Note: Formidable requires [gently](http://github.com/felixge/node-gently) to run the unit tests, but you won't need it for just using the library. - -## Example - -Parse an incoming file upload. - - var formidable = require('formidable'), - http = require('http'), - - util = require('util'); - - http.createServer(function(req, res) { - if (req.url == '/upload' && req.method.toLowerCase() == 'post') { - // parse a file upload - var form = new formidable.IncomingForm(); - form.parse(req, function(err, fields, files) { - res.writeHead(200, {'content-type': 'text/plain'}); - res.write('received upload:\n\n'); - res.end(util.inspect({fields: fields, files: files})); - }); - return; - } - - // show a file upload form - res.writeHead(200, {'content-type': 'text/html'}); - res.end( - '
      '+ - '
      '+ - '
      '+ - ''+ - '
      ' - ); - }).listen(80); - -## API - -### formidable.IncomingForm - -__new formidable.IncomingForm()__ - -Creates a new incoming form. - -__incomingForm.encoding = 'utf-8'__ - -The encoding to use for incoming form fields. - -__incomingForm.uploadDir = process.env.TMP || '/tmp' || process.cwd()__ - -The directory for placing file uploads in. You can move them later on using -`fs.rename()`. The default directory is picked at module load time depending on -the first existing directory from those listed above. - -__incomingForm.keepExtensions = false__ - -If you want the files written to `incomingForm.uploadDir` to include the extensions of the original files, set this property to `true`. - -__incomingForm.type__ - -Either 'multipart' or 'urlencoded' depending on the incoming request. - -__incomingForm.maxFieldsSize = 2 * 1024 * 1024__ - -Limits the amount of memory a field (not file) can allocate in bytes. -If this value is exceeded, an `'error'` event is emitted. The default -size is 2MB. - -__incomingForm.hash = false__ - -If you want checksums calculated for incoming files, set this to either `'sha1'` or `'md5'`. - -__incomingForm.bytesReceived__ - -The amount of bytes received for this form so far. - -__incomingForm.bytesExpected__ - -The expected number of bytes in this form. - -__incomingForm.parse(request, [cb])__ - -Parses an incoming node.js `request` containing form data. If `cb` is provided, all fields an files are collected and passed to the callback: - - incomingForm.parse(req, function(err, fields, files) { - // ... - }); - -__incomingForm.onPart(part)__ - -You may overwrite this method if you are interested in directly accessing the multipart stream. Doing so will disable any `'field'` / `'file'` events processing which would occur otherwise, making you fully responsible for handling the processing. - - incomingForm.onPart = function(part) { - part.addListener('data', function() { - // ... - }); - } - -If you want to use formidable to only handle certain parts for you, you can do so: - - incomingForm.onPart = function(part) { - if (!part.filename) { - // let formidable handle all non-file parts - incomingForm.handlePart(part); - } - } - -Check the code in this method for further inspiration. - -__Event: 'progress' (bytesReceived, bytesExpected)__ - -Emitted after each incoming chunk of data that has been parsed. Can be used to roll your own progress bar. - -__Event: 'field' (name, value)__ - -Emitted whenever a field / value pair has been received. - -__Event: 'fileBegin' (name, file)__ - -Emitted whenever a new file is detected in the upload stream. Use this even if -you want to stream the file to somewhere else while buffering the upload on -the file system. - -__Event: 'file' (name, file)__ - -Emitted whenever a field / file pair has been received. `file` is an instance of `File`. - -__Event: 'error' (err)__ - -Emitted when there is an error processing the incoming form. A request that experiences an error is automatically paused, you will have to manually call `request.resume()` if you want the request to continue firing `'data'` events. - -__Event: 'aborted'__ - -Emitted when the request was aborted by the user. Right now this can be due to a 'timeout' or 'close' event on the socket. In the future there will be a separate 'timeout' event (needs a change in the node core). - -__Event: 'end' ()__ - -Emitted when the entire request has been received, and all contained files have finished flushing to disk. This is a great place for you to send your response. - -### formidable.File - -__file.size = 0__ - -The size of the uploaded file in bytes. If the file is still being uploaded (see `'fileBegin'` event), this property says how many bytes of the file have been written to disk yet. - -__file.path = null__ - -The path this file is being written to. You can modify this in the `'fileBegin'` event in -case you are unhappy with the way formidable generates a temporary path for your files. - -__file.name = null__ - -The name this file had according to the uploading client. - -__file.type = null__ - -The mime type of this file, according to the uploading client. - -__file.lastModifiedDate = null__ - -A date object (or `null`) containing the time this file was last written to. Mostly -here for compatibility with the [W3C File API Draft](http://dev.w3.org/2006/webapi/FileAPI/). - -__file.hash = null__ - -If hash calculation was set, you can read the hex digest out of this var. - -## License - -Formidable is licensed under the MIT license. - -## Ports - -* [multipart-parser](http://github.com/FooBarWidget/multipart-parser): a C++ parser based on formidable - -## Credits - -* [Ryan Dahl](http://twitter.com/ryah) for his work on [http-parser](http://github.com/ry/http-parser) which heavily inspired multipart_parser.js diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/TODO b/node_modules/express/node_modules/connect/node_modules/formidable/TODO deleted file mode 100644 index e1107f2..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/TODO +++ /dev/null @@ -1,3 +0,0 @@ -- Better bufferMaxSize handling approach -- Add tests for JSON parser pull request and merge it -- Implement QuerystringParser the same way as MultipartParser diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/benchmark/bench-multipart-parser.js b/node_modules/express/node_modules/connect/node_modules/formidable/benchmark/bench-multipart-parser.js deleted file mode 100644 index bff41f1..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/benchmark/bench-multipart-parser.js +++ /dev/null @@ -1,70 +0,0 @@ -require('../test/common'); -var multipartParser = require('../lib/multipart_parser'), - MultipartParser = multipartParser.MultipartParser, - parser = new MultipartParser(), - Buffer = require('buffer').Buffer, - boundary = '-----------------------------168072824752491622650073', - mb = 100, - buffer = createMultipartBuffer(boundary, mb * 1024 * 1024), - callbacks = - { partBegin: -1, - partEnd: -1, - headerField: -1, - headerValue: -1, - partData: -1, - end: -1, - }; - - -parser.initWithBoundary(boundary); -parser.onHeaderField = function() { - callbacks.headerField++; -}; - -parser.onHeaderValue = function() { - callbacks.headerValue++; -}; - -parser.onPartBegin = function() { - callbacks.partBegin++; -}; - -parser.onPartData = function() { - callbacks.partData++; -}; - -parser.onPartEnd = function() { - callbacks.partEnd++; -}; - -parser.onEnd = function() { - callbacks.end++; -}; - -var start = +new Date(), - nparsed = parser.write(buffer), - duration = +new Date - start, - mbPerSec = (mb / (duration / 1000)).toFixed(2); - -console.log(mbPerSec+' mb/sec'); - -assert.equal(nparsed, buffer.length); - -function createMultipartBuffer(boundary, size) { - var head = - '--'+boundary+'\r\n' - + 'content-disposition: form-data; name="field1"\r\n' - + '\r\n' - , tail = '\r\n--'+boundary+'--\r\n' - , buffer = new Buffer(size); - - buffer.write(head, 'ascii', 0); - buffer.write(tail, 'ascii', buffer.length - tail.length); - return buffer; -} - -process.on('exit', function() { - for (var k in callbacks) { - assert.equal(0, callbacks[k], k+' count off by '+callbacks[k]); - } -}); diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/example/post.js b/node_modules/express/node_modules/connect/node_modules/formidable/example/post.js deleted file mode 100644 index f6c15a6..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/example/post.js +++ /dev/null @@ -1,43 +0,0 @@ -require('../test/common'); -var http = require('http'), - util = require('util'), - formidable = require('formidable'), - server; - -server = http.createServer(function(req, res) { - if (req.url == '/') { - res.writeHead(200, {'content-type': 'text/html'}); - res.end( - '
      '+ - '
      '+ - '
      '+ - ''+ - '
      ' - ); - } else if (req.url == '/post') { - var form = new formidable.IncomingForm(), - fields = []; - - form - .on('error', function(err) { - res.writeHead(200, {'content-type': 'text/plain'}); - res.end('error:\n\n'+util.inspect(err)); - }) - .on('field', function(field, value) { - console.log(field, value); - fields.push([field, value]); - }) - .on('end', function() { - console.log('-> post done'); - res.writeHead(200, {'content-type': 'text/plain'}); - res.end('received fields:\n\n '+util.inspect(fields)); - }); - form.parse(req); - } else { - res.writeHead(404, {'content-type': 'text/plain'}); - res.end('404'); - } -}); -server.listen(TEST_PORT); - -console.log('listening on http://localhost:'+TEST_PORT+'/'); diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/example/upload.js b/node_modules/express/node_modules/connect/node_modules/formidable/example/upload.js deleted file mode 100644 index 050cdd9..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/example/upload.js +++ /dev/null @@ -1,48 +0,0 @@ -require('../test/common'); -var http = require('http'), - util = require('util'), - formidable = require('formidable'), - server; - -server = http.createServer(function(req, res) { - if (req.url == '/') { - res.writeHead(200, {'content-type': 'text/html'}); - res.end( - '
      '+ - '
      '+ - '
      '+ - ''+ - '
      ' - ); - } else if (req.url == '/upload') { - var form = new formidable.IncomingForm(), - files = [], - fields = []; - - form.uploadDir = TEST_TMP; - - form - .on('field', function(field, value) { - console.log(field, value); - fields.push([field, value]); - }) - .on('file', function(field, file) { - console.log(field, file); - files.push([field, file]); - }) - .on('end', function() { - console.log('-> upload done'); - res.writeHead(200, {'content-type': 'text/plain'}); - res.write('received fields:\n\n '+util.inspect(fields)); - res.write('\n\n'); - res.end('received files:\n\n '+util.inspect(files)); - }); - form.parse(req); - } else { - res.writeHead(404, {'content-type': 'text/plain'}); - res.end('404'); - } -}); -server.listen(TEST_PORT); - -console.log('listening on http://localhost:'+TEST_PORT+'/'); diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/index.js b/node_modules/express/node_modules/connect/node_modules/formidable/index.js deleted file mode 100644 index be41032..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lib/formidable'); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/lib/file.js b/node_modules/express/node_modules/connect/node_modules/formidable/lib/file.js deleted file mode 100644 index dad8d5f..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/lib/file.js +++ /dev/null @@ -1,73 +0,0 @@ -if (global.GENTLY) require = GENTLY.hijack(require); - -var util = require('./util'), - WriteStream = require('fs').WriteStream, - EventEmitter = require('events').EventEmitter, - crypto = require('crypto'); - -function File(properties) { - EventEmitter.call(this); - - this.size = 0; - this.path = null; - this.name = null; - this.type = null; - this.hash = null; - this.lastModifiedDate = null; - - this._writeStream = null; - - for (var key in properties) { - this[key] = properties[key]; - } - - if(typeof this.hash === 'string') { - this.hash = crypto.createHash(properties.hash); - } - - this._backwardsCompatibility(); -} -module.exports = File; -util.inherits(File, EventEmitter); - -// @todo Next release: Show error messages when accessing these -File.prototype._backwardsCompatibility = function() { - var self = this; - this.__defineGetter__('length', function() { - return self.size; - }); - this.__defineGetter__('filename', function() { - return self.name; - }); - this.__defineGetter__('mime', function() { - return self.type; - }); -}; - -File.prototype.open = function() { - this._writeStream = new WriteStream(this.path); -}; - -File.prototype.write = function(buffer, cb) { - var self = this; - this._writeStream.write(buffer, function() { - if(self.hash) { - self.hash.update(buffer); - } - self.lastModifiedDate = new Date(); - self.size += buffer.length; - self.emit('progress', self.size); - cb(); - }); -}; - -File.prototype.end = function(cb) { - var self = this; - this._writeStream.end(function() { - if(self.hash) { - self.hash = self.hash.digest('hex'); - } - self.emit('end'); - cb(); - }); -}; diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/lib/incoming_form.js b/node_modules/express/node_modules/connect/node_modules/formidable/lib/incoming_form.js deleted file mode 100644 index 060eac2..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/lib/incoming_form.js +++ /dev/null @@ -1,384 +0,0 @@ -if (global.GENTLY) require = GENTLY.hijack(require); - -var fs = require('fs'); -var util = require('./util'), - path = require('path'), - File = require('./file'), - MultipartParser = require('./multipart_parser').MultipartParser, - QuerystringParser = require('./querystring_parser').QuerystringParser, - StringDecoder = require('string_decoder').StringDecoder, - EventEmitter = require('events').EventEmitter, - Stream = require('stream').Stream; - -function IncomingForm(opts) { - if (!(this instanceof IncomingForm)) return new IncomingForm; - EventEmitter.call(this); - - opts=opts||{}; - - this.error = null; - this.ended = false; - - this.maxFieldsSize = opts.maxFieldsSize || 2 * 1024 * 1024; - this.keepExtensions = opts.keepExtensions || false; - this.uploadDir = opts.uploadDir || IncomingForm.UPLOAD_DIR; - this.encoding = opts.encoding || 'utf-8'; - this.headers = null; - this.type = null; - this.hash = false; - - this.bytesReceived = null; - this.bytesExpected = null; - - this._parser = null; - this._flushing = 0; - this._fieldsSize = 0; -}; -util.inherits(IncomingForm, EventEmitter); -exports.IncomingForm = IncomingForm; - -IncomingForm.UPLOAD_DIR = (function() { - var dirs = [process.env.TMP, '/tmp', process.cwd()]; - for (var i = 0; i < dirs.length; i++) { - var dir = dirs[i]; - var isDirectory = false; - - try { - isDirectory = fs.statSync(dir).isDirectory(); - } catch (e) {} - - if (isDirectory) return dir; - } -})(); - -IncomingForm.prototype.parse = function(req, cb) { - this.pause = function() { - try { - req.pause(); - } catch (err) { - // the stream was destroyed - if (!this.ended) { - // before it was completed, crash & burn - this._error(err); - } - return false; - } - return true; - }; - - this.resume = function() { - try { - req.resume(); - } catch (err) { - // the stream was destroyed - if (!this.ended) { - // before it was completed, crash & burn - this._error(err); - } - return false; - } - - return true; - }; - - this.writeHeaders(req.headers); - - var self = this; - req - .on('error', function(err) { - self._error(err); - }) - .on('aborted', function() { - self.emit('aborted'); - }) - .on('data', function(buffer) { - self.write(buffer); - }) - .on('end', function() { - if (self.error) { - return; - } - - var err = self._parser.end(); - if (err) { - self._error(err); - } - }); - - if (cb) { - var fields = {}, files = {}; - this - .on('field', function(name, value) { - fields[name] = value; - }) - .on('file', function(name, file) { - files[name] = file; - }) - .on('error', function(err) { - cb(err, fields, files); - }) - .on('end', function() { - cb(null, fields, files); - }); - } - - return this; -}; - -IncomingForm.prototype.writeHeaders = function(headers) { - this.headers = headers; - this._parseContentLength(); - this._parseContentType(); -}; - -IncomingForm.prototype.write = function(buffer) { - if (!this._parser) { - this._error(new Error('unintialized parser')); - return; - } - - this.bytesReceived += buffer.length; - this.emit('progress', this.bytesReceived, this.bytesExpected); - - var bytesParsed = this._parser.write(buffer); - if (bytesParsed !== buffer.length) { - this._error(new Error('parser error, '+bytesParsed+' of '+buffer.length+' bytes parsed')); - } - - return bytesParsed; -}; - -IncomingForm.prototype.pause = function() { - // this does nothing, unless overwritten in IncomingForm.parse - return false; -}; - -IncomingForm.prototype.resume = function() { - // this does nothing, unless overwritten in IncomingForm.parse - return false; -}; - -IncomingForm.prototype.onPart = function(part) { - // this method can be overwritten by the user - this.handlePart(part); -}; - -IncomingForm.prototype.handlePart = function(part) { - var self = this; - - if (part.filename === undefined) { - var value = '' - , decoder = new StringDecoder(this.encoding); - - part.on('data', function(buffer) { - self._fieldsSize += buffer.length; - if (self._fieldsSize > self.maxFieldsSize) { - self._error(new Error('maxFieldsSize exceeded, received '+self._fieldsSize+' bytes of field data')); - return; - } - value += decoder.write(buffer); - }); - - part.on('end', function() { - self.emit('field', part.name, value); - }); - return; - } - - this._flushing++; - - var file = new File({ - path: this._uploadPath(part.filename), - name: part.filename, - type: part.mime, - hash: self.hash - }); - - this.emit('fileBegin', part.name, file); - - file.open(); - - part.on('data', function(buffer) { - self.pause(); - file.write(buffer, function() { - self.resume(); - }); - }); - - part.on('end', function() { - file.end(function() { - self._flushing--; - self.emit('file', part.name, file); - self._maybeEnd(); - }); - }); -}; - -IncomingForm.prototype._parseContentType = function() { - if (!this.headers['content-type']) { - this._error(new Error('bad content-type header, no content-type')); - return; - } - - if (this.headers['content-type'].match(/urlencoded/i)) { - this._initUrlencoded(); - return; - } - - if (this.headers['content-type'].match(/multipart/i)) { - var m; - if (m = this.headers['content-type'].match(/boundary=(?:"([^"]+)"|([^;]+))/i)) { - this._initMultipart(m[1] || m[2]); - } else { - this._error(new Error('bad content-type header, no multipart boundary')); - } - return; - } - - this._error(new Error('bad content-type header, unknown content-type: '+this.headers['content-type'])); -}; - -IncomingForm.prototype._error = function(err) { - if (this.error) { - return; - } - - this.error = err; - this.pause(); - this.emit('error', err); -}; - -IncomingForm.prototype._parseContentLength = function() { - if (this.headers['content-length']) { - this.bytesReceived = 0; - this.bytesExpected = parseInt(this.headers['content-length'], 10); - this.emit('progress', this.bytesReceived, this.bytesExpected); - } -}; - -IncomingForm.prototype._newParser = function() { - return new MultipartParser(); -}; - -IncomingForm.prototype._initMultipart = function(boundary) { - this.type = 'multipart'; - - var parser = new MultipartParser(), - self = this, - headerField, - headerValue, - part; - - parser.initWithBoundary(boundary); - - parser.onPartBegin = function() { - part = new Stream(); - part.readable = true; - part.headers = {}; - part.name = null; - part.filename = null; - part.mime = null; - headerField = ''; - headerValue = ''; - }; - - parser.onHeaderField = function(b, start, end) { - headerField += b.toString(self.encoding, start, end); - }; - - parser.onHeaderValue = function(b, start, end) { - headerValue += b.toString(self.encoding, start, end); - }; - - parser.onHeaderEnd = function() { - headerField = headerField.toLowerCase(); - part.headers[headerField] = headerValue; - - var m; - if (headerField == 'content-disposition') { - if (m = headerValue.match(/name="([^"]+)"/i)) { - part.name = m[1]; - } - - part.filename = self._fileName(headerValue); - } else if (headerField == 'content-type') { - part.mime = headerValue; - } - - headerField = ''; - headerValue = ''; - }; - - parser.onHeadersEnd = function() { - self.onPart(part); - }; - - parser.onPartData = function(b, start, end) { - part.emit('data', b.slice(start, end)); - }; - - parser.onPartEnd = function() { - part.emit('end'); - }; - - parser.onEnd = function() { - self.ended = true; - self._maybeEnd(); - }; - - this._parser = parser; -}; - -IncomingForm.prototype._fileName = function(headerValue) { - var m = headerValue.match(/filename="(.*?)"($|; )/i) - if (!m) return; - - var filename = m[1].substr(m[1].lastIndexOf('\\') + 1); - filename = filename.replace(/%22/g, '"'); - filename = filename.replace(/&#([\d]{4});/g, function(m, code) { - return String.fromCharCode(code); - }); - return filename; -}; - -IncomingForm.prototype._initUrlencoded = function() { - this.type = 'urlencoded'; - - var parser = new QuerystringParser() - , self = this; - - parser.onField = function(key, val) { - self.emit('field', key, val); - }; - - parser.onEnd = function() { - self.ended = true; - self._maybeEnd(); - }; - - this._parser = parser; -}; - -IncomingForm.prototype._uploadPath = function(filename) { - var name = ''; - for (var i = 0; i < 32; i++) { - name += Math.floor(Math.random() * 16).toString(16); - } - - if (this.keepExtensions) { - var ext = path.extname(filename); - ext = ext.replace(/(\.[a-z0-9]+).*/, '$1') - - name += ext; - } - - return path.join(this.uploadDir, name); -}; - -IncomingForm.prototype._maybeEnd = function() { - if (!this.ended || this._flushing) { - return; - } - - this.emit('end'); -}; diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/lib/index.js b/node_modules/express/node_modules/connect/node_modules/formidable/lib/index.js deleted file mode 100644 index 7a6e3e1..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/lib/index.js +++ /dev/null @@ -1,3 +0,0 @@ -var IncomingForm = require('./incoming_form').IncomingForm; -IncomingForm.IncomingForm = IncomingForm; -module.exports = IncomingForm; diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/lib/multipart_parser.js b/node_modules/express/node_modules/connect/node_modules/formidable/lib/multipart_parser.js deleted file mode 100644 index 9ca567c..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/lib/multipart_parser.js +++ /dev/null @@ -1,312 +0,0 @@ -var Buffer = require('buffer').Buffer, - s = 0, - S = - { PARSER_UNINITIALIZED: s++, - START: s++, - START_BOUNDARY: s++, - HEADER_FIELD_START: s++, - HEADER_FIELD: s++, - HEADER_VALUE_START: s++, - HEADER_VALUE: s++, - HEADER_VALUE_ALMOST_DONE: s++, - HEADERS_ALMOST_DONE: s++, - PART_DATA_START: s++, - PART_DATA: s++, - PART_END: s++, - END: s++, - }, - - f = 1, - F = - { PART_BOUNDARY: f, - LAST_BOUNDARY: f *= 2, - }, - - LF = 10, - CR = 13, - SPACE = 32, - HYPHEN = 45, - COLON = 58, - A = 97, - Z = 122, - - lower = function(c) { - return c | 0x20; - }; - -for (var s in S) { - exports[s] = S[s]; -} - -function MultipartParser() { - this.boundary = null; - this.boundaryChars = null; - this.lookbehind = null; - this.state = S.PARSER_UNINITIALIZED; - - this.index = null; - this.flags = 0; -}; -exports.MultipartParser = MultipartParser; - -MultipartParser.stateToString = function(stateNumber) { - for (var state in S) { - var number = S[state]; - if (number === stateNumber) return state; - } -}; - -MultipartParser.prototype.initWithBoundary = function(str) { - this.boundary = new Buffer(str.length+4); - this.boundary.write('\r\n--', 'ascii', 0); - this.boundary.write(str, 'ascii', 4); - this.lookbehind = new Buffer(this.boundary.length+8); - this.state = S.START; - - this.boundaryChars = {}; - for (var i = 0; i < this.boundary.length; i++) { - this.boundaryChars[this.boundary[i]] = true; - } -}; - -MultipartParser.prototype.write = function(buffer) { - var self = this, - i = 0, - len = buffer.length, - prevIndex = this.index, - index = this.index, - state = this.state, - flags = this.flags, - lookbehind = this.lookbehind, - boundary = this.boundary, - boundaryChars = this.boundaryChars, - boundaryLength = this.boundary.length, - boundaryEnd = boundaryLength - 1, - bufferLength = buffer.length, - c, - cl, - - mark = function(name) { - self[name+'Mark'] = i; - }, - clear = function(name) { - delete self[name+'Mark']; - }, - callback = function(name, buffer, start, end) { - if (start !== undefined && start === end) { - return; - } - - var callbackSymbol = 'on'+name.substr(0, 1).toUpperCase()+name.substr(1); - if (callbackSymbol in self) { - self[callbackSymbol](buffer, start, end); - } - }, - dataCallback = function(name, clear) { - var markSymbol = name+'Mark'; - if (!(markSymbol in self)) { - return; - } - - if (!clear) { - callback(name, buffer, self[markSymbol], buffer.length); - self[markSymbol] = 0; - } else { - callback(name, buffer, self[markSymbol], i); - delete self[markSymbol]; - } - }; - - for (i = 0; i < len; i++) { - c = buffer[i]; - switch (state) { - case S.PARSER_UNINITIALIZED: - return i; - case S.START: - index = 0; - state = S.START_BOUNDARY; - case S.START_BOUNDARY: - if (index == boundary.length - 2) { - if (c != CR) { - return i; - } - index++; - break; - } else if (index - 1 == boundary.length - 2) { - if (c != LF) { - return i; - } - index = 0; - callback('partBegin'); - state = S.HEADER_FIELD_START; - break; - } - - if (c != boundary[index+2]) { - return i; - } - index++; - break; - case S.HEADER_FIELD_START: - state = S.HEADER_FIELD; - mark('headerField'); - index = 0; - case S.HEADER_FIELD: - if (c == CR) { - clear('headerField'); - state = S.HEADERS_ALMOST_DONE; - break; - } - - index++; - if (c == HYPHEN) { - break; - } - - if (c == COLON) { - if (index == 1) { - // empty header field - return i; - } - dataCallback('headerField', true); - state = S.HEADER_VALUE_START; - break; - } - - cl = lower(c); - if (cl < A || cl > Z) { - return i; - } - break; - case S.HEADER_VALUE_START: - if (c == SPACE) { - break; - } - - mark('headerValue'); - state = S.HEADER_VALUE; - case S.HEADER_VALUE: - if (c == CR) { - dataCallback('headerValue', true); - callback('headerEnd'); - state = S.HEADER_VALUE_ALMOST_DONE; - } - break; - case S.HEADER_VALUE_ALMOST_DONE: - if (c != LF) { - return i; - } - state = S.HEADER_FIELD_START; - break; - case S.HEADERS_ALMOST_DONE: - if (c != LF) { - return i; - } - - callback('headersEnd'); - state = S.PART_DATA_START; - break; - case S.PART_DATA_START: - state = S.PART_DATA - mark('partData'); - case S.PART_DATA: - prevIndex = index; - - if (index == 0) { - // boyer-moore derrived algorithm to safely skip non-boundary data - i += boundaryEnd; - while (i < bufferLength && !(buffer[i] in boundaryChars)) { - i += boundaryLength; - } - i -= boundaryEnd; - c = buffer[i]; - } - - if (index < boundary.length) { - if (boundary[index] == c) { - if (index == 0) { - dataCallback('partData', true); - } - index++; - } else { - index = 0; - } - } else if (index == boundary.length) { - index++; - if (c == CR) { - // CR = part boundary - flags |= F.PART_BOUNDARY; - } else if (c == HYPHEN) { - // HYPHEN = end boundary - flags |= F.LAST_BOUNDARY; - } else { - index = 0; - } - } else if (index - 1 == boundary.length) { - if (flags & F.PART_BOUNDARY) { - index = 0; - if (c == LF) { - // unset the PART_BOUNDARY flag - flags &= ~F.PART_BOUNDARY; - callback('partEnd'); - callback('partBegin'); - state = S.HEADER_FIELD_START; - break; - } - } else if (flags & F.LAST_BOUNDARY) { - if (c == HYPHEN) { - callback('partEnd'); - callback('end'); - state = S.END; - } else { - index = 0; - } - } else { - index = 0; - } - } - - if (index > 0) { - // when matching a possible boundary, keep a lookbehind reference - // in case it turns out to be a false lead - lookbehind[index-1] = c; - } else if (prevIndex > 0) { - // if our boundary turned out to be rubbish, the captured lookbehind - // belongs to partData - callback('partData', lookbehind, 0, prevIndex); - prevIndex = 0; - mark('partData'); - - // reconsider the current character even so it interrupted the sequence - // it could be the beginning of a new sequence - i--; - } - - break; - case S.END: - break; - default: - return i; - } - } - - dataCallback('headerField'); - dataCallback('headerValue'); - dataCallback('partData'); - - this.index = index; - this.state = state; - this.flags = flags; - - return len; -}; - -MultipartParser.prototype.end = function() { - if (this.state != S.END) { - return new Error('MultipartParser.end(): stream ended unexpectedly: ' + this.explain()); - } -}; - -MultipartParser.prototype.explain = function() { - return 'state = ' + MultipartParser.stateToString(this.state); -}; diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/lib/querystring_parser.js b/node_modules/express/node_modules/connect/node_modules/formidable/lib/querystring_parser.js deleted file mode 100644 index 63f109e..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/lib/querystring_parser.js +++ /dev/null @@ -1,25 +0,0 @@ -if (global.GENTLY) require = GENTLY.hijack(require); - -// This is a buffering parser, not quite as nice as the multipart one. -// If I find time I'll rewrite this to be fully streaming as well -var querystring = require('querystring'); - -function QuerystringParser() { - this.buffer = ''; -}; -exports.QuerystringParser = QuerystringParser; - -QuerystringParser.prototype.write = function(buffer) { - this.buffer += buffer.toString('ascii'); - return buffer.length; -}; - -QuerystringParser.prototype.end = function() { - var fields = querystring.parse(this.buffer); - for (var field in fields) { - this.onField(field, fields[field]); - } - this.buffer = ''; - - this.onEnd(); -}; \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/lib/util.js b/node_modules/express/node_modules/connect/node_modules/formidable/lib/util.js deleted file mode 100644 index e9493e9..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/lib/util.js +++ /dev/null @@ -1,6 +0,0 @@ -// Backwards compatibility ... -try { - module.exports = require('util'); -} catch (e) { - module.exports = require('sys'); -} diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/Makefile b/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/Makefile deleted file mode 100644 index 01f7140..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -test: - @find test/simple/test-*.js | xargs -n 1 -t node - -.PHONY: test \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/Readme.md b/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/Readme.md deleted file mode 100644 index f8f0c66..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/Readme.md +++ /dev/null @@ -1,167 +0,0 @@ -# Gently - -## Purpose - -A node.js module that helps with stubbing and behavior verification. It allows you to test the most remote and nested corners of your code while keeping being fully unobtrusive. - -## Features - -* Overwrite and stub individual object functions -* Verify that all expected calls have been made in the expected order -* Restore stubbed functions to their original behavior -* Detect object / class names from obj.constructor.name and obj.toString() -* Hijack any required module function or class constructor - -## Installation - -Via [npm](http://github.com/isaacs/npm): - - npm install gently@latest - -## Example - -Make sure your dog is working properly: - - function Dog() {} - - Dog.prototype.seeCat = function() { - this.bark('whuf, whuf'); - this.run(); - } - - Dog.prototype.bark = function(bark) { - require('sys').puts(bark); - } - - var gently = new (require('gently')) - , assert = require('assert') - , dog = new Dog(); - - gently.expect(dog, 'bark', function(bark) { - assert.equal(bark, 'whuf, whuf'); - }); - gently.expect(dog, 'run'); - - dog.seeCat(); - -You can also easily test event emitters with this, for example a simple sequence of 2 events emitted by `fs.WriteStream`: - - var gently = new (require('gently')) - , stream = new (require('fs').WriteStream)('my_file.txt'); - - gently.expect(stream, 'emit', function(event) { - assert.equal(event, 'open'); - }); - - gently.expect(stream, 'emit', function(event) { - assert.equal(event, 'drain'); - }); - -For a full read world example, check out this test case: [test-incoming-form.js](http://github.com/felixge/node-formidable/blob/master/test/simple/test-incoming-form.js) (in [node-formdiable](http://github.com/felixge/node-formidable)). - -## API - -### Gently - -#### new Gently() - -Creates a new gently instance. It listens to the process `'exit'` event to make sure all expectations have been verified. - -#### gently.expect(obj, method, [[count], stubFn]) - -Creates an expectation for an objects method to be called. You can optionally specify the call `count` you are expecting, as well as `stubFn` function that will run instead of the original function. - -Returns a reference to the function that is getting overwritten. - -#### gently.expect([count], stubFn) - -Returns a function that is supposed to be executed `count` times, delegating any calls to the provided `stubFn` function. Naming your stubFn closure will help to properly diagnose errors that are being thrown: - - childProcess.exec('ls', gently.expect(function lsCallback(code) { - assert.equal(0, code); - })); - -#### gently.restore(obj, method) - -Restores an object method that has been previously overwritten using `gently.expect()`. - -#### gently.hijack(realRequire) - -Returns a new require functions that catches a reference to all required modules into `gently.hijacked`. - -To use this function, include a line like this in your `'my-module.js'`. - - if (global.GENTLY) require = GENTLY.hijack(require); - - var sys = require('sys'); - exports.hello = function() { - sys.log('world'); - }; - -Now you can write a test for the module above: - - var gently = global.GENTLY = new (require('gently')) - , myModule = require('./my-module'); - - gently.expect(gently.hijacked.sys, 'log', function(str) { - assert.equal(str, 'world'); - }); - - myModule.hello(); - -#### gently.stub(location, [exportsName]) - -Returns a stub class that will be used instead of the real class from the module at `location` with the given `exportsName`. - -This allows to test an OOP version of the previous example, where `'my-module.js'`. - - if (global.GENTLY) require = GENTLY.hijack(require); - - var World = require('./world'); - - exports.hello = function() { - var world = new World(); - world.hello(); - } - -And `world.js` looks like this: - - var sys = require('sys'); - - function World() { - - } - module.exports = World; - - World.prototype.hello = function() { - sys.log('world'); - }; - -Testing `'my-module.js'` can now easily be accomplished: - - var gently = global.GENTLY = new (require('gently')) - , WorldStub = gently.stub('./world') - , myModule = require('./my-module') - , WORLD; - - gently.expect(WorldStub, 'new', function() { - WORLD = this; - }); - - gently.expect(WORLD, 'hello'); - - myModule.hello(); - -#### gently.hijacked - -An object that holds the references to all hijacked modules. - -#### gently.verify([msg]) - -Verifies that all expectations of this gently instance have been satisfied. If not called manually, this method is called when the process `'exit'` event is fired. - -If `msg` is given, it will appear in any error that might be thrown. - -## License - -Gently is licensed under the MIT license. \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/example/dog.js b/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/example/dog.js deleted file mode 100644 index 022fae0..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/example/dog.js +++ /dev/null @@ -1,22 +0,0 @@ -require('../test/common'); -function Dog() {} - -Dog.prototype.seeCat = function() { - this.bark('whuf, whuf'); - this.run(); -} - -Dog.prototype.bark = function(bark) { - require('sys').puts(bark); -} - -var gently = new (require('gently')) - , assert = require('assert') - , dog = new Dog(); - -gently.expect(dog, 'bark', function(bark) { - assert.equal(bark, 'whuf, whuf'); -}); -gently.expect(dog, 'run'); - -dog.seeCat(); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/example/event_emitter.js b/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/example/event_emitter.js deleted file mode 100644 index 7def134..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/example/event_emitter.js +++ /dev/null @@ -1,11 +0,0 @@ -require('../test/common'); -var gently = new (require('gently')) - , stream = new (require('fs').WriteStream)('my_file.txt'); - -gently.expect(stream, 'emit', function(event) { - assert.equal(event, 'open'); -}); - -gently.expect(stream, 'emit', function(event) { - assert.equal(event, 'drain'); -}); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/index.js b/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/index.js deleted file mode 100644 index 69122bd..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lib/gently'); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/lib/gently/gently.js b/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/lib/gently/gently.js deleted file mode 100644 index 8af0e1e..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/lib/gently/gently.js +++ /dev/null @@ -1,184 +0,0 @@ -var path = require('path'); - -function Gently() { - this.expectations = []; - this.hijacked = {}; - - var self = this; - process.addListener('exit', function() { - self.verify('process exit'); - }); -}; -module.exports = Gently; - -Gently.prototype.stub = function(location, exportsName) { - function Stub() { - return Stub['new'].apply(this, arguments); - }; - - Stub['new'] = function () {}; - - var stubName = 'require('+JSON.stringify(location)+')'; - if (exportsName) { - stubName += '.'+exportsName; - } - - Stub.prototype.toString = Stub.toString = function() { - return stubName; - }; - - var exports = this.hijacked[location] || {}; - if (exportsName) { - exports[exportsName] = Stub; - } else { - exports = Stub; - } - - this.hijacked[location] = exports; - return Stub; -}; - -Gently.prototype.hijack = function(realRequire) { - var self = this; - return function(location) { - return self.hijacked[location] = (self.hijacked[location]) - ? self.hijacked[location] - : realRequire(location); - }; -}; - -Gently.prototype.expect = function(obj, method, count, stubFn) { - if (typeof obj != 'function' && typeof obj != 'object' && typeof obj != 'number') { - throw new Error - ( 'Bad 1st argument for gently.expect(), ' - + 'object, function, or number expected, got: '+(typeof obj) - ); - } else if (typeof obj == 'function' && (typeof method != 'string')) { - // expect(stubFn) interface - stubFn = obj; - obj = null; - method = null; - count = 1; - } else if (typeof method == 'function') { - // expect(count, stubFn) interface - count = obj; - stubFn = method; - obj = null; - method = null; - } else if (typeof count == 'function') { - // expect(obj, method, stubFn) interface - stubFn = count; - count = 1; - } else if (count === undefined) { - // expect(obj, method) interface - count = 1; - } - - var name = this._name(obj, method, stubFn); - this.expectations.push({obj: obj, method: method, stubFn: stubFn, name: name, count: count}); - - var self = this; - function delegate() { - return self._stubFn(this, obj, method, name, Array.prototype.slice.call(arguments)); - } - - if (!obj) { - return delegate; - } - - var original = (obj[method]) - ? obj[method]._original || obj[method] - : undefined; - - obj[method] = delegate; - return obj[method]._original = original; -}; - -Gently.prototype.restore = function(obj, method) { - if (!obj[method] || !obj[method]._original) { - throw new Error(this._name(obj, method)+' is not gently stubbed'); - } - obj[method] = obj[method]._original; -}; - -Gently.prototype.verify = function(msg) { - if (!this.expectations.length) { - return; - } - - var validExpectations = []; - for (var i = 0, l = this.expectations.length; i < l; i++) { - var expectation = this.expectations[i]; - - if (expectation.count > 0) { - validExpectations.push(expectation); - } - } - - this.expectations = []; // reset so that no duplicate verification attempts are made - - if (!validExpectations.length) { - return; - } - - var expectation = validExpectations[0]; - - throw new Error - ( 'Expected call to '+expectation.name+' did not happen' - + ( (msg) - ? ' ('+msg+')' - : '' - ) - ); -}; - -Gently.prototype._stubFn = function(self, obj, method, name, args) { - var expectation = this.expectations[0], obj, method; - - if (!expectation) { - throw new Error('Unexpected call to '+name+', no call was expected'); - } - - if (expectation.obj !== obj || expectation.method !== method) { - throw new Error('Unexpected call to '+name+', expected call to '+ expectation.name); - } - - expectation.count -= 1; - if (expectation.count === 0) { - this.expectations.shift(); - - // autorestore original if its not a closure - // and no more expectations on that object - var has_more_expectations = this.expectations.reduce(function (memo, expectation) { - return memo || (expectation.obj === obj && expectation.method === method); - }, false); - if (obj !== null && method !== null && !has_more_expectations) { - if (typeof obj[method]._original !== 'undefined') { - obj[method] = obj[method]._original; - delete obj[method]._original; - } else { - delete obj[method]; - } - } - } - - if (expectation.stubFn) { - return expectation.stubFn.apply(self, args); - } -}; - -Gently.prototype._name = function(obj, method, stubFn) { - if (obj) { - var objectName = obj.toString(); - if (objectName == '[object Object]' && obj.constructor.name) { - objectName = '['+obj.constructor.name+']'; - } - return (objectName)+'.'+method+'()'; - } - - if (stubFn.name) { - return stubFn.name+'()'; - } - - return '>> '+stubFn.toString()+' <<'; -}; diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/lib/gently/index.js b/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/lib/gently/index.js deleted file mode 100644 index 64c1977..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/lib/gently/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./gently'); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/package.json b/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/package.json deleted file mode 100644 index 9c1b7a0..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "gently", - "version": "0.9.2", - "directories": { - "lib": "./lib/gently" - }, - "main": "./lib/gently/index", - "dependencies": {}, - "devDependencies": {}, - "engines": { - "node": "*" - }, - "optionalDependencies": {} -} diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/test/common.js b/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/test/common.js deleted file mode 100644 index 978b5c5..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/test/common.js +++ /dev/null @@ -1,8 +0,0 @@ -var path = require('path') - , sys = require('sys'); - -require.paths.unshift(path.dirname(__dirname)+'/lib'); - -global.puts = sys.puts; -global.p = function() {sys.error(sys.inspect.apply(null, arguments))};; -global.assert = require('assert'); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/test/simple/test-gently.js b/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/test/simple/test-gently.js deleted file mode 100644 index 4f8fe2d..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/test/simple/test-gently.js +++ /dev/null @@ -1,348 +0,0 @@ -require('../common'); -var Gently = require('gently') - , gently; - -function test(test) { - process.removeAllListeners('exit'); - gently = new Gently(); - test(); -} - -test(function constructor() { - assert.deepEqual(gently.expectations, []); - assert.deepEqual(gently.hijacked, {}); - assert.equal(gently.constructor.name, 'Gently'); -}); - -test(function expectBadArgs() { - var BAD_ARG = 'oh no'; - try { - gently.expect(BAD_ARG); - assert.ok(false, 'throw needs to happen'); - } catch (e) { - assert.equal(e.message, 'Bad 1st argument for gently.expect(), object, function, or number expected, got: '+(typeof BAD_ARG)); - } -}); - -test(function expectObjMethod() { - var OBJ = {}, NAME = 'foobar'; - OBJ.foo = function(x) { - return x; - }; - - gently._name = function() { - return NAME; - }; - - var original = OBJ.foo - , stubFn = function() {}; - - (function testAddOne() { - assert.strictEqual(gently.expect(OBJ, 'foo', stubFn), original); - - assert.equal(gently.expectations.length, 1); - var expectation = gently.expectations[0]; - assert.strictEqual(expectation.obj, OBJ); - assert.strictEqual(expectation.method, 'foo'); - assert.strictEqual(expectation.stubFn, stubFn); - assert.strictEqual(expectation.name, NAME); - assert.strictEqual(OBJ.foo._original, original); - })(); - - (function testAddTwo() { - gently.expect(OBJ, 'foo', 2, stubFn); - assert.equal(gently.expectations.length, 2); - assert.strictEqual(OBJ.foo._original, original); - })(); - - (function testAddOneWithoutMock() { - gently.expect(OBJ, 'foo'); - assert.equal(gently.expectations.length, 3); - })(); - - var stubFnCalled = 0, SELF = {}; - gently._stubFn = function(self, obj, method, name, args) { - stubFnCalled++; - assert.strictEqual(self, SELF); - assert.strictEqual(obj, OBJ); - assert.strictEqual(method, 'foo'); - assert.strictEqual(name, NAME); - assert.deepEqual(args, [1, 2]); - return 23; - }; - assert.equal(OBJ.foo.apply(SELF, [1, 2]), 23); - assert.equal(stubFnCalled, 1); -}); - -test(function expectClosure() { - var NAME = 'MY CLOSURE'; - function closureFn() {}; - - gently._name = function() { - return NAME; - }; - - var fn = gently.expect(closureFn); - assert.equal(gently.expectations.length, 1); - var expectation = gently.expectations[0]; - assert.strictEqual(expectation.obj, null); - assert.strictEqual(expectation.method, null); - assert.strictEqual(expectation.stubFn, closureFn); - assert.strictEqual(expectation.name, NAME); - - var stubFnCalled = 0, SELF = {}; - gently._stubFn = function(self, obj, method, name, args) { - stubFnCalled++; - assert.strictEqual(self, SELF); - assert.strictEqual(obj, null); - assert.strictEqual(method, null); - assert.strictEqual(name, NAME); - assert.deepEqual(args, [1, 2]); - return 23; - }; - assert.equal(fn.apply(SELF, [1, 2]), 23); - assert.equal(stubFnCalled, 1); -}); - -test(function expectClosureCount() { - var stubFnCalled = 0; - function closureFn() {stubFnCalled++}; - - var fn = gently.expect(2, closureFn); - assert.equal(gently.expectations.length, 1); - fn(); - assert.equal(gently.expectations.length, 1); - fn(); - assert.equal(stubFnCalled, 2); -}); - -test(function restore() { - var OBJ = {}, NAME = '[my object].myFn()'; - OBJ.foo = function(x) { - return x; - }; - - gently._name = function() { - return NAME; - }; - - var original = OBJ.foo; - gently.expect(OBJ, 'foo'); - gently.restore(OBJ, 'foo'); - assert.strictEqual(OBJ.foo, original); - - (function testError() { - try { - gently.restore(OBJ, 'foo'); - assert.ok(false, 'throw needs to happen'); - } catch (e) { - assert.equal(e.message, NAME+' is not gently stubbed'); - } - })(); -}); - -test(function _stubFn() { - var OBJ1 = {toString: function() {return '[OBJ 1]'}} - , OBJ2 = {toString: function() {return '[OBJ 2]'}, foo: function () {return 'bar';}} - , SELF = {}; - - gently.expect(OBJ1, 'foo', function(x) { - assert.strictEqual(this, SELF); - return x * 2; - }); - - assert.equal(gently._stubFn(SELF, OBJ1, 'foo', 'dummy_name', [5]), 10); - - (function testAutorestore() { - assert.equal(OBJ2.foo(), 'bar'); - - gently.expect(OBJ2, 'foo', function() { - return 'stubbed foo'; - }); - - gently.expect(OBJ2, 'foo', function() { - return "didn't restore yet"; - }); - - assert.equal(gently._stubFn(SELF, OBJ2, 'foo', 'dummy_name', []), 'stubbed foo'); - assert.equal(gently._stubFn(SELF, OBJ2, 'foo', 'dummy_name', []), "didn't restore yet"); - assert.equal(OBJ2.foo(), 'bar'); - assert.deepEqual(gently.expectations, []); - })(); - - (function testNoMoreCallExpected() { - try { - gently._stubFn(SELF, OBJ1, 'foo', 'dummy_name', [5]); - assert.ok(false, 'throw needs to happen'); - } catch (e) { - assert.equal(e.message, 'Unexpected call to dummy_name, no call was expected'); - } - })(); - - (function testDifferentCallExpected() { - gently.expect(OBJ2, 'bar'); - try { - gently._stubFn(SELF, OBJ1, 'foo', 'dummy_name', [5]); - assert.ok(false, 'throw needs to happen'); - } catch (e) { - assert.equal(e.message, 'Unexpected call to dummy_name, expected call to '+gently._name(OBJ2, 'bar')); - } - - assert.equal(gently.expectations.length, 1); - })(); - - (function testNoMockCallback() { - OBJ2.bar(); - assert.equal(gently.expectations.length, 0); - })(); -}); - -test(function stub() { - var LOCATION = './my_class'; - - (function testRegular() { - var Stub = gently.stub(LOCATION); - assert.ok(Stub instanceof Function); - assert.strictEqual(gently.hijacked[LOCATION], Stub); - assert.ok(Stub['new'] instanceof Function); - assert.equal(Stub.toString(), 'require('+JSON.stringify(LOCATION)+')'); - - (function testConstructor() { - var newCalled = 0 - , STUB - , ARGS = ['foo', 'bar']; - - Stub['new'] = function(a, b) { - assert.equal(a, ARGS[0]); - assert.equal(b, ARGS[1]); - newCalled++; - STUB = this; - }; - - var stub = new Stub(ARGS[0], ARGS[1]); - assert.strictEqual(stub, STUB); - assert.equal(newCalled, 1); - assert.equal(stub.toString(), 'require('+JSON.stringify(LOCATION)+')'); - })(); - - (function testUseReturnValueAsInstance() { - var R = {}; - - Stub['new'] = function() { - return R; - }; - - var stub = new Stub(); - assert.strictEqual(stub, R); - - })(); - })(); - - var EXPORTS_NAME = 'MyClass'; - test(function testExportsName() { - var Stub = gently.stub(LOCATION, EXPORTS_NAME); - assert.strictEqual(gently.hijacked[LOCATION][EXPORTS_NAME], Stub); - assert.equal(Stub.toString(), 'require('+JSON.stringify(LOCATION)+').'+EXPORTS_NAME); - - (function testConstructor() { - var stub = new Stub(); - assert.equal(Stub.toString(), 'require('+JSON.stringify(LOCATION)+').'+EXPORTS_NAME); - })(); - }); -}); - -test(function hijack() { - var LOCATION = './foo' - , REQUIRE_CALLS = 0 - , EXPORTS = {} - , REQUIRE = function() { - REQUIRE_CALLS++; - return EXPORTS; - }; - - var hijackedRequire = gently.hijack(REQUIRE); - hijackedRequire(LOCATION); - assert.strictEqual(gently.hijacked[LOCATION], EXPORTS); - - assert.equal(REQUIRE_CALLS, 1); - - // make sure we are caching the hijacked module - hijackedRequire(LOCATION); - assert.equal(REQUIRE_CALLS, 1); -}); - -test(function verify() { - var OBJ = {toString: function() {return '[OBJ]'}}; - gently.verify(); - - gently.expect(OBJ, 'foo'); - try { - gently.verify(); - assert.ok(false, 'throw needs to happen'); - } catch (e) { - assert.equal(e.message, 'Expected call to [OBJ].foo() did not happen'); - } - - try { - gently.verify('foo'); - assert.ok(false, 'throw needs to happen'); - } catch (e) { - assert.equal(e.message, 'Expected call to [OBJ].foo() did not happen (foo)'); - } -}); - -test(function processExit() { - var verifyCalled = 0; - gently.verify = function(msg) { - verifyCalled++; - assert.equal(msg, 'process exit'); - }; - - process.emit('exit'); - assert.equal(verifyCalled, 1); -}); - -test(function _name() { - (function testNamedClass() { - function Foo() {}; - var foo = new Foo(); - assert.equal(gently._name(foo, 'bar'), '[Foo].bar()'); - })(); - - (function testToStringPreference() { - function Foo() {}; - Foo.prototype.toString = function() { - return '[Superman 123]'; - }; - var foo = new Foo(); - assert.equal(gently._name(foo, 'bar'), '[Superman 123].bar()'); - })(); - - (function testUnamedClass() { - var Foo = function() {}; - var foo = new Foo(); - assert.equal(gently._name(foo, 'bar'), foo.toString()+'.bar()'); - })(); - - (function testNamedClosure() { - function myClosure() {}; - assert.equal(gently._name(null, null, myClosure), myClosure.name+'()'); - })(); - - (function testUnamedClosure() { - var myClosure = function() {2+2 == 5}; - assert.equal(gently._name(null, null, myClosure), '>> '+myClosure.toString()+' <<'); - })(); -}); - -test(function verifyExpectNone() { - var OBJ = {toString: function() {return '[OBJ]'}}; - gently.verify(); - - gently.expect(OBJ, 'foo', 0); - try { - gently.verify(); - } catch (e) { - assert.fail('Exception should not have been thrown'); - } -}); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/package.json b/node_modules/express/node_modules/connect/node_modules/formidable/package.json deleted file mode 100644 index 6d368f3..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "formidable", - "version": "1.0.11", - "dependencies": {}, - "devDependencies": { - "gently": "0.8.0", - "findit": "0.1.1", - "hashish": "0.0.4", - "urun": "0.0.4", - "utest": "0.0.3" - }, - "directories": { - "lib": "./lib" - }, - "main": "./lib/index", - "scripts": { - "test": "make test" - }, - "engines": { - "node": "*" - }, - "optionalDependencies": {}, - "readme": "# Formidable\n\n[![Build Status](https://secure.travis-ci.org/felixge/node-formidable.png?branch=master)](http://travis-ci.org/felixge/node-formidable)\n\n## Purpose\n\nA node.js module for parsing form data, especially file uploads.\n\n## Current status\n\nThis module was developed for [Transloadit](http://transloadit.com/), a service focused on uploading\nand encoding images and videos. It has been battle-tested against hundreds of GB of file uploads from\na large variety of clients and is considered production-ready.\n\n## Features\n\n* Fast (~500mb/sec), non-buffering multipart parser\n* Automatically writing file uploads to disk\n* Low memory footprint\n* Graceful error handling\n* Very high test coverage\n\n## Changelog\n\n### v1.0.9\n\n* Emit progress when content length header parsed (Tim Koschützki)\n* Fix Readme syntax due to GitHub changes (goob)\n* Replace references to old 'sys' module in Readme with 'util' (Peter Sugihara)\n\n### v1.0.8\n\n* Strip potentially unsafe characters when using `keepExtensions: true`.\n* Switch to utest / urun for testing\n* Add travis build\n\n### v1.0.7\n\n* Remove file from package that was causing problems when installing on windows. (#102)\n* Fix typos in Readme (Jason Davies).\n\n### v1.0.6\n\n* Do not default to the default to the field name for file uploads where\n filename=\"\".\n\n### v1.0.5\n\n* Support filename=\"\" in multipart parts\n* Explain unexpected end() errors in parser better\n\n**Note:** Starting with this version, formidable emits 'file' events for empty\nfile input fields. Previously those were incorrectly emitted as regular file\ninput fields with value = \"\".\n\n### v1.0.4\n\n* Detect a good default tmp directory regardless of platform. (#88)\n\n### v1.0.3\n\n* Fix problems with utf8 characters (#84) / semicolons in filenames (#58)\n* Small performance improvements\n* New test suite and fixture system\n\n### v1.0.2\n\n* Exclude node\\_modules folder from git\n* Implement new `'aborted'` event\n* Fix files in example folder to work with recent node versions\n* Make gently a devDependency\n\n[See Commits](https://github.com/felixge/node-formidable/compare/v1.0.1...v1.0.2)\n\n### v1.0.1\n\n* Fix package.json to refer to proper main directory. (#68, Dean Landolt)\n\n[See Commits](https://github.com/felixge/node-formidable/compare/v1.0.0...v1.0.1)\n\n### v1.0.0\n\n* Add support for multipart boundaries that are quoted strings. (Jeff Craig)\n\nThis marks the beginning of development on version 2.0 which will include\nseveral architectural improvements.\n\n[See Commits](https://github.com/felixge/node-formidable/compare/v0.9.11...v1.0.0)\n\n### v0.9.11\n\n* Emit `'progress'` event when receiving data, regardless of parsing it. (Tim Koschützki)\n* Use [W3C FileAPI Draft](http://dev.w3.org/2006/webapi/FileAPI/) properties for File class\n\n**Important:** The old property names of the File class will be removed in a\nfuture release.\n\n[See Commits](https://github.com/felixge/node-formidable/compare/v0.9.10...v0.9.11)\n\n### Older releases\n\nThese releases were done before starting to maintain the above Changelog:\n\n* [v0.9.10](https://github.com/felixge/node-formidable/compare/v0.9.9...v0.9.10)\n* [v0.9.9](https://github.com/felixge/node-formidable/compare/v0.9.8...v0.9.9)\n* [v0.9.8](https://github.com/felixge/node-formidable/compare/v0.9.7...v0.9.8)\n* [v0.9.7](https://github.com/felixge/node-formidable/compare/v0.9.6...v0.9.7)\n* [v0.9.6](https://github.com/felixge/node-formidable/compare/v0.9.5...v0.9.6)\n* [v0.9.5](https://github.com/felixge/node-formidable/compare/v0.9.4...v0.9.5)\n* [v0.9.4](https://github.com/felixge/node-formidable/compare/v0.9.3...v0.9.4)\n* [v0.9.3](https://github.com/felixge/node-formidable/compare/v0.9.2...v0.9.3)\n* [v0.9.2](https://github.com/felixge/node-formidable/compare/v0.9.1...v0.9.2)\n* [v0.9.1](https://github.com/felixge/node-formidable/compare/v0.9.0...v0.9.1)\n* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0)\n* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0)\n* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0)\n* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0)\n* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0)\n* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0)\n* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0)\n* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0)\n* [v0.1.0](https://github.com/felixge/node-formidable/commits/v0.1.0)\n\n## Installation\n\nVia [npm](http://github.com/isaacs/npm):\n\n npm install formidable@latest\n\nManually:\n\n git clone git://github.com/felixge/node-formidable.git formidable\n vim my.js\n # var formidable = require('./formidable');\n\nNote: Formidable requires [gently](http://github.com/felixge/node-gently) to run the unit tests, but you won't need it for just using the library.\n\n## Example\n\nParse an incoming file upload.\n\n var formidable = require('formidable'),\n http = require('http'),\n\n util = require('util');\n\n http.createServer(function(req, res) {\n if (req.url == '/upload' && req.method.toLowerCase() == 'post') {\n // parse a file upload\n var form = new formidable.IncomingForm();\n form.parse(req, function(err, fields, files) {\n res.writeHead(200, {'content-type': 'text/plain'});\n res.write('received upload:\\n\\n');\n res.end(util.inspect({fields: fields, files: files}));\n });\n return;\n }\n\n // show a file upload form\n res.writeHead(200, {'content-type': 'text/html'});\n res.end(\n '
      '+\n '
      '+\n '
      '+\n ''+\n '
      '\n );\n }).listen(80);\n\n## API\n\n### formidable.IncomingForm\n\n__new formidable.IncomingForm()__\n\nCreates a new incoming form.\n\n__incomingForm.encoding = 'utf-8'__\n\nThe encoding to use for incoming form fields.\n\n__incomingForm.uploadDir = process.env.TMP || '/tmp' || process.cwd()__\n\nThe directory for placing file uploads in. You can move them later on using\n`fs.rename()`. The default directory is picked at module load time depending on\nthe first existing directory from those listed above.\n\n__incomingForm.keepExtensions = false__\n\nIf you want the files written to `incomingForm.uploadDir` to include the extensions of the original files, set this property to `true`.\n\n__incomingForm.type__\n\nEither 'multipart' or 'urlencoded' depending on the incoming request.\n\n__incomingForm.maxFieldsSize = 2 * 1024 * 1024__\n\nLimits the amount of memory a field (not file) can allocate in bytes.\nIf this value is exceeded, an `'error'` event is emitted. The default\nsize is 2MB.\n\n__incomingForm.hash = false__\n\nIf you want checksums calculated for incoming files, set this to either `'sha1'` or `'md5'`.\n\n__incomingForm.bytesReceived__\n\nThe amount of bytes received for this form so far.\n\n__incomingForm.bytesExpected__\n\nThe expected number of bytes in this form.\n\n__incomingForm.parse(request, [cb])__\n\nParses an incoming node.js `request` containing form data. If `cb` is provided, all fields an files are collected and passed to the callback:\n\n incomingForm.parse(req, function(err, fields, files) {\n // ...\n });\n\n__incomingForm.onPart(part)__\n\nYou may overwrite this method if you are interested in directly accessing the multipart stream. Doing so will disable any `'field'` / `'file'` events processing which would occur otherwise, making you fully responsible for handling the processing.\n\n incomingForm.onPart = function(part) {\n part.addListener('data', function() {\n // ...\n });\n }\n\nIf you want to use formidable to only handle certain parts for you, you can do so:\n\n incomingForm.onPart = function(part) {\n if (!part.filename) {\n // let formidable handle all non-file parts\n incomingForm.handlePart(part);\n }\n }\n\nCheck the code in this method for further inspiration.\n\n__Event: 'progress' (bytesReceived, bytesExpected)__\n\nEmitted after each incoming chunk of data that has been parsed. Can be used to roll your own progress bar.\n\n__Event: 'field' (name, value)__\n\nEmitted whenever a field / value pair has been received.\n\n__Event: 'fileBegin' (name, file)__\n\nEmitted whenever a new file is detected in the upload stream. Use this even if\nyou want to stream the file to somewhere else while buffering the upload on\nthe file system.\n\n__Event: 'file' (name, file)__\n\nEmitted whenever a field / file pair has been received. `file` is an instance of `File`.\n\n__Event: 'error' (err)__\n\nEmitted when there is an error processing the incoming form. A request that experiences an error is automatically paused, you will have to manually call `request.resume()` if you want the request to continue firing `'data'` events.\n\n__Event: 'aborted'__\n\nEmitted when the request was aborted by the user. Right now this can be due to a 'timeout' or 'close' event on the socket. In the future there will be a separate 'timeout' event (needs a change in the node core).\n\n__Event: 'end' ()__\n\nEmitted when the entire request has been received, and all contained files have finished flushing to disk. This is a great place for you to send your response.\n\n### formidable.File\n\n__file.size = 0__\n\nThe size of the uploaded file in bytes. If the file is still being uploaded (see `'fileBegin'` event), this property says how many bytes of the file have been written to disk yet.\n\n__file.path = null__\n\nThe path this file is being written to. You can modify this in the `'fileBegin'` event in\ncase you are unhappy with the way formidable generates a temporary path for your files.\n\n__file.name = null__\n\nThe name this file had according to the uploading client.\n\n__file.type = null__\n\nThe mime type of this file, according to the uploading client.\n\n__file.lastModifiedDate = null__\n\nA date object (or `null`) containing the time this file was last written to. Mostly\nhere for compatibility with the [W3C File API Draft](http://dev.w3.org/2006/webapi/FileAPI/).\n\n__file.hash = null__\n\nIf hash calculation was set, you can read the hex digest out of this var.\n\n## License\n\nFormidable is licensed under the MIT license.\n\n## Ports\n\n* [multipart-parser](http://github.com/FooBarWidget/multipart-parser): a C++ parser based on formidable\n\n## Credits\n\n* [Ryan Dahl](http://twitter.com/ryah) for his work on [http-parser](http://github.com/ry/http-parser) which heavily inspired multipart_parser.js\n", - "_id": "formidable@1.0.11", - "description": "[![Build Status](https://secure.travis-ci.org/felixge/node-formidable.png?branch=master)](http://travis-ci.org/felixge/node-formidable)", - "_from": "formidable@1.0.11" -} diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/common.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/common.js deleted file mode 100644 index eb432ad..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/common.js +++ /dev/null @@ -1,19 +0,0 @@ -var mysql = require('..'); -var path = require('path'); - -var root = path.join(__dirname, '../'); -exports.dir = { - root : root, - lib : root + '/lib', - fixture : root + '/test/fixture', - tmp : root + '/test/tmp', -}; - -exports.port = 13532; - -exports.formidable = require('..'); -exports.assert = require('assert'); - -exports.require = function(lib) { - return require(exports.dir.lib + '/' + lib); -}; diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/file/funkyfilename.txt b/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/file/funkyfilename.txt deleted file mode 100644 index e7a4785..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/file/funkyfilename.txt +++ /dev/null @@ -1 +0,0 @@ -I am a text file with a funky name! diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/file/plain.txt b/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/file/plain.txt deleted file mode 100644 index 9b6903e..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/file/plain.txt +++ /dev/null @@ -1 +0,0 @@ -I am a plain text file diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/info.md b/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/info.md deleted file mode 100644 index 3c9dbe3..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/info.md +++ /dev/null @@ -1,3 +0,0 @@ -* Opera does not allow submitting this file, it shows a warning to the - user that the file could not be found instead. Tested in 9.8, 11.51 on OSX. - Reported to Opera on 08.09.2011 (tracking email DSK-346009@bugs.opera.com). diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/js/no-filename.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/js/no-filename.js deleted file mode 100644 index 0bae449..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/js/no-filename.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports['generic.http'] = [ - {type: 'file', name: 'upload', filename: '', fixture: 'plain.txt'}, -]; diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/js/special-chars-in-filename.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/js/special-chars-in-filename.js deleted file mode 100644 index eb76fdc..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/js/special-chars-in-filename.js +++ /dev/null @@ -1,21 +0,0 @@ -var properFilename = 'funkyfilename.txt'; - -function expect(filename) { - return [ - {type: 'field', name: 'title', value: 'Weird filename'}, - {type: 'file', name: 'upload', filename: filename, fixture: properFilename}, - ]; -}; - -var webkit = " ? % * | \" < > . ? ; ' @ # $ ^ & ( ) - _ = + { } [ ] ` ~.txt"; -var ffOrIe = " ? % * | \" < > . ☃ ; ' @ # $ ^ & ( ) - _ = + { } [ ] ` ~.txt"; - -module.exports = { - 'osx-chrome-13.http' : expect(webkit), - 'osx-firefox-3.6.http' : expect(ffOrIe), - 'osx-safari-5.http' : expect(webkit), - 'xp-chrome-12.http' : expect(webkit), - 'xp-ie-7.http' : expect(ffOrIe), - 'xp-ie-8.http' : expect(ffOrIe), - 'xp-safari-5.http' : expect(webkit), -}; diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/multipart.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/multipart.js deleted file mode 100644 index a476169..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/multipart.js +++ /dev/null @@ -1,72 +0,0 @@ -exports['rfc1867'] = - { boundary: 'AaB03x', - raw: - '--AaB03x\r\n'+ - 'content-disposition: form-data; name="field1"\r\n'+ - '\r\n'+ - 'Joe Blow\r\nalmost tricked you!\r\n'+ - '--AaB03x\r\n'+ - 'content-disposition: form-data; name="pics"; filename="file1.txt"\r\n'+ - 'Content-Type: text/plain\r\n'+ - '\r\n'+ - '... contents of file1.txt ...\r\r\n'+ - '--AaB03x--\r\n', - parts: - [ { headers: { - 'content-disposition': 'form-data; name="field1"', - }, - data: 'Joe Blow\r\nalmost tricked you!', - }, - { headers: { - 'content-disposition': 'form-data; name="pics"; filename="file1.txt"', - 'Content-Type': 'text/plain', - }, - data: '... contents of file1.txt ...\r', - } - ] - }; - -exports['noTrailing\r\n'] = - { boundary: 'AaB03x', - raw: - '--AaB03x\r\n'+ - 'content-disposition: form-data; name="field1"\r\n'+ - '\r\n'+ - 'Joe Blow\r\nalmost tricked you!\r\n'+ - '--AaB03x\r\n'+ - 'content-disposition: form-data; name="pics"; filename="file1.txt"\r\n'+ - 'Content-Type: text/plain\r\n'+ - '\r\n'+ - '... contents of file1.txt ...\r\r\n'+ - '--AaB03x--', - parts: - [ { headers: { - 'content-disposition': 'form-data; name="field1"', - }, - data: 'Joe Blow\r\nalmost tricked you!', - }, - { headers: { - 'content-disposition': 'form-data; name="pics"; filename="file1.txt"', - 'Content-Type': 'text/plain', - }, - data: '... contents of file1.txt ...\r', - } - ] - }; - -exports['emptyHeader'] = - { boundary: 'AaB03x', - raw: - '--AaB03x\r\n'+ - 'content-disposition: form-data; name="field1"\r\n'+ - ': foo\r\n'+ - '\r\n'+ - 'Joe Blow\r\nalmost tricked you!\r\n'+ - '--AaB03x\r\n'+ - 'content-disposition: form-data; name="pics"; filename="file1.txt"\r\n'+ - 'Content-Type: text/plain\r\n'+ - '\r\n'+ - '... contents of file1.txt ...\r\r\n'+ - '--AaB03x--\r\n', - expectError: true, - }; diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/integration/test-fixtures.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/integration/test-fixtures.js deleted file mode 100644 index 66ad259..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/integration/test-fixtures.js +++ /dev/null @@ -1,89 +0,0 @@ -var hashish = require('hashish'); -var fs = require('fs'); -var findit = require('findit'); -var path = require('path'); -var http = require('http'); -var net = require('net'); -var assert = require('assert'); - -var common = require('../common'); -var formidable = common.formidable; - -var server = http.createServer(); -server.listen(common.port, findFixtures); - -function findFixtures() { - var fixtures = []; - findit - .sync(common.dir.fixture + '/js') - .forEach(function(jsPath) { - if (!/\.js$/.test(jsPath)) return; - - var group = path.basename(jsPath, '.js'); - hashish.forEach(require(jsPath), function(fixture, name) { - fixtures.push({ - name : group + '/' + name, - fixture : fixture, - }); - }); - }); - - testNext(fixtures); -} - -function testNext(fixtures) { - var fixture = fixtures.shift(); - if (!fixture) return server.close(); - - var name = fixture.name; - var fixture = fixture.fixture; - - uploadFixture(name, function(err, parts) { - if (err) throw err; - - fixture.forEach(function(expectedPart, i) { - var parsedPart = parts[i]; - assert.equal(parsedPart.type, expectedPart.type); - assert.equal(parsedPart.name, expectedPart.name); - - if (parsedPart.type === 'file') { - var filename = parsedPart.value.name; - assert.equal(filename, expectedPart.filename); - } - }); - - testNext(fixtures); - }); -}; - -function uploadFixture(name, cb) { - server.once('request', function(req, res) { - var form = new formidable.IncomingForm(); - form.uploadDir = common.dir.tmp; - form.parse(req); - - function callback() { - var realCallback = cb; - cb = function() {}; - realCallback.apply(null, arguments); - } - - var parts = []; - form - .on('error', callback) - .on('fileBegin', function(name, value) { - parts.push({type: 'file', name: name, value: value}); - }) - .on('field', function(name, value) { - parts.push({type: 'field', name: name, value: value}); - }) - .on('end', function() { - callback(null, parts); - }); - }); - - var socket = net.createConnection(common.port); - var file = fs.createReadStream(common.dir.fixture + '/http/' + name); - - file.pipe(socket); -} diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/common.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/common.js deleted file mode 100644 index 2b98598..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/common.js +++ /dev/null @@ -1,24 +0,0 @@ -var path = require('path'), - fs = require('fs'); - -try { - global.Gently = require('gently'); -} catch (e) { - throw new Error('this test suite requires node-gently'); -} - -exports.lib = path.join(__dirname, '../../lib'); - -global.GENTLY = new Gently(); - -global.assert = require('assert'); -global.TEST_PORT = 13532; -global.TEST_FIXTURES = path.join(__dirname, '../fixture'); -global.TEST_TMP = path.join(__dirname, '../tmp'); - -// Stupid new feature in node that complains about gently attaching too many -// listeners to process 'exit'. This is a workaround until I can think of a -// better way to deal with this. -if (process.setMaxListeners) { - process.setMaxListeners(10000); -} diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/integration/test-multipart-parser.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/integration/test-multipart-parser.js deleted file mode 100644 index 75232aa..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/integration/test-multipart-parser.js +++ /dev/null @@ -1,80 +0,0 @@ -var common = require('../common'); -var CHUNK_LENGTH = 10, - multipartParser = require(common.lib + '/multipart_parser'), - MultipartParser = multipartParser.MultipartParser, - parser = new MultipartParser(), - fixtures = require(TEST_FIXTURES + '/multipart'), - Buffer = require('buffer').Buffer; - -Object.keys(fixtures).forEach(function(name) { - var fixture = fixtures[name], - buffer = new Buffer(Buffer.byteLength(fixture.raw, 'binary')), - offset = 0, - chunk, - nparsed, - - parts = [], - part = null, - headerField, - headerValue, - endCalled = ''; - - parser.initWithBoundary(fixture.boundary); - parser.onPartBegin = function() { - part = {headers: {}, data: ''}; - parts.push(part); - headerField = ''; - headerValue = ''; - }; - - parser.onHeaderField = function(b, start, end) { - headerField += b.toString('ascii', start, end); - }; - - parser.onHeaderValue = function(b, start, end) { - headerValue += b.toString('ascii', start, end); - } - - parser.onHeaderEnd = function() { - part.headers[headerField] = headerValue; - headerField = ''; - headerValue = ''; - }; - - parser.onPartData = function(b, start, end) { - var str = b.toString('ascii', start, end); - part.data += b.slice(start, end); - } - - parser.onEnd = function() { - endCalled = true; - } - - buffer.write(fixture.raw, 'binary', 0); - - while (offset < buffer.length) { - if (offset + CHUNK_LENGTH < buffer.length) { - chunk = buffer.slice(offset, offset+CHUNK_LENGTH); - } else { - chunk = buffer.slice(offset, buffer.length); - } - offset = offset + CHUNK_LENGTH; - - nparsed = parser.write(chunk); - if (nparsed != chunk.length) { - if (fixture.expectError) { - return; - } - puts('-- ERROR --'); - p(chunk.toString('ascii')); - throw new Error(chunk.length+' bytes written, but only '+nparsed+' bytes parsed!'); - } - } - - if (fixture.expectError) { - throw new Error('expected parse error did not happen'); - } - - assert.ok(endCalled); - assert.deepEqual(parts, fixture.parts); -}); diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-file.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-file.js deleted file mode 100644 index 52ceedb..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-file.js +++ /dev/null @@ -1,104 +0,0 @@ -var common = require('../common'); -var WriteStreamStub = GENTLY.stub('fs', 'WriteStream'); - -var File = require(common.lib + '/file'), - EventEmitter = require('events').EventEmitter, - file, - gently; - -function test(test) { - gently = new Gently(); - file = new File(); - test(); - gently.verify(test.name); -} - -test(function constructor() { - assert.ok(file instanceof EventEmitter); - assert.strictEqual(file.size, 0); - assert.strictEqual(file.path, null); - assert.strictEqual(file.name, null); - assert.strictEqual(file.type, null); - assert.strictEqual(file.lastModifiedDate, null); - - assert.strictEqual(file._writeStream, null); - - (function testSetProperties() { - var file2 = new File({foo: 'bar'}); - assert.equal(file2.foo, 'bar'); - })(); -}); - -test(function open() { - var WRITE_STREAM; - file.path = '/foo'; - - gently.expect(WriteStreamStub, 'new', function (path) { - WRITE_STREAM = this; - assert.strictEqual(path, file.path); - }); - - file.open(); - assert.strictEqual(file._writeStream, WRITE_STREAM); -}); - -test(function write() { - var BUFFER = {length: 10}, - CB_STUB, - CB = function() { - CB_STUB.apply(this, arguments); - }; - - file._writeStream = {}; - - gently.expect(file._writeStream, 'write', function (buffer, cb) { - assert.strictEqual(buffer, BUFFER); - - gently.expect(file, 'emit', function (event, bytesWritten) { - assert.ok(file.lastModifiedDate instanceof Date); - assert.equal(event, 'progress'); - assert.equal(bytesWritten, file.size); - }); - - CB_STUB = gently.expect(function writeCb() { - assert.equal(file.size, 10); - }); - - cb(); - - gently.expect(file, 'emit', function (event, bytesWritten) { - assert.equal(event, 'progress'); - assert.equal(bytesWritten, file.size); - }); - - CB_STUB = gently.expect(function writeCb() { - assert.equal(file.size, 20); - }); - - cb(); - }); - - file.write(BUFFER, CB); -}); - -test(function end() { - var CB_STUB, - CB = function() { - CB_STUB.apply(this, arguments); - }; - - file._writeStream = {}; - - gently.expect(file._writeStream, 'end', function (cb) { - gently.expect(file, 'emit', function (event) { - assert.equal(event, 'end'); - }); - - CB_STUB = gently.expect(function endCb() { - }); - - cb(); - }); - - file.end(CB); -}); diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-incoming-form.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-incoming-form.js deleted file mode 100644 index 84de439..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-incoming-form.js +++ /dev/null @@ -1,727 +0,0 @@ -var common = require('../common'); -var MultipartParserStub = GENTLY.stub('./multipart_parser', 'MultipartParser'), - QuerystringParserStub = GENTLY.stub('./querystring_parser', 'QuerystringParser'), - EventEmitterStub = GENTLY.stub('events', 'EventEmitter'), - StreamStub = GENTLY.stub('stream', 'Stream'), - FileStub = GENTLY.stub('./file'); - -var formidable = require(common.lib + '/index'), - IncomingForm = formidable.IncomingForm, - events = require('events'), - fs = require('fs'), - path = require('path'), - Buffer = require('buffer').Buffer, - fixtures = require(TEST_FIXTURES + '/multipart'), - form, - gently; - -function test(test) { - gently = new Gently(); - gently.expect(EventEmitterStub, 'call'); - form = new IncomingForm(); - test(); - gently.verify(test.name); -} - -test(function constructor() { - assert.strictEqual(form.error, null); - assert.strictEqual(form.ended, false); - assert.strictEqual(form.type, null); - assert.strictEqual(form.headers, null); - assert.strictEqual(form.keepExtensions, false); - assert.strictEqual(form.uploadDir, '/tmp'); - assert.strictEqual(form.encoding, 'utf-8'); - assert.strictEqual(form.bytesReceived, null); - assert.strictEqual(form.bytesExpected, null); - assert.strictEqual(form.maxFieldsSize, 2 * 1024 * 1024); - assert.strictEqual(form._parser, null); - assert.strictEqual(form._flushing, 0); - assert.strictEqual(form._fieldsSize, 0); - assert.ok(form instanceof EventEmitterStub); - assert.equal(form.constructor.name, 'IncomingForm'); - - (function testSimpleConstructor() { - gently.expect(EventEmitterStub, 'call'); - var form = IncomingForm(); - assert.ok(form instanceof IncomingForm); - })(); - - (function testSimpleConstructorShortcut() { - gently.expect(EventEmitterStub, 'call'); - var form = formidable(); - assert.ok(form instanceof IncomingForm); - })(); -}); - -test(function parse() { - var REQ = {headers: {}} - , emit = {}; - - gently.expect(form, 'writeHeaders', function(headers) { - assert.strictEqual(headers, REQ.headers); - }); - - var events = ['error', 'aborted', 'data', 'end']; - gently.expect(REQ, 'on', events.length, function(event, fn) { - assert.equal(event, events.shift()); - emit[event] = fn; - return this; - }); - - form.parse(REQ); - - (function testPause() { - gently.expect(REQ, 'pause'); - assert.strictEqual(form.pause(), true); - })(); - - (function testPauseCriticalException() { - form.ended = false; - - var ERR = new Error('dasdsa'); - gently.expect(REQ, 'pause', function() { - throw ERR; - }); - - gently.expect(form, '_error', function(err) { - assert.strictEqual(err, ERR); - }); - - assert.strictEqual(form.pause(), false); - })(); - - (function testPauseHarmlessException() { - form.ended = true; - - var ERR = new Error('dasdsa'); - gently.expect(REQ, 'pause', function() { - throw ERR; - }); - - assert.strictEqual(form.pause(), false); - })(); - - (function testResume() { - gently.expect(REQ, 'resume'); - assert.strictEqual(form.resume(), true); - })(); - - (function testResumeCriticalException() { - form.ended = false; - - var ERR = new Error('dasdsa'); - gently.expect(REQ, 'resume', function() { - throw ERR; - }); - - gently.expect(form, '_error', function(err) { - assert.strictEqual(err, ERR); - }); - - assert.strictEqual(form.resume(), false); - })(); - - (function testResumeHarmlessException() { - form.ended = true; - - var ERR = new Error('dasdsa'); - gently.expect(REQ, 'resume', function() { - throw ERR; - }); - - assert.strictEqual(form.resume(), false); - })(); - - (function testEmitError() { - var ERR = new Error('something bad happened'); - gently.expect(form, '_error',function(err) { - assert.strictEqual(err, ERR); - }); - emit.error(ERR); - })(); - - (function testEmitAborted() { - gently.expect(form, 'emit',function(event) { - assert.equal(event, 'aborted'); - }); - - emit.aborted(); - })(); - - - (function testEmitData() { - var BUFFER = [1, 2, 3]; - gently.expect(form, 'write', function(buffer) { - assert.strictEqual(buffer, BUFFER); - }); - emit.data(BUFFER); - })(); - - (function testEmitEnd() { - form._parser = {}; - - (function testWithError() { - var ERR = new Error('haha'); - gently.expect(form._parser, 'end', function() { - return ERR; - }); - - gently.expect(form, '_error', function(err) { - assert.strictEqual(err, ERR); - }); - - emit.end(); - })(); - - (function testWithoutError() { - gently.expect(form._parser, 'end'); - emit.end(); - })(); - - (function testAfterError() { - form.error = true; - emit.end(); - })(); - })(); - - (function testWithCallback() { - gently.expect(EventEmitterStub, 'call'); - var form = new IncomingForm(), - REQ = {headers: {}}, - parseCalled = 0; - - gently.expect(form, 'writeHeaders'); - gently.expect(REQ, 'on', 4, function() { - return this; - }); - - gently.expect(form, 'on', 4, function(event, fn) { - if (event == 'field') { - fn('field1', 'foo'); - fn('field1', 'bar'); - fn('field2', 'nice'); - } - - if (event == 'file') { - fn('file1', '1'); - fn('file1', '2'); - fn('file2', '3'); - } - - if (event == 'end') { - fn(); - } - return this; - }); - - form.parse(REQ, gently.expect(function parseCbOk(err, fields, files) { - assert.deepEqual(fields, {field1: 'bar', field2: 'nice'}); - assert.deepEqual(files, {file1: '2', file2: '3'}); - })); - - gently.expect(form, 'writeHeaders'); - gently.expect(REQ, 'on', 4, function() { - return this; - }); - - var ERR = new Error('test'); - gently.expect(form, 'on', 3, function(event, fn) { - if (event == 'field') { - fn('foo', 'bar'); - } - - if (event == 'error') { - fn(ERR); - gently.expect(form, 'on'); - } - return this; - }); - - form.parse(REQ, gently.expect(function parseCbErr(err, fields, files) { - assert.strictEqual(err, ERR); - assert.deepEqual(fields, {foo: 'bar'}); - })); - })(); -}); - -test(function pause() { - assert.strictEqual(form.pause(), false); -}); - -test(function resume() { - assert.strictEqual(form.resume(), false); -}); - - -test(function writeHeaders() { - var HEADERS = {}; - gently.expect(form, '_parseContentLength'); - gently.expect(form, '_parseContentType'); - - form.writeHeaders(HEADERS); - assert.strictEqual(form.headers, HEADERS); -}); - -test(function write() { - var parser = {}, - BUFFER = [1, 2, 3]; - - form._parser = parser; - form.bytesExpected = 523423; - - (function testBasic() { - gently.expect(form, 'emit', function(event, bytesReceived, bytesExpected) { - assert.equal(event, 'progress'); - assert.equal(bytesReceived, BUFFER.length); - assert.equal(bytesExpected, form.bytesExpected); - }); - - gently.expect(parser, 'write', function(buffer) { - assert.strictEqual(buffer, BUFFER); - return buffer.length; - }); - - assert.equal(form.write(BUFFER), BUFFER.length); - assert.equal(form.bytesReceived, BUFFER.length); - })(); - - (function testParserError() { - gently.expect(form, 'emit'); - - gently.expect(parser, 'write', function(buffer) { - assert.strictEqual(buffer, BUFFER); - return buffer.length - 1; - }); - - gently.expect(form, '_error', function(err) { - assert.ok(err.message.match(/parser error/i)); - }); - - assert.equal(form.write(BUFFER), BUFFER.length - 1); - assert.equal(form.bytesReceived, BUFFER.length + BUFFER.length); - })(); - - (function testUninitialized() { - delete form._parser; - - gently.expect(form, '_error', function(err) { - assert.ok(err.message.match(/unintialized parser/i)); - }); - form.write(BUFFER); - })(); -}); - -test(function parseContentType() { - var HEADERS = {}; - - form.headers = {'content-type': 'application/x-www-form-urlencoded'}; - gently.expect(form, '_initUrlencoded'); - form._parseContentType(); - - // accept anything that has 'urlencoded' in it - form.headers = {'content-type': 'broken-client/urlencoded-stupid'}; - gently.expect(form, '_initUrlencoded'); - form._parseContentType(); - - var BOUNDARY = '---------------------------57814261102167618332366269'; - form.headers = {'content-type': 'multipart/form-data; boundary='+BOUNDARY}; - - gently.expect(form, '_initMultipart', function(boundary) { - assert.equal(boundary, BOUNDARY); - }); - form._parseContentType(); - - (function testQuotedBoundary() { - form.headers = {'content-type': 'multipart/form-data; boundary="' + BOUNDARY + '"'}; - - gently.expect(form, '_initMultipart', function(boundary) { - assert.equal(boundary, BOUNDARY); - }); - form._parseContentType(); - })(); - - (function testNoBoundary() { - form.headers = {'content-type': 'multipart/form-data'}; - - gently.expect(form, '_error', function(err) { - assert.ok(err.message.match(/no multipart boundary/i)); - }); - form._parseContentType(); - })(); - - (function testNoContentType() { - form.headers = {}; - - gently.expect(form, '_error', function(err) { - assert.ok(err.message.match(/no content-type/i)); - }); - form._parseContentType(); - })(); - - (function testUnknownContentType() { - form.headers = {'content-type': 'invalid'}; - - gently.expect(form, '_error', function(err) { - assert.ok(err.message.match(/unknown content-type/i)); - }); - form._parseContentType(); - })(); -}); - -test(function parseContentLength() { - var HEADERS = {}; - - form.headers = {}; - form._parseContentLength(); - assert.strictEqual(form.bytesReceived, null); - assert.strictEqual(form.bytesExpected, null); - - form.headers['content-length'] = '8'; - gently.expect(form, 'emit', function(event, bytesReceived, bytesExpected) { - assert.equal(event, 'progress'); - assert.equal(bytesReceived, 0); - assert.equal(bytesExpected, 8); - }); - form._parseContentLength(); - assert.strictEqual(form.bytesReceived, 0); - assert.strictEqual(form.bytesExpected, 8); - - // JS can be evil, lets make sure we are not - form.headers['content-length'] = '08'; - gently.expect(form, 'emit', function(event, bytesReceived, bytesExpected) { - assert.equal(event, 'progress'); - assert.equal(bytesReceived, 0); - assert.equal(bytesExpected, 8); - }); - form._parseContentLength(); - assert.strictEqual(form.bytesExpected, 8); -}); - -test(function _initMultipart() { - var BOUNDARY = '123', - PARSER; - - gently.expect(MultipartParserStub, 'new', function() { - PARSER = this; - }); - - gently.expect(MultipartParserStub.prototype, 'initWithBoundary', function(boundary) { - assert.equal(boundary, BOUNDARY); - }); - - form._initMultipart(BOUNDARY); - assert.equal(form.type, 'multipart'); - assert.strictEqual(form._parser, PARSER); - - (function testRegularField() { - var PART; - gently.expect(StreamStub, 'new', function() { - PART = this; - }); - - gently.expect(form, 'onPart', function(part) { - assert.strictEqual(part, PART); - assert.deepEqual - ( part.headers - , { 'content-disposition': 'form-data; name="field1"' - , 'foo': 'bar' - } - ); - assert.equal(part.name, 'field1'); - - var strings = ['hello', ' world']; - gently.expect(part, 'emit', 2, function(event, b) { - assert.equal(event, 'data'); - assert.equal(b.toString(), strings.shift()); - }); - - gently.expect(part, 'emit', function(event, b) { - assert.equal(event, 'end'); - }); - }); - - PARSER.onPartBegin(); - PARSER.onHeaderField(new Buffer('content-disposition'), 0, 10); - PARSER.onHeaderField(new Buffer('content-disposition'), 10, 19); - PARSER.onHeaderValue(new Buffer('form-data; name="field1"'), 0, 14); - PARSER.onHeaderValue(new Buffer('form-data; name="field1"'), 14, 24); - PARSER.onHeaderEnd(); - PARSER.onHeaderField(new Buffer('foo'), 0, 3); - PARSER.onHeaderValue(new Buffer('bar'), 0, 3); - PARSER.onHeaderEnd(); - PARSER.onHeadersEnd(); - PARSER.onPartData(new Buffer('hello world'), 0, 5); - PARSER.onPartData(new Buffer('hello world'), 5, 11); - PARSER.onPartEnd(); - })(); - - (function testFileField() { - var PART; - gently.expect(StreamStub, 'new', function() { - PART = this; - }); - - gently.expect(form, 'onPart', function(part) { - assert.deepEqual - ( part.headers - , { 'content-disposition': 'form-data; name="field2"; filename="C:\\Documents and Settings\\IE\\Must\\Die\\Sun"et.jpg"' - , 'content-type': 'text/plain' - } - ); - assert.equal(part.name, 'field2'); - assert.equal(part.filename, 'Sun"et.jpg'); - assert.equal(part.mime, 'text/plain'); - - gently.expect(part, 'emit', function(event, b) { - assert.equal(event, 'data'); - assert.equal(b.toString(), '... contents of file1.txt ...'); - }); - - gently.expect(part, 'emit', function(event, b) { - assert.equal(event, 'end'); - }); - }); - - PARSER.onPartBegin(); - PARSER.onHeaderField(new Buffer('content-disposition'), 0, 19); - PARSER.onHeaderValue(new Buffer('form-data; name="field2"; filename="C:\\Documents and Settings\\IE\\Must\\Die\\Sun"et.jpg"'), 0, 85); - PARSER.onHeaderEnd(); - PARSER.onHeaderField(new Buffer('Content-Type'), 0, 12); - PARSER.onHeaderValue(new Buffer('text/plain'), 0, 10); - PARSER.onHeaderEnd(); - PARSER.onHeadersEnd(); - PARSER.onPartData(new Buffer('... contents of file1.txt ...'), 0, 29); - PARSER.onPartEnd(); - })(); - - (function testEnd() { - gently.expect(form, '_maybeEnd'); - PARSER.onEnd(); - assert.ok(form.ended); - })(); -}); - -test(function _fileName() { - // TODO - return; -}); - -test(function _initUrlencoded() { - var PARSER; - - gently.expect(QuerystringParserStub, 'new', function() { - PARSER = this; - }); - - form._initUrlencoded(); - assert.equal(form.type, 'urlencoded'); - assert.strictEqual(form._parser, PARSER); - - (function testOnField() { - var KEY = 'KEY', VAL = 'VAL'; - gently.expect(form, 'emit', function(field, key, val) { - assert.equal(field, 'field'); - assert.equal(key, KEY); - assert.equal(val, VAL); - }); - - PARSER.onField(KEY, VAL); - })(); - - (function testOnEnd() { - gently.expect(form, '_maybeEnd'); - - PARSER.onEnd(); - assert.equal(form.ended, true); - })(); -}); - -test(function _error() { - var ERR = new Error('bla'); - - gently.expect(form, 'pause'); - gently.expect(form, 'emit', function(event, err) { - assert.equal(event, 'error'); - assert.strictEqual(err, ERR); - }); - - form._error(ERR); - assert.strictEqual(form.error, ERR); - - // make sure _error only does its thing once - form._error(ERR); -}); - -test(function onPart() { - var PART = {}; - gently.expect(form, 'handlePart', function(part) { - assert.strictEqual(part, PART); - }); - - form.onPart(PART); -}); - -test(function handlePart() { - (function testUtf8Field() { - var PART = new events.EventEmitter(); - PART.name = 'my_field'; - - gently.expect(form, 'emit', function(event, field, value) { - assert.equal(event, 'field'); - assert.equal(field, 'my_field'); - assert.equal(value, 'hello world: €'); - }); - - form.handlePart(PART); - PART.emit('data', new Buffer('hello')); - PART.emit('data', new Buffer(' world: ')); - PART.emit('data', new Buffer([0xE2])); - PART.emit('data', new Buffer([0x82, 0xAC])); - PART.emit('end'); - })(); - - (function testBinaryField() { - var PART = new events.EventEmitter(); - PART.name = 'my_field2'; - - gently.expect(form, 'emit', function(event, field, value) { - assert.equal(event, 'field'); - assert.equal(field, 'my_field2'); - assert.equal(value, 'hello world: '+new Buffer([0xE2, 0x82, 0xAC]).toString('binary')); - }); - - form.encoding = 'binary'; - form.handlePart(PART); - PART.emit('data', new Buffer('hello')); - PART.emit('data', new Buffer(' world: ')); - PART.emit('data', new Buffer([0xE2])); - PART.emit('data', new Buffer([0x82, 0xAC])); - PART.emit('end'); - })(); - - (function testFieldSize() { - form.maxFieldsSize = 8; - var PART = new events.EventEmitter(); - PART.name = 'my_field'; - - gently.expect(form, '_error', function(err) { - assert.equal(err.message, 'maxFieldsSize exceeded, received 9 bytes of field data'); - }); - - form.handlePart(PART); - form._fieldsSize = 1; - PART.emit('data', new Buffer(7)); - PART.emit('data', new Buffer(1)); - })(); - - (function testFilePart() { - var PART = new events.EventEmitter(), - FILE = new events.EventEmitter(), - PATH = '/foo/bar'; - - PART.name = 'my_file'; - PART.filename = 'sweet.txt'; - PART.mime = 'sweet.txt'; - - gently.expect(form, '_uploadPath', function(filename) { - assert.equal(filename, PART.filename); - return PATH; - }); - - gently.expect(FileStub, 'new', function(properties) { - assert.equal(properties.path, PATH); - assert.equal(properties.name, PART.filename); - assert.equal(properties.type, PART.mime); - FILE = this; - - gently.expect(form, 'emit', function (event, field, file) { - assert.equal(event, 'fileBegin'); - assert.strictEqual(field, PART.name); - assert.strictEqual(file, FILE); - }); - - gently.expect(FILE, 'open'); - }); - - form.handlePart(PART); - assert.equal(form._flushing, 1); - - var BUFFER; - gently.expect(form, 'pause'); - gently.expect(FILE, 'write', function(buffer, cb) { - assert.strictEqual(buffer, BUFFER); - gently.expect(form, 'resume'); - // @todo handle cb(new Err) - cb(); - }); - - PART.emit('data', BUFFER = new Buffer('test')); - - gently.expect(FILE, 'end', function(cb) { - gently.expect(form, 'emit', function(event, field, file) { - assert.equal(event, 'file'); - assert.strictEqual(file, FILE); - }); - - gently.expect(form, '_maybeEnd'); - - cb(); - assert.equal(form._flushing, 0); - }); - - PART.emit('end'); - })(); -}); - -test(function _uploadPath() { - (function testUniqueId() { - var UUID_A, UUID_B; - gently.expect(GENTLY.hijacked.path, 'join', function(uploadDir, uuid) { - assert.equal(uploadDir, form.uploadDir); - UUID_A = uuid; - }); - form._uploadPath(); - - gently.expect(GENTLY.hijacked.path, 'join', function(uploadDir, uuid) { - UUID_B = uuid; - }); - form._uploadPath(); - - assert.notEqual(UUID_A, UUID_B); - })(); - - (function testFileExtension() { - form.keepExtensions = true; - var FILENAME = 'foo.jpg', - EXT = '.bar'; - - gently.expect(GENTLY.hijacked.path, 'extname', function(filename) { - assert.equal(filename, FILENAME); - gently.restore(path, 'extname'); - - return EXT; - }); - - gently.expect(GENTLY.hijacked.path, 'join', function(uploadDir, name) { - assert.equal(path.extname(name), EXT); - }); - form._uploadPath(FILENAME); - })(); -}); - -test(function _maybeEnd() { - gently.expect(form, 'emit', 0); - form._maybeEnd(); - - form.ended = true; - form._flushing = 1; - form._maybeEnd(); - - gently.expect(form, 'emit', function(event) { - assert.equal(event, 'end'); - }); - - form.ended = true; - form._flushing = 0; - form._maybeEnd(); -}); diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-multipart-parser.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-multipart-parser.js deleted file mode 100644 index d8dc968..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-multipart-parser.js +++ /dev/null @@ -1,50 +0,0 @@ -var common = require('../common'); -var multipartParser = require(common.lib + '/multipart_parser'), - MultipartParser = multipartParser.MultipartParser, - events = require('events'), - Buffer = require('buffer').Buffer, - parser; - -function test(test) { - parser = new MultipartParser(); - test(); -} - -test(function constructor() { - assert.equal(parser.boundary, null); - assert.equal(parser.state, 0); - assert.equal(parser.flags, 0); - assert.equal(parser.boundaryChars, null); - assert.equal(parser.index, null); - assert.equal(parser.lookbehind, null); - assert.equal(parser.constructor.name, 'MultipartParser'); -}); - -test(function initWithBoundary() { - var boundary = 'abc'; - parser.initWithBoundary(boundary); - assert.deepEqual(Array.prototype.slice.call(parser.boundary), [13, 10, 45, 45, 97, 98, 99]); - assert.equal(parser.state, multipartParser.START); - - assert.deepEqual(parser.boundaryChars, {10: true, 13: true, 45: true, 97: true, 98: true, 99: true}); -}); - -test(function parserError() { - var boundary = 'abc', - buffer = new Buffer(5); - - parser.initWithBoundary(boundary); - buffer.write('--ad', 'ascii', 0); - assert.equal(parser.write(buffer), 3); -}); - -test(function end() { - (function testError() { - assert.equal(parser.end().message, 'MultipartParser.end(): stream ended unexpectedly: ' + parser.explain()); - })(); - - (function testRegular() { - parser.state = multipartParser.END; - assert.strictEqual(parser.end(), undefined); - })(); -}); diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-querystring-parser.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-querystring-parser.js deleted file mode 100644 index 54d3e2d..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-querystring-parser.js +++ /dev/null @@ -1,45 +0,0 @@ -var common = require('../common'); -var QuerystringParser = require(common.lib + '/querystring_parser').QuerystringParser, - Buffer = require('buffer').Buffer, - gently, - parser; - -function test(test) { - gently = new Gently(); - parser = new QuerystringParser(); - test(); - gently.verify(test.name); -} - -test(function constructor() { - assert.equal(parser.buffer, ''); - assert.equal(parser.constructor.name, 'QuerystringParser'); -}); - -test(function write() { - var a = new Buffer('a=1'); - assert.equal(parser.write(a), a.length); - - var b = new Buffer('&b=2'); - parser.write(b); - assert.equal(parser.buffer, a + b); -}); - -test(function end() { - var FIELDS = {a: ['b', {c: 'd'}], e: 'f'}; - - gently.expect(GENTLY.hijacked.querystring, 'parse', function(str) { - assert.equal(str, parser.buffer); - return FIELDS; - }); - - gently.expect(parser, 'onField', Object.keys(FIELDS).length, function(key, val) { - assert.deepEqual(FIELDS[key], val); - }); - - gently.expect(parser, 'onEnd'); - - parser.buffer = 'my buffer'; - parser.end(); - assert.equal(parser.buffer, ''); -}); diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/system/test-multi-video-upload.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/system/test-multi-video-upload.js deleted file mode 100644 index 479e46d..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/system/test-multi-video-upload.js +++ /dev/null @@ -1,75 +0,0 @@ -var common = require('../common'); -var BOUNDARY = '---------------------------10102754414578508781458777923', - FIXTURE = TEST_FIXTURES+'/multi_video.upload', - fs = require('fs'), - util = require(common.lib + '/util'), - http = require('http'), - formidable = require(common.lib + '/index'), - server = http.createServer(); - -server.on('request', function(req, res) { - var form = new formidable.IncomingForm(), - uploads = {}; - - form.uploadDir = TEST_TMP; - form.hash = 'sha1'; - form.parse(req); - - form - .on('fileBegin', function(field, file) { - assert.equal(field, 'upload'); - - var tracker = {file: file, progress: [], ended: false}; - uploads[file.filename] = tracker; - file - .on('progress', function(bytesReceived) { - tracker.progress.push(bytesReceived); - assert.equal(bytesReceived, file.length); - }) - .on('end', function() { - tracker.ended = true; - }); - }) - .on('field', function(field, value) { - assert.equal(field, 'title'); - assert.equal(value, ''); - }) - .on('file', function(field, file) { - assert.equal(field, 'upload'); - assert.strictEqual(uploads[file.filename].file, file); - }) - .on('end', function() { - assert.ok(uploads['shortest_video.flv']); - assert.ok(uploads['shortest_video.flv'].ended); - assert.ok(uploads['shortest_video.flv'].progress.length > 3); - assert.equal(uploads['shortest_video.flv'].file.hash, 'd6a17616c7143d1b1438ceeef6836d1a09186b3a'); - assert.equal(uploads['shortest_video.flv'].progress.slice(-1), uploads['shortest_video.flv'].file.length); - assert.ok(uploads['shortest_video.mp4']); - assert.ok(uploads['shortest_video.mp4'].ended); - assert.ok(uploads['shortest_video.mp4'].progress.length > 3); - assert.equal(uploads['shortest_video.mp4'].file.hash, '937dfd4db263f4887ceae19341dcc8d63bcd557f'); - - server.close(); - res.writeHead(200); - res.end('good'); - }); -}); - -server.listen(TEST_PORT, function() { - var client = http.createClient(TEST_PORT), - stat = fs.statSync(FIXTURE), - headers = { - 'content-type': 'multipart/form-data; boundary='+BOUNDARY, - 'content-length': stat.size, - } - request = client.request('POST', '/', headers), - fixture = new fs.ReadStream(FIXTURE); - - fixture - .on('data', function(b) { - request.write(b); - }) - .on('end', function() { - request.end(); - }); -}); diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/run.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/run.js deleted file mode 100755 index 50b2361..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/run.js +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env node -require('urun')(__dirname) diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/unit/test-incoming-form.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/unit/test-incoming-form.js deleted file mode 100644 index fe2ac1c..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/unit/test-incoming-form.js +++ /dev/null @@ -1,63 +0,0 @@ -var common = require('../common'); -var test = require('utest'); -var assert = common.assert; -var IncomingForm = common.require('incoming_form').IncomingForm; -var path = require('path'); - -var form; -test('IncomingForm', { - before: function() { - form = new IncomingForm(); - }, - - '#_fileName with regular characters': function() { - var filename = 'foo.txt'; - assert.equal(form._fileName(makeHeader(filename)), 'foo.txt'); - }, - - '#_fileName with unescaped quote': function() { - var filename = 'my".txt'; - assert.equal(form._fileName(makeHeader(filename)), 'my".txt'); - }, - - '#_fileName with escaped quote': function() { - var filename = 'my%22.txt'; - assert.equal(form._fileName(makeHeader(filename)), 'my".txt'); - }, - - '#_fileName with bad quote and additional sub-header': function() { - var filename = 'my".txt'; - var header = makeHeader(filename) + '; foo="bar"'; - assert.equal(form._fileName(header), filename); - }, - - '#_fileName with semicolon': function() { - var filename = 'my;.txt'; - assert.equal(form._fileName(makeHeader(filename)), 'my;.txt'); - }, - - '#_fileName with utf8 character': function() { - var filename = 'my☃.txt'; - assert.equal(form._fileName(makeHeader(filename)), 'my☃.txt'); - }, - - '#_uploadPath strips harmful characters from extension when keepExtensions': function() { - form.keepExtensions = true; - - var ext = path.extname(form._uploadPath('fine.jpg?foo=bar')); - assert.equal(ext, '.jpg'); - - var ext = path.extname(form._uploadPath('fine?foo=bar')); - assert.equal(ext, ''); - - var ext = path.extname(form._uploadPath('super.cr2+dsad')); - assert.equal(ext, '.cr2'); - - var ext = path.extname(form._uploadPath('super.bar')); - assert.equal(ext, '.bar'); - }, -}); - -function makeHeader(filename) { - return 'Content-Disposition: form-data; name="upload"; filename="' + filename + '"'; -} diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/tool/record.js b/node_modules/express/node_modules/connect/node_modules/formidable/tool/record.js deleted file mode 100644 index 9f1cef8..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/tool/record.js +++ /dev/null @@ -1,47 +0,0 @@ -var http = require('http'); -var fs = require('fs'); -var connections = 0; - -var server = http.createServer(function(req, res) { - var socket = req.socket; - console.log('Request: %s %s -> %s', req.method, req.url, socket.filename); - - req.on('end', function() { - if (req.url !== '/') { - res.end(JSON.stringify({ - method: req.method, - url: req.url, - filename: socket.filename, - })); - return; - } - - res.writeHead(200, {'content-type': 'text/html'}); - res.end( - '
      '+ - '
      '+ - '
      '+ - ''+ - '
      ' - ); - }); -}); - -server.on('connection', function(socket) { - connections++; - - socket.id = connections; - socket.filename = 'connection-' + socket.id + '.http'; - socket.file = fs.createWriteStream(socket.filename); - socket.pipe(socket.file); - - console.log('--> %s', socket.filename); - socket.on('close', function() { - console.log('<-- %s', socket.filename); - }); -}); - -var port = process.env.PORT || 8080; -server.listen(port, function() { - console.log('Recording connections on port %s', port); -}); diff --git a/node_modules/express/node_modules/connect/node_modules/pause/.npmignore b/node_modules/express/node_modules/connect/node_modules/pause/.npmignore deleted file mode 100644 index f1250e5..0000000 --- a/node_modules/express/node_modules/connect/node_modules/pause/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -support -test -examples -*.sock diff --git a/node_modules/express/node_modules/connect/node_modules/pause/History.md b/node_modules/express/node_modules/connect/node_modules/pause/History.md deleted file mode 100644 index c8aa68f..0000000 --- a/node_modules/express/node_modules/connect/node_modules/pause/History.md +++ /dev/null @@ -1,5 +0,0 @@ - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/node_modules/express/node_modules/connect/node_modules/pause/Makefile b/node_modules/express/node_modules/connect/node_modules/pause/Makefile deleted file mode 100644 index 4e9c8d3..0000000 --- a/node_modules/express/node_modules/connect/node_modules/pause/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - -test: - @./node_modules/.bin/mocha \ - --require should \ - --reporter spec - -.PHONY: test \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/pause/Readme.md b/node_modules/express/node_modules/connect/node_modules/pause/Readme.md deleted file mode 100644 index 1cdd68a..0000000 --- a/node_modules/express/node_modules/connect/node_modules/pause/Readme.md +++ /dev/null @@ -1,29 +0,0 @@ - -# pause - - Pause streams... - -## License - -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca> - -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 diff --git a/node_modules/express/node_modules/connect/node_modules/pause/index.js b/node_modules/express/node_modules/connect/node_modules/pause/index.js deleted file mode 100644 index 1b7b379..0000000 --- a/node_modules/express/node_modules/connect/node_modules/pause/index.js +++ /dev/null @@ -1,29 +0,0 @@ - -module.exports = function(obj){ - var onData - , onEnd - , events = []; - - // buffer data - obj.on('data', onData = function(data, encoding){ - events.push(['data', data, encoding]); - }); - - // buffer end - obj.on('end', onEnd = function(data, encoding){ - events.push(['end', data, encoding]); - }); - - return { - end: function(){ - obj.removeListener('data', onData); - obj.removeListener('end', onEnd); - }, - resume: function(){ - this.end(); - for (var i = 0, len = events.length; i < len; ++i) { - obj.emit.apply(obj, events[i]); - } - } - }; -}; \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/pause/package.json b/node_modules/express/node_modules/connect/node_modules/pause/package.json deleted file mode 100644 index 1b66942..0000000 --- a/node_modules/express/node_modules/connect/node_modules/pause/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "pause", - "version": "0.0.1", - "description": "Pause streams...", - "keywords": [], - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "dependencies": {}, - "devDependencies": { - "mocha": "*", - "should": "*" - }, - "main": "index", - "readme": "\n# pause\n\n Pause streams...\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", - "_id": "pause@0.0.1", - "_from": "pause@0.0.1" -} diff --git a/node_modules/express/node_modules/connect/node_modules/qs/.gitmodules b/node_modules/express/node_modules/connect/node_modules/qs/.gitmodules deleted file mode 100644 index 49e31da..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/.gitmodules +++ /dev/null @@ -1,6 +0,0 @@ -[submodule "support/expresso"] - path = support/expresso - url = git://github.com/visionmedia/expresso.git -[submodule "support/should"] - path = support/should - url = git://github.com/visionmedia/should.js.git diff --git a/node_modules/express/node_modules/connect/node_modules/qs/.npmignore b/node_modules/express/node_modules/connect/node_modules/qs/.npmignore deleted file mode 100644 index 3c3629e..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/node_modules/express/node_modules/connect/node_modules/qs/.travis.yml b/node_modules/express/node_modules/connect/node_modules/qs/.travis.yml deleted file mode 100644 index 2c0a8f6..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.6 - - 0.4 \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/qs/History.md b/node_modules/express/node_modules/connect/node_modules/qs/History.md deleted file mode 100644 index 1feef45..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/History.md +++ /dev/null @@ -1,83 +0,0 @@ - -0.5.1 / 2012-09-18 -================== - - * fix encoded `=`. Closes #43 - -0.5.0 / 2012-05-04 -================== - - * Added component support - -0.4.2 / 2012-02-08 -================== - - * Fixed: ensure objects are created when appropriate not arrays [aheckmann] - -0.4.1 / 2012-01-26 -================== - - * Fixed stringify()ing numbers. Closes #23 - -0.4.0 / 2011-11-21 -================== - - * Allow parsing of an existing object (for `bodyParser()`) [jackyz] - * Replaced expresso with mocha - -0.3.2 / 2011-11-08 -================== - - * Fixed global variable leak - -0.3.1 / 2011-08-17 -================== - - * Added `try/catch` around malformed uri components - * Add test coverage for Array native method bleed-though - -0.3.0 / 2011-07-19 -================== - - * Allow `array[index]` and `object[property]` syntaxes [Aria Stewart] - -0.2.0 / 2011-06-29 -================== - - * Added `qs.stringify()` [Cory Forsyth] - -0.1.0 / 2011-04-13 -================== - - * Added jQuery-ish array support - -0.0.7 / 2011-03-13 -================== - - * Fixed; handle empty string and `== null` in `qs.parse()` [dmit] - allows for convenient `qs.parse(url.parse(str).query)` - -0.0.6 / 2011-02-14 -================== - - * Fixed; support for implicit arrays - -0.0.4 / 2011-02-09 -================== - - * Fixed `+` as a space - -0.0.3 / 2011-02-08 -================== - - * Fixed case when right-hand value contains "]" - -0.0.2 / 2011-02-07 -================== - - * Fixed "=" presence in key - -0.0.1 / 2011-02-07 -================== - - * Initial release \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/qs/Makefile b/node_modules/express/node_modules/connect/node_modules/qs/Makefile deleted file mode 100644 index 0a21cf7..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/Makefile +++ /dev/null @@ -1,12 +0,0 @@ - -test/browser/qs.js: querystring.js - component build package.json test/browser/qs - -querystring.js: lib/head.js lib/querystring.js lib/tail.js - cat $^ > $@ - -test: - @./node_modules/.bin/mocha \ - --ui bdd - -.PHONY: test \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/qs/Readme.md b/node_modules/express/node_modules/connect/node_modules/qs/Readme.md deleted file mode 100644 index 27e54a4..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/Readme.md +++ /dev/null @@ -1,58 +0,0 @@ -# node-querystring - - query string parser for node and the browser supporting nesting, as it was removed from `0.3.x`, so this library provides the previous and commonly desired behaviour (and twice as fast). Used by [express](http://expressjs.com), [connect](http://senchalabs.github.com/connect) and others. - -## Installation - - $ npm install qs - -## Examples - -```js -var qs = require('qs'); - -qs.parse('user[name][first]=Tobi&user[email]=tobi@learnboost.com'); -// => { user: { name: { first: 'Tobi' }, email: 'tobi@learnboost.com' } } - -qs.stringify({ user: { name: 'Tobi', email: 'tobi@learnboost.com' }}) -// => user[name]=Tobi&user[email]=tobi%40learnboost.com -``` - -## Testing - -Install dev dependencies: - - $ npm install -d - -and execute: - - $ make test - -browser: - - $ open test/browser/index.html - -## License - -(The MIT License) - -Copyright (c) 2010 TJ Holowaychuk <tj@vision-media.ca> - -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 diff --git a/node_modules/express/node_modules/connect/node_modules/qs/benchmark.js b/node_modules/express/node_modules/connect/node_modules/qs/benchmark.js deleted file mode 100644 index 97e2c93..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/benchmark.js +++ /dev/null @@ -1,17 +0,0 @@ - -var qs = require('./'); - -var times = 100000 - , start = new Date - , n = times; - -console.log('times: %d', times); - -while (n--) qs.parse('foo=bar'); -console.log('simple: %dms', new Date - start); - -var start = new Date - , n = times; - -while (n--) qs.parse('user[name][first]=tj&user[name][last]=holowaychuk'); -console.log('nested: %dms', new Date - start); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/qs/component.json b/node_modules/express/node_modules/connect/node_modules/qs/component.json deleted file mode 100644 index ba34ead..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/component.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "querystring", - "description": "Querystring parser / stringifier with nesting support", - "keywords": ["querystring", "query", "parser"], - "main": "lib/querystring.js" -} \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/qs/examples.js b/node_modules/express/node_modules/connect/node_modules/qs/examples.js deleted file mode 100644 index 27617b7..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/examples.js +++ /dev/null @@ -1,51 +0,0 @@ - -/** - * Module dependencies. - */ - -var qs = require('./'); - -var obj = qs.parse('foo'); -console.log(obj) - -var obj = qs.parse('foo=bar=baz'); -console.log(obj) - -var obj = qs.parse('users[]'); -console.log(obj) - -var obj = qs.parse('name=tj&email=tj@vision-media.ca'); -console.log(obj) - -var obj = qs.parse('users[]=tj&users[]=tobi&users[]=jane'); -console.log(obj) - -var obj = qs.parse('user[name][first]=tj&user[name][last]=holowaychuk'); -console.log(obj) - -var obj = qs.parse('users[][name][first]=tj&users[][name][last]=holowaychuk'); -console.log(obj) - -var obj = qs.parse('a=a&a=b&a=c'); -console.log(obj) - -var obj = qs.parse('user[tj]=tj&user[tj]=TJ'); -console.log(obj) - -var obj = qs.parse('user[names]=tj&user[names]=TJ&user[names]=Tyler'); -console.log(obj) - -var obj = qs.parse('user[name][first]=tj&user[name][first]=TJ'); -console.log(obj) - -var obj = qs.parse('user[0]=tj&user[1]=TJ'); -console.log(obj) - -var obj = qs.parse('user[0]=tj&user[]=TJ'); -console.log(obj) - -var obj = qs.parse('user[0]=tj&user[foo]=TJ'); -console.log(obj) - -var str = qs.stringify({ user: { name: 'Tobi', email: 'tobi@learnboost.com' }}); -console.log(str); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/qs/index.js b/node_modules/express/node_modules/connect/node_modules/qs/index.js deleted file mode 100644 index d177d20..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/index.js +++ /dev/null @@ -1,2 +0,0 @@ - -module.exports = require('./lib/querystring'); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/qs/lib/head.js b/node_modules/express/node_modules/connect/node_modules/qs/lib/head.js deleted file mode 100644 index 55d3817..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/lib/head.js +++ /dev/null @@ -1 +0,0 @@ -;(function(){ diff --git a/node_modules/express/node_modules/connect/node_modules/qs/lib/querystring.js b/node_modules/express/node_modules/connect/node_modules/qs/lib/querystring.js deleted file mode 100644 index d3689bb..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/lib/querystring.js +++ /dev/null @@ -1,262 +0,0 @@ - -/** - * Object#toString() ref for stringify(). - */ - -var toString = Object.prototype.toString; - -/** - * Cache non-integer test regexp. - */ - -var isint = /^[0-9]+$/; - -function promote(parent, key) { - if (parent[key].length == 0) return parent[key] = {}; - var t = {}; - for (var i in parent[key]) t[i] = parent[key][i]; - parent[key] = t; - return t; -} - -function parse(parts, parent, key, val) { - var part = parts.shift(); - // end - if (!part) { - if (Array.isArray(parent[key])) { - parent[key].push(val); - } else if ('object' == typeof parent[key]) { - parent[key] = val; - } else if ('undefined' == typeof parent[key]) { - parent[key] = val; - } else { - parent[key] = [parent[key], val]; - } - // array - } else { - var obj = parent[key] = parent[key] || []; - if (']' == part) { - if (Array.isArray(obj)) { - if ('' != val) obj.push(val); - } else if ('object' == typeof obj) { - obj[Object.keys(obj).length] = val; - } else { - obj = parent[key] = [parent[key], val]; - } - // prop - } else if (~part.indexOf(']')) { - part = part.substr(0, part.length - 1); - if (!isint.test(part) && Array.isArray(obj)) obj = promote(parent, key); - parse(parts, obj, part, val); - // key - } else { - if (!isint.test(part) && Array.isArray(obj)) obj = promote(parent, key); - parse(parts, obj, part, val); - } - } -} - -/** - * Merge parent key/val pair. - */ - -function merge(parent, key, val){ - if (~key.indexOf(']')) { - var parts = key.split('[') - , len = parts.length - , last = len - 1; - parse(parts, parent, 'base', val); - // optimize - } else { - if (!isint.test(key) && Array.isArray(parent.base)) { - var t = {}; - for (var k in parent.base) t[k] = parent.base[k]; - parent.base = t; - } - set(parent.base, key, val); - } - - return parent; -} - -/** - * Parse the given obj. - */ - -function parseObject(obj){ - var ret = { base: {} }; - Object.keys(obj).forEach(function(name){ - merge(ret, name, obj[name]); - }); - return ret.base; -} - -/** - * Parse the given str. - */ - -function parseString(str){ - return String(str) - .split('&') - .reduce(function(ret, pair){ - var eql = pair.indexOf('=') - , brace = lastBraceInKey(pair) - , key = pair.substr(0, brace || eql) - , val = pair.substr(brace || eql, pair.length) - , val = val.substr(val.indexOf('=') + 1, val.length); - - // ?foo - if ('' == key) key = pair, val = ''; - - return merge(ret, decode(key), decode(val)); - }, { base: {} }).base; -} - -/** - * Parse the given query `str` or `obj`, returning an object. - * - * @param {String} str | {Object} obj - * @return {Object} - * @api public - */ - -exports.parse = function(str){ - if (null == str || '' == str) return {}; - return 'object' == typeof str - ? parseObject(str) - : parseString(str); -}; - -/** - * Turn the given `obj` into a query string - * - * @param {Object} obj - * @return {String} - * @api public - */ - -var stringify = exports.stringify = function(obj, prefix) { - if (Array.isArray(obj)) { - return stringifyArray(obj, prefix); - } else if ('[object Object]' == toString.call(obj)) { - return stringifyObject(obj, prefix); - } else if ('string' == typeof obj) { - return stringifyString(obj, prefix); - } else { - return prefix + '=' + obj; - } -}; - -/** - * Stringify the given `str`. - * - * @param {String} str - * @param {String} prefix - * @return {String} - * @api private - */ - -function stringifyString(str, prefix) { - if (!prefix) throw new TypeError('stringify expects an object'); - return prefix + '=' + encodeURIComponent(str); -} - -/** - * Stringify the given `arr`. - * - * @param {Array} arr - * @param {String} prefix - * @return {String} - * @api private - */ - -function stringifyArray(arr, prefix) { - var ret = []; - if (!prefix) throw new TypeError('stringify expects an object'); - for (var i = 0; i < arr.length; i++) { - ret.push(stringify(arr[i], prefix + '['+i+']')); - } - return ret.join('&'); -} - -/** - * Stringify the given `obj`. - * - * @param {Object} obj - * @param {String} prefix - * @return {String} - * @api private - */ - -function stringifyObject(obj, prefix) { - var ret = [] - , keys = Object.keys(obj) - , key; - - for (var i = 0, len = keys.length; i < len; ++i) { - key = keys[i]; - ret.push(stringify(obj[key], prefix - ? prefix + '[' + encodeURIComponent(key) + ']' - : encodeURIComponent(key))); - } - - return ret.join('&'); -} - -/** - * Set `obj`'s `key` to `val` respecting - * the weird and wonderful syntax of a qs, - * where "foo=bar&foo=baz" becomes an array. - * - * @param {Object} obj - * @param {String} key - * @param {String} val - * @api private - */ - -function set(obj, key, val) { - var v = obj[key]; - if (undefined === v) { - obj[key] = val; - } else if (Array.isArray(v)) { - v.push(val); - } else { - obj[key] = [v, val]; - } -} - -/** - * Locate last brace in `str` within the key. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function lastBraceInKey(str) { - var len = str.length - , brace - , c; - for (var i = 0; i < len; ++i) { - c = str[i]; - if (']' == c) brace = false; - if ('[' == c) brace = true; - if ('=' == c && !brace) return i; - } -} - -/** - * Decode `str`. - * - * @param {String} str - * @return {String} - * @api private - */ - -function decode(str) { - try { - return decodeURIComponent(str.replace(/\+/g, ' ')); - } catch (err) { - return str; - } -} diff --git a/node_modules/express/node_modules/connect/node_modules/qs/lib/tail.js b/node_modules/express/node_modules/connect/node_modules/qs/lib/tail.js deleted file mode 100644 index 158693a..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/lib/tail.js +++ /dev/null @@ -1 +0,0 @@ -})(); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/qs/package.json b/node_modules/express/node_modules/connect/node_modules/qs/package.json deleted file mode 100644 index ebf4cc3..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "qs", - "description": "querystring parser", - "version": "0.5.1", - "keywords": [ - "query string", - "parser", - "component" - ], - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/node-querystring.git" - }, - "devDependencies": { - "mocha": "*", - "expect.js": "*" - }, - "component": { - "scripts": { - "querystring": "querystring.js" - } - }, - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - }, - "main": "index", - "engines": { - "node": "*" - }, - "readme": "# node-querystring\n\n query string parser for node and the browser supporting nesting, as it was removed from `0.3.x`, so this library provides the previous and commonly desired behaviour (and twice as fast). Used by [express](http://expressjs.com), [connect](http://senchalabs.github.com/connect) and others.\n\n## Installation\n\n $ npm install qs\n\n## Examples\n\n```js\nvar qs = require('qs');\n\nqs.parse('user[name][first]=Tobi&user[email]=tobi@learnboost.com');\n// => { user: { name: { first: 'Tobi' }, email: 'tobi@learnboost.com' } }\n\nqs.stringify({ user: { name: 'Tobi', email: 'tobi@learnboost.com' }})\n// => user[name]=Tobi&user[email]=tobi%40learnboost.com\n```\n\n## Testing\n\nInstall dev dependencies:\n\n $ npm install -d\n\nand execute:\n\n $ make test\n\nbrowser:\n\n $ open test/browser/index.html\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2010 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", - "_id": "qs@0.5.1", - "_from": "qs@0.5.1" -} diff --git a/node_modules/express/node_modules/connect/node_modules/qs/querystring.js b/node_modules/express/node_modules/connect/node_modules/qs/querystring.js deleted file mode 100644 index 7466b06..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/querystring.js +++ /dev/null @@ -1,254 +0,0 @@ -;(function(){ - -/** - * Object#toString() ref for stringify(). - */ - -var toString = Object.prototype.toString; - -/** - * Cache non-integer test regexp. - */ - -var isint = /^[0-9]+$/; - -function promote(parent, key) { - if (parent[key].length == 0) return parent[key] = {}; - var t = {}; - for (var i in parent[key]) t[i] = parent[key][i]; - parent[key] = t; - return t; -} - -function parse(parts, parent, key, val) { - var part = parts.shift(); - // end - if (!part) { - if (Array.isArray(parent[key])) { - parent[key].push(val); - } else if ('object' == typeof parent[key]) { - parent[key] = val; - } else if ('undefined' == typeof parent[key]) { - parent[key] = val; - } else { - parent[key] = [parent[key], val]; - } - // array - } else { - var obj = parent[key] = parent[key] || []; - if (']' == part) { - if (Array.isArray(obj)) { - if ('' != val) obj.push(val); - } else if ('object' == typeof obj) { - obj[Object.keys(obj).length] = val; - } else { - obj = parent[key] = [parent[key], val]; - } - // prop - } else if (~part.indexOf(']')) { - part = part.substr(0, part.length - 1); - if (!isint.test(part) && Array.isArray(obj)) obj = promote(parent, key); - parse(parts, obj, part, val); - // key - } else { - if (!isint.test(part) && Array.isArray(obj)) obj = promote(parent, key); - parse(parts, obj, part, val); - } - } -} - -/** - * Merge parent key/val pair. - */ - -function merge(parent, key, val){ - if (~key.indexOf(']')) { - var parts = key.split('[') - , len = parts.length - , last = len - 1; - parse(parts, parent, 'base', val); - // optimize - } else { - if (!isint.test(key) && Array.isArray(parent.base)) { - var t = {}; - for (var k in parent.base) t[k] = parent.base[k]; - parent.base = t; - } - set(parent.base, key, val); - } - - return parent; -} - -/** - * Parse the given obj. - */ - -function parseObject(obj){ - var ret = { base: {} }; - Object.keys(obj).forEach(function(name){ - merge(ret, name, obj[name]); - }); - return ret.base; -} - -/** - * Parse the given str. - */ - -function parseString(str){ - return String(str) - .split('&') - .reduce(function(ret, pair){ - try{ - pair = decodeURIComponent(pair.replace(/\+/g, ' ')); - } catch(e) { - // ignore - } - - var eql = pair.indexOf('=') - , brace = lastBraceInKey(pair) - , key = pair.substr(0, brace || eql) - , val = pair.substr(brace || eql, pair.length) - , val = val.substr(val.indexOf('=') + 1, val.length); - - // ?foo - if ('' == key) key = pair, val = ''; - - return merge(ret, key, val); - }, { base: {} }).base; -} - -/** - * Parse the given query `str` or `obj`, returning an object. - * - * @param {String} str | {Object} obj - * @return {Object} - * @api public - */ - -exports.parse = function(str){ - if (null == str || '' == str) return {}; - return 'object' == typeof str - ? parseObject(str) - : parseString(str); -}; - -/** - * Turn the given `obj` into a query string - * - * @param {Object} obj - * @return {String} - * @api public - */ - -var stringify = exports.stringify = function(obj, prefix) { - if (Array.isArray(obj)) { - return stringifyArray(obj, prefix); - } else if ('[object Object]' == toString.call(obj)) { - return stringifyObject(obj, prefix); - } else if ('string' == typeof obj) { - return stringifyString(obj, prefix); - } else { - return prefix + '=' + obj; - } -}; - -/** - * Stringify the given `str`. - * - * @param {String} str - * @param {String} prefix - * @return {String} - * @api private - */ - -function stringifyString(str, prefix) { - if (!prefix) throw new TypeError('stringify expects an object'); - return prefix + '=' + encodeURIComponent(str); -} - -/** - * Stringify the given `arr`. - * - * @param {Array} arr - * @param {String} prefix - * @return {String} - * @api private - */ - -function stringifyArray(arr, prefix) { - var ret = []; - if (!prefix) throw new TypeError('stringify expects an object'); - for (var i = 0; i < arr.length; i++) { - ret.push(stringify(arr[i], prefix + '['+i+']')); - } - return ret.join('&'); -} - -/** - * Stringify the given `obj`. - * - * @param {Object} obj - * @param {String} prefix - * @return {String} - * @api private - */ - -function stringifyObject(obj, prefix) { - var ret = [] - , keys = Object.keys(obj) - , key; - - for (var i = 0, len = keys.length; i < len; ++i) { - key = keys[i]; - ret.push(stringify(obj[key], prefix - ? prefix + '[' + encodeURIComponent(key) + ']' - : encodeURIComponent(key))); - } - - return ret.join('&'); -} - -/** - * Set `obj`'s `key` to `val` respecting - * the weird and wonderful syntax of a qs, - * where "foo=bar&foo=baz" becomes an array. - * - * @param {Object} obj - * @param {String} key - * @param {String} val - * @api private - */ - -function set(obj, key, val) { - var v = obj[key]; - if (undefined === v) { - obj[key] = val; - } else if (Array.isArray(v)) { - v.push(val); - } else { - obj[key] = [v, val]; - } -} - -/** - * Locate last brace in `str` within the key. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function lastBraceInKey(str) { - var len = str.length - , brace - , c; - for (var i = 0; i < len; ++i) { - c = str[i]; - if (']' == c) brace = false; - if ('[' == c) brace = true; - if ('=' == c && !brace) return i; - } -} -})(); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/qs/test/browser/expect.js b/node_modules/express/node_modules/connect/node_modules/qs/test/browser/expect.js deleted file mode 100644 index 76aa4e8..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/test/browser/expect.js +++ /dev/null @@ -1,1202 +0,0 @@ - -(function (global, module) { - - if ('undefined' == typeof module) { - var module = { exports: {} } - , exports = module.exports - } - - /** - * Exports. - */ - - module.exports = expect; - expect.Assertion = Assertion; - - /** - * Exports version. - */ - - expect.version = '0.1.2'; - - /** - * Possible assertion flags. - */ - - var flags = { - not: ['to', 'be', 'have', 'include', 'only'] - , to: ['be', 'have', 'include', 'only', 'not'] - , only: ['have'] - , have: ['own'] - , be: ['an'] - }; - - function expect (obj) { - return new Assertion(obj); - } - - /** - * Constructor - * - * @api private - */ - - function Assertion (obj, flag, parent) { - this.obj = obj; - this.flags = {}; - - if (undefined != parent) { - this.flags[flag] = true; - - for (var i in parent.flags) { - if (parent.flags.hasOwnProperty(i)) { - this.flags[i] = true; - } - } - } - - var $flags = flag ? flags[flag] : keys(flags) - , self = this - - if ($flags) { - for (var i = 0, l = $flags.length; i < l; i++) { - // avoid recursion - if (this.flags[$flags[i]]) continue; - - var name = $flags[i] - , assertion = new Assertion(this.obj, name, this) - - if ('function' == typeof Assertion.prototype[name]) { - // clone the function, make sure we dont touch the prot reference - var old = this[name]; - this[name] = function () { - return old.apply(self, arguments); - } - - for (var fn in Assertion.prototype) { - if (Assertion.prototype.hasOwnProperty(fn) && fn != name) { - this[name][fn] = bind(assertion[fn], assertion); - } - } - } else { - this[name] = assertion; - } - } - } - }; - - /** - * Performs an assertion - * - * @api private - */ - - Assertion.prototype.assert = function (truth, msg, error) { - var msg = this.flags.not ? error : msg - , ok = this.flags.not ? !truth : truth; - - if (!ok) { - throw new Error(msg); - } - - this.and = new Assertion(this.obj); - }; - - /** - * Check if the value is truthy - * - * @api public - */ - - Assertion.prototype.ok = function () { - this.assert( - !!this.obj - , 'expected ' + i(this.obj) + ' to be truthy' - , 'expected ' + i(this.obj) + ' to be falsy'); - }; - - /** - * Assert that the function throws. - * - * @param {Function|RegExp} callback, or regexp to match error string against - * @api public - */ - - Assertion.prototype.throwError = - Assertion.prototype.throwException = function (fn) { - expect(this.obj).to.be.a('function'); - - var thrown = false - , not = this.flags.not - - try { - this.obj(); - } catch (e) { - if ('function' == typeof fn) { - fn(e); - } else if ('object' == typeof fn) { - var subject = 'string' == typeof e ? e : e.message; - if (not) { - expect(subject).to.not.match(fn); - } else { - expect(subject).to.match(fn); - } - } - thrown = true; - } - - if ('object' == typeof fn && not) { - // in the presence of a matcher, ensure the `not` only applies to - // the matching. - this.flags.not = false; - } - - var name = this.obj.name || 'fn'; - this.assert( - thrown - , 'expected ' + name + ' to throw an exception' - , 'expected ' + name + ' not to throw an exception'); - }; - - /** - * Checks if the array is empty. - * - * @api public - */ - - Assertion.prototype.empty = function () { - var expectation; - - if ('object' == typeof this.obj && null !== this.obj && !isArray(this.obj)) { - if ('number' == typeof this.obj.length) { - expectation = !this.obj.length; - } else { - expectation = !keys(this.obj).length; - } - } else { - if ('string' != typeof this.obj) { - expect(this.obj).to.be.an('object'); - } - - expect(this.obj).to.have.property('length'); - expectation = !this.obj.length; - } - - this.assert( - expectation - , 'expected ' + i(this.obj) + ' to be empty' - , 'expected ' + i(this.obj) + ' to not be empty'); - return this; - }; - - /** - * Checks if the obj exactly equals another. - * - * @api public - */ - - Assertion.prototype.be = - Assertion.prototype.equal = function (obj) { - this.assert( - obj === this.obj - , 'expected ' + i(this.obj) + ' to equal ' + i(obj) - , 'expected ' + i(this.obj) + ' to not equal ' + i(obj)); - return this; - }; - - /** - * Checks if the obj sortof equals another. - * - * @api public - */ - - Assertion.prototype.eql = function (obj) { - this.assert( - expect.eql(obj, this.obj) - , 'expected ' + i(this.obj) + ' to sort of equal ' + i(obj) - , 'expected ' + i(this.obj) + ' to sort of not equal ' + i(obj)); - return this; - }; - - /** - * Assert within start to finish (inclusive). - * - * @param {Number} start - * @param {Number} finish - * @api public - */ - - Assertion.prototype.within = function (start, finish) { - var range = start + '..' + finish; - this.assert( - this.obj >= start && this.obj <= finish - , 'expected ' + i(this.obj) + ' to be within ' + range - , 'expected ' + i(this.obj) + ' to not be within ' + range); - return this; - }; - - /** - * Assert typeof / instance of - * - * @api public - */ - - Assertion.prototype.a = - Assertion.prototype.an = function (type) { - if ('string' == typeof type) { - // proper english in error msg - var n = /^[aeiou]/.test(type) ? 'n' : ''; - - // typeof with support for 'array' - this.assert( - 'array' == type ? isArray(this.obj) : - 'object' == type - ? 'object' == typeof this.obj && null !== this.obj - : type == typeof this.obj - , 'expected ' + i(this.obj) + ' to be a' + n + ' ' + type - , 'expected ' + i(this.obj) + ' not to be a' + n + ' ' + type); - } else { - // instanceof - var name = type.name || 'supplied constructor'; - this.assert( - this.obj instanceof type - , 'expected ' + i(this.obj) + ' to be an instance of ' + name - , 'expected ' + i(this.obj) + ' not to be an instance of ' + name); - } - - return this; - }; - - /** - * Assert numeric value above _n_. - * - * @param {Number} n - * @api public - */ - - Assertion.prototype.greaterThan = - Assertion.prototype.above = function (n) { - this.assert( - this.obj > n - , 'expected ' + i(this.obj) + ' to be above ' + n - , 'expected ' + i(this.obj) + ' to be below ' + n); - return this; - }; - - /** - * Assert numeric value below _n_. - * - * @param {Number} n - * @api public - */ - - Assertion.prototype.lessThan = - Assertion.prototype.below = function (n) { - this.assert( - this.obj < n - , 'expected ' + i(this.obj) + ' to be below ' + n - , 'expected ' + i(this.obj) + ' to be above ' + n); - return this; - }; - - /** - * Assert string value matches _regexp_. - * - * @param {RegExp} regexp - * @api public - */ - - Assertion.prototype.match = function (regexp) { - this.assert( - regexp.exec(this.obj) - , 'expected ' + i(this.obj) + ' to match ' + regexp - , 'expected ' + i(this.obj) + ' not to match ' + regexp); - return this; - }; - - /** - * Assert property "length" exists and has value of _n_. - * - * @param {Number} n - * @api public - */ - - Assertion.prototype.length = function (n) { - expect(this.obj).to.have.property('length'); - var len = this.obj.length; - this.assert( - n == len - , 'expected ' + i(this.obj) + ' to have a length of ' + n + ' but got ' + len - , 'expected ' + i(this.obj) + ' to not have a length of ' + len); - return this; - }; - - /** - * Assert property _name_ exists, with optional _val_. - * - * @param {String} name - * @param {Mixed} val - * @api public - */ - - Assertion.prototype.property = function (name, val) { - if (this.flags.own) { - this.assert( - Object.prototype.hasOwnProperty.call(this.obj, name) - , 'expected ' + i(this.obj) + ' to have own property ' + i(name) - , 'expected ' + i(this.obj) + ' to not have own property ' + i(name)); - return this; - } - - if (this.flags.not && undefined !== val) { - if (undefined === this.obj[name]) { - throw new Error(i(this.obj) + ' has no property ' + i(name)); - } - } else { - var hasProp; - try { - hasProp = name in this.obj - } catch (e) { - hasProp = undefined !== this.obj[name] - } - - this.assert( - hasProp - , 'expected ' + i(this.obj) + ' to have a property ' + i(name) - , 'expected ' + i(this.obj) + ' to not have a property ' + i(name)); - } - - if (undefined !== val) { - this.assert( - val === this.obj[name] - , 'expected ' + i(this.obj) + ' to have a property ' + i(name) - + ' of ' + i(val) + ', but got ' + i(this.obj[name]) - , 'expected ' + i(this.obj) + ' to not have a property ' + i(name) - + ' of ' + i(val)); - } - - this.obj = this.obj[name]; - return this; - }; - - /** - * Assert that the array contains _obj_ or string contains _obj_. - * - * @param {Mixed} obj|string - * @api public - */ - - Assertion.prototype.string = - Assertion.prototype.contain = function (obj) { - if ('string' == typeof this.obj) { - this.assert( - ~this.obj.indexOf(obj) - , 'expected ' + i(this.obj) + ' to contain ' + i(obj) - , 'expected ' + i(this.obj) + ' to not contain ' + i(obj)); - } else { - this.assert( - ~indexOf(this.obj, obj) - , 'expected ' + i(this.obj) + ' to contain ' + i(obj) - , 'expected ' + i(this.obj) + ' to not contain ' + i(obj)); - } - return this; - }; - - /** - * Assert exact keys or inclusion of keys by using - * the `.own` modifier. - * - * @param {Array|String ...} keys - * @api public - */ - - Assertion.prototype.key = - Assertion.prototype.keys = function ($keys) { - var str - , ok = true; - - $keys = isArray($keys) - ? $keys - : Array.prototype.slice.call(arguments); - - if (!$keys.length) throw new Error('keys required'); - - var actual = keys(this.obj) - , len = $keys.length; - - // Inclusion - ok = every($keys, function (key) { - return ~indexOf(actual, key); - }); - - // Strict - if (!this.flags.not && this.flags.only) { - ok = ok && $keys.length == actual.length; - } - - // Key string - if (len > 1) { - $keys = map($keys, function (key) { - return i(key); - }); - var last = $keys.pop(); - str = $keys.join(', ') + ', and ' + last; - } else { - str = i($keys[0]); - } - - // Form - str = (len > 1 ? 'keys ' : 'key ') + str; - - // Have / include - str = (!this.flags.only ? 'include ' : 'only have ') + str; - - // Assertion - this.assert( - ok - , 'expected ' + i(this.obj) + ' to ' + str - , 'expected ' + i(this.obj) + ' to not ' + str); - - return this; - }; - - /** - * Function bind implementation. - */ - - function bind (fn, scope) { - return function () { - return fn.apply(scope, arguments); - } - } - - /** - * Array every compatibility - * - * @see bit.ly/5Fq1N2 - * @api public - */ - - function every (arr, fn, thisObj) { - var scope = thisObj || global; - for (var i = 0, j = arr.length; i < j; ++i) { - if (!fn.call(scope, arr[i], i, arr)) { - return false; - } - } - return true; - }; - - /** - * Array indexOf compatibility. - * - * @see bit.ly/a5Dxa2 - * @api public - */ - - function indexOf (arr, o, i) { - if (Array.prototype.indexOf) { - return Array.prototype.indexOf.call(arr, o, i); - } - - if (arr.length === undefined) { - return -1; - } - - for (var j = arr.length, i = i < 0 ? i + j < 0 ? 0 : i + j : i || 0 - ; i < j && arr[i] !== o; i++); - - return j <= i ? -1 : i; - }; - - /** - * Inspects an object. - * - * @see taken from node.js `util` module (copyright Joyent, MIT license) - * @api private - */ - - function i (obj, showHidden, depth) { - var seen = []; - - function stylize (str) { - return str; - }; - - function format (value, recurseTimes) { - // Provide a hook for user-specified inspect functions. - // Check that value is an object with an inspect function on it - if (value && typeof value.inspect === 'function' && - // Filter out the util module, it's inspect function is special - value !== exports && - // Also filter out any prototype objects using the circular check. - !(value.constructor && value.constructor.prototype === value)) { - return value.inspect(recurseTimes); - } - - // Primitive types cannot have properties - switch (typeof value) { - case 'undefined': - return stylize('undefined', 'undefined'); - - case 'string': - var simple = '\'' + json.stringify(value).replace(/^"|"$/g, '') - .replace(/'/g, "\\'") - .replace(/\\"/g, '"') + '\''; - return stylize(simple, 'string'); - - case 'number': - return stylize('' + value, 'number'); - - case 'boolean': - return stylize('' + value, 'boolean'); - } - // For some reason typeof null is "object", so special case here. - if (value === null) { - return stylize('null', 'null'); - } - - // Look up the keys of the object. - var visible_keys = keys(value); - var $keys = showHidden ? Object.getOwnPropertyNames(value) : visible_keys; - - // Functions without properties can be shortcutted. - if (typeof value === 'function' && $keys.length === 0) { - if (isRegExp(value)) { - return stylize('' + value, 'regexp'); - } else { - var name = value.name ? ': ' + value.name : ''; - return stylize('[Function' + name + ']', 'special'); - } - } - - // Dates without properties can be shortcutted - if (isDate(value) && $keys.length === 0) { - return stylize(value.toUTCString(), 'date'); - } - - var base, type, braces; - // Determine the object type - if (isArray(value)) { - type = 'Array'; - braces = ['[', ']']; - } else { - type = 'Object'; - braces = ['{', '}']; - } - - // Make functions say that they are functions - if (typeof value === 'function') { - var n = value.name ? ': ' + value.name : ''; - base = (isRegExp(value)) ? ' ' + value : ' [Function' + n + ']'; - } else { - base = ''; - } - - // Make dates with properties first say the date - if (isDate(value)) { - base = ' ' + value.toUTCString(); - } - - if ($keys.length === 0) { - return braces[0] + base + braces[1]; - } - - if (recurseTimes < 0) { - if (isRegExp(value)) { - return stylize('' + value, 'regexp'); - } else { - return stylize('[Object]', 'special'); - } - } - - seen.push(value); - - var output = map($keys, function (key) { - var name, str; - if (value.__lookupGetter__) { - if (value.__lookupGetter__(key)) { - if (value.__lookupSetter__(key)) { - str = stylize('[Getter/Setter]', 'special'); - } else { - str = stylize('[Getter]', 'special'); - } - } else { - if (value.__lookupSetter__(key)) { - str = stylize('[Setter]', 'special'); - } - } - } - if (indexOf(visible_keys, key) < 0) { - name = '[' + key + ']'; - } - if (!str) { - if (indexOf(seen, value[key]) < 0) { - if (recurseTimes === null) { - str = format(value[key]); - } else { - str = format(value[key], recurseTimes - 1); - } - if (str.indexOf('\n') > -1) { - if (isArray(value)) { - str = map(str.split('\n'), function (line) { - return ' ' + line; - }).join('\n').substr(2); - } else { - str = '\n' + map(str.split('\n'), function (line) { - return ' ' + line; - }).join('\n'); - } - } - } else { - str = stylize('[Circular]', 'special'); - } - } - if (typeof name === 'undefined') { - if (type === 'Array' && key.match(/^\d+$/)) { - return str; - } - name = json.stringify('' + key); - if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { - name = name.substr(1, name.length - 2); - name = stylize(name, 'name'); - } else { - name = name.replace(/'/g, "\\'") - .replace(/\\"/g, '"') - .replace(/(^"|"$)/g, "'"); - name = stylize(name, 'string'); - } - } - - return name + ': ' + str; - }); - - seen.pop(); - - var numLinesEst = 0; - var length = reduce(output, function (prev, cur) { - numLinesEst++; - if (indexOf(cur, '\n') >= 0) numLinesEst++; - return prev + cur.length + 1; - }, 0); - - if (length > 50) { - output = braces[0] + - (base === '' ? '' : base + '\n ') + - ' ' + - output.join(',\n ') + - ' ' + - braces[1]; - - } else { - output = braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; - } - - return output; - } - return format(obj, (typeof depth === 'undefined' ? 2 : depth)); - }; - - function isArray (ar) { - return Object.prototype.toString.call(ar) == '[object Array]'; - }; - - function isRegExp(re) { - var s = '' + re; - return re instanceof RegExp || // easy case - // duck-type for context-switching evalcx case - typeof(re) === 'function' && - re.constructor.name === 'RegExp' && - re.compile && - re.test && - re.exec && - s.match(/^\/.*\/[gim]{0,3}$/); - }; - - function isDate(d) { - if (d instanceof Date) return true; - return false; - }; - - function keys (obj) { - if (Object.keys) { - return Object.keys(obj); - } - - var keys = []; - - for (var i in obj) { - if (Object.prototype.hasOwnProperty.call(obj, i)) { - keys.push(i); - } - } - - return keys; - } - - function map (arr, mapper, that) { - if (Array.prototype.map) { - return Array.prototype.map.call(arr, mapper, that); - } - - var other= new Array(arr.length); - - for (var i= 0, n = arr.length; i= 2) { - var rv = arguments[1]; - } else { - do { - if (i in this) { - rv = this[i++]; - break; - } - - // if array contains no values, no initial value to return - if (++i >= len) - throw new TypeError(); - } while (true); - } - - for (; i < len; i++) { - if (i in this) - rv = fun.call(null, rv, this[i], i, this); - } - - return rv; - }; - - /** - * Asserts deep equality - * - * @see taken from node.js `assert` module (copyright Joyent, MIT license) - * @api private - */ - - expect.eql = function eql (actual, expected) { - // 7.1. All identical values are equivalent, as determined by ===. - if (actual === expected) { - return true; - } else if ('undefined' != typeof Buffer - && Buffer.isBuffer(actual) && Buffer.isBuffer(expected)) { - if (actual.length != expected.length) return false; - - for (var i = 0; i < actual.length; i++) { - if (actual[i] !== expected[i]) return false; - } - - return true; - - // 7.2. If the expected value is a Date object, the actual value is - // equivalent if it is also a Date object that refers to the same time. - } else if (actual instanceof Date && expected instanceof Date) { - return actual.getTime() === expected.getTime(); - - // 7.3. Other pairs that do not both pass typeof value == "object", - // equivalence is determined by ==. - } else if (typeof actual != 'object' && typeof expected != 'object') { - return actual == expected; - - // 7.4. For all other Object pairs, including Array objects, equivalence is - // determined by having the same number of owned properties (as verified - // with Object.prototype.hasOwnProperty.call), the same set of keys - // (although not necessarily the same order), equivalent values for every - // corresponding key, and an identical "prototype" property. Note: this - // accounts for both named and indexed properties on Arrays. - } else { - return objEquiv(actual, expected); - } - } - - function isUndefinedOrNull (value) { - return value === null || value === undefined; - } - - function isArguments (object) { - return Object.prototype.toString.call(object) == '[object Arguments]'; - } - - function objEquiv (a, b) { - if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) - return false; - // an identical "prototype" property. - if (a.prototype !== b.prototype) return false; - //~~~I've managed to break Object.keys through screwy arguments passing. - // Converting to array solves the problem. - if (isArguments(a)) { - if (!isArguments(b)) { - return false; - } - a = pSlice.call(a); - b = pSlice.call(b); - return expect.eql(a, b); - } - try{ - var ka = keys(a), - kb = keys(b), - key, i; - } catch (e) {//happens when one is a string literal and the other isn't - return false; - } - // having the same number of owned properties (keys incorporates hasOwnProperty) - if (ka.length != kb.length) - return false; - //the same set of keys (although not necessarily the same order), - ka.sort(); - kb.sort(); - //~~~cheap key test - for (i = ka.length - 1; i >= 0; i--) { - if (ka[i] != kb[i]) - return false; - } - //equivalent values for every corresponding key, and - //~~~possibly expensive deep test - for (i = ka.length - 1; i >= 0; i--) { - key = ka[i]; - if (!expect.eql(a[key], b[key])) - return false; - } - return true; - } - - var json = (function () { - "use strict"; - - if ('object' == typeof JSON && JSON.parse && JSON.stringify) { - return { - parse: nativeJSON.parse - , stringify: nativeJSON.stringify - } - } - - var JSON = {}; - - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - function date(d, key) { - return isFinite(d.valueOf()) ? - d.getUTCFullYear() + '-' + - f(d.getUTCMonth() + 1) + '-' + - f(d.getUTCDate()) + 'T' + - f(d.getUTCHours()) + ':' + - f(d.getUTCMinutes()) + ':' + - f(d.getUTCSeconds()) + 'Z' : null; - }; - - var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - gap, - indent, - meta = { // table of character substitutions - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '"' : '\\"', - '\\': '\\\\' - }, - rep; - - - function quote(string) { - - // If the string contains no control characters, no quote characters, and no - // backslash characters, then we can safely slap some quotes around it. - // Otherwise we must also replace the offending characters with safe escape - // sequences. - - escapable.lastIndex = 0; - return escapable.test(string) ? '"' + string.replace(escapable, function (a) { - var c = meta[a]; - return typeof c === 'string' ? c : - '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }) + '"' : '"' + string + '"'; - } - - - function str(key, holder) { - - // Produce a string from holder[key]. - - var i, // The loop counter. - k, // The member key. - v, // The member value. - length, - mind = gap, - partial, - value = holder[key]; - - // If the value has a toJSON method, call it to obtain a replacement value. - - if (value instanceof Date) { - value = date(key); - } - - // If we were called with a replacer function, then call the replacer to - // obtain a replacement value. - - if (typeof rep === 'function') { - value = rep.call(holder, key, value); - } - - // What happens next depends on the value's type. - - switch (typeof value) { - case 'string': - return quote(value); - - case 'number': - - // JSON numbers must be finite. Encode non-finite numbers as null. - - return isFinite(value) ? String(value) : 'null'; - - case 'boolean': - case 'null': - - // If the value is a boolean or null, convert it to a string. Note: - // typeof null does not produce 'null'. The case is included here in - // the remote chance that this gets fixed someday. - - return String(value); - - // If the type is 'object', we might be dealing with an object or an array or - // null. - - case 'object': - - // Due to a specification blunder in ECMAScript, typeof null is 'object', - // so watch out for that case. - - if (!value) { - return 'null'; - } - - // Make an array to hold the partial results of stringifying this object value. - - gap += indent; - partial = []; - - // Is the value an array? - - if (Object.prototype.toString.apply(value) === '[object Array]') { - - // The value is an array. Stringify every element. Use null as a placeholder - // for non-JSON values. - - length = value.length; - for (i = 0; i < length; i += 1) { - partial[i] = str(i, value) || 'null'; - } - - // Join all of the elements together, separated with commas, and wrap them in - // brackets. - - v = partial.length === 0 ? '[]' : gap ? - '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : - '[' + partial.join(',') + ']'; - gap = mind; - return v; - } - - // If the replacer is an array, use it to select the members to be stringified. - - if (rep && typeof rep === 'object') { - length = rep.length; - for (i = 0; i < length; i += 1) { - if (typeof rep[i] === 'string') { - k = rep[i]; - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } else { - - // Otherwise, iterate through all of the keys in the object. - - for (k in value) { - if (Object.prototype.hasOwnProperty.call(value, k)) { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } - - // Join all of the member texts together, separated with commas, - // and wrap them in braces. - - v = partial.length === 0 ? '{}' : gap ? - '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : - '{' + partial.join(',') + '}'; - gap = mind; - return v; - } - } - - // If the JSON object does not yet have a stringify method, give it one. - - JSON.stringify = function (value, replacer, space) { - - // The stringify method takes a value and an optional replacer, and an optional - // space parameter, and returns a JSON text. The replacer can be a function - // that can replace values, or an array of strings that will select the keys. - // A default replacer method can be provided. Use of the space parameter can - // produce text that is more easily readable. - - var i; - gap = ''; - indent = ''; - - // If the space parameter is a number, make an indent string containing that - // many spaces. - - if (typeof space === 'number') { - for (i = 0; i < space; i += 1) { - indent += ' '; - } - - // If the space parameter is a string, it will be used as the indent string. - - } else if (typeof space === 'string') { - indent = space; - } - - // If there is a replacer, it must be a function or an array. - // Otherwise, throw an error. - - rep = replacer; - if (replacer && typeof replacer !== 'function' && - (typeof replacer !== 'object' || - typeof replacer.length !== 'number')) { - throw new Error('JSON.stringify'); - } - - // Make a fake root object containing our value under the key of ''. - // Return the result of stringifying the value. - - return str('', {'': value}); - }; - - // If the JSON object does not yet have a parse method, give it one. - - JSON.parse = function (text, reviver) { - // The parse method takes a text and an optional reviver function, and returns - // a JavaScript value if the text is a valid JSON text. - - var j; - - function walk(holder, key) { - - // The walk method is used to recursively walk the resulting structure so - // that modifications can be made. - - var k, v, value = holder[key]; - if (value && typeof value === 'object') { - for (k in value) { - if (Object.prototype.hasOwnProperty.call(value, k)) { - v = walk(value, k); - if (v !== undefined) { - value[k] = v; - } else { - delete value[k]; - } - } - } - } - return reviver.call(holder, key, value); - } - - - // Parsing happens in four stages. In the first stage, we replace certain - // Unicode characters with escape sequences. JavaScript handles many characters - // incorrectly, either silently deleting them, or treating them as line endings. - - text = String(text); - cx.lastIndex = 0; - if (cx.test(text)) { - text = text.replace(cx, function (a) { - return '\\u' + - ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }); - } - - // In the second stage, we run the text against regular expressions that look - // for non-JSON patterns. We are especially concerned with '()' and 'new' - // because they can cause invocation, and '=' because it can cause mutation. - // But just to be safe, we want to reject all unexpected forms. - - // We split the second stage into 4 regexp operations in order to work around - // crippling inefficiencies in IE's and Safari's regexp engines. First we - // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we - // replace all simple value tokens with ']' characters. Third, we delete all - // open brackets that follow a colon or comma or that begin the text. Finally, - // we look to see that the remaining characters are only whitespace or ']' or - // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. - - if (/^[\],:{}\s]*$/ - .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') - .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') - .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { - - // In the third stage we use the eval function to compile the text into a - // JavaScript structure. The '{' operator is subject to a syntactic ambiguity - // in JavaScript: it can begin a block or an object literal. We wrap the text - // in parens to eliminate the ambiguity. - - j = eval('(' + text + ')'); - - // In the optional fourth stage, we recursively walk the new structure, passing - // each name/value pair to a reviver function for possible transformation. - - return typeof reviver === 'function' ? - walk({'': j}, '') : j; - } - - // If the text is not JSON parseable, then a SyntaxError is thrown. - - throw new SyntaxError('JSON.parse'); - }; - - return JSON; - })(); - - if ('undefined' != typeof window) { - window.expect = module.exports; - } - -})( - this - , 'undefined' != typeof module ? module : {} - , 'undefined' != typeof exports ? exports : {} -); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/qs/test/browser/index.html b/node_modules/express/node_modules/connect/node_modules/qs/test/browser/index.html deleted file mode 100644 index c73147a..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/test/browser/index.html +++ /dev/null @@ -1,18 +0,0 @@ - - - Mocha - - - - - - - - - - - - -
      - - diff --git a/node_modules/express/node_modules/connect/node_modules/qs/test/browser/jquery.js b/node_modules/express/node_modules/connect/node_modules/qs/test/browser/jquery.js deleted file mode 100644 index f3201aa..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/test/browser/jquery.js +++ /dev/null @@ -1,8981 +0,0 @@ -/*! - * jQuery JavaScript Library v1.6.2 - * http://jquery.com/ - * - * Copyright 2011, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Thu Jun 30 14:16:56 2011 -0400 - */ -(function( window, undefined ) { - -// Use the correct document accordingly with window argument (sandbox) -var document = window.document, - navigator = window.navigator, - location = window.location; -var jQuery = (function() { - -// Define a local copy of jQuery -var jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init( selector, context, rootjQuery ); - }, - - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - - // Map over the $ in case of overwrite - _$ = window.$, - - // A central reference to the root jQuery(document) - rootjQuery, - - // A simple way to check for HTML strings or ID strings - // (both of which we optimize for) - quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, - - // Check if a string has a non-whitespace character in it - rnotwhite = /\S/, - - // Used for trimming whitespace - trimLeft = /^\s+/, - trimRight = /\s+$/, - - // Check for digits - rdigit = /\d/, - - // Match a standalone tag - rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, - - // JSON RegExp - rvalidchars = /^[\],:{}\s]*$/, - rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, - rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, - rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, - - // Useragent RegExp - rwebkit = /(webkit)[ \/]([\w.]+)/, - ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, - rmsie = /(msie) ([\w.]+)/, - rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, - - // Matches dashed string for camelizing - rdashAlpha = /-([a-z])/ig, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }, - - // Keep a UserAgent string for use with jQuery.browser - userAgent = navigator.userAgent, - - // For matching the engine and version of the browser - browserMatch, - - // The deferred used on DOM ready - readyList, - - // The ready event handler - DOMContentLoaded, - - // Save a reference to some core methods - toString = Object.prototype.toString, - hasOwn = Object.prototype.hasOwnProperty, - push = Array.prototype.push, - slice = Array.prototype.slice, - trim = String.prototype.trim, - indexOf = Array.prototype.indexOf, - - // [[Class]] -> type pairs - class2type = {}; - -jQuery.fn = jQuery.prototype = { - constructor: jQuery, - init: function( selector, context, rootjQuery ) { - var match, elem, ret, doc; - - // Handle $(""), $(null), or $(undefined) - if ( !selector ) { - return this; - } - - // Handle $(DOMElement) - if ( selector.nodeType ) { - this.context = this[0] = selector; - this.length = 1; - return this; - } - - // The body element only exists once, optimize finding it - if ( selector === "body" && !context && document.body ) { - this.context = document; - this[0] = document.body; - this.selector = selector; - this.length = 1; - return this; - } - - // Handle HTML strings - if ( typeof selector === "string" ) { - // Are we dealing with HTML string or an ID? - if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = quickExpr.exec( selector ); - } - - // Verify a match, and that no context was specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; - doc = (context ? context.ownerDocument || context : document); - - // If a single string is passed in and it's a single tag - // just do a createElement and skip the rest - ret = rsingleTag.exec( selector ); - - if ( ret ) { - if ( jQuery.isPlainObject( context ) ) { - selector = [ document.createElement( ret[1] ) ]; - jQuery.fn.attr.call( selector, context, true ); - - } else { - selector = [ doc.createElement( ret[1] ) ]; - } - - } else { - ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); - selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes; - } - - return jQuery.merge( this, selector ); - - // HANDLE: $("#id") - } else { - elem = document.getElementById( match[2] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id !== match[2] ) { - return rootjQuery.find( selector ); - } - - // Otherwise, we inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return (context || rootjQuery).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return rootjQuery.ready( selector ); - } - - if (selector.selector !== undefined) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }, - - // Start with an empty selector - selector: "", - - // The current version of jQuery being used - jquery: "1.6.2", - - // The default length of a jQuery object is 0 - length: 0, - - // The number of elements contained in the matched element set - size: function() { - return this.length; - }, - - toArray: function() { - return slice.call( this, 0 ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num == null ? - - // Return a 'clean' array - this.toArray() : - - // Return just the object - ( num < 0 ? this[ this.length + num ] : this[ num ] ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems, name, selector ) { - // Build a new jQuery matched element set - var ret = this.constructor(); - - if ( jQuery.isArray( elems ) ) { - push.apply( ret, elems ); - - } else { - jQuery.merge( ret, elems ); - } - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - ret.context = this.context; - - if ( name === "find" ) { - ret.selector = this.selector + (this.selector ? " " : "") + selector; - } else if ( name ) { - ret.selector = this.selector + "." + name + "(" + selector + ")"; - } - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - ready: function( fn ) { - // Attach the listeners - jQuery.bindReady(); - - // Add the callback - readyList.done( fn ); - - return this; - }, - - eq: function( i ) { - return i === -1 ? - this.slice( i ) : - this.slice( i, +i + 1 ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ), - "slice", slice.call(arguments).join(",") ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function( elem, i ) { - return callback.call( elem, i, elem ); - })); - }, - - end: function() { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: [].sort, - splice: [].splice -}; - -// Give the init function the jQuery prototype for later instantiation -jQuery.fn.init.prototype = jQuery.fn; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { - target = {}; - } - - // extend jQuery itself if only one argument is passed - if ( length === i ) { - target = this; - --i; - } - - for ( ; i < length; i++ ) { - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend({ - noConflict: function( deep ) { - if ( window.$ === jQuery ) { - window.$ = _$; - } - - if ( deep && window.jQuery === jQuery ) { - window.jQuery = _jQuery; - } - - return jQuery; - }, - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - // Either a released hold or an DOMready/load event and not yet ready - if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( !document.body ) { - return setTimeout( jQuery.ready, 1 ); - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.trigger ) { - jQuery( document ).trigger( "ready" ).unbind( "ready" ); - } - } - }, - - bindReady: function() { - if ( readyList ) { - return; - } - - readyList = jQuery._Deferred(); - - // Catch cases where $(document).ready() is called after the - // browser event has already occurred. - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - return setTimeout( jQuery.ready, 1 ); - } - - // Mozilla, Opera and webkit nightlies currently support this event - if ( document.addEventListener ) { - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", jQuery.ready, false ); - - // If IE event model is used - } else if ( document.attachEvent ) { - // ensure firing before onload, - // maybe late but safe also for iframes - document.attachEvent( "onreadystatechange", DOMContentLoaded ); - - // A fallback to window.onload, that will always work - window.attachEvent( "onload", jQuery.ready ); - - // If IE and not a frame - // continually check to see if the document is ready - var toplevel = false; - - try { - toplevel = window.frameElement == null; - } catch(e) {} - - if ( document.documentElement.doScroll && toplevel ) { - doScrollCheck(); - } - } - }, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function( obj ) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray || function( obj ) { - return jQuery.type(obj) === "array"; - }, - - // A crude way of determining if an object is a window - isWindow: function( obj ) { - return obj && typeof obj === "object" && "setInterval" in obj; - }, - - isNaN: function( obj ) { - return obj == null || !rdigit.test( obj ) || isNaN( obj ); - }, - - type: function( obj ) { - return obj == null ? - String( obj ) : - class2type[ toString.call(obj) ] || "object"; - }, - - isPlainObject: function( obj ) { - // Must be an Object. - // Because of IE, we also have to check the presence of the constructor property. - // Make sure that DOM nodes and window objects don't pass through, as well - if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - // Not own constructor property must be Object - if ( obj.constructor && - !hasOwn.call(obj, "constructor") && - !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { - return false; - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - - var key; - for ( key in obj ) {} - - return key === undefined || hasOwn.call( obj, key ); - }, - - isEmptyObject: function( obj ) { - for ( var name in obj ) { - return false; - } - return true; - }, - - error: function( msg ) { - throw msg; - }, - - parseJSON: function( data ) { - if ( typeof data !== "string" || !data ) { - return null; - } - - // Make sure leading/trailing whitespace is removed (IE can't handle it) - data = jQuery.trim( data ); - - // Attempt to parse using the native JSON parser first - if ( window.JSON && window.JSON.parse ) { - return window.JSON.parse( data ); - } - - // Make sure the incoming data is actual JSON - // Logic borrowed from http://json.org/json2.js - if ( rvalidchars.test( data.replace( rvalidescape, "@" ) - .replace( rvalidtokens, "]" ) - .replace( rvalidbraces, "")) ) { - - return (new Function( "return " + data ))(); - - } - jQuery.error( "Invalid JSON: " + data ); - }, - - // Cross-browser xml parsing - // (xml & tmp used internally) - parseXML: function( data , xml , tmp ) { - - if ( window.DOMParser ) { // Standard - tmp = new DOMParser(); - xml = tmp.parseFromString( data , "text/xml" ); - } else { // IE - xml = new ActiveXObject( "Microsoft.XMLDOM" ); - xml.async = "false"; - xml.loadXML( data ); - } - - tmp = xml.documentElement; - - if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) { - jQuery.error( "Invalid XML: " + data ); - } - - return xml; - }, - - noop: function() {}, - - // Evaluates a script in a global context - // Workarounds based on findings by Jim Driscoll - // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context - globalEval: function( data ) { - if ( data && rnotwhite.test( data ) ) { - // We use execScript on Internet Explorer - // We use an anonymous function so that context is window - // rather than jQuery in Firefox - ( window.execScript || function( data ) { - window[ "eval" ].call( window, data ); - } )( data ); - } - }, - - // Converts a dashed string to camelCased string; - // Used by both the css and data modules - camelCase: function( string ) { - return string.replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); - }, - - // args is for internal usage only - each: function( object, callback, args ) { - var name, i = 0, - length = object.length, - isObj = length === undefined || jQuery.isFunction( object ); - - if ( args ) { - if ( isObj ) { - for ( name in object ) { - if ( callback.apply( object[ name ], args ) === false ) { - break; - } - } - } else { - for ( ; i < length; ) { - if ( callback.apply( object[ i++ ], args ) === false ) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if ( isObj ) { - for ( name in object ) { - if ( callback.call( object[ name ], name, object[ name ] ) === false ) { - break; - } - } - } else { - for ( ; i < length; ) { - if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { - break; - } - } - } - } - - return object; - }, - - // Use native String.trim function wherever possible - trim: trim ? - function( text ) { - return text == null ? - "" : - trim.call( text ); - } : - - // Otherwise use our own trimming functionality - function( text ) { - return text == null ? - "" : - text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); - }, - - // results is for internal usage only - makeArray: function( array, results ) { - var ret = results || []; - - if ( array != null ) { - // The window, strings (and functions) also have 'length' - // The extra typeof function check is to prevent crashes - // in Safari 2 (See: #3039) - // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 - var type = jQuery.type( array ); - - if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { - push.call( ret, array ); - } else { - jQuery.merge( ret, array ); - } - } - - return ret; - }, - - inArray: function( elem, array ) { - - if ( indexOf ) { - return indexOf.call( array, elem ); - } - - for ( var i = 0, length = array.length; i < length; i++ ) { - if ( array[ i ] === elem ) { - return i; - } - } - - return -1; - }, - - merge: function( first, second ) { - var i = first.length, - j = 0; - - if ( typeof second.length === "number" ) { - for ( var l = second.length; j < l; j++ ) { - first[ i++ ] = second[ j ]; - } - - } else { - while ( second[j] !== undefined ) { - first[ i++ ] = second[ j++ ]; - } - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, inv ) { - var ret = [], retVal; - inv = !!inv; - - // Go through the array, only saving the items - // that pass the validator function - for ( var i = 0, length = elems.length; i < length; i++ ) { - retVal = !!callback( elems[ i ], i ); - if ( inv !== retVal ) { - ret.push( elems[ i ] ); - } - } - - return ret; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var value, key, ret = [], - i = 0, - length = elems.length, - // jquery objects are treated as arrays - isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; - - // Go through the array, translating each of the items to their - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - - // Go through every key on the object, - } else { - for ( key in elems ) { - value = callback( elems[ key ], key, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - } - - // Flatten any nested arrays - return ret.concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - if ( typeof context === "string" ) { - var tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - var args = slice.call( arguments, 2 ), - proxy = function() { - return fn.apply( context, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; - - return proxy; - }, - - // Mutifunctional method to get and set values to a collection - // The value/s can optionally be executed if it's a function - access: function( elems, key, value, exec, fn, pass ) { - var length = elems.length; - - // Setting many attributes - if ( typeof key === "object" ) { - for ( var k in key ) { - jQuery.access( elems, k, key[k], exec, fn, value ); - } - return elems; - } - - // Setting one attribute - if ( value !== undefined ) { - // Optionally, function values get executed if exec is true - exec = !pass && exec && jQuery.isFunction(value); - - for ( var i = 0; i < length; i++ ) { - fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); - } - - return elems; - } - - // Getting an attribute - return length ? fn( elems[0], key ) : undefined; - }, - - now: function() { - return (new Date()).getTime(); - }, - - // Use of jQuery.browser is frowned upon. - // More details: http://docs.jquery.com/Utilities/jQuery.browser - uaMatch: function( ua ) { - ua = ua.toLowerCase(); - - var match = rwebkit.exec( ua ) || - ropera.exec( ua ) || - rmsie.exec( ua ) || - ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || - []; - - return { browser: match[1] || "", version: match[2] || "0" }; - }, - - sub: function() { - function jQuerySub( selector, context ) { - return new jQuerySub.fn.init( selector, context ); - } - jQuery.extend( true, jQuerySub, this ); - jQuerySub.superclass = this; - jQuerySub.fn = jQuerySub.prototype = this(); - jQuerySub.fn.constructor = jQuerySub; - jQuerySub.sub = this.sub; - jQuerySub.fn.init = function init( selector, context ) { - if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { - context = jQuerySub( context ); - } - - return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); - }; - jQuerySub.fn.init.prototype = jQuerySub.fn; - var rootjQuerySub = jQuerySub(document); - return jQuerySub; - }, - - browser: {} -}); - -// Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); - -browserMatch = jQuery.uaMatch( userAgent ); -if ( browserMatch.browser ) { - jQuery.browser[ browserMatch.browser ] = true; - jQuery.browser.version = browserMatch.version; -} - -// Deprecated, use jQuery.browser.webkit instead -if ( jQuery.browser.webkit ) { - jQuery.browser.safari = true; -} - -// IE doesn't match non-breaking spaces with \s -if ( rnotwhite.test( "\xA0" ) ) { - trimLeft = /^[\s\xA0]+/; - trimRight = /[\s\xA0]+$/; -} - -// All jQuery objects should point back to these -rootjQuery = jQuery(document); - -// Cleanup functions for the document ready method -if ( document.addEventListener ) { - DOMContentLoaded = function() { - document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); - jQuery.ready(); - }; - -} else if ( document.attachEvent ) { - DOMContentLoaded = function() { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( document.readyState === "complete" ) { - document.detachEvent( "onreadystatechange", DOMContentLoaded ); - jQuery.ready(); - } - }; -} - -// The DOM ready check for Internet Explorer -function doScrollCheck() { - if ( jQuery.isReady ) { - return; - } - - try { - // If IE is used, use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - document.documentElement.doScroll("left"); - } catch(e) { - setTimeout( doScrollCheck, 1 ); - return; - } - - // and execute any waiting functions - jQuery.ready(); -} - -return jQuery; - -})(); - - -var // Promise methods - promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ), - // Static reference to slice - sliceDeferred = [].slice; - -jQuery.extend({ - // Create a simple deferred (one callbacks list) - _Deferred: function() { - var // callbacks list - callbacks = [], - // stored [ context , args ] - fired, - // to avoid firing when already doing so - firing, - // flag to know if the deferred has been cancelled - cancelled, - // the deferred itself - deferred = { - - // done( f1, f2, ...) - done: function() { - if ( !cancelled ) { - var args = arguments, - i, - length, - elem, - type, - _fired; - if ( fired ) { - _fired = fired; - fired = 0; - } - for ( i = 0, length = args.length; i < length; i++ ) { - elem = args[ i ]; - type = jQuery.type( elem ); - if ( type === "array" ) { - deferred.done.apply( deferred, elem ); - } else if ( type === "function" ) { - callbacks.push( elem ); - } - } - if ( _fired ) { - deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] ); - } - } - return this; - }, - - // resolve with given context and args - resolveWith: function( context, args ) { - if ( !cancelled && !fired && !firing ) { - // make sure args are available (#8421) - args = args || []; - firing = 1; - try { - while( callbacks[ 0 ] ) { - callbacks.shift().apply( context, args ); - } - } - finally { - fired = [ context, args ]; - firing = 0; - } - } - return this; - }, - - // resolve with this as context and given arguments - resolve: function() { - deferred.resolveWith( this, arguments ); - return this; - }, - - // Has this deferred been resolved? - isResolved: function() { - return !!( firing || fired ); - }, - - // Cancel - cancel: function() { - cancelled = 1; - callbacks = []; - return this; - } - }; - - return deferred; - }, - - // Full fledged deferred (two callbacks list) - Deferred: function( func ) { - var deferred = jQuery._Deferred(), - failDeferred = jQuery._Deferred(), - promise; - // Add errorDeferred methods, then and promise - jQuery.extend( deferred, { - then: function( doneCallbacks, failCallbacks ) { - deferred.done( doneCallbacks ).fail( failCallbacks ); - return this; - }, - always: function() { - return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments ); - }, - fail: failDeferred.done, - rejectWith: failDeferred.resolveWith, - reject: failDeferred.resolve, - isRejected: failDeferred.isResolved, - pipe: function( fnDone, fnFail ) { - return jQuery.Deferred(function( newDefer ) { - jQuery.each( { - done: [ fnDone, "resolve" ], - fail: [ fnFail, "reject" ] - }, function( handler, data ) { - var fn = data[ 0 ], - action = data[ 1 ], - returned; - if ( jQuery.isFunction( fn ) ) { - deferred[ handler ](function() { - returned = fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise().then( newDefer.resolve, newDefer.reject ); - } else { - newDefer[ action ]( returned ); - } - }); - } else { - deferred[ handler ]( newDefer[ action ] ); - } - }); - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - if ( obj == null ) { - if ( promise ) { - return promise; - } - promise = obj = {}; - } - var i = promiseMethods.length; - while( i-- ) { - obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ]; - } - return obj; - } - }); - // Make sure only one callback list will be used - deferred.done( failDeferred.cancel ).fail( deferred.cancel ); - // Unexpose cancel - delete deferred.cancel; - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - return deferred; - }, - - // Deferred helper - when: function( firstParam ) { - var args = arguments, - i = 0, - length = args.length, - count = length, - deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? - firstParam : - jQuery.Deferred(); - function resolveFunc( i ) { - return function( value ) { - args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; - if ( !( --count ) ) { - // Strange bug in FF4: - // Values changed onto the arguments object sometimes end up as undefined values - // outside the $.when method. Cloning the object into a fresh array solves the issue - deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) ); - } - }; - } - if ( length > 1 ) { - for( ; i < length; i++ ) { - if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) { - args[ i ].promise().then( resolveFunc(i), deferred.reject ); - } else { - --count; - } - } - if ( !count ) { - deferred.resolveWith( deferred, args ); - } - } else if ( deferred !== firstParam ) { - deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); - } - return deferred.promise(); - } -}); - - - -jQuery.support = (function() { - - var div = document.createElement( "div" ), - documentElement = document.documentElement, - all, - a, - select, - opt, - input, - marginDiv, - support, - fragment, - body, - testElementParent, - testElement, - testElementStyle, - tds, - events, - eventName, - i, - isSupported; - - // Preliminary tests - div.setAttribute("className", "t"); - div.innerHTML = "
      a"; - - all = div.getElementsByTagName( "*" ); - a = div.getElementsByTagName( "a" )[ 0 ]; - - // Can't get basic test support - if ( !all || !all.length || !a ) { - return {}; - } - - // First batch of supports tests - select = document.createElement( "select" ); - opt = select.appendChild( document.createElement("option") ); - input = div.getElementsByTagName( "input" )[ 0 ]; - - support = { - // IE strips leading whitespace when .innerHTML is used - leadingWhitespace: ( div.firstChild.nodeType === 3 ), - - // Make sure that tbody elements aren't automatically inserted - // IE will insert them into empty tables - tbody: !div.getElementsByTagName( "tbody" ).length, - - // Make sure that link elements get serialized correctly by innerHTML - // This requires a wrapper element in IE - htmlSerialize: !!div.getElementsByTagName( "link" ).length, - - // Get the style information from getAttribute - // (IE uses .cssText instead) - style: /top/.test( a.getAttribute("style") ), - - // Make sure that URLs aren't manipulated - // (IE normalizes it by default) - hrefNormalized: ( a.getAttribute( "href" ) === "/a" ), - - // Make sure that element opacity exists - // (IE uses filter instead) - // Use a regex to work around a WebKit issue. See #5145 - opacity: /^0.55$/.test( a.style.opacity ), - - // Verify style float existence - // (IE uses styleFloat instead of cssFloat) - cssFloat: !!a.style.cssFloat, - - // Make sure that if no value is specified for a checkbox - // that it defaults to "on". - // (WebKit defaults to "" instead) - checkOn: ( input.value === "on" ), - - // Make sure that a selected-by-default option has a working selected property. - // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) - optSelected: opt.selected, - - // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) - getSetAttribute: div.className !== "t", - - // Will be defined later - submitBubbles: true, - changeBubbles: true, - focusinBubbles: false, - deleteExpando: true, - noCloneEvent: true, - inlineBlockNeedsLayout: false, - shrinkWrapBlocks: false, - reliableMarginRight: true - }; - - // Make sure checked status is properly cloned - input.checked = true; - support.noCloneChecked = input.cloneNode( true ).checked; - - // Make sure that the options inside disabled selects aren't marked as disabled - // (WebKit marks them as disabled) - select.disabled = true; - support.optDisabled = !opt.disabled; - - // Test to see if it's possible to delete an expando from an element - // Fails in Internet Explorer - try { - delete div.test; - } catch( e ) { - support.deleteExpando = false; - } - - if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { - div.attachEvent( "onclick", function() { - // Cloning a node shouldn't copy over any - // bound event handlers (IE does this) - support.noCloneEvent = false; - }); - div.cloneNode( true ).fireEvent( "onclick" ); - } - - // Check if a radio maintains it's value - // after being appended to the DOM - input = document.createElement("input"); - input.value = "t"; - input.setAttribute("type", "radio"); - support.radioValue = input.value === "t"; - - input.setAttribute("checked", "checked"); - div.appendChild( input ); - fragment = document.createDocumentFragment(); - fragment.appendChild( div.firstChild ); - - // WebKit doesn't clone checked state correctly in fragments - support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; - - div.innerHTML = ""; - - // Figure out if the W3C box model works as expected - div.style.width = div.style.paddingLeft = "1px"; - - body = document.getElementsByTagName( "body" )[ 0 ]; - // We use our own, invisible, body unless the body is already present - // in which case we use a div (#9239) - testElement = document.createElement( body ? "div" : "body" ); - testElementStyle = { - visibility: "hidden", - width: 0, - height: 0, - border: 0, - margin: 0 - }; - if ( body ) { - jQuery.extend( testElementStyle, { - position: "absolute", - left: -1000, - top: -1000 - }); - } - for ( i in testElementStyle ) { - testElement.style[ i ] = testElementStyle[ i ]; - } - testElement.appendChild( div ); - testElementParent = body || documentElement; - testElementParent.insertBefore( testElement, testElementParent.firstChild ); - - // Check if a disconnected checkbox will retain its checked - // value of true after appended to the DOM (IE6/7) - support.appendChecked = input.checked; - - support.boxModel = div.offsetWidth === 2; - - if ( "zoom" in div.style ) { - // Check if natively block-level elements act like inline-block - // elements when setting their display to 'inline' and giving - // them layout - // (IE < 8 does this) - div.style.display = "inline"; - div.style.zoom = 1; - support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); - - // Check if elements with layout shrink-wrap their children - // (IE 6 does this) - div.style.display = ""; - div.innerHTML = "
      "; - support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); - } - - div.innerHTML = "
      t
      "; - tds = div.getElementsByTagName( "td" ); - - // Check if table cells still have offsetWidth/Height when they are set - // to display:none and there are still other visible table cells in a - // table row; if so, offsetWidth/Height are not reliable for use when - // determining if an element has been hidden directly using - // display:none (it is still safe to use offsets if a parent element is - // hidden; don safety goggles and see bug #4512 for more information). - // (only IE 8 fails this test) - isSupported = ( tds[ 0 ].offsetHeight === 0 ); - - tds[ 0 ].style.display = ""; - tds[ 1 ].style.display = "none"; - - // Check if empty table cells still have offsetWidth/Height - // (IE < 8 fail this test) - support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); - div.innerHTML = ""; - - // Check if div with explicit width and no margin-right incorrectly - // gets computed margin-right based on width of container. For more - // info see bug #3333 - // Fails in WebKit before Feb 2011 nightlies - // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right - if ( document.defaultView && document.defaultView.getComputedStyle ) { - marginDiv = document.createElement( "div" ); - marginDiv.style.width = "0"; - marginDiv.style.marginRight = "0"; - div.appendChild( marginDiv ); - support.reliableMarginRight = - ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; - } - - // Remove the body element we added - testElement.innerHTML = ""; - testElementParent.removeChild( testElement ); - - // Technique from Juriy Zaytsev - // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ - // We only care about the case where non-standard event systems - // are used, namely in IE. Short-circuiting here helps us to - // avoid an eval call (in setAttribute) which can cause CSP - // to go haywire. See: https://developer.mozilla.org/en/Security/CSP - if ( div.attachEvent ) { - for( i in { - submit: 1, - change: 1, - focusin: 1 - } ) { - eventName = "on" + i; - isSupported = ( eventName in div ); - if ( !isSupported ) { - div.setAttribute( eventName, "return;" ); - isSupported = ( typeof div[ eventName ] === "function" ); - } - support[ i + "Bubbles" ] = isSupported; - } - } - - // Null connected elements to avoid leaks in IE - testElement = fragment = select = opt = body = marginDiv = div = input = null; - - return support; -})(); - -// Keep track of boxModel -jQuery.boxModel = jQuery.support.boxModel; - - - - -var rbrace = /^(?:\{.*\}|\[.*\])$/, - rmultiDash = /([a-z])([A-Z])/g; - -jQuery.extend({ - cache: {}, - - // Please use with caution - uuid: 0, - - // Unique for each copy of jQuery on the page - // Non-digits removed to match rinlinejQuery - expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), - - // The following elements throw uncatchable exceptions if you - // attempt to add expando properties to them. - noData: { - "embed": true, - // Ban all objects except for Flash (which handle expandos) - "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", - "applet": true - }, - - hasData: function( elem ) { - elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; - - return !!elem && !isEmptyDataObject( elem ); - }, - - data: function( elem, name, data, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache, - - // We have to handle DOM nodes and JS objects differently because IE6-7 - // can't GC object references properly across the DOM-JS boundary - isNode = elem.nodeType, - - // Only DOM nodes need the global jQuery cache; JS object data is - // attached directly to the object so GC can occur automatically - cache = isNode ? jQuery.cache : elem, - - // Only defining an ID for JS objects if its cache already exists allows - // the code to shortcut on the same path as a DOM node with no cache - id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando; - - // Avoid doing any more work than we need to when trying to get data on an - // object that has no data at all - if ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) { - return; - } - - if ( !id ) { - // Only DOM nodes need a new unique ID for each element since their data - // ends up in the global cache - if ( isNode ) { - elem[ jQuery.expando ] = id = ++jQuery.uuid; - } else { - id = jQuery.expando; - } - } - - if ( !cache[ id ] ) { - cache[ id ] = {}; - - // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery - // metadata on plain JS objects when the object is serialized using - // JSON.stringify - if ( !isNode ) { - cache[ id ].toJSON = jQuery.noop; - } - } - - // An object can be passed to jQuery.data instead of a key/value pair; this gets - // shallow copied over onto the existing cache - if ( typeof name === "object" || typeof name === "function" ) { - if ( pvt ) { - cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name); - } else { - cache[ id ] = jQuery.extend(cache[ id ], name); - } - } - - thisCache = cache[ id ]; - - // Internal jQuery data is stored in a separate object inside the object's data - // cache in order to avoid key collisions between internal data and user-defined - // data - if ( pvt ) { - if ( !thisCache[ internalKey ] ) { - thisCache[ internalKey ] = {}; - } - - thisCache = thisCache[ internalKey ]; - } - - if ( data !== undefined ) { - thisCache[ jQuery.camelCase( name ) ] = data; - } - - // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should - // not attempt to inspect the internal events object using jQuery.data, as this - // internal data object is undocumented and subject to change. - if ( name === "events" && !thisCache[name] ) { - return thisCache[ internalKey ] && thisCache[ internalKey ].events; - } - - return getByName ? - // Check for both converted-to-camel and non-converted data property names - thisCache[ jQuery.camelCase( name ) ] || thisCache[ name ] : - thisCache; - }, - - removeData: function( elem, name, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var internalKey = jQuery.expando, isNode = elem.nodeType, - - // See jQuery.data for more information - cache = isNode ? jQuery.cache : elem, - - // See jQuery.data for more information - id = isNode ? elem[ jQuery.expando ] : jQuery.expando; - - // If there is already no cache entry for this object, there is no - // purpose in continuing - if ( !cache[ id ] ) { - return; - } - - if ( name ) { - var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ]; - - if ( thisCache ) { - delete thisCache[ name ]; - - // If there is no data left in the cache, we want to continue - // and let the cache object itself get destroyed - if ( !isEmptyDataObject(thisCache) ) { - return; - } - } - } - - // See jQuery.data for more information - if ( pvt ) { - delete cache[ id ][ internalKey ]; - - // Don't destroy the parent cache unless the internal data object - // had been the only thing left in it - if ( !isEmptyDataObject(cache[ id ]) ) { - return; - } - } - - var internalCache = cache[ id ][ internalKey ]; - - // Browsers that fail expando deletion also refuse to delete expandos on - // the window, but it will allow it on all other JS objects; other browsers - // don't care - if ( jQuery.support.deleteExpando || cache != window ) { - delete cache[ id ]; - } else { - cache[ id ] = null; - } - - // We destroyed the entire user cache at once because it's faster than - // iterating through each key, but we need to continue to persist internal - // data if it existed - if ( internalCache ) { - cache[ id ] = {}; - // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery - // metadata on plain JS objects when the object is serialized using - // JSON.stringify - if ( !isNode ) { - cache[ id ].toJSON = jQuery.noop; - } - - cache[ id ][ internalKey ] = internalCache; - - // Otherwise, we need to eliminate the expando on the node to avoid - // false lookups in the cache for entries that no longer exist - } else if ( isNode ) { - // IE does not allow us to delete expando properties from nodes, - // nor does it have a removeAttribute function on Document nodes; - // we must handle all of these cases - if ( jQuery.support.deleteExpando ) { - delete elem[ jQuery.expando ]; - } else if ( elem.removeAttribute ) { - elem.removeAttribute( jQuery.expando ); - } else { - elem[ jQuery.expando ] = null; - } - } - }, - - // For internal use only. - _data: function( elem, name, data ) { - return jQuery.data( elem, name, data, true ); - }, - - // A method for determining if a DOM node can handle the data expando - acceptData: function( elem ) { - if ( elem.nodeName ) { - var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; - - if ( match ) { - return !(match === true || elem.getAttribute("classid") !== match); - } - } - - return true; - } -}); - -jQuery.fn.extend({ - data: function( key, value ) { - var data = null; - - if ( typeof key === "undefined" ) { - if ( this.length ) { - data = jQuery.data( this[0] ); - - if ( this[0].nodeType === 1 ) { - var attr = this[0].attributes, name; - for ( var i = 0, l = attr.length; i < l; i++ ) { - name = attr[i].name; - - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.substring(5) ); - - dataAttr( this[0], name, data[ name ] ); - } - } - } - } - - return data; - - } else if ( typeof key === "object" ) { - return this.each(function() { - jQuery.data( this, key ); - }); - } - - var parts = key.split("."); - parts[1] = parts[1] ? "." + parts[1] : ""; - - if ( value === undefined ) { - data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); - - // Try to fetch any internally stored data first - if ( data === undefined && this.length ) { - data = jQuery.data( this[0], key ); - data = dataAttr( this[0], key, data ); - } - - return data === undefined && parts[1] ? - this.data( parts[0] ) : - data; - - } else { - return this.each(function() { - var $this = jQuery( this ), - args = [ parts[0], value ]; - - $this.triggerHandler( "setData" + parts[1] + "!", args ); - jQuery.data( this, key, value ); - $this.triggerHandler( "changeData" + parts[1] + "!", args ); - }); - } - }, - - removeData: function( key ) { - return this.each(function() { - jQuery.removeData( this, key ); - }); - } -}); - -function dataAttr( elem, key, data ) { - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - var name = "data-" + key.replace( rmultiDash, "$1-$2" ).toLowerCase(); - - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - !jQuery.isNaN( data ) ? parseFloat( data ) : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch( e ) {} - - // Make sure we set the data so it isn't changed later - jQuery.data( elem, key, data ); - - } else { - data = undefined; - } - } - - return data; -} - -// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON -// property to be considered empty objects; this property always exists in -// order to make sure JSON.stringify does not expose internal metadata -function isEmptyDataObject( obj ) { - for ( var name in obj ) { - if ( name !== "toJSON" ) { - return false; - } - } - - return true; -} - - - - -function handleQueueMarkDefer( elem, type, src ) { - var deferDataKey = type + "defer", - queueDataKey = type + "queue", - markDataKey = type + "mark", - defer = jQuery.data( elem, deferDataKey, undefined, true ); - if ( defer && - ( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) && - ( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) { - // Give room for hard-coded callbacks to fire first - // and eventually mark/queue something else on the element - setTimeout( function() { - if ( !jQuery.data( elem, queueDataKey, undefined, true ) && - !jQuery.data( elem, markDataKey, undefined, true ) ) { - jQuery.removeData( elem, deferDataKey, true ); - defer.resolve(); - } - }, 0 ); - } -} - -jQuery.extend({ - - _mark: function( elem, type ) { - if ( elem ) { - type = (type || "fx") + "mark"; - jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true ); - } - }, - - _unmark: function( force, elem, type ) { - if ( force !== true ) { - type = elem; - elem = force; - force = false; - } - if ( elem ) { - type = type || "fx"; - var key = type + "mark", - count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 ); - if ( count ) { - jQuery.data( elem, key, count, true ); - } else { - jQuery.removeData( elem, key, true ); - handleQueueMarkDefer( elem, type, "mark" ); - } - } - }, - - queue: function( elem, type, data ) { - if ( elem ) { - type = (type || "fx") + "queue"; - var q = jQuery.data( elem, type, undefined, true ); - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !q || jQuery.isArray(data) ) { - q = jQuery.data( elem, type, jQuery.makeArray(data), true ); - } else { - q.push( data ); - } - } - return q || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - fn = queue.shift(), - defer; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - } - - if ( fn ) { - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift("inprogress"); - } - - fn.call(elem, function() { - jQuery.dequeue(elem, type); - }); - } - - if ( !queue.length ) { - jQuery.removeData( elem, type + "queue", true ); - handleQueueMarkDefer( elem, type, "queue" ); - } - } -}); - -jQuery.fn.extend({ - queue: function( type, data ) { - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - } - - if ( data === undefined ) { - return jQuery.queue( this[0], type ); - } - return this.each(function() { - var queue = jQuery.queue( this, type, data ); - - if ( type === "fx" && queue[0] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - }); - }, - dequeue: function( type ) { - return this.each(function() { - jQuery.dequeue( this, type ); - }); - }, - // Based off of the plugin by Clint Helfers, with permission. - // http://blindsignals.com/index.php/2009/07/jquery-delay/ - delay: function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; - type = type || "fx"; - - return this.queue( type, function() { - var elem = this; - setTimeout(function() { - jQuery.dequeue( elem, type ); - }, time ); - }); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, object ) { - if ( typeof type !== "string" ) { - object = type; - type = undefined; - } - type = type || "fx"; - var defer = jQuery.Deferred(), - elements = this, - i = elements.length, - count = 1, - deferDataKey = type + "defer", - queueDataKey = type + "queue", - markDataKey = type + "mark", - tmp; - function resolve() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - } - while( i-- ) { - if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || - ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || - jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && - jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) { - count++; - tmp.done( resolve ); - } - } - resolve(); - return defer.promise(); - } -}); - - - - -var rclass = /[\n\t\r]/g, - rspace = /\s+/, - rreturn = /\r/g, - rtype = /^(?:button|input)$/i, - rfocusable = /^(?:button|input|object|select|textarea)$/i, - rclickable = /^a(?:rea)?$/i, - rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, - rinvalidChar = /\:|^on/, - formHook, boolHook; - -jQuery.fn.extend({ - attr: function( name, value ) { - return jQuery.access( this, name, value, true, jQuery.attr ); - }, - - removeAttr: function( name ) { - return this.each(function() { - jQuery.removeAttr( this, name ); - }); - }, - - prop: function( name, value ) { - return jQuery.access( this, name, value, true, jQuery.prop ); - }, - - removeProp: function( name ) { - name = jQuery.propFix[ name ] || name; - return this.each(function() { - // try/catch handles cases where IE balks (such as removing a property on window) - try { - this[ name ] = undefined; - delete this[ name ]; - } catch( e ) {} - }); - }, - - addClass: function( value ) { - var classNames, i, l, elem, - setClass, c, cl; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).addClass( value.call(this, j, this.className) ); - }); - } - - if ( value && typeof value === "string" ) { - classNames = value.split( rspace ); - - for ( i = 0, l = this.length; i < l; i++ ) { - elem = this[ i ]; - - if ( elem.nodeType === 1 ) { - if ( !elem.className && classNames.length === 1 ) { - elem.className = value; - - } else { - setClass = " " + elem.className + " "; - - for ( c = 0, cl = classNames.length; c < cl; c++ ) { - if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { - setClass += classNames[ c ] + " "; - } - } - elem.className = jQuery.trim( setClass ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classNames, i, l, elem, className, c, cl; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).removeClass( value.call(this, j, this.className) ); - }); - } - - if ( (value && typeof value === "string") || value === undefined ) { - classNames = (value || "").split( rspace ); - - for ( i = 0, l = this.length; i < l; i++ ) { - elem = this[ i ]; - - if ( elem.nodeType === 1 && elem.className ) { - if ( value ) { - className = (" " + elem.className + " ").replace( rclass, " " ); - for ( c = 0, cl = classNames.length; c < cl; c++ ) { - className = className.replace(" " + classNames[ c ] + " ", " "); - } - elem.className = jQuery.trim( className ); - - } else { - elem.className = ""; - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isBool = typeof stateVal === "boolean"; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( i ) { - jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); - }); - } - - return this.each(function() { - if ( type === "string" ) { - // toggle individual class names - var className, - i = 0, - self = jQuery( this ), - state = stateVal, - classNames = value.split( rspace ); - - while ( (className = classNames[ i++ ]) ) { - // check each className given, space seperated list - state = isBool ? state : !self.hasClass( className ); - self[ state ? "addClass" : "removeClass" ]( className ); - } - - } else if ( type === "undefined" || type === "boolean" ) { - if ( this.className ) { - // store className if set - jQuery._data( this, "__className__", this.className ); - } - - // toggle whole className - this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; - } - }); - }, - - hasClass: function( selector ) { - var className = " " + selector + " "; - for ( var i = 0, l = this.length; i < l; i++ ) { - if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { - return true; - } - } - - return false; - }, - - val: function( value ) { - var hooks, ret, - elem = this[0]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; - - if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { - return ret; - } - - ret = elem.value; - - return typeof ret === "string" ? - // handle most common string cases - ret.replace(rreturn, "") : - // handle cases where value is null/undef or number - ret == null ? "" : ret; - } - - return undefined; - } - - var isFunction = jQuery.isFunction( value ); - - return this.each(function( i ) { - var self = jQuery(this), val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call( this, i, self.val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - } else if ( typeof val === "number" ) { - val += ""; - } else if ( jQuery.isArray( val ) ) { - val = jQuery.map(val, function ( value ) { - return value == null ? "" : value + ""; - }); - } - - hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - }); - } -}); - -jQuery.extend({ - valHooks: { - option: { - get: function( elem ) { - // attributes.value is undefined in Blackberry 4.7 but - // uses .value. See #6932 - var val = elem.attributes.value; - return !val || val.specified ? elem.value : elem.text; - } - }, - select: { - get: function( elem ) { - var value, - index = elem.selectedIndex, - values = [], - options = elem.options, - one = elem.type === "select-one"; - - // Nothing was selected - if ( index < 0 ) { - return null; - } - - // Loop through all the selected options - for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { - var option = options[ i ]; - - // Don't return options that are disabled or in a disabled optgroup - if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && - (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - // Fixes Bug #2551 -- select.val() broken in IE after form.reset() - if ( one && !values.length && options.length ) { - return jQuery( options[ index ] ).val(); - } - - return values; - }, - - set: function( elem, value ) { - var values = jQuery.makeArray( value ); - - jQuery(elem).find("option").each(function() { - this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; - }); - - if ( !values.length ) { - elem.selectedIndex = -1; - } - return values; - } - } - }, - - attrFn: { - val: true, - css: true, - html: true, - text: true, - data: true, - width: true, - height: true, - offset: true - }, - - attrFix: { - // Always normalize to ensure hook usage - tabindex: "tabIndex" - }, - - attr: function( elem, name, value, pass ) { - var nType = elem.nodeType; - - // don't get/set attributes on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return undefined; - } - - if ( pass && name in jQuery.attrFn ) { - return jQuery( elem )[ name ]( value ); - } - - // Fallback to prop when attributes are not supported - if ( !("getAttribute" in elem) ) { - return jQuery.prop( elem, name, value ); - } - - var ret, hooks, - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - // Normalize the name if needed - if ( notxml ) { - name = jQuery.attrFix[ name ] || name; - - hooks = jQuery.attrHooks[ name ]; - - if ( !hooks ) { - // Use boolHook for boolean attributes - if ( rboolean.test( name ) ) { - - hooks = boolHook; - - // Use formHook for forms and if the name contains certain characters - } else if ( formHook && name !== "className" && - (jQuery.nodeName( elem, "form" ) || rinvalidChar.test( name )) ) { - - hooks = formHook; - } - } - } - - if ( value !== undefined ) { - - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return undefined; - - } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - elem.setAttribute( name, "" + value ); - return value; - } - - } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { - return ret; - - } else { - - ret = elem.getAttribute( name ); - - // Non-existent attributes return null, we normalize to undefined - return ret === null ? - undefined : - ret; - } - }, - - removeAttr: function( elem, name ) { - var propName; - if ( elem.nodeType === 1 ) { - name = jQuery.attrFix[ name ] || name; - - if ( jQuery.support.getSetAttribute ) { - // Use removeAttribute in browsers that support it - elem.removeAttribute( name ); - } else { - jQuery.attr( elem, name, "" ); - elem.removeAttributeNode( elem.getAttributeNode( name ) ); - } - - // Set corresponding property to false for boolean attributes - if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) { - elem[ propName ] = false; - } - } - }, - - attrHooks: { - type: { - set: function( elem, value ) { - // We can't allow the type property to be changed (since it causes problems in IE) - if ( rtype.test( elem.nodeName ) && elem.parentNode ) { - jQuery.error( "type property can't be changed" ); - } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { - // Setting the type on a radio button after the value resets the value in IE6-9 - // Reset value to it's default in case type is set after value - // This is for element creation - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - }, - tabIndex: { - get: function( elem ) { - // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set - // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - var attributeNode = elem.getAttributeNode("tabIndex"); - - return attributeNode && attributeNode.specified ? - parseInt( attributeNode.value, 10 ) : - rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? - 0 : - undefined; - } - }, - // Use the value property for back compat - // Use the formHook for button elements in IE6/7 (#1954) - value: { - get: function( elem, name ) { - if ( formHook && jQuery.nodeName( elem, "button" ) ) { - return formHook.get( elem, name ); - } - return name in elem ? - elem.value : - null; - }, - set: function( elem, value, name ) { - if ( formHook && jQuery.nodeName( elem, "button" ) ) { - return formHook.set( elem, value, name ); - } - // Does not return so that setAttribute is also used - elem.value = value; - } - } - }, - - propFix: { - tabindex: "tabIndex", - readonly: "readOnly", - "for": "htmlFor", - "class": "className", - maxlength: "maxLength", - cellspacing: "cellSpacing", - cellpadding: "cellPadding", - rowspan: "rowSpan", - colspan: "colSpan", - usemap: "useMap", - frameborder: "frameBorder", - contenteditable: "contentEditable" - }, - - prop: function( elem, name, value ) { - var nType = elem.nodeType; - - // don't get/set properties on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return undefined; - } - - var ret, hooks, - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - if ( notxml ) { - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - return (elem[ name ] = value); - } - - } else { - if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== undefined ) { - return ret; - - } else { - return elem[ name ]; - } - } - }, - - propHooks: {} -}); - -// Hook for boolean attributes -boolHook = { - get: function( elem, name ) { - // Align boolean attributes with corresponding properties - return jQuery.prop( elem, name ) ? - name.toLowerCase() : - undefined; - }, - set: function( elem, value, name ) { - var propName; - if ( value === false ) { - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - // value is true since we know at this point it's type boolean and not false - // Set boolean attributes to the same name and set the DOM property - propName = jQuery.propFix[ name ] || name; - if ( propName in elem ) { - // Only set the IDL specifically if it already exists on the element - elem[ propName ] = true; - } - - elem.setAttribute( name, name.toLowerCase() ); - } - return name; - } -}; - -// IE6/7 do not support getting/setting some attributes with get/setAttribute -if ( !jQuery.support.getSetAttribute ) { - - // propFix is more comprehensive and contains all fixes - jQuery.attrFix = jQuery.propFix; - - // Use this for any attribute on a form in IE6/7 - formHook = jQuery.attrHooks.name = jQuery.attrHooks.title = jQuery.valHooks.button = { - get: function( elem, name ) { - var ret; - ret = elem.getAttributeNode( name ); - // Return undefined if nodeValue is empty string - return ret && ret.nodeValue !== "" ? - ret.nodeValue : - undefined; - }, - set: function( elem, value, name ) { - // Check form objects in IE (multiple bugs related) - // Only use nodeValue if the attribute node exists on the form - var ret = elem.getAttributeNode( name ); - if ( ret ) { - ret.nodeValue = value; - return value; - } - } - }; - - // Set width and height to auto instead of 0 on empty string( Bug #8150 ) - // This is for removals - jQuery.each([ "width", "height" ], function( i, name ) { - jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { - set: function( elem, value ) { - if ( value === "" ) { - elem.setAttribute( name, "auto" ); - return value; - } - } - }); - }); -} - - -// Some attributes require a special call on IE -if ( !jQuery.support.hrefNormalized ) { - jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { - jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { - get: function( elem ) { - var ret = elem.getAttribute( name, 2 ); - return ret === null ? undefined : ret; - } - }); - }); -} - -if ( !jQuery.support.style ) { - jQuery.attrHooks.style = { - get: function( elem ) { - // Return undefined in the case of empty string - // Normalize to lowercase since IE uppercases css property names - return elem.style.cssText.toLowerCase() || undefined; - }, - set: function( elem, value ) { - return (elem.style.cssText = "" + value); - } - }; -} - -// Safari mis-reports the default selected property of an option -// Accessing the parent's selectedIndex property fixes it -if ( !jQuery.support.optSelected ) { - jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { - get: function( elem ) { - var parent = elem.parentNode; - - if ( parent ) { - parent.selectedIndex; - - // Make sure that it also works with optgroups, see #5701 - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }); -} - -// Radios and checkboxes getter/setter -if ( !jQuery.support.checkOn ) { - jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - get: function( elem ) { - // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified - return elem.getAttribute("value") === null ? "on" : elem.value; - } - }; - }); -} -jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { - set: function( elem, value ) { - if ( jQuery.isArray( value ) ) { - return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0); - } - } - }); -}); - - - - -var rnamespaces = /\.(.*)$/, - rformElems = /^(?:textarea|input|select)$/i, - rperiod = /\./g, - rspaces = / /g, - rescape = /[^\w\s.|`]/g, - fcleanup = function( nm ) { - return nm.replace(rescape, "\\$&"); - }; - -/* - * A number of helper functions used for managing events. - * Many of the ideas behind this code originated from - * Dean Edwards' addEvent library. - */ -jQuery.event = { - - // Bind an event to an element - // Original by Dean Edwards - add: function( elem, types, handler, data ) { - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - if ( handler === false ) { - handler = returnFalse; - } else if ( !handler ) { - // Fixes bug #7229. Fix recommended by jdalton - return; - } - - var handleObjIn, handleObj; - - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - } - - // Make sure that the function being executed has a unique ID - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure - var elemData = jQuery._data( elem ); - - // If no elemData is found then we must be trying to bind to one of the - // banned noData elements - if ( !elemData ) { - return; - } - - var events = elemData.events, - eventHandle = elemData.handle; - - if ( !events ) { - elemData.events = events = {}; - } - - if ( !eventHandle ) { - elemData.handle = eventHandle = function( e ) { - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? - jQuery.event.handle.apply( eventHandle.elem, arguments ) : - undefined; - }; - } - - // Add elem as a property of the handle function - // This is to prevent a memory leak with non-native events in IE. - eventHandle.elem = elem; - - // Handle multiple events separated by a space - // jQuery(...).bind("mouseover mouseout", fn); - types = types.split(" "); - - var type, i = 0, namespaces; - - while ( (type = types[ i++ ]) ) { - handleObj = handleObjIn ? - jQuery.extend({}, handleObjIn) : - { handler: handler, data: data }; - - // Namespaced event handlers - if ( type.indexOf(".") > -1 ) { - namespaces = type.split("."); - type = namespaces.shift(); - handleObj.namespace = namespaces.slice(0).sort().join("."); - - } else { - namespaces = []; - handleObj.namespace = ""; - } - - handleObj.type = type; - if ( !handleObj.guid ) { - handleObj.guid = handler.guid; - } - - // Get the current list of functions bound to this event - var handlers = events[ type ], - special = jQuery.event.special[ type ] || {}; - - // Init the event handler queue - if ( !handlers ) { - handlers = events[ type ] = []; - - // Check for a special event handler - // Only use addEventListener/attachEvent if the special - // events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - // Bind the global event handler to the element - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); - - } else if ( elem.attachEvent ) { - elem.attachEvent( "on" + type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add the function to the element's handler list - handlers.push( handleObj ); - - // Keep track of which events have been used, for event optimization - jQuery.event.global[ type ] = true; - } - - // Nullify elem to prevent memory leaks in IE - elem = null; - }, - - global: {}, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, pos ) { - // don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - if ( handler === false ) { - handler = returnFalse; - } - - var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, - elemData = jQuery.hasData( elem ) && jQuery._data( elem ), - events = elemData && elemData.events; - - if ( !elemData || !events ) { - return; - } - - // types is actually an event object here - if ( types && types.type ) { - handler = types.handler; - types = types.type; - } - - // Unbind all events for the element - if ( !types || typeof types === "string" && types.charAt(0) === "." ) { - types = types || ""; - - for ( type in events ) { - jQuery.event.remove( elem, type + types ); - } - - return; - } - - // Handle multiple events separated by a space - // jQuery(...).unbind("mouseover mouseout", fn); - types = types.split(" "); - - while ( (type = types[ i++ ]) ) { - origType = type; - handleObj = null; - all = type.indexOf(".") < 0; - namespaces = []; - - if ( !all ) { - // Namespaced event handlers - namespaces = type.split("."); - type = namespaces.shift(); - - namespace = new RegExp("(^|\\.)" + - jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)"); - } - - eventType = events[ type ]; - - if ( !eventType ) { - continue; - } - - if ( !handler ) { - for ( j = 0; j < eventType.length; j++ ) { - handleObj = eventType[ j ]; - - if ( all || namespace.test( handleObj.namespace ) ) { - jQuery.event.remove( elem, origType, handleObj.handler, j ); - eventType.splice( j--, 1 ); - } - } - - continue; - } - - special = jQuery.event.special[ type ] || {}; - - for ( j = pos || 0; j < eventType.length; j++ ) { - handleObj = eventType[ j ]; - - if ( handler.guid === handleObj.guid ) { - // remove the given handler for the given type - if ( all || namespace.test( handleObj.namespace ) ) { - if ( pos == null ) { - eventType.splice( j--, 1 ); - } - - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - - if ( pos != null ) { - break; - } - } - } - - // remove generic event handler if no more handlers exist - if ( eventType.length === 0 || pos != null && eventType.length === 1 ) { - if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { - jQuery.removeEvent( elem, type, elemData.handle ); - } - - ret = null; - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - var handle = elemData.handle; - if ( handle ) { - handle.elem = null; - } - - delete elemData.events; - delete elemData.handle; - - if ( jQuery.isEmptyObject( elemData ) ) { - jQuery.removeData( elem, undefined, true ); - } - } - }, - - // Events that are safe to short-circuit if no handlers are attached. - // Native DOM events should not be added, they may have inline handlers. - customEvent: { - "getData": true, - "setData": true, - "changeData": true - }, - - trigger: function( event, data, elem, onlyHandlers ) { - // Event object or event type - var type = event.type || event, - namespaces = [], - exclusive; - - if ( type.indexOf("!") >= 0 ) { - // Exclusive events trigger only for the exact event (no namespaces) - type = type.slice(0, -1); - exclusive = true; - } - - if ( type.indexOf(".") >= 0 ) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - - if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { - // No jQuery handlers for this event type, and it can't have inline handlers - return; - } - - // Caller can pass in an Event, Object, or just an event type string - event = typeof event === "object" ? - // jQuery.Event object - event[ jQuery.expando ] ? event : - // Object literal - new jQuery.Event( type, event ) : - // Just the event type (string) - new jQuery.Event( type ); - - event.type = type; - event.exclusive = exclusive; - event.namespace = namespaces.join("."); - event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)"); - - // triggerHandler() and global events don't bubble or run the default action - if ( onlyHandlers || !elem ) { - event.preventDefault(); - event.stopPropagation(); - } - - // Handle a global trigger - if ( !elem ) { - // TODO: Stop taunting the data cache; remove global events and always attach to document - jQuery.each( jQuery.cache, function() { - // internalKey variable is just used to make it easier to find - // and potentially change this stuff later; currently it just - // points to jQuery.expando - var internalKey = jQuery.expando, - internalCache = this[ internalKey ]; - if ( internalCache && internalCache.events && internalCache.events[ type ] ) { - jQuery.event.trigger( event, data, internalCache.handle.elem ); - } - }); - return; - } - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // Clean up the event in case it is being reused - event.result = undefined; - event.target = elem; - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data != null ? jQuery.makeArray( data ) : []; - data.unshift( event ); - - var cur = elem, - // IE doesn't like method names with a colon (#3533, #8272) - ontype = type.indexOf(":") < 0 ? "on" + type : ""; - - // Fire event on the current element, then bubble up the DOM tree - do { - var handle = jQuery._data( cur, "handle" ); - - event.currentTarget = cur; - if ( handle ) { - handle.apply( cur, data ); - } - - // Trigger an inline bound script - if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) { - event.result = false; - event.preventDefault(); - } - - // Bubble up to document, then to window - cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window; - } while ( cur && !event.isPropagationStopped() ); - - // If nobody prevented the default action, do it now - if ( !event.isDefaultPrevented() ) { - var old, - special = jQuery.event.special[ type ] || {}; - - if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) && - !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Can't use an .isFunction)() check here because IE6/7 fails that test. - // IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch. - try { - if ( ontype && elem[ type ] ) { - // Don't re-trigger an onFOO event when we call its FOO() method - old = elem[ ontype ]; - - if ( old ) { - elem[ ontype ] = null; - } - - jQuery.event.triggered = type; - elem[ type ](); - } - } catch ( ieError ) {} - - if ( old ) { - elem[ ontype ] = old; - } - - jQuery.event.triggered = undefined; - } - } - - return event.result; - }, - - handle: function( event ) { - event = jQuery.event.fix( event || window.event ); - // Snapshot the handlers list since a called handler may add/remove events. - var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0), - run_all = !event.exclusive && !event.namespace, - args = Array.prototype.slice.call( arguments, 0 ); - - // Use the fix-ed Event rather than the (read-only) native event - args[0] = event; - event.currentTarget = this; - - for ( var j = 0, l = handlers.length; j < l; j++ ) { - var handleObj = handlers[ j ]; - - // Triggered event must 1) be non-exclusive and have no namespace, or - // 2) have namespace(s) a subset or equal to those in the bound event. - if ( run_all || event.namespace_re.test( handleObj.namespace ) ) { - // Pass in a reference to the handler function itself - // So that we can later remove it - event.handler = handleObj.handler; - event.data = handleObj.data; - event.handleObj = handleObj; - - var ret = handleObj.handler.apply( this, args ); - - if ( ret !== undefined ) { - event.result = ret; - if ( ret === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - - if ( event.isImmediatePropagationStopped() ) { - break; - } - } - } - return event.result; - }, - - props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // store a copy of the original event object - // and "clone" to set read-only properties - var originalEvent = event; - event = jQuery.Event( originalEvent ); - - for ( var i = this.props.length, prop; i; ) { - prop = this.props[ --i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Fix target property, if necessary - if ( !event.target ) { - // Fixes #1925 where srcElement might not be defined either - event.target = event.srcElement || document; - } - - // check if target is a textnode (safari) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - // Add relatedTarget, if necessary - if ( !event.relatedTarget && event.fromElement ) { - event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; - } - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && event.clientX != null ) { - var eventDocument = event.target.ownerDocument || document, - doc = eventDocument.documentElement, - body = eventDocument.body; - - event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); - event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); - } - - // Add which for key events - if ( event.which == null && (event.charCode != null || event.keyCode != null) ) { - event.which = event.charCode != null ? event.charCode : event.keyCode; - } - - // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) - if ( !event.metaKey && event.ctrlKey ) { - event.metaKey = event.ctrlKey; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && event.button !== undefined ) { - event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); - } - - return event; - }, - - // Deprecated, use jQuery.guid instead - guid: 1E8, - - // Deprecated, use jQuery.proxy instead - proxy: jQuery.proxy, - - special: { - ready: { - // Make sure the ready event is setup - setup: jQuery.bindReady, - teardown: jQuery.noop - }, - - live: { - add: function( handleObj ) { - jQuery.event.add( this, - liveConvert( handleObj.origType, handleObj.selector ), - jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) ); - }, - - remove: function( handleObj ) { - jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj ); - } - }, - - beforeunload: { - setup: function( data, namespaces, eventHandle ) { - // We only want to do this special case on windows - if ( jQuery.isWindow( this ) ) { - this.onbeforeunload = eventHandle; - } - }, - - teardown: function( namespaces, eventHandle ) { - if ( this.onbeforeunload === eventHandle ) { - this.onbeforeunload = null; - } - } - } - } -}; - -jQuery.removeEvent = document.removeEventListener ? - function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } - } : - function( elem, type, handle ) { - if ( elem.detachEvent ) { - elem.detachEvent( "on" + type, handle ); - } - }; - -jQuery.Event = function( src, props ) { - // Allow instantiation without the 'new' keyword - if ( !this.preventDefault ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || - src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // timeStamp is buggy for some events on Firefox(#3843) - // So we won't rely on the native value - this.timeStamp = jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -function returnFalse() { - return false; -} -function returnTrue() { - return true; -} - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - preventDefault: function() { - this.isDefaultPrevented = returnTrue; - - var e = this.originalEvent; - if ( !e ) { - return; - } - - // if preventDefault exists run it on the original event - if ( e.preventDefault ) { - e.preventDefault(); - - // otherwise set the returnValue property of the original event to false (IE) - } else { - e.returnValue = false; - } - }, - stopPropagation: function() { - this.isPropagationStopped = returnTrue; - - var e = this.originalEvent; - if ( !e ) { - return; - } - // if stopPropagation exists run it on the original event - if ( e.stopPropagation ) { - e.stopPropagation(); - } - // otherwise set the cancelBubble property of the original event to true (IE) - e.cancelBubble = true; - }, - stopImmediatePropagation: function() { - this.isImmediatePropagationStopped = returnTrue; - this.stopPropagation(); - }, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse -}; - -// Checks if an event happened on an element within another element -// Used in jQuery.event.special.mouseenter and mouseleave handlers -var withinElement = function( event ) { - - // Check if mouse(over|out) are still within the same parent element - var related = event.relatedTarget, - inside = false, - eventType = event.type; - - event.type = event.data; - - if ( related !== this ) { - - if ( related ) { - inside = jQuery.contains( this, related ); - } - - if ( !inside ) { - - jQuery.event.handle.apply( this, arguments ); - - event.type = eventType; - } - } -}, - -// In case of event delegation, we only need to rename the event.type, -// liveHandler will take care of the rest. -delegate = function( event ) { - event.type = event.data; - jQuery.event.handle.apply( this, arguments ); -}; - -// Create mouseenter and mouseleave events -jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - setup: function( data ) { - jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig ); - }, - teardown: function( data ) { - jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement ); - } - }; -}); - -// submit delegation -if ( !jQuery.support.submitBubbles ) { - - jQuery.event.special.submit = { - setup: function( data, namespaces ) { - if ( !jQuery.nodeName( this, "form" ) ) { - jQuery.event.add(this, "click.specialSubmit", function( e ) { - var elem = e.target, - type = elem.type; - - if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { - trigger( "submit", this, arguments ); - } - }); - - jQuery.event.add(this, "keypress.specialSubmit", function( e ) { - var elem = e.target, - type = elem.type; - - if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { - trigger( "submit", this, arguments ); - } - }); - - } else { - return false; - } - }, - - teardown: function( namespaces ) { - jQuery.event.remove( this, ".specialSubmit" ); - } - }; - -} - -// change delegation, happens here so we have bind. -if ( !jQuery.support.changeBubbles ) { - - var changeFilters, - - getVal = function( elem ) { - var type = elem.type, val = elem.value; - - if ( type === "radio" || type === "checkbox" ) { - val = elem.checked; - - } else if ( type === "select-multiple" ) { - val = elem.selectedIndex > -1 ? - jQuery.map( elem.options, function( elem ) { - return elem.selected; - }).join("-") : - ""; - - } else if ( jQuery.nodeName( elem, "select" ) ) { - val = elem.selectedIndex; - } - - return val; - }, - - testChange = function testChange( e ) { - var elem = e.target, data, val; - - if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) { - return; - } - - data = jQuery._data( elem, "_change_data" ); - val = getVal(elem); - - // the current data will be also retrieved by beforeactivate - if ( e.type !== "focusout" || elem.type !== "radio" ) { - jQuery._data( elem, "_change_data", val ); - } - - if ( data === undefined || val === data ) { - return; - } - - if ( data != null || val ) { - e.type = "change"; - e.liveFired = undefined; - jQuery.event.trigger( e, arguments[1], elem ); - } - }; - - jQuery.event.special.change = { - filters: { - focusout: testChange, - - beforedeactivate: testChange, - - click: function( e ) { - var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : ""; - - if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) { - testChange.call( this, e ); - } - }, - - // Change has to be called before submit - // Keydown will be called before keypress, which is used in submit-event delegation - keydown: function( e ) { - var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : ""; - - if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) || - (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || - type === "select-multiple" ) { - testChange.call( this, e ); - } - }, - - // Beforeactivate happens also before the previous element is blurred - // with this event you can't trigger a change event, but you can store - // information - beforeactivate: function( e ) { - var elem = e.target; - jQuery._data( elem, "_change_data", getVal(elem) ); - } - }, - - setup: function( data, namespaces ) { - if ( this.type === "file" ) { - return false; - } - - for ( var type in changeFilters ) { - jQuery.event.add( this, type + ".specialChange", changeFilters[type] ); - } - - return rformElems.test( this.nodeName ); - }, - - teardown: function( namespaces ) { - jQuery.event.remove( this, ".specialChange" ); - - return rformElems.test( this.nodeName ); - } - }; - - changeFilters = jQuery.event.special.change.filters; - - // Handle when the input is .focus()'d - changeFilters.focus = changeFilters.beforeactivate; -} - -function trigger( type, elem, args ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - // Don't pass args or remember liveFired; they apply to the donor event. - var event = jQuery.extend( {}, args[ 0 ] ); - event.type = type; - event.originalEvent = {}; - event.liveFired = undefined; - jQuery.event.handle.call( elem, event ); - if ( event.isDefaultPrevented() ) { - args[ 0 ].preventDefault(); - } -} - -// Create "bubbling" focus and blur events -if ( !jQuery.support.focusinBubbles ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler while someone wants focusin/focusout - var attaches = 0; - - jQuery.event.special[ fix ] = { - setup: function() { - if ( attaches++ === 0 ) { - document.addEventListener( orig, handler, true ); - } - }, - teardown: function() { - if ( --attaches === 0 ) { - document.removeEventListener( orig, handler, true ); - } - } - }; - - function handler( donor ) { - // Donor event is always a native one; fix it and switch its type. - // Let focusin/out handler cancel the donor focus/blur event. - var e = jQuery.event.fix( donor ); - e.type = fix; - e.originalEvent = {}; - jQuery.event.trigger( e, null, e.target ); - if ( e.isDefaultPrevented() ) { - donor.preventDefault(); - } - } - }); -} - -jQuery.each(["bind", "one"], function( i, name ) { - jQuery.fn[ name ] = function( type, data, fn ) { - var handler; - - // Handle object literals - if ( typeof type === "object" ) { - for ( var key in type ) { - this[ name ](key, data, type[key], fn); - } - return this; - } - - if ( arguments.length === 2 || data === false ) { - fn = data; - data = undefined; - } - - if ( name === "one" ) { - handler = function( event ) { - jQuery( this ).unbind( event, handler ); - return fn.apply( this, arguments ); - }; - handler.guid = fn.guid || jQuery.guid++; - } else { - handler = fn; - } - - if ( type === "unload" && name !== "one" ) { - this.one( type, data, fn ); - - } else { - for ( var i = 0, l = this.length; i < l; i++ ) { - jQuery.event.add( this[i], type, handler, data ); - } - } - - return this; - }; -}); - -jQuery.fn.extend({ - unbind: function( type, fn ) { - // Handle object literals - if ( typeof type === "object" && !type.preventDefault ) { - for ( var key in type ) { - this.unbind(key, type[key]); - } - - } else { - for ( var i = 0, l = this.length; i < l; i++ ) { - jQuery.event.remove( this[i], type, fn ); - } - } - - return this; - }, - - delegate: function( selector, types, data, fn ) { - return this.live( types, data, fn, selector ); - }, - - undelegate: function( selector, types, fn ) { - if ( arguments.length === 0 ) { - return this.unbind( "live" ); - - } else { - return this.die( types, null, fn, selector ); - } - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - - triggerHandler: function( type, data ) { - if ( this[0] ) { - return jQuery.event.trigger( type, data, this[0], true ); - } - }, - - toggle: function( fn ) { - // Save reference to arguments for access in closure - var args = arguments, - guid = fn.guid || jQuery.guid++, - i = 0, - toggler = function( event ) { - // Figure out which function to execute - var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i; - jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 ); - - // Make sure that clicks stop - event.preventDefault(); - - // and execute the function - return args[ lastToggle ].apply( this, arguments ) || false; - }; - - // link all the functions, so any of them can unbind this click handler - toggler.guid = guid; - while ( i < args.length ) { - args[ i++ ].guid = guid; - } - - return this.click( toggler ); - }, - - hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); - } -}); - -var liveMap = { - focus: "focusin", - blur: "focusout", - mouseenter: "mouseover", - mouseleave: "mouseout" -}; - -jQuery.each(["live", "die"], function( i, name ) { - jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) { - var type, i = 0, match, namespaces, preType, - selector = origSelector || this.selector, - context = origSelector ? this : jQuery( this.context ); - - if ( typeof types === "object" && !types.preventDefault ) { - for ( var key in types ) { - context[ name ]( key, data, types[key], selector ); - } - - return this; - } - - if ( name === "die" && !types && - origSelector && origSelector.charAt(0) === "." ) { - - context.unbind( origSelector ); - - return this; - } - - if ( data === false || jQuery.isFunction( data ) ) { - fn = data || returnFalse; - data = undefined; - } - - types = (types || "").split(" "); - - while ( (type = types[ i++ ]) != null ) { - match = rnamespaces.exec( type ); - namespaces = ""; - - if ( match ) { - namespaces = match[0]; - type = type.replace( rnamespaces, "" ); - } - - if ( type === "hover" ) { - types.push( "mouseenter" + namespaces, "mouseleave" + namespaces ); - continue; - } - - preType = type; - - if ( liveMap[ type ] ) { - types.push( liveMap[ type ] + namespaces ); - type = type + namespaces; - - } else { - type = (liveMap[ type ] || type) + namespaces; - } - - if ( name === "live" ) { - // bind live handler - for ( var j = 0, l = context.length; j < l; j++ ) { - jQuery.event.add( context[j], "live." + liveConvert( type, selector ), - { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); - } - - } else { - // unbind live handler - context.unbind( "live." + liveConvert( type, selector ), fn ); - } - } - - return this; - }; -}); - -function liveHandler( event ) { - var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret, - elems = [], - selectors = [], - events = jQuery._data( this, "events" ); - - // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911) - if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) { - return; - } - - if ( event.namespace ) { - namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)"); - } - - event.liveFired = this; - - var live = events.live.slice(0); - - for ( j = 0; j < live.length; j++ ) { - handleObj = live[j]; - - if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { - selectors.push( handleObj.selector ); - - } else { - live.splice( j--, 1 ); - } - } - - match = jQuery( event.target ).closest( selectors, event.currentTarget ); - - for ( i = 0, l = match.length; i < l; i++ ) { - close = match[i]; - - for ( j = 0; j < live.length; j++ ) { - handleObj = live[j]; - - if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) { - elem = close.elem; - related = null; - - // Those two events require additional checking - if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { - event.type = handleObj.preType; - related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; - - // Make sure not to accidentally match a child element with the same selector - if ( related && jQuery.contains( elem, related ) ) { - related = elem; - } - } - - if ( !related || related !== elem ) { - elems.push({ elem: elem, handleObj: handleObj, level: close.level }); - } - } - } - } - - for ( i = 0, l = elems.length; i < l; i++ ) { - match = elems[i]; - - if ( maxLevel && match.level > maxLevel ) { - break; - } - - event.currentTarget = match.elem; - event.data = match.handleObj.data; - event.handleObj = match.handleObj; - - ret = match.handleObj.origHandler.apply( match.elem, arguments ); - - if ( ret === false || event.isPropagationStopped() ) { - maxLevel = match.level; - - if ( ret === false ) { - stop = false; - } - if ( event.isImmediatePropagationStopped() ) { - break; - } - } - } - - return stop; -} - -function liveConvert( type, selector ) { - return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&"); -} - -jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + - "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + - "change select submit keydown keypress keyup error").split(" "), function( i, name ) { - - // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - if ( fn == null ) { - fn = data; - data = null; - } - - return arguments.length > 0 ? - this.bind( name, data, fn ) : - this.trigger( name ); - }; - - if ( jQuery.attrFn ) { - jQuery.attrFn[ name ] = true; - } -}); - - - -/*! - * Sizzle CSS Selector Engine - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * More information: http://sizzlejs.com/ - */ -(function(){ - -var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, - done = 0, - toString = Object.prototype.toString, - hasDuplicate = false, - baseHasDuplicate = true, - rBackslash = /\\/g, - rNonWord = /\W/; - -// Here we check if the JavaScript engine is using some sort of -// optimization where it does not always call our comparision -// function. If that is the case, discard the hasDuplicate value. -// Thus far that includes Google Chrome. -[0, 0].sort(function() { - baseHasDuplicate = false; - return 0; -}); - -var Sizzle = function( selector, context, results, seed ) { - results = results || []; - context = context || document; - - var origContext = context; - - if ( context.nodeType !== 1 && context.nodeType !== 9 ) { - return []; - } - - if ( !selector || typeof selector !== "string" ) { - return results; - } - - var m, set, checkSet, extra, ret, cur, pop, i, - prune = true, - contextXML = Sizzle.isXML( context ), - parts = [], - soFar = selector; - - // Reset the position of the chunker regexp (start from head) - do { - chunker.exec( "" ); - m = chunker.exec( soFar ); - - if ( m ) { - soFar = m[3]; - - parts.push( m[1] ); - - if ( m[2] ) { - extra = m[3]; - break; - } - } - } while ( m ); - - if ( parts.length > 1 && origPOS.exec( selector ) ) { - - if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { - set = posProcess( parts[0] + parts[1], context ); - - } else { - set = Expr.relative[ parts[0] ] ? - [ context ] : - Sizzle( parts.shift(), context ); - - while ( parts.length ) { - selector = parts.shift(); - - if ( Expr.relative[ selector ] ) { - selector += parts.shift(); - } - - set = posProcess( selector, set ); - } - } - - } else { - // Take a shortcut and set the context if the root selector is an ID - // (but not if it'll be faster if the inner selector is an ID) - if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && - Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { - - ret = Sizzle.find( parts.shift(), context, contextXML ); - context = ret.expr ? - Sizzle.filter( ret.expr, ret.set )[0] : - ret.set[0]; - } - - if ( context ) { - ret = seed ? - { expr: parts.pop(), set: makeArray(seed) } : - Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); - - set = ret.expr ? - Sizzle.filter( ret.expr, ret.set ) : - ret.set; - - if ( parts.length > 0 ) { - checkSet = makeArray( set ); - - } else { - prune = false; - } - - while ( parts.length ) { - cur = parts.pop(); - pop = cur; - - if ( !Expr.relative[ cur ] ) { - cur = ""; - } else { - pop = parts.pop(); - } - - if ( pop == null ) { - pop = context; - } - - Expr.relative[ cur ]( checkSet, pop, contextXML ); - } - - } else { - checkSet = parts = []; - } - } - - if ( !checkSet ) { - checkSet = set; - } - - if ( !checkSet ) { - Sizzle.error( cur || selector ); - } - - if ( toString.call(checkSet) === "[object Array]" ) { - if ( !prune ) { - results.push.apply( results, checkSet ); - - } else if ( context && context.nodeType === 1 ) { - for ( i = 0; checkSet[i] != null; i++ ) { - if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { - results.push( set[i] ); - } - } - - } else { - for ( i = 0; checkSet[i] != null; i++ ) { - if ( checkSet[i] && checkSet[i].nodeType === 1 ) { - results.push( set[i] ); - } - } - } - - } else { - makeArray( checkSet, results ); - } - - if ( extra ) { - Sizzle( extra, origContext, results, seed ); - Sizzle.uniqueSort( results ); - } - - return results; -}; - -Sizzle.uniqueSort = function( results ) { - if ( sortOrder ) { - hasDuplicate = baseHasDuplicate; - results.sort( sortOrder ); - - if ( hasDuplicate ) { - for ( var i = 1; i < results.length; i++ ) { - if ( results[i] === results[ i - 1 ] ) { - results.splice( i--, 1 ); - } - } - } - } - - return results; -}; - -Sizzle.matches = function( expr, set ) { - return Sizzle( expr, null, null, set ); -}; - -Sizzle.matchesSelector = function( node, expr ) { - return Sizzle( expr, null, null, [node] ).length > 0; -}; - -Sizzle.find = function( expr, context, isXML ) { - var set; - - if ( !expr ) { - return []; - } - - for ( var i = 0, l = Expr.order.length; i < l; i++ ) { - var match, - type = Expr.order[i]; - - if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { - var left = match[1]; - match.splice( 1, 1 ); - - if ( left.substr( left.length - 1 ) !== "\\" ) { - match[1] = (match[1] || "").replace( rBackslash, "" ); - set = Expr.find[ type ]( match, context, isXML ); - - if ( set != null ) { - expr = expr.replace( Expr.match[ type ], "" ); - break; - } - } - } - } - - if ( !set ) { - set = typeof context.getElementsByTagName !== "undefined" ? - context.getElementsByTagName( "*" ) : - []; - } - - return { set: set, expr: expr }; -}; - -Sizzle.filter = function( expr, set, inplace, not ) { - var match, anyFound, - old = expr, - result = [], - curLoop = set, - isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); - - while ( expr && set.length ) { - for ( var type in Expr.filter ) { - if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { - var found, item, - filter = Expr.filter[ type ], - left = match[1]; - - anyFound = false; - - match.splice(1,1); - - if ( left.substr( left.length - 1 ) === "\\" ) { - continue; - } - - if ( curLoop === result ) { - result = []; - } - - if ( Expr.preFilter[ type ] ) { - match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); - - if ( !match ) { - anyFound = found = true; - - } else if ( match === true ) { - continue; - } - } - - if ( match ) { - for ( var i = 0; (item = curLoop[i]) != null; i++ ) { - if ( item ) { - found = filter( item, match, i, curLoop ); - var pass = not ^ !!found; - - if ( inplace && found != null ) { - if ( pass ) { - anyFound = true; - - } else { - curLoop[i] = false; - } - - } else if ( pass ) { - result.push( item ); - anyFound = true; - } - } - } - } - - if ( found !== undefined ) { - if ( !inplace ) { - curLoop = result; - } - - expr = expr.replace( Expr.match[ type ], "" ); - - if ( !anyFound ) { - return []; - } - - break; - } - } - } - - // Improper expression - if ( expr === old ) { - if ( anyFound == null ) { - Sizzle.error( expr ); - - } else { - break; - } - } - - old = expr; - } - - return curLoop; -}; - -Sizzle.error = function( msg ) { - throw "Syntax error, unrecognized expression: " + msg; -}; - -var Expr = Sizzle.selectors = { - order: [ "ID", "NAME", "TAG" ], - - match: { - ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, - ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, - TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, - CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, - POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, - PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ - }, - - leftMatch: {}, - - attrMap: { - "class": "className", - "for": "htmlFor" - }, - - attrHandle: { - href: function( elem ) { - return elem.getAttribute( "href" ); - }, - type: function( elem ) { - return elem.getAttribute( "type" ); - } - }, - - relative: { - "+": function(checkSet, part){ - var isPartStr = typeof part === "string", - isTag = isPartStr && !rNonWord.test( part ), - isPartStrNotTag = isPartStr && !isTag; - - if ( isTag ) { - part = part.toLowerCase(); - } - - for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { - if ( (elem = checkSet[i]) ) { - while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} - - checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? - elem || false : - elem === part; - } - } - - if ( isPartStrNotTag ) { - Sizzle.filter( part, checkSet, true ); - } - }, - - ">": function( checkSet, part ) { - var elem, - isPartStr = typeof part === "string", - i = 0, - l = checkSet.length; - - if ( isPartStr && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - - for ( ; i < l; i++ ) { - elem = checkSet[i]; - - if ( elem ) { - var parent = elem.parentNode; - checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; - } - } - - } else { - for ( ; i < l; i++ ) { - elem = checkSet[i]; - - if ( elem ) { - checkSet[i] = isPartStr ? - elem.parentNode : - elem.parentNode === part; - } - } - - if ( isPartStr ) { - Sizzle.filter( part, checkSet, true ); - } - } - }, - - "": function(checkSet, part, isXML){ - var nodeCheck, - doneName = done++, - checkFn = dirCheck; - - if ( typeof part === "string" && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } - - checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); - }, - - "~": function( checkSet, part, isXML ) { - var nodeCheck, - doneName = done++, - checkFn = dirCheck; - - if ( typeof part === "string" && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } - - checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); - } - }, - - find: { - ID: function( match, context, isXML ) { - if ( typeof context.getElementById !== "undefined" && !isXML ) { - var m = context.getElementById(match[1]); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [m] : []; - } - }, - - NAME: function( match, context ) { - if ( typeof context.getElementsByName !== "undefined" ) { - var ret = [], - results = context.getElementsByName( match[1] ); - - for ( var i = 0, l = results.length; i < l; i++ ) { - if ( results[i].getAttribute("name") === match[1] ) { - ret.push( results[i] ); - } - } - - return ret.length === 0 ? null : ret; - } - }, - - TAG: function( match, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( match[1] ); - } - } - }, - preFilter: { - CLASS: function( match, curLoop, inplace, result, not, isXML ) { - match = " " + match[1].replace( rBackslash, "" ) + " "; - - if ( isXML ) { - return match; - } - - for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { - if ( elem ) { - if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { - if ( !inplace ) { - result.push( elem ); - } - - } else if ( inplace ) { - curLoop[i] = false; - } - } - } - - return false; - }, - - ID: function( match ) { - return match[1].replace( rBackslash, "" ); - }, - - TAG: function( match, curLoop ) { - return match[1].replace( rBackslash, "" ).toLowerCase(); - }, - - CHILD: function( match ) { - if ( match[1] === "nth" ) { - if ( !match[2] ) { - Sizzle.error( match[0] ); - } - - match[2] = match[2].replace(/^\+|\s*/g, ''); - - // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' - var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( - match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || - !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); - - // calculate the numbers (first)n+(last) including if they are negative - match[2] = (test[1] + (test[2] || 1)) - 0; - match[3] = test[3] - 0; - } - else if ( match[2] ) { - Sizzle.error( match[0] ); - } - - // TODO: Move to normal caching system - match[0] = done++; - - return match; - }, - - ATTR: function( match, curLoop, inplace, result, not, isXML ) { - var name = match[1] = match[1].replace( rBackslash, "" ); - - if ( !isXML && Expr.attrMap[name] ) { - match[1] = Expr.attrMap[name]; - } - - // Handle if an un-quoted value was used - match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); - - if ( match[2] === "~=" ) { - match[4] = " " + match[4] + " "; - } - - return match; - }, - - PSEUDO: function( match, curLoop, inplace, result, not ) { - if ( match[1] === "not" ) { - // If we're dealing with a complex expression, or a simple one - if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { - match[3] = Sizzle(match[3], null, null, curLoop); - - } else { - var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); - - if ( !inplace ) { - result.push.apply( result, ret ); - } - - return false; - } - - } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { - return true; - } - - return match; - }, - - POS: function( match ) { - match.unshift( true ); - - return match; - } - }, - - filters: { - enabled: function( elem ) { - return elem.disabled === false && elem.type !== "hidden"; - }, - - disabled: function( elem ) { - return elem.disabled === true; - }, - - checked: function( elem ) { - return elem.checked === true; - }, - - selected: function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - parent: function( elem ) { - return !!elem.firstChild; - }, - - empty: function( elem ) { - return !elem.firstChild; - }, - - has: function( elem, i, match ) { - return !!Sizzle( match[3], elem ).length; - }, - - header: function( elem ) { - return (/h\d/i).test( elem.nodeName ); - }, - - text: function( elem ) { - var attr = elem.getAttribute( "type" ), type = elem.type; - // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) - // use getAttribute instead to test this case - return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); - }, - - radio: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; - }, - - checkbox: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; - }, - - file: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; - }, - - password: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; - }, - - submit: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && "submit" === elem.type; - }, - - image: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; - }, - - reset: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && "reset" === elem.type; - }, - - button: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && "button" === elem.type || name === "button"; - }, - - input: function( elem ) { - return (/input|select|textarea|button/i).test( elem.nodeName ); - }, - - focus: function( elem ) { - return elem === elem.ownerDocument.activeElement; - } - }, - setFilters: { - first: function( elem, i ) { - return i === 0; - }, - - last: function( elem, i, match, array ) { - return i === array.length - 1; - }, - - even: function( elem, i ) { - return i % 2 === 0; - }, - - odd: function( elem, i ) { - return i % 2 === 1; - }, - - lt: function( elem, i, match ) { - return i < match[3] - 0; - }, - - gt: function( elem, i, match ) { - return i > match[3] - 0; - }, - - nth: function( elem, i, match ) { - return match[3] - 0 === i; - }, - - eq: function( elem, i, match ) { - return match[3] - 0 === i; - } - }, - filter: { - PSEUDO: function( elem, match, i, array ) { - var name = match[1], - filter = Expr.filters[ name ]; - - if ( filter ) { - return filter( elem, i, match, array ); - - } else if ( name === "contains" ) { - return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0; - - } else if ( name === "not" ) { - var not = match[3]; - - for ( var j = 0, l = not.length; j < l; j++ ) { - if ( not[j] === elem ) { - return false; - } - } - - return true; - - } else { - Sizzle.error( name ); - } - }, - - CHILD: function( elem, match ) { - var type = match[1], - node = elem; - - switch ( type ) { - case "only": - case "first": - while ( (node = node.previousSibling) ) { - if ( node.nodeType === 1 ) { - return false; - } - } - - if ( type === "first" ) { - return true; - } - - node = elem; - - case "last": - while ( (node = node.nextSibling) ) { - if ( node.nodeType === 1 ) { - return false; - } - } - - return true; - - case "nth": - var first = match[2], - last = match[3]; - - if ( first === 1 && last === 0 ) { - return true; - } - - var doneName = match[0], - parent = elem.parentNode; - - if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { - var count = 0; - - for ( node = parent.firstChild; node; node = node.nextSibling ) { - if ( node.nodeType === 1 ) { - node.nodeIndex = ++count; - } - } - - parent.sizcache = doneName; - } - - var diff = elem.nodeIndex - last; - - if ( first === 0 ) { - return diff === 0; - - } else { - return ( diff % first === 0 && diff / first >= 0 ); - } - } - }, - - ID: function( elem, match ) { - return elem.nodeType === 1 && elem.getAttribute("id") === match; - }, - - TAG: function( elem, match ) { - return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; - }, - - CLASS: function( elem, match ) { - return (" " + (elem.className || elem.getAttribute("class")) + " ") - .indexOf( match ) > -1; - }, - - ATTR: function( elem, match ) { - var name = match[1], - result = Expr.attrHandle[ name ] ? - Expr.attrHandle[ name ]( elem ) : - elem[ name ] != null ? - elem[ name ] : - elem.getAttribute( name ), - value = result + "", - type = match[2], - check = match[4]; - - return result == null ? - type === "!=" : - type === "=" ? - value === check : - type === "*=" ? - value.indexOf(check) >= 0 : - type === "~=" ? - (" " + value + " ").indexOf(check) >= 0 : - !check ? - value && result !== false : - type === "!=" ? - value !== check : - type === "^=" ? - value.indexOf(check) === 0 : - type === "$=" ? - value.substr(value.length - check.length) === check : - type === "|=" ? - value === check || value.substr(0, check.length + 1) === check + "-" : - false; - }, - - POS: function( elem, match, i, array ) { - var name = match[2], - filter = Expr.setFilters[ name ]; - - if ( filter ) { - return filter( elem, i, match, array ); - } - } - } -}; - -var origPOS = Expr.match.POS, - fescape = function(all, num){ - return "\\" + (num - 0 + 1); - }; - -for ( var type in Expr.match ) { - Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); - Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); -} - -var makeArray = function( array, results ) { - array = Array.prototype.slice.call( array, 0 ); - - if ( results ) { - results.push.apply( results, array ); - return results; - } - - return array; -}; - -// Perform a simple check to determine if the browser is capable of -// converting a NodeList to an array using builtin methods. -// Also verifies that the returned array holds DOM nodes -// (which is not the case in the Blackberry browser) -try { - Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; - -// Provide a fallback method if it does not work -} catch( e ) { - makeArray = function( array, results ) { - var i = 0, - ret = results || []; - - if ( toString.call(array) === "[object Array]" ) { - Array.prototype.push.apply( ret, array ); - - } else { - if ( typeof array.length === "number" ) { - for ( var l = array.length; i < l; i++ ) { - ret.push( array[i] ); - } - - } else { - for ( ; array[i]; i++ ) { - ret.push( array[i] ); - } - } - } - - return ret; - }; -} - -var sortOrder, siblingCheck; - -if ( document.documentElement.compareDocumentPosition ) { - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { - return a.compareDocumentPosition ? -1 : 1; - } - - return a.compareDocumentPosition(b) & 4 ? -1 : 1; - }; - -} else { - sortOrder = function( a, b ) { - // The nodes are identical, we can exit early - if ( a === b ) { - hasDuplicate = true; - return 0; - - // Fallback to using sourceIndex (in IE) if it's available on both nodes - } else if ( a.sourceIndex && b.sourceIndex ) { - return a.sourceIndex - b.sourceIndex; - } - - var al, bl, - ap = [], - bp = [], - aup = a.parentNode, - bup = b.parentNode, - cur = aup; - - // If the nodes are siblings (or identical) we can do a quick check - if ( aup === bup ) { - return siblingCheck( a, b ); - - // If no parents were found then the nodes are disconnected - } else if ( !aup ) { - return -1; - - } else if ( !bup ) { - return 1; - } - - // Otherwise they're somewhere else in the tree so we need - // to build up a full list of the parentNodes for comparison - while ( cur ) { - ap.unshift( cur ); - cur = cur.parentNode; - } - - cur = bup; - - while ( cur ) { - bp.unshift( cur ); - cur = cur.parentNode; - } - - al = ap.length; - bl = bp.length; - - // Start walking down the tree looking for a discrepancy - for ( var i = 0; i < al && i < bl; i++ ) { - if ( ap[i] !== bp[i] ) { - return siblingCheck( ap[i], bp[i] ); - } - } - - // We ended someplace up the tree so do a sibling check - return i === al ? - siblingCheck( a, bp[i], -1 ) : - siblingCheck( ap[i], b, 1 ); - }; - - siblingCheck = function( a, b, ret ) { - if ( a === b ) { - return ret; - } - - var cur = a.nextSibling; - - while ( cur ) { - if ( cur === b ) { - return -1; - } - - cur = cur.nextSibling; - } - - return 1; - }; -} - -// Utility function for retreiving the text value of an array of DOM nodes -Sizzle.getText = function( elems ) { - var ret = "", elem; - - for ( var i = 0; elems[i]; i++ ) { - elem = elems[i]; - - // Get the text from text nodes and CDATA nodes - if ( elem.nodeType === 3 || elem.nodeType === 4 ) { - ret += elem.nodeValue; - - // Traverse everything else, except comment nodes - } else if ( elem.nodeType !== 8 ) { - ret += Sizzle.getText( elem.childNodes ); - } - } - - return ret; -}; - -// Check to see if the browser returns elements by name when -// querying by getElementById (and provide a workaround) -(function(){ - // We're going to inject a fake input element with a specified name - var form = document.createElement("div"), - id = "script" + (new Date()).getTime(), - root = document.documentElement; - - form.innerHTML = ""; - - // Inject it into the root element, check its status, and remove it quickly - root.insertBefore( form, root.firstChild ); - - // The workaround has to do additional checks after a getElementById - // Which slows things down for other browsers (hence the branching) - if ( document.getElementById( id ) ) { - Expr.find.ID = function( match, context, isXML ) { - if ( typeof context.getElementById !== "undefined" && !isXML ) { - var m = context.getElementById(match[1]); - - return m ? - m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? - [m] : - undefined : - []; - } - }; - - Expr.filter.ID = function( elem, match ) { - var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); - - return elem.nodeType === 1 && node && node.nodeValue === match; - }; - } - - root.removeChild( form ); - - // release memory in IE - root = form = null; -})(); - -(function(){ - // Check to see if the browser returns only elements - // when doing getElementsByTagName("*") - - // Create a fake element - var div = document.createElement("div"); - div.appendChild( document.createComment("") ); - - // Make sure no comments are found - if ( div.getElementsByTagName("*").length > 0 ) { - Expr.find.TAG = function( match, context ) { - var results = context.getElementsByTagName( match[1] ); - - // Filter out possible comments - if ( match[1] === "*" ) { - var tmp = []; - - for ( var i = 0; results[i]; i++ ) { - if ( results[i].nodeType === 1 ) { - tmp.push( results[i] ); - } - } - - results = tmp; - } - - return results; - }; - } - - // Check to see if an attribute returns normalized href attributes - div.innerHTML = ""; - - if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && - div.firstChild.getAttribute("href") !== "#" ) { - - Expr.attrHandle.href = function( elem ) { - return elem.getAttribute( "href", 2 ); - }; - } - - // release memory in IE - div = null; -})(); - -if ( document.querySelectorAll ) { - (function(){ - var oldSizzle = Sizzle, - div = document.createElement("div"), - id = "__sizzle__"; - - div.innerHTML = "

      "; - - // Safari can't handle uppercase or unicode characters when - // in quirks mode. - if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { - return; - } - - Sizzle = function( query, context, extra, seed ) { - context = context || document; - - // Only use querySelectorAll on non-XML documents - // (ID selectors don't work in non-HTML documents) - if ( !seed && !Sizzle.isXML(context) ) { - // See if we find a selector to speed up - var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); - - if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { - // Speed-up: Sizzle("TAG") - if ( match[1] ) { - return makeArray( context.getElementsByTagName( query ), extra ); - - // Speed-up: Sizzle(".CLASS") - } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { - return makeArray( context.getElementsByClassName( match[2] ), extra ); - } - } - - if ( context.nodeType === 9 ) { - // Speed-up: Sizzle("body") - // The body element only exists once, optimize finding it - if ( query === "body" && context.body ) { - return makeArray( [ context.body ], extra ); - - // Speed-up: Sizzle("#ID") - } else if ( match && match[3] ) { - var elem = context.getElementById( match[3] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id === match[3] ) { - return makeArray( [ elem ], extra ); - } - - } else { - return makeArray( [], extra ); - } - } - - try { - return makeArray( context.querySelectorAll(query), extra ); - } catch(qsaError) {} - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - var oldContext = context, - old = context.getAttribute( "id" ), - nid = old || id, - hasParent = context.parentNode, - relativeHierarchySelector = /^\s*[+~]/.test( query ); - - if ( !old ) { - context.setAttribute( "id", nid ); - } else { - nid = nid.replace( /'/g, "\\$&" ); - } - if ( relativeHierarchySelector && hasParent ) { - context = context.parentNode; - } - - try { - if ( !relativeHierarchySelector || hasParent ) { - return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); - } - - } catch(pseudoError) { - } finally { - if ( !old ) { - oldContext.removeAttribute( "id" ); - } - } - } - } - - return oldSizzle(query, context, extra, seed); - }; - - for ( var prop in oldSizzle ) { - Sizzle[ prop ] = oldSizzle[ prop ]; - } - - // release memory in IE - div = null; - })(); -} - -(function(){ - var html = document.documentElement, - matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; - - if ( matches ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9 fails this) - var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), - pseudoWorks = false; - - try { - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( document.documentElement, "[test!='']:sizzle" ); - - } catch( pseudoError ) { - pseudoWorks = true; - } - - Sizzle.matchesSelector = function( node, expr ) { - // Make sure that attribute selectors are quoted - expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); - - if ( !Sizzle.isXML( node ) ) { - try { - if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { - var ret = matches.call( node, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || !disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9, so check for that - node.document && node.document.nodeType !== 11 ) { - return ret; - } - } - } catch(e) {} - } - - return Sizzle(expr, null, null, [node]).length > 0; - }; - } -})(); - -(function(){ - var div = document.createElement("div"); - - div.innerHTML = "
      "; - - // Opera can't find a second classname (in 9.6) - // Also, make sure that getElementsByClassName actually exists - if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { - return; - } - - // Safari caches class attributes, doesn't catch changes (in 3.2) - div.lastChild.className = "e"; - - if ( div.getElementsByClassName("e").length === 1 ) { - return; - } - - Expr.order.splice(1, 0, "CLASS"); - Expr.find.CLASS = function( match, context, isXML ) { - if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { - return context.getElementsByClassName(match[1]); - } - }; - - // release memory in IE - div = null; -})(); - -function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { - for ( var i = 0, l = checkSet.length; i < l; i++ ) { - var elem = checkSet[i]; - - if ( elem ) { - var match = false; - - elem = elem[dir]; - - while ( elem ) { - if ( elem.sizcache === doneName ) { - match = checkSet[elem.sizset]; - break; - } - - if ( elem.nodeType === 1 && !isXML ){ - elem.sizcache = doneName; - elem.sizset = i; - } - - if ( elem.nodeName.toLowerCase() === cur ) { - match = elem; - break; - } - - elem = elem[dir]; - } - - checkSet[i] = match; - } - } -} - -function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { - for ( var i = 0, l = checkSet.length; i < l; i++ ) { - var elem = checkSet[i]; - - if ( elem ) { - var match = false; - - elem = elem[dir]; - - while ( elem ) { - if ( elem.sizcache === doneName ) { - match = checkSet[elem.sizset]; - break; - } - - if ( elem.nodeType === 1 ) { - if ( !isXML ) { - elem.sizcache = doneName; - elem.sizset = i; - } - - if ( typeof cur !== "string" ) { - if ( elem === cur ) { - match = true; - break; - } - - } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { - match = elem; - break; - } - } - - elem = elem[dir]; - } - - checkSet[i] = match; - } - } -} - -if ( document.documentElement.contains ) { - Sizzle.contains = function( a, b ) { - return a !== b && (a.contains ? a.contains(b) : true); - }; - -} else if ( document.documentElement.compareDocumentPosition ) { - Sizzle.contains = function( a, b ) { - return !!(a.compareDocumentPosition(b) & 16); - }; - -} else { - Sizzle.contains = function() { - return false; - }; -} - -Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; - - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -var posProcess = function( selector, context ) { - var match, - tmpSet = [], - later = "", - root = context.nodeType ? [context] : context; - - // Position selectors must be done after the filter - // And so must :not(positional) so we move all PSEUDOs to the end - while ( (match = Expr.match.PSEUDO.exec( selector )) ) { - later += match[0]; - selector = selector.replace( Expr.match.PSEUDO, "" ); - } - - selector = Expr.relative[selector] ? selector + "*" : selector; - - for ( var i = 0, l = root.length; i < l; i++ ) { - Sizzle( selector, root[i], tmpSet ); - } - - return Sizzle.filter( later, tmpSet ); -}; - -// EXPOSE -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.filters; -jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - -})(); - - -var runtil = /Until$/, - rparentsprev = /^(?:parents|prevUntil|prevAll)/, - // Note: This RegExp should be improved, or likely pulled from Sizzle - rmultiselector = /,/, - isSimple = /^.[^:#\[\.,]*$/, - slice = Array.prototype.slice, - POS = jQuery.expr.match.POS, - // methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend({ - find: function( selector ) { - var self = this, - i, l; - - if ( typeof selector !== "string" ) { - return jQuery( selector ).filter(function() { - for ( i = 0, l = self.length; i < l; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - }); - } - - var ret = this.pushStack( "", "find", selector ), - length, n, r; - - for ( i = 0, l = this.length; i < l; i++ ) { - length = ret.length; - jQuery.find( selector, this[i], ret ); - - if ( i > 0 ) { - // Make sure that the results are unique - for ( n = length; n < ret.length; n++ ) { - for ( r = 0; r < length; r++ ) { - if ( ret[r] === ret[n] ) { - ret.splice(n--, 1); - break; - } - } - } - } - } - - return ret; - }, - - has: function( target ) { - var targets = jQuery( target ); - return this.filter(function() { - for ( var i = 0, l = targets.length; i < l; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { - return true; - } - } - }); - }, - - not: function( selector ) { - return this.pushStack( winnow(this, selector, false), "not", selector); - }, - - filter: function( selector ) { - return this.pushStack( winnow(this, selector, true), "filter", selector ); - }, - - is: function( selector ) { - return !!selector && ( typeof selector === "string" ? - jQuery.filter( selector, this ).length > 0 : - this.filter( selector ).length > 0 ); - }, - - closest: function( selectors, context ) { - var ret = [], i, l, cur = this[0]; - - // Array - if ( jQuery.isArray( selectors ) ) { - var match, selector, - matches = {}, - level = 1; - - if ( cur && selectors.length ) { - for ( i = 0, l = selectors.length; i < l; i++ ) { - selector = selectors[i]; - - if ( !matches[ selector ] ) { - matches[ selector ] = POS.test( selector ) ? - jQuery( selector, context || this.context ) : - selector; - } - } - - while ( cur && cur.ownerDocument && cur !== context ) { - for ( selector in matches ) { - match = matches[ selector ]; - - if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) { - ret.push({ selector: selector, elem: cur, level: level }); - } - } - - cur = cur.parentNode; - level++; - } - } - - return ret; - } - - // String - var pos = POS.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; - - for ( i = 0, l = this.length; i < l; i++ ) { - cur = this[i]; - - while ( cur ) { - if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { - ret.push( cur ); - break; - - } else { - cur = cur.parentNode; - if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { - break; - } - } - } - } - - ret = ret.length > 1 ? jQuery.unique( ret ) : ret; - - return this.pushStack( ret, "closest", selectors ); - }, - - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { - if ( !elem || typeof elem === "string" ) { - return jQuery.inArray( this[0], - // If it receives a string, the selector is used - // If it receives nothing, the siblings are used - elem ? jQuery( elem ) : this.parent().children() ); - } - // Locate the position of the desired element - return jQuery.inArray( - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[0] : elem, this ); - }, - - add: function( selector, context ) { - var set = typeof selector === "string" ? - jQuery( selector, context ) : - jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), - all = jQuery.merge( this.get(), set ); - - return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? - all : - jQuery.unique( all ) ); - }, - - andSelf: function() { - return this.add( this.prevObject ); - } -}); - -// A painfully simple check to see if an element is disconnected -// from a document (should be improved, where feasible). -function isDisconnected( node ) { - return !node || !node.parentNode || node.parentNode.nodeType === 11; -} - -jQuery.each({ - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return jQuery.nth( elem, 2, "nextSibling" ); - }, - prev: function( elem ) { - return jQuery.nth( elem, 2, "previousSibling" ); - }, - nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return jQuery.sibling( elem.parentNode.firstChild, elem ); - }, - children: function( elem ) { - return jQuery.sibling( elem.firstChild ); - }, - contents: function( elem ) { - return jQuery.nodeName( elem, "iframe" ) ? - elem.contentDocument || elem.contentWindow.document : - jQuery.makeArray( elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var ret = jQuery.map( this, fn, until ), - // The variable 'args' was introduced in - // https://github.com/jquery/jquery/commit/52a0238 - // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed. - // http://code.google.com/p/v8/issues/detail?id=1050 - args = slice.call(arguments); - - if ( !runtil.test( name ) ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - ret = jQuery.filter( selector, ret ); - } - - ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; - - if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { - ret = ret.reverse(); - } - - return this.pushStack( ret, name, args.join(",") ); - }; -}); - -jQuery.extend({ - filter: function( expr, elems, not ) { - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 ? - jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : - jQuery.find.matches(expr, elems); - }, - - dir: function( elem, dir, until ) { - var matched = [], - cur = elem[ dir ]; - - while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { - if ( cur.nodeType === 1 ) { - matched.push( cur ); - } - cur = cur[dir]; - } - return matched; - }, - - nth: function( cur, result, dir, elem ) { - result = result || 1; - var num = 0; - - for ( ; cur; cur = cur[dir] ) { - if ( cur.nodeType === 1 && ++num === result ) { - break; - } - } - - return cur; - }, - - sibling: function( n, elem ) { - var r = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - r.push( n ); - } - } - - return r; - } -}); - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, keep ) { - - // Can't pass null or undefined to indexOf in Firefox 4 - // Set to 0 to skip string check - qualifier = qualifier || 0; - - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep(elements, function( elem, i ) { - var retVal = !!qualifier.call( elem, i, elem ); - return retVal === keep; - }); - - } else if ( qualifier.nodeType ) { - return jQuery.grep(elements, function( elem, i ) { - return (elem === qualifier) === keep; - }); - - } else if ( typeof qualifier === "string" ) { - var filtered = jQuery.grep(elements, function( elem ) { - return elem.nodeType === 1; - }); - - if ( isSimple.test( qualifier ) ) { - return jQuery.filter(qualifier, filtered, !keep); - } else { - qualifier = jQuery.filter( qualifier, filtered ); - } - } - - return jQuery.grep(elements, function( elem, i ) { - return (jQuery.inArray( elem, qualifier ) >= 0) === keep; - }); -} - - - - -var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, - rleadingWhitespace = /^\s+/, - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, - rtagName = /<([\w:]+)/, - rtbody = /", "" ], - legend: [ 1, "
      ", "
      " ], - thead: [ 1, "", "
      " ], - tr: [ 2, "", "
      " ], - td: [ 3, "", "
      " ], - col: [ 2, "", "
      " ], - area: [ 1, "", "" ], - _default: [ 0, "", "" ] - }; - -wrapMap.optgroup = wrapMap.option; -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// IE can't serialize and - - - - - - diff --git a/node_modules/express/node_modules/debug/example/wildcards.js b/node_modules/express/node_modules/debug/example/wildcards.js deleted file mode 100644 index 1fdac20..0000000 --- a/node_modules/express/node_modules/debug/example/wildcards.js +++ /dev/null @@ -1,10 +0,0 @@ - -var debug = { - foo: require('../')('test:foo'), - bar: require('../')('test:bar'), - baz: require('../')('test:baz') -}; - -debug.foo('foo') -debug.bar('bar') -debug.baz('baz') \ No newline at end of file diff --git a/node_modules/express/node_modules/debug/example/worker.js b/node_modules/express/node_modules/debug/example/worker.js deleted file mode 100644 index 7f6d288..0000000 --- a/node_modules/express/node_modules/debug/example/worker.js +++ /dev/null @@ -1,22 +0,0 @@ - -// DEBUG=* node example/worker -// DEBUG=worker:* node example/worker -// DEBUG=worker:a node example/worker -// DEBUG=worker:b node example/worker - -var a = require('../')('worker:a') - , b = require('../')('worker:b'); - -function work() { - a('doing lots of uninteresting work'); - setTimeout(work, Math.random() * 1000); -} - -work(); - -function workb() { - b('doing some work'); - setTimeout(workb, Math.random() * 2000); -} - -workb(); \ No newline at end of file diff --git a/node_modules/express/node_modules/debug/index.js b/node_modules/express/node_modules/debug/index.js deleted file mode 100644 index e02c13b..0000000 --- a/node_modules/express/node_modules/debug/index.js +++ /dev/null @@ -1,5 +0,0 @@ -if ('undefined' == typeof window) { - module.exports = require('./lib/debug'); -} else { - module.exports = require('./debug'); -} diff --git a/node_modules/express/node_modules/debug/lib/debug.js b/node_modules/express/node_modules/debug/lib/debug.js deleted file mode 100644 index 0b07aa1..0000000 --- a/node_modules/express/node_modules/debug/lib/debug.js +++ /dev/null @@ -1,134 +0,0 @@ -/** - * Module dependencies. - */ - -var tty = require('tty'); - -/** - * Expose `debug()` as the module. - */ - -module.exports = debug; - -/** - * Enabled debuggers. - */ - -var names = [] - , skips = []; - -(process.env.DEBUG || '') - .split(/[\s,]+/) - .forEach(function(name){ - name = name.replace('*', '.*?'); - if (name[0] === '-') { - skips.push(new RegExp('^' + name.substr(1) + '$')); - } else { - names.push(new RegExp('^' + name + '$')); - } - }); - -/** - * Colors. - */ - -var colors = [6, 2, 3, 4, 5, 1]; - -/** - * Previous debug() call. - */ - -var prev = {}; - -/** - * Previously assigned color. - */ - -var prevColor = 0; - -/** - * Is stdout a TTY? Colored output is disabled when `true`. - */ - -var isatty = tty.isatty(2); - -/** - * Select a color. - * - * @return {Number} - * @api private - */ - -function color() { - return colors[prevColor++ % colors.length]; -} - -/** - * Humanize the given `ms`. - * - * @param {Number} m - * @return {String} - * @api private - */ - -function humanize(ms) { - var sec = 1000 - , min = 60 * 1000 - , hour = 60 * min; - - if (ms >= hour) return (ms / hour).toFixed(1) + 'h'; - if (ms >= min) return (ms / min).toFixed(1) + 'm'; - if (ms >= sec) return (ms / sec | 0) + 's'; - return ms + 'ms'; -} - -/** - * Create a debugger with the given `name`. - * - * @param {String} name - * @return {Type} - * @api public - */ - -function debug(name) { - function disabled(){} - disabled.enabled = false; - - var match = skips.some(function(re){ - return re.test(name); - }); - - if (match) return disabled; - - match = names.some(function(re){ - return re.test(name); - }); - - if (!match) return disabled; - var c = color(); - - function colored(fmt) { - var curr = new Date; - var ms = curr - (prev[name] || curr); - prev[name] = curr; - - fmt = ' \u001b[9' + c + 'm' + name + ' ' - + '\u001b[3' + c + 'm\u001b[90m' - + fmt + '\u001b[3' + c + 'm' - + ' +' + humanize(ms) + '\u001b[0m'; - - console.error.apply(this, arguments); - } - - function plain(fmt) { - fmt = new Date().toUTCString() - + ' ' + name + ' ' + fmt; - console.error.apply(this, arguments); - } - - colored.enabled = plain.enabled = true; - - return isatty || process.env.DEBUG_COLORS - ? colored - : plain; -} diff --git a/node_modules/express/node_modules/debug/package.json b/node_modules/express/node_modules/debug/package.json deleted file mode 100644 index 2f6302d..0000000 --- a/node_modules/express/node_modules/debug/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "debug", - "version": "0.7.2", - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/debug.git" - }, - "description": "small debugging utility", - "keywords": [ - "debug", - "log", - "debugger" - ], - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "dependencies": {}, - "devDependencies": { - "mocha": "*" - }, - "main": "lib/debug.js", - "browserify": "debug.js", - "engines": { - "node": "*" - }, - "component": { - "scripts": { - "debug/index.js": "index.js", - "debug/debug.js": "debug.js" - } - }, - "readme": "\n# debug\n\n tiny node.js debugging utility modelled after node core's debugging technique.\n\n## Installation\n\n```\n$ npm install debug\n```\n\n## Usage\n\n With `debug` you simply invoke the exported function to generate your debug function, passing it a name which will determine if a noop function is returned, or a decorated `console.error`, so all of the `console` format string goodies you're used to work fine. A unique color is selected per-function for visibility.\n \nExample _app.js_:\n\n```js\nvar debug = require('debug')('http')\n , http = require('http')\n , name = 'My App';\n\n// fake app\n\ndebug('booting %s', name);\n\nhttp.createServer(function(req, res){\n debug(req.method + ' ' + req.url);\n res.end('hello\\n');\n}).listen(3000, function(){\n debug('listening');\n});\n\n// fake worker of some kind\n\nrequire('./worker');\n```\n\nExample _worker.js_:\n\n```js\nvar debug = require('debug')('worker');\n\nsetInterval(function(){\n debug('doing some work');\n}, 1000);\n```\n\n The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples:\n\n ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png)\n\n ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png)\n\n## Millisecond diff\n\n When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the \"+NNNms\" will show you how much time was spent between calls.\n\n ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png)\n\n When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below:\n \n ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png)\n\n## Conventions\n\n If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use \":\" to separate features. For example \"bodyParser\" from Connect would then be \"connect:bodyParser\". \n\n## Wildcards\n\n The \"*\" character may be used as a wildcard. Suppose for example your library has debuggers named \"connect:bodyParser\", \"connect:compress\", \"connect:session\", instead of listing all three with `DEBUG=connect:bodyParser,connect.compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`.\n\n You can also exclude specific debuggers by prefixing them with a \"-\" character. For example, `DEBUG=* -connect:*` would include all debuggers except those starting with \"connect:\".\n\n## Browser support\n\n Debug works in the browser as well, currently persisted by `localStorage`. For example if you have `worker:a` and `worker:b` as shown below, and wish to debug both type `debug.enable('worker:*')` in the console and refresh the page, this will remain until you disable with `debug.disable()`. \n\n```js\na = debug('worker:a');\nb = debug('worker:b');\n\nsetInterval(function(){\n a('doing some work');\n}, 1000);\n\nsetInterval(function(){\n a('doing some work');\n}, 1200);\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", - "_id": "debug@0.7.2", - "_from": "debug@*" -} diff --git a/node_modules/express/node_modules/fresh/.npmignore b/node_modules/express/node_modules/fresh/.npmignore deleted file mode 100644 index 9daeafb..0000000 --- a/node_modules/express/node_modules/fresh/.npmignore +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/node_modules/express/node_modules/fresh/Makefile b/node_modules/express/node_modules/fresh/Makefile deleted file mode 100644 index 8e8640f..0000000 --- a/node_modules/express/node_modules/fresh/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - -test: - @./node_modules/.bin/mocha \ - --reporter spec \ - --require should - -.PHONY: test \ No newline at end of file diff --git a/node_modules/express/node_modules/fresh/Readme.md b/node_modules/express/node_modules/fresh/Readme.md deleted file mode 100644 index 273130d..0000000 --- a/node_modules/express/node_modules/fresh/Readme.md +++ /dev/null @@ -1,32 +0,0 @@ - -# node-fresh - - HTTP response freshness testing - -## fresh(req, res) - - Check freshness of `req` and `res` headers. - - When the cache is "fresh" __true__ is returned, - otherwise __false__ is returned to indicate that - the cache is now stale. - -## Example: - -```js -var req = { 'if-none-match': 'tobi' }; -var res = { 'etag': 'luna' }; -fresh(req, res); -// => false - -var req = { 'if-none-match': 'tobi' }; -var res = { 'etag': 'tobi' }; -fresh(req, res); -// => true -``` - -## Installation - -``` -$ npm install fresh -``` \ No newline at end of file diff --git a/node_modules/express/node_modules/fresh/index.js b/node_modules/express/node_modules/fresh/index.js deleted file mode 100644 index b2f4d41..0000000 --- a/node_modules/express/node_modules/fresh/index.js +++ /dev/null @@ -1,49 +0,0 @@ - -/** - * Expose `fresh()`. - */ - -module.exports = fresh; - -/** - * Check freshness of `req` and `res` headers. - * - * When the cache is "fresh" __true__ is returned, - * otherwise __false__ is returned to indicate that - * the cache is now stale. - * - * @param {Object} req - * @param {Object} res - * @return {Boolean} - * @api public - */ - -function fresh(req, res) { - // defaults - var etagMatches = true; - var notModified = true; - - // fields - var modifiedSince = req['if-modified-since']; - var noneMatch = req['if-none-match']; - var lastModified = res['last-modified']; - var etag = res['etag']; - - // unconditional request - if (!modifiedSince && !noneMatch) return false; - - // parse if-none-match - if (noneMatch) noneMatch = noneMatch.split(/ *, */); - - // if-none-match - if (noneMatch) etagMatches = ~noneMatch.indexOf(etag) || '*' == noneMatch[0]; - - // if-modified-since - if (modifiedSince) { - modifiedSince = new Date(modifiedSince); - lastModified = new Date(lastModified); - notModified = lastModified <= modifiedSince; - } - - return !! (etagMatches && notModified); -} \ No newline at end of file diff --git a/node_modules/express/node_modules/fresh/package.json b/node_modules/express/node_modules/fresh/package.json deleted file mode 100644 index e1f985e..0000000 --- a/node_modules/express/node_modules/fresh/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "fresh", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - }, - "description": "HTTP response freshness testing", - "version": "0.1.0", - "main": "index.js", - "dependencies": {}, - "devDependencies": { - "mocha": "*", - "should": "*" - }, - "readme": "\n# node-fresh\n\n HTTP response freshness testing\n\n## fresh(req, res)\n\n Check freshness of `req` and `res` headers.\n\n When the cache is \"fresh\" __true__ is returned,\n otherwise __false__ is returned to indicate that\n the cache is now stale.\n\n## Example:\n\n```js\nvar req = { 'if-none-match': 'tobi' };\nvar res = { 'etag': 'luna' };\nfresh(req, res);\n// => false\n\nvar req = { 'if-none-match': 'tobi' };\nvar res = { 'etag': 'tobi' };\nfresh(req, res);\n// => true\n```\n\n## Installation\n\n```\n$ npm install fresh\n```", - "_id": "fresh@0.1.0", - "_from": "fresh@0.1.0" -} diff --git a/node_modules/express/node_modules/methods/index.js b/node_modules/express/node_modules/methods/index.js deleted file mode 100644 index 297d022..0000000 --- a/node_modules/express/node_modules/methods/index.js +++ /dev/null @@ -1,26 +0,0 @@ - -module.exports = [ - 'get' - , 'post' - , 'put' - , 'head' - , 'delete' - , 'options' - , 'trace' - , 'copy' - , 'lock' - , 'mkcol' - , 'move' - , 'propfind' - , 'proppatch' - , 'unlock' - , 'report' - , 'mkactivity' - , 'checkout' - , 'merge' - , 'm-search' - , 'notify' - , 'subscribe' - , 'unsubscribe' - , 'patch' -]; \ No newline at end of file diff --git a/node_modules/express/node_modules/methods/package.json b/node_modules/express/node_modules/methods/package.json deleted file mode 100644 index 341b226..0000000 --- a/node_modules/express/node_modules/methods/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "methods", - "version": "0.0.1", - "description": "HTTP methods that node supports", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [ - "http", - "methods" - ], - "author": { - "name": "TJ Holowaychuk" - }, - "license": "MIT", - "_id": "methods@0.0.1", - "readme": "ERROR: No README.md file found!", - "_from": "methods@0.0.1" -} diff --git a/node_modules/express/node_modules/mkdirp/.gitignore.orig b/node_modules/express/node_modules/mkdirp/.gitignore.orig deleted file mode 100644 index 9303c34..0000000 --- a/node_modules/express/node_modules/mkdirp/.gitignore.orig +++ /dev/null @@ -1,2 +0,0 @@ -node_modules/ -npm-debug.log \ No newline at end of file diff --git a/node_modules/express/node_modules/mkdirp/.gitignore.rej b/node_modules/express/node_modules/mkdirp/.gitignore.rej deleted file mode 100644 index 69244ff..0000000 --- a/node_modules/express/node_modules/mkdirp/.gitignore.rej +++ /dev/null @@ -1,5 +0,0 @@ ---- /dev/null -+++ .gitignore -@@ -0,0 +1,2 @@ -+node_modules/ -+npm-debug.log \ No newline at end of file diff --git a/node_modules/express/node_modules/mkdirp/.npmignore b/node_modules/express/node_modules/mkdirp/.npmignore deleted file mode 100644 index 9303c34..0000000 --- a/node_modules/express/node_modules/mkdirp/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules/ -npm-debug.log \ No newline at end of file diff --git a/node_modules/express/node_modules/mkdirp/.travis.yml b/node_modules/express/node_modules/mkdirp/.travis.yml deleted file mode 100644 index f1d0f13..0000000 --- a/node_modules/express/node_modules/mkdirp/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.4 - - 0.6 diff --git a/node_modules/express/node_modules/mkdirp/LICENSE b/node_modules/express/node_modules/mkdirp/LICENSE deleted file mode 100644 index 432d1ae..0000000 --- a/node_modules/express/node_modules/mkdirp/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -Copyright 2010 James Halliday (mail@substack.net) - -This project is free software released under the MIT/X11 license: - -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. diff --git a/node_modules/express/node_modules/mkdirp/README.markdown b/node_modules/express/node_modules/mkdirp/README.markdown deleted file mode 100644 index 40de04f..0000000 --- a/node_modules/express/node_modules/mkdirp/README.markdown +++ /dev/null @@ -1,61 +0,0 @@ -mkdirp -====== - -Like `mkdir -p`, but in node.js! - -[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](http://travis-ci.org/substack/node-mkdirp) - -example -======= - -pow.js ------- - var mkdirp = require('mkdirp'); - - mkdirp('/tmp/foo/bar/baz', function (err) { - if (err) console.error(err) - else console.log('pow!') - }); - -Output - pow! - -And now /tmp/foo/bar/baz exists, huzzah! - -methods -======= - -var mkdirp = require('mkdirp'); - -mkdirp(dir, mode, cb) ---------------------- - -Create a new directory and any necessary subdirectories at `dir` with octal -permission string `mode`. - -If `mode` isn't specified, it defaults to `0777 & (~process.umask())`. - -`cb(err, made)` fires with the error or the first directory `made` -that had to be created, if any. - -mkdirp.sync(dir, mode) ----------------------- - -Synchronously create a new directory and any necessary subdirectories at `dir` -with octal permission string `mode`. - -If `mode` isn't specified, it defaults to `0777 & (~process.umask())`. - -Returns the first directory that had to be created, if any. - -install -======= - -With [npm](http://npmjs.org) do: - - npm install mkdirp - -license -======= - -MIT/X11 diff --git a/node_modules/express/node_modules/mkdirp/examples/pow.js b/node_modules/express/node_modules/mkdirp/examples/pow.js deleted file mode 100644 index e692421..0000000 --- a/node_modules/express/node_modules/mkdirp/examples/pow.js +++ /dev/null @@ -1,6 +0,0 @@ -var mkdirp = require('mkdirp'); - -mkdirp('/tmp/foo/bar/baz', function (err) { - if (err) console.error(err) - else console.log('pow!') -}); diff --git a/node_modules/express/node_modules/mkdirp/examples/pow.js.orig b/node_modules/express/node_modules/mkdirp/examples/pow.js.orig deleted file mode 100644 index 7741462..0000000 --- a/node_modules/express/node_modules/mkdirp/examples/pow.js.orig +++ /dev/null @@ -1,6 +0,0 @@ -var mkdirp = require('mkdirp'); - -mkdirp('/tmp/foo/bar/baz', 0755, function (err) { - if (err) console.error(err) - else console.log('pow!') -}); diff --git a/node_modules/express/node_modules/mkdirp/examples/pow.js.rej b/node_modules/express/node_modules/mkdirp/examples/pow.js.rej deleted file mode 100644 index 81e7f43..0000000 --- a/node_modules/express/node_modules/mkdirp/examples/pow.js.rej +++ /dev/null @@ -1,19 +0,0 @@ ---- examples/pow.js -+++ examples/pow.js -@@ -1,6 +1,15 @@ --var mkdirp = require('mkdirp').mkdirp; -+var mkdirp = require('../').mkdirp, -+ mkdirpSync = require('../').mkdirpSync; - - mkdirp('/tmp/foo/bar/baz', 0755, function (err) { - if (err) console.error(err) - else console.log('pow!') - }); -+ -+try { -+ mkdirpSync('/tmp/bar/foo/baz', 0755); -+ console.log('double pow!'); -+} -+catch (ex) { -+ console.log(ex); -+} \ No newline at end of file diff --git a/node_modules/express/node_modules/mkdirp/index.js b/node_modules/express/node_modules/mkdirp/index.js deleted file mode 100644 index 874b310..0000000 --- a/node_modules/express/node_modules/mkdirp/index.js +++ /dev/null @@ -1,94 +0,0 @@ -var path = require('path'); -var fs = require('fs'); - -module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; - -function mkdirP (p, mode, f, made) { - if (typeof mode === 'function' || mode === undefined) { - f = mode; - mode = 0777 & (~process.umask()); - } - if (!made) made = null; - - var cb = f || function () {}; - if (typeof mode === 'string') mode = parseInt(mode, 8); - p = path.resolve(p); - - fs.mkdir(p, mode, function (er) { - if (!er) { - made = made || p; - return cb(null, made); - } - switch (er.code) { - case 'ENOENT': - mkdirP(path.dirname(p), mode, function (er, made) { - if (er) cb(er, made); - else mkdirP(p, mode, cb, made); - }); - break; - - case 'EISDIR': - case 'EPERM': - // Operation not permitted or already is a dir. - // This is the error you get when trying to mkdir('c:/') - // on windows, or mkdir('/') on unix. Make sure it's a - // dir by falling through to the EEXIST case. - case 'EROFS': - // a read-only file system. - // However, the dir could already exist, in which case - // the EROFS error will be obscuring a EEXIST! - // Fallthrough to that case. - case 'EEXIST': - fs.stat(p, function (er2, stat) { - // if the stat fails, then that's super weird. - // let the original error be the failure reason. - if (er2 || !stat.isDirectory()) cb(er, made) - else cb(null, made); - }); - break; - - default: - cb(er, made); - break; - } - }); -} - -mkdirP.sync = function sync (p, mode, made) { - if (mode === undefined) { - mode = 0777 & (~process.umask()); - } - if (!made) made = null; - - if (typeof mode === 'string') mode = parseInt(mode, 8); - p = path.resolve(p); - - try { - fs.mkdirSync(p, mode); - made = made || p; - } - catch (err0) { - switch (err0.code) { - case 'ENOENT' : - made = sync(path.dirname(p), mode, made); - sync(p, mode, made); - break; - - case 'EEXIST' : - var stat; - try { - stat = fs.statSync(p); - } - catch (err1) { - throw err0; - } - if (!stat.isDirectory()) throw err0; - break; - default : - throw err0 - break; - } - } - - return made; -}; diff --git a/node_modules/express/node_modules/mkdirp/package.json b/node_modules/express/node_modules/mkdirp/package.json deleted file mode 100644 index b5a2c99..0000000 --- a/node_modules/express/node_modules/mkdirp/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "mkdirp", - "description": "Recursively mkdir, like `mkdir -p`", - "version": "0.3.3", - "author": { - "name": "James Halliday", - "email": "mail@substack.net", - "url": "http://substack.net" - }, - "main": "./index", - "keywords": [ - "mkdir", - "directory" - ], - "repository": { - "type": "git", - "url": "http://github.com/substack/node-mkdirp.git" - }, - "scripts": { - "test": "tap test/*.js" - }, - "devDependencies": { - "tap": "~0.2.4" - }, - "license": "MIT/X11", - "engines": { - "node": "*" - }, - "readme": "mkdirp\n======\n\nLike `mkdir -p`, but in node.js!\n\n[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](http://travis-ci.org/substack/node-mkdirp)\n\nexample\n=======\n\npow.js\n------\n var mkdirp = require('mkdirp');\n \n mkdirp('/tmp/foo/bar/baz', function (err) {\n if (err) console.error(err)\n else console.log('pow!')\n });\n\nOutput\n pow!\n\nAnd now /tmp/foo/bar/baz exists, huzzah!\n\nmethods\n=======\n\nvar mkdirp = require('mkdirp');\n\nmkdirp(dir, mode, cb)\n---------------------\n\nCreate a new directory and any necessary subdirectories at `dir` with octal\npermission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\n`cb(err, made)` fires with the error or the first directory `made`\nthat had to be created, if any.\n\nmkdirp.sync(dir, mode)\n----------------------\n\nSynchronously create a new directory and any necessary subdirectories at `dir`\nwith octal permission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\nReturns the first directory that had to be created, if any.\n\ninstall\n=======\n\nWith [npm](http://npmjs.org) do:\n\n npm install mkdirp\n\nlicense\n=======\n\nMIT/X11\n", - "_id": "mkdirp@0.3.3", - "_from": "mkdirp@0.3.3" -} diff --git a/node_modules/express/node_modules/mkdirp/test/chmod.js b/node_modules/express/node_modules/mkdirp/test/chmod.js deleted file mode 100644 index 520dcb8..0000000 --- a/node_modules/express/node_modules/mkdirp/test/chmod.js +++ /dev/null @@ -1,38 +0,0 @@ -var mkdirp = require('../').mkdirp; -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -var ps = [ '', 'tmp' ]; - -for (var i = 0; i < 25; i++) { - var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - ps.push(dir); -} - -var file = ps.join('/'); - -test('chmod-pre', function (t) { - var mode = 0744 - mkdirp(file, mode, function (er) { - t.ifError(er, 'should not error'); - fs.stat(file, function (er, stat) { - t.ifError(er, 'should exist'); - t.ok(stat && stat.isDirectory(), 'should be directory'); - t.equal(stat && stat.mode & 0777, mode, 'should be 0744'); - t.end(); - }); - }); -}); - -test('chmod', function (t) { - var mode = 0755 - mkdirp(file, mode, function (er) { - t.ifError(er, 'should not error'); - fs.stat(file, function (er, stat) { - t.ifError(er, 'should exist'); - t.ok(stat && stat.isDirectory(), 'should be directory'); - t.end(); - }); - }); -}); diff --git a/node_modules/express/node_modules/mkdirp/test/clobber.js b/node_modules/express/node_modules/mkdirp/test/clobber.js deleted file mode 100644 index 0eb7099..0000000 --- a/node_modules/express/node_modules/mkdirp/test/clobber.js +++ /dev/null @@ -1,37 +0,0 @@ -var mkdirp = require('../').mkdirp; -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -var ps = [ '', 'tmp' ]; - -for (var i = 0; i < 25; i++) { - var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - ps.push(dir); -} - -var file = ps.join('/'); - -// a file in the way -var itw = ps.slice(0, 3).join('/'); - - -test('clobber-pre', function (t) { - console.error("about to write to "+itw) - fs.writeFileSync(itw, 'I AM IN THE WAY, THE TRUTH, AND THE LIGHT.'); - - fs.stat(itw, function (er, stat) { - t.ifError(er) - t.ok(stat && stat.isFile(), 'should be file') - t.end() - }) -}) - -test('clobber', function (t) { - t.plan(2); - mkdirp(file, 0755, function (err) { - t.ok(err); - t.equal(err.code, 'ENOTDIR'); - t.end(); - }); -}); diff --git a/node_modules/express/node_modules/mkdirp/test/mkdirp.js b/node_modules/express/node_modules/mkdirp/test/mkdirp.js deleted file mode 100644 index b07cd70..0000000 --- a/node_modules/express/node_modules/mkdirp/test/mkdirp.js +++ /dev/null @@ -1,28 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('woo', function (t) { - t.plan(2); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var file = '/tmp/' + [x,y,z].join('/'); - - mkdirp(file, 0755, function (err) { - if (err) t.fail(err); - else path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }) - }); -}); diff --git a/node_modules/express/node_modules/mkdirp/test/perm.js b/node_modules/express/node_modules/mkdirp/test/perm.js deleted file mode 100644 index 23a7abb..0000000 --- a/node_modules/express/node_modules/mkdirp/test/perm.js +++ /dev/null @@ -1,32 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('async perm', function (t) { - t.plan(2); - var file = '/tmp/' + (Math.random() * (1<<30)).toString(16); - - mkdirp(file, 0755, function (err) { - if (err) t.fail(err); - else path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }) - }); -}); - -test('async root perm', function (t) { - mkdirp('/tmp', 0755, function (err) { - if (err) t.fail(err); - t.end(); - }); - t.end(); -}); diff --git a/node_modules/express/node_modules/mkdirp/test/perm_sync.js b/node_modules/express/node_modules/mkdirp/test/perm_sync.js deleted file mode 100644 index f685f60..0000000 --- a/node_modules/express/node_modules/mkdirp/test/perm_sync.js +++ /dev/null @@ -1,39 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('sync perm', function (t) { - t.plan(2); - var file = '/tmp/' + (Math.random() * (1<<30)).toString(16) + '.json'; - - mkdirp.sync(file, 0755); - path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }); -}); - -test('sync root perm', function (t) { - t.plan(1); - - var file = '/tmp'; - mkdirp.sync(file, 0755); - path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }); -}); diff --git a/node_modules/express/node_modules/mkdirp/test/race.js b/node_modules/express/node_modules/mkdirp/test/race.js deleted file mode 100644 index 96a0447..0000000 --- a/node_modules/express/node_modules/mkdirp/test/race.js +++ /dev/null @@ -1,41 +0,0 @@ -var mkdirp = require('../').mkdirp; -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('race', function (t) { - t.plan(4); - var ps = [ '', 'tmp' ]; - - for (var i = 0; i < 25; i++) { - var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - ps.push(dir); - } - var file = ps.join('/'); - - var res = 2; - mk(file, function () { - if (--res === 0) t.end(); - }); - - mk(file, function () { - if (--res === 0) t.end(); - }); - - function mk (file, cb) { - mkdirp(file, 0755, function (err) { - if (err) t.fail(err); - else path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - if (cb) cb(); - } - }) - }) - }); - } -}); diff --git a/node_modules/express/node_modules/mkdirp/test/rel.js b/node_modules/express/node_modules/mkdirp/test/rel.js deleted file mode 100644 index 7985824..0000000 --- a/node_modules/express/node_modules/mkdirp/test/rel.js +++ /dev/null @@ -1,32 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('rel', function (t) { - t.plan(2); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var cwd = process.cwd(); - process.chdir('/tmp'); - - var file = [x,y,z].join('/'); - - mkdirp(file, 0755, function (err) { - if (err) t.fail(err); - else path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - process.chdir(cwd); - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }) - }); -}); diff --git a/node_modules/express/node_modules/mkdirp/test/return.js b/node_modules/express/node_modules/mkdirp/test/return.js deleted file mode 100644 index bce68e5..0000000 --- a/node_modules/express/node_modules/mkdirp/test/return.js +++ /dev/null @@ -1,25 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('return value', function (t) { - t.plan(4); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var file = '/tmp/' + [x,y,z].join('/'); - - // should return the first dir created. - // By this point, it would be profoundly surprising if /tmp didn't - // already exist, since every other test makes things in there. - mkdirp(file, function (err, made) { - t.ifError(err); - t.equal(made, '/tmp/' + x); - mkdirp(file, function (err, made) { - t.ifError(err); - t.equal(made, null); - }); - }); -}); diff --git a/node_modules/express/node_modules/mkdirp/test/return_sync.js b/node_modules/express/node_modules/mkdirp/test/return_sync.js deleted file mode 100644 index 7c222d3..0000000 --- a/node_modules/express/node_modules/mkdirp/test/return_sync.js +++ /dev/null @@ -1,24 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('return value', function (t) { - t.plan(2); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var file = '/tmp/' + [x,y,z].join('/'); - - // should return the first dir created. - // By this point, it would be profoundly surprising if /tmp didn't - // already exist, since every other test makes things in there. - // Note that this will throw on failure, which will fail the test. - var made = mkdirp.sync(file); - t.equal(made, '/tmp/' + x); - - // making the same file again should have no effect. - made = mkdirp.sync(file); - t.equal(made, null); -}); diff --git a/node_modules/express/node_modules/mkdirp/test/root.js b/node_modules/express/node_modules/mkdirp/test/root.js deleted file mode 100644 index 97ad7a2..0000000 --- a/node_modules/express/node_modules/mkdirp/test/root.js +++ /dev/null @@ -1,18 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('root', function (t) { - // '/' on unix, 'c:/' on windows. - var file = path.resolve('/'); - - mkdirp(file, 0755, function (err) { - if (err) throw err - fs.stat(file, function (er, stat) { - if (er) throw er - t.ok(stat.isDirectory(), 'target is a directory'); - t.end(); - }) - }); -}); diff --git a/node_modules/express/node_modules/mkdirp/test/sync.js b/node_modules/express/node_modules/mkdirp/test/sync.js deleted file mode 100644 index 7530cad..0000000 --- a/node_modules/express/node_modules/mkdirp/test/sync.js +++ /dev/null @@ -1,32 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('sync', function (t) { - t.plan(2); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var file = '/tmp/' + [x,y,z].join('/'); - - try { - mkdirp.sync(file, 0755); - } catch (err) { - t.fail(err); - return t.end(); - } - - path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }); - }); -}); diff --git a/node_modules/express/node_modules/mkdirp/test/umask.js b/node_modules/express/node_modules/mkdirp/test/umask.js deleted file mode 100644 index 64ccafe..0000000 --- a/node_modules/express/node_modules/mkdirp/test/umask.js +++ /dev/null @@ -1,28 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('implicit mode from umask', function (t) { - t.plan(2); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var file = '/tmp/' + [x,y,z].join('/'); - - mkdirp(file, function (err) { - if (err) t.fail(err); - else path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0777 & (~process.umask())); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }) - }); -}); diff --git a/node_modules/express/node_modules/mkdirp/test/umask_sync.js b/node_modules/express/node_modules/mkdirp/test/umask_sync.js deleted file mode 100644 index 35bd5cb..0000000 --- a/node_modules/express/node_modules/mkdirp/test/umask_sync.js +++ /dev/null @@ -1,32 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('umask sync modes', function (t) { - t.plan(2); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var file = '/tmp/' + [x,y,z].join('/'); - - try { - mkdirp.sync(file); - } catch (err) { - t.fail(err); - return t.end(); - } - - path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, (0777 & (~process.umask()))); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }); - }); -}); diff --git a/node_modules/express/node_modules/range-parser/.npmignore b/node_modules/express/node_modules/range-parser/.npmignore deleted file mode 100644 index 9daeafb..0000000 --- a/node_modules/express/node_modules/range-parser/.npmignore +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/node_modules/express/node_modules/range-parser/History.md b/node_modules/express/node_modules/range-parser/History.md deleted file mode 100644 index 82df7b1..0000000 --- a/node_modules/express/node_modules/range-parser/History.md +++ /dev/null @@ -1,15 +0,0 @@ - -0.0.4 / 2012-06-17 -================== - - * changed: ret -1 for unsatisfiable and -2 when invalid - -0.0.3 / 2012-06-17 -================== - - * fix last-byte-pos default to len - 1 - -0.0.2 / 2012-06-14 -================== - - * add `.type` diff --git a/node_modules/express/node_modules/range-parser/Makefile b/node_modules/express/node_modules/range-parser/Makefile deleted file mode 100644 index 8e8640f..0000000 --- a/node_modules/express/node_modules/range-parser/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - -test: - @./node_modules/.bin/mocha \ - --reporter spec \ - --require should - -.PHONY: test \ No newline at end of file diff --git a/node_modules/express/node_modules/range-parser/Readme.md b/node_modules/express/node_modules/range-parser/Readme.md deleted file mode 100644 index b2a67fe..0000000 --- a/node_modules/express/node_modules/range-parser/Readme.md +++ /dev/null @@ -1,28 +0,0 @@ - -# node-range-parser - - Range header field parser. - -## Example: - -```js -assert(-1 == parse(200, 'bytes=500-20')); -assert(-2 == parse(200, 'bytes=malformed')); -parse(200, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 199 }])); -parse(1000, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 499 }])); -parse(1000, 'bytes=40-80').should.eql(arr('bytes', [{ start: 40, end: 80 }])); -parse(1000, 'bytes=-500').should.eql(arr('bytes', [{ start: 500, end: 999 }])); -parse(1000, 'bytes=-400').should.eql(arr('bytes', [{ start: 600, end: 999 }])); -parse(1000, 'bytes=500-').should.eql(arr('bytes', [{ start: 500, end: 999 }])); -parse(1000, 'bytes=400-').should.eql(arr('bytes', [{ start: 400, end: 999 }])); -parse(1000, 'bytes=0-0').should.eql(arr('bytes', [{ start: 0, end: 0 }])); -parse(1000, 'bytes=-1').should.eql(arr('bytes', [{ start: 999, end: 999 }])); -parse(1000, 'items=0-5').should.eql(arr('items', [{ start: 0, end: 5 }])); -parse(1000, 'bytes=40-80,-1').should.eql(arr('bytes', [{ start: 40, end: 80 }, { start: 999, end: 999 }])); -``` - -## Installation - -``` -$ npm install range-parser -``` \ No newline at end of file diff --git a/node_modules/express/node_modules/range-parser/index.js b/node_modules/express/node_modules/range-parser/index.js deleted file mode 100644 index 9b0f7a8..0000000 --- a/node_modules/express/node_modules/range-parser/index.js +++ /dev/null @@ -1,49 +0,0 @@ - -/** - * Parse "Range" header `str` relative to the given file `size`. - * - * @param {Number} size - * @param {String} str - * @return {Array} - * @api public - */ - -module.exports = function(size, str){ - var valid = true; - var i = str.indexOf('='); - - if (-1 == i) return -2; - - var arr = str.slice(i + 1).split(',').map(function(range){ - var range = range.split('-') - , start = parseInt(range[0], 10) - , end = parseInt(range[1], 10); - - // -nnn - if (isNaN(start)) { - start = size - end; - end = size - 1; - // nnn- - } else if (isNaN(end)) { - end = size - 1; - } - - // limit last-byte-pos to current length - if (end > size - 1) end = size - 1; - - // invalid - if (isNaN(start) - || isNaN(end) - || start > end - || start < 0) valid = false; - - return { - start: start, - end: end - }; - }); - - arr.type = str.slice(0, i); - - return valid ? arr : -1; -}; \ No newline at end of file diff --git a/node_modules/express/node_modules/range-parser/package.json b/node_modules/express/node_modules/range-parser/package.json deleted file mode 100644 index 8ff3a32..0000000 --- a/node_modules/express/node_modules/range-parser/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "range-parser", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - }, - "description": "Range header field string parser", - "version": "0.0.4", - "main": "index.js", - "dependencies": {}, - "devDependencies": { - "mocha": "*", - "should": "*" - }, - "readme": "\n# node-range-parser\n\n Range header field parser.\n\n## Example:\n\n```js\nassert(-1 == parse(200, 'bytes=500-20'));\nassert(-2 == parse(200, 'bytes=malformed'));\nparse(200, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 199 }]));\nparse(1000, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 499 }]));\nparse(1000, 'bytes=40-80').should.eql(arr('bytes', [{ start: 40, end: 80 }]));\nparse(1000, 'bytes=-500').should.eql(arr('bytes', [{ start: 500, end: 999 }]));\nparse(1000, 'bytes=-400').should.eql(arr('bytes', [{ start: 600, end: 999 }]));\nparse(1000, 'bytes=500-').should.eql(arr('bytes', [{ start: 500, end: 999 }]));\nparse(1000, 'bytes=400-').should.eql(arr('bytes', [{ start: 400, end: 999 }]));\nparse(1000, 'bytes=0-0').should.eql(arr('bytes', [{ start: 0, end: 0 }]));\nparse(1000, 'bytes=-1').should.eql(arr('bytes', [{ start: 999, end: 999 }]));\nparse(1000, 'items=0-5').should.eql(arr('items', [{ start: 0, end: 5 }]));\nparse(1000, 'bytes=40-80,-1').should.eql(arr('bytes', [{ start: 40, end: 80 }, { start: 999, end: 999 }]));\n```\n\n## Installation\n\n```\n$ npm install range-parser\n```", - "_id": "range-parser@0.0.4", - "_from": "range-parser@0.0.4" -} diff --git a/node_modules/express/node_modules/send/.npmignore b/node_modules/express/node_modules/send/.npmignore deleted file mode 100644 index f1250e5..0000000 --- a/node_modules/express/node_modules/send/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -support -test -examples -*.sock diff --git a/node_modules/express/node_modules/send/History.md b/node_modules/express/node_modules/send/History.md deleted file mode 100644 index 20c5319..0000000 --- a/node_modules/express/node_modules/send/History.md +++ /dev/null @@ -1,25 +0,0 @@ - -0.1.0 / 2012-08-25 -================== - - * add options parameter to send() that is passed to fs.createReadStream() [kanongil] - -0.0.4 / 2012-08-16 -================== - - * allow custom "Accept-Ranges" definition - -0.0.3 / 2012-07-16 -================== - - * fix normalization of the root directory. Closes #3 - -0.0.2 / 2012-07-09 -================== - - * add passing of req explicitly for now (YUCK) - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/node_modules/express/node_modules/send/Makefile b/node_modules/express/node_modules/send/Makefile deleted file mode 100644 index a9dcfd5..0000000 --- a/node_modules/express/node_modules/send/Makefile +++ /dev/null @@ -1,8 +0,0 @@ - -test: - @./node_modules/.bin/mocha \ - --require should \ - --reporter spec \ - --bail - -.PHONY: test \ No newline at end of file diff --git a/node_modules/express/node_modules/send/Readme.md b/node_modules/express/node_modules/send/Readme.md deleted file mode 100644 index 85171a9..0000000 --- a/node_modules/express/node_modules/send/Readme.md +++ /dev/null @@ -1,123 +0,0 @@ - -# send - - Send is Connect's `static()` extracted for generalized use, a streaming static file - server supporting partial responses (Ranges), conditional-GET negotiation, high test coverage, and granular events which may be leveraged to take appropriate actions in your application or framework. - -## Installation - - $ npm install send - -## Examples - - Small: - -```js -var http = require('http'); -var send = require('send'); - -var app = http.createServer(function(req, res){ - send(req, req.url).pipe(res); -}); -``` - - Serving from a root directory with custom error-handling: - -```js -var http = require('http'); -var send = require('send'); - -var app = http.createServer(function(req, res){ - // your custom error-handling logic: - function error(err) { - res.statusCode = err.status || 500; - res.end(err.message); - } - - // your custom directory handling logic: - function redirect() { - res.statusCode = 301; - res.setHeader('Location', req.url + '/'); - res.end('Redirecting to ' + req.url + '/'); - } - - // transfer arbitrary files from within - // /www/example.com/public/* - send(req, url.parse(req.url).pathname) - .root('/www/example.com/public') - .on('error', error) - .on('directory', redirect) - .pipe(res); -}); -``` - -## API - -### Events - - - `error` an error occurred `(err)` - - `directory` a directory was requested - - `stream` file streaming has started `(stream)` - - `end` streaming has completed - -### .root(dir) - - Serve files relative to `path`. Aliased as `.from(dir)`. - -### .index(path) - - By default send supports "index.html" files, to disable this - invoke `.index(false)` or to supply a new index pass a string. - -### .maxage(ms) - - Provide a max-age in milliseconds for http caching, defaults to 0. - -## Error-handling - - By default when no `error` listeners are present an automatic response will be made, otherwise you have full control over the response, aka you may show a 5xx page etc. - -## Caching - - It does _not_ perform internal caching, you should use a reverse proxy cache such - as Varnish for this, or those fancy things called CDNs. If your application is small enough that it would benefit from single-node memory caching, it's small enough that it does not need caching at all ;). - -## Debugging - - To enable `debug()` instrumentation output export __DEBUG__: - -``` -$ DEBUG=send node app -``` - -## Running tests - -``` -$ npm install -$ make test -``` - -## License - -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca> - -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 diff --git a/node_modules/express/node_modules/send/index.js b/node_modules/express/node_modules/send/index.js deleted file mode 100644 index f17158d..0000000 --- a/node_modules/express/node_modules/send/index.js +++ /dev/null @@ -1,2 +0,0 @@ - -module.exports = require('./lib/send'); \ No newline at end of file diff --git a/node_modules/express/node_modules/send/lib/send.js b/node_modules/express/node_modules/send/lib/send.js deleted file mode 100644 index de72146..0000000 --- a/node_modules/express/node_modules/send/lib/send.js +++ /dev/null @@ -1,473 +0,0 @@ - -/** - * Module dependencies. - */ - -var debug = require('debug')('send') - , parseRange = require('range-parser') - , Stream = require('stream') - , mime = require('mime') - , fresh = require('fresh') - , path = require('path') - , http = require('http') - , fs = require('fs') - , basename = path.basename - , normalize = path.normalize - , join = path.join - , utils = require('./utils'); - -/** - * Expose `send`. - */ - -exports = module.exports = send; - -/** - * Expose mime module. - */ - -exports.mime = mime; - -/** - * Return a `SendStream` for `req` and `path`. - * - * @param {Request} req - * @param {String} path - * @param {Object} options - * @return {SendStream} - * @api public - */ - -function send(req, path, options) { - return new SendStream(req, path, options); -} - -/** - * Initialize a `SendStream` with the given `path`. - * - * Events: - * - * - `error` an error occurred - * - `stream` file streaming has started - * - `end` streaming has completed - * - `directory` a directory was requested - * - * @param {Request} req - * @param {String} path - * @param {Object} options - * @api private - */ - -function SendStream(req, path, options) { - var self = this; - this.req = req; - this.path = path; - this.options = options || {}; - this.maxage(0); - this.hidden(false); - this.index('index.html'); -} - -/** - * Inherits from `Stream.prototype`. - */ - -SendStream.prototype.__proto__ = Stream.prototype; - -/** - * Enable or disable "hidden" (dot) files. - * - * @param {Boolean} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.hidden = function(val){ - debug('hidden %s', val); - this._hidden = val; - return this; -}; - -/** - * Set index `path`, set to a falsy - * value to disable index support. - * - * @param {String|Boolean} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.index = function(path){ - debug('index %s', path); - this._index = path; - return this; -}; - -/** - * Set root `path`. - * - * @param {String} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.root = -SendStream.prototype.from = function(path){ - this._root = normalize(path); - return this; -}; - -/** - * Set max-age to `ms`. - * - * @param {Number} ms - * @return {SendStream} - * @api public - */ - -SendStream.prototype.maxage = function(ms){ - if (Infinity == ms) ms = 60 * 60 * 24 * 365 * 1000; - debug('max-age %d', ms); - this._maxage = ms; - return this; -}; - -/** - * Emit error with `status`. - * - * @param {Number} status - * @api private - */ - -SendStream.prototype.error = function(status, err){ - var res = this.res; - var msg = http.STATUS_CODES[status]; - err = err || new Error(msg); - err.status = status; - if (this.listeners('error').length) return this.emit('error', err); - res.statusCode = err.status; - res.end(msg); -}; - -/** - * Check if the pathname is potentially malicious. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isMalicious = function(){ - return !this._root && ~this.path.indexOf('..'); -}; - -/** - * Check if the pathname ends with "/". - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.hasTrailingSlash = function(){ - return '/' == this.path[this.path.length - 1]; -}; - -/** - * Check if the basename leads with ".". - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.hasLeadingDot = function(){ - return '.' == basename(this.path)[0]; -}; - -/** - * Check if this is a conditional GET request. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isConditionalGET = function(){ - return this.req.headers['if-none-match'] - || this.req.headers['if-modified-since']; -}; - -/** - * Strip content-* header fields. - * - * @api private - */ - -SendStream.prototype.removeContentHeaderFields = function(){ - var res = this.res; - Object.keys(res._headers).forEach(function(field){ - if (0 == field.indexOf('content')) { - res.removeHeader(field); - } - }); -}; - -/** - * Respond with 304 not modified. - * - * @api private - */ - -SendStream.prototype.notModified = function(){ - var res = this.res; - debug('not modified'); - this.removeContentHeaderFields(); - res.statusCode = 304; - res.end(); -}; - -/** - * Check if the request is cacheable, aka - * responded with 2xx or 304 (see RFC 2616 section 14.2{5,6}). - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isCachable = function(){ - var res = this.res; - return (res.statusCode >= 200 && res.statusCode < 300) || 304 == res.statusCode; -}; - -/** - * Handle stat() error. - * - * @param {Error} err - * @api private - */ - -SendStream.prototype.onStatError = function(err){ - var notfound = ['ENOENT', 'ENAMETOOLONG', 'ENOTDIR']; - if (~notfound.indexOf(err.code)) return this.error(404, err); - this.error(500, err); -}; - -/** - * Check if the cache is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isFresh = function(){ - return fresh(this.req.headers, this.res._headers); -}; - -/** - * Redirect to `path`. - * - * @param {String} path - * @api private - */ - -SendStream.prototype.redirect = function(path){ - if (this.listeners('directory').length) return this.emit('directory'); - var res = this.res; - path += '/'; - res.statusCode = 301; - res.setHeader('Location', path); - res.end('Redirecting to ' + utils.escape(path)); -}; - -/** - * Pipe to `res. - * - * @param {Stream} res - * @return {Stream} res - * @api public - */ - -SendStream.prototype.pipe = function(res){ - var self = this - , args = arguments - , path = this.path - , root = this._root; - - // references - this.res = res; - - // invalid request uri - path = utils.decode(path); - if (-1 == path) return this.error(400); - - // null byte(s) - if (~path.indexOf('\0')) return this.error(400); - - // join / normalize from optional root dir - if (root) path = normalize(join(this._root, path)); - - // ".." is malicious without "root" - if (this.isMalicious()) return this.error(403); - - // malicious path - if (root && 0 != path.indexOf(root)) return this.error(403); - - // hidden file support - if (!this._hidden && this.hasLeadingDot()) return this.error(404); - - // index file support - if (this._index && this.hasTrailingSlash()) path += this._index; - - debug('stat "%s"', path); - fs.stat(path, function(err, stat){ - if (err) return self.onStatError(err); - if (stat.isDirectory()) return self.redirect(self.path); - self.send(path, stat); - }); - - return res; -}; - -/** - * Transfer `path`. - * - * @param {String} path - * @api public - */ - -SendStream.prototype.send = function(path, stat){ - var options = this.options; - var len = stat.size; - var res = this.res; - var req = this.req; - var ranges = req.headers.range; - var offset = options.start || 0; - - // set header fields - this.setHeader(stat); - - // set content-type - this.type(path); - - // conditional GET support - if (this.isConditionalGET() - && this.isCachable() - && this.isFresh()) { - return this.notModified(); - } - - // adjust len to start/end options - len = Math.max(0, len - offset); - if (options.end !== undefined) { - var bytes = options.end - offset + 1; - if (len > bytes) len = bytes; - } - - // Range support - if (ranges) { - ranges = parseRange(len, ranges); - - // unsatisfiable - if (-1 == ranges) { - res.setHeader('Content-Range', 'bytes */' + stat.size); - return this.error(416); - } - - // valid (syntactically invalid ranges are treated as a regular response) - if (-2 != ranges) { - options.start = offset + ranges[0].start; - options.end = offset + ranges[0].end; - - // Content-Range - res.statusCode = 206; - res.setHeader('Content-Range', 'bytes ' - + ranges[0].start - + '-' - + ranges[0].end - + '/' - + len); - len = options.end - options.start + 1; - } - } - - // content-length - res.setHeader('Content-Length', len); - - // HEAD support - if ('HEAD' == req.method) return res.end(); - - this.stream(path, options); -}; - -/** - * Stream `path` to the response. - * - * @param {String} path - * @param {Object} options - * @api private - */ - -SendStream.prototype.stream = function(path, options){ - // TODO: this is all lame, refactor meeee - var self = this; - var res = this.res; - var req = this.req; - - // pipe - var stream = fs.createReadStream(path, options); - this.emit('stream', stream); - stream.pipe(res); - - // socket closed, done with the fd - req.on('close', stream.destroy.bind(stream)); - - // error handling code-smell - stream.on('error', function(err){ - // no hope in responding - if (res._header) { - console.error(err.stack); - req.destroy(); - return; - } - - // 500 - err.status = 500; - self.emit('error', err); - }); - - // end - stream.on('end', function(){ - self.emit('end'); - }); -}; - -/** - * Set content-type based on `path` - * if it hasn't been explicitly set. - * - * @param {String} path - * @api private - */ - -SendStream.prototype.type = function(path){ - var res = this.res; - if (res.getHeader('Content-Type')) return; - var type = mime.lookup(path); - var charset = mime.charsets.lookup(type); - debug('content-type %s', type); - res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : '')); -}; - -/** - * Set reaponse header fields, most - * fields may be pre-defined. - * - * @param {Object} stat - * @api private - */ - -SendStream.prototype.setHeader = function(stat){ - var res = this.res; - if (!res.getHeader('Accept-Ranges')) res.setHeader('Accept-Ranges', 'bytes'); - if (!res.getHeader('ETag')) res.setHeader('ETag', utils.etag(stat)); - if (!res.getHeader('Date')) res.setHeader('Date', new Date().toUTCString()); - if (!res.getHeader('Cache-Control')) res.setHeader('Cache-Control', 'public, max-age=' + (this._maxage / 1000)); - if (!res.getHeader('Last-Modified')) res.setHeader('Last-Modified', stat.mtime.toUTCString()); -}; diff --git a/node_modules/express/node_modules/send/lib/utils.js b/node_modules/express/node_modules/send/lib/utils.js deleted file mode 100644 index 950e5a2..0000000 --- a/node_modules/express/node_modules/send/lib/utils.js +++ /dev/null @@ -1,47 +0,0 @@ - -/** - * Return an ETag in the form of `"-"` - * from the given `stat`. - * - * @param {Object} stat - * @return {String} - * @api private - */ - -exports.etag = function(stat) { - return '"' + stat.size + '-' + Number(stat.mtime) + '"'; -}; - -/** - * decodeURIComponent. - * - * Allows V8 to only deoptimize this fn instead of all - * of send(). - * - * @param {String} path - * @api private - */ - -exports.decode = function(path){ - try { - return decodeURIComponent(path); - } catch (err) { - return -1; - } -}; - -/** - * Escape the given string of `html`. - * - * @param {String} html - * @return {String} - * @api private - */ - -exports.escape = function(html){ - return String(html) - .replace(/&(?!\w+;)/g, '&') - .replace(//g, '>') - .replace(/"/g, '"'); -}; \ No newline at end of file diff --git a/node_modules/express/node_modules/send/node_modules/mime/LICENSE b/node_modules/express/node_modules/send/node_modules/mime/LICENSE deleted file mode 100644 index 451fc45..0000000 --- a/node_modules/express/node_modules/send/node_modules/mime/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2010 Benjamin Thomas, Robert Kieffer - -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. diff --git a/node_modules/express/node_modules/send/node_modules/mime/README.md b/node_modules/express/node_modules/send/node_modules/mime/README.md deleted file mode 100644 index d8b66a8..0000000 --- a/node_modules/express/node_modules/send/node_modules/mime/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# mime - -Comprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community. - -## Install - -Install with [npm](http://github.com/isaacs/npm): - - npm install mime - -## API - Queries - -### mime.lookup(path) -Get the mime type associated with a file. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g. - - var mime = require('mime'); - - mime.lookup('/path/to/file.txt'); // => 'text/plain' - mime.lookup('file.txt'); // => 'text/plain' - mime.lookup('.TXT'); // => 'text/plain' - mime.lookup('htm'); // => 'text/html' - -### mime.extension(type) -Get the default extension for `type` - - mime.extension('text/html'); // => 'html' - mime.extension('application/octet-stream'); // => 'bin' - -### mime.charsets.lookup() - -Map mime-type to charset - - mime.charsets.lookup('text/plain'); // => 'UTF-8' - -(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.) - -## API - Defining Custom Types - -The following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/bentomas/node-mime/wiki/Requesting-New-Types). - -### mime.define() - -Add custom mime/extension mappings - - mime.define({ - 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'], - 'application/x-my-type': ['x-mt', 'x-mtt'], - // etc ... - }); - - mime.lookup('x-sft'); // => 'text/x-some-format' - -The first entry in the extensions array is returned by `mime.extension()`. E.g. - - mime.extension('text/x-some-format'); // => 'x-sf' - -### mime.load(filepath) - -Load mappings from an Apache ".types" format file - - mime.load('./my_project.types'); - -The .types file format is simple - See the `types` dir for examples. diff --git a/node_modules/express/node_modules/send/node_modules/mime/mime.js b/node_modules/express/node_modules/send/node_modules/mime/mime.js deleted file mode 100644 index 1e00585..0000000 --- a/node_modules/express/node_modules/send/node_modules/mime/mime.js +++ /dev/null @@ -1,104 +0,0 @@ -var path = require('path'); -var fs = require('fs'); - -function Mime() { - // Map of extension -> mime type - this.types = Object.create(null); - - // Map of mime type -> extension - this.extensions = Object.create(null); -} - -/** - * Define mimetype -> extension mappings. Each key is a mime-type that maps - * to an array of extensions associated with the type. The first extension is - * used as the default extension for the type. - * - * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']}); - * - * @param map (Object) type definitions - */ -Mime.prototype.define = function (map) { - for (var type in map) { - var exts = map[type]; - - for (var i = 0; i < exts.length; i++) { - this.types[exts[i]] = type; - } - - // Default extension is the first one we encounter - if (!this.extensions[type]) { - this.extensions[type] = exts[0]; - } - } -}; - -/** - * Load an Apache2-style ".types" file - * - * This may be called multiple times (it's expected). Where files declare - * overlapping types/extensions, the last file wins. - * - * @param file (String) path of file to load. - */ -Mime.prototype.load = function(file) { - // Read file and split into lines - var map = {}, - content = fs.readFileSync(file, 'ascii'), - lines = content.split(/[\r\n]+/); - - lines.forEach(function(line) { - // Clean up whitespace/comments, and split into fields - var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/); - map[fields.shift()] = fields; - }); - - this.define(map); -}; - -/** - * Lookup a mime type based on extension - */ -Mime.prototype.lookup = function(path, fallback) { - var ext = path.replace(/.*[\.\/]/, '').toLowerCase(); - - return this.types[ext] || fallback || this.default_type; -}; - -/** - * Return file extension associated with a mime type - */ -Mime.prototype.extension = function(mimeType) { - return this.extensions[mimeType]; -}; - -// Default instance -var mime = new Mime(); - -// Load local copy of -// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types -mime.load(path.join(__dirname, 'types/mime.types')); - -// Load additional types from node.js community -mime.load(path.join(__dirname, 'types/node.types')); - -// Default type -mime.default_type = mime.lookup('bin'); - -// -// Additional API specific to the default instance -// - -mime.Mime = Mime; - -/** - * Lookup a charset based on mime type. - */ -mime.charsets = { - lookup: function(mimeType, fallback) { - // Assume text types are utf8 - return (/^text\//).test(mimeType) ? 'UTF-8' : fallback; - } -} - -module.exports = mime; diff --git a/node_modules/express/node_modules/send/node_modules/mime/package.json b/node_modules/express/node_modules/send/node_modules/mime/package.json deleted file mode 100644 index a265300..0000000 --- a/node_modules/express/node_modules/send/node_modules/mime/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "author": { - "name": "Robert Kieffer", - "email": "robert@broofa.com", - "url": "http://github.com/broofa" - }, - "contributors": [ - { - "name": "Benjamin Thomas", - "email": "benjamin@benjaminthomas.org", - "url": "http://github.com/bentomas" - } - ], - "dependencies": {}, - "description": "A comprehensive library for mime-type mapping", - "devDependencies": {}, - "keywords": [ - "util", - "mime" - ], - "main": "mime.js", - "name": "mime", - "repository": { - "url": "https://github.com/broofa/node-mime", - "type": "git" - }, - "version": "1.2.6", - "readme": "# mime\n\nComprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community.\n\n## Install\n\nInstall with [npm](http://github.com/isaacs/npm):\n\n npm install mime\n\n## API - Queries\n\n### mime.lookup(path)\nGet the mime type associated with a file. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g.\n\n var mime = require('mime');\n\n mime.lookup('/path/to/file.txt'); // => 'text/plain'\n mime.lookup('file.txt'); // => 'text/plain'\n mime.lookup('.TXT'); // => 'text/plain'\n mime.lookup('htm'); // => 'text/html'\n\n### mime.extension(type)\nGet the default extension for `type`\n\n mime.extension('text/html'); // => 'html'\n mime.extension('application/octet-stream'); // => 'bin'\n\n### mime.charsets.lookup()\n\nMap mime-type to charset\n\n mime.charsets.lookup('text/plain'); // => 'UTF-8'\n\n(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.)\n\n## API - Defining Custom Types\n\nThe following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/bentomas/node-mime/wiki/Requesting-New-Types).\n\n### mime.define()\n\nAdd custom mime/extension mappings\n\n mime.define({\n 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'],\n 'application/x-my-type': ['x-mt', 'x-mtt'],\n // etc ...\n });\n\n mime.lookup('x-sft'); // => 'text/x-some-format'\n\nThe first entry in the extensions array is returned by `mime.extension()`. E.g.\n\n mime.extension('text/x-some-format'); // => 'x-sf'\n\n### mime.load(filepath)\n\nLoad mappings from an Apache \".types\" format file\n\n mime.load('./my_project.types');\n\nThe .types file format is simple - See the `types` dir for examples.\n", - "_id": "mime@1.2.6", - "_from": "mime@1.2.6" -} diff --git a/node_modules/express/node_modules/send/node_modules/mime/test.js b/node_modules/express/node_modules/send/node_modules/mime/test.js deleted file mode 100644 index cbad034..0000000 --- a/node_modules/express/node_modules/send/node_modules/mime/test.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Usage: node test.js - */ - -var mime = require('./mime'); -var assert = require('assert'); - -function eq(a, b) { - console.log('Test: ' + a + ' === ' + b); - assert.strictEqual.apply(null, arguments); -} - -console.log(Object.keys(mime.extensions).length + ' types'); -console.log(Object.keys(mime.types).length + ' extensions\n'); - -// -// Test mime lookups -// - -eq('text/plain', mime.lookup('text.txt')); -eq('text/plain', mime.lookup('.text.txt')); -eq('text/plain', mime.lookup('.txt')); -eq('text/plain', mime.lookup('txt')); -eq('application/octet-stream', mime.lookup('text.nope')); -eq('fallback', mime.lookup('text.fallback', 'fallback')); -eq('application/octet-stream', mime.lookup('constructor')); -eq('text/plain', mime.lookup('TEXT.TXT')); -eq('text/event-stream', mime.lookup('text/event-stream')); -eq('application/x-web-app-manifest+json', mime.lookup('text.webapp')); - -// -// Test extensions -// - -eq('txt', mime.extension(mime.types.text)); -eq('html', mime.extension(mime.types.htm)); -eq('bin', mime.extension('application/octet-stream')); -eq(undefined, mime.extension('constructor')); - -// -// Test node types -// - -eq('application/octet-stream', mime.lookup('file.buffer')); -eq('audio/mp4', mime.lookup('file.m4a')); - -// -// Test charsets -// - -eq('UTF-8', mime.charsets.lookup('text/plain')); -eq(undefined, mime.charsets.lookup(mime.types.js)); -eq('fallback', mime.charsets.lookup('application/octet-stream', 'fallback')); - -console.log('\nOK'); diff --git a/node_modules/express/node_modules/send/node_modules/mime/types/mime.types b/node_modules/express/node_modules/send/node_modules/mime/types/mime.types deleted file mode 100644 index b3cae2e..0000000 --- a/node_modules/express/node_modules/send/node_modules/mime/types/mime.types +++ /dev/null @@ -1,1510 +0,0 @@ -# This file maps Internet media types to unique file extension(s). -# Although created for httpd, this file is used by many software systems -# and has been placed in the public domain for unlimited redisribution. -# -# The table below contains both registered and (common) unregistered types. -# A type that has no unique extension can be ignored -- they are listed -# here to guide configurations toward known types and to make it easier to -# identify "new" types. File extensions are also commonly used to indicate -# content languages and encodings, so choose them carefully. -# -# Internet media types should be registered as described in RFC 4288. -# The registry is at . -# -# MIME type (lowercased) Extensions -# ============================================ ========== -# application/1d-interleaved-parityfec -# application/3gpp-ims+xml -# application/activemessage -application/andrew-inset ez -# application/applefile -application/applixware aw -application/atom+xml atom -application/atomcat+xml atomcat -# application/atomicmail -application/atomsvc+xml atomsvc -# application/auth-policy+xml -# application/batch-smtp -# application/beep+xml -# application/calendar+xml -# application/cals-1840 -# application/ccmp+xml -application/ccxml+xml ccxml -application/cdmi-capability cdmia -application/cdmi-container cdmic -application/cdmi-domain cdmid -application/cdmi-object cdmio -application/cdmi-queue cdmiq -# application/cea-2018+xml -# application/cellml+xml -# application/cfw -# application/cnrp+xml -# application/commonground -# application/conference-info+xml -# application/cpl+xml -# application/csta+xml -# application/cstadata+xml -application/cu-seeme cu -# application/cybercash -application/davmount+xml davmount -# application/dca-rft -# application/dec-dx -# application/dialog-info+xml -# application/dicom -# application/dns -# application/dskpp+xml -application/dssc+der dssc -application/dssc+xml xdssc -# application/dvcs -application/ecmascript ecma -# application/edi-consent -# application/edi-x12 -# application/edifact -application/emma+xml emma -# application/epp+xml -application/epub+zip epub -# application/eshop -# application/example -application/exi exi -# application/fastinfoset -# application/fastsoap -# application/fits -application/font-tdpfr pfr -# application/framework-attributes+xml -# application/h224 -# application/held+xml -# application/http -application/hyperstudio stk -# application/ibe-key-request+xml -# application/ibe-pkg-reply+xml -# application/ibe-pp-data -# application/iges -# application/im-iscomposing+xml -# application/index -# application/index.cmd -# application/index.obj -# application/index.response -# application/index.vnd -application/inkml+xml ink inkml -# application/iotp -application/ipfix ipfix -# application/ipp -# application/isup -application/java-archive jar -application/java-serialized-object ser -application/java-vm class -application/javascript js -application/json json -# application/kpml-request+xml -# application/kpml-response+xml -application/lost+xml lostxml -application/mac-binhex40 hqx -application/mac-compactpro cpt -# application/macwriteii -application/mads+xml mads -application/marc mrc -application/marcxml+xml mrcx -application/mathematica ma nb mb -# application/mathml-content+xml -# application/mathml-presentation+xml -application/mathml+xml mathml -# application/mbms-associated-procedure-description+xml -# application/mbms-deregister+xml -# application/mbms-envelope+xml -# application/mbms-msk+xml -# application/mbms-msk-response+xml -# application/mbms-protection-description+xml -# application/mbms-reception-report+xml -# application/mbms-register+xml -# application/mbms-register-response+xml -# application/mbms-user-service-description+xml -application/mbox mbox -# application/media_control+xml -application/mediaservercontrol+xml mscml -application/metalink4+xml meta4 -application/mets+xml mets -# application/mikey -application/mods+xml mods -# application/moss-keys -# application/moss-signature -# application/mosskey-data -# application/mosskey-request -application/mp21 m21 mp21 -application/mp4 mp4s -# application/mpeg4-generic -# application/mpeg4-iod -# application/mpeg4-iod-xmt -# application/msc-ivr+xml -# application/msc-mixer+xml -application/msword doc dot -application/mxf mxf -# application/nasdata -# application/news-checkgroups -# application/news-groupinfo -# application/news-transmission -# application/nss -# application/ocsp-request -# application/ocsp-response -application/octet-stream bin dms lha lrf lzh so iso dmg dist distz pkg bpk dump elc deploy -application/oda oda -application/oebps-package+xml opf -application/ogg ogx -application/onenote onetoc onetoc2 onetmp onepkg -application/oxps oxps -# application/parityfec -application/patch-ops-error+xml xer -application/pdf pdf -application/pgp-encrypted pgp -# application/pgp-keys -application/pgp-signature asc sig -application/pics-rules prf -# application/pidf+xml -# application/pidf-diff+xml -application/pkcs10 p10 -application/pkcs7-mime p7m p7c -application/pkcs7-signature p7s -application/pkcs8 p8 -application/pkix-attr-cert ac -application/pkix-cert cer -application/pkix-crl crl -application/pkix-pkipath pkipath -application/pkixcmp pki -application/pls+xml pls -# application/poc-settings+xml -application/postscript ai eps ps -# application/prs.alvestrand.titrax-sheet -application/prs.cww cww -# application/prs.nprend -# application/prs.plucker -# application/prs.rdf-xml-crypt -# application/prs.xsf+xml -application/pskc+xml pskcxml -# application/qsig -application/rdf+xml rdf -application/reginfo+xml rif -application/relax-ng-compact-syntax rnc -# application/remote-printing -application/resource-lists+xml rl -application/resource-lists-diff+xml rld -# application/riscos -# application/rlmi+xml -application/rls-services+xml rs -application/rpki-ghostbusters gbr -application/rpki-manifest mft -application/rpki-roa roa -# application/rpki-updown -application/rsd+xml rsd -application/rss+xml rss -application/rtf rtf -# application/rtx -# application/samlassertion+xml -# application/samlmetadata+xml -application/sbml+xml sbml -application/scvp-cv-request scq -application/scvp-cv-response scs -application/scvp-vp-request spq -application/scvp-vp-response spp -application/sdp sdp -# application/set-payment -application/set-payment-initiation setpay -# application/set-registration -application/set-registration-initiation setreg -# application/sgml -# application/sgml-open-catalog -application/shf+xml shf -# application/sieve -# application/simple-filter+xml -# application/simple-message-summary -# application/simplesymbolcontainer -# application/slate -# application/smil -application/smil+xml smi smil -# application/soap+fastinfoset -# application/soap+xml -application/sparql-query rq -application/sparql-results+xml srx -# application/spirits-event+xml -application/srgs gram -application/srgs+xml grxml -application/sru+xml sru -application/ssml+xml ssml -# application/tamp-apex-update -# application/tamp-apex-update-confirm -# application/tamp-community-update -# application/tamp-community-update-confirm -# application/tamp-error -# application/tamp-sequence-adjust -# application/tamp-sequence-adjust-confirm -# application/tamp-status-query -# application/tamp-status-response -# application/tamp-update -# application/tamp-update-confirm -application/tei+xml tei teicorpus -application/thraud+xml tfi -# application/timestamp-query -# application/timestamp-reply -application/timestamped-data tsd -# application/tve-trigger -# application/ulpfec -# application/vcard+xml -# application/vemmi -# application/vividence.scriptfile -# application/vnd.3gpp.bsf+xml -application/vnd.3gpp.pic-bw-large plb -application/vnd.3gpp.pic-bw-small psb -application/vnd.3gpp.pic-bw-var pvb -# application/vnd.3gpp.sms -# application/vnd.3gpp2.bcmcsinfo+xml -# application/vnd.3gpp2.sms -application/vnd.3gpp2.tcap tcap -application/vnd.3m.post-it-notes pwn -application/vnd.accpac.simply.aso aso -application/vnd.accpac.simply.imp imp -application/vnd.acucobol acu -application/vnd.acucorp atc acutc -application/vnd.adobe.air-application-installer-package+zip air -application/vnd.adobe.fxp fxp fxpl -# application/vnd.adobe.partial-upload -application/vnd.adobe.xdp+xml xdp -application/vnd.adobe.xfdf xfdf -# application/vnd.aether.imp -# application/vnd.ah-barcode -application/vnd.ahead.space ahead -application/vnd.airzip.filesecure.azf azf -application/vnd.airzip.filesecure.azs azs -application/vnd.amazon.ebook azw -application/vnd.americandynamics.acc acc -application/vnd.amiga.ami ami -# application/vnd.amundsen.maze+xml -application/vnd.android.package-archive apk -application/vnd.anser-web-certificate-issue-initiation cii -application/vnd.anser-web-funds-transfer-initiation fti -application/vnd.antix.game-component atx -application/vnd.apple.installer+xml mpkg -application/vnd.apple.mpegurl m3u8 -# application/vnd.arastra.swi -application/vnd.aristanetworks.swi swi -application/vnd.astraea-software.iota iota -application/vnd.audiograph aep -# application/vnd.autopackage -# application/vnd.avistar+xml -application/vnd.blueice.multipass mpm -# application/vnd.bluetooth.ep.oob -application/vnd.bmi bmi -application/vnd.businessobjects rep -# application/vnd.cab-jscript -# application/vnd.canon-cpdl -# application/vnd.canon-lips -# application/vnd.cendio.thinlinc.clientconf -application/vnd.chemdraw+xml cdxml -application/vnd.chipnuts.karaoke-mmd mmd -application/vnd.cinderella cdy -# application/vnd.cirpack.isdn-ext -application/vnd.claymore cla -application/vnd.cloanto.rp9 rp9 -application/vnd.clonk.c4group c4g c4d c4f c4p c4u -application/vnd.cluetrust.cartomobile-config c11amc -application/vnd.cluetrust.cartomobile-config-pkg c11amz -# application/vnd.collection+json -# application/vnd.commerce-battelle -application/vnd.commonspace csp -application/vnd.contact.cmsg cdbcmsg -application/vnd.cosmocaller cmc -application/vnd.crick.clicker clkx -application/vnd.crick.clicker.keyboard clkk -application/vnd.crick.clicker.palette clkp -application/vnd.crick.clicker.template clkt -application/vnd.crick.clicker.wordbank clkw -application/vnd.criticaltools.wbs+xml wbs -application/vnd.ctc-posml pml -# application/vnd.ctct.ws+xml -# application/vnd.cups-pdf -# application/vnd.cups-postscript -application/vnd.cups-ppd ppd -# application/vnd.cups-raster -# application/vnd.cups-raw -# application/vnd.curl -application/vnd.curl.car car -application/vnd.curl.pcurl pcurl -# application/vnd.cybank -application/vnd.data-vision.rdz rdz -application/vnd.dece.data uvf uvvf uvd uvvd -application/vnd.dece.ttml+xml uvt uvvt -application/vnd.dece.unspecified uvx uvvx -application/vnd.dece.zip uvz uvvz -application/vnd.denovo.fcselayout-link fe_launch -# application/vnd.dir-bi.plate-dl-nosuffix -application/vnd.dna dna -application/vnd.dolby.mlp mlp -# application/vnd.dolby.mobile.1 -# application/vnd.dolby.mobile.2 -application/vnd.dpgraph dpg -application/vnd.dreamfactory dfac -application/vnd.dvb.ait ait -# application/vnd.dvb.dvbj -# application/vnd.dvb.esgcontainer -# application/vnd.dvb.ipdcdftnotifaccess -# application/vnd.dvb.ipdcesgaccess -# application/vnd.dvb.ipdcesgaccess2 -# application/vnd.dvb.ipdcesgpdd -# application/vnd.dvb.ipdcroaming -# application/vnd.dvb.iptv.alfec-base -# application/vnd.dvb.iptv.alfec-enhancement -# application/vnd.dvb.notif-aggregate-root+xml -# application/vnd.dvb.notif-container+xml -# application/vnd.dvb.notif-generic+xml -# application/vnd.dvb.notif-ia-msglist+xml -# application/vnd.dvb.notif-ia-registration-request+xml -# application/vnd.dvb.notif-ia-registration-response+xml -# application/vnd.dvb.notif-init+xml -# application/vnd.dvb.pfr -application/vnd.dvb.service svc -# application/vnd.dxr -application/vnd.dynageo geo -# application/vnd.easykaraoke.cdgdownload -# application/vnd.ecdis-update -application/vnd.ecowin.chart mag -# application/vnd.ecowin.filerequest -# application/vnd.ecowin.fileupdate -# application/vnd.ecowin.series -# application/vnd.ecowin.seriesrequest -# application/vnd.ecowin.seriesupdate -# application/vnd.emclient.accessrequest+xml -application/vnd.enliven nml -# application/vnd.eprints.data+xml -application/vnd.epson.esf esf -application/vnd.epson.msf msf -application/vnd.epson.quickanime qam -application/vnd.epson.salt slt -application/vnd.epson.ssf ssf -# application/vnd.ericsson.quickcall -application/vnd.eszigno3+xml es3 et3 -# application/vnd.etsi.aoc+xml -# application/vnd.etsi.cug+xml -# application/vnd.etsi.iptvcommand+xml -# application/vnd.etsi.iptvdiscovery+xml -# application/vnd.etsi.iptvprofile+xml -# application/vnd.etsi.iptvsad-bc+xml -# application/vnd.etsi.iptvsad-cod+xml -# application/vnd.etsi.iptvsad-npvr+xml -# application/vnd.etsi.iptvservice+xml -# application/vnd.etsi.iptvsync+xml -# application/vnd.etsi.iptvueprofile+xml -# application/vnd.etsi.mcid+xml -# application/vnd.etsi.overload-control-policy-dataset+xml -# application/vnd.etsi.sci+xml -# application/vnd.etsi.simservs+xml -# application/vnd.etsi.tsl+xml -# application/vnd.etsi.tsl.der -# application/vnd.eudora.data -application/vnd.ezpix-album ez2 -application/vnd.ezpix-package ez3 -# application/vnd.f-secure.mobile -application/vnd.fdf fdf -application/vnd.fdsn.mseed mseed -application/vnd.fdsn.seed seed dataless -# application/vnd.ffsns -# application/vnd.fints -application/vnd.flographit gph -application/vnd.fluxtime.clip ftc -# application/vnd.font-fontforge-sfd -application/vnd.framemaker fm frame maker book -application/vnd.frogans.fnc fnc -application/vnd.frogans.ltf ltf -application/vnd.fsc.weblaunch fsc -application/vnd.fujitsu.oasys oas -application/vnd.fujitsu.oasys2 oa2 -application/vnd.fujitsu.oasys3 oa3 -application/vnd.fujitsu.oasysgp fg5 -application/vnd.fujitsu.oasysprs bh2 -# application/vnd.fujixerox.art-ex -# application/vnd.fujixerox.art4 -# application/vnd.fujixerox.hbpl -application/vnd.fujixerox.ddd ddd -application/vnd.fujixerox.docuworks xdw -application/vnd.fujixerox.docuworks.binder xbd -# application/vnd.fut-misnet -application/vnd.fuzzysheet fzs -application/vnd.genomatix.tuxedo txd -# application/vnd.geocube+xml -application/vnd.geogebra.file ggb -application/vnd.geogebra.tool ggt -application/vnd.geometry-explorer gex gre -application/vnd.geonext gxt -application/vnd.geoplan g2w -application/vnd.geospace g3w -# application/vnd.globalplatform.card-content-mgt -# application/vnd.globalplatform.card-content-mgt-response -application/vnd.gmx gmx -application/vnd.google-earth.kml+xml kml -application/vnd.google-earth.kmz kmz -application/vnd.grafeq gqf gqs -# application/vnd.gridmp -application/vnd.groove-account gac -application/vnd.groove-help ghf -application/vnd.groove-identity-message gim -application/vnd.groove-injector grv -application/vnd.groove-tool-message gtm -application/vnd.groove-tool-template tpl -application/vnd.groove-vcard vcg -# application/vnd.hal+json -application/vnd.hal+xml hal -application/vnd.handheld-entertainment+xml zmm -application/vnd.hbci hbci -# application/vnd.hcl-bireports -application/vnd.hhe.lesson-player les -application/vnd.hp-hpgl hpgl -application/vnd.hp-hpid hpid -application/vnd.hp-hps hps -application/vnd.hp-jlyt jlt -application/vnd.hp-pcl pcl -application/vnd.hp-pclxl pclxl -# application/vnd.httphone -application/vnd.hydrostatix.sof-data sfd-hdstx -application/vnd.hzn-3d-crossword x3d -# application/vnd.ibm.afplinedata -# application/vnd.ibm.electronic-media -application/vnd.ibm.minipay mpy -application/vnd.ibm.modcap afp listafp list3820 -application/vnd.ibm.rights-management irm -application/vnd.ibm.secure-container sc -application/vnd.iccprofile icc icm -application/vnd.igloader igl -application/vnd.immervision-ivp ivp -application/vnd.immervision-ivu ivu -# application/vnd.informedcontrol.rms+xml -# application/vnd.informix-visionary -# application/vnd.infotech.project -# application/vnd.infotech.project+xml -application/vnd.insors.igm igm -application/vnd.intercon.formnet xpw xpx -application/vnd.intergeo i2g -# application/vnd.intertrust.digibox -# application/vnd.intertrust.nncp -application/vnd.intu.qbo qbo -application/vnd.intu.qfx qfx -# application/vnd.iptc.g2.conceptitem+xml -# application/vnd.iptc.g2.knowledgeitem+xml -# application/vnd.iptc.g2.newsitem+xml -# application/vnd.iptc.g2.packageitem+xml -application/vnd.ipunplugged.rcprofile rcprofile -application/vnd.irepository.package+xml irp -application/vnd.is-xpr xpr -application/vnd.isac.fcs fcs -application/vnd.jam jam -# application/vnd.japannet-directory-service -# application/vnd.japannet-jpnstore-wakeup -# application/vnd.japannet-payment-wakeup -# application/vnd.japannet-registration -# application/vnd.japannet-registration-wakeup -# application/vnd.japannet-setstore-wakeup -# application/vnd.japannet-verification -# application/vnd.japannet-verification-wakeup -application/vnd.jcp.javame.midlet-rms rms -application/vnd.jisp jisp -application/vnd.joost.joda-archive joda -application/vnd.kahootz ktz ktr -application/vnd.kde.karbon karbon -application/vnd.kde.kchart chrt -application/vnd.kde.kformula kfo -application/vnd.kde.kivio flw -application/vnd.kde.kontour kon -application/vnd.kde.kpresenter kpr kpt -application/vnd.kde.kspread ksp -application/vnd.kde.kword kwd kwt -application/vnd.kenameaapp htke -application/vnd.kidspiration kia -application/vnd.kinar kne knp -application/vnd.koan skp skd skt skm -application/vnd.kodak-descriptor sse -application/vnd.las.las+xml lasxml -# application/vnd.liberty-request+xml -application/vnd.llamagraphics.life-balance.desktop lbd -application/vnd.llamagraphics.life-balance.exchange+xml lbe -application/vnd.lotus-1-2-3 123 -application/vnd.lotus-approach apr -application/vnd.lotus-freelance pre -application/vnd.lotus-notes nsf -application/vnd.lotus-organizer org -application/vnd.lotus-screencam scm -application/vnd.lotus-wordpro lwp -application/vnd.macports.portpkg portpkg -# application/vnd.marlin.drm.actiontoken+xml -# application/vnd.marlin.drm.conftoken+xml -# application/vnd.marlin.drm.license+xml -# application/vnd.marlin.drm.mdcf -application/vnd.mcd mcd -application/vnd.medcalcdata mc1 -application/vnd.mediastation.cdkey cdkey -# application/vnd.meridian-slingshot -application/vnd.mfer mwf -application/vnd.mfmp mfm -application/vnd.micrografx.flo flo -application/vnd.micrografx.igx igx -application/vnd.mif mif -# application/vnd.minisoft-hp3000-save -# application/vnd.mitsubishi.misty-guard.trustweb -application/vnd.mobius.daf daf -application/vnd.mobius.dis dis -application/vnd.mobius.mbk mbk -application/vnd.mobius.mqy mqy -application/vnd.mobius.msl msl -application/vnd.mobius.plc plc -application/vnd.mobius.txf txf -application/vnd.mophun.application mpn -application/vnd.mophun.certificate mpc -# application/vnd.motorola.flexsuite -# application/vnd.motorola.flexsuite.adsi -# application/vnd.motorola.flexsuite.fis -# application/vnd.motorola.flexsuite.gotap -# application/vnd.motorola.flexsuite.kmr -# application/vnd.motorola.flexsuite.ttc -# application/vnd.motorola.flexsuite.wem -# application/vnd.motorola.iprm -application/vnd.mozilla.xul+xml xul -application/vnd.ms-artgalry cil -# application/vnd.ms-asf -application/vnd.ms-cab-compressed cab -application/vnd.ms-excel xls xlm xla xlc xlt xlw -application/vnd.ms-excel.addin.macroenabled.12 xlam -application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb -application/vnd.ms-excel.sheet.macroenabled.12 xlsm -application/vnd.ms-excel.template.macroenabled.12 xltm -application/vnd.ms-fontobject eot -application/vnd.ms-htmlhelp chm -application/vnd.ms-ims ims -application/vnd.ms-lrm lrm -# application/vnd.ms-office.activex+xml -application/vnd.ms-officetheme thmx -application/vnd.ms-pki.seccat cat -application/vnd.ms-pki.stl stl -# application/vnd.ms-playready.initiator+xml -application/vnd.ms-powerpoint ppt pps pot -application/vnd.ms-powerpoint.addin.macroenabled.12 ppam -application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm -application/vnd.ms-powerpoint.slide.macroenabled.12 sldm -application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm -application/vnd.ms-powerpoint.template.macroenabled.12 potm -application/vnd.ms-project mpp mpt -# application/vnd.ms-tnef -# application/vnd.ms-wmdrm.lic-chlg-req -# application/vnd.ms-wmdrm.lic-resp -# application/vnd.ms-wmdrm.meter-chlg-req -# application/vnd.ms-wmdrm.meter-resp -application/vnd.ms-word.document.macroenabled.12 docm -application/vnd.ms-word.template.macroenabled.12 dotm -application/vnd.ms-works wps wks wcm wdb -application/vnd.ms-wpl wpl -application/vnd.ms-xpsdocument xps -application/vnd.mseq mseq -# application/vnd.msign -# application/vnd.multiad.creator -# application/vnd.multiad.creator.cif -# application/vnd.music-niff -application/vnd.musician mus -application/vnd.muvee.style msty -application/vnd.mynfc taglet -# application/vnd.ncd.control -# application/vnd.ncd.reference -# application/vnd.nervana -# application/vnd.netfpx -application/vnd.neurolanguage.nlu nlu -application/vnd.noblenet-directory nnd -application/vnd.noblenet-sealer nns -application/vnd.noblenet-web nnw -# application/vnd.nokia.catalogs -# application/vnd.nokia.conml+wbxml -# application/vnd.nokia.conml+xml -# application/vnd.nokia.isds-radio-presets -# application/vnd.nokia.iptv.config+xml -# application/vnd.nokia.landmark+wbxml -# application/vnd.nokia.landmark+xml -# application/vnd.nokia.landmarkcollection+xml -# application/vnd.nokia.n-gage.ac+xml -application/vnd.nokia.n-gage.data ngdat -application/vnd.nokia.n-gage.symbian.install n-gage -# application/vnd.nokia.ncd -# application/vnd.nokia.pcd+wbxml -# application/vnd.nokia.pcd+xml -application/vnd.nokia.radio-preset rpst -application/vnd.nokia.radio-presets rpss -application/vnd.novadigm.edm edm -application/vnd.novadigm.edx edx -application/vnd.novadigm.ext ext -# application/vnd.ntt-local.file-transfer -# application/vnd.ntt-local.sip-ta_remote -# application/vnd.ntt-local.sip-ta_tcp_stream -application/vnd.oasis.opendocument.chart odc -application/vnd.oasis.opendocument.chart-template otc -application/vnd.oasis.opendocument.database odb -application/vnd.oasis.opendocument.formula odf -application/vnd.oasis.opendocument.formula-template odft -application/vnd.oasis.opendocument.graphics odg -application/vnd.oasis.opendocument.graphics-template otg -application/vnd.oasis.opendocument.image odi -application/vnd.oasis.opendocument.image-template oti -application/vnd.oasis.opendocument.presentation odp -application/vnd.oasis.opendocument.presentation-template otp -application/vnd.oasis.opendocument.spreadsheet ods -application/vnd.oasis.opendocument.spreadsheet-template ots -application/vnd.oasis.opendocument.text odt -application/vnd.oasis.opendocument.text-master odm -application/vnd.oasis.opendocument.text-template ott -application/vnd.oasis.opendocument.text-web oth -# application/vnd.obn -# application/vnd.oftn.l10n+json -# application/vnd.oipf.contentaccessdownload+xml -# application/vnd.oipf.contentaccessstreaming+xml -# application/vnd.oipf.cspg-hexbinary -# application/vnd.oipf.dae.svg+xml -# application/vnd.oipf.dae.xhtml+xml -# application/vnd.oipf.mippvcontrolmessage+xml -# application/vnd.oipf.pae.gem -# application/vnd.oipf.spdiscovery+xml -# application/vnd.oipf.spdlist+xml -# application/vnd.oipf.ueprofile+xml -# application/vnd.oipf.userprofile+xml -application/vnd.olpc-sugar xo -# application/vnd.oma-scws-config -# application/vnd.oma-scws-http-request -# application/vnd.oma-scws-http-response -# application/vnd.oma.bcast.associated-procedure-parameter+xml -# application/vnd.oma.bcast.drm-trigger+xml -# application/vnd.oma.bcast.imd+xml -# application/vnd.oma.bcast.ltkm -# application/vnd.oma.bcast.notification+xml -# application/vnd.oma.bcast.provisioningtrigger -# application/vnd.oma.bcast.sgboot -# application/vnd.oma.bcast.sgdd+xml -# application/vnd.oma.bcast.sgdu -# application/vnd.oma.bcast.simple-symbol-container -# application/vnd.oma.bcast.smartcard-trigger+xml -# application/vnd.oma.bcast.sprov+xml -# application/vnd.oma.bcast.stkm -# application/vnd.oma.cab-address-book+xml -# application/vnd.oma.cab-feature-handler+xml -# application/vnd.oma.cab-pcc+xml -# application/vnd.oma.cab-user-prefs+xml -# application/vnd.oma.dcd -# application/vnd.oma.dcdc -application/vnd.oma.dd2+xml dd2 -# application/vnd.oma.drm.risd+xml -# application/vnd.oma.group-usage-list+xml -# application/vnd.oma.pal+xml -# application/vnd.oma.poc.detailed-progress-report+xml -# application/vnd.oma.poc.final-report+xml -# application/vnd.oma.poc.groups+xml -# application/vnd.oma.poc.invocation-descriptor+xml -# application/vnd.oma.poc.optimized-progress-report+xml -# application/vnd.oma.push -# application/vnd.oma.scidm.messages+xml -# application/vnd.oma.xcap-directory+xml -# application/vnd.omads-email+xml -# application/vnd.omads-file+xml -# application/vnd.omads-folder+xml -# application/vnd.omaloc-supl-init -application/vnd.openofficeorg.extension oxt -# application/vnd.openxmlformats-officedocument.custom-properties+xml -# application/vnd.openxmlformats-officedocument.customxmlproperties+xml -# application/vnd.openxmlformats-officedocument.drawing+xml -# application/vnd.openxmlformats-officedocument.drawingml.chart+xml -# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml -# application/vnd.openxmlformats-officedocument.extended-properties+xml -# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml -# application/vnd.openxmlformats-officedocument.presentationml.comments+xml -# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml -application/vnd.openxmlformats-officedocument.presentationml.presentation pptx -# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml -application/vnd.openxmlformats-officedocument.presentationml.slide sldx -# application/vnd.openxmlformats-officedocument.presentationml.slide+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml -application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx -# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml -# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml -# application/vnd.openxmlformats-officedocument.presentationml.tags+xml -application/vnd.openxmlformats-officedocument.presentationml.template potx -# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx -# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml -# application/vnd.openxmlformats-officedocument.theme+xml -# application/vnd.openxmlformats-officedocument.themeoverride+xml -# application/vnd.openxmlformats-officedocument.vmldrawing -# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.document docx -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx -# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml -# application/vnd.openxmlformats-package.core-properties+xml -# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml -# application/vnd.openxmlformats-package.relationships+xml -# application/vnd.quobject-quoxdocument -# application/vnd.osa.netdeploy -application/vnd.osgeo.mapguide.package mgp -# application/vnd.osgi.bundle -application/vnd.osgi.dp dp -# application/vnd.otps.ct-kip+xml -application/vnd.palm pdb pqa oprc -# application/vnd.paos.xml -application/vnd.pawaafile paw -application/vnd.pg.format str -application/vnd.pg.osasli ei6 -# application/vnd.piaccess.application-licence -application/vnd.picsel efif -application/vnd.pmi.widget wg -# application/vnd.poc.group-advertisement+xml -application/vnd.pocketlearn plf -application/vnd.powerbuilder6 pbd -# application/vnd.powerbuilder6-s -# application/vnd.powerbuilder7 -# application/vnd.powerbuilder7-s -# application/vnd.powerbuilder75 -# application/vnd.powerbuilder75-s -# application/vnd.preminet -application/vnd.previewsystems.box box -application/vnd.proteus.magazine mgz -application/vnd.publishare-delta-tree qps -application/vnd.pvi.ptid1 ptid -# application/vnd.pwg-multiplexed -# application/vnd.pwg-xhtml-print+xml -# application/vnd.qualcomm.brew-app-res -application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb -# application/vnd.radisys.moml+xml -# application/vnd.radisys.msml+xml -# application/vnd.radisys.msml-audit+xml -# application/vnd.radisys.msml-audit-conf+xml -# application/vnd.radisys.msml-audit-conn+xml -# application/vnd.radisys.msml-audit-dialog+xml -# application/vnd.radisys.msml-audit-stream+xml -# application/vnd.radisys.msml-conf+xml -# application/vnd.radisys.msml-dialog+xml -# application/vnd.radisys.msml-dialog-base+xml -# application/vnd.radisys.msml-dialog-fax-detect+xml -# application/vnd.radisys.msml-dialog-fax-sendrecv+xml -# application/vnd.radisys.msml-dialog-group+xml -# application/vnd.radisys.msml-dialog-speech+xml -# application/vnd.radisys.msml-dialog-transform+xml -# application/vnd.rainstor.data -# application/vnd.rapid -application/vnd.realvnc.bed bed -application/vnd.recordare.musicxml mxl -application/vnd.recordare.musicxml+xml musicxml -# application/vnd.renlearn.rlprint -application/vnd.rig.cryptonote cryptonote -application/vnd.rim.cod cod -application/vnd.rn-realmedia rm -application/vnd.route66.link66+xml link66 -# application/vnd.ruckus.download -# application/vnd.s3sms -application/vnd.sailingtracker.track st -# application/vnd.sbm.cid -# application/vnd.sbm.mid2 -# application/vnd.scribus -# application/vnd.sealed.3df -# application/vnd.sealed.csf -# application/vnd.sealed.doc -# application/vnd.sealed.eml -# application/vnd.sealed.mht -# application/vnd.sealed.net -# application/vnd.sealed.ppt -# application/vnd.sealed.tiff -# application/vnd.sealed.xls -# application/vnd.sealedmedia.softseal.html -# application/vnd.sealedmedia.softseal.pdf -application/vnd.seemail see -application/vnd.sema sema -application/vnd.semd semd -application/vnd.semf semf -application/vnd.shana.informed.formdata ifm -application/vnd.shana.informed.formtemplate itp -application/vnd.shana.informed.interchange iif -application/vnd.shana.informed.package ipk -application/vnd.simtech-mindmapper twd twds -application/vnd.smaf mmf -# application/vnd.smart.notebook -application/vnd.smart.teacher teacher -# application/vnd.software602.filler.form+xml -# application/vnd.software602.filler.form-xml-zip -application/vnd.solent.sdkm+xml sdkm sdkd -application/vnd.spotfire.dxp dxp -application/vnd.spotfire.sfs sfs -# application/vnd.sss-cod -# application/vnd.sss-dtf -# application/vnd.sss-ntf -application/vnd.stardivision.calc sdc -application/vnd.stardivision.draw sda -application/vnd.stardivision.impress sdd -application/vnd.stardivision.math smf -application/vnd.stardivision.writer sdw vor -application/vnd.stardivision.writer-global sgl -application/vnd.stepmania.package smzip -application/vnd.stepmania.stepchart sm -# application/vnd.street-stream -application/vnd.sun.xml.calc sxc -application/vnd.sun.xml.calc.template stc -application/vnd.sun.xml.draw sxd -application/vnd.sun.xml.draw.template std -application/vnd.sun.xml.impress sxi -application/vnd.sun.xml.impress.template sti -application/vnd.sun.xml.math sxm -application/vnd.sun.xml.writer sxw -application/vnd.sun.xml.writer.global sxg -application/vnd.sun.xml.writer.template stw -# application/vnd.sun.wadl+xml -application/vnd.sus-calendar sus susp -application/vnd.svd svd -# application/vnd.swiftview-ics -application/vnd.symbian.install sis sisx -application/vnd.syncml+xml xsm -application/vnd.syncml.dm+wbxml bdm -application/vnd.syncml.dm+xml xdm -# application/vnd.syncml.dm.notification -# application/vnd.syncml.ds.notification -application/vnd.tao.intent-module-archive tao -application/vnd.tcpdump.pcap pcap cap dmp -application/vnd.tmobile-livetv tmo -application/vnd.trid.tpt tpt -application/vnd.triscape.mxs mxs -application/vnd.trueapp tra -# application/vnd.truedoc -# application/vnd.ubisoft.webplayer -application/vnd.ufdl ufd ufdl -application/vnd.uiq.theme utz -application/vnd.umajin umj -application/vnd.unity unityweb -application/vnd.uoml+xml uoml -# application/vnd.uplanet.alert -# application/vnd.uplanet.alert-wbxml -# application/vnd.uplanet.bearer-choice -# application/vnd.uplanet.bearer-choice-wbxml -# application/vnd.uplanet.cacheop -# application/vnd.uplanet.cacheop-wbxml -# application/vnd.uplanet.channel -# application/vnd.uplanet.channel-wbxml -# application/vnd.uplanet.list -# application/vnd.uplanet.list-wbxml -# application/vnd.uplanet.listcmd -# application/vnd.uplanet.listcmd-wbxml -# application/vnd.uplanet.signal -application/vnd.vcx vcx -# application/vnd.vd-study -# application/vnd.vectorworks -# application/vnd.verimatrix.vcas -# application/vnd.vidsoft.vidconference -application/vnd.visio vsd vst vss vsw -application/vnd.visionary vis -# application/vnd.vividence.scriptfile -application/vnd.vsf vsf -# application/vnd.wap.sic -# application/vnd.wap.slc -application/vnd.wap.wbxml wbxml -application/vnd.wap.wmlc wmlc -application/vnd.wap.wmlscriptc wmlsc -application/vnd.webturbo wtb -# application/vnd.wfa.wsc -# application/vnd.wmc -# application/vnd.wmf.bootstrap -# application/vnd.wolfram.mathematica -# application/vnd.wolfram.mathematica.package -application/vnd.wolfram.player nbp -application/vnd.wordperfect wpd -application/vnd.wqd wqd -# application/vnd.wrq-hp3000-labelled -application/vnd.wt.stf stf -# application/vnd.wv.csp+wbxml -# application/vnd.wv.csp+xml -# application/vnd.wv.ssp+xml -application/vnd.xara xar -application/vnd.xfdl xfdl -# application/vnd.xfdl.webform -# application/vnd.xmi+xml -# application/vnd.xmpie.cpkg -# application/vnd.xmpie.dpkg -# application/vnd.xmpie.plan -# application/vnd.xmpie.ppkg -# application/vnd.xmpie.xlim -application/vnd.yamaha.hv-dic hvd -application/vnd.yamaha.hv-script hvs -application/vnd.yamaha.hv-voice hvp -application/vnd.yamaha.openscoreformat osf -application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg -# application/vnd.yamaha.remote-setup -application/vnd.yamaha.smaf-audio saf -application/vnd.yamaha.smaf-phrase spf -# application/vnd.yamaha.through-ngn -# application/vnd.yamaha.tunnel-udpencap -application/vnd.yellowriver-custom-menu cmp -application/vnd.zul zir zirz -application/vnd.zzazz.deck+xml zaz -application/voicexml+xml vxml -# application/vq-rtcpxr -# application/watcherinfo+xml -# application/whoispp-query -# application/whoispp-response -application/widget wgt -application/winhlp hlp -# application/wita -# application/wordperfect5.1 -application/wsdl+xml wsdl -application/wspolicy+xml wspolicy -application/x-7z-compressed 7z -application/x-abiword abw -application/x-ace-compressed ace -application/x-authorware-bin aab x32 u32 vox -application/x-authorware-map aam -application/x-authorware-seg aas -application/x-bcpio bcpio -application/x-bittorrent torrent -application/x-bzip bz -application/x-bzip2 bz2 boz -application/x-cdlink vcd -application/x-chat chat -application/x-chess-pgn pgn -# application/x-compress -application/x-cpio cpio -application/x-csh csh -application/x-debian-package deb udeb -application/x-director dir dcr dxr cst cct cxt w3d fgd swa -application/x-doom wad -application/x-dtbncx+xml ncx -application/x-dtbook+xml dtb -application/x-dtbresource+xml res -application/x-dvi dvi -application/x-font-bdf bdf -# application/x-font-dos -# application/x-font-framemaker -application/x-font-ghostscript gsf -# application/x-font-libgrx -application/x-font-linux-psf psf -application/x-font-otf otf -application/x-font-pcf pcf -application/x-font-snf snf -# application/x-font-speedo -# application/x-font-sunos-news -application/x-font-ttf ttf ttc -application/x-font-type1 pfa pfb pfm afm -application/x-font-woff woff -# application/x-font-vfont -application/x-futuresplash spl -application/x-gnumeric gnumeric -application/x-gtar gtar -# application/x-gzip -application/x-hdf hdf -application/x-java-jnlp-file jnlp -application/x-latex latex -application/x-mobipocket-ebook prc mobi -application/x-ms-application application -application/x-ms-wmd wmd -application/x-ms-wmz wmz -application/x-ms-xbap xbap -application/x-msaccess mdb -application/x-msbinder obd -application/x-mscardfile crd -application/x-msclip clp -application/x-msdownload exe dll com bat msi -application/x-msmediaview mvb m13 m14 -application/x-msmetafile wmf -application/x-msmoney mny -application/x-mspublisher pub -application/x-msschedule scd -application/x-msterminal trm -application/x-mswrite wri -application/x-netcdf nc cdf -application/x-pkcs12 p12 pfx -application/x-pkcs7-certificates p7b spc -application/x-pkcs7-certreqresp p7r -application/x-rar-compressed rar -application/x-sh sh -application/x-shar shar -application/x-shockwave-flash swf -application/x-silverlight-app xap -application/x-stuffit sit -application/x-stuffitx sitx -application/x-sv4cpio sv4cpio -application/x-sv4crc sv4crc -application/x-tar tar -application/x-tcl tcl -application/x-tex tex -application/x-tex-tfm tfm -application/x-texinfo texinfo texi -application/x-ustar ustar -application/x-wais-source src -application/x-x509-ca-cert der crt -application/x-xfig fig -application/x-xpinstall xpi -# application/x400-bp -# application/xcap-att+xml -# application/xcap-caps+xml -application/xcap-diff+xml xdf -# application/xcap-el+xml -# application/xcap-error+xml -# application/xcap-ns+xml -# application/xcon-conference-info-diff+xml -# application/xcon-conference-info+xml -application/xenc+xml xenc -application/xhtml+xml xhtml xht -# application/xhtml-voice+xml -application/xml xml xsl -application/xml-dtd dtd -# application/xml-external-parsed-entity -# application/xmpp+xml -application/xop+xml xop -application/xslt+xml xslt -application/xspf+xml xspf -application/xv+xml mxml xhvml xvml xvm -application/yang yang -application/yin+xml yin -application/zip zip -# audio/1d-interleaved-parityfec -# audio/32kadpcm -# audio/3gpp -# audio/3gpp2 -# audio/ac3 -audio/adpcm adp -# audio/amr -# audio/amr-wb -# audio/amr-wb+ -# audio/asc -# audio/atrac-advanced-lossless -# audio/atrac-x -# audio/atrac3 -audio/basic au snd -# audio/bv16 -# audio/bv32 -# audio/clearmode -# audio/cn -# audio/dat12 -# audio/dls -# audio/dsr-es201108 -# audio/dsr-es202050 -# audio/dsr-es202211 -# audio/dsr-es202212 -# audio/dv -# audio/dvi4 -# audio/eac3 -# audio/evrc -# audio/evrc-qcp -# audio/evrc0 -# audio/evrc1 -# audio/evrcb -# audio/evrcb0 -# audio/evrcb1 -# audio/evrcwb -# audio/evrcwb0 -# audio/evrcwb1 -# audio/example -# audio/fwdred -# audio/g719 -# audio/g722 -# audio/g7221 -# audio/g723 -# audio/g726-16 -# audio/g726-24 -# audio/g726-32 -# audio/g726-40 -# audio/g728 -# audio/g729 -# audio/g7291 -# audio/g729d -# audio/g729e -# audio/gsm -# audio/gsm-efr -# audio/gsm-hr-08 -# audio/ilbc -# audio/ip-mr_v2.5 -# audio/l16 -# audio/l20 -# audio/l24 -# audio/l8 -# audio/lpc -audio/midi mid midi kar rmi -# audio/mobile-xmf -audio/mp4 mp4a -# audio/mp4a-latm -# audio/mpa -# audio/mpa-robust -audio/mpeg mpga mp2 mp2a mp3 m2a m3a -# audio/mpeg4-generic -audio/ogg oga ogg spx -# audio/parityfec -# audio/pcma -# audio/pcma-wb -# audio/pcmu-wb -# audio/pcmu -# audio/prs.sid -# audio/qcelp -# audio/red -# audio/rtp-enc-aescm128 -# audio/rtp-midi -# audio/rtx -# audio/smv -# audio/smv0 -# audio/smv-qcp -# audio/sp-midi -# audio/speex -# audio/t140c -# audio/t38 -# audio/telephone-event -# audio/tone -# audio/uemclip -# audio/ulpfec -# audio/vdvi -# audio/vmr-wb -# audio/vnd.3gpp.iufp -# audio/vnd.4sb -# audio/vnd.audiokoz -# audio/vnd.celp -# audio/vnd.cisco.nse -# audio/vnd.cmles.radio-events -# audio/vnd.cns.anp1 -# audio/vnd.cns.inf1 -audio/vnd.dece.audio uva uvva -audio/vnd.digital-winds eol -# audio/vnd.dlna.adts -# audio/vnd.dolby.heaac.1 -# audio/vnd.dolby.heaac.2 -# audio/vnd.dolby.mlp -# audio/vnd.dolby.mps -# audio/vnd.dolby.pl2 -# audio/vnd.dolby.pl2x -# audio/vnd.dolby.pl2z -# audio/vnd.dolby.pulse.1 -audio/vnd.dra dra -audio/vnd.dts dts -audio/vnd.dts.hd dtshd -# audio/vnd.dvb.file dvb -# audio/vnd.everad.plj -# audio/vnd.hns.audio -audio/vnd.lucent.voice lvp -audio/vnd.ms-playready.media.pya pya -# audio/vnd.nokia.mobile-xmf -# audio/vnd.nortel.vbk -audio/vnd.nuera.ecelp4800 ecelp4800 -audio/vnd.nuera.ecelp7470 ecelp7470 -audio/vnd.nuera.ecelp9600 ecelp9600 -# audio/vnd.octel.sbc -# audio/vnd.qcelp -# audio/vnd.rhetorex.32kadpcm -audio/vnd.rip rip -# audio/vnd.sealedmedia.softseal.mpeg -# audio/vnd.vmx.cvsd -# audio/vorbis -# audio/vorbis-config -audio/webm weba -audio/x-aac aac -audio/x-aiff aif aiff aifc -audio/x-mpegurl m3u -audio/x-ms-wax wax -audio/x-ms-wma wma -audio/x-pn-realaudio ram ra -audio/x-pn-realaudio-plugin rmp -audio/x-wav wav -chemical/x-cdx cdx -chemical/x-cif cif -chemical/x-cmdf cmdf -chemical/x-cml cml -chemical/x-csml csml -# chemical/x-pdb -chemical/x-xyz xyz -image/bmp bmp -image/cgm cgm -# image/example -# image/fits -image/g3fax g3 -image/gif gif -image/ief ief -# image/jp2 -image/jpeg jpeg jpg jpe -# image/jpm -# image/jpx -image/ktx ktx -# image/naplps -image/png png -image/prs.btif btif -# image/prs.pti -image/svg+xml svg svgz -# image/t38 -image/tiff tiff tif -# image/tiff-fx -image/vnd.adobe.photoshop psd -# image/vnd.cns.inf2 -image/vnd.dece.graphic uvi uvvi uvg uvvg -image/vnd.dvb.subtitle sub -image/vnd.djvu djvu djv -image/vnd.dwg dwg -image/vnd.dxf dxf -image/vnd.fastbidsheet fbs -image/vnd.fpx fpx -image/vnd.fst fst -image/vnd.fujixerox.edmics-mmr mmr -image/vnd.fujixerox.edmics-rlc rlc -# image/vnd.globalgraphics.pgb -# image/vnd.microsoft.icon -# image/vnd.mix -image/vnd.ms-modi mdi -image/vnd.net-fpx npx -# image/vnd.radiance -# image/vnd.sealed.png -# image/vnd.sealedmedia.softseal.gif -# image/vnd.sealedmedia.softseal.jpg -# image/vnd.svf -image/vnd.wap.wbmp wbmp -image/vnd.xiff xif -image/webp webp -image/x-cmu-raster ras -image/x-cmx cmx -image/x-freehand fh fhc fh4 fh5 fh7 -image/x-icon ico -image/x-pcx pcx -image/x-pict pic pct -image/x-portable-anymap pnm -image/x-portable-bitmap pbm -image/x-portable-graymap pgm -image/x-portable-pixmap ppm -image/x-rgb rgb -image/x-xbitmap xbm -image/x-xpixmap xpm -image/x-xwindowdump xwd -# message/cpim -# message/delivery-status -# message/disposition-notification -# message/example -# message/external-body -# message/feedback-report -# message/global -# message/global-delivery-status -# message/global-disposition-notification -# message/global-headers -# message/http -# message/imdn+xml -# message/news -# message/partial -message/rfc822 eml mime -# message/s-http -# message/sip -# message/sipfrag -# message/tracking-status -# message/vnd.si.simp -# model/example -model/iges igs iges -model/mesh msh mesh silo -model/vnd.collada+xml dae -model/vnd.dwf dwf -# model/vnd.flatland.3dml -model/vnd.gdl gdl -# model/vnd.gs-gdl -# model/vnd.gs.gdl -model/vnd.gtw gtw -# model/vnd.moml+xml -model/vnd.mts mts -# model/vnd.parasolid.transmit.binary -# model/vnd.parasolid.transmit.text -model/vnd.vtu vtu -model/vrml wrl vrml -# multipart/alternative -# multipart/appledouble -# multipart/byteranges -# multipart/digest -# multipart/encrypted -# multipart/example -# multipart/form-data -# multipart/header-set -# multipart/mixed -# multipart/parallel -# multipart/related -# multipart/report -# multipart/signed -# multipart/voice-message -# text/1d-interleaved-parityfec -text/calendar ics ifb -text/css css -text/csv csv -# text/directory -# text/dns -# text/ecmascript -# text/enriched -# text/example -# text/fwdred -text/html html htm -# text/javascript -text/n3 n3 -# text/parityfec -text/plain txt text conf def list log in -# text/prs.fallenstein.rst -text/prs.lines.tag dsc -# text/vnd.radisys.msml-basic-layout -# text/red -# text/rfc822-headers -text/richtext rtx -# text/rtf -# text/rtp-enc-aescm128 -# text/rtx -text/sgml sgml sgm -# text/t140 -text/tab-separated-values tsv -text/troff t tr roff man me ms -text/turtle ttl -# text/ulpfec -text/uri-list uri uris urls -text/vcard vcard -# text/vnd.abc -text/vnd.curl curl -text/vnd.curl.dcurl dcurl -text/vnd.curl.scurl scurl -text/vnd.curl.mcurl mcurl -# text/vnd.dmclientscript -text/vnd.dvb.subtitle sub -# text/vnd.esmertec.theme-descriptor -text/vnd.fly fly -text/vnd.fmi.flexstor flx -text/vnd.graphviz gv -text/vnd.in3d.3dml 3dml -text/vnd.in3d.spot spot -# text/vnd.iptc.newsml -# text/vnd.iptc.nitf -# text/vnd.latex-z -# text/vnd.motorola.reflex -# text/vnd.ms-mediapackage -# text/vnd.net2phone.commcenter.command -# text/vnd.si.uricatalogue -text/vnd.sun.j2me.app-descriptor jad -# text/vnd.trolltech.linguist -# text/vnd.wap.si -# text/vnd.wap.sl -text/vnd.wap.wml wml -text/vnd.wap.wmlscript wmls -text/x-asm s asm -text/x-c c cc cxx cpp h hh dic -text/x-fortran f for f77 f90 -text/x-pascal p pas -text/x-java-source java -text/x-setext etx -text/x-uuencode uu -text/x-vcalendar vcs -text/x-vcard vcf -# text/xml -# text/xml-external-parsed-entity -# video/1d-interleaved-parityfec -video/3gpp 3gp -# video/3gpp-tt -video/3gpp2 3g2 -# video/bmpeg -# video/bt656 -# video/celb -# video/dv -# video/example -video/h261 h261 -video/h263 h263 -# video/h263-1998 -# video/h263-2000 -video/h264 h264 -# video/h264-rcdo -# video/h264-svc -video/jpeg jpgv -# video/jpeg2000 -video/jpm jpm jpgm -video/mj2 mj2 mjp2 -# video/mp1s -# video/mp2p -# video/mp2t -video/mp4 mp4 mp4v mpg4 -# video/mp4v-es -video/mpeg mpeg mpg mpe m1v m2v -# video/mpeg4-generic -# video/mpv -# video/nv -video/ogg ogv -# video/parityfec -# video/pointer -video/quicktime qt mov -# video/raw -# video/rtp-enc-aescm128 -# video/rtx -# video/smpte292m -# video/ulpfec -# video/vc1 -# video/vnd.cctv -video/vnd.dece.hd uvh uvvh -video/vnd.dece.mobile uvm uvvm -# video/vnd.dece.mp4 -video/vnd.dece.pd uvp uvvp -video/vnd.dece.sd uvs uvvs -video/vnd.dece.video uvv uvvv -# video/vnd.directv.mpeg -# video/vnd.directv.mpeg-tts -# video/vnd.dlna.mpeg-tts -video/vnd.dvb.file dvb -video/vnd.fvt fvt -# video/vnd.hns.video -# video/vnd.iptvforum.1dparityfec-1010 -# video/vnd.iptvforum.1dparityfec-2005 -# video/vnd.iptvforum.2dparityfec-1010 -# video/vnd.iptvforum.2dparityfec-2005 -# video/vnd.iptvforum.ttsavc -# video/vnd.iptvforum.ttsmpeg2 -# video/vnd.motorola.video -# video/vnd.motorola.videop -video/vnd.mpegurl mxu m4u -video/vnd.ms-playready.media.pyv pyv -# video/vnd.nokia.interleaved-multimedia -# video/vnd.nokia.videovoip -# video/vnd.objectvideo -# video/vnd.sealed.mpeg1 -# video/vnd.sealed.mpeg4 -# video/vnd.sealed.swf -# video/vnd.sealedmedia.softseal.mov -video/vnd.uvvu.mp4 uvu uvvu -video/vnd.vivo viv -video/webm webm -video/x-f4v f4v -video/x-fli fli -video/x-flv flv -video/x-m4v m4v -video/x-ms-asf asf asx -video/x-ms-wm wm -video/x-ms-wmv wmv -video/x-ms-wmx wmx -video/x-ms-wvx wvx -video/x-msvideo avi -video/x-sgi-movie movie -x-conference/x-cooltalk ice diff --git a/node_modules/express/node_modules/send/node_modules/mime/types/node.types b/node_modules/express/node_modules/send/node_modules/mime/types/node.types deleted file mode 100644 index b7fe8c0..0000000 --- a/node_modules/express/node_modules/send/node_modules/mime/types/node.types +++ /dev/null @@ -1,65 +0,0 @@ -# What: Google Chrome Extension -# Why: To allow apps to (work) be served with the right content type header. -# http://codereview.chromium.org/2830017 -# Added by: niftylettuce -application/x-chrome-extension crx - -# What: OTF Message Silencer -# Why: To silence the "Resource interpreted as font but transferred with MIME -# type font/otf" message that occurs in Google Chrome -# Added by: niftylettuce -font/opentype otf - -# What: HTC support -# Why: To properly render .htc files such as CSS3PIE -# Added by: niftylettuce -text/x-component htc - -# What: HTML5 application cache manifest -# Why: De-facto standard. Required by Mozilla browser when serving HTML5 apps -# per https://developer.mozilla.org/en/offline_resources_in_firefox -# Added by: louisremi -text/cache-manifest appcache manifest - -# What: node binary buffer format -# Why: semi-standard extension w/in the node community -# Added by: tootallnate -application/octet-stream buffer - -# What: The "protected" MP-4 formats used by iTunes. -# Why: Required for streaming music to browsers (?) -# Added by: broofa -application/mp4 m4p -audio/mp4 m4a - -# What: Music playlist format (http://en.wikipedia.org/wiki/M3U) -# Why: See https://github.com/bentomas/node-mime/pull/6 -# Added by: mjrusso -application/x-mpegURL m3u8 - -# What: Video format, Part of RFC1890 -# Why: See https://github.com/bentomas/node-mime/pull/6 -# Added by: mjrusso -video/MP2T ts - -# What: The FLAC lossless codec format -# Why: Streaming and serving FLAC audio -# Added by: jacobrask -audio/flac flac - -# What: EventSource mime type -# Why: mime type of Server-Sent Events stream -# http://www.w3.org/TR/eventsource/#text-event-stream -# Added by: francois2metz -text/event-stream event-stream - -# What: Mozilla App manifest mime type -# Why: https://developer.mozilla.org/en/Apps/Manifest#Serving_manifests -# Added by: ednapiranha -application/x-web-app-manifest+json webapp - -# What: Matroska Mime Types -# Why: http://en.wikipedia.org/wiki/Matroska -# Added by: aduncan88 -video/x-matroska mkv -audio/x-matroska mka diff --git a/node_modules/express/node_modules/send/package.json b/node_modules/express/node_modules/send/package.json deleted file mode 100644 index 78fadcb..0000000 --- a/node_modules/express/node_modules/send/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "send", - "version": "0.1.0", - "description": "Better streaming static file server with Range and conditional-GET support", - "keywords": [ - "static", - "file", - "server" - ], - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "dependencies": { - "debug": "*", - "mime": "1.2.6", - "fresh": "0.1.0", - "range-parser": "0.0.4" - }, - "devDependencies": { - "mocha": "*", - "should": "*", - "supertest": "0.0.1", - "connect": "2.x" - }, - "scripts": { - "test": "make test" - }, - "main": "index", - "readme": "\n# send\n\n Send is Connect's `static()` extracted for generalized use, a streaming static file\n server supporting partial responses (Ranges), conditional-GET negotiation, high test coverage, and granular events which may be leveraged to take appropriate actions in your application or framework.\n\n## Installation\n\n $ npm install send\n\n## Examples\n\n Small:\n\n```js\nvar http = require('http');\nvar send = require('send');\n\nvar app = http.createServer(function(req, res){\n send(req, req.url).pipe(res);\n});\n```\n\n Serving from a root directory with custom error-handling:\n\n```js\nvar http = require('http');\nvar send = require('send');\n\nvar app = http.createServer(function(req, res){\n // your custom error-handling logic:\n function error(err) {\n res.statusCode = err.status || 500;\n res.end(err.message);\n }\n\n // your custom directory handling logic:\n function redirect() {\n res.statusCode = 301;\n res.setHeader('Location', req.url + '/');\n res.end('Redirecting to ' + req.url + '/');\n }\n\n // transfer arbitrary files from within\n // /www/example.com/public/*\n send(req, url.parse(req.url).pathname)\n .root('/www/example.com/public')\n .on('error', error)\n .on('directory', redirect)\n .pipe(res);\n});\n```\n\n## API\n\n### Events\n\n - `error` an error occurred `(err)`\n - `directory` a directory was requested\n - `stream` file streaming has started `(stream)`\n - `end` streaming has completed\n\n### .root(dir)\n\n Serve files relative to `path`. Aliased as `.from(dir)`.\n\n### .index(path)\n\n By default send supports \"index.html\" files, to disable this\n invoke `.index(false)` or to supply a new index pass a string.\n\n### .maxage(ms)\n\n Provide a max-age in milliseconds for http caching, defaults to 0.\n\n## Error-handling\n\n By default when no `error` listeners are present an automatic response will be made, otherwise you have full control over the response, aka you may show a 5xx page etc.\n\n## Caching\n\n It does _not_ perform internal caching, you should use a reverse proxy cache such\n as Varnish for this, or those fancy things called CDNs. If your application is small enough that it would benefit from single-node memory caching, it's small enough that it does not need caching at all ;).\n\n## Debugging\n\n To enable `debug()` instrumentation output export __DEBUG__:\n\n```\n$ DEBUG=send node app\n```\n\n## Running tests\n\n```\n$ npm install\n$ make test\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", - "_id": "send@0.1.0", - "_from": "send@0.1.0" -} diff --git a/node_modules/express/package.json b/node_modules/express/package.json deleted file mode 100644 index 8be502a..0000000 --- a/node_modules/express/package.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "name": "express", - "description": "Sinatra inspired web development framework", - "version": "3.1.0", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "contributors": [ - { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "Aaron Heckmann", - "email": "aaron.heckmann+github@gmail.com" - }, - { - "name": "Ciaran Jessup", - "email": "ciaranj@gmail.com" - }, - { - "name": "Guillermo Rauch", - "email": "rauchg@gmail.com" - } - ], - "dependencies": { - "connect": "2.7.2", - "commander": "0.6.1", - "range-parser": "0.0.4", - "mkdirp": "0.3.3", - "cookie": "0.0.5", - "buffer-crc32": "0.1.1", - "fresh": "0.1.0", - "methods": "0.0.1", - "send": "0.1.0", - "cookie-signature": "0.0.1", - "debug": "*" - }, - "devDependencies": { - "ejs": "*", - "mocha": "*", - "jade": "*", - "hjs": "*", - "stylus": "*", - "should": "*", - "connect-redis": "*", - "github-flavored-markdown": "*", - "supertest": "0.0.1" - }, - "keywords": [ - "express", - "framework", - "sinatra", - "web", - "rest", - "restful", - "router", - "app", - "api" - ], - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/express" - }, - "main": "index", - "bin": { - "express": "./bin/express" - }, - "scripts": { - "prepublish": "npm prune", - "test": "make test" - }, - "engines": { - "node": "*" - }, - "readme": "![express logo](http://f.cl.ly/items/0V2S1n0K1i3y1c122g04/Screen%20Shot%202012-04-11%20at%209.59.42%20AM.png)\n\n Fast, unopinionated, minimalist web framework for [node](http://nodejs.org). [![Build Status](https://secure.travis-ci.org/visionmedia/express.png)](http://travis-ci.org/visionmedia/express)\n\n```js\nvar express = require('express');\nvar app = express();\n\napp.get('/', function(req, res){\n res.send('Hello World');\n});\n\napp.listen(3000);\n```\n\n## Installation\n\n $ npm install -g express\n\n## Quick Start\n\n The quickest way to get started with express is to utilize the executable `express(1)` to generate an application as shown below:\n\n Create the app:\n\n $ npm install -g express\n $ express /tmp/foo && cd /tmp/foo\n\n Install dependencies:\n\n $ npm install\n\n Start the server:\n\n $ node app\n\n## Features\n\n * Built on [Connect](http://github.com/senchalabs/connect)\n * Robust routing\n * HTTP helpers (redirection, caching, etc)\n * View system supporting 14+ template engines\n * Content negotiation\n * Focus on high performance\n * Environment based configuration\n * Executable for generating applications quickly\n * High test coverage\n\n## Philosophy\n\n The Express philosophy is to provide small, robust tooling for HTTP servers. Making\n it a great solution for single page applications, web sites, hybrids, or public\n HTTP APIs.\n \n Built on Connect you can use _only_ what you need, and nothing more, applications\n can be as big or as small as you like, even a single file. Express does\n not force you to use any specific ORM or template engine. With support for over\n 14 template engines via [Consolidate.js](http://github.com/visionmedia/consolidate.js)\n you can quickly craft your perfect framework.\n\n## More Information\n\n * Join #express on freenode\n * [Google Group](http://groups.google.com/group/express-js) for discussion\n * Follow [tjholowaychuk](http://twitter.com/tjholowaychuk) on twitter for updates\n * Visit the [Wiki](http://github.com/visionmedia/express/wiki)\n * [日本語ドキュメンテーション](http://hideyukisaito.com/doc/expressjs/) by [hideyukisaito](https://github.com/hideyukisaito)\n * [Русскоязычная документация](http://express-js.ru/)\n\n## Viewing Examples\n\nClone the Express repo, then install the dev dependencies to install all the example / test suite deps:\n\n $ git clone git://github.com/visionmedia/express.git --depth 1\n $ cd express\n $ npm install\n\nthen run whichever tests you want:\n\n $ node examples/content-negotiation\n\n## Running Tests\n\nTo run the test suite first invoke the following command within the repo, installing the development dependencies:\n\n $ npm install\n\nthen run the tests:\n\n $ make test\n\n## Contributors\n\n```\nproject: express\ncommits: 3559\nactive : 468 days\nfiles : 237\nauthors: \n 1891\tTj Holowaychuk 53.1%\n 1285\tvisionmedia 36.1%\n 182\tTJ Holowaychuk 5.1%\n 54\tAaron Heckmann 1.5%\n 34\tcsausdev 1.0%\n 26\tciaranj 0.7%\n 21\tRobert Sköld 0.6%\n 6\tGuillermo Rauch 0.2%\n 3\tDav Glass 0.1%\n 3\tNick Poulden 0.1%\n 2\tRandy Merrill 0.1%\n 2\tBenny Wong 0.1%\n 2\tHunter Loftis 0.1%\n 2\tJake Gordon 0.1%\n 2\tBrian McKinney 0.1%\n 2\tRoman Shtylman 0.1%\n 2\tBen Weaver 0.1%\n 2\tDave Hoover 0.1%\n 2\tEivind Fjeldstad 0.1%\n 2\tDaniel Shaw 0.1%\n 1\tMatt Colyer 0.0%\n 1\tPau Ramon 0.0%\n 1\tPero Pejovic 0.0%\n 1\tPeter Rekdal Sunde 0.0%\n 1\tRaynos 0.0%\n 1\tTeng Siong Ong 0.0%\n 1\tViktor Kelemen 0.0%\n 1\tctide 0.0%\n 1\t8bitDesigner 0.0%\n 1\tisaacs 0.0%\n 1\tmgutz 0.0%\n 1\tpikeas 0.0%\n 1\tshuwatto 0.0%\n 1\ttstrimple 0.0%\n 1\tewoudj 0.0%\n 1\tAdam Sanderson 0.0%\n 1\tAndrii Kostenko 0.0%\n 1\tAndy Hiew 0.0%\n 1\tArpad Borsos 0.0%\n 1\tAshwin Purohit 0.0%\n 1\tBenjen 0.0%\n 1\tDarren Torpey 0.0%\n 1\tGreg Ritter 0.0%\n 1\tGregory Ritter 0.0%\n 1\tJames Herdman 0.0%\n 1\tJim Snodgrass 0.0%\n 1\tJoe McCann 0.0%\n 1\tJonathan Dumaine 0.0%\n 1\tJonathan Palardy 0.0%\n 1\tJonathan Zacsh 0.0%\n 1\tJustin Lilly 0.0%\n 1\tKen Sato 0.0%\n 1\tMaciej Małecki 0.0%\n 1\tMasahiro Hayashi 0.0%\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2009-2012 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", - "_id": "express@3.1.0", - "_from": "express@3.1.0" -} diff --git a/node_modules/express/test.js b/node_modules/express/test.js deleted file mode 100644 index 112ee0a..0000000 --- a/node_modules/express/test.js +++ /dev/null @@ -1,14 +0,0 @@ - -/** - * Module dependencies. - */ - -var express = require('./') - , app = express() - -app.get('/', function(req, res){ - console.log(req.query); -}); - -app.listen(3000); -console.log('listening on 3000'); diff --git a/node_modules/jwt-simple/.npmignore b/node_modules/jwt-simple/.npmignore deleted file mode 100644 index 10214a4..0000000 --- a/node_modules/jwt-simple/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -.vimrc* -.git* -.travis.yml diff --git a/node_modules/jwt-simple/History.md b/node_modules/jwt-simple/History.md deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/jwt-simple/LICENSE b/node_modules/jwt-simple/LICENSE deleted file mode 100644 index c23986b..0000000 --- a/node_modules/jwt-simple/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2011 Kazuhito Hokamura - -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. diff --git a/node_modules/jwt-simple/README.md b/node_modules/jwt-simple/README.md deleted file mode 100644 index 677c729..0000000 --- a/node_modules/jwt-simple/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# node-jwt-simple - -[JWT(JSON Web Token)](http://self-issued.info/docs/draft-jones-json-web-token.html) encode and decode module for node.js. - -JWT is used by [Google In-App Payments](http://code.google.com/intl/en/apis/inapppayments/docs/index.html). - -## Install - - $ npm install jwt-simple - -## Usage - - var jwt = require('jwt-simple'); - var payload = { foo: 'bar' }; - var secret = 'xxx'; - - // encode - var token = jwt.encode(payload, secret); - - // decode - var decoded = jwt.decode(token, secret); - console.log(decoded); //=> { foo: 'bar' } diff --git a/node_modules/jwt-simple/index.js b/node_modules/jwt-simple/index.js deleted file mode 100644 index 3ae0692..0000000 --- a/node_modules/jwt-simple/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lib/jwt'); diff --git a/node_modules/jwt-simple/lib/jwt.js b/node_modules/jwt-simple/lib/jwt.js deleted file mode 100644 index 7a3305d..0000000 --- a/node_modules/jwt-simple/lib/jwt.js +++ /dev/null @@ -1,141 +0,0 @@ -/* - * jwt-simple - * - * JSON Web Token encode and decode module for node.js - * - * Copyright(c) 2011 Kazuhito Hokamura - * MIT Licensed - */ - -/** - * module dependencies - */ -var crypto = require('crypto'); - - -/** - * support algorithm mapping - */ -var algorithmMap = { - HS256: 'sha256', - HS384: 'sha384', - HS512: 'sha512' -}; - - -/** - * expose object - */ -var jwt = module.exports; - - -/** - * version - */ -jwt.version = '0.1.0'; - -/** - * Decode jwt - * - * @param {Object} token - * @param {String} key - * @param {Boolean} noVerify - * @return {Object} payload - * @api public - */ -jwt.decode = function jwt_decode(token, key, noVerify) { - // check seguments - var segments = token.split('.'); - if (segments.length !== 3) { - throw new Error('Not enough or too many segments'); - } - - // All segment should be base64 - var headerSeg = segments[0]; - var payloadSeg = segments[1]; - var signatureSeg = segments[2]; - - // base64 decode and parse JSON - var header = JSON.parse(base64urlDecode(headerSeg)); - var payload = JSON.parse(base64urlDecode(payloadSeg)); - - if (!noVerify) { - var signingMethod = algorithmMap[header.alg]; - if (!signingMethod) { - throw new Error('Algorithm not supported'); - } - - // verify signature. `sign` will return base64 string. - var signingInput = [headerSeg, payloadSeg].join('.'); - if (signatureSeg !== sign(signingInput, key, signingMethod)) { - throw new Error('Signature verification failed'); - } - } - - return payload; -}; - - -/** - * Encode jwt - * - * @param {Object} payload - * @param {String} key - * @param {String} algorithm - * @return {String} token - * @api public - */ -jwt.encode = function jwt_encode(payload, key, algorithm) { - // Check key - if (!key) { - throw new Error('Require key'); - } - - // Check algorithm, default is HS256 - if (!algorithm) { - algorithm = 'HS256'; - } - - var signingMethod = algorithmMap[algorithm]; - if (!signingMethod) { - throw new Error('Algorithm not supported'); - } - - // header, typ is fixed value. - var header = { typ: 'JWT', alg: algorithm }; - - // create segments, all segment should be base64 string - var segments = []; - segments.push(base64urlEncode(JSON.stringify(header))); - segments.push(base64urlEncode(JSON.stringify(payload))); - segments.push(sign(segments.join('.'), key, signingMethod)); - - return segments.join('.'); -} - - -/** - * private util functions - */ - -function sign(input, key, method) { - var base64str = crypto.createHmac(method, key).update(input).digest('base64'); - return base64urlEscape(base64str); -} - -function base64urlDecode(str) { - return new Buffer(base64urlUnescape(str), 'base64').toString(); -} - -function base64urlUnescape(str) { - str += Array(5 - str.length % 4).join('='); - return str.replace(/\-/g, '+').replace(/_/g, '/'); -} - -function base64urlEncode(str) { - return base64urlEscape(new Buffer(str).toString('base64')); -} - -function base64urlEscape(str) { - return str.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); -} diff --git a/node_modules/jwt-simple/package.json b/node_modules/jwt-simple/package.json deleted file mode 100644 index cf143fe..0000000 --- a/node_modules/jwt-simple/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "jwt-simple", - "description": "JWT(JSON Web Token) encode and decode module", - "version": "0.1.0", - "author": { - "name": "Kazuhito Hokamura", - "email": "k.hokamura@gmail.com" - }, - "repository": { - "type": "git", - "url": "http://github.com/hokaccha/node-jwt-simple.git" - }, - "devDependencies": { - "mocha": "*", - "expect.js": "*" - }, - "scripts": { - "test": "./node_modules/.bin/mocha test/*.js" - }, - "engines": { - "node": ">= 0.4.0" - }, - "keywords": [ - "jwt", - "encode", - "decode" - ], - "main": "./index", - "readme": "# node-jwt-simple\n\n[JWT(JSON Web Token)](http://self-issued.info/docs/draft-jones-json-web-token.html) encode and decode module for node.js.\n\nJWT is used by [Google In-App Payments](http://code.google.com/intl/en/apis/inapppayments/docs/index.html).\n\n## Install\n\n $ npm install jwt-simple\n\n## Usage\n\n var jwt = require('jwt-simple');\n var payload = { foo: 'bar' };\n var secret = 'xxx';\n\n // encode\n var token = jwt.encode(payload, secret);\n\n // decode\n var decoded = jwt.decode(token, secret);\n console.log(decoded); //=> { foo: 'bar' }\n", - "_id": "jwt-simple@0.1.0", - "_from": "jwt-simple@0.1.0" -} diff --git a/node_modules/jwt-simple/test/basic.js b/node_modules/jwt-simple/test/basic.js deleted file mode 100644 index 9a434af..0000000 --- a/node_modules/jwt-simple/test/basic.js +++ /dev/null @@ -1,45 +0,0 @@ -var jwt = require('../index'); -var expect = require('expect.js'); - -describe('method and property', function() { - it('jwt has version property', function() { - expect(jwt.version).to.be.a('string'); - }); - - it('jwt has encode and decode method', function() { - expect(jwt.encode).to.be.a('function'); - expect(jwt.decode).to.be.a('function'); - }); -}); - -describe('encode and decode', function() { - it('encode token', function() { - var token = jwt.encode({ foo: 'bar' }, 'key'); - expect(token).to.be.a('string'); - expect(token.split('.')).to.have.length(3); - }); - - it('key is required', function() { - var fn = jwt.encode.bind(null, { foo: 'bar' }); - expect(fn).to.throwException(); - }); - - it('decode token', function() { - var obj = { foo: 'bar' }; - var key = 'key'; - var token = jwt.encode(obj, key); - var obj2 = jwt.decode(token, key); - expect(obj2).to.eql(obj); - expect(jwt.decode.bind(null, token, 'invalid_key')).to.throwException(); - }); - - it('decode no verify', function() { - var obj = { foo: 'bar' }; - var key = 'key'; - var token = jwt.encode(obj, key); - var fn1 = jwt.decode.bind(null, token, null); - var fn2 = jwt.decode.bind(null, token, null, true); - expect(fn1).to.throwException(); - expect(fn2()).to.eql(obj); - }); -}); diff --git a/node_modules/less-middleware/.npmignore b/node_modules/less-middleware/.npmignore deleted file mode 100644 index 2ccbe46..0000000 --- a/node_modules/less-middleware/.npmignore +++ /dev/null @@ -1 +0,0 @@ -/node_modules/ diff --git a/node_modules/less-middleware/lib/middleware.js b/node_modules/less-middleware/lib/middleware.js deleted file mode 100644 index 6928b7d..0000000 --- a/node_modules/less-middleware/lib/middleware.js +++ /dev/null @@ -1,268 +0,0 @@ -/*! - * Less - middleware (adapted from the stylus middleware) - * - * Original Copyright(c) 2010 LearnBoost - * MIT Licensed - */ - -var less = require('less'), - fs = require('fs'), - url = require('url'), - path = require('path'), - mkdirp = require('mkdirp'); - -// Import map -var imports = {}; - -/** - * Return Connect middleware with the given `options`. - * - * Options: - * - * `force` Always re-compile - * `once` Only re-compile the one time - * `debug` Output debugging information - * `src` Source directory used to find .less files - * `dest` Destination directory used to output .css files - * when undefined defaults to `src`. - * `prefix` Path which should be stripped from `pathname`. - * `compress` Whether the output .css files should be compressed - * `yuicompress` Same as `compress`, but uses YUI Compressor - * `optimization` The desired value of the less optimization option (0, 1, or 2. 0 is default) - * - * Examples: - * - * Pass the middleware to Connect, grabbing .less files from this directory - * and saving .css files to _./public_. Also supplying our custom `compile` function. - * - * Following that we have a `static` layer setup to serve the .css - * files generated by Less. - * - * var server = connect.createServer( - * less.middleware({ - * src: __dirname + '/public', - * compress: true - * }) - * , connect.static(__dirname + '/public') - * ); - * - * @param {Object} options - * @return {Function} - * @api public - */ -module.exports = less.middleware = function(options){ - var regex = { - handle: /\.css$/, - compress: /(\.|-)min\.css$/ - }; - - options = options || {}; - - // Accept src/dest dir - if ('string' === typeof options) { - options = { src: options }; - } - - // Only log if in debug mode - var log = function(key, val, type) { - if(options.debug) { - switch(type) { - case 'log': - case 'info': - case 'error': - case 'warn': - break; - default: - type = 'log'; - } - - console[type](' \033[90m%s :\033[0m \033[36m%s\033[0m', key, val); - } - }; - - var lessError = function(err) { - log("LESS " + err.type + ' error', err.message, 'error'); - log("LESS File", err.filename + ' ' + err.line + ':' + err.column, 'error'); - }; - - // Check imports for changes - var checkImports = function(path, next) { - var nodes = imports[path]; - - if (!nodes || !nodes.length) { - return next(); - } - - var pending = nodes.length; - var changed = []; - - nodes.forEach(function(imported){ - fs.stat(imported.path, function(err, stat) { - // error or newer mtime - if (err || !imported.mtime || stat.mtime > imported.mtime) { - changed.push(imported.path); - } - - --pending || next(changed); - }); - }); - } - - // Once option - options.once = options.once || false; - - // Compress option - options.compress = typeof options.compress === 'undefined' ? 'auto' : options.compress; - - // YUI Compress option - options.yuicompress = typeof options.yuicompress === 'undefined' ? false : options.yuicompress; - - // Optimization option - options.optimization = options.optimization || 0; - - // Source dir required - var src = options.src; - if (!src) { throw new Error('less.middleware() requires "src" directory'); } - - // Default dest dir to source - var dest = options.dest ? options.dest : src; - - // Default compile callback - options.render = options.render || function(str, lessPath, cssPath, callback) { - var parser = new less.Parser({ - paths: [path.dirname(lessPath)], - filename: lessPath, - optimization: options.optimization - }); - - parser.parse(str, function(err, tree) { - var css = tree.toCSS({ - compress: (options.compress == 'auto' ? regex.compress.test(cssPath) : options.compress), - yuicompress: options.yuicompress - }); - - // Store the less import paths - imports[lessPath] = tree.rules - .filter(function(rule) { - return rule.path; - }) - .map(function(rule) { - return { - mtime : Date.now(), - path : path.join(path.dirname(lessPath), rule.path) - }; - }); - - callback(err, css); - }); - }; - - // Middleware - return function(req, res, next) { - if ('GET' != req.method.toUpperCase() && 'HEAD' != req.method.toUpperCase()) { return next(); } - - var pathname = url.parse(req.url).pathname; - - // Only handle the matching files - if (regex.handle.test(pathname)) { - if (options.prefix && 0 === pathname.indexOf(options.prefix)) { - pathname = pathname.substring(options.prefix.length); - } - - var cssPath = path.join(dest, pathname); - var lessPath = path.join(src, ( - regex.compress.test(pathname) - ? pathname.replace(regex.compress, '.less') - : pathname.replace('.css', '.less' - ))); - - log('source', lessPath); - log('dest', cssPath); - - // Ignore ENOENT to fall through as 404 - var error = function(err) { - return next('ENOENT' == err.code ? null : err); - }; - - // Compile to cssPath - var compile = function() { - log('read', lessPath); - - fs.readFile(lessPath, 'utf8', function(err, str){ - if (err) { return error(err); } - - delete imports[lessPath]; - - try { - options.render(str, lessPath, cssPath, function(err, css){ - if (err) { - lessError(err); - - return next(err); - } - - log('render', lessPath); - - mkdirp(path.dirname(cssPath), 0777, function(err){ - if (err) return error(err); - - fs.writeFile(cssPath, css, 'utf8', next); - }); - }); - } catch (err) { - lessError(err); - - return next(err); - } - }); - }; - - // Force - if (options.force) { return compile(); } - - // Re-compile on server restart, disregarding - // mtimes since we need to map imports - if (!imports[lessPath]) { return compile(); } - - // Only check/recompile if it has not been done at before - if (options.once && imports[lessPath]) { return next(); } - - // Compare mtimes - fs.stat(lessPath, function(err, lessStats){ - if (err) { return error(err); } - - fs.stat(cssPath, function(err, cssStats){ - // CSS has not been compiled, compile it! - if (err) { - if ('ENOENT' == err.code) { - log('not found', cssPath); - - // No CSS file found in dest - return compile(); - } else { - return next(err); - } - } else if (lessStats.mtime > cssStats.mtime) { - // Source has changed, compile it - log('modified', cssPath); - - return compile(); - } else { - // Check if any of the less imports were changed - checkImports(lessPath, function(changed){ - if(typeof changed != "undefined" && changed.length) { - log('modified import', changed); - - return compile(); - } - - return next(); - }); - } - }); - }); - } else { - return next(); - } - }; -}; diff --git a/node_modules/less-middleware/node_modules/.bin/lessc b/node_modules/less-middleware/node_modules/.bin/lessc deleted file mode 120000 index 87a5294..0000000 --- a/node_modules/less-middleware/node_modules/.bin/lessc +++ /dev/null @@ -1 +0,0 @@ -../less/bin/lessc \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/.npmignore b/node_modules/less-middleware/node_modules/less/.npmignore deleted file mode 100644 index 4be6e16..0000000 --- a/node_modules/less-middleware/node_modules/less/.npmignore +++ /dev/null @@ -1 +0,0 @@ -dist/* \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/CHANGELOG.md b/node_modules/less-middleware/node_modules/less/CHANGELOG.md deleted file mode 100644 index d5cc908..0000000 --- a/node_modules/less-middleware/node_modules/less/CHANGELOG.md +++ /dev/null @@ -1,118 +0,0 @@ -# 1.3.3 - -2012-12-30 - - - Fix critical bug with mixin call if using multiple brackets - - when using the filter contrast function, the function is passed through if the first argument is not a color - -# 1.3.2 - -2012-12-28 - - - browser and server url re-writing is now aligned to not re-write (previous lessc behaviour) - - url-rewriting can be made to re-write to be relative to the entry file using the relative-urls option (less.relativeUrls option) - - rootpath option can be used to add a base path to every url - - Support mixin argument seperator of ';' so you can pass comma seperated values. e.g. `.mixin(23px, 12px;);` - - Fix lots of problems with named arguments in corner cases, not behaving as expected - - hsv, hsva, unit functions - - fixed lots more bad error messages - - fix `@import-once` to use the full path, not the relative one for determining if an import has been imported already - - support `:not(:nth-child(3))` - - mixin guards take units into account - - support unicode descriptors (`U+00A1-00A9`) - - support calling mixins with a stack when using `&` (broken in 1.3.1) - - support `@namespace` and namespace combinators - - when using % with colour functions, take into account a colour is out of 256 - - when doing maths with a % do not divide by 100 and keep the unit - - allow url to contain % (e.g. %20 for a space) - - if a mixin guard stops execution a default mixin is not required - - units are output in strings (use the unit function if you need to get the value without unit) - - do not infinite recurse when mixins call mixins of the same name - - fix issue on important on mixin calls - - fix issue with multiple comments being confused - - tolerate multiple semi-colons on rules - - ignore subsequant `@charset` - - syncImport option for node.js to read files syncronously - - write the output directory if it is missing - - change dependency on cssmin to ycssmin - - lessc can load files over http - - allow calling less.watch() in non dev mode - - don't cache in dev mode - - less files cope with query parameters better - - sass debug statements are now chrome compatible - - modifyVars function added to re-render with different root variables - -# 1.3.1 - -2012-10-18 - -- Support for comment and @media debugging statements -- bug fix for async access in chrome extensions -- new functions tint, shade, multiply, screen, overlay, hardlight, difference, exclusion, average, negation, softlight, red, green, blue, contrast -- allow escaped characters in attributes -- in selectors support @{a} directly, e.g. .a.@{a} { color: black; } -- add fraction parameter to round function -- much better support for & selector -- preserve order of link statements client side -- lessc has better help -- rhino version fixed -- fix bugs in clientside error handling -- support dpi, vmin, vm, dppx, dpcm units -- Fix ratios in media statements -- in mixin guards allow comparing colors and strings -- support for -*-keyframes (for -khtml but now supports any) -- in mix function, default weight to 50% -- support @import-once -- remove duplicate rules in output -- implement named parameters when calling mixins -- many numerous bug fixes - -# 1.3.0 - -2012-03-10 - -- @media bubbling -- Support arbitrary entities as selectors -- [Variadic argument support](https://gist.github.com/1933613) -- Behaviour of zero-arity mixins has [changed](https://gist.github.com/1933613) -- Allow `@import` directives in any selector -- Media-query features can now be a variable -- Automatic merging of media-query conditions -- Fix global variable leaks -- Fix error message on wrong-arity call -- Fix an `@arguments` behaviour bug -- Fix `::` selector output -- Fix a bug when using @media with mixins - - -# 1.2.1 - -2012-01-15 - -- Fix imports in browser -- Improve error reporting in browser -- Fix Runtime error reports from imported files -- Fix `File not found` import error reporting - - -# 1.2.0 - -2012-01-07 - -- Mixin guards -- New function `percentage` -- New `color` function to parse hex color strings -- New type-checking stylesheet functions -- Fix Rhino support -- Fix bug in string arguments to mixin call -- Fix error reporting when index is 0 -- Fix browser support in WebKit and IE -- Fix string interpolation bug when var is empty -- Support `!important` after mixin calls -- Support vanilla @keyframes directive -- Support variables in certain css selectors, like `nth-child` -- Support @media and @import features properly -- Improve @import support with media features -- Improve error reports from imported files -- Improve function call error reporting -- Improve error-reporting diff --git a/node_modules/less-middleware/node_modules/less/CONTRIBUTING.md b/node_modules/less-middleware/node_modules/less/CONTRIBUTING.md deleted file mode 100644 index 787fd6a..0000000 --- a/node_modules/less-middleware/node_modules/less/CONTRIBUTING.md +++ /dev/null @@ -1,50 +0,0 @@ -## Bug Reports - - - Please create a short test case - - Test with the latest version - - indicate how you use less - browser/lessc/external tool - -## Feature Requests - - - Please search feature requests to see if something similar exists already - - include a use-case - we do not add language features without a reason - - consider whether your language feature would be better as a function - -## Pull Requests - -Thankyou! Please take the time to read these guidelines - - - Consider adding a feature request first to see if people are pro or con - - do not change the dist/ folder - we do this when releasing - - tests - please add tests for your work. use `make test` to see if they pass - - spaces not tabs - - end lines in semi-colons - loosely aim towards jslint standards - -## Developing - -1. install cygwin - http://cygwin.com/install.html - - default options + - - Devel -> Make - -> Git -2. install node.js - http://nodejs.org/ -3. install phantomJS - http://phantomjs.org/download.html - - copy to a directory of your choice - - (windows) modify the path directory to include whereever you have copied it -4. clone the repository and download to local computer -5. run `npm install -g diff` to get diffs in your tests - -`lessc or node bin/lessc` - -to run the less compiler - -`make test` - -runs the node tests - -`make browser-test` - -runs the headless browser tests - -`make browser-test-server` - -sets up the server for the headless tests.. then go to http://localhost:8081/browser/test-runner-main.htm or one of the other test runner pages created in /test/browser/ diff --git a/node_modules/less-middleware/node_modules/less/LICENSE b/node_modules/less-middleware/node_modules/less/LICENSE deleted file mode 100644 index 40f3b78..0000000 --- a/node_modules/less-middleware/node_modules/less/LICENSE +++ /dev/null @@ -1,179 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -Copyright (c) 2009-2010 Alexis Sellier diff --git a/node_modules/less-middleware/node_modules/less/Makefile b/node_modules/less-middleware/node_modules/less/Makefile deleted file mode 100644 index 9ac013c..0000000 --- a/node_modules/less-middleware/node_modules/less/Makefile +++ /dev/null @@ -1,87 +0,0 @@ -# -# Run all tests -# -test: - node test/less-test.js - -# -# Run benchmark -# -benchmark: - node benchmark/less-benchmark.js - -# -# Build less.js -# -SRC = lib/less -HEADER = build/header.js -VERSION = `cat package.json | grep version \ - | grep -o '[0-9]\.[0-9]\.[0-9]\+'` -DIST = dist/less-${VERSION}.js -RHINO = dist/less-rhino-${VERSION}.js -DIST_MIN = dist/less-${VERSION}.min.js - -browser-prepare: DIST := test/browser/less.js - -less: - @@mkdir -p dist - @@touch ${DIST} - @@cat ${HEADER} | sed s/@VERSION/${VERSION}/ > ${DIST} - @@echo "(function (window, undefined) {" >> ${DIST} - @@cat build/require.js\ - build/ecma-5.js\ - ${SRC}/parser.js\ - ${SRC}/functions.js\ - ${SRC}/colors.js\ - ${SRC}/tree/*.js\ - ${SRC}/tree.js\ - ${SRC}/browser.js\ - build/amd.js >> ${DIST} - @@echo "})(window);" >> ${DIST} - @@echo ${DIST} built. - -browser-prepare: less - node test/browser-test-prepare.js - -browser-test: browser-prepare - phantomjs test/browser/phantom-runner.js - -browser-test-server: browser-prepare - phantomjs test/browser/phantom-runner.js --no-tests - -rhino: - @@mkdir -p dist - @@touch ${RHINO} - @@cat build/require-rhino.js\ - build/ecma-5.js\ - ${SRC}/parser.js\ - ${SRC}/functions.js\ - ${SRC}/colors.js\ - ${SRC}/tree/*.js\ - ${SRC}/tree.js\ - ${SRC}/rhino.js > ${RHINO} - @@echo ${RHINO} built. - -min: less - @@echo minifying... - @@uglifyjs ${DIST} > ${DIST_MIN} - @@echo ${DIST_MIN} built. - -server: less - cp dist/less-${VERSION}.js test/html/ - cd test/html && python -m SimpleHTTPServer - -clean: - git rm dist/* - -dist: clean min - git add dist/* - git commit -a -m "(dist) build ${VERSION}" - git archive master --prefix=less/ -o less-${VERSION}.tar.gz - npm publish less-${VERSION}.tar.gz - -stable: - npm tag less ${VERSION} stable - - -.PHONY: test benchmark diff --git a/node_modules/less-middleware/node_modules/less/README.md b/node_modules/less-middleware/node_modules/less/README.md deleted file mode 100644 index 726d691..0000000 --- a/node_modules/less-middleware/node_modules/less/README.md +++ /dev/null @@ -1,20 +0,0 @@ -less.js -======= - -The **dynamic** stylesheet language. - - - -about ------ - -This is the JavaScript, and now official, stable version of LESS. - -For more information, visit . - -license -------- - -See `LICENSE` file. - -> Copyright (c) 2009-2011 Alexis Sellier diff --git a/node_modules/less-middleware/node_modules/less/benchmark/benchmark.less b/node_modules/less-middleware/node_modules/less/benchmark/benchmark.less deleted file mode 100644 index bf7fef7..0000000 --- a/node_modules/less-middleware/node_modules/less/benchmark/benchmark.less +++ /dev/null @@ -1,3979 +0,0 @@ -@bg: #f01; -@white: #fff; -@grey: #eee; -@black: #000; -@blue: #000; -@accent_colour: #000; -@light_grey: #eee; -@dark_grey: #eee; -@yellow: #422; -@red: #ff0000; -@colour_positive: #ff0000; -@colour_negative: #ff0000; - -.box_shadow (...) { -} -.text_shadow (...) { -} -.border_radius (...) { -} -.border_radius_top_left (...) { -} -.border_radius_top_right (...) { -} -.border_radius_bottom_right (...) { -} -.border_radius_bottom_left (...) { -} -.border_radius_top (...) { -} -.border_radius_right (...) { -} -.border_radius_bottom (...) { -} -.border_radius_left (...) { -} -div.browse { - margin: 0 0 20px; - &.class { - padding: 0; - } - div.header { - padding: 10px 10px 9px; text-align: left; background: @bg url('/https/github.com/images/panel_header_bg.png') repeat-x top left; - border-bottom: 1px solid (@bg * 0.66 + @black * 0.33); line-height: 1; height: 18px; - .border_radius_top(3); color: @light_grey; - h3 { font-size: 16px; margin: 0; color: @white; .text_shadow(1, 1, 0, @bg * 0.66 + @black * 0.33); } - span.filter { - float: left; display: block; overflow: hidden; position: relative; z-index: 5; - a { - margin: 0 1px 0 0; display: block; float: left; padding: 0 8px; height: 18px; font-weight: bold; font-size: 10px; line-height: 18px; - text-transform: uppercase; background: url('/https/github.com/images/transparent_backgrounds/black_50.png'); color: @light_grey; text-decoration: none; position: relative; z-index: 3; - .active { - background: @white; color: @black; z-index: 4; - :hover { color: @black; } - } - :hover { color: @white; } - :first-child { .border_radius_left(2); } - :last-child { .border_radius_right(2); margin-right: 0; } - } - } - - span.filter.dropdown { - margin: 0; position: relative; overflow: visible; - a { - .border_radius(2); background: @white; color: @black; margin: 0; position: relative; padding-right: 25px; - img { float: left; margin: 4px 5px 0 0; } - b.arrow { - float: right; display: block; height: 0; width: 0; border: 5px solid transparent; border-top: 5px solid @black; border-bottom: none; - position: absolute; top: 6px; right: 10px; - } - :hover { - background: @accent_colour; color: @white; - b.arrow { border-top: 5px solid @white; } - } - } - ul { - position: absolute; top: 100%; left: 0; margin: 1px 0 0; padding: 0; background: @white; .border_radius(2); - .box_shadow(0, 1, 1, @black); - li { - list-style: none; display: block; padding: 0; margin: 0; - a { - display: block; height: 18px; line-height: 18px; color: @black; font-size: 10px; text-transform: uppercase; background: transparent; - border-bottom: 1px solid (@light_grey * 0.66 + @white * 0.33); float: none; margin: 0; .border_radius(0); white-space: nowrap; - :hover { background: url('/https/github.com/images/transparent_backgrounds/accent_colour_25.png'); color: @black; } - } - :last-child { - a { border: none; } - } - } - } - } - span.filter.dropdown.sort { float: left; margin: 0 0 0 10px; } - span.filter.dropdown.localisation { float: left; margin: 0 0 0 10px; } - a.more { - float: right; color: @white; .text_shadow(1, 1, 0, @bg * 0.66 + @black * 0.33); font-size: 14px; font-weight: bold; - position: relative; top: 2px; - :hover { text-decoration: none; } - } - } - > ul { - margin: 0; background: @white; padding: 10px 0 0 10px; .border_radius(3); position: relative; - li { - display: block; float: left; list-style: none; margin: 0 10px 10px 0; padding: 5px; position: relative; - background: @white; width: 130px; border: 1px solid (@light_grey * 0.33 + @white * 0.66); .border_radius(2); - a.remove { - position: absolute; height: 16px; width: 16px; padding: 3px; background: @accent_colour; - .border_radius(99); display: none; z-index: 3; top: -8px; right: -8px; - img { vertical-align: middle; } - } - div.thumbnail { - .border_radius_top(3); position: relative; z-index: 3; - .marker { - position: absolute; padding: 2px; .border_radius(2); z-index: 3; - background: url('/https/github.com/images/transparent_backgrounds/white_75.png'); height: 12px; width: 12px; - } - .marker.coupon { - height: auto; width: auto; top: 10px; right: -3px; padding: 0; background: transparent; overflow: hidden; position: absolute; - b { - display: block; height: 0; width: 0; float: left; border: 14px solid transparent; border-top: 14px solid @accent_colour; - border-bottom: none; border-right: none; float: left; - } - span { - color: @white; font-size: 10px; font-weight: bold; text-transform: uppercase; height: 14px; line-height: 14px; display: block; - padding: 0 4px 0 2px; background: @accent_colour; .text_shadow(1, 1, 0px, (@accent_colour * 0.75 + @black * 0.25)); margin: 0 0 0 14px; - } - } - .marker.video { - position: absolute; left: 50%; top: 50%; background: @white; width: 10px; height: 10px; - b { display: block; width: 0; height: 0; border: 5px solid transparent; border-left: 10px solid @black; border-right: none; } - } - .marker.endorsed_by_me { background: none; padding: 0; right: 0; bottom: -32px; .border_radius(2); background: @white; } - a.thumbnail { - display: block; overflow: hidden; position: relative; text-align: center; - img { position: relative; display: block; margin: auto; } - } - } - div.text { - margin: 3px 0 0; display: block; - a { text-decoration: none; } - a.title { - display: block; text-decoration: none; font-weight: bold; font-size: 12px; line-height: 16px; - white-space: nowrap; height: 16px; overflow: hidden; - :before { - display: block; height: 32px; width: 20px; content: " "; float: right; right: -15px; top: -8px; - background: @white; position: relative; z-index: 1; .box_shadow(-5, 0, 10, @white); - } - } - small { - font-size: 11px; line-height: 13px; color: @grey; display: block; height: 13px; overflow: hidden; white-space: nowrap; - a { font-weight: bold; } - :before { - display: block; height: 32px; width: 20px; content: " "; float: right; right: -15px; top: -8px; - background: @white; position: relative; z-index: 1; .box_shadow(-5, 0, 10, @white); - } - } - } - :hover { - background: @accent_colour; - a.remove { display: block; } - div.thumbnail { - a.marker.remove, a.marker.video { - b { display: inline-block; } - } - a.marker.video { .box_shadow(0, 0, 2, @black); } - } - div.text { - a { color: @white; } - a.title:before { background: @accent_colour; .box_shadow(-5, 0, 10, @accent_colour); } - small { - color: @white * 0.75 + @accent_colour * 0.25; - :before { background: @accent_colour; .box_shadow(-5, 0, 10, @accent_colour); } - } - } - div.footer a { color: @white; } - } - } - > li.ad div.thumbnail a.thumbnail { - width: 130px; height: 97px; - img { width: 100%; height: 100%; } - } - > li.brand div.thumbnail a.thumbnail { - width: 120px; height: 87px; padding: 5px; background: @white; .border_radius(2); - img { max-width: 120px; max-height: 87px; } - } - li.paginate { - margin-bottom: 0; - a { - display: block; position: relative; text-decoration: none; height: 131px; - div.arrow { - background: #81c153 url('/https/github.com/images/button_bg.png') repeat-x left top; border: 1px solid (@accent_colour * 0.75 + @black * 0.25); - height: 44px; .border_radius(99); width: 44px; margin: 0 auto; position: relative; top: 32px; - b { text-indent: -9000px; display: block; border: 10px solid transparent; width: 0; height: 0; position: relative; top: 12px; } - } - div.label { - position: absolute; bottom: 5px; left: 0; right: 0; line-height: 13px; - color: @accent_colour * 0.85 + @black * 0.15; text-decoration: none; - font-weight: bold; font-size: 12px; text-align: center; - } - :hover { - div.arrow { background: #abd56e url('/https/github.com/images/button_bg.png') repeat-x left -44px; } - } - } - :hover { background: transparent; } - } - li.paginate.previous a div b { border-right: 15px solid @white; border-left: none; left: 12px; } - li.paginate.next a div b { border-left: 15px solid @white; border-right: none; left: 16px; } - } - > div.footer { - padding: 9px 10px 10px; background: @light_grey * 0.75 + @white * 0.25; overflow: hidden; - border-top: 1px solid @light_grey; .border_radius_bottom(3); - div.info { - float: left; color: @grey; - strong { color: @black; font-weight: normal; } - } - div.pagination { - float: right; - > * { - display: inline-block; line-height: 1; padding: 0 6px; line-height: 18px; height: 18px; background: @white; - .border_radius(3); text-decoration: none; font-weight: bold; - font-size: 10px; text-transform: uppercase; - } - a { color: @grey; } - a:hover { color: @black; } - span.disabled { color: @light_grey; } - span.current { color: @white; background: @bg; border: none; } - span.current:hover { color: @white; } - } - } -} -div.browse.with_categories { margin: 0 0 0 160px; } -div.browse.with_options > ul { .border_radius_top(0); } -div.browse.with_footer > ul { .border_radius_bottom(0); } -/* Browse List */ -div.browse.list { -> ul { - margin: 0; min-height: 320px; - padding: 10px 0 0 10px; overflow: hidden; - > li { - display: block; list-style: none; margin: 0 10px 10px 0; padding: 5px; - .border_radius(3); position: relative; line-height: normal; - .marker { - position: absolute; padding: 2px; .border_radius(2); - background: url('/https/github.com/images/transparent_backgrounds/white_75.png'); - img { height: 12px; width: 12px; } - } - img.marker { height: 12px; width: 12px; } - span.marker.new { - color: black; left: -5px; top: -5px; background: none; background-color: @white * 0.1 + @yellow * 0.6 + @red * 0.3; line-height: 1; padding: 2px 5px; - font-weight: bold; - } - a.marker.media_type { - display: inline-block; text-decoration: none; top: 39px; left: 8px; - font-size: 10px; - b { font-weight: normal; margin: 0 0 0 2px; line-height: 1; display: none; } - img { vertical-align: middle; } - } - a.thumbnail { - float: left; - width: 68px; display: block; overflow: hidden; - border: 1px solid @light_grey; - :hover { border-color: @accent_colour; } - } - span.title_brand { - display: block; margin: 0 0 2px 75px; - a { margin: 0; display: inline; } - a.brand_name { font-weight: normal; font-size: 12px; } - } - a.ad_title { - font-weight: bold; font-size: 14px; margin: 0 0 0 75px; display: block; - } - a.brand_name { - font-weight: bold; font-size: 14px; margin: 0 0 0 75px; display: block; - } - small { - display: block; color: @grey; margin: 0 0 0 75px; font-size: 12px; - } - small.brand_name { display: inline; margin: 0; } - ul.chart { - margin: 0 0 0 80px; - height: 39px; - } - ul.networks { - margin: 3px 0 0 75px; padding: 0; overflow: hidden; - li { display: block; float: left; margin: 0 5px 0 0; line-height: 1; } - } - div.points { - display: none; - font-size: 12px; text-align: right; - label { color: @grey; } - } - a.remove { bottom: -3px; right: -3px; } - } - li.ad { - a.thumbnail { height: 51px; } - span.title_brand { - small.brand_name { - display: block; - } - } - } - li.brand { - a.thumbnail { height: 68px; } - } - } -} -div.browse.list.with_options ul { .border_radius_top(0); } -div.browse.list.with_footer ul { .border_radius_bottom(0); } -div.browse.list.cols_2 { - > ul { - > li { - width: 285px; float: left; - :hover { - background: @white; - } - } - } -} -div.browse.ads.list { - > ul { - > li { - height: 53px; - a.thumbnail { - height: 51px; - } - } - } -} -div.browse.brands.list { - > ul { - > li { - height: 68px; - a.thumbnail { - height: 66px; - } - } - } -} - -/* Categories List */ -#categories { - margin: 40px 0 0; width: 160px; float: left; position: relative; z-index: 1; - ul { - margin: 0; padding: 10px 0 0; - li { - list-style: none; margin: 0; padding: 0; font-size: 14px; - a { color: @grey; display: block; padding: 5px 10px 5px 15px; text-decoration: none; .border_radius_left(3); } - a:hover { color: @black; background: @light_grey * 0.15 + @white * 0.85; } - } - .all a { font-weight: bold; } - .current a { - background: @white; color: @black; border: 1px solid (@light_grey * 0.25 + @white * 0.75); border-right: none; border-left: 5px solid @bg; - padding-left: 10px; - } - } -} - -/* Ads > Show */ -#ad { - div.header { - overflow: hidden; - h3 { font-size: 16px; margin: 0 0 3px; } - small { - a.category { font-weight: bold; color: @accent_colour; } - span.networks img { position: relative; top: 3px; } - } - span.brand { - float: right; color: @white; - a.brand_name { font-weight: bold; color: @accent_colour; } - } - } - div.content { - padding: 0; position: relative; - a.toggle_size { - display: block; .border_radius(3); background-color: @black; padding: 0 5px 0 26px; - background-position: 5px center; background-repeat: no-repeat; text-decoration: none; margin: 5px 5px 0 0; - position: absolute; top: 0; right: 0; line-height: 25px; z-index: 45; - } - img.creative { margin: 0 auto; max-width: 540px; display: block; } - object { position: relative; z-index: 44; } - object.video { line-height: 0; font-size: 0; } - object embed { position: relative; z-index: 45; line-height: 0; font-size: 0; } - } - div.content.not_video { - padding: 40px; text-align: center; - * { margin-left: auto; margin-right: auto; } - object.flash { margin-bottom: 0; } - } - div.footer { - padding: 0; - div.vote_views { - padding: 5px 10px; overflow: hidden; - div.share { float: right; margin: 2px 0 0 0; } - #login_register_msg, #encourage_vote_msg { line-height: 22px; font-weight: bold; color: @black; } - } - } -} -#sidebar { - #meta { - table { - margin: 0; - tr:last-child td { padding-bottom: 0; } - td { - padding: 0 0 5px; - ul.networks { - margin: 0; padding: 0; - li { - list-style: none; display: inline; - } - li { - } - } - } - td.label { color: @grey; white-space: nowrap; width: 1%; text-align: right; padding-right: 5px; } - } - } -} - -/* Voting */ -div.voted { - font-size: 12px; line-height: 22px; color: @black; display: inline-block; font-weight: bold; - img { float: left; margin-right: 5px; padding: 3px; .border_radius(3); } -} -#voted_up { - img { background: @colour_positive * 0.66 + @bg * 0.15; } -} -#voted_down { - img { background: @colour_negative * 0.66 + @bg * 0.15; } -} -#encourage_comment { - display: inline-block; line-height: 22px; font-weight: bold; -} -#vote { - overflow: hidden; font-size: 12px; line-height: 22px; color: @black; float: left; - a { - color: @white; font-weight: bold; overflow: hidden; display: block; - width: 16px; text-decoration: none; text-align: center; font-size: 10px; padding: 3px; text-transform: uppercase; - } - a.up { - float: left; background: @colour_positive * 0.66 + @bg * 0.15; .border_radius_left(3); - :hover { background: @colour_positive * 0.85 + @bg * 0.15; } - } - a.down { - float: left; background: @colour_negative * 0.66 + @bg * 0.15; .border_radius_right(3); - margin: 0 5px 0 1px; - :hover { background: @colour_negative * 0.85 + @bg * 0.15; } - } -} -#vote.disabled { - a.up { - background: (@colour_positive * 0.66 + @bg * 0.15) * 0.15 + @grey * 0.85; - :hover { background: (@colour_positive * 0.85 + @bg * 0.15) * 0.25 + @grey * 0.75; } - } - a.down { - background: (@colour_negative * 0.66 + @bg * 0.15) * 0.15 + @grey * 0.85; - :hover { background: (@colour_negative * 0.85 + @bg * 0.15) * 0.25 + @grey * 0.75; } - } -} - -/* Panels */ -div.panel { - margin: 0 0 20px; position: relative; .box_shadow(0, 0, 3, @light_grey * 0.66 + @white * 0.33); .border_radius(3); - > div.header { - background: @bg url('/https/github.com/images/panel_header_bg.png') repeat-x top left; border-bottom: 1px solid (@bg * 0.66 + @black * 0.33); - padding: 5px 10px 4px; .border_radius_top(3); min-height: 18px; - h2 { font-size: 16px; margin: 0; color: @white; .text_shadow(1, 1, 0, @bg * 0.66 + @black * 0.33); } - h3 { color: @white; font-size: 14px; margin: 0; line-height: 18px; .text_shadow(1, 1, 0, @bg * 0.66 + @black * 0.33); } - small { display: block; font-size: 12px; color: @light_grey * 0.25 + @white * 0.75; } - span.filter { - float: left; display: block; overflow: hidden; position: relative; z-index: 5; - a { - margin: 0 1px 0 0; display: block; float: left; padding: 0 8px; height: 18px; font-weight: bold; font-size: 10px; line-height: 18px; - text-transform: uppercase; background: url('/https/github.com/images/transparent_backgrounds/black_50.png'); color: @light_grey; text-decoration: none; position: relative; z-index: 3; - } - a:first-child { .border_radius_left(2); } - a:last-child { .border_radius_right(2); margin-right: 0; } - a.active { background: @white; color: @black; z-index: 4; } - a:hover { color: @white; } - a.active:hover { color: @black; } - } - - span.filter.dropdown { - margin: 0; position: relative; overflow: visible; - a { - .border_radius(2); background: @white; color: @black; margin: 0; position: relative; padding-right: 25px; - img { float: left; margin: 4px 5px 0 0; } - b.arrow { - float: right; display: block; height: 0; width: 0; border: 5px solid transparent; border-top: 5px solid @black; border-bottom: none; - position: absolute; top: 6px; right: 10px; - } - :hover { - background: @accent_colour; color: @white; - b.arrow { border-top: 5px solid @white; } - } - } - - ul { - position: absolute; top: 100%; left: 0; margin: 1px 0 0; padding: 0; background: @white; .border_radius(2); - .box_shadow(0, 1, 1, @black); - li { - list-style: none; display: block; padding: 0; margin: 0; - a { - display: block; height: 18px; line-height: 18px; color: @black; font-size: 10px; text-transform: uppercase; background: transparent; - border-bottom: 1px solid (@light_grey * 0.66 + @white * 0.33); float: none; margin: 0; .border_radius(0); white-space: nowrap; - :hover { background: url('/https/github.com/images/transparent_backgrounds/accent_colour_25.png'); color: @black; } - } - } - li:last-child { - a { border: none; } - } - } - } - span.filter.dropdown.sort { float: left; margin: 0 0 0 10px; } - span.filter.dropdown.localisation { float: left; margin: 0 0 0 10px; } - - a.more { - float: right; color: @white; .text_shadow(1, 1, 0, @bg * 0.66 + @black * 0.33); font-size: 14px; font-weight: bold; - position: relative; top: 2px; - :hover { text-decoration: none; } - } - } - > div.content { - background: @white; padding: 10px; - .no_padding { padding: 0; } - } - > div.footer { - background: @light_grey * 0.33 + @white * 0.66; border-top: 1px solid (@light_grey * 0.5 + @white * 0.5); - padding: 4px 10px 5px; .border_radius_bottom(3); - } -} -div.panel.no_footer div.content { .border_radius_bottom(3); } -div.panel.no_header div.content { .border_radius_top(3); } -div.panel.collapsable { - div.header { - cursor: pointer; - b.toggle { float: right; border: 5px solid transparent; border-bottom: 5px solid @white; border-top: none; display: block; width: 0; height: 0; margin: 6px 0 0 0; } - } - div.header:hover { - background-color: @bg * 0.75 + @white * 0.25; - } -} -div.panel.collapsed { - div.header { - border-bottom: none; .border_radius(3); - b.toggle { border-bottom: none; border-top: 5px solid @white; } - } - div.blank { border-bottom: none; .border_radius_bottom(3); } - div.content, div.footer { display: none; } -} - - -/* Sidebar Actions */ -#sidebar { - #actions { - .box_shadow(0, 0, 0, transparent); - div.content { - background: url('/https/github.com/images/transparent_backgrounds/accent_colour_10.png'); text-align: center; - p.endorsement { - margin: 0 0 10px; font-size: 14px; font-weight: bold; - small { font-weight: normal; line-height: inherit; margin: 10px 0 0; } - :last-child { margin: 0; } - } - div.share { margin: 5px 0 0; } - a.button { - font-size: 16px; line-height: normal; height: auto; padding: 5px 10px 5px 35px; font-weight: bold; margin: 0; position: relative; - img { position: absolute; top: 3px; left: 6px; } - } - div.flash.notice { - margin: 10px 0 0; font-size: 22px; - small { font-weight: normal; margin: 0 0 10px; } - } - div.flash.notice.done { margin: 0; } - small { - display: block; margin: 10px 0 0; font-size: 11px; color: #808080; line-height: 12px; - img.favicon { vertical-align: middle; } - } - div.blank { - border: none; background: none; padding: 10px 0 0; border-top: 1px solid (@accent_colour * 0.5 + @white * 0.5); - margin: 10px 0 0; - } - } - } -} - -/* People Lists */ -ul.people { - margin: 0; padding: 10px 0 0 10px; background: @white; - > li { - display: block; margin: 0 10px 10px 0; float: left; padding: 2px; width: 57px; position: relative; - .border_radius(2); background: @white; list-style: none; border: 1px solid (@light_grey * 0.33 + @white * 0.66); - a.avatar { - display: block; width: 59px; height: 59px; overflow: hidden; - img { width: 100%; height: 100%; } - } - a.name { display: block; font-size: 10px; text-align: center; } - :hover { - background: @accent_colour; - a.name { color: @white; } - } - } -} -ul.people.list { - padding: 0; - > li { - margin: 0 0 10px; padding: 0 0 10px; overflow: hidden; float: none; width: auto; .border_radius(0); - border: none; border-bottom: 1px solid (@light_grey * 0.33 + @white * 0.66); - span.points { - float: right; display: block; padding: 5px; background: @light_grey * 0.15 + @white * 0.85; line-height: 1; - text-align: center; width: 50px; height: 30px; .border_radius(3); margin: 0 0 0 10px; - strong { display: block; color: @black; font-size: 16px; margin: 2px 0 0; } - label { color: @grey; text-transform: uppercase; font-size: 10px; } - label.long { display: block; } - label.short { display: none; } - } - a.avatar { float: left; width: 40px; height: 40px; } - a.name { font-size: 14px; font-weight: bold; margin: 0 0 0 50px; text-align: left; } - a.name.long { display: inline; } - a.name.short { display: none; } - span.networks { - display: block; margin: 0 0 0 50px; - img.favicon { vertical-align: middle; } - } - :hover { - background: transparent; - a.name { color: @accent_colour * 0.85 + @black * 0.15; } - } - :last-child { padding-bottom: 0; border-bottom: none; margin-bottom: 0; } - } -} -ul.people.list.small { - > li { - span.points { - padding: 3px 6px; height: 18px; font-size: 9px; line-height: 17px; width: 60px; - strong { font-size: 12px; margin: 0; display: inline; } - label { font-size: 9px; } - label.long { display: none; } - label.short { display: inline; } - } - a.avatar { width: 24px; height: 24px; } - a.name { display: inline; line-height: 24px; margin: 0 0 0 5px; font-size: 12px; height: 24px; } - a.name.long { display: none; } - a.name.short { display: inline; } - span.networks { display: inline; margin: 0; } - :last-child { padding-bottom: 0; border-bottom: none; margin-bottom: 0; } - } -} -ul.people.tiled { - > li { - width: 28px; padding: 2px; - a.avatar { width: 24px; height: 24px; background: @white; padding: 2px; } - a.name, small, span.networks, span.points { display: none; } - } -} - -/* Comments */ -#comments { - ul { - margin: 0 0 20px; padding: 0; - li { - display: block; list-style: none; padding: 0; margin: 0 0 10px; - span.meta { - margin: 0; overflow: hidden; display: block; - small { font-size: 12px; color: @light_grey; float: right; line-height: 16px; display: inline-block; } - a.avatar { - display: inline-block; height: 16px; width: 16px; position: relative; top: 3px; - img { height: 100%; width: 100%; } - } - a.name { font-weight: bold; line-height: 16px; display: inline-block; } - span.inactive { color: @grey; font-weight: bold; line-height: 16px; display: inline-block; } - } - b.tail { - display: block; width: 0; height: 0; margin: 3px 0 0 10px; border: 5px solid transparent; border-top: none; - border-bottom: 5px solid @white; position: relative; z-index: 2; - } - blockquote { - margin: 0; padding: 10px; .border_radius(3); font-style: normal; background: @white; - color: @dark_grey; .box_shadow(0, 0, 3, @light_grey * 0.66 + @white * 0.33); - } - } - } - form { - margin: 0; - textarea { width: 500px; } - } -} - -/* Sidebar Categories */ -#sidebar { - #categories { - margin: 0 0 20px; - width: auto; - p { margin: 0; } - } -} - -#sidebar { - #ads > ul li, #recommendations > ul li { - width: 81px; - div.thumbnail { - a.thumbnail { height: 60px; width: 81px; } - } - div.text { - a.title { font-size: 11px; height: 14px; line-height: 14px; } - small { display: none; } - } - } - #brands > ul li { - width: 55px; - div.thumbnail { - a.thumbnail { - height: 45px; width: 45px; - img { max-height: 45px; max-width: 45px; } - } - } - div.text { display: none; } - } -} - -/* My Account */ -#accounts_controller { - #top { - #page_title { - #page_options { - a.button.public_profile { - float: right; font-size: 16px; line-height: 1; height: auto; padding: 8px 35px 8px 15px; position: relative; - b.arrow { display: block; height: 0; width: 0; position: absolute; top: 10px; right: 15px; border: 6px solid transparent; border-right: none; border-left: 6px solid @white; margin: 0; } - } - a.button.goto_dashboard { - float: right; font-size: 16px; line-height: 1; height: auto; padding: 8px 15px 8px 35px; margin-right: 5px; position: relative; - b.arrow { display: block; height: 0; width: 0; position: absolute; top: 10px; left: 15px; border: 6px solid transparent; border-left: none; border-right: 6px solid @white; margin: 0; } - } - } - } - } - #account_nav { - float: left; width: 200px; margin: 0 20px 0 0; - ul.nav { - margin: 0; padding: 0; - li { - margin: 0 0 5px; display: block; list-style: none; padding: 0; - a { - display: block; height: 30px; text-decoration: none; color: @white; - b { - border: 15px solid transparent; border-right: none; border-left: 10px solid transparent; width: 0; - height: 0; float: right; display: none; - } - span { - .border_radius(3); background: @bg; display: block; - line-height: 30px; padding: 0 10px; font-size: 14px; font-weight: bold; margin: 0 10px 0 0; - } - } - :hover { - a { - color: @white; - b { border-left-color: @bg; display: block; } - span { background: @bg; .border_radius_right(0); } - } - } - } - li.current a { - b { border-left-color: @accent_colour; display: block; } - span { background: @accent_colour; color: @white; .border_radius_right(0); } - } - } - } - #main { - > div { - margin: 0 0 20px; - form { margin: 0; } - } - #profile { - a.avatar { - float: left; display: block; - width: 70px; overflow: hidden; position: relative; text-decoration: none; - img { width: 100%; } - span { - display: block; line-height: 1; padding: 3px; margin: 5px 0 0; color: @white; background: @accent_colour; - .border_radius(3); .text_shadow(1, 1, 0, @grey); - text-align: center; font-size: 10px; font-weight: bold; text-transform: uppercase; - } - } - form { - margin: 0 0 0 90px; - h4 { margin: 10px 0 20px; border-bottom: 1px solid (@light_grey * 0.5 + @white * 0.5); padding: 0; color: @bg; font-size: 16px; } - ul.choices { - li { width: 30%; } - } - div.extra { margin-top: 20px; } - } - } - - #networks { - ul { margin: 0 -10px -10px 0; padding: 0; overflow: hidden; - li:hover - { - background: @light_grey; display: block; float: left; width: 180px; - padding: 10px; margin: 0 10px 10px 0; list-style: none; .border_radius(3); - position: relative; - * { line-height: normal; } - img { vertical-align: middle; float: left; } - .name { font-weight: bold; font-size: 14px; display: block; margin: -2px 0 0 42px; } - small { - font-size: 12px; color: @grey; display: block; margin-left: 42px; - strong { color: @black; font-weight: normal; } - } - :hover { - } - } - li.installed { - background: @white; - border: 2px solid @accent_colour; padding: 8px; - } - li.unavailable { - .name { color: @black; } - :hover { - background: @light_grey; - } - } - li:hover { - background: @light_grey * 0.5 + @white * 0.5; - } - } - } - } -} - -/* Shopping Style Panel */ -#shopping_style { - div.header a.button.small { float: right; } - div.content { - p { - margin: 0 0 10px; - label { text-transform: uppercase; font-size: 11px; display: block; color: @bg; font-weight: bold; } - span { color: @black; } - span.toggle { white-space: nowrap; color: @grey; } - :last-child { margin: 0; } - } - p.more { text-align: left; font-weight: normal; } - p.less { display: none; margin: 0; } - } -} - -/* People Controller */ -#people_controller.index { - #main { - div.panel { - float: left; width: 300px; margin: 0 20px 0 0; - :last-child { margin-right: 0; } - } - } -} -#people_controller.show { - #person_overview, #shopping_style { - a.button.small { - } - } - #content { - #shopping_style { - float: left; width: 240px; margin: 0 20px 0 0; - } - #main { width: 360px; } - } -} - -/* Search Results */ -#search_results { - margin: 0 0 20px; - li { - :hover { - small { color: @white * 0.75 + @accent_colour * 0.25; } - } - } -} -#search { - div.content { - padding: 20px; - form { - margin: 0; float: none; - span.submit_and_options { - display: block; - } - } - p { margin: 0 0 15px; } - h4 { font-weight: normal; margin: 0 0 5px; } - } -} - -/* Recommendations */ -#recommendations { - div.browse { - margin: 0; padding: 0; background: none; - ul { min-height: 0; .border_radius(0); } - } -} - -/* Blank States */ -div.blank { - padding: 20px; background: @bg * 0.05 + @blue * 0.05 + @white * 0.9; position: relative; - border: 1px solid (@bg * 0.1 + @blue * 0.1 + @white * 0.8); z-index: 1; - h4 { font-size: 18px; margin: 0 0 10px; } - h4:last-child { margin: 0; } - p { font-size: 16px; margin: 0 0 10px; } - p:last-child { margin: 0; } - p.with_list_number.large { - span { margin-left: 48px; display: block; color: @white; } - } - p.earn span { font-size: 22px; color: @white; line-height: 48px; font-weight: bold; } - a { white-space: nowrap; } - a.hide { - position: absolute; top: -5px; right: -5px; display: block; height: 16px; width: 16px; padding: 3px; background: #E7E9F6; .border_radius(99); - } -} - -div.blank.small { - padding: 10px 20px; - h4 { font-weight: normal; font-size: 16px; } - p { margin: 0; } -} -div.blank.tiny { - padding: 10px 20px; - h4 { font-weight: normal; font-size: 14px; } - p { margin: 0; font-size: 12px; } -} -div.blank.rounded { - .border_radius(3); margin: 0 0 20px; -} -div.blank.rounded.bottom { .border_radius_top(0); } -div.blank.with_border_bottom { border-bottom: 1px solid (@bg * 0.1 + @blue * 0.1 + @white * 0.8); } -div.blank.no_border_top { border-top: none; } -div.blank.no_border_bottom { border-bottom: none; } -div.blank.no_side_borders { border-right: none; border-left: none; } -div.panel { - div.blank { - padding: 10px 20px; overflow: hidden; margin: 0; - h4 { font-weight: normal; font-size: 14px; } - p, ul { margin: 0 0 10px; font-size: 12px; } - p:last-child, ul:last-child { margin: 0; } - } -} - -/* Sidebar Browse */ -#sidebar { - div.panel { - div.content.browse { - padding: 0; margin: 0; - > ul { - min-height: 0; .border_radius(0); - > li { - div.thumbnail { - a.thumbnail { padding: 5px; } - img.marker.media_type { top: 48px; left: 8px; } - } - div.footer { - a.title, a.name { font-size: 11px; font-weight: normal; } - } - } - } - } - - div.content.browse.ads > ul > li { - width: 93px; - > div.thumbnail a.thumbnail { width: 83px; height: 62px; } - } - div.content.browse.brands { - .border_radius(3); - > ul { - background: none; - > li { - width: 52px; - > div.thumbnail { - padding: 3px; - a.thumbnail { width: 42px; height: 42px; padding: 2px; } - } - li.active { background: @accent_colour; } - } - } - } - div.footer { - div.info { float: none; } - div.pagination { float: none; margin: 3px 0 0; } - } - } -} - -/* List Numbers */ -label.list_number { - float: left; background: url('/https/github.com/images/transparent_backgrounds/black_15.png'); padding: 2px; width: 24px; height: 24px; display: block; - .border_radius(99); - b { - display: block; font-weight: bold; font-size: 14px; color: @white; background: @accent_colour; height: 20px; width: 20px; line-height: 20px; - text-align: center; .border_radius(99); .text_shadow(1, 1, 0px, (@accent_colour * 0.75 + @black * 0.25)); - border: 2px solid @white; - } -} -label.list_number.large { - padding: 4px; width: 48px; height: 48px; .border_radius(99); position: relative; left: -10px; - b { - font-size: 28px; height: 40px; width: 40px; .border_radius(99); line-height: 40px; - .text_shadow(2, 2, 0px, (@accent_colour * 0.75 + @black * 0.25)); border-width: 4px; - } -} - -/* Dashboard */ -#dashboard_controller { - #ads { - span.filter.state { float: right; } - } - #sidebar { - #shopping_style div.content { - p.less { display: block; } - p.more { display: none; } - } - #influences { - div.header { - padding-bottom: 0; - ul.tabs { - position: relative; top: 1px; z-index: 3; - li { - margin: 0 5px 0 0; - a { - border: none; background: url('/https/github.com/images/transparent_backgrounds/white_75.png'); - :hover { color: @black; } - } - } - li.active { - a { - background: @white; border: none; - :hover { color: @black; } - } - } - } - } - - div.tab_content { - overflow: hidden; padding: 0; - > ul { - padding: 10px 10px 0; max-height: 280px; min-height: 120px; overflow-y: scroll; .border_radius_bottom(3px); - } - } - div.footer { - form { - p { - margin: 0 0 5px; - img.marker { float: right; margin: 5px 0 0 0; } - span.invitee { - line-height: 26px; padding: 3px 3px 0; font-size: 14px; - small { color: @grey; font-size: 12px; } - } - } - p.indent { margin-left: 36px; } - p.submit { margin-top: 10px; } - } - } - } - } - - div.panel.full { - > div.content { - margin: 0; padding: 0; background: none; - ul { - li { - width: 148px; - div.thumbnail { - img.marker.media_type { top: 90px; } - a.thumbnail { width: 138px; height: 104px; } - } - } - } - } - } - #people { - form { - padding: 0 0 5px; - input { width: 225px; float: left; margin: 0 5px 0 0; } - a.button { height: 23px; line-height: 23px; width: 60px; padding: 0; text-align: center; } - } - } -} - -/* Remove Pages Titles when Browsing */ -#ads_controller, #brands_controller { - #page_title { display: none; } -} - -/* Brands > Show */ -#brands_controller.show { - #ads { - div.filters { - h3 { font-size: 16px; margin: 0; } - span.show { float: right; } - span.filter.dropdown.localisation { float: right; margin: 0 0 0 10px; } - span.filter.state { float: right; margin: 0 0 0 10px; } - } - } -} - -/* FAQ */ -#pages_controller.faq { - #answers { - h3 { margin-top: 20px; padding-top: 20px; border-top: 1px solid (@light_grey * 0.75 + @white * 0.25); } - h3.first { margin-top: 0; padding-top: 0; border: none; } - } - #questions { - div.content { - padding: 20px; - ul { - margin: 0; padding: 0; - li { - margin: 0 0 10px; list-style: none; display: block; padding: 0; - a { font-size: 14px; } - } - li:last-child { - margin: 0; - } - } - } - } -} - -/* Person Overview */ -#person_overview { - padding: 20px 10px; position: relative; z-index: 25; - #person { - float: left; width: 620px; - a.avatar { - display: block; float: left; width: 60px; height: 60px; - img { height: 100%; width: 100%; } - } - > div { - margin: 0 0 0 75px; color: @white; font-size: 14px; .text_shadow(1, 1, 0, @bg * 0.66 + @black * 0.33); - } - div.name { - h2 { - margin: 0 0 5px; display: inline; - a { - font-size: 20px; font-weight: bold; .text_shadow(1, 1, 0, @bg * 0.66 + @black * 0.33); - line-height: 1; color: @white; text-decoration: none; - :hover { text-decoration: underline; } - } - a.button.small { - font-size: 10px; - :hover { text-decoration: none; } - } - } - - span.points { - float: right; display: block; padding: 5px 10px; .border_radius(2); text-align: center; background: @white; position: relative; - min-width: 45px; - strong { color: @black; font-weight: bold; font-size: 24px; line-height: 1; display: block; .text_shadow(0, 0, 0, transparent); } - label { font-size: 9px; text-transform: uppercase; color: @grey; display: block; .text_shadow(0, 0, 0, transparent); font-weight: bold; } - } - span.points.with_redeem { - .border_radius_bottom(0); - a.button { - display: block; text-align: center; .border_radius_top(0); font-size: 10px; font-weight: bold; padding: 0; - position: absolute; height: 18px; left: 0; right: 0; bottom: -19px; line-height: 18px; text-transform: uppercase; border: none; - } - } - div.options { margin: 0; } - } - div.meta { - color: @white * 0.66 + @bg * 0.33; - span { color: @white; } - label { color: @white * 0.66 + @bg * 0.33; } - ul.networks { - display: inline; margin: 0; padding: 0; - li { - display: inline; line-height: 1; - img { position: relative; vertical-align: middle; top: -1px; } - } - } - } - - div.extra { - font-size: 12px; margin-top: 20px; margin-bottom: 20px; - span.toggle { - .text_shadow(1, 1, 0, @bg * 0.66 + @black * 0.33); - a { font-size: 10px; font-weight: bold; text-transform: uppercase; text-decoration: none; color: @accent_colour; } - b.arrow { display: inline-block; width: 0; height: 0; border: 5px solid transparent; position: relative; top: -2px; } - } - #less_info { - span.toggle { - b.arrow { border-top: 5px solid @accent_colour; border-bottom: 0; } - } - } - #more_info { - span.toggle { - float: right; - b.arrow { border-bottom: 5px solid @accent_colour; border-top: 0; } - } - h4 { - color: @white; margin: 0 0 10px 0; border-bottom: 1px solid (@white * 0.25 + @bg * 0.75); .text_shadow(1, 1, 0, @bg * 0.66 + @black * 0.33); - span { font-size: 12px; } - } - p { - margin: 0 0 5px; - label { display: block; float: left; width: 120px; color: @white * 0.66 + @bg * 0.33; } - span { display: block; margin: 0 0 0 130px; } - } - p:last-child { margin: 0; } - - } - } - div.login { - margin: 0 0 0 75px; - a.button { font-weight: bold; } - } - } -} - -/* Dashboard Nav */ -#dashboard_nav { - position: absolute; bottom: 0; left: 10px; margin: 0; padding: 0; overflow: hidden; - li { - display: block; float: left; margin: 0 5px 0 0; - a { - display: block; height: 28px; padding: 0 10px; line-height: 28px; .border_radius_top(2); - text-decoration: none; color: @white; background: url('/https/github.com/images/transparent_backgrounds/accent_colour_30.png'); font-size: 14px; - font-weight: bold; - :hover { background: url('/https/github.com/images/transparent_backgrounds/accent_colour_45.png'); } - } - } - li.active { - a { - background: @white; color: @black; - :hover { color: @black; } - } - } -} - -/* Dwellometer */ -#dwellometer { - z-index: 45; float: right; .box_shadow(0, 0, 0, transparent); margin: 0; - div.content { - text-align: center; position: relative; - object, object embed { position: relative; z-index: 46; line-height: 0; } - div.title { - position: absolute; bottom: 10px; left: 0; right: 0; z-index: 50; - img { width: 120px; display: block; margin: 0 auto; position: relative; left: -5px; } - } - } -} - -/* Activity Stream */ -#activity { - div.content { - ul.events { - padding: 0; margin: 0 0 -10px; - li { - margin: 0; padding: 10px 0; border-bottom: 1px solid (@light_grey * 0.33 + @white * 0.66); - list-style: none; overflow: hidden; - small.meta { - font-size: 12px; color: @light_grey; float: right; - } - a.button { float: right; margin: 0 0 10px 10px; } - a.avatar, a.logo, a.thumbnail { - height: 32px; display: block; float: left; - img { width: 100%; height: 100%; } - } - a.avatar, a.logo, a.icon { width: 32px; } - a.thumbnail { width: 42px; } - div.symbols { - float: left; overflow: hidden; - b { - display: block; float: left; margin: 10px 5px 0; - img { height: 12px; width: 12px; } - } - b.voted { margin: 10px 3px 0; padding: 2px; .border_radius(2); } - b.voted.for { background: @colour_positive * 0.33 + @white * 0.66; } - b.voted.against { background: @colour_negative * 0.33 + @white * 0.66; } - } - /* Temporarily removed avatar and symbol */ -/* div.symbols a.agent, b { display: none; }*/ - div.description { - font-size: 12px; color: @grey; - a.agent { font-weight: bold; } - } - div.comment { - margin-top: 2px; - b.tail { - display: block; margin: 0 0 0 10px; width: 0; height: 0; border: 5px solid transparent; - border-top: none; border-bottom: 5px solid (@light_grey * 0.25 + @white * 0.75); - } - blockquote { - margin: 0; font-style: normal; color: @dark_grey; - .border_radius(3); background: @light_grey * 0.25 + @white * 0.75; padding: 5px 10px; - span.view_comment { - color: @grey; - } - } - } - div.content { - overflow: hidden; - } - } - li.new_comment.ad, li.endorsed.ad, li.voted { - div.description, div.content { margin-left: 106px; } -/* div.description, div.content { margin-left: 53px; }*/ - } - li.new_comment.brand, li.replied_to, li.endorsed.brand, li.connected, li.sn_setup { - div.description, div.content { margin-left: 96px; } -/* div.description, div.content { margin-left: 43px; }*/ - } - li.replied_to { - div.content { - a.thumbnail, a.logo { margin-top: 7px; } - } - } - li.replied_to.ad { - div.content { - div.comment { margin-left: 52px; } - } - } - li.replied_to.brand { - div.content { - div.comment { margin-left: 42px; } - } - } - li.voted div.description span.action { .border_radius(2); color: @dark_grey; padding: 0 3px; white-space: nowrap; } - li.voted.for div.description span.action { background: @colour_positive * 0.15 + @white * 0.85; } - li.voted.against div.description span.action { background: @colour_negative * 0.15 + @white * 0.85; } - li:first-child { padding-top: 0; } - li:last-child { border-bottom: none; } - li:hover div.content div.comment blockquote span.view_comment { - } - } - } -} - -/* Login/Register Modal */ -#login_register { - div.location_select, - div.location_search { margin-left: 130px; } - h3 { - small { font-size: 14px; font-weight: normal; display: block; color: @grey; text-align: left; margin: 0; display: block; } - } -} - -/* Contact Form in Pages */ -#pages_controller { - #sidebar { - #contact { - margin: 15px 0 0; - form { - label { text-align: left; float: none; width: auto; font-size: 12px; font-weight: bold; line-height: 1; margin: 0 0 5px; } - p.submit.indent { - margin: 0; - span.with_cancel { display: none; } - } - } - } - } -} - -/* Exclusive Offers */ -#offers { - div.content { - a.gift { - display: block; text-align: center; - img { height: 100px; } - } - } -} - -div.browse { - margin: 0 0 20px; - &.class { - padding: 0; - } - div.header { - padding: 10px 10px 9px; text-align: left; background: @bg url('/https/github.com/images/panel_header_bg.png') repeat-x top left; - border-bottom: 1px solid (@bg * 0.66 + @black * 0.33); line-height: 1; height: 18px; - .border_radius_top(3); color: @light_grey; - h3 { font-size: 16px; margin: 0; color: @white; .text_shadow(1, 1, 0, @bg * 0.66 + @black * 0.33); } - span.filter { - float: left; display: block; overflow: hidden; position: relative; z-index: 5; - a { - margin: 0 1px 0 0; display: block; float: left; padding: 0 8px; height: 18px; font-weight: bold; font-size: 10px; line-height: 18px; - text-transform: uppercase; background: url('/https/github.com/images/transparent_backgrounds/black_50.png'); color: @light_grey; text-decoration: none; position: relative; z-index: 3; - .active { - background: @white; color: @black; z-index: 4; - :hover { color: @black; } - } - :hover { color: @white; } - :first-child { .border_radius_left(2); } - :last-child { .border_radius_right(2); margin-right: 0; } - } - } - - span.filter.dropdown { - margin: 0; position: relative; overflow: visible; - a { - .border_radius(2); background: @white; color: @black; margin: 0; position: relative; padding-right: 25px; - img { float: left; margin: 4px 5px 0 0; } - b.arrow { - float: right; display: block; height: 0; width: 0; border: 5px solid transparent; border-top: 5px solid @black; border-bottom: none; - position: absolute; top: 6px; right: 10px; - } - :hover { - background: @accent_colour; color: @white; - b.arrow { border-top: 5px solid @white; } - } - } - ul { - position: absolute; top: 100%; left: 0; margin: 1px 0 0; padding: 0; background: @white; .border_radius(2); - .box_shadow(0, 1, 1, @black); - li { - list-style: none; display: block; padding: 0; margin: 0; - a { - display: block; height: 18px; line-height: 18px; color: @black; font-size: 10px; text-transform: uppercase; background: transparent; - border-bottom: 1px solid (@light_grey * 0.66 + @white * 0.33); float: none; margin: 0; .border_radius(0); white-space: nowrap; - :hover { background: url('/https/github.com/images/transparent_backgrounds/accent_colour_25.png'); color: @black; } - } - :last-child { - a { border: none; } - } - } - } - } - span.filter.dropdown.sort { float: left; margin: 0 0 0 10px; } - span.filter.dropdown.localisation { float: left; margin: 0 0 0 10px; } - a.more { - float: right; color: @white; .text_shadow(1, 1, 0, @bg * 0.66 + @black * 0.33); font-size: 14px; font-weight: bold; - position: relative; top: 2px; - :hover { text-decoration: none; } - } - } - > ul { - margin: 0; background: @white; padding: 10px 0 0 10px; .border_radius(3); position: relative; - li { - display: block; float: left; list-style: none; margin: 0 10px 10px 0; padding: 5px; position: relative; - background: @white; width: 130px; border: 1px solid (@light_grey * 0.33 + @white * 0.66); .border_radius(2); - a.remove { - position: absolute; height: 16px; width: 16px; padding: 3px; background: @accent_colour; - .border_radius(99); display: none; z-index: 3; top: -8px; right: -8px; - img { vertical-align: middle; } - } - div.thumbnail { - .border_radius_top(3); position: relative; z-index: 3; - .marker { - position: absolute; padding: 2px; .border_radius(2); z-index: 3; - background: url('/https/github.com/images/transparent_backgrounds/white_75.png'); height: 12px; width: 12px; - } - .marker.coupon { - height: auto; width: auto; top: 10px; right: -3px; padding: 0; background: transparent; overflow: hidden; position: absolute; - b { - display: block; height: 0; width: 0; float: left; border: 14px solid transparent; border-top: 14px solid @accent_colour; - border-bottom: none; border-right: none; float: left; - } - span { - color: @white; font-size: 10px; font-weight: bold; text-transform: uppercase; height: 14px; line-height: 14px; display: block; - padding: 0 4px 0 2px; background: @accent_colour; .text_shadow(1, 1, 0px, (@accent_colour * 0.75 + @black * 0.25)); margin: 0 0 0 14px; - } - } - .marker.video { - position: absolute; left: 50%; top: 50%; background: @white; width: 10px; height: 10px; - b { display: block; width: 0; height: 0; border: 5px solid transparent; border-left: 10px solid @black; border-right: none; } - } - .marker.endorsed_by_me { background: none; padding: 0; right: 0; bottom: -32px; .border_radius(2); background: @white; } - a.thumbnail { - display: block; overflow: hidden; position: relative; text-align: center; - img { position: relative; display: block; margin: auto; } - } - } - div.text { - margin: 3px 0 0; display: block; - a { text-decoration: none; } - a.title { - display: block; text-decoration: none; font-weight: bold; font-size: 12px; line-height: 16px; - white-space: nowrap; height: 16px; overflow: hidden; - :before { - display: block; height: 32px; width: 20px; content: " "; float: right; right: -15px; top: -8px; - background: @white; position: relative; z-index: 1; .box_shadow(-5, 0, 10, @white); - } - } - small { - font-size: 11px; line-height: 13px; color: @grey; display: block; height: 13px; overflow: hidden; white-space: nowrap; - a { font-weight: bold; } - :before { - display: block; height: 32px; width: 20px; content: " "; float: right; right: -15px; top: -8px; - background: @white; position: relative; z-index: 1; .box_shadow(-5, 0, 10, @white); - } - } - } - :hover { - background: @accent_colour; - a.remove { display: block; } - div.thumbnail { - a.marker.remove, a.marker.video { - b { display: inline-block; } - } - a.marker.video { .box_shadow(0, 0, 2, @black); } - } - div.text { - a { color: @white; } - a.title:before { background: @accent_colour; .box_shadow(-5, 0, 10, @accent_colour); } - small { - color: @white * 0.75 + @accent_colour * 0.25; - :before { background: @accent_colour; .box_shadow(-5, 0, 10, @accent_colour); } - } - } - div.footer a { color: @white; } - } - } - > li.ad div.thumbnail a.thumbnail { - width: 130px; height: 97px; - img { width: 100%; height: 100%; } - } - > li.brand div.thumbnail a.thumbnail { - width: 120px; height: 87px; padding: 5px; background: @white; .border_radius(2); - img { max-width: 120px; max-height: 87px; } - } - li.paginate { - margin-bottom: 0; - a { - display: block; position: relative; text-decoration: none; height: 131px; - div.arrow { - background: #81c153 url('/https/github.com/images/button_bg.png') repeat-x left top; border: 1px solid (@accent_colour * 0.75 + @black * 0.25); - height: 44px; .border_radius(99); width: 44px; margin: 0 auto; position: relative; top: 32px; - b { text-indent: -9000px; display: block; border: 10px solid transparent; width: 0; height: 0; position: relative; top: 12px; } - } - div.label { - position: absolute; bottom: 5px; left: 0; right: 0; line-height: 13px; - color: @accent_colour * 0.85 + @black * 0.15; text-decoration: none; - font-weight: bold; font-size: 12px; text-align: center; - } - :hover { - div.arrow { background: #abd56e url('/https/github.com/images/button_bg.png') repeat-x left -44px; } - } - } - :hover { background: transparent; } - } - li.paginate.previous a div b { border-right: 15px solid @white; border-left: none; left: 12px; } - li.paginate.next a div b { border-left: 15px solid @white; border-right: none; left: 16px; } - } - > div.footer { - padding: 9px 10px 10px; background: @light_grey * 0.75 + @white * 0.25; overflow: hidden; - border-top: 1px solid @light_grey; .border_radius_bottom(3); - div.info { - float: left; color: @grey; - strong { color: @black; font-weight: normal; } - } - div.pagination { - float: right; - > * { - display: inline-block; line-height: 1; padding: 0 6px; line-height: 18px; height: 18px; background: @white; - .border_radius(3); text-decoration: none; font-weight: bold; - font-size: 10px; text-transform: uppercase; - } - a { color: @grey; } - a:hover { color: @black; } - span.disabled { color: @light_grey; } - span.current { color: @white; background: @bg; border: none; } - span.current:hover { color: @white; } - } - } -} -div.browse.with_categories { margin: 0 0 0 160px; } -div.browse.with_options > ul { .border_radius_top(0); } -div.browse.with_footer > ul { .border_radius_bottom(0); } -/* Browse List */ -div.browse.list { -> ul { - margin: 0; min-height: 320px; - padding: 10px 0 0 10px; overflow: hidden; - > li { - display: block; list-style: none; margin: 0 10px 10px 0; padding: 5px; - .border_radius(3); position: relative; line-height: normal; - .marker { - position: absolute; padding: 2px; .border_radius(2); - background: url('/https/github.com/images/transparent_backgrounds/white_75.png'); - img { height: 12px; width: 12px; } - } - img.marker { height: 12px; width: 12px; } - span.marker.new { - color: black; left: -5px; top: -5px; background: none; background-color: @white * 0.1 + @yellow * 0.6 + @red * 0.3; line-height: 1; padding: 2px 5px; - font-weight: bold; - } - a.marker.media_type { - display: inline-block; text-decoration: none; top: 39px; left: 8px; - font-size: 10px; - b { font-weight: normal; margin: 0 0 0 2px; line-height: 1; display: none; } - img { vertical-align: middle; } - } - a.thumbnail { - float: left; - width: 68px; display: block; overflow: hidden; - border: 1px solid @light_grey; - :hover { border-color: @accent_colour; } - } - span.title_brand { - display: block; margin: 0 0 2px 75px; - a { margin: 0; display: inline; } - a.brand_name { font-weight: normal; font-size: 12px; } - } - a.ad_title { - font-weight: bold; font-size: 14px; margin: 0 0 0 75px; display: block; - } - a.brand_name { - font-weight: bold; font-size: 14px; margin: 0 0 0 75px; display: block; - } - small { - display: block; color: @grey; margin: 0 0 0 75px; font-size: 12px; - } - small.brand_name { display: inline; margin: 0; } - ul.chart { - margin: 0 0 0 80px; - height: 39px; - } - ul.networks { - margin: 3px 0 0 75px; padding: 0; overflow: hidden; - li { display: block; float: left; margin: 0 5px 0 0; line-height: 1; } - } - div.points { - display: none; - font-size: 12px; text-align: right; - label { color: @grey; } - } - a.remove { bottom: -3px; right: -3px; } - } - li.ad { - a.thumbnail { height: 51px; } - span.title_brand { - small.brand_name { - display: block; - } - } - } - li.brand { - a.thumbnail { height: 68px; } - } - } -} -div.browse.list.with_options ul { .border_radius_top(0); } -div.browse.list.with_footer ul { .border_radius_bottom(0); } -div.browse.list.cols_2 { - > ul { - > li { - width: 285px; float: left; - :hover { - background: @white; - } - } - } -} -div.browse.ads.list { - > ul { - > li { - height: 53px; - a.thumbnail { - height: 51px; - } - } - } -} -div.browse.brands.list { - > ul { - > li { - height: 68px; - a.thumbnail { - height: 66px; - } - } - } -} - -/* Categories List */ -#categories { - margin: 40px 0 0; width: 160px; float: left; position: relative; z-index: 1; - ul { - margin: 0; padding: 10px 0 0; - li { - list-style: none; margin: 0; padding: 0; font-size: 14px; - a { color: @grey; display: block; padding: 5px 10px 5px 15px; text-decoration: none; .border_radius_left(3); } - a:hover { color: @black; background: @light_grey * 0.15 + @white * 0.85; } - } - .all a { font-weight: bold; } - .current a { - background: @white; color: @black; border: 1px solid (@light_grey * 0.25 + @white * 0.75); border-right: none; border-left: 5px solid @bg; - padding-left: 10px; - } - } -} - -/* Ads > Show */ -#ad { - div.header { - overflow: hidden; - h3 { font-size: 16px; margin: 0 0 3px; } - small { - a.category { font-weight: bold; color: @accent_colour; } - span.networks img { position: relative; top: 3px; } - } - span.brand { - float: right; color: @white; - a.brand_name { font-weight: bold; color: @accent_colour; } - } - } - div.content { - padding: 0; position: relative; - a.toggle_size { - display: block; .border_radius(3); background-color: @black; padding: 0 5px 0 26px; - background-position: 5px center; background-repeat: no-repeat; text-decoration: none; margin: 5px 5px 0 0; - position: absolute; top: 0; right: 0; line-height: 25px; z-index: 45; - } - img.creative { margin: 0 auto; max-width: 540px; display: block; } - object { position: relative; z-index: 44; } - object.video { line-height: 0; font-size: 0; } - object embed { position: relative; z-index: 45; line-height: 0; font-size: 0; } - } - div.content.not_video { - padding: 40px; text-align: center; - * { margin-left: auto; margin-right: auto; } - object.flash { margin-bottom: 0; } - } - div.footer { - padding: 0; - div.vote_views { - padding: 5px 10px; overflow: hidden; - div.share { float: right; margin: 2px 0 0 0; } - #login_register_msg, #encourage_vote_msg { line-height: 22px; font-weight: bold; color: @black; } - } - } -} -#sidebar { - #meta { - table { - margin: 0; - tr:last-child td { padding-bottom: 0; } - td { - padding: 0 0 5px; - ul.networks { - margin: 0; padding: 0; - li { - list-style: none; display: inline; - } - li { - } - } - } - td.label { color: @grey; white-space: nowrap; width: 1%; text-align: right; padding-right: 5px; } - } - } -} - -/* Voting */ -div.voted { - font-size: 12px; line-height: 22px; color: @black; display: inline-block; font-weight: bold; - img { float: left; margin-right: 5px; padding: 3px; .border_radius(3); } -} -#voted_up { - img { background: @colour_positive * 0.66 + @bg * 0.15; } -} -#voted_down { - img { background: @colour_negative * 0.66 + @bg * 0.15; } -} -#encourage_comment { - display: inline-block; line-height: 22px; font-weight: bold; -} -#vote { - overflow: hidden; font-size: 12px; line-height: 22px; color: @black; float: left; - a { - color: @white; font-weight: bold; overflow: hidden; display: block; - width: 16px; text-decoration: none; text-align: center; font-size: 10px; padding: 3px; text-transform: uppercase; - } - a.up { - float: left; background: @colour_positive * 0.66 + @bg * 0.15; .border_radius_left(3); - :hover { background: @colour_positive * 0.85 + @bg * 0.15; } - } - a.down { - float: left; background: @colour_negative * 0.66 + @bg * 0.15; .border_radius_right(3); - margin: 0 5px 0 1px; - :hover { background: @colour_negative * 0.85 + @bg * 0.15; } - } -} -#vote.disabled { - a.up { - background: (@colour_positive * 0.66 + @bg * 0.15) * 0.15 + @grey * 0.85; - :hover { background: (@colour_positive * 0.85 + @bg * 0.15) * 0.25 + @grey * 0.75; } - } - a.down { - background: (@colour_negative * 0.66 + @bg * 0.15) * 0.15 + @grey * 0.85; - :hover { background: (@colour_negative * 0.85 + @bg * 0.15) * 0.25 + @grey * 0.75; } - } -} -#sidebar { - #ads > ul li, #recommendations > ul li { - width: 81px; - div.thumbnail { - a.thumbnail { height: 60px; width: 81px; } - } - div.text { - a.title { font-size: 11px; height: 14px; line-height: 14px; } - small { display: none; } - } - } - #brands > ul li { - width: 55px; - div.thumbnail { - a.thumbnail { - height: 45px; width: 45px; - img { max-height: 45px; max-width: 45px; } - } - } - div.text { display: none; } - } -} - -/* My Account */ -#accounts_controller { - #top { - #page_title { - #page_options { - a.button.public_profile { - float: right; font-size: 16px; line-height: 1; height: auto; padding: 8px 35px 8px 15px; position: relative; - b.arrow { display: block; height: 0; width: 0; position: absolute; top: 10px; right: 15px; border: 6px solid transparent; border-right: none; border-left: 6px solid @white; margin: 0; } - } - a.button.goto_dashboard { - float: right; font-size: 16px; line-height: 1; height: auto; padding: 8px 15px 8px 35px; margin-right: 5px; position: relative; - b.arrow { display: block; height: 0; width: 0; position: absolute; top: 10px; left: 15px; border: 6px solid transparent; border-left: none; border-right: 6px solid @white; margin: 0; } - } - } - } - } - #account_nav { - float: left; width: 200px; margin: 0 20px 0 0; - ul.nav { - margin: 0; padding: 0; - li { - margin: 0 0 5px; display: block; list-style: none; padding: 0; - a { - display: block; height: 30px; text-decoration: none; color: @white; - b { - border: 15px solid transparent; border-right: none; border-left: 10px solid transparent; width: 0; - height: 0; float: right; display: none; - } - span { - .border_radius(3); background: @bg; display: block; - line-height: 30px; padding: 0 10px; font-size: 14px; font-weight: bold; margin: 0 10px 0 0; - } - } - :hover { - a { - color: @white; - b { border-left-color: @bg; display: block; } - span { background: @bg; .border_radius_right(0); } - } - } - } - li.current a { - b { border-left-color: @accent_colour; display: block; } - span { background: @accent_colour; color: @white; .border_radius_right(0); } - } - } - } - #main { - > div { - margin: 0 0 20px; - form { margin: 0; } - } - #profile { - a.avatar { - float: left; display: block; - width: 70px; overflow: hidden; position: relative; text-decoration: none; - img { width: 100%; } - span { - display: block; line-height: 1; padding: 3px; margin: 5px 0 0; color: @white; background: @accent_colour; - .border_radius(3); .text_shadow(1, 1, 0, @grey); - text-align: center; font-size: 10px; font-weight: bold; text-transform: uppercase; - } - } - form { - margin: 0 0 0 90px; - h4 { margin: 10px 0 20px; border-bottom: 1px solid (@light_grey * 0.5 + @white * 0.5); padding: 0; color: @bg; font-size: 16px; } - ul.choices { - li { width: 30%; } - } - div.extra { margin-top: 20px; } - } - } - - #networks { - ul { margin: 0 -10px -10px 0; padding: 0; overflow: hidden; - li:hover - { - background: @light_grey; display: block; float: left; width: 180px; - padding: 10px; margin: 0 10px 10px 0; list-style: none; .border_radius(3); - position: relative; - * { line-height: normal; } - img { vertical-align: middle; float: left; } - .name { font-weight: bold; font-size: 14px; display: block; margin: -2px 0 0 42px; } - small { - font-size: 12px; color: @grey; display: block; margin-left: 42px; - strong { color: @black; font-weight: normal; } - } - :hover { - } - } - li.installed { - background: @white; - border: 2px solid @accent_colour; padding: 8px; - } - li.unavailable { - .name { color: @black; } - :hover { - background: @light_grey; - } - } - li:hover { - background: @light_grey * 0.5 + @white * 0.5; - } - } - } - } -} - -/* Shopping Style Panel */ -#shopping_style { - div.header a.button.small { float: right; } - div.content { - p { - margin: 0 0 10px; - label { text-transform: uppercase; font-size: 11px; display: block; color: @bg; font-weight: bold; } - span { color: @black; } - span.toggle { white-space: nowrap; color: @grey; } - :last-child { margin: 0; } - } - p.more { text-align: left; font-weight: normal; } - p.less { display: none; margin: 0; } - } -} - -/* People Controller */ -#people_controller.index { - #main { - div.panel { - float: left; width: 300px; margin: 0 20px 0 0; - :last-child { margin-right: 0; } - } - } -} -#people_controller.show { - #person_overview, #shopping_style { - a.button.small { - } - } - #content { - #shopping_style { - float: left; width: 240px; margin: 0 20px 0 0; - } - #main { width: 360px; } - } -} - -/* Search Results */ -#search_results { - margin: 0 0 20px; - li { - :hover { - small { color: @white * 0.75 + @accent_colour * 0.25; } - } - } -} -#search { - div.content { - padding: 20px; - form { - margin: 0; float: none; - span.submit_and_options { - display: block; - } - } - p { margin: 0 0 15px; } - h4 { font-weight: normal; margin: 0 0 5px; } - } -} - -/* Recommendations */ -#recommendations { - div.browse { - margin: 0; padding: 0; background: none; - ul { min-height: 0; .border_radius(0); } - } -} - -/* Blank States */ -div.blank { - padding: 20px; background: @bg * 0.05 + @blue * 0.05 + @white * 0.9; position: relative; - border: 1px solid (@bg * 0.1 + @blue * 0.1 + @white * 0.8); z-index: 1; - h4 { font-size: 18px; margin: 0 0 10px; } - h4:last-child { margin: 0; } - p { font-size: 16px; margin: 0 0 10px; } - p:last-child { margin: 0; } - p.with_list_number.large { - span { margin-left: 48px; display: block; color: @white; } - } - p.earn span { font-size: 22px; color: @white; line-height: 48px; font-weight: bold; } - a { white-space: nowrap; } - a.hide { - position: absolute; top: -5px; right: -5px; display: block; height: 16px; width: 16px; padding: 3px; background: #E7E9F6; .border_radius(99); - } -} - -div.blank.small { - padding: 10px 20px; - h4 { font-weight: normal; font-size: 16px; } - p { margin: 0; } -} -div.blank.tiny { - padding: 10px 20px; - h4 { font-weight: normal; font-size: 14px; } - p { margin: 0; font-size: 12px; } -} -div.blank.rounded { - .border_radius(3); margin: 0 0 20px; -} -div.blank.rounded.bottom { .border_radius_top(0); } -div.blank.with_border_bottom { border-bottom: 1px solid (@bg * 0.1 + @blue * 0.1 + @white * 0.8); } -div.blank.no_border_top { border-top: none; } -div.blank.no_border_bottom { border-bottom: none; } -div.blank.no_side_borders { border-right: none; border-left: none; } -div.panel { - div.blank { - padding: 10px 20px; overflow: hidden; margin: 0; - h4 { font-weight: normal; font-size: 14px; } - p, ul { margin: 0 0 10px; font-size: 12px; } - p:last-child, ul:last-child { margin: 0; } - } -} - -#yelow { - #short { - color: #fea; - } - #long { - color: #ffeeaa; - } - #rgba { - color: rgba(255, 238, 170, 0.1); - } -} - -#blue { - #short { - color: #00f; - } - #long { - color: #0000ff; - } - #rgba { - color: rgba(0, 0, 255, 0.1); - } -} - -#overflow { - .a { color: #111111 - #444444; } // #000000 - .b { color: #eee + #fff; } // #ffffff - .c { color: #aaa * 3; } // #ffffff - .d { color: #00ee00 + #009900; } // #00ff00 -} - -#grey { - color: rgb(200, 200, 200); -} - -#808080 { - color: hsl(50, 0%, 50%); -} - -#00ff00 { - color: hsl(120, 100%, 50%); -} -/******************\ -* * -* Comment Header * -* * -\******************/ - -/* - - Comment - -*/ - -/* - * Comment Test - * - * - cloudhead (http://cloudhead.net) - * - */ - -//////////////// -@var: "content"; -//////////////// - -/* Colors - * ------ - * #EDF8FC (background blue) - * #166C89 (darkest blue) - * - * Text: - * #333 (standard text) // A comment within a comment! - * #1F9EC9 (standard link) - * - */ - -/* @group Variables -------------------- */ -#comments /* boo */ { - /**/ // An empty comment - color: red; /* A C-style comment */ - background-color: orange; // A little comment - font-size: 12px; - - /* lost comment */ content: @var; - - border: 1px solid black; - - // padding & margin // - padding: 0; - margin: 2em; -} // - -/* commented out - #more-comments { - color: grey; - } -*/ - -#last { color: blue } -// -.comma-delimited { - background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg); - text-shadow: -1px -1px 1px red, 6px 5px 5px yellow; - -moz-box-shadow: 0pt 0pt 2px rgba(255, 255, 255, 0.4) inset, - 0pt 4px 6px rgba(255, 255, 255, 0.4) inset; -} -@font-face { - font-family: Headline; - src: local(Futura-Medium), - url(fonts.svg#MyGeometricModern) format("svg"); -} -.other { - -moz-transform: translate(0, 11em) rotate(-90deg); -} -p:not([class*="lead"]) { - color: black; -} - -input[type="text"].class#id[attr=32]:not(1) { - color: white; -} - -div#id.class[a=1][b=2].class:not(1) { - color: white; -} - -ul.comma > li:not(:only-child)::after { - color: white; -} - -ol.comma > li:nth-last-child(2)::after { - color: white; -} - -li:nth-child(4n+1), -li:nth-child(-5n), -li:nth-child(-n+2) { - color: white; -} - -a[href^="https://"] { - color: black; -} - -a[href$="https://"] { - color: black; -} - -form[data-disabled] { - color: black; -} - -p::before { - color: black; -} -@charset "utf-8"; -div { color: black; } -div { width: 99%; } - -* { - min-width: 45em; -} - -h1, h2 > a > p, h3 { - color: none; -} - -div.class { - color: blue; -} - -div#id { - color: green; -} - -.class#id { - color: purple; -} - -.one.two.three { - color: grey; -} - -@media print { - font-size: 3em; -} - -@media screen { - font-size: 10px; -} - -@font-face { - font-family: 'Garamond Pro'; - src: url("/https/github.com/fonts/garamond-pro.ttf"); -} - -a:hover, a:link { - color: #999; -} - -p, p:first-child { - text-transform: none; -} - -q:lang(no) { - quotes: none; -} - -p + h1 { - font-size: 2.2em; -} - -#shorthands { - border: 1px solid #000; - font: 12px/16px Arial; - margin: 1px 0; - padding: 0 auto; - background: url("http://www.lesscss.org/spec.html") no-repeat 0 4px; -} - -#more-shorthands { - margin: 0; - padding: 1px 0 2px 0; - font: normal small/20px 'Trebuchet MS', Verdana, sans-serif; -} - -.misc { - -moz-border-radius: 2px; - display: -moz-inline-stack; - width: .1em; - background-color: #009998; - background-image: url(images/image.jpg); - background: -webkit-gradient(linear, left top, left bottom, from(red), to(blue)); - margin: ; -} - -#important { - color: red !important; - width: 100%!important; - height: 20px ! important; -} - -#functions { - @var: 10; - color: color("evil red"); // #660000 - width: increment(15); - height: undefined("self"); - border-width: add(2, 3); - variable: increment(@var); -} - -#built-in { - @r: 32; - escaped: e("-Some::weird(#thing, y)"); - lighten: lighten(#ff0000, 50%); - darken: darken(#ff0000, 50%); - saturate: saturate(#29332f, 20%); - desaturate: desaturate(#203c31, 20%); - greyscale: greyscale(#203c31); - format: %("rgb(%d, %d, %d)", @r, 128, 64); - format-string: %("hello %s", "world"); - eformat: e(%("rgb(%d, %d, %d)", @r, 128, 64)); -} - -@var: @a; -@a: 100%; - -.lazy-eval { - width: @var; -} -.mixin (@a: 1px, @b: 50%) { - width: @a * 5; - height: @b - 1%; -} - -.mixina (@style, @width, @color: black) { - border: @width @style @color; -} - -.mixiny -(@a: 0, @b: 0) { - margin: @a; - padding: @b; -} - -.hidden() { - color: transparent; -} - -.two-args { - color: blue; - .mixin(2px, 100%); - .mixina(dotted, 2px); -} - -.one-arg { - .mixin(3px); -} - -.no-parens { - .mixin; -} - -.no-args { - .mixin(); -} - -.var-args { - @var: 9; - .mixin(@var, @var * 2); -} - -.multi-mix { - .mixin(2px, 30%); - .mixiny(4, 5); -} - -.maxa(@arg1: 10, @arg2: #f00) { - padding: @arg1 * 2px; - color: @arg2; -} - -body { - .maxa(15); -} - -@glob: 5; -.global-mixin(@a:2) { - width: @glob + @a; -} - -.scope-mix { - .global-mixin(3); -} - -.nested-ruleset (@width: 200px) { - width: @width; - .column { margin: @width; } -} -.content { - .nested-ruleset(600px); -} - -// - -.same-var-name2(@radius) { - radius: @radius; -} -.same-var-name(@radius) { - .same-var-name2(@radius); -} -#same-var-name { - .same-var-name(5px); -} - -// - -.var-inside () { - @var: 10px; - width: @var; -} -#var-inside { .var-inside; } -.mix-inner (@var) { - border-width: @var; -} - -.mix (@a: 10) { - .inner { - height: @a * 10; - - .innest { - width: @a; - .mix-inner(@a * 2); - } - } -} - -.class { - .mix(30); -} -.mixin () { - zero: 0; -} -.mixin (@a: 1px) { - one: 1; -} -.mixin (@a) { - one-req: 1; -} -.mixin (@a: 1px, @b: 2px) { - two: 2; -} - -.mixin (@a, @b, @c) { - three-req: 3; -} - -.mixin (@a: 1px, @b: 2px, @c: 3px) { - three: 3; -} - -.zero { - .mixin(); -} - -.one { - .mixin(1); -} - -.two { - .mixin(1, 2); -} - -.three { - .mixin(1, 2, 3); -} - -// - -.mixout ('left') { - left: 1; -} - -.mixout ('right') { - right: 1; -} - -.left { - .mixout('left'); -} -.right { - .mixout('right'); -} - -// - -.border (@side, @width) { - color: black; - .border-side(@side, @width); -} -.border-side (left, @w) { - border-left: @w; -} -.border-side (right, @w) { - border-right: @w; -} - -.border-right { - .border(right, 4px); -} -.border-left { - .border(left, 4px); -} - -// - - -.border-radius (@r) { - both: @r * 10; -} -.border-radius (@r, left) { - left: @r; -} -.border-radius (@r, right) { - right: @r; -} - -.only-right { - .border-radius(33, right); -} -.only-left { - .border-radius(33, left); -} -.left-right { - .border-radius(33); -} -.mixin { border: 1px solid black; } -.mixout { border-color: orange; } -.borders { border-style: dashed; } - -#namespace { - .borders { - border-style: dotted; - } - .biohazard { - content: "death"; - .man { - color: transparent; - } - } -} -#theme { - > .mixin { - background-color: grey; - } -} -#container { - color: black; - .mixin; - .mixout; - #theme > .mixin; -} - -#header { - .milk { - color: white; - .mixin; - #theme > .mixin; - } - #cookie { - .chips { - #namespace .borders; - .calories { - #container; - } - } - .borders; - } -} -.secure-zone { #namespace .biohazard .man; } -.direct { - #namespace > .borders; -} -#operations { - color: #110000 + #000011 + #001100; // #111111 - height: 10px / 2px + 6px - 1px * 2; // 9px - width: 2 * 4 - 5em; // 3em - .spacing { - height: 10px / 2px+6px-1px*2; - width: 2 * 4-5em; - } - substraction: 20 - 10 - 5 - 5; // 0 - division: 20 / 5 / 4; // 1 -} - -@x: 4; -@y: 12em; - -.with-variables { - height: @x + @y; // 16em - width: 12 + @y; // 24em - size: 5cm - @x; // 1cm -} - -@z: -2; - -.negative { - height: 2px + @z; // 0px - width: 2px - @z; // 4px -} - -.shorthands { - padding: -1px 2px 0 -4px; // -} - -.colors { - color: #123; // #112233 - border-color: #234 + #111111; // #334455 - background-color: #222222 - #fff; // #000000 - .other { - color: 2 * #111; // #222222 - border-color: #333333 / 3 + #111; // #222222 - } -} -.parens { - @var: 1px; - border: (@var * 2) solid black; - margin: (@var * 1) (@var + 2) (4 * 4) 3; - width: (6 * 6); - padding: 2px (6px * 6px); -} - -.more-parens { - @var: (2 * 2); - padding: (2 * @var) 4 4 (@var * 1px); - width: (@var * @var) * 6; - height: (7 * 7) + (8 * 8); - margin: 4 * (5 + 5) / 2 - (@var * 2); - //margin: (6 * 6)px; -} - -.nested-parens { - width: 2 * (4 * (2 + (1 + 6))) - 1; - height: ((2+3)*(2+3) / (9-4)) + 1; -} - -.mixed-units { - margin: 2px 4em 1 5pc; - padding: (2px + 4px) 1em 2px 2; -} -#first > .one { - > #second .two > #deux { - width: 50%; - #third { - &:focus { - color: black; - #fifth { - > #sixth { - .seventh #eighth { - + #ninth { - color: purple; - } - } - } - } - } - height: 100%; - } - #fourth, #five, #six { - color: #110000; - .seven, .eight > #nine { - border: 1px solid black; - } - #ten { - color: red; - } - } - } - font-size: 2em; -} -@x: blue; -@z: transparent; -@mix: none; - -.mixin { - @mix: #989; -} - -.tiny-scope { - color: @mix; // #989 - .mixin; -} - -.scope1 { - @y: orange; - @z: black; - color: @x; // blue - border-color: @z; // black - .hidden { - @x: #131313; - } - .scope2 { - @y: red; - color: @x; // blue - .scope3 { - @local: white; - color: @y; // red - border-color: @z; // black - background-color: @local; // white - } - } -}h1, h2, h3 { - a, p { - &:hover { - color: red; - } - } -} - -#all { color: blue; } -#the { color: blue; } -#same { color: blue; } - -ul, li, div, q, blockquote, textarea { - margin: 0; -} - -td { - margin: 0; - padding: 0; -} - -td, input { - line-height: 1em; -} -#strings { - background-image: url("http://son-of-a-banana.com"); - quotes: "~" "~"; - content: "#*%:&^,)!.(~*})"; - empty: ""; - brackets: "{" "}"; -} -#comments { - content: "/* hello */ // not-so-secret"; -} -#single-quote { - quotes: "'" "'"; - content: '""#!&""'; - empty: ''; -} -@a: 2; -@x: @a * @a; -@y: @x + 1; -@z: @x * 2 + @y; - -.variables { - width: @z + 1cm; // 14cm -} - -@b: @a * 10; -@c: #888; - -@fonts: "Trebuchet MS", Verdana, sans-serif; -@f: @fonts; - -@quotes: "~" "~"; -@q: @quotes; - -.variables { - height: @b + @x + 0px; // 24px - color: @c; - font-family: @f; - quotes: @q; -} - -.redefinition { - @var: 4; - @var: 2; - @var: 3; - three: @var; -} - -.values { - @a: 'Trebuchet'; - font-family: @a, @a, @a; -} - - -.whitespace - { color: white; } - -.whitespace -{ - color: white; -} - .whitespace -{ color: white; } - -.whitespace{color:white;} -.whitespace { color : white ; } - -.white, -.space, -.mania -{ color: white; } - -.no-semi-column { color: white } -.no-semi-column { - color: white; - white-space: pre -} -.no-semi-column {border: 2px solid white} -.newlines { - background: the, - great, - wall; - border: 2px - solid - black; -} -.empty { - -} -#yelow { - #short { - color: #fea; - } - #long { - color: #ffeeaa; - } - #rgba { - color: rgba(255, 238, 170, 0.1); - } -} - -#blue { - #short { - color: #00f; - } - #long { - color: #0000ff; - } - #rgba { - color: rgba(0, 0, 255, 0.1); - } -} - -#overflow { - .a { color: #111111 - #444444; } // #000000 - .b { color: #eee + #fff; } // #ffffff - .c { color: #aaa * 3; } // #ffffff - .d { color: #00ee00 + #009900; } // #00ff00 -} - -#grey { - color: rgb(200, 200, 200); -} - -#808080 { - color: hsl(50, 0%, 50%); -} - -#00ff00 { - color: hsl(120, 100%, 50%); -} -/******************\ -* * -* Comment Header * -* * -\******************/ - -/* - - Comment - -*/ - -/* - * Comment Test - * - * - cloudhead (http://cloudhead.net) - * - */ - -//////////////// -@var: "content"; -//////////////// - -/* Colors - * ------ - * #EDF8FC (background blue) - * #166C89 (darkest blue) - * - * Text: - * #333 (standard text) // A comment within a comment! - * #1F9EC9 (standard link) - * - */ - -/* @group Variables -------------------- */ -#comments /* boo */ { - /**/ // An empty comment - color: red; /* A C-style comment */ - background-color: orange; // A little comment - font-size: 12px; - - /* lost comment */ content: @var; - - border: 1px solid black; - - // padding & margin // - padding: 0; - margin: 2em; -} // - -/* commented out - #more-comments { - color: grey; - } -*/ - -#last { color: blue } -// -.comma-delimited { - background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg); - text-shadow: -1px -1px 1px red, 6px 5px 5px yellow; - -moz-box-shadow: 0pt 0pt 2px rgba(255, 255, 255, 0.4) inset, - 0pt 4px 6px rgba(255, 255, 255, 0.4) inset; -} -@font-face { - font-family: Headline; - src: local(Futura-Medium), - url(fonts.svg#MyGeometricModern) format("svg"); -} -.other { - -moz-transform: translate(0, 11em) rotate(-90deg); -} -p:not([class*="lead"]) { - color: black; -} - -input[type="text"].class#id[attr=32]:not(1) { - color: white; -} - -div#id.class[a=1][b=2].class:not(1) { - color: white; -} - -ul.comma > li:not(:only-child)::after { - color: white; -} - -ol.comma > li:nth-last-child(2)::after { - color: white; -} - -li:nth-child(4n+1), -li:nth-child(-5n), -li:nth-child(-n+2) { - color: white; -} - -a[href^="https://"] { - color: black; -} - -a[href$="https://"] { - color: black; -} - -form[data-disabled] { - color: black; -} - -p::before { - color: black; -} -@charset "utf-8"; -div { color: black; } -div { width: 99%; } - -* { - min-width: 45em; -} - -h1, h2 > a > p, h3 { - color: none; -} - -div.class { - color: blue; -} - -div#id { - color: green; -} - -.class#id { - color: purple; -} - -.one.two.three { - color: grey; -} - -@media print { - font-size: 3em; -} - -@media screen { - font-size: 10px; -} - -@font-face { - font-family: 'Garamond Pro'; - src: url("/https/github.com/fonts/garamond-pro.ttf"); -} - -a:hover, a:link { - color: #999; -} - -p, p:first-child { - text-transform: none; -} - -q:lang(no) { - quotes: none; -} - -p + h1 { - font-size: 2.2em; -} - -#shorthands { - border: 1px solid #000; - font: 12px/16px Arial; - margin: 1px 0; - padding: 0 auto; - background: url("http://www.lesscss.org/spec.html") no-repeat 0 4px; -} - -#more-shorthands { - margin: 0; - padding: 1px 0 2px 0; - font: normal small/20px 'Trebuchet MS', Verdana, sans-serif; -} - -.misc { - -moz-border-radius: 2px; - display: -moz-inline-stack; - width: .1em; - background-color: #009998; - background-image: url(images/image.jpg); - background: -webkit-gradient(linear, left top, left bottom, from(red), to(blue)); - margin: ; -} - -#important { - color: red !important; - width: 100%!important; - height: 20px ! important; -} - -#functions { - @var: 10; - color: color("evil red"); // #660000 - width: increment(15); - height: undefined("self"); - border-width: add(2, 3); - variable: increment(@var); -} - -#built-in { - @r: 32; - escaped: e("-Some::weird(#thing, y)"); - lighten: lighten(#ff0000, 50%); - darken: darken(#ff0000, 50%); - saturate: saturate(#29332f, 20%); - desaturate: desaturate(#203c31, 20%); - greyscale: greyscale(#203c31); - format: %("rgb(%d, %d, %d)", @r, 128, 64); - format-string: %("hello %s", "world"); - eformat: e(%("rgb(%d, %d, %d)", @r, 128, 64)); -} - -@var: @a; -@a: 100%; - -.lazy-eval { - width: @var; -} -.mixin (@a: 1px, @b: 50%) { - width: @a * 5; - height: @b - 1%; -} - -.mixina (@style, @width, @color: black) { - border: @width @style @color; -} - -.mixiny -(@a: 0, @b: 0) { - margin: @a; - padding: @b; -} - -.hidden() { - color: transparent; -} - -.two-args { - color: blue; - .mixin(2px, 100%); - .mixina(dotted, 2px); -} - -.one-arg { - .mixin(3px); -} - -.no-parens { - .mixin; -} - -.no-args { - .mixin(); -} - -.var-args { - @var: 9; - .mixin(@var, @var * 2); -} - -.multi-mix { - .mixin(2px, 30%); - .mixiny(4, 5); -} - -.maxa(@arg1: 10, @arg2: #f00) { - padding: @arg1 * 2px; - color: @arg2; -} - -body { - .maxa(15); -} - -@glob: 5; -.global-mixin(@a:2) { - width: @glob + @a; -} - -.scope-mix { - .global-mixin(3); -} - -.nested-ruleset (@width: 200px) { - width: @width; - .column { margin: @width; } -} -.content { - .nested-ruleset(600px); -} - -// - -.same-var-name2(@radius) { - radius: @radius; -} -.same-var-name(@radius) { - .same-var-name2(@radius); -} -#same-var-name { - .same-var-name(5px); -} - -// - -.var-inside () { - @var: 10px; - width: @var; -} -#var-inside { .var-inside; } -.mix-inner (@var) { - border-width: @var; -} - -.mix (@a: 10) { - .inner { - height: @a * 10; - - .innest { - width: @a; - .mix-inner(@a * 2); - } - } -} - -.class { - .mix(30); -} -.mixin () { - zero: 0; -} -.mixin (@a: 1px) { - one: 1; -} -.mixin (@a) { - one-req: 1; -} -.mixin (@a: 1px, @b: 2px) { - two: 2; -} - -.mixin (@a, @b, @c) { - three-req: 3; -} - -.mixin (@a: 1px, @b: 2px, @c: 3px) { - three: 3; -} - -.zero { - .mixin(); -} - -.one { - .mixin(1); -} - -.two { - .mixin(1, 2); -} - -.three { - .mixin(1, 2, 3); -} - -// - -.mixout ('left') { - left: 1; -} - -.mixout ('right') { - right: 1; -} - -.left { - .mixout('left'); -} -.right { - .mixout('right'); -} - -// - -.border (@side, @width) { - color: black; - .border-side(@side, @width); -} -.border-side (left, @w) { - border-left: @w; -} -.border-side (right, @w) { - border-right: @w; -} - -.border-right { - .border(right, 4px); -} -.border-left { - .border(left, 4px); -} - -// - - -.border-radius (@r) { - both: @r * 10; -} -.border-radius (@r, left) { - left: @r; -} -.border-radius (@r, right) { - right: @r; -} - -.only-right { - .border-radius(33, right); -} -.only-left { - .border-radius(33, left); -} -.left-right { - .border-radius(33); -} -.mixin { border: 1px solid black; } -.mixout { border-color: orange; } -.borders { border-style: dashed; } - -#namespace { - .borders { - border-style: dotted; - } - .biohazard { - content: "death"; - .man { - color: transparent; - } - } -} -#theme { - > .mixin { - background-color: grey; - } -} -#container { - color: black; - .mixin; - .mixout; - #theme > .mixin; -} - -#header { - .milk { - color: white; - .mixin; - #theme > .mixin; - } - #cookie { - .chips { - #namespace .borders; - .calories { - #container; - } - } - .borders; - } -} -.secure-zone { #namespace .biohazard .man; } -.direct { - #namespace > .borders; -} -#operations { - color: #110000 + #000011 + #001100; // #111111 - height: 10px / 2px + 6px - 1px * 2; // 9px - width: 2 * 4 - 5em; // 3em - .spacing { - height: 10px / 2px+6px-1px*2; - width: 2 * 4-5em; - } - substraction: 20 - 10 - 5 - 5; // 0 - division: 20 / 5 / 4; // 1 -} - -@x: 4; -@y: 12em; - -.with-variables { - height: @x + @y; // 16em - width: 12 + @y; // 24em - size: 5cm - @x; // 1cm -} - -@z: -2; - -.negative { - height: 2px + @z; // 0px - width: 2px - @z; // 4px -} - -.shorthands { - padding: -1px 2px 0 -4px; // -} - -.colors { - color: #123; // #112233 - border-color: #234 + #111111; // #334455 - background-color: #222222 - #fff; // #000000 - .other { - color: 2 * #111; // #222222 - border-color: #333333 / 3 + #111; // #222222 - } -} -.parens { - @var: 1px; - border: (@var * 2) solid black; - margin: (@var * 1) (@var + 2) (4 * 4) 3; - width: (6 * 6); - padding: 2px (6px * 6px); -} - -.more-parens { - @var: (2 * 2); - padding: (2 * @var) 4 4 (@var * 1px); - width: (@var * @var) * 6; - height: (7 * 7) + (8 * 8); - margin: 4 * (5 + 5) / 2 - (@var * 2); - //margin: (6 * 6)px; -} - -.nested-parens { - width: 2 * (4 * (2 + (1 + 6))) - 1; - height: ((2+3)*(2+3) / (9-4)) + 1; -} - -.mixed-units { - margin: 2px 4em 1 5pc; - padding: (2px + 4px) 1em 2px 2; -} -#first > .one { - > #second .two > #deux { - width: 50%; - #third { - &:focus { - color: black; - #fifth { - > #sixth { - .seventh #eighth { - + #ninth { - color: purple; - } - } - } - } - } - height: 100%; - } - #fourth, #five, #six { - color: #110000; - .seven, .eight > #nine { - border: 1px solid black; - } - #ten { - color: red; - } - } - } - font-size: 2em; -} -@x: blue; -@z: transparent; -@mix: none; - -.mixin { - @mix: #989; -} - -.tiny-scope { - color: @mix; // #989 - .mixin; -} - -.scope1 { - @y: orange; - @z: black; - color: @x; // blue - border-color: @z; // black - .hidden { - @x: #131313; - } - .scope2 { - @y: red; - color: @x; // blue - .scope3 { - @local: white; - color: @y; // red - border-color: @z; // black - background-color: @local; // white - } - } -}h1, h2, h3 { - a, p { - &:hover { - color: red; - } - } -} - -#all { color: blue; } -#the { color: blue; } -#same { color: blue; } - -ul, li, div, q, blockquote, textarea { - margin: 0; -} - -td { - margin: 0; - padding: 0; -} - -td, input { - line-height: 1em; -} -#strings { - background-image: url("http://son-of-a-banana.com"); - quotes: "~" "~"; - content: "#*%:&^,)!.(~*})"; - empty: ""; - brackets: "{" "}"; -} -#comments { - content: "/* hello */ // not-so-secret"; -} -#single-quote { - quotes: "'" "'"; - content: '""#!&""'; - empty: ''; -} -@a: 2; -@x: @a * @a; -@y: @x + 1; -@z: @x * 2 + @y; - -.variables { - width: @z + 1cm; // 14cm -} - -@b: @a * 10; -@c: #888; - -@fonts: "Trebuchet MS", Verdana, sans-serif; -@f: @fonts; - -@quotes: "~" "~"; -@q: @quotes; - -.variables { - height: @b + @x + 0px; // 24px - color: @c; - font-family: @f; - quotes: @q; -} - -.redefinition { - @var: 4; - @var: 2; - @var: 3; - three: @var; -} - -.values { - @a: 'Trebuchet'; - font-family: @a, @a, @a; -} - - -.whitespace - { color: white; } - -.whitespace -{ - color: white; -} - .whitespace -{ color: white; } - -.whitespace{color:white;} -.whitespace { color : white ; } - -.white, -.space, -.mania -{ color: white; } - -.no-semi-column { color: white } -.no-semi-column { - color: white; - white-space: pre -} -.no-semi-column {border: 2px solid white} -.newlines { - background: the, - great, - wall; - border: 2px - solid - black; -} -.empty { - -} -#yelow { - #short { - color: #fea; - } - #long { - color: #ffeeaa; - } - #rgba { - color: rgba(255, 238, 170, 0.1); - } -} - -#blue { - #short { - color: #00f; - } - #long { - color: #0000ff; - } - #rgba { - color: rgba(0, 0, 255, 0.1); - } -} - -#overflow { - .a { color: #111111 - #444444; } // #000000 - .b { color: #eee + #fff; } // #ffffff - .c { color: #aaa * 3; } // #ffffff - .d { color: #00ee00 + #009900; } // #00ff00 -} - -#grey { - color: rgb(200, 200, 200); -} - -#808080 { - color: hsl(50, 0%, 50%); -} - -#00ff00 { - color: hsl(120, 100%, 50%); -} -/******************\ -* * -* Comment Header * -* * -\******************/ - -/* - - Comment - -*/ - -/* - * Comment Test - * - * - cloudhead (http://cloudhead.net) - * - */ - -//////////////// -@var: "content"; -//////////////// - -/* Colors - * ------ - * #EDF8FC (background blue) - * #166C89 (darkest blue) - * - * Text: - * #333 (standard text) // A comment within a comment! - * #1F9EC9 (standard link) - * - */ - -/* @group Variables -------------------- */ -#comments /* boo */ { - /**/ // An empty comment - color: red; /* A C-style comment */ - background-color: orange; // A little comment - font-size: 12px; - - /* lost comment */ content: @var; - - border: 1px solid black; - - // padding & margin // - padding: 0; - margin: 2em; -} // - -/* commented out - #more-comments { - color: grey; - } -*/ - -#last { color: blue } -// -.comma-delimited { - background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg); - text-shadow: -1px -1px 1px red, 6px 5px 5px yellow; - -moz-box-shadow: 0pt 0pt 2px rgba(255, 255, 255, 0.4) inset, - 0pt 4px 6px rgba(255, 255, 255, 0.4) inset; -} -@font-face { - font-family: Headline; - src: local(Futura-Medium), - url(fonts.svg#MyGeometricModern) format("svg"); -} -.other { - -moz-transform: translate(0, 11em) rotate(-90deg); -} -p:not([class*="lead"]) { - color: black; -} - -input[type="text"].class#id[attr=32]:not(1) { - color: white; -} - -div#id.class[a=1][b=2].class:not(1) { - color: white; -} - -ul.comma > li:not(:only-child)::after { - color: white; -} - -ol.comma > li:nth-last-child(2)::after { - color: white; -} - -li:nth-child(4n+1), -li:nth-child(-5n), -li:nth-child(-n+2) { - color: white; -} - -a[href^="https://"] { - color: black; -} - -a[href$="https://"] { - color: black; -} - -form[data-disabled] { - color: black; -} - -p::before { - color: black; -} -@charset "utf-8"; -div { color: black; } -div { width: 99%; } - -* { - min-width: 45em; -} - -h1, h2 > a > p, h3 { - color: none; -} - -div.class { - color: blue; -} - -div#id { - color: green; -} - -.class#id { - color: purple; -} - -.one.two.three { - color: grey; -} - -@media print { - font-size: 3em; -} - -@media screen { - font-size: 10px; -} - -@font-face { - font-family: 'Garamond Pro'; - src: url("/https/github.com/fonts/garamond-pro.ttf"); -} - -a:hover, a:link { - color: #999; -} - -p, p:first-child { - text-transform: none; -} - -q:lang(no) { - quotes: none; -} - -p + h1 { - font-size: 2.2em; -} - -#shorthands { - border: 1px solid #000; - font: 12px/16px Arial; - margin: 1px 0; - padding: 0 auto; - background: url("http://www.lesscss.org/spec.html") no-repeat 0 4px; -} - -#more-shorthands { - margin: 0; - padding: 1px 0 2px 0; - font: normal small/20px 'Trebuchet MS', Verdana, sans-serif; -} - -.misc { - -moz-border-radius: 2px; - display: -moz-inline-stack; - width: .1em; - background-color: #009998; - background-image: url(images/image.jpg); - background: -webkit-gradient(linear, left top, left bottom, from(red), to(blue)); - margin: ; -} - -#important { - color: red !important; - width: 100%!important; - height: 20px ! important; -} - -#functions { - @var: 10; - color: color("evil red"); // #660000 - width: increment(15); - height: undefined("self"); - border-width: add(2, 3); - variable: increment(@var); -} - -#built-in { - @r: 32; - escaped: e("-Some::weird(#thing, y)"); - lighten: lighten(#ff0000, 50%); - darken: darken(#ff0000, 50%); - saturate: saturate(#29332f, 20%); - desaturate: desaturate(#203c31, 20%); - greyscale: greyscale(#203c31); - format: %("rgb(%d, %d, %d)", @r, 128, 64); - format-string: %("hello %s", "world"); - eformat: e(%("rgb(%d, %d, %d)", @r, 128, 64)); -} - -@var: @a; -@a: 100%; - -.lazy-eval { - width: @var; -} -.mixin (@a: 1px, @b: 50%) { - width: @a * 5; - height: @b - 1%; -} - -.mixina (@style, @width, @color: black) { - border: @width @style @color; -} - -.mixiny -(@a: 0, @b: 0) { - margin: @a; - padding: @b; -} - -.hidden() { - color: transparent; -} - -.two-args { - color: blue; - .mixin(2px, 100%); - .mixina(dotted, 2px); -} - -.one-arg { - .mixin(3px); -} - -.no-parens { - .mixin; -} - -.no-args { - .mixin(); -} - -.var-args { - @var: 9; - .mixin(@var, @var * 2); -} - -.multi-mix { - .mixin(2px, 30%); - .mixiny(4, 5); -} - -.maxa(@arg1: 10, @arg2: #f00) { - padding: @arg1 * 2px; - color: @arg2; -} - -body { - .maxa(15); -} - -@glob: 5; -.global-mixin(@a:2) { - width: @glob + @a; -} - -.scope-mix { - .global-mixin(3); -} - -.nested-ruleset (@width: 200px) { - width: @width; - .column { margin: @width; } -} -.content { - .nested-ruleset(600px); -} - -// - -.same-var-name2(@radius) { - radius: @radius; -} -.same-var-name(@radius) { - .same-var-name2(@radius); -} -#same-var-name { - .same-var-name(5px); -} - -// - -.var-inside () { - @var: 10px; - width: @var; -} -#var-inside { .var-inside; } -.mix-inner (@var) { - border-width: @var; -} - -.mix (@a: 10) { - .inner { - height: @a * 10; - - .innest { - width: @a; - .mix-inner(@a * 2); - } - } -} - -.class { - .mix(30); -} -.mixin () { - zero: 0; -} -.mixin (@a: 1px) { - one: 1; -} -.mixin (@a) { - one-req: 1; -} -.mixin (@a: 1px, @b: 2px) { - two: 2; -} - -.mixin (@a, @b, @c) { - three-req: 3; -} - -.mixin (@a: 1px, @b: 2px, @c: 3px) { - three: 3; -} - -.zero { - .mixin(); -} - -.one { - .mixin(1); -} - -.two { - .mixin(1, 2); -} - -.three { - .mixin(1, 2, 3); -} - -// - -.mixout ('left') { - left: 1; -} diff --git a/node_modules/less-middleware/node_modules/less/benchmark/less-benchmark.js b/node_modules/less-middleware/node_modules/less/benchmark/less-benchmark.js deleted file mode 100644 index 68fe1ad..0000000 --- a/node_modules/less-middleware/node_modules/less/benchmark/less-benchmark.js +++ /dev/null @@ -1,47 +0,0 @@ -var path = require('path'), - fs = require('fs'), - sys = require('util'); - -var less = require('../lib/less'); -var file = path.join(__dirname, 'benchmark.less'); - -if (process.argv[2]) { file = path.join(process.cwd(), process.argv[2]) } - -fs.readFile(file, 'utf8', function (e, data) { - var tree, css, start, end, total; - - sys.puts("Benchmarking...\n", path.basename(file) + " (" + - parseInt(data.length / 1024) + " KB)", ""); - - start = new(Date); - - new(less.Parser)({ optimization: 2 }).parse(data, function (err, tree) { - end = new(Date); - - total = end - start; - - sys.puts("Parsing: " + - total + " ms (" + - parseInt(1000 / total * - data.length / 1024) + " KB\/s)"); - - start = new(Date); - css = tree.toCSS(); - end = new(Date); - - sys.puts("Generation: " + (end - start) + " ms (" + - parseInt(1000 / (end - start) * - data.length / 1024) + " KB\/s)"); - - total += end - start; - - sys.puts("Total: " + total + "ms (" + - parseInt(1000 / total * data.length / 1024) + " KB/s)"); - - if (err) { - less.writeError(err); - process.exit(3); - } - }); -}); - diff --git a/node_modules/less-middleware/node_modules/less/bin/lessc b/node_modules/less-middleware/node_modules/less/bin/lessc deleted file mode 100755 index 31a6700..0000000 --- a/node_modules/less-middleware/node_modules/less/bin/lessc +++ /dev/null @@ -1,190 +0,0 @@ -#!/usr/bin/env node - -var path = require('path'), - fs = require('fs'), - sys = require('util'), - os = require('os'); - -var less = require('../lib/less'); -var args = process.argv.slice(1); -var options = { - compress: false, - yuicompress: false, - optimization: 1, - silent: false, - paths: [], - color: true, - strictImports: false, - rootpath: '', - relativeUrls: false -}; -var continueProcessing = true, - currentErrorcode; - -// calling process.exit does not flush stdout always -// so use this to set the exit code -process.on('exit', function() { process.reallyExit(currentErrorcode) }); - -args = args.filter(function (arg) { - var match; - - if (match = arg.match(/^-I(.+)$/)) { - options.paths.push(match[1]); - return false; - } - - if (match = arg.match(/^--?([a-z][0-9a-z-]*)(?:=([^\s]+))?$/i)) { arg = match[1] } - else { return arg } - - switch (arg) { - case 'v': - case 'version': - sys.puts("lessc " + less.version.join('.') + " (LESS Compiler) [JavaScript]"); - continueProcessing = false; - case 'verbose': - options.verbose = true; - break; - case 's': - case 'silent': - options.silent = true; - break; - case 'strict-imports': - options.strictImports = true; - break; - case 'h': - case 'help': - require('../lib/less/lessc_helper').printUsage(); - continueProcessing = false; - case 'x': - case 'compress': - options.compress = true; - break; - case 'yui-compress': - options.yuicompress = true; - break; - case 'no-color': - options.color = false; - break; - case 'include-path': - if (!match[2]) { - sys.puts("include-path option requires a parameter"); - continueProcessing = false; - } else { - options.paths = match[2].split(os.type().match(/Windows/) ? ';' : ':') - .map(function(p) { - if (p) { - return path.resolve(process.cwd(), p); - } - }); - } - break; - case 'O0': options.optimization = 0; break; - case 'O1': options.optimization = 1; break; - case 'O2': options.optimization = 2; break; - case 'line-numbers': - options.dumpLineNumbers = match[2]; - break; - case 'rp': - case 'rootpath': - if (!match[2]) { - sys.puts("rootpath option requires a parameter"); - continueProcessing = false; - } else { - options.rootpath = path.normalize(match[2] + '/').replace('\\', '/'); - } - break; - case "ru": - case "relative-urls": - options.relativeUrls = true; - break; - } -}); - -if (!continueProcessing) { - return; -} - -var input = args[1]; -if (input && input != '-') { - input = path.resolve(process.cwd(), input); -} -var output = args[2]; -if (output) { - output = path.resolve(process.cwd(), output); -} - -if (! input) { - sys.puts("lessc: no input files"); - sys.puts(""); - require('../lib/less/lessc_helper').printUsage(); - currentErrorcode = 1; - return; -} - -var ensureDirectory = function (filepath) { - var dir = path.dirname(filepath), - existsSync = fs.existsSync || path.existsSync; - if (!existsSync(dir)) { - fs.mkdirSync(dir); - } -}; - -var parseLessFile = function (e, data) { - if (e) { - sys.puts("lessc: " + e.message); - currentErrorcode = 1; - return; - } - - new(less.Parser)({ - paths: [path.dirname(input)].concat(options.paths), - optimization: options.optimization, - filename: input, - rootpath: options.rootpath, - relativeUrls: options.relativeUrls, - strictImports: options.strictImports, - dumpLineNumbers: options.dumpLineNumbers - }).parse(data, function (err, tree) { - if (err) { - less.writeError(err, options); - currentErrorcode = 1; - return; - } else { - try { - var css = tree.toCSS({ - compress: options.compress, - yuicompress: options.yuicompress - }); - if (output) { - ensureDirectory(output); - fs.writeFileSync(output, css, 'utf8'); - if (options.verbose) { - console.log('lessc: wrote ' + output); - } - } else { - sys.print(css); - } - } catch (e) { - less.writeError(e, options); - currentErrorcode = 2; - return; - } - } - }); -}; - -if (input != '-') { - fs.readFile(input, 'utf8', parseLessFile); -} else { - process.stdin.resume(); - process.stdin.setEncoding('utf8'); - - var buffer = ''; - process.stdin.on('data', function(data) { - buffer += data; - }); - - process.stdin.on('end', function() { - parseLessFile(false, buffer); - }); -} diff --git a/node_modules/less-middleware/node_modules/less/build/amd.js b/node_modules/less-middleware/node_modules/less/build/amd.js deleted file mode 100644 index c4b1187..0000000 --- a/node_modules/less-middleware/node_modules/less/build/amd.js +++ /dev/null @@ -1,6 +0,0 @@ -// amd.js -// -// Define Less as an AMD module. -if (typeof define === "function" && define.amd) { - define("less", [], function () { return less; } ); -} diff --git a/node_modules/less-middleware/node_modules/less/build/ecma-5.js b/node_modules/less-middleware/node_modules/less/build/ecma-5.js deleted file mode 100644 index 420bd88..0000000 --- a/node_modules/less-middleware/node_modules/less/build/ecma-5.js +++ /dev/null @@ -1,120 +0,0 @@ - -// ecma-5.js -// -// -- kriskowal Kris Kowal Copyright (C) 2009-2010 MIT License -// -- tlrobinson Tom Robinson -// dantman Daniel Friesen - -// -// Array -// -if (!Array.isArray) { - Array.isArray = function(obj) { - return Object.prototype.toString.call(obj) === "[object Array]" || - (obj instanceof Array); - }; -} -if (!Array.prototype.forEach) { - Array.prototype.forEach = function(block, thisObject) { - var len = this.length >>> 0; - for (var i = 0; i < len; i++) { - if (i in this) { - block.call(thisObject, this[i], i, this); - } - } - }; -} -if (!Array.prototype.map) { - Array.prototype.map = function(fun /*, thisp*/) { - var len = this.length >>> 0; - var res = new Array(len); - var thisp = arguments[1]; - - for (var i = 0; i < len; i++) { - if (i in this) { - res[i] = fun.call(thisp, this[i], i, this); - } - } - return res; - }; -} -if (!Array.prototype.filter) { - Array.prototype.filter = function (block /*, thisp */) { - var values = []; - var thisp = arguments[1]; - for (var i = 0; i < this.length; i++) { - if (block.call(thisp, this[i])) { - values.push(this[i]); - } - } - return values; - }; -} -if (!Array.prototype.reduce) { - Array.prototype.reduce = function(fun /*, initial*/) { - var len = this.length >>> 0; - var i = 0; - - // no value to return if no initial value and an empty array - if (len === 0 && arguments.length === 1) throw new TypeError(); - - if (arguments.length >= 2) { - var rv = arguments[1]; - } else { - do { - if (i in this) { - rv = this[i++]; - break; - } - // if array contains no values, no initial value to return - if (++i >= len) throw new TypeError(); - } while (true); - } - for (; i < len; i++) { - if (i in this) { - rv = fun.call(null, rv, this[i], i, this); - } - } - return rv; - }; -} -if (!Array.prototype.indexOf) { - Array.prototype.indexOf = function (value /*, fromIndex */ ) { - var length = this.length; - var i = arguments[1] || 0; - - if (!length) return -1; - if (i >= length) return -1; - if (i < 0) i += length; - - for (; i < length; i++) { - if (!Object.prototype.hasOwnProperty.call(this, i)) { continue } - if (value === this[i]) return i; - } - return -1; - }; -} - -// -// Object -// -if (!Object.keys) { - Object.keys = function (object) { - var keys = []; - for (var name in object) { - if (Object.prototype.hasOwnProperty.call(object, name)) { - keys.push(name); - } - } - return keys; - }; -} - -// -// String -// -if (!String.prototype.trim) { - String.prototype.trim = function () { - return String(this).replace(/^\s\s*/, '').replace(/\s\s*$/, ''); - }; -} diff --git a/node_modules/less-middleware/node_modules/less/build/header.js b/node_modules/less-middleware/node_modules/less/build/header.js deleted file mode 100644 index c491d92..0000000 --- a/node_modules/less-middleware/node_modules/less/build/header.js +++ /dev/null @@ -1,7 +0,0 @@ -// -// LESS - Leaner CSS v@VERSION -// http://lesscss.org -// -// Copyright (c) 2009-2011, Alexis Sellier -// Licensed under the Apache 2.0 License. -// diff --git a/node_modules/less-middleware/node_modules/less/build/require-rhino.js b/node_modules/less-middleware/node_modules/less/build/require-rhino.js deleted file mode 100644 index 02bc83c..0000000 --- a/node_modules/less-middleware/node_modules/less/build/require-rhino.js +++ /dev/null @@ -1,7 +0,0 @@ -// -// Stub out `require` in rhino -// -function require(arg) { - return less[arg.split('/')[1]]; -}; - diff --git a/node_modules/less-middleware/node_modules/less/build/require.js b/node_modules/less-middleware/node_modules/less/build/require.js deleted file mode 100644 index 4d5b172..0000000 --- a/node_modules/less-middleware/node_modules/less/build/require.js +++ /dev/null @@ -1,7 +0,0 @@ -// -// Stub out `require` in the browser -// -function require(arg) { - return window.less[arg.split('/')[1]]; -}; - diff --git a/node_modules/less-middleware/node_modules/less/lib/less/browser.js b/node_modules/less-middleware/node_modules/less/lib/less/browser.js deleted file mode 100644 index e00ff27..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/browser.js +++ /dev/null @@ -1,519 +0,0 @@ -// -// browser.js - client-side engine -// - -var isFileProtocol = /^(file|chrome(-extension)?|resource|qrc|app):/.test(location.protocol); - -less.env = less.env || (location.hostname == '127.0.0.1' || - location.hostname == '0.0.0.0' || - location.hostname == 'localhost' || - location.port.length > 0 || - isFileProtocol ? 'development' - : 'production'); - -// Load styles asynchronously (default: false) -// -// This is set to `false` by default, so that the body -// doesn't start loading before the stylesheets are parsed. -// Setting this to `true` can result in flickering. -// -less.async = less.async || false; -less.fileAsync = less.fileAsync || false; - -// Interval between watch polls -less.poll = less.poll || (isFileProtocol ? 1000 : 1500); - -//Setup user functions -if (less.functions) { - for(var func in less.functions) { - less.tree.functions[func] = less.functions[func]; - } -} - -var dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(location.hash); -if (dumpLineNumbers) { - less.dumpLineNumbers = dumpLineNumbers[1]; -} - -// -// Watch mode -// -less.watch = function () { - if (!less.watchMode ){ - less.env = 'development'; - initRunningMode(); - } - return this.watchMode = true -}; - -less.unwatch = function () {clearInterval(less.watchTimer); return this.watchMode = false; }; - -function initRunningMode(){ - if (less.env === 'development') { - less.optimization = 0; - less.watchTimer = setInterval(function () { - if (less.watchMode) { - loadStyleSheets(function (e, root, _, sheet, env) { - if (root) { - createCSS(root.toCSS(), sheet, env.lastModified); - } - }); - } - }, less.poll); - } else { - less.optimization = 3; - } -} - -if (/!watch/.test(location.hash)) { - less.watch(); -} - -var cache = null; - -if (less.env != 'development') { - try { - cache = (typeof(window.localStorage) === 'undefined') ? null : window.localStorage; - } catch (_) {} -} - -// -// Get all tags with the 'rel' attribute set to "stylesheet/less" -// -var links = document.getElementsByTagName('link'); -var typePattern = /^text\/(x-)?less$/; - -less.sheets = []; - -for (var i = 0; i < links.length; i++) { - if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) && - (links[i].type.match(typePattern)))) { - less.sheets.push(links[i]); - } -} - -// -// With this function, it's possible to alter variables and re-render -// CSS without reloading less-files -// -var session_cache = ''; -less.modifyVars = function(record) { - var str = session_cache; - for (name in record) { - str += ((name.slice(0,1) === '@')? '' : '@') + name +': '+ - ((record[name].slice(-1) === ';')? record[name] : record[name] +';'); - } - new(less.Parser)().parse(str, function (e, root) { - createCSS(root.toCSS(), less.sheets[less.sheets.length - 1]); - }); -}; - -less.refresh = function (reload) { - var startTime, endTime; - startTime = endTime = new(Date); - - loadStyleSheets(function (e, root, _, sheet, env) { - if (env.local) { - log("loading " + sheet.href + " from cache."); - } else { - log("parsed " + sheet.href + " successfully."); - createCSS(root.toCSS(), sheet, env.lastModified); - } - log("css for " + sheet.href + " generated in " + (new(Date) - endTime) + 'ms'); - (env.remaining === 0) && log("css generated in " + (new(Date) - startTime) + 'ms'); - endTime = new(Date); - }, reload); - - loadStyles(); -}; -less.refreshStyles = loadStyles; - -less.refresh(less.env === 'development'); - -function loadStyles() { - var styles = document.getElementsByTagName('style'); - for (var i = 0; i < styles.length; i++) { - if (styles[i].type.match(typePattern)) { - new(less.Parser)({ - filename: document.location.href.replace(/#.*$/, ''), - dumpLineNumbers: less.dumpLineNumbers - }).parse(styles[i].innerHTML || '', function (e, tree) { - var css = tree.toCSS(); - var style = styles[i]; - style.type = 'text/css'; - if (style.styleSheet) { - style.styleSheet.cssText = css; - } else { - style.innerHTML = css; - } - }); - } - } -} - -function loadStyleSheets(callback, reload) { - for (var i = 0; i < less.sheets.length; i++) { - loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1)); - } -} - -function pathDiff(url, baseUrl) { - // diff between two paths to create a relative path - - var urlParts = extractUrlParts(url), - baseUrlParts = extractUrlParts(baseUrl), - i, max, urlDirectories, baseUrlDirectories, diff = ""; - if (urlParts.hostPart !== baseUrlParts.hostPart) { - return ""; - } - max = Math.max(baseUrlParts.directories.length, urlParts.directories.length); - for(i = 0; i < max; i++) { - if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; } - } - baseUrlDirectories = baseUrlParts.directories.slice(i); - urlDirectories = urlParts.directories.slice(i); - for(i = 0; i < baseUrlDirectories.length-1; i++) { - diff += "../"; - } - for(i = 0; i < urlDirectories.length-1; i++) { - diff += urlDirectories[i] + "/"; - } - return diff; -} - -function extractUrlParts(url, baseUrl) { - // urlParts[1] = protocol&hostname || / - // urlParts[2] = / if path relative to host base - // urlParts[3] = directories - // urlParts[4] = filename - // urlParts[5] = parameters - - var urlPartsRegex = /^((?:[a-z-]+:)?\/\/(?:[^\/\?#]+\/)|([\/\\]))?((?:[^\/\\\?#]+[\/\\])*)([^\/\\\?#]*)([#\?].*)?$/, - urlParts = url.match(urlPartsRegex), - returner = {}, directories = [], i, baseUrlParts; - - if (!urlParts) { - throw new Error("Could not parse sheet href - '"+url+"'"); - } - - // Stylesheets in IE don't always return the full path - if (!urlParts[1] || urlParts[2]) { - baseUrlParts = baseUrl.match(urlPartsRegex); - if (!baseUrlParts) { - throw new Error("Could not parse page url - '"+baseUrl+"'"); - } - urlParts[1] = baseUrlParts[1]; - if (!urlParts[2]) { - urlParts[3] = baseUrlParts[3] + urlParts[3]; - } - } - - if (urlParts[3]) { - directories = urlParts[3].replace("\\", "/").split("/"); - - for(i = 0; i < directories.length; i++) { - if (directories[i] === ".." && i > 0) { - directories.splice(i-1, 2); - i -= 2; - } - } - } - - returner.hostPart = urlParts[1]; - returner.directories = directories; - returner.path = urlParts[1] + directories.join("/"); - returner.fileUrl = returner.path + (urlParts[4] || ""); - returner.url = returner.fileUrl + (urlParts[5] || ""); - return returner; -} - -function loadStyleSheet(sheet, callback, reload, remaining) { - // sheet may be set to the stylesheet for the initial load or a collection of properties including - // some env variables for imports - var contents = sheet.contents || {}; - var files = sheet.files || {}; - var hrefParts = extractUrlParts(sheet.href, window.location.href); - var href = hrefParts.url; - var css = cache && cache.getItem(href); - var timestamp = cache && cache.getItem(href + ':timestamp'); - var styles = { css: css, timestamp: timestamp }; - var rootpath; - - if (less.relativeUrls) { - if (less.rootpath) { - if (sheet.entryPath) { - rootpath = extractUrlParts(less.rootpath + pathDiff(hrefParts.path, sheet.entryPath)).path; - } else { - rootpath = less.rootpath; - } - } else { - rootpath = hrefParts.path; - } - } else { - if (less.rootpath) { - rootpath = less.rootpath; - } else { - if (sheet.entryPath) { - rootpath = sheet.entryPath; - } else { - rootpath = hrefParts.path; - } - } - } - - xhr(href, sheet.type, function (data, lastModified) { - // Store data this session - session_cache += data.replace(/@import .+?;/ig, ''); - - if (!reload && styles && lastModified && - (new(Date)(lastModified).valueOf() === - new(Date)(styles.timestamp).valueOf())) { - // Use local copy - createCSS(styles.css, sheet); - callback(null, null, data, sheet, { local: true, remaining: remaining }, href); - } else { - // Use remote copy (re-parse) - try { - contents[href] = data; // Updating top importing parser content cache - new(less.Parser)({ - optimization: less.optimization, - paths: [hrefParts.path], - entryPath: sheet.entryPath || hrefParts.path, - mime: sheet.type, - filename: href, - rootpath: rootpath, - relativeUrls: sheet.relativeUrls, - contents: contents, // Passing top importing parser content cache ref down. - files: files, - dumpLineNumbers: less.dumpLineNumbers - }).parse(data, function (e, root) { - if (e) { return error(e, href) } - try { - callback(e, root, data, sheet, { local: false, lastModified: lastModified, remaining: remaining }, href); - removeNode(document.getElementById('less-error-message:' + extractId(href))); - } catch (e) { - error(e, href); - } - }); - } catch (e) { - error(e, href); - } - } - }, function (status, url) { - throw new(Error)("Couldn't load " + url + " (" + status + ")"); - }); -} - -function extractId(href) { - return href.replace(/^[a-z]+:\/\/?[^\/]+/, '' ) // Remove protocol & domain - .replace(/^\//, '' ) // Remove root / - .replace(/\.[a-zA-Z]+$/, '' ) // Remove simple extension - .replace(/[^\.\w-]+/g, '-') // Replace illegal characters - .replace(/\./g, ':'); // Replace dots with colons(for valid id) -} - -function createCSS(styles, sheet, lastModified) { - var css; - - // Strip the query-string - var href = sheet.href || ''; - - // If there is no title set, use the filename, minus the extension - var id = 'less:' + (sheet.title || extractId(href)); - - // If the stylesheet doesn't exist, create a new node - if ((css = document.getElementById(id)) === null) { - css = document.createElement('style'); - css.type = 'text/css'; - if( sheet.media ){ css.media = sheet.media; } - css.id = id; - var nextEl = sheet && sheet.nextSibling || null; - (nextEl || document.getElementsByTagName('head')[0]).parentNode.insertBefore(css, nextEl); - } - - if (css.styleSheet) { // IE - try { - css.styleSheet.cssText = styles; - } catch (e) { - throw new(Error)("Couldn't reassign styleSheet.cssText."); - } - } else { - (function (node) { - if (css.childNodes.length > 0) { - if (css.firstChild.nodeValue !== node.nodeValue) { - css.replaceChild(node, css.firstChild); - } - } else { - css.appendChild(node); - } - })(document.createTextNode(styles)); - } - - // Don't update the local store if the file wasn't modified - if (lastModified && cache) { - log('saving ' + href + ' to cache.'); - try { - cache.setItem(href, styles); - cache.setItem(href + ':timestamp', lastModified); - } catch(e) { - //TODO - could do with adding more robust error handling - log('failed to save'); - } - } -} - -function xhr(url, type, callback, errback) { - var xhr = getXMLHttpRequest(); - var async = isFileProtocol ? less.fileAsync : less.async; - - if (typeof(xhr.overrideMimeType) === 'function') { - xhr.overrideMimeType('text/css'); - } - xhr.open('GET', url, async); - xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5'); - xhr.send(null); - - if (isFileProtocol && !less.fileAsync) { - if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) { - callback(xhr.responseText); - } else { - errback(xhr.status, url); - } - } else if (async) { - xhr.onreadystatechange = function () { - if (xhr.readyState == 4) { - handleResponse(xhr, callback, errback); - } - }; - } else { - handleResponse(xhr, callback, errback); - } - - function handleResponse(xhr, callback, errback) { - if (xhr.status >= 200 && xhr.status < 300) { - callback(xhr.responseText, - xhr.getResponseHeader("Last-Modified")); - } else if (typeof(errback) === 'function') { - errback(xhr.status, url); - } - } -} - -function getXMLHttpRequest() { - if (window.XMLHttpRequest) { - return new(XMLHttpRequest); - } else { - try { - return new(ActiveXObject)("MSXML2.XMLHTTP.3.0"); - } catch (e) { - log("browser doesn't support AJAX."); - return null; - } - } -} - -function removeNode(node) { - return node && node.parentNode.removeChild(node); -} - -function log(str) { - if (less.env == 'development' && typeof(console) !== "undefined") { console.log('less: ' + str) } -} - -function error(e, href) { - var id = 'less-error-message:' + extractId(href); - var template = '
    5. {content}
    6. '; - var elem = document.createElement('div'), timer, content, error = []; - var filename = e.filename || href; - var filenameNoPath = filename.match(/([^\/]+(\?.*)?)$/)[1]; - - elem.id = id; - elem.className = "less-error-message"; - - content = '

      ' + (e.message || 'There is an error in your .less file') + - '

      ' + '

      in ' + filenameNoPath + " "; - - var errorline = function (e, i, classname) { - if (e.extract[i]) { - error.push(template.replace(/\{line\}/, parseInt(e.line) + (i - 1)) - .replace(/\{class\}/, classname) - .replace(/\{content\}/, e.extract[i])); - } - }; - - if (e.stack) { - content += '
      ' + e.stack.split('\n').slice(1).join('
      '); - } else if (e.extract) { - errorline(e, 0, ''); - errorline(e, 1, 'line'); - errorline(e, 2, ''); - content += 'on line ' + e.line + ', column ' + (e.column + 1) + ':

      ' + - '
        ' + error.join('') + '
      '; - } - elem.innerHTML = content; - - // CSS for error messages - createCSS([ - '.less-error-message ul, .less-error-message li {', - 'list-style-type: none;', - 'margin-right: 15px;', - 'padding: 4px 0;', - 'margin: 0;', - '}', - '.less-error-message label {', - 'font-size: 12px;', - 'margin-right: 15px;', - 'padding: 4px 0;', - 'color: #cc7777;', - '}', - '.less-error-message pre {', - 'color: #dd6666;', - 'padding: 4px 0;', - 'margin: 0;', - 'display: inline-block;', - '}', - '.less-error-message pre.line {', - 'color: #ff0000;', - '}', - '.less-error-message h3 {', - 'font-size: 20px;', - 'font-weight: bold;', - 'padding: 15px 0 5px 0;', - 'margin: 0;', - '}', - '.less-error-message a {', - 'color: #10a', - '}', - '.less-error-message .error {', - 'color: red;', - 'font-weight: bold;', - 'padding-bottom: 2px;', - 'border-bottom: 1px dashed red;', - '}' - ].join('\n'), { title: 'error-message' }); - - elem.style.cssText = [ - "font-family: Arial, sans-serif", - "border: 1px solid #e00", - "background-color: #eee", - "border-radius: 5px", - "-webkit-border-radius: 5px", - "-moz-border-radius: 5px", - "color: #e00", - "padding: 15px", - "margin-bottom: 15px" - ].join(';'); - - if (less.env == 'development') { - timer = setInterval(function () { - if (document.body) { - if (document.getElementById(id)) { - document.body.replaceChild(elem, document.getElementById(id)); - } else { - document.body.insertBefore(elem, document.body.firstChild); - } - clearInterval(timer); - } - }, 10); - } -} diff --git a/node_modules/less-middleware/node_modules/less/lib/less/colors.js b/node_modules/less-middleware/node_modules/less/lib/less/colors.js deleted file mode 100644 index b417af6..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/colors.js +++ /dev/null @@ -1,152 +0,0 @@ -(function (tree) { - tree.colors = { - 'aliceblue':'#f0f8ff', - 'antiquewhite':'#faebd7', - 'aqua':'#00ffff', - 'aquamarine':'#7fffd4', - 'azure':'#f0ffff', - 'beige':'#f5f5dc', - 'bisque':'#ffe4c4', - 'black':'#000000', - 'blanchedalmond':'#ffebcd', - 'blue':'#0000ff', - 'blueviolet':'#8a2be2', - 'brown':'#a52a2a', - 'burlywood':'#deb887', - 'cadetblue':'#5f9ea0', - 'chartreuse':'#7fff00', - 'chocolate':'#d2691e', - 'coral':'#ff7f50', - 'cornflowerblue':'#6495ed', - 'cornsilk':'#fff8dc', - 'crimson':'#dc143c', - 'cyan':'#00ffff', - 'darkblue':'#00008b', - 'darkcyan':'#008b8b', - 'darkgoldenrod':'#b8860b', - 'darkgray':'#a9a9a9', - 'darkgrey':'#a9a9a9', - 'darkgreen':'#006400', - 'darkkhaki':'#bdb76b', - 'darkmagenta':'#8b008b', - 'darkolivegreen':'#556b2f', - 'darkorange':'#ff8c00', - 'darkorchid':'#9932cc', - 'darkred':'#8b0000', - 'darksalmon':'#e9967a', - 'darkseagreen':'#8fbc8f', - 'darkslateblue':'#483d8b', - 'darkslategray':'#2f4f4f', - 'darkslategrey':'#2f4f4f', - 'darkturquoise':'#00ced1', - 'darkviolet':'#9400d3', - 'deeppink':'#ff1493', - 'deepskyblue':'#00bfff', - 'dimgray':'#696969', - 'dimgrey':'#696969', - 'dodgerblue':'#1e90ff', - 'firebrick':'#b22222', - 'floralwhite':'#fffaf0', - 'forestgreen':'#228b22', - 'fuchsia':'#ff00ff', - 'gainsboro':'#dcdcdc', - 'ghostwhite':'#f8f8ff', - 'gold':'#ffd700', - 'goldenrod':'#daa520', - 'gray':'#808080', - 'grey':'#808080', - 'green':'#008000', - 'greenyellow':'#adff2f', - 'honeydew':'#f0fff0', - 'hotpink':'#ff69b4', - 'indianred':'#cd5c5c', - 'indigo':'#4b0082', - 'ivory':'#fffff0', - 'khaki':'#f0e68c', - 'lavender':'#e6e6fa', - 'lavenderblush':'#fff0f5', - 'lawngreen':'#7cfc00', - 'lemonchiffon':'#fffacd', - 'lightblue':'#add8e6', - 'lightcoral':'#f08080', - 'lightcyan':'#e0ffff', - 'lightgoldenrodyellow':'#fafad2', - 'lightgray':'#d3d3d3', - 'lightgrey':'#d3d3d3', - 'lightgreen':'#90ee90', - 'lightpink':'#ffb6c1', - 'lightsalmon':'#ffa07a', - 'lightseagreen':'#20b2aa', - 'lightskyblue':'#87cefa', - 'lightslategray':'#778899', - 'lightslategrey':'#778899', - 'lightsteelblue':'#b0c4de', - 'lightyellow':'#ffffe0', - 'lime':'#00ff00', - 'limegreen':'#32cd32', - 'linen':'#faf0e6', - 'magenta':'#ff00ff', - 'maroon':'#800000', - 'mediumaquamarine':'#66cdaa', - 'mediumblue':'#0000cd', - 'mediumorchid':'#ba55d3', - 'mediumpurple':'#9370d8', - 'mediumseagreen':'#3cb371', - 'mediumslateblue':'#7b68ee', - 'mediumspringgreen':'#00fa9a', - 'mediumturquoise':'#48d1cc', - 'mediumvioletred':'#c71585', - 'midnightblue':'#191970', - 'mintcream':'#f5fffa', - 'mistyrose':'#ffe4e1', - 'moccasin':'#ffe4b5', - 'navajowhite':'#ffdead', - 'navy':'#000080', - 'oldlace':'#fdf5e6', - 'olive':'#808000', - 'olivedrab':'#6b8e23', - 'orange':'#ffa500', - 'orangered':'#ff4500', - 'orchid':'#da70d6', - 'palegoldenrod':'#eee8aa', - 'palegreen':'#98fb98', - 'paleturquoise':'#afeeee', - 'palevioletred':'#d87093', - 'papayawhip':'#ffefd5', - 'peachpuff':'#ffdab9', - 'peru':'#cd853f', - 'pink':'#ffc0cb', - 'plum':'#dda0dd', - 'powderblue':'#b0e0e6', - 'purple':'#800080', - 'red':'#ff0000', - 'rosybrown':'#bc8f8f', - 'royalblue':'#4169e1', - 'saddlebrown':'#8b4513', - 'salmon':'#fa8072', - 'sandybrown':'#f4a460', - 'seagreen':'#2e8b57', - 'seashell':'#fff5ee', - 'sienna':'#a0522d', - 'silver':'#c0c0c0', - 'skyblue':'#87ceeb', - 'slateblue':'#6a5acd', - 'slategray':'#708090', - 'slategrey':'#708090', - 'snow':'#fffafa', - 'springgreen':'#00ff7f', - 'steelblue':'#4682b4', - 'tan':'#d2b48c', - 'teal':'#008080', - 'thistle':'#d8bfd8', - 'tomato':'#ff6347', - // 'transparent':'rgba(0,0,0,0)', - 'turquoise':'#40e0d0', - 'violet':'#ee82ee', - 'wheat':'#f5deb3', - 'white':'#ffffff', - 'whitesmoke':'#f5f5f5', - 'yellow':'#ffff00', - 'yellowgreen':'#9acd32' - }; -})(require('./tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/functions.js b/node_modules/less-middleware/node_modules/less/lib/less/functions.js deleted file mode 100644 index b077123..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/functions.js +++ /dev/null @@ -1,377 +0,0 @@ -(function (tree) { - -tree.functions = { - rgb: function (r, g, b) { - return this.rgba(r, g, b, 1.0); - }, - rgba: function (r, g, b, a) { - var rgb = [r, g, b].map(function (c) { return scaled(c, 256); }); - a = number(a); - return new(tree.Color)(rgb, a); - }, - hsl: function (h, s, l) { - return this.hsla(h, s, l, 1.0); - }, - hsla: function (h, s, l, a) { - h = (number(h) % 360) / 360; - s = number(s); l = number(l); a = number(a); - - var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; - var m1 = l * 2 - m2; - - return this.rgba(hue(h + 1/3) * 255, - hue(h) * 255, - hue(h - 1/3) * 255, - a); - - function hue(h) { - h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h); - if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; - else if (h * 2 < 1) return m2; - else if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; - else return m1; - } - }, - - hsv: function(h, s, v) { - return this.hsva(h, s, v, 1.0); - }, - - hsva: function(h, s, v, a) { - h = ((number(h) % 360) / 360) * 360; - s = number(s); v = number(v); a = number(a); - - var i, f; - i = Math.floor((h / 60) % 6); - f = (h / 60) - i; - - var vs = [v, - v * (1 - s), - v * (1 - f * s), - v * (1 - (1 - f) * s)]; - var perm = [[0, 3, 1], - [2, 0, 1], - [1, 0, 3], - [1, 2, 0], - [3, 1, 0], - [0, 1, 2]]; - - return this.rgba(vs[perm[i][0]] * 255, - vs[perm[i][1]] * 255, - vs[perm[i][2]] * 255, - a); - }, - - hue: function (color) { - return new(tree.Dimension)(Math.round(color.toHSL().h)); - }, - saturation: function (color) { - return new(tree.Dimension)(Math.round(color.toHSL().s * 100), '%'); - }, - lightness: function (color) { - return new(tree.Dimension)(Math.round(color.toHSL().l * 100), '%'); - }, - red: function (color) { - return new(tree.Dimension)(color.rgb[0]); - }, - green: function (color) { - return new(tree.Dimension)(color.rgb[1]); - }, - blue: function (color) { - return new(tree.Dimension)(color.rgb[2]); - }, - alpha: function (color) { - return new(tree.Dimension)(color.toHSL().a); - }, - luma: function (color) { - return new(tree.Dimension)(Math.round((0.2126 * (color.rgb[0]/255) + - 0.7152 * (color.rgb[1]/255) + - 0.0722 * (color.rgb[2]/255)) * - color.alpha * 100), '%'); - }, - saturate: function (color, amount) { - var hsl = color.toHSL(); - - hsl.s += amount.value / 100; - hsl.s = clamp(hsl.s); - return hsla(hsl); - }, - desaturate: function (color, amount) { - var hsl = color.toHSL(); - - hsl.s -= amount.value / 100; - hsl.s = clamp(hsl.s); - return hsla(hsl); - }, - lighten: function (color, amount) { - var hsl = color.toHSL(); - - hsl.l += amount.value / 100; - hsl.l = clamp(hsl.l); - return hsla(hsl); - }, - darken: function (color, amount) { - var hsl = color.toHSL(); - - hsl.l -= amount.value / 100; - hsl.l = clamp(hsl.l); - return hsla(hsl); - }, - fadein: function (color, amount) { - var hsl = color.toHSL(); - - hsl.a += amount.value / 100; - hsl.a = clamp(hsl.a); - return hsla(hsl); - }, - fadeout: function (color, amount) { - var hsl = color.toHSL(); - - hsl.a -= amount.value / 100; - hsl.a = clamp(hsl.a); - return hsla(hsl); - }, - fade: function (color, amount) { - var hsl = color.toHSL(); - - hsl.a = amount.value / 100; - hsl.a = clamp(hsl.a); - return hsla(hsl); - }, - spin: function (color, amount) { - var hsl = color.toHSL(); - var hue = (hsl.h + amount.value) % 360; - - hsl.h = hue < 0 ? 360 + hue : hue; - - return hsla(hsl); - }, - // - // Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein - // http://sass-lang.com - // - mix: function (color1, color2, weight) { - if (!weight) { - weight = new(tree.Dimension)(50); - } - var p = weight.value / 100.0; - var w = p * 2 - 1; - var a = color1.toHSL().a - color2.toHSL().a; - - var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; - var w2 = 1 - w1; - - var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2, - color1.rgb[1] * w1 + color2.rgb[1] * w2, - color1.rgb[2] * w1 + color2.rgb[2] * w2]; - - var alpha = color1.alpha * p + color2.alpha * (1 - p); - - return new(tree.Color)(rgb, alpha); - }, - greyscale: function (color) { - return this.desaturate(color, new(tree.Dimension)(100)); - }, - contrast: function (color, dark, light, threshold) { - // filter: contrast(3.2); - // should be kept as is, so check for color - if (!color.rgb) { - return null; - } - if (typeof light === 'undefined') { - light = this.rgba(255, 255, 255, 1.0); - } - if (typeof dark === 'undefined') { - dark = this.rgba(0, 0, 0, 1.0); - } - if (typeof threshold === 'undefined') { - threshold = 0.43; - } else { - threshold = threshold.value; - } - if (((0.2126 * (color.rgb[0]/255) + 0.7152 * (color.rgb[1]/255) + 0.0722 * (color.rgb[2]/255)) * color.alpha) < threshold) { - return light; - } else { - return dark; - } - }, - e: function (str) { - return new(tree.Anonymous)(str instanceof tree.JavaScript ? str.evaluated : str); - }, - escape: function (str) { - return new(tree.Anonymous)(encodeURI(str.value).replace(/=/g, "%3D").replace(/:/g, "%3A").replace(/#/g, "%23").replace(/;/g, "%3B").replace(/\(/g, "%28").replace(/\)/g, "%29")); - }, - '%': function (quoted /* arg, arg, ...*/) { - var args = Array.prototype.slice.call(arguments, 1), - str = quoted.value; - - for (var i = 0; i < args.length; i++) { - str = str.replace(/%[sda]/i, function(token) { - var value = token.match(/s/i) ? args[i].value : args[i].toCSS(); - return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value; - }); - } - str = str.replace(/%%/g, '%'); - return new(tree.Quoted)('"' + str + '"', str); - }, - unit: function (val, unit) { - return new(tree.Dimension)(val.value, unit ? unit.toCSS() : ""); - }, - round: function (n, f) { - var fraction = typeof(f) === "undefined" ? 0 : f.value; - return this._math(function(num) { return num.toFixed(fraction); }, n); - }, - ceil: function (n) { - return this._math(Math.ceil, n); - }, - floor: function (n) { - return this._math(Math.floor, n); - }, - _math: function (fn, n) { - if (n instanceof tree.Dimension) { - return new(tree.Dimension)(fn(parseFloat(n.value)), n.unit); - } else if (typeof(n) === 'number') { - return fn(n); - } else { - throw { type: "Argument", message: "argument must be a number" }; - } - }, - argb: function (color) { - return new(tree.Anonymous)(color.toARGB()); - - }, - percentage: function (n) { - return new(tree.Dimension)(n.value * 100, '%'); - }, - color: function (n) { - if (n instanceof tree.Quoted) { - return new(tree.Color)(n.value.slice(1)); - } else { - throw { type: "Argument", message: "argument must be a string" }; - } - }, - iscolor: function (n) { - return this._isa(n, tree.Color); - }, - isnumber: function (n) { - return this._isa(n, tree.Dimension); - }, - isstring: function (n) { - return this._isa(n, tree.Quoted); - }, - iskeyword: function (n) { - return this._isa(n, tree.Keyword); - }, - isurl: function (n) { - return this._isa(n, tree.URL); - }, - ispixel: function (n) { - return (n instanceof tree.Dimension) && n.unit === 'px' ? tree.True : tree.False; - }, - ispercentage: function (n) { - return (n instanceof tree.Dimension) && n.unit === '%' ? tree.True : tree.False; - }, - isem: function (n) { - return (n instanceof tree.Dimension) && n.unit === 'em' ? tree.True : tree.False; - }, - _isa: function (n, Type) { - return (n instanceof Type) ? tree.True : tree.False; - }, - - /* Blending modes */ - - multiply: function(color1, color2) { - var r = color1.rgb[0] * color2.rgb[0] / 255; - var g = color1.rgb[1] * color2.rgb[1] / 255; - var b = color1.rgb[2] * color2.rgb[2] / 255; - return this.rgb(r, g, b); - }, - screen: function(color1, color2) { - var r = 255 - (255 - color1.rgb[0]) * (255 - color2.rgb[0]) / 255; - var g = 255 - (255 - color1.rgb[1]) * (255 - color2.rgb[1]) / 255; - var b = 255 - (255 - color1.rgb[2]) * (255 - color2.rgb[2]) / 255; - return this.rgb(r, g, b); - }, - overlay: function(color1, color2) { - var r = color1.rgb[0] < 128 ? 2 * color1.rgb[0] * color2.rgb[0] / 255 : 255 - 2 * (255 - color1.rgb[0]) * (255 - color2.rgb[0]) / 255; - var g = color1.rgb[1] < 128 ? 2 * color1.rgb[1] * color2.rgb[1] / 255 : 255 - 2 * (255 - color1.rgb[1]) * (255 - color2.rgb[1]) / 255; - var b = color1.rgb[2] < 128 ? 2 * color1.rgb[2] * color2.rgb[2] / 255 : 255 - 2 * (255 - color1.rgb[2]) * (255 - color2.rgb[2]) / 255; - return this.rgb(r, g, b); - }, - softlight: function(color1, color2) { - var t = color2.rgb[0] * color1.rgb[0] / 255; - var r = t + color1.rgb[0] * (255 - (255 - color1.rgb[0]) * (255 - color2.rgb[0]) / 255 - t) / 255; - t = color2.rgb[1] * color1.rgb[1] / 255; - var g = t + color1.rgb[1] * (255 - (255 - color1.rgb[1]) * (255 - color2.rgb[1]) / 255 - t) / 255; - t = color2.rgb[2] * color1.rgb[2] / 255; - var b = t + color1.rgb[2] * (255 - (255 - color1.rgb[2]) * (255 - color2.rgb[2]) / 255 - t) / 255; - return this.rgb(r, g, b); - }, - hardlight: function(color1, color2) { - var r = color2.rgb[0] < 128 ? 2 * color2.rgb[0] * color1.rgb[0] / 255 : 255 - 2 * (255 - color2.rgb[0]) * (255 - color1.rgb[0]) / 255; - var g = color2.rgb[1] < 128 ? 2 * color2.rgb[1] * color1.rgb[1] / 255 : 255 - 2 * (255 - color2.rgb[1]) * (255 - color1.rgb[1]) / 255; - var b = color2.rgb[2] < 128 ? 2 * color2.rgb[2] * color1.rgb[2] / 255 : 255 - 2 * (255 - color2.rgb[2]) * (255 - color1.rgb[2]) / 255; - return this.rgb(r, g, b); - }, - difference: function(color1, color2) { - var r = Math.abs(color1.rgb[0] - color2.rgb[0]); - var g = Math.abs(color1.rgb[1] - color2.rgb[1]); - var b = Math.abs(color1.rgb[2] - color2.rgb[2]); - return this.rgb(r, g, b); - }, - exclusion: function(color1, color2) { - var r = color1.rgb[0] + color2.rgb[0] * (255 - color1.rgb[0] - color1.rgb[0]) / 255; - var g = color1.rgb[1] + color2.rgb[1] * (255 - color1.rgb[1] - color1.rgb[1]) / 255; - var b = color1.rgb[2] + color2.rgb[2] * (255 - color1.rgb[2] - color1.rgb[2]) / 255; - return this.rgb(r, g, b); - }, - average: function(color1, color2) { - var r = (color1.rgb[0] + color2.rgb[0]) / 2; - var g = (color1.rgb[1] + color2.rgb[1]) / 2; - var b = (color1.rgb[2] + color2.rgb[2]) / 2; - return this.rgb(r, g, b); - }, - negation: function(color1, color2) { - var r = 255 - Math.abs(255 - color2.rgb[0] - color1.rgb[0]); - var g = 255 - Math.abs(255 - color2.rgb[1] - color1.rgb[1]); - var b = 255 - Math.abs(255 - color2.rgb[2] - color1.rgb[2]); - return this.rgb(r, g, b); - }, - tint: function(color, amount) { - return this.mix(this.rgb(255,255,255), color, amount); - }, - shade: function(color, amount) { - return this.mix(this.rgb(0, 0, 0), color, amount); - } -}; - -function hsla(color) { - return tree.functions.hsla(color.h, color.s, color.l, color.a); -} - -function scaled(n, size) { - if (n instanceof tree.Dimension && n.unit == '%') { - return parseFloat(n.value * size / 100); - } else { - return number(n); - } -} - -function number(n) { - if (n instanceof tree.Dimension) { - return parseFloat(n.unit == '%' ? n.value / 100 : n.value); - } else if (typeof(n) === 'number') { - return n; - } else { - throw { - error: "RuntimeError", - message: "color functions take numbers as parameters" - }; - } -} - -function clamp(val) { - return Math.min(1, Math.max(0, val)); -} - -})(require('./tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/index.js b/node_modules/less-middleware/node_modules/less/lib/less/index.js deleted file mode 100644 index 37fc902..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/index.js +++ /dev/null @@ -1,216 +0,0 @@ -var path = require('path'), - sys = require('util'), - url = require('url'), - http = require('http'), - fs = require('fs'); - -var less = { - version: [1, 3, 3], - Parser: require('./parser').Parser, - importer: require('./parser').importer, - tree: require('./tree'), - render: function (input, options, callback) { - options = options || {}; - - if (typeof(options) === 'function') { - callback = options, options = {}; - } - - var parser = new(less.Parser)(options), - ee; - - if (callback) { - parser.parse(input, function (e, root) { - callback(e, root && root.toCSS && root.toCSS(options)); - }); - } else { - ee = new(require('events').EventEmitter); - - process.nextTick(function () { - parser.parse(input, function (e, root) { - if (e) { ee.emit('error', e) } - else { ee.emit('success', root.toCSS(options)) } - }); - }); - return ee; - } - }, - formatError: function(ctx, options) { - options = options || {}; - - var message = ""; - var extract = ctx.extract; - var error = []; - var stylize = options.color ? require('./lessc_helper').stylize : function (str) { return str }; - - // only output a stack if it isn't a less error - if (ctx.stack && !ctx.type) { return stylize(ctx.stack, 'red') } - - if (!ctx.hasOwnProperty('index') || !extract) { - return ctx.stack || ctx.message; - } - - if (typeof(extract[0]) === 'string') { - error.push(stylize((ctx.line - 1) + ' ' + extract[0], 'grey')); - } - - if (extract[1]) { - error.push(ctx.line + ' ' + extract[1].slice(0, ctx.column) - + stylize(stylize(stylize(extract[1][ctx.column], 'bold') - + extract[1].slice(ctx.column + 1), 'red'), 'inverse')); - } - - if (typeof(extract[2]) === 'string') { - error.push(stylize((ctx.line + 1) + ' ' + extract[2], 'grey')); - } - error = error.join('\n') + stylize('', 'reset') + '\n'; - - message += stylize(ctx.type + 'Error: ' + ctx.message, 'red'); - ctx.filename && (message += stylize(' in ', 'red') + ctx.filename + - stylize(':' + ctx.line + ':' + ctx.column, 'grey')); - - message += '\n' + error; - - if (ctx.callLine) { - message += stylize('from ', 'red') + (ctx.filename || '') + '/n'; - message += stylize(ctx.callLine, 'grey') + ' ' + ctx.callExtract + '/n'; - } - - return message; - }, - writeError: function (ctx, options) { - options = options || {}; - if (options.silent) { return } - sys.error(less.formatError(ctx, options)); - } -}; - -['color', 'directive', 'operation', 'dimension', - 'keyword', 'variable', 'ruleset', 'element', - 'selector', 'quoted', 'expression', 'rule', - 'call', 'url', 'alpha', 'import', - 'mixin', 'comment', 'anonymous', 'value', - 'javascript', 'assignment', 'condition', 'paren', - 'media', 'ratio', 'unicode-descriptor' -].forEach(function (n) { - require('./tree/' + n); -}); - - -var isUrlRe = /^(?:https?:)?\/\//i; - -less.Parser.importer = function (file, paths, callback, env) { - var pathname, dirname, data; - - function parseFile(e, data) { - if (e) return callback(e); - - var rootpath = env.rootpath, - j = file.lastIndexOf('/'); - - // Pass on an updated rootpath if path of imported file is relative and file - // is in a (sub|sup) directory - // - // Examples: - // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/', - // then rootpath should become 'less/module/nav/' - // - If path of imported file is '../mixins.less' and rootpath is 'less/', - // then rootpath should become 'less/../' - if(env.relativeUrls && !/^(?:[a-z-]+:|\/)/.test(file) && j != -1) { - rootpath = rootpath + file.slice(0, j+1); // append (sub|sup) directory path of imported file - } - - env.contents[pathname] = data; // Updating top importing parser content cache. - new(less.Parser)({ - paths: [dirname].concat(paths), - filename: pathname, - contents: env.contents, - files: env.files, - syncImport: env.syncImport, - relativeUrls: env.relativeUrls, - rootpath: rootpath, - dumpLineNumbers: env.dumpLineNumbers - }).parse(data, function (e, root) { - callback(e, root, pathname); - }); - }; - - var isUrl = isUrlRe.test( file ); - if (isUrl || isUrlRe.test(paths[0])) { - - var urlStr = isUrl ? file : url.resolve(paths[0], file), - urlObj = url.parse(urlStr), - req = { - host: urlObj.hostname, - port: urlObj.port || 80, - path: urlObj.pathname + (urlObj.search||'') - }; - - http.get(req, function (res) { - var body = ''; - res.on('data', function (chunk) { - body += chunk.toString(); - }); - res.on('end', function () { - if (res.statusCode === 404) { - callback({ type: 'File', message: "resource '" + urlStr + "' was not found\n" }); - } - if (!body) { - sys.error( 'Warning: Empty body (HTTP '+ res.statusCode + ') returned by "' + urlStr +'"' ); - } - pathname = urlStr; - dirname = urlObj.protocol +'//'+ urlObj.host + urlObj.pathname.replace(/[^\/]*$/, ''); - parseFile(null, body); - }); - }).on('error', function (err) { - callback({ type: 'File', message: "resource '" + urlStr + "' gave this Error:\n "+ err +"\n" }); - }); - - } else { - - // TODO: Undo this at some point, - // or use different approach. - var paths = [].concat(paths); - paths.push('.'); - - for (var i = 0; i < paths.length; i++) { - try { - pathname = path.join(paths[i], file); - fs.statSync(pathname); - break; - } catch (e) { - pathname = null; - } - } - - paths = paths.slice(0, paths.length - 1); - - if (!pathname) { - - if (typeof(env.errback) === "function") { - env.errback(file, paths, callback); - } else { - callback({ type: 'File', message: "'" + file + "' wasn't found.\n" }); - } - return; - } - - dirname = path.dirname(pathname); - - if (env.syncImport) { - try { - data = fs.readFileSync(pathname, 'utf-8'); - parseFile(null, data); - } catch (e) { - parseFile(e); - } - } else { - fs.readFile(pathname, 'utf-8', parseFile); - } - } -} - -require('./functions'); -require('./colors'); - -for (var k in less) { exports[k] = less[k] } diff --git a/node_modules/less-middleware/node_modules/less/lib/less/lessc_helper.js b/node_modules/less-middleware/node_modules/less/lib/less/lessc_helper.js deleted file mode 100644 index 1a82ef9..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/lessc_helper.js +++ /dev/null @@ -1,62 +0,0 @@ -// lessc_helper.js -// -// helper functions for lessc -sys = require('util'); - -var lessc_helper = { - - //Stylize a string - stylize : function(str, style) { - var styles = { - 'reset' : [0, 0], - 'bold' : [1, 22], - 'inverse' : [7, 27], - 'underline' : [4, 24], - 'yellow' : [33, 39], - 'green' : [32, 39], - 'red' : [31, 39], - 'grey' : [90, 39] - }; - return '\033[' + styles[style][0] + 'm' + str + - '\033[' + styles[style][1] + 'm'; - }, - - //Print command line options - printUsage: function() { - sys.puts("usage: lessc [option option=parameter ...] [destination]"); - sys.puts(""); - sys.puts("If source is set to `-' (dash or hyphen-minus), input is read from stdin."); - sys.puts(""); - sys.puts("options:"); - sys.puts(" -h, --help Print help (this message) and exit."); - sys.puts(" --include-path Set include paths. Separated by `:'. Use `;' on Windows."); - sys.puts(" --no-color Disable colorized output."); - sys.puts(" -s, --silent Suppress output of error messages."); - sys.puts(" --strict-imports Force evaluation of imports."); - sys.puts(" --verbose Be verbose."); - sys.puts(" -v, --version Print version number and exit."); - sys.puts(" -x, --compress Compress output by removing some whitespaces."); - sys.puts(" --yui-compress Compress output using ycssmin"); - sys.puts(" -O0, -O1, -O2 Set the parser's optimization level. The lower"); - sys.puts(" the number, the less nodes it will create in the"); - sys.puts(" tree. This could matter for debugging, or if you"); - sys.puts(" want to access the individual nodes in the tree."); - sys.puts(" --line-numbers=TYPE Outputs filename and line numbers."); - sys.puts(" TYPE can be either 'comments', which will output"); - sys.puts(" the debug info within comments, 'mediaquery'"); - sys.puts(" that will output the information within a fake"); - sys.puts(" media query which is compatible with the SASS"); - sys.puts(" format, and 'all' which will do both."); - sys.puts(" -rp, --rootpath Set rootpath for url rewriting in relative imports and urls."); - sys.puts(" Works with or withour the relative-urls option."); - sys.puts(" -ru, --relative-urls re-write relative urls to the base less file."); - sys.puts(""); - sys.puts("Report bugs to: http://github.com/cloudhead/less.js/issues"); - sys.puts("Home page: "); - } - - -} - -// Exports helper functions -for (var h in lessc_helper) { exports[h] = lessc_helper[h] } diff --git a/node_modules/less-middleware/node_modules/less/lib/less/parser.js b/node_modules/less-middleware/node_modules/less/lib/less/parser.js deleted file mode 100644 index c8c280b..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/parser.js +++ /dev/null @@ -1,1522 +0,0 @@ -var less, tree, charset; - -if (typeof environment === "object" && ({}).toString.call(environment) === "[object Environment]") { - // Rhino - // Details on how to detect Rhino: https://github.com/ringo/ringojs/issues/88 - if (typeof(window) === 'undefined') { less = {} } - else { less = window.less = {} } - tree = less.tree = {}; - less.mode = 'rhino'; -} else if (typeof(window) === 'undefined') { - // Node.js - less = exports, - tree = require('./tree'); - less.mode = 'node'; -} else { - // Browser - if (typeof(window.less) === 'undefined') { window.less = {} } - less = window.less, - tree = window.less.tree = {}; - less.mode = 'browser'; -} -// -// less.js - parser -// -// A relatively straight-forward predictive parser. -// There is no tokenization/lexing stage, the input is parsed -// in one sweep. -// -// To make the parser fast enough to run in the browser, several -// optimization had to be made: -// -// - Matching and slicing on a huge input is often cause of slowdowns. -// The solution is to chunkify the input into smaller strings. -// The chunks are stored in the `chunks` var, -// `j` holds the current chunk index, and `current` holds -// the index of the current chunk in relation to `input`. -// This gives us an almost 4x speed-up. -// -// - In many cases, we don't need to match individual tokens; -// for example, if a value doesn't hold any variables, operations -// or dynamic references, the parser can effectively 'skip' it, -// treating it as a literal. -// An example would be '1px solid #000' - which evaluates to itself, -// we don't need to know what the individual components are. -// The drawback, of course is that you don't get the benefits of -// syntax-checking on the CSS. This gives us a 50% speed-up in the parser, -// and a smaller speed-up in the code-gen. -// -// -// Token matching is done with the `$` function, which either takes -// a terminal string or regexp, or a non-terminal function to call. -// It also takes care of moving all the indices forwards. -// -// -less.Parser = function Parser(env) { - var input, // LeSS input string - i, // current index in `input` - j, // current chunk - temp, // temporarily holds a chunk's state, for backtracking - memo, // temporarily holds `i`, when backtracking - furthest, // furthest index the parser has gone to - chunks, // chunkified input - current, // index of current chunk, in `input` - parser; - - var that = this; - - // Top parser on an import tree must be sure there is one "env" - // which will then be passed arround by reference. - var env = env || { }; - // env.contents and files must be passed arround with top env - if (!env.contents) { env.contents = {}; } - env.rootpath = env.rootpath || ''; // env.rootpath must be initialized to '' if not provided - if (!env.files) { env.files = {}; } - - // This function is called after all files - // have been imported through `@import`. - var finish = function () {}; - - var imports = this.imports = { - paths: env.paths || [], // Search paths, when importing - queue: [], // Files which haven't been imported yet - files: env.files, // Holds the imported parse trees - contents: env.contents, // Holds the imported file contents - mime: env.mime, // MIME type of .less files - error: null, // Error in parsing/evaluating an import - push: function (path, callback) { - var that = this; - this.queue.push(path); - - // - // Import a file asynchronously - // - less.Parser.importer(path, this.paths, function (e, root, fullPath) { - that.queue.splice(that.queue.indexOf(path), 1); // Remove the path from the queue - - var imported = fullPath in that.files; - - that.files[fullPath] = root; // Store the root - - if (e && !that.error) { that.error = e } - - callback(e, root, imported); - - if (that.queue.length === 0) { finish(that.error) } // Call `finish` if we're done importing - }, env); - } - }; - - function save() { temp = chunks[j], memo = i, current = i } - function restore() { chunks[j] = temp, i = memo, current = i } - - function sync() { - if (i > current) { - chunks[j] = chunks[j].slice(i - current); - current = i; - } - } - function isWhitespace(c) { - // Could change to \s? - var code = c.charCodeAt(0); - return code === 32 || code === 10 || code === 9; - } - // - // Parse from a token, regexp or string, and move forward if match - // - function $(tok) { - var match, args, length, index, k; - - // - // Non-terminal - // - if (tok instanceof Function) { - return tok.call(parser.parsers); - // - // Terminal - // - // Either match a single character in the input, - // or match a regexp in the current chunk (chunk[j]). - // - } else if (typeof(tok) === 'string') { - match = input.charAt(i) === tok ? tok : null; - length = 1; - sync (); - } else { - sync (); - - if (match = tok.exec(chunks[j])) { - length = match[0].length; - } else { - return null; - } - } - - // The match is confirmed, add the match length to `i`, - // and consume any extra white-space characters (' ' || '\n') - // which come after that. The reason for this is that LeSS's - // grammar is mostly white-space insensitive. - // - if (match) { - skipWhitespace(length); - - if(typeof(match) === 'string') { - return match; - } else { - return match.length === 1 ? match[0] : match; - } - } - } - - function skipWhitespace(length) { - var oldi = i, oldj = j, - endIndex = i + chunks[j].length, - mem = i += length; - - while (i < endIndex) { - if (! isWhitespace(input.charAt(i))) { break } - i++; - } - chunks[j] = chunks[j].slice(length + (i - mem)); - current = i; - - if (chunks[j].length === 0 && j < chunks.length - 1) { j++ } - - return oldi !== i || oldj !== j; - } - - function expect(arg, msg) { - var result = $(arg); - if (! result) { - error(msg || (typeof(arg) === 'string' ? "expected '" + arg + "' got '" + input.charAt(i) + "'" - : "unexpected token")); - } else { - return result; - } - } - - function error(msg, type) { - var e = new Error(msg); - e.index = i; - e.type = type || 'Syntax'; - throw e; - } - - // Same as $(), but don't change the state of the parser, - // just return the match. - function peek(tok) { - if (typeof(tok) === 'string') { - return input.charAt(i) === tok; - } else { - if (tok.test(chunks[j])) { - return true; - } else { - return false; - } - } - } - - function getInput(e, env) { - if (e.filename && env.filename && (e.filename !== env.filename)) { - return parser.imports.contents[e.filename]; - } else { - return input; - } - } - - function getLocation(index, input) { - for (var n = index, column = -1; - n >= 0 && input.charAt(n) !== '\n'; - n--) { column++ } - - return { line: typeof(index) === 'number' ? (input.slice(0, index).match(/\n/g) || "").length : null, - column: column }; - } - - function getFileName(e) { - if(less.mode === 'browser' || less.mode === 'rhino') - return e.filename; - else - return require('path').resolve(e.filename); - } - - function getDebugInfo(index, inputStream, e) { - return { - lineNumber: getLocation(index, inputStream).line + 1, - fileName: getFileName(e) - }; - } - - function LessError(e, env) { - var input = getInput(e, env), - loc = getLocation(e.index, input), - line = loc.line, - col = loc.column, - lines = input.split('\n'); - - this.type = e.type || 'Syntax'; - this.message = e.message; - this.filename = e.filename || env.filename; - this.index = e.index; - this.line = typeof(line) === 'number' ? line + 1 : null; - this.callLine = e.call && (getLocation(e.call, input).line + 1); - this.callExtract = lines[getLocation(e.call, input).line]; - this.stack = e.stack; - this.column = col; - this.extract = [ - lines[line - 1], - lines[line], - lines[line + 1] - ]; - } - - this.env = env = env || {}; - - // The optimization level dictates the thoroughness of the parser, - // the lower the number, the less nodes it will create in the tree. - // This could matter for debugging, or if you want to access - // the individual nodes in the tree. - this.optimization = ('optimization' in this.env) ? this.env.optimization : 1; - - this.env.filename = this.env.filename || null; - - // - // The Parser - // - return parser = { - - imports: imports, - // - // Parse an input string into an abstract syntax tree, - // call `callback` when done. - // - parse: function (str, callback) { - var root, start, end, zone, line, lines, buff = [], c, error = null; - - i = j = current = furthest = 0; - input = str.replace(/\r\n/g, '\n'); - - // Remove potential UTF Byte Order Mark - input = input.replace(/^\uFEFF/, ''); - - // Split the input into chunks. - chunks = (function (chunks) { - var j = 0, - skip = /(?:@\{[\w-]+\}|[^"'`\{\}\/\(\)\\])+/g, - comment = /\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g, - string = /"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'|`((?:[^`]|\\.)*)`/g, - level = 0, - match, - chunk = chunks[0], - inParam; - - for (var i = 0, c, cc; i < input.length;) { - skip.lastIndex = i; - if (match = skip.exec(input)) { - if (match.index === i) { - i += match[0].length; - chunk.push(match[0]); - } - } - c = input.charAt(i); - comment.lastIndex = string.lastIndex = i; - - if (match = string.exec(input)) { - if (match.index === i) { - i += match[0].length; - chunk.push(match[0]); - continue; - } - } - - if (!inParam && c === '/') { - cc = input.charAt(i + 1); - if (cc === '/' || cc === '*') { - if (match = comment.exec(input)) { - if (match.index === i) { - i += match[0].length; - chunk.push(match[0]); - continue; - } - } - } - } - - switch (c) { - case '{': if (! inParam) { level ++; chunk.push(c); break } - case '}': if (! inParam) { level --; chunk.push(c); chunks[++j] = chunk = []; break } - case '(': if (! inParam) { inParam = true; chunk.push(c); break } - case ')': if ( inParam) { inParam = false; chunk.push(c); break } - default: chunk.push(c); - } - - i++; - } - if (level != 0) { - error = new(LessError)({ - index: i-1, - type: 'Parse', - message: (level > 0) ? "missing closing `}`" : "missing opening `{`", - filename: env.filename - }, env); - } - - return chunks.map(function (c) { return c.join('') });; - })([[]]); - - if (error) { - return callback(error, env); - } - - // Start with the primary rule. - // The whole syntax tree is held under a Ruleset node, - // with the `root` property set to true, so no `{}` are - // output. The callback is called when the input is parsed. - try { - root = new(tree.Ruleset)([], $(this.parsers.primary)); - root.root = true; - } catch (e) { - return callback(new(LessError)(e, env)); - } - - root.toCSS = (function (evaluate) { - var line, lines, column; - - return function (options, variables) { - var frames = [], importError; - - options = options || {}; - // - // Allows setting variables with a hash, so: - // - // `{ color: new(tree.Color)('#f01') }` will become: - // - // new(tree.Rule)('@color', - // new(tree.Value)([ - // new(tree.Expression)([ - // new(tree.Color)('#f01') - // ]) - // ]) - // ) - // - if (typeof(variables) === 'object' && !Array.isArray(variables)) { - variables = Object.keys(variables).map(function (k) { - var value = variables[k]; - - if (! (value instanceof tree.Value)) { - if (! (value instanceof tree.Expression)) { - value = new(tree.Expression)([value]); - } - value = new(tree.Value)([value]); - } - return new(tree.Rule)('@' + k, value, false, 0); - }); - frames = [new(tree.Ruleset)(null, variables)]; - } - - try { - var css = evaluate.call(this, { frames: frames }) - .toCSS([], { compress: options.compress || false, dumpLineNumbers: env.dumpLineNumbers }); - } catch (e) { - throw new(LessError)(e, env); - } - - if ((importError = parser.imports.error)) { // Check if there was an error during importing - if (importError instanceof LessError) throw importError; - else throw new(LessError)(importError, env); - } - - if (options.yuicompress && less.mode === 'node') { - return require('ycssmin').cssmin(css); - } else if (options.compress) { - return css.replace(/(\s)+/g, "$1"); - } else { - return css; - } - }; - })(root.eval); - - // If `i` is smaller than the `input.length - 1`, - // it means the parser wasn't able to parse the whole - // string, so we've got a parsing error. - // - // We try to extract a \n delimited string, - // showing the line where the parse error occured. - // We split it up into two parts (the part which parsed, - // and the part which didn't), so we can color them differently. - if (i < input.length - 1) { - i = furthest; - lines = input.split('\n'); - line = (input.slice(0, i).match(/\n/g) || "").length + 1; - - for (var n = i, column = -1; n >= 0 && input.charAt(n) !== '\n'; n--) { column++ } - - error = { - type: "Parse", - message: "Syntax Error on line " + line, - index: i, - filename: env.filename, - line: line, - column: column, - extract: [ - lines[line - 2], - lines[line - 1], - lines[line] - ] - }; - } - - if (this.imports.queue.length > 0) { - finish = function (e) { - e = error || e; - if (e) callback(e); - else callback(null, root); - }; - } else { - callback(error, root); - } - }, - - // - // Here in, the parsing rules/functions - // - // The basic structure of the syntax tree generated is as follows: - // - // Ruleset -> Rule -> Value -> Expression -> Entity - // - // Here's some LESS code: - // - // .class { - // color: #fff; - // border: 1px solid #000; - // width: @w + 4px; - // > .child {...} - // } - // - // And here's what the parse tree might look like: - // - // Ruleset (Selector '.class', [ - // Rule ("color", Value ([Expression [Color #fff]])) - // Rule ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]])) - // Rule ("width", Value ([Expression [Operation "+" [Variable "@w"][Dimension 4px]]])) - // Ruleset (Selector [Element '>', '.child'], [...]) - // ]) - // - // In general, most rules will try to parse a token with the `$()` function, and if the return - // value is truly, will return a new node, of the relevant type. Sometimes, we need to check - // first, before parsing, that's when we use `peek()`. - // - parsers: { - // - // The `primary` rule is the *entry* and *exit* point of the parser. - // The rules here can appear at any level of the parse tree. - // - // The recursive nature of the grammar is an interplay between the `block` - // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, - // as represented by this simplified grammar: - // - // primary → (ruleset | rule)+ - // ruleset → selector+ block - // block → '{' primary '}' - // - // Only at one point is the primary rule not called from the - // block rule: at the root level. - // - primary: function () { - var node, root = []; - - while ((node = $(this.mixin.definition) || $(this.rule) || $(this.ruleset) || - $(this.mixin.call) || $(this.comment) || $(this.directive)) - || $(/^[\s\n]+/) || $(/^;+/)) { - node && root.push(node); - } - return root; - }, - - // We create a Comment node for CSS comments `/* */`, - // but keep the LeSS comments `//` silent, by just skipping - // over them. - comment: function () { - var comment; - - if (input.charAt(i) !== '/') return; - - if (input.charAt(i + 1) === '/') { - return new(tree.Comment)($(/^\/\/.*/), true); - } else if (comment = $(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/)) { - return new(tree.Comment)(comment); - } - }, - - // - // Entities are tokens which can be found inside an Expression - // - entities: { - // - // A string, which supports escaping " and ' - // - // "milky way" 'he\'s the one!' - // - quoted: function () { - var str, j = i, e; - - if (input.charAt(j) === '~') { j++, e = true } // Escaped strings - if (input.charAt(j) !== '"' && input.charAt(j) !== "'") return; - - e && $('~'); - - if (str = $(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/)) { - return new(tree.Quoted)(str[0], str[1] || str[2], e); - } - }, - - // - // A catch-all word, such as: - // - // black border-collapse - // - keyword: function () { - var k; - - if (k = $(/^[_A-Za-z-][_A-Za-z0-9-]*/)) { - if (tree.colors.hasOwnProperty(k)) { - // detect named color - return new(tree.Color)(tree.colors[k].slice(1)); - } else { - return new(tree.Keyword)(k); - } - } - }, - - // - // A function call - // - // rgb(255, 0, 255) - // - // We also try to catch IE's `alpha()`, but let the `alpha` parser - // deal with the details. - // - // The arguments are parsed with the `entities.arguments` parser. - // - call: function () { - var name, nameLC, args, alpha_ret, index = i; - - if (! (name = /^([\w-]+|%|progid:[\w\.]+)\(/.exec(chunks[j]))) return; - - name = name[1]; - nameLC = name.toLowerCase(); - - if (nameLC === 'url') { return null } - else { i += name.length } - - if (nameLC === 'alpha') { - alpha_ret = $(this.alpha); - if(typeof alpha_ret !== 'undefined') { - return alpha_ret; - } - } - - $('('); // Parse the '(' and consume whitespace. - - args = $(this.entities.arguments); - - if (! $(')')) return; - - if (name) { return new(tree.Call)(name, args, index, env.filename) } - }, - arguments: function () { - var args = [], arg; - - while (arg = $(this.entities.assignment) || $(this.expression)) { - args.push(arg); - if (! $(',')) { break } - } - return args; - }, - literal: function () { - return $(this.entities.ratio) || - $(this.entities.dimension) || - $(this.entities.color) || - $(this.entities.quoted) || - $(this.entities.unicodeDescriptor); - }, - - // Assignments are argument entities for calls. - // They are present in ie filter properties as shown below. - // - // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* ) - // - - assignment: function () { - var key, value; - if ((key = $(/^\w+(?=\s?=)/i)) && $('=') && (value = $(this.entity))) { - return new(tree.Assignment)(key, value); - } - }, - - // - // Parse url() tokens - // - // We use a specific rule for urls, because they don't really behave like - // standard function calls. The difference is that the argument doesn't have - // to be enclosed within a string, so it can't be parsed as an Expression. - // - url: function () { - var value; - - if (input.charAt(i) !== 'u' || !$(/^url\(/)) return; - value = $(this.entities.quoted) || $(this.entities.variable) || - $(/^(?:(?:\\[\(\)'"])|[^\(\)'"])+/) || ""; - - expect(')'); - - return new(tree.URL)((value.value != null || value instanceof tree.Variable) - ? value : new(tree.Anonymous)(value), env.rootpath); - }, - - // - // A Variable entity, such as `@fink`, in - // - // width: @fink + 2px - // - // We use a different parser for variable definitions, - // see `parsers.variable`. - // - variable: function () { - var name, index = i; - - if (input.charAt(i) === '@' && (name = $(/^@@?[\w-]+/))) { - return new(tree.Variable)(name, index, env.filename); - } - }, - - // A variable entity useing the protective {} e.g. @{var} - variableCurly: function () { - var name, curly, index = i; - - if (input.charAt(i) === '@' && (curly = $(/^@\{([\w-]+)\}/))) { - return new(tree.Variable)("@" + curly[1], index, env.filename); - } - }, - - // - // A Hexadecimal color - // - // #4F3C2F - // - // `rgb` and `hsl` colors are parsed through the `entities.call` parser. - // - color: function () { - var rgb; - - if (input.charAt(i) === '#' && (rgb = $(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})/))) { - return new(tree.Color)(rgb[1]); - } - }, - - // - // A Dimension, that is, a number and a unit - // - // 0.5em 95% - // - dimension: function () { - var value, c = input.charCodeAt(i); - //Is the first char of the dimension 0-9, '.', '+' or '-' - if ((c > 57 || c < 43) || c === 47 || c == 44) return; - - if (value = $(/^([+-]?\d*\.?\d+)(px|%|em|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn|dpi|dpcm|dppx|rem|vw|vh|vmin|vm|ch)?/)) { - return new(tree.Dimension)(value[1], value[2]); - } - }, - - // - // A Ratio - // - // 16/9 - // - ratio: function () { - var value, c = input.charCodeAt(i); - if (c > 57 || c < 48) return; - - if (value = $(/^(\d+\/\d+)/)) { - return new(tree.Ratio)(value[1]); - } - }, - - // - // A unicode descriptor, as is used in unicode-range - // - // U+0?? or U+00A1-00A9 - // - unicodeDescriptor: function () { - var ud; - - if (ud = $(/^U\+[0-9a-fA-F?]+(\-[0-9a-fA-F?]+)?/)) { - return new(tree.UnicodeDescriptor)(ud[0]); - } - }, - - // - // JavaScript code to be evaluated - // - // `window.location.href` - // - javascript: function () { - var str, j = i, e; - - if (input.charAt(j) === '~') { j++, e = true } // Escaped strings - if (input.charAt(j) !== '`') { return } - - e && $('~'); - - if (str = $(/^`([^`]*)`/)) { - return new(tree.JavaScript)(str[1], i, e); - } - } - }, - - // - // The variable part of a variable definition. Used in the `rule` parser - // - // @fink: - // - variable: function () { - var name; - - if (input.charAt(i) === '@' && (name = $(/^(@[\w-]+)\s*:/))) { return name[1] } - }, - - // - // A font size/line-height shorthand - // - // small/12px - // - // We need to peek first, or we'll match on keywords and dimensions - // - shorthand: function () { - var a, b; - - if (! peek(/^[@\w.%-]+\/[@\w.-]+/)) return; - - save(); - - if ((a = $(this.entity)) && $('/') && (b = $(this.entity))) { - return new(tree.Shorthand)(a, b); - } - - restore(); - }, - - // - // Mixins - // - mixin: { - // - // A Mixin call, with an optional argument list - // - // #mixins > .square(#fff); - // .rounded(4px, black); - // .button; - // - // The `while` loop is there because mixins can be - // namespaced, but we only support the child and descendant - // selector for now. - // - call: function () { - var elements = [], e, c, argsSemiColon = [], argsComma = [], args, delim, arg, nameLoop, expressions, isSemiColonSeperated, expressionContainsNamed, index = i, s = input.charAt(i), name, value, important = false; - - if (s !== '.' && s !== '#') { return } - - save(); // stop us absorbing part of an invalid selector - - while (e = $(/^[#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)) { - elements.push(new(tree.Element)(c, e, i)); - c = $('>'); - } - if ($('(')) { - expressions = []; - while (arg = $(this.expression)) { - nameLoop = null; - value = arg; - - // Variable - if (arg.value.length == 1) { - var val = arg.value[0]; - if (val instanceof tree.Variable) { - if ($(':')) { - if (expressions.length > 0) { - if (isSemiColonSeperated) { - error("Cannot mix ; and , as delimiter types"); - } - expressionContainsNamed = true; - } - value = expect(this.expression); - nameLoop = (name = val.name); - } - } - } - - expressions.push(value); - - argsComma.push({ name: nameLoop, value: value }); - - if ($(',')) { - continue; - } - - if ($(';') || isSemiColonSeperated) { - - if (expressionContainsNamed) { - error("Cannot mix ; and , as delimiter types"); - } - - isSemiColonSeperated = true; - - if (expressions.length > 1) { - value = new(tree.Value)(expressions); - } - argsSemiColon.push({ name: name, value: value }); - - name = null; - expressions = []; - expressionContainsNamed = false; - } - } - - expect(')'); - } - - args = isSemiColonSeperated ? argsSemiColon : argsComma; - - if ($(this.important)) { - important = true; - } - - if (elements.length > 0 && ($(';') || peek('}'))) { - return new(tree.mixin.Call)(elements, args, index, env.filename, important); - } - - restore(); - }, - - // - // A Mixin definition, with a list of parameters - // - // .rounded (@radius: 2px, @color) { - // ... - // } - // - // Until we have a finer grained state-machine, we have to - // do a look-ahead, to make sure we don't have a mixin call. - // See the `rule` function for more information. - // - // We start by matching `.rounded (`, and then proceed on to - // the argument list, which has optional default values. - // We store the parameters in `params`, with a `value` key, - // if there is a value, such as in the case of `@radius`. - // - // Once we've got our params list, and a closing `)`, we parse - // the `{...}` block. - // - definition: function () { - var name, params = [], match, ruleset, param, value, cond, variadic = false; - if ((input.charAt(i) !== '.' && input.charAt(i) !== '#') || - peek(/^[^{]*\}/)) return; - - save(); - - if (match = $(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)) { - name = match[1]; - - do { - $(this.comment); - if (input.charAt(i) === '.' && $(/^\.{3}/)) { - variadic = true; - params.push({ variadic: true }); - break; - } else if (param = $(this.entities.variable) || $(this.entities.literal) - || $(this.entities.keyword)) { - // Variable - if (param instanceof tree.Variable) { - if ($(':')) { - value = expect(this.expression, 'expected expression'); - params.push({ name: param.name, value: value }); - } else if ($(/^\.{3}/)) { - params.push({ name: param.name, variadic: true }); - variadic = true; - break; - } else { - params.push({ name: param.name }); - } - } else { - params.push({ value: param }); - } - } else { - break; - } - } while ($(',') || $(';')) - - // .mixincall("@{a}"); - // looks a bit like a mixin definition.. so we have to be nice and restore - if (!$(')')) { - furthest = i; - restore(); - } - - $(this.comment); - - if ($(/^when/)) { // Guard - cond = expect(this.conditions, 'expected condition'); - } - - ruleset = $(this.block); - - if (ruleset) { - return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic); - } else { - restore(); - } - } - } - }, - - // - // Entities are the smallest recognized token, - // and can be found inside a rule's value. - // - entity: function () { - return $(this.entities.literal) || $(this.entities.variable) || $(this.entities.url) || - $(this.entities.call) || $(this.entities.keyword) ||$(this.entities.javascript) || - $(this.comment); - }, - - // - // A Rule terminator. Note that we use `peek()` to check for '}', - // because the `block` rule will be expecting it, but we still need to make sure - // it's there, if ';' was ommitted. - // - end: function () { - return $(';') || peek('}'); - }, - - // - // IE's alpha function - // - // alpha(opacity=88) - // - alpha: function () { - var value; - - if (! $(/^\(opacity=/i)) return; - if (value = $(/^\d+/) || $(this.entities.variable)) { - expect(')'); - return new(tree.Alpha)(value); - } - }, - - // - // A Selector Element - // - // div - // + h1 - // #socks - // input[type="text"] - // - // Elements are the building blocks for Selectors, - // they are made out of a `Combinator` (see combinator rule), - // and an element name, such as a tag a class, or `*`. - // - element: function () { - var e, t, c, v; - - c = $(this.combinator); - - e = $(/^(?:\d+\.\d+|\d+)%/) || $(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) || - $('*') || $('&') || $(this.attribute) || $(/^\([^()@]+\)/) || $(/^[\.#](?=@)/) || $(this.entities.variableCurly); - - if (! e) { - if ($('(')) { - if ((v = ($(this.entities.variableCurly) || - $(this.entities.variable) || - $(this.selector))) && - $(')')) { - e = new(tree.Paren)(v); - } - } - } - - if (e) { return new(tree.Element)(c, e, i) } - }, - - // - // Combinators combine elements together, in a Selector. - // - // Because our parser isn't white-space sensitive, special care - // has to be taken, when parsing the descendant combinator, ` `, - // as it's an empty space. We have to check the previous character - // in the input, to see if it's a ` ` character. More info on how - // we deal with this in *combinator.js*. - // - combinator: function () { - var match, c = input.charAt(i); - - if (c === '>' || c === '+' || c === '~' || c === '|') { - i++; - while (input.charAt(i).match(/\s/)) { i++ } - return new(tree.Combinator)(c); - } else if (input.charAt(i - 1).match(/\s/)) { - return new(tree.Combinator)(" "); - } else { - return new(tree.Combinator)(null); - } - }, - - // - // A CSS Selector - // - // .class > div + h1 - // li a:hover - // - // Selectors are made out of one or more Elements, see above. - // - selector: function () { - var sel, e, elements = [], c, match; - - // depreciated, will be removed soon - if ($('(')) { - sel = $(this.entity); - if (!$(')')) { return null; } - return new(tree.Selector)([new(tree.Element)('', sel, i)]); - } - - while (e = $(this.element)) { - c = input.charAt(i); - elements.push(e) - if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') { break } - } - - if (elements.length > 0) { return new(tree.Selector)(elements) } - }, - attribute: function () { - var attr = '', key, val, op; - - if (! $('[')) return; - - if (key = $(/^(?:[_A-Za-z0-9-]|\\.)+/) || $(this.entities.quoted)) { - if ((op = $(/^[|~*$^]?=/)) && - (val = $(this.entities.quoted) || $(/^[\w-]+/))) { - attr = [key, op, val.toCSS ? val.toCSS() : val].join(''); - } else { attr = key } - } - - if (! $(']')) return; - - if (attr) { return "[" + attr + "]" } - }, - - // - // The `block` rule is used by `ruleset` and `mixin.definition`. - // It's a wrapper around the `primary` rule, with added `{}`. - // - block: function () { - var content; - if ($('{') && (content = $(this.primary)) && $('}')) { - return content; - } - }, - - // - // div, .class, body > p {...} - // - ruleset: function () { - var selectors = [], s, rules, match, debugInfo; - - save(); - - if (env.dumpLineNumbers) - debugInfo = getDebugInfo(i, input, env); - - while (s = $(this.selector)) { - selectors.push(s); - $(this.comment); - if (! $(',')) { break } - $(this.comment); - } - - if (selectors.length > 0 && (rules = $(this.block))) { - var ruleset = new(tree.Ruleset)(selectors, rules, env.strictImports); - if (env.dumpLineNumbers) - ruleset.debugInfo = debugInfo; - return ruleset; - } else { - // Backtrack - furthest = i; - restore(); - } - }, - rule: function () { - var name, value, c = input.charAt(i), important, match; - save(); - - if (c === '.' || c === '#' || c === '&') { return } - - if (name = $(this.variable) || $(this.property)) { - if ((name.charAt(0) != '@') && (match = /^([^@+\/'"*`(;{}-]*);/.exec(chunks[j]))) { - i += match[0].length - 1; - value = new(tree.Anonymous)(match[1]); - } else if (name === "font") { - value = $(this.font); - } else { - value = $(this.value); - } - important = $(this.important); - - if (value && $(this.end)) { - return new(tree.Rule)(name, value, important, memo); - } else { - furthest = i; - restore(); - } - } - }, - - // - // An @import directive - // - // @import "lib"; - // - // Depending on our environemnt, importing is done differently: - // In the browser, it's an XHR request, in Node, it would be a - // file-system operation. The function used for importing is - // stored in `import`, which we pass to the Import constructor. - // - "import": function () { - var path, features, index = i; - - save(); - - var dir = $(/^@import(?:-(once))?\s+/); - - if (dir && (path = $(this.entities.quoted) || $(this.entities.url))) { - features = $(this.mediaFeatures); - if ($(';')) { - return new(tree.Import)(path, imports, features, (dir[1] === 'once'), index, env.rootpath); - } - } - - restore(); - }, - - mediaFeature: function () { - var e, p, nodes = []; - - do { - if (e = $(this.entities.keyword)) { - nodes.push(e); - } else if ($('(')) { - p = $(this.property); - e = $(this.entity); - if ($(')')) { - if (p && e) { - nodes.push(new(tree.Paren)(new(tree.Rule)(p, e, null, i, true))); - } else if (e) { - nodes.push(new(tree.Paren)(e)); - } else { - return null; - } - } else { return null } - } - } while (e); - - if (nodes.length > 0) { - return new(tree.Expression)(nodes); - } - }, - - mediaFeatures: function () { - var e, features = []; - - do { - if (e = $(this.mediaFeature)) { - features.push(e); - if (! $(',')) { break } - } else if (e = $(this.entities.variable)) { - features.push(e); - if (! $(',')) { break } - } - } while (e); - - return features.length > 0 ? features : null; - }, - - media: function () { - var features, rules, media, debugInfo; - - if (env.dumpLineNumbers) - debugInfo = getDebugInfo(i, input, env); - - if ($(/^@media/)) { - features = $(this.mediaFeatures); - - if (rules = $(this.block)) { - media = new(tree.Media)(rules, features); - if(env.dumpLineNumbers) - media.debugInfo = debugInfo; - return media; - } - } - }, - - // - // A CSS Directive - // - // @charset "utf-8"; - // - directive: function () { - var name, value, rules, identifier, e, nodes, nonVendorSpecificName, - hasBlock, hasIdentifier, hasExpression; - - if (input.charAt(i) !== '@') return; - - if (value = $(this['import']) || $(this.media)) { - return value; - } - - save(); - - name = $(/^@[a-z-]+/); - - if (!name) return; - - nonVendorSpecificName = name; - if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) { - nonVendorSpecificName = "@" + name.slice(name.indexOf('-', 2) + 1); - } - - switch(nonVendorSpecificName) { - case "@font-face": - hasBlock = true; - break; - case "@viewport": - case "@top-left": - case "@top-left-corner": - case "@top-center": - case "@top-right": - case "@top-right-corner": - case "@bottom-left": - case "@bottom-left-corner": - case "@bottom-center": - case "@bottom-right": - case "@bottom-right-corner": - case "@left-top": - case "@left-middle": - case "@left-bottom": - case "@right-top": - case "@right-middle": - case "@right-bottom": - hasBlock = true; - break; - case "@page": - case "@document": - case "@supports": - case "@keyframes": - hasBlock = true; - hasIdentifier = true; - break; - case "@namespace": - hasExpression = true; - break; - } - - if (hasIdentifier) { - name += " " + ($(/^[^{]+/) || '').trim(); - } - - if (hasBlock) - { - if (rules = $(this.block)) { - return new(tree.Directive)(name, rules); - } - } else { - if ((value = hasExpression ? $(this.expression) : $(this.entity)) && $(';')) { - var directive = new(tree.Directive)(name, value); - if (env.dumpLineNumbers) { - directive.debugInfo = getDebugInfo(i, input, env); - } - return directive; - } - } - - restore(); - }, - font: function () { - var value = [], expression = [], weight, shorthand, font, e; - - while (e = $(this.shorthand) || $(this.entity)) { - expression.push(e); - } - value.push(new(tree.Expression)(expression)); - - if ($(',')) { - while (e = $(this.expression)) { - value.push(e); - if (! $(',')) { break } - } - } - return new(tree.Value)(value); - }, - - // - // A Value is a comma-delimited list of Expressions - // - // font-family: Baskerville, Georgia, serif; - // - // In a Rule, a Value represents everything after the `:`, - // and before the `;`. - // - value: function () { - var e, expressions = [], important; - - while (e = $(this.expression)) { - expressions.push(e); - if (! $(',')) { break } - } - - if (expressions.length > 0) { - return new(tree.Value)(expressions); - } - }, - important: function () { - if (input.charAt(i) === '!') { - return $(/^! *important/); - } - }, - sub: function () { - var e; - - if ($('(') && (e = $(this.expression)) && $(')')) { - return e; - } - }, - multiplication: function () { - var m, a, op, operation; - if (m = $(this.operand)) { - while (!peek(/^\/[*\/]/) && (op = ($('/') || $('*'))) && (a = $(this.operand))) { - operation = new(tree.Operation)(op, [operation || m, a]); - } - return operation || m; - } - }, - addition: function () { - var m, a, op, operation; - if (m = $(this.multiplication)) { - while ((op = $(/^[-+]\s+/) || (!isWhitespace(input.charAt(i - 1)) && ($('+') || $('-')))) && - (a = $(this.multiplication))) { - operation = new(tree.Operation)(op, [operation || m, a]); - } - return operation || m; - } - }, - conditions: function () { - var a, b, index = i, condition; - - if (a = $(this.condition)) { - while ($(',') && (b = $(this.condition))) { - condition = new(tree.Condition)('or', condition || a, b, index); - } - return condition || a; - } - }, - condition: function () { - var a, b, c, op, index = i, negate = false; - - if ($(/^not/)) { negate = true } - expect('('); - if (a = $(this.addition) || $(this.entities.keyword) || $(this.entities.quoted)) { - if (op = $(/^(?:>=|=<|[<=>])/)) { - if (b = $(this.addition) || $(this.entities.keyword) || $(this.entities.quoted)) { - c = new(tree.Condition)(op, a, b, index, negate); - } else { - error('expected expression'); - } - } else { - c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, negate); - } - expect(')'); - return $(/^and/) ? new(tree.Condition)('and', c, $(this.condition)) : c; - } - }, - - // - // An operand is anything that can be part of an operation, - // such as a Color, or a Variable - // - operand: function () { - var negate, p = input.charAt(i + 1); - - if (input.charAt(i) === '-' && (p === '@' || p === '(')) { negate = $('-') } - var o = $(this.sub) || $(this.entities.dimension) || - $(this.entities.color) || $(this.entities.variable) || - $(this.entities.call); - return negate ? new(tree.Operation)('*', [new(tree.Dimension)(-1), o]) - : o; - }, - - // - // Expressions either represent mathematical operations, - // or white-space delimited Entities. - // - // 1px solid black - // @var * 2 - // - expression: function () { - var e, delim, entities = [], d; - - while (e = $(this.addition) || $(this.entity)) { - entities.push(e); - } - if (entities.length > 0) { - return new(tree.Expression)(entities); - } - }, - property: function () { - var name; - - if (name = $(/^(\*?-?[_a-z0-9-]+)\s*:/)) { - return name[1]; - } - } - } - }; -}; - -if (less.mode === 'browser' || less.mode === 'rhino') { - // - // Used by `@import` directives - // - less.Parser.importer = function (path, paths, callback, env) { - if (!/^([a-z-]+:)?\//.test(path) && paths.length > 0) { - path = paths[0] + path; - } - // We pass `true` as 3rd argument, to force the reload of the import. - // This is so we can get the syntax tree as opposed to just the CSS output, - // as we need this to evaluate the current stylesheet. - loadStyleSheet({ - href: path, - title: path, - type: env.mime, - contents: env.contents, - files: env.files, - rootpath: env.rootpath, - entryPath: env.entryPath, - relativeUrls: env.relativeUrls }, - function (e, root, data, sheet, _, path) { - if (e && typeof(env.errback) === "function") { - env.errback.call(null, path, paths, callback, env); - } else { - callback.call(null, e, root, path); - } - }, true); - }; -} - diff --git a/node_modules/less-middleware/node_modules/less/lib/less/rhino.js b/node_modules/less-middleware/node_modules/less/lib/less/rhino.js deleted file mode 100644 index 57d60f5..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/rhino.js +++ /dev/null @@ -1,123 +0,0 @@ -var name; - -function loadStyleSheet(sheet, callback, reload, remaining) { - var endOfPath = Math.max(name.lastIndexOf('/'), name.lastIndexOf('\\')), - sheetName = name.slice(0, endOfPath + 1) + sheet.href, - contents = sheet.contents || {}, - input = readFile(sheetName); - - contents[sheetName] = input; - - var parser = new less.Parser({ - paths: [sheet.href.replace(/[\w\.-]+$/, '')], - contents: contents - }); - parser.parse(input, function (e, root) { - if (e) { - return error(e, sheetName); - } - try { - callback(e, root, input, sheet, { local: false, lastModified: 0, remaining: remaining }, sheetName); - } catch(e) { - error(e, sheetName); - } - }); -} - -function writeFile(filename, content) { - var fstream = new java.io.FileWriter(filename); - var out = new java.io.BufferedWriter(fstream); - out.write(content); - out.close(); -} - -// Command line integration via Rhino -(function (args) { - var output, - compress = false, - i; - - for(i = 0; i < args.length; i++) { - switch(args[i]) { - case "-x": - compress = true; - break; - default: - if (!name) { - name = args[i]; - } else if (!output) { - output = args[i]; - } else { - print("unrecognised parameters"); - print("input_file [output_file] [-x]"); - } - } - } - - if (!name) { - print('No files present in the fileset; Check your pattern match in build.xml'); - quit(1); - } - path = name.split("/");path.pop();path=path.join("/") - - var input = readFile(name); - - if (!input) { - print('lesscss: couldn\'t open file ' + name); - quit(1); - } - - var result; - try { - var parser = new less.Parser(); - parser.parse(input, function (e, root) { - if (e) { - error(e, name); - quit(1); - } else { - result = root.toCSS({compress: compress || false}); - if (output) { - writeFile(output, result); - print("Written to " + output); - } else { - print(result); - } - quit(0); - } - }); - } - catch(e) { - error(e, name); - quit(1); - } - print("done"); -}(arguments)); - -function error(e, filename) { - - var content = "Error : " + filename + "\n"; - - filename = e.filename || filename; - - if (e.message) { - content += e.message + "\n"; - } - - var errorline = function (e, i, classname) { - if (e.extract[i]) { - content += - String(parseInt(e.line) + (i - 1)) + - ":" + e.extract[i] + "\n"; - } - }; - - if (e.stack) { - content += e.stack; - } else if (e.extract) { - content += 'on line ' + e.line + ', column ' + (e.column + 1) + ':\n'; - errorline(e, 0); - errorline(e, 1); - errorline(e, 2); - } - print(content); -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree.js b/node_modules/less-middleware/node_modules/less/lib/less/tree.js deleted file mode 100644 index 134adbd..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree.js +++ /dev/null @@ -1,45 +0,0 @@ -(function (tree) { - -tree.debugInfo = function(env, ctx) { - var result=""; - if (env.dumpLineNumbers && !env.compress) { - switch(env.dumpLineNumbers) { - case 'comments': - result = tree.debugInfo.asComment(ctx); - break; - case 'mediaquery': - result = tree.debugInfo.asMediaQuery(ctx); - break; - case 'all': - result = tree.debugInfo.asComment(ctx)+tree.debugInfo.asMediaQuery(ctx); - break; - } - } - return result; -}; - -tree.debugInfo.asComment = function(ctx) { - return '/* line ' + ctx.debugInfo.lineNumber + ', ' + ctx.debugInfo.fileName + ' */\n'; -}; - -tree.debugInfo.asMediaQuery = function(ctx) { - return '@media -sass-debug-info{filename{font-family:' + - ('file://' + ctx.debugInfo.fileName).replace(/[\/:.]/g, '\\$&') + - '}line{font-family:\\00003' + ctx.debugInfo.lineNumber + '}}\n'; -}; - -tree.find = function (obj, fun) { - for (var i = 0, r; i < obj.length; i++) { - if (r = fun.call(obj, obj[i])) { return r } - } - return null; -}; -tree.jsify = function (obj) { - if (Array.isArray(obj.value) && (obj.value.length > 1)) { - return '[' + obj.value.map(function (v) { return v.toCSS(false) }).join(', ') + ']'; - } else { - return obj.toCSS(false); - } -}; - -})(require('./tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/alpha.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/alpha.js deleted file mode 100644 index 139ae92..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/alpha.js +++ /dev/null @@ -1,17 +0,0 @@ -(function (tree) { - -tree.Alpha = function (val) { - this.value = val; -}; -tree.Alpha.prototype = { - toCSS: function () { - return "alpha(opacity=" + - (this.value.toCSS ? this.value.toCSS() : this.value) + ")"; - }, - eval: function (env) { - if (this.value.eval) { this.value = this.value.eval(env) } - return this; - } -}; - -})(require('../tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/anonymous.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/anonymous.js deleted file mode 100644 index 4461490..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/anonymous.js +++ /dev/null @@ -1,27 +0,0 @@ -(function (tree) { - -tree.Anonymous = function (string) { - this.value = string.value || string; -}; -tree.Anonymous.prototype = { - toCSS: function () { - return this.value; - }, - eval: function () { return this }, - compare: function (x) { - if (!x.toCSS) { - return -1; - } - - var left = this.toCSS(), - right = x.toCSS(); - - if (left === right) { - return 0; - } - - return left < right ? -1 : 1; - } -}; - -})(require('../tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/assignment.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/assignment.js deleted file mode 100644 index a5559ad..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/assignment.js +++ /dev/null @@ -1,19 +0,0 @@ -(function (tree) { - -tree.Assignment = function (key, val) { - this.key = key; - this.value = val; -}; -tree.Assignment.prototype = { - toCSS: function () { - return this.key + '=' + (this.value.toCSS ? this.value.toCSS() : this.value); - }, - eval: function (env) { - if (this.value.eval) { - return new(tree.Assignment)(this.key, this.value.eval(env)); - } - return this; - } -}; - -})(require('../tree')); \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/call.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/call.js deleted file mode 100644 index f8045ed..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/call.js +++ /dev/null @@ -1,54 +0,0 @@ -(function (tree) { - -// -// A function call node. -// -tree.Call = function (name, args, index, filename) { - this.name = name; - this.args = args; - this.index = index; - this.filename = filename; -}; -tree.Call.prototype = { - // - // When evaluating a function call, - // we either find the function in `tree.functions` [1], - // in which case we call it, passing the evaluated arguments, - // if this returns null or we cannot find the function, we - // simply print it out as it appeared originally [2]. - // - // The *functions.js* file contains the built-in functions. - // - // The reason why we evaluate the arguments, is in the case where - // we try to pass a variable to a function, like: `saturate(@color)`. - // The function should receive the value, not the variable. - // - eval: function (env) { - var args = this.args.map(function (a) { return a.eval(env) }), - result; - - if (this.name in tree.functions) { // 1. - try { - result = tree.functions[this.name].apply(tree.functions, args); - if (result != null) { - return result; - } - } catch (e) { - throw { type: e.type || "Runtime", - message: "error evaluating function `" + this.name + "`" + - (e.message ? ': ' + e.message : ''), - index: this.index, filename: this.filename }; - } - } - - // 2. - return new(tree.Anonymous)(this.name + - "(" + args.map(function (a) { return a.toCSS(env) }).join(', ') + ")"); - }, - - toCSS: function (env) { - return this.eval(env).toCSS(); - } -}; - -})(require('../tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/color.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/color.js deleted file mode 100644 index 6adf317..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/color.js +++ /dev/null @@ -1,111 +0,0 @@ -(function (tree) { -// -// RGB Colors - #ff0014, #eee -// -tree.Color = function (rgb, a) { - // - // The end goal here, is to parse the arguments - // into an integer triplet, such as `128, 255, 0` - // - // This facilitates operations and conversions. - // - if (Array.isArray(rgb)) { - this.rgb = rgb; - } else if (rgb.length == 6) { - this.rgb = rgb.match(/.{2}/g).map(function (c) { - return parseInt(c, 16); - }); - } else { - this.rgb = rgb.split('').map(function (c) { - return parseInt(c + c, 16); - }); - } - this.alpha = typeof(a) === 'number' ? a : 1; -}; -tree.Color.prototype = { - eval: function () { return this }, - - // - // If we have some transparency, the only way to represent it - // is via `rgba`. Otherwise, we use the hex representation, - // which has better compatibility with older browsers. - // Values are capped between `0` and `255`, rounded and zero-padded. - // - toCSS: function () { - if (this.alpha < 1.0) { - return "rgba(" + this.rgb.map(function (c) { - return Math.round(c); - }).concat(this.alpha).join(', ') + ")"; - } else { - return '#' + this.rgb.map(function (i) { - i = Math.round(i); - i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); - return i.length === 1 ? '0' + i : i; - }).join(''); - } - }, - - // - // Operations have to be done per-channel, if not, - // channels will spill onto each other. Once we have - // our result, in the form of an integer triplet, - // we create a new Color node to hold the result. - // - operate: function (op, other) { - var result = []; - - if (! (other instanceof tree.Color)) { - other = other.toColor(); - } - - for (var c = 0; c < 3; c++) { - result[c] = tree.operate(op, this.rgb[c], other.rgb[c]); - } - return new(tree.Color)(result, this.alpha + other.alpha); - }, - - toHSL: function () { - var r = this.rgb[0] / 255, - g = this.rgb[1] / 255, - b = this.rgb[2] / 255, - a = this.alpha; - - var max = Math.max(r, g, b), min = Math.min(r, g, b); - var h, s, l = (max + min) / 2, d = max - min; - - if (max === min) { - h = s = 0; - } else { - s = l > 0.5 ? d / (2 - max - min) : d / (max + min); - - switch (max) { - case r: h = (g - b) / d + (g < b ? 6 : 0); break; - case g: h = (b - r) / d + 2; break; - case b: h = (r - g) / d + 4; break; - } - h /= 6; - } - return { h: h * 360, s: s, l: l, a: a }; - }, - toARGB: function () { - var argb = [Math.round(this.alpha * 255)].concat(this.rgb); - return '#' + argb.map(function (i) { - i = Math.round(i); - i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); - return i.length === 1 ? '0' + i : i; - }).join(''); - }, - compare: function (x) { - if (!x.rgb) { - return -1; - } - - return (x.rgb[0] === this.rgb[0] && - x.rgb[1] === this.rgb[1] && - x.rgb[2] === this.rgb[2] && - x.alpha === this.alpha) ? 0 : -1; - } -}; - - -})(require('../tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/comment.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/comment.js deleted file mode 100644 index f4a3384..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/comment.js +++ /dev/null @@ -1,14 +0,0 @@ -(function (tree) { - -tree.Comment = function (value, silent) { - this.value = value; - this.silent = !!silent; -}; -tree.Comment.prototype = { - toCSS: function (env) { - return env.compress ? '' : this.value; - }, - eval: function () { return this } -}; - -})(require('../tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/condition.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/condition.js deleted file mode 100644 index 6b79dc9..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/condition.js +++ /dev/null @@ -1,42 +0,0 @@ -(function (tree) { - -tree.Condition = function (op, l, r, i, negate) { - this.op = op.trim(); - this.lvalue = l; - this.rvalue = r; - this.index = i; - this.negate = negate; -}; -tree.Condition.prototype.eval = function (env) { - var a = this.lvalue.eval(env), - b = this.rvalue.eval(env); - - var i = this.index, result; - - var result = (function (op) { - switch (op) { - case 'and': - return a && b; - case 'or': - return a || b; - default: - if (a.compare) { - result = a.compare(b); - } else if (b.compare) { - result = b.compare(a); - } else { - throw { type: "Type", - message: "Unable to perform comparison", - index: i }; - } - switch (result) { - case -1: return op === '<' || op === '=<'; - case 0: return op === '=' || op === '>=' || op === '=<'; - case 1: return op === '>' || op === '>='; - } - } - })(this.op); - return this.negate ? !result : result; -}; - -})(require('../tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/dimension.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/dimension.js deleted file mode 100644 index 22241b8..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/dimension.js +++ /dev/null @@ -1,51 +0,0 @@ -(function (tree) { - -// -// A number with a unit -// -tree.Dimension = function (value, unit) { - this.value = parseFloat(value); - this.unit = unit || null; -}; - -tree.Dimension.prototype = { - eval: function () { return this }, - toColor: function () { - return new(tree.Color)([this.value, this.value, this.value]); - }, - toCSS: function () { - var css = this.value + this.unit; - return css; - }, - - // In an operation between two Dimensions, - // we default to the first Dimension's unit, - // so `1px + 2em` will yield `3px`. - // In the future, we could implement some unit - // conversions such that `100cm + 10mm` would yield - // `101cm`. - operate: function (op, other) { - return new(tree.Dimension) - (tree.operate(op, this.value, other.value), - this.unit || other.unit); - }, - - compare: function (other) { - if (other instanceof tree.Dimension) { - if (other.value > this.value) { - return -1; - } else if (other.value < this.value) { - return 1; - } else { - if (other.unit && this.unit !== other.unit) { - return -1; - } - return 0; - } - } else { - return -1; - } - } -}; - -})(require('../tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/directive.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/directive.js deleted file mode 100644 index 4d682e6..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/directive.js +++ /dev/null @@ -1,39 +0,0 @@ -(function (tree) { - -tree.Directive = function (name, value) { - this.name = name; - - if (Array.isArray(value)) { - this.ruleset = new(tree.Ruleset)([], value); - this.ruleset.allowImports = true; - } else { - this.value = value; - } -}; -tree.Directive.prototype = { - toCSS: function (ctx, env) { - if (this.ruleset) { - this.ruleset.root = true; - return this.name + (env.compress ? '{' : ' {\n ') + - this.ruleset.toCSS(ctx, env).trim().replace(/\n/g, '\n ') + - (env.compress ? '}': '\n}\n'); - } else { - return this.name + ' ' + this.value.toCSS() + ';\n'; - } - }, - eval: function (env) { - var evaldDirective = this; - if (this.ruleset) { - env.frames.unshift(this); - evaldDirective = new(tree.Directive)(this.name); - evaldDirective.ruleset = this.ruleset.eval(env); - env.frames.shift(); - } - return evaldDirective; - }, - variable: function (name) { return tree.Ruleset.prototype.variable.call(this.ruleset, name) }, - find: function () { return tree.Ruleset.prototype.find.apply(this.ruleset, arguments) }, - rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.ruleset) } -}; - -})(require('../tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/element.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/element.js deleted file mode 100644 index 4e251ee..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/element.js +++ /dev/null @@ -1,49 +0,0 @@ -(function (tree) { - -tree.Element = function (combinator, value, index) { - this.combinator = combinator instanceof tree.Combinator ? - combinator : new(tree.Combinator)(combinator); - - if (typeof(value) === 'string') { - this.value = value.trim(); - } else if (value) { - this.value = value; - } else { - this.value = ""; - } - this.index = index; -}; -tree.Element.prototype.eval = function (env) { - return new(tree.Element)(this.combinator, - this.value.eval ? this.value.eval(env) : this.value, - this.index); -}; -tree.Element.prototype.toCSS = function (env) { - var value = (this.value.toCSS ? this.value.toCSS(env) : this.value); - if (value == '' && this.combinator.value.charAt(0) == '&') { - return ''; - } else { - return this.combinator.toCSS(env || {}) + value; - } -}; - -tree.Combinator = function (value) { - if (value === ' ') { - this.value = ' '; - } else { - this.value = value ? value.trim() : ""; - } -}; -tree.Combinator.prototype.toCSS = function (env) { - return { - '' : '', - ' ' : ' ', - ':' : ' :', - '+' : env.compress ? '+' : ' + ', - '~' : env.compress ? '~' : ' ~ ', - '>' : env.compress ? '>' : ' > ', - '|' : env.compress ? '|' : ' | ' - }[this.value]; -}; - -})(require('../tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/expression.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/expression.js deleted file mode 100644 index fbfa9c5..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/expression.js +++ /dev/null @@ -1,23 +0,0 @@ -(function (tree) { - -tree.Expression = function (value) { this.value = value }; -tree.Expression.prototype = { - eval: function (env) { - if (this.value.length > 1) { - return new(tree.Expression)(this.value.map(function (e) { - return e.eval(env); - })); - } else if (this.value.length === 1) { - return this.value[0].eval(env); - } else { - return this; - } - }, - toCSS: function (env) { - return this.value.map(function (e) { - return e.toCSS ? e.toCSS(env) : ''; - }).join(' '); - } -}; - -})(require('../tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/import.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/import.js deleted file mode 100644 index 02594a7..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/import.js +++ /dev/null @@ -1,82 +0,0 @@ -(function (tree) { -// -// CSS @import node -// -// The general strategy here is that we don't want to wait -// for the parsing to be completed, before we start importing -// the file. That's because in the context of a browser, -// most of the time will be spent waiting for the server to respond. -// -// On creation, we push the import path to our import queue, though -// `import,push`, we also pass it a callback, which it'll call once -// the file has been fetched, and parsed. -// -tree.Import = function (path, imports, features, once, index, rootpath) { - var that = this; - - this.once = once; - this.index = index; - this._path = path; - this.features = features && new(tree.Value)(features); - this.rootpath = rootpath; - - // The '.less' extension is optional - if (path instanceof tree.Quoted) { - this.path = /(\.[a-z]*$)|([\?;].*)$/.test(path.value) ? path.value : path.value + '.less'; - } else { - this.path = path.value.value || path.value; - } - - this.css = /css([\?;].*)?$/.test(this.path); - - // Only pre-compile .less files - if (! this.css) { - imports.push(this.path, function (e, root, imported) { - if (e) { e.index = index } - if (imported && that.once) that.skip = imported; - that.root = root || new(tree.Ruleset)([], []); - }); - } -}; - -// -// The actual import node doesn't return anything, when converted to CSS. -// The reason is that it's used at the evaluation stage, so that the rules -// it imports can be treated like any other rules. -// -// In `eval`, we make sure all Import nodes get evaluated, recursively, so -// we end up with a flat structure, which can easily be imported in the parent -// ruleset. -// -tree.Import.prototype = { - toCSS: function (env) { - var features = this.features ? ' ' + this.features.toCSS(env) : ''; - - if (this.css) { - // Add the base path if the import is relative - if (typeof this._path.value === "string" && !/^(?:[a-z-]+:|\/)/.test(this._path.value)) { - this._path.value = this.rootpath + this._path.value; - } - return "@import " + this._path.toCSS() + features + ';\n'; - } else { - return ""; - } - }, - eval: function (env) { - var ruleset, features = this.features && this.features.eval(env); - - if (this.skip) return []; - - if (this.css) { - return this; - } else { - ruleset = new(tree.Ruleset)([], this.root.rules.slice(0)); - - ruleset.evalImports(env); - - return this.features ? new(tree.Media)(ruleset.rules, this.features.value) : ruleset.rules; - } - } -}; - -})(require('../tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/javascript.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/javascript.js deleted file mode 100644 index 772a31d..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/javascript.js +++ /dev/null @@ -1,51 +0,0 @@ -(function (tree) { - -tree.JavaScript = function (string, index, escaped) { - this.escaped = escaped; - this.expression = string; - this.index = index; -}; -tree.JavaScript.prototype = { - eval: function (env) { - var result, - that = this, - context = {}; - - var expression = this.expression.replace(/@\{([\w-]+)\}/g, function (_, name) { - return tree.jsify(new(tree.Variable)('@' + name, that.index).eval(env)); - }); - - try { - expression = new(Function)('return (' + expression + ')'); - } catch (e) { - throw { message: "JavaScript evaluation error: `" + expression + "`" , - index: this.index }; - } - - for (var k in env.frames[0].variables()) { - context[k.slice(1)] = { - value: env.frames[0].variables()[k].value, - toJS: function () { - return this.value.eval(env).toCSS(); - } - }; - } - - try { - result = expression.call(context); - } catch (e) { - throw { message: "JavaScript evaluation error: '" + e.name + ': ' + e.message + "'" , - index: this.index }; - } - if (typeof(result) === 'string') { - return new(tree.Quoted)('"' + result + '"', result, this.escaped, this.index); - } else if (Array.isArray(result)) { - return new(tree.Anonymous)(result.join(', ')); - } else { - return new(tree.Anonymous)(result); - } - } -}; - -})(require('../tree')); - diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/keyword.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/keyword.js deleted file mode 100644 index 701b79e..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/keyword.js +++ /dev/null @@ -1,19 +0,0 @@ -(function (tree) { - -tree.Keyword = function (value) { this.value = value }; -tree.Keyword.prototype = { - eval: function () { return this }, - toCSS: function () { return this.value }, - compare: function (other) { - if (other instanceof tree.Keyword) { - return other.value === this.value ? 0 : 1; - } else { - return -1; - } - } -}; - -tree.True = new(tree.Keyword)('true'); -tree.False = new(tree.Keyword)('false'); - -})(require('../tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/media.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/media.js deleted file mode 100644 index d2a5347..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/media.js +++ /dev/null @@ -1,121 +0,0 @@ -(function (tree) { - -tree.Media = function (value, features) { - var selectors = this.emptySelectors(); - - this.features = new(tree.Value)(features); - this.ruleset = new(tree.Ruleset)(selectors, value); - this.ruleset.allowImports = true; -}; -tree.Media.prototype = { - toCSS: function (ctx, env) { - var features = this.features.toCSS(env); - - this.ruleset.root = (ctx.length === 0 || ctx[0].multiMedia); - return '@media ' + features + (env.compress ? '{' : ' {\n ') + - this.ruleset.toCSS(ctx, env).trim().replace(/\n/g, '\n ') + - (env.compress ? '}': '\n}\n'); - }, - eval: function (env) { - if (!env.mediaBlocks) { - env.mediaBlocks = []; - env.mediaPath = []; - } - - var media = new(tree.Media)([], []); - if(this.debugInfo) { - this.ruleset.debugInfo = this.debugInfo; - media.debugInfo = this.debugInfo; - } - media.features = this.features.eval(env); - - env.mediaPath.push(media); - env.mediaBlocks.push(media); - - env.frames.unshift(this.ruleset); - media.ruleset = this.ruleset.eval(env); - env.frames.shift(); - - env.mediaPath.pop(); - - return env.mediaPath.length === 0 ? media.evalTop(env) : - media.evalNested(env) - }, - variable: function (name) { return tree.Ruleset.prototype.variable.call(this.ruleset, name) }, - find: function () { return tree.Ruleset.prototype.find.apply(this.ruleset, arguments) }, - rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.ruleset) }, - emptySelectors: function() { - var el = new(tree.Element)('', '&', 0); - return [new(tree.Selector)([el])]; - }, - - evalTop: function (env) { - var result = this; - - // Render all dependent Media blocks. - if (env.mediaBlocks.length > 1) { - var selectors = this.emptySelectors(); - result = new(tree.Ruleset)(selectors, env.mediaBlocks); - result.multiMedia = true; - } - - delete env.mediaBlocks; - delete env.mediaPath; - - return result; - }, - evalNested: function (env) { - var i, value, - path = env.mediaPath.concat([this]); - - // Extract the media-query conditions separated with `,` (OR). - for (i = 0; i < path.length; i++) { - value = path[i].features instanceof tree.Value ? - path[i].features.value : path[i].features; - path[i] = Array.isArray(value) ? value : [value]; - } - - // Trace all permutations to generate the resulting media-query. - // - // (a, b and c) with nested (d, e) -> - // a and d - // a and e - // b and c and d - // b and c and e - this.features = new(tree.Value)(this.permute(path).map(function (path) { - path = path.map(function (fragment) { - return fragment.toCSS ? fragment : new(tree.Anonymous)(fragment); - }); - - for(i = path.length - 1; i > 0; i--) { - path.splice(i, 0, new(tree.Anonymous)("and")); - } - - return new(tree.Expression)(path); - })); - - // Fake a tree-node that doesn't output anything. - return new(tree.Ruleset)([], []); - }, - permute: function (arr) { - if (arr.length === 0) { - return []; - } else if (arr.length === 1) { - return arr[0]; - } else { - var result = []; - var rest = this.permute(arr.slice(1)); - for (var i = 0; i < rest.length; i++) { - for (var j = 0; j < arr[0].length; j++) { - result.push([arr[0][j]].concat(rest[i])); - } - } - return result; - } - }, - bubbleSelectors: function (selectors) { - this.ruleset = new(tree.Ruleset)(selectors.slice(0), [this.ruleset]); - } -}; - -})(require('../tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/mixin.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/mixin.js deleted file mode 100644 index 0533036..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/mixin.js +++ /dev/null @@ -1,212 +0,0 @@ -(function (tree) { - -tree.mixin = {}; -tree.mixin.Call = function (elements, args, index, filename, important) { - this.selector = new(tree.Selector)(elements); - this.arguments = args; - this.index = index; - this.filename = filename; - this.important = important; -}; -tree.mixin.Call.prototype = { - eval: function (env) { - var mixins, mixin, args, rules = [], match = false, i, m, f, isRecursive, isOneFound; - - args = this.arguments && this.arguments.map(function (a) { - return { name: a.name, value: a.value.eval(env) }; - }); - - for (i = 0; i < env.frames.length; i++) { - if ((mixins = env.frames[i].find(this.selector)).length > 0) { - isOneFound = true; - for (m = 0; m < mixins.length; m++) { - mixin = mixins[m]; - isRecursive = false; - for(f = 0; f < env.frames.length; f++) { - if ((!(mixin instanceof tree.mixin.Definition)) && mixin === (env.frames[f].originalRuleset || env.frames[f])) { - isRecursive = true; - break; - } - } - if (isRecursive) { - continue; - } - if (mixin.matchArgs(args, env)) { - if (!mixin.matchCondition || mixin.matchCondition(args, env)) { - try { - Array.prototype.push.apply( - rules, mixin.eval(env, args, this.important).rules); - } catch (e) { - throw { message: e.message, index: this.index, filename: this.filename, stack: e.stack }; - } - } - match = true; - } - } - if (match) { - return rules; - } - } - } - if (isOneFound) { - throw { type: 'Runtime', - message: 'No matching definition was found for `' + - this.selector.toCSS().trim() + '(' + - (args ? args.map(function (a) { - var argValue = ""; - if (a.name) { - argValue += a.name + ":"; - } - if (a.value.toCSS) { - argValue += a.value.toCSS(); - } else { - argValue += "???"; - } - return argValue; - }).join(', ') : "") + ")`", - index: this.index, filename: this.filename }; - } else { - throw { type: 'Name', - message: this.selector.toCSS().trim() + " is undefined", - index: this.index, filename: this.filename }; - } - } -}; - -tree.mixin.Definition = function (name, params, rules, condition, variadic) { - this.name = name; - this.selectors = [new(tree.Selector)([new(tree.Element)(null, name)])]; - this.params = params; - this.condition = condition; - this.variadic = variadic; - this.arity = params.length; - this.rules = rules; - this._lookups = {}; - this.required = params.reduce(function (count, p) { - if (!p.name || (p.name && !p.value)) { return count + 1 } - else { return count } - }, 0); - this.parent = tree.Ruleset.prototype; - this.frames = []; -}; -tree.mixin.Definition.prototype = { - toCSS: function () { return "" }, - variable: function (name) { return this.parent.variable.call(this, name) }, - variables: function () { return this.parent.variables.call(this) }, - find: function () { return this.parent.find.apply(this, arguments) }, - rulesets: function () { return this.parent.rulesets.apply(this) }, - - evalParams: function (env, mixinEnv, args, evaldArguments) { - var frame = new(tree.Ruleset)(null, []), varargs, arg, params = this.params.slice(0), i, j, val, name, isNamedFound, argIndex; - - if (args) { - args = args.slice(0); - - for(i = 0; i < args.length; i++) { - arg = args[i]; - if (name = (arg && arg.name)) { - isNamedFound = false; - for(j = 0; j < params.length; j++) { - if (!evaldArguments[j] && name === params[j].name) { - evaldArguments[j] = arg.value.eval(env); - frame.rules.unshift(new(tree.Rule)(name, arg.value.eval(env))); - isNamedFound = true; - break; - } - } - if (isNamedFound) { - args.splice(i, 1); - i--; - continue; - } else { - throw { type: 'Runtime', message: "Named argument for " + this.name + - ' ' + args[i].name + ' not found' }; - } - } - } - } - argIndex = 0; - for (i = 0; i < params.length; i++) { - if (evaldArguments[i]) continue; - - arg = args && args[argIndex]; - - if (name = params[i].name) { - if (params[i].variadic && args) { - varargs = []; - for (j = argIndex; j < args.length; j++) { - varargs.push(args[j].value.eval(env)); - } - frame.rules.unshift(new(tree.Rule)(name, new(tree.Expression)(varargs).eval(env))); - } else { - val = arg && arg.value; - if (val) { - val = val.eval(env); - } else if (params[i].value) { - val = params[i].value.eval(mixinEnv); - } else { - throw { type: 'Runtime', message: "wrong number of arguments for " + this.name + - ' (' + args.length + ' for ' + this.arity + ')' }; - } - - frame.rules.unshift(new(tree.Rule)(name, val)); - evaldArguments[i] = val; - } - } - - if (params[i].variadic && args) { - for (j = argIndex; j < args.length; j++) { - evaldArguments[j] = args[j].value.eval(env); - } - } - argIndex++; - } - - return frame; - }, - eval: function (env, args, important) { - var _arguments = [], - mixinFrames = this.frames.concat(env.frames), - frame = this.evalParams(env, {frames: mixinFrames}, args, _arguments), - context, rules, start, ruleset; - - frame.rules.unshift(new(tree.Rule)('@arguments', new(tree.Expression)(_arguments).eval(env))); - - rules = important ? - this.parent.makeImportant.apply(this).rules : this.rules.slice(0); - - ruleset = new(tree.Ruleset)(null, rules).eval({ - frames: [this, frame].concat(mixinFrames) - }); - ruleset.originalRuleset = this; - return ruleset; - }, - matchCondition: function (args, env) { - if (this.condition && !this.condition.eval({ - frames: [this.evalParams(env, {frames: this.frames.concat(env.frames)}, args, [])].concat(env.frames) - })) { return false } - return true; - }, - matchArgs: function (args, env) { - var argsLength = (args && args.length) || 0, len, frame; - - if (! this.variadic) { - if (argsLength < this.required) { return false } - if (argsLength > this.params.length) { return false } - if ((this.required > 0) && (argsLength > this.params.length)) { return false } - } - - len = Math.min(argsLength, this.arity); - - for (var i = 0; i < len; i++) { - if (!this.params[i].name && !this.params[i].variadic) { - if (args[i].value.eval(env).toCSS() != this.params[i].value.eval(env).toCSS()) { - return false; - } - } - } - return true; - } -}; - -})(require('../tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/operation.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/operation.js deleted file mode 100644 index 3c4f093..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/operation.js +++ /dev/null @@ -1,37 +0,0 @@ -(function (tree) { - -tree.Operation = function (op, operands) { - this.op = op.trim(); - this.operands = operands; -}; -tree.Operation.prototype.eval = function (env) { - var a = this.operands[0].eval(env), - b = this.operands[1].eval(env), - temp; - - if (a instanceof tree.Dimension && b instanceof tree.Color) { - if (this.op === '*' || this.op === '+') { - temp = b, b = a, a = temp; - } else { - throw { name: "OperationError", - message: "Can't substract or divide a color from a number" }; - } - } - if (!a.operate) { - throw { name: "OperationError", - message: "Operation on an invalid type" }; - } - - return a.operate(this.op, b); -}; - -tree.operate = function (op, a, b) { - switch (op) { - case '+': return a + b; - case '-': return a - b; - case '*': return a * b; - case '/': return a / b; - } -}; - -})(require('../tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/paren.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/paren.js deleted file mode 100644 index 384a43c..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/paren.js +++ /dev/null @@ -1,16 +0,0 @@ - -(function (tree) { - -tree.Paren = function (node) { - this.value = node; -}; -tree.Paren.prototype = { - toCSS: function (env) { - return '(' + this.value.toCSS(env) + ')'; - }, - eval: function (env) { - return new(tree.Paren)(this.value.eval(env)); - } -}; - -})(require('../tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/quoted.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/quoted.js deleted file mode 100644 index 4ec6713..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/quoted.js +++ /dev/null @@ -1,43 +0,0 @@ -(function (tree) { - -tree.Quoted = function (str, content, escaped, i) { - this.escaped = escaped; - this.value = content || ''; - this.quote = str.charAt(0); - this.index = i; -}; -tree.Quoted.prototype = { - toCSS: function () { - if (this.escaped) { - return this.value; - } else { - return this.quote + this.value + this.quote; - } - }, - eval: function (env) { - var that = this; - var value = this.value.replace(/`([^`]+)`/g, function (_, exp) { - return new(tree.JavaScript)(exp, that.index, true).eval(env).value; - }).replace(/@\{([\w-]+)\}/g, function (_, name) { - var v = new(tree.Variable)('@' + name, that.index).eval(env); - return (v instanceof tree.Quoted) ? v.value : v.toCSS(); - }); - return new(tree.Quoted)(this.quote + value + this.quote, value, this.escaped, this.index); - }, - compare: function (x) { - if (!x.toCSS) { - return -1; - } - - var left = this.toCSS(), - right = x.toCSS(); - - if (left === right) { - return 0; - } - - return left < right ? -1 : 1; - } -}; - -})(require('../tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/ratio.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/ratio.js deleted file mode 100644 index f7622fb..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/ratio.js +++ /dev/null @@ -1,13 +0,0 @@ -(function (tree) { - -tree.Ratio = function (value) { - this.value = value; -}; -tree.Ratio.prototype = { - toCSS: function (env) { - return this.value; - }, - eval: function () { return this } -}; - -})(require('../tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/rule.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/rule.js deleted file mode 100644 index 8990fef..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/rule.js +++ /dev/null @@ -1,49 +0,0 @@ -(function (tree) { - -tree.Rule = function (name, value, important, index, inline) { - this.name = name; - this.value = (value instanceof tree.Value) ? value : new(tree.Value)([value]); - this.important = important ? ' ' + important.trim() : ''; - this.index = index; - this.inline = inline || false; - - if (name.charAt(0) === '@') { - this.variable = true; - } else { this.variable = false } -}; -tree.Rule.prototype.toCSS = function (env) { - if (this.variable) { return "" } - else { - return this.name + (env.compress ? ':' : ': ') + - this.value.toCSS(env) + - this.important + (this.inline ? "" : ";"); - } -}; - -tree.Rule.prototype.eval = function (context) { - return new(tree.Rule)(this.name, - this.value.eval(context), - this.important, - this.index, this.inline); -}; - -tree.Rule.prototype.makeImportant = function () { - return new(tree.Rule)(this.name, - this.value, - "!important", - this.index, this.inline); -}; - -tree.Shorthand = function (a, b) { - this.a = a; - this.b = b; -}; - -tree.Shorthand.prototype = { - toCSS: function (env) { - return this.a.toCSS(env) + "/" + this.b.toCSS(env); - }, - eval: function () { return this } -}; - -})(require('../tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/ruleset.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/ruleset.js deleted file mode 100644 index a198617..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/ruleset.js +++ /dev/null @@ -1,414 +0,0 @@ -(function (tree) { - -tree.Ruleset = function (selectors, rules, strictImports) { - this.selectors = selectors; - this.rules = rules; - this._lookups = {}; - this.strictImports = strictImports; -}; -tree.Ruleset.prototype = { - eval: function (env) { - var selectors = this.selectors && this.selectors.map(function (s) { return s.eval(env) }); - var ruleset = new(tree.Ruleset)(selectors, this.rules.slice(0), this.strictImports); - var rules; - - ruleset.originalRuleset = this; - ruleset.root = this.root; - ruleset.allowImports = this.allowImports; - - if(this.debugInfo) { - ruleset.debugInfo = this.debugInfo; - } - - // push the current ruleset to the frames stack - env.frames.unshift(ruleset); - - // Evaluate imports - if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) { - ruleset.evalImports(env); - } - - // Store the frames around mixin definitions, - // so they can be evaluated like closures when the time comes. - for (var i = 0; i < ruleset.rules.length; i++) { - if (ruleset.rules[i] instanceof tree.mixin.Definition) { - ruleset.rules[i].frames = env.frames.slice(0); - } - } - - var mediaBlockCount = (env.mediaBlocks && env.mediaBlocks.length) || 0; - - // Evaluate mixin calls. - for (var i = 0; i < ruleset.rules.length; i++) { - if (ruleset.rules[i] instanceof tree.mixin.Call) { - rules = ruleset.rules[i].eval(env); - ruleset.rules.splice.apply(ruleset.rules, [i, 1].concat(rules)); - i += rules.length-1; - ruleset.resetCache(); - } - } - - // Evaluate everything else - for (var i = 0, rule; i < ruleset.rules.length; i++) { - rule = ruleset.rules[i]; - - if (! (rule instanceof tree.mixin.Definition)) { - ruleset.rules[i] = rule.eval ? rule.eval(env) : rule; - } - } - - // Pop the stack - env.frames.shift(); - - if (env.mediaBlocks) { - for(var i = mediaBlockCount; i < env.mediaBlocks.length; i++) { - env.mediaBlocks[i].bubbleSelectors(selectors); - } - } - - return ruleset; - }, - evalImports: function(env) { - var i, rules; - for (i = 0; i < this.rules.length; i++) { - if (this.rules[i] instanceof tree.Import) { - rules = this.rules[i].eval(env); - if (typeof rules.length === "number") { - this.rules.splice.apply(this.rules, [i, 1].concat(rules)); - i+= rules.length-1; - } else { - this.rules.splice(i, 1, rules); - } - this.resetCache(); - } - } - }, - makeImportant: function() { - return new tree.Ruleset(this.selectors, this.rules.map(function (r) { - if (r.makeImportant) { - return r.makeImportant(); - } else { - return r; - } - }), this.strictImports); - }, - matchArgs: function (args) { - return !args || args.length === 0; - }, - resetCache: function () { - this._rulesets = null; - this._variables = null; - this._lookups = {}; - }, - variables: function () { - if (this._variables) { return this._variables } - else { - return this._variables = this.rules.reduce(function (hash, r) { - if (r instanceof tree.Rule && r.variable === true) { - hash[r.name] = r; - } - return hash; - }, {}); - } - }, - variable: function (name) { - return this.variables()[name]; - }, - rulesets: function () { - if (this._rulesets) { return this._rulesets } - else { - return this._rulesets = this.rules.filter(function (r) { - return (r instanceof tree.Ruleset) || (r instanceof tree.mixin.Definition); - }); - } - }, - find: function (selector, self) { - self = self || this; - var rules = [], rule, match, - key = selector.toCSS(); - - if (key in this._lookups) { return this._lookups[key] } - - this.rulesets().forEach(function (rule) { - if (rule !== self) { - for (var j = 0; j < rule.selectors.length; j++) { - if (match = selector.match(rule.selectors[j])) { - if (selector.elements.length > rule.selectors[j].elements.length) { - Array.prototype.push.apply(rules, rule.find( - new(tree.Selector)(selector.elements.slice(1)), self)); - } else { - rules.push(rule); - } - break; - } - } - } - }); - return this._lookups[key] = rules; - }, - // - // Entry point for code generation - // - // `context` holds an array of arrays. - // - toCSS: function (context, env) { - var css = [], // The CSS output - rules = [], // node.Rule instances - _rules = [], // - rulesets = [], // node.Ruleset instances - paths = [], // Current selectors - selector, // The fully rendered selector - debugInfo, // Line number debugging - rule; - - if (! this.root) { - this.joinSelectors(paths, context, this.selectors); - } - - // Compile rules and rulesets - for (var i = 0; i < this.rules.length; i++) { - rule = this.rules[i]; - - if (rule.rules || (rule instanceof tree.Media)) { - rulesets.push(rule.toCSS(paths, env)); - } else if (rule instanceof tree.Directive) { - var cssValue = rule.toCSS(paths, env); - // Output only the first @charset definition as such - convert the others - // to comments in case debug is enabled - if (rule.name === "@charset") { - // Only output the debug info together with subsequent @charset definitions - // a comment (or @media statement) before the actual @charset directive would - // be considered illegal css as it has to be on the first line - if (env.charset) { - if (rule.debugInfo) { - rulesets.push(tree.debugInfo(env, rule)); - rulesets.push(new tree.Comment("/* "+cssValue.replace(/\n/g, "")+" */\n").toCSS(env)); - } - continue; - } - env.charset = true; - } - rulesets.push(cssValue); - } else if (rule instanceof tree.Comment) { - if (!rule.silent) { - if (this.root) { - rulesets.push(rule.toCSS(env)); - } else { - rules.push(rule.toCSS(env)); - } - } - } else { - if (rule.toCSS && !rule.variable) { - rules.push(rule.toCSS(env)); - } else if (rule.value && !rule.variable) { - rules.push(rule.value.toString()); - } - } - } - - rulesets = rulesets.join(''); - - // If this is the root node, we don't render - // a selector, or {}. - // Otherwise, only output if this ruleset has rules. - if (this.root) { - css.push(rules.join(env.compress ? '' : '\n')); - } else { - if (rules.length > 0) { - debugInfo = tree.debugInfo(env, this); - selector = paths.map(function (p) { - return p.map(function (s) { - return s.toCSS(env); - }).join('').trim(); - }).join(env.compress ? ',' : ',\n'); - - // Remove duplicates - for (var i = rules.length - 1; i >= 0; i--) { - if (_rules.indexOf(rules[i]) === -1) { - _rules.unshift(rules[i]); - } - } - rules = _rules; - - css.push(debugInfo + selector + - (env.compress ? '{' : ' {\n ') + - rules.join(env.compress ? '' : '\n ') + - (env.compress ? '}' : '\n}\n')); - } - } - css.push(rulesets); - - return css.join('') + (env.compress ? '\n' : ''); - }, - - joinSelectors: function (paths, context, selectors) { - for (var s = 0; s < selectors.length; s++) { - this.joinSelector(paths, context, selectors[s]); - } - }, - - joinSelector: function (paths, context, selector) { - - var i, j, k, - hasParentSelector, newSelectors, el, sel, parentSel, - newSelectorPath, afterParentJoin, newJoinedSelector, - newJoinedSelectorEmpty, lastSelector, currentElements, - selectorsMultiplied; - - for (i = 0; i < selector.elements.length; i++) { - el = selector.elements[i]; - if (el.value === '&') { - hasParentSelector = true; - } - } - - if (!hasParentSelector) { - if (context.length > 0) { - for(i = 0; i < context.length; i++) { - paths.push(context[i].concat(selector)); - } - } - else { - paths.push([selector]); - } - return; - } - - // The paths are [[Selector]] - // The first list is a list of comma seperated selectors - // The inner list is a list of inheritance seperated selectors - // e.g. - // .a, .b { - // .c { - // } - // } - // == [[.a] [.c]] [[.b] [.c]] - // - - // the elements from the current selector so far - currentElements = []; - // the current list of new selectors to add to the path. - // We will build it up. We initiate it with one empty selector as we "multiply" the new selectors - // by the parents - newSelectors = [[]]; - - for (i = 0; i < selector.elements.length; i++) { - el = selector.elements[i]; - // non parent reference elements just get added - if (el.value !== "&") { - currentElements.push(el); - } else { - // the new list of selectors to add - selectorsMultiplied = []; - - // merge the current list of non parent selector elements - // on to the current list of selectors to add - if (currentElements.length > 0) { - this.mergeElementsOnToSelectors(currentElements, newSelectors); - } - - // loop through our current selectors - for(j = 0; j < newSelectors.length; j++) { - sel = newSelectors[j]; - // if we don't have any parent paths, the & might be in a mixin so that it can be used - // whether there are parents or not - if (context.length == 0) { - // the combinator used on el should now be applied to the next element instead so that - // it is not lost - if (sel.length > 0) { - sel[0].elements = sel[0].elements.slice(0); - sel[0].elements.push(new(tree.Element)(el.combinator, '', 0)); //new Element(el.Combinator, "")); - } - selectorsMultiplied.push(sel); - } - else { - // and the parent selectors - for(k = 0; k < context.length; k++) { - parentSel = context[k]; - // We need to put the current selectors - // then join the last selector's elements on to the parents selectors - - // our new selector path - newSelectorPath = []; - // selectors from the parent after the join - afterParentJoin = []; - newJoinedSelectorEmpty = true; - - //construct the joined selector - if & is the first thing this will be empty, - // if not newJoinedSelector will be the last set of elements in the selector - if (sel.length > 0) { - newSelectorPath = sel.slice(0); - lastSelector = newSelectorPath.pop(); - newJoinedSelector = new(tree.Selector)(lastSelector.elements.slice(0)); - newJoinedSelectorEmpty = false; - } - else { - newJoinedSelector = new(tree.Selector)([]); - } - - //put together the parent selectors after the join - if (parentSel.length > 1) { - afterParentJoin = afterParentJoin.concat(parentSel.slice(1)); - } - - if (parentSel.length > 0) { - newJoinedSelectorEmpty = false; - - // join the elements so far with the first part of the parent - newJoinedSelector.elements.push(new(tree.Element)(el.combinator, parentSel[0].elements[0].value, 0)); - newJoinedSelector.elements = newJoinedSelector.elements.concat(parentSel[0].elements.slice(1)); - } - - if (!newJoinedSelectorEmpty) { - // now add the joined selector - newSelectorPath.push(newJoinedSelector); - } - - // and the rest of the parent - newSelectorPath = newSelectorPath.concat(afterParentJoin); - - // add that to our new set of selectors - selectorsMultiplied.push(newSelectorPath); - } - } - } - - // our new selectors has been multiplied, so reset the state - newSelectors = selectorsMultiplied; - currentElements = []; - } - } - - // if we have any elements left over (e.g. .a& .b == .b) - // add them on to all the current selectors - if (currentElements.length > 0) { - this.mergeElementsOnToSelectors(currentElements, newSelectors); - } - - for(i = 0; i < newSelectors.length; i++) { - paths.push(newSelectors[i]); - } - }, - - mergeElementsOnToSelectors: function(elements, selectors) { - var i, sel; - - if (selectors.length == 0) { - selectors.push([ new(tree.Selector)(elements) ]); - return; - } - - for(i = 0; i < selectors.length; i++) { - sel = selectors[i]; - - // if the previous thing in sel is a parent this needs to join on to it - if (sel.length > 0) { - sel[sel.length - 1] = new(tree.Selector)(sel[sel.length - 1].elements.concat(elements)); - } - else { - sel.push(new(tree.Selector)(elements)); - } - } - } -}; -})(require('../tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/selector.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/selector.js deleted file mode 100644 index 1ce2c30..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/selector.js +++ /dev/null @@ -1,52 +0,0 @@ -(function (tree) { - -tree.Selector = function (elements) { - this.elements = elements; -}; -tree.Selector.prototype.match = function (other) { - var elements = this.elements, - len = elements.length, - oelements, olen, max, i; - - oelements = other.elements.slice( - (other.elements.length && other.elements[0].value === "&") ? 1 : 0); - olen = oelements.length; - max = Math.min(len, olen) - - if (olen === 0 || len < olen) { - return false; - } else { - for (i = 0; i < max; i++) { - if (elements[i].value !== oelements[i].value) { - return false; - } - } - } - return true; -}; -tree.Selector.prototype.eval = function (env) { - return new(tree.Selector)(this.elements.map(function (e) { - return e.eval(env); - })); -}; -tree.Selector.prototype.toCSS = function (env) { - if (this._css) { return this._css } - - if (this.elements[0].combinator.value === "") { - this._css = ' '; - } else { - this._css = ''; - } - - this._css += this.elements.map(function (e) { - if (typeof(e) === 'string') { - return ' ' + e.trim(); - } else { - return e.toCSS(env); - } - }).join(''); - - return this._css; -}; - -})(require('../tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/unicode-descriptor.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/unicode-descriptor.js deleted file mode 100644 index 79b6b23..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/unicode-descriptor.js +++ /dev/null @@ -1,13 +0,0 @@ -(function (tree) { - -tree.UnicodeDescriptor = function (value) { - this.value = value; -}; -tree.UnicodeDescriptor.prototype = { - toCSS: function (env) { - return this.value; - }, - eval: function () { return this } -}; - -})(require('../tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/url.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/url.js deleted file mode 100644 index e37dbef..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/url.js +++ /dev/null @@ -1,27 +0,0 @@ -(function (tree) { - -tree.URL = function (val, rootpath) { - this.value = val; - this.rootpath = rootpath; -}; -tree.URL.prototype = { - toCSS: function () { - return "url(" + this.value.toCSS() + ")"; - }, - eval: function (ctx) { - var val = this.value.eval(ctx), rootpath; - - // Add the base path if the URL is relative - if (typeof val.value === "string" && !/^(?:[a-z-]+:|\/)/.test(val.value)) { - rootpath = this.rootpath; - if (!val.quote) { - rootpath = rootpath.replace(/[\(\)'"\s]/g, function(match) { return "\\"+match; }); - } - val.value = rootpath + val.value; - } - - return new(tree.URL)(val, this.rootpath); - } -}; - -})(require('../tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/value.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/value.js deleted file mode 100644 index 3c1eb29..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/value.js +++ /dev/null @@ -1,24 +0,0 @@ -(function (tree) { - -tree.Value = function (value) { - this.value = value; - this.is = 'value'; -}; -tree.Value.prototype = { - eval: function (env) { - if (this.value.length === 1) { - return this.value[0].eval(env); - } else { - return new(tree.Value)(this.value.map(function (v) { - return v.eval(env); - })); - } - }, - toCSS: function (env) { - return this.value.map(function (e) { - return e.toCSS(env); - }).join(env.compress ? ',' : ', '); - } -}; - -})(require('../tree')); diff --git a/node_modules/less-middleware/node_modules/less/lib/less/tree/variable.js b/node_modules/less-middleware/node_modules/less/lib/less/tree/variable.js deleted file mode 100644 index 674ca8e..0000000 --- a/node_modules/less-middleware/node_modules/less/lib/less/tree/variable.js +++ /dev/null @@ -1,38 +0,0 @@ -(function (tree) { - -tree.Variable = function (name, index, file) { this.name = name, this.index = index, this.file = file }; -tree.Variable.prototype = { - eval: function (env) { - var variable, v, name = this.name; - - if (name.indexOf('@@') == 0) { - name = '@' + new(tree.Variable)(name.slice(1)).eval(env).value; - } - - if (this.evaluating) { - throw { type: 'Name', - message: "Recursive variable definition for " + name, - filename: this.file, - index: this.index }; - } - - this.evaluating = true; - - if (variable = tree.find(env.frames, function (frame) { - if (v = frame.variable(name)) { - return v.value.eval(env); - } - })) { - this.evaluating = false; - return variable; - } - else { - throw { type: 'Name', - message: "variable " + name + " is undefined", - filename: this.file, - index: this.index }; - } - } -}; - -})(require('../tree')); diff --git a/node_modules/less-middleware/node_modules/less/node_modules/.bin/ycssmin b/node_modules/less-middleware/node_modules/less/node_modules/.bin/ycssmin deleted file mode 120000 index 51ff920..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/.bin/ycssmin +++ /dev/null @@ -1 +0,0 @@ -../ycssmin/bin/cssmin \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/.npmignore b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/.npmignore deleted file mode 100644 index 2833b69..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/.npmignore +++ /dev/null @@ -1,11 +0,0 @@ -node-cssmin.esproj -**/npm-debug.log -node_modules/ -coverage/ -tmp/ -CVS/ -.DS_Store -.*.swp -.svn -*~ -.com.apple.timemachine.supported diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/.travis.yml b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/.travis.yml deleted file mode 100644 index c2b7b8e..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -language: node_js -node_js: - - 0.6 - - 0.8 - - 0.9 -branches: - only: - - master diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/LICENSE b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/LICENSE deleted file mode 100644 index 22960b6..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -Copyright 2012 Yahoo! Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the Yahoo! Inc. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL YAHOO! INC. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/Makefile b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/Makefile deleted file mode 100644 index 3d9707d..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -all: - npm -g i . - -lint: - npm run-script pretest - -test: - npm test - -coverage: test - rm -rRf ../ycssmin-pages/* - cp -R ./coverage/lcov-report/* ../ycssmin-pages/ - -.PHONY: lint coverage test diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/README.md b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/README.md deleted file mode 100644 index e21544b..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/README.md +++ /dev/null @@ -1,97 +0,0 @@ -CSSMin -====== - -This project is a fork of [jbleuzen/node-cssmin](https://github.com/jbleuzen/node-cssmin). - -It was originally based on the javascript for of the css minification tool used inside of -[YUICompressor](https://github.com/yui/yuicompressor) based on code from Stoyan Stefanov and Isaac Schlueter. - -We forked this project in order to maintain and up keep it on a regular basis. - - -Installation ------------- - -You can either download the plugin and unzip it into to your project folder or you can use npm to install the `ycssmin` package. - -`npm -g i ycssmin` - -Build Status ------------- - -[![Build Status](https://secure.travis-ci.org/yui/ycssmin.png)](http://travis-ci.org/yui/ycssmin) - -Testing -------- - -Clone this repo: - -`npm test` - -Code Coverage -------------- - -We are using [istanbul](https://github.com/gotwarlost/istanbul) to provide code coverage, to view the report: - -`npm test` - -Then open `./coverage/lcov-report` - -We also publish the [latest here](http://yui.github.com/ycssmin/). - -We ask that all patches have a test attached and full coverage. - -Usage ------ - -The module exports the cssmin function, so you can use it with: - -`var cssmin = require('ycssmin').cssmin;` - -The function cssmin takes two arguments: -* `input` : the CSS content you want to minimize. -* `linebreakpos` : the number of characters before the end of the line. If empty, the output will have only one line. - -Example : - -```javascript -var fs = require('fs'), - cssmin = require('ycssmin').cssmin, - css = fs.readFileSync("/Any/Random/CSS/File.css", encoding='utf8'), - min = cssmin(css); - -console.log(min); -``` - -License -------- - - Copyright 2012 Yahoo! Inc. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the Yahoo! Inc. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL YAHOO! INC. BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Thanks ------- - -Thanks to Johan BLEUZEN for originally porting this to node.js diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/bin/cssmin b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/bin/cssmin deleted file mode 100755 index ccff8f0..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/bin/cssmin +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env node -// -*- js -*- - -var args = process.argv.slice(2), - cssmin = require('../cssmin').cssmin; - -function squeeze_out(css_in) { - process.stdout.write( cssmin(css_in) ); -} - -if (args.length) { - require("fs").readFile( args[0], "utf8", function(err, css_in) { - if (err) { - throw err; - } - else { - squeeze_out(css_in); - } - } ); -} -else { - var stdin = process.openStdin(); - stdin.setEncoding("utf8"); - var css_in = ""; - stdin.on("end", function() { squeeze_out(css_in) }); - stdin.on("data", function(chunk) { css_in += chunk }); -} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/cssmin.js b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/cssmin.js deleted file mode 100755 index 4aec1bf..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/cssmin.js +++ /dev/null @@ -1,361 +0,0 @@ -/*jshint maxlen: 250 */ - -/** - * node-cssmin - * A simple module for Node.js that minify CSS - * Author : Johan Bleuzen - * Forked and modified by YUI - */ - -/** - * cssmin.js - * Author: Stoyan Stefanov - http://phpied.com/ - * This is a JavaScript port of the CSS minification tool - * distributed with YUICompressor, itself a port - * of the cssmin utility by Isaac Schlueter - http://foohack.com/ - * Permission is hereby granted to use the JavaScript version under the same - * conditions as the YUICompressor (original YUICompressor note below). - */ - -/* -* YUI Compressor -* http://yui.github.com/yuicompressor/ -* Author: Julien Lecomte - http://www.julienlecomte.net/ -* Copyright (c) 2011 Yahoo! Inc. All rights reserved. -* The copyrights embodied in the content of this file are licensed -* by Yahoo! Inc. under the BSD (revised) open source license. -*/ - - -var _compressHexColors = function(css) { - - // Look for hex colors inside { ... } (to avoid IDs) and which don't have a =, or a " in front of them (to avoid filters) - var pattern = /(\=\s*?["']?)?#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])(\}|[^0-9a-f{][^{]*?\})/gi, - m, - index = 0, - isFilter, - sb = []; - - while ((m = pattern.exec(css)) !== null) { - - sb.push(css.substring(index, m.index)); - - isFilter = m[1]; - - if (isFilter) { - // Restore, maintain case, otherwise filter will break - sb.push(m[1] + "#" + (m[2] + m[3] + m[4] + m[5] + m[6] + m[7])); - } else { - if (m[2].toLowerCase() === m[3].toLowerCase() && - m[4].toLowerCase() === m[5].toLowerCase() && - m[6].toLowerCase() === m[7].toLowerCase()) { - - // Compress. - sb.push("#" + (m[3] + m[5] + m[7]).toLowerCase()); - } else { - // Non compressible color, restore but lower case. - sb.push("#" + (m[2] + m[3] + m[4] + m[5] + m[6] + m[7]).toLowerCase()); - } - } - - index = pattern.lastIndex = pattern.lastIndex - m[8].length; - } - - sb.push(css.substring(index)); - - return sb.join(""); -}; - - -var _extractDataUrls = function (css, preservedTokens) { - - // Leave data urls alone to increase parse performance. - var maxIndex = css.length - 1, - appendIndex = 0, - startIndex, - endIndex, - terminator, - foundTerminator, - sb = [], - m, - preserver, - token, - pattern = /url\(\s*(["']?)data\:/g; - - // Since we need to account for non-base64 data urls, we need to handle - // ' and ) being part of the data string. Hence switching to indexOf, - // to determine whether or not we have matching string terminators and - // handling sb appends directly, instead of using matcher.append* methods. - - while ((m = pattern.exec(css)) !== null) { - - startIndex = m.index + 4; // "url(".length() - terminator = m[1]; // ', " or empty (not quoted) - - if (terminator.length === 0) { - terminator = ")"; - } - - foundTerminator = false; - - endIndex = pattern.lastIndex - 1; - - while(foundTerminator === false && endIndex+1 <= maxIndex) { - endIndex = css.indexOf(terminator, endIndex + 1); - - // endIndex == 0 doesn't really apply here - if ((endIndex > 0) && (css.charAt(endIndex - 1) !== '\\')) { - foundTerminator = true; - if (")" !== terminator) { - endIndex = css.indexOf(")", endIndex); - } - } - } - - // Enough searching, start moving stuff over to the buffer - sb.push(css.substring(appendIndex, m.index)); - - if (foundTerminator) { - token = css.substring(startIndex, endIndex); - token = token.replace(/\s+/g, ""); - preservedTokens.push(token); - - preserver = "url(___YUICSSMIN_PRESERVED_TOKEN_" + (preservedTokens.length - 1) + "___)"; - sb.push(preserver); - - appendIndex = endIndex + 1; - } else { - // No end terminator found, re-add the whole match. Should we throw/warn here? - sb.push(css.substring(m.index, pattern.lastIndex)); - appendIndex = pattern.lastIndex; - } - } - - sb.push(css.substring(appendIndex)); - - return sb.join(""); -}; - -function cssmin(css, linebreakpos) { - - var startIndex = 0, - endIndex = 0, - i = 0, max = 0, - preservedTokens = [], - comments = [], - token = '', - totallen = css.length, - placeholder = ''; - - - css = _extractDataUrls(css, preservedTokens); - - // collect all comment blocks... - while ((startIndex = css.indexOf("/*", startIndex)) >= 0) { - endIndex = css.indexOf("*/", startIndex + 2); - if (endIndex < 0) { - endIndex = totallen; - } - token = css.slice(startIndex + 2, endIndex); - comments.push(token); - css = css.slice(0, startIndex + 2) + "___YUICSSMIN_PRESERVE_CANDIDATE_COMMENT_" + (comments.length - 1) + "___" + css.slice(endIndex); - startIndex += 2; - } - - // preserve strings so their content doesn't get accidentally minified - css = css.replace(/("([^\\"]|\\.|\\)*")|('([^\\']|\\.|\\)*')/g, function (match) { - var i, max, quote = match.substring(0, 1); - - match = match.slice(1, -1); - - // maybe the string contains a comment-like substring? - // one, maybe more? put'em back then - if (match.indexOf("___YUICSSMIN_PRESERVE_CANDIDATE_COMMENT_") >= 0) { - for (i = 0, max = comments.length; i < max; i = i + 1) { - match = match.replace("___YUICSSMIN_PRESERVE_CANDIDATE_COMMENT_" + i + "___", comments[i]); - } - } - - // minify alpha opacity in filter strings - match = match.replace(/progid:DXImageTransform\.Microsoft\.Alpha\(Opacity=/gi, "alpha(opacity="); - - preservedTokens.push(match); - return quote + "___YUICSSMIN_PRESERVED_TOKEN_" + (preservedTokens.length - 1) + "___" + quote; - }); - - // strings are safe, now wrestle the comments - for (i = 0, max = comments.length; i < max; i = i + 1) { - - token = comments[i]; - placeholder = "___YUICSSMIN_PRESERVE_CANDIDATE_COMMENT_" + i + "___"; - - // ! in the first position of the comment means preserve - // so push to the preserved tokens keeping the ! - if (token.charAt(0) === "!") { - preservedTokens.push(token); - css = css.replace(placeholder, "___YUICSSMIN_PRESERVED_TOKEN_" + (preservedTokens.length - 1) + "___"); - continue; - } - - // \ in the last position looks like hack for Mac/IE5 - // shorten that to /*\*/ and the next one to /**/ - if (token.charAt(token.length - 1) === "\\") { - preservedTokens.push("\\"); - css = css.replace(placeholder, "___YUICSSMIN_PRESERVED_TOKEN_" + (preservedTokens.length - 1) + "___"); - i = i + 1; // attn: advancing the loop - preservedTokens.push(""); - css = css.replace("___YUICSSMIN_PRESERVE_CANDIDATE_COMMENT_" + i + "___", - "___YUICSSMIN_PRESERVED_TOKEN_" + (preservedTokens.length - 1) + "___"); - continue; - } - - // keep empty comments after child selectors (IE7 hack) - // e.g. html >/**/ body - if (token.length === 0) { - startIndex = css.indexOf(placeholder); - if (startIndex > 2) { - if (css.charAt(startIndex - 3) === '>') { - preservedTokens.push(""); - css = css.replace(placeholder, "___YUICSSMIN_PRESERVED_TOKEN_" + (preservedTokens.length - 1) + "___"); - } - } - } - - // in all other cases kill the comment - css = css.replace("/*" + placeholder + "*/", ""); - } - - - // Normalize all whitespace strings to single spaces. Easier to work with that way. - css = css.replace(/\s+/g, " "); - - // Remove the spaces before the things that should not have spaces before them. - // But, be careful not to turn "p :link {...}" into "p:link{...}" - // Swap out any pseudo-class colons with the token, and then swap back. - css = css.replace(/(^|\})(([^\{:])+:)+([^\{]*\{)/g, function (m) { - return m.replace(/\:/g, "___YUICSSMIN_PSEUDOCLASSCOLON___"); - }); - - css = css.replace(/\s+([!{};:>+\(\)\],])/g, '$1'); - css = css.replace(/___YUICSSMIN_PSEUDOCLASSCOLON___/g, ":"); - - // retain space for special IE6 cases - css = css.replace(/:first-(line|letter)(\{|,)/g, ":first-$1 $2"); - - // no space after the end of a preserved comment - css = css.replace(/\*\/ /g, '*/'); - - - // If there is a @charset, then only allow one, and push to the top of the file. - css = css.replace(/^(.*)(@charset "[^"]*";)/gi, '$2$1'); - css = css.replace(/^(\s*@charset [^;]+;\s*)+/gi, '$1'); - - // Put the space back in some cases, to support stuff like - // @media screen and (-webkit-min-device-pixel-ratio:0){ - css = css.replace(/\band\(/gi, "and ("); - - - // Remove the spaces after the things that should not have spaces after them. - css = css.replace(/([!{}:;>+\(\[,])\s+/g, '$1'); - - // remove unnecessary semicolons - css = css.replace(/;+\}/g, "}"); - - // Replace 0(px,em,%) with 0. - css = css.replace(/([\s:])(0)(px|em|%|in|cm|mm|pc|pt|ex)/gi, "$1$2"); - - // Replace 0 0 0 0; with 0. - css = css.replace(/:0 0 0 0(;|\})/g, ":0$1"); - css = css.replace(/:0 0 0(;|\})/g, ":0$1"); - css = css.replace(/:0 0(;|\})/g, ":0$1"); - - // Replace background-position:0; with background-position:0 0; - // same for transform-origin - css = css.replace(/(background-position|transform-origin|webkit-transform-origin|moz-transform-origin|o-transform-origin|ms-transform-origin):0(;|\})/gi, function(all, prop, tail) { - return prop.toLowerCase() + ":0 0" + tail; - }); - - // Replace 0.6 to .6, but only when preceded by : or a white-space - css = css.replace(/(:|\s)0+\.(\d+)/g, "$1.$2"); - - // Shorten colors from rgb(51,102,153) to #336699 - // This makes it more likely that it'll get further compressed in the next step. - css = css.replace(/rgb\s*\(\s*([0-9,\s]+)\s*\)/gi, function () { - var i, rgbcolors = arguments[1].split(','); - for (i = 0; i < rgbcolors.length; i = i + 1) { - rgbcolors[i] = parseInt(rgbcolors[i], 10).toString(16); - if (rgbcolors[i].length === 1) { - rgbcolors[i] = '0' + rgbcolors[i]; - } - } - return '#' + rgbcolors.join(''); - }); - - - // Shorten colors from #AABBCC to #ABC. Note that we want to make sure - // the color is not preceded by either ", " or =. Indeed, the property - // filter: chroma(color="#FFFFFF"); - // would become - // filter: chroma(color="#FFF"); - // which makes the filter break in IE. - /* - css = css.replace(/([^"'=\s])(\s*)#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])/gi, function () { - var group = arguments; - if ( - group[3].toLowerCase() === group[4].toLowerCase() && - group[5].toLowerCase() === group[6].toLowerCase() && - group[7].toLowerCase() === group[8].toLowerCase() - ) { - return (group[1] + group[2] + '#' + group[3] + group[5] + group[7]).toLowerCase(); - } else { - return group[0].toLowerCase(); - } - }); - */ - css = _compressHexColors(css); - - // border: none -> border:0 - css = css.replace(/(border|border-top|border-right|border-bottom|border-right|outline|background):none(;|\})/gi, function(all, prop, tail) { - return prop.toLowerCase() + ":0" + tail; - }); - - // shorter opacity IE filter - css = css.replace(/progid:DXImageTransform\.Microsoft\.Alpha\(Opacity=/gi, "alpha(opacity="); - - // Remove empty rules. - css = css.replace(/[^\};\{\/]+\{\}/g, ""); - - if (linebreakpos >= 0) { - // Some source control tools don't like it when files containing lines longer - // than, say 8000 characters, are checked in. The linebreak option is used in - // that case to split long lines after a specific column. - startIndex = 0; - i = 0; - while (i < css.length) { - i = i + 1; - if (css[i - 1] === '}' && i - startIndex > linebreakpos) { - css = css.slice(0, i) + '\n' + css.slice(i); - startIndex = i; - } - } - } - - // Replace multiple semi-colons in a row by a single one - // See SF bug #1980989 - css = css.replace(/;;+/g, ";"); - - // restore preserved comments and strings - for (i = 0, max = preservedTokens.length; i < max; i = i + 1) { - css = css.replace("___YUICSSMIN_PRESERVED_TOKEN_" + i + "___", preservedTokens[i]); - } - - // Trim the final string (for any leading or trailing white spaces) - css = css.replace(/^\s+|\s+$/g, ""); - - return css; - -} - - -exports.cssmin = cssmin; - diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/package.json b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/package.json deleted file mode 100755 index 4e5115f..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/package.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "name": "ycssmin", - "version": "1.0.1", - "description": "CSS Minification from YUICompressor", - "main": "./cssmin", - "bin": { - "ycssmin": "./bin/cssmin" - }, - "devDependencies": { - "yui-lint": "~0.1.1", - "jshint": "~0.9.0", - "istanbul": "~0.1.8", - "vows": "*" - }, - "author": { - "name": "Dav Glass", - "email": "davglass@gmail.com" - }, - "contributors": [ - { - "name": "Johan Bleuzen", - "url": "http://blog.johanbleuzen.fr" - }, - { - "name": "Dav Glass", - "email": "davglass@gmail.com" - }, - { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - } - ], - "keywords": [ - "minify", - "cssmin", - "compressor", - "yuicompressor" - ], - "scripts": { - "pretest": "jshint --config ./node_modules/yui-lint/jshint.json cssmin.js package.json", - "test": "istanbul cover --print both -- vows --spec ./tests/*.js" - }, - "repository": { - "type": "git", - "url": "http://github.com/yui/ycssmin.git" - }, - "preferGlobal": "true", - "bugs": { - "url": "http://github.com/yui/ycssmin/issues" - }, - "licenses": [ - { - "type": "BSD", - "url": "https://github.com/yui/ycssmin/blob/master/LICENSE" - } - ], - "readme": "CSSMin\n======\n\nThis project is a fork of [jbleuzen/node-cssmin](https://github.com/jbleuzen/node-cssmin).\n\nIt was originally based on the javascript for of the css minification tool used inside of \n[YUICompressor](https://github.com/yui/yuicompressor) based on code from Stoyan Stefanov and Isaac Schlueter.\n\nWe forked this project in order to maintain and up keep it on a regular basis.\n\n\nInstallation\n------------\n\nYou can either download the plugin and unzip it into to your project folder or you can use npm to install the `ycssmin` package.\n\n`npm -g i ycssmin`\n\nBuild Status\n------------\n\n[![Build Status](https://secure.travis-ci.org/yui/ycssmin.png)](http://travis-ci.org/yui/ycssmin)\n\nTesting\n-------\n\nClone this repo:\n\n`npm test`\n\nCode Coverage\n-------------\n\nWe are using [istanbul](https://github.com/gotwarlost/istanbul) to provide code coverage, to view the report:\n\n`npm test`\n\nThen open `./coverage/lcov-report`\n\nWe also publish the [latest here](http://yui.github.com/ycssmin/).\n\nWe ask that all patches have a test attached and full coverage.\n\nUsage\n-----\n\nThe module exports the cssmin function, so you can use it with: \n\n`var cssmin = require('ycssmin').cssmin;`\n\nThe function cssmin takes two arguments:\n* `input` : the CSS content you want to minimize.\n* `linebreakpos` : the number of characters before the end of the line. If empty, the output will have only one line.\n\t\nExample :\n\n```javascript\nvar fs = require('fs'),\n cssmin = require('ycssmin').cssmin,\n css = fs.readFileSync(\"/Any/Random/CSS/File.css\", encoding='utf8'),\n min = cssmin(css);\n\nconsole.log(min);\n```\n\nLicense\n-------\n\n Copyright 2012 Yahoo! Inc.\n All rights reserved.\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * Neither the name of the Yahoo! Inc. nor the\n names of its contributors may be used to endorse or promote products\n derived from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL YAHOO! INC. BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nThanks\n------\n\nThanks to Johan BLEUZEN for originally porting this to node.js\n", - "_id": "ycssmin@1.0.1", - "_from": "ycssmin@>=1.0.1" -} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/background-position.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/background-position.css deleted file mode 100644 index 4cdff82..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/background-position.css +++ /dev/null @@ -1,2 +0,0 @@ -a {background-position: 0 0 0 0;} -b {BACKGROUND-POSITION: 0 0;} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/background-position.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/background-position.css.min deleted file mode 100644 index 0895e1a..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/background-position.css.min +++ /dev/null @@ -1 +0,0 @@ -a{background-position:0 0}b{background-position:0 0} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/border-none.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/border-none.css deleted file mode 100644 index 29f9cba..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/border-none.css +++ /dev/null @@ -1,5 +0,0 @@ -a { - border: none; -} -b {BACKGROUND:none} -s {border-top: none;} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/border-none.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/border-none.css.min deleted file mode 100644 index 1ed1b65..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/border-none.css.min +++ /dev/null @@ -1 +0,0 @@ -a{border:0}b{background:0}s{border-top:0} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/box-model-hack.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/box-model-hack.css deleted file mode 100644 index c00e32f..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/box-model-hack.css +++ /dev/null @@ -1,9 +0,0 @@ -#elem { - width: 100px; - voice-family: "\"}\""; - voice-family:inherit; - width: 200px; -} -html>body #elem { - width: 200px; -} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/box-model-hack.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/box-model-hack.css.min deleted file mode 100644 index 3340179..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/box-model-hack.css.min +++ /dev/null @@ -1 +0,0 @@ -#elem{width:100px;voice-family:"\"}\"";voice-family:inherit;width:200px}html>body #elem{width:200px} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2527974.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2527974.css deleted file mode 100644 index b3bc2c8..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2527974.css +++ /dev/null @@ -1,10 +0,0 @@ -/* this file contains no css, it exists purely to put the revision number into the - combined css before uploading it to SiteManager. The exclaimation at the start - of the comment informs yuicompressor not to strip the comment out */ - -/*! $LastChangedRevision: 81 $ $LastChangedDate: 2009-05-27 17:41:02 +0100 (Wed, 27 May 2009) $ */ - -body { - yo: cats; -} -ul[id$=foo] label:hover {yo: yo;} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2527974.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2527974.css.min deleted file mode 100644 index 00cc007..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2527974.css.min +++ /dev/null @@ -1 +0,0 @@ -/*! $LastChangedRevision: 81 $ $LastChangedDate: 2009-05-27 17:41:02 +0100 (Wed, 27 May 2009) $ */body{yo:cats}ul[id$=foo] label:hover{yo:yo} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2527991.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2527991.css deleted file mode 100644 index d4c80ff..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2527991.css +++ /dev/null @@ -1,19 +0,0 @@ -@media screen and/*!YUI-Compresser */(-webkit-min-device-pixel-ratio:0) { - a{ - b: 1; - } -} - - -@media screen and/*! */ /*! */(-webkit-min-device-pixel-ratio:0) { - a{ - b: 1; - } -} - - -@media -webkit-min-device-pixel-ratio:0 { - a{ - b: 1; - } -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2527991.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2527991.css.min deleted file mode 100644 index 965755a..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2527991.css.min +++ /dev/null @@ -1 +0,0 @@ -@media screen and/*!YUI-Compresser */(-webkit-min-device-pixel-ratio:0){a{b:1}}@media screen and/*! *//*! */(-webkit-min-device-pixel-ratio:0){a{b:1}}@media -webkit-min-device-pixel-ratio:0{a{b:1}} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2527998.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2527998.css deleted file mode 100644 index 9c6c00e..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2527998.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! special */ -body { - -} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2527998.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2527998.css.min deleted file mode 100644 index 7fabf8a..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2527998.css.min +++ /dev/null @@ -1 +0,0 @@ -/*! special */ \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2528034.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2528034.css deleted file mode 100644 index c315cb1..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2528034.css +++ /dev/null @@ -1,5 +0,0 @@ -a[href$="/test/"] span:first-child { b:1; } -a[href$="/test/"] span:first-child { } - - - diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2528034.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2528034.css.min deleted file mode 100644 index 1543777..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/bug2528034.css.min +++ /dev/null @@ -1 +0,0 @@ -a[href$="/test/"] span:first-child{b:1} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/charset-media.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/charset-media.css deleted file mode 100644 index bd02f38..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/charset-media.css +++ /dev/null @@ -1,9 +0,0 @@ -/* re: 2495387 */ -@charset 'utf-8'; -@media all { -body { -} -body { -background-color: gold; -} -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/charset-media.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/charset-media.css.min deleted file mode 100644 index dcaf49d..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/charset-media.css.min +++ /dev/null @@ -1 +0,0 @@ -@charset 'utf-8';@media all{body{background-color:gold}} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/color-simple.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/color-simple.css deleted file mode 100644 index bb33ec3..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/color-simple.css +++ /dev/null @@ -1,8 +0,0 @@ -.foo, #AABBCC { - background-color:#aabbcc; - border-color:#Ee66aA #ABCDEF #FeAb2C; - filter:chroma(color = #FFFFFF ); - filter:chroma(color="#AABBCC"); - filter:chroma(color='#BBDDEE'); - color:#112233 -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/color-simple.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/color-simple.css.min deleted file mode 100644 index 1e39e23..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/color-simple.css.min +++ /dev/null @@ -1 +0,0 @@ -.foo,#AABBCC{background-color:#abc;border-color:#e6a #abcdef #feab2c;filter:chroma(color = #FFFFFF);filter:chroma(color="#AABBCC");filter:chroma(color='#BBDDEE');color:#123} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/color.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/color.css deleted file mode 100644 index 030b8a0..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/color.css +++ /dev/null @@ -1,46 +0,0 @@ -.color { - me: rgb(123, 123, 123); - impressed: #FfEedD; - again: #ABCDEF; - andagain:#aa66cc; - background-color:#aa66ccc; - filter: chroma(color="#FFFFFF"); - background: none repeat scroll 0 0 rgb(255, 0,0); - alpha: rgba(1, 2, 3, 4); - color:#1122aa -} - -#AABBCC { - background-color:#ffee11; - filter: chroma(color = #FFFFFF ); - color:#441122; - foo:#00fF11 #ABC #AABbCc #123344; - border-color:#aa66ccC -} - -.foo #AABBCC { - background-color:#fFEe11; - color:#441122; - border-color:#AbC; - filter: chroma(color= #FFFFFF) -} - -.bar, #AABBCC { - background-color:#FFee11; - border-color:#00fF11 #ABCDEF; - filter: chroma(color=#11FFFFFF); - color:#441122; -} - -.foo, #AABBCC.foobar { - background-color:#ffee11; - border-color:#00fF11 #ABCDEF #AABbCc; - color:#441122; -} - -@media screen { - .bar, #AABBCC { - background-color:#ffEE11; - color:#441122 - } -} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/color.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/color.css.min deleted file mode 100644 index cf2103a..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/color.css.min +++ /dev/null @@ -1 +0,0 @@ -.color{me:#7b7b7b;impressed:#fed;again:#abcdef;andagain:#a6c;background-color:#aa66ccc;filter:chroma(color="#FFFFFF");background:none repeat scroll 0 0 #f00;alpha:rgba(1,2,3,4);color:#12a}#AABBCC{background-color:#fe1;filter:chroma(color = #FFFFFF);color:#412;foo:#0f1 #ABC #abc #123344;border-color:#aa66ccC}.foo #AABBCC{background-color:#fe1;color:#412;border-color:#AbC;filter:chroma(color= #FFFFFF)}.bar,#AABBCC{background-color:#fe1;border-color:#0f1 #abcdef;filter:chroma(color=#11FFFFFF);color:#412}.foo,#AABBCC.foobar{background-color:#fe1;border-color:#0f1 #abcdef #abc;color:#412}@media screen{.bar,#AABBCC{background-color:#fe1;color:#412}} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/comment.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/comment.css deleted file mode 100644 index 7073b9e..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/comment.css +++ /dev/null @@ -1,3 +0,0 @@ -html >/**/ body p { - color: blue; -} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/comment.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/comment.css.min deleted file mode 100644 index b280371..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/comment.css.min +++ /dev/null @@ -1 +0,0 @@ -html>/**/body p{color:blue} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/concat-charset.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/concat-charset.css deleted file mode 100644 index 87ca565..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/concat-charset.css +++ /dev/null @@ -1,15 +0,0 @@ -/* This is invalid CSS, but frequently happens as a result of concatenation. */ -@charset "utf-8"; -#foo { - border-width:1px; -} -/* -Note that this is erroneous! -The actual CSS file can only have a single charset. -However, this is the job of the author/application. -The compressor should not get involved. -*/ -@charset "another one"; -#bar { - border-width:10px; -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/concat-charset.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/concat-charset.css.min deleted file mode 100644 index 73e8d3b..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/concat-charset.css.min +++ /dev/null @@ -1 +0,0 @@ -@charset "utf-8";#foo{border-width:1px}#bar{border-width:10px} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-doublequotes.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-doublequotes.css deleted file mode 100644 index 49a1315..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-doublequotes.css +++ /dev/null @@ -1,23 +0,0 @@ -.yui3-skin-night .yui3-dial-ring-vml, -.yui3-skin-night .yui3-dial-center-button-vml, -.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min, -.yui3-skin-night v\:oval.yui3-dial-marker-max-min, -.yui3-skin-night .yui3-dial-marker-vml, -.yui3-skin-night .yui3-dial-handle-vml { - background: none; - opacity:1; -} - -div.base64-doublequotes { - width:100px; - height:100px; - background-image:url( "data:image/jpeg;base64,%2F9j%2F4AAQSkZJRgABAgEAZABkAAD%2F4RfJRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAAD0JAAAAnEAAPQkAAACcQQWRvYmUgUGhvdG9zaG9wIENTMiBNYWNpbnRvc2gAMjAwODowNzoxOSAxNDo1ODowNQAAA6ABAAMAAAAB%2F%2F8AAKACAAQAAAABAAABwqADAAQAAAABAAABRQAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABaTAAAAAAAAAEgAAAABAAAASAAAAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMR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0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZ%2F%2B01IlBob3Rvc2hvcCAzLjAAOEJJTQQlAAAAAAAQAAAAAAAAAAAAAAAAAAAAADhCSU0D6gAAAAAYEDw%2FeG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8%2BCjwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgo8cGxpc3QgdmVyc2lvbj0iMS4wIj4KPGRpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNSG9yaXpvbnRhbFJlczwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1Ib3Jpem9udGFsUmVzPC9rZXk%2BCgkJCQk8cmVhbD43MjwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNU2NhbGluZzwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1TY2FsaW5nPC9rZXk%2BCgkJCQk8cmVhbD4xPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCTxkaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxhcnJheT4KCQkJPGRpY3Q%2BCgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCQkJCTxyZWFsPjcyPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxTY2FsaW5nPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsU2NhbGluZzwva2V5PgoJCQkJPHJlYWw%2BMTwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuc3ViVGlja2V0LnBhcGVyX2luZm9fdGlja2V0PC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BUE1UaW9nYVBhcGVyTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNVGlvZ2FQYXBlck5hbWU8L2tleT4KCQkJCQk8c3RyaW5nPm5hLWxldHRlcjwvc3RyaW5nPgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQkJCQk8YXJyYXk%2BCgkJCQkJCTxyZWFsPi0xODwvcmVhbD4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD43NzQ8L3JlYWw%2BCgkJCQkJCTxyZWFsPjU5NDwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNUGFwZXJOYW1lPC9rZXk%2BCgkJCQkJPHN0cmluZz5uYS1sZXR0ZXI8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk%2BCgkJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9hcnJheT4KCQk8L2RpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhZ2VSZWN0PC9rZXk%2BCgkJPGRpY3Q%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD4tMTg8L3JlYWw%2BCgkJCQkJCTxyZWFsPjc3NDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTk0PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5wcGQuUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLnBwZC5QTVBhcGVyTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BVVMgTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5BUElWZXJzaW9uPC9rZXk%2BCgkJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC50eXBlPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvVGlja2V0PC9zdHJpbmc%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuQVBJVmVyc2lvbjwva2V5PgoJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnR5cGU8L2tleT4KCTxzdHJpbmc%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXRUaWNrZXQ8L3N0cmluZz4KPC9kaWN0Pgo8L3BsaXN0Pgo4QklNA%2BkAAAAAAHgAAwAAAEgASAAAAAAC3gJA%2F%2B7%2F7gMGAlIDZwUoA%2FwAAgAAAEgASAAAAAAC2AIoAAEAAABkAAAAAQADAwMAAAABf%2F8AAQABAAAAAAAAAAAAAAAAaAgAGQGQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4QklNA%2B0AAAAAABAAZAAAAAEAAQBkAAAAAQABOEJJTQQmAAAAAAAOAAAAAAAAAAAAAD%2BAAAA4QklNBA0AAAAAAAQAAAAeOEJJTQQZAAAAAAAEAAAAHjhCSU0D8wAAAAAACQAAAAAAAAAAAQA4QklNBAoAAAAAAAEAADhCSU0nEAAAAAAACgABAAAAAAAAAAE4QklNA%2FUAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA%2FgAAAAAAHAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAAAD%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FA%2BgAAAAA%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwPoAAAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA1UAAAAGAAAAAAAAAAAAAAFFAAABwgAAABAAcwB3AGkAcwBzAF8AYQByAG0AeQBfAGsAbgBpAGYAZQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABwgAAAUUAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAUUAAAAAUmdodGxvbmcAAAHCAAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAFFAAAAAFJnaHRsb25nAAABwgAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAAADhCSU0EKAAAAAAADAAAAAE%2F8AAAAAAAADhCSU0EEQAAAAAAAQEAOEJJTQQUAAAAAAAEAAAAAThCSU0EDAAAAAAWrwAAAAEAAACgAAAAdAAAAeAAANmAAAAWkwAYAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1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U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZADhCSU0EIQAAAAAAVQAAAAEBAAAADwBBAGQAbwBiAGUAIABQAGgAbwB0AG8AcwBoAG8AcAAAABMAQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAIABDAFMAMgAAAAEAOEJJTQQGAAAAAAAHAAIAAAABAQD%2F4TkjaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSIzLjEuMS0xMTIiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyI%2BCiAgICAgICAgIDx4YXBNTTpEb2N1bWVudElEPnV1aWQ6RTcxOTVFNTY1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkRvY3VtZW50SUQ%2BCiAgICAgICAgIDx4YXBNTTpJbnN0YW5jZUlEPnV1aWQ6RTcxOTVFNTc1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkluc3RhbmNlSUQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eGFwOkNyZWF0ZURhdGU%2BMjAwOC0wNy0xOVQxNDo1Nzo0MS0wNTowMDwveGFwOkNyZWF0ZURhdGU%2BCiAgICAgICAgIDx4YXA6TW9kaWZ5RGF0ZT4yMDA4LTA3LTE5VDE0OjU4OjA1LTA1OjAwPC94YXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhhcDpNZXRhZGF0YURhdGU%2BMjAwOC0wNy0xOVQxNDo1ODowNS0wNTowMDwveGFwOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhhcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ1MyIE1hY2ludG9zaDwveGFwOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9qcGVnPC9kYzpmb3JtYXQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iPgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8cGhvdG9zaG9wOkhpc3RvcnkvPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8dGlmZjpOYXRpdmVEaWdlc3Q%2BMjU2LDI1NywyNTgsMjU5LDI2MiwyNzQsMjc3LDI4NCw1MzAsNTMxLDI4MiwyODMsMjk2LDMwMSwzMTgsMzE5LDUyOSw1MzIsMzA2LDI3MCwyNzEsMjcyLDMwNSwzMTUsMzM0MzI7QzA1QTE5MDRGRjAwQUJEQzA1MUJERkFGMDIwNEVBNTE8L3RpZmY6TmF0aXZlRGlnZXN0PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24%2BNDUwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjMyNTwvZXhpZjpQaXhlbFlEaW1lbnNpb24%2BCiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U%2BLTE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6TmF0aXZlRGlnZXN0PjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDtENDYzN0NCOUQ0MUExMEJBN0VGNUVCQ0RCNjMxODMyOTwvZXhpZjpOYXRpdmVEaWdlc3Q%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY%2BCjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8%2B%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQACAYGBgYGCAYGCAwIBwgMDgoICAoOEA0NDg0NEBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEJCAgJCgkLCQkLDgsNCw4RDg4ODhERDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgBRQHCAwEiAAIRAQMRAf%2FdAAQAHf%2FEAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4%2FPE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BCk5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0%2BPzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BDlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq%2Bv%2FaAAwDAQACEQMRAD8A7%2FmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmrlHI2utXn6WltnFESb0RFSp41WjD5q3LCBaslzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2E2rj0LuzvF7PxftUf8AXPLDnC3XI0ewdpOkTK4P08T%2FAMK2Ec1TLNgaxmE9pFIDy%2BEAn3GxwTgV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F%2F0e%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXYUeZpfR0a4kpUAx19h6i74b4X65CbjR76FV5FoJKKe5C1GIVLdDuGhuXs2IKOX4gfsvGdx%2FskKtkiyD6bctHHbXgPImOC4qOpXj6E1ff4Mm4Ndxkpc770BvNmzZFLs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Lv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVokKCT0G%2F3ZgaioNQemANZuhaWLyE0LlY1%2BbGn6sWspA8QA%2FZ%2FUcVRWbNmxV2bNmxV2bNmxV2NZQwKnodj9OOzYqwDT4iiPZsa%2FVLm5sj7I%2F76L%2BOTXTpjPZQSt9pkAb5r8JyKXqfUvMOpIQOFxFDfoP8qFvTl%2F4Q5INDkrFPAf8AdUhI%2FwBV%2FiH8cnLeAPcxHMprmzZsgydmzZsVdmzZsVdmzZsVdmzYyWRIo2kkYKiirMdgAMVX5sjTeaGl1CzsbSAOLuX0w7k14KCzyAD%2BUZJBirebNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F9Pv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVo4CXUFa9e0CbJRWkr%2B0RWlMHZEJ5WtPMtzE5%2BGYJKnyK0%2F4kuEC1ZeM2IW0okjFT8S7H%2BuL4FYz52mMWn2tDTlcpX6FbDHR5ecCH%2BZevywl%2FMM8dJtn7LdJ%2BKvgry9ccrOJ69KVw9E9GS5s2bAh2bNmxV2bNmxV2bNmxVi3miFU1LSbxvsStJYzH%2FJnSi%2F8ADYpoEzLcxq1T68FGr%2FvyE8GrgjzdC0mhXEsY%2Fe2pS5i%2F1omDf8RwttJRHdrcDaNbhZVI6endIG%2F4mcnHeJCDzDL82bNkEuzZs2KuzZs2KuzZs2KurkZ843Zhs4bVTQzvVqfyrvg3zHNPb2UMsLtGBPGJSpIqjEqRUb9ch%2BvSSvp0JlcvJCLyMuxJb4JNvi%2F1SuEBVvkaX9L%2BZbm8Sv1fTbf0Y6%2F78lPxH%2FgFzpeRvyPbWcXlyyubWBIXuoxJOUG7uKjk5%2FaOSSoxPNXZs2bArs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FU7%2FmzZsVQ2osyWM7o3FlQkMOxGPtZhPBHKCDyUE08e%2BM1Bedjcr4xPT%2FgThV5cvBJbpGergEfMDcYa2PkqfZs2bArs2bNirs2bNirs2bNirshfnRGtb7T9TX7LcoJD2qDzSv3vk0wl81WDajodzDGKzRj1oR35R%2FFT6RthHNXaVcrKsUtftDi304dZz7yrqPrQCIncdMnsEnqRK%2Fcjf54yVjP5gwtJ5ckcD%2B5mik%2BivH%2FAI3wD5RnEtpwrWgw983RGby1qiqKlYGkA%2F4x%2FvP%2BNchnke5BIUGoPQ%2FPEJHJ6XG3JFbxAOPxOA1iX7sUwIdmzZsVdmzZsVdmzZsVUbqBbq2mtm%2BzMjRn5MKZDLP4rC2UVq9qYj7SWshWn%2BtxOTnIVG4ttWvdNaiiK7FxGDtWG6Ti%2FwDwMuShzRLky%2B1lE9vFMP8AdiK33gYscKtBmDWhtq%2FHbOyMp68SeSH5UOGpyJ5pYde3moWPmW5KzH0pIo2WNt0A3Wv0ts2D73zJ6FgzxqqXpKpHG9eDMx7EYXed45VeC4gPCdYyqua0I5q5VgOv2cAW8sWo2QMqhwwoyHcVyQFhVOLzvrNrdf6fFHLFX4kVeBH%2Br1%2F4bJlp%2Bt2GqWrXFnICyKWeJtnUgV3XOP67qFjaFLHUrprecy%2BlZajxPDmN1jn8Dv8Aa%2By%2BIaXrclrdtZ34NrfR1USofgeo2K06c%2F8AgcBCXr%2FlvXRrdnzk4rcoSJFXYfMbnDzOV%2BTr82eqAOQIpaBq7AV2r%2BOdTriRSEp8z8RoN9I5AWJPV5HYD0yHr%2BGQg3Ntq1lcLazx3CiZviiYOKzQo9Kjb7YzoWqRevpt5AOskEij5lCOmc60%2BWCK0j9ONYo5IYp%2BEahQWBeNjRafEcMVTvTb%2B80fyHZ3FugE9vSORJBUqPVZW%2BEHw3yVaXeC%2FsobulGkX41HQMNmH%2FBZzC%2B1iTTbadZUkjtJjzkQqSKqNm5fsdMPfyr1%2FRdT8vra2E5N5C8kl3bSMTKpkctz%2BL7SP9peOA7fFkIkgkCwOfkz7NlA1y8DF2bNmxV2bEJLy1injtpJVWeavpREjk3Hc8V64virs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Xv%2BbNmxVplDqUbcMKH5HIPokjWsstqx%2BK2lZPf4Wpk5yF6nF9R8xswHGO8QSj%2FAFh8D%2Fqrkoc6VmSMHUOOjAEfTjsAaZMXhMRPxRnYf5J6YPyJV2bNmxV2bNmxVQuzOtu729PVUclBFa07U98DafqsF6i9EkI6ePywwyF6vG2i6oJRUWl6xZCP2JOrr%2FsvtLhG6s0yiK4X6Zfi4QI7Vb9lv5h%2FXDHrgV5c8B0LzLc2Q%2BGF29WDw4SfF%2Fwp%2BHOg6ZMHi4j2YfTkZ%2FMGwpFaazGDytm9GYj%2FAH25%2BEn%2FAFX%2FAOJ4N8uXwliicnps305LmFZDewrc2dxbt0lieNvkylc45%2BX10UCQzHjLATE4P%2BQeNc6L55e5i0J57WVonikRmZDSq7jf2yB2Op%2FVYor2%2FwBNjktpAGjv7ZvU%2BInoy8Vao%2Fa44xCQ9as25RVBqKnfBGRby9rBEsljcIY0aQ%2Bg5FCCQD6bj9lslGAikN5s2bArs2bGyOI0aRuiAsfoFcVS%2B%2F1q2sJltyrSytuyp%2ByDsC3zwxBqAfHfI%2Fodmt2z6pcjnJK5dAexPT%2FgRkhxV2c782mSy82WUgNIdUhNs4PTmlXQ%2FwDBDOiZAvzLb6nHpOrlFkjs7lWdG9yvxVG%2FwiuGJ3Up3YTJFr7op%2BC8t1ljHjxodv8AYtkiyHbxx6XfKx%2FcXBilJ3%2BAsVUV8FRlyYA4Z80DkkPmq3EtlHJSpR%2BJPgHBH66ZBtIufqt9Np8pALHnEpO5p1oM6Xq0P1jTriPoePIfNdxnLtZtrGZluBcG3vF%2BFJYuJfx40IIxHJKzzb5et9ZtZYp1LwygcgPtKy%2FZkT%2FKWuRKKCOC6tNH1CblcWiILDUWHH6wg6wyDejx9Fw4sfOMjEBY5biH1HgLy8VYulOfJV%2By38q4ndH9LlL219K4iilHrWzLxlhI6SgE1%2F2SnFKo0Czxy28zMqcSzspIYBPj2I%2F1cd%2FytnVZdNQ2D1I%2BESMoPw%2FzMftdMG20TSQyyblmjenzoc4TY6ld6ddyKwMUsbFZoHqNwd1KnGXRXs9n5%2Fv7lg98GlWhMjwk1A%2Fm4k%2FF7jDSwSPULTTJI3PGBphGNwG4OHVW%2BgnONX%2BsWFpDFPaSSJcTESG3TcRlf2uRK%2Fazq%2BkR3aeT7e%2BjnX6yoW8ibht%2B9i9Tg%2B%2FQ98QVZHqstutowuSPSdSpV91IPVWzif1i98t%2BZ7m40FjbSWUrNCqEmkex4EH7acT9lv2c6lonmbTvMUTWdwgiumWktrLQhge6H9of6uRLzd5ZurDVP8Q2KetYFUW7jXeSKi%2Bm0hH7UZH7X7OCY4g2YM0sMrjvexB5SHcXsnkPz3Y%2BcdPqKQ6lAB9bta%2F8lI69Y2%2F4XJeDXPJlvPe6JqMeq6NMYLuE842To6ntToyuv2k%2Faz0J5E8%2B2HnGyI2t9VgA%2Bt2ZP0epH%2FNEf%2BEyESeUuff3tmbFAx8bB9H8Uf4sZ8%2F6P82TMMLNb1iDRrQ3EpBkkPC3j7s5%2FwCNV%2B0%2BGVc4n5m8yfpnzJcsr%2F6HYsLe232PBv3j0%2Fy3%2BH%2FY5JxkLourX175%2Ftb28maSZrloqsdlQ1Tgo%2FZUDO755%2B8uxlvPcMI6i6LAe2zZ6BwlS7NmzYFdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVf%2FW7%2FmzZsVdkb83W5%2BrW1%2Bg%2BK1kAc%2F5D%2FCf%2BG45JMC6jare2FxaEf3qMo%2BdPh%2F4bCNiqV6VOOcTV%2BGReB37%2FaX9WHoyFaJMz23BqiWE7juCh%2FsyaRsHRXHRgCPpwy52gLs2bNkUuzZs2Kuwu1rS49W06Wzb4XI5Qv8Ayuu6nDHMemKvONE1KWGVrG7rHPCxRgeqsppk7sb0XC8W2lUbjxHiMhnnnTHtLmPXrZfgakd1TsR9iQ%2FP7LYtomq%2FWI0Iakybof4H55LmFZdqNlFqNjcWMwqk6FD8z9k%2FQc515XuZbW4l0%2B5%2BGWFzE6n%2BZTTOlW063EQkXY9GXwPhnO%2FNsS6T5qtbofBHqaniexmi%2B2v%2BsU4v%2FlfFgHcrPTFbanZNb3caywyApLE3Qj3zjutwW%2FljzBc6Pp6fV9JHpsLNSSgR1HIorV3Vvizq2jXQk%2BAndlBA9xnNvzRiWPzJBJWnr2gJP%2FGNyv8AHAdikJ3YGf0o5pZDIboSD1GJJ9aAgh6%2F5aUzoFnN9YtYZ6gmRFY06VI3zlXk%2FVI5bi2hnlBgdBuxFFahhfr0rSNsnHlXU4JI5NJaSt1avIQm%2B8RaquD0I%2BLjkpbgIZJmzZsirsDagC1jcqvUxOB%2FwJwTjXUMrK32WBB%2BWKpfofE6Xb8f5d%2FnhjkMPmvR%2FKlrJBqkxBSVkjC0PIDpTfI15s%2FMNbu3jbR5plsZVp69swRi9N0eSjMnH%2BRcVpm669cWWtXGnatwjgKma2uPsj0x%2FNXw%2FayOfmLr%2BhX3l%2BPTYrkXM%2BpGtm1uPUUceX7yRx8KLtx%2F1s5xoN%2FefpVr6C8muVVfUuLO8kMrEIeTem7faRk5Iy5FdTuZ9B169trGZvqkc5eFD8SmJzzUcTtsrceWHzTT3fRJv0p5UZvtOYYrgCu%2FJV4P%2FwANHnPrj83vM2lX9zpWoBJYInaJ540pOi1%2BGRQDxf4cln5Z3qT2stjWrK0iexEgE60%2F2XLOUfmHYNZeZbhWP94Ayn%2FV%2BD%2FjVclLlbEdQn955q1wTiU3huLadeQCsfSljO9VNev%2FAA0bYHub1Z7V5yWkhHxpcVHJNwGiuP8AKStVk%2FbyGafqLQxyafO5S2lPJWUAmGQ%2F7uiB8f8Ad0X%2B7F%2Fy8Ctd6jpl3Lb3v%2BkQTpxniqTDcQn7LoR%2FwUb%2FALDZCyyekWl9ZyaFLPelZGN2tqDEtZJHenEs67ckpVXwq1bU7G1iKWvqtcCR4bkkhFYx%2FCHXhvvX48C%2BU7H1SbK3k9Wya5hv4HchSBF8FxBL2WeOJ1k%2F4s9P4cu%2F0j%2Fc1FphmFxPLeOhZBxAiL8jt40%2Fa5YegV6PprvLpcE8sfpTNbh3QVoGK12zluoQ2PnZih42fmWIVt5z8Md4q9I5P5J17Z2A8YrWVl%2BERoaDwoNvupnLtb02LzREdR0hBba7bVe4tEPFZwpr6s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xKXcslu7tXb1%2BSBq%2FwCSzZK9c06xuNUutStkBls5IFkAIAMoHqUUfzNRkbCPW5Xs70rZcVtL0%2BtCoAFVc1oK%2FwArni2RIShdD0rU9Z0g2UNW1DR5JLG%2BirRlQuXhmp1ZP72M%2FwCph75g0K2sra21G8ch5baGJUpt6yARuvL6OWEQk1eJrq9s55YLxBzuGhJEjr3LKvxSqv7WISanq2oQRXGryvd2MtVhuSQ8aNQch8OyNjsqElhK1hbcr%2Fcv3K%2FyV%2FycRSQBmUiifsfQM6FpfljSbrR0mCy3EjDlDIzN9sGnphU%2FZ%2FlbIrqnl%2F6jM3Cb1VRqOoU8078XoOHPISIiQCd5ckgE3tyS4StK6xSy%2FDJ%2B7HqseO%2FYVw0W2thatp10he2b7YH21cfZljP86f8AD%2FYxO4tbO4so4I7ZUvG5Lpl3PssprUws392JD%2Fut%2FwCbAOh6sLuU6VqYMF4hKRu2x5DrFID0YY7rsh4tMn06%2FkspjzjniaS1nQfDIE%2BJWXwdafEv7Od0ugnmL8tmYipWEOB1oGWp%2FwCH5Zy4hoT9WuU5BTzj7FHp%2FeIe3%2BX%2FADrnR%2FysvRfaHeaJIwZ4RJGo8QDzQ%2F8AAy5OPVBfPNxbpMpifYqaBu4IwFYWlx9fEIJU7lmH7S%2F83ZJ9e0x7K9unRg8azMkoHWJySVR%2F9YH4W%2Bzj%2FKtvFdaxBDLQKzAVO243G%2F8ArYPJUXb2NvDZtdyWxe3B4meCQ%2BtG37Jkjb9lafaXHRXl9q2r6etnWJ7Yxx28h%2B1UNyMjt%2FlH4myX6lp1poPm57CIFLG8jikCsKisqqXWncc2%2BzhLZW0Om35hCuLiCeSgIHFY67KT9rl4YaV63IwMVSakg1pt27eGRuzvrTWILdYbnlcIWXSdQc8W5pXlp91%2FLIP91M%2F94mG9tcfW3AQ14xgsPH4c4Zp%2Btz6HqN2rJ61nNIy3loTTkA54yIf91zR%2FailyRNUinpV0iXqyyxw%2BjdW5Md%2FaN1iPdqf74f8A5Jtka1ZZ4LWYxsySKpaCRT8QI%2BIxkj2Hw5KLe6%2FTsUF%2Fp1wsmrRRk2l0QAL6Fft290g%2Fu7uP7Lo395hFquqaL9XZmmWCRwySWTgs8MgG6Oo%2FY5fZbAUhC%2BZ9JsfMl1SKYW%2BqyQRT2DMf3UvJeTwt4M5%2BJchKyrOr6D5gQwTQEpFK%2FwDeQv8Ayn%2BZDk%2B1Gyj1ew0SaC4gS5ntmCtX0ELQtQAM%2FEcv5Fwv1bQxr%2Bnhr4oms2ymP6xuCStSIbof6v8AdzYOaGAQ%2BXdTm1NdLjj5SN8QkG6FOvqBu%2BTjTrS2sbZLCMcVUmkpFGLn7Rf%2FAFv%2BFxTTme102DTuILIwZpKksW%2BzxWtW41%2FZyU2XlW41HhcahytOQJZVHKaXw%2Fd%2F7rY%2FzviAqQ21ldXtytrDG0k524qKmnj8sO736roNmNIltfVv7hFeaMnkUqTwpxNA2S2MaT5etS9w6WdtEvx1b42A7Symh%2F2C5zTzb%2BZun3swOjacGVKwrqMgoajeiJSr%2FOTDVdVZPYa3pOj%2BW7u31uKKzuZGP1dePP1Iz1UovxtJ%2FlYU%2Fl%2F5hOtyS%2BWrlis1Gm0pyfiR4%2Fi9Kv7SumcrvNYnu5DcXH7yToamrfSf6YL8ratLZ%2BZtJvoT6bwXMbEjuCwVh8uJauPFuFe%2Bx%2BYJ4NMawQiOFzyZOlDX4h%2FwQyQeVtAn1BY9R1QN9WU1toG%2Fa3qGYeGE3lnRLPVfM19LdAyWkTtcW8a7xOGaq1kGz7k%2FAM6moAACigA2AxJ7lojn72wANgKAbDLzZsirs2bNirs2bNirs2bNirs2bNir%2F9Hv%2BbNmxV2bNmxV2Qzz3p3P6rqKbFKwyt%2Fkn4lJPseWTPOVfnX5gmstNtdBtnMbajykuXHX0YyPh%2F2b%2FwDEcbrfm24MRzZI447GR59w6pMfNyWl7EdD1KM3Cp6dwoKldj%2B1zHE%2FRko0rz1rUtz9SvLe2lm2Hp8jC7BhWqV5xvUb%2FDnn01jPEin8pHgckemXmsTaHcxANw05o57O7IIKxliJYll%2FaRT%2B84%2FsNkIZhIkSjRDl6zs%2FwIjJCXFHkb5gp3%2Ba2r%2BbdPuEvYLVbLRpiFL27c2EvWkj0%2Fd8v2VpkGsfN2p3Kra3V2XicgEsQeQJ3qSNs7d%2BkdO1rSbKw1LhN%2BlbRXVJKFZyq8ZV3%2F3YGHLOEecvKFx5TvTLDym0idv3EvdG%2FwB9yf5a%2Fst%2B3lpHUOvsua4iNwbWCruHK%2FB0qN9j0zoy%2BarW48r2Oq3l1Le2sSizuGkqk6zgUVXMda8F%2FwCDTOO2M01rIs0XCRQ4kHqCqGnZl74NgkTlMqSOIZpPVNrXjGG8Qvfj2wXzSyqz1eO%2FtNSjQM8sVubhFbbkIpPiI%2BUR5Yca3q17IdPmtZ2js7yztriONNhyAKSciPtMJUfIZaXDWL%2Bra0jcq0ZYAV4yAq6mv8ynJf5Yex1PRjpUsfO%2F0pnuLJWNPUgkNZ4l%2Fm9Nh6vH%2BVpMRa2uvBcXej2Gp2rSC5tJJbOZkqW4v%2B%2FgY%2Bx%2FeJhtBB5sOi313boLa9ihMlo3EB5ClGkULy%2B16XJk4rhlZarBFAbZljtrS5Tg%2FoIF4fyOT1JjbC1L%2BbSbowyMwu4WrzJryX9h1PQpxw%2FFWFXNut9PB6srS6frlqI4JZHJ%2Br30bCsbOf5phx3%2FAN1T%2FwCRgPQbtreVrEFrW8gfnDU0dJUPF09unHD%2FAFeygjjvbi2haTQbpxcXlpHvLp9x9n6xClfjtjXi1P2P3b%2FGseE99ol9qtyjIKamYlktb6Mn0L5QKJ8Zp6d3x%2BH4vt8OD%2FvciTXPZaZ%2Bkdp5%2Bgt19Yad5p0%2Fe0vU2Y8T0NPiaM%2FtJ%2FuvOj6lcGysFaRlYxJWUjfkUXk3z5MM5p%2BV2l3U2pPdalFHK1sOLyqQxSZaFOdDWOT7W%2F7eTTzK8UdlcxREhXBTf%2BdzWg%2B7JxNji70HnTz%2B51GXyrrFxaapD69nfcRqSftqxHL1oj%2FOjPjtQ0GNYCfrCXWi3QMtlelhyjkYbFfdvsyx4M87Wy6zqemTq4X9KwQnmegkK%2Bmf%2BSi5G9M1PVfLUt3od3CJIGDEQS7iKUD4Zov8%2FjyErqrruPNkK58%2FJN7Sx0%2B0sDe3k0k9xA6JBJACGqwPHiKp8S8fts2F0mrDS3nubPThH6ZLa5YcQsnBvs3kSsCnJeXJuK%2FB%2FwAYmwQ%2FrXdjEsQRizhvjKCrUp8If4uW%2FwCyuK3Fs893p1nezfVdeDCOxmHFi8ZH%2B89wSeBjP2YuX%2BVFiYggA70Pmt9QzfyjdxXeiPeaY3rNYt9ZjdKUkgP2gyj7L8ftL%2FPgTz2tuLdJIT6cN1JFcxzJ2U7Sb%2Fs%2Fa5BsKfLEMvlPXby2sJI40uF%2F0izVuUcb05n0z3gkTlw%2F3237vHeddXN5pEMdnbmOys4BFcy0qDcF6GJa%2FwDFacmyX8Pu2R1QOi6Yupabd2F78dj6xjLVFUlpySaHwkUf7F0%2BDIrrvl6dr42N0eOtRIHs7ldkv4B9ijf8tKgfB%2FP%2FAHX28mPluyb0Vs7OdTL6SSReoK8%2FTZqN%2FrqOPL%2FJwTqdhFr9m1lqUhjnhcm2uv8AdltN%2FMKf7pb9tP8AZrjVhWHaHrEWqxjTb9gt9GKQytsXptxNf2sl35d3J0jznJbCojuQlR26cT%2Btc55qthdyXcyyJ9X8wWfx3ESbC6UbrcwfzS8fjfj%2FAHyfvPt88N%2FKuq3F3q1hqBIEyc4pWZuCkoAwck9MA50VPJV%2FMq2k0TznfCJQUmPJom%2BzJG%2FxcW9t%2FwDY4Q6cILa6ZY2eKRwslv6goaDfjy%2FaK4f%2FAJleadM80a8t1pcZ9GCJYmuG2MrD7TAfsqv2V%2Fmwr0WyuNXUw%2FVxci1%2BKLt%2Fw23wrg6qGVanr1vrK2t3csIry1aESBjxJEYYOQff4cjvm3zLbpZXLWTGC5vr%2FwCswRjfjBGoC8yfi%2BIjCPX2vNMu%2FqZDRNGKSAgUqxqgqKruF%2BH4sjsyPPIZZSXJ7knfG1e9%2Flxrdt5ksbqdSFu7eMLcW5O4%2BE0cV6xvnF75uVzcb14yyBW7%2FaO2KeS9RutC8yWd7DMYLfn6d3L%2Bx6D7SLJ7YhdkNd3UkRDRSXErxMDUFGclT9IwndCtpWrz6ZN8MskcDsGdojxkjcfZmip%2B2v8AL%2B3iWoySfXbiHUmFy14frKXqH4nL14zK%2FVuX7cbYEeJWDPQVpU0Pj0x6yqLL0pJUW4tXE1o5O9SaSRbeP28Cob1Z1T6vPKzxjeNSSQK9aV%2BznXLfUrdtDt9T1U%2BjeRxpa3iMvF5V41jcg%2Ftrx%2BLOd6VbaTqJlS7lMl5Iri3hHwRiQj920snhzODppWsii6zcGeSZg3po3NSy%2FD%2Fen4K9V542r0LyheaXcm5uaCCWNhxkl%2FvClOqcvs4rrn5g2enI9tpKi4uqlWck0rSvxP8Atf7HITazpc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2FLhpr3nLTKJ9UT19TB4zNHtCe3Jj3b2XIssp1Y8bUfFOQsix7SCSlAXpTmj4av5OnsdM%2BuzB3Zm9OWaNGD2%2FMgRTolP3sXP4Zv92fyYi6oITDVrG28x6NBeBvqWoWS1ivSeIikU8jFI%2BzLA6%2FGn%2B%2B3yFaq1pcXix28ZUGi3U2wadx%2FuziAEWv8Aq%2FH9vDLV7TzXeWrqbaWO4VhHeNHtFdCP7EhX5D4v9%2BfbwpC3liGgvIoVdSqt6pLPGr0pTj%2Bz8Xw4CUkEGil7RwRu9ZzwjPx8UZiKePShyb%2BRfMdhHM2kLEV%2BsDlDLQFncUCxcRX7WEF1DCs63zCs6r6c1Nkencr7rgXSpFsb5zCForepC9PiUEfZr4DADRVD%2BddUkPmPU4lUgVNtNG4qDw2Bof2kP2GyK1LECpY%2BAqTnUFhsta1Ce%2B1G3inuZCrySsgqwqFNRkwu9R8m%2BWIwscEHrharDBGjSH5tT4f9kcIoop4da6Vqt2GW0tbiQHbikbkH57UwHNFLbSvb3CNFLExSSJxxKsuzKwPQjOu3%2Fmq%2B1mFo1C2NmFMjhTQLGu%2FKRtumQfU%2FMWh3uoTXx0r1pJePKSWSnJlVU5lQNufHnhQxmOYxklSPiFCDvUZQKUIpUn7Jr0%2B7D8eYrBP7nRbUf61W%2FhmPmtkBFvptnEezCMkj78CpRZOY5w%2FBmWhBCjseuSyyn0pIpIr2CSr2gtbYTQt6aylufPp8PBWbCZPNurROskYgVkYOv7tSAVNRtg2780%2BYPNd5CdWuRJHEWkWONFjRaih%2BFAPljsqLeRrVh%2BjQt3GBRoXBBKAfFwag%2BLJ15B17yfealE2taTHcXMG63Eq%2FvbYL%2FvyH%2B6eFK%2F3iJyT9vAXkPygPNEuoxx3KQ3VrAHtYWP8AeOxpv%2FxWqijMv2WZMLdS8vBLx4pg9jqVqTFJIvwup6fvP5lP%2FDLillv5i%2BStPtL867pEEcem6hxkivLWjIk%2FevHb05ftZF9Okd5Et5mayvoWEtrdRmnCUfYmhYfzftp%2B3k3%2FAC68zLfx%2FwCFdWt1eElrbUoW%2BwGIrDPGv7CyU%2BLj%2B18eIeavKM3lq7WqfWNOkYizuXFeNesE9P8AiX7WNbqCncfm2f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V1PpOsrBduRLFcPb3JY9VditW%2F2XxZ0%2B91O2spIoJWL3E54wW0Y5SOf9UdF%2Fmdvhzm%2Fm2w%2BoeapJlBVdRjWdCDsZE2cfeuHdvfQW0BngZptVvEH1u%2FlG6gj%2B5hH7Kr0xHc0pD%2BYg8wa1NDFZWjSWtsrCRoiGJcn46b1YdF2yFWemzxsW1CN4Ej%2FZlUofubOs2WpxpNGl2oMP2eSbEe5yTXGkadqFpJaT26T2860YEVBB6EHx8MeCzdpunlEtpHYQ38GqRrFNaPA8EgJcFa%2FGqhadao2XBGlmbe2uCzevbGeRo2PcNJx%2F2S%2FDht51s3sLpYLoH6ncIq21wRU1UceLt9Hxf8Hhj5f8pXerWc%2Bq2VrHqE1oqQWdvNLwUoijmJB%2FO9W4%2Fs8cjVH3LezEvM2mXWqyabNozB7SS1WJ5SwBrHWnLv8A3ZUbfy4onlazmtrKC%2BJlNoHFFNFbmQaHvtTJ9rPlzU7GOO6vrRbeNioQQMrRxmn938IXj4YE0fQLnXBdQ2062l1CP3SSry9Xav7og0%2F4LDsikps7C3s1WK2iWJB%2Bygpg5lNOX0YAVr7TL0xXsxcxsVlhktwpFPtLVWwbf%2Ban0e8tp7LTYrmyILlpyT6hoRw2%2Fu%2FTbdlw3taoK4v7a1dY2dW5GjQ1qVHj%2FwA24Vah5a03VlNxZEQTtvyX7LH%2FAClyfjyfo3nrTrbV9PRNI1i6gM8qRENC8gb05OUI%2BNR6nR1%2F4HIRqOj655Vu%2FQ1SBogT%2B7mU1ikA7pJ0%2FwBi3xZGwdizhOeOXFCRBSPSZNX8maml1MhNsfgldPijdD1H%2BS37S8s6ZLrEEZt2uEe1W6VWtLsg%2BlKGHIGOReS%2F6wOR9dWtRp11dSQ%2FWHt4Wk%2Br93IGyU%2Fysk%2Fk%2FW5INATT9Z0eAWczGT6gr%2BoIlfcgBxsf2vT%2FAGMYxMSeE2D07m7PqBmjEzjWSO3EOUo%2BY72M%2BYfLcd3FJeQRxyo7EzQU792GQ60bU9Hkf9HTAwts1jdVeNl%2FyX%2B2n%2FEc7ZL5XstVSS58p6kYZqVbTrysif6tWPrRr%2FspVzmuvaDq2jzsup2JtA5NCfjtmNf91Tjb%2FYyccJ8tmgJPqV4JJLJpI3sYLq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FFMx2imJJSvhHLXj%2Fr4N%2FO9G%2FwAJ28o%2FYvY69%2BqOMgdlYzqPmWy8xr615aouoxAA3dk4dJB0%2FfRGjofBl54U%2BnCySRNSa1l%2B2vQq3861%2By65GPKcztqxjY7NEw4jYbU32zoNppF1qfrw2JX6yierHExoJivWIf5fH7DYYnZaY3pN9N5N1n9JJEbuIwyRoisY1kDbpVu3F%2FidM7xpl3Y%2BadFt7m5tle3vIUkaCYBx8Qowof5WB%2BPONG0jvLY28qlRUgqwoyOOu37LpiXl3XbjyZqk7XglmtZIfTEKNQGh5REFvsxr8XLjgIrdWQedvy7GiQPrfl4SNaxVe5s1q7Rp3ki%2FaaNf20%2B1kT07WGCqwcMjdJFNQc9C2N9BqNvHc29WiljSVGI2KyCopkFv%2FwAotHu9cOq2d1JYW0x53dhAo4O53JQt8MYf9ocMFyB23ZwGOQIkeCQGxqwfIsatNQSQrIrmOUbrIhoQfEEb5LLHzPP6X1TV4RqFo4ozFVL0%2FwApD8EmFms%2FlxeWBNxoEpuIhubSQj1B%2FqPsHwo0%2B4ltUmW7Ro5ojRo3BVhT2OWCi1t%2BbPJ1pFCfMXlJgtl%2Fx92VCyRHuwjb4kX%2Bdf2ciOlG2huhcX2n8JI2BE8FHHzMTb%2F8TVc6FpWutaySPblJEmHGeCQVVwP1ZGtcsIbe5N3p0Ui2MlWaM7mB%2FwBpQ4%2B1F%2FLkTGulhnDIYnYprf6tYaxaxxCDlxIaG7iko8Z7kGtWr%2B3ywxsdGl1WwitzGbkgkRzugDGnRm34R0%2FZbIJBZwxv9YhAVx8Qp0JPiBnafJl1eXekLNdyrKOXGNgADQD4g3Gg%2BE7Y8WyTLfiHNJbbQvNHle%2Fe50eQX%2BnXAD3Vg53EoWnKImhQmn7Pwv8AyYRX9xql1dmXWOS3XHiqMnp0QEkKq%2BA5fazrQwHqOmWmqQGC7j5D9lxsynxVsFsLeO39hb39tJbXMYlhlHGSNuhB%2FUffOZXy3%2Fl7UV05n5MgrpN1LTjLCT8VncEj%2FYf5Odt1nQbzR3JcerasfgnA2%2BT%2FAMrYB%2F5V3Y%2BdtAvhefubrn%2FuNux1jkQUYkD7Ubnir%2F6uEq8D1rTFk9XUdNgaHix%2Bu2XVoHPcD%2FfbfstnQfyAeb%2FFktC%2FptaSF1VgFNGTiXFfiA%2BLj%2FlZC9WuNd8p6kNM1e04anYsY2mY7TW%2FZG2pKjfsS4K003mkCHzl5WmDLazercWoB9WCvX1FB%2FeQt9lv8nIofYNRl5FPI3njTfO2li7taRXkQUXlp3Rj0Zf5on%2FYbJXirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FW7%2FmzZsVdmzZsVdmzZsVdgHVY9PmtHi1JlW3cgEuQBUbr1wdgPUdNttTtzb3IJWoZSOoYdxirzHztP%2Bi20aTyvdm6uDcJSCMJIPTVhRWKj7Bbbi2B9b8keZrnV3FvberbsQsVwHUKFJ6tU8hSvhk%2B%2FwAPGy1GwvLOkqK5ju0cIP3YQ%2BnItAPiif8A4nkkphKQaQOk6eml6ba6fGQVt4whPif2j%2FwWO1LTbPVrGfTr%2BITWtyhSWMjqD%2FEfs4MzEVwIsg2Ni%2BVPOHlm58p65NpU1XhP72znP%2B7IWPwn%2FXX7En%2BVgW28s63f2kWr29m76Ys6xyXQpxUggNUfa4iv2uOen9c8t6J5it0t9as0uo4zyjLVDKf8l1oy5EL7TriGW30Lytp7Q6Dbs0d7xI4Oz%2FFWPlycmNvib%2BfKziufETs7WXahOn8Ph9dVIn6a7%2FewDzPd3ukNplzYtxtEhW2adVBKzRktTkalOdf%2BBw60bydZ%2BaNR%2FwARaPq0VjOIw509bcLIkw%2B16yh%2FjRm%2F3an28de6dLYTXGk6xDztpx8aHoyn7Lqfb9nI3YX%2BreQ9ThS3pcWhcvazMBWSE%2FbgaQ%2FF8P8AJlrrDvunvmryB9buFvzAtnrkQD84z%2B6mKHkGRtu%2F82HWnO%2BoadLpU5aC4ZeUL9Gil%2B0jKR0aOYZOLO80jzho0d3Zv6kMn2WFPUhlGxVh%2By6H7WQWaO80rV1hvwBMjcfUAoskTbLIP%2BNsIr5oSu10tfOt7Ikt4th5ijQC6hkSsdz6fwfWIiCCr7UmTj%2Fl5JG%2FKTSdTjg%2FxDILh4UCUgHD7P8Axafj45GPMdkYtRkvbWf6jewEXNhcr9ppT9pEVatJWnxJx%2BznRPIfmz%2FFujfW5Y%2FSvLZ%2Fq94gBCmQCvNQfiVX%2B1xb7OA2NleaX%2Fkr%2FA19Jb2rO%2BlXbc7UvuFbuvL%2Bb%2FiWC7M7HOuarpdrq9jLY3i8o5Bse6t2df8AKXOP6jbaj5dvpLK5USBd0fcB07Ov8cMT3qkP5l6trkWp2kNi8sVr6CShoyVDyH7RJHXj8OQpfNfmCN1%2BsXcsnBeCrOfUAUdFHP4uP052ny%2Fq2g6veR6T5hgX94Almsp%2Fdsw%2F3W%2F%2BU37GSHUfyp8n6hUpavZse8DkD%2FgH5p%2BGCXNeTwM%2BbzeWxtr%2B3SVHFGMZKMP8oBqr%2FwANh9qv5gpr3kVfLV9zk1O3uIjFOwrzt4w1GZhUeqn2P8rJD5i%2FJJrK2lvNKufrSx%2FEYCnCXiOtCpKPx%2F1M503lq7tpDxDNUUUGlPwyJtWQflfpMWseaFtLgssZtZnDJ1VhxCn3651e38qanp%2Bs2ZX95brKG%2BtR7UVfio6%2Fs16YS%2Fk3pGmWxvNR%2BspJqfEW7WnR4kryLFW3PqN%2FL%2FLnW8I2UsW8x%2BVo71n1LT0CXp3mjGwlp3%2F4yD%2Fhsgl9oyXUaxX1u8LoCY2dStV%2FaG%2Fgc7JTEbiztrr0zcRrIYmDxlhWjDJCXQoeVeW9Rv8Ay1PKL25kuNO9ELEo%2BIjgaoKk%2FAqJyzqtrdQXkCXNs3qQyqGjcdCCK7ZFPMPl1Yg95aLWA7zQjfjXqw%2FycB6JrNzY3BW7uAbARKgUqSQVIC8KfCq8K8vhxq9wlntK4DvtJ07UgBfW6TU6FhvTwqN8FRyRyoHiYOjCoZTUEHH5FDC9Y%2FL6wuSZ9Ic2M3X0tzEfo6p%2FscL9B%2FLy8XVJNS8y3Yuo41aKz0%2BEkQrGwoWlO3N2zomVTDZV4l5n8s3Plq94oS%2BnTk%2FVZj27%2Bk5%2FnX%2FhsMNI893Wj2ht2thNVSEp8PGSlBK%2F%2BSf286nqOnWmqWcllexiSGQbg9QezKf2WGco13yhdaVMUT95A39zL0DDwPg%2BIZc3pPlzU5dStGa4IaeNgGZaAFWHJWoMOc5v5E1B7Wf6tcAoD%2B5PLb3jP0fYzo4xIYrZIo5UaOVQ6MKMrCoIPtidrZ29lAttaoI4UrxQdBU1OL5sCsO8%2FwD5e6V5708RXNINQgB%2Bp3oFStf2JAKc4m%2F4XOIWX5R%2FmVoOpummwIySAxNMssZhZG2q3Mqen80eeoKZqYq8l8h%2Fk%2FceW9Qt9Z1DU3W4gPJLS0JCEGvwTytT1U3%2Bx6arnWs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F1%2B%2F5s2bFXZs2bFXZs2bFXZs2bFXUzZs2KuzZs2KoXUjILG49E0k4EKetK43TYkhsoQp5EqGZvEnvgp1DKVbdW2I9jhDdaDqT%2FuLLWJbOzP8AulEVnAPVVkb4hiqB8wWUXmS%2BXTYWQi3ikZphuUlqOKmn7P8ANnOtRsiPW0TWUKqD9ofajYfZkQ%2B3%2FDLnYtH0Wy0W3aC0BJc8pJHPJ2J8ThV5u8tJrdoZrdQL6EH0z0Lj%2BQ%2F8a4bTbxXQPMGq%2Fl9r7mSs9jcUN3Cv2Zo%2B1xD4Sp%2FzZnaNYhtfNmgRaho7JcMwE1pKCASP246%2Fsn%2BZf58gsugWWtaPFp1xRL21qFkFCyP3U96YR%2BUfMt7%2BX%2BqvpmqEtpUsnGeOtQjE0FxD%2FwAzUxOy%2B5kHmGCOa1s7%2BVeEsFYpHI3SvwyBvDi647RtH1by3qEXmPT5VlgnWmo2C1Amj6rIrH4RMnVcCz3FvJ5x1pIqX2h30cVy3ouv2nQEeka9XZW5ZJNPult7dbZpTLasP9HlYUalP7uVf2JlH2v%2BEw891ZzY3tvqNtHdWz84pBUHoQe6sP2WX9rC7zJoEOu2Xp7LdRVa3lPY90b%2FACHwi0IahBqtdOo9hKf9LjY0Vf8ALU%2F78ybZFD591jS3R3gnRo5Ymp4MjA9snHkr8weRi0LzJII7pQEtdQc0SYdFWQ%2Fsy%2F5X7eH%2FAJw8uLqMDX9qg%2BtRL%2B8Uf7sQf8bLnJbuyjcNFKnND1U%2Fw8Dh5pfQo3Gc487eVFhMmq2KfuHNbmNR%2Fdsf92KP5G%2Fa%2FlyPeXPM%2Fmfy2Y4pmk1PRqfBBKpNwiDr6E3%2B7OH8j51%2B1ubXU7JLiKklvcJWjDqrDdWH%2FEsV5PntoFiuUuQOFxFvHKpKsPpWnLJZ5b8w65p1xEguXuIp3q8d07P1%2FZVm%2Bx%2Fkccbr%2Bhm2125sbPggX95AZq8FRhy3p%2FL8Srk181aDHqempqtvRLu2hDngPheMDmV%2F2P2ozjsrKLW5ju4Eni%2By4rQ9Qe4OL5D%2FACp5hgu7iOwkkUXFxD6yx9DWM8HNMmGJFFDRFRQioPUHIhrmgrAXubdK2z19WOleFepH%2BRkwymCkUIqD1BxBpWIaNq09o31WURrZoiem32ePEheCIB8VV%2BLJcGB3BBHtka1LQXVne0XnC9eUQ%2B0tevHxXA2lxazHfW620rx2atW4gkSqFOPCgdvjDClVwkA7hWYZswzZFXYnNBFPG0UyCSNvtKwqDimbFWE6voE1hIbu0Be3BrQVLIP8rxXJRo92b3T4Z2%2B1Ti3zG1cGkAih3B7ZSRpGvCNQqjsooN8NquzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxViPmbyo91cfpvQiINVT%2B%2Bh6RXSD9iXwl%2F33N%2FwWQzW9AXXo%2FXaFg7L%2B%2BhK0mjdBuafzACjrnYcDTWNrPKk8kYMsZDI42NR40w3tRW3z1p2l6ho%2BotLAfXVE5OgDVljA%2BLj%2FxZGv7OS2BbeaRbscpI5YuLQq3ETIfiQcv2ZVP90%2F8AsMk3mi1FjqBnt0CpcIHIUU%2BNT8RFP5tuWRDTFEulwPaP9YjVSfVjBIFGPM%2F7BvHCOSXqXlu6trnTI1t7Y2Zj%2BGW1YhmQ%2BJcfb5fzYcZBPKl1I7GRXHKGi3AY%2FajPRvdsnQNd8BFFDjnL%2FPWhJaXguIKRw33KngklPi%2F2Pxcs6jkY892Ul3onqwoZJLWRZeAHIlT8D7fJsAVBaLpUeueS9PtriYPcWykQXkfZ4yVDD%2FJP2WwX5X1NJ2NrQIGXkoXpzQ8JP65GPJfmOTR5G0zXLmGCzlYmzhZPSeE05ceP7UTjfliOhagkWs3CW0gkUXbPZjoZVkY8kQHr8OSHUJZD540vmYtVRBIAvoTo260JrGzU7cvhzaJ5jgm0t9O1u7giu%2FRdY%2BJ48oyCg%2Fd9QyfZ%2FwArJhPBFcwvbzqHikBV0PQg9sgt%2FwCSLpJy9pxniPRiQsgH8rfzYB5ql%2Fkq1hXU4ZigNwjsizftemU3Uf5Jzp%2BRXyloF%2Fpj3FzqYiR3YraxREsyx%2FzTOaL6j%2Fyp8CZKsSUOzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Hv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVg35iPrMEFld6XbR3CRM%2Fro1fUIIHwx%2Fs4U%2FlrqOkz3c1lYQmENFJI8DCgRzIDIg5b1JavTOiajZLf2cls1KsKofBh9k5ydpJPL%2FmzT9ZcBIWY2t5sFoD8Ls5C1%2FwCDkyQ5KyjWdLGi6ml3brSyvKxuo6I58P8AJPVclOiXZurPi5rLAfTf5fsn7sE3drBqFq9vLR4pV2I7dwy%2B%2BF2j6Xf2F5dS3EqNbyhViVa8iV%2Fbfag6%2FZXBdj3KnWURXLzYFYV5n8n3us6ut7btEITGsbc6hl418B8WFd75Ym8svHqVqPrQiCsJSPiikH2jQfsNnScayhwVYBlOxB3BGG1Sby7rf6YgZ5KCZftIBSmHeFllodlp95LeWqlDMKGIfYB7kDDPE%2BSuzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F%2F0u%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZFfM%2BipLW%2BSJZAf71CtaMPsygf8SyVZRAIIO4PbCDW6pP5YvDd6Wiu1Zbc%2Bi%2B9Tt9mv%2Bxw5xG3tbe1Vlt41jDHkwUUqfE4tgPNXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Pv%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV%2F%2FZ" ); - background-position:center center; - border:1px solid #00aa00; -} - -.yui-skin-sam .yui-h-slider { - background: url(bg-h.gif) no-repeat 5px 0; - height: 28px; - width: 228px; -} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-doublequotes.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-doublequotes.css.min deleted file mode 100644 index 223d27a..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-doublequotes.css.min +++ /dev/null @@ -1 +0,0 @@ -.yui3-skin-night .yui3-dial-ring-vml,.yui3-skin-night .yui3-dial-center-button-vml,.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,.yui3-skin-night v\:oval.yui3-dial-marker-max-min,.yui3-skin-night .yui3-dial-marker-vml,.yui3-skin-night .yui3-dial-handle-vml{background:0;opacity:1}div.base64-doublequotes{width:100px;height:100px;background-image:url("data:image/jpeg;base64,%2F9j%2F4AAQSkZJRgABAgEAZABkAAD%2F4RfJRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAAD0JAAAAnEAAPQkAAACcQQWRvYmUgUGhvdG9zaG9wIENTMiBNYWNpbnRvc2gAMjAwODowNzoxOSAxNDo1ODowNQAAA6ABAAMAAAAB%2F%2F8AAKACAAQAAAABAAABwqADAAQAAAABAAABRQAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABaTAAAAAAAAAEgAAAABAAAASAAAAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMR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0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZ%2F%2B01IlBob3Rvc2hvcCAzLjAAOEJJTQQlAAAAAAAQAAAAAAAAAAAAAAAAAAAAADhCSU0D6gAAAAAYEDw%2FeG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8%2BCjwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgo8cGxpc3QgdmVyc2lvbj0iMS4wIj4KPGRpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNSG9yaXpvbnRhbFJlczwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1Ib3Jpem9udGFsUmVzPC9rZXk%2BCgkJCQk8cmVhbD43MjwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNU2NhbGluZzwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1TY2FsaW5nPC9rZXk%2BCgkJCQk8cmVhbD4xPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCTxkaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxhcnJheT4KCQkJPGRpY3Q%2BCgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCQkJCTxyZWFsPjcyPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxTY2FsaW5nPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsU2NhbGluZzwva2V5PgoJCQkJPHJlYWw%2BMTwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuc3ViVGlja2V0LnBhcGVyX2luZm9fdGlja2V0PC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BUE1UaW9nYVBhcGVyTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNVGlvZ2FQYXBlck5hbWU8L2tleT4KCQkJCQk8c3RyaW5nPm5hLWxldHRlcjwvc3RyaW5nPgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQkJCQk8YXJyYXk%2BCgkJCQkJCTxyZWFsPi0xODwvcmVhbD4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD43NzQ8L3JlYWw%2BCgkJCQkJCTxyZWFsPjU5NDwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNUGFwZXJOYW1lPC9rZXk%2BCgkJCQkJPHN0cmluZz5uYS1sZXR0ZXI8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk%2BCgkJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9hcnJheT4KCQk8L2RpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhZ2VSZWN0PC9rZXk%2BCgkJPGRpY3Q%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD4tMTg8L3JlYWw%2BCgkJCQkJCTxyZWFsPjc3NDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTk0PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5wcGQuUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLnBwZC5QTVBhcGVyTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BVVMgTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5BUElWZXJzaW9uPC9rZXk%2BCgkJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC50eXBlPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvVGlja2V0PC9zdHJpbmc%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuQVBJVmVyc2lvbjwva2V5PgoJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnR5cGU8L2tleT4KCTxzdHJpbmc%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXRUaWNrZXQ8L3N0cmluZz4KPC9kaWN0Pgo8L3BsaXN0Pgo4QklNA%2BkAAAAAAHgAAwAAAEgASAAAAAAC3gJA%2F%2B7%2F7gMGAlIDZwUoA%2FwAAgAAAEgASAAAAAAC2AIoAAEAAABkAAAAAQADAwMAAAABf%2F8AAQABAAAAAAAAAAAAAAAAaAgAGQGQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4QklNA%2B0AAAAAABAAZAAAAAEAAQBkAAAAAQABOEJJTQQmAAAAAAAOAAAAAAAAAAAAAD%2BAAAA4QklNBA0AAAAAAAQAAAAeOEJJTQQZAAAAAAAEAAAAHjhCSU0D8wAAAAAACQAAAAAAAAAAAQA4QklNBAoAAAAAAAEAADhCSU0nEAAAAAAACgABAAAAAAAAAAE4QklNA%2FUAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA%2FgAAAAAAHAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAAAD%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FA%2BgAAAAA%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwPoAAAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA1UAAAAGAAAAAAAAAAAAAAFFAAABwgAAABAAcwB3AGkAcwBzAF8AYQByAG0AeQBfAGsAbgBpAGYAZQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABwgAAAUUAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAUUAAAAAUmdodGxvbmcAAAHCAAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAFFAAAAAFJnaHRsb25nAAABwgAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAAADhCSU0EKAAAAAAADAAAAAE%2F8AAAAAAAADhCSU0EEQAAAAAAAQEAOEJJTQQUAAAAAAAEAAAAAThCSU0EDAAAAAAWrwAAAAEAAACgAAAAdAAAAeAAANmAAAAWkwAYAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1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U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZADhCSU0EIQAAAAAAVQAAAAEBAAAADwBBAGQAbwBiAGUAIABQAGgAbwB0AG8AcwBoAG8AcAAAABMAQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAIABDAFMAMgAAAAEAOEJJTQQGAAAAAAAHAAIAAAABAQD%2F4TkjaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSIzLjEuMS0xMTIiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyI%2BCiAgICAgICAgIDx4YXBNTTpEb2N1bWVudElEPnV1aWQ6RTcxOTVFNTY1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkRvY3VtZW50SUQ%2BCiAgICAgICAgIDx4YXBNTTpJbnN0YW5jZUlEPnV1aWQ6RTcxOTVFNTc1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkluc3RhbmNlSUQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eGFwOkNyZWF0ZURhdGU%2BMjAwOC0wNy0xOVQxNDo1Nzo0MS0wNTowMDwveGFwOkNyZWF0ZURhdGU%2BCiAgICAgICAgIDx4YXA6TW9kaWZ5RGF0ZT4yMDA4LTA3LTE5VDE0OjU4OjA1LTA1OjAwPC94YXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhhcDpNZXRhZGF0YURhdGU%2BMjAwOC0wNy0xOVQxNDo1ODowNS0wNTowMDwveGFwOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhhcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ1MyIE1hY2ludG9zaDwveGFwOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9qcGVnPC9kYzpmb3JtYXQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iPgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8cGhvdG9zaG9wOkhpc3RvcnkvPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8dGlmZjpOYXRpdmVEaWdlc3Q%2BMjU2LDI1NywyNTgsMjU5LDI2MiwyNzQsMjc3LDI4NCw1MzAsNTMxLDI4MiwyODMsMjk2LDMwMSwzMTgsMzE5LDUyOSw1MzIsMzA2LDI3MCwyNzEsMjcyLDMwNSwzMTUsMzM0MzI7QzA1QTE5MDRGRjAwQUJEQzA1MUJERkFGMDIwNEVBNTE8L3RpZmY6TmF0aXZlRGlnZXN0PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24%2BNDUwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjMyNTwvZXhpZjpQaXhlbFlEaW1lbnNpb24%2BCiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U%2BLTE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6TmF0aXZlRGlnZXN0PjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDtENDYzN0NCOUQ0MUExMEJBN0VGNUVCQ0RCNjMxODMyOTwvZXhpZjpOYXRpdmVEaWdlc3Q%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY%2BCjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8%2B%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQACAYGBgYGCAYGCAwIBwgMDgoICAoOEA0NDg0NEBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEJCAgJCgkLCQkLDgsNCw4RDg4ODhERDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgBRQHCAwEiAAIRAQMRAf%2FdAAQAHf%2FEAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4%2FPE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BCk5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0%2BPzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BDlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq%2Bv%2FaAAwDAQACEQMRAD8A7%2FmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmrlHI2utXn6WltnFESb0RFSp41WjD5q3LCBaslzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2E2rj0LuzvF7PxftUf8AXPLDnC3XI0ewdpOkTK4P08T%2FAMK2Ec1TLNgaxmE9pFIDy%2BEAn3GxwTgV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F%2F0e%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXYUeZpfR0a4kpUAx19h6i74b4X65CbjR76FV5FoJKKe5C1GIVLdDuGhuXs2IKOX4gfsvGdx%2FskKtkiyD6bctHHbXgPImOC4qOpXj6E1ff4Mm4Ndxkpc770BvNmzZFLs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Lv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVokKCT0G%2F3ZgaioNQemANZuhaWLyE0LlY1%2BbGn6sWspA8QA%2FZ%2FUcVRWbNmxV2bNmxV2bNmxV2NZQwKnodj9OOzYqwDT4iiPZsa%2FVLm5sj7I%2F76L%2BOTXTpjPZQSt9pkAb5r8JyKXqfUvMOpIQOFxFDfoP8qFvTl%2F4Q5INDkrFPAf8AdUhI%2FwBV%2FiH8cnLeAPcxHMprmzZsgydmzZsVdmzZsVdmzZsVdmzYyWRIo2kkYKiirMdgAMVX5sjTeaGl1CzsbSAOLuX0w7k14KCzyAD%2BUZJBirebNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F9Pv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVo4CXUFa9e0CbJRWkr%2B0RWlMHZEJ5WtPMtzE5%2BGYJKnyK0%2F4kuEC1ZeM2IW0okjFT8S7H%2BuL4FYz52mMWn2tDTlcpX6FbDHR5ecCH%2BZevywl%2FMM8dJtn7LdJ%2BKvgry9ccrOJ69KVw9E9GS5s2bAh2bNmxV2bNmxV2bNmxVi3miFU1LSbxvsStJYzH%2FJnSi%2F8ADYpoEzLcxq1T68FGr%2FvyE8GrgjzdC0mhXEsY%2Fe2pS5i%2F1omDf8RwttJRHdrcDaNbhZVI6endIG%2F4mcnHeJCDzDL82bNkEuzZs2KuzZs2KuzZs2KurkZ843Zhs4bVTQzvVqfyrvg3zHNPb2UMsLtGBPGJSpIqjEqRUb9ch%2BvSSvp0JlcvJCLyMuxJb4JNvi%2F1SuEBVvkaX9L%2BZbm8Sv1fTbf0Y6%2F78lPxH%2FgFzpeRvyPbWcXlyyubWBIXuoxJOUG7uKjk5%2FaOSSoxPNXZs2bArs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FU7%2FmzZsVQ2osyWM7o3FlQkMOxGPtZhPBHKCDyUE08e%2BM1Bedjcr4xPT%2FgThV5cvBJbpGergEfMDcYa2PkqfZs2bArs2bNirs2bNirs2bNirshfnRGtb7T9TX7LcoJD2qDzSv3vk0wl81WDajodzDGKzRj1oR35R%2FFT6RthHNXaVcrKsUtftDi304dZz7yrqPrQCIncdMnsEnqRK%2Fcjf54yVjP5gwtJ5ckcD%2B5mik%2BivH%2FAI3wD5RnEtpwrWgw983RGby1qiqKlYGkA%2F4x%2FvP%2BNchnke5BIUGoPQ%2FPEJHJ6XG3JFbxAOPxOA1iX7sUwIdmzZsVdmzZsVdmzZsVUbqBbq2mtm%2BzMjRn5MKZDLP4rC2UVq9qYj7SWshWn%2BtxOTnIVG4ttWvdNaiiK7FxGDtWG6Ti%2FwDwMuShzRLky%2B1lE9vFMP8AdiK33gYscKtBmDWhtq%2FHbOyMp68SeSH5UOGpyJ5pYde3moWPmW5KzH0pIo2WNt0A3Wv0ts2D73zJ6FgzxqqXpKpHG9eDMx7EYXed45VeC4gPCdYyqua0I5q5VgOv2cAW8sWo2QMqhwwoyHcVyQFhVOLzvrNrdf6fFHLFX4kVeBH%2Br1%2F4bJlp%2Bt2GqWrXFnICyKWeJtnUgV3XOP67qFjaFLHUrprecy%2BlZajxPDmN1jn8Dv8Aa%2By%2BIaXrclrdtZ34NrfR1USofgeo2K06c%2F8AgcBCXr%2FlvXRrdnzk4rcoSJFXYfMbnDzOV%2BTr82eqAOQIpaBq7AV2r%2BOdTriRSEp8z8RoN9I5AWJPV5HYD0yHr%2BGQg3Ntq1lcLazx3CiZviiYOKzQo9Kjb7YzoWqRevpt5AOskEij5lCOmc60%2BWCK0j9ONYo5IYp%2BEahQWBeNjRafEcMVTvTb%2B80fyHZ3FugE9vSORJBUqPVZW%2BEHw3yVaXeC%2FsobulGkX41HQMNmH%2FBZzC%2B1iTTbadZUkjtJjzkQqSKqNm5fsdMPfyr1%2FRdT8vra2E5N5C8kl3bSMTKpkctz%2BL7SP9peOA7fFkIkgkCwOfkz7NlA1y8DF2bNmxV2bEJLy1injtpJVWeavpREjk3Hc8V64virs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Xv%2BbNmxVplDqUbcMKH5HIPokjWsstqx%2BK2lZPf4Wpk5yF6nF9R8xswHGO8QSj%2FAFh8D%2Fqrkoc6VmSMHUOOjAEfTjsAaZMXhMRPxRnYf5J6YPyJV2bNmxV2bNmxVQuzOtu729PVUclBFa07U98DafqsF6i9EkI6ePywwyF6vG2i6oJRUWl6xZCP2JOrr%2FsvtLhG6s0yiK4X6Zfi4QI7Vb9lv5h%2FXDHrgV5c8B0LzLc2Q%2BGF29WDw4SfF%2Fwp%2BHOg6ZMHi4j2YfTkZ%2FMGwpFaazGDytm9GYj%2FAH25%2BEn%2FAFX%2FAOJ4N8uXwliicnps305LmFZDewrc2dxbt0lieNvkylc45%2BX10UCQzHjLATE4P%2BQeNc6L55e5i0J57WVonikRmZDSq7jf2yB2Op%2FVYor2%2FwBNjktpAGjv7ZvU%2BInoy8Vao%2Fa44xCQ9as25RVBqKnfBGRby9rBEsljcIY0aQ%2Bg5FCCQD6bj9lslGAikN5s2bArs2bGyOI0aRuiAsfoFcVS%2B%2F1q2sJltyrSytuyp%2ByDsC3zwxBqAfHfI%2Fodmt2z6pcjnJK5dAexPT%2FgRkhxV2c782mSy82WUgNIdUhNs4PTmlXQ%2FwDBDOiZAvzLb6nHpOrlFkjs7lWdG9yvxVG%2FwiuGJ3Up3YTJFr7op%2BC8t1ljHjxodv8AYtkiyHbxx6XfKx%2FcXBilJ3%2BAsVUV8FRlyYA4Z80DkkPmq3EtlHJSpR%2BJPgHBH66ZBtIufqt9Np8pALHnEpO5p1oM6Xq0P1jTriPoePIfNdxnLtZtrGZluBcG3vF%2BFJYuJfx40IIxHJKzzb5et9ZtZYp1LwygcgPtKy%2FZkT%2FKWuRKKCOC6tNH1CblcWiILDUWHH6wg6wyDejx9Fw4sfOMjEBY5biH1HgLy8VYulOfJV%2By38q4ndH9LlL219K4iilHrWzLxlhI6SgE1%2F2SnFKo0Czxy28zMqcSzspIYBPj2I%2F1cd%2FytnVZdNQ2D1I%2BESMoPw%2FzMftdMG20TSQyyblmjenzoc4TY6ld6ddyKwMUsbFZoHqNwd1KnGXRXs9n5%2Fv7lg98GlWhMjwk1A%2Fm4k%2FF7jDSwSPULTTJI3PGBphGNwG4OHVW%2BgnONX%2BsWFpDFPaSSJcTESG3TcRlf2uRK%2Fazq%2BkR3aeT7e%2BjnX6yoW8ibht%2B9i9Tg%2B%2FQ98QVZHqstutowuSPSdSpV91IPVWzif1i98t%2BZ7m40FjbSWUrNCqEmkex4EH7acT9lv2c6lonmbTvMUTWdwgiumWktrLQhge6H9of6uRLzd5ZurDVP8Q2KetYFUW7jXeSKi%2Bm0hH7UZH7X7OCY4g2YM0sMrjvexB5SHcXsnkPz3Y%2BcdPqKQ6lAB9bta%2F8lI69Y2%2F4XJeDXPJlvPe6JqMeq6NMYLuE842To6ntToyuv2k%2Faz0J5E8%2B2HnGyI2t9VgA%2Bt2ZP0epH%2FNEf%2BEyESeUuff3tmbFAx8bB9H8Uf4sZ8%2F6P82TMMLNb1iDRrQ3EpBkkPC3j7s5%2FwCNV%2B0%2BGVc4n5m8yfpnzJcsr%2F6HYsLe232PBv3j0%2Fy3%2BH%2FY5JxkLourX175%2Ftb28maSZrloqsdlQ1Tgo%2FZUDO755%2B8uxlvPcMI6i6LAe2zZ6BwlS7NmzYFdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVf%2FW7%2FmzZsVdkb83W5%2BrW1%2Bg%2BK1kAc%2F5D%2FCf%2BG45JMC6jare2FxaEf3qMo%2BdPh%2F4bCNiqV6VOOcTV%2BGReB37%2FaX9WHoyFaJMz23BqiWE7juCh%2FsyaRsHRXHRgCPpwy52gLs2bNkUuzZs2Kuwu1rS49W06Wzb4XI5Qv8Ayuu6nDHMemKvONE1KWGVrG7rHPCxRgeqsppk7sb0XC8W2lUbjxHiMhnnnTHtLmPXrZfgakd1TsR9iQ%2FP7LYtomq%2FWI0Iakybof4H55LmFZdqNlFqNjcWMwqk6FD8z9k%2FQc515XuZbW4l0%2B5%2BGWFzE6n%2BZTTOlW063EQkXY9GXwPhnO%2FNsS6T5qtbofBHqaniexmi%2B2v%2BsU4v%2FlfFgHcrPTFbanZNb3caywyApLE3Qj3zjutwW%2FljzBc6Pp6fV9JHpsLNSSgR1HIorV3Vvizq2jXQk%2BAndlBA9xnNvzRiWPzJBJWnr2gJP%2FGNyv8AHAdikJ3YGf0o5pZDIboSD1GJJ9aAgh6%2F5aUzoFnN9YtYZ6gmRFY06VI3zlXk%2FVI5bi2hnlBgdBuxFFahhfr0rSNsnHlXU4JI5NJaSt1avIQm%2B8RaquD0I%2BLjkpbgIZJmzZsirsDagC1jcqvUxOB%2FwJwTjXUMrK32WBB%2BWKpfofE6Xb8f5d%2FnhjkMPmvR%2FKlrJBqkxBSVkjC0PIDpTfI15s%2FMNbu3jbR5plsZVp69swRi9N0eSjMnH%2BRcVpm669cWWtXGnatwjgKma2uPsj0x%2FNXw%2FayOfmLr%2BhX3l%2BPTYrkXM%2BpGtm1uPUUceX7yRx8KLtx%2F1s5xoN%2FefpVr6C8muVVfUuLO8kMrEIeTem7faRk5Iy5FdTuZ9B169trGZvqkc5eFD8SmJzzUcTtsrceWHzTT3fRJv0p5UZvtOYYrgCu%2FJV4P%2FwANHnPrj83vM2lX9zpWoBJYInaJ540pOi1%2BGRQDxf4cln5Z3qT2stjWrK0iexEgE60%2F2XLOUfmHYNZeZbhWP94Ayn%2FV%2BD%2FjVclLlbEdQn955q1wTiU3huLadeQCsfSljO9VNev%2FAA0bYHub1Z7V5yWkhHxpcVHJNwGiuP8AKStVk%2FbyGafqLQxyafO5S2lPJWUAmGQ%2F7uiB8f8Ad0X%2B7F%2Fy8Ctd6jpl3Lb3v%2BkQTpxniqTDcQn7LoR%2FwUb%2FALDZCyyekWl9ZyaFLPelZGN2tqDEtZJHenEs67ckpVXwq1bU7G1iKWvqtcCR4bkkhFYx%2FCHXhvvX48C%2BU7H1SbK3k9Wya5hv4HchSBF8FxBL2WeOJ1k%2F4s9P4cu%2F0j%2Fc1FphmFxPLeOhZBxAiL8jt40%2Fa5YegV6PprvLpcE8sfpTNbh3QVoGK12zluoQ2PnZih42fmWIVt5z8Md4q9I5P5J17Z2A8YrWVl%2BERoaDwoNvupnLtb02LzREdR0hBba7bVe4tEPFZwpr6s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xKXcslu7tXb1%2BSBq%2FwCSzZK9c06xuNUutStkBls5IFkAIAMoHqUUfzNRkbCPW5Xs70rZcVtL0%2BtCoAFVc1oK%2FwArni2RIShdD0rU9Z0g2UNW1DR5JLG%2BirRlQuXhmp1ZP72M%2FwCph75g0K2sra21G8ch5baGJUpt6yARuvL6OWEQk1eJrq9s55YLxBzuGhJEjr3LKvxSqv7WISanq2oQRXGryvd2MtVhuSQ8aNQch8OyNjsqElhK1hbcr%2Fcv3K%2FyV%2FycRSQBmUiifsfQM6FpfljSbrR0mCy3EjDlDIzN9sGnphU%2FZ%2FlbIrqnl%2F6jM3Cb1VRqOoU8078XoOHPISIiQCd5ckgE3tyS4StK6xSy%2FDJ%2B7HqseO%2FYVw0W2thatp10he2b7YH21cfZljP86f8AD%2FYxO4tbO4so4I7ZUvG5Lpl3PssprUws392JD%2Fut%2FwCbAOh6sLuU6VqYMF4hKRu2x5DrFID0YY7rsh4tMn06%2FkspjzjniaS1nQfDIE%2BJWXwdafEv7Od0ugnmL8tmYipWEOB1oGWp%2FwCH5Zy4hoT9WuU5BTzj7FHp%2FeIe3%2BX%2FADrnR%2FysvRfaHeaJIwZ4RJGo8QDzQ%2F8AAy5OPVBfPNxbpMpifYqaBu4IwFYWlx9fEIJU7lmH7S%2F83ZJ9e0x7K9unRg8azMkoHWJySVR%2F9YH4W%2Bzj%2FKtvFdaxBDLQKzAVO243G%2F8ArYPJUXb2NvDZtdyWxe3B4meCQ%2BtG37Jkjb9lafaXHRXl9q2r6etnWJ7Yxx28h%2B1UNyMjt%2FlH4myX6lp1poPm57CIFLG8jikCsKisqqXWncc2%2BzhLZW0Om35hCuLiCeSgIHFY67KT9rl4YaV63IwMVSakg1pt27eGRuzvrTWILdYbnlcIWXSdQc8W5pXlp91%2FLIP91M%2F94mG9tcfW3AQ14xgsPH4c4Zp%2Btz6HqN2rJ61nNIy3loTTkA54yIf91zR%2FailyRNUinpV0iXqyyxw%2BjdW5Md%2FaN1iPdqf74f8A5Jtka1ZZ4LWYxsySKpaCRT8QI%2BIxkj2Hw5KLe6%2FTsUF%2Fp1wsmrRRk2l0QAL6Fft290g%2Fu7uP7Lo395hFquqaL9XZmmWCRwySWTgs8MgG6Oo%2FY5fZbAUhC%2BZ9JsfMl1SKYW%2BqyQRT2DMf3UvJeTwt4M5%2BJchKyrOr6D5gQwTQEpFK%2FwDeQv8Ayn%2BZDk%2B1Gyj1ew0SaC4gS5ntmCtX0ELQtQAM%2FEcv5Fwv1bQxr%2Bnhr4oms2ymP6xuCStSIbof6v8AdzYOaGAQ%2BXdTm1NdLjj5SN8QkG6FOvqBu%2BTjTrS2sbZLCMcVUmkpFGLn7Rf%2FAFv%2BFxTTme102DTuILIwZpKksW%2BzxWtW41%2FZyU2XlW41HhcahytOQJZVHKaXw%2Fd%2F7rY%2FzviAqQ21ldXtytrDG0k524qKmnj8sO736roNmNIltfVv7hFeaMnkUqTwpxNA2S2MaT5etS9w6WdtEvx1b42A7Symh%2F2C5zTzb%2BZun3swOjacGVKwrqMgoajeiJSr%2FOTDVdVZPYa3pOj%2BW7u31uKKzuZGP1dePP1Iz1UovxtJ%2FlYU%2Fl%2F5hOtyS%2BWrlis1Gm0pyfiR4%2Fi9Kv7SumcrvNYnu5DcXH7yToamrfSf6YL8ratLZ%2BZtJvoT6bwXMbEjuCwVh8uJauPFuFe%2Bx%2BYJ4NMawQiOFzyZOlDX4h%2FwQyQeVtAn1BY9R1QN9WU1toG%2Fa3qGYeGE3lnRLPVfM19LdAyWkTtcW8a7xOGaq1kGz7k%2FAM6moAACigA2AxJ7lojn72wANgKAbDLzZsirs2bNirs2bNirs2bNirs2bNir%2F9Hv%2BbNmxV2bNmxV2Qzz3p3P6rqKbFKwyt%2Fkn4lJPseWTPOVfnX5gmstNtdBtnMbajykuXHX0YyPh%2F2b%2FwDEcbrfm24MRzZI447GR59w6pMfNyWl7EdD1KM3Cp6dwoKldj%2B1zHE%2FRko0rz1rUtz9SvLe2lm2Hp8jC7BhWqV5xvUb%2FDnn01jPEin8pHgckemXmsTaHcxANw05o57O7IIKxliJYll%2FaRT%2B84%2FsNkIZhIkSjRDl6zs%2FwIjJCXFHkb5gp3%2Ba2r%2BbdPuEvYLVbLRpiFL27c2EvWkj0%2Fd8v2VpkGsfN2p3Kra3V2XicgEsQeQJ3qSNs7d%2BkdO1rSbKw1LhN%2BlbRXVJKFZyq8ZV3%2F3YGHLOEecvKFx5TvTLDym0idv3EvdG%2FwB9yf5a%2Fst%2B3lpHUOvsua4iNwbWCruHK%2FB0qN9j0zoy%2BarW48r2Oq3l1Le2sSizuGkqk6zgUVXMda8F%2FwCDTOO2M01rIs0XCRQ4kHqCqGnZl74NgkTlMqSOIZpPVNrXjGG8Qvfj2wXzSyqz1eO%2FtNSjQM8sVubhFbbkIpPiI%2BUR5Yca3q17IdPmtZ2js7yztriONNhyAKSciPtMJUfIZaXDWL%2Bra0jcq0ZYAV4yAq6mv8ynJf5Yex1PRjpUsfO%2F0pnuLJWNPUgkNZ4l%2Fm9Nh6vH%2BVpMRa2uvBcXej2Gp2rSC5tJJbOZkqW4v%2B%2FgY%2Bx%2FeJhtBB5sOi313boLa9ihMlo3EB5ClGkULy%2B16XJk4rhlZarBFAbZljtrS5Tg%2FoIF4fyOT1JjbC1L%2BbSbowyMwu4WrzJryX9h1PQpxw%2FFWFXNut9PB6srS6frlqI4JZHJ%2Br30bCsbOf5phx3%2FAN1T%2FwCRgPQbtreVrEFrW8gfnDU0dJUPF09unHD%2FAFeygjjvbi2haTQbpxcXlpHvLp9x9n6xClfjtjXi1P2P3b%2FGseE99ol9qtyjIKamYlktb6Mn0L5QKJ8Zp6d3x%2BH4vt8OD%2FvciTXPZaZ%2Bkdp5%2Bgt19Yad5p0%2Fe0vU2Y8T0NPiaM%2FtJ%2FuvOj6lcGysFaRlYxJWUjfkUXk3z5MM5p%2BV2l3U2pPdalFHK1sOLyqQxSZaFOdDWOT7W%2F7eTTzK8UdlcxREhXBTf%2BdzWg%2B7JxNji70HnTz%2B51GXyrrFxaapD69nfcRqSftqxHL1oj%2FOjPjtQ0GNYCfrCXWi3QMtlelhyjkYbFfdvsyx4M87Wy6zqemTq4X9KwQnmegkK%2Bmf%2BSi5G9M1PVfLUt3od3CJIGDEQS7iKUD4Zov8%2FjyErqrruPNkK58%2FJN7Sx0%2B0sDe3k0k9xA6JBJACGqwPHiKp8S8fts2F0mrDS3nubPThH6ZLa5YcQsnBvs3kSsCnJeXJuK%2FB%2FwAYmwQ%2FrXdjEsQRizhvjKCrUp8If4uW%2FwCyuK3Fs893p1nezfVdeDCOxmHFi8ZH%2B89wSeBjP2YuX%2BVFiYggA70Pmt9QzfyjdxXeiPeaY3rNYt9ZjdKUkgP2gyj7L8ftL%2FPgTz2tuLdJIT6cN1JFcxzJ2U7Sb%2Fs%2Fa5BsKfLEMvlPXby2sJI40uF%2F0izVuUcb05n0z3gkTlw%2F3237vHeddXN5pEMdnbmOys4BFcy0qDcF6GJa%2FwDFacmyX8Pu2R1QOi6Yupabd2F78dj6xjLVFUlpySaHwkUf7F0%2BDIrrvl6dr42N0eOtRIHs7ldkv4B9ijf8tKgfB%2FP%2FAHX28mPluyb0Vs7OdTL6SSReoK8%2FTZqN%2FrqOPL%2FJwTqdhFr9m1lqUhjnhcm2uv8AdltN%2FMKf7pb9tP8AZrjVhWHaHrEWqxjTb9gt9GKQytsXptxNf2sl35d3J0jznJbCojuQlR26cT%2Btc55qthdyXcyyJ9X8wWfx3ESbC6UbrcwfzS8fjfj%2FAHyfvPt88N%2FKuq3F3q1hqBIEyc4pWZuCkoAwck9MA50VPJV%2FMq2k0TznfCJQUmPJom%2BzJG%2FxcW9t%2FwDY4Q6cILa6ZY2eKRwslv6goaDfjy%2FaK4f%2FAJleadM80a8t1pcZ9GCJYmuG2MrD7TAfsqv2V%2Fmwr0WyuNXUw%2FVxci1%2BKLt%2Fw23wrg6qGVanr1vrK2t3csIry1aESBjxJEYYOQff4cjvm3zLbpZXLWTGC5vr%2FwCswRjfjBGoC8yfi%2BIjCPX2vNMu%2FqZDRNGKSAgUqxqgqKruF%2BH4sjsyPPIZZSXJ7knfG1e9%2Flxrdt5ksbqdSFu7eMLcW5O4%2BE0cV6xvnF75uVzcb14yyBW7%2FaO2KeS9RutC8yWd7DMYLfn6d3L%2Bx6D7SLJ7YhdkNd3UkRDRSXErxMDUFGclT9IwndCtpWrz6ZN8MskcDsGdojxkjcfZmip%2B2v8AL%2B3iWoySfXbiHUmFy14frKXqH4nL14zK%2FVuX7cbYEeJWDPQVpU0Pj0x6yqLL0pJUW4tXE1o5O9SaSRbeP28Cob1Z1T6vPKzxjeNSSQK9aV%2BznXLfUrdtDt9T1U%2BjeRxpa3iMvF5V41jcg%2Ftrx%2BLOd6VbaTqJlS7lMl5Iri3hHwRiQj920snhzODppWsii6zcGeSZg3po3NSy%2FD%2Fen4K9V542r0LyheaXcm5uaCCWNhxkl%2FvClOqcvs4rrn5g2enI9tpKi4uqlWck0rSvxP8Atf7HITazpc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2FLhpr3nLTKJ9UT19TB4zNHtCe3Jj3b2XIssp1Y8bUfFOQsix7SCSlAXpTmj4av5OnsdM%2BuzB3Zm9OWaNGD2%2FMgRTolP3sXP4Zv92fyYi6oITDVrG28x6NBeBvqWoWS1ivSeIikU8jFI%2BzLA6%2FGn%2B%2B3yFaq1pcXix28ZUGi3U2wadx%2FuziAEWv8Aq%2FH9vDLV7TzXeWrqbaWO4VhHeNHtFdCP7EhX5D4v9%2BfbwpC3liGgvIoVdSqt6pLPGr0pTj%2Bz8Xw4CUkEGil7RwRu9ZzwjPx8UZiKePShyb%2BRfMdhHM2kLEV%2BsDlDLQFncUCxcRX7WEF1DCs63zCs6r6c1Nkencr7rgXSpFsb5zCForepC9PiUEfZr4DADRVD%2BddUkPmPU4lUgVNtNG4qDw2Bof2kP2GyK1LECpY%2BAqTnUFhsta1Ce%2B1G3inuZCrySsgqwqFNRkwu9R8m%2BWIwscEHrharDBGjSH5tT4f9kcIoop4da6Vqt2GW0tbiQHbikbkH57UwHNFLbSvb3CNFLExSSJxxKsuzKwPQjOu3%2Fmq%2B1mFo1C2NmFMjhTQLGu%2FKRtumQfU%2FMWh3uoTXx0r1pJePKSWSnJlVU5lQNufHnhQxmOYxklSPiFCDvUZQKUIpUn7Jr0%2B7D8eYrBP7nRbUf61W%2FhmPmtkBFvptnEezCMkj78CpRZOY5w%2FBmWhBCjseuSyyn0pIpIr2CSr2gtbYTQt6aylufPp8PBWbCZPNurROskYgVkYOv7tSAVNRtg2780%2BYPNd5CdWuRJHEWkWONFjRaih%2BFAPljsqLeRrVh%2BjQt3GBRoXBBKAfFwag%2BLJ15B17yfealE2taTHcXMG63Eq%2FvbYL%2FvyH%2B6eFK%2F3iJyT9vAXkPygPNEuoxx3KQ3VrAHtYWP8AeOxpv%2FxWqijMv2WZMLdS8vBLx4pg9jqVqTFJIvwup6fvP5lP%2FDLillv5i%2BStPtL867pEEcem6hxkivLWjIk%2FevHb05ftZF9Okd5Et5mayvoWEtrdRmnCUfYmhYfzftp%2B3k3%2FAC68zLfx%2FwCFdWt1eElrbUoW%2BwGIrDPGv7CyU%2BLj%2B18eIeavKM3lq7WqfWNOkYizuXFeNesE9P8AiX7WNbqCncfm2f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V1PpOsrBduRLFcPb3JY9VditW%2F2XxZ0%2B91O2spIoJWL3E54wW0Y5SOf9UdF%2Fmdvhzm%2Fm2w%2BoeapJlBVdRjWdCDsZE2cfeuHdvfQW0BngZptVvEH1u%2FlG6gj%2B5hH7Kr0xHc0pD%2BYg8wa1NDFZWjSWtsrCRoiGJcn46b1YdF2yFWemzxsW1CN4Ej%2FZlUofubOs2WpxpNGl2oMP2eSbEe5yTXGkadqFpJaT26T2860YEVBB6EHx8MeCzdpunlEtpHYQ38GqRrFNaPA8EgJcFa%2FGqhadao2XBGlmbe2uCzevbGeRo2PcNJx%2F2S%2FDht51s3sLpYLoH6ncIq21wRU1UceLt9Hxf8Hhj5f8pXerWc%2Bq2VrHqE1oqQWdvNLwUoijmJB%2FO9W4%2Fs8cjVH3LezEvM2mXWqyabNozB7SS1WJ5SwBrHWnLv8A3ZUbfy4onlazmtrKC%2BJlNoHFFNFbmQaHvtTJ9rPlzU7GOO6vrRbeNioQQMrRxmn938IXj4YE0fQLnXBdQ2062l1CP3SSry9Xav7og0%2F4LDsikps7C3s1WK2iWJB%2Bygpg5lNOX0YAVr7TL0xXsxcxsVlhktwpFPtLVWwbf%2Ban0e8tp7LTYrmyILlpyT6hoRw2%2Fu%2FTbdlw3taoK4v7a1dY2dW5GjQ1qVHj%2FwA24Vah5a03VlNxZEQTtvyX7LH%2FAClyfjyfo3nrTrbV9PRNI1i6gM8qRENC8gb05OUI%2BNR6nR1%2F4HIRqOj655Vu%2FQ1SBogT%2B7mU1ikA7pJ0%2FwBi3xZGwdizhOeOXFCRBSPSZNX8maml1MhNsfgldPijdD1H%2BS37S8s6ZLrEEZt2uEe1W6VWtLsg%2BlKGHIGOReS%2F6wOR9dWtRp11dSQ%2FWHt4Wk%2Br93IGyU%2Fysk%2Fk%2FW5INATT9Z0eAWczGT6gr%2BoIlfcgBxsf2vT%2FAGMYxMSeE2D07m7PqBmjEzjWSO3EOUo%2BY72M%2BYfLcd3FJeQRxyo7EzQU792GQ60bU9Hkf9HTAwts1jdVeNl%2FyX%2B2n%2FEc7ZL5XstVSS58p6kYZqVbTrysif6tWPrRr%2FspVzmuvaDq2jzsup2JtA5NCfjtmNf91Tjb%2FYyccJ8tmgJPqV4JJLJpI3sYLq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FFMx2imJJSvhHLXj%2Fr4N%2FO9G%2FwAJ28o%2FYvY69%2BqOMgdlYzqPmWy8xr615aouoxAA3dk4dJB0%2FfRGjofBl54U%2BnCySRNSa1l%2B2vQq3861%2By65GPKcztqxjY7NEw4jYbU32zoNppF1qfrw2JX6yierHExoJivWIf5fH7DYYnZaY3pN9N5N1n9JJEbuIwyRoisY1kDbpVu3F%2FidM7xpl3Y%2BadFt7m5tle3vIUkaCYBx8Qowof5WB%2BPONG0jvLY28qlRUgqwoyOOu37LpiXl3XbjyZqk7XglmtZIfTEKNQGh5REFvsxr8XLjgIrdWQedvy7GiQPrfl4SNaxVe5s1q7Rp3ki%2FaaNf20%2B1kT07WGCqwcMjdJFNQc9C2N9BqNvHc29WiljSVGI2KyCopkFv%2FwAotHu9cOq2d1JYW0x53dhAo4O53JQt8MYf9ocMFyB23ZwGOQIkeCQGxqwfIsatNQSQrIrmOUbrIhoQfEEb5LLHzPP6X1TV4RqFo4ozFVL0%2FwApD8EmFms%2FlxeWBNxoEpuIhubSQj1B%2FqPsHwo0%2B4ltUmW7Ro5ojRo3BVhT2OWCi1t%2BbPJ1pFCfMXlJgtl%2Fx92VCyRHuwjb4kX%2Bdf2ciOlG2huhcX2n8JI2BE8FHHzMTb%2F8TVc6FpWutaySPblJEmHGeCQVVwP1ZGtcsIbe5N3p0Ui2MlWaM7mB%2FwBpQ4%2B1F%2FLkTGulhnDIYnYprf6tYaxaxxCDlxIaG7iko8Z7kGtWr%2B3ywxsdGl1WwitzGbkgkRzugDGnRm34R0%2FZbIJBZwxv9YhAVx8Qp0JPiBnafJl1eXekLNdyrKOXGNgADQD4g3Gg%2BE7Y8WyTLfiHNJbbQvNHle%2Fe50eQX%2BnXAD3Vg53EoWnKImhQmn7Pwv8AyYRX9xql1dmXWOS3XHiqMnp0QEkKq%2BA5fazrQwHqOmWmqQGC7j5D9lxsynxVsFsLeO39hb39tJbXMYlhlHGSNuhB%2FUffOZXy3%2Fl7UV05n5MgrpN1LTjLCT8VncEj%2FYf5Odt1nQbzR3JcerasfgnA2%2BT%2FAMrYB%2F5V3Y%2BdtAvhefubrn%2FuNux1jkQUYkD7Ubnir%2F6uEq8D1rTFk9XUdNgaHix%2Bu2XVoHPcD%2FfbfstnQfyAeb%2FFktC%2FptaSF1VgFNGTiXFfiA%2BLj%2FlZC9WuNd8p6kNM1e04anYsY2mY7TW%2FZG2pKjfsS4K003mkCHzl5WmDLazercWoB9WCvX1FB%2FeQt9lv8nIofYNRl5FPI3njTfO2li7taRXkQUXlp3Rj0Zf5on%2FYbJXirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FW7%2FmzZsVdmzZsVdmzZsVdgHVY9PmtHi1JlW3cgEuQBUbr1wdgPUdNttTtzb3IJWoZSOoYdxirzHztP%2Bi20aTyvdm6uDcJSCMJIPTVhRWKj7Bbbi2B9b8keZrnV3FvberbsQsVwHUKFJ6tU8hSvhk%2B%2FwAPGy1GwvLOkqK5ju0cIP3YQ%2BnItAPiif8A4nkkphKQaQOk6eml6ba6fGQVt4whPif2j%2FwWO1LTbPVrGfTr%2BITWtyhSWMjqD%2FEfs4MzEVwIsg2Ni%2BVPOHlm58p65NpU1XhP72znP%2B7IWPwn%2FXX7En%2BVgW28s63f2kWr29m76Ys6xyXQpxUggNUfa4iv2uOen9c8t6J5it0t9as0uo4zyjLVDKf8l1oy5EL7TriGW30Lytp7Q6Dbs0d7xI4Oz%2FFWPlycmNvib%2BfKziufETs7WXahOn8Ph9dVIn6a7%2FewDzPd3ukNplzYtxtEhW2adVBKzRktTkalOdf%2BBw60bydZ%2BaNR%2FwARaPq0VjOIw509bcLIkw%2B16yh%2FjRm%2F3an28de6dLYTXGk6xDztpx8aHoyn7Lqfb9nI3YX%2BreQ9ThS3pcWhcvazMBWSE%2FbgaQ%2FF8P8AJlrrDvunvmryB9buFvzAtnrkQD84z%2B6mKHkGRtu%2F82HWnO%2BoadLpU5aC4ZeUL9Gil%2B0jKR0aOYZOLO80jzho0d3Zv6kMn2WFPUhlGxVh%2By6H7WQWaO80rV1hvwBMjcfUAoskTbLIP%2BNsIr5oSu10tfOt7Ikt4th5ijQC6hkSsdz6fwfWIiCCr7UmTj%2Fl5JG%2FKTSdTjg%2FxDILh4UCUgHD7P8Axafj45GPMdkYtRkvbWf6jewEXNhcr9ppT9pEVatJWnxJx%2BznRPIfmz%2FFujfW5Y%2FSvLZ%2Fq94gBCmQCvNQfiVX%2B1xb7OA2NleaX%2Fkr%2FA19Jb2rO%2BlXbc7UvuFbuvL%2Bb%2FiWC7M7HOuarpdrq9jLY3i8o5Bse6t2df8AKXOP6jbaj5dvpLK5USBd0fcB07Ov8cMT3qkP5l6trkWp2kNi8sVr6CShoyVDyH7RJHXj8OQpfNfmCN1%2BsXcsnBeCrOfUAUdFHP4uP052ny%2Fq2g6veR6T5hgX94Almsp%2Fdsw%2F3W%2F%2BU37GSHUfyp8n6hUpavZse8DkD%2FgH5p%2BGCXNeTwM%2BbzeWxtr%2B3SVHFGMZKMP8oBqr%2FwANh9qv5gpr3kVfLV9zk1O3uIjFOwrzt4w1GZhUeqn2P8rJD5i%2FJJrK2lvNKufrSx%2FEYCnCXiOtCpKPx%2F1M503lq7tpDxDNUUUGlPwyJtWQflfpMWseaFtLgssZtZnDJ1VhxCn3651e38qanp%2Bs2ZX95brKG%2BtR7UVfio6%2Fs16YS%2Fk3pGmWxvNR%2BspJqfEW7WnR4kryLFW3PqN%2FL%2FLnW8I2UsW8x%2BVo71n1LT0CXp3mjGwlp3%2F4yD%2Fhsgl9oyXUaxX1u8LoCY2dStV%2FaG%2Fgc7JTEbiztrr0zcRrIYmDxlhWjDJCXQoeVeW9Rv8Ay1PKL25kuNO9ELEo%2BIjgaoKk%2FAqJyzqtrdQXkCXNs3qQyqGjcdCCK7ZFPMPl1Yg95aLWA7zQjfjXqw%2FycB6JrNzY3BW7uAbARKgUqSQVIC8KfCq8K8vhxq9wlntK4DvtJ07UgBfW6TU6FhvTwqN8FRyRyoHiYOjCoZTUEHH5FDC9Y%2FL6wuSZ9Ic2M3X0tzEfo6p%2FscL9B%2FLy8XVJNS8y3Yuo41aKz0%2BEkQrGwoWlO3N2zomVTDZV4l5n8s3Plq94oS%2BnTk%2FVZj27%2Bk5%2FnX%2FhsMNI893Wj2ht2thNVSEp8PGSlBK%2F%2BSf286nqOnWmqWcllexiSGQbg9QezKf2WGco13yhdaVMUT95A39zL0DDwPg%2BIZc3pPlzU5dStGa4IaeNgGZaAFWHJWoMOc5v5E1B7Wf6tcAoD%2B5PLb3jP0fYzo4xIYrZIo5UaOVQ6MKMrCoIPtidrZ29lAttaoI4UrxQdBU1OL5sCsO8%2FwD5e6V5708RXNINQgB%2Bp3oFStf2JAKc4m%2F4XOIWX5R%2FmVoOpummwIySAxNMssZhZG2q3Mqen80eeoKZqYq8l8h%2Fk%2FceW9Qt9Z1DU3W4gPJLS0JCEGvwTytT1U3%2Bx6arnWs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F1%2B%2F5s2bFXZs2bFXZs2bFXZs2bFXUzZs2KuzZs2KoXUjILG49E0k4EKetK43TYkhsoQp5EqGZvEnvgp1DKVbdW2I9jhDdaDqT%2FuLLWJbOzP8AulEVnAPVVkb4hiqB8wWUXmS%2BXTYWQi3ikZphuUlqOKmn7P8ANnOtRsiPW0TWUKqD9ofajYfZkQ%2B3%2FDLnYtH0Wy0W3aC0BJc8pJHPJ2J8ThV5u8tJrdoZrdQL6EH0z0Lj%2BQ%2F8a4bTbxXQPMGq%2Fl9r7mSs9jcUN3Cv2Zo%2B1xD4Sp%2FzZnaNYhtfNmgRaho7JcMwE1pKCASP246%2Fsn%2BZf58gsugWWtaPFp1xRL21qFkFCyP3U96YR%2BUfMt7%2BX%2BqvpmqEtpUsnGeOtQjE0FxD%2FwAzUxOy%2B5kHmGCOa1s7%2BVeEsFYpHI3SvwyBvDi647RtH1by3qEXmPT5VlgnWmo2C1Amj6rIrH4RMnVcCz3FvJ5x1pIqX2h30cVy3ouv2nQEeka9XZW5ZJNPult7dbZpTLasP9HlYUalP7uVf2JlH2v%2BEw891ZzY3tvqNtHdWz84pBUHoQe6sP2WX9rC7zJoEOu2Xp7LdRVa3lPY90b%2FACHwi0IahBqtdOo9hKf9LjY0Vf8ALU%2F78ybZFD591jS3R3gnRo5Ymp4MjA9snHkr8weRi0LzJII7pQEtdQc0SYdFWQ%2Fsy%2F5X7eH%2FAJw8uLqMDX9qg%2BtRL%2B8Uf7sQf8bLnJbuyjcNFKnND1U%2Fw8Dh5pfQo3Gc487eVFhMmq2KfuHNbmNR%2Fdsf92KP5G%2Fa%2FlyPeXPM%2Fmfy2Y4pmk1PRqfBBKpNwiDr6E3%2B7OH8j51%2B1ubXU7JLiKklvcJWjDqrDdWH%2FEsV5PntoFiuUuQOFxFvHKpKsPpWnLJZ5b8w65p1xEguXuIp3q8d07P1%2FZVm%2Bx%2Fkccbr%2Bhm2125sbPggX95AZq8FRhy3p%2FL8Srk181aDHqempqtvRLu2hDngPheMDmV%2F2P2ozjsrKLW5ju4Eni%2By4rQ9Qe4OL5D%2FACp5hgu7iOwkkUXFxD6yx9DWM8HNMmGJFFDRFRQioPUHIhrmgrAXubdK2z19WOleFepH%2BRkwymCkUIqD1BxBpWIaNq09o31WURrZoiem32ePEheCIB8VV%2BLJcGB3BBHtka1LQXVne0XnC9eUQ%2B0tevHxXA2lxazHfW620rx2atW4gkSqFOPCgdvjDClVwkA7hWYZswzZFXYnNBFPG0UyCSNvtKwqDimbFWE6voE1hIbu0Be3BrQVLIP8rxXJRo92b3T4Z2%2B1Ti3zG1cGkAih3B7ZSRpGvCNQqjsooN8NquzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxViPmbyo91cfpvQiINVT%2B%2Bh6RXSD9iXwl%2F33N%2FwWQzW9AXXo%2FXaFg7L%2B%2BhK0mjdBuafzACjrnYcDTWNrPKk8kYMsZDI42NR40w3tRW3z1p2l6ho%2BotLAfXVE5OgDVljA%2BLj%2FxZGv7OS2BbeaRbscpI5YuLQq3ETIfiQcv2ZVP90%2F8AsMk3mi1FjqBnt0CpcIHIUU%2BNT8RFP5tuWRDTFEulwPaP9YjVSfVjBIFGPM%2F7BvHCOSXqXlu6trnTI1t7Y2Zj%2BGW1YhmQ%2BJcfb5fzYcZBPKl1I7GRXHKGi3AY%2FajPRvdsnQNd8BFFDjnL%2FPWhJaXguIKRw33KngklPi%2F2Pxcs6jkY892Ul3onqwoZJLWRZeAHIlT8D7fJsAVBaLpUeueS9PtriYPcWykQXkfZ4yVDD%2FJP2WwX5X1NJ2NrQIGXkoXpzQ8JP65GPJfmOTR5G0zXLmGCzlYmzhZPSeE05ceP7UTjfliOhagkWs3CW0gkUXbPZjoZVkY8kQHr8OSHUJZD540vmYtVRBIAvoTo260JrGzU7cvhzaJ5jgm0t9O1u7giu%2FRdY%2BJ48oyCg%2Fd9QyfZ%2FwArJhPBFcwvbzqHikBV0PQg9sgt%2FwCSLpJy9pxniPRiQsgH8rfzYB5ql%2Fkq1hXU4ZigNwjsizftemU3Uf5Jzp%2BRXyloF%2Fpj3FzqYiR3YraxREsyx%2FzTOaL6j%2Fyp8CZKsSUOzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Hv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVg35iPrMEFld6XbR3CRM%2Fro1fUIIHwx%2Fs4U%2FlrqOkz3c1lYQmENFJI8DCgRzIDIg5b1JavTOiajZLf2cls1KsKofBh9k5ydpJPL%2FmzT9ZcBIWY2t5sFoD8Ls5C1%2FwCDkyQ5KyjWdLGi6ml3brSyvKxuo6I58P8AJPVclOiXZurPi5rLAfTf5fsn7sE3drBqFq9vLR4pV2I7dwy%2B%2BF2j6Xf2F5dS3EqNbyhViVa8iV%2Fbfag6%2FZXBdj3KnWURXLzYFYV5n8n3us6ut7btEITGsbc6hl418B8WFd75Ym8svHqVqPrQiCsJSPiikH2jQfsNnScayhwVYBlOxB3BGG1Sby7rf6YgZ5KCZftIBSmHeFllodlp95LeWqlDMKGIfYB7kDDPE%2BSuzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F%2F0u%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZFfM%2BipLW%2BSJZAf71CtaMPsygf8SyVZRAIIO4PbCDW6pP5YvDd6Wiu1Zbc%2Bi%2B9Tt9mv%2Bxw5xG3tbe1Vlt41jDHkwUUqfE4tgPNXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Pv%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV%2F%2FZ");background-position:center center;border:1px solid #0a0}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-eof.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-eof.css deleted file mode 100644 index a50ad77..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-eof.css +++ /dev/null @@ -1,10 +0,0 @@ -div.base64-singlequotes { - width:100px; - height:100px; - background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QAAAAAAAD5Q7t%2FAAAACXBIWXMAAA3WAAAN1gGQb3mcAAAFrUlEQVRYw%2B2Xz28kRxXHP%2B9Vdc8vj2fG9uIkm2yUeFGEhNCKQwBpj1yRUBAnpJU4ceZP4MxfkBxy2GO45bQXuEGQohUKigQ%2BsBBE1sbYXv8Yz%2FRMd9fjUN09PV5nFZA4kZZa79W3quu9er%2FqNfy%2FPwJgZty%2Ffz%2FZ29vrpmmqhlWTgmFg1UpbfWhYhG6Yq2cFi%2FNrj9nJyWnx%2BPHjeafbMTEzPvjVB9%2B6d%2B%2FezweDwV1BfHubivkC3lZya%2F4m7Np8UZYXhweHH7733rvvC0Kyv7%2F%2F7p07d34qIjyvr63RNb4l4CbsRUrNrq6OfvfRRz%2FxDx486A%2F6g7vXhX9ZIf%2Bp4JomaToZj8d7Pk1SFRFXb1aWodq09l%2F9YZu%2FCWMVL9e%2FaVFVQVUREEG8r3VUEZ4cX%2FHL30%2B5shRtAhFq4wggNb6GrXgVa2K2jYtACIHv7Sz54TfHjWWagBOBy0Xgt%2BcjLtwQxVCpNwURQat1DdYaT7pwdwKDFA6ncHgFizJmSb3WLPDa7PMIVlb2daqZxdONUnAetEojEdBGiXXhTmAjhZ0%2B3N6AlzeEROH1TXiWGf%2BcwmkWZYnAfAkdx1pq%2BhUbT9z3IElUJlVhI4WsgCLUyggi4MQYd4VXNmCYRqXOspV7UoHbQ3hpEMeLAk5mkFYRYlWI%2BHZ6CTDwkKSQqrA7gFeHMF3C6VyYLmFZGiKCE6GrMFsaWb7yuVOh66N1FkUUpBJ3TyvFovToBl9XMbNY2bZ70BsKfW94hbyErosmXpQwy4VgkCjMizjvRRik0EtiLNwagBf465lwOqtkETEn60XT1%2BlTazrpKlR%2BKkooy3Xfb3Wj3wGWJRQhnni7B53q5FqZ4%2FUR7PYhGMxyuMwgWVqTxrYWAwZYQX78J5i8ie9txSAkoOqqQAqk3pBgKLDhlY5XVKPCi3w97YRoKSFaceCgF2hqSXRBPQAIOcXRH8hP%2F0y6%2BRpWLrEyg3SbS9tmzggzJQSLQZo4xoOE8UbCsJfQ7zi6iaIizZ5OBVfXDKPireWC%2BvAYWOBqeszl9Jg03afbH6OqGH%2FBSUrqbrFIXiHoiEDC%2FPySi2d9nnZHJE7opY7dcY%2FdcZej84zpPGfY9Uw2ErYGCf2O4mUVEzELWtqUxZKjf3zK2cURzicMRy%2BzvbuH8ylFPqXIPqNczClKY1mUZFcnSDKkv%2FUNuptbWG%2BLw%2FMh%2FzrYpKBHKV3ONOXzYxeV20z49qhs7gaMWIjqQQiBxVXB4irg05yz4u%2FMpieoJuTLjDJfUJYBzBAFUUHkhMvLvzFPuvQ2JvQ3duh0R%2FjuiDQdIn6MJdvkxTafZUPuaN6UaOo6UNtgNl9weboguwqoA5fCjEusNCzE8LJQFRuNrzpQD%2BrmZNM55%2F4A5z1J2iHtDEg6fZK0j0uHlDrh2N4i3Ptuc%2BH5tjp5HliWQmmOUAhlYe0rqUqWSEOhcZ05AvE1UdColSQJaHWlSUYgJy%2FO2fFfo%2F34piphFOZ4OrvNdL5EJZbcmE8OQzFxIJEGEgIeE1%2FhrjJLxZcOrIVpVC7TW00WmLWyAMDEs%2Bi9wVJDtG17Y21vVmNxLKqIOkQqqoq2qHORmgj9UQcza7mgFm4GmiDjO5C72DSoQ6uPVTW%2BzuFUcQ2teKd4pzhd8b6Nu6jg7vZsrb1rClEIxhu7Q37x47fIy3j%2Fi8iqqlUuEWTFN%2FOrMU3fEEuhUM8FIPDqZgcRIVhsAXxtjGDGS5M%2BP%2Fv%2Bm7yopVrRVsPabsW%2BYG1T%2Fy3KahqSg6cHRb5cTmt5ZXhxQ7nS6yZsVWOajDFbw2JSCSGEIsuyC%2F%2Fo0aPp%2Fv7%2Br9NO5%2F5gMOhJLNn%2FpQLrLfw6tkKKorCDg4NPP%2Fnkjx%2FLOz96h2enzyZvf%2BftH9za2fm6qLrnO9tGk2vY86f%2FMliWZRdPnjz5zcOHDz%2B%2B%2Fifimorzv31C9X718G%2FYrCYSNJa5LgAAACJ6VFh0U29mdHdhcmUAAHjaKy8v18vMyy5OTixI1csvSgcANtgGWBBTylwAAAAASUVORK5CYII%3D'); - background-position:center center; - border:1px solid #00aa00; -} -div.otherdataurl { - background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBQ0WDWwqwjwAAANMSURBVEjHrdZbaFxVFAbgb2aSTG6GTi6mVIwxNxF9qFI0RQnFUqiYamutVutLa2t9EY0oPggFoYgPRR%2FaghYviA%2BiIAYvmBJKoYWiiBCigVTT1FisbUhrEtNkJpc5PuQkjGEmJqkLFmdz2Hv%2Fa%2F3rX3tvlm95oS%2FLokuZtIpbdvAs7KFtL22wjb3V1C41upy2ke1DXC2k%2FBjv1HHXDrbkEamg7lX2P8QTldQ2UtfOB8uiJsHNiB%2Fik0GmO%2BgZIxgnGA59nGCMoJPeQaYP047iBDXZEohkAYof4%2FNyKlZRdR%2F1ASZCnoOMhWkUheMz9F1laJSRZ3gEqVw1ipZQjcoBRrbT3Ez9OJLhZkHG5CD8l8Q47qXhMZp%2FYxhVFaxBLBtQejdtA%2FTtZPMIJnOknI2WSYzicTYN8OtTvICZbECxdr5Pkm6iPL0C3c%2BgkfIJgi%2F4LnP%2FudRKD3K4jf1VJGLEAiuz6VnA4AGam1h7gpNIzSFe66D3NurLKVhJNkHo07N9V9BE3XHOYmyeuirqG1l9mdHgOkDSGd8%2FGWtg9Roa56lrYdchDtRQPLlCkEywKVRScDfrurnwC2diiPTRe47iVtbnLZDxckGCkKYpPM%2FRr3kbyRhsYOtRDiQonFoBSHrBOI18rOeOPvr76YrCeUbf5fTvjOddJ0gQ1uMPku9z6hwjiEZhgOMn%2BaaUeHQJIOkMD7KMA5QQP01HP18hPbfvDTvZPETqb2YiS1BWrozM6jk9SPJJHkZZ5qFagtoaNnbyZg1FE4sUPRdlAQpwkdSjvDZAJ%2FoxNt%2Bw6NlGbQVFl5iKLKKsXCAwyFQZ8S3ciu65ho1lBJ5%2FkZk3OBGjpJWGmVCmsjTkQvA8JHCUU7s5eImevzg%2Fd7BGFhzCARIf8uVN3J5Heh1VM%2BHlko2y%2FHBxF0NJolfo38eDuJJxbf0ro%2FnMurh8hM%2FupH4tdT8zciOFsTC8SAgQoJfRxKzCuvfw0k%2F8MDx7xqUyez%2BS48ESIN7Ky6OUpfAtrxzhx03UR4m0c%2FZF7tnKW2mma4l9yuthTSIZIvxPi6EcpZW0PM0xtOzjo%2Bf4GPfv4r1qNqAUFYs9diJLBC1CIa7FZx8fUlwI22LuNv%2FfLbKMAOftH9TwRXg6%2FiCDAAAAAElFTkSuQmCC"); -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-eof.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-eof.css.min deleted file mode 100644 index 1f6d2e2..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-eof.css.min +++ /dev/null @@ -1 +0,0 @@ -div.base64-singlequotes{width:100px;height:100px;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QAAAAAAAD5Q7t%2FAAAACXBIWXMAAA3WAAAN1gGQb3mcAAAFrUlEQVRYw%2B2Xz28kRxXHP%2B9Vdc8vj2fG9uIkm2yUeFGEhNCKQwBpj1yRUBAnpJU4ceZP4MxfkBxy2GO45bQXuEGQohUKigQ%2BsBBE1sbYXv8Yz%2FRMd9fjUN09PV5nFZA4kZZa79W3quu9er%2FqNfy%2FPwJgZty%2Ffz%2FZ29vrpmmqhlWTgmFg1UpbfWhYhG6Yq2cFi%2FNrj9nJyWnx%2BPHjeafbMTEzPvjVB9%2B6d%2B%2FezweDwV1BfHubivkC3lZya%2F4m7Np8UZYXhweHH7733rvvC0Kyv7%2F%2F7p07d34qIjyvr63RNb4l4CbsRUrNrq6OfvfRRz%2FxDx486A%2F6g7vXhX9ZIf%2Bp4JomaToZj8d7Pk1SFRFXb1aWodq09l%2F9YZu%2FCWMVL9e%2FaVFVQVUREEG8r3VUEZ4cX%2FHL30%2B5shRtAhFq4wggNb6GrXgVa2K2jYtACIHv7Sz54TfHjWWagBOBy0Xgt%2BcjLtwQxVCpNwURQat1DdYaT7pwdwKDFA6ncHgFizJmSb3WLPDa7PMIVlb2daqZxdONUnAetEojEdBGiXXhTmAjhZ0%2B3N6AlzeEROH1TXiWGf%2BcwmkWZYnAfAkdx1pq%2BhUbT9z3IElUJlVhI4WsgCLUyggi4MQYd4VXNmCYRqXOspV7UoHbQ3hpEMeLAk5mkFYRYlWI%2BHZ6CTDwkKSQqrA7gFeHMF3C6VyYLmFZGiKCE6GrMFsaWb7yuVOh66N1FkUUpBJ3TyvFovToBl9XMbNY2bZ70BsKfW94hbyErosmXpQwy4VgkCjMizjvRRik0EtiLNwagBf465lwOqtkETEn60XT1%2BlTazrpKlR%2BKkooy3Xfb3Wj3wGWJRQhnni7B53q5FqZ4%2FUR7PYhGMxyuMwgWVqTxrYWAwZYQX78J5i8ie9txSAkoOqqQAqk3pBgKLDhlY5XVKPCi3w97YRoKSFaceCgF2hqSXRBPQAIOcXRH8hP%2F0y6%2BRpWLrEyg3SbS9tmzggzJQSLQZo4xoOE8UbCsJfQ7zi6iaIizZ5OBVfXDKPireWC%2BvAYWOBqeszl9Jg03afbH6OqGH%2FBSUrqbrFIXiHoiEDC%2FPySi2d9nnZHJE7opY7dcY%2FdcZej84zpPGfY9Uw2ErYGCf2O4mUVEzELWtqUxZKjf3zK2cURzicMRy%2BzvbuH8ylFPqXIPqNczClKY1mUZFcnSDKkv%2FUNuptbWG%2BLw%2FMh%2FzrYpKBHKV3ONOXzYxeV20z49qhs7gaMWIjqQQiBxVXB4irg05yz4u%2FMpieoJuTLjDJfUJYBzBAFUUHkhMvLvzFPuvQ2JvQ3duh0R%2FjuiDQdIn6MJdvkxTafZUPuaN6UaOo6UNtgNl9weboguwqoA5fCjEusNCzE8LJQFRuNrzpQD%2BrmZNM55%2F4A5z1J2iHtDEg6fZK0j0uHlDrh2N4i3Ptuc%2BH5tjp5HliWQmmOUAhlYe0rqUqWSEOhcZ05AvE1UdColSQJaHWlSUYgJy%2FO2fFfo%2F34piphFOZ4OrvNdL5EJZbcmE8OQzFxIJEGEgIeE1%2FhrjJLxZcOrIVpVC7TW00WmLWyAMDEs%2Bi9wVJDtG17Y21vVmNxLKqIOkQqqoq2qHORmgj9UQcza7mgFm4GmiDjO5C72DSoQ6uPVTW%2BzuFUcQ2teKd4pzhd8b6Nu6jg7vZsrb1rClEIxhu7Q37x47fIy3j%2Fi8iqqlUuEWTFN%2FOrMU3fEEuhUM8FIPDqZgcRIVhsAXxtjGDGS5M%2BP%2Fv%2Bm7yopVrRVsPabsW%2BYG1T%2Fy3KahqSg6cHRb5cTmt5ZXhxQ7nS6yZsVWOajDFbw2JSCSGEIsuyC%2F%2Fo0aPp%2Fv7%2Br9NO5%2F5gMOhJLNn%2FpQLrLfw6tkKKorCDg4NPP%2Fnkjx%2FLOz96h2enzyZvf%2BftH9za2fm6qLrnO9tGk2vY86f%2FMliWZRdPnjz5zcOHDz%2B%2B%2Fifimorzv31C9X718G%2FYrCYSNJa5LgAAACJ6VFh0U29mdHdhcmUAAHjaKy8v18vMyy5OTixI1csvSgcANtgGWBBTylwAAAAASUVORK5CYII%3D');background-position:center center;border:1px solid #0a0}div.otherdataurl{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBQ0WDWwqwjwAAANMSURBVEjHrdZbaFxVFAbgb2aSTG6GTi6mVIwxNxF9qFI0RQnFUqiYamutVutLa2t9EY0oPggFoYgPRR%2FaghYviA%2BiIAYvmBJKoYWiiBCigVTT1FisbUhrEtNkJpc5PuQkjGEmJqkLFmdz2Hv%2Fa%2F3rX3tvlm95oS%2FLokuZtIpbdvAs7KFtL22wjb3V1C41upy2ke1DXC2k%2FBjv1HHXDrbkEamg7lX2P8QTldQ2UtfOB8uiJsHNiB%2Fik0GmO%2BgZIxgnGA59nGCMoJPeQaYP047iBDXZEohkAYof4%2FNyKlZRdR%2F1ASZCnoOMhWkUheMz9F1laJSRZ3gEqVw1ipZQjcoBRrbT3Ez9OJLhZkHG5CD8l8Q47qXhMZp%2FYxhVFaxBLBtQejdtA%2FTtZPMIJnOknI2WSYzicTYN8OtTvICZbECxdr5Pkm6iPL0C3c%2BgkfIJgi%2F4LnP%2FudRKD3K4jf1VJGLEAiuz6VnA4AGam1h7gpNIzSFe66D3NurLKVhJNkHo07N9V9BE3XHOYmyeuirqG1l9mdHgOkDSGd8%2FGWtg9Roa56lrYdchDtRQPLlCkEywKVRScDfrurnwC2diiPTRe47iVtbnLZDxckGCkKYpPM%2FRr3kbyRhsYOtRDiQonFoBSHrBOI18rOeOPvr76YrCeUbf5fTvjOddJ0gQ1uMPku9z6hwjiEZhgOMn%2BaaUeHQJIOkMD7KMA5QQP01HP18hPbfvDTvZPETqb2YiS1BWrozM6jk9SPJJHkZZ5qFagtoaNnbyZg1FE4sUPRdlAQpwkdSjvDZAJ%2FoxNt%2Bw6NlGbQVFl5iKLKKsXCAwyFQZ8S3ciu65ho1lBJ5%2FkZk3OBGjpJWGmVCmsjTkQvA8JHCUU7s5eImevzg%2Fd7BGFhzCARIf8uVN3J5Heh1VM%2BHlko2y%2FHBxF0NJolfo38eDuJJxbf0ro%2FnMurh8hM%2FupH4tdT8zciOFsTC8SAgQoJfRxKzCuvfw0k%2F8MDx7xqUyez%2BS48ESIN7Ky6OUpfAtrxzhx03UR4m0c%2FZF7tnKW2mma4l9yuthTSIZIvxPi6EcpZW0PM0xtOzjo%2Bf4GPfv4r1qNqAUFYs9diJLBC1CIa7FZx8fUlwI22LuNv%2FfLbKMAOftH9TwRXg6%2FiCDAAAAAElFTkSuQmCC")} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-linebreakindata.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-linebreakindata.css deleted file mode 100644 index c3f686f..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-linebreakindata.css +++ /dev/null @@ -1,34 +0,0 @@ -.yui3-skin-night .yui3-dial-ring-vml, -.yui3-skin-night .yui3-dial-center-button-vml, -.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min, -.yui3-skin-night v\:oval.yui3-dial-marker-max-min, -.yui3-skin-night .yui3-dial-marker-vml, -.yui3-skin-night .yui3-dial-handle-vml { - background: none; - opacity:1; -} - -div.base64-doublequotes { - width:100px; - height:100px; - background-image:url( "data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBQ0WDWwq - wjwAAANMSURBVEjHrdZbaFxVFAbgb2aSTG6GTi6mVIwxNxF9qFI0RQnFUqiYamutVutLa2t9EY0oPggFoYgPRR%2FaghYviA%2BiIAYvmBJKoYWi - iBCigVTT1FisbUhrEtNkJpc5PuQkjGEmJqkLFmdz2Hv%2Fa%2F3rX3tvlm95oS%2FLokuZtIpbdvAs7KFtL22wjb3V1C41upy2ke1DXC2k%2FBjv - 1HHXDrbkEamg7lX2P8QTldQ2UtfOB8uiJsHNiB%2Fik0GmO%2BgZIxgnGA59nGCMoJPeQaYP047iBDXZEohkAYof4%2FNyKlZRdR%2F1ASZCnoOM - hWkUheMz9F1laJSRZ3gEqVw1ipZQjcoBRrbT3Ez9OJLhZkHG5CD8l8Q47qXhMZp%2FYxhVFaxBLBtQejdtA%2FTtZPMIJnOknI2WSYzicTYN8OtT - vICZbECxdr5Pkm6iPL0C3c%2BgkfIJgi%2F4LnP%2FudRKD3K4jf1VJGLEAiuz6VnA4AGam1h7gpNIzSFe66D3NurLKVhJNkHo07N9V9BE3XHOYm - yeuirqG1l9mdHgOkDSGd8%2FGWtg9Roa56lrYdchDtRQPLlCkEywKVRScDfrurnwC2diiPTRe47iVtbnLZDxckGCkKYpPM%2FRr3kbyRhsYOtRDi - QonFoBSHrBOI18rOeOPvr76YrCeUbf5fTvjOddJ0gQ1uMPku9z6hwjiEZhgOMn%2BaaUeHQJIOkMD7KMA5QQP01HP18hPbfvDTvZPETqb2YiS1BW - rozM6jk9SPJJHkZZ5qFagtoaNnbyZg1FE4sUPRdlAQpwkdSjvDZAJ%2FoxNt%2Bw6NlGbQVFl5iKLKKsXCAwyFQZ8S3ciu65ho1lBJ5%2FkZk3OB - GjpJWGmVCmsjTkQvA8JHCUU7s5eImevzg%2Fd7BGFhzCARIf8uVN3J5Heh1VM%2BHlko2y%2FHBxF0NJolfo38eDuJJxbf0ro%2FnMurh8hM%2Fu - pH4tdT8zciOFsTC8SAgQoJfRxKzCuvfw0k%2F8MDx7xqUyez%2BS48ESIN7Ky6OUpfAtrxzhx03UR4m0c%2FZF7tnKW2mma4l9yuthTSIZIvxPi6 - EcpZW0PM0xtOzjo%2Bf4GPfv4r1qNqAUFYs9diJLBC1CIa7FZx8fUlwI22LuNv%2FfLbKMAOftH9TwRXg6%2FiCDAAAAAElFTkSuQmCC" ); - background-position:center center; - border:1px solid #00aa00; -} - -.yui-skin-sam .yui-h-slider { - background: url(bg-h.gif) no-repeat 5px 0; - height: 28px; - width: 228px; -} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-linebreakindata.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-linebreakindata.css.min deleted file mode 100644 index 1ac0e17..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-linebreakindata.css.min +++ /dev/null @@ -1 +0,0 @@ -.yui3-skin-night .yui3-dial-ring-vml,.yui3-skin-night .yui3-dial-center-button-vml,.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,.yui3-skin-night v\:oval.yui3-dial-marker-max-min,.yui3-skin-night .yui3-dial-marker-vml,.yui3-skin-night .yui3-dial-handle-vml{background:0;opacity:1}div.base64-doublequotes{width:100px;height:100px;background-image:url("data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBQ0WDWwqwjwAAANMSURBVEjHrdZbaFxVFAbgb2aSTG6GTi6mVIwxNxF9qFI0RQnFUqiYamutVutLa2t9EY0oPggFoYgPRR%2FaghYviA%2BiIAYvmBJKoYWiiBCigVTT1FisbUhrEtNkJpc5PuQkjGEmJqkLFmdz2Hv%2Fa%2F3rX3tvlm95oS%2FLokuZtIpbdvAs7KFtL22wjb3V1C41upy2ke1DXC2k%2FBjv1HHXDrbkEamg7lX2P8QTldQ2UtfOB8uiJsHNiB%2Fik0GmO%2BgZIxgnGA59nGCMoJPeQaYP047iBDXZEohkAYof4%2FNyKlZRdR%2F1ASZCnoOMhWkUheMz9F1laJSRZ3gEqVw1ipZQjcoBRrbT3Ez9OJLhZkHG5CD8l8Q47qXhMZp%2FYxhVFaxBLBtQejdtA%2FTtZPMIJnOknI2WSYzicTYN8OtTvICZbECxdr5Pkm6iPL0C3c%2BgkfIJgi%2F4LnP%2FudRKD3K4jf1VJGLEAiuz6VnA4AGam1h7gpNIzSFe66D3NurLKVhJNkHo07N9V9BE3XHOYmyeuirqG1l9mdHgOkDSGd8%2FGWtg9Roa56lrYdchDtRQPLlCkEywKVRScDfrurnwC2diiPTRe47iVtbnLZDxckGCkKYpPM%2FRr3kbyRhsYOtRDiQonFoBSHrBOI18rOeOPvr76YrCeUbf5fTvjOddJ0gQ1uMPku9z6hwjiEZhgOMn%2BaaUeHQJIOkMD7KMA5QQP01HP18hPbfvDTvZPETqb2YiS1BWrozM6jk9SPJJHkZZ5qFagtoaNnbyZg1FE4sUPRdlAQpwkdSjvDZAJ%2FoxNt%2Bw6NlGbQVFl5iKLKKsXCAwyFQZ8S3ciu65ho1lBJ5%2FkZk3OBGjpJWGmVCmsjTkQvA8JHCUU7s5eImevzg%2Fd7BGFhzCARIf8uVN3J5Heh1VM%2BHlko2y%2FHBxF0NJolfo38eDuJJxbf0ro%2FnMurh8hM%2FupH4tdT8zciOFsTC8SAgQoJfRxKzCuvfw0k%2F8MDx7xqUyez%2BS48ESIN7Ky6OUpfAtrxzhx03UR4m0c%2FZF7tnKW2mma4l9yuthTSIZIvxPi6EcpZW0PM0xtOzjo%2Bf4GPfv4r1qNqAUFYs9diJLBC1CIa7FZx8fUlwI22LuNv%2FfLbKMAOftH9TwRXg6%2FiCDAAAAAElFTkSuQmCC");background-position:center center;border:1px solid #0a0}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-noquotes.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-noquotes.css deleted file mode 100644 index 71b0962..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-noquotes.css +++ /dev/null @@ -1,26 +0,0 @@ -.yui3-skin-night .yui3-dial-ring-vml, -.yui3-skin-night .yui3-dial-center-button-vml, -.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min, -.yui3-skin-night v\:oval.yui3-dial-marker-max-min, -.yui3-skin-night .yui3-dial-marker-vml, -.yui3-skin-night .yui3-dial-handle-vml { - background: none; - opacity:1; -} - -div.base64-noquotes { - width:100px; - height:100px; - background-image:url( - data:image/jpeg;base64, - %2F9j%2F4AAQSkZJRgABAgEAZABkAAD%2F4RfJRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAAD0JAAAAnEAAPQkAAACcQQWRvYmUgUGhvdG9zaG9wIENTMiBNYWNpbnRvc2gAMjAwODowNzoxOSAxNDo1ODowNQAAA6ABAAMAAAAB%2F%2F8AAKACAAQAAAABAAABwqADAAQAAAABAAABRQAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABaTAAAAAAAAAEgAAAABAAAASAAAAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMR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0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZ%2F%2B01IlBob3Rvc2hvcCAzLjAAOEJJTQQlAAAAAAAQAAAAAAAAAAAAAAAAAAAAADhCSU0D6gAAAAAYEDw%2FeG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8%2BCjwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgo8cGxpc3QgdmVyc2lvbj0iMS4wIj4KPGRpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNSG9yaXpvbnRhbFJlczwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1Ib3Jpem9udGFsUmVzPC9rZXk%2BCgkJCQk8cmVhbD43MjwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNU2NhbGluZzwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1TY2FsaW5nPC9rZXk%2BCgkJCQk8cmVhbD4xPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCTxkaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxhcnJheT4KCQkJPGRpY3Q%2BCgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCQkJCTxyZWFsPjcyPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxTY2FsaW5nPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsU2NhbGluZzwva2V5PgoJCQkJPHJlYWw%2BMTwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuc3ViVGlja2V0LnBhcGVyX2luZm9fdGlja2V0PC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BUE1UaW9nYVBhcGVyTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNVGlvZ2FQYXBlck5hbWU8L2tleT4KCQkJCQk8c3RyaW5nPm5hLWxldHRlcjwvc3RyaW5nPgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQkJCQk8YXJyYXk%2BCgkJCQkJCTxyZWFsPi0xODwvcmVhbD4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD43NzQ8L3JlYWw%2BCgkJCQkJCTxyZWFsPjU5NDwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNUGFwZXJOYW1lPC9rZXk%2BCgkJCQkJPHN0cmluZz5uYS1sZXR0ZXI8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk%2BCgkJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9hcnJheT4KCQk8L2RpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhZ2VSZWN0PC9rZXk%2BCgkJPGRpY3Q%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD4tMTg8L3JlYWw%2BCgkJCQkJCTxyZWFsPjc3NDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTk0PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5wcGQuUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLnBwZC5QTVBhcGVyTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BVVMgTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5BUElWZXJzaW9uPC9rZXk%2BCgkJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC50eXBlPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvVGlja2V0PC9zdHJpbmc%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuQVBJVmVyc2lvbjwva2V5PgoJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnR5cGU8L2tleT4KCTxzdHJpbmc%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXRUaWNrZXQ8L3N0cmluZz4KPC9kaWN0Pgo8L3BsaXN0Pgo4QklNA%2BkAAAAAAHgAAwAAAEgASAAAAAAC3gJA%2F%2B7%2F7gMGAlIDZwUoA%2FwAAgAAAEgASAAAAAAC2AIoAAEAAABkAAAAAQADAwMAAAABf%2F8AAQABAAAAAAAAAAAAAAAAaAgAGQGQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4QklNA%2B0AAAAAABAAZAAAAAEAAQBkAAAAAQABOEJJTQQmAAAAAAAOAAAAAAAAAAAAAD%2BAAAA4QklNBA0AAAAAAAQAAAAeOEJJTQQZAAAAAAAEAAAAHjhCSU0D8wAAAAAACQAAAAAAAAAAAQA4QklNBAoAAAAAAAEAADhCSU0nEAAAAAAACgABAAAAAAAAAAE4QklNA%2FUAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA%2FgAAAAAAHAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAAAD%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FA%2BgAAAAA%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwPoAAAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA1UAAAAGAAAAAAAAAAAAAAFFAAABwgAAABAAcwB3AGkAcwBzAF8AYQByAG0AeQBfAGsAbgBpAGYAZQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABwgAAAUUAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAUUAAAAAUmdodGxvbmcAAAHCAAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAFFAAAAAFJnaHRsb25nAAABwgAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAAADhCSU0EKAAAAAAADAAAAAE%2F8AAAAAAAADhCSU0EEQAAAAAAAQEAOEJJTQQUAAAAAAAEAAAAAThCSU0EDAAAAAAWrwAAAAEAAACgAAAAdAAAAeAAANmAAAAWkwAYAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1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U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZADhCSU0EIQAAAAAAVQAAAAEBAAAADwBBAGQAbwBiAGUAIABQAGgAbwB0AG8AcwBoAG8AcAAAABMAQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAIABDAFMAMgAAAAEAOEJJTQQGAAAAAAAHAAIAAAABAQD%2F4TkjaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSIzLjEuMS0xMTIiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyI%2BCiAgICAgICAgIDx4YXBNTTpEb2N1bWVudElEPnV1aWQ6RTcxOTVFNTY1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkRvY3VtZW50SUQ%2BCiAgICAgICAgIDx4YXBNTTpJbnN0YW5jZUlEPnV1aWQ6RTcxOTVFNTc1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkluc3RhbmNlSUQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eGFwOkNyZWF0ZURhdGU%2BMjAwOC0wNy0xOVQxNDo1Nzo0MS0wNTowMDwveGFwOkNyZWF0ZURhdGU%2BCiAgICAgICAgIDx4YXA6TW9kaWZ5RGF0ZT4yMDA4LTA3LTE5VDE0OjU4OjA1LTA1OjAwPC94YXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhhcDpNZXRhZGF0YURhdGU%2BMjAwOC0wNy0xOVQxNDo1ODowNS0wNTowMDwveGFwOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhhcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ1MyIE1hY2ludG9zaDwveGFwOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9qcGVnPC9kYzpmb3JtYXQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iPgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8cGhvdG9zaG9wOkhpc3RvcnkvPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8dGlmZjpOYXRpdmVEaWdlc3Q%2BMjU2LDI1NywyNTgsMjU5LDI2MiwyNzQsMjc3LDI4NCw1MzAsNTMxLDI4MiwyODMsMjk2LDMwMSwzMTgsMzE5LDUyOSw1MzIsMzA2LDI3MCwyNzEsMjcyLDMwNSwzMTUsMzM0MzI7QzA1QTE5MDRGRjAwQUJEQzA1MUJERkFGMDIwNEVBNTE8L3RpZmY6TmF0aXZlRGlnZXN0PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24%2BNDUwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjMyNTwvZXhpZjpQaXhlbFlEaW1lbnNpb24%2BCiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U%2BLTE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6TmF0aXZlRGlnZXN0PjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDtENDYzN0NCOUQ0MUExMEJBN0VGNUVCQ0RCNjMxODMyOTwvZXhpZjpOYXRpdmVEaWdlc3Q%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY%2BCjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8%2B%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQACAYGBgYGCAYGCAwIBwgMDgoICAoOEA0NDg0NEBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEJCAgJCgkLCQkLDgsNCw4RDg4ODhERDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgBRQHCAwEiAAIRAQMRAf%2FdAAQAHf%2FEAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4%2FPE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BCk5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0%2BPzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BDlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq%2Bv%2FaAAwDAQACEQMRAD8A7%2FmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmrlHI2utXn6WltnFESb0RFSp41WjD5q3LCBaslzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2E2rj0LuzvF7PxftUf8AXPLDnC3XI0ewdpOkTK4P08T%2FAMK2Ec1TLNgaxmE9pFIDy%2BEAn3GxwTgV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F%2F0e%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXYUeZpfR0a4kpUAx19h6i74b4X65CbjR76FV5FoJKKe5C1GIVLdDuGhuXs2IKOX4gfsvGdx%2FskKtkiyD6bctHHbXgPImOC4qOpXj6E1ff4Mm4Ndxkpc770BvNmzZFLs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Lv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVokKCT0G%2F3ZgaioNQemANZuhaWLyE0LlY1%2BbGn6sWspA8QA%2FZ%2FUcVRWbNmxV2bNmxV2bNmxV2NZQwKnodj9OOzYqwDT4iiPZsa%2FVLm5sj7I%2F76L%2BOTXTpjPZQSt9pkAb5r8JyKXqfUvMOpIQOFxFDfoP8qFvTl%2F4Q5INDkrFPAf8AdUhI%2FwBV%2FiH8cnLeAPcxHMprmzZsgydmzZsVdmzZsVdmzZsVdmzYyWRIo2kkYKiirMdgAMVX5sjTeaGl1CzsbSAOLuX0w7k14KCzyAD%2BUZJBirebNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F9Pv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVo4CXUFa9e0CbJRWkr%2B0RWlMHZEJ5WtPMtzE5%2BGYJKnyK0%2F4kuEC1ZeM2IW0okjFT8S7H%2BuL4FYz52mMWn2tDTlcpX6FbDHR5ecCH%2BZevywl%2FMM8dJtn7LdJ%2BKvgry9ccrOJ69KVw9E9GS5s2bAh2bNmxV2bNmxV2bNmxVi3miFU1LSbxvsStJYzH%2FJnSi%2F8ADYpoEzLcxq1T68FGr%2FvyE8GrgjzdC0mhXEsY%2Fe2pS5i%2F1omDf8RwttJRHdrcDaNbhZVI6endIG%2F4mcnHeJCDzDL82bNkEuzZs2KuzZs2KuzZs2KurkZ843Zhs4bVTQzvVqfyrvg3zHNPb2UMsLtGBPGJSpIqjEqRUb9ch%2BvSSvp0JlcvJCLyMuxJb4JNvi%2F1SuEBVvkaX9L%2BZbm8Sv1fTbf0Y6%2F78lPxH%2FgFzpeRvyPbWcXlyyubWBIXuoxJOUG7uKjk5%2FaOSSoxPNXZs2bArs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FU7%2FmzZsVQ2osyWM7o3FlQkMOxGPtZhPBHKCDyUE08e%2BM1Bedjcr4xPT%2FgThV5cvBJbpGergEfMDcYa2PkqfZs2bArs2bNirs2bNirs2bNirshfnRGtb7T9TX7LcoJD2qDzSv3vk0wl81WDajodzDGKzRj1oR35R%2FFT6RthHNXaVcrKsUtftDi304dZz7yrqPrQCIncdMnsEnqRK%2Fcjf54yVjP5gwtJ5ckcD%2B5mik%2BivH%2FAI3wD5RnEtpwrWgw983RGby1qiqKlYGkA%2F4x%2FvP%2BNchnke5BIUGoPQ%2FPEJHJ6XG3JFbxAOPxOA1iX7sUwIdmzZsVdmzZsVdmzZsVUbqBbq2mtm%2BzMjRn5MKZDLP4rC2UVq9qYj7SWshWn%2BtxOTnIVG4ttWvdNaiiK7FxGDtWG6Ti%2FwDwMuShzRLky%2B1lE9vFMP8AdiK33gYscKtBmDWhtq%2FHbOyMp68SeSH5UOGpyJ5pYde3moWPmW5KzH0pIo2WNt0A3Wv0ts2D73zJ6FgzxqqXpKpHG9eDMx7EYXed45VeC4gPCdYyqua0I5q5VgOv2cAW8sWo2QMqhwwoyHcVyQFhVOLzvrNrdf6fFHLFX4kVeBH%2Br1%2F4bJlp%2Bt2GqWrXFnICyKWeJtnUgV3XOP67qFjaFLHUrprecy%2BlZajxPDmN1jn8Dv8Aa%2By%2BIaXrclrdtZ34NrfR1USofgeo2K06c%2F8AgcBCXr%2FlvXRrdnzk4rcoSJFXYfMbnDzOV%2BTr82eqAOQIpaBq7AV2r%2BOdTriRSEp8z8RoN9I5AWJPV5HYD0yHr%2BGQg3Ntq1lcLazx3CiZviiYOKzQo9Kjb7YzoWqRevpt5AOskEij5lCOmc60%2BWCK0j9ONYo5IYp%2BEahQWBeNjRafEcMVTvTb%2B80fyHZ3FugE9vSORJBUqPVZW%2BEHw3yVaXeC%2FsobulGkX41HQMNmH%2FBZzC%2B1iTTbadZUkjtJjzkQqSKqNm5fsdMPfyr1%2FRdT8vra2E5N5C8kl3bSMTKpkctz%2BL7SP9peOA7fFkIkgkCwOfkz7NlA1y8DF2bNmxV2bEJLy1injtpJVWeavpREjk3Hc8V64virs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Xv%2BbNmxVplDqUbcMKH5HIPokjWsstqx%2BK2lZPf4Wpk5yF6nF9R8xswHGO8QSj%2FAFh8D%2Fqrkoc6VmSMHUOOjAEfTjsAaZMXhMRPxRnYf5J6YPyJV2bNmxV2bNmxVQuzOtu729PVUclBFa07U98DafqsF6i9EkI6ePywwyF6vG2i6oJRUWl6xZCP2JOrr%2FsvtLhG6s0yiK4X6Zfi4QI7Vb9lv5h%2FXDHrgV5c8B0LzLc2Q%2BGF29WDw4SfF%2Fwp%2BHOg6ZMHi4j2YfTkZ%2FMGwpFaazGDytm9GYj%2FAH25%2BEn%2FAFX%2FAOJ4N8uXwliicnps305LmFZDewrc2dxbt0lieNvkylc45%2BX10UCQzHjLATE4P%2BQeNc6L55e5i0J57WVonikRmZDSq7jf2yB2Op%2FVYor2%2FwBNjktpAGjv7ZvU%2BInoy8Vao%2Fa44xCQ9as25RVBqKnfBGRby9rBEsljcIY0aQ%2Bg5FCCQD6bj9lslGAikN5s2bArs2bGyOI0aRuiAsfoFcVS%2B%2F1q2sJltyrSytuyp%2ByDsC3zwxBqAfHfI%2Fodmt2z6pcjnJK5dAexPT%2FgRkhxV2c782mSy82WUgNIdUhNs4PTmlXQ%2FwDBDOiZAvzLb6nHpOrlFkjs7lWdG9yvxVG%2FwiuGJ3Up3YTJFr7op%2BC8t1ljHjxodv8AYtkiyHbxx6XfKx%2FcXBilJ3%2BAsVUV8FRlyYA4Z80DkkPmq3EtlHJSpR%2BJPgHBH66ZBtIufqt9Np8pALHnEpO5p1oM6Xq0P1jTriPoePIfNdxnLtZtrGZluBcG3vF%2BFJYuJfx40IIxHJKzzb5et9ZtZYp1LwygcgPtKy%2FZkT%2FKWuRKKCOC6tNH1CblcWiILDUWHH6wg6wyDejx9Fw4sfOMjEBY5biH1HgLy8VYulOfJV%2By38q4ndH9LlL219K4iilHrWzLxlhI6SgE1%2F2SnFKo0Czxy28zMqcSzspIYBPj2I%2F1cd%2FytnVZdNQ2D1I%2BESMoPw%2FzMftdMG20TSQyyblmjenzoc4TY6ld6ddyKwMUsbFZoHqNwd1KnGXRXs9n5%2Fv7lg98GlWhMjwk1A%2Fm4k%2FF7jDSwSPULTTJI3PGBphGNwG4OHVW%2BgnONX%2BsWFpDFPaSSJcTESG3TcRlf2uRK%2Fazq%2BkR3aeT7e%2BjnX6yoW8ibht%2B9i9Tg%2B%2FQ98QVZHqstutowuSPSdSpV91IPVWzif1i98t%2BZ7m40FjbSWUrNCqEmkex4EH7acT9lv2c6lonmbTvMUTWdwgiumWktrLQhge6H9of6uRLzd5ZurDVP8Q2KetYFUW7jXeSKi%2Bm0hH7UZH7X7OCY4g2YM0sMrjvexB5SHcXsnkPz3Y%2BcdPqKQ6lAB9bta%2F8lI69Y2%2F4XJeDXPJlvPe6JqMeq6NMYLuE842To6ntToyuv2k%2Faz0J5E8%2B2HnGyI2t9VgA%2Bt2ZP0epH%2FNEf%2BEyESeUuff3tmbFAx8bB9H8Uf4sZ8%2F6P82TMMLNb1iDRrQ3EpBkkPC3j7s5%2FwCNV%2B0%2BGVc4n5m8yfpnzJcsr%2F6HYsLe232PBv3j0%2Fy3%2BH%2FY5JxkLourX175%2Ftb28maSZrloqsdlQ1Tgo%2FZUDO755%2B8uxlvPcMI6i6LAe2zZ6BwlS7NmzYFdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVf%2FW7%2FmzZsVdkb83W5%2BrW1%2Bg%2BK1kAc%2F5D%2FCf%2BG45JMC6jare2FxaEf3qMo%2BdPh%2F4bCNiqV6VOOcTV%2BGReB37%2FaX9WHoyFaJMz23BqiWE7juCh%2FsyaRsHRXHRgCPpwy52gLs2bNkUuzZs2Kuwu1rS49W06Wzb4XI5Qv8Ayuu6nDHMemKvONE1KWGVrG7rHPCxRgeqsppk7sb0XC8W2lUbjxHiMhnnnTHtLmPXrZfgakd1TsR9iQ%2FP7LYtomq%2FWI0Iakybof4H55LmFZdqNlFqNjcWMwqk6FD8z9k%2FQc515XuZbW4l0%2B5%2BGWFzE6n%2BZTTOlW063EQkXY9GXwPhnO%2FNsS6T5qtbofBHqaniexmi%2B2v%2BsU4v%2FlfFgHcrPTFbanZNb3caywyApLE3Qj3zjutwW%2FljzBc6Pp6fV9JHpsLNSSgR1HIorV3Vvizq2jXQk%2BAndlBA9xnNvzRiWPzJBJWnr2gJP%2FGNyv8AHAdikJ3YGf0o5pZDIboSD1GJJ9aAgh6%2F5aUzoFnN9YtYZ6gmRFY06VI3zlXk%2FVI5bi2hnlBgdBuxFFahhfr0rSNsnHlXU4JI5NJaSt1avIQm%2B8RaquD0I%2BLjkpbgIZJmzZsirsDagC1jcqvUxOB%2FwJwTjXUMrK32WBB%2BWKpfofE6Xb8f5d%2FnhjkMPmvR%2FKlrJBqkxBSVkjC0PIDpTfI15s%2FMNbu3jbR5plsZVp69swRi9N0eSjMnH%2BRcVpm669cWWtXGnatwjgKma2uPsj0x%2FNXw%2FayOfmLr%2BhX3l%2BPTYrkXM%2BpGtm1uPUUceX7yRx8KLtx%2F1s5xoN%2FefpVr6C8muVVfUuLO8kMrEIeTem7faRk5Iy5FdTuZ9B169trGZvqkc5eFD8SmJzzUcTtsrceWHzTT3fRJv0p5UZvtOYYrgCu%2FJV4P%2FwANHnPrj83vM2lX9zpWoBJYInaJ540pOi1%2BGRQDxf4cln5Z3qT2stjWrK0iexEgE60%2F2XLOUfmHYNZeZbhWP94Ayn%2FV%2BD%2FjVclLlbEdQn955q1wTiU3huLadeQCsfSljO9VNev%2FAA0bYHub1Z7V5yWkhHxpcVHJNwGiuP8AKStVk%2FbyGafqLQxyafO5S2lPJWUAmGQ%2F7uiB8f8Ad0X%2B7F%2Fy8Ctd6jpl3Lb3v%2BkQTpxniqTDcQn7LoR%2FwUb%2FALDZCyyekWl9ZyaFLPelZGN2tqDEtZJHenEs67ckpVXwq1bU7G1iKWvqtcCR4bkkhFYx%2FCHXhvvX48C%2BU7H1SbK3k9Wya5hv4HchSBF8FxBL2WeOJ1k%2F4s9P4cu%2F0j%2Fc1FphmFxPLeOhZBxAiL8jt40%2Fa5YegV6PprvLpcE8sfpTNbh3QVoGK12zluoQ2PnZih42fmWIVt5z8Md4q9I5P5J17Z2A8YrWVl%2BERoaDwoNvupnLtb02LzREdR0hBba7bVe4tEPFZwpr6s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xKXcslu7tXb1%2BSBq%2FwCSzZK9c06xuNUutStkBls5IFkAIAMoHqUUfzNRkbCPW5Xs70rZcVtL0%2BtCoAFVc1oK%2FwArni2RIShdD0rU9Z0g2UNW1DR5JLG%2BirRlQuXhmp1ZP72M%2FwCph75g0K2sra21G8ch5baGJUpt6yARuvL6OWEQk1eJrq9s55YLxBzuGhJEjr3LKvxSqv7WISanq2oQRXGryvd2MtVhuSQ8aNQch8OyNjsqElhK1hbcr%2Fcv3K%2FyV%2FycRSQBmUiifsfQM6FpfljSbrR0mCy3EjDlDIzN9sGnphU%2FZ%2FlbIrqnl%2F6jM3Cb1VRqOoU8078XoOHPISIiQCd5ckgE3tyS4StK6xSy%2FDJ%2B7HqseO%2FYVw0W2thatp10he2b7YH21cfZljP86f8AD%2FYxO4tbO4so4I7ZUvG5Lpl3PssprUws392JD%2Fut%2FwCbAOh6sLuU6VqYMF4hKRu2x5DrFID0YY7rsh4tMn06%2FkspjzjniaS1nQfDIE%2BJWXwdafEv7Od0ugnmL8tmYipWEOB1oGWp%2FwCH5Zy4hoT9WuU5BTzj7FHp%2FeIe3%2BX%2FADrnR%2FysvRfaHeaJIwZ4RJGo8QDzQ%2F8AAy5OPVBfPNxbpMpifYqaBu4IwFYWlx9fEIJU7lmH7S%2F83ZJ9e0x7K9unRg8azMkoHWJySVR%2F9YH4W%2Bzj%2FKtvFdaxBDLQKzAVO243G%2F8ArYPJUXb2NvDZtdyWxe3B4meCQ%2BtG37Jkjb9lafaXHRXl9q2r6etnWJ7Yxx28h%2B1UNyMjt%2FlH4myX6lp1poPm57CIFLG8jikCsKisqqXWncc2%2BzhLZW0Om35hCuLiCeSgIHFY67KT9rl4YaV63IwMVSakg1pt27eGRuzvrTWILdYbnlcIWXSdQc8W5pXlp91%2FLIP91M%2F94mG9tcfW3AQ14xgsPH4c4Zp%2Btz6HqN2rJ61nNIy3loTTkA54yIf91zR%2FailyRNUinpV0iXqyyxw%2BjdW5Md%2FaN1iPdqf74f8A5Jtka1ZZ4LWYxsySKpaCRT8QI%2BIxkj2Hw5KLe6%2FTsUF%2Fp1wsmrRRk2l0QAL6Fft290g%2Fu7uP7Lo395hFquqaL9XZmmWCRwySWTgs8MgG6Oo%2FY5fZbAUhC%2BZ9JsfMl1SKYW%2BqyQRT2DMf3UvJeTwt4M5%2BJchKyrOr6D5gQwTQEpFK%2FwDeQv8Ayn%2BZDk%2B1Gyj1ew0SaC4gS5ntmCtX0ELQtQAM%2FEcv5Fwv1bQxr%2Bnhr4oms2ymP6xuCStSIbof6v8AdzYOaGAQ%2BXdTm1NdLjj5SN8QkG6FOvqBu%2BTjTrS2sbZLCMcVUmkpFGLn7Rf%2FAFv%2BFxTTme102DTuILIwZpKksW%2BzxWtW41%2FZyU2XlW41HhcahytOQJZVHKaXw%2Fd%2F7rY%2FzviAqQ21ldXtytrDG0k524qKmnj8sO736roNmNIltfVv7hFeaMnkUqTwpxNA2S2MaT5etS9w6WdtEvx1b42A7Symh%2F2C5zTzb%2BZun3swOjacGVKwrqMgoajeiJSr%2FOTDVdVZPYa3pOj%2BW7u31uKKzuZGP1dePP1Iz1UovxtJ%2FlYU%2Fl%2F5hOtyS%2BWrlis1Gm0pyfiR4%2Fi9Kv7SumcrvNYnu5DcXH7yToamrfSf6YL8ratLZ%2BZtJvoT6bwXMbEjuCwVh8uJauPFuFe%2Bx%2BYJ4NMawQiOFzyZOlDX4h%2FwQyQeVtAn1BY9R1QN9WU1toG%2Fa3qGYeGE3lnRLPVfM19LdAyWkTtcW8a7xOGaq1kGz7k%2FAM6moAACigA2AxJ7lojn72wANgKAbDLzZsirs2bNirs2bNirs2bNirs2bNir%2F9Hv%2BbNmxV2bNmxV2Qzz3p3P6rqKbFKwyt%2Fkn4lJPseWTPOVfnX5gmstNtdBtnMbajykuXHX0YyPh%2F2b%2FwDEcbrfm24MRzZI447GR59w6pMfNyWl7EdD1KM3Cp6dwoKldj%2B1zHE%2FRko0rz1rUtz9SvLe2lm2Hp8jC7BhWqV5xvUb%2FDnn01jPEin8pHgckemXmsTaHcxANw05o57O7IIKxliJYll%2FaRT%2B84%2FsNkIZhIkSjRDl6zs%2FwIjJCXFHkb5gp3%2Ba2r%2BbdPuEvYLVbLRpiFL27c2EvWkj0%2Fd8v2VpkGsfN2p3Kra3V2XicgEsQeQJ3qSNs7d%2BkdO1rSbKw1LhN%2BlbRXVJKFZyq8ZV3%2F3YGHLOEecvKFx5TvTLDym0idv3EvdG%2FwB9yf5a%2Fst%2B3lpHUOvsua4iNwbWCruHK%2FB0qN9j0zoy%2BarW48r2Oq3l1Le2sSizuGkqk6zgUVXMda8F%2FwCDTOO2M01rIs0XCRQ4kHqCqGnZl74NgkTlMqSOIZpPVNrXjGG8Qvfj2wXzSyqz1eO%2FtNSjQM8sVubhFbbkIpPiI%2BUR5Yca3q17IdPmtZ2js7yztriONNhyAKSciPtMJUfIZaXDWL%2Bra0jcq0ZYAV4yAq6mv8ynJf5Yex1PRjpUsfO%2F0pnuLJWNPUgkNZ4l%2Fm9Nh6vH%2BVpMRa2uvBcXej2Gp2rSC5tJJbOZkqW4v%2B%2FgY%2Bx%2FeJhtBB5sOi313boLa9ihMlo3EB5ClGkULy%2B16XJk4rhlZarBFAbZljtrS5Tg%2FoIF4fyOT1JjbC1L%2BbSbowyMwu4WrzJryX9h1PQpxw%2FFWFXNut9PB6srS6frlqI4JZHJ%2Br30bCsbOf5phx3%2FAN1T%2FwCRgPQbtreVrEFrW8gfnDU0dJUPF09unHD%2FAFeygjjvbi2haTQbpxcXlpHvLp9x9n6xClfjtjXi1P2P3b%2FGseE99ol9qtyjIKamYlktb6Mn0L5QKJ8Zp6d3x%2BH4vt8OD%2FvciTXPZaZ%2Bkdp5%2Bgt19Yad5p0%2Fe0vU2Y8T0NPiaM%2FtJ%2FuvOj6lcGysFaRlYxJWUjfkUXk3z5MM5p%2BV2l3U2pPdalFHK1sOLyqQxSZaFOdDWOT7W%2F7eTTzK8UdlcxREhXBTf%2BdzWg%2B7JxNji70HnTz%2B51GXyrrFxaapD69nfcRqSftqxHL1oj%2FOjPjtQ0GNYCfrCXWi3QMtlelhyjkYbFfdvsyx4M87Wy6zqemTq4X9KwQnmegkK%2Bmf%2BSi5G9M1PVfLUt3od3CJIGDEQS7iKUD4Zov8%2FjyErqrruPNkK58%2FJN7Sx0%2B0sDe3k0k9xA6JBJACGqwPHiKp8S8fts2F0mrDS3nubPThH6ZLa5YcQsnBvs3kSsCnJeXJuK%2FB%2FwAYmwQ%2FrXdjEsQRizhvjKCrUp8If4uW%2FwCyuK3Fs893p1nezfVdeDCOxmHFi8ZH%2B89wSeBjP2YuX%2BVFiYggA70Pmt9QzfyjdxXeiPeaY3rNYt9ZjdKUkgP2gyj7L8ftL%2FPgTz2tuLdJIT6cN1JFcxzJ2U7Sb%2Fs%2Fa5BsKfLEMvlPXby2sJI40uF%2F0izVuUcb05n0z3gkTlw%2F3237vHeddXN5pEMdnbmOys4BFcy0qDcF6GJa%2FwDFacmyX8Pu2R1QOi6Yupabd2F78dj6xjLVFUlpySaHwkUf7F0%2BDIrrvl6dr42N0eOtRIHs7ldkv4B9ijf8tKgfB%2FP%2FAHX28mPluyb0Vs7OdTL6SSReoK8%2FTZqN%2FrqOPL%2FJwTqdhFr9m1lqUhjnhcm2uv8AdltN%2FMKf7pb9tP8AZrjVhWHaHrEWqxjTb9gt9GKQytsXptxNf2sl35d3J0jznJbCojuQlR26cT%2Btc55qthdyXcyyJ9X8wWfx3ESbC6UbrcwfzS8fjfj%2FAHyfvPt88N%2FKuq3F3q1hqBIEyc4pWZuCkoAwck9MA50VPJV%2FMq2k0TznfCJQUmPJom%2BzJG%2FxcW9t%2FwDY4Q6cILa6ZY2eKRwslv6goaDfjy%2FaK4f%2FAJleadM80a8t1pcZ9GCJYmuG2MrD7TAfsqv2V%2Fmwr0WyuNXUw%2FVxci1%2BKLt%2Fw23wrg6qGVanr1vrK2t3csIry1aESBjxJEYYOQff4cjvm3zLbpZXLWTGC5vr%2FwCswRjfjBGoC8yfi%2BIjCPX2vNMu%2FqZDRNGKSAgUqxqgqKruF%2BH4sjsyPPIZZSXJ7knfG1e9%2Flxrdt5ksbqdSFu7eMLcW5O4%2BE0cV6xvnF75uVzcb14yyBW7%2FaO2KeS9RutC8yWd7DMYLfn6d3L%2Bx6D7SLJ7YhdkNd3UkRDRSXErxMDUFGclT9IwndCtpWrz6ZN8MskcDsGdojxkjcfZmip%2B2v8AL%2B3iWoySfXbiHUmFy14frKXqH4nL14zK%2FVuX7cbYEeJWDPQVpU0Pj0x6yqLL0pJUW4tXE1o5O9SaSRbeP28Cob1Z1T6vPKzxjeNSSQK9aV%2BznXLfUrdtDt9T1U%2BjeRxpa3iMvF5V41jcg%2Ftrx%2BLOd6VbaTqJlS7lMl5Iri3hHwRiQj920snhzODppWsii6zcGeSZg3po3NSy%2FD%2Fen4K9V542r0LyheaXcm5uaCCWNhxkl%2FvClOqcvs4rrn5g2enI9tpKi4uqlWck0rSvxP8Atf7HITazpc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2FLhpr3nLTKJ9UT19TB4zNHtCe3Jj3b2XIssp1Y8bUfFOQsix7SCSlAXpTmj4av5OnsdM%2BuzB3Zm9OWaNGD2%2FMgRTolP3sXP4Zv92fyYi6oITDVrG28x6NBeBvqWoWS1ivSeIikU8jFI%2BzLA6%2FGn%2B%2B3yFaq1pcXix28ZUGi3U2wadx%2FuziAEWv8Aq%2FH9vDLV7TzXeWrqbaWO4VhHeNHtFdCP7EhX5D4v9%2BfbwpC3liGgvIoVdSqt6pLPGr0pTj%2Bz8Xw4CUkEGil7RwRu9ZzwjPx8UZiKePShyb%2BRfMdhHM2kLEV%2BsDlDLQFncUCxcRX7WEF1DCs63zCs6r6c1Nkencr7rgXSpFsb5zCForepC9PiUEfZr4DADRVD%2BddUkPmPU4lUgVNtNG4qDw2Bof2kP2GyK1LECpY%2BAqTnUFhsta1Ce%2B1G3inuZCrySsgqwqFNRkwu9R8m%2BWIwscEHrharDBGjSH5tT4f9kcIoop4da6Vqt2GW0tbiQHbikbkH57UwHNFLbSvb3CNFLExSSJxxKsuzKwPQjOu3%2Fmq%2B1mFo1C2NmFMjhTQLGu%2FKRtumQfU%2FMWh3uoTXx0r1pJePKSWSnJlVU5lQNufHnhQxmOYxklSPiFCDvUZQKUIpUn7Jr0%2B7D8eYrBP7nRbUf61W%2FhmPmtkBFvptnEezCMkj78CpRZOY5w%2FBmWhBCjseuSyyn0pIpIr2CSr2gtbYTQt6aylufPp8PBWbCZPNurROskYgVkYOv7tSAVNRtg2780%2BYPNd5CdWuRJHEWkWONFjRaih%2BFAPljsqLeRrVh%2BjQt3GBRoXBBKAfFwag%2BLJ15B17yfealE2taTHcXMG63Eq%2FvbYL%2FvyH%2B6eFK%2F3iJyT9vAXkPygPNEuoxx3KQ3VrAHtYWP8AeOxpv%2FxWqijMv2WZMLdS8vBLx4pg9jqVqTFJIvwup6fvP5lP%2FDLillv5i%2BStPtL867pEEcem6hxkivLWjIk%2FevHb05ftZF9Okd5Et5mayvoWEtrdRmnCUfYmhYfzftp%2B3k3%2FAC68zLfx%2FwCFdWt1eElrbUoW%2BwGIrDPGv7CyU%2BLj%2B18eIeavKM3lq7WqfWNOkYizuXFeNesE9P8AiX7WNbqCncfm2f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V1PpOsrBduRLFcPb3JY9VditW%2F2XxZ0%2B91O2spIoJWL3E54wW0Y5SOf9UdF%2Fmdvhzm%2Fm2w%2BoeapJlBVdRjWdCDsZE2cfeuHdvfQW0BngZptVvEH1u%2FlG6gj%2B5hH7Kr0xHc0pD%2BYg8wa1NDFZWjSWtsrCRoiGJcn46b1YdF2yFWemzxsW1CN4Ej%2FZlUofubOs2WpxpNGl2oMP2eSbEe5yTXGkadqFpJaT26T2860YEVBB6EHx8MeCzdpunlEtpHYQ38GqRrFNaPA8EgJcFa%2FGqhadao2XBGlmbe2uCzevbGeRo2PcNJx%2F2S%2FDht51s3sLpYLoH6ncIq21wRU1UceLt9Hxf8Hhj5f8pXerWc%2Bq2VrHqE1oqQWdvNLwUoijmJB%2FO9W4%2Fs8cjVH3LezEvM2mXWqyabNozB7SS1WJ5SwBrHWnLv8A3ZUbfy4onlazmtrKC%2BJlNoHFFNFbmQaHvtTJ9rPlzU7GOO6vrRbeNioQQMrRxmn938IXj4YE0fQLnXBdQ2062l1CP3SSry9Xav7og0%2F4LDsikps7C3s1WK2iWJB%2Bygpg5lNOX0YAVr7TL0xXsxcxsVlhktwpFPtLVWwbf%2Ban0e8tp7LTYrmyILlpyT6hoRw2%2Fu%2FTbdlw3taoK4v7a1dY2dW5GjQ1qVHj%2FwA24Vah5a03VlNxZEQTtvyX7LH%2FAClyfjyfo3nrTrbV9PRNI1i6gM8qRENC8gb05OUI%2BNR6nR1%2F4HIRqOj655Vu%2FQ1SBogT%2B7mU1ikA7pJ0%2FwBi3xZGwdizhOeOXFCRBSPSZNX8maml1MhNsfgldPijdD1H%2BS37S8s6ZLrEEZt2uEe1W6VWtLsg%2BlKGHIGOReS%2F6wOR9dWtRp11dSQ%2FWHt4Wk%2Br93IGyU%2Fysk%2Fk%2FW5INATT9Z0eAWczGT6gr%2BoIlfcgBxsf2vT%2FAGMYxMSeE2D07m7PqBmjEzjWSO3EOUo%2BY72M%2BYfLcd3FJeQRxyo7EzQU792GQ60bU9Hkf9HTAwts1jdVeNl%2FyX%2B2n%2FEc7ZL5XstVSS58p6kYZqVbTrysif6tWPrRr%2FspVzmuvaDq2jzsup2JtA5NCfjtmNf91Tjb%2FYyccJ8tmgJPqV4JJLJpI3sYLq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FFMx2imJJSvhHLXj%2Fr4N%2FO9G%2FwAJ28o%2FYvY69%2BqOMgdlYzqPmWy8xr615aouoxAA3dk4dJB0%2FfRGjofBl54U%2BnCySRNSa1l%2B2vQq3861%2By65GPKcztqxjY7NEw4jYbU32zoNppF1qfrw2JX6yierHExoJivWIf5fH7DYYnZaY3pN9N5N1n9JJEbuIwyRoisY1kDbpVu3F%2FidM7xpl3Y%2BadFt7m5tle3vIUkaCYBx8Qowof5WB%2BPONG0jvLY28qlRUgqwoyOOu37LpiXl3XbjyZqk7XglmtZIfTEKNQGh5REFvsxr8XLjgIrdWQedvy7GiQPrfl4SNaxVe5s1q7Rp3ki%2FaaNf20%2B1kT07WGCqwcMjdJFNQc9C2N9BqNvHc29WiljSVGI2KyCopkFv%2FwAotHu9cOq2d1JYW0x53dhAo4O53JQt8MYf9ocMFyB23ZwGOQIkeCQGxqwfIsatNQSQrIrmOUbrIhoQfEEb5LLHzPP6X1TV4RqFo4ozFVL0%2FwApD8EmFms%2FlxeWBNxoEpuIhubSQj1B%2FqPsHwo0%2B4ltUmW7Ro5ojRo3BVhT2OWCi1t%2BbPJ1pFCfMXlJgtl%2Fx92VCyRHuwjb4kX%2Bdf2ciOlG2huhcX2n8JI2BE8FHHzMTb%2F8TVc6FpWutaySPblJEmHGeCQVVwP1ZGtcsIbe5N3p0Ui2MlWaM7mB%2FwBpQ4%2B1F%2FLkTGulhnDIYnYprf6tYaxaxxCDlxIaG7iko8Z7kGtWr%2B3ywxsdGl1WwitzGbkgkRzugDGnRm34R0%2FZbIJBZwxv9YhAVx8Qp0JPiBnafJl1eXekLNdyrKOXGNgADQD4g3Gg%2BE7Y8WyTLfiHNJbbQvNHle%2Fe50eQX%2BnXAD3Vg53EoWnKImhQmn7Pwv8AyYRX9xql1dmXWOS3XHiqMnp0QEkKq%2BA5fazrQwHqOmWmqQGC7j5D9lxsynxVsFsLeO39hb39tJbXMYlhlHGSNuhB%2FUffOZXy3%2Fl7UV05n5MgrpN1LTjLCT8VncEj%2FYf5Odt1nQbzR3JcerasfgnA2%2BT%2FAMrYB%2F5V3Y%2BdtAvhefubrn%2FuNux1jkQUYkD7Ubnir%2F6uEq8D1rTFk9XUdNgaHix%2Bu2XVoHPcD%2FfbfstnQfyAeb%2FFktC%2FptaSF1VgFNGTiXFfiA%2BLj%2FlZC9WuNd8p6kNM1e04anYsY2mY7TW%2FZG2pKjfsS4K003mkCHzl5WmDLazercWoB9WCvX1FB%2FeQt9lv8nIofYNRl5FPI3njTfO2li7taRXkQUXlp3Rj0Zf5on%2FYbJXirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FW7%2FmzZsVdmzZsVdmzZsVdgHVY9PmtHi1JlW3cgEuQBUbr1wdgPUdNttTtzb3IJWoZSOoYdxirzHztP%2Bi20aTyvdm6uDcJSCMJIPTVhRWKj7Bbbi2B9b8keZrnV3FvberbsQsVwHUKFJ6tU8hSvhk%2B%2FwAPGy1GwvLOkqK5ju0cIP3YQ%2BnItAPiif8A4nkkphKQaQOk6eml6ba6fGQVt4whPif2j%2FwWO1LTbPVrGfTr%2BITWtyhSWMjqD%2FEfs4MzEVwIsg2Ni%2BVPOHlm58p65NpU1XhP72znP%2B7IWPwn%2FXX7En%2BVgW28s63f2kWr29m76Ys6xyXQpxUggNUfa4iv2uOen9c8t6J5it0t9as0uo4zyjLVDKf8l1oy5EL7TriGW30Lytp7Q6Dbs0d7xI4Oz%2FFWPlycmNvib%2BfKziufETs7WXahOn8Ph9dVIn6a7%2FewDzPd3ukNplzYtxtEhW2adVBKzRktTkalOdf%2BBw60bydZ%2BaNR%2FwARaPq0VjOIw509bcLIkw%2B16yh%2FjRm%2F3an28de6dLYTXGk6xDztpx8aHoyn7Lqfb9nI3YX%2BreQ9ThS3pcWhcvazMBWSE%2FbgaQ%2FF8P8AJlrrDvunvmryB9buFvzAtnrkQD84z%2B6mKHkGRtu%2F82HWnO%2BoadLpU5aC4ZeUL9Gil%2B0jKR0aOYZOLO80jzho0d3Zv6kMn2WFPUhlGxVh%2By6H7WQWaO80rV1hvwBMjcfUAoskTbLIP%2BNsIr5oSu10tfOt7Ikt4th5ijQC6hkSsdz6fwfWIiCCr7UmTj%2Fl5JG%2FKTSdTjg%2FxDILh4UCUgHD7P8Axafj45GPMdkYtRkvbWf6jewEXNhcr9ppT9pEVatJWnxJx%2BznRPIfmz%2FFujfW5Y%2FSvLZ%2Fq94gBCmQCvNQfiVX%2B1xb7OA2NleaX%2Fkr%2FA19Jb2rO%2BlXbc7UvuFbuvL%2Bb%2FiWC7M7HOuarpdrq9jLY3i8o5Bse6t2df8AKXOP6jbaj5dvpLK5USBd0fcB07Ov8cMT3qkP5l6trkWp2kNi8sVr6CShoyVDyH7RJHXj8OQpfNfmCN1%2BsXcsnBeCrOfUAUdFHP4uP052ny%2Fq2g6veR6T5hgX94Almsp%2Fdsw%2F3W%2F%2BU37GSHUfyp8n6hUpavZse8DkD%2FgH5p%2BGCXNeTwM%2BbzeWxtr%2B3SVHFGMZKMP8oBqr%2FwANh9qv5gpr3kVfLV9zk1O3uIjFOwrzt4w1GZhUeqn2P8rJD5i%2FJJrK2lvNKufrSx%2FEYCnCXiOtCpKPx%2F1M503lq7tpDxDNUUUGlPwyJtWQflfpMWseaFtLgssZtZnDJ1VhxCn3651e38qanp%2Bs2ZX95brKG%2BtR7UVfio6%2Fs16YS%2Fk3pGmWxvNR%2BspJqfEW7WnR4kryLFW3PqN%2FL%2FLnW8I2UsW8x%2BVo71n1LT0CXp3mjGwlp3%2F4yD%2Fhsgl9oyXUaxX1u8LoCY2dStV%2FaG%2Fgc7JTEbiztrr0zcRrIYmDxlhWjDJCXQoeVeW9Rv8Ay1PKL25kuNO9ELEo%2BIjgaoKk%2FAqJyzqtrdQXkCXNs3qQyqGjcdCCK7ZFPMPl1Yg95aLWA7zQjfjXqw%2FycB6JrNzY3BW7uAbARKgUqSQVIC8KfCq8K8vhxq9wlntK4DvtJ07UgBfW6TU6FhvTwqN8FRyRyoHiYOjCoZTUEHH5FDC9Y%2FL6wuSZ9Ic2M3X0tzEfo6p%2FscL9B%2FLy8XVJNS8y3Yuo41aKz0%2BEkQrGwoWlO3N2zomVTDZV4l5n8s3Plq94oS%2BnTk%2FVZj27%2Bk5%2FnX%2FhsMNI893Wj2ht2thNVSEp8PGSlBK%2F%2BSf286nqOnWmqWcllexiSGQbg9QezKf2WGco13yhdaVMUT95A39zL0DDwPg%2BIZc3pPlzU5dStGa4IaeNgGZaAFWHJWoMOc5v5E1B7Wf6tcAoD%2B5PLb3jP0fYzo4xIYrZIo5UaOVQ6MKMrCoIPtidrZ29lAttaoI4UrxQdBU1OL5sCsO8%2FwD5e6V5708RXNINQgB%2Bp3oFStf2JAKc4m%2F4XOIWX5R%2FmVoOpummwIySAxNMssZhZG2q3Mqen80eeoKZqYq8l8h%2Fk%2FceW9Qt9Z1DU3W4gPJLS0JCEGvwTytT1U3%2Bx6arnWs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F1%2B%2F5s2bFXZs2bFXZs2bFXZs2bFXUzZs2KuzZs2KoXUjILG49E0k4EKetK43TYkhsoQp5EqGZvEnvgp1DKVbdW2I9jhDdaDqT%2FuLLWJbOzP8AulEVnAPVVkb4hiqB8wWUXmS%2BXTYWQi3ikZphuUlqOKmn7P8ANnOtRsiPW0TWUKqD9ofajYfZkQ%2B3%2FDLnYtH0Wy0W3aC0BJc8pJHPJ2J8ThV5u8tJrdoZrdQL6EH0z0Lj%2BQ%2F8a4bTbxXQPMGq%2Fl9r7mSs9jcUN3Cv2Zo%2B1xD4Sp%2FzZnaNYhtfNmgRaho7JcMwE1pKCASP246%2Fsn%2BZf58gsugWWtaPFp1xRL21qFkFCyP3U96YR%2BUfMt7%2BX%2BqvpmqEtpUsnGeOtQjE0FxD%2FwAzUxOy%2B5kHmGCOa1s7%2BVeEsFYpHI3SvwyBvDi647RtH1by3qEXmPT5VlgnWmo2C1Amj6rIrH4RMnVcCz3FvJ5x1pIqX2h30cVy3ouv2nQEeka9XZW5ZJNPult7dbZpTLasP9HlYUalP7uVf2JlH2v%2BEw891ZzY3tvqNtHdWz84pBUHoQe6sP2WX9rC7zJoEOu2Xp7LdRVa3lPY90b%2FACHwi0IahBqtdOo9hKf9LjY0Vf8ALU%2F78ybZFD591jS3R3gnRo5Ymp4MjA9snHkr8weRi0LzJII7pQEtdQc0SYdFWQ%2Fsy%2F5X7eH%2FAJw8uLqMDX9qg%2BtRL%2B8Uf7sQf8bLnJbuyjcNFKnND1U%2Fw8Dh5pfQo3Gc487eVFhMmq2KfuHNbmNR%2Fdsf92KP5G%2Fa%2FlyPeXPM%2Fmfy2Y4pmk1PRqfBBKpNwiDr6E3%2B7OH8j51%2B1ubXU7JLiKklvcJWjDqrDdWH%2FEsV5PntoFiuUuQOFxFvHKpKsPpWnLJZ5b8w65p1xEguXuIp3q8d07P1%2FZVm%2Bx%2Fkccbr%2Bhm2125sbPggX95AZq8FRhy3p%2FL8Srk181aDHqempqtvRLu2hDngPheMDmV%2F2P2ozjsrKLW5ju4Eni%2By4rQ9Qe4OL5D%2FACp5hgu7iOwkkUXFxD6yx9DWM8HNMmGJFFDRFRQioPUHIhrmgrAXubdK2z19WOleFepH%2BRkwymCkUIqD1BxBpWIaNq09o31WURrZoiem32ePEheCIB8VV%2BLJcGB3BBHtka1LQXVne0XnC9eUQ%2B0tevHxXA2lxazHfW620rx2atW4gkSqFOPCgdvjDClVwkA7hWYZswzZFXYnNBFPG0UyCSNvtKwqDimbFWE6voE1hIbu0Be3BrQVLIP8rxXJRo92b3T4Z2%2B1Ti3zG1cGkAih3B7ZSRpGvCNQqjsooN8NquzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxViPmbyo91cfpvQiINVT%2B%2Bh6RXSD9iXwl%2F33N%2FwWQzW9AXXo%2FXaFg7L%2B%2BhK0mjdBuafzACjrnYcDTWNrPKk8kYMsZDI42NR40w3tRW3z1p2l6ho%2BotLAfXVE5OgDVljA%2BLj%2FxZGv7OS2BbeaRbscpI5YuLQq3ETIfiQcv2ZVP90%2F8AsMk3mi1FjqBnt0CpcIHIUU%2BNT8RFP5tuWRDTFEulwPaP9YjVSfVjBIFGPM%2F7BvHCOSXqXlu6trnTI1t7Y2Zj%2BGW1YhmQ%2BJcfb5fzYcZBPKl1I7GRXHKGi3AY%2FajPRvdsnQNd8BFFDjnL%2FPWhJaXguIKRw33KngklPi%2F2Pxcs6jkY892Ul3onqwoZJLWRZeAHIlT8D7fJsAVBaLpUeueS9PtriYPcWykQXkfZ4yVDD%2FJP2WwX5X1NJ2NrQIGXkoXpzQ8JP65GPJfmOTR5G0zXLmGCzlYmzhZPSeE05ceP7UTjfliOhagkWs3CW0gkUXbPZjoZVkY8kQHr8OSHUJZD540vmYtVRBIAvoTo260JrGzU7cvhzaJ5jgm0t9O1u7giu%2FRdY%2BJ48oyCg%2Fd9QyfZ%2FwArJhPBFcwvbzqHikBV0PQg9sgt%2FwCSLpJy9pxniPRiQsgH8rfzYB5ql%2Fkq1hXU4ZigNwjsizftemU3Uf5Jzp%2BRXyloF%2Fpj3FzqYiR3YraxREsyx%2FzTOaL6j%2Fyp8CZKsSUOzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Hv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVg35iPrMEFld6XbR3CRM%2Fro1fUIIHwx%2Fs4U%2FlrqOkz3c1lYQmENFJI8DCgRzIDIg5b1JavTOiajZLf2cls1KsKofBh9k5ydpJPL%2FmzT9ZcBIWY2t5sFoD8Ls5C1%2FwCDkyQ5KyjWdLGi6ml3brSyvKxuo6I58P8AJPVclOiXZurPi5rLAfTf5fsn7sE3drBqFq9vLR4pV2I7dwy%2B%2BF2j6Xf2F5dS3EqNbyhViVa8iV%2Fbfag6%2FZXBdj3KnWURXLzYFYV5n8n3us6ut7btEITGsbc6hl418B8WFd75Ym8svHqVqPrQiCsJSPiikH2jQfsNnScayhwVYBlOxB3BGG1Sby7rf6YgZ5KCZftIBSmHeFllodlp95LeWqlDMKGIfYB7kDDPE%2BSuzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F%2F0u%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZFfM%2BipLW%2BSJZAf71CtaMPsygf8SyVZRAIIO4PbCDW6pP5YvDd6Wiu1Zbc%2Bi%2B9Tt9mv%2Bxw5xG3tbe1Vlt41jDHkwUUqfE4tgPNXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Pv%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV%2F%2FZ - ); - background-position:center center; - border:1px solid #00aa00; -} - -.yui-skin-sam .yui-h-slider { - background: url(bg-h.gif) no-repeat 5px 0; - height: 28px; - width: 228px; -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-noquotes.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-noquotes.css.min deleted file mode 100644 index f57be99..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-noquotes.css.min +++ /dev/null @@ -1 +0,0 @@ -.yui3-skin-night .yui3-dial-ring-vml,.yui3-skin-night .yui3-dial-center-button-vml,.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,.yui3-skin-night v\:oval.yui3-dial-marker-max-min,.yui3-skin-night .yui3-dial-marker-vml,.yui3-skin-night .yui3-dial-handle-vml{background:0;opacity:1}div.base64-noquotes{width:100px;height:100px;background-image:url(data:image/jpeg;base64,%2F9j%2F4AAQSkZJRgABAgEAZABkAAD%2F4RfJRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAAD0JAAAAnEAAPQkAAACcQQWRvYmUgUGhvdG9zaG9wIENTMiBNYWNpbnRvc2gAMjAwODowNzoxOSAxNDo1ODowNQAAA6ABAAMAAAAB%2F%2F8AAKACAAQAAAABAAABwqADAAQAAAABAAABRQAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABaTAAAAAAAAAEgAAAABAAAASAAAAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMR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0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZ%2F%2B01IlBob3Rvc2hvcCAzLjAAOEJJTQQlAAAAAAAQAAAAAAAAAAAAAAAAAAAAADhCSU0D6gAAAAAYEDw%2FeG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8%2BCjwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgo8cGxpc3QgdmVyc2lvbj0iMS4wIj4KPGRpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNSG9yaXpvbnRhbFJlczwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1Ib3Jpem9udGFsUmVzPC9rZXk%2BCgkJCQk8cmVhbD43MjwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNU2NhbGluZzwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1TY2FsaW5nPC9rZXk%2BCgkJCQk8cmVhbD4xPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCTxkaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxhcnJheT4KCQkJPGRpY3Q%2BCgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCQkJCTxyZWFsPjcyPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxTY2FsaW5nPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsU2NhbGluZzwva2V5PgoJCQkJPHJlYWw%2BMTwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuc3ViVGlja2V0LnBhcGVyX2luZm9fdGlja2V0PC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BUE1UaW9nYVBhcGVyTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNVGlvZ2FQYXBlck5hbWU8L2tleT4KCQkJCQk8c3RyaW5nPm5hLWxldHRlcjwvc3RyaW5nPgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQkJCQk8YXJyYXk%2BCgkJCQkJCTxyZWFsPi0xODwvcmVhbD4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD43NzQ8L3JlYWw%2BCgkJCQkJCTxyZWFsPjU5NDwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNUGFwZXJOYW1lPC9rZXk%2BCgkJCQkJPHN0cmluZz5uYS1sZXR0ZXI8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk%2BCgkJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9hcnJheT4KCQk8L2RpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhZ2VSZWN0PC9rZXk%2BCgkJPGRpY3Q%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD4tMTg8L3JlYWw%2BCgkJCQkJCTxyZWFsPjc3NDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTk0PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5wcGQuUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLnBwZC5QTVBhcGVyTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BVVMgTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5BUElWZXJzaW9uPC9rZXk%2BCgkJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC50eXBlPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvVGlja2V0PC9zdHJpbmc%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuQVBJVmVyc2lvbjwva2V5PgoJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnR5cGU8L2tleT4KCTxzdHJpbmc%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXRUaWNrZXQ8L3N0cmluZz4KPC9kaWN0Pgo8L3BsaXN0Pgo4QklNA%2BkAAAAAAHgAAwAAAEgASAAAAAAC3gJA%2F%2B7%2F7gMGAlIDZwUoA%2FwAAgAAAEgASAAAAAAC2AIoAAEAAABkAAAAAQADAwMAAAABf%2F8AAQABAAAAAAAAAAAAAAAAaAgAGQGQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4QklNA%2B0AAAAAABAAZAAAAAEAAQBkAAAAAQABOEJJTQQmAAAAAAAOAAAAAAAAAAAAAD%2BAAAA4QklNBA0AAAAAAAQAAAAeOEJJTQQZAAAAAAAEAAAAHjhCSU0D8wAAAAAACQAAAAAAAAAAAQA4QklNBAoAAAAAAAEAADhCSU0nEAAAAAAACgABAAAAAAAAAAE4QklNA%2FUAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA%2FgAAAAAAHAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAAAD%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FA%2BgAAAAA%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwPoAAAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA1UAAAAGAAAAAAAAAAAAAAFFAAABwgAAABAAcwB3AGkAcwBzAF8AYQByAG0AeQBfAGsAbgBpAGYAZQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABwgAAAUUAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAUUAAAAAUmdodGxvbmcAAAHCAAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAFFAAAAAFJnaHRsb25nAAABwgAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAAADhCSU0EKAAAAAAADAAAAAE%2F8AAAAAAAADhCSU0EEQAAAAAAAQEAOEJJTQQUAAAAAAAEAAAAAThCSU0EDAAAAAAWrwAAAAEAAACgAAAAdAAAAeAAANmAAAAWkwAYAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZADhCSU0EIQAAAAAAVQAAAAEBAAAADwBBAGQAbwBiAGUAIABQAGgAbwB0AG8AcwBoAG8AcAAAABMAQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAIABDAFMAMgAAAAEAOEJJTQQGAAAAAAAHAAIAAAABAQD%2F4TkjaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSIzLjEuMS0xMTIiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyI%2BCiAgICAgICAgIDx4YXBNTTpEb2N1bWVudElEPnV1aWQ6RTcxOTVFNTY1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkRvY3VtZW50SUQ%2BCiAgICAgICAgIDx4YXBNTTpJbnN0YW5jZUlEPnV1aWQ6RTcxOTVFNTc1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkluc3RhbmNlSUQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eGFwOkNyZWF0ZURhdGU%2BMjAwOC0wNy0xOVQxNDo1Nzo0MS0wNTowMDwveGFwOkNyZWF0ZURhdGU%2BCiAgICAgICAgIDx4YXA6TW9kaWZ5RGF0ZT4yMDA4LTA3LTE5VDE0OjU4OjA1LTA1OjAwPC94YXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhhcDpNZXRhZGF0YURhdGU%2BMjAwOC0wNy0xOVQxNDo1ODowNS0wNTowMDwveGFwOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhhcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ1MyIE1hY2ludG9zaDwveGFwOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9qcGVnPC9kYzpmb3JtYXQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iPgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8cGhvdG9zaG9wOkhpc3RvcnkvPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8dGlmZjpOYXRpdmVEaWdlc3Q%2BMjU2LDI1NywyNTgsMjU5LDI2MiwyNzQsMjc3LDI4NCw1MzAsNTMxLDI4MiwyODMsMjk2LDMwMSwzMTgsMzE5LDUyOSw1MzIsMzA2LDI3MCwyNzEsMjcyLDMwNSwzMTUsMzM0MzI7QzA1QTE5MDRGRjAwQUJEQzA1MUJERkFGMDIwNEVBNTE8L3RpZmY6TmF0aXZlRGlnZXN0PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24%2BNDUwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjMyNTwvZXhpZjpQaXhlbFlEaW1lbnNpb24%2BCiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U%2BLTE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6TmF0aXZlRGlnZXN0PjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDtENDYzN0NCOUQ0MUExMEJBN0VGNUVCQ0RCNjMxODMyOTwvZXhpZjpOYXRpdmVEaWdlc3Q%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY%2BCjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8%2B%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQACAYGBgYGCAYGCAwIBwgMDgoICAoOEA0NDg0NEBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEJCAgJCgkLCQkLDgsNCw4RDg4ODhERDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgBRQHCAwEiAAIRAQMRAf%2FdAAQAHf%2FEAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4%2FPE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BCk5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0%2BPzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BDlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq%2Bv%2FaAAwDAQACEQMRAD8A7%2FmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmrlHI2utXn6WltnFESb0RFSp41WjD5q3LCBaslzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2E2rj0LuzvF7PxftUf8AXPLDnC3XI0ewdpOkTK4P08T%2FAMK2Ec1TLNgaxmE9pFIDy%2BEAn3GxwTgV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F%2F0e%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXYUeZpfR0a4kpUAx19h6i74b4X65CbjR76FV5FoJKKe5C1GIVLdDuGhuXs2IKOX4gfsvGdx%2FskKtkiyD6bctHHbXgPImOC4qOpXj6E1ff4Mm4Ndxkpc770BvNmzZFLs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Lv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVokKCT0G%2F3ZgaioNQemANZuhaWLyE0LlY1%2BbGn6sWspA8QA%2FZ%2FUcVRWbNmxV2bNmxV2bNmxV2NZQwKnodj9OOzYqwDT4iiPZsa%2FVLm5sj7I%2F76L%2BOTXTpjPZQSt9pkAb5r8JyKXqfUvMOpIQOFxFDfoP8qFvTl%2F4Q5INDkrFPAf8AdUhI%2FwBV%2FiH8cnLeAPcxHMprmzZsgydmzZsVdmzZsVdmzZsVdmzYyWRIo2kkYKiirMdgAMVX5sjTeaGl1CzsbSAOLuX0w7k14KCzyAD%2BUZJBirebNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F9Pv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVo4CXUFa9e0CbJRWkr%2B0RWlMHZEJ5WtPMtzE5%2BGYJKnyK0%2F4kuEC1ZeM2IW0okjFT8S7H%2BuL4FYz52mMWn2tDTlcpX6FbDHR5ecCH%2BZevywl%2FMM8dJtn7LdJ%2BKvgry9ccrOJ69KVw9E9GS5s2bAh2bNmxV2bNmxV2bNmxVi3miFU1LSbxvsStJYzH%2FJnSi%2F8ADYpoEzLcxq1T68FGr%2FvyE8GrgjzdC0mhXEsY%2Fe2pS5i%2F1omDf8RwttJRHdrcDaNbhZVI6endIG%2F4mcnHeJCDzDL82bNkEuzZs2KuzZs2KuzZs2KurkZ843Zhs4bVTQzvVqfyrvg3zHNPb2UMsLtGBPGJSpIqjEqRUb9ch%2BvSSvp0JlcvJCLyMuxJb4JNvi%2F1SuEBVvkaX9L%2BZbm8Sv1fTbf0Y6%2F78lPxH%2FgFzpeRvyPbWcXlyyubWBIXuoxJOUG7uKjk5%2FaOSSoxPNXZs2bArs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FU7%2FmzZsVQ2osyWM7o3FlQkMOxGPtZhPBHKCDyUE08e%2BM1Bedjcr4xPT%2FgThV5cvBJbpGergEfMDcYa2PkqfZs2bArs2bNirs2bNirs2bNirshfnRGtb7T9TX7LcoJD2qDzSv3vk0wl81WDajodzDGKzRj1oR35R%2FFT6RthHNXaVcrKsUtftDi304dZz7yrqPrQCIncdMnsEnqRK%2Fcjf54yVjP5gwtJ5ckcD%2B5mik%2BivH%2FAI3wD5RnEtpwrWgw983RGby1qiqKlYGkA%2F4x%2FvP%2BNchnke5BIUGoPQ%2FPEJHJ6XG3JFbxAOPxOA1iX7sUwIdmzZsVdmzZsVdmzZsVUbqBbq2mtm%2BzMjRn5MKZDLP4rC2UVq9qYj7SWshWn%2BtxOTnIVG4ttWvdNaiiK7FxGDtWG6Ti%2FwDwMuShzRLky%2B1lE9vFMP8AdiK33gYscKtBmDWhtq%2FHbOyMp68SeSH5UOGpyJ5pYde3moWPmW5KzH0pIo2WNt0A3Wv0ts2D73zJ6FgzxqqXpKpHG9eDMx7EYXed45VeC4gPCdYyqua0I5q5VgOv2cAW8sWo2QMqhwwoyHcVyQFhVOLzvrNrdf6fFHLFX4kVeBH%2Br1%2F4bJlp%2Bt2GqWrXFnICyKWeJtnUgV3XOP67qFjaFLHUrprecy%2BlZajxPDmN1jn8Dv8Aa%2By%2BIaXrclrdtZ34NrfR1USofgeo2K06c%2F8AgcBCXr%2FlvXRrdnzk4rcoSJFXYfMbnDzOV%2BTr82eqAOQIpaBq7AV2r%2BOdTriRSEp8z8RoN9I5AWJPV5HYD0yHr%2BGQg3Ntq1lcLazx3CiZviiYOKzQo9Kjb7YzoWqRevpt5AOskEij5lCOmc60%2BWCK0j9ONYo5IYp%2BEahQWBeNjRafEcMVTvTb%2B80fyHZ3FugE9vSORJBUqPVZW%2BEHw3yVaXeC%2FsobulGkX41HQMNmH%2FBZzC%2B1iTTbadZUkjtJjzkQqSKqNm5fsdMPfyr1%2FRdT8vra2E5N5C8kl3bSMTKpkctz%2BL7SP9peOA7fFkIkgkCwOfkz7NlA1y8DF2bNmxV2bEJLy1injtpJVWeavpREjk3Hc8V64virs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Xv%2BbNmxVplDqUbcMKH5HIPokjWsstqx%2BK2lZPf4Wpk5yF6nF9R8xswHGO8QSj%2FAFh8D%2Fqrkoc6VmSMHUOOjAEfTjsAaZMXhMRPxRnYf5J6YPyJV2bNmxV2bNmxVQuzOtu729PVUclBFa07U98DafqsF6i9EkI6ePywwyF6vG2i6oJRUWl6xZCP2JOrr%2FsvtLhG6s0yiK4X6Zfi4QI7Vb9lv5h%2FXDHrgV5c8B0LzLc2Q%2BGF29WDw4SfF%2Fwp%2BHOg6ZMHi4j2YfTkZ%2FMGwpFaazGDytm9GYj%2FAH25%2BEn%2FAFX%2FAOJ4N8uXwliicnps305LmFZDewrc2dxbt0lieNvkylc45%2BX10UCQzHjLATE4P%2BQeNc6L55e5i0J57WVonikRmZDSq7jf2yB2Op%2FVYor2%2FwBNjktpAGjv7ZvU%2BInoy8Vao%2Fa44xCQ9as25RVBqKnfBGRby9rBEsljcIY0aQ%2Bg5FCCQD6bj9lslGAikN5s2bArs2bGyOI0aRuiAsfoFcVS%2B%2F1q2sJltyrSytuyp%2ByDsC3zwxBqAfHfI%2Fodmt2z6pcjnJK5dAexPT%2FgRkhxV2c782mSy82WUgNIdUhNs4PTmlXQ%2FwDBDOiZAvzLb6nHpOrlFkjs7lWdG9yvxVG%2FwiuGJ3Up3YTJFr7op%2BC8t1ljHjxodv8AYtkiyHbxx6XfKx%2FcXBilJ3%2BAsVUV8FRlyYA4Z80DkkPmq3EtlHJSpR%2BJPgHBH66ZBtIufqt9Np8pALHnEpO5p1oM6Xq0P1jTriPoePIfNdxnLtZtrGZluBcG3vF%2BFJYuJfx40IIxHJKzzb5et9ZtZYp1LwygcgPtKy%2FZkT%2FKWuRKKCOC6tNH1CblcWiILDUWHH6wg6wyDejx9Fw4sfOMjEBY5biH1HgLy8VYulOfJV%2By38q4ndH9LlL219K4iilHrWzLxlhI6SgE1%2F2SnFKo0Czxy28zMqcSzspIYBPj2I%2F1cd%2FytnVZdNQ2D1I%2BESMoPw%2FzMftdMG20TSQyyblmjenzoc4TY6ld6ddyKwMUsbFZoHqNwd1KnGXRXs9n5%2Fv7lg98GlWhMjwk1A%2Fm4k%2FF7jDSwSPULTTJI3PGBphGNwG4OHVW%2BgnONX%2BsWFpDFPaSSJcTESG3TcRlf2uRK%2Fazq%2BkR3aeT7e%2BjnX6yoW8ibht%2B9i9Tg%2B%2FQ98QVZHqstutowuSPSdSpV91IPVWzif1i98t%2BZ7m40FjbSWUrNCqEmkex4EH7acT9lv2c6lonmbTvMUTWdwgiumWktrLQhge6H9of6uRLzd5ZurDVP8Q2KetYFUW7jXeSKi%2Bm0hH7UZH7X7OCY4g2YM0sMrjvexB5SHcXsnkPz3Y%2BcdPqKQ6lAB9bta%2F8lI69Y2%2F4XJeDXPJlvPe6JqMeq6NMYLuE842To6ntToyuv2k%2Faz0J5E8%2B2HnGyI2t9VgA%2Bt2ZP0epH%2FNEf%2BEyESeUuff3tmbFAx8bB9H8Uf4sZ8%2F6P82TMMLNb1iDRrQ3EpBkkPC3j7s5%2FwCNV%2B0%2BGVc4n5m8yfpnzJcsr%2F6HYsLe232PBv3j0%2Fy3%2BH%2FY5JxkLourX175%2Ftb28maSZrloqsdlQ1Tgo%2FZUDO755%2B8uxlvPcMI6i6LAe2zZ6BwlS7NmzYFdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVf%2FW7%2FmzZsVdkb83W5%2BrW1%2Bg%2BK1kAc%2F5D%2FCf%2BG45JMC6jare2FxaEf3qMo%2BdPh%2F4bCNiqV6VOOcTV%2BGReB37%2FaX9WHoyFaJMz23BqiWE7juCh%2FsyaRsHRXHRgCPpwy52gLs2bNkUuzZs2Kuwu1rS49W06Wzb4XI5Qv8Ayuu6nDHMemKvONE1KWGVrG7rHPCxRgeqsppk7sb0XC8W2lUbjxHiMhnnnTHtLmPXrZfgakd1TsR9iQ%2FP7LYtomq%2FWI0Iakybof4H55LmFZdqNlFqNjcWMwqk6FD8z9k%2FQc515XuZbW4l0%2B5%2BGWFzE6n%2BZTTOlW063EQkXY9GXwPhnO%2FNsS6T5qtbofBHqaniexmi%2B2v%2BsU4v%2FlfFgHcrPTFbanZNb3caywyApLE3Qj3zjutwW%2FljzBc6Pp6fV9JHpsLNSSgR1HIorV3Vvizq2jXQk%2BAndlBA9xnNvzRiWPzJBJWnr2gJP%2FGNyv8AHAdikJ3YGf0o5pZDIboSD1GJJ9aAgh6%2F5aUzoFnN9YtYZ6gmRFY06VI3zlXk%2FVI5bi2hnlBgdBuxFFahhfr0rSNsnHlXU4JI5NJaSt1avIQm%2B8RaquD0I%2BLjkpbgIZJmzZsirsDagC1jcqvUxOB%2FwJwTjXUMrK32WBB%2BWKpfofE6Xb8f5d%2FnhjkMPmvR%2FKlrJBqkxBSVkjC0PIDpTfI15s%2FMNbu3jbR5plsZVp69swRi9N0eSjMnH%2BRcVpm669cWWtXGnatwjgKma2uPsj0x%2FNXw%2FayOfmLr%2BhX3l%2BPTYrkXM%2BpGtm1uPUUceX7yRx8KLtx%2F1s5xoN%2FefpVr6C8muVVfUuLO8kMrEIeTem7faRk5Iy5FdTuZ9B169trGZvqkc5eFD8SmJzzUcTtsrceWHzTT3fRJv0p5UZvtOYYrgCu%2FJV4P%2FwANHnPrj83vM2lX9zpWoBJYInaJ540pOi1%2BGRQDxf4cln5Z3qT2stjWrK0iexEgE60%2F2XLOUfmHYNZeZbhWP94Ayn%2FV%2BD%2FjVclLlbEdQn955q1wTiU3huLadeQCsfSljO9VNev%2FAA0bYHub1Z7V5yWkhHxpcVHJNwGiuP8AKStVk%2FbyGafqLQxyafO5S2lPJWUAmGQ%2F7uiB8f8Ad0X%2B7F%2Fy8Ctd6jpl3Lb3v%2BkQTpxniqTDcQn7LoR%2FwUb%2FALDZCyyekWl9ZyaFLPelZGN2tqDEtZJHenEs67ckpVXwq1bU7G1iKWvqtcCR4bkkhFYx%2FCHXhvvX48C%2BU7H1SbK3k9Wya5hv4HchSBF8FxBL2WeOJ1k%2F4s9P4cu%2F0j%2Fc1FphmFxPLeOhZBxAiL8jt40%2Fa5YegV6PprvLpcE8sfpTNbh3QVoGK12zluoQ2PnZih42fmWIVt5z8Md4q9I5P5J17Z2A8YrWVl%2BERoaDwoNvupnLtb02LzREdR0hBba7bVe4tEPFZwpr6s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xKXcslu7tXb1%2BSBq%2FwCSzZK9c06xuNUutStkBls5IFkAIAMoHqUUfzNRkbCPW5Xs70rZcVtL0%2BtCoAFVc1oK%2FwArni2RIShdD0rU9Z0g2UNW1DR5JLG%2BirRlQuXhmp1ZP72M%2FwCph75g0K2sra21G8ch5baGJUpt6yARuvL6OWEQk1eJrq9s55YLxBzuGhJEjr3LKvxSqv7WISanq2oQRXGryvd2MtVhuSQ8aNQch8OyNjsqElhK1hbcr%2Fcv3K%2FyV%2FycRSQBmUiifsfQM6FpfljSbrR0mCy3EjDlDIzN9sGnphU%2FZ%2FlbIrqnl%2F6jM3Cb1VRqOoU8078XoOHPISIiQCd5ckgE3tyS4StK6xSy%2FDJ%2B7HqseO%2FYVw0W2thatp10he2b7YH21cfZljP86f8AD%2FYxO4tbO4so4I7ZUvG5Lpl3PssprUws392JD%2Fut%2FwCbAOh6sLuU6VqYMF4hKRu2x5DrFID0YY7rsh4tMn06%2FkspjzjniaS1nQfDIE%2BJWXwdafEv7Od0ugnmL8tmYipWEOB1oGWp%2FwCH5Zy4hoT9WuU5BTzj7FHp%2FeIe3%2BX%2FADrnR%2FysvRfaHeaJIwZ4RJGo8QDzQ%2F8AAy5OPVBfPNxbpMpifYqaBu4IwFYWlx9fEIJU7lmH7S%2F83ZJ9e0x7K9unRg8azMkoHWJySVR%2F9YH4W%2Bzj%2FKtvFdaxBDLQKzAVO243G%2F8ArYPJUXb2NvDZtdyWxe3B4meCQ%2BtG37Jkjb9lafaXHRXl9q2r6etnWJ7Yxx28h%2B1UNyMjt%2FlH4myX6lp1poPm57CIFLG8jikCsKisqqXWncc2%2BzhLZW0Om35hCuLiCeSgIHFY67KT9rl4YaV63IwMVSakg1pt27eGRuzvrTWILdYbnlcIWXSdQc8W5pXlp91%2FLIP91M%2F94mG9tcfW3AQ14xgsPH4c4Zp%2Btz6HqN2rJ61nNIy3loTTkA54yIf91zR%2FailyRNUinpV0iXqyyxw%2BjdW5Md%2FaN1iPdqf74f8A5Jtka1ZZ4LWYxsySKpaCRT8QI%2BIxkj2Hw5KLe6%2FTsUF%2Fp1wsmrRRk2l0QAL6Fft290g%2Fu7uP7Lo395hFquqaL9XZmmWCRwySWTgs8MgG6Oo%2FY5fZbAUhC%2BZ9JsfMl1SKYW%2BqyQRT2DMf3UvJeTwt4M5%2BJchKyrOr6D5gQwTQEpFK%2FwDeQv8Ayn%2BZDk%2B1Gyj1ew0SaC4gS5ntmCtX0ELQtQAM%2FEcv5Fwv1bQxr%2Bnhr4oms2ymP6xuCStSIbof6v8AdzYOaGAQ%2BXdTm1NdLjj5SN8QkG6FOvqBu%2BTjTrS2sbZLCMcVUmkpFGLn7Rf%2FAFv%2BFxTTme102DTuILIwZpKksW%2BzxWtW41%2FZyU2XlW41HhcahytOQJZVHKaXw%2Fd%2F7rY%2FzviAqQ21ldXtytrDG0k524qKmnj8sO736roNmNIltfVv7hFeaMnkUqTwpxNA2S2MaT5etS9w6WdtEvx1b42A7Symh%2F2C5zTzb%2BZun3swOjacGVKwrqMgoajeiJSr%2FOTDVdVZPYa3pOj%2BW7u31uKKzuZGP1dePP1Iz1UovxtJ%2FlYU%2Fl%2F5hOtyS%2BWrlis1Gm0pyfiR4%2Fi9Kv7SumcrvNYnu5DcXH7yToamrfSf6YL8ratLZ%2BZtJvoT6bwXMbEjuCwVh8uJauPFuFe%2Bx%2BYJ4NMawQiOFzyZOlDX4h%2FwQyQeVtAn1BY9R1QN9WU1toG%2Fa3qGYeGE3lnRLPVfM19LdAyWkTtcW8a7xOGaq1kGz7k%2FAM6moAACigA2AxJ7lojn72wANgKAbDLzZsirs2bNirs2bNirs2bNirs2bNir%2F9Hv%2BbNmxV2bNmxV2Qzz3p3P6rqKbFKwyt%2Fkn4lJPseWTPOVfnX5gmstNtdBtnMbajykuXHX0YyPh%2F2b%2FwDEcbrfm24MRzZI447GR59w6pMfNyWl7EdD1KM3Cp6dwoKldj%2B1zHE%2FRko0rz1rUtz9SvLe2lm2Hp8jC7BhWqV5xvUb%2FDnn01jPEin8pHgckemXmsTaHcxANw05o57O7IIKxliJYll%2FaRT%2B84%2FsNkIZhIkSjRDl6zs%2FwIjJCXFHkb5gp3%2Ba2r%2BbdPuEvYLVbLRpiFL27c2EvWkj0%2Fd8v2VpkGsfN2p3Kra3V2XicgEsQeQJ3qSNs7d%2BkdO1rSbKw1LhN%2BlbRXVJKFZyq8ZV3%2F3YGHLOEecvKFx5TvTLDym0idv3EvdG%2FwB9yf5a%2Fst%2B3lpHUOvsua4iNwbWCruHK%2FB0qN9j0zoy%2BarW48r2Oq3l1Le2sSizuGkqk6zgUVXMda8F%2FwCDTOO2M01rIs0XCRQ4kHqCqGnZl74NgkTlMqSOIZpPVNrXjGG8Qvfj2wXzSyqz1eO%2FtNSjQM8sVubhFbbkIpPiI%2BUR5Yca3q17IdPmtZ2js7yztriONNhyAKSciPtMJUfIZaXDWL%2Bra0jcq0ZYAV4yAq6mv8ynJf5Yex1PRjpUsfO%2F0pnuLJWNPUgkNZ4l%2Fm9Nh6vH%2BVpMRa2uvBcXej2Gp2rSC5tJJbOZkqW4v%2B%2FgY%2Bx%2FeJhtBB5sOi313boLa9ihMlo3EB5ClGkULy%2B16XJk4rhlZarBFAbZljtrS5Tg%2FoIF4fyOT1JjbC1L%2BbSbowyMwu4WrzJryX9h1PQpxw%2FFWFXNut9PB6srS6frlqI4JZHJ%2Br30bCsbOf5phx3%2FAN1T%2FwCRgPQbtreVrEFrW8gfnDU0dJUPF09unHD%2FAFeygjjvbi2haTQbpxcXlpHvLp9x9n6xClfjtjXi1P2P3b%2FGseE99ol9qtyjIKamYlktb6Mn0L5QKJ8Zp6d3x%2BH4vt8OD%2FvciTXPZaZ%2Bkdp5%2Bgt19Yad5p0%2Fe0vU2Y8T0NPiaM%2FtJ%2FuvOj6lcGysFaRlYxJWUjfkUXk3z5MM5p%2BV2l3U2pPdalFHK1sOLyqQxSZaFOdDWOT7W%2F7eTTzK8UdlcxREhXBTf%2BdzWg%2B7JxNji70HnTz%2B51GXyrrFxaapD69nfcRqSftqxHL1oj%2FOjPjtQ0GNYCfrCXWi3QMtlelhyjkYbFfdvsyx4M87Wy6zqemTq4X9KwQnmegkK%2Bmf%2BSi5G9M1PVfLUt3od3CJIGDEQS7iKUD4Zov8%2FjyErqrruPNkK58%2FJN7Sx0%2B0sDe3k0k9xA6JBJACGqwPHiKp8S8fts2F0mrDS3nubPThH6ZLa5YcQsnBvs3kSsCnJeXJuK%2FB%2FwAYmwQ%2FrXdjEsQRizhvjKCrUp8If4uW%2FwCyuK3Fs893p1nezfVdeDCOxmHFi8ZH%2B89wSeBjP2YuX%2BVFiYggA70Pmt9QzfyjdxXeiPeaY3rNYt9ZjdKUkgP2gyj7L8ftL%2FPgTz2tuLdJIT6cN1JFcxzJ2U7Sb%2Fs%2Fa5BsKfLEMvlPXby2sJI40uF%2F0izVuUcb05n0z3gkTlw%2F3237vHeddXN5pEMdnbmOys4BFcy0qDcF6GJa%2FwDFacmyX8Pu2R1QOi6Yupabd2F78dj6xjLVFUlpySaHwkUf7F0%2BDIrrvl6dr42N0eOtRIHs7ldkv4B9ijf8tKgfB%2FP%2FAHX28mPluyb0Vs7OdTL6SSReoK8%2FTZqN%2FrqOPL%2FJwTqdhFr9m1lqUhjnhcm2uv8AdltN%2FMKf7pb9tP8AZrjVhWHaHrEWqxjTb9gt9GKQytsXptxNf2sl35d3J0jznJbCojuQlR26cT%2Btc55qthdyXcyyJ9X8wWfx3ESbC6UbrcwfzS8fjfj%2FAHyfvPt88N%2FKuq3F3q1hqBIEyc4pWZuCkoAwck9MA50VPJV%2FMq2k0TznfCJQUmPJom%2BzJG%2FxcW9t%2FwDY4Q6cILa6ZY2eKRwslv6goaDfjy%2FaK4f%2FAJleadM80a8t1pcZ9GCJYmuG2MrD7TAfsqv2V%2Fmwr0WyuNXUw%2FVxci1%2BKLt%2Fw23wrg6qGVanr1vrK2t3csIry1aESBjxJEYYOQff4cjvm3zLbpZXLWTGC5vr%2FwCswRjfjBGoC8yfi%2BIjCPX2vNMu%2FqZDRNGKSAgUqxqgqKruF%2BH4sjsyPPIZZSXJ7knfG1e9%2Flxrdt5ksbqdSFu7eMLcW5O4%2BE0cV6xvnF75uVzcb14yyBW7%2FaO2KeS9RutC8yWd7DMYLfn6d3L%2Bx6D7SLJ7YhdkNd3UkRDRSXErxMDUFGclT9IwndCtpWrz6ZN8MskcDsGdojxkjcfZmip%2B2v8AL%2B3iWoySfXbiHUmFy14frKXqH4nL14zK%2FVuX7cbYEeJWDPQVpU0Pj0x6yqLL0pJUW4tXE1o5O9SaSRbeP28Cob1Z1T6vPKzxjeNSSQK9aV%2BznXLfUrdtDt9T1U%2BjeRxpa3iMvF5V41jcg%2Ftrx%2BLOd6VbaTqJlS7lMl5Iri3hHwRiQj920snhzODppWsii6zcGeSZg3po3NSy%2FD%2Fen4K9V542r0LyheaXcm5uaCCWNhxkl%2FvClOqcvs4rrn5g2enI9tpKi4uqlWck0rSvxP8Atf7HITazpc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2FLhpr3nLTKJ9UT19TB4zNHtCe3Jj3b2XIssp1Y8bUfFOQsix7SCSlAXpTmj4av5OnsdM%2BuzB3Zm9OWaNGD2%2FMgRTolP3sXP4Zv92fyYi6oITDVrG28x6NBeBvqWoWS1ivSeIikU8jFI%2BzLA6%2FGn%2B%2B3yFaq1pcXix28ZUGi3U2wadx%2FuziAEWv8Aq%2FH9vDLV7TzXeWrqbaWO4VhHeNHtFdCP7EhX5D4v9%2BfbwpC3liGgvIoVdSqt6pLPGr0pTj%2Bz8Xw4CUkEGil7RwRu9ZzwjPx8UZiKePShyb%2BRfMdhHM2kLEV%2BsDlDLQFncUCxcRX7WEF1DCs63zCs6r6c1Nkencr7rgXSpFsb5zCForepC9PiUEfZr4DADRVD%2BddUkPmPU4lUgVNtNG4qDw2Bof2kP2GyK1LECpY%2BAqTnUFhsta1Ce%2B1G3inuZCrySsgqwqFNRkwu9R8m%2BWIwscEHrharDBGjSH5tT4f9kcIoop4da6Vqt2GW0tbiQHbikbkH57UwHNFLbSvb3CNFLExSSJxxKsuzKwPQjOu3%2Fmq%2B1mFo1C2NmFMjhTQLGu%2FKRtumQfU%2FMWh3uoTXx0r1pJePKSWSnJlVU5lQNufHnhQxmOYxklSPiFCDvUZQKUIpUn7Jr0%2B7D8eYrBP7nRbUf61W%2FhmPmtkBFvptnEezCMkj78CpRZOY5w%2FBmWhBCjseuSyyn0pIpIr2CSr2gtbYTQt6aylufPp8PBWbCZPNurROskYgVkYOv7tSAVNRtg2780%2BYPNd5CdWuRJHEWkWONFjRaih%2BFAPljsqLeRrVh%2BjQt3GBRoXBBKAfFwag%2BLJ15B17yfealE2taTHcXMG63Eq%2FvbYL%2FvyH%2B6eFK%2F3iJyT9vAXkPygPNEuoxx3KQ3VrAHtYWP8AeOxpv%2FxWqijMv2WZMLdS8vBLx4pg9jqVqTFJIvwup6fvP5lP%2FDLillv5i%2BStPtL867pEEcem6hxkivLWjIk%2FevHb05ftZF9Okd5Et5mayvoWEtrdRmnCUfYmhYfzftp%2B3k3%2FAC68zLfx%2FwCFdWt1eElrbUoW%2BwGIrDPGv7CyU%2BLj%2B18eIeavKM3lq7WqfWNOkYizuXFeNesE9P8AiX7WNbqCncfm2f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V1PpOsrBduRLFcPb3JY9VditW%2F2XxZ0%2B91O2spIoJWL3E54wW0Y5SOf9UdF%2Fmdvhzm%2Fm2w%2BoeapJlBVdRjWdCDsZE2cfeuHdvfQW0BngZptVvEH1u%2FlG6gj%2B5hH7Kr0xHc0pD%2BYg8wa1NDFZWjSWtsrCRoiGJcn46b1YdF2yFWemzxsW1CN4Ej%2FZlUofubOs2WpxpNGl2oMP2eSbEe5yTXGkadqFpJaT26T2860YEVBB6EHx8MeCzdpunlEtpHYQ38GqRrFNaPA8EgJcFa%2FGqhadao2XBGlmbe2uCzevbGeRo2PcNJx%2F2S%2FDht51s3sLpYLoH6ncIq21wRU1UceLt9Hxf8Hhj5f8pXerWc%2Bq2VrHqE1oqQWdvNLwUoijmJB%2FO9W4%2Fs8cjVH3LezEvM2mXWqyabNozB7SS1WJ5SwBrHWnLv8A3ZUbfy4onlazmtrKC%2BJlNoHFFNFbmQaHvtTJ9rPlzU7GOO6vrRbeNioQQMrRxmn938IXj4YE0fQLnXBdQ2062l1CP3SSry9Xav7og0%2F4LDsikps7C3s1WK2iWJB%2Bygpg5lNOX0YAVr7TL0xXsxcxsVlhktwpFPtLVWwbf%2Ban0e8tp7LTYrmyILlpyT6hoRw2%2Fu%2FTbdlw3taoK4v7a1dY2dW5GjQ1qVHj%2FwA24Vah5a03VlNxZEQTtvyX7LH%2FAClyfjyfo3nrTrbV9PRNI1i6gM8qRENC8gb05OUI%2BNR6nR1%2F4HIRqOj655Vu%2FQ1SBogT%2B7mU1ikA7pJ0%2FwBi3xZGwdizhOeOXFCRBSPSZNX8maml1MhNsfgldPijdD1H%2BS37S8s6ZLrEEZt2uEe1W6VWtLsg%2BlKGHIGOReS%2F6wOR9dWtRp11dSQ%2FWHt4Wk%2Br93IGyU%2Fysk%2Fk%2FW5INATT9Z0eAWczGT6gr%2BoIlfcgBxsf2vT%2FAGMYxMSeE2D07m7PqBmjEzjWSO3EOUo%2BY72M%2BYfLcd3FJeQRxyo7EzQU792GQ60bU9Hkf9HTAwts1jdVeNl%2FyX%2B2n%2FEc7ZL5XstVSS58p6kYZqVbTrysif6tWPrRr%2FspVzmuvaDq2jzsup2JtA5NCfjtmNf91Tjb%2FYyccJ8tmgJPqV4JJLJpI3sYLq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FFMx2imJJSvhHLXj%2Fr4N%2FO9G%2FwAJ28o%2FYvY69%2BqOMgdlYzqPmWy8xr615aouoxAA3dk4dJB0%2FfRGjofBl54U%2BnCySRNSa1l%2B2vQq3861%2By65GPKcztqxjY7NEw4jYbU32zoNppF1qfrw2JX6yierHExoJivWIf5fH7DYYnZaY3pN9N5N1n9JJEbuIwyRoisY1kDbpVu3F%2FidM7xpl3Y%2BadFt7m5tle3vIUkaCYBx8Qowof5WB%2BPONG0jvLY28qlRUgqwoyOOu37LpiXl3XbjyZqk7XglmtZIfTEKNQGh5REFvsxr8XLjgIrdWQedvy7GiQPrfl4SNaxVe5s1q7Rp3ki%2FaaNf20%2B1kT07WGCqwcMjdJFNQc9C2N9BqNvHc29WiljSVGI2KyCopkFv%2FwAotHu9cOq2d1JYW0x53dhAo4O53JQt8MYf9ocMFyB23ZwGOQIkeCQGxqwfIsatNQSQrIrmOUbrIhoQfEEb5LLHzPP6X1TV4RqFo4ozFVL0%2FwApD8EmFms%2FlxeWBNxoEpuIhubSQj1B%2FqPsHwo0%2B4ltUmW7Ro5ojRo3BVhT2OWCi1t%2BbPJ1pFCfMXlJgtl%2Fx92VCyRHuwjb4kX%2Bdf2ciOlG2huhcX2n8JI2BE8FHHzMTb%2F8TVc6FpWutaySPblJEmHGeCQVVwP1ZGtcsIbe5N3p0Ui2MlWaM7mB%2FwBpQ4%2B1F%2FLkTGulhnDIYnYprf6tYaxaxxCDlxIaG7iko8Z7kGtWr%2B3ywxsdGl1WwitzGbkgkRzugDGnRm34R0%2FZbIJBZwxv9YhAVx8Qp0JPiBnafJl1eXekLNdyrKOXGNgADQD4g3Gg%2BE7Y8WyTLfiHNJbbQvNHle%2Fe50eQX%2BnXAD3Vg53EoWnKImhQmn7Pwv8AyYRX9xql1dmXWOS3XHiqMnp0QEkKq%2BA5fazrQwHqOmWmqQGC7j5D9lxsynxVsFsLeO39hb39tJbXMYlhlHGSNuhB%2FUffOZXy3%2Fl7UV05n5MgrpN1LTjLCT8VncEj%2FYf5Odt1nQbzR3JcerasfgnA2%2BT%2FAMrYB%2F5V3Y%2BdtAvhefubrn%2FuNux1jkQUYkD7Ubnir%2F6uEq8D1rTFk9XUdNgaHix%2Bu2XVoHPcD%2FfbfstnQfyAeb%2FFktC%2FptaSF1VgFNGTiXFfiA%2BLj%2FlZC9WuNd8p6kNM1e04anYsY2mY7TW%2FZG2pKjfsS4K003mkCHzl5WmDLazercWoB9WCvX1FB%2FeQt9lv8nIofYNRl5FPI3njTfO2li7taRXkQUXlp3Rj0Zf5on%2FYbJXirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FW7%2FmzZsVdmzZsVdmzZsVdgHVY9PmtHi1JlW3cgEuQBUbr1wdgPUdNttTtzb3IJWoZSOoYdxirzHztP%2Bi20aTyvdm6uDcJSCMJIPTVhRWKj7Bbbi2B9b8keZrnV3FvberbsQsVwHUKFJ6tU8hSvhk%2B%2FwAPGy1GwvLOkqK5ju0cIP3YQ%2BnItAPiif8A4nkkphKQaQOk6eml6ba6fGQVt4whPif2j%2FwWO1LTbPVrGfTr%2BITWtyhSWMjqD%2FEfs4MzEVwIsg2Ni%2BVPOHlm58p65NpU1XhP72znP%2B7IWPwn%2FXX7En%2BVgW28s63f2kWr29m76Ys6xyXQpxUggNUfa4iv2uOen9c8t6J5it0t9as0uo4zyjLVDKf8l1oy5EL7TriGW30Lytp7Q6Dbs0d7xI4Oz%2FFWPlycmNvib%2BfKziufETs7WXahOn8Ph9dVIn6a7%2FewDzPd3ukNplzYtxtEhW2adVBKzRktTkalOdf%2BBw60bydZ%2BaNR%2FwARaPq0VjOIw509bcLIkw%2B16yh%2FjRm%2F3an28de6dLYTXGk6xDztpx8aHoyn7Lqfb9nI3YX%2BreQ9ThS3pcWhcvazMBWSE%2FbgaQ%2FF8P8AJlrrDvunvmryB9buFvzAtnrkQD84z%2B6mKHkGRtu%2F82HWnO%2BoadLpU5aC4ZeUL9Gil%2B0jKR0aOYZOLO80jzho0d3Zv6kMn2WFPUhlGxVh%2By6H7WQWaO80rV1hvwBMjcfUAoskTbLIP%2BNsIr5oSu10tfOt7Ikt4th5ijQC6hkSsdz6fwfWIiCCr7UmTj%2Fl5JG%2FKTSdTjg%2FxDILh4UCUgHD7P8Axafj45GPMdkYtRkvbWf6jewEXNhcr9ppT9pEVatJWnxJx%2BznRPIfmz%2FFujfW5Y%2FSvLZ%2Fq94gBCmQCvNQfiVX%2B1xb7OA2NleaX%2Fkr%2FA19Jb2rO%2BlXbc7UvuFbuvL%2Bb%2FiWC7M7HOuarpdrq9jLY3i8o5Bse6t2df8AKXOP6jbaj5dvpLK5USBd0fcB07Ov8cMT3qkP5l6trkWp2kNi8sVr6CShoyVDyH7RJHXj8OQpfNfmCN1%2BsXcsnBeCrOfUAUdFHP4uP052ny%2Fq2g6veR6T5hgX94Almsp%2Fdsw%2F3W%2F%2BU37GSHUfyp8n6hUpavZse8DkD%2FgH5p%2BGCXNeTwM%2BbzeWxtr%2B3SVHFGMZKMP8oBqr%2FwANh9qv5gpr3kVfLV9zk1O3uIjFOwrzt4w1GZhUeqn2P8rJD5i%2FJJrK2lvNKufrSx%2FEYCnCXiOtCpKPx%2F1M503lq7tpDxDNUUUGlPwyJtWQflfpMWseaFtLgssZtZnDJ1VhxCn3651e38qanp%2Bs2ZX95brKG%2BtR7UVfio6%2Fs16YS%2Fk3pGmWxvNR%2BspJqfEW7WnR4kryLFW3PqN%2FL%2FLnW8I2UsW8x%2BVo71n1LT0CXp3mjGwlp3%2F4yD%2Fhsgl9oyXUaxX1u8LoCY2dStV%2FaG%2Fgc7JTEbiztrr0zcRrIYmDxlhWjDJCXQoeVeW9Rv8Ay1PKL25kuNO9ELEo%2BIjgaoKk%2FAqJyzqtrdQXkCXNs3qQyqGjcdCCK7ZFPMPl1Yg95aLWA7zQjfjXqw%2FycB6JrNzY3BW7uAbARKgUqSQVIC8KfCq8K8vhxq9wlntK4DvtJ07UgBfW6TU6FhvTwqN8FRyRyoHiYOjCoZTUEHH5FDC9Y%2FL6wuSZ9Ic2M3X0tzEfo6p%2FscL9B%2FLy8XVJNS8y3Yuo41aKz0%2BEkQrGwoWlO3N2zomVTDZV4l5n8s3Plq94oS%2BnTk%2FVZj27%2Bk5%2FnX%2FhsMNI893Wj2ht2thNVSEp8PGSlBK%2F%2BSf286nqOnWmqWcllexiSGQbg9QezKf2WGco13yhdaVMUT95A39zL0DDwPg%2BIZc3pPlzU5dStGa4IaeNgGZaAFWHJWoMOc5v5E1B7Wf6tcAoD%2B5PLb3jP0fYzo4xIYrZIo5UaOVQ6MKMrCoIPtidrZ29lAttaoI4UrxQdBU1OL5sCsO8%2FwD5e6V5708RXNINQgB%2Bp3oFStf2JAKc4m%2F4XOIWX5R%2FmVoOpummwIySAxNMssZhZG2q3Mqen80eeoKZqYq8l8h%2Fk%2FceW9Qt9Z1DU3W4gPJLS0JCEGvwTytT1U3%2Bx6arnWs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F1%2B%2F5s2bFXZs2bFXZs2bFXZs2bFXUzZs2KuzZs2KoXUjILG49E0k4EKetK43TYkhsoQp5EqGZvEnvgp1DKVbdW2I9jhDdaDqT%2FuLLWJbOzP8AulEVnAPVVkb4hiqB8wWUXmS%2BXTYWQi3ikZphuUlqOKmn7P8ANnOtRsiPW0TWUKqD9ofajYfZkQ%2B3%2FDLnYtH0Wy0W3aC0BJc8pJHPJ2J8ThV5u8tJrdoZrdQL6EH0z0Lj%2BQ%2F8a4bTbxXQPMGq%2Fl9r7mSs9jcUN3Cv2Zo%2B1xD4Sp%2FzZnaNYhtfNmgRaho7JcMwE1pKCASP246%2Fsn%2BZf58gsugWWtaPFp1xRL21qFkFCyP3U96YR%2BUfMt7%2BX%2BqvpmqEtpUsnGeOtQjE0FxD%2FwAzUxOy%2B5kHmGCOa1s7%2BVeEsFYpHI3SvwyBvDi647RtH1by3qEXmPT5VlgnWmo2C1Amj6rIrH4RMnVcCz3FvJ5x1pIqX2h30cVy3ouv2nQEeka9XZW5ZJNPult7dbZpTLasP9HlYUalP7uVf2JlH2v%2BEw891ZzY3tvqNtHdWz84pBUHoQe6sP2WX9rC7zJoEOu2Xp7LdRVa3lPY90b%2FACHwi0IahBqtdOo9hKf9LjY0Vf8ALU%2F78ybZFD591jS3R3gnRo5Ymp4MjA9snHkr8weRi0LzJII7pQEtdQc0SYdFWQ%2Fsy%2F5X7eH%2FAJw8uLqMDX9qg%2BtRL%2B8Uf7sQf8bLnJbuyjcNFKnND1U%2Fw8Dh5pfQo3Gc487eVFhMmq2KfuHNbmNR%2Fdsf92KP5G%2Fa%2FlyPeXPM%2Fmfy2Y4pmk1PRqfBBKpNwiDr6E3%2B7OH8j51%2B1ubXU7JLiKklvcJWjDqrDdWH%2FEsV5PntoFiuUuQOFxFvHKpKsPpWnLJZ5b8w65p1xEguXuIp3q8d07P1%2FZVm%2Bx%2Fkccbr%2Bhm2125sbPggX95AZq8FRhy3p%2FL8Srk181aDHqempqtvRLu2hDngPheMDmV%2F2P2ozjsrKLW5ju4Eni%2By4rQ9Qe4OL5D%2FACp5hgu7iOwkkUXFxD6yx9DWM8HNMmGJFFDRFRQioPUHIhrmgrAXubdK2z19WOleFepH%2BRkwymCkUIqD1BxBpWIaNq09o31WURrZoiem32ePEheCIB8VV%2BLJcGB3BBHtka1LQXVne0XnC9eUQ%2B0tevHxXA2lxazHfW620rx2atW4gkSqFOPCgdvjDClVwkA7hWYZswzZFXYnNBFPG0UyCSNvtKwqDimbFWE6voE1hIbu0Be3BrQVLIP8rxXJRo92b3T4Z2%2B1Ti3zG1cGkAih3B7ZSRpGvCNQqjsooN8NquzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxViPmbyo91cfpvQiINVT%2B%2Bh6RXSD9iXwl%2F33N%2FwWQzW9AXXo%2FXaFg7L%2B%2BhK0mjdBuafzACjrnYcDTWNrPKk8kYMsZDI42NR40w3tRW3z1p2l6ho%2BotLAfXVE5OgDVljA%2BLj%2FxZGv7OS2BbeaRbscpI5YuLQq3ETIfiQcv2ZVP90%2F8AsMk3mi1FjqBnt0CpcIHIUU%2BNT8RFP5tuWRDTFEulwPaP9YjVSfVjBIFGPM%2F7BvHCOSXqXlu6trnTI1t7Y2Zj%2BGW1YhmQ%2BJcfb5fzYcZBPKl1I7GRXHKGi3AY%2FajPRvdsnQNd8BFFDjnL%2FPWhJaXguIKRw33KngklPi%2F2Pxcs6jkY892Ul3onqwoZJLWRZeAHIlT8D7fJsAVBaLpUeueS9PtriYPcWykQXkfZ4yVDD%2FJP2WwX5X1NJ2NrQIGXkoXpzQ8JP65GPJfmOTR5G0zXLmGCzlYmzhZPSeE05ceP7UTjfliOhagkWs3CW0gkUXbPZjoZVkY8kQHr8OSHUJZD540vmYtVRBIAvoTo260JrGzU7cvhzaJ5jgm0t9O1u7giu%2FRdY%2BJ48oyCg%2Fd9QyfZ%2FwArJhPBFcwvbzqHikBV0PQg9sgt%2FwCSLpJy9pxniPRiQsgH8rfzYB5ql%2Fkq1hXU4ZigNwjsizftemU3Uf5Jzp%2BRXyloF%2Fpj3FzqYiR3YraxREsyx%2FzTOaL6j%2Fyp8CZKsSUOzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Hv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVg35iPrMEFld6XbR3CRM%2Fro1fUIIHwx%2Fs4U%2FlrqOkz3c1lYQmENFJI8DCgRzIDIg5b1JavTOiajZLf2cls1KsKofBh9k5ydpJPL%2FmzT9ZcBIWY2t5sFoD8Ls5C1%2FwCDkyQ5KyjWdLGi6ml3brSyvKxuo6I58P8AJPVclOiXZurPi5rLAfTf5fsn7sE3drBqFq9vLR4pV2I7dwy%2B%2BF2j6Xf2F5dS3EqNbyhViVa8iV%2Fbfag6%2FZXBdj3KnWURXLzYFYV5n8n3us6ut7btEITGsbc6hl418B8WFd75Ym8svHqVqPrQiCsJSPiikH2jQfsNnScayhwVYBlOxB3BGG1Sby7rf6YgZ5KCZftIBSmHeFllodlp95LeWqlDMKGIfYB7kDDPE%2BSuzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F%2F0u%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZFfM%2BipLW%2BSJZAf71CtaMPsygf8SyVZRAIIO4PbCDW6pP5YvDd6Wiu1Zbc%2Bi%2B9Tt9mv%2Bxw5xG3tbe1Vlt41jDHkwUUqfE4tgPNXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Pv%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV%2F%2FZ);background-position:center center;border:1px solid #0a0}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-singlequotes.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-singlequotes.css deleted file mode 100644 index 1ec9f67..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-singlequotes.css +++ /dev/null @@ -1,23 +0,0 @@ -.yui3-skin-night .yui3-dial-ring-vml, -.yui3-skin-night .yui3-dial-center-button-vml, -.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min, -.yui3-skin-night v\:oval.yui3-dial-marker-max-min, -.yui3-skin-night .yui3-dial-marker-vml, -.yui3-skin-night .yui3-dial-handle-vml { - background: none; - opacity:1; -} - -div.base64-singlequotes { - width:100px; - height:100px; - background-image:url('data:image/jpeg;base64,%2F9j%2F4AAQSkZJRgABAgEAZABkAAD%2F4RfJRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAAD0JAAAAnEAAPQkAAACcQQWRvYmUgUGhvdG9zaG9wIENTMiBNYWNpbnRvc2gAMjAwODowNzoxOSAxNDo1ODowNQAAA6ABAAMAAAAB%2F%2F8AAKACAAQAAAABAAABwqADAAQAAAABAAABRQAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABaTAAAAAAAAAEgAAAABAAAASAAAAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZ%2F%2B01IlBob3Rvc2hvcCAzLjAAOEJJTQQlAAAAAAAQAAAAAAAAAAAAAAAAAAAAADhCSU0D6gAAAAAYEDw%2FeG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8%2BCjwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgo8cGxpc3QgdmVyc2lvbj0iMS4wIj4KPGRpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNSG9yaXpvbnRhbFJlczwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1Ib3Jpem9udGFsUmVzPC9rZXk%2BCgkJCQk8cmVhbD43MjwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNU2NhbGluZzwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1TY2FsaW5nPC9rZXk%2BCgkJCQk8cmVhbD4xPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCTxkaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxhcnJheT4KCQkJPGRpY3Q%2BCgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCQkJCTxyZWFsPjcyPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxTY2FsaW5nPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsU2NhbGluZzwva2V5PgoJCQkJPHJlYWw%2BMTwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuc3ViVGlja2V0LnBhcGVyX2luZm9fdGlja2V0PC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BUE1UaW9nYVBhcGVyTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNVGlvZ2FQYXBlck5hbWU8L2tleT4KCQkJCQk8c3RyaW5nPm5hLWxldHRlcjwvc3RyaW5nPgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQkJCQk8YXJyYXk%2BCgkJCQkJCTxyZWFsPi0xODwvcmVhbD4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD43NzQ8L3JlYWw%2BCgkJCQkJCTxyZWFsPjU5NDwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNUGFwZXJOYW1lPC9rZXk%2BCgkJCQkJPHN0cmluZz5uYS1sZXR0ZXI8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk%2BCgkJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9hcnJheT4KCQk8L2RpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhZ2VSZWN0PC9rZXk%2BCgkJPGRpY3Q%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD4tMTg8L3JlYWw%2BCgkJCQkJCTxyZWFsPjc3NDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTk0PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5wcGQuUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLnBwZC5QTVBhcGVyTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BVVMgTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5BUElWZXJzaW9uPC9rZXk%2BCgkJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC50eXBlPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvVGlja2V0PC9zdHJpbmc%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuQVBJVmVyc2lvbjwva2V5PgoJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnR5cGU8L2tleT4KCTxzdHJpbmc%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXRUaWNrZXQ8L3N0cmluZz4KPC9kaWN0Pgo8L3BsaXN0Pgo4QklNA%2BkAAAAAAHgAAwAAAEgASAAAAAAC3gJA%2F%2B7%2F7gMGAlIDZwUoA%2FwAAgAAAEgASAAAAAAC2AIoAAEAAABkAAAAAQADAwMAAAABf%2F8AAQABAAAAAAAAAAAAAAAAaAgAGQGQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4QklNA%2B0AAAAAABAAZAAAAAEAAQBkAAAAAQABOEJJTQQmAAAAAAAOAAAAAAAAAAAAAD%2BAAAA4QklNBA0AAAAAAAQAAAAeOEJJTQQZAAAAAAAEAAAAHjhCSU0D8wAAAAAACQAAAAAAAAAAAQA4QklNBAoAAAAAAAEAADhCSU0nEAAAAAAACgABAAAAAAAAAAE4QklNA%2FUAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA%2FgAAAAAAHAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAAAD%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FA%2BgAAAAA%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwPoAAAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA1UAAAAGAAAAAAAAAAAAAAFFAAABwgAAABAAcwB3AGkAcwBzAF8AYQByAG0AeQBfAGsAbgBpAGYAZQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABwgAAAUUAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAUUAAAAAUmdodGxvbmcAAAHCAAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAFFAAAAAFJnaHRsb25nAAABwgAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAAADhCSU0EKAAAAAAADAAAAAE%2F8AAAAAAAADhCSU0EEQAAAAAAAQEAOEJJTQQUAAAAAAAEAAAAAThCSU0EDAAAAAAWrwAAAAEAAACgAAAAdAAAAeAAANmAAAAWkwAYAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1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U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZADhCSU0EIQAAAAAAVQAAAAEBAAAADwBBAGQAbwBiAGUAIABQAGgAbwB0AG8AcwBoAG8AcAAAABMAQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAIABDAFMAMgAAAAEAOEJJTQQGAAAAAAAHAAIAAAABAQD%2F4TkjaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSIzLjEuMS0xMTIiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyI%2BCiAgICAgICAgIDx4YXBNTTpEb2N1bWVudElEPnV1aWQ6RTcxOTVFNTY1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkRvY3VtZW50SUQ%2BCiAgICAgICAgIDx4YXBNTTpJbnN0YW5jZUlEPnV1aWQ6RTcxOTVFNTc1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkluc3RhbmNlSUQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eGFwOkNyZWF0ZURhdGU%2BMjAwOC0wNy0xOVQxNDo1Nzo0MS0wNTowMDwveGFwOkNyZWF0ZURhdGU%2BCiAgICAgICAgIDx4YXA6TW9kaWZ5RGF0ZT4yMDA4LTA3LTE5VDE0OjU4OjA1LTA1OjAwPC94YXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhhcDpNZXRhZGF0YURhdGU%2BMjAwOC0wNy0xOVQxNDo1ODowNS0wNTowMDwveGFwOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhhcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ1MyIE1hY2ludG9zaDwveGFwOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9qcGVnPC9kYzpmb3JtYXQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iPgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8cGhvdG9zaG9wOkhpc3RvcnkvPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8dGlmZjpOYXRpdmVEaWdlc3Q%2BMjU2LDI1NywyNTgsMjU5LDI2MiwyNzQsMjc3LDI4NCw1MzAsNTMxLDI4MiwyODMsMjk2LDMwMSwzMTgsMzE5LDUyOSw1MzIsMzA2LDI3MCwyNzEsMjcyLDMwNSwzMTUsMzM0MzI7QzA1QTE5MDRGRjAwQUJEQzA1MUJERkFGMDIwNEVBNTE8L3RpZmY6TmF0aXZlRGlnZXN0PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24%2BNDUwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjMyNTwvZXhpZjpQaXhlbFlEaW1lbnNpb24%2BCiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U%2BLTE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6TmF0aXZlRGlnZXN0PjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDtENDYzN0NCOUQ0MUExMEJBN0VGNUVCQ0RCNjMxODMyOTwvZXhpZjpOYXRpdmVEaWdlc3Q%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY%2BCjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8%2B%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQACAYGBgYGCAYGCAwIBwgMDgoICAoOEA0NDg0NEBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEJCAgJCgkLCQkLDgsNCw4RDg4ODhERDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgBRQHCAwEiAAIRAQMRAf%2FdAAQAHf%2FEAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4%2FPE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BCk5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0%2BPzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BDlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq%2Bv%2FaAAwDAQACEQMRAD8A7%2FmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmrlHI2utXn6WltnFESb0RFSp41WjD5q3LCBaslzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2E2rj0LuzvF7PxftUf8AXPLDnC3XI0ewdpOkTK4P08T%2FAMK2Ec1TLNgaxmE9pFIDy%2BEAn3GxwTgV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F%2F0e%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXYUeZpfR0a4kpUAx19h6i74b4X65CbjR76FV5FoJKKe5C1GIVLdDuGhuXs2IKOX4gfsvGdx%2FskKtkiyD6bctHHbXgPImOC4qOpXj6E1ff4Mm4Ndxkpc770BvNmzZFLs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Lv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVokKCT0G%2F3ZgaioNQemANZuhaWLyE0LlY1%2BbGn6sWspA8QA%2FZ%2FUcVRWbNmxV2bNmxV2bNmxV2NZQwKnodj9OOzYqwDT4iiPZsa%2FVLm5sj7I%2F76L%2BOTXTpjPZQSt9pkAb5r8JyKXqfUvMOpIQOFxFDfoP8qFvTl%2F4Q5INDkrFPAf8AdUhI%2FwBV%2FiH8cnLeAPcxHMprmzZsgydmzZsVdmzZsVdmzZsVdmzYyWRIo2kkYKiirMdgAMVX5sjTeaGl1CzsbSAOLuX0w7k14KCzyAD%2BUZJBirebNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F9Pv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVo4CXUFa9e0CbJRWkr%2B0RWlMHZEJ5WtPMtzE5%2BGYJKnyK0%2F4kuEC1ZeM2IW0okjFT8S7H%2BuL4FYz52mMWn2tDTlcpX6FbDHR5ecCH%2BZevywl%2FMM8dJtn7LdJ%2BKvgry9ccrOJ69KVw9E9GS5s2bAh2bNmxV2bNmxV2bNmxVi3miFU1LSbxvsStJYzH%2FJnSi%2F8ADYpoEzLcxq1T68FGr%2FvyE8GrgjzdC0mhXEsY%2Fe2pS5i%2F1omDf8RwttJRHdrcDaNbhZVI6endIG%2F4mcnHeJCDzDL82bNkEuzZs2KuzZs2KuzZs2KurkZ843Zhs4bVTQzvVqfyrvg3zHNPb2UMsLtGBPGJSpIqjEqRUb9ch%2BvSSvp0JlcvJCLyMuxJb4JNvi%2F1SuEBVvkaX9L%2BZbm8Sv1fTbf0Y6%2F78lPxH%2FgFzpeRvyPbWcXlyyubWBIXuoxJOUG7uKjk5%2FaOSSoxPNXZs2bArs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FU7%2FmzZsVQ2osyWM7o3FlQkMOxGPtZhPBHKCDyUE08e%2BM1Bedjcr4xPT%2FgThV5cvBJbpGergEfMDcYa2PkqfZs2bArs2bNirs2bNirs2bNirshfnRGtb7T9TX7LcoJD2qDzSv3vk0wl81WDajodzDGKzRj1oR35R%2FFT6RthHNXaVcrKsUtftDi304dZz7yrqPrQCIncdMnsEnqRK%2Fcjf54yVjP5gwtJ5ckcD%2B5mik%2BivH%2FAI3wD5RnEtpwrWgw983RGby1qiqKlYGkA%2F4x%2FvP%2BNchnke5BIUGoPQ%2FPEJHJ6XG3JFbxAOPxOA1iX7sUwIdmzZsVdmzZsVdmzZsVUbqBbq2mtm%2BzMjRn5MKZDLP4rC2UVq9qYj7SWshWn%2BtxOTnIVG4ttWvdNaiiK7FxGDtWG6Ti%2FwDwMuShzRLky%2B1lE9vFMP8AdiK33gYscKtBmDWhtq%2FHbOyMp68SeSH5UOGpyJ5pYde3moWPmW5KzH0pIo2WNt0A3Wv0ts2D73zJ6FgzxqqXpKpHG9eDMx7EYXed45VeC4gPCdYyqua0I5q5VgOv2cAW8sWo2QMqhwwoyHcVyQFhVOLzvrNrdf6fFHLFX4kVeBH%2Br1%2F4bJlp%2Bt2GqWrXFnICyKWeJtnUgV3XOP67qFjaFLHUrprecy%2BlZajxPDmN1jn8Dv8Aa%2By%2BIaXrclrdtZ34NrfR1USofgeo2K06c%2F8AgcBCXr%2FlvXRrdnzk4rcoSJFXYfMbnDzOV%2BTr82eqAOQIpaBq7AV2r%2BOdTriRSEp8z8RoN9I5AWJPV5HYD0yHr%2BGQg3Ntq1lcLazx3CiZviiYOKzQo9Kjb7YzoWqRevpt5AOskEij5lCOmc60%2BWCK0j9ONYo5IYp%2BEahQWBeNjRafEcMVTvTb%2B80fyHZ3FugE9vSORJBUqPVZW%2BEHw3yVaXeC%2FsobulGkX41HQMNmH%2FBZzC%2B1iTTbadZUkjtJjzkQqSKqNm5fsdMPfyr1%2FRdT8vra2E5N5C8kl3bSMTKpkctz%2BL7SP9peOA7fFkIkgkCwOfkz7NlA1y8DF2bNmxV2bEJLy1injtpJVWeavpREjk3Hc8V64virs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Xv%2BbNmxVplDqUbcMKH5HIPokjWsstqx%2BK2lZPf4Wpk5yF6nF9R8xswHGO8QSj%2FAFh8D%2Fqrkoc6VmSMHUOOjAEfTjsAaZMXhMRPxRnYf5J6YPyJV2bNmxV2bNmxVQuzOtu729PVUclBFa07U98DafqsF6i9EkI6ePywwyF6vG2i6oJRUWl6xZCP2JOrr%2FsvtLhG6s0yiK4X6Zfi4QI7Vb9lv5h%2FXDHrgV5c8B0LzLc2Q%2BGF29WDw4SfF%2Fwp%2BHOg6ZMHi4j2YfTkZ%2FMGwpFaazGDytm9GYj%2FAH25%2BEn%2FAFX%2FAOJ4N8uXwliicnps305LmFZDewrc2dxbt0lieNvkylc45%2BX10UCQzHjLATE4P%2BQeNc6L55e5i0J57WVonikRmZDSq7jf2yB2Op%2FVYor2%2FwBNjktpAGjv7ZvU%2BInoy8Vao%2Fa44xCQ9as25RVBqKnfBGRby9rBEsljcIY0aQ%2Bg5FCCQD6bj9lslGAikN5s2bArs2bGyOI0aRuiAsfoFcVS%2B%2F1q2sJltyrSytuyp%2ByDsC3zwxBqAfHfI%2Fodmt2z6pcjnJK5dAexPT%2FgRkhxV2c782mSy82WUgNIdUhNs4PTmlXQ%2FwDBDOiZAvzLb6nHpOrlFkjs7lWdG9yvxVG%2FwiuGJ3Up3YTJFr7op%2BC8t1ljHjxodv8AYtkiyHbxx6XfKx%2FcXBilJ3%2BAsVUV8FRlyYA4Z80DkkPmq3EtlHJSpR%2BJPgHBH66ZBtIufqt9Np8pALHnEpO5p1oM6Xq0P1jTriPoePIfNdxnLtZtrGZluBcG3vF%2BFJYuJfx40IIxHJKzzb5et9ZtZYp1LwygcgPtKy%2FZkT%2FKWuRKKCOC6tNH1CblcWiILDUWHH6wg6wyDejx9Fw4sfOMjEBY5biH1HgLy8VYulOfJV%2By38q4ndH9LlL219K4iilHrWzLxlhI6SgE1%2F2SnFKo0Czxy28zMqcSzspIYBPj2I%2F1cd%2FytnVZdNQ2D1I%2BESMoPw%2FzMftdMG20TSQyyblmjenzoc4TY6ld6ddyKwMUsbFZoHqNwd1KnGXRXs9n5%2Fv7lg98GlWhMjwk1A%2Fm4k%2FF7jDSwSPULTTJI3PGBphGNwG4OHVW%2BgnONX%2BsWFpDFPaSSJcTESG3TcRlf2uRK%2Fazq%2BkR3aeT7e%2BjnX6yoW8ibht%2B9i9Tg%2B%2FQ98QVZHqstutowuSPSdSpV91IPVWzif1i98t%2BZ7m40FjbSWUrNCqEmkex4EH7acT9lv2c6lonmbTvMUTWdwgiumWktrLQhge6H9of6uRLzd5ZurDVP8Q2KetYFUW7jXeSKi%2Bm0hH7UZH7X7OCY4g2YM0sMrjvexB5SHcXsnkPz3Y%2BcdPqKQ6lAB9bta%2F8lI69Y2%2F4XJeDXPJlvPe6JqMeq6NMYLuE842To6ntToyuv2k%2Faz0J5E8%2B2HnGyI2t9VgA%2Bt2ZP0epH%2FNEf%2BEyESeUuff3tmbFAx8bB9H8Uf4sZ8%2F6P82TMMLNb1iDRrQ3EpBkkPC3j7s5%2FwCNV%2B0%2BGVc4n5m8yfpnzJcsr%2F6HYsLe232PBv3j0%2Fy3%2BH%2FY5JxkLourX175%2Ftb28maSZrloqsdlQ1Tgo%2FZUDO755%2B8uxlvPcMI6i6LAe2zZ6BwlS7NmzYFdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVf%2FW7%2FmzZsVdkb83W5%2BrW1%2Bg%2BK1kAc%2F5D%2FCf%2BG45JMC6jare2FxaEf3qMo%2BdPh%2F4bCNiqV6VOOcTV%2BGReB37%2FaX9WHoyFaJMz23BqiWE7juCh%2FsyaRsHRXHRgCPpwy52gLs2bNkUuzZs2Kuwu1rS49W06Wzb4XI5Qv8Ayuu6nDHMemKvONE1KWGVrG7rHPCxRgeqsppk7sb0XC8W2lUbjxHiMhnnnTHtLmPXrZfgakd1TsR9iQ%2FP7LYtomq%2FWI0Iakybof4H55LmFZdqNlFqNjcWMwqk6FD8z9k%2FQc515XuZbW4l0%2B5%2BGWFzE6n%2BZTTOlW063EQkXY9GXwPhnO%2FNsS6T5qtbofBHqaniexmi%2B2v%2BsU4v%2FlfFgHcrPTFbanZNb3caywyApLE3Qj3zjutwW%2FljzBc6Pp6fV9JHpsLNSSgR1HIorV3Vvizq2jXQk%2BAndlBA9xnNvzRiWPzJBJWnr2gJP%2FGNyv8AHAdikJ3YGf0o5pZDIboSD1GJJ9aAgh6%2F5aUzoFnN9YtYZ6gmRFY06VI3zlXk%2FVI5bi2hnlBgdBuxFFahhfr0rSNsnHlXU4JI5NJaSt1avIQm%2B8RaquD0I%2BLjkpbgIZJmzZsirsDagC1jcqvUxOB%2FwJwTjXUMrK32WBB%2BWKpfofE6Xb8f5d%2FnhjkMPmvR%2FKlrJBqkxBSVkjC0PIDpTfI15s%2FMNbu3jbR5plsZVp69swRi9N0eSjMnH%2BRcVpm669cWWtXGnatwjgKma2uPsj0x%2FNXw%2FayOfmLr%2BhX3l%2BPTYrkXM%2BpGtm1uPUUceX7yRx8KLtx%2F1s5xoN%2FefpVr6C8muVVfUuLO8kMrEIeTem7faRk5Iy5FdTuZ9B169trGZvqkc5eFD8SmJzzUcTtsrceWHzTT3fRJv0p5UZvtOYYrgCu%2FJV4P%2FwANHnPrj83vM2lX9zpWoBJYInaJ540pOi1%2BGRQDxf4cln5Z3qT2stjWrK0iexEgE60%2F2XLOUfmHYNZeZbhWP94Ayn%2FV%2BD%2FjVclLlbEdQn955q1wTiU3huLadeQCsfSljO9VNev%2FAA0bYHub1Z7V5yWkhHxpcVHJNwGiuP8AKStVk%2FbyGafqLQxyafO5S2lPJWUAmGQ%2F7uiB8f8Ad0X%2B7F%2Fy8Ctd6jpl3Lb3v%2BkQTpxniqTDcQn7LoR%2FwUb%2FALDZCyyekWl9ZyaFLPelZGN2tqDEtZJHenEs67ckpVXwq1bU7G1iKWvqtcCR4bkkhFYx%2FCHXhvvX48C%2BU7H1SbK3k9Wya5hv4HchSBF8FxBL2WeOJ1k%2F4s9P4cu%2F0j%2Fc1FphmFxPLeOhZBxAiL8jt40%2Fa5YegV6PprvLpcE8sfpTNbh3QVoGK12zluoQ2PnZih42fmWIVt5z8Md4q9I5P5J17Z2A8YrWVl%2BERoaDwoNvupnLtb02LzREdR0hBba7bVe4tEPFZwpr6s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xKXcslu7tXb1%2BSBq%2FwCSzZK9c06xuNUutStkBls5IFkAIAMoHqUUfzNRkbCPW5Xs70rZcVtL0%2BtCoAFVc1oK%2FwArni2RIShdD0rU9Z0g2UNW1DR5JLG%2BirRlQuXhmp1ZP72M%2FwCph75g0K2sra21G8ch5baGJUpt6yARuvL6OWEQk1eJrq9s55YLxBzuGhJEjr3LKvxSqv7WISanq2oQRXGryvd2MtVhuSQ8aNQch8OyNjsqElhK1hbcr%2Fcv3K%2FyV%2FycRSQBmUiifsfQM6FpfljSbrR0mCy3EjDlDIzN9sGnphU%2FZ%2FlbIrqnl%2F6jM3Cb1VRqOoU8078XoOHPISIiQCd5ckgE3tyS4StK6xSy%2FDJ%2B7HqseO%2FYVw0W2thatp10he2b7YH21cfZljP86f8AD%2FYxO4tbO4so4I7ZUvG5Lpl3PssprUws392JD%2Fut%2FwCbAOh6sLuU6VqYMF4hKRu2x5DrFID0YY7rsh4tMn06%2FkspjzjniaS1nQfDIE%2BJWXwdafEv7Od0ugnmL8tmYipWEOB1oGWp%2FwCH5Zy4hoT9WuU5BTzj7FHp%2FeIe3%2BX%2FADrnR%2FysvRfaHeaJIwZ4RJGo8QDzQ%2F8AAy5OPVBfPNxbpMpifYqaBu4IwFYWlx9fEIJU7lmH7S%2F83ZJ9e0x7K9unRg8azMkoHWJySVR%2F9YH4W%2Bzj%2FKtvFdaxBDLQKzAVO243G%2F8ArYPJUXb2NvDZtdyWxe3B4meCQ%2BtG37Jkjb9lafaXHRXl9q2r6etnWJ7Yxx28h%2B1UNyMjt%2FlH4myX6lp1poPm57CIFLG8jikCsKisqqXWncc2%2BzhLZW0Om35hCuLiCeSgIHFY67KT9rl4YaV63IwMVSakg1pt27eGRuzvrTWILdYbnlcIWXSdQc8W5pXlp91%2FLIP91M%2F94mG9tcfW3AQ14xgsPH4c4Zp%2Btz6HqN2rJ61nNIy3loTTkA54yIf91zR%2FailyRNUinpV0iXqyyxw%2BjdW5Md%2FaN1iPdqf74f8A5Jtka1ZZ4LWYxsySKpaCRT8QI%2BIxkj2Hw5KLe6%2FTsUF%2Fp1wsmrRRk2l0QAL6Fft290g%2Fu7uP7Lo395hFquqaL9XZmmWCRwySWTgs8MgG6Oo%2FY5fZbAUhC%2BZ9JsfMl1SKYW%2BqyQRT2DMf3UvJeTwt4M5%2BJchKyrOr6D5gQwTQEpFK%2FwDeQv8Ayn%2BZDk%2B1Gyj1ew0SaC4gS5ntmCtX0ELQtQAM%2FEcv5Fwv1bQxr%2Bnhr4oms2ymP6xuCStSIbof6v8AdzYOaGAQ%2BXdTm1NdLjj5SN8QkG6FOvqBu%2BTjTrS2sbZLCMcVUmkpFGLn7Rf%2FAFv%2BFxTTme102DTuILIwZpKksW%2BzxWtW41%2FZyU2XlW41HhcahytOQJZVHKaXw%2Fd%2F7rY%2FzviAqQ21ldXtytrDG0k524qKmnj8sO736roNmNIltfVv7hFeaMnkUqTwpxNA2S2MaT5etS9w6WdtEvx1b42A7Symh%2F2C5zTzb%2BZun3swOjacGVKwrqMgoajeiJSr%2FOTDVdVZPYa3pOj%2BW7u31uKKzuZGP1dePP1Iz1UovxtJ%2FlYU%2Fl%2F5hOtyS%2BWrlis1Gm0pyfiR4%2Fi9Kv7SumcrvNYnu5DcXH7yToamrfSf6YL8ratLZ%2BZtJvoT6bwXMbEjuCwVh8uJauPFuFe%2Bx%2BYJ4NMawQiOFzyZOlDX4h%2FwQyQeVtAn1BY9R1QN9WU1toG%2Fa3qGYeGE3lnRLPVfM19LdAyWkTtcW8a7xOGaq1kGz7k%2FAM6moAACigA2AxJ7lojn72wANgKAbDLzZsirs2bNirs2bNirs2bNirs2bNir%2F9Hv%2BbNmxV2bNmxV2Qzz3p3P6rqKbFKwyt%2Fkn4lJPseWTPOVfnX5gmstNtdBtnMbajykuXHX0YyPh%2F2b%2FwDEcbrfm24MRzZI447GR59w6pMfNyWl7EdD1KM3Cp6dwoKldj%2B1zHE%2FRko0rz1rUtz9SvLe2lm2Hp8jC7BhWqV5xvUb%2FDnn01jPEin8pHgckemXmsTaHcxANw05o57O7IIKxliJYll%2FaRT%2B84%2FsNkIZhIkSjRDl6zs%2FwIjJCXFHkb5gp3%2Ba2r%2BbdPuEvYLVbLRpiFL27c2EvWkj0%2Fd8v2VpkGsfN2p3Kra3V2XicgEsQeQJ3qSNs7d%2BkdO1rSbKw1LhN%2BlbRXVJKFZyq8ZV3%2F3YGHLOEecvKFx5TvTLDym0idv3EvdG%2FwB9yf5a%2Fst%2B3lpHUOvsua4iNwbWCruHK%2FB0qN9j0zoy%2BarW48r2Oq3l1Le2sSizuGkqk6zgUVXMda8F%2FwCDTOO2M01rIs0XCRQ4kHqCqGnZl74NgkTlMqSOIZpPVNrXjGG8Qvfj2wXzSyqz1eO%2FtNSjQM8sVubhFbbkIpPiI%2BUR5Yca3q17IdPmtZ2js7yztriONNhyAKSciPtMJUfIZaXDWL%2Bra0jcq0ZYAV4yAq6mv8ynJf5Yex1PRjpUsfO%2F0pnuLJWNPUgkNZ4l%2Fm9Nh6vH%2BVpMRa2uvBcXej2Gp2rSC5tJJbOZkqW4v%2B%2FgY%2Bx%2FeJhtBB5sOi313boLa9ihMlo3EB5ClGkULy%2B16XJk4rhlZarBFAbZljtrS5Tg%2FoIF4fyOT1JjbC1L%2BbSbowyMwu4WrzJryX9h1PQpxw%2FFWFXNut9PB6srS6frlqI4JZHJ%2Br30bCsbOf5phx3%2FAN1T%2FwCRgPQbtreVrEFrW8gfnDU0dJUPF09unHD%2FAFeygjjvbi2haTQbpxcXlpHvLp9x9n6xClfjtjXi1P2P3b%2FGseE99ol9qtyjIKamYlktb6Mn0L5QKJ8Zp6d3x%2BH4vt8OD%2FvciTXPZaZ%2Bkdp5%2Bgt19Yad5p0%2Fe0vU2Y8T0NPiaM%2FtJ%2FuvOj6lcGysFaRlYxJWUjfkUXk3z5MM5p%2BV2l3U2pPdalFHK1sOLyqQxSZaFOdDWOT7W%2F7eTTzK8UdlcxREhXBTf%2BdzWg%2B7JxNji70HnTz%2B51GXyrrFxaapD69nfcRqSftqxHL1oj%2FOjPjtQ0GNYCfrCXWi3QMtlelhyjkYbFfdvsyx4M87Wy6zqemTq4X9KwQnmegkK%2Bmf%2BSi5G9M1PVfLUt3od3CJIGDEQS7iKUD4Zov8%2FjyErqrruPNkK58%2FJN7Sx0%2B0sDe3k0k9xA6JBJACGqwPHiKp8S8fts2F0mrDS3nubPThH6ZLa5YcQsnBvs3kSsCnJeXJuK%2FB%2FwAYmwQ%2FrXdjEsQRizhvjKCrUp8If4uW%2FwCyuK3Fs893p1nezfVdeDCOxmHFi8ZH%2B89wSeBjP2YuX%2BVFiYggA70Pmt9QzfyjdxXeiPeaY3rNYt9ZjdKUkgP2gyj7L8ftL%2FPgTz2tuLdJIT6cN1JFcxzJ2U7Sb%2Fs%2Fa5BsKfLEMvlPXby2sJI40uF%2F0izVuUcb05n0z3gkTlw%2F3237vHeddXN5pEMdnbmOys4BFcy0qDcF6GJa%2FwDFacmyX8Pu2R1QOi6Yupabd2F78dj6xjLVFUlpySaHwkUf7F0%2BDIrrvl6dr42N0eOtRIHs7ldkv4B9ijf8tKgfB%2FP%2FAHX28mPluyb0Vs7OdTL6SSReoK8%2FTZqN%2FrqOPL%2FJwTqdhFr9m1lqUhjnhcm2uv8AdltN%2FMKf7pb9tP8AZrjVhWHaHrEWqxjTb9gt9GKQytsXptxNf2sl35d3J0jznJbCojuQlR26cT%2Btc55qthdyXcyyJ9X8wWfx3ESbC6UbrcwfzS8fjfj%2FAHyfvPt88N%2FKuq3F3q1hqBIEyc4pWZuCkoAwck9MA50VPJV%2FMq2k0TznfCJQUmPJom%2BzJG%2FxcW9t%2FwDY4Q6cILa6ZY2eKRwslv6goaDfjy%2FaK4f%2FAJleadM80a8t1pcZ9GCJYmuG2MrD7TAfsqv2V%2Fmwr0WyuNXUw%2FVxci1%2BKLt%2Fw23wrg6qGVanr1vrK2t3csIry1aESBjxJEYYOQff4cjvm3zLbpZXLWTGC5vr%2FwCswRjfjBGoC8yfi%2BIjCPX2vNMu%2FqZDRNGKSAgUqxqgqKruF%2BH4sjsyPPIZZSXJ7knfG1e9%2Flxrdt5ksbqdSFu7eMLcW5O4%2BE0cV6xvnF75uVzcb14yyBW7%2FaO2KeS9RutC8yWd7DMYLfn6d3L%2Bx6D7SLJ7YhdkNd3UkRDRSXErxMDUFGclT9IwndCtpWrz6ZN8MskcDsGdojxkjcfZmip%2B2v8AL%2B3iWoySfXbiHUmFy14frKXqH4nL14zK%2FVuX7cbYEeJWDPQVpU0Pj0x6yqLL0pJUW4tXE1o5O9SaSRbeP28Cob1Z1T6vPKzxjeNSSQK9aV%2BznXLfUrdtDt9T1U%2BjeRxpa3iMvF5V41jcg%2Ftrx%2BLOd6VbaTqJlS7lMl5Iri3hHwRiQj920snhzODppWsii6zcGeSZg3po3NSy%2FD%2Fen4K9V542r0LyheaXcm5uaCCWNhxkl%2FvClOqcvs4rrn5g2enI9tpKi4uqlWck0rSvxP8Atf7HITazpc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2FLhpr3nLTKJ9UT19TB4zNHtCe3Jj3b2XIssp1Y8bUfFOQsix7SCSlAXpTmj4av5OnsdM%2BuzB3Zm9OWaNGD2%2FMgRTolP3sXP4Zv92fyYi6oITDVrG28x6NBeBvqWoWS1ivSeIikU8jFI%2BzLA6%2FGn%2B%2B3yFaq1pcXix28ZUGi3U2wadx%2FuziAEWv8Aq%2FH9vDLV7TzXeWrqbaWO4VhHeNHtFdCP7EhX5D4v9%2BfbwpC3liGgvIoVdSqt6pLPGr0pTj%2Bz8Xw4CUkEGil7RwRu9ZzwjPx8UZiKePShyb%2BRfMdhHM2kLEV%2BsDlDLQFncUCxcRX7WEF1DCs63zCs6r6c1Nkencr7rgXSpFsb5zCForepC9PiUEfZr4DADRVD%2BddUkPmPU4lUgVNtNG4qDw2Bof2kP2GyK1LECpY%2BAqTnUFhsta1Ce%2B1G3inuZCrySsgqwqFNRkwu9R8m%2BWIwscEHrharDBGjSH5tT4f9kcIoop4da6Vqt2GW0tbiQHbikbkH57UwHNFLbSvb3CNFLExSSJxxKsuzKwPQjOu3%2Fmq%2B1mFo1C2NmFMjhTQLGu%2FKRtumQfU%2FMWh3uoTXx0r1pJePKSWSnJlVU5lQNufHnhQxmOYxklSPiFCDvUZQKUIpUn7Jr0%2B7D8eYrBP7nRbUf61W%2FhmPmtkBFvptnEezCMkj78CpRZOY5w%2FBmWhBCjseuSyyn0pIpIr2CSr2gtbYTQt6aylufPp8PBWbCZPNurROskYgVkYOv7tSAVNRtg2780%2BYPNd5CdWuRJHEWkWONFjRaih%2BFAPljsqLeRrVh%2BjQt3GBRoXBBKAfFwag%2BLJ15B17yfealE2taTHcXMG63Eq%2FvbYL%2FvyH%2B6eFK%2F3iJyT9vAXkPygPNEuoxx3KQ3VrAHtYWP8AeOxpv%2FxWqijMv2WZMLdS8vBLx4pg9jqVqTFJIvwup6fvP5lP%2FDLillv5i%2BStPtL867pEEcem6hxkivLWjIk%2FevHb05ftZF9Okd5Et5mayvoWEtrdRmnCUfYmhYfzftp%2B3k3%2FAC68zLfx%2FwCFdWt1eElrbUoW%2BwGIrDPGv7CyU%2BLj%2B18eIeavKM3lq7WqfWNOkYizuXFeNesE9P8AiX7WNbqCncfm2f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V1PpOsrBduRLFcPb3JY9VditW%2F2XxZ0%2B91O2spIoJWL3E54wW0Y5SOf9UdF%2Fmdvhzm%2Fm2w%2BoeapJlBVdRjWdCDsZE2cfeuHdvfQW0BngZptVvEH1u%2FlG6gj%2B5hH7Kr0xHc0pD%2BYg8wa1NDFZWjSWtsrCRoiGJcn46b1YdF2yFWemzxsW1CN4Ej%2FZlUofubOs2WpxpNGl2oMP2eSbEe5yTXGkadqFpJaT26T2860YEVBB6EHx8MeCzdpunlEtpHYQ38GqRrFNaPA8EgJcFa%2FGqhadao2XBGlmbe2uCzevbGeRo2PcNJx%2F2S%2FDht51s3sLpYLoH6ncIq21wRU1UceLt9Hxf8Hhj5f8pXerWc%2Bq2VrHqE1oqQWdvNLwUoijmJB%2FO9W4%2Fs8cjVH3LezEvM2mXWqyabNozB7SS1WJ5SwBrHWnLv8A3ZUbfy4onlazmtrKC%2BJlNoHFFNFbmQaHvtTJ9rPlzU7GOO6vrRbeNioQQMrRxmn938IXj4YE0fQLnXBdQ2062l1CP3SSry9Xav7og0%2F4LDsikps7C3s1WK2iWJB%2Bygpg5lNOX0YAVr7TL0xXsxcxsVlhktwpFPtLVWwbf%2Ban0e8tp7LTYrmyILlpyT6hoRw2%2Fu%2FTbdlw3taoK4v7a1dY2dW5GjQ1qVHj%2FwA24Vah5a03VlNxZEQTtvyX7LH%2FAClyfjyfo3nrTrbV9PRNI1i6gM8qRENC8gb05OUI%2BNR6nR1%2F4HIRqOj655Vu%2FQ1SBogT%2B7mU1ikA7pJ0%2FwBi3xZGwdizhOeOXFCRBSPSZNX8maml1MhNsfgldPijdD1H%2BS37S8s6ZLrEEZt2uEe1W6VWtLsg%2BlKGHIGOReS%2F6wOR9dWtRp11dSQ%2FWHt4Wk%2Br93IGyU%2Fysk%2Fk%2FW5INATT9Z0eAWczGT6gr%2BoIlfcgBxsf2vT%2FAGMYxMSeE2D07m7PqBmjEzjWSO3EOUo%2BY72M%2BYfLcd3FJeQRxyo7EzQU792GQ60bU9Hkf9HTAwts1jdVeNl%2FyX%2B2n%2FEc7ZL5XstVSS58p6kYZqVbTrysif6tWPrRr%2FspVzmuvaDq2jzsup2JtA5NCfjtmNf91Tjb%2FYyccJ8tmgJPqV4JJLJpI3sYLqJ2uY%2FtBgP91q6jpIy8Vw0sNNn8tG11m8KWNnqTrAums5YhTvyct%2B0R8fw%2FYb%2FWwLdRpfaVEkkPO50r1HhjJALRSg9HpX92%2FwCzgSW4TV9Hga5uppdVspFt7a0FOMNshHJm3VuZY8fV%2B0zfBlZHq3BNigOnm52LIfDHCYwMCJmVXI8IqMYnzI4f85l%2BsRQc7eSKVRPHKts4ruUkPAcv9R%2FiwbZaY1p5gtrHUoipjnjWZOo4lhRv8pGwcPL9pcROZo2S6ZkaXgyqoaFVk4hn%2BJ9uPqNxwVrmsWupvYzalF9S1K1lTi6GscsYYMpV%2FFWUNx%2FlwYoSjd8jybO0suLMcUsdmUQROxRrnH75PQtd8vaT5itBZapAJI0YPE6njJGw%2FajcfZzg%2FwCZWh3GhW%2Fr2wH1vSZ0DXlPia1m%2FuZuK7MV%2FuLj%2BbPQ1pdR3ltHcxGqyCtOtD3H0HIF%2BZFnb3k8EMqhxPBJHOh6MnIUDfSdssDq3zfqWmR6lFJqenRCO6iHK%2Fsk3FD0ng%2FmjfC3SNVudJuUvrKQJdQOrxc1DoafaSRGqrK%2FRlyU32i3XlnU4RHOYrF2Isr1hy9Jm%2F495%2F8AimT%2FACsKte0Zp%2FW1Kxg9KaL%2FAI6Nipr6bH%2Fd0X88En2lfFX0%2FwDlz5x0fzbpAlsIYrO%2BgAF%2FYxBVCOR%2FeIBTlE%2F7Lf7HJpniLyz5m1TyrqVtq2ly8ZYzuvVWX9qOQftI37WeufJnnHTfOekJqViwSZaLd2pNXhk7qf8AJP7D%2FtYFZJmzZsVdmzZsVaOct%2FNj8sx5ntJNb0NfT1uBayxrt9ajUfY%2F4zqP7tv2vsZ1PKOKvhz0CsbwMzqSSHPRgw2%2BL3%2FmwrlheB%2BD9exHQjxGeqfPH5Oad5lupdW0icabqU3xTqV5QTN%2FOyr8SOf2nX%2FgM59H%2BQfmu5nWC9ns4rbl8U6OzMB%2FkpwGKr%2Fyk%2FOBtOMPlnzTMWsyRHY6g5qYq9I5j3i%2Flf8A3XnoxWV1VkIZWAKsNwQehGc68sfkv5Q8vBZriE6rdrQ%2BpdAemCO6wj4f%2BD550VVCqFUUVRQAbAAYq3mzZsVdmzZsVf%2FV7%2FmzZsVdmzZsVdmzZsVdiNzNDbwSTXLBIUUmRj0A98WwNfPaJbSm%2BKi2pSUv9mh2pirAPON5pMWiStoiPJfM1bVI4yy1G8jDkCnwrhDrD6jFb%2BWbC7Wt36Ecl%2BCP%2BKiZHbtyJajf5WDvP9xZRaNCfKtxKb4zj04IOR403JKkfAOfH%2FWws84ajNd3EEklFuSOUtK%2FDRVXiKduQOFIeeatpk0F5PeaUj%2BlATLIYwSYhXd%2Fh%2ByleuLP9U12ykmiWO2vrWOW4n3PxgcAFXmaty3cf77%2Bx9jO1%2Flvo0EejT388SvJqDMjFxXlEvw8TX9ls5h%2BY%2FkSTyne%2FpHTVY6LdsVUj%2FdDt1hf%2Fitv91t%2FsMgRW4dxo9X4vDiySqcfon%2FO%2FoyYJsQGHfJL5FsrXUdZk0m6uTbR3UTvHQAgzRjkONSODla5GgcX0%2FUJNL1S0v41DPFINm8G%2BE%2Frym%2BHMD0k52txeLppjqPUPfF6l5X8xWlm995evZlguLSdkjR9gTWjrXovP4XTEPM6wwzKSKCT4tuoIO%2B3vke80xXU2tW13ZQ%2Bo15bq8npJ8UlELVp%2B3sMBWOsXOtWy2iEyXNuCyIw5Myf8VsaseFP7tvizL4tq%2BTzNUfvT%2BOU6npky9ZrciVAO5Xw%2Ba8sis01rp%2FmC01O5YrSWJ4kXcyFiB9nsK%2Ft5fljzLXzMlg0bRQujQESbVlDcl5IenL4kyeebPIp8y6j5e1DSEjX0XWO4QsqKYk%2FfRgV%2Fb5gx8cHMe5lGUom4mjuPnzSW%2F1OfVL6R7sJW2keKFUGygGhIJ3PKmNVy%2FTAk1pdWc9zBdrwuElcTIezA%2FEMj%2FmjXbvQtaW3tEBgCJM6PuCHFQExtizSKI1DHJv5VuxKrWMp%2BwC8JPh%2B0v0ZCNLvrfUrGG9tjWOVQfkf2lP%2BqcPdHme3vIZV24sKn2Ox%2FDJBSyzzBplrqWnSQSxLI0P76EsoIDqO3%2BsMgmlaxceUdRXU7ZS9jJRb62XoUP7QH80f2k%2F4HOgXdyVYgHp1%2BWQW8g4TzQyoQpJIVh1VuhGJCh7FG9hrempKhW4sryMMp6hlYV%2B%2FOWa%2FbXfk%2FU0ZJOEL1ayu2%2By1P91udv3if8OuCPJ%2FmhPL1xaaJetx0y4rFFMx2imJJSvhHLXj%2Fr4N%2FO9G%2FwAJ28o%2FYvY69%2BqOMgdlYzqPmWy8xr615aouoxAA3dk4dJB0%2FfRGjofBl54U%2BnCySRNSa1l%2B2vQq3861%2By65GPKcztqxjY7NEw4jYbU32zoNppF1qfrw2JX6yierHExoJivWIf5fH7DYYnZaY3pN9N5N1n9JJEbuIwyRoisY1kDbpVu3F%2FidM7xpl3Y%2BadFt7m5tle3vIUkaCYBx8Qowof5WB%2BPONG0jvLY28qlRUgqwoyOOu37LpiXl3XbjyZqk7XglmtZIfTEKNQGh5REFvsxr8XLjgIrdWQedvy7GiQPrfl4SNaxVe5s1q7Rp3ki%2FaaNf20%2B1kT07WGCqwcMjdJFNQc9C2N9BqNvHc29WiljSVGI2KyCopkFv%2FwAotHu9cOq2d1JYW0x53dhAo4O53JQt8MYf9ocMFyB23ZwGOQIkeCQGxqwfIsatNQSQrIrmOUbrIhoQfEEb5LLHzPP6X1TV4RqFo4ozFVL0%2FwApD8EmFms%2FlxeWBNxoEpuIhubSQj1B%2FqPsHwo0%2B4ltUmW7Ro5ojRo3BVhT2OWCi1t%2BbPJ1pFCfMXlJgtl%2Fx92VCyRHuwjb4kX%2Bdf2ciOlG2huhcX2n8JI2BE8FHHzMTb%2F8TVc6FpWutaySPblJEmHGeCQVVwP1ZGtcsIbe5N3p0Ui2MlWaM7mB%2FwBpQ4%2B1F%2FLkTGulhnDIYnYprf6tYaxaxxCDlxIaG7iko8Z7kGtWr%2B3ywxsdGl1WwitzGbkgkRzugDGnRm34R0%2FZbIJBZwxv9YhAVx8Qp0JPiBnafJl1eXekLNdyrKOXGNgADQD4g3Gg%2BE7Y8WyTLfiHNJbbQvNHle%2Fe50eQX%2BnXAD3Vg53EoWnKImhQmn7Pwv8AyYRX9xql1dmXWOS3XHiqMnp0QEkKq%2BA5fazrQwHqOmWmqQGC7j5D9lxsynxVsFsLeO39hb39tJbXMYlhlHGSNuhB%2FUffOZXy3%2Fl7UV05n5MgrpN1LTjLCT8VncEj%2FYf5Odt1nQbzR3JcerasfgnA2%2BT%2FAMrYB%2F5V3Y%2BdtAvhefubrn%2FuNux1jkQUYkD7Ubnir%2F6uEq8D1rTFk9XUdNgaHix%2Bu2XVoHPcD%2FfbfstnQfyAeb%2FFktC%2FptaSF1VgFNGTiXFfiA%2BLj%2FlZC9WuNd8p6kNM1e04anYsY2mY7TW%2FZG2pKjfsS4K003mkCHzl5WmDLazercWoB9WCvX1FB%2FeQt9lv8nIofYNRl5FPI3njTfO2li7taRXkQUXlp3Rj0Zf5on%2FYbJXirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FW7%2FmzZsVdmzZsVdmzZsVdgHVY9PmtHi1JlW3cgEuQBUbr1wdgPUdNttTtzb3IJWoZSOoYdxirzHztP%2Bi20aTyvdm6uDcJSCMJIPTVhRWKj7Bbbi2B9b8keZrnV3FvberbsQsVwHUKFJ6tU8hSvhk%2B%2FwAPGy1GwvLOkqK5ju0cIP3YQ%2BnItAPiif8A4nkkphKQaQOk6eml6ba6fGQVt4whPif2j%2FwWO1LTbPVrGfTr%2BITWtyhSWMjqD%2FEfs4MzEVwIsg2Ni%2BVPOHlm58p65NpU1XhP72znP%2B7IWPwn%2FXX7En%2BVgW28s63f2kWr29m76Ys6xyXQpxUggNUfa4iv2uOen9c8t6J5it0t9as0uo4zyjLVDKf8l1oy5EL7TriGW30Lytp7Q6Dbs0d7xI4Oz%2FFWPlycmNvib%2BfKziufETs7WXahOn8Ph9dVIn6a7%2FewDzPd3ukNplzYtxtEhW2adVBKzRktTkalOdf%2BBw60bydZ%2BaNR%2FwARaPq0VjOIw509bcLIkw%2B16yh%2FjRm%2F3an28de6dLYTXGk6xDztpx8aHoyn7Lqfb9nI3YX%2BreQ9ThS3pcWhcvazMBWSE%2FbgaQ%2FF8P8AJlrrDvunvmryB9buFvzAtnrkQD84z%2B6mKHkGRtu%2F82HWnO%2BoadLpU5aC4ZeUL9Gil%2B0jKR0aOYZOLO80jzho0d3Zv6kMn2WFPUhlGxVh%2By6H7WQWaO80rV1hvwBMjcfUAoskTbLIP%2BNsIr5oSu10tfOt7Ikt4th5ijQC6hkSsdz6fwfWIiCCr7UmTj%2Fl5JG%2FKTSdTjg%2FxDILh4UCUgHD7P8Axafj45GPMdkYtRkvbWf6jewEXNhcr9ppT9pEVatJWnxJx%2BznRPIfmz%2FFujfW5Y%2FSvLZ%2Fq94gBCmQCvNQfiVX%2B1xb7OA2NleaX%2Fkr%2FA19Jb2rO%2BlXbc7UvuFbuvL%2Bb%2FiWC7M7HOuarpdrq9jLY3i8o5Bse6t2df8AKXOP6jbaj5dvpLK5USBd0fcB07Ov8cMT3qkP5l6trkWp2kNi8sVr6CShoyVDyH7RJHXj8OQpfNfmCN1%2BsXcsnBeCrOfUAUdFHP4uP052ny%2Fq2g6veR6T5hgX94Almsp%2Fdsw%2F3W%2F%2BU37GSHUfyp8n6hUpavZse8DkD%2FgH5p%2BGCXNeTwM%2BbzeWxtr%2B3SVHFGMZKMP8oBqr%2FwANh9qv5gpr3kVfLV9zk1O3uIjFOwrzt4w1GZhUeqn2P8rJD5i%2FJJrK2lvNKufrSx%2FEYCnCXiOtCpKPx%2F1M503lq7tpDxDNUUUGlPwyJtWQflfpMWseaFtLgssZtZnDJ1VhxCn3651e38qanp%2Bs2ZX95brKG%2BtR7UVfio6%2Fs16YS%2Fk3pGmWxvNR%2BspJqfEW7WnR4kryLFW3PqN%2FL%2FLnW8I2UsW8x%2BVo71n1LT0CXp3mjGwlp3%2F4yD%2Fhsgl9oyXUaxX1u8LoCY2dStV%2FaG%2Fgc7JTEbiztrr0zcRrIYmDxlhWjDJCXQoeVeW9Rv8Ay1PKL25kuNO9ELEo%2BIjgaoKk%2FAqJyzqtrdQXkCXNs3qQyqGjcdCCK7ZFPMPl1Yg95aLWA7zQjfjXqw%2FycB6JrNzY3BW7uAbARKgUqSQVIC8KfCq8K8vhxq9wlntK4DvtJ07UgBfW6TU6FhvTwqN8FRyRyoHiYOjCoZTUEHH5FDC9Y%2FL6wuSZ9Ic2M3X0tzEfo6p%2FscL9B%2FLy8XVJNS8y3Yuo41aKz0%2BEkQrGwoWlO3N2zomVTDZV4l5n8s3Plq94oS%2BnTk%2FVZj27%2Bk5%2FnX%2FhsMNI893Wj2ht2thNVSEp8PGSlBK%2F%2BSf286nqOnWmqWcllexiSGQbg9QezKf2WGco13yhdaVMUT95A39zL0DDwPg%2BIZc3pPlzU5dStGa4IaeNgGZaAFWHJWoMOc5v5E1B7Wf6tcAoD%2B5PLb3jP0fYzo4xIYrZIo5UaOVQ6MKMrCoIPtidrZ29lAttaoI4UrxQdBU1OL5sCsO8%2FwD5e6V5708RXNINQgB%2Bp3oFStf2JAKc4m%2F4XOIWX5R%2FmVoOpummwIySAxNMssZhZG2q3Mqen80eeoKZqYq8l8h%2Fk%2FceW9Qt9Z1DU3W4gPJLS0JCEGvwTytT1U3%2Bx6arnWs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F1%2B%2F5s2bFXZs2bFXZs2bFXZs2bFXUzZs2KuzZs2KoXUjILG49E0k4EKetK43TYkhsoQp5EqGZvEnvgp1DKVbdW2I9jhDdaDqT%2FuLLWJbOzP8AulEVnAPVVkb4hiqB8wWUXmS%2BXTYWQi3ikZphuUlqOKmn7P8ANnOtRsiPW0TWUKqD9ofajYfZkQ%2B3%2FDLnYtH0Wy0W3aC0BJc8pJHPJ2J8ThV5u8tJrdoZrdQL6EH0z0Lj%2BQ%2F8a4bTbxXQPMGq%2Fl9r7mSs9jcUN3Cv2Zo%2B1xD4Sp%2FzZnaNYhtfNmgRaho7JcMwE1pKCASP246%2Fsn%2BZf58gsugWWtaPFp1xRL21qFkFCyP3U96YR%2BUfMt7%2BX%2BqvpmqEtpUsnGeOtQjE0FxD%2FwAzUxOy%2B5kHmGCOa1s7%2BVeEsFYpHI3SvwyBvDi647RtH1by3qEXmPT5VlgnWmo2C1Amj6rIrH4RMnVcCz3FvJ5x1pIqX2h30cVy3ouv2nQEeka9XZW5ZJNPult7dbZpTLasP9HlYUalP7uVf2JlH2v%2BEw891ZzY3tvqNtHdWz84pBUHoQe6sP2WX9rC7zJoEOu2Xp7LdRVa3lPY90b%2FACHwi0IahBqtdOo9hKf9LjY0Vf8ALU%2F78ybZFD591jS3R3gnRo5Ymp4MjA9snHkr8weRi0LzJII7pQEtdQc0SYdFWQ%2Fsy%2F5X7eH%2FAJw8uLqMDX9qg%2BtRL%2B8Uf7sQf8bLnJbuyjcNFKnND1U%2Fw8Dh5pfQo3Gc487eVFhMmq2KfuHNbmNR%2Fdsf92KP5G%2Fa%2FlyPeXPM%2Fmfy2Y4pmk1PRqfBBKpNwiDr6E3%2B7OH8j51%2B1ubXU7JLiKklvcJWjDqrDdWH%2FEsV5PntoFiuUuQOFxFvHKpKsPpWnLJZ5b8w65p1xEguXuIp3q8d07P1%2FZVm%2Bx%2Fkccbr%2Bhm2125sbPggX95AZq8FRhy3p%2FL8Srk181aDHqempqtvRLu2hDngPheMDmV%2F2P2ozjsrKLW5ju4Eni%2By4rQ9Qe4OL5D%2FACp5hgu7iOwkkUXFxD6yx9DWM8HNMmGJFFDRFRQioPUHIhrmgrAXubdK2z19WOleFepH%2BRkwymCkUIqD1BxBpWIaNq09o31WURrZoiem32ePEheCIB8VV%2BLJcGB3BBHtka1LQXVne0XnC9eUQ%2B0tevHxXA2lxazHfW620rx2atW4gkSqFOPCgdvjDClVwkA7hWYZswzZFXYnNBFPG0UyCSNvtKwqDimbFWE6voE1hIbu0Be3BrQVLIP8rxXJRo92b3T4Z2%2B1Ti3zG1cGkAih3B7ZSRpGvCNQqjsooN8NquzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxViPmbyo91cfpvQiINVT%2B%2Bh6RXSD9iXwl%2F33N%2FwWQzW9AXXo%2FXaFg7L%2B%2BhK0mjdBuafzACjrnYcDTWNrPKk8kYMsZDI42NR40w3tRW3z1p2l6ho%2BotLAfXVE5OgDVljA%2BLj%2FxZGv7OS2BbeaRbscpI5YuLQq3ETIfiQcv2ZVP90%2F8AsMk3mi1FjqBnt0CpcIHIUU%2BNT8RFP5tuWRDTFEulwPaP9YjVSfVjBIFGPM%2F7BvHCOSXqXlu6trnTI1t7Y2Zj%2BGW1YhmQ%2BJcfb5fzYcZBPKl1I7GRXHKGi3AY%2FajPRvdsnQNd8BFFDjnL%2FPWhJaXguIKRw33KngklPi%2F2Pxcs6jkY892Ul3onqwoZJLWRZeAHIlT8D7fJsAVBaLpUeueS9PtriYPcWykQXkfZ4yVDD%2FJP2WwX5X1NJ2NrQIGXkoXpzQ8JP65GPJfmOTR5G0zXLmGCzlYmzhZPSeE05ceP7UTjfliOhagkWs3CW0gkUXbPZjoZVkY8kQHr8OSHUJZD540vmYtVRBIAvoTo260JrGzU7cvhzaJ5jgm0t9O1u7giu%2FRdY%2BJ48oyCg%2Fd9QyfZ%2FwArJhPBFcwvbzqHikBV0PQg9sgt%2FwCSLpJy9pxniPRiQsgH8rfzYB5ql%2Fkq1hXU4ZigNwjsizftemU3Uf5Jzp%2BRXyloF%2Fpj3FzqYiR3YraxREsyx%2FzTOaL6j%2Fyp8CZKsSUOzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Hv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVg35iPrMEFld6XbR3CRM%2Fro1fUIIHwx%2Fs4U%2FlrqOkz3c1lYQmENFJI8DCgRzIDIg5b1JavTOiajZLf2cls1KsKofBh9k5ydpJPL%2FmzT9ZcBIWY2t5sFoD8Ls5C1%2FwCDkyQ5KyjWdLGi6ml3brSyvKxuo6I58P8AJPVclOiXZurPi5rLAfTf5fsn7sE3drBqFq9vLR4pV2I7dwy%2B%2BF2j6Xf2F5dS3EqNbyhViVa8iV%2Fbfag6%2FZXBdj3KnWURXLzYFYV5n8n3us6ut7btEITGsbc6hl418B8WFd75Ym8svHqVqPrQiCsJSPiikH2jQfsNnScayhwVYBlOxB3BGG1Sby7rf6YgZ5KCZftIBSmHeFllodlp95LeWqlDMKGIfYB7kDDPE%2BSuzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F%2F0u%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZFfM%2BipLW%2BSJZAf71CtaMPsygf8SyVZRAIIO4PbCDW6pP5YvDd6Wiu1Zbc%2Bi%2B9Tt9mv%2Bxw5xG3tbe1Vlt41jDHkwUUqfE4tgPNXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Pv%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV%2F%2FZ'); - background-position:center center; - border:1px solid #00aa00; -} - -.yui-skin-sam .yui-h-slider { - background: url(bg-h.gif) no-repeat 5px 0; - height: 28px; - width: 228px; -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-singlequotes.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-singlequotes.css.min deleted file mode 100644 index 8f3398d..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-singlequotes.css.min +++ /dev/null @@ -1 +0,0 @@ -.yui3-skin-night .yui3-dial-ring-vml,.yui3-skin-night .yui3-dial-center-button-vml,.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,.yui3-skin-night v\:oval.yui3-dial-marker-max-min,.yui3-skin-night .yui3-dial-marker-vml,.yui3-skin-night .yui3-dial-handle-vml{background:0;opacity:1}div.base64-singlequotes{width:100px;height:100px;background-image:url('data:image/jpeg;base64,%2F9j%2F4AAQSkZJRgABAgEAZABkAAD%2F4RfJRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAAD0JAAAAnEAAPQkAAACcQQWRvYmUgUGhvdG9zaG9wIENTMiBNYWNpbnRvc2gAMjAwODowNzoxOSAxNDo1ODowNQAAA6ABAAMAAAAB%2F%2F8AAKACAAQAAAABAAABwqADAAQAAAABAAABRQAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABaTAAAAAAAAAEgAAAABAAAASAAAAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMR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0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZ%2F%2B01IlBob3Rvc2hvcCAzLjAAOEJJTQQlAAAAAAAQAAAAAAAAAAAAAAAAAAAAADhCSU0D6gAAAAAYEDw%2FeG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8%2BCjwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgo8cGxpc3QgdmVyc2lvbj0iMS4wIj4KPGRpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNSG9yaXpvbnRhbFJlczwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1Ib3Jpem9udGFsUmVzPC9rZXk%2BCgkJCQk8cmVhbD43MjwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNU2NhbGluZzwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1TY2FsaW5nPC9rZXk%2BCgkJCQk8cmVhbD4xPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCTxkaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxhcnJheT4KCQkJPGRpY3Q%2BCgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCQkJCTxyZWFsPjcyPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxTY2FsaW5nPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsU2NhbGluZzwva2V5PgoJCQkJPHJlYWw%2BMTwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuc3ViVGlja2V0LnBhcGVyX2luZm9fdGlja2V0PC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BUE1UaW9nYVBhcGVyTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNVGlvZ2FQYXBlck5hbWU8L2tleT4KCQkJCQk8c3RyaW5nPm5hLWxldHRlcjwvc3RyaW5nPgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQkJCQk8YXJyYXk%2BCgkJCQkJCTxyZWFsPi0xODwvcmVhbD4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD43NzQ8L3JlYWw%2BCgkJCQkJCTxyZWFsPjU5NDwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNUGFwZXJOYW1lPC9rZXk%2BCgkJCQkJPHN0cmluZz5uYS1sZXR0ZXI8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk%2BCgkJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9hcnJheT4KCQk8L2RpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhZ2VSZWN0PC9rZXk%2BCgkJPGRpY3Q%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD4tMTg8L3JlYWw%2BCgkJCQkJCTxyZWFsPjc3NDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTk0PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5wcGQuUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLnBwZC5QTVBhcGVyTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BVVMgTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5BUElWZXJzaW9uPC9rZXk%2BCgkJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC50eXBlPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvVGlja2V0PC9zdHJpbmc%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuQVBJVmVyc2lvbjwva2V5PgoJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnR5cGU8L2tleT4KCTxzdHJpbmc%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXRUaWNrZXQ8L3N0cmluZz4KPC9kaWN0Pgo8L3BsaXN0Pgo4QklNA%2BkAAAAAAHgAAwAAAEgASAAAAAAC3gJA%2F%2B7%2F7gMGAlIDZwUoA%2FwAAgAAAEgASAAAAAAC2AIoAAEAAABkAAAAAQADAwMAAAABf%2F8AAQABAAAAAAAAAAAAAAAAaAgAGQGQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4QklNA%2B0AAAAAABAAZAAAAAEAAQBkAAAAAQABOEJJTQQmAAAAAAAOAAAAAAAAAAAAAD%2BAAAA4QklNBA0AAAAAAAQAAAAeOEJJTQQZAAAAAAAEAAAAHjhCSU0D8wAAAAAACQAAAAAAAAAAAQA4QklNBAoAAAAAAAEAADhCSU0nEAAAAAAACgABAAAAAAAAAAE4QklNA%2FUAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA%2FgAAAAAAHAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAAAD%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FA%2BgAAAAA%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwPoAAAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA1UAAAAGAAAAAAAAAAAAAAFFAAABwgAAABAAcwB3AGkAcwBzAF8AYQByAG0AeQBfAGsAbgBpAGYAZQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABwgAAAUUAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAUUAAAAAUmdodGxvbmcAAAHCAAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAFFAAAAAFJnaHRsb25nAAABwgAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAAADhCSU0EKAAAAAAADAAAAAE%2F8AAAAAAAADhCSU0EEQAAAAAAAQEAOEJJTQQUAAAAAAAEAAAAAThCSU0EDAAAAAAWrwAAAAEAAACgAAAAdAAAAeAAANmAAAAWkwAYAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1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U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZADhCSU0EIQAAAAAAVQAAAAEBAAAADwBBAGQAbwBiAGUAIABQAGgAbwB0AG8AcwBoAG8AcAAAABMAQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAIABDAFMAMgAAAAEAOEJJTQQGAAAAAAAHAAIAAAABAQD%2F4TkjaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSIzLjEuMS0xMTIiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyI%2BCiAgICAgICAgIDx4YXBNTTpEb2N1bWVudElEPnV1aWQ6RTcxOTVFNTY1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkRvY3VtZW50SUQ%2BCiAgICAgICAgIDx4YXBNTTpJbnN0YW5jZUlEPnV1aWQ6RTcxOTVFNTc1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkluc3RhbmNlSUQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eGFwOkNyZWF0ZURhdGU%2BMjAwOC0wNy0xOVQxNDo1Nzo0MS0wNTowMDwveGFwOkNyZWF0ZURhdGU%2BCiAgICAgICAgIDx4YXA6TW9kaWZ5RGF0ZT4yMDA4LTA3LTE5VDE0OjU4OjA1LTA1OjAwPC94YXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhhcDpNZXRhZGF0YURhdGU%2BMjAwOC0wNy0xOVQxNDo1ODowNS0wNTowMDwveGFwOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhhcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ1MyIE1hY2ludG9zaDwveGFwOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9qcGVnPC9kYzpmb3JtYXQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iPgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8cGhvdG9zaG9wOkhpc3RvcnkvPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8dGlmZjpOYXRpdmVEaWdlc3Q%2BMjU2LDI1NywyNTgsMjU5LDI2MiwyNzQsMjc3LDI4NCw1MzAsNTMxLDI4MiwyODMsMjk2LDMwMSwzMTgsMzE5LDUyOSw1MzIsMzA2LDI3MCwyNzEsMjcyLDMwNSwzMTUsMzM0MzI7QzA1QTE5MDRGRjAwQUJEQzA1MUJERkFGMDIwNEVBNTE8L3RpZmY6TmF0aXZlRGlnZXN0PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24%2BNDUwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjMyNTwvZXhpZjpQaXhlbFlEaW1lbnNpb24%2BCiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U%2BLTE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6TmF0aXZlRGlnZXN0PjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDtENDYzN0NCOUQ0MUExMEJBN0VGNUVCQ0RCNjMxODMyOTwvZXhpZjpOYXRpdmVEaWdlc3Q%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY%2BCjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8%2B%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQACAYGBgYGCAYGCAwIBwgMDgoICAoOEA0NDg0NEBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEJCAgJCgkLCQkLDgsNCw4RDg4ODhERDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgBRQHCAwEiAAIRAQMRAf%2FdAAQAHf%2FEAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4%2FPE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BCk5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0%2BPzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BDlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq%2Bv%2FaAAwDAQACEQMRAD8A7%2FmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmrlHI2utXn6WltnFESb0RFSp41WjD5q3LCBaslzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2E2rj0LuzvF7PxftUf8AXPLDnC3XI0ewdpOkTK4P08T%2FAMK2Ec1TLNgaxmE9pFIDy%2BEAn3GxwTgV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F%2F0e%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXYUeZpfR0a4kpUAx19h6i74b4X65CbjR76FV5FoJKKe5C1GIVLdDuGhuXs2IKOX4gfsvGdx%2FskKtkiyD6bctHHbXgPImOC4qOpXj6E1ff4Mm4Ndxkpc770BvNmzZFLs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Lv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVokKCT0G%2F3ZgaioNQemANZuhaWLyE0LlY1%2BbGn6sWspA8QA%2FZ%2FUcVRWbNmxV2bNmxV2bNmxV2NZQwKnodj9OOzYqwDT4iiPZsa%2FVLm5sj7I%2F76L%2BOTXTpjPZQSt9pkAb5r8JyKXqfUvMOpIQOFxFDfoP8qFvTl%2F4Q5INDkrFPAf8AdUhI%2FwBV%2FiH8cnLeAPcxHMprmzZsgydmzZsVdmzZsVdmzZsVdmzYyWRIo2kkYKiirMdgAMVX5sjTeaGl1CzsbSAOLuX0w7k14KCzyAD%2BUZJBirebNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F9Pv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVo4CXUFa9e0CbJRWkr%2B0RWlMHZEJ5WtPMtzE5%2BGYJKnyK0%2F4kuEC1ZeM2IW0okjFT8S7H%2BuL4FYz52mMWn2tDTlcpX6FbDHR5ecCH%2BZevywl%2FMM8dJtn7LdJ%2BKvgry9ccrOJ69KVw9E9GS5s2bAh2bNmxV2bNmxV2bNmxVi3miFU1LSbxvsStJYzH%2FJnSi%2F8ADYpoEzLcxq1T68FGr%2FvyE8GrgjzdC0mhXEsY%2Fe2pS5i%2F1omDf8RwttJRHdrcDaNbhZVI6endIG%2F4mcnHeJCDzDL82bNkEuzZs2KuzZs2KuzZs2KurkZ843Zhs4bVTQzvVqfyrvg3zHNPb2UMsLtGBPGJSpIqjEqRUb9ch%2BvSSvp0JlcvJCLyMuxJb4JNvi%2F1SuEBVvkaX9L%2BZbm8Sv1fTbf0Y6%2F78lPxH%2FgFzpeRvyPbWcXlyyubWBIXuoxJOUG7uKjk5%2FaOSSoxPNXZs2bArs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FU7%2FmzZsVQ2osyWM7o3FlQkMOxGPtZhPBHKCDyUE08e%2BM1Bedjcr4xPT%2FgThV5cvBJbpGergEfMDcYa2PkqfZs2bArs2bNirs2bNirs2bNirshfnRGtb7T9TX7LcoJD2qDzSv3vk0wl81WDajodzDGKzRj1oR35R%2FFT6RthHNXaVcrKsUtftDi304dZz7yrqPrQCIncdMnsEnqRK%2Fcjf54yVjP5gwtJ5ckcD%2B5mik%2BivH%2FAI3wD5RnEtpwrWgw983RGby1qiqKlYGkA%2F4x%2FvP%2BNchnke5BIUGoPQ%2FPEJHJ6XG3JFbxAOPxOA1iX7sUwIdmzZsVdmzZsVdmzZsVUbqBbq2mtm%2BzMjRn5MKZDLP4rC2UVq9qYj7SWshWn%2BtxOTnIVG4ttWvdNaiiK7FxGDtWG6Ti%2FwDwMuShzRLky%2B1lE9vFMP8AdiK33gYscKtBmDWhtq%2FHbOyMp68SeSH5UOGpyJ5pYde3moWPmW5KzH0pIo2WNt0A3Wv0ts2D73zJ6FgzxqqXpKpHG9eDMx7EYXed45VeC4gPCdYyqua0I5q5VgOv2cAW8sWo2QMqhwwoyHcVyQFhVOLzvrNrdf6fFHLFX4kVeBH%2Br1%2F4bJlp%2Bt2GqWrXFnICyKWeJtnUgV3XOP67qFjaFLHUrprecy%2BlZajxPDmN1jn8Dv8Aa%2By%2BIaXrclrdtZ34NrfR1USofgeo2K06c%2F8AgcBCXr%2FlvXRrdnzk4rcoSJFXYfMbnDzOV%2BTr82eqAOQIpaBq7AV2r%2BOdTriRSEp8z8RoN9I5AWJPV5HYD0yHr%2BGQg3Ntq1lcLazx3CiZviiYOKzQo9Kjb7YzoWqRevpt5AOskEij5lCOmc60%2BWCK0j9ONYo5IYp%2BEahQWBeNjRafEcMVTvTb%2B80fyHZ3FugE9vSORJBUqPVZW%2BEHw3yVaXeC%2FsobulGkX41HQMNmH%2FBZzC%2B1iTTbadZUkjtJjzkQqSKqNm5fsdMPfyr1%2FRdT8vra2E5N5C8kl3bSMTKpkctz%2BL7SP9peOA7fFkIkgkCwOfkz7NlA1y8DF2bNmxV2bEJLy1injtpJVWeavpREjk3Hc8V64virs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Xv%2BbNmxVplDqUbcMKH5HIPokjWsstqx%2BK2lZPf4Wpk5yF6nF9R8xswHGO8QSj%2FAFh8D%2Fqrkoc6VmSMHUOOjAEfTjsAaZMXhMRPxRnYf5J6YPyJV2bNmxV2bNmxVQuzOtu729PVUclBFa07U98DafqsF6i9EkI6ePywwyF6vG2i6oJRUWl6xZCP2JOrr%2FsvtLhG6s0yiK4X6Zfi4QI7Vb9lv5h%2FXDHrgV5c8B0LzLc2Q%2BGF29WDw4SfF%2Fwp%2BHOg6ZMHi4j2YfTkZ%2FMGwpFaazGDytm9GYj%2FAH25%2BEn%2FAFX%2FAOJ4N8uXwliicnps305LmFZDewrc2dxbt0lieNvkylc45%2BX10UCQzHjLATE4P%2BQeNc6L55e5i0J57WVonikRmZDSq7jf2yB2Op%2FVYor2%2FwBNjktpAGjv7ZvU%2BInoy8Vao%2Fa44xCQ9as25RVBqKnfBGRby9rBEsljcIY0aQ%2Bg5FCCQD6bj9lslGAikN5s2bArs2bGyOI0aRuiAsfoFcVS%2B%2F1q2sJltyrSytuyp%2ByDsC3zwxBqAfHfI%2Fodmt2z6pcjnJK5dAexPT%2FgRkhxV2c782mSy82WUgNIdUhNs4PTmlXQ%2FwDBDOiZAvzLb6nHpOrlFkjs7lWdG9yvxVG%2FwiuGJ3Up3YTJFr7op%2BC8t1ljHjxodv8AYtkiyHbxx6XfKx%2FcXBilJ3%2BAsVUV8FRlyYA4Z80DkkPmq3EtlHJSpR%2BJPgHBH66ZBtIufqt9Np8pALHnEpO5p1oM6Xq0P1jTriPoePIfNdxnLtZtrGZluBcG3vF%2BFJYuJfx40IIxHJKzzb5et9ZtZYp1LwygcgPtKy%2FZkT%2FKWuRKKCOC6tNH1CblcWiILDUWHH6wg6wyDejx9Fw4sfOMjEBY5biH1HgLy8VYulOfJV%2By38q4ndH9LlL219K4iilHrWzLxlhI6SgE1%2F2SnFKo0Czxy28zMqcSzspIYBPj2I%2F1cd%2FytnVZdNQ2D1I%2BESMoPw%2FzMftdMG20TSQyyblmjenzoc4TY6ld6ddyKwMUsbFZoHqNwd1KnGXRXs9n5%2Fv7lg98GlWhMjwk1A%2Fm4k%2FF7jDSwSPULTTJI3PGBphGNwG4OHVW%2BgnONX%2BsWFpDFPaSSJcTESG3TcRlf2uRK%2Fazq%2BkR3aeT7e%2BjnX6yoW8ibht%2B9i9Tg%2B%2FQ98QVZHqstutowuSPSdSpV91IPVWzif1i98t%2BZ7m40FjbSWUrNCqEmkex4EH7acT9lv2c6lonmbTvMUTWdwgiumWktrLQhge6H9of6uRLzd5ZurDVP8Q2KetYFUW7jXeSKi%2Bm0hH7UZH7X7OCY4g2YM0sMrjvexB5SHcXsnkPz3Y%2BcdPqKQ6lAB9bta%2F8lI69Y2%2F4XJeDXPJlvPe6JqMeq6NMYLuE842To6ntToyuv2k%2Faz0J5E8%2B2HnGyI2t9VgA%2Bt2ZP0epH%2FNEf%2BEyESeUuff3tmbFAx8bB9H8Uf4sZ8%2F6P82TMMLNb1iDRrQ3EpBkkPC3j7s5%2FwCNV%2B0%2BGVc4n5m8yfpnzJcsr%2F6HYsLe232PBv3j0%2Fy3%2BH%2FY5JxkLourX175%2Ftb28maSZrloqsdlQ1Tgo%2FZUDO755%2B8uxlvPcMI6i6LAe2zZ6BwlS7NmzYFdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVf%2FW7%2FmzZsVdkb83W5%2BrW1%2Bg%2BK1kAc%2F5D%2FCf%2BG45JMC6jare2FxaEf3qMo%2BdPh%2F4bCNiqV6VOOcTV%2BGReB37%2FaX9WHoyFaJMz23BqiWE7juCh%2FsyaRsHRXHRgCPpwy52gLs2bNkUuzZs2Kuwu1rS49W06Wzb4XI5Qv8Ayuu6nDHMemKvONE1KWGVrG7rHPCxRgeqsppk7sb0XC8W2lUbjxHiMhnnnTHtLmPXrZfgakd1TsR9iQ%2FP7LYtomq%2FWI0Iakybof4H55LmFZdqNlFqNjcWMwqk6FD8z9k%2FQc515XuZbW4l0%2B5%2BGWFzE6n%2BZTTOlW063EQkXY9GXwPhnO%2FNsS6T5qtbofBHqaniexmi%2B2v%2BsU4v%2FlfFgHcrPTFbanZNb3caywyApLE3Qj3zjutwW%2FljzBc6Pp6fV9JHpsLNSSgR1HIorV3Vvizq2jXQk%2BAndlBA9xnNvzRiWPzJBJWnr2gJP%2FGNyv8AHAdikJ3YGf0o5pZDIboSD1GJJ9aAgh6%2F5aUzoFnN9YtYZ6gmRFY06VI3zlXk%2FVI5bi2hnlBgdBuxFFahhfr0rSNsnHlXU4JI5NJaSt1avIQm%2B8RaquD0I%2BLjkpbgIZJmzZsirsDagC1jcqvUxOB%2FwJwTjXUMrK32WBB%2BWKpfofE6Xb8f5d%2FnhjkMPmvR%2FKlrJBqkxBSVkjC0PIDpTfI15s%2FMNbu3jbR5plsZVp69swRi9N0eSjMnH%2BRcVpm669cWWtXGnatwjgKma2uPsj0x%2FNXw%2FayOfmLr%2BhX3l%2BPTYrkXM%2BpGtm1uPUUceX7yRx8KLtx%2F1s5xoN%2FefpVr6C8muVVfUuLO8kMrEIeTem7faRk5Iy5FdTuZ9B169trGZvqkc5eFD8SmJzzUcTtsrceWHzTT3fRJv0p5UZvtOYYrgCu%2FJV4P%2FwANHnPrj83vM2lX9zpWoBJYInaJ540pOi1%2BGRQDxf4cln5Z3qT2stjWrK0iexEgE60%2F2XLOUfmHYNZeZbhWP94Ayn%2FV%2BD%2FjVclLlbEdQn955q1wTiU3huLadeQCsfSljO9VNev%2FAA0bYHub1Z7V5yWkhHxpcVHJNwGiuP8AKStVk%2FbyGafqLQxyafO5S2lPJWUAmGQ%2F7uiB8f8Ad0X%2B7F%2Fy8Ctd6jpl3Lb3v%2BkQTpxniqTDcQn7LoR%2FwUb%2FALDZCyyekWl9ZyaFLPelZGN2tqDEtZJHenEs67ckpVXwq1bU7G1iKWvqtcCR4bkkhFYx%2FCHXhvvX48C%2BU7H1SbK3k9Wya5hv4HchSBF8FxBL2WeOJ1k%2F4s9P4cu%2F0j%2Fc1FphmFxPLeOhZBxAiL8jt40%2Fa5YegV6PprvLpcE8sfpTNbh3QVoGK12zluoQ2PnZih42fmWIVt5z8Md4q9I5P5J17Z2A8YrWVl%2BERoaDwoNvupnLtb02LzREdR0hBba7bVe4tEPFZwpr6s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xKXcslu7tXb1%2BSBq%2FwCSzZK9c06xuNUutStkBls5IFkAIAMoHqUUfzNRkbCPW5Xs70rZcVtL0%2BtCoAFVc1oK%2FwArni2RIShdD0rU9Z0g2UNW1DR5JLG%2BirRlQuXhmp1ZP72M%2FwCph75g0K2sra21G8ch5baGJUpt6yARuvL6OWEQk1eJrq9s55YLxBzuGhJEjr3LKvxSqv7WISanq2oQRXGryvd2MtVhuSQ8aNQch8OyNjsqElhK1hbcr%2Fcv3K%2FyV%2FycRSQBmUiifsfQM6FpfljSbrR0mCy3EjDlDIzN9sGnphU%2FZ%2FlbIrqnl%2F6jM3Cb1VRqOoU8078XoOHPISIiQCd5ckgE3tyS4StK6xSy%2FDJ%2B7HqseO%2FYVw0W2thatp10he2b7YH21cfZljP86f8AD%2FYxO4tbO4so4I7ZUvG5Lpl3PssprUws392JD%2Fut%2FwCbAOh6sLuU6VqYMF4hKRu2x5DrFID0YY7rsh4tMn06%2FkspjzjniaS1nQfDIE%2BJWXwdafEv7Od0ugnmL8tmYipWEOB1oGWp%2FwCH5Zy4hoT9WuU5BTzj7FHp%2FeIe3%2BX%2FADrnR%2FysvRfaHeaJIwZ4RJGo8QDzQ%2F8AAy5OPVBfPNxbpMpifYqaBu4IwFYWlx9fEIJU7lmH7S%2F83ZJ9e0x7K9unRg8azMkoHWJySVR%2F9YH4W%2Bzj%2FKtvFdaxBDLQKzAVO243G%2F8ArYPJUXb2NvDZtdyWxe3B4meCQ%2BtG37Jkjb9lafaXHRXl9q2r6etnWJ7Yxx28h%2B1UNyMjt%2FlH4myX6lp1poPm57CIFLG8jikCsKisqqXWncc2%2BzhLZW0Om35hCuLiCeSgIHFY67KT9rl4YaV63IwMVSakg1pt27eGRuzvrTWILdYbnlcIWXSdQc8W5pXlp91%2FLIP91M%2F94mG9tcfW3AQ14xgsPH4c4Zp%2Btz6HqN2rJ61nNIy3loTTkA54yIf91zR%2FailyRNUinpV0iXqyyxw%2BjdW5Md%2FaN1iPdqf74f8A5Jtka1ZZ4LWYxsySKpaCRT8QI%2BIxkj2Hw5KLe6%2FTsUF%2Fp1wsmrRRk2l0QAL6Fft290g%2Fu7uP7Lo395hFquqaL9XZmmWCRwySWTgs8MgG6Oo%2FY5fZbAUhC%2BZ9JsfMl1SKYW%2BqyQRT2DMf3UvJeTwt4M5%2BJchKyrOr6D5gQwTQEpFK%2FwDeQv8Ayn%2BZDk%2B1Gyj1ew0SaC4gS5ntmCtX0ELQtQAM%2FEcv5Fwv1bQxr%2Bnhr4oms2ymP6xuCStSIbof6v8AdzYOaGAQ%2BXdTm1NdLjj5SN8QkG6FOvqBu%2BTjTrS2sbZLCMcVUmkpFGLn7Rf%2FAFv%2BFxTTme102DTuILIwZpKksW%2BzxWtW41%2FZyU2XlW41HhcahytOQJZVHKaXw%2Fd%2F7rY%2FzviAqQ21ldXtytrDG0k524qKmnj8sO736roNmNIltfVv7hFeaMnkUqTwpxNA2S2MaT5etS9w6WdtEvx1b42A7Symh%2F2C5zTzb%2BZun3swOjacGVKwrqMgoajeiJSr%2FOTDVdVZPYa3pOj%2BW7u31uKKzuZGP1dePP1Iz1UovxtJ%2FlYU%2Fl%2F5hOtyS%2BWrlis1Gm0pyfiR4%2Fi9Kv7SumcrvNYnu5DcXH7yToamrfSf6YL8ratLZ%2BZtJvoT6bwXMbEjuCwVh8uJauPFuFe%2Bx%2BYJ4NMawQiOFzyZOlDX4h%2FwQyQeVtAn1BY9R1QN9WU1toG%2Fa3qGYeGE3lnRLPVfM19LdAyWkTtcW8a7xOGaq1kGz7k%2FAM6moAACigA2AxJ7lojn72wANgKAbDLzZsirs2bNirs2bNirs2bNirs2bNir%2F9Hv%2BbNmxV2bNmxV2Qzz3p3P6rqKbFKwyt%2Fkn4lJPseWTPOVfnX5gmstNtdBtnMbajykuXHX0YyPh%2F2b%2FwDEcbrfm24MRzZI447GR59w6pMfNyWl7EdD1KM3Cp6dwoKldj%2B1zHE%2FRko0rz1rUtz9SvLe2lm2Hp8jC7BhWqV5xvUb%2FDnn01jPEin8pHgckemXmsTaHcxANw05o57O7IIKxliJYll%2FaRT%2B84%2FsNkIZhIkSjRDl6zs%2FwIjJCXFHkb5gp3%2Ba2r%2BbdPuEvYLVbLRpiFL27c2EvWkj0%2Fd8v2VpkGsfN2p3Kra3V2XicgEsQeQJ3qSNs7d%2BkdO1rSbKw1LhN%2BlbRXVJKFZyq8ZV3%2F3YGHLOEecvKFx5TvTLDym0idv3EvdG%2FwB9yf5a%2Fst%2B3lpHUOvsua4iNwbWCruHK%2FB0qN9j0zoy%2BarW48r2Oq3l1Le2sSizuGkqk6zgUVXMda8F%2FwCDTOO2M01rIs0XCRQ4kHqCqGnZl74NgkTlMqSOIZpPVNrXjGG8Qvfj2wXzSyqz1eO%2FtNSjQM8sVubhFbbkIpPiI%2BUR5Yca3q17IdPmtZ2js7yztriONNhyAKSciPtMJUfIZaXDWL%2Bra0jcq0ZYAV4yAq6mv8ynJf5Yex1PRjpUsfO%2F0pnuLJWNPUgkNZ4l%2Fm9Nh6vH%2BVpMRa2uvBcXej2Gp2rSC5tJJbOZkqW4v%2B%2FgY%2Bx%2FeJhtBB5sOi313boLa9ihMlo3EB5ClGkULy%2B16XJk4rhlZarBFAbZljtrS5Tg%2FoIF4fyOT1JjbC1L%2BbSbowyMwu4WrzJryX9h1PQpxw%2FFWFXNut9PB6srS6frlqI4JZHJ%2Br30bCsbOf5phx3%2FAN1T%2FwCRgPQbtreVrEFrW8gfnDU0dJUPF09unHD%2FAFeygjjvbi2haTQbpxcXlpHvLp9x9n6xClfjtjXi1P2P3b%2FGseE99ol9qtyjIKamYlktb6Mn0L5QKJ8Zp6d3x%2BH4vt8OD%2FvciTXPZaZ%2Bkdp5%2Bgt19Yad5p0%2Fe0vU2Y8T0NPiaM%2FtJ%2FuvOj6lcGysFaRlYxJWUjfkUXk3z5MM5p%2BV2l3U2pPdalFHK1sOLyqQxSZaFOdDWOT7W%2F7eTTzK8UdlcxREhXBTf%2BdzWg%2B7JxNji70HnTz%2B51GXyrrFxaapD69nfcRqSftqxHL1oj%2FOjPjtQ0GNYCfrCXWi3QMtlelhyjkYbFfdvsyx4M87Wy6zqemTq4X9KwQnmegkK%2Bmf%2BSi5G9M1PVfLUt3od3CJIGDEQS7iKUD4Zov8%2FjyErqrruPNkK58%2FJN7Sx0%2B0sDe3k0k9xA6JBJACGqwPHiKp8S8fts2F0mrDS3nubPThH6ZLa5YcQsnBvs3kSsCnJeXJuK%2FB%2FwAYmwQ%2FrXdjEsQRizhvjKCrUp8If4uW%2FwCyuK3Fs893p1nezfVdeDCOxmHFi8ZH%2B89wSeBjP2YuX%2BVFiYggA70Pmt9QzfyjdxXeiPeaY3rNYt9ZjdKUkgP2gyj7L8ftL%2FPgTz2tuLdJIT6cN1JFcxzJ2U7Sb%2Fs%2Fa5BsKfLEMvlPXby2sJI40uF%2F0izVuUcb05n0z3gkTlw%2F3237vHeddXN5pEMdnbmOys4BFcy0qDcF6GJa%2FwDFacmyX8Pu2R1QOi6Yupabd2F78dj6xjLVFUlpySaHwkUf7F0%2BDIrrvl6dr42N0eOtRIHs7ldkv4B9ijf8tKgfB%2FP%2FAHX28mPluyb0Vs7OdTL6SSReoK8%2FTZqN%2FrqOPL%2FJwTqdhFr9m1lqUhjnhcm2uv8AdltN%2FMKf7pb9tP8AZrjVhWHaHrEWqxjTb9gt9GKQytsXptxNf2sl35d3J0jznJbCojuQlR26cT%2Btc55qthdyXcyyJ9X8wWfx3ESbC6UbrcwfzS8fjfj%2FAHyfvPt88N%2FKuq3F3q1hqBIEyc4pWZuCkoAwck9MA50VPJV%2FMq2k0TznfCJQUmPJom%2BzJG%2FxcW9t%2FwDY4Q6cILa6ZY2eKRwslv6goaDfjy%2FaK4f%2FAJleadM80a8t1pcZ9GCJYmuG2MrD7TAfsqv2V%2Fmwr0WyuNXUw%2FVxci1%2BKLt%2Fw23wrg6qGVanr1vrK2t3csIry1aESBjxJEYYOQff4cjvm3zLbpZXLWTGC5vr%2FwCswRjfjBGoC8yfi%2BIjCPX2vNMu%2FqZDRNGKSAgUqxqgqKruF%2BH4sjsyPPIZZSXJ7knfG1e9%2Flxrdt5ksbqdSFu7eMLcW5O4%2BE0cV6xvnF75uVzcb14yyBW7%2FaO2KeS9RutC8yWd7DMYLfn6d3L%2Bx6D7SLJ7YhdkNd3UkRDRSXErxMDUFGclT9IwndCtpWrz6ZN8MskcDsGdojxkjcfZmip%2B2v8AL%2B3iWoySfXbiHUmFy14frKXqH4nL14zK%2FVuX7cbYEeJWDPQVpU0Pj0x6yqLL0pJUW4tXE1o5O9SaSRbeP28Cob1Z1T6vPKzxjeNSSQK9aV%2BznXLfUrdtDt9T1U%2BjeRxpa3iMvF5V41jcg%2Ftrx%2BLOd6VbaTqJlS7lMl5Iri3hHwRiQj920snhzODppWsii6zcGeSZg3po3NSy%2FD%2Fen4K9V542r0LyheaXcm5uaCCWNhxkl%2FvClOqcvs4rrn5g2enI9tpKi4uqlWck0rSvxP8Atf7HITazpc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2FLhpr3nLTKJ9UT19TB4zNHtCe3Jj3b2XIssp1Y8bUfFOQsix7SCSlAXpTmj4av5OnsdM%2BuzB3Zm9OWaNGD2%2FMgRTolP3sXP4Zv92fyYi6oITDVrG28x6NBeBvqWoWS1ivSeIikU8jFI%2BzLA6%2FGn%2B%2B3yFaq1pcXix28ZUGi3U2wadx%2FuziAEWv8Aq%2FH9vDLV7TzXeWrqbaWO4VhHeNHtFdCP7EhX5D4v9%2BfbwpC3liGgvIoVdSqt6pLPGr0pTj%2Bz8Xw4CUkEGil7RwRu9ZzwjPx8UZiKePShyb%2BRfMdhHM2kLEV%2BsDlDLQFncUCxcRX7WEF1DCs63zCs6r6c1Nkencr7rgXSpFsb5zCForepC9PiUEfZr4DADRVD%2BddUkPmPU4lUgVNtNG4qDw2Bof2kP2GyK1LECpY%2BAqTnUFhsta1Ce%2B1G3inuZCrySsgqwqFNRkwu9R8m%2BWIwscEHrharDBGjSH5tT4f9kcIoop4da6Vqt2GW0tbiQHbikbkH57UwHNFLbSvb3CNFLExSSJxxKsuzKwPQjOu3%2Fmq%2B1mFo1C2NmFMjhTQLGu%2FKRtumQfU%2FMWh3uoTXx0r1pJePKSWSnJlVU5lQNufHnhQxmOYxklSPiFCDvUZQKUIpUn7Jr0%2B7D8eYrBP7nRbUf61W%2FhmPmtkBFvptnEezCMkj78CpRZOY5w%2FBmWhBCjseuSyyn0pIpIr2CSr2gtbYTQt6aylufPp8PBWbCZPNurROskYgVkYOv7tSAVNRtg2780%2BYPNd5CdWuRJHEWkWONFjRaih%2BFAPljsqLeRrVh%2BjQt3GBRoXBBKAfFwag%2BLJ15B17yfealE2taTHcXMG63Eq%2FvbYL%2FvyH%2B6eFK%2F3iJyT9vAXkPygPNEuoxx3KQ3VrAHtYWP8AeOxpv%2FxWqijMv2WZMLdS8vBLx4pg9jqVqTFJIvwup6fvP5lP%2FDLillv5i%2BStPtL867pEEcem6hxkivLWjIk%2FevHb05ftZF9Okd5Et5mayvoWEtrdRmnCUfYmhYfzftp%2B3k3%2FAC68zLfx%2FwCFdWt1eElrbUoW%2BwGIrDPGv7CyU%2BLj%2B18eIeavKM3lq7WqfWNOkYizuXFeNesE9P8AiX7WNbqCncfm2f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V1PpOsrBduRLFcPb3JY9VditW%2F2XxZ0%2B91O2spIoJWL3E54wW0Y5SOf9UdF%2Fmdvhzm%2Fm2w%2BoeapJlBVdRjWdCDsZE2cfeuHdvfQW0BngZptVvEH1u%2FlG6gj%2B5hH7Kr0xHc0pD%2BYg8wa1NDFZWjSWtsrCRoiGJcn46b1YdF2yFWemzxsW1CN4Ej%2FZlUofubOs2WpxpNGl2oMP2eSbEe5yTXGkadqFpJaT26T2860YEVBB6EHx8MeCzdpunlEtpHYQ38GqRrFNaPA8EgJcFa%2FGqhadao2XBGlmbe2uCzevbGeRo2PcNJx%2F2S%2FDht51s3sLpYLoH6ncIq21wRU1UceLt9Hxf8Hhj5f8pXerWc%2Bq2VrHqE1oqQWdvNLwUoijmJB%2FO9W4%2Fs8cjVH3LezEvM2mXWqyabNozB7SS1WJ5SwBrHWnLv8A3ZUbfy4onlazmtrKC%2BJlNoHFFNFbmQaHvtTJ9rPlzU7GOO6vrRbeNioQQMrRxmn938IXj4YE0fQLnXBdQ2062l1CP3SSry9Xav7og0%2F4LDsikps7C3s1WK2iWJB%2Bygpg5lNOX0YAVr7TL0xXsxcxsVlhktwpFPtLVWwbf%2Ban0e8tp7LTYrmyILlpyT6hoRw2%2Fu%2FTbdlw3taoK4v7a1dY2dW5GjQ1qVHj%2FwA24Vah5a03VlNxZEQTtvyX7LH%2FAClyfjyfo3nrTrbV9PRNI1i6gM8qRENC8gb05OUI%2BNR6nR1%2F4HIRqOj655Vu%2FQ1SBogT%2B7mU1ikA7pJ0%2FwBi3xZGwdizhOeOXFCRBSPSZNX8maml1MhNsfgldPijdD1H%2BS37S8s6ZLrEEZt2uEe1W6VWtLsg%2BlKGHIGOReS%2F6wOR9dWtRp11dSQ%2FWHt4Wk%2Br93IGyU%2Fysk%2Fk%2FW5INATT9Z0eAWczGT6gr%2BoIlfcgBxsf2vT%2FAGMYxMSeE2D07m7PqBmjEzjWSO3EOUo%2BY72M%2BYfLcd3FJeQRxyo7EzQU792GQ60bU9Hkf9HTAwts1jdVeNl%2FyX%2B2n%2FEc7ZL5XstVSS58p6kYZqVbTrysif6tWPrRr%2FspVzmuvaDq2jzsup2JtA5NCfjtmNf91Tjb%2FYyccJ8tmgJPqV4JJLJpI3sYLqJ2uY%2FtBgP91q6jpIy8Vw0sNNn8tG11m8KWNnqTrAums5YhTvyct%2B0R8fw%2FYb%2FWwLdRpfaVEkkPO50r1HhjJALRSg9HpX92%2FwCzgSW4TV9Hga5uppdVspFt7a0FOMNshHJm3VuZY8fV%2B0zfBlZHq3BNigOnm52LIfDHCYwMCJmVXI8IqMYnzI4f85l%2BsRQc7eSKVRPHKts4ruUkPAcv9R%2FiwbZaY1p5gtrHUoipjnjWZOo4lhRv8pGwcPL9pcROZo2S6ZkaXgyqoaFVk4hn%2BJ9uPqNxwVrmsWupvYzalF9S1K1lTi6GscsYYMpV%2FFWUNx%2FlwYoSjd8jybO0suLMcUsdmUQROxRrnH75PQtd8vaT5itBZapAJI0YPE6njJGw%2FajcfZzg%2FwCZWh3GhW%2Fr2wH1vSZ0DXlPia1m%2FuZuK7MV%2FuLj%2BbPQ1pdR3ltHcxGqyCtOtD3H0HIF%2BZFnb3k8EMqhxPBJHOh6MnIUDfSdssDq3zfqWmR6lFJqenRCO6iHK%2Fsk3FD0ng%2FmjfC3SNVudJuUvrKQJdQOrxc1DoafaSRGqrK%2FRlyU32i3XlnU4RHOYrF2Isr1hy9Jm%2F495%2F8AimT%2FACsKte0Zp%2FW1Kxg9KaL%2FAI6Nipr6bH%2Fd0X88En2lfFX0%2FwDlz5x0fzbpAlsIYrO%2BgAF%2FYxBVCOR%2FeIBTlE%2F7Lf7HJpniLyz5m1TyrqVtq2ly8ZYzuvVWX9qOQftI37WeufJnnHTfOekJqViwSZaLd2pNXhk7qf8AJP7D%2FtYFZJmzZsVdmzZsVaOct%2FNj8sx5ntJNb0NfT1uBayxrt9ajUfY%2F4zqP7tv2vsZ1PKOKvhz0CsbwMzqSSHPRgw2%2BL3%2FmwrlheB%2BD9exHQjxGeqfPH5Oad5lupdW0icabqU3xTqV5QTN%2FOyr8SOf2nX%2FgM59H%2BQfmu5nWC9ns4rbl8U6OzMB%2FkpwGKr%2Fyk%2FOBtOMPlnzTMWsyRHY6g5qYq9I5j3i%2Flf8A3XnoxWV1VkIZWAKsNwQehGc68sfkv5Q8vBZriE6rdrQ%2BpdAemCO6wj4f%2BD550VVCqFUUVRQAbAAYq3mzZsVdmzZsVf%2FV7%2FmzZsVdmzZsVdmzZsVdiNzNDbwSTXLBIUUmRj0A98WwNfPaJbSm%2BKi2pSUv9mh2pirAPON5pMWiStoiPJfM1bVI4yy1G8jDkCnwrhDrD6jFb%2BWbC7Wt36Ecl%2BCP%2BKiZHbtyJajf5WDvP9xZRaNCfKtxKb4zj04IOR403JKkfAOfH%2FWws84ajNd3EEklFuSOUtK%2FDRVXiKduQOFIeeatpk0F5PeaUj%2BlATLIYwSYhXd%2Fh%2ByleuLP9U12ykmiWO2vrWOW4n3PxgcAFXmaty3cf77%2Bx9jO1%2Flvo0EejT388SvJqDMjFxXlEvw8TX9ls5h%2BY%2FkSTyne%2FpHTVY6LdsVUj%2FdDt1hf%2Fitv91t%2FsMgRW4dxo9X4vDiySqcfon%2FO%2FoyYJsQGHfJL5FsrXUdZk0m6uTbR3UTvHQAgzRjkONSODla5GgcX0%2FUJNL1S0v41DPFINm8G%2BE%2Frym%2BHMD0k52txeLppjqPUPfF6l5X8xWlm995evZlguLSdkjR9gTWjrXovP4XTEPM6wwzKSKCT4tuoIO%2B3vke80xXU2tW13ZQ%2Bo15bq8npJ8UlELVp%2B3sMBWOsXOtWy2iEyXNuCyIw5Myf8VsaseFP7tvizL4tq%2BTzNUfvT%2BOU6npky9ZrciVAO5Xw%2Ba8sis01rp%2FmC01O5YrSWJ4kXcyFiB9nsK%2Ft5fljzLXzMlg0bRQujQESbVlDcl5IenL4kyeebPIp8y6j5e1DSEjX0XWO4QsqKYk%2FfRgV%2Fb5gx8cHMe5lGUom4mjuPnzSW%2F1OfVL6R7sJW2keKFUGygGhIJ3PKmNVy%2FTAk1pdWc9zBdrwuElcTIezA%2FEMj%2FmjXbvQtaW3tEBgCJM6PuCHFQExtizSKI1DHJv5VuxKrWMp%2BwC8JPh%2B0v0ZCNLvrfUrGG9tjWOVQfkf2lP%2BqcPdHme3vIZV24sKn2Ox%2FDJBSyzzBplrqWnSQSxLI0P76EsoIDqO3%2BsMgmlaxceUdRXU7ZS9jJRb62XoUP7QH80f2k%2F4HOgXdyVYgHp1%2BWQW8g4TzQyoQpJIVh1VuhGJCh7FG9hrempKhW4sryMMp6hlYV%2B%2FOWa%2FbXfk%2FU0ZJOEL1ayu2%2By1P91udv3if8OuCPJ%2FmhPL1xaaJetx0y4rFFMx2imJJSvhHLXj%2Fr4N%2FO9G%2FwAJ28o%2FYvY69%2BqOMgdlYzqPmWy8xr615aouoxAA3dk4dJB0%2FfRGjofBl54U%2BnCySRNSa1l%2B2vQq3861%2By65GPKcztqxjY7NEw4jYbU32zoNppF1qfrw2JX6yierHExoJivWIf5fH7DYYnZaY3pN9N5N1n9JJEbuIwyRoisY1kDbpVu3F%2FidM7xpl3Y%2BadFt7m5tle3vIUkaCYBx8Qowof5WB%2BPONG0jvLY28qlRUgqwoyOOu37LpiXl3XbjyZqk7XglmtZIfTEKNQGh5REFvsxr8XLjgIrdWQedvy7GiQPrfl4SNaxVe5s1q7Rp3ki%2FaaNf20%2B1kT07WGCqwcMjdJFNQc9C2N9BqNvHc29WiljSVGI2KyCopkFv%2FwAotHu9cOq2d1JYW0x53dhAo4O53JQt8MYf9ocMFyB23ZwGOQIkeCQGxqwfIsatNQSQrIrmOUbrIhoQfEEb5LLHzPP6X1TV4RqFo4ozFVL0%2FwApD8EmFms%2FlxeWBNxoEpuIhubSQj1B%2FqPsHwo0%2B4ltUmW7Ro5ojRo3BVhT2OWCi1t%2BbPJ1pFCfMXlJgtl%2Fx92VCyRHuwjb4kX%2Bdf2ciOlG2huhcX2n8JI2BE8FHHzMTb%2F8TVc6FpWutaySPblJEmHGeCQVVwP1ZGtcsIbe5N3p0Ui2MlWaM7mB%2FwBpQ4%2B1F%2FLkTGulhnDIYnYprf6tYaxaxxCDlxIaG7iko8Z7kGtWr%2B3ywxsdGl1WwitzGbkgkRzugDGnRm34R0%2FZbIJBZwxv9YhAVx8Qp0JPiBnafJl1eXekLNdyrKOXGNgADQD4g3Gg%2BE7Y8WyTLfiHNJbbQvNHle%2Fe50eQX%2BnXAD3Vg53EoWnKImhQmn7Pwv8AyYRX9xql1dmXWOS3XHiqMnp0QEkKq%2BA5fazrQwHqOmWmqQGC7j5D9lxsynxVsFsLeO39hb39tJbXMYlhlHGSNuhB%2FUffOZXy3%2Fl7UV05n5MgrpN1LTjLCT8VncEj%2FYf5Odt1nQbzR3JcerasfgnA2%2BT%2FAMrYB%2F5V3Y%2BdtAvhefubrn%2FuNux1jkQUYkD7Ubnir%2F6uEq8D1rTFk9XUdNgaHix%2Bu2XVoHPcD%2FfbfstnQfyAeb%2FFktC%2FptaSF1VgFNGTiXFfiA%2BLj%2FlZC9WuNd8p6kNM1e04anYsY2mY7TW%2FZG2pKjfsS4K003mkCHzl5WmDLazercWoB9WCvX1FB%2FeQt9lv8nIofYNRl5FPI3njTfO2li7taRXkQUXlp3Rj0Zf5on%2FYbJXirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FW7%2FmzZsVdmzZsVdmzZsVdgHVY9PmtHi1JlW3cgEuQBUbr1wdgPUdNttTtzb3IJWoZSOoYdxirzHztP%2Bi20aTyvdm6uDcJSCMJIPTVhRWKj7Bbbi2B9b8keZrnV3FvberbsQsVwHUKFJ6tU8hSvhk%2B%2FwAPGy1GwvLOkqK5ju0cIP3YQ%2BnItAPiif8A4nkkphKQaQOk6eml6ba6fGQVt4whPif2j%2FwWO1LTbPVrGfTr%2BITWtyhSWMjqD%2FEfs4MzEVwIsg2Ni%2BVPOHlm58p65NpU1XhP72znP%2B7IWPwn%2FXX7En%2BVgW28s63f2kWr29m76Ys6xyXQpxUggNUfa4iv2uOen9c8t6J5it0t9as0uo4zyjLVDKf8l1oy5EL7TriGW30Lytp7Q6Dbs0d7xI4Oz%2FFWPlycmNvib%2BfKziufETs7WXahOn8Ph9dVIn6a7%2FewDzPd3ukNplzYtxtEhW2adVBKzRktTkalOdf%2BBw60bydZ%2BaNR%2FwARaPq0VjOIw509bcLIkw%2B16yh%2FjRm%2F3an28de6dLYTXGk6xDztpx8aHoyn7Lqfb9nI3YX%2BreQ9ThS3pcWhcvazMBWSE%2FbgaQ%2FF8P8AJlrrDvunvmryB9buFvzAtnrkQD84z%2B6mKHkGRtu%2F82HWnO%2BoadLpU5aC4ZeUL9Gil%2B0jKR0aOYZOLO80jzho0d3Zv6kMn2WFPUhlGxVh%2By6H7WQWaO80rV1hvwBMjcfUAoskTbLIP%2BNsIr5oSu10tfOt7Ikt4th5ijQC6hkSsdz6fwfWIiCCr7UmTj%2Fl5JG%2FKTSdTjg%2FxDILh4UCUgHD7P8Axafj45GPMdkYtRkvbWf6jewEXNhcr9ppT9pEVatJWnxJx%2BznRPIfmz%2FFujfW5Y%2FSvLZ%2Fq94gBCmQCvNQfiVX%2B1xb7OA2NleaX%2Fkr%2FA19Jb2rO%2BlXbc7UvuFbuvL%2Bb%2FiWC7M7HOuarpdrq9jLY3i8o5Bse6t2df8AKXOP6jbaj5dvpLK5USBd0fcB07Ov8cMT3qkP5l6trkWp2kNi8sVr6CShoyVDyH7RJHXj8OQpfNfmCN1%2BsXcsnBeCrOfUAUdFHP4uP052ny%2Fq2g6veR6T5hgX94Almsp%2Fdsw%2F3W%2F%2BU37GSHUfyp8n6hUpavZse8DkD%2FgH5p%2BGCXNeTwM%2BbzeWxtr%2B3SVHFGMZKMP8oBqr%2FwANh9qv5gpr3kVfLV9zk1O3uIjFOwrzt4w1GZhUeqn2P8rJD5i%2FJJrK2lvNKufrSx%2FEYCnCXiOtCpKPx%2F1M503lq7tpDxDNUUUGlPwyJtWQflfpMWseaFtLgssZtZnDJ1VhxCn3651e38qanp%2Bs2ZX95brKG%2BtR7UVfio6%2Fs16YS%2Fk3pGmWxvNR%2BspJqfEW7WnR4kryLFW3PqN%2FL%2FLnW8I2UsW8x%2BVo71n1LT0CXp3mjGwlp3%2F4yD%2Fhsgl9oyXUaxX1u8LoCY2dStV%2FaG%2Fgc7JTEbiztrr0zcRrIYmDxlhWjDJCXQoeVeW9Rv8Ay1PKL25kuNO9ELEo%2BIjgaoKk%2FAqJyzqtrdQXkCXNs3qQyqGjcdCCK7ZFPMPl1Yg95aLWA7zQjfjXqw%2FycB6JrNzY3BW7uAbARKgUqSQVIC8KfCq8K8vhxq9wlntK4DvtJ07UgBfW6TU6FhvTwqN8FRyRyoHiYOjCoZTUEHH5FDC9Y%2FL6wuSZ9Ic2M3X0tzEfo6p%2FscL9B%2FLy8XVJNS8y3Yuo41aKz0%2BEkQrGwoWlO3N2zomVTDZV4l5n8s3Plq94oS%2BnTk%2FVZj27%2Bk5%2FnX%2FhsMNI893Wj2ht2thNVSEp8PGSlBK%2F%2BSf286nqOnWmqWcllexiSGQbg9QezKf2WGco13yhdaVMUT95A39zL0DDwPg%2BIZc3pPlzU5dStGa4IaeNgGZaAFWHJWoMOc5v5E1B7Wf6tcAoD%2B5PLb3jP0fYzo4xIYrZIo5UaOVQ6MKMrCoIPtidrZ29lAttaoI4UrxQdBU1OL5sCsO8%2FwD5e6V5708RXNINQgB%2Bp3oFStf2JAKc4m%2F4XOIWX5R%2FmVoOpummwIySAxNMssZhZG2q3Mqen80eeoKZqYq8l8h%2Fk%2FceW9Qt9Z1DU3W4gPJLS0JCEGvwTytT1U3%2Bx6arnWs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F1%2B%2F5s2bFXZs2bFXZs2bFXZs2bFXUzZs2KuzZs2KoXUjILG49E0k4EKetK43TYkhsoQp5EqGZvEnvgp1DKVbdW2I9jhDdaDqT%2FuLLWJbOzP8AulEVnAPVVkb4hiqB8wWUXmS%2BXTYWQi3ikZphuUlqOKmn7P8ANnOtRsiPW0TWUKqD9ofajYfZkQ%2B3%2FDLnYtH0Wy0W3aC0BJc8pJHPJ2J8ThV5u8tJrdoZrdQL6EH0z0Lj%2BQ%2F8a4bTbxXQPMGq%2Fl9r7mSs9jcUN3Cv2Zo%2B1xD4Sp%2FzZnaNYhtfNmgRaho7JcMwE1pKCASP246%2Fsn%2BZf58gsugWWtaPFp1xRL21qFkFCyP3U96YR%2BUfMt7%2BX%2BqvpmqEtpUsnGeOtQjE0FxD%2FwAzUxOy%2B5kHmGCOa1s7%2BVeEsFYpHI3SvwyBvDi647RtH1by3qEXmPT5VlgnWmo2C1Amj6rIrH4RMnVcCz3FvJ5x1pIqX2h30cVy3ouv2nQEeka9XZW5ZJNPult7dbZpTLasP9HlYUalP7uVf2JlH2v%2BEw891ZzY3tvqNtHdWz84pBUHoQe6sP2WX9rC7zJoEOu2Xp7LdRVa3lPY90b%2FACHwi0IahBqtdOo9hKf9LjY0Vf8ALU%2F78ybZFD591jS3R3gnRo5Ymp4MjA9snHkr8weRi0LzJII7pQEtdQc0SYdFWQ%2Fsy%2F5X7eH%2FAJw8uLqMDX9qg%2BtRL%2B8Uf7sQf8bLnJbuyjcNFKnND1U%2Fw8Dh5pfQo3Gc487eVFhMmq2KfuHNbmNR%2Fdsf92KP5G%2Fa%2FlyPeXPM%2Fmfy2Y4pmk1PRqfBBKpNwiDr6E3%2B7OH8j51%2B1ubXU7JLiKklvcJWjDqrDdWH%2FEsV5PntoFiuUuQOFxFvHKpKsPpWnLJZ5b8w65p1xEguXuIp3q8d07P1%2FZVm%2Bx%2Fkccbr%2Bhm2125sbPggX95AZq8FRhy3p%2FL8Srk181aDHqempqtvRLu2hDngPheMDmV%2F2P2ozjsrKLW5ju4Eni%2By4rQ9Qe4OL5D%2FACp5hgu7iOwkkUXFxD6yx9DWM8HNMmGJFFDRFRQioPUHIhrmgrAXubdK2z19WOleFepH%2BRkwymCkUIqD1BxBpWIaNq09o31WURrZoiem32ePEheCIB8VV%2BLJcGB3BBHtka1LQXVne0XnC9eUQ%2B0tevHxXA2lxazHfW620rx2atW4gkSqFOPCgdvjDClVwkA7hWYZswzZFXYnNBFPG0UyCSNvtKwqDimbFWE6voE1hIbu0Be3BrQVLIP8rxXJRo92b3T4Z2%2B1Ti3zG1cGkAih3B7ZSRpGvCNQqjsooN8NquzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxViPmbyo91cfpvQiINVT%2B%2Bh6RXSD9iXwl%2F33N%2FwWQzW9AXXo%2FXaFg7L%2B%2BhK0mjdBuafzACjrnYcDTWNrPKk8kYMsZDI42NR40w3tRW3z1p2l6ho%2BotLAfXVE5OgDVljA%2BLj%2FxZGv7OS2BbeaRbscpI5YuLQq3ETIfiQcv2ZVP90%2F8AsMk3mi1FjqBnt0CpcIHIUU%2BNT8RFP5tuWRDTFEulwPaP9YjVSfVjBIFGPM%2F7BvHCOSXqXlu6trnTI1t7Y2Zj%2BGW1YhmQ%2BJcfb5fzYcZBPKl1I7GRXHKGi3AY%2FajPRvdsnQNd8BFFDjnL%2FPWhJaXguIKRw33KngklPi%2F2Pxcs6jkY892Ul3onqwoZJLWRZeAHIlT8D7fJsAVBaLpUeueS9PtriYPcWykQXkfZ4yVDD%2FJP2WwX5X1NJ2NrQIGXkoXpzQ8JP65GPJfmOTR5G0zXLmGCzlYmzhZPSeE05ceP7UTjfliOhagkWs3CW0gkUXbPZjoZVkY8kQHr8OSHUJZD540vmYtVRBIAvoTo260JrGzU7cvhzaJ5jgm0t9O1u7giu%2FRdY%2BJ48oyCg%2Fd9QyfZ%2FwArJhPBFcwvbzqHikBV0PQg9sgt%2FwCSLpJy9pxniPRiQsgH8rfzYB5ql%2Fkq1hXU4ZigNwjsizftemU3Uf5Jzp%2BRXyloF%2Fpj3FzqYiR3YraxREsyx%2FzTOaL6j%2Fyp8CZKsSUOzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Hv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVg35iPrMEFld6XbR3CRM%2Fro1fUIIHwx%2Fs4U%2FlrqOkz3c1lYQmENFJI8DCgRzIDIg5b1JavTOiajZLf2cls1KsKofBh9k5ydpJPL%2FmzT9ZcBIWY2t5sFoD8Ls5C1%2FwCDkyQ5KyjWdLGi6ml3brSyvKxuo6I58P8AJPVclOiXZurPi5rLAfTf5fsn7sE3drBqFq9vLR4pV2I7dwy%2B%2BF2j6Xf2F5dS3EqNbyhViVa8iV%2Fbfag6%2FZXBdj3KnWURXLzYFYV5n8n3us6ut7btEITGsbc6hl418B8WFd75Ym8svHqVqPrQiCsJSPiikH2jQfsNnScayhwVYBlOxB3BGG1Sby7rf6YgZ5KCZftIBSmHeFllodlp95LeWqlDMKGIfYB7kDDPE%2BSuzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F%2F0u%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZFfM%2BipLW%2BSJZAf71CtaMPsygf8SyVZRAIIO4PbCDW6pP5YvDd6Wiu1Zbc%2Bi%2B9Tt9mv%2Bxw5xG3tbe1Vlt41jDHkwUUqfE4tgPNXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Pv%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV%2F%2FZ');background-position:center center;border:1px solid #0a0}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-twourls.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-twourls.css deleted file mode 100644 index 222342f..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-twourls.css +++ /dev/null @@ -1,27 +0,0 @@ -.yui3-skin-night .yui3-dial-ring-vml, -.yui3-skin-night .yui3-dial-center-button-vml, -.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min, -.yui3-skin-night v\:oval.yui3-dial-marker-max-min, -.yui3-skin-night .yui3-dial-marker-vml, -.yui3-skin-night .yui3-dial-handle-vml { - background: none; - opacity:1; -} - -div.base64-singlequotes { - width:100px; - height:100px; - background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QAAAAAAAD5Q7t%2FAAAACXBIWXMAAA3WAAAN1gGQb3mcAAAFrUlEQVRYw%2B2Xz28kRxXHP%2B9Vdc8vj2fG9uIkm2yUeFGEhNCKQwBpj1yRUBAnpJU4ceZP4MxfkBxy2GO45bQXuEGQohUKigQ%2BsBBE1sbYXv8Yz%2FRMd9fjUN09PV5nFZA4kZZa79W3quu9er%2FqNfy%2FPwJgZty%2Ffz%2FZ29vrpmmqhlWTgmFg1UpbfWhYhG6Yq2cFi%2FNrj9nJyWnx%2BPHjeafbMTEzPvjVB9%2B6d%2B%2FezweDwV1BfHubivkC3lZya%2F4m7Np8UZYXhweHH7733rvvC0Kyv7%2F%2F7p07d34qIjyvr63RNb4l4CbsRUrNrq6OfvfRRz%2FxDx486A%2F6g7vXhX9ZIf%2Bp4JomaToZj8d7Pk1SFRFXb1aWodq09l%2F9YZu%2FCWMVL9e%2FaVFVQVUREEG8r3VUEZ4cX%2FHL30%2B5shRtAhFq4wggNb6GrXgVa2K2jYtACIHv7Sz54TfHjWWagBOBy0Xgt%2BcjLtwQxVCpNwURQat1DdYaT7pwdwKDFA6ncHgFizJmSb3WLPDa7PMIVlb2daqZxdONUnAetEojEdBGiXXhTmAjhZ0%2B3N6AlzeEROH1TXiWGf%2BcwmkWZYnAfAkdx1pq%2BhUbT9z3IElUJlVhI4WsgCLUyggi4MQYd4VXNmCYRqXOspV7UoHbQ3hpEMeLAk5mkFYRYlWI%2BHZ6CTDwkKSQqrA7gFeHMF3C6VyYLmFZGiKCE6GrMFsaWb7yuVOh66N1FkUUpBJ3TyvFovToBl9XMbNY2bZ70BsKfW94hbyErosmXpQwy4VgkCjMizjvRRik0EtiLNwagBf465lwOqtkETEn60XT1%2BlTazrpKlR%2BKkooy3Xfb3Wj3wGWJRQhnni7B53q5FqZ4%2FUR7PYhGMxyuMwgWVqTxrYWAwZYQX78J5i8ie9txSAkoOqqQAqk3pBgKLDhlY5XVKPCi3w97YRoKSFaceCgF2hqSXRBPQAIOcXRH8hP%2F0y6%2BRpWLrEyg3SbS9tmzggzJQSLQZo4xoOE8UbCsJfQ7zi6iaIizZ5OBVfXDKPireWC%2BvAYWOBqeszl9Jg03afbH6OqGH%2FBSUrqbrFIXiHoiEDC%2FPySi2d9nnZHJE7opY7dcY%2FdcZej84zpPGfY9Uw2ErYGCf2O4mUVEzELWtqUxZKjf3zK2cURzicMRy%2BzvbuH8ylFPqXIPqNczClKY1mUZFcnSDKkv%2FUNuptbWG%2BLw%2FMh%2FzrYpKBHKV3ONOXzYxeV20z49qhs7gaMWIjqQQiBxVXB4irg05yz4u%2FMpieoJuTLjDJfUJYBzBAFUUHkhMvLvzFPuvQ2JvQ3duh0R%2FjuiDQdIn6MJdvkxTafZUPuaN6UaOo6UNtgNl9weboguwqoA5fCjEusNCzE8LJQFRuNrzpQD%2BrmZNM55%2F4A5z1J2iHtDEg6fZK0j0uHlDrh2N4i3Ptuc%2BH5tjp5HliWQmmOUAhlYe0rqUqWSEOhcZ05AvE1UdColSQJaHWlSUYgJy%2FO2fFfo%2F34piphFOZ4OrvNdL5EJZbcmE8OQzFxIJEGEgIeE1%2FhrjJLxZcOrIVpVC7TW00WmLWyAMDEs%2Bi9wVJDtG17Y21vVmNxLKqIOkQqqoq2qHORmgj9UQcza7mgFm4GmiDjO5C72DSoQ6uPVTW%2BzuFUcQ2teKd4pzhd8b6Nu6jg7vZsrb1rClEIxhu7Q37x47fIy3j%2Fi8iqqlUuEWTFN%2FOrMU3fEEuhUM8FIPDqZgcRIVhsAXxtjGDGS5M%2BP%2Fv%2Bm7yopVrRVsPabsW%2BYG1T%2Fy3KahqSg6cHRb5cTmt5ZXhxQ7nS6yZsVWOajDFbw2JSCSGEIsuyC%2F%2Fo0aPp%2Fv7%2Br9NO5%2F5gMOhJLNn%2FpQLrLfw6tkKKorCDg4NPP%2Fnkjx%2FLOz96h2enzyZvf%2BftH9za2fm6qLrnO9tGk2vY86f%2FMliWZRdPnjz5zcOHDz%2B%2B%2Fifimorzv31C9X718G%2FYrCYSNJa5LgAAACJ6VFh0U29mdHdhcmUAAHjaKy8v18vMyy5OTixI1csvSgcANtgGWBBTylwAAAAASUVORK5CYII%3D'); - background-position:center center; - border:1px solid #00aa00; -} - -div.otherdataurl { - background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBQ0WDWwqwjwAAANMSURBVEjHrdZbaFxVFAbgb2aSTG6GTi6mVIwxNxF9qFI0RQnFUqiYamutVutLa2t9EY0oPggFoYgPRR%2FaghYviA%2BiIAYvmBJKoYWiiBCigVTT1FisbUhrEtNkJpc5PuQkjGEmJqkLFmdz2Hv%2Fa%2F3rX3tvlm95oS%2FLokuZtIpbdvAs7KFtL22wjb3V1C41upy2ke1DXC2k%2FBjv1HHXDrbkEamg7lX2P8QTldQ2UtfOB8uiJsHNiB%2Fik0GmO%2BgZIxgnGA59nGCMoJPeQaYP047iBDXZEohkAYof4%2FNyKlZRdR%2F1ASZCnoOMhWkUheMz9F1laJSRZ3gEqVw1ipZQjcoBRrbT3Ez9OJLhZkHG5CD8l8Q47qXhMZp%2FYxhVFaxBLBtQejdtA%2FTtZPMIJnOknI2WSYzicTYN8OtTvICZbECxdr5Pkm6iPL0C3c%2BgkfIJgi%2F4LnP%2FudRKD3K4jf1VJGLEAiuz6VnA4AGam1h7gpNIzSFe66D3NurLKVhJNkHo07N9V9BE3XHOYmyeuirqG1l9mdHgOkDSGd8%2FGWtg9Roa56lrYdchDtRQPLlCkEywKVRScDfrurnwC2diiPTRe47iVtbnLZDxckGCkKYpPM%2FRr3kbyRhsYOtRDiQonFoBSHrBOI18rOeOPvr76YrCeUbf5fTvjOddJ0gQ1uMPku9z6hwjiEZhgOMn%2BaaUeHQJIOkMD7KMA5QQP01HP18hPbfvDTvZPETqb2YiS1BWrozM6jk9SPJJHkZZ5qFagtoaNnbyZg1FE4sUPRdlAQpwkdSjvDZAJ%2FoxNt%2Bw6NlGbQVFl5iKLKKsXCAwyFQZ8S3ciu65ho1lBJ5%2FkZk3OBGjpJWGmVCmsjTkQvA8JHCUU7s5eImevzg%2Fd7BGFhzCARIf8uVN3J5Heh1VM%2BHlko2y%2FHBxF0NJolfo38eDuJJxbf0ro%2FnMurh8hM%2FupH4tdT8zciOFsTC8SAgQoJfRxKzCuvfw0k%2F8MDx7xqUyez%2BS48ESIN7Ky6OUpfAtrxzhx03UR4m0c%2FZF7tnKW2mma4l9yuthTSIZIvxPi6EcpZW0PM0xtOzjo%2Bf4GPfv4r1qNqAUFYs9diJLBC1CIa7FZx8fUlwI22LuNv%2FfLbKMAOftH9TwRXg6%2FiCDAAAAAElFTkSuQmCC"); -} - -.yui-skin-sam .yui-h-slider { - background: url(bg-h.gif) no-repeat 5px 0; - height: 28px; - width: 228px; -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-twourls.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-twourls.css.min deleted file mode 100644 index d919bca..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-base64-twourls.css.min +++ /dev/null @@ -1 +0,0 @@ -.yui3-skin-night .yui3-dial-ring-vml,.yui3-skin-night .yui3-dial-center-button-vml,.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,.yui3-skin-night v\:oval.yui3-dial-marker-max-min,.yui3-skin-night .yui3-dial-marker-vml,.yui3-skin-night .yui3-dial-handle-vml{background:0;opacity:1}div.base64-singlequotes{width:100px;height:100px;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QAAAAAAAD5Q7t%2FAAAACXBIWXMAAA3WAAAN1gGQb3mcAAAFrUlEQVRYw%2B2Xz28kRxXHP%2B9Vdc8vj2fG9uIkm2yUeFGEhNCKQwBpj1yRUBAnpJU4ceZP4MxfkBxy2GO45bQXuEGQohUKigQ%2BsBBE1sbYXv8Yz%2FRMd9fjUN09PV5nFZA4kZZa79W3quu9er%2FqNfy%2FPwJgZty%2Ffz%2FZ29vrpmmqhlWTgmFg1UpbfWhYhG6Yq2cFi%2FNrj9nJyWnx%2BPHjeafbMTEzPvjVB9%2B6d%2B%2FezweDwV1BfHubivkC3lZya%2F4m7Np8UZYXhweHH7733rvvC0Kyv7%2F%2F7p07d34qIjyvr63RNb4l4CbsRUrNrq6OfvfRRz%2FxDx486A%2F6g7vXhX9ZIf%2Bp4JomaToZj8d7Pk1SFRFXb1aWodq09l%2F9YZu%2FCWMVL9e%2FaVFVQVUREEG8r3VUEZ4cX%2FHL30%2B5shRtAhFq4wggNb6GrXgVa2K2jYtACIHv7Sz54TfHjWWagBOBy0Xgt%2BcjLtwQxVCpNwURQat1DdYaT7pwdwKDFA6ncHgFizJmSb3WLPDa7PMIVlb2daqZxdONUnAetEojEdBGiXXhTmAjhZ0%2B3N6AlzeEROH1TXiWGf%2BcwmkWZYnAfAkdx1pq%2BhUbT9z3IElUJlVhI4WsgCLUyggi4MQYd4VXNmCYRqXOspV7UoHbQ3hpEMeLAk5mkFYRYlWI%2BHZ6CTDwkKSQqrA7gFeHMF3C6VyYLmFZGiKCE6GrMFsaWb7yuVOh66N1FkUUpBJ3TyvFovToBl9XMbNY2bZ70BsKfW94hbyErosmXpQwy4VgkCjMizjvRRik0EtiLNwagBf465lwOqtkETEn60XT1%2BlTazrpKlR%2BKkooy3Xfb3Wj3wGWJRQhnni7B53q5FqZ4%2FUR7PYhGMxyuMwgWVqTxrYWAwZYQX78J5i8ie9txSAkoOqqQAqk3pBgKLDhlY5XVKPCi3w97YRoKSFaceCgF2hqSXRBPQAIOcXRH8hP%2F0y6%2BRpWLrEyg3SbS9tmzggzJQSLQZo4xoOE8UbCsJfQ7zi6iaIizZ5OBVfXDKPireWC%2BvAYWOBqeszl9Jg03afbH6OqGH%2FBSUrqbrFIXiHoiEDC%2FPySi2d9nnZHJE7opY7dcY%2FdcZej84zpPGfY9Uw2ErYGCf2O4mUVEzELWtqUxZKjf3zK2cURzicMRy%2BzvbuH8ylFPqXIPqNczClKY1mUZFcnSDKkv%2FUNuptbWG%2BLw%2FMh%2FzrYpKBHKV3ONOXzYxeV20z49qhs7gaMWIjqQQiBxVXB4irg05yz4u%2FMpieoJuTLjDJfUJYBzBAFUUHkhMvLvzFPuvQ2JvQ3duh0R%2FjuiDQdIn6MJdvkxTafZUPuaN6UaOo6UNtgNl9weboguwqoA5fCjEusNCzE8LJQFRuNrzpQD%2BrmZNM55%2F4A5z1J2iHtDEg6fZK0j0uHlDrh2N4i3Ptuc%2BH5tjp5HliWQmmOUAhlYe0rqUqWSEOhcZ05AvE1UdColSQJaHWlSUYgJy%2FO2fFfo%2F34piphFOZ4OrvNdL5EJZbcmE8OQzFxIJEGEgIeE1%2FhrjJLxZcOrIVpVC7TW00WmLWyAMDEs%2Bi9wVJDtG17Y21vVmNxLKqIOkQqqoq2qHORmgj9UQcza7mgFm4GmiDjO5C72DSoQ6uPVTW%2BzuFUcQ2teKd4pzhd8b6Nu6jg7vZsrb1rClEIxhu7Q37x47fIy3j%2Fi8iqqlUuEWTFN%2FOrMU3fEEuhUM8FIPDqZgcRIVhsAXxtjGDGS5M%2BP%2Fv%2Bm7yopVrRVsPabsW%2BYG1T%2Fy3KahqSg6cHRb5cTmt5ZXhxQ7nS6yZsVWOajDFbw2JSCSGEIsuyC%2F%2Fo0aPp%2Fv7%2Br9NO5%2F5gMOhJLNn%2FpQLrLfw6tkKKorCDg4NPP%2Fnkjx%2FLOz96h2enzyZvf%2BftH9za2fm6qLrnO9tGk2vY86f%2FMliWZRdPnjz5zcOHDz%2B%2B%2Fifimorzv31C9X718G%2FYrCYSNJa5LgAAACJ6VFh0U29mdHdhcmUAAHjaKy8v18vMyy5OTixI1csvSgcANtgGWBBTylwAAAAASUVORK5CYII%3D');background-position:center center;border:1px solid #0a0}div.otherdataurl{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBQ0WDWwqwjwAAANMSURBVEjHrdZbaFxVFAbgb2aSTG6GTi6mVIwxNxF9qFI0RQnFUqiYamutVutLa2t9EY0oPggFoYgPRR%2FaghYviA%2BiIAYvmBJKoYWiiBCigVTT1FisbUhrEtNkJpc5PuQkjGEmJqkLFmdz2Hv%2Fa%2F3rX3tvlm95oS%2FLokuZtIpbdvAs7KFtL22wjb3V1C41upy2ke1DXC2k%2FBjv1HHXDrbkEamg7lX2P8QTldQ2UtfOB8uiJsHNiB%2Fik0GmO%2BgZIxgnGA59nGCMoJPeQaYP047iBDXZEohkAYof4%2FNyKlZRdR%2F1ASZCnoOMhWkUheMz9F1laJSRZ3gEqVw1ipZQjcoBRrbT3Ez9OJLhZkHG5CD8l8Q47qXhMZp%2FYxhVFaxBLBtQejdtA%2FTtZPMIJnOknI2WSYzicTYN8OtTvICZbECxdr5Pkm6iPL0C3c%2BgkfIJgi%2F4LnP%2FudRKD3K4jf1VJGLEAiuz6VnA4AGam1h7gpNIzSFe66D3NurLKVhJNkHo07N9V9BE3XHOYmyeuirqG1l9mdHgOkDSGd8%2FGWtg9Roa56lrYdchDtRQPLlCkEywKVRScDfrurnwC2diiPTRe47iVtbnLZDxckGCkKYpPM%2FRr3kbyRhsYOtRDiQonFoBSHrBOI18rOeOPvr76YrCeUbf5fTvjOddJ0gQ1uMPku9z6hwjiEZhgOMn%2BaaUeHQJIOkMD7KMA5QQP01HP18hPbfvDTvZPETqb2YiS1BWrozM6jk9SPJJHkZZ5qFagtoaNnbyZg1FE4sUPRdlAQpwkdSjvDZAJ%2FoxNt%2Bw6NlGbQVFl5iKLKKsXCAwyFQZ8S3ciu65ho1lBJ5%2FkZk3OBGjpJWGmVCmsjTkQvA8JHCUU7s5eImevzg%2Fd7BGFhzCARIf8uVN3J5Heh1VM%2BHlko2y%2FHBxF0NJolfo38eDuJJxbf0ro%2FnMurh8hM%2FupH4tdT8zciOFsTC8SAgQoJfRxKzCuvfw0k%2F8MDx7xqUyez%2BS48ESIN7Ky6OUpfAtrxzhx03UR4m0c%2FZF7tnKW2mma4l9yuthTSIZIvxPi6EcpZW0PM0xtOzjo%2Bf4GPfv4r1qNqAUFYs9diJLBC1CIa7FZx8fUlwI22LuNv%2FfLbKMAOftH9TwRXg6%2FiCDAAAAAElFTkSuQmCC")}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-dbquote-font.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-dbquote-font.css deleted file mode 100644 index f9799d7..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-dbquote-font.css +++ /dev/null @@ -1,30 +0,0 @@ -/*csslint fontfamily: true*/ - -/** - * Foo - */ - -.y-ff-1 { - font-family:"Foo Bar",Helvetica,Arial; - text-rendering: optimizeLegibility; -} - -.ua-op .y-ff-1 { - /* Some Comment */ - font-family:Helvetica,Arial; -} - -/* -Foo - -Bar -*/ - -@font-face { - font-family: "Foo Bar"; - src: url("data:font/truetype;base64,gRbIUFAIrsQNGditEWbAUKwAA") format("truetype"), - url("http://yuilibrary.com/fonts/foo-bar.svg#webfontse22fewwr") format("svg"); - font-weight: normal; - font-style: normal; -} - diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-dbquote-font.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-dbquote-font.css.min deleted file mode 100644 index 7c4c0ed..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-dbquote-font.css.min +++ /dev/null @@ -1,5 +0,0 @@ -.y-ff-1{font-family:"Foo Bar",Helvetica,Arial;text-rendering:optimizeLegibility}.ua-op .y-ff-1{font-family:Helvetica,Arial}@font-face{font-family:"Foo Bar";src:url("data:font/truetype;base64,gRbIUFAIrsQNGditEWbAUKwAA") format("truetype"),url("http://yuilibrary.com/fonts/foo-bar.svg#webfontse22fewwr") format("svg");font-weight:normal;font-style:normal} - - - - diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-nonbase64-doublequotes.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-nonbase64-doublequotes.css deleted file mode 100644 index 0d45c94..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-nonbase64-doublequotes.css +++ /dev/null @@ -1,13 +0,0 @@ -div.nonbase64-doublequotes { - width:100px; - height:100px; - background-image:url( - "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0C%00%00%00%0E%08%03%00%00%00%2Cc%0D%DE%00%00%00%A2PLTEQQQ%FA%FA%FA%FC%FC%FC%EE%EE%EE%A9%A9%A9%E9%E9%E9%0A%0A%0A%0D%0D%0D444PPP%CD%CD%CD%CC%CC%CC%F5%F5%F5UUU%D0%D0%D0'''%F9%F9%F9%A6%A6%A6%40%40%40FFF%A0%A0%A0%89%89%89%8D%8D%8D%20%20%20%14%14%14%DA%DA%DA%B6%B6%B6%02%02%02%87%87%87%81%81%81%AC%AC%AC%0E%0E%0E111%7D%7D%7D%92%92%92333%B9%B9%B9%BC%BC%BChhh)))%E1%E1%E1%03%03%03%CB%CB%CB%EB%EB%EB%FD%FD%FD%A3%A3%A3(((%04%04%04%CA%CA%CAttt%2C%2C%2C%F4%F4%F4%00%00%00%FF%FF%FF%D6%DE%02%C3%00%00%006tRNS%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%A1%8FN1%00%00%00iIDAT%08%D7E%C7E%16%02Q%10%C5%D0j%C3%DD%BDqw%5E%F6%BF5%06%D4%3Fd%94kx%BDf%DE6%FFIA%AB%C8qYj%1F%E3Xk%93%E0%C8JZ%10%90%9E%3A1%60%BBY%85%A8%AE%14%C0%5E%1A6%8E%C5w%02%60%99%C9%FA%9A%03%60%8C%EFz%8C%CE%0EnSu%3F%01%AD%B2%06%04%F0%3CT%FF%B8nk%3F%7C%01%C5z%1B%F9%26%2F%3Az%00%00%00%00IEND%AEB%60%82" - ); - border:1px solid #00aa00; -} - -span.othercss { - font-family:"Times New Roman"; - font-weight:inherit; -} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-nonbase64-doublequotes.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-nonbase64-doublequotes.css.min deleted file mode 100644 index 1acc41d..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-nonbase64-doublequotes.css.min +++ /dev/null @@ -1 +0,0 @@ -div.nonbase64-doublequotes{width:100px;height:100px;background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0C%00%00%00%0E%08%03%00%00%00%2Cc%0D%DE%00%00%00%A2PLTEQQQ%FA%FA%FA%FC%FC%FC%EE%EE%EE%A9%A9%A9%E9%E9%E9%0A%0A%0A%0D%0D%0D444PPP%CD%CD%CD%CC%CC%CC%F5%F5%F5UUU%D0%D0%D0'''%F9%F9%F9%A6%A6%A6%40%40%40FFF%A0%A0%A0%89%89%89%8D%8D%8D%20%20%20%14%14%14%DA%DA%DA%B6%B6%B6%02%02%02%87%87%87%81%81%81%AC%AC%AC%0E%0E%0E111%7D%7D%7D%92%92%92333%B9%B9%B9%BC%BC%BChhh)))%E1%E1%E1%03%03%03%CB%CB%CB%EB%EB%EB%FD%FD%FD%A3%A3%A3(((%04%04%04%CA%CA%CAttt%2C%2C%2C%F4%F4%F4%00%00%00%FF%FF%FF%D6%DE%02%C3%00%00%006tRNS%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%A1%8FN1%00%00%00iIDAT%08%D7E%C7E%16%02Q%10%C5%D0j%C3%DD%BDqw%5E%F6%BF5%06%D4%3Fd%94kx%BDf%DE6%FFIA%AB%C8qYj%1F%E3Xk%93%E0%C8JZ%10%90%9E%3A1%60%BBY%85%A8%AE%14%C0%5E%1A6%8E%C5w%02%60%99%C9%FA%9A%03%60%8C%EFz%8C%CE%0EnSu%3F%01%AD%B2%06%04%F0%3CT%FF%B8nk%3F%7C%01%C5z%1B%F9%26%2F%3Az%00%00%00%00IEND%AEB%60%82");border:1px solid #0a0}span.othercss{font-family:"Times New Roman";font-weight:inherit} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-nonbase64-noquotes.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-nonbase64-noquotes.css deleted file mode 100644 index b4bc9b2..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-nonbase64-noquotes.css +++ /dev/null @@ -1,11 +0,0 @@ -div.nonbase64-noquotes { - width:100px; - height:100px; - background-image:url( data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0C%00%00%00%0E%08%03%00%00%00%2Cc%0D%DE%00%00%00%A2PLTEQQQ%FA%FA%FA%FC%FC%FC%EE%EE%EE%A9%A9%A9%E9%E9%E9%0A%0A%0A%0D%0D%0D444PPP%CD%CD%CD%CC%CC%CC%F5%F5%F5UUU%D0%D0%D0\'\'\'%F9%F9%F9%A6%A6%A6%40%40%40FFF%A0%A0%A0%89%89%89%8D%8D%8D%20%20%20%14%14%14%DA%DA%DA%B6%B6%B6%02%02%02%87%87%87%81%81%81%AC%AC%AC%0E%0E%0E111%7D%7D%7D%92%92%92333%B9%B9%B9%BC%BC%BChhh\)\)\)%E1%E1%E1%03%03%03%CB%CB%CB%EB%EB%EB%FD%FD%FD%A3%A3%A3\(\(\(%04%04%04%CA%CA%CAttt%2C%2C%2C%F4%F4%F4%00%00%00%FF%FF%FF%D6%DE%02%C3%00%00%006tRNS%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%A1%8FN1%00%00%00iIDAT%08%D7E%C7E%16%02Q%10%C5%D0j%C3%DD%BDqw%5E%F6%BF5%06%D4%3Fd%94kx%BDf%DE6%FFIA%AB%C8qYj%1F%E3Xk%93%E0%C8JZ%10%90%9E%3A1%60%BBY%85%A8%AE%14%C0%5E%1A6%8E%C5w%02%60%99%C9%FA%9A%03%60%8C%EFz%8C%CE%0EnSu%3F%01%AD%B2%06%04%F0%3CT%FF%B8nk%3F%7C%01%C5z%1B%F9%26%2F%3Az%00%00%00%00IEND%AEB%60%82 ); - border:1px solid red; -} - -span.othercss { - font-family:"Times New Roman"; - font-weight:inherit; -} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-nonbase64-noquotes.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-nonbase64-noquotes.css.min deleted file mode 100644 index 8f4bf08..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-nonbase64-noquotes.css.min +++ /dev/null @@ -1 +0,0 @@ -div.nonbase64-noquotes{width:100px;height:100px;background-image:url(data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0C%00%00%00%0E%08%03%00%00%00%2Cc%0D%DE%00%00%00%A2PLTEQQQ%FA%FA%FA%FC%FC%FC%EE%EE%EE%A9%A9%A9%E9%E9%E9%0A%0A%0A%0D%0D%0D444PPP%CD%CD%CD%CC%CC%CC%F5%F5%F5UUU%D0%D0%D0\'\'\'%F9%F9%F9%A6%A6%A6%40%40%40FFF%A0%A0%A0%89%89%89%8D%8D%8D%20%20%20%14%14%14%DA%DA%DA%B6%B6%B6%02%02%02%87%87%87%81%81%81%AC%AC%AC%0E%0E%0E111%7D%7D%7D%92%92%92333%B9%B9%B9%BC%BC%BChhh\)\)\)%E1%E1%E1%03%03%03%CB%CB%CB%EB%EB%EB%FD%FD%FD%A3%A3%A3\(\(\(%04%04%04%CA%CA%CAttt%2C%2C%2C%F4%F4%F4%00%00%00%FF%FF%FF%D6%DE%02%C3%00%00%006tRNS%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%A1%8FN1%00%00%00iIDAT%08%D7E%C7E%16%02Q%10%C5%D0j%C3%DD%BDqw%5E%F6%BF5%06%D4%3Fd%94kx%BDf%DE6%FFIA%AB%C8qYj%1F%E3Xk%93%E0%C8JZ%10%90%9E%3A1%60%BBY%85%A8%AE%14%C0%5E%1A6%8E%C5w%02%60%99%C9%FA%9A%03%60%8C%EFz%8C%CE%0EnSu%3F%01%AD%B2%06%04%F0%3CT%FF%B8nk%3F%7C%01%C5z%1B%F9%26%2F%3Az%00%00%00%00IEND%AEB%60%82);border:1px solid red}span.othercss{font-family:"Times New Roman";font-weight:inherit} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-nonbase64-singlequotes.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-nonbase64-singlequotes.css deleted file mode 100644 index 0488549..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-nonbase64-singlequotes.css +++ /dev/null @@ -1,15 +0,0 @@ -/* Some Comment */ - -div.nonbase64-singlequotes { - width:100px; - height:100px; - background-image:url('data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0C%00%00%00%0E%08%03%00%00%00%2Cc%0D%DE%00%00%00%A2PLTEQQQ%FA%FA%FA%FC%FC%FC%EE%EE%EE%A9%A9%A9%E9%E9%E9%0A%0A%0A%0D%0D%0D444PPP%CD%CD%CD%CC%CC%CC%F5%F5%F5UUU%D0%D0%D0\'\'\'%F9%F9%F9%A6%A6%A6%40%40%40FFF%A0%A0%A0%89%89%89%8D%8D%8D%20%20%20%14%14%14%DA%DA%DA%B6%B6%B6%02%02%02%87%87%87%81%81%81%AC%AC%AC%0E%0E%0E111%7D%7D%7D%92%92%92333%B9%B9%B9%BC%BC%BChhh)))%E1%E1%E1%03%03%03%CB%CB%CB%EB%EB%EB%FD%FD%FD%A3%A3%A3(((%04%04%04%CA%CA%CAttt%2C%2C%2C%F4%F4%F4%00%00%00%FF%FF%FF%D6%DE%02%C3%00%00%006tRNS%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%A1%8FN1%00%00%00iIDAT%08%D7E%C7E%16%02Q%10%C5%D0j%C3%DD%BDqw%5E%F6%BF5%06%D4%3Fd%94kx%BDf%DE6%FFIA%AB%C8qYj%1F%E3Xk%93%E0%C8JZ%10%90%9E%3A1%60%BBY%85%A8%AE%14%C0%5E%1A6%8E%C5w%02%60%99%C9%FA%9A%03%60%8C%EFz%8C%CE%0EnSu%3F%01%AD%B2%06%04%F0%3CT%FF%B8nk%3F%7C%01%C5z%1B%F9%26%2F%3Az%00%00%00%00IEND%AEB%60%82'); - border:1px solid #0000aa; -} - -/* Some Other Comment */ - -span.othercss { - font-family:"Times New Roman"; - font-weight:inherit; -} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-nonbase64-singlequotes.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-nonbase64-singlequotes.css.min deleted file mode 100644 index badbf06..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-nonbase64-singlequotes.css.min +++ /dev/null @@ -1,2 +0,0 @@ -div.nonbase64-singlequotes{width:100px;height:100px;background-image:url('data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0C%00%00%00%0E%08%03%00%00%00%2Cc%0D%DE%00%00%00%A2PLTEQQQ%FA%FA%FA%FC%FC%FC%EE%EE%EE%A9%A9%A9%E9%E9%E9%0A%0A%0A%0D%0D%0D444PPP%CD%CD%CD%CC%CC%CC%F5%F5%F5UUU%D0%D0%D0\'\'\'%F9%F9%F9%A6%A6%A6%40%40%40FFF%A0%A0%A0%89%89%89%8D%8D%8D%20%20%20%14%14%14%DA%DA%DA%B6%B6%B6%02%02%02%87%87%87%81%81%81%AC%AC%AC%0E%0E%0E111%7D%7D%7D%92%92%92333%B9%B9%B9%BC%BC%BChhh)))%E1%E1%E1%03%03%03%CB%CB%CB%EB%EB%EB%FD%FD%FD%A3%A3%A3(((%04%04%04%CA%CA%CAttt%2C%2C%2C%F4%F4%F4%00%00%00%FF%FF%FF%D6%DE%02%C3%00%00%006tRNS%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%A1%8FN1%00%00%00iIDAT%08%D7E%C7E%16%02Q%10%C5%D0j%C3%DD%BDqw%5E%F6%BF5%06%D4%3Fd%94kx%BDf%DE6%FFIA%AB%C8qYj%1F%E3Xk%93%E0%C8JZ%10%90%9E%3A1%60%BBY%85%A8%AE%14%C0%5E%1A6%8E%C5w%02%60%99%C9%FA%9A%03%60%8C%EFz%8C%CE%0EnSu%3F%01%AD%B2%06%04%F0%3CT%FF%B8nk%3F%7C%01%C5z%1B%F9%26%2F%3Az%00%00%00%00IEND%AEB%60%82');border:1px solid #00a}span.othercss{font-family:"Times New Roman";font-weight:inherit} - diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-noquote-multiline-font.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-noquote-multiline-font.css deleted file mode 100644 index 722c7ed..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-noquote-multiline-font.css +++ /dev/null @@ -1,31 +0,0 @@ -/*csslint fontfamily: true*/ - -/** - * Foo - */ - -.y-ff-1 { - font-family:"Foo Bar",Helvetica,Arial; - text-rendering: optimizeLegibility; -} - -.ua-op .y-ff-1 { - /* Some Comment */ - font-family:Helvetica,Arial; -} - -/* -Foo - -Bar -*/ - -@font-face { - font-family: "Foo Bar"; - src: url( - data:font/truetype;base64,gRbIUFAIrsQNGditEWbAUKwAA) format("truetype"), - url("http://yuilibrary.com/fonts/foo-bar.svg#webfontse22fewwr") format("svg"); - font-weight: normal; - font-style: normal; -} - diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-noquote-multiline-font.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-noquote-multiline-font.css.min deleted file mode 100644 index 6b32e33..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-noquote-multiline-font.css.min +++ /dev/null @@ -1,3 +0,0 @@ -.y-ff-1{font-family:"Foo Bar",Helvetica,Arial;text-rendering:optimizeLegibility}.ua-op .y-ff-1{font-family:Helvetica,Arial}@font-face{font-family:"Foo Bar";src:url(data:font/truetype;base64,gRbIUFAIrsQNGditEWbAUKwAA) format("truetype"),url("http://yuilibrary.com/fonts/foo-bar.svg#webfontse22fewwr") format("svg");font-weight:normal;font-style:normal} - - diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-doublequotes.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-doublequotes.css deleted file mode 100644 index e86097c..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-doublequotes.css +++ /dev/null @@ -1,90 +0,0 @@ -.yui3-skin-sam .yui3-scrollview-scrollbar { - -webkit-transform: translate3d(0, 0, 0); - -moz-transform: translate(0, 0); -} - -.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first, -.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle, -.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last { - border-radius:3px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg=="); -} - -.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first, -.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last { - border-bottom-right-radius:0; - border-bottom-left-radius:0; - - -webkit-border-bottom-right-radius:0; - -webkit-border-bottom-left-radius:0; - - -moz-border-radius-bottomright:0; - -moz-border-radius-bottomleft:0; -} - -.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last { - border-radius:0; - border-bottom-right-radius:3px; - border-bottom-left-radius:3px; - - -webkit-border-radius:0; - -webkit-border-bottom-right-radius:3px; - -webkit-border-bottom-left-radius:3px; - -webkit-transform: translate3d(0, 0, 0); - - -moz-border-radius:0; - -moz-border-radius-bottomright:3px; - -moz-border-radius-bottomleft:3px; - -moz-transform: translate(0, 0); -} - -.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle { - border-radius:0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - - -webkit-transform: translate3d(0,0,0) scaleY(1); - -webkit-transform-origin-y: 0; - - -moz-transform: translate(0,0) scaleY(1); - -moz-transform-origin: 0 0; -} - -.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first, -.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last { - border-top-right-radius: 0; - border-bottom-left-radius: 3px; - - -webkit-border-top-right-radius: 0; - -webkit-border-bottom-left-radius: 3px; - - -moz-border-radius-topright: 0; - -moz-border-radius-bottomleft: 3px; -} - -.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last { - border-bottom-left-radius: 0; - border-top-right-radius: 3px; - - -webkit-border-bottom-left-radius: 0; - -webkit-border-top-right-radius: 3px; - - -moz-border-radius-bottomleft: 0; - -moz-border-radius-topright: 3px; -} - -.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle { - -webkit-transform: translate3d(0,0,0) scaleX(1); - -webkit-transform-origin: 0 0; - - -moz-transform: translate(0,0) scaleX(1); - -moz-transform-origin: 0 0; -} - -.yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child, -.yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child { - background-color: #aaa; - background-image: none; -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-doublequotes.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-doublequotes.css.min deleted file mode 100644 index f9e7600..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-doublequotes.css.min +++ /dev/null @@ -1 +0,0 @@ -.yui3-skin-sam .yui3-scrollview-scrollbar{-webkit-transform:translate3d(0,0,0);-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:3px;-webkit-border-radius:3px;-moz-border-radius:3px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg==")}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-bottom-right-radius:0;border-bottom-left-radius:0;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;-webkit-border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;-webkit-transform:translate3d(0,0,0);-moz-border-radius:0;-moz-border-radius-bottomright:3px;-moz-border-radius-bottomleft:3px;-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle{border-radius:0;-webkit-border-radius:0;-moz-border-radius:0;-webkit-transform:translate3d(0,0,0) scaleY(1);-webkit-transform-origin-y:0;-moz-transform:translate(0,0) scaleY(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-top-right-radius:0;border-bottom-left-radius:3px;-webkit-border-top-right-radius:0;-webkit-border-bottom-left-radius:3px;-moz-border-radius-topright:0;-moz-border-radius-bottomleft:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-bottom-left-radius:0;border-top-right-radius:3px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:3px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle{-webkit-transform:translate3d(0,0,0) scaleX(1);-webkit-transform-origin:0 0;-moz-transform:translate(0,0) scaleX(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child{background-color:#aaa;background-image:none} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-noquotes.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-noquotes.css deleted file mode 100644 index ddf720e..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-noquotes.css +++ /dev/null @@ -1,90 +0,0 @@ -.yui3-skin-sam .yui3-scrollview-scrollbar { - -webkit-transform: translate3d(0, 0, 0); - -moz-transform: translate(0, 0); -} - -.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first, -.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle, -.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last { - border-radius:3px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg==); -} - -.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first, -.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last { - border-bottom-right-radius:0; - border-bottom-left-radius:0; - - -webkit-border-bottom-right-radius:0; - -webkit-border-bottom-left-radius:0; - - -moz-border-radius-bottomright:0; - -moz-border-radius-bottomleft:0; -} - -.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last { - border-radius:0; - border-bottom-right-radius:3px; - border-bottom-left-radius:3px; - - -webkit-border-radius:0; - -webkit-border-bottom-right-radius:3px; - -webkit-border-bottom-left-radius:3px; - -webkit-transform: translate3d(0, 0, 0); - - -moz-border-radius:0; - -moz-border-radius-bottomright:3px; - -moz-border-radius-bottomleft:3px; - -moz-transform: translate(0, 0); -} - -.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle { - border-radius:0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - - -webkit-transform: translate3d(0,0,0) scaleY(1); - -webkit-transform-origin-y: 0; - - -moz-transform: translate(0,0) scaleY(1); - -moz-transform-origin: 0 0; -} - -.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first, -.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last { - border-top-right-radius: 0; - border-bottom-left-radius: 3px; - - -webkit-border-top-right-radius: 0; - -webkit-border-bottom-left-radius: 3px; - - -moz-border-radius-topright: 0; - -moz-border-radius-bottomleft: 3px; -} - -.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last { - border-bottom-left-radius: 0; - border-top-right-radius: 3px; - - -webkit-border-bottom-left-radius: 0; - -webkit-border-top-right-radius: 3px; - - -moz-border-radius-bottomleft: 0; - -moz-border-radius-topright: 3px; -} - -.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle { - -webkit-transform: translate3d(0,0,0) scaleX(1); - -webkit-transform-origin: 0 0; - - -moz-transform: translate(0,0) scaleX(1); - -moz-transform-origin: 0 0; -} - -.yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child, -.yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child { - background-color: #aaa; - background-image: none; -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-noquotes.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-noquotes.css.min deleted file mode 100644 index 110f9fc..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-noquotes.css.min +++ /dev/null @@ -1 +0,0 @@ -.yui3-skin-sam .yui3-scrollview-scrollbar{-webkit-transform:translate3d(0,0,0);-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:3px;-webkit-border-radius:3px;-moz-border-radius:3px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg==)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-bottom-right-radius:0;border-bottom-left-radius:0;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;-webkit-border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;-webkit-transform:translate3d(0,0,0);-moz-border-radius:0;-moz-border-radius-bottomright:3px;-moz-border-radius-bottomleft:3px;-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle{border-radius:0;-webkit-border-radius:0;-moz-border-radius:0;-webkit-transform:translate3d(0,0,0) scaleY(1);-webkit-transform-origin-y:0;-moz-transform:translate(0,0) scaleY(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-top-right-radius:0;border-bottom-left-radius:3px;-webkit-border-top-right-radius:0;-webkit-border-bottom-left-radius:3px;-moz-border-radius-topright:0;-moz-border-radius-bottomleft:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-bottom-left-radius:0;border-top-right-radius:3px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:3px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle{-webkit-transform:translate3d(0,0,0) scaleX(1);-webkit-transform-origin:0 0;-moz-transform:translate(0,0) scaleX(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child{background-color:#aaa;background-image:none} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-singlequotes.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-singlequotes.css deleted file mode 100644 index 9d6ec7a..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-singlequotes.css +++ /dev/null @@ -1,90 +0,0 @@ -.yui3-skin-sam .yui3-scrollview-scrollbar { - -webkit-transform: translate3d(0, 0, 0); - -moz-transform: translate(0, 0); -} - -.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first, -.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle, -.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last { - border-radius:3px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg=='); -} - -.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first, -.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last { - border-bottom-right-radius:0; - border-bottom-left-radius:0; - - -webkit-border-bottom-right-radius:0; - -webkit-border-bottom-left-radius:0; - - -moz-border-radius-bottomright:0; - -moz-border-radius-bottomleft:0; -} - -.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last { - border-radius:0; - border-bottom-right-radius:3px; - border-bottom-left-radius:3px; - - -webkit-border-radius:0; - -webkit-border-bottom-right-radius:3px; - -webkit-border-bottom-left-radius:3px; - -webkit-transform: translate3d(0, 0, 0); - - -moz-border-radius:0; - -moz-border-radius-bottomright:3px; - -moz-border-radius-bottomleft:3px; - -moz-transform: translate(0, 0); -} - -.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle { - border-radius:0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - - -webkit-transform: translate3d(0,0,0) scaleY(1); - -webkit-transform-origin-y: 0; - - -moz-transform: translate(0,0) scaleY(1); - -moz-transform-origin: 0 0; -} - -.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first, -.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last { - border-top-right-radius: 0; - border-bottom-left-radius: 3px; - - -webkit-border-top-right-radius: 0; - -webkit-border-bottom-left-radius: 3px; - - -moz-border-radius-topright: 0; - -moz-border-radius-bottomleft: 3px; -} - -.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last { - border-bottom-left-radius: 0; - border-top-right-radius: 3px; - - -webkit-border-bottom-left-radius: 0; - -webkit-border-top-right-radius: 3px; - - -moz-border-radius-bottomleft: 0; - -moz-border-radius-topright: 3px; -} - -.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle { - -webkit-transform: translate3d(0,0,0) scaleX(1); - -webkit-transform-origin: 0 0; - - -moz-transform: translate(0,0) scaleX(1); - -moz-transform-origin: 0 0; -} - -.yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child, -.yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child { - background-color: #aaa; - background-image: none; -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-singlequotes.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-singlequotes.css.min deleted file mode 100644 index 1a4e2c6..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-singlequotes.css.min +++ /dev/null @@ -1 +0,0 @@ -.yui3-skin-sam .yui3-scrollview-scrollbar{-webkit-transform:translate3d(0,0,0);-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:3px;-webkit-border-radius:3px;-moz-border-radius:3px;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg==')}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-bottom-right-radius:0;border-bottom-left-radius:0;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;-webkit-border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;-webkit-transform:translate3d(0,0,0);-moz-border-radius:0;-moz-border-radius-bottomright:3px;-moz-border-radius-bottomleft:3px;-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle{border-radius:0;-webkit-border-radius:0;-moz-border-radius:0;-webkit-transform:translate3d(0,0,0) scaleY(1);-webkit-transform-origin-y:0;-moz-transform:translate(0,0) scaleY(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-top-right-radius:0;border-bottom-left-radius:3px;-webkit-border-top-right-radius:0;-webkit-border-bottom-left-radius:3px;-moz-border-radius-topright:0;-moz-border-radius-bottomleft:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-bottom-left-radius:0;border-top-right-radius:3px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:3px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle{-webkit-transform:translate3d(0,0,0) scaleX(1);-webkit-transform-origin:0 0;-moz-transform:translate(0,0) scaleX(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child{background-color:#aaa;background-image:none} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-yuiapp.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-yuiapp.css deleted file mode 100644 index 78d615d..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-yuiapp.css +++ /dev/null @@ -1,106 +0,0 @@ -html { - background: #fff; - color: #555; - height: 100%; -} - -#hd, #bd, #ft { - padding: 0 50px; -} - -#bd { - padding-bottom: 50px; - border-bottom: 1px solid #006e9c; -} - -#ft { - background: transparent no-repeat 0% 100%; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADcAAAAeCAMAAAC/pnaKAAAAwFBMVEUkXIAoYYQoYYQoYYQyao02bpE6cpQ6cpREe51LgqNUiqtUiqtUiqtZj7BckrNlmrtlmrtlmrtroMB3qsp3qsp3qsp+sdCHudiHudiHudiHudiPwN+YyOaYyOaYyOaf0O2g0O6n1vOn1vOn1vOn1vOw3vu45f245f245f3B7f7K9f7K9f7K9f7X/v7X/v7p//7p//79//79//4AAABhAGMAbwBzAC4AcwB0AHIAaQBuAGcAcwABAAAAwIwmGwEAAABQQKFUAAAAQHRSTlP///////////////////////////////////////////////////////////////////8A////////////////0pfSbwAAAdtJREFUOI2NlNGqgzAMhv/ClDlQQcFdKOx4McFCKcH3f7eTtLWr07mFiUvbzz9Nk2LZGRH5937qZTiGyEx0Cr5xQpEd6xzNueCGc9SzUmAzP8cplO1zgRRutBAlM9EhZwknWj1LKXkwbOVojTqMEpKZOfeUD3OnR24VWeJf1OOBTnTgw8zZr3LyOlbdrWrdGlpG6Alz4Ni3RcT4Ldm8wHpOo9Yo5CPsdngM6D3HmLlESrgHD+YvrtEuUeLeMf7x7j23GJVgbJoHs0/cI3B7TNkfON5btsEUrvSdY694U0P9nXMp2mDsdbLmY14CN8XDjtzgo9CuqpYnGoMscDUmn08qsbOn/3Lte6rgP1eM7qQ1YMP+yPhiTmx2laDQspytgJI1MbIzZ7yHfj2/hYYtZ1xMM4dc3iTukjgJyKsrUBEH4uqFXNUh3aXxtWjbC3DpH8LRVPJ8MXLoA8fsz51ue73Q+1z7RkTEF0dWa1o5a8001C6ZbGuzh0bSTo9iS8X+C/NWbfTW5uZ9Vu4QaL20Xv3uhgyrZUXVtI2NfS3fbzgP75dNek/YbrL+k/EykecuZf6ZOzDJYsf9PCV3xhFHq7043mw+H1ylW+5Ab5jpADuPM2Z1P3POLWnUG/sHnIDsqkOjlqoAAAAASUVORK5CYII=); - /* image width: 55px */ - padding: 0 0 40px 0; - margin: 50px; -} - -#hd, #bd { - background: #f9f9f9; -} - -body { - margin: 0; - padding: 0; - font: 12px "Helvetica Nueue", Arial, sans-serif; -} - -#hd { - color: #fff; - padding-top: 50px; - margin: 0; -} - -#hd, h1, h2, p, .color { - margin: auto; -} - -h1, h2, a { - color: #006e9c; -} - -h1, h2 { - margin-top: 0; -} - -h4 .title { - font-weight: bold; - letter-spacing: -2px; - font-size: 47px; - text-shadow: 0 1px 0 #369; - background: #006e9d; - color: #fff; - padding: 0 10px; -} - -h4 { - display: block; - float: right; - margin: 0 0 0 20px; -} - -h4 .what { - display: block; - padding: 4px; - text-align: center; - font-weight: normal; -} - -h4 .version { - font-size: 11px; - color: #ccc; -} - -h2 { - font-size: 40px; - font-family: "HelveticaNeue-Light", "Helvetica Neue Light", - "Helvetica Neue", sans-serif; - font-weight: 300; -} - -h4, p { - padding: 6px 0 6px; -} - -#ft p.fine, #ft p.fine a { - color: #999; -} - -#ft p.intro { - font-size: 12px; -} - -#bd { - font-size: 14px; - color: #666; -} - -#ft p { - font-size: 11px; -} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-yuiapp.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-yuiapp.css.min deleted file mode 100644 index 8d58663..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-realdata-yuiapp.css.min +++ /dev/null @@ -1 +0,0 @@ -html{background:#fff;color:#555;height:100%}#hd,#bd,#ft{padding:0 50px}#bd{padding-bottom:50px;border-bottom:1px solid #006e9c}#ft{background:transparent no-repeat 0 100%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADcAAAAeCAMAAAC/pnaKAAAAwFBMVEUkXIAoYYQoYYQoYYQyao02bpE6cpQ6cpREe51LgqNUiqtUiqtUiqtZj7BckrNlmrtlmrtlmrtroMB3qsp3qsp3qsp+sdCHudiHudiHudiHudiPwN+YyOaYyOaYyOaf0O2g0O6n1vOn1vOn1vOn1vOw3vu45f245f245f3B7f7K9f7K9f7K9f7X/v7X/v7p//7p//79//79//4AAABhAGMAbwBzAC4AcwB0AHIAaQBuAGcAcwABAAAAwIwmGwEAAABQQKFUAAAAQHRSTlP///////////////////////////////////////////////////////////////////8A////////////////0pfSbwAAAdtJREFUOI2NlNGqgzAMhv/ClDlQQcFdKOx4McFCKcH3f7eTtLWr07mFiUvbzz9Nk2LZGRH5937qZTiGyEx0Cr5xQpEd6xzNueCGc9SzUmAzP8cplO1zgRRutBAlM9EhZwknWj1LKXkwbOVojTqMEpKZOfeUD3OnR24VWeJf1OOBTnTgw8zZr3LyOlbdrWrdGlpG6Alz4Ni3RcT4Ldm8wHpOo9Yo5CPsdngM6D3HmLlESrgHD+YvrtEuUeLeMf7x7j23GJVgbJoHs0/cI3B7TNkfON5btsEUrvSdY694U0P9nXMp2mDsdbLmY14CN8XDjtzgo9CuqpYnGoMscDUmn08qsbOn/3Lte6rgP1eM7qQ1YMP+yPhiTmx2laDQspytgJI1MbIzZ7yHfj2/hYYtZ1xMM4dc3iTukjgJyKsrUBEH4uqFXNUh3aXxtWjbC3DpH8LRVPJ8MXLoA8fsz51ue73Q+1z7RkTEF0dWa1o5a8001C6ZbGuzh0bSTo9iS8X+C/NWbfTW5uZ9Vu4QaL20Xv3uhgyrZUXVtI2NfS3fbzgP75dNek/YbrL+k/EykecuZf6ZOzDJYsf9PCV3xhFHq7043mw+H1ylW+5Ab5jpADuPM2Z1P3POLWnUG/sHnIDsqkOjlqoAAAAASUVORK5CYII=);padding:0 0 40px 0;margin:50px}#hd,#bd{background:#f9f9f9}body{margin:0;padding:0;font:12px "Helvetica Nueue",Arial,sans-serif}#hd{color:#fff;padding-top:50px;margin:0}#hd,h1,h2,p,.color{margin:auto}h1,h2,a{color:#006e9c}h1,h2{margin-top:0}h4 .title{font-weight:bold;letter-spacing:-2px;font-size:47px;text-shadow:0 1px 0 #369;background:#006e9d;color:#fff;padding:0 10px}h4{display:block;float:right;margin:0 0 0 20px}h4 .what{display:block;padding:4px;text-align:center;font-weight:normal}h4 .version{font-size:11px;color:#ccc}h2{font-size:40px;font-family:"HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",sans-serif;font-weight:300}h4,p{padding:6px 0 6px}#ft p.fine,#ft p.fine a{color:#999}#ft p.intro{font-size:12px}#bd{font-size:14px;color:#666}#ft p{font-size:11px} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-singlequote-font.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-singlequote-font.css deleted file mode 100644 index 91bb3ed..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-singlequote-font.css +++ /dev/null @@ -1,30 +0,0 @@ -/*csslint fontfamily: true*/ - -/** - * Foo - */ - -.y-ff-1 { - font-family:"Foo Bar",Helvetica,Arial; - text-rendering: optimizeLegibility; -} - -.ua-op .y-ff-1 { - /* Some Comment */ - font-family:Helvetica,Arial; -} - -/* -Foo - -Bar -*/ - -@font-face { - font-family: "Foo Bar"; - src: url('data:font/truetype;base64,gRbIUFAIrsQNGditEWbAUKwAA') format("truetype"), - url("http://yuilibrary.com/fonts/foo-bar.svg#webfontse22fewwr") format("svg"); - font-weight: normal; - font-style: normal; -} - diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-singlequote-font.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-singlequote-font.css.min deleted file mode 100644 index fd51d54..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dataurl-singlequote-font.css.min +++ /dev/null @@ -1,3 +0,0 @@ -.y-ff-1{font-family:"Foo Bar",Helvetica,Arial;text-rendering:optimizeLegibility}.ua-op .y-ff-1{font-family:Helvetica,Arial}@font-face{font-family:"Foo Bar";src:url('data:font/truetype;base64,gRbIUFAIrsQNGditEWbAUKwAA') format("truetype"),url("http://yuilibrary.com/fonts/foo-bar.svg#webfontse22fewwr") format("svg");font-weight:normal;font-style:normal} - - diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/decimals.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/decimals.css deleted file mode 100644 index 9593979..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/decimals.css +++ /dev/null @@ -1,3 +0,0 @@ -::selection { - margin: 0.6px 0.333pt 1.2em 8.8cm; -} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/decimals.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/decimals.css.min deleted file mode 100644 index 4dadedc..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/decimals.css.min +++ /dev/null @@ -1 +0,0 @@ -::selection{margin:.6px .333pt 1.2em 8.8cm} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dollar-header.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dollar-header.css deleted file mode 100644 index 43999c4..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dollar-header.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! -$Header: /temp/dirname/filename.css 3 2/02/08 3:37p JSmith $ -*/ - -foo { - bar: baz -} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dollar-header.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dollar-header.css.min deleted file mode 100644 index 9308100..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/dollar-header.css.min +++ /dev/null @@ -1,3 +0,0 @@ -/*! -$Header: /temp/dirname/filename.css 3 2/02/08 3:37p JSmith $ -*/foo{bar:baz} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/font-face.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/font-face.css deleted file mode 100644 index 4b6956c..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/font-face.css +++ /dev/null @@ -1,6 +0,0 @@ -@font-face { - font-family: 'gzipper'; - src: url(yanone.eot); - src: local('gzipper'), - url(yanone.ttf) format('truetype'); -} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/font-face.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/font-face.css.min deleted file mode 100644 index 3a1077c..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/font-face.css.min +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:'gzipper';src:url(yanone.eot);src:local('gzipper'),url(yanone.ttf) format('truetype')} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/ie5mac.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/ie5mac.css deleted file mode 100644 index e4d5204..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/ie5mac.css +++ /dev/null @@ -1,5 +0,0 @@ -/* Ignore the next rule in IE mac \*/ -.selector { - color: khaki; -} -/* Stop ignoring in IE mac */ diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/ie5mac.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/ie5mac.css.min deleted file mode 100644 index f90df41..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/ie5mac.css.min +++ /dev/null @@ -1 +0,0 @@ -/*\*/.selector{color:khaki}/**/ \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/media-empty-class.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/media-empty-class.css deleted file mode 100644 index d2f22d5..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/media-empty-class.css +++ /dev/null @@ -1,16 +0,0 @@ -/*! preserved */ -emptiness {} - -@import "another.css"; -/* I'm empty - delete me */ -empty { ;} - -@media print { - .noprint { display: none; } -} - -@media screen { - /* this rule should be removed, not simply minified.*/ - .breakme {} - .printonly { display: none; } -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/media-empty-class.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/media-empty-class.css.min deleted file mode 100644 index 0350c7f..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/media-empty-class.css.min +++ /dev/null @@ -1 +0,0 @@ -/*! preserved */@import "another.css";@media print{.noprint{display:none}}@media screen{.printonly{display:none}} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/media-multi.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/media-multi.css deleted file mode 100644 index c589771..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/media-multi.css +++ /dev/null @@ -1,3 +0,0 @@ -@media only all and (max-width:50em), only all and (max-device-width:800px), only all and (max-width:780px) { - some-css : here -} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/media-multi.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/media-multi.css.min deleted file mode 100644 index 57b52f7..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/media-multi.css.min +++ /dev/null @@ -1 +0,0 @@ -@media only all and (max-width:50em),only all and (max-device-width:800px),only all and (max-width:780px){some-css:here} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/media-test.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/media-test.css deleted file mode 100644 index af118ff..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/media-test.css +++ /dev/null @@ -1,3 +0,0 @@ -@media screen and (-webkit-min-device-pixel-ratio:0) { - some-css : here -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/media-test.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/media-test.css.min deleted file mode 100644 index 0e7168e..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/media-test.css.min +++ /dev/null @@ -1 +0,0 @@ -@media screen and (-webkit-min-device-pixel-ratio:0){some-css:here} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/opacity-filter.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/opacity-filter.css deleted file mode 100644 index 60deca7..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/opacity-filter.css +++ /dev/null @@ -1,14 +0,0 @@ -/* example from https://developer.mozilla.org/en/CSS/opacity */ -pre { /* make the box translucent (80% opaque) */ - border: solid red; - opacity: 0.8; /* Firefox, Safari(WebKit), Opera */ - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; /* IE 8 */ - filter: PROGID:DXImageTransform.Microsoft.Alpha(Opacity=80); /* IE 4-7 */ - zoom: 1; /* set "zoom", "width" or "height" to trigger "hasLayout" in IE 7 and lower */ -} - -/** and again */ -code { - -ms-filter: "PROGID:DXImageTransform.Microsoft.Alpha(Opacity=80)"; /* IE 8 */ - filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80); /* IE 4-7 */ -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/opacity-filter.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/opacity-filter.css.min deleted file mode 100644 index 99b4fa8..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/opacity-filter.css.min +++ /dev/null @@ -1 +0,0 @@ -pre{border:solid red;opacity:.8;-ms-filter:"alpha(opacity=80)";filter:alpha(opacity=80);zoom:1}code{-ms-filter:"alpha(opacity=80)";filter:alpha(opacity=80)} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/preserve-case.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/preserve-case.css deleted file mode 100644 index 06818f0..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/preserve-case.css +++ /dev/null @@ -1,15 +0,0 @@ -#AddAddressForm { - padding: 0; -} -#AddAddressForm .messageBoxNeutral { - padding: 0; -} -#FeedbackMailForm{ - padding: 0; -} -#FeedbackMailForm .classe{ - margin: 0; -} -.classes, #FeedBackMailForm { - margin: 0; -} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/preserve-case.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/preserve-case.css.min deleted file mode 100644 index 373bcbb..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/preserve-case.css.min +++ /dev/null @@ -1 +0,0 @@ -#AddAddressForm{padding:0}#AddAddressForm .messageBoxNeutral{padding:0}#FeedbackMailForm{padding:0}#FeedbackMailForm .classe{margin:0}.classes,#FeedBackMailForm{margin:0} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/preserve-new-line.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/preserve-new-line.css deleted file mode 100644 index e1f0c92..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/preserve-new-line.css +++ /dev/null @@ -1,6 +0,0 @@ -#sel-o { - content: "on\"ce upon \ -a time"; - content: 'once upon \ -a ti\'me'; -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/preserve-new-line.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/preserve-new-line.css.min deleted file mode 100644 index 6ac20b6..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/preserve-new-line.css.min +++ /dev/null @@ -1,3 +0,0 @@ -#sel-o{content:"on\"ce upon \ -a time";content:'once upon \ -a ti\'me'} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/preserve-strings.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/preserve-strings.css deleted file mode 100644 index 9151373..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/preserve-strings.css +++ /dev/null @@ -1,7 +0,0 @@ -/* preserving strings */ -.sele { - content: "\"keep \" me"; - something: '\\\' . . '; - else: 'empty{}'; - content: "/* test */"; /* <---- this is not a comment, should be be kept */ -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/preserve-strings.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/preserve-strings.css.min deleted file mode 100644 index 3f1d010..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/preserve-strings.css.min +++ /dev/null @@ -1 +0,0 @@ -.sele{content:"\"keep \" me";something:'\\\' . . ';else:'empty{}';content:"/* test */"} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/pseudo-first.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/pseudo-first.css deleted file mode 100644 index dbadef4..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/pseudo-first.css +++ /dev/null @@ -1,16 +0,0 @@ -/* -because of IE6 first-letter and first-line -must be followed by a space -http://reference.sitepoint.com/css/pseudoelement-firstletter -Thanks: P.Sorokin comment at http://www.phpied.com/cssmin-js/ -*/ -p:first-letter{ - buh: hum; -} -p:first-line{ - baa: 1; -} - -p:first-line,a,p:first-letter,b{ - color: red; -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/pseudo-first.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/pseudo-first.css.min deleted file mode 100644 index 687117c..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/pseudo-first.css.min +++ /dev/null @@ -1 +0,0 @@ -p:first-letter {buh:hum}p:first-line {baa:1}p:first-line ,a,p:first-letter ,b{color:red} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/pseudo.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/pseudo.css deleted file mode 100644 index a9a1bd9..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/pseudo.css +++ /dev/null @@ -1,5 +0,0 @@ -p :link , -div :link { - ba:zinga;;; - foo: bar;;; -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/pseudo.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/pseudo.css.min deleted file mode 100644 index a339ed2..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/pseudo.css.min +++ /dev/null @@ -1 +0,0 @@ -p :link,div :link{ba:zinga;foo:bar} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/special-comments.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/special-comments.css deleted file mode 100644 index 4e184ba..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/special-comments.css +++ /dev/null @@ -1,13 +0,0 @@ -/*!************88**** - Preserving comments - as they are - ******************** - Keep the initial ! - *******************/ -#yo { - ma: "ma"; -} -/*! -I said -pre- -serve! */ \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/special-comments.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/special-comments.css.min deleted file mode 100644 index 92ecbac..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/special-comments.css.min +++ /dev/null @@ -1,9 +0,0 @@ -/*!************88**** - Preserving comments - as they are - ******************** - Keep the initial ! - *******************/#yo{ma:"ma"}/*! -I said -pre- -serve! */ \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/special/linebreakpos.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/special/linebreakpos.css deleted file mode 100644 index 3295417..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/special/linebreakpos.css +++ /dev/null @@ -1,118 +0,0 @@ -/* - TODO will need to remove settings on HTML since we can't namespace it. - TODO with the prefix, should I group by selector or property for weight savings? -*/ -html{ - color:#000; - background:#FFF; -} -/* - TODO remove settings on BODY since we can't namespace it. -*/ -/* - TODO test putting a class on HEAD. - - Fails on FF. -*/ -body, -div, -dl, -dt, -dd, -ul, -ol, -li, -h1, -h2, -h3, -h4, -h5, -h6, -pre, -code, -form, -fieldset, -legend, -input, -textarea, -p, -blockquote, -th, -td { - margin:0; - padding:0; -} -table { - border-collapse:collapse; - border-spacing:0; -} -fieldset, -img { - border:0; -} -/* - TODO think about hanlding inheritence differently, maybe letting IE6 fail a bit... -*/ -address, -caption, -cite, -code, -dfn, -em, -strong, -th, -var { - font-style:normal; - font-weight:normal; -} - -ol, -ul { - list-style:none; -} - -caption, -th { - text-align:left; -} -h1, -h2, -h3, -h4, -h5, -h6 { - font-size:100%; - font-weight:normal; -} -q:before, -q:after { - content:''; -} -abbr, -acronym { - border:0; - font-variant:normal; -} -/* to preserve line-height and selector appearance */ -sup { - vertical-align:text-top; -} -sub { - vertical-align:text-bottom; -} -input, -textarea, -select { - font-family:inherit; - font-size:inherit; - font-weight:inherit; -} -/*to enable resizing for IE*/ -input, -textarea, -select { - *font-size:100%; -} -/*because legend doesn't inherit in IE */ -legend { - color:#000; -} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/special/linebreakpos.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/special/linebreakpos.css.min deleted file mode 100644 index c506602..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/special/linebreakpos.css.min +++ /dev/null @@ -1,6 +0,0 @@ -html{color:#000;background:#FFF}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0} -table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal} -ol,ul{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal} -q:before,q:after{content:''}abbr,acronym{border:0;font-variant:normal} -sup{vertical-align:text-top}sub{vertical-align:text-bottom}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit} -input,textarea,select{*font-size:100%}legend{color:#000} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/star-underscore-hacks.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/star-underscore-hacks.css deleted file mode 100644 index 8b6e517..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/star-underscore-hacks.css +++ /dev/null @@ -1,5 +0,0 @@ -#elementarr { - width: 1px; - *width: 3pt; - _width: 2em; -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/star-underscore-hacks.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/star-underscore-hacks.css.min deleted file mode 100644 index 0a014c3..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/star-underscore-hacks.css.min +++ /dev/null @@ -1 +0,0 @@ -#elementarr{width:1px;*width:3pt;_width:2em} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/string-in-comment.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/string-in-comment.css deleted file mode 100644 index d94d192..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/string-in-comment.css +++ /dev/null @@ -1,8 +0,0 @@ -/* te " st */ -a{a:1} -/*!"preserve" me*/ -b{content: "/**/"} -/* quite " quote ' \' \" */ -/* ie mac \*/ -c {c : 3} -/* end hiding */ \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/string-in-comment.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/string-in-comment.css.min deleted file mode 100644 index 7cdec2d..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/string-in-comment.css.min +++ /dev/null @@ -1 +0,0 @@ -a{a:1}/*!"preserve" me*/b{content:"/**/"}/*\*/c{c:3}/**/ \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/webkit-transform.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/webkit-transform.css deleted file mode 100644 index 83a50f2..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/webkit-transform.css +++ /dev/null @@ -1,2 +0,0 @@ -c {-webkit-transform-origin: 0 0;} -d {-MOZ-TRANSFORM-ORIGIN: 0 0 } \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/webkit-transform.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/webkit-transform.css.min deleted file mode 100644 index b640ddf..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/webkit-transform.css.min +++ /dev/null @@ -1 +0,0 @@ -c{-webkit-transform-origin:0 0}d{-moz-transform-origin:0 0} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/zeros.css b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/zeros.css deleted file mode 100644 index a5a4da2..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/zeros.css +++ /dev/null @@ -1,6 +0,0 @@ -a { - margin: 0px 0pt 0em 0%; - _padding-top: 0ex; - background-position: 0 0; - padding: 0in 0cm 0mm 0pc -} diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/zeros.css.min b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/zeros.css.min deleted file mode 100644 index 14ac7a9..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/files/zeros.css.min +++ /dev/null @@ -1 +0,0 @@ -a{margin:0;_padding-top:0;background-position:0 0;padding:0} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/tests.js b/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/tests.js deleted file mode 100644 index 6178029..0000000 --- a/node_modules/less-middleware/node_modules/less/node_modules/ycssmin/tests/tests.js +++ /dev/null @@ -1,49 +0,0 @@ -var vows = require('vows'), - assert = require('assert'), - path = require('path'), - fs = require('fs'), - exists = fs.existsSync || path.existsSync, - base = path.join(__dirname, './files'), - cssmin = require('../cssmin').cssmin, - files = fs.readdirSync(base), - tests = { - 'should be loaded': { - topic: function() { - return require('../cssmin').cssmin; - }, - 'should be a function': function(topic) { - assert.isFunction(topic); - } - } - }; - -files.forEach(function(file) { - if (path.extname(file) === '.css') { - var comp = path.join(base, file + '.min'); - if (exists(comp)) { - tests['should be loaded'][file] = (function(file) { - var expected = (fs.readFileSync(path.join(base, file + '.min'), 'utf8')).trim(), - str = (fs.readFileSync(path.join(base, file), 'utf8')).trim(); - return function(topic) { - var out = topic(str); - assert.equal(expected, out); - }; - }(file)); - } - } -}); - -//Line Break Test -(function() { - var file = 'linebreakpos.css'; - tests['should be loaded']['and should handle linebreak'] = (function(file) { - var expected = (fs.readFileSync(path.join(base, 'special', file + '.min'), 'utf8')).trim(), - str = (fs.readFileSync(path.join(base, 'special', file), 'utf8')).trim(); - return function(topic) { - var out = topic(str, 100); - assert.equal(expected, out); - }; - }(file)); -}()); - -vows.describe('cssmin tests').addBatch(tests).export(module); diff --git a/node_modules/less-middleware/node_modules/less/package.json b/node_modules/less-middleware/node_modules/less/package.json deleted file mode 100644 index ea27ed5..0000000 --- a/node_modules/less-middleware/node_modules/less/package.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "less", - "description": "Leaner CSS", - "homepage": "http://lesscss.org", - "keywords": [ - "css", - "parser", - "lesscss", - "browser" - ], - "author": { - "name": "Alexis Sellier", - "email": "self@cloudhead.net" - }, - "contributors": [], - "version": "1.3.3", - "bin": { - "lessc": "./bin/lessc" - }, - "main": "./lib/less/index", - "directories": { - "test": "./test" - }, - "engines": { - "node": ">=0.4.2" - }, - "optionalDependencies": { - "ycssmin": ">=1.0.1" - }, - "devDependencies": { - "diff": "~1.0" - }, - "scripts": { - "test": "make test" - }, - "bugs": { - "url": "https://github.com/cloudhead/less.js/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/cloudhead/less.js.git" - }, - "readme": "less.js\n=======\n\nThe **dynamic** stylesheet language.\n\n\n\nabout\n-----\n\nThis is the JavaScript, and now official, stable version of LESS.\n\nFor more information, visit .\n\nlicense\n-------\n\nSee `LICENSE` file.\n\n> Copyright (c) 2009-2011 Alexis Sellier\n", - "_id": "less@1.3.3", - "dependencies": { - "ycssmin": ">=1.0.1" - }, - "_from": "less@>= 1.3.0" -} diff --git a/node_modules/less-middleware/node_modules/less/test/browser-test-prepare.js b/node_modules/less-middleware/node_modules/less/test/browser-test-prepare.js deleted file mode 100644 index a1b0e5c..0000000 --- a/node_modules/less-middleware/node_modules/less/test/browser-test-prepare.js +++ /dev/null @@ -1,29 +0,0 @@ -var path = require('path'), - fs = require('fs'), - sys = require('util'); - -var createTestRunnerPage = function(dir, exclude, testSuiteName, dir2) { - var output = '\n'; - - fs.readdirSync(path.join("test", dir, 'less', dir2 || "")).forEach(function (file) { - if (! /\.less/.test(file)) { return; } - - var name = path.basename(file, '.less'), - id = (dir ? dir + '-' : "") + 'less-' + (dir2 ? dir2 + "-" : "") + name; - - if (exclude && name.match(exclude)) { return; } - - output += '\n'; - output += '\n'; - }); - - output += String(fs.readFileSync(path.join('test/browser', 'template.htm'))).replace("{runner-name}", testSuiteName); - - fs.writeFileSync(path.join('test/browser', 'test-runner-'+testSuiteName+'.htm'), output); -}; - -createTestRunnerPage("", /javascript|urls/, "main"); -createTestRunnerPage("browser", null, "browser"); -createTestRunnerPage("browser", null, "relative-urls", "relative-urls"); -createTestRunnerPage("browser", null, "rootpath", "rootpath"); -createTestRunnerPage("browser", null, "rootpath-relative", "rootpath-relative"); \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/browser/common.js b/node_modules/less-middleware/node_modules/less/test/browser/common.js deleted file mode 100644 index 1c0c0af..0000000 --- a/node_modules/less-middleware/node_modules/less/test/browser/common.js +++ /dev/null @@ -1,74 +0,0 @@ -/*if not async then phantomjs fails to run the webserver and the test concurrently*/ -var less = { async: true }; - -var testLessEqualsInDocument = function() { - var links = document.getElementsByTagName('link'), - typePattern = /^text\/(x-)?less$/; - - for (var i = 0; i < links.length; i++) { - if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) && - (links[i].type.match(typePattern)))) { - testSheet(links[i]); - } - } -}; - -var testSheet = function(sheet) { - it(sheet.id + " should match the expected output", function() { - var lessOutputId = sheet.id.replace("original-", ""), - expectedOutputId = "expected-" + lessOutputId, - lessOutput = document.getElementById(lessOutputId).innerText, - expectedOutputHref = document.getElementById(expectedOutputId).href, - expectedOutput = loadFile(expectedOutputHref); - - waitsFor(function() { - return expectedOutput.loaded; - }, "failed to load expected outout", 10000); - - runs(function() { - // use sheet to do testing - expect(lessOutput).toEqual(expectedOutput.text); - }); - }); -}; - -var loadFile = function(href) { - var request = new XMLHttpRequest(), - response = { loaded: false, text: ""}; - request.open('GET', href, true); - request.onload = function(e) { - response.text = request.response; - response.loaded = true; - } - request.send(); - return response; -}; - -(function() { - var jasmineEnv = jasmine.getEnv(); - jasmineEnv.updateInterval = 1000; - - var htmlReporter = new jasmine.HtmlReporter(); - - jasmineEnv.addReporter(htmlReporter); - - jasmineEnv.specFilter = function(spec) { - return htmlReporter.specFilter(spec); - }; - - var currentWindowOnload = window.onload; - - window.onload = function() { - if (currentWindowOnload) { - currentWindowOnload(); - } - execJasmine(); - }; - - function execJasmine() { - setTimeout(function() { - jasmineEnv.execute(); - }, 3000); - } - -})(); \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/browser/css/relative-urls/urls.css b/node_modules/less-middleware/node_modules/less/test/browser/css/relative-urls/urls.css deleted file mode 100644 index d0da499..0000000 --- a/node_modules/less-middleware/node_modules/less/test/browser/css/relative-urls/urls.css +++ /dev/null @@ -1,36 +0,0 @@ -@import "http://localhost:8081/browser/less/imports/modify-this.css"; - -@import "http://localhost:8081/browser/less/imports/modify-again.css"; -.modify { - my-url: url("http://localhost:8081/browser/less/imports/a.png"); -} -.modify { - my-url: url("http://localhost:8081/browser/less/imports/b.png"); -} -@font-face { - src: url("/https/github.com/fonts/garamond-pro.ttf"); - src: local(Futura-Medium), url(http://localhost:8081/browser/less/relative-urls/fonts.svg#MyGeometricModern) format("svg"); -} -#shorthands { - background: url("http://www.lesscss.org/spec.html") no-repeat 0 4px; -} -#misc { - background-image: url(http://localhost:8081/browser/less/relative-urls/images/image.jpg); -} -#data-uri { - background: url(data:image/png;charset=utf-8;base64, - kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/ - k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U - kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC); - background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==); - background-image: url(http://fonts.googleapis.com/css?family=\"Rokkitt\":\(400\),700); -} -#svg-data-uri { - background: transparent url('data:image/svg+xml, '); -} -.comma-delimited { - background: url(http://localhost:8081/browser/less/relative-urls/bg.jpg) no-repeat, url(http://localhost:8081/browser/less/relative-urls/bg.png) repeat-x top left, url(http://localhost:8081/browser/less/relative-urls/bg); -} -.values { - url: url('http://localhost:8081/browser/less/relative-urls/Trebuchet'); -} diff --git a/node_modules/less-middleware/node_modules/less/test/browser/css/rootpath-relative/urls.css b/node_modules/less-middleware/node_modules/less/test/browser/css/rootpath-relative/urls.css deleted file mode 100644 index 817d581..0000000 --- a/node_modules/less-middleware/node_modules/less/test/browser/css/rootpath-relative/urls.css +++ /dev/null @@ -1,36 +0,0 @@ -@import "https://www.github.com/cloudhead/imports/modify-this.css"; - -@import "https://www.github.com/cloudhead/imports/modify-again.css"; -.modify { - my-url: url("https://www.github.com/cloudhead/imports/a.png"); -} -.modify { - my-url: url("https://www.github.com/cloudhead/imports/b.png"); -} -@font-face { - src: url("/https/github.com/fonts/garamond-pro.ttf"); - src: local(Futura-Medium), url(https://www.github.com/cloudhead/less.js/fonts.svg#MyGeometricModern) format("svg"); -} -#shorthands { - background: url("http://www.lesscss.org/spec.html") no-repeat 0 4px; -} -#misc { - background-image: url(https://www.github.com/cloudhead/less.js/images/image.jpg); -} -#data-uri { - background: url(data:image/png;charset=utf-8;base64, - kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/ - k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U - kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC); - background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==); - background-image: url(http://fonts.googleapis.com/css?family=\"Rokkitt\":\(400\),700); -} -#svg-data-uri { - background: transparent url('data:image/svg+xml, '); -} -.comma-delimited { - background: url(https://www.github.com/cloudhead/less.js/bg.jpg) no-repeat, url(https://www.github.com/cloudhead/less.js/bg.png) repeat-x top left, url(https://www.github.com/cloudhead/less.js/bg); -} -.values { - url: url('https://www.github.com/cloudhead/less.js/Trebuchet'); -} diff --git a/node_modules/less-middleware/node_modules/less/test/browser/css/rootpath/urls.css b/node_modules/less-middleware/node_modules/less/test/browser/css/rootpath/urls.css deleted file mode 100644 index a3ef5d9..0000000 --- a/node_modules/less-middleware/node_modules/less/test/browser/css/rootpath/urls.css +++ /dev/null @@ -1,36 +0,0 @@ -@import "https://www.github.com/modify-this.css"; - -@import "https://www.github.com/modify-again.css"; -.modify { - my-url: url("https://www.github.com/a.png"); -} -.modify { - my-url: url("https://www.github.com/b.png"); -} -@font-face { - src: url("/https/github.com/fonts/garamond-pro.ttf"); - src: local(Futura-Medium), url(https://www.github.com/fonts.svg#MyGeometricModern) format("svg"); -} -#shorthands { - background: url("http://www.lesscss.org/spec.html") no-repeat 0 4px; -} -#misc { - background-image: url(https://www.github.com/images/image.jpg); -} -#data-uri { - background: url(data:image/png;charset=utf-8;base64, - kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/ - k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U - kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC); - background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==); - background-image: url(http://fonts.googleapis.com/css?family=\"Rokkitt\":\(400\),700); -} -#svg-data-uri { - background: transparent url('data:image/svg+xml, '); -} -.comma-delimited { - background: url(https://www.github.com/bg.jpg) no-repeat, url(https://www.github.com/bg.png) repeat-x top left, url(https://www.github.com/bg); -} -.values { - url: url('https://www.github.com/Trebuchet'); -} diff --git a/node_modules/less-middleware/node_modules/less/test/browser/css/urls.css b/node_modules/less-middleware/node_modules/less/test/browser/css/urls.css deleted file mode 100644 index a465aed..0000000 --- a/node_modules/less-middleware/node_modules/less/test/browser/css/urls.css +++ /dev/null @@ -1,36 +0,0 @@ -@import "http://localhost:8081/browser/less/modify-this.css"; - -@import "http://localhost:8081/browser/less/modify-again.css"; -.modify { - my-url: url("http://localhost:8081/browser/less/a.png"); -} -.modify { - my-url: url("http://localhost:8081/browser/less/b.png"); -} -@font-face { - src: url("/https/github.com/fonts/garamond-pro.ttf"); - src: local(Futura-Medium), url(http://localhost:8081/browser/less/fonts.svg#MyGeometricModern) format("svg"); -} -#shorthands { - background: url("http://www.lesscss.org/spec.html") no-repeat 0 4px; -} -#misc { - background-image: url(http://localhost:8081/browser/less/images/image.jpg); -} -#data-uri { - background: url(data:image/png;charset=utf-8;base64, - kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/ - k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U - kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC); - background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==); - background-image: url(http://fonts.googleapis.com/css?family=\"Rokkitt\":\(400\),700); -} -#svg-data-uri { - background: transparent url('data:image/svg+xml, '); -} -.comma-delimited { - background: url(http://localhost:8081/browser/less/bg.jpg) no-repeat, url(http://localhost:8081/browser/less/bg.png) repeat-x top left, url(http://localhost:8081/browser/less/bg); -} -.values { - url: url('http://localhost:8081/browser/less/Trebuchet'); -} diff --git a/node_modules/less-middleware/node_modules/less/test/browser/jasmine-html.js b/node_modules/less-middleware/node_modules/less/test/browser/jasmine-html.js deleted file mode 100644 index 543d569..0000000 --- a/node_modules/less-middleware/node_modules/less/test/browser/jasmine-html.js +++ /dev/null @@ -1,681 +0,0 @@ -jasmine.HtmlReporterHelpers = {}; - -jasmine.HtmlReporterHelpers.createDom = function(type, attrs, childrenVarArgs) { - var el = document.createElement(type); - - for (var i = 2; i < arguments.length; i++) { - var child = arguments[i]; - - if (typeof child === 'string') { - el.appendChild(document.createTextNode(child)); - } else { - if (child) { - el.appendChild(child); - } - } - } - - for (var attr in attrs) { - if (attr == "className") { - el[attr] = attrs[attr]; - } else { - el.setAttribute(attr, attrs[attr]); - } - } - - return el; -}; - -jasmine.HtmlReporterHelpers.getSpecStatus = function(child) { - var results = child.results(); - var status = results.passed() ? 'passed' : 'failed'; - if (results.skipped) { - status = 'skipped'; - } - - return status; -}; - -jasmine.HtmlReporterHelpers.appendToSummary = function(child, childElement) { - var parentDiv = this.dom.summary; - var parentSuite = (typeof child.parentSuite == 'undefined') ? 'suite' : 'parentSuite'; - var parent = child[parentSuite]; - - if (parent) { - if (typeof this.views.suites[parent.id] == 'undefined') { - this.views.suites[parent.id] = new jasmine.HtmlReporter.SuiteView(parent, this.dom, this.views); - } - parentDiv = this.views.suites[parent.id].element; - } - - parentDiv.appendChild(childElement); -}; - - -jasmine.HtmlReporterHelpers.addHelpers = function(ctor) { - for(var fn in jasmine.HtmlReporterHelpers) { - ctor.prototype[fn] = jasmine.HtmlReporterHelpers[fn]; - } -}; - -jasmine.HtmlReporter = function(_doc) { - var self = this; - var doc = _doc || window.document; - - var reporterView; - - var dom = {}; - - // Jasmine Reporter Public Interface - self.logRunningSpecs = false; - - self.reportRunnerStarting = function(runner) { - var specs = runner.specs() || []; - - if (specs.length == 0) { - return; - } - - createReporterDom(runner.env.versionString()); - doc.body.appendChild(dom.reporter); - setExceptionHandling(); - - reporterView = new jasmine.HtmlReporter.ReporterView(dom); - reporterView.addSpecs(specs, self.specFilter); - }; - - self.reportRunnerResults = function(runner) { - reporterView && reporterView.complete(); - }; - - self.reportSuiteResults = function(suite) { - reporterView.suiteComplete(suite); - }; - - self.reportSpecStarting = function(spec) { - if (self.logRunningSpecs) { - self.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...'); - } - }; - - self.reportSpecResults = function(spec) { - reporterView.specComplete(spec); - }; - - self.log = function() { - var console = jasmine.getGlobal().console; - if (console && console.log) { - if (console.log.apply) { - console.log.apply(console, arguments); - } else { - console.log(arguments); // ie fix: console.log.apply doesn't exist on ie - } - } - }; - - self.specFilter = function(spec) { - if (!focusedSpecName()) { - return true; - } - - return spec.getFullName().indexOf(focusedSpecName()) === 0; - }; - - return self; - - function focusedSpecName() { - var specName; - - (function memoizeFocusedSpec() { - if (specName) { - return; - } - - var paramMap = []; - var params = jasmine.HtmlReporter.parameters(doc); - - for (var i = 0; i < params.length; i++) { - var p = params[i].split('='); - paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]); - } - - specName = paramMap.spec; - })(); - - return specName; - } - - function createReporterDom(version) { - dom.reporter = self.createDom('div', { id: 'HTMLReporter', className: 'jasmine_reporter' }, - dom.banner = self.createDom('div', { className: 'banner' }, - self.createDom('span', { className: 'title' }, "Jasmine "), - self.createDom('span', { className: 'version' }, version)), - - dom.symbolSummary = self.createDom('ul', {className: 'symbolSummary'}), - dom.alert = self.createDom('div', {className: 'alert'}, - self.createDom('span', { className: 'exceptions' }, - self.createDom('label', { className: 'label', 'for': 'no_try_catch' }, 'No try/catch'), - self.createDom('input', { id: 'no_try_catch', type: 'checkbox' }))), - dom.results = self.createDom('div', {className: 'results'}, - dom.summary = self.createDom('div', { className: 'summary' }), - dom.details = self.createDom('div', { id: 'details' })) - ); - } - - function noTryCatch() { - return window.location.search.match(/catch=false/); - } - - function searchWithCatch() { - var params = jasmine.HtmlReporter.parameters(window.document); - var removed = false; - var i = 0; - - while (!removed && i < params.length) { - if (params[i].match(/catch=/)) { - params.splice(i, 1); - removed = true; - } - i++; - } - if (jasmine.CATCH_EXCEPTIONS) { - params.push("catch=false"); - } - - return params.join("&"); - } - - function setExceptionHandling() { - var chxCatch = document.getElementById('no_try_catch'); - - if (noTryCatch()) { - chxCatch.setAttribute('checked', true); - jasmine.CATCH_EXCEPTIONS = false; - } - chxCatch.onclick = function() { - window.location.search = searchWithCatch(); - }; - } -}; -jasmine.HtmlReporter.parameters = function(doc) { - var paramStr = doc.location.search.substring(1); - var params = []; - - if (paramStr.length > 0) { - params = paramStr.split('&'); - } - return params; -} -jasmine.HtmlReporter.sectionLink = function(sectionName) { - var link = '?'; - var params = []; - - if (sectionName) { - params.push('spec=' + encodeURIComponent(sectionName)); - } - if (!jasmine.CATCH_EXCEPTIONS) { - params.push("catch=false"); - } - if (params.length > 0) { - link += params.join("&"); - } - - return link; -}; -jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter); -jasmine.HtmlReporter.ReporterView = function(dom) { - this.startedAt = new Date(); - this.runningSpecCount = 0; - this.completeSpecCount = 0; - this.passedCount = 0; - this.failedCount = 0; - this.skippedCount = 0; - - this.createResultsMenu = function() { - this.resultsMenu = this.createDom('span', {className: 'resultsMenu bar'}, - this.summaryMenuItem = this.createDom('a', {className: 'summaryMenuItem', href: "#"}, '0 specs'), - ' | ', - this.detailsMenuItem = this.createDom('a', {className: 'detailsMenuItem', href: "#"}, '0 failing')); - - this.summaryMenuItem.onclick = function() { - dom.reporter.className = dom.reporter.className.replace(/ showDetails/g, ''); - }; - - this.detailsMenuItem.onclick = function() { - showDetails(); - }; - }; - - this.addSpecs = function(specs, specFilter) { - this.totalSpecCount = specs.length; - - this.views = { - specs: {}, - suites: {} - }; - - for (var i = 0; i < specs.length; i++) { - var spec = specs[i]; - this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom, this.views); - if (specFilter(spec)) { - this.runningSpecCount++; - } - } - }; - - this.specComplete = function(spec) { - this.completeSpecCount++; - - if (isUndefined(this.views.specs[spec.id])) { - this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom); - } - - var specView = this.views.specs[spec.id]; - - switch (specView.status()) { - case 'passed': - this.passedCount++; - break; - - case 'failed': - this.failedCount++; - break; - - case 'skipped': - this.skippedCount++; - break; - } - - specView.refresh(); - this.refresh(); - }; - - this.suiteComplete = function(suite) { - var suiteView = this.views.suites[suite.id]; - if (isUndefined(suiteView)) { - return; - } - suiteView.refresh(); - }; - - this.refresh = function() { - - if (isUndefined(this.resultsMenu)) { - this.createResultsMenu(); - } - - // currently running UI - if (isUndefined(this.runningAlert)) { - this.runningAlert = this.createDom('a', { href: jasmine.HtmlReporter.sectionLink(), className: "runningAlert bar" }); - dom.alert.appendChild(this.runningAlert); - } - this.runningAlert.innerHTML = "Running " + this.completeSpecCount + " of " + specPluralizedFor(this.totalSpecCount); - - // skipped specs UI - if (isUndefined(this.skippedAlert)) { - this.skippedAlert = this.createDom('a', { href: jasmine.HtmlReporter.sectionLink(), className: "skippedAlert bar" }); - } - - this.skippedAlert.innerHTML = "Skipping " + this.skippedCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all"; - - if (this.skippedCount === 1 && isDefined(dom.alert)) { - dom.alert.appendChild(this.skippedAlert); - } - - // passing specs UI - if (isUndefined(this.passedAlert)) { - this.passedAlert = this.createDom('span', { href: jasmine.HtmlReporter.sectionLink(), className: "passingAlert bar" }); - } - this.passedAlert.innerHTML = "Passing " + specPluralizedFor(this.passedCount); - - // failing specs UI - if (isUndefined(this.failedAlert)) { - this.failedAlert = this.createDom('span', {href: "?", className: "failingAlert bar"}); - } - this.failedAlert.innerHTML = "Failing " + specPluralizedFor(this.failedCount); - - if (this.failedCount === 1 && isDefined(dom.alert)) { - dom.alert.appendChild(this.failedAlert); - dom.alert.appendChild(this.resultsMenu); - } - - // summary info - this.summaryMenuItem.innerHTML = "" + specPluralizedFor(this.runningSpecCount); - this.detailsMenuItem.innerHTML = "" + this.failedCount + " failing"; - }; - - this.complete = function() { - dom.alert.removeChild(this.runningAlert); - - this.skippedAlert.innerHTML = "Ran " + this.runningSpecCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all"; - - if (this.failedCount === 0) { - dom.alert.appendChild(this.createDom('span', {className: 'passingAlert bar'}, "Passing " + specPluralizedFor(this.passedCount))); - } else { - showDetails(); - } - - dom.banner.appendChild(this.createDom('span', {className: 'duration'}, "finished in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s")); - }; - - return this; - - function showDetails() { - if (dom.reporter.className.search(/showDetails/) === -1) { - dom.reporter.className += " showDetails"; - } - } - - function isUndefined(obj) { - return typeof obj === 'undefined'; - } - - function isDefined(obj) { - return !isUndefined(obj); - } - - function specPluralizedFor(count) { - var str = count + " spec"; - if (count > 1) { - str += "s" - } - return str; - } - -}; - -jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.ReporterView); - - -jasmine.HtmlReporter.SpecView = function(spec, dom, views) { - this.spec = spec; - this.dom = dom; - this.views = views; - - this.symbol = this.createDom('li', { className: 'pending' }); - this.dom.symbolSummary.appendChild(this.symbol); - - this.summary = this.createDom('div', { className: 'specSummary' }, - this.createDom('a', { - className: 'description', - href: jasmine.HtmlReporter.sectionLink(this.spec.getFullName()), - title: this.spec.getFullName() - }, this.spec.description) - ); - - this.detail = this.createDom('div', { className: 'specDetail' }, - this.createDom('a', { - className: 'description', - href: '?spec=' + encodeURIComponent(this.spec.getFullName()), - title: this.spec.getFullName() - }, this.spec.getFullName()) - ); -}; - -jasmine.HtmlReporter.SpecView.prototype.status = function() { - return this.getSpecStatus(this.spec); -}; - -jasmine.HtmlReporter.SpecView.prototype.refresh = function() { - this.symbol.className = this.status(); - - switch (this.status()) { - case 'skipped': - break; - - case 'passed': - this.appendSummaryToSuiteDiv(); - break; - - case 'failed': - this.appendSummaryToSuiteDiv(); - this.appendFailureDetail(); - break; - } -}; - -jasmine.HtmlReporter.SpecView.prototype.appendSummaryToSuiteDiv = function() { - this.summary.className += ' ' + this.status(); - this.appendToSummary(this.spec, this.summary); -}; - -jasmine.HtmlReporter.SpecView.prototype.appendFailureDetail = function() { - this.detail.className += ' ' + this.status(); - - var resultItems = this.spec.results().getItems(); - var messagesDiv = this.createDom('div', { className: 'messages' }); - - for (var i = 0; i < resultItems.length; i++) { - var result = resultItems[i]; - - if (result.type == 'log') { - messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString())); - } else if (result.type == 'expect' && result.passed && !result.passed()) { - messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message)); - - if (result.trace.stack) { - messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack)); - } - } - } - - if (messagesDiv.childNodes.length > 0) { - this.detail.appendChild(messagesDiv); - this.dom.details.appendChild(this.detail); - } -}; - -jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SpecView);jasmine.HtmlReporter.SuiteView = function(suite, dom, views) { - this.suite = suite; - this.dom = dom; - this.views = views; - - this.element = this.createDom('div', { className: 'suite' }, - this.createDom('a', { className: 'description', href: jasmine.HtmlReporter.sectionLink(this.suite.getFullName()) }, this.suite.description) - ); - - this.appendToSummary(this.suite, this.element); -}; - -jasmine.HtmlReporter.SuiteView.prototype.status = function() { - return this.getSpecStatus(this.suite); -}; - -jasmine.HtmlReporter.SuiteView.prototype.refresh = function() { - this.element.className += " " + this.status(); -}; - -jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SuiteView); - -/* @deprecated Use jasmine.HtmlReporter instead - */ -jasmine.TrivialReporter = function(doc) { - this.document = doc || document; - this.suiteDivs = {}; - this.logRunningSpecs = false; -}; - -jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) { - var el = document.createElement(type); - - for (var i = 2; i < arguments.length; i++) { - var child = arguments[i]; - - if (typeof child === 'string') { - el.appendChild(document.createTextNode(child)); - } else { - if (child) { el.appendChild(child); } - } - } - - for (var attr in attrs) { - if (attr == "className") { - el[attr] = attrs[attr]; - } else { - el.setAttribute(attr, attrs[attr]); - } - } - - return el; -}; - -jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) { - var showPassed, showSkipped; - - this.outerDiv = this.createDom('div', { id: 'TrivialReporter', className: 'jasmine_reporter' }, - this.createDom('div', { className: 'banner' }, - this.createDom('div', { className: 'logo' }, - this.createDom('span', { className: 'title' }, "Jasmine"), - this.createDom('span', { className: 'version' }, runner.env.versionString())), - this.createDom('div', { className: 'options' }, - "Show ", - showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }), - this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "), - showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }), - this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped") - ) - ), - - this.runnerDiv = this.createDom('div', { className: 'runner running' }, - this.createDom('a', { className: 'run_spec', href: '?' }, "run all"), - this.runnerMessageSpan = this.createDom('span', {}, "Running..."), - this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, "")) - ); - - this.document.body.appendChild(this.outerDiv); - - var suites = runner.suites(); - for (var i = 0; i < suites.length; i++) { - var suite = suites[i]; - var suiteDiv = this.createDom('div', { className: 'suite' }, - this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"), - this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description)); - this.suiteDivs[suite.id] = suiteDiv; - var parentDiv = this.outerDiv; - if (suite.parentSuite) { - parentDiv = this.suiteDivs[suite.parentSuite.id]; - } - parentDiv.appendChild(suiteDiv); - } - - this.startedAt = new Date(); - - var self = this; - showPassed.onclick = function(evt) { - if (showPassed.checked) { - self.outerDiv.className += ' show-passed'; - } else { - self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, ''); - } - }; - - showSkipped.onclick = function(evt) { - if (showSkipped.checked) { - self.outerDiv.className += ' show-skipped'; - } else { - self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, ''); - } - }; -}; - -jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) { - var results = runner.results(); - var className = (results.failedCount > 0) ? "runner failed" : "runner passed"; - this.runnerDiv.setAttribute("class", className); - //do it twice for IE - this.runnerDiv.setAttribute("className", className); - var specs = runner.specs(); - var specCount = 0; - for (var i = 0; i < specs.length; i++) { - if (this.specFilter(specs[i])) { - specCount++; - } - } - var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s"); - message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s"; - this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild); - - this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString())); -}; - -jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) { - var results = suite.results(); - var status = results.passed() ? 'passed' : 'failed'; - if (results.totalCount === 0) { // todo: change this to check results.skipped - status = 'skipped'; - } - this.suiteDivs[suite.id].className += " " + status; -}; - -jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) { - if (this.logRunningSpecs) { - this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...'); - } -}; - -jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) { - var results = spec.results(); - var status = results.passed() ? 'passed' : 'failed'; - if (results.skipped) { - status = 'skipped'; - } - var specDiv = this.createDom('div', { className: 'spec ' + status }, - this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"), - this.createDom('a', { - className: 'description', - href: '?spec=' + encodeURIComponent(spec.getFullName()), - title: spec.getFullName() - }, spec.description)); - - - var resultItems = results.getItems(); - var messagesDiv = this.createDom('div', { className: 'messages' }); - for (var i = 0; i < resultItems.length; i++) { - var result = resultItems[i]; - - if (result.type == 'log') { - messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString())); - } else if (result.type == 'expect' && result.passed && !result.passed()) { - messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message)); - - if (result.trace.stack) { - messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack)); - } - } - } - - if (messagesDiv.childNodes.length > 0) { - specDiv.appendChild(messagesDiv); - } - - this.suiteDivs[spec.suite.id].appendChild(specDiv); -}; - -jasmine.TrivialReporter.prototype.log = function() { - var console = jasmine.getGlobal().console; - if (console && console.log) { - if (console.log.apply) { - console.log.apply(console, arguments); - } else { - console.log(arguments); // ie fix: console.log.apply doesn't exist on ie - } - } -}; - -jasmine.TrivialReporter.prototype.getLocation = function() { - return this.document.location; -}; - -jasmine.TrivialReporter.prototype.specFilter = function(spec) { - var paramMap = {}; - var params = this.getLocation().search.substring(1).split('&'); - for (var i = 0; i < params.length; i++) { - var p = params[i].split('='); - paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]); - } - - if (!paramMap.spec) { - return true; - } - return spec.getFullName().indexOf(paramMap.spec) === 0; -}; diff --git a/node_modules/less-middleware/node_modules/less/test/browser/jasmine.css b/node_modules/less-middleware/node_modules/less/test/browser/jasmine.css deleted file mode 100644 index 8c008dc..0000000 --- a/node_modules/less-middleware/node_modules/less/test/browser/jasmine.css +++ /dev/null @@ -1,82 +0,0 @@ -body { background-color: #eeeeee; padding: 0; margin: 5px; overflow-y: scroll; } - -#HTMLReporter { font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333333; } -#HTMLReporter a { text-decoration: none; } -#HTMLReporter a:hover { text-decoration: underline; } -#HTMLReporter p, #HTMLReporter h1, #HTMLReporter h2, #HTMLReporter h3, #HTMLReporter h4, #HTMLReporter h5, #HTMLReporter h6 { margin: 0; line-height: 14px; } -#HTMLReporter .banner, #HTMLReporter .symbolSummary, #HTMLReporter .summary, #HTMLReporter .resultMessage, #HTMLReporter .specDetail .description, #HTMLReporter .alert .bar, #HTMLReporter .stackTrace { padding-left: 9px; padding-right: 9px; } -#HTMLReporter #jasmine_content { position: fixed; right: 100%; } -#HTMLReporter .version { color: #aaaaaa; } -#HTMLReporter .banner { margin-top: 14px; } -#HTMLReporter .duration { color: #aaaaaa; float: right; } -#HTMLReporter .symbolSummary { overflow: hidden; *zoom: 1; margin: 14px 0; } -#HTMLReporter .symbolSummary li { display: block; float: left; height: 7px; width: 14px; margin-bottom: 7px; font-size: 16px; } -#HTMLReporter .symbolSummary li.passed { font-size: 14px; } -#HTMLReporter .symbolSummary li.passed:before { color: #5e7d00; content: "\02022"; } -#HTMLReporter .symbolSummary li.failed { line-height: 9px; } -#HTMLReporter .symbolSummary li.failed:before { color: #b03911; content: "x"; font-weight: bold; margin-left: -1px; } -#HTMLReporter .symbolSummary li.skipped { font-size: 14px; } -#HTMLReporter .symbolSummary li.skipped:before { color: #bababa; content: "\02022"; } -#HTMLReporter .symbolSummary li.pending { line-height: 11px; } -#HTMLReporter .symbolSummary li.pending:before { color: #aaaaaa; content: "-"; } -#HTMLReporter .exceptions { color: #fff; float: right; margin-top: 5px; margin-right: 5px; } -#HTMLReporter .bar { line-height: 28px; font-size: 14px; display: block; color: #eee; } -#HTMLReporter .runningAlert { background-color: #666666; } -#HTMLReporter .skippedAlert { background-color: #aaaaaa; } -#HTMLReporter .skippedAlert:first-child { background-color: #333333; } -#HTMLReporter .skippedAlert:hover { text-decoration: none; color: white; text-decoration: underline; } -#HTMLReporter .passingAlert { background-color: #a6b779; } -#HTMLReporter .passingAlert:first-child { background-color: #5e7d00; } -#HTMLReporter .failingAlert { background-color: #cf867e; } -#HTMLReporter .failingAlert:first-child { background-color: #b03911; } -#HTMLReporter .results { margin-top: 14px; } -#HTMLReporter #details { display: none; } -#HTMLReporter .resultsMenu, #HTMLReporter .resultsMenu a { background-color: #fff; color: #333333; } -#HTMLReporter.showDetails .summaryMenuItem { font-weight: normal; text-decoration: inherit; } -#HTMLReporter.showDetails .summaryMenuItem:hover { text-decoration: underline; } -#HTMLReporter.showDetails .detailsMenuItem { font-weight: bold; text-decoration: underline; } -#HTMLReporter.showDetails .summary { display: none; } -#HTMLReporter.showDetails #details { display: block; } -#HTMLReporter .summaryMenuItem { font-weight: bold; text-decoration: underline; } -#HTMLReporter .summary { margin-top: 14px; } -#HTMLReporter .summary .suite .suite, #HTMLReporter .summary .specSummary { margin-left: 14px; } -#HTMLReporter .summary .specSummary.passed a { color: #5e7d00; } -#HTMLReporter .summary .specSummary.failed a { color: #b03911; } -#HTMLReporter .description + .suite { margin-top: 0; } -#HTMLReporter .suite { margin-top: 14px; } -#HTMLReporter .suite a { color: #333333; } -#HTMLReporter #details .specDetail { margin-bottom: 28px; } -#HTMLReporter #details .specDetail .description { display: block; color: white; background-color: #b03911; } -#HTMLReporter .resultMessage { padding-top: 14px; color: #333333; } -#HTMLReporter .resultMessage span.result { display: block; } -#HTMLReporter .stackTrace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666666; border: 1px solid #ddd; background: white; white-space: pre; } - -#TrivialReporter { padding: 8px 13px; position: absolute; top: 0; bottom: 0; left: 0; right: 0; overflow-y: scroll; background-color: white; font-family: "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif; /*.resultMessage {*/ /*white-space: pre;*/ /*}*/ } -#TrivialReporter a:visited, #TrivialReporter a { color: #303; } -#TrivialReporter a:hover, #TrivialReporter a:active { color: blue; } -#TrivialReporter .run_spec { float: right; padding-right: 5px; font-size: .8em; text-decoration: none; } -#TrivialReporter .banner { color: #303; background-color: #fef; padding: 5px; } -#TrivialReporter .logo { float: left; font-size: 1.1em; padding-left: 5px; } -#TrivialReporter .logo .version { font-size: .6em; padding-left: 1em; } -#TrivialReporter .runner.running { background-color: yellow; } -#TrivialReporter .options { text-align: right; font-size: .8em; } -#TrivialReporter .suite { border: 1px outset gray; margin: 5px 0; padding-left: 1em; } -#TrivialReporter .suite .suite { margin: 5px; } -#TrivialReporter .suite.passed { background-color: #dfd; } -#TrivialReporter .suite.failed { background-color: #fdd; } -#TrivialReporter .spec { margin: 5px; padding-left: 1em; clear: both; } -#TrivialReporter .spec.failed, #TrivialReporter .spec.passed, #TrivialReporter .spec.skipped { padding-bottom: 5px; border: 1px solid gray; } -#TrivialReporter .spec.failed { background-color: #fbb; border-color: red; } -#TrivialReporter .spec.passed { background-color: #bfb; border-color: green; } -#TrivialReporter .spec.skipped { background-color: #bbb; } -#TrivialReporter .messages { border-left: 1px dashed gray; padding-left: 1em; padding-right: 1em; } -#TrivialReporter .passed { background-color: #cfc; display: none; } -#TrivialReporter .failed { background-color: #fbb; } -#TrivialReporter .skipped { color: #777; background-color: #eee; display: none; } -#TrivialReporter .resultMessage span.result { display: block; line-height: 2em; color: black; } -#TrivialReporter .resultMessage .mismatch { color: black; } -#TrivialReporter .stackTrace { white-space: pre; font-size: .8em; margin-left: 10px; max-height: 5em; overflow: auto; border: 1px inset red; padding: 1em; background: #eef; } -#TrivialReporter .finished-at { padding-left: 1em; font-size: .6em; } -#TrivialReporter.show-passed .passed, #TrivialReporter.show-skipped .skipped { display: block; } -#TrivialReporter #jasmine_content { position: fixed; right: 100%; } -#TrivialReporter .runner { border: 1px solid gray; display: block; margin: 5px 0; padding: 2px 0 2px 10px; } diff --git a/node_modules/less-middleware/node_modules/less/test/browser/jasmine.js b/node_modules/less-middleware/node_modules/less/test/browser/jasmine.js deleted file mode 100644 index 6b3459b..0000000 --- a/node_modules/less-middleware/node_modules/less/test/browser/jasmine.js +++ /dev/null @@ -1,2600 +0,0 @@ -var isCommonJS = typeof window == "undefined" && typeof exports == "object"; - -/** - * Top level namespace for Jasmine, a lightweight JavaScript BDD/spec/testing framework. - * - * @namespace - */ -var jasmine = {}; -if (isCommonJS) exports.jasmine = jasmine; -/** - * @private - */ -jasmine.unimplementedMethod_ = function() { - throw new Error("unimplemented method"); -}; - -/** - * Use jasmine.undefined instead of undefined, since undefined is just - * a plain old variable and may be redefined by somebody else. - * - * @private - */ -jasmine.undefined = jasmine.___undefined___; - -/** - * Show diagnostic messages in the console if set to true - * - */ -jasmine.VERBOSE = false; - -/** - * Default interval in milliseconds for event loop yields (e.g. to allow network activity or to refresh the screen with the HTML-based runner). Small values here may result in slow test running. Zero means no updates until all tests have completed. - * - */ -jasmine.DEFAULT_UPDATE_INTERVAL = 250; - -/** - * Maximum levels of nesting that will be included when an object is pretty-printed - */ -jasmine.MAX_PRETTY_PRINT_DEPTH = 40; - -/** - * Default timeout interval in milliseconds for waitsFor() blocks. - */ -jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000; - -/** - * By default exceptions thrown in the context of a test are caught by jasmine so that it can run the remaining tests in the suite. - * Set to false to let the exception bubble up in the browser. - * - */ -jasmine.CATCH_EXCEPTIONS = true; - -jasmine.getGlobal = function() { - function getGlobal() { - return this; - } - - return getGlobal(); -}; - -/** - * Allows for bound functions to be compared. Internal use only. - * - * @ignore - * @private - * @param base {Object} bound 'this' for the function - * @param name {Function} function to find - */ -jasmine.bindOriginal_ = function(base, name) { - var original = base[name]; - if (original.apply) { - return function() { - return original.apply(base, arguments); - }; - } else { - // IE support - return jasmine.getGlobal()[name]; - } -}; - -jasmine.setTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'setTimeout'); -jasmine.clearTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearTimeout'); -jasmine.setInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'setInterval'); -jasmine.clearInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearInterval'); - -jasmine.MessageResult = function(values) { - this.type = 'log'; - this.values = values; - this.trace = new Error(); // todo: test better -}; - -jasmine.MessageResult.prototype.toString = function() { - var text = ""; - for (var i = 0; i < this.values.length; i++) { - if (i > 0) text += " "; - if (jasmine.isString_(this.values[i])) { - text += this.values[i]; - } else { - text += jasmine.pp(this.values[i]); - } - } - return text; -}; - -jasmine.ExpectationResult = function(params) { - this.type = 'expect'; - this.matcherName = params.matcherName; - this.passed_ = params.passed; - this.expected = params.expected; - this.actual = params.actual; - this.message = this.passed_ ? 'Passed.' : params.message; - - var trace = (params.trace || new Error(this.message)); - this.trace = this.passed_ ? '' : trace; -}; - -jasmine.ExpectationResult.prototype.toString = function () { - return this.message; -}; - -jasmine.ExpectationResult.prototype.passed = function () { - return this.passed_; -}; - -/** - * Getter for the Jasmine environment. Ensures one gets created - */ -jasmine.getEnv = function() { - var env = jasmine.currentEnv_ = jasmine.currentEnv_ || new jasmine.Env(); - return env; -}; - -/** - * @ignore - * @private - * @param value - * @returns {Boolean} - */ -jasmine.isArray_ = function(value) { - return jasmine.isA_("Array", value); -}; - -/** - * @ignore - * @private - * @param value - * @returns {Boolean} - */ -jasmine.isString_ = function(value) { - return jasmine.isA_("String", value); -}; - -/** - * @ignore - * @private - * @param value - * @returns {Boolean} - */ -jasmine.isNumber_ = function(value) { - return jasmine.isA_("Number", value); -}; - -/** - * @ignore - * @private - * @param {String} typeName - * @param value - * @returns {Boolean} - */ -jasmine.isA_ = function(typeName, value) { - return Object.prototype.toString.apply(value) === '[object ' + typeName + ']'; -}; - -/** - * Pretty printer for expecations. Takes any object and turns it into a human-readable string. - * - * @param value {Object} an object to be outputted - * @returns {String} - */ -jasmine.pp = function(value) { - var stringPrettyPrinter = new jasmine.StringPrettyPrinter(); - stringPrettyPrinter.format(value); - return stringPrettyPrinter.string; -}; - -/** - * Returns true if the object is a DOM Node. - * - * @param {Object} obj object to check - * @returns {Boolean} - */ -jasmine.isDomNode = function(obj) { - return obj.nodeType > 0; -}; - -/** - * Returns a matchable 'generic' object of the class type. For use in expecations of type when values don't matter. - * - * @example - * // don't care about which function is passed in, as long as it's a function - * expect(mySpy).toHaveBeenCalledWith(jasmine.any(Function)); - * - * @param {Class} clazz - * @returns matchable object of the type clazz - */ -jasmine.any = function(clazz) { - return new jasmine.Matchers.Any(clazz); -}; - -/** - * Returns a matchable subset of a JSON object. For use in expectations when you don't care about all of the - * attributes on the object. - * - * @example - * // don't care about any other attributes than foo. - * expect(mySpy).toHaveBeenCalledWith(jasmine.objectContaining({foo: "bar"}); - * - * @param sample {Object} sample - * @returns matchable object for the sample - */ -jasmine.objectContaining = function (sample) { - return new jasmine.Matchers.ObjectContaining(sample); -}; - -/** - * Jasmine Spies are test doubles that can act as stubs, spies, fakes or when used in an expecation, mocks. - * - * Spies should be created in test setup, before expectations. They can then be checked, using the standard Jasmine - * expectation syntax. Spies can be checked if they were called or not and what the calling params were. - * - * A Spy has the following fields: wasCalled, callCount, mostRecentCall, and argsForCall (see docs). - * - * Spies are torn down at the end of every spec. - * - * Note: Do not call new jasmine.Spy() directly - a spy must be created using spyOn, jasmine.createSpy or jasmine.createSpyObj. - * - * @example - * // a stub - * var myStub = jasmine.createSpy('myStub'); // can be used anywhere - * - * // spy example - * var foo = { - * not: function(bool) { return !bool; } - * } - * - * // actual foo.not will not be called, execution stops - * spyOn(foo, 'not'); - - // foo.not spied upon, execution will continue to implementation - * spyOn(foo, 'not').andCallThrough(); - * - * // fake example - * var foo = { - * not: function(bool) { return !bool; } - * } - * - * // foo.not(val) will return val - * spyOn(foo, 'not').andCallFake(function(value) {return value;}); - * - * // mock example - * foo.not(7 == 7); - * expect(foo.not).toHaveBeenCalled(); - * expect(foo.not).toHaveBeenCalledWith(true); - * - * @constructor - * @see spyOn, jasmine.createSpy, jasmine.createSpyObj - * @param {String} name - */ -jasmine.Spy = function(name) { - /** - * The name of the spy, if provided. - */ - this.identity = name || 'unknown'; - /** - * Is this Object a spy? - */ - this.isSpy = true; - /** - * The actual function this spy stubs. - */ - this.plan = function() { - }; - /** - * Tracking of the most recent call to the spy. - * @example - * var mySpy = jasmine.createSpy('foo'); - * mySpy(1, 2); - * mySpy.mostRecentCall.args = [1, 2]; - */ - this.mostRecentCall = {}; - - /** - * Holds arguments for each call to the spy, indexed by call count - * @example - * var mySpy = jasmine.createSpy('foo'); - * mySpy(1, 2); - * mySpy(7, 8); - * mySpy.mostRecentCall.args = [7, 8]; - * mySpy.argsForCall[0] = [1, 2]; - * mySpy.argsForCall[1] = [7, 8]; - */ - this.argsForCall = []; - this.calls = []; -}; - -/** - * Tells a spy to call through to the actual implemenatation. - * - * @example - * var foo = { - * bar: function() { // do some stuff } - * } - * - * // defining a spy on an existing property: foo.bar - * spyOn(foo, 'bar').andCallThrough(); - */ -jasmine.Spy.prototype.andCallThrough = function() { - this.plan = this.originalValue; - return this; -}; - -/** - * For setting the return value of a spy. - * - * @example - * // defining a spy from scratch: foo() returns 'baz' - * var foo = jasmine.createSpy('spy on foo').andReturn('baz'); - * - * // defining a spy on an existing property: foo.bar() returns 'baz' - * spyOn(foo, 'bar').andReturn('baz'); - * - * @param {Object} value - */ -jasmine.Spy.prototype.andReturn = function(value) { - this.plan = function() { - return value; - }; - return this; -}; - -/** - * For throwing an exception when a spy is called. - * - * @example - * // defining a spy from scratch: foo() throws an exception w/ message 'ouch' - * var foo = jasmine.createSpy('spy on foo').andThrow('baz'); - * - * // defining a spy on an existing property: foo.bar() throws an exception w/ message 'ouch' - * spyOn(foo, 'bar').andThrow('baz'); - * - * @param {String} exceptionMsg - */ -jasmine.Spy.prototype.andThrow = function(exceptionMsg) { - this.plan = function() { - throw exceptionMsg; - }; - return this; -}; - -/** - * Calls an alternate implementation when a spy is called. - * - * @example - * var baz = function() { - * // do some stuff, return something - * } - * // defining a spy from scratch: foo() calls the function baz - * var foo = jasmine.createSpy('spy on foo').andCall(baz); - * - * // defining a spy on an existing property: foo.bar() calls an anonymnous function - * spyOn(foo, 'bar').andCall(function() { return 'baz';} ); - * - * @param {Function} fakeFunc - */ -jasmine.Spy.prototype.andCallFake = function(fakeFunc) { - this.plan = fakeFunc; - return this; -}; - -/** - * Resets all of a spy's the tracking variables so that it can be used again. - * - * @example - * spyOn(foo, 'bar'); - * - * foo.bar(); - * - * expect(foo.bar.callCount).toEqual(1); - * - * foo.bar.reset(); - * - * expect(foo.bar.callCount).toEqual(0); - */ -jasmine.Spy.prototype.reset = function() { - this.wasCalled = false; - this.callCount = 0; - this.argsForCall = []; - this.calls = []; - this.mostRecentCall = {}; -}; - -jasmine.createSpy = function(name) { - - var spyObj = function() { - spyObj.wasCalled = true; - spyObj.callCount++; - var args = jasmine.util.argsToArray(arguments); - spyObj.mostRecentCall.object = this; - spyObj.mostRecentCall.args = args; - spyObj.argsForCall.push(args); - spyObj.calls.push({object: this, args: args}); - return spyObj.plan.apply(this, arguments); - }; - - var spy = new jasmine.Spy(name); - - for (var prop in spy) { - spyObj[prop] = spy[prop]; - } - - spyObj.reset(); - - return spyObj; -}; - -/** - * Determines whether an object is a spy. - * - * @param {jasmine.Spy|Object} putativeSpy - * @returns {Boolean} - */ -jasmine.isSpy = function(putativeSpy) { - return putativeSpy && putativeSpy.isSpy; -}; - -/** - * Creates a more complicated spy: an Object that has every property a function that is a spy. Used for stubbing something - * large in one call. - * - * @param {String} baseName name of spy class - * @param {Array} methodNames array of names of methods to make spies - */ -jasmine.createSpyObj = function(baseName, methodNames) { - if (!jasmine.isArray_(methodNames) || methodNames.length === 0) { - throw new Error('createSpyObj requires a non-empty array of method names to create spies for'); - } - var obj = {}; - for (var i = 0; i < methodNames.length; i++) { - obj[methodNames[i]] = jasmine.createSpy(baseName + '.' + methodNames[i]); - } - return obj; -}; - -/** - * All parameters are pretty-printed and concatenated together, then written to the current spec's output. - * - * Be careful not to leave calls to jasmine.log in production code. - */ -jasmine.log = function() { - var spec = jasmine.getEnv().currentSpec; - spec.log.apply(spec, arguments); -}; - -/** - * Function that installs a spy on an existing object's method name. Used within a Spec to create a spy. - * - * @example - * // spy example - * var foo = { - * not: function(bool) { return !bool; } - * } - * spyOn(foo, 'not'); // actual foo.not will not be called, execution stops - * - * @see jasmine.createSpy - * @param obj - * @param methodName - * @return {jasmine.Spy} a Jasmine spy that can be chained with all spy methods - */ -var spyOn = function(obj, methodName) { - return jasmine.getEnv().currentSpec.spyOn(obj, methodName); -}; -if (isCommonJS) exports.spyOn = spyOn; - -/** - * Creates a Jasmine spec that will be added to the current suite. - * - * // TODO: pending tests - * - * @example - * it('should be true', function() { - * expect(true).toEqual(true); - * }); - * - * @param {String} desc description of this specification - * @param {Function} func defines the preconditions and expectations of the spec - */ -var it = function(desc, func) { - return jasmine.getEnv().it(desc, func); -}; -if (isCommonJS) exports.it = it; - -/** - * Creates a disabled Jasmine spec. - * - * A convenience method that allows existing specs to be disabled temporarily during development. - * - * @param {String} desc description of this specification - * @param {Function} func defines the preconditions and expectations of the spec - */ -var xit = function(desc, func) { - return jasmine.getEnv().xit(desc, func); -}; -if (isCommonJS) exports.xit = xit; - -/** - * Starts a chain for a Jasmine expectation. - * - * It is passed an Object that is the actual value and should chain to one of the many - * jasmine.Matchers functions. - * - * @param {Object} actual Actual value to test against and expected value - * @return {jasmine.Matchers} - */ -var expect = function(actual) { - return jasmine.getEnv().currentSpec.expect(actual); -}; -if (isCommonJS) exports.expect = expect; - -/** - * Defines part of a jasmine spec. Used in cominbination with waits or waitsFor in asynchrnous specs. - * - * @param {Function} func Function that defines part of a jasmine spec. - */ -var runs = function(func) { - jasmine.getEnv().currentSpec.runs(func); -}; -if (isCommonJS) exports.runs = runs; - -/** - * Waits a fixed time period before moving to the next block. - * - * @deprecated Use waitsFor() instead - * @param {Number} timeout milliseconds to wait - */ -var waits = function(timeout) { - jasmine.getEnv().currentSpec.waits(timeout); -}; -if (isCommonJS) exports.waits = waits; - -/** - * Waits for the latchFunction to return true before proceeding to the next block. - * - * @param {Function} latchFunction - * @param {String} optional_timeoutMessage - * @param {Number} optional_timeout - */ -var waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) { - jasmine.getEnv().currentSpec.waitsFor.apply(jasmine.getEnv().currentSpec, arguments); -}; -if (isCommonJS) exports.waitsFor = waitsFor; - -/** - * A function that is called before each spec in a suite. - * - * Used for spec setup, including validating assumptions. - * - * @param {Function} beforeEachFunction - */ -var beforeEach = function(beforeEachFunction) { - jasmine.getEnv().beforeEach(beforeEachFunction); -}; -if (isCommonJS) exports.beforeEach = beforeEach; - -/** - * A function that is called after each spec in a suite. - * - * Used for restoring any state that is hijacked during spec execution. - * - * @param {Function} afterEachFunction - */ -var afterEach = function(afterEachFunction) { - jasmine.getEnv().afterEach(afterEachFunction); -}; -if (isCommonJS) exports.afterEach = afterEach; - -/** - * Defines a suite of specifications. - * - * Stores the description and all defined specs in the Jasmine environment as one suite of specs. Variables declared - * are accessible by calls to beforeEach, it, and afterEach. Describe blocks can be nested, allowing for specialization - * of setup in some tests. - * - * @example - * // TODO: a simple suite - * - * // TODO: a simple suite with a nested describe block - * - * @param {String} description A string, usually the class under test. - * @param {Function} specDefinitions function that defines several specs. - */ -var describe = function(description, specDefinitions) { - return jasmine.getEnv().describe(description, specDefinitions); -}; -if (isCommonJS) exports.describe = describe; - -/** - * Disables a suite of specifications. Used to disable some suites in a file, or files, temporarily during development. - * - * @param {String} description A string, usually the class under test. - * @param {Function} specDefinitions function that defines several specs. - */ -var xdescribe = function(description, specDefinitions) { - return jasmine.getEnv().xdescribe(description, specDefinitions); -}; -if (isCommonJS) exports.xdescribe = xdescribe; - - -// Provide the XMLHttpRequest class for IE 5.x-6.x: -jasmine.XmlHttpRequest = (typeof XMLHttpRequest == "undefined") ? function() { - function tryIt(f) { - try { - return f(); - } catch(e) { - } - return null; - } - - var xhr = tryIt(function() { - return new ActiveXObject("Msxml2.XMLHTTP.6.0"); - }) || - tryIt(function() { - return new ActiveXObject("Msxml2.XMLHTTP.3.0"); - }) || - tryIt(function() { - return new ActiveXObject("Msxml2.XMLHTTP"); - }) || - tryIt(function() { - return new ActiveXObject("Microsoft.XMLHTTP"); - }); - - if (!xhr) throw new Error("This browser does not support XMLHttpRequest."); - - return xhr; -} : XMLHttpRequest; -/** - * @namespace - */ -jasmine.util = {}; - -/** - * Declare that a child class inherit it's prototype from the parent class. - * - * @private - * @param {Function} childClass - * @param {Function} parentClass - */ -jasmine.util.inherit = function(childClass, parentClass) { - /** - * @private - */ - var subclass = function() { - }; - subclass.prototype = parentClass.prototype; - childClass.prototype = new subclass(); -}; - -jasmine.util.formatException = function(e) { - var lineNumber; - if (e.line) { - lineNumber = e.line; - } - else if (e.lineNumber) { - lineNumber = e.lineNumber; - } - - var file; - - if (e.sourceURL) { - file = e.sourceURL; - } - else if (e.fileName) { - file = e.fileName; - } - - var message = (e.name && e.message) ? (e.name + ': ' + e.message) : e.toString(); - - if (file && lineNumber) { - message += ' in ' + file + ' (line ' + lineNumber + ')'; - } - - return message; -}; - -jasmine.util.htmlEscape = function(str) { - if (!str) return str; - return str.replace(/&/g, '&') - .replace(//g, '>'); -}; - -jasmine.util.argsToArray = function(args) { - var arrayOfArgs = []; - for (var i = 0; i < args.length; i++) arrayOfArgs.push(args[i]); - return arrayOfArgs; -}; - -jasmine.util.extend = function(destination, source) { - for (var property in source) destination[property] = source[property]; - return destination; -}; - -/** - * Environment for Jasmine - * - * @constructor - */ -jasmine.Env = function() { - this.currentSpec = null; - this.currentSuite = null; - this.currentRunner_ = new jasmine.Runner(this); - - this.reporter = new jasmine.MultiReporter(); - - this.updateInterval = jasmine.DEFAULT_UPDATE_INTERVAL; - this.defaultTimeoutInterval = jasmine.DEFAULT_TIMEOUT_INTERVAL; - this.lastUpdate = 0; - this.specFilter = function() { - return true; - }; - - this.nextSpecId_ = 0; - this.nextSuiteId_ = 0; - this.equalityTesters_ = []; - - // wrap matchers - this.matchersClass = function() { - jasmine.Matchers.apply(this, arguments); - }; - jasmine.util.inherit(this.matchersClass, jasmine.Matchers); - - jasmine.Matchers.wrapInto_(jasmine.Matchers.prototype, this.matchersClass); -}; - - -jasmine.Env.prototype.setTimeout = jasmine.setTimeout; -jasmine.Env.prototype.clearTimeout = jasmine.clearTimeout; -jasmine.Env.prototype.setInterval = jasmine.setInterval; -jasmine.Env.prototype.clearInterval = jasmine.clearInterval; - -/** - * @returns an object containing jasmine version build info, if set. - */ -jasmine.Env.prototype.version = function () { - if (jasmine.version_) { - return jasmine.version_; - } else { - throw new Error('Version not set'); - } -}; - -/** - * @returns string containing jasmine version build info, if set. - */ -jasmine.Env.prototype.versionString = function() { - if (!jasmine.version_) { - return "version unknown"; - } - - var version = this.version(); - var versionString = version.major + "." + version.minor + "." + version.build; - if (version.release_candidate) { - versionString += ".rc" + version.release_candidate; - } - versionString += " revision " + version.revision; - return versionString; -}; - -/** - * @returns a sequential integer starting at 0 - */ -jasmine.Env.prototype.nextSpecId = function () { - return this.nextSpecId_++; -}; - -/** - * @returns a sequential integer starting at 0 - */ -jasmine.Env.prototype.nextSuiteId = function () { - return this.nextSuiteId_++; -}; - -/** - * Register a reporter to receive status updates from Jasmine. - * @param {jasmine.Reporter} reporter An object which will receive status updates. - */ -jasmine.Env.prototype.addReporter = function(reporter) { - this.reporter.addReporter(reporter); -}; - -jasmine.Env.prototype.execute = function() { - this.currentRunner_.execute(); -}; - -jasmine.Env.prototype.describe = function(description, specDefinitions) { - var suite = new jasmine.Suite(this, description, specDefinitions, this.currentSuite); - - var parentSuite = this.currentSuite; - if (parentSuite) { - parentSuite.add(suite); - } else { - this.currentRunner_.add(suite); - } - - this.currentSuite = suite; - - var declarationError = null; - try { - specDefinitions.call(suite); - } catch(e) { - declarationError = e; - } - - if (declarationError) { - this.it("encountered a declaration exception", function() { - throw declarationError; - }); - } - - this.currentSuite = parentSuite; - - return suite; -}; - -jasmine.Env.prototype.beforeEach = function(beforeEachFunction) { - if (this.currentSuite) { - this.currentSuite.beforeEach(beforeEachFunction); - } else { - this.currentRunner_.beforeEach(beforeEachFunction); - } -}; - -jasmine.Env.prototype.currentRunner = function () { - return this.currentRunner_; -}; - -jasmine.Env.prototype.afterEach = function(afterEachFunction) { - if (this.currentSuite) { - this.currentSuite.afterEach(afterEachFunction); - } else { - this.currentRunner_.afterEach(afterEachFunction); - } - -}; - -jasmine.Env.prototype.xdescribe = function(desc, specDefinitions) { - return { - execute: function() { - } - }; -}; - -jasmine.Env.prototype.it = function(description, func) { - var spec = new jasmine.Spec(this, this.currentSuite, description); - this.currentSuite.add(spec); - this.currentSpec = spec; - - if (func) { - spec.runs(func); - } - - return spec; -}; - -jasmine.Env.prototype.xit = function(desc, func) { - return { - id: this.nextSpecId(), - runs: function() { - } - }; -}; - -jasmine.Env.prototype.compareRegExps_ = function(a, b, mismatchKeys, mismatchValues) { - if (a.source != b.source) - mismatchValues.push("expected pattern /" + b.source + "/ is not equal to the pattern /" + a.source + "/"); - - if (a.ignoreCase != b.ignoreCase) - mismatchValues.push("expected modifier i was" + (b.ignoreCase ? " " : " not ") + "set and does not equal the origin modifier"); - - if (a.global != b.global) - mismatchValues.push("expected modifier g was" + (b.global ? " " : " not ") + "set and does not equal the origin modifier"); - - if (a.multiline != b.multiline) - mismatchValues.push("expected modifier m was" + (b.multiline ? " " : " not ") + "set and does not equal the origin modifier"); - - if (a.sticky != b.sticky) - mismatchValues.push("expected modifier y was" + (b.sticky ? " " : " not ") + "set and does not equal the origin modifier"); - - return (mismatchValues.length === 0); -}; - -jasmine.Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchValues) { - if (a.__Jasmine_been_here_before__ === b && b.__Jasmine_been_here_before__ === a) { - return true; - } - - a.__Jasmine_been_here_before__ = b; - b.__Jasmine_been_here_before__ = a; - - var hasKey = function(obj, keyName) { - return obj !== null && obj[keyName] !== jasmine.undefined; - }; - - for (var property in b) { - if (!hasKey(a, property) && hasKey(b, property)) { - mismatchKeys.push("expected has key '" + property + "', but missing from actual."); - } - } - for (property in a) { - if (!hasKey(b, property) && hasKey(a, property)) { - mismatchKeys.push("expected missing key '" + property + "', but present in actual."); - } - } - for (property in b) { - if (property == '__Jasmine_been_here_before__') continue; - if (!this.equals_(a[property], b[property], mismatchKeys, mismatchValues)) { - mismatchValues.push("'" + property + "' was '" + (b[property] ? jasmine.util.htmlEscape(b[property].toString()) : b[property]) + "' in expected, but was '" + (a[property] ? jasmine.util.htmlEscape(a[property].toString()) : a[property]) + "' in actual."); - } - } - - if (jasmine.isArray_(a) && jasmine.isArray_(b) && a.length != b.length) { - mismatchValues.push("arrays were not the same length"); - } - - delete a.__Jasmine_been_here_before__; - delete b.__Jasmine_been_here_before__; - return (mismatchKeys.length === 0 && mismatchValues.length === 0); -}; - -jasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) { - mismatchKeys = mismatchKeys || []; - mismatchValues = mismatchValues || []; - - for (var i = 0; i < this.equalityTesters_.length; i++) { - var equalityTester = this.equalityTesters_[i]; - var result = equalityTester(a, b, this, mismatchKeys, mismatchValues); - if (result !== jasmine.undefined) return result; - } - - if (a === b) return true; - - if (a === jasmine.undefined || a === null || b === jasmine.undefined || b === null) { - return (a == jasmine.undefined && b == jasmine.undefined); - } - - if (jasmine.isDomNode(a) && jasmine.isDomNode(b)) { - return a === b; - } - - if (a instanceof Date && b instanceof Date) { - return a.getTime() == b.getTime(); - } - - if (a.jasmineMatches) { - return a.jasmineMatches(b); - } - - if (b.jasmineMatches) { - return b.jasmineMatches(a); - } - - if (a instanceof jasmine.Matchers.ObjectContaining) { - return a.matches(b); - } - - if (b instanceof jasmine.Matchers.ObjectContaining) { - return b.matches(a); - } - - if (jasmine.isString_(a) && jasmine.isString_(b)) { - return (a == b); - } - - if (jasmine.isNumber_(a) && jasmine.isNumber_(b)) { - return (a == b); - } - - if (a instanceof RegExp && b instanceof RegExp) { - return this.compareRegExps_(a, b, mismatchKeys, mismatchValues); - } - - if (typeof a === "object" && typeof b === "object") { - return this.compareObjects_(a, b, mismatchKeys, mismatchValues); - } - - //Straight check - return (a === b); -}; - -jasmine.Env.prototype.contains_ = function(haystack, needle) { - if (jasmine.isArray_(haystack)) { - for (var i = 0; i < haystack.length; i++) { - if (this.equals_(haystack[i], needle)) return true; - } - return false; - } - return haystack.indexOf(needle) >= 0; -}; - -jasmine.Env.prototype.addEqualityTester = function(equalityTester) { - this.equalityTesters_.push(equalityTester); -}; -/** No-op base class for Jasmine reporters. - * - * @constructor - */ -jasmine.Reporter = function() { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.reportRunnerStarting = function(runner) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.reportRunnerResults = function(runner) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.reportSuiteResults = function(suite) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.reportSpecStarting = function(spec) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.reportSpecResults = function(spec) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.log = function(str) { -}; - -/** - * Blocks are functions with executable code that make up a spec. - * - * @constructor - * @param {jasmine.Env} env - * @param {Function} func - * @param {jasmine.Spec} spec - */ -jasmine.Block = function(env, func, spec) { - this.env = env; - this.func = func; - this.spec = spec; -}; - -jasmine.Block.prototype.execute = function(onComplete) { - if (!jasmine.CATCH_EXCEPTIONS) { - this.func.apply(this.spec); - } - else { - try { - this.func.apply(this.spec); - } catch (e) { - this.spec.fail(e); - } - } - onComplete(); -}; -/** JavaScript API reporter. - * - * @constructor - */ -jasmine.JsApiReporter = function() { - this.started = false; - this.finished = false; - this.suites_ = []; - this.results_ = {}; -}; - -jasmine.JsApiReporter.prototype.reportRunnerStarting = function(runner) { - this.started = true; - var suites = runner.topLevelSuites(); - for (var i = 0; i < suites.length; i++) { - var suite = suites[i]; - this.suites_.push(this.summarize_(suite)); - } -}; - -jasmine.JsApiReporter.prototype.suites = function() { - return this.suites_; -}; - -jasmine.JsApiReporter.prototype.summarize_ = function(suiteOrSpec) { - var isSuite = suiteOrSpec instanceof jasmine.Suite; - var summary = { - id: suiteOrSpec.id, - name: suiteOrSpec.description, - type: isSuite ? 'suite' : 'spec', - children: [] - }; - - if (isSuite) { - var children = suiteOrSpec.children(); - for (var i = 0; i < children.length; i++) { - summary.children.push(this.summarize_(children[i])); - } - } - return summary; -}; - -jasmine.JsApiReporter.prototype.results = function() { - return this.results_; -}; - -jasmine.JsApiReporter.prototype.resultsForSpec = function(specId) { - return this.results_[specId]; -}; - -//noinspection JSUnusedLocalSymbols -jasmine.JsApiReporter.prototype.reportRunnerResults = function(runner) { - this.finished = true; -}; - -//noinspection JSUnusedLocalSymbols -jasmine.JsApiReporter.prototype.reportSuiteResults = function(suite) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.JsApiReporter.prototype.reportSpecResults = function(spec) { - this.results_[spec.id] = { - messages: spec.results().getItems(), - result: spec.results().failedCount > 0 ? "failed" : "passed" - }; -}; - -//noinspection JSUnusedLocalSymbols -jasmine.JsApiReporter.prototype.log = function(str) { -}; - -jasmine.JsApiReporter.prototype.resultsForSpecs = function(specIds){ - var results = {}; - for (var i = 0; i < specIds.length; i++) { - var specId = specIds[i]; - results[specId] = this.summarizeResult_(this.results_[specId]); - } - return results; -}; - -jasmine.JsApiReporter.prototype.summarizeResult_ = function(result){ - var summaryMessages = []; - var messagesLength = result.messages.length; - for (var messageIndex = 0; messageIndex < messagesLength; messageIndex++) { - var resultMessage = result.messages[messageIndex]; - summaryMessages.push({ - text: resultMessage.type == 'log' ? resultMessage.toString() : jasmine.undefined, - passed: resultMessage.passed ? resultMessage.passed() : true, - type: resultMessage.type, - message: resultMessage.message, - trace: { - stack: resultMessage.passed && !resultMessage.passed() ? resultMessage.trace.stack : jasmine.undefined - } - }); - } - - return { - result : result.result, - messages : summaryMessages - }; -}; - -/** - * @constructor - * @param {jasmine.Env} env - * @param actual - * @param {jasmine.Spec} spec - */ -jasmine.Matchers = function(env, actual, spec, opt_isNot) { - this.env = env; - this.actual = actual; - this.spec = spec; - this.isNot = opt_isNot || false; - this.reportWasCalled_ = false; -}; - -// todo: @deprecated as of Jasmine 0.11, remove soon [xw] -jasmine.Matchers.pp = function(str) { - throw new Error("jasmine.Matchers.pp() is no longer supported, please use jasmine.pp() instead!"); -}; - -// todo: @deprecated Deprecated as of Jasmine 0.10. Rewrite your custom matchers to return true or false. [xw] -jasmine.Matchers.prototype.report = function(result, failing_message, details) { - throw new Error("As of jasmine 0.11, custom matchers must be implemented differently -- please see jasmine docs"); -}; - -jasmine.Matchers.wrapInto_ = function(prototype, matchersClass) { - for (var methodName in prototype) { - if (methodName == 'report') continue; - var orig = prototype[methodName]; - matchersClass.prototype[methodName] = jasmine.Matchers.matcherFn_(methodName, orig); - } -}; - -jasmine.Matchers.matcherFn_ = function(matcherName, matcherFunction) { - return function() { - var matcherArgs = jasmine.util.argsToArray(arguments); - var result = matcherFunction.apply(this, arguments); - - if (this.isNot) { - result = !result; - } - - if (this.reportWasCalled_) return result; - - var message; - if (!result) { - if (this.message) { - message = this.message.apply(this, arguments); - if (jasmine.isArray_(message)) { - message = message[this.isNot ? 1 : 0]; - } - } else { - var englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { return ' ' + s.toLowerCase(); }); - message = "Expected " + jasmine.pp(this.actual) + (this.isNot ? " not " : " ") + englishyPredicate; - if (matcherArgs.length > 0) { - for (var i = 0; i < matcherArgs.length; i++) { - if (i > 0) message += ","; - message += " " + jasmine.pp(matcherArgs[i]); - } - } - message += "."; - } - } - var expectationResult = new jasmine.ExpectationResult({ - matcherName: matcherName, - passed: result, - expected: matcherArgs.length > 1 ? matcherArgs : matcherArgs[0], - actual: this.actual, - message: message - }); - this.spec.addMatcherResult(expectationResult); - return jasmine.undefined; - }; -}; - - - - -/** - * toBe: compares the actual to the expected using === - * @param expected - */ -jasmine.Matchers.prototype.toBe = function(expected) { - return this.actual === expected; -}; - -/** - * toNotBe: compares the actual to the expected using !== - * @param expected - * @deprecated as of 1.0. Use not.toBe() instead. - */ -jasmine.Matchers.prototype.toNotBe = function(expected) { - return this.actual !== expected; -}; - -/** - * toEqual: compares the actual to the expected using common sense equality. Handles Objects, Arrays, etc. - * - * @param expected - */ -jasmine.Matchers.prototype.toEqual = function(expected) { - return this.env.equals_(this.actual, expected); -}; - -/** - * toNotEqual: compares the actual to the expected using the ! of jasmine.Matchers.toEqual - * @param expected - * @deprecated as of 1.0. Use not.toEqual() instead. - */ -jasmine.Matchers.prototype.toNotEqual = function(expected) { - return !this.env.equals_(this.actual, expected); -}; - -/** - * Matcher that compares the actual to the expected using a regular expression. Constructs a RegExp, so takes - * a pattern or a String. - * - * @param expected - */ -jasmine.Matchers.prototype.toMatch = function(expected) { - return new RegExp(expected).test(this.actual); -}; - -/** - * Matcher that compares the actual to the expected using the boolean inverse of jasmine.Matchers.toMatch - * @param expected - * @deprecated as of 1.0. Use not.toMatch() instead. - */ -jasmine.Matchers.prototype.toNotMatch = function(expected) { - return !(new RegExp(expected).test(this.actual)); -}; - -/** - * Matcher that compares the actual to jasmine.undefined. - */ -jasmine.Matchers.prototype.toBeDefined = function() { - return (this.actual !== jasmine.undefined); -}; - -/** - * Matcher that compares the actual to jasmine.undefined. - */ -jasmine.Matchers.prototype.toBeUndefined = function() { - return (this.actual === jasmine.undefined); -}; - -/** - * Matcher that compares the actual to null. - */ -jasmine.Matchers.prototype.toBeNull = function() { - return (this.actual === null); -}; - -/** - * Matcher that compares the actual to NaN. - */ -jasmine.Matchers.prototype.toBeNaN = function() { - this.message = function() { - return [ "Expected " + jasmine.pp(this.actual) + " to be NaN." ]; - }; - - return (this.actual !== this.actual); -}; - -/** - * Matcher that boolean not-nots the actual. - */ -jasmine.Matchers.prototype.toBeTruthy = function() { - return !!this.actual; -}; - - -/** - * Matcher that boolean nots the actual. - */ -jasmine.Matchers.prototype.toBeFalsy = function() { - return !this.actual; -}; - - -/** - * Matcher that checks to see if the actual, a Jasmine spy, was called. - */ -jasmine.Matchers.prototype.toHaveBeenCalled = function() { - if (arguments.length > 0) { - throw new Error('toHaveBeenCalled does not take arguments, use toHaveBeenCalledWith'); - } - - if (!jasmine.isSpy(this.actual)) { - throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); - } - - this.message = function() { - return [ - "Expected spy " + this.actual.identity + " to have been called.", - "Expected spy " + this.actual.identity + " not to have been called." - ]; - }; - - return this.actual.wasCalled; -}; - -/** @deprecated Use expect(xxx).toHaveBeenCalled() instead */ -jasmine.Matchers.prototype.wasCalled = jasmine.Matchers.prototype.toHaveBeenCalled; - -/** - * Matcher that checks to see if the actual, a Jasmine spy, was not called. - * - * @deprecated Use expect(xxx).not.toHaveBeenCalled() instead - */ -jasmine.Matchers.prototype.wasNotCalled = function() { - if (arguments.length > 0) { - throw new Error('wasNotCalled does not take arguments'); - } - - if (!jasmine.isSpy(this.actual)) { - throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); - } - - this.message = function() { - return [ - "Expected spy " + this.actual.identity + " to not have been called.", - "Expected spy " + this.actual.identity + " to have been called." - ]; - }; - - return !this.actual.wasCalled; -}; - -/** - * Matcher that checks to see if the actual, a Jasmine spy, was called with a set of parameters. - * - * @example - * - */ -jasmine.Matchers.prototype.toHaveBeenCalledWith = function() { - var expectedArgs = jasmine.util.argsToArray(arguments); - if (!jasmine.isSpy(this.actual)) { - throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); - } - this.message = function() { - var invertedMessage = "Expected spy " + this.actual.identity + " not to have been called with " + jasmine.pp(expectedArgs) + " but it was."; - var positiveMessage = ""; - if (this.actual.callCount === 0) { - positiveMessage = "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but it was never called."; - } else { - positiveMessage = "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but actual calls were " + jasmine.pp(this.actual.argsForCall).replace(/^\[ | \]$/g, '') - } - return [positiveMessage, invertedMessage]; - }; - - return this.env.contains_(this.actual.argsForCall, expectedArgs); -}; - -/** @deprecated Use expect(xxx).toHaveBeenCalledWith() instead */ -jasmine.Matchers.prototype.wasCalledWith = jasmine.Matchers.prototype.toHaveBeenCalledWith; - -/** @deprecated Use expect(xxx).not.toHaveBeenCalledWith() instead */ -jasmine.Matchers.prototype.wasNotCalledWith = function() { - var expectedArgs = jasmine.util.argsToArray(arguments); - if (!jasmine.isSpy(this.actual)) { - throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); - } - - this.message = function() { - return [ - "Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but it was", - "Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but it was" - ]; - }; - - return !this.env.contains_(this.actual.argsForCall, expectedArgs); -}; - -/** - * Matcher that checks that the expected item is an element in the actual Array. - * - * @param {Object} expected - */ -jasmine.Matchers.prototype.toContain = function(expected) { - return this.env.contains_(this.actual, expected); -}; - -/** - * Matcher that checks that the expected item is NOT an element in the actual Array. - * - * @param {Object} expected - * @deprecated as of 1.0. Use not.toContain() instead. - */ -jasmine.Matchers.prototype.toNotContain = function(expected) { - return !this.env.contains_(this.actual, expected); -}; - -jasmine.Matchers.prototype.toBeLessThan = function(expected) { - return this.actual < expected; -}; - -jasmine.Matchers.prototype.toBeGreaterThan = function(expected) { - return this.actual > expected; -}; - -/** - * Matcher that checks that the expected item is equal to the actual item - * up to a given level of decimal precision (default 2). - * - * @param {Number} expected - * @param {Number} precision, as number of decimal places - */ -jasmine.Matchers.prototype.toBeCloseTo = function(expected, precision) { - if (!(precision === 0)) { - precision = precision || 2; - } - return Math.abs(expected - this.actual) < (Math.pow(10, -precision) / 2); -}; - -/** - * Matcher that checks that the expected exception was thrown by the actual. - * - * @param {String} [expected] - */ -jasmine.Matchers.prototype.toThrow = function(expected) { - var result = false; - var exception; - if (typeof this.actual != 'function') { - throw new Error('Actual is not a function'); - } - try { - this.actual(); - } catch (e) { - exception = e; - } - if (exception) { - result = (expected === jasmine.undefined || this.env.equals_(exception.message || exception, expected.message || expected)); - } - - var not = this.isNot ? "not " : ""; - - this.message = function() { - if (exception && (expected === jasmine.undefined || !this.env.equals_(exception.message || exception, expected.message || expected))) { - return ["Expected function " + not + "to throw", expected ? expected.message || expected : "an exception", ", but it threw", exception.message || exception].join(' '); - } else { - return "Expected function to throw an exception."; - } - }; - - return result; -}; - -jasmine.Matchers.Any = function(expectedClass) { - this.expectedClass = expectedClass; -}; - -jasmine.Matchers.Any.prototype.jasmineMatches = function(other) { - if (this.expectedClass == String) { - return typeof other == 'string' || other instanceof String; - } - - if (this.expectedClass == Number) { - return typeof other == 'number' || other instanceof Number; - } - - if (this.expectedClass == Function) { - return typeof other == 'function' || other instanceof Function; - } - - if (this.expectedClass == Object) { - return typeof other == 'object'; - } - - return other instanceof this.expectedClass; -}; - -jasmine.Matchers.Any.prototype.jasmineToString = function() { - return ''; -}; - -jasmine.Matchers.ObjectContaining = function (sample) { - this.sample = sample; -}; - -jasmine.Matchers.ObjectContaining.prototype.jasmineMatches = function(other, mismatchKeys, mismatchValues) { - mismatchKeys = mismatchKeys || []; - mismatchValues = mismatchValues || []; - - var env = jasmine.getEnv(); - - var hasKey = function(obj, keyName) { - return obj != null && obj[keyName] !== jasmine.undefined; - }; - - for (var property in this.sample) { - if (!hasKey(other, property) && hasKey(this.sample, property)) { - mismatchKeys.push("expected has key '" + property + "', but missing from actual."); - } - else if (!env.equals_(this.sample[property], other[property], mismatchKeys, mismatchValues)) { - mismatchValues.push("'" + property + "' was '" + (other[property] ? jasmine.util.htmlEscape(other[property].toString()) : other[property]) + "' in expected, but was '" + (this.sample[property] ? jasmine.util.htmlEscape(this.sample[property].toString()) : this.sample[property]) + "' in actual."); - } - } - - return (mismatchKeys.length === 0 && mismatchValues.length === 0); -}; - -jasmine.Matchers.ObjectContaining.prototype.jasmineToString = function () { - return ""; -}; -// Mock setTimeout, clearTimeout -// Contributed by Pivotal Computer Systems, www.pivotalsf.com - -jasmine.FakeTimer = function() { - this.reset(); - - var self = this; - self.setTimeout = function(funcToCall, millis) { - self.timeoutsMade++; - self.scheduleFunction(self.timeoutsMade, funcToCall, millis, false); - return self.timeoutsMade; - }; - - self.setInterval = function(funcToCall, millis) { - self.timeoutsMade++; - self.scheduleFunction(self.timeoutsMade, funcToCall, millis, true); - return self.timeoutsMade; - }; - - self.clearTimeout = function(timeoutKey) { - self.scheduledFunctions[timeoutKey] = jasmine.undefined; - }; - - self.clearInterval = function(timeoutKey) { - self.scheduledFunctions[timeoutKey] = jasmine.undefined; - }; - -}; - -jasmine.FakeTimer.prototype.reset = function() { - this.timeoutsMade = 0; - this.scheduledFunctions = {}; - this.nowMillis = 0; -}; - -jasmine.FakeTimer.prototype.tick = function(millis) { - var oldMillis = this.nowMillis; - var newMillis = oldMillis + millis; - this.runFunctionsWithinRange(oldMillis, newMillis); - this.nowMillis = newMillis; -}; - -jasmine.FakeTimer.prototype.runFunctionsWithinRange = function(oldMillis, nowMillis) { - var scheduledFunc; - var funcsToRun = []; - for (var timeoutKey in this.scheduledFunctions) { - scheduledFunc = this.scheduledFunctions[timeoutKey]; - if (scheduledFunc != jasmine.undefined && - scheduledFunc.runAtMillis >= oldMillis && - scheduledFunc.runAtMillis <= nowMillis) { - funcsToRun.push(scheduledFunc); - this.scheduledFunctions[timeoutKey] = jasmine.undefined; - } - } - - if (funcsToRun.length > 0) { - funcsToRun.sort(function(a, b) { - return a.runAtMillis - b.runAtMillis; - }); - for (var i = 0; i < funcsToRun.length; ++i) { - try { - var funcToRun = funcsToRun[i]; - this.nowMillis = funcToRun.runAtMillis; - funcToRun.funcToCall(); - if (funcToRun.recurring) { - this.scheduleFunction(funcToRun.timeoutKey, - funcToRun.funcToCall, - funcToRun.millis, - true); - } - } catch(e) { - } - } - this.runFunctionsWithinRange(oldMillis, nowMillis); - } -}; - -jasmine.FakeTimer.prototype.scheduleFunction = function(timeoutKey, funcToCall, millis, recurring) { - this.scheduledFunctions[timeoutKey] = { - runAtMillis: this.nowMillis + millis, - funcToCall: funcToCall, - recurring: recurring, - timeoutKey: timeoutKey, - millis: millis - }; -}; - -/** - * @namespace - */ -jasmine.Clock = { - defaultFakeTimer: new jasmine.FakeTimer(), - - reset: function() { - jasmine.Clock.assertInstalled(); - jasmine.Clock.defaultFakeTimer.reset(); - }, - - tick: function(millis) { - jasmine.Clock.assertInstalled(); - jasmine.Clock.defaultFakeTimer.tick(millis); - }, - - runFunctionsWithinRange: function(oldMillis, nowMillis) { - jasmine.Clock.defaultFakeTimer.runFunctionsWithinRange(oldMillis, nowMillis); - }, - - scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) { - jasmine.Clock.defaultFakeTimer.scheduleFunction(timeoutKey, funcToCall, millis, recurring); - }, - - useMock: function() { - if (!jasmine.Clock.isInstalled()) { - var spec = jasmine.getEnv().currentSpec; - spec.after(jasmine.Clock.uninstallMock); - - jasmine.Clock.installMock(); - } - }, - - installMock: function() { - jasmine.Clock.installed = jasmine.Clock.defaultFakeTimer; - }, - - uninstallMock: function() { - jasmine.Clock.assertInstalled(); - jasmine.Clock.installed = jasmine.Clock.real; - }, - - real: { - setTimeout: jasmine.getGlobal().setTimeout, - clearTimeout: jasmine.getGlobal().clearTimeout, - setInterval: jasmine.getGlobal().setInterval, - clearInterval: jasmine.getGlobal().clearInterval - }, - - assertInstalled: function() { - if (!jasmine.Clock.isInstalled()) { - throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()"); - } - }, - - isInstalled: function() { - return jasmine.Clock.installed == jasmine.Clock.defaultFakeTimer; - }, - - installed: null -}; -jasmine.Clock.installed = jasmine.Clock.real; - -//else for IE support -jasmine.getGlobal().setTimeout = function(funcToCall, millis) { - if (jasmine.Clock.installed.setTimeout.apply) { - return jasmine.Clock.installed.setTimeout.apply(this, arguments); - } else { - return jasmine.Clock.installed.setTimeout(funcToCall, millis); - } -}; - -jasmine.getGlobal().setInterval = function(funcToCall, millis) { - if (jasmine.Clock.installed.setInterval.apply) { - return jasmine.Clock.installed.setInterval.apply(this, arguments); - } else { - return jasmine.Clock.installed.setInterval(funcToCall, millis); - } -}; - -jasmine.getGlobal().clearTimeout = function(timeoutKey) { - if (jasmine.Clock.installed.clearTimeout.apply) { - return jasmine.Clock.installed.clearTimeout.apply(this, arguments); - } else { - return jasmine.Clock.installed.clearTimeout(timeoutKey); - } -}; - -jasmine.getGlobal().clearInterval = function(timeoutKey) { - if (jasmine.Clock.installed.clearTimeout.apply) { - return jasmine.Clock.installed.clearInterval.apply(this, arguments); - } else { - return jasmine.Clock.installed.clearInterval(timeoutKey); - } -}; - -/** - * @constructor - */ -jasmine.MultiReporter = function() { - this.subReporters_ = []; -}; -jasmine.util.inherit(jasmine.MultiReporter, jasmine.Reporter); - -jasmine.MultiReporter.prototype.addReporter = function(reporter) { - this.subReporters_.push(reporter); -}; - -(function() { - var functionNames = [ - "reportRunnerStarting", - "reportRunnerResults", - "reportSuiteResults", - "reportSpecStarting", - "reportSpecResults", - "log" - ]; - for (var i = 0; i < functionNames.length; i++) { - var functionName = functionNames[i]; - jasmine.MultiReporter.prototype[functionName] = (function(functionName) { - return function() { - for (var j = 0; j < this.subReporters_.length; j++) { - var subReporter = this.subReporters_[j]; - if (subReporter[functionName]) { - subReporter[functionName].apply(subReporter, arguments); - } - } - }; - })(functionName); - } -})(); -/** - * Holds results for a set of Jasmine spec. Allows for the results array to hold another jasmine.NestedResults - * - * @constructor - */ -jasmine.NestedResults = function() { - /** - * The total count of results - */ - this.totalCount = 0; - /** - * Number of passed results - */ - this.passedCount = 0; - /** - * Number of failed results - */ - this.failedCount = 0; - /** - * Was this suite/spec skipped? - */ - this.skipped = false; - /** - * @ignore - */ - this.items_ = []; -}; - -/** - * Roll up the result counts. - * - * @param result - */ -jasmine.NestedResults.prototype.rollupCounts = function(result) { - this.totalCount += result.totalCount; - this.passedCount += result.passedCount; - this.failedCount += result.failedCount; -}; - -/** - * Adds a log message. - * @param values Array of message parts which will be concatenated later. - */ -jasmine.NestedResults.prototype.log = function(values) { - this.items_.push(new jasmine.MessageResult(values)); -}; - -/** - * Getter for the results: message & results. - */ -jasmine.NestedResults.prototype.getItems = function() { - return this.items_; -}; - -/** - * Adds a result, tracking counts (total, passed, & failed) - * @param {jasmine.ExpectationResult|jasmine.NestedResults} result - */ -jasmine.NestedResults.prototype.addResult = function(result) { - if (result.type != 'log') { - if (result.items_) { - this.rollupCounts(result); - } else { - this.totalCount++; - if (result.passed()) { - this.passedCount++; - } else { - this.failedCount++; - } - } - } - this.items_.push(result); -}; - -/** - * @returns {Boolean} True if everything below passed - */ -jasmine.NestedResults.prototype.passed = function() { - return this.passedCount === this.totalCount; -}; -/** - * Base class for pretty printing for expectation results. - */ -jasmine.PrettyPrinter = function() { - this.ppNestLevel_ = 0; -}; - -/** - * Formats a value in a nice, human-readable string. - * - * @param value - */ -jasmine.PrettyPrinter.prototype.format = function(value) { - this.ppNestLevel_++; - try { - if (value === jasmine.undefined) { - this.emitScalar('undefined'); - } else if (value === null) { - this.emitScalar('null'); - } else if (value === jasmine.getGlobal()) { - this.emitScalar(''); - } else if (value.jasmineToString) { - this.emitScalar(value.jasmineToString()); - } else if (typeof value === 'string') { - this.emitString(value); - } else if (jasmine.isSpy(value)) { - this.emitScalar("spy on " + value.identity); - } else if (value instanceof RegExp) { - this.emitScalar(value.toString()); - } else if (typeof value === 'function') { - this.emitScalar('Function'); - } else if (typeof value.nodeType === 'number') { - this.emitScalar('HTMLNode'); - } else if (value instanceof Date) { - this.emitScalar('Date(' + value + ')'); - } else if (value.__Jasmine_been_here_before__) { - this.emitScalar(''); - } else if (jasmine.isArray_(value) || typeof value == 'object') { - value.__Jasmine_been_here_before__ = true; - if (jasmine.isArray_(value)) { - this.emitArray(value); - } else { - this.emitObject(value); - } - delete value.__Jasmine_been_here_before__; - } else { - this.emitScalar(value.toString()); - } - } finally { - this.ppNestLevel_--; - } -}; - -jasmine.PrettyPrinter.prototype.iterateObject = function(obj, fn) { - for (var property in obj) { - if (!obj.hasOwnProperty(property)) continue; - if (property == '__Jasmine_been_here_before__') continue; - fn(property, obj.__lookupGetter__ ? (obj.__lookupGetter__(property) !== jasmine.undefined && - obj.__lookupGetter__(property) !== null) : false); - } -}; - -jasmine.PrettyPrinter.prototype.emitArray = jasmine.unimplementedMethod_; -jasmine.PrettyPrinter.prototype.emitObject = jasmine.unimplementedMethod_; -jasmine.PrettyPrinter.prototype.emitScalar = jasmine.unimplementedMethod_; -jasmine.PrettyPrinter.prototype.emitString = jasmine.unimplementedMethod_; - -jasmine.StringPrettyPrinter = function() { - jasmine.PrettyPrinter.call(this); - - this.string = ''; -}; -jasmine.util.inherit(jasmine.StringPrettyPrinter, jasmine.PrettyPrinter); - -jasmine.StringPrettyPrinter.prototype.emitScalar = function(value) { - this.append(value); -}; - -jasmine.StringPrettyPrinter.prototype.emitString = function(value) { - this.append("'" + value + "'"); -}; - -jasmine.StringPrettyPrinter.prototype.emitArray = function(array) { - if (this.ppNestLevel_ > jasmine.MAX_PRETTY_PRINT_DEPTH) { - this.append("Array"); - return; - } - - this.append('[ '); - for (var i = 0; i < array.length; i++) { - if (i > 0) { - this.append(', '); - } - this.format(array[i]); - } - this.append(' ]'); -}; - -jasmine.StringPrettyPrinter.prototype.emitObject = function(obj) { - if (this.ppNestLevel_ > jasmine.MAX_PRETTY_PRINT_DEPTH) { - this.append("Object"); - return; - } - - var self = this; - this.append('{ '); - var first = true; - - this.iterateObject(obj, function(property, isGetter) { - if (first) { - first = false; - } else { - self.append(', '); - } - - self.append(property); - self.append(' : '); - if (isGetter) { - self.append(''); - } else { - self.format(obj[property]); - } - }); - - this.append(' }'); -}; - -jasmine.StringPrettyPrinter.prototype.append = function(value) { - this.string += value; -}; -jasmine.Queue = function(env) { - this.env = env; - - // parallel to blocks. each true value in this array means the block will - // get executed even if we abort - this.ensured = []; - this.blocks = []; - this.running = false; - this.index = 0; - this.offset = 0; - this.abort = false; -}; - -jasmine.Queue.prototype.addBefore = function(block, ensure) { - if (ensure === jasmine.undefined) { - ensure = false; - } - - this.blocks.unshift(block); - this.ensured.unshift(ensure); -}; - -jasmine.Queue.prototype.add = function(block, ensure) { - if (ensure === jasmine.undefined) { - ensure = false; - } - - this.blocks.push(block); - this.ensured.push(ensure); -}; - -jasmine.Queue.prototype.insertNext = function(block, ensure) { - if (ensure === jasmine.undefined) { - ensure = false; - } - - this.ensured.splice((this.index + this.offset + 1), 0, ensure); - this.blocks.splice((this.index + this.offset + 1), 0, block); - this.offset++; -}; - -jasmine.Queue.prototype.start = function(onComplete) { - this.running = true; - this.onComplete = onComplete; - this.next_(); -}; - -jasmine.Queue.prototype.isRunning = function() { - return this.running; -}; - -jasmine.Queue.LOOP_DONT_RECURSE = true; - -jasmine.Queue.prototype.next_ = function() { - var self = this; - var goAgain = true; - - while (goAgain) { - goAgain = false; - - if (self.index < self.blocks.length && !(this.abort && !this.ensured[self.index])) { - var calledSynchronously = true; - var completedSynchronously = false; - - var onComplete = function () { - if (jasmine.Queue.LOOP_DONT_RECURSE && calledSynchronously) { - completedSynchronously = true; - return; - } - - if (self.blocks[self.index].abort) { - self.abort = true; - } - - self.offset = 0; - self.index++; - - var now = new Date().getTime(); - if (self.env.updateInterval && now - self.env.lastUpdate > self.env.updateInterval) { - self.env.lastUpdate = now; - self.env.setTimeout(function() { - self.next_(); - }, 0); - } else { - if (jasmine.Queue.LOOP_DONT_RECURSE && completedSynchronously) { - goAgain = true; - } else { - self.next_(); - } - } - }; - self.blocks[self.index].execute(onComplete); - - calledSynchronously = false; - if (completedSynchronously) { - onComplete(); - } - - } else { - self.running = false; - if (self.onComplete) { - self.onComplete(); - } - } - } -}; - -jasmine.Queue.prototype.results = function() { - var results = new jasmine.NestedResults(); - for (var i = 0; i < this.blocks.length; i++) { - if (this.blocks[i].results) { - results.addResult(this.blocks[i].results()); - } - } - return results; -}; - - -/** - * Runner - * - * @constructor - * @param {jasmine.Env} env - */ -jasmine.Runner = function(env) { - var self = this; - self.env = env; - self.queue = new jasmine.Queue(env); - self.before_ = []; - self.after_ = []; - self.suites_ = []; -}; - -jasmine.Runner.prototype.execute = function() { - var self = this; - if (self.env.reporter.reportRunnerStarting) { - self.env.reporter.reportRunnerStarting(this); - } - self.queue.start(function () { - self.finishCallback(); - }); -}; - -jasmine.Runner.prototype.beforeEach = function(beforeEachFunction) { - beforeEachFunction.typeName = 'beforeEach'; - this.before_.splice(0,0,beforeEachFunction); -}; - -jasmine.Runner.prototype.afterEach = function(afterEachFunction) { - afterEachFunction.typeName = 'afterEach'; - this.after_.splice(0,0,afterEachFunction); -}; - - -jasmine.Runner.prototype.finishCallback = function() { - this.env.reporter.reportRunnerResults(this); -}; - -jasmine.Runner.prototype.addSuite = function(suite) { - this.suites_.push(suite); -}; - -jasmine.Runner.prototype.add = function(block) { - if (block instanceof jasmine.Suite) { - this.addSuite(block); - } - this.queue.add(block); -}; - -jasmine.Runner.prototype.specs = function () { - var suites = this.suites(); - var specs = []; - for (var i = 0; i < suites.length; i++) { - specs = specs.concat(suites[i].specs()); - } - return specs; -}; - -jasmine.Runner.prototype.suites = function() { - return this.suites_; -}; - -jasmine.Runner.prototype.topLevelSuites = function() { - var topLevelSuites = []; - for (var i = 0; i < this.suites_.length; i++) { - if (!this.suites_[i].parentSuite) { - topLevelSuites.push(this.suites_[i]); - } - } - return topLevelSuites; -}; - -jasmine.Runner.prototype.results = function() { - return this.queue.results(); -}; -/** - * Internal representation of a Jasmine specification, or test. - * - * @constructor - * @param {jasmine.Env} env - * @param {jasmine.Suite} suite - * @param {String} description - */ -jasmine.Spec = function(env, suite, description) { - if (!env) { - throw new Error('jasmine.Env() required'); - } - if (!suite) { - throw new Error('jasmine.Suite() required'); - } - var spec = this; - spec.id = env.nextSpecId ? env.nextSpecId() : null; - spec.env = env; - spec.suite = suite; - spec.description = description; - spec.queue = new jasmine.Queue(env); - - spec.afterCallbacks = []; - spec.spies_ = []; - - spec.results_ = new jasmine.NestedResults(); - spec.results_.description = description; - spec.matchersClass = null; -}; - -jasmine.Spec.prototype.getFullName = function() { - return this.suite.getFullName() + ' ' + this.description + '.'; -}; - - -jasmine.Spec.prototype.results = function() { - return this.results_; -}; - -/** - * All parameters are pretty-printed and concatenated together, then written to the spec's output. - * - * Be careful not to leave calls to jasmine.log in production code. - */ -jasmine.Spec.prototype.log = function() { - return this.results_.log(arguments); -}; - -jasmine.Spec.prototype.runs = function (func) { - var block = new jasmine.Block(this.env, func, this); - this.addToQueue(block); - return this; -}; - -jasmine.Spec.prototype.addToQueue = function (block) { - if (this.queue.isRunning()) { - this.queue.insertNext(block); - } else { - this.queue.add(block); - } -}; - -/** - * @param {jasmine.ExpectationResult} result - */ -jasmine.Spec.prototype.addMatcherResult = function(result) { - this.results_.addResult(result); -}; - -jasmine.Spec.prototype.expect = function(actual) { - var positive = new (this.getMatchersClass_())(this.env, actual, this); - positive.not = new (this.getMatchersClass_())(this.env, actual, this, true); - return positive; -}; - -/** - * Waits a fixed time period before moving to the next block. - * - * @deprecated Use waitsFor() instead - * @param {Number} timeout milliseconds to wait - */ -jasmine.Spec.prototype.waits = function(timeout) { - var waitsFunc = new jasmine.WaitsBlock(this.env, timeout, this); - this.addToQueue(waitsFunc); - return this; -}; - -/** - * Waits for the latchFunction to return true before proceeding to the next block. - * - * @param {Function} latchFunction - * @param {String} optional_timeoutMessage - * @param {Number} optional_timeout - */ -jasmine.Spec.prototype.waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) { - var latchFunction_ = null; - var optional_timeoutMessage_ = null; - var optional_timeout_ = null; - - for (var i = 0; i < arguments.length; i++) { - var arg = arguments[i]; - switch (typeof arg) { - case 'function': - latchFunction_ = arg; - break; - case 'string': - optional_timeoutMessage_ = arg; - break; - case 'number': - optional_timeout_ = arg; - break; - } - } - - var waitsForFunc = new jasmine.WaitsForBlock(this.env, optional_timeout_, latchFunction_, optional_timeoutMessage_, this); - this.addToQueue(waitsForFunc); - return this; -}; - -jasmine.Spec.prototype.fail = function (e) { - var expectationResult = new jasmine.ExpectationResult({ - passed: false, - message: e ? jasmine.util.formatException(e) : 'Exception', - trace: { stack: e.stack } - }); - this.results_.addResult(expectationResult); -}; - -jasmine.Spec.prototype.getMatchersClass_ = function() { - return this.matchersClass || this.env.matchersClass; -}; - -jasmine.Spec.prototype.addMatchers = function(matchersPrototype) { - var parent = this.getMatchersClass_(); - var newMatchersClass = function() { - parent.apply(this, arguments); - }; - jasmine.util.inherit(newMatchersClass, parent); - jasmine.Matchers.wrapInto_(matchersPrototype, newMatchersClass); - this.matchersClass = newMatchersClass; -}; - -jasmine.Spec.prototype.finishCallback = function() { - this.env.reporter.reportSpecResults(this); -}; - -jasmine.Spec.prototype.finish = function(onComplete) { - this.removeAllSpies(); - this.finishCallback(); - if (onComplete) { - onComplete(); - } -}; - -jasmine.Spec.prototype.after = function(doAfter) { - if (this.queue.isRunning()) { - this.queue.add(new jasmine.Block(this.env, doAfter, this), true); - } else { - this.afterCallbacks.unshift(doAfter); - } -}; - -jasmine.Spec.prototype.execute = function(onComplete) { - var spec = this; - if (!spec.env.specFilter(spec)) { - spec.results_.skipped = true; - spec.finish(onComplete); - return; - } - - this.env.reporter.reportSpecStarting(this); - - spec.env.currentSpec = spec; - - spec.addBeforesAndAftersToQueue(); - - spec.queue.start(function () { - spec.finish(onComplete); - }); -}; - -jasmine.Spec.prototype.addBeforesAndAftersToQueue = function() { - var runner = this.env.currentRunner(); - var i; - - for (var suite = this.suite; suite; suite = suite.parentSuite) { - for (i = 0; i < suite.before_.length; i++) { - this.queue.addBefore(new jasmine.Block(this.env, suite.before_[i], this)); - } - } - for (i = 0; i < runner.before_.length; i++) { - this.queue.addBefore(new jasmine.Block(this.env, runner.before_[i], this)); - } - for (i = 0; i < this.afterCallbacks.length; i++) { - this.queue.add(new jasmine.Block(this.env, this.afterCallbacks[i], this), true); - } - for (suite = this.suite; suite; suite = suite.parentSuite) { - for (i = 0; i < suite.after_.length; i++) { - this.queue.add(new jasmine.Block(this.env, suite.after_[i], this), true); - } - } - for (i = 0; i < runner.after_.length; i++) { - this.queue.add(new jasmine.Block(this.env, runner.after_[i], this), true); - } -}; - -jasmine.Spec.prototype.explodes = function() { - throw 'explodes function should not have been called'; -}; - -jasmine.Spec.prototype.spyOn = function(obj, methodName, ignoreMethodDoesntExist) { - if (obj == jasmine.undefined) { - throw "spyOn could not find an object to spy upon for " + methodName + "()"; - } - - if (!ignoreMethodDoesntExist && obj[methodName] === jasmine.undefined) { - throw methodName + '() method does not exist'; - } - - if (!ignoreMethodDoesntExist && obj[methodName] && obj[methodName].isSpy) { - throw new Error(methodName + ' has already been spied upon'); - } - - var spyObj = jasmine.createSpy(methodName); - - this.spies_.push(spyObj); - spyObj.baseObj = obj; - spyObj.methodName = methodName; - spyObj.originalValue = obj[methodName]; - - obj[methodName] = spyObj; - - return spyObj; -}; - -jasmine.Spec.prototype.removeAllSpies = function() { - for (var i = 0; i < this.spies_.length; i++) { - var spy = this.spies_[i]; - spy.baseObj[spy.methodName] = spy.originalValue; - } - this.spies_ = []; -}; - -/** - * Internal representation of a Jasmine suite. - * - * @constructor - * @param {jasmine.Env} env - * @param {String} description - * @param {Function} specDefinitions - * @param {jasmine.Suite} parentSuite - */ -jasmine.Suite = function(env, description, specDefinitions, parentSuite) { - var self = this; - self.id = env.nextSuiteId ? env.nextSuiteId() : null; - self.description = description; - self.queue = new jasmine.Queue(env); - self.parentSuite = parentSuite; - self.env = env; - self.before_ = []; - self.after_ = []; - self.children_ = []; - self.suites_ = []; - self.specs_ = []; -}; - -jasmine.Suite.prototype.getFullName = function() { - var fullName = this.description; - for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) { - fullName = parentSuite.description + ' ' + fullName; - } - return fullName; -}; - -jasmine.Suite.prototype.finish = function(onComplete) { - this.env.reporter.reportSuiteResults(this); - this.finished = true; - if (typeof(onComplete) == 'function') { - onComplete(); - } -}; - -jasmine.Suite.prototype.beforeEach = function(beforeEachFunction) { - beforeEachFunction.typeName = 'beforeEach'; - this.before_.unshift(beforeEachFunction); -}; - -jasmine.Suite.prototype.afterEach = function(afterEachFunction) { - afterEachFunction.typeName = 'afterEach'; - this.after_.unshift(afterEachFunction); -}; - -jasmine.Suite.prototype.results = function() { - return this.queue.results(); -}; - -jasmine.Suite.prototype.add = function(suiteOrSpec) { - this.children_.push(suiteOrSpec); - if (suiteOrSpec instanceof jasmine.Suite) { - this.suites_.push(suiteOrSpec); - this.env.currentRunner().addSuite(suiteOrSpec); - } else { - this.specs_.push(suiteOrSpec); - } - this.queue.add(suiteOrSpec); -}; - -jasmine.Suite.prototype.specs = function() { - return this.specs_; -}; - -jasmine.Suite.prototype.suites = function() { - return this.suites_; -}; - -jasmine.Suite.prototype.children = function() { - return this.children_; -}; - -jasmine.Suite.prototype.execute = function(onComplete) { - var self = this; - this.queue.start(function () { - self.finish(onComplete); - }); -}; -jasmine.WaitsBlock = function(env, timeout, spec) { - this.timeout = timeout; - jasmine.Block.call(this, env, null, spec); -}; - -jasmine.util.inherit(jasmine.WaitsBlock, jasmine.Block); - -jasmine.WaitsBlock.prototype.execute = function (onComplete) { - if (jasmine.VERBOSE) { - this.env.reporter.log('>> Jasmine waiting for ' + this.timeout + ' ms...'); - } - this.env.setTimeout(function () { - onComplete(); - }, this.timeout); -}; -/** - * A block which waits for some condition to become true, with timeout. - * - * @constructor - * @extends jasmine.Block - * @param {jasmine.Env} env The Jasmine environment. - * @param {Number} timeout The maximum time in milliseconds to wait for the condition to become true. - * @param {Function} latchFunction A function which returns true when the desired condition has been met. - * @param {String} message The message to display if the desired condition hasn't been met within the given time period. - * @param {jasmine.Spec} spec The Jasmine spec. - */ -jasmine.WaitsForBlock = function(env, timeout, latchFunction, message, spec) { - this.timeout = timeout || env.defaultTimeoutInterval; - this.latchFunction = latchFunction; - this.message = message; - this.totalTimeSpentWaitingForLatch = 0; - jasmine.Block.call(this, env, null, spec); -}; -jasmine.util.inherit(jasmine.WaitsForBlock, jasmine.Block); - -jasmine.WaitsForBlock.TIMEOUT_INCREMENT = 10; - -jasmine.WaitsForBlock.prototype.execute = function(onComplete) { - if (jasmine.VERBOSE) { - this.env.reporter.log('>> Jasmine waiting for ' + (this.message || 'something to happen')); - } - var latchFunctionResult; - try { - latchFunctionResult = this.latchFunction.apply(this.spec); - } catch (e) { - this.spec.fail(e); - onComplete(); - return; - } - - if (latchFunctionResult) { - onComplete(); - } else if (this.totalTimeSpentWaitingForLatch >= this.timeout) { - var message = 'timed out after ' + this.timeout + ' msec waiting for ' + (this.message || 'something to happen'); - this.spec.fail({ - name: 'timeout', - message: message - }); - - this.abort = true; - onComplete(); - } else { - this.totalTimeSpentWaitingForLatch += jasmine.WaitsForBlock.TIMEOUT_INCREMENT; - var self = this; - this.env.setTimeout(function() { - self.execute(onComplete); - }, jasmine.WaitsForBlock.TIMEOUT_INCREMENT); - } -}; - -jasmine.version_= { - "major": 1, - "minor": 3, - "build": 1, - "revision": 1354556913 -}; diff --git a/node_modules/less-middleware/node_modules/less/test/browser/less/imports/urls.less b/node_modules/less-middleware/node_modules/less/test/browser/less/imports/urls.less deleted file mode 100644 index 290e6b4..0000000 --- a/node_modules/less-middleware/node_modules/less/test/browser/less/imports/urls.less +++ /dev/null @@ -1,4 +0,0 @@ -@import "modify-this.css"; -.modify { - my-url: url("a.png"); -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/browser/less/imports/urls2.less b/node_modules/less-middleware/node_modules/less/test/browser/less/imports/urls2.less deleted file mode 100644 index b834bb9..0000000 --- a/node_modules/less-middleware/node_modules/less/test/browser/less/imports/urls2.less +++ /dev/null @@ -1,4 +0,0 @@ -@import "modify-again.css"; -.modify { - my-url: url("b.png"); -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/browser/less/relative-urls/urls.less b/node_modules/less-middleware/node_modules/less/test/browser/less/relative-urls/urls.less deleted file mode 100644 index 1c5ac88..0000000 --- a/node_modules/less-middleware/node_modules/less/test/browser/less/relative-urls/urls.less +++ /dev/null @@ -1,33 +0,0 @@ -@import "../imports/urls.less"; -@import "http://localhost:8081/browser/less/imports/urls2.less"; -@font-face { - src: url("/https/github.com/fonts/garamond-pro.ttf"); - src: local(Futura-Medium), - url(fonts.svg#MyGeometricModern) format("svg"); -} -#shorthands { - background: url("http://www.lesscss.org/spec.html") no-repeat 0 4px; -} -#misc { - background-image: url(images/image.jpg); -} -#data-uri { - background: url(data:image/png;charset=utf-8;base64, - kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/ - k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U - kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC); - background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==); - background-image: url(http://fonts.googleapis.com/css?family=\"Rokkitt\":\(400\),700); -} - -#svg-data-uri { - background: transparent url('data:image/svg+xml, '); -} - -.comma-delimited { - background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg); -} -.values { - @a: 'Trebuchet'; - url: url(@a); -} diff --git a/node_modules/less-middleware/node_modules/less/test/browser/less/rootpath-relative/urls.less b/node_modules/less-middleware/node_modules/less/test/browser/less/rootpath-relative/urls.less deleted file mode 100644 index 1c5ac88..0000000 --- a/node_modules/less-middleware/node_modules/less/test/browser/less/rootpath-relative/urls.less +++ /dev/null @@ -1,33 +0,0 @@ -@import "../imports/urls.less"; -@import "http://localhost:8081/browser/less/imports/urls2.less"; -@font-face { - src: url("/https/github.com/fonts/garamond-pro.ttf"); - src: local(Futura-Medium), - url(fonts.svg#MyGeometricModern) format("svg"); -} -#shorthands { - background: url("http://www.lesscss.org/spec.html") no-repeat 0 4px; -} -#misc { - background-image: url(images/image.jpg); -} -#data-uri { - background: url(data:image/png;charset=utf-8;base64, - kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/ - k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U - kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC); - background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==); - background-image: url(http://fonts.googleapis.com/css?family=\"Rokkitt\":\(400\),700); -} - -#svg-data-uri { - background: transparent url('data:image/svg+xml, '); -} - -.comma-delimited { - background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg); -} -.values { - @a: 'Trebuchet'; - url: url(@a); -} diff --git a/node_modules/less-middleware/node_modules/less/test/browser/less/rootpath/urls.less b/node_modules/less-middleware/node_modules/less/test/browser/less/rootpath/urls.less deleted file mode 100644 index 1c5ac88..0000000 --- a/node_modules/less-middleware/node_modules/less/test/browser/less/rootpath/urls.less +++ /dev/null @@ -1,33 +0,0 @@ -@import "../imports/urls.less"; -@import "http://localhost:8081/browser/less/imports/urls2.less"; -@font-face { - src: url("/https/github.com/fonts/garamond-pro.ttf"); - src: local(Futura-Medium), - url(fonts.svg#MyGeometricModern) format("svg"); -} -#shorthands { - background: url("http://www.lesscss.org/spec.html") no-repeat 0 4px; -} -#misc { - background-image: url(images/image.jpg); -} -#data-uri { - background: url(data:image/png;charset=utf-8;base64, - kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/ - k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U - kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC); - background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==); - background-image: url(http://fonts.googleapis.com/css?family=\"Rokkitt\":\(400\),700); -} - -#svg-data-uri { - background: transparent url('data:image/svg+xml, '); -} - -.comma-delimited { - background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg); -} -.values { - @a: 'Trebuchet'; - url: url(@a); -} diff --git a/node_modules/less-middleware/node_modules/less/test/browser/less/urls.less b/node_modules/less-middleware/node_modules/less/test/browser/less/urls.less deleted file mode 100644 index c2040cf..0000000 --- a/node_modules/less-middleware/node_modules/less/test/browser/less/urls.less +++ /dev/null @@ -1,33 +0,0 @@ -@import "imports/urls.less"; -@import "http://localhost:8081/browser/less/imports/urls2.less"; -@font-face { - src: url("/https/github.com/fonts/garamond-pro.ttf"); - src: local(Futura-Medium), - url(fonts.svg#MyGeometricModern) format("svg"); -} -#shorthands { - background: url("http://www.lesscss.org/spec.html") no-repeat 0 4px; -} -#misc { - background-image: url(images/image.jpg); -} -#data-uri { - background: url(data:image/png;charset=utf-8;base64, - kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/ - k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U - kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC); - background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==); - background-image: url(http://fonts.googleapis.com/css?family=\"Rokkitt\":\(400\),700); -} - -#svg-data-uri { - background: transparent url('data:image/svg+xml, '); -} - -.comma-delimited { - background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg); -} -.values { - @a: 'Trebuchet'; - url: url(@a); -} diff --git a/node_modules/less-middleware/node_modules/less/test/browser/phantom-runner.js b/node_modules/less-middleware/node_modules/less/test/browser/phantom-runner.js deleted file mode 100644 index 477411b..0000000 --- a/node_modules/less-middleware/node_modules/less/test/browser/phantom-runner.js +++ /dev/null @@ -1,139 +0,0 @@ -var webpage = require('webpage'); -var server = require('webserver').create(); -var system = require('system'); -var fs = require('fs'); -var host, port = 8081; - -var listening = server.listen(port, function (request, response) { - //console.log("Requested "+request.url); - - var filename = ("test/" + request.url.slice(1)).replace(/[\\\/]/g, fs.separator); - - if (!fs.exists(filename) || !fs.isFile(filename)) { - response.statusCode = 404; - response.write("

      File Not Found

      File:"+filename+"

      "); - response.close(); - return; - } - - // we set the headers here - response.statusCode = 200; - response.headers = {"Cache": "no-cache", "Content-Type": "text/html"}; - - response.write(fs.read(filename)); - - response.close(); -}); -if (!listening) { - console.log("could not create web server listening on port " + port); - phantom.exit(); -} - -/** - * Wait until the test condition is true or a timeout occurs. Useful for waiting - * on a server response or for a ui change (fadeIn, etc.) to occur. - * - * @param testFx javascript condition that evaluates to a boolean, - * it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or - * as a callback function. - * @param onReady what to do when testFx condition is fulfilled, - * it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or - * as a callback function. - * @param timeOutMillis the max amount of time to wait. If not specified, 3 sec is used. - */ -function waitFor(testFx, onReady, timeOutMillis) { - var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 10001, //< Default Max Timeout is 10s - start = new Date().getTime(), - condition = false, - interval = setInterval(function() { - if ( (new Date().getTime() - start < maxtimeOutMillis) && !condition ) { - // If not time-out yet and condition not yet fulfilled - condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()); //< defensive code - } else { - if(!condition) { - // If condition still not fulfilled (timeout but condition is 'false') - console.log("'waitFor()' timeout"); - phantom.exit(1); - } else { - // Condition fulfilled (timeout and/or condition is 'true') - //console.log("'waitFor()' finished in " + (new Date().getTime() - start) + "ms."); - typeof(onReady) === "string" ? eval(onReady) : onReady(); //< Do what it's supposed to do once the condition is fulfilled - clearInterval(interval); //< Stop this interval - } - } - }, 100); //< repeat check every 100ms -}; - -function testPage(url) { - var page = webpage.create(); - page.open(url, function (status) { - if (status !== "success") { - console.log("Unable to access network - " + status); - phantom.exit(); - } else { - waitFor(function(){ - return page.evaluate(function(){ - return document.body && document.body.querySelector && - document.body.querySelector('.symbolSummary .pending') === null && - document.body.querySelector('.results') !== null; - }); - }, function(){ - page.onConsoleMessage = function (msg) { - console.log(msg); - }; - var exitCode = page.evaluate(function(){ - console.log(''); - console.log(document.body.querySelector('.description').innerText); - var list = document.body.querySelectorAll('.results > #details > .specDetail.failed'); - if (list && list.length > 0) { - console.log(''); - console.log(list.length + ' test(s) FAILED:'); - for (i = 0; i < list.length; ++i) { - var el = list[i], - desc = el.querySelector('.description'), - msg = el.querySelector('.resultMessage.fail'); - console.log(''); - console.log(desc.innerText); - console.log(msg.innerText); - console.log(''); - } - return 1; - } else { - console.log(document.body.querySelector('.alert > .passingAlert.bar').innerText); - return 0; - } - }); - testFinished(exitCode); - }); - } - }); -} - -function scanDirectory(path, regex) { - var files = []; - fs.list(path).forEach(function (file) { - if (file.match(regex)) { - files.push(file); - } - }); - return files; -}; - -var totalTests = 0, - totalFailed = 0, - totalDone = 0; - -function testFinished(failed) { - if (failed) { totalFailed++; } - totalDone++; - if (totalDone === totalTests) { phantom.exit(totalFailed > 0 ? 1 : 0); } -} - -if (system.args.length != 2 && system.args[1] != "--no-tests") { - var files = scanDirectory("test/browser/", /^test-runner-.+\.htm$/); - totalTests = files.length; - console.log("found " + files.length + " tests"); - files.forEach(function(file) { - testPage("http://localhost:8081/browser/" + file); - }); -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/browser/runner-browser.js b/node_modules/less-middleware/node_modules/less/test/browser/runner-browser.js deleted file mode 100644 index 54419da..0000000 --- a/node_modules/less-middleware/node_modules/less/test/browser/runner-browser.js +++ /dev/null @@ -1,3 +0,0 @@ -describe("less.js browser tests", function() { - testLessEqualsInDocument(); -}); \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/browser/runner-main.js b/node_modules/less-middleware/node_modules/less/test/browser/runner-main.js deleted file mode 100644 index d9637c0..0000000 --- a/node_modules/less-middleware/node_modules/less/test/browser/runner-main.js +++ /dev/null @@ -1,15 +0,0 @@ -less.functions = { - add: function (a, b) { - return new(less.tree.Dimension)(a.value + b.value); - }, - increment: function (a) { - return new(less.tree.Dimension)(a.value + 1); - }, - _color: function (str) { - if (str.value === "evil red") { return new(less.tree.Color)("600") } - } -}; - -describe("less.js main tests", function() { - testLessEqualsInDocument(); -}); \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/browser/runner-relative-urls.js b/node_modules/less-middleware/node_modules/less/test/browser/runner-relative-urls.js deleted file mode 100644 index 4e47f63..0000000 --- a/node_modules/less-middleware/node_modules/less/test/browser/runner-relative-urls.js +++ /dev/null @@ -1,4 +0,0 @@ -less.relativeUrls = true; -describe("less.js browser test - relative url's", function() { - testLessEqualsInDocument(); -}); \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/browser/runner-rootpath-relative.js b/node_modules/less-middleware/node_modules/less/test/browser/runner-rootpath-relative.js deleted file mode 100644 index b318b42..0000000 --- a/node_modules/less-middleware/node_modules/less/test/browser/runner-rootpath-relative.js +++ /dev/null @@ -1,5 +0,0 @@ -less.rootpath = "https://www.github.com/cloudhead/less.js/"; -less.relativeUrls = true; -describe("less.js browser test - rootpath and relative url's", function() { - testLessEqualsInDocument(); -}); \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/browser/runner-rootpath.js b/node_modules/less-middleware/node_modules/less/test/browser/runner-rootpath.js deleted file mode 100644 index 2c7edd7..0000000 --- a/node_modules/less-middleware/node_modules/less/test/browser/runner-rootpath.js +++ /dev/null @@ -1,4 +0,0 @@ -less.rootpath = "https://www.github.com/"; -describe("less.js browser test - rootpath url's", function() { - testLessEqualsInDocument(); -}); \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/browser/template.htm b/node_modules/less-middleware/node_modules/less/test/browser/template.htm deleted file mode 100644 index f25e9c8..0000000 --- a/node_modules/less-middleware/node_modules/less/test/browser/template.htm +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/css/charsets.css b/node_modules/less-middleware/node_modules/less/test/css/charsets.css deleted file mode 100644 index 9f44090..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/charsets.css +++ /dev/null @@ -1 +0,0 @@ -@charset "UTF-8"; diff --git a/node_modules/less-middleware/node_modules/less/test/css/colors.css b/node_modules/less-middleware/node_modules/less/test/css/colors.css deleted file mode 100644 index 1695677..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/colors.css +++ /dev/null @@ -1,80 +0,0 @@ -#yelow #short { - color: #fea; -} -#yelow #long { - color: #ffeeaa; -} -#yelow #rgba { - color: rgba(255, 238, 170, 0.1); -} -#yelow #argb { - color: #1affeeaa; -} -#blue #short { - color: #00f; -} -#blue #long { - color: #0000ff; -} -#blue #rgba { - color: rgba(0, 0, 255, 0.1); -} -#blue #argb { - color: #1a0000ff; -} -#alpha #hsla { - color: rgba(61, 45, 41, 0.6); -} -#overflow .a { - color: #000000; -} -#overflow .b { - color: #ffffff; -} -#overflow .c { - color: #ffffff; -} -#overflow .d { - color: #00ff00; -} -#grey { - color: #c8c8c8; -} -#333333 { - color: #333333; -} -#808080 { - color: #808080; -} -#00ff00 { - color: #00ff00; -} -.lightenblue { - color: #3333ff; -} -.darkenblue { - color: #0000cc; -} -.unknowncolors { - color: blue2; - border: 2px solid superred; -} -.transparent { - color: transparent; - background-color: rgba(0, 0, 0, 0); -} -#alpha #fromvar { - opacity: 0.7; -} -#alpha #short { - opacity: 1; -} -#alpha #long { - opacity: 1; -} -#alpha #rgba { - opacity: 0.2; -} -#alpha #hsl { - opacity: 1; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/comments.css b/node_modules/less-middleware/node_modules/less/test/css/comments.css deleted file mode 100644 index 0aea21b..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/comments.css +++ /dev/null @@ -1,63 +0,0 @@ -/******************\ -* * -* Comment Header * -* * -\******************/ -/* - - Comment - -*/ -/* - * Comment Test - * - * - cloudhead (http://cloudhead.net) - * - */ -/* Colors - * ------ - * #EDF8FC (background blue) - * #166C89 (darkest blue) - * - * Text: - * #333 (standard text) // A comment within a comment! - * #1F9EC9 (standard link) - * - */ -/* @group Variables -------------------- */ -#comments { - /**/ - color: red; - /* A C-style comment */ - - background-color: orange; - font-size: 12px; - /* lost comment */ - content: "content"; - border: 1px solid black; - padding: 0; - margin: 2em; -} -/* commented out - #more-comments { - color: grey; - } -*/ -.selector, -.lots, -.comments { - color: #808080, /* blue */ #ffa500; - -webkit-border-radius: 2px /* webkit only */; - -moz-border-radius: 8px /* moz only with operation */; -} -.test { - color: 1px //put in @b - causes problems! --->; -} -#last { - color: #0000ff; -} -/* *//* { *//* *//* *//* */#div { - color: #A33; -} -/* } */ diff --git a/node_modules/less-middleware/node_modules/less/test/css/css-3.css b/node_modules/less-middleware/node_modules/less/test/css/css-3.css deleted file mode 100644 index d48dbe5..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/css-3.css +++ /dev/null @@ -1,113 +0,0 @@ -.comma-delimited { - text-shadow: -1px -1px 1px #ff0000, 6px 5px 5px #ffff00; - -moz-box-shadow: 0pt 0pt 2px rgba(255, 255, 255, 0.4) inset, 0pt 4px 6px rgba(255, 255, 255, 0.4) inset; -} -@font-face { - font-family: Headline; - unicode-range: U+??????, U+0???, U+0-7F, U+A5; -} -.other { - -moz-transform: translate(0, 11em) rotate(-90deg); - transform: rotateX(45deg); -} -.item[data-cra_zy-attr1b-ut3=bold] { - font-weight: bold; -} -p:not([class*="lead"]) { - color: black; -} -input[type="text"].class#id[attr=32]:not(1) { - color: white; -} -div#id.class[a=1][b=2].class:not(1) { - color: white; -} -ul.comma > li:not(:only-child)::after { - color: white; -} -ol.comma > li:nth-last-child(2)::after { - color: white; -} -li:nth-child(4n+1), -li:nth-child(-5n), -li:nth-child(-n+2) { - color: white; -} -a[href^="https://"] { - color: black; -} -a[href$="https://"] { - color: black; -} -form[data-disabled] { - color: black; -} -p::before { - color: black; -} -#issue322 { - -webkit-animation: anim2 7s infinite ease-in-out; -} -@-webkit-keyframes frames { - 0% { - border: 1px; - } - 5.5% { - border: 2px; - } - 100% { - border: 3px; - } -} -@keyframes fontbulger1 { - to { - font-size: 15px; - } - from, - to { - font-size: 12px; - } - 0%, - 100% { - font-size: 12px; - } -} -.units { - font: 1.2rem/2rem; - font: 8vw/9vw; - font: 10vh/12vh; - font: 12vm/15vm; - font: 12vmin/15vmin; - font: 1.2ch/1.5ch; -} -@supports ( box-shadow: 2px 2px 2px black ) or - ( -moz-box-shadow: 2px 2px 2px black ) { - .outline { - box-shadow: 2px 2px 2px black; - -moz-box-shadow: 2px 2px 2px black; - } -} -@-x-document url-prefix(""github.com"") { - h1 { - color: red; - } -} -@viewport { - font-size: 10px; -} -@namespace foo url(http://www.example.com); -foo | h1 { - color: blue; -} -foo | * { - color: yellow; -} -| h1 { - color: red; -} -* | h1 { - color: green; -} -h1 { - color: green; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/css-escapes.css b/node_modules/less-middleware/node_modules/less/test/css/css-escapes.css deleted file mode 100644 index 4d343aa..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/css-escapes.css +++ /dev/null @@ -1,24 +0,0 @@ -.escape\|random\|char { - color: red; -} -.mixin\!tUp { - font-weight: bold; -} -.\34 04 { - background: red; -} -.\34 04 strong { - color: #ff00ff; - font-weight: bold; -} -.trailingTest\+ { - color: red; -} -/* This hideous test of hideousness checks for the selector "blockquote" with various permutations of hex escapes */ -\62\6c\6f \63 \6B \0071 \000075o\74 e { - color: silver; -} -[ng\:cloak], -ng\:form { - display: none; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/css.css b/node_modules/less-middleware/node_modules/less/test/css/css.css deleted file mode 100644 index 5d9516a..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/css.css +++ /dev/null @@ -1,89 +0,0 @@ -@charset "utf-8"; -div { - color: black; -} -div { - width: 99%; -} -* { - min-width: 45em; -} -h1, -h2 > a > p, -h3 { - color: none; -} -div.class { - color: blue; -} -div#id { - color: green; -} -.class#id { - color: purple; -} -.one.two.three { - color: grey; -} -@media print { - font-size: 3em; -} -@media screen { - font-size: 10px; -} -@font-face { - font-family: 'Garamond Pro'; -} -a:hover, -a:link { - color: #999; -} -p, -p:first-child { - text-transform: none; -} -q:lang(no) { - quotes: none; -} -p + h1 { - font-size: 2.2em; -} -#shorthands { - border: 1px solid #000; - font: 12px/16px Arial; - font: 100%/16px Arial; - margin: 1px 0; - padding: 0 auto; -} -#more-shorthands { - margin: 0; - padding: 1px 0 2px 0; - font: normal small/20px 'Trebuchet MS', Verdana, sans-serif; - font: 0/0 a; -} -.misc { - -moz-border-radius: 2px; - display: -moz-inline-stack; - width: .1em; - background-color: #009998; - background: -webkit-gradient(linear, left top, left bottom, from(#ff0000), to(#0000ff)); - margin: ; - filter: alpha(opacity=100); -} -.misc .nested-multiple { - multiple-semi-colons: yes; -} -#important { - color: red !important; - width: 100%!important; - height: 20px ! important; -} -@font-face { - font-family: font-a; -} -@font-face { - font-family: font-b; -} -.æøå { - margin: 0; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/debug/linenumbers-all.css b/node_modules/less-middleware/node_modules/less/test/css/debug/linenumbers-all.css deleted file mode 100644 index c6fb355..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/debug/linenumbers-all.css +++ /dev/null @@ -1,43 +0,0 @@ -@charset "UTF-8"; -/* line 3, {pathimport}test.less */ -@media -sass-debug-info{filename{font-family:file\:\/\/{pathimportesc}test\.less}line{font-family:\000033}} -/* @charset "ISO-8859-1"; */ -/* line 23, {pathimport}test.less */ -@media -sass-debug-info{filename{font-family:file\:\/\/{pathimportesc}test\.less}line{font-family:\0000323}} -.tst3 { - color: grey; -} -/* line 15, {path}linenumbers.less */ -@media -sass-debug-info{filename{font-family:file\:\/\/{pathesc}linenumbers\.less}line{font-family:\0000315}} -.test1 { - color: black; -} -/* line 6, {path}linenumbers.less */ -@media -sass-debug-info{filename{font-family:file\:\/\/{pathesc}linenumbers\.less}line{font-family:\000036}} -.test2 { - color: red; -} -@media all { - /* line 5, {pathimport}test.less */ - @media -sass-debug-info{filename{font-family:file\:\/\/{pathimportesc}test\.less}line{font-family:\000035}} - .tst { - color: black; - } -} -@media all and screen { - /* line 7, {pathimport}test.less */ - @media -sass-debug-info{filename{font-family:file\:\/\/{pathimportesc}test\.less}line{font-family:\000037}} - .tst { - color: red; - } - /* line 9, {pathimport}test.less */ - @media -sass-debug-info{filename{font-family:file\:\/\/{pathimportesc}test\.less}line{font-family:\000039}} - .tst .tst3 { - color: white; - } -} -/* line 18, {pathimport}test.less */ -@media -sass-debug-info{filename{font-family:file\:\/\/{pathimportesc}test\.less}line{font-family:\0000318}} -.tst2 { - color: white; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/debug/linenumbers-comments.css b/node_modules/less-middleware/node_modules/less/test/css/debug/linenumbers-comments.css deleted file mode 100644 index 9c48baa..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/debug/linenumbers-comments.css +++ /dev/null @@ -1,35 +0,0 @@ -@charset "UTF-8"; -/* line 3, {pathimport}test.less */ -/* @charset "ISO-8859-1"; */ -/* line 23, {pathimport}test.less */ -.tst3 { - color: grey; -} -/* line 15, {path}linenumbers.less */ -.test1 { - color: black; -} -/* line 6, {path}linenumbers.less */ -.test2 { - color: red; -} -@media all { - /* line 5, {pathimport}test.less */ - .tst { - color: black; - } -} -@media all and screen { - /* line 7, {pathimport}test.less */ - .tst { - color: red; - } - /* line 9, {pathimport}test.less */ - .tst .tst3 { - color: white; - } -} -/* line 18, {pathimport}test.less */ -.tst2 { - color: white; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/debug/linenumbers-mediaquery.css b/node_modules/less-middleware/node_modules/less/test/css/debug/linenumbers-mediaquery.css deleted file mode 100644 index 3fdbbaf..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/debug/linenumbers-mediaquery.css +++ /dev/null @@ -1,35 +0,0 @@ -@charset "UTF-8"; -@media -sass-debug-info{filename{font-family:file\:\/\/{pathimportesc}test\.less}line{font-family:\000033}} -/* @charset "ISO-8859-1"; */ -@media -sass-debug-info{filename{font-family:file\:\/\/{pathimportesc}test\.less}line{font-family:\0000323}} -.tst3 { - color: grey; -} -@media -sass-debug-info{filename{font-family:file\:\/\/{pathesc}linenumbers\.less}line{font-family:\0000315}} -.test1 { - color: black; -} -@media -sass-debug-info{filename{font-family:file\:\/\/{pathesc}linenumbers\.less}line{font-family:\000036}} -.test2 { - color: red; -} -@media all { - @media -sass-debug-info{filename{font-family:file\:\/\/{pathimportesc}test\.less}line{font-family:\000035}} - .tst { - color: black; - } -} -@media all and screen { - @media -sass-debug-info{filename{font-family:file\:\/\/{pathimportesc}test\.less}line{font-family:\000037}} - .tst { - color: red; - } - @media -sass-debug-info{filename{font-family:file\:\/\/{pathimportesc}test\.less}line{font-family:\000039}} - .tst .tst3 { - color: white; - } -} -@media -sass-debug-info{filename{font-family:file\:\/\/{pathimportesc}test\.less}line{font-family:\0000318}} -.tst2 { - color: white; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/functions.css b/node_modules/less-middleware/node_modules/less/test/css/functions.css deleted file mode 100644 index bf612d4..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/functions.css +++ /dev/null @@ -1,100 +0,0 @@ -#functions { - color: #660000; - width: 16; - height: undefined("self"); - border-width: 5; - variable: 11; - background: linear-gradient(#000000, #ffffff); -} -#built-in { - escaped: -Some::weird(#thing, y); - lighten: #ffcccc; - darken: #330000; - saturate: #203c31; - desaturate: #29332f; - greyscale: #2e2e2e; - spin-p: #bf6a40; - spin-n: #bf4055; - luma-white: 100%; - luma-black: 0%; - luma-black-alpha: 0%; - luma-red: 21%; - luma-green: 72%; - luma-blue: 7%; - luma-yellow: 93%; - luma-cyan: 79%; - luma-white-alpha: 50%; - contrast-filter: contrast(30%); - contrast-white: #000000; - contrast-black: #ffffff; - contrast-red: #ffffff; - contrast-green: #000000; - contrast-blue: #ffffff; - contrast-yellow: #000000; - contrast-cyan: #000000; - contrast-light: #111111; - contrast-dark: #eeeeee; - contrast-light-thresh: #111111; - contrast-dark-thresh: #eeeeee; - contrast-high-thresh: #eeeeee; - contrast-low-thresh: #111111; - format: "rgb(32, 128, 64)"; - format-string: "hello world"; - format-multiple: "hello earth 2"; - format-url-encode: "red is %23ff0000"; - eformat: rgb(32, 128, 64); - unitless: 12; - unit: 14em; - hue: 98; - saturation: 12%; - lightness: 95%; - red: 255; - green: 255; - blue: 255; - rounded: 11; - rounded-two: 10.67; - roundedpx: 3px; - roundedpx-three: 3.333px; - rounded-percentage: 10%; - ceil: 11px; - floor: 12px; - percentage: 20%; - color: #ff0011; - tint: #898989; - tint-full: #ffffff; - tint-percent: #898989; - shade: #686868; - shade-full: #000000; - shade-percent: #686868; - hsv: #4d2926; - hsva: rgba(77, 40, 38, 0.2); - mix: #ff3300; - mix-0: #ffff00; - mix-100: #ff0000; - mix-weightless: #ff8000; -} -#built-in .is-a { - color: true; - color1: true; - color2: true; - keyword: true; - number: true; - string: true; - pixel: true; - percent: true; - em: true; -} -#alpha { - alpha: rgba(153, 94, 51, 0.6); -} -#blendmodes { - multiply: #ed0000; - screen: #f600f6; - overlay: #ed0000; - softlight: #ff0000; - hardlight: #0000ed; - difference: #f600f6; - exclusion: #f600f6; - average: #7b007b; - negation: #d73131; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/ie-filters.css b/node_modules/less-middleware/node_modules/less/test/css/ie-filters.css deleted file mode 100644 index 007aa53..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/ie-filters.css +++ /dev/null @@ -1,9 +0,0 @@ -.nav { - filter: progid:DXImageTransform.Microsoft.Alpha(opacity=20); - filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#333333", endColorstr="#000000", GradientType=0); -} -.evalTest1 { - filter: progid:DXImageTransform.Microsoft.Alpha(opacity=30); - filter: progid:DXImageTransform.Microsoft.Alpha(opacity=5); -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/import-once.css b/node_modules/less-middleware/node_modules/less/test/css/import-once.css deleted file mode 100644 index b2a15d3..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/import-once.css +++ /dev/null @@ -1,3 +0,0 @@ -#import { - color: #ff0000; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/import.css b/node_modules/less-middleware/node_modules/less/test/css/import.css deleted file mode 100644 index 3ed7de5..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/import.css +++ /dev/null @@ -1,21 +0,0 @@ -@import url(http://fonts.googleapis.com/css?family=Open+Sans); - -@import url(something.css) screen and (color) and (max-width: 600px); -#import-test { - height: 10px; - color: #ff0000; - width: 10px; - height: 30%; -} -@media screen and (max-width: 600px) { - body { - width: 100%; - } -} -#import { - color: #ff0000; -} -.mixin { - height: 10px; - color: #ff0000; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/javascript.css b/node_modules/less-middleware/node_modules/less/test/css/javascript.css deleted file mode 100644 index 8268ab3..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/javascript.css +++ /dev/null @@ -1,23 +0,0 @@ -.eval { - js: 42; - js: 2; - js: "hello world"; - js: 1, 2, 3; - title: "string"; - ternary: true; - multiline: 2; -} -.scope { - var: 42; - escaped: 7px; -} -.vars { - width: 8; -} -.escape-interpol { - width: hello world; -} -.arrays { - ary: "1, 2, 3"; - ary1: "1, 2, 3"; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/lazy-eval.css b/node_modules/less-middleware/node_modules/less/test/css/lazy-eval.css deleted file mode 100644 index 1adfb8f..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/lazy-eval.css +++ /dev/null @@ -1,3 +0,0 @@ -.lazy-eval { - width: 100%; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/media.css b/node_modules/less-middleware/node_modules/less/test/css/media.css deleted file mode 100644 index d16ce63..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/media.css +++ /dev/null @@ -1,195 +0,0 @@ -@media print { - .class { - color: blue; - } - .class .sub { - width: 42; - } - .top, - header > h1 { - color: #444444; - } -} -@media screen { - body { - max-width: 480; - } -} -@media all and (device-aspect-ratio: 16/9) { - body { - max-width: 800px; - } -} -@media all and (orientation: portrait) { - aside { - float: none; - } -} -@media handheld and (min-width: 42), screen and (min-width: 20em) { - body { - max-width: 480px; - } -} -@media print { - body { - padding: 20px; - } - body header { - background-color: red; - } -} -@media print and (orientation: landscape) { - body { - margin-left: 20px; - } -} -@media screen { - .sidebar { - width: 300px; - } -} -@media screen and (orientation: landscape) { - .sidebar { - width: 500px; - } -} -@media a { - -} -@media a and b { - .first .second .third { - width: 300px; - } - .first .second .fourth { - width: 3; - } -} -@media a and b and c { - .first .second .third { - width: 500px; - } -} -@media a, b and c { - body { - width: 95%; - } -} -@media a and x, b and c and x, a and y, b and c and y { - body { - width: 100%; - } -} -.a { - background: black; -} -@media handheld { - .a { - background: white; - } -} -@media handheld and (max-width: 100px) { - .a { - background: red; - } -} -.b { - background: black; -} -@media handheld { - .b { - background: white; - } -} -@media handheld and (max-width: 200px) { - .b { - background: red; - } -} -@media only screen and (max-width: 200px) { - width: 480px; -} -@media print { - @page :left { - margin: 0.5cm; - } - @page :right { - margin: 0.5cm; - } - @page Test:first { - margin: 1cm; - } - @page :first { - size: 8.5in 11in;@top-left { - margin: 1cm; - } - @top-left-corner { - margin: 1cm; - } - @top-center { - margin: 1cm; - } - @top-right { - margin: 1cm; - } - @top-right-corner { - margin: 1cm; - } - @bottom-left { - margin: 1cm; - } - @bottom-left-corner { - margin: 1cm; - } - @bottom-center { - margin: 1cm; - } - @bottom-right { - margin: 1cm; - } - @bottom-right-corner { - margin: 1cm; - } - @left-top { - margin: 1cm; - } - @left-middle { - margin: 1cm; - } - @left-bottom { - margin: 1cm; - } - @right-top { - margin: 1cm; - } - @right-middle { - content: "Page " counter(page); - } - @right-bottom { - margin: 1cm; - } - } -} -@media (-webkit-min-device-pixel-ratio: 2), (min--moz-device-pixel-ratio: 2), (-o-min-device-pixel-ratio: 2/1), (min-resolution: 2dppx), (min-resolution: 128dpcm) { - .b { - background: red; - } -} -body { - background: red; -} -@media (max-width: 500px) { - body { - background: green; - } -} -@media (max-width: 1000px) { - body { - background: red; - background: blue; - } -} -@media (max-width: 1000px) and (max-width: 500px) { - body { - background: green; - } -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/mixins-args.css b/node_modules/less-middleware/node_modules/less/test/css/mixins-args.css deleted file mode 100644 index 91104ac..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/mixins-args.css +++ /dev/null @@ -1,95 +0,0 @@ -#hidden { - color: transparent; -} -#hidden1 { - color: transparent; -} -.two-args { - color: blue; - width: 10px; - height: 99%; - border: 2px dotted #000000; -} -.one-arg { - width: 15px; - height: 49%; -} -.no-parens { - width: 5px; - height: 49%; -} -.no-args { - width: 5px; - height: 49%; -} -.var-args { - width: 45; - height: 17%; -} -.multi-mix { - width: 10px; - height: 29%; - margin: 4; - padding: 5; -} -body { - padding: 30px; - color: #ff0000; -} -.scope-mix { - width: 8; -} -.content { - width: 600px; -} -.content .column { - margin: 600px; -} -#same-var-name { - radius: 5px; -} -#var-inside { - width: 10px; -} -.arguments { - border: 1px solid #000000; - width: 1px; -} -.arguments2 { - border: 0px; - width: 0px; -} -.arguments3 { - border: 0px; - width: 0px; -} -.arguments4 { - border: 0 1 2 3 4; - rest: 1 2 3 4; - width: 0; -} -.edge-case { - border: "{"; - width: "{"; -} -.comma-vs-semi-colon { - one: a; - two: b, c; - one: d, e; - two: f; - one: g; - one: h; - one: i; - one: j; - one: k; - two: l; - one: m, n; - one: o, p; - two: q; - one: r, s; - two: t; -} -#named-conflict { - four: a, 11, 12, 13; - four: a, 21, 22, 23; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/mixins-closure.css b/node_modules/less-middleware/node_modules/less/test/css/mixins-closure.css deleted file mode 100644 index b1021b6..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/mixins-closure.css +++ /dev/null @@ -1,9 +0,0 @@ -.class { - width: 99px; -} -.overwrite { - width: 99px; -} -.nested .class { - width: 5px; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/mixins-guards.css b/node_modules/less-middleware/node_modules/less/test/css/mixins-guards.css deleted file mode 100644 index f899a8e..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/mixins-guards.css +++ /dev/null @@ -1,71 +0,0 @@ -.light1 { - color: white; - margin: 1px; -} -.light2 { - color: black; - margin: 1px; -} -.max1 { - width: 6; -} -.max2 { - width: 8; -} -.glob1 { - margin: auto auto; -} -.ops1 { - height: gt-or-eq; - height: lt-or-eq; -} -.ops2 { - height: gt-or-eq; - height: not-eq; -} -.ops3 { - height: lt-or-eq; - height: not-eq; -} -.default1 { - content: default; -} -.test1 { - content: "true."; -} -.test2 { - content: "false."; -} -.test3 { - content: "false."; -} -.test4 { - content: "false."; -} -.test5 { - content: "false."; -} -.bool1 { - content: true and true; - content: true; - content: false, true; - content: false and true and true, true; - content: false, true and true; - content: false, false, true; - content: false, true and true and true, false; - content: not false; - content: not false and false, not false; -} -.equality-units { - test: pass; -} -.colorguardtest { - content: is #ff0000; - content: is not #0000ff its #ff0000; - content: is not #0000ff its #800080; -} -.stringguardtest { - content: is theme1; - content: is not theme2; - content: is theme1 no quotes; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/mixins-important.css b/node_modules/less-middleware/node_modules/less/test/css/mixins-important.css deleted file mode 100644 index 535726b..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/mixins-important.css +++ /dev/null @@ -1,38 +0,0 @@ -.class { - border: 1; - boxer: 1; - border: 2 !important; - boxer: 2 !important; - border: 3; - boxer: 3; - border: 4 !important; - boxer: 4 !important; - border: 5; - boxer: 5; - border: 0 !important; - boxer: 0 !important; - border: 9 !important; - border: 9; - boxer: 9; -} -.class .inner { - test: 1; -} -.class .inner { - test: 2 !important; -} -.class .inner { - test: 3; -} -.class .inner { - test: 4 !important; -} -.class .inner { - test: 5; -} -.class .inner { - test: 0 !important; -} -.class .inner { - test: 9; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/mixins-named-args.css b/node_modules/less-middleware/node_modules/less/test/css/mixins-named-args.css deleted file mode 100644 index e460aa1..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/mixins-named-args.css +++ /dev/null @@ -1,27 +0,0 @@ -.named-arg { - color: blue; - width: 5px; - height: 99%; - args: 1px 100%; - text-align: center; -} -.class { - width: 5px; - height: 19%; - args: 1px 20%; -} -.all-args-wrong-args { - width: 10px; - height: 9%; - args: 2px 10%; -} -.named-args2 { - width: 15px; - height: 49%; - color: #646464; -} -.named-args3 { - width: 5px; - height: 29%; - color: #123456; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/mixins-nested.css b/node_modules/less-middleware/node_modules/less/test/css/mixins-nested.css deleted file mode 100644 index 6378c47..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/mixins-nested.css +++ /dev/null @@ -1,14 +0,0 @@ -.class .inner { - height: 300; -} -.class .inner .innest { - width: 30; - border-width: 60; -} -.class2 .inner { - height: 600; -} -.class2 .inner .innest { - width: 60; - border-width: 120; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/mixins-pattern.css b/node_modules/less-middleware/node_modules/less/test/css/mixins-pattern.css deleted file mode 100644 index 8b82833..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/mixins-pattern.css +++ /dev/null @@ -1,47 +0,0 @@ -.zero { - variadic: true; - zero: 0; - one: 1; - two: 2; - three: 3; -} -.one { - variadic: true; - one: 1; - one-req: 1; - two: 2; - three: 3; -} -.two { - variadic: true; - two: 2; - three: 3; -} -.three { - variadic: true; - three-req: 3; - three: 3; -} -.left { - left: 1; -} -.right { - right: 1; -} -.border-right { - color: black; - border-right: 4px; -} -.border-left { - color: black; - border-left: 4px; -} -.only-right { - right: 33; -} -.only-left { - left: 33; -} -.left-right { - both: 330; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/mixins.css b/node_modules/less-middleware/node_modules/less/test/css/mixins.css deleted file mode 100644 index 62939e1..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/mixins.css +++ /dev/null @@ -1,121 +0,0 @@ -.mixin { - border: 1px solid black; -} -.mixout { - border-color: orange; -} -.borders { - border-style: dashed; -} -#namespace .borders { - border-style: dotted; -} -#namespace .biohazard { - content: "death"; -} -#namespace .biohazard .man { - color: transparent; -} -#theme > .mixin { - background-color: grey; -} -#container { - color: black; - border: 1px solid black; - border-color: orange; - background-color: grey; -} -#header .milk { - color: white; - border: 1px solid black; - background-color: grey; -} -#header #cookie { - border-style: dashed; -} -#header #cookie .chips { - border-style: dotted; -} -#header #cookie .chips .calories { - color: black; - border: 1px solid black; - border-color: orange; - background-color: grey; -} -.secure-zone { - color: transparent; -} -.direct { - border-style: dotted; -} -.bo, -.bar { - width: 100%; -} -.bo { - border: 1px; -} -.ar.bo.ca { - color: black; -} -.jo.ki { - background: none; -} -.amp.support { - color: orange; -} -.extended { - width: 100%; - border: 1px; - background: none; - color: orange; -} -.foo .bar { - width: 100%; -} -.underParents { - color: red; -} -.parent .underParents { - color: red; -} -* + h1 { - margin-top: 25px; -} -legend + h1 { - margin-top: 0; -} -h1 + * { - margin-top: 10px; -} -* + h2 { - margin-top: 20px; -} -legend + h2 { - margin-top: 0; -} -h2 + * { - margin-top: 8px; -} -* + h3 { - margin-top: 15px; -} -legend + h3 { - margin-top: 0; -} -h3 + * { - margin-top: 5px; -} -.error { - background-image: "/a.png"; - background-position: center center; -} -.test-rec .recursion { - color: black; -} -.button { - padding-left: 44px; -} -.button.large { - padding-left: 40em; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/operations.css b/node_modules/less-middleware/node_modules/less/test/css/operations.css deleted file mode 100644 index fb9e0af..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/operations.css +++ /dev/null @@ -1,49 +0,0 @@ -#operations { - color: #111111; - height: 9px; - width: 3em; - substraction: 0; - division: 1; -} -#operations .spacing { - height: 9px; - width: 3em; -} -.with-variables { - height: 16em; - width: 24em; - size: 1cm; -} -.with-functions { - color: #646464; - color: #ff8080; - color: #c94a4a; -} -.negative { - height: 0px; - width: 4px; -} -.shorthands { - padding: -1px 2px 0 -4px; -} -.rem-dimensions { - font-size: 5.5rem; -} -.colors { - color: #123; - border-color: #334455; - background-color: #000000; -} -.colors .other { - color: #222222; - border-color: #222222; -} -.negations { - variable: -4px; - variable1: 0px; - variable2: 0px; - variable3: 8px; - variable4: 0px; - paren: -4px; - paren2: 16px; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/parens.css b/node_modules/less-middleware/node_modules/less/test/css/parens.css deleted file mode 100644 index 36487fe..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/parens.css +++ /dev/null @@ -1,20 +0,0 @@ -.parens { - border: 2px solid #000000; - margin: 1px 3px 16 3; - width: 36; - padding: 2px 36px; -} -.more-parens { - padding: 8 4 4 4px; - width: 96; - height: 113; - margin: 12; -} -.nested-parens { - width: 71; - height: 6; -} -.mixed-units { - margin: 2px 4em 1 5pc; - padding: 6px 1em 2px 2; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/rulesets.css b/node_modules/less-middleware/node_modules/less/test/css/rulesets.css deleted file mode 100644 index 408c76a..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/rulesets.css +++ /dev/null @@ -1,33 +0,0 @@ -#first > .one { - font-size: 2em; -} -#first > .one > #second .two > #deux { - width: 50%; -} -#first > .one > #second .two > #deux #third { - height: 100%; -} -#first > .one > #second .two > #deux #third:focus { - color: black; -} -#first > .one > #second .two > #deux #third:focus #fifth > #sixth .seventh #eighth + #ninth { - color: purple; -} -#first > .one > #second .two > #deux #fourth, -#first > .one > #second .two > #deux #five, -#first > .one > #second .two > #deux #six { - color: #110000; -} -#first > .one > #second .two > #deux #fourth .seven, -#first > .one > #second .two > #deux #five .seven, -#first > .one > #second .two > #deux #six .seven, -#first > .one > #second .two > #deux #fourth .eight > #nine, -#first > .one > #second .two > #deux #five .eight > #nine, -#first > .one > #second .two > #deux #six .eight > #nine { - border: 1px solid black; -} -#first > .one > #second .two > #deux #fourth #ten, -#first > .one > #second .two > #deux #five #ten, -#first > .one > #second .two > #deux #six #ten { - color: red; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/scope.css b/node_modules/less-middleware/node_modules/less/test/css/scope.css deleted file mode 100644 index baa0552..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/scope.css +++ /dev/null @@ -1,35 +0,0 @@ -.tiny-scope { - color: #998899; -} -.scope1 { - color: #0000ff; - border-color: #000000; -} -.scope1 .scope2 { - color: #0000ff; -} -.scope1 .scope2 .scope3 { - color: #ff0000; - border-color: #000000; - background-color: #ffffff; -} -.scope { - scoped-val: #008000; -} -.heightIsSet { - height: 1024px; -} -.useHeightInMixinCall { - mixin-height: 1024px; -} -.imported { - exists: true; -} -.testImported { - exists: true; -} -#allAreUsedHere { - default: 'top level'; - scope: 'top level'; - sub-scope-only: 'inside'; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/selectors.css b/node_modules/less-middleware/node_modules/less/test/css/selectors.css deleted file mode 100644 index 6995983..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/selectors.css +++ /dev/null @@ -1,133 +0,0 @@ -h1 a:hover, -h2 a:hover, -h3 a:hover, -h1 p:hover, -h2 p:hover, -h3 p:hover { - color: red; -} -#all { - color: blue; -} -#the { - color: blue; -} -#same { - color: blue; -} -ul, -li, -div, -q, -blockquote, -textarea { - margin: 0; -} -td { - margin: 0; - padding: 0; -} -td, -input { - line-height: 1em; -} -a { - color: red; -} -a:hover { - color: blue; -} -div a { - color: green; -} -p a span { - color: yellow; -} -.foo .bar .qux, -.foo .baz .qux { - display: block; -} -.qux .foo .bar, -.qux .foo .baz { - display: inline; -} -.qux.foo .bar, -.qux.foo .baz { - display: inline-block; -} -.qux .foo .bar .biz, -.qux .foo .baz .biz { - display: none; -} -.a.b.c { - color: red; -} -.c .b.a { - color: red; -} -.foo .p.bar { - color: red; -} -.foo.p.bar { - color: red; -} -.foo + .foo { - background: amber; -} -.foo + .foo { - background: amber; -} -.foo + .foo, -.foo + .bar, -.bar + .foo, -.bar + .bar { - background: amber; -} -.foo a > .foo a, -.foo a > .bar a, -.foo a > .foo b, -.foo a > .bar b, -.bar a > .foo a, -.bar a > .bar a, -.bar a > .foo b, -.bar a > .bar b, -.foo b > .foo a, -.foo b > .bar a, -.foo b > .foo b, -.foo b > .bar b, -.bar b > .foo a, -.bar b > .bar a, -.bar b > .foo b, -.bar b > .bar b { - background: amber; -} -.other ::fnord { - color: #ff0000; -} -.other::fnord { - color: #ff0000; -} -.other ::bnord { - color: #ff0000; -} -.other::bnord { - color: #ff0000; -} -.blood { - color: red; -} -.blood { - color: red; -} -.bloodred { - color: green; -} -#blood.blood.red.black { - color: black; -} -:nth-child(3):nth-child(3) { - second-use: deprecated; -} -.test:nth-child(odd):not( :nth-child(3)) { - color: #ff0000; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/static-urls/urls.css b/node_modules/less-middleware/node_modules/less/test/css/static-urls/urls.css deleted file mode 100644 index b5a690e..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/static-urls/urls.css +++ /dev/null @@ -1,42 +0,0 @@ -@import "folder (1)/../css/background.css"; - -@import "folder (1)/import-test-d.css"; -@font-face { - src: url("/https/github.com/fonts/garamond-pro.ttf"); - src: local(Futura-Medium), url(folder\ \(1\)/fonts.svg#MyGeometricModern) format("svg"); -} -#shorthands { - background: url("http://www.lesscss.org/spec.html") no-repeat 0 4px; -} -#misc { - background-image: url(folder\ \(1\)/images/image.jpg); -} -#data-uri { - background: url(data:image/png;charset=utf-8;base64, - kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/ - k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U - kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC); - background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==); - background-image: url(http://fonts.googleapis.com/css?family=\"Rokkitt\":\(400\),700); -} -#svg-data-uri { - background: transparent url('data:image/svg+xml, '); -} -.comma-delimited { - background: url(folder\ \(1\)/bg.jpg) no-repeat, url(folder\ \(1\)/bg.png) repeat-x top left, url(folder\ \(1\)/bg); -} -.values { - url: url('folder (1)/Trebuchet'); -} -#logo { - width: 100px; - height: 100px; - background: url('folder (1)/../assets/logo.png'); -} -@font-face { - font-family: xecret; - src: url('folder (1)/../assets/xecret.ttf'); -} -#secret { - font-family: xecret, sans-serif; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/strings.css b/node_modules/less-middleware/node_modules/less/test/css/strings.css deleted file mode 100644 index 522bae5..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/strings.css +++ /dev/null @@ -1,40 +0,0 @@ -#strings { - background-image: url("http://son-of-a-banana.com"); - quotes: "~" "~"; - content: "#*%:&^,)!.(~*})"; - empty: ""; - brackets: "{" "}"; - escapes: "\"hello\" \\world"; - escapes2: "\"llo"; -} -#comments { - content: "/* hello */ // not-so-secret"; -} -#single-quote { - quotes: "'" "'"; - content: '""#!&""'; - empty: ''; - semi-colon: ';'; -} -#escaped { - filter: DX.Transform.MS.BS.filter(opacity=50); -} -#one-line { - image: url(http://tooks.com); -} -#crazy { - image: url(http://), "}", url("http://}"); -} -#interpolation { - url: "http://lesscss.org/dev/image.jpg"; - url2: "http://lesscss.org/image-256.jpg"; - url3: "http://lesscss.org#445566"; - url4: "http://lesscss.org/hello"; - url5: "http://lesscss.org/54.4px"; -} -.mix-mul-class { - color: #0000ff; - color: #ff0000; - color: #000000; - color: #ffa500; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/urls.css b/node_modules/less-middleware/node_modules/less/test/css/urls.css deleted file mode 100644 index 6a8a4e9..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/urls.css +++ /dev/null @@ -1,42 +0,0 @@ -@import "import/../css/background.css"; - -@import "import/import-test-d.css"; -@font-face { - src: url("/https/github.com/fonts/garamond-pro.ttf"); - src: local(Futura-Medium), url(fonts.svg#MyGeometricModern) format("svg"); -} -#shorthands { - background: url("http://www.lesscss.org/spec.html") no-repeat 0 4px; -} -#misc { - background-image: url(images/image.jpg); -} -#data-uri { - background: url(data:image/png;charset=utf-8;base64, - kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/ - k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U - kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC); - background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==); - background-image: url(http://fonts.googleapis.com/css?family=\"Rokkitt\":\(400\),700); -} -#svg-data-uri { - background: transparent url('data:image/svg+xml, '); -} -.comma-delimited { - background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg); -} -.values { - url: url('Trebuchet'); -} -#logo { - width: 100px; - height: 100px; - background: url('import/imports/../assets/logo.png'); -} -@font-face { - font-family: xecret; - src: url('import/imports/../assets/xecret.ttf'); -} -#secret { - font-family: xecret, sans-serif; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/variables.css b/node_modules/less-middleware/node_modules/less/test/css/variables.css deleted file mode 100644 index aac5faa..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/variables.css +++ /dev/null @@ -1,26 +0,0 @@ -.variables { - width: 14cm; -} -.variables { - height: 24px; - color: #888888; - font-family: "Trebuchet MS", Verdana, sans-serif; - quotes: "~" "~"; -} -.redefinition { - three: 3; -} -.values { - font-family: 'Trebuchet', 'Trebuchet', 'Trebuchet'; - color: #888888 !important; - multi: something 'A', B, C, 'Trebuchet'; -} -.variable-names { - name: 'hello'; -} -.alpha { - filter: alpha(opacity=42); -} -a:nth-child(2) { - border: 1px; -} diff --git a/node_modules/less-middleware/node_modules/less/test/css/whitespace.css b/node_modules/less-middleware/node_modules/less/test/css/whitespace.css deleted file mode 100644 index 74c9b65..0000000 --- a/node_modules/less-middleware/node_modules/less/test/css/whitespace.css +++ /dev/null @@ -1,42 +0,0 @@ -.whitespace { - color: white; -} -.whitespace { - color: white; -} -.whitespace { - color: white; -} -.whitespace { - color: white; -} -.whitespace { - color: white ; -} -.white, -.space, -.mania { - color: white; -} -.no-semi-column { - color: #ffffff; -} -.no-semi-column { - color: white; - white-space: pre; -} -.no-semi-column { - border: 2px solid #ffffff; -} -.newlines { - background: the, - great, - wall; - border: 2px - solid - black; -} -.sel .newline_ws .tab_ws { - color: white; - background-position: 45 -23; -} diff --git a/node_modules/less-middleware/node_modules/less/test/less-test.js b/node_modules/less-middleware/node_modules/less/test/less-test.js deleted file mode 100644 index ad11d00..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less-test.js +++ /dev/null @@ -1,182 +0,0 @@ -var path = require('path'), - fs = require('fs'), - sys = require('util'); - -var less = require('../lib/less'); -var stylize = require('../lib/less/lessc_helper').stylize; - -var oneTestOnly = process.argv[2]; - -var totalTests = 0, - failedTests = 0, - passedTests = 0; - -less.tree.functions.add = function (a, b) { - return new(less.tree.Dimension)(a.value + b.value); -}; -less.tree.functions.increment = function (a) { - return new(less.tree.Dimension)(a.value + 1); -}; -less.tree.functions._color = function (str) { - if (str.value === "evil red") { return new(less.tree.Color)("600") } -}; - -sys.puts("\n" + stylize("LESS", 'underline') + "\n"); - -runTestSet({relativeUrls: true}); - -runTestSet(null, "errors/", function(name, err, compiledLess, doReplacements) { - fs.readFile(path.join('test/less/', name) + '.txt', 'utf8', function (e, expectedErr) { - sys.print("- " + name + ": "); - expectedErr = doReplacements(expectedErr, 'test/less/errors/'); - if (!err) { - if (compiledLess) { - fail("No Error", 'red'); - } else { - fail("No Error, No Output"); - } - } else { - var errMessage = less.formatError(err); - if (errMessage === expectedErr) { - ok('OK'); - } else { - difference("FAIL", expectedErr, errMessage); - } - } - sys.puts(""); - });}, null, function(input, directory) { - return input.replace( - "{path}", path.join(process.cwd(), "/test/less/errors/")) - .replace("{pathrel}", path.join("test", "less", "errors/")) - .replace(/\r\n/g, '\n'); - }); - -runTestSet({dumpLineNumbers: 'comments'}, "debug/", null, - function(name) { return name + '-comments'; }); -runTestSet({dumpLineNumbers: 'mediaquery'}, "debug/", null, - function(name) { return name + '-mediaquery'; }); -runTestSet({dumpLineNumbers: 'all'}, "debug/", null, - function(name) { return name + '-all'; }); -runTestSet({relativeUrls: false, rootpath: "folder (1)/"}, "static-urls/"); - -function globalReplacements(input, directory) { - var p = path.join(process.cwd(), directory), - pathimport = path.join(process.cwd(), directory + "import/"), - pathesc = p.replace(/[.:\/]/g, '\\$&'), - pathimportesc = pathimport.replace(/[.:\/]/g, '\\$&'); - - return input.replace(/\{path\}/g, p) - .replace(/\{pathesc\}/g, pathesc) - .replace(/\{pathimport\}/g, pathimport) - .replace(/\{pathimportesc\}/g, pathimportesc) - .replace(/\r\n/g, '\n'); -} - -function runTestSet(options, foldername, verifyFunction, nameModifier, doReplacements) { - foldername = foldername || ""; - - if(!doReplacements) - doReplacements = globalReplacements; - - fs.readdirSync(path.join('test/less/', foldername)).forEach(function (file) { - if (! /\.less/.test(file)) { return } - - var name = foldername + path.basename(file, '.less'); - - if (oneTestOnly && name !== oneTestOnly) { return; } - - totalTests++; - - toCSS(options, path.join('test/less/', foldername + file), function (err, less) { - - if (verifyFunction) { - return verifyFunction(name, err, less, doReplacements); - } - var css_name = name; - if(nameModifier) css_name=nameModifier(name); - fs.readFile(path.join('test/css', css_name) + '.css', 'utf8', function (e, css) { - sys.print("- " + css_name + ": ") - - css = css && doReplacements(css, 'test/less/' + foldername); - if (less === css) { ok('OK'); } - else if (err) { - fail("ERROR: " + (err && err.message)); - } else { - difference("FAIL", css, less); - } - sys.puts(""); - }); - }); - }); -} - -function diff(left, right) { - sys.puts(""); - require('diff').diffLines(left, right).forEach(function(item) { - if(item.added || item.removed) { - sys.print(stylize(item.value, item.added ? 'green' : 'red')); - } else { - sys.print(item.value); - } - }); -} - -function fail(msg) { - sys.print(stylize(msg, 'red')); - failedTests++; - endTest(); -} - -function difference(msg, left, right) { - sys.print(stylize(msg, 'yellow')); - failedTests++; - - diff(left, right); - endTest(); -} - -function ok(msg) { - sys.print(stylize(msg, 'green')); - passedTests++; - endTest(); -} - -function endTest() { - if (failedTests + passedTests === totalTests) { - sys.puts(""); - sys.puts(""); - if (failedTests > 0) { - sys.print(failedTests); - sys.print(stylize(" Failed", "red")); - sys.print(", " + passedTests + " passed"); - } else { - sys.print(stylize("All Passed ", "green")); - sys.print(passedTests + " run"); - } - } -} - -function toCSS(options, path, callback) { - var tree, css; - options = options || {}; - fs.readFile(path, 'utf8', function (e, str) { - if (e) { return callback(e) } - - options.paths = [require('path').dirname(path)]; - options.filename = require('path').resolve(process.cwd(), path); - options.optimization = options.optimization || 0; - - new(less.Parser)(options).parse(str, function (err, tree) { - if (err) { - callback(err); - } else { - try { - css = tree.toCSS(); - callback(null, css); - } catch (e) { - callback(e); - } - } - }); - }); -} diff --git a/node_modules/less-middleware/node_modules/less/test/less/charsets.less b/node_modules/less-middleware/node_modules/less/test/less/charsets.less deleted file mode 100644 index 550d40e..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/charsets.less +++ /dev/null @@ -1,3 +0,0 @@ -@charset "UTF-8"; - -@import "import/import-charset-test"; \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/colors.less b/node_modules/less-middleware/node_modules/less/test/less/colors.less deleted file mode 100644 index 9ec78f9..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/colors.less +++ /dev/null @@ -1,92 +0,0 @@ -#yelow { - #short { - color: #fea; - } - #long { - color: #ffeeaa; - } - #rgba { - color: rgba(255, 238, 170, 0.1); - } - #argb { - color: argb(rgba(255, 238, 170, 0.1)); - } -} - -#blue { - #short { - color: #00f; - } - #long { - color: #0000ff; - } - #rgba { - color: rgba(0, 0, 255, 0.1); - } - #argb { - color: argb(rgba(0, 0, 255, 0.1)); - } -} - -#alpha #hsla { - color: hsla(11, 20%, 20%, 0.6); -} - -#overflow { - .a { color: #111111 - #444444; } // #000000 - .b { color: #eee + #fff; } // #ffffff - .c { color: #aaa * 3; } // #ffffff - .d { color: #00ee00 + #009900; } // #00ff00 -} - -#grey { - color: rgb(200, 200, 200); -} - -#333333 { - color: rgb(20%, 20%, 20%); -} - -#808080 { - color: hsl(50, 0%, 50%); -} - -#00ff00 { - color: hsl(120, 100%, 50%); -} - -.lightenblue { - color: lighten(blue, 10%); -} - -.darkenblue { - color: darken(blue, 10%); -} - -.unknowncolors { - color: blue2; - border: 2px solid superred; -} - -.transparent { - color: transparent; - background-color: rgba(0, 0, 0, 0); -} -#alpha { - @colorvar: rgba(150, 200, 150, 0.7); - #fromvar { - opacity: alpha(@colorvar); - } - #short { - opacity: alpha(#aaa); - } - #long { - opacity: alpha(#bababa); - } - #rgba { - opacity: alpha(rgba(50, 120, 95, 0.2)); - } - #hsl { - opacity: alpha(hsl(120, 100%, 50%)); - } -} diff --git a/node_modules/less-middleware/node_modules/less/test/less/comments.less b/node_modules/less-middleware/node_modules/less/test/less/comments.less deleted file mode 100644 index 85007c4..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/comments.less +++ /dev/null @@ -1,77 +0,0 @@ -/******************\ -* * -* Comment Header * -* * -\******************/ - -/* - - Comment - -*/ - -/* - * Comment Test - * - * - cloudhead (http://cloudhead.net) - * - */ - -//////////////// -@var: "content"; -//////////////// - -/* Colors - * ------ - * #EDF8FC (background blue) - * #166C89 (darkest blue) - * - * Text: - * #333 (standard text) // A comment within a comment! - * #1F9EC9 (standard link) - * - */ - -/* @group Variables -------------------- */ -#comments /* boo */ { - /**/ // An empty comment - color: red; /* A C-style comment */ - background-color: orange; // A little comment - font-size: 12px; - - /* lost comment */ content: @var; - - border: 1px solid black; - - // padding & margin // - padding: 0; // }{ '" - margin: 2em; -} // - -/* commented out - #more-comments { - color: grey; - } -*/ - -.selector /* .with */, .lots, /* of */ .comments { - color: grey, /* blue */ orange; - -webkit-border-radius: 2px /* webkit only */; - -moz-border-radius: 2px * 4 /* moz only with operation */; -} - -.mixin_def_with_colors(@a: white, // in - @b: 1px //put in @b - causes problems! ---> - ) // the - when (@a = white) { - .test { - color: @b; - } -} -.mixin_def_with_colors(); - -#last { color: blue } -// - -/* *//* { *//* *//* *//* */#div { color:#A33; }/* } */ diff --git a/node_modules/less-middleware/node_modules/less/test/less/css-3.less b/node_modules/less-middleware/node_modules/less/test/less/css-3.less deleted file mode 100644 index dc92f20..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/css-3.less +++ /dev/null @@ -1,113 +0,0 @@ -.comma-delimited { - text-shadow: -1px -1px 1px red, 6px 5px 5px yellow; - -moz-box-shadow: 0pt 0pt 2px rgba(255, 255, 255, 0.4) inset, - 0pt 4px 6px rgba(255, 255, 255, 0.4) inset; -} -@font-face { - font-family: Headline; - unicode-range: U+??????, U+0???, U+0-7F, U+A5; -} -.other { - -moz-transform: translate(0, 11em) rotate(-90deg); - transform: rotateX(45deg); -} -.item[data-cra_zy-attr1b-ut3=bold] { - font-weight: bold; -} -p:not([class*="lead"]) { - color: black; -} - -input[type="text"].class#id[attr=32]:not(1) { - color: white; -} - -div#id.class[a=1][b=2].class:not(1) { - color: white; -} - -ul.comma > li:not(:only-child)::after { - color: white; -} - -ol.comma > li:nth-last-child(2)::after { - color: white; -} - -li:nth-child(4n+1), -li:nth-child(-5n), -li:nth-child(-n+2) { - color: white; -} - -a[href^="https://"] { - color: black; -} - -a[href$="https://"] { - color: black; -} - -form[data-disabled] { - color: black; -} - -p::before { - color: black; -} - -#issue322 { - -webkit-animation: anim2 7s infinite ease-in-out; -} - -@-webkit-keyframes frames { - 0% { border: 1px } - 5.5% { border: 2px } - 100% { border: 3px } -} - -@keyframes fontbulger1 { - to { - font-size: 15px; - } - from,to { - font-size: 12px; - } - 0%,100% { - font-size: 12px; - } -} - -.units { - font: 1.2rem/2rem; - font: 8vw/9vw; - font: 10vh/12vh; - font: 12vm/15vm; - font: 12vmin/15vmin; - font: 1.2ch/1.5ch; -} - -@supports ( box-shadow: 2px 2px 2px black ) or - ( -moz-box-shadow: 2px 2px 2px black ) { - .outline { - box-shadow: 2px 2px 2px black; - -moz-box-shadow: 2px 2px 2px black; - } -} - -@-x-document url-prefix(""github.com"") { - h1 { - color: red; - } -} - -@viewport { - font-size: 10px; -} -@namespace foo url(http://www.example.com); - -foo|h1 { color: blue; } -foo|* { color: yellow; } -|h1 { color: red; } -*|h1 { color: green; } -h1 { color: green; } \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/css-escapes.less b/node_modules/less-middleware/node_modules/less/test/less/css-escapes.less deleted file mode 100644 index 6a4b283..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/css-escapes.less +++ /dev/null @@ -1,33 +0,0 @@ -@ugly: fuchsia; - -.escape\|random\|char { - color: red; -} - -.mixin\!tUp { - font-weight: bold; -} - -// class="404" -.\34 04 { - background: red; - - strong { - color: @ugly; - .mixin\!tUp; - } -} - -.trailingTest\+ { - color: red; -} - -/* This hideous test of hideousness checks for the selector "blockquote" with various permutations of hex escapes */ -\62\6c\6f \63 \6B \0071 \000075o\74 e { - color: silver; -} - -[ng\:cloak], -ng\:form { - display: none; -} diff --git a/node_modules/less-middleware/node_modules/less/test/less/css.less b/node_modules/less-middleware/node_modules/less/test/less/css.less deleted file mode 100644 index afeebb3..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/css.less +++ /dev/null @@ -1,102 +0,0 @@ -@charset "utf-8"; -div { color: black; } -div { width: 99%; } - -* { - min-width: 45em; -} - -h1, h2 > a > p, h3 { - color: none; -} - -div.class { - color: blue; -} - -div#id { - color: green; -} - -.class#id { - color: purple; -} - -.one.two.three { - color: grey; -} - -@media print { - font-size: 3em; -} - -@media screen { - font-size: 10px; -} - -@font-face { - font-family: 'Garamond Pro'; -} - -a:hover, a:link { - color: #999; -} - -p, p:first-child { - text-transform: none; -} - -q:lang(no) { - quotes: none; -} - -p + h1 { - font-size: +2.2em; -} - -#shorthands { - border: 1px solid #000; - font: 12px/16px Arial; - font: 100%/16px Arial; - margin: 1px 0; - padding: 0 auto; -} - -#more-shorthands { - margin: 0; - padding: 1px 0 2px 0; - font: normal small/20px 'Trebuchet MS', Verdana, sans-serif; - font: 0/0 a; -} - -.misc { - -moz-border-radius: 2px; - display: -moz-inline-stack; - width: .1em; - background-color: #009998; - background: -webkit-gradient(linear, left top, left bottom, from(red), to(blue)); - margin: ; - .nested-multiple { - multiple-semi-colons: yes;;;;;; - }; - filter: alpha(opacity=100); -} - -#important { - color: red !important; - width: 100%!important; - height: 20px ! important; -} - -.def-font(@name) { - @font-face { - font-family: @name - } -} - -.def-font(font-a); -.def-font(font-b); - -.æøå { - margin: 0; -} diff --git a/node_modules/less-middleware/node_modules/less/test/less/debug/import/test.less b/node_modules/less-middleware/node_modules/less/test/less/debug/import/test.less deleted file mode 100644 index 795082f..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/debug/import/test.less +++ /dev/null @@ -1,25 +0,0 @@ -@charset "ISO-8859-1"; - -.mixin_import1() { - @media all { - .tst { - color: black; - @media screen { - color: red; - .tst3 { - color: white; - } - } - } - } -} - -.mixin_import2() { - .tst2 { - color: white; - } -} - -.tst3 { - color: grey; -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/debug/linenumbers.less b/node_modules/less-middleware/node_modules/less/test/less/debug/linenumbers.less deleted file mode 100644 index 172ba02..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/debug/linenumbers.less +++ /dev/null @@ -1,23 +0,0 @@ -@charset "UTF-8"; - -@import "import/test.less"; - -.start() { - .test2 { - color: red; - } -} - -.mix() { - color: black; -} - -.test1 { - .mix(); -} - -.start(); - -.mixin_import1(); - -.mixin_import2(); \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/bad-variable-declaration1.less b/node_modules/less-middleware/node_modules/less/test/less/errors/bad-variable-declaration1.less deleted file mode 100644 index c2dc6ac..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/bad-variable-declaration1.less +++ /dev/null @@ -1 +0,0 @@ -@@demo: "hi"; \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/bad-variable-declaration1.txt b/node_modules/less-middleware/node_modules/less/test/less/errors/bad-variable-declaration1.txt deleted file mode 100644 index 9dd72a2..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/bad-variable-declaration1.txt +++ /dev/null @@ -1,2 +0,0 @@ -ParseError: Syntax Error on line 1 in {path}bad-variable-declaration1.less:1:0 -1 @@demo: "hi"; diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/comment-in-selector.less b/node_modules/less-middleware/node_modules/less/test/less/errors/comment-in-selector.less deleted file mode 100644 index a7d2639..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/comment-in-selector.less +++ /dev/null @@ -1 +0,0 @@ -#gaga /* Comment */ span { color: red } \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/comment-in-selector.txt b/node_modules/less-middleware/node_modules/less/test/less/errors/comment-in-selector.txt deleted file mode 100644 index 571462f..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/comment-in-selector.txt +++ /dev/null @@ -1,2 +0,0 @@ -ParseError: Syntax Error on line 1 in {path}comment-in-selector.less:1:20 -1 #gaga /* Comment */ span { color: red } diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/import-missing.less b/node_modules/less-middleware/node_modules/less/test/less/errors/import-missing.less deleted file mode 100644 index b740c11..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/import-missing.less +++ /dev/null @@ -1 +0,0 @@ -@import "file-does-not-exist.less"; \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/import-missing.txt b/node_modules/less-middleware/node_modules/less/test/less/errors/import-missing.txt deleted file mode 100644 index 2502e09..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/import-missing.txt +++ /dev/null @@ -1,3 +0,0 @@ -FileError: 'file-does-not-exist.less' wasn't found. - in {path}import-missing.less:1:0 -1 @import "file-does-not-exist.less"; diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/import-no-semi.less b/node_modules/less-middleware/node_modules/less/test/less/errors/import-no-semi.less deleted file mode 100644 index bf2c7f6..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/import-no-semi.less +++ /dev/null @@ -1 +0,0 @@ -@import "this-statement-is-invalid.less" \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/import-no-semi.txt b/node_modules/less-middleware/node_modules/less/test/less/errors/import-no-semi.txt deleted file mode 100644 index 60ae3f3..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/import-no-semi.txt +++ /dev/null @@ -1,2 +0,0 @@ -ParseError: Syntax Error on line 1 in {path}import-no-semi.less:1:0 -1 @import "this-statement-is-invalid.less" diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/import-subfolder1.less b/node_modules/less-middleware/node_modules/less/test/less/errors/import-subfolder1.less deleted file mode 100644 index 4280673..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/import-subfolder1.less +++ /dev/null @@ -1 +0,0 @@ -@import "imports/import-subfolder1.less"; \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/import-subfolder1.txt b/node_modules/less-middleware/node_modules/less/test/less/errors/import-subfolder1.txt deleted file mode 100644 index 7bfd3b3..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/import-subfolder1.txt +++ /dev/null @@ -1,3 +0,0 @@ -NameError: .mixin-not-defined is undefined in {pathrel}mixin-not-defined.less:11:0 -10 -11 .mixin-not-defined(); diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/import-subfolder2.less b/node_modules/less-middleware/node_modules/less/test/less/errors/import-subfolder2.less deleted file mode 100644 index a6b9b9c..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/import-subfolder2.less +++ /dev/null @@ -1 +0,0 @@ -@import "imports/import-subfolder2.less"; \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/import-subfolder2.txt b/node_modules/less-middleware/node_modules/less/test/less/errors/import-subfolder2.txt deleted file mode 100644 index 62e0bab..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/import-subfolder2.txt +++ /dev/null @@ -1,2 +0,0 @@ -ParseError: missing opening `{` in {pathrel}parse-error-curly-bracket.less:1:1 -1 }} diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/imports/import-subfolder1.less b/node_modules/less-middleware/node_modules/less/test/less/errors/imports/import-subfolder1.less deleted file mode 100644 index 24ec053..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/imports/import-subfolder1.less +++ /dev/null @@ -1 +0,0 @@ -@import "subfolder/mixin-not-defined.less"; \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/imports/import-subfolder2.less b/node_modules/less-middleware/node_modules/less/test/less/errors/imports/import-subfolder2.less deleted file mode 100644 index 6058ad1..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/imports/import-subfolder2.less +++ /dev/null @@ -1 +0,0 @@ -@import "subfolder/parse-error-curly-bracket.less"; \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/imports/import-test.less b/node_modules/less-middleware/node_modules/less/test/less/errors/imports/import-test.less deleted file mode 100644 index a91ae05..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/imports/import-test.less +++ /dev/null @@ -1,4 +0,0 @@ -.someclass -{ - font-weight: bold; -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/imports/subfolder/mixin-not-defined.less b/node_modules/less-middleware/node_modules/less/test/less/errors/imports/subfolder/mixin-not-defined.less deleted file mode 100644 index 2bb2d09..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/imports/subfolder/mixin-not-defined.less +++ /dev/null @@ -1 +0,0 @@ -@import "../../mixin-not-defined.less"; \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/imports/subfolder/parse-error-curly-bracket.less b/node_modules/less-middleware/node_modules/less/test/less/errors/imports/subfolder/parse-error-curly-bracket.less deleted file mode 100644 index f37fa9d..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/imports/subfolder/parse-error-curly-bracket.less +++ /dev/null @@ -1 +0,0 @@ -@import "../../parse-error-curly-bracket.less"; \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/javascript-error.less b/node_modules/less-middleware/node_modules/less/test/less/errors/javascript-error.less deleted file mode 100644 index 9cffb9f..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/javascript-error.less +++ /dev/null @@ -1,3 +0,0 @@ -.scope { - var: `this.foo.toJS()`; -} diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/javascript-error.txt b/node_modules/less-middleware/node_modules/less/test/less/errors/javascript-error.txt deleted file mode 100644 index 16dc9b7..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/javascript-error.txt +++ /dev/null @@ -1,4 +0,0 @@ -SyntaxError: JavaScript evaluation error: 'TypeError: Cannot call method 'toJS' of undefined' in {path}javascript-error.less:2:26 -1 .scope { -2 var: `this.foo.toJS()`; -3 } diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/mixed-mixin-definition-args-1.less b/node_modules/less-middleware/node_modules/less/test/less/errors/mixed-mixin-definition-args-1.less deleted file mode 100644 index 9b0e23a..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/mixed-mixin-definition-args-1.less +++ /dev/null @@ -1,6 +0,0 @@ -.mixin(@a : 4, @b : 3, @c: 2) { - will: fail; -} -.mixin-test { - .mixin(@a: 5; @b: 6, @c: 7); -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/mixed-mixin-definition-args-1.txt b/node_modules/less-middleware/node_modules/less/test/less/errors/mixed-mixin-definition-args-1.txt deleted file mode 100644 index 6ceda7d..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/mixed-mixin-definition-args-1.txt +++ /dev/null @@ -1,4 +0,0 @@ -SyntaxError: Cannot mix ; and , as delimiter types in {path}mixed-mixin-definition-args-1.less:5:29 -4 .mixin-test { -5 .mixin(@a: 5; @b: 6, @c: 7); -6 } diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/mixed-mixin-definition-args-2.less b/node_modules/less-middleware/node_modules/less/test/less/errors/mixed-mixin-definition-args-2.less deleted file mode 100644 index c970942..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/mixed-mixin-definition-args-2.less +++ /dev/null @@ -1,6 +0,0 @@ -.mixin(@a : 4, @b : 3, @c: 2) { - will: fail; -} -.mixin-test { - .mixin(@a: 5, @b: 6; @c: 7); -} diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/mixed-mixin-definition-args-2.txt b/node_modules/less-middleware/node_modules/less/test/less/errors/mixed-mixin-definition-args-2.txt deleted file mode 100644 index ebb5666..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/mixed-mixin-definition-args-2.txt +++ /dev/null @@ -1,4 +0,0 @@ -SyntaxError: Cannot mix ; and , as delimiter types in {path}mixed-mixin-definition-args-2.less:5:25 -4 .mixin-test { -5 .mixin(@a: 5, @b: 6; @c: 7); -6 } diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/mixin-not-defined.less b/node_modules/less-middleware/node_modules/less/test/less/errors/mixin-not-defined.less deleted file mode 100644 index e2dad5c..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/mixin-not-defined.less +++ /dev/null @@ -1,11 +0,0 @@ - -.error-is-further-on() { -} - -.pad-here-to-reproduce-error-in() { -} - -.the-import-subfolder-test() { -} - -.mixin-not-defined(); \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/mixin-not-defined.txt b/node_modules/less-middleware/node_modules/less/test/less/errors/mixin-not-defined.txt deleted file mode 100644 index f45de6a..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/mixin-not-defined.txt +++ /dev/null @@ -1,3 +0,0 @@ -NameError: .mixin-not-defined is undefined in {path}mixin-not-defined.less:11:0 -10 -11 .mixin-not-defined(); diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/mixin-not-matched.less b/node_modules/less-middleware/node_modules/less/test/less/errors/mixin-not-matched.less deleted file mode 100644 index be0d6b1..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/mixin-not-matched.less +++ /dev/null @@ -1,6 +0,0 @@ -@saxofon:trumpete; - -.mixin(saxofon) { -} - -.mixin(@saxofon); \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/mixin-not-matched.txt b/node_modules/less-middleware/node_modules/less/test/less/errors/mixin-not-matched.txt deleted file mode 100644 index 468eb76..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/mixin-not-matched.txt +++ /dev/null @@ -1,3 +0,0 @@ -RuntimeError: No matching definition was found for `.mixin(trumpete)` in {path}mixin-not-matched.less:6:0 -5 -6 .mixin(@saxofon); diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/mixin-not-matched2.less b/node_modules/less-middleware/node_modules/less/test/less/errors/mixin-not-matched2.less deleted file mode 100644 index 14f44bf..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/mixin-not-matched2.less +++ /dev/null @@ -1,6 +0,0 @@ -@saxofon:trumpete; - -.mixin(@a, @b) { -} - -.mixin(@a: @saxofon); \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/mixin-not-matched2.txt b/node_modules/less-middleware/node_modules/less/test/less/errors/mixin-not-matched2.txt deleted file mode 100644 index 2f01e74..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/mixin-not-matched2.txt +++ /dev/null @@ -1,3 +0,0 @@ -RuntimeError: No matching definition was found for `.mixin(@a:trumpete)` in {path}mixin-not-matched2.less:6:0 -5 -6 .mixin(@a: @saxofon); diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/parse-error-curly-bracket.less b/node_modules/less-middleware/node_modules/less/test/less/errors/parse-error-curly-bracket.less deleted file mode 100644 index a2950a1..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/parse-error-curly-bracket.less +++ /dev/null @@ -1 +0,0 @@ -}} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/parse-error-curly-bracket.txt b/node_modules/less-middleware/node_modules/less/test/less/errors/parse-error-curly-bracket.txt deleted file mode 100644 index bccdd98..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/parse-error-curly-bracket.txt +++ /dev/null @@ -1,2 +0,0 @@ -ParseError: missing opening `{` in {path}parse-error-curly-bracket.less:1:1 -1 }} diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/parse-error-missing-bracket.less b/node_modules/less-middleware/node_modules/less/test/less/errors/parse-error-missing-bracket.less deleted file mode 100644 index 144a6ed..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/parse-error-missing-bracket.less +++ /dev/null @@ -1,2 +0,0 @@ -body { - background-color: #fff; diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/parse-error-missing-bracket.txt b/node_modules/less-middleware/node_modules/less/test/less/errors/parse-error-missing-bracket.txt deleted file mode 100644 index 6887b23..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/parse-error-missing-bracket.txt +++ /dev/null @@ -1,2 +0,0 @@ -ParseError: missing closing `}` in {path}parse-error-missing-bracket.less:3:0 -2 background-color: #fff; diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/parse-error-with-import.less b/node_modules/less-middleware/node_modules/less/test/less/errors/parse-error-with-import.less deleted file mode 100644 index 6be3de8..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/parse-error-with-import.less +++ /dev/null @@ -1,13 +0,0 @@ -@import 'import/import-test.less'; - -body -{ - font-family: arial, sans-serif; -} - -nonsense; - -.clickable -{ - cursor: pointer; -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/parse-error-with-import.txt b/node_modules/less-middleware/node_modules/less/test/less/errors/parse-error-with-import.txt deleted file mode 100644 index 323ee82..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/parse-error-with-import.txt +++ /dev/null @@ -1,4 +0,0 @@ -ParseError: Syntax Error on line 8 in {path}parse-error-with-import.less:8:8 -7 -8 nonsense; -9 diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/property-ie5-hack.less b/node_modules/less-middleware/node_modules/less/test/less/errors/property-ie5-hack.less deleted file mode 100644 index 51bf6e3..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/property-ie5-hack.less +++ /dev/null @@ -1,3 +0,0 @@ -.test { - display/*/: block; /*sorry for IE5*/ -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/property-ie5-hack.txt b/node_modules/less-middleware/node_modules/less/test/less/errors/property-ie5-hack.txt deleted file mode 100644 index c809140..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/property-ie5-hack.txt +++ /dev/null @@ -1,4 +0,0 @@ -ParseError: Syntax Error on line 2 in {path}property-ie5-hack.less:2:2 -1 .test { -2 display/*/: block; /*sorry for IE5*/ -3 } diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/recursive-variable.less b/node_modules/less-middleware/node_modules/less/test/less/errors/recursive-variable.less deleted file mode 100644 index c1ca75f..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/recursive-variable.less +++ /dev/null @@ -1 +0,0 @@ -@bodyColor: darken(@bodyColor, 30%); \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/errors/recursive-variable.txt b/node_modules/less-middleware/node_modules/less/test/less/errors/recursive-variable.txt deleted file mode 100644 index 87fd6fc..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/errors/recursive-variable.txt +++ /dev/null @@ -1,2 +0,0 @@ -NameError: Recursive variable definition for @bodyColor in {path}recursive-variable.less:1:19 -1 @bodyColor: darken(@bodyColor, 30%); diff --git a/node_modules/less-middleware/node_modules/less/test/less/functions.less b/node_modules/less-middleware/node_modules/less/test/less/functions.less deleted file mode 100644 index 8b80ccc..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/functions.less +++ /dev/null @@ -1,111 +0,0 @@ -#functions { - @var: 10; - @colors: #000, #fff; - color: _color("evil red"); // #660000 - width: increment(15); - height: undefined("self"); - border-width: add(2, 3); - variable: increment(@var); - background: linear-gradient(@colors); -} - -#built-in { - @r: 32; - escaped: e("-Some::weird(#thing, y)"); - lighten: lighten(#ff0000, 40%); - darken: darken(#ff0000, 40%); - saturate: saturate(#29332f, 20%); - desaturate: desaturate(#203c31, 20%); - greyscale: greyscale(#203c31); - spin-p: spin(hsl(340, 50%, 50%), 40); - spin-n: spin(hsl(30, 50%, 50%), -40); - luma-white: luma(#fff); - luma-black: luma(#000); - luma-black-alpha: luma(rgba(0,0,0,0.5)); - luma-red: luma(#ff0000); - luma-green: luma(#00ff00); - luma-blue: luma(#0000ff); - luma-yellow: luma(#ffff00); - luma-cyan: luma(#00ffff); - luma-white-alpha: luma(rgba(255,255,255,0.5)); - contrast-filter: contrast(30%); - contrast-white: contrast(#fff); - contrast-black: contrast(#000); - contrast-red: contrast(#ff0000); - contrast-green: contrast(#00ff00); - contrast-blue: contrast(#0000ff); - contrast-yellow: contrast(#ffff00); - contrast-cyan: contrast(#00ffff); - contrast-light: contrast(#fff, #111111, #eeeeee); - contrast-dark: contrast(#000, #111111, #eeeeee); - contrast-light-thresh: contrast(#fff, #111111, #eeeeee, 0.5); - contrast-dark-thresh: contrast(#000, #111111, #eeeeee, 0.5); - contrast-high-thresh: contrast(#555, #111111, #eeeeee, 0.6); - contrast-low-thresh: contrast(#555, #111111, #eeeeee, 0.1); - format: %("rgb(%d, %d, %d)", @r, 128, 64); - format-string: %("hello %s", "world"); - format-multiple: %("hello %s %d", "earth", 2); - format-url-encode: %('red is %A', #ff0000); - eformat: e(%("rgb(%d, %d, %d)", @r, 128, 64)); - - unitless: unit(12px); - unit: unit(13px + 1px, em); - - hue: hue(hsl(98, 12%, 95%)); - saturation: saturation(hsl(98, 12%, 95%)); - lightness: lightness(hsl(98, 12%, 95%)); - red: red(#f00); - green: green(#0f0); - blue: blue(#00f); - rounded: round(@r/3); - rounded-two: round(@r/3, 2); - roundedpx: round(10px / 3); - roundedpx-three: round(10px / 3, 3); - rounded-percentage: round(10.2%); - ceil: ceil(10.1px); - floor: floor(12.9px); - percentage: percentage(10px / 50); - color: color("#ff0011"); - tint: tint(#777777, 13); - tint-full: tint(#777777, 100); - tint-percent: tint(#777777, 13%); - shade: shade(#777777, 13); - shade-full: shade(#777777, 100); - shade-percent: shade(#777777, 13%); - - hsv: hsv(5, 50%, 30%); - hsva: hsva(3, 50%, 30%, 0.2); - - mix: mix(#ff0000, #ffff00, 80); - mix-0: mix(#ff0000, #ffff00, 0); - mix-100: mix(#ff0000, #ffff00, 100); - mix-weightless: mix(#ff0000, #ffff00); - - .is-a { - color: iscolor(#ddd); - color1: iscolor(red); - color2: iscolor(rgb(0, 0, 0)); - keyword: iskeyword(hello); - number: isnumber(32); - string: isstring("hello"); - pixel: ispixel(32px); - percent: ispercentage(32%); - em: isem(32em); - } -} - -#alpha { - alpha: darken(hsla(25, 50%, 50%, 0.6), 10%); -} - -#blendmodes { - multiply: multiply(#f60000, #f60000); - screen: screen(#f60000, #0000f6); - overlay: overlay(#f60000, #0000f6); - softlight: softlight(#f60000, #ffffff); - hardlight: hardlight(#f60000, #0000f6); - difference: difference(#f60000, #0000f6); - exclusion: exclusion(#f60000, #0000f6); - average: average(#f60000, #0000f6); - negation: negation(#f60000, #313131); -} diff --git a/node_modules/less-middleware/node_modules/less/test/less/ie-filters.less b/node_modules/less-middleware/node_modules/less/test/less/ie-filters.less deleted file mode 100644 index 3350b65..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/ie-filters.less +++ /dev/null @@ -1,15 +0,0 @@ -@fat: 0; -@cloudhead: "#000000"; - -.nav { - filter: progid:DXImageTransform.Microsoft.Alpha(opacity = 20); - filter: progid:DXImageTransform.Microsoft.Alpha(opacity=@fat); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#333333", endColorstr=@cloudhead, GradientType=@fat); -} -.evalTest(@arg) { - filter: progid:DXImageTransform.Microsoft.Alpha(opacity=@arg); -} -.evalTest1 { - .evalTest(30); - .evalTest(5); -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/import-once.less b/node_modules/less-middleware/node_modules/less/test/less/import-once.less deleted file mode 100644 index 5588be4..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/import-once.less +++ /dev/null @@ -1,4 +0,0 @@ -@import-once "import/import-once-test-c"; -@import-once "import/import-once-test-c"; -@import-once "import/import-once-test-c.less"; -@import-once "import/deeper/import-once-test-a"; diff --git a/node_modules/less-middleware/node_modules/less/test/less/import.less b/node_modules/less-middleware/node_modules/less/test/less/import.less deleted file mode 100644 index 2a442ea..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/import.less +++ /dev/null @@ -1,12 +0,0 @@ -@import url(http://fonts.googleapis.com/css?family=Open+Sans); - -@import url(something.css) screen and (color) and (max-width: 600px); - -#import-test { - .mixin; - width: 10px; - height: @a + 10%; -} -@import "import/import-test-e" screen and (max-width: 600px); - -@import url("import/import-test-a.less"); diff --git a/node_modules/less-middleware/node_modules/less/test/less/import/deeper/import-once-test-a.less b/node_modules/less-middleware/node_modules/less/test/less/import/deeper/import-once-test-a.less deleted file mode 100644 index de2233d..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/import/deeper/import-once-test-a.less +++ /dev/null @@ -1 +0,0 @@ -@import-once "../import-once-test-c"; \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/import/import-and-relative-paths-test.less b/node_modules/less-middleware/node_modules/less/test/less/import/import-and-relative-paths-test.less deleted file mode 100644 index da69998..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/import/import-and-relative-paths-test.less +++ /dev/null @@ -1,6 +0,0 @@ -@import "../css/background.css"; -@import "import-test-d.css"; - -@import "imports/logo"; -@import "imports/font"; - diff --git a/node_modules/less-middleware/node_modules/less/test/less/import/import-charset-test.less b/node_modules/less-middleware/node_modules/less/test/less/import/import-charset-test.less deleted file mode 100644 index 07a66e1..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/import/import-charset-test.less +++ /dev/null @@ -1 +0,0 @@ -@charset "ISO-8859-1"; \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/import/import-once-test-c.less b/node_modules/less-middleware/node_modules/less/test/less/import/import-once-test-c.less deleted file mode 100644 index 686747a..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/import/import-once-test-c.less +++ /dev/null @@ -1,6 +0,0 @@ - -@c: red; - -#import { - color: @c; -} diff --git a/node_modules/less-middleware/node_modules/less/test/less/import/import-test-a.less b/node_modules/less-middleware/node_modules/less/test/less/import/import-test-a.less deleted file mode 100644 index b3b3b8f..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/import/import-test-a.less +++ /dev/null @@ -1,3 +0,0 @@ -@import "import-test-b.less"; -@a: 20%; -@import "urls.less"; \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/import/import-test-b.less b/node_modules/less-middleware/node_modules/less/test/less/import/import-test-b.less deleted file mode 100644 index ce2d35a..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/import/import-test-b.less +++ /dev/null @@ -1,8 +0,0 @@ -@import "import-test-c"; - -@b: 100%; - -.mixin { - height: 10px; - color: @c; -} diff --git a/node_modules/less-middleware/node_modules/less/test/less/import/import-test-c.less b/node_modules/less-middleware/node_modules/less/test/less/import/import-test-c.less deleted file mode 100644 index 686747a..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/import/import-test-c.less +++ /dev/null @@ -1,6 +0,0 @@ - -@c: red; - -#import { - color: @c; -} diff --git a/node_modules/less-middleware/node_modules/less/test/less/import/import-test-d.css b/node_modules/less-middleware/node_modules/less/test/less/import/import-test-d.css deleted file mode 100644 index 30575f0..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/import/import-test-d.css +++ /dev/null @@ -1 +0,0 @@ -#css { color: yellow; } diff --git a/node_modules/less-middleware/node_modules/less/test/less/import/import-test-e.less b/node_modules/less-middleware/node_modules/less/test/less/import/import-test-e.less deleted file mode 100644 index 98b84b0..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/import/import-test-e.less +++ /dev/null @@ -1,2 +0,0 @@ - -body { width: 100% } diff --git a/node_modules/less-middleware/node_modules/less/test/less/import/imports/font.less b/node_modules/less-middleware/node_modules/less/test/less/import/imports/font.less deleted file mode 100644 index 5abb7e7..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/import/imports/font.less +++ /dev/null @@ -1,8 +0,0 @@ -@font-face { - font-family: xecret; - src: url('../assets/xecret.ttf'); -} - -#secret { - font-family: xecret, sans-serif; -} diff --git a/node_modules/less-middleware/node_modules/less/test/less/import/imports/logo.less b/node_modules/less-middleware/node_modules/less/test/less/import/imports/logo.less deleted file mode 100644 index 22893a2..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/import/imports/logo.less +++ /dev/null @@ -1,5 +0,0 @@ -#logo { - width: 100px; - height: 100px; - background: url('../assets/logo.png'); -} diff --git a/node_modules/less-middleware/node_modules/less/test/less/import/urls.less b/node_modules/less-middleware/node_modules/less/test/less/import/urls.less deleted file mode 100644 index bb48f77..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/import/urls.less +++ /dev/null @@ -1 +0,0 @@ -// empty file showing that it loads from the relative path first diff --git a/node_modules/less-middleware/node_modules/less/test/less/javascript.less b/node_modules/less-middleware/node_modules/less/test/less/javascript.less deleted file mode 100644 index b76859e..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/javascript.less +++ /dev/null @@ -1,29 +0,0 @@ -.eval { - js: `42`; - js: `1 + 1`; - js: `"hello world"`; - js: `[1, 2, 3]`; - title: `typeof process.title`; - ternary: `(1 + 1 == 2 ? true : false)`; - multiline: `(function(){var x = 1 + 1; - return x})()`; -} -.scope { - @foo: 42; - var: `this.foo.toJS()`; - escaped: ~`2 + 5 + 'px'`; -} -.vars { - @var: `4 + 4`; - width: @var; -} -.escape-interpol { - @world: "world"; - width: ~`"hello" + " " + @{world}`; -} -.arrays { - @ary: 1, 2, 3; - @ary2: 1 2 3; - ary: `@{ary}.join(', ')`; - ary1: `@{ary2}.join(', ')`; -} diff --git a/node_modules/less-middleware/node_modules/less/test/less/lazy-eval.less b/node_modules/less-middleware/node_modules/less/test/less/lazy-eval.less deleted file mode 100644 index 72b3fd4..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/lazy-eval.less +++ /dev/null @@ -1,6 +0,0 @@ -@var: @a; -@a: 100%; - -.lazy-eval { - width: @var; -} diff --git a/node_modules/less-middleware/node_modules/less/test/less/media.less b/node_modules/less-middleware/node_modules/less/test/less/media.less deleted file mode 100644 index b401ae9..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/media.less +++ /dev/null @@ -1,199 +0,0 @@ - -// For now, variables can't be declared inside @media blocks. - -@var: 42; - -@media print { - .class { - color: blue; - .sub { - width: @var; - } - } - .top, header > h1 { - color: #222 * 2; - } -} - -@media screen { - @base: 8; - body { max-width: @base * 60; } -} - -@media all and (device-aspect-ratio: 16/9) { - body { max-width: 800px; } -} - -@media all and (orientation:portrait) { - aside { float: none; } -} - -@media handheld and (min-width: @var), screen and (min-width: 20em) { - body { - max-width: 480px; - } -} - -body { - @media print { - padding: 20px; - - header { - background-color: red; - } - - @media (orientation:landscape) { - margin-left: 20px; - } - } -} - -@media screen { - .sidebar { - width: 300px; - @media (orientation: landscape) { - width: 500px; - } - } -} - -@media a { - .first { - @media b { - .second { - .third { - width: 300px; - @media c { - width: 500px; - } - } - .fourth { - width: 3; - } - } - } - } -} - -body { - @media a, b and c { - width: 95%; - - @media x, y { - width: 100%; - } - } -} - -.mediaMixin(@fallback: 200px) { - background: black; - - @media handheld { - background: white; - - @media (max-width: @fallback) { - background: red; - } - } -} - -.a { - .mediaMixin(100px); -} - -.b { - .mediaMixin(); -} -@smartphone: ~"only screen and (max-width: 200px)"; -@media @smartphone { - width: 480px; -} - -@media print { - @page :left { - margin: 0.5cm; - } - @page :right { - margin: 0.5cm; - } - @page Test:first { - margin: 1cm; - } - @page :first { - size: 8.5in 11in; - @top-left { - margin: 1cm; - } - @top-left-corner { - margin: 1cm; - } - @top-center { - margin: 1cm; - } - @top-right { - margin: 1cm; - } - @top-right-corner { - margin: 1cm; - } - @bottom-left { - margin: 1cm; - } - @bottom-left-corner { - margin: 1cm; - } - @bottom-center { - margin: 1cm; - } - @bottom-right { - margin: 1cm; - } - @bottom-right-corner { - margin: 1cm; - } - @left-top { - margin: 1cm; - } - @left-middle { - margin: 1cm; - } - @left-bottom { - margin: 1cm; - } - @right-top { - margin: 1cm; - } - @right-middle { - content: "Page " counter(page); - } - @right-bottom { - margin: 1cm; - } - } -} - -@media (-webkit-min-device-pixel-ratio: 2), (min--moz-device-pixel-ratio: 2), (-o-min-device-pixel-ratio: 2/1), (min-resolution: 2dppx), (min-resolution: 128dpcm) { - .b { - background: red; - } -} - -.bg() { - background: red; - - @media (max-width: 500px) { - background: green; - } -} - -body { - .bg(); -} - -@bpMedium: 1000px; -@media (max-width: @bpMedium) { - body { - .bg(); - background: blue; - } -} diff --git a/node_modules/less-middleware/node_modules/less/test/less/mixins-args.less b/node_modules/less-middleware/node_modules/less/test/less/mixins-args.less deleted file mode 100644 index f71bdce..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/mixins-args.less +++ /dev/null @@ -1,167 +0,0 @@ -.mixin (@a: 1px, @b: 50%) { - width: @a * 5; - height: @b - 1%; -} - -.mixina (@style, @width, @color: black) { - border: @width @style @color; -} - -.mixiny -(@a: 0, @b: 0) { - margin: @a; - padding: @b; -} - -.hidden() { - color: transparent; // asd -} - -#hidden { - .hidden; -} - -#hidden1 { - .hidden(); -} - -.two-args { - color: blue; - .mixin(2px, 100%); - .mixina(dotted, 2px); -} - -.one-arg { - .mixin(3px); -} - -.no-parens { - .mixin; -} - -.no-args { - .mixin(); -} - -.var-args { - @var: 9; - .mixin(@var, @var * 2); -} - -.multi-mix { - .mixin(2px, 30%); - .mixiny(4, 5); -} - -.maxa(@arg1: 10, @arg2: #f00) { - padding: @arg1 * 2px; - color: @arg2; -} - -body { - .maxa(15); -} - -@glob: 5; -.global-mixin(@a:2) { - width: @glob + @a; -} - -.scope-mix { - .global-mixin(3); -} - -.nested-ruleset (@width: 200px) { - width: @width; - .column { margin: @width; } -} -.content { - .nested-ruleset(600px); -} - -// - -.same-var-name2(@radius) { - radius: @radius; -} -.same-var-name(@radius) { - .same-var-name2(@radius); -} -#same-var-name { - .same-var-name(5px); -} - -// - -.var-inside () { - @var: 10px; - width: @var; -} -#var-inside { .var-inside; } - -.mixin-arguments (@width: 0px, ...) { - border: @arguments; - width: @width; -} - -.arguments { - .mixin-arguments(1px, solid, black); -} -.arguments2 { - .mixin-arguments(); -} -.arguments3 { - .mixin-arguments; -} - -.mixin-arguments2 (@width, @rest...) { - border: @arguments; - rest: @rest; - width: @width; -} -.arguments4 { - .mixin-arguments2(0, 1, 2, 3, 4); -} - -// Edge cases - -.edge-case { - .mixin-arguments("{"); -} - -// semi-colon vs comma for delimiting - -.mixin-takes-one(@a) { - one: @a; -} - -.mixin-takes-two(@a; @b) { - one: @a; - two: @b; -} - -.comma-vs-semi-colon { - .mixin-takes-two(@a : a; @b : b, c); - .mixin-takes-two(@a : d, e; @b : f); - .mixin-takes-one(@a: g); - .mixin-takes-one(@a : h;); - .mixin-takes-one(i); - .mixin-takes-one(j;); - .mixin-takes-two(k, l); - .mixin-takes-one(m, n;); - .mixin-takes-two(o, p; q); - .mixin-takes-two(r, s; t;); -} - -.mixin-conflict(@a:defA, @b:defB, @c:defC) { - three: @a, @b, @c; -} - -.mixin-conflict(@a:defA, @b:defB, @c:defC, @d:defD) { - four: @a, @b, @c, @d; -} - -#named-conflict { - .mixin-conflict(11, 12, 13, @a:a); - .mixin-conflict(@a:a, 21, 22, 23); -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/mixins-closure.less b/node_modules/less-middleware/node_modules/less/test/less/mixins-closure.less deleted file mode 100644 index 01251d2..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/mixins-closure.less +++ /dev/null @@ -1,26 +0,0 @@ -.scope { - @var: 99px; - .mixin () { - width: @var; - } -} - -.class { - .scope > .mixin; -} - -.overwrite { - @var: 0px; - .scope > .mixin; -} - -.nested { - @var: 5px; - .mixin () { - width: @var; - } - .class { - @var: 10px; - .mixin; - } -} diff --git a/node_modules/less-middleware/node_modules/less/test/less/mixins-guards.less b/node_modules/less-middleware/node_modules/less/test/less/mixins-guards.less deleted file mode 100644 index 4414e32..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/mixins-guards.less +++ /dev/null @@ -1,124 +0,0 @@ - -// Stacking, functions.. - -.light (@a) when (lightness(@a) > 50%) { - color: white; -} -.light (@a) when (lightness(@a) < 50%) { - color: black; -} -.light (@a) { - margin: 1px; -} - -.light1 { .light(#ddd) } -.light2 { .light(#444) } - -// Arguments against each other - -.max (@a, @b) when (@a > @b) { - width: @a; -} -.max (@a, @b) when (@a < @b) { - width: @b; -} - -.max1 { .max(3, 6) } -.max2 { .max(8, 1) } - -// Globals inside guards - -@g: auto; - -.glob (@a) when (@a = @g) { - margin: @a @g; -} -.glob1 { .glob(auto) } - -// Other operators - -.ops (@a) when (@a >= 0) { - height: gt-or-eq; -} -.ops (@a) when (@a =< 0) { - height: lt-or-eq; -} -.ops (@a) when not(@a = 0) { - height: not-eq; -} -.ops1 { .ops(0) } -.ops2 { .ops(1) } -.ops3 { .ops(-1) } - -// Scope and default values - -@a: auto; - -.default (@a: inherit) when (@a = inherit) { - content: default; -} -.default1 { .default } - -// true & false keywords -.test (@a) when (@a) { - content: "true."; -} -.test (@a) when not (@a) { - content: "false."; -} - -.test1 { .test(true) } -.test2 { .test(false) } -.test3 { .test(1) } -.test4 { .test(boo) } -.test5 { .test("true") } - -// Boolean expressions - -.bool () when (true) and (false) { content: true and false } // FALSE -.bool () when (true) and (true) { content: true and true } // TRUE -.bool () when (true) { content: true } // TRUE -.bool () when (false) and (false) { content: true } // FALSE -.bool () when (false), (true) { content: false, true } // TRUE -.bool () when (false) and (true) and (true), (true) { content: false and true and true, true } // TRUE -.bool () when (true) and (true) and (false), (false) { content: true and true and false, false } // FALSE -.bool () when (false), (true) and (true) { content: false, true and true } // TRUE -.bool () when (false), (false), (true) { content: false, false, true } // TRUE -.bool () when (false), (false) and (true), (false) { content: false, false and true, false } // FALSE -.bool () when (false), (true) and (true) and (true), (false) { content: false, true and true and true, false } // TRUE -.bool () when not (false) { content: not false } -.bool () when not (true) and not (false) { content: not true and not false } -.bool () when not (true) and not (true) { content: not true and not true } -.bool () when not (false) and (false), not (false) { content: not false and false, not false } - -.bool1 { .bool } - -.equality-unit-test(@num) when (@num = 1%) { - test: fail; -} -.equality-unit-test(@num) when (@num = 2) { - test: pass; -} -.equality-units { - .equality-unit-test(1px); - .equality-unit-test(2px); -} - -.colorguard(@col) when (@col = red) { content: is @col; } -.colorguard(@col) when not (blue = @col) { content: is not blue its @col; } -.colorguard(@col) {} -.colorguardtest { - .colorguard(red); - .colorguard(blue); - .colorguard(purple); -} - -.stringguard(@str) when (@str = "theme1") { content: is theme1; } -.stringguard(@str) when not ("theme2" = @str) { content: is not theme2; } -.stringguard(@str) when (~"theme1" = @str) { content: is theme1 no quotes; } -.stringguard(@str) {} -.stringguardtest { - .stringguard("theme1"); - .stringguard("theme2"); - .stringguard(theme1); -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/mixins-important.less b/node_modules/less-middleware/node_modules/less/test/less/mixins-important.less deleted file mode 100644 index df1fd71..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/mixins-important.less +++ /dev/null @@ -1,22 +0,0 @@ - -.mixin (9) { - border: 9 !important; -} -.mixin (@a: 0) { - border: @a; - boxer: @a; - .inner { - test: @a; - } - // comment -} - -.class { - .mixin(1); - .mixin(2) !important; - .mixin(3); - .mixin(4) !important; - .mixin(5); - .mixin !important; - .mixin(9); -} diff --git a/node_modules/less-middleware/node_modules/less/test/less/mixins-named-args.less b/node_modules/less-middleware/node_modules/less/test/less/mixins-named-args.less deleted file mode 100644 index afe9ad6..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/mixins-named-args.less +++ /dev/null @@ -1,36 +0,0 @@ -.mixin (@a: 1px, @b: 50%) { - width: @a * 5; - height: @b - 1%; - args: @arguments; -} -.mixin (@a: 1px, @b: 50%) when (@b > 75%){ - text-align: center; -} - -.named-arg { - color: blue; - .mixin(@b: 100%); -} - -.class { - @var: 20%; - .mixin(@b: @var); -} - -.all-args-wrong-args { - .mixin(@b: 10%, @a: 2px); -} - -.mixin2 (@a: 1px, @b: 50%, @c: 50) { - width: @a * 5; - height: @b - 1%; - color: #000000 + @c; -} - -.named-args2 { - .mixin2(3px, @c: 100); -} - -.named-args3 { - .mixin2(@b: 30%, @c: #123456); -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/mixins-nested.less b/node_modules/less-middleware/node_modules/less/test/less/mixins-nested.less deleted file mode 100644 index d086279..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/mixins-nested.less +++ /dev/null @@ -1,22 +0,0 @@ -.mix-inner (@var) { - border-width: @var; -} - -.mix (@a: 10) { - .inner { - height: @a * 10; - - .innest { - width: @a; - .mix-inner(@a * 2); - } - } -} - -.class { - .mix(30); -} - -.class2 { - .mix(60); -} diff --git a/node_modules/less-middleware/node_modules/less/test/less/mixins-pattern.less b/node_modules/less-middleware/node_modules/less/test/less/mixins-pattern.less deleted file mode 100644 index b2121e9..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/mixins-pattern.less +++ /dev/null @@ -1,99 +0,0 @@ -.mixin (...) { - variadic: true; -} -.mixin () { - zero: 0; -} -.mixin (@a: 1px) { - one: 1; -} -.mixin (@a) { - one-req: 1; -} -.mixin (@a: 1px, @b: 2px) { - two: 2; -} - -.mixin (@a, @b, @c) { - three-req: 3; -} - -.mixin (@a: 1px, @b: 2px, @c: 3px) { - three: 3; -} - -.zero { - .mixin(); -} - -.one { - .mixin(1); -} - -.two { - .mixin(1, 2); -} - -.three { - .mixin(1, 2, 3); -} - -// - -.mixout ('left') { - left: 1; -} - -.mixout ('right') { - right: 1; -} - -.left { - .mixout('left'); -} -.right { - .mixout('right'); -} - -// - -.border (@side, @width) { - color: black; - .border-side(@side, @width); -} -.border-side (left, @w) { - border-left: @w; -} -.border-side (right, @w) { - border-right: @w; -} - -.border-right { - .border(right, 4px); -} -.border-left { - .border(left, 4px); -} - -// - - -.border-radius (@r) { - both: @r * 10; -} -.border-radius (@r, left) { - left: @r; -} -.border-radius (@r, right) { - right: @r; -} - -.only-right { - .border-radius(33, right); -} -.only-left { - .border-radius(33, left); -} -.left-right { - .border-radius(33); -} diff --git a/node_modules/less-middleware/node_modules/less/test/less/mixins.less b/node_modules/less-middleware/node_modules/less/test/less/mixins.less deleted file mode 100644 index 9e38243..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/mixins.less +++ /dev/null @@ -1,114 +0,0 @@ -.mixin { border: 1px solid black; } -.mixout { border-color: orange; } -.borders { border-style: dashed; } - -#namespace { - .borders { - border-style: dotted; - } - .biohazard { - content: "death"; - .man { - color: transparent; - } - } -} -#theme { - > .mixin { - background-color: grey; - } -} -#container { - color: black; - .mixin; - .mixout; - #theme > .mixin; -} - -#header { - .milk { - color: white; - .mixin; - #theme > .mixin; - } - #cookie { - .chips { - #namespace .borders; - .calories { - #container; - } - } - .borders; - } -} -.secure-zone { #namespace .biohazard .man; } -.direct { - #namespace > .borders; -} - -.bo, .bar { - width: 100%; -} -.bo { - border: 1px; -} -.ar.bo.ca { - color: black; -} -.jo.ki { - background: none; -} -.amp { - &.support { - color: orange; - } -} -.extended { - .bo; - .jo.ki; - .amp.support; -} -.foo .bar { - .bar; -} -.has_parents() { - & .underParents { - color: red; - } -} -.has_parents(); -.parent { - .has_parents(); -} -.margin_between(@above, @below) { - * + & { margin-top: @above; } - legend + & { margin-top: 0; } - & + * { margin-top: @below; } -} -h1 { .margin_between(25px, 10px); } -h2 { .margin_between(20px, 8px); } -h3 { .margin_between(15px, 5px); } - -.mixin_def(@url, @position){ - background-image: @url; - background-position: @position; -} -.error{ - @s: "/"; - .mixin_def( "@{s}a.png", center center); -} -.recursion() { - color: black; -} -.test-rec { - .recursion { - .recursion(); - } -} -.paddingFloat(@padding) { padding-left: @padding; } - -.button { - .paddingFloat(((10px + 12) * 2)); - - &.large { .paddingFloat((10em * 2) * 2); } -} diff --git a/node_modules/less-middleware/node_modules/less/test/less/operations.less b/node_modules/less-middleware/node_modules/less/test/less/operations.less deleted file mode 100644 index 46b0aa3..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/operations.less +++ /dev/null @@ -1,62 +0,0 @@ -#operations { - color: #110000 + #000011 + #001100; // #111111 - height: 10px / 2px + 6px - 1px * 2; // 9px - width: 2 * 4 - 5em; // 3em - .spacing { - height: 10px / 2px+6px-1px*2; - width: 2 * 4-5em; - } - substraction: 20 - 10 - 5 - 5; // 0 - division: 20 / 5 / 4; // 1 -} - -@x: 4; -@y: 12em; - -.with-variables { - height: @x + @y; // 16em - width: 12 + @y; // 24em - size: 5cm - @x; // 1cm -} - -.with-functions { - color: rgb(200, 200, 200) / 2; - color: 2 * hsl(0, 50%, 50%); - color: rgb(10, 10, 10) + hsl(0, 50%, 50%); -} - -@z: -2; - -.negative { - height: 2px + @z; // 0px - width: 2px - @z; // 4px -} - -.shorthands { - padding: -1px 2px 0 -4px; // -} - -.rem-dimensions { - font-size: 20rem / 5 + 1.5rem; // 5.5rem -} - -.colors { - color: #123; // #112233 - border-color: #234 + #111111; // #334455 - background-color: #222222 - #fff; // #000000 - .other { - color: 2 * #111; // #222222 - border-color: #333333 / 3 + #111; // #222222 - } -} - -.negations { - @var: 4px; - variable: -@var; // 4 - variable1: -@var + @var; // 0 - variable2: @var + -@var; // 0 - variable3: @var - -@var; // 8 - variable4: -@var - -@var; // 0 - paren: -(@var); // -4px - paren2: -(2 + 2) * -@var; // 16 -} diff --git a/node_modules/less-middleware/node_modules/less/test/less/parens.less b/node_modules/less-middleware/node_modules/less/test/less/parens.less deleted file mode 100644 index e020c7e..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/parens.less +++ /dev/null @@ -1,26 +0,0 @@ -.parens { - @var: 1px; - border: (@var * 2) solid black; - margin: (@var * 1) (@var + 2) (4 * 4) 3; - width: (6 * 6); - padding: 2px (6px * 6px); -} - -.more-parens { - @var: (2 * 2); - padding: (2 * @var) 4 4 (@var * 1px); - width: (@var * @var) * 6; - height: (7 * 7) + (8 * 8); - margin: 4 * (5 + 5) / 2 - (@var * 2); - //margin: (6 * 6)px; -} - -.nested-parens { - width: 2 * (4 * (2 + (1 + 6))) - 1; - height: ((2+3)*(2+3) / (9-4)) + 1; -} - -.mixed-units { - margin: 2px 4em 1 5pc; - padding: (2px + 4px) 1em 2px 2; -} diff --git a/node_modules/less-middleware/node_modules/less/test/less/rulesets.less b/node_modules/less-middleware/node_modules/less/test/less/rulesets.less deleted file mode 100644 index e81192d..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/rulesets.less +++ /dev/null @@ -1,30 +0,0 @@ -#first > .one { - > #second .two > #deux { - width: 50%; - #third { - &:focus { - color: black; - #fifth { - > #sixth { - .seventh #eighth { - + #ninth { - color: purple; - } - } - } - } - } - height: 100%; - } - #fourth, #five, #six { - color: #110000; - .seven, .eight > #nine { - border: 1px solid black; - } - #ten { - color: red; - } - } - } - font-size: 2em; -} diff --git a/node_modules/less-middleware/node_modules/less/test/less/scope.less b/node_modules/less-middleware/node_modules/less/test/less/scope.less deleted file mode 100644 index 36d3706..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/scope.less +++ /dev/null @@ -1,79 +0,0 @@ -@x: red; -@x: blue; -@z: transparent; -@mix: none; - -.mixin { - @mix: #989; -} -@mix: blue; -.tiny-scope { - color: @mix; // #989 - .mixin; -} - -.scope1 { - @y: orange; - @z: black; - color: @x; // blue - border-color: @z; // black - .hidden { - @x: #131313; - } - .scope2 { - @y: red; - color: @x; // blue - .scope3 { - @local: white; - color: @y; // red - border-color: @z; // black - background-color: @local; // white - } - } -} - -#namespace { - .scoped_mixin() { - @local-will-be-made-global: green; - .scope { - scoped-val: @local-will-be-made-global; - } - } -} - -#namespace > .scoped_mixin(); - -.setHeight(@h) { @height: 1024px; } -.useHeightInMixinCall(@h) { .useHeightInMixinCall { mixin-height: @h; } } -@mainHeight: 50%; -.setHeight(@mainHeight); -.heightIsSet { height: @height; } -.useHeightInMixinCall(@height); - -.importRuleset() { - .imported { - exists: true; - } -} -.importRuleset(); -.testImported { - .imported; -} - -@parameterDefault: 'top level'; -@anotherVariable: 'top level'; -//mixin uses top-level variables -.mixinNoParam(@parameter: @parameterDefault) when (@parameter = 'top level') { - default: @parameter; - scope: @anotherVariable; - sub-scope-only: @subScopeOnly; -} - -#allAreUsedHere { - //redefine top-level variables in different scope - @parameterDefault: 'inside'; - @anotherVariable: 'inside'; - @subScopeOnly: 'inside'; - //use the mixin - .mixinNoParam(); -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/selectors.less b/node_modules/less-middleware/node_modules/less/test/less/selectors.less deleted file mode 100644 index 8cb8838..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/selectors.less +++ /dev/null @@ -1,136 +0,0 @@ -h1, h2, h3 { - a, p { - &:hover { - color: red; - } - } -} - -#all { color: blue; } -#the { color: blue; } -#same { color: blue; } - -ul, li, div, q, blockquote, textarea { - margin: 0; -} - -td { - margin: 0; - padding: 0; -} - -td, input { - line-height: 1em; -} - -a { - color: red; - - &:hover { color: blue; } - - div & { color: green; } - - p & span { color: yellow; } -} - -.foo { - .bar, .baz { - & .qux { - display: block; - } - .qux & { - display: inline; - } - .qux& { - display: inline-block; - } - .qux & .biz { - display: none; - } - } -} - -.b { - &.c { - .a& { - color: red; - } - } -} - -.b { - .c & { - &.a { - color: red; - } - } -} - -.p { - .foo &.bar { - color: red; - } -} - -.p { - .foo&.bar { - color: red; - } -} - -.foo { - .foo + & { - background: amber; - } - & + & { - background: amber; - } -} - -.foo, .bar { - & + & { - background: amber; - } -} - -.foo, .bar { - a, b { - & > & { - background: amber; - } - } -} - -.other ::fnord { color: red } -.other::fnord { color: red } -.other { - ::bnord {color: red } - &::bnord {color: red } -} -// selector interpolation - deprecated -@theme: blood; -(~".@{theme}") { - color: red; -} -// selector interpolation - new format -@selector: ~".@{theme}"; -@{selector} { - color:red; -} -@{selector}red { - color: green; -} -.red { - #@{theme}.@{theme}&.black { - color:black; - } -} -@num: 3; -:nth-child(@{num}):nth-child(@num) { - second-use: deprecated; -} -.test { - &:nth-child(odd):not(:nth-child(3)) { - color: #ff0000; - } -} \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/less/test/less/static-urls/urls.less b/node_modules/less-middleware/node_modules/less/test/less/static-urls/urls.less deleted file mode 100644 index b0c7de0..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/static-urls/urls.less +++ /dev/null @@ -1,33 +0,0 @@ -@font-face { - src: url("/https/github.com/fonts/garamond-pro.ttf"); - src: local(Futura-Medium), - url(fonts.svg#MyGeometricModern) format("svg"); -} -#shorthands { - background: url("http://www.lesscss.org/spec.html") no-repeat 0 4px; -} -#misc { - background-image: url(images/image.jpg); -} -#data-uri { - background: url(data:image/png;charset=utf-8;base64, - kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/ - k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U - kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC); - background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==); - background-image: url(http://fonts.googleapis.com/css?family=\"Rokkitt\":\(400\),700); -} - -#svg-data-uri { - background: transparent url('data:image/svg+xml, '); -} - -.comma-delimited { - background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg); -} -.values { - @a: 'Trebuchet'; - url: url(@a); -} - -@import "../import/import-and-relative-paths-test"; diff --git a/node_modules/less-middleware/node_modules/less/test/less/strings.less b/node_modules/less-middleware/node_modules/less/test/less/strings.less deleted file mode 100644 index 32fad72..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/strings.less +++ /dev/null @@ -1,51 +0,0 @@ -#strings { - background-image: url("http://son-of-a-banana.com"); - quotes: "~" "~"; - content: "#*%:&^,)!.(~*})"; - empty: ""; - brackets: "{" "}"; - escapes: "\"hello\" \\world"; - escapes2: "\"llo"; -} -#comments { - content: "/* hello */ // not-so-secret"; -} -#single-quote { - quotes: "'" "'"; - content: '""#!&""'; - empty: ''; - semi-colon: ';'; -} -#escaped { - filter: ~"DX.Transform.MS.BS.filter(opacity=50)"; -} -#one-line { image: url(http://tooks.com) } -#crazy { image: url(http://), "}", url("http://}") } -#interpolation { - @var: '/dev'; - url: "http://lesscss.org@{var}/image.jpg"; - - @var2: 256; - url2: "http://lesscss.org/image-@{var2}.jpg"; - - @var3: #456; - url3: "http://lesscss.org@{var3}"; - - @var4: hello; - url4: "http://lesscss.org/@{var4}"; - - @var5: 54.4px; - url5: "http://lesscss.org/@{var5}"; -} - -// multiple calls with string interpolation - -.mix-mul (@a: green) { - color: ~"@{a}"; -} -.mix-mul-class { - .mix-mul(blue); - .mix-mul(red); - .mix-mul(black); - .mix-mul(orange); -} diff --git a/node_modules/less-middleware/node_modules/less/test/less/urls.less b/node_modules/less-middleware/node_modules/less/test/less/urls.less deleted file mode 100644 index 93ec412..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/urls.less +++ /dev/null @@ -1,33 +0,0 @@ -@font-face { - src: url("/https/github.com/fonts/garamond-pro.ttf"); - src: local(Futura-Medium), - url(fonts.svg#MyGeometricModern) format("svg"); -} -#shorthands { - background: url("http://www.lesscss.org/spec.html") no-repeat 0 4px; -} -#misc { - background-image: url(images/image.jpg); -} -#data-uri { - background: url(data:image/png;charset=utf-8;base64, - kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/ - k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U - kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC); - background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==); - background-image: url(http://fonts.googleapis.com/css?family=\"Rokkitt\":\(400\),700); -} - -#svg-data-uri { - background: transparent url('data:image/svg+xml, '); -} - -.comma-delimited { - background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg); -} -.values { - @a: 'Trebuchet'; - url: url(@a); -} - -@import "import/import-and-relative-paths-test"; diff --git a/node_modules/less-middleware/node_modules/less/test/less/variables.less b/node_modules/less-middleware/node_modules/less/test/less/variables.less deleted file mode 100644 index f91c209..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/variables.less +++ /dev/null @@ -1,53 +0,0 @@ -@a: 2; -@x: @a * @a; -@y: @x + 1; -@z: @x * 2 + @y; - -.variables { - width: @z + 1cm; // 14cm -} - -@b: @a * 10; -@c: #888; - -@fonts: "Trebuchet MS", Verdana, sans-serif; -@f: @fonts; - -@quotes: "~" "~"; -@q: @quotes; - -.variables { - height: @b + @x + 0px; // 24px - color: @c; - font-family: @f; - quotes: @q; -} - -.redefinition { - @var: 4; - @var: 2; - @var: 3; - three: @var; -} - -.values { - @a: 'Trebuchet'; - @multi: 'A', B, C; - font-family: @a, @a, @a; - color: @c !important; - multi: something @multi, @a; -} - -.variable-names { - @var: 'hello'; - @name: 'var'; - name: @@name; -} -.alpha { - @var: 42; - filter: alpha(opacity=@var); -} - -a:nth-child(@a) { - border: 1px; -} diff --git a/node_modules/less-middleware/node_modules/less/test/less/whitespace.less b/node_modules/less-middleware/node_modules/less/test/less/whitespace.less deleted file mode 100644 index ab4804d..0000000 --- a/node_modules/less-middleware/node_modules/less/test/less/whitespace.less +++ /dev/null @@ -1,44 +0,0 @@ - - -.whitespace - { color: white; } - -.whitespace -{ - color: white; -} - .whitespace -{ color: white; } - -.whitespace{color:white;} -.whitespace { color : white ; } - -.white, -.space, -.mania -{ color: white; } - -.no-semi-column { color: white } -.no-semi-column { - color: white; - white-space: pre -} -.no-semi-column {border: 2px solid white} -.newlines { - background: the, - great, - wall; - border: 2px - solid - black; -} -.empty { - -} -.sel -.newline_ws .tab_ws { -color: -white; -background-position: 45 --23; -} diff --git a/node_modules/less-middleware/node_modules/mkdirp/.npmignore b/node_modules/less-middleware/node_modules/mkdirp/.npmignore deleted file mode 100644 index 9303c34..0000000 --- a/node_modules/less-middleware/node_modules/mkdirp/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules/ -npm-debug.log \ No newline at end of file diff --git a/node_modules/less-middleware/node_modules/mkdirp/.travis.yml b/node_modules/less-middleware/node_modules/mkdirp/.travis.yml deleted file mode 100644 index 84fd7ca..0000000 --- a/node_modules/less-middleware/node_modules/mkdirp/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - 0.6 - - 0.8 - - 0.9 diff --git a/node_modules/less-middleware/node_modules/mkdirp/LICENSE b/node_modules/less-middleware/node_modules/mkdirp/LICENSE deleted file mode 100644 index 432d1ae..0000000 --- a/node_modules/less-middleware/node_modules/mkdirp/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -Copyright 2010 James Halliday (mail@substack.net) - -This project is free software released under the MIT/X11 license: - -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. diff --git a/node_modules/less-middleware/node_modules/mkdirp/README.markdown b/node_modules/less-middleware/node_modules/mkdirp/README.markdown deleted file mode 100644 index 83b0216..0000000 --- a/node_modules/less-middleware/node_modules/mkdirp/README.markdown +++ /dev/null @@ -1,63 +0,0 @@ -# mkdirp - -Like `mkdir -p`, but in node.js! - -[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](http://travis-ci.org/substack/node-mkdirp) - -# example - -## pow.js - -```js -var mkdirp = require('mkdirp'); - -mkdirp('/tmp/foo/bar/baz', function (err) { - if (err) console.error(err) - else console.log('pow!') -}); -``` - -Output - -``` -pow! -``` - -And now /tmp/foo/bar/baz exists, huzzah! - -# methods - -```js -var mkdirp = require('mkdirp'); -``` - -## mkdirp(dir, mode, cb) - -Create a new directory and any necessary subdirectories at `dir` with octal -permission string `mode`. - -If `mode` isn't specified, it defaults to `0777 & (~process.umask())`. - -`cb(err, made)` fires with the error or the first directory `made` -that had to be created, if any. - -## mkdirp.sync(dir, mode) - -Synchronously create a new directory and any necessary subdirectories at `dir` -with octal permission string `mode`. - -If `mode` isn't specified, it defaults to `0777 & (~process.umask())`. - -Returns the first directory that had to be created, if any. - -# install - -With [npm](http://npmjs.org) do: - -``` -npm install mkdirp -``` - -# license - -MIT diff --git a/node_modules/less-middleware/node_modules/mkdirp/examples/pow.js b/node_modules/less-middleware/node_modules/mkdirp/examples/pow.js deleted file mode 100644 index e692421..0000000 --- a/node_modules/less-middleware/node_modules/mkdirp/examples/pow.js +++ /dev/null @@ -1,6 +0,0 @@ -var mkdirp = require('mkdirp'); - -mkdirp('/tmp/foo/bar/baz', function (err) { - if (err) console.error(err) - else console.log('pow!') -}); diff --git a/node_modules/less-middleware/node_modules/mkdirp/index.js b/node_modules/less-middleware/node_modules/mkdirp/index.js deleted file mode 100644 index fda6de8..0000000 --- a/node_modules/less-middleware/node_modules/mkdirp/index.js +++ /dev/null @@ -1,82 +0,0 @@ -var path = require('path'); -var fs = require('fs'); - -module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; - -function mkdirP (p, mode, f, made) { - if (typeof mode === 'function' || mode === undefined) { - f = mode; - mode = 0777 & (~process.umask()); - } - if (!made) made = null; - - var cb = f || function () {}; - if (typeof mode === 'string') mode = parseInt(mode, 8); - p = path.resolve(p); - - fs.mkdir(p, mode, function (er) { - if (!er) { - made = made || p; - return cb(null, made); - } - switch (er.code) { - case 'ENOENT': - mkdirP(path.dirname(p), mode, function (er, made) { - if (er) cb(er, made); - else mkdirP(p, mode, cb, made); - }); - break; - - // In the case of any other error, just see if there's a dir - // there already. If so, then hooray! If not, then something - // is borked. - default: - fs.stat(p, function (er2, stat) { - // if the stat fails, then that's super weird. - // let the original error be the failure reason. - if (er2 || !stat.isDirectory()) cb(er, made) - else cb(null, made); - }); - break; - } - }); -} - -mkdirP.sync = function sync (p, mode, made) { - if (mode === undefined) { - mode = 0777 & (~process.umask()); - } - if (!made) made = null; - - if (typeof mode === 'string') mode = parseInt(mode, 8); - p = path.resolve(p); - - try { - fs.mkdirSync(p, mode); - made = made || p; - } - catch (err0) { - switch (err0.code) { - case 'ENOENT' : - made = sync(path.dirname(p), mode, made); - sync(p, mode, made); - break; - - // In the case of any other error, just see if there's a dir - // there already. If so, then hooray! If not, then something - // is borked. - default: - var stat; - try { - stat = fs.statSync(p); - } - catch (err1) { - throw err0; - } - if (!stat.isDirectory()) throw err0; - break; - } - } - - return made; -}; diff --git a/node_modules/less-middleware/node_modules/mkdirp/package.json b/node_modules/less-middleware/node_modules/mkdirp/package.json deleted file mode 100644 index 1f2736d..0000000 --- a/node_modules/less-middleware/node_modules/mkdirp/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "mkdirp", - "description": "Recursively mkdir, like `mkdir -p`", - "version": "0.3.5", - "author": { - "name": "James Halliday", - "email": "mail@substack.net", - "url": "http://substack.net" - }, - "main": "./index", - "keywords": [ - "mkdir", - "directory" - ], - "repository": { - "type": "git", - "url": "http://github.com/substack/node-mkdirp.git" - }, - "scripts": { - "test": "tap test/*.js" - }, - "devDependencies": { - "tap": "~0.4.0" - }, - "license": "MIT", - "readme": "# mkdirp\n\nLike `mkdir -p`, but in node.js!\n\n[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](http://travis-ci.org/substack/node-mkdirp)\n\n# example\n\n## pow.js\n\n```js\nvar mkdirp = require('mkdirp');\n \nmkdirp('/tmp/foo/bar/baz', function (err) {\n if (err) console.error(err)\n else console.log('pow!')\n});\n```\n\nOutput\n\n```\npow!\n```\n\nAnd now /tmp/foo/bar/baz exists, huzzah!\n\n# methods\n\n```js\nvar mkdirp = require('mkdirp');\n```\n\n## mkdirp(dir, mode, cb)\n\nCreate a new directory and any necessary subdirectories at `dir` with octal\npermission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\n`cb(err, made)` fires with the error or the first directory `made`\nthat had to be created, if any.\n\n## mkdirp.sync(dir, mode)\n\nSynchronously create a new directory and any necessary subdirectories at `dir`\nwith octal permission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\nReturns the first directory that had to be created, if any.\n\n# install\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm install mkdirp\n```\n\n# license\n\nMIT\n", - "_id": "mkdirp@0.3.5", - "_from": "mkdirp@>= 0.3.1" -} diff --git a/node_modules/less-middleware/node_modules/mkdirp/test/chmod.js b/node_modules/less-middleware/node_modules/mkdirp/test/chmod.js deleted file mode 100644 index 520dcb8..0000000 --- a/node_modules/less-middleware/node_modules/mkdirp/test/chmod.js +++ /dev/null @@ -1,38 +0,0 @@ -var mkdirp = require('../').mkdirp; -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -var ps = [ '', 'tmp' ]; - -for (var i = 0; i < 25; i++) { - var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - ps.push(dir); -} - -var file = ps.join('/'); - -test('chmod-pre', function (t) { - var mode = 0744 - mkdirp(file, mode, function (er) { - t.ifError(er, 'should not error'); - fs.stat(file, function (er, stat) { - t.ifError(er, 'should exist'); - t.ok(stat && stat.isDirectory(), 'should be directory'); - t.equal(stat && stat.mode & 0777, mode, 'should be 0744'); - t.end(); - }); - }); -}); - -test('chmod', function (t) { - var mode = 0755 - mkdirp(file, mode, function (er) { - t.ifError(er, 'should not error'); - fs.stat(file, function (er, stat) { - t.ifError(er, 'should exist'); - t.ok(stat && stat.isDirectory(), 'should be directory'); - t.end(); - }); - }); -}); diff --git a/node_modules/less-middleware/node_modules/mkdirp/test/clobber.js b/node_modules/less-middleware/node_modules/mkdirp/test/clobber.js deleted file mode 100644 index 0eb7099..0000000 --- a/node_modules/less-middleware/node_modules/mkdirp/test/clobber.js +++ /dev/null @@ -1,37 +0,0 @@ -var mkdirp = require('../').mkdirp; -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -var ps = [ '', 'tmp' ]; - -for (var i = 0; i < 25; i++) { - var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - ps.push(dir); -} - -var file = ps.join('/'); - -// a file in the way -var itw = ps.slice(0, 3).join('/'); - - -test('clobber-pre', function (t) { - console.error("about to write to "+itw) - fs.writeFileSync(itw, 'I AM IN THE WAY, THE TRUTH, AND THE LIGHT.'); - - fs.stat(itw, function (er, stat) { - t.ifError(er) - t.ok(stat && stat.isFile(), 'should be file') - t.end() - }) -}) - -test('clobber', function (t) { - t.plan(2); - mkdirp(file, 0755, function (err) { - t.ok(err); - t.equal(err.code, 'ENOTDIR'); - t.end(); - }); -}); diff --git a/node_modules/less-middleware/node_modules/mkdirp/test/mkdirp.js b/node_modules/less-middleware/node_modules/mkdirp/test/mkdirp.js deleted file mode 100644 index b07cd70..0000000 --- a/node_modules/less-middleware/node_modules/mkdirp/test/mkdirp.js +++ /dev/null @@ -1,28 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('woo', function (t) { - t.plan(2); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var file = '/tmp/' + [x,y,z].join('/'); - - mkdirp(file, 0755, function (err) { - if (err) t.fail(err); - else path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }) - }); -}); diff --git a/node_modules/less-middleware/node_modules/mkdirp/test/perm.js b/node_modules/less-middleware/node_modules/mkdirp/test/perm.js deleted file mode 100644 index 23a7abb..0000000 --- a/node_modules/less-middleware/node_modules/mkdirp/test/perm.js +++ /dev/null @@ -1,32 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('async perm', function (t) { - t.plan(2); - var file = '/tmp/' + (Math.random() * (1<<30)).toString(16); - - mkdirp(file, 0755, function (err) { - if (err) t.fail(err); - else path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }) - }); -}); - -test('async root perm', function (t) { - mkdirp('/tmp', 0755, function (err) { - if (err) t.fail(err); - t.end(); - }); - t.end(); -}); diff --git a/node_modules/less-middleware/node_modules/mkdirp/test/perm_sync.js b/node_modules/less-middleware/node_modules/mkdirp/test/perm_sync.js deleted file mode 100644 index f685f60..0000000 --- a/node_modules/less-middleware/node_modules/mkdirp/test/perm_sync.js +++ /dev/null @@ -1,39 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('sync perm', function (t) { - t.plan(2); - var file = '/tmp/' + (Math.random() * (1<<30)).toString(16) + '.json'; - - mkdirp.sync(file, 0755); - path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }); -}); - -test('sync root perm', function (t) { - t.plan(1); - - var file = '/tmp'; - mkdirp.sync(file, 0755); - path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }); -}); diff --git a/node_modules/less-middleware/node_modules/mkdirp/test/race.js b/node_modules/less-middleware/node_modules/mkdirp/test/race.js deleted file mode 100644 index 96a0447..0000000 --- a/node_modules/less-middleware/node_modules/mkdirp/test/race.js +++ /dev/null @@ -1,41 +0,0 @@ -var mkdirp = require('../').mkdirp; -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('race', function (t) { - t.plan(4); - var ps = [ '', 'tmp' ]; - - for (var i = 0; i < 25; i++) { - var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - ps.push(dir); - } - var file = ps.join('/'); - - var res = 2; - mk(file, function () { - if (--res === 0) t.end(); - }); - - mk(file, function () { - if (--res === 0) t.end(); - }); - - function mk (file, cb) { - mkdirp(file, 0755, function (err) { - if (err) t.fail(err); - else path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - if (cb) cb(); - } - }) - }) - }); - } -}); diff --git a/node_modules/less-middleware/node_modules/mkdirp/test/rel.js b/node_modules/less-middleware/node_modules/mkdirp/test/rel.js deleted file mode 100644 index 7985824..0000000 --- a/node_modules/less-middleware/node_modules/mkdirp/test/rel.js +++ /dev/null @@ -1,32 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('rel', function (t) { - t.plan(2); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var cwd = process.cwd(); - process.chdir('/tmp'); - - var file = [x,y,z].join('/'); - - mkdirp(file, 0755, function (err) { - if (err) t.fail(err); - else path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - process.chdir(cwd); - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }) - }); -}); diff --git a/node_modules/less-middleware/node_modules/mkdirp/test/return.js b/node_modules/less-middleware/node_modules/mkdirp/test/return.js deleted file mode 100644 index bce68e5..0000000 --- a/node_modules/less-middleware/node_modules/mkdirp/test/return.js +++ /dev/null @@ -1,25 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('return value', function (t) { - t.plan(4); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var file = '/tmp/' + [x,y,z].join('/'); - - // should return the first dir created. - // By this point, it would be profoundly surprising if /tmp didn't - // already exist, since every other test makes things in there. - mkdirp(file, function (err, made) { - t.ifError(err); - t.equal(made, '/tmp/' + x); - mkdirp(file, function (err, made) { - t.ifError(err); - t.equal(made, null); - }); - }); -}); diff --git a/node_modules/less-middleware/node_modules/mkdirp/test/return_sync.js b/node_modules/less-middleware/node_modules/mkdirp/test/return_sync.js deleted file mode 100644 index 7c222d3..0000000 --- a/node_modules/less-middleware/node_modules/mkdirp/test/return_sync.js +++ /dev/null @@ -1,24 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('return value', function (t) { - t.plan(2); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var file = '/tmp/' + [x,y,z].join('/'); - - // should return the first dir created. - // By this point, it would be profoundly surprising if /tmp didn't - // already exist, since every other test makes things in there. - // Note that this will throw on failure, which will fail the test. - var made = mkdirp.sync(file); - t.equal(made, '/tmp/' + x); - - // making the same file again should have no effect. - made = mkdirp.sync(file); - t.equal(made, null); -}); diff --git a/node_modules/less-middleware/node_modules/mkdirp/test/root.js b/node_modules/less-middleware/node_modules/mkdirp/test/root.js deleted file mode 100644 index 97ad7a2..0000000 --- a/node_modules/less-middleware/node_modules/mkdirp/test/root.js +++ /dev/null @@ -1,18 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('root', function (t) { - // '/' on unix, 'c:/' on windows. - var file = path.resolve('/'); - - mkdirp(file, 0755, function (err) { - if (err) throw err - fs.stat(file, function (er, stat) { - if (er) throw er - t.ok(stat.isDirectory(), 'target is a directory'); - t.end(); - }) - }); -}); diff --git a/node_modules/less-middleware/node_modules/mkdirp/test/sync.js b/node_modules/less-middleware/node_modules/mkdirp/test/sync.js deleted file mode 100644 index 7530cad..0000000 --- a/node_modules/less-middleware/node_modules/mkdirp/test/sync.js +++ /dev/null @@ -1,32 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('sync', function (t) { - t.plan(2); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var file = '/tmp/' + [x,y,z].join('/'); - - try { - mkdirp.sync(file, 0755); - } catch (err) { - t.fail(err); - return t.end(); - } - - path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }); - }); -}); diff --git a/node_modules/less-middleware/node_modules/mkdirp/test/umask.js b/node_modules/less-middleware/node_modules/mkdirp/test/umask.js deleted file mode 100644 index 64ccafe..0000000 --- a/node_modules/less-middleware/node_modules/mkdirp/test/umask.js +++ /dev/null @@ -1,28 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('implicit mode from umask', function (t) { - t.plan(2); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var file = '/tmp/' + [x,y,z].join('/'); - - mkdirp(file, function (err) { - if (err) t.fail(err); - else path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0777 & (~process.umask())); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }) - }); -}); diff --git a/node_modules/less-middleware/node_modules/mkdirp/test/umask_sync.js b/node_modules/less-middleware/node_modules/mkdirp/test/umask_sync.js deleted file mode 100644 index 35bd5cb..0000000 --- a/node_modules/less-middleware/node_modules/mkdirp/test/umask_sync.js +++ /dev/null @@ -1,32 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('umask sync modes', function (t) { - t.plan(2); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var file = '/tmp/' + [x,y,z].join('/'); - - try { - mkdirp.sync(file); - } catch (err) { - t.fail(err); - return t.end(); - } - - path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, (0777 & (~process.umask()))); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }); - }); -}); diff --git a/node_modules/less-middleware/package.json b/node_modules/less-middleware/package.json deleted file mode 100644 index 61a73a0..0000000 --- a/node_modules/less-middleware/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "author": { - "name": "Randy Merrill", - "email": "Zoramite+github@gmail.com", - "url": "http://forthedeveloper.com" - }, - "name": "less-middleware", - "description": "LESS.js middleware for connect.", - "version": "0.1.6", - "repository": { - "type": "git", - "url": "git://github.com/emberfeather/less.js-middleware.git" - }, - "main": "lib/middleware.js", - "dependencies": { - "less": ">= 1.3.0", - "mkdirp": ">= 0.3.1" - }, - "devDependencies": {}, - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "readme": "## Installation\n\n sudo npm install less-middleware\n\n## Options\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
      OptionDescriptionDefault
      forceAlways re-compile less files on each request.false
      onceOnly check for need to recompile once after each server restart. Useful for reducing disk i/o on production.false
      debugOutput any debugging messages to the console.false
      srcSource directory containing the .less files. Required.
      destDesitnation directory to output the compiled .css files.<src>
      prefixPath which should be stripped from the public pathname.
      compressCompress the output being written to the *.css files. When set to 'auto' compression will only happen when the css file ends with .min.css or -min.css.auto
      optimizationDesired level of LESS optimization. Optionally 0, 1, or 20
      \n\n## Examples\n\n### Connect\n\n var lessMiddleware = require('less-middleware');\n\n var server = connect.createServer(\n lessMiddleware({\n src: __dirname + '/public',\n compress: true\n }),\n connect.staticProvider(__dirname + '/public')\n );\n\n### Express\n\n var lessMiddleware = require('less-middleware');\n\n var app = express.createServer();\n\n app.configure(function () {\n // Other configuration here...\n\n app.use(lessMiddleware({\n src: __dirname + '/public',\n compress: true\n }));\n\n app.use(express.static(__dirname + '/public'));\n });\n\n### Express - Different `src` and `dest`\n\nWhen using a different `src` and `dest` you can use the `prefix` option to make the directory structure cleaner.\n\nRequests for static assets (like stylesheets) made to the express server use a `pathname` to look up the file. So if the request is for `http://localhost/stylesheets/styles.css` the `pathname` will be `/stylesheets/styles.css`.\n\nThe less middleware uses that path to determine where to look for less files. In the original example it looks for the less file at `/public/stylesheets/styles.less` and compiles it to `/public/stylesheets/styles.css`.\n\nIf you are using a different `src` and `dest` options it causes for more complex directories structures unless you use the `prefix` option. For example, without the `prefix`, and with a `src` of `/src/less` and a `dest` of `/public` it would look for the less file at `/src/less/stylesheets/styles.less` and compile it to `/public/stylesheets/styles.css`. To make it cleaner you can use the `prefix` option:\n\n var lessMiddleware = require('less-middleware');\n\n var app = express.createServer();\n\n app.configure(function () {\n // Other configuration here...\n\n app.use(lessMiddleware({\n dest: __dirname + '/public/stylesheets',\n src: __dirname + '/src/less',\n prefix: '/stylesheets',\n compress: true\n }));\n\n app.use(express.static(__dirname + '/public'));\n });\n\nUsing the `prefix` it changes the `pathname` from `/stylesheets/styles.css` to `/styles.css`. With that prefix removed from the `pathname` it makes things cleaner. With the `prefix` removed it would look for the less file at `/src/less/styles.less` and compile it to `/public/stylesheets/styles.css`.\n", - "_id": "less-middleware@0.1.6", - "_from": "less-middleware@0.1.6" -} diff --git a/node_modules/less-middleware/readme.md b/node_modules/less-middleware/readme.md deleted file mode 100644 index 8149f28..0000000 --- a/node_modules/less-middleware/readme.md +++ /dev/null @@ -1,117 +0,0 @@ -## Installation - - sudo npm install less-middleware - -## Options - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      OptionDescriptionDefault
      forceAlways re-compile less files on each request.false
      onceOnly check for need to recompile once after each server restart. Useful for reducing disk i/o on production.false
      debugOutput any debugging messages to the console.false
      srcSource directory containing the .less files. Required.
      destDesitnation directory to output the compiled .css files.<src>
      prefixPath which should be stripped from the public pathname.
      compressCompress the output being written to the *.css files. When set to 'auto' compression will only happen when the css file ends with .min.css or -min.css.auto
      optimizationDesired level of LESS optimization. Optionally 0, 1, or 20
      - -## Examples - -### Connect - - var lessMiddleware = require('less-middleware'); - - var server = connect.createServer( - lessMiddleware({ - src: __dirname + '/public', - compress: true - }), - connect.staticProvider(__dirname + '/public') - ); - -### Express - - var lessMiddleware = require('less-middleware'); - - var app = express.createServer(); - - app.configure(function () { - // Other configuration here... - - app.use(lessMiddleware({ - src: __dirname + '/public', - compress: true - })); - - app.use(express.static(__dirname + '/public')); - }); - -### Express - Different `src` and `dest` - -When using a different `src` and `dest` you can use the `prefix` option to make the directory structure cleaner. - -Requests for static assets (like stylesheets) made to the express server use a `pathname` to look up the file. So if the request is for `http://localhost/stylesheets/styles.css` the `pathname` will be `/stylesheets/styles.css`. - -The less middleware uses that path to determine where to look for less files. In the original example it looks for the less file at `/public/stylesheets/styles.less` and compiles it to `/public/stylesheets/styles.css`. - -If you are using a different `src` and `dest` options it causes for more complex directories structures unless you use the `prefix` option. For example, without the `prefix`, and with a `src` of `/src/less` and a `dest` of `/public` it would look for the less file at `/src/less/stylesheets/styles.less` and compile it to `/public/stylesheets/styles.css`. To make it cleaner you can use the `prefix` option: - - var lessMiddleware = require('less-middleware'); - - var app = express.createServer(); - - app.configure(function () { - // Other configuration here... - - app.use(lessMiddleware({ - dest: __dirname + '/public/stylesheets', - src: __dirname + '/src/less', - prefix: '/stylesheets', - compress: true - })); - - app.use(express.static(__dirname + '/public')); - }); - -Using the `prefix` it changes the `pathname` from `/stylesheets/styles.css` to `/styles.css`. With that prefix removed from the `pathname` it makes things cleaner. With the `prefix` removed it would look for the less file at `/src/less/styles.less` and compile it to `/public/stylesheets/styles.css`. diff --git a/node_modules/less-middleware/test/parse-test.js b/node_modules/less-middleware/test/parse-test.js deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/mongoose/.npmignore b/node_modules/mongoose/.npmignore deleted file mode 100644 index df5ea94..0000000 --- a/node_modules/mongoose/.npmignore +++ /dev/null @@ -1,13 +0,0 @@ -lib-cov -**.swp -*.sw* -*.orig -.DS_Store -node_modules/ -benchmarks/ -docs/ -test/ -Makefile -CNAME -index.html -index.jade diff --git a/node_modules/mongoose/.travis.yml b/node_modules/mongoose/.travis.yml deleted file mode 100644 index ce393d5..0000000 --- a/node_modules/mongoose/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: node_js -node_js: - - 0.6 - - 0.8 -services: - - mongodb diff --git a/node_modules/mongoose/CONTRIBUTING.md b/node_modules/mongoose/CONTRIBUTING.md deleted file mode 100644 index 7a90c4e..0000000 --- a/node_modules/mongoose/CONTRIBUTING.md +++ /dev/null @@ -1,42 +0,0 @@ -## Contributing to Mongoose - -### Reporting bugs - -- Before opening a new issue, look for existing [issues](https://github.com/learnboost/mongoose/issues) to avoid duplication. If the issue does not yet exist, [create one](https://github.com/learnboost/mongoose/issues/new). - - Please describe the issue you are experiencing, along with any associated stack trace. - - Please post code that reproduces the issue, the version of mongoose, node version, and mongodb version. - - _The source of this project is written in javascript, not coffeescript, therefore your bug reports should be written in javascript_. - - In general, adding a "+1" comment to an existing issue does little to help get it resolved. A better way is to submit a well documented pull request with clean code and passing tests. - -### Fixing bugs / Adding features - -- Before starting to write code, look for existing [issues](https://github.com/learnboost/mongoose/issues). That way you avoid working on something that might not be of interest or that has been addressed already in a different branch. You can create a new issue [here](https://github.com/learnboost/mongoose/issues/new). - - _The source of this project is written in javascript, not coffeescript, therefore your bug reports should be written in javascript_. -- Fork the [repo](https://github.com/learnboost/mongoose) _or_ for small documentation changes, navigate to the source on github and click the [Edit](https://github.com/blog/844-forking-with-the-edit-button) button. -- Follow the general coding style of the rest of the project: - - 2 space tabs - - no trailing whitespace - - comma first - - inline documentation for new methods, class members, etc - - 1 space between conditionals/functions, and their parenthesis and curly braces - - `if (..) {` - - `for (..) {` - - `while (..) {` - - `function (err) {` -- Write tests and make sure they pass (execute `make test` from the command line to run the test suite). - -### Documentation - -To contribute to the [API documentation](http://mongoosejs.com/docs/api.html) just make your changes to the inline documentation of the appropriate [source code](https://github.com/LearnBoost/mongoose/tree/master/lib) in the master branch and submit a [pull request](https://help.github.com/articles/using-pull-requests/). You might also use the github [Edit](https://github.com/blog/844-forking-with-the-edit-button) button. - -To contribute to the [guide](http://mongoosejs.com/docs/guide.html) or [quick start](http://mongoosejs.com/docs/index.html) docs, make your changes to the appropriate `.jade` files in the [docs](https://github.com/LearnBoost/mongoose/tree/master/docs) directory of the master branch and submit a pull request. Again, the [Edit](https://github.com/blog/844-forking-with-the-edit-button) button might work for you here. - -If you'd like to preview your documentation changes, first commit your changes to your local master branch, then execute `make docs` from the project root, which switches to the gh-pages branch, merges from master, and builds all the static pages for you. Now execute `node server.js` from the project root which will launch a local webserver where you can browse the documentation site locally. If all looks good, submit a [pull request](https://help.github.com/articles/using-pull-requests/) to the master branch with your changes. - -### Plugins website - -The [plugins](http://plugins.mongoosejs.com/) site is also an [open source project](https://github.com/aheckmann/mongooseplugins) that you can get involved with. Feel free to fork and improve it as well! - -### Sharing your projects - -All are welcome to share their creations which use mongoose on our [tumbler](http://mongoosejs.tumblr.com/). Just fill out the [simple submission form](http://mongoosejs.tumblr.com/submit). diff --git a/node_modules/mongoose/History.md b/node_modules/mongoose/History.md deleted file mode 100644 index 2b17f0c..0000000 --- a/node_modules/mongoose/History.md +++ /dev/null @@ -1,1308 +0,0 @@ - -3.5.7 / 2013-02-22 -================== - - * updated; driver to 1.2.13 - * updated; muri to 0.3.1 #1347 - * fixed; utils.clone retains RegExp opts #1355 - * fixed; deepEquals RegExp support - * tests; fix a connection test - * website; clean up docs [afshinm](https://github.com/afshinm) - * website; update homepage - * website; migragtion: emphasize impact of strict docs #1264 - -3.5.6 / 2013-02-14 -================== - - * updated; driver to 1.2.12 - * fixed; properly pass Binary subtype - * fixed; add EventEmitter props to reserved paths #1338 - * fixed; use correct node engine version - * fixed; display empty docs as {} in log output #953 follow up - * improved; "bad $within $box argument" error message - * populate; add unscientific benchmark - * website; add stack overflow to help section - * website; use better code font #1336 [risseraka](https://github.com/risseraka) - * website; clarify where help is available - * website; fix source code links #1272 [floatingLomas](https://github.com/floatingLomas) - * docs; be specific about _id schema option #1103 - * docs; add ensureIndex error handling example - * docs; README - * docs; CONTRIBUTING.md - -3.5.5 / 2013-01-29 -================== - - * updated; driver to 1.2.11 - * removed; old node < 0.6x shims - * fixed; documents with Buffer _ids equality - * fixed; MongooseBuffer properly casts numbers - * fixed; reopening closed connection on alt host/port #1287 - * docs; fixed typo in Readme #1298 [rened](https://github.com/rened) - * docs; fixed typo in migration docs [Prinzhorn](https://github.com/Prinzhorn) - * docs; fixed incorrect annotation in SchemaNumber#min [bilalq](https://github.com/bilalq) - * docs; updated - -3.5.4 / 2013-01-07 -================== - - * changed; "_pres" & "_posts" are now reserved pathnames #1261 - * updated; driver to 1.2.8 - * fixed; exception when reopening a replica set. #1263 [ethankan](https://github.com/ethankan) - * website; updated - -3.5.3 / 2012-12-26 -================== - - * added; support for geo object notation #1257 - * fixed; $within query casting with arrays - * fixed; unix domain socket support #1254 - * updated; driver to 1.2.7 - * updated; muri to 0.0.5 - -3.5.2 / 2012-12-17 -================== - - * fixed; using auth with replica sets #1253 - -3.5.1 / 2012-12-12 -================== - - * fixed; regression when using subdoc with `path` as pathname #1245 [daeq](https://github.com/daeq) - * fixed; safer db option checks - * updated; driver to 1.2.5 - * website; add more examples - * website; clean up old docs - * website; fix prev release urls - * docs; clarify streaming with HTTP responses - -3.5.0 / 2012-12-10 -================== - - * added; paths to CastErrors #1239 - * added; support for mongodb connection string spec #1187 - * added; post validate event - * added; Schema#get (to retrieve schema options) - * added; VersionError #1071 - * added; npmignore [hidekiy](https://github.com/hidekiy) - * update; driver to 1.2.3 - * fixed; stackoverflow in setter #1234 - * fixed; utils.isObject() - * fixed; do not clobber user specified driver writeConcern #1227 - * fixed; always pass current document to post hooks - * fixed; throw error when user attempts to overwrite a model - * fixed; connection.model only caches on connection #1209 - * fixed; respect conn.model() creation when matching global model exists #1209 - * fixed; passing model name + collection name now always honors collection name - * fixed; setting virtual field to an empty object #1154 - * fixed; subclassed MongooseErrors exposure, now available in mongoose.Error.xxxx - * fixed; model.remove() ignoring callback when executed twice [daeq](https://github.com/daeq) #1210 - * docs; add collection option to schema api docs #1222 - * docs; NOTE about db safe options - * docs; add post hooks docs - * docs; connection string options - * docs; middleware is not executed with Model.remove #1241 - * docs; {g,s}etter introspection #777 - * docs; update validation docs - * docs; add link to plugins page - * docs; clarify error returned by unique indexes #1225 - * docs; more detail about disabling autoIndex behavior - * docs; add homepage section to package (npm docs mongoose) - * docs; more detail around collection name pluralization #1193 - * website; add .important css - * website; update models page - * website; update getting started - * website; update quick start - -3.4.0 / 2012-11-10 -================== - - * added; support for generic toJSON/toObject transforms #1160 #1020 #1197 - * added; doc.set() merge support #1148 [NuORDER](https://github.com/NuORDER) - * added; query#add support #1188 [aleclofabbro](https://github.com/aleclofabbro) - * changed; adding invalid nested paths to non-objects throws 4216f14 - * changed; fixed; stop invalid function cloning (internal fix) - * fixed; add query $and casting support #1180 [anotheri](https://github.com/anotheri) - * fixed; overwriting of query arguments #1176 - * docs; fix expires examples - * docs; transforms - * docs; schema `collection` option docs [hermanjunge](https://github.com/hermanjunge) - * website; updated - * tests; added - -3.3.1 / 2012-10-11 -================== - - * fixed; allow goose.connect(uris, dbname, opts) #1144 - * docs; persist API private checked state across page loads - -3.3.0 / 2012-10-10 -================== - - * fixed; passing options as 2nd arg to connect() #1144 - * fixed; race condition after no-op save #1139 - * fixed; schema field selection application in findAndModify #1150 - * fixed; directly setting arrays #1126 - * updated; driver to 1.1.11 - * updated; collection pluralization rules [mrickard](https://github.com/mrickard) - * tests; added - * docs; updated - -3.2.2 / 2012-10-08 -================== - - * updated; driver to 1.1.10 #1143 - * updated; use sliced 0.0.3 - * fixed; do not recast embedded docs unnecessarily - * fixed; expires schema option helper #1132 - * fixed; built in string setters #1131 - * fixed; debug output for Dates/ObjectId properties #1129 - * docs; fixed Javascript syntax error in example [olalonde](https://github.com/olalonde) - * docs; fix toJSON example #1137 - * docs; add ensureIndex production notes - * docs; fix spelling - * docs; add blogposts about v3 - * website; updated - * removed; undocumented inGroupsOf util - * tests; added - -3.2.1 / 2012-09-28 -================== - - * fixed; remove query batchSize option default of 1000 https://github.com/learnboost/mongoose/commit/3edaa8651 - * docs; updated - * website; updated - -3.2.0 / 2012-09-27 -================== - - * added; direct array index assignment with casting support `doc.array.set(index, value)` - * fixed; QueryStream#resume within same tick as pause() #1116 - * fixed; default value validatation #1109 - * fixed; array splice() not casting #1123 - * fixed; default array construction edge case #1108 - * fixed; query casting for inequalities in arrays #1101 [dpatti](https://github.com/dpatti) - * tests; added - * website; more documentation - * website; fixed layout issue #1111 [SlashmanX](https://github.com/SlashmanX) - * website; refactored [guille](https://github.com/guille) - -3.1.2 / 2012-09-10 -================== - - * added; ReadPreferrence schema option #1097 - * updated; driver to 1.1.7 - * updated; default query batchSize to 1000 - * fixed; we now cast the mapReduce query option #1095 - * fixed; $elemMatch+$in with field selection #1091 - * fixed; properly cast $elemMatch+$in conditions #1100 - * fixed; default field application of subdocs #1027 - * fixed; querystream prematurely dying #1092 - * fixed; querystream never resumes when paused at getMore boundries #1092 - * fixed; querystream occasionally emits data events after destroy #1092 - * fixed; remove unnecessary ObjectId creation in querystream - * fixed; allow ne(boolean) again #1093 - * docs; add populate/field selection syntax notes - * docs; add toObject/toJSON options detail - * docs; `read` schema option - -3.1.1 / 2012-08-31 -================== - - * updated; driver to 1.1.6 - -3.1.0 / 2012-08-29 -================== - - * changed; fixed; directly setting nested objects now overwrites entire object (previously incorrectly merged them) - * added; read pref support (mongodb 2.2) 205a709c - * added; aggregate support (mongodb 2.2) f3a5bd3d - * added; virtual {g,s}etter introspection (#1070) - * updated; docs [brettz9](https://github.com/brettz9) - * updated; driver to 1.1.5 - * fixed; retain virtual setter return values (#1069) - -3.0.3 / 2012-08-23 -================== - - * fixed; use of nested paths beginning w/ numbers #1062 - * fixed; query population edge case #1053 #1055 [jfremy](https://github.com/jfremy) - * fixed; simultaneous top and sub level array modifications #1073 - * added; id and _id schema option aliases + tests - * improve debug formatting to allow copy/paste logged queries into mongo shell [eknkc](https://github.com/eknkc) - * docs - -3.0.2 / 2012-08-17 -================== - - * added; missing support for v3 sort/select syntax to findAndModify helpers (#1058) - * fixed; replset fullsetup event emission - * fixed; reconnected event for replsets - * fixed; server reconnection setting discovery - * fixed; compat with non-schema path props using positional notation (#1048) - * fixed; setter/casting order (#665) - * docs; updated - -3.0.1 / 2012-08-11 -================== - - * fixed; throw Error on bad validators (1044) - * fixed; typo in EmbeddedDocument#parentArray [lackac] - * fixed; repair mongoose.SchemaTypes alias - * updated; docs - -3.0.0 / 2012-08-07 -================== - - * removed; old subdocument#commit method - * fixed; setting arrays of matching docs [6924cbc2] - * fixed; doc!remove event now emits in save order as save for consistency - * fixed; pre-save hooks no longer fire on subdocuments when validation fails - * added; subdoc#parent() and subdoc#parentArray() to access subdocument parent objects - * added; query#lean() helper - -3.0.0rc0 / 2012-08-01 -===================== - - * fixed; allow subdoc literal declarations containing "type" pathname (#993) - * fixed; unsetting a default array (#758) - * fixed; boolean $in queries (#998) - * fixed; allow use of `options` as a pathname (#529) - * fixed; `model` is again a permitted schema path name - * fixed; field selection option on subdocs (#1022) - * fixed; handle another edge case with subdoc saving (#975) - * added; emit save err on model if listening - * added; MongoDB TTL collection support (#1006) - * added; $center options support - * added; $nearSphere and $polygon support - * updated; driver version to 1.1.2 - -3.0.0alpha2 / 2012-07-18 -========================= - - * changed; index errors are now emitted on their model and passed to an optional callback (#984) - * fixed; specifying index along with sparse/unique option no longer overwrites (#1004) - * fixed; never swallow connection errors (#618) - * fixed; creating object from model with emded object no longer overwrites defaults [achurkin] (#859) - * fixed; stop needless validation of unchanged/unselected fields (#891) - * fixed; document#equals behavior of objectids (#974) - * fixed; honor the minimize schema option (#978) - * fixed; provide helpful error msgs when reserved schema path is used (#928) - * fixed; callback to conn#disconnect is optional (#875) - * fixed; handle missing protocols in connection urls (#987) - * fixed; validate args to query#where (#969) - * fixed; saving modified/removed subdocs (#975) - * fixed; update with $pull from Mixed array (#735) - * fixed; error with null shard key value - * fixed; allow unsetting enums (#967) - * added; support for manual index creation (#984) - * added; support for disabled auto-indexing (#984) - * added; support for preserving MongooseArray#sort changes (#752) - * added; emit state change events on connection - * added; support for specifying BSON subtype in MongooseBuffer#toObject [jcrugzz] - * added; support for disabled versioning (#977) - * added; implicit "new" support for models and Schemas - -3.0.0alpha1 / 2012-06-15 -========================= - - * removed; doc#commit (use doc#markModified) - * removed; doc.modified getter (#950) - * removed; mongoose{connectSet,createSetConnection}. use connect,createConnection instead - * removed; query alias methods 1149804c - * removed; MongooseNumber - * changed; now creating indexes in background by default - * changed; strict mode now enabled by default (#952) - * changed; doc#modifiedPaths is now a method (#950) - * changed; getters no longer cast (#820); casting happens during set - * fixed; no need to pass updateArg to findOneAndUpdate (#931) - * fixed: utils.merge bug when merging nested non-objects. [treygriffith] - * fixed; strict:throw should produce errors in findAndModify (#963) - * fixed; findAndUpdate no longer overwrites document (#962) - * fixed; setting default DocumentArrays (#953) - * fixed; selection of _id with schema deselection (#954) - * fixed; ensure promise#error emits instanceof Error - * fixed; CursorStream: No stack overflow on any size result (#929) - * fixed; doc#remove now passes safe options - * fixed; invalid use of $set during $pop - * fixed; array#{$pop,$shift} mirror MongoDB behavior - * fixed; no longer test non-required vals in string match (#934) - * fixed; edge case with doc#inspect - * fixed; setter order (#665) - * fixed; setting invalid paths in strict mode (#916) - * fixed; handle docs without id in DocumentArray#id method (#897) - * fixed; do not save virtuals during model.update (#894) - * fixed; sub doc toObject virtuals application (#889) - * fixed; MongooseArray#pull of ObjectId (#881) - * fixed; handle passing db name with any repl set string - * fixed; default application of selected fields (#870) - * fixed; subdoc paths reported in validation errors (#725) - * fixed; incorrect reported num of affected docs in update ops (#862) - * fixed; connection assignment in Model#model (#853) - * fixed; stringifying arrays of docs (#852) - * fixed; modifying subdoc and parent array works (#842) - * fixed; passing undefined to next hook (#785) - * fixed; Query#{update,remove}() works without callbacks (#788) - * fixed; set/updating nested objects by parent pathname (#843) - * fixed; allow null in number arrays (#840) - * fixed; isNew on sub doc after insertion error (#837) - * fixed; if an insert fails, set isNew back to false [boutell] - * fixed; isSelected when only _id is selected (#730) - * fixed; setting an unset default value (#742) - * fixed; query#sort error messaging (#671) - * fixed; support for passing $options with $regex - * added; array of object literal notation in schema creates DocumentArrays - * added; gt,gte,lt,lte query support for arrays (#902) - * added; capped collection support (#938) - * added; document versioning support - * added; inclusion of deselected schema path (#786) - * added; non-atomic array#pop - * added; EmbeddedDocument constructor is now exposed in DocArray#create 7cf8beec - * added; mapReduce support (#678) - * added; support for a configurable minimize option #to{Object,JSON}(option) (#848) - * added; support for strict: `throws` [regality] - * added; support for named schema types (#795) - * added; to{Object,JSON} schema options (#805) - * added; findByIdAnd{Update,Remove}() - * added; findOneAnd{Update,Remove}() - * added; query.setOptions() - * added; instance.update() (#794) - * added; support specifying model in populate() [DanielBaulig] - * added; `lean` query option [gitfy] - * added; multi-atomic support to MongooseArray#nonAtomicPush - * added; support for $set + other $atomic ops on single array - * added; tests - * updated; driver to 1.0.2 - * updated; query.sort() syntax to mirror query.select() - * updated; clearer cast error msg for array numbers - * updated; docs - * updated; doc.clone 3x faster (#950) - * updated; only create _id if necessary (#950) - -2.7.3 / 2012-08-01 -================== - - * fixed; boolean $in queries (#998) - * fixed field selection option on subdocs (#1022) - -2.7.2 / 2012-07-18 -================== - - * fixed; callback to conn#disconnect is optional (#875) - * fixed; handle missing protocols in connection urls (#987) - * fixed; saving modified/removed subdocs (#975) - * updated; tests - -2.7.1 / 2012-06-26 -=================== - - * fixed; sharding: when a document holds a null as a value of the shard key - * fixed; update() using $pull on an array of Mixed (gh-735) - * deprecated; MongooseNumber#{inc, increment, decrement} methods - * tests; now using mocha - -2.7.0 / 2012-06-14 -=================== - - * added; deprecation warnings to methods being removed in 3.x - -2.6.8 / 2012-06-14 -=================== - - * fixed; edge case when using 'options' as a path name (#961) - -2.6.7 / 2012-06-08 -=================== - - * fixed; ensure promise#error always emits instanceof Error - * fixed; selection of _id w/ another excluded path (#954) - * fixed; setting default DocumentArrays (#953) - -2.6.6 / 2012-06-06 -=================== - - * fixed; stack overflow in query stream with large result sets (#929) - * added; $gt, $gte, $lt, $lte support to arrays (#902) - * fixed; pass option `safe` along to doc#remove() calls - -2.6.5 / 2012-05-24 -=================== - - * fixed; do not save virtuals in Model.update (#894) - * added; missing $ prefixed query aliases (going away in 3.x) (#884) [timoxley] - * fixed; setting invalid paths in strict mode (#916) - * fixed; resetting isNew after insert failure (#837) [boutell] - -2.6.4 / 2012-05-15 -=================== - - * updated; backport string regex $options to 2.x - * updated; use driver 1.0.2 (performance improvements) (#914) - * fixed; calling MongooseDocumentArray#id when the doc has no _id (#897) - -2.6.3 / 2012-05-03 -=================== - - * fixed; repl-set connectivity issues during failover on MongoDB 2.0.1 - * updated; driver to 1.0.0 - * fixed; virtuals application of subdocs when using toObject({ virtuals: true }) (#889) - * fixed; MongooseArray#pull of ObjectId correctly updates the array itself (#881) - -2.6.2 / 2012-04-30 -=================== - - * fixed; default field application of selected fields (#870) - -2.6.1 / 2012-04-30 -=================== - - * fixed; connection assignment in mongoose#model (#853, #877) - * fixed; incorrect reported num of affected docs in update ops (#862) - -2.6.0 / 2012-04-19 -=================== - - * updated; hooks.js to 0.2.1 - * fixed; issue with passing undefined to a hook callback. thanks to [chrisleishman] for reporting. - * fixed; updating/setting nested objects in strict schemas (#843) as reported by [kof] - * fixed; Query#{update,remove}() work without callbacks again (#788) - * fixed; modifying subdoc along with parent array $atomic op (#842) - -2.5.14 / 2012-04-13 -=================== - - * fixed; setting an unset default value (#742) - * fixed; doc.isSelected(otherpath) when only _id is selected (#730) - * updated; docs - -2.5.13 / 2012-03-22 -=================== - - * fixed; failing validation of unselected required paths (#730,#713) - * fixed; emitting connection error when only one listener (#759) - * fixed; MongooseArray#splice was not returning values (#784) [chrisleishman] - -2.5.12 / 2012-03-21 -=================== - - * fixed; honor the `safe` option in all ensureIndex calls - * updated; node-mongodb-native driver to 0.9.9-7 - -2.5.11 / 2012-03-15 -=================== - - * added; introspection for getters/setters (#745) - * updated; node-mongodb-driver to 0.9.9-5 - * added; tailable method to Query (#769) [holic] - * fixed; Number min/max validation of null (#764) [btamas] - * added; more flexible user/password connection options (#738) [KarneAsada] - -2.5.10 / 2012-03-06 -=================== - - * updated; node-mongodb-native driver to 0.9.9-4 - * added; Query#comment() - * fixed; allow unsetting arrays - * fixed; hooking the set method of subdocuments (#746) - * fixed; edge case in hooks - * fixed; allow $id and $ref in queries (fixes compatibility with mongoose-dbref) (#749) [richtera] - * added; default path selection to SchemaTypes - -2.5.9 / 2012-02-22 -=================== - - * fixed; properly cast nested atomic update operators for sub-documents - -2.5.8 / 2012-02-21 -=================== - - * added; post 'remove' middleware includes model that was removed (#729) [timoxley] - -2.5.7 / 2012-02-09 -=================== - - * fixed; RegExp validators on node >= v0.6.x - -2.5.6 / 2012-02-09 -=================== - - * fixed; emit errors returned from db.collection() on the connection (were being swallowed) - * added; can add multiple validators in your schema at once (#718) [diogogmt] - * fixed; strict embedded documents (#717) - * updated; docs [niemyjski] - * added; pass number of affected docs back in model.update/save - -2.5.5 / 2012-02-03 -=================== - - * fixed; RangeError: maximum call stack exceed error when removing docs with Number _id (#714) - -2.5.4 / 2012-02-03 -=================== - - * fixed; RangeError: maximum call stack exceed error (#714) - -2.5.3 / 2012-02-02 -=================== - - * added; doc#isSelected(path) - * added; query#equals() - * added; beta sharding support - * added; more descript error msgs (#700) [obeleh] - * added; document.modifiedPaths (#709) [ljharb] - * fixed; only functions can be added as getters/setters (#707,704) [ljharb] - -2.5.2 / 2012-01-30 -=================== - - * fixed; rollback -native driver to 0.9.7-3-5 (was causing timeouts and other replica set weirdness) - * deprecated; MongooseNumber (will be moved to a separate repo for 3.x) - * added; init event is emitted on schemas - -2.5.1 / 2012-01-27 -=================== - - * fixed; honor strict schemas in Model.update (#699) - -2.5.0 / 2012-01-26 -=================== - - * added; doc.toJSON calls toJSON on embedded docs when exists [jerem] - * added; populate support for refs of type Buffer (#686) [jerem] - * added; $all support for ObjectIds and Dates (#690) - * fixed; virtual setter calling on instantiation when strict: true (#682) [hunterloftis] - * fixed; doc construction triggering getters (#685) - * fixed; MongooseBuffer check in deepEquals (#688) - * fixed; range error when using Number _ids with `instance.save()` (#691) - * fixed; isNew on embedded docs edge case (#680) - * updated; driver to 0.9.8-3 - * updated; expose `model()` method within static methods - -2.4.10 / 2012-01-10 -=================== - - * added; optional getter application in .toObject()/.toJSON() (#412) - * fixed; nested $operators in $all queries (#670) - * added; $nor support (#674) - * fixed; bug when adding nested schema (#662) [paulwe] - -2.4.9 / 2012-01-04 -=================== - - * updated; driver to 0.9.7-3-5 to fix Linux performance degradation on some boxes - -2.4.8 / 2011-12-22 -=================== - - * updated; bump -native to 0.9.7.2-5 - * fixed; compatibility with date.js (#646) [chrisleishman] - * changed; undocumented schema "lax" option to "strict" - * fixed; default value population for strict schemas - * updated; the nextTick helper for small performance gain. 1bee2a2 - -2.4.7 / 2011-12-16 -=================== - - * fixed; bug in 2.4.6 with path setting - * updated; bump -native to 0.9.7.2-1 - * added; strict schema option [nw] - -2.4.6 / 2011-12-16 -=================== - - * fixed; conflicting mods on update bug [sirlantis] - * improved; doc.id getter performance - -2.4.5 / 2011-12-14 -=================== - - * fixed; bad MongooseArray behavior in 2.4.2 - 2.4.4 - -2.4.4 / 2011-12-14 -=================== - - * fixed; MongooseArray#doAtomics throwing after sliced - -2.4.3 / 2011-12-14 -=================== - - * updated; system.profile schema for MongoDB 2x - -2.4.2 / 2011-12-12 -=================== - - * fixed; partially populating multiple children of subdocs (#639) [kenpratt] - * fixed; allow Update of numbers to null (#640) [jerem] - -2.4.1 / 2011-12-02 -=================== - - * added; options support for populate() queries - * updated; -native driver to 0.9.7-1.4 - -2.4.0 / 2011-11-29 -=================== - - * added; QueryStreams (#614) - * added; debug print mode for development - * added; $within support to Array queries (#586) [ggoodale] - * added; $centerSphere query support - * fixed; $within support - * added; $unset is now used when setting a path to undefined (#519) - * added; query#batchSize support - * updated; docs - * updated; -native driver to 0.9.7-1.3 (provides Windows support) - -2.3.13 / 2011-11-15 -=================== - - * fixed; required validation for Refs (#612) [ded] - * added; $nearSphere support for Arrays (#610) - -2.3.12 / 2011-11-09 -=================== - - * fixed; regression, objects passed to Model.update should not be changed (#605) - * fixed; regression, empty Model.update should not be executed - -2.3.11 / 2011-11-08 -=================== - - * fixed; using $elemMatch on arrays of Mixed types (#591) - * fixed; allow using $regex when querying Arrays (#599) - * fixed; calling Model.update with no atomic keys (#602) - -2.3.10 / 2011-11-05 -=================== - - * fixed; model.update casting for nested paths works (#542) - -2.3.9 / 2011-11-04 -================== - - * fixed; deepEquals check for MongooseArray returned false - * fixed; reset modified flags of embedded docs after save [gitfy] - * fixed; setting embedded doc with identical values no longer marks modified [gitfy] - * updated; -native driver to 0.9.6.23 [mlazarov] - * fixed; Model.update casting (#542, #545, #479) - * fixed; populated refs no longer fail required validators (#577) - * fixed; populating refs of objects with custom ids works - * fixed; $pop & $unset work with Model.update (#574) - * added; more helpful debugging message for Schema#add (#578) - * fixed; accessing .id when no _id exists now returns null (#590) - -2.3.8 / 2011-10-26 -================== - - * added; callback to query#findOne is now optional (#581) - -2.3.7 / 2011-10-24 -================== - - * fixed; wrapped save/remove callbacks in nextTick to mitigate -native swallowing thrown errors - -2.3.6 / 2011-10-21 -================== - - * fixed; exclusion of embedded doc _id from query results (#541) - -2.3.5 / 2011-10-19 -================== - - * fixed; calling queries without passing a callback works (#569) - * fixed; populate() works with String and Number _ids too (#568) - -2.3.4 / 2011-10-18 -================== - - * added; Model.create now accepts an array as a first arg - * fixed; calling toObject on a DocumentArray with nulls no longer throws - * fixed; calling inspect on a DocumentArray with nulls no longer throws - * added; MongooseArray#unshift support - * fixed; save hooks now fire on embedded documents [gitfy] (#456) - * updated; -native driver to 0.9.6-22 - * fixed; correctly pass $addToSet op instead of $push - * fixed; $addToSet properly detects dates - * fixed; $addToSet with multiple items works - * updated; better node 0.6 Buffer support - -2.3.3 / 2011-10-12 -================== - - * fixed; population conditions in multi-query settings [vedmalex] (#563) - * fixed; now compatible with Node v0.5.x - -2.3.2 / 2011-10-11 -================== - - * fixed; population of null subdoc properties no longer hangs (#561) - -2.3.1 / 2011-10-10 -================== - - * added; support for Query filters to populate() [eneko] - * fixed; querying with number no longer crashes mongodb (#555) [jlbyrey] - * updated; version of -native driver to 0.9.6-21 - * fixed; prevent query callbacks that throw errors from corrupting -native connection state - -2.3.0 / 2011-10-04 -================== - - * fixed; nulls as default values for Boolean now works as expected - * updated; version of -native driver to 0.9.6-20 - -2.2.4 / 2011-10-03 -================== - - * fixed; populate() works when returned array contains undefined/nulls - -2.2.3 / 2011-09-29 -================== - - * updated; version of -native driver to 0.9.6-19 - -2.2.2 / 2011-09-28 -================== - - * added; $regex support to String [davidandrewcope] - * added; support for other contexts like repl etc (#535) - * fixed; clear modified state properly after saving - * added; $addToSet support to Array - -2.2.1 / 2011-09-22 -================== - - * more descript error when casting undefined to string - * updated; version of -native driver to 0.9.6-18 - -2.2.0 / 2011-09-22 -================== - - * fixed; maxListeners warning on schemas with many arrays (#530) - * changed; return / apply defaults based on fields selected in query (#423) - * fixed; correctly detect Mixed types within schema arrays (#532) - -2.1.4 / 2011-09-20 -================== - - * fixed; new private methods that stomped on users code - * changed; finished removing old "compat" support which did nothing - -2.1.3 / 2011-09-16 -================== - - * updated; version of -native driver to 0.9.6-15 - * added; emit `error` on connection when open fails [edwardhotchkiss] - * added; index support to Buffers (thanks justmoon for helping track this down) - * fixed; passing collection name via schema in conn.model() now works (thanks vedmalex for reporting) - -2.1.2 / 2011-09-07 -================== - - * fixed; Query#find with no args no longer throws - -2.1.1 / 2011-09-07 -================== - - * added; support Model.count(fn) - * fixed; compatibility with node >=0.4.0 < 0.4.3 - * added; pass model.options.safe through with .save() so w:2, wtimeout:5000 options work [andrewjstone] - * added; support for $type queries - * added; support for Query#or - * added; more tests - * optimized populate queries - -2.1.0 / 2011-09-01 -================== - - * changed; document#validate is a public method - * fixed; setting number to same value no longer marks modified (#476) [gitfy] - * fixed; Buffers shouldn't have default vals - * added; allow specifying collection name in schema (#470) [ixti] - * fixed; reset modified paths and atomics after saved (#459) - * fixed; set isNew on embedded docs to false after save - * fixed; use self to ensure proper scope of options in doOpenSet (#483) [andrewjstone] - -2.0.4 / 2011-08-29 -================== - - * Fixed; Only send the depopulated ObjectId instead of the entire doc on save (DBRefs) - * Fixed; Properly cast nested array values in Model.update (the data was stored in Mongo incorrectly but recast on document fetch was "fixing" it) - -2.0.3 / 2011-08-28 -================== - - * Fixed; manipulating a populated array no longer causes infinite loop in BSON serializer during save (#477) - * Fixed; populating an empty array no longer hangs foreeeeeeeever (#481) - -2.0.2 / 2011-08-25 -================== - - * Fixed; Maintain query option key order (fixes 'bad hint' error from compound query hints) - -2.0.1 / 2011-08-25 -================== - - * Fixed; do not over-write the doc when no valide props exist in Model.update (#473) - -2.0.0 / 2011-08-24 -=================== - - * Added; support for Buffers [justmoon] - * Changed; improved error handling [maelstrom] - * Removed: unused utils.erase - * Fixed; support for passing other context object into Schemas (#234) [Sija] - * Fixed; getters are no longer circular refs to themselves (#366) - * Removed; unused compat.js - * Fixed; getter/setter scopes are set properly - * Changed; made several private properties more obvious by prefixing _ - * Added; DBRef support [guille] - * Changed; removed support for multiple collection names per model - * Fixed; no longer applying setters when document returned from db - * Changed; default auto_reconnect to true - * Changed; Query#bind no longer clones the query - * Fixed; Model.update now accepts $pull, $inc and friends (#404) - * Added; virtual type option support [nw] - -1.8.4 / 2011-08-21 -=================== - - * Fixed; validation bug when instantiated with non-schema properties (#464) [jmreidy] - -1.8.3 / 2011-08-19 -=================== - - * Fixed; regression in connection#open [jshaw86] - -1.8.2 / 2011-08-17 -=================== - - * fixed; reset connection.readyState after failure [tomseago] - * fixed; can now query positionally for non-embedded docs (arrays of numbers/strings etc) - * fixed; embedded document query casting - * added; support for passing options to node-mongo-native db, server, and replsetserver [tomseago] - -1.8.1 / 2011-08-10 -=================== - - * fixed; ObjectIds were always marked modified - * fixed; can now query using document instances - * fixed; can now query/update using documents with subdocs - -1.8.0 / 2011-08-04 -=================== - - * fixed; can now use $all with String and Number - * fixed; can query subdoc array with $ne: null - * fixed; instance.subdocs#id now works with custom _ids - * fixed; do not apply setters when doc returned from db (change in bad behavior) - -1.7.4 / 2011-07-25 -=================== - - * fixed; sparse now a valid seperate schema option - * fixed; now catching cast errors in queries - * fixed; calling new Schema with object created in vm.runInNewContext now works (#384) [Sija] - * fixed; String enum was disallowing null - * fixed; Find by nested document _id now works (#389) - -1.7.3 / 2011-07-16 -=================== - - * fixed; MongooseArray#indexOf now works with ObjectIds - * fixed; validation scope now set properly (#418) - * fixed; added missing colors dependency (#398) - -1.7.2 / 2011-07-13 -=================== - - * changed; node-mongodb-native driver to v0.9.6.7 - -1.7.1 / 2011-07-12 -=================== - - * changed; roll back node-mongodb-native driver to v0.9.6.4 - -1.7.0 / 2011-07-12 -=================== - - * fixed; collection name misspelling [mathrawka] - * fixed; 2nd param is required for ReplSetServers [kevinmarvin] - * fixed; MongooseArray behaves properly with Object.keys - * changed; node-mongodb-native driver to v0.9.6.6 - * fixed/changed; Mongodb segfault when passed invalid ObjectId (#407) - - This means invalid data passed to the ObjectId constructor will now error - -1.6.0 / 2011-07-07 -=================== - - * changed; .save() errors are now emitted on the instances db instead of the instance 9782463fc - * fixed; errors occurring when creating indexes now properly emit on db - * added; $maxDistance support to MongooseArrays - * fixed; RegExps now work with $all - * changed; node-mongodb-native driver to v0.9.6.4 - * fixed; model names are now accessible via .modelName - * added; Query#slaveOk support - -1.5.0 / 2011-06-27 -=================== - - * changed; saving without a callback no longer ignores the error (@bnoguchi) - * changed; hook-js version bump to 0.1.9 - * changed; node-mongodb-native version bumped to 0.9.6.1 - When .remove() doesn't - return an error, null is no longer passed. - * fixed; two memory leaks (@justmoon) - * added; sparse index support - * added; more ObjectId conditionals (gt, lt, gte, lte) (@phillyqueso) - * added; options are now passed in model#remote (@JerryLuke) - -1.4.0 / 2011-06-10 -=================== - - * bumped hooks-js dependency (fixes issue passing null as first arg to next()) - * fixed; document#inspect now works properly with nested docs - * fixed; 'set' now works as a schema attribute (GH-365) - * fixed; _id is now set properly within pre-init hooks (GH-289) - * added; Query#distinct / Model#distinct support (GH-155) - * fixed; embedded docs now can use instance methods (GH-249) - * fixed; can now overwrite strings conflicting with schema type - -1.3.7 / 2011-06-03 -=================== - - * added MongooseArray#splice support - * fixed; 'path' is now a valid Schema pathname - * improved hooks (utilizing https://github.com/bnoguchi/hooks-js) - * fixed; MongooseArray#$shift now works (never did) - * fixed; Document.modified no longer throws - * fixed; modifying subdoc property sets modified paths for subdoc and parent doc - * fixed; marking subdoc path as modified properly persists the value to the db - * fixed; RexExps can again be saved ( #357 ) - -1.3.6 / 2011-05-18 -=================== - - * fixed; corrected casting for queries against array types - * added; Document#set now accepts Document instances - -1.3.5 / 2011-05-17 -=================== - - * fixed; $ne queries work properly with single vals - * added; #inspect() methods to improve console.log output - -1.3.4 / 2011-05-17 -=================== - - * fixed; find by Date works as expected (#336) - * added; geospatial 2d index support - * added; support for $near (#309) - * updated; node-mongodb-native driver - * fixed; updating numbers work (#342) - * added; better error msg when try to remove an embedded doc without an _id (#307) - * added; support for 'on-the-fly' schemas (#227) - * changed; virtual id getters can now be skipped - * fixed; .index() called on subdoc schema now works as expected - * fixed; db.setProfile() now buffers until the db is open (#340) - -1.3.3 / 2011-04-27 -=================== - - * fixed; corrected query casting on nested mixed types - -1.3.2 / 2011-04-27 -=================== - - * fixed; query hints now retain key order - -1.3.1 / 2011-04-27 -=================== - - * fixed; setting a property on an embedded array no longer overwrites entire array (GH-310) - * fixed; setting nested properties works when sibling prop is named "type" - * fixed; isModified is now much finer grained when .set() is used (GH-323) - * fixed; mongoose.model() and connection.model() now return the Model (GH-308, GH-305) - * fixed; can now use $gt, $lt, $gte, $lte with String schema types (GH-317) - * fixed; .lowercase() -> .toLowerCase() in pluralize() - * fixed; updating an embedded document by index works (GH-334) - * changed; .save() now passes the instance to the callback (GH-294, GH-264) - * added; can now query system.profile and system.indexes collections - * added; db.model('system.profile') is now included as a default Schema - * added; db.setProfiling(level, ms, callback) - * added; Query#hint() support - * added; more tests - * updated node-mongodb-native to 0.9.3 - -1.3.0 / 2011-04-19 -=================== - - * changed; save() callbacks now fire only once on failed validation - * changed; Errors returned from save() callbacks now instances of ValidationError - * fixed; MongooseArray#indexOf now works properly - -1.2.0 / 2011-04-11 -=================== - - * changed; MongooseNumber now casts empty string to null - -1.1.25 / 2011-04-08 -=================== - - * fixed; post init now fires at proper time - -1.1.24 / 2011-04-03 -=================== - - * fixed; pushing an array onto an Array works on existing docs - -1.1.23 / 2011-04-01 -=================== - - * Added Model#model - -1.1.22 / 2011-03-31 -=================== - - * Fixed; $in queries on mixed types now work - -1.1.21 / 2011-03-31 -=================== - - * Fixed; setting object root to null/undefined works - -1.1.20 / 2011-03-31 -=================== - - * Fixed; setting multiple props on null field works - -1.1.19 / 2011-03-31 -=================== - - * Fixed; no longer using $set on paths to an unexisting fields - -1.1.18 / 2011-03-30 -=================== - - * Fixed; non-mixed type object setters work after initd from null - -1.1.17 / 2011-03-30 -=================== - - * Fixed; nested object property access works when root initd with null value - -1.1.16 / 2011-03-28 -=================== - - * Fixed; empty arrays are now saved - -1.1.15 / 2011-03-28 -=================== - - * Fixed; `null` and `undefined` are set atomically. - -1.1.14 / 2011-03-28 -=================== - - * Changed; more forgiving date casting, accepting '' as null. - -1.1.13 / 2011-03-26 -=================== - - * Fixed setting values as `undefined`. - -1.1.12 / 2011-03-26 -=================== - - * Fixed; nested objects now convert to JSON properly - * Fixed; setting nested objects directly now works - * Update node-mongodb-native - -1.1.11 / 2011-03-25 -=================== - - * Fixed for use of `type` as a key. - -1.1.10 / 2011-03-23 -=================== - - * Changed; Make sure to only ensure indexes while connected - -1.1.9 / 2011-03-2 -================== - - * Fixed; Mixed can now default to empty arrays - * Fixed; keys by the name 'type' are now valid - * Fixed; null values retrieved from the database are hydrated as null values. - * Fixed repeated atomic operations when saving a same document twice. - -1.1.8 / 2011-03-23 -================== - - * Fixed 'id' overriding. [bnoguchi] - -1.1.7 / 2011-03-22 -================== - - * Fixed RegExp query casting when querying against an Array of Strings [bnoguchi] - * Fixed getters/setters for nested virtualsl. [bnoguchi] - -1.1.6 / 2011-03-22 -================== - - * Only doValidate when path exists in Schema [aheckmann] - * Allow function defaults for Array types [aheckmann] - * Fix validation hang [aheckmann] - * Fix setting of isRequired of SchemaType [aheckmann] - * Fix SchemaType#required(false) filter [aheckmann] - * More backwards compatibility [aheckmann] - * More tests [aheckmann] - -1.1.5 / 2011-03-14 -================== - - * Added support for `uri, db, fn` and `uri, fn` signatures for replica sets. - * Improved/extended replica set tests. - -1.1.4 / 2011-03-09 -================== - - * Fixed; running an empty Query doesn't throw. [aheckmann] - * Changed; Promise#addBack returns promise. [aheckmann] - * Added streaming cursor support. [aheckmann] - * Changed; Query#update defaults to use$SetOnSave now. [brian] - * Added more docs. - -1.1.3 / 2011-03-04 -================== - - * Added Promise#resolve [aheckmann] - * Fixed backward compatibility with nulls [aheckmann] - * Changed; Query#{run,exec} return promises [aheckmann] - -1.1.2 / 2011-03-03 -================== - - * Restored Query#exec and added notion of default operation [brian] - * Fixed ValidatorError messages [brian] - -1.1.1 / 2011-03-01 -================== - - * Added SchemaType String `lowercase`, `uppercase`, `trim`. - * Public exports (`Model`, `Document`) and tests. - * Added ObjectId casting support for `Document`s. - -1.1.0 / 2011-02-25 -================== - - * Added support for replica sets. - -1.0.16 / 2011-02-18 -=================== - - * Added $nin as another whitelisted $conditional for SchemaArray [brian] - * Changed #with to #where [brian] - * Added ability to use $in conditional with Array types [brian] - -1.0.15 / 2011-02-18 -=================== - - * Added `id` virtual getter for documents to easily access the hexString of - the `_id`. - -1.0.14 / 2011-02-17 -=================== - - * Fix for arrays within subdocuments [brian] - -1.0.13 / 2011-02-16 -=================== - - * Fixed embedded documents saving. - -1.0.12 / 2011-02-14 -=================== - - * Minor refactorings [brian] - -1.0.11 / 2011-02-14 -=================== - - * Query refactor and $ne, $slice, $or, $size, $elemMatch, $nin, $exists support [brian] - * Named scopes sugar [brian] - -1.0.10 / 2011-02-11 -=================== - - * Updated node-mongodb-native driver [thanks John Allen] - -1.0.9 / 2011-02-09 -================== - - * Fixed single member arrays as defaults [brian] - -1.0.8 / 2011-02-09 -================== - - * Fixed for collection-level buffering of commands [gitfy] - * Fixed `Document#toJSON` [dalejefferson] - * Fixed `Connection` authentication [robrighter] - * Fixed clash of accessors in getters/setters [eirikurn] - * Improved `Model#save` promise handling - -1.0.7 / 2011-02-05 -================== - - * Fixed memory leak warnings for test suite on 0.3 - * Fixed querying documents that have an array that contain at least one - specified member. [brian] - * Fixed default value for Array types (fixes GH-210). [brian] - * Fixed example code. - -1.0.6 / 2011-02-03 -================== - - * Fixed `post` middleware - * Fixed; it's now possible to instantiate a model even when one of the paths maps - to an undefined value [brian] - -1.0.5 / 2011-02-02 -================== - - * Fixed; combo $push and $pushAll auto-converts into a $pushAll [brian] - * Fixed; combo $pull and $pullAll auto-converts to a single $pullAll [brian] - * Fixed; $pullAll now removes said members from array before save (so it acts just - like pushAll) [brian] - * Fixed; multiple $pulls and $pushes become a single $pullAll and $pushAll. - Moreover, $pull now modifies the array before save to reflect the immediate - change [brian] - * Added tests for nested shortcut getters [brian] - * Added tests that show that Schemas with nested Arrays don't apply defaults - [brian] - -1.0.4 / 2011-02-02 -================== - - * Added MongooseNumber#toString - * Added MongooseNumber unit tests - -1.0.3 / 2011-02-02 -================== - - * Make sure safe mode works with Model#save - * Changed Schema options: safe mode is now the default - * Updated node-mongodb-native to HEAD - -1.0.2 / 2011-02-02 -================== - - * Added a Model.create shortcut for creating documents. [brian] - * Fixed; we can now instantiate models with hashes that map to at least one - null value. [brian] - * Fixed Schema with more than 2 nested levels. [brian] - -1.0.1 / 2011-02-02 -================== - - * Improved `MongooseNumber`, works almost like the native except for `typeof` - not being `'number'`. diff --git a/node_modules/mongoose/README.md b/node_modules/mongoose/README.md deleted file mode 100644 index 747b75a..0000000 --- a/node_modules/mongoose/README.md +++ /dev/null @@ -1,269 +0,0 @@ -## What's Mongoose? - -Mongoose is a [MongoDB](http://www.mongodb.org/) object modeling tool designed to work in an asynchronous environment. - -## Documentation - -[mongoosejs.com](http://mongoosejs.com/) - -## Try it live - - -## Support - - - [Stack Overflow](http://stackoverflow.com/questions/tagged/mongoose) - - [bug reports](https://github.com/learnboost/mongoose/issues/) - - [help forum](http://groups.google.com/group/mongoose-orm) - - [10gen support](http://www.mongodb.org/display/DOCS/Technical+Support) - - (irc) #mongoosejs on freenode - -## Installation - -First install [node.js](http://nodejs.org/) and [mongodb](http://www.mongodb.org/downloads). - - $ npm install mongoose - -## Plugins - -Check out the [plugins search site](http://plugins.mongoosejs.com/) to see hundreds of related modules from the community. - -## Contributors - -View all 80+ [contributors](https://github.com/learnboost/mongoose/graphs/contributors). - -## Get Involved - -Stand up and be counted as a [contributor](https://github.com/LearnBoost/mongoose/blob/master/CONTRIBUTING.md) to mongoose too! - -## Overview - -### Connecting to MongoDB - -First, we need to define a connection. If your app uses only one database, you should use `mongose.connect`. If you need to create additional connections, use `mongoose.createConnection`. - -Both `connect` and `createConnection` take a `mongodb://` URI, or the parameters `host, database, port, options`. - - var mongoose = require('mongoose'); - - mongoose.connect('mongodb://localhost/my_database'); - -Once connected, the `open` event is fired on the `Connection` instance. If you're using `mongoose.connect`, the `Connection` is `mongoose.connection`. Otherwise, `mongoose.createConnection` return value is a `Connection`. - -**Important!** Mongoose buffers all the commands until it's connected to the database. This means that you don't have to wait until it connects to MongoDB in order to define models, run queries, etc. - -### Defining a Model - -Models are defined through the `Schema` interface. - - var Schema = mongoose.Schema - , ObjectId = Schema.ObjectId; - - var BlogPost = new Schema({ - author : ObjectId - , title : String - , body : String - , date : Date - }); - -Aside from defining the structure of your documents and the types of data you're storing, a Schema handles the definition of: - -* [Validators](http://mongoosejs.com/docs/validation.html) (async and sync) -* [Defaults](http://mongoosejs.com/docs/api.html#schematype_SchemaType-default) -* [Getters](http://mongoosejs.com/docs/api.html#schematype_SchemaType-get) -* [Setters](http://mongoosejs.com/docs/api.html#schematype_SchemaType-set) -* [Indexes](http://mongoosejs.com/docs/guide.html#indexes) -* [Middleware](http://mongoosejs.com/docs/middleware.html) -* [Methods](http://mongoosejs.com/docs/guide.html#methods) definition -* [Statics](http://mongoosejs.com/docs/guide.html#statics) definition -* [Plugins](http://mongoosejs.com/docs/plugins.html) -* [pseudo-JOINs](http://mongoosejs.com/docs/populate.html) - -The following example shows some of these features: - - var Comment = new Schema({ - name : { type: String, default: 'hahaha' } - , age : { type: Number, min: 18, index: true } - , bio : { type: String, match: /[a-z]/ } - , date : { type: Date, default: Date.now } - , buff : Buffer - }); - - // a setter - Comment.path('name').set(function (v) { - return capitalize(v); - }); - - // middleware - Comment.pre('save', function (next) { - notify(this.get('email')); - next(); - }); - -Take a look at the example in `examples/schema.js` for an end-to-end example of a typical setup. - -### Accessing a Model - -Once we define a model through `mongoose.model('ModelName', mySchema)`, we can access it through the same function - - var myModel = mongoose.model('ModelName'); - -Or just do it all at once - - var MyModel = mongoose.model('ModelName', mySchema); - -We can then instantiate it, and save it: - - var instance = new MyModel(); - instance.my.key = 'hello'; - instance.save(function (err) { - // - }); - -Or we can find documents from the same collection - - MyModel.find({}, function (err, docs) { - // docs.forEach - }); - -You can also `findOne`, `findById`, `update`, etc. For more details check out [the docs](http://mongoosejs.com/docs/queries.html). - -**Important!** If you opened a separate connection using `mongoose.createConnection()` but attempt to access the model through `mongoose.model('ModelName')` it will not work as expected since it is not hooked up to an active db connection. In this case access your model through the connection you created: - - var conn = mongoose.createConnection('your connection string'); - var MyModel = conn.model('ModelName', schema); - var m = new MyModel; - m.save() // works - - vs - - var conn = mongoose.createConnection('your connection string'); - var MyModel = mongoose.model('ModelName', schema); - var m = new MyModel; - m.save() // does not work b/c the default connection object was never connected - -### Embedded Documents - -In the first example snippet, we defined a key in the Schema that looks like: - - comments: [Comments] - -Where `Comments` is a `Schema` we created. This means that creating embedded documents is as simple as: - - // retrieve my model - var BlogPost = mongoose.model('BlogPost'); - - // create a blog post - var post = new BlogPost(); - - // create a comment - post.comments.push({ title: 'My comment' }); - - post.save(function (err) { - if (!err) console.log('Success!'); - }); - -The same goes for removing them: - - BlogPost.findById(myId, function (err, post) { - if (!err) { - post.comments[0].remove(); - post.save(function (err) { - // do something - }); - } - }); - -Embedded documents enjoy all the same features as your models. Defaults, validators, middleware. Whenever an error occurs, it's bubbled to the `save()` error callback, so error handling is a snap! - -Mongoose interacts with your embedded documents in arrays _atomically_, out of the box. - -### Middleware - -See the [docs](http://mongoosejs.com/docs/middleware.html) page. - -#### Intercepting and mutating method arguments - -You can intercept method arguments via middleware. - -For example, this would allow you to broadcast changes about your Documents every time someone `set`s a path in your Document to a new value: - - schema.pre('set', function (next, path, val, typel) { - // `this` is the current Document - this.emit('set', path, val); - - // Pass control to the next pre - next(); - }); - -Moreover, you can mutate the incoming `method` arguments so that subsequent middleware see different values for those arguments. To do so, just pass the new values to `next`: - - .pre(method, function firstPre (next, methodArg1, methodArg2) { - // Mutate methodArg1 - next("altered-" + methodArg1.toString(), methodArg2); - }) - - // pre declaration is chainable - .pre(method, function secondPre (next, methodArg1, methodArg2) { - console.log(methodArg1); - // => 'altered-originalValOfMethodArg1' - - console.log(methodArg2); - // => 'originalValOfMethodArg2' - - // Passing no arguments to `next` automatically passes along the current argument values - // i.e., the following `next()` is equivalent to `next(methodArg1, methodArg2)` - // and also equivalent to, with the example method arg - // values, `next('altered-originalValOfMethodArg1', 'originalValOfMethodArg2')` - next(); - }) - -#### Schema gotcha - -`type`, when used in a schema has special meaning within Mongoose. If your schema requires using `type` as a nested property you must use object notation: - - new Schema({ - broken: { type: Boolean } - , asset : { - name: String - , type: String // uh oh, it broke. asset will be interpreted as String - } - }); - - new Schema({ - works: { type: Boolean } - , asset : { - name: String - , type: { type: String } // works. asset is an object with a type property - } - }); - -### Driver access - -The driver being used defaults to [node-mongodb-native](https://github.com/mongodb/node-mongodb-native) and is directly accessible through `YourModel.collection`. **Note**: using the driver directly bypasses all Mongoose power-tools like validation, getters, setters, hooks, etc. - -## API Docs - -Find the API docs [here](http://mongoosejs.com/docs/api.html), generated by [dox](http://github.com/visionmedia/dox). - -## License - -Copyright (c) 2010 LearnBoost <dev@learnboost.com> - -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. diff --git a/node_modules/mongoose/examples/schema.js b/node_modules/mongoose/examples/schema.js deleted file mode 100644 index d108d05..0000000 --- a/node_modules/mongoose/examples/schema.js +++ /dev/null @@ -1,102 +0,0 @@ - -/** - * Module dependencies. - */ - -var mongoose = require('mongoose') - , Schema = mongoose.Schema; - -/** - * Schema definition - */ - -// recursive embedded-document schema - -var Comment = new Schema(); - -Comment.add({ - title : { type: String, index: true } - , date : Date - , body : String - , comments : [Comment] -}); - -var BlogPost = new Schema({ - title : { type: String, index: true } - , slug : { type: String, lowercase: true, trim: true } - , date : Date - , buf : Buffer - , comments : [Comment] - , creator : Schema.ObjectId -}); - -var Person = new Schema({ - name: { - first: String - , last : String - } - , email: { type: String, required: true, index: { unique: true, sparse: true } } - , alive: Boolean -}); - -/** - * Accessing a specific schema type by key - */ - -BlogPost.path('date') -.default(function(){ - return new Date() - }) -.set(function(v){ - return v == 'now' ? new Date() : v; - }); - -/** - * Pre hook. - */ - -BlogPost.pre('save', function(next, done){ - emailAuthor(done); // some async function - next(); -}); - -/** - * Methods - */ - -BlogPost.methods.findCreator = function (callback) { - return this.db.model('Person').findById(this.creator, callback); -} - -BlogPost.statics.findByTitle = function (title, callback) { - return this.find({ title: title }, callback); -} - -BlogPost.methods.expressiveQuery = function (creator, date, callback) { - return this.find('creator', creator).where('date').gte(date).run(callback); -} - -/** - * Plugins - */ - -function slugGenerator (options){ - options = options || {}; - var key = options.key || 'title'; - - return function slugGenerator(schema){ - schema.path(key).set(function(v){ - this.slug = v.toLowerCase().replace(/[^a-z0-9]/g, '').replace(/-+/g, ''); - return v; - }); - }; -}; - -BlogPost.plugin(slugGenerator()); - -/** - * Define model. - */ - -mongoose.model('BlogPost', BlogPost); -mongoose.model('Person', Person); diff --git a/node_modules/mongoose/index.js b/node_modules/mongoose/index.js deleted file mode 100644 index e7e6278..0000000 --- a/node_modules/mongoose/index.js +++ /dev/null @@ -1,7 +0,0 @@ - -/** - * Export lib/mongoose - * - */ - -module.exports = require('./lib/'); diff --git a/node_modules/mongoose/lib/collection.js b/node_modules/mongoose/lib/collection.js deleted file mode 100644 index 1c2ab7d..0000000 --- a/node_modules/mongoose/lib/collection.js +++ /dev/null @@ -1,177 +0,0 @@ - -/*! - * Module dependencies. - */ - -var STATES = require('./connectionstate') - -/** - * Abstract Collection constructor - * - * This is the base class that drivers inherit from and implement. - * - * @param {String} name name of the collection - * @param {Connection} conn A MongooseConnection instance - * @param {Object} opts optional collection options - * @api public - */ - -function Collection (name, conn, opts) { - this.name = name; - this.conn = conn; - this.buffer = true; - this.queue = []; - - if ('number' == typeof opts) opts = { size: opts }; - this.opts = opts || {}; - - if (STATES.connected == this.conn.readyState) { - this.onOpen(); - } -}; - -/** - * The collection name - * - * @api public - * @property name - */ - -Collection.prototype.name; - -/** - * The Connection instance - * - * @api public - * @property conn - */ - -Collection.prototype.conn; - -/** - * Called when the database connects - * - * @api private - */ - -Collection.prototype.onOpen = function () { - var self = this; - this.buffer = false; - self.doQueue(); -}; - -/** - * Called when the database disconnects - * - * @api private - */ - -Collection.prototype.onClose = function () { - this.buffer = true; -}; - -/** - * Queues a method for later execution when its - * database connection opens. - * - * @param {String} name name of the method to queue - * @param {Array} args arguments to pass to the method when executed - * @api private - */ - -Collection.prototype.addQueue = function (name, args) { - this.queue.push([name, args]); - return this; -}; - -/** - * Executes all queued methods and clears the queue. - * - * @api private - */ - -Collection.prototype.doQueue = function () { - for (var i = 0, l = this.queue.length; i < l; i++){ - this[this.queue[i][0]].apply(this, this.queue[i][1]); - } - this.queue = []; - return this; -}; - -/** - * Abstract method that drivers must implement. - */ - -Collection.prototype.ensureIndex = function(){ - throw new Error('Collection#ensureIndex unimplemented by driver'); -}; - -/** - * Abstract method that drivers must implement. - */ - -Collection.prototype.findAndModify = function(){ - throw new Error('Collection#findAndModify unimplemented by driver'); -}; - -/** - * Abstract method that drivers must implement. - */ - -Collection.prototype.findOne = function(){ - throw new Error('Collection#findOne unimplemented by driver'); -}; - -/** - * Abstract method that drivers must implement. - */ - -Collection.prototype.find = function(){ - throw new Error('Collection#find unimplemented by driver'); -}; - -/** - * Abstract method that drivers must implement. - */ - -Collection.prototype.insert = function(){ - throw new Error('Collection#insert unimplemented by driver'); -}; - -/** - * Abstract method that drivers must implement. - */ - -Collection.prototype.save = function(){ - throw new Error('Collection#save unimplemented by driver'); -}; - -/** - * Abstract method that drivers must implement. - */ - -Collection.prototype.update = function(){ - throw new Error('Collection#update unimplemented by driver'); -}; - -/** - * Abstract method that drivers must implement. - */ - -Collection.prototype.getIndexes = function(){ - throw new Error('Collection#getIndexes unimplemented by driver'); -}; - -/** - * Abstract method that drivers must implement. - */ - -Collection.prototype.mapReduce = function(){ - throw new Error('Collection#mapReduce unimplemented by driver'); -}; - -/*! - * Module exports. - */ - -module.exports = Collection; diff --git a/node_modules/mongoose/lib/connection.js b/node_modules/mongoose/lib/connection.js deleted file mode 100644 index 7a32990..0000000 --- a/node_modules/mongoose/lib/connection.js +++ /dev/null @@ -1,680 +0,0 @@ -/*! - * Module dependencies. - */ - -var url = require('url') - , utils = require('./utils') - , EventEmitter = require('events').EventEmitter - , driver = global.MONGOOSE_DRIVER_PATH || './drivers/node-mongodb-native' - , Model = require('./model') - , Schema = require('./schema') - , Collection = require(driver + '/collection') - , STATES = require('./connectionstate') - , MongooseError = require('./error') - , assert =require('assert') - , muri = require('muri') - -/*! - * Protocol prefix regexp. - * - * @api private - */ - -var rgxProtocol = /^(?:.)+:\/\//; - -/** - * Connection constructor - * - * For practical reasons, a Connection equals a Db. - * - * @param {Mongoose} base a mongoose instance - * @inherits NodeJS EventEmitter http://nodejs.org/api/events.html#events_class_events_eventemitter - * @event `connecting`: Emitted when `connection.{open,openSet}()` is executed on this connection. - * @event `connected`: Emitted when this connection successfully connects to the db. May be emitted _multiple_ times in `reconnected` scenarios. - * @event `open`: Emitted after we `connected` and `onOpen` is executed on all of this connections models. - * @event `disconnecting`: Emitted when `connection.close()` was executed. - * @event `disconnected`: Emitted after getting disconnected from the db. - * @event `close`: Emitted after we `disconnected` and `onClose` executed on all of this connections models. - * @event `reconnected`: Emitted after we `connected` and subsequently `disconnected`, followed by successfully another successfull connection. - * @event `error`: Emitted when an error occurs on this connection. - * @event `fullsetup`: Emitted in a replica-set scenario, when all nodes specified in the connection string are connected. - * @api public - */ - -function Connection (base) { - this.base = base; - this.collections = {}; - this.models = {}; - this.replica = false; - this.hosts = null; - this.host = null; - this.port = null; - this.user = null; - this.pass = null; - this.name = null; - this.options = null; - this._readyState = STATES.disconnected; - this._closeCalled = false; - this._hasOpened = false; -}; - -/*! - * Inherit from EventEmitter - */ - -Connection.prototype.__proto__ = EventEmitter.prototype; - -/** - * Connection ready state - * - * - 0 = disconnected - * - 1 = connected - * - 2 = connecting - * - 3 = disconnecting - * - * Each state change emits its associated event name. - * - * ####Example - * - * conn.on('connected', callback); - * conn.on('disconnected', callback); - * - * @property readyState - * @api public - */ - -Object.defineProperty(Connection.prototype, 'readyState', { - get: function(){ return this._readyState; } - , set: function (val) { - if (!(val in STATES)) { - throw new Error('Invalid connection state: ' + val); - } - - if (this._readyState !== val) { - this._readyState = val; - - if (STATES.connected === val) - this._hasOpened = true; - - this.emit(STATES[val]); - } - } -}); - -/** - * A hash of the collections associated with this connection - * - * @property collections - */ - -Connection.prototype.collections; - -/** - * The mongodb.Db instance, set when the connection is opened - * - * @property db - */ - -Connection.prototype.db; - -/** - * Opens the connection to MongoDB. - * - * `options` is a hash with the following possible properties: - * - * db - passed to the connection db instance - * server - passed to the connection server instance(s) - * replset - passed to the connection ReplSet instance - * user - username for authentication - * pass - password for authentication - * - * ####Notes: - * - * Mongoose forces the db option `forceServerObjectId` false and cannot be overridden. - * Mongoose defaults the server `auto_reconnect` options to true which can be overridden. - * See the node-mongodb-native driver instance for options that it understands. - * - * _Options passed take precedence over options included in connection strings._ - * - * @param {String} connection_string mongodb://uri or the host to which you are connecting - * @param {String} [database] database name - * @param {Number} [port] database port - * @param {Object} [options] options - * @param {Function} [callback] - * @see node-mongodb-native https://github.com/mongodb/node-mongodb-native - * @api public - */ - -Connection.prototype.open = function (host, database, port, options, callback) { - var self = this - , parsed - , uri; - - if ('string' === typeof database) { - switch (arguments.length) { - case 2: - port = 27017; - case 3: - switch (typeof port) { - case 'function': - callback = port, port = 27017; - break; - case 'object': - options = port, port = 27017; - break; - } - break; - case 4: - if ('function' === typeof options) - callback = options, options = {}; - } - } else { - switch (typeof database) { - case 'function': - callback = database, database = undefined; - break; - case 'object': - options = database; - database = undefined; - callback = port; - break; - } - - if (!rgxProtocol.test(host)) { - host = 'mongodb://' + host; - } - - try { - parsed = muri(host); - } catch (err) { - this.error(err, callback); - return this; - } - - database = parsed.db; - host = parsed.hosts[0].host || parsed.hosts[0].ipc; - port = parsed.hosts[0].port || 27017; - } - - this.options = this.parseOptions(options, parsed && parsed.options); - - // make sure we can open - if (STATES.disconnected !== this.readyState) { - var err = new Error('Trying to open unclosed connection.'); - err.state = this.readyState; - this.error(err, callback); - return this; - } - - if (!host) { - this.error(new Error('Missing hostname.'), callback); - return this; - } - - if (!database) { - this.error(new Error('Missing database name.'), callback); - return this; - } - - // authentication - if (options && options.user && options.pass) { - this.user = options.user; - this.pass = options.pass; - - } else if (parsed && parsed.auth) { - this.user = parsed.auth.user; - this.pass = parsed.auth.pass; - - // Check hostname for user/pass - } else if (/@/.test(host) && /:/.test(host.split('@')[0])) { - host = host.split('@'); - var auth = host.shift().split(':'); - host = host.pop(); - this.user = auth[0]; - this.pass = auth[1]; - - } else { - this.user = this.pass = undefined; - } - - this.name = database; - this.host = host; - this.port = port; - - this._open(callback); - return this; -}; - -/** - * Connects to a replica set. - * - * ####Example: - * - * var db = mongoose.createConnection(); - * db.openSet("mongodb://user:pwd@localhost:27020/testing,mongodb://example.com:27020,mongodb://localhost:27019"); - * - * The database name and/or auth need only be included in one URI. - * The `options` is a hash which is passed to the internal driver connection object. - * - * Valid `options` - * - * db - passed to the connection db instance - * server - passed to the connection server instance(s) - * replset - passed to the connection ReplSetServer instance - * user - username for authentication - * pass - password for authentication - * - * _Options passed take precedence over options included in connection strings._ - * - * @param {String} uris comma-separated mongodb:// `URI`s - * @param {String} [database] database name if not included in `uris` - * @param {Object} [options] passed to the internal driver - * @param {Function} [callback] - * @see node-mongodb-native https://github.com/mongodb/node-mongodb-native - * @api public - */ - -Connection.prototype.openSet = function (uris, database, options, callback) { - if (!rgxProtocol.test(uris)) { - uris = 'mongodb://' + uris; - } - - var self = this; - - switch (arguments.length) { - case 3: - switch (typeof database) { - case 'string': - this.name = database; - break; - case 'object': - callback = options; - options = database; - database = null; - break; - } - - if ('function' === typeof options) { - callback = options; - options = {}; - } - break; - case 2: - switch (typeof database) { - case 'string': - this.name = database; - break; - case 'function': - callback = database, database = null; - break; - case 'object': - options = database, database = null; - break; - } - } - - var parsed; - try { - parsed = muri(uris); - } catch (err) { - this.error(err, callback); - return this; - } - - if (!this.name) { - this.name = parsed.db; - } - - this.hosts = parsed.hosts; - this.options = this.parseOptions(options, parsed && parsed.options); - this.replica = true; - - if (!this.name) { - this.error(new Error('No database name provided for replica set'), callback); - return this; - } - - // authentication - if (options && options.user && options.pass) { - this.user = options.user; - this.pass = options.pass; - - } else if (parsed && parsed.auth) { - this.user = parsed.auth.user; - this.pass = parsed.auth.pass; - - } else { - this.user = this.pass = undefined; - } - - this._open(callback); - return this; -}; - -/** - * error - * - * Graceful error handling, passes error to callback - * if available, else emits error on the connection. - * - * @param {Error} err - * @param {Function} callback optional - * @api private - */ - -Connection.prototype.error = function (err, callback) { - if (callback) return callback(err); - this.emit('error', err); -} - -/** - * Handles opening the connection with the appropriate method based on connection type. - * - * @param {Function} callback - * @api private - */ - -Connection.prototype._open = function (callback) { - this.readyState = STATES.connecting; - this._closeCalled = false; - - var self = this; - - var method = this.replica - ? 'doOpenSet' - : 'doOpen'; - - // open connection - this[method](function (err) { - if (err) { - self.readyState = STATES.disconnected; - if (self._hasOpened) { - if (callback) callback(err); - } else { - self.error(err, callback); - } - return; - } - - self.onOpen(callback); - }); -} - -/** - * Called when the connection is opened - * - * @api private - */ - -Connection.prototype.onOpen = function (callback) { - var self = this; - - function open (err) { - if (err) { - self.readyState = STATES.disconnected; - if (self._hasOpened) { - if (callback) callback(err); - } else { - self.error(err, callback); - } - return; - } - - self.readyState = STATES.connected; - - // avoid having the collection subscribe to our event emitter - // to prevent 0.3 warning - for (var i in self.collections) - self.collections[i].onOpen(); - - callback && callback(); - self.emit('open'); - }; - - // re-authenticate - if (self.user && self.pass) { - self.db.authenticate(self.user, self.pass, open); - } - else - open(); -}; - -/** - * Closes the connection - * - * @param {Function} [callback] optional - * @return {Connection} self - * @api public - */ - -Connection.prototype.close = function (callback) { - var self = this; - this._closeCalled = true; - - switch (this.readyState){ - case 0: // disconnected - callback && callback(); - break; - - case 1: // connected - this.readyState = STATES.disconnecting; - this.doClose(function(err){ - if (err){ - self.error(err, callback); - } else { - self.onClose(); - callback && callback(); - } - }); - break; - - case 2: // connecting - this.once('open', function(){ - self.close(callback); - }); - break; - - case 3: // disconnecting - if (!callback) break; - this.once('close', function () { - callback(); - }); - break; - } - - return this; -}; - -/** - * Called when the connection closes - * - * @api private - */ - -Connection.prototype.onClose = function () { - this.readyState = STATES.disconnected; - - // avoid having the collection subscribe to our event emitter - // to prevent 0.3 warning - for (var i in this.collections) - this.collections[i].onClose(); - - this.emit('close'); -}; - -/** - * Retrieves a collection, creating it if not cached. - * - * @param {String} name of the collection - * @param {Object} [options] optional collection options - * @return {Collection} collection instance - * @api public - */ - -Connection.prototype.collection = function (name, options) { - if (!(name in this.collections)) - this.collections[name] = new Collection(name, this, options); - return this.collections[name]; -}; - -/** - * Defines or retrieves a model. - * - * var mongoose = require('mongoose'); - * var db = mongoose.createConnection(..); - * db.model('Venue', new Schema(..)); - * var Ticket = db.model('Ticket', new Schema(..)); - * var Venue = db.model('Venue'); - * - * _When no `collection` argument is passed, Mongoose produces a collection name by passing the model `name` to the [utils.toCollectionName](#utils_exports.toCollectionName) method. This method pluralizes the name. If you don't like this behavior, either pass a collection name or set your schemas collection name option._ - * - * ####Example: - * - * var schema = new Schema({ name: String }, { collection: 'actor' }); - * - * // or - * - * schema.set('collection', 'actor'); - * - * // or - * - * var collectionName = 'actor' - * var M = conn.model('Actor', schema, collectionName) - * - * @param {String} name the model name - * @param {Schema} [schema] a schema. necessary when defining a model - * @param {String} [collection] name of mongodb collection (optional) if not given it will be induced from model name - * @see Mongoose#model #index_Mongoose-model - * @return {Model} The compiled model - * @api public - */ - -Connection.prototype.model = function (name, schema, collection) { - // collection name discovery - if ('string' == typeof schema) { - collection = schema; - schema = false; - } - - if (this.models[name] && !collection) { - // model exists but we are not subclassing with custom collection - if (schema instanceof Schema && schema != this.models[name].schema) { - throw new MongooseError.OverwriteModelError(name); - } - return this.models[name]; - } - - var opts = { cache: false, connection: this } - var model; - - if (schema instanceof Schema) { - // compile a model - model = this.base.model(name, schema, collection, opts) - - // only the first model with this name is cached to allow - // for one-offs with custom collection names etc. - if (!this.models[name]) { - this.models[name] = model; - } - - model.init(); - return model; - } - - if (this.models[name] && collection) { - // subclassing current model with alternate collection - model = this.models[name]; - schema = model.prototype.schema; - var sub = model.__subclass(this, schema, collection); - // do not cache the sub model - return sub; - } - - // lookup model in mongoose module - model = this.base.models[name]; - - if (!model) { - throw new MongooseError.MissingSchemaError(name); - } - - if (this == model.prototype.db - && (!collection || collection == model.collection.name)) { - // model already uses this connection. - - // only the first model with this name is cached to allow - // for one-offs with custom collection names etc. - if (!this.models[name]) { - this.models[name] = model; - } - - return model; - } - - return this.models[name] = model.__subclass(this, schema, collection); -} - -/** - * Set profiling level. - * - * @param {Number|String} level either off (0), slow (1), or all (2) - * @param {Number} [ms] the threshold in milliseconds above which queries will be logged when in `slow` mode. defaults to 100. - * @param {Function} callback - * @api public - */ - -Connection.prototype.setProfiling = function (level, ms, callback) { - if (STATES.connected !== this.readyState) { - return this.on('open', this.setProfiling.bind(this, level, ms, callback)); - } - - if (!callback) callback = ms, ms = 100; - - var cmd = {}; - - switch (level) { - case 0: - case 'off': - cmd.profile = 0; - break; - case 1: - case 'slow': - cmd.profile = 1; - if ('number' !== typeof ms) { - ms = parseInt(ms, 10); - if (isNaN(ms)) ms = 100; - } - cmd.slowms = ms; - break; - case 2: - case 'all': - cmd.profile = 2; - break; - default: - return callback(new Error('Invalid profiling level: '+ level)); - } - - this.db.executeDbCommand(cmd, function (err, resp) { - if (err) return callback(err); - - var doc = resp.documents[0]; - - err = 1 === doc.ok - ? null - : new Error('Could not set profiling level to: '+ level) - - callback(err, doc); - }); -}; - -/*! - * Noop. - */ - -function noop () {} - -/*! - * Module exports. - */ - -Connection.STATES = STATES; -module.exports = Connection; diff --git a/node_modules/mongoose/lib/connectionstate.js b/node_modules/mongoose/lib/connectionstate.js deleted file mode 100644 index 2d05ab0..0000000 --- a/node_modules/mongoose/lib/connectionstate.js +++ /dev/null @@ -1,24 +0,0 @@ - -/*! - * Connection states - */ - -var STATES = module.exports = exports = Object.create(null); - -var disconnected = 'disconnected'; -var connected = 'connected'; -var connecting = 'connecting'; -var disconnecting = 'disconnecting'; -var uninitialized = 'uninitialized'; - -STATES[0] = disconnected; -STATES[1] = connected; -STATES[2] = connecting; -STATES[3] = disconnecting; -STATES[99] = uninitialized; - -STATES[disconnected] = 0; -STATES[connected] = 1; -STATES[connecting] = 2; -STATES[disconnecting] = 3; -STATES[uninitialized] = 99; diff --git a/node_modules/mongoose/lib/document.js b/node_modules/mongoose/lib/document.js deleted file mode 100644 index fef4e63..0000000 --- a/node_modules/mongoose/lib/document.js +++ /dev/null @@ -1,1519 +0,0 @@ -/*! - * Module dependencies. - */ - -var EventEmitter = require('events').EventEmitter - , MongooseError = require('./error') - , MixedSchema = require('./schema/mixed') - , Schema = require('./schema') - , ValidatorError = require('./schematype').ValidatorError - , utils = require('./utils') - , clone = utils.clone - , isMongooseObject = utils.isMongooseObject - , inspect = require('util').inspect - , StateMachine = require('./statemachine') - , ActiveRoster = StateMachine.ctor('require', 'modify', 'init', 'default') - , ValidationError = require('./errors/validation') - , DocumentError = require('./errors/document') - , deepEqual = utils.deepEqual - , hooks = require('hooks') - , DocumentArray - , MongooseArray - -/** - * Document constructor. - * - * @param {Object} obj the values to set - * @param {Object} [fields] the fields which were selected in the query returning this document - * @param {Boolean} [skipId] bool, should we auto create an ObjectId _id - * @inherits NodeJS EventEmitter http://nodejs.org/api/events.html#events_class_events_eventemitter - * @event `init`: Emitted on a document after it has was retreived from the db and fully hydrated by Mongoose. - * @event `save`: Emitted when the document is successfully saved - * @api private - */ - -function Document (obj, fields, skipId) { - this.setMaxListeners(0); - - if ('boolean' === typeof fields) { - this._strictMode = fields; - this._selected = fields = undefined; - } else { - this._strictMode = this.schema.options && this.schema.options.strict; - this._selected = fields; - } - - this.isNew = true; - this.errors = undefined; - this._shardval = undefined; - this._saveError = undefined; - this._validationError = undefined; - this._adhocPaths = undefined; - this._removing = undefined; - this._inserting = undefined; - this.__version = undefined; - this.__getters = {}; - this.__id = undefined; - - this._activePaths = new ActiveRoster; - - var required = this.schema.requiredPaths(); - for (var i = 0; i < required.length; ++i) { - this._activePaths.require(required[i]); - } - - this._doc = this._buildDoc(obj, fields, skipId); - if (obj) this.set(obj, undefined, true); - this._registerHooks(); -}; - -/*! - * Inherit from EventEmitter. - */ - -Document.prototype.__proto__ = EventEmitter.prototype; - -/** - * The documents schema. - * - * @api public - * @property schema - */ - -Document.prototype.schema; - -/** - * Boolean flag specifying if the document is new. - * - * @api public - * @property isNew - */ - -Document.prototype.isNew; - -/** - * The string version of this documents _id. - * - * ####Note: - * - * This getter exists on all documents by default. The getter can be disabled by setting the `id` [option](/docs/guide.html#id) of its `Schema` to false at construction time. - * - * new Schema({ name: String }, { id: false }); - * - * @api public - * @see Schema options /docs/guide.html#options - * @property id - */ - -Document.prototype.id; - -/** - * Hash containing current validation errors. - * - * @api public - * @property errors - */ - -Document.prototype.errors; - -/** - * Builds the default doc structure - * - * @param {Object} obj - * @param {Object} [fields] - * @param {Boolean} [skipId] - * @return {Object} - * @api private - */ - -Document.prototype._buildDoc = function (obj, fields, skipId) { - var doc = {} - , self = this - , exclude - , keys - , key - , ki - - // determine if this doc is a result of a query with - // excluded fields - if (fields && 'Object' === fields.constructor.name) { - keys = Object.keys(fields); - ki = keys.length; - - while (ki--) { - if ('_id' !== keys[ki]) { - exclude = 0 === fields[keys[ki]]; - break; - } - } - } - - var paths = Object.keys(this.schema.paths) - , plen = paths.length - , ii = 0 - - for (; ii < plen; ++ii) { - var p = paths[ii]; - - if ('_id' == p) { - if (skipId) continue; - if (obj && '_id' in obj) continue; - } - - var type = this.schema.paths[p] - , path = p.split('.') - , len = path.length - , last = len-1 - , doc_ = doc - , i = 0 - - for (; i < len; ++i) { - var piece = path[i] - , def - - if (i === last) { - if (fields) { - if (exclude) { - // apply defaults to all non-excluded fields - if (p in fields) continue; - - def = type.getDefault(self, true); - if ('undefined' !== typeof def) { - doc_[piece] = def; - self._activePaths.default(p); - } - - } else if (p in fields) { - // selected field - def = type.getDefault(self, true); - if ('undefined' !== typeof def) { - doc_[piece] = def; - self._activePaths.default(p); - } - } - } else { - def = type.getDefault(self, true); - if ('undefined' !== typeof def) { - doc_[piece] = def; - self._activePaths.default(p); - } - } - } else { - doc_ = doc_[piece] || (doc_[piece] = {}); - } - } - }; - - return doc; -}; - -/** - * Initializes the document without setters or marking anything modified. - * - * Called internally after a document is returned from mongodb. - * - * @param {Object} doc document returned by mongo - * @param {Function} fn callback - * @api private - */ - -Document.prototype.init = function (doc, fn) { - this.isNew = false; - - init(this, doc, this._doc); - this._storeShard(); - - this.emit('init', this); - if (fn) fn(null); - return this; -}; - -/*! - * Init helper. - * - * @param {Object} self document instance - * @param {Object} obj raw mongodb doc - * @param {Object} doc object we are initializing - * @api private - */ - -function init (self, obj, doc, prefix) { - prefix = prefix || ''; - - var keys = Object.keys(obj) - , len = keys.length - , schema - , path - , i; - - while (len--) { - i = keys[len]; - path = prefix + i; - schema = self.schema.path(path); - - if (!schema && obj[i] && 'Object' === obj[i].constructor.name) { - // assume nested object - if (!doc[i]) { - doc[i] = {}; - } - init(self, obj[i], doc[i], path + '.'); - } else { - if (obj[i] === null) { - doc[i] = null; - } else if (obj[i] !== undefined) { - if (schema) { - self.try(function(){ - doc[i] = schema.cast(obj[i], self, true); - }); - } else { - doc[i] = obj[i]; - } - } - // mark as hydrated - self._activePaths.init(path); - } - } -}; - -/** - * Stores the current values of the shard keys. - * - * ####Note: - * - * _Shard key values do not / are not allowed to change._ - * - * @api private - */ - -Document.prototype._storeShard = function _storeShard () { - // backwards compat - var key = this.schema.options.shardKey || this.schema.options.shardkey; - if (!(key && 'Object' == key.constructor.name)) return; - - var orig = this._shardval = {} - , paths = Object.keys(key) - , len = paths.length - , val - - for (var i = 0; i < len; ++i) { - val = this.getValue(paths[i]); - if (isMongooseObject(val)) { - orig[paths[i]] = val.toObject({ depopulate: true }) - } else if (null != val && val.valueOf) { - orig[paths[i]] = val.valueOf(); - } else { - orig[paths[i]] = val; - } - } -} - -/*! - * Set up middleware support - */ - -for (var k in hooks) { - Document.prototype[k] = Document[k] = hooks[k]; -} - -/** - * Sends an update command with this document `_id` as the query selector. - * - * ####Example: - * - * weirdCar.update({$inc: {wheels:1}}, { w: 1 }, callback); - * - * ####Valid options: - * - * - same as in [Model.update](#model_Model.update) - * - * @see Model.update #model_Model.update - * @param {Object} doc - * @param {Object} options - * @param {Function} callback - * @return {Query} - * @api public - */ - -Document.prototype.update = function update () { - var args = utils.args(arguments); - args.unshift({_id: this._id}); - this.constructor.update.apply(this.constructor, args); -} - -/** - * Sets the value of a path, or many paths. - * - * ####Example: - * - * // path, value - * doc.set(path, value) - * - * // object - * doc.set({ - * path : value - * , path2 : { - * path : value - * } - * }) - * - * // only-the-fly cast to number - * doc.set(path, value, Number) - * - * // only-the-fly cast to string - * doc.set(path, value, String) - * - * @param {String|Object} path path or object of key/vals to set - * @param {Any} val the value to set - * @param {Schema|String|Number|Buffer|etc..} [type] optionally specify a type for "on-the-fly" attributes - * @param {Object} [options] optionally specify options that modify the behavior of the set - * @api public - */ - -Document.prototype.set = function (path, val, type, options) { - if (type && 'Object' == type.constructor.name) { - options = type; - type = undefined; - } - - var merge = options && options.merge - , adhoc = type && true !== type - , constructing = true === type - , adhocs - - if (adhoc) { - adhocs = this._adhocPaths || (this._adhocPaths = {}); - adhocs[path] = Schema.interpretAsType(path, type); - } - - if ('string' !== typeof path) { - // new Document({ key: val }) - - if (null === path || undefined === path) { - var _ = path; - path = val; - val = _; - - } else { - var prefix = val - ? val + '.' - : ''; - - if (path instanceof Document) path = path._doc; - - var keys = Object.keys(path) - , i = keys.length - , pathtype - , key - - while (i--) { - key = keys[i]; - pathtype = this.schema.pathType(prefix + key); - if (null != path[key] - && 'Object' == path[key].constructor.name - && 'virtual' != pathtype - && !(this._path(prefix + key) instanceof MixedSchema)) { - this.set(path[key], prefix + key, constructing); - } else if (this._strictMode) { - if ('real' === pathtype || 'virtual' === pathtype) { - this.set(prefix + key, path[key], constructing); - } else if ('throw' == this._strictMode) { - throw new Error("Field `" + key + "` is not in schema."); - } - } else if (undefined !== path[key]) { - this.set(prefix + key, path[key], constructing); - } - } - - return this; - } - } - - // ensure _strict is honored for obj props - // docschema = new Schema({ path: { nest: 'string' }}) - // doc.set('path', obj); - var pathType = this.schema.pathType(path); - if ('nested' == pathType && val && 'Object' == val.constructor.name) { - if (!merge) this.setValue(path, null); - this.set(val, path, constructing); - return this; - } - - var schema; - if ('adhocOrUndefined' == pathType && this._strictMode) { - return this; - } else if ('virtual' == pathType) { - schema = this.schema.virtualpath(path); - schema.applySetters(val, this); - return this; - } else { - schema = this._path(path); - } - - var parts = path.split('.') - , pathToMark - - // When using the $set operator the path to the field must already exist. - // Else mongodb throws: "LEFT_SUBFIELD only supports Object" - - if (parts.length <= 1) { - pathToMark = path; - } else { - for (var i = 0; i < parts.length; ++i) { - var part = parts[i]; - var subpath = parts.slice(0, i).concat(part).join('.'); - if (this.isDirectModified(subpath) // earlier prefixes that are already - // marked as dirty have precedence - || this.get(subpath) === null) { - pathToMark = subpath; - break; - } - } - - if (!pathToMark) pathToMark = path; - } - - if (!schema || null === val || undefined === val) { - this._set(pathToMark, path, constructing, parts, schema, val); - return this; - } - - var self = this; - - // if this doc is being constructed we should not - // trigger getters. - var priorVal = constructing - ? undefined - : this.get(path); - - var shouldSet = this.try(function(){ - val = schema.applySetters(val, self, false, priorVal); - }); - - if (shouldSet) { - this._set(pathToMark, path, constructing, parts, schema, val, priorVal); - } - - return this; -} - -/** - * Determine if we should mark this change as modified. - * - * @return {Boolean} - * @api private - */ - -Document.prototype._shouldModify = function ( - pathToMark, path, constructing, parts, schema, val, priorVal) { - - if (this.isNew) return true; - if (this.isDirectModified(pathToMark)) return false; - - if (undefined === val && !this.isSelected(path)) { - // when a path is not selected in a query, its initial - // value will be undefined. - return true; - } - - if (undefined === val && path in this._activePaths.states.default) { - // we're just unsetting the default value which was never saved - return false; - } - - if (!deepEqual(val, priorVal || this.get(path))) { - return true; - } - - if (!constructing && - null != val && - path in this._activePaths.states.default && - deepEqual(val, schema.getDefault(this, constructing))) { - // a path with a default was $unset on the server - // and the user is setting it to the same value again - return true; - } - - return false; -} - -/** - * Handles the actual setting of the value and marking the path modified if appropriate. - * - * @api private - */ - -Document.prototype._set = function ( - pathToMark, path, constructing, parts, schema, val, priorVal) { - - var shouldModify = this._shouldModify.apply(this, arguments); - - if (shouldModify) { - this.markModified(pathToMark, val); - - // handle directly setting arrays (gh-1126) - MongooseArray || (MongooseArray = require('./types/array')); - if (val instanceof MongooseArray) { - val._registerAtomic('$set', val); - } - } - - var obj = this._doc - , i = 0 - , l = parts.length - - for (; i < l; i++) { - var next = i + 1 - , last = next === l; - - if (last) { - obj[parts[i]] = val; - } else { - if (obj[parts[i]] && 'Object' === obj[parts[i]].constructor.name) { - obj = obj[parts[i]]; - } else if (obj[parts[i]] && Array.isArray(obj[parts[i]])) { - obj = obj[parts[i]]; - } else { - obj = obj[parts[i]] = {}; - } - } - } -} - -/** - * Gets a raw value from a path (no getters) - * - * @param {String} path - * @api private - */ - -Document.prototype.getValue = function (path) { - var parts = path.split('.') - , obj = this._doc - , part; - - for (var i = 0, l = parts.length; i < l; i++) { - part = parts[i]; - obj = obj.getValue - ? obj.getValue(part) // If we have an embedded array document member - : obj[part]; - if (!obj) return obj; - } - - return obj; -} - -/** - * Sets a raw value for a path (no casting, setters, transformations) - * - * @param {String} path - * @param {Object} value - * @api private - */ - -Document.prototype.setValue = function (path, val) { - var parts = path.split('.') - , obj = this._doc; - - for (var i = 0, len = parts.length-1; i < len; i++) { - obj = obj[parts[i]]; - } - - obj[parts[len]] = val; - return this; -}; - -/** - * Returns the value of a path. - * - * ####Example - * - * // path - * doc.get('age') // 47 - * - * // dynamic casting to a string - * doc.get('age', String) // "47" - * - * @param {String} path - * @param {Schema|String|Number|Buffer|etc..} [type] optionally specify a type for on-the-fly attributes - * @api public - */ - -Document.prototype.get = function (path, type) { - var adhocs; - if (type) { - adhocs = this._adhocPaths || (this._adhocPaths = {}); - adhocs[path] = Schema.interpretAsType(path, type); - } - - var schema = this._path(path) || this.schema.virtualpath(path) - , pieces = path.split('.') - , obj = this._doc; - - for (var i = 0, l = pieces.length; i < l; i++) { - obj = null == obj ? null : obj[pieces[i]]; - } - - if (schema) { - obj = schema.applyGetters(obj, this); - } - - return obj; -}; - -/** - * Returns the schematype for the given `path`. - * - * @param {String} path - * @api private - */ - -Document.prototype._path = function (path) { - var adhocs = this._adhocPaths - , adhocType = adhocs && adhocs[path]; - - if (adhocType) { - return adhocType; - } else { - return this.schema.path(path); - } -}; - -/** - * Marks the path as having pending changes to write to the db. - * - * _Very helpful when using [Mixed](./schematypes.html#mixed) types._ - * - * ####Example: - * - * doc.mixed.type = 'changed'; - * doc.markModified('mixed.type'); - * doc.save() // changes to mixed.type are now persisted - * - * @param {String} path the path to mark modified - * @api public - */ - -Document.prototype.markModified = function (path) { - this._activePaths.modify(path); -} - -/** - * Catches errors that occur during execution of `fn` and stores them to later be passed when `save()` is executed. - * - * @param {Function} fn function to execute - * @param {Object} scope the scope with which to call fn - * @api private - */ - -Document.prototype.try = function (fn, scope) { - var res; - try { - fn.call(scope); - res = true; - } catch (e) { - this._error(e); - res = false; - } - return res; -}; - -/** - * Returns the list of paths that have been modified. - * - * @return {Array} - * @api public - */ - -Document.prototype.modifiedPaths = function () { - var directModifiedPaths = Object.keys(this._activePaths.states.modify); - - return directModifiedPaths.reduce(function (list, path) { - var parts = path.split('.'); - return list.concat(parts.reduce(function (chains, part, i) { - return chains.concat(parts.slice(0, i).concat(part).join('.')); - }, [])); - }, []); -}; - -/** - * Returns true if this document was modified, else false. - * - * If `path` is given, checks if a path or any full path containing `path` as part of its path chain has been modified. - * - * ####Example - * - * doc.set('documents.0.title', 'changed'); - * doc.isModified() // true - * doc.isModified('documents') // true - * doc.isModified('documents.0.title') // true - * doc.isDirectModified('documents') // false - * - * @param {String} [path] optional - * @return {Boolean} - * @api public - */ - -Document.prototype.isModified = function (path) { - return path - ? !!~this.modifiedPaths().indexOf(path) - : this._activePaths.some('modify'); -}; - -/** - * Returns true if `path` was directly set and modified, else false. - * - * ####Example - * - * doc.set('documents.0.title', 'changed'); - * doc.isDirectModified('documents.0.title') // true - * doc.isDirectModified('documents') // false - * - * @param {String} path - * @return {Boolean} - * @api public - */ - -Document.prototype.isDirectModified = function (path) { - return (path in this._activePaths.states.modify); -}; - -/** - * Checks if `path` was initialized. - * - * @param {String} path - * @return {Boolean} - * @api public - */ - -Document.prototype.isInit = function (path) { - return (path in this._activePaths.states.init); -}; - -/** - * Checks if `path` was selected in the source query which initialized this document. - * - * ####Example - * - * Thing.findOne().select('name').exec(function (err, doc) { - * doc.isSelected('name') // true - * doc.isSelected('age') // false - * }) - * - * @param {String} path - * @return {Boolean} - * @api public - */ - -Document.prototype.isSelected = function isSelected (path) { - if (this._selected) { - - if ('_id' === path) { - return 0 !== this._selected._id; - } - - var paths = Object.keys(this._selected) - , i = paths.length - , inclusive = false - , cur - - if (1 === i && '_id' === paths[0]) { - // only _id was selected. - return 0 === this._selected._id; - } - - while (i--) { - cur = paths[i]; - if ('_id' == cur) continue; - inclusive = !! this._selected[cur]; - break; - } - - if (path in this._selected) { - return inclusive; - } - - i = paths.length; - var pathDot = path + '.'; - - while (i--) { - cur = paths[i]; - if ('_id' == cur) continue; - - if (0 === cur.indexOf(pathDot)) { - return inclusive; - } - - if (0 === pathDot.indexOf(cur)) { - return inclusive; - } - } - - return ! inclusive; - } - - return true; -} - -/** - * Executes registered validation rules for this document. - * - * ####Note: - * - * This method is called `pre` save and if a validation rule is violated, [save](#model_Model-save) is aborted and the error is returned to your `callback`. - * - * ####Example: - * - * doc.validate(function (err) { - * if (err) handleError(err); - * else // validation passed - * }); - * - * @param {Function} cb called after validation completes, passing an error if one occurred - * @api public - */ - -Document.prototype.validate = function (cb) { - var self = this - - // only validate required fields when necessary - var paths = Object.keys(this._activePaths.states.require).filter(function (path) { - if (!self.isSelected(path) && !self.isModified(path)) return false; - return true; - }); - - paths = paths.concat(Object.keys(this._activePaths.states.init)); - paths = paths.concat(Object.keys(this._activePaths.states.modify)); - paths = paths.concat(Object.keys(this._activePaths.states.default)); - - if (0 === paths.length) { - complete(); - return this; - } - - var validating = {} - , total = 0; - - paths.forEach(validatePath); - return this; - - function validatePath (path) { - if (validating[path]) return; - - validating[path] = true; - total++; - - process.nextTick(function(){ - var p = self.schema.path(path); - if (!p) return --total || complete(); - - p.doValidate(self.getValue(path), function (err) { - if (err) self.invalidate(path, err, true); - --total || complete(); - }, self); - }); - } - - function complete () { - var err = self._validationError; - self._validationError = undefined; - self.emit('validate', self); - cb(err); - } -}; - -/** - * Marks a path as invalid, causing validation to fail. - * - * @param {String} path the field to invalidate - * @param {String|Error} err the error which states the reason `path` was invalid - * @api public - */ - -Document.prototype.invalidate = function (path, err) { - if (!this._validationError) { - this._validationError = new ValidationError(this); - } - - if (!err || 'string' === typeof err) { - err = new ValidatorError(path, err); - } - - this._validationError.errors[path] = err; -} - -/** - * Resets the internal modified state of this document. - * - * @api private - * @return {Document} - */ - -Document.prototype._reset = function reset () { - var self = this; - DocumentArray || (DocumentArray = require('./types/documentarray')); - - this._activePaths - .map('init', 'modify', function (i) { - return self.getValue(i); - }) - .filter(function (val) { - return val && val instanceof DocumentArray && val.length; - }) - .forEach(function (array) { - var i = array.length; - while (i--) { - var doc = array[i]; - if (!doc) continue; - doc._reset(); - } - }); - - // clear atomics - this._dirty().forEach(function (dirt) { - var type = dirt.value; - if (type && type._atomics) { - type._atomics = {}; - } - }); - - // Clear 'modify'('dirty') cache - this._activePaths.clear('modify'); - this._validationError = undefined; - this.errors = undefined; - var self = this; - this.schema.requiredPaths().forEach(function (path) { - self._activePaths.require(path); - }); - - return this; -} - -/** - * Returns this documents dirty paths / vals. - * - * @api private - */ - -Document.prototype._dirty = function _dirty () { - var self = this; - - var all = this._activePaths.map('modify', function (path) { - return { path: path - , value: self.getValue(path) - , schema: self._path(path) }; - }); - - // Sort dirty paths in a flat hierarchy. - all.sort(function (a, b) { - return (a.path < b.path ? -1 : (a.path > b.path ? 1 : 0)); - }); - - // Ignore "foo.a" if "foo" is dirty already. - var minimal = [] - , lastPath - , top; - - all.forEach(function (item, i) { - if (item.path.indexOf(lastPath) !== 0) { - lastPath = item.path + '.'; - minimal.push(item); - top = item; - } else { - if (!(item.value && top.value)) return; - - // special case for top level MongooseArrays - if (top.value._atomics && top.value.hasAtomics()) { - // the `top` array itself and a sub path of `top` are being modified. - // the only way to honor all of both modifications is through a $set - // of entire array. - top.value._atomics = {}; - top.value._atomics.$set = top.value; - } - } - }); - - top = lastPath = null; - return minimal; -} - -/*! - * Compiles schemas. - */ - -function compile (tree, proto, prefix) { - var keys = Object.keys(tree) - , i = keys.length - , limb - , key; - - while (i--) { - key = keys[i]; - limb = tree[key]; - - define(key - , (('Object' === limb.constructor.name - && Object.keys(limb).length) - && (!limb.type || limb.type.type) - ? limb - : null) - , proto - , prefix - , keys); - } -}; - -/*! - * Defines the accessor named prop on the incoming prototype. - */ - -function define (prop, subprops, prototype, prefix, keys) { - var prefix = prefix || '' - , path = (prefix ? prefix + '.' : '') + prop; - - if (subprops) { - - Object.defineProperty(prototype, prop, { - enumerable: true - , get: function () { - if (!this.__getters) - this.__getters = {}; - - if (!this.__getters[path]) { - var nested = Object.create(this); - - // save scope for nested getters/setters - if (!prefix) nested._scope = this; - - // shadow inherited getters from sub-objects so - // thing.nested.nested.nested... doesn't occur (gh-366) - var i = 0 - , len = keys.length; - - for (; i < len; ++i) { - // over-write the parents getter without triggering it - Object.defineProperty(nested, keys[i], { - enumerable: false // It doesn't show up. - , writable: true // We can set it later. - , configurable: true // We can Object.defineProperty again. - , value: undefined // It shadows its parent. - }); - } - - nested.toObject = function () { - return this.get(path); - }; - - compile(subprops, nested, path); - this.__getters[path] = nested; - } - - return this.__getters[path]; - } - , set: function (v) { - if (v instanceof Document) v = v.toObject(); - return this.set(path, v); - } - }); - - } else { - - Object.defineProperty(prototype, prop, { - enumerable: true - , get: function ( ) { return this.get.call(this._scope || this, path); } - , set: function (v) { return this.set.call(this._scope || this, path, v); } - }); - } -}; - -/** - * Assigns/compiles `schema` into this documents prototype. - * - * @param {Schema} schema - * @api private - */ - -Document.prototype._setSchema = function (schema) { - compile(schema.tree, this); - this.schema = schema; -} - -/** - * Register default hooks - * - * @api private - */ - -Document.prototype._registerHooks = function _registerHooks () { - if (!this.save) return; - - DocumentArray || (DocumentArray = require('./types/documentarray')); - - this.pre('save', function (next) { - // we keep the error semaphore to make sure we don't - // call `save` unnecessarily (we only need 1 error) - var subdocs = 0 - , error = false - , self = this; - - // check for DocumentArrays - var arrays = this._activePaths - .map('init', 'modify', function (i) { - return self.getValue(i); - }) - .filter(function (val) { - return val && val instanceof DocumentArray && val.length; - }); - - if (!arrays.length) - return next(); - - arrays.forEach(function (array) { - if (error) return; - - // handle sparse arrays by using for loop vs array.forEach - // which skips the sparse elements - - var len = array.length - subdocs += len; - - for (var i = 0; i < len; ++i) { - if (error) break; - - var doc = array[i]; - if (!doc) { - --subdocs || next(); - continue; - } - - doc.save(handleSave); - } - }); - - function handleSave (err) { - if (error) return; - - if (err) { - self._validationError = undefined; - return next(error = err); - } - - --subdocs || next(); - } - - }, function (err) { - // emit on the Model if listening - if (this.constructor.listeners('error').length) { - this.constructor.emit('error', err); - } else { - // emit on the connection - if (!this.db.listeners('error').length) { - err.stack = 'No listeners detected, throwing. ' - + 'Consider adding an error listener to your connection.\n' - + err.stack - } - this.db.emit('error', err); - } - }).pre('save', function checkForExistingErrors (next) { - // if any doc.set() calls failed - if (this._saveError) { - next(this._saveError); - this._saveError = null; - } else { - next(); - } - }).pre('save', function validation (next) { - return this.validate(next); - }); - - // add user defined queues - this._doQueue(); -}; - -/** - * Registers an error - * - * @param {Error} err - * @api private - */ - -Document.prototype._error = function (err) { - this._saveError = err; - return this; -}; - -/** - * Executes methods queued from the Schema definition - * - * @api private - */ - -Document.prototype._doQueue = function () { - var q = this.schema && this.schema.callQueue; - if (q) { - for (var i = 0, l = q.length; i < l; i++) { - this[q[i][0]].apply(this, q[i][1]); - } - } - return this; -}; - -/** - * Converts this document into a plain javascript object - * - * ####Options: - * - * - `getters` apply all getters (path and virtual getters) - * - `virtuals` apply virtual getters (can override `getters` option) - * - `minimize` remove empty objects (defaults to true) - * - `transform` a transform function to apply to the resulting document before returning - * - * ####Getters/Virtuals - * - * Example of only applying path getters - * - * doc.toObject({ getters: true, virtuals: false }) - * - * Example of only applying virtual getters - * - * doc.toObject({ virtuals: true }) - * - * Example of applying both path and virtual getters - * - * doc.toObject({ getters: true }) - * - * To apply these options to every document of your schema by default, set your [schemas](#schema_Schema) `toObject` option to the same argument. - * - * schema.set('toObject', { virtuals: true }) - * - * ####Transform - * - * We may need to perform a transformation of the resulting object based on some criteria, say to remove some sensitive information or return a custom object. In this case we set the optional `transform` function. - * - * Transform functions receive three arguments - * - * function (doc, ret, options) {} - * - * - `doc` The mongoose document which is being converted - * - `ret` The plain object representation which has been converted - * - `options` The options in use (either schema options or the options passed inline) - * - * ####Example - * - * // specify the transform schema option - * schema.options.toObject.transform = function (doc, ret, options) { - * // remove the _id of every document before returning the result - * delete ret._id; - * } - * - * // without the transformation in the schema - * doc.toObject(); // { _id: 'anId', name: 'Wreck-it Ralph' } - * - * // with the transformation - * doc.toObject(); // { name: 'Wreck-it Ralph' } - * - * With transformations we can do a lot more than remove properties. We can even return completely new customized objects: - * - * schema.options.toObject.transform = function (doc, ret, options) { - * return { movie: ret.name } - * } - * - * // without the transformation in the schema - * doc.toObject(); // { _id: 'anId', name: 'Wreck-it Ralph' } - * - * // with the transformation - * doc.toObject(); // { movie: 'Wreck-it Ralph' } - * - * _Note: if a transform function returns `undefined`, the return value will be ignored._ - * - * Transformations may also be applied inline, overridding any transform set in the options: - * - * function xform (doc, ret, options) { - * return { inline: ret.name, custom: true } - * } - * - * // pass the transform as an inline option - * doc.toObject({ transform: xform }); // { inline: 'Wreck-it Ralph', custom: true } - * - * _Note: if you call `toObject` and pass any options, the transform declared in your schema options will __not__ be applied. To force its application pass `transform: true`_ - * - * schema.options.toObject.hide = '_id'; - * schema.options.toObject.transform = function (doc, ret, options) { - * if (options.hide) { - * options.hide.split(' ').forEach(function (prop) { - * delete ret[prop]; - * }); - * } - * } - * - * var doc = new Doc({ _id: 'anId', secret: 47, name: 'Wreck-it Ralph' }); - * doc.toObject(); // { secret: 47, name: 'Wreck-it Ralph' } - * doc.toObject({ hide: 'secret _id' }); // { _id: 'anId', secret: 47, name: 'Wreck-it Ralph' } - * doc.toObject({ hide: 'secret _id', transform: true }); // { name: 'Wreck-it Ralph' } - * - * Transforms are applied to the document _and each of its sub-documents_. To determine whether or not you are currently operating on a sub-document you might use the following guard: - * - * if ('function' == typeof doc.ownerDocument) { - * // working with a sub doc - * } - * - * Transforms, like all of these options, are also available for `toJSON`. - * - * See [schema options](/docs/guide.html#toObject) for some more details. - * - * @param {Object} [options] - * @return {Object} js object - * @api public - */ - -Document.prototype.toObject = function (options) { - // When internally saving this document we always pass options, - // bypassing the custom schema options. - if (!(options && 'Object' == options.constructor.name)) { - options = this.schema.options.toObject - ? clone(this.schema.options.toObject) - : {}; - } - - ;('minimize' in options) || (options.minimize = this.schema.options.minimize); - - var ret = clone(this._doc, options); - - if (options.virtuals || options.getters && false !== options.virtuals) { - applyGetters(this, ret, 'virtuals', options); - } - - if (options.getters) { - applyGetters(this, ret, 'paths', options); - } - - if (true === options.transform) { - var opts = options.json - ? this.schema.options.toJSON - : this.schema.options.toObject; - if (opts) { - options.transform = opts.transform; - } - } - - if ('function' == typeof options.transform) { - var xformed = options.transform(this, ret, options); - if ('undefined' != typeof xformed) ret = xformed; - } - - return ret; -}; - -/*! - * Applies virtuals properties to `json`. - * - * @param {Document} self - * @param {Object} json - * @param {String} type either `virtuals` or `paths` - * @return {Object} `json` - */ - -function applyGetters (self, json, type, options) { - var schema = self.schema - , paths = Object.keys(schema[type]) - , i = paths.length - , path - - while (i--) { - path = paths[i]; - - var parts = path.split('.') - , plen = parts.length - , last = plen - 1 - , branch = json - , part - - for (var ii = 0; ii < plen; ++ii) { - part = parts[ii]; - if (ii === last) { - branch[part] = clone(self.get(path), options); - } else { - branch = branch[part] || (branch[part] = {}); - } - } - } - - return json; -} - -/** - * The return value of this method is used in calls to JSON.stringify(doc). - * - * This method accepts the same options as [Document#toObject](#document_Document-toObject). To apply the options to every document of your schema by default, set your [schemas](#schema_Schema) `toJSON` option to the same argument. - * - * schema.set('toJSON', { virtuals: true }) - * - * See [schema options](/docs/guide.html#toJSON) for details. - * - * @param {Object} options same options as [Document#toObject](#document_Document-toObject) - * @return {Object} - * @see Document#toObject #document_Document-toObject - - * @api public - */ - -Document.prototype.toJSON = function (options) { - // check for object type since an array of documents - // being stringified passes array indexes instead - // of options objects. JSON.stringify([doc, doc]) - if (!(options && 'Object' == options.constructor.name)) { - options = this.schema.options.toJSON - ? clone(this.schema.options.toJSON) - : {}; - } - options.json = true; - return this.toObject(options); -}; - -/** - * Helper for console.log - * - * @api public - */ - -Document.prototype.inspect = function (options) { - var opts = options && 'Object' == options.constructor.name ? options : - this.schema.options.toObject ? clone(this.schema.options.toObject) : - {}; - opts.minimize = false; - return inspect(this.toObject(opts)); -}; - -/** - * Helper for console.log - * - * @api public - * @method toString - */ - -Document.prototype.toString = Document.prototype.inspect; - -/** - * Returns true if the Document stores the same data as doc. - * - * Documents are considered equal when they have matching `_id`s. - * - * @param {Document} doc a document to compare - * @return {Boolean} - * @api public - */ - -Document.prototype.equals = function (doc) { - var tid = this.get('_id'); - var docid = doc.get('_id'); - return tid.equals - ? tid.equals(docid) - : tid === docid; -}; - -/*! - * Module exports. - */ - -Document.ValidationError = ValidationError; -module.exports = exports = Document; -exports.Error = DocumentError; diff --git a/node_modules/mongoose/lib/drivers/node-mongodb-native/binary.js b/node_modules/mongoose/lib/drivers/node-mongodb-native/binary.js deleted file mode 100644 index 0480d31..0000000 --- a/node_modules/mongoose/lib/drivers/node-mongodb-native/binary.js +++ /dev/null @@ -1,8 +0,0 @@ - -/*! - * Module dependencies. - */ - -var Binary = require('mongodb').BSONPure.Binary; - -module.exports = exports = Binary; diff --git a/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js b/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js deleted file mode 100644 index a53857f..0000000 --- a/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js +++ /dev/null @@ -1,212 +0,0 @@ - -/*! - * Module dependencies. - */ - -var MongooseCollection = require('../../collection') - , Collection = require('mongodb').Collection - , STATES = require('../../connectionstate') - , utils = require('../../utils') - -/** - * A [node-mongodb-native](https://github.com/mongodb/node-mongodb-native) collection implementation. - * - * All methods methods from the [node-mongodb-native](https://github.com/mongodb/node-mongodb-native) driver are copied and wrapped in queue management. - * - * @inherits Collection - * @api private - */ - -function NativeCollection () { - this.collection = null; - MongooseCollection.apply(this, arguments); -} - -/*! - * Inherit from abstract Collection. - */ - -NativeCollection.prototype.__proto__ = MongooseCollection.prototype; - -/** - * Called when the connection opens. - * - * @api private - */ - -NativeCollection.prototype.onOpen = function () { - var self = this; - - if (this.collection) { - return MongooseCollection.prototype.onOpen.call(self); - } - - if (!self.opts.size) { - // non-capped - return self.conn.db.collection(self.name, callback); - } - - // capped - return self.conn.db.collection(self.name, function (err, c) { - if (err) return callback(err); - - // discover if this collection exists and if it is capped - c.options(function (err, exists) { - if (err) return callback(err); - - if (exists) { - if (exists.capped) { - callback(null, c); - } else { - var msg = 'A non-capped collection exists with this name.\n\n' - + ' To use this collection as a capped collection, please ' - + 'first convert it.\n' - + ' http://www.mongodb.org/display/DOCS/Capped+Collections#CappedCollections-Convertingacollectiontocapped' - err = new Error(msg); - callback(err); - } - } else { - // create - var opts = utils.clone(self.opts); - opts.capped = true; - self.conn.db.createCollection(self.name, opts, callback); - } - }); - }); - - function callback (err, collection) { - if (err) { - // likely a strict mode error - self.conn.emit('error', err); - } else { - self.collection = collection; - MongooseCollection.prototype.onOpen.call(self); - } - }; -}; - -/** - * Called when the connection closes - * - * @api private - */ - -NativeCollection.prototype.onClose = function () { - MongooseCollection.prototype.onClose.call(this); -}; - -/*! - * Copy the collection methods and make them subject to queues - */ - -for (var i in Collection.prototype) { - (function(i){ - NativeCollection.prototype[i] = function () { - if (this.buffer) { - this.addQueue(i, arguments); - return; - } - - var collection = this.collection - , args = arguments - , self = this - , debug = self.conn.base.options.debug; - - if (debug) { - if ('function' === typeof debug) { - debug.apply(debug - , [self.name, i].concat(utils.args(args, 0, args.length-1))); - } else { - console.error('\x1B[0;36mMongoose:\x1B[0m %s.%s(%s) %s %s %s' - , self.name - , i - , print(args[0]) - , print(args[1]) - , print(args[2]) - , print(args[3])) - } - } - - collection[i].apply(collection, args); - }; - })(i); -} - -/*! - * Debug print helper - */ - -function print (arg) { - var type = typeof arg; - if ('function' === type || 'undefined' === type) return ''; - return format(arg); -} - -/*! - * Debug print helper - */ - -function format (obj, sub) { - var x = utils.clone(obj); - if (x) { - if ('Binary' === x.constructor.name) { - x = '[object Buffer]'; - } else if ('ObjectID' === x.constructor.name) { - var representation = 'ObjectId("' + x.toHexString() + '")'; - x = { inspect: function() { return representation; } }; - } else if ('Date' === x.constructor.name) { - var representation = 'new Date("' + x.toUTCString() + '")'; - x = { inspect: function() { return representation; } }; - } else if ('Object' === x.constructor.name) { - var keys = Object.keys(x) - , i = keys.length - , key - while (i--) { - key = keys[i]; - if (x[key]) { - if ('Binary' === x[key].constructor.name) { - x[key] = '[object Buffer]'; - } else if ('Object' === x[key].constructor.name) { - x[key] = format(x[key], true); - } else if ('ObjectID' === x[key].constructor.name) { - ;(function(x){ - var representation = 'ObjectId("' + x[key].toHexString() + '")'; - x[key] = { inspect: function() { return representation; } }; - })(x) - } else if ('Date' === x[key].constructor.name) { - ;(function(x){ - var representation = 'new Date("' + x[key].toUTCString() + '")'; - x[key] = { inspect: function() { return representation; } }; - })(x) - } else if (Array.isArray(x[key])) { - x[key] = x[key].map(function (o) { - return format(o, true) - }); - } - } - } - } - if (sub) return x; - } - - return require('util') - .inspect(x, false, 10, true) - .replace(/\n/g, '') - .replace(/\s{2,}/g, ' ') -} - -/** - * Retreives information about this collections indexes. - * - * @param {Function} callback - * @method getIndexes - * @api public - */ - -NativeCollection.prototype.getIndexes = NativeCollection.prototype.indexInformation; - -/*! - * Module exports. - */ - -module.exports = NativeCollection; diff --git a/node_modules/mongoose/lib/drivers/node-mongodb-native/connection.js b/node_modules/mongoose/lib/drivers/node-mongodb-native/connection.js deleted file mode 100644 index aa46ff1..0000000 --- a/node_modules/mongoose/lib/drivers/node-mongodb-native/connection.js +++ /dev/null @@ -1,289 +0,0 @@ -/*! - * Module dependencies. - */ - -var MongooseConnection = require('../../connection') - , mongo = require('mongodb') - , Server = mongo.Server - , STATES = require('../../connectionstate') - , ReplSetServers = mongo.ReplSetServers; - -/** - * A [node-mongodb-native](https://github.com/mongodb/node-mongodb-native) connection implementation. - * - * @inherits Connection - * @api private - */ - -function NativeConnection() { - MongooseConnection.apply(this, arguments); - this._listening = false; -}; - -/*! - * Inherits from Connection. - */ - -NativeConnection.prototype.__proto__ = MongooseConnection.prototype; - -/** - * Opens the connection to MongoDB. - * - * @param {Function} fn - * @return {Connection} this - * @api private - */ - -NativeConnection.prototype.doOpen = function (fn) { - if (this.db) { - mute(this); - } - - var server = new mongo.Server(this.host, this.port, this.options.server); - this.db = new mongo.Db(this.name, server, this.options.db); - - var self = this; - this.db.open(function (err) { - if (err) return fn(err); - fn(); - listen(self); - }); - - return this; -}; - - -/*! - * Register listeners for important events and bubble appropriately. - */ - -function listen (conn) { - if (conn._listening) return; - conn._listening = true; - - conn.db.on('close', function(){ - if (conn._closeCalled) return; - - // the driver never emits an `open` event. auto_reconnect still - // emits a `close` event but since we never get another - // `open` we can't emit close - if (conn.db.serverConfig.autoReconnect) { - conn.readyState = STATES.disconnected; - conn.emit('close'); - return; - } - conn.onClose(); - }); - conn.db.on('error', function(err){ - conn.emit('error', err); - }); - conn.db.on('timeout', function(err){ - var error = new Error(err && err.err || 'connection timeout'); - conn.emit('error', error); - }); - conn.db.on('open', function (err, db) { - if (STATES.disconnected === conn.readyState && db && db.databaseName) { - conn.readyState = STATES.connected; - conn.emit('reconnected') - } - }) -} - -/*! - * Remove listeners registered in `listen` - */ - -function mute (conn) { - if (!conn.db) throw new Error('missing db'); - conn.db.removeAllListeners("close"); - conn.db.removeAllListeners("error"); - conn.db.removeAllListeners("timeout"); - conn.db.removeAllListeners("open"); - conn.db.removeAllListeners("fullsetup"); - conn._listening = false; -} - -/** - * Opens a connection to a MongoDB ReplicaSet. - * - * See description of [doOpen](#NativeConnection-doOpen) for server options. In this case `options.replset` is also passed to ReplSetServers. - * - * @param {Function} fn - * @api private - * @return {Connection} this - */ - -NativeConnection.prototype.doOpenSet = function (fn) { - if (this.db) { - mute(this); - } - - var servers = [] - , self = this; - - this.hosts.forEach(function (server) { - var host = server.host || server.ipc; - var port = server.port || 27017; - servers.push(new mongo.Server(host, port, self.options.server)); - }) - - var server = new ReplSetServers(servers, this.options.replset); - this.db = new mongo.Db(this.name, server, this.options.db); - - this.db.on('fullsetup', function () { - self.emit('fullsetup') - }); - - this.db.open(function (err) { - if (err) return fn(err); - fn(); - listen(self); - }); - - return this; -}; - -/** - * Closes the connection - * - * @param {Function} fn - * @return {Connection} this - * @api private - */ - -NativeConnection.prototype.doClose = function (fn) { - this.db.close(); - if (fn) fn(); - return this; -} - -/** - * Prepares default connection options for the node-mongodb-native driver. - * - * _NOTE: `passed` options take precedence over connection string options._ - * - * @param {Object} passed options that were passed directly during connection - * @param {Object} [connStrOptions] options that were passed in the connection string - * @api private - */ - -NativeConnection.prototype.parseOptions = function (passed, connStrOpts) { - var o = passed || {}; - o.db || (o.db = {}); - o.server || (o.server = {}); - o.replset || (o.replset = {}); - o.server.socketOptions || (o.server.socketOptions = {}); - o.replset.socketOptions || (o.replset.socketOptions = {}); - - var opts = connStrOpts || {}; - Object.keys(opts).forEach(function (name) { - switch (name) { - case 'poolSize': - if ('undefined' == typeof o.server.poolSize) { - o.server.poolSize = o.replset.poolSize = opts[name]; - } - break; - case 'slaveOk': - if ('undefined' == typeof o.server.slave_ok) { - o.server.slave_ok = opts[name]; - } - break; - case 'autoReconnect': - if ('undefined' == typeof o.server.auto_reconnect) { - o.server.auto_reconnect = opts[name]; - } - break; - case 'ssl': - case 'socketTimeoutMS': - case 'connectTimeoutMS': - if ('undefined' == typeof o.server.socketOptions[name]) { - o.server.socketOptions[name] = o.replset.socketOptions[name] = opts[name]; - } - break; - case 'retries': - case 'reconnectWait': - case 'rs_name': - if ('undefined' == typeof o.replset[name]) { - o.replset[name] = opts[name]; - } - break; - case 'replicaSet': - if ('undefined' == typeof o.replset.rs_name) { - o.replset.rs_name = opts[name]; - } - break; - case 'readSecondary': - if ('undefined' == typeof o.replset.read_secondary) { - o.replset.read_secondary = opts[name]; - } - break; - case 'nativeParser': - if ('undefined' == typeof o.db.native_parser) { - o.db.native_parser = opts[name]; - } - break; - case 'w': - case 'safe': - case 'fsync': - case 'journal': - case 'wtimeoutMS': - if ('undefined' == typeof o.db[name]) { - o.db[name] = opts[name]; - } - break; - case 'readPreference': - if ('undefined' == typeof o.db.read_preference) { - o.db.read_preference = opts[name]; - } - break; - case 'readPreferenceTags': - if ('undefined' == typeof o.db.read_preference_tags) { - o.db.read_preference_tags = opts[name]; - } - break; - } - }) - - if (!('auto_reconnect' in o.server)) { - o.server.auto_reconnect = true; - } - - if (!o.db.read_preference) { - // read from primaries by default - o.db.read_preference = 'primary'; - } - - // mongoose creates its own ObjectIds - o.db.forceServerObjectId = false; - - // default safe using new nomenclature - if (!('journal' in o.db || 'j' in o.db || - 'fsync' in o.db || 'safe' in o.db || 'w' in o.db)) { - o.db.w = 1; - } - - validate(o); - return o; -} - -/*! - * Validates the driver db options. - * - * @param {Object} o - */ - -function validate (o) { - if (-1 === o.db.w || 0 === o.db.w) { - if (o.db.journal || o.db.fsync || o.db.safe) { - throw new Error( - 'Invalid writeConcern: ' - + 'w set to -1 or 0 cannot be combined with safe|fsync|journal'); - } - } -} - -/*! - * Module exports. - */ - -module.exports = NativeConnection; diff --git a/node_modules/mongoose/lib/drivers/node-mongodb-native/objectid.js b/node_modules/mongoose/lib/drivers/node-mongodb-native/objectid.js deleted file mode 100644 index 3c46c93..0000000 --- a/node_modules/mongoose/lib/drivers/node-mongodb-native/objectid.js +++ /dev/null @@ -1,29 +0,0 @@ - -/*! - * [node-mongodb-native](https://github.com/mongodb/node-mongodb-native) ObjectId - * @constructor NodeMongoDbObjectId - * @see ObjectId - */ - -var ObjectId = require('mongodb').BSONPure.ObjectID; - -/*! - * ignore - */ - -var ObjectIdToString = ObjectId.toString.bind(ObjectId); -module.exports = exports = ObjectId; - -ObjectId.fromString = function(str){ - // patch native driver bug in V0.9.6.4 - if (!('string' === typeof str && 24 === str.length)) { - throw new Error("Invalid ObjectId"); - } - - return ObjectId.createFromHexString(str); -}; - -ObjectId.toString = function(oid){ - if (!arguments.length) return ObjectIdToString(); - return oid.toHexString(); -}; diff --git a/node_modules/mongoose/lib/error.js b/node_modules/mongoose/lib/error.js deleted file mode 100644 index 9216cd9..0000000 --- a/node_modules/mongoose/lib/error.js +++ /dev/null @@ -1,38 +0,0 @@ - -/** - * Mongoose error - * - * @api private - * @inherits Error https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error - */ - -function MongooseError (msg) { - Error.call(this); - Error.captureStackTrace(this, arguments.callee); - this.message = msg; - this.name = 'MongooseError'; -}; - -/*! - * Inherits from Error. - */ - -MongooseError.prototype.__proto__ = Error.prototype; - -/*! - * Module exports. - */ - -module.exports = exports = MongooseError; - -/*! - * Expose subclasses - */ - -MongooseError.CastError = require('./errors/cast'); -MongooseError.DocumentError = require('./errors/document'); -MongooseError.ValidationError = require('./errors/validation') -MongooseError.ValidatorError = require('./errors/validator') -MongooseError.VersionError =require('./errors/version') -MongooseError.OverwriteModelError = require('./errors/overwriteModel') -MongooseError.MissingSchemaError = require('./errors/missingSchema') diff --git a/node_modules/mongoose/lib/errors/cast.js b/node_modules/mongoose/lib/errors/cast.js deleted file mode 100644 index 055063a..0000000 --- a/node_modules/mongoose/lib/errors/cast.js +++ /dev/null @@ -1,35 +0,0 @@ -/*! - * Module dependencies. - */ - -var MongooseError = require('../error'); - -/** - * Casting Error constructor. - * - * @param {String} type - * @param {String} value - * @inherits MongooseError - * @api private - */ - -function CastError (type, value, path) { - MongooseError.call(this, 'Cast to ' + type + ' failed for value "' + value + '" at path "' + path + '"'); - Error.captureStackTrace(this, arguments.callee); - this.name = 'CastError'; - this.type = type; - this.value = value; - this.path = path; -}; - -/*! - * Inherits from MongooseError. - */ - -CastError.prototype.__proto__ = MongooseError.prototype; - -/*! - * exports - */ - -module.exports = CastError; diff --git a/node_modules/mongoose/lib/errors/document.js b/node_modules/mongoose/lib/errors/document.js deleted file mode 100644 index 6955256..0000000 --- a/node_modules/mongoose/lib/errors/document.js +++ /dev/null @@ -1,32 +0,0 @@ - -/*! - * Module requirements - */ - -var MongooseError = require('../error') - -/** - * Document Error - * - * @param {String} msg - * @inherits MongooseError - * @api private - */ - -function DocumentError (msg) { - MongooseError.call(this, msg); - Error.captureStackTrace(this, arguments.callee); - this.name = 'DocumentError'; -}; - -/*! - * Inherits from MongooseError. - */ - -DocumentError.prototype.__proto__ = MongooseError.prototype; - -/*! - * Module exports. - */ - -module.exports = exports = DocumentError; diff --git a/node_modules/mongoose/lib/errors/missingSchema.js b/node_modules/mongoose/lib/errors/missingSchema.js deleted file mode 100644 index 02a02ee..0000000 --- a/node_modules/mongoose/lib/errors/missingSchema.js +++ /dev/null @@ -1,32 +0,0 @@ - -/*! - * Module dependencies. - */ - -var MongooseError = require('../error'); - -/*! - * MissingSchema Error constructor. - * - * @inherits MongooseError - */ - -function MissingSchemaError (name) { - var msg = 'Schema hasn\'t been registered for model "' + name + '".\n' - + 'Use mongoose.model(name, schema)'; - MongooseError.call(this, msg); - Error.captureStackTrace(this, arguments.callee); - this.name = 'MissingSchemaError'; -}; - -/*! - * Inherits from MongooseError. - */ - -MissingSchemaError.prototype.__proto__ = MongooseError.prototype; - -/*! - * exports - */ - -module.exports = MissingSchemaError; diff --git a/node_modules/mongoose/lib/errors/overwriteModel.js b/node_modules/mongoose/lib/errors/overwriteModel.js deleted file mode 100644 index 2591581..0000000 --- a/node_modules/mongoose/lib/errors/overwriteModel.js +++ /dev/null @@ -1,30 +0,0 @@ - -/*! - * Module dependencies. - */ - -var MongooseError = require('../error'); - -/*! - * OverwriteModel Error constructor. - * - * @inherits MongooseError - */ - -function OverwriteModelError (name) { - MongooseError.call(this, 'Cannot overwrite `' + name + '` model once compiled.'); - Error.captureStackTrace(this, arguments.callee); - this.name = 'OverwriteModelError'; -}; - -/*! - * Inherits from MongooseError. - */ - -OverwriteModelError.prototype.__proto__ = MongooseError.prototype; - -/*! - * exports - */ - -module.exports = OverwriteModelError; diff --git a/node_modules/mongoose/lib/errors/validation.js b/node_modules/mongoose/lib/errors/validation.js deleted file mode 100644 index 08f2aaa..0000000 --- a/node_modules/mongoose/lib/errors/validation.js +++ /dev/null @@ -1,43 +0,0 @@ - -/*! - * Module requirements - */ - -var MongooseError = require('../error') - -/** - * Document Validation Error - * - * @api private - * @param {Document} instance - * @inherits MongooseError - */ - -function ValidationError (instance) { - MongooseError.call(this, "Validation failed"); - Error.captureStackTrace(this, arguments.callee); - this.name = 'ValidationError'; - this.errors = instance.errors = {}; -}; - -/** - * Console.log helper - */ - -ValidationError.prototype.toString = function () { - return this.name + ': ' + Object.keys(this.errors).map(function (key) { - return String(this.errors[key]); - }, this).join(', '); -}; - -/*! - * Inherits from MongooseError. - */ - -ValidationError.prototype.__proto__ = MongooseError.prototype; - -/*! - * Module exports - */ - -module.exports = exports = ValidationError; diff --git a/node_modules/mongoose/lib/errors/validator.js b/node_modules/mongoose/lib/errors/validator.js deleted file mode 100644 index 5499bee..0000000 --- a/node_modules/mongoose/lib/errors/validator.js +++ /dev/null @@ -1,45 +0,0 @@ -/*! - * Module dependencies. - */ - -var MongooseError = require('../error'); - -/** - * Schema validator error - * - * @param {String} path - * @param {String} msg - * @inherits MongooseError - * @api private - */ - -function ValidatorError (path, type) { - var msg = type - ? '"' + type + '" ' - : ''; - MongooseError.call(this, 'Validator ' + msg + 'failed for path ' + path); - Error.captureStackTrace(this, arguments.callee); - this.name = 'ValidatorError'; - this.path = path; - this.type = type; -}; - -/*! - * toString helper - */ - -ValidatorError.prototype.toString = function () { - return this.message; -} - -/*! - * Inherits from MongooseError - */ - -ValidatorError.prototype.__proto__ = MongooseError.prototype; - -/*! - * exports - */ - -module.exports = ValidatorError; diff --git a/node_modules/mongoose/lib/errors/version.js b/node_modules/mongoose/lib/errors/version.js deleted file mode 100644 index b2388aa..0000000 --- a/node_modules/mongoose/lib/errors/version.js +++ /dev/null @@ -1,31 +0,0 @@ - -/*! - * Module dependencies. - */ - -var MongooseError = require('../error'); - -/** - * Version Error constructor. - * - * @inherits MongooseError - * @api private - */ - -function VersionError () { - MongooseError.call(this, 'No matching document found.'); - Error.captureStackTrace(this, arguments.callee); - this.name = 'VersionError'; -}; - -/*! - * Inherits from MongooseError. - */ - -VersionError.prototype.__proto__ = MongooseError.prototype; - -/*! - * exports - */ - -module.exports = VersionError; diff --git a/node_modules/mongoose/lib/index.js b/node_modules/mongoose/lib/index.js deleted file mode 100644 index b0c0ed3..0000000 --- a/node_modules/mongoose/lib/index.js +++ /dev/null @@ -1,547 +0,0 @@ - -/*! - * Module dependencies. - */ - -var Schema = require('./schema') - , SchemaType = require('./schematype') - , VirtualType = require('./virtualtype') - , SchemaTypes = Schema.Types - , SchemaDefaults = require('./schemadefault') - , Types = require('./types') - , Query = require('./query') - , Promise = require('./promise') - , Model = require('./model') - , Document = require('./document') - , utils = require('./utils') - , format = utils.toCollectionName - , mongodb = require('mongodb') - -/** - * Mongoose constructor. - * - * The exports object of the `mongoose` module is an instance of this class. - * Most apps will only use this one instance. - * - * @api public - */ - -function Mongoose () { - this.connections = []; - this.plugins = []; - this.models = {}; - this.modelSchemas = {}; - this.options = {}; - this.createConnection(); // default connection -}; - -/** - * Sets mongoose options - * - * ####Example: - * - * mongoose.set('test', value) // sets the 'test' option to `value` - * - * @param {String} key - * @param {String} value - * @api public - */ - -Mongoose.prototype.set = function (key, value) { - if (arguments.length == 1) - return this.options[key]; - this.options[key] = value; - return this; -}; - -/** - * Gets mongoose options - * - * ####Example: - * - * mongoose.get('test') // returns the 'test' value - * - * @param {String} key - * @method get - * @api public - */ - -Mongoose.prototype.get = Mongoose.prototype.set; - -/*! - * ReplSet connection string check. - */ - -var rgxReplSet = /^.+,.+$/; - -/** - * Creates a Connection instance. - * - * Each `connection` instance maps to a single database. This method is helpful when mangaging multiple db connections. - * - * If arguments are passed, they are proxied to either [Connection#open](#connection_Connection-open) or [Connection#openSet](#connection_Connection-openSet) appropriately. This means we can pass `db`, `server`, and `replset` options to the driver. - * - * _Options passed take precedence over options included in connection strings._ - * - * ####Example: - * - * // with mongodb:// URI - * db = mongoose.createConnection('mongodb://user:pass@localhost:port/database'); - * - * // and options - * var opts = { db: { native_parser: true }} - * db = mongoose.createConnection('mongodb://user:pass@localhost:port/database', opts); - * - * // replica sets - * db = mongoose.createConnection('mongodb://user:pass@localhost:port/database,mongodb://anotherhost:port,mongodb://yetanother:port'); - * - * // and options - * var opts = { replset: { strategy: 'ping', rs_name: 'testSet' }} - * db = mongoose.createConnection('mongodb://user:pass@localhost:port/database,mongodb://anotherhost:port,mongodb://yetanother:port', opts); - * - * // with [host, database_name[, port] signature - * db = mongoose.createConnection('localhost', 'database', port) - * - * // and options - * var opts = { server: { auto_reconnect: false }, user: 'username', pass: 'mypassword' } - * db = mongoose.createConnection('localhost', 'database', port, opts) - * - * // initialize now, connect later - * db = mongoose.createConnection(); - * db.open('localhost', 'database', port, [opts]); - * - * @param {String} [uri] a mongodb:// URI - * @param {Object} [options] options to pass to the driver - * @see Connection#open #connection_Connection-open - * @see Connection#openSet #connection_Connection-openSet - * @return {Connection} the created Connection object - * @api public - */ - -Mongoose.prototype.createConnection = function () { - var conn = new Connection(this); - this.connections.push(conn); - - if (arguments.length) { - if (rgxReplSet.test(arguments[0])) { - conn.openSet.apply(conn, arguments); - } else { - conn.open.apply(conn, arguments); - } - } - - return conn; -}; - -/** - * Opens the default mongoose connection. - * - * If arguments are passed, they are proxied to either [Connection#open](#connection_Connection-open) or [Connection#openSet](#connection_Connection-openSet) appropriately. - * - * _Options passed take precedence over options included in connection strings._ - * - * @see Mongoose#createConnection #index_Mongoose-createConnection - * @api public - * @return {Mongoose} this - */ - -Mongoose.prototype.connect = function () { - var conn = this.connection; - - if (rgxReplSet.test(arguments[0])) { - conn.openSet.apply(conn, arguments); - } else { - conn.open.apply(conn, arguments); - } - - return this; -}; - -/** - * Disconnects all connections. - * - * @param {Function} [fn] called after all connection close. - * @return {Mongoose} this - * @api public - */ - -Mongoose.prototype.disconnect = function (fn) { - var count = this.connections.length - , error - - this.connections.forEach(function(conn){ - conn.close(function(err){ - if (error) return; - - if (err) { - error = err; - if (fn) return fn(err); - throw err; - } - - if (fn) - --count || fn(); - }); - }); - return this; -}; - -/** - * Defines a model or retrieves it. - * - * Models defined on the `mongoose` instance are available to all connection created by the same `mongoose` instance. - * - * ####Example: - * - * var mongoose = require('mongoose'); - * - * // define an Actor model with this mongoose instance - * mongoose.model('Actor', new Schema({ name: String })); - * - * // create a new connection - * var conn = mongoose.createConnection(..); - * - * // retrieve the Actor model - * var Actor = conn.model('Actor'); - * - * _When no `collection` argument is passed, Mongoose produces a collection name by passing the model `name` to the [utils.toCollectionName](#utils_exports.toCollectionName) method. This method pluralizes the name. If you don't like this behavior, either pass a collection name or set your schemas collection name option._ - * - * ####Example: - * - * var schema = new Schema({ name: String }, { collection: 'actor' }); - * - * // or - * - * schema.set('collection', 'actor'); - * - * // or - * - * var collectionName = 'actor' - * var M = mongoose.model('Actor', schema, collectionName) - * - * @param {String} name model name - * @param {Schema} [schema] - * @param {String} [collection] name (optional, induced from model name) - * @param {Boolean} [skipInit] whether to skip initialization (defaults to false) - * @api public - */ - -Mongoose.prototype.model = function (name, schema, collection, skipInit) { - if (!(schema instanceof Schema)) { - collection = schema; - schema = false; - } - - if ('boolean' === typeof collection) { - skipInit = collection; - collection = null; - } - - // handle internal options from connection.model() - var options; - if (skipInit && utils.isObject(skipInit)) { - options = skipInit; - skipInit = true; - } else { - options = {}; - } - - // look up schema for the collection. this might be a - // default schema like system.indexes stored in SchemaDefaults. - if (!this.modelSchemas[name]) { - if (!schema && name in SchemaDefaults) { - schema = SchemaDefaults[name]; - } - - if (schema) { - // cache it so we only apply plugins once - this.modelSchemas[name] = schema; - this._applyPlugins(schema); - } else { - throw new mongoose.Error.MissingSchemaError(name); - } - } - - var model; - var sub; - - // connection.model() may be passing a different schema for - // an existing model name. in this case don't read from cache. - if (this.models[name] && false !== options.cache) { - if (schema instanceof Schema && schema != this.models[name].schema) { - throw new mongoose.Error.OverwriteModelError(name); - } - - if (collection) { - // subclass current model with alternate collection - model = this.models[name]; - schema = model.prototype.schema; - sub = model.__subclass(this.connection, schema, collection); - // do not cache the sub model - return sub; - } - - return this.models[name]; - } - - // ensure a schema exists - if (!schema) { - schema = this.modelSchemas[name]; - if (!schema) { - throw new mongoose.Error.MissingSchemaError(name); - } - } - - if (!collection) { - collection = schema.get('collection') || format(name); - } - - var connection = options.connection || this.connection; - model = Model.compile(name, schema, collection, connection, this); - - if (!skipInit) { - model.init(); - } - - if (false === options.cache) { - return model; - } - - return this.models[name] = model; -} - -/** - * Applies global plugins to `schema`. - * - * @param {Schema} schema - * @api private - */ - -Mongoose.prototype._applyPlugins = function (schema) { - for (var i = 0, l = this.plugins.length; i < l; i++) { - schema.plugin(this.plugins[i][0], this.plugins[i][1]); - } -} - -/** - * Declares a global plugin executed on all Schemas. - * - * Equivalent to calling `.plugin(fn)` on each Schema you create. - * - * @param {Function} fn plugin callback - * @param {Object} [opts] optional options - * @return {Mongoose} this - * @see plugins ./plugins.html - * @api public - */ - -Mongoose.prototype.plugin = function (fn, opts) { - this.plugins.push([fn, opts]); - return this; -}; - -/** - * The default connection of the mongoose module. - * - * ####Example: - * - * var mongoose = require('mongoose'); - * mongoose.connect(...); - * mongoose.connection.on('error', cb); - * - * This is the connection used by default for every model created using [mongoose.model](#index_Mongoose-model). - * - * @property connection - * @return {Connection} - * @api public - */ - -Mongoose.prototype.__defineGetter__('connection', function(){ - return this.connections[0]; -}); - -/*! - * Driver depentend APIs - */ - -var driver = global.MONGOOSE_DRIVER_PATH || './drivers/node-mongodb-native'; - -/*! - * Connection - */ - -var Connection = require(driver + '/connection'); - -/*! - * Collection - */ - -var Collection = require(driver + '/collection'); - -/** - * The exports object is an instance of Mongoose. - * - * @api public - */ - -module.exports = exports = new Mongoose; -var mongoose = module.exports; - -/** - * The Mongoose Collection constructor - * - * @api public - */ - -mongoose.Collection = Collection; - -/** - * The Mongoose Connection constructor - * - * @api public - */ - -mongoose.Connection = Connection; - -/** - * Mongoose version - * - * @api public - */ - -mongoose.version = JSON.parse( - require('fs').readFileSync(__dirname + '/../package.json', 'utf8') -).version; - -/** - * The Mongoose constructor - * - * The exports of the mongoose module is an instance of this class. - * - * ####Example: - * - * var mongoose = require('mongoose'); - * var mongoose2 = new mongoose.Mongoose(); - * - * @api public - */ - -mongoose.Mongoose = Mongoose; - -/** - * The Mongoose Schema constructor - * - * ####Example: - * - * var mongoose = require('mongoose'); - * var Schema = mongoose.Schema; - * var CatSchema = new Schema(..); - * - * @api public - */ - -mongoose.Schema = Schema; - -/** - * The Mongoose SchemaType constructor. - * - * @api public - */ - -mongoose.SchemaType = SchemaType; - -/** - * The various Mongoose SchemaTypes. - * - * ####Note: - * - * _Alias of mongoose.Schema.Types for backwards compatibility._ - * - * @see Schema.SchemaTypes #schema_Schema.Types - * @api public - */ - -mongoose.SchemaTypes = Schema.Types; - -/** - * The Mongoose VirtualType constructor. - * - * @api public - */ - -mongoose.VirtualType = VirtualType; - -/** - * The various Mongoose Types. - * - * ####Example: - * - * var mongoose = require('mongoose'); - * var array = mongoose.Types.Array; - * - * ####Types: - * - * - Array - * - Buffer - * - Document - * - Embedded - * - DocumentArray - * - ObjectId - * - * Using this exposed access to the `ObjectId` type, we can construct ids on demand. - * - * var ObjectId = mongoose.Types.ObjectId; - * var id1 = new ObjectId; - * - * @api public - */ - -mongoose.Types = Types; - -/** - * The Mongoose Query constructor. - * - * @api public - */ - -mongoose.Query = Query; - -/** - * The Mongoose Promise constructor. - * - * @api public - */ - -mongoose.Promise = Promise; - -/** - * The Mongoose Model constructor. - * - * @api public - */ - -mongoose.Model = Model; - -/** - * The Mongoose Document constructor. - * - * @api public - */ - -mongoose.Document = Document; - -/** - * The MongooseError constructor. - * - * @api public - */ - -mongoose.Error = require('./error'); - -/** - * The node-mongodb-native driver Mongoose uses. - * - * @api public - */ - -mongoose.mongo = require('mongodb'); diff --git a/node_modules/mongoose/lib/model.js b/node_modules/mongoose/lib/model.js deleted file mode 100644 index e84a65d..0000000 --- a/node_modules/mongoose/lib/model.js +++ /dev/null @@ -1,1822 +0,0 @@ -/*! - * Module dependencies. - */ - -var Document = require('./document') - , MongooseArray = require('./types/array') - , MongooseBuffer = require('./types/buffer') - , MongooseError = require('./error') - , VersionError = require('./errors/version') - , Query = require('./query') - , Schema = require('./schema') - , utils = require('./utils') - , isMongooseObject = utils.isMongooseObject - , EventEmitter = require('events').EventEmitter - , merge = utils.merge - , Promise = require('./promise') - , tick = utils.tick - -var VERSION_WHERE = 1 - , VERSION_INC = 2 - , VERSION_ALL = VERSION_WHERE | VERSION_INC; - -/** - * Model constructor - * - * @param {Object} doc values to with which to create the document - * @inherits Document - * @event `error`: If listening to this Model event, it is emitted when a document was saved without passing a callback and an `error` occurred. If not listening, the event bubbles to the connection used to create this Model. - * @event `index`: Emitted after `Model#ensureIndexes` completes. If an error occurred it is passed with the event. - * @api public - */ - -function Model (doc, fields, skipId) { - Document.call(this, doc, fields, skipId); -}; - -/*! - * Inherits from Document. - * - * All Model.prototype features are available on - * top level (non-sub) documents. - */ - -Model.prototype.__proto__ = Document.prototype; - -/** - * Connection the model uses. - * - * @api public - * @property db - */ - -Model.prototype.db; - -/** - * Collection the model uses. - * - * @api public - * @property collection - */ - -Model.prototype.collection; - -/** - * The name of the model - * - * @api public - * @property modelName - */ - -Model.prototype.modelName; - -/** - * Returns what paths can be populated - * - * @param {Query} query object - * @return {Object|undefined} population paths - * @api private - */ - -Model.prototype._getPopulationKeys = function getPopulationKeys (query) { - if (!(query && query.options.populate)) return; - - var names = Object.keys(query.options.populate) - , n = names.length - , name - , paths = {} - , hasKeys - , schema - - while (n--) { - name = names[n]; - schema = this.schema.path(name); - hasKeys = true; - - if (!schema) { - // if the path is not recognized, it's potentially embedded docs - // walk path atoms from right to left to find a matching path - var pieces = name.split('.') - , i = pieces.length; - - while (i--) { - var path = pieces.slice(0, i).join('.') - , pathSchema = this.schema.path(path); - - // loop until we find an array schema - if (pathSchema && pathSchema.caster) { - if (!paths[path]) { - paths[path] = { sub: {} }; - } - - paths[path].sub[pieces.slice(i).join('.')] = query.options.populate[name]; - hasKeys || (hasKeys = true); - break; - } - } - } else { - paths[name] = query.options.populate[name]; - hasKeys || (hasKeys = true); - } - } - - return hasKeys && paths; -}; - -/** - * Populates an object - * - * @param {SchemaType} schema type for the oid - * @param {Object} oid object id or array of object ids - * @param {Object} query object specifying query conditions, fields, and options - * @param {Function} fn - * @api private - */ - -Model.prototype._populate = function populate (schema, oid, query, fn) { - if (!Array.isArray(oid)) { - var conditions = query.conditions || {}; - conditions._id = oid; - - return this - .db.model(query.model || schema.options.ref) - .findOne(conditions, query.fields, query.options, fn); - } - - if (!oid.length) { - return fn(null, oid); - } - - var model = this.db.model(query.model || schema.caster.options.ref) - , conditions = query && query.conditions || {}; - - conditions._id || (conditions._id = { $in: oid }); - - model.find(conditions, query.fields, query.options, function (err, docs) { - if (err) return fn(err); - - // user specified sort order? - if (query.options && query.options.sort) { - return fn(null, docs); - } - - // put back in original id order (using a hash reduces complexity from n*n to 2n) - var docHash = {}; - docs.forEach(function (doc) { - docHash[doc._id] = doc; - }); - - var arr = []; - oid.forEach(function (id) { - if (id in docHash) arr.push(docHash[id]); - }); - - fn(null, arr); - }); -}; - -/** - * Performs auto-population of relations. - * - * @param {Object} doc document returned by mongo - * @param {Query} query query that originated the initialization - * @param {Function} fn - * @api private - */ - -Model.prototype.init = function init (doc, query, fn) { - if ('function' == typeof query) { - fn = query; - query = null; - } - - var populate = this._getPopulationKeys(query); - - if (!populate) { - return Document.prototype.init.call(this, doc, fn); - } - - // population from other models is necessary - var self = this; - - init(doc, '', function (err) { - if (err) return fn(err); - Document.prototype.init.call(self, doc, fn); - }); - - return this; - - function init (obj, prefix, fn) { - prefix = prefix || ''; - - var keys = Object.keys(obj) - , len = keys.length; - - return next(); - - function next () { - if (--len < 0) return fn(); - - var i = keys[len] - , path = prefix + i - , schema = self.schema.path(path) - , total = 0 - , inline = false - , poppath - - if (!schema && obj[i] && 'Object' === obj[i].constructor.name) { - // assume nested object - return init(obj[i], path + '.', next); - } - - if (!(obj[i] && schema && populate[path])) return next(); - - // this query object is re-used and passed around. we clone - // it to prevent query condition contamination between - // one populate call to the next. - poppath = utils.clone(populate[path]); - - if (poppath.sub) { - obj[i].forEach(function (subobj) { - inline = true; - - var pkeys = Object.keys(poppath.sub) - , pi = pkeys.length - , key - - while (pi--) { - key = pkeys[pi]; - - if (subobj[key]) (function (key) { - total++; - self._populate(schema.schema.path(key), subobj[key], poppath.sub[key], done); - function done (err, doc) { - if (err) return error(err); - subobj[key] = doc; - if (--total < 1 && !inline) { - next(); - } - } - })(key); - } - }); - - inline = false; - - if (0 === total) return next(); - - } else { - self._populate(schema, obj[i], poppath, function (err, doc) { - if (err) return error(err); - obj[i] = doc; - next(); - }); - } - }; - }; - - function error (err) { - if (error.err) return; - fn(error.err = err); - } -}; - -/*! - * Handles doc.save() callbacks - */ - -function handleSave (promise, self) { - return tick(function handleSave (err, result) { - if (err) { - // If the initial insert fails provide a second chance. - // (If we did this all the time we would break updates) - if (self._inserting) { - self.isNew = true; - self.emit('isNew', true); - } - promise.error(err); - promise = self = null; - return; - } - - self._storeShard(); - - var numAffected; - if (result) { - // when inserting, the array of created docs is returned - numAffected = result.length - ? result.length - : result; - } else { - numAffected = 0; - } - - // was this an update that required a version bump? - if (self.__version && !self._inserting) { - var doIncrement = VERSION_INC === (VERSION_INC & self.__version); - self.__version = undefined; - - // increment version if was successful - if (numAffected > 0) { - if (doIncrement) { - var key = self.schema.options.versionKey; - var version = self.getValue(key) | 0; - self.setValue(key, version + 1); - } - } else { - // the update failed. pass an error back - promise.error(new VersionError); - promise = self = null; - return; - } - } - - self.emit('save', self, numAffected); - promise.complete(self, numAffected); - promise = self = null; - }); -} - -/** - * Saves this document. - * - * ####Example: - * - * product.sold = Date.now(); - * product.save(function (err, product) { - * if (err) .. - * }) - * - * The `fn` callback is optional. If no `fn` is passed and validation fails, the validation error will be emitted on the connection used to create this model. - * - * var db = mongoose.createConnection(..); - * var schema = new Schema(..); - * var Product = db.model('Product', schema); - * - * db.on('error', handleError); - * - * However, if you desire more local error handling you can add an `error` listener to the model and handle errors there instead. - * - * Product.on('error', handleError); - * - * @param {Function} [fn] optional callback - * @api public - * @see middleware http://mongoosejs.com/docs/middleware.html - */ - -Model.prototype.save = function save (fn) { - var promise = new Promise(fn) - , complete = handleSave(promise, this) - , options = {} - - if (this.schema.options.safe) { - options.safe = this.schema.options.safe; - } - - if (this.isNew) { - // send entire doc - var obj = this.toObject({ depopulate: 1 }); - this._version(true, obj); - this.collection.insert(obj, options, complete); - this._reset(); - this.isNew = false; - this.emit('isNew', false); - // Make it possible to retry the insert - this._inserting = true; - - } else { - // Make sure we don't treat it as a new object on error, - // since it already exists - this._inserting = false; - - var delta = this._delta(); - if (delta) { - var where = this._where(delta[0]); - this.collection.update(where, delta[1], options, complete); - } else { - process.nextTick(function () { - complete(null); - }) - } - - this._reset(); - this.emit('isNew', false); - } -}; - -/*! - * Apply the operation to the delta (update) clause as - * well as track versioning for our where clause. - * - * @param {Document} self - * @param {Object} where - * @param {Object} delta - * @param {Object} data - * @param {Mixed} val - * @param {String} [operation] - */ - -function operand (self, where, delta, data, val, op) { - // delta - op || (op = '$set'); - if (!delta[op]) delta[op] = {}; - delta[op][data.path] = val; - - // disabled versioning? - if (false === self.schema.options.versionKey) return; - - // already marked for versioning? - if (VERSION_ALL === (VERSION_ALL & self.__version)) return; - - switch (op) { - case '$set': - case '$unset': - case '$pop': - case '$pull': - case '$pullAll': - case '$push': - case '$pushAll': - case '$addToSet': - break; - default: - // nothing to do - return; - } - - // ensure updates sent with positional notation are - // editing the correct array element. - // only increment the version if an array position changes. - // modifying elements of an array is ok if position does not change. - - if ('$push' == op || '$pushAll' == op || '$addToSet' == op) { - self.__version = VERSION_INC; - } - else if (/^\$p/.test(op)) { - // potentially changing array positions - self.increment(); - } - else if (Array.isArray(val)) { - // $set an array - self.increment(); - } - // now handling $set, $unset - else if (/\.\d+/.test(data.path)) { - // subpath of array - self.__version = VERSION_WHERE; - } -} - -/*! - * Compiles an update and where clause for a `val` with _atomics. - * - * @param {Document} self - * @param {Object} where - * @param {Object} delta - * @param {Object} data - * @param {Array} val - */ - -function handleAtomics (self, where, delta, data, val) { - if (delta.$set && delta.$set[data.path]) { - // $set has precedence over other atomics - return; - } - - var atomics = val._atomics - , ops = Object.keys(atomics) - , schema = data.schema - , path = data.path - , i = ops.length - , val - , op; - - if (0 === i) { - // $set - - if (isMongooseObject(val)) { - val = val.toObject({ depopulate: 1 }); - } else if (val.valueOf) { - val = val.valueOf(); - } - - return operand(self, where, delta, data, val); - } - - while (i--) { - op = ops[i]; - val = atomics[op]; - if (isMongooseObject(val)) { - val = val.toObject({ depopulate: 1 }) - } else if (Array.isArray(val)) { - val = val.map(function (mem) { - return isMongooseObject(mem) - ? mem.toObject({ depopulate: 1 }) - : mem; - }) - } else if (val.valueOf) { - val = val.valueOf() - } - - if ('$addToSet' === op) - val = { $each: val }; - - operand(self, where, delta, data, val, op); - } -} - -/** - * Produces a special query document of the modified properties used in updates. - * - * @api private - */ - -Model.prototype._delta = function _delta () { - var dirty = this._dirty(); - if (!dirty.length) return; - - var self = this - , where = {} - , delta = {} - , len = dirty.length - , d = 0 - , val - , obj - - for (; d < len; ++d) { - var data = dirty[d] - var value = data.value - var schema = data.schema - - if (undefined === value) { - operand(self, where, delta, data, 1, '$unset'); - - } else if (null === value) { - operand(self, where, delta, data, null); - - } else if (value._path && value._atomics) { - // arrays and other custom types (support plugins etc) - handleAtomics(self, where, delta, data, value); - - } else if (value._path && Buffer.isBuffer(value)) { - // MongooseBuffer - value = value.toObject(); - operand(self, where, delta, data, value); - - } else { - value = utils.clone(value); - operand(self, where, delta, data, value); - } - } - - if (this.__version) { - this._version(where, delta); - } - - return [where, delta]; -} - -/** - * Appends versioning to the where and update clauses. - * - * @api private - */ - -Model.prototype._version = function _version (where, delta) { - var key = this.schema.options.versionKey; - - if (true === where) { - // this is an insert - if (key) this.setValue(key, delta[key] = 0); - return; - } - - // updates - - // only apply versioning if our versionKey was selected. else - // there is no way to select the correct version. we could fail - // fast here and force them to include the versionKey but - // thats a bit intrusive. can we do this automatically? - // TODO fail fast option? - if (!this.isSelected(key)) { - return; - } - - // $push $addToSet don't need the where clause set - if (VERSION_WHERE === (VERSION_WHERE & this.__version)) { - where[key] = this.getValue(key); - } - - if (VERSION_INC === (VERSION_INC & this.__version)) { - delta.$inc || (delta.$inc = {}); - delta.$inc[key] = 1; - } -} - -/** - * Signal that we desire an increment of this documents version. - * - * @see versionKeys http://mongoosejs.com/docs/guide.html#versionKey - * @api public - */ - -Model.prototype.increment = function increment () { - this.__version = VERSION_ALL; - return this; -} - -/** - * Returns a query object which applies shardkeys if they exist. - * - * @api private - */ - -Model.prototype._where = function _where (where) { - where || (where = {}); - - var paths - , len - - if (this._shardval) { - paths = Object.keys(this._shardval) - len = paths.length - - for (var i = 0; i < len; ++i) { - where[paths[i]] = this._shardval[paths[i]]; - } - } - - where._id = this._doc._id; - return where; -} - -/** - * Removes this document from the db. - * - * ####Example: - * - * product.remove(function (err, product) { - * if (err) return handleError(err); - * Product.findById(product._id, function (err, product) { - * console.log(product) // null - * }) - * }) - * - * @param {Function} [fn] optional callback - * @api public - */ - -Model.prototype.remove = function remove (fn) { - if (this._removing) { - this._removing.addBack(fn); - return this; - } - - var promise = this._removing = new Promise(fn) - , where = this._where() - , self = this - , options = {} - - if (this.schema.options.safe) { - options.safe = this.schema.options.safe; - } - - this.collection.remove(where, options, tick(function (err) { - if (err) { - promise.error(err); - promise = self = self._removing = where = options = null; - return; - } - self.emit('remove', self); - promise.complete(); - promise = self = where = options = null; - })); - - return this; -}; - -/** - * Register hooks override - * - * @api private - */ - -Model.prototype._registerHooks = function registerHooks () { - Document.prototype._registerHooks.call(this); -}; - -/** - * Returns another Model instance. - * - * ####Example: - * - * var doc = new Tank; - * doc.model('User').findById(id, callback); - * - * @param {String} name model name - * @api public - */ - -Model.prototype.model = function model (name) { - return this.db.model(name); -}; - -// Model (class) features - -/*! - * Give the constructor the ability to emit events. - */ - -for (var i in EventEmitter.prototype) - Model[i] = EventEmitter.prototype[i]; - -/** - * Called when the model compiles. - * - * @api private - */ - -Model.init = function init () { - if (this.schema.options.autoIndex) { - this.ensureIndexes(); - } - - this.schema.emit('init', this); -}; - -/** - * Sends `ensureIndex` commands to mongo for each index declared in the schema. - * - * ####Example: - * - * Event.ensureIndexes(function (err) { - * if (err) return handleError(err); - * }); - * - * After completion, an `index` event is emitted on this `Model` passing an error if one occurred. - * - * ####Example: - * - * var eventSchema = new Schema({ thing: { type: 'string', unique: true }}) - * var Event = mongoose.model('Event', eventSchema); - * - * Event.on('index', function (err) { - * if (err) console.error(err); // error occurred during index creation - * }) - * - * _NOTE: It is not recommended that you run this in production. Index creation may impact database performance depending on your load. Use with caution._ - * - * @param {Function} [cb] optional callback - * @api public - */ - -Model.ensureIndexes = function ensureIndexes (cb) { - var indexes = this.schema.indexes(); - if (!indexes.length) { - return cb && cb(); - } - - var self = this - , safe = self.schema.options.safe - , count = indexes.length - , error - - indexes.forEach(function (index) { - var options = index[1]; - options.safe = safe; - self.collection.ensureIndex(index[0], options, tick(function (err) { - if (err) error = err; - if (--count) return; - - self.emit('index', error); - cb && cb(error); - })); - }); -} - -/** - * Schema the model uses. - * - * @property schema - * @receiver Model - * @api public - */ - -Model.schema; - -/*! - * Connection instance the model uses. - * - * @property db - * @receiver Model - * @api public - */ - -Model.db; - -/*! - * Collection the model uses. - * - * @property collection - * @receiver Model - * @api public - */ - -Model.collection; - -/** - * Base Mongoose instance the model uses. - * - * @property base - * @receiver Model - * @api public - */ - -Model.base; - -/** - * Removes documents from the collection. - * - * ####Example: - * - * Comment.remove({ title: 'baby born from alien father' }, function (err) { - * - * }); - * - * ####Note: - * - * To remove documents without waiting for a response from MongoDB, do not pass a `callback`, then call `exec` on the returned [Query](#query-js): - * - * var query = Comment.remove({ _id: id }); - * query.exec(); - * - * ####Note: - * - * This method sends a remove command directly to MongoDB, no Mongoose documents are involved. Because no Mongoose documents are involved, _no middleware (hooks) are executed_. - * - * @param {Object} conditions - * @param {Function} [callback] - * @return {Query} - * @api public - */ - -Model.remove = function remove (conditions, callback) { - if ('function' === typeof conditions) { - callback = conditions; - conditions = {}; - } - - var query = new Query(conditions).bind(this, 'remove'); - - if ('undefined' === typeof callback) - return query; - - this._applyNamedScope(query); - return query.remove(callback); -}; - -/** - * Finds documents - * - * The `conditions` are cast to their respective SchemaTypes before the command is sent. - * - * ####Examples: - * - * // named john and at least 18 - * MyModel.find({ name: 'john', age: { $gte: 18 }}); - * - * // executes immediately, passing results to callback - * MyModel.find({ name: 'john', age: { $gte: 18 }}, function (err, docs) {}); - * - * // name LIKE john and only selecting the "name" and "friends" fields, executing immediately - * MyModel.find({ name: /john/i }, 'name friends', function (err, docs) { }) - * - * // passing options - * MyModel.find({ name: /john/i }, null, { skip: 10 }) - * - * // passing options and executing immediately - * MyModel.find({ name: /john/i }, null, { skip: 10 }, function (err, docs) {}); - * - * // executing a query explicitly - * var query = MyModel.find({ name: /john/i }, null, { skip: 10 }) - * query.exec(function (err, docs) {}); - * - * // using the promise returned from executing a query - * var query = MyModel.find({ name: /john/i }, null, { skip: 10 }); - * var promise = query.exec(); - * promise.addBack(function (err, docs) {}); - * - * @param {Object} conditions - * @param {Object} [fields] optional fields to select - * @param {Object} [options] optional - * @param {Function} [callback] - * @return {Query} - * @see field selection #query_Query-select - * @see promise #promise-js - * @api public - */ - -Model.find = function find (conditions, fields, options, callback) { - if ('function' == typeof conditions) { - callback = conditions; - conditions = {}; - fields = null; - options = null; - } else if ('function' == typeof fields) { - callback = fields; - fields = null; - options = null; - } else if ('function' == typeof options) { - callback = options; - options = null; - } - - var query = new Query(conditions, options); - query.bind(this, 'find'); - query.select(fields); - - if ('undefined' === typeof callback) - return query; - - this._applyNamedScope(query); - return query.find(callback); -}; - -/** - * Merges the current named scope query into `query`. - * - * @param {Query} query - * @return {Query} - * @api private - */ - -Model._applyNamedScope = function _applyNamedScope (query) { - var cQuery = this._cumulativeQuery; - - if (cQuery) { - merge(query._conditions, cQuery._conditions); - if (query._fields && cQuery._fields) - merge(query._fields, cQuery._fields); - if (query.options && cQuery.options) - merge(query.options, cQuery.options); - delete this._cumulativeQuery; - } - - return query; -} - -/** - * Finds a single document by id. - * - * The `id` is cast based on the Schema before sending the command. - * - * ####Example: - * - * // find adventure by id and execute immediately - * Adventure.findById(id, function (err, adventure) {}); - * - * // same as above - * Adventure.findById(id).exec(callback); - * - * // select only the adventures name and length - * Adventure.findById(id, 'name length', function (err, adventure) {}); - * - * // same as above - * Adventure.findById(id, 'name length').exec(callback); - * - * // include all properties except for `length` - * Adventure.findById(id, '-length').exec(function (err, adventure) {}); - * - * // passing options (in this case return the raw js objects, not mongoose documents by passing `lean` - * Adventure.findById(id, 'name', { lean: true }, function (err, doc) {}); - * - * // same as above - * Adventure.findById(id, 'name').lean().exec(function (err, doc) {}); - * - * @param {ObjectId|HexId} id objectid, or a value that can be casted to one - * @param {Object} [fields] optional fields to select - * @param {Object} [options] optional - * @param {Function} [callback] - * @return {Query} - * @see field selection #query_Query-select - * @see lean queries #query_Query-lean - * @api public - */ - -Model.findById = function findById (id, fields, options, callback) { - return this.findOne({ _id: id }, fields, options, callback); -}; - -/** - * Finds one document. - * - * The `conditions` are cast to their respective SchemaTypes before the command is sent. - * - * ####Example: - * - * // find one iphone adventures - iphone adventures?? - * Adventure.findOne({ type: 'iphone' }, function (err, adventure) {}); - * - * // same as above - * Adventure.findOne({ type: 'iphone' }).exec(function (err, adventure) {}); - * - * // select only the adventures name - * Adventure.findOne({ type: 'iphone' }, 'name', function (err, adventure) {}); - * - * // same as above - * Adventure.findOne({ type: 'iphone' }, 'name').exec(function (err, adventure) {}); - * - * // specify options, in this case lean - * Adventure.findOne({ type: 'iphone' }, 'name', { lean: true }, callback); - * - * // same as above - * Adventure.findOne({ type: 'iphone' }, 'name', { lean: true }).exec(callback); - * - * // chaining findOne queries (same as above) - * Adventure.findOne({ type: 'iphone' }).select('name').lean().exec(callback); - * - * @param {Object} conditions - * @param {Object} [fields] optional fields to select - * @param {Object} [options] optional - * @param {Function} [callback] - * @return {Query} - * @see field selection #query_Query-select - * @see lean queries #query_Query-lean - * @api public - */ - -Model.findOne = function findOne (conditions, fields, options, callback) { - if ('function' == typeof options) { - callback = options; - options = null; - } else if ('function' == typeof fields) { - callback = fields; - fields = null; - options = null; - } else if ('function' == typeof conditions) { - callback = conditions; - conditions = {}; - fields = null; - options = null; - } - - var query = new Query(conditions, options).select(fields).bind(this, 'findOne'); - - if ('undefined' == typeof callback) - return query; - - this._applyNamedScope(query); - return query.findOne(callback); -}; - -/** - * Counts number of matching documents in a database collection. - * - * ####Example: - * - * Adventure.count({ type: 'jungle' }, function (err, count) { - * if (err) .. - * console.log('there are %d jungle adventures', count); - * }); - * - * @param {Object} conditions - * @param {Function} [callback] - * @return {Query} - * @api public - */ - -Model.count = function count (conditions, callback) { - if ('function' === typeof conditions) - callback = conditions, conditions = {}; - - var query = new Query(conditions).bind(this, 'count'); - if ('undefined' == typeof callback) - return query; - - this._applyNamedScope(query); - return query.count(callback); -}; - -/** - * Executes a DISTINCT command - * - * @param {String} field - * @param {Object} [conditions] optional - * @param {Function} [callback] - * @return {Query} - * @api public - */ - -Model.distinct = function distinct (field, conditions, callback) { - var query = new Query(conditions).bind(this, 'distinct'); - if ('undefined' == typeof callback) { - query._distinctArg = field; - return query; - } - - this._applyNamedScope(query); - return query.distinct(field, callback); -}; - -/** - * Creates a Query, applies the passed conditions, and returns the Query. - * - * For example, instead of writing: - * - * User.find({age: {$gte: 21, $lte: 65}}, callback); - * - * we can instead write: - * - * User.where('age').gte(21).lte(65).exec(callback); - * - * Since the Query class also supports `where` you can continue chaining - * - * User - * .where('age').gte(21).lte(65) - * .where('name', /^b/i) - * ... etc - * - * @param {String} path - * @param {Object} [val] optional value - * @return {Query} - * @api public - */ - -Model.where = function where (path, val) { - var q = new Query().bind(this, 'find'); - return q.where.apply(q, arguments); -}; - -/** - * Creates a `Query` and specifies a `$where` condition. - * - * Sometimes you need to query for things in mongodb using a JavaScript expression. You can do so via `find({ $where: javascript })`, or you can use the mongoose shortcut method $where via a Query chain or from your mongoose Model. - * - * Blog.$where('this.comments.length > 5').exec(function (err, docs) {}); - * - * @param {String|Function} argument is a javascript string or anonymous function - * @method $where - * @memberOf Model - * @return {Query} - * @see Query.$where #query_Query-%24where - * @api public - */ - -Model.$where = function $where () { - var q = new Query().bind(this, 'find'); - return q.$where.apply(q, arguments); -}; - -/** - * Issues a mongodb findAndModify update command. - * - * Finds a matching document, updates it according to the `update` arg, passing any `options`, and returns the found document (if any) to the callback. The query executes immediately if `callback` is passed else a Query object is returned. - * - * ####Options: - * - * - `new`: bool - true to return the modified document rather than the original. defaults to true - * - `upsert`: bool - creates the object if it doesn't exist. defaults to false. - * - `sort`: if multiple docs are found by the conditions, sets the sort order to choose which doc to update - * - `select`: sets the document fields to return - * - * ####Examples: - * - * A.findOneAndUpdate(conditions, update, options, callback) // executes - * A.findOneAndUpdate(conditions, update, options) // returns Query - * A.findOneAndUpdate(conditions, update, callback) // executes - * A.findOneAndUpdate(conditions, update) // returns Query - * A.findOneAndUpdate() // returns Query - * - * ####Note: - * - * All top level update keys which are not `atomic` operation names are treated as set operations: - * - * ####Example: - * - * var query = { name: 'borne' }; - * Model.findOneAndUpdate(query, { name: 'jason borne' }, options, callback) - * - * // is sent as - * Model.findOneAndUpdate(query, { $set: { name: 'jason borne' }}, options, callback) - * - * This helps prevent accidentally overwriting your document with `{ name: 'jason borne' }`. - * - * ####Note: - * - * Although values are cast to their appropriate types when using the findAndModify helpers, the following are *not* applied: - * - * - defaults - * - setters - * - validators - * - middleware - * - * If you need those features, use the traditional approach of first retrieving the document. - * - * Model.findOne({ name: 'borne' }, function (err, doc) { - * if (err) .. - * doc.name = 'jason borne'; - * doc.save(callback); - * }) - * - * @param {Object} [conditions] - * @param {Object} [update] - * @param {Object} [options] - * @param {Function} [callback] - * @return {Query} - * @see mongodb http://www.mongodb.org/display/DOCS/findAndModify+Command - * @api public - */ - -Model.findOneAndUpdate = function (conditions, update, options, callback) { - if ('function' == typeof options) { - callback = options; - options = null; - } - else if (1 === arguments.length) { - if ('function' == typeof conditions) { - var msg = 'Model.findOneAndUpdate(): First argument must not be a function.\n\n' - + ' ' + this.modelName + '.findOneAndUpdate(conditions, update, options, callback)\n' - + ' ' + this.modelName + '.findOneAndUpdate(conditions, update, options)\n' - + ' ' + this.modelName + '.findOneAndUpdate(conditions, update)\n' - + ' ' + this.modelName + '.findOneAndUpdate(update)\n' - + ' ' + this.modelName + '.findOneAndUpdate()\n'; - throw new TypeError(msg) - } - update = conditions; - conditions = undefined; - } - - var fields; - if (options && options.fields) { - fields = options.fields; - options.fields = undefined; - } - - var query = new Query(conditions); - query.setOptions(options); - query.select(fields); - query.bind(this, 'findOneAndUpdate', update); - - if ('undefined' == typeof callback) - return query; - - this._applyNamedScope(query); - return query.findOneAndUpdate(callback); -} - -/** - * Issues a mongodb findAndModify update command by a documents id. - * - * Finds a matching document, updates it according to the `update` arg, passing any `options`, and returns the found document (if any) to the callback. The query executes immediately if `callback` is passed else a Query object is returned. - * - * ####Options: - * - * - `new`: bool - true to return the modified document rather than the original. defaults to true - * - `upsert`: bool - creates the object if it doesn't exist. defaults to false. - * - `sort`: if multiple docs are found by the conditions, sets the sort order to choose which doc to update - * - `select`: sets the document fields to return - * - * ####Examples: - * - * A.findByIdAndUpdate(id, update, options, callback) // executes - * A.findByIdAndUpdate(id, update, options) // returns Query - * A.findByIdAndUpdate(id, update, callback) // executes - * A.findByIdAndUpdate(id, update) // returns Query - * A.findByIdAndUpdate() // returns Query - * - * Finds a matching document, updates it according to the `update` arg, passing any `options`, and returns the found document (if any) to the callback. The query executes immediately if `callback` is passed else a Query object is returned. - * - * ####Options: - * - * - `new`: bool - true to return the modified document rather than the original. defaults to true - * - `upsert`: bool - creates the object if it doesn't exist. defaults to false. - * - `sort`: if multiple docs are found by the conditions, sets the sort order to choose which doc to update - * - * ####Note: - * - * All top level update keys which are not `atomic` operation names are treated as set operations: - * - * ####Example: - * - * Model.findByIdAndUpdate(id, { name: 'jason borne' }, options, callback) - * - * // is sent as - * Model.findByIdAndUpdate(id, { $set: { name: 'jason borne' }}, options, callback) - * - * This helps prevent accidentally overwriting your document with `{ name: 'jason borne' }`. - * - * ####Note: - * - * Although values are cast to their appropriate types when using the findAndModify helpers, the following are *not* applied: - * - * - defaults - * - setters - * - validators - * - middleware - * - * If you need those features, use the traditional approach of first retrieving the document. - * - * Model.findById(id, function (err, doc) { - * if (err) .. - * doc.name = 'jason borne'; - * doc.save(callback); - * }) - * - * @param {ObjectId|HexId} id an ObjectId or string that can be cast to one. - * @param {Object} [update] - * @param {Object} [options] - * @param {Function} [callback] - * @return {Query} - * @see Model.findOneAndUpdate #model_Model.findOneAndUpdate - * @see mongodb http://www.mongodb.org/display/DOCS/findAndModify+Command - * @api public - */ - -Model.findByIdAndUpdate = function (id, update, options, callback) { - var args; - - if (1 === arguments.length) { - if ('function' == typeof id) { - var msg = 'Model.findByIdAndUpdate(): First argument must not be a function.\n\n' - + ' ' + this.modelName + '.findByIdAndUpdate(id, callback)\n' - + ' ' + this.modelName + '.findByIdAndUpdate(id)\n' - + ' ' + this.modelName + '.findByIdAndUpdate()\n'; - throw new TypeError(msg) - } - return this.findOneAndUpdate({_id: id }, undefined); - } - - args = utils.args(arguments, 1); - args.unshift({ _id: id }); - return this.findOneAndUpdate.apply(this, args); -} - -/** - * Issue a mongodb findAndModify remove command. - * - * Finds a matching document, removes it, passing the found document (if any) to the callback. - * - * Executes immediately if `callback` is passed else a Query object is returned. - * - * ####Options: - * - * - `sort`: if multiple docs are found by the conditions, sets the sort order to choose which doc to update - * - `select`: sets the document fields to return - * - * ####Examples: - * - * A.findOneAndRemove(conditions, options, callback) // executes - * A.findOneAndRemove(conditions, options) // return Query - * A.findOneAndRemove(conditions, callback) // executes - * A.findOneAndRemove(conditions) // returns Query - * A.findOneAndRemove() // returns Query - * - * @param {Object} conditions - * @param {Object} [options] - * @param {Function} [callback] - * @return {Query} - * @see mongodb http://www.mongodb.org/display/DOCS/findAndModify+Command - * @api public - */ - -Model.findOneAndRemove = function (conditions, options, callback) { - if (1 === arguments.length && 'function' == typeof conditions) { - var msg = 'Model.findOneAndRemove(): First argument must not be a function.\n\n' - + ' ' + this.modelName + '.findOneAndRemove(conditions, callback)\n' - + ' ' + this.modelName + '.findOneAndRemove(conditions)\n' - + ' ' + this.modelName + '.findOneAndRemove()\n'; - throw new TypeError(msg) - } - - if ('function' == typeof options) { - callback = options; - options = undefined; - } - - var fields; - if (options) { - fields = options.select; - options.select = undefined; - } - - var query = new Query(conditions); - query.setOptions(options); - query.select(fields); - query.bind(this, 'findOneAndRemove'); - - if ('undefined' == typeof callback) - return query; - - this._applyNamedScope(query); - return query.findOneAndRemove(callback); -} - -/** - * Issue a mongodb findAndModify remove command by a documents id. - * - * Finds a matching document, removes it, passing the found document (if any) to the callback. - * - * Executes immediately if `callback` is passed, else a `Query` object is returned. - * - * ####Options: - * - * - `sort`: if multiple docs are found by the conditions, sets the sort order to choose which doc to update - * - `select`: sets the document fields to return - * - * ####Examples: - * - * A.findByIdAndRemove(id, options, callback) // executes - * A.findByIdAndRemove(id, options) // return Query - * A.findByIdAndRemove(id, callback) // executes - * A.findByIdAndRemove(id) // returns Query - * A.findByIdAndRemove() // returns Query - * - * @param {ObjectId|HexString} id ObjectId or string that can be cast to one - * @param {Object} [options] - * @param {Function} [callback] - * @return {Query} - * @see Model.findOneAndRemove #model_Model.findOneAndRemove - * @see mongodb http://www.mongodb.org/display/DOCS/findAndModify+Command - */ - -Model.findByIdAndRemove = function (id, options, callback) { - if (1 === arguments.length && 'function' == typeof id) { - var msg = 'Model.findByIdAndRemove(): First argument must not be a function.\n\n' - + ' ' + this.modelName + '.findByIdAndRemove(id, callback)\n' - + ' ' + this.modelName + '.findByIdAndRemove(id)\n' - + ' ' + this.modelName + '.findByIdAndRemove()\n'; - throw new TypeError(msg) - } - - return this.findOneAndRemove({ _id: id }, options, callback); -} - -/** - * Shortcut for creating a new Document that is automatically saved to the db if valid. - * - * ####Example: - * - * Candy.create({ type: 'jelly bean' }, { type: 'snickers' }, function (err, jellybean, snickers) { - * if (err) // ... - * }); - * - * var array = [{ type: 'jelly bean' }, { type: 'snickers' }]; - * Candy.create(array, function (err, jellybean, snickers) { - * if (err) // ... - * }); - * - * @param {Array|Object...} doc - * @param {Function} fn callback - * @api public - */ - -Model.create = function create (doc, fn) { - if (1 === arguments.length) { - return 'function' === typeof doc && doc(null); - } - - var self = this - , docs = [null] - , promise - , count - , args - - if (Array.isArray(doc)) { - args = doc; - } else { - args = utils.args(arguments, 0, arguments.length - 1); - fn = arguments[arguments.length - 1]; - } - - if (0 === args.length) return fn(null); - - promise = new Promise(fn); - count = args.length; - - args.forEach(function (arg, i) { - var doc = new self(arg); - docs[i+1] = doc; - doc.save(function (err) { - if (err) return promise.error(err); - --count || fn.apply(null, docs); - }); - }); - - // TODO - // utilize collection.insertAll for batch processing? -}; - -/** - * Updates documents in the database without returning them. - * - * ####Examples: - * - * MyModel.update({ age: { $gt: 18 } }, { oldEnough: true }, fn); - * MyModel.update({ name: 'Tobi' }, { ferret: true }, { multi: true }, function (err, numberAffected, raw) { - * if (err) return handleError(err); - * console.log('The number of updated documents was %d', numberAffected); - * console.log('The raw response from Mongo was ', raw); - * }); - * - * ####Valid options: - * - * - `safe` (boolean) safe mode (defaults to value set in schema (true)) - * - `upsert` (boolean) whether to create the doc if it doesn't match (false) - * - `multi` (boolean) whether multiple documents should be updated (false) - * - * All `update` values are cast to their appropriate SchemaTypes before being sent. - * - * The `callback` function receives `(err, numberAffected, rawResponse)`. - * - * - `err` is the error if any occurred - * - `numberAffected` is the count of updated documents Mongo reported - * - `rawResponse` is the full response from Mongo - * - * ####Note: - * - * All top level keys which are not `atomic` operation names are treated as set operations: - * - * ####Example: - * - * var query = { name: 'borne' }; - * Model.update(query, { name: 'jason borne' }, options, callback) - * - * // is sent as - * Model.update(query, { $set: { name: 'jason borne' }}, options, callback) - * - * This helps prevent accidentally overwriting all documents in your collection with `{ name: 'jason borne' }`. - * - * ####Note: - * - * To update documents without waiting for a response from MongoDB, do not pass a `callback`, then call `exec` on the returned [Query](#query-js): - * - * Comment.update({ _id: id }, { $set: { text: 'changed' }}).exec(); - * - * ####Note: - * - * Although values are casted to their appropriate types when using update, the following are *not* applied: - * - * - defaults - * - setters - * - validators - * - middleware - * - * If you need those features, use the traditional approach of first retrieving the document. - * - * Model.findOne({ name: 'borne' }, function (err, doc) { - * if (err) .. - * doc.name = 'jason borne'; - * doc.save(callback); - * }) - * - * @param {Object} conditions - * @param {Object} update - * @param {Object} [options] - * @param {Function} [callback] - * @return {Query} - * @api public - */ - -Model.update = function update (conditions, doc, options, callback) { - if (arguments.length < 4) { - if ('function' === typeof options) { - // Scenario: update(conditions, doc, callback) - callback = options; - options = null; - } else if ('function' === typeof doc) { - // Scenario: update(doc, callback); - callback = doc; - doc = conditions; - conditions = {}; - options = null; - } - } - - var query = new Query(conditions, options).bind(this, 'update', doc); - - if ('undefined' == typeof callback) - return query; - - this._applyNamedScope(query); - return query.update(doc, callback); -}; - -/** - * Executes a mapReduce command. - * - * `o` is an object specifying all mapReduce options as well as the map and reduce functions. All options are delegated to the driver implementation. - * - * ####Example: - * - * var o = {}; - * o.map = function () { emit(this.name, 1) } - * o.reduce = function (k, vals) { return vals.length } - * User.mapReduce(o, function (err, results) { - * console.log(results) - * }) - * - * ####Other options: - * - * - `query` {Object} query filter object. - * - `limit` {Number} max number of documents - * - `keeptemp` {Boolean, default:false} keep temporary data - * - `finalize` {Function} finalize function - * - `scope` {Object} scope variables exposed to map/reduce/finalize during execution - * - `jsMode` {Boolean, default:false} it is possible to make the execution stay in JS. Provided in MongoDB > 2.0.X - * - `verbose` {Boolean, default:false} provide statistics on job execution time. - * - `out*` {Object, default: {inline:1}} sets the output target for the map reduce job. - * - * ####* out options: - * - * - `{inline:1}` the results are returned in an array - * - `{replace: 'collectionName'}` add the results to collectionName: the results replace the collection - * - `{reduce: 'collectionName'}` add the results to collectionName: if dups are detected, uses the reducer / finalize functions - * - `{merge: 'collectionName'}` add the results to collectionName: if dups exist the new docs overwrite the old - * - * If `options.out` is set to `replace`, `merge`, or `reduce`, a Model instance is returned that can be used for further querying. Queries run against this model are all executed with the `lean` option; meaning only the js object is returned and no Mongoose magic is applied (getters, setters, etc). - * - * ####Example: - * - * var o = {}; - * o.map = function () { emit(this.name, 1) } - * o.reduce = function (k, vals) { return vals.length } - * o.out = { replace: 'createdCollectionNameForResults' } - * o.verbose = true; - * User.mapReduce(o, function (err, model, stats) { - * console.log('map reduce took %d ms', stats.processtime) - * model.find().where('value').gt(10).exec(function (err, docs) { - * console.log(docs); - * }); - * }) - * - * @param {Object} o an object specifying map-reduce options - * @param {Function} callback - * @see http://www.mongodb.org/display/DOCS/MapReduce - * @api public - */ - -Model.mapReduce = function mapReduce (o, callback) { - if ('function' != typeof callback) throw new Error('missing callback'); - - var self = this; - - if (!Model.mapReduce.schema) { - var opts = { noId: true, noVirtualId: true, strict: false } - Model.mapReduce.schema = new Schema({}, opts); - } - - if (!o.out) o.out = { inline: 1 }; - - o.map = String(o.map); - o.reduce = String(o.reduce); - - if (o.query) { - var q = new Query(o.query); - q.cast(this); - o.query = q._conditions; - q = undefined; - } - - this.collection.mapReduce(null, null, o, function (err, ret, stats) { - if (err) return callback(err); - - if (ret.findOne && ret.mapReduce) { - // returned a collection, convert to Model - var model = Model.compile( - '_mapreduce_' + ret.collectionName - , Model.mapReduce.schema - , ret.collectionName - , self.db - , self.base); - - model._mapreduce = true; - - return callback(err, model, stats); - } - - callback(err, ret, stats); - }); -} - -/** - * Executes an aggregate command on this models collection. - * - * ####Example: - * - * // find the max age of all users - * Users.aggregate( - * { $group: { _id: null, maxAge: { $max: '$age' }}} - * , { $project: { _id: 0, maxAge: 1 }} - * , function (err, res) { - * if (err) return handleError(err); - * console.log(res); // [ { maxAge: 98 } ] - * }); - * - * _NOTE: the documents returned are plain javascript objects, not mongoose documents cast to this models schema definition (since any shape of document can be returned)._ - * - * _NOTE: this requires running MongoDB >= 2.1_ - * - * @param {Array} array an array of pipeline commands - * @param {Object} [options] - * @param {Function} callback - * @see aggregation http://docs.mongodb.org/manual/applications/aggregation/ - * @see driver http://mongodb.github.com/node-mongodb-native/api-generated/collection.html#aggregate - * @api public - */ - -Model.aggregate = function aggregate () { - return this.collection.aggregate.apply(this.collection, arguments); -} - -/*! - * Compiler utility. - * - * @param {String} name model name - * @param {Schema} schema - * @param {String} collectionName - * @param {Connection} connection - * @param {Mongoose} base mongoose instance - */ - -Model.compile = function compile (name, schema, collectionName, connection, base) { - // generate new class - function model (doc, fields, skipId) { - if (!(this instanceof model)) - return new model(doc, fields, skipId); - Model.call(this, doc, fields, skipId); - }; - - model.modelName = name; - model.__proto__ = Model; - model.prototype.__proto__ = Model.prototype; - model.prototype.db = connection; - model.prototype._setSchema(schema); - model.prototype.collection = connection.collection( - collectionName - , schema.options.capped - ); - - // apply methods - for (var i in schema.methods) - model.prototype[i] = schema.methods[i]; - - // apply statics - for (var i in schema.statics) - model[i] = schema.statics[i]; - - // apply named scopes - if (schema.namedScopes) schema.namedScopes.compile(model); - - model.model = model.prototype.model; - model.options = model.prototype.options; - model.db = model.prototype.db; - model.schema = model.prototype.schema; - model.collection = model.prototype.collection; - model.base = base; - - return model; -}; - -/*! - * Subclass this model with `conn`, `schema`, and `collection` settings. - * - * @param {Connection} conn - * @param {Schema} [schema] - * @param {String} [collection] - * @return {Model} - */ - -Model.__subclass = function subclass (conn, schema, collection) { - // subclass model using this connection and collection name - var model = this; - - var Model = function Model (doc, fields, skipId) { - if (!(this instanceof Model)) { - return new Model(doc, fields, skipId); - } - model.call(this, doc, fields, skipId); - } - - Model.__proto__ = model; - Model.prototype.__proto__ = model.prototype; - Model.db = Model.prototype.db = conn; - - var s = 'string' != typeof schema - ? schema - : model.prototype.schema; - - if (!collection) { - collection = model.prototype.schema.get('collection') - || utils.toCollectionName(model.modelName); - } - - Model.prototype.collection = conn.collection(collection, s && s.options.capped); - Model.collection = Model.prototype.collection; - Model.init(); - return Model; -} - -/*! - * Module exports. - */ - -module.exports = exports = Model; diff --git a/node_modules/mongoose/lib/namedscope.js b/node_modules/mongoose/lib/namedscope.js deleted file mode 100644 index 1b3f5d4..0000000 --- a/node_modules/mongoose/lib/namedscope.js +++ /dev/null @@ -1,70 +0,0 @@ -var Query = require('./query'); -function NamedScope () {} - -NamedScope.prototype.query; - -NamedScope.prototype.where = function () { - var q = this.query || (this.query = new Query()); - q.where.apply(q, arguments); - return q; -}; - -/** - * Decorate - * - * @param {NamedScope} target - * @param {Object} getters - * @api private - */ - -NamedScope.prototype.decorate = function (target, getters) { - var name = this.name - , block = this.block - , query = this.query; - if (block) { - if (block.length === 0) { - Object.defineProperty(target, name, { - get: getters.block0(block) - }); - } else { - target[name] = getters.blockN(block); - } - } else { - Object.defineProperty(target, name, { - get: getters.basic(query) - }); - } -}; - -NamedScope.prototype.compile = function (model) { - var allScopes = this.scopesByName - , scope; - for (var k in allScopes) { - scope = allScopes[k]; - scope.decorate(model, { - block0: function (block) { - return function () { - var cquery = this._cumulativeQuery || (this._cumulativeQuery = new Query().bind(this)); - block.call(cquery); - return this; - }; - }, - blockN: function (block) { - return function () { - var cquery = this._cumulativeQuery || (this._cumulativeQuery = new Query().bind(this)); - block.apply(cquery, arguments); - return this; - }; - }, - basic: function (query) { - return function () { - var cquery = this._cumulativeQuery || (this._cumulativeQuery = new Query().bind(this)); - cquery.find(query); - return this; - }; - } - }); - } -}; - -module.exports = NamedScope; diff --git a/node_modules/mongoose/lib/promise.js b/node_modules/mongoose/lib/promise.js deleted file mode 100644 index 1768e62..0000000 --- a/node_modules/mongoose/lib/promise.js +++ /dev/null @@ -1,158 +0,0 @@ - -/*! - * Module dependencies. - */ - -var util = require('./utils'); -var EventEmitter = require('events').EventEmitter; - -/** - * Promise constructor. - * - * @param {Function} back a callback+errback that accepts `fn(err, ...){}` as signature - * @inherits NodeJS EventEmitter http://nodejs.org/api/events.html#events_class_events_eventemitter - * @event `err`: Emits when the promise resolves to an error. - * @event `complete`: Emits when the promise resolves sucessfully. - * @api public - */ - -function Promise (back) { - this.emitted = {}; - if ('function' == typeof back) - this.addBack(back); -}; - -/*! - * Inherits from EventEmitter. - */ - -Promise.prototype.__proto__ = EventEmitter.prototype; - -/** - * Adds `listener` to the `event`. - * - * If `event` is either `error` or `complete` and the event has already been emitted, the`listener` is called immediately and passed the results of the original emitted event. - * - * @param {String} event - * @param {Function} callback - * @return {Promise} this - * @api public - */ - -Promise.prototype.on = function (event, callback) { - if (this.emitted[event]) - callback.apply(this, this.emitted[event]); - else - EventEmitter.prototype.on.call(this, event, callback); - - return this; -}; - -/** - * Keeps track of emitted events to run them on `on`. - * - * @api private - */ - -Promise.prototype.emit = function (event) { - // ensures a promise can't be complete() or error() twice - if (event == 'err' || event == 'complete'){ - if (this.emitted.err || this.emitted.complete) { - return this; - } - this.emitted[event] = util.args(arguments, 1); - } - - return EventEmitter.prototype.emit.apply(this, arguments); -}; - -/** - * Shortcut for emitting the `complete` event. - * - * @api public - */ - -Promise.prototype.complete = function () { - var args = util.args(arguments); - return this.emit.apply(this, ['complete'].concat(args)); -}; - -/** - * Shortcut for emitting the `err` event. - * - * If `err` is not instanceof Error, it is cast to Error before rejecting. - * - * @api public - * @return {Promise} - */ - -Promise.prototype.error = function (err) { - if (!(err instanceof Error)) err = new Error(err); - return this.emit('err', err); -}; - -/** - * Adds a listener to the `complete` (success) event. - * - * @return {Promise} this - * @api public - */ - -Promise.prototype.addCallback = function (fn) { - return this.on('complete', fn); -}; - -/** - * Adds a listener to the `err` (rejected) event. - * - * @return {Promise} this - * @api public - */ - -Promise.prototype.addErrback = function (fn) { - return this.on('err', fn); -}; - -/** - * Adds a single function as both a callback and errback. - * - * It will be executed with traditional node.js argument position: - * function (err, args...) {} - * - * @param {Function} fn - * @return {Promise} this - */ - -Promise.prototype.addBack = function (fn) { - this.on('err', function(err){ - fn.call(this, err); - }); - - this.on('complete', function(){ - var args = util.args(arguments); - fn.apply(this, [null].concat(args)); - }); - - return this; -}; - -/** - * Resolves this promise to an error state if `err` is passed or success state when no `err` is passed. - * - * `err` will be cast to an Error if not already instanceof Error. - * - * @param {Error} [err] error or null - * @param {Object} [val] value to complete the promise with - * @api public - */ - -Promise.prototype.resolve = function (err, val) { - if (err) return this.error(err); - return this.complete(val); -}; - -/*! - * Module exports. - */ - -module.exports = Promise; diff --git a/node_modules/mongoose/lib/query.js b/node_modules/mongoose/lib/query.js deleted file mode 100644 index bb97798..0000000 --- a/node_modules/mongoose/lib/query.js +++ /dev/null @@ -1,2395 +0,0 @@ -/*! - * Module dependencies. - */ - -var utils = require('./utils') - , merge = utils.merge - , Promise = require('./promise') - , Document = require('./document') - , Types = require('./schema/index') - , inGroupsOf = utils.inGroupsOf - , tick = utils.tick - , QueryStream = require('./querystream') - , ReadPref = require('mongodb').ReadPreference - -/** - * Query constructor used for building queries. - * - * ####Example: - * - * var query = Model.find(); - * query.where('age').gte(21).exec(callback); - * - * @param {Object} criteria - * @param {Object} options - * @api public - */ - -function Query (criteria, options) { - this.setOptions(options, true); - this._conditions = {}; - this._updateArg = {}; - this._fields = undefined; - if (criteria) this.find(criteria); -} - -/** - * Sets query options. - * - * ####Options: - * - * - [tailable](http://www.mongodb.org/display/DOCS/Tailable+Cursors) * - * - [sort](http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%7B%7Bsort(\)%7D%7D) * - * - [limit](http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%7B%7Blimit%28%29%7D%7D) * - * - [skip](http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%7B%7Bskip%28%29%7D%7D) * - * - [maxscan](http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24maxScan) * - * - [batchSize](http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%7B%7BbatchSize%28%29%7D%7D) * - * - [comment](http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24comment) * - * - [snapshot](http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%7B%7Bsnapshot%28%29%7D%7D) * - * - [hint](http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24hint) * - * - [slaveOk](http://docs.mongodb.org/manual/applications/replication/#read-preference) * - * - [lean](./api.html#query_Query-lean) * - * - [safe](http://www.mongodb.org/display/DOCS/getLastError+Command) - * - * _* denotes a query helper method is also available_ - * - * @param {Object} options - * @api public - */ - -Query.prototype.setOptions = function (options, overwrite) { - // overwrite is internal use only - if (overwrite) { - options = this.options = options || {}; - this.safe = options.safe - - // normalize population options - var pop = this.options.populate; - this.options.populate = {}; - - if (pop && Array.isArray(pop)) { - for (var i = 0, l = pop.length; i < l; i++) { - this.options.populate[pop[i]] = {}; - } - } - - return this; - } - - if (!(options && 'Object' == options.constructor.name)) - return this; - - if ('safe' in options) - this.safe = options.safe; - - // set arbitrary options - var methods = Object.keys(options) - , i = methods.length - , method - - while (i--) { - method = methods[i]; - - // use methods if exist (safer option manipulation) - if ('function' == typeof this[method]) { - var args = Array.isArray(options[method]) - ? options[method] - : [options[method]]; - this[method].apply(this, args) - } else { - this.options[method] = options[method]; - } - } - return this; -} - -/** - * Binds this query to a model. - * - * @param {Model} model the model to which the query is bound - * @param {String} op the operation to execute - * @param {Object} updateArg used in update methods - * @return {Query} - * @api private - */ - -Query.prototype.bind = function bind (model, op, updateArg) { - this.model = model; - this.op = op; - - if (model._mapreduce) this.options.lean = true; - - if (op == 'update' || op == 'findOneAndUpdate') { - merge(this._updateArg, updateArg || {}); - } - - return this; -}; - -/** - * Executes the query - * - * ####Examples - * - * query.exec(); - * query.exec(callback); - * query.exec('update'); - * query.exec('find', callback); - * - * @param {String|Function} [operation] - * @param {Function} [callback] - * @return {Promise} - * @api public - */ - -Query.prototype.exec = function exec (op, callback) { - var promise = new Promise(); - - switch (typeof op) { - case 'function': - callback = op; - op = null; - break; - case 'string': - this.op = op; - break; - } - - if (callback) promise.addBack(callback); - - if (!this.op) { - promise.complete(); - return promise; - } - - if ('update' == this.op) { - this[this.op](this._updateArg, promise.resolve.bind(promise)); - return promise; - } - - if ('distinct' == this.op) { - this.distinct(this._distinctArg, promise.resolve.bind(promise)); - return promise; - } - - this[this.op](promise.resolve.bind(promise)); - return promise; -}; - -/** - * Finds documents. - * - * When no `callback` is passed, the query is not executed. - * - * ####Example - * - * query.find({ name: 'Los Pollos Hermanos' }).find(callback) - * - * @param {Object} [criteria] mongodb selector - * @param {Function} [callback] - * @return {Query} this - * @api public - */ - -Query.prototype.find = function (criteria, callback) { - this.op = 'find'; - if ('function' === typeof criteria) { - callback = criteria; - criteria = {}; - } else if (criteria instanceof Query) { - // TODO Merge options, too - merge(this._conditions, criteria._conditions); - } else if (criteria instanceof Document) { - merge(this._conditions, criteria.toObject()); - } else if (criteria && 'Object' === criteria.constructor.name) { - merge(this._conditions, criteria); - } - if (!callback) return this; - return this.execFind(callback); -}; - -/** - * Casts this query to the schema of `model` - * - * ####Note - * - * If `obj` is present, it is cast instead of this query. - * - * @param {Model} model - * @param {Object} [obj] - * @return {Object} - * @api public - */ - -Query.prototype.cast = function (model, obj) { - obj || (obj= this._conditions); - - var schema = model.schema - , paths = Object.keys(obj) - , i = paths.length - , any$conditionals - , schematype - , nested - , path - , type - , val; - - while (i--) { - path = paths[i]; - val = obj[path]; - - if ('$or' === path || '$nor' === path || '$and' === path) { - var k = val.length - , orComponentQuery; - - while (k--) { - orComponentQuery = new Query(val[k]); - orComponentQuery.cast(model); - val[k] = orComponentQuery._conditions; - } - - } else if (path === '$where') { - type = typeof val; - - if ('string' !== type && 'function' !== type) { - throw new Error("Must have a string or function for $where"); - } - - if ('function' === type) { - obj[path] = val.toString(); - } - - continue; - - } else { - - if (!schema) { - // no casting for Mixed types - continue; - } - - schematype = schema.path(path); - - if (!schematype) { - // Handle potential embedded array queries - var split = path.split('.') - , j = split.length - , pathFirstHalf - , pathLastHalf - , remainingConds - , castingQuery; - - // Find the part of the var path that is a path of the Schema - while (j--) { - pathFirstHalf = split.slice(0, j).join('.'); - schematype = schema.path(pathFirstHalf); - if (schematype) break; - } - - // If a substring of the input path resolves to an actual real path... - if (schematype) { - // Apply the casting; similar code for $elemMatch in schema/array.js - if (schematype.caster && schematype.caster.schema) { - remainingConds = {}; - pathLastHalf = split.slice(j).join('.'); - remainingConds[pathLastHalf] = val; - castingQuery = new Query(remainingConds); - castingQuery.cast(schematype.caster); - obj[path] = castingQuery._conditions[pathLastHalf]; - } else { - obj[path] = val; - } - continue; - } - - if (utils.isObject(val)) { - // handle geo schemas that use object notation - // { loc: { long: Number, lat: Number } - - var geo = val.$near ? '$near' : - val.$nearSphere ? '$nearSphere' : - val.$within ? '$within' : ''; - - if (!geo) { - continue; - } - - var numbertype = new Types.Number('__QueryCasting__') - var value = val[geo]; - - if (val.$maxDistance) { - val.$maxDistance = numbertype.castForQuery(val.$maxDistance); - } - - if ('$within' == geo) { - // find $center, $centerSphere, $box, $polygon - var withinType = value.$center || value.$centerSphere || value.$box || value.$polygon; - if (!withinType) { - throw new Error('Bad $within paramater: ' + JSON.stringify(val)); - } - - value = withinType; - } - - ;(function _cast (val) { - if (Array.isArray(val)) { - val.forEach(function (item, i) { - if (Array.isArray(item) || utils.isObject(item)) { - return _cast(item); - } - val[i] = numbertype.castForQuery(item); - }); - } else { - var nearKeys= Object.keys(val); - var nearLen = nearKeys.length; - while (nearLen--) { - var nkey = nearKeys[nearLen]; - var item = val[nkey]; - if (Array.isArray(item) || utils.isObject(item)) { - _cast(item); - val[nkey] = item; - } else { - val[nkey] = numbertype.castForQuery(item); - } - } - } - })(value); - } - - } else if (val === null || val === undefined) { - continue; - } else if ('Object' === val.constructor.name) { - - any$conditionals = Object.keys(val).some(function (k) { - return k.charAt(0) === '$' && k !== '$id' && k !== '$ref'; - }); - - if (!any$conditionals) { - obj[path] = schematype.castForQuery(val); - } else { - - var ks = Object.keys(val) - , k = ks.length - , $cond; - - while (k--) { - $cond = ks[k]; - nested = val[$cond]; - - if ('$exists' === $cond) { - if ('boolean' !== typeof nested) { - throw new Error("$exists parameter must be Boolean"); - } - continue; - } - - if ('$type' === $cond) { - if ('number' !== typeof nested) { - throw new Error("$type parameter must be Number"); - } - continue; - } - - if ('$not' === $cond) { - this.cast(model, nested); - } else { - val[$cond] = schematype.castForQuery($cond, nested); - } - } - } - } else { - obj[path] = schematype.castForQuery(val); - } - } - } - - return obj; -}; - -/** - * Returns default options. - * @param {Model} model - * @api private - */ - -Query.prototype._optionsForExec = function (model) { - var options = utils.clone(this.options, { retainKeyOrder: true }); - delete options.populate; - - if (!('safe' in options)) - options.safe = model.schema.options.safe; - - if (!('readPreference' in options) && model.schema.options.read) - options.readPreference = model.schema.options.read; - - return options; -}; - -/** - * Applies schematype selected options to this query. - * @api private - */ - -Query.prototype._applyPaths = function applyPaths () { - // determine if query is selecting or excluding fields - - var fields = this._fields - , exclude - , keys - , ki - - if (fields) { - keys = Object.keys(fields); - ki = keys.length; - - while (ki--) { - if ('+' == keys[ki][0]) continue; - exclude = 0 === fields[keys[ki]]; - break; - } - } - - // if selecting, apply default schematype select:true fields - // if excluding, apply schematype select:false fields - - var selected = [] - , excluded = [] - , seen = []; - - analyzeSchema(this.model.schema); - - switch (exclude) { - case true: - excluded.length && this.select('-' + excluded.join(' -')); - break; - case false: - selected.length && this.select(selected.join(' ')); - break; - case undefined: - // user didn't specify fields, implies returning all fields. - // only need to apply excluded fields - excluded.length && this.select('-' + excluded.join(' -')); - break; - } - - return seen = excluded = selected = keys = fields = null; - - function analyzeSchema (schema, prefix) { - prefix || (prefix = ''); - - // avoid recursion - if (~seen.indexOf(schema)) return; - seen.push(schema); - - schema.eachPath(function (path, type) { - if (prefix) path = prefix + '.' + path; - - // array of subdocs? - if (type.schema) { - analyzeSchema(type.schema, path); - } - - analyzePath(path, type); - }); - } - - function analyzePath (path, type) { - if ('boolean' != typeof type.selected) return; - - if (fields && ('+' + path) in fields) { - // forced inclusion - delete fields['+' + path]; - - // if there are other fields being included, add this one - // if no other included fields, leave this out (implied inclusion) - if (false === exclude && keys.length > 1) { - fields[path] = 1; - } - - return - }; - - ;(type.selected ? selected : excluded).push(path); - } -} - -/** - * Specifies a `$where` condition - * - * Use `$where` when you need to select documents using a JavaScript expression. - * - * ####Example - * - * query.$where('this.comments.length > 10 || this.name.length > 5') - * - * query.$where(function () { - * return this.comments.length > 10 || this.name.length > 5; - * }) - * - * @param {String|Function} js javascript string or function - * @return {Query} this - * @memberOf Query - * @method $where - * @api public - */ - -Query.prototype.$where = function (js) { - this._conditions['$where'] = js; - return this; -}; - -/** - * Specifies a `path` for use with chaining. - * - * ####Example - * - * // instead of writing: - * User.find({age: {$gte: 21, $lte: 65}}, callback); - * - * // we can instead write: - * User.where('age').gte(21).lte(65); - * - * // Moreover, you can also chain a bunch of these together: - * - * User - * .where('age').gte(21).lte(65) - * .where('name', /^b/i) - * .where('friends').slice(10) - * .exec(callback) - * - * @param {String} [path] - * @param {Object} [val] - * @return {Query} this - * @api public - */ - -Query.prototype.where = function (path, val) { - if (!arguments.length) return this; - - if ('string' != typeof path) { - throw new TypeError('path must be a string'); - } - - this._currPath = path; - - if (2 === arguments.length) { - this._conditions[path] = val; - } - - return this; -}; - -/** - * Specifies the complementary comparison value for paths specified with `where()` - * - * ####Example - * - * User.where('age').equals(49); - * - * // is the same as - * - * User.where('age', 49); - * - * @param {Object} val - * @return {Query} this - * @api public - */ - -Query.prototype.equals = function equals (val) { - var path = this._currPath; - if (!path) throw new Error('equals() must be used after where()'); - this._conditions[path] = val; - return this; -} - -/** - * Specifies arguments for an `$or` condition. - * - * ####Example - * - * query.or([{ color: 'red' }, { status: 'emergency' }]) - * - * @param {Array} array array of conditions - * @return {Query} this - * @api public - */ - -Query.prototype.or = function or (array) { - var or = this._conditions.$or || (this._conditions.$or = []); - if (!Array.isArray(array)) array = [array]; - or.push.apply(or, array); - return this; -} - -/** - * Specifies arguments for a `$nor` condition. - * - * ####Example - * - * query.nor([{ color: 'green' }, { status: 'ok' }]) - * - * @param {Array} array array of conditions - * @return {Query} this - * @api public - */ - -Query.prototype.nor = function nor (array) { - var nor = this._conditions.$nor || (this._conditions.$nor = []); - if (!Array.isArray(array)) array = [array]; - nor.push.apply(nor, array); - return this; -} - -/** - * Specifies arguments for a `$and` condition. - * - * ####Example - * - * query.and([{ color: 'green' }, { status: 'ok' }]) - * - * @param {Array} array array of conditions - * @return {Query} this - * @api public - */ - -Query.prototype.and = function and (array) { - var and = this._conditions.$and || (this._conditions.$and = []); - if (!Array.isArray(array)) array = [array]; - and.push.apply(and, array); - return this; -} - -/** - * Specifies a $gt query condition. - * - * When called with one argument, the most recent path passed to `where()` is used. - * - * ####Example - * - * Thing.find().where('age').gt(21) - * - * // or - * Thing.find().gt('age', 21) - * - * @method gt - * @memberOf Query - * @param {String} path - * @param {Number} val - * @api public - */ - -/** - * Specifies a $gte query condition. - * - * When called with one argument, the most recent path passed to `where()` is used. - * - * @method gte - * @memberOf Query - * @param {String} path - * @param {Number} val - * @api public - */ - -/** - * Specifies a $lt query condition. - * - * When called with one argument, the most recent path passed to `where()` is used. - * - * @method lt - * @memberOf Query - * @param {String} path - * @param {Number} val - * @api public - */ - -/** - * Specifies a $lte query condition. - * - * When called with one argument, the most recent path passed to `where()` is used. - * - * @method lte - * @memberOf Query - * @param {String} path - * @param {Number} val - * @api public - */ - -/** - * Specifies a $ne query condition. - * - * When called with one argument, the most recent path passed to `where()` is used. - * - * @method ne - * @memberOf Query - * @param {String} path - * @param {Number} val - * @api public - */ - -/** - * Specifies an $in query condition. - * - * When called with one argument, the most recent path passed to `where()` is used. - * - * @method in - * @memberOf Query - * @param {String} path - * @param {Number} val - * @api public - */ - -/** - * Specifies an $nin query condition. - * - * When called with one argument, the most recent path passed to `where()` is used. - * - * @method nin - * @memberOf Query - * @param {String} path - * @param {Number} val - * @api public - */ - -/** - * Specifies an $all query condition. - * - * When called with one argument, the most recent path passed to `where()` is used. - * - * @method all - * @memberOf Query - * @param {String} path - * @param {Number} val - * @api public - */ - -/** - * Specifies an $size query condition. - * - * When called with one argument, the most recent path passed to `where()` is used. - * - * @method size - * @memberOf Query - * @param {String} path - * @param {Number} val - * @api public - */ - -/** - * Specifies a $regex query condition. - * - * When called with one argument, the most recent path passed to `where()` is used. - * - * @method regex - * @memberOf Query - * @param {String} path - * @param {Number} val - * @api public - */ - -/** - * Specifies a $maxDistance query condition. - * - * When called with one argument, the most recent path passed to `where()` is used. - * - * @method maxDistance - * @memberOf Query - * @param {String} path - * @param {Number} val - * @api public - */ - -/*! - * gt, gte, lt, lte, ne, in, nin, all, regex, size, maxDistance - * - * Thing.where('type').nin(array) - */ - -'gt gte lt lte ne in nin all regex size maxDistance'.split(' ').forEach(function ($conditional) { - Query.prototype[$conditional] = function (path, val) { - if (arguments.length === 1) { - val = path; - path = this._currPath - } - var conds = this._conditions[path] || (this._conditions[path] = {}); - conds['$' + $conditional] = val; - return this; - }; -}); - -/** - * Specifies a `$near` condition - * - * @param {String} path - * @param {Number} val - * @return {Query} this - * @see http://www.mongodb.org/display/DOCS/Geospatial+Indexing - * @api public - */ - -Query.prototype.near = function (path, val) { - if (arguments.length === 1) { - val = path; - path = this._currPath - } else if (arguments.length === 2 && !Array.isArray(val)) { - val = utils.args(arguments); - path = this._currPath; - } else if (arguments.length === 3) { - val = utils.args(arguments, 1); - } - var conds = this._conditions[path] || (this._conditions[path] = {}); - conds.$near = val; - return this; -} - -/** - * Specifies a `$nearSphere` condition. - * - * @param {String} path - * @param {Object} val - * @return {Query} this - * @see http://www.mongodb.org/display/DOCS/Geospatial+Indexing - * @api public - */ - -Query.prototype.nearSphere = function (path, val) { - if (arguments.length === 1) { - val = path; - path = this._currPath - } else if (arguments.length === 2 && !Array.isArray(val)) { - val = utils.args(arguments); - path = this._currPath; - } else if (arguments.length === 3) { - val = utils.args(arguments, 1); - } - var conds = this._conditions[path] || (this._conditions[path] = {}); - conds.$nearSphere = val; - return this; -} - -/** - * Specifies a `$mod` condition - * - * @param {String} path - * @param {Number} val - * @return {Query} this - * @api public - */ - -Query.prototype.mod = function (path, val) { - if (arguments.length === 1) { - val = path; - path = this._currPath - } else if (arguments.length === 2 && !Array.isArray(val)) { - val = utils.args(arguments); - path = this._currPath; - } else if (arguments.length === 3) { - val = utils.args(arguments, 1); - } - var conds = this._conditions[path] || (this._conditions[path] = {}); - conds.$mod = val; - return this; -} - -/** - * Specifies an `$exists` condition - * - * @param {String} path - * @param {Number} val - * @return {Query} this - * @api public - */ - -Query.prototype.exists = function (path, val) { - if (arguments.length === 0) { - path = this._currPath - val = true; - } else if (arguments.length === 1) { - if ('boolean' === typeof path) { - val = path; - path = this._currPath; - } else { - val = true; - } - } - var conds = this._conditions[path] || (this._conditions[path] = {}); - conds['$exists'] = val; - return this; -}; - -/** - * Specifies an `$elemMatch` condition - * - * ####Example - * - * query.elemMatch('comment', { author: 'autobot', votes: {$gte: 5}}) - * - * query.where('comment').elemMatch({ author: 'autobot', votes: {$gte: 5}}) - * - * query.elemMatch('comment', function (elem) { - * elem.where('author').equals('autobot'); - * elem.where('votes').gte(5); - * }) - * - * query.where('comment').elemMatch(function (elem) { - * elem.where('author').equals('autobot'); - * elem.where('votes').gte(5); - * }) - * - * @param {String|Object|Function} path - * @param {Object|Function} criteria - * @return {Query} this - * @api public - */ - -Query.prototype.elemMatch = function (path, criteria) { - var block; - if ('Object' === path.constructor.name) { - criteria = path; - path = this._currPath; - } else if ('function' === typeof path) { - block = path; - path = this._currPath; - } else if ('Object' === criteria.constructor.name) { - } else if ('function' === typeof criteria) { - block = criteria; - } else { - throw new Error("Argument error"); - } - var conds = this._conditions[path] || (this._conditions[path] = {}); - if (block) { - criteria = new Query(); - block(criteria); - conds['$elemMatch'] = criteria._conditions; - } else { - conds['$elemMatch'] = criteria; - } - return this; -}; - -// Spatial queries - -/** - * Syntax sugar for expressive queries. - * - * ####Example - * - * query.within.box() - * query.within.center() - * - * @property within - * @memberOf Query - * @return {Query} this - * @api public - */ - -Object.defineProperty(Query.prototype, 'within', { - get: function () { return this } -}); - -/** - * Specifies a $box condition - * - * ####Example - * - * var lowerLeft = [40.73083, -73.99756] - * var upperRight= [40.741404, -73.988135] - * query.where('loc').within.box({ ll: lowerLeft , ur: upperRight }) - * - * @see http://www.mongodb.org/display/DOCS/Geospatial+Indexing - * @see Query#within #query_Query-within - * @param {String} path - * @param {Object} val - * @return {Query} this - * @api public - */ - -Query.prototype.box = function (path, val) { - if (arguments.length === 1) { - val = path; - path = this._currPath; - } - var conds = this._conditions[path] || (this._conditions[path] = {}); - conds['$within'] = { '$box': [val.ll, val.ur] }; - return this; -}; - -/** - * Specifies a $center condition - * - * ####Example - * - * var area = { center: [50, 50], radius: 10 } - * query.where('loc').within.center(area) - * - * @param {String} path - * @param {Object} val - * @param {Object} [opts] options e.g. { $uniqueDocs: true } - * @return {Query} this - * @see http://www.mongodb.org/display/DOCS/Geospatial+Indexing - * @api public - */ - -Query.prototype.center = function (path, val, opts) { - if (arguments.length === 1) { - val = path; - path = this._currPath; - } - var conds = this._conditions[path] || (this._conditions[path] = {}); - conds['$within'] = { '$center': [val.center, val.radius] }; - - // copy any options - if (opts && 'Object' == opts.constructor.name) { - utils.options(opts, conds.$within); - } - - return this; -}; - -/** - * Specifies a $centerSphere condition - * - * ####Example - * - * var area = { center: [50, 50], radius: 10 } - * query.where('loc').within.centerSphere(area) - * - * @param {String} path - * @param {Object} val - * @return {Query} this - * @see http://www.mongodb.org/display/DOCS/Geospatial+Indexing - * @api public - */ - -Query.prototype.centerSphere = function (path, val) { - if (arguments.length === 1) { - val = path; - path = this._currPath; - } - var conds = this._conditions[path] || (this._conditions[path] = {}); - conds['$within'] = { '$centerSphere': [val.center, val.radius] }; - return this; -}; - -/** - * Specifies a $polygon condition - * - * ####Example - * - * var polyA = [ [ 10, 20 ], [ 10, 40 ], [ 30, 40 ], [ 30, 20 ] ] - * query.where('loc').within.polygon(polyA) - * - * // or - * var polyB = { a : { x : 10, y : 20 }, b : { x : 15, y : 25 }, c : { x : 20, y : 20 } } - * query.where('loc').within.polygon(polyB) - * - * @param {String} path - * @param {Array|Object} val - * @return {Query} this - * @see http://www.mongodb.org/display/DOCS/Geospatial+Indexing - * @api public - */ - -Query.prototype.polygon = function (path, val) { - if (arguments.length === 1) { - val = path; - path = this._currPath; - } - var conds = this._conditions[path] || (this._conditions[path] = {}); - conds['$within'] = { '$polygon': val }; - return this; -}; - -/** - * Specifies which document fields to include or exclude - * - * When using string syntax, prefixing a path with `-` will flag that path as excluded. When a path does not have the `-` prefix, it is included. Lastly, if a path is prefixed with `+`, it forces inclusion of the path, which is useful for paths excluded at the [schema level](/docs/api.html#schematype_SchemaType-select). - * - * ####Example - * - * // include a and b, exclude c - * query.select('a b -c'); - * - * // or you may use object notation, useful when - * // you have keys already prefixed with a "-" - * query.select({a: 1, b: 1, c: 0}); - * - * // force inclusion of field excluded at schema level - * query.select('+path') - * - * ####NOTE: - * - * _v2 had slightly different syntax such as allowing arrays of field names. This support was removed in v3._ - * - * @param {Object|String} arg - * @return {Query} this - * @see SchemaType - * @api public - */ - -Query.prototype.select = function select (arg) { - if (!arg) return this; - - var fields = this._fields || (this._fields = {}); - - if ('Object' === arg.constructor.name) { - Object.keys(arg).forEach(function (field) { - fields[field] = arg[field]; - }); - } else if (1 === arguments.length && 'string' == typeof arg) { - arg.split(/\s+/).forEach(function (field) { - if (!field) return; - var include = '-' == field[0] ? 0 : 1; - if (include === 0) field = field.substring(1); - fields[field] = include; - }); - } else { - throw new TypeError('Invalid select() argument. Must be a string or object.'); - } - - return this; -}; - -/** - * Specifies a $slice condition - * - * ####Example - * - * query.slice('comments', 5) - * query.slice('comments', -5) - * query.slice('comments', [10, 5]) - * query.where('comments').slice(5) - * query.where('comments').slice([-10, 5]) - * - * @param {String} path - * @param {Number} val number of elements to slice - * @return {Query} this - * @see mongodb http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields#RetrievingaSubsetofFields-RetrievingaSubrangeofArrayElements - * @api public - */ - -Query.prototype.slice = function (path, val) { - if (arguments.length === 1) { - val = path; - path = this._currPath - } else if (arguments.length === 2) { - if ('number' === typeof path) { - val = [path, val]; - path = this._currPath; - } - } else if (arguments.length === 3) { - val = utils.args(arguments, 1); - } - var myFields = this._fields || (this._fields = {}); - myFields[path] = { '$slice': val }; - return this; -}; - -/** - * Sets the sort order - * - * If an object is passed, values allowed are 'asc', 'desc', 'ascending', 'descending', 1, and -1. - * - * If a string is passed, it must be a space delimited list of path names. The sort order of each path is ascending unless the path name is prefixed with `-` which will be treated as descending. - * - * ####Example - * - * // these are equivalent - * query.sort({ field: 'asc', test: -1 }); - * query.sort('field -test'); - * - * @param {Object|String} arg - * @return {Query} this - * @api public - */ - -Query.prototype.sort = function (arg) { - if (!arg) return this; - - var sort = this.options.sort || (this.options.sort = []); - - if ('Object' === arg.constructor.name) { - Object.keys(arg).forEach(function (field) { - push(sort, field, arg[field]); - }); - } else if (1 === arguments.length && 'string' == typeof arg) { - arg.split(/\s+/).forEach(function (field) { - if (!field) return; - var ascend = '-' == field[0] ? -1 : 1; - if (ascend === -1) field = field.substring(1); - push(sort, field, ascend); - }); - } else { - throw new TypeError('Invalid sort() argument. Must be a string or object.'); - } - - return this; -}; - -/*! - * @ignore - */ - -function push (arr, field, value) { - var val = String(value || 1).toLowerCase(); - if (!/^(?:ascending|asc|descending|desc|1|-1)$/.test(val)) { - if (Array.isArray(value)) value = '['+value+']'; - throw new TypeError('Invalid sort value: {' + field + ': ' + value + ' }'); - } - arr.push([field, value]); -} - -/** - * Specifies the limit option. - * - * ####Example - * - * Kitten.find().limit(20) - * - * @method limit - * @memberOf Query - * @param {Number} val - * @see mongodb http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%7B%7Blimit%28%29%7D%7D - * @api public - */ -/** - * Specifies the skip option. - * - * ####Example - * - * Kitten.find().skip(100).limit(20) - * - * @method skip - * @memberOf Query - * @param {Number} val - * @see mongodb http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%7B%7Bskip%28%29%7D%7D - * @api public - */ -/** - * Specifies the maxscan option. - * - * ####Example - * - * Kitten.find().maxscan(100) - * - * @method maxscan - * @memberOf Query - * @param {Number} val - * @see mongodb http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24maxScan - * @api public - */ -/** - * Specifies the batchSize option. - * - * ####Example - * - * Kitten.find().batchSize(100) - * - * @method batchSize - * @memberOf Query - * @param {Number} val - * @see mongodb http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%7B%7BbatchSize%28%29%7D%7D - * @api public - */ -/** - * Specifies the `comment` option. - * - * ####Example - * - * Kitten.findOne(condition).comment('login query') - * - * @method comment - * @memberOf Query - * @param {Number} val - * @see mongodb http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24comment - * @api public - */ - -/*! - * limit, skip, maxscan, batchSize, comment - * - * Sets these associated options. - * - * query.comment('feed query'); - */ - -;['limit', 'skip', 'maxscan', 'batchSize', 'comment'].forEach(function (method) { - Query.prototype[method] = function (v) { - this.options[method] = v; - return this; - }; -}); - -/** - * Specifies this query as a `snapshot` query. - * - * ####Example - * - * Kitten.find().snapshot() - * - * @see mongodb http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%7B%7Bsnapshot%28%29%7D%7D - * @return {Query} this - * @api public - */ - -Query.prototype.snapshot = function () { - this.options.snapshot = true; - return this; -}; - -/** - * Sets query hints. - * - * ####Example - * - * Model.find().hint({ indexA: 1, indexB: -1}) - * - * @param {Object} val a hint object - * @return {Query} this - * @see mongodb http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24hint - * @api public - */ - -Query.prototype.hint = function (val) { - if (!val) return this; - - var hint = this.options.hint || (this.options.hint = {}); - - if ('Object' === val.constructor.name) { - // must keep object keys in order so don't use Object.keys() - for (var k in val) { - hint[k] = val[k]; - } - } else { - throw new TypeError('Invalid hint. ' + val); - } - - return this; -}; - -/** - * Sets the slaveOk option. - * - * ####Example: - * - * new Query().slaveOk() // true - * new Query().slaveOk(true) - * new Query().slaveOk(false) - * - * @param {Boolean} v defaults to true - * @see mongodb http://docs.mongodb.org/manual/applications/replication/#read-preference - * @return {Query} this - * @api public - */ - -Query.prototype.slaveOk = function (v) { - this.options.slaveOk = arguments.length ? !!v : true; - return this; -} - -/** - * Sets the readPreference option for the query. - * - * ####Example: - * - * new Query().read('primary') - * new Query().read('p') // same as primary - * - * new Query().read('primaryPreferred') - * new Query().read('pp') // same as primaryPreferred - * - * new Query().read('secondary') - * new Query().read('s') // same as secondary - * - * new Query().read('secondaryPreferred') - * new Query().read('sp') // same as secondaryPreferred - * - * new Query().read('nearest') - * new Query().read('n') // same as nearest - * - * // with tags - * new Query().read('s', [{ dc:'sf', s: 1 },{ dc:'ma', s: 2 }]) - * - * ####Preferences: - * - * primary - (default) Read from primary only. Operations will produce an error if primary is unavailable. Cannot be combined with tags. - * secondary Read from secondary if available, otherwise error. - * primaryPreferred Read from primary if available, otherwise a secondary. - * secondaryPreferred Read from a secondary if available, otherwise read from the primary. - * nearest All operations read from among the nearest candidates, but unlike other modes, this option will include both the primary and all secondaries in the random selection. - * - * Aliases - * - * p primary - * pp primaryPreferred - * s secondary - * sp secondaryPreferred - * n nearest - * - * Read more about how to use read preferrences [here](http://docs.mongodb.org/manual/applications/replication/#read-preference) and [here](http://mongodb.github.com/node-mongodb-native/driver-articles/anintroductionto1_1and2_2.html#read-preferences). - * - * @param {String} pref one of the listed preference options or their aliases - * @param {Array} [tags] optional tags for this query - * @see mongodb http://docs.mongodb.org/manual/applications/replication/#read-preference - * @see driver http://mongodb.github.com/node-mongodb-native/driver-articles/anintroductionto1_1and2_2.html#read-preferences - * @return {Query} this - * @api public - */ - -Query.prototype.read = function (pref, tags) { - this.options.readPreference = utils.readPref(pref, tags); - return this; -} - -/** - * Sets the lean option. - * - * Documents returned from queries with the `lean` option enabled are plain javascript objects, not [MongooseDocuments](#document-js). They have no `save` method, getters/setters or any other Mongoose magic applied. - * - * This is a [great](https://groups.google.com/forum/#!topic/mongoose-orm/u2_DzDydcnA/discussion) option in high-performance read-only scenarios, especially when combined with the [stream](#query_Query-stream) option. - * - * ####Example: - * - * new Query().lean() // true - * new Query().lean(true) - * new Query().lean(false) - * - * Model.find().lean().exec(); - * - * var leanStream = Model.find().lean().stream(); - * - * @param {Boolean} v defaults to true - * @return {Query} this - * @api public - */ - -Query.prototype.lean = function (v) { - this.options.lean = arguments.length ? !!v : true; - return this; -} - -/** - * Sets tailable option. - * - * ####Example - * - * Kitten.find().tailable() <== true - * Kitten.find().tailable(true) - * Kitten.find().tailable(false) - * - * @param {Boolean} v defaults to true - * @see mongodb http://www.mongodb.org/display/DOCS/Tailable+Cursors - * @api public - */ - -Query.prototype.tailable = function (v) { - this.options.tailable = arguments.length ? !!v : true; - return this; -}; - -/** - * Executes the query as a find() operation. - * - * @param {Function} callback - * @return {Query} this - * @api private - */ - -Query.prototype.execFind = function (callback) { - var model = this.model - , promise = new Promise(callback); - - try { - this.cast(model); - } catch (err) { - promise.error(err); - return this; - } - - // apply default schematype path selections - this._applyPaths(); - - var self = this - , castQuery = this._conditions - , options = this._optionsForExec(model) - , fields = utils.clone(this._fields) - - options.fields = this._castFields(fields); - if (options.fields instanceof Error) { - promise.error(options.fields); - return this; - } - - model.collection.find(castQuery, options, function (err, cursor) { - if (err) return promise.error(err); - cursor.toArray(tick(cb)); - }); - - function cb (err, docs) { - if (err) return promise.error(err); - - if (true === options.lean) - return promise.complete(docs); - - var arr = [] - , count = docs.length; - - if (!count) return promise.complete([]); - - for (var i = 0, l = docs.length; i < l; i++) { - arr[i] = new model(undefined, fields, true); - arr[i].init(docs[i], self, function (err) { - if (err) return promise.error(err); - --count || promise.complete(arr); - }); - } - } - - return this; -}; - -/** - * Executes the query as a findOne() operation. - * - * ####Example - * - * Kitten.where('color', 'white').findOne(function (err, kitten) { - * if (err) return handleError(err); - * - * // kitten may be null if no document matched - * if (kitten) { - * ... - * } - * }) - * - * @param {Function} callback - * @return {Query} this - * @api public - */ - -Query.prototype.findOne = function (callback) { - this.op = 'findOne'; - - if (!callback) return this; - - var model = this.model; - var promise = new Promise(callback); - - try { - this.cast(model); - } catch (err) { - promise.error(err); - return this; - } - - // apply default schematype path selections - this._applyPaths(); - - var self = this - , castQuery = this._conditions - , options = this._optionsForExec(model) - , fields = utils.clone(this._fields) - - options.fields = this._castFields(fields); - if (options.fields instanceof Error) { - promise.error(options.fields); - return this; - } - - model.collection.findOne(castQuery, options, tick(function (err, doc) { - if (err) return promise.error(err); - if (!doc) return promise.complete(null); - - if (true === options.lean) return promise.complete(doc); - - var casted = new model(undefined, fields, true); - casted.init(doc, self, function (err) { - if (err) return promise.error(err); - promise.complete(casted); - }); - })); - - return this; -}; - -/** - * Exectues the query as a count() operation. - * - * ####Example - * - * Kitten.where('color', 'black').count(function (err, count) { - * if (err) return handleError(err); - * console.log('there are %d black kittens', count); - * }) - * - * @param {Function} callback - * @return {Query} this - * @see mongodb http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Count - * @api public - */ - -Query.prototype.count = function (callback) { - this.op = 'count'; - var model = this.model; - - try { - this.cast(model); - } catch (err) { - return callback(err); - } - - var castQuery = this._conditions; - model.collection.count(castQuery, tick(callback)); - - return this; -}; - -/** - * Executes this query as a distict() operation. - * - * @param {String} field - * @param {Function} callback - * @return {Query} this - * @see mongodb http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Distinct - * @api public - */ - -Query.prototype.distinct = function (field, callback) { - this.op = 'distinct'; - var model = this.model; - - try { - this.cast(model); - } catch (err) { - return callback(err); - } - - var castQuery = this._conditions; - model.collection.distinct(field, castQuery, tick(callback)); - - return this; -}; - -/*! - * These operators require casting docs - * to real Documents for Update operations. - */ - -var castOps = { - $push: 1 - , $pushAll: 1 - , $addToSet: 1 - , $set: 1 -}; - -/*! - * These operators should be cast to numbers instead - * of their path schema type. - */ - -var numberOps = { - $pop: 1 - , $unset: 1 - , $inc: 1 -} - -/** - * Executes this query as an update() operation. - * - * _All paths passed that are not $atomic operations will become $set ops so we retain backwards compatibility._ - * - * ####Example - * - * Model.update({..}, { title: 'remove words' }, ...) - * - * becomes - * - * Model.update({..}, { $set: { title: 'remove words' }}, ...) - * - * ####Note - * - * Passing an empty object `{}` as the doc will result in a no-op. The update operation will be ignored and the callback executed without sending the command to MongoDB so as to prevent accidently overwritting the collection. - * - * @param {Object} doc the update conditions - * @param {Function} callback - * @return {Query} this - * @api public - */ - -Query.prototype.update = function update (doc, callback) { - this.op = 'update'; - this._updateArg = doc; - - var model = this.model - , options = this._optionsForExec(model) - , fn = 'function' == typeof callback - , castedQuery - , castedDoc - - castedQuery = castQuery(this); - if (castedQuery instanceof Error) { - if (fn) { - process.nextTick(callback.bind(null, castedQuery)); - return this; - } - throw castedQuery; - } - - castedDoc = castDoc(this); - if (!castedDoc) { - fn && process.nextTick(callback.bind(null, null, 0)); - return this; - } - - if (castedDoc instanceof Error) { - if (fn) { - process.nextTick(callback.bind(null, castedDoc)); - return this; - } - throw castedDoc; - } - - if (!fn) { - options.safe = { w: 0 }; - } - - model.collection.update(castedQuery, castedDoc, options, tick(callback)); - return this; -}; - -/** - * Casts obj for an update command. - * - * @param {Object} obj - * @return {Object} obj after casting its values - * @api private - */ - -Query.prototype._castUpdate = function _castUpdate (obj) { - var ops = Object.keys(obj) - , i = ops.length - , ret = {} - , hasKeys - , val - - while (i--) { - var op = ops[i]; - if ('$' !== op[0]) { - // fix up $set sugar - if (!ret.$set) { - if (obj.$set) { - ret.$set = obj.$set; - } else { - ret.$set = {}; - } - } - ret.$set[op] = obj[op]; - ops.splice(i, 1); - if (!~ops.indexOf('$set')) ops.push('$set'); - } else if ('$set' === op) { - if (!ret.$set) { - ret[op] = obj[op]; - } - } else { - ret[op] = obj[op]; - } - } - - // cast each value - i = ops.length; - - while (i--) { - op = ops[i]; - val = ret[op]; - if ('Object' === val.constructor.name) { - hasKeys |= this._walkUpdatePath(val, op); - } else { - var msg = 'Invalid atomic update value for ' + op + '. ' - + 'Expected an object, received ' + typeof val; - throw new Error(msg); - } - } - - return hasKeys && ret; -} - -/** - * Walk each path of obj and cast its values - * according to its schema. - * - * @param {Object} obj - part of a query - * @param {String} op - the atomic operator ($pull, $set, etc) - * @param {String} pref - path prefix (internal only) - * @return {Bool} true if this path has keys to update - * @api private - */ - -Query.prototype._walkUpdatePath = function _walkUpdatePath (obj, op, pref) { - var strict = this.model.schema.options.strict - , prefix = pref ? pref + '.' : '' - , keys = Object.keys(obj) - , i = keys.length - , hasKeys = false - , schema - , key - , val - - while (i--) { - key = keys[i]; - val = obj[key]; - - if (val && 'Object' === val.constructor.name) { - // watch for embedded doc schemas - schema = this._getSchema(prefix + key); - if (schema && schema.caster && op in castOps) { - // embedded doc schema - - if (strict && !schema) { - // path is not in our strict schema - if ('throw' == strict) { - throw new Error('Field `' + key + '` is not in schema.'); - } else { - // ignore paths not specified in schema - delete obj[key]; - } - } else { - hasKeys = true; - if ('$each' in val) { - obj[key] = { - $each: this._castUpdateVal(schema, val.$each, op) - } - } else { - obj[key] = this._castUpdateVal(schema, val, op); - } - } - } else { - hasKeys |= this._walkUpdatePath(val, op, prefix + key); - } - } else { - schema = '$each' === key - ? this._getSchema(pref) - : this._getSchema(prefix + key); - - var skip = strict && - !schema && - !/real|nested/.test(this.model.schema.pathType(prefix + key)); - - if (skip) { - if ('throw' == strict) { - throw new Error('Field `' + prefix + key + '` is not in schema.'); - } else { - delete obj[key]; - } - } else { - hasKeys = true; - obj[key] = this._castUpdateVal(schema, val, op, key); - } - } - } - return hasKeys; -} - -/** - * Casts `val` according to `schema` and atomic `op`. - * - * @param {Schema} schema - * @param {Object} val - * @param {String} op - the atomic operator ($pull, $set, etc) - * @param {String} [$conditional] - * @api private - */ - -Query.prototype._castUpdateVal = function _castUpdateVal (schema, val, op, $conditional) { - if (!schema) { - // non-existing schema path - return op in numberOps - ? Number(val) - : val - } - - if (schema.caster && op in castOps && - ('Object' === val.constructor.name || Array.isArray(val))) { - // Cast values for ops that add data to MongoDB. - // Ensures embedded documents get ObjectIds etc. - var tmp = schema.cast(val); - - if (Array.isArray(val)) { - val = tmp; - } else { - val = tmp[0]; - } - } - - if (op in numberOps) return Number(val); - if (/^\$/.test($conditional)) return schema.castForQuery($conditional, val); - return schema.castForQuery(val) -} - -/** - * Finds the schema for `path`. This is different than - * calling `schema.path` as it also resolves paths with - * positional selectors (something.$.another.$.path). - * - * @param {String} path - * @api private - */ - -Query.prototype._getSchema = function _getSchema (path) { - var schema = this.model.schema - , pathschema = schema.path(path); - - if (pathschema) - return pathschema; - - // look for arrays - return (function search (parts, schema) { - var p = parts.length + 1 - , foundschema - , trypath - - while (p--) { - trypath = parts.slice(0, p).join('.'); - foundschema = schema.path(trypath); - if (foundschema) { - if (foundschema.caster) { - - // array of Mixed? - if (foundschema.caster instanceof Types.Mixed) { - return foundschema.caster; - } - - // Now that we found the array, we need to check if there - // are remaining document paths to look up for casting. - // Also we need to handle array.$.path since schema.path - // doesn't work for that. - if (p !== parts.length) { - if ('$' === parts[p]) { - // comments.$.comments.$.title - return search(parts.slice(p+1), foundschema.schema); - } else { - // this is the last path of the selector - return search(parts.slice(p), foundschema.schema); - } - } - } - return foundschema; - } - } - })(path.split('.'), schema) -} - -/** - * Casts selected field arguments for field selection with mongo 2.2 - * - * query.select({ ids: { $elemMatch: { $in: [hexString] }}) - * - * @param {Object} fields - * @see https://github.com/LearnBoost/mongoose/issues/1091 - * @see http://docs.mongodb.org/manual/reference/projection/elemMatch/ - * @api private - */ - -Query.prototype._castFields = function _castFields (fields) { - var selected - , elemMatchKeys - , keys - , key - , out - , i - - if (fields) { - keys = Object.keys(fields); - elemMatchKeys = []; - i = keys.length; - - // collect $elemMatch args - while (i--) { - key = keys[i]; - if (fields[key].$elemMatch) { - selected || (selected = {}); - selected[key] = fields[key]; - elemMatchKeys.push(key); - } - } - } - - if (selected) { - // they passed $elemMatch, cast em - try { - out = this.cast(this.model, selected); - } catch (err) { - return err; - } - - // apply the casted field args - i = elemMatchKeys.length; - while (i--) { - key = elemMatchKeys[i]; - fields[key] = out[key]; - } - } - - return fields; -} - -/** - * Executes this query as a remove() operation. - * - * ####Example - * - * Cassette.where('artist').equals('Anne Murray').remove(callback) - * - * @param {Function} callback - * @api public - */ - -Query.prototype.remove = function (callback) { - this.op = 'remove'; - - var model = this.model - , options = this._optionsForExec(model) - , cb = 'function' == typeof callback - - try { - this.cast(model); - } catch (err) { - if (cb) return callback(err); - throw err; - } - - if (!cb) { - options.safe = { w: 0 }; - } - - var castQuery = this._conditions; - model.collection.remove(castQuery, options, tick(callback)); - return this; -}; - -/** - * Issues a mongodb [findAndModify](http://www.mongodb.org/display/DOCS/findAndModify+Command) update command. - * - * Finds a matching document, updates it according to the `update` arg, passing any `options`, and returns the found document (if any) to the callback. The query executes immediately if `callback` is passed else a Query object is returned. - * - * ####Available options - * - * - `new`: bool - true to return the modified document rather than the original. defaults to true - * - `upsert`: bool - creates the object if it doesn't exist. defaults to false. - * - `sort`: if multiple docs are found by the conditions, sets the sort order to choose which doc to update - * - * ####Examples - * - * query.findOneAndUpdate(conditions, update, options, callback) // executes - * query.findOneAndUpdate(conditions, update, options) // returns Query - * query.findOneAndUpdate(conditions, update, callback) // executes - * query.findOneAndUpdate(conditions, update) // returns Query - * query.findOneAndUpdate(callback) // executes - * query.findOneAndUpdate() // returns Query - * - * @param {Object} [query] - * @param {Object} [doc] - * @param {Object} [options] - * @param {Function} [callback] - * @see mongodb http://www.mongodb.org/display/DOCS/findAndModify+Command - * @return {Query} this - * @api public - */ - -Query.prototype.findOneAndUpdate = function (query, doc, options, callback) { - this.op = 'findOneAndUpdate'; - - switch (arguments.length) { - case 3: - if ('function' == typeof options) - callback = options, options = {}; - break; - case 2: - if ('function' == typeof doc) { - callback = doc; - doc = query; - query = undefined; - } - options = undefined; - break; - case 1: - if ('function' == typeof query) { - callback = query; - query = options = doc = undefined; - } else { - doc = query; - query = options = undefined; - } - } - - // apply query - if (query) { - if ('Object' === query.constructor.name) { - merge(this._conditions, query); - } else if (query instanceof Query) { - merge(this._conditions, query._conditions); - } else if (query instanceof Document) { - merge(this._conditions, query.toObject()); - } - } - - // apply doc - if (doc) { - merge(this._updateArg, doc); - } - - // apply options - options && this.setOptions(options); - - if (!callback) return this; - - return this._findAndModify('update', callback); -} - -/** - * Issues a mongodb [findAndModify](http://www.mongodb.org/display/DOCS/findAndModify+Command) remove command. - * - * Finds a matching document, removes it, passing the found document (if any) to the callback. Executes immediately if `callback` is passed else a Query object is returned. - * - * ####Available options - * - * - `sort`: if multiple docs are found by the conditions, sets the sort order to choose which doc to update - * - * ####Examples - * - * A.where().findOneAndRemove(conditions, options, callback) // executes - * A.where().findOneAndRemove(conditions, options) // return Query - * A.where().findOneAndRemove(conditions, callback) // executes - * A.where().findOneAndRemove(conditions) // returns Query - * A.where().findOneAndRemove(callback) // executes - * A.where().findOneAndRemove() // returns Query - * - * @param {Object} [conditions] - * @param {Object} [options] - * @param {Function} [callback] - * @return {Query} this - * @see mongodb http://www.mongodb.org/display/DOCS/findAndModify+Command - * @api public - */ - -Query.prototype.findOneAndRemove = function (conditions, options, callback) { - this.op = 'findOneAndRemove'; - - if ('function' == typeof options) { - callback = options; - options = undefined; - } else if ('function' == typeof conditions) { - callback = conditions; - conditions = undefined; - } - - // apply conditions - if (conditions) { - if ('Object' === conditions.constructor.name) { - merge(this._conditions, conditions); - } else if (conditions instanceof Query) { - merge(this._conditions, conditions._conditions); - } else if (conditions instanceof Document) { - merge(this._conditions, conditions.toObject()); - } - } - - // apply options - options && this.setOptions(options); - - if (!callback) return this; - - return this._findAndModify('remove', callback); -} - -/** - * _findAndModify - * - * @param {String} type - either "remove" or "update" - * @param {Function} callback - * @api private - */ - -Query.prototype._findAndModify = function (type, callback) { - var model = this.model - , promise = new Promise(callback) - , self = this - , castedQuery - , castedDoc - , fields - , sort - , opts - - castedQuery = castQuery(this); - if (castedQuery instanceof Error) { - process.nextTick(promise.error.bind(promise, castedQuery)); - return promise; - } - - opts = this._optionsForExec(model); - - if ('remove' == type) { - opts.remove = true; - } else { - if (!('new' in opts)) opts.new = true; - if (!('upsert' in opts)) opts.upsert = false; - - castedDoc = castDoc(this); - if (!castedDoc) { - if (opts.upsert) { - // still need to do the upsert to empty doc - castedDoc = { $set: {} }; - } else { - return this.findOne(callback); - } - } else if (castedDoc instanceof Error) { - process.nextTick(promise.error.bind(promise, castedDoc)); - return promise; - } - } - - this._applyPaths(); - - if (this._fields) { - fields = utils.clone(this._fields) - opts.fields = this._castFields(fields); - if (opts.fields instanceof Error) { - process.nextTick(promise.error.bind(promise, opts.fields)); - return promise; - } - } - - // the driver needs a default - sort = opts.sort || []; - - model - .collection - .findAndModify(castedQuery, sort, castedDoc, opts, tick(function (err, doc) { - if (err) return promise.error(err); - if (!doc) return promise.complete(null); - - if (true === opts.lean) { - return promise.complete(doc); - } - - var casted = new model(undefined, fields, true); - casted.init(doc, self, function (err) { - if (err) return promise.error(err); - promise.complete(casted); - }); - })); - - return promise; -} - -/** - * Specifies paths which should be populated with other documents. - * - * Paths are populated after the query executes and a response is received. A separate query is then executed for each path specified for population. After a response for each query has also been returned, the results are passed to the callback. - * - * ####Example: - * - * Kitten.findOne().populate('owner').exec(function (err, kitten) { - * console.log(kitten.owner.name) // Max - * }) - * - * @param {String} path - * @param {Object|String} [fields] Field selection for the population query - * @param {Model} [model] The name of the model you wish to use for population. If not specified, the name is looked up from the Schema ref. - * @param {Object} [conditions] Conditions for the population query - * @param {Object} [options] Options for the population query (sort, etc) - * @see population ./populate.html - * @see Query#select #query_Query-select - * @return {Query} this - * @api public - */ - -Query.prototype.populate = function (path, fields, model, conditions, options) { - if ('string' !== typeof model) { - options = conditions; - conditions = model; - model = undefined; - } - // The order of fields/conditions args is opposite Model.find but - // necessary to keep backward compatibility (fields could be - // an array, string, or object literal). - this.options.populate[path] = - new PopulateOptions(fields, conditions, options, model); - - return this; -}; - -/*! - * Populate options constructor - */ - -function PopulateOptions (fields, conditions, options, model) { - this.conditions = conditions; - this.fields = fields; - this.options = options; - this.model = model; -} - -// make it compatible with utils.clone -PopulateOptions.prototype.constructor = Object; - -/** - * Returns a stream interface - * - * ####Example - * - * // follows the nodejs stream api - * Thing.find({ name: /^hello/ }).stream().pipe(res) - * - * // manual streaming - * var stream = Thing.find({ name: /^hello/ }).stream(); - * - * stream.on('data', function (doc) { - * // do something with the mongoose document - * }).on('error', function (err) { - * // handle the error - * }).on('close', function () { - * // the stream is closed - * }); - * - * @return {QueryStream} - * @see QueryStream - * @api public - */ - -Query.prototype.stream = function stream () { - return new QueryStream(this); -} - -// helpers - -/*! - * castDoc - * @api private - */ - -function castDoc (query) { - try { - return query._castUpdate(query._updateArg); - } catch (err) { - return err; - } -} - -/*! - * castQuery - * @api private - */ - -function castQuery (query) { - try { - return query.cast(query.model); - } catch (err) { - return err; - } -} - -/*! - * Exports. - */ - -module.exports = Query; -module.exports.QueryStream = QueryStream; diff --git a/node_modules/mongoose/lib/querystream.js b/node_modules/mongoose/lib/querystream.js deleted file mode 100644 index 69726c4..0000000 --- a/node_modules/mongoose/lib/querystream.js +++ /dev/null @@ -1,313 +0,0 @@ - -/*! - * Module dependencies. - */ - -var Stream = require('stream').Stream -var utils = require('./utils') - -/** - * Provides a [ReadStream](http://nodejs.org/api/stream.html#stream_readable_stream) interface for Queries. - * - * var stream = Model.find().stream(); - * - * stream.on('data', function (doc) { - * // do something with the mongoose document - * }).on('error', function (err) { - * // handle the error - * }).on('close', function () { - * // the stream is closed - * }); - * - * - * The stream interface allows us to simply "plug-in" to other Node.js write streams (fs.createWriteStream) so everything "just works" out of the box. - * - * Model.where('created').gte(twoWeeksAgo).stream().pipe(writeStream); - * - * _NOTE: plugging into an HTTP response will *not* work out of the box. Those streams expect only strings or buffers to be emitted, so first formatting our documents as strings/buffers is necessary._ - * - * @param {Query} query - * @inherits NodeJS Stream http://nodejs.org/api/stream.html - * @event `data`: emits a single Mongoose document - * @event `error`: emits when an error occurs during streaming. This will emit _before_ the `close` event. - * @event `close`: emits when the stream reaches the end of the cursor or an error occurs, or the stream is manually `destroy`ed. After this event, no more events are emitted. - * @api public - */ - -function QueryStream (query) { - Stream.call(this); - - this.query = query; - this.readable = true; - this.paused = false; - this._cursor = null; - this._destroyed = null; - this._fields = null; - this._buffer = null; - this._inline = T_INIT; - this._running = false; - - // give time to hook up events - var self = this; - process.nextTick(function () { - self._init(); - }); -} - -/*! - * Inherit from Stream - */ - -QueryStream.prototype.__proto__ = Stream.prototype; - -/** - * Flag stating whether or not this stream is readable. - * - * @property readable - * @api public - */ - -QueryStream.prototype.readable; - -/** - * Flag stating whether or not this stream is paused. - * - * @property paused - * @api public - */ - -QueryStream.prototype.paused; - -// trampoline flags -var T_INIT = 0; -var T_IDLE = 1; -var T_CONT = 2; - -/** - * Initializes the query. - * - * @api private - */ - -QueryStream.prototype._init = function () { - if (this._destroyed) return; - - var query = this.query - , model = query.model - , options = query._optionsForExec(model) - , self = this - - try { - query.cast(model); - } catch (err) { - return self.destroy(err); - } - - self._fields = utils.clone(query._fields); - options.fields = query._castFields(self._fields); - - model.collection.find(query._conditions, options, function (err, cursor) { - if (err) return self.destroy(err); - self._cursor = cursor; - self._next(); - }); -} - -/** - * Trampoline for pulling the next doc from cursor. - * - * @see QueryStream#__next #querystream_QueryStream-__next - * @api private - */ - -QueryStream.prototype._next = function _next () { - if (this.paused || this._destroyed) { - return this._running = false; - } - - this._running = true; - - if (this._buffer && this._buffer.length) { - var arg; - while (!this.paused && !this._destroyed && (arg = this._buffer.shift())) { - this._onNextObject.apply(this, arg); - } - } - - // avoid stack overflows with large result sets. - // trampoline instead of recursion. - while (this.__next()) {} -} - -/** - * Pulls the next doc from the cursor. - * - * @see QueryStream#_next #querystream_QueryStream-_next - * @api private - */ - -QueryStream.prototype.__next = function () { - if (this.paused || this._destroyed) - return this._running = false; - - var self = this; - self._inline = T_INIT; - - self._cursor.nextObject(function cursorcb (err, doc) { - self._onNextObject(err, doc); - }); - - // if onNextObject() was already called in this tick - // return ourselves to the trampoline. - if (T_CONT === this._inline) { - return true; - } else { - // onNextObject() hasn't fired yet. tell onNextObject - // that its ok to call _next b/c we are not within - // the trampoline anymore. - this._inline = T_IDLE; - } -} - -/** - * Transforms raw `doc`s returned from the cursor into a model instance. - * - * @param {Error|null} err - * @param {Object} doc - * @api private - */ - -QueryStream.prototype._onNextObject = function _onNextObject (err, doc) { - if (this._destroyed) return; - - if (this.paused) { - this._buffer || (this._buffer = []); - this._buffer.push([err, doc]); - return this._running = false; - } - - if (err) return this.destroy(err); - - // when doc is null we hit the end of the cursor - if (!doc) { - this.emit('end'); - return this.destroy(); - } - - if (this.query.options && true === this.query.options.lean) { - this.emit('data', doc); - - // trampoline management - if (T_IDLE === this._inline) { - // no longer in trampoline. restart it. - this._next(); - } else { - // in a trampoline. tell __next that its - // ok to continue jumping. - this._inline = T_CONT; - } - return; - } - - var instance = new this.query.model(undefined, this._fields, true); - - var self = this; - instance.init(doc, this.query, function (err) { - if (err) return self.destroy(err); - self.emit('data', instance); - - // trampoline management - if (T_IDLE === self._inline) { - // no longer in trampoline. restart it. - self._next(); - } else - // in a trampoline. tell __next that its - // ok to continue jumping. - self._inline = T_CONT; - }); -} - -/** - * Pauses this stream. - * - * @api public - */ - -QueryStream.prototype.pause = function () { - this.paused = true; -} - -/** - * Resumes this stream. - * - * @api public - */ - -QueryStream.prototype.resume = function () { - this.paused = false; - - if (!this._cursor) { - // cannot start if not initialized - return; - } - - // are we within the trampoline? - if (T_INIT === this._inline) { - return; - } - - if (!this._running) { - // outside QueryStream control, need manual restart - return this._next(); - } -} - -/** - * Destroys the stream, closing the underlying cursor. No more events will be emitted. - * - * @param {Error} [err] - * @api public - */ - -QueryStream.prototype.destroy = function (err) { - if (this._destroyed) return; - this._destroyed = true; - this._running = false; - this.readable = false; - - if (this._cursor) { - this._cursor.close(); - } - - if (err) { - this.emit('error', err); - } - - this.emit('close'); -} - -/** - * Pipes this query stream into another stream. This method is inherited from NodeJS Streams. - * - * ####Example: - * - * query.stream().pipe(writeStream [, options]) - * - * This could be particularily useful if you are, for example, setting up an API for a service and want to stream out the docs based on some criteria. We could first pipe the QueryStream into a sort of filter that formats the stream as an array before passing on the document to an http response. - * - * var format = new ArrayFormatter; - * Events.find().stream().pipe(format).pipe(res); - * - * As long as ArrayFormat implements the WriteStream API we can stream large formatted result sets out to the client. See this [gist](https://gist.github.com/1403797) for a hacked example. - * - * @method pipe - * @memberOf QueryStream - * @see NodeJS http://nodejs.org/api/stream.html - * @api public - */ - -/*! - * Module exports - */ - -module.exports = exports = QueryStream; diff --git a/node_modules/mongoose/lib/schema.js b/node_modules/mongoose/lib/schema.js deleted file mode 100644 index cc455ab..0000000 --- a/node_modules/mongoose/lib/schema.js +++ /dev/null @@ -1,871 +0,0 @@ -/*! - * Module dependencies. - */ - -var EventEmitter = require('events').EventEmitter - , VirtualType = require('./virtualtype') - , utils = require('./utils') - , NamedScope - , Query - , Types - -/** - * Schema constructor. - * - * ####Example: - * - * var child = new Schema({ name: String }); - * var schema = new Schema({ name: String, age: Number, children: [child] }); - * var Tree = mongoose.model('Tree', schema); - * - * // setting schema options - * new Schema({ name: String }, { _id: false, autoIndex: false }) - * - * ####Options: - * - * - [autoIndex](/docs/guide.html#autoIndex): bool - defaults to true - * - [capped](/docs/guide.html#capped): bool - defaults to false - * - [collection](/docs/guide.html#collection): string - no default - * - [id](/docs/guide.html#id): bool - defaults to true - * - [_id](/docs/guide.html#_id): bool - defaults to true - * - [read](/docs/guide.html#read): string - * - [safe](/docs/guide.html#safe): bool - defaults to true. - * - [shardKey](/docs/guide.html#shardKey): bool - defaults to `null` - * - [strict](/docs/guide.html#strict): bool - defaults to true - * - [toJSON](/docs/guide.html#toJSON) - object - no default - * - [toObject](/docs/guide.html#toObject) - object - no default - * - [versionKey](/docs/guide.html#versionKey): bool - defaults to "__v" - * - `minimize`: bool - controls [document#toObject](#document_Document-toObject) behavior when called manually - defaults to true - * - * ####Note: - * - * _When nesting schemas, (`children` in the example above), always declare the child schema first before passing it into is parent._ - * - * @param {Object} definition - * @inherits NodeJS EventEmitter http://nodejs.org/api/events.html#events_class_events_eventemitter - * @event `init`: Emitted after the schema is compiled into a `Model`. - * @api public - */ - -function Schema (obj, options) { - if (!(this instanceof Schema)) - return new Schema(obj, options); - - this.paths = {}; - this.subpaths = {}; - this.virtuals = {}; - this.nested = {}; - this.inherits = {}; - this.callQueue = []; - this._indexes = []; - this.methods = {}; - this.statics = {}; - this.tree = {}; - this._requiredpaths = undefined; - - this.options = this.defaultOptions(options); - - // build paths - if (obj) { - this.add(obj); - } - - // ensure the documents get an auto _id unless disabled - var auto_id = !this.paths['_id'] && (!this.options.noId && this.options._id); - if (auto_id) { - this.add({ _id: {type: Schema.ObjectId, auto: true} }); - } - - // ensure the documents receive an id getter unless disabled - var autoid = !this.paths['id'] && (!this.options.noVirtualId && this.options.id); - if (autoid) { - this.virtual('id').get(idGetter); - } - - // versioning not directly added to schema b/c we only want - // it in the top level document, not embedded ones. -}; - -/*! - * Returns this documents _id cast to a string. - */ - -function idGetter () { - if (this.__id) { - return this.__id; - } - - return this.__id = null == this._id - ? null - : String(this._id); -} - -/*! - * Inherit from EventEmitter. - */ - -Schema.prototype.__proto__ = EventEmitter.prototype; - -/** - * Schema as flat paths - * - * ####Example: - * { - * '_id' : SchemaType, - * , 'nested.key' : SchemaType, - * } - * - * @api private - * @property paths - */ - -Schema.prototype.paths; - -/** - * Schema as a tree - * - * ####Example: - * { - * '_id' : ObjectId - * , 'nested' : { - * 'key' : String - * } - * } - * - * @api private - * @property tree - */ - -Schema.prototype.tree; - -/** - * Returns default options for this schema, merged with `options`. - * - * @param {Object} options - * @return {Object} - * @api private - */ - -Schema.prototype.defaultOptions = function (options) { - if (options && false === options.safe) { - options.safe = { w: 0 }; - } - - options = utils.options({ - strict: true - , capped: false // { size, max, autoIndexId } - , versionKey: '__v' - , minimize: true - , autoIndex: true - , shardKey: null - , read: null - // the following are only applied at construction time - , noId: false // deprecated, use { _id: false } - , _id: true - , noVirtualId: false // deprecated, use { id: false } - , id: true - }, options); - - if (options.read) - options.read = utils.readPref(options.read); - - return options; -} - -/** - * Adds key path / schema type pairs to this schema. - * - * ####Example: - * - * var ToySchema = new Schema; - * ToySchema.add({ name: 'string', color: 'string', price: 'number' }); - * - * @param {Object} obj - * @param {String} prefix - * @api public - */ - -Schema.prototype.add = function add (obj, prefix) { - prefix = prefix || ''; - for (var i in obj) { - if (null == obj[i]) { - throw new TypeError('Invalid value for schema path `'+ prefix + i +'`'); - } - - if (obj[i].constructor.name == 'Object' && (!obj[i].type || obj[i].type.type)) { - if (Object.keys(obj[i]).length) { - // nested object { last: { name: String }} - this.nested[prefix + i] = true; - this.add(obj[i], prefix + i + '.'); - } else { - this.path(prefix + i, obj[i]); // mixed type - } - } else { - this.path(prefix + i, obj[i]); - } - } -}; - -/** - * Reserved document keys. - * - * Keys in this object are names that are rejected in schema declarations b/c they conflict with mongoose functionality. Using these key name will throw an error. - * - * on, emit, _events, db, init, isNew, errors, schema, options, modelName, collection, _pres, _posts - * - * _NOTE:_ Use of these terms as method names is permitted, but play at your own risk, as they may be existing mongoose document methods you are stomping on. - * - * var schema = new Schema(..); - * schema.methods.init = function () {} // potentially breaking - */ - -Schema.reserved = Object.create(null); -var reserved = Schema.reserved; -reserved.on = -reserved.db = -reserved.init = -reserved.isNew = -reserved.errors = -reserved.schema = -reserved.options = -reserved.modelName = -reserved.collection = -reserved.emit = // EventEmitter -reserved._events = // EventEmitter -reserved._pres = reserved._posts = 1 // hooks.js - -/** - * Gets/sets schema paths. - * - * Sets a path (if arity 2) - * Gets a path (if arity 1) - * - * ####Example - * - * schema.path('name') // returns a SchemaType - * schema.path('name', Number) // changes the schemaType of `name` to Number - * - * @param {String} path - * @param {Object} constructor - * @api public - */ - -Schema.prototype.path = function (path, obj) { - if (obj == undefined) { - if (this.paths[path]) return this.paths[path]; - if (this.subpaths[path]) return this.subpaths[path]; - - // subpaths? - return /\.\d+\.?$/.test(path) - ? getPositionalPath(this, path) - : undefined; - } - - // some path names conflict with document methods - if (reserved[path]) { - throw new Error("`" + path + "` may not be used as a schema pathname"); - } - - // update the tree - var subpaths = path.split(/\./) - , last = subpaths.pop() - , branch = this.tree; - - subpaths.forEach(function(sub, i) { - if (!branch[sub]) branch[sub] = {}; - if ('object' != typeof branch[sub]) { - var msg = 'Cannot set nested path `' + path + '`. ' - + 'Parent path `' - + subpaths.slice(0, i).concat([sub]).join('.') - + '` already set to type ' + branch[sub].name - + '.'; - throw new Error(msg); - } - branch = branch[sub]; - }); - - branch[last] = utils.clone(obj); - - this.paths[path] = Schema.interpretAsType(path, obj); - return this; -}; - -/** - * Converts type arguments into Mongoose Types. - * - * @param {String} path - * @param {Object} obj constructor - * @api private - */ - -Schema.interpretAsType = function (path, obj) { - if (obj.constructor.name != 'Object') - obj = { type: obj }; - - // Get the type making sure to allow keys named "type" - // and default to mixed if not specified. - // { type: { type: String, default: 'freshcut' } } - var type = obj.type && !obj.type.type - ? obj.type - : {}; - - if ('Object' == type.constructor.name || 'mixed' == type) { - return new Types.Mixed(path, obj); - } - - if (Array.isArray(type) || Array == type || 'array' == type) { - // if it was specified through { type } look for `cast` - var cast = (Array == type || 'array' == type) - ? obj.cast - : type[0]; - - if (cast instanceof Schema) { - return new Types.DocumentArray(path, cast, obj); - } - - if ('string' == typeof cast) { - cast = Types[cast.charAt(0).toUpperCase() + cast.substring(1)]; - } else if (cast && (!cast.type || cast.type.type) - && 'Object' == cast.constructor.name - && Object.keys(cast).length) { - return new Types.DocumentArray(path, new Schema(cast), obj); - } - - return new Types.Array(path, cast || Types.Mixed, obj); - } - - var name = 'string' == typeof type - ? type - : type.name; - - if (name) { - name = name.charAt(0).toUpperCase() + name.substring(1); - } - - if (undefined == Types[name]) { - throw new TypeError('Undefined type at `' + path + - '`\n Did you try nesting Schemas? ' + - 'You can only nest using refs or arrays.'); - } - - return new Types[name](path, obj); -}; - -/** - * Iterates the schemas paths similar to Array#forEach. - * - * The callback is passed the pathname and schemaType as arguments on each iteration. - * - * @param {Function} fn callback function - * @return {Schema} this - * @api public - */ - -Schema.prototype.eachPath = function (fn) { - var keys = Object.keys(this.paths) - , len = keys.length; - - for (var i = 0; i < len; ++i) { - fn(keys[i], this.paths[keys[i]]); - } - - return this; -}; - -/** - * Returns an Array of path strings that are required by this schema. - * - * @api public - * @return {Array} - */ - -Schema.prototype.requiredPaths = function requiredPaths () { - if (this._requiredpaths) return this._requiredpaths; - - var paths = Object.keys(this.paths) - , i = paths.length - , ret = []; - - while (i--) { - var path = paths[i]; - if (this.paths[path].isRequired) ret.push(path); - } - - return this._requiredpaths = ret; -} - -/** - * Returns the pathType of `path` for this schema. - * - * Given a path, returns whether it is a real, virtual, nested, or ad-hoc/undefined path. - * - * @param {String} path - * @return {String} - * @api public - */ - -Schema.prototype.pathType = function (path) { - if (path in this.paths) return 'real'; - if (path in this.virtuals) return 'virtual'; - if (path in this.nested) return 'nested'; - if (path in this.subpaths) return 'real'; - - if (/\.\d+\.?/.test(path) && getPositionalPath(this, path)) { - return 'real'; - } else { - return 'adhocOrUndefined' - } -}; - -/*! - * ignore - */ - -function getPositionalPath (self, path) { - var subpaths = path.split(/\.(\d+)\.?/).filter(Boolean); - if (subpaths.length < 2) { - return self.paths[subpaths[0]]; - } - - var val = self.path(subpaths[0]); - if (!val) return val; - - var last = subpaths.length - 1 - , subpath - , i = 1; - - for (; i < subpaths.length; ++i) { - subpath = subpaths[i]; - - if (i === last && - val && - !val.schema && - !/\D/.test(subpath) && - val instanceof Types.Array) { - // StringSchema, NumberSchema, etc - val = val.caster; - continue; - } - - // 'path.0.subpath' - if (!/\D/.test(subpath)) continue; - val = val.schema.path(subpath); - } - - return self.subpaths[path] = val; -} - -/** - * Adds a method call to the queue. - * - * @param {String} name name of the document method to call later - * @param {Array} args arguments to pass to the method - * @api private - */ - -Schema.prototype.queue = function(name, args){ - this.callQueue.push([name, args]); - return this; -}; - -/** - * Defines a pre hook for the document. - * - * ####Example - * - * var toySchema = new Schema(..); - * - * toySchema.pre('save', function (next) { - * if (!this.created) this.created = new Date; - * next(); - * }) - * - * toySchema.pre('validate', function (next) { - * if (this.name != 'Woody') this.name = 'Woody'; - * next(); - * }) - * - * @param {String} method - * @param {Function} callback - * @see hooks.js https://github.com/bnoguchi/hooks-js/tree/31ec571cef0332e21121ee7157e0cf9728572cc3 - * @api public - */ - -Schema.prototype.pre = function(){ - return this.queue('pre', arguments); -}; - -/** - * Defines a post for the document - * - * Post hooks fire `on` the event emitted from document instances of Models compiled from this schema. - * - * var schema = new Schema(..); - * schema.post('save', function (doc) { - * console.log('this fired after a document was saved'); - * }); - * - * var Model = mongoose.model('Model', schema); - * - * var m = new Model(..); - * m.save(function (err) { - * console.log('this fires after the `post` hook'); - * }); - * - * @param {String} method name of the method to hook - * @param {Function} fn callback - * @see hooks.js https://github.com/bnoguchi/hooks-js/tree/31ec571cef0332e21121ee7157e0cf9728572cc3 - * @api public - */ - -Schema.prototype.post = function(method, fn){ - return this.queue('on', arguments); -}; - -/** - * Registers a plugin for this schema. - * - * @param {Function} plugin callback - * @param {Object} opts - * @see plugins - * @api public - */ - -Schema.prototype.plugin = function (fn, opts) { - fn(this, opts); - return this; -}; - -/** - * Adds an instance method to documents constructed from Models compiled from this schema. - * - * ####Example - * - * var schema = kittySchema = new Schema(..); - * - * schema.methods.meow = function () { - * console.log('meeeeeoooooooooooow'); - * }) - * - * var Kitty = mongoose.model('Kitty', schema); - * - * var fizz = new Kitty; - * fizz.meow(); // meeeeeooooooooooooow - * - * If a hash of name/fn pairs is passed as the only argument, each name/fn pair will be added as methods. - * - * schema.method({ - * purr: function () {} - * , scratch: function () {} - * }); - * - * // later - * fizz.purr(); - * fizz.scratch(); - * - * @param {String|Object} method name - * @param {Function} [fn] - * @api public - */ - -Schema.prototype.method = function (name, fn) { - if ('string' != typeof name) - for (var i in name) - this.methods[i] = name[i]; - else - this.methods[name] = fn; - return this; -}; - -/** - * Adds static "class" methods to Models compiled from this schema. - * - * ####Example - * - * var schema = new Schema(..); - * schema.static('findByName', function (name, callback) { - * return this.find({ name: name }, callback); - * }); - * - * var Drink = mongoose.model('Drink', schema); - * Drink.findByName('sanpellegrino', function (err, drinks) { - * // - * }); - * - * If a hash of name/fn pairs is passed as the only argument, each name/fn pair will be added as statics. - * - * @param {String} name - * @param {Function} fn - * @api public - */ - -Schema.prototype.static = function(name, fn) { - if ('string' != typeof name) - for (var i in name) - this.statics[i] = name[i]; - else - this.statics[name] = fn; - return this; -}; - -/** - * Defines an index (most likely compound) for this schema. - * - * ####Example - * - * schema.index({ first: 1, last: -1 }) - * - * @param {Object} fields - * @param {Object} [options] - * @api public - */ - -Schema.prototype.index = function (fields, options) { - options || (options = {}); - - if (options.expires) - utils.expires(options); - - this._indexes.push([fields, options]); - return this; -}; - -/** - * Sets/gets a schema option. - * - * @param {String} key option name - * @param {Object} [value] if not passed, the current option value is returned - * @api public - */ - -Schema.prototype.set = function (key, value, _tags) { - if (1 === arguments.length) { - return this.options[key]; - } - - switch (key) { - case 'read': - this.options[key] = utils.readPref(value, _tags) - break; - case 'safe': - this.options[key] = false === value - ? { w: 0 } - : value - break; - default: - this.options[key] = value; - } - - return this; -} - -/** - * Gets a schema option. - * - * @param {String} key option name - * @api public - */ - -Schema.prototype.get = function (key) { - return this.options[key]; -} - -/** - * Compiles indexes from fields and schema-level indexes - * - * @api public - */ - -Schema.prototype.indexes = function () { - var indexes = [] - , seenSchemas = []; - - collectIndexes(this); - - return indexes; - - function collectIndexes (schema, prefix) { - if (~seenSchemas.indexOf(schema)) return; - seenSchemas.push(schema); - - var index; - var paths = schema.paths; - prefix = prefix || ''; - - for (var i in paths) { - if (paths[i]) { - if (paths[i] instanceof Types.DocumentArray) { - collectIndexes(paths[i].schema, i + '.'); - } else { - index = paths[i]._index; - - if (index !== false && index !== null){ - var field = {}; - field[prefix + i] = '2d' === index ? index : 1; - var options = 'Object' === index.constructor.name ? index : {}; - if (!('background' in options)) options.background = true; - indexes.push([field, options]); - } - } - } - } - - if (prefix) { - fixSubIndexPaths(schema, prefix); - } else { - schema._indexes.forEach(function (index) { - if (!('background' in index[1])) index[1].background = true; - }); - indexes = indexes.concat(schema._indexes); - } - } - - /*! - * Checks for indexes added to subdocs using Schema.index(). - * These indexes need their paths prefixed properly. - * - * schema._indexes = [ [indexObj, options], [indexObj, options] ..] - */ - - function fixSubIndexPaths (schema, prefix) { - var subindexes = schema._indexes - , len = subindexes.length - , indexObj - , newindex - , klen - , keys - , key - , i = 0 - , j - - for (i = 0; i < len; ++i) { - indexObj = subindexes[i][0]; - keys = Object.keys(indexObj); - klen = keys.length; - newindex = {}; - - // use forward iteration, order matters - for (j = 0; j < klen; ++j) { - key = keys[j]; - newindex[prefix + key] = indexObj[key]; - } - - indexes.push([newindex, subindexes[i][1]]); - } - } -} - -/** - * Creates a virtual type with the given name. - * - * @param {String} name - * @param {Object} [options] - * @return {VirtualType} - */ - -Schema.prototype.virtual = function (name, options) { - var virtuals = this.virtuals; - var parts = name.split('.'); - return virtuals[name] = parts.reduce(function (mem, part, i) { - mem[part] || (mem[part] = (i === parts.length-1) - ? new VirtualType(options, name) - : {}); - return mem[part]; - }, this.tree); -}; - -/** - * Returns the virtual type with the given `name`. - * - * @param {String} name - * @return {VirtualType} - */ - -Schema.prototype.virtualpath = function (name) { - return this.virtuals[name]; -}; - -/** - * These still haven't been fixed. Once they're working we'll make them public again. - * @api private - */ - -Schema.prototype.namedScope = function (name, fn) { - var namedScopes = this.namedScopes || (this.namedScopes = new NamedScope) - , newScope = Object.create(namedScopes) - , allScopes = namedScopes.scopesByName || (namedScopes.scopesByName = {}); - allScopes[name] = newScope; - newScope.name = name; - newScope.block = fn; - newScope.query = new Query(); - newScope.decorate(namedScopes, { - block0: function (block) { - return function () { - block.call(this.query); - return this; - }; - }, - blockN: function (block) { - return function () { - block.apply(this.query, arguments); - return this; - }; - }, - basic: function (query) { - return function () { - this.query.find(query); - return this; - }; - } - }); - return newScope; -}; - -/*! - * Module exports. - */ - -module.exports = exports = Schema; - -// require down here because of reference issues - -/** - * The various Mongoose Schema Types. - * - * ####Example: - * - * ####Example: - * - * var mongoose = require('mongoose'); - * var ObjectId = mongoose.Schema.Types.ObjectId; - * - * ####Types: - * - * - String - * - Number - * - Boolean | Bool - * - Array - * - Buffer - * - Date - * - ObjectId | Oid - * - Mixed - * - * Using this exposed access to the `Mixed` SchemaType, we can use them in our schema. - * - * var Mixed = mongoose.Schema.Types.Mixed; - * new mongoose.Schema({ _user: Mixed }) - * - * @api public - */ - -Schema.Types = require('./schema/index'); - -/*! - * ignore - */ - -Types = Schema.Types; -NamedScope = require('./namedscope') -Query = require('./query'); -var ObjectId = exports.ObjectId = Types.ObjectId; - diff --git a/node_modules/mongoose/lib/schema/array.js b/node_modules/mongoose/lib/schema/array.js deleted file mode 100644 index 83455ed..0000000 --- a/node_modules/mongoose/lib/schema/array.js +++ /dev/null @@ -1,266 +0,0 @@ -/*! - * Module dependencies. - */ - -var SchemaType = require('../schematype') - , CastError = SchemaType.CastError - , NumberSchema = require('./number') - , Types = { - Boolean: require('./boolean') - , Date: require('./date') - , Number: require('./number') - , String: require('./string') - , ObjectId: require('./objectid') - , Buffer: require('./buffer') - } - , MongooseArray = require('../types').Array - , EmbeddedDoc = require('../types').Embedded - , Mixed = require('./mixed') - , Query = require('../query') - , isMongooseObject = require('../utils').isMongooseObject - -/** - * Array SchemaType constructor - * - * @param {String} key - * @param {SchemaType} cast - * @param {Object} options - * @inherits SchemaType - * @api private - */ - -function SchemaArray (key, cast, options) { - if (cast) { - var castOptions = {}; - - if ('Object' === cast.constructor.name) { - if (cast.type) { - // support { type: Woot } - castOptions = cast; - cast = cast.type; - delete castOptions.type; - } else { - cast = Mixed; - } - } - - var caster = cast.name in Types ? Types[cast.name] : cast; - this.casterConstructor = caster; - this.caster = new caster(null, castOptions); - if (!(this.caster instanceof EmbeddedDoc)) { - this.caster.path = key; - } - } - - SchemaType.call(this, key, options); - - var self = this - , defaultArr - , fn; - - if (this.defaultValue) { - defaultArr = this.defaultValue; - fn = 'function' == typeof defaultArr; - } - - this.default(function(){ - var arr = fn ? defaultArr() : defaultArr || []; - return new MongooseArray(arr, self.path, this); - }); -}; - -/*! - * Inherits from SchemaType. - */ - -SchemaArray.prototype.__proto__ = SchemaType.prototype; - -/** - * Check required - * - * @param {Array} value - * @api private - */ - -SchemaArray.prototype.checkRequired = function (value) { - return !!(value && value.length); -}; - -/** - * Overrides the getters application for the population special-case - * - * @param {Object} value - * @param {Object} scope - * @api private - */ - -SchemaArray.prototype.applyGetters = function (value, scope) { - if (this.caster.options && this.caster.options.ref) { - // means the object id was populated - return value; - } - - return SchemaType.prototype.applyGetters.call(this, value, scope); -}; - -/** - * Casts contents - * - * @param {Object} value - * @param {Document} doc document that triggers the casting - * @param {Boolean} init whether this is an initialization cast - * @api private - */ - -SchemaArray.prototype.cast = function (value, doc, init) { - if (Array.isArray(value)) { - if (!(value instanceof MongooseArray)) { - value = new MongooseArray(value, this.path, doc); - } - - if (this.caster) { - try { - for (var i = 0, l = value.length; i < l; i++) { - value[i] = this.caster.cast(value[i], doc, init); - } - } catch (e) { - // rethrow - throw new CastError(e.type, value, this.path); - } - } - - return value; - } else { - return this.cast([value], doc, init); - } -}; - -/** - * Casts contents for queries. - * - * @param {String} $conditional - * @param {any} [value] - * @api private - */ - -SchemaArray.prototype.castForQuery = function ($conditional, value) { - var handler - , val; - if (arguments.length === 2) { - handler = this.$conditionalHandlers[$conditional]; - if (!handler) - throw new Error("Can't use " + $conditional + " with Array."); - val = handler.call(this, value); - } else { - val = $conditional; - var proto = this.casterConstructor.prototype; - var method = proto.castForQuery || proto.cast; - - var caster = this.caster; - if (Array.isArray(val)) { - val = val.map(function (v) { - if (method) v = method.call(caster, v); - - return isMongooseObject(v) - ? v.toObject() - : v; - }); - } else if (method) { - val = method.call(caster, val); - } - } - return val && isMongooseObject(val) - ? val.toObject() - : val; -}; - -/*! - * @ignore - */ - -function castToNumber (val) { - return Types.Number.prototype.cast.call(this, val); -} - -SchemaArray.prototype.$conditionalHandlers = { - '$all': function handle$all (val) { - if (!Array.isArray(val)) { - val = [val]; - } - - val = val.map(function (v) { - if (v && 'Object' === v.constructor.name) { - var o = {}; - o[this.path] = v; - var query = new Query(o); - query.cast(this.casterConstructor); - return query._conditions[this.path]; - } - return v; - }, this); - - return this.castForQuery(val); - } - , '$elemMatch': function (val) { - if (val.$in) { - val.$in = this.castForQuery('$in', val.$in); - return val; - } - - var query = new Query(val); - query.cast(this.casterConstructor); - return query._conditions; - } - , '$size': castToNumber - , '$ne': SchemaArray.prototype.castForQuery - , '$in': SchemaArray.prototype.castForQuery - , '$nin': SchemaArray.prototype.castForQuery - , '$regex': SchemaArray.prototype.castForQuery - , '$near': SchemaArray.prototype.castForQuery - , '$nearSphere': SchemaArray.prototype.castForQuery - , '$gt': SchemaArray.prototype.castForQuery - , '$gte': SchemaArray.prototype.castForQuery - , '$lt': SchemaArray.prototype.castForQuery - , '$lte': SchemaArray.prototype.castForQuery - , '$within': function (val) { - var self = this; - - if (val.$maxDistance) { - val.$maxDistance = castToNumber.call(this, val.$maxDistance); - } - - if (val.$box || val.$polygon) { - var type = val.$box ? '$box' : '$polygon'; - val[type].forEach(function (arr) { - if (!Array.isArray(arr)) { - var msg = 'Invalid $within $box argument. ' - + 'Expected an array, received ' + arr; - throw new TypeError(msg); - } - arr.forEach(function (v, i) { - arr[i] = castToNumber.call(this, v); - }); - }) - } else if (val.$center || val.$centerSphere) { - var type = val.$center ? '$center' : '$centerSphere'; - val[type].forEach(function (item, i) { - if (Array.isArray(item)) { - item.forEach(function (v, j) { - item[j] = castToNumber.call(this, v); - }); - } else { - val[type][i] = castToNumber.call(this, item); - } - }) - } - - return val; - } - , '$maxDistance': castToNumber -}; - -/*! - * Module exports. - */ - -module.exports = SchemaArray; diff --git a/node_modules/mongoose/lib/schema/boolean.js b/node_modules/mongoose/lib/schema/boolean.js deleted file mode 100644 index 05635bc..0000000 --- a/node_modules/mongoose/lib/schema/boolean.js +++ /dev/null @@ -1,91 +0,0 @@ - -/*! - * Module dependencies. - */ - -var SchemaType = require('../schematype'); - -/** - * Boolean SchemaType constructor. - * - * @param {String} path - * @param {Object} options - * @inherits SchemaType - * @api private - */ - -function SchemaBoolean (path, options) { - SchemaType.call(this, path, options); -}; - -/*! - * Inherits from SchemaType. - */ -SchemaBoolean.prototype.__proto__ = SchemaType.prototype; - -/** - * Required validator - * - * @api private - */ - -SchemaBoolean.prototype.checkRequired = function (value) { - return value === true || value === false; -}; - -/** - * Casts to boolean - * - * @param {Object} value - * @api private - */ - -SchemaBoolean.prototype.cast = function (value) { - if (value === null) return value; - if (value === '0') return false; - return !!value; -}; - -/*! - * ignore - */ - -function handleArray (val) { - var self = this; - return val.map(function (m) { - return self.cast(m); - }); -} - -SchemaBoolean.$conditionalHandlers = { - '$in': handleArray -} - -/** - * Casts contents for queries. - * - * @param {String} $conditional - * @param {any} val - * @api private - */ - -SchemaBoolean.prototype.castForQuery = function ($conditional, val) { - var handler; - if (2 === arguments.length) { - handler = SchemaBoolean.$conditionalHandlers[$conditional]; - - if (handler) { - return handler.call(this, val); - } - - return this.cast(val); - } - - return this.cast($conditional); -}; - -/*! - * Module exports. - */ - -module.exports = SchemaBoolean; diff --git a/node_modules/mongoose/lib/schema/buffer.js b/node_modules/mongoose/lib/schema/buffer.js deleted file mode 100644 index 64321f5..0000000 --- a/node_modules/mongoose/lib/schema/buffer.js +++ /dev/null @@ -1,119 +0,0 @@ -/*! - * Module dependencies. - */ - -var SchemaType = require('../schematype') - , CastError = SchemaType.CastError - , MongooseBuffer = require('../types').Buffer - , Binary = MongooseBuffer.Binary - , Query = require('../query'); - -/** - * Buffer SchemaType constructor - * - * @param {String} key - * @param {SchemaType} cast - * @inherits SchemaType - * @api private - */ - -function SchemaBuffer (key, options) { - SchemaType.call(this, key, options, 'Buffer'); -}; - -/*! - * Inherits from SchemaType. - */ - -SchemaBuffer.prototype.__proto__ = SchemaType.prototype; - -/** - * Check required - * - * @api private - */ - -SchemaBuffer.prototype.checkRequired = function (value) { - return !!(value && value.length); -}; - -/** - * Casts contents - * - * @param {Object} value - * @param {Document} doc document that triggers the casting - * @param {Boolean} init - * @api private - */ - -SchemaBuffer.prototype.cast = function (value, doc, init) { - if (SchemaType._isRef(this, value, init)) return value; - - if (Buffer.isBuffer(value)) { - if (!(value instanceof MongooseBuffer)) { - value = new MongooseBuffer(value, [this.path, doc]); - } - - return value; - } else if (value instanceof Binary) { - return new MongooseBuffer(value.value(true), [this.path, doc]); - } - - var type = typeof value; - if ('string' == type || 'number' == type || Array.isArray(value)) { - return new MongooseBuffer(value, [this.path, doc]); - } - - throw new CastError('buffer', value, this.path); -}; - -/*! - * ignore - */ -function handleSingle (val) { - return this.castForQuery(val); -} - -function handleArray (val) { - var self = this; - return val.map( function (m) { - return self.castForQuery(m); - }); -} - -SchemaBuffer.prototype.$conditionalHandlers = { - '$ne' : handleSingle - , '$in' : handleArray - , '$nin': handleArray - , '$gt' : handleSingle - , '$lt' : handleSingle - , '$gte': handleSingle - , '$lte': handleSingle -}; - -/** - * Casts contents for queries. - * - * @param {String} $conditional - * @param {any} [value] - * @api private - */ - -SchemaBuffer.prototype.castForQuery = function ($conditional, val) { - var handler; - if (arguments.length === 2) { - handler = this.$conditionalHandlers[$conditional]; - if (!handler) - throw new Error("Can't use " + $conditional + " with Buffer."); - return handler.call(this, val); - } else { - val = $conditional; - return this.cast(val).toObject(); - } -}; - -/*! - * Module exports. - */ - -module.exports = SchemaBuffer; diff --git a/node_modules/mongoose/lib/schema/date.js b/node_modules/mongoose/lib/schema/date.js deleted file mode 100644 index fecd7d9..0000000 --- a/node_modules/mongoose/lib/schema/date.js +++ /dev/null @@ -1,126 +0,0 @@ - -/*! - * Module requirements. - */ - -var SchemaType = require('../schematype') - , CastError = SchemaType.CastError; - -/** - * Date SchemaType constructor. - * - * @param {String} key - * @param {Object} options - * @inherits SchemaType - * @api private - */ - -function SchemaDate (key, options) { - SchemaType.call(this, key, options); -}; - -/*! - * Inherits from SchemaType. - */ - -SchemaDate.prototype.__proto__ = SchemaType.prototype; - -/** - * Required validator for date - * - * @api private - */ - -SchemaDate.prototype.checkRequired = function (value) { - return value instanceof Date; -}; - -/** - * Casts to date - * - * @param {Object} value to cast - * @api private - */ - -SchemaDate.prototype.cast = function (value) { - if (value === null || value === '') - return null; - - if (value instanceof Date) - return value; - - var date; - - // support for timestamps - if (value instanceof Number || 'number' == typeof value - || String(value) == Number(value)) - date = new Date(Number(value)); - - // support for date strings - else if (value.toString) - date = new Date(value.toString()); - - if (date.toString() != 'Invalid Date') - return date; - - throw new CastError('date', value, this.path); -}; - -/*! - * Date Query casting. - * - * @api private - */ - -function handleSingle (val) { - return this.cast(val); -} - -function handleArray (val) { - var self = this; - return val.map( function (m) { - return self.cast(m); - }); -} - -SchemaDate.prototype.$conditionalHandlers = { - '$lt': handleSingle - , '$lte': handleSingle - , '$gt': handleSingle - , '$gte': handleSingle - , '$ne': handleSingle - , '$in': handleArray - , '$nin': handleArray - , '$all': handleArray -}; - - -/** - * Casts contents for queries. - * - * @param {String} $conditional - * @param {any} [value] - * @api private - */ - -SchemaDate.prototype.castForQuery = function ($conditional, val) { - var handler; - - if (2 !== arguments.length) { - return this.cast($conditional); - } - - handler = this.$conditionalHandlers[$conditional]; - - if (!handler) { - throw new Error("Can't use " + $conditional + " with Date."); - } - - return handler.call(this, val); -}; - -/*! - * Module exports. - */ - -module.exports = SchemaDate; diff --git a/node_modules/mongoose/lib/schema/documentarray.js b/node_modules/mongoose/lib/schema/documentarray.js deleted file mode 100644 index 93f2455..0000000 --- a/node_modules/mongoose/lib/schema/documentarray.js +++ /dev/null @@ -1,189 +0,0 @@ - -/*! - * Module dependencies. - */ - -var SchemaType = require('../schematype') - , ArrayType = require('./array') - , MongooseDocumentArray = require('../types/documentarray') - , Subdocument = require('../types/embedded') - , Document = require('../document'); - -/** - * SubdocsArray SchemaType constructor - * - * @param {String} key - * @param {Schema} schema - * @param {Object} options - * @inherits SchemaArray - * @api private - */ - -function DocumentArray (key, schema, options) { - - // compile an embedded document for this schema - function EmbeddedDocument () { - Subdocument.apply(this, arguments); - } - - EmbeddedDocument.prototype.__proto__ = Subdocument.prototype; - EmbeddedDocument.prototype._setSchema(schema); - EmbeddedDocument.schema = schema; - - // apply methods - for (var i in schema.methods) { - EmbeddedDocument.prototype[i] = schema.methods[i]; - } - - // apply statics - for (var i in schema.statics) - EmbeddedDocument[i] = schema.statics[i]; - - EmbeddedDocument.options = options; - this.schema = schema; - - ArrayType.call(this, key, EmbeddedDocument, options); - - this.schema = schema; - var path = this.path; - var fn = this.defaultValue; - - this.default(function(){ - var arr = fn.call(this); - if (!Array.isArray(arr)) arr = [arr]; - return new MongooseDocumentArray(arr, path, this); - }); -}; - -/*! - * Inherits from ArrayType. - */ - -DocumentArray.prototype.__proto__ = ArrayType.prototype; - -/** - * Performs local validations first, then validations on each embedded doc - * - * @api private - */ - -DocumentArray.prototype.doValidate = function (array, fn, scope) { - var self = this; - - SchemaType.prototype.doValidate.call(this, array, function (err) { - if (err) return fn(err); - - var count = array && array.length - , error; - - if (!count) return fn(); - - // handle sparse arrays, do not use array.forEach which does not - // iterate over sparse elements yet reports array.length including - // them :( - - for (var i = 0, len = count; i < len; ++i) { - // sidestep sparse entries - var doc = array[i]; - if (!doc) { - --count || fn(); - continue; - } - - ;(function (i) { - doc.validate(function (err) { - if (err && !error) { - // rewrite the key - err.key = self.key + '.' + i + '.' + err.key; - return fn(error = err); - } - --count || fn(); - }); - })(i); - } - }, scope); -}; - -/** - * Casts contents - * - * @param {Object} value - * @param {Document} document that triggers the casting - * @api private - */ - -DocumentArray.prototype.cast = function (value, doc, init, prev) { - var selected - , subdoc - , i - - if (!Array.isArray(value)) { - return this.cast([value], doc, init, prev); - } - - if (!(value instanceof MongooseDocumentArray)) { - value = new MongooseDocumentArray(value, this.path, doc); - } - - i = value.length; - - while (i--) { - if (!(value[i] instanceof Subdocument) && value[i]) { - if (init) { - selected || (selected = scopePaths(this, doc._selected, init)); - subdoc = new this.casterConstructor(null, value, true, selected); - value[i] = subdoc.init(value[i]); - } else { - if (prev && (subdoc = prev.id(value[i]._id))) { - // handle resetting doc with existing id but differing data - // doc.array = [{ doc: 'val' }] - subdoc.set(value[i]); - } else { - subdoc = new this.casterConstructor(value[i], value); - } - - // if set() is hooked it will have no return value - // see gh-746 - value[i] = subdoc; - } - } - } - - return value; -} - -/*! - * Scopes paths selected in a query to this array. - * Necessary for proper default application of subdocument values. - * - * @param {DocumentArray} array - the array to scope `fields` paths - * @param {Object|undefined} fields - the root fields selected in the query - * @param {Boolean|undefined} init - if we are being created part of a query result - */ - -function scopePaths (array, fields, init) { - if (!(init && fields)) return undefined; - - var path = array.path + '.' - , keys = Object.keys(fields) - , i = keys.length - , selected = {} - , hasKeys - , key - - while (i--) { - key = keys[i]; - if (0 === key.indexOf(path)) { - hasKeys || (hasKeys = true); - selected[key.substring(path.length)] = fields[key]; - } - } - - return hasKeys && selected || undefined; -} - -/*! - * Module exports. - */ - -module.exports = DocumentArray; diff --git a/node_modules/mongoose/lib/schema/index.js b/node_modules/mongoose/lib/schema/index.js deleted file mode 100644 index d1347ed..0000000 --- a/node_modules/mongoose/lib/schema/index.js +++ /dev/null @@ -1,28 +0,0 @@ - -/*! - * Module exports. - */ - -exports.String = require('./string'); - -exports.Number = require('./number'); - -exports.Boolean = require('./boolean'); - -exports.DocumentArray = require('./documentarray'); - -exports.Array = require('./array'); - -exports.Buffer = require('./buffer'); - -exports.Date = require('./date'); - -exports.ObjectId = require('./objectid'); - -exports.Mixed = require('./mixed'); - -// alias - -exports.Oid = exports.ObjectId; -exports.Object = exports.Mixed; -exports.Bool = exports.Boolean; diff --git a/node_modules/mongoose/lib/schema/mixed.js b/node_modules/mongoose/lib/schema/mixed.js deleted file mode 100644 index f22ebb9..0000000 --- a/node_modules/mongoose/lib/schema/mixed.js +++ /dev/null @@ -1,75 +0,0 @@ - -/*! - * Module dependencies. - */ - -var SchemaType = require('../schematype'); - -/** - * Mixed SchemaType constructor. - * - * @param {String} path - * @param {Object} options - * @inherits SchemaType - * @api private - */ - -function Mixed (path, options) { - // make sure empty array defaults are handled - if (options && - options.default && - Array.isArray(options.default) && - 0 === options.default.length) { - options.default = Array; - } - - SchemaType.call(this, path, options); -}; - -/*! - * Inherits from SchemaType. - */ - -Mixed.prototype.__proto__ = SchemaType.prototype; - -/** - * Required validator - * - * @api private - */ - -Mixed.prototype.checkRequired = function (val) { - return true; -}; - -/** - * Casts `val` for Mixed. - * - * _this is a no-op_ - * - * @param {Object} value to cast - * @api private - */ - -Mixed.prototype.cast = function (val) { - return val; -}; - -/** - * Casts contents for queries. - * - * @param {String} $cond - * @param {any} [val] - * @api private - */ - -Mixed.prototype.castForQuery = function ($cond, val) { - if (arguments.length === 2) return val; - return $cond; -}; - -/*! - * Module exports. - */ - -module.exports = Mixed; diff --git a/node_modules/mongoose/lib/schema/number.js b/node_modules/mongoose/lib/schema/number.js deleted file mode 100644 index 0ac633c..0000000 --- a/node_modules/mongoose/lib/schema/number.js +++ /dev/null @@ -1,182 +0,0 @@ -/*! - * Module requirements. - */ - -var SchemaType = require('../schematype') - , CastError = SchemaType.CastError - -/** - * Number SchemaType constructor. - * - * @param {String} key - * @param {Object} options - * @inherits SchemaType - * @api private - */ - -function SchemaNumber (key, options) { - SchemaType.call(this, key, options, 'Number'); -}; - -/*! - * Inherits from SchemaType. - */ - -SchemaNumber.prototype.__proto__ = SchemaType.prototype; - -/** - * Required validator for number - * - * @api private - */ - -SchemaNumber.prototype.checkRequired = function checkRequired (value) { - if (SchemaType._isRef(this, value, true)) { - return null != value; - } else { - return typeof value == 'number' || value instanceof Number; - } -}; - -/** - * Sets a minimum number validator. - * - * ####Example: - * - * var s = new Schema({ n: { type: Number, min: 10 }) - * var M = db.model('M', s) - * var m = new M({ n: 9 }) - * m.save(function (err) { - * console.error(err) // validator error - * m.n = 10; - * m.save() // success - * }) - * - * @param {Number} value minimum number - * @param {String} message - * @api public - */ - -SchemaNumber.prototype.min = function (value, message) { - if (this.minValidator) - this.validators = this.validators.filter(function(v){ - return v[1] != 'min'; - }); - if (value != null) - this.validators.push([function(v){ - return v === null || v >= value; - }, 'min']); - return this; -}; - -/** - * Sets a maximum number validator. - * - * ####Example: - * - * var s = new Schema({ n: { type: Number, max: 10 }) - * var M = db.model('M', s) - * var m = new M({ n: 11 }) - * m.save(function (err) { - * console.error(err) // validator error - * m.n = 10; - * m.save() // success - * }) - * - * @param {Number} maximum number - * @param {String} message - * @api public - */ - -SchemaNumber.prototype.max = function (value, message) { - if (this.maxValidator) - this.validators = this.validators.filter(function(v){ - return v[1] != 'max'; - }); - if (value != null) - this.validators.push([this.maxValidator = function(v){ - return v === null || v <= value; - }, 'max']); - return this; -}; - -/** - * Casts to number - * - * @param {Object} value value to cast - * @param {Document} doc document that triggers the casting - * @param {Boolean} init - * @api private - */ - -SchemaNumber.prototype.cast = function (value, doc, init) { - if (SchemaType._isRef(this, value, init)) return value; - - if (!isNaN(value)){ - if (null === value) return value; - if ('' === value) return null; - if ('string' == typeof value) value = Number(value); - if (value instanceof Number) return value - if ('number' == typeof value) return value; - if (value.toString && !Array.isArray(value) && - value.toString() == Number(value)) { - return new Number(value) - } - } - - throw new CastError('number', value, this.path); -}; - -/*! - * ignore - */ - -function handleSingle (val) { - return this.cast(val) -} - -function handleArray (val) { - var self = this; - return val.map( function (m) { - return self.cast(m) - }); -} - -SchemaNumber.prototype.$conditionalHandlers = { - '$lt' : handleSingle - , '$lte': handleSingle - , '$gt' : handleSingle - , '$gte': handleSingle - , '$ne' : handleSingle - , '$in' : handleArray - , '$nin': handleArray - , '$mod': handleArray - , '$all': handleArray -}; - -/** - * Casts contents for queries. - * - * @param {String} $conditional - * @param {any} [value] - * @api private - */ - -SchemaNumber.prototype.castForQuery = function ($conditional, val) { - var handler; - if (arguments.length === 2) { - handler = this.$conditionalHandlers[$conditional]; - if (!handler) - throw new Error("Can't use " + $conditional + " with Number."); - return handler.call(this, val); - } else { - val = this.cast($conditional); - return val == null ? val : val - } -}; - -/*! - * Module exports. - */ - -module.exports = SchemaNumber; diff --git a/node_modules/mongoose/lib/schema/objectid.js b/node_modules/mongoose/lib/schema/objectid.js deleted file mode 100644 index 05762fe..0000000 --- a/node_modules/mongoose/lib/schema/objectid.js +++ /dev/null @@ -1,151 +0,0 @@ -/*! - * Module dependencies. - */ - -var SchemaType = require('../schematype') - , CastError = SchemaType.CastError - , driver = global.MONGOOSE_DRIVER_PATH || './../drivers/node-mongodb-native' - , oid = require('../types/objectid'); - - -/** - * ObjectId SchemaType constructor. - * - * @param {String} key - * @param {Object} options - * @inherits SchemaType - * @api private - */ - -function ObjectId (key, options) { - SchemaType.call(this, key, options, 'ObjectID'); -}; - -/*! - * Inherits from SchemaType. - */ - -ObjectId.prototype.__proto__ = SchemaType.prototype; - -/** - * Check required - * - * @api private - */ - -ObjectId.prototype.checkRequired = function checkRequired (value) { - if (SchemaType._isRef(this, value, true)) { - return null != value; - } else { - return value instanceof oid; - } -}; - -/** - * Casts to ObjectId - * - * @param {Object} value - * @param {Object} scope - * @param {Boolean} init whether this is an initialization cast - * @api private - */ - -ObjectId.prototype.cast = function (value, scope, init) { - if (SchemaType._isRef(this, value, init)) return value; - - if (value === null) return value; - - if (value instanceof oid) - return value; - - if (value._id && value._id instanceof oid) - return value._id; - - if (value.toString) { - try { - return oid.fromString(value.toString()); - } catch (err) { - throw new CastError('ObjectId', value, this.path); - } - } - - throw new CastError('ObjectId', value, this.path); -}; - -/*! - * ignore - */ - -function handleSingle (val) { - return this.cast(val); -} - -function handleArray (val) { - var self = this; - return val.map(function (m) { - return self.cast(m); - }); -} - -ObjectId.prototype.$conditionalHandlers = { - '$ne': handleSingle - , '$in': handleArray - , '$nin': handleArray - , '$gt': handleSingle - , '$lt': handleSingle - , '$gte': handleSingle - , '$lte': handleSingle - , '$all': handleArray -}; - -/** - * Casts contents for queries. - * - * @param {String} $conditional - * @param {any} [val] - * @api private - */ - -ObjectId.prototype.castForQuery = function ($conditional, val) { - var handler; - if (arguments.length === 2) { - handler = this.$conditionalHandlers[$conditional]; - if (!handler) - throw new Error("Can't use " + $conditional + " with ObjectId."); - return handler.call(this, val); - } else { - return this.cast($conditional); - } -}; - -/** - * Adds an auto-generated ObjectId default if turnOn is true. - * @param {Boolean} turnOn auto generated ObjectId defaults - * @api private - */ - -ObjectId.prototype.auto = function (turnOn) { - if (turnOn) { - this.default(defaultId); - this.set(resetId) - } -}; - -/*! - * ignore - */ - -function defaultId () { - return new oid(); -}; - -function resetId (v) { - this.__id = null; - return v; -} - -/*! - * Module exports. - */ - -module.exports = ObjectId; diff --git a/node_modules/mongoose/lib/schema/string.js b/node_modules/mongoose/lib/schema/string.js deleted file mode 100644 index d1bef26..0000000 --- a/node_modules/mongoose/lib/schema/string.js +++ /dev/null @@ -1,255 +0,0 @@ - -/*! - * Module dependencies. - */ - -var SchemaType = require('../schematype') - , CastError = SchemaType.CastError; - -/** - * String SchemaType constructor. - * - * @param {String} key - * @param {Object} options - * @inherits SchemaType - * @api private - */ - -function SchemaString (key, options) { - this.enumValues = []; - this.regExp = null; - SchemaType.call(this, key, options, 'String'); -}; - -/*! - * Inherits from SchemaType. - */ - -SchemaString.prototype.__proto__ = SchemaType.prototype; - -/** - * Adds enumeration values and a coinciding validator. - * - * ####Example: - * - * var states = 'opening open closing closed'.split(' ') - * var s = new Schema({ state: { type: String, enum: states }) - * var M = db.model('M', s) - * var m = new M({ state: 'invalid' }) - * m.save(function (err) { - * console.error(err) // validator error - * m.state = 'open' - * m.save() // success - * }) - * - * @param {String} [args...] enumeration values - * @api public - */ - -SchemaString.prototype.enum = function () { - var len = arguments.length; - if (!len || undefined === arguments[0] || false === arguments[0]) { - if (this.enumValidator){ - this.enumValidator = false; - this.validators = this.validators.filter(function(v){ - return v[1] != 'enum'; - }); - } - return; - } - - for (var i = 0; i < len; i++) { - if (undefined !== arguments[i]) { - this.enumValues.push(this.cast(arguments[i])); - } - } - - if (!this.enumValidator) { - var values = this.enumValues; - this.enumValidator = function(v){ - return undefined === v || ~values.indexOf(v); - }; - this.validators.push([this.enumValidator, 'enum']); - } -}; - -/** - * Adds a lowercase setter. - * - * ####Example: - * - * var s = new Schema({ email: { type: String, lowercase: true }}) - * var M = db.model('M', s); - * var m = new M({ email: 'SomeEmail@example.COM' }); - * console.log(m.email) // someemail@example.com - * - * @api public - */ - -SchemaString.prototype.lowercase = function () { - return this.set(function (v, self) { - if ('string' != typeof v) v = self.cast(v) - if (v) return v.toLowerCase(); - return v; - }); -}; - -/** - * Adds an uppercase setter. - * - * ####Example: - * - * var s = new Schema({ caps: { type: String, uppercase: true }}) - * var M = db.model('M', s); - * var m = new M({ caps: 'an example' }); - * console.log(m.caps) // AN EXAMPLE - * - * @api public - */ - -SchemaString.prototype.uppercase = function () { - return this.set(function (v, self) { - if ('string' != typeof v) v = self.cast(v) - if (v) return v.toUpperCase(); - return v; - }); -}; - -/** - * Adds a trim setter. - * - * The string value will be trimmed when set. - * - * ####Example: - * - * var s = new Schema({ name: { type: String, trim: true }}) - * var M = db.model('M', s) - * var string = ' some name ' - * console.log(string.length) // 11 - * var m = new M({ name: string }) - * console.log(m.name.length) // 9 - * - * @api public - */ - -SchemaString.prototype.trim = function () { - return this.set(function (v, self) { - if ('string' != typeof v) v = self.cast(v) - if (v) return v.trim(); - return v; - }); -}; - -/** - * Sets a regexp validator. - * - * Any value that does not pass `regExp`.test(val) will fail validation. - * - * ####Example: - * - * var s = new Schema({ name: { type: String, match: /^a/ }}) - * var M = db.model('M', s) - * var m = new M({ name: 'invalid' }) - * m.validate(function (err) { - * console.error(err) // validation error - * m.name = 'apples' - * m.validate(function (err) { - * assert.ok(err) // success - * }) - * }) - * - * @param {RegExp} regExp regular expression to test against - * @api public - */ - -SchemaString.prototype.match = function match (regExp) { - this.validators.push([function(v){ - return null != v && '' !== v - ? regExp.test(v) - : true - }, 'regexp']); -}; - -/** - * Check required - * - * @param {String|null|undefined} value - * @api private - */ - -SchemaString.prototype.checkRequired = function checkRequired (value) { - if (SchemaType._isRef(this, value, true)) { - return null != value; - } else { - return (value instanceof String || typeof value == 'string') && value.length; - } -}; - -/** - * Casts to String - * - * @api private - */ - -SchemaString.prototype.cast = function (value, scope, init) { - if (SchemaType._isRef(this, value, init)) return value; - if (value === null) return value; - if ('undefined' !== typeof value && value.toString) return value.toString(); - throw new CastError('string', value, this.path); -}; - -/*! - * ignore - */ - -function handleSingle (val) { - return this.castForQuery(val); -} - -function handleArray (val) { - var self = this; - return val.map(function (m) { - return self.castForQuery(m); - }); -} - -SchemaString.prototype.$conditionalHandlers = { - '$ne' : handleSingle - , '$in' : handleArray - , '$nin': handleArray - , '$gt' : handleSingle - , '$lt' : handleSingle - , '$gte': handleSingle - , '$lte': handleSingle - , '$all': handleArray - , '$regex': handleSingle - , '$options': handleSingle -}; - -/** - * Casts contents for queries. - * - * @param {String} $conditional - * @param {any} [val] - * @api private - */ - -SchemaString.prototype.castForQuery = function ($conditional, val) { - var handler; - if (arguments.length === 2) { - handler = this.$conditionalHandlers[$conditional]; - if (!handler) - throw new Error("Can't use " + $conditional + " with String."); - return handler.call(this, val); - } else { - val = $conditional; - if (val instanceof RegExp) return val; - return this.cast(val); - } -}; - -/*! - * Module exports. - */ - -module.exports = SchemaString; diff --git a/node_modules/mongoose/lib/schemadefault.js b/node_modules/mongoose/lib/schemadefault.js deleted file mode 100644 index aebcff5..0000000 --- a/node_modules/mongoose/lib/schemadefault.js +++ /dev/null @@ -1,34 +0,0 @@ - -/*! - * Module dependencies. - */ - -var Schema = require('./schema') - -/** - * Default model for querying the system.profiles collection. - * - * @property system.profile - * @receiver exports - * @api private - */ - -exports['system.profile'] = new Schema({ - ts: Date - , info: String // deprecated - , millis: Number - , op: String - , ns: String - , query: Schema.Types.Mixed - , updateobj: Schema.Types.Mixed - , ntoreturn: Number - , nreturned: Number - , nscanned: Number - , responseLength: Number - , client: String - , user: String - , idhack: Boolean - , scanAndOrder: Boolean - , keyUpdates: Number - , cursorid: Number -}, { noVirtualId: true, noId: true }); diff --git a/node_modules/mongoose/lib/schematype.js b/node_modules/mongoose/lib/schematype.js deleted file mode 100644 index 9a1edb9..0000000 --- a/node_modules/mongoose/lib/schematype.js +++ /dev/null @@ -1,657 +0,0 @@ -/*! - * Module dependencies. - */ - -var utils = require('./utils'); -var CastError = require('./error').CastError; -var ValidatorError = require('./error').ValidatorError; - -/** - * SchemaType constructor - * - * @param {String} path - * @param {Object} [options] - * @param {String} [instance] - * @api public - */ - -function SchemaType (path, options, instance) { - this.path = path; - this.instance = instance; - this.validators = []; - this.setters = []; - this.getters = []; - this.options = options; - this._index = null; - this.selected; - - for (var i in options) if (this[i] && 'function' == typeof this[i]) { - // { unique: true, index: true } - if ('index' == i && this._index) continue; - - var opts = Array.isArray(options[i]) - ? options[i] - : [options[i]]; - - this[i].apply(this, opts); - } -}; - -/** - * Sets a default value for this SchemaType. - * - * ####Example: - * - * var schema = new Schema({ n: { type: Number, default: 10 }) - * var M = db.model('M', schema) - * var m = new M; - * console.log(m.n) // 10 - * - * Defaults can be either `functions` which return the value to use as the default or the literal value itself. Either way, the value will be cast based on its schema type before being set during document creation. - * - * ####Example: - * - * // values are cast: - * var schema = new Schema({ aNumber: Number, default: "4.815162342" }) - * var M = db.model('M', schema) - * var m = new M; - * console.log(m.aNumber) // 4.815162342 - * - * // default unique objects for Mixed types: - * var schema = new Schema({ mixed: Schema.Types.Mixed }); - * schema.path('mixed').default(function () { - * return {}; - * }); - * - * // if we don't use a function to return object literals for Mixed defaults, - * // each document will receive a reference to the same object literal creating - * // a "shared" object instance: - * var schema = new Schema({ mixed: Schema.Types.Mixed }); - * schema.path('mixed').default({}); - * var M = db.model('M', schema); - * var m1 = new M; - * m1.mixed.added = 1; - * console.log(m1.mixed); // { added: 1 } - * var m2 = new M; - * console.log(m2.mixed); // { added: 1 } - * - * @param {Function|any} val the default value - * @return {defaultValue} - * @api public - */ - -SchemaType.prototype.default = function (val) { - if (1 === arguments.length) { - this.defaultValue = typeof val === 'function' - ? val - : this.cast(val); - return this; - } else if (arguments.length > 1) { - this.defaultValue = utils.args(arguments); - } - return this.defaultValue; -}; - -/** - * Declares the index options for this schematype. - * - * ####Example: - * - * var s = new Schema({ name: { type: String, index: true }) - * var s = new Schema({ date: { type: Date, index: { unique: true, expires: '1d' }}) - * Schema.path('my.path').index(true); - * Schema.path('my.date').index({ expires: 60 }); - * Schema.path('my.path').index({ unique: true, sparse: true }); - * - * ####NOTE: - * - * _Indexes are created in the background by default. Specify `background: false` to override._ - * - * [Direction doesn't matter for single key indexes](http://www.mongodb.org/display/DOCS/Indexes#Indexes-CompoundKeysIndexes) - * - * @param {Object|Boolean} options - * @return {SchemaType} this - * @api public - */ - -SchemaType.prototype.index = function (options) { - this._index = options; - utils.expires(this._index); - return this; -}; - -/** - * Declares an unique index. - * - * ####Example: - * - * var s = new Schema({ name: { type: String, unique: true }) - * Schema.path('name').index({ unique: true }); - * - * _NOTE: violating the constraint returns an `E11000` error from MongoDB when saving, not a Mongoose validation error._ - * - * @param {Boolean} bool - * @return {SchemaType} this - * @api public - */ - -SchemaType.prototype.unique = function (bool) { - if (!this._index || 'Object' !== this._index.constructor.name) { - this._index = {}; - } - - this._index.unique = bool; - return this; -}; - -/** - * Declares a sparse index. - * - * ####Example: - * - * var s = new Schema({ name: { type: String, sparse: true }) - * Schema.path('name').index({ sparse: true }); - * - * @param {Boolean} bool - * @return {SchemaType} this - * @api public - */ - -SchemaType.prototype.sparse = function (bool) { - if (!this._index || 'Object' !== this._index.constructor.name) { - this._index = {}; - } - - this._index.sparse = bool; - return this; -}; - -/** - * Declares a TTL index (rounded to the nearest second) for _Date_ types only. - * - * This sets the `expiresAfterSeconds` index option available in MongoDB >= 2.1.2. - * This index type is only compatible with Date types. - * - * ####Example: - * - * // expire in 24 hours - * new Schema({ createdAt: { type: Date, expires: 60*60*24 }}); - * - * `expires` utilizes the `ms` module from [guille](https://github.com/guille/) allowing us to use a friendlier syntax: - * - * ####Example: - * - * // expire in 24 hours - * new Schema({ createdAt: { type: Date, expires: '24h' }}); - * - * // expire in 1.5 hours - * new Schema({ createdAt: { type: Date, expires: '1.5h' }}); - * - * // expire in 7 days - * var schema = new Schema({ createdAt: Date }); - * schema.path('createdAt').expires('7d'); - * - * @param {Number|String} when - * @added 3.0.0 - * @return {SchemaType} this - * @api public - */ - -SchemaType.prototype.expires = function (when) { - if (!this._index || 'Object' !== this._index.constructor.name) { - this._index = {}; - } - - this._index.expires = when; - utils.expires(this._index); - return this; -}; - -/** - * Adds a setter to this schematype. - * - * ####Example: - * - * function capitalize (val) { - * if ('string' != typeof val) val = ''; - * return val.charAt(0).toUpperCase() + val.substring(1); - * } - * - * // defining within the schema - * var s = new Schema({ name: { type: String, set: capitalize }}) - * - * // or by retreiving its SchemaType - * var s = new Schema({ name: String }) - * s.path('name').set(capitalize) - * - * Setters allow you to transform the data before it gets to the raw mongodb document and is set as a value on an actual key. - * - * Suppose you are implementing user registration for a website. Users provide an email and password, which gets saved to mongodb. The email is a string that you will want to normalize to lower case, in order to avoid one email having more than one account -- e.g., otherwise, avenue@q.com can be registered for 2 accounts via avenue@q.com and AvEnUe@Q.CoM. - * - * You can set up email lower case normalization easily via a Mongoose setter. - * - * function toLower (v) { - * return v.toLowerCase(); - * } - * - * var UserSchema = new Schema({ - * email: { type: String, set: toLower } - * }) - * - * var User = db.model('User', UserSchema) - * - * var user = new User({email: 'AVENUE@Q.COM'}) - * console.log(user.email); // 'avenue@q.com' - * - * // or - * var user = new User - * user.email = 'Avenue@Q.com' - * console.log(user.email) // 'avenue@q.com' - * - * As you can see above, setters allow you to transform the data before it gets to the raw mongodb document and is set as a value on an actual key. - * - * _NOTE: we could have also just used the built-in `lowercase: true` SchemaType option instead of defining our own function._ - * - * new Schema({ email: { type: String, lowercase: true }}) - * - * Setters are also passed a second argument, the schematype on which the setter was defined. This allows for tailored behavior based on options passed in the schema. - * - * function inspector (val, schematype) { - * if (schematype.options.required) { - * return schematype.path + ' is required'; - * } else { - * return val; - * } - * } - * - * var VirusSchema = new Schema({ - * name: { type: String, required: true, set: inspector }, - * taxonomy: { type: String, set: inspector } - * }) - * - * var Virus = db.model('Virus', VirusSchema); - * var v = new Virus({ name: 'Parvoviridae', taxonomy: 'Parvovirinae' }); - * - * console.log(v.name); // name is required - * console.log(v.taxonomy); // Parvovirinae - * - * @param {Function} fn - * @return {SchemaType} this - * @api public - */ - -SchemaType.prototype.set = function (fn) { - if ('function' != typeof fn) - throw new Error('A setter must be a function.'); - this.setters.push(fn); - return this; -}; - -/** - * Adds a getter to this schematype. - * - * ####Example: - * - * function dob (val) { - * if (!val) return val; - * return (val.getMonth() + 1) + "/" + val.getDate() + "/" + val.getFullYear(); - * } - * - * // defining within the schema - * var s = new Schema({ born: { type: Date, get: dob }) - * - * // or by retreiving its SchemaType - * var s = new Schema({ born: Date }) - * s.path('born').get(dob) - * - * Getters allow you to transform the representation of the data as it travels from the raw mongodb document to the value that you see. - * - * Suppose you are storing credit card numbers and you want to hide everything except the last 4 digits to the mongoose user. You can do so by defining a getter in the following way: - * - * function obfuscate (cc) { - * return '****-****-****-' + cc.slice(cc.length-4, cc.length); - * } - * - * var AccountSchema = new Schema({ - * creditCardNumber: { type: String, get: obfuscate } - * }); - * - * var Account = db.model('Account', AccountSchema); - * - * Account.findById(id, function (err, found) { - * console.log(found.creditCardNumber); // '****-****-****-1234' - * }); - * - * Getters are also passed a second argument, the schematype on which the getter was defined. This allows for tailored behavior based on options passed in the schema. - * - * function inspector (val, schematype) { - * if (schematype.options.required) { - * return schematype.path + ' is required'; - * } else { - * return schematype.path + ' is not'; - * } - * } - * - * var VirusSchema = new Schema({ - * name: { type: String, required: true, get: inspector }, - * taxonomy: { type: String, get: inspector } - * }) - * - * var Virus = db.model('Virus', VirusSchema); - * - * Virus.findById(id, function (err, virus) { - * console.log(virus.name); // name is required - * console.log(virus.taxonomy); // taxonomy is not - * }) - * - * @param {Function} fn - * @return {SchemaType} this - * @api public - */ - -SchemaType.prototype.get = function (fn) { - if ('function' != typeof fn) - throw new Error('A getter must be a function.'); - this.getters.push(fn); - return this; -}; - -/** - * Adds validator(s) for this document path. - * - * Validators always receive the value to validate as their first argument and must return `Boolean`. Returning false is interpreted as validation failure. - * - * ####Examples: - * - * function validator (val) { - * return val == 'something'; - * } - * - * new Schema({ name: { type: String, validate: validator }}); - * - * // with a custom error message - * - * var custom = [validator, 'validation failed'] - * new Schema({ name: { type: String, validate: custom }}); - * - * var many = [ - * { validator: validator, msg: 'uh oh' } - * , { validator: fn, msg: 'failed' } - * ] - * new Schema({ name: { type: String, validate: many }}); - * - * // or utilizing SchemaType methods directly: - * - * var schema = new Schema({ name: 'string' }); - * schema.path('name').validate(validator, 'validation failed'); - * - * ####Asynchronous validation: - * - * Passing a validator function that receives two arguments tells mongoose that the validator is an asynchronous validator. The second argument is an callback function that must be passed either `true` or `false` when validation is complete. - * - * schema.path('name').validate(function (value, respond) { - * doStuff(value, function () { - * ... - * respond(false); // validation failed - * }) -* }, 'my error type'); -* - * You might use asynchronous validators to retreive other documents from the database to validate against or to meet other I/O bound validation needs. - * - * Validation occurs `pre('save')` or whenever you manually execute [document#validate](#document_Document-validate). - * - * If validation fails during `pre('save')` and no callback was passed to receive the error, an `error` event will be emitted on your Models associated db [connection](#connection_Connection), passing the validation error object along. - * - * var conn = mongoose.createConnection(..); - * conn.on('error', handleError); - * - * var Product = conn.model('Product', yourSchema); - * var dvd = new Product(..); - * dvd.save(); // emits error on the `conn` above - * - * If you desire handling these errors at the Model level, attach an `error` listener to your Model and the event will instead be emitted there. - * - * // registering an error listener on the Model lets us handle errors more locally - * Product.on('error', handleError); - * - * @param {RegExp|Function|Object} obj validator - * @param {String} [error] optional error message - * @api public - */ - -SchemaType.prototype.validate = function (obj, error) { - if ('function' == typeof obj || obj && 'RegExp' === obj.constructor.name) { - this.validators.push([obj, error]); - return this; - } - - var i = arguments.length - , arg - - while (i--) { - arg = arguments[i]; - if (!(arg && 'Object' == arg.constructor.name)) { - var msg = 'Invalid validator. Received (' + typeof arg + ') ' - + arg - + '. See http://mongoosejs.com/docs/api.html#schematype_SchemaType-validate'; - - throw new Error(msg); - } - this.validate(arg.validator, arg.msg); - } - - return this; -}; - -/** - * Adds a required validator to this schematype. - * - * ####Example: - * - * var s = new Schema({ born: { type: Date, required: true }) - * // or - * Schema.path('name').required(true); - * - * - * @param {Boolean} required enable/disable the validator - * @return {SchemaType} this - * @api public - */ - -SchemaType.prototype.required = function (required) { - var self = this; - - function __checkRequired (v) { - // in here, `this` refers to the validating document. - // no validation when this path wasn't selected in the query. - if ('isSelected' in this && - !this.isSelected(self.path) && - !this.isModified(self.path)) return true; - return self.checkRequired(v); - } - - if (false === required) { - this.isRequired = false; - this.validators = this.validators.filter(function (v) { - return v[0].name !== '__checkRequired'; - }); - } else { - this.isRequired = true; - this.validators.push([__checkRequired, 'required']); - } - - return this; -}; - -/** - * Gets the default value - * - * @param {Object} scope the scope which callback are executed - * @param {Boolean} init - * @api private - */ - -SchemaType.prototype.getDefault = function (scope, init) { - var ret = 'function' === typeof this.defaultValue - ? this.defaultValue.call(scope) - : this.defaultValue; - - if (null !== ret && undefined !== ret) { - return this.cast(ret, scope, init); - } else { - return ret; - } -}; - -/** - * Applies setters - * - * @param {Object} value - * @param {Object} scope - * @param {Boolean} init - * @api private - */ - -SchemaType.prototype.applySetters = function (value, scope, init, priorVal) { - if (SchemaType._isRef(this, value, init)) return value; - - var v = value - , setters = this.setters - , len = setters.length - - if (!len) { - if (null === v || undefined === v) return v; - return init - ? v // if we just initialized we dont recast - : this.cast(v, scope, init, priorVal) - } - - while (len--) { - v = setters[len].call(scope, v, this); - } - - if (null === v || undefined === v) return v; - - // do not cast until all setters are applied #665 - v = this.cast(v, scope, init, priorVal); - - return v; -}; - -/** - * Applies getters to a value - * - * @param {Object} value - * @param {Object} scope - * @api private - */ - -SchemaType.prototype.applyGetters = function (value, scope) { - if (SchemaType._isRef(this, value, true)) return value; - - var v = value - , getters = this.getters - , len = getters.length; - - if (!len) { - return v; - } - - while (len--) { - v = getters[len].call(scope, v, this); - } - - return v; -}; - -/** - * Sets default `select()` behavior for this path. - * - * Set to `true` if this path should always be included in the results, `false` if it should be excluded by default. This setting can be overridden at the query level. - * - * ####Example: - * - * T = db.model('T', new Schema({ x: { type: String, select: true }})); - * T.find(..); // field x will always be selected .. - * // .. unless overridden; - * T.find().select('-x').exec(callback); - * - * @param {Boolean} val - * @api public - */ - -SchemaType.prototype.select = function select (val) { - this.selected = !! val; -} - -/** - * Performs a validation of `value` using the validators declared for this SchemaType. - * - * @param {any} value - * @param {Function} callback - * @param {Object} scope - * @api private - */ - -SchemaType.prototype.doValidate = function (value, fn, scope) { - var err = false - , path = this.path - , count = this.validators.length; - - if (!count) return fn(null); - - function validate (val, msg) { - if (err) return; - if (val === undefined || val) { - --count || fn(null); - } else { - fn(err = new ValidatorError(path, msg)); - } - } - - this.validators.forEach(function (v) { - var validator = v[0] - , message = v[1]; - - if (validator instanceof RegExp) { - validate(validator.test(value), message); - } else if ('function' === typeof validator) { - if (2 === validator.length) { - validator.call(scope, value, function (val) { - validate(val, message); - }); - } else { - validate(validator.call(scope, value), message); - } - } - }); -}; - -/** - * Determines if value is a valid Reference. - * - * @param {SchemaType} self - * @param {Object} value - * @param {Boolean} init - * @return {Boolean} - * @api private - */ - -SchemaType._isRef = function (self, value, init) { - if (init && self.options && self.options.ref) { - if (null == value) return true; - if (value._id && value._id.constructor.name === self.instance) return true; - } - - return false; -} - -/*! - * Module exports. - */ - -module.exports = exports = SchemaType; - -exports.CastError = CastError; - -exports.ValidatorError = ValidatorError; diff --git a/node_modules/mongoose/lib/statemachine.js b/node_modules/mongoose/lib/statemachine.js deleted file mode 100644 index 76005d8..0000000 --- a/node_modules/mongoose/lib/statemachine.js +++ /dev/null @@ -1,179 +0,0 @@ - -/*! - * Module dependencies. - */ - -var utils = require('./utils'); - -/*! - * StateMachine represents a minimal `interface` for the - * constructors it builds via StateMachine.ctor(...). - * - * @api private - */ - -var StateMachine = module.exports = exports = function StateMachine () { - this.paths = {}; - this.states = {}; -} - -/*! - * StateMachine.ctor('state1', 'state2', ...) - * A factory method for subclassing StateMachine. - * The arguments are a list of states. For each state, - * the constructor's prototype gets state transition - * methods named after each state. These transition methods - * place their path argument into the given state. - * - * @param {String} state - * @param {String} [state] - * @return {Function} subclass constructor - * @private - */ - -StateMachine.ctor = function () { - var states = utils.args(arguments); - - var ctor = function () { - StateMachine.apply(this, arguments); - this.stateNames = states; - - var i = states.length - , state; - - while (i--) { - state = states[i]; - this.states[state] = {}; - } - }; - - ctor.prototype.__proto__ = StateMachine.prototype; - - states.forEach(function (state) { - // Changes the `path`'s state to `state`. - ctor.prototype[state] = function (path) { - this._changeState(path, state); - } - }); - - return ctor; -}; - -/*! - * This function is wrapped by the state change functions: - * - * - `require(path)` - * - `modify(path)` - * - `init(path)` - * - * @api private - */ - -StateMachine.prototype._changeState = function _changeState (path, nextState) { - var prevBucket = this.states[this.paths[path]]; - if (prevBucket) delete prevBucket[path]; - - this.paths[path] = nextState; - this.states[nextState][path] = true; -} - -/*! - * ignore - */ - -StateMachine.prototype.clear = function clear (state) { - var keys = Object.keys(this.states[state]) - , i = keys.length - , path - - while (i--) { - path = keys[i]; - delete this.states[state][path]; - delete this.paths[path]; - } -} - -/*! - * Checks to see if at least one path is in the states passed in via `arguments` - * e.g., this.some('required', 'inited') - * - * @param {String} state that we want to check for. - * @private - */ - -StateMachine.prototype.some = function some () { - var self = this; - var what = arguments.length ? arguments : this.stateNames; - return Array.prototype.some.call(what, function (state) { - return Object.keys(self.states[state]).length; - }); -} - -/*! - * This function builds the functions that get assigned to `forEach` and `map`, - * since both of those methods share a lot of the same logic. - * - * @param {String} iterMethod is either 'forEach' or 'map' - * @return {Function} - * @api private - */ - -StateMachine.prototype._iter = function _iter (iterMethod) { - return function () { - var numArgs = arguments.length - , states = utils.args(arguments, 0, numArgs-1) - , callback = arguments[numArgs-1]; - - if (!states.length) states = this.stateNames; - - var self = this; - - var paths = states.reduce(function (paths, state) { - return paths.concat(Object.keys(self.states[state])); - }, []); - - return paths[iterMethod](function (path, i, paths) { - return callback(path, i, paths); - }); - }; -} - -/*! - * Iterates over the paths that belong to one of the parameter states. - * - * The function profile can look like: - * this.forEach(state1, fn); // iterates over all paths in state1 - * this.forEach(state1, state2, fn); // iterates over all paths in state1 or state2 - * this.forEach(fn); // iterates over all paths in all states - * - * @param {String} [state] - * @param {String} [state] - * @param {Function} callback - * @private - */ - -StateMachine.prototype.forEach = function forEach () { - this.forEach = this._iter('forEach'); - return this.forEach.apply(this, arguments); -} - -/*! - * Maps over the paths that belong to one of the parameter states. - * - * The function profile can look like: - * this.forEach(state1, fn); // iterates over all paths in state1 - * this.forEach(state1, state2, fn); // iterates over all paths in state1 or state2 - * this.forEach(fn); // iterates over all paths in all states - * - * @param {String} [state] - * @param {String} [state] - * @param {Function} callback - * @return {Array} - * @private - */ - -StateMachine.prototype.map = function map () { - this.map = this._iter('map'); - return this.map.apply(this, arguments); -} - diff --git a/node_modules/mongoose/lib/types/array.js b/node_modules/mongoose/lib/types/array.js deleted file mode 100644 index 294c989..0000000 --- a/node_modules/mongoose/lib/types/array.js +++ /dev/null @@ -1,598 +0,0 @@ - -/*! - * Module dependencies. - */ - -var EmbeddedDocument = require('./embedded'); -var Document = require('../document'); -var ObjectId = require('./objectid'); - -/** - * Mongoose Array constructor. - * - * ####NOTE: - * - * _Values always have to be passed to the constructor to initialize, otherwise `MongooseArray#push` will mark the array as modified._ - * - * @param {Array} values - * @param {String} path - * @param {Document} doc parent document - * @api private - * @inherits Array - * @see http://bit.ly/f6CnZU - */ - -function MongooseArray (values, path, doc) { - var arr = []; - arr.push.apply(arr, values); - arr.__proto__ = MongooseArray.prototype; - - arr._atomics = {}; - arr.validators = []; - arr._path = path; - - if (doc) { - arr._parent = doc; - arr._schema = doc.schema.path(path); - } - - return arr; -}; - -/*! - * Inherit from Array - */ - -MongooseArray.prototype = new Array; - -/** - * Stores a queue of atomic operations to perform - * - * @property _atomics - * @api private - */ - -MongooseArray.prototype._atomics; - -/** - * Parent owner document - * - * @property _parent - * @api private - */ - -MongooseArray.prototype._parent; - -/** - * Casts a member based on this arrays schema. - * - * @param {any} value - * @return value the casted value - * @api private - */ - -MongooseArray.prototype._cast = function (value) { - var cast = this._schema.caster.cast - , doc = this._parent; - - return cast.call(null, value, doc); -}; - -/** - * Marks this array as modified. - * - * If it bubbles up from an embedded document change, then it takes the following arguments (otherwise, takes 0 arguments) - * - * @param {EmbeddedDocument} embeddedDoc the embedded doc that invoked this method on the Array - * @param {String} embeddedPath the path which changed in the embeddedDoc - * @api private - */ - -MongooseArray.prototype._markModified = function (elem, embeddedPath) { - var parent = this._parent - , dirtyPath; - - if (parent) { - dirtyPath = this._path; - - if (arguments.length) { - if (null != embeddedPath) { - // an embedded doc bubbled up the change - dirtyPath = dirtyPath + '.' + this.indexOf(elem) + '.' + embeddedPath; - } else { - // directly set an index - dirtyPath = dirtyPath + '.' + elem; - } - - } - parent.markModified(dirtyPath); - } - - return this; -}; - -/** - * Register an atomic operation with the parent. - * - * @param {Array} op operation - * @param {any} val - * @api private - */ - -MongooseArray.prototype._registerAtomic = function (op, val) { - if ('$set' == op) { - // $set takes precedence over all other ops. - // mark entire array modified. - this._atomics = { $set: val }; - return this; - } - - var atomics = this._atomics; - - // reset pop/shift after save - if ('$pop' == op && !('$pop' in atomics)) { - var self = this; - this._parent.once('save', function () { - self._popped = self._shifted = null; - }); - } - - // check for impossible $atomic combos (Mongo denies more than one - // $atomic op on a single path - if (this._atomics.$set || - Object.keys(atomics).length && !(op in atomics)) { - // a different op was previously registered. - // save the entire thing. - this._atomics = { $set: this }; - return this; - } - - if (op === '$pullAll' || op === '$pushAll' || op === '$addToSet') { - atomics[op] || (atomics[op] = []); - atomics[op] = atomics[op].concat(val); - } else if (op === '$pullDocs') { - var pullOp = atomics['$pull'] || (atomics['$pull'] = {}) - , selector = pullOp['_id'] || (pullOp['_id'] = {'$in' : [] }); - selector['$in'] = selector['$in'].concat(val); - } else { - atomics[op] = val; - } - - return this; -}; - -/** - * Returns the number of pending atomic operations to send to the db for this array. - * - * @api private - * @return {Number} - */ - -MongooseArray.prototype.hasAtomics = function hasAtomics () { - if (!(this._atomics && 'Object' === this._atomics.constructor.name)) { - return 0; - } - - return Object.keys(this._atomics).length; -} - -/** - * Wraps [`Array#push`](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/push) with proper change tracking. - * - * @param {Object} [args...] - * @api public - */ - -MongooseArray.prototype.push = function () { - var values = [].map.call(arguments, this._cast, this) - , ret = [].push.apply(this, values); - - // $pushAll might be fibbed (could be $push). But it makes it easier to - // handle what could have been $push, $pushAll combos - this._registerAtomic('$pushAll', values); - this._markModified(); - return ret; -}; - -/** - * Pushes items to the array non-atomically. - * - * ####NOTE: - * - * _marks the entire array as modified, which if saved, will store it as a `$set` operation, potentially overwritting any changes that happen between when you retrieved the object and when you save it._ - * - * @param {any} [args...] - * @api public - */ - -MongooseArray.prototype.nonAtomicPush = function () { - var values = [].map.call(arguments, this._cast, this) - , ret = [].push.apply(this, values); - this._registerAtomic('$set', this); - this._markModified(); - return ret; -}; - -/** - * Pops the array atomically at most one time per document `save()`. - * - * #### NOTE: - * - * _Calling this mulitple times on an array before saving sends the same command as calling it once._ - * _This update is implemented using the MongoDB [$pop](http://www.mongodb.org/display/DOCS/Updating/#Updating-%24pop) method which enforces this restriction._ - * - * doc.array = [1,2,3]; - * - * var popped = doc.array.$pop(); - * console.log(popped); // 3 - * console.log(doc.array); // [1,2] - * - * // no affect - * popped = doc.array.$pop(); - * console.log(doc.array); // [1,2] - * - * doc.save(function (err) { - * if (err) return handleError(err); - * - * // we saved, now $pop works again - * popped = doc.array.$pop(); - * console.log(popped); // 2 - * console.log(doc.array); // [1] - * }) - * - * @api public - * @method $pop - * @memberOf MongooseArray - * @see mongodb http://www.mongodb.org/display/DOCS/Updating/#Updating-%24pop - */ - -MongooseArray.prototype.$pop = function () { - this._registerAtomic('$pop', 1); - this._markModified(); - - // only allow popping once - if (this._popped) return; - this._popped = true; - - return [].pop.call(this); -}; - -/** - * Wraps [`Array#pop`](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/pop) with proper change tracking. - * - * ####Note: - * - * _marks the entire array as modified which will pass the entire thing to $set potentially overwritting any changes that happen between when you retrieved the object and when you save it._ - * - * @see MongooseArray#$pop #types_array_MongooseArray-%24pop - * @api public - */ - -MongooseArray.prototype.pop = function () { - var ret = [].pop.call(this); - this._registerAtomic('$set', this); - this._markModified(); - return ret; -}; - -/** - * Atomically shifts the array at most one time per document `save()`. - * - * ####NOTE: - * - * _Calling this mulitple times on an array before saving sends the same command as calling it once._ - * _This update is implemented using the MongoDB [$pop](http://www.mongodb.org/display/DOCS/Updating/#Updating-%24pop) method which enforces this restriction._ - * - * doc.array = [1,2,3]; - * - * var shifted = doc.array.$shift(); - * console.log(shifted); // 1 - * console.log(doc.array); // [2,3] - * - * // no affect - * shifted = doc.array.$shift(); - * console.log(doc.array); // [2,3] - * - * doc.save(function (err) { - * if (err) return handleError(err); - * - * // we saved, now $shift works again - * shifted = doc.array.$shift(); - * console.log(shifted ); // 2 - * console.log(doc.array); // [3] - * }) - * - * @api public - * @memberOf MongooseArray - * @method $shift - * @see mongodb http://www.mongodb.org/display/DOCS/Updating/#Updating-%24pop - */ - -MongooseArray.prototype.$shift = function $shift () { - this._registerAtomic('$pop', -1); - this._markModified(); - - // only allow shifting once - if (this._shifted) return; - this._shifted = true; - - return [].shift.call(this); -}; - -/** - * Wraps [`Array#shift`](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/unshift) with proper change tracking. - * - * ####Example: - * - * doc.array = [2,3]; - * var res = doc.array.shift(); - * console.log(res) // 2 - * console.log(doc.array) // [3] - * - * ####Note: - * - * _marks the entire array as modified, which if saved, will store it as a `$set` operation, potentially overwritting any changes that happen between when you retrieved the object and when you save it._ - * - * @api public - */ - -MongooseArray.prototype.shift = function () { - var ret = [].shift.call(this); - this._registerAtomic('$set', this); - this._markModified(); - return ret; -}; - -/** - * Removes items from an array atomically - * - * ####Examples: - * - * doc.array.remove(ObjectId) - * doc.array.remove('tag 1', 'tag 2') - * - * @param {Object} [args...] values to remove - * @see mongodb http://www.mongodb.org/display/DOCS/Updating/#Updating-%24pull - * @api public - */ - -MongooseArray.prototype.remove = function () { - var args = [].map.call(arguments, this._cast, this); - if (args.length == 1) - this.pull(args[0]); - else - this.pull.apply(this, args); - return args; -}; - -/** - * Pulls items from the array atomically. - * - * @param {any} [args...] - * @see mongodb http://www.mongodb.org/display/DOCS/Updating/#Updating-%24pull - * @api public - */ - -MongooseArray.prototype.pull = function () { - var values = [].map.call(arguments, this._cast, this) - , cur = this._parent.get(this._path) - , i = cur.length - , mem; - - while (i--) { - mem = cur[i]; - if (mem instanceof EmbeddedDocument) { - if (values.some(function (v) { return v.equals(mem); } )) { - [].splice.call(cur, i, 1); - } - } else if (~cur.indexOf.call(values, mem)) { - [].splice.call(cur, i, 1); - } - } - - if (values[0] instanceof EmbeddedDocument) { - this._registerAtomic('$pullDocs', values.map( function (v) { return v._id; } )); - } else { - this._registerAtomic('$pullAll', values); - } - - this._markModified(); - return this; -}; - -/** - * Wraps [`Array#splice`](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/splice) with proper change tracking and casting. - * - * ####Note: - * - * _marks the entire array as modified, which if saved, will store it as a `$set` operation, potentially overwritting any changes that happen between when you retrieved the object and when you save it._ - * - * @api public - */ - -MongooseArray.prototype.splice = function splice () { - var ret, vals, i; - - if (arguments.length) { - vals = []; - for (i = 0; i < arguments.length; ++i) { - vals[i] = i < 2 - ? arguments[i] - : this._cast(arguments[i]); - } - ret = [].splice.apply(this, vals); - this._registerAtomic('$set', this); - this._markModified(); - } - - return ret; -} - -/** - * Wraps [`Array#unshift`](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/unshift) with proper change tracking. - * - * ####Note: - * - * _marks the entire array as modified, which if saved, will store it as a `$set` operation, potentially overwritting any changes that happen between when you retrieved the object and when you save it._ - * - * @api public - */ - -MongooseArray.prototype.unshift = function () { - var values = [].map.call(arguments, this._cast, this); - [].unshift.apply(this, values); - this._registerAtomic('$set', this); - this._markModified(); - return this.length; -}; - -/** - * Wraps [`Array#sort`](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort) with proper change tracking. - * - * ####NOTE: - * - * _marks the entire array as modified, which if saved, will store it as a `$set` operation, potentially overwritting any changes that happen between when you retrieved the object and when you save it._ - * - * @api public - */ - -MongooseArray.prototype.sort = function () { - var ret = [].sort.apply(this, arguments); - this._registerAtomic('$set', this); - this._markModified(); - return ret; -} - -/** - * Adds values to the array if not already present. - * - * ####Example: - * - * console.log(doc.array) // [2,3,4] - * var added = doc.array.addToSet(4,5); - * console.log(doc.array) // [2,3,4,5] - * console.log(added) // [5] - * - * @param {any} [args...] - * @return {Array} the values that were added - * @api public - */ - -MongooseArray.prototype.addToSet = function addToSet () { - var values = [].map.call(arguments, this._cast, this) - , added = [] - , type = values[0] instanceof EmbeddedDocument ? 'doc' : - values[0] instanceof Date ? 'date' : - ''; - - values.forEach(function (v) { - var found; - switch (type) { - case 'doc': - found = this.some(function(doc){ return doc.equals(v) }); - break; - case 'date': - var val = +v; - found = this.some(function(d){ return +d === val }); - break; - default: - found = ~this.indexOf(v); - } - - if (!found) { - [].push.call(this, v); - this._registerAtomic('$addToSet', v); - this._markModified(); - [].push.call(added, v); - } - }, this); - - return added; -}; - -/** - * Sets the casted `val` at index `i` and marks the array modified. - * - * ####Example: - * - * // given documents based on the following - * var Doc = mongoose.model('Doc', new Schema({ array: [Number] })); - * - * var doc = new Doc({ array: [2,3,4] }) - * - * console.log(doc.array) // [2,3,4] - * - * doc.array.set(1,"5"); - * console.log(doc.array); // [2,5,4] // properly cast to number - * doc.save() // the change is saved - * - * // VS not using array#set - * doc.array[1] = "5"; - * console.log(doc.array); // [2,"5",4] // no casting - * doc.save() // change is not saved - * - * @return {Array} this - * @api public - */ - -MongooseArray.prototype.set = function set (i, val) { - this[i] = this._cast(val); - this._markModified(i); - return this; -} - -/** - * Returns a native js Array. - * - * @param {Object} options - * @return {Array} - * @api public - */ - -MongooseArray.prototype.toObject = function (options) { - if (options && options.depopulate && this[0] instanceof Document) { - return this.map(function (doc) { - return doc._id; - }); - } - - // return this.slice()? - return this.map(function (doc) { - return doc; - }); -}; - -/** - * Helper for console.log - * - * @api public - */ - -MongooseArray.prototype.inspect = function () { - return '[' + this.map(function (doc) { - return ' ' + doc; - }) + ' ]'; -}; - -/** - * Return the index of `obj` or `-1` if not found. - * - * @param {Object} obj the item to look for - * @return {Number} - * @api public - */ - -MongooseArray.prototype.indexOf = function indexOf (obj) { - if (obj instanceof ObjectId) obj = obj.toString(); - for (var i = 0, len = this.length; i < len; ++i) { - if (obj == this[i]) - return i; - } - return -1; -}; - -/*! - * Module exports. - */ - -module.exports = exports = MongooseArray; diff --git a/node_modules/mongoose/lib/types/buffer.js b/node_modules/mongoose/lib/types/buffer.js deleted file mode 100644 index d84370b..0000000 --- a/node_modules/mongoose/lib/types/buffer.js +++ /dev/null @@ -1,210 +0,0 @@ - -/*! - * Access driver. - */ - -var driver = global.MONGOOSE_DRIVER_PATH || '../drivers/node-mongodb-native'; - -/*! - * Module dependencies. - */ - -var Binary = require(driver + '/binary'); - -/** - * Mongoose Buffer constructor. - * - * Values always have to be passed to the constructor to initialize. - * - * @param {Buffer} value - * @param {String} encode - * @param {Number} offset - * @api private - * @inherits Buffer - * @see http://bit.ly/f6CnZU - */ - -function MongooseBuffer (value, encode, offset) { - var length = arguments.length; - var val; - - if (0 === length || null === arguments[0] || undefined === arguments[0]) { - val = 0; - } else { - val = value; - } - - var encoding; - var path; - var doc; - - if (Array.isArray(encode)) { - // internal casting - path = encode[0]; - doc = encode[1]; - } else { - encoding = encode; - } - - var buf = new Buffer(val, encoding, offset); - buf.__proto__ = MongooseBuffer.prototype; - - // make sure these internal props don't show up in Object.keys() - Object.defineProperties(buf, { - validators: { value: [] } - , _path: { value: path } - , _parent: { value: doc } - }); - - if (doc && "string" === typeof path) { - Object.defineProperty(buf, '_schema', { - value: doc.schema.path(path) - }); - } - - return buf; -}; - -/*! - * Inherit from Buffer. - */ - -MongooseBuffer.prototype = new Buffer(0); - -/** - * Parent owner document - * - * @api private - * @property _parent - */ - -MongooseBuffer.prototype._parent; - -/** - * Marks this buffer as modified. - * - * @api private - */ - -MongooseBuffer.prototype._markModified = function () { - var parent = this._parent; - - if (parent) { - parent.markModified(this._path); - } - return this; -}; - -/** -* Writes the buffer. -*/ - -MongooseBuffer.prototype.write = function () { - var written = Buffer.prototype.write.apply(this, arguments); - - if (written > 0) { - this._markModified(); - } - - return written; -}; - -/** - * Copies the buffer. - * - * ####Note: - * - * `Buffer#copy` does not mark `target` as modified so you must copy from a `MongooseBuffer` for it to work as expected. This is a work around since `copy` modifies the target, not this. - * - * @return {MongooseBuffer} - * @param {Buffer} target - */ - -MongooseBuffer.prototype.copy = function (target) { - var ret = Buffer.prototype.copy.apply(this, arguments); - - if (target instanceof MongooseBuffer) { - target._markModified(); - } - - return ret; -}; - -/*! - * Compile other Buffer methods marking this buffer as modified. - */ - -;( -// node < 0.5 -'writeUInt8 writeUInt16 writeUInt32 writeInt8 writeInt16 writeInt32 ' + -'writeFloat writeDouble fill ' + -'utf8Write binaryWrite asciiWrite set ' + - -// node >= 0.5 -'writeUInt16LE writeUInt16BE writeUInt32LE writeUInt32BE ' + -'writeInt16LE writeInt16BE writeInt32LE writeInt32BE ' + -'writeFloatLE writeFloatBE writeDoubleLE writeDoubleBE' -).split(' ').forEach(function (method) { - if (!Buffer.prototype[method]) return; - MongooseBuffer.prototype[method] = new Function( - 'var ret = Buffer.prototype.'+method+'.apply(this, arguments);' + - 'this._markModified();' + - 'return ret;' - ) -}); - -/** - * Converts this buffer to its Binary type representation. - * - * ####SubTypes: - * - * - 0x00: Binary/Generic - * - 0x01: Function - * - 0x02: Binary (Deprecated, 0x00 is new default) - * - 0x03: UUID - * - 0x04: MD5 - * - 0x80: User Defined - * - * @see http://bsonspec.org/#/specification - * @param {Hex} [subtype] - * @return {Binary} - * @api public - */ - -MongooseBuffer.prototype.toObject = function (options) { - var subtype = 'number' == typeof options - ? options - : 0x00; - return new Binary(this, subtype); -}; - -/** - * Determines if this buffer is equals to `other` buffer - * - * @param {Buffer} other - * @return {Boolean} - */ - -MongooseBuffer.prototype.equals = function (other) { - if (!Buffer.isBuffer(other)) { - return false; - } - - if (this.length !== other.length) { - return false; - } - - for (var i = 0; i < this.length; ++i) { - if (this[i] !== other[i]) return false; - } - - return true; -} - -/*! - * Module exports. - */ - -MongooseBuffer.Binary = Binary; - -module.exports = MongooseBuffer; diff --git a/node_modules/mongoose/lib/types/documentarray.js b/node_modules/mongoose/lib/types/documentarray.js deleted file mode 100644 index b888965..0000000 --- a/node_modules/mongoose/lib/types/documentarray.js +++ /dev/null @@ -1,171 +0,0 @@ - -/*! - * Module dependencies. - */ - -var MongooseArray = require('./array') - , driver = global.MONGOOSE_DRIVER_PATH || '../drivers/node-mongodb-native' - , ObjectId = require(driver + '/objectid') - , ObjectIdSchema = require('../schema/objectid') - , util = require('util') - -/** - * DocumentArray constructor - * - * @param {Array} values - * @param {String} path the path to this array - * @param {Document} doc parent document - * @api private - * @return {MongooseDocumentArray} - * @inherits MongooseArray - * @see http://bit.ly/f6CnZU - */ - -function MongooseDocumentArray (values, path, doc) { - var arr = []; - - // Values always have to be passed to the constructor to initialize, since - // otherwise MongooseArray#push will mark the array as modified to the parent. - arr.push.apply(arr, values); - arr.__proto__ = MongooseDocumentArray.prototype; - - arr._atomics = {}; - arr.validators = []; - arr._path = path; - - if (doc) { - arr._parent = doc; - arr._schema = doc.schema.path(path); - doc.on('save', arr.notify('save')); - doc.on('isNew', arr.notify('isNew')); - } - - return arr; -}; - -/*! - * Inherits from MongooseArray - */ - -MongooseDocumentArray.prototype.__proto__ = MongooseArray.prototype; - -/** - * Overrides MongooseArray#cast - * - * @api private - */ - -MongooseDocumentArray.prototype._cast = function (value) { - if (value instanceof this._schema.casterConstructor) - return value; - - return new this._schema.casterConstructor(value, this); -}; - -/** - * Searches array items for the first document with a matching _id. - * - * ####Example: - * - * var embeddedDoc = m.array.id(some_id); - * - * @return {EmbeddedDocument|null} the subdocuent or null if not found. - * @param {ObjectId|String|Number|Buffer} id - * @api public - */ - -MongooseDocumentArray.prototype.id = function (id) { - var casted - , _id; - - try { - casted = ObjectId.toString(ObjectIdSchema.prototype.cast.call({}, id)); - } catch (e) { - casted = null; - } - - for (var i = 0, l = this.length; i < l; i++) { - _id = this[i].get('_id'); - if (!(_id instanceof ObjectId)) { - if (String(id) == _id) - return this[i]; - } else { - if (casted == _id) - return this[i]; - } - } - - return null; -}; - -/** - * Returns a native js Array of plain js objects - * - * ####NOTE: - * - * _Each sub-document is converted to a plain object by calling its `#toObject` method._ - * - * @return {Array} - * @api public - */ - -MongooseDocumentArray.prototype.toObject = function () { - return this.map(function (doc) { - return doc && doc.toObject() || null; - }); -}; - -/** - * Helper for console.log - * - * @api public - */ - -MongooseDocumentArray.prototype.inspect = function () { - return '[' + this.map(function (doc) { - if (doc) { - return doc.inspect - ? doc.inspect() - : util.inspect(doc) - } - return 'null' - }).join('\n') + ']'; -}; - -/** - * Creates a subdocument casted to this schema. - * - * This is the same subdocument constructor used for casting. - * - * @param {Object} obj the value to cast to this arrays SubDocument schema - * @api public - */ - -MongooseDocumentArray.prototype.create = function (obj) { - return new this._schema.casterConstructor(obj); -} - -/** - * Creates a fn that notifies all child docs of `event`. - * - * @param {String} event - * @return {Function} - * @api private - */ - -MongooseDocumentArray.prototype.notify = function notify (event) { - var self = this; - return function notify (val) { - var i = self.length; - while (i--) { - if (!self[i]) continue; - self[i].emit(event, val); - } - } -} - -/*! - * Module exports. - */ - -module.exports = MongooseDocumentArray; diff --git a/node_modules/mongoose/lib/types/embedded.js b/node_modules/mongoose/lib/types/embedded.js deleted file mode 100644 index 3ebc842..0000000 --- a/node_modules/mongoose/lib/types/embedded.js +++ /dev/null @@ -1,199 +0,0 @@ -/*! - * Module dependencies. - */ - -var Document = require('../document') - , inspect = require('util').inspect; - -/** - * EmbeddedDocument constructor. - * - * @param {Object} obj js object returned from the db - * @param {MongooseDocumentArray} parentArr the parent array of this document - * @param {Boolean} skipId - * @inherits Document - * @api private - */ - -function EmbeddedDocument (obj, parentArr, skipId, fields) { - if (parentArr) { - this.__parentArray = parentArr; - this.__parent = parentArr._parent; - } else { - this.__parentArray = undefined; - this.__parent = undefined; - } - - Document.call(this, obj, fields, skipId); - - var self = this; - this.on('isNew', function (val) { - self.isNew = val; - }); -}; - -/*! - * Inherit from Document - */ - -EmbeddedDocument.prototype.__proto__ = Document.prototype; - -/** - * Marks the embedded doc modified. - * - * ####Example: - * - * var doc = blogpost.comments.id(hexstring); - * doc.mixed.type = 'changed'; - * doc.markModified('mixed.type'); - * - * @param {String} path the path which changed - * @api public - */ - -EmbeddedDocument.prototype.markModified = function (path) { - if (!this.__parentArray) return; - - this._activePaths.modify(path); - - if (this.isNew) { - // Mark the WHOLE parent array as modified - // if this is a new document (i.e., we are initializing - // a document), - this.__parentArray._markModified(); - } else - this.__parentArray._markModified(this, path); -}; - -/** - * Used as a stub for [hooks.js](https://github.com/bnoguchi/hooks-js/tree/31ec571cef0332e21121ee7157e0cf9728572cc3) - * - * ####NOTE: - * - * _This is a no-op. Does not actually save the doc to the db._ - * - * @param {Function} [fn] - * @return {EmbeddedDocument} this - * @api private - */ - -EmbeddedDocument.prototype.save = function(fn) { - if (fn) - fn(null); - return this; -}; - -/** - * Removes the subdocument from its parent array. - * - * @param {Function} [fn] - * @api public - */ - -EmbeddedDocument.prototype.remove = function (fn) { - if (!this.__parentArray) return this; - - var _id; - if (!this.willRemove) { - _id = this._doc._id; - if (!_id) { - throw new Error('For your own good, Mongoose does not know ' + - 'how to remove an EmbeddedDocument that has no _id'); - } - this.__parentArray.pull({ _id: _id }); - this.willRemove = true; - } - - if (fn) - fn(null); - - return this; -}; - -/** - * Override #update method of parent documents. - * @api private - */ - -EmbeddedDocument.prototype.update = function () { - throw new Error('The #update method is not available on EmbeddedDocuments'); -} - -/** - * Helper for console.log - * - * @api public - */ - -EmbeddedDocument.prototype.inspect = function () { - return inspect(this.toObject()); -}; - -/** - * Marks a path as invalid, causing validation to fail. - * - * @param {String} path the field to invalidate - * @param {String|Error} err error which states the reason `path` was invalid - * @return {Boolean} - * @api public - */ - -EmbeddedDocument.prototype.invalidate = function (path, err, first) { - if (!this.__parent) return false; - var index = this.__parentArray.indexOf(this); - var parentPath = this.__parentArray._path; - var fullPath = [parentPath, index, path].join('.'); - this.__parent.invalidate(fullPath, err); - if (first) - this._validationError = ownerDocument(this)._validationError; - return true; -} - -/** - * Returns the top level document of this sub-document. - * - * @return {Document} - */ - -EmbeddedDocument.prototype.ownerDocument = function () { - return ownerDocument(this); -} - -/*! - * Returns the top level document of this sub-document. - * - * @return {Document} - */ - -function ownerDocument (self) { - var parent = self.__parent; - while (parent.__parent) - parent = parent.__parent; - return parent; -} - -/** - * Returns this sub-documents parent document. - * - * @api public - */ - -EmbeddedDocument.prototype.parent = function () { - return this.__parent; -} - -/** - * Returns this sub-documents parent array. - * - * @api public - */ - -EmbeddedDocument.prototype.parentArray = function () { - return this.__parentArray; -} - -/*! - * Module exports. - */ - -module.exports = EmbeddedDocument; diff --git a/node_modules/mongoose/lib/types/index.js b/node_modules/mongoose/lib/types/index.js deleted file mode 100644 index e6a9901..0000000 --- a/node_modules/mongoose/lib/types/index.js +++ /dev/null @@ -1,13 +0,0 @@ - -/*! - * Module exports. - */ - -exports.Array = require('./array'); -exports.Buffer = require('./buffer'); - -exports.Document = // @deprecate -exports.Embedded = require('./embedded'); - -exports.DocumentArray = require('./documentarray'); -exports.ObjectId = require('./objectid'); diff --git a/node_modules/mongoose/lib/types/objectid.js b/node_modules/mongoose/lib/types/objectid.js deleted file mode 100644 index 44ad43f..0000000 --- a/node_modules/mongoose/lib/types/objectid.js +++ /dev/null @@ -1,43 +0,0 @@ - -/*! - * Access driver. - */ - -var driver = global.MONGOOSE_DRIVER_PATH || '../drivers/node-mongodb-native'; - -/** - * ObjectId type constructor - * - * ####Example - * - * var id = new mongoose.Types.ObjectId; - * - * @constructor ObjectId - */ - -var ObjectId = require(driver + '/objectid'); -module.exports = ObjectId; - -/** - * Creates an ObjectId from `str` - * - * @param {ObjectId|HexString} str - * @static fromString - * @receiver ObjectId - * @return {ObjectId} - * @api private - */ - -ObjectId.fromString; - -/** - * Converts `oid` to a string. - * - * @param {ObjectId} oid ObjectId instance - * @static toString - * @receiver ObjectId - * @return {String} - * @api private - */ - -ObjectId.toString; diff --git a/node_modules/mongoose/lib/utils.js b/node_modules/mongoose/lib/utils.js deleted file mode 100644 index 1f9b14a..0000000 --- a/node_modules/mongoose/lib/utils.js +++ /dev/null @@ -1,481 +0,0 @@ -/*! - * Module dependencies. - */ - -var ReadPref = require('mongodb').ReadPreference - , ObjectId = require('./types/objectid') - , ms = require('ms') - , sliced = require('sliced') - , MongooseBuffer - , MongooseArray - , Document - -/** - * Produces a collection name from model `name`. - * - * @param {String} name a model name - * @return {String} a collection name - * @api private - */ - -exports.toCollectionName = function (name) { - if ('system.profile' === name) return name; - if ('system.indexes' === name) return name; - return pluralize(name.toLowerCase()); -}; - -/** - * Pluralization rules. - * - * These rules are applied while processing the argument to `toCollectionName`. - */ - -exports.pluralization = [ - [/(m)an$/gi, '$1en'], - [/(pe)rson$/gi, '$1ople'], - [/(child)$/gi, '$1ren'], - [/^(ox)$/gi, '$1en'], - [/(ax|test)is$/gi, '$1es'], - [/(octop|vir)us$/gi, '$1i'], - [/(alias|status)$/gi, '$1es'], - [/(bu)s$/gi, '$1ses'], - [/(buffal|tomat|potat)o$/gi, '$1oes'], - [/([ti])um$/gi, '$1a'], - [/sis$/gi, 'ses'], - [/(?:([^f])fe|([lr])f)$/gi, '$1$2ves'], - [/(hive)$/gi, '$1s'], - [/([^aeiouy]|qu)y$/gi, '$1ies'], - [/(x|ch|ss|sh)$/gi, '$1es'], - [/(matr|vert|ind)ix|ex$/gi, '$1ices'], - [/([m|l])ouse$/gi, '$1ice'], - [/(quiz)$/gi, '$1zes'], - [/s$/gi, 's'], - [/$/gi, 's'] -]; -var rules = exports.pluralization; - -/** - * Uncountable words. - * - * These words are applied while processing the argument to `toCollectionName`. - */ - -exports.uncountables = [ - 'advice', - 'energy', - 'excretion', - 'digestion', - 'cooperation', - 'health', - 'justice', - 'labour', - 'machinery', - 'equipment', - 'information', - 'pollution', - 'sewage', - 'paper', - 'money', - 'species', - 'series', - 'rain', - 'rice', - 'fish', - 'sheep', - 'moose', - 'deer', - 'news', - 'expertise', - 'status', - 'media' -]; -var uncountables = exports.uncountables; - -/*! - * Pluralize function. - * - * @author TJ Holowaychuk (extracted from _ext.js_) - * @param {String} string to pluralize - * @api private - */ - -function pluralize (str) { - var rule, found; - if (!~uncountables.indexOf(str.toLowerCase())){ - found = rules.filter(function(rule){ - return str.match(rule[0]); - }); - if (found[0]) return str.replace(found[0][0], found[0][1]); - } - return str; -}; - -/** - * Determines if `a` and `b` are deep equal. - * - * Modified from node/lib/assert.js - * - * @param {any} a a value to compare to `b` - * @param {any} b a value to compare to `a` - * @return {Boolean} - * @api private - */ - -exports.deepEqual = function deepEqual (a, b) { - if (a === b) return true; - - if (a instanceof Date && b instanceof Date) - return a.getTime() === b.getTime(); - - if (a instanceof ObjectId && b instanceof ObjectId) { - return a.toString() === b.toString(); - } - - if (a instanceof RegExp && b instanceof RegExp) { - return a.source == b.source && - a.ignoreCase == b.ignoreCase && - a.multiline == b.multiline && - a.global == b.global; - } - - if (typeof a !== 'object' && typeof b !== 'object') - return a == b; - - if (a === null || b === null || a === undefined || b === undefined) - return false - - if (a.prototype !== b.prototype) return false; - - // Handle MongooseNumbers - if (a instanceof Number && b instanceof Number) { - return a.valueOf() === b.valueOf(); - } - - if (Buffer.isBuffer(a)) { - if (!Buffer.isBuffer(b)) return false; - if (a.length !== b.length) return false; - for (var i = 0, len = a.length; i < len; ++i) { - if (a[i] !== b[i]) return false; - } - return true; - } - - if (isMongooseObject(a)) a = a.toObject(); - if (isMongooseObject(b)) b = b.toObject(); - - try { - var ka = Object.keys(a), - kb = Object.keys(b), - key, i; - } catch (e) {//happens when one is a string literal and the other isn't - return false; - } - - // having the same number of owned properties (keys incorporates - // hasOwnProperty) - if (ka.length != kb.length) - return false; - - //the same set of keys (although not necessarily the same order), - ka.sort(); - kb.sort(); - - //~~~cheap key test - for (i = ka.length - 1; i >= 0; i--) { - if (ka[i] != kb[i]) - return false; - } - - //equivalent values for every corresponding key, and - //~~~possibly expensive deep test - for (i = ka.length - 1; i >= 0; i--) { - key = ka[i]; - if (!deepEqual(a[key], b[key])) return false; - } - - return true; -}; - -/** - * Object clone with Mongoose natives support. - * - * If options.minimize is true, creates a minimal data object. Empty objects and undefined values will not be cloned. This makes the data payload sent to MongoDB as small as possible. - * - * Functions are never cloned. - * - * @param {Object} obj the object to clone - * @param {Object} options - * @return {Object} the cloned object - * @api private - */ - -exports.clone = function clone (obj, options) { - if (obj === undefined || obj === null) - return obj; - - if (Array.isArray(obj)) - return cloneArray(obj, options); - - if (isMongooseObject(obj)) { - if (options && options.json && 'function' === typeof obj.toJSON) { - return obj.toJSON(options); - } else { - return obj.toObject(options); - } - } - - if ('Object' === obj.constructor.name) - return cloneObject(obj, options); - - if ('Date' === obj.constructor.name) - return new obj.constructor(+obj); - - if ('RegExp' === obj.constructor.name) { - var flags = []; - if (obj.global) flags.push('g'); - if (obj.multiline) flags.push('m'); - if (obj.ignoreCase) flags.push('i'); - return new RegExp(obj.source, flags.join('')); - } - - if (obj instanceof ObjectId) - return new ObjectId(obj.id); - - if (obj.valueOf) - return obj.valueOf(); -}; -var clone = exports.clone; - -/*! - * ignore - */ - -function cloneObject (obj, options) { - var retainKeyOrder = options && options.retainKeyOrder - , minimize = options && options.minimize - , ret = {} - , hasKeys - , keys - , val - , k - , i - - if (retainKeyOrder) { - for (k in obj) { - val = clone(obj[k], options); - - if (!minimize || ('undefined' !== typeof val)) { - hasKeys || (hasKeys = true); - ret[k] = val; - } - } - } else { - // faster - - keys = Object.keys(obj); - i = keys.length; - - while (i--) { - k = keys[i]; - val = clone(obj[k], options); - - if (!minimize || ('undefined' !== typeof val)) { - if (!hasKeys) hasKeys = true; - ret[k] = val; - } - } - } - - return minimize - ? hasKeys && ret - : ret; -}; - -function cloneArray (arr, options) { - var ret = []; - for (var i = 0, l = arr.length; i < l; i++) - ret.push(clone(arr[i], options)); - return ret; -}; - - -/** - * Copies and merges options with defaults. - * - * @param {Object} defaults - * @param {Object} options - * @return {Object} the merged object - * @api private - */ - -exports.options = function (defaults, options) { - var keys = Object.keys(defaults) - , i = keys.length - , k ; - - options = options || {}; - - while (i--) { - k = keys[i]; - if (!(k in options)) { - options[k] = defaults[k]; - } - } - - return options; -}; - -/** - * Generates a random string - * - * @api private - */ - -exports.random = function () { - return Math.random().toString().substr(3); -}; - -/** - * Merges `from` into `to` without overwriting existing properties. - * - * @param {Object} to - * @param {Object} from - * @api private - */ - -exports.merge = function merge (to, from) { - var keys = Object.keys(from) - , i = keys.length - , key - - while (i--) { - key = keys[i]; - if ('undefined' === typeof to[key]) { - to[key] = from[key]; - } else { - if (exports.isObject(from[key])) { - merge(to[key], from[key]); - } else { - to[key] = from[key]; - } - } - } -}; - -/*! - * toString helper - */ - -var toString = Object.prototype.toString; - -/** - * Determines if `arg` is an object. - * - * @param {Object|Array|String|Function|RegExp|any} arg - * @return {Boolean} - */ - -exports.isObject = function (arg) { - return '[object Object]' == toString.call(arg); -} - -/** - * A faster Array.prototype.slice.call(arguments) alternative - * @api private - */ - -exports.args = sliced; - -/** - * process.nextTick helper. - * - * Wraps `callback` in a try/catch + nextTick. - * - * node-mongodb-native has a habit of state corruption when an error is immediately thrown from within a collection callback. - * - * @param {Function} callback - * @api private - */ - -exports.tick = function tick (callback) { - if ('function' !== typeof callback) return; - return function () { - try { - callback.apply(this, arguments); - } catch (err) { - // only nextTick on err to get out of - // the event loop and avoid state corruption. - process.nextTick(function () { - throw err; - }); - } - } -} - -/** - * Returns if `v` is a mongoose object that has a `toObject()` method we can use. - * - * This is for compatibility with libs like Date.js which do foolish things to Natives. - * - * @param {any} v - * @api private - */ - -exports.isMongooseObject = function (v) { - Document || (Document = require('./document')); - MongooseArray || (MongooseArray = require('./types').Array); - MongooseBuffer || (MongooseBuffer = require('./types').Buffer); - - return v instanceof Document || - v instanceof MongooseArray || - v instanceof MongooseBuffer -} -var isMongooseObject = exports.isMongooseObject; - -/** - * Converts `expires` options of index objects to `expiresAfterSeconds` options for MongoDB. - * - * @param {Object} object - * @api private - */ - -exports.expires = function expires (object) { - if (!(object && 'Object' == object.constructor.name)) return; - if (!('expires' in object)) return; - - var when; - if ('string' != typeof object.expires) { - when = object.expires; - } else { - when = Math.round(ms(object.expires) / 1000); - } - object.expireAfterSeconds = when; - delete object.expires; -} - -exports.readPref = function readPref (pref, tags) { - if (Array.isArray(pref)) { - tags = pref[1]; - pref = pref[0]; - } - - switch (pref) { - case 'p': - pref = 'primary'; - break; - case 'pp': - pref = 'primaryPrefered'; - break; - case 's': - pref = 'secondary'; - break; - case 'sp': - pref = 'secondaryPrefered'; - break; - case 'n': - pref = 'nearest'; - break; - } - - return new ReadPref(pref, tags); -} diff --git a/node_modules/mongoose/lib/virtualtype.js b/node_modules/mongoose/lib/virtualtype.js deleted file mode 100644 index 819ac10..0000000 --- a/node_modules/mongoose/lib/virtualtype.js +++ /dev/null @@ -1,103 +0,0 @@ - -/** - * VirtualType constructor - * - * This is what mongoose uses to define virtual attributes via `Schema.prototype.virtual`. - * - * ####Example: - * - * var fullname = schema.virtual('fullname'); - * fullname instanceof mongoose.VirtualType // true - * - * @parma {Object} options - * @api public - */ - -function VirtualType (options, name) { - this.path = name; - this.getters = []; - this.setters = []; - this.options = options || {}; -} - -/** - * Defines a getter. - * - * ####Example: - * - * var virtual = schema.virtual('fullname'); - * virtual.get(function () { - * return this.name.first + ' ' + this.name.last; - * }); - * - * @param {Function} fn - * @return {VirtualType} this - * @api public - */ - -VirtualType.prototype.get = function (fn) { - this.getters.push(fn); - return this; -}; - -/** - * Defines a setter. - * - * ####Example: - * - * var virtual = schema.virtual('fullname'); - * virtual.set(function (v) { - * var parts = v.split(' '); - * this.name.first = parts[0]; - * this.name.last = parts[1]; - * }); - * - * @param {Function} fn - * @return {VirtualType} this - * @api public - */ - -VirtualType.prototype.set = function (fn) { - this.setters.push(fn); - return this; -}; - -/** - * Applies getters to `value` using optional `scope`. - * - * @param {Object} value - * @param {Object} scope - * @return {any} the value after applying all getters - * @api public - */ - -VirtualType.prototype.applyGetters = function (value, scope) { - var v = value; - for (var l = this.getters.length - 1; l >= 0; l--) { - v = this.getters[l].call(scope, v, this); - } - return v; -}; - -/** - * Applies setters to `value` using optional `scope`. - * - * @param {Object} value - * @param {Object} scope - * @return {any} the value after applying all setters - * @api public - */ - -VirtualType.prototype.applySetters = function (value, scope) { - var v = value; - for (var l = this.setters.length - 1; l >= 0; l--) { - v = this.setters[l].call(scope, v, this); - } - return v; -}; - -/*! - * exports - */ - -module.exports = VirtualType; diff --git a/node_modules/mongoose/node_modules/hooks/.npmignore b/node_modules/mongoose/node_modules/hooks/.npmignore deleted file mode 100644 index 96e29a8..0000000 --- a/node_modules/mongoose/node_modules/hooks/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -**.swp -node_modules diff --git a/node_modules/mongoose/node_modules/hooks/Makefile b/node_modules/mongoose/node_modules/hooks/Makefile deleted file mode 100644 index 1db5d65..0000000 --- a/node_modules/mongoose/node_modules/hooks/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -test: - @NODE_ENV=test ./node_modules/expresso/bin/expresso \ - $(TESTFLAGS) \ - ./test.js - -test-cov: - @TESTFLAGS=--cov $(MAKE) test - -.PHONY: test test-cov diff --git a/node_modules/mongoose/node_modules/hooks/README.md b/node_modules/mongoose/node_modules/hooks/README.md deleted file mode 100644 index af90a48..0000000 --- a/node_modules/mongoose/node_modules/hooks/README.md +++ /dev/null @@ -1,306 +0,0 @@ -hooks -============ - -Add pre and post middleware hooks to your JavaScript methods. - -## Installation - npm install hooks - -## Motivation -Suppose you have a JavaScript object with a `save` method. - -It would be nice to be able to declare code that runs before `save` and after `save`. -For example, you might want to run validation code before every `save`, -and you might want to dispatch a job to a background job queue after `save`. - -One might have an urge to hard code this all into `save`, but that turns out to -couple all these pieces of functionality (validation, save, and job creation) more -tightly than is necessary. For example, what if someone does not want to do background -job creation after the logical save? - -It is nicer to tack on functionality using what we call `pre` and `post` hooks. These -are functions that you define and that you direct to execute before or after particular -methods. - -## Example -We can use `hooks` to add validation and background jobs in the following way: - - var hooks = require('hooks') - , Document = require('./path/to/some/document/constructor'); - - // Add hooks' methods: `hook`, `pre`, and `post` - for (var k in hooks) { - Document[k] = hooks[k]; - } - - // Define a new method that is able to invoke pre and post middleware - Document.hook('save', Document.prototype.save); - - // Define a middleware function to be invoked before 'save' - Document.pre('save', function validate (next) { - // The `this` context inside of `pre` and `post` functions - // is the Document instance - if (this.isValid()) next(); // next() passes control to the next middleware - // or to the target method itself - else next(new Error("Invalid")); // next(error) invokes an error callback - }); - - // Define a middleware function to be invoked after 'save' - Document.post('save', function createJob () { - this.sendToBackgroundQueue(); - }); - -If you already have defined `Document.prototype` methods for which you want pres and posts, -then you do not need to explicitly invoke `Document.hook(...)`. Invoking `Document.pre(methodName, fn)` -or `Document.post(methodName, fn)` will automatically and lazily change `Document.prototype[methodName]` -so that it plays well with `hooks`. An equivalent way to implement the previous example is: - -```javascript -var hooks = require('hooks') - , Document = require('./path/to/some/document/constructor'); - -// Add hooks' methods: `hook`, `pre`, and `post` -for (var k in hooks) { - Document[k] = hooks[k]; -} - -Document.prototype.save = function () { - // ... -}; - -// Define a middleware function to be invoked before 'save' -Document.pre('save', function validate (next) { - // The `this` context inside of `pre` and `post` functions - // is the Document instance - if (this.isValid()) next(); // next() passes control to the next middleware - // or to the target method itself - else next(new Error("Invalid")); // next(error) invokes an error callback -}); - -// Define a middleware function to be invoked after 'save' -Document.post('save', function createJob () { - this.sendToBackgroundQueue(); -}); -``` - -## Pres and Posts as Middleware -We structure pres and posts as middleware to give you maximum flexibility: - -1. You can define **multiple** pres (or posts) for a single method. -2. These pres (or posts) are then executed as a chain of methods. -3. Any functions in this middleware chain can choose to halt the chain's execution by `next`ing an Error from that middleware function. If this occurs, then none of the other middleware in the chain will execute, and the main method (e.g., `save`) will not execute. This is nice, for example, when we don't want a document to save if it is invalid. - -## Defining multiple pres (or posts) -`pre` is chainable, so you can define multiple pres via: - Document.pre('save', function (next, halt) { - console.log("hello"); - }).pre('save', function (next, halt) { - console.log("world"); - }); - -As soon as one pre finishes executing, the next one will be invoked, and so on. - -## Error Handling -You can define a default error handler by passing a 2nd function as the 3rd argument to `hook`: - Document.hook('set', function (path, val) { - this[path] = val; - }, function (err) { - // Handler the error here - console.error(err); - }); - -Then, we can pass errors to this handler from a pre or post middleware function: - Document.pre('set', function (next, path, val) { - next(new Error()); - }); - -If you do not set up a default handler, then `hooks` makes the default handler that just throws the `Error`. - -The default error handler can be over-rided on a per method invocation basis. - -If the main method that you are surrounding with pre and post middleware expects its last argument to be a function -with callback signature `function (error, ...)`, then that callback becomes the error handler, over-riding the default -error handler you may have set up. - -```javascript -Document.hook('save', function (callback) { - // Save logic goes here - ... -}); - -var doc = new Document(); -doc.save( function (err, saved) { - // We can pass err via `next` in any of our pre or post middleware functions - if (err) console.error(err); - - // Rest of callback logic follows ... -}); -``` - -## Mutating Arguments via Middleware -`pre` and `post` middleware can also accept the intended arguments for the method -they augment. This is useful if you want to mutate the arguments before passing -them along to the next middleware and eventually pass a mutated arguments list to -the main method itself. - -As a simple example, let's define a method `set` that just sets a key, value pair. -If we want to namespace the key, we can do so by adding a `pre` middleware hook -that runs before `set`, alters the arguments by namespacing the `key` argument, and passes them onto `set`: - - Document.hook('set', function (key, val) { - this[key] = val; - }); - Document.pre('set', function (next, key, val) { - next('namespace-' + key, val); - }); - var doc = new Document(); - doc.set('hello', 'world'); - console.log(doc.hello); // undefined - console.log(doc['namespace-hello']); // 'world' - -As you can see above, we pass arguments via `next`. - -If you are not mutating the arguments, then you can pass zero arguments -to `next`, and the next middleware function will still have access -to the arguments. - - Document.hook('set', function (key, val) { - this[key] = val; - }); - Document.pre('set', function (next, key, val) { - // I have access to key and val here - next(); // We don't need to pass anything to next - }); - Document.pre('set', function (next, key, val) { - // And I still have access to the original key and val here - next(); - }); - -Finally, you can add arguments that downstream middleware can also see: - - // Note that in the definition of `set`, there is no 3rd argument, options - Document.hook('set', function (key, val) { - // But... - var options = arguments[2]; // ...I have access to an options argument - // because of pre function pre2 (defined below) - console.log(options); // '{debug: true}' - this[key] = val; - }); - Document.pre('set', function pre1 (next, key, val) { - // I only have access to key and val arguments - console.log(arguments.length); // 3 - next(key, val, {debug: true}); - }); - Document.pre('set', function pre2 (next, key, val, options) { - console.log(arguments.length); // 4 - console.log(options); // '{ debug: true}' - next(); - }); - Document.pre('set', function pre3 (next, key, val, options) { - // I still have access to key, val, AND the options argument introduced via the preceding middleware - console.log(arguments.length); // 4 - console.log(options); // '{ debug: true}' - next(); - }); - - var doc = new Document() - doc.set('hey', 'there'); - -## Parallel `pre` middleware - -All middleware up to this point has been "serial" middleware -- i.e., middleware whose logic -is executed as a serial chain. - -Some scenarios call for parallel middleware -- i.e., middleware that can wait for several -asynchronous services at once to respond. - -For instance, you may only want to save a Document only after you have checked -that the Document is valid according to two different remote services. - -We accomplish asynchronous middleware by adding a second kind of flow control callback -(the only flow control callback so far has been `next`), called `done`. - -- `next` passes control to the next middleware in the chain -- `done` keeps track of how many parallel middleware have invoked `done` and passes - control to the target method when ALL parallel middleware have invoked `done`. If - you pass an `Error` to `done`, then the error is handled, and the main method that is - wrapped by pres and posts will not get invoked. - -We declare pre middleware that is parallel by passing a 3rd boolean argument to our `pre` -definition method. - -We illustrate via the parallel validation example mentioned above: - - Document.hook('save', function targetFn (callback) { - // Save logic goes here - // ... - // This only gets run once the two `done`s are both invoked via preOne and preTwo. - }); - - // true marks this as parallel middleware - Document.pre('save', true, function preOne (next, doneOne, callback) { - remoteServiceOne.validate(this.serialize(), function (err, isValid) { - // The code in here will probably be run after the `next` below this block - // and could possibly be run after the console.log("Hola") in `preTwo - if (err) return doneOne(err); - if (isValid) doneOne(); - }); - next(); // Pass control to the next middleware - }); - - // We will suppose that we need 2 different remote services to validate our document - Document.pre('save', true, function preTwo (next, doneTwo, callback) { - remoteServiceTwo.validate(this.serialize(), function (err, isValid) { - if (err) return doneTwo(err); - if (isValid) doneTwo(); - }); - next(); - }); - - // While preOne and preTwo are parallel, preThree is a serial pre middleware - Document.pre('save', function preThree (next, callback) { - next(); - }); - - var doc = new Document(); - doc.save( function (err, doc) { - // Do stuff with the saved doc here... - }); - -In the above example, flow control may happen in the following way: - -(1) doc.save -> (2) preOne --(next)--> (3) preTwo --(next)--> (4) preThree --(next)--> (wait for dones to invoke) -> (5) doneTwo -> (6) doneOne -> (7) targetFn - -So what's happening is that: - -1. You call `doc.save(...)` -2. First, your preOne middleware gets executed. It makes a remote call to the validation service and `next()`s to the preTwo middleware. -3. Now, your preTwo middleware gets executed. It makes a remote call to another validation service and `next()`s to the preThree middleware. -4. Your preThree middleware gets executed. It immediately `next()`s. But nothing else gets executing until both `doneOne` and `doneTwo` are invoked inside the callbacks handling the response from the two valiation services. -5. We will suppose that validation remoteServiceTwo returns a response to us first. In this case, we call `doneTwo` inside the callback to remoteServiceTwo. -6. Some fractions of a second later, remoteServiceOne returns a response to us. In this case, we call `doneOne` inside the callback to remoteServiceOne. -7. `hooks` implementation keeps track of how many parallel middleware has been defined per target function. It detects that both asynchronous pre middlewares (`preOne` and `preTwo`) have finally called their `done` functions (`doneOne` and `doneTwo`), so the implementation finally invokes our `targetFn` (i.e., our core `save` business logic). - -## Removing Pres - -You can remove a particular pre associated with a hook: - - Document.pre('set', someFn); - Document.removePre('set', someFn); - -And you can also remove all pres associated with a hook: - Document.removePre('set'); // Removes all declared `pre`s on the hook 'set' - -## Tests -To run the tests: - make test - -### Contributors -- [Brian Noguchi](https://github.com/bnoguchi) - -### License -MIT License - ---- -### Author -Brian Noguchi diff --git a/node_modules/mongoose/node_modules/hooks/hooks.alt.js b/node_modules/mongoose/node_modules/hooks/hooks.alt.js deleted file mode 100644 index 6ced357..0000000 --- a/node_modules/mongoose/node_modules/hooks/hooks.alt.js +++ /dev/null @@ -1,134 +0,0 @@ -/** - * Hooks are useful if we want to add a method that automatically has `pre` and `post` hooks. - * For example, it would be convenient to have `pre` and `post` hooks for `save`. - * _.extend(Model, mixins.hooks); - * Model.hook('save', function () { - * console.log('saving'); - * }); - * Model.pre('save', function (next, done) { - * console.log('about to save'); - * next(); - * }); - * Model.post('save', function (next, done) { - * console.log('saved'); - * next(); - * }); - * - * var m = new Model(); - * m.save(); - * // about to save - * // saving - * // saved - */ - -// TODO Add in pre and post skipping options -module.exports = { - /** - * Declares a new hook to which you can add pres and posts - * @param {String} name of the function - * @param {Function} the method - * @param {Function} the error handler callback - */ - hook: function (name, fn, err) { - if (arguments.length === 1 && typeof name === 'object') { - for (var k in name) { // `name` is a hash of hookName->hookFn - this.hook(k, name[k]); - } - return; - } - - if (!err) err = fn; - - var proto = this.prototype || this - , pres = proto._pres = proto._pres || {} - , posts = proto._posts = proto._posts || {}; - pres[name] = pres[name] || []; - posts[name] = posts[name] || []; - - function noop () {} - - proto[name] = function () { - var self = this - , pres = this._pres[name] - , posts = this._posts[name] - , numAsyncPres = 0 - , hookArgs = [].slice.call(arguments) - , preChain = pres.map( function (pre, i) { - var wrapper = function () { - if (arguments[0] instanceof Error) - return err(arguments[0]); - if (numAsyncPres) { - // arguments[1] === asyncComplete - if (arguments.length) - hookArgs = [].slice.call(arguments, 2); - pre.apply(self, - [ preChain[i+1] || allPresInvoked, - asyncComplete - ].concat(hookArgs) - ); - } else { - if (arguments.length) - hookArgs = [].slice.call(arguments); - pre.apply(self, - [ preChain[i+1] || allPresDone ].concat(hookArgs)); - } - }; // end wrapper = function () {... - if (wrapper.isAsync = pre.isAsync) - numAsyncPres++; - return wrapper; - }); // end posts.map(...) - function allPresInvoked () { - if (arguments[0] instanceof Error) - err(arguments[0]); - } - - function allPresDone () { - if (arguments[0] instanceof Error) - return err(arguments[0]); - if (arguments.length) - hookArgs = [].slice.call(arguments); - fn.apply(self, hookArgs); - var postChain = posts.map( function (post, i) { - var wrapper = function () { - if (arguments[0] instanceof Error) - return err(arguments[0]); - if (arguments.length) - hookArgs = [].slice.call(arguments); - post.apply(self, - [ postChain[i+1] || noop].concat(hookArgs)); - }; // end wrapper = function () {... - return wrapper; - }); // end posts.map(...) - if (postChain.length) postChain[0](); - } - - if (numAsyncPres) { - complete = numAsyncPres; - function asyncComplete () { - if (arguments[0] instanceof Error) - return err(arguments[0]); - --complete || allPresDone.call(this); - } - } - (preChain[0] || allPresDone)(); - }; - - return this; - }, - - pre: function (name, fn, isAsync) { - var proto = this.prototype - , pres = proto._pres = proto._pres || {}; - if (fn.isAsync = isAsync) { - this.prototype[name].numAsyncPres++; - } - (pres[name] = pres[name] || []).push(fn); - return this; - }, - post: function (name, fn, isAsync) { - var proto = this.prototype - , posts = proto._posts = proto._posts || {}; - (posts[name] = posts[name] || []).push(fn); - return this; - } -}; diff --git a/node_modules/mongoose/node_modules/hooks/hooks.js b/node_modules/mongoose/node_modules/hooks/hooks.js deleted file mode 100644 index 9a887c7..0000000 --- a/node_modules/mongoose/node_modules/hooks/hooks.js +++ /dev/null @@ -1,161 +0,0 @@ -// TODO Add in pre and post skipping options -module.exports = { - /** - * Declares a new hook to which you can add pres and posts - * @param {String} name of the function - * @param {Function} the method - * @param {Function} the error handler callback - */ - hook: function (name, fn, errorCb) { - if (arguments.length === 1 && typeof name === 'object') { - for (var k in name) { // `name` is a hash of hookName->hookFn - this.hook(k, name[k]); - } - return; - } - - var proto = this.prototype || this - , pres = proto._pres = proto._pres || {} - , posts = proto._posts = proto._posts || {}; - pres[name] = pres[name] || []; - posts[name] = posts[name] || []; - - proto[name] = function () { - var self = this - , hookArgs // arguments eventually passed to the hook - are mutable - , lastArg = arguments[arguments.length-1] - , pres = this._pres[name] - , posts = this._posts[name] - , _total = pres.length - , _current = -1 - , _asyncsLeft = proto[name].numAsyncPres - , _next = function () { - if (arguments[0] instanceof Error) { - return handleError(arguments[0]); - } - var _args = Array.prototype.slice.call(arguments) - , currPre - , preArgs; - if (_args.length && !(arguments[0] == null && typeof lastArg === 'function')) - hookArgs = _args; - if (++_current < _total) { - currPre = pres[_current] - if (currPre.isAsync && currPre.length < 2) - throw new Error("Your pre must have next and done arguments -- e.g., function (next, done, ...)"); - if (currPre.length < 1) - throw new Error("Your pre must have a next argument -- e.g., function (next, ...)"); - preArgs = (currPre.isAsync - ? [once(_next), once(_asyncsDone)] - : [once(_next)]).concat(hookArgs); - return currPre.apply(self, preArgs); - } else if (!proto[name].numAsyncPres) { - return _done.apply(self, hookArgs); - } - } - , _done = function () { - var args_ = Array.prototype.slice.call(arguments) - , ret, total_, current_, next_, done_, postArgs; - if (_current === _total) { - ret = fn.apply(self, args_); - total_ = posts.length; - current_ = -1; - next_ = function () { - if (arguments[0] instanceof Error) { - return handleError(arguments[0]); - } - var args_ = Array.prototype.slice.call(arguments, 1) - , currPost - , postArgs; - if (args_.length) hookArgs = args_; - if (++current_ < total_) { - currPost = posts[current_] - if (currPost.length < 1) - throw new Error("Your post must have a next argument -- e.g., function (next, ...)"); - postArgs = [once(next_)].concat(hookArgs); - return currPost.apply(self, postArgs); - } - }; - if (total_) return next_(); - return ret; - } - }; - if (_asyncsLeft) { - function _asyncsDone (err) { - if (err && err instanceof Error) { - return handleError(err); - } - --_asyncsLeft || _done.apply(self, hookArgs); - } - } - function handleError (err) { - if ('function' == typeof lastArg) - return lastArg(err); - if (errorCb) return errorCb.call(self, err); - throw err; - } - return _next.apply(this, arguments); - }; - - proto[name].numAsyncPres = 0; - - return this; - }, - - pre: function (name, isAsync, fn, errorCb) { - if ('boolean' !== typeof arguments[1]) { - errorCb = fn; - fn = isAsync; - isAsync = false; - } - var proto = this.prototype || this - , pres = proto._pres = proto._pres || {}; - - this._lazySetupHooks(proto, name, errorCb); - - if (fn.isAsync = isAsync) { - proto[name].numAsyncPres++; - } - - (pres[name] = pres[name] || []).push(fn); - return this; - }, - post: function (name, isAsync, fn) { - if (arguments.length === 2) { - fn = isAsync; - isAsync = false; - } - var proto = this.prototype || this - , posts = proto._posts = proto._posts || {}; - - this._lazySetupHooks(proto, name); - (posts[name] = posts[name] || []).push(fn); - return this; - }, - removePre: function (name, fnToRemove) { - var proto = this.prototype || this - , pres = proto._pres || (proto._pres || {}); - if (!pres[name]) return this; - if (arguments.length === 1) { - // Remove all pre callbacks for hook `name` - pres[name].length = 0; - } else { - pres[name] = pres[name].filter( function (currFn) { - return currFn !== fnToRemove; - }); - } - return this; - }, - _lazySetupHooks: function (proto, methodName, errorCb) { - if ('undefined' === typeof proto[methodName].numAsyncPres) { - this.hook(methodName, proto[methodName], errorCb); - } - } -}; - -function once (fn, scope) { - return function fnWrapper () { - if (fnWrapper.hookCalled) return; - fnWrapper.hookCalled = true; - fn.apply(scope, arguments); - }; -} diff --git a/node_modules/mongoose/node_modules/hooks/package.json b/node_modules/mongoose/node_modules/hooks/package.json deleted file mode 100644 index 9300f23..0000000 --- a/node_modules/mongoose/node_modules/hooks/package.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "hooks", - "description": "Adds pre and post hook functionality to your JavaScript methods.", - "version": "0.2.1", - "keywords": [ - "node", - "hooks", - "middleware", - "pre", - "post" - ], - "homepage": "https://github.com/bnoguchi/hooks-js/", - "repository": { - "type": "git", - "url": "git://github.com/bnoguchi/hooks-js.git" - }, - "author": { - "name": "Brian Noguchi", - "email": "brian.noguchi@gmail.com", - "url": "https://github.com/bnoguchi/" - }, - "main": "./hooks.js", - "directories": { - "lib": "." - }, - "scripts": { - "test": "make test" - }, - "dependencies": {}, - "devDependencies": { - "expresso": ">=0.7.6", - "should": ">=0.2.1", - "underscore": ">=1.1.4" - }, - "engines": { - "node": ">=0.4.0" - }, - "licenses": [ - "MIT" - ], - "optionalDependencies": {}, - "readme": "hooks\n============\n\nAdd pre and post middleware hooks to your JavaScript methods.\n\n## Installation\n npm install hooks\n\n## Motivation\nSuppose you have a JavaScript object with a `save` method.\n\nIt would be nice to be able to declare code that runs before `save` and after `save`.\nFor example, you might want to run validation code before every `save`,\nand you might want to dispatch a job to a background job queue after `save`.\n\nOne might have an urge to hard code this all into `save`, but that turns out to\ncouple all these pieces of functionality (validation, save, and job creation) more\ntightly than is necessary. For example, what if someone does not want to do background\njob creation after the logical save? \n\nIt is nicer to tack on functionality using what we call `pre` and `post` hooks. These\nare functions that you define and that you direct to execute before or after particular\nmethods.\n\n## Example\nWe can use `hooks` to add validation and background jobs in the following way:\n\n var hooks = require('hooks')\n , Document = require('./path/to/some/document/constructor');\n\n // Add hooks' methods: `hook`, `pre`, and `post` \n for (var k in hooks) {\n Document[k] = hooks[k];\n }\n\n // Define a new method that is able to invoke pre and post middleware\n Document.hook('save', Document.prototype.save);\n\n // Define a middleware function to be invoked before 'save'\n Document.pre('save', function validate (next) {\n // The `this` context inside of `pre` and `post` functions\n // is the Document instance\n if (this.isValid()) next(); // next() passes control to the next middleware\n // or to the target method itself\n else next(new Error(\"Invalid\")); // next(error) invokes an error callback\n });\n\n // Define a middleware function to be invoked after 'save'\n Document.post('save', function createJob () {\n this.sendToBackgroundQueue();\n });\n\nIf you already have defined `Document.prototype` methods for which you want pres and posts,\nthen you do not need to explicitly invoke `Document.hook(...)`. Invoking `Document.pre(methodName, fn)`\nor `Document.post(methodName, fn)` will automatically and lazily change `Document.prototype[methodName]`\nso that it plays well with `hooks`. An equivalent way to implement the previous example is:\n\n```javascript\nvar hooks = require('hooks')\n , Document = require('./path/to/some/document/constructor');\n\n// Add hooks' methods: `hook`, `pre`, and `post` \nfor (var k in hooks) {\n Document[k] = hooks[k];\n}\n\nDocument.prototype.save = function () {\n // ...\n};\n\n// Define a middleware function to be invoked before 'save'\nDocument.pre('save', function validate (next) {\n // The `this` context inside of `pre` and `post` functions\n // is the Document instance\n if (this.isValid()) next(); // next() passes control to the next middleware\n // or to the target method itself\n else next(new Error(\"Invalid\")); // next(error) invokes an error callback\n});\n\n// Define a middleware function to be invoked after 'save'\nDocument.post('save', function createJob () {\n this.sendToBackgroundQueue();\n});\n```\n\n## Pres and Posts as Middleware\nWe structure pres and posts as middleware to give you maximum flexibility:\n\n1. You can define **multiple** pres (or posts) for a single method.\n2. These pres (or posts) are then executed as a chain of methods.\n3. Any functions in this middleware chain can choose to halt the chain's execution by `next`ing an Error from that middleware function. If this occurs, then none of the other middleware in the chain will execute, and the main method (e.g., `save`) will not execute. This is nice, for example, when we don't want a document to save if it is invalid.\n\n## Defining multiple pres (or posts)\n`pre` is chainable, so you can define multiple pres via:\n Document.pre('save', function (next, halt) {\n console.log(\"hello\");\n }).pre('save', function (next, halt) {\n console.log(\"world\");\n });\n\nAs soon as one pre finishes executing, the next one will be invoked, and so on.\n\n## Error Handling\nYou can define a default error handler by passing a 2nd function as the 3rd argument to `hook`:\n Document.hook('set', function (path, val) {\n this[path] = val;\n }, function (err) {\n // Handler the error here\n console.error(err);\n });\n\nThen, we can pass errors to this handler from a pre or post middleware function:\n Document.pre('set', function (next, path, val) {\n next(new Error());\n });\n\nIf you do not set up a default handler, then `hooks` makes the default handler that just throws the `Error`.\n\nThe default error handler can be over-rided on a per method invocation basis.\n\nIf the main method that you are surrounding with pre and post middleware expects its last argument to be a function\nwith callback signature `function (error, ...)`, then that callback becomes the error handler, over-riding the default\nerror handler you may have set up.\n \n```javascript\nDocument.hook('save', function (callback) {\n // Save logic goes here\n ...\n});\n\nvar doc = new Document();\ndoc.save( function (err, saved) {\n // We can pass err via `next` in any of our pre or post middleware functions\n if (err) console.error(err);\n \n // Rest of callback logic follows ...\n});\n```\n\n## Mutating Arguments via Middleware\n`pre` and `post` middleware can also accept the intended arguments for the method\nthey augment. This is useful if you want to mutate the arguments before passing\nthem along to the next middleware and eventually pass a mutated arguments list to\nthe main method itself.\n\nAs a simple example, let's define a method `set` that just sets a key, value pair.\nIf we want to namespace the key, we can do so by adding a `pre` middleware hook\nthat runs before `set`, alters the arguments by namespacing the `key` argument, and passes them onto `set`:\n\n Document.hook('set', function (key, val) {\n this[key] = val;\n });\n Document.pre('set', function (next, key, val) {\n next('namespace-' + key, val);\n });\n var doc = new Document();\n doc.set('hello', 'world');\n console.log(doc.hello); // undefined\n console.log(doc['namespace-hello']); // 'world'\n\nAs you can see above, we pass arguments via `next`.\n\nIf you are not mutating the arguments, then you can pass zero arguments\nto `next`, and the next middleware function will still have access\nto the arguments.\n\n Document.hook('set', function (key, val) {\n this[key] = val;\n });\n Document.pre('set', function (next, key, val) {\n // I have access to key and val here\n next(); // We don't need to pass anything to next\n });\n Document.pre('set', function (next, key, val) {\n // And I still have access to the original key and val here\n next();\n });\n\nFinally, you can add arguments that downstream middleware can also see:\n\n // Note that in the definition of `set`, there is no 3rd argument, options\n Document.hook('set', function (key, val) {\n // But...\n var options = arguments[2]; // ...I have access to an options argument\n // because of pre function pre2 (defined below)\n console.log(options); // '{debug: true}'\n this[key] = val;\n });\n Document.pre('set', function pre1 (next, key, val) {\n // I only have access to key and val arguments\n console.log(arguments.length); // 3\n next(key, val, {debug: true});\n });\n Document.pre('set', function pre2 (next, key, val, options) {\n console.log(arguments.length); // 4\n console.log(options); // '{ debug: true}'\n next();\n });\n Document.pre('set', function pre3 (next, key, val, options) {\n // I still have access to key, val, AND the options argument introduced via the preceding middleware\n console.log(arguments.length); // 4\n console.log(options); // '{ debug: true}'\n next();\n });\n \n var doc = new Document()\n doc.set('hey', 'there');\n\n## Parallel `pre` middleware\n\nAll middleware up to this point has been \"serial\" middleware -- i.e., middleware whose logic\nis executed as a serial chain.\n\nSome scenarios call for parallel middleware -- i.e., middleware that can wait for several\nasynchronous services at once to respond.\n\nFor instance, you may only want to save a Document only after you have checked\nthat the Document is valid according to two different remote services.\n\nWe accomplish asynchronous middleware by adding a second kind of flow control callback\n(the only flow control callback so far has been `next`), called `done`.\n\n- `next` passes control to the next middleware in the chain\n- `done` keeps track of how many parallel middleware have invoked `done` and passes\n control to the target method when ALL parallel middleware have invoked `done`. If\n you pass an `Error` to `done`, then the error is handled, and the main method that is\n wrapped by pres and posts will not get invoked.\n\nWe declare pre middleware that is parallel by passing a 3rd boolean argument to our `pre`\ndefinition method.\n\nWe illustrate via the parallel validation example mentioned above:\n\n Document.hook('save', function targetFn (callback) {\n // Save logic goes here\n // ...\n // This only gets run once the two `done`s are both invoked via preOne and preTwo.\n });\n\n // true marks this as parallel middleware\n Document.pre('save', true, function preOne (next, doneOne, callback) {\n remoteServiceOne.validate(this.serialize(), function (err, isValid) {\n // The code in here will probably be run after the `next` below this block\n // and could possibly be run after the console.log(\"Hola\") in `preTwo\n if (err) return doneOne(err);\n if (isValid) doneOne();\n });\n next(); // Pass control to the next middleware\n });\n \n // We will suppose that we need 2 different remote services to validate our document\n Document.pre('save', true, function preTwo (next, doneTwo, callback) {\n remoteServiceTwo.validate(this.serialize(), function (err, isValid) {\n if (err) return doneTwo(err);\n if (isValid) doneTwo();\n });\n next();\n });\n \n // While preOne and preTwo are parallel, preThree is a serial pre middleware\n Document.pre('save', function preThree (next, callback) {\n next();\n });\n \n var doc = new Document();\n doc.save( function (err, doc) {\n // Do stuff with the saved doc here...\n });\n\nIn the above example, flow control may happen in the following way:\n\n(1) doc.save -> (2) preOne --(next)--> (3) preTwo --(next)--> (4) preThree --(next)--> (wait for dones to invoke) -> (5) doneTwo -> (6) doneOne -> (7) targetFn\n\nSo what's happening is that:\n\n1. You call `doc.save(...)`\n2. First, your preOne middleware gets executed. It makes a remote call to the validation service and `next()`s to the preTwo middleware.\n3. Now, your preTwo middleware gets executed. It makes a remote call to another validation service and `next()`s to the preThree middleware.\n4. Your preThree middleware gets executed. It immediately `next()`s. But nothing else gets executing until both `doneOne` and `doneTwo` are invoked inside the callbacks handling the response from the two valiation services.\n5. We will suppose that validation remoteServiceTwo returns a response to us first. In this case, we call `doneTwo` inside the callback to remoteServiceTwo.\n6. Some fractions of a second later, remoteServiceOne returns a response to us. In this case, we call `doneOne` inside the callback to remoteServiceOne.\n7. `hooks` implementation keeps track of how many parallel middleware has been defined per target function. It detects that both asynchronous pre middlewares (`preOne` and `preTwo`) have finally called their `done` functions (`doneOne` and `doneTwo`), so the implementation finally invokes our `targetFn` (i.e., our core `save` business logic).\n\n## Removing Pres\n\nYou can remove a particular pre associated with a hook:\n\n Document.pre('set', someFn);\n Document.removePre('set', someFn);\n\nAnd you can also remove all pres associated with a hook:\n Document.removePre('set'); // Removes all declared `pre`s on the hook 'set'\n\n## Tests\nTo run the tests:\n make test\n\n### Contributors\n- [Brian Noguchi](https://github.com/bnoguchi)\n\n### License\nMIT License\n\n---\n### Author\nBrian Noguchi\n", - "_id": "hooks@0.2.1", - "_from": "hooks@0.2.1" -} diff --git a/node_modules/mongoose/node_modules/hooks/test.js b/node_modules/mongoose/node_modules/hooks/test.js deleted file mode 100644 index efe2f3e..0000000 --- a/node_modules/mongoose/node_modules/hooks/test.js +++ /dev/null @@ -1,691 +0,0 @@ -var hooks = require('./hooks') - , should = require('should') - , assert = require('assert') - , _ = require('underscore'); - -// TODO Add in test for making sure all pres get called if pre is defined directly on an instance. -// TODO Test for calling `done` twice or `next` twice in the same function counts only once -module.exports = { - 'should be able to assign multiple hooks at once': function () { - var A = function () {}; - _.extend(A, hooks); - A.hook({ - hook1: function (a) {}, - hook2: function (b) {} - }); - var a = new A(); - assert.equal(typeof a.hook1, 'function'); - assert.equal(typeof a.hook2, 'function'); - }, - 'should run without pres and posts when not present': function () { - var A = function () {}; - _.extend(A, hooks); - A.hook('save', function () { - this.value = 1; - }); - var a = new A(); - a.save(); - a.value.should.equal(1); - }, - 'should run with pres when present': function () { - var A = function () {}; - _.extend(A, hooks); - A.hook('save', function () { - this.value = 1; - }); - A.pre('save', function (next) { - this.preValue = 2; - next(); - }); - var a = new A(); - a.save(); - a.value.should.equal(1); - a.preValue.should.equal(2); - }, - 'should run with posts when present': function () { - var A = function () {}; - _.extend(A, hooks); - A.hook('save', function () { - this.value = 1; - }); - A.post('save', function (next) { - this.value = 2; - next(); - }); - var a = new A(); - a.save(); - a.value.should.equal(2); - }, - 'should run pres and posts when present': function () { - var A = function () {}; - _.extend(A, hooks); - A.hook('save', function () { - this.value = 1; - }); - A.pre('save', function (next) { - this.preValue = 2; - next(); - }); - A.post('save', function (next) { - this.value = 3; - next(); - }); - var a = new A(); - a.save(); - a.value.should.equal(3); - a.preValue.should.equal(2); - }, - 'should run posts after pres': function () { - var A = function () {}; - _.extend(A, hooks); - A.hook('save', function () { - this.value = 1; - }); - A.pre('save', function (next) { - this.override = 100; - next(); - }); - A.post('save', function (next) { - this.override = 200; - next(); - }); - var a = new A(); - a.save(); - a.value.should.equal(1); - a.override.should.equal(200); - }, - 'should not run a hook if a pre fails': function () { - var A = function () {}; - _.extend(A, hooks); - var counter = 0; - A.hook('save', function () { - this.value = 1; - }, function (err) { - counter++; - }); - A.pre('save', true, function (next, done) { - next(new Error()); - }); - var a = new A(); - a.save(); - counter.should.equal(1); - assert.equal(typeof a.value, 'undefined'); - }, - 'should be able to run multiple pres': function () { - var A = function () {}; - _.extend(A, hooks); - A.hook('save', function () { - this.value = 1; - }); - A.pre('save', function (next) { - this.v1 = 1; - next(); - }).pre('save', function (next) { - this.v2 = 2; - next(); - }); - var a = new A(); - a.save(); - a.v1.should.equal(1); - a.v2.should.equal(2); - }, - 'should run multiple pres until a pre fails and not call the hook': function () { - var A = function () {}; - _.extend(A, hooks); - A.hook('save', function () { - this.value = 1; - }, function (err) {}); - A.pre('save', function (next) { - this.v1 = 1; - next(); - }).pre('save', function (next) { - next(new Error()); - }).pre('save', function (next) { - this.v3 = 3; - next(); - }); - var a = new A(); - a.save(); - a.v1.should.equal(1); - assert.equal(typeof a.v3, 'undefined'); - assert.equal(typeof a.value, 'undefined'); - }, - 'should be able to run multiple posts': function () { - var A = function () {}; - _.extend(A, hooks); - A.hook('save', function () { - this.value = 1; - }); - A.post('save', function (next) { - this.value = 2; - next(); - }).post('save', function (next) { - this.value = 3.14; - next(); - }).post('save', function (next) { - this.v3 = 3; - next(); - }); - var a = new A(); - a.save(); - assert.equal(a.value, 3.14); - assert.equal(a.v3, 3); - }, - 'should run only posts up until an error': function () { - var A = function () {}; - _.extend(A, hooks); - A.hook('save', function () { - this.value = 1; - }, function (err) {}); - A.post('save', function (next) { - this.value = 2; - next(); - }).post('save', function (next) { - this.value = 3; - next(new Error()); - }).post('save', function (next) { - this.value = 4; - next(); - }); - var a = new A(); - a.save(); - a.value.should.equal(3); - }, - "should fall back first to the hook method's last argument as the error handler if it is a function of arity 1 or 2": function () { - var A = function () {}; - _.extend(A, hooks); - var counter = 0; - A.hook('save', function (callback) { - this.value = 1; - }); - A.pre('save', true, function (next, done) { - next(new Error()); - }); - var a = new A(); - a.save( function (err) { - if (err instanceof Error) counter++; - }); - counter.should.equal(1); - should.deepEqual(undefined, a.value); - }, - 'should fall back second to the default error handler if specified': function () { - var A = function () {}; - _.extend(A, hooks); - var counter = 0; - A.hook('save', function (callback) { - this.value = 1; - }, function (err) { - if (err instanceof Error) counter++; - }); - A.pre('save', true, function (next, done) { - next(new Error()); - }); - var a = new A(); - a.save(); - counter.should.equal(1); - should.deepEqual(undefined, a.value); - }, - 'fallback default error handler should scope to the object': function () { - var A = function () { - this.counter = 0; - }; - _.extend(A, hooks); - var counter = 0; - A.hook('save', function (callback) { - this.value = 1; - }, function (err) { - if (err instanceof Error) this.counter++; - }); - A.pre('save', true, function (next, done) { - next(new Error()); - }); - var a = new A(); - a.save(); - a.counter.should.equal(1); - should.deepEqual(undefined, a.value); - }, - 'should fall back last to throwing the error': function () { - var A = function () {}; - _.extend(A, hooks); - var counter = 0; - A.hook('save', function (err) { - if (err instanceof Error) return counter++; - this.value = 1; - }); - A.pre('save', true, function (next, done) { - next(new Error()); - }); - var a = new A(); - var didCatch = false; - try { - a.save(); - } catch (e) { - didCatch = true; - e.should.be.an.instanceof(Error); - counter.should.equal(0); - assert.equal(typeof a.value, 'undefined'); - } - didCatch.should.be.true; - }, - "should proceed without mutating arguments if `next(null|undefined)` is called in a serial pre, and the last argument of the target method is a callback with node-like signature function (err, obj) {...} or function (err) {...}": function () { - var A = function () {}; - _.extend(A, hooks); - var counter = 0; - A.prototype.save = function (callback) { - this.value = 1; - callback(); - }; - A.pre('save', function (next) { - next(null); - }); - A.pre('save', function (next) { - next(undefined); - }); - var a = new A(); - a.save( function (err) { - if (err instanceof Error) counter++; - else counter--; - }); - counter.should.equal(-1); - a.value.should.eql(1); - }, - "should proceed with mutating arguments if `next(null|undefined)` is callback in a serial pre, and the last argument of the target method is not a function": function () { - var A = function () {}; - _.extend(A, hooks); - A.prototype.set = function (v) { - this.value = v; - }; - A.pre('set', function (next) { - next(undefined); - }); - A.pre('set', function (next) { - next(null); - }); - var a = new A(); - a.set(1); - should.strictEqual(null, a.value); - }, - 'should not run any posts if a pre fails': function () { - var A = function () {}; - _.extend(A, hooks); - A.hook('save', function () { - this.value = 2; - }, function (err) {}); - A.pre('save', function (next) { - this.value = 1; - next(new Error()); - }).post('save', function (next) { - this.value = 3; - next(); - }); - var a = new A(); - a.save(); - a.value.should.equal(1); - }, - - "can pass the hook's arguments verbatim to pres": function () { - var A = function () {}; - _.extend(A, hooks); - A.hook('set', function (path, val) { - this[path] = val; - }); - A.pre('set', function (next, path, val) { - path.should.equal('hello'); - val.should.equal('world'); - next(); - }); - var a = new A(); - a.set('hello', 'world'); - a.hello.should.equal('world'); - }, -// "can pass the hook's arguments as an array to pres": function () { -// // Great for dynamic arity - e.g., slice(...) -// var A = function () {}; -// _.extend(A, hooks); -// A.hook('set', function (path, val) { -// this[path] = val; -// }); -// A.pre('set', function (next, hello, world) { -// hello.should.equal('hello'); -// world.should.equal('world'); -// next(); -// }); -// var a = new A(); -// a.set('hello', 'world'); -// assert.equal(a.hello, 'world'); -// }, - "can pass the hook's arguments verbatim to posts": function () { - var A = function () {}; - _.extend(A, hooks); - A.hook('set', function (path, val) { - this[path] = val; - }); - A.post('set', function (next, path, val) { - path.should.equal('hello'); - val.should.equal('world'); - next(); - }); - var a = new A(); - a.set('hello', 'world'); - assert.equal(a.hello, 'world'); - }, -// "can pass the hook's arguments as an array to posts": function () { -// var A = function () {}; -// _.extend(A, hooks); -// A.hook('set', function (path, val) { -// this[path] = val; -// }); -// A.post('set', function (next, halt, args) { -// assert.equal(args[0], 'hello'); -// assert.equal(args[1], 'world'); -// next(); -// }); -// var a = new A(); -// a.set('hello', 'world'); -// assert.equal(a.hello, 'world'); -// }, - "pres should be able to modify and pass on a modified version of the hook's arguments": function () { - var A = function () {}; - _.extend(A, hooks); - A.hook('set', function (path, val) { - this[path] = val; - assert.equal(arguments[2], 'optional'); - }); - A.pre('set', function (next, path, val) { - next('foo', 'bar'); - }); - A.pre('set', function (next, path, val) { - assert.equal(path, 'foo'); - assert.equal(val, 'bar'); - next('rock', 'says', 'optional'); - }); - A.pre('set', function (next, path, val, opt) { - assert.equal(path, 'rock'); - assert.equal(val, 'says'); - assert.equal(opt, 'optional'); - next(); - }); - var a = new A(); - a.set('hello', 'world'); - assert.equal(typeof a.hello, 'undefined'); - a.rock.should.equal('says'); - }, - 'posts should see the modified version of arguments if the pres modified them': function () { - var A = function () {}; - _.extend(A, hooks); - A.hook('set', function (path, val) { - this[path] = val; - }); - A.pre('set', function (next, path, val) { - next('foo', 'bar'); - }); - A.post('set', function (next, path, val) { - path.should.equal('foo'); - val.should.equal('bar'); - }); - var a = new A(); - a.set('hello', 'world'); - assert.equal(typeof a.hello, 'undefined'); - a.foo.should.equal('bar'); - }, - 'should pad missing arguments (relative to expected arguments of the hook) with null': function () { - // Otherwise, with hookFn = function (a, b, next, ), - // if we use hookFn(a), then because the pre functions are of the form - // preFn = function (a, b, next, ), then it actually gets executed with - // preFn(a, next, ), so when we call next() from within preFn, we are actually - // calling () - - var A = function () {}; - _.extend(A, hooks); - A.hook('set', function (path, val, opts) { - this[path] = val; - }); - A.pre('set', function (next, path, val, opts) { - next('foo', 'bar'); - assert.equal(typeof opts, 'undefined'); - }); - var a = new A(); - a.set('hello', 'world'); - }, - - 'should not invoke the target method until all asynchronous middleware have invoked dones': function () { - var counter = 0; - var A = function () {}; - _.extend(A, hooks); - A.hook('set', function (path, val) { - counter++; - this[path] = val; - counter.should.equal(7); - }); - A.pre('set', function (next, path, val) { - counter++; - next(); - }); - A.pre('set', true, function (next, done, path, val) { - counter++; - setTimeout(function () { - counter++; - done(); - }, 1000); - next(); - }); - A.pre('set', function (next, path, val) { - counter++; - next(); - }); - A.pre('set', true, function (next, done, path, val) { - counter++; - setTimeout(function () { - counter++; - done(); - }, 500); - next(); - }); - var a = new A(); - a.set('hello', 'world'); - }, - - 'invoking a method twice should run its async middleware twice': function () { - var counter = 0; - var A = function () {}; - _.extend(A, hooks); - A.hook('set', function (path, val) { - this[path] = val; - if (path === 'hello') counter.should.equal(1); - if (path === 'foo') counter.should.equal(2); - }); - A.pre('set', true, function (next, done, path, val) { - setTimeout(function () { - counter++; - done(); - }, 1000); - next(); - }); - var a = new A(); - a.set('hello', 'world'); - a.set('foo', 'bar'); - }, - - 'calling the same done multiple times should have the effect of only calling it once': function () { - var A = function () { - this.acked = false; - }; - _.extend(A, hooks); - A.hook('ack', function () { - console.log("UH OH, YOU SHOULD NOT BE SEEING THIS"); - this.acked = true; - }); - A.pre('ack', true, function (next, done) { - next(); - done(); - done(); - }); - A.pre('ack', true, function (next, done) { - next(); - // Notice that done() is not invoked here - }); - var a = new A(); - a.ack(); - setTimeout( function () { - a.acked.should.be.false; - }, 1000); - }, - - 'calling the same next multiple times should have the effect of only calling it once': function (beforeExit) { - var A = function () { - this.acked = false; - }; - _.extend(A, hooks); - A.hook('ack', function () { - console.log("UH OH, YOU SHOULD NOT BE SEEING THIS"); - this.acked = true; - }); - A.pre('ack', function (next) { - // force a throw to re-exec next() - try { - next(new Error('bam')); - } catch (err) { - next(); - } - }); - A.pre('ack', function (next) { - next(); - }); - var a = new A(); - a.ack(); - beforeExit( function () { - a.acked.should.be.false; - }); - }, - - 'asynchronous middleware should be able to pass an error via `done`, stopping the middleware chain': function () { - var counter = 0; - var A = function () {}; - _.extend(A, hooks); - A.hook('set', function (path, val, fn) { - counter++; - this[path] = val; - fn(null); - }); - A.pre('set', true, function (next, done, path, val, fn) { - setTimeout(function () { - counter++; - done(new Error); - }, 1000); - next(); - }); - var a = new A(); - a.set('hello', 'world', function (err) { - err.should.be.an.instanceof(Error); - should.strictEqual(undefined, a['hello']); - counter.should.eql(1); - }); - }, - - 'should be able to remove a particular pre': function () { - var A = function () {} - , preTwo; - _.extend(A, hooks); - A.hook('save', function () { - this.value = 1; - }); - A.pre('save', function (next) { - this.preValueOne = 2; - next(); - }); - A.pre('save', preTwo = function (next) { - this.preValueTwo = 4; - next(); - }); - A.removePre('save', preTwo); - var a = new A(); - a.save(); - a.value.should.equal(1); - a.preValueOne.should.equal(2); - should.strictEqual(undefined, a.preValueTwo); - }, - - 'should be able to remove all pres associated with a hook': function () { - var A = function () {}; - _.extend(A, hooks); - A.hook('save', function () { - this.value = 1; - }); - A.pre('save', function (next) { - this.preValueOne = 2; - next(); - }); - A.pre('save', function (next) { - this.preValueTwo = 4; - next(); - }); - A.removePre('save'); - var a = new A(); - a.save(); - a.value.should.equal(1); - should.strictEqual(undefined, a.preValueOne); - should.strictEqual(undefined, a.preValueTwo); - }, - - '#pre should lazily make a method hookable': function () { - var A = function () {}; - _.extend(A, hooks); - A.prototype.save = function () { - this.value = 1; - }; - A.pre('save', function (next) { - this.preValue = 2; - next(); - }); - var a = new A(); - a.save(); - a.value.should.equal(1); - a.preValue.should.equal(2); - }, - - '#pre lazily making a method hookable should be able to provide a default errorHandler as the last argument': function () { - var A = function () {}; - var preValue = ""; - _.extend(A, hooks); - A.prototype.save = function () { - this.value = 1; - }; - A.pre('save', function (next) { - next(new Error); - }, function (err) { - preValue = 'ERROR'; - }); - var a = new A(); - a.save(); - should.strictEqual(undefined, a.value); - preValue.should.equal('ERROR'); - }, - - '#post should lazily make a method hookable': function () { - var A = function () {}; - _.extend(A, hooks); - A.prototype.save = function () { - this.value = 1; - }; - A.post('save', function (next) { - this.value = 2; - next(); - }); - var a = new A(); - a.save(); - a.value.should.equal(2); - }, - - "a lazy hooks setup should handle errors via a method's last argument, if it's a callback": function () { - var A = function () {}; - _.extend(A, hooks); - A.prototype.save = function (fn) {}; - A.pre('save', function (next) { - next(new Error("hi there")); - }); - var a = new A(); - a.save( function (err) { - err.should.be.an.instanceof(Error); - }); - } -}; diff --git a/node_modules/mongoose/node_modules/mongodb/.travis.yml b/node_modules/mongoose/node_modules/mongodb/.travis.yml deleted file mode 100644 index 94740d0..0000000 --- a/node_modules/mongoose/node_modules/mongodb/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - 0.6 - - 0.8 - - 0.9 # development version of 0.8, may be unstable \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/CONTRIBUTING.md b/node_modules/mongoose/node_modules/mongodb/CONTRIBUTING.md deleted file mode 100644 index 2a1c52e..0000000 --- a/node_modules/mongoose/node_modules/mongodb/CONTRIBUTING.md +++ /dev/null @@ -1,23 +0,0 @@ -## Contributing to the driver - -### Bugfixes - -- Before starting to write code, look for existing [tickets](https://github.com/mongodb/node-mongodb-native/issues) or [create one](https://github.com/mongodb/node-mongodb-native/issues/new) for your specific issue. That way you avoid working on something that might not be of interest or that has been addressed already in a different branch. -- Fork the [repo](https://github.com/mongodb/node-mongodb-native) _or_ for small documentation changes, navigate to the source on github and click the [Edit](https://github.com/blog/844-forking-with-the-edit-button) button. -- Follow the general coding style of the rest of the project: - - 2 space tabs - - no trailing whitespace - - comma last - - inline documentation for new methods, class members, etc - - 0 space between conditionals/functions, and their parenthesis and curly braces - - `if(..) {` - - `for(..) {` - - `while(..) {` - - `function(err) {` -- Write tests and make sure they pass (execute `make test` from the cmd line to run the test suite). - -### Documentation - -To contribute to the [API documentation](http://mongodb.github.com/node-mongodb-native/) just make your changes to the inline documentation of the appropriate [source code](https://github.com/mongodb/node-mongodb-native/tree/master/docs) in the master branch and submit a [pull request](https://help.github.com/articles/using-pull-requests/). You might also use the github [Edit](https://github.com/blog/844-forking-with-the-edit-button) button. - -If you'd like to preview your documentation changes, first commit your changes to your local master branch, then execute `make generate_docs`. Make sure you have the python documentation framework sphinx installed `easy_install sphinx`. The docs are generated under `docs/build'. If all looks good, submit a [pull request](https://help.github.com/articles/using-pull-requests/) to the master branch with your changes. \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/Makefile b/node_modules/mongoose/node_modules/mongodb/Makefile deleted file mode 100644 index ac55626..0000000 --- a/node_modules/mongoose/node_modules/mongodb/Makefile +++ /dev/null @@ -1,64 +0,0 @@ -NODE = node -NPM = npm -NODEUNIT = node_modules/nodeunit/bin/nodeunit -DOX = node_modules/dox/bin/dox -name = all - -total: build_native - -test-coverage: - rm -rf lib-cov/ - jscoverage lib/ lib-cov/ - @TEST_COVERAGE=true nodeunit test/ test/gridstore test/connection - -build_native: - -test: build_native - @echo "\n == Run All tests minus replicaset tests==" - $(NODE) dev/tools/test_all.js --noreplicaset --boot - -test_pure: build_native - @echo "\n == Run All tests minus replicaset tests==" - $(NODE) dev/tools/test_all.js --noreplicaset --boot --nonative - -test_junit: build_native - @echo "\n == Run All tests minus replicaset tests==" - $(NODE) dev/tools/test_all.js --junit --noreplicaset --nokill - -jenkins: build_native - @echo "\n == Run All tests minus replicaset tests==" - $(NODE) dev/tools/test_all.js --junit --noreplicaset --nokill - -test_nodeunit_pure: - @echo "\n == Execute Test Suite using Pure JS BSON Parser == " - @$(NODEUNIT) test/ test/gridstore test/bson - -test_nodeunit_replicaset_pure: - @echo "\n == Execute Test Suite using Pure JS BSON Parser == " - @$(NODEUNIT) test/replicaset - -test_nodeunit_native: - @echo "\n == Execute Test Suite using Native BSON Parser == " - @TEST_NATIVE=TRUE $(NODEUNIT) test/ test/gridstore test/bson - -test_nodeunit_replicaset_native: - @echo "\n == Execute Test Suite using Native BSON Parser == " - @TEST_NATIVE=TRUE $(NODEUNIT) test/replicaset - -test_all: build_native - @echo "\n == Run All tests ==" - $(NODE) dev/tools/test_all.js --boot - -test_all_junit: build_native - @echo "\n == Run All tests ==" - $(NODE) dev/tools/test_all.js --junit --boot - -clean: - rm ./external-libs/bson/bson.node - rm -r ./external-libs/bson/build - -generate_docs: - $(NODE) dev/tools/build-docs.js - make --directory=./docs/sphinx-docs --file=Makefile html - -.PHONY: total diff --git a/node_modules/mongoose/node_modules/mongodb/Readme.md b/node_modules/mongoose/node_modules/mongodb/Readme.md deleted file mode 100644 index b81e719..0000000 --- a/node_modules/mongoose/node_modules/mongodb/Readme.md +++ /dev/null @@ -1,442 +0,0 @@ -Up to date documentation -======================== - -[Documentation](http://mongodb.github.com/node-mongodb-native/) - -Install -======= - -To install the most recent release from npm, run: - - npm install mongodb - -That may give you a warning telling you that bugs['web'] should be bugs['url'], it would be safe to ignore it (this has been fixed in the development version) - -To install the latest from the repository, run:: - - npm install path/to/node-mongodb-native - -Community -========= -Check out the google group [node-mongodb-native](http://groups.google.com/group/node-mongodb-native) for questions/answers from users of the driver. - -Try it live -============ - - -Introduction -============ - -This is a node.js driver for MongoDB. It's a port (or close to a port) of the library for ruby at http://github.com/mongodb/mongo-ruby-driver/. - -A simple example of inserting a document. - -```javascript - var client = new Db('test', new Server("127.0.0.1", 27017, {}), {w: 1}), - test = function (err, collection) { - collection.insert({a:2}, function(err, docs) { - - collection.count(function(err, count) { - test.assertEquals(1, count); - }); - - // Locate all the entries using find - collection.find().toArray(function(err, results) { - test.assertEquals(1, results.length); - test.assertTrue(results[0].a === 2); - - // Let's close the db - client.close(); - }); - }); - }; - - client.open(function(err, p_client) { - client.collection('test_insert', test); - }); -``` - -Data types -========== - -To store and retrieve the non-JSON MongoDb primitives ([ObjectID](http://www.mongodb.org/display/DOCS/Object+IDs), Long, Binary, [Timestamp](http://www.mongodb.org/display/DOCS/Timestamp+data+type), [DBRef](http://www.mongodb.org/display/DOCS/Database+References#DatabaseReferences-DBRef), Code). - -In particular, every document has a unique `_id` which can be almost any type, and by default a 12-byte ObjectID is created. ObjectIDs can be represented as 24-digit hexadecimal strings, but you must convert the string back into an ObjectID before you can use it in the database. For example: - -```javascript - // Get the objectID type - var ObjectID = require('mongodb').ObjectID; - - var idString = '4e4e1638c85e808431000003'; - collection.findOne({_id: new ObjectID(idString)}, console.log) // ok - collection.findOne({_id: idString}, console.log) // wrong! callback gets undefined -``` - -Here are the constructors the non-Javascript BSON primitive types: - -```javascript - // Fetch the library - var mongo = require('mongodb'); - // Create new instances of BSON types - new mongo.Long(numberString) - new mongo.ObjectID(hexString) - new mongo.Timestamp() // the actual unique number is generated on insert. - new mongo.DBRef(collectionName, id, dbName) - new mongo.Binary(buffer) // takes a string or Buffer - new mongo.Code(code, [context]) - new mongo.Symbol(string) - new mongo.MinKey() - new mongo.MaxKey() - new mongo.Double(number) // Force double storage -``` - -The C/C++ bson parser/serializer --------------------------------- - -If you are running a version of this library has the C/C++ parser compiled, to enable the driver to use the C/C++ bson parser pass it the option native_parser:true like below - -```javascript - // using native_parser: - var client = new Db('integration_tests_20', - new Server("127.0.0.1", 27017), - {native_parser:true}); -``` - -The C++ parser uses the js objects both for serialization and deserialization. - -GitHub information -================== - -The source code is available at http://github.com/mongodb/node-mongodb-native. -You can either clone the repository or download a tarball of the latest release. - -Once you have the source you can test the driver by running - - $ make test - -in the main directory. You will need to have a mongo instance running on localhost for the integration tests to pass. - -Examples -======== - -For examples look in the examples/ directory. You can execute the examples using node. - - $ cd examples - $ node queries.js - -GridStore -========= - -The GridStore class allows for storage of binary files in mongoDB using the mongoDB defined files and chunks collection definition. - -For more information have a look at [Gridstore](https://github.com/mongodb/node-mongodb-native/blob/master/docs/gridfs.md) - -Replicasets -=========== -For more information about how to connect to a replicaset have a look at [Replicasets](https://github.com/mongodb/node-mongodb-native/blob/master/docs/replicaset.md) - -Primary Key Factories ---------------------- - -Defining your own primary key factory allows you to generate your own series of id's -(this could f.ex be to use something like ISBN numbers). The generated the id needs to be a 12 byte long "string". - -Simple example below - -```javascript - // Custom factory (need to provide a 12 byte array); - CustomPKFactory = function() {} - CustomPKFactory.prototype = new Object(); - CustomPKFactory.createPk = function() { - return new ObjectID("aaaaaaaaaaaa"); - } - - var p_client = new Db('integration_tests_20', new Server("127.0.0.1", 27017, {}), {'pk':CustomPKFactory}); - p_client.open(function(err, p_client) { - p_client.dropDatabase(function(err, done) { - p_client.createCollection('test_custom_key', function(err, collection) { - collection.insert({'a':1}, function(err, docs) { - collection.find({'_id':new ObjectID("aaaaaaaaaaaa")}, function(err, cursor) { - cursor.toArray(function(err, items) { - test.assertEquals(1, items.length); - - // Let's close the db - p_client.close(); - }); - }); - }); - }); - }); - }); -``` - -Strict mode ------------ - -Each database has an optional strict mode. If it is set then asking for a collection -that does not exist will return an Error object in the callback. Similarly if you -attempt to create a collection that already exists. Strict is provided for convenience. - -```javascript - var error_client = new Db('integration_tests_', new Server("127.0.0.1", 27017, {auto_reconnect: false}), {strict:true}); - test.assertEquals(true, error_client.strict); - - error_client.open(function(err, error_client) { - error_client.collection('does-not-exist', function(err, collection) { - test.assertTrue(err instanceof Error); - test.assertEquals("Collection does-not-exist does not exist. Currently in strict mode.", err.message); - }); - - error_client.createCollection('test_strict_access_collection', function(err, collection) { - error_client.collection('test_strict_access_collection', function(err, collection) { - test.assertTrue(collection instanceof Collection); - // Let's close the db - error_client.close(); - }); - }); - }); -``` - -Documentation -============= - -If this document doesn't answer your questions, see the source of -[Collection](https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/collection.js) -or [Cursor](https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/cursor.js), -or the documentation at MongoDB for query and update formats. - -Find ----- - -The find method is actually a factory method to create -Cursor objects. A Cursor lazily uses the connection the first time -you call `nextObject`, `each`, or `toArray`. - -The basic operation on a cursor is the `nextObject` method -that fetches the next matching document from the database. The convenience -methods `each` and `toArray` call `nextObject` until the cursor is exhausted. - -Signatures: - -```javascript - var cursor = collection.find(query, [fields], options); - cursor.sort(fields).limit(n).skip(m). - - cursor.nextObject(function(err, doc) {}); - cursor.each(function(err, doc) {}); - cursor.toArray(function(err, docs) {}); - - cursor.rewind() // reset the cursor to its initial state. -``` - -Useful chainable methods of cursor. These can optionally be options of `find` instead of method calls: - -* `.limit(n).skip(m)` to control paging. -* `.sort(fields)` Order by the given fields. There are several equivalent syntaxes: - * `.sort({field1: -1, field2: 1})` descending by field1, then ascending by field2. - * `.sort([['field1', 'desc'], ['field2', 'asc']])` same as above - * `.sort([['field1', 'desc'], 'field2'])` same as above - * `.sort('field1')` ascending by field1 - -Other options of `find`: - -* `fields` the fields to fetch (to avoid transferring the entire document) -* `tailable` if true, makes the cursor [tailable](http://www.mongodb.org/display/DOCS/Tailable+Cursors). -* `batchSize` The number of the subset of results to request the database -to return for every request. This should initially be greater than 1 otherwise -the database will automatically close the cursor. The batch size can be set to 1 -with `batchSize(n, function(err){})` after performing the initial query to the database. -* `hint` See [Optimization: hint](http://www.mongodb.org/display/DOCS/Optimization#Optimization-Hint). -* `explain` turns this into an explain query. You can also call -`explain()` on any cursor to fetch the explanation. -* `snapshot` prevents documents that are updated while the query is active -from being returned multiple times. See more -[details about query snapshots](http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database). -* `timeout` if false, asks MongoDb not to time out this cursor after an -inactivity period. - - -For information on how to create queries, see the -[MongoDB section on querying](http://www.mongodb.org/display/DOCS/Querying). - -```javascript - var mongodb = require('mongodb'); - var server = new mongodb.Server("127.0.0.1", 27017, {}); - new mongodb.Db('test', server, {}).open(function (error, client) { - if (error) throw error; - var collection = new mongodb.Collection(client, 'test_collection'); - collection.find({}, {limit:10}).toArray(function(err, docs) { - console.dir(docs); - }); - }); -``` - -Insert ------- - -Signature: - -```javascript - collection.insert(docs, options, [callback]); -``` - -where `docs` can be a single document or an array of documents. - -Useful options: - -* `safe:true` Should always set if you have a callback. - -See also: [MongoDB docs for insert](http://www.mongodb.org/display/DOCS/Inserting). - -```javascript - var mongodb = require('mongodb'); - var server = new mongodb.Server("127.0.0.1", 27017, {}); - new mongodb.Db('test', server, {w: 1}).open(function (error, client) { - if (error) throw error; - var collection = new mongodb.Collection(client, 'test_collection'); - collection.insert({hello: 'world'}, {safe:true}, - function(err, objects) { - if (err) console.warn(err.message); - if (err && err.message.indexOf('E11000 ') !== -1) { - // this _id was already inserted in the database - } - }); - }); -``` - -Note that there's no reason to pass a callback to the insert or update commands -unless you use the `safe:true` option. If you don't specify `safe:true`, then -your callback will be called immediately. - -Update; update and insert (upsert) ----------------------------------- - -The update operation will update the first document that matches your query -(or all documents that match if you use `multi:true`). -If `safe:true`, `upsert` is not set, and no documents match, your callback will return 0 documents updated. - -See the [MongoDB docs](http://www.mongodb.org/display/DOCS/Updating) for -the modifier (`$inc`, `$set`, `$push`, etc.) formats. - -Signature: - -```javascript - collection.update(criteria, objNew, options, [callback]); -``` - -Useful options: - -* `safe:true` Should always set if you have a callback. -* `multi:true` If set, all matching documents are updated, not just the first. -* `upsert:true` Atomically inserts the document if no documents matched. - -Example for `update`: - -```javascript - var mongodb = require('mongodb'); - var server = new mongodb.Server("127.0.0.1", 27017, {}); - new mongodb.Db('test', server, {w: 1}).open(function (error, client) { - if (error) throw error; - var collection = new mongodb.Collection(client, 'test_collection'); - collection.update({hi: 'here'}, {$set: {hi: 'there'}}, {safe:true}, - function(err) { - if (err) console.warn(err.message); - else console.log('successfully updated'); - }); - }); -``` - -Find and modify ---------------- - -`findAndModify` is like `update`, but it also gives the updated document to -your callback. But there are a few key differences between findAndModify and -update: - - 1. The signatures differ. - 2. You can only findAndModify a single item, not multiple items. - -Signature: - -```javascript - collection.findAndModify(query, sort, update, options, callback) -``` - -The sort parameter is used to specify which object to operate on, if more than -one document matches. It takes the same format as the cursor sort (see -Connection.find above). - -See the -[MongoDB docs for findAndModify](http://www.mongodb.org/display/DOCS/findAndModify+Command) -for more details. - -Useful options: - -* `remove:true` set to a true to remove the object before returning -* `new:true` set to true if you want to return the modified object rather than the original. Ignored for remove. -* `upsert:true` Atomically inserts the document if no documents matched. - -Example for `findAndModify`: - -```javascript - var mongodb = require('mongodb'); - var server = new mongodb.Server("127.0.0.1", 27017, {}); - new mongodb.Db('test', server, {w: 1}).open(function (error, client) { - if (error) throw error; - var collection = new mongodb.Collection(client, 'test_collection'); - collection.findAndModify({hello: 'world'}, [['_id','asc']], {$set: {hi: 'there'}}, {}, - function(err, object) { - if (err) console.warn(err.message); - else console.dir(object); // undefined if no matching object exists. - }); - }); -``` - -Save ----- - -The `save` method is a shorthand for upsert if the document contains an -`_id`, or an insert if there is no `_id`. - -Sponsors -======== -Just as Felix Geisendörfer I'm also working on the driver for my own startup and this driver is a big project that also benefits other companies who are using MongoDB. - -If your company could benefit from a even better-engineered node.js mongodb driver I would appreciate any type of sponsorship you may be able to provide. All the sponsors will get a lifetime display in this readme, priority support and help on problems and votes on the roadmap decisions for the driver. If you are interested contact me on [christkv AT g m a i l.com](mailto:christkv@gmail.com) for details. - -And I'm very thankful for code contributions. If you are interested in working on features please contact me so we can discuss API design and testing. - -Release Notes -============= - -See HISTORY - -Credits -======= - -1. [10gen](http://github.com/mongodb/mongo-ruby-driver/) -2. [Google Closure Library](http://code.google.com/closure/library/) -3. [Jonas Raoni Soares Silva](http://jsfromhell.com/classes/binary-parser) - -Contributors -============ - -Aaron Heckmann, Christoph Pojer, Pau Ramon Revilla, Nathan White, Emmerman, Seth LaForge, Boris Filipov, Stefan Schärmeli, Tedde Lundgren, renctan, Sergey Ukustov, Ciaran Jessup, kuno, srimonti, Erik Abele, Pratik Daga, Slobodan Utvic, Kristina Chodorow, Yonathan Randolph, Brian Noguchi, Sam Epstein, James Harrison Fisher, Vladimir Dronnikov, Ben Hockey, Henrik Johansson, Simon Weare, Alex Gorbatchev, Shimon Doodkin, Kyle Mueller, Eran Hammer-Lahav, Marcin Ciszak, François de Metz, Vinay Pulim, nstielau, Adam Wiggins, entrinzikyl, Jeremy Selier, Ian Millington, Public Keating, andrewjstone, Christopher Stott, Corey Jewett, brettkiefer, Rob Holland, Senmiao Liu, heroic, gitfy - -License -======= - - Copyright 2009 - 2012 Christian Amor Kvalheim. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - diff --git a/node_modules/mongoose/node_modules/mongodb/index.js b/node_modules/mongoose/node_modules/mongodb/index.js deleted file mode 100755 index 4f59e9d..0000000 --- a/node_modules/mongoose/node_modules/mongodb/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lib/mongodb'); diff --git a/node_modules/mongoose/node_modules/mongodb/install.js b/node_modules/mongoose/node_modules/mongodb/install.js deleted file mode 100644 index f9f2a57..0000000 --- a/node_modules/mongoose/node_modules/mongodb/install.js +++ /dev/null @@ -1,40 +0,0 @@ -var spawn = require('child_process').spawn, - exec = require('child_process').exec; - -process.stdout.write("================================================================================\n"); -process.stdout.write("= =\n"); -process.stdout.write("= To install with C++ bson parser do =\n"); -process.stdout.write("= =\n"); -process.stdout.write("================================================================================\n"); - -// Check if we want to build the native code -var build_native = process.env['npm_package_config_native'] != null ? process.env['npm_package_config_native'] : 'false'; -build_native = build_native == 'true' ? true : false; -// If we are building the native bson extension ensure we use gmake if available -if(build_native) { - // Check if we need to use gmake - exec('which gmake', function(err, stdout, stderr) { - // Set up spawn command - var make = null; - // No gmake build using make - if(err != null) { - make = spawn('make', ['total']); - } else { - make = spawn('gmake', ['total']); - } - - // Execute spawn - make.stdout.on('data', function(data) { - process.stdout.write(data); - }) - - make.stderr.on('data', function(data) { - process.stdout.write(data); - }) - - make.on('exit', function(code) { - process.stdout.write('child process exited with code ' + code + "\n"); - }) - }); -} - diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/admin.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/admin.js deleted file mode 100644 index 6e9cd30..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/admin.js +++ /dev/null @@ -1,339 +0,0 @@ -/*! - * Module dependencies. - */ -var Collection = require('./collection').Collection, - Cursor = require('./cursor').Cursor, - DbCommand = require('./commands/db_command').DbCommand, - utils = require('./utils'); - -/** - * Allows the user to access the admin functionality of MongoDB - * - * @class Represents the Admin methods of MongoDB. - * @param {Object} db Current db instance we wish to perform Admin operations on. - * @return {Function} Constructor for Admin type. - */ -function Admin(db) { - if(!(this instanceof Admin)) return new Admin(db); - this.db = db; -}; - -/** - * Retrieve the server information for the current - * instance of the db client - * - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from buildInfo or null if an error occured. - * @return {null} Returns no result - * @api public - */ -Admin.prototype.buildInfo = function(callback) { - this.serverInfo(callback); -} - -/** - * Retrieve the server information for the current - * instance of the db client - * - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from serverInfo or null if an error occured. - * @return {null} Returns no result - * @api private - */ -Admin.prototype.serverInfo = function(callback) { - this.db.executeDbAdminCommand({buildinfo:1}, function(err, doc) { - if(err != null) return callback(err, null); - return callback(null, doc.documents[0]); - }); -} - -/** - * Retrieve this db's server status. - * - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from serverStatus or null if an error occured. - * @return {null} - * @api public - */ -Admin.prototype.serverStatus = function(callback) { - var self = this; - - this.db.executeDbAdminCommand({serverStatus: 1}, function(err, doc) { - if(err == null && doc.documents[0].ok === 1) { - callback(null, doc.documents[0]); - } else { - if(err) return callback(err, false); - return callback(utils.toError(doc.documents[0]), false); - } - }); -}; - -/** - * Retrieve the current profiling Level for MongoDB - * - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from profilingLevel or null if an error occured. - * @return {null} Returns no result - * @api public - */ -Admin.prototype.profilingLevel = function(callback) { - var self = this; - - this.db.executeDbAdminCommand({profile:-1}, function(err, doc) { - doc = doc.documents[0]; - - if(err == null && doc.ok === 1) { - var was = doc.was; - if(was == 0) return callback(null, "off"); - if(was == 1) return callback(null, "slow_only"); - if(was == 2) return callback(null, "all"); - return callback(new Error("Error: illegal profiling level value " + was), null); - } else { - err != null ? callback(err, null) : callback(new Error("Error with profile command"), null); - } - }); -}; - -/** - * Ping the MongoDB server and retrieve results - * - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from ping or null if an error occured. - * @return {null} Returns no result - * @api public - */ -Admin.prototype.ping = function(options, callback) { - // Unpack calls - var args = Array.prototype.slice.call(arguments, 0); - callback = args.pop(); - - this.db.executeDbAdminCommand({ping: 1}, callback); -} - -/** - * Authenticate against MongoDB - * - * @param {String} username The user name for the authentication. - * @param {String} password The password for the authentication. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from authenticate or null if an error occured. - * @return {null} Returns no result - * @api public - */ -Admin.prototype.authenticate = function(username, password, callback) { - this.db.authenticate(username, password, {authdb: 'admin'}, function(err, doc) { - return callback(err, doc); - }) -} - -/** - * Logout current authenticated user - * - * @param {Object} [options] Optional parameters to the command. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from logout or null if an error occured. - * @return {null} Returns no result - * @api public - */ -Admin.prototype.logout = function(callback) { - this.db.logout({authdb: 'admin'}, function(err, doc) { - return callback(err, doc); - }) -} - -/** - * Add a user to the MongoDB server, if the user exists it will - * overwrite the current password - * - * Options - * - **safe** {true | {w:n, wtimeout:n} | {fsync:true}, default:false}, executes with a getLastError command returning the results of the command on MongoDB. - * - * @param {String} username The user name for the authentication. - * @param {String} password The password for the authentication. - * @param {Object} [options] additional options during update. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from addUser or null if an error occured. - * @return {null} Returns no result - * @api public - */ -Admin.prototype.addUser = function(username, password, options, callback) { - var args = Array.prototype.slice.call(arguments, 2); - callback = args.pop(); - options = args.length ? args.shift() : {}; - - options.dbName = 'admin'; - // Add user - this.db.addUser(username, password, options, function(err, doc) { - return callback(err, doc); - }) -} - -/** - * Remove a user from the MongoDB server - * - * Options - * - **safe** {true | {w:n, wtimeout:n} | {fsync:true}, default:false}, executes with a getLastError command returning the results of the command on MongoDB. - * - * @param {String} username The user name for the authentication. - * @param {Object} [options] additional options during update. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from removeUser or null if an error occured. - * @return {null} Returns no result - * @api public - */ -Admin.prototype.removeUser = function(username, options, callback) { - var self = this; - var args = Array.prototype.slice.call(arguments, 1); - callback = args.pop(); - options = args.length ? args.shift() : {}; - options.dbName = 'admin'; - - this.db.removeUser(username, options, function(err, doc) { - return callback(err, doc); - }) -} - -/** - * Set the current profiling level of MongoDB - * - * @param {String} level The new profiling level (off, slow_only, all) - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from setProfilingLevel or null if an error occured. - * @return {null} Returns no result - * @api public - */ -Admin.prototype.setProfilingLevel = function(level, callback) { - var self = this; - var command = {}; - var profile = 0; - - if(level == "off") { - profile = 0; - } else if(level == "slow_only") { - profile = 1; - } else if(level == "all") { - profile = 2; - } else { - return callback(new Error("Error: illegal profiling level value " + level)); - } - - // Set up the profile number - command['profile'] = profile; - - this.db.executeDbAdminCommand(command, function(err, doc) { - doc = doc.documents[0]; - - if(err == null && doc.ok === 1) - return callback(null, level); - return err != null ? callback(err, null) : callback(new Error("Error with profile command"), null); - }); -}; - -/** - * Retrive the current profiling information for MongoDB - * - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from profilingInfo or null if an error occured. - * @return {null} Returns no result - * @api public - */ -Admin.prototype.profilingInfo = function(callback) { - try { - new Cursor(this.db, new Collection(this.db, DbCommand.SYSTEM_PROFILE_COLLECTION), {}, {}, {dbName: 'admin'}).toArray(function(err, items) { - return callback(err, items); - }); - } catch (err) { - return callback(err, null); - } -}; - -/** - * Execute a db command against the Admin database - * - * @param {Object} command A command object `{ping:1}`. - * @param {Object} [options] Optional parameters to the command. - * @param {Function} callback this will be called after executing this method. The command always return the whole result of the command as the second parameter. - * @return {null} Returns no result - * @api public - */ -Admin.prototype.command = function(command, options, callback) { - var self = this; - var args = Array.prototype.slice.call(arguments, 1); - callback = args.pop(); - options = args.length ? args.shift() : {}; - - // Execute a command - this.db.executeDbAdminCommand(command, options, function(err, doc) { - // Ensure change before event loop executes - return callback != null ? callback(err, doc) : null; - }); -} - -/** - * Validate an existing collection - * - * @param {String} collectionName The name of the collection to validate. - * @param {Object} [options] Optional parameters to the command. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from validateCollection or null if an error occured. - * @return {null} Returns no result - * @api public - */ -Admin.prototype.validateCollection = function(collectionName, options, callback) { - var args = Array.prototype.slice.call(arguments, 1); - callback = args.pop(); - options = args.length ? args.shift() : {}; - - var self = this; - var command = {validate: collectionName}; - var keys = Object.keys(options); - - // Decorate command with extra options - for(var i = 0; i < keys.length; i++) { - if(options.hasOwnProperty(keys[i])) { - command[keys[i]] = options[keys[i]]; - } - } - - this.db.executeDbCommand(command, function(err, doc) { - if(err != null) return callback(err, null); - doc = doc.documents[0]; - - if(doc.ok === 0) - return callback(new Error("Error with validate command"), null); - if(doc.result != null && doc.result.constructor != String) - return callback(new Error("Error with validation data"), null); - if(doc.result != null && doc.result.match(/exception|corrupt/) != null) - return callback(new Error("Error: invalid collection " + collectionName), null); - if(doc.valid != null && !doc.valid) - return callback(new Error("Error: invalid collection " + collectionName), null); - - return callback(null, doc); - }); -}; - -/** - * List the available databases - * - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from listDatabases or null if an error occured. - * @return {null} Returns no result - * @api public - */ -Admin.prototype.listDatabases = function(callback) { - // Execute the listAllDatabases command - this.db.executeDbAdminCommand({listDatabases:1}, {}, function(err, doc) { - if(err != null) return callback(err, null); - return callback(null, doc.documents[0]); - }); -} - -/** - * Get ReplicaSet status - * - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from replSetGetStatus or null if an error occured. - * @return {null} - * @api public - */ -Admin.prototype.replSetGetStatus = function(callback) { - var self = this; - - this.db.executeDbAdminCommand({replSetGetStatus:1}, function(err, doc) { - if(err == null && doc.documents[0].ok === 1) - return callback(null, doc.documents[0]); - if(err) return callback(err, false); - return callback(utils.toError(doc.documents[0]), false); - }); -}; - -/** - * @ignore - */ -exports.Admin = Admin; diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/collection.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/collection.js deleted file mode 100644 index 9c80d80..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/collection.js +++ /dev/null @@ -1,1762 +0,0 @@ -/** - * Module dependencies. - * @ignore - */ -var InsertCommand = require('./commands/insert_command').InsertCommand - , QueryCommand = require('./commands/query_command').QueryCommand - , DeleteCommand = require('./commands/delete_command').DeleteCommand - , UpdateCommand = require('./commands/update_command').UpdateCommand - , DbCommand = require('./commands/db_command').DbCommand - , ObjectID = require('bson').ObjectID - , Code = require('bson').Code - , Cursor = require('./cursor').Cursor - , utils = require('./utils'); - -/** - * Precompiled regexes - * @ignore -**/ -const eErrorMessages = /No matching object found/; - -/** - * toString helper. - * @ignore - */ -var toString = Object.prototype.toString; - -/** - * Create a new Collection instance (INTERNAL TYPE) - * - * Options - * - **readPreference** {String}, the prefered read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). - * - **slaveOk** {Boolean, default:false}, Allow reads from secondaries. - * - **serializeFunctions** {Boolean, default:false}, serialize functions on the document. - * - **raw** {Boolean, default:false}, perform all operations using raw bson objects. - * - **pkFactory** {Object}, object overriding the basic ObjectID primary key generation. - * - * @class Represents a Collection - * @param {Object} db db instance. - * @param {String} collectionName collection name. - * @param {Object} [pkFactory] alternative primary key factory. - * @param {Object} [options] additional options for the collection. - * @return {Object} a collection instance. - */ -function Collection (db, collectionName, pkFactory, options) { - if(!(this instanceof Collection)) return new Collection(db, collectionName, pkFactory, options); - - checkCollectionName(collectionName); - - this.db = db; - this.collectionName = collectionName; - this.internalHint = null; - this.opts = options != null && ('object' === typeof options) ? options : {}; - this.slaveOk = options == null || options.slaveOk == null ? db.slaveOk : options.slaveOk; - this.serializeFunctions = options == null || options.serializeFunctions == null ? db.serializeFunctions : options.serializeFunctions; - this.raw = options == null || options.raw == null ? db.raw : options.raw; - - this.readPreference = options == null || options.readPreference == null ? db.serverConfig.readPreference : options.readPreference; - this.readPreference = this.readPreference == null ? 'primary' : this.readPreference; - - this.pkFactory = pkFactory == null - ? ObjectID - : pkFactory; - - var self = this; -} - -/** - * Inserts a single document or a an array of documents into MongoDB. - * - * Options -* - **w**, {Number/String, > -1 || 'majority' || tag name} the write concern for the operation where < 1 is no acknowlegement of write and w >= 1, w = 'majority' or tag acknowledges the write - * - **wtimeout**, {Number, 0} set the timeout for waiting for write concern to finish (combines with w option) - * - **fsync**, (Boolean, default:false) write waits for fsync before returning - * - **journal**, (Boolean, default:false) write waits for journal sync before returning - * - **continueOnError/keepGoing** {Boolean, default:false}, keep inserting documents even if one document has an error, *mongodb 1.9.1 >*. - * - **serializeFunctions** {Boolean, default:false}, serialize functions on the document. - * - * Deprecated Options - * - **safe** {true | {w:n, wtimeout:n} | {fsync:true}, default:false}, executes with a getLastError command returning the results of the command on MongoDB. - * - * @param {Array|Object} docs - * @param {Object} [options] optional options for insert command - * @param {Function} [callback] optional callback for the function, must be provided when using a writeconcern - * @return {null} - * @api public - */ -Collection.prototype.insert = function insert (docs, options, callback) { - if ('function' === typeof options) callback = options, options = {}; - if(options == null) options = {}; - if(!('function' === typeof callback)) callback = null; - var self = this; - insertAll(self, Array.isArray(docs) ? docs : [docs], options, callback); - return this; -}; - -/** - * @ignore - */ -var checkCollectionName = function checkCollectionName (collectionName) { - if ('string' !== typeof collectionName) { - throw Error("collection name must be a String"); - } - - if (!collectionName || collectionName.indexOf('..') != -1) { - throw Error("collection names cannot be empty"); - } - - if (collectionName.indexOf('$') != -1 && - collectionName.match(/((^\$cmd)|(oplog\.\$main))/) == null) { - throw Error("collection names must not contain '$'"); - } - - if (collectionName.match(/^\.|\.$/) != null) { - throw Error("collection names must not start or end with '.'"); - } -}; - -/** - * Removes documents specified by `selector` from the db. - * - * Options -* - **w**, {Number/String, > -1 || 'majority' || tag name} the write concern for the operation where < 1 is no acknowlegement of write and w >= 1, w = 'majority' or tag acknowledges the write - * - **wtimeout**, {Number, 0} set the timeout for waiting for write concern to finish (combines with w option) - * - **fsync**, (Boolean, default:false) write waits for fsync before returning - * - **journal**, (Boolean, default:false) write waits for journal sync before returning - * - **single** {Boolean, default:false}, removes the first document found. - * - * Deprecated Options - * - **safe** {true | {w:n, wtimeout:n} | {fsync:true}, default:false}, executes with a getLastError command returning the results of the command on MongoDB. - * - * @param {Object} [selector] optional select, no selector is equivalent to removing all documents. - * @param {Object} [options] additional options during remove. - * @param {Function} [callback] must be provided if you performing a remove with a writeconcern - * @return {null} - * @api public - */ -Collection.prototype.remove = function remove(selector, options, callback) { - if ('function' === typeof selector) { - callback = selector; - selector = options = {}; - } else if ('function' === typeof options) { - callback = options; - options = {}; - } - - // Ensure options - if(options == null) options = {}; - if(!('function' === typeof callback)) callback = null; - // Ensure we have at least an empty selector - selector = selector == null ? {} : selector; - // Set up flags for the command, if we have a single document remove - var flags = 0 | (options.single ? 1 : 0); - - // DbName - var dbName = options['dbName']; - // If no dbname defined use the db one - if(dbName == null) { - dbName = this.db.databaseName; - } - - // Create a delete command - var deleteCommand = new DeleteCommand( - this.db - , dbName + "." + this.collectionName - , selector - , flags); - - var self = this; - var errorOptions = _getWriteConcern(self, options, callback); - // Execute the command, do not add a callback as it's async - if(_hasWriteConcern(errorOptions) && typeof callback == 'function') { - // Insert options - var commandOptions = {read:false}; - // If we have safe set set async to false - if(errorOptions == null) commandOptions['async'] = true; - // Set safe option - commandOptions['safe'] = true; - // If we have an error option - if(typeof errorOptions == 'object') { - var keys = Object.keys(errorOptions); - for(var i = 0; i < keys.length; i++) { - commandOptions[keys[i]] = errorOptions[keys[i]]; - } - } - - // Execute command with safe options (rolls up both command and safe command into one and executes them on the same connection) - this.db._executeRemoveCommand(deleteCommand, commandOptions, function (err, error) { - error = error && error.documents; - if(!callback) return; - - if(err) { - callback(err); - } else if(error[0].err || error[0].errmsg) { - callback(utils.toError(error[0])); - } else { - callback(null, error[0].n); - } - }); - } else if(_hasWriteConcern(errorOptions) && callback == null) { - throw new Error("Cannot use a writeConcern without a provided callback"); - } else { - var result = this.db._executeRemoveCommand(deleteCommand); - // If no callback just return - if (!callback) return; - // If error return error - if (result instanceof Error) { - return callback(result); - } - // Otherwise just return - return callback(); - } -}; - -/** - * Renames the collection. - * - * Options - * - **dropTarget** {Boolean, default:false}, drop the target name collection if it previously exists. - * - * @param {String} newName the new name of the collection. - * @param {Object} [options] returns option results. - * @param {Function} callback the callback accepting the result - * @return {null} - * @api public - */ -Collection.prototype.rename = function rename (newName, options, callback) { - var self = this; - - if(typeof options == 'function') { - callback = options; - options = {} - } - - // Ensure the new name is valid - checkCollectionName(newName); - // Execute the command, return the new renamed collection if successful - self.db._executeQueryCommand(DbCommand.createRenameCollectionCommand(self.db, self.collectionName, newName, options), function(err, result) { - if(err == null && result.documents[0].ok == 1) { - if(callback != null) { - // Set current object to point to the new name - self.collectionName = newName; - // Return the current collection - callback(null, self); - } - } else if(result.documents[0].errmsg != null) { - if(null != callback) { - if (null == err) { - err = utils.toError(result.documents[0]); - } - callback(err, null); - } - } - }); -}; - -/** - * @ignore - */ -var insertAll = function insertAll (self, docs, options, callback) { - if('function' === typeof options) callback = options, options = {}; - if(options == null) options = {}; - if(!('function' === typeof callback)) callback = null; - - // Insert options (flags for insert) - var insertFlags = {}; - // If we have a mongodb version >= 1.9.1 support keepGoing attribute - if(options['keepGoing'] != null) { - insertFlags['keepGoing'] = options['keepGoing']; - } - - // If we have a mongodb version >= 1.9.1 support keepGoing attribute - if(options['continueOnError'] != null) { - insertFlags['continueOnError'] = options['continueOnError']; - } - - // DbName - var dbName = options['dbName']; - // If no dbname defined use the db one - if(dbName == null) { - dbName = self.db.databaseName; - } - - // Either use override on the function, or go back to default on either the collection - // level or db - if(options['serializeFunctions'] != null) { - insertFlags['serializeFunctions'] = options['serializeFunctions']; - } else { - insertFlags['serializeFunctions'] = self.serializeFunctions; - } - - // Pass in options - var insertCommand = new InsertCommand( - self.db - , dbName + "." + self.collectionName, true, insertFlags); - - // Add the documents and decorate them with id's if they have none - for(var index = 0, len = docs.length; index < len; ++index) { - var doc = docs[index]; - - // Add id to each document if it's not already defined - if (!(Buffer.isBuffer(doc)) && doc['_id'] == null && self.db.forceServerObjectId != true) { - doc['_id'] = self.pkFactory.createPk(); - } - - insertCommand.add(doc); - } - - // Collect errorOptions - var errorOptions = _getWriteConcern(self, options, callback); - // Default command options - var commandOptions = {}; - // If safe is defined check for error message - if(_hasWriteConcern(errorOptions) && typeof callback == 'function') { - // Insert options - commandOptions['read'] = false; - // If we have safe set set async to false - if(errorOptions == null) commandOptions['async'] = true; - - // Set safe option - commandOptions['safe'] = errorOptions; - // If we have an error option - if(typeof errorOptions == 'object') { - var keys = Object.keys(errorOptions); - for(var i = 0; i < keys.length; i++) { - commandOptions[keys[i]] = errorOptions[keys[i]]; - } - } - - // Execute command with safe options (rolls up both command and safe command into one and executes them on the same connection) - self.db._executeInsertCommand(insertCommand, commandOptions, function (err, error) { - error = error && error.documents; - if(!callback) return; - - if (err) { - callback(err); - } else if(error[0].err || error[0].errmsg) { - callback(utils.toError(error[0])); - } else { - callback(null, docs); - } - }); - } else if(_hasWriteConcern(errorOptions) && callback == null) { - throw new Error("Cannot use a writeConcern without a provided callback"); - } else { - // Execute the call without a write concern - var result = self.db._executeInsertCommand(insertCommand, commandOptions); - // If no callback just return - if(!callback) return; - // If error return error - if(result instanceof Error) { - return callback(result); - } - // Otherwise just return - return callback(null, docs); - } -}; - -/** - * Save a document. Simple full document replacement function. Not recommended for efficiency, use atomic - * operators and update instead for more efficient operations. - * - * Options -* - **w**, {Number/String, > -1 || 'majority' || tag name} the write concern for the operation where < 1 is no acknowlegement of write and w >= 1, w = 'majority' or tag acknowledges the write - * - **wtimeout**, {Number, 0} set the timeout for waiting for write concern to finish (combines with w option) - * - **fsync**, (Boolean, default:false) write waits for fsync before returning - * - **journal**, (Boolean, default:false) write waits for journal sync before returning - * - * Deprecated Options - * - **safe** {true | {w:n, wtimeout:n} | {fsync:true}, default:false}, executes with a getLastError command returning the results of the command on MongoDB. - * - * @param {Object} [doc] the document to save - * @param {Object} [options] additional options during remove. - * @param {Function} [callback] must be provided if you performing a safe save - * @return {null} - * @api public - */ -Collection.prototype.save = function save(doc, options, callback) { - if('function' === typeof options) callback = options, options = null; - if(options == null) options = {}; - if(!('function' === typeof callback)) callback = null; - // Extract the id, if we have one we need to do a update command - var id = doc['_id']; - var commandOptions = _getWriteConcern(this, options, callback); - - if(id) { - commandOptions.upsert = true; - this.update({ _id: id }, doc, commandOptions, callback); - } else { - this.insert(doc, commandOptions, callback && function (err, docs) { - if (err) return callback(err, null); - - if (Array.isArray(docs)) { - callback(err, docs[0]); - } else { - callback(err, docs); - } - }); - } -}; - -/** - * Updates documents. - * - * Options -* - **w**, {Number/String, > -1 || 'majority' || tag name} the write concern for the operation where < 1 is no acknowlegement of write and w >= 1, w = 'majority' or tag acknowledges the write - * - **wtimeout**, {Number, 0} set the timeout for waiting for write concern to finish (combines with w option) - * - **fsync**, (Boolean, default:false) write waits for fsync before returning - * - **journal**, (Boolean, default:false) write waits for journal sync before returning - * - **upsert** {Boolean, default:false}, perform an upsert operation. - * - **multi** {Boolean, default:false}, update all documents matching the selector. - * - **serializeFunctions** {Boolean, default:false}, serialize functions on the document. - * - * Deprecated Options - * - **safe** {true | {w:n, wtimeout:n} | {fsync:true}, default:false}, executes with a getLastError command returning the results of the command on MongoDB. - * - * @param {Object} selector the query to select the document/documents to be updated - * @param {Object} document the fields/vals to be updated, or in the case of an upsert operation, inserted. - * @param {Object} [options] additional options during update. - * @param {Function} [callback] must be provided if you performing an update with a writeconcern - * @return {null} - * @api public - */ -Collection.prototype.update = function update(selector, document, options, callback) { - if('function' === typeof options) callback = options, options = null; - if(options == null) options = {}; - if(!('function' === typeof callback)) callback = null; - - // DbName - var dbName = options['dbName']; - // If no dbname defined use the db one - if(dbName == null) { - dbName = this.db.databaseName; - } - - // Either use override on the function, or go back to default on either the collection - // level or db - if(options['serializeFunctions'] != null) { - options['serializeFunctions'] = options['serializeFunctions']; - } else { - options['serializeFunctions'] = this.serializeFunctions; - } - - var updateCommand = new UpdateCommand( - this.db - , dbName + "." + this.collectionName - , selector - , document - , options); - - var self = this; - // Unpack the error options if any - var errorOptions = _getWriteConcern(this, options, callback); - // If safe is defined check for error message - if(_hasWriteConcern(errorOptions) && typeof callback == 'function') { - // Insert options - var commandOptions = {read:false}; - // If we have safe set set async to false - if(errorOptions == null) commandOptions['async'] = true; - // Set safe option - commandOptions['safe'] = errorOptions; - // If we have an error option - if(typeof errorOptions == 'object') { - var keys = Object.keys(errorOptions); - for(var i = 0; i < keys.length; i++) { - commandOptions[keys[i]] = errorOptions[keys[i]]; - } - } - - // Execute command with safe options (rolls up both command and safe command into one and executes them on the same connection) - this.db._executeUpdateCommand(updateCommand, commandOptions, function (err, error) { - error = error && error.documents; - if(!callback) return; - - if(err) { - callback(err); - } else if(error[0].err || error[0].errmsg) { - callback(utils.toError(error[0])); - } else { - // Perform the callback - callback(null, error[0].n, error[0]); - } - }); - } else if(_hasWriteConcern(errorOptions) && callback == null) { - throw new Error("Cannot use a writeConcern without a provided callback"); - } else { - // Execute update - var result = this.db._executeUpdateCommand(updateCommand); - // If no callback just return - if (!callback) return; - // If error return error - if (result instanceof Error) { - return callback(result); - } - // Otherwise just return - return callback(); - } -}; - -/** - * The distinct command returns returns a list of distinct values for the given key across a collection. - * - * Options - * - **readPreference** {String}, the preferred read preference (Server.PRIMARY, Server.PRIMARY_PREFERRED, Server.SECONDARY, Server.SECONDARY_PREFERRED, Server.NEAREST). - * - * @param {String} key key to run distinct against. - * @param {Object} [query] option query to narrow the returned objects. - * @param {Object} [options] additional options during update. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from distinct or null if an error occured. - * @return {null} - * @api public - */ -Collection.prototype.distinct = function distinct(key, query, options, callback) { - var args = Array.prototype.slice.call(arguments, 1); - callback = args.pop(); - query = args.length ? args.shift() : {}; - options = args.length ? args.shift() : {}; - - var mapCommandHash = { - 'distinct': this.collectionName - , 'query': query - , 'key': key - }; - - // Set read preference if we set one - var readPreference = options['readPreference'] ? options['readPreference'] : false; - // Create the command - var cmd = DbCommand.createDbSlaveOkCommand(this.db, mapCommandHash); - - this.db._executeQueryCommand(cmd, {read:readPreference}, function (err, result) { - if(err) - return callback(err); - if(result.documents[0].ok != 1) - return callback(new Error(result.documents[0].errmsg)); - callback(null, result.documents[0].values); - }); -}; - -/** - * Count number of matching documents in the db to a query. - * - * Options - * - **skip** {Number}, The number of documents to skip for the count. - * - **limit** {Number}, The limit of documents to count. - * - **readPreference** {String}, the preferred read preference (Server.PRIMARY, Server.PRIMARY_PREFERRED, Server.SECONDARY, Server.SECONDARY_PREFERRED, Server.NEAREST). - * - * @param {Object} [query] query to filter by before performing count. - * @param {Object} [options] additional options during count. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from the count method or null if an error occured. - * @return {null} - * @api public - */ -Collection.prototype.count = function count (query, options, callback) { - var args = Array.prototype.slice.call(arguments, 0); - callback = args.pop(); - query = args.length ? args.shift() : {}; - options = args.length ? args.shift() : {}; - var skip = options.skip; - var limit = options.limit; - - // Final query - var final_query = { - 'count': this.collectionName - , 'query': query - , 'fields': null - }; - - // Add limit and skip if defined - if(typeof skip == 'number') final_query.skip = skip; - if(typeof limit == 'number') final_query.limit = limit; - - // Set read preference if we set one - var readPreference = options['readPreference'] ? options['readPreference'] : false; - - // Set up query options - var queryOptions = QueryCommand.OPTS_NO_CURSOR_TIMEOUT; - if (this.slaveOk || this.db.slaveOk) { - queryOptions |= QueryCommand.OPTS_SLAVE; - } - - var queryCommand = new QueryCommand( - this.db - , this.db.databaseName + ".$cmd" - , queryOptions - , 0 - , -1 - , final_query - , null - ); - - var self = this; - this.db._executeQueryCommand(queryCommand, {read:readPreference}, function (err, result) { - result = result && result.documents; - if(!callback) return; - - if(err) return callback(err); - if (result[0].ok != 1 || result[0].errmsg) { - return callback(utils.toError(result[0])); - } - callback(null, result[0].n); - }); -}; - - -/** - * Drop the collection - * - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from the drop method or null if an error occured. - * @return {null} - * @api public - */ -Collection.prototype.drop = function drop(callback) { - this.db.dropCollection(this.collectionName, callback); -}; - -/** - * Find and update a document. - * - * Options -* - **w**, {Number/String, > -1 || 'majority' || tag name} the write concern for the operation where < 1 is no acknowlegement of write and w >= 1, w = 'majority' or tag acknowledges the write - * - **wtimeout**, {Number, 0} set the timeout for waiting for write concern to finish (combines with w option) - * - **fsync**, (Boolean, default:false) write waits for fsync before returning - * - **journal**, (Boolean, default:false) write waits for journal sync before returning - * - **remove** {Boolean, default:false}, set to true to remove the object before returning. - * - **upsert** {Boolean, default:false}, perform an upsert operation. - * - **new** {Boolean, default:false}, set to true if you want to return the modified object rather than the original. Ignored for remove. - * - * Deprecated Options - * - **safe** {true | {w:n, wtimeout:n} | {fsync:true}, default:false}, executes with a getLastError command returning the results of the command on MongoDB. - * - * @param {Object} query query object to locate the object to modify - * @param {Array} sort - if multiple docs match, choose the first one in the specified sort order as the object to manipulate - * @param {Object} doc - the fields/vals to be updated - * @param {Object} [options] additional options during update. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from the findAndModify method or null if an error occured. - * @return {null} - * @api public - */ -Collection.prototype.findAndModify = function findAndModify (query, sort, doc, options, callback) { - var args = Array.prototype.slice.call(arguments, 1); - callback = args.pop(); - sort = args.length ? args.shift() : []; - doc = args.length ? args.shift() : null; - options = args.length ? args.shift() : {}; - var self = this; - - var queryObject = { - 'findandmodify': this.collectionName - , 'query': query - , 'sort': utils.formattedOrderClause(sort) - }; - - queryObject.new = options.new ? 1 : 0; - queryObject.remove = options.remove ? 1 : 0; - queryObject.upsert = options.upsert ? 1 : 0; - - if (options.fields) { - queryObject.fields = options.fields; - } - - if (doc && !options.remove) { - queryObject.update = doc; - } - - // Either use override on the function, or go back to default on either the collection - // level or db - if(options['serializeFunctions'] != null) { - options['serializeFunctions'] = options['serializeFunctions']; - } else { - options['serializeFunctions'] = this.serializeFunctions; - } - - // Unpack the error options if any - var errorOptions = _getWriteConcern(this, options, callback); - - // If we have j, w or something else do the getLast Error path - if(errorOptions != null && typeof errorOptions == 'object') { - // Commands to send - var commands = []; - // Add the find and modify command - commands.push(DbCommand.createDbCommand(this.db, queryObject, options)); - // If we have safe defined we need to return both call results - var chainedCommands = errorOptions != null ? true : false; - // Add error command if we have one - if(chainedCommands) { - commands.push(DbCommand.createGetLastErrorCommand(errorOptions, this.db)); - } - - // Fire commands and - this.db._executeQueryCommand(commands, {read:false}, function(err, result) { - if(err != null) return callback(err); - result = result && result.documents; - - if(result[0].err != null) { - return callback(utils.toError(result[0]), null); - } - - // Workaround due to 1.8.X returning an error on no matching object - // while 2.0.X does not not, making 2.0.X behaviour standard - if(result[0].errmsg != null && !result[0].errmsg.match(eErrorMessages)) { - return callback(utils.toError(result[0]), null, result[0]); - } - - return callback(null, result[0].value, result[0]); - }); - } else { - // Only run command and rely on getLastError command - var command = DbCommand.createDbCommand(this.db, queryObject, options) - // Execute command - this.db._executeQueryCommand(command, {read:false}, function(err, result) { - if(err != null) return callback(err); - - result = result && result.documents; - - if(result[0].errmsg != null && !result[0].errmsg.match(eErrorMessages)) { - return callback(utils.toError(result[0]), null, result[0]); - } - - // If we have an error return it - if(result[0].lastErrorObject && result[0].lastErrorObject.err != null) { - return callback(utils.toError(result[0].lastErrorObject), null); - } - - return callback(null, result[0].value, result[0]); - }); - } -} - -/** - * Find and remove a document - * - * Options -* - **w**, {Number/String, > -1 || 'majority' || tag name} the write concern for the operation where < 1 is no acknowlegement of write and w >= 1, w = 'majority' or tag acknowledges the write - * - **wtimeout**, {Number, 0} set the timeout for waiting for write concern to finish (combines with w option) - * - **fsync**, (Boolean, default:false) write waits for fsync before returning - * - **journal**, (Boolean, default:false) write waits for journal sync before returning - * - * Deprecated Options - * - **safe** {true | {w:n, wtimeout:n} | {fsync:true}, default:false}, executes with a getLastError command returning the results of the command on MongoDB. - * - * @param {Object} query query object to locate the object to modify - * @param {Array} sort - if multiple docs match, choose the first one in the specified sort order as the object to manipulate - * @param {Object} [options] additional options during update. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from the findAndRemove method or null if an error occured. - * @return {null} - * @api public - */ -Collection.prototype.findAndRemove = function(query, sort, options, callback) { - var args = Array.prototype.slice.call(arguments, 1); - callback = args.pop(); - sort = args.length ? args.shift() : []; - options = args.length ? args.shift() : {}; - // Add the remove option - options['remove'] = true; - // Execute the callback - this.findAndModify(query, sort, null, options, callback); -} - -var testForFields = { - limit: 1, sort: 1, fields:1, skip: 1, hint: 1, explain: 1, snapshot: 1, timeout: 1, tailable: 1, tailableRetryInterval: 1 - , numberOfRetries: 1, awaitdata: 1, exhaust: 1, batchSize: 1, returnKey: 1, maxScan: 1, min: 1, max: 1, showDiskLoc: 1 - , comment: 1, raw: 1, readPreference: 1, numberOfRetries: 1, partial: 1, read: 1, dbName: 1 -}; - -/** - * Creates a cursor for a query that can be used to iterate over results from MongoDB - * - * Various argument possibilities - * - callback? - * - selector, callback?, - * - selector, fields, callback? - * - selector, options, callback? - * - selector, fields, options, callback? - * - selector, fields, skip, limit, callback? - * - selector, fields, skip, limit, timeout, callback? - * - * Options - * - **limit** {Number, default:0}, sets the limit of documents returned in the query. - * - **sort** {Array | Object}, set to sort the documents coming back from the query. Array of indexes, [['a', 1]] etc. - * - **fields** {Object}, the fields to return in the query. Object of fields to include or exclude (not both), {'a':1} - * - **skip** {Number, default:0}, set to skip N documents ahead in your query (useful for pagination). - * - **hint** {Object}, tell the query to use specific indexes in the query. Object of indexes to use, {'_id':1} - * - **explain** {Boolean, default:false}, explain the query instead of returning the data. - * - **snapshot** {Boolean, default:false}, snapshot query. - * - **timeout** {Boolean, default:false}, specify if the cursor can timeout. - * - **tailable** {Boolean, default:false}, specify if the cursor is tailable. - * - **tailableRetryInterval** {Number, default:100}, specify the miliseconds between getMores on tailable cursor. - * - **numberOfRetries** {Number, default:5}, specify the number of times to retry the tailable cursor. - * - **awaitdata** {Boolean, default:false} allow the cursor to wait for data, only applicable for tailable cursor. - * - **exhaust** {Boolean, default:false} have the server send all the documents at once as getMore packets, not recommended. - * - **batchSize** {Number, default:0}, set the batchSize for the getMoreCommand when iterating over the query results. - * - **returnKey** {Boolean, default:false}, only return the index key. - * - **maxScan** {Number}, Limit the number of items to scan. - * - **min** {Number}, Set index bounds. - * - **max** {Number}, Set index bounds. - * - **showDiskLoc** {Boolean, default:false}, Show disk location of results. - * - **comment** {String}, You can put a $comment field on a query to make looking in the profiler logs simpler. - * - **raw** {Boolean, default:false}, Return all BSON documents as Raw Buffer documents. - * - **readPreference** {String}, the preferred read preference ((Server.PRIMARY, Server.PRIMARY_PREFERRED, Server.SECONDARY, Server.SECONDARY_PREFERRED, Server.NEAREST). - * - **numberOfRetries** {Number, default:5}, if using awaidata specifies the number of times to retry on timeout. - * - **partial** {Boolean, default:false}, specify if the cursor should return partial results when querying against a sharded system - * - * @param {Object} query query object to locate the object to modify - * @param {Object} [options] additional options during update. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from the find method or null if an error occured. - * @return {Cursor} returns a cursor to the query - * @api public - */ -Collection.prototype.find = function find () { - var options - , args = Array.prototype.slice.call(arguments, 0) - , has_callback = typeof args[args.length - 1] === 'function' - , has_weird_callback = typeof args[0] === 'function' - , callback = has_callback ? args.pop() : (has_weird_callback ? args.shift() : null) - , len = args.length - , selector = len >= 1 ? args[0] : {} - , fields = len >= 2 ? args[1] : undefined; - - if(len === 1 && has_weird_callback) { - // backwards compat for callback?, options case - selector = {}; - options = args[0]; - } - - if(len === 2 && !Array.isArray(fields)) { - var fieldKeys = Object.getOwnPropertyNames(fields); - var is_option = false; - - for(var i = 0; i < fieldKeys.length; i++) { - if(testForFields[fieldKeys[i]] != null) { - is_option = true; - break; - } - } - - if(is_option) { - options = fields; - fields = undefined; - } else { - options = {}; - } - } else if(len === 2 && Array.isArray(fields) && !Array.isArray(fields[0])) { - var newFields = {}; - // Rewrite the array - for(var i = 0; i < fields.length; i++) { - newFields[fields[i]] = 1; - } - // Set the fields - fields = newFields; - } - - if(3 === len) { - options = args[2]; - } - - // Ensure selector is not null - selector = selector == null ? {} : selector; - // Validate correctness off the selector - var object = selector; - if(Buffer.isBuffer(object)) { - var object_size = object[0] | object[1] << 8 | object[2] << 16 | object[3] << 24; - if(object_size != object.length) { - var error = new Error("query selector raw message size does not match message header size [" + object.length + "] != [" + object_size + "]"); - error.name = 'MongoError'; - throw error; - } - } - - // Validate correctness of the field selector - var object = fields; - if(Buffer.isBuffer(object)) { - var object_size = object[0] | object[1] << 8 | object[2] << 16 | object[3] << 24; - if(object_size != object.length) { - var error = new Error("query fields raw message size does not match message header size [" + object.length + "] != [" + object_size + "]"); - error.name = 'MongoError'; - throw error; - } - } - - // Check special case where we are using an objectId - if(selector instanceof ObjectID) { - selector = {_id:selector}; - } - - // If it's a serialized fields field we need to just let it through - // user be warned it better be good - if(options && options.fields && !(Buffer.isBuffer(options.fields))) { - fields = {}; - - if(Array.isArray(options.fields)) { - if(!options.fields.length) { - fields['_id'] = 1; - } else { - for (var i = 0, l = options.fields.length; i < l; i++) { - fields[options.fields[i]] = 1; - } - } - } else { - fields = options.fields; - } - } - - if (!options) options = {}; - options.skip = len > 3 ? args[2] : options.skip ? options.skip : 0; - options.limit = len > 3 ? args[3] : options.limit ? options.limit : 0; - options.raw = options.raw != null && typeof options.raw === 'boolean' ? options.raw : this.raw; - options.hint = options.hint != null ? normalizeHintField(options.hint) : this.internalHint; - options.timeout = len == 5 ? args[4] : typeof options.timeout === 'undefined' ? undefined : options.timeout; - // If we have overridden slaveOk otherwise use the default db setting - options.slaveOk = options.slaveOk != null ? options.slaveOk : this.db.slaveOk; - - // Set option - var o = options; - // Support read/readPreference - if(o["read"] != null) o["readPreference"] = o["read"]; - // Set the read preference - o.read = o["readPreference"] ? o.readPreference : this.readPreference; - // Adjust slave ok if read preference is secondary or secondary only - if(o.read == "secondary" || o.read == "secondaryOnly") options.slaveOk = true; - - // callback for backward compatibility - if(callback) { - // TODO refactor Cursor args - callback(null, new Cursor(this.db, this, selector, fields, o)); - } else { - return new Cursor(this.db, this, selector, fields, o); - } -}; - -/** - * Normalizes a `hint` argument. - * - * @param {String|Object|Array} hint - * @return {Object} - * @api private - */ -var normalizeHintField = function normalizeHintField(hint) { - var finalHint = null; - - if (null != hint) { - switch (hint.constructor) { - case String: - finalHint = {}; - finalHint[hint] = 1; - break; - case Object: - finalHint = {}; - for (var name in hint) { - finalHint[name] = hint[name]; - } - break; - case Array: - finalHint = {}; - hint.forEach(function(param) { - finalHint[param] = 1; - }); - break; - } - } - - return finalHint; -}; - -/** - * Finds a single document based on the query - * - * Various argument possibilities - * - callback? - * - selector, callback?, - * - selector, fields, callback? - * - selector, options, callback? - * - selector, fields, options, callback? - * - selector, fields, skip, limit, callback? - * - selector, fields, skip, limit, timeout, callback? - * - * Options - * - **limit** {Number, default:0}, sets the limit of documents returned in the query. - * - **sort** {Array | Object}, set to sort the documents coming back from the query. Array of indexes, [['a', 1]] etc. - * - **fields** {Object}, the fields to return in the query. Object of fields to include or exclude (not both), {'a':1} - * - **skip** {Number, default:0}, set to skip N documents ahead in your query (useful for pagination). - * - **hint** {Object}, tell the query to use specific indexes in the query. Object of indexes to use, {'_id':1} - * - **explain** {Boolean, default:false}, explain the query instead of returning the data. - * - **snapshot** {Boolean, default:false}, snapshot query. - * - **timeout** {Boolean, default:false}, specify if the cursor can timeout. - * - **tailable** {Boolean, default:false}, specify if the cursor is tailable. - * - **batchSize** {Number, default:0}, set the batchSize for the getMoreCommand when iterating over the query results. - * - **returnKey** {Boolean, default:false}, only return the index key. - * - **maxScan** {Number}, Limit the number of items to scan. - * - **min** {Number}, Set index bounds. - * - **max** {Number}, Set index bounds. - * - **showDiskLoc** {Boolean, default:false}, Show disk location of results. - * - **comment** {String}, You can put a $comment field on a query to make looking in the profiler logs simpler. - * - **raw** {Boolean, default:false}, Return all BSON documents as Raw Buffer documents. - * - **readPreference** {String}, the preferred read preference (Server.PRIMARY, Server.PRIMARY_PREFERRED, Server.SECONDARY, Server.SECONDARY_PREFERRED, Server.NEAREST). - * - **partial** {Boolean, default:false}, specify if the cursor should return partial results when querying against a sharded system - * - * @param {Object} query query object to locate the object to modify - * @param {Object} [options] additional options during update. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from the findOne method or null if an error occured. - * @return {Cursor} returns a cursor to the query - * @api public - */ -Collection.prototype.findOne = function findOne () { - var self = this; - var args = Array.prototype.slice.call(arguments, 0); - var callback = args.pop(); - var cursor = this.find.apply(this, args).limit(-1).batchSize(1); - // Return the item - cursor.nextObject(function(err, item) { - if(err != null) return callback(utils.toError(err), null); - callback(null, item); - }); -}; - -/** - * Creates an index on the collection. - * - * Options -* - **w**, {Number/String, > -1 || 'majority' || tag name} the write concern for the operation where < 1 is no acknowlegement of write and w >= 1, w = 'majority' or tag acknowledges the write - * - **wtimeout**, {Number, 0} set the timeout for waiting for write concern to finish (combines with w option) - * - **fsync**, (Boolean, default:false) write waits for fsync before returning - * - **journal**, (Boolean, default:false) write waits for journal sync before returning - * - **unique** {Boolean, default:false}, creates an unique index. - * - **sparse** {Boolean, default:false}, creates a sparse index. - * - **background** {Boolean, default:false}, creates the index in the background, yielding whenever possible. - * - **dropDups** {Boolean, default:false}, a unique index cannot be created on a key that has pre-existing duplicate values. If you would like to create the index anyway, keeping the first document the database indexes and deleting all subsequent documents that have duplicate value - * - **min** {Number}, for geospatial indexes set the lower bound for the co-ordinates. - * - **max** {Number}, for geospatial indexes set the high bound for the co-ordinates. - * - **v** {Number}, specify the format version of the indexes. - * - **expireAfterSeconds** {Number}, allows you to expire data on indexes applied to a data (MongoDB 2.2 or higher) - * - **name** {String}, override the autogenerated index name (useful if the resulting name is larger than 128 bytes) - * - * Deprecated Options - * - **safe** {true | {w:n, wtimeout:n} | {fsync:true}, default:false}, executes with a getLastError command returning the results of the command on MongoDB. - * - * @param {Object} fieldOrSpec fieldOrSpec that defines the index. - * @param {Object} [options] additional options during update. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from the createIndex method or null if an error occured. - * @return {null} - * @api public - */ -Collection.prototype.createIndex = function createIndex (fieldOrSpec, options, callback) { - // Clean up call - var args = Array.prototype.slice.call(arguments, 1); - callback = args.pop(); - options = args.length ? args.shift() : {}; - options = typeof callback === 'function' ? options : callback; - options = options == null ? {} : options; - - // Collect errorOptions - var errorOptions = _getWriteConcern(this, options, callback); - // Execute create index - this.db.createIndex(this.collectionName, fieldOrSpec, options, callback); -}; - -/** - * Ensures that an index exists, if it does not it creates it - * - * Options -* - **w**, {Number/String, > -1 || 'majority' || tag name} the write concern for the operation where < 1 is no acknowlegement of write and w >= 1, w = 'majority' or tag acknowledges the write - * - **wtimeout**, {Number, 0} set the timeout for waiting for write concern to finish (combines with w option) - * - **fsync**, (Boolean, default:false) write waits for fsync before returning - * - **journal**, (Boolean, default:false) write waits for journal sync before returning - * - **unique** {Boolean, default:false}, creates an unique index. - * - **sparse** {Boolean, default:false}, creates a sparse index. - * - **background** {Boolean, default:false}, creates the index in the background, yielding whenever possible. - * - **dropDups** {Boolean, default:false}, a unique index cannot be created on a key that has pre-existing duplicate values. If you would like to create the index anyway, keeping the first document the database indexes and deleting all subsequent documents that have duplicate value - * - **min** {Number}, for geospatial indexes set the lower bound for the co-ordinates. - * - **max** {Number}, for geospatial indexes set the high bound for the co-ordinates. - * - **v** {Number}, specify the format version of the indexes. - * - **expireAfterSeconds** {Number}, allows you to expire data on indexes applied to a data (MongoDB 2.2 or higher) - * - **name** {String}, override the autogenerated index name (useful if the resulting name is larger than 128 bytes) - * - * Deprecated Options - * - **safe** {true | {w:n, wtimeout:n} | {fsync:true}, default:false}, executes with a getLastError command returning the results of the command on MongoDB. - * - * @param {Object} fieldOrSpec fieldOrSpec that defines the index. - * @param {Object} [options] additional options during update. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from the ensureIndex method or null if an error occured. - * @return {null} - * @api public - */ -Collection.prototype.ensureIndex = function ensureIndex (fieldOrSpec, options, callback) { - // Clean up call - if (typeof callback === 'undefined' && typeof options === 'function') { - callback = options; - options = {}; - } - - if (options == null) { - options = {}; - } - - // Execute create index - this.db.ensureIndex(this.collectionName, fieldOrSpec, options, callback); -}; - -/** - * Retrieves this collections index info. - * - * Options - * - **full** {Boolean, default:false}, returns the full raw index information. - * - * @param {Object} [options] additional options during update. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from the indexInformation method or null if an error occured. - * @return {null} - * @api public - */ -Collection.prototype.indexInformation = function indexInformation (options, callback) { - // Unpack calls - var args = Array.prototype.slice.call(arguments, 0); - callback = args.pop(); - options = args.length ? args.shift() : {}; - // Call the index information - this.db.indexInformation(this.collectionName, options, callback); -}; - -/** - * Drops an index from this collection. - * - * @param {String} name - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from the dropIndex method or null if an error occured. - * @return {null} - * @api public - */ -Collection.prototype.dropIndex = function dropIndex (name, callback) { - this.db.dropIndex(this.collectionName, name, callback); -}; - -/** - * Drops all indexes from this collection. - * - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from the dropAllIndexes method or null if an error occured. - * @return {null} - * @api public - */ -Collection.prototype.dropAllIndexes = function dropIndexes (callback) { - this.db.dropIndex(this.collectionName, '*', function (err, result) { - if(err != null) { - callback(err, false); - } else if(result.documents[0].errmsg == null) { - callback(null, true); - } else { - callback(new Error(result.documents[0].errmsg), false); - } - }); -}; - -/** - * Drops all indexes from this collection. - * - * @deprecated - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from the dropIndexes method or null if an error occured. - * @return {null} - * @api private - */ -Collection.prototype.dropIndexes = Collection.prototype.dropAllIndexes; - -/** - * Reindex all indexes on the collection - * Warning: reIndex is a blocking operation (indexes are rebuilt in the foreground) and will be slow for large collections. - * - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from the reIndex method or null if an error occured. - * @return {null} - * @api public -**/ -Collection.prototype.reIndex = function(callback) { - this.db.reIndex(this.collectionName, callback); -} - -/** - * Run Map Reduce across a collection. Be aware that the inline option for out will return an array of results not a collection. - * - * Options - * - **out** {Object, default:*{inline:1}*}, sets the output target for the map reduce job. *{inline:1} | {replace:'collectionName'} | {merge:'collectionName'} | {reduce:'collectionName'}* - * - **query** {Object}, query filter object. - * - **sort** {Object}, sorts the input objects using this key. Useful for optimization, like sorting by the emit key for fewer reduces. - * - **limit** {Number}, number of objects to return from collection. - * - **keeptemp** {Boolean, default:false}, keep temporary data. - * - **finalize** {Function | String}, finalize function. - * - **scope** {Object}, can pass in variables that can be access from map/reduce/finalize. - * - **jsMode** {Boolean, default:false}, it is possible to make the execution stay in JS. Provided in MongoDB > 2.0.X. - * - **verbose** {Boolean, default:false}, provide statistics on job execution time. - * - **readPreference** {String, only for inline results}, the preferred read preference (Server.PRIMARY, Server.PRIMARY_PREFERRED, Server.SECONDARY, Server.SECONDARY_PREFERRED, Server.NEAREST). - * - * @param {Function|String} map the mapping function. - * @param {Function|String} reduce the reduce function. - * @param {Objects} [options] options for the map reduce job. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from the mapReduce method or null if an error occured. - * @return {null} - * @api public - */ -Collection.prototype.mapReduce = function mapReduce (map, reduce, options, callback) { - if ('function' === typeof options) callback = options, options = {}; - // Out must allways be defined (make sure we don't break weirdly on pre 1.8+ servers) - if(null == options.out) { - throw new Error("the out option parameter must be defined, see mongodb docs for possible values"); - } - - if ('function' === typeof map) { - map = map.toString(); - } - - if ('function' === typeof reduce) { - reduce = reduce.toString(); - } - - if ('function' === typeof options.finalize) { - options.finalize = options.finalize.toString(); - } - - var mapCommandHash = { - mapreduce: this.collectionName - , map: map - , reduce: reduce - }; - - // Add any other options passed in - for (var name in options) { - if ('scope' == name) { - mapCommandHash[name] = processScope(options[name]); - } else { - mapCommandHash[name] = options[name]; - } - } - - // Set read preference if we set one - var readPreference = options['readPreference'] ? options['readPreference'] : false; - // If we have a read preference and inline is not set as output fail hard - if(readPreference != false && options['out'] != 'inline') { - throw new Error("a readPreference can only be provided when performing an inline mapReduce"); - } - - // self - var self = this; - var cmd = DbCommand.createDbCommand(this.db, mapCommandHash); - - this.db._executeQueryCommand(cmd, {read:readPreference}, function (err, result) { - if (err) { - return callback(err); - } - - // - if (1 != result.documents[0].ok || result.documents[0].err || result.documents[0].errmsg) { - return callback(utils.toError(result.documents[0])); - } - - // Create statistics value - var stats = {}; - if(result.documents[0].timeMillis) stats['processtime'] = result.documents[0].timeMillis; - if(result.documents[0].counts) stats['counts'] = result.documents[0].counts; - if(result.documents[0].timing) stats['timing'] = result.documents[0].timing; - - // invoked with inline? - if(result.documents[0].results) { - return callback(null, result.documents[0].results, stats); - } - - // The returned collection - var collection = null; - - // If we have an object it's a different db - if(result.documents[0].result != null && typeof result.documents[0].result == 'object') { - var doc = result.documents[0].result; - collection = self.db.db(doc.db).collection(doc.collection); - } else { - // Create a collection object that wraps the result collection - collection = self.db.collection(result.documents[0].result) - } - - // If we wish for no verbosity - if(options['verbose'] == null || !options['verbose']) { - return callback(err, collection); - } - - // Return stats as third set of values - callback(err, collection, stats); - }); -}; - -/** - * Functions that are passed as scope args must - * be converted to Code instances. - * @ignore - */ -function processScope (scope) { - if (!utils.isObject(scope)) { - return scope; - } - - var keys = Object.keys(scope); - var i = keys.length; - var key; - - while (i--) { - key = keys[i]; - if ('function' == typeof scope[key]) { - scope[key] = new Code(String(scope[key])); - } - } - - return scope; -} - -/** - * Group function helper - * @ignore - */ -var groupFunction = function () { - var c = db[ns].find(condition); - var map = new Map(); - var reduce_function = reduce; - - while (c.hasNext()) { - var obj = c.next(); - var key = {}; - - for (var i = 0, len = keys.length; i < len; ++i) { - var k = keys[i]; - key[k] = obj[k]; - } - - var aggObj = map.get(key); - - if (aggObj == null) { - var newObj = Object.extend({}, key); - aggObj = Object.extend(newObj, initial); - map.put(key, aggObj); - } - - reduce_function(obj, aggObj); - } - - return { "result": map.values() }; -}.toString(); - -/** - * Run a group command across a collection - * - * Options - * - **readPreference** {String}, the preferred read preference (Server.PRIMARY, Server.PRIMARY_PREFERRED, Server.SECONDARY, Server.SECONDARY_PREFERRED, Server.NEAREST). - * - * @param {Object|Array|Function|Code} keys an object, array or function expressing the keys to group by. - * @param {Object} condition an optional condition that must be true for a row to be considered. - * @param {Object} initial initial value of the aggregation counter object. - * @param {Function|Code} reduce the reduce function aggregates (reduces) the objects iterated - * @param {Function|Code} finalize an optional function to be run on each item in the result set just before the item is returned. - * @param {Boolean} command specify if you wish to run using the internal group command or using eval, default is true. - * @param {Object} [options] additional options during update. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from the group method or null if an error occured. - * @return {null} - * @api public - */ -Collection.prototype.group = function group(keys, condition, initial, reduce, finalize, command, options, callback) { - var args = Array.prototype.slice.call(arguments, 3); - callback = args.pop(); - // Fetch all commands - reduce = args.length ? args.shift() : null; - finalize = args.length ? args.shift() : null; - command = args.length ? args.shift() : null; - options = args.length ? args.shift() : {}; - - // Make sure we are backward compatible - if(!(typeof finalize == 'function')) { - command = finalize; - finalize = null; - } - - if (!Array.isArray(keys) && keys instanceof Object && typeof(keys) !== 'function' && !(keys instanceof Code)) { - keys = Object.keys(keys); - } - - if(typeof reduce === 'function') { - reduce = reduce.toString(); - } - - if(typeof finalize === 'function') { - finalize = finalize.toString(); - } - - // Set up the command as default - command = command == null ? true : command; - - // Execute using the command - if(command) { - var reduceFunction = reduce instanceof Code - ? reduce - : new Code(reduce); - - var selector = { - group: { - 'ns': this.collectionName - , '$reduce': reduceFunction - , 'cond': condition - , 'initial': initial - , 'out': "inline" - } - }; - - // if finalize is defined - if(finalize != null) selector.group['finalize'] = finalize; - // Set up group selector - if ('function' === typeof keys || keys instanceof Code) { - selector.group.$keyf = keys instanceof Code - ? keys - : new Code(keys); - } else { - var hash = {}; - keys.forEach(function (key) { - hash[key] = 1; - }); - selector.group.key = hash; - } - - var cmd = DbCommand.createDbSlaveOkCommand(this.db, selector); - // Set read preference if we set one - var readPreference = options['readPreference'] ? options['readPreference'] : false; - - this.db._executeQueryCommand(cmd, {read:readPreference}, function (err, result) { - if(err != null) return callback(err); - - var document = result.documents[0]; - if (null == document.retval) { - return callback(new Error("group command failed: " + document.errmsg)); - } - - callback(null, document.retval); - }); - - } else { - // Create execution scope - var scope = reduce != null && reduce instanceof Code - ? reduce.scope - : {}; - - scope.ns = this.collectionName; - scope.keys = keys; - scope.condition = condition; - scope.initial = initial; - - // Pass in the function text to execute within mongodb. - var groupfn = groupFunction.replace(/ reduce;/, reduce.toString() + ';'); - - this.db.eval(new Code(groupfn, scope), function (err, results) { - if (err) return callback(err, null); - callback(null, results.result || results); - }); - } -}; - -/** - * Returns the options of the collection. - * - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from the options method or null if an error occured. - * @return {null} - * @api public - */ -Collection.prototype.options = function options(callback) { - this.db.collectionsInfo(this.collectionName, function (err, cursor) { - if (err) return callback(err); - cursor.nextObject(function (err, document) { - callback(err, document && document.options || null); - }); - }); -}; - -/** - * Returns if the collection is a capped collection - * - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from the isCapped method or null if an error occured. - * @return {null} - * @api public - */ -Collection.prototype.isCapped = function isCapped(callback) { - this.options(function(err, document) { - if(err != null) { - callback(err); - } else { - callback(null, document && document.capped); - } - }); -}; - -/** - * Checks if one or more indexes exist on the collection - * - * @param {String|Array} indexNames check if one or more indexes exist on the collection. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from the indexExists method or null if an error occured. - * @return {null} - * @api public - */ -Collection.prototype.indexExists = function indexExists(indexes, callback) { - this.indexInformation(function(err, indexInformation) { - // If we have an error return - if(err != null) return callback(err, null); - // Let's check for the index names - if(Array.isArray(indexes)) { - for(var i = 0; i < indexes.length; i++) { - if(indexInformation[indexes[i]] == null) { - return callback(null, false); - } - } - - // All keys found return true - return callback(null, true); - } else { - return callback(null, indexInformation[indexes] != null); - } - }); -} - -/** - * Execute the geoNear command to search for items in the collection - * - * Options - * - **num** {Number}, max number of results to return. - * - **maxDistance** {Number}, include results up to maxDistance from the point. - * - **distanceMultiplier** {Number}, include a value to multiply the distances with allowing for range conversions. - * - **query** {Object}, filter the results by a query. - * - **spherical** {Boolean, default:false}, perform query using a spherical model. - * - **uniqueDocs** {Boolean, default:false}, the closest location in a document to the center of the search region will always be returned MongoDB > 2.X. - * - **includeLocs** {Boolean, default:false}, include the location data fields in the top level of the results MongoDB > 2.X. - * - **readPreference** {String}, the preferred read preference ((Server.PRIMARY, Server.PRIMARY_PREFERRED, Server.SECONDARY, Server.SECONDARY_PREFERRED, Server.NEAREST). - * - * @param {Number} x point to search on the x axis, ensure the indexes are ordered in the same order. - * @param {Number} y point to search on the y axis, ensure the indexes are ordered in the same order. - * @param {Objects} [options] options for the map reduce job. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from the geoNear method or null if an error occured. - * @return {null} - * @api public - */ -Collection.prototype.geoNear = function geoNear(x, y, options, callback) { - var args = Array.prototype.slice.call(arguments, 2); - callback = args.pop(); - // Fetch all commands - options = args.length ? args.shift() : {}; - - // Build command object - var commandObject = { - geoNear:this.collectionName, - near: [x, y] - } - - // Decorate object if any with known properties - if(options['num'] != null) commandObject['num'] = options['num']; - if(options['maxDistance'] != null) commandObject['maxDistance'] = options['maxDistance']; - if(options['distanceMultiplier'] != null) commandObject['distanceMultiplier'] = options['distanceMultiplier']; - if(options['query'] != null) commandObject['query'] = options['query']; - if(options['spherical'] != null) commandObject['spherical'] = options['spherical']; - if(options['uniqueDocs'] != null) commandObject['uniqueDocs'] = options['uniqueDocs']; - if(options['includeLocs'] != null) commandObject['includeLocs'] = options['includeLocs']; - - // Execute the command - this.db.command(commandObject, options, callback); -} - -/** - * Execute a geo search using a geo haystack index on a collection. - * - * Options - * - **maxDistance** {Number}, include results up to maxDistance from the point. - * - **search** {Object}, filter the results by a query. - * - **limit** {Number}, max number of results to return. - * - **readPreference** {String}, the preferred read preference ((Server.PRIMARY, Server.PRIMARY_PREFERRED, Server.SECONDARY, Server.SECONDARY_PREFERRED, Server.NEAREST). - * - * @param {Number} x point to search on the x axis, ensure the indexes are ordered in the same order. - * @param {Number} y point to search on the y axis, ensure the indexes are ordered in the same order. - * @param {Objects} [options] options for the map reduce job. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from the geoHaystackSearch method or null if an error occured. - * @return {null} - * @api public - */ -Collection.prototype.geoHaystackSearch = function geoHaystackSearch(x, y, options, callback) { - var args = Array.prototype.slice.call(arguments, 2); - callback = args.pop(); - // Fetch all commands - options = args.length ? args.shift() : {}; - - // Build command object - var commandObject = { - geoSearch:this.collectionName, - near: [x, y] - } - - // Decorate object if any with known properties - if(options['maxDistance'] != null) commandObject['maxDistance'] = options['maxDistance']; - if(options['query'] != null) commandObject['search'] = options['query']; - if(options['search'] != null) commandObject['search'] = options['search']; - if(options['limit'] != null) commandObject['limit'] = options['limit']; - - // Execute the command - this.db.command(commandObject, options, callback); -} - -/** - * Retrieve all the indexes on the collection. - * - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from the indexes method or null if an error occured. - * @return {null} - * @api public - */ -Collection.prototype.indexes = function indexes(callback) { - // Return all the index information - this.db.indexInformation(this.collectionName, {full:true}, callback); -} - -/** - * Execute an aggregation framework pipeline against the collection, needs MongoDB >= 2.1 - * - * Options - * - **readPreference** {String}, the preferred read preference ((Server.PRIMARY, Server.PRIMARY_PREFERRED, Server.SECONDARY, Server.SECONDARY_PREFERRED, Server.NEAREST). - * - * @param {Array} array containing all the aggregation framework commands for the execution. - * @param {Object} [options] additional options during update. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from the aggregate method or null if an error occured. - * @return {null} - * @api public - */ -Collection.prototype.aggregate = function(pipeline, options, callback) { - // * - **explain** {Boolean}, return the query plan for the aggregation pipeline instead of the results. 2.3, 2.4 - var args = Array.prototype.slice.call(arguments, 0); - callback = args.pop(); - var self = this; - - // If we have any of the supported options in the options object - var opts = args[args.length - 1]; - options = opts.readPreference || opts.explain ? args.pop() : {} - - // Convert operations to an array - if(!Array.isArray(args[0])) { - pipeline = []; - // Push all the operations to the pipeline - for(var i = 0; i < args.length; i++) pipeline.push(args[i]); - } - - // Build the command - var command = { aggregate : this.collectionName, pipeline : pipeline}; - // Add all options - var keys = Object.keys(options); - // Add all options - for(var i = 0; i < keys.length; i++) { - command[keys[i]] = options[keys[i]]; - } - - // Execute the command - this.db.command(command, options, function(err, result) { - if(err) { - callback(err); - } else if(result['err'] || result['errmsg']) { - callback(utils.toError(result)); - } else if(typeof result == 'object' && result['serverPipeline']) { - callback(null, result); - } else { - callback(null, result.result); - } - }); -} - -/** - * Get all the collection statistics. - * - * Options - * - **scale** {Number}, divide the returned sizes by scale value. - * - **readPreference** {String}, the preferred read preference ((Server.PRIMARY, Server.PRIMARY_PREFERRED, Server.SECONDARY, Server.SECONDARY_PREFERRED, Server.NEAREST). - * - * @param {Objects} [options] options for the stats command. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from the stats method or null if an error occured. - * @return {null} - * @api public - */ -Collection.prototype.stats = function stats(options, callback) { - var args = Array.prototype.slice.call(arguments, 0); - callback = args.pop(); - // Fetch all commands - options = args.length ? args.shift() : {}; - - // Build command object - var commandObject = { - collStats:this.collectionName, - } - - // Check if we have the scale value - if(options['scale'] != null) commandObject['scale'] = options['scale']; - - // Execute the command - this.db.command(commandObject, options, callback); -} - -/** - * @ignore - */ -Object.defineProperty(Collection.prototype, "hint", { - enumerable: true - , get: function () { - return this.internalHint; - } - , set: function (v) { - this.internalHint = normalizeHintField(v); - } -}); - -/** - * @ignore - */ -var _hasWriteConcern = function(errorOptions) { - return errorOptions == true - || errorOptions.w > 0 - || errorOptions.w == 'majority' - || errorOptions.j == true - || errorOptions.journal == true - || errorOptions.fsync == true -} - -/** - * @ignore - */ -var _setWriteConcernHash = function(options) { - var finalOptions = {}; - if(options.w != null) finalOptions.w = options.w; - if(options.journal == true) finalOptions.j = options.journal; - if(options.j == true) finalOptions.j = options.j; - if(options.fsync == true) finalOptions.fsync = options.fsync; - if(options.wtimeout != null) finalOptions.wtimeout = options.wtimeout; - return finalOptions; -} - -/** - * @ignore - */ -var _getWriteConcern = function(self, options, callback) { - // Final options - var finalOptions = {w:1}; - // Local options verification - if(options.w != null || typeof options.j == 'boolean' || typeof options.journal == 'boolean' || typeof options.fsync == 'boolean') { - finalOptions = _setWriteConcernHash(options); - } else if(typeof options.safe == "boolean") { - finalOptions = {w: (options.safe ? 1 : 0)}; - } else if(options.safe != null && typeof options.safe == 'object') { - finalOptions = _setWriteConcernHash(options.safe); - } else if(self.opts.w != null || typeof self.opts.j == 'boolean' || typeof self.opts.journal == 'boolean' || typeof self.opts.fsync == 'boolean') { - finalOptions = _setWriteConcernHash(self.opts); - } else if(typeof self.opts.safe == "boolean") { - finalOptions = {w: (self.opts.safe ? 1 : 0)}; - } else if(self.db.safe.w != null || typeof self.db.safe.j == 'boolean' || typeof self.db.safe.journal == 'boolean' || typeof self.db.safe.fsync == 'boolean') { - finalOptions = _setWriteConcernHash(self.db.safe); - } else if(self.db.options.w != null || typeof self.db.options.j == 'boolean' || typeof self.db.options.journal == 'boolean' || typeof self.db.options.fsync == 'boolean') { - finalOptions = _setWriteConcernHash(self.db.options); - } else if(typeof self.db.safe == "boolean") { - finalOptions = {w: (self.db.safe ? 1 : 0)}; - } - - // Ensure we don't have an invalid combination of write concerns - if(finalOptions.w < 1 - && (finalOptions.journal == true || finalOptions.j == true || finalOptions.fsync == true)) throw new Error("No acknowlegement using w < 1 cannot be combined with journal:true or fsync:true"); - - // Return the options - return finalOptions; -} - -/** - * Expose. - */ -exports.Collection = Collection; diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/base_command.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/base_command.js deleted file mode 100644 index 9558582..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/base_command.js +++ /dev/null @@ -1,29 +0,0 @@ -/** - Base object used for common functionality -**/ -var BaseCommand = exports.BaseCommand = function BaseCommand() { -}; - -var id = 1; -BaseCommand.prototype.getRequestId = function getRequestId() { - if (!this.requestId) this.requestId = id++; - return this.requestId; -}; - -BaseCommand.prototype.setMongosReadPreference = function setMongosReadPreference(readPreference, tags) {} - -BaseCommand.prototype.updateRequestId = function() { - this.requestId = id++; - return this.requestId; -}; - -// OpCodes -BaseCommand.OP_REPLY = 1; -BaseCommand.OP_MSG = 1000; -BaseCommand.OP_UPDATE = 2001; -BaseCommand.OP_INSERT = 2002; -BaseCommand.OP_GET_BY_OID = 2003; -BaseCommand.OP_QUERY = 2004; -BaseCommand.OP_GET_MORE = 2005; -BaseCommand.OP_DELETE = 2006; -BaseCommand.OP_KILL_CURSORS = 2007; \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/db_command.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/db_command.js deleted file mode 100644 index 9e85ab0..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/db_command.js +++ /dev/null @@ -1,241 +0,0 @@ -var QueryCommand = require('./query_command').QueryCommand, - InsertCommand = require('./insert_command').InsertCommand, - inherits = require('util').inherits, - utils = require('../utils'), - crypto = require('crypto'); - -/** - Db Command -**/ -var DbCommand = exports.DbCommand = function(dbInstance, collectionName, queryOptions, numberToSkip, numberToReturn, query, returnFieldSelector, options) { - QueryCommand.call(this); - this.collectionName = collectionName; - this.queryOptions = queryOptions; - this.numberToSkip = numberToSkip; - this.numberToReturn = numberToReturn; - this.query = query; - this.returnFieldSelector = returnFieldSelector; - this.db = dbInstance; - - // Make sure we don't get a null exception - options = options == null ? {} : options; - // Let us defined on a command basis if we want functions to be serialized or not - if(options['serializeFunctions'] != null && options['serializeFunctions']) { - this.serializeFunctions = true; - } -}; - -inherits(DbCommand, QueryCommand); - -// Constants -DbCommand.SYSTEM_NAMESPACE_COLLECTION = "system.namespaces"; -DbCommand.SYSTEM_INDEX_COLLECTION = "system.indexes"; -DbCommand.SYSTEM_PROFILE_COLLECTION = "system.profile"; -DbCommand.SYSTEM_USER_COLLECTION = "system.users"; -DbCommand.SYSTEM_COMMAND_COLLECTION = "$cmd"; -DbCommand.SYSTEM_JS_COLLECTION = "system.js"; - -// New commands -DbCommand.NcreateIsMasterCommand = function(db, databaseName) { - return new DbCommand(db, databaseName + "." + DbCommand.SYSTEM_COMMAND_COLLECTION, QueryCommand.OPTS_NO_CURSOR_TIMEOUT, 0, -1, {'ismaster':1}, null); -}; - -// Provide constructors for different db commands -DbCommand.createIsMasterCommand = function(db) { - return new DbCommand(db, db.databaseName + "." + DbCommand.SYSTEM_COMMAND_COLLECTION, QueryCommand.OPTS_NO_CURSOR_TIMEOUT, 0, -1, {'ismaster':1}, null); -}; - -DbCommand.createCollectionInfoCommand = function(db, selector) { - return new DbCommand(db, db.databaseName + "." + DbCommand.SYSTEM_NAMESPACE_COLLECTION, QueryCommand.OPTS_NO_CURSOR_TIMEOUT, 0, 0, selector, null); -}; - -DbCommand.createGetNonceCommand = function(db, options) { - return new DbCommand(db, db.databaseName + "." + DbCommand.SYSTEM_COMMAND_COLLECTION, QueryCommand.OPTS_NO_CURSOR_TIMEOUT, 0, -1, {'getnonce':1}, null); -}; - -DbCommand.createAuthenticationCommand = function(db, username, password, nonce, authdb) { - // Use node md5 generator - var md5 = crypto.createHash('md5'); - // Generate keys used for authentication - md5.update(username + ":mongo:" + password); - var hash_password = md5.digest('hex'); - // Final key - md5 = crypto.createHash('md5'); - md5.update(nonce + username + hash_password); - var key = md5.digest('hex'); - // Creat selector - var selector = {'authenticate':1, 'user':username, 'nonce':nonce, 'key':key}; - // Create db command - return new DbCommand(db, authdb + "." + DbCommand.SYSTEM_COMMAND_COLLECTION, QueryCommand.OPTS_NONE, 0, -1, selector, null); -}; - -DbCommand.createLogoutCommand = function(db) { - return new DbCommand(db, db.databaseName + "." + DbCommand.SYSTEM_COMMAND_COLLECTION, QueryCommand.OPTS_NO_CURSOR_TIMEOUT, 0, -1, {'logout':1}, null); -}; - -DbCommand.createCreateCollectionCommand = function(db, collectionName, options) { - var selector = {'create':collectionName}; - // Modify the options to ensure correct behaviour - for(var name in options) { - if(options[name] != null && options[name].constructor != Function) selector[name] = options[name]; - } - // Execute the command - return new DbCommand(db, db.databaseName + "." + DbCommand.SYSTEM_COMMAND_COLLECTION, QueryCommand.OPTS_NO_CURSOR_TIMEOUT, 0, -1, selector, null); -}; - -DbCommand.createDropCollectionCommand = function(db, collectionName) { - return new DbCommand(db, db.databaseName + "." + DbCommand.SYSTEM_COMMAND_COLLECTION, QueryCommand.OPTS_NO_CURSOR_TIMEOUT, 0, -1, {'drop':collectionName}, null); -}; - -DbCommand.createRenameCollectionCommand = function(db, fromCollectionName, toCollectionName, options) { - var renameCollection = db.databaseName + "." + fromCollectionName; - var toCollection = db.databaseName + "." + toCollectionName; - var dropTarget = options && options.dropTarget ? options.dropTarget : false; - return new DbCommand(db, "admin." + DbCommand.SYSTEM_COMMAND_COLLECTION, QueryCommand.OPTS_NO_CURSOR_TIMEOUT, 0, -1, {'renameCollection':renameCollection, 'to':toCollection, 'dropTarget':dropTarget}, null); -}; - -DbCommand.createGetLastErrorCommand = function(options, db) { - - if (typeof db === 'undefined') { - db = options; - options = {}; - } - // Final command - var command = {'getlasterror':1}; - // If we have an options Object let's merge in the fields (fsync/wtimeout/w) - if('object' === typeof options) { - for(var name in options) { - command[name] = options[name] - } - } - - // Special case for w == 1, remove the w - if(1 == command.w) { - delete command.w; - } - - // Execute command - return new DbCommand(db, db.databaseName + "." + DbCommand.SYSTEM_COMMAND_COLLECTION, QueryCommand.OPTS_NO_CURSOR_TIMEOUT, 0, -1, command, null); -}; - -DbCommand.createGetLastStatusCommand = DbCommand.createGetLastErrorCommand; - -DbCommand.createGetPreviousErrorsCommand = function(db) { - return new DbCommand(db, db.databaseName + "." + DbCommand.SYSTEM_COMMAND_COLLECTION, QueryCommand.OPTS_NO_CURSOR_TIMEOUT, 0, -1, {'getpreverror':1}, null); -}; - -DbCommand.createResetErrorHistoryCommand = function(db) { - return new DbCommand(db, db.databaseName + "." + DbCommand.SYSTEM_COMMAND_COLLECTION, QueryCommand.OPTS_NO_CURSOR_TIMEOUT, 0, -1, {'reseterror':1}, null); -}; - -DbCommand.createCreateIndexCommand = function(db, collectionName, fieldOrSpec, options) { - var fieldHash = {}; - var indexes = []; - var keys; - - // Get all the fields accordingly - if('string' == typeof fieldOrSpec) { - // 'type' - indexes.push(fieldOrSpec + '_' + 1); - fieldHash[fieldOrSpec] = 1; - - } else if(utils.isArray(fieldOrSpec)) { - - fieldOrSpec.forEach(function(f) { - if('string' == typeof f) { - // [{location:'2d'}, 'type'] - indexes.push(f + '_' + 1); - fieldHash[f] = 1; - } else if(utils.isArray(f)) { - // [['location', '2d'],['type', 1]] - indexes.push(f[0] + '_' + (f[1] || 1)); - fieldHash[f[0]] = f[1] || 1; - } else if(utils.isObject(f)) { - // [{location:'2d'}, {type:1}] - keys = Object.keys(f); - keys.forEach(function(k) { - indexes.push(k + '_' + f[k]); - fieldHash[k] = f[k]; - }); - } else { - // undefined (ignore) - } - }); - - } else if(utils.isObject(fieldOrSpec)) { - // {location:'2d', type:1} - keys = Object.keys(fieldOrSpec); - keys.forEach(function(key) { - indexes.push(key + '_' + fieldOrSpec[key]); - fieldHash[key] = fieldOrSpec[key]; - }); - } - - // Generate the index name - var indexName = typeof options.name == 'string' - ? options.name - : indexes.join("_"); - - var selector = { - 'ns': db.databaseName + "." + collectionName, - 'key': fieldHash, - 'name': indexName - } - - // Ensure we have a correct finalUnique - var finalUnique = options == null || 'object' === typeof options - ? false - : options; - - // Set up options - options = options == null || typeof options == 'boolean' - ? {} - : options; - - // Add all the options - var keys = Object.keys(options); - for(var i = 0; i < keys.length; i++) { - selector[keys[i]] = options[keys[i]]; - } - - if(selector['unique'] == null) - selector['unique'] = finalUnique; - - var name = db.databaseName + "." + DbCommand.SYSTEM_INDEX_COLLECTION; - var cmd = new InsertCommand(db, name, false); - return cmd.add(selector); -}; - -DbCommand.logoutCommand = function(db, command_hash, options) { - var dbName = options != null && options['authdb'] != null ? options['authdb'] : db.databaseName; - // Create logout command - return new DbCommand(db, dbName + "." + DbCommand.SYSTEM_COMMAND_COLLECTION, QueryCommand.OPTS_NO_CURSOR_TIMEOUT, 0, -1, command_hash, null); -} - -DbCommand.createDropIndexCommand = function(db, collectionName, indexName) { - return new DbCommand(db, db.databaseName + "." + DbCommand.SYSTEM_COMMAND_COLLECTION, QueryCommand.OPTS_NO_CURSOR_TIMEOUT, 0, -1, {'deleteIndexes':collectionName, 'index':indexName}, null); -}; - -DbCommand.createReIndexCommand = function(db, collectionName) { - return new DbCommand(db, db.databaseName + "." + DbCommand.SYSTEM_COMMAND_COLLECTION, QueryCommand.OPTS_NO_CURSOR_TIMEOUT, 0, -1, {'reIndex':collectionName}, null); -}; - -DbCommand.createDropDatabaseCommand = function(db) { - return new DbCommand(db, db.databaseName + "." + DbCommand.SYSTEM_COMMAND_COLLECTION, QueryCommand.OPTS_NO_CURSOR_TIMEOUT, 0, -1, {'dropDatabase':1}, null); -}; - -DbCommand.createDbCommand = function(db, command_hash, options) { - return new DbCommand(db, db.databaseName + "." + DbCommand.SYSTEM_COMMAND_COLLECTION, QueryCommand.OPTS_NO_CURSOR_TIMEOUT, 0, -1, command_hash, null, options); -}; - -DbCommand.createAdminDbCommand = function(db, command_hash) { - return new DbCommand(db, "admin." + DbCommand.SYSTEM_COMMAND_COLLECTION, QueryCommand.OPTS_NO_CURSOR_TIMEOUT, 0, -1, command_hash, null); -}; - -DbCommand.createAdminDbCommandSlaveOk = function(db, command_hash) { - return new DbCommand(db, "admin." + DbCommand.SYSTEM_COMMAND_COLLECTION, QueryCommand.OPTS_NO_CURSOR_TIMEOUT | QueryCommand.OPTS_SLAVE, 0, -1, command_hash, null); -}; - -DbCommand.createDbSlaveOkCommand = function(db, command_hash, options) { - return new DbCommand(db, db.databaseName + "." + DbCommand.SYSTEM_COMMAND_COLLECTION, QueryCommand.OPTS_NO_CURSOR_TIMEOUT | QueryCommand.OPTS_SLAVE, 0, -1, command_hash, null, options); -}; diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/delete_command.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/delete_command.js deleted file mode 100644 index e6ae20a..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/delete_command.js +++ /dev/null @@ -1,114 +0,0 @@ -var BaseCommand = require('./base_command').BaseCommand, - inherits = require('util').inherits; - -/** - Insert Document Command -**/ -var DeleteCommand = exports.DeleteCommand = function(db, collectionName, selector, flags) { - BaseCommand.call(this); - - // Validate correctness off the selector - var object = selector; - if(Buffer.isBuffer(object)) { - var object_size = object[0] | object[1] << 8 | object[2] << 16 | object[3] << 24; - if(object_size != object.length) { - var error = new Error("delete raw message size does not match message header size [" + object.length + "] != [" + object_size + "]"); - error.name = 'MongoError'; - throw error; - } - } - - this.flags = flags; - this.collectionName = collectionName; - this.selector = selector; - this.db = db; -}; - -inherits(DeleteCommand, BaseCommand); - -DeleteCommand.OP_DELETE = 2006; - -/* -struct { - MsgHeader header; // standard message header - int32 ZERO; // 0 - reserved for future use - cstring fullCollectionName; // "dbname.collectionname" - int32 ZERO; // 0 - reserved for future use - mongo.BSON selector; // query object. See below for details. -} -*/ -DeleteCommand.prototype.toBinary = function() { - // Calculate total length of the document - var totalLengthOfCommand = 4 + Buffer.byteLength(this.collectionName) + 1 + 4 + this.db.bson.calculateObjectSize(this.selector, false, true) + (4 * 4); - // Let's build the single pass buffer command - var _index = 0; - var _command = new Buffer(totalLengthOfCommand); - // Write the header information to the buffer - _command[_index + 3] = (totalLengthOfCommand >> 24) & 0xff; - _command[_index + 2] = (totalLengthOfCommand >> 16) & 0xff; - _command[_index + 1] = (totalLengthOfCommand >> 8) & 0xff; - _command[_index] = totalLengthOfCommand & 0xff; - // Adjust index - _index = _index + 4; - // Write the request ID - _command[_index + 3] = (this.requestId >> 24) & 0xff; - _command[_index + 2] = (this.requestId >> 16) & 0xff; - _command[_index + 1] = (this.requestId >> 8) & 0xff; - _command[_index] = this.requestId & 0xff; - // Adjust index - _index = _index + 4; - // Write zero - _command[_index++] = 0; - _command[_index++] = 0; - _command[_index++] = 0; - _command[_index++] = 0; - // Write the op_code for the command - _command[_index + 3] = (DeleteCommand.OP_DELETE >> 24) & 0xff; - _command[_index + 2] = (DeleteCommand.OP_DELETE >> 16) & 0xff; - _command[_index + 1] = (DeleteCommand.OP_DELETE >> 8) & 0xff; - _command[_index] = DeleteCommand.OP_DELETE & 0xff; - // Adjust index - _index = _index + 4; - - // Write zero - _command[_index++] = 0; - _command[_index++] = 0; - _command[_index++] = 0; - _command[_index++] = 0; - - // Write the collection name to the command - _index = _index + _command.write(this.collectionName, _index, 'utf8') + 1; - _command[_index - 1] = 0; - - // Write the flags - _command[_index + 3] = (this.flags >> 24) & 0xff; - _command[_index + 2] = (this.flags >> 16) & 0xff; - _command[_index + 1] = (this.flags >> 8) & 0xff; - _command[_index] = this.flags & 0xff; - // Adjust index - _index = _index + 4; - - // Document binary length - var documentLength = 0 - - // Serialize the selector - // If we are passing a raw buffer, do minimal validation - if(Buffer.isBuffer(this.selector)) { - documentLength = this.selector.length; - // Copy the data into the current buffer - this.selector.copy(_command, _index); - } else { - documentLength = this.db.bson.serializeWithBufferAndIndex(this.selector, this.checkKeys, _command, _index) - _index + 1; - } - - // Write the length to the document - _command[_index + 3] = (documentLength >> 24) & 0xff; - _command[_index + 2] = (documentLength >> 16) & 0xff; - _command[_index + 1] = (documentLength >> 8) & 0xff; - _command[_index] = documentLength & 0xff; - // Update index in buffer - _index = _index + documentLength; - // Add terminating 0 for the object - _command[_index - 1] = 0; - return _command; -}; \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/get_more_command.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/get_more_command.js deleted file mode 100644 index d3aac02..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/get_more_command.js +++ /dev/null @@ -1,83 +0,0 @@ -var BaseCommand = require('./base_command').BaseCommand, - inherits = require('util').inherits, - binaryutils = require('../utils'); - -/** - Get More Document Command -**/ -var GetMoreCommand = exports.GetMoreCommand = function(db, collectionName, numberToReturn, cursorId) { - BaseCommand.call(this); - - this.collectionName = collectionName; - this.numberToReturn = numberToReturn; - this.cursorId = cursorId; - this.db = db; -}; - -inherits(GetMoreCommand, BaseCommand); - -GetMoreCommand.OP_GET_MORE = 2005; - -GetMoreCommand.prototype.toBinary = function() { - // Calculate total length of the document - var totalLengthOfCommand = 4 + Buffer.byteLength(this.collectionName) + 1 + 4 + 8 + (4 * 4); - // Let's build the single pass buffer command - var _index = 0; - var _command = new Buffer(totalLengthOfCommand); - // Write the header information to the buffer - _command[_index++] = totalLengthOfCommand & 0xff; - _command[_index++] = (totalLengthOfCommand >> 8) & 0xff; - _command[_index++] = (totalLengthOfCommand >> 16) & 0xff; - _command[_index++] = (totalLengthOfCommand >> 24) & 0xff; - - // Write the request ID - _command[_index++] = this.requestId & 0xff; - _command[_index++] = (this.requestId >> 8) & 0xff; - _command[_index++] = (this.requestId >> 16) & 0xff; - _command[_index++] = (this.requestId >> 24) & 0xff; - - // Write zero - _command[_index++] = 0; - _command[_index++] = 0; - _command[_index++] = 0; - _command[_index++] = 0; - - // Write the op_code for the command - _command[_index++] = GetMoreCommand.OP_GET_MORE & 0xff; - _command[_index++] = (GetMoreCommand.OP_GET_MORE >> 8) & 0xff; - _command[_index++] = (GetMoreCommand.OP_GET_MORE >> 16) & 0xff; - _command[_index++] = (GetMoreCommand.OP_GET_MORE >> 24) & 0xff; - - // Write zero - _command[_index++] = 0; - _command[_index++] = 0; - _command[_index++] = 0; - _command[_index++] = 0; - - // Write the collection name to the command - _index = _index + _command.write(this.collectionName, _index, 'utf8') + 1; - _command[_index - 1] = 0; - - // Number of documents to return - _command[_index++] = this.numberToReturn & 0xff; - _command[_index++] = (this.numberToReturn >> 8) & 0xff; - _command[_index++] = (this.numberToReturn >> 16) & 0xff; - _command[_index++] = (this.numberToReturn >> 24) & 0xff; - - // Encode the cursor id - var low_bits = this.cursorId.getLowBits(); - // Encode low bits - _command[_index++] = low_bits & 0xff; - _command[_index++] = (low_bits >> 8) & 0xff; - _command[_index++] = (low_bits >> 16) & 0xff; - _command[_index++] = (low_bits >> 24) & 0xff; - - var high_bits = this.cursorId.getHighBits(); - // Encode high bits - _command[_index++] = high_bits & 0xff; - _command[_index++] = (high_bits >> 8) & 0xff; - _command[_index++] = (high_bits >> 16) & 0xff; - _command[_index++] = (high_bits >> 24) & 0xff; - // Return command - return _command; -}; \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/insert_command.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/insert_command.js deleted file mode 100644 index d6a2100..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/insert_command.js +++ /dev/null @@ -1,147 +0,0 @@ -var BaseCommand = require('./base_command').BaseCommand, - inherits = require('util').inherits; - -/** - Insert Document Command -**/ -var InsertCommand = exports.InsertCommand = function(db, collectionName, checkKeys, options) { - BaseCommand.call(this); - - this.collectionName = collectionName; - this.documents = []; - this.checkKeys = checkKeys == null ? true : checkKeys; - this.db = db; - this.flags = 0; - this.serializeFunctions = false; - - // Ensure valid options hash - options = options == null ? {} : options; - - // Check if we have keepGoing set -> set flag if it's the case - if(options['keepGoing'] != null && options['keepGoing']) { - // This will finish inserting all non-index violating documents even if it returns an error - this.flags = 1; - } - - // Check if we have keepGoing set -> set flag if it's the case - if(options['continueOnError'] != null && options['continueOnError']) { - // This will finish inserting all non-index violating documents even if it returns an error - this.flags = 1; - } - - // Let us defined on a command basis if we want functions to be serialized or not - if(options['serializeFunctions'] != null && options['serializeFunctions']) { - this.serializeFunctions = true; - } -}; - -inherits(InsertCommand, BaseCommand); - -// OpCodes -InsertCommand.OP_INSERT = 2002; - -InsertCommand.prototype.add = function(document) { - if(Buffer.isBuffer(document)) { - var object_size = document[0] | document[1] << 8 | document[2] << 16 | document[3] << 24; - if(object_size != document.length) { - var error = new Error("insert raw message size does not match message header size [" + document.length + "] != [" + object_size + "]"); - error.name = 'MongoError'; - throw error; - } - } - - this.documents.push(document); - return this; -}; - -/* -struct { - MsgHeader header; // standard message header - int32 ZERO; // 0 - reserved for future use - cstring fullCollectionName; // "dbname.collectionname" - BSON[] documents; // one or more documents to insert into the collection -} -*/ -InsertCommand.prototype.toBinary = function() { - // Calculate total length of the document - var totalLengthOfCommand = 4 + Buffer.byteLength(this.collectionName) + 1 + (4 * 4); - // var docLength = 0 - for(var i = 0; i < this.documents.length; i++) { - if(Buffer.isBuffer(this.documents[i])) { - totalLengthOfCommand += this.documents[i].length; - } else { - // Calculate size of document - totalLengthOfCommand += this.db.bson.calculateObjectSize(this.documents[i], this.serializeFunctions, true); - } - } - - // Let's build the single pass buffer command - var _index = 0; - var _command = new Buffer(totalLengthOfCommand); - // Write the header information to the buffer - _command[_index + 3] = (totalLengthOfCommand >> 24) & 0xff; - _command[_index + 2] = (totalLengthOfCommand >> 16) & 0xff; - _command[_index + 1] = (totalLengthOfCommand >> 8) & 0xff; - _command[_index] = totalLengthOfCommand & 0xff; - // Adjust index - _index = _index + 4; - // Write the request ID - _command[_index + 3] = (this.requestId >> 24) & 0xff; - _command[_index + 2] = (this.requestId >> 16) & 0xff; - _command[_index + 1] = (this.requestId >> 8) & 0xff; - _command[_index] = this.requestId & 0xff; - // Adjust index - _index = _index + 4; - // Write zero - _command[_index++] = 0; - _command[_index++] = 0; - _command[_index++] = 0; - _command[_index++] = 0; - // Write the op_code for the command - _command[_index + 3] = (InsertCommand.OP_INSERT >> 24) & 0xff; - _command[_index + 2] = (InsertCommand.OP_INSERT >> 16) & 0xff; - _command[_index + 1] = (InsertCommand.OP_INSERT >> 8) & 0xff; - _command[_index] = InsertCommand.OP_INSERT & 0xff; - // Adjust index - _index = _index + 4; - // Write flags if any - _command[_index + 3] = (this.flags >> 24) & 0xff; - _command[_index + 2] = (this.flags >> 16) & 0xff; - _command[_index + 1] = (this.flags >> 8) & 0xff; - _command[_index] = this.flags & 0xff; - // Adjust index - _index = _index + 4; - // Write the collection name to the command - _index = _index + _command.write(this.collectionName, _index, 'utf8') + 1; - _command[_index - 1] = 0; - - // Write all the bson documents to the buffer at the index offset - for(var i = 0; i < this.documents.length; i++) { - // Document binary length - var documentLength = 0 - var object = this.documents[i]; - - // Serialize the selector - // If we are passing a raw buffer, do minimal validation - if(Buffer.isBuffer(object)) { - documentLength = object.length; - // Copy the data into the current buffer - object.copy(_command, _index); - } else { - // Serialize the document straight to the buffer - documentLength = this.db.bson.serializeWithBufferAndIndex(object, this.checkKeys, _command, _index, this.serializeFunctions) - _index + 1; - } - - // Write the length to the document - _command[_index + 3] = (documentLength >> 24) & 0xff; - _command[_index + 2] = (documentLength >> 16) & 0xff; - _command[_index + 1] = (documentLength >> 8) & 0xff; - _command[_index] = documentLength & 0xff; - // Update index in buffer - _index = _index + documentLength; - // Add terminating 0 for the object - _command[_index - 1] = 0; - } - - return _command; -}; diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/kill_cursor_command.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/kill_cursor_command.js deleted file mode 100644 index d8ccb0c..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/kill_cursor_command.js +++ /dev/null @@ -1,98 +0,0 @@ -var BaseCommand = require('./base_command').BaseCommand, - inherits = require('util').inherits, - binaryutils = require('../utils'); - -/** - Insert Document Command -**/ -var KillCursorCommand = exports.KillCursorCommand = function(db, cursorIds) { - BaseCommand.call(this); - - this.cursorIds = cursorIds; - this.db = db; -}; - -inherits(KillCursorCommand, BaseCommand); - -KillCursorCommand.OP_KILL_CURSORS = 2007; - -/* -struct { - MsgHeader header; // standard message header - int32 ZERO; // 0 - reserved for future use - int32 numberOfCursorIDs; // number of cursorIDs in message - int64[] cursorIDs; // array of cursorIDs to close -} -*/ -KillCursorCommand.prototype.toBinary = function() { - // Calculate total length of the document - var totalLengthOfCommand = 4 + 4 + (4 * 4) + (this.cursorIds.length * 8); - // Let's build the single pass buffer command - var _index = 0; - var _command = new Buffer(totalLengthOfCommand); - // Write the header information to the buffer - _command[_index + 3] = (totalLengthOfCommand >> 24) & 0xff; - _command[_index + 2] = (totalLengthOfCommand >> 16) & 0xff; - _command[_index + 1] = (totalLengthOfCommand >> 8) & 0xff; - _command[_index] = totalLengthOfCommand & 0xff; - // Adjust index - _index = _index + 4; - // Write the request ID - _command[_index + 3] = (this.requestId >> 24) & 0xff; - _command[_index + 2] = (this.requestId >> 16) & 0xff; - _command[_index + 1] = (this.requestId >> 8) & 0xff; - _command[_index] = this.requestId & 0xff; - // Adjust index - _index = _index + 4; - // Write zero - _command[_index++] = 0; - _command[_index++] = 0; - _command[_index++] = 0; - _command[_index++] = 0; - // Write the op_code for the command - _command[_index + 3] = (KillCursorCommand.OP_KILL_CURSORS >> 24) & 0xff; - _command[_index + 2] = (KillCursorCommand.OP_KILL_CURSORS >> 16) & 0xff; - _command[_index + 1] = (KillCursorCommand.OP_KILL_CURSORS >> 8) & 0xff; - _command[_index] = KillCursorCommand.OP_KILL_CURSORS & 0xff; - // Adjust index - _index = _index + 4; - - // Write zero - _command[_index++] = 0; - _command[_index++] = 0; - _command[_index++] = 0; - _command[_index++] = 0; - - // Number of cursors to kill - var numberOfCursors = this.cursorIds.length; - _command[_index + 3] = (numberOfCursors >> 24) & 0xff; - _command[_index + 2] = (numberOfCursors >> 16) & 0xff; - _command[_index + 1] = (numberOfCursors >> 8) & 0xff; - _command[_index] = numberOfCursors & 0xff; - // Adjust index - _index = _index + 4; - - // Encode all the cursors - for(var i = 0; i < this.cursorIds.length; i++) { - // Encode the cursor id - var low_bits = this.cursorIds[i].getLowBits(); - // Encode low bits - _command[_index + 3] = (low_bits >> 24) & 0xff; - _command[_index + 2] = (low_bits >> 16) & 0xff; - _command[_index + 1] = (low_bits >> 8) & 0xff; - _command[_index] = low_bits & 0xff; - // Adjust index - _index = _index + 4; - - var high_bits = this.cursorIds[i].getHighBits(); - // Encode high bits - _command[_index + 3] = (high_bits >> 24) & 0xff; - _command[_index + 2] = (high_bits >> 16) & 0xff; - _command[_index + 1] = (high_bits >> 8) & 0xff; - _command[_index] = high_bits & 0xff; - // Adjust index - _index = _index + 4; - } - - return _command; -}; \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/query_command.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/query_command.js deleted file mode 100644 index 76829d9..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/query_command.js +++ /dev/null @@ -1,261 +0,0 @@ -var BaseCommand = require('./base_command').BaseCommand, - inherits = require('util').inherits; - -/** - Insert Document Command -**/ -var QueryCommand = exports.QueryCommand = function(db, collectionName, queryOptions, numberToSkip, numberToReturn, query, returnFieldSelector, options) { - BaseCommand.call(this); - - // Validate correctness off the selector - var object = query, - object_size; - if(Buffer.isBuffer(object)) { - object_size = object[0] | object[1] << 8 | object[2] << 16 | object[3] << 24; - if(object_size != object.length) { - var error = new Error("query selector raw message size does not match message header size [" + object.length + "] != [" + object_size + "]"); - error.name = 'MongoError'; - throw error; - } - } - - object = returnFieldSelector; - if(Buffer.isBuffer(object)) { - object_size = object[0] | object[1] << 8 | object[2] << 16 | object[3] << 24; - if(object_size != object.length) { - var error = new Error("query fields raw message size does not match message header size [" + object.length + "] != [" + object_size + "]"); - error.name = 'MongoError'; - throw error; - } - } - - // Make sure we don't get a null exception - options = options == null ? {} : options; - // Set up options - this.collectionName = collectionName; - this.queryOptions = queryOptions; - this.numberToSkip = numberToSkip; - this.numberToReturn = numberToReturn; - - // Ensure we have no null query - query = query == null ? {} : query; - // Wrap query in the $query parameter so we can add read preferences for mongos - this.query = query; - this.returnFieldSelector = returnFieldSelector; - this.db = db; - - // Let us defined on a command basis if we want functions to be serialized or not - if(options['serializeFunctions'] != null && options['serializeFunctions']) { - this.serializeFunctions = true; - } -}; - -inherits(QueryCommand, BaseCommand); - -QueryCommand.OP_QUERY = 2004; - -/* - * Adds the read prefrence to the current command - */ -QueryCommand.prototype.setMongosReadPreference = function(readPreference, tags) { - // If we have readPreference set to true set to secondary prefered - if(readPreference == true) { - readPreference = 'secondaryPreferred'; - } else if(readPreference == 'false') { - readPreference = 'primary'; - } - - // Force the slave ok flag to be set if we are not using primary read preference - if(readPreference != false && readPreference != 'primary') { - this.queryOptions |= QueryCommand.OPTS_SLAVE; - } - - // Backward compatibility, ensure $query only set on read preference so 1.8.X works - if((readPreference != null || tags != null) && this.query['$query'] == null) { - this.query = {'$query': this.query}; - } - - // If we have no readPreference set and no tags, check if the slaveOk bit is set - if(readPreference == null && tags == null) { - // If we have a slaveOk bit set the read preference for MongoS - if(this.queryOptions & QueryCommand.OPTS_SLAVE) { - this.query['$readPreference'] = {mode: 'secondary'} - } else { - this.query['$readPreference'] = {mode: 'primary'} - } - } - - // Build read preference object - if(typeof readPreference == 'object' && readPreference['_type'] == 'ReadPreference') { - this.query['$readPreference'] = readPreference.toObject(); - } else if(readPreference != null) { - // Add the read preference - this.query['$readPreference'] = {mode: readPreference}; - - // If we have tags let's add them - if(tags != null) { - this.query['$readPreference']['tags'] = tags; - } - } -} - -/* -struct { - MsgHeader header; // standard message header - int32 opts; // query options. See below for details. - cstring fullCollectionName; // "dbname.collectionname" - int32 numberToSkip; // number of documents to skip when returning results - int32 numberToReturn; // number of documents to return in the first OP_REPLY - BSON query ; // query object. See below for details. - [ BSON returnFieldSelector; ] // OPTIONAL : selector indicating the fields to return. See below for details. -} -*/ -QueryCommand.prototype.toBinary = function() { - // Total length of the command - var totalLengthOfCommand = 0; - // Calculate total length of the document - if(Buffer.isBuffer(this.query)) { - totalLengthOfCommand = 4 + Buffer.byteLength(this.collectionName) + 1 + 4 + 4 + this.query.length + (4 * 4); - } else { - totalLengthOfCommand = 4 + Buffer.byteLength(this.collectionName) + 1 + 4 + 4 + this.db.bson.calculateObjectSize(this.query, this.serializeFunctions, true) + (4 * 4); - } - - // Calculate extra fields size - if(this.returnFieldSelector != null && !(Buffer.isBuffer(this.returnFieldSelector))) { - if(Object.keys(this.returnFieldSelector).length > 0) { - totalLengthOfCommand += this.db.bson.calculateObjectSize(this.returnFieldSelector, this.serializeFunctions, true); - } - } else if(Buffer.isBuffer(this.returnFieldSelector)) { - totalLengthOfCommand += this.returnFieldSelector.length; - } - - // Let's build the single pass buffer command - var _index = 0; - var _command = new Buffer(totalLengthOfCommand); - // Write the header information to the buffer - _command[_index + 3] = (totalLengthOfCommand >> 24) & 0xff; - _command[_index + 2] = (totalLengthOfCommand >> 16) & 0xff; - _command[_index + 1] = (totalLengthOfCommand >> 8) & 0xff; - _command[_index] = totalLengthOfCommand & 0xff; - // Adjust index - _index = _index + 4; - // Write the request ID - _command[_index + 3] = (this.requestId >> 24) & 0xff; - _command[_index + 2] = (this.requestId >> 16) & 0xff; - _command[_index + 1] = (this.requestId >> 8) & 0xff; - _command[_index] = this.requestId & 0xff; - // Adjust index - _index = _index + 4; - // Write zero - _command[_index++] = 0; - _command[_index++] = 0; - _command[_index++] = 0; - _command[_index++] = 0; - // Write the op_code for the command - _command[_index + 3] = (QueryCommand.OP_QUERY >> 24) & 0xff; - _command[_index + 2] = (QueryCommand.OP_QUERY >> 16) & 0xff; - _command[_index + 1] = (QueryCommand.OP_QUERY >> 8) & 0xff; - _command[_index] = QueryCommand.OP_QUERY & 0xff; - // Adjust index - _index = _index + 4; - - // Write the query options - _command[_index + 3] = (this.queryOptions >> 24) & 0xff; - _command[_index + 2] = (this.queryOptions >> 16) & 0xff; - _command[_index + 1] = (this.queryOptions >> 8) & 0xff; - _command[_index] = this.queryOptions & 0xff; - // Adjust index - _index = _index + 4; - - // Write the collection name to the command - _index = _index + _command.write(this.collectionName, _index, 'utf8') + 1; - _command[_index - 1] = 0; - - // Write the number of documents to skip - _command[_index + 3] = (this.numberToSkip >> 24) & 0xff; - _command[_index + 2] = (this.numberToSkip >> 16) & 0xff; - _command[_index + 1] = (this.numberToSkip >> 8) & 0xff; - _command[_index] = this.numberToSkip & 0xff; - // Adjust index - _index = _index + 4; - - // Write the number of documents to return - _command[_index + 3] = (this.numberToReturn >> 24) & 0xff; - _command[_index + 2] = (this.numberToReturn >> 16) & 0xff; - _command[_index + 1] = (this.numberToReturn >> 8) & 0xff; - _command[_index] = this.numberToReturn & 0xff; - // Adjust index - _index = _index + 4; - - // Document binary length - var documentLength = 0 - var object = this.query; - - // Serialize the selector - if(Buffer.isBuffer(object)) { - documentLength = object.length; - // Copy the data into the current buffer - object.copy(_command, _index); - } else { - // Serialize the document straight to the buffer - documentLength = this.db.bson.serializeWithBufferAndIndex(object, this.checkKeys, _command, _index, this.serializeFunctions) - _index + 1; - } - - // Write the length to the document - _command[_index + 3] = (documentLength >> 24) & 0xff; - _command[_index + 2] = (documentLength >> 16) & 0xff; - _command[_index + 1] = (documentLength >> 8) & 0xff; - _command[_index] = documentLength & 0xff; - // Update index in buffer - _index = _index + documentLength; - // Add terminating 0 for the object - _command[_index - 1] = 0; - - // Push field selector if available - if(this.returnFieldSelector != null && !(Buffer.isBuffer(this.returnFieldSelector))) { - if(Object.keys(this.returnFieldSelector).length > 0) { - var documentLength = this.db.bson.serializeWithBufferAndIndex(this.returnFieldSelector, this.checkKeys, _command, _index, this.serializeFunctions) - _index + 1; - // Write the length to the document - _command[_index + 3] = (documentLength >> 24) & 0xff; - _command[_index + 2] = (documentLength >> 16) & 0xff; - _command[_index + 1] = (documentLength >> 8) & 0xff; - _command[_index] = documentLength & 0xff; - // Update index in buffer - _index = _index + documentLength; - // Add terminating 0 for the object - _command[_index - 1] = 0; - } - } if(this.returnFieldSelector != null && Buffer.isBuffer(this.returnFieldSelector)) { - // Document binary length - var documentLength = 0 - var object = this.returnFieldSelector; - - // Serialize the selector - documentLength = object.length; - // Copy the data into the current buffer - object.copy(_command, _index); - - // Write the length to the document - _command[_index + 3] = (documentLength >> 24) & 0xff; - _command[_index + 2] = (documentLength >> 16) & 0xff; - _command[_index + 1] = (documentLength >> 8) & 0xff; - _command[_index] = documentLength & 0xff; - // Update index in buffer - _index = _index + documentLength; - // Add terminating 0 for the object - _command[_index - 1] = 0; - } - - // Return finished command - return _command; -}; - -// Constants -QueryCommand.OPTS_NONE = 0; -QueryCommand.OPTS_TAILABLE_CURSOR = 2; -QueryCommand.OPTS_SLAVE = 4; -QueryCommand.OPTS_OPLOG_REPLY = 8; -QueryCommand.OPTS_NO_CURSOR_TIMEOUT = 16; -QueryCommand.OPTS_AWAIT_DATA = 32; -QueryCommand.OPTS_EXHAUST = 64; -QueryCommand.OPTS_PARTIAL = 128; \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/update_command.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/update_command.js deleted file mode 100644 index 9829dea..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/commands/update_command.js +++ /dev/null @@ -1,174 +0,0 @@ -var BaseCommand = require('./base_command').BaseCommand, - inherits = require('util').inherits; - -/** - Update Document Command -**/ -var UpdateCommand = exports.UpdateCommand = function(db, collectionName, spec, document, options) { - BaseCommand.call(this); - - var object = spec; - if(Buffer.isBuffer(object)) { - var object_size = object[0] | object[1] << 8 | object[2] << 16 | object[3] << 24; - if(object_size != object.length) { - var error = new Error("update spec raw message size does not match message header size [" + object.length + "] != [" + object_size + "]"); - error.name = 'MongoError'; - throw error; - } - } - - var object = document; - if(Buffer.isBuffer(object)) { - var object_size = object[0] | object[1] << 8 | object[2] << 16 | object[3] << 24; - if(object_size != object.length) { - var error = new Error("update document raw message size does not match message header size [" + object.length + "] != [" + object_size + "]"); - error.name = 'MongoError'; - throw error; - } - } - - this.collectionName = collectionName; - this.spec = spec; - this.document = document; - this.db = db; - this.serializeFunctions = false; - - // Generate correct flags - var db_upsert = 0; - var db_multi_update = 0; - db_upsert = options != null && options['upsert'] != null ? (options['upsert'] == true ? 1 : 0) : db_upsert; - db_multi_update = options != null && options['multi'] != null ? (options['multi'] == true ? 1 : 0) : db_multi_update; - - // Flags - this.flags = parseInt(db_multi_update.toString() + db_upsert.toString(), 2); - // Let us defined on a command basis if we want functions to be serialized or not - if(options['serializeFunctions'] != null && options['serializeFunctions']) { - this.serializeFunctions = true; - } -}; - -inherits(UpdateCommand, BaseCommand); - -UpdateCommand.OP_UPDATE = 2001; - -/* -struct { - MsgHeader header; // standard message header - int32 ZERO; // 0 - reserved for future use - cstring fullCollectionName; // "dbname.collectionname" - int32 flags; // bit vector. see below - BSON spec; // the query to select the document - BSON document; // the document data to update with or insert -} -*/ -UpdateCommand.prototype.toBinary = function() { - // Calculate total length of the document - var totalLengthOfCommand = 4 + Buffer.byteLength(this.collectionName) + 1 + 4 + this.db.bson.calculateObjectSize(this.spec, false, true) + - this.db.bson.calculateObjectSize(this.document, this.serializeFunctions, true) + (4 * 4); - - // Let's build the single pass buffer command - var _index = 0; - var _command = new Buffer(totalLengthOfCommand); - // Write the header information to the buffer - _command[_index + 3] = (totalLengthOfCommand >> 24) & 0xff; - _command[_index + 2] = (totalLengthOfCommand >> 16) & 0xff; - _command[_index + 1] = (totalLengthOfCommand >> 8) & 0xff; - _command[_index] = totalLengthOfCommand & 0xff; - // Adjust index - _index = _index + 4; - // Write the request ID - _command[_index + 3] = (this.requestId >> 24) & 0xff; - _command[_index + 2] = (this.requestId >> 16) & 0xff; - _command[_index + 1] = (this.requestId >> 8) & 0xff; - _command[_index] = this.requestId & 0xff; - // Adjust index - _index = _index + 4; - // Write zero - _command[_index++] = 0; - _command[_index++] = 0; - _command[_index++] = 0; - _command[_index++] = 0; - // Write the op_code for the command - _command[_index + 3] = (UpdateCommand.OP_UPDATE >> 24) & 0xff; - _command[_index + 2] = (UpdateCommand.OP_UPDATE >> 16) & 0xff; - _command[_index + 1] = (UpdateCommand.OP_UPDATE >> 8) & 0xff; - _command[_index] = UpdateCommand.OP_UPDATE & 0xff; - // Adjust index - _index = _index + 4; - - // Write zero - _command[_index++] = 0; - _command[_index++] = 0; - _command[_index++] = 0; - _command[_index++] = 0; - - // Write the collection name to the command - _index = _index + _command.write(this.collectionName, _index, 'utf8') + 1; - _command[_index - 1] = 0; - - // Write the update flags - _command[_index + 3] = (this.flags >> 24) & 0xff; - _command[_index + 2] = (this.flags >> 16) & 0xff; - _command[_index + 1] = (this.flags >> 8) & 0xff; - _command[_index] = this.flags & 0xff; - // Adjust index - _index = _index + 4; - - // Document binary length - var documentLength = 0 - var object = this.spec; - - // Serialize the selector - // If we are passing a raw buffer, do minimal validation - if(Buffer.isBuffer(object)) { - var object_size = object[0] | object[1] << 8 | object[2] << 16 | object[3] << 24; - if(object_size != object.length) throw new Error("raw message size does not match message header size [" + object.length + "] != [" + object_size + "]"); - documentLength = object.length; - // Copy the data into the current buffer - object.copy(_command, _index); - } else { - documentLength = this.db.bson.serializeWithBufferAndIndex(object, this.checkKeys, _command, _index, false) - _index + 1; - } - - // Write the length to the document - _command[_index + 3] = (documentLength >> 24) & 0xff; - _command[_index + 2] = (documentLength >> 16) & 0xff; - _command[_index + 1] = (documentLength >> 8) & 0xff; - _command[_index] = documentLength & 0xff; - // Update index in buffer - _index = _index + documentLength; - // Add terminating 0 for the object - _command[_index - 1] = 0; - - // Document binary length - var documentLength = 0 - var object = this.document; - - // Serialize the document - // If we are passing a raw buffer, do minimal validation - if(Buffer.isBuffer(object)) { - var object_size = object[0] | object[1] << 8 | object[2] << 16 | object[3] << 24; - if(object_size != object.length) throw new Error("raw message size does not match message header size [" + object.length + "] != [" + object_size + "]"); - documentLength = object.length; - // Copy the data into the current buffer - object.copy(_command, _index); - } else { - documentLength = this.db.bson.serializeWithBufferAndIndex(object, this.checkKeys, _command, _index, this.serializeFunctions) - _index + 1; - } - - // Write the length to the document - _command[_index + 3] = (documentLength >> 24) & 0xff; - _command[_index + 2] = (documentLength >> 16) & 0xff; - _command[_index + 1] = (documentLength >> 8) & 0xff; - _command[_index] = documentLength & 0xff; - // Update index in buffer - _index = _index + documentLength; - // Add terminating 0 for the object - _command[_index - 1] = 0; - - return _command; -}; - -// Constants -UpdateCommand.DB_UPSERT = 0; -UpdateCommand.DB_MULTI_UPDATE = 1; \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/base.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/base.js deleted file mode 100644 index e93463c..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/base.js +++ /dev/null @@ -1,169 +0,0 @@ -var EventEmitter = require('events').EventEmitter - , inherits = require('util').inherits; - -/** - * Internal class for callback storage - * @ignore - */ -var CallbackStore = function() { - // Make class an event emitter - EventEmitter.call(this); - // Add a info about call variable - this._notReplied = {}; -} - -/** - * @ignore - */ -inherits(CallbackStore, EventEmitter); - -var Base = function Base() { - EventEmitter.call(this); - - // Callback store is part of connection specification - if(Base._callBackStore == null) { - Base._callBackStore = new CallbackStore(); - } - - // this._callBackStore = Base._callBackStore; - this._callBackStore = new CallbackStore(); -} - -/** - * @ignore - */ -inherits(Base, EventEmitter); - -/** - * Fire all the errors - * @ignore - */ -Base.prototype.__executeAllCallbacksWithError = function(err) { - // Check all callbacks - var keys = Object.keys(this._callBackStore._notReplied); - // For each key check if it's a callback that needs to be returned - for(var j = 0; j < keys.length; j++) { - var info = this._callBackStore._notReplied[keys[j]]; - // Check if we have a chained command (findAndModify) - if(info && info['chained'] && Array.isArray(info['chained']) && info['chained'].length > 0) { - var chained = info['chained']; - // Only callback once and the last one is the right one - var finalCallback = chained.pop(); - // Emit only the last event - this._callBackStore.emit(finalCallback, err, null); - - // Put back the final callback to ensure we don't call all commands in the chain - chained.push(finalCallback); - - // Remove all chained callbacks - for(var i = 0; i < chained.length; i++) { - delete this._callBackStore._notReplied[chained[i]]; - } - } else { - this._callBackStore.emit(keys[j], err, null); - } - } -} - -/** - * Register a handler - * @ignore - * @api private - */ -Base.prototype._registerHandler = function(db_command, raw, connection, exhaust, callback) { - // If we have an array of commands, chain them - var chained = Array.isArray(db_command); - - // Check if we have exhausted - if(typeof exhaust == 'function') { - callback = exhaust; - exhaust = false; - } - - // If they are chained we need to add a special handler situation - if(chained) { - // List off chained id's - var chainedIds = []; - // Add all id's - for(var i = 0; i < db_command.length; i++) chainedIds.push(db_command[i].getRequestId().toString()); - // Register all the commands together - for(var i = 0; i < db_command.length; i++) { - var command = db_command[i]; - // Add the callback to the store - this._callBackStore.once(command.getRequestId(), callback); - // Add the information about the reply - this._callBackStore._notReplied[command.getRequestId().toString()] = {start: new Date().getTime(), 'raw': raw, chained:chainedIds, connection:connection, exhaust:false}; - } - } else { - // Add the callback to the list of handlers - this._callBackStore.once(db_command.getRequestId(), callback); - // Add the information about the reply - this._callBackStore._notReplied[db_command.getRequestId().toString()] = {start: new Date().getTime(), 'raw': raw, connection:connection, exhaust:exhaust}; - } -} - -/** - * Re-Register a handler, on the cursor id f.ex - * @ignore - * @api private - */ -Base.prototype._reRegisterHandler = function(newId, object, callback) { - // Add the callback to the list of handlers - this._callBackStore.once(newId, object.callback.listener); - // Add the information about the reply - this._callBackStore._notReplied[newId] = object.info; -} - -/** - * - * @ignore - * @api private - */ -Base.prototype._callHandler = function(id, document, err) { - // If there is a callback peform it - if(this._callBackStore.listeners(id).length >= 1) { - // Get info object - var info = this._callBackStore._notReplied[id]; - // Delete the current object - delete this._callBackStore._notReplied[id]; - // Emit to the callback of the object - this._callBackStore.emit(id, err, document, info.connection); - } -} - -/** - * - * @ignore - * @api private - */ -Base.prototype._hasHandler = function(id) { - // If there is a callback peform it - return this._callBackStore.listeners(id).length >= 1; -} - -/** - * - * @ignore - * @api private - */ -Base.prototype._removeHandler = function(id) { - // Remove the information - if(this._callBackStore._notReplied[id] != null) delete this._callBackStore._notReplied[id]; - // Remove the callback if it's registered - this._callBackStore.removeAllListeners(id); - // Force cleanup _events, node.js seems to set it as a null value - if(this._callBackStore._events != null) delete this._callBackStore._events[id]; -} - -/** - * - * @ignore - * @api private - */ -Base.prototype._findHandler = function(id) { - var info = this._callBackStore._notReplied[id]; - // Return the callback - return {info:info, callback:(this._callBackStore.listeners(id).length >= 1) ? this._callBackStore.listeners(id)[0] : null} -} - -exports.Base = Base; \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection.js deleted file mode 100644 index 14cbeee..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection.js +++ /dev/null @@ -1,494 +0,0 @@ -var utils = require('./connection_utils'), - inherits = require('util').inherits, - net = require('net'), - EventEmitter = require('events').EventEmitter, - inherits = require('util').inherits, - binaryutils = require('../utils'), - tls = require('tls'); - -var Connection = exports.Connection = function(id, socketOptions) { - // Set up event emitter - EventEmitter.call(this); - // Store all socket options - this.socketOptions = socketOptions ? socketOptions : {host:'localhost', port:27017, domainSocket:false}; - // Set keep alive default if not overriden - if(this.socketOptions.keepAlive == null && (process.platform !== "sunos" || process.platform !== "win32")) this.socketOptions.keepAlive = 100; - // Id for the connection - this.id = id; - // State of the connection - this.connected = false; - // Set if this is a domain socket - this.domainSocket = this.socketOptions.domainSocket; - - // - // Connection parsing state - // - this.maxBsonSize = socketOptions.maxBsonSize ? socketOptions.maxBsonSize : Connection.DEFAULT_MAX_BSON_SIZE; - // Contains the current message bytes - this.buffer = null; - // Contains the current message size - this.sizeOfMessage = 0; - // Contains the readIndex for the messaage - this.bytesRead = 0; - // Contains spill over bytes from additional messages - this.stubBuffer = 0; - - // Just keeps list of events we allow - this.eventHandlers = {error:[], parseError:[], poolReady:[], message:[], close:[], timeout:[], end:[]}; - - // Just keeps list of events we allow - resetHandlers(this, false); -} - -// Set max bson size -Connection.DEFAULT_MAX_BSON_SIZE = 1024 * 1024 * 4; - -// Inherit event emitter so we can emit stuff wohoo -inherits(Connection, EventEmitter); - -Connection.prototype.start = function() { - var self = this; - - // If we have a normal connection - if(this.socketOptions.ssl) { - // Create new connection instance - if(this.domainSocket) { - this.connection = net.createConnection(this.socketOptions.host); - } else { - this.connection = net.createConnection(this.socketOptions.port, this.socketOptions.host); - } - if(this.logger != null && this.logger.doDebug){ - this.logger.debug("opened connection", this.socketOptions); - } - // Set options on the socket - this.connection.setTimeout(this.socketOptions.connectTimeoutMS != null ? this.socketOptions.connectTimeoutMS : this.socketOptions.timeout); - // Work around for 0.4.X - if(process.version.indexOf("v0.4") == -1) this.connection.setNoDelay(this.socketOptions.noDelay); - // Set keep alive if defined - if(process.version.indexOf("v0.4") == -1) { - if(this.socketOptions.keepAlive > 0) { - this.connection.setKeepAlive(true, this.socketOptions.keepAlive); - } else { - this.connection.setKeepAlive(false); - } - } - - // Check if the driver should validate the certificate - var validate_certificates = this.socketOptions.sslValidate == true ? true : false; - - // Create options for the tls connection - var tls_options = { - socket: this.connection - , rejectUnauthorized: false - } - - // If we wish to validate the certificate we have provided a ca store - if(validate_certificates) { - tls_options.ca = this.socketOptions.sslCA; - } - - // If we have a certificate to present - if(this.socketOptions.sslCert) { - tls_options.cert = this.socketOptions.sslCert; - tls_options.key = this.socketOptions.sslKey; - // Allow for a combined cert/key pem file being passed in as cert parameter - // if(tls_options.key == null) { - // tls_options.key = this.socketOptions.ssl_cert; - // } - } - - // If the driver has been provided a private key password - if(this.socketOptions.sslPass) { - tls_options.passphrase = this.socketOptions.sslPass; - } - - // Contains the cleartext stream - var cleartext = null; - // Attempt to establish a TLS connection to the server - try { - cleartext = tls.connect(this.socketOptions.port, this.socketOptions.host, tls_options, function() { - // If we have a ssl certificate validation error return an error - if(cleartext.authorizationError && validate_certificates) { - // Emit an error - return self.emit("error", cleartext.authorizationError, self, {ssl:true}); - } - - // Connect to the server - connectHandler(self)(); - }) - } catch(err) { - return self.emit("error", "SSL connection failed", self, {ssl:true}); - } - - // Save the output stream - this.writeSteam = cleartext; - - // Set up data handler for the clear stream - cleartext.on("data", createDataHandler(this)); - // Do any handling of end event of the stream - cleartext.on("end", endHandler(this)); - cleartext.on("error", errorHandler(this)); - - // Handle any errors - this.connection.on("error", errorHandler(this)); - // Handle timeout - this.connection.on("timeout", timeoutHandler(this)); - // Handle drain event - this.connection.on("drain", drainHandler(this)); - // Handle the close event - this.connection.on("close", closeHandler(this)); - } else { - // Create new connection instance - if(this.domainSocket) { - this.connection = net.createConnection(this.socketOptions.host); - } else { - this.connection = net.createConnection(this.socketOptions.port, this.socketOptions.host); - } - if(this.logger != null && this.logger.doDebug){ - this.logger.debug("opened connection", this.socketOptions); - } - - // Set options on the socket - this.connection.setTimeout(this.socketOptions.connectTimeoutMS != null ? this.socketOptions.connectTimeoutMS : this.socketOptions.timeout); - // Work around for 0.4.X - if(process.version.indexOf("v0.4") == -1) this.connection.setNoDelay(this.socketOptions.noDelay); - // Set keep alive if defined - if(process.version.indexOf("v0.4") == -1) { - if(this.socketOptions.keepAlive > 0) { - this.connection.setKeepAlive(true, this.socketOptions.keepAlive); - } else { - this.connection.setKeepAlive(false); - } - } - - // Set up write stream - this.writeSteam = this.connection; - // Add handlers - this.connection.on("error", errorHandler(this)); - // Add all handlers to the socket to manage it - this.connection.on("connect", connectHandler(this)); - // this.connection.on("end", endHandler(this)); - this.connection.on("data", createDataHandler(this)); - this.connection.on("timeout", timeoutHandler(this)); - this.connection.on("drain", drainHandler(this)); - this.connection.on("close", closeHandler(this)); - } -} - -// Check if the sockets are live -Connection.prototype.isConnected = function() { - return this.connected && !this.connection.destroyed && this.connection.writable && this.connection.readable; -} - -// Write the data out to the socket -Connection.prototype.write = function(command, callback) { - try { - // If we have a list off commands to be executed on the same socket - if(Array.isArray(command)) { - for(var i = 0; i < command.length; i++) { - var binaryCommand = command[i].toBinary() - if(!this.socketOptions['disableDriverBSONSizeCheck'] && binaryCommand.length > this.maxBsonSize) - return callback(new Error("Document exceeds maximal allowed bson size of " + this.maxBsonSize + " bytes")); - if(this.logger != null && this.logger.doDebug) - this.logger.debug("writing command to mongodb", {binary: binaryCommand, json: command[i]}); - - var r = this.writeSteam.write(binaryCommand); - } - } else { - var binaryCommand = command.toBinary() - if(!this.socketOptions['disableDriverBSONSizeCheck'] && binaryCommand.length > this.maxBsonSize) - return callback(new Error("Document exceeds maximal allowed bson size of " + this.maxBsonSize + " bytes")); - - if(this.logger != null && this.logger.doDebug) - this.logger.debug("writing command to mongodb", {binary: binaryCommand, json: command}); - - var r = this.writeSteam.write(binaryCommand); - } - } catch (err) { - if(typeof callback === 'function') callback(err); - } -} - -// Force the closure of the connection -Connection.prototype.close = function() { - // clear out all the listeners - resetHandlers(this, true); - // Add a dummy error listener to catch any weird last moment errors (and ignore them) - this.connection.on("error", function() {}) - // destroy connection - this.connection.destroy(); - if(this.logger != null && this.logger.doDebug){ - this.logger.debug("closed connection", this.connection); - } -} - -// Reset all handlers -var resetHandlers = function(self, clearListeners) { - self.eventHandlers = {error:[], connect:[], close:[], end:[], timeout:[], parseError:[], message:[]}; - - // If we want to clear all the listeners - if(clearListeners && self.connection != null) { - var keys = Object.keys(self.eventHandlers); - // Remove all listeners - for(var i = 0; i < keys.length; i++) { - self.connection.removeAllListeners(keys[i]); - } - } -} - -// -// Handlers -// - -// Connect handler -var connectHandler = function(self) { - return function(data) { - // Set connected - self.connected = true; - // Now that we are connected set the socket timeout - self.connection.setTimeout(self.socketOptions.socketTimeoutMS != null ? self.socketOptions.socketTimeoutMS : self.socketOptions.timeout); - // Emit the connect event with no error - self.emit("connect", null, self); - } -} - -var createDataHandler = exports.Connection.createDataHandler = function(self) { - // We need to handle the parsing of the data - // and emit the messages when there is a complete one - return function(data) { - // Parse until we are done with the data - while(data.length > 0) { - // If we still have bytes to read on the current message - if(self.bytesRead > 0 && self.sizeOfMessage > 0) { - // Calculate the amount of remaining bytes - var remainingBytesToRead = self.sizeOfMessage - self.bytesRead; - // Check if the current chunk contains the rest of the message - if(remainingBytesToRead > data.length) { - // Copy the new data into the exiting buffer (should have been allocated when we know the message size) - data.copy(self.buffer, self.bytesRead); - // Adjust the number of bytes read so it point to the correct index in the buffer - self.bytesRead = self.bytesRead + data.length; - - // Reset state of buffer - data = new Buffer(0); - } else { - // Copy the missing part of the data into our current buffer - data.copy(self.buffer, self.bytesRead, 0, remainingBytesToRead); - // Slice the overflow into a new buffer that we will then re-parse - data = data.slice(remainingBytesToRead); - - // Emit current complete message - try { - var emitBuffer = self.buffer; - // Reset state of buffer - self.buffer = null; - self.sizeOfMessage = 0; - self.bytesRead = 0; - self.stubBuffer = null; - // Emit the buffer - self.emit("message", emitBuffer, self); - } catch(err) { - var errorObject = {err:"socketHandler", trace:err, bin:buffer, parseState:{ - sizeOfMessage:self.sizeOfMessage, - bytesRead:self.bytesRead, - stubBuffer:self.stubBuffer}}; - if(self.logger != null && self.logger.doError) self.logger.error("parseError", errorObject); - // We got a parse Error fire it off then keep going - self.emit("parseError", errorObject, self); - } - } - } else { - // Stub buffer is kept in case we don't get enough bytes to determine the - // size of the message (< 4 bytes) - if(self.stubBuffer != null && self.stubBuffer.length > 0) { - - // If we have enough bytes to determine the message size let's do it - if(self.stubBuffer.length + data.length > 4) { - // Prepad the data - var newData = new Buffer(self.stubBuffer.length + data.length); - self.stubBuffer.copy(newData, 0); - data.copy(newData, self.stubBuffer.length); - // Reassign for parsing - data = newData; - - // Reset state of buffer - self.buffer = null; - self.sizeOfMessage = 0; - self.bytesRead = 0; - self.stubBuffer = null; - - } else { - - // Add the the bytes to the stub buffer - var newStubBuffer = new Buffer(self.stubBuffer.length + data.length); - // Copy existing stub buffer - self.stubBuffer.copy(newStubBuffer, 0); - // Copy missing part of the data - data.copy(newStubBuffer, self.stubBuffer.length); - // Exit parsing loop - data = new Buffer(0); - } - } else { - if(data.length > 4) { - // Retrieve the message size - var sizeOfMessage = binaryutils.decodeUInt32(data, 0); - // If we have a negative sizeOfMessage emit error and return - if(sizeOfMessage < 0 || sizeOfMessage > self.maxBsonSize) { - var errorObject = {err:"socketHandler", trace:'', bin:self.buffer, parseState:{ - sizeOfMessage: sizeOfMessage, - bytesRead: self.bytesRead, - stubBuffer: self.stubBuffer}}; - if(self.logger != null && self.logger.doError) self.logger.error("parseError", errorObject); - // We got a parse Error fire it off then keep going - self.emit("parseError", errorObject, self); - return; - } - - // Ensure that the size of message is larger than 0 and less than the max allowed - if(sizeOfMessage > 4 && sizeOfMessage < self.maxBsonSize && sizeOfMessage > data.length) { - self.buffer = new Buffer(sizeOfMessage); - // Copy all the data into the buffer - data.copy(self.buffer, 0); - // Update bytes read - self.bytesRead = data.length; - // Update sizeOfMessage - self.sizeOfMessage = sizeOfMessage; - // Ensure stub buffer is null - self.stubBuffer = null; - // Exit parsing loop - data = new Buffer(0); - - } else if(sizeOfMessage > 4 && sizeOfMessage < self.maxBsonSize && sizeOfMessage == data.length) { - try { - var emitBuffer = data; - // Reset state of buffer - self.buffer = null; - self.sizeOfMessage = 0; - self.bytesRead = 0; - self.stubBuffer = null; - // Exit parsing loop - data = new Buffer(0); - // Emit the message - self.emit("message", emitBuffer, self); - } catch (err) { - var errorObject = {err:"socketHandler", trace:err, bin:self.buffer, parseState:{ - sizeOfMessage:self.sizeOfMessage, - bytesRead:self.bytesRead, - stubBuffer:self.stubBuffer}}; - if(self.logger != null && self.logger.doError) self.logger.error("parseError", errorObject); - // We got a parse Error fire it off then keep going - self.emit("parseError", errorObject, self); - } - } else if(sizeOfMessage <= 4 || sizeOfMessage > self.maxBsonSize) { - var errorObject = {err:"socketHandler", trace:null, bin:data, parseState:{ - sizeOfMessage:sizeOfMessage, - bytesRead:0, - buffer:null, - stubBuffer:null}}; - if(self.logger != null && self.logger.doError) self.logger.error("parseError", errorObject); - // We got a parse Error fire it off then keep going - self.emit("parseError", errorObject, self); - - // Clear out the state of the parser - self.buffer = null; - self.sizeOfMessage = 0; - self.bytesRead = 0; - self.stubBuffer = null; - // Exit parsing loop - data = new Buffer(0); - - } else { - try { - var emitBuffer = data.slice(0, sizeOfMessage); - // Reset state of buffer - self.buffer = null; - self.sizeOfMessage = 0; - self.bytesRead = 0; - self.stubBuffer = null; - // Copy rest of message - data = data.slice(sizeOfMessage); - // Emit the message - self.emit("message", emitBuffer, self); - } catch (err) { - var errorObject = {err:"socketHandler", trace:err, bin:self.buffer, parseState:{ - sizeOfMessage:sizeOfMessage, - bytesRead:self.bytesRead, - stubBuffer:self.stubBuffer}}; - if(self.logger != null && self.logger.doError) self.logger.error("parseError", errorObject); - // We got a parse Error fire it off then keep going - self.emit("parseError", errorObject, self); - } - - } - } else { - // Create a buffer that contains the space for the non-complete message - self.stubBuffer = new Buffer(data.length) - // Copy the data to the stub buffer - data.copy(self.stubBuffer, 0); - // Exit parsing loop - data = new Buffer(0); - } - } - } - } - } -} - -var endHandler = function(self) { - return function() { - // Set connected to false - self.connected = false; - // Emit end event - self.emit("end", {err: 'connection received Fin packet from [' + self.socketOptions.host + ':' + self.socketOptions.port + ']'}, self); - } -} - -var timeoutHandler = function(self) { - return function() { - // Set connected to false - self.connected = false; - // Emit timeout event - self.emit("timeout", {err: 'connection to [' + self.socketOptions.host + ':' + self.socketOptions.port + '] timed out'}, self); - } -} - -var drainHandler = function(self) { - return function() { - } -} - -var errorHandler = function(self) { - return function(err) { - // Set connected to false - self.connected = false; - // Emit error - self.emit("error", {err: 'failed to connect to [' + self.socketOptions.host + ':' + self.socketOptions.port + ']'}, self); - } -} - -var closeHandler = function(self) { - return function(hadError) { - // If we have an error during the connection phase - if(hadError && !self.connected) { - // Set disconnected - self.connected = false; - // Emit error - self.emit("error", {err: 'failed to connect to [' + self.socketOptions.host + ':' + self.socketOptions.port + ']'}, self); - } else { - // Set disconnected - self.connected = false; - // Emit close - self.emit("close", {err: 'connection closed to [' + self.socketOptions.host + ':' + self.socketOptions.port + ']'}, self); - } - } -} - -// Some basic defaults -Connection.DEFAULT_PORT = 27017; - - - - - - - diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection_pool.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection_pool.js deleted file mode 100644 index 8e6f3ee..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection_pool.js +++ /dev/null @@ -1,278 +0,0 @@ -var utils = require('./connection_utils'), - inherits = require('util').inherits, - net = require('net'), - EventEmitter = require('events').EventEmitter, - inherits = require('util').inherits, - MongoReply = require("../responses/mongo_reply").MongoReply, - Connection = require("./connection").Connection; - -var ConnectionPool = exports.ConnectionPool = function(host, port, poolSize, bson, socketOptions) { - if(typeof host !== 'string') { - throw new Error("host must be specified [" + host + "]"); - } - - // Set up event emitter - EventEmitter.call(this); - - // Keep all options for the socket in a specific collection allowing the user to specify the - // Wished upon socket connection parameters - this.socketOptions = typeof socketOptions === 'object' ? socketOptions : {}; - this.socketOptions.host = host; - this.socketOptions.port = port; - this.socketOptions.domainSocket = false; - this.bson = bson; - // PoolSize is always + 1 for special reserved "measurment" socket (like ping, stats etc) - this.poolSize = poolSize; - this.minPoolSize = Math.floor(this.poolSize / 2) + 1; - - // Check if the host is a socket - if(host.match(/^\//)) { - this.socketOptions.domainSocket = true; - } else if(typeof port === 'string') { - try { - port = parseInt(port, 10); - } catch(err) { - new Error("port must be specified or valid integer[" + port + "]"); - } - } else if(typeof port !== 'number') { - throw new Error("port must be specified [" + port + "]"); - } - - // Set default settings for the socket options - utils.setIntegerParameter(this.socketOptions, 'timeout', 0); - // Delay before writing out the data to the server - utils.setBooleanParameter(this.socketOptions, 'noDelay', true); - // Delay before writing out the data to the server - utils.setIntegerParameter(this.socketOptions, 'keepAlive', 0); - // Set the encoding of the data read, default is binary == null - utils.setStringParameter(this.socketOptions, 'encoding', null); - // Allows you to set a throttling bufferSize if you need to stop overflows - utils.setIntegerParameter(this.socketOptions, 'bufferSize', 0); - - // Internal structures - this.openConnections = []; - // Assign connection id's - this.connectionId = 0; - - // Current index for selection of pool connection - this.currentConnectionIndex = 0; - // The pool state - this._poolState = 'disconnected'; - // timeout control - this._timeout = false; - // Time to wait between connections for the pool - this._timeToWait = 10; -} - -inherits(ConnectionPool, EventEmitter); - -ConnectionPool.prototype.setMaxBsonSize = function(maxBsonSize) { - if(maxBsonSize == null){ - maxBsonSize = Connection.DEFAULT_MAX_BSON_SIZE; - } - - for(var i = 0; i < this.openConnections.length; i++) { - this.openConnections[i].maxBsonSize = maxBsonSize; - } -} - -// Start a function -var _connect = function(_self) { - // return new function() { - // Create a new connection instance - var connection = new Connection(_self.connectionId++, _self.socketOptions); - // Set logger on pool - connection.logger = _self.logger; - // Connect handler - connection.on("connect", function(err, connection) { - // Add connection to list of open connections - _self.openConnections.push(connection); - // If the number of open connections is equal to the poolSize signal ready pool - if(_self.openConnections.length === _self.poolSize && _self._poolState !== 'disconnected') { - // Set connected - _self._poolState = 'connected'; - // Emit pool ready - _self.emit("poolReady"); - } else if(_self.openConnections.length < _self.poolSize) { - // Wait a little bit of time to let the close event happen if the server closes the connection - // so we don't leave hanging connections around - if(typeof _self._timeToWait == 'number') { - setTimeout(function() { - // If we are still connecting (no close events fired in between start another connection) - if(_self._poolState == 'connecting') { - _connect(_self); - } - }, _self._timeToWait); - } else { - process.nextTick(function() { - // If we are still connecting (no close events fired in between start another connection) - if(_self._poolState == 'connecting') { - _connect(_self); - } - }); - } - } - }); - - var numberOfErrors = 0 - - // Error handler - connection.on("error", function(err, connection, error_options) { - numberOfErrors++; - // If we are already disconnected ignore the event - if(_self._poolState != 'disconnected' && _self.listeners("error").length > 0) { - _self.emit("error", err, connection, error_options); - } - - // Close the connection - connection.close(); - // Set pool as disconnected - _self._poolState = 'disconnected'; - // Stop the pool - _self.stop(); - }); - - // Close handler - connection.on("close", function() { - // If we are already disconnected ignore the event - if(_self._poolState !== 'disconnected' && _self.listeners("close").length > 0) { - _self.emit("close"); - } - - // Set disconnected - _self._poolState = 'disconnected'; - // Stop - _self.stop(); - }); - - // Timeout handler - connection.on("timeout", function(err, connection) { - // If we are already disconnected ignore the event - if(_self._poolState !== 'disconnected' && _self.listeners("timeout").length > 0) { - _self.emit("timeout", err); - } - - // Close the connection - connection.close(); - // Set disconnected - _self._poolState = 'disconnected'; - _self.stop(); - }); - - // Parse error, needs a complete shutdown of the pool - connection.on("parseError", function() { - // If we are already disconnected ignore the event - if(_self._poolState !== 'disconnected' && _self.listeners("parseError").length > 0) { - _self.emit("parseError", new Error("parseError occured")); - } - - // Set disconnected - _self._poolState = 'disconnected'; - _self.stop(); - }); - - connection.on("message", function(message) { - _self.emit("message", message); - }); - - // Start connection in the next tick - connection.start(); - // }(); -} - - -// Start method, will throw error if no listeners are available -// Pass in an instance of the listener that contains the api for -// finding callbacks for a given message etc. -ConnectionPool.prototype.start = function() { - var markerDate = new Date().getTime(); - var self = this; - - if(this.listeners("poolReady").length == 0) { - throw "pool must have at least one listener ready that responds to the [poolReady] event"; - } - - // Set pool state to connecting - this._poolState = 'connecting'; - this._timeout = false; - - _connect(self); -} - -// Restart a connection pool (on a close the pool might be in a wrong state) -ConnectionPool.prototype.restart = function() { - // Close all connections - this.stop(false); - // Now restart the pool - this.start(); -} - -// Stop the connections in the pool -ConnectionPool.prototype.stop = function(removeListeners) { - removeListeners = removeListeners == null ? true : removeListeners; - // Set disconnected - this._poolState = 'disconnected'; - - // Clear all listeners if specified - if(removeListeners) { - this.removeAllEventListeners(); - } - - // Close all connections - for(var i = 0; i < this.openConnections.length; i++) { - this.openConnections[i].close(); - } - - // Clean up - this.openConnections = []; -} - -// Check the status of the connection -ConnectionPool.prototype.isConnected = function() { - return this._poolState === 'connected'; -} - -// Checkout a connection from the pool for usage, or grab a specific pool instance -ConnectionPool.prototype.checkoutConnection = function(id) { - var index = (this.currentConnectionIndex++ % (this.openConnections.length)); - var connection = this.openConnections[index]; - return connection; -} - -ConnectionPool.prototype.getAllConnections = function() { - return this.openConnections; -} - -// Remove all non-needed event listeners -ConnectionPool.prototype.removeAllEventListeners = function() { - this.removeAllListeners("close"); - this.removeAllListeners("error"); - this.removeAllListeners("timeout"); - this.removeAllListeners("connect"); - this.removeAllListeners("end"); - this.removeAllListeners("parseError"); - this.removeAllListeners("message"); - this.removeAllListeners("poolReady"); -} - - - - - - - - - - - - - - - - - - - - - - diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection_utils.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection_utils.js deleted file mode 100644 index 5910924..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection_utils.js +++ /dev/null @@ -1,23 +0,0 @@ -exports.setIntegerParameter = function(object, field, defaultValue) { - if(object[field] == null) { - object[field] = defaultValue; - } else if(typeof object[field] !== "number" && object[field] !== parseInt(object[field], 10)) { - throw "object field [" + field + "] must be a numeric integer value, attempted to set to [" + object[field] + "] type of [" + typeof object[field] + "]"; - } -} - -exports.setBooleanParameter = function(object, field, defaultValue) { - if(object[field] == null) { - object[field] = defaultValue; - } else if(typeof object[field] !== "boolean") { - throw "object field [" + field + "] must be a boolean value, attempted to set to [" + object[field] + "] type of [" + typeof object[field] + "]"; - } -} - -exports.setStringParameter = function(object, field, defaultValue) { - if(object[field] == null) { - object[field] = defaultValue; - } else if(typeof object[field] !== "string") { - throw "object field [" + field + "] must be a string value, attempted to set to [" + object[field] + "] type of [" + typeof object[field] + "]"; - } -} \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/mongos.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/mongos.js deleted file mode 100644 index 6bd1cdd..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/mongos.js +++ /dev/null @@ -1,357 +0,0 @@ -var ReadPreference = require('./read_preference').ReadPreference - , Base = require('./base').Base - , inherits = require('util').inherits; - -/** - * Mongos constructor provides a connection to a mongos proxy including failover to additional servers - * - * Options - * - **socketOptions** {Object, default:null}, an object containing socket options to use (noDelay:(boolean), keepAlive:(number), connectTimeoutMS:(number), socketTimeoutMS:(number)) - * - **ha** {Boolean, default:true}, turn on high availability, attempts to reconnect to down proxies - * - **haInterval** {Number, default:2000}, time between each replicaset status check. - * - * @class Represents a Mongos connection with failover to backup proxies - * @param {Array} list of mongos server objects - * @param {Object} [options] additional options for the mongos connection - */ -var Mongos = function Mongos(servers, options) { - // Set up basic - if(!(this instanceof Mongos)) - return new Mongos(servers, options); - - // Set up event emitter - Base.call(this); - - // Throw error on wrong setup - if(servers == null || !Array.isArray(servers) || servers.length == 0) - throw new Error("At least one mongos proxy must be in the array"); - - // Ensure we have at least an empty options object - this.options = options == null ? {} : options; - // Set default connection pool options - this.socketOptions = this.options.socketOptions != null ? this.options.socketOptions : {}; - // Enabled ha - this.haEnabled = this.options['ha'] == null ? true : this.options['ha']; - // How often are we checking for new servers in the replicaset - this.mongosStatusCheckInterval = this.options['haInterval'] == null ? 2000 : this.options['haInterval']; - // Save all the server connections - this.servers = servers; - // Servers we need to attempt reconnect with - this.downServers = []; - // Just contains the current lowest ping time and server - this.lowestPingTimeServer = null; - this.lowestPingTime = 0; - - // Connection timeout - this._connectTimeoutMS = this.socketOptions.connectTimeoutMS - ? this.socketOptions.connectTimeoutMS - : 1000; - - // Add options to servers - for(var i = 0; i < this.servers.length; i++) { - var server = this.servers[i]; - server._callBackStore = this._callBackStore; - // Default empty socket options object - var socketOptions = {host: server.host, port: server.port}; - // If a socket option object exists clone it - if(this.socketOptions != null) { - var keys = Object.keys(this.socketOptions); - for(var k = 0; k < keys.length;k++) socketOptions[keys[i]] = this.socketOptions[keys[i]]; - } - // Set socket options - server.socketOptions = socketOptions; - } -} - -/** - * @ignore - */ -inherits(Mongos, Base); - -/** - * @ignore - */ -Mongos.prototype.isMongos = function() { - return true; -} - -/** - * @ignore - */ -Mongos.prototype.connect = function(db, options, callback) { - if('function' === typeof options) callback = options, options = {}; - if(options == null) options = {}; - if(!('function' === typeof callback)) callback = null; - var self = this; - - // Keep reference to parent - this.db = db; - // Set server state to connecting - this._serverState = 'connecting'; - // Number of total servers that need to initialized (known servers) - this._numberOfServersLeftToInitialize = this.servers.length; - // Default to the first proxy server as the first one to use - this._currentMongos = this.servers[0]; - - // Connect handler - var connectHandler = function(_server) { - return function(err, result) { - self._numberOfServersLeftToInitialize = self._numberOfServersLeftToInitialize - 1; - - if(self._numberOfServersLeftToInitialize == 0) { - // Start ha function if it exists - if(self.haEnabled) { - // Setup the ha process - self._replicasetTimeoutId = setTimeout(self.mongosCheckFunction, self.mongosStatusCheckInterval); - } - - // Set the mongos to connected - self._serverState = "connected"; - // Emit the open event - self.db.emit("open", null, self.db); - // Callback - callback(null, self.db); - } - } - }; - - // Error handler - var errorOrCloseHandler = function(_server) { - return function(err, result) { - // Create current mongos comparision - var currentUrl = self._currentMongos.host + ":" + self._currentMongos.port; - var serverUrl = this.host + ":" + this.port; - // We need to check if the server that closed is the actual current proxy we are using, otherwise - // just ignore - if(currentUrl == serverUrl) { - // Remove the server from the list - if(self.servers.indexOf(_server) != -1) { - self.servers.splice(self.servers.indexOf(_server), 1); - } - - // Pick the next one on the list if there is one - for(var i = 0; i < self.servers.length; i++) { - // Grab the server out of the array (making sure there is no servers in the list if none available) - var server = self.servers[i]; - // Generate url for comparision - var serverUrl = server.host + ":" + server.port; - // It's not the current one and connected set it as the current db - if(currentUrl != serverUrl && server.isConnected()) { - self._currentMongos = server; - break; - } - } - } - - // Ensure we don't store the _server twice - if(self.downServers.indexOf(_server) == -1) { - // Add the server instances - self.downServers.push(_server); - } - } - } - - // Mongo function - this.mongosCheckFunction = function() { - // If we have down servers let's attempt a reconnect - if(self.downServers.length > 0) { - var numberOfServersLeft = self.downServers.length; - // Attempt to reconnect - for(var i = 0; i < self.downServers.length; i++) { - var downServer = self.downServers.pop(); - - // Configuration - var options = { - slaveOk: true, - poolSize: 1, - socketOptions: { connectTimeoutMS: self._connectTimeoutMS }, - returnIsMasterResults: true - } - - // Attemp to reconnect - downServer.connect(self.db, options, function(_server) { - // Return a function to check for the values - return function(err, result) { - // Adjust the number of servers left - numberOfServersLeft = numberOfServersLeft - 1; - - if(err != null) { - self.downServers.push(_server); - } else { - // Add server event handlers - _server.on("close", errorOrCloseHandler(_server)); - _server.on("error", errorOrCloseHandler(_server)); - // Add to list of servers - self.servers.push(_server); - } - - if(numberOfServersLeft <= 0) { - // Perfom another ha - self._replicasetTimeoutId = setTimeout(self.mongosCheckFunction, self.mongosStatusCheckInterval); - } - } - }(downServer)); - } - } else if(self.servers.length > 0) { - var numberOfServersLeft = self.servers.length; - var _s = new Date().getTime() - - // Else let's perform a ping command - for(var i = 0; i < self.servers.length; i++) { - var executePing = function(_server) { - // Get a read connection - var _connection = _server.checkoutReader(); - // Execute ping command - self.db.command({ping:1}, {failFast:true, connection:_connection}, function(err, result) { - var pingTime = new Date().getTime() - _s; - // If no server set set the first one, otherwise check - // the lowest ping time and assign the server if it's got a lower ping time - if(self.lowestPingTimeServer == null) { - self.lowestPingTimeServer = _server; - self.lowestPingTime = pingTime; - self._currentMongos = _server; - } else if(self.lowestPingTime > pingTime - && (_server.host != self.lowestPingTimeServer.host || _server.port != self.lowestPingTimeServer.port)) { - self.lowestPingTimeServer = _server; - self.lowestPingTime = pingTime; - self._currentMongos = _server; - } - - // Number of servers left - numberOfServersLeft = numberOfServersLeft - 1; - // All active mongos's pinged - if(numberOfServersLeft == 0) { - // Perfom another ha - self._replicasetTimeoutId = setTimeout(self.mongosCheckFunction, self.mongosStatusCheckInterval); - } - }) - } - - // Execute the function - executePing(self.servers[i]); - } - } else { - self._replicasetTimeoutId = setTimeout(self.mongosCheckFunction, self.mongosStatusCheckInterval); - } - } - - // Connect all the server instances - for(var i = 0; i < this.servers.length; i++) { - // Get the connection - var server = this.servers[i]; - server.mongosInstance = this; - // Add server event handlers - server.on("close", errorOrCloseHandler(server)); - server.on("timeout", errorOrCloseHandler(server)); - server.on("error", errorOrCloseHandler(server)); - // Configuration - var options = { - slaveOk: true, - poolSize: 1, - socketOptions: { connectTimeoutMS: self._connectTimeoutMS }, - returnIsMasterResults: true - } - - // Connect the instance - server.connect(self.db, options, connectHandler(server)); - } -} - -/** - * @ignore - * Just return the currently picked active connection - */ -Mongos.prototype.allServerInstances = function() { - return this.servers; -} - -/** - * Always ourselves - * @ignore - */ -Mongos.prototype.setReadPreference = function() {} - -/** - * @ignore - */ -Mongos.prototype.allRawConnections = function() { - // Neeed to build a complete list of all raw connections, start with master server - var allConnections = []; - // Add all connections - for(var i = 0; i < this.servers.length; i++) { - allConnections = allConnections.concat(this.servers[i].allRawConnections()); - } - - // Return all the conections - return allConnections; -} - -/** - * @ignore - */ -Mongos.prototype.isConnected = function() { - return this._serverState == "connected"; -} - -/** - * @ignore - */ -Mongos.prototype.checkoutWriter = function() { - // No current mongo, just pick first server - if(this._currentMongos == null && this.servers.length > 0) { - return this.servers[0].checkoutWriter(); - } - return this._currentMongos.checkoutWriter(); -} - -/** - * @ignore - */ -Mongos.prototype.checkoutReader = function(read) { - // If we have a read preference object unpack it - if(typeof read == 'object' && read['_type'] == 'ReadPreference') { - // Validate if the object is using a valid mode - if(!read.isValid()) throw new Error("Illegal readPreference mode specified, " + read.mode); - } else if(!ReadPreference.isValid(read)) { - throw new Error("Illegal readPreference mode specified, " + read); - } - - // No current mongo, just pick first server - if(this._currentMongos == null && this.servers.length > 0) { - return this.servers[0].checkoutReader(); - } - return this._currentMongos.checkoutReader(); -} - -/** - * @ignore - */ -Mongos.prototype.close = function(callback) { - var self = this; - // Set server status as disconnected - this._serverState = 'disconnected'; - // Number of connections to close - var numberOfConnectionsToClose = self.servers.length; - // If we have a ha process running kill it - if(self._replicasetTimeoutId != null) clearTimeout(self._replicasetTimeoutId); - // Close all proxy connections - for(var i = 0; i < self.servers.length; i++) { - self.servers[i].close(function(err, result) { - numberOfConnectionsToClose = numberOfConnectionsToClose - 1; - // Callback if we have one defined - if(numberOfConnectionsToClose == 0 && typeof callback == 'function') { - callback(null); - } - }); - } -} - -/** - * @ignore - * Return the used state - */ -Mongos.prototype._isUsed = function() { - return this._used; -} - -exports.Mongos = Mongos; \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/read_preference.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/read_preference.js deleted file mode 100644 index 4cba587..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/read_preference.js +++ /dev/null @@ -1,66 +0,0 @@ -/** - * A class representation of the Read Preference. - * - * Read Preferences - * - **ReadPreference.PRIMARY**, Read from primary only. All operations produce an error (throw an exception where applicable) if primary is unavailable. Cannot be combined with tags (This is the default.). - * - **ReadPreference.PRIMARY_PREFERRED**, Read from primary if available, otherwise a secondary. - * - **ReadPreference.SECONDARY**, Read from secondary if available, otherwise error. - * - **ReadPreference.SECONDARY_PREFERRED**, Read from a secondary if available, otherwise read from the primary. - * - **ReadPreference.NEAREST**, All modes read from among the nearest candidates, but unlike other modes, NEAREST will include both the primary and all secondaries in the random selection. - * - * @class Represents a Read Preference. - * @param {String} the read preference type - * @param {Object} tags - * @return {ReadPreference} - */ -var ReadPreference = function(mode, tags) { - if(!(this instanceof ReadPreference)) - return new ReadPreference(mode, tags); - this._type = 'ReadPreference'; - this.mode = mode; - this.tags = tags; -} - -/** - * @ignore - */ -ReadPreference.isValid = function(_mode) { - return (_mode == ReadPreference.PRIMARY || _mode == ReadPreference.PRIMARY_PREFERRED - || _mode == ReadPreference.SECONDARY || _mode == ReadPreference.SECONDARY_PREFERRED - || _mode == ReadPreference.NEAREST); -} - -/** - * @ignore - */ -ReadPreference.prototype.isValid = function(mode) { - var _mode = typeof mode == 'string' ? mode : this.mode; - return ReadPreference.isValid(_mode); -} - -/** - * @ignore - */ -ReadPreference.prototype.toObject = function() { - var object = {mode:this.mode}; - - if(this.tags != null) { - object['tags'] = this.tags; - } - - return object; -} - -/** - * @ignore - */ -ReadPreference.PRIMARY = 'primary'; -ReadPreference.PRIMARY_PREFERRED = 'primaryPreferred'; -ReadPreference.SECONDARY = 'secondary'; -ReadPreference.SECONDARY_PREFERRED = 'secondaryPreferred'; -ReadPreference.NEAREST = 'nearest' - -/** - * @ignore - */ -exports.ReadPreference = ReadPreference; \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/repl_set.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/repl_set.js deleted file mode 100644 index 860c9fe..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/repl_set.js +++ /dev/null @@ -1,1451 +0,0 @@ -var Connection = require('./connection').Connection, - ReadPreference = require('./read_preference').ReadPreference, - DbCommand = require('../commands/db_command').DbCommand, - MongoReply = require('../responses/mongo_reply').MongoReply, - debug = require('util').debug, - inherits = require('util').inherits, - inspect = require('util').inspect, - Server = require('./server').Server, - PingStrategy = require('./strategies/ping_strategy').PingStrategy, - StatisticsStrategy = require('./strategies/statistics_strategy').StatisticsStrategy, - Base = require('./base').Base; - -const STATE_STARTING_PHASE_1 = 0; -const STATE_PRIMARY = 1; -const STATE_SECONDARY = 2; -const STATE_RECOVERING = 3; -const STATE_FATAL_ERROR = 4; -const STATE_STARTING_PHASE_2 = 5; -const STATE_UNKNOWN = 6; -const STATE_ARBITER = 7; -const STATE_DOWN = 8; -const STATE_ROLLBACK = 9; - -/** - * ReplSet constructor provides replicaset functionality - * - * Options - * - **ha** {Boolean, default:true}, turn on high availability. - * - **haInterval** {Number, default:2000}, time between each replicaset status check. - * - **reconnectWait** {Number, default:1000}, time to wait in miliseconds before attempting reconnect. - * - **retries** {Number, default:30}, number of times to attempt a replicaset reconnect. - * - **rs_name** {String}, the name of the replicaset to connect to. - * - **socketOptions** {Object, default:null}, an object containing socket options to use (noDelay:(boolean), keepAlive:(number), connectTimeoutMS:(number), socketTimeoutMS:(number)) - * - **readPreference** {String}, the prefered read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). - * - **strategy** {String, default:'ping'}, selection strategy for reads choose between (ping, statistical and none, default is ping) - * - **secondaryAcceptableLatencyMS** {Number, default:15}, sets the range of servers to pick when using NEAREST (lowest ping ms + the latency fence, ex: range of 1 to (1 + 15) ms) - * - **connectArbiter** {Boolean, default:false}, sets if the driver should connect to arbiters or not. - * - **logger** {Object, default:null}, an object representing a logger that you want to use, needs to support functions debug, log, error **({error:function(message, object) {}, log:function(message, object) {}, debug:function(message, object) {}})**. - * - **ssl** {Boolean, default:false}, use ssl connection (needs to have a mongod server with ssl support) - * - **sslValidate** {Boolean, default:false}, validate mongod server certificate against ca (needs to have a mongod server with ssl support, 2.4 or higher) - * - **sslCA** {Array, default:null}, Array of valid certificates either as Buffers or Strings (needs to have a mongod server with ssl support, 2.4 or higher) - * - **sslCert** {Buffer/String, default:null}, String or buffer containing the certificate we wish to present (needs to have a mongod server with ssl support, 2.4 or higher) - * - **sslKey** {Buffer/String, default:null}, String or buffer containing the certificate private key we wish to present (needs to have a mongod server with ssl support, 2.4 or higher) - * - **sslPass** {Buffer/String, default:null}, String or buffer containing the certificate password (needs to have a mongod server with ssl support, 2.4 or higher) - * - * @class Represents a Replicaset Configuration - * @param {Array} list of server objects participating in the replicaset. - * @param {Object} [options] additional options for the replicaset connection. - */ -var ReplSet = exports.ReplSet = function(servers, options) { - this.count = 0; - - // Set up basic - if(!(this instanceof ReplSet)) - return new ReplSet(servers, options); - - // Set up event emitter - Base.call(this); - - // Ensure no Mongos's - for(var i = 0; i < servers.length; i++) { - if(!(servers[i] instanceof Server)) throw new Error("list of servers must be of type Server"); - } - - // Just reference for simplicity - var self = this; - // Contains the master server entry - this.options = options == null ? {} : options; - this.reconnectWait = this.options["reconnectWait"] != null ? this.options["reconnectWait"] : 1000; - this.retries = this.options["retries"] != null ? this.options["retries"] : 30; - this.replicaSet = this.options["rs_name"]; - - // Are we allowing reads from secondaries ? - this.readSecondary = this.options["read_secondary"]; - this.slaveOk = true; - this.closedConnectionCount = 0; - this._used = false; - - // Connect arbiters ? - this.connectArbiter = this.options.connectArbiter == null ? false : this.options.connectArbiter; - - // Default poolSize for new server instances - this.poolSize = this.options.poolSize == null ? 5 : this.options.poolSize; - this._currentServerChoice = 0; - - // Set up ssl connections - this.ssl = this.options.ssl == null ? false : this.options.ssl; - // Set ssl validation - this.sslValidate = this.options.sslValidate == null ? false : this.options.sslValidate; - // Set the ssl certificate authority (array of Buffer/String keys) - this.sslCA = Array.isArray(this.options.sslCA) ? this.options.sslCA : null; - // Certificate to present to the server - this.sslCert = this.options.sslCert; - // Certificate private key if in separate file - this.sslKey = this.options.sslKey; - // Password to unlock private key - this.sslPass = this.options.sslPass; - - // Ensure we are not trying to validate with no list of certificates - if(this.sslValidate && (!Array.isArray(this.sslCA) || this.sslCA.length == 0)) { - throw new Error("The driver expects an Array of CA certificates in the sslCA parameter when enabling sslValidate"); - } - - // Internal state of server connection - this._serverState = 'disconnected'; - // Read preference - this._readPreference = null; - // Do we record server stats or not - this.recordQueryStats = false; - // Update health try server - this.updateHealthServerTry = 0; - - // Get the readPreference - var readPreference = this.options['readPreference']; - - // Validate correctness of Read preferences - if(readPreference != null) { - if(readPreference != ReadPreference.PRIMARY && readPreference != ReadPreference.PRIMARY_PREFERRED - && readPreference != ReadPreference.SECONDARY && readPreference != ReadPreference.SECONDARY_PREFERRED - && readPreference != ReadPreference.NEAREST && typeof readPreference != 'object' && readPreference['_type'] != 'ReadPreference') { - throw new Error("Illegal readPreference mode specified, " + readPreference); - } - - this._readPreference = readPreference; - } else { - this._readPreference = null; - } - - // Ensure read_secondary is set correctly - if(!this.readSecondary) - this.readSecondary = this._readPreference == ReadPreference.PRIMARY - || this._readPreference == false - || this._readPreference == null ? false : true; - - // Strategy for picking a secondary - this.secondaryAcceptableLatencyMS = this.options['secondaryAcceptableLatencyMS'] == null ? 15 : this.options['secondaryAcceptableLatencyMS']; - this.strategy = this.options['strategy']; - // Make sure strategy is one of the two allowed - if(this.strategy != null && (this.strategy != 'ping' && this.strategy != 'statistical' && this.strategy != 'none')) - throw new Error("Only ping or statistical strategies allowed"); - if(this.strategy == null) this.strategy = 'ping'; - // Let's set up our strategy object for picking secodaries - if(this.strategy == 'ping') { - // Create a new instance - this.strategyInstance = new PingStrategy(this, this.secondaryAcceptableLatencyMS); - } else if(this.strategy == 'statistical') { - // Set strategy as statistical - this.strategyInstance = new StatisticsStrategy(this); - // Add enable query information - this.enableRecordQueryStats(true); - } - - // Set logger if strategy exists - if(this.strategyInstance) this.strategyInstance.logger = this.logger; - - // Set default connection pool options - this.socketOptions = this.options.socketOptions != null ? this.options.socketOptions : {}; - - // Set up logger if any set - this.logger = this.options.logger != null - && (typeof this.options.logger.debug == 'function') - && (typeof this.options.logger.error == 'function') - && (typeof this.options.logger.debug == 'function') - ? this.options.logger : {error:function(message, object) {}, log:function(message, object) {}, debug:function(message, object) {}}; - - // Ensure all the instances are of type server and auto_reconnect is false - if(!Array.isArray(servers) || servers.length == 0) { - throw Error("The parameter must be an array of servers and contain at least one server"); - } else if(Array.isArray(servers) || servers.length > 0) { - var count = 0; - servers.forEach(function(server) { - if(server instanceof Server) count = count + 1; - // Ensure no server has reconnect on - server.options.auto_reconnect = false; - // Set up ssl options - server.ssl = self.ssl; - server.sslValidate = self.sslValidate; - server.sslCA = self.sslCA; - server.sslCert = self.sslCert; - server.sslKey = self.sslKey; - server.sslPass = self.sslPass; - server.poolSize = self.poolSize; - // Set callback store - server._callBackStore = self._callBackStore; - }); - - if(count < servers.length) { - throw Error("All server entries must be of type Server"); - } else { - this.servers = servers; - } - } - - // var deduplicate list - var uniqueServers = {}; - // De-duplicate any servers in the seed list - for(var i = 0; i < this.servers.length; i++) { - var server = this.servers[i]; - // If server does not exist set it - if(uniqueServers[server.host + ":" + server.port] == null) { - uniqueServers[server.host + ":" + server.port] = server; - } - } - - // Let's set the deduplicated list of servers - this.servers = []; - // Add the servers - for(var key in uniqueServers) { - this.servers.push(uniqueServers[key]); - } - - // Enabled ha - this.haEnabled = this.options['ha'] == null ? true : this.options['ha']; - this._haServer = null; - // How often are we checking for new servers in the replicaset - this.replicasetStatusCheckInterval = this.options['haInterval'] == null ? 5000 : this.options['haInterval']; - - // Connection timeout - this._connectTimeoutMS = this.socketOptions.connectTimeoutMS - ? this.socketOptions.connectTimeoutMS - : 1000; - // Socket connection timeout - this._socketTimeoutMS = this.socketOptions.socketTimeoutMS - ? this.socketOptions.socketTimeoutMS - : (this.replicasetStatusCheckInterval + 1000); -}; - -/** - * @ignore - */ -inherits(ReplSet, Base); - -/** - * @ignore - */ -// Allow setting the read preference at the replicaset level -ReplSet.prototype.setReadPreference = function(preference) { - // Set read preference - this._readPreference = preference; - // Ensure slaveOk is correct for secodnaries read preference and tags - if((this._readPreference == ReadPreference.SECONDARY_PREFERRED || this._readPreference == ReadPreference.SECONDARY) - || (this._readPreference != null && typeof this._readPreference == 'object')) { - this.slaveOk = true; - } -} - -/** - * @ignore - */ -ReplSet.prototype._isUsed = function() { - return this._used; -} - -/** - * @ignore - */ -ReplSet.prototype.isMongos = function() { - return false; -} - -/** - * @ignore - */ -ReplSet.prototype.isConnected = function(read) { - if(read == null || read == ReadPreference.PRIMARY || read == false) - return this.primary != null && this._state.master != null && this._state.master.isConnected(); - - if((read == ReadPreference.PRIMARY_PREFERRED || read == ReadPreference.SECONDARY_PREFERRED || read == ReadPreference.NEAREST) - && ((this.primary != null && this._state.master != null && this._state.master.isConnected()) - || (this._state && this._state.secondaries && Object.keys(this._state.secondaries).length > 0))) { - return true; - } else if(read == ReadPreference.SECONDARY) { - return this._state && this._state.secondaries && Object.keys(this._state.secondaries).length > 0; - } - - // No valid connection return false - return false; -} - -/** - * @ignore - */ -ReplSet.prototype.isSetMember = function() { - return false; -} - -/** - * @ignore - */ -ReplSet.prototype.isPrimary = function(config) { - return this.readSecondary && Object.keys(this._state.secondaries).length > 0 ? false : true; -} - -/** - * @ignore - */ -ReplSet.prototype.isReadPrimary = ReplSet.prototype.isPrimary; - -/** - * @ignore - */ -ReplSet.prototype.allServerInstances = function() { - var self = this; - // If no state yet return empty - if(!self._state) return []; - // Close all the servers (concatenate entire list of servers first for ease) - var allServers = self._state.master != null ? [self._state.master] : []; - - // Secondary keys - var keys = Object.keys(self._state.secondaries); - // Add all secondaries - for(var i = 0; i < keys.length; i++) { - allServers.push(self._state.secondaries[keys[i]]); - } - - // Arbiter keys - var keys = Object.keys(self._state.arbiters); - // Add all arbiters - for(var i = 0; i < keys.length; i++) { - allServers.push(self._state.arbiters[keys[i]]); - } - - // Passive keys - var keys = Object.keys(self._state.passives); - // Add all arbiters - for(var i = 0; i < keys.length; i++) { - allServers.push(self._state.passives[keys[i]]); - } - - // Return complete list of all servers - return allServers; -} - -/** - * Enables high availability pings. - * - * @ignore - */ -ReplSet.prototype._enableHA = function () { - var self = this; - return check(); - - function ping () { - // We are disconnected stop pinging and close current connection if any - if("disconnected" == self._serverState) { - if(self._haServer != null) self._haServer.close(); - return; - } - - // Create a list of all servers we can send the ismaster command to - var allServers = self._state.master != null ? [self._state.master] : []; - - // Secondary keys - var keys = Object.keys(self._state.secondaries); - // Add all secondaries - for(var i = 0; i < keys.length; i++) { - allServers.push(self._state.secondaries[keys[i]]); - } - - // If no servers quit as are probably connecting - if(allServers.length == 0) return; - // Pick one of the servers - self.updateHealthServerTry = self.updateHealthServerTry++ % allServers.length; - var selectedServer = allServers[self.updateHealthServerTry]; - - // If we have an active db instance - if(self.dbInstances.length > 0) { - var db = self.dbInstances[0]; - - // We have an instance already - if(self._haServer == null) { - // Create a new master connection - self._haServer = new Server(selectedServer.host, selectedServer.port, { - auto_reconnect: false, - returnIsMasterResults: true, - slaveOk: true, - poolSize: 1, - socketOptions: { - connectTimeoutMS: self._connectTimeoutMS, - socketTimeoutMS: self._socketTimeoutMS - }, - ssl: self.ssl, - sslValidate: self.sslValidate, - sslCA: self.sslCA, - sslCert: self.sslCert, - sslKey: self.sslKey, - sslPass: self.sslPass - }); - - self._haServer._callBackStore = self._callBackStore; - - // Add error handlers - self.on("close", function() { - if(self._haServer) self._haServer.close(); - self._haServer = null; - }); - - self.on("error", function() { - if(self._haServer) self._haServer.close(); - self._haServer = null; - }); - - self.on("timeout", function() { - if(self._haServer) self._haServer.close(); - self._haServer = null; - }); - - // Connect using the new _server connection to not impact the driver - // behavior on any errors we could possibly run into - self._haServer.connect(db, function(err, result, _server) { - if("disconnected" == self._serverState) { - if(_server.close) _server.close(); - return; - } - - if(err) { - if(_server.close) _server.close(); - return check(); - } - - executeMasterCommand(db, _server); - }); - } else { - executeMasterCommand(db, self._haServer); - } - } - } - - function executeMasterCommand(db, _server) { - try { - // Create is master command - var cmd = DbCommand.createIsMasterCommand(db); - // Execute is master command - db._executeQueryCommand(cmd, {failFast:true, connection: _server.checkoutReader()}, function(err, res) { - if("disconnected" == self._serverState) { - if(_server.close) _server.close(); - return; - } - // If error let's set perform another check - if(err) return check(); - // Validate the replicaset - self._validateReplicaset(res, db.auths, function() { - check(); - }); - }); - } catch(err) { - if(self._haServer) self._haServer.close(); - self._haServer = null; - check(); - } - } - - function check() { - self._haTimer = setTimeout(ping, self.replicasetStatusCheckInterval); - } -} - -/** - * @ignore - */ -ReplSet.prototype._validateReplicaset = function(result, auths, cb) { - var self = this; - var res = result.documents[0]; - - // manage master node changes - if(res.primary && self._state.master && self._state.master.name != res.primary) { - // Delete master record so we can rediscover it - delete self._state.addresses[self._state.master.name]; - - // TODO existing issue? this seems to only work if - // we already have a connection to the new primary. - - // Update information on new primary - // add as master, remove from secondary - var newMaster = self._state.addresses[res.primary]; - newMaster.isMasterDoc.ismaster = true; - newMaster.isMasterDoc.secondary = false; - self._state.master = newMaster; - delete self._state.secondaries[res.primary]; - } - - // discover new hosts - var hosts = []; - - for(var i = 0; i < res.hosts.length; ++i) { - var host = res.hosts[i]; - if (host == res.me) continue; - if (!(self._state.addresses[host] || ~hosts.indexOf(host))) { - // we dont already have a connection to this host and aren't - // already planning on connecting. - hosts.push(host); - } - } - - connectTo(hosts, auths, self, cb); -} - -/** - * Create connections to all `hosts` firing `cb` after - * connections are attempted for all `hosts`. - * - * @param {Array} hosts - * @param {Array} [auths] - * @param {ReplSet} replset - * @param {Function} cb - * @ignore - */ -function connectTo (hosts, auths, replset, cb) { - var pending = hosts.length; - if (!pending) return cb(); - - for(var i = 0; i < hosts.length; ++i) { - connectToHost(hosts[i], auths, replset, handle); - } - - function handle () { - --pending; - if (0 === pending) cb(); - } -} - -/** - * Attempts connection to `host` and authenticates with optional `auth` - * for the given `replset` firing `cb` when finished. - * - * @param {String} host - * @param {Array} auths - * @param {ReplSet} replset - * @param {Function} cb - * @ignore - */ -function connectToHost (host, auths, replset, cb) { - var server = createServer(host, replset); - - var options = { - returnIsMasterResults: true, - eventReceiver: server - } - - server.connect(replset.db, options, function(err, result) { - var doc = result && result.documents && result.documents[0]; - - if (err || !doc) { - server.close(); - return cb(err, result, server); - } - - if(!(doc.ismaster || doc.secondary || doc.arbiterOnly)) { - server.close(); - return cb(null, result, server); - } - - // if host is an arbiter, disconnect if not configured for it - if(doc.arbiterOnly && !replset.connectArbiter) { - server.close(); - return cb(null, result, server); - } - - // create handler for successful connections - var handleConnect = _connectHandler(replset, null, server); - function complete () { - handleConnect(err, result); - cb(); - } - - // authenticate if necessary - if(!(Array.isArray(auths) && auths.length > 0)) { - return complete(); - } - - var pending = auths.length; - - var connections = server.allRawConnections(); - var pendingAuthConn = connections.length; - for(var x = 0; x 0) { - self.db.emit(event, err); - } - - // If it's the primary close all connections - if(self._state.master - && self._state.master.host == server.host - && self._state.master.port == server.port) { - // return self.close(); - self._state.master = null; - } - } -} - -var _connectHandler = function(self, candidateServers, instanceServer) { - return function(err, result) { - // If we have an ssl error store the error - if(err && err.ssl) { - self._sslError = err; - } - - // We are disconnected stop attempting reconnect or connect - if(self._serverState == 'disconnected') return instanceServer.close(); - - // If no error handle isMaster - if(err == null && result.documents[0].hosts != null) { - // Fetch the isMaster command result - var document = result.documents[0]; - // Break out the results - var setName = document.setName; - var isMaster = document.ismaster; - var secondary = document.secondary; - var passive = document.passive; - var arbiterOnly = document.arbiterOnly; - var hosts = Array.isArray(document.hosts) ? document.hosts : []; - var arbiters = Array.isArray(document.arbiters) ? document.arbiters : []; - var passives = Array.isArray(document.passives) ? document.passives : []; - var tags = document.tags ? document.tags : {}; - var primary = document.primary; - // Find the current server name and fallback if none - var userProvidedServerString = instanceServer.host + ":" + instanceServer.port; - var me = document.me || userProvidedServerString; - - // Verify if the set name is the same otherwise shut down and return an error - if(self.replicaSet == null) { - self.replicaSet = setName; - } else if(self.replicaSet != setName) { - // Stop the set - self.close(); - // Emit a connection error - return self.emit("connectionError", - new Error("configured mongodb replicaset does not match provided replicaset [" + setName + "] != [" + self.replicaSet + "]")) - } - - // Make sure we have the right reference - var oldServer = self._state.addresses[userProvidedServerString] - if (oldServer && oldServer !== instanceServer) oldServer.close(); - delete self._state.addresses[userProvidedServerString]; - - if (self._state.addresses[me] && self._state.addresses[me] !== instanceServer) { - self._state.addresses[me].close(); - } - - self._state.addresses[me] = instanceServer; - - // Let's add the server to our list of server types - if(secondary == true && (passive == false || passive == null)) { - self._state.secondaries[me] = instanceServer; - } else if(arbiterOnly == true) { - self._state.arbiters[me] = instanceServer; - } else if(secondary == true && passive == true) { - self._state.passives[me] = instanceServer; - } else if(isMaster == true) { - self._state.master = instanceServer; - } else if(isMaster == false && primary != null && self._state.addresses[primary]) { - self._state.master = self._state.addresses[primary]; - } - - // Set the name - instanceServer.name = me; - // Add tag info - instanceServer.tags = tags; - - // Add the handlers to the instance - instanceServer.on("close", _handler("close", self)); - instanceServer.on("error", _handler("error", self)); - instanceServer.on("timeout", _handler("timeout", self)); - - // Possible hosts - var possibleHosts = Array.isArray(hosts) ? hosts.slice() : []; - possibleHosts = Array.isArray(passives) ? possibleHosts.concat(passives) : possibleHosts; - - if(self.connectArbiter == true) { - possibleHosts = Array.isArray(arbiters) ? possibleHosts.concat(arbiters) : possibleHosts; - } - - if(Array.isArray(candidateServers)) { - // Add any new candidate servers for connection - for(var j = 0; j < possibleHosts.length; j++) { - if(self._state.addresses[possibleHosts[j]] == null && possibleHosts[j] != null) { - var parts = possibleHosts[j].split(/:/); - if(parts.length == 1) { - parts = [parts[0], Connection.DEFAULT_PORT]; - } - - // New candidate server - var candidateServer = new Server(parts[0], parseInt(parts[1])); - candidateServer._callBackStore = self._callBackStore; - candidateServer.name = possibleHosts[j]; - candidateServer.ssl = self.ssl; - candidateServer.sslValidate = self.sslValidate; - candidateServer.sslCA = self.sslCA; - candidateServer.sslCert = self.sslCert; - candidateServer.sslKey = self.sslKey; - candidateServer.sslPass = self.sslPass; - - // Set the candidate server - self._state.addresses[possibleHosts[j]] = candidateServer; - // Add the new server to the list of candidate servers - candidateServers.push(candidateServer); - } - } - } - } else if(err != null || self._serverState == 'disconnected'){ - delete self._state.addresses[instanceServer.host + ":" + instanceServer.port]; - // Remove it from the set - instanceServer.close(); - } - - // Attempt to connect to the next server - if(Array.isArray(candidateServers) && candidateServers.length > 0) { - var server = candidateServers.pop(); - - // Get server addresses - var addresses = self._state.addresses; - - // Default empty socket options object - var socketOptions = {}; - - // Set fast connect timeout - socketOptions['connectTimeoutMS'] = self._connectTimeoutMS; - - // If a socket option object exists clone it - if(self.socketOptions != null && typeof self.socketOptions === 'object') { - var keys = Object.keys(self.socketOptions); - for(var j = 0; j < keys.length;j++) socketOptions[keys[j]] = self.socketOptions[keys[j]]; - } - - // If ssl is specified - if(self.ssl) server.ssl = true; - - // Add host information to socket options - socketOptions['host'] = server.host; - socketOptions['port'] = server.port; - server.socketOptions = socketOptions; - server.replicasetInstance = self; - server.enableRecordQueryStats(self.recordQueryStats); - - // Set the server - if (addresses[server.host + ":" + server.port] != server) { - if (addresses[server.host + ":" + server.port]) { - // Close the connection before deleting - addresses[server.host + ":" + server.port].close(); - } - delete addresses[server.host + ":" + server.port]; - } - addresses[server.host + ":" + server.port] = server; - // Connect - server.connect(self.db, {returnIsMasterResults: true, eventReceiver:server}, _connectHandler(self, candidateServers, server)); - } else if(Array.isArray(candidateServers)) { - // If we have no primary emit error - if(self._state.master == null) { - // Stop the set - self.close(); - - // If we have an ssl error send the message instead of no primary found - if(self._sslError) { - return self.emit("connectionError", self._sslError); - } - - // Emit a connection error - return self.emit("connectionError", - new Error("no primary server found in set")) - } else{ - if (self.strategyInstance) { - self.strategyInstance.start(); - } - - for(var i = 0; i < self.dbInstances.length; i++) self.dbInstances[i]._state = 'connected'; - self.emit("fullsetup", null, self.db, self); - self.emit("open", null, self.db, self); - } - } - } -} - -/** - * Interval state object constructor - * - * @ignore - */ -ReplSet.State = function ReplSetState () { - this.errorMessages = []; - this.secondaries = {}; - this.addresses = {}; - this.arbiters = {}; - this.passives = {}; - this.members = []; - this.errors = {}; - this.setName = null; - this.master = null; -} - -/** - * @ignore - */ -ReplSet.prototype.connect = function(parent, options, callback) { - var self = this; - if('function' === typeof options) callback = options, options = {}; - if(options == null) options = {}; - if(!('function' === typeof callback)) callback = null; - - // Ensure it's all closed - self.close(); - - // Set connecting status - this.db = parent; - this._serverState = 'connecting'; - this._callbackList = []; - - this._state = new ReplSet.State(); - - // Ensure parent can do a slave query if it's set - parent.slaveOk = this.slaveOk - ? this.slaveOk - : parent.slaveOk; - - // Remove any listeners - this.removeAllListeners("fullsetup"); - this.removeAllListeners("connectionError"); - - // Add primary found event handler - this.once("fullsetup", function() { - self._handleOnFullSetup(parent); - - // Callback - if(typeof callback == 'function') { - var internalCallback = callback; - callback = null; - internalCallback(null, parent, self); - } - }); - - this.once("connectionError", function(err) { - self._serverState = 'disconnected'; - // Ensure it's all closed - self.close(); - // Perform the callback - if(typeof callback == 'function') { - var internalCallback = callback; - callback = null; - internalCallback(err, parent, self); - } - }); - - // Get server addresses - var addresses = this._state.addresses; - - // De-duplicate any servers - var server, key; - for(var i = 0; i < this.servers.length; i++) { - server = this.servers[i]; - key = server.host + ":" + server.port; - if(null == addresses[key]) { - addresses[key] = server; - } - } - - // Get the list of servers that is deduplicated and start connecting - var candidateServers = []; - var keys = Object.keys(addresses); - for(var i = 0; i < keys.length; i++) { - server = addresses[keys[i]]; - server.assignReplicaSet(this); - candidateServers.push(server); - } - - // Let's connect to the first one on the list - server = candidateServers.pop(); - var opts = { - returnIsMasterResults: true, - eventReceiver: server - } - server.connect(parent, opts, _connectHandler(this, candidateServers, server)); -} - -/** - * Handles the first `fullsetup` event of this ReplSet. - * - * @param {Db} parent - * @ignore - */ -ReplSet.prototype._handleOnFullSetup = function (parent) { - this._serverState = 'connected'; - for(var i = 0; i < this.dbInstances.length; i++) this.dbInstances[i]._state = 'connected'; - if(parent._state) parent._state = 'connected'; - // Emit the fullsetup and open event - parent.emit("open", null, this.db, this); - parent.emit("fullsetup", null, this.db, this); - - if(!this.haEnabled) return; - this._enableHA(); -} - -/** - * Disables high availability pings. - * - * @ignore - */ -ReplSet.prototype._disableHA = function () { - clearTimeout(this._haTimer); - this._haTimer = undefined; -} - -/** - * @ignore - */ -ReplSet.prototype.checkoutWriter = function() { - // Establish connection - var connection = this._state.master != null ? this._state.master.checkoutWriter() : null; - // Return the connection - return connection; -} - -/** - * @ignore - */ -var pickFirstConnectedSecondary = function pickFirstConnectedSecondary(self, tags) { - var keys = Object.keys(self._state.secondaries); - var connection; - - // Find first available reader if any - for(var i = 0; i < keys.length; i++) { - connection = self._state.secondaries[keys[i]].checkoutReader(); - if(connection) return connection; - } - - // If we still have a null, read from primary if it's not secondary only - if(self._readPreference == ReadPreference.SECONDARY_PREFERRED) { - connection = self._state.master.checkoutReader(); - if(connection) return connection; - } - - var preferenceName = self._readPreference == ReadPreference.SECONDARY_PREFERRED - ? 'secondary' - : self._readPreference; - - return new Error("No replica set member available for query with ReadPreference " - + preferenceName + " and tags " + JSON.stringify(tags)); -} - -/** - * @ignore - */ -var _pickFromTags = function(self, tags) { - // If we have an array or single tag selection - var tagObjects = Array.isArray(tags) ? tags : [tags]; - // Iterate over all tags until we find a candidate server - for(var _i = 0; _i < tagObjects.length; _i++) { - // Grab a tag object - var tagObject = tagObjects[_i]; - // Matching keys - var matchingKeys = Object.keys(tagObject); - // Match all the servers that match the provdided tags - var keys = Object.keys(self._state.secondaries); - var candidateServers = []; - - for(var i = 0; i < keys.length; i++) { - var server = self._state.secondaries[keys[i]]; - // If we have tags match - if(server.tags != null) { - var matching = true; - // Ensure we have all the values - for(var j = 0; j < matchingKeys.length; j++) { - if(server.tags[matchingKeys[j]] != tagObject[matchingKeys[j]]) { - matching = false; - break; - } - } - - // If we have a match add it to the list of matching servers - if(matching) { - candidateServers.push(server); - } - } - } - - // If we have a candidate server return - if(candidateServers.length > 0) { - if(this.strategyInstance) return this.strategyInstance.checkoutConnection(tags, candidateServers); - // Set instance to return - return candidateServers[Math.floor(Math.random() * candidateServers.length)].checkoutReader(); - } - } - - // No connection found - return null; -} - -/** - * @ignore - */ -ReplSet.prototype.checkoutReader = function(readPreference, tags) { - var connection = null; - - // If we have a read preference object unpack it - if(typeof readPreference == 'object' && readPreference['_type'] == 'ReadPreference') { - // Validate if the object is using a valid mode - if(!readPreference.isValid()) throw new Error("Illegal readPreference mode specified, " + readPreference.mode); - // Set the tag - tags = readPreference.tags; - readPreference = readPreference.mode; - } else if(typeof readPreference == 'object' && readPreference['_type'] != 'ReadPreference') { - throw new Error("read preferences must be either a string or an instance of ReadPreference"); - } - - // Set up our read Preference, allowing us to override the readPreference - var finalReadPreference = readPreference != null ? readPreference : this._readPreference; - finalReadPreference = finalReadPreference == true ? ReadPreference.SECONDARY_PREFERRED : finalReadPreference; - finalReadPreference = finalReadPreference == null ? ReadPreference.PRIMARY : finalReadPreference; - - // If we are reading from a primary - if(finalReadPreference == 'primary') { - // If we provide a tags set send an error - if(typeof tags == 'object' && tags != null) { - return new Error("PRIMARY cannot be combined with tags"); - } - - // If we provide a tags set send an error - if(this._state.master == null) { - return new Error("No replica set primary available for query with ReadPreference PRIMARY"); - } - - // Checkout a writer - return this.checkoutWriter(); - } - - // If we have specified to read from a secondary server grab a random one and read - // from it, otherwise just pass the primary connection - if((this.readSecondary || finalReadPreference == ReadPreference.SECONDARY_PREFERRED || finalReadPreference == ReadPreference.SECONDARY) && Object.keys(this._state.secondaries).length > 0) { - // If we have tags, look for servers matching the specific tag - if(this.strategyInstance != null) { - // Only pick from secondaries - var _secondaries = []; - for(var key in this._state.secondaries) { - _secondaries.push(this._state.secondaries[key]); - } - - if(finalReadPreference == ReadPreference.SECONDARY) { - // Check out the nearest from only the secondaries - connection = this.strategyInstance.checkoutConnection(tags, _secondaries); - } else { - connection = this.strategyInstance.checkoutConnection(tags, _secondaries); - // No candidate servers that match the tags, error - if(connection == null || connection instanceof Error) { - // No secondary server avilable, attemp to checkout a primary server - connection = this.checkoutWriter(); - // If no connection return an error - if(connection == null) { - return new Error("No replica set members available for query"); - } - } - } - } else if(tags != null && typeof tags == 'object') { - // Get connection - connection = _pickFromTags(this, tags);// = function(self, readPreference, tags) { - // No candidate servers that match the tags, error - if(connection == null) { - return new Error("No replica set members available for query"); - } - } else { - connection = _roundRobin(this, tags); - } - } else if(finalReadPreference == ReadPreference.PRIMARY_PREFERRED) { - // Check if there is a primary available and return that if possible - connection = this.checkoutWriter(); - // If no connection available checkout a secondary - if(connection == null) { - // If we have tags, look for servers matching the specific tag - if(tags != null && typeof tags == 'object') { - // Get connection - connection = _pickFromTags(this, tags);// = function(self, readPreference, tags) { - // No candidate servers that match the tags, error - if(connection == null) { - return new Error("No replica set members available for query"); - } - } else { - connection = _roundRobin(this, tags); - } - } - } else if(finalReadPreference == ReadPreference.SECONDARY_PREFERRED) { - // If we have tags, look for servers matching the specific tag - if(this.strategyInstance != null) { - connection = this.strategyInstance.checkoutConnection(tags); - // No candidate servers that match the tags, error - if(connection == null || connection instanceof Error) { - // No secondary server avilable, attemp to checkout a primary server - connection = this.checkoutWriter(); - // If no connection return an error - if(connection == null) { - var preferenceName = finalReadPreference == ReadPreference.SECONDARY ? 'secondary' : finalReadPreference; - connection = new Error("No replica set member available for query with ReadPreference " + preferenceName + " and tags " + JSON.stringify(tags)); - // return new Error("No replica set members available for query"); - } - } - } else if(tags != null && typeof tags == 'object') { - // Get connection - connection = _pickFromTags(this, tags);// = function(self, readPreference, tags) { - // No candidate servers that match the tags, error - if(connection == null) { - // No secondary server avilable, attemp to checkout a primary server - connection = this.checkoutWriter(); - // If no connection return an error - if(connection == null) { - var preferenceName = finalReadPreference == ReadPreference.SECONDARY ? 'secondary' : finalReadPreference; - connection = new Error("No replica set member available for query with ReadPreference " + preferenceName + " and tags " + JSON.stringify(tags)); - // return new Error("No replica set members available for query"); - } - } - } - } else if(finalReadPreference == ReadPreference.NEAREST && this.strategyInstance != null) { - connection = this.strategyInstance.checkoutConnection(tags); - } else if(finalReadPreference == ReadPreference.NEAREST && this.strategyInstance == null) { - return new Error("A strategy for calculating nearness must be enabled such as ping or statistical"); - } else if(finalReadPreference == ReadPreference.SECONDARY && Object.keys(this._state.secondaries).length == 0) { - if(tags != null && typeof tags == 'object') { - var preferenceName = finalReadPreference == ReadPreference.SECONDARY ? 'secondary' : finalReadPreference; - connection = new Error("No replica set member available for query with ReadPreference " + preferenceName + " and tags " + JSON.stringify(tags)); - } else { - connection = new Error("No replica set secondary available for query with ReadPreference SECONDARY"); - } - } else { - connection = this.checkoutWriter(); - } - - // Return the connection - return connection; -} - -/** - * Pick a secondary using round robin - * - * @ignore - */ -function _roundRobin (replset, tags) { - var keys = Object.keys(replset._state.secondaries); - var key = keys[replset._currentServerChoice++ % keys.length]; - - var conn = null != replset._state.secondaries[key] - ? replset._state.secondaries[key].checkoutReader() - : null; - - // If connection is null fallback to first available secondary - if (null == conn) { - conn = pickFirstConnectedSecondary(replset, tags); - } - - return conn; -} - -/** - * @ignore - */ -ReplSet.prototype.allRawConnections = function() { - // Neeed to build a complete list of all raw connections, start with master server - var allConnections = []; - if(this._state.master == null) return []; - // Get connection object - var allMasterConnections = this._state.master.connectionPool.getAllConnections(); - // Add all connections to list - allConnections = allConnections.concat(allMasterConnections); - // If we have read secondary let's add all secondary servers - if(Object.keys(this._state.secondaries).length > 0) { - // Get all the keys - var keys = Object.keys(this._state.secondaries); - // For each of the secondaries grab the connections - for(var i = 0; i < keys.length; i++) { - // Get connection object - var secondaryPoolConnections = this._state.secondaries[keys[i]].connectionPool.getAllConnections(); - // Add all connections to list - allConnections = allConnections.concat(secondaryPoolConnections); - } - } - - // Return all the conections - return allConnections; -} - -/** - * @ignore - */ -ReplSet.prototype.enableRecordQueryStats = function(enable) { - // Set the global enable record query stats - this.recordQueryStats = enable; - // Ensure all existing servers already have the flag set, even if the - // connections are up already or we have not connected yet - if(this._state != null && this._state.addresses != null) { - var keys = Object.keys(this._state.addresses); - // Iterate over all server instances and set the enableRecordQueryStats flag - for(var i = 0; i < keys.length; i++) { - this._state.addresses[keys[i]].enableRecordQueryStats(enable); - } - } else if(Array.isArray(this.servers)) { - for(var i = 0; i < this.servers.length; i++) { - this.servers[i].enableRecordQueryStats(enable); - } - } -} - -/** - * @ignore - */ -ReplSet.prototype.disconnect = function(callback) { - this.close(callback); -} - -/** - * @ignore - */ -ReplSet.prototype.close = function(callback) { - var self = this; - // Disconnect - this._serverState = 'disconnected'; - // Close all servers - if(this._state && this._state.addresses) { - var keys = Object.keys(this._state.addresses); - // Iterate over all server instances - for(var i = 0; i < keys.length; i++) { - this._state.addresses[keys[i]].close(); - } - } - - // If we have a strategy stop it - if(this.strategyInstance) { - this.strategyInstance.stop(); - } - // Shut down HA if running connection - if(this._haServer) this._haServer.close(); - - // If it's a callback - if(typeof callback == 'function') callback(null, null); -} - -/** - * Auto Reconnect property - * @ignore - */ -Object.defineProperty(ReplSet.prototype, "autoReconnect", { enumerable: true - , get: function () { - return true; - } -}); - -/** - * Get Read Preference method - * @ignore - */ -Object.defineProperty(ReplSet.prototype, "readPreference", { enumerable: true - , get: function () { - if(this._readPreference == null && this.readSecondary) { - return ReadPreference.SECONDARY_PREFERRED; - } else if(this._readPreference == null && !this.readSecondary) { - return ReadPreference.PRIMARY; - } else { - return this._readPreference; - } - } -}); - -/** - * Db Instances - * @ignore - */ -Object.defineProperty(ReplSet.prototype, "dbInstances", {enumerable:true - , get: function() { - var servers = this.allServerInstances(); - return servers.length > 0 ? servers[0].dbInstances : []; - } -}) - -/** - * Just make compatible with server.js - * @ignore - */ -Object.defineProperty(ReplSet.prototype, "host", { enumerable: true - , get: function () { - if (this.primary != null) return this.primary.host; - } -}); - -/** - * Just make compatible with server.js - * @ignore - */ -Object.defineProperty(ReplSet.prototype, "port", { enumerable: true - , get: function () { - if (this.primary != null) return this.primary.port; - } -}); - -/** - * Get status of read - * @ignore - */ -Object.defineProperty(ReplSet.prototype, "read", { enumerable: true - , get: function () { - return this.secondaries.length > 0 ? this.secondaries[0] : null; - } -}); - -/** - * Get list of secondaries - * @ignore - */ -Object.defineProperty(ReplSet.prototype, "secondaries", {enumerable: true - , get: function() { - var keys = Object.keys(this._state.secondaries); - var array = new Array(keys.length); - // Convert secondaries to array - for(var i = 0; i < keys.length; i++) { - array[i] = this._state.secondaries[keys[i]]; - } - return array; - } -}); - -/** - * Get list of all secondaries including passives - * @ignore - */ -Object.defineProperty(ReplSet.prototype, "allSecondaries", {enumerable: true - , get: function() { - return this.secondaries.concat(this.passives); - } -}); - -/** - * Get list of arbiters - * @ignore - */ -Object.defineProperty(ReplSet.prototype, "arbiters", {enumerable: true - , get: function() { - var keys = Object.keys(this._state.arbiters); - var array = new Array(keys.length); - // Convert arbiters to array - for(var i = 0; i < keys.length; i++) { - array[i] = this._state.arbiters[keys[i]]; - } - return array; - } -}); - -/** - * Get list of passives - * @ignore - */ -Object.defineProperty(ReplSet.prototype, "passives", {enumerable: true - , get: function() { - var keys = Object.keys(this._state.passives); - var array = new Array(keys.length); - // Convert arbiters to array - for(var i = 0; i < keys.length; i++) { - array[i] = this._state.passives[keys[i]]; - } - return array; - } -}); - -/** - * Master connection property - * @ignore - */ -Object.defineProperty(ReplSet.prototype, "primary", { enumerable: true - , get: function () { - return this._state != null ? this._state.master : null; - } -}); - -/** - * @ignore - */ -// Backward compatibility -exports.ReplSetServers = ReplSet; diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js deleted file mode 100644 index c4ae952..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js +++ /dev/null @@ -1,900 +0,0 @@ -var Connection = require('./connection').Connection, - ReadPreference = require('./read_preference').ReadPreference, - DbCommand = require('../commands/db_command').DbCommand, - MongoReply = require('../responses/mongo_reply').MongoReply, - ConnectionPool = require('./connection_pool').ConnectionPool, - EventEmitter = require('events').EventEmitter, - Base = require('./base').Base, - utils = require('../utils'), - inherits = require('util').inherits; - -/** - * Class representing a single MongoDB Server connection - * - * Options - * - **readPreference** {String, default:null}, set's the read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST) - * - **ssl** {Boolean, default:false}, use ssl connection (needs to have a mongod server with ssl support) - * - **sslValidate** {Boolean, default:false}, validate mongod server certificate against ca (needs to have a mongod server with ssl support, 2.4 or higher) - * - **sslCA** {Array, default:null}, Array of valid certificates either as Buffers or Strings (needs to have a mongod server with ssl support, 2.4 or higher) - * - **sslCert** {Buffer/String, default:null}, String or buffer containing the certificate we wish to present (needs to have a mongod server with ssl support, 2.4 or higher) - * - **sslKey** {Buffer/String, default:null}, String or buffer containing the certificate private key we wish to present (needs to have a mongod server with ssl support, 2.4 or higher) - * - **sslPass** {Buffer/String, default:null}, String or buffer containing the certificate password (needs to have a mongod server with ssl support, 2.4 or higher) - * - **slaveOk** {Boolean, default:false}, legacy option allowing reads from secondary, use **readPrefrence** instead. - * - **poolSize** {Number, default:5}, number of connections in the connection pool, set to 5 as default for legacy reasons. - * - **socketOptions** {Object, default:null}, an object containing socket options to use (noDelay:(boolean), keepAlive:(number), connectTimeoutMS:(number), socketTimeoutMS:(number)) - * - **logger** {Object, default:null}, an object representing a logger that you want to use, needs to support functions debug, log, error **({error:function(message, object) {}, log:function(message, object) {}, debug:function(message, object) {}})**. - * - **auto_reconnect** {Boolean, default:false}, reconnect on error. - * - **disableDriverBSONSizeCheck** {Boolean, default:false}, force the server to error if the BSON message is to big - * - * @class Represents a Server connection. - * @param {String} host the server host - * @param {Number} port the server port - * @param {Object} [options] optional options for insert command - */ -function Server(host, port, options) { - // Set up Server instance - if(!(this instanceof Server)) return new Server(host, port, options); - - // Set up event emitter - Base.call(this); - - // Ensure correct values - if(port != null && typeof port == 'object') { - options = port; - port = Connection.DEFAULT_PORT; - } - - var self = this; - this.host = host; - this.port = port; - this.options = options == null ? {} : options; - this.internalConnection; - this.internalMaster = false; - this.connected = false; - this.poolSize = this.options.poolSize == null ? 5 : this.options.poolSize; - this.disableDriverBSONSizeCheck = this.options.disableDriverBSONSizeCheck != null ? this.options.disableDriverBSONSizeCheck : false; - this.slaveOk = this.options["slave_ok"] ? this.options["slave_ok"] : this.options["slaveOk"]; - this._used = false; - this.replicasetInstance = null; - - // Set ssl as connection method - this.ssl = this.options.ssl == null ? false : this.options.ssl; - // Set ssl validation - this.sslValidate = this.options.sslValidate == null ? false : this.options.sslValidate; - // Set the ssl certificate authority (array of Buffer/String keys) - this.sslCA = Array.isArray(this.options.sslCA) ? this.options.sslCA : null; - // Certificate to present to the server - this.sslCert = this.options.sslCert; - // Certificate private key if in separate file - this.sslKey = this.options.sslKey; - // Password to unlock private key - this.sslPass = this.options.sslPass; - - // Ensure we are not trying to validate with no list of certificates - if(this.sslValidate && (!Array.isArray(this.sslCA) || this.sslCA.length == 0)) { - throw new Error("The driver expects an Array of CA certificates in the sslCA parameter when enabling sslValidate"); - } - - // Get the readPreference - var readPreference = this.options['readPreference']; - // If readPreference is an object get the mode string - var validateReadPreference = readPreference != null && typeof readPreference == 'object' ? readPreference.mode : readPreference; - // Read preference setting - if(validateReadPreference != null) { - if(validateReadPreference != ReadPreference.PRIMARY && validateReadPreference != ReadPreference.SECONDARY && validateReadPreference != ReadPreference.NEAREST - && validateReadPreference != ReadPreference.SECONDARY_PREFERRED && validateReadPreference != ReadPreference.PRIMARY_PREFERRED) { - throw new Error("Illegal readPreference mode specified, " + validateReadPreference); - } - - // Set read Preference - this._readPreference = readPreference; - } else { - this._readPreference = null; - } - - // Contains the isMaster information returned from the server - this.isMasterDoc; - - // Set default connection pool options - this.socketOptions = this.options.socketOptions != null ? this.options.socketOptions : {}; - if(this.disableDriverBSONSizeCheck) this.socketOptions.disableDriverBSONSizeCheck = this.disableDriverBSONSizeCheck; - - // Set ssl up if it's defined - if(this.ssl) { - this.socketOptions.ssl = true; - // Set ssl validation - this.socketOptions.sslValidate = this.sslValidate == null ? false : this.sslValidate; - // Set the ssl certificate authority (array of Buffer/String keys) - this.socketOptions.sslCA = Array.isArray(this.sslCA) ? this.sslCA : null; - // Set certificate to present - this.socketOptions.sslCert = this.sslCert; - // Set certificate to present - this.socketOptions.sslKey = this.sslKey; - // Password to unlock private key - this.socketOptions.sslPass = this.sslPass; - } - - // Set up logger if any set - this.logger = this.options.logger != null - && (typeof this.options.logger.debug == 'function') - && (typeof this.options.logger.error == 'function') - && (typeof this.options.logger.log == 'function') - ? this.options.logger : {error:function(message, object) {}, log:function(message, object) {}, debug:function(message, object) {}}; - - // Just keeps list of events we allow - this.eventHandlers = {error:[], parseError:[], poolReady:[], message:[], close:[], timeout:[]}; - // Internal state of server connection - this._serverState = 'disconnected'; - // this._timeout = false; - // Contains state information about server connection - this._state = {'runtimeStats': {'queryStats':new RunningStats()}}; - // Do we record server stats or not - this.recordQueryStats = false; -}; - -/** - * @ignore - */ -inherits(Server, Base); - -// -// Deprecated, USE ReadPreferences class -// -Server.READ_PRIMARY = ReadPreference.PRIMARY; -Server.READ_SECONDARY = ReadPreference.SECONDARY_PREFERRED; -Server.READ_SECONDARY_ONLY = ReadPreference.SECONDARY; - -/** - * Always ourselves - * @ignore - */ -Server.prototype.setReadPreference = function() {} - -/** - * @ignore - */ -Server.prototype.isMongos = function() { - return this.isMasterDoc != null && this.isMasterDoc['msg'] == "isdbgrid" ? true : false; -} - -/** - * @ignore - */ -Server.prototype._isUsed = function() { - return this._used; -} - -/** - * @ignore - */ -Server.prototype.close = function(callback) { - // Remove all local listeners - this.removeAllListeners(); - - if(this.connectionPool != null) { - // Remove all the listeners on the pool so it does not fire messages all over the place - this.connectionPool.removeAllEventListeners(); - // Close the connection if it's open - this.connectionPool.stop(true); - } - - // Set server status as disconnected - this._serverState = 'disconnected'; - // Peform callback if present - if(typeof callback === 'function') callback(null); -}; - -/** - * @ignore - */ -Server.prototype.isConnected = function() { - return this._serverState == 'connected'; -} - -/** - * @ignore - */ -Server.prototype.allServerInstances = function() { - return [this]; -} - -/** - * @ignore - */ -Server.prototype.isSetMember = function() { - return this.replicasetInstance != null || this.mongosInstance != null; -} - -/** - * Assigns a replica set to this `server`. - * - * @param {ReplSet} replset - * @ignore - */ -Server.prototype.assignReplicaSet = function (replset) { - this.replicasetInstance = replset; - this.inheritReplSetOptionsFrom(replset); - this.enableRecordQueryStats(replset.recordQueryStats); -} - -/** - * Takes needed options from `replset` and overwrites - * our own options. - * - * @param {ReplSet} replset - * @ignore - */ -Server.prototype.inheritReplSetOptionsFrom = function (replset) { - this.socketOptions = {}; - this.socketOptions.connectTimeoutMS = replset._connectTimeoutMS; - - if(replset.ssl) { - // Set ssl on - this.socketOptions.ssl = true; - // Set ssl validation - this.socketOptions.sslValidate = replset.sslValidate == null ? false : replset.sslValidate; - // Set the ssl certificate authority (array of Buffer/String keys) - this.socketOptions.sslCA = Array.isArray(replset.sslCA) ? replset.sslCA : null; - // Set certificate to present - this.socketOptions.sslCert = replset.sslCert; - // Set certificate to present - this.socketOptions.sslKey = replset.sslKey; - // Password to unlock private key - this.socketOptions.sslPass = replset.sslPass; - } - - // If a socket option object exists clone it - if(utils.isObject(replset.socketOptions)) { - var keys = Object.keys(replset.socketOptions); - for(var i = 0; i < keys.length; i++) - this.socketOptions[keys[i]] = replset.socketOptions[keys[i]]; - } -} - -/** - * Opens this server connection. - * - * @ignore - */ -Server.prototype.connect = function(dbInstance, options, callback) { - if('function' === typeof options) callback = options, options = {}; - if(options == null) options = {}; - if(!('function' === typeof callback)) callback = null; - - // Currently needed to work around problems with multiple connections in a pool with ssl - // TODO fix if possible - if(this.ssl == true) { - // Set up socket options for ssl - this.socketOptions.ssl = true; - // Set ssl validation - this.socketOptions.sslValidate = this.sslValidate == null ? false : this.sslValidate; - // Set the ssl certificate authority (array of Buffer/String keys) - this.socketOptions.sslCA = Array.isArray(this.sslCA) ? this.sslCA : null; - // Set certificate to present - this.socketOptions.sslCert = this.sslCert; - // Set certificate to present - this.socketOptions.sslKey = this.sslKey; - // Password to unlock private key - this.socketOptions.sslPass = this.sslPass; - } - - // Let's connect - var server = this; - // Let's us override the main receiver of events - var eventReceiver = options.eventReceiver != null ? options.eventReceiver : this; - // Save reference to dbInstance - this.db = dbInstance; // `db` property matches ReplSet and Mongos - this.dbInstances = [dbInstance]; - - // Force connection pool if there is one - if(server.connectionPool) server.connectionPool.stop(); - - // Set server state to connecting - this._serverState = 'connecting'; - // Ensure dbInstance can do a slave query if it's set - dbInstance.slaveOk = this.slaveOk ? this.slaveOk : dbInstance.slaveOk; - // Create connection Pool instance with the current BSON serializer - var connectionPool = new ConnectionPool(this.host, this.port, this.poolSize, dbInstance.bson, this.socketOptions); - // If ssl is not enabled don't wait between the pool connections - if(this.ssl == null || !this.ssl) connectionPool._timeToWait = null; - // Set logger on pool - connectionPool.logger = this.logger; - - // Set up a new pool using default settings - server.connectionPool = connectionPool; - - // Set basic parameters passed in - var returnIsMasterResults = options.returnIsMasterResults == null ? false : options.returnIsMasterResults; - - // Create a default connect handler, overriden when using replicasets - var connectCallback = function(err, reply) { - // ensure no callbacks get called twice - var internalCallback = callback; - callback = null; - // If something close down the connection and removed the callback before - // proxy killed connection etc, ignore the erorr as close event was isssued - if(err != null && internalCallback == null) return; - // Internal callback - if(err != null) return internalCallback(err, null, server); - server.master = reply.documents[0].ismaster == 1 ? true : false; - server.connectionPool.setMaxBsonSize(reply.documents[0].maxBsonObjectSize); - // Set server as connected - server.connected = true; - // Save document returned so we can query it - server.isMasterDoc = reply.documents[0]; - - // Emit open event - _emitAcrossAllDbInstances(server, eventReceiver, "open", null, returnIsMasterResults ? reply : dbInstance, null); - - // If we have it set to returnIsMasterResults - if(returnIsMasterResults) { - internalCallback(null, reply, server); - } else { - internalCallback(null, dbInstance, server); - } - }; - - // Let's us override the main connect callback - var connectHandler = options.connectHandler == null ? connectCallback : options.connectHandler; - - // Set up on connect method - connectionPool.on("poolReady", function() { - // Create db command and Add the callback to the list of callbacks by the request id (mapping outgoing messages to correct callbacks) - var db_command = DbCommand.NcreateIsMasterCommand(dbInstance, dbInstance.databaseName); - // Check out a reader from the pool - var connection = connectionPool.checkoutConnection(); - // Set server state to connEcted - server._serverState = 'connected'; - - // Register handler for messages - server._registerHandler(db_command, false, connection, connectHandler); - - // Write the command out - connection.write(db_command); - }) - - // Set up item connection - connectionPool.on("message", function(message) { - // Attempt to parse the message - try { - // Create a new mongo reply - var mongoReply = new MongoReply() - // Parse the header - mongoReply.parseHeader(message, connectionPool.bson) - - // If message size is not the same as the buffer size - // something went terribly wrong somewhere - if(mongoReply.messageLength != message.length) { - // Emit the error - if(eventReceiver.listeners("error") && eventReceiver.listeners("error").length > 0) eventReceiver.emit("error", new Error("bson length is different from message length"), server); - // Remove all listeners - server.removeAllListeners(); - } else { - var startDate = new Date().getTime(); - - // Callback instance - var callbackInfo = server._findHandler(mongoReply.responseTo.toString()); - - // The command executed another request, log the handler again under that request id - if(mongoReply.requestId > 0 && mongoReply.cursorId.toString() != "0" - && callbackInfo && callbackInfo.info && callbackInfo.info.exhaust) { - server._reRegisterHandler(mongoReply.requestId, callbackInfo); - } - - // Only execute callback if we have a caller - // chained is for findAndModify as it does not respect write concerns - if(callbackInfo && callbackInfo.callback && callbackInfo.info && Array.isArray(callbackInfo.info.chained)) { - // Check if callback has already been fired (missing chain command) - var chained = callbackInfo.info.chained; - var numberOfFoundCallbacks = 0; - for(var i = 0; i < chained.length; i++) { - if(server._hasHandler(chained[i])) numberOfFoundCallbacks++; - } - - // If we have already fired then clean up rest of chain and move on - if(numberOfFoundCallbacks != chained.length) { - for(var i = 0; i < chained.length; i++) { - server._removeHandler(chained[i]); - } - - // Just return from function - return; - } - - // Parse the body - mongoReply.parseBody(message, connectionPool.bson, callbackInfo.info.raw, function(err) { - if(err != null) { - // If pool connection is already closed - if(server._serverState === 'disconnected') return; - // Set server state to disconnected - server._serverState = 'disconnected'; - // Remove all listeners and close the connection pool - server.removeAllListeners(); - connectionPool.stop(true); - - // If we have a callback return the error - if(typeof callback === 'function') { - // ensure no callbacks get called twice - var internalCallback = callback; - callback = null; - // Perform callback - internalCallback(new Error("connection closed due to parseError"), null, server); - } else if(server.isSetMember()) { - if(server.listeners("parseError") && server.listeners("parseError").length > 0) server.emit("parseError", new Error("connection closed due to parseError"), server); - } else { - if(eventReceiver.listeners("parseError") && eventReceiver.listeners("parseError").length > 0) eventReceiver.emit("parseError", new Error("connection closed due to parseError"), server); - } - - // If we are a single server connection fire errors correctly - if(!server.isSetMember()) { - // Fire all callback errors - server.__executeAllCallbacksWithError(new Error("connection closed due to parseError")); - // Emit error - _emitAcrossAllDbInstances(server, eventReceiver, "parseError", server, null, true); - } - // Short cut - return; - } - - // Fetch the callback - var callbackInfo = server._findHandler(mongoReply.responseTo.toString()); - // If we have an error let's execute the callback and clean up all other - // chained commands - var firstResult = mongoReply && mongoReply.documents; - - // Check for an error, if we have one let's trigger the callback and clean up - // The chained callbacks - if(firstResult[0].err != null || firstResult[0].errmsg != null) { - // Trigger the callback for the error - server._callHandler(mongoReply.responseTo, mongoReply, null); - } else { - var chainedIds = callbackInfo.info.chained; - - if(chainedIds.length > 0 && chainedIds[chainedIds.length - 1] == mongoReply.responseTo) { - // Cleanup all other chained calls - chainedIds.pop(); - // Remove listeners - for(var i = 0; i < chainedIds.length; i++) server._removeHandler(chainedIds[i]); - // Call the handler - server._callHandler(mongoReply.responseTo, callbackInfo.info.results.shift(), null); - } else{ - // Add the results to all the results - for(var i = 0; i < chainedIds.length; i++) { - var handler = server._findHandler(chainedIds[i]); - // Check if we have an object, if it's the case take the current object commands and - // and add this one - if(handler.info != null) { - handler.info.results = Array.isArray(callbackInfo.info.results) ? callbackInfo.info.results : []; - handler.info.results.push(mongoReply); - } - } - } - } - }); - } else if(callbackInfo && callbackInfo.callback && callbackInfo.info) { - // Parse the body - mongoReply.parseBody(message, connectionPool.bson, callbackInfo.info.raw, function(err) { - if(err != null) { - // If pool connection is already closed - if(server._serverState === 'disconnected') return; - // Set server state to disconnected - server._serverState = 'disconnected'; - // Remove all listeners and close the connection pool - server.removeAllListeners(); - connectionPool.stop(true); - - // If we have a callback return the error - if(typeof callback === 'function') { - // ensure no callbacks get called twice - var internalCallback = callback; - callback = null; - // Perform callback - internalCallback(new Error("connection closed due to parseError"), null, server); - } else if(server.isSetMember()) { - if(server.listeners("parseError") && server.listeners("parseError").length > 0) server.emit("parseError", new Error("connection closed due to parseError"), server); - } else { - if(eventReceiver.listeners("parseError") && eventReceiver.listeners("parseError").length > 0) eventReceiver.emit("parseError", new Error("connection closed due to parseError"), server); - } - - // If we are a single server connection fire errors correctly - if(!server.isSetMember()) { - // Fire all callback errors - server.__executeAllCallbacksWithError(new Error("connection closed due to parseError")); - // Emit error - _emitAcrossAllDbInstances(server, eventReceiver, "parseError", server, null, true); - } - // Short cut - return; - } - - // Let's record the stats info if it's enabled - if(server.recordQueryStats == true && server._state['runtimeStats'] != null - && server._state.runtimeStats['queryStats'] instanceof RunningStats) { - // Add data point to the running statistics object - server._state.runtimeStats.queryStats.push(new Date().getTime() - callbackInfo.info.start); - } - - server._callHandler(mongoReply.responseTo, mongoReply, null); - }); - } - } - } catch (err) { - // Throw error in next tick - process.nextTick(function() { - throw err; - }) - } - }); - - // Handle timeout - connectionPool.on("timeout", function(err) { - // If pool connection is already closed - if(server._serverState === 'disconnected') return; - // Set server state to disconnected - server._serverState = 'disconnected'; - // If we have a callback return the error - if(typeof callback === 'function') { - // ensure no callbacks get called twice - var internalCallback = callback; - callback = null; - // Perform callback - internalCallback(err, null, server); - } else if(server.isSetMember()) { - if(server.listeners("timeout") && server.listeners("timeout").length > 0) server.emit("timeout", err, server); - } else { - if(eventReceiver.listeners("timeout") && eventReceiver.listeners("timeout").length > 0) eventReceiver.emit("timeout", err, server); - } - - // If we are a single server connection fire errors correctly - if(!server.isSetMember()) { - // Fire all callback errors - server.__executeAllCallbacksWithError(err); - // Emit error - _emitAcrossAllDbInstances(server, eventReceiver, "timeout", err, server, true); - } - }); - - // Handle errors - connectionPool.on("error", function(message, connection, error_options) { - // If pool connection is already closed - if(server._serverState === 'disconnected') return; - // Set server state to disconnected - server._serverState = 'disconnected'; - // Error message - var error_message = new Error(message && message.err ? message.err : message); - // Error message coming from ssl - if(error_options && error_options.ssl) error_message.ssl = true; - // If we have a callback return the error - if(typeof callback === 'function') { - // ensure no callbacks get called twice - var internalCallback = callback; - callback = null; - // Perform callback - internalCallback(error_message, null, server); - } else if(server.isSetMember()) { - if(server.listeners("error") && server.listeners("error").length > 0) server.emit("error", error_message, server); - } else { - if(eventReceiver.listeners("error") && eventReceiver.listeners("error").length > 0) eventReceiver.emit("error", error_message, server); - } - - // If we are a single server connection fire errors correctly - if(!server.isSetMember()) { - // Fire all callback errors - server.__executeAllCallbacksWithError(error_message); - // Emit error - _emitAcrossAllDbInstances(server, eventReceiver, "error", error_message, server, true); - } - }); - - // Handle close events - connectionPool.on("close", function() { - // If pool connection is already closed - if(server._serverState === 'disconnected') return; - // Set server state to disconnected - server._serverState = 'disconnected'; - // If we have a callback return the error - if(typeof callback == 'function') { - // ensure no callbacks get called twice - var internalCallback = callback; - callback = null; - // Perform callback - internalCallback(new Error("connection closed"), null, server); - } else if(server.isSetMember()) { - if(server.listeners("close") && server.listeners("close").length > 0) server.emit("close", new Error("connection closed"), server); - } else { - if(eventReceiver.listeners("close") && eventReceiver.listeners("close").length > 0) eventReceiver.emit("close", new Error("connection closed"), server); - } - - // If we are a single server connection fire errors correctly - if(!server.isSetMember()) { - // Fire all callback errors - server.__executeAllCallbacksWithError(new Error("connection closed")); - // Emit error - _emitAcrossAllDbInstances(server, eventReceiver, "close", server, null, true); - } - }); - - // If we have a parser error we are in an unknown state, close everything and emit - // error - connectionPool.on("parseError", function(message) { - // If pool connection is already closed - if(server._serverState === 'disconnected') return; - // Set server state to disconnected - server._serverState = 'disconnected'; - // If we have a callback return the error - if(typeof callback === 'function') { - // ensure no callbacks get called twice - var internalCallback = callback; - callback = null; - // Perform callback - internalCallback(new Error("connection closed due to parseError"), null, server); - } else if(server.isSetMember()) { - if(server.listeners("parseError") && server.listeners("parseError").length > 0) server.emit("parseError", new Error("connection closed due to parseError"), server); - } else { - if(eventReceiver.listeners("parseError") && eventReceiver.listeners("parseError").length > 0) eventReceiver.emit("parseError", new Error("connection closed due to parseError"), server); - } - - // If we are a single server connection fire errors correctly - if(!server.isSetMember()) { - // Fire all callback errors - server.__executeAllCallbacksWithError(new Error("connection closed due to parseError")); - // Emit error - _emitAcrossAllDbInstances(server, eventReceiver, "parseError", server, null, true); - } - }); - - // Boot up connection poole, pass in a locator of callbacks - connectionPool.start(); -} - -/** - * @ignore - */ -var _emitAcrossAllDbInstances = function(server, filterDb, event, message, object, resetConnection) { - // Emit close event across all db instances sharing the sockets - var allServerInstances = server.allServerInstances(); - // Fetch the first server instance - var serverInstance = allServerInstances[0]; - // For all db instances signal all db instances - if(Array.isArray(serverInstance.dbInstances) && serverInstance.dbInstances.length >= 1) { - for(var i = 0; i < serverInstance.dbInstances.length; i++) { - var dbInstance = serverInstance.dbInstances[i]; - // Set the parent - if(resetConnection && typeof dbInstance.openCalled != 'undefined') - dbInstance.openCalled = false; - // Check if it's our current db instance and skip if it is - if(filterDb == null || filterDb.databaseName !== dbInstance.databaseName || filterDb.tag !== dbInstance.tag) { - // Only emit if there is a listener - if(dbInstance.listeners(event).length > 0) - dbInstance.emit(event, message, object); - } - } - } -} - -/** - * @ignore - */ -Server.prototype.allRawConnections = function() { - return this.connectionPool.getAllConnections(); -} - -/** - * Check if a writer can be provided - * @ignore - */ -var canCheckoutWriter = function(self, read) { - // We cannot write to an arbiter or secondary server - if(self.isMasterDoc['arbiterOnly'] == true) { - return new Error("Cannot write to an arbiter"); - } if(self.isMasterDoc['secondary'] == true) { - return new Error("Cannot write to a secondary"); - } else if(read == true && self._readPreference == ReadPreference.SECONDARY && self.isMasterDoc['ismaster'] == true) { - return new Error("Cannot read from primary when secondary only specified"); - } - - // Return no error - return null; -} - -/** - * @ignore - */ -Server.prototype.checkoutWriter = function(read) { - if(read == true) return this.connectionPool.checkoutConnection(); - // Check if are allowed to do a checkout (if we try to use an arbiter f.ex) - var result = canCheckoutWriter(this, read); - // If the result is null check out a writer - if(result == null && this.connectionPool != null) { - return this.connectionPool.checkoutConnection(); - } else if(result == null) { - return null; - } else { - return result; - } -} - -/** - * Check if a reader can be provided - * @ignore - */ -var canCheckoutReader = function(self) { - // We cannot write to an arbiter or secondary server - if(self.isMasterDoc && self.isMasterDoc['arbiterOnly'] == true) { - return new Error("Cannot write to an arbiter"); - } else if(self._readPreference != null) { - // If the read preference is Primary and the instance is not a master return an error - if((self._readPreference == ReadPreference.PRIMARY) && self.isMasterDoc['ismaster'] != true) { - return new Error("Read preference is Server.PRIMARY and server is not master"); - } else if(self._readPreference == ReadPreference.SECONDARY && self.isMasterDoc['ismaster'] == true) { - return new Error("Cannot read from primary when secondary only specified"); - } - } - - // Return no error - return null; -} - -/** - * @ignore - */ -Server.prototype.checkoutReader = function() { - // Check if are allowed to do a checkout (if we try to use an arbiter f.ex) - var result = canCheckoutReader(this); - // If the result is null check out a writer - if(result == null && this.connectionPool != null) { - return this.connectionPool.checkoutConnection(); - } else if(result == null) { - return null; - } else { - return result; - } -} - -/** - * @ignore - */ -Server.prototype.enableRecordQueryStats = function(enable) { - this.recordQueryStats = enable; -} - -/** - * Internal statistics object used for calculating average and standard devitation on - * running queries - * @ignore - */ -var RunningStats = function() { - var self = this; - this.m_n = 0; - this.m_oldM = 0.0; - this.m_oldS = 0.0; - this.m_newM = 0.0; - this.m_newS = 0.0; - - // Define getters - Object.defineProperty(this, "numDataValues", { enumerable: true - , get: function () { return this.m_n; } - }); - - Object.defineProperty(this, "mean", { enumerable: true - , get: function () { return (this.m_n > 0) ? this.m_newM : 0.0; } - }); - - Object.defineProperty(this, "variance", { enumerable: true - , get: function () { return ((this.m_n > 1) ? this.m_newS/(this.m_n - 1) : 0.0); } - }); - - Object.defineProperty(this, "standardDeviation", { enumerable: true - , get: function () { return Math.sqrt(this.variance); } - }); - - Object.defineProperty(this, "sScore", { enumerable: true - , get: function () { - var bottom = this.mean + this.standardDeviation; - if(bottom == 0) return 0; - return ((2 * this.mean * this.standardDeviation)/(bottom)); - } - }); -} - -/** - * @ignore - */ -RunningStats.prototype.push = function(x) { - // Update the number of samples - this.m_n = this.m_n + 1; - // See Knuth TAOCP vol 2, 3rd edition, page 232 - if(this.m_n == 1) { - this.m_oldM = this.m_newM = x; - this.m_oldS = 0.0; - } else { - this.m_newM = this.m_oldM + (x - this.m_oldM) / this.m_n; - this.m_newS = this.m_oldS + (x - this.m_oldM) * (x - this.m_newM); - - // set up for next iteration - this.m_oldM = this.m_newM; - this.m_oldS = this.m_newS; - } -} - -/** - * @ignore - */ -Object.defineProperty(Server.prototype, "autoReconnect", { enumerable: true - , get: function () { - return this.options['auto_reconnect'] == null ? false : this.options['auto_reconnect']; - } -}); - -/** - * @ignore - */ -Object.defineProperty(Server.prototype, "connection", { enumerable: true - , get: function () { - return this.internalConnection; - } - , set: function(connection) { - this.internalConnection = connection; - } -}); - -/** - * @ignore - */ -Object.defineProperty(Server.prototype, "master", { enumerable: true - , get: function () { - return this.internalMaster; - } - , set: function(value) { - this.internalMaster = value; - } -}); - -/** - * @ignore - */ -Object.defineProperty(Server.prototype, "primary", { enumerable: true - , get: function () { - return this; - } -}); - -/** - * Getter for query Stats - * @ignore - */ -Object.defineProperty(Server.prototype, "queryStats", { enumerable: true - , get: function () { - return this._state.runtimeStats.queryStats; - } -}); - -/** - * @ignore - */ -Object.defineProperty(Server.prototype, "runtimeStats", { enumerable: true - , get: function () { - return this._state.runtimeStats; - } -}); - -/** - * Get Read Preference method - * @ignore - */ -Object.defineProperty(Server.prototype, "readPreference", { enumerable: true - , get: function () { - if(this._readPreference == null && this.readSecondary) { - return Server.READ_SECONDARY; - } else if(this._readPreference == null && !this.readSecondary) { - return Server.READ_PRIMARY; - } else { - return this._readPreference; - } - } -}); - -/** - * @ignore - */ -exports.Server = Server; diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/strategies/ping_strategy.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/strategies/ping_strategy.js deleted file mode 100644 index dff9c12..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/strategies/ping_strategy.js +++ /dev/null @@ -1,290 +0,0 @@ -var Server = require("../server").Server - , format = require('util').format; - -// The ping strategy uses pings each server and records the -// elapsed time for the server so it can pick a server based on lowest -// return time for the db command {ping:true} -var PingStrategy = exports.PingStrategy = function(replicaset, secondaryAcceptableLatencyMS) { - this.replicaset = replicaset; - this.secondaryAcceptableLatencyMS = secondaryAcceptableLatencyMS; - this.state = 'disconnected'; - this.pingInterval = 5000; - // Class instance - this.Db = require("../../db").Db; - // Active db connections - this.dbs = {}; - // Logger api - this.Logger = null; -} - -// Starts any needed code -PingStrategy.prototype.start = function(callback) { - // already running? - if ('connected' == this.state) return; - - this.state = 'connected'; - - // Start ping server - this._pingServer(callback); -} - -// Stops and kills any processes running -PingStrategy.prototype.stop = function(callback) { - // Stop the ping process - this.state = 'disconnected'; - - // Stop all the server instances - for(var key in this.dbs) { - this.dbs[key].close(); - } - - // optional callback - callback && callback(null, null); -} - -PingStrategy.prototype.checkoutConnection = function(tags, secondaryCandidates) { - // Servers are picked based on the lowest ping time and then servers that lower than that + secondaryAcceptableLatencyMS - // Create a list of candidat servers, containing the primary if available - var candidateServers = []; - var self = this; - - // If we have not provided a list of candidate servers use the default setup - if(!Array.isArray(secondaryCandidates)) { - candidateServers = this.replicaset._state.master != null ? [this.replicaset._state.master] : []; - // Add all the secondaries - var keys = Object.keys(this.replicaset._state.secondaries); - for(var i = 0; i < keys.length; i++) { - candidateServers.push(this.replicaset._state.secondaries[keys[i]]) - } - } else { - candidateServers = secondaryCandidates; - } - - // Final list of eligable server - var finalCandidates = []; - - // If we have tags filter by tags - if(tags != null && typeof tags == 'object') { - // If we have an array or single tag selection - var tagObjects = Array.isArray(tags) ? tags : [tags]; - // Iterate over all tags until we find a candidate server - for(var _i = 0; _i < tagObjects.length; _i++) { - // Grab a tag object - var tagObject = tagObjects[_i]; - // Matching keys - var matchingKeys = Object.keys(tagObject); - // Remove any that are not tagged correctly - for(var i = 0; i < candidateServers.length; i++) { - var server = candidateServers[i]; - // If we have tags match - if(server.tags != null) { - var matching = true; - - // Ensure we have all the values - for(var j = 0; j < matchingKeys.length; j++) { - if(server.tags[matchingKeys[j]] != tagObject[matchingKeys[j]]) { - matching = false; - break; - } - } - - // If we have a match add it to the list of matching servers - if(matching) { - finalCandidates.push(server); - } - } - } - } - } else { - // Final array candidates - var finalCandidates = candidateServers; - } - - // Sort by ping time - finalCandidates.sort(function(a, b) { - return a.runtimeStats['pingMs'] > b.runtimeStats['pingMs']; - }); - - if(0 === finalCandidates.length) - return new Error("No replica set members available for query"); - - // find lowest server with a ping time - var lowest = finalCandidates.filter(function (server) { - return undefined != server.runtimeStats.pingMs; - })[0]; - - if(!lowest) { - lowest = finalCandidates[0]; - } - - // convert to integer - var lowestPing = lowest.runtimeStats.pingMs | 0; - - // determine acceptable latency - var acceptable = lowestPing + this.secondaryAcceptableLatencyMS; - - // remove any server responding slower than acceptable - var len = finalCandidates.length; - while(len--) { - if(finalCandidates[len].runtimeStats['pingMs'] > acceptable) { - finalCandidates.splice(len, 1); - } - } - - if(self.logger && self.logger.debug) { - self.logger.debug("Ping strategy selection order for tags", tags); - finalCandidates.forEach(function(c) { - self.logger.debug(format("%s:%s = %s ms", c.host, c.port, c.runtimeStats['pingMs']), null); - }) - } - - // If no candidates available return an error - if(finalCandidates.length == 0) - return new Error("No replica set members available for query"); - - // Pick a random acceptable server - var connection = finalCandidates[Math.round(Math.random(1000000) * (finalCandidates.length - 1))].checkoutReader(); - if(self.logger && self.logger.debug) { - if(connection) - self.logger.debug("picked server %s:%s", connection.socketOptions.host, connection.socketOptions.port); - } - return connection; -} - -PingStrategy.prototype._pingServer = function(callback) { - var self = this; - - // Ping server function - var pingFunction = function() { - if(self.state == 'disconnected') return; - - // Create a list of all servers we can send the ismaster command to - var allServers = self.replicaset._state.master != null ? [self.replicaset._state.master] : []; - - // Secondary keys - var keys = Object.keys(self.replicaset._state.secondaries); - // Add all secondaries - for(var i = 0; i < keys.length; i++) { - allServers.push(self.replicaset._state.secondaries[keys[i]]); - } - - // Number of server entries - var numberOfEntries = allServers.length; - - // We got keys - for(var i = 0; i < allServers.length; i++) { - - // We got a server instance - var server = allServers[i]; - - // Create a new server object, avoid using internal connections as they might - // be in an illegal state - new function(serverInstance) { - var _db = self.dbs[serverInstance.host + ":" + serverInstance.port]; - // If we have a db - if(_db != null) { - // Startup time of the command - var startTime = Date.now(); - - // Execute ping command in own scope - var _ping = function(__db, __serverInstance) { - // Execute ping on this connection - __db.executeDbCommand({ping:1}, {failFast:true}, function(err) { - if(err) { - delete self.dbs[__db.serverConfig.host + ":" + __db.serverConfig.port]; - __db.close(); - return done(); - } - - if(null != __serverInstance.runtimeStats && __serverInstance.isConnected()) { - __serverInstance.runtimeStats['pingMs'] = Date.now() - startTime; - } - - done(); - }); - }; - // Ping - _ping(_db, serverInstance); - } else { - // Create a new master connection - var _server = new Server(serverInstance.host, serverInstance.port, { - auto_reconnect: false, - returnIsMasterResults: true, - slaveOk: true, - poolSize: 1, - socketOptions: { connectTimeoutMS: self.replicaset._connectTimeoutMS }, - ssl: self.replicaset.ssl, - sslValidate: self.replicaset.sslValidate, - sslCA: self.replicaset.sslCA, - sslCert: self.replicaset.sslCert, - sslKey: self.replicaset.sslKey, - sslPass: self.replicaset.sslPass - }); - - // Create Db instance - var _db = new self.Db(self.replicaset.db.databaseName, _server, { safe: true }); - _db.on("close", function() { - delete self.dbs[this.serverConfig.host + ":" + this.serverConfig.port]; - }) - - var _ping = function(__db, __serverInstance) { - if(self.state == 'disconnected') { - self.stop(); - return; - } - - __db.open(function(err, db) { - if(self.state == 'disconnected' && __db != null) { - return __db.close(); - } - - if(err) { - delete self.dbs[__db.serverConfig.host + ":" + __db.serverConfig.port]; - __db.close(); - return done(); - } - - // Save instance - self.dbs[__db.serverConfig.host + ":" + __db.serverConfig.port] = __db; - - // Startup time of the command - var startTime = Date.now(); - - // Execute ping on this connection - __db.executeDbCommand({ping:1}, {failFast:true}, function(err) { - if(err) { - delete self.dbs[__db.serverConfig.host + ":" + __db.serverConfig.port]; - __db.close(); - return done(); - } - - if(null != __serverInstance.runtimeStats && __serverInstance.isConnected()) { - __serverInstance.runtimeStats['pingMs'] = Date.now() - startTime; - } - - done(); - }); - }); - }; - - _ping(_db, serverInstance); - } - - function done() { - // Adjust the number of checks - numberOfEntries--; - - // If we are done with all results coming back trigger ping again - if(0 === numberOfEntries && 'connected' == self.state) { - setTimeout(pingFunction, self.pingInterval); - } - } - }(server); - } - } - - // Start pingFunction - pingFunction(); - - callback && callback(null); -} diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/strategies/statistics_strategy.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/strategies/statistics_strategy.js deleted file mode 100644 index f9b8c46..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/strategies/statistics_strategy.js +++ /dev/null @@ -1,80 +0,0 @@ -// The Statistics strategy uses the measure of each end-start time for each -// query executed against the db to calculate the mean, variance and standard deviation -// and pick the server which the lowest mean and deviation -var StatisticsStrategy = exports.StatisticsStrategy = function(replicaset) { - this.replicaset = replicaset; - // Logger api - this.Logger = null; -} - -// Starts any needed code -StatisticsStrategy.prototype.start = function(callback) { - callback && callback(null, null); -} - -StatisticsStrategy.prototype.stop = function(callback) { - callback && callback(null, null); -} - -StatisticsStrategy.prototype.checkoutConnection = function(tags, secondaryCandidates) { - // Servers are picked based on the lowest ping time and then servers that lower than that + secondaryAcceptableLatencyMS - // Create a list of candidat servers, containing the primary if available - var candidateServers = []; - - // If we have not provided a list of candidate servers use the default setup - if(!Array.isArray(secondaryCandidates)) { - candidateServers = this.replicaset._state.master != null ? [this.replicaset._state.master] : []; - // Add all the secondaries - var keys = Object.keys(this.replicaset._state.secondaries); - for(var i = 0; i < keys.length; i++) { - candidateServers.push(this.replicaset._state.secondaries[keys[i]]) - } - } else { - candidateServers = secondaryCandidates; - } - - // Final list of eligable server - var finalCandidates = []; - - // If we have tags filter by tags - if(tags != null && typeof tags == 'object') { - // If we have an array or single tag selection - var tagObjects = Array.isArray(tags) ? tags : [tags]; - // Iterate over all tags until we find a candidate server - for(var _i = 0; _i < tagObjects.length; _i++) { - // Grab a tag object - var tagObject = tagObjects[_i]; - // Matching keys - var matchingKeys = Object.keys(tagObject); - // Remove any that are not tagged correctly - for(var i = 0; i < candidateServers.length; i++) { - var server = candidateServers[i]; - // If we have tags match - if(server.tags != null) { - var matching = true; - - // Ensure we have all the values - for(var j = 0; j < matchingKeys.length; j++) { - if(server.tags[matchingKeys[j]] != tagObject[matchingKeys[j]]) { - matching = false; - break; - } - } - - // If we have a match add it to the list of matching servers - if(matching) { - finalCandidates.push(server); - } - } - } - } - } else { - // Final array candidates - var finalCandidates = candidateServers; - } - - // If no candidates available return an error - if(finalCandidates.length == 0) return new Error("No replica set members available for query"); - // Pick a random server - return finalCandidates[Math.round(Math.random(1000000) * (finalCandidates.length - 1))].checkoutReader(); -} diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/url_parser.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/url_parser.js deleted file mode 100644 index d31e8a0..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/url_parser.js +++ /dev/null @@ -1,223 +0,0 @@ -var fs = require('fs'), - ReadPreference = require('./read_preference').ReadPreference; - -exports.parse = function(url, options) { - // Ensure we have a default options object if none set - options = options || {}; - // Variables - var connection_part = ''; - var auth_part = ''; - var query_string_part = ''; - var dbName = 'admin'; - - // Must start with mongodb - if(url.indexOf("mongodb://") != 0) - throw Error("URL must be in the format mongodb://user:pass@host:port/dbname"); - // If we have a ? mark cut the query elements off - if(url.indexOf("?") != -1) { - query_string_part = url.substr(url.indexOf("?") + 1); - connection_part = url.substring("mongodb://".length, url.indexOf("?")) - } else { - connection_part = url.substring("mongodb://".length); - } - - // Check if we have auth params - if(connection_part.indexOf("@") != -1) { - auth_part = connection_part.split("@")[0]; - connection_part = connection_part.split("@")[1]; - } - - // Check if the connection string has a db - if(connection_part.indexOf(".sock") != -1) { - if(connection_part.indexOf(".sock/") != -1) { - dbName = connection_part.split(".sock/")[1]; - connection_part = connection_part.split("/", connection_part.indexOf(".sock") + ".sock".length); - } - } else if(connection_part.indexOf("/") != -1) { - dbName = connection_part.split("/")[1]; - connection_part = connection_part.split("/")[0]; - } - - // Result object - var object = {}; - - // Pick apart the authentication part of the string - var authPart = auth_part || ''; - var auth = authPart.split(':', 2); - if(options['uri_decode_auth']){ - auth[0] = decodeURIComponent(auth[0]); - if(auth[1]){ - auth[1] = decodeURIComponent(auth[1]); - } - } - - // Add auth to final object if we have 2 elements - if(auth.length == 2) object.auth = {user: auth[0], password: auth[1]}; - - // Variables used for temporary storage - var hostPart; - var urlOptions; - var servers; - var serverOptions = {socketOptions: {}}; - var dbOptions = {read_preference_tags: []}; - var replSetServersOptions = {socketOptions: {}}; - // Add server options to final object - object.server_options = serverOptions; - object.db_options = dbOptions; - object.rs_options = replSetServersOptions; - object.mongos_options = {}; - - // Let's check if we are using a domain socket - if(url.match(/\.sock/)) { - // Split out the socket part - var domainSocket = url.substring( - url.indexOf("mongodb://") + "mongodb://".length - , url.lastIndexOf(".sock") + ".sock".length); - // Clean out any auth stuff if any - if(domainSocket.indexOf("@") != -1) domainSocket = domainSocket.split("@")[1]; - servers = [{domain_socket: domainSocket}]; - } else { - // Split up the db - hostPart = connection_part; - // Parse all server results - servers = hostPart.split(',').map(function(h) { - var hostPort = h.split(':', 2); - var _host = hostPort[0] || 'localhost'; - var _port = hostPort[1] != null ? parseInt(hostPort[1], 10) : 27017; - // Check for localhost?safe=true style case - if(_host.indexOf("?") != -1) _host = _host.split(/\?/)[0]; - - // Return the mapped object - return {host: _host, port: _port}; - }); - } - - // Get the db name - object.dbName = dbName || 'admin'; - // Split up all the options - urlOptions = (query_string_part || '').split(/[&;]/); - // Ugh, we have to figure out which options go to which constructor manually. - urlOptions.forEach(function(opt) { - if(!opt) return; - var splitOpt = opt.split('='), name = splitOpt[0], value = splitOpt[1]; - // Options implementations - switch(name) { - case 'slaveOk': - case 'slave_ok': - serverOptions.slave_ok = (value == 'true'); - break; - case 'maxPoolSize': - case 'poolSize': - serverOptions.poolSize = parseInt(value, 10); - replSetServersOptions.poolSize = parseInt(value, 10); - break; - case 'autoReconnect': - case 'auto_reconnect': - serverOptions.auto_reconnect = (value == 'true'); - break; - case 'minPoolSize': - throw new Error("minPoolSize not supported"); - case 'maxIdleTimeMS': - throw new Error("maxIdleTimeMS not supported"); - case 'waitQueueMultiple': - throw new Error("waitQueueMultiple not supported"); - case 'waitQueueTimeoutMS': - throw new Error("waitQueueTimeoutMS not supported"); - case 'uuidRepresentation': - throw new Error("uuidRepresentation not supported"); - case 'ssl': - if(value == 'prefer') { - serverOptions.ssl = value; - replSetServersOptions.ssl = value; - break; - } - serverOptions.ssl = (value == 'true'); - replSetServersOptions.ssl = (value == 'true'); - break; - case 'replicaSet': - case 'rs_name': - replSetServersOptions.rs_name = value; - break; - case 'reconnectWait': - replSetServersOptions.reconnectWait = parseInt(value, 10); - break; - case 'retries': - replSetServersOptions.retries = parseInt(value, 10); - break; - case 'readSecondary': - case 'read_secondary': - replSetServersOptions.read_secondary = (value == 'true'); - break; - case 'fsync': - dbOptions.fsync = (value == 'true'); - break; - case 'journal': - dbOptions.journal = (value == 'true'); - break; - case 'safe': - dbOptions.safe = (value == 'true'); - break; - case 'nativeParser': - case 'native_parser': - dbOptions.native_parser = (value == 'true'); - break; - case 'connectTimeoutMS': - serverOptions.socketOptions.connectTimeoutMS = parseInt(value, 10); - replSetServersOptions.socketOptions.connectTimeoutMS = parseInt(value, 10); - break; - case 'socketTimeoutMS': - serverOptions.socketOptions.socketTimeoutMS = parseInt(value, 10); - replSetServersOptions.socketOptions.socketTimeoutMS = parseInt(value, 10); - break; - case 'w': - dbOptions.w = parseInt(value, 10); - break; - case 'wtimeoutMS': - dbOptions.wtimeoutMS = parseInt(value, 10); - break; - case 'readPreference': - if(!ReadPreference.isValid(value)) throw new Error("readPreference must be either primary/primaryPreferred/secondary/secondaryPreferred/nearest"); - dbOptions.read_preference = value; - break; - case 'readPreferenceTags': - // Contains the tag object - var tagObject = {}; - if(value == null || value == '') { - dbOptions.read_preference_tags.push(tagObject); - break; - } - - // Split up the tags - var tags = value.split(/\,/); - for(var i = 0; i < tags.length; i++) { - var parts = tags[i].trim().split(/\:/); - tagObject[parts[0]] = parts[1]; - } - - // Set the preferences tags - dbOptions.read_preference_tags.push(tagObject); - break; - default: - break; - } - }); - - // No tags: should be null (not []) - if(dbOptions.read_preference_tags.length === 0) { - dbOptions.read_preference_tags = null; - } - - // Validate if there are an invalid write concern combinations - if((dbOptions.w == -1 || dbOptions.w == 0) && ( - dbOptions.journal == true - || dbOptions.fsync == true - || dbOptions.safe == true)) throw new Error("w set to -1 or 0 cannot be combined with safe/w/journal/fsync") - - // If no read preference set it to primary - if(!dbOptions.read_preference) dbOptions.read_preference = 'primary'; - - // Add servers to result - object.servers = servers; - // Returned parsed object - return object; -} diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursor.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursor.js deleted file mode 100644 index c4d417b..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursor.js +++ /dev/null @@ -1,1009 +0,0 @@ -var QueryCommand = require('./commands/query_command').QueryCommand, - GetMoreCommand = require('./commands/get_more_command').GetMoreCommand, - KillCursorCommand = require('./commands/kill_cursor_command').KillCursorCommand, - Long = require('bson').Long, - ReadPreference = require('./connection/read_preference').ReadPreference, - CursorStream = require('./cursorstream'), - utils = require('./utils'); - -/** - * Constructor for a cursor object that handles all the operations on query result - * using find. This cursor object is unidirectional and cannot traverse backwards. Clients should not be creating a cursor directly, - * but use find to acquire a cursor. (INTERNAL TYPE) - * - * Options - * - **skip** {Number} skip number of documents to skip. - * - **limit** {Number}, limit the number of results to return. -1 has a special meaning and is used by Db.eval. A value of 1 will also be treated as if it were -1. - * - **sort** {Array | Object}, set to sort the documents coming back from the query. Array of indexes, [['a', 1]] etc. - * - **hint** {Object}, hint force the query to use a specific index. - * - **explain** {Boolean}, explain return the explaination of the query. - * - **snapshot** {Boolean}, snapshot Snapshot mode assures no duplicates are returned. - * - **timeout** {Boolean}, timeout allow the query to timeout. - * - **tailable** {Boolean}, tailable allow the cursor to be tailable. - * - **awaitdata** {Boolean}, awaitdata allow the cursor to wait for data, only applicable for tailable cursor. - * - **batchSize** {Number}, batchSize the number of the subset of results to request the database to return for every request. This should initially be greater than 1 otherwise the database will automatically close the cursor. The batch size can be set to 1 with cursorInstance.batchSize after performing the initial query to the database. - * - **raw** {Boolean}, raw return all query documents as raw buffers (default false). - * - **read** {Boolean}, read specify override of read from source (primary/secondary). - * - **slaveOk** {Boolean}, slaveOk, sets the slaveOk flag on the query wire protocol for secondaries. - * - **returnKey** {Boolean}, returnKey only return the index key. - * - **maxScan** {Number}, maxScan limit the number of items to scan. - * - **min** {Number}, min set index bounds. - * - **max** {Number}, max set index bounds. - * - **showDiskLoc** {Boolean}, showDiskLoc show disk location of results. - * - **comment** {String}, comment you can put a $comment field on a query to make looking in the profiler logs simpler. - * - **numberOfRetries** {Number}, numberOfRetries if using awaidata specifies the number of times to retry on timeout. - * - **dbName** {String}, dbName override the default dbName. - * - **tailableRetryInterval** {Number}, tailableRetryInterval specify the miliseconds between getMores on tailable cursor. - * - **exhaust** {Boolean}, exhaust have the server send all the documents at once as getMore packets. - * - **partial** {Boolean}, partial have the sharded system return a partial result from mongos. - * - * @class Represents a Cursor. - * @param {Db} db the database object to work with. - * @param {Collection} collection the collection to query. - * @param {Object} selector the query selector. - * @param {Object} fields an object containing what fields to include or exclude from objects returned. - * @param {Object} [options] additional options for the collection. -*/ -function Cursor(db, collection, selector, fields, options) { - this.db = db; - this.collection = collection; - this.selector = selector; - this.fields = fields; - options = !options ? {} : options; - - this.skipValue = options.skip == null ? 0 : options.skip; - this.limitValue = options.limit == null ? 0 : options.limit; - this.sortValue = options.sort; - this.hint = options.hint; - this.explainValue = options.explain; - this.snapshot = options.snapshot; - this.timeout = options.timeout == null ? true : options.timeout; - this.tailable = options.tailable; - this.awaitdata = options.awaitdata; - this.numberOfRetries = options.numberOfRetries == null ? 5 : options.numberOfRetries; - this.currentNumberOfRetries = this.numberOfRetries; - this.batchSizeValue = options.batchSize == null ? 0 : options.batchSize; - this.slaveOk = options.slaveOk == null ? collection.slaveOk : options.slaveOk; - this.raw = options.raw == null ? false : options.raw; - this.read = options.read == null ? ReadPreference.PRIMARY : options.read; - this.returnKey = options.returnKey; - this.maxScan = options.maxScan; - this.min = options.min; - this.max = options.max; - this.showDiskLoc = options.showDiskLoc; - this.comment = options.comment; - this.tailableRetryInterval = options.tailableRetryInterval || 100; - this.exhaust = options.exhaust || false; - this.partial = options.partial || false; - - this.totalNumberOfRecords = 0; - this.items = []; - this.cursorId = Long.fromInt(0); - - // This name - this.dbName = options.dbName; - - // State variables for the cursor - this.state = Cursor.INIT; - // Keep track of the current query run - this.queryRun = false; - this.getMoreTimer = false; - - // If we are using a specific db execute against it - if(this.dbName != null) { - this.collectionName = this.dbName + "." + this.collection.collectionName; - } else { - this.collectionName = (this.db.databaseName ? this.db.databaseName + "." : '') + this.collection.collectionName; - } -}; - -/** - * Resets this cursor to its initial state. All settings like the query string, - * tailable, batchSizeValue, skipValue and limits are preserved. - * - * @return {Cursor} returns itself with rewind applied. - * @api public - */ -Cursor.prototype.rewind = function() { - var self = this; - - if (self.state != Cursor.INIT) { - if (self.state != Cursor.CLOSED) { - self.close(function() {}); - } - - self.numberOfReturned = 0; - self.totalNumberOfRecords = 0; - self.items = []; - self.cursorId = Long.fromInt(0); - self.state = Cursor.INIT; - self.queryRun = false; - } - - return self; -}; - - -/** - * Returns an array of documents. The caller is responsible for making sure that there - * is enough memory to store the results. Note that the array only contain partial - * results when this cursor had been previouly accessed. In that case, - * cursor.rewind() can be used to reset the cursor. - * - * @param {Function} callback This will be called after executing this method successfully. The first parameter will contain the Error object if an error occured, or null otherwise. The second parameter will contain an array of BSON deserialized objects as a result of the query. - * @return {null} - * @api public - */ -Cursor.prototype.toArray = function(callback) { - var self = this; - - if(!callback) { - throw new Error('callback is mandatory'); - } - - if(this.tailable) { - callback(new Error("Tailable cursor cannot be converted to array"), null); - } else if(this.state != Cursor.CLOSED) { - // return toArrayExhaust(self, callback); - // If we are using exhaust we can't use the quick fire method - if(self.exhaust) return toArrayExhaust(self, callback); - // Quick fire using trampoline to avoid nextTick - self.nextObject({noReturn: true}, function(err, result) { - if(err) return callback(utils.toError(err), null); - if(self.cursorId.toString() == "0") { - self.state = Cursor.CLOSED; - return callback(null, self.items); - } - - // Let's issue getMores until we have no more records waiting - getAllByGetMore(self, function(err, done) { - self.state = Cursor.CLOSED; - if(err) return callback(utils.toError(err), null); - callback(null, self.items); - }); - }) - - } else { - callback(new Error("Cursor is closed"), null); - } -} - -var toArrayExhaust = function(self, callback) { - var items = []; - - self.each(function(err, item) { - if(err != null) { - return callback(utils.toError(err), null); - } - - if(item != null && Array.isArray(items)) { - items.push(item); - } else { - var resultItems = items; - items = null; - self.items = []; - callback(null, resultItems); - } - }); -} - -var getAllByGetMore = function(self, callback) { - getMore(self, {noReturn: true}, function(err, result) { - if(err) return callback(utils.toError(err)); - if(result == null) return callback(null, null); - if(self.cursorId.toString() == "0") return callback(null, null); - getAllByGetMore(self, callback); - }) -} - -/** - * Iterates over all the documents for this cursor. As with **{cursor.toArray}**, - * not all of the elements will be iterated if this cursor had been previouly accessed. - * In that case, **{cursor.rewind}** can be used to reset the cursor. However, unlike - * **{cursor.toArray}**, the cursor will only hold a maximum of batch size elements - * at any given time if batch size is specified. Otherwise, the caller is responsible - * for making sure that the entire result can fit the memory. - * - * @param {Function} callback this will be called for while iterating every document of the query result. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the document. - * @return {null} - * @api public - */ -Cursor.prototype.each = function(callback) { - var self = this; - var fn; - - if (!callback) { - throw new Error('callback is mandatory'); - } - - if(this.state != Cursor.CLOSED) { - // If we are using exhaust we can't use the quick fire method - if(self.exhaust) return eachExhaust(self, callback); - // Quick fire using trampoline to avoid nextTick - if(this.items.length > 0) { - // Trampoline all the entries - while(fn = loop(self, callback)) fn(self, callback); - // Call each again - self.each(callback); - } else { - self.nextObject(function(err, item) { - - if(err) { - self.state = Cursor.CLOSED; - return callback(utils.toError(err), item); - } - - if(item == null) return callback(null, null); - callback(null, item); - self.each(callback); - }) - } - } else { - callback(new Error("Cursor is closed"), null); - } -} - -// Special for exhaust command as we don't initiate the actual result sets -// the server just sends them as they arrive meaning we need to get the IO event -// loop happen so we can receive more data from the socket or we return to early -// after the first fetch and loose all the incoming getMore's automatically issued -// from the server. -var eachExhaust = function(self, callback) { - //FIX: stack overflow (on deep callback) (cred: https://github.com/limp/node-mongodb-native/commit/27da7e4b2af02035847f262b29837a94bbbf6ce2) - process.nextTick(function(){ - // Fetch the next object until there is no more objects - self.nextObject(function(err, item) { - if(err != null) return callback(err, null); - if(item != null) { - callback(null, item); - eachExhaust(self, callback); - } else { - // Close the cursor if done - self.state = Cursor.CLOSED; - callback(err, null); - } - }); - }); -} - -// Trampoline emptying the number of retrieved items -// without incurring a nextTick operation -var loop = function(self, callback) { - // No more items we are done - if(self.items.length == 0) return; - // Get the next document - var doc = self.items.shift(); - // Callback - callback(null, doc); - // Loop - return loop; -} - -/** - * Determines how many result the query for this cursor will return - * - * @param {Boolean} applySkipLimit if set to true will apply the skip and limits set on the cursor. Defaults to false. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the number of results or null if an error occured. - * @return {null} - * @api public - */ -Cursor.prototype.count = function(applySkipLimit, callback) { - if(typeof applySkipLimit == 'function') { - callback = applySkipLimit; - applySkipLimit = false; - } - - var options = {}; - if(applySkipLimit) { - if(typeof this.skipValue == 'number') options.skip = this.skipValue; - if(typeof this.limitValue == 'number') options.limit = this.limitValue; - } - - // Call count command - this.collection.count(this.selector, options, callback); -}; - -/** - * Sets the sort parameter of this cursor to the given value. - * - * This method has the following method signatures: - * (keyOrList, callback) - * (keyOrList, direction, callback) - * - * @param {String|Array|Object} keyOrList This can be a string or an array. If passed as a string, the string will be the field to sort. If passed an array, each element will represent a field to be sorted and should be an array that contains the format [string, direction]. - * @param {String|Number} direction this determines how the results are sorted. "asc", "ascending" or 1 for asceding order while "desc", "desceding or -1 for descending order. Note that the strings are case insensitive. - * @param {Function} callback this will be called after executing this method. The first parameter will contain an error object when the cursor is already closed while the second parameter will contain a reference to this object upon successful execution. - * @return {Cursor} an instance of this object. - * @api public - */ -Cursor.prototype.sort = function(keyOrList, direction, callback) { - callback = callback || function(){}; - if(typeof direction === "function") { callback = direction; direction = null; } - - if(this.tailable) { - callback(new Error("Tailable cursor doesn't support sorting"), null); - } else if(this.queryRun == true || this.state == Cursor.CLOSED) { - callback(new Error("Cursor is closed"), null); - } else { - var order = keyOrList; - - if(direction != null) { - order = [[keyOrList, direction]]; - } - - this.sortValue = order; - callback(null, this); - } - return this; -}; - -/** - * Sets the limit parameter of this cursor to the given value. - * - * @param {Number} limit the new limit. - * @param {Function} [callback] this optional callback will be called after executing this method. The first parameter will contain an error object when the limit given is not a valid number or when the cursor is already closed while the second parameter will contain a reference to this object upon successful execution. - * @return {Cursor} an instance of this object. - * @api public - */ -Cursor.prototype.limit = function(limit, callback) { - if(this.tailable) { - if(callback) { - callback(new Error("Tailable cursor doesn't support limit"), null); - } else { - throw new Error("Tailable cursor doesn't support limit"); - } - } else if(this.queryRun == true || this.state == Cursor.CLOSED) { - if(callback) { - callback(new Error("Cursor is closed"), null); - } else { - throw new Error("Cursor is closed"); - } - } else { - if(limit != null && limit.constructor != Number) { - if(callback) { - callback(new Error("limit requires an integer"), null); - } else { - throw new Error("limit requires an integer"); - } - } else { - this.limitValue = limit; - if(callback) return callback(null, this); - } - } - - return this; -}; - -/** - * Sets the read preference for the cursor - * - * @param {String} the read preference for the cursor, one of Server.READ_PRIMARY, Server.READ_SECONDARY, Server.READ_SECONDARY_ONLY - * @param {Function} [callback] this optional callback will be called after executing this method. The first parameter will contain an error object when the read preference given is not a valid number or when the cursor is already closed while the second parameter will contain a reference to this object upon successful execution. - * @return {Cursor} an instance of this object. - * @api public - */ -Cursor.prototype.setReadPreference = function(readPreference, tags, callback) { - if(typeof tags == 'function') callback = tags; - - var _mode = readPreference != null && typeof readPreference == 'object' ? readPreference.mode : readPreference; - - if(this.queryRun == true || this.state == Cursor.CLOSED) { - if(callback == null) throw new Error("Cannot change read preference on executed query or closed cursor"); - callback(new Error("Cannot change read preference on executed query or closed cursor")); - } else if(_mode != null && _mode != 'primary' - && _mode != 'secondaryOnly' && _mode != 'secondary' - && _mode != 'nearest' && _mode != 'primaryPreferred' && _mode != 'secondaryPreferred') { - if(callback == null) throw new Error("only readPreference of primary, secondary, secondaryPreferred, primaryPreferred or nearest supported"); - callback(new Error("only readPreference of primary, secondary, secondaryPreferred, primaryPreferred or nearest supported")); - } else { - this.read = readPreference; - if(callback != null) callback(null, this); - } - - return this; -} - -/** - * Sets the skip parameter of this cursor to the given value. - * - * @param {Number} skip the new skip value. - * @param {Function} [callback] this optional callback will be called after executing this method. The first parameter will contain an error object when the skip value given is not a valid number or when the cursor is already closed while the second parameter will contain a reference to this object upon successful execution. - * @return {Cursor} an instance of this object. - * @api public - */ -Cursor.prototype.skip = function(skip, callback) { - callback = callback || function(){}; - - if(this.tailable) { - callback(new Error("Tailable cursor doesn't support skip"), null); - } else if(this.queryRun == true || this.state == Cursor.CLOSED) { - callback(new Error("Cursor is closed"), null); - } else { - if(skip != null && skip.constructor != Number) { - callback(new Error("skip requires an integer"), null); - } else { - this.skipValue = skip; - callback(null, this); - } - } - - return this; -}; - -/** - * Sets the batch size parameter of this cursor to the given value. - * - * @param {Number} batchSize the new batch size. - * @param {Function} [callback] this optional callback will be called after executing this method. The first parameter will contain an error object when the batchSize given is not a valid number or when the cursor is already closed while the second parameter will contain a reference to this object upon successful execution. - * @return {Cursor} an instance of this object. - * @api public - */ -Cursor.prototype.batchSize = function(batchSize, callback) { - if(this.state == Cursor.CLOSED) { - if(callback != null) { - return callback(new Error("Cursor is closed"), null); - } else { - throw new Error("Cursor is closed"); - } - } else if(batchSize != null && batchSize.constructor != Number) { - if(callback != null) { - return callback(new Error("batchSize requires an integer"), null); - } else { - throw new Error("batchSize requires an integer"); - } - } else { - this.batchSizeValue = batchSize; - if(callback != null) return callback(null, this); - } - - return this; -}; - -/** - * The limit used for the getMore command - * - * @return {Number} The number of records to request per batch. - * @ignore - * @api private - */ -var limitRequest = function(self) { - var requestedLimit = self.limitValue; - var absLimitValue = Math.abs(self.limitValue); - var absBatchValue = Math.abs(self.batchSizeValue); - - if(absLimitValue > 0) { - if (absBatchValue > 0) { - requestedLimit = Math.min(absLimitValue, absBatchValue); - } - } else { - requestedLimit = self.batchSizeValue; - } - - return requestedLimit; -}; - - -/** - * Generates a QueryCommand object using the parameters of this cursor. - * - * @return {QueryCommand} The command object - * @ignore - * @api private - */ -var generateQueryCommand = function(self) { - // Unpack the options - var queryOptions = QueryCommand.OPTS_NONE; - if(!self.timeout) { - queryOptions |= QueryCommand.OPTS_NO_CURSOR_TIMEOUT; - } - - if(self.tailable != null) { - queryOptions |= QueryCommand.OPTS_TAILABLE_CURSOR; - self.skipValue = self.limitValue = 0; - - // if awaitdata is set - if(self.awaitdata != null) { - queryOptions |= QueryCommand.OPTS_AWAIT_DATA; - } - } - - if(self.exhaust) { - queryOptions |= QueryCommand.OPTS_EXHAUST; - } - - if(self.slaveOk) { - queryOptions |= QueryCommand.OPTS_SLAVE; - } - - if(self.partial) { - queryOptions |= QueryCommand.OPTS_PARTIAL; - } - - // limitValue of -1 is a special case used by Db#eval - var numberToReturn = self.limitValue == -1 ? -1 : limitRequest(self); - - // Check if we need a special selector - if(self.sortValue != null || self.explainValue != null || self.hint != null || self.snapshot != null - || self.returnKey != null || self.maxScan != null || self.min != null || self.max != null - || self.showDiskLoc != null || self.comment != null) { - - // Build special selector - var specialSelector = {'$query':self.selector}; - if(self.sortValue != null) specialSelector['orderby'] = utils.formattedOrderClause(self.sortValue); - if(self.hint != null && self.hint.constructor == Object) specialSelector['$hint'] = self.hint; - if(self.snapshot != null) specialSelector['$snapshot'] = true; - if(self.returnKey != null) specialSelector['$returnKey'] = self.returnKey; - if(self.maxScan != null) specialSelector['$maxScan'] = self.maxScan; - if(self.min != null) specialSelector['$min'] = self.min; - if(self.max != null) specialSelector['$max'] = self.max; - if(self.showDiskLoc != null) specialSelector['$showDiskLoc'] = self.showDiskLoc; - if(self.comment != null) specialSelector['$comment'] = self.comment; - // If we have explain set only return a single document with automatic cursor close - if(self.explainValue != null) { - numberToReturn = (-1)*Math.abs(numberToReturn); - specialSelector['$explain'] = true; - } - - // Return the query - return new QueryCommand(self.db, self.collectionName, queryOptions, self.skipValue, numberToReturn, specialSelector, self.fields); - } else { - return new QueryCommand(self.db, self.collectionName, queryOptions, self.skipValue, numberToReturn, self.selector, self.fields); - } -}; - -/** - * @return {Object} Returns an object containing the sort value of this cursor with - * the proper formatting that can be used internally in this cursor. - * @ignore - * @api private - */ -Cursor.prototype.formattedOrderClause = function() { - return utils.formattedOrderClause(this.sortValue); -}; - -/** - * Converts the value of the sort direction into its equivalent numerical value. - * - * @param sortDirection {String|number} Range of acceptable values: - * 'ascending', 'descending', 'asc', 'desc', 1, -1 - * - * @return {number} The equivalent numerical value - * @throws Error if the given sortDirection is invalid - * @ignore - * @api private - */ -Cursor.prototype.formatSortValue = function(sortDirection) { - return utils.formatSortValue(sortDirection); -}; - -/** - * Gets the next document from the cursor. - * - * @param {Function} callback this will be called after executing this method. The first parameter will contain an error object on error while the second parameter will contain a document from the returned result or null if there are no more results. - * @api public - */ -Cursor.prototype.nextObject = function(options, callback) { - var self = this; - - if(typeof options == 'function') { - callback = options; - options = {}; - } - - if(self.state == Cursor.INIT) { - var cmd; - try { - cmd = generateQueryCommand(self); - } catch (err) { - return callback(err, null); - } - - // Execute command - var commandHandler = function(err, result) { - self.state = Cursor.OPEN; - if(err != null && result == null) return callback(utils.toError(err), null); - - if(!err && result.documents[0] && result.documents[0]['$err']) { - return self.close(function() {callback(utils.toError(result.documents[0]['$err']), null);}); - } - - self.queryRun = true; - self.state = Cursor.OPEN; // Adjust the state of the cursor - self.cursorId = result.cursorId; - self.totalNumberOfRecords = result.numberReturned; - - // Add the new documents to the list of items, using forloop to avoid - // new array allocations and copying - for(var i = 0; i < result.documents.length; i++) { - self.items.push(result.documents[i]); - } - - // If we have noReturn set just return (not modifying the internal item list) - // used for toArray - if(options.noReturn) { - return callback(null, true); - } - - // Ignore callbacks until the cursor is dead for exhausted - if(self.exhaust && result.cursorId.toString() == "0") { - self.nextObject(callback); - } else if(self.exhaust == false || self.exhaust == null) { - self.nextObject(callback); - } - }; - - // If we have no connection set on this cursor check one out - if(self.connection == null) { - try { - self.connection = this.read == null ? self.db.serverConfig.checkoutWriter() : self.db.serverConfig.checkoutReader(this.read); - } catch(err) { - return callback(utils.toError(err), null); - } - } - - // Execute the command - self.db._executeQueryCommand(cmd, {exhaust: self.exhaust, raw:self.raw, read:self.read, connection:self.connection}, commandHandler); - // Set the command handler to null - commandHandler = null; - } else if(self.items.length) { - callback(null, self.items.shift()); - } else if(self.cursorId.greaterThan(Long.fromInt(0))) { - getMore(self, callback); - } else { - // Force cursor to stay open - return self.close(function() {callback(null, null);}); - } -} - -/** - * Gets more results from the database if any. - * - * @param {Function} callback this will be called after executing this method. The first parameter will contain an error object on error while the second parameter will contain a document from the returned result or null if there are no more results. - * @ignore - * @api private - */ -var getMore = function(self, options, callback) { - var limit = 0; - - if(typeof options == 'function') { - callback = options; - options = {}; - } - - if(self.state == Cursor.GET_MORE) return callback(null, null); - - // Set get more in progress - self.state = Cursor.GET_MORE; - - // Set options - if (!self.tailable && self.limitValue > 0) { - limit = self.limitValue - self.totalNumberOfRecords; - if (limit < 1) { - self.close(function() {callback(null, null);}); - return; - } - } - - try { - var getMoreCommand = new GetMoreCommand( - self.db - , self.collectionName - , limitRequest(self) - , self.cursorId - ); - - // Set up options - var command_options = {read: self.read, raw: self.raw, connection:self.connection }; - - // Execute the command - self.db._executeQueryCommand(getMoreCommand, command_options, function(err, result) { - // Get more done - self.state = Cursor.OPEN; - - try { - if(err != null) { - return callback(utils.toError(err), null); - } - - var isDead = 1 === result.responseFlag && result.cursorId.isZero(); - - self.cursorId = result.cursorId; - self.totalNumberOfRecords += result.numberReturned; - - // Determine if there's more documents to fetch - if(result.numberReturned > 0) { - if (self.limitValue > 0) { - var excessResult = self.totalNumberOfRecords - self.limitValue; - - if (excessResult > 0) { - result.documents.splice(-1 * excessResult, excessResult); - } - } - - // Reset the tries for awaitdata if we are using it - self.currentNumberOfRetries = self.numberOfRetries; - // Get the documents - for(var i = 0; i < result.documents.length; i++) { - self.items.push(result.documents[i]); - } - - // Don's shift a document out as we need it for toArray - if(options.noReturn) { - return callback(null, true); - callback(null, true); - } else { - callback(null, self.items.shift()); - } - } else if(self.tailable && !isDead && self.awaitdata) { - // Excute the tailable cursor once more, will timeout after ~4 sec if awaitdata used - self.currentNumberOfRetries = self.currentNumberOfRetries - 1; - if(self.currentNumberOfRetries == 0) { - self.close(function() { - callback(new Error("tailable cursor timed out"), null); - }); - } else { - getMore(self, callback); - } - } else if(self.tailable && !isDead) { - self.getMoreTimer = setTimeout(function() { getMore(self, callback); }, self.tailableRetryInterval); - } else { - self.close(function() {callback(null, null); }); - } - - result = null; - } catch(err) { - callback(utils.toError(err), null); - } - }); - - getMoreCommand = null; - } catch(err) { - // Get more done - self.state = Cursor.OPEN; - - var handleClose = function() { - callback(utils.toError(err), null); - }; - - self.close(handleClose); - handleClose = null; - } -} - -/** - * Gets a detailed information about how the query is performed on this cursor and how - * long it took the database to process it. - * - * @param {Function} callback this will be called after executing this method. The first parameter will always be null while the second parameter will be an object containing the details. - * @api public - */ -Cursor.prototype.explain = function(callback) { - var limit = (-1)*Math.abs(this.limitValue); - - // * - **skip** {Number} skip number of documents to skip. - // * - **limit** {Number}, limit the number of results to return. -1 has a special meaning and is used by Db.eval. A value of 1 will also be treated as if it were -1. - // * - **hint** {Object}, hint force the query to use a specific index. - // * - **explain** {Boolean}, explain return the explaination of the query. - // * - **slaveOk** {Boolean}, slaveOk, sets the slaveOk flag on the query wire protocol for secondaries. - // * - **snapshot** {Boolean}, snapshot Snapshot mode assures no duplicates are returned. - // * - **timeout** {Boolean}, timeout allow the query to timeout. - // * - **tailable** {Boolean}, tailable allow the cursor to be tailable. - // * - **awaitdata** {Boolean}, awaitdata allow the cursor to wait for data, only applicable for tailable cursor. - // * - **batchSize** {Number}, batchSize the number of the subset of results to request the database to return for every request. This should initially be greater than 1 otherwise the database will automatically close the cursor. The batch size can be set to 1 with cursorInstance.batchSize after performing the initial query to the database. - // * - **raw** {Boolean}, raw return all query documents as raw buffers (default false). - // * - **read** {Boolean}, read specify override of read from source (primary/secondary). - // * - **returnKey** {Boolean}, returnKey only return the index key. - // * - **maxScan** {Number}, maxScan limit the number of items to scan. - // * - **min** {Number}, min set index bounds. - // * - **max** {Number}, max set index bounds. - // * - **showDiskLoc** {Boolean}, showDiskLoc show disk location of results. - // * - **comment** {String}, comment you can put a $comment field on a query to make looking in the profiler logs simpler. - // * - **numberOfRetries** {Number}, numberOfRetries if using awaidata specifies the number of times to retry on timeout. - // * - **dbName** {String}, dbName override the default dbName. - // * - **tailableRetryInterval** {Number}, tailableRetryInterval specify the miliseconds between getMores on tailable cursor. - // * - **exhaust** {Boolean}, exhaust have the server send all the documents at once as getMore packets. - // * - **partial** {Boolean}, partial have the sharded system return a partial result from mongos. - - // * - **sort** {Array | Object}, set to sort the documents coming back from the query. Array of indexes, [['a', 1]] etc. - -// function Cursor(db, collection, selector, fields, skip, limit -// - , sort, hint, explain, snapshot, timeout, tailable, batchSize, slaveOk, raw, read -// - , returnKey, maxScan, min, max, showDiskLoc, comment, awaitdata, numberOfRetries, dbName, tailableRetry - - // Create a new cursor and fetch the plan - var cursor = new Cursor(this.db, this.collection, this.selector, this.fields, { - skip: this.skipValue - , limit:limit - , sort: this.sortValue - , hint: this.hint - , explain: true - , snapshot: this.snapshot - , timeout: this.timeout - , tailable: this.tailable - , batchSize: this.batchSizeValue - , slaveOk: this.slaveOk - , raw: this.raw - , read: this.read - , returnKey: this.returnKey - , maxScan: this.maxScan - , min: this.min - , max: this.max - , showDiskLoc: this.showDiskLoc - , comment: this.comment - , awaitdata: this.awaitdata - , numberOfRetries: this.numberOfRetries - , dbName: this.dbName - }); - - // Fetch the explaination document - cursor.nextObject(function(err, item) { - if(err != null) return callback(utils.toError(err), null); - // close the cursor - cursor.close(function(err, result) { - if(err != null) return callback(utils.toError(err), null); - callback(null, item); - }); - }); -}; - -/** - * @ignore - */ -Cursor.prototype.streamRecords = function(options) { - console.log("[WARNING] streamRecords method is deprecated, please use stream method which is much faster"); - var args = Array.prototype.slice.call(arguments, 0); - options = args.length ? args.shift() : {}; - - var - self = this, - stream = new process.EventEmitter(), - recordLimitValue = this.limitValue || 0, - emittedRecordCount = 0, - queryCommand = generateQueryCommand(self); - - // see http://www.mongodb.org/display/DOCS/Mongo+Wire+Protocol - queryCommand.numberToReturn = options.fetchSize ? options.fetchSize : 500; - // Execute the query - execute(queryCommand); - - function execute(command) { - self.db._executeQueryCommand(command, {exhaust: self.exhaust, read:self.read, raw:self.raw, connection:self.connection}, function(err,result) { - if(err) { - stream.emit('error', err); - self.close(function(){}); - return; - } - - if (!self.queryRun && result) { - self.queryRun = true; - self.cursorId = result.cursorId; - self.state = Cursor.OPEN; - self.getMoreCommand = new GetMoreCommand(self.db, self.collectionName, queryCommand.numberToReturn, result.cursorId); - } - - var resflagsMap = { - CursorNotFound:1<<0, - QueryFailure:1<<1, - ShardConfigStale:1<<2, - AwaitCapable:1<<3 - }; - - if(result.documents && result.documents.length && !(result.responseFlag & resflagsMap.QueryFailure)) { - try { - result.documents.forEach(function(doc){ - if(recordLimitValue && emittedRecordCount>=recordLimitValue) { - throw("done"); - } - emittedRecordCount++; - stream.emit('data', doc); - }); - } catch(err) { - if (err != "done") { throw err; } - else { - self.close(function(){ - stream.emit('end', recordLimitValue); - }); - self.close(function(){}); - return; - } - } - // rinse & repeat - execute(self.getMoreCommand); - } else { - self.close(function(){ - stream.emit('end', recordLimitValue); - }); - } - }); - } - - return stream; -}; - -/** - * Returns a Node ReadStream interface for this cursor. - * - * @return {CursorStream} returns a stream object. - * @api public - */ -Cursor.prototype.stream = function stream () { - return new CursorStream(this); -} - -/** - * Close the cursor. - * - * @param {Function} callback this will be called after executing this method. The first parameter will always contain null while the second parameter will contain a reference to this cursor. - * @return {null} - * @api public - */ -Cursor.prototype.close = function(callback) { - var self = this - this.getMoreTimer && clearTimeout(this.getMoreTimer); - // Close the cursor if not needed - if(this.cursorId instanceof Long && this.cursorId.greaterThan(Long.fromInt(0))) { - try { - var command = new KillCursorCommand(this.db, [this.cursorId]); - // Added an empty callback to ensure we don't throw any null exceptions - this.db._executeQueryCommand(command, {read:self.read, raw:self.raw, connection:self.connection}, function() {}); - } catch(err) {} - } - - // Null out the connection - self.connection = null; - // Reset cursor id - this.cursorId = Long.fromInt(0); - // Set to closed status - this.state = Cursor.CLOSED; - - if(callback) { - callback(null, self); - self.items = []; - } - - return this; -}; - -/** - * Check if the cursor is closed or open. - * - * @return {Boolean} returns the state of the cursor. - * @api public - */ -Cursor.prototype.isClosed = function() { - return this.state == Cursor.CLOSED ? true : false; -}; - -/** - * Init state - * - * @classconstant INIT - **/ -Cursor.INIT = 0; - -/** - * Cursor open - * - * @classconstant OPEN - **/ -Cursor.OPEN = 1; - -/** - * Cursor closed - * - * @classconstant CLOSED - **/ -Cursor.CLOSED = 2; - -/** - * Cursor performing a get more - * - * @classconstant OPEN - **/ -Cursor.GET_MORE = 3; - -/** - * @ignore - * @api private - */ -exports.Cursor = Cursor; diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursorstream.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursorstream.js deleted file mode 100644 index ee0cd80..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursorstream.js +++ /dev/null @@ -1,151 +0,0 @@ -/** - * Module dependecies. - */ -var Stream = require('stream').Stream; - -/** - * CursorStream - * - * Returns a stream interface for the **cursor**. - * - * Events - * - **data** {function(item) {}} the data event triggers when a document is ready. - * - **error** {function(err) {}} the error event triggers if an error happens. - * - **close** {function() {}} the end event triggers when there is no more documents available. - * - * @class Represents a CursorStream. - * @param {Cursor} cursor a cursor object that the stream wraps. - * @return {Stream} - */ -function CursorStream(cursor) { - if(!(this instanceof CursorStream)) return new CursorStream(cursor); - - Stream.call(this); - - this.readable = true; - this.paused = false; - this._cursor = cursor; - this._destroyed = null; - - // give time to hook up events - var self = this; - process.nextTick(function () { - self._init(); - }); -} - -/** - * Inherit from Stream - * @ignore - * @api private - */ -CursorStream.prototype.__proto__ = Stream.prototype; - -/** - * Flag stating whether or not this stream is readable. - */ -CursorStream.prototype.readable; - -/** - * Flag stating whether or not this stream is paused. - */ -CursorStream.prototype.paused; - -/** - * Initialize the cursor. - * @ignore - * @api private - */ -CursorStream.prototype._init = function () { - if (this._destroyed) return; - this._next(); -} - -/** - * Pull the next document from the cursor. - * @ignore - * @api private - */ -CursorStream.prototype._next = function () { - if (this.paused || this._destroyed) return; - - var self = this; - // Get the next object - process.nextTick(function() { - self._cursor.nextObject(function (err, doc) { - self._onNextObject(err, doc); - }); - }); -} - -/** - * Handle each document as its returned from the cursor. - * @ignore - * @api private - */ -CursorStream.prototype._onNextObject = function (err, doc) { - if(err) return this.destroy(err); - - // when doc is null we hit the end of the cursor - if(!doc && (this._cursor.state == 1 || this._cursor.state == 2)) { - this.emit('end') - return this.destroy(); - } else if(doc) { - this.emit('data', doc); - this._next(); - } -} - -/** - * Pauses the stream. - * - * @api public - */ -CursorStream.prototype.pause = function () { - this.paused = true; -} - -/** - * Resumes the stream. - * - * @api public - */ -CursorStream.prototype.resume = function () { - var self = this; - - // Don't do anything if we are not paused - if(!this.paused) return; - if(!this._cursor.state == 3) return; - - process.nextTick(function() { - self.paused = false; - // Only trigger more fetching if the cursor is open - self._next(); - }) -} - -/** - * Destroys the stream, closing the underlying - * cursor. No more events will be emitted. - * - * @api public - */ -CursorStream.prototype.destroy = function (err) { - if (this._destroyed) return; - this._destroyed = true; - this.readable = false; - - this._cursor.close(); - - if (err) { - this.emit('error', err); - } - - this.emit('close'); -} - -// TODO - maybe implement the raw option to pass binary? -//CursorStream.prototype.setEncoding = function () { -//} - -module.exports = exports = CursorStream; diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/db.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/db.js deleted file mode 100644 index 76635ec..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/db.js +++ /dev/null @@ -1,2133 +0,0 @@ -/** - * Module dependencies. - * @ignore - */ -var QueryCommand = require('./commands/query_command').QueryCommand, - DbCommand = require('./commands/db_command').DbCommand, - MongoReply = require('./responses/mongo_reply').MongoReply, - Admin = require('./admin').Admin, - Collection = require('./collection').Collection, - Server = require('./connection/server').Server, - ReplSet = require('./connection/repl_set').ReplSet, - ReadPreference = require('./connection/read_preference').ReadPreference, - Mongos = require('./connection/mongos').Mongos, - Cursor = require('./cursor').Cursor, - EventEmitter = require('events').EventEmitter, - inherits = require('util').inherits, - crypto = require('crypto'), - utils = require('./utils'), - parse = require('./connection/url_parser').parse; - -/** - * Create a new Db instance. - * - * Options - * - **w**, {Number/String, > -1 || 'majority' || tag name} the write concern for the operation where < 1 is no acknowlegement of write and w >= 1, w = 'majority' or tag acknowledges the write - * - **wtimeout**, {Number, 0} set the timeout for waiting for write concern to finish (combines with w option) - * - **fsync**, (Boolean, default:false) write waits for fsync before returning - * - **journal**, (Boolean, default:false) write waits for journal sync before returning - * - **readPreference** {String}, the prefered read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). - * - **native_parser** {Boolean, default:false}, use c++ bson parser. - * - **forceServerObjectId** {Boolean, default:false}, force server to create _id fields instead of client. - * - **pkFactory** {Object}, object overriding the basic ObjectID primary key generation. - * - **serializeFunctions** {Boolean, default:false}, serialize functions. - * - **raw** {Boolean, default:false}, peform operations using raw bson buffers. - * - **recordQueryStats** {Boolean, default:false}, record query statistics during execution. - * - **retryMiliSeconds** {Number, default:5000}, number of miliseconds between retries. - * - **numberOfRetries** {Number, default:5}, number of retries off connection. - * - **logger** {Object, default:null}, an object representing a logger that you want to use, needs to support functions debug, log, error **({error:function(message, object) {}, log:function(message, object) {}, debug:function(message, object) {}})**. - * - * Deprecated Options - * - **safe** {true | {w:n, wtimeout:n} | {fsync:true}, default:false}, executes with a getLastError command returning the results of the command on MongoDB. - * - * @class Represents a Db - * @param {String} databaseName name of the database. - * @param {Object} serverConfig server config object. - * @param {Object} [options] additional options for the collection. - */ -function Db(databaseName, serverConfig, options) { - if(!(this instanceof Db)) return new Db(databaseName, serverConfig, options); - - EventEmitter.call(this); - this.databaseName = databaseName; - this.serverConfig = serverConfig; - this.options = options == null ? {} : options; - // State to check against if the user force closed db - this._applicationClosed = false; - // Fetch the override flag if any - var overrideUsedFlag = this.options['override_used_flag'] == null ? false : this.options['override_used_flag']; - - // Verify that nobody is using this config - if(!overrideUsedFlag && this.serverConfig != null && typeof this.serverConfig == 'object' && this.serverConfig._isUsed && this.serverConfig._isUsed()) { - throw new Error("A Server or ReplSet instance cannot be shared across multiple Db instances"); - } else if(!overrideUsedFlag && typeof this.serverConfig == 'object'){ - // Set being used - this.serverConfig._used = true; - } - - // Ensure we have a valid db name - validateDatabaseName(databaseName); - - // Contains all the connections for the db - try { - this.native_parser = this.options.native_parser; - // The bson lib - var bsonLib = this.bsonLib = this.options.native_parser ? require('bson').BSONNative : require('bson').BSONPure; - // Fetch the serializer object - var BSON = bsonLib.BSON; - // Create a new instance - this.bson = new BSON([bsonLib.Long, bsonLib.ObjectID, bsonLib.Binary, bsonLib.Code, bsonLib.DBRef, bsonLib.Symbol, bsonLib.Double, bsonLib.Timestamp, bsonLib.MaxKey, bsonLib.MinKey]); - // Backward compatibility to access types - this.bson_deserializer = bsonLib; - this.bson_serializer = bsonLib; - } catch (err) { - // If we tried to instantiate the native driver - var msg = "Native bson parser not compiled, please compile " - + "or avoid using native_parser=true"; - throw Error(msg); - } - - // Internal state of the server - this._state = 'disconnected'; - - this.pkFactory = this.options.pk == null ? bsonLib.ObjectID : this.options.pk; - this.forceServerObjectId = this.options.forceServerObjectId != null ? this.options.forceServerObjectId : false; - - // Added safe - this.safe = this.options.safe == null ? false : this.options.safe; - - // If we have not specified a "safe mode" we just print a warning to the console - if(this.options.safe == null && this.options.w == null && this.options.journal == null && this.options.fsync == null) { - console.log("========================================================================================"); - console.log("= Please ensure that you set the default write concern for the database by setting ="); - console.log("= one of the options ="); - console.log("= ="); - console.log("= w: (value of > -1 or the string 'majority'), where < 1 means ="); - console.log("= no write acknowlegement ="); - console.log("= journal: true/false, wait for flush to journal before acknowlegement ="); - console.log("= fsync: true/false, wait for flush to file system before acknowlegement ="); - console.log("= ="); - console.log("= For backward compatibility safe is still supported and ="); - console.log("= allows values of [true | false | {j:true} | {w:n, wtimeout:n} | {fsync:true}] ="); - console.log("= the default value is false which means the driver receives does not ="); - console.log("= return the information of the success/error of the insert/update/remove ="); - console.log("= ="); - console.log("= ex: new Db(new Server('localhost', 27017), {safe:false}) ="); - console.log("= ="); - console.log("= http://www.mongodb.org/display/DOCS/getLastError+Command ="); - console.log("= ="); - console.log("= The default of no acknowlegement will change in the very near future ="); - console.log("= ="); - console.log("= This message will disappear when the default safe is set on the driver Db ="); - console.log("========================================================================================"); - } - - // Internal states variables - this.notReplied ={}; - this.isInitializing = true; - this.auths = []; - this.openCalled = false; - - // Command queue, keeps a list of incoming commands that need to be executed once the connection is up - this.commands = []; - - // Set up logger - this.logger = this.options.logger != null - && (typeof this.options.logger.debug == 'function') - && (typeof this.options.logger.error == 'function') - && (typeof this.options.logger.log == 'function') - ? this.options.logger : {error:function(message, object) {}, log:function(message, object) {}, debug:function(message, object) {}}; - // Allow slaveOk - this.slaveOk = this.options["slave_ok"] == null ? false : this.options["slave_ok"]; - - var self = this; - // Associate the logger with the server config - this.serverConfig.logger = this.logger; - if(this.serverConfig.strategyInstance) this.serverConfig.strategyInstance.logger = this.logger; - this.tag = new Date().getTime(); - // Just keeps list of events we allow - this.eventHandlers = {error:[], parseError:[], poolReady:[], message:[], close:[]}; - - // Controls serialization options - this.serializeFunctions = this.options.serializeFunctions != null ? this.options.serializeFunctions : false; - - // Raw mode - this.raw = this.options.raw != null ? this.options.raw : false; - - // Record query stats - this.recordQueryStats = this.options.recordQueryStats != null ? this.options.recordQueryStats : false; - - // If we have server stats let's make sure the driver objects have it enabled - if(this.recordQueryStats == true) { - this.serverConfig.enableRecordQueryStats(true); - } - - // Retry information - this.retryMiliSeconds = this.options.retryMiliSeconds != null ? this.options.retryMiliSeconds : 1000; - this.numberOfRetries = this.options.numberOfRetries != null ? this.options.numberOfRetries : 60; - - // Set default read preference if any - this.readPreference = this.options.readPreference; -}; - -/** - * @ignore - */ -function validateDatabaseName(databaseName) { - if(typeof databaseName !== 'string') throw new Error("database name must be a string"); - if(databaseName.length === 0) throw new Error("database name cannot be the empty string"); - - var invalidChars = [" ", ".", "$", "/", "\\"]; - for(var i = 0; i < invalidChars.length; i++) { - if(databaseName.indexOf(invalidChars[i]) != -1) throw new Error("database names cannot contain the character '" + invalidChars[i] + "'"); - } -} - -/** - * @ignore - */ -inherits(Db, EventEmitter); - -/** - * Initialize the database connection. - * - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the index information or null if an error occured. - * @return {null} - * @api public - */ -Db.prototype.open = function(callback) { - var self = this; - - // Check that the user has not called this twice - if(this.openCalled) { - // Close db - this.close(); - // Throw error - throw new Error("db object already connecting, open cannot be called multiple times"); - } - - // If we have a specified read preference - if(this.readPreference != null) this.serverConfig.setReadPreference(this.readPreference); - - // Set that db has been opened - this.openCalled = true; - - // Set the status of the server - self._state = 'connecting'; - // Set up connections - if(self.serverConfig instanceof Server || self.serverConfig instanceof ReplSet || self.serverConfig instanceof Mongos) { - self.serverConfig.connect(self, {firstCall: true}, function(err, result) { - if(err != null) { - // Set that db has been closed - self.openCalled = false; - // Return error from connection - return callback(err, null); - } - // Set the status of the server - self._state = 'connected'; - // If we have queued up commands execute a command to trigger replays - if(self.commands.length > 0) _execute_queued_command(self); - // Callback - return callback(null, self); - }); - } else { - return callback(Error("Server parameter must be of type Server, ReplSet or Mongos"), null); - } -}; - -// Execute any baked up commands -var _execute_queued_command = function(self) { - // Execute any backed up commands - process.nextTick(function() { - // Execute any backed up commands - while(self.commands.length > 0) { - // Fetch the command - var command = self.commands.shift(); - // Execute based on type - if(command['type'] == 'query') { - __executeQueryCommand(self, command['db_command'], command['options'], command['callback']); - } else if(command['type'] == 'insert') { - __executeInsertCommand(self, command['db_command'], command['options'], command['callback']); - } - } - }); -} - -/** - * Create a new Db instance sharing the current socket connections. - * - * @param {String} dbName the name of the database we want to use. - * @return {Db} a db instance using the new database. - * @api public - */ -Db.prototype.db = function(dbName) { - // Copy the options and add out internal override of the not shared flag - var options = {}; - for(var key in this.options) { - options[key] = this.options[key]; - } - - // Add override flag - options['override_used_flag'] = true; - // Create a new db instance - var newDbInstance = new Db(dbName, this.serverConfig, options); - //copy over any auths, we may need them for reconnecting - if (this.serverConfig.db) { - newDbInstance.auths = this.serverConfig.db.auths; - } - // Add the instance to the list of approved db instances - var allServerInstances = this.serverConfig.allServerInstances(); - // Add ourselves to all server callback instances - for(var i = 0; i < allServerInstances.length; i++) { - var server = allServerInstances[i]; - server.dbInstances.push(newDbInstance); - } - // Return new db object - return newDbInstance; -} - -/** - * Close the current db connection, including all the child db instances. Emits close event if no callback is provided. - * - * @param {Boolean} [forceClose] connection can never be reused. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results or null if an error occured. - * @return {null} - * @api public - */ -Db.prototype.close = function(forceClose, callback) { - var self = this; - // Ensure we force close all connections - this._applicationClosed = false; - - if(typeof forceClose == 'function') { - callback = forceClose; - } else if(typeof forceClose == 'boolean') { - this._applicationClosed = forceClose; - } - - // Remove all listeners and close the connection - this.serverConfig.close(function(err, result) { - // Emit the close event - if(typeof callback !== 'function') self.emit("close"); - - // Emit close event across all db instances sharing the sockets - var allServerInstances = self.serverConfig.allServerInstances(); - // Fetch the first server instance - if(Array.isArray(allServerInstances) && allServerInstances.length > 0) { - var server = allServerInstances[0]; - // For all db instances signal all db instances - if(Array.isArray(server.dbInstances) && server.dbInstances.length > 1) { - for(var i = 0; i < server.dbInstances.length; i++) { - var dbInstance = server.dbInstances[i]; - // Check if it's our current db instance and skip if it is - if(dbInstance.databaseName !== self.databaseName && dbInstance.tag !== self.tag) { - server.dbInstances[i].emit("close"); - } - } - } - } - - // Remove all listeners - self.removeAllEventListeners(); - // You can reuse the db as everything is shut down - self.openCalled = false; - // If we have a callback call it - if(callback) callback(err, result); - }); -}; - -/** - * Access the Admin database - * - * @param {Function} [callback] returns the results. - * @return {Admin} the admin db object. - * @api public - */ -Db.prototype.admin = function(callback) { - if(callback == null) return new Admin(this); - callback(null, new Admin(this)); -}; - -/** - * Returns a cursor to all the collection information. - * - * @param {String} [collectionName] the collection name we wish to retrieve the information from. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the options or null if an error occured. - * @return {null} - * @api public - */ -Db.prototype.collectionsInfo = function(collectionName, callback) { - if(callback == null && typeof collectionName == 'function') { callback = collectionName; collectionName = null; } - // Create selector - var selector = {}; - // If we are limiting the access to a specific collection name - if(collectionName != null) selector.name = this.databaseName + "." + collectionName; - - // Return Cursor - // callback for backward compatibility - if(callback) { - callback(null, new Cursor(this, new Collection(this, DbCommand.SYSTEM_NAMESPACE_COLLECTION), selector)); - } else { - return new Cursor(this, new Collection(this, DbCommand.SYSTEM_NAMESPACE_COLLECTION), selector); - } -}; - -/** - * Get the list of all collection names for the specified db - * - * Options - * - **namesOnly** {String, default:false}, Return only the full collection namespace. - * - * @param {String} [collectionName] the collection name we wish to filter by. - * @param {Object} [options] additional options during update. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the collection names or null if an error occured. - * @return {null} - * @api public - */ -Db.prototype.collectionNames = function(collectionName, options, callback) { - var self = this; - var args = Array.prototype.slice.call(arguments, 0); - callback = args.pop(); - collectionName = args.length ? args.shift() : null; - options = args.length ? args.shift() : {}; - - // Ensure no breaking behavior - if(collectionName != null && typeof collectionName == 'object') { - options = collectionName; - collectionName = null; - } - - // Let's make our own callback to reuse the existing collections info method - self.collectionsInfo(collectionName, function(err, cursor) { - if(err != null) return callback(err, null); - - cursor.toArray(function(err, documents) { - if(err != null) return callback(err, null); - - // List of result documents that have been filtered - var filtered_documents = documents.filter(function(document) { - return !(document.name.indexOf(self.databaseName) == -1 || document.name.indexOf('$') != -1); - }); - - // If we are returning only the names - if(options.namesOnly) { - filtered_documents = filtered_documents.map(function(document) { return document.name }); - } - - // Return filtered items - callback(null, filtered_documents); - }); - }); -}; - -/** - * Fetch a specific collection (containing the actual collection information) - * - * Options -* - **w**, {Number/String, > -1 || 'majority' || tag name} the write concern for the operation where < 1 is no acknowlegement of write and w >= 1, w = 'majority' or tag acknowledges the write - * - **wtimeout**, {Number, 0} set the timeout for waiting for write concern to finish (combines with w option) - * - **fsync**, (Boolean, default:false) write waits for fsync before returning - * - **journal**, (Boolean, default:false) write waits for journal sync before returning - * - **serializeFunctions** {Boolean, default:false}, serialize functions on the document. - * - **raw** {Boolean, default:false}, perform all operations using raw bson objects. - * - **pkFactory** {Object}, object overriding the basic ObjectID primary key generation. - * - **readPreference** {String}, the prefered read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). - * - **strict**, (Boolean, default:false) throws and error if collection already exists - * - * Deprecated Options - * - **safe** {true | {w:n, wtimeout:n} | {fsync:true}, default:false}, executes with a getLastError command returning the results of the command on MongoDB. - * - * - * @param {String} collectionName the collection name we wish to access. - * @param {Object} [options] returns option results. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the collection or null if an error occured. - * @return {null} - * @api public - */ -Db.prototype.collection = function(collectionName, options, callback) { - var self = this; - if(typeof options === "function") { callback = options; options = {}; } - // Execute safe - - if(options && (options.strict)) { - self.collectionNames(collectionName, function(err, collections) { - if(err != null) return callback(err, null); - - if(collections.length == 0) { - return callback(new Error("Collection " + collectionName + " does not exist. Currently in safe mode."), null); - } else { - try { - var collection = new Collection(self, collectionName, self.pkFactory, options); - } catch(err) { - return callback(err, null); - } - return callback(null, collection); - } - }); - } else { - try { - var collection = new Collection(self, collectionName, self.pkFactory, options); - } catch(err) { - if(callback == null) { - throw err; - } else { - return callback(err, null); - } - } - - // If we have no callback return collection object - return callback == null ? collection : callback(null, collection); - } -}; - -/** - * Fetch all collections for the current db. - * - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the collections or null if an error occured. - * @return {null} - * @api public - */ -Db.prototype.collections = function(callback) { - var self = this; - // Let's get the collection names - self.collectionNames(function(err, documents) { - if(err != null) return callback(err, null); - var collections = []; - documents.forEach(function(document) { - collections.push(new Collection(self, document.name.replace(self.databaseName + ".", ''), self.pkFactory)); - }); - // Return the collection objects - callback(null, collections); - }); -}; - -/** - * Evaluate javascript on the server - * - * Options - * - **nolock** {Boolean, default:false}, Tell MongoDB not to block on the evaulation of the javascript. - * - * @param {Code} code javascript to execute on server. - * @param {Object|Array} [parameters] the parameters for the call. - * @param {Object} [options] the options - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from eval or null if an error occured. - * @return {null} - * @api public - */ -Db.prototype.eval = function(code, parameters, options, callback) { - // Unpack calls - var args = Array.prototype.slice.call(arguments, 1); - callback = args.pop(); - parameters = args.length ? args.shift() : parameters; - options = args.length ? args.shift() : {}; - - var finalCode = code; - var finalParameters = []; - // If not a code object translate to one - if(!(finalCode instanceof this.bsonLib.Code)) { - finalCode = new this.bsonLib.Code(finalCode); - } - - // Ensure the parameters are correct - if(parameters != null && parameters.constructor != Array && typeof parameters !== 'function') { - finalParameters = [parameters]; - } else if(parameters != null && parameters.constructor == Array && typeof parameters !== 'function') { - finalParameters = parameters; - } - - // Create execution selector - var selector = {'$eval':finalCode, 'args':finalParameters}; - // Check if the nolock parameter is passed in - if(options['nolock']) { - selector['nolock'] = options['nolock']; - } - - // Set primary read preference - options.readPreference = ReadPreference.PRIMARY; - - // Execute the eval - this.collection(DbCommand.SYSTEM_COMMAND_COLLECTION).findOne(selector, options, function(err, result) { - if(err) return callback(err); - - if(result && result.ok == 1) { - callback(null, result.retval); - } else if(result) { - callback(new Error("eval failed: " + result.errmsg), null); return; - } else { - callback(err, result); - } - }); -}; - -/** - * Dereference a dbref, against a db - * - * @param {DBRef} dbRef db reference object we wish to resolve. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from dereference or null if an error occured. - * @return {null} - * @api public - */ -Db.prototype.dereference = function(dbRef, callback) { - var db = this; - // If we have a db reference then let's get the db first - if(dbRef.db != null) db = this.db(dbRef.db); - // Fetch the collection and find the reference - var collection = db.collection(dbRef.namespace); - collection.findOne({'_id':dbRef.oid}, function(err, result) { - callback(err, result); - }); -}; - -/** - * Logout user from server, fire off on all connections and remove all auth info - * - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from logout or null if an error occured. - * @return {null} - * @api public - */ -Db.prototype.logout = function(options, callback) { - var self = this; - // Unpack calls - var args = Array.prototype.slice.call(arguments, 0); - callback = args.pop(); - options = args.length ? args.shift() : {}; - - // Number of connections we need to logout from - var numberOfConnections = this.serverConfig.allRawConnections().length; - - // Let's generate the logout command object - var logoutCommand = DbCommand.logoutCommand(self, {logout:1}, options); - self._executeQueryCommand(logoutCommand, {onAll:true}, function(err, result) { - // Count down - numberOfConnections = numberOfConnections - 1; - // Work around the case where the number of connections are 0 - if(numberOfConnections <= 0 && typeof callback == 'function') { - var internalCallback = callback; - callback = null; - // Reset auth - self.auths = []; - // Handle any errors - if(err == null && result.documents[0].ok == 1) { - internalCallback(null, true); - } else { - err != null ? internalCallback(err, false) : internalCallback(new Error(result.documents[0].errmsg), false); - } - } - }); -} - -/** - * Authenticate a user against the server. - * - * Options - * - **authdb** {String}, The database that the credentials are for, - * different from the name of the current DB, for example admin - * @param {String} username username. - * @param {String} password password. - * @param {Object} [options] the options - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from authentication or null if an error occured. - * @return {null} - * @api public - */ -Db.prototype.authenticate = function(username, password, options, callback) { - var self = this; - - if (typeof callback === 'undefined') { - callback = options; - options = {}; - } - // the default db to authenticate against is 'this' - // if authententicate is called from a retry context, it may be another one, like admin - var authdb = options.authdb ? options.authdb : self.databaseName; - // Push the new auth if we have no previous record - - var numberOfConnections = 0; - var errorObject = null; - - if(options['connection'] != null) { - //if a connection was explicitly passed on options, then we have only one... - numberOfConnections = 1; - } else { - // Get the amount of connections in the pool to ensure we have authenticated all comments - numberOfConnections = this.serverConfig.allRawConnections().length; - options['onAll'] = true; - } - - // Execute all four - this._executeQueryCommand(DbCommand.createGetNonceCommand(self), options, function(err, result, connection) { - // Execute on all the connections - if(err == null) { - // Nonce used to make authentication request with md5 hash - var nonce = result.documents[0].nonce; - // Execute command - self._executeQueryCommand(DbCommand.createAuthenticationCommand(self, username, password, nonce, authdb), {connection:connection}, function(err, result) { - // Count down - numberOfConnections = numberOfConnections - 1; - // Ensure we save any error - if(err) { - errorObject = err; - } else if(result.documents[0].err != null || result.documents[0].errmsg != null){ - errorObject = utils.toError(result.documents[0]); - } - - // Work around the case where the number of connections are 0 - if(numberOfConnections <= 0 && typeof callback == 'function') { - var internalCallback = callback; - callback = null; - - if(errorObject == null && result.documents[0].ok == 1) { - // We authenticated correctly save the credentials - self.auths = [{'username':username, 'password':password, 'authdb': authdb}]; - // Return callback - internalCallback(errorObject, true); - } else { - internalCallback(errorObject, false); - } - } - }); - } - }); -}; - -/** - * Add a user to the database. - * - * Options - * - **w**, {Number/String, > -1 || 'majority' || tag name} the write concern for the operation where < 1 is no acknowlegement of write and w >= 1, w = 'majority' or tag acknowledges the write - * - **wtimeout**, {Number, 0} set the timeout for waiting for write concern to finish (combines with w option) - * - **fsync**, (Boolean, default:false) write waits for fsync before returning - * - **journal**, (Boolean, default:false) write waits for journal sync before returning - * - * Deprecated Options - * - **safe** {true | {w:n, wtimeout:n} | {fsync:true}, default:false}, executes with a getLastError command returning the results of the command on MongoDB. - * - * @param {String} username username. - * @param {String} password password. - * @param {Object} [options] additional options during update. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from addUser or null if an error occured. - * @return {null} - * @api public - */ -Db.prototype.addUser = function(username, password, options, callback) { - var self = this; - var args = Array.prototype.slice.call(arguments, 2); - callback = args.pop(); - options = args.length ? args.shift() : {}; - - // Get the error options - var errorOptions = _getWriteConcern(this, options, callback); - errorOptions.w = errorOptions.w == null ? 1 : errorOptions.w; - // Use node md5 generator - var md5 = crypto.createHash('md5'); - // Generate keys used for authentication - md5.update(username + ":mongo:" + password); - var userPassword = md5.digest('hex'); - // Fetch a user collection - var collection = this.collection(DbCommand.SYSTEM_USER_COLLECTION); - // Check if we are inserting the first user - collection.count({}, function(err, count) { - // We got an error (f.ex not authorized) - if(err != null) return callback(err, null); - // Check if the user exists and update i - collection.find({user: username}, {dbName: options['dbName']}).toArray(function(err, documents) { - // We got an error (f.ex not authorized) - if(err != null) return callback(err, null); - // Add command keys - var commandOptions = errorOptions; - commandOptions.dbName = options['dbName']; - commandOptions.upsert = true; - - // We have a user, let's update the password or upsert if not - collection.update({user: username},{$set: {user: username, pwd: userPassword}}, commandOptions, function(err, results) { - if(count == 0 && err) { - callback(null, [{user:username, pwd:userPassword}]); - } else if(err) { - callback(err, null) - } else { - callback(null, [{user:username, pwd:userPassword}]); - } - }); - }); - }); -}; - -/** - * Remove a user from a database - * - * Options -* - **w**, {Number/String, > -1 || 'majority' || tag name} the write concern for the operation where < 1 is no acknowlegement of write and w >= 1, w = 'majority' or tag acknowledges the write - * - **wtimeout**, {Number, 0} set the timeout for waiting for write concern to finish (combines with w option) - * - **fsync**, (Boolean, default:false) write waits for fsync before returning - * - **journal**, (Boolean, default:false) write waits for journal sync before returning - * - * Deprecated Options - * - **safe** {true | {w:n, wtimeout:n} | {fsync:true}, default:false}, executes with a getLastError command returning the results of the command on MongoDB. - * - * @param {String} username username. - * @param {Object} [options] additional options during update. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from removeUser or null if an error occured. - * @return {null} - * @api public - */ -Db.prototype.removeUser = function(username, options, callback) { - var self = this; - var args = Array.prototype.slice.call(arguments, 1); - callback = args.pop(); - options = args.length ? args.shift() : {}; - - // Figure out the safe mode settings - var safe = self.safe != null && self.safe == false ? {w: 1} : self.safe; - // Override with options passed in if applicable - safe = options != null && options['safe'] != null ? options['safe'] : safe; - // Ensure it's at least set to safe - safe = safe == null ? {w: 1} : safe; - - // Fetch a user collection - var collection = this.collection(DbCommand.SYSTEM_USER_COLLECTION); - collection.findOne({user: username}, {dbName: options['dbName']}, function(err, user) { - if(user != null) { - // Add command keys - var commandOptions = safe; - commandOptions.dbName = options['dbName']; - - collection.remove({user: username}, commandOptions, function(err, result) { - callback(err, true); - }); - } else { - callback(err, false); - } - }); -}; - -/** - * Creates a collection on a server pre-allocating space, need to create f.ex capped collections. - * - * Options -* - **w**, {Number/String, > -1 || 'majority' || tag name} the write concern for the operation where < 1 is no acknowlegement of write and w >= 1, w = 'majority' or tag acknowledges the write - * - **wtimeout**, {Number, 0} set the timeout for waiting for write concern to finish (combines with w option) - * - **fsync**, (Boolean, default:false) write waits for fsync before returning - * - **journal**, (Boolean, default:false) write waits for journal sync before returning - * - **serializeFunctions** {Boolean, default:false}, serialize functions on the document. - * - **raw** {Boolean, default:false}, perform all operations using raw bson objects. - * - **pkFactory** {Object}, object overriding the basic ObjectID primary key generation. - * - **capped** {Boolean, default:false}, create a capped collection. - * - **size** {Number}, the size of the capped collection in bytes. - * - **max** {Number}, the maximum number of documents in the capped collection. - * - **autoIndexId** {Boolean, default:true}, create an index on the _id field of the document, True by default on MongoDB 2.2 or higher off for version < 2.2. - * - **readPreference** {String}, the prefered read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). - * - **strict**, (Boolean, default:false) throws and error if collection already exists - * - * Deprecated Options - * - **safe** {true | {w:n, wtimeout:n} | {fsync:true}, default:false}, executes with a getLastError command returning the results of the command on MongoDB. - * - * @param {String} collectionName the collection name we wish to access. - * @param {Object} [options] returns option results. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from createCollection or null if an error occured. - * @return {null} - * @api public - */ -Db.prototype.createCollection = function(collectionName, options, callback) { - var args = Array.prototype.slice.call(arguments, 1); - callback = args.pop(); - options = args.length ? args.shift() : null; - var self = this; - - // Figure out the safe mode settings - var safe = self.safe != null && self.safe == false ? {w: 1} : self.safe; - // Override with options passed in if applicable - safe = options != null && options['safe'] != null ? options['safe'] : safe; - // Ensure it's at least set to safe - safe = safe == null ? {w: 1} : safe; - - // Check if we have the name - this.collectionNames(collectionName, function(err, collections) { - if(err != null) return callback(err, null); - - var found = false; - collections.forEach(function(collection) { - if(collection.name == self.databaseName + "." + collectionName) found = true; - }); - - // If the collection exists either throw an exception (if db in safe mode) or return the existing collection - if(found && options && options.strict) { - return callback(new Error("Collection " + collectionName + " already exists. Currently in safe mode."), null); - } else if(found){ - try { - var collection = new Collection(self, collectionName, self.pkFactory, options); - } catch(err) { - return callback(err, null); - } - return callback(null, collection); - } - - // Create a new collection and return it - self._executeQueryCommand(DbCommand.createCreateCollectionCommand(self, collectionName, options), {read:false, safe:safe}, function(err, result) { - var document = result.documents[0]; - // If we have no error let's return the collection - if(err == null && document.ok == 1) { - try { - var collection = new Collection(self, collectionName, self.pkFactory, options); - } catch(err) { - return callback(err, null); - } - return callback(null, collection); - } else { - if (null == err) err = utils.toError(document); - callback(err, null); - } - }); - }); -}; - -/** - * Execute a command hash against MongoDB. This lets you acess any commands not available through the api on the server. - * - * @param {Object} selector the command hash to send to the server, ex: {ping:1}. - * @param {Function} callback this will be called after executing this method. The command always return the whole result of the command as the second parameter. - * @return {null} - * @api public - */ -Db.prototype.command = function(selector, options, callback) { - var args = Array.prototype.slice.call(arguments, 1); - callback = args.pop(); - options = args.length ? args.shift() : {}; - - // Set up the options - var cursor = new Cursor(this - , new Collection(this, DbCommand.SYSTEM_COMMAND_COLLECTION), selector, {}, { - limit: -1, timeout: QueryCommand.OPTS_NO_CURSOR_TIMEOUT, dbName: options['dbName'] - }); - - // Set read preference if we set one - var readPreference = options['readPreference'] ? options['readPreference'] : false; - - // Ensure only commands who support read Prefrences are exeuted otherwise override and use Primary - if(readPreference != false) { - if(selector['group'] || selector['aggregate'] || selector['collStats'] || selector['dbStats'] - || selector['count'] || selector['distinct'] || selector['geoNear'] || selector['geoSearch'] || selector['geoWalk'] - || (selector['mapreduce'] && selector.out == 'inline')) { - // Set the read preference - cursor.setReadPreference(readPreference); - } else { - cursor.setReadPreference(ReadPreference.PRIMARY); - } - } - - // Return the next object - cursor.nextObject(callback); -}; - -/** - * Drop a collection from the database, removing it permanently. New accesses will create a new collection. - * - * @param {String} collectionName the name of the collection we wish to drop. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from dropCollection or null if an error occured. - * @return {null} - * @api public - */ -Db.prototype.dropCollection = function(collectionName, callback) { - var self = this; - callback || (callback = function(){}); - - // Drop the collection - this._executeQueryCommand(DbCommand.createDropCollectionCommand(this, collectionName), function(err, result) { - if(err == null && result.documents[0].ok == 1) { - return callback(null, true); - } - - if(null == err) err = utils.toError(result.documents[0]); - callback(err, null); - }); -}; - -/** - * Rename a collection. - * - * Options - * - **dropTarget** {Boolean, default:false}, drop the target name collection if it previously exists. - * - * @param {String} fromCollection the name of the current collection we wish to rename. - * @param {String} toCollection the new name of the collection. - * @param {Object} [options] returns option results. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from renameCollection or null if an error occured. - * @return {null} - * @api public - */ -Db.prototype.renameCollection = function(fromCollection, toCollection, options, callback) { - var self = this; - - if(typeof options == 'function') { - callback = options; - options = {} - } - - callback || (callback = function(){}); - // Execute the command, return the new renamed collection if successful - this._executeQueryCommand(DbCommand.createRenameCollectionCommand(this, fromCollection, toCollection, options), function(err, result) { - if(err == null && result.documents[0].ok == 1) { - return callback(null, new Collection(self, toCollection, self.pkFactory)); - } - - if(null == err) err = utils.toError(result.documents[0]); - callback(err, null); - }); -}; - -/** - * Return last error message for the given connection, note options can be combined. - * - * Options - * - **fsync** {Boolean, default:false}, option forces the database to fsync all files before returning. - * - **j** {Boolean, default:false}, awaits the journal commit before returning, > MongoDB 2.0. - * - **w** {Number}, until a write operation has been replicated to N servers. - * - **wtimeout** {Number}, number of miliseconds to wait before timing out. - * - * Connection Options - * - **connection** {Connection}, fire the getLastError down a specific connection. - * - * @param {Object} [options] returns option results. - * @param {Object} [connectionOptions] returns option results. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from lastError or null if an error occured. - * @return {null} - * @api public - */ -Db.prototype.lastError = function(options, connectionOptions, callback) { - // Unpack calls - var args = Array.prototype.slice.call(arguments, 0); - callback = args.pop(); - options = args.length ? args.shift() : {}; - connectionOptions = args.length ? args.shift() : {}; - - this._executeQueryCommand(DbCommand.createGetLastErrorCommand(options, this), connectionOptions, function(err, error) { - callback(err, error && error.documents); - }); -}; - -/** - * Legacy method calls. - * - * @ignore - * @api private - */ -Db.prototype.error = Db.prototype.lastError; -Db.prototype.lastStatus = Db.prototype.lastError; - -/** - * Return all errors up to the last time db reset_error_history was called. - * - * Options - * - **connection** {Connection}, fire the getLastError down a specific connection. - * - * @param {Object} [options] returns option results. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from previousErrors or null if an error occured. - * @return {null} - * @api public - */ -Db.prototype.previousErrors = function(options, callback) { - // Unpack calls - var args = Array.prototype.slice.call(arguments, 0); - callback = args.pop(); - options = args.length ? args.shift() : {}; - - this._executeQueryCommand(DbCommand.createGetPreviousErrorsCommand(this), options, function(err, error) { - callback(err, error.documents); - }); -}; - -/** - * Runs a command on the database. - * @ignore - * @api private - */ -Db.prototype.executeDbCommand = function(command_hash, options, callback) { - if(callback == null) { callback = options; options = {}; } - this._executeQueryCommand(DbCommand.createDbSlaveOkCommand(this, command_hash, options), options, callback); -}; - -/** - * Runs a command on the database as admin. - * @ignore - * @api private - */ -Db.prototype.executeDbAdminCommand = function(command_hash, options, callback) { - if(callback == null) { callback = options; options = {}; } - this._executeQueryCommand(DbCommand.createAdminDbCommand(this, command_hash), options, callback); -}; - -/** - * Resets the error history of the mongo instance. - * - * Options - * - **connection** {Connection}, fire the getLastError down a specific connection. - * - * @param {Object} [options] returns option results. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from resetErrorHistory or null if an error occured. - * @return {null} - * @api public - */ -Db.prototype.resetErrorHistory = function(options, callback) { - // Unpack calls - var args = Array.prototype.slice.call(arguments, 0); - callback = args.pop(); - options = args.length ? args.shift() : {}; - - this._executeQueryCommand(DbCommand.createResetErrorHistoryCommand(this), options, function(err, error) { - callback(err, error.documents); - }); -}; - -/** - * Creates an index on the collection. - * - * Options -* - **w**, {Number/String, > -1 || 'majority' || tag name} the write concern for the operation where < 1 is no acknowlegement of write and w >= 1, w = 'majority' or tag acknowledges the write - * - **wtimeout**, {Number, 0} set the timeout for waiting for write concern to finish (combines with w option) - * - **fsync**, (Boolean, default:false) write waits for fsync before returning - * - **journal**, (Boolean, default:false) write waits for journal sync before returning - * - **unique** {Boolean, default:false}, creates an unique index. - * - **sparse** {Boolean, default:false}, creates a sparse index. - * - **background** {Boolean, default:false}, creates the index in the background, yielding whenever possible. - * - **dropDups** {Boolean, default:false}, a unique index cannot be created on a key that has pre-existing duplicate values. If you would like to create the index anyway, keeping the first document the database indexes and deleting all subsequent documents that have duplicate value - * - **min** {Number}, for geospatial indexes set the lower bound for the co-ordinates. - * - **max** {Number}, for geospatial indexes set the high bound for the co-ordinates. - * - **v** {Number}, specify the format version of the indexes. - * - **expireAfterSeconds** {Number}, allows you to expire data on indexes applied to a data (MongoDB 2.2 or higher) - * - **name** {String}, override the autogenerated index name (useful if the resulting name is larger than 128 bytes) - * - * Deprecated Options - * - **safe** {true | {w:n, wtimeout:n} | {fsync:true}, default:false}, executes with a getLastError command returning the results of the command on MongoDB. - * - * - * @param {String} collectionName name of the collection to create the index on. - * @param {Object} fieldOrSpec fieldOrSpec that defines the index. - * @param {Object} [options] additional options during update. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from createIndex or null if an error occured. - * @return {null} - * @api public - */ -Db.prototype.createIndex = function(collectionName, fieldOrSpec, options, callback) { - var self = this; - var args = Array.prototype.slice.call(arguments, 2); - callback = args.pop(); - options = args.length ? args.shift() : {}; - options = typeof callback === 'function' ? options : callback; - options = options == null ? {} : options; - - // Get the error options - var errorOptions = _getWriteConcern(this, options, callback); - // Create command - var command = DbCommand.createCreateIndexCommand(this, collectionName, fieldOrSpec, options); - // Default command options - var commandOptions = {}; - - // If we have error conditions set handle them - if(_hasWriteConcern(errorOptions) && typeof callback == 'function') { - // Insert options - commandOptions['read'] = false; - // If we have safe set set async to false - if(errorOptions == null) commandOptions['async'] = true; - - // Set safe option - commandOptions['safe'] = errorOptions; - // If we have an error option - if(typeof errorOptions == 'object') { - var keys = Object.keys(errorOptions); - for(var i = 0; i < keys.length; i++) { - commandOptions[keys[i]] = errorOptions[keys[i]]; - } - } - - // Execute insert command - this._executeInsertCommand(command, commandOptions, function(err, result) { - if(err != null) return callback(err, null); - - result = result && result.documents; - if (result[0].err) { - callback(utils.toError(result[0])); - } else { - callback(null, command.documents[0].name); - } - }); - } else if(_hasWriteConcern(errorOptions) && callback == null) { - throw new Error("Cannot use a writeConcern without a provided callback"); - } else { - // Execute insert command - var result = this._executeInsertCommand(command, commandOptions); - // If no callback just return - if(!callback) return; - // If error return error - if(result instanceof Error) { - return callback(result); - } - // Otherwise just return - return callback(null, null); - } -}; - -/** - * Ensures that an index exists, if it does not it creates it - * - * Options -* - **w**, {Number/String, > -1 || 'majority' || tag name} the write concern for the operation where < 1 is no acknowlegement of write and w >= 1, w = 'majority' or tag acknowledges the write - * - **wtimeout**, {Number, 0} set the timeout for waiting for write concern to finish (combines with w option) - * - **fsync**, (Boolean, default:false) write waits for fsync before returning - * - **journal**, (Boolean, default:false) write waits for journal sync before returning - * - **unique** {Boolean, default:false}, creates an unique index. - * - **sparse** {Boolean, default:false}, creates a sparse index. - * - **background** {Boolean, default:false}, creates the index in the background, yielding whenever possible. - * - **dropDups** {Boolean, default:false}, a unique index cannot be created on a key that has pre-existing duplicate values. If you would like to create the index anyway, keeping the first document the database indexes and deleting all subsequent documents that have duplicate value - * - **min** {Number}, for geospatial indexes set the lower bound for the co-ordinates. - * - **max** {Number}, for geospatial indexes set the high bound for the co-ordinates. - * - **v** {Number}, specify the format version of the indexes. - * - **expireAfterSeconds** {Number}, allows you to expire data on indexes applied to a data (MongoDB 2.2 or higher) - * - **name** {String}, override the autogenerated index name (useful if the resulting name is larger than 128 bytes) - * - * Deprecated Options - * - **safe** {true | {w:n, wtimeout:n} | {fsync:true}, default:false}, executes with a getLastError command returning the results of the command on MongoDB. - * - * @param {String} collectionName name of the collection to create the index on. - * @param {Object} fieldOrSpec fieldOrSpec that defines the index. - * @param {Object} [options] additional options during update. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from ensureIndex or null if an error occured. - * @return {null} - * @api public - */ -Db.prototype.ensureIndex = function(collectionName, fieldOrSpec, options, callback) { - var self = this; - - if (typeof callback === 'undefined' && typeof options === 'function') { - callback = options; - options = {}; - } - - if (options == null) { - options = {}; - } - - // Get the error options - var errorOptions = _getWriteConcern(this, options, callback); - // Make sure we don't try to do a write concern without a callback - if(_hasWriteConcern(errorOptions) && callback == null) - throw new Error("Cannot use a writeConcern without a provided callback"); - // Create command - var command = DbCommand.createCreateIndexCommand(this, collectionName, fieldOrSpec, options); - var index_name = command.documents[0].name; - - // Default command options - var commandOptions = {}; - // Check if the index allready exists - this.indexInformation(collectionName, function(err, collectionInfo) { - if(err != null) return callback(err, null); - - if(!collectionInfo[index_name]) { - // If we have error conditions set handle them - if(_hasWriteConcern(errorOptions) && typeof callback == 'function') { - // Insert options - commandOptions['read'] = false; - // If we have safe set set async to false - if(errorOptions == null) commandOptions['async'] = true; - - // If we have an error option - if(typeof errorOptions == 'object') { - var keys = Object.keys(errorOptions); - for(var i = 0; i < keys.length; i++) { - commandOptions[keys[i]] = errorOptions[keys[i]]; - } - } - - if(typeof callback === 'function' - && commandOptions.w < 1 && !commandOptions.fsync && !commandOptions.journal) { - commandOptions.w = 1; - } - - self._executeInsertCommand(command, commandOptions, function(err, result) { - // Only callback if we have one specified - if(typeof callback === 'function') { - if(err != null) return callback(err, null); - - result = result && result.documents; - if (result[0].err) { - callback(utils.toError(result[0])); - } else { - callback(null, command.documents[0].name); - } - } - }); - } else { - // Execute insert command - var result = self._executeInsertCommand(command, commandOptions); - // If no callback just return - if(!callback) return; - // If error return error - if(result instanceof Error) { - return callback(result); - } - // Otherwise just return - return callback(null, index_name); - } - } else { - if(typeof callback === 'function') return callback(null, index_name); - } - }); -}; - -/** - * Returns the information available on allocated cursors. - * - * Options - * - **readPreference** {String}, the prefered read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). - * - * @param {Object} [options] additional options during update. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from cursorInfo or null if an error occured. - * @return {null} - * @api public - */ -Db.prototype.cursorInfo = function(options, callback) { - var args = Array.prototype.slice.call(arguments, 0); - callback = args.pop(); - options = args.length ? args.shift() : {}; - - this._executeQueryCommand(DbCommand.createDbSlaveOkCommand(this, {'cursorInfo':1}), options, function(err, result) { - callback(err, result.documents[0]); - }); -}; - -/** - * Drop an index on a collection. - * - * @param {String} collectionName the name of the collection where the command will drop an index. - * @param {String} indexName name of the index to drop. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from dropIndex or null if an error occured. - * @return {null} - * @api public - */ -Db.prototype.dropIndex = function(collectionName, indexName, callback) { - this._executeQueryCommand(DbCommand.createDropIndexCommand(this, collectionName, indexName), callback); -}; - -/** - * Reindex all indexes on the collection - * Warning: reIndex is a blocking operation (indexes are rebuilt in the foreground) and will be slow for large collections. - * - * @param {String} collectionName the name of the collection. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from reIndex or null if an error occured. - * @api public -**/ -Db.prototype.reIndex = function(collectionName, callback) { - this._executeQueryCommand(DbCommand.createReIndexCommand(this, collectionName), function(err, result) { - if(err != null) { - callback(err, false); - } else if(result.documents[0].errmsg == null) { - callback(null, true); - } else { - callback(new Error(result.documents[0].errmsg), false); - } - }); -}; - -/** - * Retrieves this collections index info. - * - * Options - * - **full** {Boolean, default:false}, returns the full raw index information. - * - **readPreference** {String}, the preferred read preference ((Server.PRIMARY, Server.PRIMARY_PREFERRED, Server.SECONDARY, Server.SECONDARY_PREFERRED, Server.NEAREST). - * - * @param {String} collectionName the name of the collection. - * @param {Object} [options] additional options during update. - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from indexInformation or null if an error occured. - * @return {null} - * @api public - */ -Db.prototype.indexInformation = function(collectionName, options, callback) { - if(typeof callback === 'undefined') { - if(typeof options === 'undefined') { - callback = collectionName; - collectionName = null; - } else { - callback = options; - } - options = {}; - } - - // If we specified full information - var full = options['full'] == null ? false : options['full']; - // Build selector for the indexes - var selector = collectionName != null ? {ns: (this.databaseName + "." + collectionName)} : {}; - - // Set read preference if we set one - var readPreference = options['readPreference'] ? options['readPreference'] : ReadPreference.PRIMARY; - - // Iterate through all the fields of the index - this.collection(DbCommand.SYSTEM_INDEX_COLLECTION, function(err, collection) { - // Perform the find for the collection - collection.find(selector).setReadPreference(readPreference).toArray(function(err, indexes) { - if(err != null) return callback(err, null); - // Contains all the information - var info = {}; - - // if full defined just return all the indexes directly - if(full) return callback(null, indexes); - - // Process all the indexes - for(var i = 0; i < indexes.length; i++) { - var index = indexes[i]; - // Let's unpack the object - info[index.name] = []; - for(var name in index.key) { - info[index.name].push([name, index.key[name]]); - } - } - - // Return all the indexes - callback(null, info); - }); - }); -}; - -/** - * Drop a database. - * - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from dropDatabase or null if an error occured. - * @return {null} - * @api public - */ -Db.prototype.dropDatabase = function(callback) { - var self = this; - - this._executeQueryCommand(DbCommand.createDropDatabaseCommand(this), function(err, result) { - if(err == null && result.documents[0].ok == 1) { - callback(null, true); - } else { - if(err) { - callback(err, false); - } else { - callback(utils.toError(result.documents[0]), false); - } - } - }); -}; - -/** - * Get all the db statistics. - * - * Options - * - **scale** {Number}, divide the returned sizes by scale value. - * - **readPreference** {String}, the preferred read preference ((Server.PRIMARY, Server.PRIMARY_PREFERRED, Server.SECONDARY, Server.SECONDARY_PREFERRED, Server.NEAREST). - * - * @param {Objects} [options] options for the stats command - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from stats or null if an error occured. - * @return {null} - * @api public - */ -Db.prototype.stats = function stats(options, callback) { - var args = Array.prototype.slice.call(arguments, 0); - callback = args.pop(); - // Fetch all commands - options = args.length ? args.shift() : {}; - - // Build command object - var commandObject = { - dbStats:this.collectionName, - } - - // Check if we have the scale value - if(options['scale'] != null) commandObject['scale'] = options['scale']; - - // Execute the command - this.command(commandObject, options, callback); -} - -/** - * @ignore - */ -var __executeQueryCommand = function(self, db_command, options, callback) { - // Options unpacking - var read = options['read'] != null ? options['read'] : false; - var raw = options['raw'] != null ? options['raw'] : self.raw; - var onAll = options['onAll'] != null ? options['onAll'] : false; - var specifiedConnection = options['connection'] != null ? options['connection'] : null; - - // Correct read preference to default primary if set to false, null or primary - if(!(typeof read == 'object') && read._type == 'ReadPreference') { - read = (read == null || read == 'primary' || read == false) ? ReadPreference.PRIMARY : read; - if(!ReadPreference.isValid(read)) return callback(new Error("Illegal readPreference mode specified, " + read)); - } else if(typeof read == 'object' && read._type == 'ReadPreference') { - if(!read.isValid()) return callback(new Error("Illegal readPreference mode specified, " + read.mode)); - } - - // If we have a read preference set and we are a mongos pass the read preference on to the mongos instance, - if(self.serverConfig.isMongos() && read != null && read != false) { - db_command.setMongosReadPreference(read); - } - - // If we got a callback object - if(typeof callback === 'function' && !onAll) { - // Override connection if we passed in a specific connection - var connection = specifiedConnection != null ? specifiedConnection : null; - - if(connection instanceof Error) return callback(connection, null); - - // Fetch either a reader or writer dependent on the specified read option if no connection - // was passed in - if(connection == null) { - connection = read == null || read == 'primary' || read == false ? self.serverConfig.checkoutWriter(true) : self.serverConfig.checkoutReader(read); - } - - // Ensure we have a valid connection - if(connection == null) { - return callback(new Error("no open connections")); - } else if(connection instanceof Error || connection['message'] != null) { - return callback(connection); - } - - // Exhaust Option - var exhaust = options.exhaust || false; - // Register the handler in the data structure - self.serverConfig._registerHandler(db_command, raw, connection, exhaust, callback); - // Write the message out and handle any errors if there are any - connection.write(db_command, function(err) { - if(err != null) { - // Call the handler with an error - self.serverConfig._callHandler(db_command.getRequestId(), null, err); - } - }); - } else if(typeof callback === 'function' && onAll) { - var connections = self.serverConfig.allRawConnections(); - var numberOfEntries = connections.length; - // Go through all the connections - for(var i = 0; i < connections.length; i++) { - // Fetch a connection - var connection = connections[i]; - - // Ensure we have a valid connection - if(connection == null) { - return callback(new Error("no open connections")); - } else if(connection instanceof Error) { - return callback(connection); - } - - // Register the handler in the data structure - self.serverConfig._registerHandler(db_command, raw, connection, callback); - // Write the message out - connection.write(db_command, function(err) { - // Adjust the number of entries we need to process - numberOfEntries = numberOfEntries - 1; - // Remove listener - if(err != null) { - // Clean up listener and return error - self.serverConfig._removeHandler(db_command.getRequestId()); - } - - // No more entries to process callback with the error - if(numberOfEntries <= 0) { - callback(err); - } - }); - - // Update the db_command request id - db_command.updateRequestId(); - } - } else { - // Fetch either a reader or writer dependent on the specified read option - var connection = read == null || read == 'primary' || read == false ? self.serverConfig.checkoutWriter(true) : self.serverConfig.checkoutReader(read); - // Override connection if needed - connection = specifiedConnection != null ? specifiedConnection : connection; - // Ensure we have a valid connection - if(connection == null || connection instanceof Error || connection['message'] != null) return null; - // Write the message out - connection.write(db_command, function(err) { - if(err != null) { - // Emit the error - self.emit("error", err); - } - }); - } -} - -/** - * @ignore - */ -var __retryCommandOnFailure = function(self, retryInMilliseconds, numberOfTimes, command, db_command, options, callback) { - if(this._state == 'connected' || this._state == 'disconnected') this._state = 'connecting'; - // Number of retries done - var numberOfRetriesDone = numberOfTimes; - // Retry function, execute once - var retryFunction = function(_self, _numberOfRetriesDone, _retryInMilliseconds, _numberOfTimes, _command, _db_command, _options, _callback) { - _self.serverConfig.connect(_self, {}, function(err, result, _serverConfig) { - if(_options) delete _options['connection']; - - // Adjust the number of retries left - _numberOfRetriesDone = _numberOfRetriesDone - 1; - // Definitively restart - if(err != null && _numberOfRetriesDone > 0) { - _self._state = 'connecting'; - // Close the server config - _serverConfig.close(function(err) { - // Retry the connect - setTimeout(function() { - retryFunction(_self, _numberOfRetriesDone, _retryInMilliseconds, _numberOfTimes, _command, _db_command, _options, _callback); - }, _retryInMilliseconds); - }); - } else if(err != null && _numberOfRetriesDone <= 0) { - _self._state = 'disconnected'; - // Force close the current connections - _serverConfig.close(function(_err) { - // Force close the current connections - if(typeof _callback == 'function') _callback(err, null); - }); - } else if(err == null && _self.serverConfig.isConnected() == true && Array.isArray(_self.auths) && _self.auths.length > 0) { - _self._state = 'connected'; - // Get number of auths we need to execute - var numberOfAuths = _self.auths.length; - // Apply all auths - for(var i = 0; i < _self.auths.length; i++) { - _self.authenticate(_self.auths[i].username, _self.auths[i].password, {'authdb':_self.auths[i].authdb}, function(err, authenticated) { - numberOfAuths = numberOfAuths - 1; - - // If we have no more authentications to replay - if(numberOfAuths == 0) { - if(err != null || !authenticated) { - if(typeof _callback == 'function') _callback(err, null); - return; - } else { - // Execute command - command(_self, _db_command, _options, _callback); - // Execute all the commands - if(_self.commands.length > 0) _execute_queued_command(_self); - } - } - }); - } - } else if(err == null && _self.serverConfig.isConnected() == true) { - _self._state = 'connected'; - - // Execute command - command(_self, _db_command, _options, _callback); - - process.nextTick(function() { - // Execute any backed up commands - while(_self.commands.length > 0) { - // Fetch the command - var command = _self.commands.shift(); - // Execute based on type - if(command['type'] == 'query') { - __executeQueryCommand(_self, command['db_command'], command['options'], command['callback']); - } else if(command['type'] == 'insert') { - __executeInsertCommand(_self, command['db_command'], command['options'], command['callback']); - } - } - }); - } else { - _self._state = 'connecting'; - // Force close the current connections - _serverConfig.close(function(err) { - // _self.serverConfig.close(function(err) { - // Retry the connect - setTimeout(function() { - retryFunction(_self, _numberOfRetriesDone, _retryInMilliseconds, _numberOfTimes, _command, _db_command, _options, _callback); - }, _retryInMilliseconds); - }); - } - }); - }; - - // Execute function first time - retryFunction(self, numberOfRetriesDone, retryInMilliseconds, numberOfTimes, command, db_command, options, callback); -} - -/** - * Execute db query command (not safe) - * @ignore - * @api private - */ -Db.prototype._executeQueryCommand = function(db_command, options, callback) { - var self = this; - - // Unpack the parameters - if (typeof callback === 'undefined') { - callback = options; - options = {}; - } - - // fast fail option used for HA, no retry - var failFast = options['failFast'] != null - ? options['failFast'] - : false; - - // Check if the user force closed the command - if(this._applicationClosed) { - var err = new Error("db closed by application"); - if('function' == typeof callback) { - return callback(err, null); - } else { - throw err; - } - } - - var config = this.serverConfig; - // If the pool is not connected, attemp to reconnect to send the message - if(this._state == 'connecting' && config.autoReconnect && !failFast) { - return process.nextTick(function() { - self.commands.push({ - type: 'query', - db_command: db_command, - options: options, - callback: callback - }); - }) - } - - if(!failFast && !config.isConnected(options.read) && config.autoReconnect - && (options.read == null - || options.read == false - || options.read == ReadPreference.PRIMARY - || config.checkoutReader(options.read) == null)) { - this._state = 'connecting'; - return __retryCommandOnFailure(this, - this.retryMiliSeconds, - this.numberOfRetries, - __executeQueryCommand, - db_command, - options, - callback); - } - - if(!config.isConnected(options.read) && !config.autoReconnect && callback) { - // Fire an error to the callback if we are not connected - // and don't reconnect. - return callback(new Error("no open connections"), null); - } - - __executeQueryCommand(self, db_command, options, function (err, result, conn) { - callback(err, result, conn); - }); - -}; - -/** - * @ignore - */ -var __executeInsertCommand = function(self, db_command, options, callback) { - // Always checkout a writer for this kind of operations - var connection = self.serverConfig.checkoutWriter(); - // Get safe mode - var safe = options['safe'] != null ? options['safe'] : false; - var raw = options['raw'] != null ? options['raw'] : self.raw; - var specifiedConnection = options['connection'] != null ? options['connection'] : null; - // Override connection if needed - connection = specifiedConnection != null ? specifiedConnection : connection; - - // Ensure we have a valid connection - if(typeof callback === 'function') { - // Ensure we have a valid connection - if(connection == null) { - return callback(new Error("no open connections")); - } else if(connection instanceof Error) { - return callback(connection); - } - - var errorOptions = _getWriteConcern(self, options, callback); - if(errorOptions.w > 0 || errorOptions.w == 'majority' || errorOptions.j || errorOptions.journal || errorOptions.fsync) { - // db command is now an array of commands (original command + lastError) - db_command = [db_command, DbCommand.createGetLastErrorCommand(safe, self)]; - // Register the handler in the data structure - self.serverConfig._registerHandler(db_command[1], raw, connection, callback); - } - } - - // If we have no callback and there is no connection - if(connection == null) return null; - if(connection instanceof Error && typeof callback == 'function') return callback(connection, null); - if(connection instanceof Error) return null; - if(connection == null && typeof callback == 'function') return callback(new Error("no primary server found"), null); - - // Write the message out - connection.write(db_command, function(err) { - // Return the callback if it's not a safe operation and the callback is defined - if(typeof callback === 'function' && (safe == null || safe == false)) { - // Perform the callback - callback(err, null); - } else if(typeof callback === 'function') { - // Call the handler with an error - self.serverConfig._callHandler(db_command[1].getRequestId(), null, err); - } else if(typeof callback == 'function' && safe && safe.w == -1) { - // Call the handler with no error - self.serverConfig._callHandler(db_command[1].getRequestId(), null, null); - } else if(!safe || safe.w == -1) { - self.emit("error", err); - } - }); -} - -/** - * Execute an insert Command - * @ignore - * @api private - */ -Db.prototype._executeInsertCommand = function(db_command, options, callback) { - var self = this; - - // Unpack the parameters - if(callback == null && typeof options === 'function') { - callback = options; - options = {}; - } - - // Ensure options are not null - options = options == null ? {} : options; - - // Check if the user force closed the command - if(this._applicationClosed) { - if(typeof callback == 'function') { - return callback(new Error("db closed by application"), null); - } else { - throw new Error("db closed by application"); - } - } - - // If the pool is not connected, attemp to reconnect to send the message - if(self._state == 'connecting' && this.serverConfig.autoReconnect) { - process.nextTick(function() { - self.commands.push({type:'insert', 'db_command':db_command, 'options':options, 'callback':callback}); - }) - } else if(!this.serverConfig.isConnected() && this.serverConfig.autoReconnect) { - this._state = 'connecting'; - // Retry command - __retryCommandOnFailure(this, this.retryMiliSeconds, this.numberOfRetries, __executeInsertCommand, db_command, options, callback); - } else if(!this.serverConfig.isConnected() && !this.serverConfig.autoReconnect && callback) { - // Fire an error to the callback if we are not connected and don't do reconnect - if(callback) callback(new Error("no open connections"), null); - } else { - __executeInsertCommand(self, db_command, options, callback); - } -} - -/** - * Update command is the same - * @ignore - * @api private - */ -Db.prototype._executeUpdateCommand = Db.prototype._executeInsertCommand; -/** - * Remove command is the same - * @ignore - * @api private - */ -Db.prototype._executeRemoveCommand = Db.prototype._executeInsertCommand; - -/** - * Wrap a Mongo error document into an Error instance. - * Deprecated. Use utils.toError instead. - * - * @ignore - * @api private - * @deprecated - */ -Db.prototype.wrap = utils.toError; - -/** - * Default URL - * - * @classconstant DEFAULT_URL - **/ -Db.DEFAULT_URL = 'mongodb://localhost:27017/default'; - -/** - * Connect to MongoDB using a url as documented at - * - * docs.mongodb.org/manual/reference/connection-string/ - * - * Options - * - **uri_decode_auth** {Boolean, default:false} uri decode the user name and password for authentication - * - **db** {Object, default: null} a hash off options to set on the db object, see **Db constructor** - * - **server** {Object, default: null} a hash off options to set on the server objects, see **Server** constructor** - * - **replSet** {Object, default: null} a hash off options to set on the replSet object, see **ReplSet** constructor** - * - **mongos** {Object, default: null} a hash off options to set on the mongos object, see **Mongos** constructor** - * - * @param {String} url connection url for MongoDB. - * @param {Object} [options] optional options for insert command - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the db instance or null if an error occured. - * @return {null} - * @api public - */ -Db.connect = function(url, options, callback) { - var args = Array.prototype.slice.call(arguments, 1); - callback = typeof args[args.length - 1] == 'function' ? args.pop() : null; - options = args.length ? args.shift() : null; - options = options || {}; - var serverOptions = options.server || {}; - var mongosOptions = options.mongos || {}; - var replSetServersOptions = options.replSet || options.replSetServers || {}; - var dbOptions = options.db || {}; - - // If callback is null throw an exception - if(callback == null) throw new Error("no callback function provided"); - - // Parse the string - var object = parse(url); - // Merge in any options for db in options object - if(dbOptions) { - for(var name in dbOptions) object.db_options[name] = dbOptions[name]; - } - - // Merge in any options for server in options object - if(serverOptions) { - for(var name in serverOptions) object.server_options[name] = serverOptions[name]; - } - - // Merge in any replicaset server options - if(replSetServersOptions) { - for(var name in replSetServersOptions) object.rs_options[name] = replSetServersOptions[name]; - } - - // Merge in any replicaset server options - if(mongosOptions) { - for(var name in mongosOptions) object.mongos_options[name] = mongosOptions[name]; - } - - // We need to ensure that the list of servers are only either direct members or mongos - // they cannot be a mix of monogs and mongod's - var totalNumberOfServers = object.servers.length; - var totalNumberOfMongosServers = 0; - var totalNumberOfMongodServers = 0; - var serverConfig = null; - var errorServers = {}; - - // Failure modes - if(object.servers.length == 0) throw new Error("connection string must contain at least one seed host"); - - // If we have no db setting for the native parser try to set the c++ one first - object.db_options.native_parser = _setNativeParser(object.db_options); - // If no auto_reconnect is set, set it to true as default for single servers - if(typeof object.server_options.auto_reconnect != 'boolean') { - object.server_options.auto_reconnect = true; - } - - // If we have more than a server, it could be replicaset or mongos list - // need to verify that it's one or the other and fail if it's a mix - // Connect to all servers and run ismaster - for(var i = 0; i < object.servers.length; i++) { - // Set up socket options - var _server_options = {poolSize:1, socketOptions:{connectTimeoutMS:1000}, auto_reconnect:false}; - - // Ensure we have ssl setup for the servers - if(object.rs_options.ssl) { - _server_options.ssl = object.rs_options.ssl; - _server_options.sslValidate = object.rs_options.sslValidate; - _server_options.sslCA = object.rs_options.sslCA; - _server_options.sslCert = object.rs_options.sslCert; - _server_options.sslKey = object.rs_options.sslKey; - _server_options.sslPass = object.rs_options.sslPass; - } else if(object.server_options.ssl) { - _server_options.ssl = object.server_options.ssl; - _server_options.sslValidate = object.server_options.sslValidate; - _server_options.sslCA = object.server_options.sslCA; - _server_options.sslCert = object.server_options.sslCert; - _server_options.sslKey = object.server_options.sslKey; - _server_options.sslPass = object.server_options.sslPass; - } - - // Set up the Server object - var _server = object.servers[i].domain_socket - ? new Server(object.servers[i].domain_socket, _server_options) - : new Server(object.servers[i].host, object.servers[i].port, _server_options); - - var connectFunction = function(__server) { - // Attempt connect - new Db(object.dbName, __server, {safe:false, native_parser:false}).open(function(err, db) { - // Update number of servers - totalNumberOfServers = totalNumberOfServers - 1; - // If no error do the correct checks - if(!err) { - // Close the connection - db.close(true); - var isMasterDoc = db.serverConfig.isMasterDoc; - // Check what type of server we have - if(isMasterDoc.setName) totalNumberOfMongodServers++; - if(isMasterDoc.msg && isMasterDoc.msg == "isdbgrid") totalNumberOfMongosServers++; - } else { - errorServers[__server.host + ":" + __server.port] = __server; - } - - if(totalNumberOfServers == 0) { - // If we have a mix of mongod and mongos, throw an error - if(totalNumberOfMongosServers > 0 && totalNumberOfMongodServers > 0) - return callback(new Error("cannot combine a list of replicaset seeds and mongos seeds")); - - if(totalNumberOfMongodServers == 0 && object.servers.length == 1) { - var obj = object.servers[0]; - serverConfig = obj.domain_socket ? - new Server(obj.domain_socket, object.server_options) - : new Server(obj.host, obj.port, object.server_options); - } else if(totalNumberOfMongodServers > 0 || totalNumberOfMongosServers > 0) { - var finalServers = object.servers - .filter(function(serverObj) { - return errorServers[serverObj.host + ":" + serverObj.port] == null; - }) - .map(function(serverObj) { - return new Server(serverObj.host, serverObj.port, object.server_options); - }); - // Clean out any error servers - errorServers = {}; - // Set up the final configuration - if(totalNumberOfMongodServers > 0) { - serverConfig = new ReplSet(finalServers, object.rs_options); - } else { - serverConfig = new Mongos(finalServers, object.mongos_options); - } - } - - if(serverConfig == null) return callback(new Error("Could not locate any valid servers in initial seed list")); - // Set up all options etc and connect to the database - _finishConnecting(serverConfig, object, options, callback) - } - }); - } - - // Wrap the context of the call - connectFunction(_server); - } -} - -var _setNativeParser = function(db_options) { - if(typeof db_options.native_parser == 'boolean') return db_options.native_parser; - - try { - require('bson').BSONNative.BSON; - return true; - } catch(err) { - return false; - } -} - -var _finishConnecting = function(serverConfig, object, options, callback) { - // Safe settings - var safe = {}; - // Build the safe parameter if needed - if(object.db_options.journal) safe.j = object.db_options.journal; - if(object.db_options.w) safe.w = object.db_options.w; - if(object.db_options.fsync) safe.fsync = object.db_options.fsync; - if(object.db_options.wtimeoutMS) safe.wtimeout = object.db_options.wtimeoutMS; - - // If we have a read Preference set - if(object.db_options.read_preference) { - var readPreference = new ReadPreference(object.db_options.read_preference); - // If we have the tags set up - if(object.db_options.read_preference_tags) - readPreference = new ReadPreference(object.db_options.read_preference, object.db_options.read_preference_tags); - // Add the read preference - object.db_options.readPreference = readPreference; - } - - // No safe mode if no keys - if(Object.keys(safe).length == 0) safe = false; - - // Add the safe object - object.db_options.safe = safe; - - // Set up the db options - var db = new Db(object.dbName, serverConfig, object.db_options); - - // Open the db - db.open(function(err, db){ - if(err == null && object.auth){ - db.authenticate(object.auth.user, object.auth.password, function(err, success){ - if(success){ - callback(null, db); - } else { - if(db) db.close(); - callback(err ? err : new Error('Could not authenticate user ' + auth[0]), null); - } - }); - } else { - callback(err, db); - } - }); -} - -/** - * State of the db connection - * @ignore - */ -Object.defineProperty(Db.prototype, "state", { enumerable: true - , get: function () { - return this.serverConfig._serverState; - } -}); - -/** - * @ignore - */ -var _hasWriteConcern = function(errorOptions) { - return errorOptions == true - || errorOptions.w > 0 - || errorOptions.w == 'majority' - || errorOptions.j == true - || errorOptions.journal == true - || errorOptions.fsync == true -} - -/** - * @ignore - */ -var _setWriteConcernHash = function(options) { - var finalOptions = {}; - if(options.w != null) finalOptions.w = options.w; - if(options.journal == true) finalOptions.j = options.journal; - if(options.j == true) finalOptions.j = options.j; - if(options.fsync == true) finalOptions.fsync = options.fsync; - if(options.wtimeout != null) finalOptions.wtimeout = options.wtimeout; - return finalOptions; -} - -/** - * @ignore - */ -var _getWriteConcern = function(self, options, callback) { - // Final options - var finalOptions = {w:1}; - // Local options verification - if(options.w != null || typeof options.j == 'boolean' || typeof options.journal == 'boolean' || typeof options.fsync == 'boolean') { - finalOptions = _setWriteConcernHash(options); - } else if(options.safe != null && typeof options.safe == 'object') { - finalOptions = _setWriteConcernHash(options.safe); - } else if(typeof options.safe == "boolean") { - finalOptions = {w: (options.safe ? 1 : 0)}; - } else if(self.options.w != null || typeof self.options.j == 'boolean' || typeof self.options.journal == 'boolean' || typeof self.options.fsync == 'boolean') { - finalOptions = _setWriteConcernHash(self.options); - } else if(self.safe.w != null || typeof self.safe.j == 'boolean' || typeof self.safe.journal == 'boolean' || typeof self.safe.fsync == 'boolean') { - finalOptions = _setWriteConcernHash(self.safe); - } else if(typeof self.safe == "boolean") { - finalOptions = {w: (self.safe ? 1 : 0)}; - } - - // Ensure we don't have an invalid combination of write concerns - if(finalOptions.w < 1 - && (finalOptions.journal == true || finalOptions.j == true || finalOptions.fsync == true)) throw new Error("No acknowlegement using w < 1 cannot be combined with journal:true or fsync:true"); - - // Return the options - return finalOptions; -} - -/** - * Legacy support - * - * @ignore - * @api private - */ -exports.connect = Db.connect; -exports.Db = Db; - -/** - * Remove all listeners to the db instance. - * @ignore - * @api private - */ -Db.prototype.removeAllEventListeners = function() { - this.removeAllListeners("close"); - this.removeAllListeners("error"); - this.removeAllListeners("timeout"); - this.removeAllListeners("parseError"); - this.removeAllListeners("poolReady"); - this.removeAllListeners("message"); -} diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/chunk.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/chunk.js deleted file mode 100644 index 572d144..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/chunk.js +++ /dev/null @@ -1,213 +0,0 @@ -var Binary = require('bson').Binary, - ObjectID = require('bson').ObjectID; - -/** - * Class for representing a single chunk in GridFS. - * - * @class - * - * @param file {GridStore} The {@link GridStore} object holding this chunk. - * @param mongoObject {object} The mongo object representation of this chunk. - * - * @throws Error when the type of data field for {@link mongoObject} is not - * supported. Currently supported types for data field are instances of - * {@link String}, {@link Array}, {@link Binary} and {@link Binary} - * from the bson module - * - * @see Chunk#buildMongoObject - */ -var Chunk = exports.Chunk = function(file, mongoObject) { - if(!(this instanceof Chunk)) return new Chunk(file, mongoObject); - - this.file = file; - var self = this; - var mongoObjectFinal = mongoObject == null ? {} : mongoObject; - - this.objectId = mongoObjectFinal._id == null ? new ObjectID() : mongoObjectFinal._id; - this.chunkNumber = mongoObjectFinal.n == null ? 0 : mongoObjectFinal.n; - this.data = new Binary(); - - if(mongoObjectFinal.data == null) { - } else if(typeof mongoObjectFinal.data == "string") { - var buffer = new Buffer(mongoObjectFinal.data.length); - buffer.write(mongoObjectFinal.data, 'binary', 0); - this.data = new Binary(buffer); - } else if(Array.isArray(mongoObjectFinal.data)) { - var buffer = new Buffer(mongoObjectFinal.data.length); - buffer.write(mongoObjectFinal.data.join(''), 'binary', 0); - this.data = new Binary(buffer); - } else if(mongoObjectFinal.data instanceof Binary || Object.prototype.toString.call(mongoObjectFinal.data) == "[object Binary]") { - this.data = mongoObjectFinal.data; - } else if(Buffer.isBuffer(mongoObjectFinal.data)) { - } else { - throw Error("Illegal chunk format"); - } - // Update position - this.internalPosition = 0; -}; - -/** - * Writes a data to this object and advance the read/write head. - * - * @param data {string} the data to write - * @param callback {function(*, GridStore)} This will be called after executing - * this method. The first parameter will contain null and the second one - * will contain a reference to this object. - */ -Chunk.prototype.write = function(data, callback) { - this.data.write(data, this.internalPosition); - this.internalPosition = this.data.length(); - if(callback != null) return callback(null, this); - return this; -}; - -/** - * Reads data and advances the read/write head. - * - * @param length {number} The length of data to read. - * - * @return {string} The data read if the given length will not exceed the end of - * the chunk. Returns an empty String otherwise. - */ -Chunk.prototype.read = function(length) { - // Default to full read if no index defined - length = length == null || length == 0 ? this.length() : length; - - if(this.length() - this.internalPosition + 1 >= length) { - var data = this.data.read(this.internalPosition, length); - this.internalPosition = this.internalPosition + length; - return data; - } else { - return ''; - } -}; - -Chunk.prototype.readSlice = function(length) { - if ((this.length() - this.internalPosition) >= length) { - var data = null; - if (this.data.buffer != null) { //Pure BSON - data = this.data.buffer.slice(this.internalPosition, this.internalPosition + length); - } else { //Native BSON - data = new Buffer(length); - length = this.data.readInto(data, this.internalPosition); - } - this.internalPosition = this.internalPosition + length; - return data; - } else { - return null; - } -}; - -/** - * Checks if the read/write head is at the end. - * - * @return {boolean} Whether the read/write head has reached the end of this - * chunk. - */ -Chunk.prototype.eof = function() { - return this.internalPosition == this.length() ? true : false; -}; - -/** - * Reads one character from the data of this chunk and advances the read/write - * head. - * - * @return {string} a single character data read if the the read/write head is - * not at the end of the chunk. Returns an empty String otherwise. - */ -Chunk.prototype.getc = function() { - return this.read(1); -}; - -/** - * Clears the contents of the data in this chunk and resets the read/write head - * to the initial position. - */ -Chunk.prototype.rewind = function() { - this.internalPosition = 0; - this.data = new Binary(); -}; - -/** - * Saves this chunk to the database. Also overwrites existing entries having the - * same id as this chunk. - * - * @param callback {function(*, GridStore)} This will be called after executing - * this method. The first parameter will contain null and the second one - * will contain a reference to this object. - */ -Chunk.prototype.save = function(callback) { - var self = this; - - self.file.chunkCollection(function(err, collection) { - if(err) return callback(err); - - collection.remove({'_id':self.objectId}, {safe:true}, function(err, result) { - if(err) return callback(err); - - if(self.data.length() > 0) { - self.buildMongoObject(function(mongoObject) { - collection.insert(mongoObject, {safe:true}, function(err, collection) { - callback(err, self); - }); - }); - } else { - callback(null, self); - } - }); - }); -}; - -/** - * Creates a mongoDB object representation of this chunk. - * - * @param callback {function(Object)} This will be called after executing this - * method. The object will be passed to the first parameter and will have - * the structure: - * - *
      
      - *        {
      - *          '_id' : , // {number} id for this chunk
      - *          'files_id' : , // {number} foreign key to the file collection
      - *          'n' : , // {number} chunk number
      - *          'data' : , // {bson#Binary} the chunk data itself
      - *        }
      - *        
      - * - * @see MongoDB GridFS Chunk Object Structure - */ -Chunk.prototype.buildMongoObject = function(callback) { - var mongoObject = {'_id': this.objectId, - 'files_id': this.file.fileId, - 'n': this.chunkNumber, - 'data': this.data}; - callback(mongoObject); -}; - -/** - * @return {number} the length of the data - */ -Chunk.prototype.length = function() { - return this.data.length(); -}; - -/** - * The position of the read/write head - * @name position - * @lends Chunk# - * @field - */ -Object.defineProperty(Chunk.prototype, "position", { enumerable: true - , get: function () { - return this.internalPosition; - } - , set: function(value) { - this.internalPosition = value; - } -}); - -/** - * The default chunk size - * @constant - */ -Chunk.DEFAULT_CHUNK_SIZE = 1024 * 256; diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/grid.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/grid.js deleted file mode 100644 index aa695b7..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/grid.js +++ /dev/null @@ -1,103 +0,0 @@ -var GridStore = require('./gridstore').GridStore, - ObjectID = require('bson').ObjectID; - -/** - * A class representation of a simple Grid interface. - * - * @class Represents the Grid. - * @param {Db} db A database instance to interact with. - * @param {String} [fsName] optional different root collection for GridFS. - * @return {Grid} - */ -function Grid(db, fsName) { - - if(!(this instanceof Grid)) return new Grid(db, fsName); - - this.db = db; - this.fsName = fsName == null ? GridStore.DEFAULT_ROOT_COLLECTION : fsName; -} - -/** - * Puts binary data to the grid - * - * Options - * - **_id** {Any}, unique id for this file - * - **root** {String}, root collection to use. Defaults to **{GridStore.DEFAULT_ROOT_COLLECTION}**. - * - **content_type** {String}, mime type of the file. Defaults to **{GridStore.DEFAULT_CONTENT_TYPE}**. - * - **chunk_size** {Number}, size for the chunk. Defaults to **{Chunk.DEFAULT_CHUNK_SIZE}**. - * - **metadata** {Object}, arbitrary data the user wants to store. - * - * @param {Buffer} data buffer with Binary Data. - * @param {Object} [options] the options for the files. - * @param {Function} callback this will be called after this method is executed. The first parameter will contain an Error object if an error occured or null otherwise. The second parameter will contain a reference to this object. - * @return {null} - * @api public - */ -Grid.prototype.put = function(data, options, callback) { - var self = this; - var args = Array.prototype.slice.call(arguments, 1); - callback = args.pop(); - options = args.length ? args.shift() : {}; - // If root is not defined add our default one - options['root'] = options['root'] == null ? this.fsName : options['root']; - - // Return if we don't have a buffer object as data - if(!(Buffer.isBuffer(data))) return callback(new Error("Data object must be a buffer object"), null); - // Get filename if we are using it - var filename = options['filename'] || null; - // Get id if we are using it - var id = options['_id'] || null; - // Create gridstore - var gridStore = new GridStore(this.db, id, filename, "w", options); - gridStore.open(function(err, gridStore) { - if(err) return callback(err, null); - - gridStore.write(data, function(err, result) { - if(err) return callback(err, null); - - gridStore.close(function(err, result) { - if(err) return callback(err, null); - callback(null, result); - }) - }) - }) -} - -/** - * Get binary data to the grid - * - * @param {Any} id for file. - * @param {Function} callback this will be called after this method is executed. The first parameter will contain an Error object if an error occured or null otherwise. The second parameter will contain a reference to this object. - * @return {null} - * @api public - */ -Grid.prototype.get = function(id, callback) { - // Create gridstore - var gridStore = new GridStore(this.db, id, null, "r", {root:this.fsName}); - gridStore.open(function(err, gridStore) { - if(err) return callback(err, null); - - // Return the data - gridStore.read(function(err, data) { - return callback(err, data) - }); - }) -} - -/** - * Delete file from grid - * - * @param {Any} id for file. - * @param {Function} callback this will be called after this method is executed. The first parameter will contain an Error object if an error occured or null otherwise. The second parameter will contain a reference to this object. - * @return {null} - * @api public - */ -Grid.prototype.delete = function(id, callback) { - // Create gridstore - GridStore.unlink(this.db, id, {root:this.fsName}, function(err, result) { - if(err) return callback(err, false); - return callback(null, true); - }); -} - -exports.Grid = Grid; diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/gridstore.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/gridstore.js deleted file mode 100644 index e9ddb97..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/gridstore.js +++ /dev/null @@ -1,1466 +0,0 @@ -/** - * @fileOverview GridFS is a tool for MongoDB to store files to the database. - * Because of the restrictions of the object size the database can hold, a - * facility to split a file into several chunks is needed. The {@link GridStore} - * class offers a simplified api to interact with files while managing the - * chunks of split files behind the scenes. More information about GridFS can be - * found here. - */ -var Chunk = require('./chunk').Chunk, - DbCommand = require('../commands/db_command').DbCommand, - ObjectID = require('bson').ObjectID, - Buffer = require('buffer').Buffer, - fs = require('fs'), - util = require('util'), - inherits = util.inherits, - ReadStream = require('./readstream').ReadStream, - Stream = require('stream'); - -var REFERENCE_BY_FILENAME = 0, - REFERENCE_BY_ID = 1; - -/** - * A class representation of a file stored in GridFS. - * - * Modes - * - **"r"** - read only. This is the default mode. - * - **"w"** - write in truncate mode. Existing data will be overwriten. - * - **w+"** - write in edit mode. - * - * Options - * - **root** {String}, root collection to use. Defaults to **{GridStore.DEFAULT_ROOT_COLLECTION}**. - * - **content_type** {String}, mime type of the file. Defaults to **{GridStore.DEFAULT_CONTENT_TYPE}**. - * - **chunk_size** {Number}, size for the chunk. Defaults to **{Chunk.DEFAULT_CHUNK_SIZE}**. - * - **metadata** {Object}, arbitrary data the user wants to store. - * - * @class Represents the GridStore. - * @param {Db} db A database instance to interact with. - * @param {Any} [id] optional unique id for this file - * @param {String} [filename] optional filename for this file, no unique constrain on the field - * @param {String} mode set the mode for this file. - * @param {Object} options optional properties to specify. - * @return {GridStore} - */ -var GridStore = function GridStore(db, id, filename, mode, options) { - if(!(this instanceof GridStore)) return new GridStore(db, id, filename, mode, options); - - var self = this; - this.db = db; - - // Call stream constructor - if(typeof Stream == 'function') { - Stream.call(this); - } else { - // 0.4.X backward compatibility fix - Stream.Stream.call(this); - } - - // Handle options - if(typeof options === 'undefined') options = {}; - // Handle mode - if(typeof mode === 'undefined') { - mode = filename; - filename = undefined; - } else if(typeof mode == 'object') { - options = mode; - mode = filename; - filename = undefined; - } - - if(id instanceof ObjectID) { - this.referenceBy = REFERENCE_BY_ID; - this.fileId = id; - this.filename = filename; - } else if(typeof filename == 'undefined') { - this.referenceBy = REFERENCE_BY_FILENAME; - this.filename = id; - if (mode.indexOf('w') != null) { - this.fileId = new ObjectID(); - } - } else { - this.referenceBy = REFERENCE_BY_ID; - this.fileId = id; - this.filename = filename; - } - - // Set up the rest - this.mode = mode == null ? "r" : mode; - this.options = options == null ? {} : options; - this.root = this.options['root'] == null ? exports.GridStore.DEFAULT_ROOT_COLLECTION : this.options['root']; - this.position = 0; - // Set default chunk size - this.internalChunkSize = this.options['chunkSize'] == null ? Chunk.DEFAULT_CHUNK_SIZE : this.options['chunkSize']; -} - -/** - * Code for the streaming capabilities of the gridstore object - * Most code from Aaron heckmanns project https://github.com/aheckmann/gridfs-stream - * Modified to work on the gridstore object itself - * @ignore - */ -if(typeof Stream == 'function') { - GridStore.prototype = { __proto__: Stream.prototype } -} else { - // Node 0.4.X compatibility code - GridStore.prototype = { __proto__: Stream.Stream.prototype } -} - -// Move pipe to _pipe -GridStore.prototype._pipe = GridStore.prototype.pipe; - -/** - * Opens the file from the database and initialize this object. Also creates a - * new one if file does not exist. - * - * @param {Function} callback this will be called after executing this method. The first parameter will contain an **{Error}** object and the second parameter will be null if an error occured. Otherwise, the first parameter will be null and the second will contain the reference to this object. - * @return {null} - * @api public - */ -GridStore.prototype.open = function(callback) { - if( this.mode != "w" && this.mode != "w+" && this.mode != "r"){ - callback(new Error("Illegal mode " + this.mode), null); - return; - } - - var self = this; - - if((self.mode == "w" || self.mode == "w+") && self.db.serverConfig.primary != null) { - // Get files collection - self.collection(function(err, collection) { - if(err) return callback(err); - - // Put index on filename - collection.ensureIndex([['filename', 1]], function(err, index) { - if(err) return callback(err); - - // Get chunk collection - self.chunkCollection(function(err, chunkCollection) { - if(err) return callback(err); - - // Ensure index on chunk collection - chunkCollection.ensureIndex([['files_id', 1], ['n', 1]], function(err, index) { - if(err) return callback(err); - _open(self, callback); - }); - }); - }); - }); - } else { - // Open the gridstore - _open(self, callback); - } -}; - -/** - * Hidding the _open function - * @ignore - * @api private - */ -var _open = function(self, callback) { - self.collection(function(err, collection) { - if(err!==null) { - callback(new Error("at collection: "+err), null); - return; - } - - // Create the query - var query = self.referenceBy == REFERENCE_BY_ID ? {_id:self.fileId} : {filename:self.filename}; - query = null == self.fileId && this.filename == null ? null : query; - - // Fetch the chunks - if(query != null) { - collection.find(query, function(err, cursor) { - if(err) return error(err); - - // Fetch the file - cursor.nextObject(function(err, doc) { - if(err) return error(err); - - // Check if the collection for the files exists otherwise prepare the new one - if(doc != null) { - self.fileId = doc._id; - self.filename = doc.filename; - self.contentType = doc.contentType; - self.internalChunkSize = doc.chunkSize; - self.uploadDate = doc.uploadDate; - self.aliases = doc.aliases; - self.length = doc.length; - self.metadata = doc.metadata; - self.internalMd5 = doc.md5; - } else if (self.mode != 'r') { - self.fileId = self.fileId == null ? new ObjectID() : self.fileId; - self.contentType = exports.GridStore.DEFAULT_CONTENT_TYPE; - self.internalChunkSize = self.internalChunkSize == null ? Chunk.DEFAULT_CHUNK_SIZE : self.internalChunkSize; - self.length = 0; - } else { - self.length = 0; - var txtId = self.fileId instanceof ObjectID ? self.fileId.toHexString() : self.fileId; - return error(new Error((self.referenceBy == REFERENCE_BY_ID ? txtId : self.filename) + " does not exist", self)); - } - - // Process the mode of the object - if(self.mode == "r") { - nthChunk(self, 0, function(err, chunk) { - if(err) return error(err); - self.currentChunk = chunk; - self.position = 0; - callback(null, self); - }); - } else if(self.mode == "w") { - // Delete any existing chunks - deleteChunks(self, function(err, result) { - if(err) return error(err); - self.currentChunk = new Chunk(self, {'n':0}); - self.contentType = self.options['content_type'] == null ? self.contentType : self.options['content_type']; - self.internalChunkSize = self.options['chunk_size'] == null ? self.internalChunkSize : self.options['chunk_size']; - self.metadata = self.options['metadata'] == null ? self.metadata : self.options['metadata']; - self.position = 0; - callback(null, self); - }); - } else if(self.mode == "w+") { - nthChunk(self, lastChunkNumber(self), function(err, chunk) { - if(err) return error(err); - // Set the current chunk - self.currentChunk = chunk == null ? new Chunk(self, {'n':0}) : chunk; - self.currentChunk.position = self.currentChunk.data.length(); - self.metadata = self.options['metadata'] == null ? self.metadata : self.options['metadata']; - self.position = self.length; - callback(null, self); - }); - } - }); - }); - } else { - // Write only mode - self.fileId = null == self.fileId ? new ObjectID() : self.fileId; - self.contentType = exports.GridStore.DEFAULT_CONTENT_TYPE; - self.internalChunkSize = self.internalChunkSize == null ? Chunk.DEFAULT_CHUNK_SIZE : self.internalChunkSize; - self.length = 0; - - self.chunkCollection(function(err, collection2) { - if(err) return error(err); - - // No file exists set up write mode - if(self.mode == "w") { - // Delete any existing chunks - deleteChunks(self, function(err, result) { - if(err) return error(err); - self.currentChunk = new Chunk(self, {'n':0}); - self.contentType = self.options['content_type'] == null ? self.contentType : self.options['content_type']; - self.internalChunkSize = self.options['chunk_size'] == null ? self.internalChunkSize : self.options['chunk_size']; - self.metadata = self.options['metadata'] == null ? self.metadata : self.options['metadata']; - self.position = 0; - callback(null, self); - }); - } else if(self.mode == "w+") { - nthChunk(self, lastChunkNumber(self), function(err, chunk) { - if(err) return error(err); - // Set the current chunk - self.currentChunk = chunk == null ? new Chunk(self, {'n':0}) : chunk; - self.currentChunk.position = self.currentChunk.data.length(); - self.metadata = self.options['metadata'] == null ? self.metadata : self.options['metadata']; - self.position = self.length; - callback(null, self); - }); - } - }); - } - }); - - // only pass error to callback once - function error (err) { - if(error.err) return; - callback(error.err = err); - } -}; - -/** - * Stores a file from the file system to the GridFS database. - * - * @param {String|Buffer|FileHandle} file the file to store. - * @param {Function} callback this will be called after this method is executed. The first parameter will be null and the the second will contain the reference to this object. - * @return {null} - * @api public - */ -GridStore.prototype.writeFile = function (file, callback) { - var self = this; - if (typeof file === 'string') { - fs.open(file, 'r', 0666, function (err, fd) { - if(err) return callback(err); - self.writeFile(fd, callback); - }); - return; - } - - self.open(function (err, self) { - if(err) return callback(err); - - fs.fstat(file, function (err, stats) { - if(err) return callback(err); - - var offset = 0; - var index = 0; - var numberOfChunksLeft = Math.min(stats.size / self.chunkSize); - - // Write a chunk - var writeChunk = function() { - fs.read(file, self.chunkSize, offset, 'binary', function(err, data, bytesRead) { - if(err) return callback(err); - - offset = offset + bytesRead; - - // Create a new chunk for the data - var chunk = new Chunk(self, {n:index++}); - chunk.write(data, function(err, chunk) { - if(err) return callback(err); - - chunk.save(function(err, result) { - if(err) return callback(err); - - self.position = self.position + data.length; - - // Point to current chunk - self.currentChunk = chunk; - - if(offset >= stats.size) { - fs.close(file); - self.close(callback); - } else { - return process.nextTick(writeChunk); - } - }); - }); - }); - } - - // Process the first write - process.nextTick(writeChunk); - }); - }); -}; - -/** - * Writes some data. This method will work properly only if initialized with mode - * "w" or "w+". - * - * @param string {string} The data to write. - * @param close {boolean=false} opt_argument Closes this file after writing if - * true. - * @param callback {function(*, GridStore)} This will be called after executing - * this method. The first parameter will contain null and the second one - * will contain a reference to this object. - * - * @ignore - * @api private - */ -var writeBuffer = function(self, buffer, close, callback) { - if(typeof close === "function") { callback = close; close = null; } - var finalClose = (close == null) ? false : close; - - if(self.mode[0] != "w") { - callback(new Error((self.referenceBy == REFERENCE_BY_ID ? self.toHexString() : self.filename) + " not opened for writing"), null); - } else { - if(self.currentChunk.position + buffer.length >= self.chunkSize) { - // Write out the current Chunk and then keep writing until we have less data left than a chunkSize left - // to a new chunk (recursively) - var previousChunkNumber = self.currentChunk.chunkNumber; - var leftOverDataSize = self.chunkSize - self.currentChunk.position; - var firstChunkData = buffer.slice(0, leftOverDataSize); - var leftOverData = buffer.slice(leftOverDataSize); - // A list of chunks to write out - var chunksToWrite = [self.currentChunk.write(firstChunkData)]; - // If we have more data left than the chunk size let's keep writing new chunks - while(leftOverData.length >= self.chunkSize) { - // Create a new chunk and write to it - var newChunk = new Chunk(self, {'n': (previousChunkNumber + 1)}); - var firstChunkData = leftOverData.slice(0, self.chunkSize); - leftOverData = leftOverData.slice(self.chunkSize); - // Update chunk number - previousChunkNumber = previousChunkNumber + 1; - // Write data - newChunk.write(firstChunkData); - // Push chunk to save list - chunksToWrite.push(newChunk); - } - - // Set current chunk with remaining data - self.currentChunk = new Chunk(self, {'n': (previousChunkNumber + 1)}); - // If we have left over data write it - if(leftOverData.length > 0) self.currentChunk.write(leftOverData); - - // Update the position for the gridstore - self.position = self.position + buffer.length; - // Total number of chunks to write - var numberOfChunksToWrite = chunksToWrite.length; - // Write out all the chunks and then return - for(var i = 0; i < chunksToWrite.length; i++) { - var chunk = chunksToWrite[i]; - chunk.save(function(err, result) { - if(err) return callback(err); - - numberOfChunksToWrite = numberOfChunksToWrite - 1; - - if(numberOfChunksToWrite <= 0) { - return callback(null, self); - } - }) - } - } else { - // Update the position for the gridstore - self.position = self.position + buffer.length; - // We have less data than the chunk size just write it and callback - self.currentChunk.write(buffer); - callback(null, self); - } - } -}; - -/** - * Creates a mongoDB object representation of this object. - * - * @param callback {function(object)} This will be called after executing this - * method. The object will be passed to the first parameter and will have - * the structure: - * - *
      
      - *        {
      - *          '_id' : , // {number} id for this file
      - *          'filename' : , // {string} name for this file
      - *          'contentType' : , // {string} mime type for this file
      - *          'length' : , // {number} size of this file?
      - *          'chunksize' : , // {number} chunk size used by this file
      - *          'uploadDate' : , // {Date}
      - *          'aliases' : , // {array of string}
      - *          'metadata' : , // {string}
      - *        }
      - *        
      - * - * @ignore - * @api private - */ -var buildMongoObject = function(self, callback) { - // // Keeps the final chunk number - // var chunkNumber = 0; - // var previousChunkSize = 0; - // // Get the correct chunk Number, if we have an empty chunk return the previous chunk number - // if(null != self.currentChunk && self.currentChunk.chunkNumber > 0 && self.currentChunk.position == 0) { - // chunkNumber = self.currentChunk.chunkNumber - 1; - // } else { - // chunkNumber = self.currentChunk.chunkNumber; - // previousChunkSize = self.currentChunk.position; - // } - - // // Calcuate the length - // var length = self.currentChunk != null ? (chunkNumber * self.chunkSize + previousChunkSize) : 0; - var mongoObject = { - '_id': self.fileId, - 'filename': self.filename, - 'contentType': self.contentType, - 'length': self.position ? self.position : 0, - 'chunkSize': self.chunkSize, - 'uploadDate': self.uploadDate, - 'aliases': self.aliases, - 'metadata': self.metadata - }; - - var md5Command = {filemd5:self.fileId, root:self.root}; - self.db.command(md5Command, function(err, results) { - mongoObject.md5 = results.md5; - callback(mongoObject); - }); -}; - -/** - * Saves this file to the database. This will overwrite the old entry if it - * already exists. This will work properly only if mode was initialized to - * "w" or "w+". - * - * @param {Function} callback this will be called after executing this method. Passes an **{Error}** object to the first parameter and null to the second if an error occured. Otherwise, passes null to the first and a reference to this object to the second. - * @return {null} - * @api public - */ -GridStore.prototype.close = function(callback) { - var self = this; - - if(self.mode[0] == "w") { - if(self.currentChunk != null && self.currentChunk.position > 0) { - self.currentChunk.save(function(err, chunk) { - if(err) return callback(err); - - self.collection(function(err, files) { - if(err) return callback(err); - - // Build the mongo object - if(self.uploadDate != null) { - files.remove({'_id':self.fileId}, {safe:true}, function(err, collection) { - if(err) return callback(err); - - buildMongoObject(self, function(mongoObject) { - files.save(mongoObject, {safe:true}, function(err) { - callback(err, mongoObject); - }); - }); - }); - } else { - self.uploadDate = new Date(); - buildMongoObject(self, function(mongoObject) { - files.save(mongoObject, {safe:true}, function(err) { - callback(err, mongoObject); - }); - }); - } - }); - }); - } else { - self.collection(function(err, files) { - if(err) return callback(err); - - self.uploadDate = new Date(); - buildMongoObject(self, function(mongoObject) { - files.save(mongoObject, {safe:true}, function(err) { - callback(err, mongoObject); - }); - }); - }); - } - } else if(self.mode[0] == "r") { - callback(null, null); - } else { - callback(new Error("Illegal mode " + self.mode), null); - } -}; - -/** - * Gets the nth chunk of this file. - * - * @param chunkNumber {number} The nth chunk to retrieve. - * @param callback {function(*, Chunk|object)} This will be called after - * executing this method. null will be passed to the first parameter while - * a new {@link Chunk} instance will be passed to the second parameter if - * the chunk was found or an empty object {} if not. - * - * @ignore - * @api private - */ -var nthChunk = function(self, chunkNumber, callback) { - self.chunkCollection(function(err, collection) { - if(err) return callback(err); - - collection.find({'files_id':self.fileId, 'n':chunkNumber}, function(err, cursor) { - if(err) return callback(err); - - cursor.nextObject(function(err, chunk) { - if(err) return callback(err); - - var finalChunk = chunk == null ? {} : chunk; - callback(null, new Chunk(self, finalChunk)); - }); - }); - }); -}; - -/** - * - * @ignore - * @api private - */ -GridStore.prototype._nthChunk = function(chunkNumber, callback) { - nthChunk(this, chunkNumber, callback); -} - -/** - * @return {Number} The last chunk number of this file. - * - * @ignore - * @api private - */ -var lastChunkNumber = function(self) { - return Math.floor(self.length/self.chunkSize); -}; - -/** - * Retrieve this file's chunks collection. - * - * @param {Function} callback this will be called after executing this method. An exception object will be passed to the first parameter when an error occured or null otherwise. A new **{Collection}** object will be passed to the second parameter if no error occured. - * @return {null} - * @api public - */ -GridStore.prototype.chunkCollection = function(callback) { - this.db.collection((this.root + ".chunks"), callback); -}; - -/** - * Deletes all the chunks of this file in the database. - * - * @param callback {function(*, boolean)} This will be called after this method - * executes. Passes null to the first and true to the second argument. - * - * @ignore - * @api private - */ -var deleteChunks = function(self, callback) { - if(self.fileId != null) { - self.chunkCollection(function(err, collection) { - if(err) return callback(err, false); - collection.remove({'files_id':self.fileId}, {safe:true}, function(err, result) { - if(err) return callback(err, false); - callback(null, true); - }); - }); - } else { - callback(null, true); - } -}; - -/** - * Deletes all the chunks of this file in the database. - * - * @param {Function} callback this will be called after this method executes. Passes null to the first and true to the second argument. - * @return {null} - * @api public - */ -GridStore.prototype.unlink = function(callback) { - var self = this; - deleteChunks(this, function(err) { - if(err!==null) { - err.message = "at deleteChunks: " + err.message; - return callback(err); - } - - self.collection(function(err, collection) { - if(err!==null) { - err.message = "at collection: " + err.message; - return callback(err); - } - - collection.remove({'_id':self.fileId}, {safe:true}, function(err) { - callback(err, self); - }); - }); - }); -}; - -/** - * Retrieves the file collection associated with this object. - * - * @param {Function} callback this will be called after executing this method. An exception object will be passed to the first parameter when an error occured or null otherwise. A new **{Collection}** object will be passed to the second parameter if no error occured. - * @return {null} - * @api public - */ -GridStore.prototype.collection = function(callback) { - this.db.collection(this.root + ".files", callback); -}; - -/** - * Reads the data of this file. - * - * @param {String} [separator] the character to be recognized as the newline separator. - * @param {Function} callback This will be called after this method is executed. The first parameter will be null and the second parameter will contain an array of strings representing the entire data, each element representing a line including the separator character. - * @return {null} - * @api public - */ -GridStore.prototype.readlines = function(separator, callback) { - var args = Array.prototype.slice.call(arguments, 0); - callback = args.pop(); - separator = args.length ? args.shift() : "\n"; - - this.read(function(err, data) { - if(err) return callback(err); - - var items = data.toString().split(separator); - items = items.length > 0 ? items.splice(0, items.length - 1) : []; - for(var i = 0; i < items.length; i++) { - items[i] = items[i] + separator; - } - - callback(null, items); - }); -}; - -/** - * Deletes all the chunks of this file in the database if mode was set to "w" or - * "w+" and resets the read/write head to the initial position. - * - * @param {Function} callback this will be called after executing this method. The first parameter will contain null and the second one will contain a reference to this object. - * @return {null} - * @api public - */ -GridStore.prototype.rewind = function(callback) { - var self = this; - - if(this.currentChunk.chunkNumber != 0) { - if(this.mode[0] == "w") { - deleteChunks(self, function(err, gridStore) { - if(err) return callback(err); - self.currentChunk = new Chunk(self, {'n': 0}); - self.position = 0; - callback(null, self); - }); - } else { - self.currentChunk(0, function(err, chunk) { - if(err) return callback(err); - self.currentChunk = chunk; - self.currentChunk.rewind(); - self.position = 0; - callback(null, self); - }); - } - } else { - self.currentChunk.rewind(); - self.position = 0; - callback(null, self); - } -}; - -/** - * Retrieves the contents of this file and advances the read/write head. Works with Buffers only. - * - * There are 3 signatures for this method: - * - * (callback) - * (length, callback) - * (length, buffer, callback) - * - * @param {Number} [length] the number of characters to read. Reads all the characters from the read/write head to the EOF if not specified. - * @param {String|Buffer} [buffer] a string to hold temporary data. This is used for storing the string data read so far when recursively calling this method. - * @param {Function} callback this will be called after this method is executed. null will be passed to the first parameter and a string containing the contents of the buffer concatenated with the contents read from this file will be passed to the second. - * @return {null} - * @api public - */ -GridStore.prototype.read = function(length, buffer, callback) { - var self = this; - - var args = Array.prototype.slice.call(arguments, 0); - callback = args.pop(); - length = args.length ? args.shift() : null; - buffer = args.length ? args.shift() : null; - - // The data is a c-terminated string and thus the length - 1 - var finalLength = length == null ? self.length - self.position : length; - var finalBuffer = buffer == null ? new Buffer(finalLength) : buffer; - // Add a index to buffer to keep track of writing position or apply current index - finalBuffer._index = buffer != null && buffer._index != null ? buffer._index : 0; - - if((self.currentChunk.length() - self.currentChunk.position + finalBuffer._index) >= finalLength) { - var slice = self.currentChunk.readSlice(finalLength - finalBuffer._index); - // Copy content to final buffer - slice.copy(finalBuffer, finalBuffer._index); - // Update internal position - self.position = finalBuffer.length; - // Check if we don't have a file at all - if(finalLength == 0 && finalBuffer.length == 0) return callback(new Error("File does not exist"), null); - // Else return data - callback(null, finalBuffer); - } else { - var slice = self.currentChunk.readSlice(self.currentChunk.length() - self.currentChunk.position); - // Copy content to final buffer - slice.copy(finalBuffer, finalBuffer._index); - // Update index position - finalBuffer._index += slice.length; - - // Load next chunk and read more - nthChunk(self, self.currentChunk.chunkNumber + 1, function(err, chunk) { - if(err) return callback(err); - - if(chunk.length() > 0) { - self.currentChunk = chunk; - self.read(length, finalBuffer, callback); - } else { - if (finalBuffer._index > 0) { - callback(null, finalBuffer) - } else { - callback(new Error("no chunks found for file, possibly corrupt"), null); - } - } - }); - } -} - -/** - * Retrieves the position of the read/write head of this file. - * - * @param {Function} callback This gets called after this method terminates. null is passed to the first parameter and the position is passed to the second. - * @return {null} - * @api public - */ -GridStore.prototype.tell = function(callback) { - callback(null, this.position); -}; - -/** - * Moves the read/write head to a new location. - * - * There are 3 signatures for this method - * - * Seek Location Modes - * - **GridStore.IO_SEEK_SET**, **(default)** set the position from the start of the file. - * - **GridStore.IO_SEEK_CUR**, set the position from the current position in the file. - * - **GridStore.IO_SEEK_END**, set the position from the end of the file. - * - * @param {Number} [position] the position to seek to - * @param {Number} [seekLocation] seek mode. Use one of the Seek Location modes. - * @param {Function} callback this will be called after executing this method. The first parameter will contain null and the second one will contain a reference to this object. - * @return {null} - * @api public - */ -GridStore.prototype.seek = function(position, seekLocation, callback) { - var self = this; - - var args = Array.prototype.slice.call(arguments, 1); - callback = args.pop(); - seekLocation = args.length ? args.shift() : null; - - var seekLocationFinal = seekLocation == null ? exports.GridStore.IO_SEEK_SET : seekLocation; - var finalPosition = position; - var targetPosition = 0; - if(seekLocationFinal == exports.GridStore.IO_SEEK_CUR) { - targetPosition = self.position + finalPosition; - } else if(seekLocationFinal == exports.GridStore.IO_SEEK_END) { - targetPosition = self.length + finalPosition; - } else { - targetPosition = finalPosition; - } - - var newChunkNumber = Math.floor(targetPosition/self.chunkSize); - if(newChunkNumber != self.currentChunk.chunkNumber) { - var seekChunk = function() { - nthChunk(self, newChunkNumber, function(err, chunk) { - self.currentChunk = chunk; - self.position = targetPosition; - self.currentChunk.position = (self.position % self.chunkSize); - callback(err, self); - }); - }; - - if(self.mode[0] == 'w') { - self.currentChunk.save(function(err) { - if(err) return callback(err); - seekChunk(); - }); - } else { - seekChunk(); - } - } else { - self.position = targetPosition; - self.currentChunk.position = (self.position % self.chunkSize); - callback(null, self); - } -}; - -/** - * Verify if the file is at EOF. - * - * @return {Boolean} true if the read/write head is at the end of this file. - * @api public - */ -GridStore.prototype.eof = function() { - return this.position == this.length ? true : false; -}; - -/** - * Retrieves a single character from this file. - * - * @param {Function} callback this gets called after this method is executed. Passes null to the first parameter and the character read to the second or null to the second if the read/write head is at the end of the file. - * @return {null} - * @api public - */ -GridStore.prototype.getc = function(callback) { - var self = this; - - if(self.eof()) { - callback(null, null); - } else if(self.currentChunk.eof()) { - nthChunk(self, self.currentChunk.chunkNumber + 1, function(err, chunk) { - self.currentChunk = chunk; - self.position = self.position + 1; - callback(err, self.currentChunk.getc()); - }); - } else { - self.position = self.position + 1; - callback(null, self.currentChunk.getc()); - } -}; - -/** - * Writes a string to the file with a newline character appended at the end if - * the given string does not have one. - * - * @param {String} string the string to write. - * @param {Function} callback this will be called after executing this method. The first parameter will contain null and the second one will contain a reference to this object. - * @return {null} - * @api public - */ -GridStore.prototype.puts = function(string, callback) { - var finalString = string.match(/\n$/) == null ? string + "\n" : string; - this.write(finalString, callback); -}; - -/** - * Returns read stream based on this GridStore file - * - * Events - * - **data** {function(item) {}} the data event triggers when a document is ready. - * - **end** {function() {}} the end event triggers when there is no more documents available. - * - **close** {function() {}} the close event triggers when the stream is closed. - * - **error** {function(err) {}} the error event triggers if an error happens. - * - * @param {Boolean} autoclose if true current GridStore will be closed when EOF and 'close' event will be fired - * @return {null} - * @api public - */ -GridStore.prototype.stream = function(autoclose) { - return new ReadStream(autoclose, this); -}; - -/** -* The collection to be used for holding the files and chunks collection. -* -* @classconstant DEFAULT_ROOT_COLLECTION -**/ -GridStore.DEFAULT_ROOT_COLLECTION = 'fs'; - -/** -* Default file mime type -* -* @classconstant DEFAULT_CONTENT_TYPE -**/ -GridStore.DEFAULT_CONTENT_TYPE = 'binary/octet-stream'; - -/** -* Seek mode where the given length is absolute. -* -* @classconstant IO_SEEK_SET -**/ -GridStore.IO_SEEK_SET = 0; - -/** -* Seek mode where the given length is an offset to the current read/write head. -* -* @classconstant IO_SEEK_CUR -**/ -GridStore.IO_SEEK_CUR = 1; - -/** -* Seek mode where the given length is an offset to the end of the file. -* -* @classconstant IO_SEEK_END -**/ -GridStore.IO_SEEK_END = 2; - -/** - * Checks if a file exists in the database. - * - * @param {Db} db the database to query. - * @param {String} name the name of the file to look for. - * @param {String} [rootCollection] the root collection that holds the files and chunks collection. Defaults to **{GridStore.DEFAULT_ROOT_COLLECTION}**. - * @param {Function} callback this will be called after this method executes. Passes null to the first and passes true to the second if the file exists and false otherwise. - * @return {null} - * @api public - */ -GridStore.exist = function(db, fileIdObject, rootCollection, callback) { - var args = Array.prototype.slice.call(arguments, 2); - callback = args.pop(); - rootCollection = args.length ? args.shift() : null; - - // Fetch collection - var rootCollectionFinal = rootCollection != null ? rootCollection : GridStore.DEFAULT_ROOT_COLLECTION; - db.collection(rootCollectionFinal + ".files", function(err, collection) { - if(err) return callback(err); - - // Build query - var query = (typeof fileIdObject == 'string' || Object.prototype.toString.call(fileIdObject) == '[object RegExp]' ) - ? {'filename':fileIdObject} - : {'_id':fileIdObject}; // Attempt to locate file - - collection.find(query, function(err, cursor) { - if(err) return callback(err); - - cursor.nextObject(function(err, item) { - if(err) return callback(err); - callback(null, item == null ? false : true); - }); - }); - }); -}; - -/** - * Gets the list of files stored in the GridFS. - * - * @param {Db} db the database to query. - * @param {String} [rootCollection] the root collection that holds the files and chunks collection. Defaults to **{GridStore.DEFAULT_ROOT_COLLECTION}**. - * @param {Function} callback this will be called after this method executes. Passes null to the first and passes an array of strings containing the names of the files. - * @return {null} - * @api public - */ -GridStore.list = function(db, rootCollection, options, callback) { - var args = Array.prototype.slice.call(arguments, 1); - callback = args.pop(); - rootCollection = args.length ? args.shift() : null; - options = args.length ? args.shift() : {}; - - // Ensure we have correct values - if(rootCollection != null && typeof rootCollection == 'object') { - options = rootCollection; - rootCollection = null; - } - - // Check if we are returning by id not filename - var byId = options['id'] != null ? options['id'] : false; - // Fetch item - var rootCollectionFinal = rootCollection != null ? rootCollection : GridStore.DEFAULT_ROOT_COLLECTION; - var items = []; - db.collection((rootCollectionFinal + ".files"), function(err, collection) { - if(err) return callback(err); - - collection.find(function(err, cursor) { - if(err) return callback(err); - - cursor.each(function(err, item) { - if(item != null) { - items.push(byId ? item._id : item.filename); - } else { - callback(err, items); - } - }); - }); - }); -}; - -/** - * Reads the contents of a file. - * - * This method has the following signatures - * - * (db, name, callback) - * (db, name, length, callback) - * (db, name, length, offset, callback) - * (db, name, length, offset, options, callback) - * - * @param {Db} db the database to query. - * @param {String} name the name of the file. - * @param {Number} [length] the size of data to read. - * @param {Number} [offset] the offset from the head of the file of which to start reading from. - * @param {Object} [options] the options for the file. - * @param {Function} callback this will be called after this method executes. A string with an error message will be passed to the first parameter when the length and offset combination exceeds the length of the file while an Error object will be passed if other forms of error occured, otherwise, a string is passed. The second parameter will contain the data read if successful or null if an error occured. - * @return {null} - * @api public - */ -GridStore.read = function(db, name, length, offset, options, callback) { - var args = Array.prototype.slice.call(arguments, 2); - callback = args.pop(); - length = args.length ? args.shift() : null; - offset = args.length ? args.shift() : null; - options = args.length ? args.shift() : null; - - new GridStore(db, name, "r", options).open(function(err, gridStore) { - if(err) return callback(err); - // Make sure we are not reading out of bounds - if(offset && offset >= gridStore.length) return callback("offset larger than size of file", null); - if(length && length > gridStore.length) return callback("length is larger than the size of the file", null); - if(offset && length && (offset + length) > gridStore.length) return callback("offset and length is larger than the size of the file", null); - - if(offset != null) { - gridStore.seek(offset, function(err, gridStore) { - if(err) return callback(err); - gridStore.read(length, callback); - }); - } else { - gridStore.read(length, callback); - } - }); -}; - -/** - * Reads the data of this file. - * - * @param {Db} db the database to query. - * @param {String} name the name of the file. - * @param {String} [separator] the character to be recognized as the newline separator. - * @param {Object} [options] file options. - * @param {Function} callback this will be called after this method is executed. The first parameter will be null and the second parameter will contain an array of strings representing the entire data, each element representing a line including the separator character. - * @return {null} - * @api public - */ -GridStore.readlines = function(db, name, separator, options, callback) { - var args = Array.prototype.slice.call(arguments, 2); - callback = args.pop(); - separator = args.length ? args.shift() : null; - options = args.length ? args.shift() : null; - - var finalSeperator = separator == null ? "\n" : separator; - new GridStore(db, name, "r", options).open(function(err, gridStore) { - if(err) return callback(err); - gridStore.readlines(finalSeperator, callback); - }); -}; - -/** - * Deletes the chunks and metadata information of a file from GridFS. - * - * @param {Db} db the database to interact with. - * @param {String|Array} names the name/names of the files to delete. - * @param {Object} [options] the options for the files. - * @callback {Function} this will be called after this method is executed. The first parameter will contain an Error object if an error occured or null otherwise. The second parameter will contain a reference to this object. - * @return {null} - * @api public - */ -GridStore.unlink = function(db, names, options, callback) { - var self = this; - var args = Array.prototype.slice.call(arguments, 2); - callback = args.pop(); - options = args.length ? args.shift() : null; - - if(names.constructor == Array) { - var tc = 0; - for(var i = 0; i < names.length; i++) { - ++tc; - self.unlink(db, names[i], function(result) { - if(--tc == 0) { - callback(null, self); - } - }); - } - } else { - new GridStore(db, names, "w", options).open(function(err, gridStore) { - if(err) return callback(err); - deleteChunks(gridStore, function(err, result) { - if(err) return callback(err); - gridStore.collection(function(err, collection) { - if(err) return callback(err); - collection.remove({'_id':gridStore.fileId}, {safe:true}, function(err, collection) { - callback(err, self); - }); - }); - }); - }); - } -}; - -/** - * Returns the current chunksize of the file. - * - * @field chunkSize - * @type {Number} - * @getter - * @setter - * @property return number of bytes in the current chunkSize. - */ -Object.defineProperty(GridStore.prototype, "chunkSize", { enumerable: true - , get: function () { - return this.internalChunkSize; - } - , set: function(value) { - if(!(this.mode[0] == "w" && this.position == 0 && this.uploadDate == null)) { - this.internalChunkSize = this.internalChunkSize; - } else { - this.internalChunkSize = value; - } - } -}); - -/** - * The md5 checksum for this file. - * - * @field md5 - * @type {Number} - * @getter - * @setter - * @property return this files md5 checksum. - */ -Object.defineProperty(GridStore.prototype, "md5", { enumerable: true - , get: function () { - return this.internalMd5; - } -}); - -/** - * GridStore Streaming methods - * Handles the correct return of the writeable stream status - * @ignore - */ -Object.defineProperty(GridStore.prototype, "writable", { enumerable: true - , get: function () { - if(this._writeable == null) { - this._writeable = this.mode != null && this.mode.indexOf("w") != -1; - } - // Return the _writeable - return this._writeable; - } - , set: function(value) { - this._writeable = value; - } -}); - -/** - * Handles the correct return of the readable stream status - * @ignore - */ -Object.defineProperty(GridStore.prototype, "readable", { enumerable: true - , get: function () { - if(this._readable == null) { - this._readable = this.mode != null && this.mode.indexOf("r") != -1; - } - return this._readable; - } - , set: function(value) { - this._readable = value; - } -}); - -GridStore.prototype.paused; - -/** - * Handles the correct setting of encoding for the stream - * @ignore - */ -GridStore.prototype.setEncoding = fs.ReadStream.prototype.setEncoding; - -/** - * Handles the end events - * @ignore - */ -GridStore.prototype.end = function end(data) { - var self = this; - // allow queued data to write before closing - if(!this.writable) return; - this.writable = false; - - if(data) { - this._q.push(data); - } - - this.on('drain', function () { - self.close(function (err) { - if (err) return _error(self, err); - self.emit('close'); - }); - }); - - _flush(self); -} - -/** - * Handles the normal writes to gridstore - * @ignore - */ -var _writeNormal = function(self, data, close, callback) { - // If we have a buffer write it using the writeBuffer method - if(Buffer.isBuffer(data)) { - return writeBuffer(self, data, close, callback); - } else { - // Wrap the string in a buffer and write - return writeBuffer(self, new Buffer(data, 'binary'), close, callback); - } -} - -/** - * Writes some data. This method will work properly only if initialized with mode "w" or "w+". - * - * @param {String|Buffer} data the data to write. - * @param {Boolean} [close] closes this file after writing if set to true. - * @param {Function} callback this will be called after executing this method. The first parameter will contain null and the second one will contain a reference to this object. - * @return {null} - * @api public - */ -GridStore.prototype.write = function write(data, close, callback) { - // If it's a normal write delegate the call - if(typeof close == 'function' || typeof callback == 'function') { - return _writeNormal(this, data, close, callback); - } - - // Otherwise it's a stream write - var self = this; - if (!this.writable) { - throw new Error('GridWriteStream is not writable'); - } - - // queue data until we open. - if (!this._opened) { - // Set up a queue to save data until gridstore object is ready - this._q = []; - _openStream(self); - this._q.push(data); - return false; - } - - // Push data to queue - this._q.push(data); - _flush(this); - // Return write successful - return true; -} - -/** - * Handles the destroy part of a stream - * @ignore - */ -GridStore.prototype.destroy = function destroy() { - // close and do not emit any more events. queued data is not sent. - if(!this.writable) return; - this.readable = false; - if(this.writable) { - this.writable = false; - this._q.length = 0; - this.emit('close'); - } -} - -/** - * Handles the destroySoon part of a stream - * @ignore - */ -GridStore.prototype.destroySoon = function destroySoon() { - // as soon as write queue is drained, destroy. - // may call destroy immediately if no data is queued. - if(!this._q.length) { - return this.destroy(); - } - this._destroying = true; -} - -/** - * Handles the pipe part of the stream - * @ignore - */ -GridStore.prototype.pipe = function(destination, options) { - var self = this; - // Open the gridstore - this.open(function(err, result) { - if(err) _errorRead(self, err); - if(!self.readable) return; - // Set up the pipe - self._pipe(destination, options); - // Emit the stream is open - self.emit('open'); - // Read from the stream - _read(self); - }) -} - -/** - * Internal module methods - * @ignore - */ -var _read = function _read(self) { - if (!self.readable || self.paused || self.reading) { - return; - } - - self.reading = true; - var stream = self._stream = self.stream(); - stream.paused = self.paused; - - stream.on('data', function (data) { - if (self._decoder) { - var str = self._decoder.write(data); - if (str.length) self.emit('data', str); - } else { - self.emit('data', data); - } - }); - - stream.on('end', function (data) { - self.emit('end', data); - }); - - stream.on('error', function (data) { - _errorRead(self, data); - }); - - stream.on('close', function (data) { - self.emit('close', data); - }); - - self.pause = function () { - // native doesn't always pause. - // bypass its pause() method to hack it - self.paused = stream.paused = true; - } - - self.resume = function () { - if(!self.paused) return; - - self.paused = false; - stream.resume(); - self.readable = stream.readable; - } - - self.destroy = function () { - self.readable = false; - stream.destroy(); - } -} - -/** - * pause - * @ignore - */ -GridStore.prototype.pause = function pause () { - // Overridden when the GridStore opens. - this.paused = true; -} - -/** - * resume - * @ignore - */ -GridStore.prototype.resume = function resume () { - // Overridden when the GridStore opens. - this.paused = false; -} - -/** - * Internal module methods - * @ignore - */ -var _flush = function _flush(self, _force) { - if (!self._opened) return; - if (!_force && self._flushing) return; - self._flushing = true; - - // write the entire q to gridfs - if (!self._q.length) { - self._flushing = false; - self.emit('drain'); - - if(self._destroying) { - self.destroy(); - } - return; - } - - self.write(self._q.shift(), function (err, store) { - if (err) return _error(self, err); - self.emit('progress', store.position); - _flush(self, true); - }); -} - -var _openStream = function _openStream (self) { - if(self._opening == true) return; - self._opening = true; - - // Open the store - self.open(function (err, gridstore) { - if (err) return _error(self, err); - self._opened = true; - self.emit('open'); - _flush(self); - }); -} - -var _error = function _error(self, err) { - self.destroy(); - self.emit('error', err); -} - -var _errorRead = function _errorRead (self, err) { - self.readable = false; - self.emit('error', err); -} - -/** - * @ignore - * @api private - */ -exports.GridStore = GridStore; diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/readstream.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/readstream.js deleted file mode 100644 index ebb09bd..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/readstream.js +++ /dev/null @@ -1,188 +0,0 @@ -var Stream = require('stream').Stream, - util = require('util'); - -/** - * ReadStream - * - * Returns a stream interface for the **file**. - * - * Events - * - **data** {function(item) {}} the data event triggers when a document is ready. - * - **end** {function() {}} the end event triggers when there is no more documents available. - * - **close** {function() {}} the close event triggers when the stream is closed. - * - **error** {function(err) {}} the error event triggers if an error happens. - * - * @class Represents a GridFS File Stream. - * @param {Boolean} autoclose automatically close file when the stream reaches the end. - * @param {GridStore} cursor a cursor object that the stream wraps. - * @return {ReadStream} - */ -function ReadStream(autoclose, gstore) { - if (!(this instanceof ReadStream)) return new ReadStream(autoclose, gstore); - Stream.call(this); - - this.autoclose = !!autoclose; - this.gstore = gstore; - - this.finalLength = gstore.length - gstore.position; - this.completedLength = 0; - this.currentChunkNumber = gstore.currentChunk.chunkNumber; - - this.paused = false; - this.readable = true; - this.pendingChunk = null; - this.executing = false; - - // Calculate the number of chunks - this.numberOfChunks = Math.ceil(gstore.length/gstore.chunkSize); - - // This seek start position inside the current chunk - this.seekStartPosition = gstore.position - (this.currentChunkNumber * gstore.chunkSize); - - var self = this; - process.nextTick(function() { - self._execute(); - }); -}; - -/** - * Inherit from Stream - * @ignore - * @api private - */ -ReadStream.prototype.__proto__ = Stream.prototype; - -/** - * Flag stating whether or not this stream is readable. - */ -ReadStream.prototype.readable; - -/** - * Flag stating whether or not this stream is paused. - */ -ReadStream.prototype.paused; - -/** - * @ignore - * @api private - */ -ReadStream.prototype._execute = function() { - if(this.paused === true || this.readable === false) { - return; - } - - var gstore = this.gstore; - var self = this; - // Set that we are executing - this.executing = true; - - var last = false; - var toRead = 0; - - if(gstore.currentChunk.chunkNumber >= (this.numberOfChunks - 1)) { - self.executing = false; - last = true; - } - - // Data setup - var data = null; - - // Read a slice (with seek set if none) - if(this.seekStartPosition > 0 && (gstore.currentChunk.length() - this.seekStartPosition) > 0) { - data = gstore.currentChunk.readSlice(gstore.currentChunk.length() - this.seekStartPosition); - this.seekStartPosition = 0; - } else { - data = gstore.currentChunk.readSlice(gstore.currentChunk.length()); - } - - // Return the data - if(data != null && gstore.currentChunk.chunkNumber == self.currentChunkNumber) { - self.currentChunkNumber = self.currentChunkNumber + 1; - self.completedLength += data.length; - self.pendingChunk = null; - self.emit("data", data); - } - - if(last === true) { - self.readable = false; - self.emit("end"); - - if(self.autoclose === true) { - if(gstore.mode[0] == "w") { - gstore.close(function(err, doc) { - if (err) { - self.emit("error", err); - return; - } - self.readable = false; - self.emit("close", doc); - }); - } else { - self.readable = false; - self.emit("close"); - } - } - } else { - gstore._nthChunk(gstore.currentChunk.chunkNumber + 1, function(err, chunk) { - if(err) { - self.readable = false; - self.emit("error", err); - self.executing = false; - return; - } - - self.pendingChunk = chunk; - if(self.paused === true) { - self.executing = false; - return; - } - - gstore.currentChunk = self.pendingChunk; - self._execute(); - }); - } -}; - -/** - * Pauses this stream, then no farther events will be fired. - * - * @ignore - * @api public - */ -ReadStream.prototype.pause = function() { - if(!this.executing) { - this.paused = true; - } -}; - -/** - * Destroys the stream, then no farther events will be fired. - * - * @ignore - * @api public - */ -ReadStream.prototype.destroy = function() { - this.readable = false; - // Emit close event - this.emit("close"); -}; - -/** - * Resumes this stream. - * - * @ignore - * @api public - */ -ReadStream.prototype.resume = function() { - if(this.paused === false || !this.readable) { - return; - } - - this.paused = false; - var self = this; - process.nextTick(function() { - self._execute(); - }); -}; - -exports.ReadStream = ReadStream; diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/index.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/index.js deleted file mode 100644 index 6a2b727..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/index.js +++ /dev/null @@ -1,69 +0,0 @@ -try { - exports.BSONPure = require('bson').BSONPure; - exports.BSONNative = require('bson').BSONNative; -} catch(err) { - // do nothing -} - -[ 'commands/base_command' - , 'admin' - , 'collection' - , 'connection/read_preference' - , 'connection/connection' - , 'connection/server' - , 'connection/mongos' - , 'connection/repl_set' - , 'mongo_client' - , 'cursor' - , 'db' - , 'mongo_client' - , 'gridfs/grid' - , 'gridfs/chunk' - , 'gridfs/gridstore'].forEach(function (path) { - var module = require('./' + path); - for (var i in module) { - exports[i] = module[i]; - } - - // backwards compat - exports.ReplSetServers = exports.ReplSet; - - // Add BSON Classes - exports.Binary = require('bson').Binary; - exports.Code = require('bson').Code; - exports.DBRef = require('bson').DBRef; - exports.Double = require('bson').Double; - exports.Long = require('bson').Long; - exports.MinKey = require('bson').MinKey; - exports.MaxKey = require('bson').MaxKey; - exports.ObjectID = require('bson').ObjectID; - exports.Symbol = require('bson').Symbol; - exports.Timestamp = require('bson').Timestamp; - - // Add BSON Parser - exports.BSON = require('bson').BSONPure.BSON; - -}); - -// Get the Db object -var Db = require('./db').Db; -// Set up the connect function -var connect = Db.connect; -var obj = connect; -// Map all values to the exports value -for(var name in exports) { - obj[name] = exports[name]; -} - -// Add the pure and native backward compatible functions -exports.pure = exports.native = function() { - return obj; -} - -// Map all values to the exports value -for(var name in exports) { - connect[name] = exports[name]; -} - -// Set our exports to be the connect function -module.exports = connect; \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/mongo_client.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/mongo_client.js deleted file mode 100644 index f1f3a8d..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/mongo_client.js +++ /dev/null @@ -1,116 +0,0 @@ -var Db = require('./db').Db; - -/** - * Create a new MongoClient instance. - * - * Options - * - **w**, {Number/String, > -1 || 'majority' || tag name} the write concern for the operation where < 1 is no acknowlegement of write and w >= 1, w = 'majority' or tag acknowledges the write - * - **wtimeout**, {Number, 0} set the timeout for waiting for write concern to finish (combines with w option) - * - **fsync**, (Boolean, default:false) write waits for fsync before returning - * - **journal**, (Boolean, default:false) write waits for journal sync before returning - * - **readPreference** {String}, the prefered read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). - * - **native_parser** {Boolean, default:false}, use c++ bson parser. - * - **forceServerObjectId** {Boolean, default:false}, force server to create _id fields instead of client. - * - **pkFactory** {Object}, object overriding the basic ObjectID primary key generation. - * - **serializeFunctions** {Boolean, default:false}, serialize functions. - * - **raw** {Boolean, default:false}, peform operations using raw bson buffers. - * - **recordQueryStats** {Boolean, default:false}, record query statistics during execution. - * - **retryMiliSeconds** {Number, default:5000}, number of miliseconds between retries. - * - **numberOfRetries** {Number, default:5}, number of retries off connection. - * - * Deprecated Options - * - **safe** {true | {w:n, wtimeout:n} | {fsync:true}, default:false}, executes with a getLastError command returning the results of the command on MongoDB. - * - * @class Represents a MongoClient - * @param {Object} serverConfig server config object. - * @param {Object} [options] additional options for the collection. - */ -function MongoClient(serverConfig, options) { - options = options == null ? {} : options; - // If no write concern is set set the default to w:1 - if(options != null && !options.journal && !options.w && !options.fsync) { - options.w = 1; - } - - // The internal db instance we are wrapping - this._db = new Db('test', serverConfig, options); -} - -/** - * Initialize the database connection. - * - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the connected mongoclient or null if an error occured. - * @return {null} - * @api public - */ -MongoClient.prototype.open = function(callback) { - // Self reference - var self = this; - - this._db.open(function(err, db) { - if(err) return callback(err, null); - callback(null, self); - }) -} - -/** - * Close the current db connection, including all the child db instances. Emits close event if no callback is provided. - * - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from the close method or null if an error occured. - * @return {null} - * @api public - */ -MongoClient.prototype.close = function(callback) { - this._db.close(callback); -} - -/** - * Create a new Db instance sharing the current socket connections. - * - * @param {String} dbName the name of the database we want to use. - * @return {Db} a db instance using the new database. - * @api public - */ -MongoClient.prototype.db = function(dbName) { - return this._db.db(dbName); -} - -/** - * Connect to MongoDB using a url as documented at - * - * docs.mongodb.org/manual/reference/connection-string/ - * - * Options - * - **uri_decode_auth** {Boolean, default:false} uri decode the user name and password for authentication - * - **db** {Object, default: null} a hash off options to set on the db object, see **Db constructor** - * - **server** {Object, default: null} a hash off options to set on the server objects, see **Server** constructor** - * - **replSet** {Object, default: null} a hash off options to set on the replSet object, see **ReplSet** constructor** - * - **mongos** {Object, default: null} a hash off options to set on the mongos object, see **Mongos** constructor** - * - * @param {String} url connection url for MongoDB. - * @param {Object} [options] optional options for insert command - * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the initialized db object or null if an error occured. - * @return {null} - * @api public - */ -MongoClient.connect = function(url, options, callback) { - if(typeof options == 'function') { - callback = options; - options = {}; - } - - Db.connect(url, options, function(err, db) { - if(err) return callback(err, null); - - if(db.options !== null && !db.options.safe && !db.options.journal - && !db.options.w && !db.options.fsync && typeof db.options.w != 'number' - && (db.options.safe == false && url.indexOf("safe=") == -1)) { - db.options.w = 1; - } - - // Return the db - callback(null, db); - }); -} - -exports.MongoClient = MongoClient; \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js deleted file mode 100644 index b129dc6..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js +++ /dev/null @@ -1,140 +0,0 @@ -var Long = require('bson').Long; - -/** - Reply message from mongo db -**/ -var MongoReply = exports.MongoReply = function() { - this.documents = []; - this.index = 0; -}; - -MongoReply.prototype.parseHeader = function(binary_reply, bson) { - // Unpack the standard header first - this.messageLength = binary_reply[this.index] | binary_reply[this.index + 1] << 8 | binary_reply[this.index + 2] << 16 | binary_reply[this.index + 3] << 24; - this.index = this.index + 4; - // Fetch the request id for this reply - this.requestId = binary_reply[this.index] | binary_reply[this.index + 1] << 8 | binary_reply[this.index + 2] << 16 | binary_reply[this.index + 3] << 24; - this.index = this.index + 4; - // Fetch the id of the request that triggered the response - this.responseTo = binary_reply[this.index] | binary_reply[this.index + 1] << 8 | binary_reply[this.index + 2] << 16 | binary_reply[this.index + 3] << 24; - // Skip op-code field - this.index = this.index + 4 + 4; - // Unpack the reply message - this.responseFlag = binary_reply[this.index] | binary_reply[this.index + 1] << 8 | binary_reply[this.index + 2] << 16 | binary_reply[this.index + 3] << 24; - this.index = this.index + 4; - // Unpack the cursor id (a 64 bit long integer) - var low_bits = binary_reply[this.index] | binary_reply[this.index + 1] << 8 | binary_reply[this.index + 2] << 16 | binary_reply[this.index + 3] << 24; - this.index = this.index + 4; - var high_bits = binary_reply[this.index] | binary_reply[this.index + 1] << 8 | binary_reply[this.index + 2] << 16 | binary_reply[this.index + 3] << 24; - this.index = this.index + 4; - this.cursorId = new Long(low_bits, high_bits); - // Unpack the starting from - this.startingFrom = binary_reply[this.index] | binary_reply[this.index + 1] << 8 | binary_reply[this.index + 2] << 16 | binary_reply[this.index + 3] << 24; - this.index = this.index + 4; - // Unpack the number of objects returned - this.numberReturned = binary_reply[this.index] | binary_reply[this.index + 1] << 8 | binary_reply[this.index + 2] << 16 | binary_reply[this.index + 3] << 24; - this.index = this.index + 4; -} - -MongoReply.prototype.parseBody = function(binary_reply, bson, raw, callback) { - raw = raw == null ? false : raw; - // Just set a doc limit for deserializing - var docLimitSize = 1024*20; - - // If our message length is very long, let's switch to process.nextTick for messages - if(this.messageLength > docLimitSize) { - var batchSize = this.numberReturned; - this.documents = new Array(this.numberReturned); - - // Just walk down until we get a positive number >= 1 - for(var i = 50; i > 0; i--) { - if((this.numberReturned/i) >= 1) { - batchSize = i; - break; - } - } - - // Actual main creator of the processFunction setting internal state to control the flow - var parseFunction = function(_self, _binary_reply, _batchSize, _numberReturned) { - var object_index = 0; - // Internal loop process that will use nextTick to ensure we yield some time - var processFunction = function() { - // Adjust batchSize if we have less results left than batchsize - if((_numberReturned - object_index) < _batchSize) { - _batchSize = _numberReturned - object_index; - } - - // If raw just process the entries - if(raw) { - // Iterate over the batch - for(var i = 0; i < _batchSize; i++) { - // Are we done ? - if(object_index <= _numberReturned) { - // Read the size of the bson object - var bsonObjectSize = _binary_reply[_self.index] | _binary_reply[_self.index + 1] << 8 | _binary_reply[_self.index + 2] << 16 | _binary_reply[_self.index + 3] << 24; - // If we are storing the raw responses to pipe straight through - _self.documents[object_index] = binary_reply.slice(_self.index, _self.index + bsonObjectSize); - // Adjust binary index to point to next block of binary bson data - _self.index = _self.index + bsonObjectSize; - // Update number of docs parsed - object_index = object_index + 1; - } - } - } else { - try { - // Parse documents - _self.index = bson.deserializeStream(binary_reply, _self.index, _batchSize, _self.documents, object_index); - // Adjust index - object_index = object_index + _batchSize; - } catch (err) { - return callback(err); - } - } - - // If we hav more documents process NextTick - if(object_index < _numberReturned) { - process.nextTick(processFunction); - } else { - callback(null); - } - } - - // Return the process function - return processFunction; - }(this, binary_reply, batchSize, this.numberReturned)(); - } else { - try { - // Let's unpack all the bson documents, deserialize them and store them - for(var object_index = 0; object_index < this.numberReturned; object_index++) { - // Read the size of the bson object - var bsonObjectSize = binary_reply[this.index] | binary_reply[this.index + 1] << 8 | binary_reply[this.index + 2] << 16 | binary_reply[this.index + 3] << 24; - // If we are storing the raw responses to pipe straight through - if(raw) { - // Deserialize the object and add to the documents array - this.documents.push(binary_reply.slice(this.index, this.index + bsonObjectSize)); - } else { - // Deserialize the object and add to the documents array - this.documents.push(bson.deserialize(binary_reply.slice(this.index, this.index + bsonObjectSize))); - } - // Adjust binary index to point to next block of binary bson data - this.index = this.index + bsonObjectSize; - } - } catch(err) { - return callback(err); - } - - // No error return - callback(null); - } -} - -MongoReply.prototype.is_error = function(){ - if(this.documents.length == 1) { - return this.documents[0].ok == 1 ? false : true; - } - return false; -}; - -MongoReply.prototype.error_message = function() { - return this.documents.length == 1 && this.documents[0].ok == 1 ? '' : this.documents[0].errmsg; -}; \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/utils.js b/node_modules/mongoose/node_modules/mongodb/lib/mongodb/utils.js deleted file mode 100644 index a67aca5..0000000 --- a/node_modules/mongoose/node_modules/mongodb/lib/mongodb/utils.js +++ /dev/null @@ -1,121 +0,0 @@ -/** - * Sort functions, Normalize and prepare sort parameters - */ -var formatSortValue = exports.formatSortValue = function(sortDirection) { - var value = ("" + sortDirection).toLowerCase(); - - switch (value) { - case 'ascending': - case 'asc': - case '1': - return 1; - case 'descending': - case 'desc': - case '-1': - return -1; - default: - throw new Error("Illegal sort clause, must be of the form " - + "[['field1', '(ascending|descending)'], " - + "['field2', '(ascending|descending)']]"); - } -}; - -var formattedOrderClause = exports.formattedOrderClause = function(sortValue) { - var orderBy = {}; - - if (Array.isArray(sortValue)) { - for(var i = 0; i < sortValue.length; i++) { - if(sortValue[i].constructor == String) { - orderBy[sortValue[i]] = 1; - } else { - orderBy[sortValue[i][0]] = formatSortValue(sortValue[i][1]); - } - } - } else if(Object.prototype.toString.call(sortValue) === '[object Object]') { - orderBy = sortValue; - } else if (sortValue.constructor == String) { - orderBy[sortValue] = 1; - } else { - throw new Error("Illegal sort clause, must be of the form " + - "[['field1', '(ascending|descending)'], ['field2', '(ascending|descending)']]"); - } - - return orderBy; -}; - -exports.encodeInt = function(value) { - var buffer = new Buffer(4); - buffer[3] = (value >> 24) & 0xff; - buffer[2] = (value >> 16) & 0xff; - buffer[1] = (value >> 8) & 0xff; - buffer[0] = value & 0xff; - return buffer; -} - -exports.encodeIntInPlace = function(value, buffer, index) { - buffer[index + 3] = (value >> 24) & 0xff; - buffer[index + 2] = (value >> 16) & 0xff; - buffer[index + 1] = (value >> 8) & 0xff; - buffer[index] = value & 0xff; -} - -exports.encodeCString = function(string) { - var buf = new Buffer(string, 'utf8'); - return [buf, new Buffer([0])]; -} - -exports.decodeUInt32 = function(array, index) { - return array[index] | array[index + 1] << 8 | array[index + 2] << 16 | array[index + 3] << 24; -} - -// Decode the int -exports.decodeUInt8 = function(array, index) { - return array[index]; -} - -/** - * Context insensitive type checks - */ - -var toString = Object.prototype.toString; - -exports.isObject = function (arg) { - return '[object Object]' == toString.call(arg) -} - -exports.isArray = function (arg) { - return Array.isArray(arg) || - 'object' == typeof arg && '[object Array]' == toString.call(arg) -} - -exports.isDate = function (arg) { - return 'object' == typeof arg && '[object Date]' == toString.call(arg) -} - -exports.isRegExp = function (arg) { - return 'object' == typeof arg && '[object RegExp]' == toString.call(arg) -} - -/** - * Wrap a Mongo error document in an Error instance - * @ignore - * @api private - */ -exports.toError = function(error) { - if (error instanceof Error) return error; - - var msg = error.err || error.errmsg || error; - var e = new Error(msg); - e.name = 'MongoError'; - - // Get all object keys - var keys = typeof error == 'object' - ? Object.keys(error) - : []; - - for(var i = 0; i < keys.length; i++) { - e[keys[i]] = error[keys[i]]; - } - - return e; -} diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/.travis.yml b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/.travis.yml deleted file mode 100644 index 94740d0..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - 0.6 - - 0.8 - - 0.9 # development version of 0.8, may be unstable \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/Makefile b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/Makefile deleted file mode 100644 index 77ce4e0..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -NODE = node -NPM = npm -NODEUNIT = node_modules/nodeunit/bin/nodeunit - -all: clean node_gyp - -test: clean node_gyp - npm test - -node_gyp: clean - node-gyp configure build - -clean: - node-gyp clean - -browserify: - node_modules/.bin/onejs build browser_build/package.json browser_build/bson.js - -.PHONY: all diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/Readme.md b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/Readme.md deleted file mode 100644 index 73892e2..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/Readme.md +++ /dev/null @@ -1 +0,0 @@ -A JS/C++ Bson parser for node, used in the MongoDB Native driver \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/benchmarks/benchmarks.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/benchmarks/benchmarks.js deleted file mode 100644 index 45a1111..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/benchmarks/benchmarks.js +++ /dev/null @@ -1,130 +0,0 @@ -// var BSON = require('../../lib/mongodb').BSONNative.BSON, -// ObjectID = require('../../lib/mongodb').BSONNative.ObjectID, -// Code = require('../../lib/mongodb').BSONNative.Code, -// Long = require('../../lib/mongodb').BSONNative.Long, -// Binary = require('../../lib/mongodb').BSONNative.Binary, -// debug = require('util').debug, -// inspect = require('util').inspect, -// -// Long = require('../../lib/mongodb').Long, -// ObjectID = require('../../lib/mongodb').ObjectID, -// Binary = require('../../lib/mongodb').Binary, -// Code = require('../../lib/mongodb').Code, -// DBRef = require('../../lib/mongodb').DBRef, -// Symbol = require('../../lib/mongodb').Symbol, -// Double = require('../../lib/mongodb').Double, -// MaxKey = require('../../lib/mongodb').MaxKey, -// MinKey = require('../../lib/mongodb').MinKey, -// Timestamp = require('../../lib/mongodb').Timestamp; - - -// var BSON = require('../../lib/mongodb').BSONPure.BSON, -// ObjectID = require('../../lib/mongodb').BSONPure.ObjectID, -// Code = require('../../lib/mongodb').BSONPure.Code, -// Long = require('../../lib/mongodb').BSONPure.Long, -// Binary = require('../../lib/mongodb').BSONPure.Binary; - -var BSON = require('../lib/bson').BSONNative.BSON, - Long = require('../lib/bson').Long, - ObjectID = require('../lib/bson').ObjectID, - Binary = require('../lib/bson').Binary, - Code = require('../lib/bson').Code, - DBRef = require('../lib/bson').DBRef, - Symbol = require('../lib/bson').Symbol, - Double = require('../lib/bson').Double, - MaxKey = require('../lib/bson').MaxKey, - MinKey = require('../lib/bson').MinKey, - Timestamp = require('../lib/bson').Timestamp; - - // console.dir(require('../lib/bson')) - -var COUNT = 1000; -var COUNT = 100; - -var object = { - string: "Strings are great", - decimal: 3.14159265, - bool: true, - integer: 5, - date: new Date(), - double: new Double(1.4), - id: new ObjectID(), - min: new MinKey(), - max: new MaxKey(), - symbol: new Symbol('hello'), - long: Long.fromNumber(100), - bin: new Binary(new Buffer(100)), - - subObject: { - moreText: "Bacon ipsum dolor sit amet cow pork belly rump ribeye pastrami andouille. Tail hamburger pork belly, drumstick flank salami t-bone sirloin pork chop ribeye ham chuck pork loin shankle. Ham fatback pork swine, sirloin shankle short loin andouille shank sausage meatloaf drumstick. Pig chicken cow bresaola, pork loin jerky meatball tenderloin brisket strip steak jowl spare ribs. Biltong sirloin pork belly boudin, bacon pastrami rump chicken. Jowl rump fatback, biltong bacon t-bone turkey. Turkey pork loin boudin, tenderloin jerky beef ribs pastrami spare ribs biltong pork chop beef.", - longKeylongKeylongKeylongKeylongKeylongKey: "Pork belly boudin shoulder ribeye pork chop brisket biltong short ribs. Salami beef pork belly, t-bone sirloin meatloaf tail jowl spare ribs. Sirloin biltong bresaola cow turkey. Biltong fatback meatball, bresaola tail shankle turkey pancetta ham ribeye flank bacon jerky pork chop. Boudin sirloin shoulder, salami swine flank jerky t-bone pork chop pork beef tongue. Bresaola ribeye jerky andouille. Ribeye ground round sausage biltong beef ribs chuck, shank hamburger chicken short ribs spare ribs tenderloin meatloaf pork loin." - }, - - subArray: [1,2,3,4,5,6,7,8,9,10], - anotherString: "another string", - code: new Code("function() {}", {i:1}) -} - -// Number of objects -var numberOfObjects = 10000; -var bson = new BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]); -console.log("---------------------- 1") -var s = new Date() -// Object serialized -for(var i = 0; i < numberOfObjects; i++) { - objectBSON = bson.serialize(object, null, true) -} -console.log("====================== " + (new Date().getTime() - s.getTime()) + " :: " + ((new Date().getTime() - s.getTime()))/numberOfObjects) - -console.log("---------------------- 2") -var s = new Date() -// Object serialized -for(var i = 0; i < numberOfObjects; i++) { - bson.deserialize(objectBSON); -} -console.log("====================== " + (new Date().getTime() - s.getTime()) + " :: " + ((new Date().getTime() - s.getTime()))/numberOfObjects) - -// // Buffer With copies of the objectBSON -// var data = new Buffer(objectBSON.length * numberOfObjects); -// var index = 0; -// -// // Copy the buffer 1000 times to create a strea m of objects -// for(var i = 0; i < numberOfObjects; i++) { -// // Copy data -// objectBSON.copy(data, index); -// // Adjust index -// index = index + objectBSON.length; -// } -// -// // console.log("-----------------------------------------------------------------------------------") -// // console.dir(objectBSON) -// -// var x, start, end, j -// var objectBSON, objectJSON -// -// // Allocate the return array (avoid concatinating everything) -// var results = new Array(numberOfObjects); -// -// console.log(COUNT + "x (objectBSON = BSON.serialize(object))") -// start = new Date -// -// // var objects = BSON.deserializeStream(data, 0, numberOfObjects); -// // console.log("----------------------------------------------------------------------------------- 0") -// // var objects = BSON.deserialize(data); -// // console.log("----------------------------------------------------------------------------------- 1") -// // console.dir(objects) -// -// for (j=COUNT; --j>=0; ) { -// var nextIndex = BSON.deserializeStream(data, 0, numberOfObjects, results, 0); -// } -// -// end = new Date -// var opsprsecond = COUNT / ((end - start)/1000); -// console.log("bson size (bytes): ", objectBSON.length); -// console.log("time = ", end - start, "ms -", COUNT / ((end - start)/1000), " ops/sec"); -// console.log("MB/s = " + ((opsprsecond*objectBSON.length)/1024)); -// -// // console.dir(nextIndex) -// // console.dir(results) - - diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/binding.gyp b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/binding.gyp deleted file mode 100644 index 42445d3..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/binding.gyp +++ /dev/null @@ -1,17 +0,0 @@ -{ - 'targets': [ - { - 'target_name': 'bson', - 'sources': [ 'ext/bson.cc' ], - 'cflags!': [ '-fno-exceptions' ], - 'cflags_cc!': [ '-fno-exceptions' ], - 'conditions': [ - ['OS=="mac"', { - 'xcode_settings': { - 'GCC_ENABLE_CPP_EXCEPTIONS': 'YES' - } - }] - ] - } - ] -} \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/browser_build/bson.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/browser_build/bson.js deleted file mode 100644 index e7a1c74..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/browser_build/bson.js +++ /dev/null @@ -1,4814 +0,0 @@ -var bson = (function(){ - - var pkgmap = {}, - global = {}, - nativeRequire = typeof require != 'undefined' && require, - lib, ties, main, async; - - function exports(){ return main(); }; - - exports.main = exports; - exports.module = module; - exports.packages = pkgmap; - exports.pkg = pkg; - exports.require = function require(uri){ return pkgmap.main.index.require(uri); }; - - - ties = {}; - - aliases = {}; - - - return exports; - -function join() { - return normalize(Array.prototype.join.call(arguments, "/")); -}; - -function normalize(path) { - var ret = [], parts = path.split('/'), cur, prev; - - var i = 0, l = parts.length-1; - for (; i <= l; i++) { - cur = parts[i]; - - if (cur === "." && prev !== undefined) continue; - - if (cur === ".." && ret.length && prev !== ".." && prev !== "." && prev !== undefined) { - ret.pop(); - prev = ret.slice(-1)[0]; - } else { - if (prev === ".") ret.pop(); - ret.push(cur); - prev = cur; - } - } - - return ret.join("/"); -}; - -function dirname(path) { - return path && path.substr(0, path.lastIndexOf("/")) || "."; -}; - -function findModule(workingModule, uri){ - var moduleId = join(dirname(workingModule.id), uri).replace(/\.js$/, ''), - moduleIndexId = join(moduleId, 'index'), - pkg = workingModule.pkg, - module; - - var i = pkg.modules.length, - id; - - while(i-->0){ - id = pkg.modules[i].id; - if(id==moduleId || id == moduleIndexId){ - module = pkg.modules[i]; - break; - } - } - - return module; -} - -function newRequire(callingModule){ - function require(uri){ - var module, pkg; - - if(/^\./.test(uri)){ - module = findModule(callingModule, uri); - } else if ( ties && ties.hasOwnProperty( uri ) ) { - return ties[uri]; - } else if ( aliases && aliases.hasOwnProperty( uri ) ) { - return require(aliases[uri]); - } else { - pkg = pkgmap[uri]; - - if(!pkg && nativeRequire){ - try { - pkg = nativeRequire(uri); - } catch (nativeRequireError) {} - - if(pkg) return pkg; - } - - if(!pkg){ - throw new Error('Cannot find module "'+uri+'" @[module: '+callingModule.id+' package: '+callingModule.pkg.name+']'); - } - - module = pkg.index; - } - - if(!module){ - throw new Error('Cannot find module "'+uri+'" @[module: '+callingModule.id+' package: '+callingModule.pkg.name+']'); - } - - module.parent = callingModule; - return module.call(); - }; - - - return require; -} - - -function module(parent, id, wrapper){ - var mod = { pkg: parent, id: id, wrapper: wrapper }, - cached = false; - - mod.exports = {}; - mod.require = newRequire(mod); - - mod.call = function(){ - if(cached) { - return mod.exports; - } - - cached = true; - - global.require = mod.require; - - mod.wrapper(mod, mod.exports, global, global.require); - return mod.exports; - }; - - if(parent.mainModuleId == mod.id){ - parent.index = mod; - parent.parents.length === 0 && ( main = mod.call ); - } - - parent.modules.push(mod); -} - -function pkg(/* [ parentId ...], wrapper */){ - var wrapper = arguments[ arguments.length - 1 ], - parents = Array.prototype.slice.call(arguments, 0, arguments.length - 1), - ctx = wrapper(parents); - - - pkgmap[ctx.name] = ctx; - - arguments.length == 1 && ( pkgmap.main = ctx ); - - return function(modules){ - var id; - for(id in modules){ - module(ctx, id, modules[id]); - } - }; -} - - -}(this)); - -bson.pkg(function(parents){ - - return { - 'name' : 'bson', - 'mainModuleId' : 'bson', - 'modules' : [], - 'parents' : parents - }; - -})({ 'binary': function(module, exports, global, require, undefined){ - /** - * Module dependencies. - */ -if(typeof window === 'undefined') { - var Buffer = require('buffer').Buffer; // TODO just use global Buffer -} - -// Binary default subtype -var BSON_BINARY_SUBTYPE_DEFAULT = 0; - -/** - * @ignore - * @api private - */ -var writeStringToArray = function(data) { - // Create a buffer - var buffer = typeof Uint8Array != 'undefined' ? new Uint8Array(new ArrayBuffer(data.length)) : new Array(data.length); - // Write the content to the buffer - for(var i = 0; i < data.length; i++) { - buffer[i] = data.charCodeAt(i); - } - // Write the string to the buffer - return buffer; -} - -/** - * Convert Array ot Uint8Array to Binary String - * - * @ignore - * @api private - */ -var convertArraytoUtf8BinaryString = function(byteArray, startIndex, endIndex) { - var result = ""; - for(var i = startIndex; i < endIndex; i++) { - result = result + String.fromCharCode(byteArray[i]); - } - return result; -}; - -/** - * A class representation of the BSON Binary type. - * - * Sub types - * - **BSON.BSON_BINARY_SUBTYPE_DEFAULT**, default BSON type. - * - **BSON.BSON_BINARY_SUBTYPE_FUNCTION**, BSON function type. - * - **BSON.BSON_BINARY_SUBTYPE_BYTE_ARRAY**, BSON byte array type. - * - **BSON.BSON_BINARY_SUBTYPE_UUID**, BSON uuid type. - * - **BSON.BSON_BINARY_SUBTYPE_MD5**, BSON md5 type. - * - **BSON.BSON_BINARY_SUBTYPE_USER_DEFINED**, BSON user defined type. - * - * @class Represents the Binary BSON type. - * @param {Buffer} buffer a buffer object containing the binary data. - * @param {Number} [subType] the option binary type. - * @return {Grid} - */ -function Binary(buffer, subType) { - if(!(this instanceof Binary)) return new Binary(buffer, subType); - - this._bsontype = 'Binary'; - - if(buffer instanceof Number) { - this.sub_type = buffer; - this.position = 0; - } else { - this.sub_type = subType == null ? BSON_BINARY_SUBTYPE_DEFAULT : subType; - this.position = 0; - } - - if(buffer != null && !(buffer instanceof Number)) { - // Only accept Buffer, Uint8Array or Arrays - if(typeof buffer == 'string') { - // Different ways of writing the length of the string for the different types - if(typeof Buffer != 'undefined') { - this.buffer = new Buffer(buffer); - } else if(typeof Uint8Array != 'undefined' || (Object.prototype.toString.call(buffer) == '[object Array]')) { - this.buffer = writeStringToArray(buffer); - } else { - throw new Error("only String, Buffer, Uint8Array or Array accepted"); - } - } else { - this.buffer = buffer; - } - this.position = buffer.length; - } else { - if(typeof Buffer != 'undefined') { - this.buffer = new Buffer(Binary.BUFFER_SIZE); - } else if(typeof Uint8Array != 'undefined'){ - this.buffer = new Uint8Array(new ArrayBuffer(Binary.BUFFER_SIZE)); - } else { - this.buffer = new Array(Binary.BUFFER_SIZE); - } - // Set position to start of buffer - this.position = 0; - } -}; - -/** - * Updates this binary with byte_value. - * - * @param {Character} byte_value a single byte we wish to write. - * @api public - */ -Binary.prototype.put = function put(byte_value) { - // If it's a string and a has more than one character throw an error - if(byte_value['length'] != null && typeof byte_value != 'number' && byte_value.length != 1) throw new Error("only accepts single character String, Uint8Array or Array"); - if(typeof byte_value != 'number' && byte_value < 0 || byte_value > 255) throw new Error("only accepts number in a valid unsigned byte range 0-255"); - - // Decode the byte value once - var decoded_byte = null; - if(typeof byte_value == 'string') { - decoded_byte = byte_value.charCodeAt(0); - } else if(byte_value['length'] != null) { - decoded_byte = byte_value[0]; - } else { - decoded_byte = byte_value; - } - - if(this.buffer.length > this.position) { - this.buffer[this.position++] = decoded_byte; - } else { - if(typeof Buffer != 'undefined' && Buffer.isBuffer(this.buffer)) { - // Create additional overflow buffer - var buffer = new Buffer(Binary.BUFFER_SIZE + this.buffer.length); - // Combine the two buffers together - this.buffer.copy(buffer, 0, 0, this.buffer.length); - this.buffer = buffer; - this.buffer[this.position++] = decoded_byte; - } else { - var buffer = null; - // Create a new buffer (typed or normal array) - if(Object.prototype.toString.call(this.buffer) == '[object Uint8Array]') { - buffer = new Uint8Array(new ArrayBuffer(Binary.BUFFER_SIZE + this.buffer.length)); - } else { - buffer = new Array(Binary.BUFFER_SIZE + this.buffer.length); - } - - // We need to copy all the content to the new array - for(var i = 0; i < this.buffer.length; i++) { - buffer[i] = this.buffer[i]; - } - - // Reassign the buffer - this.buffer = buffer; - // Write the byte - this.buffer[this.position++] = decoded_byte; - } - } -}; - -/** - * Writes a buffer or string to the binary. - * - * @param {Buffer|String} string a string or buffer to be written to the Binary BSON object. - * @param {Number} offset specify the binary of where to write the content. - * @api public - */ -Binary.prototype.write = function write(string, offset) { - offset = typeof offset == 'number' ? offset : this.position; - - // If the buffer is to small let's extend the buffer - if(this.buffer.length < offset + string.length) { - var buffer = null; - // If we are in node.js - if(typeof Buffer != 'undefined' && Buffer.isBuffer(this.buffer)) { - buffer = new Buffer(this.buffer.length + string.length); - this.buffer.copy(buffer, 0, 0, this.buffer.length); - } else if(Object.prototype.toString.call(this.buffer) == '[object Uint8Array]') { - // Create a new buffer - buffer = new Uint8Array(new ArrayBuffer(this.buffer.length + string.length)) - // Copy the content - for(var i = 0; i < this.position; i++) { - buffer[i] = this.buffer[i]; - } - } - - // Assign the new buffer - this.buffer = buffer; - } - - if(typeof Buffer != 'undefined' && Buffer.isBuffer(string) && Buffer.isBuffer(this.buffer)) { - string.copy(this.buffer, offset, 0, string.length); - this.position = (offset + string.length) > this.position ? (offset + string.length) : this.position; - // offset = string.length - } else if(typeof Buffer != 'undefined' && typeof string == 'string' && Buffer.isBuffer(this.buffer)) { - this.buffer.write(string, 'binary', offset); - this.position = (offset + string.length) > this.position ? (offset + string.length) : this.position; - // offset = string.length; - } else if(Object.prototype.toString.call(string) == '[object Uint8Array]' - || Object.prototype.toString.call(string) == '[object Array]' && typeof string != 'string') { - for(var i = 0; i < string.length; i++) { - this.buffer[offset++] = string[i]; - } - - this.position = offset > this.position ? offset : this.position; - } else if(typeof string == 'string') { - for(var i = 0; i < string.length; i++) { - this.buffer[offset++] = string.charCodeAt(i); - } - - this.position = offset > this.position ? offset : this.position; - } -}; - -/** - * Reads **length** bytes starting at **position**. - * - * @param {Number} position read from the given position in the Binary. - * @param {Number} length the number of bytes to read. - * @return {Buffer} - * @api public - */ -Binary.prototype.read = function read(position, length) { - length = length && length > 0 - ? length - : this.position; - - // Let's return the data based on the type we have - if(this.buffer['slice']) { - return this.buffer.slice(position, position + length); - } else { - // Create a buffer to keep the result - var buffer = typeof Uint8Array != 'undefined' ? new Uint8Array(new ArrayBuffer(length)) : new Array(length); - for(var i = 0; i < length; i++) { - buffer[i] = this.buffer[position++]; - } - } - // Return the buffer - return buffer; -}; - -/** - * Returns the value of this binary as a string. - * - * @return {String} - * @api public - */ -Binary.prototype.value = function value(asRaw) { - asRaw = asRaw == null ? false : asRaw; - - // If it's a node.js buffer object - if(typeof Buffer != 'undefined' && Buffer.isBuffer(this.buffer)) { - return asRaw ? this.buffer.slice(0, this.position) : this.buffer.toString('binary', 0, this.position); - } else { - if(asRaw) { - // we support the slice command use it - if(this.buffer['slice'] != null) { - return this.buffer.slice(0, this.position); - } else { - // Create a new buffer to copy content to - var newBuffer = Object.prototype.toString.call(this.buffer) == '[object Uint8Array]' ? new Uint8Array(new ArrayBuffer(this.position)) : new Array(this.position); - // Copy content - for(var i = 0; i < this.position; i++) { - newBuffer[i] = this.buffer[i]; - } - // Return the buffer - return newBuffer; - } - } else { - return convertArraytoUtf8BinaryString(this.buffer, 0, this.position); - } - } -}; - -/** - * Length. - * - * @return {Number} the length of the binary. - * @api public - */ -Binary.prototype.length = function length() { - return this.position; -}; - -/** - * @ignore - * @api private - */ -Binary.prototype.toJSON = function() { - return this.buffer != null ? this.buffer.toString('base64') : ''; -} - -/** - * @ignore - * @api private - */ -Binary.prototype.toString = function(format) { - return this.buffer != null ? this.buffer.slice(0, this.position).toString(format) : ''; -} - -Binary.BUFFER_SIZE = 256; - -/** - * Default BSON type - * - * @classconstant SUBTYPE_DEFAULT - **/ -Binary.SUBTYPE_DEFAULT = 0; -/** - * Function BSON type - * - * @classconstant SUBTYPE_DEFAULT - **/ -Binary.SUBTYPE_FUNCTION = 1; -/** - * Byte Array BSON type - * - * @classconstant SUBTYPE_DEFAULT - **/ -Binary.SUBTYPE_BYTE_ARRAY = 2; -/** - * OLD UUID BSON type - * - * @classconstant SUBTYPE_DEFAULT - **/ -Binary.SUBTYPE_UUID_OLD = 3; -/** - * UUID BSON type - * - * @classconstant SUBTYPE_DEFAULT - **/ -Binary.SUBTYPE_UUID = 4; -/** - * MD5 BSON type - * - * @classconstant SUBTYPE_DEFAULT - **/ -Binary.SUBTYPE_MD5 = 5; -/** - * User BSON type - * - * @classconstant SUBTYPE_DEFAULT - **/ -Binary.SUBTYPE_USER_DEFINED = 128; - -/** - * Expose. - */ -exports.Binary = Binary; - - -}, - - - -'binary_parser': function(module, exports, global, require, undefined){ - /** - * Binary Parser. - * Jonas Raoni Soares Silva - * http://jsfromhell.com/classes/binary-parser [v1.0] - */ -var chr = String.fromCharCode; - -var maxBits = []; -for (var i = 0; i < 64; i++) { - maxBits[i] = Math.pow(2, i); -} - -function BinaryParser (bigEndian, allowExceptions) { - if(!(this instanceof BinaryParser)) return new BinaryParser(bigEndian, allowExceptions); - - this.bigEndian = bigEndian; - this.allowExceptions = allowExceptions; -}; - -BinaryParser.warn = function warn (msg) { - if (this.allowExceptions) { - throw new Error(msg); - } - - return 1; -}; - -BinaryParser.decodeFloat = function decodeFloat (data, precisionBits, exponentBits) { - var b = new this.Buffer(this.bigEndian, data); - - b.checkBuffer(precisionBits + exponentBits + 1); - - var bias = maxBits[exponentBits - 1] - 1 - , signal = b.readBits(precisionBits + exponentBits, 1) - , exponent = b.readBits(precisionBits, exponentBits) - , significand = 0 - , divisor = 2 - , curByte = b.buffer.length + (-precisionBits >> 3) - 1; - - do { - for (var byteValue = b.buffer[ ++curByte ], startBit = precisionBits % 8 || 8, mask = 1 << startBit; mask >>= 1; ( byteValue & mask ) && ( significand += 1 / divisor ), divisor *= 2 ); - } while (precisionBits -= startBit); - - return exponent == ( bias << 1 ) + 1 ? significand ? NaN : signal ? -Infinity : +Infinity : ( 1 + signal * -2 ) * ( exponent || significand ? !exponent ? Math.pow( 2, -bias + 1 ) * significand : Math.pow( 2, exponent - bias ) * ( 1 + significand ) : 0 ); -}; - -BinaryParser.decodeInt = function decodeInt (data, bits, signed, forceBigEndian) { - var b = new this.Buffer(this.bigEndian || forceBigEndian, data) - , x = b.readBits(0, bits) - , max = maxBits[bits]; //max = Math.pow( 2, bits ); - - return signed && x >= max / 2 - ? x - max - : x; -}; - -BinaryParser.encodeFloat = function encodeFloat (data, precisionBits, exponentBits) { - var bias = maxBits[exponentBits - 1] - 1 - , minExp = -bias + 1 - , maxExp = bias - , minUnnormExp = minExp - precisionBits - , n = parseFloat(data) - , status = isNaN(n) || n == -Infinity || n == +Infinity ? n : 0 - , exp = 0 - , len = 2 * bias + 1 + precisionBits + 3 - , bin = new Array(len) - , signal = (n = status !== 0 ? 0 : n) < 0 - , intPart = Math.floor(n = Math.abs(n)) - , floatPart = n - intPart - , lastBit - , rounded - , result - , i - , j; - - for (i = len; i; bin[--i] = 0); - - for (i = bias + 2; intPart && i; bin[--i] = intPart % 2, intPart = Math.floor(intPart / 2)); - - for (i = bias + 1; floatPart > 0 && i; (bin[++i] = ((floatPart *= 2) >= 1) - 0 ) && --floatPart); - - for (i = -1; ++i < len && !bin[i];); - - if (bin[(lastBit = precisionBits - 1 + (i = (exp = bias + 1 - i) >= minExp && exp <= maxExp ? i + 1 : bias + 1 - (exp = minExp - 1))) + 1]) { - if (!(rounded = bin[lastBit])) { - for (j = lastBit + 2; !rounded && j < len; rounded = bin[j++]); - } - - for (j = lastBit + 1; rounded && --j >= 0; (bin[j] = !bin[j] - 0) && (rounded = 0)); - } - - for (i = i - 2 < 0 ? -1 : i - 3; ++i < len && !bin[i];); - - if ((exp = bias + 1 - i) >= minExp && exp <= maxExp) { - ++i; - } else if (exp < minExp) { - exp != bias + 1 - len && exp < minUnnormExp && this.warn("encodeFloat::float underflow"); - i = bias + 1 - (exp = minExp - 1); - } - - if (intPart || status !== 0) { - this.warn(intPart ? "encodeFloat::float overflow" : "encodeFloat::" + status); - exp = maxExp + 1; - i = bias + 2; - - if (status == -Infinity) { - signal = 1; - } else if (isNaN(status)) { - bin[i] = 1; - } - } - - for (n = Math.abs(exp + bias), j = exponentBits + 1, result = ""; --j; result = (n % 2) + result, n = n >>= 1); - - for (n = 0, j = 0, i = (result = (signal ? "1" : "0") + result + bin.slice(i, i + precisionBits).join("")).length, r = []; i; j = (j + 1) % 8) { - n += (1 << j) * result.charAt(--i); - if (j == 7) { - r[r.length] = String.fromCharCode(n); - n = 0; - } - } - - r[r.length] = n - ? String.fromCharCode(n) - : ""; - - return (this.bigEndian ? r.reverse() : r).join(""); -}; - -BinaryParser.encodeInt = function encodeInt (data, bits, signed, forceBigEndian) { - var max = maxBits[bits]; - - if (data >= max || data < -(max / 2)) { - this.warn("encodeInt::overflow"); - data = 0; - } - - if (data < 0) { - data += max; - } - - for (var r = []; data; r[r.length] = String.fromCharCode(data % 256), data = Math.floor(data / 256)); - - for (bits = -(-bits >> 3) - r.length; bits--; r[r.length] = "\0"); - - return ((this.bigEndian || forceBigEndian) ? r.reverse() : r).join(""); -}; - -BinaryParser.toSmall = function( data ){ return this.decodeInt( data, 8, true ); }; -BinaryParser.fromSmall = function( data ){ return this.encodeInt( data, 8, true ); }; -BinaryParser.toByte = function( data ){ return this.decodeInt( data, 8, false ); }; -BinaryParser.fromByte = function( data ){ return this.encodeInt( data, 8, false ); }; -BinaryParser.toShort = function( data ){ return this.decodeInt( data, 16, true ); }; -BinaryParser.fromShort = function( data ){ return this.encodeInt( data, 16, true ); }; -BinaryParser.toWord = function( data ){ return this.decodeInt( data, 16, false ); }; -BinaryParser.fromWord = function( data ){ return this.encodeInt( data, 16, false ); }; -BinaryParser.toInt = function( data ){ return this.decodeInt( data, 32, true ); }; -BinaryParser.fromInt = function( data ){ return this.encodeInt( data, 32, true ); }; -BinaryParser.toLong = function( data ){ return this.decodeInt( data, 64, true ); }; -BinaryParser.fromLong = function( data ){ return this.encodeInt( data, 64, true ); }; -BinaryParser.toDWord = function( data ){ return this.decodeInt( data, 32, false ); }; -BinaryParser.fromDWord = function( data ){ return this.encodeInt( data, 32, false ); }; -BinaryParser.toQWord = function( data ){ return this.decodeInt( data, 64, true ); }; -BinaryParser.fromQWord = function( data ){ return this.encodeInt( data, 64, true ); }; -BinaryParser.toFloat = function( data ){ return this.decodeFloat( data, 23, 8 ); }; -BinaryParser.fromFloat = function( data ){ return this.encodeFloat( data, 23, 8 ); }; -BinaryParser.toDouble = function( data ){ return this.decodeFloat( data, 52, 11 ); }; -BinaryParser.fromDouble = function( data ){ return this.encodeFloat( data, 52, 11 ); }; - -// Factor out the encode so it can be shared by add_header and push_int32 -BinaryParser.encode_int32 = function encode_int32 (number, asArray) { - var a, b, c, d, unsigned; - unsigned = (number < 0) ? (number + 0x100000000) : number; - a = Math.floor(unsigned / 0xffffff); - unsigned &= 0xffffff; - b = Math.floor(unsigned / 0xffff); - unsigned &= 0xffff; - c = Math.floor(unsigned / 0xff); - unsigned &= 0xff; - d = Math.floor(unsigned); - return asArray ? [chr(a), chr(b), chr(c), chr(d)] : chr(a) + chr(b) + chr(c) + chr(d); -}; - -BinaryParser.encode_int64 = function encode_int64 (number) { - var a, b, c, d, e, f, g, h, unsigned; - unsigned = (number < 0) ? (number + 0x10000000000000000) : number; - a = Math.floor(unsigned / 0xffffffffffffff); - unsigned &= 0xffffffffffffff; - b = Math.floor(unsigned / 0xffffffffffff); - unsigned &= 0xffffffffffff; - c = Math.floor(unsigned / 0xffffffffff); - unsigned &= 0xffffffffff; - d = Math.floor(unsigned / 0xffffffff); - unsigned &= 0xffffffff; - e = Math.floor(unsigned / 0xffffff); - unsigned &= 0xffffff; - f = Math.floor(unsigned / 0xffff); - unsigned &= 0xffff; - g = Math.floor(unsigned / 0xff); - unsigned &= 0xff; - h = Math.floor(unsigned); - return chr(a) + chr(b) + chr(c) + chr(d) + chr(e) + chr(f) + chr(g) + chr(h); -}; - -/** - * UTF8 methods - */ - -// Take a raw binary string and return a utf8 string -BinaryParser.decode_utf8 = function decode_utf8 (binaryStr) { - var len = binaryStr.length - , decoded = '' - , i = 0 - , c = 0 - , c1 = 0 - , c2 = 0 - , c3; - - while (i < len) { - c = binaryStr.charCodeAt(i); - if (c < 128) { - decoded += String.fromCharCode(c); - i++; - } else if ((c > 191) && (c < 224)) { - c2 = binaryStr.charCodeAt(i+1); - decoded += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); - i += 2; - } else { - c2 = binaryStr.charCodeAt(i+1); - c3 = binaryStr.charCodeAt(i+2); - decoded += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); - i += 3; - } - } - - return decoded; -}; - -// Encode a cstring -BinaryParser.encode_cstring = function encode_cstring (s) { - return unescape(encodeURIComponent(s)) + BinaryParser.fromByte(0); -}; - -// Take a utf8 string and return a binary string -BinaryParser.encode_utf8 = function encode_utf8 (s) { - var a = "" - , c; - - for (var n = 0, len = s.length; n < len; n++) { - c = s.charCodeAt(n); - - if (c < 128) { - a += String.fromCharCode(c); - } else if ((c > 127) && (c < 2048)) { - a += String.fromCharCode((c>>6) | 192) ; - a += String.fromCharCode((c&63) | 128); - } else { - a += String.fromCharCode((c>>12) | 224); - a += String.fromCharCode(((c>>6) & 63) | 128); - a += String.fromCharCode((c&63) | 128); - } - } - - return a; -}; - -BinaryParser.hprint = function hprint (s) { - var number; - - for (var i = 0, len = s.length; i < len; i++) { - if (s.charCodeAt(i) < 32) { - number = s.charCodeAt(i) <= 15 - ? "0" + s.charCodeAt(i).toString(16) - : s.charCodeAt(i).toString(16); - process.stdout.write(number + " ") - } else { - number = s.charCodeAt(i) <= 15 - ? "0" + s.charCodeAt(i).toString(16) - : s.charCodeAt(i).toString(16); - process.stdout.write(number + " ") - } - } - - process.stdout.write("\n\n"); -}; - -BinaryParser.ilprint = function hprint (s) { - var number; - - for (var i = 0, len = s.length; i < len; i++) { - if (s.charCodeAt(i) < 32) { - number = s.charCodeAt(i) <= 15 - ? "0" + s.charCodeAt(i).toString(10) - : s.charCodeAt(i).toString(10); - - require('util').debug(number+' : '); - } else { - number = s.charCodeAt(i) <= 15 - ? "0" + s.charCodeAt(i).toString(10) - : s.charCodeAt(i).toString(10); - require('util').debug(number+' : '+ s.charAt(i)); - } - } -}; - -BinaryParser.hlprint = function hprint (s) { - var number; - - for (var i = 0, len = s.length; i < len; i++) { - if (s.charCodeAt(i) < 32) { - number = s.charCodeAt(i) <= 15 - ? "0" + s.charCodeAt(i).toString(16) - : s.charCodeAt(i).toString(16); - require('util').debug(number+' : '); - } else { - number = s.charCodeAt(i) <= 15 - ? "0" + s.charCodeAt(i).toString(16) - : s.charCodeAt(i).toString(16); - require('util').debug(number+' : '+ s.charAt(i)); - } - } -}; - -/** - * BinaryParser buffer constructor. - */ -function BinaryParserBuffer (bigEndian, buffer) { - this.bigEndian = bigEndian || 0; - this.buffer = []; - this.setBuffer(buffer); -}; - -BinaryParserBuffer.prototype.setBuffer = function setBuffer (data) { - var l, i, b; - - if (data) { - i = l = data.length; - b = this.buffer = new Array(l); - for (; i; b[l - i] = data.charCodeAt(--i)); - this.bigEndian && b.reverse(); - } -}; - -BinaryParserBuffer.prototype.hasNeededBits = function hasNeededBits (neededBits) { - return this.buffer.length >= -(-neededBits >> 3); -}; - -BinaryParserBuffer.prototype.checkBuffer = function checkBuffer (neededBits) { - if (!this.hasNeededBits(neededBits)) { - throw new Error("checkBuffer::missing bytes"); - } -}; - -BinaryParserBuffer.prototype.readBits = function readBits (start, length) { - //shl fix: Henri Torgemane ~1996 (compressed by Jonas Raoni) - - function shl (a, b) { - for (; b--; a = ((a %= 0x7fffffff + 1) & 0x40000000) == 0x40000000 ? a * 2 : (a - 0x40000000) * 2 + 0x7fffffff + 1); - return a; - } - - if (start < 0 || length <= 0) { - return 0; - } - - this.checkBuffer(start + length); - - var offsetLeft - , offsetRight = start % 8 - , curByte = this.buffer.length - ( start >> 3 ) - 1 - , lastByte = this.buffer.length + ( -( start + length ) >> 3 ) - , diff = curByte - lastByte - , sum = ((this.buffer[ curByte ] >> offsetRight) & ((1 << (diff ? 8 - offsetRight : length)) - 1)) + (diff && (offsetLeft = (start + length) % 8) ? (this.buffer[lastByte++] & ((1 << offsetLeft) - 1)) << (diff-- << 3) - offsetRight : 0); - - for(; diff; sum += shl(this.buffer[lastByte++], (diff-- << 3) - offsetRight)); - - return sum; -}; - -/** - * Expose. - */ -BinaryParser.Buffer = BinaryParserBuffer; - -exports.BinaryParser = BinaryParser; - -}, - - - -'bson': function(module, exports, global, require, undefined){ - var Long = require('./long').Long - , Double = require('./double').Double - , Timestamp = require('./timestamp').Timestamp - , ObjectID = require('./objectid').ObjectID - , Symbol = require('./symbol').Symbol - , Code = require('./code').Code - , MinKey = require('./min_key').MinKey - , MaxKey = require('./max_key').MaxKey - , DBRef = require('./db_ref').DBRef - , Binary = require('./binary').Binary - , BinaryParser = require('./binary_parser').BinaryParser - , writeIEEE754 = require('./float_parser').writeIEEE754 - , readIEEE754 = require('./float_parser').readIEEE754 - -// To ensure that 0.4 of node works correctly -var isDate = function isDate(d) { - return typeof d === 'object' && Object.prototype.toString.call(d) === '[object Date]'; -} - -/** - * Create a new BSON instance - * - * @class Represents the BSON Parser - * @return {BSON} instance of BSON Parser. - */ -function BSON () {}; - -/** - * @ignore - * @api private - */ -// BSON MAX VALUES -BSON.BSON_INT32_MAX = 0x7FFFFFFF; -BSON.BSON_INT32_MIN = -0x80000000; - -BSON.BSON_INT64_MAX = Math.pow(2, 63) - 1; -BSON.BSON_INT64_MIN = -Math.pow(2, 63); - -// JS MAX PRECISE VALUES -BSON.JS_INT_MAX = 0x20000000000000; // Any integer up to 2^53 can be precisely represented by a double. -BSON.JS_INT_MIN = -0x20000000000000; // Any integer down to -2^53 can be precisely represented by a double. - -// Internal long versions -var JS_INT_MAX_LONG = Long.fromNumber(0x20000000000000); // Any integer up to 2^53 can be precisely represented by a double. -var JS_INT_MIN_LONG = Long.fromNumber(-0x20000000000000); // Any integer down to -2^53 can be precisely represented by a double. - -/** - * Number BSON Type - * - * @classconstant BSON_DATA_NUMBER - **/ -BSON.BSON_DATA_NUMBER = 1; -/** - * String BSON Type - * - * @classconstant BSON_DATA_STRING - **/ -BSON.BSON_DATA_STRING = 2; -/** - * Object BSON Type - * - * @classconstant BSON_DATA_OBJECT - **/ -BSON.BSON_DATA_OBJECT = 3; -/** - * Array BSON Type - * - * @classconstant BSON_DATA_ARRAY - **/ -BSON.BSON_DATA_ARRAY = 4; -/** - * Binary BSON Type - * - * @classconstant BSON_DATA_BINARY - **/ -BSON.BSON_DATA_BINARY = 5; -/** - * ObjectID BSON Type - * - * @classconstant BSON_DATA_OID - **/ -BSON.BSON_DATA_OID = 7; -/** - * Boolean BSON Type - * - * @classconstant BSON_DATA_BOOLEAN - **/ -BSON.BSON_DATA_BOOLEAN = 8; -/** - * Date BSON Type - * - * @classconstant BSON_DATA_DATE - **/ -BSON.BSON_DATA_DATE = 9; -/** - * null BSON Type - * - * @classconstant BSON_DATA_NULL - **/ -BSON.BSON_DATA_NULL = 10; -/** - * RegExp BSON Type - * - * @classconstant BSON_DATA_REGEXP - **/ -BSON.BSON_DATA_REGEXP = 11; -/** - * Code BSON Type - * - * @classconstant BSON_DATA_CODE - **/ -BSON.BSON_DATA_CODE = 13; -/** - * Symbol BSON Type - * - * @classconstant BSON_DATA_SYMBOL - **/ -BSON.BSON_DATA_SYMBOL = 14; -/** - * Code with Scope BSON Type - * - * @classconstant BSON_DATA_CODE_W_SCOPE - **/ -BSON.BSON_DATA_CODE_W_SCOPE = 15; -/** - * 32 bit Integer BSON Type - * - * @classconstant BSON_DATA_INT - **/ -BSON.BSON_DATA_INT = 16; -/** - * Timestamp BSON Type - * - * @classconstant BSON_DATA_TIMESTAMP - **/ -BSON.BSON_DATA_TIMESTAMP = 17; -/** - * Long BSON Type - * - * @classconstant BSON_DATA_LONG - **/ -BSON.BSON_DATA_LONG = 18; -/** - * MinKey BSON Type - * - * @classconstant BSON_DATA_MIN_KEY - **/ -BSON.BSON_DATA_MIN_KEY = 0xff; -/** - * MaxKey BSON Type - * - * @classconstant BSON_DATA_MAX_KEY - **/ -BSON.BSON_DATA_MAX_KEY = 0x7f; - -/** - * Binary Default Type - * - * @classconstant BSON_BINARY_SUBTYPE_DEFAULT - **/ -BSON.BSON_BINARY_SUBTYPE_DEFAULT = 0; -/** - * Binary Function Type - * - * @classconstant BSON_BINARY_SUBTYPE_FUNCTION - **/ -BSON.BSON_BINARY_SUBTYPE_FUNCTION = 1; -/** - * Binary Byte Array Type - * - * @classconstant BSON_BINARY_SUBTYPE_BYTE_ARRAY - **/ -BSON.BSON_BINARY_SUBTYPE_BYTE_ARRAY = 2; -/** - * Binary UUID Type - * - * @classconstant BSON_BINARY_SUBTYPE_UUID - **/ -BSON.BSON_BINARY_SUBTYPE_UUID = 3; -/** - * Binary MD5 Type - * - * @classconstant BSON_BINARY_SUBTYPE_MD5 - **/ -BSON.BSON_BINARY_SUBTYPE_MD5 = 4; -/** - * Binary User Defined Type - * - * @classconstant BSON_BINARY_SUBTYPE_USER_DEFINED - **/ -BSON.BSON_BINARY_SUBTYPE_USER_DEFINED = 128; - -/** - * Calculate the bson size for a passed in Javascript object. - * - * @param {Object} object the Javascript object to calculate the BSON byte size for. - * @param {Boolean} [serializeFunctions] serialize all functions in the object **(default:false)**. - * @return {Number} returns the number of bytes the BSON object will take up. - * @api public - */ -BSON.calculateObjectSize = function calculateObjectSize(object, serializeFunctions) { - var totalLength = (4 + 1); - - if(Array.isArray(object)) { - for(var i = 0; i < object.length; i++) { - totalLength += calculateElement(i.toString(), object[i], serializeFunctions) - } - } else { - // If we have toBSON defined, override the current object - if(object.toBSON) { - object = object.toBSON(); - } - - // Calculate size - for(var key in object) { - totalLength += calculateElement(key, object[key], serializeFunctions) - } - } - - return totalLength; -} - -/** - * @ignore - * @api private - */ -function calculateElement(name, value, serializeFunctions) { - var isBuffer = typeof Buffer !== 'undefined'; - - switch(typeof value) { - case 'string': - return 1 + (!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1 + 4 + (!isBuffer ? numberOfBytes(value) : Buffer.byteLength(value, 'utf8')) + 1; - case 'number': - if(Math.floor(value) === value && value >= BSON.JS_INT_MIN && value <= BSON.JS_INT_MAX) { - if(value >= BSON.BSON_INT32_MIN && value <= BSON.BSON_INT32_MAX) { // 32 bit - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + (4 + 1); - } else { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + (8 + 1); - } - } else { // 64 bit - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + (8 + 1); - } - case 'undefined': - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + (1); - case 'boolean': - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + (1 + 1); - case 'object': - if(value == null || value instanceof MinKey || value instanceof MaxKey || value['_bsontype'] == 'MinKey' || value['_bsontype'] == 'MaxKey') { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + (1); - } else if(value instanceof ObjectID || value['_bsontype'] == 'ObjectID') { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + (12 + 1); - } else if(value instanceof Date || isDate(value)) { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + (8 + 1); - } else if(typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + (1 + 4 + 1) + value.length; - } else if(value instanceof Long || value instanceof Double || value instanceof Timestamp - || value['_bsontype'] == 'Long' || value['_bsontype'] == 'Double' || value['_bsontype'] == 'Timestamp') { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + (8 + 1); - } else if(value instanceof Code || value['_bsontype'] == 'Code') { - // Calculate size depending on the availability of a scope - if(value.scope != null && Object.keys(value.scope).length > 0) { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + 1 + 4 + 4 + (!isBuffer ? numberOfBytes(value.code.toString()) : Buffer.byteLength(value.code.toString(), 'utf8')) + 1 + BSON.calculateObjectSize(value.scope, serializeFunctions); - } else { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + 1 + 4 + (!isBuffer ? numberOfBytes(value.code.toString()) : Buffer.byteLength(value.code.toString(), 'utf8')) + 1; - } - } else if(value instanceof Binary || value['_bsontype'] == 'Binary') { - // Check what kind of subtype we have - if(value.sub_type == Binary.SUBTYPE_BYTE_ARRAY) { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + (value.position + 1 + 4 + 1 + 4); - } else { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + (value.position + 1 + 4 + 1); - } - } else if(value instanceof Symbol || value['_bsontype'] == 'Symbol') { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + ((!isBuffer ? numberOfBytes(value.value) : Buffer.byteLength(value.value, 'utf8')) + 4 + 1 + 1); - } else if(value instanceof DBRef || value['_bsontype'] == 'DBRef') { - // Set up correct object for serialization - var ordered_values = { - '$ref': value.namespace - , '$id' : value.oid - }; - - // Add db reference if it exists - if(null != value.db) { - ordered_values['$db'] = value.db; - } - - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + 1 + BSON.calculateObjectSize(ordered_values, serializeFunctions); - } else if(value instanceof RegExp || Object.prototype.toString.call(value) === '[object RegExp]') { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + 1 + (!isBuffer ? numberOfBytes(value.source) : Buffer.byteLength(value.source, 'utf8')) + 1 - + (value.global ? 1 : 0) + (value.ignoreCase ? 1 : 0) + (value.multiline ? 1 : 0) + 1 - } else { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + BSON.calculateObjectSize(value, serializeFunctions) + 1; - } - case 'function': - // WTF for 0.4.X where typeof /someregexp/ === 'function' - if(value instanceof RegExp || Object.prototype.toString.call(value) === '[object RegExp]' || String.call(value) == '[object RegExp]') { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + 1 + (!isBuffer ? numberOfBytes(value.source) : Buffer.byteLength(value.source, 'utf8')) + 1 - + (value.global ? 1 : 0) + (value.ignoreCase ? 1 : 0) + (value.multiline ? 1 : 0) + 1 - } else { - if(serializeFunctions && value.scope != null && Object.keys(value.scope).length > 0) { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + 1 + 4 + 4 + (!isBuffer ? numberOfBytes(value.toString()) : Buffer.byteLength(value.toString(), 'utf8')) + 1 + BSON.calculateObjectSize(value.scope, serializeFunctions); - } else if(serializeFunctions) { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + 1 + 4 + (!isBuffer ? numberOfBytes(value.toString()) : Buffer.byteLength(value.toString(), 'utf8')) + 1; - } - } - } - - return 0; -} - -/** - * Serialize a Javascript object using a predefined Buffer and index into the buffer, useful when pre-allocating the space for serialization. - * - * @param {Object} object the Javascript object to serialize. - * @param {Boolean} checkKeys the serializer will check if keys are valid. - * @param {Buffer} buffer the Buffer you pre-allocated to store the serialized BSON object. - * @param {Number} index the index in the buffer where we wish to start serializing into. - * @param {Boolean} serializeFunctions serialize the javascript functions **(default:false)**. - * @return {Number} returns the new write index in the Buffer. - * @api public - */ -BSON.serializeWithBufferAndIndex = function serializeWithBufferAndIndex(object, checkKeys, buffer, index, serializeFunctions) { - // Default setting false - serializeFunctions = serializeFunctions == null ? false : serializeFunctions; - // Write end information (length of the object) - var size = buffer.length; - // Write the size of the object - buffer[index++] = size & 0xff; - buffer[index++] = (size >> 8) & 0xff; - buffer[index++] = (size >> 16) & 0xff; - buffer[index++] = (size >> 24) & 0xff; - return serializeObject(object, checkKeys, buffer, index, serializeFunctions) - 1; -} - -/** - * @ignore - * @api private - */ -var serializeObject = function(object, checkKeys, buffer, index, serializeFunctions) { - // Process the object - if(Array.isArray(object)) { - for(var i = 0; i < object.length; i++) { - index = packElement(i.toString(), object[i], checkKeys, buffer, index, serializeFunctions); - } - } else { - // If we have toBSON defined, override the current object - if(object.toBSON) { - object = object.toBSON(); - } - - // Serialize the object - for(var key in object) { - // Check the key and throw error if it's illegal - if(checkKeys == true && (key != '$db' && key != '$ref' && key != '$id')) { - BSON.checkKey(key); - } - - // Pack the element - index = packElement(key, object[key], checkKeys, buffer, index, serializeFunctions); - } - } - - // Write zero - buffer[index++] = 0; - return index; -} - -var stringToBytes = function(str) { - var ch, st, re = []; - for (var i = 0; i < str.length; i++ ) { - ch = str.charCodeAt(i); // get char - st = []; // set up "stack" - do { - st.push( ch & 0xFF ); // push byte to stack - ch = ch >> 8; // shift value down by 1 byte - } - while ( ch ); - // add stack contents to result - // done because chars have "wrong" endianness - re = re.concat( st.reverse() ); - } - // return an array of bytes - return re; -} - -var numberOfBytes = function(str) { - var ch, st, re = 0; - for (var i = 0; i < str.length; i++ ) { - ch = str.charCodeAt(i); // get char - st = []; // set up "stack" - do { - st.push( ch & 0xFF ); // push byte to stack - ch = ch >> 8; // shift value down by 1 byte - } - while ( ch ); - // add stack contents to result - // done because chars have "wrong" endianness - re = re + st.length; - } - // return an array of bytes - return re; -} - -/** - * @ignore - * @api private - */ -var writeToTypedArray = function(buffer, string, index) { - var bytes = stringToBytes(string); - for(var i = 0; i < bytes.length; i++) { - buffer[index + i] = bytes[i]; - } - return bytes.length; -} - -/** - * @ignore - * @api private - */ -var supportsBuffer = typeof Buffer != 'undefined'; - -/** - * @ignore - * @api private - */ -var packElement = function(name, value, checkKeys, buffer, index, serializeFunctions) { - var startIndex = index; - - switch(typeof value) { - case 'string': - // Encode String type - buffer[index++] = BSON.BSON_DATA_STRING; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - - // Calculate size - var size = supportsBuffer ? Buffer.byteLength(value) + 1 : numberOfBytes(value) + 1; - // Write the size of the string to buffer - buffer[index + 3] = (size >> 24) & 0xff; - buffer[index + 2] = (size >> 16) & 0xff; - buffer[index + 1] = (size >> 8) & 0xff; - buffer[index] = size & 0xff; - // Ajust the index - index = index + 4; - // Write the string - supportsBuffer ? buffer.write(value, index, 'utf8') : writeToTypedArray(buffer, value, index); - // Update index - index = index + size - 1; - // Write zero - buffer[index++] = 0; - // Return index - return index; - case 'number': - // We have an integer value - if(Math.floor(value) === value && value >= BSON.JS_INT_MIN && value <= BSON.JS_INT_MAX) { - // If the value fits in 32 bits encode as int, if it fits in a double - // encode it as a double, otherwise long - if(value >= BSON.BSON_INT32_MIN && value <= BSON.BSON_INT32_MAX) { - // Set int type 32 bits or less - buffer[index++] = BSON.BSON_DATA_INT; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Write the int value - buffer[index++] = value & 0xff; - buffer[index++] = (value >> 8) & 0xff; - buffer[index++] = (value >> 16) & 0xff; - buffer[index++] = (value >> 24) & 0xff; - } else if(value >= BSON.JS_INT_MIN && value <= BSON.JS_INT_MAX) { - // Encode as double - buffer[index++] = BSON.BSON_DATA_NUMBER; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Write float - writeIEEE754(buffer, value, index, 'little', 52, 8); - // Ajust index - index = index + 8; - } else { - // Set long type - buffer[index++] = BSON.BSON_DATA_LONG; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - var longVal = Long.fromNumber(value); - var lowBits = longVal.getLowBits(); - var highBits = longVal.getHighBits(); - // Encode low bits - buffer[index++] = lowBits & 0xff; - buffer[index++] = (lowBits >> 8) & 0xff; - buffer[index++] = (lowBits >> 16) & 0xff; - buffer[index++] = (lowBits >> 24) & 0xff; - // Encode high bits - buffer[index++] = highBits & 0xff; - buffer[index++] = (highBits >> 8) & 0xff; - buffer[index++] = (highBits >> 16) & 0xff; - buffer[index++] = (highBits >> 24) & 0xff; - } - } else { - // Encode as double - buffer[index++] = BSON.BSON_DATA_NUMBER; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Write float - writeIEEE754(buffer, value, index, 'little', 52, 8); - // Ajust index - index = index + 8; - } - - return index; - case 'undefined': - // Set long type - buffer[index++] = BSON.BSON_DATA_NULL; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - return index; - case 'boolean': - // Write the type - buffer[index++] = BSON.BSON_DATA_BOOLEAN; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Encode the boolean value - buffer[index++] = value ? 1 : 0; - return index; - case 'object': - if(value === null || value instanceof MinKey || value instanceof MaxKey - || value['_bsontype'] == 'MinKey' || value['_bsontype'] == 'MaxKey') { - // Write the type of either min or max key - if(value === null) { - buffer[index++] = BSON.BSON_DATA_NULL; - } else if(value instanceof MinKey) { - buffer[index++] = BSON.BSON_DATA_MIN_KEY; - } else { - buffer[index++] = BSON.BSON_DATA_MAX_KEY; - } - - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - return index; - } else if(value instanceof ObjectID || value['_bsontype'] == 'ObjectID') { - // Write the type - buffer[index++] = BSON.BSON_DATA_OID; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - - // Write objectid - supportsBuffer ? buffer.write(value.id, index, 'binary') : writeToTypedArray(buffer, value.id, index); - // Ajust index - index = index + 12; - return index; - } else if(value instanceof Date || isDate(value)) { - // Write the type - buffer[index++] = BSON.BSON_DATA_DATE; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - - // Write the date - var dateInMilis = Long.fromNumber(value.getTime()); - var lowBits = dateInMilis.getLowBits(); - var highBits = dateInMilis.getHighBits(); - // Encode low bits - buffer[index++] = lowBits & 0xff; - buffer[index++] = (lowBits >> 8) & 0xff; - buffer[index++] = (lowBits >> 16) & 0xff; - buffer[index++] = (lowBits >> 24) & 0xff; - // Encode high bits - buffer[index++] = highBits & 0xff; - buffer[index++] = (highBits >> 8) & 0xff; - buffer[index++] = (highBits >> 16) & 0xff; - buffer[index++] = (highBits >> 24) & 0xff; - return index; - } else if(typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) { - // Write the type - buffer[index++] = BSON.BSON_DATA_BINARY; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Get size of the buffer (current write point) - var size = value.length; - // Write the size of the string to buffer - buffer[index++] = size & 0xff; - buffer[index++] = (size >> 8) & 0xff; - buffer[index++] = (size >> 16) & 0xff; - buffer[index++] = (size >> 24) & 0xff; - // Write the default subtype - buffer[index++] = BSON.BSON_BINARY_SUBTYPE_DEFAULT; - // Copy the content form the binary field to the buffer - value.copy(buffer, index, 0, size); - // Adjust the index - index = index + size; - return index; - } else if(value instanceof Long || value instanceof Timestamp || value['_bsontype'] == 'Long' || value['_bsontype'] == 'Timestamp') { - // Write the type - buffer[index++] = value instanceof Long ? BSON.BSON_DATA_LONG : BSON.BSON_DATA_TIMESTAMP; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Write the date - var lowBits = value.getLowBits(); - var highBits = value.getHighBits(); - // Encode low bits - buffer[index++] = lowBits & 0xff; - buffer[index++] = (lowBits >> 8) & 0xff; - buffer[index++] = (lowBits >> 16) & 0xff; - buffer[index++] = (lowBits >> 24) & 0xff; - // Encode high bits - buffer[index++] = highBits & 0xff; - buffer[index++] = (highBits >> 8) & 0xff; - buffer[index++] = (highBits >> 16) & 0xff; - buffer[index++] = (highBits >> 24) & 0xff; - return index; - } else if(value instanceof Double || value['_bsontype'] == 'Double') { - // Encode as double - buffer[index++] = BSON.BSON_DATA_NUMBER; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Write float - writeIEEE754(buffer, value, index, 'little', 52, 8); - // Ajust index - index = index + 8; - return index; - } else if(value instanceof Code || value['_bsontype'] == 'Code') { - if(value.scope != null && Object.keys(value.scope).length > 0) { - // Write the type - buffer[index++] = BSON.BSON_DATA_CODE_W_SCOPE; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Calculate the scope size - var scopeSize = BSON.calculateObjectSize(value.scope, serializeFunctions); - // Function string - var functionString = value.code.toString(); - // Function Size - var codeSize = supportsBuffer ? Buffer.byteLength(functionString) + 1 : numberOfBytes(functionString) + 1; - - // Calculate full size of the object - var totalSize = 4 + codeSize + scopeSize + 4; - - // Write the total size of the object - buffer[index++] = totalSize & 0xff; - buffer[index++] = (totalSize >> 8) & 0xff; - buffer[index++] = (totalSize >> 16) & 0xff; - buffer[index++] = (totalSize >> 24) & 0xff; - - // Write the size of the string to buffer - buffer[index++] = codeSize & 0xff; - buffer[index++] = (codeSize >> 8) & 0xff; - buffer[index++] = (codeSize >> 16) & 0xff; - buffer[index++] = (codeSize >> 24) & 0xff; - - // Write the string - supportsBuffer ? buffer.write(functionString, index, 'utf8') : writeToTypedArray(buffer, functionString, index); - // Update index - index = index + codeSize - 1; - // Write zero - buffer[index++] = 0; - // Serialize the scope object - var scopeObjectBuffer = supportsBuffer ? new Buffer(scopeSize) : new Uint8Array(new ArrayBuffer(scopeSize)); - // Execute the serialization into a seperate buffer - serializeObject(value.scope, checkKeys, scopeObjectBuffer, 0, serializeFunctions); - - // Adjusted scope Size (removing the header) - var scopeDocSize = scopeSize; - // Write scope object size - buffer[index++] = scopeDocSize & 0xff; - buffer[index++] = (scopeDocSize >> 8) & 0xff; - buffer[index++] = (scopeDocSize >> 16) & 0xff; - buffer[index++] = (scopeDocSize >> 24) & 0xff; - - // Write the scopeObject into the buffer - supportsBuffer ? scopeObjectBuffer.copy(buffer, index, 0, scopeSize) : buffer.set(scopeObjectBuffer, index); - // Adjust index, removing the empty size of the doc (5 bytes 0000000005) - index = index + scopeDocSize - 5; - // Write trailing zero - buffer[index++] = 0; - return index - } else { - buffer[index++] = BSON.BSON_DATA_CODE; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Function string - var functionString = value.code.toString(); - // Function Size - var size = supportsBuffer ? Buffer.byteLength(functionString) + 1 : numberOfBytes(functionString) + 1; - // Write the size of the string to buffer - buffer[index++] = size & 0xff; - buffer[index++] = (size >> 8) & 0xff; - buffer[index++] = (size >> 16) & 0xff; - buffer[index++] = (size >> 24) & 0xff; - // Write the string - buffer.write(functionString, index, 'utf8'); - // Update index - index = index + size - 1; - // Write zero - buffer[index++] = 0; - return index; - } - } else if(value instanceof Binary || value['_bsontype'] == 'Binary') { - // Write the type - buffer[index++] = BSON.BSON_DATA_BINARY; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Extract the buffer - var data = value.value(true); - // Calculate size - var size = value.position; - // Write the size of the string to buffer - buffer[index++] = size & 0xff; - buffer[index++] = (size >> 8) & 0xff; - buffer[index++] = (size >> 16) & 0xff; - buffer[index++] = (size >> 24) & 0xff; - // Write the subtype to the buffer - buffer[index++] = value.sub_type; - - // If we have binary type 2 the 4 first bytes are the size - if(value.sub_type == Binary.SUBTYPE_BYTE_ARRAY) { - buffer[index++] = size & 0xff; - buffer[index++] = (size >> 8) & 0xff; - buffer[index++] = (size >> 16) & 0xff; - buffer[index++] = (size >> 24) & 0xff; - } - - // Write the data to the object - supportsBuffer ? data.copy(buffer, index, 0, value.position) : buffer.set(data, index); - // Ajust index - index = index + value.position; - return index; - } else if(value instanceof Symbol || value['_bsontype'] == 'Symbol') { - // Write the type - buffer[index++] = BSON.BSON_DATA_SYMBOL; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Calculate size - var size = supportsBuffer ? Buffer.byteLength(value.value) + 1 : numberOfBytes(value.value) + 1; - // Write the size of the string to buffer - buffer[index++] = size & 0xff; - buffer[index++] = (size >> 8) & 0xff; - buffer[index++] = (size >> 16) & 0xff; - buffer[index++] = (size >> 24) & 0xff; - // Write the string - buffer.write(value.value, index, 'utf8'); - // Update index - index = index + size - 1; - // Write zero - buffer[index++] = 0x00; - return index; - } else if(value instanceof DBRef || value['_bsontype'] == 'DBRef') { - // Write the type - buffer[index++] = BSON.BSON_DATA_OBJECT; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Set up correct object for serialization - var ordered_values = { - '$ref': value.namespace - , '$id' : value.oid - }; - - // Add db reference if it exists - if(null != value.db) { - ordered_values['$db'] = value.db; - } - - // Message size - var size = BSON.calculateObjectSize(ordered_values, serializeFunctions); - // Serialize the object - var endIndex = BSON.serializeWithBufferAndIndex(ordered_values, checkKeys, buffer, index, serializeFunctions); - // Write the size of the string to buffer - buffer[index++] = size & 0xff; - buffer[index++] = (size >> 8) & 0xff; - buffer[index++] = (size >> 16) & 0xff; - buffer[index++] = (size >> 24) & 0xff; - // Write zero for object - buffer[endIndex++] = 0x00; - // Return the end index - return endIndex; - } else if(value instanceof RegExp || Object.prototype.toString.call(value) === '[object RegExp]') { - // Write the type - buffer[index++] = BSON.BSON_DATA_REGEXP; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - - // Write the regular expression string - supportsBuffer ? buffer.write(value.source, index, 'utf8') : writeToTypedArray(buffer, value.source, index); - // Adjust the index - index = index + (supportsBuffer ? Buffer.byteLength(value.source) : numberOfBytes(value.source)); - // Write zero - buffer[index++] = 0x00; - // Write the parameters - if(value.global) buffer[index++] = 0x73; // s - if(value.ignoreCase) buffer[index++] = 0x69; // i - if(value.multiline) buffer[index++] = 0x6d; // m - // Add ending zero - buffer[index++] = 0x00; - return index; - } else { - // Write the type - buffer[index++] = Array.isArray(value) ? BSON.BSON_DATA_ARRAY : BSON.BSON_DATA_OBJECT; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Adjust the index - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - var endIndex = serializeObject(value, checkKeys, buffer, index + 4, serializeFunctions); - // Write size - var size = endIndex - index; - // Write the size of the string to buffer - buffer[index++] = size & 0xff; - buffer[index++] = (size >> 8) & 0xff; - buffer[index++] = (size >> 16) & 0xff; - buffer[index++] = (size >> 24) & 0xff; - return endIndex; - } - case 'function': - // WTF for 0.4.X where typeof /someregexp/ === 'function' - if(value instanceof RegExp || Object.prototype.toString.call(value) === '[object RegExp]' || String.call(value) == '[object RegExp]') { - // Write the type - buffer[index++] = BSON.BSON_DATA_REGEXP; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - - // Write the regular expression string - buffer.write(value.source, index, 'utf8'); - // Adjust the index - index = index + (supportsBuffer ? Buffer.byteLength(value.source) : numberOfBytes(value.source)); - // Write zero - buffer[index++] = 0x00; - // Write the parameters - if(value.global) buffer[index++] = 0x73; // s - if(value.ignoreCase) buffer[index++] = 0x69; // i - if(value.multiline) buffer[index++] = 0x6d; // m - // Add ending zero - buffer[index++] = 0x00; - return index; - } else { - if(serializeFunctions && value.scope != null && Object.keys(value.scope).length > 0) { - // Write the type - buffer[index++] = BSON.BSON_DATA_CODE_W_SCOPE; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Calculate the scope size - var scopeSize = BSON.calculateObjectSize(value.scope, serializeFunctions); - // Function string - var functionString = value.toString(); - // Function Size - var codeSize = supportsBuffer ? Buffer.byteLength(functionString) + 1 : numberOfBytes(functionString) + 1; - - // Calculate full size of the object - var totalSize = 4 + codeSize + scopeSize; - - // Write the total size of the object - buffer[index++] = totalSize & 0xff; - buffer[index++] = (totalSize >> 8) & 0xff; - buffer[index++] = (totalSize >> 16) & 0xff; - buffer[index++] = (totalSize >> 24) & 0xff; - - // Write the size of the string to buffer - buffer[index++] = codeSize & 0xff; - buffer[index++] = (codeSize >> 8) & 0xff; - buffer[index++] = (codeSize >> 16) & 0xff; - buffer[index++] = (codeSize >> 24) & 0xff; - - // Write the string - buffer.write(functionString, index, 'utf8'); - // Update index - index = index + codeSize - 1; - // Write zero - buffer[index++] = 0; - // Serialize the scope object - var scopeObjectBuffer = new Buffer(scopeSize); - // Execute the serialization into a seperate buffer - serializeObject(value.scope, checkKeys, scopeObjectBuffer, 0, serializeFunctions); - - // Adjusted scope Size (removing the header) - var scopeDocSize = scopeSize - 4; - // Write scope object size - buffer[index++] = scopeDocSize & 0xff; - buffer[index++] = (scopeDocSize >> 8) & 0xff; - buffer[index++] = (scopeDocSize >> 16) & 0xff; - buffer[index++] = (scopeDocSize >> 24) & 0xff; - - // Write the scopeObject into the buffer - scopeObjectBuffer.copy(buffer, index, 0, scopeSize); - - // Adjust index, removing the empty size of the doc (5 bytes 0000000005) - index = index + scopeDocSize - 5; - // Write trailing zero - buffer[index++] = 0; - return index - } else if(serializeFunctions) { - buffer[index++] = BSON.BSON_DATA_CODE; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Function string - var functionString = value.toString(); - // Function Size - var size = supportsBuffer ? Buffer.byteLength(functionString) + 1 : numberOfBytes(functionString) + 1; - // Write the size of the string to buffer - buffer[index++] = size & 0xff; - buffer[index++] = (size >> 8) & 0xff; - buffer[index++] = (size >> 16) & 0xff; - buffer[index++] = (size >> 24) & 0xff; - // Write the string - buffer.write(functionString, index, 'utf8'); - // Update index - index = index + size - 1; - // Write zero - buffer[index++] = 0; - return index; - } - } - } - - // If no value to serialize - return index; -} - -/** - * Serialize a Javascript object. - * - * @param {Object} object the Javascript object to serialize. - * @param {Boolean} checkKeys the serializer will check if keys are valid. - * @param {Boolean} asBuffer return the serialized object as a Buffer object **(ignore)**. - * @param {Boolean} serializeFunctions serialize the javascript functions **(default:false)**. - * @return {Buffer} returns the Buffer object containing the serialized object. - * @api public - */ -BSON.serialize = function(object, checkKeys, asBuffer, serializeFunctions) { - var buffer = null; - // Calculate the size of the object - var size = BSON.calculateObjectSize(object, serializeFunctions); - // Fetch the best available type for storing the binary data - if(buffer = typeof Buffer != 'undefined') { - buffer = new Buffer(size); - asBuffer = true; - } else if(typeof Uint8Array != 'undefined') { - buffer = new Uint8Array(new ArrayBuffer(size)); - } else { - buffer = new Array(size); - } - - // If asBuffer is false use typed arrays - BSON.serializeWithBufferAndIndex(object, checkKeys, buffer, 0, serializeFunctions); - return buffer; -} - -/** - * Contains the function cache if we have that enable to allow for avoiding the eval step on each deserialization, comparison is by md5 - * - * @ignore - * @api private - */ -var functionCache = BSON.functionCache = {}; - -/** - * Crc state variables shared by function - * - * @ignore - * @api private - */ -var table = [0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D]; - -/** - * CRC32 hash method, Fast and enough versitility for our usage - * - * @ignore - * @api private - */ -var crc32 = function(string, start, end) { - var crc = 0 - var x = 0; - var y = 0; - crc = crc ^ (-1); - - for(var i = start, iTop = end; i < iTop;i++) { - y = (crc ^ string[i]) & 0xFF; - x = table[y]; - crc = (crc >>> 8) ^ x; - } - - return crc ^ (-1); -} - -/** - * Deserialize stream data as BSON documents. - * - * Options - * - **evalFunctions** {Boolean, default:false}, evaluate functions in the BSON document scoped to the object deserialized. - * - **cacheFunctions** {Boolean, default:false}, cache evaluated functions for reuse. - * - **cacheFunctionsCrc32** {Boolean, default:false}, use a crc32 code for caching, otherwise use the string of the function. - * - * @param {Buffer} data the buffer containing the serialized set of BSON documents. - * @param {Number} startIndex the start index in the data Buffer where the deserialization is to start. - * @param {Number} numberOfDocuments number of documents to deserialize. - * @param {Array} documents an array where to store the deserialized documents. - * @param {Number} docStartIndex the index in the documents array from where to start inserting documents. - * @param {Object} [options] additional options used for the deserialization. - * @return {Number} returns the next index in the buffer after deserialization **x** numbers of documents. - * @api public - */ -BSON.deserializeStream = function(data, startIndex, numberOfDocuments, documents, docStartIndex, options) { - // if(numberOfDocuments !== documents.length) throw new Error("Number of expected results back is less than the number of documents"); - options = options != null ? options : {}; - var index = startIndex; - // Loop over all documents - for(var i = 0; i < numberOfDocuments; i++) { - // Find size of the document - var size = data[index] | data[index + 1] << 8 | data[index + 2] << 16 | data[index + 3] << 24; - // Update options with index - options['index'] = index; - // Parse the document at this point - documents[docStartIndex + i] = BSON.deserialize(data, options); - // Adjust index by the document size - index = index + size; - } - - // Return object containing end index of parsing and list of documents - return index; -} - -/** - * Ensure eval is isolated. - * - * @ignore - * @api private - */ -var isolateEvalWithHash = function(functionCache, hash, functionString, object) { - // Contains the value we are going to set - var value = null; - - // Check for cache hit, eval if missing and return cached function - if(functionCache[hash] == null) { - eval("value = " + functionString); - functionCache[hash] = value; - } - // Set the object - return functionCache[hash].bind(object); -} - -/** - * Ensure eval is isolated. - * - * @ignore - * @api private - */ -var isolateEval = function(functionString) { - // Contains the value we are going to set - var value = null; - // Eval the function - eval("value = " + functionString); - return value; -} - -/** - * Convert Uint8Array to String - * - * @ignore - * @api private - */ -var convertUint8ArrayToUtf8String = function(byteArray, startIndex, endIndex) { - return BinaryParser.decode_utf8(convertArraytoUtf8BinaryString(byteArray, startIndex, endIndex)); -} - -var convertArraytoUtf8BinaryString = function(byteArray, startIndex, endIndex) { - var result = ""; - for(var i = startIndex; i < endIndex; i++) { - result = result + String.fromCharCode(byteArray[i]); - } - - return result; -}; - -/** - * Deserialize data as BSON. - * - * Options - * - **evalFunctions** {Boolean, default:false}, evaluate functions in the BSON document scoped to the object deserialized. - * - **cacheFunctions** {Boolean, default:false}, cache evaluated functions for reuse. - * - **cacheFunctionsCrc32** {Boolean, default:false}, use a crc32 code for caching, otherwise use the string of the function. - * - * @param {Buffer} buffer the buffer containing the serialized set of BSON documents. - * @param {Object} [options] additional options used for the deserialization. - * @param {Boolean} [isArray] ignore used for recursive parsing. - * @return {Object} returns the deserialized Javascript Object. - * @api public - */ -BSON.deserialize = function(buffer, options, isArray) { - // Options - options = options == null ? {} : options; - var evalFunctions = options['evalFunctions'] == null ? false : options['evalFunctions']; - var cacheFunctions = options['cacheFunctions'] == null ? false : options['cacheFunctions']; - var cacheFunctionsCrc32 = options['cacheFunctionsCrc32'] == null ? false : options['cacheFunctionsCrc32']; - - // Validate that we have at least 4 bytes of buffer - if(buffer.length < 5) throw new Error("corrupt bson message < 5 bytes long"); - - // Set up index - var index = typeof options['index'] == 'number' ? options['index'] : 0; - // Reads in a C style string - var readCStyleString = function() { - // Get the start search index - var i = index; - // Locate the end of the c string - while(buffer[i] !== 0x00) { i++ } - // Grab utf8 encoded string - var string = supportsBuffer && Buffer.isBuffer(buffer) ? buffer.toString('utf8', index, i) : convertUint8ArrayToUtf8String(buffer, index, i); - // Update index position - index = i + 1; - // Return string - return string; - } - - // Create holding object - var object = isArray ? [] : {}; - - // Read the document size - var size = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - - // Ensure buffer is valid size - if(size < 5 || size > buffer.length) throw new Error("corrupt bson message"); - - // While we have more left data left keep parsing - while(true) { - // Read the type - var elementType = buffer[index++]; - // If we get a zero it's the last byte, exit - if(elementType == 0) break; - // Read the name of the field - var name = readCStyleString(); - // Switch on the type - switch(elementType) { - case BSON.BSON_DATA_OID: - var string = supportsBuffer && Buffer.isBuffer(buffer) ? buffer.toString('binary', index, index + 12) : convertArraytoUtf8BinaryString(buffer, index, index + 12); - // Decode the oid - object[name] = new ObjectID(string); - // Update index - index = index + 12; - break; - case BSON.BSON_DATA_STRING: - // Read the content of the field - var stringSize = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - // Add string to object - object[name] = supportsBuffer && Buffer.isBuffer(buffer) ? buffer.toString('utf8', index, index + stringSize - 1) : convertUint8ArrayToUtf8String(buffer, index, index + stringSize - 1); - // Update parse index position - index = index + stringSize; - break; - case BSON.BSON_DATA_INT: - // Decode the 32bit value - object[name] = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - break; - case BSON.BSON_DATA_NUMBER: - // Decode the double value - object[name] = readIEEE754(buffer, index, 'little', 52, 8); - // Update the index - index = index + 8; - break; - case BSON.BSON_DATA_DATE: - // Unpack the low and high bits - var lowBits = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - var highBits = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - // Set date object - object[name] = new Date(new Long(lowBits, highBits).toNumber()); - break; - case BSON.BSON_DATA_BOOLEAN: - // Parse the boolean value - object[name] = buffer[index++] == 1; - break; - case BSON.BSON_DATA_NULL: - // Parse the boolean value - object[name] = null; - break; - case BSON.BSON_DATA_BINARY: - // Decode the size of the binary blob - var binarySize = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - // Decode the subtype - var subType = buffer[index++]; - // Decode as raw Buffer object if options specifies it - if(buffer['slice'] != null) { - // If we have subtype 2 skip the 4 bytes for the size - if(subType == Binary.SUBTYPE_BYTE_ARRAY) { - binarySize = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - } - // Slice the data - object[name] = new Binary(buffer.slice(index, index + binarySize), subType); - } else { - var _buffer = typeof Uint8Array != 'undefined' ? new Uint8Array(new ArrayBuffer(binarySize)) : new Array(binarySize); - // If we have subtype 2 skip the 4 bytes for the size - if(subType == Binary.SUBTYPE_BYTE_ARRAY) { - binarySize = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - } - // Copy the data - for(var i = 0; i < binarySize; i++) { - _buffer[i] = buffer[index + i]; - } - // Create the binary object - object[name] = new Binary(_buffer, subType); - } - // Update the index - index = index + binarySize; - break; - case BSON.BSON_DATA_ARRAY: - options['index'] = index; - // Decode the size of the array document - var objectSize = buffer[index] | buffer[index + 1] << 8 | buffer[index + 2] << 16 | buffer[index + 3] << 24; - // Set the array to the object - object[name] = BSON.deserialize(buffer, options, true); - // Adjust the index - index = index + objectSize; - break; - case BSON.BSON_DATA_OBJECT: - options['index'] = index; - // Decode the size of the object document - var objectSize = buffer[index] | buffer[index + 1] << 8 | buffer[index + 2] << 16 | buffer[index + 3] << 24; - // Set the array to the object - object[name] = BSON.deserialize(buffer, options, false); - // Adjust the index - index = index + objectSize; - break; - case BSON.BSON_DATA_REGEXP: - // Create the regexp - var source = readCStyleString(); - var regExpOptions = readCStyleString(); - // For each option add the corresponding one for javascript - var optionsArray = new Array(regExpOptions.length); - - // Parse options - for(var i = 0; i < regExpOptions.length; i++) { - switch(regExpOptions[i]) { - case 'm': - optionsArray[i] = 'm'; - break; - case 's': - optionsArray[i] = 'g'; - break; - case 'i': - optionsArray[i] = 'i'; - break; - } - } - - object[name] = new RegExp(source, optionsArray.join('')); - break; - case BSON.BSON_DATA_LONG: - // Unpack the low and high bits - var lowBits = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - var highBits = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - // Create long object - var long = new Long(lowBits, highBits); - // Set the object - object[name] = long.lessThanOrEqual(JS_INT_MAX_LONG) && long.greaterThanOrEqual(JS_INT_MIN_LONG) ? long.toNumber() : long; - break; - case BSON.BSON_DATA_SYMBOL: - // Read the content of the field - var stringSize = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - // Add string to object - object[name] = new Symbol(buffer.toString('utf8', index, index + stringSize - 1)); - // Update parse index position - index = index + stringSize; - break; - case BSON.BSON_DATA_TIMESTAMP: - // Unpack the low and high bits - var lowBits = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - var highBits = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - // Set the object - object[name] = new Timestamp(lowBits, highBits); - break; - case BSON.BSON_DATA_MIN_KEY: - // Parse the object - object[name] = new MinKey(); - break; - case BSON.BSON_DATA_MAX_KEY: - // Parse the object - object[name] = new MaxKey(); - break; - case BSON.BSON_DATA_CODE: - // Read the content of the field - var stringSize = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - // Function string - var functionString = supportsBuffer && Buffer.isBuffer(buffer) ? buffer.toString('utf8', index, index + stringSize - 1) : convertUint8ArrayToUtf8String(buffer, index, index + stringSize - 1); - - // If we are evaluating the functions - if(evalFunctions) { - // Contains the value we are going to set - var value = null; - // If we have cache enabled let's look for the md5 of the function in the cache - if(cacheFunctions) { - var hash = cacheFunctionsCrc32 ? crc32(functionString) : functionString; - // Got to do this to avoid V8 deoptimizing the call due to finding eval - object[name] = isolateEvalWithHash(functionCache, hash, functionString, object); - } else { - // Set directly - object[name] = isolateEval(functionString); - } - } else { - object[name] = new Code(functionString, {}); - } - - // Update parse index position - index = index + stringSize; - break; - case BSON.BSON_DATA_CODE_W_SCOPE: - // Read the content of the field - var totalSize = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - var stringSize = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - // Javascript function - var functionString = supportsBuffer && Buffer.isBuffer(buffer) ? buffer.toString('utf8', index, index + stringSize - 1) : convertUint8ArrayToUtf8String(buffer, index, index + stringSize - 1); - // Update parse index position - index = index + stringSize; - // Parse the element - options['index'] = index; - // Decode the size of the object document - var objectSize = buffer[index] | buffer[index + 1] << 8 | buffer[index + 2] << 16 | buffer[index + 3] << 24; - // Decode the scope object - var scopeObject = BSON.deserialize(buffer, options, false); - // Adjust the index - index = index + objectSize; - - // If we are evaluating the functions - if(evalFunctions) { - // Contains the value we are going to set - var value = null; - // If we have cache enabled let's look for the md5 of the function in the cache - if(cacheFunctions) { - var hash = cacheFunctionsCrc32 ? crc32(functionString) : functionString; - // Got to do this to avoid V8 deoptimizing the call due to finding eval - object[name] = isolateEvalWithHash(functionCache, hash, functionString, object); - } else { - // Set directly - object[name] = isolateEval(functionString); - } - - // Set the scope on the object - object[name].scope = scopeObject; - } else { - object[name] = new Code(functionString, scopeObject); - } - - // Add string to object - break; - } - } - - // Check if we have a db ref object - if(object['$id'] != null) object = new DBRef(object['$ref'], object['$id'], object['$db']); - - // Return the final objects - return object; -} - -/** - * Check if key name is valid. - * - * @ignore - * @api private - */ -BSON.checkKey = function checkKey (key) { - if (!key.length) return; - // Check if we have a legal key for the object - if('$' == key[0]) { - throw Error("key " + key + " must not start with '$'"); - } else if (!!~key.indexOf('.')) { - throw Error("key " + key + " must not contain '.'"); - } -}; - -/** - * Deserialize data as BSON. - * - * Options - * - **evalFunctions** {Boolean, default:false}, evaluate functions in the BSON document scoped to the object deserialized. - * - **cacheFunctions** {Boolean, default:false}, cache evaluated functions for reuse. - * - **cacheFunctionsCrc32** {Boolean, default:false}, use a crc32 code for caching, otherwise use the string of the function. - * - * @param {Buffer} buffer the buffer containing the serialized set of BSON documents. - * @param {Object} [options] additional options used for the deserialization. - * @param {Boolean} [isArray] ignore used for recursive parsing. - * @return {Object} returns the deserialized Javascript Object. - * @api public - */ -BSON.prototype.deserialize = function(data, options) { - return BSON.deserialize(data, options); -} - -/** - * Deserialize stream data as BSON documents. - * - * Options - * - **evalFunctions** {Boolean, default:false}, evaluate functions in the BSON document scoped to the object deserialized. - * - **cacheFunctions** {Boolean, default:false}, cache evaluated functions for reuse. - * - **cacheFunctionsCrc32** {Boolean, default:false}, use a crc32 code for caching, otherwise use the string of the function. - * - * @param {Buffer} data the buffer containing the serialized set of BSON documents. - * @param {Number} startIndex the start index in the data Buffer where the deserialization is to start. - * @param {Number} numberOfDocuments number of documents to deserialize. - * @param {Array} documents an array where to store the deserialized documents. - * @param {Number} docStartIndex the index in the documents array from where to start inserting documents. - * @param {Object} [options] additional options used for the deserialization. - * @return {Number} returns the next index in the buffer after deserialization **x** numbers of documents. - * @api public - */ -BSON.prototype.deserializeStream = function(data, startIndex, numberOfDocuments, documents, docStartIndex, options) { - return BSON.deserializeStream(data, startIndex, numberOfDocuments, documents, docStartIndex, options); -} - -/** - * Serialize a Javascript object. - * - * @param {Object} object the Javascript object to serialize. - * @param {Boolean} checkKeys the serializer will check if keys are valid. - * @param {Boolean} asBuffer return the serialized object as a Buffer object **(ignore)**. - * @param {Boolean} serializeFunctions serialize the javascript functions **(default:false)**. - * @return {Buffer} returns the Buffer object containing the serialized object. - * @api public - */ -BSON.prototype.serialize = function(object, checkKeys, asBuffer, serializeFunctions) { - return BSON.serialize(object, checkKeys, asBuffer, serializeFunctions); -} - -/** - * Calculate the bson size for a passed in Javascript object. - * - * @param {Object} object the Javascript object to calculate the BSON byte size for. - * @param {Boolean} [serializeFunctions] serialize all functions in the object **(default:false)**. - * @return {Number} returns the number of bytes the BSON object will take up. - * @api public - */ -BSON.prototype.calculateObjectSize = function(object, serializeFunctions) { - return BSON.calculateObjectSize(object, serializeFunctions); -} - -/** - * Serialize a Javascript object using a predefined Buffer and index into the buffer, useful when pre-allocating the space for serialization. - * - * @param {Object} object the Javascript object to serialize. - * @param {Boolean} checkKeys the serializer will check if keys are valid. - * @param {Buffer} buffer the Buffer you pre-allocated to store the serialized BSON object. - * @param {Number} index the index in the buffer where we wish to start serializing into. - * @param {Boolean} serializeFunctions serialize the javascript functions **(default:false)**. - * @return {Number} returns the new write index in the Buffer. - * @api public - */ -BSON.prototype.serializeWithBufferAndIndex = function(object, checkKeys, buffer, startIndex, serializeFunctions) { - return BSON.serializeWithBufferAndIndex(object, checkKeys, buffer, startIndex, serializeFunctions); -} - -/** - * @ignore - * @api private - */ -exports.Code = Code; -exports.Symbol = Symbol; -exports.BSON = BSON; -exports.DBRef = DBRef; -exports.Binary = Binary; -exports.ObjectID = ObjectID; -exports.Long = Long; -exports.Timestamp = Timestamp; -exports.Double = Double; -exports.MinKey = MinKey; -exports.MaxKey = MaxKey; -}, - - - -'code': function(module, exports, global, require, undefined){ - /** - * A class representation of the BSON Code type. - * - * @class Represents the BSON Code type. - * @param {String|Function} code a string or function. - * @param {Object} [scope] an optional scope for the function. - * @return {Code} - */ -function Code(code, scope) { - if(!(this instanceof Code)) return new Code(code, scope); - - this._bsontype = 'Code'; - this.code = code; - this.scope = scope == null ? {} : scope; -}; - -/** - * @ignore - * @api private - */ -Code.prototype.toJSON = function() { - return {scope:this.scope, code:this.code}; -} - -exports.Code = Code; -}, - - - -'db_ref': function(module, exports, global, require, undefined){ - /** - * A class representation of the BSON DBRef type. - * - * @class Represents the BSON DBRef type. - * @param {String} namespace the collection name. - * @param {ObjectID} oid the reference ObjectID. - * @param {String} [db] optional db name, if omitted the reference is local to the current db. - * @return {DBRef} - */ -function DBRef(namespace, oid, db) { - if(!(this instanceof DBRef)) return new DBRef(namespace, oid, db); - - this._bsontype = 'DBRef'; - this.namespace = namespace; - this.oid = oid; - this.db = db; -}; - -/** - * @ignore - * @api private - */ -DBRef.prototype.toJSON = function() { - return { - '$ref':this.namespace, - '$id':this.oid, - '$db':this.db == null ? '' : this.db - }; -} - -exports.DBRef = DBRef; -}, - - - -'double': function(module, exports, global, require, undefined){ - /** - * A class representation of the BSON Double type. - * - * @class Represents the BSON Double type. - * @param {Number} value the number we want to represent as a double. - * @return {Double} - */ -function Double(value) { - if(!(this instanceof Double)) return new Double(value); - - this._bsontype = 'Double'; - this.value = value; -} - -/** - * Access the number value. - * - * @return {Number} returns the wrapped double number. - * @api public - */ -Double.prototype.valueOf = function() { - return this.value; -}; - -/** - * @ignore - * @api private - */ -Double.prototype.toJSON = function() { - return this.value; -} - -exports.Double = Double; -}, - - - -'float_parser': function(module, exports, global, require, undefined){ - // Copyright (c) 2008, Fair Oaks Labs, Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// * Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// * Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// * Neither the name of Fair Oaks Labs, Inc. nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. -// -// -// Modifications to writeIEEE754 to support negative zeroes made by Brian White - -var readIEEE754 = function(buffer, offset, endian, mLen, nBytes) { - var e, m, - bBE = (endian === 'big'), - eLen = nBytes * 8 - mLen - 1, - eMax = (1 << eLen) - 1, - eBias = eMax >> 1, - nBits = -7, - i = bBE ? 0 : (nBytes - 1), - d = bBE ? 1 : -1, - s = buffer[offset + i]; - - i += d; - - e = s & ((1 << (-nBits)) - 1); - s >>= (-nBits); - nBits += eLen; - for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8); - - m = e & ((1 << (-nBits)) - 1); - e >>= (-nBits); - nBits += mLen; - for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8); - - if (e === 0) { - e = 1 - eBias; - } else if (e === eMax) { - return m ? NaN : ((s ? -1 : 1) * Infinity); - } else { - m = m + Math.pow(2, mLen); - e = e - eBias; - } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen); -}; - -var writeIEEE754 = function(buffer, value, offset, endian, mLen, nBytes) { - var e, m, c, - bBE = (endian === 'big'), - eLen = nBytes * 8 - mLen - 1, - eMax = (1 << eLen) - 1, - eBias = eMax >> 1, - rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0), - i = bBE ? (nBytes-1) : 0, - d = bBE ? -1 : 1, - s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; - - value = Math.abs(value); - - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0; - e = eMax; - } else { - e = Math.floor(Math.log(value) / Math.LN2); - if (value * (c = Math.pow(2, -e)) < 1) { - e--; - c *= 2; - } - if (e+eBias >= 1) { - value += rt / c; - } else { - value += rt * Math.pow(2, 1 - eBias); - } - if (value * c >= 2) { - e++; - c /= 2; - } - - if (e + eBias >= eMax) { - m = 0; - e = eMax; - } else if (e + eBias >= 1) { - m = (value * c - 1) * Math.pow(2, mLen); - e = e + eBias; - } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); - e = 0; - } - } - - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8); - - e = (e << mLen) | m; - eLen += mLen; - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8); - - buffer[offset + i - d] |= s * 128; -}; - -exports.readIEEE754 = readIEEE754; -exports.writeIEEE754 = writeIEEE754; -}, - - - -'index': function(module, exports, global, require, undefined){ - try { - exports.BSONPure = require('./bson'); - exports.BSONNative = require('../../ext'); -} catch(err) { - // do nothing -} - -[ './binary_parser' - , './binary' - , './code' - , './db_ref' - , './double' - , './max_key' - , './min_key' - , './objectid' - , './symbol' - , './timestamp' - , './long'].forEach(function (path) { - var module = require('./' + path); - for (var i in module) { - exports[i] = module[i]; - } -}); - -// Exports all the classes for the NATIVE JS BSON Parser -exports.native = function() { - var classes = {}; - // Map all the classes - [ './binary_parser' - , './binary' - , './code' - , './db_ref' - , './double' - , './max_key' - , './min_key' - , './objectid' - , './symbol' - , './timestamp' - , './long' - , '../../ext' -].forEach(function (path) { - var module = require('./' + path); - for (var i in module) { - classes[i] = module[i]; - } - }); - // Return classes list - return classes; -} - -// Exports all the classes for the PURE JS BSON Parser -exports.pure = function() { - var classes = {}; - // Map all the classes - [ './binary_parser' - , './binary' - , './code' - , './db_ref' - , './double' - , './max_key' - , './min_key' - , './objectid' - , './symbol' - , './timestamp' - , './long' - , '././bson'].forEach(function (path) { - var module = require('./' + path); - for (var i in module) { - classes[i] = module[i]; - } - }); - // Return classes list - return classes; -} - -}, - - - -'long': function(module, exports, global, require, undefined){ - // Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// Copyright 2009 Google Inc. All Rights Reserved - -/** - * Defines a Long class for representing a 64-bit two's-complement - * integer value, which faithfully simulates the behavior of a Java "Long". This - * implementation is derived from LongLib in GWT. - * - * Constructs a 64-bit two's-complement integer, given its low and high 32-bit - * values as *signed* integers. See the from* functions below for more - * convenient ways of constructing Longs. - * - * The internal representation of a Long is the two given signed, 32-bit values. - * We use 32-bit pieces because these are the size of integers on which - * Javascript performs bit-operations. For operations like addition and - * multiplication, we split each number into 16-bit pieces, which can easily be - * multiplied within Javascript's floating-point representation without overflow - * or change in sign. - * - * In the algorithms below, we frequently reduce the negative case to the - * positive case by negating the input(s) and then post-processing the result. - * Note that we must ALWAYS check specially whether those values are MIN_VALUE - * (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as - * a positive number, it overflows back into a negative). Not handling this - * case would often result in infinite recursion. - * - * @class Represents the BSON Long type. - * @param {Number} low the low (signed) 32 bits of the Long. - * @param {Number} high the high (signed) 32 bits of the Long. - */ -function Long(low, high) { - if(!(this instanceof Long)) return new Long(low, high); - - this._bsontype = 'Long'; - /** - * @type {number} - * @api private - */ - this.low_ = low | 0; // force into 32 signed bits. - - /** - * @type {number} - * @api private - */ - this.high_ = high | 0; // force into 32 signed bits. -}; - -/** - * Return the int value. - * - * @return {Number} the value, assuming it is a 32-bit integer. - * @api public - */ -Long.prototype.toInt = function() { - return this.low_; -}; - -/** - * Return the Number value. - * - * @return {Number} the closest floating-point representation to this value. - * @api public - */ -Long.prototype.toNumber = function() { - return this.high_ * Long.TWO_PWR_32_DBL_ + - this.getLowBitsUnsigned(); -}; - -/** - * Return the JSON value. - * - * @return {String} the JSON representation. - * @api public - */ -Long.prototype.toJSON = function() { - return this.toString(); -} - -/** - * Return the String value. - * - * @param {Number} [opt_radix] the radix in which the text should be written. - * @return {String} the textual representation of this value. - * @api public - */ -Long.prototype.toString = function(opt_radix) { - var radix = opt_radix || 10; - if (radix < 2 || 36 < radix) { - throw Error('radix out of range: ' + radix); - } - - if (this.isZero()) { - return '0'; - } - - if (this.isNegative()) { - if (this.equals(Long.MIN_VALUE)) { - // We need to change the Long value before it can be negated, so we remove - // the bottom-most digit in this base and then recurse to do the rest. - var radixLong = Long.fromNumber(radix); - var div = this.div(radixLong); - var rem = div.multiply(radixLong).subtract(this); - return div.toString(radix) + rem.toInt().toString(radix); - } else { - return '-' + this.negate().toString(radix); - } - } - - // Do several (6) digits each time through the loop, so as to - // minimize the calls to the very expensive emulated div. - var radixToPower = Long.fromNumber(Math.pow(radix, 6)); - - var rem = this; - var result = ''; - while (true) { - var remDiv = rem.div(radixToPower); - var intval = rem.subtract(remDiv.multiply(radixToPower)).toInt(); - var digits = intval.toString(radix); - - rem = remDiv; - if (rem.isZero()) { - return digits + result; - } else { - while (digits.length < 6) { - digits = '0' + digits; - } - result = '' + digits + result; - } - } -}; - -/** - * Return the high 32-bits value. - * - * @return {Number} the high 32-bits as a signed value. - * @api public - */ -Long.prototype.getHighBits = function() { - return this.high_; -}; - -/** - * Return the low 32-bits value. - * - * @return {Number} the low 32-bits as a signed value. - * @api public - */ -Long.prototype.getLowBits = function() { - return this.low_; -}; - -/** - * Return the low unsigned 32-bits value. - * - * @return {Number} the low 32-bits as an unsigned value. - * @api public - */ -Long.prototype.getLowBitsUnsigned = function() { - return (this.low_ >= 0) ? - this.low_ : Long.TWO_PWR_32_DBL_ + this.low_; -}; - -/** - * Returns the number of bits needed to represent the absolute value of this Long. - * - * @return {Number} Returns the number of bits needed to represent the absolute value of this Long. - * @api public - */ -Long.prototype.getNumBitsAbs = function() { - if (this.isNegative()) { - if (this.equals(Long.MIN_VALUE)) { - return 64; - } else { - return this.negate().getNumBitsAbs(); - } - } else { - var val = this.high_ != 0 ? this.high_ : this.low_; - for (var bit = 31; bit > 0; bit--) { - if ((val & (1 << bit)) != 0) { - break; - } - } - return this.high_ != 0 ? bit + 33 : bit + 1; - } -}; - -/** - * Return whether this value is zero. - * - * @return {Boolean} whether this value is zero. - * @api public - */ -Long.prototype.isZero = function() { - return this.high_ == 0 && this.low_ == 0; -}; - -/** - * Return whether this value is negative. - * - * @return {Boolean} whether this value is negative. - * @api public - */ -Long.prototype.isNegative = function() { - return this.high_ < 0; -}; - -/** - * Return whether this value is odd. - * - * @return {Boolean} whether this value is odd. - * @api public - */ -Long.prototype.isOdd = function() { - return (this.low_ & 1) == 1; -}; - -/** - * Return whether this Long equals the other - * - * @param {Long} other Long to compare against. - * @return {Boolean} whether this Long equals the other - * @api public - */ -Long.prototype.equals = function(other) { - return (this.high_ == other.high_) && (this.low_ == other.low_); -}; - -/** - * Return whether this Long does not equal the other. - * - * @param {Long} other Long to compare against. - * @return {Boolean} whether this Long does not equal the other. - * @api public - */ -Long.prototype.notEquals = function(other) { - return (this.high_ != other.high_) || (this.low_ != other.low_); -}; - -/** - * Return whether this Long is less than the other. - * - * @param {Long} other Long to compare against. - * @return {Boolean} whether this Long is less than the other. - * @api public - */ -Long.prototype.lessThan = function(other) { - return this.compare(other) < 0; -}; - -/** - * Return whether this Long is less than or equal to the other. - * - * @param {Long} other Long to compare against. - * @return {Boolean} whether this Long is less than or equal to the other. - * @api public - */ -Long.prototype.lessThanOrEqual = function(other) { - return this.compare(other) <= 0; -}; - -/** - * Return whether this Long is greater than the other. - * - * @param {Long} other Long to compare against. - * @return {Boolean} whether this Long is greater than the other. - * @api public - */ -Long.prototype.greaterThan = function(other) { - return this.compare(other) > 0; -}; - -/** - * Return whether this Long is greater than or equal to the other. - * - * @param {Long} other Long to compare against. - * @return {Boolean} whether this Long is greater than or equal to the other. - * @api public - */ -Long.prototype.greaterThanOrEqual = function(other) { - return this.compare(other) >= 0; -}; - -/** - * Compares this Long with the given one. - * - * @param {Long} other Long to compare against. - * @return {Boolean} 0 if they are the same, 1 if the this is greater, and -1 if the given one is greater. - * @api public - */ -Long.prototype.compare = function(other) { - if (this.equals(other)) { - return 0; - } - - var thisNeg = this.isNegative(); - var otherNeg = other.isNegative(); - if (thisNeg && !otherNeg) { - return -1; - } - if (!thisNeg && otherNeg) { - return 1; - } - - // at this point, the signs are the same, so subtraction will not overflow - if (this.subtract(other).isNegative()) { - return -1; - } else { - return 1; - } -}; - -/** - * The negation of this value. - * - * @return {Long} the negation of this value. - * @api public - */ -Long.prototype.negate = function() { - if (this.equals(Long.MIN_VALUE)) { - return Long.MIN_VALUE; - } else { - return this.not().add(Long.ONE); - } -}; - -/** - * Returns the sum of this and the given Long. - * - * @param {Long} other Long to add to this one. - * @return {Long} the sum of this and the given Long. - * @api public - */ -Long.prototype.add = function(other) { - // Divide each number into 4 chunks of 16 bits, and then sum the chunks. - - var a48 = this.high_ >>> 16; - var a32 = this.high_ & 0xFFFF; - var a16 = this.low_ >>> 16; - var a00 = this.low_ & 0xFFFF; - - var b48 = other.high_ >>> 16; - var b32 = other.high_ & 0xFFFF; - var b16 = other.low_ >>> 16; - var b00 = other.low_ & 0xFFFF; - - var c48 = 0, c32 = 0, c16 = 0, c00 = 0; - c00 += a00 + b00; - c16 += c00 >>> 16; - c00 &= 0xFFFF; - c16 += a16 + b16; - c32 += c16 >>> 16; - c16 &= 0xFFFF; - c32 += a32 + b32; - c48 += c32 >>> 16; - c32 &= 0xFFFF; - c48 += a48 + b48; - c48 &= 0xFFFF; - return Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32); -}; - -/** - * Returns the difference of this and the given Long. - * - * @param {Long} other Long to subtract from this. - * @return {Long} the difference of this and the given Long. - * @api public - */ -Long.prototype.subtract = function(other) { - return this.add(other.negate()); -}; - -/** - * Returns the product of this and the given Long. - * - * @param {Long} other Long to multiply with this. - * @return {Long} the product of this and the other. - * @api public - */ -Long.prototype.multiply = function(other) { - if (this.isZero()) { - return Long.ZERO; - } else if (other.isZero()) { - return Long.ZERO; - } - - if (this.equals(Long.MIN_VALUE)) { - return other.isOdd() ? Long.MIN_VALUE : Long.ZERO; - } else if (other.equals(Long.MIN_VALUE)) { - return this.isOdd() ? Long.MIN_VALUE : Long.ZERO; - } - - if (this.isNegative()) { - if (other.isNegative()) { - return this.negate().multiply(other.negate()); - } else { - return this.negate().multiply(other).negate(); - } - } else if (other.isNegative()) { - return this.multiply(other.negate()).negate(); - } - - // If both Longs are small, use float multiplication - if (this.lessThan(Long.TWO_PWR_24_) && - other.lessThan(Long.TWO_PWR_24_)) { - return Long.fromNumber(this.toNumber() * other.toNumber()); - } - - // Divide each Long into 4 chunks of 16 bits, and then add up 4x4 products. - // We can skip products that would overflow. - - var a48 = this.high_ >>> 16; - var a32 = this.high_ & 0xFFFF; - var a16 = this.low_ >>> 16; - var a00 = this.low_ & 0xFFFF; - - var b48 = other.high_ >>> 16; - var b32 = other.high_ & 0xFFFF; - var b16 = other.low_ >>> 16; - var b00 = other.low_ & 0xFFFF; - - var c48 = 0, c32 = 0, c16 = 0, c00 = 0; - c00 += a00 * b00; - c16 += c00 >>> 16; - c00 &= 0xFFFF; - c16 += a16 * b00; - c32 += c16 >>> 16; - c16 &= 0xFFFF; - c16 += a00 * b16; - c32 += c16 >>> 16; - c16 &= 0xFFFF; - c32 += a32 * b00; - c48 += c32 >>> 16; - c32 &= 0xFFFF; - c32 += a16 * b16; - c48 += c32 >>> 16; - c32 &= 0xFFFF; - c32 += a00 * b32; - c48 += c32 >>> 16; - c32 &= 0xFFFF; - c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48; - c48 &= 0xFFFF; - return Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32); -}; - -/** - * Returns this Long divided by the given one. - * - * @param {Long} other Long by which to divide. - * @return {Long} this Long divided by the given one. - * @api public - */ -Long.prototype.div = function(other) { - if (other.isZero()) { - throw Error('division by zero'); - } else if (this.isZero()) { - return Long.ZERO; - } - - if (this.equals(Long.MIN_VALUE)) { - if (other.equals(Long.ONE) || - other.equals(Long.NEG_ONE)) { - return Long.MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE - } else if (other.equals(Long.MIN_VALUE)) { - return Long.ONE; - } else { - // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|. - var halfThis = this.shiftRight(1); - var approx = halfThis.div(other).shiftLeft(1); - if (approx.equals(Long.ZERO)) { - return other.isNegative() ? Long.ONE : Long.NEG_ONE; - } else { - var rem = this.subtract(other.multiply(approx)); - var result = approx.add(rem.div(other)); - return result; - } - } - } else if (other.equals(Long.MIN_VALUE)) { - return Long.ZERO; - } - - if (this.isNegative()) { - if (other.isNegative()) { - return this.negate().div(other.negate()); - } else { - return this.negate().div(other).negate(); - } - } else if (other.isNegative()) { - return this.div(other.negate()).negate(); - } - - // Repeat the following until the remainder is less than other: find a - // floating-point that approximates remainder / other *from below*, add this - // into the result, and subtract it from the remainder. It is critical that - // the approximate value is less than or equal to the real value so that the - // remainder never becomes negative. - var res = Long.ZERO; - var rem = this; - while (rem.greaterThanOrEqual(other)) { - // Approximate the result of division. This may be a little greater or - // smaller than the actual value. - var approx = Math.max(1, Math.floor(rem.toNumber() / other.toNumber())); - - // We will tweak the approximate result by changing it in the 48-th digit or - // the smallest non-fractional digit, whichever is larger. - var log2 = Math.ceil(Math.log(approx) / Math.LN2); - var delta = (log2 <= 48) ? 1 : Math.pow(2, log2 - 48); - - // Decrease the approximation until it is smaller than the remainder. Note - // that if it is too large, the product overflows and is negative. - var approxRes = Long.fromNumber(approx); - var approxRem = approxRes.multiply(other); - while (approxRem.isNegative() || approxRem.greaterThan(rem)) { - approx -= delta; - approxRes = Long.fromNumber(approx); - approxRem = approxRes.multiply(other); - } - - // We know the answer can't be zero... and actually, zero would cause - // infinite recursion since we would make no progress. - if (approxRes.isZero()) { - approxRes = Long.ONE; - } - - res = res.add(approxRes); - rem = rem.subtract(approxRem); - } - return res; -}; - -/** - * Returns this Long modulo the given one. - * - * @param {Long} other Long by which to mod. - * @return {Long} this Long modulo the given one. - * @api public - */ -Long.prototype.modulo = function(other) { - return this.subtract(this.div(other).multiply(other)); -}; - -/** - * The bitwise-NOT of this value. - * - * @return {Long} the bitwise-NOT of this value. - * @api public - */ -Long.prototype.not = function() { - return Long.fromBits(~this.low_, ~this.high_); -}; - -/** - * Returns the bitwise-AND of this Long and the given one. - * - * @param {Long} other the Long with which to AND. - * @return {Long} the bitwise-AND of this and the other. - * @api public - */ -Long.prototype.and = function(other) { - return Long.fromBits(this.low_ & other.low_, this.high_ & other.high_); -}; - -/** - * Returns the bitwise-OR of this Long and the given one. - * - * @param {Long} other the Long with which to OR. - * @return {Long} the bitwise-OR of this and the other. - * @api public - */ -Long.prototype.or = function(other) { - return Long.fromBits(this.low_ | other.low_, this.high_ | other.high_); -}; - -/** - * Returns the bitwise-XOR of this Long and the given one. - * - * @param {Long} other the Long with which to XOR. - * @return {Long} the bitwise-XOR of this and the other. - * @api public - */ -Long.prototype.xor = function(other) { - return Long.fromBits(this.low_ ^ other.low_, this.high_ ^ other.high_); -}; - -/** - * Returns this Long with bits shifted to the left by the given amount. - * - * @param {Number} numBits the number of bits by which to shift. - * @return {Long} this shifted to the left by the given amount. - * @api public - */ -Long.prototype.shiftLeft = function(numBits) { - numBits &= 63; - if (numBits == 0) { - return this; - } else { - var low = this.low_; - if (numBits < 32) { - var high = this.high_; - return Long.fromBits( - low << numBits, - (high << numBits) | (low >>> (32 - numBits))); - } else { - return Long.fromBits(0, low << (numBits - 32)); - } - } -}; - -/** - * Returns this Long with bits shifted to the right by the given amount. - * - * @param {Number} numBits the number of bits by which to shift. - * @return {Long} this shifted to the right by the given amount. - * @api public - */ -Long.prototype.shiftRight = function(numBits) { - numBits &= 63; - if (numBits == 0) { - return this; - } else { - var high = this.high_; - if (numBits < 32) { - var low = this.low_; - return Long.fromBits( - (low >>> numBits) | (high << (32 - numBits)), - high >> numBits); - } else { - return Long.fromBits( - high >> (numBits - 32), - high >= 0 ? 0 : -1); - } - } -}; - -/** - * Returns this Long with bits shifted to the right by the given amount, with the new top bits matching the current sign bit. - * - * @param {Number} numBits the number of bits by which to shift. - * @return {Long} this shifted to the right by the given amount, with zeros placed into the new leading bits. - * @api public - */ -Long.prototype.shiftRightUnsigned = function(numBits) { - numBits &= 63; - if (numBits == 0) { - return this; - } else { - var high = this.high_; - if (numBits < 32) { - var low = this.low_; - return Long.fromBits( - (low >>> numBits) | (high << (32 - numBits)), - high >>> numBits); - } else if (numBits == 32) { - return Long.fromBits(high, 0); - } else { - return Long.fromBits(high >>> (numBits - 32), 0); - } - } -}; - -/** - * Returns a Long representing the given (32-bit) integer value. - * - * @param {Number} value the 32-bit integer in question. - * @return {Long} the corresponding Long value. - * @api public - */ -Long.fromInt = function(value) { - if (-128 <= value && value < 128) { - var cachedObj = Long.INT_CACHE_[value]; - if (cachedObj) { - return cachedObj; - } - } - - var obj = new Long(value | 0, value < 0 ? -1 : 0); - if (-128 <= value && value < 128) { - Long.INT_CACHE_[value] = obj; - } - return obj; -}; - -/** - * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned. - * - * @param {Number} value the number in question. - * @return {Long} the corresponding Long value. - * @api public - */ -Long.fromNumber = function(value) { - if (isNaN(value) || !isFinite(value)) { - return Long.ZERO; - } else if (value <= -Long.TWO_PWR_63_DBL_) { - return Long.MIN_VALUE; - } else if (value + 1 >= Long.TWO_PWR_63_DBL_) { - return Long.MAX_VALUE; - } else if (value < 0) { - return Long.fromNumber(-value).negate(); - } else { - return new Long( - (value % Long.TWO_PWR_32_DBL_) | 0, - (value / Long.TWO_PWR_32_DBL_) | 0); - } -}; - -/** - * Returns a Long representing the 64-bit integer that comes by concatenating the given high and low bits. Each is assumed to use 32 bits. - * - * @param {Number} lowBits the low 32-bits. - * @param {Number} highBits the high 32-bits. - * @return {Long} the corresponding Long value. - * @api public - */ -Long.fromBits = function(lowBits, highBits) { - return new Long(lowBits, highBits); -}; - -/** - * Returns a Long representation of the given string, written using the given radix. - * - * @param {String} str the textual representation of the Long. - * @param {Number} opt_radix the radix in which the text is written. - * @return {Long} the corresponding Long value. - * @api public - */ -Long.fromString = function(str, opt_radix) { - if (str.length == 0) { - throw Error('number format error: empty string'); - } - - var radix = opt_radix || 10; - if (radix < 2 || 36 < radix) { - throw Error('radix out of range: ' + radix); - } - - if (str.charAt(0) == '-') { - return Long.fromString(str.substring(1), radix).negate(); - } else if (str.indexOf('-') >= 0) { - throw Error('number format error: interior "-" character: ' + str); - } - - // Do several (8) digits each time through the loop, so as to - // minimize the calls to the very expensive emulated div. - var radixToPower = Long.fromNumber(Math.pow(radix, 8)); - - var result = Long.ZERO; - for (var i = 0; i < str.length; i += 8) { - var size = Math.min(8, str.length - i); - var value = parseInt(str.substring(i, i + size), radix); - if (size < 8) { - var power = Long.fromNumber(Math.pow(radix, size)); - result = result.multiply(power).add(Long.fromNumber(value)); - } else { - result = result.multiply(radixToPower); - result = result.add(Long.fromNumber(value)); - } - } - return result; -}; - -// NOTE: Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the -// from* methods on which they depend. - - -/** - * A cache of the Long representations of small integer values. - * @type {Object} - * @api private - */ -Long.INT_CACHE_ = {}; - -// NOTE: the compiler should inline these constant values below and then remove -// these variables, so there should be no runtime penalty for these. - -/** - * Number used repeated below in calculations. This must appear before the - * first call to any from* function below. - * @type {number} - * @api private - */ -Long.TWO_PWR_16_DBL_ = 1 << 16; - -/** - * @type {number} - * @api private - */ -Long.TWO_PWR_24_DBL_ = 1 << 24; - -/** - * @type {number} - * @api private - */ -Long.TWO_PWR_32_DBL_ = Long.TWO_PWR_16_DBL_ * Long.TWO_PWR_16_DBL_; - -/** - * @type {number} - * @api private - */ -Long.TWO_PWR_31_DBL_ = Long.TWO_PWR_32_DBL_ / 2; - -/** - * @type {number} - * @api private - */ -Long.TWO_PWR_48_DBL_ = Long.TWO_PWR_32_DBL_ * Long.TWO_PWR_16_DBL_; - -/** - * @type {number} - * @api private - */ -Long.TWO_PWR_64_DBL_ = Long.TWO_PWR_32_DBL_ * Long.TWO_PWR_32_DBL_; - -/** - * @type {number} - * @api private - */ -Long.TWO_PWR_63_DBL_ = Long.TWO_PWR_64_DBL_ / 2; - -/** @type {Long} */ -Long.ZERO = Long.fromInt(0); - -/** @type {Long} */ -Long.ONE = Long.fromInt(1); - -/** @type {Long} */ -Long.NEG_ONE = Long.fromInt(-1); - -/** @type {Long} */ -Long.MAX_VALUE = - Long.fromBits(0xFFFFFFFF | 0, 0x7FFFFFFF | 0); - -/** @type {Long} */ -Long.MIN_VALUE = Long.fromBits(0, 0x80000000 | 0); - -/** - * @type {Long} - * @api private - */ -Long.TWO_PWR_24_ = Long.fromInt(1 << 24); - -/** - * Expose. - */ -exports.Long = Long; -}, - - - -'max_key': function(module, exports, global, require, undefined){ - /** - * A class representation of the BSON MaxKey type. - * - * @class Represents the BSON MaxKey type. - * @return {MaxKey} - */ -function MaxKey() { - if(!(this instanceof MaxKey)) return new MaxKey(); - - this._bsontype = 'MaxKey'; -} - -exports.MaxKey = MaxKey; -}, - - - -'min_key': function(module, exports, global, require, undefined){ - /** - * A class representation of the BSON MinKey type. - * - * @class Represents the BSON MinKey type. - * @return {MinKey} - */ -function MinKey() { - if(!(this instanceof MinKey)) return new MinKey(); - - this._bsontype = 'MinKey'; -} - -exports.MinKey = MinKey; -}, - - - -'objectid': function(module, exports, global, require, undefined){ - /** - * Module dependencies. - */ -var BinaryParser = require('./binary_parser').BinaryParser; - -/** - * Machine id. - * - * Create a random 3-byte value (i.e. unique for this - * process). Other drivers use a md5 of the machine id here, but - * that would mean an asyc call to gethostname, so we don't bother. - */ -var MACHINE_ID = parseInt(Math.random() * 0xFFFFFF, 10); - -// Regular expression that checks for hex value -var checkForHexRegExp = new RegExp("^[0-9a-fA-F]{24}$"); - -/** -* Create a new ObjectID instance -* -* @class Represents the BSON ObjectID type -* @param {String|Number} id Can be a 24 byte hex string, 12 byte binary string or a Number. -* @return {Object} instance of ObjectID. -*/ -var ObjectID = function ObjectID(id, _hex) { - if(!(this instanceof ObjectID)) return new ObjectID(id, _hex); - - this._bsontype = 'ObjectID'; - var __id = null; - - // Throw an error if it's not a valid setup - if(id != null && 'number' != typeof id && (id.length != 12 && id.length != 24)) - throw new Error("Argument passed in must be a single String of 12 bytes or a string of 24 hex characters"); - - // Generate id based on the input - if(id == null || typeof id == 'number') { - // convert to 12 byte binary string - this.id = this.generate(id); - } else if(id != null && id.length === 12) { - // assume 12 byte string - this.id = id; - } else if(checkForHexRegExp.test(id)) { - return ObjectID.createFromHexString(id); - } else if(!checkForHexRegExp.test(id)) { - throw new Error("Value passed in is not a valid 24 character hex string"); - } - - if(ObjectID.cacheHexString) this.__id = this.toHexString(); -}; - -// Allow usage of ObjectId aswell as ObjectID -var ObjectId = ObjectID; - -/** -* Return the ObjectID id as a 24 byte hex string representation -* -* @return {String} return the 24 byte hex string representation. -* @api public -*/ -ObjectID.prototype.toHexString = function() { - if(ObjectID.cacheHexString && this.__id) return this.__id; - - var hexString = '' - , number - , value; - - for (var index = 0, len = this.id.length; index < len; index++) { - value = BinaryParser.toByte(this.id[index]); - number = value <= 15 - ? '0' + value.toString(16) - : value.toString(16); - hexString = hexString + number; - } - - if(ObjectID.cacheHexString) this.__id = hexString; - return hexString; -}; - -/** -* Update the ObjectID index used in generating new ObjectID's on the driver -* -* @return {Number} returns next index value. -* @api private -*/ -ObjectID.prototype.get_inc = function() { - return ObjectID.index = (ObjectID.index + 1) % 0xFFFFFF; -}; - -/** -* Update the ObjectID index used in generating new ObjectID's on the driver -* -* @return {Number} returns next index value. -* @api private -*/ -ObjectID.prototype.getInc = function() { - return this.get_inc(); -}; - -/** -* Generate a 12 byte id string used in ObjectID's -* -* @param {Number} [time] optional parameter allowing to pass in a second based timestamp. -* @return {String} return the 12 byte id binary string. -* @api private -*/ -ObjectID.prototype.generate = function(time) { - if ('number' == typeof time) { - var time4Bytes = BinaryParser.encodeInt(time, 32, true, true); - /* for time-based ObjectID the bytes following the time will be zeroed */ - var machine3Bytes = BinaryParser.encodeInt(MACHINE_ID, 24, false); - var pid2Bytes = BinaryParser.fromShort(typeof process === 'undefined' ? Math.floor(Math.random() * 100000) : process.pid); - var index3Bytes = BinaryParser.encodeInt(this.get_inc(), 24, false, true); - } else { - var unixTime = parseInt(Date.now()/1000,10); - var time4Bytes = BinaryParser.encodeInt(unixTime, 32, true, true); - var machine3Bytes = BinaryParser.encodeInt(MACHINE_ID, 24, false); - var pid2Bytes = BinaryParser.fromShort(typeof process === 'undefined' ? Math.floor(Math.random() * 100000) : process.pid); - var index3Bytes = BinaryParser.encodeInt(this.get_inc(), 24, false, true); - } - - return time4Bytes + machine3Bytes + pid2Bytes + index3Bytes; -}; - -/** -* Converts the id into a 24 byte hex string for printing -* -* @return {String} return the 24 byte hex string representation. -* @api private -*/ -ObjectID.prototype.toString = function() { - return this.toHexString(); -}; - -/** -* Converts to a string representation of this Id. -* -* @return {String} return the 24 byte hex string representation. -* @api private -*/ -ObjectID.prototype.inspect = ObjectID.prototype.toString; - -/** -* Converts to its JSON representation. -* -* @return {String} return the 24 byte hex string representation. -* @api private -*/ -ObjectID.prototype.toJSON = function() { - return this.toHexString(); -}; - -/** -* Compares the equality of this ObjectID with `otherID`. -* -* @param {Object} otherID ObjectID instance to compare against. -* @return {Bool} the result of comparing two ObjectID's -* @api public -*/ -ObjectID.prototype.equals = function equals (otherID) { - var id = (otherID instanceof ObjectID || otherID.toHexString) - ? otherID.id - : ObjectID.createFromHexString(otherID).id; - - return this.id === id; -} - -/** -* Returns the generation time in seconds that this ID was generated. -* -* @return {Number} return number of seconds in the timestamp part of the 12 byte id. -* @api public -*/ -ObjectID.prototype.getTimestamp = function() { - var timestamp = new Date(); - timestamp.setTime(Math.floor(BinaryParser.decodeInt(this.id.substring(0,4), 32, true, true)) * 1000); - return timestamp; -} - -/** -* @ignore -* @api private -*/ -ObjectID.index = 0; - -ObjectID.createPk = function createPk () { - return new ObjectID(); -}; - -/** -* Creates an ObjectID from a second based number, with the rest of the ObjectID zeroed out. Used for comparisons or sorting the ObjectID. -* -* @param {Number} time an integer number representing a number of seconds. -* @return {ObjectID} return the created ObjectID -* @api public -*/ -ObjectID.createFromTime = function createFromTime (time) { - var id = BinaryParser.encodeInt(time, 32, true, true) + - BinaryParser.encodeInt(0, 64, true, true); - return new ObjectID(id); -}; - -/** -* Creates an ObjectID from a hex string representation of an ObjectID. -* -* @param {String} hexString create a ObjectID from a passed in 24 byte hexstring. -* @return {ObjectID} return the created ObjectID -* @api public -*/ -ObjectID.createFromHexString = function createFromHexString (hexString) { - // Throw an error if it's not a valid setup - if(typeof hexString === 'undefined' || hexString != null && hexString.length != 24) - throw new Error("Argument passed in must be a single String of 12 bytes or a string of 24 hex characters"); - - var len = hexString.length; - - if(len > 12*2) { - throw new Error('Id cannot be longer than 12 bytes'); - } - - var result = '' - , string - , number; - - for (var index = 0; index < len; index += 2) { - string = hexString.substr(index, 2); - number = parseInt(string, 16); - result += BinaryParser.fromByte(number); - } - - return new ObjectID(result, hexString); -}; - -/** -* @ignore -*/ -Object.defineProperty(ObjectID.prototype, "generationTime", { - enumerable: true - , get: function () { - return Math.floor(BinaryParser.decodeInt(this.id.substring(0,4), 32, true, true)); - } - , set: function (value) { - var value = BinaryParser.encodeInt(value, 32, true, true); - this.id = value + this.id.substr(4); - // delete this.__id; - this.toHexString(); - } -}); - -/** - * Expose. - */ -exports.ObjectID = ObjectID; -exports.ObjectId = ObjectID; -}, - - - -'symbol': function(module, exports, global, require, undefined){ - /** - * A class representation of the BSON Symbol type. - * - * @class Represents the BSON Symbol type. - * @param {String} value the string representing the symbol. - * @return {Symbol} - */ -function Symbol(value) { - if(!(this instanceof Symbol)) return new Symbol(value); - this._bsontype = 'Symbol'; - this.value = value; -} - -/** - * Access the wrapped string value. - * - * @return {String} returns the wrapped string. - * @api public - */ -Symbol.prototype.valueOf = function() { - return this.value; -}; - -/** - * @ignore - * @api private - */ -Symbol.prototype.toString = function() { - return this.value; -} - -/** - * @ignore - * @api private - */ -Symbol.prototype.inspect = function() { - return this.value; -} - -/** - * @ignore - * @api private - */ -Symbol.prototype.toJSON = function() { - return this.value; -} - -exports.Symbol = Symbol; -}, - - - -'timestamp': function(module, exports, global, require, undefined){ - // Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// Copyright 2009 Google Inc. All Rights Reserved - -/** - * Defines a Timestamp class for representing a 64-bit two's-complement - * integer value, which faithfully simulates the behavior of a Java "Timestamp". This - * implementation is derived from TimestampLib in GWT. - * - * Constructs a 64-bit two's-complement integer, given its low and high 32-bit - * values as *signed* integers. See the from* functions below for more - * convenient ways of constructing Timestamps. - * - * The internal representation of a Timestamp is the two given signed, 32-bit values. - * We use 32-bit pieces because these are the size of integers on which - * Javascript performs bit-operations. For operations like addition and - * multiplication, we split each number into 16-bit pieces, which can easily be - * multiplied within Javascript's floating-point representation without overflow - * or change in sign. - * - * In the algorithms below, we frequently reduce the negative case to the - * positive case by negating the input(s) and then post-processing the result. - * Note that we must ALWAYS check specially whether those values are MIN_VALUE - * (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as - * a positive number, it overflows back into a negative). Not handling this - * case would often result in infinite recursion. - * - * @class Represents the BSON Timestamp type. - * @param {Number} low the low (signed) 32 bits of the Timestamp. - * @param {Number} high the high (signed) 32 bits of the Timestamp. - */ -function Timestamp(low, high) { - if(!(this instanceof Timestamp)) return new Timestamp(low, high); - this._bsontype = 'Timestamp'; - /** - * @type {number} - * @api private - */ - this.low_ = low | 0; // force into 32 signed bits. - - /** - * @type {number} - * @api private - */ - this.high_ = high | 0; // force into 32 signed bits. -}; - -/** - * Return the int value. - * - * @return {Number} the value, assuming it is a 32-bit integer. - * @api public - */ -Timestamp.prototype.toInt = function() { - return this.low_; -}; - -/** - * Return the Number value. - * - * @return {Number} the closest floating-point representation to this value. - * @api public - */ -Timestamp.prototype.toNumber = function() { - return this.high_ * Timestamp.TWO_PWR_32_DBL_ + - this.getLowBitsUnsigned(); -}; - -/** - * Return the JSON value. - * - * @return {String} the JSON representation. - * @api public - */ -Timestamp.prototype.toJSON = function() { - return this.toString(); -} - -/** - * Return the String value. - * - * @param {Number} [opt_radix] the radix in which the text should be written. - * @return {String} the textual representation of this value. - * @api public - */ -Timestamp.prototype.toString = function(opt_radix) { - var radix = opt_radix || 10; - if (radix < 2 || 36 < radix) { - throw Error('radix out of range: ' + radix); - } - - if (this.isZero()) { - return '0'; - } - - if (this.isNegative()) { - if (this.equals(Timestamp.MIN_VALUE)) { - // We need to change the Timestamp value before it can be negated, so we remove - // the bottom-most digit in this base and then recurse to do the rest. - var radixTimestamp = Timestamp.fromNumber(radix); - var div = this.div(radixTimestamp); - var rem = div.multiply(radixTimestamp).subtract(this); - return div.toString(radix) + rem.toInt().toString(radix); - } else { - return '-' + this.negate().toString(radix); - } - } - - // Do several (6) digits each time through the loop, so as to - // minimize the calls to the very expensive emulated div. - var radixToPower = Timestamp.fromNumber(Math.pow(radix, 6)); - - var rem = this; - var result = ''; - while (true) { - var remDiv = rem.div(radixToPower); - var intval = rem.subtract(remDiv.multiply(radixToPower)).toInt(); - var digits = intval.toString(radix); - - rem = remDiv; - if (rem.isZero()) { - return digits + result; - } else { - while (digits.length < 6) { - digits = '0' + digits; - } - result = '' + digits + result; - } - } -}; - -/** - * Return the high 32-bits value. - * - * @return {Number} the high 32-bits as a signed value. - * @api public - */ -Timestamp.prototype.getHighBits = function() { - return this.high_; -}; - -/** - * Return the low 32-bits value. - * - * @return {Number} the low 32-bits as a signed value. - * @api public - */ -Timestamp.prototype.getLowBits = function() { - return this.low_; -}; - -/** - * Return the low unsigned 32-bits value. - * - * @return {Number} the low 32-bits as an unsigned value. - * @api public - */ -Timestamp.prototype.getLowBitsUnsigned = function() { - return (this.low_ >= 0) ? - this.low_ : Timestamp.TWO_PWR_32_DBL_ + this.low_; -}; - -/** - * Returns the number of bits needed to represent the absolute value of this Timestamp. - * - * @return {Number} Returns the number of bits needed to represent the absolute value of this Timestamp. - * @api public - */ -Timestamp.prototype.getNumBitsAbs = function() { - if (this.isNegative()) { - if (this.equals(Timestamp.MIN_VALUE)) { - return 64; - } else { - return this.negate().getNumBitsAbs(); - } - } else { - var val = this.high_ != 0 ? this.high_ : this.low_; - for (var bit = 31; bit > 0; bit--) { - if ((val & (1 << bit)) != 0) { - break; - } - } - return this.high_ != 0 ? bit + 33 : bit + 1; - } -}; - -/** - * Return whether this value is zero. - * - * @return {Boolean} whether this value is zero. - * @api public - */ -Timestamp.prototype.isZero = function() { - return this.high_ == 0 && this.low_ == 0; -}; - -/** - * Return whether this value is negative. - * - * @return {Boolean} whether this value is negative. - * @api public - */ -Timestamp.prototype.isNegative = function() { - return this.high_ < 0; -}; - -/** - * Return whether this value is odd. - * - * @return {Boolean} whether this value is odd. - * @api public - */ -Timestamp.prototype.isOdd = function() { - return (this.low_ & 1) == 1; -}; - -/** - * Return whether this Timestamp equals the other - * - * @param {Timestamp} other Timestamp to compare against. - * @return {Boolean} whether this Timestamp equals the other - * @api public - */ -Timestamp.prototype.equals = function(other) { - return (this.high_ == other.high_) && (this.low_ == other.low_); -}; - -/** - * Return whether this Timestamp does not equal the other. - * - * @param {Timestamp} other Timestamp to compare against. - * @return {Boolean} whether this Timestamp does not equal the other. - * @api public - */ -Timestamp.prototype.notEquals = function(other) { - return (this.high_ != other.high_) || (this.low_ != other.low_); -}; - -/** - * Return whether this Timestamp is less than the other. - * - * @param {Timestamp} other Timestamp to compare against. - * @return {Boolean} whether this Timestamp is less than the other. - * @api public - */ -Timestamp.prototype.lessThan = function(other) { - return this.compare(other) < 0; -}; - -/** - * Return whether this Timestamp is less than or equal to the other. - * - * @param {Timestamp} other Timestamp to compare against. - * @return {Boolean} whether this Timestamp is less than or equal to the other. - * @api public - */ -Timestamp.prototype.lessThanOrEqual = function(other) { - return this.compare(other) <= 0; -}; - -/** - * Return whether this Timestamp is greater than the other. - * - * @param {Timestamp} other Timestamp to compare against. - * @return {Boolean} whether this Timestamp is greater than the other. - * @api public - */ -Timestamp.prototype.greaterThan = function(other) { - return this.compare(other) > 0; -}; - -/** - * Return whether this Timestamp is greater than or equal to the other. - * - * @param {Timestamp} other Timestamp to compare against. - * @return {Boolean} whether this Timestamp is greater than or equal to the other. - * @api public - */ -Timestamp.prototype.greaterThanOrEqual = function(other) { - return this.compare(other) >= 0; -}; - -/** - * Compares this Timestamp with the given one. - * - * @param {Timestamp} other Timestamp to compare against. - * @return {Boolean} 0 if they are the same, 1 if the this is greater, and -1 if the given one is greater. - * @api public - */ -Timestamp.prototype.compare = function(other) { - if (this.equals(other)) { - return 0; - } - - var thisNeg = this.isNegative(); - var otherNeg = other.isNegative(); - if (thisNeg && !otherNeg) { - return -1; - } - if (!thisNeg && otherNeg) { - return 1; - } - - // at this point, the signs are the same, so subtraction will not overflow - if (this.subtract(other).isNegative()) { - return -1; - } else { - return 1; - } -}; - -/** - * The negation of this value. - * - * @return {Timestamp} the negation of this value. - * @api public - */ -Timestamp.prototype.negate = function() { - if (this.equals(Timestamp.MIN_VALUE)) { - return Timestamp.MIN_VALUE; - } else { - return this.not().add(Timestamp.ONE); - } -}; - -/** - * Returns the sum of this and the given Timestamp. - * - * @param {Timestamp} other Timestamp to add to this one. - * @return {Timestamp} the sum of this and the given Timestamp. - * @api public - */ -Timestamp.prototype.add = function(other) { - // Divide each number into 4 chunks of 16 bits, and then sum the chunks. - - var a48 = this.high_ >>> 16; - var a32 = this.high_ & 0xFFFF; - var a16 = this.low_ >>> 16; - var a00 = this.low_ & 0xFFFF; - - var b48 = other.high_ >>> 16; - var b32 = other.high_ & 0xFFFF; - var b16 = other.low_ >>> 16; - var b00 = other.low_ & 0xFFFF; - - var c48 = 0, c32 = 0, c16 = 0, c00 = 0; - c00 += a00 + b00; - c16 += c00 >>> 16; - c00 &= 0xFFFF; - c16 += a16 + b16; - c32 += c16 >>> 16; - c16 &= 0xFFFF; - c32 += a32 + b32; - c48 += c32 >>> 16; - c32 &= 0xFFFF; - c48 += a48 + b48; - c48 &= 0xFFFF; - return Timestamp.fromBits((c16 << 16) | c00, (c48 << 16) | c32); -}; - -/** - * Returns the difference of this and the given Timestamp. - * - * @param {Timestamp} other Timestamp to subtract from this. - * @return {Timestamp} the difference of this and the given Timestamp. - * @api public - */ -Timestamp.prototype.subtract = function(other) { - return this.add(other.negate()); -}; - -/** - * Returns the product of this and the given Timestamp. - * - * @param {Timestamp} other Timestamp to multiply with this. - * @return {Timestamp} the product of this and the other. - * @api public - */ -Timestamp.prototype.multiply = function(other) { - if (this.isZero()) { - return Timestamp.ZERO; - } else if (other.isZero()) { - return Timestamp.ZERO; - } - - if (this.equals(Timestamp.MIN_VALUE)) { - return other.isOdd() ? Timestamp.MIN_VALUE : Timestamp.ZERO; - } else if (other.equals(Timestamp.MIN_VALUE)) { - return this.isOdd() ? Timestamp.MIN_VALUE : Timestamp.ZERO; - } - - if (this.isNegative()) { - if (other.isNegative()) { - return this.negate().multiply(other.negate()); - } else { - return this.negate().multiply(other).negate(); - } - } else if (other.isNegative()) { - return this.multiply(other.negate()).negate(); - } - - // If both Timestamps are small, use float multiplication - if (this.lessThan(Timestamp.TWO_PWR_24_) && - other.lessThan(Timestamp.TWO_PWR_24_)) { - return Timestamp.fromNumber(this.toNumber() * other.toNumber()); - } - - // Divide each Timestamp into 4 chunks of 16 bits, and then add up 4x4 products. - // We can skip products that would overflow. - - var a48 = this.high_ >>> 16; - var a32 = this.high_ & 0xFFFF; - var a16 = this.low_ >>> 16; - var a00 = this.low_ & 0xFFFF; - - var b48 = other.high_ >>> 16; - var b32 = other.high_ & 0xFFFF; - var b16 = other.low_ >>> 16; - var b00 = other.low_ & 0xFFFF; - - var c48 = 0, c32 = 0, c16 = 0, c00 = 0; - c00 += a00 * b00; - c16 += c00 >>> 16; - c00 &= 0xFFFF; - c16 += a16 * b00; - c32 += c16 >>> 16; - c16 &= 0xFFFF; - c16 += a00 * b16; - c32 += c16 >>> 16; - c16 &= 0xFFFF; - c32 += a32 * b00; - c48 += c32 >>> 16; - c32 &= 0xFFFF; - c32 += a16 * b16; - c48 += c32 >>> 16; - c32 &= 0xFFFF; - c32 += a00 * b32; - c48 += c32 >>> 16; - c32 &= 0xFFFF; - c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48; - c48 &= 0xFFFF; - return Timestamp.fromBits((c16 << 16) | c00, (c48 << 16) | c32); -}; - -/** - * Returns this Timestamp divided by the given one. - * - * @param {Timestamp} other Timestamp by which to divide. - * @return {Timestamp} this Timestamp divided by the given one. - * @api public - */ -Timestamp.prototype.div = function(other) { - if (other.isZero()) { - throw Error('division by zero'); - } else if (this.isZero()) { - return Timestamp.ZERO; - } - - if (this.equals(Timestamp.MIN_VALUE)) { - if (other.equals(Timestamp.ONE) || - other.equals(Timestamp.NEG_ONE)) { - return Timestamp.MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE - } else if (other.equals(Timestamp.MIN_VALUE)) { - return Timestamp.ONE; - } else { - // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|. - var halfThis = this.shiftRight(1); - var approx = halfThis.div(other).shiftLeft(1); - if (approx.equals(Timestamp.ZERO)) { - return other.isNegative() ? Timestamp.ONE : Timestamp.NEG_ONE; - } else { - var rem = this.subtract(other.multiply(approx)); - var result = approx.add(rem.div(other)); - return result; - } - } - } else if (other.equals(Timestamp.MIN_VALUE)) { - return Timestamp.ZERO; - } - - if (this.isNegative()) { - if (other.isNegative()) { - return this.negate().div(other.negate()); - } else { - return this.negate().div(other).negate(); - } - } else if (other.isNegative()) { - return this.div(other.negate()).negate(); - } - - // Repeat the following until the remainder is less than other: find a - // floating-point that approximates remainder / other *from below*, add this - // into the result, and subtract it from the remainder. It is critical that - // the approximate value is less than or equal to the real value so that the - // remainder never becomes negative. - var res = Timestamp.ZERO; - var rem = this; - while (rem.greaterThanOrEqual(other)) { - // Approximate the result of division. This may be a little greater or - // smaller than the actual value. - var approx = Math.max(1, Math.floor(rem.toNumber() / other.toNumber())); - - // We will tweak the approximate result by changing it in the 48-th digit or - // the smallest non-fractional digit, whichever is larger. - var log2 = Math.ceil(Math.log(approx) / Math.LN2); - var delta = (log2 <= 48) ? 1 : Math.pow(2, log2 - 48); - - // Decrease the approximation until it is smaller than the remainder. Note - // that if it is too large, the product overflows and is negative. - var approxRes = Timestamp.fromNumber(approx); - var approxRem = approxRes.multiply(other); - while (approxRem.isNegative() || approxRem.greaterThan(rem)) { - approx -= delta; - approxRes = Timestamp.fromNumber(approx); - approxRem = approxRes.multiply(other); - } - - // We know the answer can't be zero... and actually, zero would cause - // infinite recursion since we would make no progress. - if (approxRes.isZero()) { - approxRes = Timestamp.ONE; - } - - res = res.add(approxRes); - rem = rem.subtract(approxRem); - } - return res; -}; - -/** - * Returns this Timestamp modulo the given one. - * - * @param {Timestamp} other Timestamp by which to mod. - * @return {Timestamp} this Timestamp modulo the given one. - * @api public - */ -Timestamp.prototype.modulo = function(other) { - return this.subtract(this.div(other).multiply(other)); -}; - -/** - * The bitwise-NOT of this value. - * - * @return {Timestamp} the bitwise-NOT of this value. - * @api public - */ -Timestamp.prototype.not = function() { - return Timestamp.fromBits(~this.low_, ~this.high_); -}; - -/** - * Returns the bitwise-AND of this Timestamp and the given one. - * - * @param {Timestamp} other the Timestamp with which to AND. - * @return {Timestamp} the bitwise-AND of this and the other. - * @api public - */ -Timestamp.prototype.and = function(other) { - return Timestamp.fromBits(this.low_ & other.low_, this.high_ & other.high_); -}; - -/** - * Returns the bitwise-OR of this Timestamp and the given one. - * - * @param {Timestamp} other the Timestamp with which to OR. - * @return {Timestamp} the bitwise-OR of this and the other. - * @api public - */ -Timestamp.prototype.or = function(other) { - return Timestamp.fromBits(this.low_ | other.low_, this.high_ | other.high_); -}; - -/** - * Returns the bitwise-XOR of this Timestamp and the given one. - * - * @param {Timestamp} other the Timestamp with which to XOR. - * @return {Timestamp} the bitwise-XOR of this and the other. - * @api public - */ -Timestamp.prototype.xor = function(other) { - return Timestamp.fromBits(this.low_ ^ other.low_, this.high_ ^ other.high_); -}; - -/** - * Returns this Timestamp with bits shifted to the left by the given amount. - * - * @param {Number} numBits the number of bits by which to shift. - * @return {Timestamp} this shifted to the left by the given amount. - * @api public - */ -Timestamp.prototype.shiftLeft = function(numBits) { - numBits &= 63; - if (numBits == 0) { - return this; - } else { - var low = this.low_; - if (numBits < 32) { - var high = this.high_; - return Timestamp.fromBits( - low << numBits, - (high << numBits) | (low >>> (32 - numBits))); - } else { - return Timestamp.fromBits(0, low << (numBits - 32)); - } - } -}; - -/** - * Returns this Timestamp with bits shifted to the right by the given amount. - * - * @param {Number} numBits the number of bits by which to shift. - * @return {Timestamp} this shifted to the right by the given amount. - * @api public - */ -Timestamp.prototype.shiftRight = function(numBits) { - numBits &= 63; - if (numBits == 0) { - return this; - } else { - var high = this.high_; - if (numBits < 32) { - var low = this.low_; - return Timestamp.fromBits( - (low >>> numBits) | (high << (32 - numBits)), - high >> numBits); - } else { - return Timestamp.fromBits( - high >> (numBits - 32), - high >= 0 ? 0 : -1); - } - } -}; - -/** - * Returns this Timestamp with bits shifted to the right by the given amount, with the new top bits matching the current sign bit. - * - * @param {Number} numBits the number of bits by which to shift. - * @return {Timestamp} this shifted to the right by the given amount, with zeros placed into the new leading bits. - * @api public - */ -Timestamp.prototype.shiftRightUnsigned = function(numBits) { - numBits &= 63; - if (numBits == 0) { - return this; - } else { - var high = this.high_; - if (numBits < 32) { - var low = this.low_; - return Timestamp.fromBits( - (low >>> numBits) | (high << (32 - numBits)), - high >>> numBits); - } else if (numBits == 32) { - return Timestamp.fromBits(high, 0); - } else { - return Timestamp.fromBits(high >>> (numBits - 32), 0); - } - } -}; - -/** - * Returns a Timestamp representing the given (32-bit) integer value. - * - * @param {Number} value the 32-bit integer in question. - * @return {Timestamp} the corresponding Timestamp value. - * @api public - */ -Timestamp.fromInt = function(value) { - if (-128 <= value && value < 128) { - var cachedObj = Timestamp.INT_CACHE_[value]; - if (cachedObj) { - return cachedObj; - } - } - - var obj = new Timestamp(value | 0, value < 0 ? -1 : 0); - if (-128 <= value && value < 128) { - Timestamp.INT_CACHE_[value] = obj; - } - return obj; -}; - -/** - * Returns a Timestamp representing the given value, provided that it is a finite number. Otherwise, zero is returned. - * - * @param {Number} value the number in question. - * @return {Timestamp} the corresponding Timestamp value. - * @api public - */ -Timestamp.fromNumber = function(value) { - if (isNaN(value) || !isFinite(value)) { - return Timestamp.ZERO; - } else if (value <= -Timestamp.TWO_PWR_63_DBL_) { - return Timestamp.MIN_VALUE; - } else if (value + 1 >= Timestamp.TWO_PWR_63_DBL_) { - return Timestamp.MAX_VALUE; - } else if (value < 0) { - return Timestamp.fromNumber(-value).negate(); - } else { - return new Timestamp( - (value % Timestamp.TWO_PWR_32_DBL_) | 0, - (value / Timestamp.TWO_PWR_32_DBL_) | 0); - } -}; - -/** - * Returns a Timestamp representing the 64-bit integer that comes by concatenating the given high and low bits. Each is assumed to use 32 bits. - * - * @param {Number} lowBits the low 32-bits. - * @param {Number} highBits the high 32-bits. - * @return {Timestamp} the corresponding Timestamp value. - * @api public - */ -Timestamp.fromBits = function(lowBits, highBits) { - return new Timestamp(lowBits, highBits); -}; - -/** - * Returns a Timestamp representation of the given string, written using the given radix. - * - * @param {String} str the textual representation of the Timestamp. - * @param {Number} opt_radix the radix in which the text is written. - * @return {Timestamp} the corresponding Timestamp value. - * @api public - */ -Timestamp.fromString = function(str, opt_radix) { - if (str.length == 0) { - throw Error('number format error: empty string'); - } - - var radix = opt_radix || 10; - if (radix < 2 || 36 < radix) { - throw Error('radix out of range: ' + radix); - } - - if (str.charAt(0) == '-') { - return Timestamp.fromString(str.substring(1), radix).negate(); - } else if (str.indexOf('-') >= 0) { - throw Error('number format error: interior "-" character: ' + str); - } - - // Do several (8) digits each time through the loop, so as to - // minimize the calls to the very expensive emulated div. - var radixToPower = Timestamp.fromNumber(Math.pow(radix, 8)); - - var result = Timestamp.ZERO; - for (var i = 0; i < str.length; i += 8) { - var size = Math.min(8, str.length - i); - var value = parseInt(str.substring(i, i + size), radix); - if (size < 8) { - var power = Timestamp.fromNumber(Math.pow(radix, size)); - result = result.multiply(power).add(Timestamp.fromNumber(value)); - } else { - result = result.multiply(radixToPower); - result = result.add(Timestamp.fromNumber(value)); - } - } - return result; -}; - -// NOTE: Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the -// from* methods on which they depend. - - -/** - * A cache of the Timestamp representations of small integer values. - * @type {Object} - * @api private - */ -Timestamp.INT_CACHE_ = {}; - -// NOTE: the compiler should inline these constant values below and then remove -// these variables, so there should be no runtime penalty for these. - -/** - * Number used repeated below in calculations. This must appear before the - * first call to any from* function below. - * @type {number} - * @api private - */ -Timestamp.TWO_PWR_16_DBL_ = 1 << 16; - -/** - * @type {number} - * @api private - */ -Timestamp.TWO_PWR_24_DBL_ = 1 << 24; - -/** - * @type {number} - * @api private - */ -Timestamp.TWO_PWR_32_DBL_ = Timestamp.TWO_PWR_16_DBL_ * Timestamp.TWO_PWR_16_DBL_; - -/** - * @type {number} - * @api private - */ -Timestamp.TWO_PWR_31_DBL_ = Timestamp.TWO_PWR_32_DBL_ / 2; - -/** - * @type {number} - * @api private - */ -Timestamp.TWO_PWR_48_DBL_ = Timestamp.TWO_PWR_32_DBL_ * Timestamp.TWO_PWR_16_DBL_; - -/** - * @type {number} - * @api private - */ -Timestamp.TWO_PWR_64_DBL_ = Timestamp.TWO_PWR_32_DBL_ * Timestamp.TWO_PWR_32_DBL_; - -/** - * @type {number} - * @api private - */ -Timestamp.TWO_PWR_63_DBL_ = Timestamp.TWO_PWR_64_DBL_ / 2; - -/** @type {Timestamp} */ -Timestamp.ZERO = Timestamp.fromInt(0); - -/** @type {Timestamp} */ -Timestamp.ONE = Timestamp.fromInt(1); - -/** @type {Timestamp} */ -Timestamp.NEG_ONE = Timestamp.fromInt(-1); - -/** @type {Timestamp} */ -Timestamp.MAX_VALUE = - Timestamp.fromBits(0xFFFFFFFF | 0, 0x7FFFFFFF | 0); - -/** @type {Timestamp} */ -Timestamp.MIN_VALUE = Timestamp.fromBits(0, 0x80000000 | 0); - -/** - * @type {Timestamp} - * @api private - */ -Timestamp.TWO_PWR_24_ = Timestamp.fromInt(1 << 24); - -/** - * Expose. - */ -exports.Timestamp = Timestamp; -}, - - }); - - -if(typeof module != 'undefined' && module.exports ){ - module.exports = bson; - - if( !module.parent ){ - bson(); - } -} diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/browser_build/package.json b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/browser_build/package.json deleted file mode 100644 index 3ebb587..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/browser_build/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ "name" : "bson" -, "description" : "A bson parser for node.js and the browser" -, "main": "../lib/bson/bson" -, "directories" : { "lib" : "../lib/bson" } -, "engines" : { "node" : ">=0.6.0" } -, "licenses" : [ { "type" : "Apache License, Version 2.0" - , "url" : "http://www.apache.org/licenses/LICENSE-2.0" } ] -} diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/Makefile b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/Makefile deleted file mode 100644 index df1f2e0..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/Makefile +++ /dev/null @@ -1,359 +0,0 @@ -# We borrow heavily from the kernel build setup, though we are simpler since -# we don't have Kconfig tweaking settings on us. - -# The implicit make rules have it looking for RCS files, among other things. -# We instead explicitly write all the rules we care about. -# It's even quicker (saves ~200ms) to pass -r on the command line. -MAKEFLAGS=-r - -# The source directory tree. -srcdir := .. -abs_srcdir := $(abspath $(srcdir)) - -# The name of the builddir. -builddir_name ?= . - -# The V=1 flag on command line makes us verbosely print command lines. -ifdef V - quiet= -else - quiet=quiet_ -endif - -# Specify BUILDTYPE=Release on the command line for a release build. -BUILDTYPE ?= Release - -# Directory all our build output goes into. -# Note that this must be two directories beneath src/ for unit tests to pass, -# as they reach into the src/ directory for data with relative paths. -builddir ?= $(builddir_name)/$(BUILDTYPE) -abs_builddir := $(abspath $(builddir)) -depsdir := $(builddir)/.deps - -# Object output directory. -obj := $(builddir)/obj -abs_obj := $(abspath $(obj)) - -# We build up a list of every single one of the targets so we can slurp in the -# generated dependency rule Makefiles in one pass. -all_deps := - - - -# C++ apps need to be linked with g++. -# -# Note: flock is used to seralize linking. Linking is a memory-intensive -# process so running parallel links can often lead to thrashing. To disable -# the serialization, override LINK via an envrionment variable as follows: -# -# export LINK=g++ -# -# This will allow make to invoke N linker processes as specified in -jN. -LINK ?= ./gyp-mac-tool flock $(builddir)/linker.lock $(CXX) - -CC.target ?= $(CC) -CFLAGS.target ?= $(CFLAGS) -CXX.target ?= $(CXX) -CXXFLAGS.target ?= $(CXXFLAGS) -LINK.target ?= $(LINK) -LDFLAGS.target ?= $(LDFLAGS) -AR.target ?= $(AR) -ARFLAGS.target ?= crs - -# N.B.: the logic of which commands to run should match the computation done -# in gyp's make.py where ARFLAGS.host etc. is computed. -# TODO(evan): move all cross-compilation logic to gyp-time so we don't need -# to replicate this environment fallback in make as well. -CC.host ?= gcc -CFLAGS.host ?= -CXX.host ?= g++ -CXXFLAGS.host ?= -LINK.host ?= g++ -LDFLAGS.host ?= -AR.host ?= ar -ARFLAGS.host := crs - -# Define a dir function that can handle spaces. -# http://www.gnu.org/software/make/manual/make.html#Syntax-of-Functions -# "leading spaces cannot appear in the text of the first argument as written. -# These characters can be put into the argument value by variable substitution." -empty := -space := $(empty) $(empty) - -# http://stackoverflow.com/questions/1189781/using-make-dir-or-notdir-on-a-path-with-spaces -replace_spaces = $(subst $(space),?,$1) -unreplace_spaces = $(subst ?,$(space),$1) -dirx = $(call unreplace_spaces,$(dir $(call replace_spaces,$1))) - -# Flags to make gcc output dependency info. Note that you need to be -# careful here to use the flags that ccache and distcc can understand. -# We write to a dep file on the side first and then rename at the end -# so we can't end up with a broken dep file. -depfile = $(depsdir)/$(call replace_spaces,$@).d -DEPFLAGS = -MMD -MF $(depfile).raw - -# We have to fixup the deps output in a few ways. -# (1) the file output should mention the proper .o file. -# ccache or distcc lose the path to the target, so we convert a rule of -# the form: -# foobar.o: DEP1 DEP2 -# into -# path/to/foobar.o: DEP1 DEP2 -# (2) we want missing files not to cause us to fail to build. -# We want to rewrite -# foobar.o: DEP1 DEP2 \ -# DEP3 -# to -# DEP1: -# DEP2: -# DEP3: -# so if the files are missing, they're just considered phony rules. -# We have to do some pretty insane escaping to get those backslashes -# and dollar signs past make, the shell, and sed at the same time. -# Doesn't work with spaces, but that's fine: .d files have spaces in -# their names replaced with other characters. -define fixup_dep -# The depfile may not exist if the input file didn't have any #includes. -touch $(depfile).raw -# Fixup path as in (1). -sed -e "s|^$(notdir $@)|$@|" $(depfile).raw >> $(depfile) -# Add extra rules as in (2). -# We remove slashes and replace spaces with new lines; -# remove blank lines; -# delete the first line and append a colon to the remaining lines. -sed -e 's|\\||' -e 'y| |\n|' $(depfile).raw |\ - grep -v '^$$' |\ - sed -e 1d -e 's|$$|:|' \ - >> $(depfile) -rm $(depfile).raw -endef - -# Command definitions: -# - cmd_foo is the actual command to run; -# - quiet_cmd_foo is the brief-output summary of the command. - -quiet_cmd_cc = CC($(TOOLSET)) $@ -cmd_cc = $(CC.$(TOOLSET)) $(GYP_CFLAGS) $(DEPFLAGS) $(CFLAGS.$(TOOLSET)) -c -o $@ $< - -quiet_cmd_cxx = CXX($(TOOLSET)) $@ -cmd_cxx = $(CXX.$(TOOLSET)) $(GYP_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< - -quiet_cmd_objc = CXX($(TOOLSET)) $@ -cmd_objc = $(CC.$(TOOLSET)) $(GYP_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< - -quiet_cmd_objcxx = CXX($(TOOLSET)) $@ -cmd_objcxx = $(CXX.$(TOOLSET)) $(GYP_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< - -# Commands for precompiled header files. -quiet_cmd_pch_c = CXX($(TOOLSET)) $@ -cmd_pch_c = $(CC.$(TOOLSET)) $(GYP_PCH_CFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< -quiet_cmd_pch_cc = CXX($(TOOLSET)) $@ -cmd_pch_cc = $(CC.$(TOOLSET)) $(GYP_PCH_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< -quiet_cmd_pch_m = CXX($(TOOLSET)) $@ -cmd_pch_m = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< -quiet_cmd_pch_mm = CXX($(TOOLSET)) $@ -cmd_pch_mm = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< - -# gyp-mac-tool is written next to the root Makefile by gyp. -# Use $(4) for the command, since $(2) and $(3) are used as flag by do_cmd -# already. -quiet_cmd_mac_tool = MACTOOL $(4) $< -cmd_mac_tool = ./gyp-mac-tool $(4) $< "$@" - -quiet_cmd_mac_package_framework = PACKAGE FRAMEWORK $@ -cmd_mac_package_framework = ./gyp-mac-tool package-framework "$@" $(4) - -quiet_cmd_infoplist = INFOPLIST $@ -cmd_infoplist = $(CC.$(TOOLSET)) -E -P -Wno-trigraphs -x c $(INFOPLIST_DEFINES) "$<" -o "$@" - -quiet_cmd_touch = TOUCH $@ -cmd_touch = touch $@ - -quiet_cmd_copy = COPY $@ -# send stderr to /dev/null to ignore messages when linking directories. -cmd_copy = ln -f "$<" "$@" 2>/dev/null || (rm -rf "$@" && cp -af "$<" "$@") - -quiet_cmd_alink = LIBTOOL-STATIC $@ -cmd_alink = rm -f $@ && ./gyp-mac-tool filter-libtool libtool -static -o $@ $(filter %.o,$^) - -quiet_cmd_link = LINK($(TOOLSET)) $@ -cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) - -# TODO(thakis): Find out and document the difference between shared_library and -# loadable_module on mac. -quiet_cmd_solink = SOLINK($(TOOLSET)) $@ -cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) - -# TODO(thakis): The solink_module rule is likely wrong. Xcode seems to pass -# -bundle -single_module here (for osmesa.so). -quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@ -cmd_solink_module = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS) - - -# Define an escape_quotes function to escape single quotes. -# This allows us to handle quotes properly as long as we always use -# use single quotes and escape_quotes. -escape_quotes = $(subst ','\'',$(1)) -# This comment is here just to include a ' to unconfuse syntax highlighting. -# Define an escape_vars function to escape '$' variable syntax. -# This allows us to read/write command lines with shell variables (e.g. -# $LD_LIBRARY_PATH), without triggering make substitution. -escape_vars = $(subst $$,$$$$,$(1)) -# Helper that expands to a shell command to echo a string exactly as it is in -# make. This uses printf instead of echo because printf's behaviour with respect -# to escape sequences is more portable than echo's across different shells -# (e.g., dash, bash). -exact_echo = printf '%s\n' '$(call escape_quotes,$(1))' - -# Helper to compare the command we're about to run against the command -# we logged the last time we ran the command. Produces an empty -# string (false) when the commands match. -# Tricky point: Make has no string-equality test function. -# The kernel uses the following, but it seems like it would have false -# positives, where one string reordered its arguments. -# arg_check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \ -# $(filter-out $(cmd_$@), $(cmd_$(1)))) -# We instead substitute each for the empty string into the other, and -# say they're equal if both substitutions produce the empty string. -# .d files contain ? instead of spaces, take that into account. -command_changed = $(or $(subst $(cmd_$(1)),,$(cmd_$(call replace_spaces,$@))),\ - $(subst $(cmd_$(call replace_spaces,$@)),,$(cmd_$(1)))) - -# Helper that is non-empty when a prerequisite changes. -# Normally make does this implicitly, but we force rules to always run -# so we can check their command lines. -# $? -- new prerequisites -# $| -- order-only dependencies -prereq_changed = $(filter-out FORCE_DO_CMD,$(filter-out $|,$?)) - -# Helper that executes all postbuilds, and deletes the output file when done -# if any of the postbuilds failed. -define do_postbuilds - @E=0;\ - for p in $(POSTBUILDS); do\ - eval $$p;\ - F=$$?;\ - if [ $$F -ne 0 ]; then\ - E=$$F;\ - fi;\ - done;\ - if [ $$E -ne 0 ]; then\ - rm -rf "$@";\ - exit $$E;\ - fi -endef - -# do_cmd: run a command via the above cmd_foo names, if necessary. -# Should always run for a given target to handle command-line changes. -# Second argument, if non-zero, makes it do asm/C/C++ dependency munging. -# Third argument, if non-zero, makes it do POSTBUILDS processing. -# Note: We intentionally do NOT call dirx for depfile, since it contains ? for -# spaces already and dirx strips the ? characters. -define do_cmd -$(if $(or $(command_changed),$(prereq_changed)), - @$(call exact_echo, $($(quiet)cmd_$(1))) - @mkdir -p "$(call dirx,$@)" "$(dir $(depfile))" - $(if $(findstring flock,$(word 2,$(cmd_$1))), - @$(cmd_$(1)) - @echo " $(quiet_cmd_$(1)): Finished", - @$(cmd_$(1)) - ) - @$(call exact_echo,$(call escape_vars,cmd_$(call replace_spaces,$@) := $(cmd_$(1)))) > $(depfile) - @$(if $(2),$(fixup_dep)) - $(if $(and $(3), $(POSTBUILDS)), - $(call do_postbuilds) - ) -) -endef - -# Declare the "all" target first so it is the default, -# even though we don't have the deps yet. -.PHONY: all -all: - -# make looks for ways to re-generate included makefiles, but in our case, we -# don't have a direct way. Explicitly telling make that it has nothing to do -# for them makes it go faster. -%.d: ; - -# Use FORCE_DO_CMD to force a target to run. Should be coupled with -# do_cmd. -.PHONY: FORCE_DO_CMD -FORCE_DO_CMD: - -TOOLSET := target -# Suffix rules, putting all outputs into $(obj). -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.c FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cpp FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cxx FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.m FORCE_DO_CMD - @$(call do_cmd,objc,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.mm FORCE_DO_CMD - @$(call do_cmd,objcxx,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.S FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.s FORCE_DO_CMD - @$(call do_cmd,cc,1) - -# Try building from generated source, too. -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.c FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cpp FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cxx FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.m FORCE_DO_CMD - @$(call do_cmd,objc,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.mm FORCE_DO_CMD - @$(call do_cmd,objcxx,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.S FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.s FORCE_DO_CMD - @$(call do_cmd,cc,1) - -$(obj).$(TOOLSET)/%.o: $(obj)/%.c FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.cpp FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.cxx FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.m FORCE_DO_CMD - @$(call do_cmd,objc,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.mm FORCE_DO_CMD - @$(call do_cmd,objcxx,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.S FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.s FORCE_DO_CMD - @$(call do_cmd,cc,1) - - -ifeq ($(strip $(foreach prefix,$(NO_LOAD),\ - $(findstring $(join ^,$(prefix)),\ - $(join ^,bson.target.mk)))),) - include bson.target.mk -endif - -quiet_cmd_regen_makefile = ACTION Regenerating $@ -cmd_regen_makefile = /Users/jfolsom/.node-gyp/0.8.8/tools/gyp/gyp -fmake --ignore-environment "--toplevel-dir=." -I/Users/jfolsom/repos/ana/node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/config.gypi -I/usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi -I/Users/jfolsom/.node-gyp/0.8.8/common.gypi "--depth=." "-Goutput_dir=." "--generator-output=build" "-Dlibrary=shared_library" "-Dvisibility=default" "-Dnode_root_dir=/Users/jfolsom/.node-gyp/0.8.8" "-Dmodule_root_dir=/Users/jfolsom/repos/ana/node_modules/mongoose/node_modules/mongodb/node_modules/bson" binding.gyp -Makefile: $(srcdir)/../../../../../../../../.node-gyp/0.8.8/common.gypi $(srcdir)/build/config.gypi $(srcdir)/binding.gyp $(srcdir)/../../../../../../../../../../usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi - $(call do_cmd,regen_makefile) - -# "all" is a concatenation of the "all" targets from all the included -# sub-makefiles. This is just here to clarify. -all: - -# Add in dependency-tracking rules. $(all_deps) is the list of every single -# target in our tree. Only consider the ones with .d (dependency) info: -d_files := $(wildcard $(foreach f,$(all_deps),$(depsdir)/$(f).d)) -ifneq ($(d_files),) - include $(d_files) -endif diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/Release/.deps/Release/bson.node.d b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/Release/.deps/Release/bson.node.d deleted file mode 100644 index 20963f4..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/Release/.deps/Release/bson.node.d +++ /dev/null @@ -1 +0,0 @@ -cmd_Release/bson.node := ./gyp-mac-tool flock ./Release/linker.lock c++ -shared -Wl,-search_paths_first -mmacosx-version-min=10.5 -arch x86_64 -L./Release -install_name /usr/local/lib/bson.node -o Release/bson.node Release/obj.target/bson/ext/bson.o -undefined dynamic_lookup diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/Release/.deps/Release/obj.target/bson/ext/bson.o.d b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/Release/.deps/Release/obj.target/bson/ext/bson.o.d deleted file mode 100644 index 41fdb5d..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/Release/.deps/Release/obj.target/bson/ext/bson.o.d +++ /dev/null @@ -1,34 +0,0 @@ -cmd_Release/obj.target/bson/ext/bson.o := c++ '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-D_DARWIN_USE_64_BIT_INODE=1' -I/Users/jfolsom/.node-gyp/0.8.8/src -I/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include -I/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include -Os -gdwarf-2 -mmacosx-version-min=10.5 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-rtti -fno-threadsafe-statics -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/bson/ext/bson.o.d.raw -c -o Release/obj.target/bson/ext/bson.o ../ext/bson.cc -Release/obj.target/bson/ext/bson.o: ../ext/bson.cc \ - /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/node.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares_version.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/uv-unix.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ngx-queue.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ev.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/eio.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/node_object_wrap.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/ev-emul.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/eio-emul.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/node_version.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/node_buffer.h ../ext/bson.h -../ext/bson.cc: -/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h: -/Users/jfolsom/.node-gyp/0.8.8/src/node.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares_version.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/uv-unix.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ngx-queue.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ev.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/eio.h: -/Users/jfolsom/.node-gyp/0.8.8/src/node_object_wrap.h: -/Users/jfolsom/.node-gyp/0.8.8/src/ev-emul.h: -/Users/jfolsom/.node-gyp/0.8.8/src/eio-emul.h: -/Users/jfolsom/.node-gyp/0.8.8/src/node_version.h: -/Users/jfolsom/.node-gyp/0.8.8/src/node_buffer.h: -../ext/bson.h: diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/Release/bson.node b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/build/Release/bson.node deleted file mode 100755 index d578d5b5cc12555f4a1cb40bc54a4b33d6b32c52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49508 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 -#include -#include -#include -#include - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunused-parameter" -#endif - -#include - -// this and the above block must be around the v8.h header otherwise -// v8 is not happy -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -#include -#include -#include - -#include -#include -#include -#include - -#ifdef __sun - #include -#endif - -#include "bson.h" - -using namespace v8; -using namespace node; - -//=========================================================================== - -void DataStream::WriteObjectId(const Handle& object, const Handle& key) -{ - uint16_t buffer[12]; - object->Get(key)->ToString()->Write(buffer, 0, 12); - for(uint32_t i = 0; i < 12; ++i) - { - *p++ = (char) buffer[i]; - } -} - -void ThrowAllocatedStringException(size_t allocationSize, const char* format, ...) -{ - va_list args; - va_start(args, format); - char* string = (char*) malloc(allocationSize); - vsprintf(string, format, args); - va_end(args); - - throw string; -} - -void DataStream::CheckKey(const Local& keyName) -{ - size_t keyLength = keyName->Utf8Length(); - if(keyLength == 0) return; - - char* keyStringBuffer = (char*) alloca(keyLength+1); - keyName->WriteUtf8(keyStringBuffer); - - if(keyStringBuffer[0] == '$') - { - ThrowAllocatedStringException(64+keyLength, "key %s must not start with '$'", keyStringBuffer); - } - - if(strchr(keyStringBuffer, '.') != NULL) - { - ThrowAllocatedStringException(64+keyLength, "key %s must not contain '.'", keyStringBuffer); - } -} - -template void BSONSerializer::SerializeDocument(const Handle& value) -{ - void* documentSize = this->BeginWriteSize(); - Local object = bson->GetSerializeObject(value); - - // Get the object property names - #if NODE_MAJOR_VERSION == 0 && NODE_MINOR_VERSION < 6 - Local propertyNames = object->GetPropertyNames(); - #else - Local propertyNames = object->GetOwnPropertyNames(); - #endif - - // Length of the property - int propertyLength = propertyNames->Length(); - for(int i = 0; i < propertyLength; ++i) - { - const Local& propertyName = propertyNames->Get(i)->ToString(); - if(checkKeys) this->CheckKey(propertyName); - - const Local& propertyValue = object->Get(propertyName); - - if(serializeFunctions || !propertyValue->IsFunction()) - { - void* typeLocation = this->BeginWriteType(); - this->WriteString(propertyName); - SerializeValue(typeLocation, propertyValue); - } - } - - this->WriteByte(0); - this->CommitSize(documentSize); -} - -template void BSONSerializer::SerializeArray(const Handle& value) -{ - void* documentSize = this->BeginWriteSize(); - - Local array = Local::Cast(value->ToObject()); - uint32_t arrayLength = array->Length(); - - for(uint32_t i = 0; i < arrayLength; ++i) - { - void* typeLocation = this->BeginWriteType(); - this->WriteUInt32String(i); - SerializeValue(typeLocation, array->Get(i)); - } - - this->WriteByte(0); - this->CommitSize(documentSize); -} - -// This is templated so that we can use this function to both count the number of bytes, and to serialize those bytes. -// The template approach eliminates almost all of the inspection of values unless they're required (eg. string lengths) -// and ensures that there is always consistency between bytes counted and bytes written by design. -template void BSONSerializer::SerializeValue(void* typeLocation, const Handle& value) -{ - if(value->IsNumber()) - { - double doubleValue = value->NumberValue(); - int intValue = (int) doubleValue; - if(intValue == doubleValue) - { - this->CommitType(typeLocation, BSON_TYPE_INT); - this->WriteInt32(intValue); - } - else - { - this->CommitType(typeLocation, BSON_TYPE_NUMBER); - this->WriteDouble(doubleValue); - } - } - else if(value->IsString()) - { - this->CommitType(typeLocation, BSON_TYPE_STRING); - this->WriteLengthPrefixedString(value->ToString()); - } - else if(value->IsBoolean()) - { - this->CommitType(typeLocation, BSON_TYPE_BOOLEAN); - this->WriteBool(value); - } - else if(value->IsArray()) - { - this->CommitType(typeLocation, BSON_TYPE_ARRAY); - SerializeArray(value); - } - else if(value->IsDate()) - { - this->CommitType(typeLocation, BSON_TYPE_DATE); - this->WriteInt64(value); - } - else if(value->IsRegExp()) - { - this->CommitType(typeLocation, BSON_TYPE_REGEXP); - const Handle& regExp = Handle::Cast(value); - - this->WriteString(regExp->GetSource()); - - int flags = regExp->GetFlags(); - if(flags & RegExp::kGlobal) this->WriteByte('s'); - if(flags & RegExp::kIgnoreCase) this->WriteByte('i'); - if(flags & RegExp::kMultiline) this->WriteByte('m'); - this->WriteByte(0); - } - else if(value->IsFunction()) - { - this->CommitType(typeLocation, BSON_TYPE_CODE); - this->WriteLengthPrefixedString(value->ToString()); - } - else if(value->IsObject()) - { - const Local& object = value->ToObject(); - if(object->Has(bson->_bsontypeString)) - { - const Local& constructorString = object->GetConstructorName(); - if(bson->longString->StrictEquals(constructorString)) - { - this->CommitType(typeLocation, BSON_TYPE_LONG); - this->WriteInt32(object, bson->_longLowString); - this->WriteInt32(object, bson->_longHighString); - } - else if(bson->timestampString->StrictEquals(constructorString)) - { - this->CommitType(typeLocation, BSON_TYPE_TIMESTAMP); - this->WriteInt32(object, bson->_longLowString); - this->WriteInt32(object, bson->_longHighString); - } - else if(bson->objectIDString->StrictEquals(constructorString)) - { - this->CommitType(typeLocation, BSON_TYPE_OID); - this->WriteObjectId(object, bson->_objectIDidString); - } - else if(bson->binaryString->StrictEquals(constructorString)) - { - this->CommitType(typeLocation, BSON_TYPE_BINARY); - - uint32_t length = object->Get(bson->_binaryPositionString)->Uint32Value(); - Local bufferObj = object->Get(bson->_binaryBufferString)->ToObject(); - - this->WriteInt32(length); - this->WriteByte(object, bson->_binarySubTypeString); // write subtype - // If type 0x02 write the array length aswell - if(object->Get(bson->_binarySubTypeString)->Int32Value() == 0x02) { - this->WriteInt32(length); - } - // Write the actual data - this->WriteData(Buffer::Data(bufferObj), length); - } - else if(bson->doubleString->StrictEquals(constructorString)) - { - this->CommitType(typeLocation, BSON_TYPE_NUMBER); - this->WriteDouble(object, bson->_doubleValueString); - } - else if(bson->symbolString->StrictEquals(constructorString)) - { - this->CommitType(typeLocation, BSON_TYPE_SYMBOL); - this->WriteLengthPrefixedString(object->Get(bson->_symbolValueString)->ToString()); - } - else if(bson->codeString->StrictEquals(constructorString)) - { - const Local& function = object->Get(bson->_codeCodeString)->ToString(); - const Local& scope = object->Get(bson->_codeScopeString)->ToObject(); - - // For Node < 0.6.X use the GetPropertyNames - #if NODE_MAJOR_VERSION == 0 && NODE_MINOR_VERSION < 6 - uint32_t propertyNameLength = scope->GetPropertyNames()->Length(); - #else - uint32_t propertyNameLength = scope->GetOwnPropertyNames()->Length(); - #endif - - if(propertyNameLength > 0) - { - this->CommitType(typeLocation, BSON_TYPE_CODE_W_SCOPE); - void* codeWidthScopeSize = this->BeginWriteSize(); - this->WriteLengthPrefixedString(function->ToString()); - SerializeDocument(scope); - this->CommitSize(codeWidthScopeSize); - } - else - { - this->CommitType(typeLocation, BSON_TYPE_CODE); - this->WriteLengthPrefixedString(function->ToString()); - } - } - else if(bson->dbrefString->StrictEquals(constructorString)) - { - this->CommitType(typeLocation, BSON_TYPE_OBJECT); - - void* dbRefSize = this->BeginWriteSize(); - - void* refType = this->BeginWriteType(); - this->WriteData("$ref", 5); - SerializeValue(refType, object->Get(bson->_dbRefNamespaceString)); - - void* idType = this->BeginWriteType(); - this->WriteData("$id", 4); - SerializeValue(idType, object->Get(bson->_dbRefOidString)); - - const Local& refDbValue = object->Get(bson->_dbRefDbString); - if(!refDbValue->IsUndefined()) - { - void* dbType = this->BeginWriteType(); - this->WriteData("$db", 4); - SerializeValue(dbType, refDbValue); - } - - this->WriteByte(0); - this->CommitSize(dbRefSize); - } - else if(bson->minKeyString->StrictEquals(constructorString)) - { - this->CommitType(typeLocation, BSON_TYPE_MIN_KEY); - } - else if(bson->maxKeyString->StrictEquals(constructorString)) - { - this->CommitType(typeLocation, BSON_TYPE_MAX_KEY); - } - } - else if(Buffer::HasInstance(value)) - { - this->CommitType(typeLocation, BSON_TYPE_BINARY); - - #if NODE_MAJOR_VERSION == 0 && NODE_MINOR_VERSION < 3 - Buffer *buffer = ObjectWrap::Unwrap(value->ToObject()); - uint32_t length = object->length(); - #else - uint32_t length = Buffer::Length(value->ToObject()); - #endif - - this->WriteInt32(length); - this->WriteByte(0); - this->WriteData(Buffer::Data(value->ToObject()), length); - } - else - { - this->CommitType(typeLocation, BSON_TYPE_OBJECT); - SerializeDocument(value); - } - } - else if(value->IsNull() || value->IsUndefined()) - { - this->CommitType(typeLocation, BSON_TYPE_NULL); - } -} - -// Data points to start of element list, length is length of entire document including '\0' but excluding initial size -BSONDeserializer::BSONDeserializer(BSON* aBson, char* data, size_t length) -: bson(aBson), - pStart(data), - p(data), - pEnd(data + length - 1) -{ - if(*pEnd != '\0') ThrowAllocatedStringException(64, "Missing end of document marker '\\0'"); -} - -BSONDeserializer::BSONDeserializer(BSONDeserializer& parentSerializer, size_t length) -: bson(parentSerializer.bson), - pStart(parentSerializer.p), - p(parentSerializer.p), - pEnd(parentSerializer.p + length - 1) -{ - parentSerializer.p += length; - if(pEnd > parentSerializer.pEnd) ThrowAllocatedStringException(64, "Child document exceeds parent's bounds"); - if(*pEnd != '\0') ThrowAllocatedStringException(64, "Missing end of document marker '\\0'"); -} - -Local BSONDeserializer::ReadCString() -{ - char* start = p; - while(*p++) { } - return String::New(start, (int32_t) (p-start-1) ); -} - -int32_t BSONDeserializer::ReadRegexOptions() -{ - int32_t options = 0; - for(;;) - { - switch(*p++) - { - case '\0': return options; - case 's': options |= RegExp::kGlobal; break; - case 'i': options |= RegExp::kIgnoreCase; break; - case 'm': options |= RegExp::kMultiline; break; - } - } -} - -uint32_t BSONDeserializer::ReadIntegerString() -{ - uint32_t value = 0; - while(*p) - { - if(*p < '0' || *p > '9') ThrowAllocatedStringException(64, "Invalid key for array"); - value = value * 10 + *p++ - '0'; - } - ++p; - return value; -} - -Local BSONDeserializer::ReadString() -{ - uint32_t length = ReadUInt32(); - char* start = p; - p += length; - return String::New(start, length-1); -} - -Local BSONDeserializer::ReadObjectId() -{ - uint16_t objectId[12]; - for(size_t i = 0; i < 12; ++i) - { - objectId[i] = *reinterpret_cast(p++); - } - return String::New(objectId, 12); -} - -Handle BSONDeserializer::DeserializeDocument() -{ - uint32_t length = ReadUInt32(); - if(length < 5) ThrowAllocatedStringException(64, "Bad BSON: Document is less than 5 bytes"); - - BSONDeserializer documentDeserializer(*this, length-4); - return documentDeserializer.DeserializeDocumentInternal(); -} - -Handle BSONDeserializer::DeserializeDocumentInternal() -{ - Local returnObject = Object::New(); - - while(HasMoreData()) - { - BsonType type = (BsonType) ReadByte(); - const Local& name = ReadCString(); - const Handle& value = DeserializeValue(type); - returnObject->ForceSet(name, value); - } - if(p != pEnd) ThrowAllocatedStringException(64, "Bad BSON Document: Serialize consumed unexpected number of bytes"); - - // From JavaScript: - // if(object['$id'] != null) object = new DBRef(object['$ref'], object['$id'], object['$db']); - if(returnObject->Has(bson->_dbRefIdRefString)) - { - Local argv[] = { returnObject->Get(bson->_dbRefRefString), returnObject->Get(bson->_dbRefIdRefString), returnObject->Get(bson->_dbRefDbRefString) }; - return bson->dbrefConstructor->NewInstance(3, argv); - } - else - { - return returnObject; - } -} - -Handle BSONDeserializer::DeserializeArray() -{ - uint32_t length = ReadUInt32(); - if(length < 5) ThrowAllocatedStringException(64, "Bad BSON: Array Document is less than 5 bytes"); - - BSONDeserializer documentDeserializer(*this, length-4); - return documentDeserializer.DeserializeArrayInternal(); -} - -Handle BSONDeserializer::DeserializeArrayInternal() -{ - Local returnArray = Array::New(); - - while(HasMoreData()) - { - BsonType type = (BsonType) ReadByte(); - uint32_t index = ReadIntegerString(); - const Handle& value = DeserializeValue(type); - returnArray->Set(index, value); - } - if(p != pEnd) ThrowAllocatedStringException(64, "Bad BSON Array: Serialize consumed unexpected number of bytes"); - - return returnArray; -} - -Handle BSONDeserializer::DeserializeValue(BsonType type) -{ - switch(type) - { - case BSON_TYPE_STRING: - return ReadString(); - - case BSON_TYPE_INT: - return Integer::New(ReadInt32()); - - case BSON_TYPE_NUMBER: - return Number::New(ReadDouble()); - - case BSON_TYPE_NULL: - return Null(); - - case BSON_TYPE_UNDEFINED: - return Undefined(); - - case BSON_TYPE_TIMESTAMP: - { - int32_t lowBits = ReadInt32(); - int32_t highBits = ReadInt32(); - Local argv[] = { Int32::New(lowBits), Int32::New(highBits) }; - return bson->timestampConstructor->NewInstance(2, argv); - } - - case BSON_TYPE_BOOLEAN: - return (ReadByte() != 0) ? True() : False(); - - case BSON_TYPE_REGEXP: - { - const Local& regex = ReadCString(); - int32_t options = ReadRegexOptions(); - return RegExp::New(regex, (RegExp::Flags) options); - } - - case BSON_TYPE_CODE: - { - const Local& code = ReadString(); - const Local& scope = Object::New(); - Local argv[] = { code, scope }; - return bson->codeConstructor->NewInstance(2, argv); - } - - case BSON_TYPE_CODE_W_SCOPE: - { - ReadUInt32(); - const Local& code = ReadString(); - const Handle& scope = DeserializeDocument(); - Local argv[] = { code, scope->ToObject() }; - return bson->codeConstructor->NewInstance(2, argv); - } - - case BSON_TYPE_OID: - { - Local argv[] = { ReadObjectId() }; - return bson->objectIDConstructor->NewInstance(1, argv); - } - - case BSON_TYPE_BINARY: - { - uint32_t length = ReadUInt32(); - uint32_t subType = ReadByte(); - if(subType == 0x02) { - length = ReadInt32(); - } - - Buffer* buffer = Buffer::New(p, length); - p += length; - - Handle argv[] = { buffer->handle_, Uint32::New(subType) }; - return bson->binaryConstructor->NewInstance(2, argv); - } - - case BSON_TYPE_LONG: - { - // Read 32 bit integers - int32_t lowBits = (int32_t) ReadInt32(); - int32_t highBits = (int32_t) ReadInt32(); - - // If value is < 2^53 and >-2^53 - if((highBits < 0x200000 || (highBits == 0x200000 && lowBits == 0)) && highBits >= -0x200000) { - // Adjust the pointer and read as 64 bit value - p -= 8; - // Read the 64 bit value - int64_t finalValue = (int64_t) ReadInt64(); - return Number::New(finalValue); - } - - Local argv[] = { Int32::New(lowBits), Int32::New(highBits) }; - return bson->longConstructor->NewInstance(2, argv); - } - - case BSON_TYPE_DATE: - return Date::New((double) ReadInt64()); - - case BSON_TYPE_ARRAY: - return DeserializeArray(); - - case BSON_TYPE_OBJECT: - return DeserializeDocument(); - - case BSON_TYPE_SYMBOL: - { - const Local& string = ReadString(); - Local argv[] = { string }; - return bson->symbolConstructor->NewInstance(1, argv); - } - - case BSON_TYPE_MIN_KEY: - return bson->minKeyConstructor->NewInstance(); - - case BSON_TYPE_MAX_KEY: - return bson->maxKeyConstructor->NewInstance(); - - default: - ThrowAllocatedStringException(64, "Unhandled BSON Type: %d", type); - } - - return v8::Null(); -} - - -static Handle VException(const char *msg) -{ - HandleScope scope; - return ThrowException(Exception::Error(String::New(msg))); -} - -Persistent BSON::constructor_template; - -BSON::BSON() : ObjectWrap() -{ - // Setup pre-allocated comparision objects - _bsontypeString = Persistent::New(String::New("_bsontype")); - _longLowString = Persistent::New(String::New("low_")); - _longHighString = Persistent::New(String::New("high_")); - _objectIDidString = Persistent::New(String::New("id")); - _binaryPositionString = Persistent::New(String::New("position")); - _binarySubTypeString = Persistent::New(String::New("sub_type")); - _binaryBufferString = Persistent::New(String::New("buffer")); - _doubleValueString = Persistent::New(String::New("value")); - _symbolValueString = Persistent::New(String::New("value")); - _dbRefRefString = Persistent::New(String::New("$ref")); - _dbRefIdRefString = Persistent::New(String::New("$id")); - _dbRefDbRefString = Persistent::New(String::New("$db")); - _dbRefNamespaceString = Persistent::New(String::New("namespace")); - _dbRefDbString = Persistent::New(String::New("db")); - _dbRefOidString = Persistent::New(String::New("oid")); - _codeCodeString = Persistent::New(String::New("code")); - _codeScopeString = Persistent::New(String::New("scope")); - _toBSONString = Persistent::New(String::New("toBSON")); - - longString = Persistent::New(String::New("Long")); - objectIDString = Persistent::New(String::New("ObjectID")); - binaryString = Persistent::New(String::New("Binary")); - codeString = Persistent::New(String::New("Code")); - dbrefString = Persistent::New(String::New("DBRef")); - symbolString = Persistent::New(String::New("Symbol")); - doubleString = Persistent::New(String::New("Double")); - timestampString = Persistent::New(String::New("Timestamp")); - minKeyString = Persistent::New(String::New("MinKey")); - maxKeyString = Persistent::New(String::New("MaxKey")); -} - -void BSON::Initialize(v8::Handle target) -{ - // Grab the scope of the call from Node - HandleScope scope; - // Define a new function template - Local t = FunctionTemplate::New(New); - constructor_template = Persistent::New(t); - constructor_template->InstanceTemplate()->SetInternalFieldCount(1); - constructor_template->SetClassName(String::NewSymbol("BSON")); - - // Instance methods - NODE_SET_PROTOTYPE_METHOD(constructor_template, "calculateObjectSize", CalculateObjectSize); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "serialize", BSONSerialize); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "serializeWithBufferAndIndex", SerializeWithBufferAndIndex); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "deserialize", BSONDeserialize); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "deserializeStream", BSONDeserializeStream); - - target->ForceSet(String::NewSymbol("BSON"), constructor_template->GetFunction()); -} - -// Create a new instance of BSON and passing it the existing context -Handle BSON::New(const Arguments &args) -{ - HandleScope scope; - - // Check that we have an array - if(args.Length() == 1 && args[0]->IsArray()) - { - // Cast the array to a local reference - Local array = Local::Cast(args[0]); - - if(array->Length() > 0) - { - // Create a bson object instance and return it - BSON *bson = new BSON(); - - uint32_t foundClassesMask = 0; - - // Iterate over all entries to save the instantiate funtions - for(uint32_t i = 0; i < array->Length(); i++) { - // Let's get a reference to the function - Local func = Local::Cast(array->Get(i)); - Local functionName = func->GetName()->ToString(); - - // Save the functions making them persistant handles (they don't get collected) - if(functionName->StrictEquals(bson->longString)) { - bson->longConstructor = Persistent::New(func); - foundClassesMask |= 1; - } else if(functionName->StrictEquals(bson->objectIDString)) { - bson->objectIDConstructor = Persistent::New(func); - foundClassesMask |= 2; - } else if(functionName->StrictEquals(bson->binaryString)) { - bson->binaryConstructor = Persistent::New(func); - foundClassesMask |= 4; - } else if(functionName->StrictEquals(bson->codeString)) { - bson->codeConstructor = Persistent::New(func); - foundClassesMask |= 8; - } else if(functionName->StrictEquals(bson->dbrefString)) { - bson->dbrefConstructor = Persistent::New(func); - foundClassesMask |= 0x10; - } else if(functionName->StrictEquals(bson->symbolString)) { - bson->symbolConstructor = Persistent::New(func); - foundClassesMask |= 0x20; - } else if(functionName->StrictEquals(bson->doubleString)) { - bson->doubleConstructor = Persistent::New(func); - foundClassesMask |= 0x40; - } else if(functionName->StrictEquals(bson->timestampString)) { - bson->timestampConstructor = Persistent::New(func); - foundClassesMask |= 0x80; - } else if(functionName->StrictEquals(bson->minKeyString)) { - bson->minKeyConstructor = Persistent::New(func); - foundClassesMask |= 0x100; - } else if(functionName->StrictEquals(bson->maxKeyString)) { - bson->maxKeyConstructor = Persistent::New(func); - foundClassesMask |= 0x200; - } - } - - // Check if we have the right number of constructors otherwise throw an error - if(foundClassesMask != 0x3ff) { - delete bson; - return VException("Missing function constructor for either [Long/ObjectID/Binary/Code/DbRef/Symbol/Double/Timestamp/MinKey/MaxKey]"); - } else { - bson->Wrap(args.This()); - return args.This(); - } - } - else - { - return VException("No types passed in"); - } - } - else - { - return VException("Argument passed in must be an array of types"); - } -} - -//------------------------------------------------------------------------------------------------ -//------------------------------------------------------------------------------------------------ -//------------------------------------------------------------------------------------------------ -//------------------------------------------------------------------------------------------------ - -Handle BSON::BSONDeserialize(const Arguments &args) -{ - HandleScope scope; - - // Ensure that we have an parameter - if(Buffer::HasInstance(args[0]) && args.Length() > 1) return VException("One argument required - buffer1."); - if(args[0]->IsString() && args.Length() > 1) return VException("One argument required - string1."); - // Throw an exception if the argument is not of type Buffer - if(!Buffer::HasInstance(args[0]) && !args[0]->IsString()) return VException("Argument must be a Buffer or String."); - - // Define pointer to data - Local obj = args[0]->ToObject(); - - // Unpack the BSON parser instance - BSON *bson = ObjectWrap::Unwrap(args.This()); - - // If we passed in a buffer, let's unpack it, otherwise let's unpack the string - if(Buffer::HasInstance(obj)) - { -#if NODE_MAJOR_VERSION == 0 && NODE_MINOR_VERSION < 3 - Buffer *buffer = ObjectWrap::Unwrap(obj); - char* data = buffer->data(); - size_t length = buffer->length(); -#else - char* data = Buffer::Data(obj); - size_t length = Buffer::Length(obj); -#endif - - // Validate that we have at least 5 bytes - if(length < 5) return VException("corrupt bson message < 5 bytes long"); - - try - { - BSONDeserializer deserializer(bson, data, length); - return deserializer.DeserializeDocument(); - } - catch(char* exception) - { - Handle error = VException(exception); - free(exception); - return error; - } - - } - else - { - // The length of the data for this encoding - ssize_t len = DecodeBytes(args[0], BINARY); - - // Validate that we have at least 5 bytes - if(len < 5) return VException("corrupt bson message < 5 bytes long"); - - // Let's define the buffer size - char* data = (char *)malloc(len); - DecodeWrite(data, len, args[0], BINARY); - - try - { - BSONDeserializer deserializer(bson, data, len); - Handle result = deserializer.DeserializeDocument(); - free(data); - return result; - - } - catch(char* exception) - { - Handle error = VException(exception); - free(exception); - free(data); - return error; - } - } -} - -Local BSON::GetSerializeObject(const Handle& argValue) -{ - Local object = argValue->ToObject(); - if(object->Has(_toBSONString)) - { - const Local& toBSON = object->Get(_toBSONString); - if(!toBSON->IsFunction()) ThrowAllocatedStringException(64, "toBSON is not a function"); - - Local result = Local::Cast(toBSON)->Call(object, 0, NULL); - if(!result->IsObject()) ThrowAllocatedStringException(64, "toBSON function did not return an object"); - return result->ToObject(); - } - else - { - return object; - } -} - -Handle BSON::BSONSerialize(const Arguments &args) -{ - HandleScope scope; - - if(args.Length() == 1 && !args[0]->IsObject()) return VException("One, two or tree arguments required - [object] or [object, boolean] or [object, boolean, boolean]"); - if(args.Length() == 2 && !args[0]->IsObject() && !args[1]->IsBoolean()) return VException("One, two or tree arguments required - [object] or [object, boolean] or [object, boolean, boolean]"); - if(args.Length() == 3 && !args[0]->IsObject() && !args[1]->IsBoolean() && !args[2]->IsBoolean()) return VException("One, two or tree arguments required - [object] or [object, boolean] or [object, boolean, boolean]"); - if(args.Length() == 4 && !args[0]->IsObject() && !args[1]->IsBoolean() && !args[2]->IsBoolean() && !args[3]->IsBoolean()) return VException("One, two or tree arguments required - [object] or [object, boolean] or [object, boolean, boolean] or [object, boolean, boolean, boolean]"); - if(args.Length() > 4) return VException("One, two, tree or four arguments required - [object] or [object, boolean] or [object, boolean, boolean] or [object, boolean, boolean, boolean]"); - - // Unpack the BSON parser instance - BSON *bson = ObjectWrap::Unwrap(args.This()); - - // Calculate the total size of the document in binary form to ensure we only allocate memory once - // With serialize function - bool serializeFunctions = (args.Length() >= 4) && args[3]->BooleanValue(); - - char *serialized_object = NULL; - size_t object_size; - try - { - Local object = bson->GetSerializeObject(args[0]); - - BSONSerializer counter(bson, false, serializeFunctions); - counter.SerializeDocument(object); - object_size = counter.GetSerializeSize(); - - // Allocate the memory needed for the serialization - serialized_object = (char *)malloc(object_size); - - // Check if we have a boolean value - bool checkKeys = args.Length() >= 3 && args[1]->IsBoolean() && args[1]->BooleanValue(); - BSONSerializer data(bson, checkKeys, serializeFunctions, serialized_object); - data.SerializeDocument(object); - } - catch(char *err_msg) - { - free(serialized_object); - Handle error = VException(err_msg); - free(err_msg); - return error; - } - - // If we have 3 arguments - if(args.Length() == 3 || args.Length() == 4) - { - Buffer *buffer = Buffer::New(serialized_object, object_size); - free(serialized_object); - return scope.Close(buffer->handle_); - } - else - { - Local bin_value = Encode(serialized_object, object_size, BINARY)->ToString(); - free(serialized_object); - return bin_value; - } -} - -Handle BSON::CalculateObjectSize(const Arguments &args) -{ - HandleScope scope; - // Ensure we have a valid object - if(args.Length() == 1 && !args[0]->IsObject()) return VException("One argument required - [object]"); - if(args.Length() == 2 && !args[0]->IsObject() && !args[1]->IsBoolean()) return VException("Two arguments required - [object, boolean]"); - if(args.Length() > 3) return VException("One or two arguments required - [object] or [object, boolean]"); - - // Unpack the BSON parser instance - BSON *bson = ObjectWrap::Unwrap(args.This()); - bool serializeFunctions = (args.Length() >= 2) && args[1]->BooleanValue(); - BSONSerializer countSerializer(bson, false, serializeFunctions); - countSerializer.SerializeDocument(args[0]); - - // Return the object size - return scope.Close(Uint32::New((uint32_t) countSerializer.GetSerializeSize())); -} - -Handle BSON::SerializeWithBufferAndIndex(const Arguments &args) -{ - HandleScope scope; - - //BSON.serializeWithBufferAndIndex = function serializeWithBufferAndIndex(object, ->, buffer, index) { - // Ensure we have the correct values - if(args.Length() > 5) return VException("Four or five parameters required [object, boolean, Buffer, int] or [object, boolean, Buffer, int, boolean]"); - if(args.Length() == 4 && !args[0]->IsObject() && !args[1]->IsBoolean() && !Buffer::HasInstance(args[2]) && !args[3]->IsUint32()) return VException("Four parameters required [object, boolean, Buffer, int]"); - if(args.Length() == 5 && !args[0]->IsObject() && !args[1]->IsBoolean() && !Buffer::HasInstance(args[2]) && !args[3]->IsUint32() && !args[4]->IsBoolean()) return VException("Four parameters required [object, boolean, Buffer, int, boolean]"); - - uint32_t index; - size_t object_size; - - try - { - BSON *bson = ObjectWrap::Unwrap(args.This()); - - Local obj = args[2]->ToObject(); - char* data = Buffer::Data(obj); - size_t length = Buffer::Length(obj); - - index = args[3]->Uint32Value(); - bool checkKeys = args.Length() >= 4 && args[1]->IsBoolean() && args[1]->BooleanValue(); - bool serializeFunctions = (args.Length() == 5) && args[4]->BooleanValue(); - - BSONSerializer dataSerializer(bson, checkKeys, serializeFunctions, data+index); - dataSerializer.SerializeDocument(bson->GetSerializeObject(args[0])); - object_size = dataSerializer.GetSerializeSize(); - - if(object_size + index > length) return VException("Serious error - overflowed buffer!!"); - } - catch(char *exception) - { - Handle error = VException(exception); - free(exception); - return error; - } - - return scope.Close(Uint32::New((uint32_t) (index + object_size - 1))); -} - -Handle BSON::BSONDeserializeStream(const Arguments &args) -{ - HandleScope scope; - - // At least 3 arguments required - if(args.Length() < 5) return VException("Arguments required (Buffer(data), Number(index in data), Number(number of documents to deserialize), Array(results), Number(index in the array), Object(optional))"); - - // If the number of argumets equals 3 - if(args.Length() >= 5) - { - if(!Buffer::HasInstance(args[0])) return VException("First argument must be Buffer instance"); - if(!args[1]->IsUint32()) return VException("Second argument must be a positive index number"); - if(!args[2]->IsUint32()) return VException("Third argument must be a positive number of documents to deserialize"); - if(!args[3]->IsArray()) return VException("Fourth argument must be an array the size of documents to deserialize"); - if(!args[4]->IsUint32()) return VException("Sixth argument must be a positive index number"); - } - - // If we have 4 arguments - if(args.Length() == 6 && !args[5]->IsObject()) return VException("Fifth argument must be an object with options"); - - // Define pointer to data - Local obj = args[0]->ToObject(); - uint32_t numberOfDocuments = args[2]->Uint32Value(); - uint32_t index = args[1]->Uint32Value(); - uint32_t resultIndex = args[4]->Uint32Value(); - - // Unpack the BSON parser instance - BSON *bson = ObjectWrap::Unwrap(args.This()); - - // Unpack the buffer variable -#if NODE_MAJOR_VERSION == 0 && NODE_MINOR_VERSION < 3 - Buffer *buffer = ObjectWrap::Unwrap(obj); - char* data = buffer->data(); - size_t length = buffer->length(); -#else - char* data = Buffer::Data(obj); - size_t length = Buffer::Length(obj); -#endif - - // Fetch the documents - Local documents = args[3]->ToObject(); - - BSONDeserializer deserializer(bson, data+index, length-index); - for(uint32_t i = 0; i < numberOfDocuments; i++) - { - try - { - documents->Set(i + resultIndex, deserializer.DeserializeDocument()); - } - catch (char* exception) - { - Handle error = VException(exception); - free(exception); - return error; - } - } - - // Return new index of parsing - return scope.Close(Uint32::New((uint32_t) (index + deserializer.GetSerializeSize()))); -} - -// Exporting function -extern "C" void init(Handle target) -{ - HandleScope scope; - BSON::Initialize(target); -} - -NODE_MODULE(bson, BSON::Initialize); diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/bson.h b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/bson.h deleted file mode 100644 index 72ae8cc..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/bson.h +++ /dev/null @@ -1,273 +0,0 @@ -//=========================================================================== - -#ifndef BSON_H_ -#define BSON_H_ - -//=========================================================================== - -#define USE_MISALIGNED_MEMORY_ACCESS 1 - -#include -#include -#include - -using namespace v8; -using namespace node; - -//=========================================================================== - -enum BsonType -{ - BSON_TYPE_NUMBER = 1, - BSON_TYPE_STRING = 2, - BSON_TYPE_OBJECT = 3, - BSON_TYPE_ARRAY = 4, - BSON_TYPE_BINARY = 5, - BSON_TYPE_UNDEFINED = 6, - BSON_TYPE_OID = 7, - BSON_TYPE_BOOLEAN = 8, - BSON_TYPE_DATE = 9, - BSON_TYPE_NULL = 10, - BSON_TYPE_REGEXP = 11, - BSON_TYPE_CODE = 13, - BSON_TYPE_SYMBOL = 14, - BSON_TYPE_CODE_W_SCOPE = 15, - BSON_TYPE_INT = 16, - BSON_TYPE_TIMESTAMP = 17, - BSON_TYPE_LONG = 18, - BSON_TYPE_MAX_KEY = 0x7f, - BSON_TYPE_MIN_KEY = 0xff -}; - -//=========================================================================== - -template class BSONSerializer; - -class BSON : public ObjectWrap { -public: - BSON(); - ~BSON() {} - - static void Initialize(Handle target); - static Handle BSONDeserializeStream(const Arguments &args); - - // JS based objects - static Handle BSONSerialize(const Arguments &args); - static Handle BSONDeserialize(const Arguments &args); - - // Calculate size of function - static Handle CalculateObjectSize(const Arguments &args); - static Handle SerializeWithBufferAndIndex(const Arguments &args); - - // Constructor used for creating new BSON objects from C++ - static Persistent constructor_template; - -private: - static Handle New(const Arguments &args); - static Handle deserialize(BSON *bson, char *data, uint32_t dataLength, uint32_t startIndex, bool is_array_item); - - // BSON type instantiate functions - Persistent longConstructor; - Persistent objectIDConstructor; - Persistent binaryConstructor; - Persistent codeConstructor; - Persistent dbrefConstructor; - Persistent symbolConstructor; - Persistent doubleConstructor; - Persistent timestampConstructor; - Persistent minKeyConstructor; - Persistent maxKeyConstructor; - - // Equality Objects - Persistent longString; - Persistent objectIDString; - Persistent binaryString; - Persistent codeString; - Persistent dbrefString; - Persistent symbolString; - Persistent doubleString; - Persistent timestampString; - Persistent minKeyString; - Persistent maxKeyString; - - // Equality speed up comparison objects - Persistent _bsontypeString; - Persistent _longLowString; - Persistent _longHighString; - Persistent _objectIDidString; - Persistent _binaryPositionString; - Persistent _binarySubTypeString; - Persistent _binaryBufferString; - Persistent _doubleValueString; - Persistent _symbolValueString; - - Persistent _dbRefRefString; - Persistent _dbRefIdRefString; - Persistent _dbRefDbRefString; - Persistent _dbRefNamespaceString; - Persistent _dbRefDbString; - Persistent _dbRefOidString; - - Persistent _codeCodeString; - Persistent _codeScopeString; - Persistent _toBSONString; - - Local GetSerializeObject(const Handle& object); - - template friend class BSONSerializer; - friend class BSONDeserializer; -}; - -//=========================================================================== - -class CountStream -{ -public: - CountStream() : count(0) { } - - void WriteByte(int value) { ++count; } - void WriteByte(const Handle&, const Handle&) { ++count; } - void WriteBool(const Handle& value) { ++count; } - void WriteInt32(int32_t value) { count += 4; } - void WriteInt32(const Handle& value) { count += 4; } - void WriteInt32(const Handle& object, const Handle& key) { count += 4; } - void WriteInt64(int64_t value) { count += 8; } - void WriteInt64(const Handle& value) { count += 8; } - void WriteDouble(double value) { count += 8; } - void WriteDouble(const Handle& value) { count += 8; } - void WriteDouble(const Handle&, const Handle&) { count += 8; } - void WriteUInt32String(uint32_t name) { char buffer[32]; count += sprintf(buffer, "%u", name) + 1; } - void WriteLengthPrefixedString(const Local& value) { count += value->Utf8Length()+5; } - void WriteObjectId(const Handle& object, const Handle& key) { count += 12; } - void WriteString(const Local& value) { count += value->Utf8Length() + 1; } // This returns the number of bytes exclusive of the NULL terminator - void WriteData(const char* data, size_t length) { count += length; } - - void* BeginWriteType() { ++count; return NULL; } - void CommitType(void*, BsonType) { } - void* BeginWriteSize() { count += 4; return NULL; } - void CommitSize(void*) { } - - size_t GetSerializeSize() const { return count; } - - // Do nothing. CheckKey is implemented for DataStream - void CheckKey(const Local&) { } - -private: - size_t count; -}; - -class DataStream -{ -public: - DataStream(char* aDestinationBuffer) : destinationBuffer(aDestinationBuffer), p(aDestinationBuffer) { } - - void WriteByte(int value) { *p++ = value; } - void WriteByte(const Handle& object, const Handle& key) { *p++ = object->Get(key)->Int32Value(); } -#if USE_MISALIGNED_MEMORY_ACCESS - void WriteInt32(int32_t value) { *reinterpret_cast(p) = value; p += 4; } - void WriteInt64(int64_t value) { *reinterpret_cast(p) = value; p += 8; } - void WriteDouble(double value) { *reinterpret_cast(p) = value; p += 8; } -#else - void WriteInt32(int32_t value) { memcpy(p, &value, 4); p += 4; } - void WriteInt64(int64_t value) { memcpy(p, &value, 8); p += 8; } - void WriteDouble(double value) { memcpy(p, &value, 8); p += 8; } -#endif - void WriteBool(const Handle& value) { WriteByte(value->BooleanValue() ? 1 : 0); } - void WriteInt32(const Handle& value) { WriteInt32(value->Int32Value()); } - void WriteInt32(const Handle& object, const Handle& key) { WriteInt32(object->Get(key)); } - void WriteInt64(const Handle& value) { WriteInt64(value->IntegerValue()); } - void WriteDouble(const Handle& value) { WriteDouble(value->NumberValue()); } - void WriteDouble(const Handle& object, const Handle& key) { WriteDouble(object->Get(key)); } - void WriteUInt32String(uint32_t name) { p += sprintf(p, "%u", name) + 1; } - void WriteLengthPrefixedString(const Local& value) { WriteInt32(value->Utf8Length()+1); WriteString(value); } - void WriteObjectId(const Handle& object, const Handle& key); - void WriteString(const Local& value) { p += value->WriteUtf8(p); } // This returns the number of bytes inclusive of the NULL terminator. - void WriteData(const char* data, size_t length) { memcpy(p, data, length); p += length; } - - void* BeginWriteType() { void* returnValue = p; p++; return returnValue; } - void CommitType(void* beginPoint, BsonType value) { *reinterpret_cast(beginPoint) = value; } - void* BeginWriteSize() { void* returnValue = p; p += 4; return returnValue; } - -#if USE_MISALIGNED_MEMORY_ACCESS - void CommitSize(void* beginPoint) { *reinterpret_cast(beginPoint) = (int32_t) (p - (char*) beginPoint); } -#else - void CommitSize(void* beginPoint) { int32_t value = (int32_t) (p - (char*) beginPoint); memcpy(beginPoint, &value, 4); } -#endif - - size_t GetSerializeSize() const { return p - destinationBuffer; } - - void CheckKey(const Local& keyName); - -protected: - char *const destinationBuffer; // base, never changes - char* p; // cursor into buffer -}; - -template class BSONSerializer : public T -{ -private: - typedef T Inherited; - -public: - BSONSerializer(BSON* aBson, bool aCheckKeys, bool aSerializeFunctions) : Inherited(), checkKeys(aCheckKeys), serializeFunctions(aSerializeFunctions), bson(aBson) { } - BSONSerializer(BSON* aBson, bool aCheckKeys, bool aSerializeFunctions, char* parentParam) : Inherited(parentParam), checkKeys(aCheckKeys), serializeFunctions(aSerializeFunctions), bson(aBson) { } - - void SerializeDocument(const Handle& value); - void SerializeArray(const Handle& value); - void SerializeValue(void* typeLocation, const Handle& value); - -private: - bool checkKeys; - bool serializeFunctions; - BSON* bson; -}; - -//=========================================================================== - -class BSONDeserializer -{ -public: - BSONDeserializer(BSON* aBson, char* data, size_t length); - BSONDeserializer(BSONDeserializer& parentSerializer, size_t length); - - Handle DeserializeDocument(); - - bool HasMoreData() const { return p < pEnd; } - Local ReadCString(); - uint32_t ReadIntegerString(); - int32_t ReadRegexOptions(); - Local ReadString(); - Local ReadObjectId(); - - unsigned char ReadByte() { return *reinterpret_cast(p++); } -#if USE_MISALIGNED_MEMORY_ACCESS - int32_t ReadInt32() { int32_t returnValue = *reinterpret_cast(p); p += 4; return returnValue; } - uint32_t ReadUInt32() { uint32_t returnValue = *reinterpret_cast(p); p += 4; return returnValue; } - int64_t ReadInt64() { int64_t returnValue = *reinterpret_cast(p); p += 8; return returnValue; } - double ReadDouble() { double returnValue = *reinterpret_cast(p); p += 8; return returnValue; } -#else - int32_t ReadInt32() { int32_t returnValue; memcpy(&returnValue, p, 4); p += 4; return returnValue; } - uint32_t ReadUInt32() { uint32_t returnValue; memcpy(&returnValue, p, 4); p += 4; return returnValue; } - int64_t ReadInt64() { int64_t returnValue; memcpy(&returnValue, p, 8); p += 8; return returnValue; } - double ReadDouble() { double returnValue; memcpy(&returnValue, p, 8); p += 8; return returnValue; } -#endif - - size_t GetSerializeSize() const { return p - pStart; } - -private: - Handle DeserializeArray(); - Handle DeserializeValue(BsonType type); - Handle DeserializeDocumentInternal(); - Handle DeserializeArrayInternal(); - - BSON* bson; - char* const pStart; - char* p; - char* const pEnd; -}; - -//=========================================================================== - -#endif // BSON_H_ - -//=========================================================================== diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/index.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/index.js deleted file mode 100644 index 85e243c..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/index.js +++ /dev/null @@ -1,30 +0,0 @@ -var bson = null; - -// Load the precompiled win32 binary -if(process.platform == "win32" && process.arch == "x64") { - bson = require('./win32/x64/bson'); -} else if(process.platform == "win32" && process.arch == "ia32") { - bson = require('./win32/ia32/bson'); -} else { - bson = require('../build/Release/bson'); -} - -exports.BSON = bson.BSON; -exports.Long = require('../lib/bson/long').Long; -exports.ObjectID = require('../lib/bson/objectid').ObjectID; -exports.DBRef = require('../lib/bson/db_ref').DBRef; -exports.Code = require('../lib/bson/code').Code; -exports.Timestamp = require('../lib/bson/timestamp').Timestamp; -exports.Binary = require('../lib/bson/binary').Binary; -exports.Double = require('../lib/bson/double').Double; -exports.MaxKey = require('../lib/bson/max_key').MaxKey; -exports.MinKey = require('../lib/bson/min_key').MinKey; -exports.Symbol = require('../lib/bson/symbol').Symbol; - -// Just add constants tot he Native BSON parser -exports.BSON.BSON_BINARY_SUBTYPE_DEFAULT = 0; -exports.BSON.BSON_BINARY_SUBTYPE_FUNCTION = 1; -exports.BSON.BSON_BINARY_SUBTYPE_BYTE_ARRAY = 2; -exports.BSON.BSON_BINARY_SUBTYPE_UUID = 3; -exports.BSON.BSON_BINARY_SUBTYPE_MD5 = 4; -exports.BSON.BSON_BINARY_SUBTYPE_USER_DEFINED = 128; diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/win32/ia32/bson.node b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/win32/ia32/bson.node deleted file mode 100644 index b27819bb1a8a4fb1bda843df4d87dd0753137603..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113152 zcmeFae|S{YwLg3&nIuD)FoPr*G)TmtXh5R_HZcT-ACm+nI3Z+03JG`%bWEvII7hLU zK;p^JoNT7rd$rfL>V=~BORH_^y`b0vP6#GYQ2|j=sK%CW-RYznD-8i6=l!gG&iqJ7 zZ2La%bN_ntJefIX@3q%nYwfkyUVH5yQ}*@8r9?@RtoYY;N!p8V`g4oVum0#m_NWQJ z871u=@y7LgEeqbbezE`l_1SCJJ^0Oa_kBD28}~i%z=Lx3zpTn$r#z5-{{z|c?yboF z_Jb=|-I|t`nq#8g|J!Xn7e07%N96y9FRt40A>M!ZqIXBP_+GiA8Q(oWt=Vx&yf4~u z5#JX+cx%T}@qXWqKJi^?epiU^MfZQhPdJC;!0VBu1(qaf>`#)*BQTv(!u2C9sgjgs zk)$7+srTXAiT^yL(Gxu$;Wq$@fXpR6jC^_d0xM4xKq`~Uy_e;@%@NSkfdEZS^a+fn*s zt!zP#m5tV%tlX-3t!%zcE43Z8N+S2@(GJVmT8q_!QP^yhlp3EY7j|*yp_m z6XfY^VSiO{Q-9F<{rMZl1fLToK;_o?Mu|tx^&YgyBdYk>1(Kv5va*ilwZPJmOz1_H zj~_9!+9^j+MD?AEqbP7hwlNEH)>-ruL?z|-$K^9ijCMi)Z0mr8e~ezLF-q^WLG)6l zN$`E@v}I`X0%ZZ%4<7li?vU@G>#q} zz)!Iuf4jRhX#f5OXK-bXq;}a$J1hhES$WSu`N#1y-^_~1zr&IRT03Uj&1%`a9BYTr zOM|B1Z2JHf*zC+f?^y%hTTs4vc6L-KEwi%+te9qVH2qFX~G`C2~PUu(rR7 z6$YnWzIQ`@hhWSF)%URn}>Zf`Jfg;z2Tpv#| za!pD*EK@*9tceFwWAxv62zMjw+I8Jch{oKPO+p5S4FE$w2v1rYYYMW>!qT9hLhmlb%P+tQb9_zt`#Pb8m1#jshl0v zEHEl|HX?}8dy$^8l4M}hGwjsm7s6doi>=mb(Im{FXFNyQ3$1mM+sI+XR_3Ua>U6K3 z@gnjp#j!D#`K-)_JmdoL;M}7})$W|_FK)9qU5B)JIoaTKazzz@A$hb%RyhdDT7>2( zWmgfIqZuVn%^a|-aDs5Rd&)Iy9WucXAvN~Q`JnyRJt79+e@h@Y= z3&CUpHu`c+CJ5|^_GKV>NV&utRqf!1&gi_N;nRTo~qpY1@pHB@Q=TbqR)U$o?GMH2Cc7kqS72FB+V$ynt zzcbpT#b4?=yB$5wj(=#Vvp?w7p`$i!aZWnm3(M^fIsDtA@M8hraMwV!NFW^bHuhE! z<#;-EJ9zNWtf;P#4At)Jn0&G-DyzVXon7#18*|e2j19yO6yuP!aG`zux7gHWlrWy; zYt9!~v8~1CcD!@}3dasJeURz_Tb5UU8}g_U_JY01Z^2BH3^;6eIb@a14rw-gXX@`T zpRLemU-u&0nBxTA!eTr0+~$ku`R)B+XcTK~B357yVa@y?q$wnCW@Fi-4U}9&rZHkL zscUC@_4gu$kPds5BaEqY5z>=cLo-SVc#t=l=t)QVSax@opu8?o7&tv6pZK=H{5dt- z@|vZ9%YvnudndJSb{p8SBWbdBHAGxPHt1$E=O`<+vC(RGrrK)tVftV+^nxf)HJ89s zo(6944+Ay2KUf}X=u%sucVI(L1^nQK9*49lG_su|K7mHARS(5{`tpiOwkF3(&6-{( zL1f#A6KYZ$HR)|Hdfi-?*sj{=-oX zUW`|iOxHZpa`sxyQe!kbdQ|k6P-FLQV6I^Avod>dw(hGcx{P(yNN{z<#kWdB! z|6T%jOVny-c#9E?uXnKI?Dbx)_nZvNNF=rn8g0l;{&R@a@+I*guNNzwe;LVBQ9U!LNITX`G z1I?x;&x;kXi?7$S$f=dn_!sG-gR zEb=gPQH$moZP|kHidkBfF9rP`YFG@gglD|@Wg=Z3G9s_4`=?odO0 zq`9P%r3~?s1vv{oT9Z?X%82By{~-%LL_RtgKwbn$d_T*I>0P`6(U{i8pQDDwcoyl{ z3W5-?^Jn{z+8#|s%gsZ}ojQ+HYBg%R8LTwh;K>3NC$ln~B*(D3r^G;JMASL1M>Bxr zK?6#GBAUOvR(@)p(|G@PeAi}6&W|Tb z&fnnu=k$#KGQhYf4`~!01G5}Th|ClvFB&@?y=n_etIgMHXK1xt#*x8yH=}}wb~6@?MCg{2I!#nEOij= zSu$eUvs=X{^-t|t8UX5a?O8I$P&KFjBveX!mO89gdv+VXFcL^?YC3ug+^oVj#p()$ zlfC*ou%vZ5xODnEQKVceUPh2Z!C(aUbHFUpidPH+qZO|dwf6vwT&f}QP+jMYy8Oez zP+d}$sB6tIFk10iQI{QHUs+c=0Kk_#3?8(+(@!wqYr`-wTJc6vSJvOFD@W9|rNI>V zaAKS+s@p=XIb4lfsF6jbQ~qA1`9`Ir55r&+JkBsGC50IVOxr?wBr0|Py-G`sN=e~{ z!6qv88kLeF4g;ob*%qmE$=|DVg{ZW6+Ayd@jcY`W#rea)XvH%GgYw_2Yok$@dl)>T zt|p_ddBebH#igRIt$(ksCycttT^q8?kcw_I>Kabfwc^F1uAKwxN?l$9`@-6nR<{|Q z9q+})dt`Df=66#nDt$Ehnqu0>q7bZ+E97+@DF@n2f9DiQ^fHRufc0sxl}%(6K`xnA z3g+zCdw>E~hbh^Hm7I(P^fY}hK4D=nrSk707W8*vh|&lay#qtyF@hRT@6qbA{5=Im zb!&2Rgms$c-%BDwSu)CXn2a6LCWEjX_BtDX6d1f1v~w_(ps6D49EJKQzVr^uh+!rW zf8KPs|0qau#AHlRmhV3*gu5UokEkX&aAzC1vxdVR${Pyzxk0#r6cad_q2~M(xEtIC z?kS*qV-C^1AZLbOS~5`L0;iS_PNxizwjm4AqL9>NXvQIG(tMyHp-`iH4b~A4q*-)9 zWa_;@&sYXfL+xmcU0z$WR6R7M&4_=f-HR)HRjh~xZNN}ZRP309s(ltmU{xX<`SDL7 zD-hZ|3N>XSg1~4p6;4E0Q_nbstfr8oX$An*O*U!sRlt!|4xmh$JuJ&f505~I5zUp( zK47ow8BYsbjwX)KgP+`3{@Xm7xmyv48_9Zj3b~Da;RKhCaM zf0U>}Z8_8sS$f6_U>38D9L#|AjCu4*AyA>B8RzJ=WLiWh>H6CUR@@TkRUEF6iaEbU zE3tR|9uZM^CC2z|jV8AvnU&-ZTQ)%}advILqO3@!^?p_|W7x7*tt7o`)fHt$@Qbjyn$u2d~n03@NZ;*CUkMZp;N2M>N<;tU?rtPKvzG?V>CkDn3sn}IFj zI8d=d_>)!v}(fRwkj#7h55VX~Mm=qW{zY#%iMm33>FWks98(R2(_W0l>IwUvtWFj3qs+6jg{ zY5i3H43nm+e}JYAPd~K-mh;$qLC-#(_z7$>S`Y2aJ2>XfUnNmif3_;9*!icQBNWPi ze?1v@8!NN1O1m~1n6W~l?_J@NoNX~Q9sms2`h0-;)sX_uGZvI6v1z1pP4^ZBoX|`3HDFCuWrbMZy3P#CeAl|F_dX zOs$R%Z^P~d8%4&qYy*ujS~hU*M;}3mW4FC|;d<#+gW=jnP8$jY7@}(9yOW(QJDghF#loEs?c} zw|E8&d*hC`H{@CjZEtq5>10#kvOuLvY=)BopF>gLX~cCl>JRtA(J+aFt=Xo(3tO`j zG!C*gCx^8)+hVq6*U+{GB&dA}%G$52e381@W&v?z;)J!Zg_A*?+GS+ho88<3qa6md4nb~LR*Hxcz% z9RUjOeN|nKKnozgy1s9HWqry5WG8~0IBpDC*#)&z{m!o&MzZ}ce_u+#W!-cmHGO0t z-iFd*Xfie-Ahc9=vb?LG*4awL$jqO$3%8Q>Xv#^0?~OOAeZ!EH(Jyqr-Q%z*R(wj> z`{y}}Rpx>c8)@UII3rYI)jZuW(7_sxCA1P4v<^=Q;*#1uhoqJ=M|0V0nsS&`a;>s6 z=;;h9A^vZmg?U0`oQ`>U;`k_KXN{KMxD=Ydc{HHWiz60Gf^vZuj_S_PB0gyt`hK2h zmO<7n4)zqm8tll{U6ydd9U)EGrYX-gdv>-|I+`ng#ylrA&x^248dh+~+IhC|U7*mk zOl&hkA?F!}&4f!0NmCudqt5s7i`N?LC^l_ouzy#m8O1=v}i zkH01g+1X|*dNj&B0p`$W$ijXF23C1?5pO|JR)18OS}jbbc7utGh7p9PBNp~GOm8vB zMDPtY$i$m3V|}Yn?Vc7tAIgTkQ0(Mcu<>Mrlp31%VDg|WhP#zVeh*n+f8J7>fSKAT zd^XzQ5Q%kywV`}A6bBNj!VHv?&y%1mj#P0E)r%<=A``G}q!`BBD;WT=IuV^vZUBD& zVo<<0{MqPDgms`33RH=k;%QFzHw-~D?d#b`6-oav&F~6^i!x;d8m5n?j)$zS(=ewS zb4jhgg8V^hirHfGvYgE3c{$^-=ABhgYuh~59NMD1)B0>U#h6mkxMzp2pU!Wmsxd34 z`5;N1mhNb#V55YbsCtpGBi?z`O^)h-F@9yok6+$l$FJw&{biahCy^h#Tlm2t$aRo$ zIu;e{U_W?wY;1aNn6b%l$NONo_rc6uX}D=3PPz#*ANVmKgw_lgLkBC&!=z{Ng9RB7 zG$SV`BkEWxUQ(LDMx0a+E(RAB!rPs)OmtoTB^)NSe6Z}fh~{1C)QPx4k|XeOgpatv z%m^q%_;@wO$AIBhC_XC^!|i*-@DB|@;wC!Q49(4hCO2_)8ghwovj8C0c)8FROI12` zR0d}KCbQ0efLYif&?ZH?M_RJ5lbVP8Q$g;r=%m9GKE@n!F37r)7YMJ^bm@@+{}XLv z`t+LTn8^%`ab)IVAhBznPC{T4mR74jDr9cmSV4UeGJ=<6&U6g;LBq=w;3YWE$>@+5 zg&Q!m{0|K+r;P?xZd3cL7{AI+LCxdGFH$L|<~bQZCjFWU9)T$jTCdhTyEV_==9+!Y zW&4?jYn~9Qmo}%<7!!vH11{R(A*-es1MeveUi=MArkMnB(kwIR+0DC?AZ*XxT*7%c zv7^v)?4hat7tID+{(t|zcA5i6DW=9GYce7_=ku= z3^Dy#j!+;*rU;s0Mkd1^t%$cr?qTiGp)2fBebgQugA4}Qqci`AJv#JN_Gq9Px-vMR zWccM8!!rEwk3#lc?U-#v)GHEIh;%S3D`x><(*X|v?d%#vG;k^@Xuq@>L(bIdHG zm}Qn2Wrnj~rwsd*;m^dzc#L(t$Sjv_lp`~6g{6qlx56wl!YtEmp?;20AX)huhJv9i z2)1w;whe-L+${dPKNy1f1&RyBkF#Ne0|Ce%ntfJ8U0r_75=ws@5s}L?3qT`*KD>~jGbA%eIp^O@s}; z(gdJToC%1a7$Oc3aVX%BAgZk-Y00d;4YH!JvX)H2h<35{Q{9+jm6Y_l8UBXF7N!61vg>VBm{zOm4PChkmC!HZ-(2w;rM7t1tT}aCW zS#U!&ykJ3u7)s|q#|)e*Fr7$~A*aC*>vR2u+{}RP_&zPyK3)l4#J)q2N4yDsrhs;0 zw*ljlJOWs!aQSUrCl>SKSj>#FIASo1w_T zIiAAL99zFblXYy!#->RuKIq`-A!}~WaxG6R-DDcuMzLv?))P@^GGay8Y<`xAc3_T} zt7k}1w)aEazfF=LnaQW||3TMBoxO+VeRma_+*kv0(mp&3JJ#@r#D5vLae?qE=5An`C`9b~hHt$pIaM zwi=k>H8L(<9-M*Yazixs7&`-t&d}d0ClbB~sbfH4?ls0fS~_vpEIAU(zcyKJpxq7z*Ad7_6wtsjOjZl$$|qXqdUL(LOw%XrxD} zSY#<{3TnxQA{kJl2@0y(NQTM~Y?cr#%+q_Y5}Ew5qq+`zIvTBwlBNy)0Q+tSbe(wh zT})zEzCDnGCHi}D%%(tY(b=F}$Q)=0#EjpDOKeU>pj!^cY1$`*V&n{^L>)YcO`9>? zFyX`7uf4kPf;i!l@8s+aJNeq7|-92Lu$MY ziW$190fufqVQZHXgki#91}h}YNni8;k53%nNuXM2uo-lKCsuL9PRf%Fls3Z9Pv*mC zbsd3{KiS%x3TqxK5ob@wQ5o3OcFD?*W3D(5$TX{ypsqRXmJw9WitYoqErbF1F0mt3=21jSfNhaE~PO?#60)$KmRUX1&D_;qJX1m63yKPn`Zl! zruktSCI60TwwtCI)$FL~ZrcuAM21_@b{U1`AKt?sYN?AkQ##?NSmDu-R*_=-Z~D2Zhi~ z4%(Po9%NZfLvPh4BU|Wb%-jpk^Jpw!>LgVkkI72QVavO&hleWTZCc zRA8aC(p%1R6!KA>mIvY+A0bLwj>1Z~ot27FLY`shs)hONY|e&w!$yPcO6nHijvSSt zdg}m$#^^H3KsZVuq(LTUm_a7ef%zkc;}vdT`=5}FdgiuU z9ITdnLK;ePf)!S;=Cfi9>f=W`pno)Gq3-{rPxiLuTmI+rDla4Zrf zA4ADl_CQWCERo8EO_ghxXd$0Xr4|Toz>+DvQgWNqXyc`3YstvQcQfuc5ZaVv3}K@A zAac_KdB;oM-(9rxdy~~HpF#UFg$4+{X^0MIgNr3nF(}2O=4fV&WRL~);vMP~y!ACP znoR_q!BUF`dy_%CIknM*Su{Krr}=N`7=SQDric86<{C~0VziS-8@+W{Nn!XSNr??E zprc*d9K**Pm=VWD!x}QI)PC&=7y~h-jt+{@X2!Lfg%HSI3jf_fVuvvVjkMk{zFgX>`I?N%*3zD;t|pn2sPE&gE59xlY%mxI)#z`m>vhe|AQie}f#&a$2jDa_N^oEa8y75oKMU0scRJj<6JX^YUHuIiMk>Qbs*ArSG! z3(E^UM8c0zuSr6YK>|v6=veDnpRS~X3SB`2wsUA2PU4svOu0b=_9t{gTf>NZb)r@I zqzDxz4M2oYf@0SZEc+%nLBSf6x_V5Gry?Es)ARN~m>GR}cDB)%G$z- zu8(<*o;a8!eUpM_KSL#R{B;}422I;j#)ui&o| z0AGqU+!lgLT%o0rgT7_}Cpbr6+Gd`;qyFFu;RX&{1v}N+X+w9joj-_qq9kXuq^buk zcfBsZg_B(6MxqiPd8&%Fwf@oR8+nSQzN%loyb0GEoOivR*pqlc{ajajbk|$1cJ-jO z@ngwiX;iW%(U<%-eOVM+=)>A$N@z7w9+XLtQkzNzV~{7EZ!A}Iq& zXONVPq?6$v)-E?_o^u)H+JbYwG`{-jOQ=!MlTM;joMtngf)Lb0>1Jazb}xb7Y3|pc zBi0^Ug-;8-NM_b!uc}Mb0=x0d%Wj3}u$?Bt1joO3O{Mzm0ZbuN0HIG`g5DO*9Usf>f}iIsF+Ulau?*`EXmFVBx)mQ$8f6p$4f z37%#=lurp8kPv*@<3oNhXh7w*)+OrGy`cAa-z$VQ_i%Xye>7JJ5H$UtiYTd-gpRmW z{!O30IG)48NRA^QqX+q)j_2^YSY{P6^*ut^f1w&ewrb-Q6gsxFQJ;7R>Fh}YVW%7~ z&-?o2>W;uJyn!-F?OP__#103Mx>~((n|y7-GnBP{j4nV_p5S=d$$qC^T&8@)+Hysr z7T5_8weJSUmU4=K@23)@9qMen)ZMx+Cx$=JkerqPb;4IHI+; zAeRa4VL_@VXvHc^L@Or6;A#by0WwR8<+_pU-x@EoKi@(Gh$?PCrh&39)yrQ(Mm2jA zjbx;G`E!&KZ1RvQdeH@V`{XF`pI|CKNEsiGVLpOf|JwL!*T*tnq@sJMkMKE2g*PSG z^73hT3pOS0LVHvfwpSa;jxAxKkXIw~mHQ1XGD;iy=p)sFtaOs8SCB&(k)%ft_z#Ecbon`knDb)mY{}%DgJuVs>hO2>!d5-!@6K z12)(=0_k9@ZY+P~1~3le(2K4HwOYU8_%BGMhSjC}Zi+U?5<%VozAZ5d?m}*^P-sJ= zg4QKnzXG>)*@Lvx5yO~#CB|O~ISWa0sDz=H2FALS0s7f-W0bN3fE=Xd-;CkeMtFpl z2j?yMYu7c@KteUT=0G{IMyezq?fOJ?P%MJKkB2V$aOqvEQL^qFR@G@VJLS?3;KDek zdP$d86@Db&2W>SJz+lk8>GP9m_3|6wO(QrS2yH09*2Zoipb6a6s-Wo5W-s&d=OK*h z$QuBAgt3&9__f!=n%p-*lFqvq*wJ)KMpd1)irW1z$e~PrC>x!jtbci}>y4%S`CeT=(xy*8gwYv65~Jz_{aD>N?#_g^Sm187 zqX4>c7o&pYchz+LC!H46%R4NY(-E@BfuO66aSU!O$I_eL>%qlIDL#(imrni?U8o?+ zV(3y^N0h6f5njF$<<6g~zBW|tru+^|Hn4U51_~uW#WgUL#QzVHA{f6r7$dwXY{}$% z0Mn67;PKTVlod`RzvzA_J4Qm;K`+;Ue0urQk+$BX?q6eIe6*KT!ctUYDYu8;g{u8~??aFF^msL;hc_eZXr0aP{1+|+bw9fSpcFA zP)3_lcsEF?u7O}g2Wsq|3`cl}^M4@IG&_A}*ywY-l|H9S^jXvozi{=|jLCRey)`XM ze2woDiAm?g*Q6ftHMJXGPd}EF4G`v$cBG4M>yAu(2R*hOIrJXrggx&_S^-cC4uWi_ z%pK`?>qxTUbA(k2btKtEuIbQffm0~5eHYBC7C1wrK}Lwwe+ht~L>JL}s^J-D973Xh z1{w}$?C_`-5rBl5jfKBUFn+?VXB!xzjDD@sC8-L}Z2kSm8R2Rj;vHt#v0<>3c|{rPl!RAW! zf-YaHUbrleWvy!G1a`djVp3~oa-#Lg&I33ZleG6RdTX!Snk}c-B~(kn@nXTCt9_!Les?eIEy1&khR98^nFOM+g6sB7{Ch4Gc`O;cb#z=v+ZZEcz zG5ZE@x(TudBc*G=Mya2|M57ARHoS-#;8iRw@8{@!rE6jI-kc9O+Qn3ul>akijwSA+ z`8Gav4&gz(%hu~&o1mntrE3#Vi6xxMaC;ywgP=@faOs_GcgxA@Bbe{z=<}@`MzYb( z3A)AcQYdV990-+r`Df^c)tE`>O5%v*Ha*$sM&%W>Q2jm+r(uXGvAb#GQoo#vy}XiQ zwOkjzn;%Dxnk|JVgUJ?&y>$f34=NI-3Noufmm%%h(4b=MW2Da;#{@`^4vAeDZI>2EhE~@=R20Mj(D`$E0=tE@VqMLKPs_SY5I9OVawYsbIX= z?pA7jTthvvW2pKOwkr1eXrD z&Izp-46O^APzQV6ISq~gt(v=f3okpGC_K?}wd;ts=L}K2r&E0H#%J@B)Id!q98CqF zs6^X;2(JYK%(3-GBn9Vm&RFuW!*SrC<3NKOhCuCf;5cH)aiFPn1zzh?TKlZkT3{Q> z6}CFQ_d5DEF1#sOiyOLvBr8<+1irLALRfo*5cdf2?Ga+#L*nat0>w~=%CqIWRi23T zNN$rSm6pmGcyk04WUE1fw{_hgeYSShM4v5P<#=usFw~>F=0vj+y6(ht!^K`Eq5$MZY|+;o=%Ov*F^yjzA;Q4Spm%b*&?? zS!A3|$xCgv?m!X!@MK?{_qH(f5OnrjO}caWuV8-y0lF$LV{Cqv;5~ zwLPQ{>hp*3iJ1}gE3f0FgI;be6=t|4AnbxXkp-!@1%<-#U&8BeNimg>0?)s~z%&42 zD8fg4jb-hdITL??W=G+_E)sLVbN7STXsT!mf+u3TIvXFMS!K@V0K4< zv=OBwL-h^0xr6)9A$hL^MB4tdc+>(<hBH9=3;ZKw!WK1F(0VLMjGORa@(%F_(?NP``( zN?MSpm(zcgd+>N)920+r!=xF8;3GV4-yP-G%ioy`jp;g!WVLUtlLlkV2}+WB>6tGHNbnglDVQZ^9oc% z-Y2c%7{#(>`)U>-let<;#sDlHwd9y!x>`xV!sfV*Dqt}sCKArKN)1HnPeCe6WEEDm z&DQlMUX;-d7r&`|!%!!@OW~>lp<0`gHSyiJpX|a87p7#0TI+9 zR6$V!9?c`kKr19#Ztj0frGf5t=3PQ1G&qP|(PC6Kxn00ymv0*=5U!rW%e7zt#sC;1zCAzRC*bNcf#6sltXhSBtDW(B;{EQB=%Oi}oni|f;G{Ahx4UfbIjL}9;w$Xlo zm6#Z^bDtsJbDyDBHJILMS8igL0;e}!A3ucb%D$HuV}h&hKLbczwg&XgAF=&33b7y+ z4hk)SL8N@X5TJ%y*{bEq#*-brY7YF51HbnkwLO8KaHFlr=qlMPNXfVjZL9$#h&TfLSng3;!{gPUAUm9{ z3w#EZxL)kP2*jX4+IXu;CuSI;`Qxa~zK54yNiCTYNgjiM7V(@%S47I?{$^%RBs%^Y+z}^FI8)ivN+{ zl$>MnzYPCDAPHDfIx?9XG2Y9GFtU@4Xr0gZezpfTg+x!N6HO;5tbj zgitZ6;mw%q1_ODZ8xb{QzH6$x5U2K}aQ2@e^Pm~N>3;J4R&RZ>PkaTt#n&^`s;jpK z4vDYlNoQ7X{lz|fJ^h$aVCKPjAFCETholZsA5F&%tIp>48^a$R$_o-*h#nwC5ZH}R zV+M}RzJ12DJ1C~;m{rrn8@l1dqMqGk`sOstMlOw(A;{1wQ-h2UQLBy% zZQP$pW2}-J)23hS;fAIl z+=U3mK1j!P1OxYztvhJNl(izTYAm|$rLk|4SVlFF`j2A9g1c~qK;;boKD-G~WL@YTm_$HD~l`1pfx1$=xaTHeRM zdlfx*0NBSTjHJ(>i!PpNwtzA13_GY**(mh(1pT<$ZY@;o>$)RL!D`V8+{G=)-|tzMaUW7{_8?l|S^PH9 zzdqfDWF+7+hm%^(8Lj@5`k58ag_qXd!z~maO_BeCmznz4s2Kkg(N--*f7`%ENf8tU zHD{Eh0?#RV6yd2si1C!b%4&{1+@H zolPb{XAGcI02ndZY%rtNBM5eLhv1sVAc!Ns2;v~E*$)+L`PvhMH;$1*WPzVYm#zs*eegLg|RCEp81XN}#w7=$`i7uGxR{O@T z`;^*;SzlX&r0D8(Kaj-POj0_;d}-c+z5b`Gwf$DqS$N6Ov<84!nF=5PXRKqV7zr{Z zK%Zjk*q?%u#>@TqbTr)wAb;j8XkR)U?N|M1ZJh8LMMIfbMcNA}u_Aro$H?+ktlsg{ zm#O#Bvh;5+!Q%kt31V%!!pHwBQcku<%uX)mdOrRo!YOXC5`Bx0_uwUH_2d8_JDmGw zUE=Wz{=I0e-1jTIJQ6KG;i|w9HIS)-I`7>QR7YvFZwa+&PnK|H8}rb!VSHPCmq{OsxbdC16UWa zKuOW6eW;$*J1L}FcuCGG`~qNkF|fByFxuf}Zs*Yyt|^_35THKmp%La*pKx-}Itu}P zUCF|p8e`1y>XkSkjV(Fpkgu<>ZQ~s5zS)o}_W$Uf&ak)zpn~u0B91BUHIeeo{Xu3X zi)JP}?W zU~xD_gm7Qim!qJ%+KSj~Eq?FBtcR*W+z`KZf;9%II((atZ-mf9i&2<)0s_^N8`Y-! z_&un|%V(4VPAuS29F7LVbpKki%lBaO4vr;ZOIH0E#OHAbHntYk_q%%05{1(xm{~_q zMJ3xiU&Y#ibyq>YT+5_hw_TNeU?YI;QeEvjF-NQH7a+{KiC<-k`1eI6ZISgY zjFYgXxJUqng4uk$L<9tVp${ z^waY%sZT(;BB;@oC7|WsC5!~{9sv{XqXbE~_Y&?5!X2VGu#P3OCqrnz3|@hyO0y62 zVy%`M;vQ&Ky86m4!pC>g6B?_gjCDOiP~co$~OgNgdT z*O)}jF^IDJPZ2E|lGRmb4SE8-s0?NxlfMQMOltfFHC?-iyBaKsV;4Gx(NXFpxAGny zlIX#~>eGWImy0kEZGI>z{3>46Pc93ZmqUZapzY%s!d3YXkX~KgxZ3{3L5vFv?Y(VQ zd8B&88Z5?=#q#h}tf7L2>?*zlZADhet|vVO3!|2u)x*~{F0|X=_k>3@9+41V({S!= zQzq6Ru$Tx%AI$Y!sD3h`^^;^~O(FfZA%caOypo{Zj^c9~FKk1Bjc+bTe{18f zKyVF3VE{qQxk{|2#owbfb9|A6ie z=~0ZRI-IJuXJc%5E)TyIW7-9nb+s?Oeyke8c9J~+Mng1~8t?$Y%616nVMLKw3Bh?` z>$(X=qQcC^6?O{b=C*=Sf#~0-p}HD4-c)uQs*9Axg;YR!A-#T#Sw;}K@=9?295fHZ zi49v?{tJ)Qy-6fkOw8*net2tc3}B_=QY|~4MxY-VP77u|+X)c&KHX4hKY#p&!y|vE zrBOQ4NWQVT4e|O{9C>DM7mB>Qx*3y)^}nH;k!sJ z@N_CE5bJ+q%3T1Hnd0R?cA*XEdY*puk_{_pmqwBeuqxNGdsk>>C$*9lNLOaEdsk{@ z$2v+@ZUq`jnZnXKAx^FA3`;wUheYvOPW=K5u4p7x5@&=LxzdJ%xGV>hMN>*Zd{XHNw zx=r*qeZ)`NV80~<0L8>Fk-(Cl!;qq`>Xy`^T@VxuELZCNyWoIgb2MbdP6bXony>(l z({ePU^FN0y+|)%e-HV`@O+SNF+zRS{f--gx5*#SQdxLo29erOZ-uFh{cZBc+m3R6V z7#LAz$3CQOrw`n{U`%QXTji31G=i090Rr1DD7TMhD7Zp#3XJn)B1Rq;EIU(t*%A#D`yF zZvsdjRX4TTbsDg9g9{VRpJEqWC(a{|adE^$N$SC>aH4uJZ#51wv?k02=}Cn(wsjx6 zLiCl6pgaE^>a3esjdRnVcl|4R+G_l6R2Q~uT2`~GQEauAf>*3-6<%2PXIBU}B}TVl zsP*aaB5g`4w(lfkl9d`xqOHCZ5oSHzhjzYVwM!Vfa>`Y{z=l&JUB!4wCG^-lK z%-vvSrC=t3pTY%b5oYS5%y?|8ao3ZO5W>hF+ws0qv-QYRXtj4&tN2NxWVD6ZM!Clgeo{?-62XrvghoF|O6ZA^6#jX1cpp&d#Av1M-O)-t zNXFf8zHWI7rdY%Yy#&4h$O3f}5UY5u6|3W7aNbNw%-r_#IcUg&OZU4QhJ91a_1JhHu4 zvdJkOo^z7>N7(s#4g%=Wjj=o9DX@72S5i<6mKbQmjVt)Vo?XP9v3VH2GcImH3hMz! z*Xq+xq6Zs(BQb3PY$bs9+P3Yq3zX(IW3i-rCJKo-aGKa3x}ES*{wVmK%_yX%i5j|W zlPSLGUqTY%@QM94xQj**9VVosc$pXP>S`Ne4<*{BbZyhx_AQ5@4s+YL+=E^_x1-qa zd>#|IH2x_t3DcuLn zUimHvZOFZ{_(eDz+#+Q#H_OsiS(tT1BSzwEbG54%H8r57k1AhaFaXU;WXvPe`sSkXx;vA>~ocRMs2(WmH@wUr&n`XTI)Oed=yggyOxsA6i z#@jsOZG-VvYP{7MZ_A3PnW&O#N`Salkd(wgu*nZUPkx6Eo)}ZVSRlIZp5(|sOZo~9OecKBtZ&znYw14LG##Z z(PxHeO6sQ@(2P-CA0d8tj=BhW6IJo5O=svv@OCWB!K}2w1d2JuJP5H0Q-*x{-f@h& z(YyXB;zjhncl|lyMQpZyS1lq4%si-u9n|UMv1$@FrvOHS1&ct7wzaeebo^EO$AAvp!}f;u;3d&O>hfGXDu`m zDOSsRV6c?m(HX{wHwYx;=8IFApCJr~Td}bm@eku_8-&ZmbWt-6#eIU&YCXT9JigJB3K^U z>kcKs60{ou+bqAo>kcPCLZ1s9$xJiP7?`q%iX zHaImm!Q6LP8+D3RZhU1q+@B)nF<2m+XZSr9;bG$F$V(NPq!&9up^ZO)+-4NXmJ%Po z7i$aEK{?sdl8jq&{#<7*sp1T_kvfG|G!L;*NaJ+_Lq*u-B4))a8m-R62EAeDJh3_K>~jXv1oM?Q6qusjwCC{q|pW^&X}mGx(}=D4|@8%6&1nybDZ`K!jQn+7opZ!>+i;WyVz;Feh%wv{Ujl1 zbs#W)r%Grk*z&SussE|gne*Uvp2}0?|A;lF`C$w{f`5c?@?0pdj;SSJ8 z)sVY9&}(2o_UV-4r9nJp8=y8eD~l|J=^Vt*f_t`dzPi zwNrfe7(CEai~^ftaYOxU`Vf*nMoh%{86wny6yQ z?H(OVN3^0Y1^*ROlFM=$0u_mGx$OD;Tl>*QxEiR~X1p(@cMlG#SXVm&<7jLvbK(MA zt)ibTrOP?BvTpU#WqCO^o&~M=apWzy{BR4x96fa6qz@e=oxR7WAzF<}EjZZc-dsY1 z(J9obyxCBXU2!=yI>eJeyO4+kpCI8beu~~b_>pw+D>F2e!(aFa;th=j-&p_cPUU8` zXw7mMDLLCu-@HN`38g@S1FIo*7F-BL>EeD)`dtiu@^%`o?FCEh@>PCAC~vdF{9PlN zmG$AL)(2CyXb@F%1XVrsBhT;gI+Xkk4KoE5c1P2_crekv&Kr@{H4Z68+<>=Zoq{GV z4(x&f6$_VvAl6z{fLkQ6*b;o@aWGfdvF@|RR`Jxj-ij>DyunQh^V*C^XxHBWg&&kg zoOcE0g(0{2MJ4qjmN8Bt2d1Qg;YTMIu0W7Uy4PqJN9Lx6u1_MSBuV{3s}eM-}a+_Y~9*LL~j6m321#M76eQCD!)AU^%_i zu2?F}gz1RxrKZPFBTk=r`LmFIHCEneWeW0$oE5}DS+PS$UDYQ>hl;9K7yilp+ux!R zoE(+Y0&Vh$^T&43F}?6AxR0<78Kqu^lB`YkLEYxCR*c6AM0T6h3`g?Jy_OXE^JxGJWzp>032gX z#-S)Ugq(>o)#0~Tdu$07o*g{0;JiF*L-v={2`h108oOiC{X1#S{B2AY)Yo;fwF_%P zSRK8rWbyr2a>cm9e~NFDhBo$g*LE}$db6!ic&+QM;ZK@y-;KiY@pud$XS5<4oFR@* zVLBmbU^woy;C8F}u|;n8@;kt*F;7nE1#uQRYrs~?_t3Ip1Irowz(sf*&y3ZOZB%NI z9GU;(Oc*-%8CKcJKf)Fou^#>aRbkA6_MXKa04`xwFSd2dYyfy>T3{NcciMj1qO0xC z!zUdJrgP1|M9>UEp1@yt7g_oI2lz4r!_)9c?i>S%A@Iu;!7RgfPBfOiTNdQ!Bpf+* zL3<_#IGcmB@QE!i@Lw)iu#39Pd0yP5JD!&jF39_i82Wb*RqPrM+`aSianjL2n+CEb1SJaQYmlc>c|bAeb%) z3116O*Z}hKzPuRB1Arm-wJs@Gb`Hye!5|?j$59NDiCG#yTuA&1<6MLSxIb5L>xE%B z=Vbw6ib)WivCE9sJyQY3MAa-v+LG9+1xR-a_K=tyTYE8|R`(PC@Jio+W=3(+Is6#X zcF(!A0f>Js3K9~FW9u%w=mEm73+!DgFwL;QyG>B8cf9O!9Z@es(yeM+f+~nf(Do32 zT99fs0T<~ajcd0;$g2y5BpreIRF6QKVA3hyjBUnVP2}@s1Awyx9mJnO4a`-6sL%1} z1t?>e4f$+T3$A@3nC8WfX>61>&ynBt8MMiDgj6%1RC7CC8}^gV;P?p<>Im$lUMn=M zpbWb8B_P=AuHIas2*E%pfC|f;>u+osGk3Q33^iKA#Z=q~Af$q8AKk^xPIqzRWgRNC z?j6=+6v^!&c~1s3+E5@Fx*6wEbpp;JNH1)6Y%QcTTvkJxSO|T8bPd?4v8m5fhXCyc<)pGido2+^*YWb0#19kSH0W1B|2399)T(u9OIK@|Ot6*MZrMX9 zjL+4YGqJsKKP6ly&i4MZoY9>xgE_m8(&9NQA zY!$L6g|feVl|^WM;+w=8Hmeg;!?Lpz25nu))$8;5E7RbJ27B<^I_1G&DbVJ&iUVw3 z*6Q{7yS^k#Bzop4oce6~53?7ERs|dF-eA*oDm+xv%J#%P1X%dt=GVixS-hV{OQG6G zS;hpTMiU$TRy6cTh$B1;v`|S5v$%+alt7=BAL;nm(jv4)eV()zR*>|4AbwShA(FC2 z-7jF|sdY)U1)>Wo>Ad1tWH{wZ@u=m6XPMn|IbN&7w@0iE8FM%MSkW*I`PYcKP!1m> z$|D4T1wuTk*X6-&WAI*@NjTB0l2q-dv^>gCYl-iK2Z{raEV*- z2!8b?5!U=N45qxIbV3;g;!{;0g?uA?whYt!IpFj ztmVDR`QVoEcs+nKG)S`{ZJ}~r%w#bQZ|u&(03UObDsaOOhePGXDk*+g3mxfIDo3MW zKe%#*nwyenJT^oN%QE@nO}&$Yxi^NyR=z{U&gJDtZ%!xZlYu@ z4vB7FBgt2@hy7wPESq18{)5FZ{s#cJVHxUuh}P(V5BoLcY~gfqC&isuj=Kg?mW^mf zu_ATZSdsGaAO8~Nw-b<7;%5RH#Q++=o(Rp5!ry1gSyb?!SR^$2BBoo2I#tl^LBGZP zSR3Di7?XPWvT|KV5uCA`5r@lcLU~0!cwF~Mqs}q*IGSWYHtIAEIhy=E9F~IY*NZ zDZ&4Ty|;mns<;>a&t^AaA%R^rYSbvH#EM31G^m6H4Z?<~ECxdoq6S1r#K_wXyS!LJ zk{+U2j%#Uad+DQXZH3lWZ%c1g@I4_k2}m)#)PkT!Buq6g$sw+H}D<&rX#pC zCAZjgJuGvkuI6Kk+)F4F_+;&fHQQZl007PPVm>ovd-#`x2Njb}F^2C5#XPt@I~eE; z{kBjBDR3l`wKm_zB)h`(;!R>1gf8n`TQ{CW=VZ^tlxCaa>0NfzsBxkUDP-Ud1`gSO zz14~6BextKsSX=$)U9oj2;ggqZ&Z~OoRospKqxqwg6^s`uB{AaBkuv_?Y6+D#^>gr zI4_2uXHwQpwO{PW^E5B(mf}~7%4s&89-4H?OD8F<&gsm%HE_b1LdjJQoP6MhP;TW zQYHw}t{J{|YFc_@WA-m3A#5cG2Ce~Nr3r>kiWteJvK?}oY>8YZoWG3vFRkVlnYz4XK7p>Hb?S{c^omXn+MVV~7TtbU z$JteXHA@(~vbIDaJX0%H25X@fF&F8nQUDPaukpwx5?QA0a952-whVp{@yPy^rh$jh zY^>Tk**R+U-|QVjA4A8t$1>{QgjzogFpEF8U}x4Dpy++%Pn0705LCq2!YtK5_HT_& zf>ce$_`j`M&^Fs<$0|l;5W;!*RqB;VpeWi;4b4~=`xYAlKUr;sW|fNSh&|n-3TxuYoK6t>gz>QS|AetJS{LQ6mpVyx z|C$N5eNmFk(PS(u3$5-S+gfXE&oYKk`(!GCRE1qK<<9QI)Y25kK=iR+5UsbVp>8WN z-<8Kx#u(l-wlb83;xQ#gwx`EGx)kzFl}vTkz>7-Ej|u8GX=R9IoK#{Jn6O$ZAZ)bF zQZi3U#Ba3Vom)*7;F@>ogDz_U&R@dLZ8ZyUx>+gFOBTdd;qNn1WEH-LH$-Hnh!sMg0kpKZGWV`FKZGb4zIA$^Ot^ z`$K)PP>dDf7SK)ssL^#pF8VCbm&=ATG>m3KFby8hH?0S|?u;tUw%TRqm{-7AwWLk| zAPO|C5qLOhvcb6Pc^@-@UZ9O0FWS|i+WsdiGE zAYduSwPrl=@jPn%<5sVtQgp^czSQYO!Sa;o686pafMs|w6@%WchAMdlRns^9uLW(9 zm#pKd-un=iSV=+bZ_QHizjQtPAigvu&1#C0OjeyLvKWK(%D*SeX1{@DwqwXwNM~LB zJK228{bOB5u$?NqHajL>rq#(FL|EIgomgxuC51YbBCC+p;~c9Jm{h6BO@Yx2s+({M zg65wZ`w2PmyNs5edBnFHt>W8vN2U-KL+CRyQzXys@a}`VkM7=|yghKd=X0ZrTv*p4 z#ohCfeRuT;5BZimt6d)QE*m;6i-e1?)1GsXkdshK&pVj?ctC+wLJ&)5A6Pwtlf=6 z^fn~lZGmnG)}2m!vv_X29r|H=b2!1D^!c+CJj}{>RPs?RBx@#TI;>gR{f3*_r;q>3 z^UP0M;Np3 z#<&65=$PM2v2oQTunNr#o81a zqbi(x3HH(3A`7e1%qI^Dw(IqLiJ{FEZ^$g;&>;;ftQuy{Bv^(hYwjh1EY%n6lr71T z!1<+S77Z#hC-uJ+EI$%S4&D?&tj#S+@%;%~D0Ul1%w+1?LaA3UBVwlx8degrS_U4M z#buNva;$MyonP)OKMi$vNlMx zP!-WdYG+F!5yFdXI)sCUYOsD+-MgWH0qBo89yj{({ zQ>~(drk7P-)yetK&|-^s{Zqz7E7Xr+w!Ks>L)UtHVOaNbr{P>Pe3EHC&TU>v+qsv5 z-kCvLua-EBWJ!wPJAIoFZN?dSna$?No(>2|v9TY_K|?0m zI0H=a*bCAZXyRgONMC{Y$Aw4%IL*VC$~NdFD0s4H1QPWT5M`oCv3*$FhT<UWF! z-N&zaDI|s5AIYnME6q1wiSOslMFhwG=y~GBmf|M-xGlvmkfvp2+~eAO9wrWdB-X2g zKRTv<#khI!`DfwLk0#zt|tPg?~l3UgfC+K*LY)IP^#IN_ZW?N?jQ{Y;#z>Z`Ae$Uz56U zo(L}KF9l|z z#w`3x60J^hhkw)`&Io^pFjkiI-WviVEA`b0V)n4r5qq7!ioISXuk_|vdBpG`c{WP_ zMQa&8>l3JEkO#|$6I1}xhhtO#+lN^yfbqjiRRHUU7pMSs_{5T*zENO=P8Be|GxUN0 zTU*0Eeq}pmj_9Kw{>(X6fIzGmUc=7XwWf(*WySC!a`{&)3x)ti8P1v2;%fL1Y@&+= zLjf@<$bxLE7xMJiqQASvd7OHS z$-{1TmeNVDlfku_-I61xJ3n5%7o_WBn5f}N!v0$t8`|+P3ePW`8Sz>hw)3k+H$6w0 zA(dVT1y?ed*Q05!i;1q4uHXw>h>8s1(hW(oas(SxU%w!243DD@NMXijiCQ%ZMAItA z>Q#YmWeri@@t+MdX#hCFf8j)=Znv<3{9*Tl`%wt zWKn3t7@`El7^3usKx6m|85@O@@~lsQAK}i)2ja#MH<8g8Vw5`cHfLCjI0nuJSKS|& zZ$YLM6S*f>L8(|n6nJ~(X(DqK=&kk`FGy6}9OCbHvotB}jyXg@_4G9Cvw@Mo9O8(e zdKGzNl@X(Kgvb{Y$7_UvLbRN zaB5XXd()2`wa!- zhN|-^SUHZ4pX7zo!rRSfIl6&~vEN4o_itxnu9T3~80(AXzhL6fu4b9+W;aDH#|$%h zFjx{*!xwLtHJw$1e#t8sP?WH?Dks(;|CPpT0wIx0zS>u}ll|1b(q9t{q^u}P!2Ilc zfi3x60Cdec_}iSOj;~Fc<*bW z;C>cFAzOPPkX-kY=1$+Nxu@Zt#r5JGTQv9WxFXW3;Izx3Fnu4Nm+Qt(qS}6+`ZBvV zVbojVa|io5>}Q*k`jgF%enWq}^EWx`NeLUtv`a~JLV%UFvENSMiO@ab`r8U-DhIAKed-ruVS}UaPRAx?0}3Nf74ZL+eJ8sx8l$PJM#l|7Sr%i2@)Nh^WS&Je$}A&0>6@lR ze)?5Ph>co^xuub`Otiu|;g(9_16R|rXRrq;-u60%(z11cagkVQ%V}B}T{DN;jj(Zfx4JqzbI6rOyZXV8< z{MeD;I8(|- z4`cTBmUYtN!C|ZQu^8%jN{`ST@w_4bwSA#gxqY!Q$Q&4h;eY*nV;|q0+QwI+JqPIN zzE-Tcaz|xsOioy1k|kqOND?_D^SXNp!&7!Yhg+L(AGN!2ie3L$_1-6{_x^QI(Necq zo`JFYI6?nJjY8v~oa+YVqXo1uHfA5&^-pAEUEeBUIT-W?WouLj69H~FE)AD~8;#4x zO~TRF>GX9vej0uneky({z8hcCQ}7`sKjy@D;ydsir;d%)NB2pjdOlt>?18pOZ6?e+m#R+PxE@yLnLjBlx;qMA>>i!TjFh(^(oF9`QgUo--hjD5# zFj5G?z{o*t5-i8H$dSWX`siBgY)nbY<1$AqR(#IR<}5UP%#+ijmdM*BgiTZDG&lO8o-vZ+YE4Xe2m3(2&%W8IeTXIeCqM0EOnXn>V1psUEbpQ zjSrdrPhkey@}XUw>|B0M2|5k2qK;e3^L6@!$I-=td01jT1yxQc)_W9i2xBQmK_3n} z=VM82Hi?L@T1rQb=%Yl&hN_LWAmRSm?_#y~^T`MSEnG=6<) z9_zXFd8CO>b}oCf#5_x$&3}QL8n1|Sy!j*%19z)V6=o}E)x+kRQ{u;1@$d$ASUoIk zD5tQYe!iYV--}#Vp5dZVyR^s<>ugxz_-JHYQgH}+5SFUJ4f^=(s6RVy2=wBtH~sEg z{mxqh=M+^Pk2s5}{t~elRdq+tO_NR=qNgOWC5W7Beh;G|*2c+vf?!b8ITfVEafE13 zq?xs(=^2_iuRptjt3e`#7n*m+^5pgBF+beM7VwWsb0Q{JD3{Q5QfDXoygwKYOg+Q9 zaaOPwc@YBwvfPW#uF~EeP~44~I)kS(%Ne*Hp2@C{WWeCW@O;5(IAzT&9XH>nWIaQZ$BO>%2I&-dGRvt$3mU&QPCl{@QP=^-%<1xxp~*IR_bJ|u z6Wa9&g}=7BPokxG4V$)~%7aLs4B5iwTth=e6LlA1q&kt2L2U-m1`T82)2 zu2{u#kG(`h$An31nR!AF9tN*co#`?!`2n4#c*lWDtV~I+7e`=LX|QM+pci>lRDE18 zCKZ~`!s1ahvlt z+#dBxb;j6PHW)8;^1fmlR|3B=?rZoi!sgfw0$NvE>HTtUz)jdgvY1}wOHIPRpy(>w zsb6z7j3ZOzWd(*ZMT7xNR`ZVv>&011imfx9JGmWM7!U917}aiUyG-kX?A~5I%xErq z9PK?vX3N#Ghi>2kzxXsB#FHpavnJZ!)gxiN8#`_tn}(fU&zpg6eS6f{n$=w3*;-@E z3wqOn<-NJ(nSo?F8f7zXxAJBh*GuO}TSgZld6hamY-uj4q`O6G0^GQAKJ+}g&|ef!;BVDL)$c2q@hNk z6^hVV`SINH^64RSki!z&016y?UErTk5gH+zrjOn*`keoF7u=qQ_ZHUwy zqFv;|Li5gsuT~y9TLR`&zx3aX(iflTQuVj02bR3Fs3^BQBj6}1iXiUJe`1?hvKAbkJ|G6V`z6%=4NHx32q0tJA8oG5EokFSpc zptZ}#3?BRS98AAD_UEiQt^2TC=zlrnxS7kSi_CrRs||qkk1*2&0{9Z$h}o$$b$fdB z+!UaIUMn)4-SN&k*56rEzIBGqdXv){-K08;?jPJu5jFSH&(uwFnigHqx$K3IXErZp z9OMXkuJTjN;mUWLiONqk|H`MM%hJrhh<}6mv3krfKT>|C`JVDen{O-sDsz|ev&~lJ zk1=0Ye!BUh^2eILR{nVN=lJ@zyy&t#^9dC-+5DdJ3rs`#Q%zm@h2}SvKf_$A{F&y1 z%D=~)tNeS-yOlrBEK>e_^LFJgFefR0iRn?k-^@||3NuUjtISdOQiT`mm^9|O68qvB z2@X@iMhPmZpcfyN;BgTUdU2fu!zw6z3iCY`Tra`BD)^)X+g0!>3BIO+8zlIzD)@{9 zf1!d(bnZzNY?9dTsNgmUKCFW668xqLGFdfq2|-om4tcsyC5TL(S*n8jB{)?D4@q#M z3U*5H1{FLa!7LRtC77Xt$0T^J3htBOFcs{QV6;veeO!XaRj^lrVHFfMyZN393QgPG ztAcW2x!JCQBHC-dMo?8*2r=ewRDuX;nj2IwRf0cML6I~vA5+0}3F<1CA;A?Ym?^=9 zDmYq#_o?7j5-e50Yza2^SHuogfmB=QR(ApWj>9g0y0JCq zVDr%gzcYA2=vK#VSc>Sh`;!_km{<__;_jI(#{QmzdW$;?(W^U+y^y#_vrW7$@I`Y( z-k~JN?SbCA!o^XJ-@~HkI#~yv7QwN&5VP1*5D5&QX&&I@1$8tu$u>b|+;SHdfQ&jp z5(wALj0A$^&gL4YQ*;B^`Y7u)Tn@dTP7&7Y*=xPds)R;wZ)5q1R__;Lq&jDNV|j0@ z_k=c)l313Oq_U5c+nT3~Vmjqu&em)=A&{IwU%JP7kIVkBOXM_IB2!(Py?vv+DRni+ zl|)~cj&8+(c7%J-f-I*+xgE3A)gZS_l$g_n`1(rxip+16n0XQ*b{Q@$F~<<*bWsvJ zKAD+3b08^`n^=dGMKC$IHZL=?c6@?sjo`5o({8;S^;1yKj)8(Aga;RNkmoZMgc*aM zsDfU$URDMDdQd?>`$|FIJ*^-NR@C{+<=E*xUX>^!NrmQ{=u|5nv)?*dM9SsX=dRV+ z(P@qqXB$atr%pKD=rl&SUbIaNj);svlWW3p^fw-DlriH(;%}egsp(qPAt#SWhMw;@ zxnj66f(Nmho0Je4&IpL%%Ih4EdDZnnN_XM>hx+#mf_O?%?B`gXYEI)c93we=`p?m5 za$96FgQEM#mY4^aJ0%#@D+|jV9lzszRcIcA_+qih6Da{LkNkAtD7nxyDPONlhq7GB z70Jq07pKF~aynf93Q1_vDFgg*gZJl}`}kb!%gYIJxQGlFctB-Nir`4Mffrj!%ymDL z(ZgC}i8-DrF<4kxNI{W(iW~5*uG^q83-?@w2FqpJn&*vw8^$_Y+sUn7G>I#MRa=38{@j zNQt4}7I+#G$*o)ud{m@A&ma7~+99E3?oh4!w!kO)2QI9QG()Py;K_Nx^Ft_*)jDqF zwl^+=wflz(VK#rtt%07Im>X?*nX`|U)seMhy0JB$;k?H4RfcBslp+cOpO=M`>7T*k zay#XG<;xRv1E@)v_!@uF*m}6slp=KTcnjc~#V(Se7glxF#chC*b zx9EnGf9Euz^g?+gFq=SRvs61~q9#T-%xRiu3@1&iU+IuKa6X=%V%(XMJKc$;Sn!e7 zQZ)UQJXVxQax6e0DZ$&F!AXwbgDJ(+3ul&sd!8;<#9i+a4tz z>G`!uDyh}xdfJh>^kY`EZ5f!)7#Q+@tUM#C3QB>8p$hsmlrQ)^e&uxRTJPrHLsaU& z*82i;)Z=k_liYQp=px|>^pv{TJ4q#8O7kNhz`8zPtl!GD-omo@%C+94$ZRgEO5ld? zyOUeEJ|%v)_pTp-2x518Z&l&`yS?At#{6c*K`|mI!GXKIb@_yKw|7G9Zttu&xfq+P zTVj`cuW6xJQSdeb5oixr8! zLP#CPmny2f&rIq6ZZ5ZcC--+-WQfsnnb4I6uK89-xx}1^QklZ?g+Eoc{!U^szPoM> zEwlxa^^*yK^zOXLT$;|-<~*`i*}%`k4 zvNlmhOIQw!?7s9ZR+-nHaTE6w6u3{>#Pv0n|FzY7l1<#X=8ARFqXxQG!c@UPub5|_LqfB zGvRr*r5d=?>kJjVp`W;5`B_X~z(y%=w8)4JQr@ueU1>=Xq{!s$ejk_(>F>=Ge|Oi5 z8G`q|KJ3WaA^yujaihRYuvW+YxjJdwhszTZJ{s3XsD)7LxK1VlIug5cwvX%d4~4}a zjaDc0959;i7S89+=w+Ee{Fa8#H22e@rPP*K$L}}88lg3Wu2G>zLi1JVQ9`>-GOr`h zmMHh&{`FJIyq?g%lhBqZLR)vJklcKG@XuOIR^Ehy%Pny5`xDIvF-UpvaGaQ2gf$;5 zX@PL&85c7OSj35~XwV}5Gldsg1!8 zte4~GO#Rr{qWT)=D3*l4*;@`Df#XU2Y>=?kO-6dfek{Hn8u4$MbqWai_UAOKt3T41 z)wBsqZiY9VJ20SYV!TbSILgrU^eIf5oIrv1gqs9B!K3B9Oe}b;j`TfIUlbmPH{XeVDAs2;m1 zcrR1j#&Q8T2k4x+v zz-SOldrZ?9Xqlix3$!4girE$Of2Gl!cF=Kb0yhudZtaZAv0QCUHT_8MyXl#qxvp|# zV$n6G?RA!Z%yD3R=FCdHvli`xTK`^^IYU3vb)f0MjLfw6S7o~2$LJzlaRd%BVc7V` zzZY)Uv+|My>6u1KX8oshL0x?_Q@>X4(8!j`)zguyVyRaAek=YREs`o3dbUdLz?K8| zWTuH5U{YDDSeNkP=y$)mP8(#?0uZX1ND?XE-Ha9et1wK`YXOYOBWJSP^IE>rPboQ|eB5<0+pQ9R+n`v;AKfk6AS+TAMcRg1ZB@ zg0;i)ZfTU4yM@3#tDj>PtHFVf`RJjv_dC0{O?>DpcO*`qE*RWGid@?Rk;8oYe46LO z5MByb(x4RsOmPXJlQXrzf^d$V+~l$?C04qH5-k?jFJ(p8rkIK)81ahAjefn`Fi28Z zV(%$2e?$Q!$L@)c7oFz3*ea=@){2sgeP!W{0Wy3=*aPscxf#`53IA=o=Rn|6^Lvm4 zETN7Y3B@S;af=i(S-G@l*@0YN%4%**OpzU(-ZV7VD;N39lvgi}w3LqZrTH&0ic?{O z`BGdzX~K%vxT{5bx7Yrr(QMuzs|^>+-F&t2c_69PesyT6P0+>abJtD-({(kDFzVD$ zXlu3n#-yC4v0jwGn(W>bdl%gb7Q&ieBr)qfd%1J|JnUbhK6=-?(nTp?06&)nVa3gF zZ%y(VQ&MDTuR*c8U}aLz{?>fk)u>IZO8#NhyxBcbEk6OOUGFe?9;Tk{##Sxg(Vf`D z4#YOwpUO4n0aukhG|^T#-MpR=5{y6Jg;QJCY%U(UUd% zq${(Uxw*L8^%DY8P-vQMdLcuh66tT1WN)*#Pd7W&${^D}v2}&F^w_ z&#g(Vu?K5XS@*FdIm#SE!z}RPYAe9Y6oMWSgUaAZ_#)oNEa9^Kpi;dlxitwEq#MXO zNnRkUU6v$__#S6Gks%1Dz8pmrrfAd-E~DDvYQPjHX9ZWoT0taU#b}pKv+GSKr5UNA zSqXB#eWq#vx4rr=kni&m%Wj)kAc3wJ{yq}hb)KsOj@G2B^YxlEa%2O3C)+bS9V;61 zZB-RutP=BbM08}U>{?UI3zCmvIk~;=gU-6Rw@3N*^o zsAIgio`V-1qOVlhL_@%k*u-G* zu?RO{96L#WMTU^)S`v&_>`!BYB^3cIcf`eAY(_AKQ-?zQ8z_XuX}Qz0)upT`1dETe zA>`aZ6H>L+Q_-*(RorU~alPS#|6RdUCov8FcpATSj2BOx% zD-F?=U+;NezR$JWH7TpW5GkUv+hSe_6QHyz8}>9CkkgUvz;^Mg_*M3+;MQ3sr{dNE zM1SMBbxS?CHQStxhp^%TtVeSN8|d#TD}IUQ$zkSyr zL~Cy=H0vNpN|R#v6~=p-!mk`i-!iAMHjvnFvF@Y$`Z4Qi4FE-!R-HGy^wb7Ca<0{Y zZba>SU>IWIJ)BP80W>$lA~p8lMdXiUkAH?^*3s22`Iqo$IW@ zSn--BX^~RSB?X@St|y!I-o8~=d%USNquC-2TRUV5<^@hPPGLWRu76Uht^Usvft11;+u4ElJMTS9Ew7b-T zkSr`yJ@!6oL;ROhp+@DIZfdr678do`vZTiR@Xb{*knsFT*Q*5J-8i86mp zRQ%4Y`YQHYa%O>=Yh|;JR7@uSlu)6wj*H}OR_9^Ria%9vc22+3w4wW<2rwcVlG&Y< z;7{xx;`D#UdS+;lKzXwHkD$IoAi;l-BU}FkCUSz*3~j=llO}cgM^5nFftNNx*%80e z{FyLAo>~XUXyJWtAdK}LiP)kdRwtV}PtitslEV|)0EPF{nlV44fi-RpboI54IudKK z0k{+#jLmgyYneWIt4`h$(yJ$s>c5Xe;Oa!ra>uGf^CdoGv>JCfjWNv_^hOGMSth?8G<-&Q# zmM5;H;U<{foc4X`>_fJSZAh;hh;pIp4ik%vofI%1C2_iz6eK^n%_X;igf`Rkz|Q1#_odo0o|a6 zBR~=QQ!?DxNlT@2^{X9qJP7#TA>a>8&vM7Cgn9B)mZm`qF=nJWJUdoT^h`~2)_R15 zKea4tuhG;PD71Oq6sswomhdK>^hS%^UH=QKN3ixCoI<_#n^#FU zn1|>(gR6NPRZDlNrw*&7^*1S~zC~XRRF60EQzs~(9x*||^pFV(q%-xJotg+Hqb-#t z(pJ9)EQMzey$EyLm(c-b>VEUI`Hao=KL+sk1dAb~xrH{e!?i{PQN~VpauWans8^mH zXe3D!>M#=|Q8W%XTH!$DBZb@Gxqzey<)evg+@s6W%s_E$&+Rt*UI2KNI zm!!aSO@`1L0``)Koz>SgC@6ZPwIP7L&#DZPnJ-c#%)UJ0Q8|+u-=4zB(`o*NI_TR* zGbBThE;yH$`_Gk%8d!f5+iqa%7$a9|z6%3F-%>|d^G`9~;whw_%+zml(j0=CMv}Gc zU1=?XqvFz?11H!L^XGg7(kBPE2DO8#Nz-dn6)t{iIC~1KlLqwWH=jtNEzmR#25;}LfbWG$WxslSj4nJuI321-ZE|I#;uzf zi<<&pSBNOX`r4^jC|SNl&h_LphpJDhMZ~oxNQq|8V-&8I74sNDzyuqoo7B>g06dkk zIlTwT|BdR8l#L zw*m+~Yf`4KOMy_QOPBLkXoVY-R2-p0Q@U8%a-FVk3(>-J$8p!U>j}h&9IS&Tddk(v z!?2KtW;*2RnPbF^iY`kxFoqR4&Pr+i=!Ek_%QG*>;KoXjEm)@32H9g)=*S8882wGWJ zla47$2HiZ-EqyBY+_)Nkt*Q*~IXY5-mFrtiN=$9KSfLc-vs_o#qejlc!DecRk$1_@ zFn(eSca*-@Ycl0bV=ZYVfkaS+;FU}>=ij7uX;oZbDu;~}bEayvn~pH=r)*}3{>>C^ z+1I6pu7)TpS$y*M#>Am{tHk_?LO2=bcjaRW$Yk#_;)Up-YnlWz8K0V|L2#nl)(_sq zbM7{a)yvlYzzf;Tns4mEq9b2X>uiQ`mgi6Y3+uo5I@k-lj_y%!d-hfj>(0x-bn5r$ zknV|&O8AlR87woMI<*eeRADH>YTZM}Wk}tTDt!gGNfl84g{kSVAObZZp`%1+^$8JI(nkybn%GbqXYp4BDlD1ix4 zi=PU2p-8T8vG|QFg2n6*7#Wz1X70O)Zk0wmX3sL-Ehnznh}54D6dy=@N%lhIwB@7*aAoSO$h87oF=BfVg`eM zc4z;wT0i!8>UqxJsONcu>$xT6|5`o2m@f5=(o&hBI+8_y+adnr#5LiL;QDp4|DOJ~6pjo*f8Llb@K^M=CD-59-;R}WKbdCW zrs5{!#^c7|uEJ&F(D^-r&hLLwe_QoNR2togdmQ(SlpWU*{=cTbos!5`EdA|Q9jedb zV=`EO+f5QMl_w@Oxze;fyBhe=D)7L?Mp2(%G9B6uTRfJRPgyf8`Oee1!Rg{)Sko#*;h!^OgXHjLC*Is>U0B5n-NLQqY?eq&ORvA;RuP*z(@6i;W=JEbBdIMHDYb#4Cgb*f#*_QHi( z`#v!n>iGgHO^Y@j?#JjiqP2LLIeR=?17~v{RZ`0$BT~o}n2}rRTWnB3vybC`FN8oX_@TgQU%>(QGb@vlJkeV&0kLyTpH&x-VS9^@M`?8 zw4^vEn)B~)`LSYKbM6!`yn1)f{+@UA{TfR1sXwqI|A{z@>#RR5^mjzyrt*Xoyb_4P6h1gT~ z!N|QPJ(9C0E$flbX2>n*gegieO-P2Ow54}7wVIlkuGPHV3N7%f%vqTK?qiW z*vv%7+&|RpgB6S3ccS?@0j^hWg4|XZlO#rhI3;UdCRcct21gra3<|i!vJ3eq4$llb z`-0<^M2A%=_Ef@Z3BV=q-&u?u3_eH#qy&9CU7HJr6&VNM{?+k)U%OF|6ofHfkbv#Y z`VR%b>m$*d)wO%2K_8p`-uf?Xz)Ik93)B_k z5}utIZsb|7IHZ+?0$rh+BO5nvG$yojV!9(V#r8w}@JRbsG#5gpw)(>(nP$QAeVj;E zCf=s+=)5K5Z|JHTiK&>Z9eH~@gT9W2q?quncfYU6Dk6RYR8+aH=|d z9$93x{jh3e*{I#B==wiPxhoUz(BJBuA{EJci#sFs9u7@y=rVHcUtnCu$jzAg68m4LbuFiaEV9uVbUGZVMHZ=Y`&&g_s=L;Ew{W1o@T)1J8kqp-*v7xHA zp~?FhBX!cY)Gk(+uQlE(Sot0VOEo-S!#YWaKuFDSMrvSujNvm(R=?Khvb_5 zt2+J>NCukTVMc9D3{>XHu_!#ik3a(S12A}@exkex>H@nD%FcvfVX zej+1~NKEhoSrlbC{E2ta5$JyeLhYpT|6fC>hiJ1PRB8MFqY$c8`2W=i^#~38pNLSU zUY?8h^ZP#lqNLN%TL6P^aY$La3`w*`elaFMT8=nNJ=w>DvXhCgNeP``8hFz$IB9KBEs$81SQgptdc8?Ev-}qq6rkd1La1LQOZTqGrm6&P zSa?)6)R7H(#iLknFN-`uiNU}#6uRu$uNLR1azuVJKFfdU_^bVwjBD|~GJcZlv1=%7 zym$4mtLBZjxgPl%PgO~g;B8gOku_H3To2D?jr~elt~Kx?qT{flvQ!d_p9>3rg%3wA z9G_czpwBNE#*oQI(t=FFBrCb0qT0l`Xt7eyHn_MHEuy2tNx0DsI$$XuU=WLH$K+7{8+&;|pdRJ)b zwH@^*3R7W_4Yj)T!${&w(|HC!Bgx})UEc;AqgK+VVF;AbsPB2cb4T6Hn*X>697F@p z%hBC*V20E1KA8jI9GS}XH3$USy_<52p9=bTO%brN%DhDDWP=R76ItWTzmBh77lY!-^-!$Ek^M! zxi^gtlj9ro2-oIG!;G$+z^<3%_&93!sOI{QlFaSZ?+nxeW5W4 zoH-nxE;*PyPk9J8GDVj6`R$d_A-Z=%g1+#ngsAUHz2-@+_7x0oM!oB!zGnpbYS+~_ zCp1yfhV83wG-?htL|0@P0fdkD?XK9zRUO9L_U`1a=A$Dqu#>!1R3&5zlQ@Xe}g&h^Nxb%SY^3X&BNLs{2Kt?TR zyU=oSx{aE~WbdPuL04sP$}q$GcyM__ur#S(rf_4fEL6~g$EHFz#{ChObgs>PJ5I;_ zGp-AF5I6HYo7;!$BOGHZ`3KfEOd7xhDt5ml(_&OJguHa1jElcYMs*;${FGK2EPt}i z+aXl8Ht#;m+rM+?mp8MnNR|Cbt&phGE4{Ue)s9|ff znbsU}h8&X~Z1RQHI8*-p)nm=Q^rk>r(AVjDV}Be6_8bIn(KF zaB!t-iy%bZyjSw9M=E}e4oK+U^)rk&o4>T{9}ID=xu2K^x2M>B>$w8h_o^DJ%3Npl zSzH%hvu)!>P&OE_HRyen3tW6#pqdGN%-1UvHDh;9@zK{6_3W^Waj^Iqqxk5kw@2*? zjXBG;`J_q$k-79=@D;F}OaC!}*DVZq()GwXd9pCz$>nZ#K>-sHL}VGmdl>&15}eZG zg~4wj!6SkMQ6*JK@M!osa#3vHoGCqd77`qqyTlQ2W4O+-C%(E4=*DPpngFvHR zvjKfMh4zwk?>f-lfEJUY_e1Ol{(!=+Cmu*CwbF4rU1%aa9IUCVD*7oMWC8qSs6 zhWE4NnrFbmoeW3Ndzk(YdOxZR)*Mw<6lq3xWp3aZaPc5KjG#z(4mAhxnC}u~xo&pQC*0RhNYEr5Jg3v#WcT89@tlfab) zQQsE5W{Xz)hFXUEf$^W~TPx~x6_-oR|q~zh;1FcPgS%otP_DK==GMmc=3BfBd)*&*2vCbL~) zwg`e~j{06jhL?&2_A?OI^}JXA5#yw-9!-|mTMJFu2SwzqPQeLga`QCxPA8+dAC5%m zE=RDOz2@@>=sos=e6g5`a3sX7(1Pzb@?E2*Q@+l&EJaJ+VHBH2SM$fhzfj%{ahPiTCCr&m$0k$$wnDr|*H-78e;J-47xxyNtAFjadfH9J`R zDtE*=JRM7I6Yaj8g7~&4?+A^#8KiFnUJVLjNV9j>HNzX_JIP&*$&)xiSf{cht=4B7kEWRo3#})2)EypP zw>6`&Frk&5MIIyiQv{=Onz~!uep_C5i_>q{+a2944)LAcEeYbgyIVlkm@nyR(YRbl zf(gc(FQWvZjoMN2x&}t_kFunD{O5Ug`IF(Wo-3%WXuF#NnEQQF>GMlXlIY zB6|?_t4YbNk%Z)}v!q-E{>g=eEd09et!{tf7OIZ;Z|N&ie)m?VKOwoLd#gioQC9a> z)EiXc-CNOkP;b5=@F`seXsl(X|;x*Vm<+Mzy{nHT7pIqptq*CrGFH zog9tMPX1G51lj3=h`dGvN4+Il2oe*J6rxlL5w6WGzf|`=s1E=oNX+}Njf{oct)t$O zg*rtJib@i1zd3}HIcqT(^1#Ag8q#Z&_x|VGF{;%++N%9UR_#-${dv@nc73%4K!LRO zZ?pnn01B*5a&n(FQx_`gOTTAg*azX|Hn6`lWOUeZ0&0 zO92oGafh#TB%uVWV+h%-n{JZocgYwS?XL(pjCvF0j1yW0nbYy}@KZ46dmfpr`tOR3 zz%ChqHv|kuwdrP_KmF>aS~5db%2T-+4q8jmnw?P*p9>C-86Bg%&YnG^-cIh|NIV1~ zi%q1M=dc(TvU@V0qUL3^hMm>%oIPu{OMC8OD{nPu2W;wCi*|6OajZ!@5(r912~;VA zFb%unkYzNFY7t<{AerIFQ_X1!oE;mEVfYly)O&l>TY5Ope{p>{){L+;1E5mP5MP=h zK0+WyJ9a3Ny(vA-^uL;|npQVh*)9!9bY<-pM)x#68cYk$bOdKQ<+k64y>wi#+>Im! zn{rba%)3M5hbjbpksxR^A24|Hxp5#^(;LUsfnNJ|LC|j*C)lnlgl*cp5yVJ-)Bbia zJGjDu&;__S(Nk>7mO?0K?ETzY(Cxq6!1^IYBBcUTGR_$u$g#rVcTD7UBXCS*OTW?c zK1lt&Q_Gnd%VkG47mFaqm-g+(XR1n4$AhdV?@@+2P9R#~47zEt>-B3xDc5lh@a&+# zT~c7LRk2>AM*Nwf+huimlRBMOQFim329@MTh2K37$KLi@* z82oE0G`dIO9Mb!XK1Nc3B(+OYTKrY@{g<}TA<@g~ zt`%E8ois1wdYk(t34~v}M|%AK|NFZ=FuBgA-GI9g=fw5a+O)&CJ-BVSEx6}!>v0d` z9>Oib&BNV^y9JkxI}fMfx>nn?w{frHevW$-w+uH6Hx-wOI~z9)_gM|!!tKB{;rI`- z+q6Tt4qOvX{4Z0oy2A0cCEB&Kfo=(72?L=4y~|hPvOSmG~CYR zyo0*|=f)jcX44+S-Ge(D_g;WH;_kv-htqKFew+3ty-#eD;JHtzT$oAx@c5m$-J z$7SLixFZWG6E`0>4mS+<&H~0Cw+44F?n2z52kCR%GTfu|&lvppUlS^b@o?!X&Hc+p z&HdW1xD@D5vT9m?CGT=4PtCw{JU;H9_e9ck3A0#g66l>xd+(q={F6WV{f7FdX+G@% zZLU_WE!LLeDmA~Bp_LG~R10Wxv;{m((z5uMq1{Q$BGMnw7HSndPbG98Z_dH3ROQOg zXswXv3f^C;-l^aXNzcGv%t8uq!w`w!+ z7xKME!&a-tQNH}ih%BO{_;bFh)4=n1_2%GKN*`LIDP#K} zPWok$c9SYkMsgsxRqDjkTA$J1dKrnYNj>hhxqnd3onH8d@&EX+=Du&vyo@;u7A&4S z$N#|MMXGqs`L8zjy|~eQF+lGvh>hduMS%qiVnYgVHA%B^+qh;=(vlL~4zJgnD1X;y z18Mw?&KO%bbBI&BF+01o5L#|VhMeU!=e_gq z^H`}x!0|L~${A8LZ8C59w23Om>2In}F#B%Mvb7xkNqI6eCIT;hzO#@~m3d*!uQ;sw zsKu?+M<95ynsqWxQfq;3fl8U<0@E^6r4*SBVPIVun$aK4N@gUgci2ULn+ zi3hZY2EpzyW^BBC$v2O5nMYDv>zgu*EgT@}gXiIyaltppb1U!5yp|Fc(hdt7$hRM) zT&wQ!*=EfTfhl=M@R~J~1;*knvu1O=pRQK@Bz-CKSRgqATy_ny3+S~gc&b!TFjuwN z!Xg9xIfwMqduoxYqdOJ9WIJ?0A1q0zPN(EaM`5Z>3m0 zEPW;Q`v!3Pe;zKr+K%l0cEsxx@3%9xVBS~y`#NoG|NAoM<10*jcAcq=429tZZsT>4 z8EcK-b=r;n<;CmqkB#4QdRx}Z)4yoVN9olweeZ_<#P?(-$sGO9eDC`H?=1l)t+8K5 zS+Y9DcMzw~91A)Z3~E8VzsB^J_mB72Y-%p+-U`0!XUz{dKLD+yA{Y zjrU?kRmRK0d@`RG$7Yr6W2Bt|*=H*ER5+5lNlAhSEZicy0)d&okMFM?1V2*0)60>4 zkzhG#`Fz#?a}@5faKMBAVfp_Vcscb;^HhJ&iS>dtj@PnQNw3H{CA}|L!4EzaJUX8k z!Qrxxi}$VIDhunz`_d{Wd(im&q=U*SoMv}VOdL;@GN1$;!7^0RIB~-f=cJ7Rt0nd~`vy zG<+0DwDw$^`x1%AABo>I7IFaoO#H9m&%eRuUV%RuUv~VX@gKrZ!SBO&;0wjz2qc8B zo)*0HowaBB8gMa8of5vfx13TD-;0$#uxQ@m%VnT<>Kmv zDxs8bkv4VCQvbxc{s)#-6fRy8Sfb*rXR8>^$L?;<{S~(?UQwzQvoG?3opZG7Sdk{P zLz+q{nwC1p=KjSa)?T%E(SwT?FJF{Vv0`q;lGt`ttPa>zPU{Eys+NJ$ay;sGRq8Z; zr=C`J{(`0X)fE*Qeo=+LWX^(s3RCs|@I=`fOIbpC!d#I06Z#V*VfFWeL19e9Hwhfb z-(!Qq-yRfRHz@p_LE-NX3V&}<`1yo^GG7=JmUarPQJ%WovOp`~e6f&!A8$EPlqljj)_n;xSfz<8{>7$qSB$1ElIBWlJ66-?n@?{>XQvCf2v(-;IA$^2v9k z99hj|WfeSY)jgl52L?UMu1az&9TZo}_vcZ9?6~7^&LG#|XCM74yYqOtMWmnlEZ>$o z$@et1dkf%OWy`aaCv}%{q^|Nlc&1?7!iD4HL;DTQlkv~YAwIwKJB(Si?pIS z{y_CS68Ounen5q0%nwvAjm4E#%v)3udzcZhLcYa|RBBNm=FjoVyBhClgU4A-Axwk*Z{j zu4}C0EsbOD{Q2{p&LJz7ELpx}$tmaCj7f_ZE?H3FugI`aXU0@HelM=RTnd=9V9wH| z83hkiR7-EI%$QuUbZ+$nOJd1d#w~M}R>U$*tgfE3l9vX@4P?)lS&#$h42yj2cFz<5h-i31(fs^NDECZ)6uFjadc*#nB7A^Hx2UNrZ zerjgb=H6JIW%o&){$9@i-QL&0H&JEnPocQzB2+~MMGaU4k&l_lBH<%PP3IqJqHsK4&JA zPSUj0-F^S>zW|%I`*v@&+h- zqyv+u7|Q&?aCOM5<}cA-=UWo24EPKvI)B(VmC9XZd|! zW+RqNJPpcxY(c>YlI^e@rli^vF@(IRTmfGIiIlXEPAnQmCqqr%&8g|6qoYeIKApdw zUtJ8~ZH6xtsfN~ieBovhRl2Jn2TixyVnU-y$^hj(rk_c(z?6g`cXvn?IV7V~&Zu5` z%iY!fNOFlc$FCGwvhXVN&FoRWp#DlB5PxxXHdq{AHxKz)Mf*(4C!fagqHvszlw;+3DYKCHJw)U znP`iPs{^RzQv+z9i;F|lBKXin;JGRiG7GqS-KFRRi;K(rAl8Zu9Raucq_cQOD2&>iRuoE(9DzQ94C5!eIl0A2&? zfz7~1U_G!FSOcsC>VW0ILSO+fAD9Q!0<(b{AOchYexL&I03|>XPzV$Nc|b0Z17ra% zKm@FS0I2H8914fl6Dk02s8lOf%U*bpbE$XSRf5JG#oU*T3`X- z0dfE0~mm#!|)@Bmhz7eMmsjQgQ1&;Xl( z$r9Dpz?rrmKzvIsNcinx@f_v|~f8nAB9$dU+ z=|jsN{>>xHAARicx+k7ovGS=^tJnPY>1Woid-l2Y8=n8&#ur}PwE6chy}acQuWYT~ z_Ua$EzxMhYJKlWjPdne<^-jaPyWiXM=l4I@`{BNiKK^9?r;VR|{zcP)FaL7zuU~zA z=T&7qGskSn(HrbgX*j;E1mn=XCY$mg*rH~^ z+EoPm{9vqg4Q4p}F9I#uyozFUw4zdq4-2U)7RA^TK>H%9Ku>lRy2y%8wj#3H55h=& z1m4K{7Q&sZ`Ly?dR%JcN5v^8|uWJ8yqNib%IQqhvG|fB9&^K(Tgh9s;2u8?Q5Q-RP z`XUvEe(9J@B>H3G7IFImhJJ(lF(ZB9Fimm10goYAZtw)ls+9?Er8_hYv-N&OY(FNm z!squidyz@k>j@jG+#yVj`-KgqK^SRZsTvWOf#JW$Kxl$!DJ|%74e2+bTKl!A>SKP4F}3x4Xk+#FjUo4!Qg?%KsA}Wh;KE5 zxU>|DODrlw(iEF{GbrT0Ji&1Rd${!b5)Ao0Rr&sAV5xkruuS@b;A7f`Hunb9y=L&qu!1KI#0810WK-_$t6wHfwQT~%DqeHY@4pFl> zgmO3}s}$KAqGoQ0nztdbtPN2!Hbl+W6xcKkR1BoqVazQJJ{V#%LQ~ZW5pz@PS*h0m z%~dp<^iK&#JdX~*Lkkn~POtWb5Yr%oTCUvSwrErnf=UxhSE<#Mnn9JI0r`fMP-m66 z%7UR#bydVb>SjQZ(ISmO)T)%hPb#451JwX(9oz;@p2SPkPjiCF2Gt5ws#%Hh7*v*w zqI?fDL}mtw1(Z{BM#CVF<#e(dUQM5KvKtMUrGcQWcc5kPBPYFT*Mw= z`A{#7A23C^M!w2})zrMHs`2m2eY?48O~*9J6W0YOrnVT==aS;1B0Wuzq=iR9$|h-$ zRIq$Vy#ksj7@l=vNmPS@QC%L0Di%o^Z5)N3S0$}qo`zD8|6Evo>R6vas}-yc8@!W>v#Zw+K%h<9%8*0k;z z9c7TLm|ByGD3t!HKa6ZJWQLPOiI!1qp5Ui8js1hlLaf_=HSB}gK8)#O8WL;MqHT;1 zhE;cfI+=VgMhn<>s5NQL&5_!Jp~Tf(s7xzzE~xN@+75F198yG7UKqo)Oj~PsDUV_F zI{J}IqNos0zON=}G=^5PknJl^O0Ttr>d;D+CN0qQjvL7h#yBpFHEeZH;Vfmu2HP&C zsbjE@Qv)^`q&2`zyKC-^QFjLS+6$Pp_2)Bbd4K^EU81SSeIa1DNPTa(kV$I<$nOa5 z>!a?C7c*(!qJ>=|93x6>ED+^=tIpm19O_VC=wMIbu{c z=;=-a2ky#z#T}1Wz5eH~wRNziB7NF(F*ZLdf8Ep0!X?EgTw4s?CNJxC@*J8#m)VPG zuR^$}tRmzKN2bjv%JPP%MS@jDH-raKM^{u@jS*?lSS-rG2&@k1t7tS7e-$CEl9FcI zB*k5Y_nN31`D-C?D3i8bFfKqJhTI~cTN4dK@3fC(Gv2oYjZt@^Q6~TJ)5k^O7Q&Ch z(WUo084XMB6t)ZGqQysU+C|~@wB%lgPsoU%*Jy~RT)Y?R;vkx2Jn6$x_&jWkSigf| z3?F0vNfX21*OD2-fE30BlmN8=e%41zD(?OP^o|^MAYI~N5AH_*awD10UCVP9JfD5N zO0UU8@3#wkM~EJ0os_bm6X^Q)n~UT9_vrjTDS^HNdir{uKe-RAj`!c0;D5u7sz1@1 z@vQNoPlx=rMCn@dA9GWDI*H+j<4gj@qlHi8^Rn7_|HSZDU@y2ne4>BaUGe^ja$I(I zbKX|#o)hUNEoi1I*F7i7ZNek*=`|$Cwcm<(|3rSDUls4482>z+-DoSnou6&n|C-;$ z`|I<0C;aYd!~X;Lebk2kH7_t}PC(CJV*Z!D+P1%Gd%S<5e75dv+y8}q@&1YFzuCwr z?LZ0I1L70KqtvTZdcj3CyQ&pGs?#1X+H8PmwQD)vwRp5U`B579>EWMEE|n*8qxcCs z5QcvLLTNwoOm2G<;)PR;zr=V+FCMV9jMq@!9B&$)DP9(Lic5cK@o9JRBYsKV&t|ra zw?-FlMKs>|?TA;4U%PARG{M1aRMVk!KgK&Nv`n`VX^@Nvw0Dg1b0o?Om05k%pPAY+ zkMNGQD~WpGN8eBWgK@V4TKl7~58c0K(k=sBL>RqJ;9bj$cGvufH^O4@qLuARJd@kT z1pdg4E-l@Sh)n-({88m^#Scu{T0o=I*N01vGijFt`fz&we+R!!QU3;vafr@Sp~|xg zcdc)#OVD@fo1Xqh>+!yQHBNH^hkRNt80JNs&r9WSX0D>yZEP)`+2(gjU%Rs4cjlbq znRAZ+j&qJ%85!H~VB#7|rc+k{PcGNQjGXaudX8d{bd6Uw#=2%$T`uL{1i>3X02q#3 zoXa(dd7qJok%KoDSk6Fb+TZ4H5jbyX;fTZtm={vyQQny@b1!*pc0QinJPch$rDMIEP z)H82Hi=)+y>bZ*%H}mz9+7@U&G2VzGzFkO4LN(VM-y$>@I6O0kj?d5x*m!kK8jmWj z7d`gz(Z20y`=nH2<|FhOWcYLq(~fm0ZAUyiamnaoR8}q2_DG3tw~|A3amJ-9>iFn% z9+an{SvjN!Z>ZAIdA29ij$asRxRO?R2U+QV#zo4ldOp$SQBMTqD0F2}x|TG@t+=uO$iqI4K zhh!a46M8rI%uMWY_PW%5B%jt4mEai}!`jh9aMX_`2Bi)cEL}wXa4UX)P;(w_xmspj z=YhOa=eJG`A*biTR7f3iAmSRIyeh<^!@xwRkjaTvO;06W+Z%T@e?!p1VJQH0KQE|s zpxL2dC3-!jC(ZVG{T`RD_fX_nNTs+{&56!0UYB(q$UBwobZWD7@n&KLKBA8t98tIW z6GJUgX7k2!rRCMd2ReN-q^nNRl=>@e+31-8w7S?99GOKigcFj|N71Z^(HIJq5nw`y zxUoWfs#LoVD|{z}(WlZ{8x!YFF&+9vG0~9qON^<4p)xNzs{{t(n2t+{ogirP$%vqt zE3L)=PEn*EQmEH!5m76nS5^1=lJ1QQU>A8?Bi7?;%yIn!inI0ZQ>Xbf!qpn$R#|7R zPx=evER#Vc5S7yBrL_}c>ijKt%3Y36o$&@nJMznDvhjuSzdr3!{^Ot_~0vV`%D=G#&8QpyWv#BqSsk~&OEWvP4#_;vQpYBK_tdZ}I{Z|EQZ^S4F3} zBcr8xkY=21_?ObC1EJK&brFn+Zw!(o&KRk;ZV@m#)nzWBcBq9fv`p!P$mB5CTZ1*? z4js_R&Z-T zBc^cP((0*b2lHS^07J~%iZn98Rs?d}rMzKnGZG5UVun$EDcKBQH>6RD!;7;J^M;ON z-M+9lmP>|tEw#WOR*Q~#gPy^lQfZhS^oGo&xMU%Wg+GC9Cm_{ zq;wkcwVnG>S! zE6UU7$)xIqZDh=Zlx%->xPnqrn>EtO)Ugr&xWG(o`e61b`m1dFV|FXgW4)@n+({hj z>hjc%F^LrfH8C=SI_74MbXTboh6ehS94oU#Y7yX)3Z9}hF&N55t-*X$t4sGYYCR(M zCg5uX%B&^Ycw9GZ?5JV6Mt-nIIb;R{y!Jh}^xNrF4E9$>F&{ShlDYVX-n$}4rAh&uT4Rn~)F!e->cNcI3&$V!KozE~02t%kv z811>9;sgx~+J$(oCI2YW;HEv(y-Md_Lh-;xfimDOU?cDe@DE_X-6>2C5CWC}uK_;*hI`-+_<%*gCZGvO zU68``2d)Exz=Obc;7g$Mz2F@f1>68E0GgWjZluG59hazOr!+^J{!#<6NdI(+#S49&0l$1iSo8ab|!{6_hjdEixa@3rxd~|4Qujr|%|BSI#5Qw=0xG z3pC`SF{2CYIeb}lWT?I;%8Re6hZ;duS z#$S@Vcv||Bgx+4*ERE6Ck*aDMrC{HDEbIDWO-i8hr5g7VrjS&ioMMQ8MyVENfP=anory!V}#576CT)cZb)TUhlVrtWpI$6QCq>3*reL06XrvsdzRQzXwN6iF-X`9lLkQyCtO+?eq zmIR7^sYADBd$X3NvQ&X1iZsiXWkIitNn&cHm1;>Do9DF7R!sGhHe$)5Y_l$5@o&af`KYoUEf+0tqU1Qd>haHcHM25+in zw$56D<|a+B9cl?Nl}*d0LkMjoMKlE=9HVNJrq#^=NqIZHPzyq{GTo7~iq;dQc~3r0 z?zKgeXc=xi$q95ZBo94Y zjlQKPg;YI@Ey=nI^H3MshGI*s#wwZ8ySAgNXa{+$qe!IHDuRBjkVw;dC($-#Vi%!N zx2U3;M?yu4Ik(X#M`^NQ)YYvykTn@%%}&%f#a(HLTXrh(_HeZ*6&tByRF<>wNg!HX zq>`dCi5E&@R--mhWf7~QIxvlF4XzgXMjuCuT|}iYl`x>m%TV}*ujY}AYm9m{ZhH@3eU|OevoS1>V!rX*9^GYuy9jFU~iauUC~)uEMM2OB6TnJAG~x~CC}!dWy(YaNX~+GO2{;$P{mDaHauS+(*7 zE=43*=u)SiNk%lWFsO6I${Fm_1c~O3l9`3_nEFcs1!(+|P<}Ce2zw*NZE9L!G3}6$ ziLM=`jhzUEwDPUc|3aZC8yI2%+bbC)NDIHQaP1e5J|xa4mQ9N)aU11^h9{OgY#ej@ zn`M$r_v56IK(AAm(*~`^5%Tt?q*^Tfb=F6ysQcoiBC?7!GW&Ewm3z*?XOzN1az8jRr(?HMihknpJ>!v!ZdQAbwg3qVqZgIV=i*NOw*llo51@D!0apW$ zMc<#mo%mY`Pv+G zTUCK*3)-p*82;n4_DdN2U#<#iPoe+oklJ}A1{@`GXU**$&HJiP)rTjZQtxvfZ#+p) zu3KuA`x?-1Td{A2LG^C&f6hNtCs*|TLOba*qVz9<{+%bAp1g!P@Z`ZKC$}E|El(&R z#$bRnX5aPu3{3I98}{)n>EGMCzwtP}L2`@A8J!Ex1eJ*I4qE{MV1a=^e;^&`1#}0x z01R+66K8jUM&M&$FR%w_0Coa9fbBp%um#u*Yy{Q=Yk=jzVqgJ4^z(q(Km@1&N`L|& z2gm|kfB+bP?!eg?3~J+$E_hD`P7VcMz#*Us_!!s;Yys8+%Yb=61SkOtfjl4wZ~<0; z1^NR9pa+l!bOspUNCx5r8i4Hp(Qn3mEwCJz57Yo2AP>j^T);pe6*%Hj$5|TREehse zbP%47j^m>7{HyQ8XCkkA*EOfHBNzD`19^;vERc5HGbw3rzt6M_iCNXs(e9eR_O9Jq zb8pT6m(pwTXm>6A|Ky!MOh;&d?APL_kxz$Pqt_nLuLpf=pt7Vgd}|cy383Xs{~JQ& zM(qR1gLt5OY_5kTF1+gB3+Y{xT}1)(V*ry@f_wEc>{vFWfy7BhApr3RG(9~zIo|=0zE%*c;~K5Uwvsy{4lljD#GrrjQ_p67@n{!oG z|FnyrKK5+d7q4yqDeLRid%pYe>(8#eamhQwygT1m)OFRfbv?gWk$tZB;x5&5?x>#e zX3ogMp-rnFv^h+hpFf;Ga`k~J(rZ&3_dNE%q@Sm(I`V{}zTl|^7WccS?wNGY-o8`r zI{wkrrPw(`5&J9nOtr%UI2u%e3o z9g`<{9G{N9_o2Y~w|y`F@x6iGo}U+9yy@L<<%Vuo&KrK|@U^e4{zi7KdeP^9uG1eZ zcYG}yr7c5mJn-kmTi^eS{OYMwyWI26o4NCuCV5Ei^;g?d{l2<&%>eo4wNEr{@yyO{_+*^3?54AJURf~nwx1Wxkrw@A?|EZc z-%PH4t=Rjncdc`WKeU-S^?~E#`GuV?-Ei=WJ63gcygqN(&|kgyaJA*5!FJ>HUc0aS zi2r89!b!GOcfL|TVc%18S3UUx|9Qpp=dB+5c-F*CX#@L?Xc}Y|M(01fYg*s?C#J5f z-~Z~(Cl0=T`D1^XKWV}uackafeR_<#&Rcrww)>wuYw^wJH4WPT_^#bMQa@R>SDW3` zrlBT9>rE}g#-2(1|MZ1wgbTl~jsHL`z0sw))4U5w)sh=snmhHaIe0H@#BW=JsV3Ef z5$Q9Ym8Je!hMG!$AT0I452e_{Wfk5^cX$wfyCxJ22g@UaaM0iG4p$DI!Syjcb6Y`#8@%$6yfgqdH;bm($uAn^6sikYOw_U|0SuB_0}Di}blnq~i79 z5atZ*U!Lj>$2|4k!<5wtFp}$?;q~K_x%e;jq3Q}E$eRUK5M|X z#J1A*N82vj*S4$e6YTTs_t@*~EA4CSYwhdp!yE;UR~#oD14Wk@5$_Wp7oQT(lLkvJ z=^^QWbfNQVr`s8Fe(L48@rdy#a&!`#O;d%=LKh)T=q~gSdI<(0UFa_i z6l|vJOcPCIrYh5X(|x8toBEh-=5gj(<~s8>^8s@g%OJ}bOO54WOTFc=rK{CsEw$ce zecJkg^_aDnEz{<)&9^;gYp@-)U230VFSCd2x7(N6m)ln%r`TBk}YPd*;;lH`xv{DeVyIQ9)U!9a2)60a=3Avo7>Fo z9c++op5OgUnWQuDRSi-+a`3y(MH>Vp(okWjSP-X}#aN!uqnctL+M# z)mC8h+itYg+upMM!*-s1kX^73vyZhG+85ea*q^g+gCq{xkK503ba9M!lsXnTUUvM+ zvCr{?qqArbZDOXFCr%N4;@#pp$l{oIxztZ`NY&DE>2>Ll)ZN+Nd9(9Q=VIq8(2R>@ zi#%GMBflnpC_^V)409AWhV8~)#!g~A(Dh~PdiG8BJ+_fO%pPYi;Y?fxSH<1LJ;&|m z{=!|#kKrfrck{pHI~cnf(~S;esWD=F&-jV4qi{ZSBTu+N2nutA1;Qd>C$=e{W4gp- zFpV@#F;$x0HGO0{X*%1?nqB7W%^S>rfR^+?T^MaCwcKE-wmf24YuRXd)AFI^TT5qa zSL=N1Y#%klO#%0DAjbEWA{9v@0B-3cqbW@#amFWf3F|)~%VewezSTGJTdTxbL~2uzCC} zz8BiAK}Ny2$+*?H$M~u74WZa{vuTB?qxpPj>rJ+4_7@$;9eu@Y@hT@7+S5>XhO^hP zquG3R0y`PCr;M#)=dz`opPPj?Bd>c1;&Sr%Z<+(Hyi(8{LuJ?@whQnxLmke;DiiexKIdfc|_PI><~T|{wj1gEkfJ* zqUn_BLh}`7yLqTN$2{JAxA`ISTJtC7pUl~o2y|tQvG#x)SAOK(LMt$#`TVK z#Ia(b7!v28ef*91w75a67k7#uil@YG(q$4aiBhSwL|Q4WlitOa`JT?9D1|a-g|iYZ z=UnFo=O*V?=UMWv*tK@g(eR3m}LoI&W3G%35?_rm+%h|Q;2KH67 zs158sXwp|`Nq%BGa$UI#xL({K$J=4xIKRy%KT-tFAxe9QU1vzy!lqsS3*P_C9Amz(6T zW%`lPWe^?14rj-(v!T7uv+uKKaXq+f=xmUi$E{R!^b52tefe^JI)4+t0D3e*s1T}z z8Ny9yO%4m+3EfN<(`}~vO^-oWx0~KHeQWA!E;WmmEK8APre&9<&~_90l*P8?=t0-p zKD2!XNtx}L_9FX@kkEenbVq|DEIugSCask^Im0qj$1uym)=2g;ZWQO?p5nH1ZvH|3 zW!`3d)L3tvC@dA$3744%n=8!K=3CA8nwO$)+hhLJ{8w`aOBc%(mQ2fymgg+5T6pVd z>oV)FY*(R`T5Wp?CG{8E-)ujkCFqCrbJ3DdwwKt0=-;;58|+PX)^V%j4acQu54uS6 zq{q->9h7=G`=Fh+Iy0RINYB>e8*#XGWJ|bh+zyO5nz$3_tGn?$Z{x>8N`AhYpO2b$ zh<6!Fj5na2+GczMz4qUYKN>p;Yry$d;S=Fo;YT6O{EhjPxrfDMuW{@a&zGE1iNsPG z^>i+qVb*YK(Nb(gueSxQ#dg%@@3{;4>-cf}C;Z>|r;M*-Oz;C*_s+saXxo=#Z1b}4 zN7U4vLIZleE6^@xq36pr<(Udhg{C6(flr&(qyO7%+JZ5`Ak^K_<^pq}xyXF8dA0dN zbECP*e9(Nzd;~q>G4n~(=3GmjrNB~XF3@F5+~w*x#eg z=pkiGxzZSE0&2xM@_F(-@(y{o{1v6sh_hX|U4VY1l4a4}y@~PQ9*hY0^PlqvQ8It$ zf8bB>DaKC5UmLp_FEsWvUSYh_xX5^|P%2CncA;E&%P32c{dxN_J0d!Q-^s(RknPFs z<`3|{Gwu=IHeFL4f(lV*I}yBbXQ1Dck_Qh>xJo+y;GEz%S%~ z&wt9F;!};Cja`gs#_q-*#$HAPG^7gsbd7Pg@pI#0V`rgTbTlV{lZS;mj9J$RYlZbF z-Oa)l;Ve@ZQ<|x}sfVe-{JyoD?E%{z_WSIz!ys-(FIy~mrLfe^d6l!o`GxZX`BRxX z37YRLWTz`yx}JX#@+dLRG;S~o!nfwmmI91sickwYC{w?^3gud3pKY(T-)kT3nCZCF zvC{Fqqo;@uFDNoFm{*_<`%2VHEU+{cZcZ_V-CvEY4}+mWRBT@E*Pb z5~$&c-(DDPq?<&O%j9=PoU@(toC`4WSq|-3>)hzv;@s}s>D=S|*xBSf^Z2pdG^-$o`+t30mf&G?aMG~Z62dkj9u{8u^fXL}p4-m}7{ukS${U7zNa@3)wo1qBpXe*)5nOeT-i4 z7~7fa!Wp=9PT;H1Io9=RAHKj@fgjrcAEB>4w{Z) zbeV1*h|y&(TAbPDdFEx9ajivra|mtCNpqSd-NIU|mI_N1Mi2`u3oUh)?Un}1UW_)= ztlg~xt*kZInrAJ=&yrHmwn7i?!lBalW_!?aX3vnYbLI>Alj&Qlr#_zUdJ9 z`=in^>7>-z*~OXW?C$L0?Bz6|_wVl<=wzJ&+JP#JvlloQI_s1c3KBbWosqy937nC@ c83~+`z!?dgk-!-VoRPp837nC@{|X8G7ocWVn*aa+ diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/win32/x64/bson.node b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/win32/x64/bson.node deleted file mode 100644 index a544c8ed6385a61b494425288425714221fc77f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118272 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Ò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 A$p8QV diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/wscript b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/wscript deleted file mode 100644 index 40f5317..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/wscript +++ /dev/null @@ -1,39 +0,0 @@ -import Options -from os import unlink, symlink, popen -from os.path import exists - -srcdir = "." -blddir = "build" -VERSION = "0.1.0" - -def set_options(opt): - opt.tool_options("compiler_cxx") - opt.add_option( '--debug' - , action='store_true' - , default=False - , help='Build debug variant [Default: False]' - , dest='debug' - ) - -def configure(conf): - conf.check_tool("compiler_cxx") - conf.check_tool("node_addon") - conf.env.append_value('CXXFLAGS', ['-O3', '-funroll-loops']) - - # conf.env.append_value('CXXFLAGS', ['-DDEBUG', '-g', '-O0', '-Wall', '-Wextra']) - # conf.check(lib='node', libpath=['/usr/lib', '/usr/local/lib'], uselib_store='NODE') - -def build(bld): - obj = bld.new_task_gen("cxx", "shlib", "node_addon") - obj.target = "bson" - obj.source = ["bson.cc"] - # obj.uselib = "NODE" - -def shutdown(): - # HACK to get compress.node out of build directory. - # better way to do this? - if Options.commands['clean']: - if exists('bson.node'): unlink('bson.node') - else: - if exists('build/default/bson.node') and not exists('bson.node'): - symlink('build/default/bson.node', 'bson.node') diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/binary.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/binary.js deleted file mode 100644 index 82d4d04..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/binary.js +++ /dev/null @@ -1,339 +0,0 @@ -/** - * Module dependencies. - */ -if(typeof window === 'undefined') { - var Buffer = require('buffer').Buffer; // TODO just use global Buffer -} - -// Binary default subtype -var BSON_BINARY_SUBTYPE_DEFAULT = 0; - -/** - * @ignore - * @api private - */ -var writeStringToArray = function(data) { - // Create a buffer - var buffer = typeof Uint8Array != 'undefined' ? new Uint8Array(new ArrayBuffer(data.length)) : new Array(data.length); - // Write the content to the buffer - for(var i = 0; i < data.length; i++) { - buffer[i] = data.charCodeAt(i); - } - // Write the string to the buffer - return buffer; -} - -/** - * Convert Array ot Uint8Array to Binary String - * - * @ignore - * @api private - */ -var convertArraytoUtf8BinaryString = function(byteArray, startIndex, endIndex) { - var result = ""; - for(var i = startIndex; i < endIndex; i++) { - result = result + String.fromCharCode(byteArray[i]); - } - return result; -}; - -/** - * A class representation of the BSON Binary type. - * - * Sub types - * - **BSON.BSON_BINARY_SUBTYPE_DEFAULT**, default BSON type. - * - **BSON.BSON_BINARY_SUBTYPE_FUNCTION**, BSON function type. - * - **BSON.BSON_BINARY_SUBTYPE_BYTE_ARRAY**, BSON byte array type. - * - **BSON.BSON_BINARY_SUBTYPE_UUID**, BSON uuid type. - * - **BSON.BSON_BINARY_SUBTYPE_MD5**, BSON md5 type. - * - **BSON.BSON_BINARY_SUBTYPE_USER_DEFINED**, BSON user defined type. - * - * @class Represents the Binary BSON type. - * @param {Buffer} buffer a buffer object containing the binary data. - * @param {Number} [subType] the option binary type. - * @return {Grid} - */ -function Binary(buffer, subType) { - if(!(this instanceof Binary)) return new Binary(buffer, subType); - - this._bsontype = 'Binary'; - - if(buffer instanceof Number) { - this.sub_type = buffer; - this.position = 0; - } else { - this.sub_type = subType == null ? BSON_BINARY_SUBTYPE_DEFAULT : subType; - this.position = 0; - } - - if(buffer != null && !(buffer instanceof Number)) { - // Only accept Buffer, Uint8Array or Arrays - if(typeof buffer == 'string') { - // Different ways of writing the length of the string for the different types - if(typeof Buffer != 'undefined') { - this.buffer = new Buffer(buffer); - } else if(typeof Uint8Array != 'undefined' || (Object.prototype.toString.call(buffer) == '[object Array]')) { - this.buffer = writeStringToArray(buffer); - } else { - throw new Error("only String, Buffer, Uint8Array or Array accepted"); - } - } else { - this.buffer = buffer; - } - this.position = buffer.length; - } else { - if(typeof Buffer != 'undefined') { - this.buffer = new Buffer(Binary.BUFFER_SIZE); - } else if(typeof Uint8Array != 'undefined'){ - this.buffer = new Uint8Array(new ArrayBuffer(Binary.BUFFER_SIZE)); - } else { - this.buffer = new Array(Binary.BUFFER_SIZE); - } - // Set position to start of buffer - this.position = 0; - } -}; - -/** - * Updates this binary with byte_value. - * - * @param {Character} byte_value a single byte we wish to write. - * @api public - */ -Binary.prototype.put = function put(byte_value) { - // If it's a string and a has more than one character throw an error - if(byte_value['length'] != null && typeof byte_value != 'number' && byte_value.length != 1) throw new Error("only accepts single character String, Uint8Array or Array"); - if(typeof byte_value != 'number' && byte_value < 0 || byte_value > 255) throw new Error("only accepts number in a valid unsigned byte range 0-255"); - - // Decode the byte value once - var decoded_byte = null; - if(typeof byte_value == 'string') { - decoded_byte = byte_value.charCodeAt(0); - } else if(byte_value['length'] != null) { - decoded_byte = byte_value[0]; - } else { - decoded_byte = byte_value; - } - - if(this.buffer.length > this.position) { - this.buffer[this.position++] = decoded_byte; - } else { - if(typeof Buffer != 'undefined' && Buffer.isBuffer(this.buffer)) { - // Create additional overflow buffer - var buffer = new Buffer(Binary.BUFFER_SIZE + this.buffer.length); - // Combine the two buffers together - this.buffer.copy(buffer, 0, 0, this.buffer.length); - this.buffer = buffer; - this.buffer[this.position++] = decoded_byte; - } else { - var buffer = null; - // Create a new buffer (typed or normal array) - if(Object.prototype.toString.call(this.buffer) == '[object Uint8Array]') { - buffer = new Uint8Array(new ArrayBuffer(Binary.BUFFER_SIZE + this.buffer.length)); - } else { - buffer = new Array(Binary.BUFFER_SIZE + this.buffer.length); - } - - // We need to copy all the content to the new array - for(var i = 0; i < this.buffer.length; i++) { - buffer[i] = this.buffer[i]; - } - - // Reassign the buffer - this.buffer = buffer; - // Write the byte - this.buffer[this.position++] = decoded_byte; - } - } -}; - -/** - * Writes a buffer or string to the binary. - * - * @param {Buffer|String} string a string or buffer to be written to the Binary BSON object. - * @param {Number} offset specify the binary of where to write the content. - * @api public - */ -Binary.prototype.write = function write(string, offset) { - offset = typeof offset == 'number' ? offset : this.position; - - // If the buffer is to small let's extend the buffer - if(this.buffer.length < offset + string.length) { - var buffer = null; - // If we are in node.js - if(typeof Buffer != 'undefined' && Buffer.isBuffer(this.buffer)) { - buffer = new Buffer(this.buffer.length + string.length); - this.buffer.copy(buffer, 0, 0, this.buffer.length); - } else if(Object.prototype.toString.call(this.buffer) == '[object Uint8Array]') { - // Create a new buffer - buffer = new Uint8Array(new ArrayBuffer(this.buffer.length + string.length)) - // Copy the content - for(var i = 0; i < this.position; i++) { - buffer[i] = this.buffer[i]; - } - } - - // Assign the new buffer - this.buffer = buffer; - } - - if(typeof Buffer != 'undefined' && Buffer.isBuffer(string) && Buffer.isBuffer(this.buffer)) { - string.copy(this.buffer, offset, 0, string.length); - this.position = (offset + string.length) > this.position ? (offset + string.length) : this.position; - // offset = string.length - } else if(typeof Buffer != 'undefined' && typeof string == 'string' && Buffer.isBuffer(this.buffer)) { - this.buffer.write(string, 'binary', offset); - this.position = (offset + string.length) > this.position ? (offset + string.length) : this.position; - // offset = string.length; - } else if(Object.prototype.toString.call(string) == '[object Uint8Array]' - || Object.prototype.toString.call(string) == '[object Array]' && typeof string != 'string') { - for(var i = 0; i < string.length; i++) { - this.buffer[offset++] = string[i]; - } - - this.position = offset > this.position ? offset : this.position; - } else if(typeof string == 'string') { - for(var i = 0; i < string.length; i++) { - this.buffer[offset++] = string.charCodeAt(i); - } - - this.position = offset > this.position ? offset : this.position; - } -}; - -/** - * Reads **length** bytes starting at **position**. - * - * @param {Number} position read from the given position in the Binary. - * @param {Number} length the number of bytes to read. - * @return {Buffer} - * @api public - */ -Binary.prototype.read = function read(position, length) { - length = length && length > 0 - ? length - : this.position; - - // Let's return the data based on the type we have - if(this.buffer['slice']) { - return this.buffer.slice(position, position + length); - } else { - // Create a buffer to keep the result - var buffer = typeof Uint8Array != 'undefined' ? new Uint8Array(new ArrayBuffer(length)) : new Array(length); - for(var i = 0; i < length; i++) { - buffer[i] = this.buffer[position++]; - } - } - // Return the buffer - return buffer; -}; - -/** - * Returns the value of this binary as a string. - * - * @return {String} - * @api public - */ -Binary.prototype.value = function value(asRaw) { - asRaw = asRaw == null ? false : asRaw; - - // If it's a node.js buffer object - if(typeof Buffer != 'undefined' && Buffer.isBuffer(this.buffer)) { - return asRaw ? this.buffer.slice(0, this.position) : this.buffer.toString('binary', 0, this.position); - } else { - if(asRaw) { - // we support the slice command use it - if(this.buffer['slice'] != null) { - return this.buffer.slice(0, this.position); - } else { - // Create a new buffer to copy content to - var newBuffer = Object.prototype.toString.call(this.buffer) == '[object Uint8Array]' ? new Uint8Array(new ArrayBuffer(this.position)) : new Array(this.position); - // Copy content - for(var i = 0; i < this.position; i++) { - newBuffer[i] = this.buffer[i]; - } - // Return the buffer - return newBuffer; - } - } else { - return convertArraytoUtf8BinaryString(this.buffer, 0, this.position); - } - } -}; - -/** - * Length. - * - * @return {Number} the length of the binary. - * @api public - */ -Binary.prototype.length = function length() { - return this.position; -}; - -/** - * @ignore - * @api private - */ -Binary.prototype.toJSON = function() { - return this.buffer != null ? this.buffer.toString('base64') : ''; -} - -/** - * @ignore - * @api private - */ -Binary.prototype.toString = function(format) { - return this.buffer != null ? this.buffer.slice(0, this.position).toString(format) : ''; -} - -Binary.BUFFER_SIZE = 256; - -/** - * Default BSON type - * - * @classconstant SUBTYPE_DEFAULT - **/ -Binary.SUBTYPE_DEFAULT = 0; -/** - * Function BSON type - * - * @classconstant SUBTYPE_DEFAULT - **/ -Binary.SUBTYPE_FUNCTION = 1; -/** - * Byte Array BSON type - * - * @classconstant SUBTYPE_DEFAULT - **/ -Binary.SUBTYPE_BYTE_ARRAY = 2; -/** - * OLD UUID BSON type - * - * @classconstant SUBTYPE_DEFAULT - **/ -Binary.SUBTYPE_UUID_OLD = 3; -/** - * UUID BSON type - * - * @classconstant SUBTYPE_DEFAULT - **/ -Binary.SUBTYPE_UUID = 4; -/** - * MD5 BSON type - * - * @classconstant SUBTYPE_DEFAULT - **/ -Binary.SUBTYPE_MD5 = 5; -/** - * User BSON type - * - * @classconstant SUBTYPE_DEFAULT - **/ -Binary.SUBTYPE_USER_DEFINED = 128; - -/** - * Expose. - */ -exports.Binary = Binary; - diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/binary_parser.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/binary_parser.js deleted file mode 100644 index d2fc811..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/binary_parser.js +++ /dev/null @@ -1,385 +0,0 @@ -/** - * Binary Parser. - * Jonas Raoni Soares Silva - * http://jsfromhell.com/classes/binary-parser [v1.0] - */ -var chr = String.fromCharCode; - -var maxBits = []; -for (var i = 0; i < 64; i++) { - maxBits[i] = Math.pow(2, i); -} - -function BinaryParser (bigEndian, allowExceptions) { - if(!(this instanceof BinaryParser)) return new BinaryParser(bigEndian, allowExceptions); - - this.bigEndian = bigEndian; - this.allowExceptions = allowExceptions; -}; - -BinaryParser.warn = function warn (msg) { - if (this.allowExceptions) { - throw new Error(msg); - } - - return 1; -}; - -BinaryParser.decodeFloat = function decodeFloat (data, precisionBits, exponentBits) { - var b = new this.Buffer(this.bigEndian, data); - - b.checkBuffer(precisionBits + exponentBits + 1); - - var bias = maxBits[exponentBits - 1] - 1 - , signal = b.readBits(precisionBits + exponentBits, 1) - , exponent = b.readBits(precisionBits, exponentBits) - , significand = 0 - , divisor = 2 - , curByte = b.buffer.length + (-precisionBits >> 3) - 1; - - do { - for (var byteValue = b.buffer[ ++curByte ], startBit = precisionBits % 8 || 8, mask = 1 << startBit; mask >>= 1; ( byteValue & mask ) && ( significand += 1 / divisor ), divisor *= 2 ); - } while (precisionBits -= startBit); - - return exponent == ( bias << 1 ) + 1 ? significand ? NaN : signal ? -Infinity : +Infinity : ( 1 + signal * -2 ) * ( exponent || significand ? !exponent ? Math.pow( 2, -bias + 1 ) * significand : Math.pow( 2, exponent - bias ) * ( 1 + significand ) : 0 ); -}; - -BinaryParser.decodeInt = function decodeInt (data, bits, signed, forceBigEndian) { - var b = new this.Buffer(this.bigEndian || forceBigEndian, data) - , x = b.readBits(0, bits) - , max = maxBits[bits]; //max = Math.pow( 2, bits ); - - return signed && x >= max / 2 - ? x - max - : x; -}; - -BinaryParser.encodeFloat = function encodeFloat (data, precisionBits, exponentBits) { - var bias = maxBits[exponentBits - 1] - 1 - , minExp = -bias + 1 - , maxExp = bias - , minUnnormExp = minExp - precisionBits - , n = parseFloat(data) - , status = isNaN(n) || n == -Infinity || n == +Infinity ? n : 0 - , exp = 0 - , len = 2 * bias + 1 + precisionBits + 3 - , bin = new Array(len) - , signal = (n = status !== 0 ? 0 : n) < 0 - , intPart = Math.floor(n = Math.abs(n)) - , floatPart = n - intPart - , lastBit - , rounded - , result - , i - , j; - - for (i = len; i; bin[--i] = 0); - - for (i = bias + 2; intPart && i; bin[--i] = intPart % 2, intPart = Math.floor(intPart / 2)); - - for (i = bias + 1; floatPart > 0 && i; (bin[++i] = ((floatPart *= 2) >= 1) - 0 ) && --floatPart); - - for (i = -1; ++i < len && !bin[i];); - - if (bin[(lastBit = precisionBits - 1 + (i = (exp = bias + 1 - i) >= minExp && exp <= maxExp ? i + 1 : bias + 1 - (exp = minExp - 1))) + 1]) { - if (!(rounded = bin[lastBit])) { - for (j = lastBit + 2; !rounded && j < len; rounded = bin[j++]); - } - - for (j = lastBit + 1; rounded && --j >= 0; (bin[j] = !bin[j] - 0) && (rounded = 0)); - } - - for (i = i - 2 < 0 ? -1 : i - 3; ++i < len && !bin[i];); - - if ((exp = bias + 1 - i) >= minExp && exp <= maxExp) { - ++i; - } else if (exp < minExp) { - exp != bias + 1 - len && exp < minUnnormExp && this.warn("encodeFloat::float underflow"); - i = bias + 1 - (exp = minExp - 1); - } - - if (intPart || status !== 0) { - this.warn(intPart ? "encodeFloat::float overflow" : "encodeFloat::" + status); - exp = maxExp + 1; - i = bias + 2; - - if (status == -Infinity) { - signal = 1; - } else if (isNaN(status)) { - bin[i] = 1; - } - } - - for (n = Math.abs(exp + bias), j = exponentBits + 1, result = ""; --j; result = (n % 2) + result, n = n >>= 1); - - for (n = 0, j = 0, i = (result = (signal ? "1" : "0") + result + bin.slice(i, i + precisionBits).join("")).length, r = []; i; j = (j + 1) % 8) { - n += (1 << j) * result.charAt(--i); - if (j == 7) { - r[r.length] = String.fromCharCode(n); - n = 0; - } - } - - r[r.length] = n - ? String.fromCharCode(n) - : ""; - - return (this.bigEndian ? r.reverse() : r).join(""); -}; - -BinaryParser.encodeInt = function encodeInt (data, bits, signed, forceBigEndian) { - var max = maxBits[bits]; - - if (data >= max || data < -(max / 2)) { - this.warn("encodeInt::overflow"); - data = 0; - } - - if (data < 0) { - data += max; - } - - for (var r = []; data; r[r.length] = String.fromCharCode(data % 256), data = Math.floor(data / 256)); - - for (bits = -(-bits >> 3) - r.length; bits--; r[r.length] = "\0"); - - return ((this.bigEndian || forceBigEndian) ? r.reverse() : r).join(""); -}; - -BinaryParser.toSmall = function( data ){ return this.decodeInt( data, 8, true ); }; -BinaryParser.fromSmall = function( data ){ return this.encodeInt( data, 8, true ); }; -BinaryParser.toByte = function( data ){ return this.decodeInt( data, 8, false ); }; -BinaryParser.fromByte = function( data ){ return this.encodeInt( data, 8, false ); }; -BinaryParser.toShort = function( data ){ return this.decodeInt( data, 16, true ); }; -BinaryParser.fromShort = function( data ){ return this.encodeInt( data, 16, true ); }; -BinaryParser.toWord = function( data ){ return this.decodeInt( data, 16, false ); }; -BinaryParser.fromWord = function( data ){ return this.encodeInt( data, 16, false ); }; -BinaryParser.toInt = function( data ){ return this.decodeInt( data, 32, true ); }; -BinaryParser.fromInt = function( data ){ return this.encodeInt( data, 32, true ); }; -BinaryParser.toLong = function( data ){ return this.decodeInt( data, 64, true ); }; -BinaryParser.fromLong = function( data ){ return this.encodeInt( data, 64, true ); }; -BinaryParser.toDWord = function( data ){ return this.decodeInt( data, 32, false ); }; -BinaryParser.fromDWord = function( data ){ return this.encodeInt( data, 32, false ); }; -BinaryParser.toQWord = function( data ){ return this.decodeInt( data, 64, true ); }; -BinaryParser.fromQWord = function( data ){ return this.encodeInt( data, 64, true ); }; -BinaryParser.toFloat = function( data ){ return this.decodeFloat( data, 23, 8 ); }; -BinaryParser.fromFloat = function( data ){ return this.encodeFloat( data, 23, 8 ); }; -BinaryParser.toDouble = function( data ){ return this.decodeFloat( data, 52, 11 ); }; -BinaryParser.fromDouble = function( data ){ return this.encodeFloat( data, 52, 11 ); }; - -// Factor out the encode so it can be shared by add_header and push_int32 -BinaryParser.encode_int32 = function encode_int32 (number, asArray) { - var a, b, c, d, unsigned; - unsigned = (number < 0) ? (number + 0x100000000) : number; - a = Math.floor(unsigned / 0xffffff); - unsigned &= 0xffffff; - b = Math.floor(unsigned / 0xffff); - unsigned &= 0xffff; - c = Math.floor(unsigned / 0xff); - unsigned &= 0xff; - d = Math.floor(unsigned); - return asArray ? [chr(a), chr(b), chr(c), chr(d)] : chr(a) + chr(b) + chr(c) + chr(d); -}; - -BinaryParser.encode_int64 = function encode_int64 (number) { - var a, b, c, d, e, f, g, h, unsigned; - unsigned = (number < 0) ? (number + 0x10000000000000000) : number; - a = Math.floor(unsigned / 0xffffffffffffff); - unsigned &= 0xffffffffffffff; - b = Math.floor(unsigned / 0xffffffffffff); - unsigned &= 0xffffffffffff; - c = Math.floor(unsigned / 0xffffffffff); - unsigned &= 0xffffffffff; - d = Math.floor(unsigned / 0xffffffff); - unsigned &= 0xffffffff; - e = Math.floor(unsigned / 0xffffff); - unsigned &= 0xffffff; - f = Math.floor(unsigned / 0xffff); - unsigned &= 0xffff; - g = Math.floor(unsigned / 0xff); - unsigned &= 0xff; - h = Math.floor(unsigned); - return chr(a) + chr(b) + chr(c) + chr(d) + chr(e) + chr(f) + chr(g) + chr(h); -}; - -/** - * UTF8 methods - */ - -// Take a raw binary string and return a utf8 string -BinaryParser.decode_utf8 = function decode_utf8 (binaryStr) { - var len = binaryStr.length - , decoded = '' - , i = 0 - , c = 0 - , c1 = 0 - , c2 = 0 - , c3; - - while (i < len) { - c = binaryStr.charCodeAt(i); - if (c < 128) { - decoded += String.fromCharCode(c); - i++; - } else if ((c > 191) && (c < 224)) { - c2 = binaryStr.charCodeAt(i+1); - decoded += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); - i += 2; - } else { - c2 = binaryStr.charCodeAt(i+1); - c3 = binaryStr.charCodeAt(i+2); - decoded += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); - i += 3; - } - } - - return decoded; -}; - -// Encode a cstring -BinaryParser.encode_cstring = function encode_cstring (s) { - return unescape(encodeURIComponent(s)) + BinaryParser.fromByte(0); -}; - -// Take a utf8 string and return a binary string -BinaryParser.encode_utf8 = function encode_utf8 (s) { - var a = "" - , c; - - for (var n = 0, len = s.length; n < len; n++) { - c = s.charCodeAt(n); - - if (c < 128) { - a += String.fromCharCode(c); - } else if ((c > 127) && (c < 2048)) { - a += String.fromCharCode((c>>6) | 192) ; - a += String.fromCharCode((c&63) | 128); - } else { - a += String.fromCharCode((c>>12) | 224); - a += String.fromCharCode(((c>>6) & 63) | 128); - a += String.fromCharCode((c&63) | 128); - } - } - - return a; -}; - -BinaryParser.hprint = function hprint (s) { - var number; - - for (var i = 0, len = s.length; i < len; i++) { - if (s.charCodeAt(i) < 32) { - number = s.charCodeAt(i) <= 15 - ? "0" + s.charCodeAt(i).toString(16) - : s.charCodeAt(i).toString(16); - process.stdout.write(number + " ") - } else { - number = s.charCodeAt(i) <= 15 - ? "0" + s.charCodeAt(i).toString(16) - : s.charCodeAt(i).toString(16); - process.stdout.write(number + " ") - } - } - - process.stdout.write("\n\n"); -}; - -BinaryParser.ilprint = function hprint (s) { - var number; - - for (var i = 0, len = s.length; i < len; i++) { - if (s.charCodeAt(i) < 32) { - number = s.charCodeAt(i) <= 15 - ? "0" + s.charCodeAt(i).toString(10) - : s.charCodeAt(i).toString(10); - - require('util').debug(number+' : '); - } else { - number = s.charCodeAt(i) <= 15 - ? "0" + s.charCodeAt(i).toString(10) - : s.charCodeAt(i).toString(10); - require('util').debug(number+' : '+ s.charAt(i)); - } - } -}; - -BinaryParser.hlprint = function hprint (s) { - var number; - - for (var i = 0, len = s.length; i < len; i++) { - if (s.charCodeAt(i) < 32) { - number = s.charCodeAt(i) <= 15 - ? "0" + s.charCodeAt(i).toString(16) - : s.charCodeAt(i).toString(16); - require('util').debug(number+' : '); - } else { - number = s.charCodeAt(i) <= 15 - ? "0" + s.charCodeAt(i).toString(16) - : s.charCodeAt(i).toString(16); - require('util').debug(number+' : '+ s.charAt(i)); - } - } -}; - -/** - * BinaryParser buffer constructor. - */ -function BinaryParserBuffer (bigEndian, buffer) { - this.bigEndian = bigEndian || 0; - this.buffer = []; - this.setBuffer(buffer); -}; - -BinaryParserBuffer.prototype.setBuffer = function setBuffer (data) { - var l, i, b; - - if (data) { - i = l = data.length; - b = this.buffer = new Array(l); - for (; i; b[l - i] = data.charCodeAt(--i)); - this.bigEndian && b.reverse(); - } -}; - -BinaryParserBuffer.prototype.hasNeededBits = function hasNeededBits (neededBits) { - return this.buffer.length >= -(-neededBits >> 3); -}; - -BinaryParserBuffer.prototype.checkBuffer = function checkBuffer (neededBits) { - if (!this.hasNeededBits(neededBits)) { - throw new Error("checkBuffer::missing bytes"); - } -}; - -BinaryParserBuffer.prototype.readBits = function readBits (start, length) { - //shl fix: Henri Torgemane ~1996 (compressed by Jonas Raoni) - - function shl (a, b) { - for (; b--; a = ((a %= 0x7fffffff + 1) & 0x40000000) == 0x40000000 ? a * 2 : (a - 0x40000000) * 2 + 0x7fffffff + 1); - return a; - } - - if (start < 0 || length <= 0) { - return 0; - } - - this.checkBuffer(start + length); - - var offsetLeft - , offsetRight = start % 8 - , curByte = this.buffer.length - ( start >> 3 ) - 1 - , lastByte = this.buffer.length + ( -( start + length ) >> 3 ) - , diff = curByte - lastByte - , sum = ((this.buffer[ curByte ] >> offsetRight) & ((1 << (diff ? 8 - offsetRight : length)) - 1)) + (diff && (offsetLeft = (start + length) % 8) ? (this.buffer[lastByte++] & ((1 << offsetLeft) - 1)) << (diff-- << 3) - offsetRight : 0); - - for(; diff; sum += shl(this.buffer[lastByte++], (diff-- << 3) - offsetRight)); - - return sum; -}; - -/** - * Expose. - */ -BinaryParser.Buffer = BinaryParserBuffer; - -exports.BinaryParser = BinaryParser; diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/bson.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/bson.js deleted file mode 100644 index 57fdd79..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/bson.js +++ /dev/null @@ -1,1519 +0,0 @@ -var Long = require('./long').Long - , Double = require('./double').Double - , Timestamp = require('./timestamp').Timestamp - , ObjectID = require('./objectid').ObjectID - , Symbol = require('./symbol').Symbol - , Code = require('./code').Code - , MinKey = require('./min_key').MinKey - , MaxKey = require('./max_key').MaxKey - , DBRef = require('./db_ref').DBRef - , Binary = require('./binary').Binary - , BinaryParser = require('./binary_parser').BinaryParser - , writeIEEE754 = require('./float_parser').writeIEEE754 - , readIEEE754 = require('./float_parser').readIEEE754 - -// To ensure that 0.4 of node works correctly -var isDate = function isDate(d) { - return typeof d === 'object' && Object.prototype.toString.call(d) === '[object Date]'; -} - -/** - * Create a new BSON instance - * - * @class Represents the BSON Parser - * @return {BSON} instance of BSON Parser. - */ -function BSON () {}; - -/** - * @ignore - * @api private - */ -// BSON MAX VALUES -BSON.BSON_INT32_MAX = 0x7FFFFFFF; -BSON.BSON_INT32_MIN = -0x80000000; - -BSON.BSON_INT64_MAX = Math.pow(2, 63) - 1; -BSON.BSON_INT64_MIN = -Math.pow(2, 63); - -// JS MAX PRECISE VALUES -BSON.JS_INT_MAX = 0x20000000000000; // Any integer up to 2^53 can be precisely represented by a double. -BSON.JS_INT_MIN = -0x20000000000000; // Any integer down to -2^53 can be precisely represented by a double. - -// Internal long versions -var JS_INT_MAX_LONG = Long.fromNumber(0x20000000000000); // Any integer up to 2^53 can be precisely represented by a double. -var JS_INT_MIN_LONG = Long.fromNumber(-0x20000000000000); // Any integer down to -2^53 can be precisely represented by a double. - -/** - * Number BSON Type - * - * @classconstant BSON_DATA_NUMBER - **/ -BSON.BSON_DATA_NUMBER = 1; -/** - * String BSON Type - * - * @classconstant BSON_DATA_STRING - **/ -BSON.BSON_DATA_STRING = 2; -/** - * Object BSON Type - * - * @classconstant BSON_DATA_OBJECT - **/ -BSON.BSON_DATA_OBJECT = 3; -/** - * Array BSON Type - * - * @classconstant BSON_DATA_ARRAY - **/ -BSON.BSON_DATA_ARRAY = 4; -/** - * Binary BSON Type - * - * @classconstant BSON_DATA_BINARY - **/ -BSON.BSON_DATA_BINARY = 5; -/** - * ObjectID BSON Type - * - * @classconstant BSON_DATA_OID - **/ -BSON.BSON_DATA_OID = 7; -/** - * Boolean BSON Type - * - * @classconstant BSON_DATA_BOOLEAN - **/ -BSON.BSON_DATA_BOOLEAN = 8; -/** - * Date BSON Type - * - * @classconstant BSON_DATA_DATE - **/ -BSON.BSON_DATA_DATE = 9; -/** - * null BSON Type - * - * @classconstant BSON_DATA_NULL - **/ -BSON.BSON_DATA_NULL = 10; -/** - * RegExp BSON Type - * - * @classconstant BSON_DATA_REGEXP - **/ -BSON.BSON_DATA_REGEXP = 11; -/** - * Code BSON Type - * - * @classconstant BSON_DATA_CODE - **/ -BSON.BSON_DATA_CODE = 13; -/** - * Symbol BSON Type - * - * @classconstant BSON_DATA_SYMBOL - **/ -BSON.BSON_DATA_SYMBOL = 14; -/** - * Code with Scope BSON Type - * - * @classconstant BSON_DATA_CODE_W_SCOPE - **/ -BSON.BSON_DATA_CODE_W_SCOPE = 15; -/** - * 32 bit Integer BSON Type - * - * @classconstant BSON_DATA_INT - **/ -BSON.BSON_DATA_INT = 16; -/** - * Timestamp BSON Type - * - * @classconstant BSON_DATA_TIMESTAMP - **/ -BSON.BSON_DATA_TIMESTAMP = 17; -/** - * Long BSON Type - * - * @classconstant BSON_DATA_LONG - **/ -BSON.BSON_DATA_LONG = 18; -/** - * MinKey BSON Type - * - * @classconstant BSON_DATA_MIN_KEY - **/ -BSON.BSON_DATA_MIN_KEY = 0xff; -/** - * MaxKey BSON Type - * - * @classconstant BSON_DATA_MAX_KEY - **/ -BSON.BSON_DATA_MAX_KEY = 0x7f; - -/** - * Binary Default Type - * - * @classconstant BSON_BINARY_SUBTYPE_DEFAULT - **/ -BSON.BSON_BINARY_SUBTYPE_DEFAULT = 0; -/** - * Binary Function Type - * - * @classconstant BSON_BINARY_SUBTYPE_FUNCTION - **/ -BSON.BSON_BINARY_SUBTYPE_FUNCTION = 1; -/** - * Binary Byte Array Type - * - * @classconstant BSON_BINARY_SUBTYPE_BYTE_ARRAY - **/ -BSON.BSON_BINARY_SUBTYPE_BYTE_ARRAY = 2; -/** - * Binary UUID Type - * - * @classconstant BSON_BINARY_SUBTYPE_UUID - **/ -BSON.BSON_BINARY_SUBTYPE_UUID = 3; -/** - * Binary MD5 Type - * - * @classconstant BSON_BINARY_SUBTYPE_MD5 - **/ -BSON.BSON_BINARY_SUBTYPE_MD5 = 4; -/** - * Binary User Defined Type - * - * @classconstant BSON_BINARY_SUBTYPE_USER_DEFINED - **/ -BSON.BSON_BINARY_SUBTYPE_USER_DEFINED = 128; - -/** - * Calculate the bson size for a passed in Javascript object. - * - * @param {Object} object the Javascript object to calculate the BSON byte size for. - * @param {Boolean} [serializeFunctions] serialize all functions in the object **(default:false)**. - * @return {Number} returns the number of bytes the BSON object will take up. - * @api public - */ -BSON.calculateObjectSize = function calculateObjectSize(object, serializeFunctions) { - var totalLength = (4 + 1); - - if(Array.isArray(object)) { - for(var i = 0; i < object.length; i++) { - totalLength += calculateElement(i.toString(), object[i], serializeFunctions) - } - } else { - // If we have toBSON defined, override the current object - if(object.toBSON) { - object = object.toBSON(); - } - - // Calculate size - for(var key in object) { - totalLength += calculateElement(key, object[key], serializeFunctions) - } - } - - return totalLength; -} - -/** - * @ignore - * @api private - */ -function calculateElement(name, value, serializeFunctions) { - var isBuffer = typeof Buffer !== 'undefined'; - - switch(typeof value) { - case 'string': - return 1 + (!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1 + 4 + (!isBuffer ? numberOfBytes(value) : Buffer.byteLength(value, 'utf8')) + 1; - case 'number': - if(Math.floor(value) === value && value >= BSON.JS_INT_MIN && value <= BSON.JS_INT_MAX) { - if(value >= BSON.BSON_INT32_MIN && value <= BSON.BSON_INT32_MAX) { // 32 bit - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + (4 + 1); - } else { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + (8 + 1); - } - } else { // 64 bit - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + (8 + 1); - } - case 'undefined': - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + (1); - case 'boolean': - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + (1 + 1); - case 'object': - if(value == null || value instanceof MinKey || value instanceof MaxKey || value['_bsontype'] == 'MinKey' || value['_bsontype'] == 'MaxKey') { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + (1); - } else if(value instanceof ObjectID || value['_bsontype'] == 'ObjectID') { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + (12 + 1); - } else if(value instanceof Date || isDate(value)) { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + (8 + 1); - } else if(typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + (1 + 4 + 1) + value.length; - } else if(value instanceof Long || value instanceof Double || value instanceof Timestamp - || value['_bsontype'] == 'Long' || value['_bsontype'] == 'Double' || value['_bsontype'] == 'Timestamp') { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + (8 + 1); - } else if(value instanceof Code || value['_bsontype'] == 'Code') { - // Calculate size depending on the availability of a scope - if(value.scope != null && Object.keys(value.scope).length > 0) { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + 1 + 4 + 4 + (!isBuffer ? numberOfBytes(value.code.toString()) : Buffer.byteLength(value.code.toString(), 'utf8')) + 1 + BSON.calculateObjectSize(value.scope, serializeFunctions); - } else { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + 1 + 4 + (!isBuffer ? numberOfBytes(value.code.toString()) : Buffer.byteLength(value.code.toString(), 'utf8')) + 1; - } - } else if(value instanceof Binary || value['_bsontype'] == 'Binary') { - // Check what kind of subtype we have - if(value.sub_type == Binary.SUBTYPE_BYTE_ARRAY) { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + (value.position + 1 + 4 + 1 + 4); - } else { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + (value.position + 1 + 4 + 1); - } - } else if(value instanceof Symbol || value['_bsontype'] == 'Symbol') { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + ((!isBuffer ? numberOfBytes(value.value) : Buffer.byteLength(value.value, 'utf8')) + 4 + 1 + 1); - } else if(value instanceof DBRef || value['_bsontype'] == 'DBRef') { - // Set up correct object for serialization - var ordered_values = { - '$ref': value.namespace - , '$id' : value.oid - }; - - // Add db reference if it exists - if(null != value.db) { - ordered_values['$db'] = value.db; - } - - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + 1 + BSON.calculateObjectSize(ordered_values, serializeFunctions); - } else if(value instanceof RegExp || Object.prototype.toString.call(value) === '[object RegExp]') { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + 1 + (!isBuffer ? numberOfBytes(value.source) : Buffer.byteLength(value.source, 'utf8')) + 1 - + (value.global ? 1 : 0) + (value.ignoreCase ? 1 : 0) + (value.multiline ? 1 : 0) + 1 - } else { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + BSON.calculateObjectSize(value, serializeFunctions) + 1; - } - case 'function': - // WTF for 0.4.X where typeof /someregexp/ === 'function' - if(value instanceof RegExp || Object.prototype.toString.call(value) === '[object RegExp]' || String.call(value) == '[object RegExp]') { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + 1 + (!isBuffer ? numberOfBytes(value.source) : Buffer.byteLength(value.source, 'utf8')) + 1 - + (value.global ? 1 : 0) + (value.ignoreCase ? 1 : 0) + (value.multiline ? 1 : 0) + 1 - } else { - if(serializeFunctions && value.scope != null && Object.keys(value.scope).length > 0) { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + 1 + 4 + 4 + (!isBuffer ? numberOfBytes(value.toString()) : Buffer.byteLength(value.toString(), 'utf8')) + 1 + BSON.calculateObjectSize(value.scope, serializeFunctions); - } else if(serializeFunctions) { - return (name != null ? ((!isBuffer ? numberOfBytes(name) : Buffer.byteLength(name, 'utf8')) + 1) : 0) + 1 + 4 + (!isBuffer ? numberOfBytes(value.toString()) : Buffer.byteLength(value.toString(), 'utf8')) + 1; - } - } - } - - return 0; -} - -/** - * Serialize a Javascript object using a predefined Buffer and index into the buffer, useful when pre-allocating the space for serialization. - * - * @param {Object} object the Javascript object to serialize. - * @param {Boolean} checkKeys the serializer will check if keys are valid. - * @param {Buffer} buffer the Buffer you pre-allocated to store the serialized BSON object. - * @param {Number} index the index in the buffer where we wish to start serializing into. - * @param {Boolean} serializeFunctions serialize the javascript functions **(default:false)**. - * @return {Number} returns the new write index in the Buffer. - * @api public - */ -BSON.serializeWithBufferAndIndex = function serializeWithBufferAndIndex(object, checkKeys, buffer, index, serializeFunctions) { - // Default setting false - serializeFunctions = serializeFunctions == null ? false : serializeFunctions; - // Write end information (length of the object) - var size = buffer.length; - // Write the size of the object - buffer[index++] = size & 0xff; - buffer[index++] = (size >> 8) & 0xff; - buffer[index++] = (size >> 16) & 0xff; - buffer[index++] = (size >> 24) & 0xff; - return serializeObject(object, checkKeys, buffer, index, serializeFunctions) - 1; -} - -/** - * @ignore - * @api private - */ -var serializeObject = function(object, checkKeys, buffer, index, serializeFunctions) { - // Process the object - if(Array.isArray(object)) { - for(var i = 0; i < object.length; i++) { - index = packElement(i.toString(), object[i], checkKeys, buffer, index, serializeFunctions); - } - } else { - // If we have toBSON defined, override the current object - if(object.toBSON) { - object = object.toBSON(); - } - - // Serialize the object - for(var key in object) { - // Check the key and throw error if it's illegal - if(checkKeys == true && (key != '$db' && key != '$ref' && key != '$id')) { - BSON.checkKey(key); - } - - // Pack the element - index = packElement(key, object[key], checkKeys, buffer, index, serializeFunctions); - } - } - - // Write zero - buffer[index++] = 0; - return index; -} - -var stringToBytes = function(str) { - var ch, st, re = []; - for (var i = 0; i < str.length; i++ ) { - ch = str.charCodeAt(i); // get char - st = []; // set up "stack" - do { - st.push( ch & 0xFF ); // push byte to stack - ch = ch >> 8; // shift value down by 1 byte - } - while ( ch ); - // add stack contents to result - // done because chars have "wrong" endianness - re = re.concat( st.reverse() ); - } - // return an array of bytes - return re; -} - -var numberOfBytes = function(str) { - var ch, st, re = 0; - for (var i = 0; i < str.length; i++ ) { - ch = str.charCodeAt(i); // get char - st = []; // set up "stack" - do { - st.push( ch & 0xFF ); // push byte to stack - ch = ch >> 8; // shift value down by 1 byte - } - while ( ch ); - // add stack contents to result - // done because chars have "wrong" endianness - re = re + st.length; - } - // return an array of bytes - return re; -} - -/** - * @ignore - * @api private - */ -var writeToTypedArray = function(buffer, string, index) { - var bytes = stringToBytes(string); - for(var i = 0; i < bytes.length; i++) { - buffer[index + i] = bytes[i]; - } - return bytes.length; -} - -/** - * @ignore - * @api private - */ -var supportsBuffer = typeof Buffer != 'undefined'; - -/** - * @ignore - * @api private - */ -var packElement = function(name, value, checkKeys, buffer, index, serializeFunctions) { - var startIndex = index; - - switch(typeof value) { - case 'string': - // Encode String type - buffer[index++] = BSON.BSON_DATA_STRING; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - - // Calculate size - var size = supportsBuffer ? Buffer.byteLength(value) + 1 : numberOfBytes(value) + 1; - // Write the size of the string to buffer - buffer[index + 3] = (size >> 24) & 0xff; - buffer[index + 2] = (size >> 16) & 0xff; - buffer[index + 1] = (size >> 8) & 0xff; - buffer[index] = size & 0xff; - // Ajust the index - index = index + 4; - // Write the string - supportsBuffer ? buffer.write(value, index, 'utf8') : writeToTypedArray(buffer, value, index); - // Update index - index = index + size - 1; - // Write zero - buffer[index++] = 0; - // Return index - return index; - case 'number': - // We have an integer value - if(Math.floor(value) === value && value >= BSON.JS_INT_MIN && value <= BSON.JS_INT_MAX) { - // If the value fits in 32 bits encode as int, if it fits in a double - // encode it as a double, otherwise long - if(value >= BSON.BSON_INT32_MIN && value <= BSON.BSON_INT32_MAX) { - // Set int type 32 bits or less - buffer[index++] = BSON.BSON_DATA_INT; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Write the int value - buffer[index++] = value & 0xff; - buffer[index++] = (value >> 8) & 0xff; - buffer[index++] = (value >> 16) & 0xff; - buffer[index++] = (value >> 24) & 0xff; - } else if(value >= BSON.JS_INT_MIN && value <= BSON.JS_INT_MAX) { - // Encode as double - buffer[index++] = BSON.BSON_DATA_NUMBER; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Write float - writeIEEE754(buffer, value, index, 'little', 52, 8); - // Ajust index - index = index + 8; - } else { - // Set long type - buffer[index++] = BSON.BSON_DATA_LONG; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - var longVal = Long.fromNumber(value); - var lowBits = longVal.getLowBits(); - var highBits = longVal.getHighBits(); - // Encode low bits - buffer[index++] = lowBits & 0xff; - buffer[index++] = (lowBits >> 8) & 0xff; - buffer[index++] = (lowBits >> 16) & 0xff; - buffer[index++] = (lowBits >> 24) & 0xff; - // Encode high bits - buffer[index++] = highBits & 0xff; - buffer[index++] = (highBits >> 8) & 0xff; - buffer[index++] = (highBits >> 16) & 0xff; - buffer[index++] = (highBits >> 24) & 0xff; - } - } else { - // Encode as double - buffer[index++] = BSON.BSON_DATA_NUMBER; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Write float - writeIEEE754(buffer, value, index, 'little', 52, 8); - // Ajust index - index = index + 8; - } - - return index; - case 'undefined': - // Set long type - buffer[index++] = BSON.BSON_DATA_NULL; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - return index; - case 'boolean': - // Write the type - buffer[index++] = BSON.BSON_DATA_BOOLEAN; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Encode the boolean value - buffer[index++] = value ? 1 : 0; - return index; - case 'object': - if(value === null || value instanceof MinKey || value instanceof MaxKey - || value['_bsontype'] == 'MinKey' || value['_bsontype'] == 'MaxKey') { - // Write the type of either min or max key - if(value === null) { - buffer[index++] = BSON.BSON_DATA_NULL; - } else if(value instanceof MinKey) { - buffer[index++] = BSON.BSON_DATA_MIN_KEY; - } else { - buffer[index++] = BSON.BSON_DATA_MAX_KEY; - } - - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - return index; - } else if(value instanceof ObjectID || value['_bsontype'] == 'ObjectID') { - // Write the type - buffer[index++] = BSON.BSON_DATA_OID; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - - // Write objectid - supportsBuffer ? buffer.write(value.id, index, 'binary') : writeToTypedArray(buffer, value.id, index); - // Ajust index - index = index + 12; - return index; - } else if(value instanceof Date || isDate(value)) { - // Write the type - buffer[index++] = BSON.BSON_DATA_DATE; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - - // Write the date - var dateInMilis = Long.fromNumber(value.getTime()); - var lowBits = dateInMilis.getLowBits(); - var highBits = dateInMilis.getHighBits(); - // Encode low bits - buffer[index++] = lowBits & 0xff; - buffer[index++] = (lowBits >> 8) & 0xff; - buffer[index++] = (lowBits >> 16) & 0xff; - buffer[index++] = (lowBits >> 24) & 0xff; - // Encode high bits - buffer[index++] = highBits & 0xff; - buffer[index++] = (highBits >> 8) & 0xff; - buffer[index++] = (highBits >> 16) & 0xff; - buffer[index++] = (highBits >> 24) & 0xff; - return index; - } else if(typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) { - // Write the type - buffer[index++] = BSON.BSON_DATA_BINARY; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Get size of the buffer (current write point) - var size = value.length; - // Write the size of the string to buffer - buffer[index++] = size & 0xff; - buffer[index++] = (size >> 8) & 0xff; - buffer[index++] = (size >> 16) & 0xff; - buffer[index++] = (size >> 24) & 0xff; - // Write the default subtype - buffer[index++] = BSON.BSON_BINARY_SUBTYPE_DEFAULT; - // Copy the content form the binary field to the buffer - value.copy(buffer, index, 0, size); - // Adjust the index - index = index + size; - return index; - } else if(value instanceof Long || value instanceof Timestamp || value['_bsontype'] == 'Long' || value['_bsontype'] == 'Timestamp') { - // Write the type - buffer[index++] = value instanceof Long ? BSON.BSON_DATA_LONG : BSON.BSON_DATA_TIMESTAMP; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Write the date - var lowBits = value.getLowBits(); - var highBits = value.getHighBits(); - // Encode low bits - buffer[index++] = lowBits & 0xff; - buffer[index++] = (lowBits >> 8) & 0xff; - buffer[index++] = (lowBits >> 16) & 0xff; - buffer[index++] = (lowBits >> 24) & 0xff; - // Encode high bits - buffer[index++] = highBits & 0xff; - buffer[index++] = (highBits >> 8) & 0xff; - buffer[index++] = (highBits >> 16) & 0xff; - buffer[index++] = (highBits >> 24) & 0xff; - return index; - } else if(value instanceof Double || value['_bsontype'] == 'Double') { - // Encode as double - buffer[index++] = BSON.BSON_DATA_NUMBER; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Write float - writeIEEE754(buffer, value, index, 'little', 52, 8); - // Ajust index - index = index + 8; - return index; - } else if(value instanceof Code || value['_bsontype'] == 'Code') { - if(value.scope != null && Object.keys(value.scope).length > 0) { - // Write the type - buffer[index++] = BSON.BSON_DATA_CODE_W_SCOPE; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Calculate the scope size - var scopeSize = BSON.calculateObjectSize(value.scope, serializeFunctions); - // Function string - var functionString = value.code.toString(); - // Function Size - var codeSize = supportsBuffer ? Buffer.byteLength(functionString) + 1 : numberOfBytes(functionString) + 1; - - // Calculate full size of the object - var totalSize = 4 + codeSize + scopeSize + 4; - - // Write the total size of the object - buffer[index++] = totalSize & 0xff; - buffer[index++] = (totalSize >> 8) & 0xff; - buffer[index++] = (totalSize >> 16) & 0xff; - buffer[index++] = (totalSize >> 24) & 0xff; - - // Write the size of the string to buffer - buffer[index++] = codeSize & 0xff; - buffer[index++] = (codeSize >> 8) & 0xff; - buffer[index++] = (codeSize >> 16) & 0xff; - buffer[index++] = (codeSize >> 24) & 0xff; - - // Write the string - supportsBuffer ? buffer.write(functionString, index, 'utf8') : writeToTypedArray(buffer, functionString, index); - // Update index - index = index + codeSize - 1; - // Write zero - buffer[index++] = 0; - // Serialize the scope object - var scopeObjectBuffer = supportsBuffer ? new Buffer(scopeSize) : new Uint8Array(new ArrayBuffer(scopeSize)); - // Execute the serialization into a seperate buffer - serializeObject(value.scope, checkKeys, scopeObjectBuffer, 0, serializeFunctions); - - // Adjusted scope Size (removing the header) - var scopeDocSize = scopeSize; - // Write scope object size - buffer[index++] = scopeDocSize & 0xff; - buffer[index++] = (scopeDocSize >> 8) & 0xff; - buffer[index++] = (scopeDocSize >> 16) & 0xff; - buffer[index++] = (scopeDocSize >> 24) & 0xff; - - // Write the scopeObject into the buffer - supportsBuffer ? scopeObjectBuffer.copy(buffer, index, 0, scopeSize) : buffer.set(scopeObjectBuffer, index); - // Adjust index, removing the empty size of the doc (5 bytes 0000000005) - index = index + scopeDocSize - 5; - // Write trailing zero - buffer[index++] = 0; - return index - } else { - buffer[index++] = BSON.BSON_DATA_CODE; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Function string - var functionString = value.code.toString(); - // Function Size - var size = supportsBuffer ? Buffer.byteLength(functionString) + 1 : numberOfBytes(functionString) + 1; - // Write the size of the string to buffer - buffer[index++] = size & 0xff; - buffer[index++] = (size >> 8) & 0xff; - buffer[index++] = (size >> 16) & 0xff; - buffer[index++] = (size >> 24) & 0xff; - // Write the string - buffer.write(functionString, index, 'utf8'); - // Update index - index = index + size - 1; - // Write zero - buffer[index++] = 0; - return index; - } - } else if(value instanceof Binary || value['_bsontype'] == 'Binary') { - // Write the type - buffer[index++] = BSON.BSON_DATA_BINARY; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Extract the buffer - var data = value.value(true); - // Calculate size - var size = value.position; - // Write the size of the string to buffer - buffer[index++] = size & 0xff; - buffer[index++] = (size >> 8) & 0xff; - buffer[index++] = (size >> 16) & 0xff; - buffer[index++] = (size >> 24) & 0xff; - // Write the subtype to the buffer - buffer[index++] = value.sub_type; - - // If we have binary type 2 the 4 first bytes are the size - if(value.sub_type == Binary.SUBTYPE_BYTE_ARRAY) { - buffer[index++] = size & 0xff; - buffer[index++] = (size >> 8) & 0xff; - buffer[index++] = (size >> 16) & 0xff; - buffer[index++] = (size >> 24) & 0xff; - } - - // Write the data to the object - supportsBuffer ? data.copy(buffer, index, 0, value.position) : buffer.set(data, index); - // Ajust index - index = index + value.position; - return index; - } else if(value instanceof Symbol || value['_bsontype'] == 'Symbol') { - // Write the type - buffer[index++] = BSON.BSON_DATA_SYMBOL; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Calculate size - var size = supportsBuffer ? Buffer.byteLength(value.value) + 1 : numberOfBytes(value.value) + 1; - // Write the size of the string to buffer - buffer[index++] = size & 0xff; - buffer[index++] = (size >> 8) & 0xff; - buffer[index++] = (size >> 16) & 0xff; - buffer[index++] = (size >> 24) & 0xff; - // Write the string - buffer.write(value.value, index, 'utf8'); - // Update index - index = index + size - 1; - // Write zero - buffer[index++] = 0x00; - return index; - } else if(value instanceof DBRef || value['_bsontype'] == 'DBRef') { - // Write the type - buffer[index++] = BSON.BSON_DATA_OBJECT; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Set up correct object for serialization - var ordered_values = { - '$ref': value.namespace - , '$id' : value.oid - }; - - // Add db reference if it exists - if(null != value.db) { - ordered_values['$db'] = value.db; - } - - // Message size - var size = BSON.calculateObjectSize(ordered_values, serializeFunctions); - // Serialize the object - var endIndex = BSON.serializeWithBufferAndIndex(ordered_values, checkKeys, buffer, index, serializeFunctions); - // Write the size of the string to buffer - buffer[index++] = size & 0xff; - buffer[index++] = (size >> 8) & 0xff; - buffer[index++] = (size >> 16) & 0xff; - buffer[index++] = (size >> 24) & 0xff; - // Write zero for object - buffer[endIndex++] = 0x00; - // Return the end index - return endIndex; - } else if(value instanceof RegExp || Object.prototype.toString.call(value) === '[object RegExp]') { - // Write the type - buffer[index++] = BSON.BSON_DATA_REGEXP; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - - // Write the regular expression string - supportsBuffer ? buffer.write(value.source, index, 'utf8') : writeToTypedArray(buffer, value.source, index); - // Adjust the index - index = index + (supportsBuffer ? Buffer.byteLength(value.source) : numberOfBytes(value.source)); - // Write zero - buffer[index++] = 0x00; - // Write the parameters - if(value.global) buffer[index++] = 0x73; // s - if(value.ignoreCase) buffer[index++] = 0x69; // i - if(value.multiline) buffer[index++] = 0x6d; // m - // Add ending zero - buffer[index++] = 0x00; - return index; - } else { - // Write the type - buffer[index++] = Array.isArray(value) ? BSON.BSON_DATA_ARRAY : BSON.BSON_DATA_OBJECT; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Adjust the index - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - var endIndex = serializeObject(value, checkKeys, buffer, index + 4, serializeFunctions); - // Write size - var size = endIndex - index; - // Write the size of the string to buffer - buffer[index++] = size & 0xff; - buffer[index++] = (size >> 8) & 0xff; - buffer[index++] = (size >> 16) & 0xff; - buffer[index++] = (size >> 24) & 0xff; - return endIndex; - } - case 'function': - // WTF for 0.4.X where typeof /someregexp/ === 'function' - if(value instanceof RegExp || Object.prototype.toString.call(value) === '[object RegExp]' || String.call(value) == '[object RegExp]') { - // Write the type - buffer[index++] = BSON.BSON_DATA_REGEXP; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - - // Write the regular expression string - buffer.write(value.source, index, 'utf8'); - // Adjust the index - index = index + (supportsBuffer ? Buffer.byteLength(value.source) : numberOfBytes(value.source)); - // Write zero - buffer[index++] = 0x00; - // Write the parameters - if(value.global) buffer[index++] = 0x73; // s - if(value.ignoreCase) buffer[index++] = 0x69; // i - if(value.multiline) buffer[index++] = 0x6d; // m - // Add ending zero - buffer[index++] = 0x00; - return index; - } else { - if(serializeFunctions && value.scope != null && Object.keys(value.scope).length > 0) { - // Write the type - buffer[index++] = BSON.BSON_DATA_CODE_W_SCOPE; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Calculate the scope size - var scopeSize = BSON.calculateObjectSize(value.scope, serializeFunctions); - // Function string - var functionString = value.toString(); - // Function Size - var codeSize = supportsBuffer ? Buffer.byteLength(functionString) + 1 : numberOfBytes(functionString) + 1; - - // Calculate full size of the object - var totalSize = 4 + codeSize + scopeSize; - - // Write the total size of the object - buffer[index++] = totalSize & 0xff; - buffer[index++] = (totalSize >> 8) & 0xff; - buffer[index++] = (totalSize >> 16) & 0xff; - buffer[index++] = (totalSize >> 24) & 0xff; - - // Write the size of the string to buffer - buffer[index++] = codeSize & 0xff; - buffer[index++] = (codeSize >> 8) & 0xff; - buffer[index++] = (codeSize >> 16) & 0xff; - buffer[index++] = (codeSize >> 24) & 0xff; - - // Write the string - buffer.write(functionString, index, 'utf8'); - // Update index - index = index + codeSize - 1; - // Write zero - buffer[index++] = 0; - // Serialize the scope object - var scopeObjectBuffer = new Buffer(scopeSize); - // Execute the serialization into a seperate buffer - serializeObject(value.scope, checkKeys, scopeObjectBuffer, 0, serializeFunctions); - - // Adjusted scope Size (removing the header) - var scopeDocSize = scopeSize - 4; - // Write scope object size - buffer[index++] = scopeDocSize & 0xff; - buffer[index++] = (scopeDocSize >> 8) & 0xff; - buffer[index++] = (scopeDocSize >> 16) & 0xff; - buffer[index++] = (scopeDocSize >> 24) & 0xff; - - // Write the scopeObject into the buffer - scopeObjectBuffer.copy(buffer, index, 0, scopeSize); - - // Adjust index, removing the empty size of the doc (5 bytes 0000000005) - index = index + scopeDocSize - 5; - // Write trailing zero - buffer[index++] = 0; - return index - } else if(serializeFunctions) { - buffer[index++] = BSON.BSON_DATA_CODE; - // Number of written bytes - var numberOfWrittenBytes = supportsBuffer ? buffer.write(name, index, 'utf8') : writeToTypedArray(buffer, name, index); - // Encode the name - index = index + numberOfWrittenBytes + 1; - buffer[index - 1] = 0; - // Function string - var functionString = value.toString(); - // Function Size - var size = supportsBuffer ? Buffer.byteLength(functionString) + 1 : numberOfBytes(functionString) + 1; - // Write the size of the string to buffer - buffer[index++] = size & 0xff; - buffer[index++] = (size >> 8) & 0xff; - buffer[index++] = (size >> 16) & 0xff; - buffer[index++] = (size >> 24) & 0xff; - // Write the string - buffer.write(functionString, index, 'utf8'); - // Update index - index = index + size - 1; - // Write zero - buffer[index++] = 0; - return index; - } - } - } - - // If no value to serialize - return index; -} - -/** - * Serialize a Javascript object. - * - * @param {Object} object the Javascript object to serialize. - * @param {Boolean} checkKeys the serializer will check if keys are valid. - * @param {Boolean} asBuffer return the serialized object as a Buffer object **(ignore)**. - * @param {Boolean} serializeFunctions serialize the javascript functions **(default:false)**. - * @return {Buffer} returns the Buffer object containing the serialized object. - * @api public - */ -BSON.serialize = function(object, checkKeys, asBuffer, serializeFunctions) { - var buffer = null; - // Calculate the size of the object - var size = BSON.calculateObjectSize(object, serializeFunctions); - // Fetch the best available type for storing the binary data - if(buffer = typeof Buffer != 'undefined') { - buffer = new Buffer(size); - asBuffer = true; - } else if(typeof Uint8Array != 'undefined') { - buffer = new Uint8Array(new ArrayBuffer(size)); - } else { - buffer = new Array(size); - } - - // If asBuffer is false use typed arrays - BSON.serializeWithBufferAndIndex(object, checkKeys, buffer, 0, serializeFunctions); - return buffer; -} - -/** - * Contains the function cache if we have that enable to allow for avoiding the eval step on each deserialization, comparison is by md5 - * - * @ignore - * @api private - */ -var functionCache = BSON.functionCache = {}; - -/** - * Crc state variables shared by function - * - * @ignore - * @api private - */ -var table = [0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D]; - -/** - * CRC32 hash method, Fast and enough versitility for our usage - * - * @ignore - * @api private - */ -var crc32 = function(string, start, end) { - var crc = 0 - var x = 0; - var y = 0; - crc = crc ^ (-1); - - for(var i = start, iTop = end; i < iTop;i++) { - y = (crc ^ string[i]) & 0xFF; - x = table[y]; - crc = (crc >>> 8) ^ x; - } - - return crc ^ (-1); -} - -/** - * Deserialize stream data as BSON documents. - * - * Options - * - **evalFunctions** {Boolean, default:false}, evaluate functions in the BSON document scoped to the object deserialized. - * - **cacheFunctions** {Boolean, default:false}, cache evaluated functions for reuse. - * - **cacheFunctionsCrc32** {Boolean, default:false}, use a crc32 code for caching, otherwise use the string of the function. - * - * @param {Buffer} data the buffer containing the serialized set of BSON documents. - * @param {Number} startIndex the start index in the data Buffer where the deserialization is to start. - * @param {Number} numberOfDocuments number of documents to deserialize. - * @param {Array} documents an array where to store the deserialized documents. - * @param {Number} docStartIndex the index in the documents array from where to start inserting documents. - * @param {Object} [options] additional options used for the deserialization. - * @return {Number} returns the next index in the buffer after deserialization **x** numbers of documents. - * @api public - */ -BSON.deserializeStream = function(data, startIndex, numberOfDocuments, documents, docStartIndex, options) { - // if(numberOfDocuments !== documents.length) throw new Error("Number of expected results back is less than the number of documents"); - options = options != null ? options : {}; - var index = startIndex; - // Loop over all documents - for(var i = 0; i < numberOfDocuments; i++) { - // Find size of the document - var size = data[index] | data[index + 1] << 8 | data[index + 2] << 16 | data[index + 3] << 24; - // Update options with index - options['index'] = index; - // Parse the document at this point - documents[docStartIndex + i] = BSON.deserialize(data, options); - // Adjust index by the document size - index = index + size; - } - - // Return object containing end index of parsing and list of documents - return index; -} - -/** - * Ensure eval is isolated. - * - * @ignore - * @api private - */ -var isolateEvalWithHash = function(functionCache, hash, functionString, object) { - // Contains the value we are going to set - var value = null; - - // Check for cache hit, eval if missing and return cached function - if(functionCache[hash] == null) { - eval("value = " + functionString); - functionCache[hash] = value; - } - // Set the object - return functionCache[hash].bind(object); -} - -/** - * Ensure eval is isolated. - * - * @ignore - * @api private - */ -var isolateEval = function(functionString) { - // Contains the value we are going to set - var value = null; - // Eval the function - eval("value = " + functionString); - return value; -} - -/** - * Convert Uint8Array to String - * - * @ignore - * @api private - */ -var convertUint8ArrayToUtf8String = function(byteArray, startIndex, endIndex) { - return BinaryParser.decode_utf8(convertArraytoUtf8BinaryString(byteArray, startIndex, endIndex)); -} - -var convertArraytoUtf8BinaryString = function(byteArray, startIndex, endIndex) { - var result = ""; - for(var i = startIndex; i < endIndex; i++) { - result = result + String.fromCharCode(byteArray[i]); - } - - return result; -}; - -/** - * Deserialize data as BSON. - * - * Options - * - **evalFunctions** {Boolean, default:false}, evaluate functions in the BSON document scoped to the object deserialized. - * - **cacheFunctions** {Boolean, default:false}, cache evaluated functions for reuse. - * - **cacheFunctionsCrc32** {Boolean, default:false}, use a crc32 code for caching, otherwise use the string of the function. - * - * @param {Buffer} buffer the buffer containing the serialized set of BSON documents. - * @param {Object} [options] additional options used for the deserialization. - * @param {Boolean} [isArray] ignore used for recursive parsing. - * @return {Object} returns the deserialized Javascript Object. - * @api public - */ -BSON.deserialize = function(buffer, options, isArray) { - // Options - options = options == null ? {} : options; - var evalFunctions = options['evalFunctions'] == null ? false : options['evalFunctions']; - var cacheFunctions = options['cacheFunctions'] == null ? false : options['cacheFunctions']; - var cacheFunctionsCrc32 = options['cacheFunctionsCrc32'] == null ? false : options['cacheFunctionsCrc32']; - - // Validate that we have at least 4 bytes of buffer - if(buffer.length < 5) throw new Error("corrupt bson message < 5 bytes long"); - - // Set up index - var index = typeof options['index'] == 'number' ? options['index'] : 0; - // Reads in a C style string - var readCStyleString = function() { - // Get the start search index - var i = index; - // Locate the end of the c string - while(buffer[i] !== 0x00) { i++ } - // Grab utf8 encoded string - var string = supportsBuffer && Buffer.isBuffer(buffer) ? buffer.toString('utf8', index, i) : convertUint8ArrayToUtf8String(buffer, index, i); - // Update index position - index = i + 1; - // Return string - return string; - } - - // Create holding object - var object = isArray ? [] : {}; - - // Read the document size - var size = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - - // Ensure buffer is valid size - if(size < 5 || size > buffer.length) throw new Error("corrupt bson message"); - - // While we have more left data left keep parsing - while(true) { - // Read the type - var elementType = buffer[index++]; - // If we get a zero it's the last byte, exit - if(elementType == 0) break; - // Read the name of the field - var name = readCStyleString(); - // Switch on the type - switch(elementType) { - case BSON.BSON_DATA_OID: - var string = supportsBuffer && Buffer.isBuffer(buffer) ? buffer.toString('binary', index, index + 12) : convertArraytoUtf8BinaryString(buffer, index, index + 12); - // Decode the oid - object[name] = new ObjectID(string); - // Update index - index = index + 12; - break; - case BSON.BSON_DATA_STRING: - // Read the content of the field - var stringSize = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - // Add string to object - object[name] = supportsBuffer && Buffer.isBuffer(buffer) ? buffer.toString('utf8', index, index + stringSize - 1) : convertUint8ArrayToUtf8String(buffer, index, index + stringSize - 1); - // Update parse index position - index = index + stringSize; - break; - case BSON.BSON_DATA_INT: - // Decode the 32bit value - object[name] = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - break; - case BSON.BSON_DATA_NUMBER: - // Decode the double value - object[name] = readIEEE754(buffer, index, 'little', 52, 8); - // Update the index - index = index + 8; - break; - case BSON.BSON_DATA_DATE: - // Unpack the low and high bits - var lowBits = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - var highBits = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - // Set date object - object[name] = new Date(new Long(lowBits, highBits).toNumber()); - break; - case BSON.BSON_DATA_BOOLEAN: - // Parse the boolean value - object[name] = buffer[index++] == 1; - break; - case BSON.BSON_DATA_NULL: - // Parse the boolean value - object[name] = null; - break; - case BSON.BSON_DATA_BINARY: - // Decode the size of the binary blob - var binarySize = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - // Decode the subtype - var subType = buffer[index++]; - // Decode as raw Buffer object if options specifies it - if(buffer['slice'] != null) { - // If we have subtype 2 skip the 4 bytes for the size - if(subType == Binary.SUBTYPE_BYTE_ARRAY) { - binarySize = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - } - // Slice the data - object[name] = new Binary(buffer.slice(index, index + binarySize), subType); - } else { - var _buffer = typeof Uint8Array != 'undefined' ? new Uint8Array(new ArrayBuffer(binarySize)) : new Array(binarySize); - // If we have subtype 2 skip the 4 bytes for the size - if(subType == Binary.SUBTYPE_BYTE_ARRAY) { - binarySize = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - } - // Copy the data - for(var i = 0; i < binarySize; i++) { - _buffer[i] = buffer[index + i]; - } - // Create the binary object - object[name] = new Binary(_buffer, subType); - } - // Update the index - index = index + binarySize; - break; - case BSON.BSON_DATA_ARRAY: - options['index'] = index; - // Decode the size of the array document - var objectSize = buffer[index] | buffer[index + 1] << 8 | buffer[index + 2] << 16 | buffer[index + 3] << 24; - // Set the array to the object - object[name] = BSON.deserialize(buffer, options, true); - // Adjust the index - index = index + objectSize; - break; - case BSON.BSON_DATA_OBJECT: - options['index'] = index; - // Decode the size of the object document - var objectSize = buffer[index] | buffer[index + 1] << 8 | buffer[index + 2] << 16 | buffer[index + 3] << 24; - // Set the array to the object - object[name] = BSON.deserialize(buffer, options, false); - // Adjust the index - index = index + objectSize; - break; - case BSON.BSON_DATA_REGEXP: - // Create the regexp - var source = readCStyleString(); - var regExpOptions = readCStyleString(); - // For each option add the corresponding one for javascript - var optionsArray = new Array(regExpOptions.length); - - // Parse options - for(var i = 0; i < regExpOptions.length; i++) { - switch(regExpOptions[i]) { - case 'm': - optionsArray[i] = 'm'; - break; - case 's': - optionsArray[i] = 'g'; - break; - case 'i': - optionsArray[i] = 'i'; - break; - } - } - - object[name] = new RegExp(source, optionsArray.join('')); - break; - case BSON.BSON_DATA_LONG: - // Unpack the low and high bits - var lowBits = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - var highBits = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - // Create long object - var long = new Long(lowBits, highBits); - // Set the object - object[name] = long.lessThanOrEqual(JS_INT_MAX_LONG) && long.greaterThanOrEqual(JS_INT_MIN_LONG) ? long.toNumber() : long; - break; - case BSON.BSON_DATA_SYMBOL: - // Read the content of the field - var stringSize = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - // Add string to object - object[name] = new Symbol(buffer.toString('utf8', index, index + stringSize - 1)); - // Update parse index position - index = index + stringSize; - break; - case BSON.BSON_DATA_TIMESTAMP: - // Unpack the low and high bits - var lowBits = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - var highBits = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - // Set the object - object[name] = new Timestamp(lowBits, highBits); - break; - case BSON.BSON_DATA_MIN_KEY: - // Parse the object - object[name] = new MinKey(); - break; - case BSON.BSON_DATA_MAX_KEY: - // Parse the object - object[name] = new MaxKey(); - break; - case BSON.BSON_DATA_CODE: - // Read the content of the field - var stringSize = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - // Function string - var functionString = supportsBuffer && Buffer.isBuffer(buffer) ? buffer.toString('utf8', index, index + stringSize - 1) : convertUint8ArrayToUtf8String(buffer, index, index + stringSize - 1); - - // If we are evaluating the functions - if(evalFunctions) { - // Contains the value we are going to set - var value = null; - // If we have cache enabled let's look for the md5 of the function in the cache - if(cacheFunctions) { - var hash = cacheFunctionsCrc32 ? crc32(functionString) : functionString; - // Got to do this to avoid V8 deoptimizing the call due to finding eval - object[name] = isolateEvalWithHash(functionCache, hash, functionString, object); - } else { - // Set directly - object[name] = isolateEval(functionString); - } - } else { - object[name] = new Code(functionString, {}); - } - - // Update parse index position - index = index + stringSize; - break; - case BSON.BSON_DATA_CODE_W_SCOPE: - // Read the content of the field - var totalSize = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - var stringSize = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24; - // Javascript function - var functionString = supportsBuffer && Buffer.isBuffer(buffer) ? buffer.toString('utf8', index, index + stringSize - 1) : convertUint8ArrayToUtf8String(buffer, index, index + stringSize - 1); - // Update parse index position - index = index + stringSize; - // Parse the element - options['index'] = index; - // Decode the size of the object document - var objectSize = buffer[index] | buffer[index + 1] << 8 | buffer[index + 2] << 16 | buffer[index + 3] << 24; - // Decode the scope object - var scopeObject = BSON.deserialize(buffer, options, false); - // Adjust the index - index = index + objectSize; - - // If we are evaluating the functions - if(evalFunctions) { - // Contains the value we are going to set - var value = null; - // If we have cache enabled let's look for the md5 of the function in the cache - if(cacheFunctions) { - var hash = cacheFunctionsCrc32 ? crc32(functionString) : functionString; - // Got to do this to avoid V8 deoptimizing the call due to finding eval - object[name] = isolateEvalWithHash(functionCache, hash, functionString, object); - } else { - // Set directly - object[name] = isolateEval(functionString); - } - - // Set the scope on the object - object[name].scope = scopeObject; - } else { - object[name] = new Code(functionString, scopeObject); - } - - // Add string to object - break; - } - } - - // Check if we have a db ref object - if(object['$id'] != null) object = new DBRef(object['$ref'], object['$id'], object['$db']); - - // Return the final objects - return object; -} - -/** - * Check if key name is valid. - * - * @ignore - * @api private - */ -BSON.checkKey = function checkKey (key) { - if (!key.length) return; - // Check if we have a legal key for the object - if('$' == key[0]) { - throw Error("key " + key + " must not start with '$'"); - } else if (!!~key.indexOf('.')) { - throw Error("key " + key + " must not contain '.'"); - } -}; - -/** - * Deserialize data as BSON. - * - * Options - * - **evalFunctions** {Boolean, default:false}, evaluate functions in the BSON document scoped to the object deserialized. - * - **cacheFunctions** {Boolean, default:false}, cache evaluated functions for reuse. - * - **cacheFunctionsCrc32** {Boolean, default:false}, use a crc32 code for caching, otherwise use the string of the function. - * - * @param {Buffer} buffer the buffer containing the serialized set of BSON documents. - * @param {Object} [options] additional options used for the deserialization. - * @param {Boolean} [isArray] ignore used for recursive parsing. - * @return {Object} returns the deserialized Javascript Object. - * @api public - */ -BSON.prototype.deserialize = function(data, options) { - return BSON.deserialize(data, options); -} - -/** - * Deserialize stream data as BSON documents. - * - * Options - * - **evalFunctions** {Boolean, default:false}, evaluate functions in the BSON document scoped to the object deserialized. - * - **cacheFunctions** {Boolean, default:false}, cache evaluated functions for reuse. - * - **cacheFunctionsCrc32** {Boolean, default:false}, use a crc32 code for caching, otherwise use the string of the function. - * - * @param {Buffer} data the buffer containing the serialized set of BSON documents. - * @param {Number} startIndex the start index in the data Buffer where the deserialization is to start. - * @param {Number} numberOfDocuments number of documents to deserialize. - * @param {Array} documents an array where to store the deserialized documents. - * @param {Number} docStartIndex the index in the documents array from where to start inserting documents. - * @param {Object} [options] additional options used for the deserialization. - * @return {Number} returns the next index in the buffer after deserialization **x** numbers of documents. - * @api public - */ -BSON.prototype.deserializeStream = function(data, startIndex, numberOfDocuments, documents, docStartIndex, options) { - return BSON.deserializeStream(data, startIndex, numberOfDocuments, documents, docStartIndex, options); -} - -/** - * Serialize a Javascript object. - * - * @param {Object} object the Javascript object to serialize. - * @param {Boolean} checkKeys the serializer will check if keys are valid. - * @param {Boolean} asBuffer return the serialized object as a Buffer object **(ignore)**. - * @param {Boolean} serializeFunctions serialize the javascript functions **(default:false)**. - * @return {Buffer} returns the Buffer object containing the serialized object. - * @api public - */ -BSON.prototype.serialize = function(object, checkKeys, asBuffer, serializeFunctions) { - return BSON.serialize(object, checkKeys, asBuffer, serializeFunctions); -} - -/** - * Calculate the bson size for a passed in Javascript object. - * - * @param {Object} object the Javascript object to calculate the BSON byte size for. - * @param {Boolean} [serializeFunctions] serialize all functions in the object **(default:false)**. - * @return {Number} returns the number of bytes the BSON object will take up. - * @api public - */ -BSON.prototype.calculateObjectSize = function(object, serializeFunctions) { - return BSON.calculateObjectSize(object, serializeFunctions); -} - -/** - * Serialize a Javascript object using a predefined Buffer and index into the buffer, useful when pre-allocating the space for serialization. - * - * @param {Object} object the Javascript object to serialize. - * @param {Boolean} checkKeys the serializer will check if keys are valid. - * @param {Buffer} buffer the Buffer you pre-allocated to store the serialized BSON object. - * @param {Number} index the index in the buffer where we wish to start serializing into. - * @param {Boolean} serializeFunctions serialize the javascript functions **(default:false)**. - * @return {Number} returns the new write index in the Buffer. - * @api public - */ -BSON.prototype.serializeWithBufferAndIndex = function(object, checkKeys, buffer, startIndex, serializeFunctions) { - return BSON.serializeWithBufferAndIndex(object, checkKeys, buffer, startIndex, serializeFunctions); -} - -/** - * @ignore - * @api private - */ -exports.Code = Code; -exports.Symbol = Symbol; -exports.BSON = BSON; -exports.DBRef = DBRef; -exports.Binary = Binary; -exports.ObjectID = ObjectID; -exports.Long = Long; -exports.Timestamp = Timestamp; -exports.Double = Double; -exports.MinKey = MinKey; -exports.MaxKey = MaxKey; \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/code.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/code.js deleted file mode 100644 index 69b56a3..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/code.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * A class representation of the BSON Code type. - * - * @class Represents the BSON Code type. - * @param {String|Function} code a string or function. - * @param {Object} [scope] an optional scope for the function. - * @return {Code} - */ -function Code(code, scope) { - if(!(this instanceof Code)) return new Code(code, scope); - - this._bsontype = 'Code'; - this.code = code; - this.scope = scope == null ? {} : scope; -}; - -/** - * @ignore - * @api private - */ -Code.prototype.toJSON = function() { - return {scope:this.scope, code:this.code}; -} - -exports.Code = Code; \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/db_ref.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/db_ref.js deleted file mode 100644 index 56b6510..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/db_ref.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * A class representation of the BSON DBRef type. - * - * @class Represents the BSON DBRef type. - * @param {String} namespace the collection name. - * @param {ObjectID} oid the reference ObjectID. - * @param {String} [db] optional db name, if omitted the reference is local to the current db. - * @return {DBRef} - */ -function DBRef(namespace, oid, db) { - if(!(this instanceof DBRef)) return new DBRef(namespace, oid, db); - - this._bsontype = 'DBRef'; - this.namespace = namespace; - this.oid = oid; - this.db = db; -}; - -/** - * @ignore - * @api private - */ -DBRef.prototype.toJSON = function() { - return { - '$ref':this.namespace, - '$id':this.oid, - '$db':this.db == null ? '' : this.db - }; -} - -exports.DBRef = DBRef; \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/double.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/double.js deleted file mode 100644 index ae51463..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/double.js +++ /dev/null @@ -1,33 +0,0 @@ -/** - * A class representation of the BSON Double type. - * - * @class Represents the BSON Double type. - * @param {Number} value the number we want to represent as a double. - * @return {Double} - */ -function Double(value) { - if(!(this instanceof Double)) return new Double(value); - - this._bsontype = 'Double'; - this.value = value; -} - -/** - * Access the number value. - * - * @return {Number} returns the wrapped double number. - * @api public - */ -Double.prototype.valueOf = function() { - return this.value; -}; - -/** - * @ignore - * @api private - */ -Double.prototype.toJSON = function() { - return this.value; -} - -exports.Double = Double; \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/float_parser.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/float_parser.js deleted file mode 100644 index 6fca392..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/float_parser.js +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright (c) 2008, Fair Oaks Labs, Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// * Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// * Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// * Neither the name of Fair Oaks Labs, Inc. nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. -// -// -// Modifications to writeIEEE754 to support negative zeroes made by Brian White - -var readIEEE754 = function(buffer, offset, endian, mLen, nBytes) { - var e, m, - bBE = (endian === 'big'), - eLen = nBytes * 8 - mLen - 1, - eMax = (1 << eLen) - 1, - eBias = eMax >> 1, - nBits = -7, - i = bBE ? 0 : (nBytes - 1), - d = bBE ? 1 : -1, - s = buffer[offset + i]; - - i += d; - - e = s & ((1 << (-nBits)) - 1); - s >>= (-nBits); - nBits += eLen; - for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8); - - m = e & ((1 << (-nBits)) - 1); - e >>= (-nBits); - nBits += mLen; - for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8); - - if (e === 0) { - e = 1 - eBias; - } else if (e === eMax) { - return m ? NaN : ((s ? -1 : 1) * Infinity); - } else { - m = m + Math.pow(2, mLen); - e = e - eBias; - } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen); -}; - -var writeIEEE754 = function(buffer, value, offset, endian, mLen, nBytes) { - var e, m, c, - bBE = (endian === 'big'), - eLen = nBytes * 8 - mLen - 1, - eMax = (1 << eLen) - 1, - eBias = eMax >> 1, - rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0), - i = bBE ? (nBytes-1) : 0, - d = bBE ? -1 : 1, - s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; - - value = Math.abs(value); - - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0; - e = eMax; - } else { - e = Math.floor(Math.log(value) / Math.LN2); - if (value * (c = Math.pow(2, -e)) < 1) { - e--; - c *= 2; - } - if (e+eBias >= 1) { - value += rt / c; - } else { - value += rt * Math.pow(2, 1 - eBias); - } - if (value * c >= 2) { - e++; - c /= 2; - } - - if (e + eBias >= eMax) { - m = 0; - e = eMax; - } else if (e + eBias >= 1) { - m = (value * c - 1) * Math.pow(2, mLen); - e = e + eBias; - } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); - e = 0; - } - } - - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8); - - e = (e << mLen) | m; - eLen += mLen; - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8); - - buffer[offset + i - d] |= s * 128; -}; - -exports.readIEEE754 = readIEEE754; -exports.writeIEEE754 = writeIEEE754; \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/index.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/index.js deleted file mode 100644 index 950fcad..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/index.js +++ /dev/null @@ -1,74 +0,0 @@ -try { - exports.BSONPure = require('./bson'); - exports.BSONNative = require('../../ext'); -} catch(err) { - // do nothing -} - -[ './binary_parser' - , './binary' - , './code' - , './db_ref' - , './double' - , './max_key' - , './min_key' - , './objectid' - , './symbol' - , './timestamp' - , './long'].forEach(function (path) { - var module = require('./' + path); - for (var i in module) { - exports[i] = module[i]; - } -}); - -// Exports all the classes for the NATIVE JS BSON Parser -exports.native = function() { - var classes = {}; - // Map all the classes - [ './binary_parser' - , './binary' - , './code' - , './db_ref' - , './double' - , './max_key' - , './min_key' - , './objectid' - , './symbol' - , './timestamp' - , './long' - , '../../ext' -].forEach(function (path) { - var module = require('./' + path); - for (var i in module) { - classes[i] = module[i]; - } - }); - // Return classes list - return classes; -} - -// Exports all the classes for the PURE JS BSON Parser -exports.pure = function() { - var classes = {}; - // Map all the classes - [ './binary_parser' - , './binary' - , './code' - , './db_ref' - , './double' - , './max_key' - , './min_key' - , './objectid' - , './symbol' - , './timestamp' - , './long' - , '././bson'].forEach(function (path) { - var module = require('./' + path); - for (var i in module) { - classes[i] = module[i]; - } - }); - // Return classes list - return classes; -} diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/long.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/long.js deleted file mode 100644 index f8f37a6..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/long.js +++ /dev/null @@ -1,854 +0,0 @@ -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// Copyright 2009 Google Inc. All Rights Reserved - -/** - * Defines a Long class for representing a 64-bit two's-complement - * integer value, which faithfully simulates the behavior of a Java "Long". This - * implementation is derived from LongLib in GWT. - * - * Constructs a 64-bit two's-complement integer, given its low and high 32-bit - * values as *signed* integers. See the from* functions below for more - * convenient ways of constructing Longs. - * - * The internal representation of a Long is the two given signed, 32-bit values. - * We use 32-bit pieces because these are the size of integers on which - * Javascript performs bit-operations. For operations like addition and - * multiplication, we split each number into 16-bit pieces, which can easily be - * multiplied within Javascript's floating-point representation without overflow - * or change in sign. - * - * In the algorithms below, we frequently reduce the negative case to the - * positive case by negating the input(s) and then post-processing the result. - * Note that we must ALWAYS check specially whether those values are MIN_VALUE - * (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as - * a positive number, it overflows back into a negative). Not handling this - * case would often result in infinite recursion. - * - * @class Represents the BSON Long type. - * @param {Number} low the low (signed) 32 bits of the Long. - * @param {Number} high the high (signed) 32 bits of the Long. - */ -function Long(low, high) { - if(!(this instanceof Long)) return new Long(low, high); - - this._bsontype = 'Long'; - /** - * @type {number} - * @api private - */ - this.low_ = low | 0; // force into 32 signed bits. - - /** - * @type {number} - * @api private - */ - this.high_ = high | 0; // force into 32 signed bits. -}; - -/** - * Return the int value. - * - * @return {Number} the value, assuming it is a 32-bit integer. - * @api public - */ -Long.prototype.toInt = function() { - return this.low_; -}; - -/** - * Return the Number value. - * - * @return {Number} the closest floating-point representation to this value. - * @api public - */ -Long.prototype.toNumber = function() { - return this.high_ * Long.TWO_PWR_32_DBL_ + - this.getLowBitsUnsigned(); -}; - -/** - * Return the JSON value. - * - * @return {String} the JSON representation. - * @api public - */ -Long.prototype.toJSON = function() { - return this.toString(); -} - -/** - * Return the String value. - * - * @param {Number} [opt_radix] the radix in which the text should be written. - * @return {String} the textual representation of this value. - * @api public - */ -Long.prototype.toString = function(opt_radix) { - var radix = opt_radix || 10; - if (radix < 2 || 36 < radix) { - throw Error('radix out of range: ' + radix); - } - - if (this.isZero()) { - return '0'; - } - - if (this.isNegative()) { - if (this.equals(Long.MIN_VALUE)) { - // We need to change the Long value before it can be negated, so we remove - // the bottom-most digit in this base and then recurse to do the rest. - var radixLong = Long.fromNumber(radix); - var div = this.div(radixLong); - var rem = div.multiply(radixLong).subtract(this); - return div.toString(radix) + rem.toInt().toString(radix); - } else { - return '-' + this.negate().toString(radix); - } - } - - // Do several (6) digits each time through the loop, so as to - // minimize the calls to the very expensive emulated div. - var radixToPower = Long.fromNumber(Math.pow(radix, 6)); - - var rem = this; - var result = ''; - while (true) { - var remDiv = rem.div(radixToPower); - var intval = rem.subtract(remDiv.multiply(radixToPower)).toInt(); - var digits = intval.toString(radix); - - rem = remDiv; - if (rem.isZero()) { - return digits + result; - } else { - while (digits.length < 6) { - digits = '0' + digits; - } - result = '' + digits + result; - } - } -}; - -/** - * Return the high 32-bits value. - * - * @return {Number} the high 32-bits as a signed value. - * @api public - */ -Long.prototype.getHighBits = function() { - return this.high_; -}; - -/** - * Return the low 32-bits value. - * - * @return {Number} the low 32-bits as a signed value. - * @api public - */ -Long.prototype.getLowBits = function() { - return this.low_; -}; - -/** - * Return the low unsigned 32-bits value. - * - * @return {Number} the low 32-bits as an unsigned value. - * @api public - */ -Long.prototype.getLowBitsUnsigned = function() { - return (this.low_ >= 0) ? - this.low_ : Long.TWO_PWR_32_DBL_ + this.low_; -}; - -/** - * Returns the number of bits needed to represent the absolute value of this Long. - * - * @return {Number} Returns the number of bits needed to represent the absolute value of this Long. - * @api public - */ -Long.prototype.getNumBitsAbs = function() { - if (this.isNegative()) { - if (this.equals(Long.MIN_VALUE)) { - return 64; - } else { - return this.negate().getNumBitsAbs(); - } - } else { - var val = this.high_ != 0 ? this.high_ : this.low_; - for (var bit = 31; bit > 0; bit--) { - if ((val & (1 << bit)) != 0) { - break; - } - } - return this.high_ != 0 ? bit + 33 : bit + 1; - } -}; - -/** - * Return whether this value is zero. - * - * @return {Boolean} whether this value is zero. - * @api public - */ -Long.prototype.isZero = function() { - return this.high_ == 0 && this.low_ == 0; -}; - -/** - * Return whether this value is negative. - * - * @return {Boolean} whether this value is negative. - * @api public - */ -Long.prototype.isNegative = function() { - return this.high_ < 0; -}; - -/** - * Return whether this value is odd. - * - * @return {Boolean} whether this value is odd. - * @api public - */ -Long.prototype.isOdd = function() { - return (this.low_ & 1) == 1; -}; - -/** - * Return whether this Long equals the other - * - * @param {Long} other Long to compare against. - * @return {Boolean} whether this Long equals the other - * @api public - */ -Long.prototype.equals = function(other) { - return (this.high_ == other.high_) && (this.low_ == other.low_); -}; - -/** - * Return whether this Long does not equal the other. - * - * @param {Long} other Long to compare against. - * @return {Boolean} whether this Long does not equal the other. - * @api public - */ -Long.prototype.notEquals = function(other) { - return (this.high_ != other.high_) || (this.low_ != other.low_); -}; - -/** - * Return whether this Long is less than the other. - * - * @param {Long} other Long to compare against. - * @return {Boolean} whether this Long is less than the other. - * @api public - */ -Long.prototype.lessThan = function(other) { - return this.compare(other) < 0; -}; - -/** - * Return whether this Long is less than or equal to the other. - * - * @param {Long} other Long to compare against. - * @return {Boolean} whether this Long is less than or equal to the other. - * @api public - */ -Long.prototype.lessThanOrEqual = function(other) { - return this.compare(other) <= 0; -}; - -/** - * Return whether this Long is greater than the other. - * - * @param {Long} other Long to compare against. - * @return {Boolean} whether this Long is greater than the other. - * @api public - */ -Long.prototype.greaterThan = function(other) { - return this.compare(other) > 0; -}; - -/** - * Return whether this Long is greater than or equal to the other. - * - * @param {Long} other Long to compare against. - * @return {Boolean} whether this Long is greater than or equal to the other. - * @api public - */ -Long.prototype.greaterThanOrEqual = function(other) { - return this.compare(other) >= 0; -}; - -/** - * Compares this Long with the given one. - * - * @param {Long} other Long to compare against. - * @return {Boolean} 0 if they are the same, 1 if the this is greater, and -1 if the given one is greater. - * @api public - */ -Long.prototype.compare = function(other) { - if (this.equals(other)) { - return 0; - } - - var thisNeg = this.isNegative(); - var otherNeg = other.isNegative(); - if (thisNeg && !otherNeg) { - return -1; - } - if (!thisNeg && otherNeg) { - return 1; - } - - // at this point, the signs are the same, so subtraction will not overflow - if (this.subtract(other).isNegative()) { - return -1; - } else { - return 1; - } -}; - -/** - * The negation of this value. - * - * @return {Long} the negation of this value. - * @api public - */ -Long.prototype.negate = function() { - if (this.equals(Long.MIN_VALUE)) { - return Long.MIN_VALUE; - } else { - return this.not().add(Long.ONE); - } -}; - -/** - * Returns the sum of this and the given Long. - * - * @param {Long} other Long to add to this one. - * @return {Long} the sum of this and the given Long. - * @api public - */ -Long.prototype.add = function(other) { - // Divide each number into 4 chunks of 16 bits, and then sum the chunks. - - var a48 = this.high_ >>> 16; - var a32 = this.high_ & 0xFFFF; - var a16 = this.low_ >>> 16; - var a00 = this.low_ & 0xFFFF; - - var b48 = other.high_ >>> 16; - var b32 = other.high_ & 0xFFFF; - var b16 = other.low_ >>> 16; - var b00 = other.low_ & 0xFFFF; - - var c48 = 0, c32 = 0, c16 = 0, c00 = 0; - c00 += a00 + b00; - c16 += c00 >>> 16; - c00 &= 0xFFFF; - c16 += a16 + b16; - c32 += c16 >>> 16; - c16 &= 0xFFFF; - c32 += a32 + b32; - c48 += c32 >>> 16; - c32 &= 0xFFFF; - c48 += a48 + b48; - c48 &= 0xFFFF; - return Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32); -}; - -/** - * Returns the difference of this and the given Long. - * - * @param {Long} other Long to subtract from this. - * @return {Long} the difference of this and the given Long. - * @api public - */ -Long.prototype.subtract = function(other) { - return this.add(other.negate()); -}; - -/** - * Returns the product of this and the given Long. - * - * @param {Long} other Long to multiply with this. - * @return {Long} the product of this and the other. - * @api public - */ -Long.prototype.multiply = function(other) { - if (this.isZero()) { - return Long.ZERO; - } else if (other.isZero()) { - return Long.ZERO; - } - - if (this.equals(Long.MIN_VALUE)) { - return other.isOdd() ? Long.MIN_VALUE : Long.ZERO; - } else if (other.equals(Long.MIN_VALUE)) { - return this.isOdd() ? Long.MIN_VALUE : Long.ZERO; - } - - if (this.isNegative()) { - if (other.isNegative()) { - return this.negate().multiply(other.negate()); - } else { - return this.negate().multiply(other).negate(); - } - } else if (other.isNegative()) { - return this.multiply(other.negate()).negate(); - } - - // If both Longs are small, use float multiplication - if (this.lessThan(Long.TWO_PWR_24_) && - other.lessThan(Long.TWO_PWR_24_)) { - return Long.fromNumber(this.toNumber() * other.toNumber()); - } - - // Divide each Long into 4 chunks of 16 bits, and then add up 4x4 products. - // We can skip products that would overflow. - - var a48 = this.high_ >>> 16; - var a32 = this.high_ & 0xFFFF; - var a16 = this.low_ >>> 16; - var a00 = this.low_ & 0xFFFF; - - var b48 = other.high_ >>> 16; - var b32 = other.high_ & 0xFFFF; - var b16 = other.low_ >>> 16; - var b00 = other.low_ & 0xFFFF; - - var c48 = 0, c32 = 0, c16 = 0, c00 = 0; - c00 += a00 * b00; - c16 += c00 >>> 16; - c00 &= 0xFFFF; - c16 += a16 * b00; - c32 += c16 >>> 16; - c16 &= 0xFFFF; - c16 += a00 * b16; - c32 += c16 >>> 16; - c16 &= 0xFFFF; - c32 += a32 * b00; - c48 += c32 >>> 16; - c32 &= 0xFFFF; - c32 += a16 * b16; - c48 += c32 >>> 16; - c32 &= 0xFFFF; - c32 += a00 * b32; - c48 += c32 >>> 16; - c32 &= 0xFFFF; - c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48; - c48 &= 0xFFFF; - return Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32); -}; - -/** - * Returns this Long divided by the given one. - * - * @param {Long} other Long by which to divide. - * @return {Long} this Long divided by the given one. - * @api public - */ -Long.prototype.div = function(other) { - if (other.isZero()) { - throw Error('division by zero'); - } else if (this.isZero()) { - return Long.ZERO; - } - - if (this.equals(Long.MIN_VALUE)) { - if (other.equals(Long.ONE) || - other.equals(Long.NEG_ONE)) { - return Long.MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE - } else if (other.equals(Long.MIN_VALUE)) { - return Long.ONE; - } else { - // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|. - var halfThis = this.shiftRight(1); - var approx = halfThis.div(other).shiftLeft(1); - if (approx.equals(Long.ZERO)) { - return other.isNegative() ? Long.ONE : Long.NEG_ONE; - } else { - var rem = this.subtract(other.multiply(approx)); - var result = approx.add(rem.div(other)); - return result; - } - } - } else if (other.equals(Long.MIN_VALUE)) { - return Long.ZERO; - } - - if (this.isNegative()) { - if (other.isNegative()) { - return this.negate().div(other.negate()); - } else { - return this.negate().div(other).negate(); - } - } else if (other.isNegative()) { - return this.div(other.negate()).negate(); - } - - // Repeat the following until the remainder is less than other: find a - // floating-point that approximates remainder / other *from below*, add this - // into the result, and subtract it from the remainder. It is critical that - // the approximate value is less than or equal to the real value so that the - // remainder never becomes negative. - var res = Long.ZERO; - var rem = this; - while (rem.greaterThanOrEqual(other)) { - // Approximate the result of division. This may be a little greater or - // smaller than the actual value. - var approx = Math.max(1, Math.floor(rem.toNumber() / other.toNumber())); - - // We will tweak the approximate result by changing it in the 48-th digit or - // the smallest non-fractional digit, whichever is larger. - var log2 = Math.ceil(Math.log(approx) / Math.LN2); - var delta = (log2 <= 48) ? 1 : Math.pow(2, log2 - 48); - - // Decrease the approximation until it is smaller than the remainder. Note - // that if it is too large, the product overflows and is negative. - var approxRes = Long.fromNumber(approx); - var approxRem = approxRes.multiply(other); - while (approxRem.isNegative() || approxRem.greaterThan(rem)) { - approx -= delta; - approxRes = Long.fromNumber(approx); - approxRem = approxRes.multiply(other); - } - - // We know the answer can't be zero... and actually, zero would cause - // infinite recursion since we would make no progress. - if (approxRes.isZero()) { - approxRes = Long.ONE; - } - - res = res.add(approxRes); - rem = rem.subtract(approxRem); - } - return res; -}; - -/** - * Returns this Long modulo the given one. - * - * @param {Long} other Long by which to mod. - * @return {Long} this Long modulo the given one. - * @api public - */ -Long.prototype.modulo = function(other) { - return this.subtract(this.div(other).multiply(other)); -}; - -/** - * The bitwise-NOT of this value. - * - * @return {Long} the bitwise-NOT of this value. - * @api public - */ -Long.prototype.not = function() { - return Long.fromBits(~this.low_, ~this.high_); -}; - -/** - * Returns the bitwise-AND of this Long and the given one. - * - * @param {Long} other the Long with which to AND. - * @return {Long} the bitwise-AND of this and the other. - * @api public - */ -Long.prototype.and = function(other) { - return Long.fromBits(this.low_ & other.low_, this.high_ & other.high_); -}; - -/** - * Returns the bitwise-OR of this Long and the given one. - * - * @param {Long} other the Long with which to OR. - * @return {Long} the bitwise-OR of this and the other. - * @api public - */ -Long.prototype.or = function(other) { - return Long.fromBits(this.low_ | other.low_, this.high_ | other.high_); -}; - -/** - * Returns the bitwise-XOR of this Long and the given one. - * - * @param {Long} other the Long with which to XOR. - * @return {Long} the bitwise-XOR of this and the other. - * @api public - */ -Long.prototype.xor = function(other) { - return Long.fromBits(this.low_ ^ other.low_, this.high_ ^ other.high_); -}; - -/** - * Returns this Long with bits shifted to the left by the given amount. - * - * @param {Number} numBits the number of bits by which to shift. - * @return {Long} this shifted to the left by the given amount. - * @api public - */ -Long.prototype.shiftLeft = function(numBits) { - numBits &= 63; - if (numBits == 0) { - return this; - } else { - var low = this.low_; - if (numBits < 32) { - var high = this.high_; - return Long.fromBits( - low << numBits, - (high << numBits) | (low >>> (32 - numBits))); - } else { - return Long.fromBits(0, low << (numBits - 32)); - } - } -}; - -/** - * Returns this Long with bits shifted to the right by the given amount. - * - * @param {Number} numBits the number of bits by which to shift. - * @return {Long} this shifted to the right by the given amount. - * @api public - */ -Long.prototype.shiftRight = function(numBits) { - numBits &= 63; - if (numBits == 0) { - return this; - } else { - var high = this.high_; - if (numBits < 32) { - var low = this.low_; - return Long.fromBits( - (low >>> numBits) | (high << (32 - numBits)), - high >> numBits); - } else { - return Long.fromBits( - high >> (numBits - 32), - high >= 0 ? 0 : -1); - } - } -}; - -/** - * Returns this Long with bits shifted to the right by the given amount, with the new top bits matching the current sign bit. - * - * @param {Number} numBits the number of bits by which to shift. - * @return {Long} this shifted to the right by the given amount, with zeros placed into the new leading bits. - * @api public - */ -Long.prototype.shiftRightUnsigned = function(numBits) { - numBits &= 63; - if (numBits == 0) { - return this; - } else { - var high = this.high_; - if (numBits < 32) { - var low = this.low_; - return Long.fromBits( - (low >>> numBits) | (high << (32 - numBits)), - high >>> numBits); - } else if (numBits == 32) { - return Long.fromBits(high, 0); - } else { - return Long.fromBits(high >>> (numBits - 32), 0); - } - } -}; - -/** - * Returns a Long representing the given (32-bit) integer value. - * - * @param {Number} value the 32-bit integer in question. - * @return {Long} the corresponding Long value. - * @api public - */ -Long.fromInt = function(value) { - if (-128 <= value && value < 128) { - var cachedObj = Long.INT_CACHE_[value]; - if (cachedObj) { - return cachedObj; - } - } - - var obj = new Long(value | 0, value < 0 ? -1 : 0); - if (-128 <= value && value < 128) { - Long.INT_CACHE_[value] = obj; - } - return obj; -}; - -/** - * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned. - * - * @param {Number} value the number in question. - * @return {Long} the corresponding Long value. - * @api public - */ -Long.fromNumber = function(value) { - if (isNaN(value) || !isFinite(value)) { - return Long.ZERO; - } else if (value <= -Long.TWO_PWR_63_DBL_) { - return Long.MIN_VALUE; - } else if (value + 1 >= Long.TWO_PWR_63_DBL_) { - return Long.MAX_VALUE; - } else if (value < 0) { - return Long.fromNumber(-value).negate(); - } else { - return new Long( - (value % Long.TWO_PWR_32_DBL_) | 0, - (value / Long.TWO_PWR_32_DBL_) | 0); - } -}; - -/** - * Returns a Long representing the 64-bit integer that comes by concatenating the given high and low bits. Each is assumed to use 32 bits. - * - * @param {Number} lowBits the low 32-bits. - * @param {Number} highBits the high 32-bits. - * @return {Long} the corresponding Long value. - * @api public - */ -Long.fromBits = function(lowBits, highBits) { - return new Long(lowBits, highBits); -}; - -/** - * Returns a Long representation of the given string, written using the given radix. - * - * @param {String} str the textual representation of the Long. - * @param {Number} opt_radix the radix in which the text is written. - * @return {Long} the corresponding Long value. - * @api public - */ -Long.fromString = function(str, opt_radix) { - if (str.length == 0) { - throw Error('number format error: empty string'); - } - - var radix = opt_radix || 10; - if (radix < 2 || 36 < radix) { - throw Error('radix out of range: ' + radix); - } - - if (str.charAt(0) == '-') { - return Long.fromString(str.substring(1), radix).negate(); - } else if (str.indexOf('-') >= 0) { - throw Error('number format error: interior "-" character: ' + str); - } - - // Do several (8) digits each time through the loop, so as to - // minimize the calls to the very expensive emulated div. - var radixToPower = Long.fromNumber(Math.pow(radix, 8)); - - var result = Long.ZERO; - for (var i = 0; i < str.length; i += 8) { - var size = Math.min(8, str.length - i); - var value = parseInt(str.substring(i, i + size), radix); - if (size < 8) { - var power = Long.fromNumber(Math.pow(radix, size)); - result = result.multiply(power).add(Long.fromNumber(value)); - } else { - result = result.multiply(radixToPower); - result = result.add(Long.fromNumber(value)); - } - } - return result; -}; - -// NOTE: Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the -// from* methods on which they depend. - - -/** - * A cache of the Long representations of small integer values. - * @type {Object} - * @api private - */ -Long.INT_CACHE_ = {}; - -// NOTE: the compiler should inline these constant values below and then remove -// these variables, so there should be no runtime penalty for these. - -/** - * Number used repeated below in calculations. This must appear before the - * first call to any from* function below. - * @type {number} - * @api private - */ -Long.TWO_PWR_16_DBL_ = 1 << 16; - -/** - * @type {number} - * @api private - */ -Long.TWO_PWR_24_DBL_ = 1 << 24; - -/** - * @type {number} - * @api private - */ -Long.TWO_PWR_32_DBL_ = Long.TWO_PWR_16_DBL_ * Long.TWO_PWR_16_DBL_; - -/** - * @type {number} - * @api private - */ -Long.TWO_PWR_31_DBL_ = Long.TWO_PWR_32_DBL_ / 2; - -/** - * @type {number} - * @api private - */ -Long.TWO_PWR_48_DBL_ = Long.TWO_PWR_32_DBL_ * Long.TWO_PWR_16_DBL_; - -/** - * @type {number} - * @api private - */ -Long.TWO_PWR_64_DBL_ = Long.TWO_PWR_32_DBL_ * Long.TWO_PWR_32_DBL_; - -/** - * @type {number} - * @api private - */ -Long.TWO_PWR_63_DBL_ = Long.TWO_PWR_64_DBL_ / 2; - -/** @type {Long} */ -Long.ZERO = Long.fromInt(0); - -/** @type {Long} */ -Long.ONE = Long.fromInt(1); - -/** @type {Long} */ -Long.NEG_ONE = Long.fromInt(-1); - -/** @type {Long} */ -Long.MAX_VALUE = - Long.fromBits(0xFFFFFFFF | 0, 0x7FFFFFFF | 0); - -/** @type {Long} */ -Long.MIN_VALUE = Long.fromBits(0, 0x80000000 | 0); - -/** - * @type {Long} - * @api private - */ -Long.TWO_PWR_24_ = Long.fromInt(1 << 24); - -/** - * Expose. - */ -exports.Long = Long; \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/max_key.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/max_key.js deleted file mode 100644 index 0825408..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/max_key.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * A class representation of the BSON MaxKey type. - * - * @class Represents the BSON MaxKey type. - * @return {MaxKey} - */ -function MaxKey() { - if(!(this instanceof MaxKey)) return new MaxKey(); - - this._bsontype = 'MaxKey'; -} - -exports.MaxKey = MaxKey; \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/min_key.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/min_key.js deleted file mode 100644 index 230c2e6..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/min_key.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * A class representation of the BSON MinKey type. - * - * @class Represents the BSON MinKey type. - * @return {MinKey} - */ -function MinKey() { - if(!(this instanceof MinKey)) return new MinKey(); - - this._bsontype = 'MinKey'; -} - -exports.MinKey = MinKey; \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/objectid.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/objectid.js deleted file mode 100644 index 1ff9a83..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/objectid.js +++ /dev/null @@ -1,253 +0,0 @@ -/** - * Module dependencies. - */ -var BinaryParser = require('./binary_parser').BinaryParser; - -/** - * Machine id. - * - * Create a random 3-byte value (i.e. unique for this - * process). Other drivers use a md5 of the machine id here, but - * that would mean an asyc call to gethostname, so we don't bother. - */ -var MACHINE_ID = parseInt(Math.random() * 0xFFFFFF, 10); - -// Regular expression that checks for hex value -var checkForHexRegExp = new RegExp("^[0-9a-fA-F]{24}$"); - -/** -* Create a new ObjectID instance -* -* @class Represents the BSON ObjectID type -* @param {String|Number} id Can be a 24 byte hex string, 12 byte binary string or a Number. -* @return {Object} instance of ObjectID. -*/ -var ObjectID = function ObjectID(id, _hex) { - if(!(this instanceof ObjectID)) return new ObjectID(id, _hex); - - this._bsontype = 'ObjectID'; - var __id = null; - - // Throw an error if it's not a valid setup - if(id != null && 'number' != typeof id && (id.length != 12 && id.length != 24)) - throw new Error("Argument passed in must be a single String of 12 bytes or a string of 24 hex characters"); - - // Generate id based on the input - if(id == null || typeof id == 'number') { - // convert to 12 byte binary string - this.id = this.generate(id); - } else if(id != null && id.length === 12) { - // assume 12 byte string - this.id = id; - } else if(checkForHexRegExp.test(id)) { - return ObjectID.createFromHexString(id); - } else if(!checkForHexRegExp.test(id)) { - throw new Error("Value passed in is not a valid 24 character hex string"); - } - - if(ObjectID.cacheHexString) this.__id = this.toHexString(); -}; - -// Allow usage of ObjectId aswell as ObjectID -var ObjectId = ObjectID; - -/** -* Return the ObjectID id as a 24 byte hex string representation -* -* @return {String} return the 24 byte hex string representation. -* @api public -*/ -ObjectID.prototype.toHexString = function() { - if(ObjectID.cacheHexString && this.__id) return this.__id; - - var hexString = '' - , number - , value; - - for (var index = 0, len = this.id.length; index < len; index++) { - value = BinaryParser.toByte(this.id[index]); - number = value <= 15 - ? '0' + value.toString(16) - : value.toString(16); - hexString = hexString + number; - } - - if(ObjectID.cacheHexString) this.__id = hexString; - return hexString; -}; - -/** -* Update the ObjectID index used in generating new ObjectID's on the driver -* -* @return {Number} returns next index value. -* @api private -*/ -ObjectID.prototype.get_inc = function() { - return ObjectID.index = (ObjectID.index + 1) % 0xFFFFFF; -}; - -/** -* Update the ObjectID index used in generating new ObjectID's on the driver -* -* @return {Number} returns next index value. -* @api private -*/ -ObjectID.prototype.getInc = function() { - return this.get_inc(); -}; - -/** -* Generate a 12 byte id string used in ObjectID's -* -* @param {Number} [time] optional parameter allowing to pass in a second based timestamp. -* @return {String} return the 12 byte id binary string. -* @api private -*/ -ObjectID.prototype.generate = function(time) { - if ('number' == typeof time) { - var time4Bytes = BinaryParser.encodeInt(time, 32, true, true); - /* for time-based ObjectID the bytes following the time will be zeroed */ - var machine3Bytes = BinaryParser.encodeInt(MACHINE_ID, 24, false); - var pid2Bytes = BinaryParser.fromShort(typeof process === 'undefined' ? Math.floor(Math.random() * 100000) : process.pid); - var index3Bytes = BinaryParser.encodeInt(this.get_inc(), 24, false, true); - } else { - var unixTime = parseInt(Date.now()/1000,10); - var time4Bytes = BinaryParser.encodeInt(unixTime, 32, true, true); - var machine3Bytes = BinaryParser.encodeInt(MACHINE_ID, 24, false); - var pid2Bytes = BinaryParser.fromShort(typeof process === 'undefined' ? Math.floor(Math.random() * 100000) : process.pid); - var index3Bytes = BinaryParser.encodeInt(this.get_inc(), 24, false, true); - } - - return time4Bytes + machine3Bytes + pid2Bytes + index3Bytes; -}; - -/** -* Converts the id into a 24 byte hex string for printing -* -* @return {String} return the 24 byte hex string representation. -* @api private -*/ -ObjectID.prototype.toString = function() { - return this.toHexString(); -}; - -/** -* Converts to a string representation of this Id. -* -* @return {String} return the 24 byte hex string representation. -* @api private -*/ -ObjectID.prototype.inspect = ObjectID.prototype.toString; - -/** -* Converts to its JSON representation. -* -* @return {String} return the 24 byte hex string representation. -* @api private -*/ -ObjectID.prototype.toJSON = function() { - return this.toHexString(); -}; - -/** -* Compares the equality of this ObjectID with `otherID`. -* -* @param {Object} otherID ObjectID instance to compare against. -* @return {Bool} the result of comparing two ObjectID's -* @api public -*/ -ObjectID.prototype.equals = function equals (otherID) { - var id = (otherID instanceof ObjectID || otherID.toHexString) - ? otherID.id - : ObjectID.createFromHexString(otherID).id; - - return this.id === id; -} - -/** -* Returns the generation time in seconds that this ID was generated. -* -* @return {Number} return number of seconds in the timestamp part of the 12 byte id. -* @api public -*/ -ObjectID.prototype.getTimestamp = function() { - var timestamp = new Date(); - timestamp.setTime(Math.floor(BinaryParser.decodeInt(this.id.substring(0,4), 32, true, true)) * 1000); - return timestamp; -} - -/** -* @ignore -* @api private -*/ -ObjectID.index = 0; - -ObjectID.createPk = function createPk () { - return new ObjectID(); -}; - -/** -* Creates an ObjectID from a second based number, with the rest of the ObjectID zeroed out. Used for comparisons or sorting the ObjectID. -* -* @param {Number} time an integer number representing a number of seconds. -* @return {ObjectID} return the created ObjectID -* @api public -*/ -ObjectID.createFromTime = function createFromTime (time) { - var id = BinaryParser.encodeInt(time, 32, true, true) + - BinaryParser.encodeInt(0, 64, true, true); - return new ObjectID(id); -}; - -/** -* Creates an ObjectID from a hex string representation of an ObjectID. -* -* @param {String} hexString create a ObjectID from a passed in 24 byte hexstring. -* @return {ObjectID} return the created ObjectID -* @api public -*/ -ObjectID.createFromHexString = function createFromHexString (hexString) { - // Throw an error if it's not a valid setup - if(typeof hexString === 'undefined' || hexString != null && hexString.length != 24) - throw new Error("Argument passed in must be a single String of 12 bytes or a string of 24 hex characters"); - - var len = hexString.length; - - if(len > 12*2) { - throw new Error('Id cannot be longer than 12 bytes'); - } - - var result = '' - , string - , number; - - for (var index = 0; index < len; index += 2) { - string = hexString.substr(index, 2); - number = parseInt(string, 16); - result += BinaryParser.fromByte(number); - } - - return new ObjectID(result, hexString); -}; - -/** -* @ignore -*/ -Object.defineProperty(ObjectID.prototype, "generationTime", { - enumerable: true - , get: function () { - return Math.floor(BinaryParser.decodeInt(this.id.substring(0,4), 32, true, true)); - } - , set: function (value) { - var value = BinaryParser.encodeInt(value, 32, true, true); - this.id = value + this.id.substr(4); - // delete this.__id; - this.toHexString(); - } -}); - -/** - * Expose. - */ -exports.ObjectID = ObjectID; -exports.ObjectId = ObjectID; \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/symbol.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/symbol.js deleted file mode 100644 index 8e2838d..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/symbol.js +++ /dev/null @@ -1,48 +0,0 @@ -/** - * A class representation of the BSON Symbol type. - * - * @class Represents the BSON Symbol type. - * @param {String} value the string representing the symbol. - * @return {Symbol} - */ -function Symbol(value) { - if(!(this instanceof Symbol)) return new Symbol(value); - this._bsontype = 'Symbol'; - this.value = value; -} - -/** - * Access the wrapped string value. - * - * @return {String} returns the wrapped string. - * @api public - */ -Symbol.prototype.valueOf = function() { - return this.value; -}; - -/** - * @ignore - * @api private - */ -Symbol.prototype.toString = function() { - return this.value; -} - -/** - * @ignore - * @api private - */ -Symbol.prototype.inspect = function() { - return this.value; -} - -/** - * @ignore - * @api private - */ -Symbol.prototype.toJSON = function() { - return this.value; -} - -exports.Symbol = Symbol; \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/timestamp.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/timestamp.js deleted file mode 100644 index c650d15..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/timestamp.js +++ /dev/null @@ -1,853 +0,0 @@ -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// Copyright 2009 Google Inc. All Rights Reserved - -/** - * Defines a Timestamp class for representing a 64-bit two's-complement - * integer value, which faithfully simulates the behavior of a Java "Timestamp". This - * implementation is derived from TimestampLib in GWT. - * - * Constructs a 64-bit two's-complement integer, given its low and high 32-bit - * values as *signed* integers. See the from* functions below for more - * convenient ways of constructing Timestamps. - * - * The internal representation of a Timestamp is the two given signed, 32-bit values. - * We use 32-bit pieces because these are the size of integers on which - * Javascript performs bit-operations. For operations like addition and - * multiplication, we split each number into 16-bit pieces, which can easily be - * multiplied within Javascript's floating-point representation without overflow - * or change in sign. - * - * In the algorithms below, we frequently reduce the negative case to the - * positive case by negating the input(s) and then post-processing the result. - * Note that we must ALWAYS check specially whether those values are MIN_VALUE - * (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as - * a positive number, it overflows back into a negative). Not handling this - * case would often result in infinite recursion. - * - * @class Represents the BSON Timestamp type. - * @param {Number} low the low (signed) 32 bits of the Timestamp. - * @param {Number} high the high (signed) 32 bits of the Timestamp. - */ -function Timestamp(low, high) { - if(!(this instanceof Timestamp)) return new Timestamp(low, high); - this._bsontype = 'Timestamp'; - /** - * @type {number} - * @api private - */ - this.low_ = low | 0; // force into 32 signed bits. - - /** - * @type {number} - * @api private - */ - this.high_ = high | 0; // force into 32 signed bits. -}; - -/** - * Return the int value. - * - * @return {Number} the value, assuming it is a 32-bit integer. - * @api public - */ -Timestamp.prototype.toInt = function() { - return this.low_; -}; - -/** - * Return the Number value. - * - * @return {Number} the closest floating-point representation to this value. - * @api public - */ -Timestamp.prototype.toNumber = function() { - return this.high_ * Timestamp.TWO_PWR_32_DBL_ + - this.getLowBitsUnsigned(); -}; - -/** - * Return the JSON value. - * - * @return {String} the JSON representation. - * @api public - */ -Timestamp.prototype.toJSON = function() { - return this.toString(); -} - -/** - * Return the String value. - * - * @param {Number} [opt_radix] the radix in which the text should be written. - * @return {String} the textual representation of this value. - * @api public - */ -Timestamp.prototype.toString = function(opt_radix) { - var radix = opt_radix || 10; - if (radix < 2 || 36 < radix) { - throw Error('radix out of range: ' + radix); - } - - if (this.isZero()) { - return '0'; - } - - if (this.isNegative()) { - if (this.equals(Timestamp.MIN_VALUE)) { - // We need to change the Timestamp value before it can be negated, so we remove - // the bottom-most digit in this base and then recurse to do the rest. - var radixTimestamp = Timestamp.fromNumber(radix); - var div = this.div(radixTimestamp); - var rem = div.multiply(radixTimestamp).subtract(this); - return div.toString(radix) + rem.toInt().toString(radix); - } else { - return '-' + this.negate().toString(radix); - } - } - - // Do several (6) digits each time through the loop, so as to - // minimize the calls to the very expensive emulated div. - var radixToPower = Timestamp.fromNumber(Math.pow(radix, 6)); - - var rem = this; - var result = ''; - while (true) { - var remDiv = rem.div(radixToPower); - var intval = rem.subtract(remDiv.multiply(radixToPower)).toInt(); - var digits = intval.toString(radix); - - rem = remDiv; - if (rem.isZero()) { - return digits + result; - } else { - while (digits.length < 6) { - digits = '0' + digits; - } - result = '' + digits + result; - } - } -}; - -/** - * Return the high 32-bits value. - * - * @return {Number} the high 32-bits as a signed value. - * @api public - */ -Timestamp.prototype.getHighBits = function() { - return this.high_; -}; - -/** - * Return the low 32-bits value. - * - * @return {Number} the low 32-bits as a signed value. - * @api public - */ -Timestamp.prototype.getLowBits = function() { - return this.low_; -}; - -/** - * Return the low unsigned 32-bits value. - * - * @return {Number} the low 32-bits as an unsigned value. - * @api public - */ -Timestamp.prototype.getLowBitsUnsigned = function() { - return (this.low_ >= 0) ? - this.low_ : Timestamp.TWO_PWR_32_DBL_ + this.low_; -}; - -/** - * Returns the number of bits needed to represent the absolute value of this Timestamp. - * - * @return {Number} Returns the number of bits needed to represent the absolute value of this Timestamp. - * @api public - */ -Timestamp.prototype.getNumBitsAbs = function() { - if (this.isNegative()) { - if (this.equals(Timestamp.MIN_VALUE)) { - return 64; - } else { - return this.negate().getNumBitsAbs(); - } - } else { - var val = this.high_ != 0 ? this.high_ : this.low_; - for (var bit = 31; bit > 0; bit--) { - if ((val & (1 << bit)) != 0) { - break; - } - } - return this.high_ != 0 ? bit + 33 : bit + 1; - } -}; - -/** - * Return whether this value is zero. - * - * @return {Boolean} whether this value is zero. - * @api public - */ -Timestamp.prototype.isZero = function() { - return this.high_ == 0 && this.low_ == 0; -}; - -/** - * Return whether this value is negative. - * - * @return {Boolean} whether this value is negative. - * @api public - */ -Timestamp.prototype.isNegative = function() { - return this.high_ < 0; -}; - -/** - * Return whether this value is odd. - * - * @return {Boolean} whether this value is odd. - * @api public - */ -Timestamp.prototype.isOdd = function() { - return (this.low_ & 1) == 1; -}; - -/** - * Return whether this Timestamp equals the other - * - * @param {Timestamp} other Timestamp to compare against. - * @return {Boolean} whether this Timestamp equals the other - * @api public - */ -Timestamp.prototype.equals = function(other) { - return (this.high_ == other.high_) && (this.low_ == other.low_); -}; - -/** - * Return whether this Timestamp does not equal the other. - * - * @param {Timestamp} other Timestamp to compare against. - * @return {Boolean} whether this Timestamp does not equal the other. - * @api public - */ -Timestamp.prototype.notEquals = function(other) { - return (this.high_ != other.high_) || (this.low_ != other.low_); -}; - -/** - * Return whether this Timestamp is less than the other. - * - * @param {Timestamp} other Timestamp to compare against. - * @return {Boolean} whether this Timestamp is less than the other. - * @api public - */ -Timestamp.prototype.lessThan = function(other) { - return this.compare(other) < 0; -}; - -/** - * Return whether this Timestamp is less than or equal to the other. - * - * @param {Timestamp} other Timestamp to compare against. - * @return {Boolean} whether this Timestamp is less than or equal to the other. - * @api public - */ -Timestamp.prototype.lessThanOrEqual = function(other) { - return this.compare(other) <= 0; -}; - -/** - * Return whether this Timestamp is greater than the other. - * - * @param {Timestamp} other Timestamp to compare against. - * @return {Boolean} whether this Timestamp is greater than the other. - * @api public - */ -Timestamp.prototype.greaterThan = function(other) { - return this.compare(other) > 0; -}; - -/** - * Return whether this Timestamp is greater than or equal to the other. - * - * @param {Timestamp} other Timestamp to compare against. - * @return {Boolean} whether this Timestamp is greater than or equal to the other. - * @api public - */ -Timestamp.prototype.greaterThanOrEqual = function(other) { - return this.compare(other) >= 0; -}; - -/** - * Compares this Timestamp with the given one. - * - * @param {Timestamp} other Timestamp to compare against. - * @return {Boolean} 0 if they are the same, 1 if the this is greater, and -1 if the given one is greater. - * @api public - */ -Timestamp.prototype.compare = function(other) { - if (this.equals(other)) { - return 0; - } - - var thisNeg = this.isNegative(); - var otherNeg = other.isNegative(); - if (thisNeg && !otherNeg) { - return -1; - } - if (!thisNeg && otherNeg) { - return 1; - } - - // at this point, the signs are the same, so subtraction will not overflow - if (this.subtract(other).isNegative()) { - return -1; - } else { - return 1; - } -}; - -/** - * The negation of this value. - * - * @return {Timestamp} the negation of this value. - * @api public - */ -Timestamp.prototype.negate = function() { - if (this.equals(Timestamp.MIN_VALUE)) { - return Timestamp.MIN_VALUE; - } else { - return this.not().add(Timestamp.ONE); - } -}; - -/** - * Returns the sum of this and the given Timestamp. - * - * @param {Timestamp} other Timestamp to add to this one. - * @return {Timestamp} the sum of this and the given Timestamp. - * @api public - */ -Timestamp.prototype.add = function(other) { - // Divide each number into 4 chunks of 16 bits, and then sum the chunks. - - var a48 = this.high_ >>> 16; - var a32 = this.high_ & 0xFFFF; - var a16 = this.low_ >>> 16; - var a00 = this.low_ & 0xFFFF; - - var b48 = other.high_ >>> 16; - var b32 = other.high_ & 0xFFFF; - var b16 = other.low_ >>> 16; - var b00 = other.low_ & 0xFFFF; - - var c48 = 0, c32 = 0, c16 = 0, c00 = 0; - c00 += a00 + b00; - c16 += c00 >>> 16; - c00 &= 0xFFFF; - c16 += a16 + b16; - c32 += c16 >>> 16; - c16 &= 0xFFFF; - c32 += a32 + b32; - c48 += c32 >>> 16; - c32 &= 0xFFFF; - c48 += a48 + b48; - c48 &= 0xFFFF; - return Timestamp.fromBits((c16 << 16) | c00, (c48 << 16) | c32); -}; - -/** - * Returns the difference of this and the given Timestamp. - * - * @param {Timestamp} other Timestamp to subtract from this. - * @return {Timestamp} the difference of this and the given Timestamp. - * @api public - */ -Timestamp.prototype.subtract = function(other) { - return this.add(other.negate()); -}; - -/** - * Returns the product of this and the given Timestamp. - * - * @param {Timestamp} other Timestamp to multiply with this. - * @return {Timestamp} the product of this and the other. - * @api public - */ -Timestamp.prototype.multiply = function(other) { - if (this.isZero()) { - return Timestamp.ZERO; - } else if (other.isZero()) { - return Timestamp.ZERO; - } - - if (this.equals(Timestamp.MIN_VALUE)) { - return other.isOdd() ? Timestamp.MIN_VALUE : Timestamp.ZERO; - } else if (other.equals(Timestamp.MIN_VALUE)) { - return this.isOdd() ? Timestamp.MIN_VALUE : Timestamp.ZERO; - } - - if (this.isNegative()) { - if (other.isNegative()) { - return this.negate().multiply(other.negate()); - } else { - return this.negate().multiply(other).negate(); - } - } else if (other.isNegative()) { - return this.multiply(other.negate()).negate(); - } - - // If both Timestamps are small, use float multiplication - if (this.lessThan(Timestamp.TWO_PWR_24_) && - other.lessThan(Timestamp.TWO_PWR_24_)) { - return Timestamp.fromNumber(this.toNumber() * other.toNumber()); - } - - // Divide each Timestamp into 4 chunks of 16 bits, and then add up 4x4 products. - // We can skip products that would overflow. - - var a48 = this.high_ >>> 16; - var a32 = this.high_ & 0xFFFF; - var a16 = this.low_ >>> 16; - var a00 = this.low_ & 0xFFFF; - - var b48 = other.high_ >>> 16; - var b32 = other.high_ & 0xFFFF; - var b16 = other.low_ >>> 16; - var b00 = other.low_ & 0xFFFF; - - var c48 = 0, c32 = 0, c16 = 0, c00 = 0; - c00 += a00 * b00; - c16 += c00 >>> 16; - c00 &= 0xFFFF; - c16 += a16 * b00; - c32 += c16 >>> 16; - c16 &= 0xFFFF; - c16 += a00 * b16; - c32 += c16 >>> 16; - c16 &= 0xFFFF; - c32 += a32 * b00; - c48 += c32 >>> 16; - c32 &= 0xFFFF; - c32 += a16 * b16; - c48 += c32 >>> 16; - c32 &= 0xFFFF; - c32 += a00 * b32; - c48 += c32 >>> 16; - c32 &= 0xFFFF; - c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48; - c48 &= 0xFFFF; - return Timestamp.fromBits((c16 << 16) | c00, (c48 << 16) | c32); -}; - -/** - * Returns this Timestamp divided by the given one. - * - * @param {Timestamp} other Timestamp by which to divide. - * @return {Timestamp} this Timestamp divided by the given one. - * @api public - */ -Timestamp.prototype.div = function(other) { - if (other.isZero()) { - throw Error('division by zero'); - } else if (this.isZero()) { - return Timestamp.ZERO; - } - - if (this.equals(Timestamp.MIN_VALUE)) { - if (other.equals(Timestamp.ONE) || - other.equals(Timestamp.NEG_ONE)) { - return Timestamp.MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE - } else if (other.equals(Timestamp.MIN_VALUE)) { - return Timestamp.ONE; - } else { - // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|. - var halfThis = this.shiftRight(1); - var approx = halfThis.div(other).shiftLeft(1); - if (approx.equals(Timestamp.ZERO)) { - return other.isNegative() ? Timestamp.ONE : Timestamp.NEG_ONE; - } else { - var rem = this.subtract(other.multiply(approx)); - var result = approx.add(rem.div(other)); - return result; - } - } - } else if (other.equals(Timestamp.MIN_VALUE)) { - return Timestamp.ZERO; - } - - if (this.isNegative()) { - if (other.isNegative()) { - return this.negate().div(other.negate()); - } else { - return this.negate().div(other).negate(); - } - } else if (other.isNegative()) { - return this.div(other.negate()).negate(); - } - - // Repeat the following until the remainder is less than other: find a - // floating-point that approximates remainder / other *from below*, add this - // into the result, and subtract it from the remainder. It is critical that - // the approximate value is less than or equal to the real value so that the - // remainder never becomes negative. - var res = Timestamp.ZERO; - var rem = this; - while (rem.greaterThanOrEqual(other)) { - // Approximate the result of division. This may be a little greater or - // smaller than the actual value. - var approx = Math.max(1, Math.floor(rem.toNumber() / other.toNumber())); - - // We will tweak the approximate result by changing it in the 48-th digit or - // the smallest non-fractional digit, whichever is larger. - var log2 = Math.ceil(Math.log(approx) / Math.LN2); - var delta = (log2 <= 48) ? 1 : Math.pow(2, log2 - 48); - - // Decrease the approximation until it is smaller than the remainder. Note - // that if it is too large, the product overflows and is negative. - var approxRes = Timestamp.fromNumber(approx); - var approxRem = approxRes.multiply(other); - while (approxRem.isNegative() || approxRem.greaterThan(rem)) { - approx -= delta; - approxRes = Timestamp.fromNumber(approx); - approxRem = approxRes.multiply(other); - } - - // We know the answer can't be zero... and actually, zero would cause - // infinite recursion since we would make no progress. - if (approxRes.isZero()) { - approxRes = Timestamp.ONE; - } - - res = res.add(approxRes); - rem = rem.subtract(approxRem); - } - return res; -}; - -/** - * Returns this Timestamp modulo the given one. - * - * @param {Timestamp} other Timestamp by which to mod. - * @return {Timestamp} this Timestamp modulo the given one. - * @api public - */ -Timestamp.prototype.modulo = function(other) { - return this.subtract(this.div(other).multiply(other)); -}; - -/** - * The bitwise-NOT of this value. - * - * @return {Timestamp} the bitwise-NOT of this value. - * @api public - */ -Timestamp.prototype.not = function() { - return Timestamp.fromBits(~this.low_, ~this.high_); -}; - -/** - * Returns the bitwise-AND of this Timestamp and the given one. - * - * @param {Timestamp} other the Timestamp with which to AND. - * @return {Timestamp} the bitwise-AND of this and the other. - * @api public - */ -Timestamp.prototype.and = function(other) { - return Timestamp.fromBits(this.low_ & other.low_, this.high_ & other.high_); -}; - -/** - * Returns the bitwise-OR of this Timestamp and the given one. - * - * @param {Timestamp} other the Timestamp with which to OR. - * @return {Timestamp} the bitwise-OR of this and the other. - * @api public - */ -Timestamp.prototype.or = function(other) { - return Timestamp.fromBits(this.low_ | other.low_, this.high_ | other.high_); -}; - -/** - * Returns the bitwise-XOR of this Timestamp and the given one. - * - * @param {Timestamp} other the Timestamp with which to XOR. - * @return {Timestamp} the bitwise-XOR of this and the other. - * @api public - */ -Timestamp.prototype.xor = function(other) { - return Timestamp.fromBits(this.low_ ^ other.low_, this.high_ ^ other.high_); -}; - -/** - * Returns this Timestamp with bits shifted to the left by the given amount. - * - * @param {Number} numBits the number of bits by which to shift. - * @return {Timestamp} this shifted to the left by the given amount. - * @api public - */ -Timestamp.prototype.shiftLeft = function(numBits) { - numBits &= 63; - if (numBits == 0) { - return this; - } else { - var low = this.low_; - if (numBits < 32) { - var high = this.high_; - return Timestamp.fromBits( - low << numBits, - (high << numBits) | (low >>> (32 - numBits))); - } else { - return Timestamp.fromBits(0, low << (numBits - 32)); - } - } -}; - -/** - * Returns this Timestamp with bits shifted to the right by the given amount. - * - * @param {Number} numBits the number of bits by which to shift. - * @return {Timestamp} this shifted to the right by the given amount. - * @api public - */ -Timestamp.prototype.shiftRight = function(numBits) { - numBits &= 63; - if (numBits == 0) { - return this; - } else { - var high = this.high_; - if (numBits < 32) { - var low = this.low_; - return Timestamp.fromBits( - (low >>> numBits) | (high << (32 - numBits)), - high >> numBits); - } else { - return Timestamp.fromBits( - high >> (numBits - 32), - high >= 0 ? 0 : -1); - } - } -}; - -/** - * Returns this Timestamp with bits shifted to the right by the given amount, with the new top bits matching the current sign bit. - * - * @param {Number} numBits the number of bits by which to shift. - * @return {Timestamp} this shifted to the right by the given amount, with zeros placed into the new leading bits. - * @api public - */ -Timestamp.prototype.shiftRightUnsigned = function(numBits) { - numBits &= 63; - if (numBits == 0) { - return this; - } else { - var high = this.high_; - if (numBits < 32) { - var low = this.low_; - return Timestamp.fromBits( - (low >>> numBits) | (high << (32 - numBits)), - high >>> numBits); - } else if (numBits == 32) { - return Timestamp.fromBits(high, 0); - } else { - return Timestamp.fromBits(high >>> (numBits - 32), 0); - } - } -}; - -/** - * Returns a Timestamp representing the given (32-bit) integer value. - * - * @param {Number} value the 32-bit integer in question. - * @return {Timestamp} the corresponding Timestamp value. - * @api public - */ -Timestamp.fromInt = function(value) { - if (-128 <= value && value < 128) { - var cachedObj = Timestamp.INT_CACHE_[value]; - if (cachedObj) { - return cachedObj; - } - } - - var obj = new Timestamp(value | 0, value < 0 ? -1 : 0); - if (-128 <= value && value < 128) { - Timestamp.INT_CACHE_[value] = obj; - } - return obj; -}; - -/** - * Returns a Timestamp representing the given value, provided that it is a finite number. Otherwise, zero is returned. - * - * @param {Number} value the number in question. - * @return {Timestamp} the corresponding Timestamp value. - * @api public - */ -Timestamp.fromNumber = function(value) { - if (isNaN(value) || !isFinite(value)) { - return Timestamp.ZERO; - } else if (value <= -Timestamp.TWO_PWR_63_DBL_) { - return Timestamp.MIN_VALUE; - } else if (value + 1 >= Timestamp.TWO_PWR_63_DBL_) { - return Timestamp.MAX_VALUE; - } else if (value < 0) { - return Timestamp.fromNumber(-value).negate(); - } else { - return new Timestamp( - (value % Timestamp.TWO_PWR_32_DBL_) | 0, - (value / Timestamp.TWO_PWR_32_DBL_) | 0); - } -}; - -/** - * Returns a Timestamp representing the 64-bit integer that comes by concatenating the given high and low bits. Each is assumed to use 32 bits. - * - * @param {Number} lowBits the low 32-bits. - * @param {Number} highBits the high 32-bits. - * @return {Timestamp} the corresponding Timestamp value. - * @api public - */ -Timestamp.fromBits = function(lowBits, highBits) { - return new Timestamp(lowBits, highBits); -}; - -/** - * Returns a Timestamp representation of the given string, written using the given radix. - * - * @param {String} str the textual representation of the Timestamp. - * @param {Number} opt_radix the radix in which the text is written. - * @return {Timestamp} the corresponding Timestamp value. - * @api public - */ -Timestamp.fromString = function(str, opt_radix) { - if (str.length == 0) { - throw Error('number format error: empty string'); - } - - var radix = opt_radix || 10; - if (radix < 2 || 36 < radix) { - throw Error('radix out of range: ' + radix); - } - - if (str.charAt(0) == '-') { - return Timestamp.fromString(str.substring(1), radix).negate(); - } else if (str.indexOf('-') >= 0) { - throw Error('number format error: interior "-" character: ' + str); - } - - // Do several (8) digits each time through the loop, so as to - // minimize the calls to the very expensive emulated div. - var radixToPower = Timestamp.fromNumber(Math.pow(radix, 8)); - - var result = Timestamp.ZERO; - for (var i = 0; i < str.length; i += 8) { - var size = Math.min(8, str.length - i); - var value = parseInt(str.substring(i, i + size), radix); - if (size < 8) { - var power = Timestamp.fromNumber(Math.pow(radix, size)); - result = result.multiply(power).add(Timestamp.fromNumber(value)); - } else { - result = result.multiply(radixToPower); - result = result.add(Timestamp.fromNumber(value)); - } - } - return result; -}; - -// NOTE: Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the -// from* methods on which they depend. - - -/** - * A cache of the Timestamp representations of small integer values. - * @type {Object} - * @api private - */ -Timestamp.INT_CACHE_ = {}; - -// NOTE: the compiler should inline these constant values below and then remove -// these variables, so there should be no runtime penalty for these. - -/** - * Number used repeated below in calculations. This must appear before the - * first call to any from* function below. - * @type {number} - * @api private - */ -Timestamp.TWO_PWR_16_DBL_ = 1 << 16; - -/** - * @type {number} - * @api private - */ -Timestamp.TWO_PWR_24_DBL_ = 1 << 24; - -/** - * @type {number} - * @api private - */ -Timestamp.TWO_PWR_32_DBL_ = Timestamp.TWO_PWR_16_DBL_ * Timestamp.TWO_PWR_16_DBL_; - -/** - * @type {number} - * @api private - */ -Timestamp.TWO_PWR_31_DBL_ = Timestamp.TWO_PWR_32_DBL_ / 2; - -/** - * @type {number} - * @api private - */ -Timestamp.TWO_PWR_48_DBL_ = Timestamp.TWO_PWR_32_DBL_ * Timestamp.TWO_PWR_16_DBL_; - -/** - * @type {number} - * @api private - */ -Timestamp.TWO_PWR_64_DBL_ = Timestamp.TWO_PWR_32_DBL_ * Timestamp.TWO_PWR_32_DBL_; - -/** - * @type {number} - * @api private - */ -Timestamp.TWO_PWR_63_DBL_ = Timestamp.TWO_PWR_64_DBL_ / 2; - -/** @type {Timestamp} */ -Timestamp.ZERO = Timestamp.fromInt(0); - -/** @type {Timestamp} */ -Timestamp.ONE = Timestamp.fromInt(1); - -/** @type {Timestamp} */ -Timestamp.NEG_ONE = Timestamp.fromInt(-1); - -/** @type {Timestamp} */ -Timestamp.MAX_VALUE = - Timestamp.fromBits(0xFFFFFFFF | 0, 0x7FFFFFFF | 0); - -/** @type {Timestamp} */ -Timestamp.MIN_VALUE = Timestamp.fromBits(0, 0x80000000 | 0); - -/** - * @type {Timestamp} - * @api private - */ -Timestamp.TWO_PWR_24_ = Timestamp.fromInt(1 << 24); - -/** - * Expose. - */ -exports.Timestamp = Timestamp; \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/package.json b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/package.json deleted file mode 100644 index c832fb8..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "bson", - "description": "A bson parser for node.js and the browser", - "keywords": [ - "mongodb", - "bson", - "parser" - ], - "version": "0.1.8", - "author": { - "name": "Christian Amor Kvalheim", - "email": "christkv@gmail.com" - }, - "contributors": [], - "repository": { - "type": "git", - "url": "git://github.com/mongodb/js-bson.git" - }, - "bugs": { - "mail": "node-mongodb-native@googlegroups.com", - "url": "https://github.com/mongodb/js-bson/issues" - }, - "devDependencies": { - "nodeunit": "0.7.3", - "gleak": "0.2.3", - "one": "latest" - }, - "config": { - "native": false - }, - "main": "./lib/bson/index", - "directories": { - "lib": "./lib/bson" - }, - "engines": { - "node": ">=0.6.19" - }, - "scripts": { - "install": "(node-gyp rebuild 2> builderror.log) || (exit 0)", - "test": "nodeunit ./test/node && TEST_NATIVE=TRUE nodeunit ./test/node" - }, - "licenses": [ - { - "type": "Apache License, Version 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - ], - "readme": "A JS/C++ Bson parser for node, used in the MongoDB Native driver", - "_id": "bson@0.1.8", - "_from": "bson@0.1.8" -} diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/browser/browser_example.htm b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/browser/browser_example.htm deleted file mode 100644 index 4ee148b..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/browser/browser_example.htm +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/browser/bson_test.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/browser/bson_test.js deleted file mode 100644 index 84d8ffc..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/browser/bson_test.js +++ /dev/null @@ -1,260 +0,0 @@ -this.bson_test = { - 'Full document serialization and deserialization': function (test) { - var motherOfAllDocuments = { - 'string': "客家话", - 'array': [1,2,3], - 'hash': {'a':1, 'b':2}, - 'date': new Date(), - 'oid': new ObjectID(), - 'binary': new Binary('hello world'), - 'int': 42, - 'float': 33.3333, - 'regexp': /regexp/, - 'boolean': true, - 'long': Long.fromNumber(100), - 'where': new Code('this.a > i', {i:1}), - 'dbref': new DBRef('namespace', new ObjectID(), 'integration_tests_'), - 'minkey': new MinKey(), - 'maxkey': new MaxKey() - } - - // Let's serialize it - var data = BSON.serialize(motherOfAllDocuments, true, true, false); - // Deserialize the object - var object = BSON.deserialize(data); - - // Asserts - test.equal(Utf8.decode(motherOfAllDocuments.string), object.string); - test.deepEqual(motherOfAllDocuments.array, object.array); - test.deepEqual(motherOfAllDocuments.date, object.date); - test.deepEqual(motherOfAllDocuments.oid.toHexString(), object.oid.toHexString()); - test.deepEqual(motherOfAllDocuments.binary.length(), object.binary.length()); - test.ok(assertArrayEqual(motherOfAllDocuments.binary.value(true), object.binary.value(true))); - test.deepEqual(motherOfAllDocuments.int, object.int); - test.deepEqual(motherOfAllDocuments.float, object.float); - test.deepEqual(motherOfAllDocuments.regexp, object.regexp); - test.deepEqual(motherOfAllDocuments.boolean, object.boolean); - test.deepEqual(motherOfAllDocuments.long.toNumber(), object.long); - test.deepEqual(motherOfAllDocuments.where, object.where); - test.deepEqual(motherOfAllDocuments.dbref.oid.toHexString(), object.dbref.oid.toHexString()); - test.deepEqual(motherOfAllDocuments.dbref.namespace, object.dbref.namespace); - test.deepEqual(motherOfAllDocuments.dbref.db, object.dbref.db); - test.deepEqual(motherOfAllDocuments.minkey, object.minkey); - test.deepEqual(motherOfAllDocuments.maxkey, object.maxkey); - test.done(); - }, - - 'exercise all the binary object constructor methods': function (test) { - // Construct using array - var string = 'hello world'; - // String to array - var array = stringToArrayBuffer(string); - - // Binary from array buffer - var binary = new Binary(stringToArrayBuffer(string)); - test.ok(string.length, binary.buffer.length); - test.ok(assertArrayEqual(array, binary.buffer)); - - // Construct using number of chars - binary = new Binary(5); - test.ok(5, binary.buffer.length); - - // Construct using an Array - var binary = new Binary(stringToArray(string)); - test.ok(string.length, binary.buffer.length); - test.ok(assertArrayEqual(array, binary.buffer)); - - // Construct using a string - var binary = new Binary(string); - test.ok(string.length, binary.buffer.length); - test.ok(assertArrayEqual(array, binary.buffer)); - test.done(); - }, - - 'exercise the put binary object method for an instance when using Uint8Array': function (test) { - // Construct using array - var string = 'hello world'; - // String to array - var array = stringToArrayBuffer(string + 'a'); - - // Binary from array buffer - var binary = new Binary(stringToArrayBuffer(string)); - test.ok(string.length, binary.buffer.length); - - // Write a byte to the array - binary.put('a') - - // Verify that the data was writtencorrectly - test.equal(string.length + 1, binary.position); - test.ok(assertArrayEqual(array, binary.value(true))); - test.equal('hello worlda', binary.value()); - - // Exercise a binary with lots of space in the buffer - var binary = new Binary(); - test.ok(Binary.BUFFER_SIZE, binary.buffer.length); - - // Write a byte to the array - binary.put('a') - - // Verify that the data was writtencorrectly - test.equal(1, binary.position); - test.ok(assertArrayEqual(['a'.charCodeAt(0)], binary.value(true))); - test.equal('a', binary.value()); - test.done(); - }, - - 'exercise the write binary object method for an instance when using Uint8Array': function (test) { - // Construct using array - var string = 'hello world'; - // Array - var writeArrayBuffer = new Uint8Array(new ArrayBuffer(1)); - writeArrayBuffer[0] = 'a'.charCodeAt(0); - var arrayBuffer = ['a'.charCodeAt(0)]; - - // Binary from array buffer - var binary = new Binary(stringToArrayBuffer(string)); - test.ok(string.length, binary.buffer.length); - - // Write a string starting at end of buffer - binary.write('a'); - test.equal('hello worlda', binary.value()); - // Write a string starting at index 0 - binary.write('a', 0); - test.equal('aello worlda', binary.value()); - // Write a arraybuffer starting at end of buffer - binary.write(writeArrayBuffer); - test.equal('aello worldaa', binary.value()); - // Write a arraybuffer starting at position 5 - binary.write(writeArrayBuffer, 5); - test.equal('aelloaworldaa', binary.value()); - // Write a array starting at end of buffer - binary.write(arrayBuffer); - test.equal('aelloaworldaaa', binary.value()); - // Write a array starting at position 6 - binary.write(arrayBuffer, 6); - test.equal('aelloaaorldaaa', binary.value()); - test.done(); - }, - - 'exercise the read binary object method for an instance when using Uint8Array': function (test) { - // Construct using array - var string = 'hello world'; - var array = stringToArrayBuffer(string); - - // Binary from array buffer - var binary = new Binary(stringToArrayBuffer(string)); - test.ok(string.length, binary.buffer.length); - - // Read the first 2 bytes - var data = binary.read(0, 2); - test.ok(assertArrayEqual(stringToArrayBuffer('he'), data)); - - // Read the entire field - var data = binary.read(0); - test.ok(assertArrayEqual(stringToArrayBuffer(string), data)); - - // Read 3 bytes - var data = binary.read(6, 5); - test.ok(assertArrayEqual(stringToArrayBuffer('world'), data)); - test.done(); - }, - - 'Should correctly handle toBson function for an object': function(test) { - // Test object - var doc = { - hello: new ObjectID(), - a:1 - }; - // Add a toBson method to the object - doc.toBSON = function() { - return {b:1}; - } - - // Serialize the data - var serialized_data = BSON.serialize(doc, false, true); - var deserialized_doc = BSON.deserialize(serialized_data); - test.equal(1, deserialized_doc.b); - test.done(); - } -}; - -var assertArrayEqual = function(array1, array2) { - if(array1.length != array2.length) return false; - for(var i = 0; i < array1.length; i++) { - if(array1[i] != array2[i]) return false; - } - - return true; -} - -// String to arraybuffer -var stringToArrayBuffer = function(string) { - var dataBuffer = new Uint8Array(new ArrayBuffer(string.length)); - // Return the strings - for(var i = 0; i < string.length; i++) { - dataBuffer[i] = string.charCodeAt(i); - } - // Return the data buffer - return dataBuffer; -} - -// String to arraybuffer -var stringToArray = function(string) { - var dataBuffer = new Array(string.length); - // Return the strings - for(var i = 0; i < string.length; i++) { - dataBuffer[i] = string.charCodeAt(i); - } - // Return the data buffer - return dataBuffer; -} - -var Utf8 = { - // public method for url encoding - encode : function (string) { - string = string.replace(/\r\n/g,"\n"); - var utftext = ""; - - for (var n = 0; n < string.length; n++) { - var c = string.charCodeAt(n); - if (c < 128) { - utftext += String.fromCharCode(c); - } else if((c > 127) && (c < 2048)) { - utftext += String.fromCharCode((c >> 6) | 192); - utftext += String.fromCharCode((c & 63) | 128); - } else { - utftext += String.fromCharCode((c >> 12) | 224); - utftext += String.fromCharCode(((c >> 6) & 63) | 128); - utftext += String.fromCharCode((c & 63) | 128); - } - - } - - return utftext; - }, - - // public method for url decoding - decode : function (utftext) { - var string = ""; - var i = 0; - var c = c1 = c2 = 0; - - while ( i < utftext.length ) { - c = utftext.charCodeAt(i); - if(c < 128) { - string += String.fromCharCode(c); - i++; - } else if((c > 191) && (c < 224)) { - c2 = utftext.charCodeAt(i+1); - string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); - i += 2; - } else { - c2 = utftext.charCodeAt(i+1); - c3 = utftext.charCodeAt(i+2); - string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); - i += 3; - } - } - return string; - } -} diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/browser/nodeunit.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/browser/nodeunit.js deleted file mode 100644 index af7fd0b..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/browser/nodeunit.js +++ /dev/null @@ -1,2034 +0,0 @@ -/*! - * Nodeunit - * https://github.com/caolan/nodeunit - * Copyright (c) 2010 Caolan McMahon - * MIT Licensed - * - * json2.js - * http://www.JSON.org/json2.js - * Public Domain. - * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. - */ -nodeunit = (function(){ -/* - http://www.JSON.org/json2.js - 2010-11-17 - - Public Domain. - - NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. - - See http://www.JSON.org/js.html - - - This code should be minified before deployment. - See http://javascript.crockford.com/jsmin.html - - USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO - NOT CONTROL. - - - This file creates a global JSON object containing two methods: stringify - and parse. - - JSON.stringify(value, replacer, space) - value any JavaScript value, usually an object or array. - - replacer an optional parameter that determines how object - values are stringified for objects. It can be a - function or an array of strings. - - space an optional parameter that specifies the indentation - of nested structures. If it is omitted, the text will - be packed without extra whitespace. If it is a number, - it will specify the number of spaces to indent at each - level. If it is a string (such as '\t' or ' '), - it contains the characters used to indent at each level. - - This method produces a JSON text from a JavaScript value. - - When an object value is found, if the object contains a toJSON - method, its toJSON method will be called and the result will be - stringified. A toJSON method does not serialize: it returns the - value represented by the name/value pair that should be serialized, - or undefined if nothing should be serialized. The toJSON method - will be passed the key associated with the value, and this will be - bound to the value - - For example, this would serialize Dates as ISO strings. - - Date.prototype.toJSON = function (key) { - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - return this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z'; - }; - - You can provide an optional replacer method. It will be passed the - key and value of each member, with this bound to the containing - object. The value that is returned from your method will be - serialized. If your method returns undefined, then the member will - be excluded from the serialization. - - If the replacer parameter is an array of strings, then it will be - used to select the members to be serialized. It filters the results - such that only members with keys listed in the replacer array are - stringified. - - Values that do not have JSON representations, such as undefined or - functions, will not be serialized. Such values in objects will be - dropped; in arrays they will be replaced with null. You can use - a replacer function to replace those with JSON values. - JSON.stringify(undefined) returns undefined. - - The optional space parameter produces a stringification of the - value that is filled with line breaks and indentation to make it - easier to read. - - If the space parameter is a non-empty string, then that string will - be used for indentation. If the space parameter is a number, then - the indentation will be that many spaces. - - Example: - - text = JSON.stringify(['e', {pluribus: 'unum'}]); - // text is '["e",{"pluribus":"unum"}]' - - - text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); - // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' - - text = JSON.stringify([new Date()], function (key, value) { - return this[key] instanceof Date ? - 'Date(' + this[key] + ')' : value; - }); - // text is '["Date(---current time---)"]' - - - JSON.parse(text, reviver) - This method parses a JSON text to produce an object or array. - It can throw a SyntaxError exception. - - The optional reviver parameter is a function that can filter and - transform the results. It receives each of the keys and values, - and its return value is used instead of the original value. - If it returns what it received, then the structure is not modified. - If it returns undefined then the member is deleted. - - Example: - - // Parse the text. Values that look like ISO date strings will - // be converted to Date objects. - - myData = JSON.parse(text, function (key, value) { - var a; - if (typeof value === 'string') { - a = -/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); - if (a) { - return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], - +a[5], +a[6])); - } - } - return value; - }); - - myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { - var d; - if (typeof value === 'string' && - value.slice(0, 5) === 'Date(' && - value.slice(-1) === ')') { - d = new Date(value.slice(5, -1)); - if (d) { - return d; - } - } - return value; - }); - - - This is a reference implementation. You are free to copy, modify, or - redistribute. -*/ - -/*jslint evil: true, strict: false, regexp: false */ - -/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, - call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, - getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, - lastIndex, length, parse, prototype, push, replace, slice, stringify, - test, toJSON, toString, valueOf -*/ - - -// Create a JSON object only if one does not already exist. We create the -// methods in a closure to avoid creating global variables. - -var JSON = {}; - -(function () { - "use strict"; - - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - if (typeof Date.prototype.toJSON !== 'function') { - - Date.prototype.toJSON = function (key) { - - return isFinite(this.valueOf()) ? - this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z' : null; - }; - - String.prototype.toJSON = - Number.prototype.toJSON = - Boolean.prototype.toJSON = function (key) { - return this.valueOf(); - }; - } - - var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - gap, - indent, - meta = { // table of character substitutions - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '"' : '\\"', - '\\': '\\\\' - }, - rep; - - - function quote(string) { - -// If the string contains no control characters, no quote characters, and no -// backslash characters, then we can safely slap some quotes around it. -// Otherwise we must also replace the offending characters with safe escape -// sequences. - - escapable.lastIndex = 0; - return escapable.test(string) ? - '"' + string.replace(escapable, function (a) { - var c = meta[a]; - return typeof c === 'string' ? c : - '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }) + '"' : - '"' + string + '"'; - } - - - function str(key, holder) { - -// Produce a string from holder[key]. - - var i, // The loop counter. - k, // The member key. - v, // The member value. - length, - mind = gap, - partial, - value = holder[key]; - -// If the value has a toJSON method, call it to obtain a replacement value. - - if (value && typeof value === 'object' && - typeof value.toJSON === 'function') { - value = value.toJSON(key); - } - -// If we were called with a replacer function, then call the replacer to -// obtain a replacement value. - - if (typeof rep === 'function') { - value = rep.call(holder, key, value); - } - -// What happens next depends on the value's type. - - switch (typeof value) { - case 'string': - return quote(value); - - case 'number': - -// JSON numbers must be finite. Encode non-finite numbers as null. - - return isFinite(value) ? String(value) : 'null'; - - case 'boolean': - case 'null': - -// If the value is a boolean or null, convert it to a string. Note: -// typeof null does not produce 'null'. The case is included here in -// the remote chance that this gets fixed someday. - - return String(value); - -// If the type is 'object', we might be dealing with an object or an array or -// null. - - case 'object': - -// Due to a specification blunder in ECMAScript, typeof null is 'object', -// so watch out for that case. - - if (!value) { - return 'null'; - } - -// Make an array to hold the partial results of stringifying this object value. - - gap += indent; - partial = []; - -// Is the value an array? - - if (Object.prototype.toString.apply(value) === '[object Array]') { - -// The value is an array. Stringify every element. Use null as a placeholder -// for non-JSON values. - - length = value.length; - for (i = 0; i < length; i += 1) { - partial[i] = str(i, value) || 'null'; - } - -// Join all of the elements together, separated with commas, and wrap them in -// brackets. - - v = partial.length === 0 ? '[]' : - gap ? '[\n' + gap + - partial.join(',\n' + gap) + '\n' + - mind + ']' : - '[' + partial.join(',') + ']'; - gap = mind; - return v; - } - -// If the replacer is an array, use it to select the members to be stringified. - - if (rep && typeof rep === 'object') { - length = rep.length; - for (i = 0; i < length; i += 1) { - k = rep[i]; - if (typeof k === 'string') { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } else { - -// Otherwise, iterate through all of the keys in the object. - - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } - -// Join all of the member texts together, separated with commas, -// and wrap them in braces. - - v = partial.length === 0 ? '{}' : - gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + - mind + '}' : '{' + partial.join(',') + '}'; - gap = mind; - return v; - } - } - -// If the JSON object does not yet have a stringify method, give it one. - - if (typeof JSON.stringify !== 'function') { - JSON.stringify = function (value, replacer, space) { - -// The stringify method takes a value and an optional replacer, and an optional -// space parameter, and returns a JSON text. The replacer can be a function -// that can replace values, or an array of strings that will select the keys. -// A default replacer method can be provided. Use of the space parameter can -// produce text that is more easily readable. - - var i; - gap = ''; - indent = ''; - -// If the space parameter is a number, make an indent string containing that -// many spaces. - - if (typeof space === 'number') { - for (i = 0; i < space; i += 1) { - indent += ' '; - } - -// If the space parameter is a string, it will be used as the indent string. - - } else if (typeof space === 'string') { - indent = space; - } - -// If there is a replacer, it must be a function or an array. -// Otherwise, throw an error. - - rep = replacer; - if (replacer && typeof replacer !== 'function' && - (typeof replacer !== 'object' || - typeof replacer.length !== 'number')) { - throw new Error('JSON.stringify'); - } - -// Make a fake root object containing our value under the key of ''. -// Return the result of stringifying the value. - - return str('', {'': value}); - }; - } - - -// If the JSON object does not yet have a parse method, give it one. - - if (typeof JSON.parse !== 'function') { - JSON.parse = function (text, reviver) { - -// The parse method takes a text and an optional reviver function, and returns -// a JavaScript value if the text is a valid JSON text. - - var j; - - function walk(holder, key) { - -// The walk method is used to recursively walk the resulting structure so -// that modifications can be made. - - var k, v, value = holder[key]; - if (value && typeof value === 'object') { - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = walk(value, k); - if (v !== undefined) { - value[k] = v; - } else { - delete value[k]; - } - } - } - } - return reviver.call(holder, key, value); - } - - -// Parsing happens in four stages. In the first stage, we replace certain -// Unicode characters with escape sequences. JavaScript handles many characters -// incorrectly, either silently deleting them, or treating them as line endings. - - text = String(text); - cx.lastIndex = 0; - if (cx.test(text)) { - text = text.replace(cx, function (a) { - return '\\u' + - ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }); - } - -// In the second stage, we run the text against regular expressions that look -// for non-JSON patterns. We are especially concerned with '()' and 'new' -// because they can cause invocation, and '=' because it can cause mutation. -// But just to be safe, we want to reject all unexpected forms. - -// We split the second stage into 4 regexp operations in order to work around -// crippling inefficiencies in IE's and Safari's regexp engines. First we -// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we -// replace all simple value tokens with ']' characters. Third, we delete all -// open brackets that follow a colon or comma or that begin the text. Finally, -// we look to see that the remaining characters are only whitespace or ']' or -// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. - - if (/^[\],:{}\s]*$/ -.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') -.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') -.replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { - -// In the third stage we use the eval function to compile the text into a -// JavaScript structure. The '{' operator is subject to a syntactic ambiguity -// in JavaScript: it can begin a block or an object literal. We wrap the text -// in parens to eliminate the ambiguity. - - j = eval('(' + text + ')'); - -// In the optional fourth stage, we recursively walk the new structure, passing -// each name/value pair to a reviver function for possible transformation. - - return typeof reviver === 'function' ? - walk({'': j}, '') : j; - } - -// If the text is not JSON parseable, then a SyntaxError is thrown. - - throw new SyntaxError('JSON.parse'); - }; - } -}()); -var assert = this.assert = {}; -var types = {}; -var core = {}; -var nodeunit = {}; -var reporter = {}; -/*global setTimeout: false, console: false */ -(function () { - - var async = {}; - - // global on the server, window in the browser - var root = this, - previous_async = root.async; - - if (typeof module !== 'undefined' && module.exports) { - module.exports = async; - } - else { - root.async = async; - } - - async.noConflict = function () { - root.async = previous_async; - return async; - }; - - //// cross-browser compatiblity functions //// - - var _forEach = function (arr, iterator) { - if (arr.forEach) { - return arr.forEach(iterator); - } - for (var i = 0; i < arr.length; i += 1) { - iterator(arr[i], i, arr); - } - }; - - var _map = function (arr, iterator) { - if (arr.map) { - return arr.map(iterator); - } - var results = []; - _forEach(arr, function (x, i, a) { - results.push(iterator(x, i, a)); - }); - return results; - }; - - var _reduce = function (arr, iterator, memo) { - if (arr.reduce) { - return arr.reduce(iterator, memo); - } - _forEach(arr, function (x, i, a) { - memo = iterator(memo, x, i, a); - }); - return memo; - }; - - var _keys = function (obj) { - if (Object.keys) { - return Object.keys(obj); - } - var keys = []; - for (var k in obj) { - if (obj.hasOwnProperty(k)) { - keys.push(k); - } - } - return keys; - }; - - var _indexOf = function (arr, item) { - if (arr.indexOf) { - return arr.indexOf(item); - } - for (var i = 0; i < arr.length; i += 1) { - if (arr[i] === item) { - return i; - } - } - return -1; - }; - - //// exported async module functions //// - - //// nextTick implementation with browser-compatible fallback //// - if (typeof process === 'undefined' || !(process.nextTick)) { - async.nextTick = function (fn) { - setTimeout(fn, 0); - }; - } - else { - async.nextTick = process.nextTick; - } - - async.forEach = function (arr, iterator, callback) { - if (!arr.length) { - return callback(); - } - var completed = 0; - _forEach(arr, function (x) { - iterator(x, function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - if (completed === arr.length) { - callback(); - } - } - }); - }); - }; - - async.forEachSeries = function (arr, iterator, callback) { - if (!arr.length) { - return callback(); - } - var completed = 0; - var iterate = function () { - iterator(arr[completed], function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - if (completed === arr.length) { - callback(); - } - else { - iterate(); - } - } - }); - }; - iterate(); - }; - - - var doParallel = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [async.forEach].concat(args)); - }; - }; - var doSeries = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [async.forEachSeries].concat(args)); - }; - }; - - - var _asyncMap = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (err, v) { - results[x.index] = v; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - }; - async.map = doParallel(_asyncMap); - async.mapSeries = doSeries(_asyncMap); - - - // reduce only has a series version, as doing reduce in parallel won't - // work in many situations. - async.reduce = function (arr, memo, iterator, callback) { - async.forEachSeries(arr, function (x, callback) { - iterator(memo, x, function (err, v) { - memo = v; - callback(err); - }); - }, function (err) { - callback(err, memo); - }); - }; - // inject alias - async.inject = async.reduce; - // foldl alias - async.foldl = async.reduce; - - async.reduceRight = function (arr, memo, iterator, callback) { - var reversed = _map(arr, function (x) { - return x; - }).reverse(); - async.reduce(reversed, memo, iterator, callback); - }; - // foldr alias - async.foldr = async.reduceRight; - - var _filter = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (v) { - if (v) { - results.push(x); - } - callback(); - }); - }, function (err) { - callback(_map(results.sort(function (a, b) { - return a.index - b.index; - }), function (x) { - return x.value; - })); - }); - }; - async.filter = doParallel(_filter); - async.filterSeries = doSeries(_filter); - // select alias - async.select = async.filter; - async.selectSeries = async.filterSeries; - - var _reject = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (v) { - if (!v) { - results.push(x); - } - callback(); - }); - }, function (err) { - callback(_map(results.sort(function (a, b) { - return a.index - b.index; - }), function (x) { - return x.value; - })); - }); - }; - async.reject = doParallel(_reject); - async.rejectSeries = doSeries(_reject); - - var _detect = function (eachfn, arr, iterator, main_callback) { - eachfn(arr, function (x, callback) { - iterator(x, function (result) { - if (result) { - main_callback(x); - } - else { - callback(); - } - }); - }, function (err) { - main_callback(); - }); - }; - async.detect = doParallel(_detect); - async.detectSeries = doSeries(_detect); - - async.some = function (arr, iterator, main_callback) { - async.forEach(arr, function (x, callback) { - iterator(x, function (v) { - if (v) { - main_callback(true); - main_callback = function () {}; - } - callback(); - }); - }, function (err) { - main_callback(false); - }); - }; - // any alias - async.any = async.some; - - async.every = function (arr, iterator, main_callback) { - async.forEach(arr, function (x, callback) { - iterator(x, function (v) { - if (!v) { - main_callback(false); - main_callback = function () {}; - } - callback(); - }); - }, function (err) { - main_callback(true); - }); - }; - // all alias - async.all = async.every; - - async.sortBy = function (arr, iterator, callback) { - async.map(arr, function (x, callback) { - iterator(x, function (err, criteria) { - if (err) { - callback(err); - } - else { - callback(null, {value: x, criteria: criteria}); - } - }); - }, function (err, results) { - if (err) { - return callback(err); - } - else { - var fn = function (left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }; - callback(null, _map(results.sort(fn), function (x) { - return x.value; - })); - } - }); - }; - - async.auto = function (tasks, callback) { - callback = callback || function () {}; - var keys = _keys(tasks); - if (!keys.length) { - return callback(null); - } - - var completed = []; - - var listeners = []; - var addListener = function (fn) { - listeners.unshift(fn); - }; - var removeListener = function (fn) { - for (var i = 0; i < listeners.length; i += 1) { - if (listeners[i] === fn) { - listeners.splice(i, 1); - return; - } - } - }; - var taskComplete = function () { - _forEach(listeners, function (fn) { - fn(); - }); - }; - - addListener(function () { - if (completed.length === keys.length) { - callback(null); - } - }); - - _forEach(keys, function (k) { - var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k]; - var taskCallback = function (err) { - if (err) { - callback(err); - // stop subsequent errors hitting callback multiple times - callback = function () {}; - } - else { - completed.push(k); - taskComplete(); - } - }; - var requires = task.slice(0, Math.abs(task.length - 1)) || []; - var ready = function () { - return _reduce(requires, function (a, x) { - return (a && _indexOf(completed, x) !== -1); - }, true); - }; - if (ready()) { - task[task.length - 1](taskCallback); - } - else { - var listener = function () { - if (ready()) { - removeListener(listener); - task[task.length - 1](taskCallback); - } - }; - addListener(listener); - } - }); - }; - - async.waterfall = function (tasks, callback) { - if (!tasks.length) { - return callback(); - } - callback = callback || function () {}; - var wrapIterator = function (iterator) { - return function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - var args = Array.prototype.slice.call(arguments, 1); - var next = iterator.next(); - if (next) { - args.push(wrapIterator(next)); - } - else { - args.push(callback); - } - async.nextTick(function () { - iterator.apply(null, args); - }); - } - }; - }; - wrapIterator(async.iterator(tasks))(); - }; - - async.parallel = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - async.map(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args || null); - }); - } - }, callback); - } - else { - var results = {}; - async.forEach(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.series = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - async.mapSeries(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args || null); - }); - } - }, callback); - } - else { - var results = {}; - async.forEachSeries(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.iterator = function (tasks) { - var makeCallback = function (index) { - var fn = function () { - if (tasks.length) { - tasks[index].apply(null, arguments); - } - return fn.next(); - }; - fn.next = function () { - return (index < tasks.length - 1) ? makeCallback(index + 1): null; - }; - return fn; - }; - return makeCallback(0); - }; - - async.apply = function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - return function () { - return fn.apply( - null, args.concat(Array.prototype.slice.call(arguments)) - ); - }; - }; - - var _concat = function (eachfn, arr, fn, callback) { - var r = []; - eachfn(arr, function (x, cb) { - fn(x, function (err, y) { - r = r.concat(y || []); - cb(err); - }); - }, function (err) { - callback(err, r); - }); - }; - async.concat = doParallel(_concat); - async.concatSeries = doSeries(_concat); - - async.whilst = function (test, iterator, callback) { - if (test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.whilst(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.until = function (test, iterator, callback) { - if (!test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.until(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.queue = function (worker, concurrency) { - var workers = 0; - var tasks = []; - var q = { - concurrency: concurrency, - push: function (data, callback) { - tasks.push({data: data, callback: callback}); - async.nextTick(q.process); - }, - process: function () { - if (workers < q.concurrency && tasks.length) { - var task = tasks.splice(0, 1)[0]; - workers += 1; - worker(task.data, function () { - workers -= 1; - if (task.callback) { - task.callback.apply(task, arguments); - } - q.process(); - }); - } - }, - length: function () { - return tasks.length; - } - }; - return q; - }; - - var _console_fn = function (name) { - return function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - fn.apply(null, args.concat([function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (typeof console !== 'undefined') { - if (err) { - if (console.error) { - console.error(err); - } - } - else if (console[name]) { - _forEach(args, function (x) { - console[name](x); - }); - } - } - }])); - }; - }; - async.log = _console_fn('log'); - async.dir = _console_fn('dir'); - /*async.info = _console_fn('info'); - async.warn = _console_fn('warn'); - async.error = _console_fn('error');*/ - - async.memoize = function (fn, hasher) { - var memo = {}; - hasher = hasher || function (x) { - return x; - }; - return function () { - var args = Array.prototype.slice.call(arguments); - var callback = args.pop(); - var key = hasher.apply(null, args); - if (key in memo) { - callback.apply(null, memo[key]); - } - else { - fn.apply(null, args.concat([function () { - memo[key] = arguments; - callback.apply(null, arguments); - }])); - } - }; - }; - -}()); -(function(exports){ -/** - * This file is based on the node.js assert module, but with some small - * changes for browser-compatibility - * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! - */ - - -/** - * Added for browser compatibility - */ - -var _keys = function(obj){ - if(Object.keys) return Object.keys(obj); - if (typeof obj != 'object' && typeof obj != 'function') { - throw new TypeError('-'); - } - var keys = []; - for(var k in obj){ - if(obj.hasOwnProperty(k)) keys.push(k); - } - return keys; -}; - - - -// http://wiki.commonjs.org/wiki/Unit_Testing/1.0 -// -// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! -// -// Originally from narwhal.js (http://narwhaljs.org) -// Copyright (c) 2009 Thomas Robinson <280north.com> -// -// 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 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. - - -var pSlice = Array.prototype.slice; - -// 1. The assert module provides functions that throw -// AssertionError's when particular conditions are not met. The -// assert module must conform to the following interface. - -var assert = exports; - -// 2. The AssertionError is defined in assert. -// new assert.AssertionError({message: message, actual: actual, expected: expected}) - -assert.AssertionError = function AssertionError (options) { - this.name = "AssertionError"; - this.message = options.message; - this.actual = options.actual; - this.expected = options.expected; - this.operator = options.operator; - var stackStartFunction = options.stackStartFunction || fail; - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, stackStartFunction); - } -}; -// code from util.inherits in node -assert.AssertionError.super_ = Error; - - -// EDITED FOR BROWSER COMPATIBILITY: replaced Object.create call -// TODO: test what effect this may have -var ctor = function () { this.constructor = assert.AssertionError; }; -ctor.prototype = Error.prototype; -assert.AssertionError.prototype = new ctor(); - - -assert.AssertionError.prototype.toString = function() { - if (this.message) { - return [this.name+":", this.message].join(' '); - } else { - return [ this.name+":" - , JSON.stringify(this.expected ) - , this.operator - , JSON.stringify(this.actual) - ].join(" "); - } -}; - -// assert.AssertionError instanceof Error - -assert.AssertionError.__proto__ = Error.prototype; - -// At present only the three keys mentioned above are used and -// understood by the spec. Implementations or sub modules can pass -// other keys to the AssertionError's constructor - they will be -// ignored. - -// 3. All of the following functions must throw an AssertionError -// when a corresponding condition is not met, with a message that -// may be undefined if not provided. All assertion methods provide -// both the actual and expected values to the assertion error for -// display purposes. - -function fail(actual, expected, message, operator, stackStartFunction) { - throw new assert.AssertionError({ - message: message, - actual: actual, - expected: expected, - operator: operator, - stackStartFunction: stackStartFunction - }); -} - -// EXTENSION! allows for well behaved errors defined elsewhere. -assert.fail = fail; - -// 4. Pure assertion tests whether a value is truthy, as determined -// by !!guard. -// assert.ok(guard, message_opt); -// This statement is equivalent to assert.equal(true, guard, -// message_opt);. To test strictly for the value true, use -// assert.strictEqual(true, guard, message_opt);. - -assert.ok = function ok(value, message) { - if (!!!value) fail(value, true, message, "==", assert.ok); -}; - -// 5. The equality assertion tests shallow, coercive equality with -// ==. -// assert.equal(actual, expected, message_opt); - -assert.equal = function equal(actual, expected, message) { - if (actual != expected) fail(actual, expected, message, "==", assert.equal); -}; - -// 6. The non-equality assertion tests for whether two objects are not equal -// with != assert.notEqual(actual, expected, message_opt); - -assert.notEqual = function notEqual(actual, expected, message) { - if (actual == expected) { - fail(actual, expected, message, "!=", assert.notEqual); - } -}; - -// 7. The equivalence assertion tests a deep equality relation. -// assert.deepEqual(actual, expected, message_opt); - -assert.deepEqual = function deepEqual(actual, expected, message) { - if (!_deepEqual(actual, expected)) { - fail(actual, expected, message, "deepEqual", assert.deepEqual); - } -}; - -function _deepEqual(actual, expected) { - // 7.1. All identical values are equivalent, as determined by ===. - if (actual === expected) { - return true; - // 7.2. If the expected value is a Date object, the actual value is - // equivalent if it is also a Date object that refers to the same time. - } else if (actual instanceof Date && expected instanceof Date) { - return actual.getTime() === expected.getTime(); - - // 7.3. Other pairs that do not both pass typeof value == "object", - // equivalence is determined by ==. - } else if (typeof actual != 'object' && typeof expected != 'object') { - return actual == expected; - - // 7.4. For all other Object pairs, including Array objects, equivalence is - // determined by having the same number of owned properties (as verified - // with Object.prototype.hasOwnProperty.call), the same set of keys - // (although not necessarily the same order), equivalent values for every - // corresponding key, and an identical "prototype" property. Note: this - // accounts for both named and indexed properties on Arrays. - } else { - return objEquiv(actual, expected); - } -} - -function isUndefinedOrNull (value) { - return value === null || value === undefined; -} - -function isArguments (object) { - return Object.prototype.toString.call(object) == '[object Arguments]'; -} - -function objEquiv (a, b) { - if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) - return false; - // an identical "prototype" property. - if (a.prototype !== b.prototype) return false; - //~~~I've managed to break Object.keys through screwy arguments passing. - // Converting to array solves the problem. - if (isArguments(a)) { - if (!isArguments(b)) { - return false; - } - a = pSlice.call(a); - b = pSlice.call(b); - return _deepEqual(a, b); - } - try{ - var ka = _keys(a), - kb = _keys(b), - key, i; - } catch (e) {//happens when one is a string literal and the other isn't - return false; - } - // having the same number of owned properties (keys incorporates hasOwnProperty) - if (ka.length != kb.length) - return false; - //the same set of keys (although not necessarily the same order), - ka.sort(); - kb.sort(); - //~~~cheap key test - for (i = ka.length - 1; i >= 0; i--) { - if (ka[i] != kb[i]) - return false; - } - //equivalent values for every corresponding key, and - //~~~possibly expensive deep test - for (i = ka.length - 1; i >= 0; i--) { - key = ka[i]; - if (!_deepEqual(a[key], b[key] )) - return false; - } - return true; -} - -// 8. The non-equivalence assertion tests for any deep inequality. -// assert.notDeepEqual(actual, expected, message_opt); - -assert.notDeepEqual = function notDeepEqual(actual, expected, message) { - if (_deepEqual(actual, expected)) { - fail(actual, expected, message, "notDeepEqual", assert.notDeepEqual); - } -}; - -// 9. The strict equality assertion tests strict equality, as determined by ===. -// assert.strictEqual(actual, expected, message_opt); - -assert.strictEqual = function strictEqual(actual, expected, message) { - if (actual !== expected) { - fail(actual, expected, message, "===", assert.strictEqual); - } -}; - -// 10. The strict non-equality assertion tests for strict inequality, as determined by !==. -// assert.notStrictEqual(actual, expected, message_opt); - -assert.notStrictEqual = function notStrictEqual(actual, expected, message) { - if (actual === expected) { - fail(actual, expected, message, "!==", assert.notStrictEqual); - } -}; - -function _throws (shouldThrow, block, err, message) { - var exception = null, - threw = false, - typematters = true; - - message = message || ""; - - //handle optional arguments - if (arguments.length == 3) { - if (typeof(err) == "string") { - message = err; - typematters = false; - } - } else if (arguments.length == 2) { - typematters = false; - } - - try { - block(); - } catch (e) { - threw = true; - exception = e; - } - - if (shouldThrow && !threw) { - fail( "Missing expected exception" - + (err && err.name ? " ("+err.name+")." : '.') - + (message ? " " + message : "") - ); - } - if (!shouldThrow && threw && typematters && exception instanceof err) { - fail( "Got unwanted exception" - + (err && err.name ? " ("+err.name+")." : '.') - + (message ? " " + message : "") - ); - } - if ((shouldThrow && threw && typematters && !(exception instanceof err)) || - (!shouldThrow && threw)) { - throw exception; - } -}; - -// 11. Expected to throw an error: -// assert.throws(block, Error_opt, message_opt); - -assert.throws = function(block, /*optional*/error, /*optional*/message) { - _throws.apply(this, [true].concat(pSlice.call(arguments))); -}; - -// EXTENSION! This is annoying to write outside this module. -assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) { - _throws.apply(this, [false].concat(pSlice.call(arguments))); -}; - -assert.ifError = function (err) { if (err) {throw err;}}; -})(assert); -(function(exports){ -/*! - * Nodeunit - * Copyright (c) 2010 Caolan McMahon - * MIT Licensed - * - * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! - * You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build. - * Only code on that line will be removed, its mostly to avoid requiring code - * that is node specific - */ - -/** - * Module dependencies - */ - -//var assert = require('./assert'), //@REMOVE_LINE_FOR_BROWSER -// async = require('../deps/async'); //@REMOVE_LINE_FOR_BROWSER - - -/** - * Creates assertion objects representing the result of an assert call. - * Accepts an object or AssertionError as its argument. - * - * @param {object} obj - * @api public - */ - -exports.assertion = function (obj) { - return { - method: obj.method || '', - message: obj.message || (obj.error && obj.error.message) || '', - error: obj.error, - passed: function () { - return !this.error; - }, - failed: function () { - return Boolean(this.error); - } - }; -}; - -/** - * Creates an assertion list object representing a group of assertions. - * Accepts an array of assertion objects. - * - * @param {Array} arr - * @param {Number} duration - * @api public - */ - -exports.assertionList = function (arr, duration) { - var that = arr || []; - that.failures = function () { - var failures = 0; - for (var i = 0; i < this.length; i += 1) { - if (this[i].failed()) { - failures += 1; - } - } - return failures; - }; - that.passes = function () { - return that.length - that.failures(); - }; - that.duration = duration || 0; - return that; -}; - -/** - * Create a wrapper function for assert module methods. Executes a callback - * after the it's complete with an assertion object representing the result. - * - * @param {Function} callback - * @api private - */ - -var assertWrapper = function (callback) { - return function (new_method, assert_method, arity) { - return function () { - var message = arguments[arity - 1]; - var a = exports.assertion({method: new_method, message: message}); - try { - assert[assert_method].apply(null, arguments); - } - catch (e) { - a.error = e; - } - callback(a); - }; - }; -}; - -/** - * Creates the 'test' object that gets passed to every test function. - * Accepts the name of the test function as its first argument, followed by - * the start time in ms, the options object and a callback function. - * - * @param {String} name - * @param {Number} start - * @param {Object} options - * @param {Function} callback - * @api public - */ - -exports.test = function (name, start, options, callback) { - var expecting; - var a_list = []; - - var wrapAssert = assertWrapper(function (a) { - a_list.push(a); - if (options.log) { - async.nextTick(function () { - options.log(a); - }); - } - }); - - var test = { - done: function (err) { - if (expecting !== undefined && expecting !== a_list.length) { - var e = new Error( - 'Expected ' + expecting + ' assertions, ' + - a_list.length + ' ran' - ); - var a1 = exports.assertion({method: 'expect', error: e}); - a_list.push(a1); - if (options.log) { - async.nextTick(function () { - options.log(a1); - }); - } - } - if (err) { - var a2 = exports.assertion({error: err}); - a_list.push(a2); - if (options.log) { - async.nextTick(function () { - options.log(a2); - }); - } - } - var end = new Date().getTime(); - async.nextTick(function () { - var assertion_list = exports.assertionList(a_list, end - start); - options.testDone(name, assertion_list); - callback(null, a_list); - }); - }, - ok: wrapAssert('ok', 'ok', 2), - same: wrapAssert('same', 'deepEqual', 3), - equals: wrapAssert('equals', 'equal', 3), - expect: function (num) { - expecting = num; - }, - _assertion_list: a_list - }; - // add all functions from the assert module - for (var k in assert) { - if (assert.hasOwnProperty(k)) { - test[k] = wrapAssert(k, k, assert[k].length); - } - } - return test; -}; - -/** - * Ensures an options object has all callbacks, adding empty callback functions - * if any are missing. - * - * @param {Object} opt - * @return {Object} - * @api public - */ - -exports.options = function (opt) { - var optionalCallback = function (name) { - opt[name] = opt[name] || function () {}; - }; - - optionalCallback('moduleStart'); - optionalCallback('moduleDone'); - optionalCallback('testStart'); - optionalCallback('testDone'); - //optionalCallback('log'); - - // 'done' callback is not optional. - - return opt; -}; -})(types); -(function(exports){ -/*! - * Nodeunit - * Copyright (c) 2010 Caolan McMahon - * MIT Licensed - * - * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! - * You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build. - * Only code on that line will be removed, its mostly to avoid requiring code - * that is node specific - */ - -/** - * Module dependencies - */ - -//var async = require('../deps/async'), //@REMOVE_LINE_FOR_BROWSER -// types = require('./types'); //@REMOVE_LINE_FOR_BROWSER - - -/** - * Added for browser compatibility - */ - -var _keys = function (obj) { - if (Object.keys) { - return Object.keys(obj); - } - var keys = []; - for (var k in obj) { - if (obj.hasOwnProperty(k)) { - keys.push(k); - } - } - return keys; -}; - - -var _copy = function (obj) { - var nobj = {}; - var keys = _keys(obj); - for (var i = 0; i < keys.length; i += 1) { - nobj[keys[i]] = obj[keys[i]]; - } - return nobj; -}; - - -/** - * Runs a test function (fn) from a loaded module. After the test function - * calls test.done(), the callback is executed with an assertionList as its - * second argument. - * - * @param {String} name - * @param {Function} fn - * @param {Object} opt - * @param {Function} callback - * @api public - */ - -exports.runTest = function (name, fn, opt, callback) { - var options = types.options(opt); - - options.testStart(name); - var start = new Date().getTime(); - var test = types.test(name, start, options, callback); - - try { - fn(test); - } - catch (e) { - test.done(e); - } -}; - -/** - * Takes an object containing test functions or other test suites as properties - * and runs each in series. After all tests have completed, the callback is - * called with a list of all assertions as the second argument. - * - * If a name is passed to this function it is prepended to all test and suite - * names that run within it. - * - * @param {String} name - * @param {Object} suite - * @param {Object} opt - * @param {Function} callback - * @api public - */ - -exports.runSuite = function (name, suite, opt, callback) { - var keys = _keys(suite); - - async.concatSeries(keys, function (k, cb) { - var prop = suite[k], _name; - - _name = name ? [].concat(name, k) : [k]; - - _name.toString = function () { - // fallback for old one - return this.join(' - '); - }; - - if (typeof prop === 'function') { - var in_name = false; - for (var i = 0; i < _name.length; i += 1) { - if (_name[i] === opt.testspec) { - in_name = true; - } - } - if (!opt.testspec || in_name) { - if (opt.moduleStart) { - opt.moduleStart(); - } - exports.runTest(_name, suite[k], opt, cb); - } - else { - return cb(); - } - } - else { - exports.runSuite(_name, suite[k], opt, cb); - } - }, callback); -}; - -/** - * Run each exported test function or test suite from a loaded module. - * - * @param {String} name - * @param {Object} mod - * @param {Object} opt - * @param {Function} callback - * @api public - */ - -exports.runModule = function (name, mod, opt, callback) { - var options = _copy(types.options(opt)); - - var _run = false; - var _moduleStart = options.moduleStart; - function run_once() { - if (!_run) { - _run = true; - _moduleStart(name); - } - } - options.moduleStart = run_once; - - var start = new Date().getTime(); - - exports.runSuite(null, mod, options, function (err, a_list) { - var end = new Date().getTime(); - var assertion_list = types.assertionList(a_list, end - start); - options.moduleDone(name, assertion_list); - callback(null, a_list); - }); -}; - -/** - * Treats an object literal as a list of modules keyed by name. Runs each - * module and finished with calling 'done'. You can think of this as a browser - * safe alternative to runFiles in the nodeunit module. - * - * @param {Object} modules - * @param {Object} opt - * @api public - */ - -// TODO: add proper unit tests for this function -exports.runModules = function (modules, opt) { - var all_assertions = []; - var options = types.options(opt); - var start = new Date().getTime(); - - async.concatSeries(_keys(modules), function (k, cb) { - exports.runModule(k, modules[k], options, cb); - }, - function (err, all_assertions) { - var end = new Date().getTime(); - options.done(types.assertionList(all_assertions, end - start)); - }); -}; - - -/** - * Wraps a test function with setUp and tearDown functions. - * Used by testCase. - * - * @param {Function} setUp - * @param {Function} tearDown - * @param {Function} fn - * @api private - */ - -var wrapTest = function (setUp, tearDown, fn) { - return function (test) { - var context = {}; - if (tearDown) { - var done = test.done; - test.done = function (err) { - try { - tearDown.call(context, function (err2) { - if (err && err2) { - test._assertion_list.push( - types.assertion({error: err}) - ); - return done(err2); - } - done(err || err2); - }); - } - catch (e) { - done(e); - } - }; - } - if (setUp) { - setUp.call(context, function (err) { - if (err) { - return test.done(err); - } - fn.call(context, test); - }); - } - else { - fn.call(context, test); - } - }; -}; - - -/** - * Wraps a group of tests with setUp and tearDown functions. - * Used by testCase. - * - * @param {Function} setUp - * @param {Function} tearDown - * @param {Object} group - * @api private - */ - -var wrapGroup = function (setUp, tearDown, group) { - var tests = {}; - var keys = _keys(group); - for (var i = 0; i < keys.length; i += 1) { - var k = keys[i]; - if (typeof group[k] === 'function') { - tests[k] = wrapTest(setUp, tearDown, group[k]); - } - else if (typeof group[k] === 'object') { - tests[k] = wrapGroup(setUp, tearDown, group[k]); - } - } - return tests; -}; - - -/** - * Utility for wrapping a suite of test functions with setUp and tearDown - * functions. - * - * @param {Object} suite - * @return {Object} - * @api public - */ - -exports.testCase = function (suite) { - var setUp = suite.setUp; - var tearDown = suite.tearDown; - delete suite.setUp; - delete suite.tearDown; - return wrapGroup(setUp, tearDown, suite); -}; -})(core); -(function(exports){ -/*! - * Nodeunit - * Copyright (c) 2010 Caolan McMahon - * MIT Licensed - * - * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! - * You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build. - * Only code on that line will be removed, its mostly to avoid requiring code - * that is node specific - */ - - -/** - * NOTE: this test runner is not listed in index.js because it cannot be - * used with the command-line tool, only inside the browser. - */ - - -/** - * Reporter info string - */ - -exports.info = "Browser-based test reporter"; - - -/** - * Run all tests within each module, reporting the results - * - * @param {Array} files - * @api public - */ - -exports.run = function (modules, options) { - var start = new Date().getTime(); - - function setText(el, txt) { - if ('innerText' in el) { - el.innerText = txt; - } - else if ('textContent' in el){ - el.textContent = txt; - } - } - - function getOrCreate(tag, id) { - var el = document.getElementById(id); - if (!el) { - el = document.createElement(tag); - el.id = id; - document.body.appendChild(el); - } - return el; - }; - - var header = getOrCreate('h1', 'nodeunit-header'); - var banner = getOrCreate('h2', 'nodeunit-banner'); - var userAgent = getOrCreate('h2', 'nodeunit-userAgent'); - var tests = getOrCreate('ol', 'nodeunit-tests'); - var result = getOrCreate('p', 'nodeunit-testresult'); - - setText(userAgent, navigator.userAgent); - - nodeunit.runModules(modules, { - moduleStart: function (name) { - /*var mheading = document.createElement('h2'); - mheading.innerText = name; - results.appendChild(mheading); - module = document.createElement('ol'); - results.appendChild(module);*/ - }, - testDone: function (name, assertions) { - var test = document.createElement('li'); - var strong = document.createElement('strong'); - strong.innerHTML = name + ' (' + - '' + assertions.failures() + ', ' + - '' + assertions.passes() + ', ' + - assertions.length + - ')'; - test.className = assertions.failures() ? 'fail': 'pass'; - test.appendChild(strong); - - var aList = document.createElement('ol'); - aList.style.display = 'none'; - test.onclick = function () { - var d = aList.style.display; - aList.style.display = (d == 'none') ? 'block': 'none'; - }; - for (var i=0; i' + (a.error.stack || a.error) + ''; - li.className = 'fail'; - } - else { - li.innerHTML = a.message || a.method || 'no message'; - li.className = 'pass'; - } - aList.appendChild(li); - } - test.appendChild(aList); - tests.appendChild(test); - }, - done: function (assertions) { - var end = new Date().getTime(); - var duration = end - start; - - var failures = assertions.failures(); - banner.className = failures ? 'fail': 'pass'; - - result.innerHTML = 'Tests completed in ' + duration + - ' milliseconds.
      ' + - assertions.passes() + ' assertions of ' + - '' + assertions.length + ' passed, ' + - assertions.failures() + ' failed.'; - } - }); -}; -})(reporter); -nodeunit = core; -nodeunit.assert = assert; -nodeunit.reporter = reporter; -nodeunit.run = reporter.run; -return nodeunit; })(); diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/browser/suite2.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/browser/suite2.js deleted file mode 100644 index c7288e8..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/browser/suite2.js +++ /dev/null @@ -1,13 +0,0 @@ -this.suite2 = { - 'another test': function (test) { - setTimeout(function () { - // lots of assertions - test.ok(true, 'everythings ok'); - test.ok(true, 'everythings ok'); - test.ok(true, 'everythings ok'); - test.ok(true, 'everythings ok'); - test.ok(true, 'everythings ok'); - test.done(); - }, 10); - } -}; diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/browser/suite3.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/browser/suite3.js deleted file mode 100644 index 8929741..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/browser/suite3.js +++ /dev/null @@ -1,7 +0,0 @@ -this.suite3 = { - 'test for ie6,7,8': function (test) { - test.deepEqual(["test"], ["test"]); - test.notDeepEqual(["a"], ["b"]); - test.done(); - } -}; diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/browser/test.html b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/browser/test.html deleted file mode 100644 index 56d4d96..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/browser/test.html +++ /dev/null @@ -1,30 +0,0 @@ - - - Example tests - - - - - - - - - - - - - - - - - - - - - - - diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/bson_array_test.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/bson_array_test.js deleted file mode 100644 index 5304bef..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/bson_array_test.js +++ /dev/null @@ -1,240 +0,0 @@ -var mongodb = require('../../lib/bson').pure(); - -var testCase = require('nodeunit').testCase, - mongoO = require('../../lib/bson').pure(), - debug = require('util').debug, - inspect = require('util').inspect, - Buffer = require('buffer').Buffer, - gleak = require('../../tools/gleak'), - fs = require('fs'), - BSON = mongoO.BSON, - Code = mongoO.Code, - Binary = mongoO.Binary, - Timestamp = mongoO.Timestamp, - Long = mongoO.Long, - MongoReply = mongoO.MongoReply, - ObjectID = mongoO.ObjectID, - Symbol = mongoO.Symbol, - DBRef = mongoO.DBRef, - Double = mongoO.Double, - MinKey = mongoO.MinKey, - MaxKey = mongoO.MaxKey, - BinaryParser = mongoO.BinaryParser, - utils = require('./tools/utils'); - -var BSONSE = mongodb, - BSONDE = mongodb; - -// for tests -BSONDE.BSON_BINARY_SUBTYPE_DEFAULT = 0; -BSONDE.BSON_BINARY_SUBTYPE_FUNCTION = 1; -BSONDE.BSON_BINARY_SUBTYPE_BYTE_ARRAY = 2; -BSONDE.BSON_BINARY_SUBTYPE_UUID = 3; -BSONDE.BSON_BINARY_SUBTYPE_MD5 = 4; -BSONDE.BSON_BINARY_SUBTYPE_USER_DEFINED = 128; - -BSONSE.BSON_BINARY_SUBTYPE_DEFAULT = 0; -BSONSE.BSON_BINARY_SUBTYPE_FUNCTION = 1; -BSONSE.BSON_BINARY_SUBTYPE_BYTE_ARRAY = 2; -BSONSE.BSON_BINARY_SUBTYPE_UUID = 3; -BSONSE.BSON_BINARY_SUBTYPE_MD5 = 4; -BSONSE.BSON_BINARY_SUBTYPE_USER_DEFINED = 128; - -var hexStringToBinary = function(string) { - var numberofValues = string.length / 2; - var array = ""; - - for(var i = 0; i < numberofValues; i++) { - array += String.fromCharCode(parseInt(string[i*2] + string[i*2 + 1], 16)); - } - return array; -} - -var assertBuffersEqual = function(test, buffer1, buffer2) { - if(buffer1.length != buffer2.length) test.fail("Buffers do not have the same length", buffer1, buffer2); - - for(var i = 0; i < buffer1.length; i++) { - test.equal(buffer1[i], buffer2[i]); - } -} - -/** - * Module for parsing an ISO 8601 formatted string into a Date object. - */ -var ISODate = function (string) { - var match; - - if (typeof string.getTime === "function") - return string; - else if (match = string.match(/^(\d{4})(-(\d{2})(-(\d{2})(T(\d{2}):(\d{2})(:(\d{2})(\.(\d+))?)?(Z|((\+|-)(\d{2}):(\d{2}))))?)?)?$/)) { - var date = new Date(); - date.setUTCFullYear(Number(match[1])); - date.setUTCMonth(Number(match[3]) - 1 || 0); - date.setUTCDate(Number(match[5]) || 0); - date.setUTCHours(Number(match[7]) || 0); - date.setUTCMinutes(Number(match[8]) || 0); - date.setUTCSeconds(Number(match[10]) || 0); - date.setUTCMilliseconds(Number("." + match[12]) * 1000 || 0); - - if (match[13] && match[13] !== "Z") { - var h = Number(match[16]) || 0, - m = Number(match[17]) || 0; - - h *= 3600000; - m *= 60000; - - var offset = h + m; - if (match[15] == "+") - offset = -offset; - - date = new Date(date.valueOf() + offset); - } - - return date; - } else - throw new Error("Invalid ISO 8601 date given.", __filename); -}; - -var _Uint8Array = null; - -/** - * Retrieve the server information for the current - * instance of the db client - * - * @ignore - */ -exports.setUp = function(callback) { - _Uint8Array = global.Uint8Array; - delete global['Uint8Array']; - callback(); -} - -/** - * Retrieve the server information for the current - * instance of the db client - * - * @ignore - */ -exports.tearDown = function(callback) { - global['Uint8Array'] = _Uint8Array; - callback(); -} - -// /** -// * @ignore -// */ -// exports.shouldCorrectlyDeserializeUsingTypedArray = function(test) { -// var motherOfAllDocuments = { -// 'string': '客家话', -// 'array': [1,2,3], -// 'hash': {'a':1, 'b':2}, -// 'date': new Date(), -// 'oid': new ObjectID(), -// 'binary': new Binary(new Buffer("hello")), -// 'int': 42, -// 'float': 33.3333, -// 'regexp': /regexp/, -// 'boolean': true, -// 'long': Long.fromNumber(100), -// 'where': new Code('this.a > i', {i:1}), -// 'dbref': new DBRef('namespace', new ObjectID(), 'integration_tests_'), -// 'minkey': new MinKey(), -// 'maxkey': new MaxKey() -// } -// -// // Let's serialize it -// var data = BSONSE.BSON.serialize(motherOfAllDocuments, true, true, false); -// // Build a typed array -// var arr = new Uint8Array(new ArrayBuffer(data.length)); -// // Iterate over all the fields and copy -// for(var i = 0; i < data.length; i++) { -// arr[i] = data[i] -// } -// -// // Deserialize the object -// var object = BSONDE.BSON.deserialize(arr); -// // Asserts -// test.equal(motherOfAllDocuments.string, object.string); -// test.deepEqual(motherOfAllDocuments.array, object.array); -// test.deepEqual(motherOfAllDocuments.date, object.date); -// test.deepEqual(motherOfAllDocuments.oid.toHexString(), object.oid.toHexString()); -// test.deepEqual(motherOfAllDocuments.binary.length(), object.binary.length()); -// // Assert the values of the binary -// for(var i = 0; i < motherOfAllDocuments.binary.length(); i++) { -// test.equal(motherOfAllDocuments.binary.value[i], object.binary[i]); -// } -// test.deepEqual(motherOfAllDocuments.int, object.int); -// test.deepEqual(motherOfAllDocuments.float, object.float); -// test.deepEqual(motherOfAllDocuments.regexp, object.regexp); -// test.deepEqual(motherOfAllDocuments.boolean, object.boolean); -// test.deepEqual(motherOfAllDocuments.long.toNumber(), object.long); -// test.deepEqual(motherOfAllDocuments.where, object.where); -// test.deepEqual(motherOfAllDocuments.dbref.oid.toHexString(), object.dbref.oid.toHexString()); -// test.deepEqual(motherOfAllDocuments.dbref.namespace, object.dbref.namespace); -// test.deepEqual(motherOfAllDocuments.dbref.db, object.dbref.db); -// test.deepEqual(motherOfAllDocuments.minkey, object.minkey); -// test.deepEqual(motherOfAllDocuments.maxkey, object.maxkey); -// test.done(); -// } - -/** - * @ignore - */ -exports.shouldCorrectlySerializeUsingTypedArray = function(test) { - var motherOfAllDocuments = { - 'string': 'hello', - 'array': [1,2,3], - 'hash': {'a':1, 'b':2}, - 'date': new Date(), - 'oid': new ObjectID(), - 'binary': new Binary(new Buffer("hello")), - 'int': 42, - 'float': 33.3333, - 'regexp': /regexp/, - 'boolean': true, - 'long': Long.fromNumber(100), - 'where': new Code('this.a > i', {i:1}), - 'dbref': new DBRef('namespace', new ObjectID(), 'integration_tests_'), - 'minkey': new MinKey(), - 'maxkey': new MaxKey() - } - - // Let's serialize it - var data = BSONSE.BSON.serialize(motherOfAllDocuments, true, false, false); - // And deserialize it again - var object = BSONSE.BSON.deserialize(data); - // Asserts - test.equal(motherOfAllDocuments.string, object.string); - test.deepEqual(motherOfAllDocuments.array, object.array); - test.deepEqual(motherOfAllDocuments.date, object.date); - test.deepEqual(motherOfAllDocuments.oid.toHexString(), object.oid.toHexString()); - test.deepEqual(motherOfAllDocuments.binary.length(), object.binary.length()); - // Assert the values of the binary - for(var i = 0; i < motherOfAllDocuments.binary.length(); i++) { - test.equal(motherOfAllDocuments.binary.value[i], object.binary[i]); - } - test.deepEqual(motherOfAllDocuments.int, object.int); - test.deepEqual(motherOfAllDocuments.float, object.float); - test.deepEqual(motherOfAllDocuments.regexp, object.regexp); - test.deepEqual(motherOfAllDocuments.boolean, object.boolean); - test.deepEqual(motherOfAllDocuments.long.toNumber(), object.long); - test.deepEqual(motherOfAllDocuments.where, object.where); - test.deepEqual(motherOfAllDocuments.dbref.oid.toHexString(), object.dbref.oid.toHexString()); - test.deepEqual(motherOfAllDocuments.dbref.namespace, object.dbref.namespace); - test.deepEqual(motherOfAllDocuments.dbref.db, object.dbref.db); - test.deepEqual(motherOfAllDocuments.minkey, object.minkey); - test.deepEqual(motherOfAllDocuments.maxkey, object.maxkey); - test.done(); -} - -/** - * Retrieve the server information for the current - * instance of the db client - * - * @ignore - */ -exports.noGlobalsLeaked = function(test) { - var leaks = gleak.detectNew(); - test.equal(0, leaks.length, "global var leak detected: " + leaks.join(', ')); - test.done(); -} \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/bson_parser_comparision_test.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/bson_parser_comparision_test.js deleted file mode 100644 index 7481540..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/bson_parser_comparision_test.js +++ /dev/null @@ -1,493 +0,0 @@ -var sys = require('util'), - debug = require('util').debug, - inspect = require('util').inspect, - Buffer = require('buffer').Buffer, - BSON = require('../../ext').BSON, - Buffer = require('buffer').Buffer, - BSONJS = require('../../lib/bson/bson').BSON, - BinaryParser = require('../../lib/bson/binary_parser').BinaryParser, - Long = require('../../lib/bson/long').Long, - ObjectID = require('../../lib/bson/bson').ObjectID, - Binary = require('../../lib/bson/bson').Binary, - Code = require('../../lib/bson/bson').Code, - DBRef = require('../../lib/bson/bson').DBRef, - Symbol = require('../../lib/bson/bson').Symbol, - Double = require('../../lib/bson/bson').Double, - MaxKey = require('../../lib/bson/bson').MaxKey, - MinKey = require('../../lib/bson/bson').MinKey, - Timestamp = require('../../lib/bson/bson').Timestamp, - gleak = require('../../tools/gleak'), - assert = require('assert'); - -// Long/ObjectID/Binary/Code/DbRef/Symbol/Double/Timestamp/MinKey/MaxKey -var bsonC = new BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]); -var bsonJS = new BSONJS([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]); - -/** - * Retrieve the server information for the current - * instance of the db client - * - * @ignore - */ -exports.setUp = function(callback) { - callback(); -} - -/** - * Retrieve the server information for the current - * instance of the db client - * - * @ignore - */ -exports.tearDown = function(callback) { - callback(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize simple edge value'] = function(test) { - // Simple serialization and deserialization of edge value - var doc = {doc:0x1ffffffffffffe}; - var simple_string_serialized = bsonC.serialize(doc, false, true); - assert.deepEqual(simple_string_serialized, bsonJS.serialize(doc, false, true)); - assert.deepEqual(bsonJS.deserialize(new Buffer(simple_string_serialized, 'binary')), bsonC.deserialize(simple_string_serialized)); - - var doc = {doc:-0x1ffffffffffffe}; - var simple_string_serialized = bsonC.serialize(doc, false, true); - assert.deepEqual(simple_string_serialized, bsonJS.serialize(doc, false, true)); - assert.deepEqual(bsonJS.deserialize(new Buffer(simple_string_serialized, 'binary')), bsonC.deserialize(simple_string_serialized)); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly execute toJSON'] = function(test) { - var a = Long.fromNumber(10); - assert.equal(10, a); - - var a = Long.fromNumber(9223372036854775807); - assert.equal(9223372036854775807, a); - - // Simple serialization and deserialization test for a Single String value - var doc = {doc:'Serialize'}; - var simple_string_serialized = bsonC.serialize(doc, true, false); - - assert.deepEqual(simple_string_serialized, bsonJS.serialize(doc, false, true)); - assert.deepEqual(bsonJS.deserialize(new Buffer(simple_string_serialized, 'binary')), bsonC.deserialize(simple_string_serialized)); - test.done(); -} - -/** - * @ignore - */ -exports['Should Serialize and Deserialize nested document'] = function(test) { - // Nested doc - var doc = {a:{b:{c:1}}}; - var simple_string_serialized = bsonC.serialize(doc, false, true); - - assert.deepEqual(simple_string_serialized, bsonJS.serialize(doc, false, true)); - assert.deepEqual(bsonJS.deserialize(new Buffer(simple_string_serialized, 'binary')), bsonC.deserialize(simple_string_serialized)); - test.done(); -} - -/** - * @ignore - */ -exports['Simple integer serialization/deserialization test, including testing boundary conditions'] = function(test) { - var doc = {doc:-1}; - var simple_string_serialized = bsonC.serialize(doc, false, true); - assert.deepEqual(simple_string_serialized, bsonJS.serialize(doc, false, true)); - assert.deepEqual(bsonJS.deserialize(new Buffer(simple_string_serialized, 'binary')), bsonC.deserialize(simple_string_serialized)); - - var doc = {doc:2147483648}; - var simple_string_serialized = bsonC.serialize(doc, false, true); - assert.deepEqual(bsonJS.deserialize(new Buffer(simple_string_serialized, 'binary')), bsonC.deserialize(simple_string_serialized)); - - var doc = {doc:-2147483648}; - var simple_string_serialized = bsonC.serialize(doc, false, true); - assert.deepEqual(simple_string_serialized, bsonJS.serialize(doc, false, true)); - assert.deepEqual(bsonJS.deserialize(new Buffer(simple_string_serialized, 'binary')), bsonC.deserialize(simple_string_serialized)); - test.done(); -} - -/** - * @ignore - */ -exports['Simple serialization and deserialization test for a Long value'] = function(test) { - var doc = {doc:Long.fromNumber(9223372036854775807)}; - var simple_string_serialized = bsonC.serialize(doc, false, true); - assert.deepEqual(simple_string_serialized, bsonJS.serialize({doc:Long.fromNumber(9223372036854775807)}, false, true)); - assert.deepEqual(bsonJS.deserialize(new Buffer(simple_string_serialized, 'binary')), bsonC.deserialize(simple_string_serialized)); - - var doc = {doc:Long.fromNumber(-9223372036854775807)}; - var simple_string_serialized = bsonC.serialize(doc, false, true); - assert.deepEqual(simple_string_serialized, bsonJS.serialize({doc:Long.fromNumber(-9223372036854775807)}, false, true)); - assert.deepEqual(bsonJS.deserialize(new Buffer(simple_string_serialized, 'binary')), bsonC.deserialize(simple_string_serialized)); - test.done(); -} - -/** - * @ignore - */ -exports['Simple serialization and deserialization for a Float value'] = function(test) { - var doc = {doc:2222.3333}; - var simple_string_serialized = bsonC.serialize(doc, false, true); - assert.deepEqual(simple_string_serialized, bsonJS.serialize(doc, false, true)); - assert.deepEqual(bsonJS.deserialize(new Buffer(simple_string_serialized, 'binary')), bsonC.deserialize(simple_string_serialized)); - - var doc = {doc:-2222.3333}; - var simple_string_serialized = bsonC.serialize(doc, false, true); - assert.deepEqual(simple_string_serialized, bsonJS.serialize(doc, false, true)); - assert.deepEqual(bsonJS.deserialize(new Buffer(simple_string_serialized, 'binary')), bsonC.deserialize(simple_string_serialized)); - test.done(); -} - -/** - * @ignore - */ -exports['Simple serialization and deserialization for a null value'] = function(test) { - var doc = {doc:null}; - var simple_string_serialized = bsonC.serialize(doc, false, true); - assert.deepEqual(simple_string_serialized, bsonJS.serialize(doc, false, true)); - assert.deepEqual(bsonJS.deserialize(new Buffer(simple_string_serialized, 'binary')), bsonC.deserialize(simple_string_serialized)); - test.done(); -} - -/** - * @ignore - */ -exports['Simple serialization and deserialization for a boolean value'] = function(test) { - var doc = {doc:true}; - var simple_string_serialized = bsonC.serialize(doc, false, true); - assert.deepEqual(simple_string_serialized, bsonJS.serialize(doc, false, true)); - assert.deepEqual(bsonJS.deserialize(new Buffer(simple_string_serialized, 'binary')), bsonC.deserialize(simple_string_serialized)); - test.done(); -} - -/** - * @ignore - */ -exports['Simple serialization and deserialization for a date value'] = function(test) { - var date = new Date(); - var doc = {doc:date}; - var simple_string_serialized = bsonC.serialize(doc, false, true); - assert.deepEqual(simple_string_serialized, bsonJS.serialize(doc, false, true)); - assert.deepEqual(bsonJS.deserialize(new Buffer(simple_string_serialized, 'binary')), bsonC.deserialize(simple_string_serialized)); - test.done(); -} - -/** - * @ignore - */ -exports['Simple serialization and deserialization for a boolean value'] = function(test) { - var doc = {doc:/abcd/mi}; - var simple_string_serialized = bsonC.serialize(doc, false, true); - assert.deepEqual(simple_string_serialized, bsonJS.serialize(doc, false, true)); - assert.equal(bsonJS.deserialize(new Buffer(simple_string_serialized, 'binary')).doc.toString(), bsonC.deserialize(simple_string_serialized).doc.toString()); - - var doc = {doc:/abcd/}; - var simple_string_serialized = bsonC.serialize(doc, false, true); - assert.deepEqual(simple_string_serialized, bsonJS.serialize(doc, false, true)); - assert.equal(bsonJS.deserialize(new Buffer(simple_string_serialized, 'binary')).doc.toString(), bsonC.deserialize(simple_string_serialized).doc.toString()); - test.done(); -} - -/** - * @ignore - */ -exports['Simple serialization and deserialization for a objectId value'] = function(test) { - var doc = {doc:new ObjectID()}; - var simple_string_serialized = bsonC.serialize(doc, false, true); - var doc2 = {doc:ObjectID.createFromHexString(doc.doc.toHexString())}; - - assert.deepEqual(simple_string_serialized, bsonJS.serialize(doc2, false, true)); - assert.deepEqual(bsonJS.deserialize(new Buffer(simple_string_serialized, 'binary')).doc.toString(), bsonC.deserialize(simple_string_serialized).doc.toString()); - test.done(); -} - -/** - * @ignore - */ -exports['Simple serialization and deserialization for a Binary value'] = function(test) { - var binary = new Binary(); - var string = 'binstring' - for(var index = 0; index < string.length; index++) { binary.put(string.charAt(index)); } - - var simple_string_serialized = bsonC.serialize({doc:binary}, false, true); - assert.deepEqual(simple_string_serialized, bsonJS.serialize({doc:binary}, false, true)); - assert.deepEqual(bsonJS.deserialize(new Buffer(simple_string_serialized, 'binary')).doc.value(), bsonC.deserialize(simple_string_serialized).doc.value()); - test.done(); -} - -/** - * @ignore - */ -exports['Simple serialization and deserialization for a Binary value of type 2'] = function(test) { - var binary = new Binary(new Buffer('binstring'), Binary.SUBTYPE_BYTE_ARRAY); - var simple_string_serialized = bsonC.serialize({doc:binary}, false, true); - assert.deepEqual(simple_string_serialized, bsonJS.serialize({doc:binary}, false, true)); - assert.deepEqual(bsonJS.deserialize(new Buffer(simple_string_serialized, 'binary')).doc.value(), bsonC.deserialize(simple_string_serialized).doc.value()); - test.done(); -} - -/** - * @ignore - */ -exports['Simple serialization and deserialization for a Code value'] = function(test) { - var code = new Code('this.a > i', {'i': 1}); - var simple_string_serialized_2 = bsonJS.serialize({doc:code}, false, true); - var simple_string_serialized = bsonC.serialize({doc:code}, false, true); - - assert.deepEqual(simple_string_serialized, simple_string_serialized_2); - assert.deepEqual(bsonJS.deserialize(new Buffer(simple_string_serialized_2, 'binary')).doc.scope, bsonC.deserialize(simple_string_serialized).doc.scope); - test.done(); -} - -/** - * @ignore - */ -exports['Simple serialization and deserialization for an Object'] = function(test) { - var simple_string_serialized = bsonC.serialize({doc:{a:1, b:{c:2}}}, false, true); - var simple_string_serialized_2 = bsonJS.serialize({doc:{a:1, b:{c:2}}}, false, true); - assert.deepEqual(simple_string_serialized, simple_string_serialized_2) - assert.deepEqual(bsonJS.deserialize(new Buffer(simple_string_serialized_2, 'binary')).doc, bsonC.deserialize(simple_string_serialized).doc); - - // Simple serialization and deserialization for an Array - var simple_string_serialized = bsonC.serialize({doc:[9, 9, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1]}, false, true); - var simple_string_serialized_2 = bsonJS.serialize({doc:[9, 9, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1]}, false, true); - - assert.deepEqual(simple_string_serialized, simple_string_serialized_2) - assert.deepEqual(bsonJS.deserialize(new Buffer(simple_string_serialized_2, 'binary')).doc, bsonC.deserialize(simple_string_serialized).doc); - test.done(); -} - -/** - * @ignore - */ -exports['Simple serialization and deserialization for a DBRef'] = function(test) { - var oid = new ObjectID() - var oid2 = new ObjectID.createFromHexString(oid.toHexString()) - var simple_string_serialized = bsonJS.serialize({doc:new DBRef('namespace', oid2, 'integration_tests_')}, false, true); - var simple_string_serialized_2 = bsonC.serialize({doc:new DBRef('namespace', oid, 'integration_tests_')}, false, true); - - assert.deepEqual(simple_string_serialized, simple_string_serialized_2) - // Ensure we have the same values for the dbref - var object_js = bsonJS.deserialize(new Buffer(simple_string_serialized_2, 'binary')); - var object_c = bsonC.deserialize(simple_string_serialized); - - assert.equal(object_js.doc.namespace, object_c.doc.namespace); - assert.equal(object_js.doc.oid.toHexString(), object_c.doc.oid.toHexString()); - assert.equal(object_js.doc.db, object_c.doc.db); - test.done(); -} - -/** - * @ignore - */ -exports['Should correctly deserialize bytes array'] = function(test) { - // Serialized document - var bytes = [47,0,0,0,2,110,97,109,101,0,6,0,0,0,80,97,116,116,121,0,16,97,103,101,0,34,0,0,0,7,95,105,100,0,76,100,12,23,11,30,39,8,89,0,0,1,0]; - var serialized_data = ''; - // Convert to chars - for(var i = 0; i < bytes.length; i++) { - serialized_data = serialized_data + BinaryParser.fromByte(bytes[i]); - } - var object = bsonC.deserialize(new Buffer(serialized_data, 'binary')); - assert.equal('Patty', object.name) - assert.equal(34, object.age) - assert.equal('4c640c170b1e270859000001', object._id.toHexString()) - test.done(); -} - -/** - * @ignore - */ -exports['Serialize utf8'] = function(test) { - var doc = { "name" : "本荘由利地域に洪水警報", "name1" : "öüóőúéáűíÖÜÓŐÚÉÁŰÍ", "name2" : "abcdedede"}; - var simple_string_serialized = bsonC.serialize(doc, false, true); - var simple_string_serialized2 = bsonJS.serialize(doc, false, true); - assert.deepEqual(simple_string_serialized, simple_string_serialized2) - - var object = bsonC.deserialize(simple_string_serialized); - assert.equal(doc.name, object.name) - assert.equal(doc.name1, object.name1) - assert.equal(doc.name2, object.name2) - test.done(); -} - -/** - * @ignore - */ -exports['Serialize object with array'] = function(test) { - var doc = {b:[1, 2, 3]}; - var simple_string_serialized = bsonC.serialize(doc, false, true); - var simple_string_serialized_2 = bsonJS.serialize(doc, false, true); - assert.deepEqual(simple_string_serialized, simple_string_serialized_2) - - var object = bsonC.deserialize(simple_string_serialized); - assert.deepEqual(doc, object) - test.done(); -} - -/** - * @ignore - */ -exports['Test equality of an object ID'] = function(test) { - var object_id = new ObjectID(); - var object_id_2 = new ObjectID(); - assert.ok(object_id.equals(object_id)); - assert.ok(!(object_id.equals(object_id_2))) - test.done(); -} - -/** - * @ignore - */ -exports['Test same serialization for Object ID'] = function(test) { - var object_id = new ObjectID(); - var object_id2 = ObjectID.createFromHexString(object_id.toString()) - var simple_string_serialized = bsonJS.serialize({doc:object_id}, false, true); - var simple_string_serialized_2 = bsonC.serialize({doc:object_id2}, false, true); - - assert.equal(simple_string_serialized_2.length, simple_string_serialized.length); - assert.deepEqual(simple_string_serialized, simple_string_serialized_2) - var object = bsonJS.deserialize(new Buffer(simple_string_serialized_2, 'binary')); - var object2 = bsonC.deserialize(simple_string_serialized); - assert.equal(object.doc.id, object2.doc.id) - test.done(); -} - -/** - * @ignore - */ -exports['Complex object serialization'] = function(test) { - // JS Object - var c1 = { _id: new ObjectID, comments: [], title: 'number 1' }; - var c2 = { _id: new ObjectID, comments: [], title: 'number 2' }; - var doc = { - numbers: [] - , owners: [] - , comments: [c1, c2] - , _id: new ObjectID - }; - - var simple_string_serialized = bsonJS.serialize(doc, false, true); - - // C++ Object - var c1 = { _id: ObjectID.createFromHexString(c1._id.toHexString()), comments: [], title: 'number 1' }; - var c2 = { _id: ObjectID.createFromHexString(c2._id.toHexString()), comments: [], title: 'number 2' }; - var doc = { - numbers: [] - , owners: [] - , comments: [c1, c2] - , _id: ObjectID.createFromHexString(doc._id.toHexString()) - }; - - var simple_string_serialized_2 = bsonC.serialize(doc, false, true); - - for(var i = 0; i < simple_string_serialized_2.length; i++) { - // debug(i + "[" + simple_string_serialized_2[i] + "] = [" + simple_string_serialized[i] + "]") - assert.equal(simple_string_serialized_2[i], simple_string_serialized[i]); - } - - var doc1 = bsonJS.deserialize(new Buffer(simple_string_serialized_2)); - var doc2 = bsonC.deserialize(new Buffer(simple_string_serialized_2)); - assert.equal(doc._id.id, doc1._id.id) - assert.equal(doc._id.id, doc2._id.id) - assert.equal(doc1._id.id, doc2._id.id) - - var doc = { - _id: 'testid', - key1: { code: 'test1', time: {start:1309323402727,end:1309323402727}, x:10, y:5 }, - key2: { code: 'test1', time: {start:1309323402727,end:1309323402727}, x:10, y:5 } - }; - - var simple_string_serialized = bsonJS.serialize(doc, false, true); - var simple_string_serialized_2 = bsonC.serialize(doc, false, true); - test.done(); -} - -/** - * @ignore - */ -exports['Serialize function'] = function(test) { - var doc = { - _id: 'testid', - key1: function() {} - } - - var simple_string_serialized = bsonJS.serialize(doc, false, true, true); - var simple_string_serialized_2 = bsonC.serialize(doc, false, true, true); - - // Deserialize the string - var doc1 = bsonJS.deserialize(new Buffer(simple_string_serialized_2)); - var doc2 = bsonC.deserialize(new Buffer(simple_string_serialized_2)); - assert.equal(doc1.key1.code.toString(), doc2.key1.code.toString()) - test.done(); -} - -/** - * @ignore - */ -exports['Serialize document with special operators'] = function(test) { - var doc = {"user_id":"4e9fc8d55883d90100000003","lc_status":{"$ne":"deleted"},"owner_rating":{"$exists":false}}; - var simple_string_serialized = bsonJS.serialize(doc, false, true, true); - var simple_string_serialized_2 = bsonC.serialize(doc, false, true, true); - - // Should serialize to the same value - assert.equal(simple_string_serialized_2.toString('base64'), simple_string_serialized.toString('base64')) - var doc1 = bsonJS.deserialize(simple_string_serialized_2); - var doc2 = bsonC.deserialize(simple_string_serialized); - assert.deepEqual(doc1, doc2) - test.done(); -} - -/** - * @ignore - */ -exports['Create ObjectID from hex string'] = function(test) { - // Hex Id - var hexId = new ObjectID().toString(); - var docJS = {_id: ObjectID.createFromHexString(hexId), 'funds.remaining': {$gte: 1.222}, 'transactions.id': {$ne: ObjectID.createFromHexString(hexId)}}; - var docC = {_id: ObjectID.createFromHexString(hexId), 'funds.remaining': {$gte: 1.222}, 'transactions.id': {$ne: ObjectID.createFromHexString(hexId)}}; - var docJSBin = bsonJS.serialize(docJS, false, true, true); - var docCBin = bsonC.serialize(docC, false, true, true); - assert.equal(docCBin.toString('base64'), docJSBin.toString('base64')); - test.done(); -} - -/** - * @ignore - */ -exports['Serialize big complex document'] = function(test) { - // Complex document serialization - var doc = {"DateTime": "Tue Nov 40 2011 17:27:55 GMT+0000 (WEST)","isActive": true,"Media": {"URL": "http://videos.sapo.pt/Tc85NsjaKjj8o5aV7Ubb"},"Title": "Lisboa fecha a ganhar 0.19%","SetPosition": 60,"Type": "videos","Thumbnail": [{"URL": "http://rd3.videos.sapo.pt/Tc85NsjaKjj8o5aV7Ubb/pic/320x240","Dimensions": {"Height": 240,"Width": 320}}],"Source": {"URL": "http://videos.sapo.pt","SetID": "1288","SourceID": "http://videos.sapo.pt/tvnet/rss2","SetURL": "http://noticias.sapo.pt/videos/tv-net_1288/","ItemID": "Tc85NsjaKjj8o5aV7Ubb","Name": "SAPO Vídeos"},"Category": "Tec_ciencia","Description": "Lisboa fecha a ganhar 0.19%","GalleryID": new ObjectID("4eea2a634ce8573200000000"),"InternalRefs": {"RegisterDate": "Thu Dec 15 2011 17:12:51 GMT+0000 (WEST)","ChangeDate": "Thu Dec 15 2011 17:12:51 GMT+0000 (WEST)","Hash": 332279244514},"_id": new ObjectID("4eea2a96e52778160000003a")} - var docJSBin = bsonJS.serialize(doc, false, true, true); - var docCBin = bsonC.serialize(doc, false, true, true); - assert.equal(docCBin.toString('base64'), docJSBin.toString('base64')); - test.done(); -} - -/** - * @ignore - */ -exports['Should error out due to 24 characters but not valid hexstring for ObjectID'] = function(test) { - try { - var oid = new ObjectID("tttttttttttttttttttttttt"); - test.ok(false); - } catch(err) {} - - test.done(); -} - - -/** - * @ignore - */ -exports.noGlobalsLeaked = function(test) { - var leaks = gleak.detectNew(); - test.equal(0, leaks.length, "global var leak detected: " + leaks.join(', ')); - test.done(); -} \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/bson_test.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/bson_test.js deleted file mode 100644 index 9eb5756..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/bson_test.js +++ /dev/null @@ -1,1694 +0,0 @@ -var mongodb = process.env['TEST_NATIVE'] != null ? require('../../lib/bson').native() : require('../../lib/bson').pure(); - -var testCase = require('nodeunit').testCase, - mongoO = require('../../lib/bson').pure(), - Buffer = require('buffer').Buffer, - gleak = require('../../tools/gleak'), - fs = require('fs'), - BSON = mongoO.BSON, - Code = mongoO.Code, - Binary = mongoO.Binary, - Timestamp = mongoO.Timestamp, - Long = mongoO.Long, - MongoReply = mongoO.MongoReply, - ObjectID = mongoO.ObjectID, - ObjectId = mongoO.ObjectId, - Symbol = mongoO.Symbol, - DBRef = mongoO.DBRef, - Double = mongoO.Double, - MinKey = mongoO.MinKey, - MaxKey = mongoO.MaxKey, - BinaryParser = mongoO.BinaryParser, - vm = require('vm'); - -var BSONSE = mongodb, - BSONDE = mongodb; - -// for tests -BSONDE.BSON_BINARY_SUBTYPE_DEFAULT = 0; -BSONDE.BSON_BINARY_SUBTYPE_FUNCTION = 1; -BSONDE.BSON_BINARY_SUBTYPE_BYTE_ARRAY = 2; -BSONDE.BSON_BINARY_SUBTYPE_UUID = 3; -BSONDE.BSON_BINARY_SUBTYPE_MD5 = 4; -BSONDE.BSON_BINARY_SUBTYPE_USER_DEFINED = 128; - -BSONSE.BSON_BINARY_SUBTYPE_DEFAULT = 0; -BSONSE.BSON_BINARY_SUBTYPE_FUNCTION = 1; -BSONSE.BSON_BINARY_SUBTYPE_BYTE_ARRAY = 2; -BSONSE.BSON_BINARY_SUBTYPE_UUID = 3; -BSONSE.BSON_BINARY_SUBTYPE_MD5 = 4; -BSONSE.BSON_BINARY_SUBTYPE_USER_DEFINED = 128; - -var hexStringToBinary = function(string) { - var numberofValues = string.length / 2; - var array = ""; - - for(var i = 0; i < numberofValues; i++) { - array += String.fromCharCode(parseInt(string[i*2] + string[i*2 + 1], 16)); - } - return array; -} - -var assertBuffersEqual = function(test, buffer1, buffer2) { - if(buffer1.length != buffer2.length) test.fail("Buffers do not have the same length", buffer1, buffer2); - - for(var i = 0; i < buffer1.length; i++) { - test.equal(buffer1[i], buffer2[i]); - } -} - -/** - * Module for parsing an ISO 8601 formatted string into a Date object. - */ -var ISODate = function (string) { - var match; - - if (typeof string.getTime === "function") - return string; - else if (match = string.match(/^(\d{4})(-(\d{2})(-(\d{2})(T(\d{2}):(\d{2})(:(\d{2})(\.(\d+))?)?(Z|((\+|-)(\d{2}):(\d{2}))))?)?)?$/)) { - var date = new Date(); - date.setUTCFullYear(Number(match[1])); - date.setUTCMonth(Number(match[3]) - 1 || 0); - date.setUTCDate(Number(match[5]) || 0); - date.setUTCHours(Number(match[7]) || 0); - date.setUTCMinutes(Number(match[8]) || 0); - date.setUTCSeconds(Number(match[10]) || 0); - date.setUTCMilliseconds(Number("." + match[12]) * 1000 || 0); - - if (match[13] && match[13] !== "Z") { - var h = Number(match[16]) || 0, - m = Number(match[17]) || 0; - - h *= 3600000; - m *= 60000; - - var offset = h + m; - if (match[15] == "+") - offset = -offset; - - date = new Date(date.valueOf() + offset); - } - - return date; - } else - throw new Error("Invalid ISO 8601 date given.", __filename); -}; - -/** - * Retrieve the server information for the current - * instance of the db client - * - * @ignore - */ -exports.setUp = function(callback) { - callback(); -} - -/** - * Retrieve the server information for the current - * instance of the db client - * - * @ignore - */ -exports.tearDown = function(callback) { - callback(); -} - -/** - * @ignore - */ -exports['Should Correctly create ObjectID and do deep equals'] = function(test) { - var test_string = {hello: new ObjectID()}; - test_string.hello.toHexString(); - - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(test_string, false, true); - test.deepEqual(test_string, new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data)); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly get BSON types from require'] = function(test) { - var _mongodb = require('../../lib/bson'); - test.ok(_mongodb.ObjectID === ObjectID); - test.ok(_mongodb.Binary === Binary); - test.ok(_mongodb.Long === Long); - test.ok(_mongodb.Timestamp === Timestamp); - test.ok(_mongodb.Code === Code); - test.ok(_mongodb.DBRef === DBRef); - test.ok(_mongodb.Symbol === Symbol); - test.ok(_mongodb.MinKey === MinKey); - test.ok(_mongodb.MaxKey === MaxKey); - test.ok(_mongodb.Double === Double); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Deserialize object'] = function(test) { - var bytes = [95,0,0,0,2,110,115,0,42,0,0,0,105,110,116,101,103,114,97,116,105,111,110,95,116,101,115,116,115,95,46,116,101,115,116,95,105,110,100,101,120,95,105,110,102,111,114,109,97,116,105,111,110,0,8,117,110,105,113,117,101,0,0,3,107,101,121,0,12,0,0,0,16,97,0,1,0,0,0,0,2,110,97,109,101,0,4,0,0,0,97,95,49,0,0]; - var serialized_data = ''; - // Convert to chars - for(var i = 0; i < bytes.length; i++) { - serialized_data = serialized_data + BinaryParser.fromByte(bytes[i]); - } - - var object = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(new Buffer(serialized_data, 'binary')); - test.equal("a_1", object.name); - test.equal(false, object.unique); - test.equal(1, object.key.a); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Deserialize object with all types'] = function(test) { - var bytes = [26,1,0,0,7,95,105,100,0,161,190,98,75,118,169,3,0,0,3,0,0,4,97,114,114,97,121,0,26,0,0,0,16,48,0,1,0,0,0,16,49,0,2,0,0,0,16,50,0,3,0,0,0,0,2,115,116,114,105,110,103,0,6,0,0,0,104,101,108,108,111,0,3,104,97,115,104,0,19,0,0,0,16,97,0,1,0,0,0,16,98,0,2,0,0,0,0,9,100,97,116,101,0,161,190,98,75,0,0,0,0,7,111,105,100,0,161,190,98,75,90,217,18,0,0,1,0,0,5,98,105,110,97,114,121,0,7,0,0,0,2,3,0,0,0,49,50,51,16,105,110,116,0,42,0,0,0,1,102,108,111,97,116,0,223,224,11,147,169,170,64,64,11,114,101,103,101,120,112,0,102,111,111,98,97,114,0,105,0,8,98,111,111,108,101,97,110,0,1,15,119,104,101,114,101,0,25,0,0,0,12,0,0,0,116,104,105,115,46,120,32,61,61,32,51,0,5,0,0,0,0,3,100,98,114,101,102,0,37,0,0,0,2,36,114,101,102,0,5,0,0,0,116,101,115,116,0,7,36,105,100,0,161,190,98,75,2,180,1,0,0,2,0,0,0,10,110,117,108,108,0,0]; - var serialized_data = ''; - // Convert to chars - for(var i = 0; i < bytes.length; i++) { - serialized_data = serialized_data + BinaryParser.fromByte(bytes[i]); - } - - var object = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(new Buffer(serialized_data, 'binary'));//, false, true); - // Perform tests - test.equal("hello", object.string); - test.deepEqual([1,2,3], object.array); - test.equal(1, object.hash.a); - test.equal(2, object.hash.b); - test.ok(object.date != null); - test.ok(object.oid != null); - test.ok(object.binary != null); - test.equal(42, object.int); - test.equal(33.3333, object.float); - test.ok(object.regexp != null); - test.equal(true, object.boolean); - test.ok(object.where != null); - test.ok(object.dbref != null); - test.ok(object[null] == null); - test.done(); -} - -/** - * @ignore - */ -exports['Should Serialize and Deserialize String'] = function(test) { - var test_string = {hello: 'world'}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(test_string, false, true); - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(test_string)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(test_string, false, serialized_data2, 0); - - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - test.deepEqual(test_string, new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data)); - test.done(); -} - -/** - * @ignore - */ -exports['Should Serialize and Deserialize Empty String'] = function(test) { - var test_string = {hello: ''}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(test_string, false, true); - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(test_string)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(test_string, false, serialized_data2, 0); - - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - test.deepEqual(test_string, new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data)); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize Integer'] = function(test) { - var test_number = {doc: 5}; - - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(test_number, false, true); - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(test_number)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(test_number, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - test.deepEqual(test_number, new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data)); - test.deepEqual(test_number, new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data2)); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize null value'] = function(test) { - var test_null = {doc:null}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(test_null, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(test_null)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(test_null, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var object = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - test.equal(null, object.doc); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize Number'] = function(test) { - var test_number = {doc: 5.5}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(test_number, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(test_number)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(test_number, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - test.deepEqual(test_number, new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data)); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize Integer'] = function(test) { - var test_int = {doc: 42}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(test_int, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(test_int)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(test_int, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - test.deepEqual(test_int.doc, new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data).doc); - - test_int = {doc: -5600}; - serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(test_int, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(test_int)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(test_int, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - test.deepEqual(test_int.doc, new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data).doc); - - test_int = {doc: 2147483647}; - serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(test_int, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(test_int)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(test_int, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - test.deepEqual(test_int.doc, new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data).doc); - - test_int = {doc: -2147483648}; - serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(test_int, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(test_int)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(test_int, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - test.deepEqual(test_int.doc, new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data).doc); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize Object'] = function(test) { - var doc = {doc: {age: 42, name: 'Spongebob', shoe_size: 9.5}}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - test.deepEqual(doc.doc.age, new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data).doc.age); - test.deepEqual(doc.doc.name, new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data).doc.name); - test.deepEqual(doc.doc.shoe_size, new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data).doc.shoe_size); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize Array'] = function(test) { - var doc = {doc: [1, 2, 'a', 'b']}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var deserialized = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - test.equal(doc.doc[0], deserialized.doc[0]) - test.equal(doc.doc[1], deserialized.doc[1]) - test.equal(doc.doc[2], deserialized.doc[2]) - test.equal(doc.doc[3], deserialized.doc[3]) - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize Array with added on functions'] = function(test) { - Array.prototype.toXml = function() {}; - var doc = {doc: [1, 2, 'a', 'b']}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var deserialized = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - test.equal(doc.doc[0], deserialized.doc[0]) - test.equal(doc.doc[1], deserialized.doc[1]) - test.equal(doc.doc[2], deserialized.doc[2]) - test.equal(doc.doc[3], deserialized.doc[3]) - test.done(); -} - -/** - * @ignore - */ -exports['Should correctly deserialize a nested object'] = function(test) { - var doc = {doc: {doc:1}}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - test.deepEqual(doc.doc.doc, new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data).doc.doc); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize A Boolean'] = function(test) { - var doc = {doc: true}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - test.equal(doc.doc, new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data).doc); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize a Date'] = function(test) { - var date = new Date(); - //(2009, 11, 12, 12, 00, 30) - date.setUTCDate(12); - date.setUTCFullYear(2009); - date.setUTCMonth(11 - 1); - date.setUTCHours(12); - date.setUTCMinutes(0); - date.setUTCSeconds(30); - var doc = {doc: date}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - test.equal(doc.date, new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data).doc.date); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize a Date from another VM'] = function(test) { - var script = "date1 = new Date();", - ctx = vm.createContext({ - date1 : null - }); - vm.runInContext(script, ctx, 'myfile.vm'); - - var date = ctx.date1; - //(2009, 11, 12, 12, 00, 30) - date.setUTCDate(12); - date.setUTCFullYear(2009); - date.setUTCMonth(11 - 1); - date.setUTCHours(12); - date.setUTCMinutes(0); - date.setUTCSeconds(30); - var doc = {doc: date}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - test.equal(doc.date, new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data).doc.date); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize nested doc'] = function(test) { - var doc = { - string: "Strings are great", - decimal: 3.14159265, - bool: true, - integer: 5, - - subObject: { - moreText: "Bacon ipsum dolor.", - longKeylongKeylongKeylongKeylongKeylongKey: "Pork belly." - }, - - subArray: [1,2,3,4,5,6,7,8,9,10], - anotherString: "another string" - } - - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize Oid'] = function(test) { - var doc = {doc: new ObjectID()}; - var doc2 = {doc: ObjectID.createFromHexString(doc.doc.toHexString())}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - test.deepEqual(doc, new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data)); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly encode Empty Hash'] = function(test) { - var doc = {}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - test.deepEqual(doc, new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data)); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize Ordered Hash'] = function(test) { - var doc = {doc: {b:1, a:2, c:3, d:4}}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var decoded_hash = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data).doc; - var keys = []; - - for(var name in decoded_hash) keys.push(name); - test.deepEqual(['b', 'a', 'c', 'd'], keys); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize Regular Expression'] = function(test) { - // Serialize the regular expression - var doc = {doc: /foobar/mi}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var doc2 = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - - test.deepEqual(doc.doc.toString(), doc2.doc.toString()); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize a Binary object'] = function(test) { - var bin = new Binary(); - var string = 'binstring'; - for(var index = 0; index < string.length; index++) { - bin.put(string.charAt(index)); - } - - var doc = {doc: bin}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var deserialized_data = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - - test.deepEqual(doc.doc.value(), deserialized_data.doc.value()); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize a Type 2 Binary object'] = function(test) { - var bin = new Binary(new Buffer('binstring'), Binary.SUBTYPE_BYTE_ARRAY); - var string = 'binstring'; - for(var index = 0; index < string.length; index++) { - bin.put(string.charAt(index)); - } - - var doc = {doc: bin}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var deserialized_data = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - - test.deepEqual(doc.doc.value(), deserialized_data.doc.value()); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize a big Binary object'] = function(test) { - var data = fs.readFileSync("test/node/data/test_gs_weird_bug.png", 'binary'); - var bin = new Binary(); - bin.write(data); - var doc = {doc: bin}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var deserialized_data = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - test.deepEqual(doc.doc.value(), deserialized_data.doc.value()); - test.done(); -} - -/** - * @ignore - */ -exports["Should Correctly Serialize and Deserialize DBRef"] = function(test) { - var oid = new ObjectID(); - var doc = {dbref: new DBRef('namespace', oid, null)}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var doc2 = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - test.equal("namespace", doc2.dbref.namespace); - test.deepEqual(doc2.dbref.oid.toHexString(), oid.toHexString()); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize partial DBRef'] = function(test) { - var id = new ObjectID(); - var doc = {'name':'something', 'user':{'$ref':'username', '$id': id}}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var doc2 = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - test.equal('something', doc2.name); - test.equal('username', doc2.user.namespace); - test.equal(id.toString(), doc2.user.oid.toString()); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize simple Int'] = function(test) { - var doc = {doc:2147483648}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var doc2 = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - test.deepEqual(doc.doc, doc2.doc) - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize Long Integer'] = function(test) { - var doc = {doc: Long.fromNumber(9223372036854775807)}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var deserialized_data = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - test.deepEqual(doc.doc, deserialized_data.doc); - - doc = {doc: Long.fromNumber(-9223372036854775)}; - serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - deserialized_data = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - test.deepEqual(doc.doc, deserialized_data.doc); - - doc = {doc: Long.fromNumber(-9223372036854775809)}; - serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - deserialized_data = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - test.deepEqual(doc.doc, deserialized_data.doc); - test.done(); -} - -/** - * @ignore - */ -exports['Should Deserialize Large Integers as Number not Long'] = function(test) { - function roundTrip(val) { - var doc = {doc: val}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var deserialized_data = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - test.deepEqual(doc.doc, deserialized_data.doc); - }; - - roundTrip(Math.pow(2,52)); - roundTrip(Math.pow(2,53) - 1); - roundTrip(Math.pow(2,53)); - roundTrip(-Math.pow(2,52)); - roundTrip(-Math.pow(2,53) + 1); - roundTrip(-Math.pow(2,53)); - roundTrip(Math.pow(2,65)); // Too big for Long. - roundTrip(-Math.pow(2,65)); - roundTrip(9223372036854775807); - roundTrip(1234567890123456800); // Bigger than 2^53, stays a double. - roundTrip(-1234567890123456800); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize Long Integer and Timestamp as different types'] = function(test) { - var long = Long.fromNumber(9223372036854775807); - var timestamp = Timestamp.fromNumber(9223372036854775807); - test.ok(long instanceof Long); - test.ok(!(long instanceof Timestamp)); - test.ok(timestamp instanceof Timestamp); - test.ok(!(timestamp instanceof Long)); - - var test_int = {doc: long, doc2: timestamp}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(test_int, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(test_int)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(test_int, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var deserialized_data = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - test.deepEqual(test_int.doc, deserialized_data.doc); - test.done(); -} - -/** - * @ignore - */ -exports['Should Always put the id as the first item in a hash'] = function(test) { - var hash = {doc: {not_id:1, '_id':2}}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(hash, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(hash)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(hash, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var deserialized_data = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - var keys = []; - - for(var name in deserialized_data.doc) { - keys.push(name); - } - - test.deepEqual(['not_id', '_id'], keys); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize a User defined Binary object'] = function(test) { - var bin = new Binary(); - bin.sub_type = BSON.BSON_BINARY_SUBTYPE_USER_DEFINED; - var string = 'binstring'; - for(var index = 0; index < string.length; index++) { - bin.put(string.charAt(index)); - } - - var doc = {doc: bin}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - var deserialized_data = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - - test.deepEqual(deserialized_data.doc.sub_type, BSON.BSON_BINARY_SUBTYPE_USER_DEFINED); - test.deepEqual(doc.doc.value(), deserialized_data.doc.value()); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correclty Serialize and Deserialize a Code object'] = function(test) { - var doc = {'doc': {'doc2': new Code('this.a > i', {i:1})}}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var deserialized_data = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - test.deepEqual(doc.doc.doc2.code, deserialized_data.doc.doc2.code); - test.deepEqual(doc.doc.doc2.scope.i, deserialized_data.doc.doc2.scope.i); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly serialize and deserialize and embedded array'] = function(test) { - var doc = {'a':0, - 'b':['tmp1', 'tmp2', 'tmp3', 'tmp4', 'tmp5', 'tmp6', 'tmp7', 'tmp8', 'tmp9', 'tmp10', 'tmp11', 'tmp12', 'tmp13', 'tmp14', 'tmp15', 'tmp16'] - }; - - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var deserialized_data = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - test.deepEqual(doc.a, deserialized_data.a); - test.deepEqual(doc.b, deserialized_data.b); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize UTF8'] = function(test) { - // Serialize utf8 - var doc = { "name" : "本荘由利地域に洪水警報", "name1" : "öüóőúéáűíÖÜÓŐÚÉÁŰÍ", "name2" : "abcdedede"}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var deserialized_data = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - test.deepEqual(doc, deserialized_data); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize query object'] = function(test) { - var doc = { count: 'remove_with_no_callback_bug_test', query: {}, fields: null}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var deserialized_data = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - test.deepEqual(doc, deserialized_data); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize empty query object'] = function(test) { - var doc = {}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var deserialized_data = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - test.deepEqual(doc, deserialized_data); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize array based doc'] = function(test) { - var doc = { b: [ 1, 2, 3 ], _id: new ObjectID() }; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var deserialized_data = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - test.deepEqual(doc.b, deserialized_data.b) - test.deepEqual(doc, deserialized_data); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize Symbol'] = function(test) { - if(Symbol != null) { - var doc = { b: [ new Symbol('test') ]}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var deserialized_data = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - test.deepEqual(doc.b, deserialized_data.b) - test.deepEqual(doc, deserialized_data); - test.ok(deserialized_data.b[0] instanceof Symbol); - } - - test.done(); -} - -/** - * @ignore - */ -exports['Should handle Deeply nested document'] = function(test) { - var doc = {a:{b:{c:{d:2}}}}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var deserialized_data = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - test.deepEqual(doc, deserialized_data); - test.done(); -} - -/** - * @ignore - */ -exports['Should handle complicated all typed object'] = function(test) { - // First doc - var date = new Date(); - var oid = new ObjectID(); - var string = 'binstring' - var bin = new Binary() - for(var index = 0; index < string.length; index++) { - bin.put(string.charAt(index)) - } - - var doc = { - 'string': 'hello', - 'array': [1,2,3], - 'hash': {'a':1, 'b':2}, - 'date': date, - 'oid': oid, - 'binary': bin, - 'int': 42, - 'float': 33.3333, - 'regexp': /regexp/, - 'boolean': true, - 'long': date.getTime(), - 'where': new Code('this.a > i', {i:1}), - 'dbref': new DBRef('namespace', oid, 'integration_tests_') - } - - // Second doc - var oid = new ObjectID.createFromHexString(oid.toHexString()); - var string = 'binstring' - var bin = new Binary() - for(var index = 0; index < string.length; index++) { - bin.put(string.charAt(index)) - } - - var doc2 = { - 'string': 'hello', - 'array': [1,2,3], - 'hash': {'a':1, 'b':2}, - 'date': date, - 'oid': oid, - 'binary': bin, - 'int': 42, - 'float': 33.3333, - 'regexp': /regexp/, - 'boolean': true, - 'long': date.getTime(), - 'where': new Code('this.a > i', {i:1}), - 'dbref': new DBRef('namespace', oid, 'integration_tests_') - } - - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var serialized_data2 = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc2, false, true); - - for(var i = 0; i < serialized_data2.length; i++) { - require('assert').equal(serialized_data2[i], serialized_data[i]) - } - - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize Complex Nested Object'] = function(test) { - var doc = { email: 'email@email.com', - encrypted_password: 'password', - friends: [ '4db96b973d01205364000006', - '4dc77b24c5ba38be14000002' ], - location: [ 72.4930088, 23.0431957 ], - name: 'Amit Kumar', - password_salt: 'salty', - profile_fields: [], - username: 'amit', - _id: new ObjectID() } - - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var doc2 = doc; - doc2._id = ObjectID.createFromHexString(doc2._id.toHexString()); - var serialized_data2 = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc2, false, true); - - for(var i = 0; i < serialized_data2.length; i++) { - require('assert').equal(serialized_data2[i], serialized_data[i]) - } - - test.done(); -} - -/** - * @ignore - */ -exports['Should correctly massive doc'] = function(test) { - var oid1 = new ObjectID(); - var oid2 = new ObjectID(); - - // JS doc - var doc = { dbref2: new DBRef('namespace', oid1, 'integration_tests_'), - _id: oid2 }; - - var doc2 = { dbref2: new DBRef('namespace', ObjectID.createFromHexString(oid1.toHexString()), 'integration_tests_'), - _id: new ObjectID.createFromHexString(oid2.toHexString()) }; - - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var serialized_data2 = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc2, false, true); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize/Deserialize regexp object'] = function(test) { - var doc = {'b':/foobaré/}; - - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var serialized_data2 = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - for(var i = 0; i < serialized_data2.length; i++) { - require('assert').equal(serialized_data2[i], serialized_data[i]) - } - - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize/Deserialize complicated object'] = function(test) { - var doc = {a:{b:{c:[new ObjectID(), new ObjectID()]}}, d:{f:1332.3323}}; - - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var doc2 = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - - test.deepEqual(doc, doc2) - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize/Deserialize nested object'] = function(test) { - var doc = { "_id" : { "date" : new Date(), "gid" : "6f35f74d2bea814e21000000" }, - "value" : { - "b" : { "countries" : { "--" : 386 }, "total" : 1599 }, - "bc" : { "countries" : { "--" : 3 }, "total" : 10 }, - "gp" : { "countries" : { "--" : 2 }, "total" : 13 }, - "mgc" : { "countries" : { "--" : 2 }, "total" : 14 } - } - } - - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var doc2 = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - - test.deepEqual(doc, doc2) - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize/Deserialize nested object with even more nesting'] = function(test) { - var doc = { "_id" : { "date" : {a:1, b:2, c:new Date()}, "gid" : "6f35f74d2bea814e21000000" }, - "value" : { - "b" : { "countries" : { "--" : 386 }, "total" : 1599 }, - "bc" : { "countries" : { "--" : 3 }, "total" : 10 }, - "gp" : { "countries" : { "--" : 2 }, "total" : 13 }, - "mgc" : { "countries" : { "--" : 2 }, "total" : 14 } - } - } - - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var doc2 = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - test.deepEqual(doc, doc2) - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize empty name object'] = function(test) { - var doc = {'':'test', - 'bbbb':1}; - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - var doc2 = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - test.equal(doc2[''], 'test'); - test.equal(doc2['bbbb'], 1); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly handle Forced Doubles to ensure we allocate enough space for cap collections'] = function(test) { - if(Double != null) { - var doubleValue = new Double(100); - var doc = {value:doubleValue}; - - // Serialize - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - - var doc2 = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - test.deepEqual({value:100}, doc2); - } - - test.done(); -} - -/** - * @ignore - */ -exports['Should deserialize correctly'] = function(test) { - var doc = { - "_id" : new ObjectID("4e886e687ff7ef5e00000162"), - "str" : "foreign", - "type" : 2, - "timestamp" : ISODate("2011-10-02T14:00:08.383Z"), - "links" : [ - "http://www.reddit.com/r/worldnews/comments/kybm0/uk_home_secretary_calls_for_the_scrapping_of_the/" - ] - } - - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - var doc2 = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - - test.deepEqual(doc, doc2) - test.done(); -} - -/** - * @ignore - */ -exports['Should correctly serialize and deserialize MinKey and MaxKey values'] = function(test) { - var doc = { - _id : new ObjectID("4e886e687ff7ef5e00000162"), - minKey : new MinKey(), - maxKey : new MaxKey() - } - - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - var doc2 = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - - test.deepEqual(doc, doc2) - test.ok(doc2.minKey instanceof MinKey); - test.ok(doc2.maxKey instanceof MaxKey); - test.done(); -} - -/** - * @ignore - */ -exports['Should correctly serialize Double value'] = function(test) { - var doc = { - value : new Double(34343.2222) - } - - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); - new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); - assertBuffersEqual(test, serialized_data, serialized_data2, 0); - var doc2 = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - - test.ok(doc.value.valueOf(), doc2.value); - test.ok(doc.value.value, doc2.value); - test.done(); -} - -/** - * @ignore - */ -exports['ObjectID should correctly create objects'] = function(test) { - try { - var object1 = ObjectID.createFromHexString('000000000000000000000001') - var object2 = ObjectID.createFromHexString('00000000000000000000001') - test.ok(false); - } catch(err) { - test.ok(err != null); - } - - test.done(); -} - -/** - * @ignore - */ -exports['ObjectID should correctly retrieve timestamp'] = function(test) { - var testDate = new Date(); - var object1 = new ObjectID(); - test.equal(Math.floor(testDate.getTime()/1000), Math.floor(object1.getTimestamp().getTime()/1000)); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly throw error on bsonparser errors'] = function(test) { - var data = new Buffer(3); - var parser = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]); - - // Catch to small buffer error - try { - parser.deserialize(data); - test.ok(false); - } catch(err) {} - - data = new Buffer(5); - data[0] = 0xff; - data[1] = 0xff; - // Catch illegal size - try { - parser.deserialize(data); - test.ok(false); - } catch(err) {} - - // Finish up - test.done(); -} - -/** - * A simple example showing the usage of BSON.calculateObjectSize function returning the number of BSON bytes a javascript object needs. - * - * @_class bson - * @_function BSON.calculateObjectSize - * @ignore - */ -exports['Should correctly calculate the size of a given javascript object'] = function(test) { - // Create a simple object - var doc = {a: 1, func:function(){}} - // Calculate the size of the object without serializing the function - var size = BSON.calculateObjectSize(doc, false); - test.equal(12, size); - // Calculate the size of the object serializing the function - size = BSON.calculateObjectSize(doc, true); - // Validate the correctness - test.equal(36, size); - test.done(); -} - -/** - * A simple example showing the usage of BSON.calculateObjectSize function returning the number of BSON bytes a javascript object needs. - * - * @_class bson - * @_function calculateObjectSize - * @ignore - */ -exports['Should correctly calculate the size of a given javascript object using instance method'] = function(test) { - // Create a simple object - var doc = {a: 1, func:function(){}} - // Create a BSON parser instance - var bson = new BSON(); - // Calculate the size of the object without serializing the function - var size = bson.calculateObjectSize(doc, false); - test.equal(12, size); - // Calculate the size of the object serializing the function - size = bson.calculateObjectSize(doc, true); - // Validate the correctness - test.equal(36, size); - test.done(); -} - -/** - * A simple example showing the usage of BSON.serializeWithBufferAndIndex function. - * - * @_class bson - * @_function BSON.serializeWithBufferAndIndex - * @ignore - */ -exports['Should correctly serializeWithBufferAndIndex a given javascript object'] = function(test) { - // Create a simple object - var doc = {a: 1, func:function(){}} - // Calculate the size of the document, no function serialization - var size = BSON.calculateObjectSize(doc, false); - // Allocate a buffer - var buffer = new Buffer(size); - // Serialize the object to the buffer, checking keys and not serializing functions - var index = BSON.serializeWithBufferAndIndex(doc, true, buffer, 0, false); - // Validate the correctness - test.equal(12, size); - test.equal(11, index); - - // Serialize with functions - // Calculate the size of the document, no function serialization - var size = BSON.calculateObjectSize(doc, true); - // Allocate a buffer - var buffer = new Buffer(size); - // Serialize the object to the buffer, checking keys and not serializing functions - var index = BSON.serializeWithBufferAndIndex(doc, true, buffer, 0, true); - // Validate the correctness - test.equal(36, size); - test.equal(35, index); - test.done(); -} - -/** - * A simple example showing the usage of BSON.serializeWithBufferAndIndex function. - * - * @_class bson - * @_function serializeWithBufferAndIndex - * @ignore - */ -exports['Should correctly serializeWithBufferAndIndex a given javascript object using a BSON instance'] = function(test) { - // Create a simple object - var doc = {a: 1, func:function(){}} - // Create a BSON parser instance - var bson = new BSON(); - // Calculate the size of the document, no function serialization - var size = bson.calculateObjectSize(doc, false); - // Allocate a buffer - var buffer = new Buffer(size); - // Serialize the object to the buffer, checking keys and not serializing functions - var index = bson.serializeWithBufferAndIndex(doc, true, buffer, 0, false); - // Validate the correctness - test.equal(12, size); - test.equal(11, index); - - // Serialize with functions - // Calculate the size of the document, no function serialization - var size = bson.calculateObjectSize(doc, true); - // Allocate a buffer - var buffer = new Buffer(size); - // Serialize the object to the buffer, checking keys and not serializing functions - var index = bson.serializeWithBufferAndIndex(doc, true, buffer, 0, true); - // Validate the correctness - test.equal(36, size); - test.equal(35, index); - test.done(); -} - -/** - * A simple example showing the usage of BSON.serialize function returning serialized BSON Buffer object. - * - * @_class bson - * @_function BSON.serialize - * @ignore - */ -exports['Should correctly serialize a given javascript object'] = function(test) { - // Create a simple object - var doc = {a: 1, func:function(){}} - // Serialize the object to a buffer, checking keys and not serializing functions - var buffer = BSON.serialize(doc, true, true, false); - // Validate the correctness - test.equal(12, buffer.length); - - // Serialize the object to a buffer, checking keys and serializing functions - var buffer = BSON.serialize(doc, true, true, true); - // Validate the correctness - test.equal(36, buffer.length); - test.done(); -} - -/** - * A simple example showing the usage of BSON.serialize function returning serialized BSON Buffer object. - * - * @_class bson - * @_function serialize - * @ignore - */ -exports['Should correctly serialize a given javascript object using a bson instance'] = function(test) { - // Create a simple object - var doc = {a: 1, func:function(){}} - // Create a BSON parser instance - var bson = new BSON(); - // Serialize the object to a buffer, checking keys and not serializing functions - var buffer = bson.serialize(doc, true, true, false); - // Validate the correctness - test.equal(12, buffer.length); - - // Serialize the object to a buffer, checking keys and serializing functions - var buffer = bson.serialize(doc, true, true, true); - // Validate the correctness - test.equal(36, buffer.length); - test.done(); -} - -/** - * A simple example showing the usage of BSON.deserialize function returning a deserialized Javascript function. - * - * @_class bson - * @_function BSON.deserialize - * @ignore - */ - exports['Should correctly deserialize a buffer using the BSON class level parser'] = function(test) { - // Create a simple object - var doc = {a: 1, func:function(){ console.log('hello world'); }} - // Serialize the object to a buffer, checking keys and serializing functions - var buffer = BSON.serialize(doc, true, true, true); - // Validate the correctness - test.equal(65, buffer.length); - - // Deserialize the object with no eval for the functions - var deserializedDoc = BSON.deserialize(buffer); - // Validate the correctness - test.equal('object', typeof deserializedDoc.func); - test.equal(1, deserializedDoc.a); - - // Deserialize the object with eval for the functions caching the functions - deserializedDoc = BSON.deserialize(buffer, {evalFunctions:true, cacheFunctions:true}); - // Validate the correctness - test.equal('function', typeof deserializedDoc.func); - test.equal(1, deserializedDoc.a); - test.done(); -} - -/** - * A simple example showing the usage of BSON instance deserialize function returning a deserialized Javascript function. - * - * @_class bson - * @_function deserialize - * @ignore - */ -exports['Should correctly deserialize a buffer using the BSON instance parser'] = function(test) { - // Create a simple object - var doc = {a: 1, func:function(){ console.log('hello world'); }} - // Create a BSON parser instance - var bson = new BSON(); - // Serialize the object to a buffer, checking keys and serializing functions - var buffer = bson.serialize(doc, true, true, true); - // Validate the correctness - test.equal(65, buffer.length); - - // Deserialize the object with no eval for the functions - var deserializedDoc = bson.deserialize(buffer); - // Validate the correctness - test.equal('object', typeof deserializedDoc.func); - test.equal(1, deserializedDoc.a); - - // Deserialize the object with eval for the functions caching the functions - deserializedDoc = bson.deserialize(buffer, {evalFunctions:true, cacheFunctions:true}); - // Validate the correctness - test.equal('function', typeof deserializedDoc.func); - test.equal(1, deserializedDoc.a); - test.done(); -} - -/** - * A simple example showing the usage of BSON.deserializeStream function returning deserialized Javascript objects. - * - * @_class bson - * @_function BSON.deserializeStream - * @ignore - */ -exports['Should correctly deserializeStream a buffer object'] = function(test) { - // Create a simple object - var doc = {a: 1, func:function(){ console.log('hello world'); }} - // Serialize the object to a buffer, checking keys and serializing functions - var buffer = BSON.serialize(doc, true, true, true); - // Validate the correctness - test.equal(65, buffer.length); - - // The array holding the number of retuned documents - var documents = new Array(1); - // Deserialize the object with no eval for the functions - var index = BSON.deserializeStream(buffer, 0, 1, documents, 0); - // Validate the correctness - test.equal(65, index); - test.equal(1, documents.length); - test.equal(1, documents[0].a); - test.equal('object', typeof documents[0].func); - - // Deserialize the object with eval for the functions caching the functions - // The array holding the number of retuned documents - var documents = new Array(1); - // Deserialize the object with no eval for the functions - var index = BSON.deserializeStream(buffer, 0, 1, documents, 0, {evalFunctions:true, cacheFunctions:true}); - // Validate the correctness - test.equal(65, index); - test.equal(1, documents.length); - test.equal(1, documents[0].a); - test.equal('function', typeof documents[0].func); - test.done(); -} - -/** - * A simple example showing the usage of BSON instance deserializeStream function returning deserialized Javascript objects. - * - * @_class bson - * @_function deserializeStream - * @ignore - */ -exports['Should correctly deserializeStream a buffer object'] = function(test) { - // Create a simple object - var doc = {a: 1, func:function(){ console.log('hello world'); }} - // Create a BSON parser instance - var bson = new BSON(); - // Serialize the object to a buffer, checking keys and serializing functions - var buffer = bson.serialize(doc, true, true, true); - // Validate the correctness - test.equal(65, buffer.length); - - // The array holding the number of retuned documents - var documents = new Array(1); - // Deserialize the object with no eval for the functions - var index = bson.deserializeStream(buffer, 0, 1, documents, 0); - // Validate the correctness - test.equal(65, index); - test.equal(1, documents.length); - test.equal(1, documents[0].a); - test.equal('object', typeof documents[0].func); - - // Deserialize the object with eval for the functions caching the functions - // The array holding the number of retuned documents - var documents = new Array(1); - // Deserialize the object with no eval for the functions - var index = bson.deserializeStream(buffer, 0, 1, documents, 0, {evalFunctions:true, cacheFunctions:true}); - // Validate the correctness - test.equal(65, index); - test.equal(1, documents.length); - test.equal(1, documents[0].a); - test.equal('function', typeof documents[0].func); - test.done(); -} - -/** - * @ignore - */ -exports['ObjectID should have a correct cached representation of the hexString'] = function (test) { - ObjectID.cacheHexString = true; - var a = new ObjectID; - var __id = a.__id; - test.equal(__id, a.toHexString()); - - // hexString - a = new ObjectID(__id); - test.equal(__id, a.toHexString()); - - // fromHexString - a = ObjectID.createFromHexString(__id); - test.equal(a.__id, a.toHexString()); - test.equal(__id, a.toHexString()); - - // number - var genTime = a.generationTime; - a = new ObjectID(genTime); - __id = a.__id; - test.equal(__id, a.toHexString()); - - // generationTime - delete a.__id; - a.generationTime = genTime; - test.equal(__id, a.toHexString()); - - // createFromTime - a = ObjectId.createFromTime(genTime); - __id = a.__id; - test.equal(__id, a.toHexString()); - ObjectId.cacheHexString = false; - - test.done(); -} - -/** - * @ignore - */ -// 'Should Correctly Function' = function(test) { -// var doc = {b:1, func:function() { -// this.b = 2; -// }}; -// -// var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); -// -// debug("----------------------------------------------------------------------") -// debug(inspect(serialized_data)) -// -// // var serialized_data2 = new Buffer(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).calculateObjectSize(doc, false, true)); -// // new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serializeWithBufferAndIndex(doc, false, serialized_data2, 0); -// // assertBuffersEqual(test, serialized_data, serialized_data2, 0); -// var COUNT = 100000; -// -// // var b = null; -// // eval("b = function(x) { return x+x; }"); -// // var b = new Function("x", "return x+x;"); -// -// console.log(COUNT + "x (objectBSON = BSON.serialize(object))") -// start = new Date -// -// for (i=COUNT; --i>=0; ) { -// var doc2 = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data, {evalFunctions: true, cacheFunctions:true}); -// } -// -// end = new Date -// console.log("time = ", end - start, "ms -", COUNT * 1000 / (end - start), " ops/sec") -// -// // debug(inspect(new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).functionCache)) -// // -// // var doc2 = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data, {evalFunctions: true, cacheFunctions:true}); -// // // test.deepEqual(doc, doc2) -// // // -// // debug(inspect(doc2)) -// // doc2.func() -// // debug(inspect(doc2)) -// // -// // var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc2, false, true); -// // var doc3 = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data, {evalFunctions: true, cacheFunctions:true}); -// // -// // debug("-----------------------------------------------") -// // debug(inspect(doc3)) -// -// // var key = "0" -// // for(var i = 1; i < 10000; i++) { -// // key = key + " " + i -// // } -// -// test.done(); -// -// -// // var car = { -// // model : "Volvo", -// // country : "Sweden", -// // -// // isSwedish : function() { -// // return this.country == "Sweden"; -// // } -// // } -// -// }, - -/** - * Retrieve the server information for the current - * instance of the db client - * - * @ignore - */ -exports.noGlobalsLeaked = function(test) { - var leaks = gleak.detectNew(); - test.equal(0, leaks.length, "global var leak detected: " + leaks.join(', ')); - test.done(); -} diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/bson_typed_array_test.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/bson_typed_array_test.js deleted file mode 100644 index cde83f8..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/bson_typed_array_test.js +++ /dev/null @@ -1,392 +0,0 @@ -var mongodb = require('../../lib/bson').pure(); - -var testCase = require('nodeunit').testCase, - mongoO = require('../../lib/bson').pure(), - debug = require('util').debug, - inspect = require('util').inspect, - Buffer = require('buffer').Buffer, - gleak = require('../../tools/gleak'), - fs = require('fs'), - BSON = mongoO.BSON, - Code = mongoO.Code, - Binary = mongoO.Binary, - Timestamp = mongoO.Timestamp, - Long = mongoO.Long, - MongoReply = mongoO.MongoReply, - ObjectID = mongoO.ObjectID, - Symbol = mongoO.Symbol, - DBRef = mongoO.DBRef, - Double = mongoO.Double, - MinKey = mongoO.MinKey, - MaxKey = mongoO.MaxKey, - BinaryParser = mongoO.BinaryParser, - utils = require('./tools/utils'); - -var BSONSE = mongodb, - BSONDE = mongodb; - -// for tests -BSONDE.BSON_BINARY_SUBTYPE_DEFAULT = 0; -BSONDE.BSON_BINARY_SUBTYPE_FUNCTION = 1; -BSONDE.BSON_BINARY_SUBTYPE_BYTE_ARRAY = 2; -BSONDE.BSON_BINARY_SUBTYPE_UUID = 3; -BSONDE.BSON_BINARY_SUBTYPE_MD5 = 4; -BSONDE.BSON_BINARY_SUBTYPE_USER_DEFINED = 128; - -BSONSE.BSON_BINARY_SUBTYPE_DEFAULT = 0; -BSONSE.BSON_BINARY_SUBTYPE_FUNCTION = 1; -BSONSE.BSON_BINARY_SUBTYPE_BYTE_ARRAY = 2; -BSONSE.BSON_BINARY_SUBTYPE_UUID = 3; -BSONSE.BSON_BINARY_SUBTYPE_MD5 = 4; -BSONSE.BSON_BINARY_SUBTYPE_USER_DEFINED = 128; - -var hexStringToBinary = function(string) { - var numberofValues = string.length / 2; - var array = ""; - - for(var i = 0; i < numberofValues; i++) { - array += String.fromCharCode(parseInt(string[i*2] + string[i*2 + 1], 16)); - } - return array; -} - -var assertBuffersEqual = function(test, buffer1, buffer2) { - if(buffer1.length != buffer2.length) test.fail("Buffers do not have the same length", buffer1, buffer2); - - for(var i = 0; i < buffer1.length; i++) { - test.equal(buffer1[i], buffer2[i]); - } -} - -/** - * Module for parsing an ISO 8601 formatted string into a Date object. - */ -var ISODate = function (string) { - var match; - - if (typeof string.getTime === "function") - return string; - else if (match = string.match(/^(\d{4})(-(\d{2})(-(\d{2})(T(\d{2}):(\d{2})(:(\d{2})(\.(\d+))?)?(Z|((\+|-)(\d{2}):(\d{2}))))?)?)?$/)) { - var date = new Date(); - date.setUTCFullYear(Number(match[1])); - date.setUTCMonth(Number(match[3]) - 1 || 0); - date.setUTCDate(Number(match[5]) || 0); - date.setUTCHours(Number(match[7]) || 0); - date.setUTCMinutes(Number(match[8]) || 0); - date.setUTCSeconds(Number(match[10]) || 0); - date.setUTCMilliseconds(Number("." + match[12]) * 1000 || 0); - - if (match[13] && match[13] !== "Z") { - var h = Number(match[16]) || 0, - m = Number(match[17]) || 0; - - h *= 3600000; - m *= 60000; - - var offset = h + m; - if (match[15] == "+") - offset = -offset; - - date = new Date(date.valueOf() + offset); - } - - return date; - } else - throw new Error("Invalid ISO 8601 date given.", __filename); -}; - -/** - * Retrieve the server information for the current - * instance of the db client - * - * @ignore - */ -exports.setUp = function(callback) { - callback(); -} - -/** - * Retrieve the server information for the current - * instance of the db client - * - * @ignore - */ -exports.tearDown = function(callback) { - callback(); -} - -/** - * @ignore - */ -exports.shouldCorrectlyDeserializeUsingTypedArray = function(test) { - if(typeof ArrayBuffer == 'undefined') { - test.done(); - return; - } - - var motherOfAllDocuments = { - 'string': '客家话', - 'array': [1,2,3], - 'hash': {'a':1, 'b':2}, - 'date': new Date(), - 'oid': new ObjectID(), - 'binary': new Binary(new Buffer("hello")), - 'int': 42, - 'float': 33.3333, - 'regexp': /regexp/, - 'boolean': true, - 'long': Long.fromNumber(100), - 'where': new Code('this.a > i', {i:1}), - 'dbref': new DBRef('namespace', new ObjectID(), 'integration_tests_'), - 'minkey': new MinKey(), - 'maxkey': new MaxKey() - } - - // Let's serialize it - var data = BSONSE.BSON.serialize(motherOfAllDocuments, true, true, false); - // Build a typed array - var arr = new Uint8Array(new ArrayBuffer(data.length)); - // Iterate over all the fields and copy - for(var i = 0; i < data.length; i++) { - arr[i] = data[i] - } - - // Deserialize the object - var object = BSONDE.BSON.deserialize(arr); - // Asserts - test.equal(motherOfAllDocuments.string, object.string); - test.deepEqual(motherOfAllDocuments.array, object.array); - test.deepEqual(motherOfAllDocuments.date, object.date); - test.deepEqual(motherOfAllDocuments.oid.toHexString(), object.oid.toHexString()); - test.deepEqual(motherOfAllDocuments.binary.length(), object.binary.length()); - // Assert the values of the binary - for(var i = 0; i < motherOfAllDocuments.binary.length(); i++) { - test.equal(motherOfAllDocuments.binary.value[i], object.binary[i]); - } - test.deepEqual(motherOfAllDocuments.int, object.int); - test.deepEqual(motherOfAllDocuments.float, object.float); - test.deepEqual(motherOfAllDocuments.regexp, object.regexp); - test.deepEqual(motherOfAllDocuments.boolean, object.boolean); - test.deepEqual(motherOfAllDocuments.long.toNumber(), object.long); - test.deepEqual(motherOfAllDocuments.where, object.where); - test.deepEqual(motherOfAllDocuments.dbref.oid.toHexString(), object.dbref.oid.toHexString()); - test.deepEqual(motherOfAllDocuments.dbref.namespace, object.dbref.namespace); - test.deepEqual(motherOfAllDocuments.dbref.db, object.dbref.db); - test.deepEqual(motherOfAllDocuments.minkey, object.minkey); - test.deepEqual(motherOfAllDocuments.maxkey, object.maxkey); - test.done(); -} - -/** - * @ignore - */ -exports.shouldCorrectlySerializeUsingTypedArray = function(test) { - if(typeof ArrayBuffer == 'undefined') { - test.done(); - return; - } - - var motherOfAllDocuments = { - 'string': 'hello', - 'array': [1,2,3], - 'hash': {'a':1, 'b':2}, - 'date': new Date(), - 'oid': new ObjectID(), - 'binary': new Binary(new Buffer("hello")), - 'int': 42, - 'float': 33.3333, - 'regexp': /regexp/, - 'boolean': true, - 'long': Long.fromNumber(100), - 'where': new Code('this.a > i', {i:1}), - 'dbref': new DBRef('namespace', new ObjectID(), 'integration_tests_'), - 'minkey': new MinKey(), - 'maxkey': new MaxKey() - } - - // Let's serialize it - var data = BSONSE.BSON.serialize(motherOfAllDocuments, true, false, false); - // And deserialize it again - var object = BSONSE.BSON.deserialize(data); - // Asserts - test.equal(motherOfAllDocuments.string, object.string); - test.deepEqual(motherOfAllDocuments.array, object.array); - test.deepEqual(motherOfAllDocuments.date, object.date); - test.deepEqual(motherOfAllDocuments.oid.toHexString(), object.oid.toHexString()); - test.deepEqual(motherOfAllDocuments.binary.length(), object.binary.length()); - // Assert the values of the binary - for(var i = 0; i < motherOfAllDocuments.binary.length(); i++) { - test.equal(motherOfAllDocuments.binary.value[i], object.binary[i]); - } - test.deepEqual(motherOfAllDocuments.int, object.int); - test.deepEqual(motherOfAllDocuments.float, object.float); - test.deepEqual(motherOfAllDocuments.regexp, object.regexp); - test.deepEqual(motherOfAllDocuments.boolean, object.boolean); - test.deepEqual(motherOfAllDocuments.long.toNumber(), object.long); - test.deepEqual(motherOfAllDocuments.where, object.where); - test.deepEqual(motherOfAllDocuments.dbref.oid.toHexString(), object.dbref.oid.toHexString()); - test.deepEqual(motherOfAllDocuments.dbref.namespace, object.dbref.namespace); - test.deepEqual(motherOfAllDocuments.dbref.db, object.dbref.db); - test.deepEqual(motherOfAllDocuments.minkey, object.minkey); - test.deepEqual(motherOfAllDocuments.maxkey, object.maxkey); - test.done(); -} - -/** - * @ignore - */ -exports['exercise all the binary object constructor methods'] = function (test) { - if(typeof ArrayBuffer == 'undefined') { - test.done(); - return; - } - - // Construct using array - var string = 'hello world'; - // String to array - var array = utils.stringToArrayBuffer(string); - - // Binary from array buffer - var binary = new Binary(utils.stringToArrayBuffer(string)); - test.ok(string.length, binary.buffer.length); - test.ok(utils.assertArrayEqual(array, binary.buffer)); - - // Construct using number of chars - binary = new Binary(5); - test.ok(5, binary.buffer.length); - - // Construct using an Array - var binary = new Binary(utils.stringToArray(string)); - test.ok(string.length, binary.buffer.length); - test.ok(utils.assertArrayEqual(array, binary.buffer)); - - // Construct using a string - var binary = new Binary(string); - test.ok(string.length, binary.buffer.length); - test.ok(utils.assertArrayEqual(array, binary.buffer)); - test.done(); -}; - -/** - * @ignore - */ -exports['exercise the put binary object method for an instance when using Uint8Array'] = function (test) { - if(typeof ArrayBuffer == 'undefined') { - test.done(); - return; - } - - // Construct using array - var string = 'hello world'; - // String to array - var array = utils.stringToArrayBuffer(string + 'a'); - - // Binary from array buffer - var binary = new Binary(utils.stringToArrayBuffer(string)); - test.ok(string.length, binary.buffer.length); - - // Write a byte to the array - binary.put('a') - - // Verify that the data was writtencorrectly - test.equal(string.length + 1, binary.position); - test.ok(utils.assertArrayEqual(array, binary.value(true))); - test.equal('hello worlda', binary.value()); - - // Exercise a binary with lots of space in the buffer - var binary = new Binary(); - test.ok(Binary.BUFFER_SIZE, binary.buffer.length); - - // Write a byte to the array - binary.put('a') - - // Verify that the data was writtencorrectly - test.equal(1, binary.position); - test.ok(utils.assertArrayEqual(['a'.charCodeAt(0)], binary.value(true))); - test.equal('a', binary.value()); - test.done(); -}, - -/** - * @ignore - */ -exports['exercise the write binary object method for an instance when using Uint8Array'] = function (test) { - if(typeof ArrayBuffer == 'undefined') { - test.done(); - return; - } - - // Construct using array - var string = 'hello world'; - // Array - var writeArrayBuffer = new Uint8Array(new ArrayBuffer(1)); - writeArrayBuffer[0] = 'a'.charCodeAt(0); - var arrayBuffer = ['a'.charCodeAt(0)]; - - // Binary from array buffer - var binary = new Binary(utils.stringToArrayBuffer(string)); - test.ok(string.length, binary.buffer.length); - - // Write a string starting at end of buffer - binary.write('a'); - test.equal('hello worlda', binary.value()); - // Write a string starting at index 0 - binary.write('a', 0); - test.equal('aello worlda', binary.value()); - // Write a arraybuffer starting at end of buffer - binary.write(writeArrayBuffer); - test.equal('aello worldaa', binary.value()); - // Write a arraybuffer starting at position 5 - binary.write(writeArrayBuffer, 5); - test.equal('aelloaworldaa', binary.value()); - // Write a array starting at end of buffer - binary.write(arrayBuffer); - test.equal('aelloaworldaaa', binary.value()); - // Write a array starting at position 6 - binary.write(arrayBuffer, 6); - test.equal('aelloaaorldaaa', binary.value()); - test.done(); -}, - -/** - * @ignore - */ -exports['exercise the read binary object method for an instance when using Uint8Array'] = function (test) { - if(typeof ArrayBuffer == 'undefined') { - test.done(); - return; - } - - // Construct using array - var string = 'hello world'; - var array = utils.stringToArrayBuffer(string); - - // Binary from array buffer - var binary = new Binary(utils.stringToArrayBuffer(string)); - test.ok(string.length, binary.buffer.length); - - // Read the first 2 bytes - var data = binary.read(0, 2); - test.ok(utils.assertArrayEqual(utils.stringToArrayBuffer('he'), data)); - - // Read the entire field - var data = binary.read(0); - test.ok(utils.assertArrayEqual(utils.stringToArrayBuffer(string), data)); - - // Read 3 bytes - var data = binary.read(6, 5); - test.ok(utils.assertArrayEqual(utils.stringToArrayBuffer('world'), data)); - test.done(); -} - -/** - * Retrieve the server information for the current - * instance of the db client - * - * @ignore - */ -exports.noGlobalsLeaked = function(test) { - var leaks = gleak.detectNew(); - test.equal(0, leaks.length, "global var leak detected: " + leaks.join(', ')); - test.done(); -} \ No newline at end of file diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/data/test_gs_weird_bug.png b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/data/test_gs_weird_bug.png deleted file mode 100644 index 1554dc3238dc94f4c8375b17b4b8d34a337d9c1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52184 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 diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/test_full_bson.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/test_full_bson.js deleted file mode 100644 index 7a78347..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/test_full_bson.js +++ /dev/null @@ -1,315 +0,0 @@ -var sys = require('util'), - fs = require('fs'), - BSON = require('../../ext').BSON, - Buffer = require('buffer').Buffer, - BSONJS = require('../../lib/bson/bson').BSON, - BinaryParser = require('../../lib/bson/binary_parser').BinaryParser, - Long = require('../../lib/bson/long').Long, - ObjectID = require('../../lib/bson/bson').ObjectID, - Binary = require('../../lib/bson/bson').Binary, - Code = require('../../lib/bson/bson').Code, - DBRef = require('../../lib/bson/bson').DBRef, - Symbol = require('../../lib/bson/bson').Symbol, - Double = require('../../lib/bson/bson').Double, - MaxKey = require('../../lib/bson/bson').MaxKey, - MinKey = require('../../lib/bson/bson').MinKey, - Timestamp = require('../../lib/bson/bson').Timestamp, - gleak = require('../../tools/gleak'), - assert = require('assert'); - -// Parsers -var bsonC = new BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]); -var bsonJS = new BSONJS([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]); - -/** - * Retrieve the server information for the current - * instance of the db client - * - * @ignore - */ -exports.setUp = function(callback) { - callback(); -} - -/** - * Retrieve the server information for the current - * instance of the db client - * - * @ignore - */ -exports.tearDown = function(callback) { - callback(); -} - -/** - * @ignore - */ -exports['Should Correctly Deserialize object'] = function(test) { - var bytes = [95,0,0,0,2,110,115,0,42,0,0,0,105,110,116,101,103,114,97,116,105,111,110,95,116,101,115,116,115,95,46,116,101,115,116,95,105,110,100,101,120,95,105,110,102,111,114,109,97,116,105,111,110,0,8,117,110,105,113,117,101,0,0,3,107,101,121,0,12,0,0,0,16,97,0,1,0,0,0,0,2,110,97,109,101,0,4,0,0,0,97,95,49,0,0]; - var serialized_data = ''; - // Convert to chars - for(var i = 0; i < bytes.length; i++) { - serialized_data = serialized_data + BinaryParser.fromByte(bytes[i]); - } - - var object = bsonC.deserialize(serialized_data); - assert.equal("a_1", object.name); - assert.equal(false, object.unique); - assert.equal(1, object.key.a); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Deserialize object with all types'] = function(test) { - var bytes = [26,1,0,0,7,95,105,100,0,161,190,98,75,118,169,3,0,0,3,0,0,4,97,114,114,97,121,0,26,0,0,0,16,48,0,1,0,0,0,16,49,0,2,0,0,0,16,50,0,3,0,0,0,0,2,115,116,114,105,110,103,0,6,0,0,0,104,101,108,108,111,0,3,104,97,115,104,0,19,0,0,0,16,97,0,1,0,0,0,16,98,0,2,0,0,0,0,9,100,97,116,101,0,161,190,98,75,0,0,0,0,7,111,105,100,0,161,190,98,75,90,217,18,0,0,1,0,0,5,98,105,110,97,114,121,0,7,0,0,0,2,3,0,0,0,49,50,51,16,105,110,116,0,42,0,0,0,1,102,108,111,97,116,0,223,224,11,147,169,170,64,64,11,114,101,103,101,120,112,0,102,111,111,98,97,114,0,105,0,8,98,111,111,108,101,97,110,0,1,15,119,104,101,114,101,0,25,0,0,0,12,0,0,0,116,104,105,115,46,120,32,61,61,32,51,0,5,0,0,0,0,3,100,98,114,101,102,0,37,0,0,0,2,36,114,101,102,0,5,0,0,0,116,101,115,116,0,7,36,105,100,0,161,190,98,75,2,180,1,0,0,2,0,0,0,10,110,117,108,108,0,0]; - var serialized_data = ''; - // Convert to chars - for(var i = 0; i < bytes.length; i++) { - serialized_data = serialized_data + BinaryParser.fromByte(bytes[i]); - } - - var object = bsonJS.deserialize(new Buffer(serialized_data, 'binary')); - assert.equal("hello", object.string); - assert.deepEqual([1, 2, 3], object.array); - assert.equal(1, object.hash.a); - assert.equal(2, object.hash.b); - assert.ok(object.date != null); - assert.ok(object.oid != null); - assert.ok(object.binary != null); - assert.equal(42, object.int); - assert.equal(33.3333, object.float); - assert.ok(object.regexp != null); - assert.equal(true, object.boolean); - assert.ok(object.where != null); - assert.ok(object.dbref != null); - assert.ok(object['null'] == null); - test.done(); -} - -/** - * @ignore - */ -exports['Should Serialize and Deserialize String'] = function(test) { - var test_string = {hello: 'world'} - var serialized_data = bsonC.serialize(test_string) - assert.deepEqual(test_string, bsonC.deserialize(serialized_data)); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize Integer'] = function(test) { - var test_number = {doc: 5} - var serialized_data = bsonC.serialize(test_number) - assert.deepEqual(test_number, bsonC.deserialize(serialized_data)); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize null value'] = function(test) { - var test_null = {doc:null} - var serialized_data = bsonC.serialize(test_null) - var object = bsonC.deserialize(serialized_data); - assert.deepEqual(test_null, object); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize undefined value'] = function(test) { - var test_undefined = {doc:undefined} - var serialized_data = bsonC.serialize(test_undefined) - var object = bsonJS.deserialize(new Buffer(serialized_data, 'binary')); - assert.equal(null, object.doc) - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize Number'] = function(test) { - var test_number = {doc: 5.5} - var serialized_data = bsonC.serialize(test_number) - assert.deepEqual(test_number, bsonC.deserialize(serialized_data)); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize Integer'] = function(test) { - var test_int = {doc: 42} - var serialized_data = bsonC.serialize(test_int) - assert.deepEqual(test_int, bsonC.deserialize(serialized_data)); - - test_int = {doc: -5600} - serialized_data = bsonC.serialize(test_int) - assert.deepEqual(test_int, bsonC.deserialize(serialized_data)); - - test_int = {doc: 2147483647} - serialized_data = bsonC.serialize(test_int) - assert.deepEqual(test_int, bsonC.deserialize(serialized_data)); - - test_int = {doc: -2147483648} - serialized_data = bsonC.serialize(test_int) - assert.deepEqual(test_int, bsonC.deserialize(serialized_data)); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize Object'] = function(test) { - var doc = {doc: {age: 42, name: 'Spongebob', shoe_size: 9.5}} - var serialized_data = bsonC.serialize(doc) - assert.deepEqual(doc, bsonC.deserialize(serialized_data)); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize Array'] = function(test) { - var doc = {doc: [1, 2, 'a', 'b']} - var serialized_data = bsonC.serialize(doc) - assert.deepEqual(doc, bsonC.deserialize(serialized_data)); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize Array with added on functions'] = function(test) { - var doc = {doc: [1, 2, 'a', 'b']} - var serialized_data = bsonC.serialize(doc) - assert.deepEqual(doc, bsonC.deserialize(serialized_data)); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize A Boolean'] = function(test) { - var doc = {doc: true} - var serialized_data = bsonC.serialize(doc) - assert.deepEqual(doc, bsonC.deserialize(serialized_data)); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize a Date'] = function(test) { - var date = new Date() - //(2009, 11, 12, 12, 00, 30) - date.setUTCDate(12) - date.setUTCFullYear(2009) - date.setUTCMonth(11 - 1) - date.setUTCHours(12) - date.setUTCMinutes(0) - date.setUTCSeconds(30) - var doc = {doc: date} - var serialized_data = bsonC.serialize(doc) - assert.deepEqual(doc, bsonC.deserialize(serialized_data)); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize Oid'] = function(test) { - var doc = {doc: new ObjectID()} - var serialized_data = bsonC.serialize(doc) - assert.deepEqual(doc.doc.toHexString(), bsonC.deserialize(serialized_data).doc.toHexString()) - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize Buffer'] = function(test) { - var doc = {doc: new Buffer("123451234512345")} - var serialized_data = bsonC.serialize(doc) - - assert.equal("123451234512345", bsonC.deserialize(serialized_data).doc.buffer.toString('ascii')); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly encode Empty Hash'] = function(test) { - var test_code = {} - var serialized_data = bsonC.serialize(test_code) - assert.deepEqual(test_code, bsonC.deserialize(serialized_data)); - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize Ordered Hash'] = function(test) { - var doc = {doc: {b:1, a:2, c:3, d:4}} - var serialized_data = bsonC.serialize(doc) - var decoded_hash = bsonC.deserialize(serialized_data).doc - var keys = [] - for(var name in decoded_hash) keys.push(name) - assert.deepEqual(['b', 'a', 'c', 'd'], keys) - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize Regular Expression'] = function(test) { - var doc = {doc: /foobar/mi} - var serialized_data = bsonC.serialize(doc) - var doc2 = bsonC.deserialize(serialized_data); - assert.equal(doc.doc.toString(), doc2.doc.toString()) - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize a Binary object'] = function(test) { - var bin = new Binary() - var string = 'binstring' - for(var index = 0; index < string.length; index++) { - bin.put(string.charAt(index)) - } - var doc = {doc: bin} - var serialized_data = bsonC.serialize(doc) - var deserialized_data = bsonC.deserialize(serialized_data); - assert.equal(doc.doc.value(), deserialized_data.doc.value()) - test.done(); -} - -/** - * @ignore - */ -exports['Should Correctly Serialize and Deserialize a big Binary object'] = function(test) { - var data = fs.readFileSync("test/node/data/test_gs_weird_bug.png", 'binary'); - var bin = new Binary() - bin.write(data) - var doc = {doc: bin} - var serialized_data = bsonC.serialize(doc) - var deserialized_data = bsonC.deserialize(serialized_data); - assert.equal(doc.doc.value(), deserialized_data.doc.value()) - test.done(); -} - -/** - * @ignore - */ -exports.noGlobalsLeaked = function(test) { - var leaks = gleak.detectNew(); - test.equal(0, leaks.length, "global var leak detected: " + leaks.join(', ')); - test.done(); -} diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/to_bson_test.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/to_bson_test.js deleted file mode 100644 index e9282e5..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/to_bson_test.js +++ /dev/null @@ -1,109 +0,0 @@ -var mongodb = process.env['TEST_NATIVE'] != null ? require('../../lib/bson').native() : require('../../lib/bson').pure(); - -var testCase = require('nodeunit').testCase, - mongoO = require('../../lib/bson').pure(), - Buffer = require('buffer').Buffer, - gleak = require('../../tools/gleak'), - fs = require('fs'), - BSON = mongoO.BSON, - Code = mongoO.Code, - Binary = mongoO.Binary, - Timestamp = mongoO.Timestamp, - Long = mongoO.Long, - MongoReply = mongoO.MongoReply, - ObjectID = mongoO.ObjectID, - Symbol = mongoO.Symbol, - DBRef = mongoO.DBRef, - Double = mongoO.Double, - MinKey = mongoO.MinKey, - MaxKey = mongoO.MaxKey, - BinaryParser = mongoO.BinaryParser; - -var BSONSE = mongodb, - BSONDE = mongodb; - -// for tests -BSONDE.BSON_BINARY_SUBTYPE_DEFAULT = 0; -BSONDE.BSON_BINARY_SUBTYPE_FUNCTION = 1; -BSONDE.BSON_BINARY_SUBTYPE_BYTE_ARRAY = 2; -BSONDE.BSON_BINARY_SUBTYPE_UUID = 3; -BSONDE.BSON_BINARY_SUBTYPE_MD5 = 4; -BSONDE.BSON_BINARY_SUBTYPE_USER_DEFINED = 128; - -BSONSE.BSON_BINARY_SUBTYPE_DEFAULT = 0; -BSONSE.BSON_BINARY_SUBTYPE_FUNCTION = 1; -BSONSE.BSON_BINARY_SUBTYPE_BYTE_ARRAY = 2; -BSONSE.BSON_BINARY_SUBTYPE_UUID = 3; -BSONSE.BSON_BINARY_SUBTYPE_MD5 = 4; -BSONSE.BSON_BINARY_SUBTYPE_USER_DEFINED = 128; - -var hexStringToBinary = function(string) { - var numberofValues = string.length / 2; - var array = ""; - - for(var i = 0; i < numberofValues; i++) { - array += String.fromCharCode(parseInt(string[i*2] + string[i*2 + 1], 16)); - } - return array; -} - -var assertBuffersEqual = function(test, buffer1, buffer2) { - if(buffer1.length != buffer2.length) test.fail("Buffers do not have the same length", buffer1, buffer2); - - for(var i = 0; i < buffer1.length; i++) { - test.equal(buffer1[i], buffer2[i]); - } -} - -/** - * Retrieve the server information for the current - * instance of the db client - * - * @ignore - */ -exports.setUp = function(callback) { - callback(); -} - -/** - * Retrieve the server information for the current - * instance of the db client - * - * @ignore - */ -exports.tearDown = function(callback) { - callback(); -} - -/** - * @ignore - */ -exports['Should correctly handle toBson function for an object'] = function(test) { - // Test object - var doc = { - hello: new ObjectID(), - a:1 - }; - // Add a toBson method to the object - doc.toBSON = function() { - return {b:1}; - } - - // Serialize the data - var serialized_data = new BSONSE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).serialize(doc, false, true); - var deserialized_doc = new BSONDE.BSON([Long, ObjectID, Binary, Code, DBRef, Symbol, Double, Timestamp, MaxKey, MinKey]).deserialize(serialized_data); - test.deepEqual({b:1}, deserialized_doc); - test.done(); -} - -/** - * Retrieve the server information for the current - * instance of the db client - * - * @ignore - */ -exports.noGlobalsLeaked = function(test) { - var leaks = gleak.detectNew(); - test.equal(0, leaks.length, "global var leak detected: " + leaks.join(', ')); - test.done(); -} diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/tools/utils.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/tools/utils.js deleted file mode 100644 index 9d7cbe7..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/test/node/tools/utils.js +++ /dev/null @@ -1,80 +0,0 @@ -exports.assertArrayEqual = function(array1, array2) { - if(array1.length != array2.length) return false; - for(var i = 0; i < array1.length; i++) { - if(array1[i] != array2[i]) return false; - } - - return true; -} - -// String to arraybuffer -exports.stringToArrayBuffer = function(string) { - var dataBuffer = new Uint8Array(new ArrayBuffer(string.length)); - // Return the strings - for(var i = 0; i < string.length; i++) { - dataBuffer[i] = string.charCodeAt(i); - } - // Return the data buffer - return dataBuffer; -} - -// String to arraybuffer -exports.stringToArray = function(string) { - var dataBuffer = new Array(string.length); - // Return the strings - for(var i = 0; i < string.length; i++) { - dataBuffer[i] = string.charCodeAt(i); - } - // Return the data buffer - return dataBuffer; -} - -exports.Utf8 = { - // public method for url encoding - encode : function (string) { - string = string.replace(/\r\n/g,"\n"); - var utftext = ""; - - for (var n = 0; n < string.length; n++) { - var c = string.charCodeAt(n); - if (c < 128) { - utftext += String.fromCharCode(c); - } else if((c > 127) && (c < 2048)) { - utftext += String.fromCharCode((c >> 6) | 192); - utftext += String.fromCharCode((c & 63) | 128); - } else { - utftext += String.fromCharCode((c >> 12) | 224); - utftext += String.fromCharCode(((c >> 6) & 63) | 128); - utftext += String.fromCharCode((c & 63) | 128); - } - - } - - return utftext; - }, - - // public method for url decoding - decode : function (utftext) { - var string = ""; - var i = 0; - var c = c1 = c2 = 0; - - while ( i < utftext.length ) { - c = utftext.charCodeAt(i); - if(c < 128) { - string += String.fromCharCode(c); - i++; - } else if((c > 191) && (c < 224)) { - c2 = utftext.charCodeAt(i+1); - string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); - i += 2; - } else { - c2 = utftext.charCodeAt(i+1); - c3 = utftext.charCodeAt(i+2); - string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); - i += 3; - } - } - return string; - } -} diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/tools/gleak.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/tools/gleak.js deleted file mode 100644 index c707cfc..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/tools/gleak.js +++ /dev/null @@ -1,21 +0,0 @@ - -var gleak = require('gleak')(); -gleak.ignore('AssertionError'); -gleak.ignore('testFullSpec_param_found'); -gleak.ignore('events'); -gleak.ignore('Uint8Array'); -gleak.ignore('Uint8ClampedArray'); -gleak.ignore('TAP_Global_Harness'); -gleak.ignore('setImmediate'); -gleak.ignore('clearImmediate'); - -gleak.ignore('DTRACE_NET_SERVER_CONNECTION'); -gleak.ignore('DTRACE_NET_STREAM_END'); -gleak.ignore('DTRACE_NET_SOCKET_READ'); -gleak.ignore('DTRACE_NET_SOCKET_WRITE'); -gleak.ignore('DTRACE_HTTP_SERVER_REQUEST'); -gleak.ignore('DTRACE_HTTP_SERVER_RESPONSE'); -gleak.ignore('DTRACE_HTTP_CLIENT_REQUEST'); -gleak.ignore('DTRACE_HTTP_CLIENT_RESPONSE'); - -module.exports = gleak; diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/tools/jasmine-1.1.0/MIT.LICENSE b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/tools/jasmine-1.1.0/MIT.LICENSE deleted file mode 100644 index 7c435ba..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/tools/jasmine-1.1.0/MIT.LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2008-2011 Pivotal Labs - -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. diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/tools/jasmine-1.1.0/jasmine-html.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/tools/jasmine-1.1.0/jasmine-html.js deleted file mode 100644 index 7383401..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/tools/jasmine-1.1.0/jasmine-html.js +++ /dev/null @@ -1,190 +0,0 @@ -jasmine.TrivialReporter = function(doc) { - this.document = doc || document; - this.suiteDivs = {}; - this.logRunningSpecs = false; -}; - -jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) { - var el = document.createElement(type); - - for (var i = 2; i < arguments.length; i++) { - var child = arguments[i]; - - if (typeof child === 'string') { - el.appendChild(document.createTextNode(child)); - } else { - if (child) { el.appendChild(child); } - } - } - - for (var attr in attrs) { - if (attr == "className") { - el[attr] = attrs[attr]; - } else { - el.setAttribute(attr, attrs[attr]); - } - } - - return el; -}; - -jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) { - var showPassed, showSkipped; - - this.outerDiv = this.createDom('div', { className: 'jasmine_reporter' }, - this.createDom('div', { className: 'banner' }, - this.createDom('div', { className: 'logo' }, - this.createDom('span', { className: 'title' }, "Jasmine"), - this.createDom('span', { className: 'version' }, runner.env.versionString())), - this.createDom('div', { className: 'options' }, - "Show ", - showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }), - this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "), - showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }), - this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped") - ) - ), - - this.runnerDiv = this.createDom('div', { className: 'runner running' }, - this.createDom('a', { className: 'run_spec', href: '?' }, "run all"), - this.runnerMessageSpan = this.createDom('span', {}, "Running..."), - this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, "")) - ); - - this.document.body.appendChild(this.outerDiv); - - var suites = runner.suites(); - for (var i = 0; i < suites.length; i++) { - var suite = suites[i]; - var suiteDiv = this.createDom('div', { className: 'suite' }, - this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"), - this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description)); - this.suiteDivs[suite.id] = suiteDiv; - var parentDiv = this.outerDiv; - if (suite.parentSuite) { - parentDiv = this.suiteDivs[suite.parentSuite.id]; - } - parentDiv.appendChild(suiteDiv); - } - - this.startedAt = new Date(); - - var self = this; - showPassed.onclick = function(evt) { - if (showPassed.checked) { - self.outerDiv.className += ' show-passed'; - } else { - self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, ''); - } - }; - - showSkipped.onclick = function(evt) { - if (showSkipped.checked) { - self.outerDiv.className += ' show-skipped'; - } else { - self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, ''); - } - }; -}; - -jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) { - var results = runner.results(); - var className = (results.failedCount > 0) ? "runner failed" : "runner passed"; - this.runnerDiv.setAttribute("class", className); - //do it twice for IE - this.runnerDiv.setAttribute("className", className); - var specs = runner.specs(); - var specCount = 0; - for (var i = 0; i < specs.length; i++) { - if (this.specFilter(specs[i])) { - specCount++; - } - } - var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s"); - message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s"; - this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild); - - this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString())); -}; - -jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) { - var results = suite.results(); - var status = results.passed() ? 'passed' : 'failed'; - if (results.totalCount === 0) { // todo: change this to check results.skipped - status = 'skipped'; - } - this.suiteDivs[suite.id].className += " " + status; -}; - -jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) { - if (this.logRunningSpecs) { - this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...'); - } -}; - -jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) { - var results = spec.results(); - var status = results.passed() ? 'passed' : 'failed'; - if (results.skipped) { - status = 'skipped'; - } - var specDiv = this.createDom('div', { className: 'spec ' + status }, - this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"), - this.createDom('a', { - className: 'description', - href: '?spec=' + encodeURIComponent(spec.getFullName()), - title: spec.getFullName() - }, spec.description)); - - - var resultItems = results.getItems(); - var messagesDiv = this.createDom('div', { className: 'messages' }); - for (var i = 0; i < resultItems.length; i++) { - var result = resultItems[i]; - - if (result.type == 'log') { - messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString())); - } else if (result.type == 'expect' && result.passed && !result.passed()) { - messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message)); - - if (result.trace.stack) { - messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack)); - } - } - } - - if (messagesDiv.childNodes.length > 0) { - specDiv.appendChild(messagesDiv); - } - - this.suiteDivs[spec.suite.id].appendChild(specDiv); -}; - -jasmine.TrivialReporter.prototype.log = function() { - var console = jasmine.getGlobal().console; - if (console && console.log) { - if (console.log.apply) { - console.log.apply(console, arguments); - } else { - console.log(arguments); // ie fix: console.log.apply doesn't exist on ie - } - } -}; - -jasmine.TrivialReporter.prototype.getLocation = function() { - return this.document.location; -}; - -jasmine.TrivialReporter.prototype.specFilter = function(spec) { - var paramMap = {}; - var params = this.getLocation().search.substring(1).split('&'); - for (var i = 0; i < params.length; i++) { - var p = params[i].split('='); - paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]); - } - - if (!paramMap.spec) { - return true; - } - return spec.getFullName().indexOf(paramMap.spec) === 0; -}; diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/tools/jasmine-1.1.0/jasmine.css b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/tools/jasmine-1.1.0/jasmine.css deleted file mode 100644 index 6583fe7..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/tools/jasmine-1.1.0/jasmine.css +++ /dev/null @@ -1,166 +0,0 @@ -body { - font-family: "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif; -} - - -.jasmine_reporter a:visited, .jasmine_reporter a { - color: #303; -} - -.jasmine_reporter a:hover, .jasmine_reporter a:active { - color: blue; -} - -.run_spec { - float:right; - padding-right: 5px; - font-size: .8em; - text-decoration: none; -} - -.jasmine_reporter { - margin: 0 5px; -} - -.banner { - color: #303; - background-color: #fef; - padding: 5px; -} - -.logo { - float: left; - font-size: 1.1em; - padding-left: 5px; -} - -.logo .version { - font-size: .6em; - padding-left: 1em; -} - -.runner.running { - background-color: yellow; -} - - -.options { - text-align: right; - font-size: .8em; -} - - - - -.suite { - border: 1px outset gray; - margin: 5px 0; - padding-left: 1em; -} - -.suite .suite { - margin: 5px; -} - -.suite.passed { - background-color: #dfd; -} - -.suite.failed { - background-color: #fdd; -} - -.spec { - margin: 5px; - padding-left: 1em; - clear: both; -} - -.spec.failed, .spec.passed, .spec.skipped { - padding-bottom: 5px; - border: 1px solid gray; -} - -.spec.failed { - background-color: #fbb; - border-color: red; -} - -.spec.passed { - background-color: #bfb; - border-color: green; -} - -.spec.skipped { - background-color: #bbb; -} - -.messages { - border-left: 1px dashed gray; - padding-left: 1em; - padding-right: 1em; -} - -.passed { - background-color: #cfc; - display: none; -} - -.failed { - background-color: #fbb; -} - -.skipped { - color: #777; - background-color: #eee; - display: none; -} - - -/*.resultMessage {*/ - /*white-space: pre;*/ -/*}*/ - -.resultMessage span.result { - display: block; - line-height: 2em; - color: black; -} - -.resultMessage .mismatch { - color: black; -} - -.stackTrace { - white-space: pre; - font-size: .8em; - margin-left: 10px; - max-height: 5em; - overflow: auto; - border: 1px inset red; - padding: 1em; - background: #eef; -} - -.finished-at { - padding-left: 1em; - font-size: .6em; -} - -.show-passed .passed, -.show-skipped .skipped { - display: block; -} - - -#jasmine_content { - position:fixed; - right: 100%; -} - -.runner { - border: 1px solid gray; - display: block; - margin: 5px 0; - padding: 2px 0 2px 10px; -} diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/tools/jasmine-1.1.0/jasmine.js b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/tools/jasmine-1.1.0/jasmine.js deleted file mode 100644 index c3d2dc7..0000000 --- a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/tools/jasmine-1.1.0/jasmine.js +++ /dev/null @@ -1,2476 +0,0 @@ -var isCommonJS = typeof window == "undefined"; - -/** - * Top level namespace for Jasmine, a lightweight JavaScript BDD/spec/testing framework. - * - * @namespace - */ -var jasmine = {}; -if (isCommonJS) exports.jasmine = jasmine; -/** - * @private - */ -jasmine.unimplementedMethod_ = function() { - throw new Error("unimplemented method"); -}; - -/** - * Use jasmine.undefined instead of undefined, since undefined is just - * a plain old variable and may be redefined by somebody else. - * - * @private - */ -jasmine.undefined = jasmine.___undefined___; - -/** - * Show diagnostic messages in the console if set to true - * - */ -jasmine.VERBOSE = false; - -/** - * Default interval in milliseconds for event loop yields (e.g. to allow network activity or to refresh the screen with the HTML-based runner). Small values here may result in slow test running. Zero means no updates until all tests have completed. - * - */ -jasmine.DEFAULT_UPDATE_INTERVAL = 250; - -/** - * Default timeout interval in milliseconds for waitsFor() blocks. - */ -jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000; - -jasmine.getGlobal = function() { - function getGlobal() { - return this; - } - - return getGlobal(); -}; - -/** - * Allows for bound functions to be compared. Internal use only. - * - * @ignore - * @private - * @param base {Object} bound 'this' for the function - * @param name {Function} function to find - */ -jasmine.bindOriginal_ = function(base, name) { - var original = base[name]; - if (original.apply) { - return function() { - return original.apply(base, arguments); - }; - } else { - // IE support - return jasmine.getGlobal()[name]; - } -}; - -jasmine.setTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'setTimeout'); -jasmine.clearTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearTimeout'); -jasmine.setInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'setInterval'); -jasmine.clearInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearInterval'); - -jasmine.MessageResult = function(values) { - this.type = 'log'; - this.values = values; - this.trace = new Error(); // todo: test better -}; - -jasmine.MessageResult.prototype.toString = function() { - var text = ""; - for (var i = 0; i < this.values.length; i++) { - if (i > 0) text += " "; - if (jasmine.isString_(this.values[i])) { - text += this.values[i]; - } else { - text += jasmine.pp(this.values[i]); - } - } - return text; -}; - -jasmine.ExpectationResult = function(params) { - this.type = 'expect'; - this.matcherName = params.matcherName; - this.passed_ = params.passed; - this.expected = params.expected; - this.actual = params.actual; - this.message = this.passed_ ? 'Passed.' : params.message; - - var trace = (params.trace || new Error(this.message)); - this.trace = this.passed_ ? '' : trace; -}; - -jasmine.ExpectationResult.prototype.toString = function () { - return this.message; -}; - -jasmine.ExpectationResult.prototype.passed = function () { - return this.passed_; -}; - -/** - * Getter for the Jasmine environment. Ensures one gets created - */ -jasmine.getEnv = function() { - var env = jasmine.currentEnv_ = jasmine.currentEnv_ || new jasmine.Env(); - return env; -}; - -/** - * @ignore - * @private - * @param value - * @returns {Boolean} - */ -jasmine.isArray_ = function(value) { - return jasmine.isA_("Array", value); -}; - -/** - * @ignore - * @private - * @param value - * @returns {Boolean} - */ -jasmine.isString_ = function(value) { - return jasmine.isA_("String", value); -}; - -/** - * @ignore - * @private - * @param value - * @returns {Boolean} - */ -jasmine.isNumber_ = function(value) { - return jasmine.isA_("Number", value); -}; - -/** - * @ignore - * @private - * @param {String} typeName - * @param value - * @returns {Boolean} - */ -jasmine.isA_ = function(typeName, value) { - return Object.prototype.toString.apply(value) === '[object ' + typeName + ']'; -}; - -/** - * Pretty printer for expecations. Takes any object and turns it into a human-readable string. - * - * @param value {Object} an object to be outputted - * @returns {String} - */ -jasmine.pp = function(value) { - var stringPrettyPrinter = new jasmine.StringPrettyPrinter(); - stringPrettyPrinter.format(value); - return stringPrettyPrinter.string; -}; - -/** - * Returns true if the object is a DOM Node. - * - * @param {Object} obj object to check - * @returns {Boolean} - */ -jasmine.isDomNode = function(obj) { - return obj.nodeType > 0; -}; - -/** - * Returns a matchable 'generic' object of the class type. For use in expecations of type when values don't matter. - * - * @example - * // don't care about which function is passed in, as long as it's a function - * expect(mySpy).toHaveBeenCalledWith(jasmine.any(Function)); - * - * @param {Class} clazz - * @returns matchable object of the type clazz - */ -jasmine.any = function(clazz) { - return new jasmine.Matchers.Any(clazz); -}; - -/** - * Jasmine Spies are test doubles that can act as stubs, spies, fakes or when used in an expecation, mocks. - * - * Spies should be created in test setup, before expectations. They can then be checked, using the standard Jasmine - * expectation syntax. Spies can be checked if they were called or not and what the calling params were. - * - * A Spy has the following fields: wasCalled, callCount, mostRecentCall, and argsForCall (see docs). - * - * Spies are torn down at the end of every spec. - * - * Note: Do not call new jasmine.Spy() directly - a spy must be created using spyOn, jasmine.createSpy or jasmine.createSpyObj. - * - * @example - * // a stub - * var myStub = jasmine.createSpy('myStub'); // can be used anywhere - * - * // spy example - * var foo = { - * not: function(bool) { return !bool; } - * } - * - * // actual foo.not will not be called, execution stops - * spyOn(foo, 'not'); - - // foo.not spied upon, execution will continue to implementation - * spyOn(foo, 'not').andCallThrough(); - * - * // fake example - * var foo = { - * not: function(bool) { return !bool; } - * } - * - * // foo.not(val) will return val - * spyOn(foo, 'not').andCallFake(function(value) {return value;}); - * - * // mock example - * foo.not(7 == 7); - * expect(foo.not).toHaveBeenCalled(); - * expect(foo.not).toHaveBeenCalledWith(true); - * - * @constructor - * @see spyOn, jasmine.createSpy, jasmine.createSpyObj - * @param {String} name - */ -jasmine.Spy = function(name) { - /** - * The name of the spy, if provided. - */ - this.identity = name || 'unknown'; - /** - * Is this Object a spy? - */ - this.isSpy = true; - /** - * The actual function this spy stubs. - */ - this.plan = function() { - }; - /** - * Tracking of the most recent call to the spy. - * @example - * var mySpy = jasmine.createSpy('foo'); - * mySpy(1, 2); - * mySpy.mostRecentCall.args = [1, 2]; - */ - this.mostRecentCall = {}; - - /** - * Holds arguments for each call to the spy, indexed by call count - * @example - * var mySpy = jasmine.createSpy('foo'); - * mySpy(1, 2); - * mySpy(7, 8); - * mySpy.mostRecentCall.args = [7, 8]; - * mySpy.argsForCall[0] = [1, 2]; - * mySpy.argsForCall[1] = [7, 8]; - */ - this.argsForCall = []; - this.calls = []; -}; - -/** - * Tells a spy to call through to the actual implemenatation. - * - * @example - * var foo = { - * bar: function() { // do some stuff } - * } - * - * // defining a spy on an existing property: foo.bar - * spyOn(foo, 'bar').andCallThrough(); - */ -jasmine.Spy.prototype.andCallThrough = function() { - this.plan = this.originalValue; - return this; -}; - -/** - * For setting the return value of a spy. - * - * @example - * // defining a spy from scratch: foo() returns 'baz' - * var foo = jasmine.createSpy('spy on foo').andReturn('baz'); - * - * // defining a spy on an existing property: foo.bar() returns 'baz' - * spyOn(foo, 'bar').andReturn('baz'); - * - * @param {Object} value - */ -jasmine.Spy.prototype.andReturn = function(value) { - this.plan = function() { - return value; - }; - return this; -}; - -/** - * For throwing an exception when a spy is called. - * - * @example - * // defining a spy from scratch: foo() throws an exception w/ message 'ouch' - * var foo = jasmine.createSpy('spy on foo').andThrow('baz'); - * - * // defining a spy on an existing property: foo.bar() throws an exception w/ message 'ouch' - * spyOn(foo, 'bar').andThrow('baz'); - * - * @param {String} exceptionMsg - */ -jasmine.Spy.prototype.andThrow = function(exceptionMsg) { - this.plan = function() { - throw exceptionMsg; - }; - return this; -}; - -/** - * Calls an alternate implementation when a spy is called. - * - * @example - * var baz = function() { - * // do some stuff, return something - * } - * // defining a spy from scratch: foo() calls the function baz - * var foo = jasmine.createSpy('spy on foo').andCall(baz); - * - * // defining a spy on an existing property: foo.bar() calls an anonymnous function - * spyOn(foo, 'bar').andCall(function() { return 'baz';} ); - * - * @param {Function} fakeFunc - */ -jasmine.Spy.prototype.andCallFake = function(fakeFunc) { - this.plan = fakeFunc; - return this; -}; - -/** - * Resets all of a spy's the tracking variables so that it can be used again. - * - * @example - * spyOn(foo, 'bar'); - * - * foo.bar(); - * - * expect(foo.bar.callCount).toEqual(1); - * - * foo.bar.reset(); - * - * expect(foo.bar.callCount).toEqual(0); - */ -jasmine.Spy.prototype.reset = function() { - this.wasCalled = false; - this.callCount = 0; - this.argsForCall = []; - this.calls = []; - this.mostRecentCall = {}; -}; - -jasmine.createSpy = function(name) { - - var spyObj = function() { - spyObj.wasCalled = true; - spyObj.callCount++; - var args = jasmine.util.argsToArray(arguments); - spyObj.mostRecentCall.object = this; - spyObj.mostRecentCall.args = args; - spyObj.argsForCall.push(args); - spyObj.calls.push({object: this, args: args}); - return spyObj.plan.apply(this, arguments); - }; - - var spy = new jasmine.Spy(name); - - for (var prop in spy) { - spyObj[prop] = spy[prop]; - } - - spyObj.reset(); - - return spyObj; -}; - -/** - * Determines whether an object is a spy. - * - * @param {jasmine.Spy|Object} putativeSpy - * @returns {Boolean} - */ -jasmine.isSpy = function(putativeSpy) { - return putativeSpy && putativeSpy.isSpy; -}; - -/** - * Creates a more complicated spy: an Object that has every property a function that is a spy. Used for stubbing something - * large in one call. - * - * @param {String} baseName name of spy class - * @param {Array} methodNames array of names of methods to make spies - */ -jasmine.createSpyObj = function(baseName, methodNames) { - if (!jasmine.isArray_(methodNames) || methodNames.length === 0) { - throw new Error('createSpyObj requires a non-empty array of method names to create spies for'); - } - var obj = {}; - for (var i = 0; i < methodNames.length; i++) { - obj[methodNames[i]] = jasmine.createSpy(baseName + '.' + methodNames[i]); - } - return obj; -}; - -/** - * All parameters are pretty-printed and concatenated together, then written to the current spec's output. - * - * Be careful not to leave calls to jasmine.log in production code. - */ -jasmine.log = function() { - var spec = jasmine.getEnv().currentSpec; - spec.log.apply(spec, arguments); -}; - -/** - * Function that installs a spy on an existing object's method name. Used within a Spec to create a spy. - * - * @example - * // spy example - * var foo = { - * not: function(bool) { return !bool; } - * } - * spyOn(foo, 'not'); // actual foo.not will not be called, execution stops - * - * @see jasmine.createSpy - * @param obj - * @param methodName - * @returns a Jasmine spy that can be chained with all spy methods - */ -var spyOn = function(obj, methodName) { - return jasmine.getEnv().currentSpec.spyOn(obj, methodName); -}; -if (isCommonJS) exports.spyOn = spyOn; - -/** - * Creates a Jasmine spec that will be added to the current suite. - * - * // TODO: pending tests - * - * @example - * it('should be true', function() { - * expect(true).toEqual(true); - * }); - * - * @param {String} desc description of this specification - * @param {Function} func defines the preconditions and expectations of the spec - */ -var it = function(desc, func) { - return jasmine.getEnv().it(desc, func); -}; -if (isCommonJS) exports.it = it; - -/** - * Creates a disabled Jasmine spec. - * - * A convenience method that allows existing specs to be disabled temporarily during development. - * - * @param {String} desc description of this specification - * @param {Function} func defines the preconditions and expectations of the spec - */ -var xit = function(desc, func) { - return jasmine.getEnv().xit(desc, func); -}; -if (isCommonJS) exports.xit = xit; - -/** - * Starts a chain for a Jasmine expectation. - * - * It is passed an Object that is the actual value and should chain to one of the many - * jasmine.Matchers functions. - * - * @param {Object} actual Actual value to test against and expected value - */ -var expect = function(actual) { - return jasmine.getEnv().currentSpec.expect(actual); -}; -if (isCommonJS) exports.expect = expect; - -/** - * Defines part of a jasmine spec. Used in cominbination with waits or waitsFor in asynchrnous specs. - * - * @param {Function} func Function that defines part of a jasmine spec. - */ -var runs = function(func) { - jasmine.getEnv().currentSpec.runs(func); -}; -if (isCommonJS) exports.runs = runs; - -/** - * Waits a fixed time period before moving to the next block. - * - * @deprecated Use waitsFor() instead - * @param {Number} timeout milliseconds to wait - */ -var waits = function(timeout) { - jasmine.getEnv().currentSpec.waits(timeout); -}; -if (isCommonJS) exports.waits = waits; - -/** - * Waits for the latchFunction to return true before proceeding to the next block. - * - * @param {Function} latchFunction - * @param {String} optional_timeoutMessage - * @param {Number} optional_timeout - */ -var waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) { - jasmine.getEnv().currentSpec.waitsFor.apply(jasmine.getEnv().currentSpec, arguments); -}; -if (isCommonJS) exports.waitsFor = waitsFor; - -/** - * A function that is called before each spec in a suite. - * - * Used for spec setup, including validating assumptions. - * - * @param {Function} beforeEachFunction - */ -var beforeEach = function(beforeEachFunction) { - jasmine.getEnv().beforeEach(beforeEachFunction); -}; -if (isCommonJS) exports.beforeEach = beforeEach; - -/** - * A function that is called after each spec in a suite. - * - * Used for restoring any state that is hijacked during spec execution. - * - * @param {Function} afterEachFunction - */ -var afterEach = function(afterEachFunction) { - jasmine.getEnv().afterEach(afterEachFunction); -}; -if (isCommonJS) exports.afterEach = afterEach; - -/** - * Defines a suite of specifications. - * - * Stores the description and all defined specs in the Jasmine environment as one suite of specs. Variables declared - * are accessible by calls to beforeEach, it, and afterEach. Describe blocks can be nested, allowing for specialization - * of setup in some tests. - * - * @example - * // TODO: a simple suite - * - * // TODO: a simple suite with a nested describe block - * - * @param {String} description A string, usually the class under test. - * @param {Function} specDefinitions function that defines several specs. - */ -var describe = function(description, specDefinitions) { - return jasmine.getEnv().describe(description, specDefinitions); -}; -if (isCommonJS) exports.describe = describe; - -/** - * Disables a suite of specifications. Used to disable some suites in a file, or files, temporarily during development. - * - * @param {String} description A string, usually the class under test. - * @param {Function} specDefinitions function that defines several specs. - */ -var xdescribe = function(description, specDefinitions) { - return jasmine.getEnv().xdescribe(description, specDefinitions); -}; -if (isCommonJS) exports.xdescribe = xdescribe; - - -// Provide the XMLHttpRequest class for IE 5.x-6.x: -jasmine.XmlHttpRequest = (typeof XMLHttpRequest == "undefined") ? function() { - function tryIt(f) { - try { - return f(); - } catch(e) { - } - return null; - } - - var xhr = tryIt(function() { - return new ActiveXObject("Msxml2.XMLHTTP.6.0"); - }) || - tryIt(function() { - return new ActiveXObject("Msxml2.XMLHTTP.3.0"); - }) || - tryIt(function() { - return new ActiveXObject("Msxml2.XMLHTTP"); - }) || - tryIt(function() { - return new ActiveXObject("Microsoft.XMLHTTP"); - }); - - if (!xhr) throw new Error("This browser does not support XMLHttpRequest."); - - return xhr; -} : XMLHttpRequest; -/** - * @namespace - */ -jasmine.util = {}; - -/** - * Declare that a child class inherit it's prototype from the parent class. - * - * @private - * @param {Function} childClass - * @param {Function} parentClass - */ -jasmine.util.inherit = function(childClass, parentClass) { - /** - * @private - */ - var subclass = function() { - }; - subclass.prototype = parentClass.prototype; - childClass.prototype = new subclass(); -}; - -jasmine.util.formatException = function(e) { - var lineNumber; - if (e.line) { - lineNumber = e.line; - } - else if (e.lineNumber) { - lineNumber = e.lineNumber; - } - - var file; - - if (e.sourceURL) { - file = e.sourceURL; - } - else if (e.fileName) { - file = e.fileName; - } - - var message = (e.name && e.message) ? (e.name + ': ' + e.message) : e.toString(); - - if (file && lineNumber) { - message += ' in ' + file + ' (line ' + lineNumber + ')'; - } - - return message; -}; - -jasmine.util.htmlEscape = function(str) { - if (!str) return str; - return str.replace(/&/g, '&') - .replace(//g, '>'); -}; - -jasmine.util.argsToArray = function(args) { - var arrayOfArgs = []; - for (var i = 0; i < args.length; i++) arrayOfArgs.push(args[i]); - return arrayOfArgs; -}; - -jasmine.util.extend = function(destination, source) { - for (var property in source) destination[property] = source[property]; - return destination; -}; - -/** - * Environment for Jasmine - * - * @constructor - */ -jasmine.Env = function() { - this.currentSpec = null; - this.currentSuite = null; - this.currentRunner_ = new jasmine.Runner(this); - - this.reporter = new jasmine.MultiReporter(); - - this.updateInterval = jasmine.DEFAULT_UPDATE_INTERVAL; - this.defaultTimeoutInterval = jasmine.DEFAULT_TIMEOUT_INTERVAL; - this.lastUpdate = 0; - this.specFilter = function() { - return true; - }; - - this.nextSpecId_ = 0; - this.nextSuiteId_ = 0; - this.equalityTesters_ = []; - - // wrap matchers - this.matchersClass = function() { - jasmine.Matchers.apply(this, arguments); - }; - jasmine.util.inherit(this.matchersClass, jasmine.Matchers); - - jasmine.Matchers.wrapInto_(jasmine.Matchers.prototype, this.matchersClass); -}; - - -jasmine.Env.prototype.setTimeout = jasmine.setTimeout; -jasmine.Env.prototype.clearTimeout = jasmine.clearTimeout; -jasmine.Env.prototype.setInterval = jasmine.setInterval; -jasmine.Env.prototype.clearInterval = jasmine.clearInterval; - -/** - * @returns an object containing jasmine version build info, if set. - */ -jasmine.Env.prototype.version = function () { - if (jasmine.version_) { - return jasmine.version_; - } else { - throw new Error('Version not set'); - } -}; - -/** - * @returns string containing jasmine version build info, if set. - */ -jasmine.Env.prototype.versionString = function() { - if (!jasmine.version_) { - return "version unknown"; - } - - var version = this.version(); - var versionString = version.major + "." + version.minor + "." + version.build; - if (version.release_candidate) { - versionString += ".rc" + version.release_candidate; - } - versionString += " revision " + version.revision; - return versionString; -}; - -/** - * @returns a sequential integer starting at 0 - */ -jasmine.Env.prototype.nextSpecId = function () { - return this.nextSpecId_++; -}; - -/** - * @returns a sequential integer starting at 0 - */ -jasmine.Env.prototype.nextSuiteId = function () { - return this.nextSuiteId_++; -}; - -/** - * Register a reporter to receive status updates from Jasmine. - * @param {jasmine.Reporter} reporter An object which will receive status updates. - */ -jasmine.Env.prototype.addReporter = function(reporter) { - this.reporter.addReporter(reporter); -}; - -jasmine.Env.prototype.execute = function() { - this.currentRunner_.execute(); -}; - -jasmine.Env.prototype.describe = function(description, specDefinitions) { - var suite = new jasmine.Suite(this, description, specDefinitions, this.currentSuite); - - var parentSuite = this.currentSuite; - if (parentSuite) { - parentSuite.add(suite); - } else { - this.currentRunner_.add(suite); - } - - this.currentSuite = suite; - - var declarationError = null; - try { - specDefinitions.call(suite); - } catch(e) { - declarationError = e; - } - - if (declarationError) { - this.it("encountered a declaration exception", function() { - throw declarationError; - }); - } - - this.currentSuite = parentSuite; - - return suite; -}; - -jasmine.Env.prototype.beforeEach = function(beforeEachFunction) { - if (this.currentSuite) { - this.currentSuite.beforeEach(beforeEachFunction); - } else { - this.currentRunner_.beforeEach(beforeEachFunction); - } -}; - -jasmine.Env.prototype.currentRunner = function () { - return this.currentRunner_; -}; - -jasmine.Env.prototype.afterEach = function(afterEachFunction) { - if (this.currentSuite) { - this.currentSuite.afterEach(afterEachFunction); - } else { - this.currentRunner_.afterEach(afterEachFunction); - } - -}; - -jasmine.Env.prototype.xdescribe = function(desc, specDefinitions) { - return { - execute: function() { - } - }; -}; - -jasmine.Env.prototype.it = function(description, func) { - var spec = new jasmine.Spec(this, this.currentSuite, description); - this.currentSuite.add(spec); - this.currentSpec = spec; - - if (func) { - spec.runs(func); - } - - return spec; -}; - -jasmine.Env.prototype.xit = function(desc, func) { - return { - id: this.nextSpecId(), - runs: function() { - } - }; -}; - -jasmine.Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchValues) { - if (a.__Jasmine_been_here_before__ === b && b.__Jasmine_been_here_before__ === a) { - return true; - } - - a.__Jasmine_been_here_before__ = b; - b.__Jasmine_been_here_before__ = a; - - var hasKey = function(obj, keyName) { - return obj !== null && obj[keyName] !== jasmine.undefined; - }; - - for (var property in b) { - if (!hasKey(a, property) && hasKey(b, property)) { - mismatchKeys.push("expected has key '" + property + "', but missing from actual."); - } - } - for (property in a) { - if (!hasKey(b, property) && hasKey(a, property)) { - mismatchKeys.push("expected missing key '" + property + "', but present in actual."); - } - } - for (property in b) { - if (property == '__Jasmine_been_here_before__') continue; - if (!this.equals_(a[property], b[property], mismatchKeys, mismatchValues)) { - mismatchValues.push("'" + property + "' was '" + (b[property] ? jasmine.util.htmlEscape(b[property].toString()) : b[property]) + "' in expected, but was '" + (a[property] ? jasmine.util.htmlEscape(a[property].toString()) : a[property]) + "' in actual."); - } - } - - if (jasmine.isArray_(a) && jasmine.isArray_(b) && a.length != b.length) { - mismatchValues.push("arrays were not the same length"); - } - - delete a.__Jasmine_been_here_before__; - delete b.__Jasmine_been_here_before__; - return (mismatchKeys.length === 0 && mismatchValues.length === 0); -}; - -jasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) { - mismatchKeys = mismatchKeys || []; - mismatchValues = mismatchValues || []; - - for (var i = 0; i < this.equalityTesters_.length; i++) { - var equalityTester = this.equalityTesters_[i]; - var result = equalityTester(a, b, this, mismatchKeys, mismatchValues); - if (result !== jasmine.undefined) return result; - } - - if (a === b) return true; - - if (a === jasmine.undefined || a === null || b === jasmine.undefined || b === null) { - return (a == jasmine.undefined && b == jasmine.undefined); - } - - if (jasmine.isDomNode(a) && jasmine.isDomNode(b)) { - return a === b; - } - - if (a instanceof Date && b instanceof Date) { - return a.getTime() == b.getTime(); - } - - if (a instanceof jasmine.Matchers.Any) { - return a.matches(b); - } - - if (b instanceof jasmine.Matchers.Any) { - return b.matches(a); - } - - if (jasmine.isString_(a) && jasmine.isString_(b)) { - return (a == b); - } - - if (jasmine.isNumber_(a) && jasmine.isNumber_(b)) { - return (a == b); - } - - if (typeof a === "object" && typeof b === "object") { - return this.compareObjects_(a, b, mismatchKeys, mismatchValues); - } - - //Straight check - return (a === b); -}; - -jasmine.Env.prototype.contains_ = function(haystack, needle) { - if (jasmine.isArray_(haystack)) { - for (var i = 0; i < haystack.length; i++) { - if (this.equals_(haystack[i], needle)) return true; - } - return false; - } - return haystack.indexOf(needle) >= 0; -}; - -jasmine.Env.prototype.addEqualityTester = function(equalityTester) { - this.equalityTesters_.push(equalityTester); -}; -/** No-op base class for Jasmine reporters. - * - * @constructor - */ -jasmine.Reporter = function() { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.reportRunnerStarting = function(runner) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.reportRunnerResults = function(runner) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.reportSuiteResults = function(suite) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.reportSpecStarting = function(spec) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.reportSpecResults = function(spec) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.log = function(str) { -}; - -/** - * Blocks are functions with executable code that make up a spec. - * - * @constructor - * @param {jasmine.Env} env - * @param {Function} func - * @param {jasmine.Spec} spec - */ -jasmine.Block = function(env, func, spec) { - this.env = env; - this.func = func; - this.spec = spec; -}; - -jasmine.Block.prototype.execute = function(onComplete) { - try { - this.func.apply(this.spec); - } catch (e) { - this.spec.fail(e); - } - onComplete(); -}; -/** JavaScript API reporter. - * - * @constructor - */ -jasmine.JsApiReporter = function() { - this.started = false; - this.finished = false; - this.suites_ = []; - this.results_ = {}; -}; - -jasmine.JsApiReporter.prototype.reportRunnerStarting = function(runner) { - this.started = true; - var suites = runner.topLevelSuites(); - for (var i = 0; i < suites.length; i++) { - var suite = suites[i]; - this.suites_.push(this.summarize_(suite)); - } -}; - -jasmine.JsApiReporter.prototype.suites = function() { - return this.suites_; -}; - -jasmine.JsApiReporter.prototype.summarize_ = function(suiteOrSpec) { - var isSuite = suiteOrSpec instanceof jasmine.Suite; - var summary = { - id: suiteOrSpec.id, - name: suiteOrSpec.description, - type: isSuite ? 'suite' : 'spec', - children: [] - }; - - if (isSuite) { - var children = suiteOrSpec.children(); - for (var i = 0; i < children.length; i++) { - summary.children.push(this.summarize_(children[i])); - } - } - return summary; -}; - -jasmine.JsApiReporter.prototype.results = function() { - return this.results_; -}; - -jasmine.JsApiReporter.prototype.resultsForSpec = function(specId) { - return this.results_[specId]; -}; - -//noinspection JSUnusedLocalSymbols -jasmine.JsApiReporter.prototype.reportRunnerResults = function(runner) { - this.finished = true; -}; - -//noinspection JSUnusedLocalSymbols -jasmine.JsApiReporter.prototype.reportSuiteResults = function(suite) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.JsApiReporter.prototype.reportSpecResults = function(spec) { - this.results_[spec.id] = { - messages: spec.results().getItems(), - result: spec.results().failedCount > 0 ? "failed" : "passed" - }; -}; - -//noinspection JSUnusedLocalSymbols -jasmine.JsApiReporter.prototype.log = function(str) { -}; - -jasmine.JsApiReporter.prototype.resultsForSpecs = function(specIds){ - var results = {}; - for (var i = 0; i < specIds.length; i++) { - var specId = specIds[i]; - results[specId] = this.summarizeResult_(this.results_[specId]); - } - return results; -}; - -jasmine.JsApiReporter.prototype.summarizeResult_ = function(result){ - var summaryMessages = []; - var messagesLength = result.messages.length; - for (var messageIndex = 0; messageIndex < messagesLength; messageIndex++) { - var resultMessage = result.messages[messageIndex]; - summaryMessages.push({ - text: resultMessage.type == 'log' ? resultMessage.toString() : jasmine.undefined, - passed: resultMessage.passed ? resultMessage.passed() : true, - type: resultMessage.type, - message: resultMessage.message, - trace: { - stack: resultMessage.passed && !resultMessage.passed() ? resultMessage.trace.stack : jasmine.undefined - } - }); - } - - return { - result : result.result, - messages : summaryMessages - }; -}; - -/** - * @constructor - * @param {jasmine.Env} env - * @param actual - * @param {jasmine.Spec} spec - */ -jasmine.Matchers = function(env, actual, spec, opt_isNot) { - this.env = env; - this.actual = actual; - this.spec = spec; - this.isNot = opt_isNot || false; - this.reportWasCalled_ = false; -}; - -// todo: @deprecated as of Jasmine 0.11, remove soon [xw] -jasmine.Matchers.pp = function(str) { - throw new Error("jasmine.Matchers.pp() is no longer supported, please use jasmine.pp() instead!"); -}; - -// todo: @deprecated Deprecated as of Jasmine 0.10. Rewrite your custom matchers to return true or false. [xw] -jasmine.Matchers.prototype.report = function(result, failing_message, details) { - throw new Error("As of jasmine 0.11, custom matchers must be implemented differently -- please see jasmine docs"); -}; - -jasmine.Matchers.wrapInto_ = function(prototype, matchersClass) { - for (var methodName in prototype) { - if (methodName == 'report') continue; - var orig = prototype[methodName]; - matchersClass.prototype[methodName] = jasmine.Matchers.matcherFn_(methodName, orig); - } -}; - -jasmine.Matchers.matcherFn_ = function(matcherName, matcherFunction) { - return function() { - var matcherArgs = jasmine.util.argsToArray(arguments); - var result = matcherFunction.apply(this, arguments); - - if (this.isNot) { - result = !result; - } - - if (this.reportWasCalled_) return result; - - var message; - if (!result) { - if (this.message) { - message = this.message.apply(this, arguments); - if (jasmine.isArray_(message)) { - message = message[this.isNot ? 1 : 0]; - } - } else { - var englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { return ' ' + s.toLowerCase(); }); - message = "Expected " + jasmine.pp(this.actual) + (this.isNot ? " not " : " ") + englishyPredicate; - if (matcherArgs.length > 0) { - for (var i = 0; i < matcherArgs.length; i++) { - if (i > 0) message += ","; - message += " " + jasmine.pp(matcherArgs[i]); - } - } - message += "."; - } - } - var expectationResult = new jasmine.ExpectationResult({ - matcherName: matcherName, - passed: result, - expected: matcherArgs.length > 1 ? matcherArgs : matcherArgs[0], - actual: this.actual, - message: message - }); - this.spec.addMatcherResult(expectationResult); - return jasmine.undefined; - }; -}; - - - - -/** - * toBe: compares the actual to the expected using === - * @param expected - */ -jasmine.Matchers.prototype.toBe = function(expected) { - return this.actual === expected; -}; - -/** - * toNotBe: compares the actual to the expected using !== - * @param expected - * @deprecated as of 1.0. Use not.toBe() instead. - */ -jasmine.Matchers.prototype.toNotBe = function(expected) { - return this.actual !== expected; -}; - -/** - * toEqual: compares the actual to the expected using common sense equality. Handles Objects, Arrays, etc. - * - * @param expected - */ -jasmine.Matchers.prototype.toEqual = function(expected) { - return this.env.equals_(this.actual, expected); -}; - -/** - * toNotEqual: compares the actual to the expected using the ! of jasmine.Matchers.toEqual - * @param expected - * @deprecated as of 1.0. Use not.toNotEqual() instead. - */ -jasmine.Matchers.prototype.toNotEqual = function(expected) { - return !this.env.equals_(this.actual, expected); -}; - -/** - * Matcher that compares the actual to the expected using a regular expression. Constructs a RegExp, so takes - * a pattern or a String. - * - * @param expected - */ -jasmine.Matchers.prototype.toMatch = function(expected) { - return new RegExp(expected).test(this.actual); -}; - -/** - * Matcher that compares the actual to the expected using the boolean inverse of jasmine.Matchers.toMatch - * @param expected - * @deprecated as of 1.0. Use not.toMatch() instead. - */ -jasmine.Matchers.prototype.toNotMatch = function(expected) { - return !(new RegExp(expected).test(this.actual)); -}; - -/** - * Matcher that compares the actual to jasmine.undefined. - */ -jasmine.Matchers.prototype.toBeDefined = function() { - return (this.actual !== jasmine.undefined); -}; - -/** - * Matcher that compares the actual to jasmine.undefined. - */ -jasmine.Matchers.prototype.toBeUndefined = function() { - return (this.actual === jasmine.undefined); -}; - -/** - * Matcher that compares the actual to null. - */ -jasmine.Matchers.prototype.toBeNull = function() { - return (this.actual === null); -}; - -/** - * Matcher that boolean not-nots the actual. - */ -jasmine.Matchers.prototype.toBeTruthy = function() { - return !!this.actual; -}; - - -/** - * Matcher that boolean nots the actual. - */ -jasmine.Matchers.prototype.toBeFalsy = function() { - return !this.actual; -}; - - -/** - * Matcher that checks to see if the actual, a Jasmine spy, was called. - */ -jasmine.Matchers.prototype.toHaveBeenCalled = function() { - if (arguments.length > 0) { - throw new Error('toHaveBeenCalled does not take arguments, use toHaveBeenCalledWith'); - } - - if (!jasmine.isSpy(this.actual)) { - throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); - } - - this.message = function() { - return [ - "Expected spy " + this.actual.identity + " to have been called.", - "Expected spy " + this.actual.identity + " not to have been called." - ]; - }; - - return this.actual.wasCalled; -}; - -/** @deprecated Use expect(xxx).toHaveBeenCalled() instead */ -jasmine.Matchers.prototype.wasCalled = jasmine.Matchers.prototype.toHaveBeenCalled; - -/** - * Matcher that checks to see if the actual, a Jasmine spy, was not called. - * - * @deprecated Use expect(xxx).not.toHaveBeenCalled() instead - */ -jasmine.Matchers.prototype.wasNotCalled = function() { - if (arguments.length > 0) { - throw new Error('wasNotCalled does not take arguments'); - } - - if (!jasmine.isSpy(this.actual)) { - throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); - } - - this.message = function() { - return [ - "Expected spy " + this.actual.identity + " to not have been called.", - "Expected spy " + this.actual.identity + " to have been called." - ]; - }; - - return !this.actual.wasCalled; -}; - -/** - * Matcher that checks to see if the actual, a Jasmine spy, was called with a set of parameters. - * - * @example - * - */ -jasmine.Matchers.prototype.toHaveBeenCalledWith = function() { - var expectedArgs = jasmine.util.argsToArray(arguments); - if (!jasmine.isSpy(this.actual)) { - throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); - } - this.message = function() { - if (this.actual.callCount === 0) { - // todo: what should the failure message for .not.toHaveBeenCalledWith() be? is this right? test better. [xw] - return [ - "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but it was never called.", - "Expected spy " + this.actual.identity + " not to have been called with " + jasmine.pp(expectedArgs) + " but it was." - ]; - } else { - return [ - "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall), - "Expected spy " + this.actual.identity + " not to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall) - ]; - } - }; - - return this.env.contains_(this.actual.argsForCall, expectedArgs); -}; - -/** @deprecated Use expect(xxx).toHaveBeenCalledWith() instead */ -jasmine.Matchers.prototype.wasCalledWith = jasmine.Matchers.prototype.toHaveBeenCalledWith; - -/** @deprecated Use expect(xxx).not.toHaveBeenCalledWith() instead */ -jasmine.Matchers.prototype.wasNotCalledWith = function() { - var expectedArgs = jasmine.util.argsToArray(arguments); - if (!jasmine.isSpy(this.actual)) { - throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); - } - - this.message = function() { - return [ - "Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but it was", - "Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but it was" - ]; - }; - - return !this.env.contains_(this.actual.argsForCall, expectedArgs); -}; - -/** - * Matcher that checks that the expected item is an element in the actual Array. - * - * @param {Object} expected - */ -jasmine.Matchers.prototype.toContain = function(expected) { - return this.env.contains_(this.actual, expected); -}; - -/** - * Matcher that checks that the expected item is NOT an element in the actual Array. - * - * @param {Object} expected - * @deprecated as of 1.0. Use not.toNotContain() instead. - */ -jasmine.Matchers.prototype.toNotContain = function(expected) { - return !this.env.contains_(this.actual, expected); -}; - -jasmine.Matchers.prototype.toBeLessThan = function(expected) { - return this.actual < expected; -}; - -jasmine.Matchers.prototype.toBeGreaterThan = function(expected) { - return this.actual > expected; -}; - -/** - * Matcher that checks that the expected item is equal to the actual item - * up to a given level of decimal precision (default 2). - * - * @param {Number} expected - * @param {Number} precision - */ -jasmine.Matchers.prototype.toBeCloseTo = function(expected, precision) { - if (!(precision === 0)) { - precision = precision || 2; - } - var multiplier = Math.pow(10, precision); - var actual = Math.round(this.actual * multiplier); - expected = Math.round(expected * multiplier); - return expected == actual; -}; - -/** - * Matcher that checks that the expected exception was thrown by the actual. - * - * @param {String} expected - */ -jasmine.Matchers.prototype.toThrow = function(expected) { - var result = false; - var exception; - if (typeof this.actual != 'function') { - throw new Error('Actual is not a function'); - } - try { - this.actual(); - } catch (e) { - exception = e; - } - if (exception) { - result = (expected === jasmine.undefined || this.env.equals_(exception.message || exception, expected.message || expected)); - } - - var not = this.isNot ? "not " : ""; - - this.message = function() { - if (exception && (expected === jasmine.undefined || !this.env.equals_(exception.message || exception, expected.message || expected))) { - return ["Expected function " + not + "to throw", expected ? expected.message || expected : "an exception", ", but it threw", exception.message || exception].join(' '); - } else { - return "Expected function to throw an exception."; - } - }; - - return result; -}; - -jasmine.Matchers.Any = function(expectedClass) { - this.expectedClass = expectedClass; -}; - -jasmine.Matchers.Any.prototype.matches = function(other) { - if (this.expectedClass == String) { - return typeof other == 'string' || other instanceof String; - } - - if (this.expectedClass == Number) { - return typeof other == 'number' || other instanceof Number; - } - - if (this.expectedClass == Function) { - return typeof other == 'function' || other instanceof Function; - } - - if (this.expectedClass == Object) { - return typeof other == 'object'; - } - - return other instanceof this.expectedClass; -}; - -jasmine.Matchers.Any.prototype.toString = function() { - return ''; -}; - -/** - * @constructor - */ -jasmine.MultiReporter = function() { - this.subReporters_ = []; -}; -jasmine.util.inherit(jasmine.MultiReporter, jasmine.Reporter); - -jasmine.MultiReporter.prototype.addReporter = function(reporter) { - this.subReporters_.push(reporter); -}; - -(function() { - var functionNames = [ - "reportRunnerStarting", - "reportRunnerResults", - "reportSuiteResults", - "reportSpecStarting", - "reportSpecResults", - "log" - ]; - for (var i = 0; i < functionNames.length; i++) { - var functionName = functionNames[i]; - jasmine.MultiReporter.prototype[functionName] = (function(functionName) { - return function() { - for (var j = 0; j < this.subReporters_.length; j++) { - var subReporter = this.subReporters_[j]; - if (subReporter[functionName]) { - subReporter[functionName].apply(subReporter, arguments); - } - } - }; - })(functionName); - } -})(); -/** - * Holds results for a set of Jasmine spec. Allows for the results array to hold another jasmine.NestedResults - * - * @constructor - */ -jasmine.NestedResults = function() { - /** - * The total count of results - */ - this.totalCount = 0; - /** - * Number of passed results - */ - this.passedCount = 0; - /** - * Number of failed results - */ - this.failedCount = 0; - /** - * Was this suite/spec skipped? - */ - this.skipped = false; - /** - * @ignore - */ - this.items_ = []; -}; - -/** - * Roll up the result counts. - * - * @param result - */ -jasmine.NestedResults.prototype.rollupCounts = function(result) { - this.totalCount += result.totalCount; - this.passedCount += result.passedCount; - this.failedCount += result.failedCount; -}; - -/** - * Adds a log message. - * @param values Array of message parts which will be concatenated later. - */ -jasmine.NestedResults.prototype.log = function(values) { - this.items_.push(new jasmine.MessageResult(values)); -}; - -/** - * Getter for the results: message & results. - */ -jasmine.NestedResults.prototype.getItems = function() { - return this.items_; -}; - -/** - * Adds a result, tracking counts (total, passed, & failed) - * @param {jasmine.ExpectationResult|jasmine.NestedResults} result - */ -jasmine.NestedResults.prototype.addResult = function(result) { - if (result.type != 'log') { - if (result.items_) { - this.rollupCounts(result); - } else { - this.totalCount++; - if (result.passed()) { - this.passedCount++; - } else { - this.failedCount++; - } - } - } - this.items_.push(result); -}; - -/** - * @returns {Boolean} True if everything below passed - */ -jasmine.NestedResults.prototype.passed = function() { - return this.passedCount === this.totalCount; -}; -/** - * Base class for pretty printing for expectation results. - */ -jasmine.PrettyPrinter = function() { - this.ppNestLevel_ = 0; -}; - -/** - * Formats a value in a nice, human-readable string. - * - * @param value - */ -jasmine.PrettyPrinter.prototype.format = function(value) { - if (this.ppNestLevel_ > 40) { - throw new Error('jasmine.PrettyPrinter: format() nested too deeply!'); - } - - this.ppNestLevel_++; - try { - if (value === jasmine.undefined) { - this.emitScalar('undefined'); - } else if (value === null) { - this.emitScalar('null'); - } else if (value === jasmine.getGlobal()) { - this.emitScalar(''); - } else if (value instanceof jasmine.Matchers.Any) { - this.emitScalar(value.toString()); - } else if (typeof value === 'string') { - this.emitString(value); - } else if (jasmine.isSpy(value)) { - this.emitScalar("spy on " + value.identity); - } else if (value instanceof RegExp) { - this.emitScalar(value.toString()); - } else if (typeof value === 'function') { - this.emitScalar('Function'); - } else if (typeof value.nodeType === 'number') { - this.emitScalar('HTMLNode'); - } else if (value instanceof Date) { - this.emitScalar('Date(' + value + ')'); - } else if (value.__Jasmine_been_here_before__) { - this.emitScalar(''); - } else if (jasmine.isArray_(value) || typeof value == 'object') { - value.__Jasmine_been_here_before__ = true; - if (jasmine.isArray_(value)) { - this.emitArray(value); - } else { - this.emitObject(value); - } - delete value.__Jasmine_been_here_before__; - } else { - this.emitScalar(value.toString()); - } - } finally { - this.ppNestLevel_--; - } -}; - -jasmine.PrettyPrinter.prototype.iterateObject = function(obj, fn) { - for (var property in obj) { - if (property == '__Jasmine_been_here_before__') continue; - fn(property, obj.__lookupGetter__ ? (obj.__lookupGetter__(property) !== jasmine.undefined && - obj.__lookupGetter__(property) !== null) : false); - } -}; - -jasmine.PrettyPrinter.prototype.emitArray = jasmine.unimplementedMethod_; -jasmine.PrettyPrinter.prototype.emitObject = jasmine.unimplementedMethod_; -jasmine.PrettyPrinter.prototype.emitScalar = jasmine.unimplementedMethod_; -jasmine.PrettyPrinter.prototype.emitString = jasmine.unimplementedMethod_; - -jasmine.StringPrettyPrinter = function() { - jasmine.PrettyPrinter.call(this); - - this.string = ''; -}; -jasmine.util.inherit(jasmine.StringPrettyPrinter, jasmine.PrettyPrinter); - -jasmine.StringPrettyPrinter.prototype.emitScalar = function(value) { - this.append(value); -}; - -jasmine.StringPrettyPrinter.prototype.emitString = function(value) { - this.append("'" + value + "'"); -}; - -jasmine.StringPrettyPrinter.prototype.emitArray = function(array) { - this.append('[ '); - for (var i = 0; i < array.length; i++) { - if (i > 0) { - this.append(', '); - } - this.format(array[i]); - } - this.append(' ]'); -}; - -jasmine.StringPrettyPrinter.prototype.emitObject = function(obj) { - var self = this; - this.append('{ '); - var first = true; - - this.iterateObject(obj, function(property, isGetter) { - if (first) { - first = false; - } else { - self.append(', '); - } - - self.append(property); - self.append(' : '); - if (isGetter) { - self.append(''); - } else { - self.format(obj[property]); - } - }); - - this.append(' }'); -}; - -jasmine.StringPrettyPrinter.prototype.append = function(value) { - this.string += value; -}; -jasmine.Queue = function(env) { - this.env = env; - this.blocks = []; - this.running = false; - this.index = 0; - this.offset = 0; - this.abort = false; -}; - -jasmine.Queue.prototype.addBefore = function(block) { - this.blocks.unshift(block); -}; - -jasmine.Queue.prototype.add = function(block) { - this.blocks.push(block); -}; - -jasmine.Queue.prototype.insertNext = function(block) { - this.blocks.splice((this.index + this.offset + 1), 0, block); - this.offset++; -}; - -jasmine.Queue.prototype.start = function(onComplete) { - this.running = true; - this.onComplete = onComplete; - this.next_(); -}; - -jasmine.Queue.prototype.isRunning = function() { - return this.running; -}; - -jasmine.Queue.LOOP_DONT_RECURSE = true; - -jasmine.Queue.prototype.next_ = function() { - var self = this; - var goAgain = true; - - while (goAgain) { - goAgain = false; - - if (self.index < self.blocks.length && !this.abort) { - var calledSynchronously = true; - var completedSynchronously = false; - - var onComplete = function () { - if (jasmine.Queue.LOOP_DONT_RECURSE && calledSynchronously) { - completedSynchronously = true; - return; - } - - if (self.blocks[self.index].abort) { - self.abort = true; - } - - self.offset = 0; - self.index++; - - var now = new Date().getTime(); - if (self.env.updateInterval && now - self.env.lastUpdate > self.env.updateInterval) { - self.env.lastUpdate = now; - self.env.setTimeout(function() { - self.next_(); - }, 0); - } else { - if (jasmine.Queue.LOOP_DONT_RECURSE && completedSynchronously) { - goAgain = true; - } else { - self.next_(); - } - } - }; - self.blocks[self.index].execute(onComplete); - - calledSynchronously = false; - if (completedSynchronously) { - onComplete(); - } - - } else { - self.running = false; - if (self.onComplete) { - self.onComplete(); - } - } - } -}; - -jasmine.Queue.prototype.results = function() { - var results = new jasmine.NestedResults(); - for (var i = 0; i < this.blocks.length; i++) { - if (this.blocks[i].results) { - results.addResult(this.blocks[i].results()); - } - } - return results; -}; - - -/** - * Runner - * - * @constructor - * @param {jasmine.Env} env - */ -jasmine.Runner = function(env) { - var self = this; - self.env = env; - self.queue = new jasmine.Queue(env); - self.before_ = []; - self.after_ = []; - self.suites_ = []; -}; - -jasmine.Runner.prototype.execute = function() { - var self = this; - if (self.env.reporter.reportRunnerStarting) { - self.env.reporter.reportRunnerStarting(this); - } - self.queue.start(function () { - self.finishCallback(); - }); -}; - -jasmine.Runner.prototype.beforeEach = function(beforeEachFunction) { - beforeEachFunction.typeName = 'beforeEach'; - this.before_.splice(0,0,beforeEachFunction); -}; - -jasmine.Runner.prototype.afterEach = function(afterEachFunction) { - afterEachFunction.typeName = 'afterEach'; - this.after_.splice(0,0,afterEachFunction); -}; - - -jasmine.Runner.prototype.finishCallback = function() { - this.env.reporter.reportRunnerResults(this); -}; - -jasmine.Runner.prototype.addSuite = function(suite) { - this.suites_.push(suite); -}; - -jasmine.Runner.prototype.add = function(block) { - if (block instanceof jasmine.Suite) { - this.addSuite(block); - } - this.queue.add(block); -}; - -jasmine.Runner.prototype.specs = function () { - var suites = this.suites(); - var specs = []; - for (var i = 0; i < suites.length; i++) { - specs = specs.concat(suites[i].specs()); - } - return specs; -}; - -jasmine.Runner.prototype.suites = function() { - return this.suites_; -}; - -jasmine.Runner.prototype.topLevelSuites = function() { - var topLevelSuites = []; - for (var i = 0; i < this.suites_.length; i++) { - if (!this.suites_[i].parentSuite) { - topLevelSuites.push(this.suites_[i]); - } - } - return topLevelSuites; -}; - -jasmine.Runner.prototype.results = function() { - return this.queue.results(); -}; -/** - * Internal representation of a Jasmine specification, or test. - * - * @constructor - * @param {jasmine.Env} env - * @param {jasmine.Suite} suite - * @param {String} description - */ -jasmine.Spec = function(env, suite, description) { - if (!env) { - throw new Error('jasmine.Env() required'); - } - if (!suite) { - throw new Error('jasmine.Suite() required'); - } - var spec = this; - spec.id = env.nextSpecId ? env.nextSpecId() : null; - spec.env = env; - spec.suite = suite; - spec.description = description; - spec.queue = new jasmine.Queue(env); - - spec.afterCallbacks = []; - spec.spies_ = []; - - spec.results_ = new jasmine.NestedResults(); - spec.results_.description = description; - spec.matchersClass = null; -}; - -jasmine.Spec.prototype.getFullName = function() { - return this.suite.getFullName() + ' ' + this.description + '.'; -}; - - -jasmine.Spec.prototype.results = function() { - return this.results_; -}; - -/** - * All parameters are pretty-printed and concatenated together, then written to the spec's output. - * - * Be careful not to leave calls to jasmine.log in production code. - */ -jasmine.Spec.prototype.log = function() { - return this.results_.log(arguments); -}; - -jasmine.Spec.prototype.runs = function (func) { - var block = new jasmine.Block(this.env, func, this); - this.addToQueue(block); - return this; -}; - -jasmine.Spec.prototype.addToQueue = function (block) { - if (this.queue.isRunning()) { - this.queue.insertNext(block); - } else { - this.queue.add(block); - } -}; - -/** - * @param {jasmine.ExpectationResult} result - */ -jasmine.Spec.prototype.addMatcherResult = function(result) { - this.results_.addResult(result); -}; - -jasmine.Spec.prototype.expect = function(actual) { - var positive = new (this.getMatchersClass_())(this.env, actual, this); - positive.not = new (this.getMatchersClass_())(this.env, actual, this, true); - return positive; -}; - -/** - * Waits a fixed time period before moving to the next block. - * - * @deprecated Use waitsFor() instead - * @param {Number} timeout milliseconds to wait - */ -jasmine.Spec.prototype.waits = function(timeout) { - var waitsFunc = new jasmine.WaitsBlock(this.env, timeout, this); - this.addToQueue(waitsFunc); - return this; -}; - -/** - * Waits for the latchFunction to return true before proceeding to the next block. - * - * @param {Function} latchFunction - * @param {String} optional_timeoutMessage - * @param {Number} optional_timeout - */ -jasmine.Spec.prototype.waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) { - var latchFunction_ = null; - var optional_timeoutMessage_ = null; - var optional_timeout_ = null; - - for (var i = 0; i < arguments.length; i++) { - var arg = arguments[i]; - switch (typeof arg) { - case 'function': - latchFunction_ = arg; - break; - case 'string': - optional_timeoutMessage_ = arg; - break; - case 'number': - optional_timeout_ = arg; - break; - } - } - - var waitsForFunc = new jasmine.WaitsForBlock(this.env, optional_timeout_, latchFunction_, optional_timeoutMessage_, this); - this.addToQueue(waitsForFunc); - return this; -}; - -jasmine.Spec.prototype.fail = function (e) { - var expectationResult = new jasmine.ExpectationResult({ - passed: false, - message: e ? jasmine.util.formatException(e) : 'Exception', - trace: { stack: e.stack } - }); - this.results_.addResult(expectationResult); -}; - -jasmine.Spec.prototype.getMatchersClass_ = function() { - return this.matchersClass || this.env.matchersClass; -}; - -jasmine.Spec.prototype.addMatchers = function(matchersPrototype) { - var parent = this.getMatchersClass_(); - var newMatchersClass = function() { - parent.apply(this, arguments); - }; - jasmine.util.inherit(newMatchersClass, parent); - jasmine.Matchers.wrapInto_(matchersPrototype, newMatchersClass); - this.matchersClass = newMatchersClass; -}; - -jasmine.Spec.prototype.finishCallback = function() { - this.env.reporter.reportSpecResults(this); -}; - -jasmine.Spec.prototype.finish = function(onComplete) { - this.removeAllSpies(); - this.finishCallback(); - if (onComplete) { - onComplete(); - } -}; - -jasmine.Spec.prototype.after = function(doAfter) { - if (this.queue.isRunning()) { - this.queue.add(new jasmine.Block(this.env, doAfter, this)); - } else { - this.afterCallbacks.unshift(doAfter); - } -}; - -jasmine.Spec.prototype.execute = function(onComplete) { - var spec = this; - if (!spec.env.specFilter(spec)) { - spec.results_.skipped = true; - spec.finish(onComplete); - return; - } - - this.env.reporter.reportSpecStarting(this); - - spec.env.currentSpec = spec; - - spec.addBeforesAndAftersToQueue(); - - spec.queue.start(function () { - spec.finish(onComplete); - }); -}; - -jasmine.Spec.prototype.addBeforesAndAftersToQueue = function() { - var runner = this.env.currentRunner(); - var i; - - for (var suite = this.suite; suite; suite = suite.parentSuite) { - for (i = 0; i < suite.before_.length; i++) { - this.queue.addBefore(new jasmine.Block(this.env, suite.before_[i], this)); - } - } - for (i = 0; i < runner.before_.length; i++) { - this.queue.addBefore(new jasmine.Block(this.env, runner.before_[i], this)); - } - for (i = 0; i < this.afterCallbacks.length; i++) { - this.queue.add(new jasmine.Block(this.env, this.afterCallbacks[i], this)); - } - for (suite = this.suite; suite; suite = suite.parentSuite) { - for (i = 0; i < suite.after_.length; i++) { - this.queue.add(new jasmine.Block(this.env, suite.after_[i], this)); - } - } - for (i = 0; i < runner.after_.length; i++) { - this.queue.add(new jasmine.Block(this.env, runner.after_[i], this)); - } -}; - -jasmine.Spec.prototype.explodes = function() { - throw 'explodes function should not have been called'; -}; - -jasmine.Spec.prototype.spyOn = function(obj, methodName, ignoreMethodDoesntExist) { - if (obj == jasmine.undefined) { - throw "spyOn could not find an object to spy upon for " + methodName + "()"; - } - - if (!ignoreMethodDoesntExist && obj[methodName] === jasmine.undefined) { - throw methodName + '() method does not exist'; - } - - if (!ignoreMethodDoesntExist && obj[methodName] && obj[methodName].isSpy) { - throw new Error(methodName + ' has already been spied upon'); - } - - var spyObj = jasmine.createSpy(methodName); - - this.spies_.push(spyObj); - spyObj.baseObj = obj; - spyObj.methodName = methodName; - spyObj.originalValue = obj[methodName]; - - obj[methodName] = spyObj; - - return spyObj; -}; - -jasmine.Spec.prototype.removeAllSpies = function() { - for (var i = 0; i < this.spies_.length; i++) { - var spy = this.spies_[i]; - spy.baseObj[spy.methodName] = spy.originalValue; - } - this.spies_ = []; -}; - -/** - * Internal representation of a Jasmine suite. - * - * @constructor - * @param {jasmine.Env} env - * @param {String} description - * @param {Function} specDefinitions - * @param {jasmine.Suite} parentSuite - */ -jasmine.Suite = function(env, description, specDefinitions, parentSuite) { - var self = this; - self.id = env.nextSuiteId ? env.nextSuiteId() : null; - self.description = description; - self.queue = new jasmine.Queue(env); - self.parentSuite = parentSuite; - self.env = env; - self.before_ = []; - self.after_ = []; - self.children_ = []; - self.suites_ = []; - self.specs_ = []; -}; - -jasmine.Suite.prototype.getFullName = function() { - var fullName = this.description; - for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) { - fullName = parentSuite.description + ' ' + fullName; - } - return fullName; -}; - -jasmine.Suite.prototype.finish = function(onComplete) { - this.env.reporter.reportSuiteResults(this); - this.finished = true; - if (typeof(onComplete) == 'function') { - onComplete(); - } -}; - -jasmine.Suite.prototype.beforeEach = function(beforeEachFunction) { - beforeEachFunction.typeName = 'beforeEach'; - this.before_.unshift(beforeEachFunction); -}; - -jasmine.Suite.prototype.afterEach = function(afterEachFunction) { - afterEachFunction.typeName = 'afterEach'; - this.after_.unshift(afterEachFunction); -}; - -jasmine.Suite.prototype.results = function() { - return this.queue.results(); -}; - -jasmine.Suite.prototype.add = function(suiteOrSpec) { - this.children_.push(suiteOrSpec); - if (suiteOrSpec instanceof jasmine.Suite) { - this.suites_.push(suiteOrSpec); - this.env.currentRunner().addSuite(suiteOrSpec); - } else { - this.specs_.push(suiteOrSpec); - } - this.queue.add(suiteOrSpec); -}; - -jasmine.Suite.prototype.specs = function() { - return this.specs_; -}; - -jasmine.Suite.prototype.suites = function() { - return this.suites_; -}; - -jasmine.Suite.prototype.children = function() { - return this.children_; -}; - -jasmine.Suite.prototype.execute = function(onComplete) { - var self = this; - this.queue.start(function () { - self.finish(onComplete); - }); -}; -jasmine.WaitsBlock = function(env, timeout, spec) { - this.timeout = timeout; - jasmine.Block.call(this, env, null, spec); -}; - -jasmine.util.inherit(jasmine.WaitsBlock, jasmine.Block); - -jasmine.WaitsBlock.prototype.execute = function (onComplete) { - if (jasmine.VERBOSE) { - this.env.reporter.log('>> Jasmine waiting for ' + this.timeout + ' ms...'); - } - this.env.setTimeout(function () { - onComplete(); - }, this.timeout); -}; -/** - * A block which waits for some condition to become true, with timeout. - * - * @constructor - * @extends jasmine.Block - * @param {jasmine.Env} env The Jasmine environment. - * @param {Number} timeout The maximum time in milliseconds to wait for the condition to become true. - * @param {Function} latchFunction A function which returns true when the desired condition has been met. - * @param {String} message The message to display if the desired condition hasn't been met within the given time period. - * @param {jasmine.Spec} spec The Jasmine spec. - */ -jasmine.WaitsForBlock = function(env, timeout, latchFunction, message, spec) { - this.timeout = timeout || env.defaultTimeoutInterval; - this.latchFunction = latchFunction; - this.message = message; - this.totalTimeSpentWaitingForLatch = 0; - jasmine.Block.call(this, env, null, spec); -}; -jasmine.util.inherit(jasmine.WaitsForBlock, jasmine.Block); - -jasmine.WaitsForBlock.TIMEOUT_INCREMENT = 10; - -jasmine.WaitsForBlock.prototype.execute = function(onComplete) { - if (jasmine.VERBOSE) { - this.env.reporter.log('>> Jasmine waiting for ' + (this.message || 'something to happen')); - } - var latchFunctionResult; - try { - latchFunctionResult = this.latchFunction.apply(this.spec); - } catch (e) { - this.spec.fail(e); - onComplete(); - return; - } - - if (latchFunctionResult) { - onComplete(); - } else if (this.totalTimeSpentWaitingForLatch >= this.timeout) { - var message = 'timed out after ' + this.timeout + ' msec waiting for ' + (this.message || 'something to happen'); - this.spec.fail({ - name: 'timeout', - message: message - }); - - this.abort = true; - onComplete(); - } else { - this.totalTimeSpentWaitingForLatch += jasmine.WaitsForBlock.TIMEOUT_INCREMENT; - var self = this; - this.env.setTimeout(function() { - self.execute(onComplete); - }, jasmine.WaitsForBlock.TIMEOUT_INCREMENT); - } -}; -// Mock setTimeout, clearTimeout -// Contributed by Pivotal Computer Systems, www.pivotalsf.com - -jasmine.FakeTimer = function() { - this.reset(); - - var self = this; - self.setTimeout = function(funcToCall, millis) { - self.timeoutsMade++; - self.scheduleFunction(self.timeoutsMade, funcToCall, millis, false); - return self.timeoutsMade; - }; - - self.setInterval = function(funcToCall, millis) { - self.timeoutsMade++; - self.scheduleFunction(self.timeoutsMade, funcToCall, millis, true); - return self.timeoutsMade; - }; - - self.clearTimeout = function(timeoutKey) { - self.scheduledFunctions[timeoutKey] = jasmine.undefined; - }; - - self.clearInterval = function(timeoutKey) { - self.scheduledFunctions[timeoutKey] = jasmine.undefined; - }; - -}; - -jasmine.FakeTimer.prototype.reset = function() { - this.timeoutsMade = 0; - this.scheduledFunctions = {}; - this.nowMillis = 0; -}; - -jasmine.FakeTimer.prototype.tick = function(millis) { - var oldMillis = this.nowMillis; - var newMillis = oldMillis + millis; - this.runFunctionsWithinRange(oldMillis, newMillis); - this.nowMillis = newMillis; -}; - -jasmine.FakeTimer.prototype.runFunctionsWithinRange = function(oldMillis, nowMillis) { - var scheduledFunc; - var funcsToRun = []; - for (var timeoutKey in this.scheduledFunctions) { - scheduledFunc = this.scheduledFunctions[timeoutKey]; - if (scheduledFunc != jasmine.undefined && - scheduledFunc.runAtMillis >= oldMillis && - scheduledFunc.runAtMillis <= nowMillis) { - funcsToRun.push(scheduledFunc); - this.scheduledFunctions[timeoutKey] = jasmine.undefined; - } - } - - if (funcsToRun.length > 0) { - funcsToRun.sort(function(a, b) { - return a.runAtMillis - b.runAtMillis; - }); - for (var i = 0; i < funcsToRun.length; ++i) { - try { - var funcToRun = funcsToRun[i]; - this.nowMillis = funcToRun.runAtMillis; - funcToRun.funcToCall(); - if (funcToRun.recurring) { - this.scheduleFunction(funcToRun.timeoutKey, - funcToRun.funcToCall, - funcToRun.millis, - true); - } - } catch(e) { - } - } - this.runFunctionsWithinRange(oldMillis, nowMillis); - } -}; - -jasmine.FakeTimer.prototype.scheduleFunction = function(timeoutKey, funcToCall, millis, recurring) { - this.scheduledFunctions[timeoutKey] = { - runAtMillis: this.nowMillis + millis, - funcToCall: funcToCall, - recurring: recurring, - timeoutKey: timeoutKey, - millis: millis - }; -}; - -/** - * @namespace - */ -jasmine.Clock = { - defaultFakeTimer: new jasmine.FakeTimer(), - - reset: function() { - jasmine.Clock.assertInstalled(); - jasmine.Clock.defaultFakeTimer.reset(); - }, - - tick: function(millis) { - jasmine.Clock.assertInstalled(); - jasmine.Clock.defaultFakeTimer.tick(millis); - }, - - runFunctionsWithinRange: function(oldMillis, nowMillis) { - jasmine.Clock.defaultFakeTimer.runFunctionsWithinRange(oldMillis, nowMillis); - }, - - scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) { - jasmine.Clock.defaultFakeTimer.scheduleFunction(timeoutKey, funcToCall, millis, recurring); - }, - - useMock: function() { - if (!jasmine.Clock.isInstalled()) { - var spec = jasmine.getEnv().currentSpec; - spec.after(jasmine.Clock.uninstallMock); - - jasmine.Clock.installMock(); - } - }, - - installMock: function() { - jasmine.Clock.installed = jasmine.Clock.defaultFakeTimer; - }, - - uninstallMock: function() { - jasmine.Clock.assertInstalled(); - jasmine.Clock.installed = jasmine.Clock.real; - }, - - real: { - setTimeout: jasmine.getGlobal().setTimeout, - clearTimeout: jasmine.getGlobal().clearTimeout, - setInterval: jasmine.getGlobal().setInterval, - clearInterval: jasmine.getGlobal().clearInterval - }, - - assertInstalled: function() { - if (!jasmine.Clock.isInstalled()) { - throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()"); - } - }, - - isInstalled: function() { - return jasmine.Clock.installed == jasmine.Clock.defaultFakeTimer; - }, - - installed: null -}; -jasmine.Clock.installed = jasmine.Clock.real; - -//else for IE support -jasmine.getGlobal().setTimeout = function(funcToCall, millis) { - if (jasmine.Clock.installed.setTimeout.apply) { - return jasmine.Clock.installed.setTimeout.apply(this, arguments); - } else { - return jasmine.Clock.installed.setTimeout(funcToCall, millis); - } -}; - -jasmine.getGlobal().setInterval = function(funcToCall, millis) { - if (jasmine.Clock.installed.setInterval.apply) { - return jasmine.Clock.installed.setInterval.apply(this, arguments); - } else { - return jasmine.Clock.installed.setInterval(funcToCall, millis); - } -}; - -jasmine.getGlobal().clearTimeout = function(timeoutKey) { - if (jasmine.Clock.installed.clearTimeout.apply) { - return jasmine.Clock.installed.clearTimeout.apply(this, arguments); - } else { - return jasmine.Clock.installed.clearTimeout(timeoutKey); - } -}; - -jasmine.getGlobal().clearInterval = function(timeoutKey) { - if (jasmine.Clock.installed.clearTimeout.apply) { - return jasmine.Clock.installed.clearInterval.apply(this, arguments); - } else { - return jasmine.Clock.installed.clearInterval(timeoutKey); - } -}; - -jasmine.version_= { - "major": 1, - "minor": 1, - "build": 0, - "revision": 1315677058 -}; diff --git a/node_modules/mongoose/node_modules/mongodb/node_modules/bson/tools/jasmine-1.1.0/jasmine_favicon.png b/node_modules/mongoose/node_modules/mongodb/node_modules/bson/tools/jasmine-1.1.0/jasmine_favicon.png deleted file mode 100644 index 218f3b43713598fa5a3e78b57aceb909c33f46df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 905 zcmV;419tq0P)Px#AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_0008u zNkl3{fod28|PjmA)7fYg4w8-(2my9xtBGOs}K`n&t1VzxMO^X)M zrW+Ln1udc?q6TP)z5gAjt)P&D!M$+HJK#x<`xnD030zwD?KrxxY!2tlA zGc-58?0D7SsT)7Km=v+tNVNUk`?s@;^OxCF)y6P}_mL;~7;S<@b|MzmKq)m8l@yky zT1~ECpxZw@64!nkI34QLiUsA%i%N>-$&zGYR7WJyi9ERMyS(%kf z7A_r)X>!90&m(FwDQZ>q;+nOa*KR2+E6Fz)QwU=W1Oyo*4>_qlm|~joa|{4_A_3W8 z#FFZzRp-xMIx5a7D_Fj3&#r^TbIY@cND1d0f*^qDIs{!pw!IWGQ_%l4#ASm_D5Vet z0%ek7^)@xPihX_G0&hIc9*14ca=D!8oG}vW?H%~w^F?f_s>zU|fKrNJXJ_d6{v!t( zpEoqMws_yQws>3o?VW8Txq~#->dJG^ELW5irR!s`(_JvD^6;r+ho~eIK@ia8_lH(h zt*-p?CFC1_h2MV=?jP){uW!7WjLjCaO&c1D+tf582!XEaoB#xWAYcN5f$sLtf$koW zQs{{>)ZTq?FC6|J_%n}AWbiFK(Bo-%^-{H`*)E(ucjo-r%SYm)W5f6tN=xz=S646E fNXW#U{x?4WXWJ=0.3.0", - "markdown": "0.3.1", - "gleak": "0.2.3", - "step": "0.0.5", - "async": "0.1.22" - }, - "config": { - "native": false - }, - "main": "./lib/mongodb/index", - "homepage": "http://mongodb.github.com/node-mongodb-native/", - "directories": { - "lib": "./lib/mongodb" - }, - "engines": { - "node": ">=0.6.19" - }, - "scripts": { - "test": "make test_pure" - }, - "licenses": [ - { - "type": "Apache License, Version 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - ], - "readme": "Up to date documentation\n========================\n\n[Documentation](http://mongodb.github.com/node-mongodb-native/)\n\nInstall\n=======\n\nTo install the most recent release from npm, run:\n\n npm install mongodb\n\nThat may give you a warning telling you that bugs['web'] should be bugs['url'], it would be safe to ignore it (this has been fixed in the development version)\n\nTo install the latest from the repository, run::\n\n npm install path/to/node-mongodb-native\n\nCommunity\n=========\nCheck out the google group [node-mongodb-native](http://groups.google.com/group/node-mongodb-native) for questions/answers from users of the driver.\n\nTry it live\n============\n\n\nIntroduction\n============\n\nThis is a node.js driver for MongoDB. It's a port (or close to a port) of the library for ruby at http://github.com/mongodb/mongo-ruby-driver/.\n\nA simple example of inserting a document.\n\n```javascript\n var client = new Db('test', new Server(\"127.0.0.1\", 27017, {}), {w: 1}),\n test = function (err, collection) {\n collection.insert({a:2}, function(err, docs) {\n\n collection.count(function(err, count) {\n test.assertEquals(1, count);\n });\n\n // Locate all the entries using find\n collection.find().toArray(function(err, results) {\n test.assertEquals(1, results.length);\n test.assertTrue(results[0].a === 2);\n\n // Let's close the db\n client.close();\n });\n });\n };\n\n client.open(function(err, p_client) {\n client.collection('test_insert', test);\n });\n```\n\nData types\n==========\n\nTo store and retrieve the non-JSON MongoDb primitives ([ObjectID](http://www.mongodb.org/display/DOCS/Object+IDs), Long, Binary, [Timestamp](http://www.mongodb.org/display/DOCS/Timestamp+data+type), [DBRef](http://www.mongodb.org/display/DOCS/Database+References#DatabaseReferences-DBRef), Code).\n\nIn particular, every document has a unique `_id` which can be almost any type, and by default a 12-byte ObjectID is created. ObjectIDs can be represented as 24-digit hexadecimal strings, but you must convert the string back into an ObjectID before you can use it in the database. For example:\n\n```javascript\n // Get the objectID type\n var ObjectID = require('mongodb').ObjectID;\n\n var idString = '4e4e1638c85e808431000003';\n collection.findOne({_id: new ObjectID(idString)}, console.log) // ok\n collection.findOne({_id: idString}, console.log) // wrong! callback gets undefined\n```\n\nHere are the constructors the non-Javascript BSON primitive types:\n\n```javascript\n // Fetch the library\n var mongo = require('mongodb');\n // Create new instances of BSON types\n new mongo.Long(numberString)\n new mongo.ObjectID(hexString)\n new mongo.Timestamp() // the actual unique number is generated on insert.\n new mongo.DBRef(collectionName, id, dbName)\n new mongo.Binary(buffer) // takes a string or Buffer\n new mongo.Code(code, [context])\n new mongo.Symbol(string)\n new mongo.MinKey()\n new mongo.MaxKey()\n new mongo.Double(number)\t// Force double storage\n```\n\nThe C/C++ bson parser/serializer\n--------------------------------\n\nIf you are running a version of this library has the C/C++ parser compiled, to enable the driver to use the C/C++ bson parser pass it the option native_parser:true like below\n\n```javascript\n // using native_parser:\n var client = new Db('integration_tests_20',\n new Server(\"127.0.0.1\", 27017),\n {native_parser:true});\n```\n\nThe C++ parser uses the js objects both for serialization and deserialization.\n\nGitHub information\n==================\n\nThe source code is available at http://github.com/mongodb/node-mongodb-native.\nYou can either clone the repository or download a tarball of the latest release.\n\nOnce you have the source you can test the driver by running\n\n $ make test\n\nin the main directory. You will need to have a mongo instance running on localhost for the integration tests to pass.\n\nExamples\n========\n\nFor examples look in the examples/ directory. You can execute the examples using node.\n\n $ cd examples\n $ node queries.js\n\nGridStore\n=========\n\nThe GridStore class allows for storage of binary files in mongoDB using the mongoDB defined files and chunks collection definition.\n\nFor more information have a look at [Gridstore](https://github.com/mongodb/node-mongodb-native/blob/master/docs/gridfs.md)\n\nReplicasets\n===========\nFor more information about how to connect to a replicaset have a look at [Replicasets](https://github.com/mongodb/node-mongodb-native/blob/master/docs/replicaset.md)\n\nPrimary Key Factories\n---------------------\n\nDefining your own primary key factory allows you to generate your own series of id's\n(this could f.ex be to use something like ISBN numbers). The generated the id needs to be a 12 byte long \"string\".\n\nSimple example below\n\n```javascript\n // Custom factory (need to provide a 12 byte array);\n CustomPKFactory = function() {}\n CustomPKFactory.prototype = new Object();\n CustomPKFactory.createPk = function() {\n return new ObjectID(\"aaaaaaaaaaaa\");\n }\n\n var p_client = new Db('integration_tests_20', new Server(\"127.0.0.1\", 27017, {}), {'pk':CustomPKFactory});\n p_client.open(function(err, p_client) {\n p_client.dropDatabase(function(err, done) {\n p_client.createCollection('test_custom_key', function(err, collection) {\n collection.insert({'a':1}, function(err, docs) {\n collection.find({'_id':new ObjectID(\"aaaaaaaaaaaa\")}, function(err, cursor) {\n cursor.toArray(function(err, items) {\n test.assertEquals(1, items.length);\n\n // Let's close the db\n p_client.close();\n });\n });\n });\n });\n });\n });\n```\n\nStrict mode\n-----------\n\nEach database has an optional strict mode. If it is set then asking for a collection\nthat does not exist will return an Error object in the callback. Similarly if you\nattempt to create a collection that already exists. Strict is provided for convenience.\n\n```javascript\n var error_client = new Db('integration_tests_', new Server(\"127.0.0.1\", 27017, {auto_reconnect: false}), {strict:true});\n test.assertEquals(true, error_client.strict);\n\n error_client.open(function(err, error_client) {\n error_client.collection('does-not-exist', function(err, collection) {\n test.assertTrue(err instanceof Error);\n test.assertEquals(\"Collection does-not-exist does not exist. Currently in strict mode.\", err.message);\n });\n\n error_client.createCollection('test_strict_access_collection', function(err, collection) {\n error_client.collection('test_strict_access_collection', function(err, collection) {\n test.assertTrue(collection instanceof Collection);\n // Let's close the db\n error_client.close();\n });\n });\n });\n```\n\nDocumentation\n=============\n\nIf this document doesn't answer your questions, see the source of\n[Collection](https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/collection.js)\nor [Cursor](https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/cursor.js),\nor the documentation at MongoDB for query and update formats.\n\nFind\n----\n\nThe find method is actually a factory method to create\nCursor objects. A Cursor lazily uses the connection the first time\nyou call `nextObject`, `each`, or `toArray`.\n\nThe basic operation on a cursor is the `nextObject` method\nthat fetches the next matching document from the database. The convenience\nmethods `each` and `toArray` call `nextObject` until the cursor is exhausted.\n\nSignatures:\n\n```javascript\n var cursor = collection.find(query, [fields], options);\n cursor.sort(fields).limit(n).skip(m).\n\n cursor.nextObject(function(err, doc) {});\n cursor.each(function(err, doc) {});\n cursor.toArray(function(err, docs) {});\n\n cursor.rewind() // reset the cursor to its initial state.\n```\n\nUseful chainable methods of cursor. These can optionally be options of `find` instead of method calls:\n\n* `.limit(n).skip(m)` to control paging.\n* `.sort(fields)` Order by the given fields. There are several equivalent syntaxes:\n * `.sort({field1: -1, field2: 1})` descending by field1, then ascending by field2.\n * `.sort([['field1', 'desc'], ['field2', 'asc']])` same as above\n * `.sort([['field1', 'desc'], 'field2'])` same as above\n * `.sort('field1')` ascending by field1\n\nOther options of `find`:\n\n* `fields` the fields to fetch (to avoid transferring the entire document)\n* `tailable` if true, makes the cursor [tailable](http://www.mongodb.org/display/DOCS/Tailable+Cursors).\n* `batchSize` The number of the subset of results to request the database\nto return for every request. This should initially be greater than 1 otherwise\nthe database will automatically close the cursor. The batch size can be set to 1\nwith `batchSize(n, function(err){})` after performing the initial query to the database.\n* `hint` See [Optimization: hint](http://www.mongodb.org/display/DOCS/Optimization#Optimization-Hint).\n* `explain` turns this into an explain query. You can also call\n`explain()` on any cursor to fetch the explanation.\n* `snapshot` prevents documents that are updated while the query is active\nfrom being returned multiple times. See more\n[details about query snapshots](http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database).\n* `timeout` if false, asks MongoDb not to time out this cursor after an\ninactivity period.\n\n\nFor information on how to create queries, see the\n[MongoDB section on querying](http://www.mongodb.org/display/DOCS/Querying).\n\n```javascript\n var mongodb = require('mongodb');\n var server = new mongodb.Server(\"127.0.0.1\", 27017, {});\n new mongodb.Db('test', server, {}).open(function (error, client) {\n if (error) throw error;\n var collection = new mongodb.Collection(client, 'test_collection');\n collection.find({}, {limit:10}).toArray(function(err, docs) {\n console.dir(docs);\n });\n });\n```\n\nInsert\n------\n\nSignature:\n\n```javascript\n collection.insert(docs, options, [callback]);\n```\n\nwhere `docs` can be a single document or an array of documents.\n\nUseful options:\n\n* `safe:true` Should always set if you have a callback.\n\nSee also: [MongoDB docs for insert](http://www.mongodb.org/display/DOCS/Inserting).\n\n```javascript\n var mongodb = require('mongodb');\n var server = new mongodb.Server(\"127.0.0.1\", 27017, {});\n new mongodb.Db('test', server, {w: 1}).open(function (error, client) {\n if (error) throw error;\n var collection = new mongodb.Collection(client, 'test_collection');\n collection.insert({hello: 'world'}, {safe:true},\n function(err, objects) {\n if (err) console.warn(err.message);\n if (err && err.message.indexOf('E11000 ') !== -1) {\n // this _id was already inserted in the database\n }\n });\n });\n```\n\nNote that there's no reason to pass a callback to the insert or update commands\nunless you use the `safe:true` option. If you don't specify `safe:true`, then\nyour callback will be called immediately.\n\nUpdate; update and insert (upsert)\n----------------------------------\n\nThe update operation will update the first document that matches your query\n(or all documents that match if you use `multi:true`).\nIf `safe:true`, `upsert` is not set, and no documents match, your callback will return 0 documents updated.\n\nSee the [MongoDB docs](http://www.mongodb.org/display/DOCS/Updating) for\nthe modifier (`$inc`, `$set`, `$push`, etc.) formats.\n\nSignature:\n\n```javascript\n collection.update(criteria, objNew, options, [callback]);\n```\n\nUseful options:\n\n* `safe:true` Should always set if you have a callback.\n* `multi:true` If set, all matching documents are updated, not just the first.\n* `upsert:true` Atomically inserts the document if no documents matched.\n\nExample for `update`:\n\n```javascript\n var mongodb = require('mongodb');\n var server = new mongodb.Server(\"127.0.0.1\", 27017, {});\n new mongodb.Db('test', server, {w: 1}).open(function (error, client) {\n if (error) throw error;\n var collection = new mongodb.Collection(client, 'test_collection');\n collection.update({hi: 'here'}, {$set: {hi: 'there'}}, {safe:true},\n function(err) {\n if (err) console.warn(err.message);\n else console.log('successfully updated');\n });\n });\n```\n\nFind and modify\n---------------\n\n`findAndModify` is like `update`, but it also gives the updated document to\nyour callback. But there are a few key differences between findAndModify and\nupdate:\n\n 1. The signatures differ.\n 2. You can only findAndModify a single item, not multiple items.\n\nSignature:\n\n```javascript\n collection.findAndModify(query, sort, update, options, callback)\n```\n\nThe sort parameter is used to specify which object to operate on, if more than\none document matches. It takes the same format as the cursor sort (see\nConnection.find above).\n\nSee the\n[MongoDB docs for findAndModify](http://www.mongodb.org/display/DOCS/findAndModify+Command)\nfor more details.\n\nUseful options:\n\n* `remove:true` set to a true to remove the object before returning\n* `new:true` set to true if you want to return the modified object rather than the original. Ignored for remove.\n* `upsert:true` Atomically inserts the document if no documents matched.\n\nExample for `findAndModify`:\n\n```javascript\n var mongodb = require('mongodb');\n var server = new mongodb.Server(\"127.0.0.1\", 27017, {});\n new mongodb.Db('test', server, {w: 1}).open(function (error, client) {\n if (error) throw error;\n var collection = new mongodb.Collection(client, 'test_collection');\n collection.findAndModify({hello: 'world'}, [['_id','asc']], {$set: {hi: 'there'}}, {},\n function(err, object) {\n if (err) console.warn(err.message);\n else console.dir(object); // undefined if no matching object exists.\n });\n });\n```\n\nSave\n----\n\nThe `save` method is a shorthand for upsert if the document contains an\n`_id`, or an insert if there is no `_id`.\n\nSponsors\n========\nJust as Felix Geisendörfer I'm also working on the driver for my own startup and this driver is a big project that also benefits other companies who are using MongoDB.\n\nIf your company could benefit from a even better-engineered node.js mongodb driver I would appreciate any type of sponsorship you may be able to provide. All the sponsors will get a lifetime display in this readme, priority support and help on problems and votes on the roadmap decisions for the driver. If you are interested contact me on [christkv AT g m a i l.com](mailto:christkv@gmail.com) for details.\n\nAnd I'm very thankful for code contributions. If you are interested in working on features please contact me so we can discuss API design and testing.\n\nRelease Notes\n=============\n\nSee HISTORY\n\nCredits\n=======\n\n1. [10gen](http://github.com/mongodb/mongo-ruby-driver/)\n2. [Google Closure Library](http://code.google.com/closure/library/)\n3. [Jonas Raoni Soares Silva](http://jsfromhell.com/classes/binary-parser)\n\nContributors\n============\n\nAaron Heckmann, Christoph Pojer, Pau Ramon Revilla, Nathan White, Emmerman, Seth LaForge, Boris Filipov, Stefan Schärmeli, Tedde Lundgren, renctan, Sergey Ukustov, Ciaran Jessup, kuno, srimonti, Erik Abele, Pratik Daga, Slobodan Utvic, Kristina Chodorow, Yonathan Randolph, Brian Noguchi, Sam Epstein, James Harrison Fisher, Vladimir Dronnikov, Ben Hockey, Henrik Johansson, Simon Weare, Alex Gorbatchev, Shimon Doodkin, Kyle Mueller, Eran Hammer-Lahav, Marcin Ciszak, François de Metz, Vinay Pulim, nstielau, Adam Wiggins, entrinzikyl, Jeremy Selier, Ian Millington, Public Keating, andrewjstone, Christopher Stott, Corey Jewett, brettkiefer, Rob Holland, Senmiao Liu, heroic, gitfy\n\nLicense\n=======\n\n Copyright 2009 - 2012 Christian Amor Kvalheim.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n", - "_id": "mongodb@1.2.13", - "_from": "mongodb@1.2.13" -} diff --git a/node_modules/mongoose/node_modules/mongodb/upload.py b/node_modules/mongoose/node_modules/mongodb/upload.py deleted file mode 100644 index 6296fde..0000000 --- a/node_modules/mongoose/node_modules/mongodb/upload.py +++ /dev/null @@ -1,2347 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 -# -# Copyright 2007 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tool for uploading diffs from a version control system to the codereview app. - -Usage summary: upload.py [options] [-- diff_options] [path...] - -Diff options are passed to the diff command of the underlying system. - -Supported version control systems: - Git - Mercurial - Subversion - Perforce - CVS - -It is important for Git/Mercurial users to specify a tree/node/branch to diff -against by using the '--rev' option. -""" -# This code is derived from appcfg.py in the App Engine SDK (open source), -# and from ASPN recipe #146306. - -import ConfigParser -import cookielib -import errno -import fnmatch -import getpass -import logging -import marshal -import mimetypes -import optparse -import os -import re -import socket -import subprocess -import sys -import urllib -import urllib2 -import urlparse - -# The md5 module was deprecated in Python 2.5. -try: - from hashlib import md5 -except ImportError: - from md5 import md5 - -try: - import readline -except ImportError: - pass - -try: - import keyring -except ImportError: - keyring = None - -# The logging verbosity: -# 0: Errors only. -# 1: Status messages. -# 2: Info logs. -# 3: Debug logs. -verbosity = 1 - -# The account type used for authentication. -# This line could be changed by the review server (see handler for -# upload.py). -AUTH_ACCOUNT_TYPE = "HOSTED" - -# URL of the default review server. As for AUTH_ACCOUNT_TYPE, this line could be -# changed by the review server (see handler for upload.py). -DEFAULT_REVIEW_SERVER = "codereview.10gen.com" - -# Max size of patch or base file. -MAX_UPLOAD_SIZE = 900 * 1024 - -# Constants for version control names. Used by GuessVCSName. -VCS_GIT = "Git" -VCS_MERCURIAL = "Mercurial" -VCS_SUBVERSION = "Subversion" -VCS_PERFORCE = "Perforce" -VCS_CVS = "CVS" -VCS_UNKNOWN = "Unknown" - -VCS_ABBREVIATIONS = { - VCS_MERCURIAL.lower(): VCS_MERCURIAL, - "hg": VCS_MERCURIAL, - VCS_SUBVERSION.lower(): VCS_SUBVERSION, - "svn": VCS_SUBVERSION, - VCS_PERFORCE.lower(): VCS_PERFORCE, - "p4": VCS_PERFORCE, - VCS_GIT.lower(): VCS_GIT, - VCS_CVS.lower(): VCS_CVS, -} - -# The result of parsing Subversion's [auto-props] setting. -svn_auto_props_map = None - -def GetEmail(prompt): - """Prompts the user for their email address and returns it. - - The last used email address is saved to a file and offered up as a suggestion - to the user. If the user presses enter without typing in anything the last - used email address is used. If the user enters a new address, it is saved - for next time we prompt. - - """ - last_email_file_name = os.path.expanduser("~/.last_codereview_email_address") - last_email = "" - if os.path.exists(last_email_file_name): - try: - last_email_file = open(last_email_file_name, "r") - last_email = last_email_file.readline().strip("\n") - last_email_file.close() - prompt += " [%s]" % last_email - except IOError, e: - pass - email = raw_input(prompt + ": ").strip() - if email: - try: - last_email_file = open(last_email_file_name, "w") - last_email_file.write(email) - last_email_file.close() - except IOError, e: - pass - else: - email = last_email - return email - - -def StatusUpdate(msg): - """Print a status message to stdout. - - If 'verbosity' is greater than 0, print the message. - - Args: - msg: The string to print. - """ - if verbosity > 0: - print msg - - -def ErrorExit(msg): - """Print an error message to stderr and exit.""" - print >>sys.stderr, msg - sys.exit(1) - - -class ClientLoginError(urllib2.HTTPError): - """Raised to indicate there was an error authenticating with ClientLogin.""" - - def __init__(self, url, code, msg, headers, args): - urllib2.HTTPError.__init__(self, url, code, msg, headers, None) - self.args = args - self.reason = args["Error"] - self.info = args.get("Info", None) - - -class AbstractRpcServer(object): - """Provides a common interface for a simple RPC server.""" - - def __init__(self, host, auth_function, host_override=None, extra_headers={}, - save_cookies=False, account_type=AUTH_ACCOUNT_TYPE): - """Creates a new HttpRpcServer. - - Args: - host: The host to send requests to. - auth_function: A function that takes no arguments and returns an - (email, password) tuple when called. Will be called if authentication - is required. - host_override: The host header to send to the server (defaults to host). - extra_headers: A dict of extra headers to append to every request. - save_cookies: If True, save the authentication cookies to local disk. - If False, use an in-memory cookiejar instead. Subclasses must - implement this functionality. Defaults to False. - account_type: Account type used for authentication. Defaults to - AUTH_ACCOUNT_TYPE. - """ - self.host = host - if (not self.host.startswith("https://") and - not self.host.startswith("https://")): - self.host = "https://" + self.host - self.host_override = host_override - self.auth_function = auth_function - self.authenticated = False - self.extra_headers = extra_headers - self.save_cookies = save_cookies - self.account_type = account_type - self.opener = self._GetOpener() - if self.host_override: - logging.info("Server: %s; Host: %s", self.host, self.host_override) - else: - logging.info("Server: %s", self.host) - - def _GetOpener(self): - """Returns an OpenerDirector for making HTTP requests. - - Returns: - A urllib2.OpenerDirector object. - """ - raise NotImplementedError() - - def _CreateRequest(self, url, data=None): - """Creates a new urllib request.""" - logging.debug("Creating request for: '%s' with payload:\n%s", url, data) - req = urllib2.Request(url, data=data, headers={"Accept": "text/plain"}) - if self.host_override: - req.add_header("Host", self.host_override) - for key, value in self.extra_headers.iteritems(): - req.add_header(key, value) - return req - - def _GetAuthToken(self, email, password): - """Uses ClientLogin to authenticate the user, returning an auth token. - - Args: - email: The user's email address - password: The user's password - - Raises: - ClientLoginError: If there was an error authenticating with ClientLogin. - HTTPError: If there was some other form of HTTP error. - - Returns: - The authentication token returned by ClientLogin. - """ - account_type = self.account_type - if self.host.endswith(".google.com"): - # Needed for use inside Google. - account_type = "HOSTED" - req = self._CreateRequest( - url="https://www.google.com/accounts/ClientLogin", - data=urllib.urlencode({ - "Email": email, - "Passwd": password, - "service": "ah", - "source": "rietveld-codereview-upload", - "accountType": account_type, - }), - ) - try: - response = self.opener.open(req) - response_body = response.read() - response_dict = dict(x.split("=") - for x in response_body.split("\n") if x) - return response_dict["Auth"] - except urllib2.HTTPError, e: - if e.code == 403: - body = e.read() - response_dict = dict(x.split("=", 1) for x in body.split("\n") if x) - raise ClientLoginError(req.get_full_url(), e.code, e.msg, - e.headers, response_dict) - else: - raise - - def _GetAuthCookie(self, auth_token): - """Fetches authentication cookies for an authentication token. - - Args: - auth_token: The authentication token returned by ClientLogin. - - Raises: - HTTPError: If there was an error fetching the authentication cookies. - """ - # This is a dummy value to allow us to identify when we're successful. - continue_location = "http://localhost/" - args = {"continue": continue_location, "auth": auth_token} - req = self._CreateRequest("%s/_ah/login?%s" % - (self.host, urllib.urlencode(args))) - try: - response = self.opener.open(req) - except urllib2.HTTPError, e: - response = e - if (response.code != 302 or - response.info()["location"] != continue_location): - raise urllib2.HTTPError(req.get_full_url(), response.code, response.msg, - response.headers, response.fp) - self.authenticated = True - - def _Authenticate(self): - """Authenticates the user. - - The authentication process works as follows: - 1) We get a username and password from the user - 2) We use ClientLogin to obtain an AUTH token for the user - (see http://code.google.com/apis/accounts/AuthForInstalledApps.html). - 3) We pass the auth token to /_ah/login on the server to obtain an - authentication cookie. If login was successful, it tries to redirect - us to the URL we provided. - - If we attempt to access the upload API without first obtaining an - authentication cookie, it returns a 401 response (or a 302) and - directs us to authenticate ourselves with ClientLogin. - """ - for i in range(3): - credentials = self.auth_function() - try: - auth_token = self._GetAuthToken(credentials[0], credentials[1]) - except ClientLoginError, e: - print >>sys.stderr, '' - if e.reason == "BadAuthentication": - if e.info == "InvalidSecondFactor": - print >>sys.stderr, ( - "Use an application-specific password instead " - "of your regular account password.\n" - "See http://www.google.com/" - "support/accounts/bin/answer.py?answer=185833") - else: - print >>sys.stderr, "Invalid username or password." - elif e.reason == "CaptchaRequired": - print >>sys.stderr, ( - "Please go to\n" - "https://www.google.com/accounts/DisplayUnlockCaptcha\n" - "and verify you are a human. Then try again.\n" - "If you are using a Google Apps account the URL is:\n" - "https://www.google.com/a/yourdomain.com/UnlockCaptcha") - elif e.reason == "NotVerified": - print >>sys.stderr, "Account not verified." - elif e.reason == "TermsNotAgreed": - print >>sys.stderr, "User has not agreed to TOS." - elif e.reason == "AccountDeleted": - print >>sys.stderr, "The user account has been deleted." - elif e.reason == "AccountDisabled": - print >>sys.stderr, "The user account has been disabled." - break - elif e.reason == "ServiceDisabled": - print >>sys.stderr, ("The user's access to the service has been " - "disabled.") - elif e.reason == "ServiceUnavailable": - print >>sys.stderr, "The service is not available; try again later." - else: - # Unknown error. - raise - print >>sys.stderr, '' - continue - self._GetAuthCookie(auth_token) - return - - def Send(self, request_path, payload=None, - content_type="application/octet-stream", - timeout=None, - extra_headers=None, - **kwargs): - """Sends an RPC and returns the response. - - Args: - request_path: The path to send the request to, eg /api/appversion/create. - payload: The body of the request, or None to send an empty request. - content_type: The Content-Type header to use. - timeout: timeout in seconds; default None i.e. no timeout. - (Note: for large requests on OS X, the timeout doesn't work right.) - extra_headers: Dict containing additional HTTP headers that should be - included in the request (string header names mapped to their values), - or None to not include any additional headers. - kwargs: Any keyword arguments are converted into query string parameters. - - Returns: - The response body, as a string. - """ - # TODO: Don't require authentication. Let the server say - # whether it is necessary. - if not self.authenticated: - self._Authenticate() - - old_timeout = socket.getdefaulttimeout() - socket.setdefaulttimeout(timeout) - try: - tries = 0 - while True: - tries += 1 - args = dict(kwargs) - url = "%s%s" % (self.host, request_path) - if args: - url += "?" + urllib.urlencode(args) - req = self._CreateRequest(url=url, data=payload) - req.add_header("Content-Type", content_type) - if extra_headers: - for header, value in extra_headers.items(): - req.add_header(header, value) - try: - f = self.opener.open(req) - response = f.read() - f.close() - return response - except urllib2.HTTPError, e: - if tries > 3: - raise - elif e.code == 401 or e.code == 302: - self._Authenticate() - elif e.code == 301: - # Handle permanent redirect manually. - url = e.info()["location"] - url_loc = urlparse.urlparse(url) - self.host = '%s://%s' % (url_loc[0], url_loc[1]) - elif e.code >= 500: - ErrorExit(e.read()) - else: - raise - finally: - socket.setdefaulttimeout(old_timeout) - - -class HttpRpcServer(AbstractRpcServer): - """Provides a simplified RPC-style interface for HTTP requests.""" - - def _Authenticate(self): - """Save the cookie jar after authentication.""" - super(HttpRpcServer, self)._Authenticate() - if self.save_cookies: - StatusUpdate("Saving authentication cookies to %s" % self.cookie_file) - self.cookie_jar.save() - - def _GetOpener(self): - """Returns an OpenerDirector that supports cookies and ignores redirects. - - Returns: - A urllib2.OpenerDirector object. - """ - opener = urllib2.OpenerDirector() - opener.add_handler(urllib2.ProxyHandler()) - opener.add_handler(urllib2.UnknownHandler()) - opener.add_handler(urllib2.HTTPHandler()) - opener.add_handler(urllib2.HTTPDefaultErrorHandler()) - opener.add_handler(urllib2.HTTPSHandler()) - opener.add_handler(urllib2.HTTPErrorProcessor()) - if self.save_cookies: - self.cookie_file = os.path.expanduser("~/.codereview_upload_cookies") - self.cookie_jar = cookielib.MozillaCookieJar(self.cookie_file) - if os.path.exists(self.cookie_file): - try: - self.cookie_jar.load() - self.authenticated = True - StatusUpdate("Loaded authentication cookies from %s" % - self.cookie_file) - except (cookielib.LoadError, IOError): - # Failed to load cookies - just ignore them. - pass - else: - # Create an empty cookie file with mode 600 - fd = os.open(self.cookie_file, os.O_CREAT, 0600) - os.close(fd) - # Always chmod the cookie file - os.chmod(self.cookie_file, 0600) - else: - # Don't save cookies across runs of update.py. - self.cookie_jar = cookielib.CookieJar() - opener.add_handler(urllib2.HTTPCookieProcessor(self.cookie_jar)) - return opener - - -class CondensedHelpFormatter(optparse.IndentedHelpFormatter): - """Frees more horizontal space by removing indentation from group - options and collapsing arguments between short and long, e.g. - '-o ARG, --opt=ARG' to -o --opt ARG""" - - def format_heading(self, heading): - return "%s:\n" % heading - - def format_option(self, option): - self.dedent() - res = optparse.HelpFormatter.format_option(self, option) - self.indent() - return res - - def format_option_strings(self, option): - self.set_long_opt_delimiter(" ") - optstr = optparse.HelpFormatter.format_option_strings(self, option) - optlist = optstr.split(", ") - if len(optlist) > 1: - if option.takes_value(): - # strip METAVAR from all but the last option - optlist = [x.split()[0] for x in optlist[:-1]] + optlist[-1:] - optstr = " ".join(optlist) - return optstr - - -parser = optparse.OptionParser( - usage="%prog [options] [-- diff_options] [path...]", - add_help_option=False, - formatter=CondensedHelpFormatter() -) -parser.add_option("-h", "--help", action="store_true", - help="Show this help message and exit.") -parser.add_option("-y", "--assume_yes", action="store_true", - dest="assume_yes", default=False, - help="Assume that the answer to yes/no questions is 'yes'.") -# Logging -group = parser.add_option_group("Logging options") -group.add_option("-q", "--quiet", action="store_const", const=0, - dest="verbose", help="Print errors only.") -group.add_option("-v", "--verbose", action="store_const", const=2, - dest="verbose", default=1, - help="Print info level logs.") -group.add_option("--noisy", action="store_const", const=3, - dest="verbose", help="Print all logs.") -group.add_option("--print_diffs", dest="print_diffs", action="store_true", - help="Print full diffs.") -# Review server -group = parser.add_option_group("Review server options") -group.add_option("-s", "--server", action="store", dest="server", - default=DEFAULT_REVIEW_SERVER, - metavar="SERVER", - help=("The server to upload to. The format is host[:port]. " - "Defaults to '%default'.")) -group.add_option("-e", "--email", action="store", dest="email", - metavar="EMAIL", default=None, - help="The username to use. Will prompt if omitted.") -group.add_option("-H", "--host", action="store", dest="host", - metavar="HOST", default=None, - help="Overrides the Host header sent with all RPCs.") -group.add_option("--no_cookies", action="store_false", - dest="save_cookies", default=True, - help="Do not save authentication cookies to local disk.") -group.add_option("--account_type", action="store", dest="account_type", - metavar="TYPE", default=AUTH_ACCOUNT_TYPE, - choices=["GOOGLE", "HOSTED"], - help=("Override the default account type " - "(defaults to '%default', " - "valid choices are 'GOOGLE' and 'HOSTED').")) -# Issue -group = parser.add_option_group("Issue options") -group.add_option("-t", "--title", action="store", dest="title", - help="New issue subject or new patch set title") -group.add_option("-m", "--message", action="store", dest="message", - default=None, - help="New issue description or new patch set message") -group.add_option("-F", "--file", action="store", dest="file", - default=None, help="Read the message above from file.") -group.add_option("-r", "--reviewers", action="store", dest="reviewers", - metavar="REVIEWERS", default=None, - help="Add reviewers (comma separated email addresses).") -group.add_option("--cc", action="store", dest="cc", - metavar="CC", default=None, - help="Add CC (comma separated email addresses).") -group.add_option("--private", action="store_true", dest="private", - default=False, - help="Make the issue restricted to reviewers and those CCed") -# Upload options -group = parser.add_option_group("Patch options") -group.add_option("-i", "--issue", type="int", action="store", - metavar="ISSUE", default=None, - help="Issue number to which to add. Defaults to new issue.") -group.add_option("--base_url", action="store", dest="base_url", default=None, - help="Base URL path for files (listed as \"Base URL\" when " - "viewing issue). If omitted, will be guessed automatically " - "for SVN repos and left blank for others.") -group.add_option("--download_base", action="store_true", - dest="download_base", default=False, - help="Base files will be downloaded by the server " - "(side-by-side diffs may not work on files with CRs).") -group.add_option("--rev", action="store", dest="revision", - metavar="REV", default=None, - help="Base revision/branch/tree to diff against. Use " - "rev1:rev2 range to review already committed changeset.") -group.add_option("--send_mail", action="store_true", - dest="send_mail", default=False, - help="Send notification email to reviewers.") -group.add_option("-p", "--send_patch", action="store_true", - dest="send_patch", default=False, - help="Same as --send_mail, but include diff as an " - "attachment, and prepend email subject with 'PATCH:'.") -group.add_option("--vcs", action="store", dest="vcs", - metavar="VCS", default=None, - help=("Version control system (optional, usually upload.py " - "already guesses the right VCS).")) -group.add_option("--emulate_svn_auto_props", action="store_true", - dest="emulate_svn_auto_props", default=False, - help=("Emulate Subversion's auto properties feature.")) -# Perforce-specific -group = parser.add_option_group("Perforce-specific options " - "(overrides P4 environment variables)") -group.add_option("--p4_port", action="store", dest="p4_port", - metavar="P4_PORT", default=None, - help=("Perforce server and port (optional)")) -group.add_option("--p4_changelist", action="store", dest="p4_changelist", - metavar="P4_CHANGELIST", default=None, - help=("Perforce changelist id")) -group.add_option("--p4_client", action="store", dest="p4_client", - metavar="P4_CLIENT", default=None, - help=("Perforce client/workspace")) -group.add_option("--p4_user", action="store", dest="p4_user", - metavar="P4_USER", default=None, - help=("Perforce user")) - -def GetRpcServer(server, email=None, host_override=None, save_cookies=True, - account_type=AUTH_ACCOUNT_TYPE): - """Returns an instance of an AbstractRpcServer. - - Args: - server: String containing the review server URL. - email: String containing user's email address. - host_override: If not None, string containing an alternate hostname to use - in the host header. - save_cookies: Whether authentication cookies should be saved to disk. - account_type: Account type for authentication, either 'GOOGLE' - or 'HOSTED'. Defaults to AUTH_ACCOUNT_TYPE. - - Returns: - A new AbstractRpcServer, on which RPC calls can be made. - """ - - rpc_server_class = HttpRpcServer - - # If this is the dev_appserver, use fake authentication. - host = (host_override or server).lower() - if re.match(r'(http://)?localhost([:/]|$)', host): - if email is None: - email = "test@example.com" - logging.info("Using debug user %s. Override with --email" % email) - server = rpc_server_class( - server, - lambda: (email, "password"), - host_override=host_override, - extra_headers={"Cookie": - 'dev_appserver_login="%s:False"' % email}, - save_cookies=save_cookies, - account_type=account_type) - # Don't try to talk to ClientLogin. - server.authenticated = True - return server - - def GetUserCredentials(): - """Prompts the user for a username and password.""" - # Create a local alias to the email variable to avoid Python's crazy - # scoping rules. - global keyring - local_email = email - if local_email is None: - local_email = GetEmail("Email (login for uploading to %s)" % server) - password = None - if keyring: - try: - password = keyring.get_password(host, local_email) - except: - # Sadly, we have to trap all errors here as - # gnomekeyring.IOError inherits from object. :/ - print "Failed to get password from keyring" - keyring = None - if password is not None: - print "Using password from system keyring." - else: - password = getpass.getpass("Password for %s: " % local_email) - if keyring: - answer = raw_input("Store password in system keyring?(y/N) ").strip() - if answer == "y": - keyring.set_password(host, local_email, password) - return (local_email, password) - - return rpc_server_class(server, - GetUserCredentials, - host_override=host_override, - save_cookies=save_cookies) - - -def EncodeMultipartFormData(fields, files): - """Encode form fields for multipart/form-data. - - Args: - fields: A sequence of (name, value) elements for regular form fields. - files: A sequence of (name, filename, value) elements for data to be - uploaded as files. - Returns: - (content_type, body) ready for httplib.HTTP instance. - - Source: - http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/146306 - """ - BOUNDARY = '-M-A-G-I-C---B-O-U-N-D-A-R-Y-' - CRLF = '\r\n' - lines = [] - for (key, value) in fields: - lines.append('--' + BOUNDARY) - lines.append('Content-Disposition: form-data; name="%s"' % key) - lines.append('') - if isinstance(value, unicode): - value = value.encode('utf-8') - lines.append(value) - for (key, filename, value) in files: - lines.append('--' + BOUNDARY) - lines.append('Content-Disposition: form-data; name="%s"; filename="%s"' % - (key, filename)) - lines.append('Content-Type: %s' % GetContentType(filename)) - lines.append('') - if isinstance(value, unicode): - value = value.encode('utf-8') - lines.append(value) - lines.append('--' + BOUNDARY + '--') - lines.append('') - body = CRLF.join(lines) - content_type = 'multipart/form-data; boundary=%s' % BOUNDARY - return content_type, body - - -def GetContentType(filename): - """Helper to guess the content-type from the filename.""" - return mimetypes.guess_type(filename)[0] or 'application/octet-stream' - - -# Use a shell for subcommands on Windows to get a PATH search. -use_shell = sys.platform.startswith("win") - -def RunShellWithReturnCodeAndStderr(command, print_output=False, - universal_newlines=True, - env=os.environ): - """Executes a command and returns the output from stdout, stderr and the return code. - - Args: - command: Command to execute. - print_output: If True, the output is printed to stdout. - If False, both stdout and stderr are ignored. - universal_newlines: Use universal_newlines flag (default: True). - - Returns: - Tuple (stdout, stderr, return code) - """ - logging.info("Running %s", command) - env = env.copy() - env['LC_MESSAGES'] = 'C' - p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, - shell=use_shell, universal_newlines=universal_newlines, - env=env) - if print_output: - output_array = [] - while True: - line = p.stdout.readline() - if not line: - break - print line.strip("\n") - output_array.append(line) - output = "".join(output_array) - else: - output = p.stdout.read() - p.wait() - errout = p.stderr.read() - if print_output and errout: - print >>sys.stderr, errout - p.stdout.close() - p.stderr.close() - return output, errout, p.returncode - -def RunShellWithReturnCode(command, print_output=False, - universal_newlines=True, - env=os.environ): - """Executes a command and returns the output from stdout and the return code.""" - out, err, retcode = RunShellWithReturnCodeAndStderr(command, print_output, - universal_newlines, env) - return out, retcode - -def RunShell(command, silent_ok=False, universal_newlines=True, - print_output=False, env=os.environ): - data, retcode = RunShellWithReturnCode(command, print_output, - universal_newlines, env) - if retcode: - ErrorExit("Got error status from %s:\n%s" % (command, data)) - if not silent_ok and not data: - ErrorExit("No output from %s" % command) - return data - - -class VersionControlSystem(object): - """Abstract base class providing an interface to the VCS.""" - - def __init__(self, options): - """Constructor. - - Args: - options: Command line options. - """ - self.options = options - - def GetGUID(self): - """Return string to distinguish the repository from others, for example to - query all opened review issues for it""" - raise NotImplementedError( - "abstract method -- subclass %s must override" % self.__class__) - - def PostProcessDiff(self, diff): - """Return the diff with any special post processing this VCS needs, e.g. - to include an svn-style "Index:".""" - return diff - - def GenerateDiff(self, args): - """Return the current diff as a string. - - Args: - args: Extra arguments to pass to the diff command. - """ - raise NotImplementedError( - "abstract method -- subclass %s must override" % self.__class__) - - def GetUnknownFiles(self): - """Return a list of files unknown to the VCS.""" - raise NotImplementedError( - "abstract method -- subclass %s must override" % self.__class__) - - def CheckForUnknownFiles(self): - """Show an "are you sure?" prompt if there are unknown files.""" - unknown_files = self.GetUnknownFiles() - if unknown_files: - print "The following files are not added to version control:" - for line in unknown_files: - print line - prompt = "Are you sure to continue?(y/N) " - answer = raw_input(prompt).strip() - if answer != "y": - ErrorExit("User aborted") - - def GetBaseFile(self, filename): - """Get the content of the upstream version of a file. - - Returns: - A tuple (base_content, new_content, is_binary, status) - base_content: The contents of the base file. - new_content: For text files, this is empty. For binary files, this is - the contents of the new file, since the diff output won't contain - information to reconstruct the current file. - is_binary: True iff the file is binary. - status: The status of the file. - """ - - raise NotImplementedError( - "abstract method -- subclass %s must override" % self.__class__) - - - def GetBaseFiles(self, diff): - """Helper that calls GetBase file for each file in the patch. - - Returns: - A dictionary that maps from filename to GetBaseFile's tuple. Filenames - are retrieved based on lines that start with "Index:" or - "Property changes on:". - """ - files = {} - for line in diff.splitlines(True): - if line.startswith('Index:') or line.startswith('Property changes on:'): - unused, filename = line.split(':', 1) - # On Windows if a file has property changes its filename uses '\' - # instead of '/'. - filename = filename.strip().replace('\\', '/') - files[filename] = self.GetBaseFile(filename) - return files - - - def UploadBaseFiles(self, issue, rpc_server, patch_list, patchset, options, - files): - """Uploads the base files (and if necessary, the current ones as well).""" - - def UploadFile(filename, file_id, content, is_binary, status, is_base): - """Uploads a file to the server.""" - file_too_large = False - if is_base: - type = "base" - else: - type = "current" - if len(content) > MAX_UPLOAD_SIZE: - print ("Not uploading the %s file for %s because it's too large." % - (type, filename)) - file_too_large = True - content = "" - checksum = md5(content).hexdigest() - if options.verbose > 0 and not file_too_large: - print "Uploading %s file for %s" % (type, filename) - url = "/%d/upload_content/%d/%d" % (int(issue), int(patchset), file_id) - form_fields = [("filename", filename), - ("status", status), - ("checksum", checksum), - ("is_binary", str(is_binary)), - ("is_current", str(not is_base)), - ] - if file_too_large: - form_fields.append(("file_too_large", "1")) - if options.email: - form_fields.append(("user", options.email)) - ctype, body = EncodeMultipartFormData(form_fields, - [("data", filename, content)]) - response_body = rpc_server.Send(url, body, - content_type=ctype) - if not response_body.startswith("OK"): - StatusUpdate(" --> %s" % response_body) - sys.exit(1) - - patches = dict() - [patches.setdefault(v, k) for k, v in patch_list] - for filename in patches.keys(): - base_content, new_content, is_binary, status = files[filename] - file_id_str = patches.get(filename) - if file_id_str.find("nobase") != -1: - base_content = None - file_id_str = file_id_str[file_id_str.rfind("_") + 1:] - file_id = int(file_id_str) - if base_content != None: - UploadFile(filename, file_id, base_content, is_binary, status, True) - if new_content != None: - UploadFile(filename, file_id, new_content, is_binary, status, False) - - def IsImage(self, filename): - """Returns true if the filename has an image extension.""" - mimetype = mimetypes.guess_type(filename)[0] - if not mimetype: - return False - return mimetype.startswith("image/") - - def IsBinaryData(self, data): - """Returns true if data contains a null byte.""" - # Derived from how Mercurial's heuristic, see - # http://selenic.com/hg/file/848a6658069e/mercurial/util.py#l229 - return bool(data and "\0" in data) - - -class SubversionVCS(VersionControlSystem): - """Implementation of the VersionControlSystem interface for Subversion.""" - - def __init__(self, options): - super(SubversionVCS, self).__init__(options) - if self.options.revision: - match = re.match(r"(\d+)(:(\d+))?", self.options.revision) - if not match: - ErrorExit("Invalid Subversion revision %s." % self.options.revision) - self.rev_start = match.group(1) - self.rev_end = match.group(3) - else: - self.rev_start = self.rev_end = None - # Cache output from "svn list -r REVNO dirname". - # Keys: dirname, Values: 2-tuple (ouput for start rev and end rev). - self.svnls_cache = {} - # Base URL is required to fetch files deleted in an older revision. - # Result is cached to not guess it over and over again in GetBaseFile(). - required = self.options.download_base or self.options.revision is not None - self.svn_base = self._GuessBase(required) - - def GetGUID(self): - return self._GetInfo("Repository UUID") - - def GuessBase(self, required): - """Wrapper for _GuessBase.""" - return self.svn_base - - def _GuessBase(self, required): - """Returns base URL for current diff. - - Args: - required: If true, exits if the url can't be guessed, otherwise None is - returned. - """ - url = self._GetInfo("URL") - if url: - scheme, netloc, path, params, query, fragment = urlparse.urlparse(url) - guess = "" - # TODO(anatoli) - repository specific hacks should be handled by server - if netloc == "svn.python.org" and scheme == "svn+ssh": - path = "projects" + path - scheme = "http" - guess = "Python " - elif netloc.endswith(".googlecode.com"): - scheme = "http" - guess = "Google Code " - path = path + "/" - base = urlparse.urlunparse((scheme, netloc, path, params, - query, fragment)) - logging.info("Guessed %sbase = %s", guess, base) - return base - if required: - ErrorExit("Can't find URL in output from svn info") - return None - - def _GetInfo(self, key): - """Parses 'svn info' for current dir. Returns value for key or None""" - for line in RunShell(["svn", "info"]).splitlines(): - if line.startswith(key + ": "): - return line.split(":", 1)[1].strip() - - def _EscapeFilename(self, filename): - """Escapes filename for SVN commands.""" - if "@" in filename and not filename.endswith("@"): - filename = "%s@" % filename - return filename - - def GenerateDiff(self, args): - cmd = ["svn", "diff"] - if self.options.revision: - cmd += ["-r", self.options.revision] - cmd.extend(args) - data = RunShell(cmd) - count = 0 - for line in data.splitlines(): - if line.startswith("Index:") or line.startswith("Property changes on:"): - count += 1 - logging.info(line) - if not count: - ErrorExit("No valid patches found in output from svn diff") - return data - - def _CollapseKeywords(self, content, keyword_str): - """Collapses SVN keywords.""" - # svn cat translates keywords but svn diff doesn't. As a result of this - # behavior patching.PatchChunks() fails with a chunk mismatch error. - # This part was originally written by the Review Board development team - # who had the same problem (http://reviews.review-board.org/r/276/). - # Mapping of keywords to known aliases - svn_keywords = { - # Standard keywords - 'Date': ['Date', 'LastChangedDate'], - 'Revision': ['Revision', 'LastChangedRevision', 'Rev'], - 'Author': ['Author', 'LastChangedBy'], - 'HeadURL': ['HeadURL', 'URL'], - 'Id': ['Id'], - - # Aliases - 'LastChangedDate': ['LastChangedDate', 'Date'], - 'LastChangedRevision': ['LastChangedRevision', 'Rev', 'Revision'], - 'LastChangedBy': ['LastChangedBy', 'Author'], - 'URL': ['URL', 'HeadURL'], - } - - def repl(m): - if m.group(2): - return "$%s::%s$" % (m.group(1), " " * len(m.group(3))) - return "$%s$" % m.group(1) - keywords = [keyword - for name in keyword_str.split(" ") - for keyword in svn_keywords.get(name, [])] - return re.sub(r"\$(%s):(:?)([^\$]+)\$" % '|'.join(keywords), repl, content) - - def GetUnknownFiles(self): - status = RunShell(["svn", "status", "--ignore-externals"], silent_ok=True) - unknown_files = [] - for line in status.split("\n"): - if line and line[0] == "?": - unknown_files.append(line) - return unknown_files - - def ReadFile(self, filename): - """Returns the contents of a file.""" - file = open(filename, 'rb') - result = "" - try: - result = file.read() - finally: - file.close() - return result - - def GetStatus(self, filename): - """Returns the status of a file.""" - if not self.options.revision: - status = RunShell(["svn", "status", "--ignore-externals", - self._EscapeFilename(filename)]) - if not status: - ErrorExit("svn status returned no output for %s" % filename) - status_lines = status.splitlines() - # If file is in a cl, the output will begin with - # "\n--- Changelist 'cl_name':\n". See - # http://svn.collab.net/repos/svn/trunk/notes/changelist-design.txt - if (len(status_lines) == 3 and - not status_lines[0] and - status_lines[1].startswith("--- Changelist")): - status = status_lines[2] - else: - status = status_lines[0] - # If we have a revision to diff against we need to run "svn list" - # for the old and the new revision and compare the results to get - # the correct status for a file. - else: - dirname, relfilename = os.path.split(filename) - if dirname not in self.svnls_cache: - cmd = ["svn", "list", "-r", self.rev_start, - self._EscapeFilename(dirname) or "."] - out, err, returncode = RunShellWithReturnCodeAndStderr(cmd) - if returncode: - # Directory might not yet exist at start revison - # svn: Unable to find repository location for 'abc' in revision nnn - if re.match('^svn: Unable to find repository location for .+ in revision \d+', err): - old_files = () - else: - ErrorExit("Failed to get status for %s:\n%s" % (filename, err)) - else: - old_files = out.splitlines() - args = ["svn", "list"] - if self.rev_end: - args += ["-r", self.rev_end] - cmd = args + [self._EscapeFilename(dirname) or "."] - out, returncode = RunShellWithReturnCode(cmd) - if returncode: - ErrorExit("Failed to run command %s" % cmd) - self.svnls_cache[dirname] = (old_files, out.splitlines()) - old_files, new_files = self.svnls_cache[dirname] - if relfilename in old_files and relfilename not in new_files: - status = "D " - elif relfilename in old_files and relfilename in new_files: - status = "M " - else: - status = "A " - return status - - def GetBaseFile(self, filename): - status = self.GetStatus(filename) - base_content = None - new_content = None - - # If a file is copied its status will be "A +", which signifies - # "addition-with-history". See "svn st" for more information. We need to - # upload the original file or else diff parsing will fail if the file was - # edited. - if status[0] == "A" and status[3] != "+": - # We'll need to upload the new content if we're adding a binary file - # since diff's output won't contain it. - mimetype = RunShell(["svn", "propget", "svn:mime-type", - self._EscapeFilename(filename)], silent_ok=True) - base_content = "" - is_binary = bool(mimetype) and not mimetype.startswith("text/") - if is_binary and self.IsImage(filename): - new_content = self.ReadFile(filename) - elif (status[0] in ("M", "D", "R") or - (status[0] == "A" and status[3] == "+") or # Copied file. - (status[0] == " " and status[1] == "M")): # Property change. - args = [] - if self.options.revision: - # filename must not be escaped. We already add an ampersand here. - url = "%s/%s@%s" % (self.svn_base, filename, self.rev_start) - else: - # Don't change filename, it's needed later. - url = filename - args += ["-r", "BASE"] - cmd = ["svn"] + args + ["propget", "svn:mime-type", url] - mimetype, returncode = RunShellWithReturnCode(cmd) - if returncode: - # File does not exist in the requested revision. - # Reset mimetype, it contains an error message. - mimetype = "" - else: - mimetype = mimetype.strip() - get_base = False - # this test for binary is exactly the test prescribed by the - # official SVN docs at - # http://subversion.apache.org/faq.html#binary-files - is_binary = (bool(mimetype) and - not mimetype.startswith("text/") and - mimetype not in ("image/x-xbitmap", "image/x-xpixmap")) - if status[0] == " ": - # Empty base content just to force an upload. - base_content = "" - elif is_binary: - if self.IsImage(filename): - get_base = True - if status[0] == "M": - if not self.rev_end: - new_content = self.ReadFile(filename) - else: - url = "%s/%s@%s" % (self.svn_base, filename, self.rev_end) - new_content = RunShell(["svn", "cat", url], - universal_newlines=True, silent_ok=True) - else: - base_content = "" - else: - get_base = True - - if get_base: - if is_binary: - universal_newlines = False - else: - universal_newlines = True - if self.rev_start: - # "svn cat -r REV delete_file.txt" doesn't work. cat requires - # the full URL with "@REV" appended instead of using "-r" option. - url = "%s/%s@%s" % (self.svn_base, filename, self.rev_start) - base_content = RunShell(["svn", "cat", url], - universal_newlines=universal_newlines, - silent_ok=True) - else: - base_content, ret_code = RunShellWithReturnCode( - ["svn", "cat", self._EscapeFilename(filename)], - universal_newlines=universal_newlines) - if ret_code and status[0] == "R": - # It's a replaced file without local history (see issue208). - # The base file needs to be fetched from the server. - url = "%s/%s" % (self.svn_base, filename) - base_content = RunShell(["svn", "cat", url], - universal_newlines=universal_newlines, - silent_ok=True) - elif ret_code: - ErrorExit("Got error status from 'svn cat %s'" % filename) - if not is_binary: - args = [] - if self.rev_start: - url = "%s/%s@%s" % (self.svn_base, filename, self.rev_start) - else: - url = filename - args += ["-r", "BASE"] - cmd = ["svn"] + args + ["propget", "svn:keywords", url] - keywords, returncode = RunShellWithReturnCode(cmd) - if keywords and not returncode: - base_content = self._CollapseKeywords(base_content, keywords) - else: - StatusUpdate("svn status returned unexpected output: %s" % status) - sys.exit(1) - return base_content, new_content, is_binary, status[0:5] - - -class GitVCS(VersionControlSystem): - """Implementation of the VersionControlSystem interface for Git.""" - - def __init__(self, options): - super(GitVCS, self).__init__(options) - # Map of filename -> (hash before, hash after) of base file. - # Hashes for "no such file" are represented as None. - self.hashes = {} - # Map of new filename -> old filename for renames. - self.renames = {} - - def GetGUID(self): - revlist = RunShell("git rev-list --parents HEAD".split()).splitlines() - # M-A: Return the 1st root hash, there could be multiple when a - # subtree is merged. In that case, more analysis would need to - # be done to figure out which HEAD is the 'most representative'. - for r in revlist: - if ' ' not in r: - return r - - def PostProcessDiff(self, gitdiff): - """Converts the diff output to include an svn-style "Index:" line as well - as record the hashes of the files, so we can upload them along with our - diff.""" - # Special used by git to indicate "no such content". - NULL_HASH = "0"*40 - - def IsFileNew(filename): - return filename in self.hashes and self.hashes[filename][0] is None - - def AddSubversionPropertyChange(filename): - """Add svn's property change information into the patch if given file is - new file. - - We use Subversion's auto-props setting to retrieve its property. - See http://svnbook.red-bean.com/en/1.1/ch07.html#svn-ch-7-sect-1.3.2 for - Subversion's [auto-props] setting. - """ - if self.options.emulate_svn_auto_props and IsFileNew(filename): - svnprops = GetSubversionPropertyChanges(filename) - if svnprops: - svndiff.append("\n" + svnprops + "\n") - - svndiff = [] - filecount = 0 - filename = None - for line in gitdiff.splitlines(): - match = re.match(r"diff --git a/(.*) b/(.*)$", line) - if match: - # Add auto property here for previously seen file. - if filename is not None: - AddSubversionPropertyChange(filename) - filecount += 1 - # Intentionally use the "after" filename so we can show renames. - filename = match.group(2) - svndiff.append("Index: %s\n" % filename) - if match.group(1) != match.group(2): - self.renames[match.group(2)] = match.group(1) - else: - # The "index" line in a git diff looks like this (long hashes elided): - # index 82c0d44..b2cee3f 100755 - # We want to save the left hash, as that identifies the base file. - match = re.match(r"index (\w+)\.\.(\w+)", line) - if match: - before, after = (match.group(1), match.group(2)) - if before == NULL_HASH: - before = None - if after == NULL_HASH: - after = None - self.hashes[filename] = (before, after) - svndiff.append(line + "\n") - if not filecount: - ErrorExit("No valid patches found in output from git diff") - # Add auto property for the last seen file. - assert filename is not None - AddSubversionPropertyChange(filename) - return "".join(svndiff) - - def GenerateDiff(self, extra_args): - extra_args = extra_args[:] - if self.options.revision: - if ":" in self.options.revision: - extra_args = self.options.revision.split(":", 1) + extra_args - else: - extra_args = [self.options.revision] + extra_args - - # --no-ext-diff is broken in some versions of Git, so try to work around - # this by overriding the environment (but there is still a problem if the - # git config key "diff.external" is used). - env = os.environ.copy() - if 'GIT_EXTERNAL_DIFF' in env: del env['GIT_EXTERNAL_DIFF'] - return RunShell( - [ "git", "diff", "--no-color", "--no-ext-diff", "--full-index", - "--ignore-submodules", "-M"] + extra_args, - env=env) - - def GetUnknownFiles(self): - status = RunShell(["git", "ls-files", "--exclude-standard", "--others"], - silent_ok=True) - return status.splitlines() - - def GetFileContent(self, file_hash, is_binary): - """Returns the content of a file identified by its git hash.""" - data, retcode = RunShellWithReturnCode(["git", "show", file_hash], - universal_newlines=not is_binary) - if retcode: - ErrorExit("Got error status from 'git show %s'" % file_hash) - return data - - def GetBaseFile(self, filename): - hash_before, hash_after = self.hashes.get(filename, (None,None)) - base_content = None - new_content = None - status = None - - if filename in self.renames: - status = "A +" # Match svn attribute name for renames. - if filename not in self.hashes: - # If a rename doesn't change the content, we never get a hash. - base_content = RunShell( - ["git", "show", "HEAD:" + filename], silent_ok=True) - elif not hash_before: - status = "A" - base_content = "" - elif not hash_after: - status = "D" - else: - status = "M" - - is_binary = self.IsBinaryData(base_content) - is_image = self.IsImage(filename) - - # Grab the before/after content if we need it. - # We should include file contents if it's text or it's an image. - if not is_binary or is_image: - # Grab the base content if we don't have it already. - if base_content is None and hash_before: - base_content = self.GetFileContent(hash_before, is_binary) - # Only include the "after" file if it's an image; otherwise it - # it is reconstructed from the diff. - if is_image and hash_after: - new_content = self.GetFileContent(hash_after, is_binary) - - return (base_content, new_content, is_binary, status) - - -class CVSVCS(VersionControlSystem): - """Implementation of the VersionControlSystem interface for CVS.""" - - def __init__(self, options): - super(CVSVCS, self).__init__(options) - - def GetGUID(self): - """For now we don't know how to get repository ID for CVS""" - return - - def GetOriginalContent_(self, filename): - RunShell(["cvs", "up", filename], silent_ok=True) - # TODO need detect file content encoding - content = open(filename).read() - return content.replace("\r\n", "\n") - - def GetBaseFile(self, filename): - base_content = None - new_content = None - status = "A" - - output, retcode = RunShellWithReturnCode(["cvs", "status", filename]) - if retcode: - ErrorExit("Got error status from 'cvs status %s'" % filename) - - if output.find("Status: Locally Modified") != -1: - status = "M" - temp_filename = "%s.tmp123" % filename - os.rename(filename, temp_filename) - base_content = self.GetOriginalContent_(filename) - os.rename(temp_filename, filename) - elif output.find("Status: Locally Added"): - status = "A" - base_content = "" - elif output.find("Status: Needs Checkout"): - status = "D" - base_content = self.GetOriginalContent_(filename) - - return (base_content, new_content, self.IsBinaryData(base_content), status) - - def GenerateDiff(self, extra_args): - cmd = ["cvs", "diff", "-u", "-N"] - if self.options.revision: - cmd += ["-r", self.options.revision] - - cmd.extend(extra_args) - data, retcode = RunShellWithReturnCode(cmd) - count = 0 - if retcode in [0, 1]: - for line in data.splitlines(): - if line.startswith("Index:"): - count += 1 - logging.info(line) - - if not count: - ErrorExit("No valid patches found in output from cvs diff") - - return data - - def GetUnknownFiles(self): - data, retcode = RunShellWithReturnCode(["cvs", "diff"]) - if retcode not in [0, 1]: - ErrorExit("Got error status from 'cvs diff':\n%s" % (data,)) - unknown_files = [] - for line in data.split("\n"): - if line and line[0] == "?": - unknown_files.append(line) - return unknown_files - -class MercurialVCS(VersionControlSystem): - """Implementation of the VersionControlSystem interface for Mercurial.""" - - def __init__(self, options, repo_dir): - super(MercurialVCS, self).__init__(options) - # Absolute path to repository (we can be in a subdir) - self.repo_dir = os.path.normpath(repo_dir) - # Compute the subdir - cwd = os.path.normpath(os.getcwd()) - assert cwd.startswith(self.repo_dir) - self.subdir = cwd[len(self.repo_dir):].lstrip(r"\/") - if self.options.revision: - self.base_rev = self.options.revision - else: - self.base_rev = RunShell(["hg", "parent", "-q"]).split(':')[1].strip() - - def GetGUID(self): - # See chapter "Uniquely identifying a repository" - # http://hgbook.red-bean.com/read/customizing-the-output-of-mercurial.html - info = RunShell("hg log -r0 --template {node}".split()) - return info.strip() - - def _GetRelPath(self, filename): - """Get relative path of a file according to the current directory, - given its logical path in the repo.""" - absname = os.path.join(self.repo_dir, filename) - return os.path.relpath(absname) - - def GenerateDiff(self, extra_args): - cmd = ["hg", "diff", "--git", "-r", self.base_rev] + extra_args - data = RunShell(cmd, silent_ok=True) - svndiff = [] - filecount = 0 - for line in data.splitlines(): - m = re.match("diff --git a/(\S+) b/(\S+)", line) - if m: - # Modify line to make it look like as it comes from svn diff. - # With this modification no changes on the server side are required - # to make upload.py work with Mercurial repos. - # NOTE: for proper handling of moved/copied files, we have to use - # the second filename. - filename = m.group(2) - svndiff.append("Index: %s" % filename) - svndiff.append("=" * 67) - filecount += 1 - logging.info(line) - else: - svndiff.append(line) - if not filecount: - ErrorExit("No valid patches found in output from hg diff") - return "\n".join(svndiff) + "\n" - - def GetUnknownFiles(self): - """Return a list of files unknown to the VCS.""" - args = [] - status = RunShell(["hg", "status", "--rev", self.base_rev, "-u", "."], - silent_ok=True) - unknown_files = [] - for line in status.splitlines(): - st, fn = line.split(" ", 1) - if st == "?": - unknown_files.append(fn) - return unknown_files - - def GetBaseFile(self, filename): - # "hg status" and "hg cat" both take a path relative to the current subdir, - # but "hg diff" has given us the path relative to the repo root. - base_content = "" - new_content = None - is_binary = False - oldrelpath = relpath = self._GetRelPath(filename) - # "hg status -C" returns two lines for moved/copied files, one otherwise - out = RunShell(["hg", "status", "-C", "--rev", self.base_rev, relpath]) - out = out.splitlines() - # HACK: strip error message about missing file/directory if it isn't in - # the working copy - if out[0].startswith('%s: ' % relpath): - out = out[1:] - status, _ = out[0].split(' ', 1) - if len(out) > 1 and status == "A": - # Moved/copied => considered as modified, use old filename to - # retrieve base contents - oldrelpath = out[1].strip() - status = "M" - if ":" in self.base_rev: - base_rev = self.base_rev.split(":", 1)[0] - else: - base_rev = self.base_rev - if status != "A": - base_content = RunShell(["hg", "cat", "-r", base_rev, oldrelpath], - silent_ok=True) - is_binary = self.IsBinaryData(base_content) - if status != "R": - new_content = open(relpath, "rb").read() - is_binary = is_binary or self.IsBinaryData(new_content) - if is_binary and base_content: - # Fetch again without converting newlines - base_content = RunShell(["hg", "cat", "-r", base_rev, oldrelpath], - silent_ok=True, universal_newlines=False) - if not is_binary or not self.IsImage(relpath): - new_content = None - return base_content, new_content, is_binary, status - - -class PerforceVCS(VersionControlSystem): - """Implementation of the VersionControlSystem interface for Perforce.""" - - def __init__(self, options): - - def ConfirmLogin(): - # Make sure we have a valid perforce session - while True: - data, retcode = self.RunPerforceCommandWithReturnCode( - ["login", "-s"], marshal_output=True) - if not data: - ErrorExit("Error checking perforce login") - if not retcode and (not "code" in data or data["code"] != "error"): - break - print "Enter perforce password: " - self.RunPerforceCommandWithReturnCode(["login"]) - - super(PerforceVCS, self).__init__(options) - - self.p4_changelist = options.p4_changelist - if not self.p4_changelist: - ErrorExit("A changelist id is required") - if (options.revision): - ErrorExit("--rev is not supported for perforce") - - self.p4_port = options.p4_port - self.p4_client = options.p4_client - self.p4_user = options.p4_user - - ConfirmLogin() - - if not options.title: - description = self.RunPerforceCommand(["describe", self.p4_changelist], - marshal_output=True) - if description and "desc" in description: - # Rietveld doesn't support multi-line descriptions - raw_title = description["desc"].strip() - lines = raw_title.splitlines() - if len(lines): - options.title = lines[0] - - def GetGUID(self): - """For now we don't know how to get repository ID for Perforce""" - return - - def RunPerforceCommandWithReturnCode(self, extra_args, marshal_output=False, - universal_newlines=True): - args = ["p4"] - if marshal_output: - # -G makes perforce format its output as marshalled python objects - args.extend(["-G"]) - if self.p4_port: - args.extend(["-p", self.p4_port]) - if self.p4_client: - args.extend(["-c", self.p4_client]) - if self.p4_user: - args.extend(["-u", self.p4_user]) - args.extend(extra_args) - - data, retcode = RunShellWithReturnCode( - args, print_output=False, universal_newlines=universal_newlines) - if marshal_output and data: - data = marshal.loads(data) - return data, retcode - - def RunPerforceCommand(self, extra_args, marshal_output=False, - universal_newlines=True): - # This might be a good place to cache call results, since things like - # describe or fstat might get called repeatedly. - data, retcode = self.RunPerforceCommandWithReturnCode( - extra_args, marshal_output, universal_newlines) - if retcode: - ErrorExit("Got error status from %s:\n%s" % (extra_args, data)) - return data - - def GetFileProperties(self, property_key_prefix = "", command = "describe"): - description = self.RunPerforceCommand(["describe", self.p4_changelist], - marshal_output=True) - - changed_files = {} - file_index = 0 - # Try depotFile0, depotFile1, ... until we don't find a match - while True: - file_key = "depotFile%d" % file_index - if file_key in description: - filename = description[file_key] - change_type = description[property_key_prefix + str(file_index)] - changed_files[filename] = change_type - file_index += 1 - else: - break - return changed_files - - def GetChangedFiles(self): - return self.GetFileProperties("action") - - def GetUnknownFiles(self): - # Perforce doesn't detect new files, they have to be explicitly added - return [] - - def IsBaseBinary(self, filename): - base_filename = self.GetBaseFilename(filename) - return self.IsBinaryHelper(base_filename, "files") - - def IsPendingBinary(self, filename): - return self.IsBinaryHelper(filename, "describe") - - def IsBinaryHelper(self, filename, command): - file_types = self.GetFileProperties("type", command) - if not filename in file_types: - ErrorExit("Trying to check binary status of unknown file %s." % filename) - # This treats symlinks, macintosh resource files, temporary objects, and - # unicode as binary. See the Perforce docs for more details: - # http://www.perforce.com/perforce/doc.current/manuals/cmdref/o.ftypes.html - return not file_types[filename].endswith("text") - - def GetFileContent(self, filename, revision, is_binary): - file_arg = filename - if revision: - file_arg += "#" + revision - # -q suppresses the initial line that displays the filename and revision - return self.RunPerforceCommand(["print", "-q", file_arg], - universal_newlines=not is_binary) - - def GetBaseFilename(self, filename): - actionsWithDifferentBases = [ - "move/add", # p4 move - "branch", # p4 integrate (to a new file), similar to hg "add" - "add", # p4 integrate (to a new file), after modifying the new file - ] - - # We only see a different base for "add" if this is a downgraded branch - # after a file was branched (integrated), then edited. - if self.GetAction(filename) in actionsWithDifferentBases: - # -Or shows information about pending integrations/moves - fstat_result = self.RunPerforceCommand(["fstat", "-Or", filename], - marshal_output=True) - - baseFileKey = "resolveFromFile0" # I think it's safe to use only file0 - if baseFileKey in fstat_result: - return fstat_result[baseFileKey] - - return filename - - def GetBaseRevision(self, filename): - base_filename = self.GetBaseFilename(filename) - - have_result = self.RunPerforceCommand(["have", base_filename], - marshal_output=True) - if "haveRev" in have_result: - return have_result["haveRev"] - - def GetLocalFilename(self, filename): - where = self.RunPerforceCommand(["where", filename], marshal_output=True) - if "path" in where: - return where["path"] - - def GenerateDiff(self, args): - class DiffData: - def __init__(self, perforceVCS, filename, action): - self.perforceVCS = perforceVCS - self.filename = filename - self.action = action - self.base_filename = perforceVCS.GetBaseFilename(filename) - - self.file_body = None - self.base_rev = None - self.prefix = None - self.working_copy = True - self.change_summary = None - - def GenerateDiffHeader(diffData): - header = [] - header.append("Index: %s" % diffData.filename) - header.append("=" * 67) - - if diffData.base_filename != diffData.filename: - if diffData.action.startswith("move"): - verb = "rename" - else: - verb = "copy" - header.append("%s from %s" % (verb, diffData.base_filename)) - header.append("%s to %s" % (verb, diffData.filename)) - - suffix = "\t(revision %s)" % diffData.base_rev - header.append("--- " + diffData.base_filename + suffix) - if diffData.working_copy: - suffix = "\t(working copy)" - header.append("+++ " + diffData.filename + suffix) - if diffData.change_summary: - header.append(diffData.change_summary) - return header - - def GenerateMergeDiff(diffData, args): - # -du generates a unified diff, which is nearly svn format - diffData.file_body = self.RunPerforceCommand( - ["diff", "-du", diffData.filename] + args) - diffData.base_rev = self.GetBaseRevision(diffData.filename) - diffData.prefix = "" - - # We have to replace p4's file status output (the lines starting - # with +++ or ---) to match svn's diff format - lines = diffData.file_body.splitlines() - first_good_line = 0 - while (first_good_line < len(lines) and - not lines[first_good_line].startswith("@@")): - first_good_line += 1 - diffData.file_body = "\n".join(lines[first_good_line:]) - return diffData - - def GenerateAddDiff(diffData): - fstat = self.RunPerforceCommand(["fstat", diffData.filename], - marshal_output=True) - if "headRev" in fstat: - diffData.base_rev = fstat["headRev"] # Re-adding a deleted file - else: - diffData.base_rev = "0" # Brand new file - diffData.working_copy = False - rel_path = self.GetLocalFilename(diffData.filename) - diffData.file_body = open(rel_path, 'r').read() - # Replicate svn's list of changed lines - line_count = len(diffData.file_body.splitlines()) - diffData.change_summary = "@@ -0,0 +1" - if line_count > 1: - diffData.change_summary += ",%d" % line_count - diffData.change_summary += " @@" - diffData.prefix = "+" - return diffData - - def GenerateDeleteDiff(diffData): - diffData.base_rev = self.GetBaseRevision(diffData.filename) - is_base_binary = self.IsBaseBinary(diffData.filename) - # For deletes, base_filename == filename - diffData.file_body = self.GetFileContent(diffData.base_filename, - None, - is_base_binary) - # Replicate svn's list of changed lines - line_count = len(diffData.file_body.splitlines()) - diffData.change_summary = "@@ -1" - if line_count > 1: - diffData.change_summary += ",%d" % line_count - diffData.change_summary += " +0,0 @@" - diffData.prefix = "-" - return diffData - - changed_files = self.GetChangedFiles() - - svndiff = [] - filecount = 0 - for (filename, action) in changed_files.items(): - svn_status = self.PerforceActionToSvnStatus(action) - if svn_status == "SKIP": - continue - - diffData = DiffData(self, filename, action) - # Is it possible to diff a branched file? Stackoverflow says no: - # http://stackoverflow.com/questions/1771314/in-perforce-command-line-how-to-diff-a-file-reopened-for-add - if svn_status == "M": - diffData = GenerateMergeDiff(diffData, args) - elif svn_status == "A": - diffData = GenerateAddDiff(diffData) - elif svn_status == "D": - diffData = GenerateDeleteDiff(diffData) - else: - ErrorExit("Unknown file action %s (svn action %s)." % \ - (action, svn_status)) - - svndiff += GenerateDiffHeader(diffData) - - for line in diffData.file_body.splitlines(): - svndiff.append(diffData.prefix + line) - filecount += 1 - if not filecount: - ErrorExit("No valid patches found in output from p4 diff") - return "\n".join(svndiff) + "\n" - - def PerforceActionToSvnStatus(self, status): - # Mirroring the list at http://permalink.gmane.org/gmane.comp.version-control.mercurial.devel/28717 - # Is there something more official? - return { - "add" : "A", - "branch" : "A", - "delete" : "D", - "edit" : "M", # Also includes changing file types. - "integrate" : "M", - "move/add" : "M", - "move/delete": "SKIP", - "purge" : "D", # How does a file's status become "purge"? - }[status] - - def GetAction(self, filename): - changed_files = self.GetChangedFiles() - if not filename in changed_files: - ErrorExit("Trying to get base version of unknown file %s." % filename) - - return changed_files[filename] - - def GetBaseFile(self, filename): - base_filename = self.GetBaseFilename(filename) - base_content = "" - new_content = None - - status = self.PerforceActionToSvnStatus(self.GetAction(filename)) - - if status != "A": - revision = self.GetBaseRevision(base_filename) - if not revision: - ErrorExit("Couldn't find base revision for file %s" % filename) - is_base_binary = self.IsBaseBinary(base_filename) - base_content = self.GetFileContent(base_filename, - revision, - is_base_binary) - - is_binary = self.IsPendingBinary(filename) - if status != "D" and status != "SKIP": - relpath = self.GetLocalFilename(filename) - if is_binary and self.IsImage(relpath): - new_content = open(relpath, "rb").read() - - return base_content, new_content, is_binary, status - -# NOTE: The SplitPatch function is duplicated in engine.py, keep them in sync. -def SplitPatch(data): - """Splits a patch into separate pieces for each file. - - Args: - data: A string containing the output of svn diff. - - Returns: - A list of 2-tuple (filename, text) where text is the svn diff output - pertaining to filename. - """ - patches = [] - filename = None - diff = [] - for line in data.splitlines(True): - new_filename = None - if line.startswith('Index:'): - unused, new_filename = line.split(':', 1) - new_filename = new_filename.strip() - elif line.startswith('Property changes on:'): - unused, temp_filename = line.split(':', 1) - # When a file is modified, paths use '/' between directories, however - # when a property is modified '\' is used on Windows. Make them the same - # otherwise the file shows up twice. - temp_filename = temp_filename.strip().replace('\\', '/') - if temp_filename != filename: - # File has property changes but no modifications, create a new diff. - new_filename = temp_filename - if new_filename: - if filename and diff: - patches.append((filename, ''.join(diff))) - filename = new_filename - diff = [line] - continue - if diff is not None: - diff.append(line) - if filename and diff: - patches.append((filename, ''.join(diff))) - return patches - - -def UploadSeparatePatches(issue, rpc_server, patchset, data, options): - """Uploads a separate patch for each file in the diff output. - - Returns a list of [patch_key, filename] for each file. - """ - patches = SplitPatch(data) - rv = [] - for patch in patches: - if len(patch[1]) > MAX_UPLOAD_SIZE: - print ("Not uploading the patch for " + patch[0] + - " because the file is too large.") - continue - form_fields = [("filename", patch[0])] - if not options.download_base: - form_fields.append(("content_upload", "1")) - files = [("data", "data.diff", patch[1])] - ctype, body = EncodeMultipartFormData(form_fields, files) - url = "/%d/upload_patch/%d" % (int(issue), int(patchset)) - print "Uploading patch for " + patch[0] - response_body = rpc_server.Send(url, body, content_type=ctype) - lines = response_body.splitlines() - if not lines or lines[0] != "OK": - StatusUpdate(" --> %s" % response_body) - sys.exit(1) - rv.append([lines[1], patch[0]]) - return rv - - -def GuessVCSName(options): - """Helper to guess the version control system. - - This examines the current directory, guesses which VersionControlSystem - we're using, and returns an string indicating which VCS is detected. - - Returns: - A pair (vcs, output). vcs is a string indicating which VCS was detected - and is one of VCS_GIT, VCS_MERCURIAL, VCS_SUBVERSION, VCS_PERFORCE, - VCS_CVS, or VCS_UNKNOWN. - Since local perforce repositories can't be easily detected, this method - will only guess VCS_PERFORCE if any perforce options have been specified. - output is a string containing any interesting output from the vcs - detection routine, or None if there is nothing interesting. - """ - for attribute, value in options.__dict__.iteritems(): - if attribute.startswith("p4") and value != None: - return (VCS_PERFORCE, None) - - def RunDetectCommand(vcs_type, command): - """Helper to detect VCS by executing command. - - Returns: - A pair (vcs, output) or None. Throws exception on error. - """ - try: - out, returncode = RunShellWithReturnCode(command) - if returncode == 0: - return (vcs_type, out.strip()) - except OSError, (errcode, message): - if errcode != errno.ENOENT: # command not found code - raise - - # Mercurial has a command to get the base directory of a repository - # Try running it, but don't die if we don't have hg installed. - # NOTE: we try Mercurial first as it can sit on top of an SVN working copy. - res = RunDetectCommand(VCS_MERCURIAL, ["hg", "root"]) - if res != None: - return res - - # Subversion from 1.7 has a single centralized .svn folder - # ( see http://subversion.apache.org/docs/release-notes/1.7.html#wc-ng ) - # That's why we use 'svn info' instead of checking for .svn dir - res = RunDetectCommand(VCS_SUBVERSION, ["svn", "info"]) - if res != None: - return res - - # Git has a command to test if you're in a git tree. - # Try running it, but don't die if we don't have git installed. - res = RunDetectCommand(VCS_GIT, ["git", "rev-parse", - "--is-inside-work-tree"]) - if res != None: - return res - - # detect CVS repos use `cvs status && $? == 0` rules - res = RunDetectCommand(VCS_CVS, ["cvs", "status"]) - if res != None: - return res - - return (VCS_UNKNOWN, None) - - -def GuessVCS(options): - """Helper to guess the version control system. - - This verifies any user-specified VersionControlSystem (by command line - or environment variable). If the user didn't specify one, this examines - the current directory, guesses which VersionControlSystem we're using, - and returns an instance of the appropriate class. Exit with an error - if we can't figure it out. - - Returns: - A VersionControlSystem instance. Exits if the VCS can't be guessed. - """ - vcs = options.vcs - if not vcs: - vcs = os.environ.get("CODEREVIEW_VCS") - if vcs: - v = VCS_ABBREVIATIONS.get(vcs.lower()) - if v is None: - ErrorExit("Unknown version control system %r specified." % vcs) - (vcs, extra_output) = (v, None) - else: - (vcs, extra_output) = GuessVCSName(options) - - if vcs == VCS_MERCURIAL: - if extra_output is None: - extra_output = RunShell(["hg", "root"]).strip() - return MercurialVCS(options, extra_output) - elif vcs == VCS_SUBVERSION: - return SubversionVCS(options) - elif vcs == VCS_PERFORCE: - return PerforceVCS(options) - elif vcs == VCS_GIT: - return GitVCS(options) - elif vcs == VCS_CVS: - return CVSVCS(options) - - ErrorExit(("Could not guess version control system. " - "Are you in a working copy directory?")) - - -def CheckReviewer(reviewer): - """Validate a reviewer -- either a nickname or an email addres. - - Args: - reviewer: A nickname or an email address. - - Calls ErrorExit() if it is an invalid email address. - """ - if "@" not in reviewer: - return # Assume nickname - parts = reviewer.split("@") - if len(parts) > 2: - ErrorExit("Invalid email address: %r" % reviewer) - assert len(parts) == 2 - if "." not in parts[1]: - ErrorExit("Invalid email address: %r" % reviewer) - - -def LoadSubversionAutoProperties(): - """Returns the content of [auto-props] section of Subversion's config file as - a dictionary. - - Returns: - A dictionary whose key-value pair corresponds the [auto-props] section's - key-value pair. - In following cases, returns empty dictionary: - - config file doesn't exist, or - - 'enable-auto-props' is not set to 'true-like-value' in [miscellany]. - """ - if os.name == 'nt': - subversion_config = os.environ.get("APPDATA") + "\\Subversion\\config" - else: - subversion_config = os.path.expanduser("~/.subversion/config") - if not os.path.exists(subversion_config): - return {} - config = ConfigParser.ConfigParser() - config.read(subversion_config) - if (config.has_section("miscellany") and - config.has_option("miscellany", "enable-auto-props") and - config.getboolean("miscellany", "enable-auto-props") and - config.has_section("auto-props")): - props = {} - for file_pattern in config.options("auto-props"): - props[file_pattern] = ParseSubversionPropertyValues( - config.get("auto-props", file_pattern)) - return props - else: - return {} - -def ParseSubversionPropertyValues(props): - """Parse the given property value which comes from [auto-props] section and - returns a list whose element is a (svn_prop_key, svn_prop_value) pair. - - See the following doctest for example. - - >>> ParseSubversionPropertyValues('svn:eol-style=LF') - [('svn:eol-style', 'LF')] - >>> ParseSubversionPropertyValues('svn:mime-type=image/jpeg') - [('svn:mime-type', 'image/jpeg')] - >>> ParseSubversionPropertyValues('svn:eol-style=LF;svn:executable') - [('svn:eol-style', 'LF'), ('svn:executable', '*')] - """ - key_value_pairs = [] - for prop in props.split(";"): - key_value = prop.split("=") - assert len(key_value) <= 2 - if len(key_value) == 1: - # If value is not given, use '*' as a Subversion's convention. - key_value_pairs.append((key_value[0], "*")) - else: - key_value_pairs.append((key_value[0], key_value[1])) - return key_value_pairs - - -def GetSubversionPropertyChanges(filename): - """Return a Subversion's 'Property changes on ...' string, which is used in - the patch file. - - Args: - filename: filename whose property might be set by [auto-props] config. - - Returns: - A string like 'Property changes on |filename| ...' if given |filename| - matches any entries in [auto-props] section. None, otherwise. - """ - global svn_auto_props_map - if svn_auto_props_map is None: - svn_auto_props_map = LoadSubversionAutoProperties() - - all_props = [] - for file_pattern, props in svn_auto_props_map.items(): - if fnmatch.fnmatch(filename, file_pattern): - all_props.extend(props) - if all_props: - return FormatSubversionPropertyChanges(filename, all_props) - return None - - -def FormatSubversionPropertyChanges(filename, props): - """Returns Subversion's 'Property changes on ...' strings using given filename - and properties. - - Args: - filename: filename - props: A list whose element is a (svn_prop_key, svn_prop_value) pair. - - Returns: - A string which can be used in the patch file for Subversion. - - See the following doctest for example. - - >>> print FormatSubversionPropertyChanges('foo.cc', [('svn:eol-style', 'LF')]) - Property changes on: foo.cc - ___________________________________________________________________ - Added: svn:eol-style - + LF - - """ - prop_changes_lines = [ - "Property changes on: %s" % filename, - "___________________________________________________________________"] - for key, value in props: - prop_changes_lines.append("Added: " + key) - prop_changes_lines.append(" + " + value) - return "\n".join(prop_changes_lines) + "\n" - - -def RealMain(argv, data=None): - """The real main function. - - Args: - argv: Command line arguments. - data: Diff contents. If None (default) the diff is generated by - the VersionControlSystem implementation returned by GuessVCS(). - - Returns: - A 2-tuple (issue id, patchset id). - The patchset id is None if the base files are not uploaded by this - script (applies only to SVN checkouts). - """ - options, args = parser.parse_args(argv[1:]) - if options.help: - if options.verbose < 2: - # hide Perforce options - parser.epilog = "Use '--help -v' to show additional Perforce options." - parser.option_groups.remove(parser.get_option_group('--p4_port')) - parser.print_help() - sys.exit(0) - - global verbosity - verbosity = options.verbose - if verbosity >= 3: - logging.getLogger().setLevel(logging.DEBUG) - elif verbosity >= 2: - logging.getLogger().setLevel(logging.INFO) - - vcs = GuessVCS(options) - - base = options.base_url - if isinstance(vcs, SubversionVCS): - # Guessing the base field is only supported for Subversion. - # Note: Fetching base files may become deprecated in future releases. - guessed_base = vcs.GuessBase(options.download_base) - if base: - if guessed_base and base != guessed_base: - print "Using base URL \"%s\" from --base_url instead of \"%s\"" % \ - (base, guessed_base) - else: - base = guessed_base - - if not base and options.download_base: - options.download_base = True - logging.info("Enabled upload of base file") - if not options.assume_yes: - vcs.CheckForUnknownFiles() - if data is None: - data = vcs.GenerateDiff(args) - data = vcs.PostProcessDiff(data) - if options.print_diffs: - print "Rietveld diff start:*****" - print data - print "Rietveld diff end:*****" - files = vcs.GetBaseFiles(data) - if verbosity >= 1: - print "Upload server:", options.server, "(change with -s/--server)" - rpc_server = GetRpcServer(options.server, - options.email, - options.host, - options.save_cookies, - options.account_type) - form_fields = [] - - repo_guid = vcs.GetGUID() - if repo_guid: - form_fields.append(("repo_guid", repo_guid)) - if base: - b = urlparse.urlparse(base) - username, netloc = urllib.splituser(b.netloc) - if username: - logging.info("Removed username from base URL") - base = urlparse.urlunparse((b.scheme, netloc, b.path, b.params, - b.query, b.fragment)) - form_fields.append(("base", base)) - if options.issue: - form_fields.append(("issue", str(options.issue))) - if options.email: - form_fields.append(("user", options.email)) - if options.reviewers: - for reviewer in options.reviewers.split(','): - CheckReviewer(reviewer) - form_fields.append(("reviewers", options.reviewers)) - if options.cc: - for cc in options.cc.split(','): - CheckReviewer(cc) - form_fields.append(("cc", options.cc)) - - # Process --message, --title and --file. - message = options.message or "" - title = options.title or "" - if options.file: - if options.message: - ErrorExit("Can't specify both message and message file options") - file = open(options.file, 'r') - message = file.read() - file.close() - if options.issue: - prompt = "Title describing this patch set: " - else: - prompt = "New issue subject: " - title = ( - title or message.split('\n', 1)[0].strip() or raw_input(prompt).strip()) - if not title and not options.issue: - ErrorExit("A non-empty title is required for a new issue") - # For existing issues, it's fine to give a patchset an empty name. Rietveld - # doesn't accept that so use a whitespace. - title = title or " " - if len(title) > 100: - title = title[:99] + '…' - if title and not options.issue: - message = message or title - - form_fields.append(("subject", title)) - # If it's a new issue send message as description. Otherwise a new - # message is created below on upload_complete. - if message and not options.issue: - form_fields.append(("description", message)) - - # Send a hash of all the base file so the server can determine if a copy - # already exists in an earlier patchset. - base_hashes = "" - for file, info in files.iteritems(): - if not info[0] is None: - checksum = md5(info[0]).hexdigest() - if base_hashes: - base_hashes += "|" - base_hashes += checksum + ":" + file - form_fields.append(("base_hashes", base_hashes)) - if options.private: - if options.issue: - print "Warning: Private flag ignored when updating an existing issue." - else: - form_fields.append(("private", "1")) - if options.send_patch: - options.send_mail = True - if not options.download_base: - form_fields.append(("content_upload", "1")) - if len(data) > MAX_UPLOAD_SIZE: - print "Patch is large, so uploading file patches separately." - uploaded_diff_file = [] - form_fields.append(("separate_patches", "1")) - else: - uploaded_diff_file = [("data", "data.diff", data)] - ctype, body = EncodeMultipartFormData(form_fields, uploaded_diff_file) - response_body = rpc_server.Send("/upload", body, content_type=ctype) - patchset = None - if not options.download_base or not uploaded_diff_file: - lines = response_body.splitlines() - if len(lines) >= 2: - msg = lines[0] - patchset = lines[1].strip() - patches = [x.split(" ", 1) for x in lines[2:]] - else: - msg = response_body - else: - msg = response_body - StatusUpdate(msg) - if not response_body.startswith("Issue created.") and \ - not response_body.startswith("Issue updated."): - sys.exit(0) - issue = msg[msg.rfind("/")+1:] - - if not uploaded_diff_file: - result = UploadSeparatePatches(issue, rpc_server, patchset, data, options) - if not options.download_base: - patches = result - - if not options.download_base: - vcs.UploadBaseFiles(issue, rpc_server, patches, patchset, options, files) - - payload = {} # payload for final request - if options.send_mail: - payload["send_mail"] = "yes" - if options.send_patch: - payload["attach_patch"] = "yes" - if options.issue and message: - payload["message"] = message - payload = urllib.urlencode(payload) - rpc_server.Send("/" + issue + "/upload_complete/" + (patchset or ""), - payload=payload) - return issue, patchset - - -def main(): - try: - logging.basicConfig(format=("%(asctime).19s %(levelname)s %(filename)s:" - "%(lineno)s %(message)s ")) - os.environ['LC_ALL'] = 'C' - RealMain(sys.argv) - except KeyboardInterrupt: - print - StatusUpdate("Interrupted.") - sys.exit(1) - - -if __name__ == "__main__": - main() diff --git a/node_modules/mongoose/node_modules/ms/.npmignore b/node_modules/mongoose/node_modules/ms/.npmignore deleted file mode 100644 index 3c3629e..0000000 --- a/node_modules/mongoose/node_modules/ms/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/node_modules/mongoose/node_modules/ms/Makefile b/node_modules/mongoose/node_modules/ms/Makefile deleted file mode 100644 index dded504..0000000 --- a/node_modules/mongoose/node_modules/ms/Makefile +++ /dev/null @@ -1,8 +0,0 @@ - -test: - ./node_modules/.bin/mocha test/test.js - -test-browser: - ./node_modules/.bin/serve test/ - -.PHONY: test diff --git a/node_modules/mongoose/node_modules/ms/README.md b/node_modules/mongoose/node_modules/ms/README.md deleted file mode 100644 index c93d43f..0000000 --- a/node_modules/mongoose/node_modules/ms/README.md +++ /dev/null @@ -1,65 +0,0 @@ - -# ms.js - -Ever find yourself doing math in your head or writing `1000 * 60 * 60 …`? -Don't want to add obstrusive `Number` prototype extensions to your reusable -/ distributable modules and projects? - -`ms` is a tiny utility that you can leverage when your application needs to -accept a number of miliseconds as a parameter. - -If a number is supplied to `ms`, it returns it immediately (e.g: -If a string that contains the number is supplied, it returns it immediately as -a number (e.g: it returns `100` for `'100'`). - -However, if you pass a string with a number and a valid unit, hte number of -equivalent ms is returned. - -```js -ms('1d') // 86400000 -ms('10h') // 36000000 -ms('2h') // 7200000 -ms('1m') // 60000 -ms('5ms') // 5000 -ms('100') // '100' -ms(100) // 100 -``` - -## How to use - -### Node - -```js -require('ms') -``` - -### Browser - -```html - -``` - -## Credits - -(The MIT License) - -Copyright (c) 2011 Guillermo Rauch <guillermo@learnboost.com> - -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. diff --git a/node_modules/mongoose/node_modules/ms/ms.js b/node_modules/mongoose/node_modules/ms/ms.js deleted file mode 100644 index b4621bc..0000000 --- a/node_modules/mongoose/node_modules/ms/ms.js +++ /dev/null @@ -1,35 +0,0 @@ -/** - -# ms.js - -No more painful `setTimeout(fn, 60 * 4 * 3 * 2 * 1 * Infinity * NaN * '☃')`. - - ms('2d') // 172800000 - ms('1.5h') // 5400000 - ms('1h') // 3600000 - ms('1m') // 60000 - ms('5s') // 5000 - ms('500ms') // 500 - ms('100') // '100' - ms(100) // 100 - -**/ - -(function (g) { - var r = /(\d*.?\d+)([mshd]+)/ - , _ = {} - - _.ms = 1; - _.s = 1000; - _.m = _.s * 60; - _.h = _.m * 60; - _.d = _.h * 24; - - function ms (s) { - if (s == Number(s)) return Number(s); - r.exec(s.toLowerCase()); - return RegExp.$1 * _[RegExp.$2]; - } - - g.top ? g.ms = ms : module.exports = ms; -})(this); diff --git a/node_modules/mongoose/node_modules/ms/package.json b/node_modules/mongoose/node_modules/ms/package.json deleted file mode 100644 index 9ede799..0000000 --- a/node_modules/mongoose/node_modules/ms/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "ms", - "version": "0.1.0", - "description": "Tiny ms conversion utility", - "main": "./ms", - "devDependencies": { - "mocha": "*", - "expect.js": "*", - "serve": "*" - }, - "readme": "\n# ms.js\n\nEver find yourself doing math in your head or writing `1000 * 60 * 60 …`?\nDon't want to add obstrusive `Number` prototype extensions to your reusable\n/ distributable modules and projects?\n\n`ms` is a tiny utility that you can leverage when your application needs to\naccept a number of miliseconds as a parameter.\n\nIf a number is supplied to `ms`, it returns it immediately (e.g:\nIf a string that contains the number is supplied, it returns it immediately as\na number (e.g: it returns `100` for `'100'`).\n\nHowever, if you pass a string with a number and a valid unit, hte number of\nequivalent ms is returned.\n\n```js\nms('1d') // 86400000\nms('10h') // 36000000\nms('2h') // 7200000\nms('1m') // 60000\nms('5ms') // 5000\nms('100') // '100'\nms(100) // 100\n```\n\n## How to use\n\n### Node\n\n```js\nrequire('ms')\n```\n\n### Browser\n\n```html\n\n```\n\n## Credits\n\n(The MIT License)\n\nCopyright (c) 2011 Guillermo Rauch <guillermo@learnboost.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", - "_id": "ms@0.1.0", - "_from": "ms@0.1.0" -} diff --git a/node_modules/mongoose/node_modules/ms/test/index.html b/node_modules/mongoose/node_modules/ms/test/index.html deleted file mode 100644 index 79edc40..0000000 --- a/node_modules/mongoose/node_modules/ms/test/index.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - ms.js tests - - - - - - - - - - - - -
      - - diff --git a/node_modules/mongoose/node_modules/ms/test/support/jquery.js b/node_modules/mongoose/node_modules/ms/test/support/jquery.js deleted file mode 100644 index 8ccd0ea..0000000 --- a/node_modules/mongoose/node_modules/ms/test/support/jquery.js +++ /dev/null @@ -1,9266 +0,0 @@ -/*! - * jQuery JavaScript Library v1.7.1 - * http://jquery.com/ - * - * Copyright 2011, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Mon Nov 21 21:11:03 2011 -0500 - */ -(function( window, undefined ) { - -// Use the correct document accordingly with window argument (sandbox) -var document = window.document, - navigator = window.navigator, - location = window.location; -var jQuery = (function() { - -// Define a local copy of jQuery -var jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init( selector, context, rootjQuery ); - }, - - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - - // Map over the $ in case of overwrite - _$ = window.$, - - // A central reference to the root jQuery(document) - rootjQuery, - - // A simple way to check for HTML strings or ID strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, - - // Check if a string has a non-whitespace character in it - rnotwhite = /\S/, - - // Used for trimming whitespace - trimLeft = /^\s+/, - trimRight = /\s+$/, - - // Match a standalone tag - rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, - - // JSON RegExp - rvalidchars = /^[\],:{}\s]*$/, - rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, - rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, - rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, - - // Useragent RegExp - rwebkit = /(webkit)[ \/]([\w.]+)/, - ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, - rmsie = /(msie) ([\w.]+)/, - rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, - - // Matches dashed string for camelizing - rdashAlpha = /-([a-z]|[0-9])/ig, - rmsPrefix = /^-ms-/, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return ( letter + "" ).toUpperCase(); - }, - - // Keep a UserAgent string for use with jQuery.browser - userAgent = navigator.userAgent, - - // For matching the engine and version of the browser - browserMatch, - - // The deferred used on DOM ready - readyList, - - // The ready event handler - DOMContentLoaded, - - // Save a reference to some core methods - toString = Object.prototype.toString, - hasOwn = Object.prototype.hasOwnProperty, - push = Array.prototype.push, - slice = Array.prototype.slice, - trim = String.prototype.trim, - indexOf = Array.prototype.indexOf, - - // [[Class]] -> type pairs - class2type = {}; - -jQuery.fn = jQuery.prototype = { - constructor: jQuery, - init: function( selector, context, rootjQuery ) { - var match, elem, ret, doc; - - // Handle $(""), $(null), or $(undefined) - if ( !selector ) { - return this; - } - - // Handle $(DOMElement) - if ( selector.nodeType ) { - this.context = this[0] = selector; - this.length = 1; - return this; - } - - // The body element only exists once, optimize finding it - if ( selector === "body" && !context && document.body ) { - this.context = document; - this[0] = document.body; - this.selector = selector; - this.length = 1; - return this; - } - - // Handle HTML strings - if ( typeof selector === "string" ) { - // Are we dealing with HTML string or an ID? - if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = quickExpr.exec( selector ); - } - - // Verify a match, and that no context was specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; - doc = ( context ? context.ownerDocument || context : document ); - - // If a single string is passed in and it's a single tag - // just do a createElement and skip the rest - ret = rsingleTag.exec( selector ); - - if ( ret ) { - if ( jQuery.isPlainObject( context ) ) { - selector = [ document.createElement( ret[1] ) ]; - jQuery.fn.attr.call( selector, context, true ); - - } else { - selector = [ doc.createElement( ret[1] ) ]; - } - - } else { - ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); - selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; - } - - return jQuery.merge( this, selector ); - - // HANDLE: $("#id") - } else { - elem = document.getElementById( match[2] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id !== match[2] ) { - return rootjQuery.find( selector ); - } - - // Otherwise, we inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || rootjQuery ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return rootjQuery.ready( selector ); - } - - if ( selector.selector !== undefined ) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }, - - // Start with an empty selector - selector: "", - - // The current version of jQuery being used - jquery: "1.7.1", - - // The default length of a jQuery object is 0 - length: 0, - - // The number of elements contained in the matched element set - size: function() { - return this.length; - }, - - toArray: function() { - return slice.call( this, 0 ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num == null ? - - // Return a 'clean' array - this.toArray() : - - // Return just the object - ( num < 0 ? this[ this.length + num ] : this[ num ] ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems, name, selector ) { - // Build a new jQuery matched element set - var ret = this.constructor(); - - if ( jQuery.isArray( elems ) ) { - push.apply( ret, elems ); - - } else { - jQuery.merge( ret, elems ); - } - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - ret.context = this.context; - - if ( name === "find" ) { - ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; - } else if ( name ) { - ret.selector = this.selector + "." + name + "(" + selector + ")"; - } - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - ready: function( fn ) { - // Attach the listeners - jQuery.bindReady(); - - // Add the callback - readyList.add( fn ); - - return this; - }, - - eq: function( i ) { - i = +i; - return i === -1 ? - this.slice( i ) : - this.slice( i, i + 1 ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ), - "slice", slice.call(arguments).join(",") ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function( elem, i ) { - return callback.call( elem, i, elem ); - })); - }, - - end: function() { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: [].sort, - splice: [].splice -}; - -// Give the init function the jQuery prototype for later instantiation -jQuery.fn.init.prototype = jQuery.fn; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { - target = {}; - } - - // extend jQuery itself if only one argument is passed - if ( length === i ) { - target = this; - --i; - } - - for ( ; i < length; i++ ) { - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend({ - noConflict: function( deep ) { - if ( window.$ === jQuery ) { - window.$ = _$; - } - - if ( deep && window.jQuery === jQuery ) { - window.jQuery = _jQuery; - } - - return jQuery; - }, - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - // Either a released hold or an DOMready/load event and not yet ready - if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( !document.body ) { - return setTimeout( jQuery.ready, 1 ); - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.fireWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.trigger ) { - jQuery( document ).trigger( "ready" ).off( "ready" ); - } - } - }, - - bindReady: function() { - if ( readyList ) { - return; - } - - readyList = jQuery.Callbacks( "once memory" ); - - // Catch cases where $(document).ready() is called after the - // browser event has already occurred. - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - return setTimeout( jQuery.ready, 1 ); - } - - // Mozilla, Opera and webkit nightlies currently support this event - if ( document.addEventListener ) { - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", jQuery.ready, false ); - - // If IE event model is used - } else if ( document.attachEvent ) { - // ensure firing before onload, - // maybe late but safe also for iframes - document.attachEvent( "onreadystatechange", DOMContentLoaded ); - - // A fallback to window.onload, that will always work - window.attachEvent( "onload", jQuery.ready ); - - // If IE and not a frame - // continually check to see if the document is ready - var toplevel = false; - - try { - toplevel = window.frameElement == null; - } catch(e) {} - - if ( document.documentElement.doScroll && toplevel ) { - doScrollCheck(); - } - } - }, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function( obj ) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray || function( obj ) { - return jQuery.type(obj) === "array"; - }, - - // A crude way of determining if an object is a window - isWindow: function( obj ) { - return obj && typeof obj === "object" && "setInterval" in obj; - }, - - isNumeric: function( obj ) { - return !isNaN( parseFloat(obj) ) && isFinite( obj ); - }, - - type: function( obj ) { - return obj == null ? - String( obj ) : - class2type[ toString.call(obj) ] || "object"; - }, - - isPlainObject: function( obj ) { - // Must be an Object. - // Because of IE, we also have to check the presence of the constructor property. - // Make sure that DOM nodes and window objects don't pass through, as well - if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - try { - // Not own constructor property must be Object - if ( obj.constructor && - !hasOwn.call(obj, "constructor") && - !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { - return false; - } - } catch ( e ) { - // IE8,9 Will throw exceptions on certain host objects #9897 - return false; - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - - var key; - for ( key in obj ) {} - - return key === undefined || hasOwn.call( obj, key ); - }, - - isEmptyObject: function( obj ) { - for ( var name in obj ) { - return false; - } - return true; - }, - - error: function( msg ) { - throw new Error( msg ); - }, - - parseJSON: function( data ) { - if ( typeof data !== "string" || !data ) { - return null; - } - - // Make sure leading/trailing whitespace is removed (IE can't handle it) - data = jQuery.trim( data ); - - // Attempt to parse using the native JSON parser first - if ( window.JSON && window.JSON.parse ) { - return window.JSON.parse( data ); - } - - // Make sure the incoming data is actual JSON - // Logic borrowed from http://json.org/json2.js - if ( rvalidchars.test( data.replace( rvalidescape, "@" ) - .replace( rvalidtokens, "]" ) - .replace( rvalidbraces, "")) ) { - - return ( new Function( "return " + data ) )(); - - } - jQuery.error( "Invalid JSON: " + data ); - }, - - // Cross-browser xml parsing - parseXML: function( data ) { - var xml, tmp; - try { - if ( window.DOMParser ) { // Standard - tmp = new DOMParser(); - xml = tmp.parseFromString( data , "text/xml" ); - } else { // IE - xml = new ActiveXObject( "Microsoft.XMLDOM" ); - xml.async = "false"; - xml.loadXML( data ); - } - } catch( e ) { - xml = undefined; - } - if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; - }, - - noop: function() {}, - - // Evaluates a script in a global context - // Workarounds based on findings by Jim Driscoll - // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context - globalEval: function( data ) { - if ( data && rnotwhite.test( data ) ) { - // We use execScript on Internet Explorer - // We use an anonymous function so that context is window - // rather than jQuery in Firefox - ( window.execScript || function( data ) { - window[ "eval" ].call( window, data ); - } )( data ); - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); - }, - - // args is for internal usage only - each: function( object, callback, args ) { - var name, i = 0, - length = object.length, - isObj = length === undefined || jQuery.isFunction( object ); - - if ( args ) { - if ( isObj ) { - for ( name in object ) { - if ( callback.apply( object[ name ], args ) === false ) { - break; - } - } - } else { - for ( ; i < length; ) { - if ( callback.apply( object[ i++ ], args ) === false ) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if ( isObj ) { - for ( name in object ) { - if ( callback.call( object[ name ], name, object[ name ] ) === false ) { - break; - } - } - } else { - for ( ; i < length; ) { - if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { - break; - } - } - } - } - - return object; - }, - - // Use native String.trim function wherever possible - trim: trim ? - function( text ) { - return text == null ? - "" : - trim.call( text ); - } : - - // Otherwise use our own trimming functionality - function( text ) { - return text == null ? - "" : - text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); - }, - - // results is for internal usage only - makeArray: function( array, results ) { - var ret = results || []; - - if ( array != null ) { - // The window, strings (and functions) also have 'length' - // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 - var type = jQuery.type( array ); - - if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { - push.call( ret, array ); - } else { - jQuery.merge( ret, array ); - } - } - - return ret; - }, - - inArray: function( elem, array, i ) { - var len; - - if ( array ) { - if ( indexOf ) { - return indexOf.call( array, elem, i ); - } - - len = array.length; - i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; - - for ( ; i < len; i++ ) { - // Skip accessing in sparse arrays - if ( i in array && array[ i ] === elem ) { - return i; - } - } - } - - return -1; - }, - - merge: function( first, second ) { - var i = first.length, - j = 0; - - if ( typeof second.length === "number" ) { - for ( var l = second.length; j < l; j++ ) { - first[ i++ ] = second[ j ]; - } - - } else { - while ( second[j] !== undefined ) { - first[ i++ ] = second[ j++ ]; - } - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, inv ) { - var ret = [], retVal; - inv = !!inv; - - // Go through the array, only saving the items - // that pass the validator function - for ( var i = 0, length = elems.length; i < length; i++ ) { - retVal = !!callback( elems[ i ], i ); - if ( inv !== retVal ) { - ret.push( elems[ i ] ); - } - } - - return ret; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var value, key, ret = [], - i = 0, - length = elems.length, - // jquery objects are treated as arrays - isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; - - // Go through the array, translating each of the items to their - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - - // Go through every key on the object, - } else { - for ( key in elems ) { - value = callback( elems[ key ], key, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - } - - // Flatten any nested arrays - return ret.concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - if ( typeof context === "string" ) { - var tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - var args = slice.call( arguments, 2 ), - proxy = function() { - return fn.apply( context, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; - - return proxy; - }, - - // Mutifunctional method to get and set values to a collection - // The value/s can optionally be executed if it's a function - access: function( elems, key, value, exec, fn, pass ) { - var length = elems.length; - - // Setting many attributes - if ( typeof key === "object" ) { - for ( var k in key ) { - jQuery.access( elems, k, key[k], exec, fn, value ); - } - return elems; - } - - // Setting one attribute - if ( value !== undefined ) { - // Optionally, function values get executed if exec is true - exec = !pass && exec && jQuery.isFunction(value); - - for ( var i = 0; i < length; i++ ) { - fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); - } - - return elems; - } - - // Getting an attribute - return length ? fn( elems[0], key ) : undefined; - }, - - now: function() { - return ( new Date() ).getTime(); - }, - - // Use of jQuery.browser is frowned upon. - // More details: http://docs.jquery.com/Utilities/jQuery.browser - uaMatch: function( ua ) { - ua = ua.toLowerCase(); - - var match = rwebkit.exec( ua ) || - ropera.exec( ua ) || - rmsie.exec( ua ) || - ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || - []; - - return { browser: match[1] || "", version: match[2] || "0" }; - }, - - sub: function() { - function jQuerySub( selector, context ) { - return new jQuerySub.fn.init( selector, context ); - } - jQuery.extend( true, jQuerySub, this ); - jQuerySub.superclass = this; - jQuerySub.fn = jQuerySub.prototype = this(); - jQuerySub.fn.constructor = jQuerySub; - jQuerySub.sub = this.sub; - jQuerySub.fn.init = function init( selector, context ) { - if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { - context = jQuerySub( context ); - } - - return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); - }; - jQuerySub.fn.init.prototype = jQuerySub.fn; - var rootjQuerySub = jQuerySub(document); - return jQuerySub; - }, - - browser: {} -}); - -// Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); - -browserMatch = jQuery.uaMatch( userAgent ); -if ( browserMatch.browser ) { - jQuery.browser[ browserMatch.browser ] = true; - jQuery.browser.version = browserMatch.version; -} - -// Deprecated, use jQuery.browser.webkit instead -if ( jQuery.browser.webkit ) { - jQuery.browser.safari = true; -} - -// IE doesn't match non-breaking spaces with \s -if ( rnotwhite.test( "\xA0" ) ) { - trimLeft = /^[\s\xA0]+/; - trimRight = /[\s\xA0]+$/; -} - -// All jQuery objects should point back to these -rootjQuery = jQuery(document); - -// Cleanup functions for the document ready method -if ( document.addEventListener ) { - DOMContentLoaded = function() { - document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); - jQuery.ready(); - }; - -} else if ( document.attachEvent ) { - DOMContentLoaded = function() { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( document.readyState === "complete" ) { - document.detachEvent( "onreadystatechange", DOMContentLoaded ); - jQuery.ready(); - } - }; -} - -// The DOM ready check for Internet Explorer -function doScrollCheck() { - if ( jQuery.isReady ) { - return; - } - - try { - // If IE is used, use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - document.documentElement.doScroll("left"); - } catch(e) { - setTimeout( doScrollCheck, 1 ); - return; - } - - // and execute any waiting functions - jQuery.ready(); -} - -return jQuery; - -})(); - - -// String to Object flags format cache -var flagsCache = {}; - -// Convert String-formatted flags into Object-formatted ones and store in cache -function createFlags( flags ) { - var object = flagsCache[ flags ] = {}, - i, length; - flags = flags.split( /\s+/ ); - for ( i = 0, length = flags.length; i < length; i++ ) { - object[ flags[i] ] = true; - } - return object; -} - -/* - * Create a callback list using the following parameters: - * - * flags: an optional list of space-separated flags that will change how - * the callback list behaves - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible flags: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( flags ) { - - // Convert flags from String-formatted to Object-formatted - // (we check in cache first) - flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; - - var // Actual callback list - list = [], - // Stack of fire calls for repeatable lists - stack = [], - // Last fire value (for non-forgettable lists) - memory, - // Flag to know if list is currently firing - firing, - // First callback to fire (used internally by add and fireWith) - firingStart, - // End of the loop when firing - firingLength, - // Index of currently firing callback (modified by remove if needed) - firingIndex, - // Add one or several callbacks to the list - add = function( args ) { - var i, - length, - elem, - type, - actual; - for ( i = 0, length = args.length; i < length; i++ ) { - elem = args[ i ]; - type = jQuery.type( elem ); - if ( type === "array" ) { - // Inspect recursively - add( elem ); - } else if ( type === "function" ) { - // Add if not in unique mode and callback is not in - if ( !flags.unique || !self.has( elem ) ) { - list.push( elem ); - } - } - } - }, - // Fire callbacks - fire = function( context, args ) { - args = args || []; - memory = !flags.memory || [ context, args ]; - firing = true; - firingIndex = firingStart || 0; - firingStart = 0; - firingLength = list.length; - for ( ; list && firingIndex < firingLength; firingIndex++ ) { - if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { - memory = true; // Mark as halted - break; - } - } - firing = false; - if ( list ) { - if ( !flags.once ) { - if ( stack && stack.length ) { - memory = stack.shift(); - self.fireWith( memory[ 0 ], memory[ 1 ] ); - } - } else if ( memory === true ) { - self.disable(); - } else { - list = []; - } - } - }, - // Actual Callbacks object - self = { - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - var length = list.length; - add( arguments ); - // Do we need to add the callbacks to the - // current firing batch? - if ( firing ) { - firingLength = list.length; - // With memory, if we're not firing then - // we should call right away, unless previous - // firing was halted (stopOnFalse) - } else if ( memory && memory !== true ) { - firingStart = length; - fire( memory[ 0 ], memory[ 1 ] ); - } - } - return this; - }, - // Remove a callback from the list - remove: function() { - if ( list ) { - var args = arguments, - argIndex = 0, - argLength = args.length; - for ( ; argIndex < argLength ; argIndex++ ) { - for ( var i = 0; i < list.length; i++ ) { - if ( args[ argIndex ] === list[ i ] ) { - // Handle firingIndex and firingLength - if ( firing ) { - if ( i <= firingLength ) { - firingLength--; - if ( i <= firingIndex ) { - firingIndex--; - } - } - } - // Remove the element - list.splice( i--, 1 ); - // If we have some unicity property then - // we only need to do this once - if ( flags.unique ) { - break; - } - } - } - } - } - return this; - }, - // Control if a given callback is in the list - has: function( fn ) { - if ( list ) { - var i = 0, - length = list.length; - for ( ; i < length; i++ ) { - if ( fn === list[ i ] ) { - return true; - } - } - } - return false; - }, - // Remove all callbacks from the list - empty: function() { - list = []; - return this; - }, - // Have the list do nothing anymore - disable: function() { - list = stack = memory = undefined; - return this; - }, - // Is it disabled? - disabled: function() { - return !list; - }, - // Lock the list in its current state - lock: function() { - stack = undefined; - if ( !memory || memory === true ) { - self.disable(); - } - return this; - }, - // Is it locked? - locked: function() { - return !stack; - }, - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( stack ) { - if ( firing ) { - if ( !flags.once ) { - stack.push( [ context, args ] ); - } - } else if ( !( flags.once && memory ) ) { - fire( context, args ); - } - } - return this; - }, - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - // To know if the callbacks have already been called at least once - fired: function() { - return !!memory; - } - }; - - return self; -}; - - - - -var // Static reference to slice - sliceDeferred = [].slice; - -jQuery.extend({ - - Deferred: function( func ) { - var doneList = jQuery.Callbacks( "once memory" ), - failList = jQuery.Callbacks( "once memory" ), - progressList = jQuery.Callbacks( "memory" ), - state = "pending", - lists = { - resolve: doneList, - reject: failList, - notify: progressList - }, - promise = { - done: doneList.add, - fail: failList.add, - progress: progressList.add, - - state: function() { - return state; - }, - - // Deprecated - isResolved: doneList.fired, - isRejected: failList.fired, - - then: function( doneCallbacks, failCallbacks, progressCallbacks ) { - deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); - return this; - }, - always: function() { - deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); - return this; - }, - pipe: function( fnDone, fnFail, fnProgress ) { - return jQuery.Deferred(function( newDefer ) { - jQuery.each( { - done: [ fnDone, "resolve" ], - fail: [ fnFail, "reject" ], - progress: [ fnProgress, "notify" ] - }, function( handler, data ) { - var fn = data[ 0 ], - action = data[ 1 ], - returned; - if ( jQuery.isFunction( fn ) ) { - deferred[ handler ](function() { - returned = fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); - } else { - newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); - } - }); - } else { - deferred[ handler ]( newDefer[ action ] ); - } - }); - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - if ( obj == null ) { - obj = promise; - } else { - for ( var key in promise ) { - obj[ key ] = promise[ key ]; - } - } - return obj; - } - }, - deferred = promise.promise({}), - key; - - for ( key in lists ) { - deferred[ key ] = lists[ key ].fire; - deferred[ key + "With" ] = lists[ key ].fireWith; - } - - // Handle state - deferred.done( function() { - state = "resolved"; - }, failList.disable, progressList.lock ).fail( function() { - state = "rejected"; - }, doneList.disable, progressList.lock ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( firstParam ) { - var args = sliceDeferred.call( arguments, 0 ), - i = 0, - length = args.length, - pValues = new Array( length ), - count = length, - pCount = length, - deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? - firstParam : - jQuery.Deferred(), - promise = deferred.promise(); - function resolveFunc( i ) { - return function( value ) { - args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; - if ( !( --count ) ) { - deferred.resolveWith( deferred, args ); - } - }; - } - function progressFunc( i ) { - return function( value ) { - pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; - deferred.notifyWith( promise, pValues ); - }; - } - if ( length > 1 ) { - for ( ; i < length; i++ ) { - if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { - args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); - } else { - --count; - } - } - if ( !count ) { - deferred.resolveWith( deferred, args ); - } - } else if ( deferred !== firstParam ) { - deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); - } - return promise; - } -}); - - - - -jQuery.support = (function() { - - var support, - all, - a, - select, - opt, - input, - marginDiv, - fragment, - tds, - events, - eventName, - i, - isSupported, - div = document.createElement( "div" ), - documentElement = document.documentElement; - - // Preliminary tests - div.setAttribute("className", "t"); - div.innerHTML = "
      a"; - - all = div.getElementsByTagName( "*" ); - a = div.getElementsByTagName( "a" )[ 0 ]; - - // Can't get basic test support - if ( !all || !all.length || !a ) { - return {}; - } - - // First batch of supports tests - select = document.createElement( "select" ); - opt = select.appendChild( document.createElement("option") ); - input = div.getElementsByTagName( "input" )[ 0 ]; - - support = { - // IE strips leading whitespace when .innerHTML is used - leadingWhitespace: ( div.firstChild.nodeType === 3 ), - - // Make sure that tbody elements aren't automatically inserted - // IE will insert them into empty tables - tbody: !div.getElementsByTagName("tbody").length, - - // Make sure that link elements get serialized correctly by innerHTML - // This requires a wrapper element in IE - htmlSerialize: !!div.getElementsByTagName("link").length, - - // Get the style information from getAttribute - // (IE uses .cssText instead) - style: /top/.test( a.getAttribute("style") ), - - // Make sure that URLs aren't manipulated - // (IE normalizes it by default) - hrefNormalized: ( a.getAttribute("href") === "/a" ), - - // Make sure that element opacity exists - // (IE uses filter instead) - // Use a regex to work around a WebKit issue. See #5145 - opacity: /^0.55/.test( a.style.opacity ), - - // Verify style float existence - // (IE uses styleFloat instead of cssFloat) - cssFloat: !!a.style.cssFloat, - - // Make sure that if no value is specified for a checkbox - // that it defaults to "on". - // (WebKit defaults to "" instead) - checkOn: ( input.value === "on" ), - - // Make sure that a selected-by-default option has a working selected property. - // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) - optSelected: opt.selected, - - // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) - getSetAttribute: div.className !== "t", - - // Tests for enctype support on a form(#6743) - enctype: !!document.createElement("form").enctype, - - // Makes sure cloning an html5 element does not cause problems - // Where outerHTML is undefined, this still works - html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", - - // Will be defined later - submitBubbles: true, - changeBubbles: true, - focusinBubbles: false, - deleteExpando: true, - noCloneEvent: true, - inlineBlockNeedsLayout: false, - shrinkWrapBlocks: false, - reliableMarginRight: true - }; - - // Make sure checked status is properly cloned - input.checked = true; - support.noCloneChecked = input.cloneNode( true ).checked; - - // Make sure that the options inside disabled selects aren't marked as disabled - // (WebKit marks them as disabled) - select.disabled = true; - support.optDisabled = !opt.disabled; - - // Test to see if it's possible to delete an expando from an element - // Fails in Internet Explorer - try { - delete div.test; - } catch( e ) { - support.deleteExpando = false; - } - - if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { - div.attachEvent( "onclick", function() { - // Cloning a node shouldn't copy over any - // bound event handlers (IE does this) - support.noCloneEvent = false; - }); - div.cloneNode( true ).fireEvent( "onclick" ); - } - - // Check if a radio maintains its value - // after being appended to the DOM - input = document.createElement("input"); - input.value = "t"; - input.setAttribute("type", "radio"); - support.radioValue = input.value === "t"; - - input.setAttribute("checked", "checked"); - div.appendChild( input ); - fragment = document.createDocumentFragment(); - fragment.appendChild( div.lastChild ); - - // WebKit doesn't clone checked state correctly in fragments - support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Check if a disconnected checkbox will retain its checked - // value of true after appended to the DOM (IE6/7) - support.appendChecked = input.checked; - - fragment.removeChild( input ); - fragment.appendChild( div ); - - div.innerHTML = ""; - - // Check if div with explicit width and no margin-right incorrectly - // gets computed margin-right based on width of container. For more - // info see bug #3333 - // Fails in WebKit before Feb 2011 nightlies - // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right - if ( window.getComputedStyle ) { - marginDiv = document.createElement( "div" ); - marginDiv.style.width = "0"; - marginDiv.style.marginRight = "0"; - div.style.width = "2px"; - div.appendChild( marginDiv ); - support.reliableMarginRight = - ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; - } - - // Technique from Juriy Zaytsev - // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ - // We only care about the case where non-standard event systems - // are used, namely in IE. Short-circuiting here helps us to - // avoid an eval call (in setAttribute) which can cause CSP - // to go haywire. See: https://developer.mozilla.org/en/Security/CSP - if ( div.attachEvent ) { - for( i in { - submit: 1, - change: 1, - focusin: 1 - }) { - eventName = "on" + i; - isSupported = ( eventName in div ); - if ( !isSupported ) { - div.setAttribute( eventName, "return;" ); - isSupported = ( typeof div[ eventName ] === "function" ); - } - support[ i + "Bubbles" ] = isSupported; - } - } - - fragment.removeChild( div ); - - // Null elements to avoid leaks in IE - fragment = select = opt = marginDiv = div = input = null; - - // Run tests that need a body at doc ready - jQuery(function() { - var container, outer, inner, table, td, offsetSupport, - conMarginTop, ptlm, vb, style, html, - body = document.getElementsByTagName("body")[0]; - - if ( !body ) { - // Return for frameset docs that don't have a body - return; - } - - conMarginTop = 1; - ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;"; - vb = "visibility:hidden;border:0;"; - style = "style='" + ptlm + "border:5px solid #000;padding:0;'"; - html = "
      " + - "" + - "
      "; - - container = document.createElement("div"); - container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; - body.insertBefore( container, body.firstChild ); - - // Construct the test element - div = document.createElement("div"); - container.appendChild( div ); - - // Check if table cells still have offsetWidth/Height when they are set - // to display:none and there are still other visible table cells in a - // table row; if so, offsetWidth/Height are not reliable for use when - // determining if an element has been hidden directly using - // display:none (it is still safe to use offsets if a parent element is - // hidden; don safety goggles and see bug #4512 for more information). - // (only IE 8 fails this test) - div.innerHTML = "
      t
      "; - tds = div.getElementsByTagName( "td" ); - isSupported = ( tds[ 0 ].offsetHeight === 0 ); - - tds[ 0 ].style.display = ""; - tds[ 1 ].style.display = "none"; - - // Check if empty table cells still have offsetWidth/Height - // (IE <= 8 fail this test) - support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); - - // Figure out if the W3C box model works as expected - div.innerHTML = ""; - div.style.width = div.style.paddingLeft = "1px"; - jQuery.boxModel = support.boxModel = div.offsetWidth === 2; - - if ( typeof div.style.zoom !== "undefined" ) { - // Check if natively block-level elements act like inline-block - // elements when setting their display to 'inline' and giving - // them layout - // (IE < 8 does this) - div.style.display = "inline"; - div.style.zoom = 1; - support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); - - // Check if elements with layout shrink-wrap their children - // (IE 6 does this) - div.style.display = ""; - div.innerHTML = "
      "; - support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); - } - - div.style.cssText = ptlm + vb; - div.innerHTML = html; - - outer = div.firstChild; - inner = outer.firstChild; - td = outer.nextSibling.firstChild.firstChild; - - offsetSupport = { - doesNotAddBorder: ( inner.offsetTop !== 5 ), - doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) - }; - - inner.style.position = "fixed"; - inner.style.top = "20px"; - - // safari subtracts parent border width here which is 5px - offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); - inner.style.position = inner.style.top = ""; - - outer.style.overflow = "hidden"; - outer.style.position = "relative"; - - offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); - offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); - - body.removeChild( container ); - div = container = null; - - jQuery.extend( support, offsetSupport ); - }); - - return support; -})(); - - - - -var rbrace = /^(?:\{.*\}|\[.*\])$/, - rmultiDash = /([A-Z])/g; - -jQuery.extend({ - cache: {}, - - // Please use with caution - uuid: 0, - - // Unique for each copy of jQuery on the page - // Non-digits removed to match rinlinejQuery - expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), - - // The following elements throw uncatchable exceptions if you - // attempt to add expando properties to them. - noData: { - "embed": true, - // Ban all objects except for Flash (which handle expandos) - "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", - "applet": true - }, - - hasData: function( elem ) { - elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; - return !!elem && !isEmptyDataObject( elem ); - }, - - data: function( elem, name, data, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var privateCache, thisCache, ret, - internalKey = jQuery.expando, - getByName = typeof name === "string", - - // We have to handle DOM nodes and JS objects differently because IE6-7 - // can't GC object references properly across the DOM-JS boundary - isNode = elem.nodeType, - - // Only DOM nodes need the global jQuery cache; JS object data is - // attached directly to the object so GC can occur automatically - cache = isNode ? jQuery.cache : elem, - - // Only defining an ID for JS objects if its cache already exists allows - // the code to shortcut on the same path as a DOM node with no cache - id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, - isEvents = name === "events"; - - // Avoid doing any more work than we need to when trying to get data on an - // object that has no data at all - if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { - return; - } - - if ( !id ) { - // Only DOM nodes need a new unique ID for each element since their data - // ends up in the global cache - if ( isNode ) { - elem[ internalKey ] = id = ++jQuery.uuid; - } else { - id = internalKey; - } - } - - if ( !cache[ id ] ) { - cache[ id ] = {}; - - // Avoids exposing jQuery metadata on plain JS objects when the object - // is serialized using JSON.stringify - if ( !isNode ) { - cache[ id ].toJSON = jQuery.noop; - } - } - - // An object can be passed to jQuery.data instead of a key/value pair; this gets - // shallow copied over onto the existing cache - if ( typeof name === "object" || typeof name === "function" ) { - if ( pvt ) { - cache[ id ] = jQuery.extend( cache[ id ], name ); - } else { - cache[ id ].data = jQuery.extend( cache[ id ].data, name ); - } - } - - privateCache = thisCache = cache[ id ]; - - // jQuery data() is stored in a separate object inside the object's internal data - // cache in order to avoid key collisions between internal data and user-defined - // data. - if ( !pvt ) { - if ( !thisCache.data ) { - thisCache.data = {}; - } - - thisCache = thisCache.data; - } - - if ( data !== undefined ) { - thisCache[ jQuery.camelCase( name ) ] = data; - } - - // Users should not attempt to inspect the internal events object using jQuery.data, - // it is undocumented and subject to change. But does anyone listen? No. - if ( isEvents && !thisCache[ name ] ) { - return privateCache.events; - } - - // Check for both converted-to-camel and non-converted data property names - // If a data property was specified - if ( getByName ) { - - // First Try to find as-is property data - ret = thisCache[ name ]; - - // Test for null|undefined property data - if ( ret == null ) { - - // Try to find the camelCased property - ret = thisCache[ jQuery.camelCase( name ) ]; - } - } else { - ret = thisCache; - } - - return ret; - }, - - removeData: function( elem, name, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var thisCache, i, l, - - // Reference to internal data cache key - internalKey = jQuery.expando, - - isNode = elem.nodeType, - - // See jQuery.data for more information - cache = isNode ? jQuery.cache : elem, - - // See jQuery.data for more information - id = isNode ? elem[ internalKey ] : internalKey; - - // If there is already no cache entry for this object, there is no - // purpose in continuing - if ( !cache[ id ] ) { - return; - } - - if ( name ) { - - thisCache = pvt ? cache[ id ] : cache[ id ].data; - - if ( thisCache ) { - - // Support array or space separated string names for data keys - if ( !jQuery.isArray( name ) ) { - - // try the string as a key before any manipulation - if ( name in thisCache ) { - name = [ name ]; - } else { - - // split the camel cased version by spaces unless a key with the spaces exists - name = jQuery.camelCase( name ); - if ( name in thisCache ) { - name = [ name ]; - } else { - name = name.split( " " ); - } - } - } - - for ( i = 0, l = name.length; i < l; i++ ) { - delete thisCache[ name[i] ]; - } - - // If there is no data left in the cache, we want to continue - // and let the cache object itself get destroyed - if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { - return; - } - } - } - - // See jQuery.data for more information - if ( !pvt ) { - delete cache[ id ].data; - - // Don't destroy the parent cache unless the internal data object - // had been the only thing left in it - if ( !isEmptyDataObject(cache[ id ]) ) { - return; - } - } - - // Browsers that fail expando deletion also refuse to delete expandos on - // the window, but it will allow it on all other JS objects; other browsers - // don't care - // Ensure that `cache` is not a window object #10080 - if ( jQuery.support.deleteExpando || !cache.setInterval ) { - delete cache[ id ]; - } else { - cache[ id ] = null; - } - - // We destroyed the cache and need to eliminate the expando on the node to avoid - // false lookups in the cache for entries that no longer exist - if ( isNode ) { - // IE does not allow us to delete expando properties from nodes, - // nor does it have a removeAttribute function on Document nodes; - // we must handle all of these cases - if ( jQuery.support.deleteExpando ) { - delete elem[ internalKey ]; - } else if ( elem.removeAttribute ) { - elem.removeAttribute( internalKey ); - } else { - elem[ internalKey ] = null; - } - } - }, - - // For internal use only. - _data: function( elem, name, data ) { - return jQuery.data( elem, name, data, true ); - }, - - // A method for determining if a DOM node can handle the data expando - acceptData: function( elem ) { - if ( elem.nodeName ) { - var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; - - if ( match ) { - return !(match === true || elem.getAttribute("classid") !== match); - } - } - - return true; - } -}); - -jQuery.fn.extend({ - data: function( key, value ) { - var parts, attr, name, - data = null; - - if ( typeof key === "undefined" ) { - if ( this.length ) { - data = jQuery.data( this[0] ); - - if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) { - attr = this[0].attributes; - for ( var i = 0, l = attr.length; i < l; i++ ) { - name = attr[i].name; - - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.substring(5) ); - - dataAttr( this[0], name, data[ name ] ); - } - } - jQuery._data( this[0], "parsedAttrs", true ); - } - } - - return data; - - } else if ( typeof key === "object" ) { - return this.each(function() { - jQuery.data( this, key ); - }); - } - - parts = key.split("."); - parts[1] = parts[1] ? "." + parts[1] : ""; - - if ( value === undefined ) { - data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); - - // Try to fetch any internally stored data first - if ( data === undefined && this.length ) { - data = jQuery.data( this[0], key ); - data = dataAttr( this[0], key, data ); - } - - return data === undefined && parts[1] ? - this.data( parts[0] ) : - data; - - } else { - return this.each(function() { - var self = jQuery( this ), - args = [ parts[0], value ]; - - self.triggerHandler( "setData" + parts[1] + "!", args ); - jQuery.data( this, key, value ); - self.triggerHandler( "changeData" + parts[1] + "!", args ); - }); - } - }, - - removeData: function( key ) { - return this.each(function() { - jQuery.removeData( this, key ); - }); - } -}); - -function dataAttr( elem, key, data ) { - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - - var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); - - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - jQuery.isNumeric( data ) ? parseFloat( data ) : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch( e ) {} - - // Make sure we set the data so it isn't changed later - jQuery.data( elem, key, data ); - - } else { - data = undefined; - } - } - - return data; -} - -// checks a cache object for emptiness -function isEmptyDataObject( obj ) { - for ( var name in obj ) { - - // if the public data object is empty, the private is still empty - if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { - continue; - } - if ( name !== "toJSON" ) { - return false; - } - } - - return true; -} - - - - -function handleQueueMarkDefer( elem, type, src ) { - var deferDataKey = type + "defer", - queueDataKey = type + "queue", - markDataKey = type + "mark", - defer = jQuery._data( elem, deferDataKey ); - if ( defer && - ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && - ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { - // Give room for hard-coded callbacks to fire first - // and eventually mark/queue something else on the element - setTimeout( function() { - if ( !jQuery._data( elem, queueDataKey ) && - !jQuery._data( elem, markDataKey ) ) { - jQuery.removeData( elem, deferDataKey, true ); - defer.fire(); - } - }, 0 ); - } -} - -jQuery.extend({ - - _mark: function( elem, type ) { - if ( elem ) { - type = ( type || "fx" ) + "mark"; - jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); - } - }, - - _unmark: function( force, elem, type ) { - if ( force !== true ) { - type = elem; - elem = force; - force = false; - } - if ( elem ) { - type = type || "fx"; - var key = type + "mark", - count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); - if ( count ) { - jQuery._data( elem, key, count ); - } else { - jQuery.removeData( elem, key, true ); - handleQueueMarkDefer( elem, type, "mark" ); - } - } - }, - - queue: function( elem, type, data ) { - var q; - if ( elem ) { - type = ( type || "fx" ) + "queue"; - q = jQuery._data( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !q || jQuery.isArray(data) ) { - q = jQuery._data( elem, type, jQuery.makeArray(data) ); - } else { - q.push( data ); - } - } - return q || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - fn = queue.shift(), - hooks = {}; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - } - - if ( fn ) { - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - jQuery._data( elem, type + ".run", hooks ); - fn.call( elem, function() { - jQuery.dequeue( elem, type ); - }, hooks ); - } - - if ( !queue.length ) { - jQuery.removeData( elem, type + "queue " + type + ".run", true ); - handleQueueMarkDefer( elem, type, "queue" ); - } - } -}); - -jQuery.fn.extend({ - queue: function( type, data ) { - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - } - - if ( data === undefined ) { - return jQuery.queue( this[0], type ); - } - return this.each(function() { - var queue = jQuery.queue( this, type, data ); - - if ( type === "fx" && queue[0] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - }); - }, - dequeue: function( type ) { - return this.each(function() { - jQuery.dequeue( this, type ); - }); - }, - // Based off of the plugin by Clint Helfers, with permission. - // http://blindsignals.com/index.php/2009/07/jquery-delay/ - delay: function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = setTimeout( next, time ); - hooks.stop = function() { - clearTimeout( timeout ); - }; - }); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, object ) { - if ( typeof type !== "string" ) { - object = type; - type = undefined; - } - type = type || "fx"; - var defer = jQuery.Deferred(), - elements = this, - i = elements.length, - count = 1, - deferDataKey = type + "defer", - queueDataKey = type + "queue", - markDataKey = type + "mark", - tmp; - function resolve() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - } - while( i-- ) { - if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || - ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || - jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && - jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { - count++; - tmp.add( resolve ); - } - } - resolve(); - return defer.promise(); - } -}); - - - - -var rclass = /[\n\t\r]/g, - rspace = /\s+/, - rreturn = /\r/g, - rtype = /^(?:button|input)$/i, - rfocusable = /^(?:button|input|object|select|textarea)$/i, - rclickable = /^a(?:rea)?$/i, - rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, - getSetAttribute = jQuery.support.getSetAttribute, - nodeHook, boolHook, fixSpecified; - -jQuery.fn.extend({ - attr: function( name, value ) { - return jQuery.access( this, name, value, true, jQuery.attr ); - }, - - removeAttr: function( name ) { - return this.each(function() { - jQuery.removeAttr( this, name ); - }); - }, - - prop: function( name, value ) { - return jQuery.access( this, name, value, true, jQuery.prop ); - }, - - removeProp: function( name ) { - name = jQuery.propFix[ name ] || name; - return this.each(function() { - // try/catch handles cases where IE balks (such as removing a property on window) - try { - this[ name ] = undefined; - delete this[ name ]; - } catch( e ) {} - }); - }, - - addClass: function( value ) { - var classNames, i, l, elem, - setClass, c, cl; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).addClass( value.call(this, j, this.className) ); - }); - } - - if ( value && typeof value === "string" ) { - classNames = value.split( rspace ); - - for ( i = 0, l = this.length; i < l; i++ ) { - elem = this[ i ]; - - if ( elem.nodeType === 1 ) { - if ( !elem.className && classNames.length === 1 ) { - elem.className = value; - - } else { - setClass = " " + elem.className + " "; - - for ( c = 0, cl = classNames.length; c < cl; c++ ) { - if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { - setClass += classNames[ c ] + " "; - } - } - elem.className = jQuery.trim( setClass ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classNames, i, l, elem, className, c, cl; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).removeClass( value.call(this, j, this.className) ); - }); - } - - if ( (value && typeof value === "string") || value === undefined ) { - classNames = ( value || "" ).split( rspace ); - - for ( i = 0, l = this.length; i < l; i++ ) { - elem = this[ i ]; - - if ( elem.nodeType === 1 && elem.className ) { - if ( value ) { - className = (" " + elem.className + " ").replace( rclass, " " ); - for ( c = 0, cl = classNames.length; c < cl; c++ ) { - className = className.replace(" " + classNames[ c ] + " ", " "); - } - elem.className = jQuery.trim( className ); - - } else { - elem.className = ""; - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isBool = typeof stateVal === "boolean"; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( i ) { - jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); - }); - } - - return this.each(function() { - if ( type === "string" ) { - // toggle individual class names - var className, - i = 0, - self = jQuery( this ), - state = stateVal, - classNames = value.split( rspace ); - - while ( (className = classNames[ i++ ]) ) { - // check each className given, space seperated list - state = isBool ? state : !self.hasClass( className ); - self[ state ? "addClass" : "removeClass" ]( className ); - } - - } else if ( type === "undefined" || type === "boolean" ) { - if ( this.className ) { - // store className if set - jQuery._data( this, "__className__", this.className ); - } - - // toggle whole className - this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; - } - }); - }, - - hasClass: function( selector ) { - var className = " " + selector + " ", - i = 0, - l = this.length; - for ( ; i < l; i++ ) { - if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { - return true; - } - } - - return false; - }, - - val: function( value ) { - var hooks, ret, isFunction, - elem = this[0]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; - - if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { - return ret; - } - - ret = elem.value; - - return typeof ret === "string" ? - // handle most common string cases - ret.replace(rreturn, "") : - // handle cases where value is null/undef or number - ret == null ? "" : ret; - } - - return; - } - - isFunction = jQuery.isFunction( value ); - - return this.each(function( i ) { - var self = jQuery(this), val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call( this, i, self.val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - } else if ( typeof val === "number" ) { - val += ""; - } else if ( jQuery.isArray( val ) ) { - val = jQuery.map(val, function ( value ) { - return value == null ? "" : value + ""; - }); - } - - hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - }); - } -}); - -jQuery.extend({ - valHooks: { - option: { - get: function( elem ) { - // attributes.value is undefined in Blackberry 4.7 but - // uses .value. See #6932 - var val = elem.attributes.value; - return !val || val.specified ? elem.value : elem.text; - } - }, - select: { - get: function( elem ) { - var value, i, max, option, - index = elem.selectedIndex, - values = [], - options = elem.options, - one = elem.type === "select-one"; - - // Nothing was selected - if ( index < 0 ) { - return null; - } - - // Loop through all the selected options - i = one ? index : 0; - max = one ? index + 1 : options.length; - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Don't return options that are disabled or in a disabled optgroup - if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && - (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - // Fixes Bug #2551 -- select.val() broken in IE after form.reset() - if ( one && !values.length && options.length ) { - return jQuery( options[ index ] ).val(); - } - - return values; - }, - - set: function( elem, value ) { - var values = jQuery.makeArray( value ); - - jQuery(elem).find("option").each(function() { - this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; - }); - - if ( !values.length ) { - elem.selectedIndex = -1; - } - return values; - } - } - }, - - attrFn: { - val: true, - css: true, - html: true, - text: true, - data: true, - width: true, - height: true, - offset: true - }, - - attr: function( elem, name, value, pass ) { - var ret, hooks, notxml, - nType = elem.nodeType; - - // don't get/set attributes on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( pass && name in jQuery.attrFn ) { - return jQuery( elem )[ name ]( value ); - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - // All attributes are lowercase - // Grab necessary hook if one is defined - if ( notxml ) { - name = name.toLowerCase(); - hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); - } - - if ( value !== undefined ) { - - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - - } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - elem.setAttribute( name, "" + value ); - return value; - } - - } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { - return ret; - - } else { - - ret = elem.getAttribute( name ); - - // Non-existent attributes return null, we normalize to undefined - return ret === null ? - undefined : - ret; - } - }, - - removeAttr: function( elem, value ) { - var propName, attrNames, name, l, - i = 0; - - if ( value && elem.nodeType === 1 ) { - attrNames = value.toLowerCase().split( rspace ); - l = attrNames.length; - - for ( ; i < l; i++ ) { - name = attrNames[ i ]; - - if ( name ) { - propName = jQuery.propFix[ name ] || name; - - // See #9699 for explanation of this approach (setting first, then removal) - jQuery.attr( elem, name, "" ); - elem.removeAttribute( getSetAttribute ? name : propName ); - - // Set corresponding property to false for boolean attributes - if ( rboolean.test( name ) && propName in elem ) { - elem[ propName ] = false; - } - } - } - } - }, - - attrHooks: { - type: { - set: function( elem, value ) { - // We can't allow the type property to be changed (since it causes problems in IE) - if ( rtype.test( elem.nodeName ) && elem.parentNode ) { - jQuery.error( "type property can't be changed" ); - } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { - // Setting the type on a radio button after the value resets the value in IE6-9 - // Reset value to it's default in case type is set after value - // This is for element creation - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - }, - // Use the value property for back compat - // Use the nodeHook for button elements in IE6/7 (#1954) - value: { - get: function( elem, name ) { - if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { - return nodeHook.get( elem, name ); - } - return name in elem ? - elem.value : - null; - }, - set: function( elem, value, name ) { - if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { - return nodeHook.set( elem, value, name ); - } - // Does not return so that setAttribute is also used - elem.value = value; - } - } - }, - - propFix: { - tabindex: "tabIndex", - readonly: "readOnly", - "for": "htmlFor", - "class": "className", - maxlength: "maxLength", - cellspacing: "cellSpacing", - cellpadding: "cellPadding", - rowspan: "rowSpan", - colspan: "colSpan", - usemap: "useMap", - frameborder: "frameBorder", - contenteditable: "contentEditable" - }, - - prop: function( elem, name, value ) { - var ret, hooks, notxml, - nType = elem.nodeType; - - // don't get/set properties on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - if ( notxml ) { - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - return ( elem[ name ] = value ); - } - - } else { - if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { - return ret; - - } else { - return elem[ name ]; - } - } - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set - // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - var attributeNode = elem.getAttributeNode("tabindex"); - - return attributeNode && attributeNode.specified ? - parseInt( attributeNode.value, 10 ) : - rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? - 0 : - undefined; - } - } - } -}); - -// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) -jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; - -// Hook for boolean attributes -boolHook = { - get: function( elem, name ) { - // Align boolean attributes with corresponding properties - // Fall back to attribute presence where some booleans are not supported - var attrNode, - property = jQuery.prop( elem, name ); - return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? - name.toLowerCase() : - undefined; - }, - set: function( elem, value, name ) { - var propName; - if ( value === false ) { - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - // value is true since we know at this point it's type boolean and not false - // Set boolean attributes to the same name and set the DOM property - propName = jQuery.propFix[ name ] || name; - if ( propName in elem ) { - // Only set the IDL specifically if it already exists on the element - elem[ propName ] = true; - } - - elem.setAttribute( name, name.toLowerCase() ); - } - return name; - } -}; - -// IE6/7 do not support getting/setting some attributes with get/setAttribute -if ( !getSetAttribute ) { - - fixSpecified = { - name: true, - id: true - }; - - // Use this for any attribute in IE6/7 - // This fixes almost every IE6/7 issue - nodeHook = jQuery.valHooks.button = { - get: function( elem, name ) { - var ret; - ret = elem.getAttributeNode( name ); - return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? - ret.nodeValue : - undefined; - }, - set: function( elem, value, name ) { - // Set the existing or create a new attribute node - var ret = elem.getAttributeNode( name ); - if ( !ret ) { - ret = document.createAttribute( name ); - elem.setAttributeNode( ret ); - } - return ( ret.nodeValue = value + "" ); - } - }; - - // Apply the nodeHook to tabindex - jQuery.attrHooks.tabindex.set = nodeHook.set; - - // Set width and height to auto instead of 0 on empty string( Bug #8150 ) - // This is for removals - jQuery.each([ "width", "height" ], function( i, name ) { - jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { - set: function( elem, value ) { - if ( value === "" ) { - elem.setAttribute( name, "auto" ); - return value; - } - } - }); - }); - - // Set contenteditable to false on removals(#10429) - // Setting to empty string throws an error as an invalid value - jQuery.attrHooks.contenteditable = { - get: nodeHook.get, - set: function( elem, value, name ) { - if ( value === "" ) { - value = "false"; - } - nodeHook.set( elem, value, name ); - } - }; -} - - -// Some attributes require a special call on IE -if ( !jQuery.support.hrefNormalized ) { - jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { - jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { - get: function( elem ) { - var ret = elem.getAttribute( name, 2 ); - return ret === null ? undefined : ret; - } - }); - }); -} - -if ( !jQuery.support.style ) { - jQuery.attrHooks.style = { - get: function( elem ) { - // Return undefined in the case of empty string - // Normalize to lowercase since IE uppercases css property names - return elem.style.cssText.toLowerCase() || undefined; - }, - set: function( elem, value ) { - return ( elem.style.cssText = "" + value ); - } - }; -} - -// Safari mis-reports the default selected property of an option -// Accessing the parent's selectedIndex property fixes it -if ( !jQuery.support.optSelected ) { - jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { - get: function( elem ) { - var parent = elem.parentNode; - - if ( parent ) { - parent.selectedIndex; - - // Make sure that it also works with optgroups, see #5701 - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - return null; - } - }); -} - -// IE6/7 call enctype encoding -if ( !jQuery.support.enctype ) { - jQuery.propFix.enctype = "encoding"; -} - -// Radios and checkboxes getter/setter -if ( !jQuery.support.checkOn ) { - jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - get: function( elem ) { - // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified - return elem.getAttribute("value") === null ? "on" : elem.value; - } - }; - }); -} -jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { - set: function( elem, value ) { - if ( jQuery.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); - } - } - }); -}); - - - - -var rformElems = /^(?:textarea|input|select)$/i, - rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, - rhoverHack = /\bhover(\.\S+)?\b/, - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|contextmenu)|click/, - rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, - quickParse = function( selector ) { - var quick = rquickIs.exec( selector ); - if ( quick ) { - // 0 1 2 3 - // [ _, tag, id, class ] - quick[1] = ( quick[1] || "" ).toLowerCase(); - quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); - } - return quick; - }, - quickIs = function( elem, m ) { - var attrs = elem.attributes || {}; - return ( - (!m[1] || elem.nodeName.toLowerCase() === m[1]) && - (!m[2] || (attrs.id || {}).value === m[2]) && - (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) - ); - }, - hoverHack = function( events ) { - return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); - }; - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - add: function( elem, types, handler, data, selector ) { - - var elemData, eventHandle, events, - t, tns, type, namespaces, handleObj, - handleObjIn, quick, handlers, special; - - // Don't attach events to noData or text/comment nodes (allow plain objects tho) - if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - events = elemData.events; - if ( !events ) { - elemData.events = events = {}; - } - eventHandle = elemData.handle; - if ( !eventHandle ) { - elemData.handle = eventHandle = function( e ) { - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? - jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : - undefined; - }; - // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events - eventHandle.elem = elem; - } - - // Handle multiple events separated by a space - // jQuery(...).bind("mouseover mouseout", fn); - types = jQuery.trim( hoverHack(types) ).split( " " ); - for ( t = 0; t < types.length; t++ ) { - - tns = rtypenamespace.exec( types[t] ) || []; - type = tns[1]; - namespaces = ( tns[2] || "" ).split( "." ).sort(); - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend({ - type: type, - origType: tns[1], - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - quick: quickParse( selector ), - namespace: namespaces.join(".") - }, handleObjIn ); - - // Init the event handler queue if we're the first - handlers = events[ type ]; - if ( !handlers ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener/attachEvent if the special events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - // Bind the global event handler to the element - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); - - } else if ( elem.attachEvent ) { - elem.attachEvent( "on" + type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - // Nullify elem to prevent memory leaks in IE - elem = null; - }, - - global: {}, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), - t, tns, type, origType, namespaces, origCount, - j, events, special, handle, eventType, handleObj; - - if ( !elemData || !(events = elemData.events) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = jQuery.trim( hoverHack( types || "" ) ).split(" "); - for ( t = 0; t < types.length; t++ ) { - tns = rtypenamespace.exec( types[t] ) || []; - type = origType = tns[1]; - namespaces = tns[2]; - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector? special.delegateType : special.bindType ) || type; - eventType = events[ type ] || []; - origCount = eventType.length; - namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; - - // Remove matching events - for ( j = 0; j < eventType.length; j++ ) { - handleObj = eventType[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !namespaces || namespaces.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { - eventType.splice( j--, 1 ); - - if ( handleObj.selector ) { - eventType.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( eventType.length === 0 && origCount !== eventType.length ) { - if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - handle = elemData.handle; - if ( handle ) { - handle.elem = null; - } - - // removeData also checks for emptiness and clears the expando if empty - // so use it instead of delete - jQuery.removeData( elem, [ "events", "handle" ], true ); - } - }, - - // Events that are safe to short-circuit if no handlers are attached. - // Native DOM events should not be added, they may have inline handlers. - customEvent: { - "getData": true, - "setData": true, - "changeData": true - }, - - trigger: function( event, data, elem, onlyHandlers ) { - // Don't do events on text and comment nodes - if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { - return; - } - - // Event object or event type - var type = event.type || event, - namespaces = [], - cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "!" ) >= 0 ) { - // Exclusive events trigger only for the exact event (no namespaces) - type = type.slice(0, -1); - exclusive = true; - } - - if ( type.indexOf( "." ) >= 0 ) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - - if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { - // No jQuery handlers for this event type, and it can't have inline handlers - return; - } - - // Caller can pass in an Event, Object, or just an event type string - event = typeof event === "object" ? - // jQuery.Event object - event[ jQuery.expando ] ? event : - // Object literal - new jQuery.Event( type, event ) : - // Just the event type (string) - new jQuery.Event( type ); - - event.type = type; - event.isTrigger = true; - event.exclusive = exclusive; - event.namespace = namespaces.join( "." ); - event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; - ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; - - // Handle a global trigger - if ( !elem ) { - - // TODO: Stop taunting the data cache; remove global events and always attach to document - cache = jQuery.cache; - for ( i in cache ) { - if ( cache[ i ].events && cache[ i ].events[ type ] ) { - jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); - } - } - return; - } - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data != null ? jQuery.makeArray( data ) : []; - data.unshift( event ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - eventPath = [[ elem, special.bindType || type ]]; - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; - old = null; - for ( ; cur; cur = cur.parentNode ) { - eventPath.push([ cur, bubbleType ]); - old = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( old && old === elem.ownerDocument ) { - eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); - } - } - - // Fire handlers on the event path - for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { - - cur = eventPath[i][0]; - event.type = eventPath[i][1]; - - handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - // Note that this is a bare JS function and not a jQuery handler - handle = ontype && cur[ ontype ]; - if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { - event.preventDefault(); - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && - !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Can't use an .isFunction() check here because IE6/7 fails that test. - // Don't do default actions on window, that's where global variables be (#6170) - // IE<9 dies on focus/blur to hidden element (#1486) - if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - old = elem[ ontype ]; - - if ( old ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - elem[ type ](); - jQuery.event.triggered = undefined; - - if ( old ) { - elem[ ontype ] = old; - } - } - } - } - - return event.result; - }, - - dispatch: function( event ) { - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( event || window.event ); - - var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), - delegateCount = handlers.delegateCount, - args = [].slice.call( arguments, 0 ), - run_all = !event.exclusive && !event.namespace, - handlerQueue = [], - i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[0] = event; - event.delegateTarget = this; - - // Determine handlers that should run if there are delegated events - // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861) - if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) { - - // Pregenerate a single jQuery object for reuse with .is() - jqcur = jQuery(this); - jqcur.context = this.ownerDocument || this; - - for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { - selMatch = {}; - matches = []; - jqcur[0] = cur; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - sel = handleObj.selector; - - if ( selMatch[ sel ] === undefined ) { - selMatch[ sel ] = ( - handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) - ); - } - if ( selMatch[ sel ] ) { - matches.push( handleObj ); - } - } - if ( matches.length ) { - handlerQueue.push({ elem: cur, matches: matches }); - } - } - } - - // Add the remaining (directly-bound) handlers - if ( handlers.length > delegateCount ) { - handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); - } - - // Run delegates first; they may want to stop propagation beneath us - for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { - matched = handlerQueue[ i ]; - event.currentTarget = matched.elem; - - for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { - handleObj = matched.matches[ j ]; - - // Triggered event must either 1) be non-exclusive and have no namespace, or - // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). - if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { - - event.data = handleObj.data; - event.handleObj = handleObj; - - ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) - .apply( matched.elem, args ); - - if ( ret !== undefined ) { - event.result = ret; - if ( ret === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - return event.result; - }, - - // Includes some event props shared by KeyEvent and MouseEvent - // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** - props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), - - fixHooks: {}, - - keyHooks: { - props: "char charCode key keyCode".split(" "), - filter: function( event, original ) { - - // Add which for key events - if ( event.which == null ) { - event.which = original.charCode != null ? original.charCode : original.keyCode; - } - - return event; - } - }, - - mouseHooks: { - props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), - filter: function( event, original ) { - var eventDoc, doc, body, - button = original.button, - fromElement = original.fromElement; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && original.clientX != null ) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); - } - - // Add relatedTarget, if necessary - if ( !event.relatedTarget && fromElement ) { - event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && button !== undefined ) { - event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); - } - - return event; - } - }, - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, - originalEvent = event, - fixHook = jQuery.event.fixHooks[ event.type ] || {}, - copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; - - event = jQuery.Event( originalEvent ); - - for ( i = copy.length; i; ) { - prop = copy[ --i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) - if ( !event.target ) { - event.target = originalEvent.srcElement || document; - } - - // Target should not be a text node (#504, Safari) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) - if ( event.metaKey === undefined ) { - event.metaKey = event.ctrlKey; - } - - return fixHook.filter? fixHook.filter( event, originalEvent ) : event; - }, - - special: { - ready: { - // Make sure the ready event is setup - setup: jQuery.bindReady - }, - - load: { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - - focus: { - delegateType: "focusin" - }, - blur: { - delegateType: "focusout" - }, - - beforeunload: { - setup: function( data, namespaces, eventHandle ) { - // We only want to do this special case on windows - if ( jQuery.isWindow( this ) ) { - this.onbeforeunload = eventHandle; - } - }, - - teardown: function( namespaces, eventHandle ) { - if ( this.onbeforeunload === eventHandle ) { - this.onbeforeunload = null; - } - } - } - }, - - simulate: function( type, elem, event, bubble ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - var e = jQuery.extend( - new jQuery.Event(), - event, - { type: type, - isSimulated: true, - originalEvent: {} - } - ); - if ( bubble ) { - jQuery.event.trigger( e, null, elem ); - } else { - jQuery.event.dispatch.call( elem, e ); - } - if ( e.isDefaultPrevented() ) { - event.preventDefault(); - } - } -}; - -// Some plugins are using, but it's undocumented/deprecated and will be removed. -// The 1.7 special event interface should provide all the hooks needed now. -jQuery.event.handle = jQuery.event.dispatch; - -jQuery.removeEvent = document.removeEventListener ? - function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } - } : - function( elem, type, handle ) { - if ( elem.detachEvent ) { - elem.detachEvent( "on" + type, handle ); - } - }; - -jQuery.Event = function( src, props ) { - // Allow instantiation without the 'new' keyword - if ( !(this instanceof jQuery.Event) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || - src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -function returnFalse() { - return false; -} -function returnTrue() { - return true; -} - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - preventDefault: function() { - this.isDefaultPrevented = returnTrue; - - var e = this.originalEvent; - if ( !e ) { - return; - } - - // if preventDefault exists run it on the original event - if ( e.preventDefault ) { - e.preventDefault(); - - // otherwise set the returnValue property of the original event to false (IE) - } else { - e.returnValue = false; - } - }, - stopPropagation: function() { - this.isPropagationStopped = returnTrue; - - var e = this.originalEvent; - if ( !e ) { - return; - } - // if stopPropagation exists run it on the original event - if ( e.stopPropagation ) { - e.stopPropagation(); - } - // otherwise set the cancelBubble property of the original event to true (IE) - e.cancelBubble = true; - }, - stopImmediatePropagation: function() { - this.isImmediatePropagationStopped = returnTrue; - this.stopPropagation(); - }, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse -}; - -// Create mouseenter/leave events using mouseover/out and event-time checks -jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var target = this, - related = event.relatedTarget, - handleObj = event.handleObj, - selector = handleObj.selector, - ret; - - // For mousenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || (related !== target && !jQuery.contains( target, related )) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -}); - -// IE submit delegation -if ( !jQuery.support.submitBubbles ) { - - jQuery.event.special.submit = { - setup: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } - - // Lazy-add a submit handler when a descendant form may potentially be submitted - jQuery.event.add( this, "click._submit keypress._submit", function( e ) { - // Node name check avoids a VML-related crash in IE (#9807) - var elem = e.target, - form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; - if ( form && !form._submit_attached ) { - jQuery.event.add( form, "submit._submit", function( event ) { - // If form was submitted by the user, bubble the event up the tree - if ( this.parentNode && !event.isTrigger ) { - jQuery.event.simulate( "submit", this.parentNode, event, true ); - } - }); - form._submit_attached = true; - } - }); - // return undefined since we don't need an event listener - }, - - teardown: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } - - // Remove delegated handlers; cleanData eventually reaps submit handlers attached above - jQuery.event.remove( this, "._submit" ); - } - }; -} - -// IE change delegation and checkbox/radio fix -if ( !jQuery.support.changeBubbles ) { - - jQuery.event.special.change = { - - setup: function() { - - if ( rformElems.test( this.nodeName ) ) { - // IE doesn't fire change on a check/radio until blur; trigger it on click - // after a propertychange. Eat the blur-change in special.change.handle. - // This still fires onchange a second time for check/radio after blur. - if ( this.type === "checkbox" || this.type === "radio" ) { - jQuery.event.add( this, "propertychange._change", function( event ) { - if ( event.originalEvent.propertyName === "checked" ) { - this._just_changed = true; - } - }); - jQuery.event.add( this, "click._change", function( event ) { - if ( this._just_changed && !event.isTrigger ) { - this._just_changed = false; - jQuery.event.simulate( "change", this, event, true ); - } - }); - } - return false; - } - // Delegated event; lazy-add a change handler on descendant inputs - jQuery.event.add( this, "beforeactivate._change", function( e ) { - var elem = e.target; - - if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { - jQuery.event.add( elem, "change._change", function( event ) { - if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { - jQuery.event.simulate( "change", this.parentNode, event, true ); - } - }); - elem._change_attached = true; - } - }); - }, - - handle: function( event ) { - var elem = event.target; - - // Swallow native change events from checkbox/radio, we already triggered them above - if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { - return event.handleObj.handler.apply( this, arguments ); - } - }, - - teardown: function() { - jQuery.event.remove( this, "._change" ); - - return rformElems.test( this.nodeName ); - } - }; -} - -// Create "bubbling" focus and blur events -if ( !jQuery.support.focusinBubbles ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler while someone wants focusin/focusout - var attaches = 0, - handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - if ( attaches++ === 0 ) { - document.addEventListener( orig, handler, true ); - } - }, - teardown: function() { - if ( --attaches === 0 ) { - document.removeEventListener( orig, handler, true ); - } - } - }; - }); -} - -jQuery.fn.extend({ - - on: function( types, selector, data, fn, /*INTERNAL*/ one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - // ( types-Object, data ) - data = selector; - selector = undefined; - } - for ( type in types ) { - this.on( type, selector, data, types[ type ], one ); - } - return this; - } - - if ( data == null && fn == null ) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return this; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return this.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - }); - }, - one: function( types, selector, data, fn ) { - return this.on.call( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - if ( types && types.preventDefault && types.handleObj ) { - // ( event ) dispatched jQuery.Event - var handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - // ( types-object [, selector] ) - for ( var type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each(function() { - jQuery.event.remove( this, types, fn, selector ); - }); - }, - - bind: function( types, data, fn ) { - return this.on( types, null, data, fn ); - }, - unbind: function( types, fn ) { - return this.off( types, null, fn ); - }, - - live: function( types, data, fn ) { - jQuery( this.context ).on( types, this.selector, data, fn ); - return this; - }, - die: function( types, fn ) { - jQuery( this.context ).off( types, this.selector || "**", fn ); - return this; - }, - - delegate: function( selector, types, data, fn ) { - return this.on( types, selector, data, fn ); - }, - undelegate: function( selector, types, fn ) { - // ( namespace ) or ( selector, types [, fn] ) - return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - triggerHandler: function( type, data ) { - if ( this[0] ) { - return jQuery.event.trigger( type, data, this[0], true ); - } - }, - - toggle: function( fn ) { - // Save reference to arguments for access in closure - var args = arguments, - guid = fn.guid || jQuery.guid++, - i = 0, - toggler = function( event ) { - // Figure out which function to execute - var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; - jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); - - // Make sure that clicks stop - event.preventDefault(); - - // and execute the function - return args[ lastToggle ].apply( this, arguments ) || false; - }; - - // link all the functions, so any of them can unbind this click handler - toggler.guid = guid; - while ( i < args.length ) { - args[ i++ ].guid = guid; - } - - return this.click( toggler ); - }, - - hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); - } -}); - -jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + - "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + - "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { - - // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - if ( fn == null ) { - fn = data; - data = null; - } - - return arguments.length > 0 ? - this.on( name, null, data, fn ) : - this.trigger( name ); - }; - - if ( jQuery.attrFn ) { - jQuery.attrFn[ name ] = true; - } - - if ( rkeyEvent.test( name ) ) { - jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; - } - - if ( rmouseEvent.test( name ) ) { - jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; - } -}); - - - -/*! - * Sizzle CSS Selector Engine - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * More information: http://sizzlejs.com/ - */ -(function(){ - -var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, - expando = "sizcache" + (Math.random() + '').replace('.', ''), - done = 0, - toString = Object.prototype.toString, - hasDuplicate = false, - baseHasDuplicate = true, - rBackslash = /\\/g, - rReturn = /\r\n/g, - rNonWord = /\W/; - -// Here we check if the JavaScript engine is using some sort of -// optimization where it does not always call our comparision -// function. If that is the case, discard the hasDuplicate value. -// Thus far that includes Google Chrome. -[0, 0].sort(function() { - baseHasDuplicate = false; - return 0; -}); - -var Sizzle = function( selector, context, results, seed ) { - results = results || []; - context = context || document; - - var origContext = context; - - if ( context.nodeType !== 1 && context.nodeType !== 9 ) { - return []; - } - - if ( !selector || typeof selector !== "string" ) { - return results; - } - - var m, set, checkSet, extra, ret, cur, pop, i, - prune = true, - contextXML = Sizzle.isXML( context ), - parts = [], - soFar = selector; - - // Reset the position of the chunker regexp (start from head) - do { - chunker.exec( "" ); - m = chunker.exec( soFar ); - - if ( m ) { - soFar = m[3]; - - parts.push( m[1] ); - - if ( m[2] ) { - extra = m[3]; - break; - } - } - } while ( m ); - - if ( parts.length > 1 && origPOS.exec( selector ) ) { - - if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { - set = posProcess( parts[0] + parts[1], context, seed ); - - } else { - set = Expr.relative[ parts[0] ] ? - [ context ] : - Sizzle( parts.shift(), context ); - - while ( parts.length ) { - selector = parts.shift(); - - if ( Expr.relative[ selector ] ) { - selector += parts.shift(); - } - - set = posProcess( selector, set, seed ); - } - } - - } else { - // Take a shortcut and set the context if the root selector is an ID - // (but not if it'll be faster if the inner selector is an ID) - if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && - Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { - - ret = Sizzle.find( parts.shift(), context, contextXML ); - context = ret.expr ? - Sizzle.filter( ret.expr, ret.set )[0] : - ret.set[0]; - } - - if ( context ) { - ret = seed ? - { expr: parts.pop(), set: makeArray(seed) } : - Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); - - set = ret.expr ? - Sizzle.filter( ret.expr, ret.set ) : - ret.set; - - if ( parts.length > 0 ) { - checkSet = makeArray( set ); - - } else { - prune = false; - } - - while ( parts.length ) { - cur = parts.pop(); - pop = cur; - - if ( !Expr.relative[ cur ] ) { - cur = ""; - } else { - pop = parts.pop(); - } - - if ( pop == null ) { - pop = context; - } - - Expr.relative[ cur ]( checkSet, pop, contextXML ); - } - - } else { - checkSet = parts = []; - } - } - - if ( !checkSet ) { - checkSet = set; - } - - if ( !checkSet ) { - Sizzle.error( cur || selector ); - } - - if ( toString.call(checkSet) === "[object Array]" ) { - if ( !prune ) { - results.push.apply( results, checkSet ); - - } else if ( context && context.nodeType === 1 ) { - for ( i = 0; checkSet[i] != null; i++ ) { - if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { - results.push( set[i] ); - } - } - - } else { - for ( i = 0; checkSet[i] != null; i++ ) { - if ( checkSet[i] && checkSet[i].nodeType === 1 ) { - results.push( set[i] ); - } - } - } - - } else { - makeArray( checkSet, results ); - } - - if ( extra ) { - Sizzle( extra, origContext, results, seed ); - Sizzle.uniqueSort( results ); - } - - return results; -}; - -Sizzle.uniqueSort = function( results ) { - if ( sortOrder ) { - hasDuplicate = baseHasDuplicate; - results.sort( sortOrder ); - - if ( hasDuplicate ) { - for ( var i = 1; i < results.length; i++ ) { - if ( results[i] === results[ i - 1 ] ) { - results.splice( i--, 1 ); - } - } - } - } - - return results; -}; - -Sizzle.matches = function( expr, set ) { - return Sizzle( expr, null, null, set ); -}; - -Sizzle.matchesSelector = function( node, expr ) { - return Sizzle( expr, null, null, [node] ).length > 0; -}; - -Sizzle.find = function( expr, context, isXML ) { - var set, i, len, match, type, left; - - if ( !expr ) { - return []; - } - - for ( i = 0, len = Expr.order.length; i < len; i++ ) { - type = Expr.order[i]; - - if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { - left = match[1]; - match.splice( 1, 1 ); - - if ( left.substr( left.length - 1 ) !== "\\" ) { - match[1] = (match[1] || "").replace( rBackslash, "" ); - set = Expr.find[ type ]( match, context, isXML ); - - if ( set != null ) { - expr = expr.replace( Expr.match[ type ], "" ); - break; - } - } - } - } - - if ( !set ) { - set = typeof context.getElementsByTagName !== "undefined" ? - context.getElementsByTagName( "*" ) : - []; - } - - return { set: set, expr: expr }; -}; - -Sizzle.filter = function( expr, set, inplace, not ) { - var match, anyFound, - type, found, item, filter, left, - i, pass, - old = expr, - result = [], - curLoop = set, - isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); - - while ( expr && set.length ) { - for ( type in Expr.filter ) { - if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { - filter = Expr.filter[ type ]; - left = match[1]; - - anyFound = false; - - match.splice(1,1); - - if ( left.substr( left.length - 1 ) === "\\" ) { - continue; - } - - if ( curLoop === result ) { - result = []; - } - - if ( Expr.preFilter[ type ] ) { - match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); - - if ( !match ) { - anyFound = found = true; - - } else if ( match === true ) { - continue; - } - } - - if ( match ) { - for ( i = 0; (item = curLoop[i]) != null; i++ ) { - if ( item ) { - found = filter( item, match, i, curLoop ); - pass = not ^ found; - - if ( inplace && found != null ) { - if ( pass ) { - anyFound = true; - - } else { - curLoop[i] = false; - } - - } else if ( pass ) { - result.push( item ); - anyFound = true; - } - } - } - } - - if ( found !== undefined ) { - if ( !inplace ) { - curLoop = result; - } - - expr = expr.replace( Expr.match[ type ], "" ); - - if ( !anyFound ) { - return []; - } - - break; - } - } - } - - // Improper expression - if ( expr === old ) { - if ( anyFound == null ) { - Sizzle.error( expr ); - - } else { - break; - } - } - - old = expr; - } - - return curLoop; -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Utility function for retreiving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -var getText = Sizzle.getText = function( elem ) { - var i, node, - nodeType = elem.nodeType, - ret = ""; - - if ( nodeType ) { - if ( nodeType === 1 || nodeType === 9 ) { - // Use textContent || innerText for elements - if ( typeof elem.textContent === 'string' ) { - return elem.textContent; - } else if ( typeof elem.innerText === 'string' ) { - // Replace IE's carriage returns - return elem.innerText.replace( rReturn, '' ); - } else { - // Traverse it's children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - } else { - - // If no nodeType, this is expected to be an array - for ( i = 0; (node = elem[i]); i++ ) { - // Do not traverse comment nodes - if ( node.nodeType !== 8 ) { - ret += getText( node ); - } - } - } - return ret; -}; - -var Expr = Sizzle.selectors = { - order: [ "ID", "NAME", "TAG" ], - - match: { - ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, - ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, - TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, - CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, - POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, - PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ - }, - - leftMatch: {}, - - attrMap: { - "class": "className", - "for": "htmlFor" - }, - - attrHandle: { - href: function( elem ) { - return elem.getAttribute( "href" ); - }, - type: function( elem ) { - return elem.getAttribute( "type" ); - } - }, - - relative: { - "+": function(checkSet, part){ - var isPartStr = typeof part === "string", - isTag = isPartStr && !rNonWord.test( part ), - isPartStrNotTag = isPartStr && !isTag; - - if ( isTag ) { - part = part.toLowerCase(); - } - - for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { - if ( (elem = checkSet[i]) ) { - while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} - - checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? - elem || false : - elem === part; - } - } - - if ( isPartStrNotTag ) { - Sizzle.filter( part, checkSet, true ); - } - }, - - ">": function( checkSet, part ) { - var elem, - isPartStr = typeof part === "string", - i = 0, - l = checkSet.length; - - if ( isPartStr && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - - for ( ; i < l; i++ ) { - elem = checkSet[i]; - - if ( elem ) { - var parent = elem.parentNode; - checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; - } - } - - } else { - for ( ; i < l; i++ ) { - elem = checkSet[i]; - - if ( elem ) { - checkSet[i] = isPartStr ? - elem.parentNode : - elem.parentNode === part; - } - } - - if ( isPartStr ) { - Sizzle.filter( part, checkSet, true ); - } - } - }, - - "": function(checkSet, part, isXML){ - var nodeCheck, - doneName = done++, - checkFn = dirCheck; - - if ( typeof part === "string" && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } - - checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); - }, - - "~": function( checkSet, part, isXML ) { - var nodeCheck, - doneName = done++, - checkFn = dirCheck; - - if ( typeof part === "string" && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } - - checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); - } - }, - - find: { - ID: function( match, context, isXML ) { - if ( typeof context.getElementById !== "undefined" && !isXML ) { - var m = context.getElementById(match[1]); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [m] : []; - } - }, - - NAME: function( match, context ) { - if ( typeof context.getElementsByName !== "undefined" ) { - var ret = [], - results = context.getElementsByName( match[1] ); - - for ( var i = 0, l = results.length; i < l; i++ ) { - if ( results[i].getAttribute("name") === match[1] ) { - ret.push( results[i] ); - } - } - - return ret.length === 0 ? null : ret; - } - }, - - TAG: function( match, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( match[1] ); - } - } - }, - preFilter: { - CLASS: function( match, curLoop, inplace, result, not, isXML ) { - match = " " + match[1].replace( rBackslash, "" ) + " "; - - if ( isXML ) { - return match; - } - - for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { - if ( elem ) { - if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { - if ( !inplace ) { - result.push( elem ); - } - - } else if ( inplace ) { - curLoop[i] = false; - } - } - } - - return false; - }, - - ID: function( match ) { - return match[1].replace( rBackslash, "" ); - }, - - TAG: function( match, curLoop ) { - return match[1].replace( rBackslash, "" ).toLowerCase(); - }, - - CHILD: function( match ) { - if ( match[1] === "nth" ) { - if ( !match[2] ) { - Sizzle.error( match[0] ); - } - - match[2] = match[2].replace(/^\+|\s*/g, ''); - - // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' - var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( - match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || - !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); - - // calculate the numbers (first)n+(last) including if they are negative - match[2] = (test[1] + (test[2] || 1)) - 0; - match[3] = test[3] - 0; - } - else if ( match[2] ) { - Sizzle.error( match[0] ); - } - - // TODO: Move to normal caching system - match[0] = done++; - - return match; - }, - - ATTR: function( match, curLoop, inplace, result, not, isXML ) { - var name = match[1] = match[1].replace( rBackslash, "" ); - - if ( !isXML && Expr.attrMap[name] ) { - match[1] = Expr.attrMap[name]; - } - - // Handle if an un-quoted value was used - match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); - - if ( match[2] === "~=" ) { - match[4] = " " + match[4] + " "; - } - - return match; - }, - - PSEUDO: function( match, curLoop, inplace, result, not ) { - if ( match[1] === "not" ) { - // If we're dealing with a complex expression, or a simple one - if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { - match[3] = Sizzle(match[3], null, null, curLoop); - - } else { - var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); - - if ( !inplace ) { - result.push.apply( result, ret ); - } - - return false; - } - - } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { - return true; - } - - return match; - }, - - POS: function( match ) { - match.unshift( true ); - - return match; - } - }, - - filters: { - enabled: function( elem ) { - return elem.disabled === false && elem.type !== "hidden"; - }, - - disabled: function( elem ) { - return elem.disabled === true; - }, - - checked: function( elem ) { - return elem.checked === true; - }, - - selected: function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - parent: function( elem ) { - return !!elem.firstChild; - }, - - empty: function( elem ) { - return !elem.firstChild; - }, - - has: function( elem, i, match ) { - return !!Sizzle( match[3], elem ).length; - }, - - header: function( elem ) { - return (/h\d/i).test( elem.nodeName ); - }, - - text: function( elem ) { - var attr = elem.getAttribute( "type" ), type = elem.type; - // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) - // use getAttribute instead to test this case - return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); - }, - - radio: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; - }, - - checkbox: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; - }, - - file: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; - }, - - password: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; - }, - - submit: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && "submit" === elem.type; - }, - - image: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; - }, - - reset: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && "reset" === elem.type; - }, - - button: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && "button" === elem.type || name === "button"; - }, - - input: function( elem ) { - return (/input|select|textarea|button/i).test( elem.nodeName ); - }, - - focus: function( elem ) { - return elem === elem.ownerDocument.activeElement; - } - }, - setFilters: { - first: function( elem, i ) { - return i === 0; - }, - - last: function( elem, i, match, array ) { - return i === array.length - 1; - }, - - even: function( elem, i ) { - return i % 2 === 0; - }, - - odd: function( elem, i ) { - return i % 2 === 1; - }, - - lt: function( elem, i, match ) { - return i < match[3] - 0; - }, - - gt: function( elem, i, match ) { - return i > match[3] - 0; - }, - - nth: function( elem, i, match ) { - return match[3] - 0 === i; - }, - - eq: function( elem, i, match ) { - return match[3] - 0 === i; - } - }, - filter: { - PSEUDO: function( elem, match, i, array ) { - var name = match[1], - filter = Expr.filters[ name ]; - - if ( filter ) { - return filter( elem, i, match, array ); - - } else if ( name === "contains" ) { - return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; - - } else if ( name === "not" ) { - var not = match[3]; - - for ( var j = 0, l = not.length; j < l; j++ ) { - if ( not[j] === elem ) { - return false; - } - } - - return true; - - } else { - Sizzle.error( name ); - } - }, - - CHILD: function( elem, match ) { - var first, last, - doneName, parent, cache, - count, diff, - type = match[1], - node = elem; - - switch ( type ) { - case "only": - case "first": - while ( (node = node.previousSibling) ) { - if ( node.nodeType === 1 ) { - return false; - } - } - - if ( type === "first" ) { - return true; - } - - node = elem; - - case "last": - while ( (node = node.nextSibling) ) { - if ( node.nodeType === 1 ) { - return false; - } - } - - return true; - - case "nth": - first = match[2]; - last = match[3]; - - if ( first === 1 && last === 0 ) { - return true; - } - - doneName = match[0]; - parent = elem.parentNode; - - if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { - count = 0; - - for ( node = parent.firstChild; node; node = node.nextSibling ) { - if ( node.nodeType === 1 ) { - node.nodeIndex = ++count; - } - } - - parent[ expando ] = doneName; - } - - diff = elem.nodeIndex - last; - - if ( first === 0 ) { - return diff === 0; - - } else { - return ( diff % first === 0 && diff / first >= 0 ); - } - } - }, - - ID: function( elem, match ) { - return elem.nodeType === 1 && elem.getAttribute("id") === match; - }, - - TAG: function( elem, match ) { - return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; - }, - - CLASS: function( elem, match ) { - return (" " + (elem.className || elem.getAttribute("class")) + " ") - .indexOf( match ) > -1; - }, - - ATTR: function( elem, match ) { - var name = match[1], - result = Sizzle.attr ? - Sizzle.attr( elem, name ) : - Expr.attrHandle[ name ] ? - Expr.attrHandle[ name ]( elem ) : - elem[ name ] != null ? - elem[ name ] : - elem.getAttribute( name ), - value = result + "", - type = match[2], - check = match[4]; - - return result == null ? - type === "!=" : - !type && Sizzle.attr ? - result != null : - type === "=" ? - value === check : - type === "*=" ? - value.indexOf(check) >= 0 : - type === "~=" ? - (" " + value + " ").indexOf(check) >= 0 : - !check ? - value && result !== false : - type === "!=" ? - value !== check : - type === "^=" ? - value.indexOf(check) === 0 : - type === "$=" ? - value.substr(value.length - check.length) === check : - type === "|=" ? - value === check || value.substr(0, check.length + 1) === check + "-" : - false; - }, - - POS: function( elem, match, i, array ) { - var name = match[2], - filter = Expr.setFilters[ name ]; - - if ( filter ) { - return filter( elem, i, match, array ); - } - } - } -}; - -var origPOS = Expr.match.POS, - fescape = function(all, num){ - return "\\" + (num - 0 + 1); - }; - -for ( var type in Expr.match ) { - Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); - Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); -} - -var makeArray = function( array, results ) { - array = Array.prototype.slice.call( array, 0 ); - - if ( results ) { - results.push.apply( results, array ); - return results; - } - - return array; -}; - -// Perform a simple check to determine if the browser is capable of -// converting a NodeList to an array using builtin methods. -// Also verifies that the returned array holds DOM nodes -// (which is not the case in the Blackberry browser) -try { - Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; - -// Provide a fallback method if it does not work -} catch( e ) { - makeArray = function( array, results ) { - var i = 0, - ret = results || []; - - if ( toString.call(array) === "[object Array]" ) { - Array.prototype.push.apply( ret, array ); - - } else { - if ( typeof array.length === "number" ) { - for ( var l = array.length; i < l; i++ ) { - ret.push( array[i] ); - } - - } else { - for ( ; array[i]; i++ ) { - ret.push( array[i] ); - } - } - } - - return ret; - }; -} - -var sortOrder, siblingCheck; - -if ( document.documentElement.compareDocumentPosition ) { - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { - return a.compareDocumentPosition ? -1 : 1; - } - - return a.compareDocumentPosition(b) & 4 ? -1 : 1; - }; - -} else { - sortOrder = function( a, b ) { - // The nodes are identical, we can exit early - if ( a === b ) { - hasDuplicate = true; - return 0; - - // Fallback to using sourceIndex (in IE) if it's available on both nodes - } else if ( a.sourceIndex && b.sourceIndex ) { - return a.sourceIndex - b.sourceIndex; - } - - var al, bl, - ap = [], - bp = [], - aup = a.parentNode, - bup = b.parentNode, - cur = aup; - - // If the nodes are siblings (or identical) we can do a quick check - if ( aup === bup ) { - return siblingCheck( a, b ); - - // If no parents were found then the nodes are disconnected - } else if ( !aup ) { - return -1; - - } else if ( !bup ) { - return 1; - } - - // Otherwise they're somewhere else in the tree so we need - // to build up a full list of the parentNodes for comparison - while ( cur ) { - ap.unshift( cur ); - cur = cur.parentNode; - } - - cur = bup; - - while ( cur ) { - bp.unshift( cur ); - cur = cur.parentNode; - } - - al = ap.length; - bl = bp.length; - - // Start walking down the tree looking for a discrepancy - for ( var i = 0; i < al && i < bl; i++ ) { - if ( ap[i] !== bp[i] ) { - return siblingCheck( ap[i], bp[i] ); - } - } - - // We ended someplace up the tree so do a sibling check - return i === al ? - siblingCheck( a, bp[i], -1 ) : - siblingCheck( ap[i], b, 1 ); - }; - - siblingCheck = function( a, b, ret ) { - if ( a === b ) { - return ret; - } - - var cur = a.nextSibling; - - while ( cur ) { - if ( cur === b ) { - return -1; - } - - cur = cur.nextSibling; - } - - return 1; - }; -} - -// Check to see if the browser returns elements by name when -// querying by getElementById (and provide a workaround) -(function(){ - // We're going to inject a fake input element with a specified name - var form = document.createElement("div"), - id = "script" + (new Date()).getTime(), - root = document.documentElement; - - form.innerHTML = ""; - - // Inject it into the root element, check its status, and remove it quickly - root.insertBefore( form, root.firstChild ); - - // The workaround has to do additional checks after a getElementById - // Which slows things down for other browsers (hence the branching) - if ( document.getElementById( id ) ) { - Expr.find.ID = function( match, context, isXML ) { - if ( typeof context.getElementById !== "undefined" && !isXML ) { - var m = context.getElementById(match[1]); - - return m ? - m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? - [m] : - undefined : - []; - } - }; - - Expr.filter.ID = function( elem, match ) { - var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); - - return elem.nodeType === 1 && node && node.nodeValue === match; - }; - } - - root.removeChild( form ); - - // release memory in IE - root = form = null; -})(); - -(function(){ - // Check to see if the browser returns only elements - // when doing getElementsByTagName("*") - - // Create a fake element - var div = document.createElement("div"); - div.appendChild( document.createComment("") ); - - // Make sure no comments are found - if ( div.getElementsByTagName("*").length > 0 ) { - Expr.find.TAG = function( match, context ) { - var results = context.getElementsByTagName( match[1] ); - - // Filter out possible comments - if ( match[1] === "*" ) { - var tmp = []; - - for ( var i = 0; results[i]; i++ ) { - if ( results[i].nodeType === 1 ) { - tmp.push( results[i] ); - } - } - - results = tmp; - } - - return results; - }; - } - - // Check to see if an attribute returns normalized href attributes - div.innerHTML = ""; - - if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && - div.firstChild.getAttribute("href") !== "#" ) { - - Expr.attrHandle.href = function( elem ) { - return elem.getAttribute( "href", 2 ); - }; - } - - // release memory in IE - div = null; -})(); - -if ( document.querySelectorAll ) { - (function(){ - var oldSizzle = Sizzle, - div = document.createElement("div"), - id = "__sizzle__"; - - div.innerHTML = "

      "; - - // Safari can't handle uppercase or unicode characters when - // in quirks mode. - if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { - return; - } - - Sizzle = function( query, context, extra, seed ) { - context = context || document; - - // Only use querySelectorAll on non-XML documents - // (ID selectors don't work in non-HTML documents) - if ( !seed && !Sizzle.isXML(context) ) { - // See if we find a selector to speed up - var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); - - if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { - // Speed-up: Sizzle("TAG") - if ( match[1] ) { - return makeArray( context.getElementsByTagName( query ), extra ); - - // Speed-up: Sizzle(".CLASS") - } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { - return makeArray( context.getElementsByClassName( match[2] ), extra ); - } - } - - if ( context.nodeType === 9 ) { - // Speed-up: Sizzle("body") - // The body element only exists once, optimize finding it - if ( query === "body" && context.body ) { - return makeArray( [ context.body ], extra ); - - // Speed-up: Sizzle("#ID") - } else if ( match && match[3] ) { - var elem = context.getElementById( match[3] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id === match[3] ) { - return makeArray( [ elem ], extra ); - } - - } else { - return makeArray( [], extra ); - } - } - - try { - return makeArray( context.querySelectorAll(query), extra ); - } catch(qsaError) {} - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - var oldContext = context, - old = context.getAttribute( "id" ), - nid = old || id, - hasParent = context.parentNode, - relativeHierarchySelector = /^\s*[+~]/.test( query ); - - if ( !old ) { - context.setAttribute( "id", nid ); - } else { - nid = nid.replace( /'/g, "\\$&" ); - } - if ( relativeHierarchySelector && hasParent ) { - context = context.parentNode; - } - - try { - if ( !relativeHierarchySelector || hasParent ) { - return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); - } - - } catch(pseudoError) { - } finally { - if ( !old ) { - oldContext.removeAttribute( "id" ); - } - } - } - } - - return oldSizzle(query, context, extra, seed); - }; - - for ( var prop in oldSizzle ) { - Sizzle[ prop ] = oldSizzle[ prop ]; - } - - // release memory in IE - div = null; - })(); -} - -(function(){ - var html = document.documentElement, - matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; - - if ( matches ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9 fails this) - var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), - pseudoWorks = false; - - try { - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( document.documentElement, "[test!='']:sizzle" ); - - } catch( pseudoError ) { - pseudoWorks = true; - } - - Sizzle.matchesSelector = function( node, expr ) { - // Make sure that attribute selectors are quoted - expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); - - if ( !Sizzle.isXML( node ) ) { - try { - if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { - var ret = matches.call( node, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || !disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9, so check for that - node.document && node.document.nodeType !== 11 ) { - return ret; - } - } - } catch(e) {} - } - - return Sizzle(expr, null, null, [node]).length > 0; - }; - } -})(); - -(function(){ - var div = document.createElement("div"); - - div.innerHTML = "
      "; - - // Opera can't find a second classname (in 9.6) - // Also, make sure that getElementsByClassName actually exists - if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { - return; - } - - // Safari caches class attributes, doesn't catch changes (in 3.2) - div.lastChild.className = "e"; - - if ( div.getElementsByClassName("e").length === 1 ) { - return; - } - - Expr.order.splice(1, 0, "CLASS"); - Expr.find.CLASS = function( match, context, isXML ) { - if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { - return context.getElementsByClassName(match[1]); - } - }; - - // release memory in IE - div = null; -})(); - -function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { - for ( var i = 0, l = checkSet.length; i < l; i++ ) { - var elem = checkSet[i]; - - if ( elem ) { - var match = false; - - elem = elem[dir]; - - while ( elem ) { - if ( elem[ expando ] === doneName ) { - match = checkSet[elem.sizset]; - break; - } - - if ( elem.nodeType === 1 && !isXML ){ - elem[ expando ] = doneName; - elem.sizset = i; - } - - if ( elem.nodeName.toLowerCase() === cur ) { - match = elem; - break; - } - - elem = elem[dir]; - } - - checkSet[i] = match; - } - } -} - -function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { - for ( var i = 0, l = checkSet.length; i < l; i++ ) { - var elem = checkSet[i]; - - if ( elem ) { - var match = false; - - elem = elem[dir]; - - while ( elem ) { - if ( elem[ expando ] === doneName ) { - match = checkSet[elem.sizset]; - break; - } - - if ( elem.nodeType === 1 ) { - if ( !isXML ) { - elem[ expando ] = doneName; - elem.sizset = i; - } - - if ( typeof cur !== "string" ) { - if ( elem === cur ) { - match = true; - break; - } - - } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { - match = elem; - break; - } - } - - elem = elem[dir]; - } - - checkSet[i] = match; - } - } -} - -if ( document.documentElement.contains ) { - Sizzle.contains = function( a, b ) { - return a !== b && (a.contains ? a.contains(b) : true); - }; - -} else if ( document.documentElement.compareDocumentPosition ) { - Sizzle.contains = function( a, b ) { - return !!(a.compareDocumentPosition(b) & 16); - }; - -} else { - Sizzle.contains = function() { - return false; - }; -} - -Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; - - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -var posProcess = function( selector, context, seed ) { - var match, - tmpSet = [], - later = "", - root = context.nodeType ? [context] : context; - - // Position selectors must be done after the filter - // And so must :not(positional) so we move all PSEUDOs to the end - while ( (match = Expr.match.PSEUDO.exec( selector )) ) { - later += match[0]; - selector = selector.replace( Expr.match.PSEUDO, "" ); - } - - selector = Expr.relative[selector] ? selector + "*" : selector; - - for ( var i = 0, l = root.length; i < l; i++ ) { - Sizzle( selector, root[i], tmpSet, seed ); - } - - return Sizzle.filter( later, tmpSet ); -}; - -// EXPOSE -// Override sizzle attribute retrieval -Sizzle.attr = jQuery.attr; -Sizzle.selectors.attrMap = {}; -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.filters; -jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - -})(); - - -var runtil = /Until$/, - rparentsprev = /^(?:parents|prevUntil|prevAll)/, - // Note: This RegExp should be improved, or likely pulled from Sizzle - rmultiselector = /,/, - isSimple = /^.[^:#\[\.,]*$/, - slice = Array.prototype.slice, - POS = jQuery.expr.match.POS, - // methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend({ - find: function( selector ) { - var self = this, - i, l; - - if ( typeof selector !== "string" ) { - return jQuery( selector ).filter(function() { - for ( i = 0, l = self.length; i < l; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - }); - } - - var ret = this.pushStack( "", "find", selector ), - length, n, r; - - for ( i = 0, l = this.length; i < l; i++ ) { - length = ret.length; - jQuery.find( selector, this[i], ret ); - - if ( i > 0 ) { - // Make sure that the results are unique - for ( n = length; n < ret.length; n++ ) { - for ( r = 0; r < length; r++ ) { - if ( ret[r] === ret[n] ) { - ret.splice(n--, 1); - break; - } - } - } - } - } - - return ret; - }, - - has: function( target ) { - var targets = jQuery( target ); - return this.filter(function() { - for ( var i = 0, l = targets.length; i < l; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { - return true; - } - } - }); - }, - - not: function( selector ) { - return this.pushStack( winnow(this, selector, false), "not", selector); - }, - - filter: function( selector ) { - return this.pushStack( winnow(this, selector, true), "filter", selector ); - }, - - is: function( selector ) { - return !!selector && ( - typeof selector === "string" ? - // If this is a positional selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - POS.test( selector ) ? - jQuery( selector, this.context ).index( this[0] ) >= 0 : - jQuery.filter( selector, this ).length > 0 : - this.filter( selector ).length > 0 ); - }, - - closest: function( selectors, context ) { - var ret = [], i, l, cur = this[0]; - - // Array (deprecated as of jQuery 1.7) - if ( jQuery.isArray( selectors ) ) { - var level = 1; - - while ( cur && cur.ownerDocument && cur !== context ) { - for ( i = 0; i < selectors.length; i++ ) { - - if ( jQuery( cur ).is( selectors[ i ] ) ) { - ret.push({ selector: selectors[ i ], elem: cur, level: level }); - } - } - - cur = cur.parentNode; - level++; - } - - return ret; - } - - // String - var pos = POS.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; - - for ( i = 0, l = this.length; i < l; i++ ) { - cur = this[i]; - - while ( cur ) { - if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { - ret.push( cur ); - break; - - } else { - cur = cur.parentNode; - if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { - break; - } - } - } - } - - ret = ret.length > 1 ? jQuery.unique( ret ) : ret; - - return this.pushStack( ret, "closest", selectors ); - }, - - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; - } - - // index in selector - if ( typeof elem === "string" ) { - return jQuery.inArray( this[0], jQuery( elem ) ); - } - - // Locate the position of the desired element - return jQuery.inArray( - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[0] : elem, this ); - }, - - add: function( selector, context ) { - var set = typeof selector === "string" ? - jQuery( selector, context ) : - jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), - all = jQuery.merge( this.get(), set ); - - return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? - all : - jQuery.unique( all ) ); - }, - - andSelf: function() { - return this.add( this.prevObject ); - } -}); - -// A painfully simple check to see if an element is disconnected -// from a document (should be improved, where feasible). -function isDisconnected( node ) { - return !node || !node.parentNode || node.parentNode.nodeType === 11; -} - -jQuery.each({ - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return jQuery.nth( elem, 2, "nextSibling" ); - }, - prev: function( elem ) { - return jQuery.nth( elem, 2, "previousSibling" ); - }, - nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return jQuery.sibling( elem.parentNode.firstChild, elem ); - }, - children: function( elem ) { - return jQuery.sibling( elem.firstChild ); - }, - contents: function( elem ) { - return jQuery.nodeName( elem, "iframe" ) ? - elem.contentDocument || elem.contentWindow.document : - jQuery.makeArray( elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var ret = jQuery.map( this, fn, until ); - - if ( !runtil.test( name ) ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - ret = jQuery.filter( selector, ret ); - } - - ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; - - if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { - ret = ret.reverse(); - } - - return this.pushStack( ret, name, slice.call( arguments ).join(",") ); - }; -}); - -jQuery.extend({ - filter: function( expr, elems, not ) { - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 ? - jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : - jQuery.find.matches(expr, elems); - }, - - dir: function( elem, dir, until ) { - var matched = [], - cur = elem[ dir ]; - - while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { - if ( cur.nodeType === 1 ) { - matched.push( cur ); - } - cur = cur[dir]; - } - return matched; - }, - - nth: function( cur, result, dir, elem ) { - result = result || 1; - var num = 0; - - for ( ; cur; cur = cur[dir] ) { - if ( cur.nodeType === 1 && ++num === result ) { - break; - } - } - - return cur; - }, - - sibling: function( n, elem ) { - var r = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - r.push( n ); - } - } - - return r; - } -}); - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, keep ) { - - // Can't pass null or undefined to indexOf in Firefox 4 - // Set to 0 to skip string check - qualifier = qualifier || 0; - - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep(elements, function( elem, i ) { - var retVal = !!qualifier.call( elem, i, elem ); - return retVal === keep; - }); - - } else if ( qualifier.nodeType ) { - return jQuery.grep(elements, function( elem, i ) { - return ( elem === qualifier ) === keep; - }); - - } else if ( typeof qualifier === "string" ) { - var filtered = jQuery.grep(elements, function( elem ) { - return elem.nodeType === 1; - }); - - if ( isSimple.test( qualifier ) ) { - return jQuery.filter(qualifier, filtered, !keep); - } else { - qualifier = jQuery.filter( qualifier, filtered ); - } - } - - return jQuery.grep(elements, function( elem, i ) { - return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; - }); -} - - - - -function createSafeFragment( document ) { - var list = nodeNames.split( "|" ), - safeFrag = document.createDocumentFragment(); - - if ( safeFrag.createElement ) { - while ( list.length ) { - safeFrag.createElement( - list.pop() - ); - } - } - return safeFrag; -} - -var nodeNames = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|" + - "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", - rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, - rleadingWhitespace = /^\s+/, - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, - rtagName = /<([\w:]+)/, - rtbody = /", "" ], - legend: [ 1, "
      ", "
      " ], - thead: [ 1, "", "
      " ], - tr: [ 2, "", "
      " ], - td: [ 3, "", "
      " ], - col: [ 2, "", "
      " ], - area: [ 1, "", "" ], - _default: [ 0, "", "" ] - }, - safeFragment = createSafeFragment( document ); - -wrapMap.optgroup = wrapMap.option; -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// IE can't serialize and - - - -## Documentation - -### Collections - -* [forEach](#forEach) -* [map](#map) -* [filter](#filter) -* [reject](#reject) -* [reduce](#reduce) -* [detect](#detect) -* [sortBy](#sortBy) -* [some](#some) -* [every](#every) -* [concat](#concat) - -### Flow Control - -* [series](#series) -* [parallel](#parallel) -* [whilst](#whilst) -* [until](#until) -* [waterfall](#waterfall) -* [queue](#queue) -* [auto](#auto) -* [iterator](#iterator) -* [apply](#apply) -* [nextTick](#nextTick) - -### Utils - -* [memoize](#memoize) -* [log](#log) -* [dir](#dir) -* [noConflict](#noConflict) - - -## Collections - - -### forEach(arr, iterator, callback) - -Applies an iterator function to each item in an array, in parallel. -The iterator is called with an item from the list and a callback for when it -has finished. If the iterator passes an error to this callback, the main -callback for the forEach function is immediately called with the error. - -Note, that since this function applies the iterator to each item in parallel -there is no guarantee that the iterator functions will complete in order. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed. -* callback(err) - A callback which is called after all the iterator functions - have finished, or an error has occurred. - -__Example__ - - // assuming openFiles is an array of file names and saveFile is a function - // to save the modified contents of that file: - - async.forEach(openFiles, saveFile, function(err){ - // if any of the saves produced an error, err would equal that error - }); - ---------------------------------------- - - -### forEachSeries(arr, iterator, callback) - -The same as forEach only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. This means the iterator functions will complete in order. - - ---------------------------------------- - - -### map(arr, iterator, callback) - -Produces a new array of values by mapping each value in the given array through -the iterator function. The iterator is called with an item from the array and a -callback for when it has finished processing. The callback takes 2 arguments, -an error and the transformed item from the array. If the iterator passes an -error to this callback, the main callback for the map function is immediately -called with the error. - -Note, that since this function applies the iterator to each item in parallel -there is no guarantee that the iterator functions will complete in order, however -the results array will be in the same order as the original array. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed - with an error (which can be null) and a transformed item. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is an array of the - transformed items from the original array. - -__Example__ - - async.map(['file1','file2','file3'], fs.stat, function(err, results){ - // results is now an array of stats for each file - }); - ---------------------------------------- - - -### mapSeries(arr, iterator, callback) - -The same as map only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. The results array will be in the same order as the original. - - ---------------------------------------- - - -### filter(arr, iterator, callback) - -__Alias:__ select - -Returns a new array of all the values which pass an async truth test. -_The callback for each iterator call only accepts a single argument of true or -false, it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like path.exists. This operation is -performed in parallel, but the results array will be in the same order as the -original. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed. -* callback(results) - A callback which is called after all the iterator - functions have finished. - -__Example__ - - async.filter(['file1','file2','file3'], path.exists, function(results){ - // results now equals an array of the existing files - }); - ---------------------------------------- - - -### filterSeries(arr, iterator, callback) - -__alias:__ selectSeries - -The same as filter only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. The results array will be in the same order as the original. - ---------------------------------------- - - -### reject(arr, iterator, callback) - -The opposite of filter. Removes values that pass an async truth test. - ---------------------------------------- - - -### rejectSeries(arr, iterator, callback) - -The same as filter, only the iterator is applied to each item in the array -in series. - - ---------------------------------------- - - -### reduce(arr, memo, iterator, callback) - -__aliases:__ inject, foldl - -Reduces a list of values into a single value using an async iterator to return -each successive step. Memo is the initial state of the reduction. This -function only operates in series. For performance reasons, it may make sense to -split a call to this function into a parallel map, then use the normal -Array.prototype.reduce on the results. This function is for situations where -each step in the reduction needs to be async, if you can get the data before -reducing it then its probably a good idea to do so. - -__Arguments__ - -* arr - An array to iterate over. -* memo - The initial state of the reduction. -* iterator(memo, item, callback) - A function applied to each item in the - array to produce the next step in the reduction. The iterator is passed a - callback which accepts an optional error as its first argument, and the state - of the reduction as the second. If an error is passed to the callback, the - reduction is stopped and the main callback is immediately called with the - error. -* callback(err, result) - A callback which is called after all the iterator - functions have finished. Result is the reduced value. - -__Example__ - - async.reduce([1,2,3], 0, function(memo, item, callback){ - // pointless async: - process.nextTick(function(){ - callback(null, memo + item) - }); - }, function(err, result){ - // result is now equal to the last value of memo, which is 6 - }); - ---------------------------------------- - - -### reduceRight(arr, memo, iterator, callback) - -__Alias:__ foldr - -Same as reduce, only operates on the items in the array in reverse order. - - ---------------------------------------- - - -### detect(arr, iterator, callback) - -Returns the first value in a list that passes an async truth test. The -iterator is applied in parallel, meaning the first iterator to return true will -fire the detect callback with that result. That means the result might not be -the first item in the original array (in terms of order) that passes the test. - -If order within the original array is important then look at detectSeries. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed. -* callback(result) - A callback which is called as soon as any iterator returns - true, or after all the iterator functions have finished. Result will be - the first item in the array that passes the truth test (iterator) or the - value undefined if none passed. - -__Example__ - - async.detect(['file1','file2','file3'], path.exists, function(result){ - // result now equals the first file in the list that exists - }); - ---------------------------------------- - - -### detectSeries(arr, iterator, callback) - -The same as detect, only the iterator is applied to each item in the array -in series. This means the result is always the first in the original array (in -terms of array order) that passes the truth test. - - ---------------------------------------- - - -### sortBy(arr, iterator, callback) - -Sorts a list by the results of running each value through an async iterator. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed - with an error (which can be null) and a value to use as the sort criteria. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is the items from - the original array sorted by the values returned by the iterator calls. - -__Example__ - - async.sortBy(['file1','file2','file3'], function(file, callback){ - fs.stat(file, function(err, stats){ - callback(err, stats.mtime); - }); - }, function(err, results){ - // results is now the original array of files sorted by - // modified date - }); - - ---------------------------------------- - - -### some(arr, iterator, callback) - -__Alias:__ any - -Returns true if at least one element in the array satisfies an async test. -_The callback for each iterator call only accepts a single argument of true or -false, it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like path.exists. Once any iterator -call returns true, the main callback is immediately called. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed. -* callback(result) - A callback which is called as soon as any iterator returns - true, or after all the iterator functions have finished. Result will be - either true or false depending on the values of the async tests. - -__Example__ - - async.some(['file1','file2','file3'], path.exists, function(result){ - // if result is true then at least one of the files exists - }); - ---------------------------------------- - - -### every(arr, iterator, callback) - -__Alias:__ all - -Returns true if every element in the array satisfies an async test. -_The callback for each iterator call only accepts a single argument of true or -false, it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like path.exists. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed. -* callback(result) - A callback which is called after all the iterator - functions have finished. Result will be either true or false depending on - the values of the async tests. - -__Example__ - - async.every(['file1','file2','file3'], path.exists, function(result){ - // if result is true then every file exists - }); - ---------------------------------------- - - -### concat(arr, iterator, callback) - -Applies an iterator to each item in a list, concatenating the results. Returns the -concatenated list. The iterators are called in parallel, and the results are -concatenated as they return. There is no guarantee that the results array will -be returned in the original order of the arguments passed to the iterator function. - -__Arguments__ - -* arr - An array to iterate over -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed - with an error (which can be null) and an array of results. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is an array containing - the concatenated results of the iterator function. - -__Example__ - - async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){ - // files is now a list of filenames that exist in the 3 directories - }); - ---------------------------------------- - - -### concatSeries(arr, iterator, callback) - -Same as async.concat, but executes in series instead of parallel. - - -## Flow Control - - -### series(tasks, [callback]) - -Run an array of functions in series, each one running once the previous -function has completed. If any functions in the series pass an error to its -callback, no more functions are run and the callback for the series is -immediately called with the value of the error. Once the tasks have completed, -the results are passed to the final callback as an array. - -It is also possible to use an object instead of an array. Each property will be -run as a function and the results will be passed to the final callback as an object -instead of an array. This can be a more readable way of handling results from -async.series. - - -__Arguments__ - -* tasks - An array or object containing functions to run, each function is passed - a callback it must call on completion. -* callback(err, results) - An optional callback to run once all the functions - have completed. This function gets an array of all the arguments passed to - the callbacks used in the array. - -__Example__ - - async.series([ - function(callback){ - // do some stuff ... - callback(null, 'one'); - }, - function(callback){ - // do some more stuff ... - callback(null, 'two'); - }, - ], - // optional callback - function(err, results){ - // results is now equal to ['one', 'two'] - }); - - - // an example using an object instead of an array - async.series({ - one: function(callback){ - setTimeout(function(){ - callback(null, 1); - }, 200); - }, - two: function(callback){ - setTimeout(function(){ - callback(null, 2); - }, 100); - }, - }, - function(err, results) { - // results is now equals to: {one: 1, two: 2} - }); - - ---------------------------------------- - - -### parallel(tasks, [callback]) - -Run an array of functions in parallel, without waiting until the previous -function has completed. If any of the functions pass an error to its -callback, the main callback is immediately called with the value of the error. -Once the tasks have completed, the results are passed to the final callback as an -array. - -It is also possible to use an object instead of an array. Each property will be -run as a function and the results will be passed to the final callback as an object -instead of an array. This can be a more readable way of handling results from -async.parallel. - - -__Arguments__ - -* tasks - An array or object containing functions to run, each function is passed a - callback it must call on completion. -* callback(err, results) - An optional callback to run once all the functions - have completed. This function gets an array of all the arguments passed to - the callbacks used in the array. - -__Example__ - - async.parallel([ - function(callback){ - setTimeout(function(){ - callback(null, 'one'); - }, 200); - }, - function(callback){ - setTimeout(function(){ - callback(null, 'two'); - }, 100); - }, - ], - // optional callback - function(err, results){ - // in this case, the results array will equal ['two','one'] - // because the functions were run in parallel and the second - // function had a shorter timeout before calling the callback. - }); - - - // an example using an object instead of an array - async.parallel({ - one: function(callback){ - setTimeout(function(){ - callback(null, 1); - }, 200); - }, - two: function(callback){ - setTimeout(function(){ - callback(null, 2); - }, 100); - }, - }, - function(err, results) { - // results is now equals to: {one: 1, two: 2} - }); - - ---------------------------------------- - - -### whilst(test, fn, callback) - -Repeatedly call fn, while test returns true. Calls the callback when stopped, -or an error occurs. - -__Arguments__ - -* test() - synchronous truth test to perform before each execution of fn. -* fn(callback) - A function to call each time the test passes. The function is - passed a callback which must be called once it has completed with an optional - error as the first argument. -* callback(err) - A callback which is called after the test fails and repeated - execution of fn has stopped. - -__Example__ - - var count = 0; - - async.whilst( - function () { return count < 5; }, - function (callback) { - count++; - setTimeout(callback, 1000); - }, - function (err) { - // 5 seconds have passed - } - }); - - ---------------------------------------- - - -### until(test, fn, callback) - -Repeatedly call fn, until test returns true. Calls the callback when stopped, -or an error occurs. - -The inverse of async.whilst. - - ---------------------------------------- - - -### waterfall(tasks, [callback]) - -Runs an array of functions in series, each passing their results to the next in -the array. However, if any of the functions pass an error to the callback, the -next function is not executed and the main callback is immediately called with -the error. - -__Arguments__ - -* tasks - An array of functions to run, each function is passed a callback it - must call on completion. -* callback(err) - An optional callback to run once all the functions have - completed. This function gets passed any error that may have occurred. - -__Example__ - - async.waterfall([ - function(callback){ - callback(null, 'one', 'two'); - }, - function(arg1, arg2, callback){ - callback(null, 'three'); - }, - function(arg1, callback){ - // arg1 now equals 'three' - callback(null, 'done'); - } - ]); - - ---------------------------------------- - - -### queue(worker, concurrency) - -Creates a queue object with the specified concurrency. Tasks added to the -queue will be processed in parallel (up to the concurrency limit). If all -workers are in progress, the task is queued until one is available. Once -a worker has completed a task, the task's callback is called. - -__Arguments__ - -* worker(task, callback) - An asynchronous function for processing a queued - task. -* concurrency - An integer for determining how many worker functions should be - run in parallel. - -__Queue objects__ - -The queue object returned by this function has the following properties and -methods: - -* length() - a function returning the number of items waiting to be processed. -* concurrency - an integer for determining how many worker functions should be - run in parallel. This property can be changed after a queue is created to - alter the concurrency on-the-fly. -* push(task, [callback]) - add a new task to the queue, the callback is called - once the worker has finished processing the task. -* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued -* empty - a callback that is called when the last item from the queue is given to a worker -* drain - a callback that is called when the last item from the queue has returned from the worker - -__Example__ - - // create a queue object with concurrency 2 - - var q = async.queue(function (task, callback) { - console.log('hello ' + task.name). - callback(); - }, 2); - - - // assign a callback - q.drain = function() { - console.log('all items have been processed'); - } - - // add some items to the queue - - q.push({name: 'foo'}, function (err) { - console.log('finished processing foo'); - }); - q.push({name: 'bar'}, function (err) { - console.log('finished processing bar'); - }); - - ---------------------------------------- - - -### auto(tasks, [callback]) - -Determines the best order for running functions based on their requirements. -Each function can optionally depend on other functions being completed first, -and each function is run as soon as its requirements are satisfied. If any of -the functions pass and error to their callback, that function will not complete -(so any other functions depending on it will not run) and the main callback -will be called immediately with the error. - -__Arguments__ - -* tasks - An object literal containing named functions or an array of - requirements, with the function itself the last item in the array. The key - used for each function or array is used when specifying requirements. The - syntax is easier to understand by looking at the example. -* callback(err) - An optional callback which is called when all the tasks have - been completed. The callback may receive an error as an argument. - -__Example__ - - async.auto({ - get_data: function(callback){ - // async code to get some data - }, - make_folder: function(callback){ - // async code to create a directory to store a file in - // this is run at the same time as getting the data - }, - write_file: ['get_data', 'make_folder', function(callback){ - // once there is some data and the directory exists, - // write the data to a file in the directory - }], - email_link: ['write_file', function(callback){ - // once the file is written let's email a link to it... - }] - }); - -This is a fairly trivial example, but to do this using the basic parallel and -series functions would look like this: - - async.parallel([ - function(callback){ - // async code to get some data - }, - function(callback){ - // async code to create a directory to store a file in - // this is run at the same time as getting the data - } - ], - function(results){ - async.series([ - function(callback){ - // once there is some data and the directory exists, - // write the data to a file in the directory - }, - email_link: ['write_file', function(callback){ - // once the file is written let's email a link to it... - } - ]); - }); - -For a complicated series of async tasks using the auto function makes adding -new tasks much easier and makes the code more readable. - - ---------------------------------------- - - -### iterator(tasks) - -Creates an iterator function which calls the next function in the array, -returning a continuation to call the next one after that. Its also possible to -'peek' the next iterator by doing iterator.next(). - -This function is used internally by the async module but can be useful when -you want to manually control the flow of functions in series. - -__Arguments__ - -* tasks - An array of functions to run, each function is passed a callback it - must call on completion. - -__Example__ - - var iterator = async.iterator([ - function(){ sys.p('one'); }, - function(){ sys.p('two'); }, - function(){ sys.p('three'); } - ]); - - node> var iterator2 = iterator(); - 'one' - node> var iterator3 = iterator2(); - 'two' - node> iterator3(); - 'three' - node> var nextfn = iterator2.next(); - node> nextfn(); - 'three' - - ---------------------------------------- - - -### apply(function, arguments..) - -Creates a continuation function with some arguments already applied, a useful -shorthand when combined with other flow control functions. Any arguments -passed to the returned function are added to the arguments originally passed -to apply. - -__Arguments__ - -* function - The function you want to eventually apply all arguments to. -* arguments... - Any number of arguments to automatically apply when the - continuation is called. - -__Example__ - - // using apply - - async.parallel([ - async.apply(fs.writeFile, 'testfile1', 'test1'), - async.apply(fs.writeFile, 'testfile2', 'test2'), - ]); - - - // the same process without using apply - - async.parallel([ - function(callback){ - fs.writeFile('testfile1', 'test1', callback); - }, - function(callback){ - fs.writeFile('testfile2', 'test2', callback); - }, - ]); - -It's possible to pass any number of additional arguments when calling the -continuation: - - node> var fn = async.apply(sys.puts, 'one'); - node> fn('two', 'three'); - one - two - three - ---------------------------------------- - - -### nextTick(callback) - -Calls the callback on a later loop around the event loop. In node.js this just -calls process.nextTick, in the browser it falls back to setTimeout(callback, 0), -which means other higher priority events may precede the execution of the callback. - -This is used internally for browser-compatibility purposes. - -__Arguments__ - -* callback - The function to call on a later loop around the event loop. - -__Example__ - - var call_order = []; - async.nextTick(function(){ - call_order.push('two'); - // call_order now equals ['one','two] - }); - call_order.push('one') - - -## Utils - - -### memoize(fn, [hasher]) - -Caches the results of an async function. When creating a hash to store function -results against, the callback is omitted from the hash and an optional hash -function can be used. - -__Arguments__ - -* fn - the function you to proxy and cache results from. -* hasher - an optional function for generating a custom hash for storing - results, it has all the arguments applied to it apart from the callback, and - must be synchronous. - -__Example__ - - var slow_fn = function (name, callback) { - // do something - callback(null, result); - }; - var fn = async.memoize(slow_fn); - - // fn can now be used as if it were slow_fn - fn('some name', function () { - // callback - }); - - - -### log(function, arguments) - -Logs the result of an async function to the console. Only works in node.js or -in browsers that support console.log and console.error (such as FF and Chrome). -If multiple arguments are returned from the async function, console.log is -called on each argument in order. - -__Arguments__ - -* function - The function you want to eventually apply all arguments to. -* arguments... - Any number of arguments to apply to the function. - -__Example__ - - var hello = function(name, callback){ - setTimeout(function(){ - callback(null, 'hello ' + name); - }, 1000); - }; - - node> async.log(hello, 'world'); - 'hello world' - - ---------------------------------------- - - -### dir(function, arguments) - -Logs the result of an async function to the console using console.dir to -display the properties of the resulting object. Only works in node.js or -in browsers that support console.dir and console.error (such as FF and Chrome). -If multiple arguments are returned from the async function, console.dir is -called on each argument in order. - -__Arguments__ - -* function - The function you want to eventually apply all arguments to. -* arguments... - Any number of arguments to apply to the function. - -__Example__ - - var hello = function(name, callback){ - setTimeout(function(){ - callback(null, {hello: name}); - }, 1000); - }; - - node> async.dir(hello, 'world'); - {hello: 'world'} - - ---------------------------------------- - - -### noConflict() - -Changes the value of async back to its original value, returning a reference to the -async object. diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/async.min.js.gzip b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/async.min.js.gzip deleted file mode 100644 index e1c32944465c634d9b609622b37972d1ae8e6e7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1859 zcmV-J2fX+niwFpUH4aSx17UM{ZeuQOX>KlRa{$d)OOx9+4E`&dJ!r^8tJqh0RZrV# zZ=H17-aJ0=C0o0)cwe{Z%@F7vMl6BIVG?Up_q$mIcJ^&y2_Vq3=Im_>A)%=wm zRM|H1UCQ!Wg?FMX>M~b$eE0e-N!vm+Sy>Qze$T2qmYlm4KJcX3XLTqN91Adg8<}0$l>2$&!4KwRQ*L(Nw8`Hdo+t}rs${2EMTi7(9>F{v~n`LU|lDFTN#B?dOCp(dzEuskQM+O-E&H1&YCh#iml zi4<*~hnwCB+XzaUU=84sc1HQrH&bpRFk`~=Br2gaYEw)$o?wcPlg8*d>nw?R_@3ph zidomukX@}6kY9SiFs~J)8=Gd^M21i(G+KPvYdq>e>9Uq&(6B4SC&a#o&2hWH4BYlSH>uKEi9n30?Sh3G;4_GGWRFU!ynmh-%Jfljc<1oxAviD z9fi-|tEvWkuKFswvmbX>U6qWq=s4!zI*u?K1gWXCjDq84f~ZIu)zDYToN8BUAGrAi z&2ug>iaTo2kY;(KDgZ=|@i(I$6MC*zxe1YZ+0WQjdNQmxpO8dx`vc8$c5a0wPIM zwTgyv+zsYEtcj(~YgU{RV*v~>15f|OlFNlS@wb_xt+tlrSWUDE+9y@>)0{1u?0q&W zx}>eKxHYTMX-r6? zwy5`6+7QRR$DGWuLJky#KW2^?6i&BCUlFOG+;n>*Rwk&T*a5&i(op1bd=j0*-G$r$dt<7}^7< zmYYGtmh9+CL8_f6<%^zSDb$2#tS-|pw0jF6K^kEn7{E5g%<~h?5L7-xP~q%113&p$ zHm9^WMFsp#*y><@dK1}0G?}n*P5!~6-P*PjiJOblK2pPZ!AH}GC2FG8VRk}S0Y|U~ z0M02T+BZj5fpRr<&9w_)cO3a;4Y3j+0+6aVL+6VXM3@mDcDIvV+`mhL$7BgH25UBp zEkM?+)Z2nGce&X7=u zTF5y4G*cIc%Z7&~w(vJg8l$wXm(f3QvM^l|RnC}wtKY6qpM5*_cEjBX@}@&+f66RB z!LW5Jet}+UP(U2}vnzHKI(t&XW23Ts)2s%*Sz-}1qn>Z-xexm+ucv1;ykwwjL9Xg{ zPlyzr%*?m;6X=c76w9_~vV2w|EQnu}sz2|AqQJjf)v8G;7+;Ur?wTfN++$l+st~7G zgxCP$@rSm5pCxM;99uA0oQdaHbmKk|*_$P>z&^zuEWmF0m`0wqAaF_NZf2EZJ_~>r zB;ZQl#z4p-)E#=#D%V_ph{y=}x~tWg_Zqt;o}^@)-iC>}>SGDSWA z(uz3hq{3lz^YsGl#i70ap59&)zP4{7RaIpb1fwCSi|qsyydW6SLQJgwoi2p5+v*gB zVpHytBe{p4dwo31DjdR(9v;-8%>J3)K%0F*Q6IB$|2ku)su=X%cBf?!E~8_4wAX@Z xGIF@2s}wJS#afNxut~Qx9u+Qm9U5>4tV;&(tNFTZoYVmy`WKn%6PvIY007E|gZuyh diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.css b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.css deleted file mode 100644 index 274434a..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.css +++ /dev/null @@ -1,70 +0,0 @@ -/*! - * Styles taken from qunit.css - */ - -h1#nodeunit-header, h1.nodeunit-header { - padding: 15px; - font-size: large; - background-color: #06b; - color: white; - font-family: 'trebuchet ms', verdana, arial; - margin: 0; -} - -h1#nodeunit-header a { - color: white; -} - -h2#nodeunit-banner { - height: 2em; - border-bottom: 1px solid white; - background-color: #eee; - margin: 0; - font-family: 'trebuchet ms', verdana, arial; -} -h2#nodeunit-banner.pass { - background-color: green; -} -h2#nodeunit-banner.fail { - background-color: red; -} - -h2#nodeunit-userAgent, h2.nodeunit-userAgent { - padding: 10px; - background-color: #eee; - color: black; - margin: 0; - font-size: small; - font-weight: normal; - font-family: 'trebuchet ms', verdana, arial; - font-size: 10pt; -} - -div#nodeunit-testrunner-toolbar { - background: #eee; - border-top: 1px solid black; - padding: 10px; - font-family: 'trebuchet ms', verdana, arial; - margin: 0; - font-size: 10pt; -} - -ol#nodeunit-tests { - font-family: 'trebuchet ms', verdana, arial; - font-size: 10pt; -} -ol#nodeunit-tests li strong { - cursor:pointer; -} -ol#nodeunit-tests .pass { - color: green; -} -ol#nodeunit-tests .fail { - color: red; -} - -p#nodeunit-testresult { - margin-left: 1em; - font-size: 10pt; - font-family: 'trebuchet ms', verdana, arial; -} diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.js deleted file mode 100644 index 5957184..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.js +++ /dev/null @@ -1,1966 +0,0 @@ -/*! - * Nodeunit - * https://github.com/caolan/nodeunit - * Copyright (c) 2010 Caolan McMahon - * MIT Licensed - * - * json2.js - * http://www.JSON.org/json2.js - * Public Domain. - * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. - */ -nodeunit = (function(){ -/* - http://www.JSON.org/json2.js - 2010-11-17 - - Public Domain. - - NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. - - See http://www.JSON.org/js.html - - - This code should be minified before deployment. - See http://javascript.crockford.com/jsmin.html - - USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO - NOT CONTROL. - - - This file creates a global JSON object containing two methods: stringify - and parse. - - JSON.stringify(value, replacer, space) - value any JavaScript value, usually an object or array. - - replacer an optional parameter that determines how object - values are stringified for objects. It can be a - function or an array of strings. - - space an optional parameter that specifies the indentation - of nested structures. If it is omitted, the text will - be packed without extra whitespace. If it is a number, - it will specify the number of spaces to indent at each - level. If it is a string (such as '\t' or ' '), - it contains the characters used to indent at each level. - - This method produces a JSON text from a JavaScript value. - - When an object value is found, if the object contains a toJSON - method, its toJSON method will be called and the result will be - stringified. A toJSON method does not serialize: it returns the - value represented by the name/value pair that should be serialized, - or undefined if nothing should be serialized. The toJSON method - will be passed the key associated with the value, and this will be - bound to the value - - For example, this would serialize Dates as ISO strings. - - Date.prototype.toJSON = function (key) { - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - return this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z'; - }; - - You can provide an optional replacer method. It will be passed the - key and value of each member, with this bound to the containing - object. The value that is returned from your method will be - serialized. If your method returns undefined, then the member will - be excluded from the serialization. - - If the replacer parameter is an array of strings, then it will be - used to select the members to be serialized. It filters the results - such that only members with keys listed in the replacer array are - stringified. - - Values that do not have JSON representations, such as undefined or - functions, will not be serialized. Such values in objects will be - dropped; in arrays they will be replaced with null. You can use - a replacer function to replace those with JSON values. - JSON.stringify(undefined) returns undefined. - - The optional space parameter produces a stringification of the - value that is filled with line breaks and indentation to make it - easier to read. - - If the space parameter is a non-empty string, then that string will - be used for indentation. If the space parameter is a number, then - the indentation will be that many spaces. - - Example: - - text = JSON.stringify(['e', {pluribus: 'unum'}]); - // text is '["e",{"pluribus":"unum"}]' - - - text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); - // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' - - text = JSON.stringify([new Date()], function (key, value) { - return this[key] instanceof Date ? - 'Date(' + this[key] + ')' : value; - }); - // text is '["Date(---current time---)"]' - - - JSON.parse(text, reviver) - This method parses a JSON text to produce an object or array. - It can throw a SyntaxError exception. - - The optional reviver parameter is a function that can filter and - transform the results. It receives each of the keys and values, - and its return value is used instead of the original value. - If it returns what it received, then the structure is not modified. - If it returns undefined then the member is deleted. - - Example: - - // Parse the text. Values that look like ISO date strings will - // be converted to Date objects. - - myData = JSON.parse(text, function (key, value) { - var a; - if (typeof value === 'string') { - a = -/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); - if (a) { - return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], - +a[5], +a[6])); - } - } - return value; - }); - - myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { - var d; - if (typeof value === 'string' && - value.slice(0, 5) === 'Date(' && - value.slice(-1) === ')') { - d = new Date(value.slice(5, -1)); - if (d) { - return d; - } - } - return value; - }); - - - This is a reference implementation. You are free to copy, modify, or - redistribute. -*/ - -/*jslint evil: true, strict: false, regexp: false */ - -/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, - call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, - getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, - lastIndex, length, parse, prototype, push, replace, slice, stringify, - test, toJSON, toString, valueOf -*/ - - -// Create a JSON object only if one does not already exist. We create the -// methods in a closure to avoid creating global variables. - -if (!this.JSON) { - this.JSON = {}; -} - -(function () { - "use strict"; - - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - if (typeof Date.prototype.toJSON !== 'function') { - - Date.prototype.toJSON = function (key) { - - return isFinite(this.valueOf()) ? - this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z' : null; - }; - - String.prototype.toJSON = - Number.prototype.toJSON = - Boolean.prototype.toJSON = function (key) { - return this.valueOf(); - }; - } - - var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - gap, - indent, - meta = { // table of character substitutions - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '"' : '\\"', - '\\': '\\\\' - }, - rep; - - - function quote(string) { - -// If the string contains no control characters, no quote characters, and no -// backslash characters, then we can safely slap some quotes around it. -// Otherwise we must also replace the offending characters with safe escape -// sequences. - - escapable.lastIndex = 0; - return escapable.test(string) ? - '"' + string.replace(escapable, function (a) { - var c = meta[a]; - return typeof c === 'string' ? c : - '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }) + '"' : - '"' + string + '"'; - } - - - function str(key, holder) { - -// Produce a string from holder[key]. - - var i, // The loop counter. - k, // The member key. - v, // The member value. - length, - mind = gap, - partial, - value = holder[key]; - -// If the value has a toJSON method, call it to obtain a replacement value. - - if (value && typeof value === 'object' && - typeof value.toJSON === 'function') { - value = value.toJSON(key); - } - -// If we were called with a replacer function, then call the replacer to -// obtain a replacement value. - - if (typeof rep === 'function') { - value = rep.call(holder, key, value); - } - -// What happens next depends on the value's type. - - switch (typeof value) { - case 'string': - return quote(value); - - case 'number': - -// JSON numbers must be finite. Encode non-finite numbers as null. - - return isFinite(value) ? String(value) : 'null'; - - case 'boolean': - case 'null': - -// If the value is a boolean or null, convert it to a string. Note: -// typeof null does not produce 'null'. The case is included here in -// the remote chance that this gets fixed someday. - - return String(value); - -// If the type is 'object', we might be dealing with an object or an array or -// null. - - case 'object': - -// Due to a specification blunder in ECMAScript, typeof null is 'object', -// so watch out for that case. - - if (!value) { - return 'null'; - } - -// Make an array to hold the partial results of stringifying this object value. - - gap += indent; - partial = []; - -// Is the value an array? - - if (Object.prototype.toString.apply(value) === '[object Array]') { - -// The value is an array. Stringify every element. Use null as a placeholder -// for non-JSON values. - - length = value.length; - for (i = 0; i < length; i += 1) { - partial[i] = str(i, value) || 'null'; - } - -// Join all of the elements together, separated with commas, and wrap them in -// brackets. - - v = partial.length === 0 ? '[]' : - gap ? '[\n' + gap + - partial.join(',\n' + gap) + '\n' + - mind + ']' : - '[' + partial.join(',') + ']'; - gap = mind; - return v; - } - -// If the replacer is an array, use it to select the members to be stringified. - - if (rep && typeof rep === 'object') { - length = rep.length; - for (i = 0; i < length; i += 1) { - k = rep[i]; - if (typeof k === 'string') { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } else { - -// Otherwise, iterate through all of the keys in the object. - - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } - -// Join all of the member texts together, separated with commas, -// and wrap them in braces. - - v = partial.length === 0 ? '{}' : - gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + - mind + '}' : '{' + partial.join(',') + '}'; - gap = mind; - return v; - } - } - -// If the JSON object does not yet have a stringify method, give it one. - - if (typeof JSON.stringify !== 'function') { - JSON.stringify = function (value, replacer, space) { - -// The stringify method takes a value and an optional replacer, and an optional -// space parameter, and returns a JSON text. The replacer can be a function -// that can replace values, or an array of strings that will select the keys. -// A default replacer method can be provided. Use of the space parameter can -// produce text that is more easily readable. - - var i; - gap = ''; - indent = ''; - -// If the space parameter is a number, make an indent string containing that -// many spaces. - - if (typeof space === 'number') { - for (i = 0; i < space; i += 1) { - indent += ' '; - } - -// If the space parameter is a string, it will be used as the indent string. - - } else if (typeof space === 'string') { - indent = space; - } - -// If there is a replacer, it must be a function or an array. -// Otherwise, throw an error. - - rep = replacer; - if (replacer && typeof replacer !== 'function' && - (typeof replacer !== 'object' || - typeof replacer.length !== 'number')) { - throw new Error('JSON.stringify'); - } - -// Make a fake root object containing our value under the key of ''. -// Return the result of stringifying the value. - - return str('', {'': value}); - }; - } - - -// If the JSON object does not yet have a parse method, give it one. - - if (typeof JSON.parse !== 'function') { - JSON.parse = function (text, reviver) { - -// The parse method takes a text and an optional reviver function, and returns -// a JavaScript value if the text is a valid JSON text. - - var j; - - function walk(holder, key) { - -// The walk method is used to recursively walk the resulting structure so -// that modifications can be made. - - var k, v, value = holder[key]; - if (value && typeof value === 'object') { - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = walk(value, k); - if (v !== undefined) { - value[k] = v; - } else { - delete value[k]; - } - } - } - } - return reviver.call(holder, key, value); - } - - -// Parsing happens in four stages. In the first stage, we replace certain -// Unicode characters with escape sequences. JavaScript handles many characters -// incorrectly, either silently deleting them, or treating them as line endings. - - text = String(text); - cx.lastIndex = 0; - if (cx.test(text)) { - text = text.replace(cx, function (a) { - return '\\u' + - ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }); - } - -// In the second stage, we run the text against regular expressions that look -// for non-JSON patterns. We are especially concerned with '()' and 'new' -// because they can cause invocation, and '=' because it can cause mutation. -// But just to be safe, we want to reject all unexpected forms. - -// We split the second stage into 4 regexp operations in order to work around -// crippling inefficiencies in IE's and Safari's regexp engines. First we -// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we -// replace all simple value tokens with ']' characters. Third, we delete all -// open brackets that follow a colon or comma or that begin the text. Finally, -// we look to see that the remaining characters are only whitespace or ']' or -// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. - - if (/^[\],:{}\s]*$/ -.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') -.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') -.replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { - -// In the third stage we use the eval function to compile the text into a -// JavaScript structure. The '{' operator is subject to a syntactic ambiguity -// in JavaScript: it can begin a block or an object literal. We wrap the text -// in parens to eliminate the ambiguity. - - j = eval('(' + text + ')'); - -// In the optional fourth stage, we recursively walk the new structure, passing -// each name/value pair to a reviver function for possible transformation. - - return typeof reviver === 'function' ? - walk({'': j}, '') : j; - } - -// If the text is not JSON parseable, then a SyntaxError is thrown. - - throw new SyntaxError('JSON.parse'); - }; - } -}()); -var assert = this.assert = {}; -var types = {}; -var core = {}; -var nodeunit = {}; -var reporter = {}; -/*global setTimeout: false, console: false */ -(function () { - - var async = {}; - - // global on the server, window in the browser - var root = this, - previous_async = root.async; - - if (typeof module !== 'undefined' && module.exports) { - module.exports = async; - } - else { - root.async = async; - } - - async.noConflict = function () { - root.async = previous_async; - return async; - }; - - //// cross-browser compatiblity functions //// - - var _forEach = function (arr, iterator) { - if (arr.forEach) { - return arr.forEach(iterator); - } - for (var i = 0; i < arr.length; i += 1) { - iterator(arr[i], i, arr); - } - }; - - var _map = function (arr, iterator) { - if (arr.map) { - return arr.map(iterator); - } - var results = []; - _forEach(arr, function (x, i, a) { - results.push(iterator(x, i, a)); - }); - return results; - }; - - var _reduce = function (arr, iterator, memo) { - if (arr.reduce) { - return arr.reduce(iterator, memo); - } - _forEach(arr, function (x, i, a) { - memo = iterator(memo, x, i, a); - }); - return memo; - }; - - var _keys = function (obj) { - if (Object.keys) { - return Object.keys(obj); - } - var keys = []; - for (var k in obj) { - if (obj.hasOwnProperty(k)) { - keys.push(k); - } - } - return keys; - }; - - var _indexOf = function (arr, item) { - if (arr.indexOf) { - return arr.indexOf(item); - } - for (var i = 0; i < arr.length; i += 1) { - if (arr[i] === item) { - return i; - } - } - return -1; - }; - - //// exported async module functions //// - - //// nextTick implementation with browser-compatible fallback //// - async.nextTick = function (fn) { - if (typeof process === 'undefined' || !(process.nextTick)) { - setTimeout(fn, 0); - } - else { - process.nextTick(fn); - } - }; - - async.forEach = function (arr, iterator, callback) { - if (!arr.length) { - return callback(); - } - var completed = 0; - _forEach(arr, function (x) { - iterator(x, function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - if (completed === arr.length) { - callback(); - } - } - }); - }); - }; - - async.forEachSeries = function (arr, iterator, callback) { - if (!arr.length) { - return callback(); - } - var completed = 0; - var iterate = function () { - iterator(arr[completed], function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - if (completed === arr.length) { - callback(); - } - else { - iterate(); - } - } - }); - }; - iterate(); - }; - - - var doParallel = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [async.forEach].concat(args)); - }; - }; - var doSeries = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [async.forEachSeries].concat(args)); - }; - }; - - - var _asyncMap = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (err, v) { - results[x.index] = v; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - }; - async.map = doParallel(_asyncMap); - async.mapSeries = doSeries(_asyncMap); - - - // reduce only has a series version, as doing reduce in parallel won't - // work in many situations. - async.reduce = function (arr, memo, iterator, callback) { - async.forEachSeries(arr, function (x, callback) { - iterator(memo, x, function (err, v) { - memo = v; - callback(err); - }); - }, function (err) { - callback(err, memo); - }); - }; - // inject alias - async.inject = async.reduce; - // foldl alias - async.foldl = async.reduce; - - async.reduceRight = function (arr, memo, iterator, callback) { - var reversed = _map(arr, function (x) { - return x; - }).reverse(); - async.reduce(reversed, memo, iterator, callback); - }; - // foldr alias - async.foldr = async.reduceRight; - - var _filter = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (v) { - if (v) { - results.push(x); - } - callback(); - }); - }, function (err) { - callback(_map(results.sort(function (a, b) { - return a.index - b.index; - }), function (x) { - return x.value; - })); - }); - }; - async.filter = doParallel(_filter); - async.filterSeries = doSeries(_filter); - // select alias - async.select = async.filter; - async.selectSeries = async.filterSeries; - - var _reject = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (v) { - if (!v) { - results.push(x); - } - callback(); - }); - }, function (err) { - callback(_map(results.sort(function (a, b) { - return a.index - b.index; - }), function (x) { - return x.value; - })); - }); - }; - async.reject = doParallel(_reject); - async.rejectSeries = doSeries(_reject); - - var _detect = function (eachfn, arr, iterator, main_callback) { - eachfn(arr, function (x, callback) { - iterator(x, function (result) { - if (result) { - main_callback(x); - } - else { - callback(); - } - }); - }, function (err) { - main_callback(); - }); - }; - async.detect = doParallel(_detect); - async.detectSeries = doSeries(_detect); - - async.some = function (arr, iterator, main_callback) { - async.forEach(arr, function (x, callback) { - iterator(x, function (v) { - if (v) { - main_callback(true); - main_callback = function () {}; - } - callback(); - }); - }, function (err) { - main_callback(false); - }); - }; - // any alias - async.any = async.some; - - async.every = function (arr, iterator, main_callback) { - async.forEach(arr, function (x, callback) { - iterator(x, function (v) { - if (!v) { - main_callback(false); - main_callback = function () {}; - } - callback(); - }); - }, function (err) { - main_callback(true); - }); - }; - // all alias - async.all = async.every; - - async.sortBy = function (arr, iterator, callback) { - async.map(arr, function (x, callback) { - iterator(x, function (err, criteria) { - if (err) { - callback(err); - } - else { - callback(null, {value: x, criteria: criteria}); - } - }); - }, function (err, results) { - if (err) { - return callback(err); - } - else { - var fn = function (left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }; - callback(null, _map(results.sort(fn), function (x) { - return x.value; - })); - } - }); - }; - - async.auto = function (tasks, callback) { - callback = callback || function () {}; - var keys = _keys(tasks); - if (!keys.length) { - return callback(null); - } - - var completed = []; - - var listeners = []; - var addListener = function (fn) { - listeners.unshift(fn); - }; - var removeListener = function (fn) { - for (var i = 0; i < listeners.length; i += 1) { - if (listeners[i] === fn) { - listeners.splice(i, 1); - return; - } - } - }; - var taskComplete = function () { - _forEach(listeners, function (fn) { - fn(); - }); - }; - - addListener(function () { - if (completed.length === keys.length) { - callback(null); - } - }); - - _forEach(keys, function (k) { - var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k]; - var taskCallback = function (err) { - if (err) { - callback(err); - // stop subsequent errors hitting callback multiple times - callback = function () {}; - } - else { - completed.push(k); - taskComplete(); - } - }; - var requires = task.slice(0, Math.abs(task.length - 1)) || []; - var ready = function () { - return _reduce(requires, function (a, x) { - return (a && _indexOf(completed, x) !== -1); - }, true); - }; - if (ready()) { - task[task.length - 1](taskCallback); - } - else { - var listener = function () { - if (ready()) { - removeListener(listener); - task[task.length - 1](taskCallback); - } - }; - addListener(listener); - } - }); - }; - - async.waterfall = function (tasks, callback) { - if (!tasks.length) { - return callback(); - } - callback = callback || function () {}; - var wrapIterator = function (iterator) { - return function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - var args = Array.prototype.slice.call(arguments, 1); - var next = iterator.next(); - if (next) { - args.push(wrapIterator(next)); - } - else { - args.push(callback); - } - async.nextTick(function () { - iterator.apply(null, args); - }); - } - }; - }; - wrapIterator(async.iterator(tasks))(); - }; - - async.parallel = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - async.map(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args || null); - }); - } - }, callback); - } - else { - var results = {}; - async.forEach(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.series = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - async.mapSeries(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args || null); - }); - } - }, callback); - } - else { - var results = {}; - async.forEachSeries(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.iterator = function (tasks) { - var makeCallback = function (index) { - var fn = function () { - if (tasks.length) { - tasks[index].apply(null, arguments); - } - return fn.next(); - }; - fn.next = function () { - return (index < tasks.length - 1) ? makeCallback(index + 1): null; - }; - return fn; - }; - return makeCallback(0); - }; - - async.apply = function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - return function () { - return fn.apply( - null, args.concat(Array.prototype.slice.call(arguments)) - ); - }; - }; - - var _concat = function (eachfn, arr, fn, callback) { - var r = []; - eachfn(arr, function (x, cb) { - fn(x, function (err, y) { - r = r.concat(y || []); - cb(err); - }); - }, function (err) { - callback(err, r); - }); - }; - async.concat = doParallel(_concat); - async.concatSeries = doSeries(_concat); - - async.whilst = function (test, iterator, callback) { - if (test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.whilst(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.until = function (test, iterator, callback) { - if (!test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.until(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.queue = function (worker, concurrency) { - var workers = 0; - var tasks = []; - var q = { - concurrency: concurrency, - push: function (data, callback) { - tasks.push({data: data, callback: callback}); - async.nextTick(q.process); - }, - process: function () { - if (workers < q.concurrency && tasks.length) { - var task = tasks.splice(0, 1)[0]; - workers += 1; - worker(task.data, function () { - workers -= 1; - if (task.callback) { - task.callback.apply(task, arguments); - } - q.process(); - }); - } - }, - length: function () { - return tasks.length; - } - }; - return q; - }; - - var _console_fn = function (name) { - return function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - fn.apply(null, args.concat([function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (typeof console !== 'undefined') { - if (err) { - if (console.error) { - console.error(err); - } - } - else if (console[name]) { - _forEach(args, function (x) { - console[name](x); - }); - } - } - }])); - }; - }; - async.log = _console_fn('log'); - async.dir = _console_fn('dir'); - /*async.info = _console_fn('info'); - async.warn = _console_fn('warn'); - async.error = _console_fn('error');*/ - -}()); -(function(exports){ -/** - * This file is based on the node.js assert module, but with some small - * changes for browser-compatibility - * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! - */ - - -/** - * Added for browser compatibility - */ - -var _keys = function(obj){ - if(Object.keys) return Object.keys(obj); - var keys = []; - for(var k in obj){ - if(obj.hasOwnProperty(k)) keys.push(k); - } - return keys; -}; - - - -// http://wiki.commonjs.org/wiki/Unit_Testing/1.0 -// -// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! -// -// Originally from narwhal.js (http://narwhaljs.org) -// Copyright (c) 2009 Thomas Robinson <280north.com> -// -// 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 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. - - -var pSlice = Array.prototype.slice; - -// 1. The assert module provides functions that throw -// AssertionError's when particular conditions are not met. The -// assert module must conform to the following interface. - -var assert = exports; - -// 2. The AssertionError is defined in assert. -// new assert.AssertionError({message: message, actual: actual, expected: expected}) - -assert.AssertionError = function AssertionError (options) { - this.name = "AssertionError"; - this.message = options.message; - this.actual = options.actual; - this.expected = options.expected; - this.operator = options.operator; - var stackStartFunction = options.stackStartFunction || fail; - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, stackStartFunction); - } -}; -// code from util.inherits in node -assert.AssertionError.super_ = Error; - - -// EDITED FOR BROWSER COMPATIBILITY: replaced Object.create call -// TODO: test what effect this may have -var ctor = function () { this.constructor = assert.AssertionError; }; -ctor.prototype = Error.prototype; -assert.AssertionError.prototype = new ctor(); - - -assert.AssertionError.prototype.toString = function() { - if (this.message) { - return [this.name+":", this.message].join(' '); - } else { - return [ this.name+":" - , JSON.stringify(this.expected ) - , this.operator - , JSON.stringify(this.actual) - ].join(" "); - } -}; - -// assert.AssertionError instanceof Error - -assert.AssertionError.__proto__ = Error.prototype; - -// At present only the three keys mentioned above are used and -// understood by the spec. Implementations or sub modules can pass -// other keys to the AssertionError's constructor - they will be -// ignored. - -// 3. All of the following functions must throw an AssertionError -// when a corresponding condition is not met, with a message that -// may be undefined if not provided. All assertion methods provide -// both the actual and expected values to the assertion error for -// display purposes. - -function fail(actual, expected, message, operator, stackStartFunction) { - throw new assert.AssertionError({ - message: message, - actual: actual, - expected: expected, - operator: operator, - stackStartFunction: stackStartFunction - }); -} - -// EXTENSION! allows for well behaved errors defined elsewhere. -assert.fail = fail; - -// 4. Pure assertion tests whether a value is truthy, as determined -// by !!guard. -// assert.ok(guard, message_opt); -// This statement is equivalent to assert.equal(true, guard, -// message_opt);. To test strictly for the value true, use -// assert.strictEqual(true, guard, message_opt);. - -assert.ok = function ok(value, message) { - if (!!!value) fail(value, true, message, "==", assert.ok); -}; - -// 5. The equality assertion tests shallow, coercive equality with -// ==. -// assert.equal(actual, expected, message_opt); - -assert.equal = function equal(actual, expected, message) { - if (actual != expected) fail(actual, expected, message, "==", assert.equal); -}; - -// 6. The non-equality assertion tests for whether two objects are not equal -// with != assert.notEqual(actual, expected, message_opt); - -assert.notEqual = function notEqual(actual, expected, message) { - if (actual == expected) { - fail(actual, expected, message, "!=", assert.notEqual); - } -}; - -// 7. The equivalence assertion tests a deep equality relation. -// assert.deepEqual(actual, expected, message_opt); - -assert.deepEqual = function deepEqual(actual, expected, message) { - if (!_deepEqual(actual, expected)) { - fail(actual, expected, message, "deepEqual", assert.deepEqual); - } -}; - -function _deepEqual(actual, expected) { - // 7.1. All identical values are equivalent, as determined by ===. - if (actual === expected) { - return true; - // 7.2. If the expected value is a Date object, the actual value is - // equivalent if it is also a Date object that refers to the same time. - } else if (actual instanceof Date && expected instanceof Date) { - return actual.getTime() === expected.getTime(); - - // 7.3. Other pairs that do not both pass typeof value == "object", - // equivalence is determined by ==. - } else if (typeof actual != 'object' && typeof expected != 'object') { - return actual == expected; - - // 7.4. For all other Object pairs, including Array objects, equivalence is - // determined by having the same number of owned properties (as verified - // with Object.prototype.hasOwnProperty.call), the same set of keys - // (although not necessarily the same order), equivalent values for every - // corresponding key, and an identical "prototype" property. Note: this - // accounts for both named and indexed properties on Arrays. - } else { - return objEquiv(actual, expected); - } -} - -function isUndefinedOrNull (value) { - return value === null || value === undefined; -} - -function isArguments (object) { - return Object.prototype.toString.call(object) == '[object Arguments]'; -} - -function objEquiv (a, b) { - if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) - return false; - // an identical "prototype" property. - if (a.prototype !== b.prototype) return false; - //~~~I've managed to break Object.keys through screwy arguments passing. - // Converting to array solves the problem. - if (isArguments(a)) { - if (!isArguments(b)) { - return false; - } - a = pSlice.call(a); - b = pSlice.call(b); - return _deepEqual(a, b); - } - try{ - var ka = _keys(a), - kb = _keys(b), - key, i; - } catch (e) {//happens when one is a string literal and the other isn't - return false; - } - // having the same number of owned properties (keys incorporates hasOwnProperty) - if (ka.length != kb.length) - return false; - //the same set of keys (although not necessarily the same order), - ka.sort(); - kb.sort(); - //~~~cheap key test - for (i = ka.length - 1; i >= 0; i--) { - if (ka[i] != kb[i]) - return false; - } - //equivalent values for every corresponding key, and - //~~~possibly expensive deep test - for (i = ka.length - 1; i >= 0; i--) { - key = ka[i]; - if (!_deepEqual(a[key], b[key] )) - return false; - } - return true; -} - -// 8. The non-equivalence assertion tests for any deep inequality. -// assert.notDeepEqual(actual, expected, message_opt); - -assert.notDeepEqual = function notDeepEqual(actual, expected, message) { - if (_deepEqual(actual, expected)) { - fail(actual, expected, message, "notDeepEqual", assert.notDeepEqual); - } -}; - -// 9. The strict equality assertion tests strict equality, as determined by ===. -// assert.strictEqual(actual, expected, message_opt); - -assert.strictEqual = function strictEqual(actual, expected, message) { - if (actual !== expected) { - fail(actual, expected, message, "===", assert.strictEqual); - } -}; - -// 10. The strict non-equality assertion tests for strict inequality, as determined by !==. -// assert.notStrictEqual(actual, expected, message_opt); - -assert.notStrictEqual = function notStrictEqual(actual, expected, message) { - if (actual === expected) { - fail(actual, expected, message, "!==", assert.notStrictEqual); - } -}; - -function _throws (shouldThrow, block, err, message) { - var exception = null, - threw = false, - typematters = true; - - message = message || ""; - - //handle optional arguments - if (arguments.length == 3) { - if (typeof(err) == "string") { - message = err; - typematters = false; - } - } else if (arguments.length == 2) { - typematters = false; - } - - try { - block(); - } catch (e) { - threw = true; - exception = e; - } - - if (shouldThrow && !threw) { - fail( "Missing expected exception" - + (err && err.name ? " ("+err.name+")." : '.') - + (message ? " " + message : "") - ); - } - if (!shouldThrow && threw && typematters && exception instanceof err) { - fail( "Got unwanted exception" - + (err && err.name ? " ("+err.name+")." : '.') - + (message ? " " + message : "") - ); - } - if ((shouldThrow && threw && typematters && !(exception instanceof err)) || - (!shouldThrow && threw)) { - throw exception; - } -}; - -// 11. Expected to throw an error: -// assert.throws(block, Error_opt, message_opt); - -assert.throws = function(block, /*optional*/error, /*optional*/message) { - _throws.apply(this, [true].concat(pSlice.call(arguments))); -}; - -// EXTENSION! This is annoying to write outside this module. -assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) { - _throws.apply(this, [false].concat(pSlice.call(arguments))); -}; - -assert.ifError = function (err) { if (err) {throw err;}}; -})(assert); -(function(exports){ -/*! - * Nodeunit - * Copyright (c) 2010 Caolan McMahon - * MIT Licensed - * - * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! - * Only code on that line will be removed, its mostly to avoid requiring code - * that is node specific - */ - -/** - * Module dependencies - */ - - - -/** - * Creates assertion objects representing the result of an assert call. - * Accepts an object or AssertionError as its argument. - * - * @param {object} obj - * @api public - */ - -exports.assertion = function (obj) { - return { - method: obj.method || '', - message: obj.message || (obj.error && obj.error.message) || '', - error: obj.error, - passed: function () { - return !this.error; - }, - failed: function () { - return Boolean(this.error); - } - }; -}; - -/** - * Creates an assertion list object representing a group of assertions. - * Accepts an array of assertion objects. - * - * @param {Array} arr - * @param {Number} duration - * @api public - */ - -exports.assertionList = function (arr, duration) { - var that = arr || []; - that.failures = function () { - var failures = 0; - for (var i=0; i(' + - '' + assertions.failures() + ', ' + - '' + assertions.passes() + ', ' + - assertions.length + - ')'; - test.className = assertions.failures() ? 'fail': 'pass'; - test.appendChild(strong); - - var aList = document.createElement('ol'); - aList.style.display = 'none'; - test.onclick = function () { - var d = aList.style.display; - aList.style.display = (d == 'none') ? 'block': 'none'; - }; - for (var i=0; i' + (a.error.stack || a.error) + ''; - li.className = 'fail'; - } - else { - li.innerHTML = a.message || a.method || 'no message'; - li.className = 'pass'; - } - aList.appendChild(li); - } - test.appendChild(aList); - tests.appendChild(test); - }, - done: function (assertions) { - var end = new Date().getTime(); - var duration = end - start; - - var failures = assertions.failures(); - banner.className = failures ? 'fail': 'pass'; - - result.innerHTML = 'Tests completed in ' + duration + - ' milliseconds.
      ' + - assertions.passes() + ' assertions of ' + - '' + assertions.length + ' passed, ' + - assertions.failures() + ' failed.'; - } - }); -}; -})(reporter); -nodeunit = core; -nodeunit.assert = assert; -nodeunit.reporter = reporter; -nodeunit.run = reporter.run; -return nodeunit; })(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/dist/async.min.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/dist/async.min.js deleted file mode 100644 index f89741e..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/dist/async.min.js +++ /dev/null @@ -1 +0,0 @@ -/*global setTimeout: false, console: false */(function(){var a={};var b=this,c=b.async;typeof module!=="undefined"&&module.exports?module.exports=a:b.async=a,a.noConflict=function(){b.async=c;return a};var d=function(a,b){if(a.forEach)return a.forEach(b);for(var c=0;cd?1:0};d(null,e(b.sort(c),function(a){return a.value}))})},a.auto=function(a,b){b=b||function(){};var c=g(a);if(!c.length)return b(null);var e=[];var i=[];var j=function(a){i.unshift(a)};var k=function(a){for(var b=0;b b ? 1 : 0; - }; - callback(null, _map(results.sort(fn), function (x) { - return x.value; - })); - } - }); - }; - - async.auto = function (tasks, callback) { - callback = callback || function () {}; - var keys = _keys(tasks); - if (!keys.length) { - return callback(null); - } - - var completed = []; - - var listeners = []; - var addListener = function (fn) { - listeners.unshift(fn); - }; - var removeListener = function (fn) { - for (var i = 0; i < listeners.length; i += 1) { - if (listeners[i] === fn) { - listeners.splice(i, 1); - return; - } - } - }; - var taskComplete = function () { - _forEach(listeners, function (fn) { - fn(); - }); - }; - - addListener(function () { - if (completed.length === keys.length) { - callback(null); - } - }); - - _forEach(keys, function (k) { - var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k]; - var taskCallback = function (err) { - if (err) { - callback(err); - // stop subsequent errors hitting callback multiple times - callback = function () {}; - } - else { - completed.push(k); - taskComplete(); - } - }; - var requires = task.slice(0, Math.abs(task.length - 1)) || []; - var ready = function () { - return _reduce(requires, function (a, x) { - return (a && _indexOf(completed, x) !== -1); - }, true); - }; - if (ready()) { - task[task.length - 1](taskCallback); - } - else { - var listener = function () { - if (ready()) { - removeListener(listener); - task[task.length - 1](taskCallback); - } - }; - addListener(listener); - } - }); - }; - - async.waterfall = function (tasks, callback) { - if (!tasks.length) { - return callback(); - } - callback = callback || function () {}; - var wrapIterator = function (iterator) { - return function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - var args = Array.prototype.slice.call(arguments, 1); - var next = iterator.next(); - if (next) { - args.push(wrapIterator(next)); - } - else { - args.push(callback); - } - async.nextTick(function () { - iterator.apply(null, args); - }); - } - }; - }; - wrapIterator(async.iterator(tasks))(); - }; - - async.parallel = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - async.map(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args); - }); - } - }, callback); - } - else { - var results = {}; - async.forEach(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.series = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - async.mapSeries(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args); - }); - } - }, callback); - } - else { - var results = {}; - async.forEachSeries(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.iterator = function (tasks) { - var makeCallback = function (index) { - var fn = function () { - if (tasks.length) { - tasks[index].apply(null, arguments); - } - return fn.next(); - }; - fn.next = function () { - return (index < tasks.length - 1) ? makeCallback(index + 1): null; - }; - return fn; - }; - return makeCallback(0); - }; - - async.apply = function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - return function () { - return fn.apply( - null, args.concat(Array.prototype.slice.call(arguments)) - ); - }; - }; - - var _concat = function (eachfn, arr, fn, callback) { - var r = []; - eachfn(arr, function (x, cb) { - fn(x, function (err, y) { - r = r.concat(y || []); - cb(err); - }); - }, function (err) { - callback(err, r); - }); - }; - async.concat = doParallel(_concat); - async.concatSeries = doSeries(_concat); - - async.whilst = function (test, iterator, callback) { - if (test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.whilst(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.until = function (test, iterator, callback) { - if (!test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.until(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.queue = function (worker, concurrency) { - var workers = 0; - var tasks = []; - var q = { - concurrency: concurrency, - saturated: null, - empty: null, - drain: null, - push: function (data, callback) { - tasks.push({data: data, callback: callback}); - if(q.saturated && tasks.length == concurrency) q.saturated(); - async.nextTick(q.process); - }, - process: function () { - if (workers < q.concurrency && tasks.length) { - var task = tasks.splice(0, 1)[0]; - if(q.empty && tasks.length == 0) q.empty(); - workers += 1; - worker(task.data, function () { - workers -= 1; - if (task.callback) { - task.callback.apply(task, arguments); - } - if(q.drain && tasks.length + workers == 0) q.drain(); - q.process(); - }); - } - }, - length: function () { - return tasks.length; - }, - running: function () { - return workers; - } - }; - return q; - }; - - var _console_fn = function (name) { - return function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - fn.apply(null, args.concat([function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (typeof console !== 'undefined') { - if (err) { - if (console.error) { - console.error(err); - } - } - else if (console[name]) { - _forEach(args, function (x) { - console[name](x); - }); - } - } - }])); - }; - }; - async.log = _console_fn('log'); - async.dir = _console_fn('dir'); - /*async.info = _console_fn('info'); - async.warn = _console_fn('warn'); - async.error = _console_fn('error');*/ - - async.memoize = function (fn, hasher) { - var memo = {}; - hasher = hasher || function (x) { - return x; - }; - return function () { - var args = Array.prototype.slice.call(arguments); - var callback = args.pop(); - var key = hasher.apply(null, args); - if (key in memo) { - callback.apply(null, memo[key]); - } - else { - fn.apply(null, args.concat([function () { - memo[key] = arguments; - callback.apply(null, arguments); - }])); - } - }; - }; - -}()); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/nodelint.cfg b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/nodelint.cfg deleted file mode 100644 index 457a967..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/nodelint.cfg +++ /dev/null @@ -1,4 +0,0 @@ -var options = { - indent: 4, - onevar: false -}; diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/package.json b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/package.json deleted file mode 100644 index e5646d7..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/package.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "async", - "description": "Higher-order functions and common patterns for asynchronous code", - "main": "./index", - "author": { - "name": "Caolan McMahon" - }, - "version": "0.1.9", - "repository": { - "type": "git", - "url": "git://github.com/caolan/async.git" - }, - "bugs": { - "url": "http://github.com/caolan/async/issues" - }, - "licenses": [ - { - "type": "MIT", - "url": "http://github.com/caolan/async/raw/master/LICENSE" - } - ], - "_npmUser": { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - "_id": "async@0.1.9", - "dependencies": {}, - "devDependencies": {}, - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "_engineSupported": true, - "_npmVersion": "1.1.24", - "_nodeVersion": "v0.8.1", - "_defaultsLoaded": true, - "dist": { - "shasum": "fd9b6aca66495fd0f7e97f86e71c7706ca9ae754" - }, - "_from": "async@0.1.9" -} diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/.swp b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/.swp deleted file mode 100644 index ece9b6bb6a4f01d31a8613468ccc9244e256ea4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2y>1gh5XU!k2=O6!fx#G*1bfd;q(nN!t|DZl1PM@R*c9ixB|hhTd)%IJ+yq_& z3R-G9L;(dAk3r27P#`h8Hj0FhDR2|%Kho^%?9R;1{jOTw_FGTx@6)#25G>b(c>C(Z z{-Njzc}a*kGFg`WCKRNaX>-TxySGFHn-?2hK00ck)1V8`;KmY_l00ck)1pbRatF`szv%4rQ2h}JO z&i%`hkMQef!&#D>HT{)qIkZB`K-8$SMB#Eo565YIOg)_yA?@62cf$csiJIY&p>aV; zS`zJsiOzJTi5`We&Z7~}Y-mkcHTzSdlTe@N*jMYNNtz#pT-S?SSJF;oz2PRsbQbfN z^T_JwW1Yu3q^Bx4tT)t7Y)Y+euPUh$byuyaj_Nj)9PpNm{ZJJ3#yWe(d8R*fCe5FD z*G_m-$$oUq=Ctm6anI2SxelGUw*7iAFe4o-xY}N$2f8XJw40WE>)n)7+DmQ4?=>s* V?{PKv`7hd=TWkEtC4RDw_ysbD&=&vz diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/test-async.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/test-async.js deleted file mode 100644 index 8c2cebd..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/test-async.js +++ /dev/null @@ -1,1367 +0,0 @@ -var async = require('../lib/async'); - - -exports['auto'] = function(test){ - var callOrder = []; - var testdata = [{test: 'test'}]; - async.auto({ - task1: ['task2', function(callback){ - setTimeout(function(){ - callOrder.push('task1'); - callback(); - }, 25); - }], - task2: function(callback){ - setTimeout(function(){ - callOrder.push('task2'); - callback(); - }, 50); - }, - task3: ['task2', function(callback){ - callOrder.push('task3'); - callback(); - }], - task4: ['task1', 'task2', function(callback){ - callOrder.push('task4'); - callback(); - }] - }, - function(err){ - test.same(callOrder, ['task2','task3','task1','task4']); - test.done(); - }); -}; - -exports['auto empty object'] = function(test){ - async.auto({}, function(err){ - test.done(); - }); -}; - -exports['auto error'] = function(test){ - test.expect(1); - async.auto({ - task1: function(callback){ - callback('testerror'); - }, - task2: ['task1', function(callback){ - test.ok(false, 'task2 should not be called'); - callback(); - }], - task3: function(callback){ - callback('testerror2'); - } - }, - function(err){ - test.equals(err, 'testerror'); - }); - setTimeout(test.done, 100); -}; - -exports['auto no callback'] = function(test){ - async.auto({ - task1: function(callback){callback();}, - task2: ['task1', function(callback){callback(); test.done();}] - }); -}; - -exports['waterfall'] = function(test){ - test.expect(6); - var call_order = []; - async.waterfall([ - function(callback){ - call_order.push('fn1'); - setTimeout(function(){callback(null, 'one', 'two');}, 0); - }, - function(arg1, arg2, callback){ - call_order.push('fn2'); - test.equals(arg1, 'one'); - test.equals(arg2, 'two'); - setTimeout(function(){callback(null, arg1, arg2, 'three');}, 25); - }, - function(arg1, arg2, arg3, callback){ - call_order.push('fn3'); - test.equals(arg1, 'one'); - test.equals(arg2, 'two'); - test.equals(arg3, 'three'); - callback(null, 'four'); - }, - function(arg4, callback){ - call_order.push('fn4'); - test.same(call_order, ['fn1','fn2','fn3','fn4']); - callback(null, 'test'); - } - ], function(err){ - test.done(); - }); -}; - -exports['waterfall empty array'] = function(test){ - async.waterfall([], function(err){ - test.done(); - }); -}; - -exports['waterfall no callback'] = function(test){ - async.waterfall([ - function(callback){callback();}, - function(callback){callback(); test.done();} - ]); -}; - -exports['waterfall async'] = function(test){ - var call_order = []; - async.waterfall([ - function(callback){ - call_order.push(1); - callback(); - call_order.push(2); - }, - function(callback){ - call_order.push(3); - callback(); - }, - function(){ - test.same(call_order, [1,2,3]); - test.done(); - } - ]); -}; - -exports['waterfall error'] = function(test){ - test.expect(1); - async.waterfall([ - function(callback){ - callback('error'); - }, - function(callback){ - test.ok(false, 'next function should not be called'); - callback(); - } - ], function(err){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 50); -}; - -exports['waterfall multiple callback calls'] = function(test){ - var call_order = []; - var arr = [ - function(callback){ - call_order.push(1); - // call the callback twice. this should call function 2 twice - callback(null, 'one', 'two'); - callback(null, 'one', 'two'); - }, - function(arg1, arg2, callback){ - call_order.push(2); - callback(null, arg1, arg2, 'three'); - }, - function(arg1, arg2, arg3, callback){ - call_order.push(3); - callback(null, 'four'); - }, - function(arg4){ - call_order.push(4); - arr[3] = function(){ - call_order.push(4); - test.same(call_order, [1,2,2,3,3,4,4]); - test.done(); - }; - } - ]; - async.waterfall(arr); -}; - - -exports['parallel'] = function(test){ - var call_order = []; - async.parallel([ - function(callback){ - setTimeout(function(){ - call_order.push(1); - callback(null, 1); - }, 25); - }, - function(callback){ - setTimeout(function(){ - call_order.push(2); - callback(null, 2); - }, 50); - }, - function(callback){ - setTimeout(function(){ - call_order.push(3); - callback(null, 3,3); - }, 15); - } - ], - function(err, results){ - test.equals(err, null); - test.same(call_order, [3,1,2]); - test.same(results, [1,2,[3,3]]); - test.done(); - }); -}; - -exports['parallel empty array'] = function(test){ - async.parallel([], function(err, results){ - test.equals(err, null); - test.same(results, []); - test.done(); - }); -}; - -exports['parallel error'] = function(test){ - async.parallel([ - function(callback){ - callback('error', 1); - }, - function(callback){ - callback('error2', 2); - } - ], - function(err, results){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 100); -}; - -exports['parallel no callback'] = function(test){ - async.parallel([ - function(callback){callback();}, - function(callback){callback(); test.done();}, - ]); -}; - -exports['parallel object'] = function(test){ - var call_order = []; - async.parallel({ - one: function(callback){ - setTimeout(function(){ - call_order.push(1); - callback(null, 1); - }, 25); - }, - two: function(callback){ - setTimeout(function(){ - call_order.push(2); - callback(null, 2); - }, 50); - }, - three: function(callback){ - setTimeout(function(){ - call_order.push(3); - callback(null, 3,3); - }, 15); - } - }, - function(err, results){ - test.equals(err, null); - test.same(call_order, [3,1,2]); - test.same(results, { - one: 1, - two: 2, - three: [3,3] - }); - test.done(); - }); -}; - -exports['series'] = function(test){ - var call_order = []; - async.series([ - function(callback){ - setTimeout(function(){ - call_order.push(1); - callback(null, 1); - }, 25); - }, - function(callback){ - setTimeout(function(){ - call_order.push(2); - callback(null, 2); - }, 50); - }, - function(callback){ - setTimeout(function(){ - call_order.push(3); - callback(null, 3,3); - }, 15); - } - ], - function(err, results){ - test.equals(err, null); - test.same(results, [1,2,[3,3]]); - test.same(call_order, [1,2,3]); - test.done(); - }); -}; - -exports['series empty array'] = function(test){ - async.series([], function(err, results){ - test.equals(err, null); - test.same(results, []); - test.done(); - }); -}; - -exports['series error'] = function(test){ - test.expect(1); - async.series([ - function(callback){ - callback('error', 1); - }, - function(callback){ - test.ok(false, 'should not be called'); - callback('error2', 2); - } - ], - function(err, results){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 100); -}; - -exports['series no callback'] = function(test){ - async.series([ - function(callback){callback();}, - function(callback){callback(); test.done();}, - ]); -}; - -exports['series object'] = function(test){ - var call_order = []; - async.series({ - one: function(callback){ - setTimeout(function(){ - call_order.push(1); - callback(null, 1); - }, 25); - }, - two: function(callback){ - setTimeout(function(){ - call_order.push(2); - callback(null, 2); - }, 50); - }, - three: function(callback){ - setTimeout(function(){ - call_order.push(3); - callback(null, 3,3); - }, 15); - } - }, - function(err, results){ - test.equals(err, null); - test.same(results, { - one: 1, - two: 2, - three: [3,3] - }); - test.same(call_order, [1,2,3]); - test.done(); - }); -}; - -exports['iterator'] = function(test){ - var call_order = []; - var iterator = async.iterator([ - function(){call_order.push(1);}, - function(arg1){ - test.equals(arg1, 'arg1'); - call_order.push(2); - }, - function(arg1, arg2){ - test.equals(arg1, 'arg1'); - test.equals(arg2, 'arg2'); - call_order.push(3); - } - ]); - iterator(); - test.same(call_order, [1]); - var iterator2 = iterator(); - test.same(call_order, [1,1]); - var iterator3 = iterator2('arg1'); - test.same(call_order, [1,1,2]); - var iterator4 = iterator3('arg1', 'arg2'); - test.same(call_order, [1,1,2,3]); - test.equals(iterator4, undefined); - test.done(); -}; - -exports['iterator empty array'] = function(test){ - var iterator = async.iterator([]); - test.equals(iterator(), undefined); - test.equals(iterator.next(), undefined); - test.done(); -}; - -exports['iterator.next'] = function(test){ - var call_order = []; - var iterator = async.iterator([ - function(){call_order.push(1);}, - function(arg1){ - test.equals(arg1, 'arg1'); - call_order.push(2); - }, - function(arg1, arg2){ - test.equals(arg1, 'arg1'); - test.equals(arg2, 'arg2'); - call_order.push(3); - } - ]); - var fn = iterator.next(); - var iterator2 = fn('arg1'); - test.same(call_order, [2]); - iterator2('arg1','arg2'); - test.same(call_order, [2,3]); - test.equals(iterator2.next(), undefined); - test.done(); -}; - -exports['forEach'] = function(test){ - var args = []; - async.forEach([1,3,2], function(x, callback){ - setTimeout(function(){ - args.push(x); - callback(); - }, x*25); - }, function(err){ - test.same(args, [1,2,3]); - test.done(); - }); -}; - -exports['forEach empty array'] = function(test){ - test.expect(1); - async.forEach([], function(x, callback){ - test.ok(false, 'iterator should not be called'); - callback(); - }, function(err){ - test.ok(true, 'should call callback'); - }); - setTimeout(test.done, 25); -}; - -exports['forEach error'] = function(test){ - test.expect(1); - async.forEach([1,2,3], function(x, callback){ - callback('error'); - }, function(err){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 50); -}; - -exports['forEachSeries'] = function(test){ - var args = []; - async.forEachSeries([1,3,2], function(x, callback){ - setTimeout(function(){ - args.push(x); - callback(); - }, x*25); - }, function(err){ - test.same(args, [1,3,2]); - test.done(); - }); -}; - -exports['forEachSeries empty array'] = function(test){ - test.expect(1); - async.forEachSeries([], function(x, callback){ - test.ok(false, 'iterator should not be called'); - callback(); - }, function(err){ - test.ok(true, 'should call callback'); - }); - setTimeout(test.done, 25); -}; - -exports['forEachSeries error'] = function(test){ - test.expect(2); - var call_order = []; - async.forEachSeries([1,2,3], function(x, callback){ - call_order.push(x); - callback('error'); - }, function(err){ - test.same(call_order, [1]); - test.equals(err, 'error'); - }); - setTimeout(test.done, 50); -}; - -exports['map'] = function(test){ - var call_order = []; - async.map([1,3,2], function(x, callback){ - setTimeout(function(){ - call_order.push(x); - callback(null, x*2); - }, x*25); - }, function(err, results){ - test.same(call_order, [1,2,3]); - test.same(results, [2,6,4]); - test.done(); - }); -}; - -exports['map original untouched'] = function(test){ - var a = [1,2,3]; - async.map(a, function(x, callback){ - callback(null, x*2); - }, function(err, results){ - test.same(results, [2,4,6]); - test.same(a, [1,2,3]); - test.done(); - }); -}; - -exports['map error'] = function(test){ - test.expect(1); - async.map([1,2,3], function(x, callback){ - callback('error'); - }, function(err, results){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 50); -}; - -exports['mapSeries'] = function(test){ - var call_order = []; - async.mapSeries([1,3,2], function(x, callback){ - setTimeout(function(){ - call_order.push(x); - callback(null, x*2); - }, x*25); - }, function(err, results){ - test.same(call_order, [1,3,2]); - test.same(results, [2,6,4]); - test.done(); - }); -}; - -exports['mapSeries error'] = function(test){ - test.expect(1); - async.mapSeries([1,2,3], function(x, callback){ - callback('error'); - }, function(err, results){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 50); -}; - -exports['reduce'] = function(test){ - var call_order = []; - async.reduce([1,2,3], 0, function(a, x, callback){ - call_order.push(x); - callback(null, a + x); - }, function(err, result){ - test.equals(result, 6); - test.same(call_order, [1,2,3]); - test.done(); - }); -}; - -exports['reduce async with non-reference memo'] = function(test){ - async.reduce([1,3,2], 0, function(a, x, callback){ - setTimeout(function(){callback(null, a + x)}, Math.random()*100); - }, function(err, result){ - test.equals(result, 6); - test.done(); - }); -}; - -exports['reduce error'] = function(test){ - test.expect(1); - async.reduce([1,2,3], 0, function(a, x, callback){ - callback('error'); - }, function(err, result){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 50); -}; - -exports['inject alias'] = function(test){ - test.equals(async.inject, async.reduce); - test.done(); -}; - -exports['foldl alias'] = function(test){ - test.equals(async.foldl, async.reduce); - test.done(); -}; - -exports['reduceRight'] = function(test){ - var call_order = []; - var a = [1,2,3]; - async.reduceRight(a, 0, function(a, x, callback){ - call_order.push(x); - callback(null, a + x); - }, function(err, result){ - test.equals(result, 6); - test.same(call_order, [3,2,1]); - test.same(a, [1,2,3]); - test.done(); - }); -}; - -exports['foldr alias'] = function(test){ - test.equals(async.foldr, async.reduceRight); - test.done(); -}; - -exports['filter'] = function(test){ - async.filter([3,1,2], function(x, callback){ - setTimeout(function(){callback(x % 2);}, x*25); - }, function(results){ - test.same(results, [3,1]); - test.done(); - }); -}; - -exports['filter original untouched'] = function(test){ - var a = [3,1,2]; - async.filter(a, function(x, callback){ - callback(x % 2); - }, function(results){ - test.same(results, [3,1]); - test.same(a, [3,1,2]); - test.done(); - }); -}; - -exports['filterSeries'] = function(test){ - async.filterSeries([3,1,2], function(x, callback){ - setTimeout(function(){callback(x % 2);}, x*25); - }, function(results){ - test.same(results, [3,1]); - test.done(); - }); -}; - -exports['select alias'] = function(test){ - test.equals(async.select, async.filter); - test.done(); -}; - -exports['selectSeries alias'] = function(test){ - test.equals(async.selectSeries, async.filterSeries); - test.done(); -}; - -exports['reject'] = function(test){ - async.reject([3,1,2], function(x, callback){ - setTimeout(function(){callback(x % 2);}, x*25); - }, function(results){ - test.same(results, [2]); - test.done(); - }); -}; - -exports['reject original untouched'] = function(test){ - var a = [3,1,2]; - async.reject(a, function(x, callback){ - callback(x % 2); - }, function(results){ - test.same(results, [2]); - test.same(a, [3,1,2]); - test.done(); - }); -}; - -exports['rejectSeries'] = function(test){ - async.rejectSeries([3,1,2], function(x, callback){ - setTimeout(function(){callback(x % 2);}, x*25); - }, function(results){ - test.same(results, [2]); - test.done(); - }); -}; - -exports['some true'] = function(test){ - async.some([3,1,2], function(x, callback){ - setTimeout(function(){callback(x === 1);}, 0); - }, function(result){ - test.equals(result, true); - test.done(); - }); -}; - -exports['some false'] = function(test){ - async.some([3,1,2], function(x, callback){ - setTimeout(function(){callback(x === 10);}, 0); - }, function(result){ - test.equals(result, false); - test.done(); - }); -}; - -exports['some early return'] = function(test){ - var call_order = []; - async.some([1,2,3], function(x, callback){ - setTimeout(function(){ - call_order.push(x); - callback(x === 1); - }, x*25); - }, function(result){ - call_order.push('callback'); - }); - setTimeout(function(){ - test.same(call_order, [1,'callback',2,3]); - test.done(); - }, 100); -}; - -exports['any alias'] = function(test){ - test.equals(async.any, async.some); - test.done(); -}; - -exports['every true'] = function(test){ - async.every([1,2,3], function(x, callback){ - setTimeout(function(){callback(true);}, 0); - }, function(result){ - test.equals(result, true); - test.done(); - }); -}; - -exports['every false'] = function(test){ - async.every([1,2,3], function(x, callback){ - setTimeout(function(){callback(x % 2);}, 0); - }, function(result){ - test.equals(result, false); - test.done(); - }); -}; - -exports['every early return'] = function(test){ - var call_order = []; - async.every([1,2,3], function(x, callback){ - setTimeout(function(){ - call_order.push(x); - callback(x === 1); - }, x*25); - }, function(result){ - call_order.push('callback'); - }); - setTimeout(function(){ - test.same(call_order, [1,2,'callback',3]); - test.done(); - }, 100); -}; - -exports['all alias'] = function(test){ - test.equals(async.all, async.every); - test.done(); -}; - -exports['detect'] = function(test){ - var call_order = []; - async.detect([3,2,1], function(x, callback){ - setTimeout(function(){ - call_order.push(x); - callback(x == 2); - }, x*25); - }, function(result){ - call_order.push('callback'); - test.equals(result, 2); - }); - setTimeout(function(){ - test.same(call_order, [1,2,'callback',3]); - test.done(); - }, 100); -}; - -exports['detectSeries'] = function(test){ - var call_order = []; - async.detectSeries([3,2,1], function(x, callback){ - setTimeout(function(){ - call_order.push(x); - callback(x == 2); - }, x*25); - }, function(result){ - call_order.push('callback'); - test.equals(result, 2); - }); - setTimeout(function(){ - test.same(call_order, [3,2,'callback']); - test.done(); - }, 200); -}; - -exports['sortBy'] = function(test){ - async.sortBy([{a:1},{a:15},{a:6}], function(x, callback){ - setTimeout(function(){callback(null, x.a);}, 0); - }, function(err, result){ - test.same(result, [{a:1},{a:6},{a:15}]); - test.done(); - }); -}; - -exports['apply'] = function(test){ - test.expect(6); - var fn = function(){ - test.same(Array.prototype.slice.call(arguments), [1,2,3,4]) - }; - async.apply(fn, 1, 2, 3, 4)(); - async.apply(fn, 1, 2, 3)(4); - async.apply(fn, 1, 2)(3, 4); - async.apply(fn, 1)(2, 3, 4); - async.apply(fn)(1, 2, 3, 4); - test.equals( - async.apply(function(name){return 'hello ' + name}, 'world')(), - 'hello world' - ); - test.done(); -}; - - -// generates tests for console functions such as async.log -var console_fn_tests = function(name){ - - if (typeof console !== 'undefined') { - exports[name] = function(test){ - test.expect(5); - var fn = function(arg1, callback){ - test.equals(arg1, 'one'); - setTimeout(function(){callback(null, 'test');}, 0); - }; - var fn_err = function(arg1, callback){ - test.equals(arg1, 'one'); - setTimeout(function(){callback('error');}, 0); - }; - var _console_fn = console[name]; - var _error = console.error; - console[name] = function(val){ - test.equals(val, 'test'); - test.equals(arguments.length, 1); - console.error = function(val){ - test.equals(val, 'error'); - console[name] = _console_fn; - console.error = _error; - test.done(); - }; - async[name](fn_err, 'one'); - }; - async[name](fn, 'one'); - }; - - exports[name + ' with multiple result params'] = function(test){ - var fn = function(callback){callback(null,'one','two','three');}; - var _console_fn = console[name]; - var called_with = []; - console[name] = function(x){ - called_with.push(x); - }; - async[name](fn); - test.same(called_with, ['one','two','three']); - console[name] = _console_fn; - test.done(); - }; - } - - // browser-only test - exports[name + ' without console.' + name] = function(test){ - if (typeof window !== 'undefined') { - var _console = window.console; - window.console = undefined; - var fn = function(callback){callback(null, 'val');}; - var fn_err = function(callback){callback('error');}; - async[name](fn); - async[name](fn_err); - window.console = _console; - } - test.done(); - }; - -}; - -console_fn_tests('log'); -console_fn_tests('dir'); -/*console_fn_tests('info'); -console_fn_tests('warn'); -console_fn_tests('error');*/ - -exports['nextTick'] = function(test){ - var call_order = []; - async.nextTick(function(){call_order.push('two');}); - call_order.push('one'); - setTimeout(function(){ - test.same(call_order, ['one','two']); - test.done(); - }, 50); -}; - -exports['nextTick in the browser'] = function(test){ - if (typeof process !== 'undefined') { - // skip this test in node - return test.done(); - } - test.expect(1); - - var call_order = []; - async.nextTick(function(){call_order.push('two');}); - - call_order.push('one'); - setTimeout(function(){ - if (typeof process !== 'undefined') { - process.nextTick = _nextTick; - } - test.same(call_order, ['one','two']); - }, 50); - setTimeout(test.done, 100); -}; - -exports['noConflict - node only'] = function(test){ - if (typeof process !== 'undefined') { - // node only test - test.expect(3); - var fs = require('fs'); - var filename = __dirname + '/../lib/async.js'; - fs.readFile(filename, function(err, content){ - if(err) return test.done(); - var Script = process.binding('evals').Script; - - var s = new Script(content, filename); - var s2 = new Script( - content + 'this.async2 = this.async.noConflict();', - filename - ); - - var sandbox1 = {async: 'oldvalue'}; - s.runInNewContext(sandbox1); - test.ok(sandbox1.async); - - var sandbox2 = {async: 'oldvalue'}; - s2.runInNewContext(sandbox2); - test.equals(sandbox2.async, 'oldvalue'); - test.ok(sandbox2.async2); - - test.done(); - }); - } - else test.done(); -}; - -exports['concat'] = function(test){ - var call_order = []; - var iterator = function (x, cb) { - setTimeout(function(){ - call_order.push(x); - var r = []; - while (x > 0) { - r.push(x); - x--; - } - cb(null, r); - }, x*25); - }; - async.concat([1,3,2], iterator, function(err, results){ - test.same(results, [1,2,1,3,2,1]); - test.same(call_order, [1,2,3]); - test.ok(!err); - test.done(); - }); -}; - -exports['concat error'] = function(test){ - var iterator = function (x, cb) { - cb(new Error('test error')); - }; - async.concat([1,2,3], iterator, function(err, results){ - test.ok(err); - test.done(); - }); -}; - -exports['concatSeries'] = function(test){ - var call_order = []; - var iterator = function (x, cb) { - setTimeout(function(){ - call_order.push(x); - var r = []; - while (x > 0) { - r.push(x); - x--; - } - cb(null, r); - }, x*25); - }; - async.concatSeries([1,3,2], iterator, function(err, results){ - test.same(results, [1,3,2,1,2,1]); - test.same(call_order, [1,3,2]); - test.ok(!err); - test.done(); - }); -}; - -exports['until'] = function (test) { - var call_order = []; - - var count = 0; - async.until( - function () { - call_order.push(['test', count]); - return (count == 5); - }, - function (cb) { - call_order.push(['iterator', count]); - count++; - cb(); - }, - function (err) { - test.same(call_order, [ - ['test', 0], - ['iterator', 0], ['test', 1], - ['iterator', 1], ['test', 2], - ['iterator', 2], ['test', 3], - ['iterator', 3], ['test', 4], - ['iterator', 4], ['test', 5], - ]); - test.equals(count, 5); - test.done(); - } - ); -}; - -exports['whilst'] = function (test) { - var call_order = []; - - var count = 0; - async.whilst( - function () { - call_order.push(['test', count]); - return (count < 5); - }, - function (cb) { - call_order.push(['iterator', count]); - count++; - cb(); - }, - function (err) { - test.same(call_order, [ - ['test', 0], - ['iterator', 0], ['test', 1], - ['iterator', 1], ['test', 2], - ['iterator', 2], ['test', 3], - ['iterator', 3], ['test', 4], - ['iterator', 4], ['test', 5], - ]); - test.equals(count, 5); - test.done(); - } - ); -}; - -exports['queue'] = function (test) { - var call_order = [], - delays = [40,20,60,20]; - - // worker1: --1-4 - // worker2: -2---3 - // order of completion: 2,1,4,3 - - var q = async.queue(function (task, callback) { - setTimeout(function () { - call_order.push('process ' + task); - callback('error', 'arg'); - }, delays.splice(0,1)[0]); - }, 2); - - q.push(1, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 1); - call_order.push('callback ' + 1); - }); - q.push(2, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 2); - call_order.push('callback ' + 2); - }); - q.push(3, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 0); - call_order.push('callback ' + 3); - }); - q.push(4, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 0); - call_order.push('callback ' + 4); - }); - test.equal(q.length(), 4); - test.equal(q.concurrency, 2); - - setTimeout(function () { - test.same(call_order, [ - 'process 2', 'callback 2', - 'process 1', 'callback 1', - 'process 4', 'callback 4', - 'process 3', 'callback 3' - ]); - test.equal(q.concurrency, 2); - test.equal(q.length(), 0); - test.done(); - }, 200); -}; - -exports['queue changing concurrency'] = function (test) { - var call_order = [], - delays = [40,20,60,20]; - - // worker1: --1-2---3-4 - // order of completion: 1,2,3,4 - - var q = async.queue(function (task, callback) { - setTimeout(function () { - call_order.push('process ' + task); - callback('error', 'arg'); - }, delays.splice(0,1)[0]); - }, 2); - - q.push(1, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 3); - call_order.push('callback ' + 1); - }); - q.push(2, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 2); - call_order.push('callback ' + 2); - }); - q.push(3, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 1); - call_order.push('callback ' + 3); - }); - q.push(4, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 0); - call_order.push('callback ' + 4); - }); - test.equal(q.length(), 4); - test.equal(q.concurrency, 2); - q.concurrency = 1; - - setTimeout(function () { - test.same(call_order, [ - 'process 1', 'callback 1', - 'process 2', 'callback 2', - 'process 3', 'callback 3', - 'process 4', 'callback 4' - ]); - test.equal(q.concurrency, 1); - test.equal(q.length(), 0); - test.done(); - }, 250); -}; - -exports['queue push without callback'] = function (test) { - var call_order = [], - delays = [40,20,60,20]; - - // worker1: --1-4 - // worker2: -2---3 - // order of completion: 2,1,4,3 - - var q = async.queue(function (task, callback) { - setTimeout(function () { - call_order.push('process ' + task); - callback('error', 'arg'); - }, delays.splice(0,1)[0]); - }, 2); - - q.push(1); - q.push(2); - q.push(3); - q.push(4); - - setTimeout(function () { - test.same(call_order, [ - 'process 2', - 'process 1', - 'process 4', - 'process 3' - ]); - test.done(); - }, 200); -}; - -exports['memoize'] = function (test) { - test.expect(4); - var call_order = []; - - var fn = function (arg1, arg2, callback) { - call_order.push(['fn', arg1, arg2]); - callback(null, arg1 + arg2); - }; - - var fn2 = async.memoize(fn); - fn2(1, 2, function (err, result) { - test.equal(result, 3); - }); - fn2(1, 2, function (err, result) { - test.equal(result, 3); - }); - fn2(2, 2, function (err, result) { - test.equal(result, 4); - }); - - test.same(call_order, [['fn',1,2], ['fn',2,2]]); - test.done(); -}; - -exports['memoize error'] = function (test) { - test.expect(1); - var testerr = new Error('test'); - var fn = function (arg1, arg2, callback) { - callback(testerr, arg1 + arg2); - }; - async.memoize(fn)(1, 2, function (err, result) { - test.equal(err, testerr); - }); - test.done(); -}; - -exports['memoize custom hash function'] = function (test) { - test.expect(2); - var testerr = new Error('test'); - - var fn = function (arg1, arg2, callback) { - callback(testerr, arg1 + arg2); - }; - var fn2 = async.memoize(fn, function () { - return 'custom hash'; - }); - fn2(1, 2, function (err, result) { - test.equal(result, 3); - }); - fn2(2, 2, function (err, result) { - test.equal(result, 3); - }); - test.done(); -}; - -// Issue 10 on github: https://github.com/caolan/async/issues#issue/10 -exports['falsy return values in series'] = function (test) { - function taskFalse(callback) { - async.nextTick(function() { - callback(null, false); - }); - }; - function taskUndefined(callback) { - async.nextTick(function() { - callback(null, undefined); - }); - }; - function taskEmpty(callback) { - async.nextTick(function() { - callback(null); - }); - }; - function taskNull(callback) { - async.nextTick(function() { - callback(null, null); - }); - }; - async.series( - [taskFalse, taskUndefined, taskEmpty, taskNull], - function(err, results) { - test.same(results, [false, undefined, undefined, null]); - test.strictEqual(results[0], false); - test.strictEqual(results[1], undefined); - test.strictEqual(results[2], undefined); - test.strictEqual(results[3], null); - test.done(); - } - ); -}; - -// Issue 10 on github: https://github.com/caolan/async/issues#issue/10 -exports['falsy return values in parallel'] = function (test) { - function taskFalse(callback) { - async.nextTick(function() { - callback(null, false); - }); - }; - function taskUndefined(callback) { - async.nextTick(function() { - callback(null, undefined); - }); - }; - function taskEmpty(callback) { - async.nextTick(function() { - callback(null); - }); - }; - function taskNull(callback) { - async.nextTick(function() { - callback(null, null); - }); - }; - async.parallel( - [taskFalse, taskUndefined, taskEmpty, taskNull], - function(err, results) { - test.same(results, [false, undefined, undefined, null]); - test.strictEqual(results[0], false); - test.strictEqual(results[1], undefined); - test.strictEqual(results[2], undefined); - test.strictEqual(results[3], null); - test.done(); - } - ); -}; - -exports['queue events'] = function(test) { - var calls = []; - var q = async.queue(function(task, cb) { - // nop - calls.push('process ' + task); - cb(); - }, 3); - - q.saturated = function() { - test.ok(q.length() == 3, 'queue should be saturated now'); - calls.push('saturated'); - }; - q.empty = function() { - test.ok(q.length() == 0, 'queue should be empty now'); - calls.push('empty'); - }; - q.drain = function() { - test.ok( - q.length() == 0 && q.running() == 0, - 'queue should be empty now and no more workers should be running' - ); - calls.push('drain'); - test.same(calls, [ - 'saturated', - 'process foo', - 'foo cb', - 'process bar', - 'bar cb', - 'process zoo', - 'zoo cb', - 'process poo', - 'poo cb', - 'empty', - 'process moo', - 'moo cb', - 'drain', - ]); - test.done(); - }; - q.push('foo', function () {calls.push('foo cb');}); - q.push('bar', function () {calls.push('bar cb');}); - q.push('zoo', function () {calls.push('zoo cb');}); - q.push('poo', function () {calls.push('poo cb');}); - q.push('moo', function () {calls.push('moo cb');}); -}; diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/test.html b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/test.html deleted file mode 100644 index 2450e2d..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/async/test/test.html +++ /dev/null @@ -1,24 +0,0 @@ - - - Async.js Test Suite - - - - - - - - -

      Async.js Test Suite

      - - - diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/.npmignore b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/.npmignore deleted file mode 100644 index aba34f0..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -*.un~ -/node_modules -/test/tmp diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/License b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/License deleted file mode 100644 index 4804b7a..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/License +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2011 Debuggable Limited - -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. diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/Makefile b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/Makefile deleted file mode 100644 index b4ff85a..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -SHELL := /bin/bash - -test: - @./test/run.js - -.PHONY: test - diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md deleted file mode 100644 index 1a9999e..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md +++ /dev/null @@ -1,132 +0,0 @@ -# combined-stream - -A stream that emits multiple other streams one after another. - -## Installation - -``` bash -npm install combined-stream -``` - -## Usage - -Here is a simple example that shows how you can use combined-stream to combine -two files into one: - -``` javascript -var CombinedStream = require('combined-stream'); -var fs = require('fs'); - -var combinedStream = CombinedStream.create(); -combinedStream.append(fs.createReadStream('file1.txt')); -combinedStream.append(fs.createReadStream('file2.txt')); - -combinedStream.pipe(fs.createWriteStream('combined.txt')); -``` - -While the example above works great, it will pause all source streams until -they are needed. If you don't want that to happen, you can set `pauseStreams` -to `false`: - -``` javascript -var CombinedStream = require('combined-stream'); -var fs = require('fs'); - -var combinedStream = CombinedStream.create({pauseStreams: false}); -combinedStream.append(fs.createReadStream('file1.txt')); -combinedStream.append(fs.createReadStream('file2.txt')); - -combinedStream.pipe(fs.createWriteStream('combined.txt')); -``` - -However, what if you don't have all the source streams yet, or you don't want -to allocate the resources (file descriptors, memory, etc.) for them right away? -Well, in that case you can simply provide a callback that supplies the stream -by calling a `next()` function: - -``` javascript -var CombinedStream = require('combined-stream'); -var fs = require('fs'); - -var combinedStream = CombinedStream.create(); -combinedStream.append(function(next) { - next(fs.createReadStream('file1.txt')); -}); -combinedStream.append(function(next) { - next(fs.createReadStream('file2.txt')); -}); - -combinedStream.pipe(fs.createWriteStream('combined.txt')); -``` - -## API - -### CombinedStream.create([options]) - -Returns a new combined stream object. Available options are: - -* `maxDataSize` -* `pauseStreams` - -The effect of those options is described below. - -### combinedStream.pauseStreams = true - -Whether to apply back pressure to the underlaying streams. If set to `false`, -the underlaying streams will never be paused. If set to `true`, the -underlaying streams will be paused right after being appended, as well as when -`delayedStream.pipe()` wants to throttle. - -### combinedStream.maxDataSize = 2 * 1024 * 1024 - -The maximum amount of bytes (or characters) to buffer for all source streams. -If this value is exceeded, `combinedStream` emits an `'error'` event. - -### combinedStream.dataSize = 0 - -The amount of bytes (or characters) currently buffered by `combinedStream`. - -### combinedStream.append(stream) - -Appends the given `stream` to the combinedStream object. If `pauseStreams` is -set to `true, this stream will also be paused right away. - -`streams` can also be a function that takes one parameter called `next`. `next` -is a function that must be invoked in order to provide the `next` stream, see -example above. - -Regardless of how the `stream` is appended, combined-stream always attaches an -`'error'` listener to it, so you don't have to do that manually. - -Special case: `stream` can also be a String or Buffer. - -### combinedStream.write(data) - -You should not call this, `combinedStream` takes care of piping the appended -streams into itself for you. - -### combinedStream.resume() - -Causes `combinedStream` to start drain the streams it manages. The function is -idempotent, and also emits a `'resume'` event each time which usually goes to -the stream that is currently being drained. - -### combinedStream.pause(); - -If `combinedStream.pauseStreams` is set to `false`, this does nothing. -Otherwise a `'pause'` event is emitted, this goes to the stream that is -currently being drained, so you can use it to apply back pressure. - -### combinedStream.end(); - -Sets `combinedStream.writable` to false, emits an `'end'` event, and removes -all streams from the queue. - -### combinedStream.destroy(); - -Same as `combinedStream.end()`, except it emits a `'close'` event instead of -`'end'`. - -## License - -combined-stream is licensed under the MIT license. diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js deleted file mode 100644 index 03754e6..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js +++ /dev/null @@ -1,183 +0,0 @@ -var util = require('util'); -var Stream = require('stream').Stream; -var DelayedStream = require('delayed-stream'); - -module.exports = CombinedStream; -function CombinedStream() { - this.writable = false; - this.readable = true; - this.dataSize = 0; - this.maxDataSize = 2 * 1024 * 1024; - this.pauseStreams = true; - - this._released = false; - this._streams = []; - this._currentStream = null; -} -util.inherits(CombinedStream, Stream); - -CombinedStream.create = function(options) { - var combinedStream = new this(); - - options = options || {}; - for (var option in options) { - combinedStream[option] = options[option]; - } - - return combinedStream; -}; - -CombinedStream.isStreamLike = function(stream) { - return (typeof stream !== 'function') - && (typeof stream !== 'string') - && (!Buffer.isBuffer(stream)); -}; - -CombinedStream.prototype.append = function(stream) { - var isStreamLike = CombinedStream.isStreamLike(stream); - - if (isStreamLike) { - if (!(stream instanceof DelayedStream)) { - stream.on('data', this._checkDataSize.bind(this)); - - stream = DelayedStream.create(stream, { - maxDataSize: Infinity, - pauseStream: this.pauseStreams, - }); - } - - this._handleErrors(stream); - - if (this.pauseStreams) { - stream.pause(); - } - } - - this._streams.push(stream); - return this; -}; - -CombinedStream.prototype.pipe = function(dest, options) { - Stream.prototype.pipe.call(this, dest, options); - this.resume(); -}; - -CombinedStream.prototype._getNext = function() { - this._currentStream = null; - var stream = this._streams.shift(); - - - if (!stream) { - this.end(); - return; - } - - if (typeof stream !== 'function') { - this._pipeNext(stream); - return; - } - - var getStream = stream; - getStream(function(stream) { - var isStreamLike = CombinedStream.isStreamLike(stream); - if (isStreamLike) { - stream.on('data', this._checkDataSize.bind(this)); - this._handleErrors(stream); - } - - this._pipeNext(stream); - }.bind(this)); -}; - -CombinedStream.prototype._pipeNext = function(stream) { - this._currentStream = stream; - - var isStreamLike = CombinedStream.isStreamLike(stream); - if (isStreamLike) { - stream.on('end', this._getNext.bind(this)) - stream.pipe(this, {end: false}); - return; - } - - var value = stream; - this.write(value); - this._getNext(); -}; - -CombinedStream.prototype._handleErrors = function(stream) { - var self = this; - stream.on('error', function(err) { - self._emitError(err); - }); -}; - -CombinedStream.prototype.write = function(data) { - this.emit('data', data); -}; - -CombinedStream.prototype.pause = function() { - if (!this.pauseStreams) { - return; - } - - this.emit('pause'); -}; - -CombinedStream.prototype.resume = function() { - if (!this._released) { - this._released = true; - this.writable = true; - this._getNext(); - } - - this.emit('resume'); -}; - -CombinedStream.prototype.end = function() { - this._reset(); - this.emit('end'); -}; - -CombinedStream.prototype.destroy = function() { - this._reset(); - this.emit('close'); -}; - -CombinedStream.prototype._reset = function() { - this.writable = false; - this._streams = []; - this._currentStream = null; -}; - -CombinedStream.prototype._checkDataSize = function() { - this._updateDataSize(); - if (this.dataSize <= this.maxDataSize) { - return; - } - - var message = - 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.' - this._emitError(new Error(message)); -}; - -CombinedStream.prototype._updateDataSize = function() { - this.dataSize = 0; - - var self = this; - this._streams.forEach(function(stream) { - if (!stream.dataSize) { - return; - } - - self.dataSize += stream.dataSize; - }); - - if (this._currentStream && this._currentStream.dataSize) { - this.dataSize += this._currentStream.dataSize; - } -}; - -CombinedStream.prototype._emitError = function(err) { - this._reset(); - this.emit('error', err); -}; diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore deleted file mode 100644 index 2fedb26..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -*.un~ -/node_modules/* diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License deleted file mode 100644 index 4804b7a..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2011 Debuggable Limited - -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. diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile deleted file mode 100644 index b4ff85a..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -SHELL := /bin/bash - -test: - @./test/run.js - -.PHONY: test - diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md deleted file mode 100644 index 5cb5b35..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md +++ /dev/null @@ -1,154 +0,0 @@ -# delayed-stream - -Buffers events from a stream until you are ready to handle them. - -## Installation - -``` bash -npm install delayed-stream -``` - -## Usage - -The following example shows how to write a http echo server that delays its -response by 1000 ms. - -``` javascript -var DelayedStream = require('delayed-stream'); -var http = require('http'); - -http.createServer(function(req, res) { - var delayed = DelayedStream.create(req); - - setTimeout(function() { - res.writeHead(200); - delayed.pipe(res); - }, 1000); -}); -``` - -If you are not using `Stream#pipe`, you can also manually release the buffered -events by calling `delayedStream.resume()`: - -``` javascript -var delayed = DelayedStream.create(req); - -setTimeout(function() { - // Emit all buffered events and resume underlaying source - delayed.resume(); -}, 1000); -``` - -## Implementation - -In order to use this meta stream properly, here are a few things you should -know about the implementation. - -### Event Buffering / Proxying - -All events of the `source` stream are hijacked by overwriting the `source.emit` -method. Until node implements a catch-all event listener, this is the only way. - -However, delayed-stream still continues to emit all events it captures on the -`source`, regardless of whether you have released the delayed stream yet or -not. - -Upon creation, delayed-stream captures all `source` events and stores them in -an internal event buffer. Once `delayedStream.release()` is called, all -buffered events are emitted on the `delayedStream`, and the event buffer is -cleared. After that, delayed-stream merely acts as a proxy for the underlaying -source. - -### Error handling - -Error events on `source` are buffered / proxied just like any other events. -However, `delayedStream.create` attaches a no-op `'error'` listener to the -`source`. This way you only have to handle errors on the `delayedStream` -object, rather than in two places. - -### Buffer limits - -delayed-stream provides a `maxDataSize` property that can be used to limit -the amount of data being buffered. In order to protect you from bad `source` -streams that don't react to `source.pause()`, this feature is enabled by -default. - -## API - -### DelayedStream.create(source, [options]) - -Returns a new `delayedStream`. Available options are: - -* `pauseStream` -* `maxDataSize` - -The description for those properties can be found below. - -### delayedStream.source - -The `source` stream managed by this object. This is useful if you are -passing your `delayedStream` around, and you still want to access properties -on the `source` object. - -### delayedStream.pauseStream = true - -Whether to pause the underlaying `source` when calling -`DelayedStream.create()`. Modifying this property afterwards has no effect. - -### delayedStream.maxDataSize = 1024 * 1024 - -The amount of data to buffer before emitting an `error`. - -If the underlaying source is emitting `Buffer` objects, the `maxDataSize` -refers to bytes. - -If the underlaying source is emitting JavaScript strings, the size refers to -characters. - -If you know what you are doing, you can set this property to `Infinity` to -disable this feature. You can also modify this property during runtime. - -### delayedStream.maxDataSize = 1024 * 1024 - -The amount of data to buffer before emitting an `error`. - -If the underlaying source is emitting `Buffer` objects, the `maxDataSize` -refers to bytes. - -If the underlaying source is emitting JavaScript strings, the size refers to -characters. - -If you know what you are doing, you can set this property to `Infinity` to -disable this feature. - -### delayedStream.dataSize = 0 - -The amount of data buffered so far. - -### delayedStream.readable - -An ECMA5 getter that returns the value of `source.readable`. - -### delayedStream.resume() - -If the `delayedStream` has not been released so far, `delayedStream.release()` -is called. - -In either case, `source.resume()` is called. - -### delayedStream.pause() - -Calls `source.pause()`. - -### delayedStream.pipe(dest) - -Calls `delayedStream.resume()` and then proxies the arguments to `source.pipe`. - -### delayedStream.release() - -Emits and clears all events that have been buffered up so far. This does not -resume the underlaying source, use `delayedStream.resume()` instead. - -## License - -delayed-stream is licensed under the MIT license. diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js deleted file mode 100644 index 7c10d48..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js +++ /dev/null @@ -1,99 +0,0 @@ -var Stream = require('stream').Stream; -var util = require('util'); - -module.exports = DelayedStream; -function DelayedStream() { - this.source = null; - this.dataSize = 0; - this.maxDataSize = 1024 * 1024; - this.pauseStream = true; - - this._maxDataSizeExceeded = false; - this._released = false; - this._bufferedEvents = []; -} -util.inherits(DelayedStream, Stream); - -DelayedStream.create = function(source, options) { - var delayedStream = new this(); - - options = options || {}; - for (var option in options) { - delayedStream[option] = options[option]; - } - - delayedStream.source = source; - - var realEmit = source.emit; - source.emit = function() { - delayedStream._handleEmit(arguments); - return realEmit.apply(source, arguments); - }; - - source.on('error', function() {}); - if (delayedStream.pauseStream) { - source.pause(); - } - - return delayedStream; -}; - -DelayedStream.prototype.__defineGetter__('readable', function() { - return this.source.readable; -}); - -DelayedStream.prototype.resume = function() { - if (!this._released) { - this.release(); - } - - this.source.resume(); -}; - -DelayedStream.prototype.pause = function() { - this.source.pause(); -}; - -DelayedStream.prototype.release = function() { - this._released = true; - - this._bufferedEvents.forEach(function(args) { - this.emit.apply(this, args); - }.bind(this)); - this._bufferedEvents = []; -}; - -DelayedStream.prototype.pipe = function() { - var r = Stream.prototype.pipe.apply(this, arguments); - this.resume(); - return r; -}; - -DelayedStream.prototype._handleEmit = function(args) { - if (this._released) { - this.emit.apply(this, args); - return; - } - - if (args[0] === 'data') { - this.dataSize += args[1].length; - this._checkIfMaxDataSizeExceeded(); - } - - this._bufferedEvents.push(args); -}; - -DelayedStream.prototype._checkIfMaxDataSizeExceeded = function() { - if (this._maxDataSizeExceeded) { - return; - } - - if (this.dataSize <= this.maxDataSize) { - return; - } - - this._maxDataSizeExceeded = true; - var message = - 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.' - this.emit('error', new Error(message)); -}; diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json deleted file mode 100644 index d394b92..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "author": { - "name": "Felix Geisendörfer", - "email": "felix@debuggable.com", - "url": "http://debuggable.com/" - }, - "name": "delayed-stream", - "description": "Buffers events from a stream until you are ready to handle them.", - "version": "0.0.5", - "homepage": "https://github.com/felixge/node-delayed-stream", - "repository": { - "type": "git", - "url": "git://github.com/felixge/node-delayed-stream.git" - }, - "main": "./lib/delayed_stream", - "engines": { - "node": ">=0.4.0" - }, - "dependencies": {}, - "devDependencies": { - "fake": "0.2.0", - "far": "0.0.1" - }, - "_npmUser": { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - "_id": "delayed-stream@0.0.5", - "optionalDependencies": {}, - "_engineSupported": true, - "_npmVersion": "1.1.24", - "_nodeVersion": "v0.8.1", - "_defaultsLoaded": true, - "dist": { - "shasum": "56f46a53506f656e1a549c63d8794c6cf8b6e1fc" - }, - "_from": "delayed-stream@0.0.5" -} diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js deleted file mode 100644 index 4d71b8a..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js +++ /dev/null @@ -1,6 +0,0 @@ -var common = module.exports; - -common.DelayedStream = require('..'); -common.assert = require('assert'); -common.fake = require('fake'); -common.PORT = 49252; diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js deleted file mode 100644 index 9ecad5b..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js +++ /dev/null @@ -1,38 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var DelayedStream = common.DelayedStream; -var http = require('http'); - -var UPLOAD = new Buffer(10 * 1024 * 1024); - -var server = http.createServer(function(req, res) { - var delayed = DelayedStream.create(req, {maxDataSize: UPLOAD.length}); - - setTimeout(function() { - res.writeHead(200); - delayed.pipe(res); - }, 10); -}); -server.listen(common.PORT, function() { - var request = http.request({ - method: 'POST', - port: common.PORT, - }); - - request.write(UPLOAD); - request.end(); - - request.on('response', function(res) { - var received = 0; - res - .on('data', function(chunk) { - received += chunk.length; - }) - .on('end', function() { - assert.equal(received, UPLOAD.length); - server.close(); - }); - }); -}); - - diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js deleted file mode 100644 index 6f417f3..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js +++ /dev/null @@ -1,21 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testAutoPause() { - var source = new Stream(); - - fake.expect(source, 'pause', 1); - var delayedStream = DelayedStream.create(source); - fake.verify(); -})(); - -(function testDisableAutoPause() { - var source = new Stream(); - fake.expect(source, 'pause', 0); - - var delayedStream = DelayedStream.create(source, {pauseStream: false}); - fake.verify(); -})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js deleted file mode 100644 index b50c397..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js +++ /dev/null @@ -1,14 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testDelayEventsUntilResume() { - var source = new Stream(); - var delayedStream = DelayedStream.create(source, {pauseStream: false}); - - fake.expect(source, 'pause'); - delayedStream.pause(); - fake.verify(); -})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js deleted file mode 100644 index fc4047e..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js +++ /dev/null @@ -1,48 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testDelayEventsUntilResume() { - var source = new Stream(); - var delayedStream = DelayedStream.create(source, {pauseStream: false}); - - // delayedStream must not emit until we resume - fake.expect(delayedStream, 'emit', 0); - - // but our original source must emit - var params = []; - source.on('foo', function(param) { - params.push(param); - }); - - source.emit('foo', 1); - source.emit('foo', 2); - - // Make sure delayedStream did not emit, and source did - assert.deepEqual(params, [1, 2]); - fake.verify(); - - // After resume, delayedStream must playback all events - fake - .stub(delayedStream, 'emit') - .times(Infinity) - .withArg(1, 'newListener'); - fake.expect(delayedStream, 'emit', ['foo', 1]); - fake.expect(delayedStream, 'emit', ['foo', 2]); - fake.expect(source, 'resume'); - - delayedStream.resume(); - fake.verify(); - - // Calling resume again will delegate to source - fake.expect(source, 'resume'); - delayedStream.resume(); - fake.verify(); - - // Emitting more events directly leads to them being emitted - fake.expect(delayedStream, 'emit', ['foo', 3]); - source.emit('foo', 3); - fake.verify(); -})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js deleted file mode 100644 index a9d35e7..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js +++ /dev/null @@ -1,15 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testHandleSourceErrors() { - var source = new Stream(); - var delayedStream = DelayedStream.create(source, {pauseStream: false}); - - // We deal with this by attaching a no-op listener to 'error' on the source - // when creating a new DelayedStream. This way error events on the source - // won't throw. - source.emit('error', new Error('something went wrong')); -})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js deleted file mode 100644 index 7638a2b..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js +++ /dev/null @@ -1,18 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testMaxDataSize() { - var source = new Stream(); - var delayedStream = DelayedStream.create(source, {maxDataSize: 1024, pauseStream: false}); - - source.emit('data', new Buffer(1024)); - - fake - .expect(delayedStream, 'emit') - .withArg(1, 'error'); - source.emit('data', new Buffer(1)); - fake.verify(); -})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js deleted file mode 100644 index 7d312ab..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js +++ /dev/null @@ -1,13 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testPipeReleases() { - var source = new Stream(); - var delayedStream = DelayedStream.create(source, {pauseStream: false}); - - fake.expect(delayedStream, 'resume'); - delayedStream.pipe(new Stream()); -})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js deleted file mode 100644 index d436163..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js +++ /dev/null @@ -1,13 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testProxyReadableProperty() { - var source = new Stream(); - var delayedStream = DelayedStream.create(source, {pauseStream: false}); - - source.readable = fake.value('source.readable'); - assert.strictEqual(delayedStream.readable, source.readable); -})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js deleted file mode 100755 index 0bb8e82..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env node -var far = require('far').create(); - -far.add(__dirname); -far.include(/test-.*\.js$/); - -far.execute(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json deleted file mode 100644 index 7bb0fcf..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "author": { - "name": "Felix Geisendörfer", - "email": "felix@debuggable.com", - "url": "http://debuggable.com/" - }, - "name": "combined-stream", - "description": "A stream that emits multiple other streams one after another.", - "version": "0.0.3", - "homepage": "https://github.com/felixge/node-combined-stream", - "repository": { - "type": "git", - "url": "git://github.com/felixge/node-combined-stream.git" - }, - "main": "./lib/combined_stream", - "engines": { - "node": "*" - }, - "dependencies": { - "delayed-stream": "0.0.5" - }, - "devDependencies": { - "far": "0.0.1" - }, - "_npmUser": { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - "_id": "combined-stream@0.0.3", - "optionalDependencies": {}, - "_engineSupported": true, - "_npmVersion": "1.1.24", - "_nodeVersion": "v0.8.1", - "_defaultsLoaded": true, - "dist": { - "shasum": "c41c9899277b587901bb6ce4bf458b94693afafa" - }, - "_from": "combined-stream@0.0.3" -} diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/common.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/common.js deleted file mode 100644 index aa9ab3a..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/common.js +++ /dev/null @@ -1,12 +0,0 @@ -var common = module.exports; - -var path = require('path'); -var root = path.join(__dirname, '..'); - -common.dir = { - fixture: root + '/test/fixture', - tmp: root + '/test/tmp', -}; - -common.CombinedStream = require(root); -common.assert = require('assert'); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file1.txt b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file1.txt deleted file mode 100644 index 50e0218..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file1.txt +++ /dev/null @@ -1,256 +0,0 @@ -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file2.txt b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file2.txt deleted file mode 100644 index da1d821..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file2.txt +++ /dev/null @@ -1,256 +0,0 @@ -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-callback-streams.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-callback-streams.js deleted file mode 100644 index 44ecaba..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-callback-streams.js +++ /dev/null @@ -1,27 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var CombinedStream = common.CombinedStream; -var fs = require('fs'); - -var FILE1 = common.dir.fixture + '/file1.txt'; -var FILE2 = common.dir.fixture + '/file2.txt'; -var EXPECTED = fs.readFileSync(FILE1) + fs.readFileSync(FILE2); - -(function testDelayedStreams() { - var combinedStream = CombinedStream.create(); - combinedStream.append(function(next) { - next(fs.createReadStream(FILE1)); - }); - combinedStream.append(function(next) { - next(fs.createReadStream(FILE2)); - }); - - var tmpFile = common.dir.tmp + '/combined.txt'; - var dest = fs.createWriteStream(tmpFile); - combinedStream.pipe(dest); - - dest.on('end', function() { - var written = fs.readFileSync(tmpFile, 'utf8'); - assert.strictEqual(written, EXPECTED); - }); -})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-data-size.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-data-size.js deleted file mode 100644 index e3fbd18..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-data-size.js +++ /dev/null @@ -1,34 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var CombinedStream = common.CombinedStream; - -(function testDataSizeGetter() { - var combinedStream = CombinedStream.create(); - - assert.strictEqual(combinedStream.dataSize, 0); - - // Test one stream - combinedStream._streams.push({dataSize: 10}); - combinedStream._updateDataSize(); - assert.strictEqual(combinedStream.dataSize, 10); - - // Test two streams - combinedStream._streams.push({dataSize: 23}); - combinedStream._updateDataSize(); - assert.strictEqual(combinedStream.dataSize, 33); - - // Test currentStream - combinedStream._currentStream = {dataSize: 20}; - combinedStream._updateDataSize(); - assert.strictEqual(combinedStream.dataSize, 53); - - // Test currentStream without dataSize - combinedStream._currentStream = {}; - combinedStream._updateDataSize(); - assert.strictEqual(combinedStream.dataSize, 33); - - // Test stream function - combinedStream._streams.push(function() {}); - combinedStream._updateDataSize(); - assert.strictEqual(combinedStream.dataSize, 33); -})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams-and-buffers-and-strings.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams-and-buffers-and-strings.js deleted file mode 100644 index c678575..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams-and-buffers-and-strings.js +++ /dev/null @@ -1,38 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var CombinedStream = common.CombinedStream; -var fs = require('fs'); - -var FILE1 = common.dir.fixture + '/file1.txt'; -var BUFFER = new Buffer('Bacon is delicious'); -var FILE2 = common.dir.fixture + '/file2.txt'; -var STRING = 'The € kicks the $\'s ass!'; - -var EXPECTED = - fs.readFileSync(FILE1) - + BUFFER - + fs.readFileSync(FILE2) - + STRING; -var GOT; - -(function testDelayedStreams() { - var combinedStream = CombinedStream.create(); - combinedStream.append(fs.createReadStream(FILE1)); - combinedStream.append(BUFFER); - combinedStream.append(fs.createReadStream(FILE2)); - combinedStream.append(function(next) { - next(STRING); - }); - - var tmpFile = common.dir.tmp + '/combined-file1-buffer-file2-string.txt'; - var dest = fs.createWriteStream(tmpFile); - combinedStream.pipe(dest); - - dest.on('close', function() { - GOT = fs.readFileSync(tmpFile, 'utf8'); - }); -})(); - -process.on('exit', function() { - assert.strictEqual(GOT, EXPECTED); -}); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams.js deleted file mode 100644 index 263cfdf..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams.js +++ /dev/null @@ -1,35 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var CombinedStream = common.CombinedStream; -var fs = require('fs'); - -var FILE1 = common.dir.fixture + '/file1.txt'; -var FILE2 = common.dir.fixture + '/file2.txt'; -var EXPECTED = fs.readFileSync(FILE1) + fs.readFileSync(FILE2); -var GOT; - -(function testDelayedStreams() { - var combinedStream = CombinedStream.create(); - combinedStream.append(fs.createReadStream(FILE1)); - combinedStream.append(fs.createReadStream(FILE2)); - - var stream1 = combinedStream._streams[0]; - var stream2 = combinedStream._streams[1]; - - stream1.on('end', function() { - assert.equal(stream2.dataSize, 0); - }); - - var tmpFile = common.dir.tmp + '/combined.txt'; - var dest = fs.createWriteStream(tmpFile); - combinedStream.pipe(dest); - - dest.on('close', function() { - GOT = fs.readFileSync(tmpFile, 'utf8'); - }); -})(); - -process.on('exit', function() { - console.error(GOT.length, EXPECTED.length); - assert.strictEqual(GOT, EXPECTED); -}); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-max-data-size.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-max-data-size.js deleted file mode 100644 index 25f47a4..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-max-data-size.js +++ /dev/null @@ -1,24 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var CombinedStream = common.CombinedStream; -var fs = require('fs'); - -var FILE1 = common.dir.fixture + '/file1.txt'; -var FILE2 = common.dir.fixture + '/file2.txt'; -var EXPECTED = fs.readFileSync(FILE1) + fs.readFileSync(FILE2); - -(function testDelayedStreams() { - var combinedStream = CombinedStream.create({pauseStreams: false, maxDataSize: 20736}); - combinedStream.append(fs.createReadStream(FILE1)); - combinedStream.append(fs.createReadStream(FILE2)); - - var gotErr = null; - combinedStream.on('error', function(err) { - gotErr = err; - }); - - process.on('exit', function() { - assert.ok(gotErr); - assert.ok(gotErr.message.match(/bytes/)); - }); -})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-unpaused-streams.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-unpaused-streams.js deleted file mode 100644 index 30a3a6f..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-unpaused-streams.js +++ /dev/null @@ -1,30 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var CombinedStream = common.CombinedStream; -var fs = require('fs'); - -var FILE1 = common.dir.fixture + '/file1.txt'; -var FILE2 = common.dir.fixture + '/file2.txt'; -var EXPECTED = fs.readFileSync(FILE1) + fs.readFileSync(FILE2); - -(function testDelayedStreams() { - var combinedStream = CombinedStream.create({pauseStreams: false}); - combinedStream.append(fs.createReadStream(FILE1)); - combinedStream.append(fs.createReadStream(FILE2)); - - var stream1 = combinedStream._streams[0]; - var stream2 = combinedStream._streams[1]; - - stream1.on('end', function() { - assert.ok(stream2.dataSize > 0); - }); - - var tmpFile = common.dir.tmp + '/combined.txt'; - var dest = fs.createWriteStream(tmpFile); - combinedStream.pipe(dest); - - dest.on('end', function() { - var written = fs.readFileSync(tmpFile, 'utf8'); - assert.strictEqual(written, EXPECTED); - }); -})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/run.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/run.js deleted file mode 100755 index 0bb8e82..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/run.js +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env node -var far = require('far').create(); - -far.add(__dirname); -far.include(/test-.*\.js$/); - -far.execute(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/package.json b/node_modules/nodetime/node_modules/request/node_modules/form-data/package.json deleted file mode 100644 index 1948a5e..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "author": { - "name": "Felix Geisendörfer", - "email": "felix@debuggable.com", - "url": "http://debuggable.com/" - }, - "name": "form-data", - "description": "A module to create readable `\"multipart/form-data\"` streams. Can be used to submit forms and file uploads to other web applications.", - "version": "0.0.3", - "repository": { - "type": "git", - "url": "git://github.com/felixge/node-form-data.git" - }, - "main": "./lib/form_data", - "engines": { - "node": "*" - }, - "dependencies": { - "combined-stream": "0.0.3", - "mime": "~1.2.2", - "async": "~0.1.9" - }, - "devDependencies": { - "fake": "0.2.1", - "far": "0.0.1", - "formidable": "1.0.2", - "request": "~2.9.203" - }, - "_npmUser": { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - "_id": "form-data@0.0.3", - "optionalDependencies": {}, - "_engineSupported": true, - "_npmVersion": "1.1.24", - "_nodeVersion": "v0.8.1", - "_defaultsLoaded": true, - "dist": { - "shasum": "6eea17b45790b42d779a1d581d1b3600fe0c7c0d" - }, - "_from": "form-data" -} diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/common.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/common.js deleted file mode 100644 index 8a26482..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/common.js +++ /dev/null @@ -1,14 +0,0 @@ -var common = module.exports; -var path = require('path'); - -var rootDir = path.join(__dirname, '..'); -common.dir = { - lib: rootDir + '/lib', - fixture: rootDir + '/test/fixture', - tmp: rootDir + '/test/tmp', -}; - -common.assert = require('assert'); -common.fake = require('fake'); - -common.port = 8432; diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/fixture/bacon.txt b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/fixture/bacon.txt deleted file mode 100644 index 9804bbd..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/fixture/bacon.txt +++ /dev/null @@ -1 +0,0 @@ -Bacon is delicious. diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/fixture/unicycle.jpg b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/fixture/unicycle.jpg deleted file mode 100644 index 7cea4dd71dc41cd51c84bfcec6b3e65c15a58507..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19806 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 diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-form-get-length.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-form-get-length.js deleted file mode 100644 index 44d3b4d..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-form-get-length.js +++ /dev/null @@ -1,93 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var FormData = require(common.dir.lib + '/form_data'); -var fake = require('fake').create(); -var fs = require('fs'); - -(function testEmptyForm() { - var form = new FormData(); - var callback = fake.callback(arguments.callee.name + '-getLength'); - var calls = fake.expectAnytime(callback, [null, 0]).calls; - - form.getLength(callback); - - // Make sure our response is async - assert.strictEqual(calls.length, 0); -})(); - -(function testUtf8String() { - var FIELD = 'my_field'; - var VALUE = 'May the € be with you'; - - var form = new FormData(); - form.append(FIELD, VALUE); - var callback = fake.callback(arguments.callee.name + '-getLength'); - - var expectedLength = - form._overheadLength + - Buffer.byteLength(VALUE) + - form._lastBoundary().length; - - fake.expectAnytime(callback, [null, expectedLength]); - form.getLength(callback); -})(); - -(function testBuffer() { - var FIELD = 'my_field'; - var VALUE = new Buffer(23); - - var form = new FormData(); - form.append(FIELD, VALUE); - var callback = fake.callback(arguments.callee.name + '-getLength'); - - var expectedLength = - form._overheadLength + - VALUE.length + - form._lastBoundary().length; - - fake.expectAnytime(callback, [null, expectedLength]); - form.getLength(callback); -})(); - - -(function testStringFileBufferFile() { - var fields = [ - { - name: 'my_field', - value: 'Test 123', - }, - { - name: 'my_image', - value: fs.createReadStream(common.dir.fixture + '/unicycle.jpg'), - }, - { - name: 'my_buffer', - value: new Buffer('123'), - }, - { - name: 'my_txt', - value: fs.createReadStream(common.dir.fixture + '/bacon.txt'), - }, - ]; - - var form = new FormData(); - var expectedLength = 0; - - fields.forEach(function(field) { - form.append(field.name, field.value); - if (field.value.path) { - var stat = fs.statSync(field.value.path); - expectedLength += stat.size; - } else { - expectedLength += field.value.length; - } - }); - - expectedLength += form._overheadLength + form._lastBoundary().length; - - var callback = fake.callback(arguments.callee.name + '-getLength'); - fake.expectAnytime(callback, [null, expectedLength]); - form.getLength(callback); -})(); - - diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-get-boundary.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-get-boundary.js deleted file mode 100644 index 6dc2fb2..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-get-boundary.js +++ /dev/null @@ -1,18 +0,0 @@ -var common = require('../common'); -var assert = common.assert; - -var FormData = require(common.dir.lib + '/form_data'); - -(function testOneBoundaryPerForm() { - var form = new FormData(); - var boundary = form.getBoundary(); - - assert.equal(boundary, form.getBoundary()); - assert.equal(boundary.length, 50); -})(); - -(function testUniqueBoundaryPerForm() { - var formA = new FormData(); - var formB = new FormData(); - assert.notEqual(formA.getBoundary(), formB.getBoundary()); -})(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-http-response.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-http-response.js deleted file mode 100644 index 8e183fe..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-http-response.js +++ /dev/null @@ -1,121 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var http = require('http'); -var path = require('path'); -var mime = require('mime'); -var request = require('request'); -var parseUrl = require('url').parse; -var fs = require('fs'); -var FormData = require(common.dir.lib + '/form_data'); -var IncomingForm = require('formidable').IncomingForm; - -var remoteFile = 'http://nodejs.org/images/logo.png'; - -var FIELDS; -var server; - -var parsedUrl = parseUrl(remoteFile) - , options = { - method: 'get', - port: parsedUrl.port || 80, - path: parsedUrl.pathname, - host: parsedUrl.hostname - } - ; - -http.request(options, function(res) { - - FIELDS = [ - {name: 'my_field', value: 'my_value'}, - {name: 'my_buffer', value: new Buffer([1, 2, 3])}, - {name: 'remote_file', value: res } - ]; - - var form = new FormData(); - FIELDS.forEach(function(field) { - form.append(field.name, field.value); - }); - - server.listen(common.port, function() { - - form.submit('http://localhost:' + common.port + '/', function(err, res) { - - if (err) { - throw err; - } - - assert.strictEqual(res.statusCode, 200); - server.close(); - }); - - }); - - -}).end(); - -server = http.createServer(function(req, res) { - - // formidable is broken so let's do it manual way - // - // var form = new IncomingForm(); - // form.uploadDir = common.dir.tmp; - // form.parse(req); - // form - // .on('field', function(name, value) { - // var field = FIELDS.shift(); - // assert.strictEqual(name, field.name); - // assert.strictEqual(value, field.value+''); - // }) - // .on('file', function(name, file) { - // var field = FIELDS.shift(); - // assert.strictEqual(name, field.name); - // assert.strictEqual(file.name, path.basename(field.value.path)); - // // mime.lookup file.NAME == 'my_file' ? - // assert.strictEqual(file.type, mime.lookup(file.name)); - // }) - // .on('end', function() { - // res.writeHead(200); - // res.end('done'); - // }); - - // temp workaround - var data = ''; - req.setEncoding('utf8'); - - req.on('data', function(d) { - data += d; - }); - - req.on('end', function() { - - // check for the fields' traces - - // 1st field : my_field - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 2nd field : my_buffer - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 3rd field : remote_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(remoteFile)+'"') != -1 ); - // check for http://nodejs.org/images/logo.png traces - assert.ok( data.indexOf('ImageReady') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(remoteFile) ) != -1 ); - - res.writeHead(200); - res.end('done'); - - }); - -}); - - -process.on('exit', function() { - assert.strictEqual(FIELDS.length, 0); -}); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-pipe.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-pipe.js deleted file mode 100644 index acc39df..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-pipe.js +++ /dev/null @@ -1,111 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var http = require('http'); -var path = require('path'); -var mime = require('mime'); -var request = require('request'); -var fs = require('fs'); -var FormData = require(common.dir.lib + '/form_data'); -var IncomingForm = require('formidable').IncomingForm; - -var remoteFile = 'http://nodejs.org/images/logo.png'; - -var FIELDS = [ - {name: 'my_field', value: 'my_value'}, - {name: 'my_buffer', value: new Buffer([1, 2, 3])}, - {name: 'my_file', value: fs.createReadStream(common.dir.fixture + '/unicycle.jpg')}, - {name: 'remote_file', value: request(remoteFile) } -]; - -var server = http.createServer(function(req, res) { - - // formidable is broken so let's do it manual way - // - // var form = new IncomingForm(); - // form.uploadDir = common.dir.tmp; - // form.parse(req); - // form - // .on('field', function(name, value) { - // var field = FIELDS.shift(); - // assert.strictEqual(name, field.name); - // assert.strictEqual(value, field.value+''); - // }) - // .on('file', function(name, file) { - // var field = FIELDS.shift(); - // assert.strictEqual(name, field.name); - // assert.strictEqual(file.name, path.basename(field.value.path)); - // assert.strictEqual(file.type, mime.lookup(file.name)); - // }) - // .on('end', function() { - // res.writeHead(200); - // res.end('done'); - // }); - - // temp workaround - var data = ''; - req.setEncoding('utf8'); - - req.on('data', function(d) { - data += d; - }); - - req.on('end', function() { - // check for the fields' traces - - // 1st field : my_field - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 2nd field : my_buffer - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 3rd field : my_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for unicycle.jpg traces - assert.ok( data.indexOf('2005:06:21 01:44:12') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(field.value.path) ) != -1 ); - - // 4th field : remote_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for http://nodejs.org/images/logo.png traces - assert.ok( data.indexOf('ImageReady') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(remoteFile) ) != -1 ); - - res.writeHead(200); - res.end('done'); - - }); - - -}); - -server.listen(common.port, function() { - var form = new FormData(); - FIELDS.forEach(function(field) { - form.append(field.name, field.value); - }); - - var request = http.request({ - method: 'post', - port: common.port, - path: '/upload', - headers: form.getHeaders() - }); - - form.pipe(request); - - request.on('response', function(res) { - server.close(); - }); -}); - -process.on('exit', function() { - assert.strictEqual(FIELDS.length, 0); -}); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-submit.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-submit.js deleted file mode 100644 index c40e88f..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/integration/test-submit.js +++ /dev/null @@ -1,107 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var http = require('http'); -var path = require('path'); -var mime = require('mime'); -var request = require('request'); -var fs = require('fs'); -var FormData = require(common.dir.lib + '/form_data'); -var IncomingForm = require('formidable').IncomingForm; - -var remoteFile = 'http://nodejs.org/images/logo.png'; - -var FIELDS = [ - {name: 'my_field', value: 'my_value'}, - {name: 'my_buffer', value: new Buffer([1, 2, 3])}, - {name: 'my_file', value: fs.createReadStream(common.dir.fixture + '/unicycle.jpg') }, - {name: 'remote_file', value: request(remoteFile) } -]; - -var server = http.createServer(function(req, res) { - - // formidable is broken so let's do it manual way - // - // var form = new IncomingForm(); - // form.uploadDir = common.dir.tmp; - // form.parse(req); - // form - // .on('field', function(name, value) { - // var field = FIELDS.shift(); - // assert.strictEqual(name, field.name); - // assert.strictEqual(value, field.value+''); - // }) - // .on('file', function(name, file) { - // var field = FIELDS.shift(); - // assert.strictEqual(name, field.name); - // assert.strictEqual(file.name, path.basename(field.value.path)); - // // mime.lookup file.NAME == 'my_file' ? - // assert.strictEqual(file.type, mime.lookup(file.name)); - // }) - // .on('end', function() { - // res.writeHead(200); - // res.end('done'); - // }); - - // temp workaround - var data = ''; - req.setEncoding('utf8'); - req.on('data', function(d) { - data += d; - }); - req.on('end', function() { - // check for the fields' traces - - // 1st field : my_field - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 2nd field : my_buffer - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 3rd field : my_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for unicycle.jpg traces - assert.ok( data.indexOf('2005:06:21 01:44:12') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(field.value.path) ) != -1 ); - - // 4th field : remote_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for http://nodejs.org/images/logo.png traces - assert.ok( data.indexOf('ImageReady') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(remoteFile) ) != -1 ); - - res.writeHead(200); - res.end('done'); - - }); - -}); - -server.listen(common.port, function() { - var form = new FormData(); - FIELDS.forEach(function(field) { - form.append(field.name, field.value); - }); - - form.submit('http://localhost:' + common.port + '/', function(err, res) { - - if (err) { - throw err; - } - - assert.strictEqual(res.statusCode, 200); - server.close(); - }); - -}); - -process.on('exit', function() { - assert.strictEqual(FIELDS.length, 0); -}); diff --git a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/run.js b/node_modules/nodetime/node_modules/request/node_modules/form-data/test/run.js deleted file mode 100755 index 0bb8e82..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/form-data/test/run.js +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env node -var far = require('far').create(); - -far.add(__dirname); -far.include(/test-.*\.js$/); - -far.execute(); diff --git a/node_modules/nodetime/node_modules/request/node_modules/mime/LICENSE b/node_modules/nodetime/node_modules/request/node_modules/mime/LICENSE deleted file mode 100644 index 451fc45..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/mime/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2010 Benjamin Thomas, Robert Kieffer - -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. diff --git a/node_modules/nodetime/node_modules/request/node_modules/mime/README.md b/node_modules/nodetime/node_modules/request/node_modules/mime/README.md deleted file mode 100644 index b90552a..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/mime/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# mime - -Comprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community. - -## Install - -Install with [npm](http://github.com/isaacs/npm): - - npm install mime - -## API - Queries - -### mime.lookup(path) -Get the mime type associated with a file. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g. - - var mime = require('mime'); - - mime.lookup('/path/to/file.txt'); // => 'text/plain' - mime.lookup('file.txt'); // => 'text/plain' - mime.lookup('.TXT'); // => 'text/plain' - mime.lookup('htm'); // => 'text/html' - -### mime.extension(type) -Get the default extension for `type` - - mime.extension('text/html'); // => 'html' - mime.extension('application/octet-stream'); // => 'bin' - -### mime.charsets.lookup() - -Map mime-type to charset - - mime.charsets.lookup('text/plain'); // => 'UTF-8' - -(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.) - -## API - Defining Custom Types - -The following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/broofa/node-mime/wiki/Requesting-New-Types). - -### mime.define() - -Add custom mime/extension mappings - - mime.define({ - 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'], - 'application/x-my-type': ['x-mt', 'x-mtt'], - // etc ... - }); - - mime.lookup('x-sft'); // => 'text/x-some-format' - -The first entry in the extensions array is returned by `mime.extension()`. E.g. - - mime.extension('text/x-some-format'); // => 'x-sf' - -### mime.load(filepath) - -Load mappings from an Apache ".types" format file - - mime.load('./my_project.types'); - -The .types file format is simple - See the `types` dir for examples. diff --git a/node_modules/nodetime/node_modules/request/node_modules/mime/mime.js b/node_modules/nodetime/node_modules/request/node_modules/mime/mime.js deleted file mode 100644 index 1e00585..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/mime/mime.js +++ /dev/null @@ -1,104 +0,0 @@ -var path = require('path'); -var fs = require('fs'); - -function Mime() { - // Map of extension -> mime type - this.types = Object.create(null); - - // Map of mime type -> extension - this.extensions = Object.create(null); -} - -/** - * Define mimetype -> extension mappings. Each key is a mime-type that maps - * to an array of extensions associated with the type. The first extension is - * used as the default extension for the type. - * - * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']}); - * - * @param map (Object) type definitions - */ -Mime.prototype.define = function (map) { - for (var type in map) { - var exts = map[type]; - - for (var i = 0; i < exts.length; i++) { - this.types[exts[i]] = type; - } - - // Default extension is the first one we encounter - if (!this.extensions[type]) { - this.extensions[type] = exts[0]; - } - } -}; - -/** - * Load an Apache2-style ".types" file - * - * This may be called multiple times (it's expected). Where files declare - * overlapping types/extensions, the last file wins. - * - * @param file (String) path of file to load. - */ -Mime.prototype.load = function(file) { - // Read file and split into lines - var map = {}, - content = fs.readFileSync(file, 'ascii'), - lines = content.split(/[\r\n]+/); - - lines.forEach(function(line) { - // Clean up whitespace/comments, and split into fields - var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/); - map[fields.shift()] = fields; - }); - - this.define(map); -}; - -/** - * Lookup a mime type based on extension - */ -Mime.prototype.lookup = function(path, fallback) { - var ext = path.replace(/.*[\.\/]/, '').toLowerCase(); - - return this.types[ext] || fallback || this.default_type; -}; - -/** - * Return file extension associated with a mime type - */ -Mime.prototype.extension = function(mimeType) { - return this.extensions[mimeType]; -}; - -// Default instance -var mime = new Mime(); - -// Load local copy of -// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types -mime.load(path.join(__dirname, 'types/mime.types')); - -// Load additional types from node.js community -mime.load(path.join(__dirname, 'types/node.types')); - -// Default type -mime.default_type = mime.lookup('bin'); - -// -// Additional API specific to the default instance -// - -mime.Mime = Mime; - -/** - * Lookup a charset based on mime type. - */ -mime.charsets = { - lookup: function(mimeType, fallback) { - // Assume text types are utf8 - return (/^text\//).test(mimeType) ? 'UTF-8' : fallback; - } -} - -module.exports = mime; diff --git a/node_modules/nodetime/node_modules/request/node_modules/mime/package.json b/node_modules/nodetime/node_modules/request/node_modules/mime/package.json deleted file mode 100644 index 06e2ee5..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/mime/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "author": { - "name": "Robert Kieffer", - "email": "robert@broofa.com", - "url": "http://github.com/broofa" - }, - "contributors": [ - { - "name": "Benjamin Thomas", - "email": "benjamin@benjaminthomas.org", - "url": "http://github.com/bentomas" - } - ], - "dependencies": {}, - "description": "A comprehensive library for mime-type mapping", - "devDependencies": {}, - "keywords": [ - "util", - "mime" - ], - "main": "mime.js", - "name": "mime", - "repository": { - "url": "git://github.com/broofa/node-mime.git", - "type": "git" - }, - "version": "1.2.7", - "_npmUser": { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - "_id": "mime@1.2.7", - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "_engineSupported": true, - "_npmVersion": "1.1.24", - "_nodeVersion": "v0.8.1", - "_defaultsLoaded": true, - "_from": "mime" -} diff --git a/node_modules/nodetime/node_modules/request/node_modules/mime/test.js b/node_modules/nodetime/node_modules/request/node_modules/mime/test.js deleted file mode 100644 index cbad034..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/mime/test.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Usage: node test.js - */ - -var mime = require('./mime'); -var assert = require('assert'); - -function eq(a, b) { - console.log('Test: ' + a + ' === ' + b); - assert.strictEqual.apply(null, arguments); -} - -console.log(Object.keys(mime.extensions).length + ' types'); -console.log(Object.keys(mime.types).length + ' extensions\n'); - -// -// Test mime lookups -// - -eq('text/plain', mime.lookup('text.txt')); -eq('text/plain', mime.lookup('.text.txt')); -eq('text/plain', mime.lookup('.txt')); -eq('text/plain', mime.lookup('txt')); -eq('application/octet-stream', mime.lookup('text.nope')); -eq('fallback', mime.lookup('text.fallback', 'fallback')); -eq('application/octet-stream', mime.lookup('constructor')); -eq('text/plain', mime.lookup('TEXT.TXT')); -eq('text/event-stream', mime.lookup('text/event-stream')); -eq('application/x-web-app-manifest+json', mime.lookup('text.webapp')); - -// -// Test extensions -// - -eq('txt', mime.extension(mime.types.text)); -eq('html', mime.extension(mime.types.htm)); -eq('bin', mime.extension('application/octet-stream')); -eq(undefined, mime.extension('constructor')); - -// -// Test node types -// - -eq('application/octet-stream', mime.lookup('file.buffer')); -eq('audio/mp4', mime.lookup('file.m4a')); - -// -// Test charsets -// - -eq('UTF-8', mime.charsets.lookup('text/plain')); -eq(undefined, mime.charsets.lookup(mime.types.js)); -eq('fallback', mime.charsets.lookup('application/octet-stream', 'fallback')); - -console.log('\nOK'); diff --git a/node_modules/nodetime/node_modules/request/node_modules/mime/types/mime.types b/node_modules/nodetime/node_modules/request/node_modules/mime/types/mime.types deleted file mode 100644 index b90b165..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/mime/types/mime.types +++ /dev/null @@ -1,1588 +0,0 @@ -# This file maps Internet media types to unique file extension(s). -# Although created for httpd, this file is used by many software systems -# and has been placed in the public domain for unlimited redisribution. -# -# The table below contains both registered and (common) unregistered types. -# A type that has no unique extension can be ignored -- they are listed -# here to guide configurations toward known types and to make it easier to -# identify "new" types. File extensions are also commonly used to indicate -# content languages and encodings, so choose them carefully. -# -# Internet media types should be registered as described in RFC 4288. -# The registry is at . -# -# MIME type (lowercased) Extensions -# ============================================ ========== -# application/1d-interleaved-parityfec -# application/3gpp-ims+xml -# application/activemessage -application/andrew-inset ez -# application/applefile -application/applixware aw -application/atom+xml atom -application/atomcat+xml atomcat -# application/atomicmail -application/atomsvc+xml atomsvc -# application/auth-policy+xml -# application/batch-smtp -# application/beep+xml -# application/calendar+xml -# application/cals-1840 -# application/ccmp+xml -application/ccxml+xml ccxml -application/cdmi-capability cdmia -application/cdmi-container cdmic -application/cdmi-domain cdmid -application/cdmi-object cdmio -application/cdmi-queue cdmiq -# application/cea-2018+xml -# application/cellml+xml -# application/cfw -# application/cnrp+xml -# application/commonground -# application/conference-info+xml -# application/cpl+xml -# application/csta+xml -# application/cstadata+xml -application/cu-seeme cu -# application/cybercash -application/davmount+xml davmount -# application/dca-rft -# application/dec-dx -# application/dialog-info+xml -# application/dicom -# application/dns -application/docbook+xml dbk -# application/dskpp+xml -application/dssc+der dssc -application/dssc+xml xdssc -# application/dvcs -application/ecmascript ecma -# application/edi-consent -# application/edi-x12 -# application/edifact -application/emma+xml emma -# application/epp+xml -application/epub+zip epub -# application/eshop -# application/example -application/exi exi -# application/fastinfoset -# application/fastsoap -# application/fits -application/font-tdpfr pfr -# application/framework-attributes+xml -application/gml+xml gml -application/gpx+xml gpx -application/gxf gxf -# application/h224 -# application/held+xml -# application/http -application/hyperstudio stk -# application/ibe-key-request+xml -# application/ibe-pkg-reply+xml -# application/ibe-pp-data -# application/iges -# application/im-iscomposing+xml -# application/index -# application/index.cmd -# application/index.obj -# application/index.response -# application/index.vnd -application/inkml+xml ink inkml -# application/iotp -application/ipfix ipfix -# application/ipp -# application/isup -application/java-archive jar -application/java-serialized-object ser -application/java-vm class -application/javascript js -application/json json -application/jsonml+json jsonml -# application/kpml-request+xml -# application/kpml-response+xml -application/lost+xml lostxml -application/mac-binhex40 hqx -application/mac-compactpro cpt -# application/macwriteii -application/mads+xml mads -application/marc mrc -application/marcxml+xml mrcx -application/mathematica ma nb mb -# application/mathml-content+xml -# application/mathml-presentation+xml -application/mathml+xml mathml -# application/mbms-associated-procedure-description+xml -# application/mbms-deregister+xml -# application/mbms-envelope+xml -# application/mbms-msk+xml -# application/mbms-msk-response+xml -# application/mbms-protection-description+xml -# application/mbms-reception-report+xml -# application/mbms-register+xml -# application/mbms-register-response+xml -# application/mbms-user-service-description+xml -application/mbox mbox -# application/media_control+xml -application/mediaservercontrol+xml mscml -application/metalink+xml metalink -application/metalink4+xml meta4 -application/mets+xml mets -# application/mikey -application/mods+xml mods -# application/moss-keys -# application/moss-signature -# application/mosskey-data -# application/mosskey-request -application/mp21 m21 mp21 -application/mp4 mp4s -# application/mpeg4-generic -# application/mpeg4-iod -# application/mpeg4-iod-xmt -# application/msc-ivr+xml -# application/msc-mixer+xml -application/msword doc dot -application/mxf mxf -# application/nasdata -# application/news-checkgroups -# application/news-groupinfo -# application/news-transmission -# application/nss -# application/ocsp-request -# application/ocsp-response -application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy -application/oda oda -application/oebps-package+xml opf -application/ogg ogx -application/omdoc+xml omdoc -application/onenote onetoc onetoc2 onetmp onepkg -application/oxps oxps -# application/parityfec -application/patch-ops-error+xml xer -application/pdf pdf -application/pgp-encrypted pgp -# application/pgp-keys -application/pgp-signature asc sig -application/pics-rules prf -# application/pidf+xml -# application/pidf-diff+xml -application/pkcs10 p10 -application/pkcs7-mime p7m p7c -application/pkcs7-signature p7s -application/pkcs8 p8 -application/pkix-attr-cert ac -application/pkix-cert cer -application/pkix-crl crl -application/pkix-pkipath pkipath -application/pkixcmp pki -application/pls+xml pls -# application/poc-settings+xml -application/postscript ai eps ps -# application/prs.alvestrand.titrax-sheet -application/prs.cww cww -# application/prs.nprend -# application/prs.plucker -# application/prs.rdf-xml-crypt -# application/prs.xsf+xml -application/pskc+xml pskcxml -# application/qsig -application/rdf+xml rdf -application/reginfo+xml rif -application/relax-ng-compact-syntax rnc -# application/remote-printing -application/resource-lists+xml rl -application/resource-lists-diff+xml rld -# application/riscos -# application/rlmi+xml -application/rls-services+xml rs -application/rpki-ghostbusters gbr -application/rpki-manifest mft -application/rpki-roa roa -# application/rpki-updown -application/rsd+xml rsd -application/rss+xml rss -application/rtf rtf -# application/rtx -# application/samlassertion+xml -# application/samlmetadata+xml -application/sbml+xml sbml -application/scvp-cv-request scq -application/scvp-cv-response scs -application/scvp-vp-request spq -application/scvp-vp-response spp -application/sdp sdp -# application/set-payment -application/set-payment-initiation setpay -# application/set-registration -application/set-registration-initiation setreg -# application/sgml -# application/sgml-open-catalog -application/shf+xml shf -# application/sieve -# application/simple-filter+xml -# application/simple-message-summary -# application/simplesymbolcontainer -# application/slate -# application/smil -application/smil+xml smi smil -# application/soap+fastinfoset -# application/soap+xml -application/sparql-query rq -application/sparql-results+xml srx -# application/spirits-event+xml -application/srgs gram -application/srgs+xml grxml -application/sru+xml sru -application/ssdl+xml ssdl -application/ssml+xml ssml -# application/tamp-apex-update -# application/tamp-apex-update-confirm -# application/tamp-community-update -# application/tamp-community-update-confirm -# application/tamp-error -# application/tamp-sequence-adjust -# application/tamp-sequence-adjust-confirm -# application/tamp-status-query -# application/tamp-status-response -# application/tamp-update -# application/tamp-update-confirm -application/tei+xml tei teicorpus -application/thraud+xml tfi -# application/timestamp-query -# application/timestamp-reply -application/timestamped-data tsd -# application/tve-trigger -# application/ulpfec -# application/vcard+xml -# application/vemmi -# application/vividence.scriptfile -# application/vnd.3gpp.bsf+xml -application/vnd.3gpp.pic-bw-large plb -application/vnd.3gpp.pic-bw-small psb -application/vnd.3gpp.pic-bw-var pvb -# application/vnd.3gpp.sms -# application/vnd.3gpp2.bcmcsinfo+xml -# application/vnd.3gpp2.sms -application/vnd.3gpp2.tcap tcap -application/vnd.3m.post-it-notes pwn -application/vnd.accpac.simply.aso aso -application/vnd.accpac.simply.imp imp -application/vnd.acucobol acu -application/vnd.acucorp atc acutc -application/vnd.adobe.air-application-installer-package+zip air -application/vnd.adobe.formscentral.fcdt fcdt -application/vnd.adobe.fxp fxp fxpl -# application/vnd.adobe.partial-upload -application/vnd.adobe.xdp+xml xdp -application/vnd.adobe.xfdf xfdf -# application/vnd.aether.imp -# application/vnd.ah-barcode -application/vnd.ahead.space ahead -application/vnd.airzip.filesecure.azf azf -application/vnd.airzip.filesecure.azs azs -application/vnd.amazon.ebook azw -application/vnd.americandynamics.acc acc -application/vnd.amiga.ami ami -# application/vnd.amundsen.maze+xml -application/vnd.android.package-archive apk -application/vnd.anser-web-certificate-issue-initiation cii -application/vnd.anser-web-funds-transfer-initiation fti -application/vnd.antix.game-component atx -application/vnd.apple.installer+xml mpkg -application/vnd.apple.mpegurl m3u8 -# application/vnd.arastra.swi -application/vnd.aristanetworks.swi swi -application/vnd.astraea-software.iota iota -application/vnd.audiograph aep -# application/vnd.autopackage -# application/vnd.avistar+xml -application/vnd.blueice.multipass mpm -# application/vnd.bluetooth.ep.oob -application/vnd.bmi bmi -application/vnd.businessobjects rep -# application/vnd.cab-jscript -# application/vnd.canon-cpdl -# application/vnd.canon-lips -# application/vnd.cendio.thinlinc.clientconf -application/vnd.chemdraw+xml cdxml -application/vnd.chipnuts.karaoke-mmd mmd -application/vnd.cinderella cdy -# application/vnd.cirpack.isdn-ext -application/vnd.claymore cla -application/vnd.cloanto.rp9 rp9 -application/vnd.clonk.c4group c4g c4d c4f c4p c4u -application/vnd.cluetrust.cartomobile-config c11amc -application/vnd.cluetrust.cartomobile-config-pkg c11amz -# application/vnd.collection+json -# application/vnd.commerce-battelle -application/vnd.commonspace csp -application/vnd.contact.cmsg cdbcmsg -application/vnd.cosmocaller cmc -application/vnd.crick.clicker clkx -application/vnd.crick.clicker.keyboard clkk -application/vnd.crick.clicker.palette clkp -application/vnd.crick.clicker.template clkt -application/vnd.crick.clicker.wordbank clkw -application/vnd.criticaltools.wbs+xml wbs -application/vnd.ctc-posml pml -# application/vnd.ctct.ws+xml -# application/vnd.cups-pdf -# application/vnd.cups-postscript -application/vnd.cups-ppd ppd -# application/vnd.cups-raster -# application/vnd.cups-raw -# application/vnd.curl -application/vnd.curl.car car -application/vnd.curl.pcurl pcurl -# application/vnd.cybank -application/vnd.dart dart -application/vnd.data-vision.rdz rdz -application/vnd.dece.data uvf uvvf uvd uvvd -application/vnd.dece.ttml+xml uvt uvvt -application/vnd.dece.unspecified uvx uvvx -application/vnd.dece.zip uvz uvvz -application/vnd.denovo.fcselayout-link fe_launch -# application/vnd.dir-bi.plate-dl-nosuffix -application/vnd.dna dna -application/vnd.dolby.mlp mlp -# application/vnd.dolby.mobile.1 -# application/vnd.dolby.mobile.2 -application/vnd.dpgraph dpg -application/vnd.dreamfactory dfac -application/vnd.ds-keypoint kpxx -application/vnd.dvb.ait ait -# application/vnd.dvb.dvbj -# application/vnd.dvb.esgcontainer -# application/vnd.dvb.ipdcdftnotifaccess -# application/vnd.dvb.ipdcesgaccess -# application/vnd.dvb.ipdcesgaccess2 -# application/vnd.dvb.ipdcesgpdd -# application/vnd.dvb.ipdcroaming -# application/vnd.dvb.iptv.alfec-base -# application/vnd.dvb.iptv.alfec-enhancement -# application/vnd.dvb.notif-aggregate-root+xml -# application/vnd.dvb.notif-container+xml -# application/vnd.dvb.notif-generic+xml -# application/vnd.dvb.notif-ia-msglist+xml -# application/vnd.dvb.notif-ia-registration-request+xml -# application/vnd.dvb.notif-ia-registration-response+xml -# application/vnd.dvb.notif-init+xml -# application/vnd.dvb.pfr -application/vnd.dvb.service svc -# application/vnd.dxr -application/vnd.dynageo geo -# application/vnd.easykaraoke.cdgdownload -# application/vnd.ecdis-update -application/vnd.ecowin.chart mag -# application/vnd.ecowin.filerequest -# application/vnd.ecowin.fileupdate -# application/vnd.ecowin.series -# application/vnd.ecowin.seriesrequest -# application/vnd.ecowin.seriesupdate -# application/vnd.emclient.accessrequest+xml -application/vnd.enliven nml -# application/vnd.eprints.data+xml -application/vnd.epson.esf esf -application/vnd.epson.msf msf -application/vnd.epson.quickanime qam -application/vnd.epson.salt slt -application/vnd.epson.ssf ssf -# application/vnd.ericsson.quickcall -application/vnd.eszigno3+xml es3 et3 -# application/vnd.etsi.aoc+xml -# application/vnd.etsi.cug+xml -# application/vnd.etsi.iptvcommand+xml -# application/vnd.etsi.iptvdiscovery+xml -# application/vnd.etsi.iptvprofile+xml -# application/vnd.etsi.iptvsad-bc+xml -# application/vnd.etsi.iptvsad-cod+xml -# application/vnd.etsi.iptvsad-npvr+xml -# application/vnd.etsi.iptvservice+xml -# application/vnd.etsi.iptvsync+xml -# application/vnd.etsi.iptvueprofile+xml -# application/vnd.etsi.mcid+xml -# application/vnd.etsi.overload-control-policy-dataset+xml -# application/vnd.etsi.sci+xml -# application/vnd.etsi.simservs+xml -# application/vnd.etsi.tsl+xml -# application/vnd.etsi.tsl.der -# application/vnd.eudora.data -application/vnd.ezpix-album ez2 -application/vnd.ezpix-package ez3 -# application/vnd.f-secure.mobile -application/vnd.fdf fdf -application/vnd.fdsn.mseed mseed -application/vnd.fdsn.seed seed dataless -# application/vnd.ffsns -# application/vnd.fints -application/vnd.flographit gph -application/vnd.fluxtime.clip ftc -# application/vnd.font-fontforge-sfd -application/vnd.framemaker fm frame maker book -application/vnd.frogans.fnc fnc -application/vnd.frogans.ltf ltf -application/vnd.fsc.weblaunch fsc -application/vnd.fujitsu.oasys oas -application/vnd.fujitsu.oasys2 oa2 -application/vnd.fujitsu.oasys3 oa3 -application/vnd.fujitsu.oasysgp fg5 -application/vnd.fujitsu.oasysprs bh2 -# application/vnd.fujixerox.art-ex -# application/vnd.fujixerox.art4 -# application/vnd.fujixerox.hbpl -application/vnd.fujixerox.ddd ddd -application/vnd.fujixerox.docuworks xdw -application/vnd.fujixerox.docuworks.binder xbd -# application/vnd.fut-misnet -application/vnd.fuzzysheet fzs -application/vnd.genomatix.tuxedo txd -# application/vnd.geocube+xml -application/vnd.geogebra.file ggb -application/vnd.geogebra.tool ggt -application/vnd.geometry-explorer gex gre -application/vnd.geonext gxt -application/vnd.geoplan g2w -application/vnd.geospace g3w -# application/vnd.globalplatform.card-content-mgt -# application/vnd.globalplatform.card-content-mgt-response -application/vnd.gmx gmx -application/vnd.google-earth.kml+xml kml -application/vnd.google-earth.kmz kmz -application/vnd.grafeq gqf gqs -# application/vnd.gridmp -application/vnd.groove-account gac -application/vnd.groove-help ghf -application/vnd.groove-identity-message gim -application/vnd.groove-injector grv -application/vnd.groove-tool-message gtm -application/vnd.groove-tool-template tpl -application/vnd.groove-vcard vcg -# application/vnd.hal+json -application/vnd.hal+xml hal -application/vnd.handheld-entertainment+xml zmm -application/vnd.hbci hbci -# application/vnd.hcl-bireports -application/vnd.hhe.lesson-player les -application/vnd.hp-hpgl hpgl -application/vnd.hp-hpid hpid -application/vnd.hp-hps hps -application/vnd.hp-jlyt jlt -application/vnd.hp-pcl pcl -application/vnd.hp-pclxl pclxl -# application/vnd.httphone -application/vnd.hydrostatix.sof-data sfd-hdstx -# application/vnd.hzn-3d-crossword -# application/vnd.ibm.afplinedata -# application/vnd.ibm.electronic-media -application/vnd.ibm.minipay mpy -application/vnd.ibm.modcap afp listafp list3820 -application/vnd.ibm.rights-management irm -application/vnd.ibm.secure-container sc -application/vnd.iccprofile icc icm -application/vnd.igloader igl -application/vnd.immervision-ivp ivp -application/vnd.immervision-ivu ivu -# application/vnd.informedcontrol.rms+xml -# application/vnd.informix-visionary -# application/vnd.infotech.project -# application/vnd.infotech.project+xml -# application/vnd.innopath.wamp.notification -application/vnd.insors.igm igm -application/vnd.intercon.formnet xpw xpx -application/vnd.intergeo i2g -# application/vnd.intertrust.digibox -# application/vnd.intertrust.nncp -application/vnd.intu.qbo qbo -application/vnd.intu.qfx qfx -# application/vnd.iptc.g2.conceptitem+xml -# application/vnd.iptc.g2.knowledgeitem+xml -# application/vnd.iptc.g2.newsitem+xml -# application/vnd.iptc.g2.newsmessage+xml -# application/vnd.iptc.g2.packageitem+xml -# application/vnd.iptc.g2.planningitem+xml -application/vnd.ipunplugged.rcprofile rcprofile -application/vnd.irepository.package+xml irp -application/vnd.is-xpr xpr -application/vnd.isac.fcs fcs -application/vnd.jam jam -# application/vnd.japannet-directory-service -# application/vnd.japannet-jpnstore-wakeup -# application/vnd.japannet-payment-wakeup -# application/vnd.japannet-registration -# application/vnd.japannet-registration-wakeup -# application/vnd.japannet-setstore-wakeup -# application/vnd.japannet-verification -# application/vnd.japannet-verification-wakeup -application/vnd.jcp.javame.midlet-rms rms -application/vnd.jisp jisp -application/vnd.joost.joda-archive joda -application/vnd.kahootz ktz ktr -application/vnd.kde.karbon karbon -application/vnd.kde.kchart chrt -application/vnd.kde.kformula kfo -application/vnd.kde.kivio flw -application/vnd.kde.kontour kon -application/vnd.kde.kpresenter kpr kpt -application/vnd.kde.kspread ksp -application/vnd.kde.kword kwd kwt -application/vnd.kenameaapp htke -application/vnd.kidspiration kia -application/vnd.kinar kne knp -application/vnd.koan skp skd skt skm -application/vnd.kodak-descriptor sse -application/vnd.las.las+xml lasxml -# application/vnd.liberty-request+xml -application/vnd.llamagraphics.life-balance.desktop lbd -application/vnd.llamagraphics.life-balance.exchange+xml lbe -application/vnd.lotus-1-2-3 123 -application/vnd.lotus-approach apr -application/vnd.lotus-freelance pre -application/vnd.lotus-notes nsf -application/vnd.lotus-organizer org -application/vnd.lotus-screencam scm -application/vnd.lotus-wordpro lwp -application/vnd.macports.portpkg portpkg -# application/vnd.marlin.drm.actiontoken+xml -# application/vnd.marlin.drm.conftoken+xml -# application/vnd.marlin.drm.license+xml -# application/vnd.marlin.drm.mdcf -application/vnd.mcd mcd -application/vnd.medcalcdata mc1 -application/vnd.mediastation.cdkey cdkey -# application/vnd.meridian-slingshot -application/vnd.mfer mwf -application/vnd.mfmp mfm -application/vnd.micrografx.flo flo -application/vnd.micrografx.igx igx -application/vnd.mif mif -# application/vnd.minisoft-hp3000-save -# application/vnd.mitsubishi.misty-guard.trustweb -application/vnd.mobius.daf daf -application/vnd.mobius.dis dis -application/vnd.mobius.mbk mbk -application/vnd.mobius.mqy mqy -application/vnd.mobius.msl msl -application/vnd.mobius.plc plc -application/vnd.mobius.txf txf -application/vnd.mophun.application mpn -application/vnd.mophun.certificate mpc -# application/vnd.motorola.flexsuite -# application/vnd.motorola.flexsuite.adsi -# application/vnd.motorola.flexsuite.fis -# application/vnd.motorola.flexsuite.gotap -# application/vnd.motorola.flexsuite.kmr -# application/vnd.motorola.flexsuite.ttc -# application/vnd.motorola.flexsuite.wem -# application/vnd.motorola.iprm -application/vnd.mozilla.xul+xml xul -application/vnd.ms-artgalry cil -# application/vnd.ms-asf -application/vnd.ms-cab-compressed cab -# application/vnd.ms-color.iccprofile -application/vnd.ms-excel xls xlm xla xlc xlt xlw -application/vnd.ms-excel.addin.macroenabled.12 xlam -application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb -application/vnd.ms-excel.sheet.macroenabled.12 xlsm -application/vnd.ms-excel.template.macroenabled.12 xltm -application/vnd.ms-fontobject eot -application/vnd.ms-htmlhelp chm -application/vnd.ms-ims ims -application/vnd.ms-lrm lrm -# application/vnd.ms-office.activex+xml -application/vnd.ms-officetheme thmx -# application/vnd.ms-opentype -# application/vnd.ms-package.obfuscated-opentype -application/vnd.ms-pki.seccat cat -application/vnd.ms-pki.stl stl -# application/vnd.ms-playready.initiator+xml -application/vnd.ms-powerpoint ppt pps pot -application/vnd.ms-powerpoint.addin.macroenabled.12 ppam -application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm -application/vnd.ms-powerpoint.slide.macroenabled.12 sldm -application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm -application/vnd.ms-powerpoint.template.macroenabled.12 potm -# application/vnd.ms-printing.printticket+xml -application/vnd.ms-project mpp mpt -# application/vnd.ms-tnef -# application/vnd.ms-wmdrm.lic-chlg-req -# application/vnd.ms-wmdrm.lic-resp -# application/vnd.ms-wmdrm.meter-chlg-req -# application/vnd.ms-wmdrm.meter-resp -application/vnd.ms-word.document.macroenabled.12 docm -application/vnd.ms-word.template.macroenabled.12 dotm -application/vnd.ms-works wps wks wcm wdb -application/vnd.ms-wpl wpl -application/vnd.ms-xpsdocument xps -application/vnd.mseq mseq -# application/vnd.msign -# application/vnd.multiad.creator -# application/vnd.multiad.creator.cif -# application/vnd.music-niff -application/vnd.musician mus -application/vnd.muvee.style msty -application/vnd.mynfc taglet -# application/vnd.ncd.control -# application/vnd.ncd.reference -# application/vnd.nervana -# application/vnd.netfpx -application/vnd.neurolanguage.nlu nlu -application/vnd.nitf ntf nitf -application/vnd.noblenet-directory nnd -application/vnd.noblenet-sealer nns -application/vnd.noblenet-web nnw -# application/vnd.nokia.catalogs -# application/vnd.nokia.conml+wbxml -# application/vnd.nokia.conml+xml -# application/vnd.nokia.isds-radio-presets -# application/vnd.nokia.iptv.config+xml -# application/vnd.nokia.landmark+wbxml -# application/vnd.nokia.landmark+xml -# application/vnd.nokia.landmarkcollection+xml -# application/vnd.nokia.n-gage.ac+xml -application/vnd.nokia.n-gage.data ngdat -application/vnd.nokia.n-gage.symbian.install n-gage -# application/vnd.nokia.ncd -# application/vnd.nokia.pcd+wbxml -# application/vnd.nokia.pcd+xml -application/vnd.nokia.radio-preset rpst -application/vnd.nokia.radio-presets rpss -application/vnd.novadigm.edm edm -application/vnd.novadigm.edx edx -application/vnd.novadigm.ext ext -# application/vnd.ntt-local.file-transfer -# application/vnd.ntt-local.sip-ta_remote -# application/vnd.ntt-local.sip-ta_tcp_stream -application/vnd.oasis.opendocument.chart odc -application/vnd.oasis.opendocument.chart-template otc -application/vnd.oasis.opendocument.database odb -application/vnd.oasis.opendocument.formula odf -application/vnd.oasis.opendocument.formula-template odft -application/vnd.oasis.opendocument.graphics odg -application/vnd.oasis.opendocument.graphics-template otg -application/vnd.oasis.opendocument.image odi -application/vnd.oasis.opendocument.image-template oti -application/vnd.oasis.opendocument.presentation odp -application/vnd.oasis.opendocument.presentation-template otp -application/vnd.oasis.opendocument.spreadsheet ods -application/vnd.oasis.opendocument.spreadsheet-template ots -application/vnd.oasis.opendocument.text odt -application/vnd.oasis.opendocument.text-master odm -application/vnd.oasis.opendocument.text-template ott -application/vnd.oasis.opendocument.text-web oth -# application/vnd.obn -# application/vnd.oftn.l10n+json -# application/vnd.oipf.contentaccessdownload+xml -# application/vnd.oipf.contentaccessstreaming+xml -# application/vnd.oipf.cspg-hexbinary -# application/vnd.oipf.dae.svg+xml -# application/vnd.oipf.dae.xhtml+xml -# application/vnd.oipf.mippvcontrolmessage+xml -# application/vnd.oipf.pae.gem -# application/vnd.oipf.spdiscovery+xml -# application/vnd.oipf.spdlist+xml -# application/vnd.oipf.ueprofile+xml -# application/vnd.oipf.userprofile+xml -application/vnd.olpc-sugar xo -# application/vnd.oma-scws-config -# application/vnd.oma-scws-http-request -# application/vnd.oma-scws-http-response -# application/vnd.oma.bcast.associated-procedure-parameter+xml -# application/vnd.oma.bcast.drm-trigger+xml -# application/vnd.oma.bcast.imd+xml -# application/vnd.oma.bcast.ltkm -# application/vnd.oma.bcast.notification+xml -# application/vnd.oma.bcast.provisioningtrigger -# application/vnd.oma.bcast.sgboot -# application/vnd.oma.bcast.sgdd+xml -# application/vnd.oma.bcast.sgdu -# application/vnd.oma.bcast.simple-symbol-container -# application/vnd.oma.bcast.smartcard-trigger+xml -# application/vnd.oma.bcast.sprov+xml -# application/vnd.oma.bcast.stkm -# application/vnd.oma.cab-address-book+xml -# application/vnd.oma.cab-feature-handler+xml -# application/vnd.oma.cab-pcc+xml -# application/vnd.oma.cab-user-prefs+xml -# application/vnd.oma.dcd -# application/vnd.oma.dcdc -application/vnd.oma.dd2+xml dd2 -# application/vnd.oma.drm.risd+xml -# application/vnd.oma.group-usage-list+xml -# application/vnd.oma.pal+xml -# application/vnd.oma.poc.detailed-progress-report+xml -# application/vnd.oma.poc.final-report+xml -# application/vnd.oma.poc.groups+xml -# application/vnd.oma.poc.invocation-descriptor+xml -# application/vnd.oma.poc.optimized-progress-report+xml -# application/vnd.oma.push -# application/vnd.oma.scidm.messages+xml -# application/vnd.oma.xcap-directory+xml -# application/vnd.omads-email+xml -# application/vnd.omads-file+xml -# application/vnd.omads-folder+xml -# application/vnd.omaloc-supl-init -application/vnd.openofficeorg.extension oxt -# application/vnd.openxmlformats-officedocument.custom-properties+xml -# application/vnd.openxmlformats-officedocument.customxmlproperties+xml -# application/vnd.openxmlformats-officedocument.drawing+xml -# application/vnd.openxmlformats-officedocument.drawingml.chart+xml -# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml -# application/vnd.openxmlformats-officedocument.extended-properties+xml -# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml -# application/vnd.openxmlformats-officedocument.presentationml.comments+xml -# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml -application/vnd.openxmlformats-officedocument.presentationml.presentation pptx -# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml -application/vnd.openxmlformats-officedocument.presentationml.slide sldx -# application/vnd.openxmlformats-officedocument.presentationml.slide+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml -application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx -# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml -# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml -# application/vnd.openxmlformats-officedocument.presentationml.tags+xml -application/vnd.openxmlformats-officedocument.presentationml.template potx -# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx -# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml -# application/vnd.openxmlformats-officedocument.theme+xml -# application/vnd.openxmlformats-officedocument.themeoverride+xml -# application/vnd.openxmlformats-officedocument.vmldrawing -# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.document docx -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx -# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml -# application/vnd.openxmlformats-package.core-properties+xml -# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml -# application/vnd.openxmlformats-package.relationships+xml -# application/vnd.quobject-quoxdocument -# application/vnd.osa.netdeploy -application/vnd.osgeo.mapguide.package mgp -# application/vnd.osgi.bundle -application/vnd.osgi.dp dp -application/vnd.osgi.subsystem esa -# application/vnd.otps.ct-kip+xml -application/vnd.palm pdb pqa oprc -# application/vnd.paos.xml -application/vnd.pawaafile paw -application/vnd.pg.format str -application/vnd.pg.osasli ei6 -# application/vnd.piaccess.application-licence -application/vnd.picsel efif -application/vnd.pmi.widget wg -# application/vnd.poc.group-advertisement+xml -application/vnd.pocketlearn plf -application/vnd.powerbuilder6 pbd -# application/vnd.powerbuilder6-s -# application/vnd.powerbuilder7 -# application/vnd.powerbuilder7-s -# application/vnd.powerbuilder75 -# application/vnd.powerbuilder75-s -# application/vnd.preminet -application/vnd.previewsystems.box box -application/vnd.proteus.magazine mgz -application/vnd.publishare-delta-tree qps -application/vnd.pvi.ptid1 ptid -# application/vnd.pwg-multiplexed -# application/vnd.pwg-xhtml-print+xml -# application/vnd.qualcomm.brew-app-res -application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb -# application/vnd.radisys.moml+xml -# application/vnd.radisys.msml+xml -# application/vnd.radisys.msml-audit+xml -# application/vnd.radisys.msml-audit-conf+xml -# application/vnd.radisys.msml-audit-conn+xml -# application/vnd.radisys.msml-audit-dialog+xml -# application/vnd.radisys.msml-audit-stream+xml -# application/vnd.radisys.msml-conf+xml -# application/vnd.radisys.msml-dialog+xml -# application/vnd.radisys.msml-dialog-base+xml -# application/vnd.radisys.msml-dialog-fax-detect+xml -# application/vnd.radisys.msml-dialog-fax-sendrecv+xml -# application/vnd.radisys.msml-dialog-group+xml -# application/vnd.radisys.msml-dialog-speech+xml -# application/vnd.radisys.msml-dialog-transform+xml -# application/vnd.rainstor.data -# application/vnd.rapid -application/vnd.realvnc.bed bed -application/vnd.recordare.musicxml mxl -application/vnd.recordare.musicxml+xml musicxml -# application/vnd.renlearn.rlprint -application/vnd.rig.cryptonote cryptonote -application/vnd.rim.cod cod -application/vnd.rn-realmedia rm -application/vnd.rn-realmedia-vbr rmvb -application/vnd.route66.link66+xml link66 -# application/vnd.rs-274x -# application/vnd.ruckus.download -# application/vnd.s3sms -application/vnd.sailingtracker.track st -# application/vnd.sbm.cid -# application/vnd.sbm.mid2 -# application/vnd.scribus -# application/vnd.sealed.3df -# application/vnd.sealed.csf -# application/vnd.sealed.doc -# application/vnd.sealed.eml -# application/vnd.sealed.mht -# application/vnd.sealed.net -# application/vnd.sealed.ppt -# application/vnd.sealed.tiff -# application/vnd.sealed.xls -# application/vnd.sealedmedia.softseal.html -# application/vnd.sealedmedia.softseal.pdf -application/vnd.seemail see -application/vnd.sema sema -application/vnd.semd semd -application/vnd.semf semf -application/vnd.shana.informed.formdata ifm -application/vnd.shana.informed.formtemplate itp -application/vnd.shana.informed.interchange iif -application/vnd.shana.informed.package ipk -application/vnd.simtech-mindmapper twd twds -application/vnd.smaf mmf -# application/vnd.smart.notebook -application/vnd.smart.teacher teacher -# application/vnd.software602.filler.form+xml -# application/vnd.software602.filler.form-xml-zip -application/vnd.solent.sdkm+xml sdkm sdkd -application/vnd.spotfire.dxp dxp -application/vnd.spotfire.sfs sfs -# application/vnd.sss-cod -# application/vnd.sss-dtf -# application/vnd.sss-ntf -application/vnd.stardivision.calc sdc -application/vnd.stardivision.draw sda -application/vnd.stardivision.impress sdd -application/vnd.stardivision.math smf -application/vnd.stardivision.writer sdw vor -application/vnd.stardivision.writer-global sgl -application/vnd.stepmania.package smzip -application/vnd.stepmania.stepchart sm -# application/vnd.street-stream -application/vnd.sun.xml.calc sxc -application/vnd.sun.xml.calc.template stc -application/vnd.sun.xml.draw sxd -application/vnd.sun.xml.draw.template std -application/vnd.sun.xml.impress sxi -application/vnd.sun.xml.impress.template sti -application/vnd.sun.xml.math sxm -application/vnd.sun.xml.writer sxw -application/vnd.sun.xml.writer.global sxg -application/vnd.sun.xml.writer.template stw -# application/vnd.sun.wadl+xml -application/vnd.sus-calendar sus susp -application/vnd.svd svd -# application/vnd.swiftview-ics -application/vnd.symbian.install sis sisx -application/vnd.syncml+xml xsm -application/vnd.syncml.dm+wbxml bdm -application/vnd.syncml.dm+xml xdm -# application/vnd.syncml.dm.notification -# application/vnd.syncml.ds.notification -application/vnd.tao.intent-module-archive tao -application/vnd.tcpdump.pcap pcap cap dmp -application/vnd.tmobile-livetv tmo -application/vnd.trid.tpt tpt -application/vnd.triscape.mxs mxs -application/vnd.trueapp tra -# application/vnd.truedoc -# application/vnd.ubisoft.webplayer -application/vnd.ufdl ufd ufdl -application/vnd.uiq.theme utz -application/vnd.umajin umj -application/vnd.unity unityweb -application/vnd.uoml+xml uoml -# application/vnd.uplanet.alert -# application/vnd.uplanet.alert-wbxml -# application/vnd.uplanet.bearer-choice -# application/vnd.uplanet.bearer-choice-wbxml -# application/vnd.uplanet.cacheop -# application/vnd.uplanet.cacheop-wbxml -# application/vnd.uplanet.channel -# application/vnd.uplanet.channel-wbxml -# application/vnd.uplanet.list -# application/vnd.uplanet.list-wbxml -# application/vnd.uplanet.listcmd -# application/vnd.uplanet.listcmd-wbxml -# application/vnd.uplanet.signal -application/vnd.vcx vcx -# application/vnd.vd-study -# application/vnd.vectorworks -# application/vnd.verimatrix.vcas -# application/vnd.vidsoft.vidconference -application/vnd.visio vsd vst vss vsw -application/vnd.visionary vis -# application/vnd.vividence.scriptfile -application/vnd.vsf vsf -# application/vnd.wap.sic -# application/vnd.wap.slc -application/vnd.wap.wbxml wbxml -application/vnd.wap.wmlc wmlc -application/vnd.wap.wmlscriptc wmlsc -application/vnd.webturbo wtb -# application/vnd.wfa.wsc -# application/vnd.wmc -# application/vnd.wmf.bootstrap -# application/vnd.wolfram.mathematica -# application/vnd.wolfram.mathematica.package -application/vnd.wolfram.player nbp -application/vnd.wordperfect wpd -application/vnd.wqd wqd -# application/vnd.wrq-hp3000-labelled -application/vnd.wt.stf stf -# application/vnd.wv.csp+wbxml -# application/vnd.wv.csp+xml -# application/vnd.wv.ssp+xml -application/vnd.xara xar -application/vnd.xfdl xfdl -# application/vnd.xfdl.webform -# application/vnd.xmi+xml -# application/vnd.xmpie.cpkg -# application/vnd.xmpie.dpkg -# application/vnd.xmpie.plan -# application/vnd.xmpie.ppkg -# application/vnd.xmpie.xlim -application/vnd.yamaha.hv-dic hvd -application/vnd.yamaha.hv-script hvs -application/vnd.yamaha.hv-voice hvp -application/vnd.yamaha.openscoreformat osf -application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg -# application/vnd.yamaha.remote-setup -application/vnd.yamaha.smaf-audio saf -application/vnd.yamaha.smaf-phrase spf -# application/vnd.yamaha.through-ngn -# application/vnd.yamaha.tunnel-udpencap -application/vnd.yellowriver-custom-menu cmp -application/vnd.zul zir zirz -application/vnd.zzazz.deck+xml zaz -application/voicexml+xml vxml -# application/vq-rtcpxr -# application/watcherinfo+xml -# application/whoispp-query -# application/whoispp-response -application/widget wgt -application/winhlp hlp -# application/wita -# application/wordperfect5.1 -application/wsdl+xml wsdl -application/wspolicy+xml wspolicy -application/x-7z-compressed 7z -application/x-abiword abw -application/x-ace-compressed ace -# application/x-amf -application/x-apple-diskimage dmg -application/x-authorware-bin aab x32 u32 vox -application/x-authorware-map aam -application/x-authorware-seg aas -application/x-bcpio bcpio -application/x-bittorrent torrent -application/x-blorb blb blorb -application/x-bzip bz -application/x-bzip2 bz2 boz -application/x-cbr cbr cba cbt cbz cb7 -application/x-cdlink vcd -application/x-cfs-compressed cfs -application/x-chat chat -application/x-chess-pgn pgn -application/x-conference nsc -# application/x-compress -application/x-cpio cpio -application/x-csh csh -application/x-debian-package deb udeb -application/x-dgc-compressed dgc -application/x-director dir dcr dxr cst cct cxt w3d fgd swa -application/x-doom wad -application/x-dtbncx+xml ncx -application/x-dtbook+xml dtb -application/x-dtbresource+xml res -application/x-dvi dvi -application/x-envoy evy -application/x-eva eva -application/x-font-bdf bdf -# application/x-font-dos -# application/x-font-framemaker -application/x-font-ghostscript gsf -# application/x-font-libgrx -application/x-font-linux-psf psf -application/x-font-otf otf -application/x-font-pcf pcf -application/x-font-snf snf -# application/x-font-speedo -# application/x-font-sunos-news -application/x-font-ttf ttf ttc -application/x-font-type1 pfa pfb pfm afm -application/x-font-woff woff -# application/x-font-vfont -application/x-freearc arc -application/x-futuresplash spl -application/x-gca-compressed gca -application/x-glulx ulx -application/x-gnumeric gnumeric -application/x-gramps-xml gramps -application/x-gtar gtar -# application/x-gzip -application/x-hdf hdf -application/x-install-instructions install -application/x-iso9660-image iso -application/x-java-jnlp-file jnlp -application/x-latex latex -application/x-lzh-compressed lzh lha -application/x-mie mie -application/x-mobipocket-ebook prc mobi -application/x-ms-application application -application/x-ms-shortcut lnk -application/x-ms-wmd wmd -application/x-ms-wmz wmz -application/x-ms-xbap xbap -application/x-msaccess mdb -application/x-msbinder obd -application/x-mscardfile crd -application/x-msclip clp -application/x-msdownload exe dll com bat msi -application/x-msmediaview mvb m13 m14 -application/x-msmetafile wmf wmz emf emz -application/x-msmoney mny -application/x-mspublisher pub -application/x-msschedule scd -application/x-msterminal trm -application/x-mswrite wri -application/x-netcdf nc cdf -application/x-nzb nzb -application/x-pkcs12 p12 pfx -application/x-pkcs7-certificates p7b spc -application/x-pkcs7-certreqresp p7r -application/x-rar-compressed rar -application/x-research-info-systems ris -application/x-sh sh -application/x-shar shar -application/x-shockwave-flash swf -application/x-silverlight-app xap -application/x-sql sql -application/x-stuffit sit -application/x-stuffitx sitx -application/x-subrip srt -application/x-sv4cpio sv4cpio -application/x-sv4crc sv4crc -application/x-t3vm-image t3 -application/x-tads gam -application/x-tar tar -application/x-tcl tcl -application/x-tex tex -application/x-tex-tfm tfm -application/x-texinfo texinfo texi -application/x-tgif obj -application/x-ustar ustar -application/x-wais-source src -application/x-x509-ca-cert der crt -application/x-xfig fig -application/x-xliff+xml xlf -application/x-xpinstall xpi -application/x-xz xz -application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8 -# application/x400-bp -application/xaml+xml xaml -# application/xcap-att+xml -# application/xcap-caps+xml -application/xcap-diff+xml xdf -# application/xcap-el+xml -# application/xcap-error+xml -# application/xcap-ns+xml -# application/xcon-conference-info-diff+xml -# application/xcon-conference-info+xml -application/xenc+xml xenc -application/xhtml+xml xhtml xht -# application/xhtml-voice+xml -application/xml xml xsl -application/xml-dtd dtd -# application/xml-external-parsed-entity -# application/xmpp+xml -application/xop+xml xop -application/xproc+xml xpl -application/xslt+xml xslt -application/xspf+xml xspf -application/xv+xml mxml xhvml xvml xvm -application/yang yang -application/yin+xml yin -application/zip zip -# audio/1d-interleaved-parityfec -# audio/32kadpcm -# audio/3gpp -# audio/3gpp2 -# audio/ac3 -audio/adpcm adp -# audio/amr -# audio/amr-wb -# audio/amr-wb+ -# audio/asc -# audio/atrac-advanced-lossless -# audio/atrac-x -# audio/atrac3 -audio/basic au snd -# audio/bv16 -# audio/bv32 -# audio/clearmode -# audio/cn -# audio/dat12 -# audio/dls -# audio/dsr-es201108 -# audio/dsr-es202050 -# audio/dsr-es202211 -# audio/dsr-es202212 -# audio/dv -# audio/dvi4 -# audio/eac3 -# audio/evrc -# audio/evrc-qcp -# audio/evrc0 -# audio/evrc1 -# audio/evrcb -# audio/evrcb0 -# audio/evrcb1 -# audio/evrcwb -# audio/evrcwb0 -# audio/evrcwb1 -# audio/example -# audio/fwdred -# audio/g719 -# audio/g722 -# audio/g7221 -# audio/g723 -# audio/g726-16 -# audio/g726-24 -# audio/g726-32 -# audio/g726-40 -# audio/g728 -# audio/g729 -# audio/g7291 -# audio/g729d -# audio/g729e -# audio/gsm -# audio/gsm-efr -# audio/gsm-hr-08 -# audio/ilbc -# audio/ip-mr_v2.5 -# audio/isac -# audio/l16 -# audio/l20 -# audio/l24 -# audio/l8 -# audio/lpc -audio/midi mid midi kar rmi -# audio/mobile-xmf -audio/mp4 mp4a -# audio/mp4a-latm -# audio/mpa -# audio/mpa-robust -audio/mpeg mpga mp2 mp2a mp3 m2a m3a -# audio/mpeg4-generic -# audio/musepack -audio/ogg oga ogg spx -# audio/opus -# audio/parityfec -# audio/pcma -# audio/pcma-wb -# audio/pcmu-wb -# audio/pcmu -# audio/prs.sid -# audio/qcelp -# audio/red -# audio/rtp-enc-aescm128 -# audio/rtp-midi -# audio/rtx -audio/s3m s3m -audio/silk sil -# audio/smv -# audio/smv0 -# audio/smv-qcp -# audio/sp-midi -# audio/speex -# audio/t140c -# audio/t38 -# audio/telephone-event -# audio/tone -# audio/uemclip -# audio/ulpfec -# audio/vdvi -# audio/vmr-wb -# audio/vnd.3gpp.iufp -# audio/vnd.4sb -# audio/vnd.audiokoz -# audio/vnd.celp -# audio/vnd.cisco.nse -# audio/vnd.cmles.radio-events -# audio/vnd.cns.anp1 -# audio/vnd.cns.inf1 -audio/vnd.dece.audio uva uvva -audio/vnd.digital-winds eol -# audio/vnd.dlna.adts -# audio/vnd.dolby.heaac.1 -# audio/vnd.dolby.heaac.2 -# audio/vnd.dolby.mlp -# audio/vnd.dolby.mps -# audio/vnd.dolby.pl2 -# audio/vnd.dolby.pl2x -# audio/vnd.dolby.pl2z -# audio/vnd.dolby.pulse.1 -audio/vnd.dra dra -audio/vnd.dts dts -audio/vnd.dts.hd dtshd -# audio/vnd.dvb.file -# audio/vnd.everad.plj -# audio/vnd.hns.audio -audio/vnd.lucent.voice lvp -audio/vnd.ms-playready.media.pya pya -# audio/vnd.nokia.mobile-xmf -# audio/vnd.nortel.vbk -audio/vnd.nuera.ecelp4800 ecelp4800 -audio/vnd.nuera.ecelp7470 ecelp7470 -audio/vnd.nuera.ecelp9600 ecelp9600 -# audio/vnd.octel.sbc -# audio/vnd.qcelp -# audio/vnd.rhetorex.32kadpcm -audio/vnd.rip rip -# audio/vnd.sealedmedia.softseal.mpeg -# audio/vnd.vmx.cvsd -# audio/vorbis -# audio/vorbis-config -audio/webm weba -audio/x-aac aac -audio/x-aiff aif aiff aifc -audio/x-caf caf -audio/x-flac flac -audio/x-matroska mka -audio/x-mpegurl m3u -audio/x-ms-wax wax -audio/x-ms-wma wma -audio/x-pn-realaudio ram ra -audio/x-pn-realaudio-plugin rmp -# audio/x-tta -audio/x-wav wav -audio/xm xm -chemical/x-cdx cdx -chemical/x-cif cif -chemical/x-cmdf cmdf -chemical/x-cml cml -chemical/x-csml csml -# chemical/x-pdb -chemical/x-xyz xyz -image/bmp bmp -image/cgm cgm -# image/example -# image/fits -image/g3fax g3 -image/gif gif -image/ief ief -# image/jp2 -image/jpeg jpeg jpg jpe -# image/jpm -# image/jpx -image/ktx ktx -# image/naplps -image/png png -image/prs.btif btif -# image/prs.pti -image/sgi sgi -image/svg+xml svg svgz -# image/t38 -image/tiff tiff tif -# image/tiff-fx -image/vnd.adobe.photoshop psd -# image/vnd.cns.inf2 -image/vnd.dece.graphic uvi uvvi uvg uvvg -image/vnd.dvb.subtitle sub -image/vnd.djvu djvu djv -image/vnd.dwg dwg -image/vnd.dxf dxf -image/vnd.fastbidsheet fbs -image/vnd.fpx fpx -image/vnd.fst fst -image/vnd.fujixerox.edmics-mmr mmr -image/vnd.fujixerox.edmics-rlc rlc -# image/vnd.globalgraphics.pgb -# image/vnd.microsoft.icon -# image/vnd.mix -image/vnd.ms-modi mdi -image/vnd.ms-photo wdp -image/vnd.net-fpx npx -# image/vnd.radiance -# image/vnd.sealed.png -# image/vnd.sealedmedia.softseal.gif -# image/vnd.sealedmedia.softseal.jpg -# image/vnd.svf -image/vnd.wap.wbmp wbmp -image/vnd.xiff xif -image/webp webp -image/x-3ds 3ds -image/x-cmu-raster ras -image/x-cmx cmx -image/x-freehand fh fhc fh4 fh5 fh7 -image/x-icon ico -image/x-mrsid-image sid -image/x-pcx pcx -image/x-pict pic pct -image/x-portable-anymap pnm -image/x-portable-bitmap pbm -image/x-portable-graymap pgm -image/x-portable-pixmap ppm -image/x-rgb rgb -image/x-tga tga -image/x-xbitmap xbm -image/x-xpixmap xpm -image/x-xwindowdump xwd -# message/cpim -# message/delivery-status -# message/disposition-notification -# message/example -# message/external-body -# message/feedback-report -# message/global -# message/global-delivery-status -# message/global-disposition-notification -# message/global-headers -# message/http -# message/imdn+xml -# message/news -# message/partial -message/rfc822 eml mime -# message/s-http -# message/sip -# message/sipfrag -# message/tracking-status -# message/vnd.si.simp -# model/example -model/iges igs iges -model/mesh msh mesh silo -model/vnd.collada+xml dae -model/vnd.dwf dwf -# model/vnd.flatland.3dml -model/vnd.gdl gdl -# model/vnd.gs-gdl -# model/vnd.gs.gdl -model/vnd.gtw gtw -# model/vnd.moml+xml -model/vnd.mts mts -# model/vnd.parasolid.transmit.binary -# model/vnd.parasolid.transmit.text -model/vnd.vtu vtu -model/vrml wrl vrml -model/x3d+binary x3db x3dbz -model/x3d+vrml x3dv x3dvz -model/x3d+xml x3d x3dz -# multipart/alternative -# multipart/appledouble -# multipart/byteranges -# multipart/digest -# multipart/encrypted -# multipart/example -# multipart/form-data -# multipart/header-set -# multipart/mixed -# multipart/parallel -# multipart/related -# multipart/report -# multipart/signed -# multipart/voice-message -# text/1d-interleaved-parityfec -text/cache-manifest appcache -text/calendar ics ifb -text/css css -text/csv csv -# text/directory -# text/dns -# text/ecmascript -# text/enriched -# text/example -# text/fwdred -text/html html htm -# text/javascript -text/n3 n3 -# text/parityfec -text/plain txt text conf def list log in -# text/prs.fallenstein.rst -text/prs.lines.tag dsc -# text/vnd.radisys.msml-basic-layout -# text/red -# text/rfc822-headers -text/richtext rtx -# text/rtf -# text/rtp-enc-aescm128 -# text/rtx -text/sgml sgml sgm -# text/t140 -text/tab-separated-values tsv -text/troff t tr roff man me ms -text/turtle ttl -# text/ulpfec -text/uri-list uri uris urls -text/vcard vcard -# text/vnd.abc -text/vnd.curl curl -text/vnd.curl.dcurl dcurl -text/vnd.curl.scurl scurl -text/vnd.curl.mcurl mcurl -# text/vnd.dmclientscript -text/vnd.dvb.subtitle sub -# text/vnd.esmertec.theme-descriptor -text/vnd.fly fly -text/vnd.fmi.flexstor flx -text/vnd.graphviz gv -text/vnd.in3d.3dml 3dml -text/vnd.in3d.spot spot -# text/vnd.iptc.newsml -# text/vnd.iptc.nitf -# text/vnd.latex-z -# text/vnd.motorola.reflex -# text/vnd.ms-mediapackage -# text/vnd.net2phone.commcenter.command -# text/vnd.si.uricatalogue -text/vnd.sun.j2me.app-descriptor jad -# text/vnd.trolltech.linguist -# text/vnd.wap.si -# text/vnd.wap.sl -text/vnd.wap.wml wml -text/vnd.wap.wmlscript wmls -text/x-asm s asm -text/x-c c cc cxx cpp h hh dic -text/x-fortran f for f77 f90 -text/x-java-source java -text/x-opml opml -text/x-pascal p pas -text/x-nfo nfo -text/x-setext etx -text/x-sfv sfv -text/x-uuencode uu -text/x-vcalendar vcs -text/x-vcard vcf -# text/xml -# text/xml-external-parsed-entity -# video/1d-interleaved-parityfec -video/3gpp 3gp -# video/3gpp-tt -video/3gpp2 3g2 -# video/bmpeg -# video/bt656 -# video/celb -# video/dv -# video/example -video/h261 h261 -video/h263 h263 -# video/h263-1998 -# video/h263-2000 -video/h264 h264 -# video/h264-rcdo -# video/h264-svc -video/jpeg jpgv -# video/jpeg2000 -video/jpm jpm jpgm -video/mj2 mj2 mjp2 -# video/mp1s -# video/mp2p -# video/mp2t -video/mp4 mp4 mp4v mpg4 -# video/mp4v-es -video/mpeg mpeg mpg mpe m1v m2v -# video/mpeg4-generic -# video/mpv -# video/nv -video/ogg ogv -# video/parityfec -# video/pointer -video/quicktime qt mov -# video/raw -# video/rtp-enc-aescm128 -# video/rtx -# video/smpte292m -# video/ulpfec -# video/vc1 -# video/vnd.cctv -video/vnd.dece.hd uvh uvvh -video/vnd.dece.mobile uvm uvvm -# video/vnd.dece.mp4 -video/vnd.dece.pd uvp uvvp -video/vnd.dece.sd uvs uvvs -video/vnd.dece.video uvv uvvv -# video/vnd.directv.mpeg -# video/vnd.directv.mpeg-tts -# video/vnd.dlna.mpeg-tts -video/vnd.dvb.file dvb -video/vnd.fvt fvt -# video/vnd.hns.video -# video/vnd.iptvforum.1dparityfec-1010 -# video/vnd.iptvforum.1dparityfec-2005 -# video/vnd.iptvforum.2dparityfec-1010 -# video/vnd.iptvforum.2dparityfec-2005 -# video/vnd.iptvforum.ttsavc -# video/vnd.iptvforum.ttsmpeg2 -# video/vnd.motorola.video -# video/vnd.motorola.videop -video/vnd.mpegurl mxu m4u -video/vnd.ms-playready.media.pyv pyv -# video/vnd.nokia.interleaved-multimedia -# video/vnd.nokia.videovoip -# video/vnd.objectvideo -# video/vnd.sealed.mpeg1 -# video/vnd.sealed.mpeg4 -# video/vnd.sealed.swf -# video/vnd.sealedmedia.softseal.mov -video/vnd.uvvu.mp4 uvu uvvu -video/vnd.vivo viv -video/webm webm -video/x-f4v f4v -video/x-fli fli -video/x-flv flv -video/x-m4v m4v -video/x-matroska mkv mk3d mks -video/x-mng mng -video/x-ms-asf asf asx -video/x-ms-vob vob -video/x-ms-wm wm -video/x-ms-wmv wmv -video/x-ms-wmx wmx -video/x-ms-wvx wvx -video/x-msvideo avi -video/x-sgi-movie movie -video/x-smv smv -x-conference/x-cooltalk ice diff --git a/node_modules/nodetime/node_modules/request/node_modules/mime/types/node.types b/node_modules/nodetime/node_modules/request/node_modules/mime/types/node.types deleted file mode 100644 index 9097334..0000000 --- a/node_modules/nodetime/node_modules/request/node_modules/mime/types/node.types +++ /dev/null @@ -1,59 +0,0 @@ -# What: Google Chrome Extension -# Why: To allow apps to (work) be served with the right content type header. -# http://codereview.chromium.org/2830017 -# Added by: niftylettuce -application/x-chrome-extension crx - -# What: OTF Message Silencer -# Why: To silence the "Resource interpreted as font but transferred with MIME -# type font/otf" message that occurs in Google Chrome -# Added by: niftylettuce -font/opentype otf - -# What: HTC support -# Why: To properly render .htc files such as CSS3PIE -# Added by: niftylettuce -text/x-component htc - -# What: HTML5 application cache manifest -# Why: De-facto standard. Required by Mozilla browser when serving HTML5 apps -# per https://developer.mozilla.org/en/offline_resources_in_firefox -# Added by: louisremi -text/cache-manifest appcache manifest - -# What: node binary buffer format -# Why: semi-standard extension w/in the node community -# Added by: tootallnate -application/octet-stream buffer - -# What: The "protected" MP-4 formats used by iTunes. -# Why: Required for streaming music to browsers (?) -# Added by: broofa -application/mp4 m4p -audio/mp4 m4a - -# What: Music playlist format (http://en.wikipedia.org/wiki/M3U) -# Why: See https://github.com/bentomas/node-mime/pull/6 -# Added by: mjrusso -application/x-mpegURL m3u8 - -# What: Video format, Part of RFC1890 -# Why: See https://github.com/bentomas/node-mime/pull/6 -# Added by: mjrusso -video/MP2T ts - -# What: The FLAC lossless codec format -# Why: Streaming and serving FLAC audio -# Added by: jacobrask -audio/flac flac - -# What: EventSource mime type -# Why: mime type of Server-Sent Events stream -# http://www.w3.org/TR/eventsource/#text-event-stream -# Added by: francois2metz -text/event-stream event-stream - -# What: Mozilla App manifest mime type -# Why: https://developer.mozilla.org/en/Apps/Manifest#Serving_manifests -# Added by: ednapiranha -application/x-web-app-manifest+json webapp diff --git a/node_modules/nodetime/node_modules/request/oauth.js b/node_modules/nodetime/node_modules/request/oauth.js deleted file mode 100644 index e35bfa6..0000000 --- a/node_modules/nodetime/node_modules/request/oauth.js +++ /dev/null @@ -1,43 +0,0 @@ -var crypto = require('crypto') - , qs = require('querystring') - ; - -function sha1 (key, body) { - return crypto.createHmac('sha1', key).update(body).digest('base64') -} - -function rfc3986 (str) { - return encodeURIComponent(str) - .replace(/!/g,'%21') - .replace(/\*/g,'%2A') - .replace(/\(/g,'%28') - .replace(/\)/g,'%29') - .replace(/'/g,'%27') - ; -} - -function hmacsign (httpMethod, base_uri, params, consumer_secret, token_secret) { - // adapted from https://dev.twitter.com/docs/auth/oauth and - // https://dev.twitter.com/docs/auth/creating-signature - - var querystring = Object.keys(params).sort().map(function(key){ - // big WTF here with the escape + encoding but it's what twitter wants - return escape(rfc3986(key)) + "%3D" + escape(rfc3986(params[key])) - }).join('%26') - - var base = [ - httpMethod ? httpMethod.toUpperCase() : 'GET', - rfc3986(base_uri), - querystring - ].join('&') - - var key = [ - consumer_secret, - token_secret || '' - ].map(rfc3986).join('&') - - return sha1(key, base) -} - -exports.hmacsign = hmacsign -exports.rfc3986 = rfc3986 diff --git a/node_modules/nodetime/node_modules/request/package.json b/node_modules/nodetime/node_modules/request/package.json deleted file mode 100644 index 6a256de..0000000 --- a/node_modules/nodetime/node_modules/request/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "request", - "description": "Simplified HTTP request client.", - "tags": [ - "http", - "simple", - "util", - "utility" - ], - "version": "2.12.0", - "author": { - "name": "Mikeal Rogers", - "email": "mikeal.rogers@gmail.com" - }, - "repository": { - "type": "git", - "url": "http://github.com/mikeal/request.git" - }, - "bugs": { - "url": "http://github.com/mikeal/request/issues" - }, - "engines": [ - "node >= 0.3.6" - ], - "main": "./main", - "dependencies": { - "form-data": "~0.0.3", - "mime": "~1.2.7" - }, - "bundleDependencies": [ - "form-data", - "mime" - ], - "scripts": { - "test": "node tests/run.js" - }, - "readme": "# Request -- Simplified HTTP request method\n\n## Install\n\n
      \n  npm install request\n
      \n\nOr from source:\n\n
      \n  git clone git://github.com/mikeal/request.git \n  cd request\n  npm link\n
      \n\n## Super simple to use\n\nRequest is designed to be the simplest way possible to make http calls. It supports HTTPS and follows redirects by default.\n\n```javascript\nvar request = require('request');\nrequest('http://www.google.com', function (error, response, body) {\n if (!error && response.statusCode == 200) {\n console.log(body) // Print the google web page.\n }\n})\n```\n\n## Streaming\n\nYou can stream any response to a file stream.\n\n```javascript\nrequest('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png'))\n```\n\nYou can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types, in this case `application/json`, and use the proper content-type in the PUT request if one is not already provided in the headers.\n\n```javascript\nfs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json'))\n```\n\nRequest can also pipe to itself. When doing so the content-type and content-length will be preserved in the PUT headers.\n\n```javascript\nrequest.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png'))\n```\n\nNow let's get fancy.\n\n```javascript\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n if (req.method === 'PUT') {\n req.pipe(request.put('http://mysite.com/doodle.png'))\n } else if (req.method === 'GET' || req.method === 'HEAD') {\n request.get('http://mysite.com/doodle.png').pipe(resp)\n } \n }\n})\n```\n\nYou can also pipe() from a http.ServerRequest instance and to a http.ServerResponse instance. The HTTP method and headers will be sent as well as the entity-body data. Which means that, if you don't really care about security, you can do:\n\n```javascript\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n var x = request('http://mysite.com/doodle.png')\n req.pipe(x)\n x.pipe(resp)\n }\n})\n```\n\nAnd since pipe() returns the destination stream in node 0.5.x you can do one line proxying :)\n\n```javascript\nreq.pipe(request('http://mysite.com/doodle.png')).pipe(resp)\n```\n\nAlso, none of this new functionality conflicts with requests previous features, it just expands them.\n\n```javascript\nvar r = request.defaults({'proxy':'http://localproxy.com'})\n\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n r.get('http://google.com/doodle.png').pipe(resp)\n }\n})\n```\nYou can still use intermediate proxies, the requests will still follow HTTP forwards, etc.\n\n## Forms\n\n`request` supports `application/x-www-form-urlencoded` and `multipart/form-data` form uploads. For `multipart/related` refer to the `multipart` API.\n\nUrl encoded forms are simple\n\n```javascript\nrequest.post('http://service.com/upload', {form:{key:'value'}})\n// or\nrequest.post('http://service.com/upload').form({key:'value'})\n```\n\nFor `multipart/form-data` we use the [form-data](https://github.com/felixge/node-form-data) library by [@felixge](https://github.com/felixge). You don't need to worry about piping the form object or setting the headers, `request` will handle that for you.\n\n```javascript\nvar r = request.post('http://service.com/upload')\nvar form = r.form()\nform.append('my_field', 'my_value')\nform.append('my_buffer', new Buffer([1, 2, 3]))\nform.append('my_file', fs.createReadStream(path.join(__dirname, 'doodle.png'))\nform.append('remote_file', request('http://google.com/doodle.png'))\n```\n\n## OAuth Signing\n\n```javascript\n// Twitter OAuth\nvar qs = require('querystring')\n , oauth =\n { callback: 'http://mysite.com/callback/'\n , consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n }\n , url = 'https://api.twitter.com/oauth/request_token'\n ;\nrequest.post({url:url, oauth:oauth}, function (e, r, body) {\n // Assume by some stretch of magic you aquired the verifier\n var access_token = qs.parse(body)\n , oauth = \n { consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n , token: access_token.oauth_token\n , verifier: VERIFIER\n , token_secret: access_token.oauth_token_secret\n }\n , url = 'https://api.twitter.com/oauth/access_token'\n ;\n request.post({url:url, oauth:oauth}, function (e, r, body) {\n var perm_token = qs.parse(body)\n , oauth = \n { consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n , token: perm_token.oauth_token\n , token_secret: perm_token.oauth_token_secret\n }\n , url = 'https://api.twitter.com/1/users/show.json?'\n , params = \n { screen_name: perm_token.screen_name\n , user_id: perm_token.user_id\n }\n ;\n url += qs.stringify(params)\n request.get({url:url, oauth:oauth, json:true}, function (e, r, user) {\n console.log(user)\n })\n })\n})\n```\n\n\n\n### request(options, callback)\n\nThe first argument can be either a url or an options object. The only required option is uri, all others are optional.\n\n* `uri` || `url` - fully qualified uri or a parsed url object from url.parse()\n* `qs` - object containing querystring values to be appended to the uri\n* `method` - http method, defaults to GET\n* `headers` - http headers, defaults to {}\n* `body` - entity body for POST and PUT requests. Must be buffer or string.\n* `form` - when passed an object this will set `body` but to a querystring representation of value and adds `Content-type: application/x-www-form-urlencoded; charset=utf-8` header. When passed no option a FormData instance is returned that will be piped to request.\n* `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header. Additionally, parses the response body as json.\n* `multipart` - (experimental) array of objects which contains their own headers and `body` attribute. Sends `multipart/related` request. See example below.\n* `followRedirect` - follow HTTP 3xx responses as redirects. defaults to true.\n* `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects. defaults to false.\n* `maxRedirects` - the maximum number of redirects to follow, defaults to 10.\n* `encoding` - Encoding to be used on `setEncoding` of response data. If set to `null`, the body is returned as a Buffer.\n* `pool` - A hash object containing the agents for these requests. If omitted this request will use the global pool which is set to node's default maxSockets.\n* `pool.maxSockets` - Integer containing the maximum amount of sockets in the pool.\n* `timeout` - Integer containing the number of milliseconds to wait for a request to respond before aborting the request\t\n* `proxy` - An HTTP proxy to be used. Support proxy Auth with Basic Auth the same way it's supported with the `url` parameter by embedding the auth info in the uri.\n* `oauth` - Options for OAuth HMAC-SHA1 signing, see documentation above.\n* `strictSSL` - Set to `true` to require that SSL certificates be valid. Note: to use your own certificate authority, you need to specify an agent that was created with that ca as an option.\n* `jar` - Set to `false` if you don't want cookies to be remembered for future use or define your custom cookie jar (see examples section)\n* `aws` - object containing aws signing information, should have the properties `key` and `secret` as well as `bucket` unless you're specifying your bucket as part of the path, or you are making a request that doesn't use a bucket (i.e. GET Services)\n\n\nThe callback argument gets 3 arguments. The first is an error when applicable (usually from the http.Client option not the http.ClientRequest object). The second in an http.ClientResponse object. The third is the response body String or Buffer.\n\n## Convenience methods\n\nThere are also shorthand methods for different HTTP METHODs and some other conveniences.\n\n### request.defaults(options) \n \nThis method returns a wrapper around the normal request API that defaults to whatever options you pass in to it.\n\n### request.put\n\nSame as request() but defaults to `method: \"PUT\"`.\n\n```javascript\nrequest.put(url)\n```\n\n### request.post\n\nSame as request() but defaults to `method: \"POST\"`.\n\n```javascript\nrequest.post(url)\n```\n\n### request.head\n\nSame as request() but defaults to `method: \"HEAD\"`.\n\n```javascript\nrequest.head(url)\n```\n\n### request.del\n\nSame as request() but defaults to `method: \"DELETE\"`.\n\n```javascript\nrequest.del(url)\n```\n\n### request.get\n\nAlias to normal request method for uniformity.\n\n```javascript\nrequest.get(url)\n```\n### request.cookie\n\nFunction that creates a new cookie.\n\n```javascript\nrequest.cookie('cookie_string_here')\n```\n### request.jar\n\nFunction that creates a new cookie jar.\n\n```javascript\nrequest.jar()\n```\n\n\n## Examples:\n\n```javascript\n var request = require('request')\n , rand = Math.floor(Math.random()*100000000).toString()\n ;\n request(\n { method: 'PUT'\n , uri: 'http://mikeal.iriscouch.com/testjs/' + rand\n , multipart: \n [ { 'content-type': 'application/json'\n , body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}})\n }\n , { body: 'I am an attachment' }\n ] \n }\n , function (error, response, body) {\n if(response.statusCode == 201){\n console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand)\n } else {\n console.log('error: '+ response.statusCode)\n console.log(body)\n }\n }\n )\n```\nCookies are enabled by default (so they can be used in subsequent requests). To disable cookies set jar to false (either in defaults or in the options sent).\n\n```javascript\nvar request = request.defaults({jar: false})\nrequest('http://www.google.com', function () {\n request('http://images.google.com')\n})\n```\n\nIf you to use a custom cookie jar (instead of letting request use its own global cookie jar) you do so by setting the jar default or by specifying it as an option:\n\n```javascript\nvar j = request.jar()\nvar request = request.defaults({jar:j})\nrequest('http://www.google.com', function () {\n request('http://images.google.com')\n})\n```\nOR\n\n```javascript\nvar j = request.jar()\nvar cookie = request.cookie('your_cookie_here')\nj.add(cookie)\nrequest({url: 'http://www.google.com', jar: j}, function () {\n request('http://images.google.com')\n})\n```\n", - "_id": "request@2.12.0", - "_from": "request@2.12.0" -} diff --git a/node_modules/nodetime/node_modules/request/tests/googledoodle.png b/node_modules/nodetime/node_modules/request/tests/googledoodle.png deleted file mode 100644 index f80c9c52d3c507996535a19ee0bcfe3821de322d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38510 zcmbTdbx>Tv*DX4@1RI>-?lQRh;O>J3cXtmG2<{Nv-Gaj)!C~;=9^56kgvjIf-COs* z`_+3@uipNr&#CTO-Bo9w?%r#!{crW(20#V?_y67C|Fq9LQ8BOoHd!M}SOAc+G2 zAj7>)0*`=qJHYpaOC6sL}92G*SfIn&^bI(&p}TJYgwBS{5F}^fKY8 z#Su*dEpG_q|A9vN-}rCSz`_3q0Tlu5ty>NVc!P&WKte=DMMOe+8~2|TAtC{hsc}J4 zD0rIY?ljzCDX93;#Z3bQv~TF)sdIEZo+X5qyVo}|+NI5dpVI!V12Eo}1`k940we%G z_hnUqcD*yl3?kMW4bGdQ<%S+Nq>-S=Nrt}4WwkjGq>OTY%!B=CJ8w#IenptLVpc_V z1`f4~Xi@?&sD@*|R)6y)`SB0wheqC}eNj-v9bcmL2^X6*MoZm{esqIwe2z;JRYD?H zR`$jhNv|+C@Vp5MD0Bx=i}7t@UfDUk|38gA#%a#oGvFUC_!A^7VE7@Eu7 zDy*la? z46rH)2FlGnV3n*)<-E8exU`^3QBJh~j)^!{)iNuDXE4+=EIIn_*NRI0z|;&@DLxnl z+|_CRDWB5}X@042CH!UDJgH(rDj%2suACjAniipk{VR5Fexn+!oRl=fVu^c_Azb}S zY-3Y2cN{j_9osMJo&bB|j}L0aTK@pGdMANi7YzZUb3A&(6vt*lb5pCgKK}rqxhS|J zW74A%DRgbR8s)MaSXBY`$gbvx%2lLRaLE$BRFaVZVXwhVdE=WLTFYKD0v z6H}C{+FOqTAxB%WH&WLLnM1E(u6{)FtCn!}PHo&@GgY~}a`OuO`478g$0?$syQKc> z!-o)$Frmd$X?=!eNdhD~lM*D8krn&Frxa>@pj|~|=4d}0k@iCz$_s0Nx5}?G;u*TS zn9Au(${5pdW|Ij4$}m$M(-t>T0iQMZKR^?D`9IN~SQW7inU>KGmi~WM5S|H8< zvb8MtTf*rP;8O8{brk?qSwOV{zcUKHDSg*6^5w*~+0q5BZ_DHzWQn-IJq6cyir2e7 zqDr&0bMC%os)oDb!n|(BdmbU?Y7UXrk)s48QFNLB0<5hCU0IA;c||y|tcph{Q2IWv zf_Z2l){Fw+5BTwm)xfB2BHU?X|X$n zGKNfNQ$PxO2~BlQT*J38kd!2+LK3`i+ctZA?^?sMJw2$oA;&=ZGk*;6kvo=A{4u#d zQ$#rWAuYQl*;<>CszpQ=)q9Y)SD^4{hDCU0Qf5R4e?2hg4i6YZ)3Mi7Z`6_ER1)*e zW%D$9K(RkJKWKb8IM<;ULBRWCiKRW+F~3mGBQ!N?-zU^>bQqUxIVF$N;{A^Cic`4@ z8|=wo{ebS1>de%@?*Jqx-JID82IjKpP=**KeX7C^l}M)ad@+DlG{AkdPDeObbAv7_ z(5I*&To3RbBAU=o77DkzOBQ;V&=h%4nTfmIQs{vrB&wa`ux82QE4LQ%Q5%Z`2hmb2byW*cHDV{3L|IuNBax7f<}C%C2A z++doKajscVL@P-+A)(a|hqBjfZ3kr2RV2eO?yE*x60JbO;~fj2DMlyDdp91?wXNpJ zE>N4zyY6zd-bp(~y1H`BH|92Y%!?)J0{IEo9SWPO6<=2S@BcVMbgjgq0Flc_)+y&v zA{5I2IlZExjVpfR&pI$)WP*Tq7%3#!I3~RxZp)Omv>`;my-Cj)QnCaWX1?tS)lnII zJQi79FVvRf4fxTYZdka(C+qbZFCwnk={4r;y`vz)T$atsSAs*v8w-qF0Re;iZ9MAVRF!!uD=}9I6_tQT>jE4JE*?3Yjx!#~Z z;r-NcBqJT1M&76pBK77!K!m0>J*!rgP)rIO1WG1EbI)`2`j+-U-7#YqOCi8p z5GTcNIs_oaTuob(XDs;gE7}`lr{`lvy<=^+?tG5qxVpBM1BWW*!O&-%Ac~8qmhY)Q zw;)I@s>WC5&D`Qwd4DRM3#F$1QaIE#GgdSB!G7jdDn9xRwpt^`uY(DM&>qr`PkGi> z6dnjnQBoeqi!`n&LcAw)`Z_MneS#X-%AC8RZ?CRT-H)kBDR(g;hkf!!%rdG9Jku*8 z0y}drhjJU@POVJg%c4ms^jOmpd(e~?L*pV?pF3C8pIy=~g-wz|`#XH4tel3K{{ULM znm+Y4)$RvYDF?r~^^^(d$$2DWbNG4vc(KO=bn~a=AzF%UX$Mu8kSFvRFoB@mW4WsD<#ELzQS}8d|&1PYl*$16$cgbqPc3aqRam=hCrW_9XUE9)bhfw0em!RReZ{byNW7oqK zf4e3w-+yksWY}RBKGPz<9W&>v9Tm6~lkbHE*6in+) z&8f5m+b=V1q+=T2L61xlBhCEic@OA@Xl#U)RFvL zwqbEdo(=FQllnsIUxs_P=uJxqGA7|276dIIR3Q9bKiQ)H>ebL*{%fY7t64uOKp+se z@mW~Fd>fegjN2F&S@CU+5y@J}?qs)Hy_hs4M46>$(UNm<(uBeh`mFk`o5v^>|8u0m zjDy&4U?eW^W=mB7-r{b*3IT$-yiLBo=GHd##Lp7_frR}CVcjU@h$p#fCwuX3NJQ*W zP%sEfU!pBP`f8uZioRCUTd#dRmvJ!PmueJpJ_YHD{z@5yE)1js-a;z%Bdl%xwjLd1VOn^jkZVUX&hzb z{FAvog1FV`J06+{vj69GPbz=wXJ%hpmi_#Y`9)vh)pZk&+K;6sKCh(Rvs>Tl$JPt8 zNqS?GIz63H-^sZ9oC=@I@#n z1N?q(tE;x)2Fqm6adD05u zai3KTqYoYB3%Ah zR^A((Hqaaim)wd`NNH<|*OE3(wd{C}G?UaX6%8DmIikM*cCY4?*3#m~;`=={`RJ|* zawd~VO-*)7lVc-pRhSg=xtu?yVc+PG4Y$l2L}HdnA@`r=)wxj=z2!@8DuWJ(0!UL8 zR{=s9Jj5>)%b>EJJb(b*3y1Gh=~)ZAi!Ugif4C-jsfh@P2eCROCq;_HYM9JyZB2)- zM#9*YI(@1^=`k+U0!s=CLE~B})>v4+wb;#j5LaCr{z_E;7#$rPwSQS?caM4GWAa(P z8Axuu)T4C=yr&%53xZ-nb$R1IIgtfUg1hXykv|D-N@RcW9`p8AVS$?HW`Z(3cD19U z0p4VLq5y2+BlIsidW*!xj%8K;Gsp+O{#w=jT(b;%kJ8V!jk>+h6CaoLOJsKI*DD@5 z=MPAQnLmlFmVt)u6d7|OITKT{EP8DU9A&{anM3uu=3-NO#o69*;U9kT&o?5suG3mw zwL(Db7z2ic0D%NK`933!a7McQvi%1-1&Xh{<>~;nt(!; zHqNGpi4~zph8XDwMI;P&kz%{;?+=W#EP3u~e@V#nk2Y`Ty&$;D1#Hs8bzVAVH`L6U z7rB)ib>!6jX&no*r=tz}ESfr_i#$OIiv|D&0nEYIz{cc;)!RJsW-eHPBxs1(SIZtB zOklO4+Lt0#{RKWu#RH@f33uRk&g8IVUyVPnsK^>hW-8i}lR7Yy z*sE>nLFWl;XuZ7}n6$=|?&}{Rc3SyHPN_W0f28W<|l-9cwM6@Ee}uj*@FX zShe9KE;dV3TtEU~&G}l}43uJzbjztA;VF<5`U!zl2SVj%g~xUlEx!C_BsCtr+`raU ztt4aLd&-oMZaUgDyZO57!~B9gR}&tuaOjU%IL2futWLx~KFIBae~NveGjem#m3!{x zT;=TjOu4)f-Edu&KvoYl2h^0tjvKDv=cxCSKnR!8nEQU2v+?VE>hp{MnNdvnON7oc(YoxL=9-!7EbAG#xv&LM zKSqF69nF4agI?#F8^dEg@$i#sWT7kP4T&{kCcDo%sLT5xnNmD=moFh=x?zM1l*T@Va z?gkn;5$N?Uv=%lRSkyG*UZxpn(~k1}wB%~>BC7zDSbKH7b2CFi&AJ=obNEm;T`*+w z;K$ph3a0WA8DgbnoZ^Xm^?uA-*nVp(juoi1Yg^&s|^-NARSuD<=HsIXfZra>-MGsvSY?U&as?ypvgq?8tRO*KqdUOd( zmcl{|2RdU~E4+oHu|&{xxu-F1lO>8-5(i3PdjPMj!u;~w&0G(hWgZk(&f22TZVl|#VKGS$DgL=eS5?IckjxRuTRLzekUuyzFMMl@7|!2AoT5rE%*{gG*vcgIFGwTOm9& z65k3madQ=caR{FYcqP%|W<0($0|;6HjivBJ`k#Y77m7xo>u)L>X=;*+&9L_p6$r2d zI90L=4w1%=>B&I32~I1m$~RCMK$@ZizM-@?t2nQTEfix9f%mR< z?eEgcc8jahwbj3kGQ;c{pD70zZ%fX0j%lp8V~NXDB0)2rS?JO@MGT;LOH};ww?hhe z4fnMMoi%T3^NJSZ5WRiR8K0GKwna{}bAy_N_zQ{cI(vjTD>UI7|5%f1jo`Wc;xCh# zQXYPl!cOlp%ltJ9qK`nrKST}NDbn&C!gMCMveh(oIuM5M?b;?0M*yp)?TI;>SQ5>#&% z*i#GzcYDy?^Crhk~OuVx+7ZlzF66#3M^XLn*R7Z zgih#LC|x=e<`l&guJ}(3`r6&+wpd~TR-UHu@zAQveXz~48D)w|8`@-Eo31g&Yn zb1pOl9ll%%A|85;1gH6o&Ya#y;Rjf3^sx@k=;u-VLFb!?ZTFHHcE>ut(k+Ah#02_n zdCLllxj)m$09i~c* z4sAJZ)n%}7vat9x0u_k~vzO)Ng>CuMZrIVHFDh+Zc48ip;0uZAa@23)pEOOsw!DcQ zb6ra5{{dQmTmF*syrDKOAlUdpxiRf;_=B!oP8ZU{%`(xe-1F$-K7kf)56#I9Dve<# zP$0WcKl52QqXLLA`Kzyn;L`y{n&b#y#}|w=_lCK140M_!he?)s<`@+u&;Vk(SBb^pd?eF7 zO)|N5Qh2(&-fRB)nsr&Q_xd-M0J%G_L`;%vk|T9VZgt7n^4r3O<$cF7a8FU;-6sPE84hmky?+vZush7ePKO; zYvai{KCHy^XM7O31ZbY^Did@amD45?6hkUuHQp+u?e^(Yk|lqugNZ~4Nz2wwm9Jjg zetbaV?*88Q*uhXh5famXrJzs%015yAp&x+!HM-C1Keq|f_`EVFRurukTs8}f)e>K9 ztFo;Qvw>W%p|pn6{c>EFEnJlGL^Gz4uIuXRiqa^hoUSOa+Q1jFD@;fE7|&=xK)R;5 z<3}U@u%J56ts%=X4o!`57A`HUi%V^th~gYnjM@{0K(aC`x2!=8y0qmc6k1&<)2$lf z!5gS?OcA)VKkheW{C-8CG)z4IW7oc|ga48tcMPxJ zj$svSf;-viK=!i>T6D?IXO%%s=8Y;%<_QPKH~iW;e}KiH3t9pxcdB$h1d_j6t+(s9UY1q`VVl4l_>gA1JiwE zMn#<;`5)j#t3GvF28{@D5rj_-(AFp&fVm)Ufhm(g_*|$V5w&DJQl+1E`;WybpO1?C zInqxaHWF`c{&MH^8SVT7Tu++~yT|{`N`23F=9AZvGBC7i^hr;tJ^#tRg4RM|{=R>- zC@y9suSStk&P)d6{m|W#ApZ|QXy?rN(S2%Ro~P#@KsO@%!&BP?i|5FaBaSl_?XF`o z2!qAlZeS@JJTx}eS})yU7lBBL z*u0j%H6;>@ZZYQhyl(RoM!1WGm@N21y*=4HWBh)#tnp##(3ablu0nYLM&$x5?ZQ-M z2ID}b_uUEX7_BL~iv5fq5sZU>h+6R$MD|mV-O-X=W4CH3^H_U1&jQBD-6timY8rcO zeP{mxA~E|~#&oJb+GgLKj4z*$+CUZQ4N7^y+*_9iCj$N@M^fvWbs0N|WIf!~N!srF zh?gRo-^R^SQ&XikA`RFOJsrh2K8FqL+TRF~Mg}aj!Z$;kCpHIwh|hT6Lu?nw^_jD< z2&U&p2ms;ZsY=eKXEQ5Y8H6W=VFzliG;~za(J09~2tOMnGjUcAvMJm(m4OtJORJ8eGNPs{TL2_mkza35ndG* z0|1LHdFwE$`c^p%XS-j3G832EYA^Dbo!UVKY%!i5^<(op?r^LfgC<{vF*Wf090#K0 zq!J4>)ac8OWDMC6Ha(X2rTaHX#bY)nfz&G|nQUQrcKST8TdJVm>sVGT>($`VRyJAq>z+f7O6o;h67POr@jS>mmIia~30sds1&w%gNiXYr&KN`|bK^9h z0GkkPl@EG6MomWb_uMak2febsYoi|YF{TQzZC_!Kd_or`GGuVoU?q!~WU#bP z_yrV82Dg+O5K$fZ<`SAKT+x3XI_lRysI424x->6<6N?i#{+7H;8m=>}ICZb3TU>_y z1JLXzC2w3A^_MZDBT_3#;|nq?0kqO3B;U>^{7B?uUOeHMI`}jsY|3e*s zFa2Zrrl}ov9du;U*O1%so0&+issgH&+PR(~t1`paBvY-E#ScU>?SzjpDx&np$i|Ly z_@k*>&aPgcl7DD9ivhAlRs>Co5pVlnoosW%afq<3p-=_HDNP<=9DZTH+~Rnc&^^20 ziMn*q<#!++b(-KuJ9KX!WkACI@37TP;uYIbgX+oxcUe9(4D!g>-qTHNsDqJ z-S1~SFzk)z%466Jo{D5k(10Lr(#N zERQ%(nAA8IHAU?77Ma)t6?2(Il~xwIMQ#Kjs_ij1r+K!ziY`{aT|nvmW4PN93IAO3z!mo|T}s0lE3eg*`-I?^r^5ZO6K zP9)a@=~h;Ry;&iK0mqr#c}ssU z@Rm7+v~3-UlRjc-n+luwe4o07;>yxd6|h;*txerkSh4z_c;;=7X&j=!0I~UF0Mj2G z9C4Qg4oa(4uD+CC4Jc&5GNA-Gwq`Z}I5x{m3Ajs&xxItp$i)_0_8$T+H@TloT76>G z47;3a96LO=ye4X}NE=e(Q(<)}p~FJ5N*2+m*zeEu#8N@cayuuRaEN5#SUchTREc0I z|2A%R?9M-fnvaul*0EpXQFlvFt#Quj4U%kyV|LwLb26(Mt@+k2w346Q_D`>3TOjE?+yt93paKVB=o z)V^yLNc-x%EVPlfQ>T&>#ac0!iUT%yf5@84jiw#Q$c6>+jkRc#tWJ;3ecygk-Eb=t zuyV`Yb>5P#-nYcu6*UH=Zx;3NYIYY)X-5XCWf`Ed95~uJ+_R}*i11FNDO4FOySvwG zaUQC+5Hb}lAx=KRCj#@I-EF=S_&P!7V$#KrK92eOWRx~SQu-%&q-Bv zEI3e=bk6fX@i=$rm{Oc;9Q@zY}3Z#!+!vK{AMY2ySI@E#Ks)DoniDXr_rv z=`vsZs*x=0kLN+*J$?V6yM#X<<(rDS0VBehJN+JjbnramIj2N|Ip#7LVX8D9%6;(4 z!^=#jv_jEv)&E0IFkDk4OK;{wcI;P@WZA7qEuA=`emCl)af?f}yUL%~r2=PXhQ8gH zo;Dv5Oy-(Fzg2b_&D@)gJ2-s?GQ-g(P7oFryq}Kk;9#!mWiMol3c+Ibv^2T1C5ar~MMNhBKRVa2b%n3x7>$5ccX&x6rCbBB zgxczdgO?R|L0IIs`@>3Ki1qmDGh<4aGI$!dvR6H{vO`>*i9?iW1$`7zeB^abhVp;M zV4x$W=b6#rG70u38RL%ySfXw1$VX4PZoQhlF7MS2S zt8&vx)1{#1*e6$45)usZ&3kX@>_&}0f>8De2ZJ=2;6>#tCDGE z`G7kUOWIvcXKHp{J&Ujz%8z63V39~;18P5n$39pz`Twrqx;gN!7E#@4-4YR9dfEMz zv6Zaw@jxH6_;WVd-Lj`CvIftY=#Yp)jRJucGyqA%gcc*%AYQ8r)qn<7n+l&`HIoj zZyQ#-%YubZA7~A-_z(O~>}f_R?5ab9L&+7`B+kDU7lONQxaT%u4((HP*K#Ym_LU;~wNQOqu(WyMglj_J!^t z?F}{gj*c$oqxcXX-B;_qK1?wh>6&>=-*Q89SuB@SAzn-A&Y(D%+u#8t z9==OWaOSXV%_}ynd2N|J(FNZoDIeGe{{}EiO z0yXsr_?^RKJM%ll4D>YP;Rk66kJ8eX>ZJuu z8#*Kcit?@T?x2$MIv2I-8FFbFxO!6G`da7!Vn$jvC7G(F;-AdppEsh*wqOi5rAOKR z@5ia`dpcEvR~+NG$eMW?K!t}t8zk6na*VVDdRN&fR3510_!)5cvpaq_{h`QhZPtV6 zrjI011_4<95E*LD-9R<;#`_lXg4L_{ougt8^P??gM$6S1izZ@D{$pryu72KlvOld4 zrex4?!Ob=-vY?*On1njvKojp@B`it`WUwC>064EC#x%pZzS)Bsv{+ZHeAjNWZcLvmI>ZL2-|NGe+4}i_6HD4)Ri#gsS!aYrwEL#b;u#0^eg2@#VnLTg z%isQ;GMr659zW!rb=G7Dq_~_(2nU+Y2eh1~OYCV1X%B|RG^c1RQKO^JE9{w0?U?t< zN-C{%n&SED;p!1!NMEfpAqPP%3MQ?XS{TegIXX|uxxKtyj0i-(Egdhi8WdD*J^*0Jv>B;uI1@pK5Ck}nvLd(LH z*qT3q@fEyvb+t2iQx&;m7B#_GR9ZNZa6sUjbaoL96KRHu7juGx=#OzrWSSo&cGA0M zoS8Mg34h42U7)U_dSX7H5C24N$V#E~yL4BZLe`8zaop0SmV=DvI;J~T<0TfkdVNh3 zKRbrwZl$jz+&=&h<(=ufmf46;UYZ9*dOt3FSW@!1kh#%lbYn}9eAe`iG-;!8`lzf1 z%&^`#1dy!%j;tWLSxycM%M4oJ5s_sOj{83Vn19R~%3D5Ya*32l?gfYB8-9Y?3kfqDsikK7hyY$*5JKgascgi%%P>sx83v3_?Vx z`zF!5)a3|?tzxy~Wgi)-6kievyA=uR`y3u4v}SQFp8L8mGLt}09qr)}-F^x0LbAX> zA*hQVQ6@Il4%S%`kdmnzy*0-QN}{dWs()Xj#8Ll=@{Bp%!gmcL+@tbFpa;HcIJSkt9|aY3C* zd@9}(%~#zIK8Pz~Kxs2Bg(-7WOyEOm!7ZQH#_S7Z>OAV5WID zfpM$0)WF~_7(1DXwis9;=?;Xa(m{K~3hZdC*E|1FSlc|yNdWGh#u(p*rqM@?VX%A3 zNBGIhvK+MaEE0xIiFlPBO*UZk80D)({6tW;X+LxWm@G}_X)poZ!$jH{QGyCrz{@ff=H-G$kQE4N|+y~aL3f~`1K@* zX4ECaZgN_DNhwF6R@SIC&HGK`VOk`Dwz>jJ97>`H#8MsG&eztPA2X5H2XjsF$Q_By zO|wh5gZsT(Yy~zC4K_cq`=>1(`n1HeuZ-Jb&Vv@T3@h!d(bFjnP}KXr#GAA1!UGrj|&4=YpZJY%KGW@DS73UnbVXD$;uf1 znyh75n3wv+U%lA8&<)DOeJ6&-=o0zulmyXSVNX%$s4H_-{B>zF(AvF0%W49Fw_h&% zr+<#*1kEe)Y_Y(6Q+&L{i_-!Sq;``ctNlhiP~ah?aO_=tY!~F)H?it*ldmpGiYC06 zh{E>2ptQa`dckvrM2>y3@U|e6WSZLo z@fs^)E3&r4RxmwPntpgzmt7T8sjV}iFby-4&n#(GAtWU2{s92Me!msKsHfqW&uq1n z3A0K}Y^UHF+fVo;*mU88hS+xL>A^1uJL)l=A0sS?6JORTH-7y4J-Our&ZUj$0Tt|P zrkDaN|9mxQq33XJdKj2=6Z!)2NuinVr`zIx10y5jC^3CVDP5%JT!?D^w zKe>em+QP1$kVJcJDdn47sqjG68Pk#V8KvR15Vcw|GhkLzPX;{ARu&4DlnlP#6`#yO!Z6eXVo|U*2~nNO}A1I@+w^K2>WGTPVqgH6D|`@TC4P4ELU~!Lq%yx zUR%zjo9mD|CNEpq2nXn0=@T6W`>zUnn-#`IQt;%9(8>;{;);S!zax14LYD&KP|H;I zJCZK&*Y??U6^N)182j3J? z>mQqgN$grSE+5*3l_pk8FoWi0=a0LyeO~&)3MQjgP_iNT^=fF931?Z(ZZas?QlvzHruiw8Lps>x~ z15l*Ef{AAOLQ*m^!s3(jqV)PWcKf)w&Kly^dgSCJ|p85328siUTF8=sarbP%I za9OLh90KpanASg5?XFyH&&@focl_vZ$mXT&$MDp}ak=4Odh1oYQ6&ba$GDQ%%@@Fw z6Mu@&)4^LNOTurP0Ebea9ciH3^7!**(lYC}Q)6$-8msuvJ|6c0noZC;SS^BTWV}MS zu2c_wv4CqnOJyX1Dn1MztRk%5x+Oz)+oCQ*sKV)#6cRFLziUS!wZ=GxFk-zP5ZzP( zy?P3>qkwD{M)wA1A|M6Z(Zm;B!h0%jffl}CRN{7a-uw49G zOPG8aN`i&fnr){sO-aYXQ^u`rSSgtrl~q_OoZvRe1hl;=S^D%iEeiRLQIMi@;*4?r zCu$;+WrFQj%}x)MbFS9w4z$aebRvcoAA$1S^%NoI*H(_1fMQ&RrN^Q`BK?*y$f^L0@=-J`bZPO6zqkQ~`ZHVkX8jSW91#*lXW-dbWLPZ7 z5BItgcrXv5m`s&MGBQ(-z;Vz1In#UP41){O9f+bW{IefMrHpAHY{!jYRIgYoHR{bB z=Pvcu1d@8|f?V|<5Oya^j+kjLkL$nRt-{KuZ#+HVR+BXqdcYsa3KLnrSnrYPTU(dT zL}oT#Y`L<0LG^W^=Fk<0^-3r3HE10ZH7o8H))8?Bg`{BGGPR4pi4YQVt47v1d3S3W z*hh(~rabAr5R2LPzf6DV_WDtDQiB`(Ns4w6EW14^u=`ewkuKI8n~qokQZrUJT>JX| zv-;9n-3o)2s^*2bJPIz2_^Z)SlKs%yOz`|}6IFQqx_k*1AX@6{&m)!b4lqoMWWldR zO2!R|3h})D`?rEA21OE*!~>O@Ehe_9?G5Vv^{MKl zrq=%=zn)HF@(%zr7MEmVwppvSQD9igwR+DlTO@1L4(7#Ch{OWKl%yzRqr+VT0Pklk z{wIMHj~O8e2!Lw@S9GwuG+X|G+P)t0tq~iY3aYbg)Fh?b#oh8W>z$-6aH-9V3_5fK z$lb=L3YHbCfC0iP@bJ`MWg&?iS?P`YY~B)rP!rV|O%@(Jtk`hp*dr~qK8i;vk9LJJ zMW~)n(-a~ToZ{?TMO+D6sz)!JZK6B2bwqUIaE}VCJ1#H5nw{(v?=y{ zfs}Poo`64kF<=Om!K-;7>hXT@>F-c0{mD2xAL)sMns24=JI_5!H&1a)%m*+b|JLbv zr)tiXa9=V=4_s*_YAtHb0!7OErGC~jQYLD`=*U*5MHw>&Qv!E69DR`o_VRRZ~NuJ^YdrfzbAQVgMvB7yrG6N(0E|Drdk{a@Mr(Yzp37w-_nG;5ArDUPJh=jwI2K1O zHKxjgZRL%3N7)|>o5S}Qel;9^_N6p+|6|H*i*`uV?(g))>I*m4#h2_{e@aG9YQg(x zs_X^Tp77{ar)<=<8cHcNSl-xZ-FvmUO7=FrGt_Yc>{P{q3!+K7PhX(N0Pi750Iw5@ z=s>?9jz2-aJ*YMhv+MWi=W?SsTi&>X1zZNvv^1V{%`SNr(cpJ&msuqgh$w~MIwxDZ zz0zH(D%>9TGA_h(3$MyU(@16BghxiKN~5^!bI52l(t+Nc2T=en{Gr@3ygh2?|ykB_Mujh2w71x*fO9jiONQd4wfpu)3RexAE{@h^QfCAuE9|%d?yUT z!(VW(eVDaNKAm^gYe4&&NP6rejZO30)Blz2xf=nHIGGr~)pxmVdn(U*$UbguAC;K; z;U9q7(lV=RX&#B-P&QZJ&cplJEA3PRfUtpj9}0**S6)10S9E_o=On-qI#{{x_yxdJ zse%*W;rXfMm7lqpwg9C{ReHy$CiP7?3WVdnNwTDiz&fk=az#`n5Bu|=tNg*V{|UV# zp<~b7H|vK0!r>Bp8+n$?Sg;_R!K8}mOY@-MqfqlP2TP}+`R%Q|B5tfT*oM%bbPB^! zQc{SqjmMUX3PAN`rs?(AaXoQqca(ZFKMb1r*+#MVESgWkf#ZkVKk3dZ}FE!6Gkr%}QFX9qd5*K~g+st62AJ>m7e? z*W4K9#Drx+c|3+w>n#d#89S+O*mO#>pwlhFZ0j)#deso+FxH3xVOO;_hgF}Q;og?A z%M@sk5w!g})f?y*<_|=kUR!XSJByLofBtCvLwK!X`$GWRJ_CiKOJ1RU-a%Vh zrjdA+{J5eg-!$)pd~A(0_f+QbmQc5Y%>ubo-XUwkW=Zl8CNB1^NmqadqkltMq=_X% z1aH2U70N41wffkDMT?rrAtO-VQ{xreT)(pZKX+ z+9tbG+^*-StumcpTE+hZ00lN@BKD_#i{gu|?aL9=_Rvi=k9X*8v9#%t5#V5*e_Cgy z2|@JRsUhL6KzPy^!T#1N_VA{Ut&F#loe>C9Lpi>NIEv-rEqQ^$lY)v56^xVEjnjN% z>e#ZRi>+c66&b$c-dvK8z7g?DMNDV(EvbqGIx8BX;ZgFHbr@9dr@A?cdrkw}vo0~# zkG`nHW*6retXo~J?^pzuIeHwmMGm~seu~P!Yi`^wulQO~-x9OFeuey2w=o8!_>ReF zp$19}d}a*-TjkN^oG^h?Alxje)md0MF?mH6WKo<{7Fne*RL2uhtr1bpX^gP%y+y4N z$x@p*0pWxNp2lNB4a9DO)c$-Y<%aU^B=wm;Zj2K(K0>lO=_c0VPA|`sS=!|c<&>EZ zS!~#12rGSmW05Es&$$(0!&{|t0Yam(qMMvZ^VlG^OjpZaX!Xs}j5n5D8!TAz_Vr!z zL_5n~;dd`u#F!bv$AK;M`;5&FbEhc?WEE1?Smp>>Bk;_eB}~U%Y-83#2E!jLyC#jk znf0vFfWDEG_j&n%(q1U$Su63&?iTxXto0f|4o9XCi~FpUDMI+HO5DUc;i&6#F?_Yk z&%IC`l~uE(WUsF?f=P0q;#vQbUX3TpWT~$39TDn%ba33(ks_SRr9!7Z8s@K z@6lD&qsrRbd)?FU8eVgBJR!+&zadAjMXnYx}=7|kJf=}m| z_X#eyjulMk311Eyrnufe+QUKFTK~*3{NmbZ`aL7I{ zk-_zIC(KheVXM;(?otS0eX?ms_s3^lrLpMq>eXMiP8S#ycugB_KBvvy=*b z41Xv3d+??2ruwzH__Oqc5XRfj6u{IM;-JZKl(K*zzvb;>KDCk(Z$}wN43)PyO5&3{ zc0_ZN{U-~1S$U8<1*OX66K8Kt+rfVo26K@0+Ag#$1*@Z*Sf~1oicZE-w?>Lhf?q%4m+PiO6~W{7IJ|4*e?kJl&NeKsWq@~LmMm0H8ZVk&s7Lsg55h})Fs3Ho1yJr&lBC)J|1qu}) z2$&*3s8)cefOLXI2xeU=fj|HN2p%~8nj*{eM9~vOO%X=S=Z%y`I>nf=)>V8+z^3aHxMOi*>QCT&Jqek90{{VT+ z7{0Z8vuv|+(E%<=GNo#u!qe{9uIS1#S@c^g<}H(#xKnbJ-Z;CnW=U8lQq?F|uA?0y zptj)UImo1mH(ifVKo^~*ZXU70K*|zhYD=eK-ohJqn)N$hRwIkZuI99s=_JE0;UlW z9&7SXA`t-*^Ut(lp)Gw&PF0r0D-lhYi&XQ01au% z>x&)*Q5+Fx{{V5@1CG2SF2`ORBH#|@wB3P838}XZ>=ru&tGRjUiAN75Wo70i9GT>l zl#|sJ6FGYI+M=SW7{VeVZE<{ckEpDks-mIJk>t6~Cvr~Yl6NHTrBT98H0>Ss*N79G z#_0q5voj%tPsXjMw^9qh?7 zOs*|!T6b)CJG|pRWFBI^N`S^StvP-^O7cB5@Rn-YvRKzK*5E98s{-zG4$>v^Az@!f zJIGj{Dyq%1sX2!ba*_<4Txt&_y~z%Z}H#xoJO>uY}8F*}j7M>BBS3EvG7awR9&`M@2gi%+aLIQ+MVy3AM ziphzJ2Lh^?@O0ECJQ$B2Tsz087b? zTUE5YfQKNNIQwhp(<@t{yCa6SJ*S4;($Dp#1B3qnl0onau7;oMRh0Do9O0i%zjEZ> z!lKe{PT|UmIdI|f?iXEA>rr1H7Lax!$82@VwO{6aJ+igYk|bX==6AOeF~+1zwS#D_>0*Ft(`017Daq=sAg!aB?V5|6M**m#K!`U0%7BwcGi^A zmc1KomeFS87V}Xgt!s}L2Y5j&X~s)I_js~E*pr2*t`+m#r)@<}4BP>vjkArie9v5L zvj6}9000004gdf+008&^0QdmbN&o-=HdHJ3QAG`Ry*XM_6vSgS<8C&5o0TsWMwmLA zj$GDS-Q{wYJDXvaYnC>TE{&g4;j1|D?IAh2xe0U^jc*>%>76GFE`wFbp;xB%-g8v! zrH6BQt3AnB;wCfZ;BOR+T|$w0`@M!A8tiY3s#SrP!*dYmDtwTjS zBIqz(U}n2QE1%I6OUulaeY!oQ9pXK3u|&>tjn1c(3u-kYGBPDW0r~;bQ4$g$kdL3@ z8;`!V?xLuTn)9>DY0e^eu5&ZU%Gg=}{vgLlN5x*KnoXkg_Ity+2lz|Qei;p0+aqHN zMp%Ig)%GE2m~yxWX}51PI|RBe%9+wl(|HQ?oK%ZtD^q{Eng%e|}~5({{-ow9S4=J^j6;9+m=xBk#h=je*XvCQ$+EcH||5bKdUHq`sD zvI7ZByLo6P>BYKo0mvKON2+l#coP8m)eWWv5aTHzBgyZ zHawS0yFc|E+dlK#Cc_+BMhhUO(9YlE8*!UP+Q^bb>vG~8rCCN+MlHYuPNOvrbjTe_ zrkHDXX>EUE)g)8G_fy?5lMJ{HJ|&I>wm?609(G|PuG-WPU?$B_-RYXiJ-8XQFOkpufQwW%BSIs$U)G!Dx zFq4i>X~T!1-{e6GLmNxmCOxs&^7L9m3Hp9))*0m;#R8^ z1S~8|*YZhLo1nrT1|{Q$D47sdyCOVP4cqRB97<~zpX}#L>B`U2G<1%V;xoe}r;W_d zJ^_H%k~ZQE;>Ov=RO+6$f4rROgRWGKsZ}hJSh{3u1gb`+w@_T^ z^Ywa&Su1nThDL|CK6oQ43tDIK&WU3A`3<L2qPRp6}Mr}SG|^H)R>g_Is9=T`6P^1ISRPt zf+bZ>1GD(NBD2uo0AcWRteHeS`17l+2W`3zt^L(qY_xKYee`5EKgP~B{7DF`KBTgIj8ZZG z0R2ftu6Ia`%Z;+`ExmRcM#o@Z1m)CVtI-VH$jeVmtB>pijE0MkW>dR;BPjI5K?G6( zQB@QvN&;aGT+wG3q_4?~v9TpsyNi@92Ao+a*XXF-^mFppV}aurjn)1t4%#>aCZP@W z6y*>fA)+k8Mou;%qL1aI7{#$fIa%b3v>7x=I1%MX4pd1L!+`sUYr>|gnvNILR#e9o zJ9)Y84QTaqhy&(|BIJ$rU z>qToHq=#m@P)!9b#n(%dcJAo_djartY&}a zO024Bo2&Z^ziUlXqFbo-wQO@$)l@ve!4o14fw*AVfMmKsA<4n0Q zUgbqSfH?3T06YK(+eA$fG)3{=SF7?5*-AfyhkYj+v0O(;yo_Y!`v(OmkgKwIvIlV0 zVvxcBWXw|l4;<)=k>A<_jVU*=w;2?ZC@lW~4MH?Bg(v~l2AK~ab%Bf?OjMG4$o_$@ zV(r|9+-XKR+uTpWLxmBthgApWX4L`-fTl?#L+78Pj!18}Jpv*F{R3QAcZ5h>aga$+ zJl64pv6d-fKLt8aF9uLLymXj25`cZg!O27QAN1B0Jt2^ovF#NF(kG@>y}i$E9{rl4 zvql*b;}qQDU@&y0_*>OLq8>Q+FOSd91J1sT{T868rR=ek)g0MzsSO?tC64@DR8>rV z(ABN$iH)se&vL3T=(WkW*QgW#P;n%Y>b2On3xUi8>tfa0!lpb4zr+{==Tmm~Un3i* zZSD6R-pEFIk-*WnkS_GeP%D@lO@*Um)+z*D-(&!tN~)*vRWN}Hnk~@jIgE7-1pw;g zN5>k_v^0--X?YFLfaE+$DjrJ*iD&p^nor#_Wa4$o$3UbbMyF|7D!^{Y0nVC&_H>FE zrV$g0ZH_#BN^{e3sCk|TMI5dapl6xPnCJW~_+`VuD1{v|8gfcRzFp8RtCvz`@2a`X zqUIIbfT$}daS<}7GJhQYn#-+55j;$00~*bM*lc#fk6f(76h@WA6>>R~G5lqe8ZAZ8 z2T+`rsYmnWMBpCXX1AFDV4bGzZ5pFplbv4 zK+>udpqb7<{{Ri(2Z8{H0CfKTKR^At=Y4IcUs&-;3%|pIzn}g79;#A$F4J}h^|Q^S z;pCct6)4D=h<<<{37R&`GT)#B`9P&8a35gfUqO2dxVq=rR*{}Z@kq#D89(XD_7AuO zQp#psgakaa^s41+7YQ2rUP;Ng0=Hor)mM)fHzEPjlXOgB@*f)84|`){3(!->w;nzNq&3#PzR&e7 z8D+LZv~t(P&*hFe90$#<`7DP_MkKq#o`99hf@y)&4oV(W>L~pD7~Vts01mlaY}L8I z*eSh@GQ%uqi0U(O(k+n45ZP|4FHUM>kX?e+iDOQ@dMSQzk1HVt%Nz2T9dvo>5Y;UO zbzP$C`cj4XsivAantyq`Bm?A2NIqFqHI(eBE`m{*WR1-}hj08YwlOYBfy@}#UexuaZJ8klX*{7(CI~`i? zPGR$7fob$wLb{S#3c2Yf9@`y{QPBKG>tUSaNQYHZku=jGj-rP!5QHHBOmm#(5GhDf zhaw~316Q?3q2;4b69=0$71^R;;iDI zdBhm`v~o8)W88aefn145y0A=4Pb}rC4%$49RV0d$6@}Dlb;=!9w@9bMv#-?Z5K&dC z)D(FPn;3W~Mkq$bMzkT!bAk++HX>!}F^nKyL_~QV5o9_d(;32*H)^Y~n5P{yulW99 z3#}+r00iGj#H&TKBZAGjY^b2og1lKPp`)vFD%-_FGYoPM-FMm^Z8&iBS%x^cseYwETNZK#yiFy*i8@5!nZ!6yoESU~ubMvnQ>k>_s`FcFnufY) z{{UG8tu1tNG?u(!z!KgdOB_eE+!af4q-7Os^wCr{Sekv8G=c~_gST8A$3nT;{iR*J zx4Ga9Ke!my37T^l-JMV;-KK~Og(_JQnViQ9m4G_^v}Lxw-86&Xr;#}S05+^0q1y#b z9UXgH`pBMGPwu~Q@^JqEagZ+!x#w z=@=FEs|i3AFWZ1H2PNQiJ;IgbI!M|Kpl&wyhli-?^6I@<;NhI?tVa;hETazFBIAoB zwR<4a7DB}g_8w8gM@lIkm^}v(a*WkY%Naz|FIozur%HkyCj8unvAEv9M_eh}mobII zh3zG;jo|FyMhL;@j1kkpdjq=aYtuj07QdHSz~L>>SQ)_O4jac+GGvgojf1^`fQdDZ zvaCQsoHeLKK%{aYn^*jYS8adux+6e#xYu_!J!w)IQ^ms-S-@nS8rjall5`RrG5vU5 z?@U7I6a)kSKtMo11Ox|=5Fa2QA@T#Rg9H!=J18&R5i~^66eZmysXLBK+pg1L#k=WT zy>e43Wab7>+yqYEunXv0ZK?c`6I2Y{ozEt_sntqFNF;dPW#LQ6BA}FtwLMtCoH>rSvf9`r zY}fGHWw^Kp%~0kspna|u@fXVMd#z(mPB#N}SI>}FcX#!w*zN?ZMAKS}vcq*c#NO%o$)#C#F( zv7xQ@4Xj>s|Jzq-2Ii z>RV$EaVFI)9J9zw2cIY7nZvo~K2Cpj;9c$$@;})AKB|H+rb2@!W;#JM(p@6}0T$po zPEp{&!NjBU^T>aFa+amEReMuHNn!Bn7q^#HW_Z^uG=?*Cu^(*YohD7g6N49N003|) zx@;wKAJe4#Yfx6vT&X2BG?jA0F#Ak*ihXM{0UX&4I}i0TAV;Xe zc&MXt%Qsug(@Ea$_Payn4h9vh78yxG6hM4-l60!A(I|d|DL^%V-ESI;P|9V!UaG5J zdd(x``<&tjz#`Uj7qMLV)I4 zV?$Q!8|}MJ+2K9p&m2!9XyXUlmEH|#{-E+jxvorYMh= zl9F>-txTxRgAlutpYDrRdypA5WMVOzaM4*9(z5d6U$VR1|^L%@agT5i~^67ag9j`A)l;_tgI+Bz@PU~j2SQ-?;z<1#Sa2Y62hMgDAIeiofF@!#N58?j+LkCcN>)z94Wn<%zv)a!80GIdl*+Y`*%h66c zNe@r_aXBP`kQ<%5CE8eZfq?79IJwEh$2cCZlBnJwIs`lk00-}{pxuqze@19KbY*~d zlFKKqUPgc0^1>y%ok9iD&mu52Z46<=dMd1UHwE7>IdM~yiBc)qK6r$8 z(gXZPCm*> zCaP=|QF0=4cF2llJc?-vyz(V(Ch$Ga%dBc@ySA}`?J&DJz`<|>K0fI`)#=Q=(!r=N z*byecn{axGlK?1ibBlmEOg=v-m;iYlNa~Oxl$Yh)2R|fHn>am2Ix<Y_q` zan|v|F36er51!co>VH52exa<#O~&b_r+)k;fcya;^dB`4q<+?EMf^CEYqk{>cOVHx z5aG$rR&82W^!nMuM6FQx*!&=O{`H7L=d+>cQqDr?q%VZ;C z8Z##Y+ep2^50O)V9+2_yCNOK9>)!f_;7sPw2xro3hGi$i2JW|veC2TC$O0ld+uF|JExK~&Hx?v&JGT12Z^I|xyrw?OSUI?X z{r=!r3b>u9MpmK`0N_#*fw&F?M1%znBk}yk{{ZV;AAWy*Svm6m0HXI&!YR-J1b{!~ zDCoicj-gip{{T=C*1o8VaPJU53@Bkq&r6&}zIyd7#_!#>JDTnXVPwnmXA*(YMcsWQ zA!(_YL_nleZWHX>6Ye0`+1MpQ(YScY3sNv;FRA_$cyS2YSQBIDfZl zo21BNBEuo0-!KOyA)QyIlSiz6-9}76Kd!c4(k?gu0K?jDa6eYdjt}!gCO-v`>34A5 zV)F%Z_=-YPCMFLhBHV}lLG*xsPbb$e=h-9CZehtu{0$c$J7bBj$u(@~u2%(`qUki% zOyk>3uMh&N1_ACQLYt4jNa~1ABB+!faz^lK!qpC7H%)u1 zg^k!NTdCz68yyWE$|fE?lvGq}R2aubMzukVdj?IDDovU)WYsjAHEP`=fk>KVDF{#i z007Y!yP_tDnj&b4qA10@+yvKj8(qyI!W@UbQmO(^kqj?inbj&ReL8Dkv#|)hiKIKoj(Vx;%&nk>^(H z4Kgm!wyKf1t7Cy6eXtHrI&pY-tGiC?<*#O&jhPs7LCLE94#LS9qAISMsH!3@Uq`!b z)`INafORCHOeHtR$Os3UXesJxjQ#TrF32F`;@33tBas9zT<^N*V_=@KnRjo@>p0JG zkycBdF*->$f{>p@c9z&Ex$ zDNHE3uShC{kQp&INS!h$iHGu>!NBXLG}maFJ61%;+Aolrlg=3kigq5M(LWE!<&XGj^_wDSi(B4on41`t=2OU$v|37x;Y|qY_hwoa8Tde?=+d8nl6CK8`-UF;MRGDC zhAEdGqNXPvbwP2uTWs{tth!f4PfFfyk-?+TWQ?C7l6nMO`g(zS=tWhk)6~70xMb$U za;nYdZ?;67@bIMMptwn?&UI(lT0`b=`7cg`H011<&*zJmY{8rF5UJA|=E6qQbM8gtNO_?!Wp zbV9m>^m@SIhIXQ*fzvN(Et)U39FA}~dRHxc2-3AxNWdj2fx5AfV(}mzewVz5gKOvy zVD`Cadq1GAsgH)Hx$cMmX>`bAxv z`1h$92Q6GAZw5_Njv@9C`2hg{9d0S1ilQkXnSs$f5JBWY<`f*z=9ai+rE$CJY3SvA z!n5;JjqvI-Z8NW_~@sGhrzBbIkJD4TOzFEc=j_G?3=3*cO?l4+#EEfoa9gBIl?2=mB+ z)DtLf)6p6OPv|-aQraLcs*n!$ci_t@9w(Dp4tQAHGyD7a39 z*-2}*Mz=sxs?15ry5(#y(qMwFL_f-FAJlc+s9^%8*&`@n04R>OHjlAXSJYEMO%`UE z;jJIM< z+a(@MTI^DfCgoo{P)w*wPCQZcl!JiqRc7TKx;fNPL#ZyYS7wGCA)WNK3qP@~R zv9xa11N}raet#tp7p{{C=H-1V{{Wzj;Fvj-aATMVUZfKeHYZU1AS${!N*~ixR8-1D zH1QwS%<#eJPD%JQ6Y79x;G!h<)%Pp7RIIk_XNGU`xaI@#3q`voxq){Lj%#sbiD>px zMg7)nk=4~blR)TAx(ll1V-vQLW;pcgdg+U8T{Ws}lj&deI3Oj@BMl8F^2|NA6_|WdwQs01Lo>K-RmfYk()=^4S+iK9h-UXq$NAJ?RbAi9=0S~smihUVqq@(P@10!+X*3R+i>^DC)l@&{$w1>E`nYQ5F zr9nRGMjM0JW)#5e{zAI%p^euR5L1MB*-vCk9YW5FfG+JHviDSgIPT^rc`%&ZqJe>0HTm=Pa zo6y8Ab7tIfEiy5D~+b5w6_Xro^Z}AA0T$m!~a5n5r2w z5XBN0f@L`|OhW(|rznR41LOoa*9k)M=*D^f0B;q&V>yk7$!t25v)c5WEZk|uC$TS@ zKWbnR4pnTrX963Kk}3rfm_FqZ)xL4WUOK6q(BN8m6}@RJvZc!DJ%5RrLQZ$_q^&V8 z8!mXMhR1HH7LH0a9?&yQ#5lGhL`)Pf`9bm{=2INlrnu46cXjbNA7qeOBMw0arrUmk1TrhLUgR#o#>uQ^WjNB$MVLGXjXLx}kFu4K;fJtcS^b-`+dXr(`>Bh`< zjItbu&^>7n)S0#4J(z3iU3;ftt8<#$)Bs0SA1)a&?}7UgV7a~-t@)|$q{gC)wHpQ?ZPgZ5l`JJ9v; zJM~sN_#ICut%!RcXnuZ&@%3Dr$VaOf^;XLeN*!k4c=+-@OaB1xT6V6T(LLE6Ree0o zm5p#KX49{7G3mCBcmXEGq4{pnbxxY76izA|@b`u4Ri|*n$dl?w#`z$Qv0H_wM3>wN@DzokU9NzkY248flc*^=~+`S>fCMo!Ax<_ znzSIy8@|MqCf4dU<1G@A48=60*|nCOig^x0n5nmPEK!v*E+fow0*T0OQV|ZK@#HZ3 zW%8n$uj-UnJDm)lXS=JIG~=KgSO?1(Di{TPH$J7?<#OEZRNN);5*VEw)^qa7tO3A> zAg{aY0Uy_$W+PN<4jv!)-tbxAYF+q^{`EHsh2k?)b;H@U~;qp;|_I4P|@#R~4nc%dh9 zJc6p85jz)ruuPCeQzU|=iZ^Ko=Wrwy1j1DS2qgd#ay-y#IqGO8Wi7tr+_|IL;Kvyx zZ?1P z(~$u)mjxe!m_qxY^i5X0)btiOn&CynA5ii3AZZ+DJsj_GpSET4Sg=Arh<;13QAamDWYRo#*Kqo z&;wcrfB*oC=xf;*;fhm~#5q94FbPak02rnzgMlf4c>w_d@)~p4@Dpse4GL9{{)!*)HtA&l!J=e^dBE5P+Q8~JdqU?^ThvfReubrCdE9{S`mVm)n z?s7nTvVV!VEO)7CK57A>yn?NW4?!KcTbUzg##^GeP19aGlWf837}|xpJyoIQ9z#kr zZ9NSk9L>V9lF`exTna%H*F@wn0g50P1y^9Ux!zqCqNrnh<71D{E&LQ#)P(d4+xsJ+ zGWowW$f834tlBsCN*N_f&muw!(30w+1OEVVhf=}xey}uyReh_I#|?>}{$2T^oR}}u z8)vu%QLTcvjty?JF)$sChb71j(d#9;M84&l7md(@Z0I@Us*#u|nY@t2)@xzxn?z~( z*;fUxzpHP$`OkVC|E08*5o08*3#fGI#c004XjwnzW~ z0NEGrh?*kxp0y+9ZrLcJ=_c{A?Nn8&$~JPD93*s%qjw1jRc^Toen@hN7>3|O$Z8H~ zb6nC+2*NI5k@Z~8ewjH%?#_3ciY)nllaEBv_@h2T%ALMNzhZRVD4jCbU~OY^;u7^P zlsOY?BH@?k%2ivxsmx2Ro+g zcv!z^&uS%NV`Kb5oo*7{qM0^xY-!ZE!B|Vll2%mKdjpabh8_gOW~Vwc^)G6gs`$w%sbv&2PTLU^#z*f;aP9v9a5Q-36=_Ax zBB|Cmu62yMr&(3ps%4z0vd0ssyM>h#D7uRr!X`O{M8ZBtpChKKqLI!oc_rtWJ$!yY z`BBMPdJe>#3M1Ad;7S5Ke!K_t0RI3`)v@t|o*YcK7 z3{;vfHF?h9b@S zOhp<%EX}1!nTWA^$YMwLNIwVG&aie#qBQ*Q)<!b}PjNZl1N*2fqQPftTdm5>t|bCAO<+r&08A(&&{7A-gQz@z zVbv^F=hs!z(y)6^BR*N&pOO>5lIg?J?Gj^OPJBOcyRZ03C2Kcqy<~Xwy?|{MWwY5W zjozvXbnuu~m2PtWrQ?sbzMA%7M;(*1%M)ZA5w-_NbJ4DIoDcNisU&-1jq*JEEd-xH zxNqH7;2-X@cDc_wyjfLQTJ6tU)>2hNC=4m^$^>0;nms~pgp!PCn1Bb5sDG}s4zjww z>2j&8asL1^LO}2XW{-eUQ#H+qIpg(?_K&IG9|3{zUV2G{gVH_>B8kWQ^rSq0@GiAQ z%x7`Sf6Y`Y2-$Ae?whU6wVZWbZ1t^ivdpFOHL(OtX0;k?DFXzHr57K*Y2sLv|5yZIfuxxj&fZDoF=X%p!A`M8**?i0kMD4Gk@}ik9C+2#%5% z+Qu|;4QRk0F1>k`1(Is56$ko}`gp!sdCkILXhmNYRTr1ZIO-{|s_7*}PT}>&rp*$G z+#+)cl#pPVMC1__&;c)Sh2}ohJ1Bf|)#{xwPF)+xeMLJ);GNwpKywG2k&VI2o3=pM z+Fw&QhC5}(OcAtiJiMCY{{Ynd4@FAx+z2+~;J}|B>YxYz09xg_w&VD%hPTEbx=2!G zkbKMv;Q&*I43!ZC*GvwvPEas;NkJ%hFnkXl2Ug07q=G>-M}DKDhTQ)EBhh)u8)a_` zzwo3UABs`6>r|MFfZ7sw8kKiHI0A zkm)^5cGH*2d;XcNjw;rSOB95LOw8oQ=8t$BWD)H(*l@vC+l9WGwusVJ#$3*h9NKyj z;C|!Cu7R+Q>2c0vaJ6IJB~r=JiKa6+@^R8BN|=X4tCCW<;6*en@Gg=!T5cP49EI?* zX&c77vqJWnVAj;p#}uNP_#67lXSi{L)W&uav%$^W4|%OCQ{8M;mbVv{@zI`A0k@;S zWceR~Dog8QD@1t%10BdjOvj!H8 zn#enGUCW6RxoF+Qt)~#CvZ8;&ZfQ3nj-S;V^#K~r6rxfT3P-)QI#yp!YP~5f2z^~E z3+R4jo=*MW2YmcZoYToiA#{0lIs3hTzs+;_l1nyJIRg(*z?aX`K0w6~9t1e@0vP-%$+$QOay~#ne#Qw8vhN+x7T?EUn> z!P_#t9O;|DeJ4LriO(JcJ_I#lo|%r~93VXWGwbK)^HMpa478Oep>HxS;}nZLg3HFc zZlhNXyQV5@w^V>d5Ll%jxd)FQKkckuqSHF>&e>s0;;Nxf}o(qsR{nf`Cy0 z_#d{dZ=SV|-e-?PkHZVtI5~Y{sEK$?qEZ1s3Q*&ufB+r}QQ!-}2fzlYNO8-t%|&hO zIf}2@!uxWbr?!fuCnR- zwxzk#+3eJgnz~nD4vigN_i}3+&CWXyGk}Y*{g~|rp|nhA`?DJ18x8KpX3}{Q?d`h< zoRvi*6})s}N9tLXY7nZOHfR_`#uFW7KZvP-JL|KK&u!hGS$?Ghgttks>WQ&}_YO^O zQ5!Nt8|GYhaZpnWTMZLLO%Z9$#AL-V#stk7X$Ff(JI46B^>vSpZiDua?M9QwY&OS#(TjNAc5i~^66GTlBMZMST-vIAN9-kfOYGM#BL8zLM~A^J^Mdd;Vtv*$lkvvGx=p&%e(nV}yO4-p#OHjE>qn6@Hq+OufcB9Me3K&2>aq2Y!qc%y;{ z!y#isTF@{68vqAD0)qQ`^hD7YiDi*&imn_gk`2&FMVDP=3X&+IkwogMs;3f>G?O7j zOkofJ0OWNCIjw1Phz$cIo;k?eA!oG~P`~71TY$FvU3k01nLqcN;&B zp}ItShe;6XD~XZ_7pwSe%qB1{9O2qWYfOAqHccs1d!d%iRKxHwzTA0Pq2>M7&hE$CI%+I2{K; z^Xtr$le!hXjQU#M1%qG1t1vZ)WIjYaKO`k=!qlfq)OQ696B603L->&ffL$LH0Am??K3X zPCfvxFfsgNgQwX+x~?3$=}iO?OzN)XQym~GNFtaSRg^zh08)U6kH)#0=I2Q(19Eb3 zG1s3Us=~bulzL9?hjA}r=dAVFJS&Ws22LE@uaK^z7oK{POKD3!khU_}XoH2E z-t)WUb}_{Fbv^@N(X&7b3PNinM9~vORjs+7O*~PXBwt-9PKk;#6U7eg`th;kbx^Ur zF@;mOnSe<~#$x%(pXNGbbi~8S)Jap1I?~$bv0E0Yl6#G+U#MOmlH%6pDI9vfF^(4= zu3;JGTH>2@Qg?~ax4oy zqty0lz%f=Mf9${6`~B1NTB%C)f)VOX<>02GT@Y45cG7Wg**aNRa7%YD^B6;a|rl20RAHjLv!?>K0Wc|Z=r*kZb-5BTX zRhBHHLbWlB(5##_I5|ko%yAUNf(9o(IM4nRZZc?^DJVvpGW&&TKcP9`>w(HMt>z?7~1o`xCD}Ql(7wN z@dg|!^Y9x5UJCewaSyEQ6`a&cIGl&SEH$`=sCN( znh2_Z>RQIh+`Nz2_6g<079U$lq^2db7bzl_rxRZ2^X5q69=rM}ll$u%`<46i_-&W) z{{X_j6#O6ea##1Oo;rUG{oD5c0EzxB?mvau==}bAx<0LLuhW#@p#K0*eO9aL{nsCN z+{xen00(o!$KGez;m1C_JFI8wulm>3JIMI>vBktVJ$SQ>V|@O5EW=loOqwESiJ~as zxU8dcszI~I_-3(Nzvt|blbGy%QMa!33N%b=O0{if$vIKXSrn0DjHwJ>g09m?q13~} zwu)$Cx_X(@5C|ZRkydu-y#+RJxQR!%Dv>5O^N?kK#LK(IY~zC;Ny;oDtJmsdX<%7| zXgF|jFee)Afj|f9>M)6i1H5*9X1YE}soeTm-MQewVLl~?Z|N;wecO3~g-W?|_HK7| zPCKXgcP3&Cy1_FXTSZ8^na37&(g6V>0U1V<6~I*C@FtW@pkVzqudBN)zD6DOTBs*) zLAxFDAh-R>JS25c;=$<~>Q6xA(%V_L%_31Td$g+!7VHNC59TXs-KG2R1AK?@b%j^< zd#fPH{R<<#SO*O6u*M=Q|wQx5q~p5iNqz4aSTTCEDl-V~idx2oqiOUXF+$5@U$b4o#Ioy!*_|Pa!%E8 zhvkw6?J5G=^OG*SA1E6J?kE!mT#dxm{TZZUN2Aj*dH#suE=HikpiB#K1oY5ci0PI( z&!mZ*0qwlAu~3wexMliuc9$6&_lNs;SH2w_MUPq>5I@p}r2iC9;i%|mToQEE)}LL> z{gSbg#k=OvSSe#}l(?c2O1bg+X}E_%%>{3DgO5|wd5l@wDJem9C-W z%u0@AoNtiQg-`wN`-btohdFOu2#Fd6Yph>3*Irik{H%D)|6>6Dqc+hAFM~xjopiZ~ z6Zuy#hC5Rw=cx@69rFmer6zuf166sAfZc^dmwFe0T(pnfZvYxUtl#z+JgoO%_4Tei zPBcIkZX!5DZU=x1Uxxp`MSj<{j6H$^g2cc^1TcFmL0SvW5F+07Vc$1I|EX1M<5I~c zOKkwxlLE8apYf3|n-uFe$l)VEGgBGbl=?u%8CM|y=;d`O<6wEw0ZaRW632UFRE5Qk zStHVBl!{E|g){fO^Jp1~h1D<+#)Zv*3)MRri5MznVw6s2-B49KR(5(R_uR*=nd)Z` zCVIO~O{%=;syM|g(W)+V##-E-PjD{t=w$ZUnVvopnsrQPcr@7h@H}#m7zvPqLHUq_ ziszhgN;X)*^rlpvFkcTez0|$^Vdk?ffrJ6(RPX>yZ!H;;SS>pfn5MtCx#fsarNG1buKAud6v|cKXW-?sRiPvCW;UbGPQxNe$P49>0Pn%qM6mOxk z=jiuQ@K?Y9eMx^IGb2sF-JYriZO_GKTkX;t(n>L+qv%)n7*t!}j+hBH={d72QyL8V z{5&Ydxth{&tRv@!Cv|TUkYFdzbJypLHcH1CJ7`>rFXlU^HPgH3Y%uz@)VmK0XhuZx z<*u``+22x|;FbH?`-V0?7%7g&a1&|tf^pm`SO7poeV`puMqdnh`N3`Qh;LD<8u#AA zKJ~}@gt@~bPtk)cO^KfLL`mGJ0&CG`^MGE>*TchWIZSMcwYKOKFl7uK&T@*iWM$7> z|JBwa+cTwzXyyKJ6*>H1FP9D}`PC@)X%S&eA-7!v^6fWZ>ekJ(WbbO3y}B@Y<=5=} zd;55EeHeP7KG8^c$N}T{N#Ki*(4P@*kXF{fHH)5|vMgN5gt-+w;iZt0t4Z50hN{_n z*601lNN5@Tn_5KFGRKndR6tUf#)K4dBG{xMkDa#&*F^~KI>y!?S886h$Fy@F1)||M zkDy}ioyx{}s(NLfHDv;#lOwc;&<5o|ij}f70EHE)M9IYs9w^;mOij4wsa-0e0(dOu>!FIli#Y!1 z@BtdqFp9`M_87wkju5u@11fNiSg1NO4Fk3PuT2LM2X$8Hgz}0?gP6Lgp)F(prg>xI zxhZ1l)=gH^E0B#B)sC?ua$T^Zu;?0~LkiI8xy7n>3hh@xhmKi-yuYzn#-<|V5Av!M z_cWR_@@G=i9UoZz6OddsDqZTBB-r=~^6DuvTUMVMj&n*N>jDa~=y&nuU7;f8ScNH!SmyER%8-{JBT*!p|pTzs`{QGiX zMG_gtq~+H<4>Ha@_pC}Lgw6dDcN6_?nl!A*e4@8JguC4fZ3DB^A2jXDNh99z@PH1V z9^0KRTDNK>64Onfh^tqb?>~>L>e9wPkB&;Pzce{XV88cwnY~OLxj4HEs6Y}{(k@Xf zNEyJTwv6ubvrEuf*gu7?nIx;xU`Cr;?vk(h-;ay~$)9Q2wji&+qRuP(mG-RX4S5h_ z^w9*m<)rF!_}$0DoiFu4Qu5R!?TD5KGsCdXan&GS<(egnOCB&JL$_1kWWh0R@P_DX zDGP1w&QDydpZw~AxCZ(L<$T{Z>@Ww46hLq-*S2=2-F^3*@Vj4@h7`2e>C&x17Fz*I z2mw~O>y2%~y}gf%iqPK1JOnpU3eIWor)Gk;e;#lNxD%dfXy*H6^@8YlW)JnAFh+N5(#|3=hNrH74MbL&Aeib49i;M9sr12*wrU@&+0&T-_T!-pX z%fw1?=n8|JD6S+FY;yo8hOoSH*jX*1Y$317AlRo<$jzt=^~ci5z8$xe_IjXg@_k8e z!tpg7Xl5N}@FTTfqP>q_gbJTrRX~>gX;0~p*#kX!^=C9W=eFUHGIuy*@vIU)vtf;) zq}Z1j#G=nAI9vPL=EFIpRe0VM^53KtPf_{Jpp9mUrZKbHFJ|jiOcop-IkM8kqRDC9 z9`LDf;r*(QTG`C2l^-&<$YY^~4uOEkOu6bdz3G!{@DjCZ4_6+iTX^HKNE9HzX3~&` zji*m0M38&rt=rNMi4)$#qE!*8CN;{H=&&_GDl-d0DIqc~d^vHSc74cgPB%HbZgK0# zd;vWj6r66N>ur^-Q?$hN2k)wTZUu~-EJp90z})czoR8cGv%*@l#t>!7jzmYU^NB~1 z4=JiPhIsXyTTeYp;yY7XWyS)1g-!tqww$J7{bgpjpcDw*FPdw7oIx0nu$4pom zaRsk%=|FM+aWja1l%BAGmU3{MilbO zErTICYvcPN3a~+cqmOveU!>}y;;9qW8ww&kccS~U%(vM5NBJi~*|*czGgG&?%p(*l z9YnHW#_9>BMcK=U3S7Vt7t0LKYd6A2;$5OMgYWgPumJ@rZ*qvO>iy0;OV$7gHH!G;0 zVQM&&ve-CMV2GobJhL2ZM@DvfDe<+JjF0)w^)tPTDTFJ!J#q(;W>}Vh73luKo3|2? z9;pWS_|=Xv_ju;j0`D}U;WywBq#`+fd6*vai9%$Gl8TNy6T`Q?NA@JM;KB6n+B${V zR84cNf@_2>S9Ry&ByCX=gj#e^vV|PWT|hxpdL40X(s<+IH^BC;nrhCDH!Q5+Wn1vl zKmd^x)sEsHth2BvX!6${arulb=^-y6k6mpHxyXFplY;bHqGDL-;=AL@3vl=3)HB|W z8<)!<2<0(dJ?P~MCkgZ-5^tqWvSiun?PO08IK3)r+1oQJyiLZu=u$I$EL_0FQz!u7 z`|RrS^{P8oHz>7)NJ%#Ynps&iH1xfTc76kD+qBce@7?dsy8ncRKl!ZG$Z)r0+4nbq z=sR>S;d8Gb_q2}g{SgW1F8AqWF|wjhxUs|`5yoXz3M4PSfMF~&-;7*gRZ(rtmyh<& zsscE0=sIP9Drc>P6?CIxnpC^@!xUI-4;~BpeETx+UG$qut`Isu#qNt@*^buT4YADo zQuV&u@{>4`mSPumlJ?XmGR%v)gbdF;INL6B*bb(*%s@N=+5lF7`Wq1z=lHFyH%zb| zEIFj)c2g}^;pun>up=iDdPlTIK?^RVaY1>eAq!94{7aNew4B#s$$Z=Y@IW~EdK$edc&)T>ostG++D)Zz z_`CqzDLAG`&e&DPJD@W)%y~6@R%wrBvijj^+)+!b*0bI#2CcB!)lwXEWLuX*i};30 zN%Llk4ffQn-9U;l@|uUoyt8%i_Qt5;7Su((Hdf)x_J?z5zy5;JHcC?khCPF@%bhEj zLLt-@-j}G-E@G7H*TYQ+*(DuvTYH@fZO?Ri2B5KYBBAwCiSF{r=aXw+lg*vPi{sB> zUf08ki?;$9NPPt*)?=F-TkU4qc&@~Hq=ZAwc!L8fJgOsQm9Jz=PSU@VI1EMh-TVa8VS_{$IUS8&F)atk`^n3!-`R*%ac z>LIL(qT*`{AX1?dhL1{sj;u0{lF6iR2%7KYD{Cj0CztmJS)>|mXJf}*S-1gLFJa=- z<n`K7Bm>;=~qxqH5ANGM_`Li*J{i_gQ?z+;6$!h;qu1E~UcnU%o!IDw-0i6koN( zj`A;Rt1{dTG!fJ6&O9?^`KY3f*%06Np0=E4pL}S_4!z!b_X2N`Z;q)RvO@73{aLO5 o*^l@KiLVu39we%YkU9jx8~%ww|L*+%f9}89cYmM6li!Q~0sWHz(EtDd diff --git a/node_modules/nodetime/node_modules/request/tests/run.js b/node_modules/nodetime/node_modules/request/tests/run.js deleted file mode 100644 index 538a65c..0000000 --- a/node_modules/nodetime/node_modules/request/tests/run.js +++ /dev/null @@ -1,45 +0,0 @@ -var spawn = require('child_process').spawn - , exitCode = 0 - ; - -var tests = [ - 'test-body.js' - , 'test-cookie.js' - , 'test-cookiejar.js' - , 'test-defaults.js' - , 'test-errors.js' - , 'test-form.js' - , 'test-follow-all-303.js' - , 'test-follow-all.js' - , 'test-headers.js' - , 'test-httpModule.js' - , 'test-https.js' - , 'test-https-strict.js' - , 'test-oauth.js' - , 'test-params.js' - , 'test-pipes.js' - , 'test-pool.js' - , 'test-protocol-changing-redirect.js' - , 'test-proxy.js' - , 'test-piped-redirect.js' - , 'test-qs.js' - , 'test-redirect.js' - , 'test-timeout.js' - , 'test-toJSON.js' - , 'test-tunnel.js' -] - -var next = function () { - if (tests.length === 0) process.exit(exitCode); - - var file = tests.shift() - console.log(file) - var proc = spawn('node', [ 'tests/' + file ]) - proc.stdout.pipe(process.stdout) - proc.stderr.pipe(process.stderr) - proc.on('exit', function (code) { - exitCode += code || 0 - next() - }) -} -next() diff --git a/node_modules/nodetime/node_modules/request/tests/server.js b/node_modules/nodetime/node_modules/request/tests/server.js deleted file mode 100644 index b6eacba..0000000 --- a/node_modules/nodetime/node_modules/request/tests/server.js +++ /dev/null @@ -1,90 +0,0 @@ -var fs = require('fs') - , http = require('http') - , path = require('path') - , https = require('https') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - ; - -exports.createServer = function (port) { - port = port || 6767 - var s = http.createServer(function (req, resp) { - s.emit(req.url, req, resp); - }) - s.port = port - s.url = 'http://localhost:'+port - return s; -} - -exports.createSSLServer = function(port, opts) { - port = port || 16767 - - var options = { 'key' : path.join(__dirname, 'ssl', 'test.key') - , 'cert': path.join(__dirname, 'ssl', 'test.crt') - } - if (opts) { - for (var i in opts) options[i] = opts[i] - } - - for (var i in options) { - options[i] = fs.readFileSync(options[i]) - } - - var s = https.createServer(options, function (req, resp) { - s.emit(req.url, req, resp); - }) - s.port = port - s.url = 'https://localhost:'+port - return s; -} - -exports.createPostStream = function (text) { - var postStream = new stream.Stream(); - postStream.writeable = true; - postStream.readable = true; - setTimeout(function () {postStream.emit('data', new Buffer(text)); postStream.emit('end')}, 0); - return postStream; -} -exports.createPostValidator = function (text, reqContentType) { - var l = function (req, resp) { - var r = ''; - req.on('data', function (chunk) {r += chunk}) - req.on('end', function () { - if (req.headers['content-type'] && req.headers['content-type'].indexOf('boundary=') >= 0) { - var boundary = req.headers['content-type'].split('boundary=')[1]; - text = text.replace(/__BOUNDARY__/g, boundary); - } - if (r !== text) console.log(r, text); - assert.equal(r, text) - if (reqContentType) { - assert.ok(req.headers['content-type']) - assert.ok(~req.headers['content-type'].indexOf(reqContentType)) - } - resp.writeHead(200, {'content-type':'text/plain'}) - resp.write('OK') - resp.end() - }) - } - return l; -} -exports.createGetResponse = function (text, contentType) { - var l = function (req, resp) { - contentType = contentType || 'text/plain' - resp.writeHead(200, {'content-type':contentType}) - resp.write(text) - resp.end() - } - return l; -} -exports.createChunkResponse = function (chunks, contentType) { - var l = function (req, resp) { - contentType = contentType || 'text/plain' - resp.writeHead(200, {'content-type':contentType}) - chunks.forEach(function (chunk) { - resp.write(chunk) - }) - resp.end() - } - return l; -} diff --git a/node_modules/nodetime/node_modules/request/tests/squid.conf b/node_modules/nodetime/node_modules/request/tests/squid.conf deleted file mode 100644 index 0d4a3b6..0000000 --- a/node_modules/nodetime/node_modules/request/tests/squid.conf +++ /dev/null @@ -1,77 +0,0 @@ -# -# Recommended minimum configuration: -# -acl manager proto cache_object -acl localhost src 127.0.0.1/32 ::1 -acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1 - -# Example rule allowing access from your local networks. -# Adapt to list your (internal) IP networks from where browsing -# should be allowed -acl localnet src 10.0.0.0/8 # RFC1918 possible internal network -acl localnet src 172.16.0.0/12 # RFC1918 possible internal network -acl localnet src 192.168.0.0/16 # RFC1918 possible internal network -acl localnet src fc00::/7 # RFC 4193 local private network range -acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines - -acl SSL_ports port 443 -acl Safe_ports port 80 # http -acl Safe_ports port 21 # ftp -acl Safe_ports port 443 # https -acl Safe_ports port 70 # gopher -acl Safe_ports port 210 # wais -acl Safe_ports port 1025-65535 # unregistered ports -acl Safe_ports port 280 # http-mgmt -acl Safe_ports port 488 # gss-http -acl Safe_ports port 591 # filemaker -acl Safe_ports port 777 # multiling http -acl CONNECT method CONNECT - -# -# Recommended minimum Access Permission configuration: -# -# Only allow cachemgr access from localhost -http_access allow manager localhost -http_access deny manager - -# Deny requests to certain unsafe ports -http_access deny !Safe_ports - -# Deny CONNECT to other than secure SSL ports -#http_access deny CONNECT !SSL_ports - -# We strongly recommend the following be uncommented to protect innocent -# web applications running on the proxy server who think the only -# one who can access services on "localhost" is a local user -#http_access deny to_localhost - -# -# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS -# - -# Example rule allowing access from your local networks. -# Adapt localnet in the ACL section to list your (internal) IP networks -# from where browsing should be allowed -http_access allow localnet -http_access allow localhost - -# And finally deny all other access to this proxy -http_access deny all - -# Squid normally listens to port 3128 -http_port 3128 - -# We recommend you to use at least the following line. -hierarchy_stoplist cgi-bin ? - -# Uncomment and adjust the following to add a disk cache directory. -#cache_dir ufs /usr/local/var/cache 100 16 256 - -# Leave coredumps in the first cache dir -coredump_dir /usr/local/var/cache - -# Add any of your own refresh_pattern entries above these. -refresh_pattern ^ftp: 1440 20% 10080 -refresh_pattern ^gopher: 1440 0% 1440 -refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 -refresh_pattern . 0 20% 4320 diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.cnf b/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.cnf deleted file mode 100644 index 425a889..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.cnf +++ /dev/null @@ -1,20 +0,0 @@ -[ req ] -default_bits = 1024 -days = 3650 -distinguished_name = req_distinguished_name -attributes = req_attributes -prompt = no -output_password = password - -[ req_distinguished_name ] -C = US -ST = CA -L = Oakland -O = request -OU = request Certificate Authority -CN = requestCA -emailAddress = mikeal@mikealrogers.com - -[ req_attributes ] -challengePassword = password challenge - diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.crl b/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.crl deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.crt b/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.crt deleted file mode 100644 index b4524e4..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.crt +++ /dev/null @@ -1,17 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICvTCCAiYCCQDn+P/MSbDsWjANBgkqhkiG9w0BAQUFADCBojELMAkGA1UEBhMC -VVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMRAwDgYDVQQKEwdyZXF1 -ZXN0MSYwJAYDVQQLEx1yZXF1ZXN0IENlcnRpZmljYXRlIEF1dGhvcml0eTESMBAG -A1UEAxMJcmVxdWVzdENBMSYwJAYJKoZIhvcNAQkBFhdtaWtlYWxAbWlrZWFscm9n -ZXJzLmNvbTAeFw0xMjAzMDEyMjUwNTZaFw0yMjAyMjcyMjUwNTZaMIGiMQswCQYD -VQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNVBAcTB09ha2xhbmQxEDAOBgNVBAoT -B3JlcXVlc3QxJjAkBgNVBAsTHXJlcXVlc3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -MRIwEAYDVQQDEwlyZXF1ZXN0Q0ExJjAkBgkqhkiG9w0BCQEWF21pa2VhbEBtaWtl -YWxyb2dlcnMuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7t9pQUAK4 -5XJYTI6NrF0n3G2HZsfN+rPYSVzzL8SuVyb1tHXos+vbPm3NKI4E8X1yVAXU8CjJ -5SqXnp4DAypAhaseho81cbhk7LXUhFz78OvAa+OD+xTAEAnNQ8tGUr4VGyplEjfD -xsBVuqV2j8GPNTftr+drOCFlqfAgMrBn4wIDAQABMA0GCSqGSIb3DQEBBQUAA4GB -ADVdTlVAL45R+PACNS7Gs4o81CwSclukBu4FJbxrkd4xGQmurgfRrYYKjtqiopQm -D7ysRamS3HMN9/VKq2T7r3z1PMHPAy7zM4uoXbbaTKwlnX4j/8pGPn8Ca3qHXYlo -88L/OOPc6Di7i7qckS3HFbXQCTiULtxWmy97oEuTwrAj ------END CERTIFICATE----- diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.csr b/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.csr deleted file mode 100644 index e48c56e..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.csr +++ /dev/null @@ -1,13 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIICBjCCAW8CAQAwgaIxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEQMA4GA1UE -BxMHT2FrbGFuZDEQMA4GA1UEChMHcmVxdWVzdDEmMCQGA1UECxMdcmVxdWVzdCBD -ZXJ0aWZpY2F0ZSBBdXRob3JpdHkxEjAQBgNVBAMTCXJlcXVlc3RDQTEmMCQGCSqG -SIb3DQEJARYXbWlrZWFsQG1pa2VhbHJvZ2Vycy5jb20wgZ8wDQYJKoZIhvcNAQEB -BQADgY0AMIGJAoGBALu32lBQArjlclhMjo2sXSfcbYdmx836s9hJXPMvxK5XJvW0 -deiz69s+bc0ojgTxfXJUBdTwKMnlKpeengMDKkCFqx6GjzVxuGTstdSEXPvw68Br -44P7FMAQCc1Dy0ZSvhUbKmUSN8PGwFW6pXaPwY81N+2v52s4IWWp8CAysGfjAgMB -AAGgIzAhBgkqhkiG9w0BCQcxFBMScGFzc3dvcmQgY2hhbGxlbmdlMA0GCSqGSIb3 -DQEBBQUAA4GBAGJO7grHeVHXetjHEK8urIxdnvfB2qeZeObz4GPKIkqUurjr0rfj -bA3EK1kDMR5aeQWR8RunixdM16Q6Ry0lEdLVWkdSwRN9dmirIHT9cypqnD/FYOia -SdezZ0lUzXgmJIwRYRwB1KSMMocIf52ll/xC2bEGg7/ZAEuAyAgcZV3X ------END CERTIFICATE REQUEST----- diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.key b/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.key deleted file mode 100644 index a53e7f7..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.key +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: DES-EDE3-CBC,C8B5887048377F02 - -nyD5ZH0Wup2uWsDvurq5mKDaDrf8lvNn9w0SH/ZkVnfR1/bkwqrFriqJWvZNUG+q -nS0iBYczsWLJnbub9a1zLOTENWUKVD5uqbC3aGHhnoUTNSa27DONgP8gHOn6JgR+ -GAKo01HCSTiVT4LjkwN337QKHnMP2fTzg+IoC/CigvMcq09hRLwU1/guq0GJKGwH -gTxYNuYmQC4Tjh8vdS4liF+Ve/P3qPR2CehZrIOkDT8PHJBGQJRo4xGUIB7Tpk38 -VCk+UZ0JCS2coY8VkY/9tqFJp/ZnnQQVmaNbdRqg7ECKL+bXnNo7yjzmazPZmPe3 -/ShbE0+CTt7LrjCaQAxWbeDzqfo1lQfgN1LulTm8MCXpQaJpv7v1VhIhQ7afjMYb -4thW/ypHPiYS2YJCAkAVlua9Oxzzh1qJoh8Df19iHtpd79Q77X/qf+1JvITlMu0U -gi7yEatmQcmYNws1mtTC1q2DXrO90c+NZ0LK/Alse6NRL/xiUdjug2iHeTf/idOR -Gg/5dSZbnnlj1E5zjSMDkzg6EHAFmHV4jYGSAFLEQgp4V3ZhMVoWZrvvSHgKV/Qh -FqrAK4INr1G2+/QTd09AIRzfy3/j6yD4A9iNaOsEf9Ua7Qh6RcALRCAZTWR5QtEf -dX+iSNJ4E85qXs0PqwkMDkoaxIJ+tmIRJY7y8oeylV8cfGAi8Soubt/i3SlR8IHC -uDMas/2OnwafK3N7ODeE1i7r7wkzQkSHaEz0TrF8XRnP25jAICCSLiMdAAjKfxVb -EvzsFSuAy3Jt6bU3hSLY9o4YVYKE+68ITMv9yNjvTsEiW+T+IbN34w== ------END RSA PRIVATE KEY----- diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.srl b/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.srl deleted file mode 100644 index 17128db..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/ca/ca.srl +++ /dev/null @@ -1 +0,0 @@ -ADF62016AA40C9C3 diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.cnf b/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.cnf deleted file mode 100644 index cd1fd1e..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.cnf +++ /dev/null @@ -1,19 +0,0 @@ -[ req ] -default_bits = 1024 -days = 3650 -distinguished_name = req_distinguished_name -attributes = req_attributes -prompt = no - -[ req_distinguished_name ] -C = US -ST = CA -L = Oakland -O = request -OU = testing -CN = testing.request.mikealrogers.com -emailAddress = mikeal@mikealrogers.com - -[ req_attributes ] -challengePassword = password challenge - diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.crt b/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.crt deleted file mode 100644 index efe96ce..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.crt +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICejCCAeMCCQCt9iAWqkDJwzANBgkqhkiG9w0BAQUFADCBojELMAkGA1UEBhMC -VVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMRAwDgYDVQQKEwdyZXF1 -ZXN0MSYwJAYDVQQLEx1yZXF1ZXN0IENlcnRpZmljYXRlIEF1dGhvcml0eTESMBAG -A1UEAxMJcmVxdWVzdENBMSYwJAYJKoZIhvcNAQkBFhdtaWtlYWxAbWlrZWFscm9n -ZXJzLmNvbTAeFw0xMjAzMDEyMjUwNTZaFw0yMjAyMjcyMjUwNTZaMIGjMQswCQYD -VQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNVBAcTB09ha2xhbmQxEDAOBgNVBAoT -B3JlcXVlc3QxEDAOBgNVBAsTB3Rlc3RpbmcxKTAnBgNVBAMTIHRlc3RpbmcucmVx -dWVzdC5taWtlYWxyb2dlcnMuY29tMSYwJAYJKoZIhvcNAQkBFhdtaWtlYWxAbWlr -ZWFscm9nZXJzLmNvbTBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDgVl0jMumvOpmM -20W5v9yhGgZj8hPhEQF/N7yCBVBn/rWGYm70IHC8T/pR5c0LkWc5gdnCJEvKWQjh -DBKxZD8FAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEABShRkNgFbgs4vUWW9R9deNJj -7HJoiTmvkmoOC7QzcYkjdgHbOxsSq3rBnwxsVjY9PAtPwBn0GRspOeG7KzKRgySB -kb22LyrCFKbEOfKO/+CJc80ioK9zEPVjGsFMyAB+ftYRqM+s/4cQlTg/m89l01wC -yapjN3RxZbInGhWR+jA= ------END CERTIFICATE----- diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.csr b/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.csr deleted file mode 100644 index a8e7595..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.csr +++ /dev/null @@ -1,11 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIIBgjCCASwCAQAwgaMxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEQMA4GA1UE -BxMHT2FrbGFuZDEQMA4GA1UEChMHcmVxdWVzdDEQMA4GA1UECxMHdGVzdGluZzEp -MCcGA1UEAxMgdGVzdGluZy5yZXF1ZXN0Lm1pa2VhbHJvZ2Vycy5jb20xJjAkBgkq -hkiG9w0BCQEWF21pa2VhbEBtaWtlYWxyb2dlcnMuY29tMFwwDQYJKoZIhvcNAQEB -BQADSwAwSAJBAOBWXSMy6a86mYzbRbm/3KEaBmPyE+ERAX83vIIFUGf+tYZibvQg -cLxP+lHlzQuRZzmB2cIkS8pZCOEMErFkPwUCAwEAAaAjMCEGCSqGSIb3DQEJBzEU -ExJwYXNzd29yZCBjaGFsbGVuZ2UwDQYJKoZIhvcNAQEFBQADQQBD3E5WekQzCEJw -7yOcqvtPYIxGaX8gRKkYfLPoj3pm3GF5SGqtJKhylKfi89szHXgktnQgzff9FN+A -HidVJ/3u ------END CERTIFICATE REQUEST----- diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.js b/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.js deleted file mode 100644 index 05e21c1..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.js +++ /dev/null @@ -1,28 +0,0 @@ -var fs = require("fs") -var https = require("https") -var options = { key: fs.readFileSync("./server.key") - , cert: fs.readFileSync("./server.crt") } - -var server = https.createServer(options, function (req, res) { - res.writeHead(200) - res.end() - server.close() -}) -server.listen(1337) - -var ca = fs.readFileSync("./ca.crt") -var agent = new https.Agent({ host: "localhost", port: 1337, ca: ca }) - -https.request({ host: "localhost" - , method: "HEAD" - , port: 1337 - , headers: { host: "testing.request.mikealrogers.com" } - , agent: agent - , ca: [ ca ] - , path: "/" }, function (res) { - if (res.client.authorized) { - console.log("node test: OK") - } else { - throw new Error(res.client.authorizationError) - } -}).end() diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.key b/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.key deleted file mode 100644 index 72d8698..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/ca/server.key +++ /dev/null @@ -1,9 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIBOwIBAAJBAOBWXSMy6a86mYzbRbm/3KEaBmPyE+ERAX83vIIFUGf+tYZibvQg -cLxP+lHlzQuRZzmB2cIkS8pZCOEMErFkPwUCAwEAAQJAK+r8ZM2sze8s7FRo/ApB -iRBtO9fCaIdJwbwJnXKo4RKwZDt1l2mm+fzZ+/QaQNjY1oTROkIIXmnwRvZWfYlW -gQIhAPKYsG+YSBN9o8Sdp1DMyZ/rUifKX3OE6q9tINkgajDVAiEA7Ltqh01+cnt0 -JEnud/8HHcuehUBLMofeg0G+gCnSbXECIQCqDvkXsWNNLnS/3lgsnvH0Baz4sbeJ -rjIpuVEeg8eM5QIgbu0+9JmOV6ybdmmiMV4yAncoF35R/iKGVHDZCAsQzDECIQDZ -0jGz22tlo5YMcYSqrdD3U4sds1pwiAaWFRbCunoUJw== ------END RSA PRIVATE KEY----- diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/npm-ca.crt b/node_modules/nodetime/node_modules/request/tests/ssl/npm-ca.crt deleted file mode 100644 index fde2fe9..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/npm-ca.crt +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIChzCCAfACCQDauvz/KHp8ejANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMC -VVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMQwwCgYDVQQKEwNucG0x -IjAgBgNVBAsTGW5wbSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxDjAMBgNVBAMTBW5w -bUNBMRcwFQYJKoZIhvcNAQkBFghpQGl6cy5tZTAeFw0xMTA5MDUwMTQ3MTdaFw0y -MTA5MDIwMTQ3MTdaMIGHMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNV -BAcTB09ha2xhbmQxDDAKBgNVBAoTA25wbTEiMCAGA1UECxMZbnBtIENlcnRpZmlj -YXRlIEF1dGhvcml0eTEOMAwGA1UEAxMFbnBtQ0ExFzAVBgkqhkiG9w0BCQEWCGlA -aXpzLm1lMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLI4tIqPpRW+ACw9GE -OgBlJZwK5f8nnKCLK629Pv5yJpQKs3DENExAyOgDcyaF0HD0zk8zTp+ZsLaNdKOz -Gn2U181KGprGKAXP6DU6ByOJDWmTlY6+Ad1laYT0m64fERSpHw/hjD3D+iX4aMOl -y0HdbT5m1ZGh6SJz3ZqxavhHLQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAC4ySDbC -l7W1WpLmtLGEQ/yuMLUf6Jy/vr+CRp4h+UzL+IQpCv8FfxsYE7dhf/bmWTEupBkv -yNL18lipt2jSvR3v6oAHAReotvdjqhxddpe5Holns6EQd1/xEZ7sB1YhQKJtvUrl -ZNufy1Jf1r0ldEGeA+0ISck7s+xSh9rQD2Op ------END CERTIFICATE----- diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/test.crt b/node_modules/nodetime/node_modules/request/tests/ssl/test.crt deleted file mode 100644 index b357f86..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/test.crt +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICQzCCAawCCQCO/XWtRFck1jANBgkqhkiG9w0BAQUFADBmMQswCQYDVQQGEwJU -SDEQMA4GA1UECBMHQmFuZ2tvazEOMAwGA1UEBxMFU2lsb20xGzAZBgNVBAoTElRo -ZSBSZXF1ZXN0IE1vZHVsZTEYMBYGA1UEAxMPcmVxdWVzdC5leGFtcGxlMB4XDTEx -MTIwMzAyMjkyM1oXDTIxMTEzMDAyMjkyM1owZjELMAkGA1UEBhMCVEgxEDAOBgNV -BAgTB0Jhbmdrb2sxDjAMBgNVBAcTBVNpbG9tMRswGQYDVQQKExJUaGUgUmVxdWVz -dCBNb2R1bGUxGDAWBgNVBAMTD3JlcXVlc3QuZXhhbXBsZTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAwmctddZqlA48+NXs0yOy92DijcQV1jf87zMiYAIlNUto -wghVbTWgJU5r0pdKrD16AptnWJTzKanhItEX8XCCPgsNkq1afgTtJP7rNkwu3xcj -eIMkhJg/ay4ZnkbnhYdsii5VTU5prix6AqWRAhbkBgoA+iVyHyof8wvZyKBoFTMC -AwEAATANBgkqhkiG9w0BAQUFAAOBgQB6BybMJbpeiABgihDfEVBcAjDoQ8gUMgwV -l4NulugfKTDmArqnR9aPd4ET5jX5dkMP4bwCHYsvrcYDeWEQy7x5WWuylOdKhua4 -L4cEi2uDCjqEErIG3cc1MCOk6Cl6Ld6tkIzQSf953qfdEACRytOeUqLNQcrXrqeE -c7U8F6MWLQ== ------END CERTIFICATE----- diff --git a/node_modules/nodetime/node_modules/request/tests/ssl/test.key b/node_modules/nodetime/node_modules/request/tests/ssl/test.key deleted file mode 100644 index b85810d..0000000 --- a/node_modules/nodetime/node_modules/request/tests/ssl/test.key +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIICXgIBAAKBgQDCZy111mqUDjz41ezTI7L3YOKNxBXWN/zvMyJgAiU1S2jCCFVt -NaAlTmvSl0qsPXoCm2dYlPMpqeEi0RfxcII+Cw2SrVp+BO0k/us2TC7fFyN4gySE -mD9rLhmeRueFh2yKLlVNTmmuLHoCpZECFuQGCgD6JXIfKh/zC9nIoGgVMwIDAQAB -AoGBALXFwfUf8vHTSmGlrdZS2AGFPvEtuvldyoxi9K5u8xmdFCvxnOcLsF2RsTHt -Mu5QYWhUpNJoG+IGLTPf7RJdj/kNtEs7xXqWy4jR36kt5z5MJzqiK+QIgiO9UFWZ -fjUb6oeDnTIJA9YFBdYi97MDuL89iU/UK3LkJN3hd4rciSbpAkEA+MCkowF5kSFb -rkOTBYBXZfiAG78itDXN6DXmqb9XYY+YBh3BiQM28oxCeQYyFy6pk/nstnd4TXk6 -V/ryA2g5NwJBAMgRKTY9KvxJWbESeMEFe2iBIV0c26/72Amgi7ZKUCLukLfD4tLF -+WSZdmTbbqI1079YtwaiOVfiLm45Q/3B0eUCQAaQ/0eWSGE+Yi8tdXoVszjr4GXb -G81qBi91DMu6U1It+jNfIba+MPsiHLcZJMVb4/oWBNukN7bD1nhwFWdlnu0CQQCf -Is9WHkdvz2RxbZDxb8verz/7kXXJQJhx5+rZf7jIYFxqX3yvTNv3wf2jcctJaWlZ -fVZwB193YSivcgt778xlAkEAprYUz3jczjF5r2hrgbizPzPDR94tM5BTO3ki2v3w -kbf+j2g7FNAx6kZiVN8XwfLc8xEeUGiPKwtq3ddPDFh17w== ------END RSA PRIVATE KEY----- diff --git a/node_modules/nodetime/node_modules/request/tests/test-body.js b/node_modules/nodetime/node_modules/request/tests/test-body.js deleted file mode 100644 index a624397..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-body.js +++ /dev/null @@ -1,117 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , request = require('../main.js') - ; - -var s = server.createServer(); - -var tests = - { testGet : - { resp : server.createGetResponse("TESTING!") - , expectBody: "TESTING!" - } - , testGetChunkBreak : - { resp : server.createChunkResponse( - [ new Buffer([239]) - , new Buffer([163]) - , new Buffer([191]) - , new Buffer([206]) - , new Buffer([169]) - , new Buffer([226]) - , new Buffer([152]) - , new Buffer([131]) - ]) - , expectBody: "Ω☃" - } - , testGetBuffer : - { resp : server.createGetResponse(new Buffer("TESTING!")) - , encoding: null - , expectBody: new Buffer("TESTING!") - } - , testGetEncoding : - { resp : server.createGetResponse(new Buffer('efa3bfcea9e29883', 'hex')) - , encoding: 'hex' - , expectBody: "efa3bfcea9e29883" - } - , testGetJSON : - { resp : server.createGetResponse('{"test":true}', 'application/json') - , json : true - , expectBody: {"test":true} - } - , testPutString : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : "PUTTINGDATA" - } - , testPutBuffer : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : new Buffer("PUTTINGDATA") - } - , testPutJSON : - { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) - , method: "PUT" - , json: {foo: 'bar'} - } - , testPutMultipart : - { resp: server.createPostValidator( - '--__BOUNDARY__\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__\r\n\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__--' - ) - , method: "PUT" - , multipart: - [ {'content-type': 'text/html', 'body': 'Oh hi.'} - , {'body': 'Oh hi.'} - ] - } - , testPutMultipartPreambleCRLF : - { resp: server.createPostValidator( - '\r\n--__BOUNDARY__\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__\r\n\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__--' - ) - , method: "PUT" - , preambleCRLF: true - , multipart: - [ {'content-type': 'text/html', 'body': 'Oh hi.'} - , {'body': 'Oh hi.'} - ] - } - } - -s.listen(s.port, function () { - - var counter = 0 - - for (i in tests) { - (function () { - var test = tests[i] - s.on('/'+i, test.resp) - test.uri = s.url + '/' + i - request(test, function (err, resp, body) { - if (err) throw err - if (test.expectBody) { - assert.deepEqual(test.expectBody, body) - } - counter = counter - 1; - if (counter === 0) { - console.log(Object.keys(tests).length+" tests passed.") - s.close() - } - }) - counter++ - })() - } -}) - diff --git a/node_modules/nodetime/node_modules/request/tests/test-cookie.js b/node_modules/nodetime/node_modules/request/tests/test-cookie.js deleted file mode 100644 index 6c6a7a7..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-cookie.js +++ /dev/null @@ -1,29 +0,0 @@ -var Cookie = require('../vendor/cookie') - , assert = require('assert'); - -var str = 'Sid="s543qactge.wKE61E01Bs%2BKhzmxrwrnug="; Path=/; httpOnly; Expires=Sat, 04 Dec 2010 23:27:28 GMT'; -var cookie = new Cookie(str); - -// test .toString() -assert.equal(cookie.toString(), str); - -// test .path -assert.equal(cookie.path, '/'); - -// test .httpOnly -assert.equal(cookie.httpOnly, true); - -// test .name -assert.equal(cookie.name, 'Sid'); - -// test .value -assert.equal(cookie.value, '"s543qactge.wKE61E01Bs%2BKhzmxrwrnug="'); - -// test .expires -assert.equal(cookie.expires instanceof Date, true); - -// test .path default -var cookie = new Cookie('foo=bar', { url: 'http://foo.com/bar' }); -assert.equal(cookie.path, '/bar'); - -console.log('All tests passed'); diff --git a/node_modules/nodetime/node_modules/request/tests/test-cookiejar.js b/node_modules/nodetime/node_modules/request/tests/test-cookiejar.js deleted file mode 100644 index 76fcd71..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-cookiejar.js +++ /dev/null @@ -1,90 +0,0 @@ -var Cookie = require('../vendor/cookie') - , Jar = require('../vendor/cookie/jar') - , assert = require('assert'); - -function expires(ms) { - return new Date(Date.now() + ms).toUTCString(); -} - -// test .get() expiration -(function() { - var jar = new Jar; - var cookie = new Cookie('sid=1234; path=/; expires=' + expires(1000)); - jar.add(cookie); - setTimeout(function(){ - var cookies = jar.get({ url: 'http://foo.com/foo' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], cookie); - setTimeout(function(){ - var cookies = jar.get({ url: 'http://foo.com/foo' }); - assert.equal(cookies.length, 0); - }, 1000); - }, 5); -})(); - -// test .get() path support -(function() { - var jar = new Jar; - var a = new Cookie('sid=1234; path=/'); - var b = new Cookie('sid=1111; path=/foo/bar'); - var c = new Cookie('sid=2222; path=/'); - jar.add(a); - jar.add(b); - jar.add(c); - - // should remove the duplicates - assert.equal(jar.cookies.length, 2); - - // same name, same path, latter prevails - var cookies = jar.get({ url: 'http://foo.com/' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], c); - - // same name, diff path, path specifity prevails, latter prevails - var cookies = jar.get({ url: 'http://foo.com/foo/bar' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], b); - - var jar = new Jar; - var a = new Cookie('sid=1111; path=/foo/bar'); - var b = new Cookie('sid=1234; path=/'); - jar.add(a); - jar.add(b); - - var cookies = jar.get({ url: 'http://foo.com/foo/bar' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], a); - - var cookies = jar.get({ url: 'http://foo.com/' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], b); - - var jar = new Jar; - var a = new Cookie('sid=1111; path=/foo/bar'); - var b = new Cookie('sid=3333; path=/foo/bar'); - var c = new Cookie('pid=3333; path=/foo/bar'); - var d = new Cookie('sid=2222; path=/foo/'); - var e = new Cookie('sid=1234; path=/'); - jar.add(a); - jar.add(b); - jar.add(c); - jar.add(d); - jar.add(e); - - var cookies = jar.get({ url: 'http://foo.com/foo/bar' }); - assert.equal(cookies.length, 2); - assert.equal(cookies[0], b); - assert.equal(cookies[1], c); - - var cookies = jar.get({ url: 'http://foo.com/foo/' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], d); - - var cookies = jar.get({ url: 'http://foo.com/' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], e); -})(); - -setTimeout(function() { - console.log('All tests passed'); -}, 1200); diff --git a/node_modules/nodetime/node_modules/request/tests/test-defaults.js b/node_modules/nodetime/node_modules/request/tests/test-defaults.js deleted file mode 100644 index ba09418..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-defaults.js +++ /dev/null @@ -1,114 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - ; - -var s = server.createServer(); - -s.listen(s.port, function () { - var counter = 0; - s.on('/get', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.method, 'GET') - resp.writeHead(200, {'Content-Type': 'text/plain'}); - resp.end('TESTING!'); - }); - - // test get(string, function) - request.defaults({headers:{foo:"bar"}})(s.url + '/get', function (e, r, b){ - if (e) throw e; - assert.deepEqual("TESTING!", b); - counter += 1; - }); - - s.on('/post', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.headers['content-type'], null); - assert.equal(req.method, 'POST') - resp.writeHead(200, {'Content-Type': 'application/json'}); - resp.end(JSON.stringify({foo:'bar'})); - }); - - // test post(string, object, function) - request.defaults({headers:{foo:"bar"}}).post(s.url + '/post', {json: true}, function (e, r, b){ - if (e) throw e; - assert.deepEqual('bar', b.foo); - counter += 1; - }); - - s.on('/post-body', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.headers['content-type'], 'application/json'); - assert.equal(req.method, 'POST') - resp.writeHead(200, {'Content-Type': 'application/json'}); - resp.end(JSON.stringify({foo:'bar'})); - }); - - // test post(string, object, function) with body - request.defaults({headers:{foo:"bar"}}).post(s.url + '/post-body', {json: true, body:{bar:"baz"}}, function (e, r, b){ - if (e) throw e; - assert.deepEqual('bar', b.foo); - counter += 1; - }); - - s.on('/del', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.method, 'DELETE') - resp.writeHead(200, {'Content-Type': 'application/json'}); - resp.end(JSON.stringify({foo:'bar'})); - }); - - // test .del(string, function) - request.defaults({headers:{foo:"bar"}, json:true}).del(s.url + '/del', function (e, r, b){ - if (e) throw e; - assert.deepEqual('bar', b.foo); - counter += 1; - }); - - s.on('/head', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.method, 'HEAD') - resp.writeHead(200, {'Content-Type': 'text/plain'}); - resp.end(); - }); - - // test head.(object, function) - request.defaults({headers:{foo:"bar"}}).head({uri: s.url + '/head'}, function (e, r, b){ - if (e) throw e; - counter += 1; - }); - - s.on('/get_custom', function(req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.headers.x, 'y'); - resp.writeHead(200, {'Content-Type': 'text/plain'}); - resp.end(); - }); - - // test custom request handler function - var defaultRequest = request.defaults({ - headers:{foo:"bar"} - , body: 'TESTING!' - }, function(uri, options, callback) { - var params = request.initParams(uri, options, callback); - options = params.options; - options.headers.x = 'y'; - - return request(params.uri, params.options, params.callback); - }); - - var msg = 'defaults test failed. head request should throw earlier'; - assert.throws(function() { - defaultRequest.head(s.url + '/get_custom', function(e, r, b) { - throw new Error(msg); - }); - counter+=1; - }, msg); - - defaultRequest.get(s.url + '/get_custom', function(e, r, b) { - if(e) throw e; - counter += 1; - console.log(counter.toString() + " tests passed."); - s.close(); - }); -}) diff --git a/node_modules/nodetime/node_modules/request/tests/test-errors.js b/node_modules/nodetime/node_modules/request/tests/test-errors.js deleted file mode 100644 index 1986a59..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-errors.js +++ /dev/null @@ -1,37 +0,0 @@ -var server = require('./server') - , events = require('events') - , assert = require('assert') - , request = require('../main.js') - ; - -var local = 'http://localhost:8888/asdf' - -try { - request({uri:local, body:{}}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Argument error, options.body.') -} - -try { - request({uri:local, multipart: 'foo'}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Argument error, options.multipart.') -} - -try { - request({uri:local, multipart: [{}]}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Body attribute missing in multipart.') -} - -try { - request(local, {multipart: [{}]}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Body attribute missing in multipart.') -} - -console.log("All tests passed.") diff --git a/node_modules/nodetime/node_modules/request/tests/test-follow-all-303.js b/node_modules/nodetime/node_modules/request/tests/test-follow-all-303.js deleted file mode 100644 index 3f2162d..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-follow-all-303.js +++ /dev/null @@ -1,30 +0,0 @@ -var request = require('../main'); -var http = require('http'); -var requests = 0; -var assert = require('assert'); - -var server = http.createServer(function (req, res) { - console.error(req.method, req.url); - requests ++; - - if (req.method === 'POST') { - console.error('send 303'); - res.setHeader('location', req.url); - res.statusCode = 303; - res.end('try again, i guess\n'); - } else { - console.error('send 200') - res.end('ok: ' + requests); - } -}); -server.listen(6767); - -request.post({ url: 'http://localhost:6767/foo', - followAllRedirects: true, - form: { foo: 'bar' } }, function (er, req, body) { - if (er) throw er; - assert.equal(body, 'ok: 2'); - assert.equal(requests, 2); - console.error('ok - ' + process.version); - server.close(); -}); diff --git a/node_modules/nodetime/node_modules/request/tests/test-follow-all.js b/node_modules/nodetime/node_modules/request/tests/test-follow-all.js deleted file mode 100644 index b78745b..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-follow-all.js +++ /dev/null @@ -1,35 +0,0 @@ -var request = require('../main'); -var http = require('http'); -var requests = 0; -var assert = require('assert'); - -var server = http.createServer(function (req, res) { - requests ++; - - // redirect everything 3 times, no matter what. - var c = req.headers.cookie; - - if (!c) c = 0; - else c = +c.split('=')[1] || 0; - - if (c > 3) { - res.end('ok: '+requests); - return; - } - - res.setHeader('set-cookie', 'c=' + (c + 1)); - res.setHeader('location', req.url); - res.statusCode = 302; - res.end('try again, i guess\n'); -}); -server.listen(6767); - -request.post({ url: 'http://localhost:6767/foo', - followAllRedirects: true, - form: { foo: 'bar' } }, function (er, req, body) { - if (er) throw er; - assert.equal(body, 'ok: 5'); - assert.equal(requests, 5); - console.error('ok - ' + process.version); - server.close(); -}); diff --git a/node_modules/nodetime/node_modules/request/tests/test-form.js b/node_modules/nodetime/node_modules/request/tests/test-form.js deleted file mode 100644 index aeefd31..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-form.js +++ /dev/null @@ -1,79 +0,0 @@ -var assert = require('assert') -var http = require('http'); -var path = require('path'); -var mime = require('mime'); -var request = require('../main.js'); -var fs = require('fs'); - -var remoteFile = 'http://nodejs.org/images/logo.png'; - -var FIELDS = [ - {name: 'my_field', value: 'my_value'}, - {name: 'my_buffer', value: new Buffer([1, 2, 3])}, - {name: 'my_file', value: fs.createReadStream(__dirname + '/unicycle.jpg')}, - {name: 'remote_file', value: request(remoteFile) } -]; - -var server = http.createServer(function(req, res) { - - // temp workaround - var data = ''; - req.setEncoding('utf8'); - - req.on('data', function(d) { - data += d; - }); - - req.on('end', function() { - // check for the fields' traces - - // 1st field : my_field - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 2nd field : my_buffer - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 3rd field : my_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for unicycle.jpg traces - assert.ok( data.indexOf('2005:06:21 01:44:12') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(field.value.path) ) != -1 ); - - // 4th field : remote_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for http://nodejs.org/images/logo.png traces - assert.ok( data.indexOf('ImageReady') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(remoteFile) ) != -1 ); - - res.writeHead(200); - res.end('done'); - - }); - - -}); - -server.listen(8080, function() { - - var req = request.post('http://localhost:8080/upload', function () { - server.close(); - }) - var form = req.form() - - FIELDS.forEach(function(field) { - form.append(field.name, field.value); - }); - -}); - -process.on('exit', function() { - assert.strictEqual(FIELDS.length, 0); -}); diff --git a/node_modules/nodetime/node_modules/request/tests/test-headers.js b/node_modules/nodetime/node_modules/request/tests/test-headers.js deleted file mode 100644 index 31fe3f4..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-headers.js +++ /dev/null @@ -1,52 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - , Cookie = require('../vendor/cookie') - , Jar = require('../vendor/cookie/jar') - , s = server.createServer() - -s.listen(s.port, function () { - var serverUri = 'http://localhost:' + s.port - , numTests = 0 - , numOutstandingTests = 0 - - function createTest(requestObj, serverAssertFn) { - var testNumber = numTests; - numTests += 1; - numOutstandingTests += 1; - s.on('/' + testNumber, function (req, res) { - serverAssertFn(req, res); - res.writeHead(200); - res.end(); - }); - requestObj.url = serverUri + '/' + testNumber - request(requestObj, function (err, res, body) { - assert.ok(!err) - assert.equal(res.statusCode, 200) - numOutstandingTests -= 1 - if (numOutstandingTests === 0) { - console.log(numTests + ' tests passed.') - s.close() - } - }) - } - - // Issue #125: headers.cookie shouldn't be replaced when a cookie jar isn't specified - createTest({headers: {cookie: 'foo=bar'}}, function (req, res) { - assert.ok(req.headers.cookie) - assert.equal(req.headers.cookie, 'foo=bar') - }) - - // Issue #125: headers.cookie + cookie jar - var jar = new Jar() - jar.add(new Cookie('quux=baz')); - createTest({jar: jar, headers: {cookie: 'foo=bar'}}, function (req, res) { - assert.ok(req.headers.cookie) - assert.equal(req.headers.cookie, 'foo=bar; quux=baz') - }) - - // There should be no cookie header when neither headers.cookie nor a cookie jar is specified - createTest({}, function (req, res) { - assert.ok(!req.headers.cookie) - }) -}) diff --git a/node_modules/nodetime/node_modules/request/tests/test-httpModule.js b/node_modules/nodetime/node_modules/request/tests/test-httpModule.js deleted file mode 100644 index 1866de2..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-httpModule.js +++ /dev/null @@ -1,94 +0,0 @@ -var http = require('http') - , https = require('https') - , server = require('./server') - , assert = require('assert') - , request = require('../main.js') - - -var faux_requests_made = {'http':0, 'https':0} -function wrap_request(name, module) { - // Just like the http or https module, but note when a request is made. - var wrapped = {} - Object.keys(module).forEach(function(key) { - var value = module[key]; - - if(key != 'request') - wrapped[key] = value; - else - wrapped[key] = function(options, callback) { - faux_requests_made[name] += 1 - return value.apply(this, arguments) - } - }) - - return wrapped; -} - - -var faux_http = wrap_request('http', http) - , faux_https = wrap_request('https', https) - , plain_server = server.createServer() - , https_server = server.createSSLServer() - - -plain_server.listen(plain_server.port, function() { - plain_server.on('/plain', function (req, res) { - res.writeHead(200) - res.end('plain') - }) - plain_server.on('/to_https', function (req, res) { - res.writeHead(301, {'location':'https://localhost:'+https_server.port + '/https'}) - res.end() - }) - - https_server.listen(https_server.port, function() { - https_server.on('/https', function (req, res) { - res.writeHead(200) - res.end('https') - }) - https_server.on('/to_plain', function (req, res) { - res.writeHead(302, {'location':'http://localhost:'+plain_server.port + '/plain'}) - res.end() - }) - - run_tests() - run_tests({}) - run_tests({'http:':faux_http}) - run_tests({'https:':faux_https}) - run_tests({'http:':faux_http, 'https:':faux_https}) - }) -}) - -function run_tests(httpModules) { - var to_https = 'http://localhost:'+plain_server.port+'/to_https' - var to_plain = 'https://localhost:'+https_server.port+'/to_plain' - - request(to_https, {'httpModules':httpModules}, function (er, res, body) { - assert.ok(!er, 'Bounce to SSL worked') - assert.equal(body, 'https', 'Received HTTPS server body') - done() - }) - - request(to_plain, {'httpModules':httpModules}, function (er, res, body) { - assert.ok(!er, 'Bounce to plaintext server worked') - assert.equal(body, 'plain', 'Received HTTPS server body') - done() - }) -} - - -var passed = 0; -function done() { - passed += 1 - var expected = 10 - - if(passed == expected) { - plain_server.close() - https_server.close() - - assert.equal(faux_requests_made.http, 4, 'Wrapped http module called appropriately') - assert.equal(faux_requests_made.https, 4, 'Wrapped https module called appropriately') - - console.log((expected+2) + ' tests passed.') - } -} diff --git a/node_modules/nodetime/node_modules/request/tests/test-https-strict.js b/node_modules/nodetime/node_modules/request/tests/test-https-strict.js deleted file mode 100644 index 470b68d..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-https-strict.js +++ /dev/null @@ -1,97 +0,0 @@ -// a test where we validate the siguature of the keys -// otherwise exactly the same as the ssl test - -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - , fs = require('fs') - , path = require('path') - , opts = { key: path.resolve(__dirname, 'ssl/ca/server.key') - , cert: path.resolve(__dirname, 'ssl/ca/server.crt') } - , s = server.createSSLServer(null, opts) - , caFile = path.resolve(__dirname, 'ssl/ca/ca.crt') - , ca = fs.readFileSync(caFile) - -var tests = - { testGet : - { resp : server.createGetResponse("TESTING!") - , expectBody: "TESTING!" - } - , testGetChunkBreak : - { resp : server.createChunkResponse( - [ new Buffer([239]) - , new Buffer([163]) - , new Buffer([191]) - , new Buffer([206]) - , new Buffer([169]) - , new Buffer([226]) - , new Buffer([152]) - , new Buffer([131]) - ]) - , expectBody: "Ω☃" - } - , testGetJSON : - { resp : server.createGetResponse('{"test":true}', 'application/json') - , json : true - , expectBody: {"test":true} - } - , testPutString : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : "PUTTINGDATA" - } - , testPutBuffer : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : new Buffer("PUTTINGDATA") - } - , testPutJSON : - { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) - , method: "PUT" - , json: {foo: 'bar'} - } - , testPutMultipart : - { resp: server.createPostValidator( - '--__BOUNDARY__\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__\r\n\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__--' - ) - , method: "PUT" - , multipart: - [ {'content-type': 'text/html', 'body': 'Oh hi.'} - , {'body': 'Oh hi.'} - ] - } - } - -s.listen(s.port, function () { - - var counter = 0 - - for (i in tests) { - (function () { - var test = tests[i] - s.on('/'+i, test.resp) - test.uri = s.url + '/' + i - test.strictSSL = true - test.ca = ca - test.headers = { host: 'testing.request.mikealrogers.com' } - request(test, function (err, resp, body) { - if (err) throw err - if (test.expectBody) { - assert.deepEqual(test.expectBody, body) - } - counter = counter - 1; - if (counter === 0) { - console.log(Object.keys(tests).length+" tests passed.") - s.close() - } - }) - counter++ - })() - } -}) diff --git a/node_modules/nodetime/node_modules/request/tests/test-https.js b/node_modules/nodetime/node_modules/request/tests/test-https.js deleted file mode 100644 index 58e7db9..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-https.js +++ /dev/null @@ -1,86 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - -var s = server.createSSLServer(); - -var tests = - { testGet : - { resp : server.createGetResponse("TESTING!") - , expectBody: "TESTING!" - } - , testGetChunkBreak : - { resp : server.createChunkResponse( - [ new Buffer([239]) - , new Buffer([163]) - , new Buffer([191]) - , new Buffer([206]) - , new Buffer([169]) - , new Buffer([226]) - , new Buffer([152]) - , new Buffer([131]) - ]) - , expectBody: "Ω☃" - } - , testGetJSON : - { resp : server.createGetResponse('{"test":true}', 'application/json') - , json : true - , expectBody: {"test":true} - } - , testPutString : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : "PUTTINGDATA" - } - , testPutBuffer : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : new Buffer("PUTTINGDATA") - } - , testPutJSON : - { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) - , method: "PUT" - , json: {foo: 'bar'} - } - , testPutMultipart : - { resp: server.createPostValidator( - '--__BOUNDARY__\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__\r\n\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__--' - ) - , method: "PUT" - , multipart: - [ {'content-type': 'text/html', 'body': 'Oh hi.'} - , {'body': 'Oh hi.'} - ] - } - } - -s.listen(s.port, function () { - - var counter = 0 - - for (i in tests) { - (function () { - var test = tests[i] - s.on('/'+i, test.resp) - test.uri = s.url + '/' + i - request(test, function (err, resp, body) { - if (err) throw err - if (test.expectBody) { - assert.deepEqual(test.expectBody, body) - } - counter = counter - 1; - if (counter === 0) { - console.log(Object.keys(tests).length+" tests passed.") - s.close() - } - }) - counter++ - })() - } -}) diff --git a/node_modules/nodetime/node_modules/request/tests/test-oauth.js b/node_modules/nodetime/node_modules/request/tests/test-oauth.js deleted file mode 100644 index 72ca923..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-oauth.js +++ /dev/null @@ -1,117 +0,0 @@ -var hmacsign = require('../oauth').hmacsign - , assert = require('assert') - , qs = require('querystring') - , request = require('../main') - ; - -function getsignature (r) { - var sign - r.headers.Authorization.slice('OAuth '.length).replace(/,\ /g, ',').split(',').forEach(function (v) { - if (v.slice(0, 'oauth_signature="'.length) === 'oauth_signature="') sign = v.slice('oauth_signature="'.length, -1) - }) - return decodeURIComponent(sign) -} - -// Tests from Twitter documentation https://dev.twitter.com/docs/auth/oauth - -var reqsign = hmacsign('POST', 'https://api.twitter.com/oauth/request_token', - { oauth_callback: 'http://localhost:3005/the_dance/process_callback?service_provider_id=11' - , oauth_consumer_key: 'GDdmIQH6jhtmLUypg82g' - , oauth_nonce: 'QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk' - , oauth_signature_method: 'HMAC-SHA1' - , oauth_timestamp: '1272323042' - , oauth_version: '1.0' - }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98") - -console.log(reqsign) -console.log('8wUi7m5HFQy76nowoCThusfgB+Q=') -assert.equal(reqsign, '8wUi7m5HFQy76nowoCThusfgB+Q=') - -var accsign = hmacsign('POST', 'https://api.twitter.com/oauth/access_token', - { oauth_consumer_key: 'GDdmIQH6jhtmLUypg82g' - , oauth_nonce: '9zWH6qe0qG7Lc1telCn7FhUbLyVdjEaL3MO5uHxn8' - , oauth_signature_method: 'HMAC-SHA1' - , oauth_token: '8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc' - , oauth_timestamp: '1272323047' - , oauth_verifier: 'pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY' - , oauth_version: '1.0' - }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98", "x6qpRnlEmW9JbQn4PQVVeVG8ZLPEx6A0TOebgwcuA") - -console.log(accsign) -console.log('PUw/dHA4fnlJYM6RhXk5IU/0fCc=') -assert.equal(accsign, 'PUw/dHA4fnlJYM6RhXk5IU/0fCc=') - -var upsign = hmacsign('POST', 'http://api.twitter.com/1/statuses/update.json', - { oauth_consumer_key: "GDdmIQH6jhtmLUypg82g" - , oauth_nonce: "oElnnMTQIZvqvlfXM56aBLAf5noGD0AQR3Fmi7Q6Y" - , oauth_signature_method: "HMAC-SHA1" - , oauth_token: "819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw" - , oauth_timestamp: "1272325550" - , oauth_version: "1.0" - , status: 'setting up my twitter 私のさえずりを設定する' - }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98", "J6zix3FfA9LofH0awS24M3HcBYXO5nI1iYe8EfBA") - -console.log(upsign) -console.log('yOahq5m0YjDDjfjxHaXEsW9D+X0=') -assert.equal(upsign, 'yOahq5m0YjDDjfjxHaXEsW9D+X0=') - - -var rsign = request.post( - { url: 'https://api.twitter.com/oauth/request_token' - , oauth: - { callback: 'http://localhost:3005/the_dance/process_callback?service_provider_id=11' - , consumer_key: 'GDdmIQH6jhtmLUypg82g' - , nonce: 'QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk' - , timestamp: '1272323042' - , version: '1.0' - , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" - } - }) - -setTimeout(function () { - console.log(getsignature(rsign)) - assert.equal(reqsign, getsignature(rsign)) -}) - -var raccsign = request.post( - { url: 'https://api.twitter.com/oauth/access_token' - , oauth: - { consumer_key: 'GDdmIQH6jhtmLUypg82g' - , nonce: '9zWH6qe0qG7Lc1telCn7FhUbLyVdjEaL3MO5uHxn8' - , signature_method: 'HMAC-SHA1' - , token: '8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc' - , timestamp: '1272323047' - , verifier: 'pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY' - , version: '1.0' - , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" - , token_secret: "x6qpRnlEmW9JbQn4PQVVeVG8ZLPEx6A0TOebgwcuA" - } - }) - -setTimeout(function () { - console.log(getsignature(raccsign)) - assert.equal(accsign, getsignature(raccsign)) -}, 1) - -var rupsign = request.post( - { url: 'http://api.twitter.com/1/statuses/update.json' - , oauth: - { consumer_key: "GDdmIQH6jhtmLUypg82g" - , nonce: "oElnnMTQIZvqvlfXM56aBLAf5noGD0AQR3Fmi7Q6Y" - , signature_method: "HMAC-SHA1" - , token: "819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw" - , timestamp: "1272325550" - , version: "1.0" - , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" - , token_secret: "J6zix3FfA9LofH0awS24M3HcBYXO5nI1iYe8EfBA" - } - , form: {status: 'setting up my twitter 私のさえずりを設定する'} - }) -setTimeout(function () { - console.log(getsignature(rupsign)) - assert.equal(upsign, getsignature(rupsign)) -}, 1) - - - - diff --git a/node_modules/nodetime/node_modules/request/tests/test-params.js b/node_modules/nodetime/node_modules/request/tests/test-params.js deleted file mode 100644 index 5ddb311..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-params.js +++ /dev/null @@ -1,92 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - ; - -var s = server.createServer(); - -var tests = - { testGet : - { resp : server.createGetResponse("TESTING!") - , expectBody: "TESTING!" - } - , testGetChunkBreak : - { resp : server.createChunkResponse( - [ new Buffer([239]) - , new Buffer([163]) - , new Buffer([191]) - , new Buffer([206]) - , new Buffer([169]) - , new Buffer([226]) - , new Buffer([152]) - , new Buffer([131]) - ]) - , expectBody: "Ω☃" - } - , testGetBuffer : - { resp : server.createGetResponse(new Buffer("TESTING!")) - , encoding: null - , expectBody: new Buffer("TESTING!") - } - , testGetJSON : - { resp : server.createGetResponse('{"test":true}', 'application/json') - , json : true - , expectBody: {"test":true} - } - , testPutString : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : "PUTTINGDATA" - } - , testPutBuffer : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : new Buffer("PUTTINGDATA") - } - , testPutJSON : - { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) - , method: "PUT" - , json: {foo: 'bar'} - } - , testPutMultipart : - { resp: server.createPostValidator( - '--__BOUNDARY__\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__\r\n\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__--' - ) - , method: "PUT" - , multipart: - [ {'content-type': 'text/html', 'body': 'Oh hi.'} - , {'body': 'Oh hi.'} - ] - } - } - -s.listen(s.port, function () { - - var counter = 0 - - for (i in tests) { - (function () { - var test = tests[i] - s.on('/'+i, test.resp) - //test.uri = s.url + '/' + i - request(s.url + '/' + i, test, function (err, resp, body) { - if (err) throw err - if (test.expectBody) { - assert.deepEqual(test.expectBody, body) - } - counter = counter - 1; - if (counter === 0) { - console.log(Object.keys(tests).length+" tests passed.") - s.close() - } - }) - counter++ - })() - } -}) diff --git a/node_modules/nodetime/node_modules/request/tests/test-piped-redirect.js b/node_modules/nodetime/node_modules/request/tests/test-piped-redirect.js deleted file mode 100644 index 25bf35d..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-piped-redirect.js +++ /dev/null @@ -1,52 +0,0 @@ -var http = require('http') - , assert = require('assert') - , request = require('../main.js') - ; - -var portOne = 8968 - , portTwo = 8969 - ; - - -// server one -var s1 = http.createServer(function (req, resp) -{ - if (req.url == '/original') - { - resp.writeHeader(302, {'location': '/redirected'}) - resp.end() - } - else if (req.url == '/redirected') - { - resp.writeHeader(200, {'content-type': 'text/plain'}) - resp.write('OK') - resp.end() - } - -}).listen(portOne); - - -// server two -var s2 = http.createServer(function (req, resp) -{ - - var x = request('http://localhost:'+portOne+'/original') - req.pipe(x) - x.pipe(resp) - -}).listen(portTwo, function() -{ - - var r = request('http://localhost:'+portTwo+'/original', function (err, res, body) { - - assert.equal(body, 'OK') - - s1.close() - s2.close() - - }); - - // it hangs, so wait a second :) - r.timeout = 1000; - -}); diff --git a/node_modules/nodetime/node_modules/request/tests/test-pipes.js b/node_modules/nodetime/node_modules/request/tests/test-pipes.js deleted file mode 100644 index 7162981..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-pipes.js +++ /dev/null @@ -1,216 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , fs = require('fs') - , request = require('../main.js') - , path = require('path') - , util = require('util') - ; - -var s = server.createServer(3453); - -function ValidationStream(str) { - this.str = str - this.buf = '' - this.on('data', function (data) { - this.buf += data - }) - this.on('end', function () { - assert.equal(this.str, this.buf) - }) - this.writable = true -} -util.inherits(ValidationStream, stream.Stream) -ValidationStream.prototype.write = function (chunk) { - this.emit('data', chunk) -} -ValidationStream.prototype.end = function (chunk) { - if (chunk) emit('data', chunk) - this.emit('end') -} - -s.listen(s.port, function () { - counter = 0; - - var check = function () { - counter = counter - 1 - if (counter === 0) { - console.log('All tests passed.') - setTimeout(function () { - process.exit(); - }, 500) - } - } - - // Test pipeing to a request object - s.once('/push', server.createPostValidator("mydata")); - - var mydata = new stream.Stream(); - mydata.readable = true - - counter++ - var r1 = request.put({url:'http://localhost:3453/push'}, function () { - check(); - }) - mydata.pipe(r1) - - mydata.emit('data', 'mydata'); - mydata.emit('end'); - - // Test pipeing to a request object with a json body - s.once('/push-json', server.createPostValidator("{\"foo\":\"bar\"}", "application/json")); - - var mybodydata = new stream.Stream(); - mybodydata.readable = true - - counter++ - var r2 = request.put({url:'http://localhost:3453/push-json',json:true}, function () { - check(); - }) - mybodydata.pipe(r2) - - mybodydata.emit('data', JSON.stringify({foo:"bar"})); - mybodydata.emit('end'); - - // Test pipeing from a request object. - s.once('/pull', server.createGetResponse("mypulldata")); - - var mypulldata = new stream.Stream(); - mypulldata.writable = true - - counter++ - request({url:'http://localhost:3453/pull'}).pipe(mypulldata) - - var d = ''; - - mypulldata.write = function (chunk) { - d += chunk; - } - mypulldata.end = function () { - assert.equal(d, 'mypulldata'); - check(); - }; - - - s.on('/cat', function (req, resp) { - if (req.method === "GET") { - resp.writeHead(200, {'content-type':'text/plain-test', 'content-length':4}); - resp.end('asdf') - } else if (req.method === "PUT") { - assert.equal(req.headers['content-type'], 'text/plain-test'); - assert.equal(req.headers['content-length'], 4) - var validate = ''; - - req.on('data', function (chunk) {validate += chunk}) - req.on('end', function () { - resp.writeHead(201); - resp.end(); - assert.equal(validate, 'asdf'); - check(); - }) - } - }) - s.on('/pushjs', function (req, resp) { - if (req.method === "PUT") { - assert.equal(req.headers['content-type'], 'application/javascript'); - check(); - } - }) - s.on('/catresp', function (req, resp) { - request.get('http://localhost:3453/cat').pipe(resp) - }) - s.on('/doodle', function (req, resp) { - if (req.headers['x-oneline-proxy']) { - resp.setHeader('x-oneline-proxy', 'yup') - } - resp.writeHead('200', {'content-type':'image/png'}) - fs.createReadStream(path.join(__dirname, 'googledoodle.png')).pipe(resp) - }) - s.on('/onelineproxy', function (req, resp) { - var x = request('http://localhost:3453/doodle') - req.pipe(x) - x.pipe(resp) - }) - - counter++ - fs.createReadStream(__filename).pipe(request.put('http://localhost:3453/pushjs')) - - counter++ - request.get('http://localhost:3453/cat').pipe(request.put('http://localhost:3453/cat')) - - counter++ - request.get('http://localhost:3453/catresp', function (e, resp, body) { - assert.equal(resp.headers['content-type'], 'text/plain-test'); - assert.equal(resp.headers['content-length'], 4) - check(); - }) - - var doodleWrite = fs.createWriteStream(path.join(__dirname, 'test.png')) - - counter++ - request.get('http://localhost:3453/doodle').pipe(doodleWrite) - - doodleWrite.on('close', function () { - assert.deepEqual(fs.readFileSync(path.join(__dirname, 'googledoodle.png')), fs.readFileSync(path.join(__dirname, 'test.png'))) - check() - }) - - process.on('exit', function () { - fs.unlinkSync(path.join(__dirname, 'test.png')) - }) - - counter++ - request.get({uri:'http://localhost:3453/onelineproxy', headers:{'x-oneline-proxy':'nope'}}, function (err, resp, body) { - assert.equal(resp.headers['x-oneline-proxy'], 'yup') - check() - }) - - s.on('/afterresponse', function (req, resp) { - resp.write('d') - resp.end() - }) - - counter++ - var afterresp = request.post('http://localhost:3453/afterresponse').on('response', function () { - var v = new ValidationStream('d') - afterresp.pipe(v) - v.on('end', check) - }) - - s.on('/forward1', function (req, resp) { - resp.writeHead(302, {location:'/forward2'}) - resp.end() - }) - s.on('/forward2', function (req, resp) { - resp.writeHead('200', {'content-type':'image/png'}) - resp.write('d') - resp.end() - }) - - counter++ - var validateForward = new ValidationStream('d') - validateForward.on('end', check) - request.get('http://localhost:3453/forward1').pipe(validateForward) - - // Test pipe options - s.once('/opts', server.createGetResponse('opts response')); - - var optsStream = new stream.Stream(); - optsStream.writable = true - - var optsData = ''; - optsStream.write = function (buf) { - optsData += buf; - if (optsData === 'opts response') { - setTimeout(check, 10); - } - } - - optsStream.end = function () { - assert.fail('end called') - }; - - counter++ - request({url:'http://localhost:3453/opts'}).pipe(optsStream, { end : false }) -}) diff --git a/node_modules/nodetime/node_modules/request/tests/test-pool.js b/node_modules/nodetime/node_modules/request/tests/test-pool.js deleted file mode 100644 index 1e7d578..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-pool.js +++ /dev/null @@ -1,16 +0,0 @@ -var request = require('../main') - , http = require('http') - , assert = require('assert') - ; - -var s = http.createServer(function (req, resp) { - resp.statusCode = 200; - resp.end('asdf'); -}).listen(8080, function () { - request({'url': 'http://localhost:8080', 'pool': false}, function (e, resp) { - var agent = resp.request.agent; - assert.strictEqual(typeof agent, 'boolean'); - assert.strictEqual(agent, false); - s.close(); - }); -}); \ No newline at end of file diff --git a/node_modules/nodetime/node_modules/request/tests/test-protocol-changing-redirect.js b/node_modules/nodetime/node_modules/request/tests/test-protocol-changing-redirect.js deleted file mode 100644 index f74e196..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-protocol-changing-redirect.js +++ /dev/null @@ -1,60 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - - -var s = server.createServer() -var ss = server.createSSLServer() -var sUrl = 'http://localhost:' + s.port -var ssUrl = 'https://localhost:' + ss.port - -s.listen(s.port, bouncy(s, ssUrl)) -ss.listen(ss.port, bouncy(ss, sUrl)) - -var hits = {} -var expect = {} -var pending = 0 -function bouncy (s, server) { return function () { - - var redirs = { a: 'b' - , b: 'c' - , c: 'd' - , d: 'e' - , e: 'f' - , f: 'g' - , g: 'h' - , h: 'end' } - - var perm = true - Object.keys(redirs).forEach(function (p) { - var t = redirs[p] - - // switch type each time - var type = perm ? 301 : 302 - perm = !perm - s.on('/' + p, function (req, res) { - res.writeHead(type, { location: server + '/' + t }) - res.end() - }) - }) - - s.on('/end', function (req, res) { - var h = req.headers['x-test-key'] - hits[h] = true - pending -- - if (pending === 0) done() - }) -}} - -for (var i = 0; i < 5; i ++) { - pending ++ - var val = 'test_' + i - expect[val] = true - request({ url: (i % 2 ? sUrl : ssUrl) + '/a' - , headers: { 'x-test-key': val } }) -} - -function done () { - assert.deepEqual(hits, expect) - process.exit(0) -} diff --git a/node_modules/nodetime/node_modules/request/tests/test-proxy.js b/node_modules/nodetime/node_modules/request/tests/test-proxy.js deleted file mode 100644 index 647157c..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-proxy.js +++ /dev/null @@ -1,39 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , fs = require('fs') - , request = require('../main.js') - , path = require('path') - , util = require('util') - ; - -var port = 6768 - , called = false - , proxiedHost = 'google.com' - ; - -var s = server.createServer(port) -s.listen(port, function () { - s.on('http://google.com/', function (req, res) { - called = true - assert.equal(req.headers.host, proxiedHost) - res.writeHeader(200) - res.end() - }) - request ({ - url: 'http://'+proxiedHost, - proxy: 'http://localhost:'+port - /* - //should behave as if these arguments where passed: - url: 'http://localhost:'+port, - headers: {host: proxiedHost} - //*/ - }, function (err, res, body) { - s.close() - }) -}) - -process.on('exit', function () { - assert.ok(called, 'the request must be made to the proxy server') -}) diff --git a/node_modules/nodetime/node_modules/request/tests/test-qs.js b/node_modules/nodetime/node_modules/request/tests/test-qs.js deleted file mode 100644 index 1aac22b..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-qs.js +++ /dev/null @@ -1,28 +0,0 @@ -var request = request = require('../main.js') - , assert = require('assert') - ; - - -// Test adding a querystring -var req1 = request.get({ uri: 'http://www.google.com', qs: { q : 'search' }}) -setTimeout(function() { - assert.equal('/?q=search', req1.path) -}, 1) - -// Test replacing a querystring value -var req2 = request.get({ uri: 'http://www.google.com?q=abc', qs: { q : 'search' }}) -setTimeout(function() { - assert.equal('/?q=search', req2.path) -}, 1) - -// Test appending a querystring value to the ones present in the uri -var req3 = request.get({ uri: 'http://www.google.com?x=y', qs: { q : 'search' }}) -setTimeout(function() { - assert.equal('/?x=y&q=search', req3.path) -}, 1) - -// Test leaving a querystring alone -var req4 = request.get({ uri: 'http://www.google.com?x=y'}) -setTimeout(function() { - assert.equal('/?x=y', req4.path) -}, 1) diff --git a/node_modules/nodetime/node_modules/request/tests/test-redirect.js b/node_modules/nodetime/node_modules/request/tests/test-redirect.js deleted file mode 100644 index b84844a..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-redirect.js +++ /dev/null @@ -1,154 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - , Cookie = require('../vendor/cookie') - , Jar = require('../vendor/cookie/jar') - -var s = server.createServer() - -s.listen(s.port, function () { - var server = 'http://localhost:' + s.port; - var hits = {} - var passed = 0; - - bouncer(301, 'temp') - bouncer(302, 'perm') - bouncer(302, 'nope') - - function bouncer(code, label) { - var landing = label+'_landing'; - - s.on('/'+label, function (req, res) { - hits[label] = true; - res.writeHead(code, { - 'location':server + '/'+landing, - 'set-cookie': 'ham=eggs' - }) - res.end() - }) - - s.on('/'+landing, function (req, res) { - if (req.method !== 'GET') { // We should only accept GET redirects - console.error("Got a non-GET request to the redirect destination URL"); - res.writeHead(400); - res.end(); - return; - } - // Make sure the cookie doesn't get included twice, see #139: - // Make sure cookies are set properly after redirect - assert.equal(req.headers.cookie, 'foo=bar; quux=baz; ham=eggs'); - hits[landing] = true; - res.writeHead(200) - res.end(landing) - }) - } - - // Permanent bounce - var jar = new Jar() - jar.add(new Cookie('quux=baz')) - request({uri: server+'/perm', jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode) - assert.ok(hits.perm, 'Original request is to /perm') - assert.ok(hits.perm_landing, 'Forward to permanent landing URL') - assert.equal(body, 'perm_landing', 'Got permanent landing content') - passed += 1 - done() - }) - - // Temporary bounce - request({uri: server+'/temp', jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(hits.temp_landing, 'Forward to temporary landing URL') - assert.equal(body, 'temp_landing', 'Got temporary landing content') - passed += 1 - done() - }) - - // Prevent bouncing. - request({uri:server+'/nope', jar: jar, headers: {cookie: 'foo=bar'}, followRedirect:false}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 302) throw new Error('Status is not 302: '+res.statusCode) - assert.ok(hits.nope, 'Original request to /nope') - assert.ok(!hits.nope_landing, 'No chasing the redirect') - assert.equal(res.statusCode, 302, 'Response is the bounce itself') - passed += 1 - done() - }) - - // Should not follow post redirects by default - request.post(server+'/temp', { jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 301) throw new Error('Status is not 301: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(!hits.temp_landing, 'No chasing the redirect when post') - assert.equal(res.statusCode, 301, 'Response is the bounce itself') - passed += 1 - done() - }) - - // Should follow post redirects when followAllRedirects true - request.post({uri:server+'/temp', followAllRedirects:true, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(hits.temp_landing, 'Forward to temporary landing URL') - assert.equal(body, 'temp_landing', 'Got temporary landing content') - passed += 1 - done() - }) - - request.post({uri:server+'/temp', followAllRedirects:false, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 301) throw new Error('Status is not 301: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(!hits.temp_landing, 'No chasing the redirect') - assert.equal(res.statusCode, 301, 'Response is the bounce itself') - passed += 1 - done() - }) - - // Should not follow delete redirects by default - request.del(server+'/temp', { jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode < 301) throw new Error('Status is not a redirect.') - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(!hits.temp_landing, 'No chasing the redirect when delete') - assert.equal(res.statusCode, 301, 'Response is the bounce itself') - passed += 1 - done() - }) - - // Should not follow delete redirects even if followRedirect is set to true - request.del(server+'/temp', { followRedirect: true, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 301) throw new Error('Status is not 301: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(!hits.temp_landing, 'No chasing the redirect when delete') - assert.equal(res.statusCode, 301, 'Response is the bounce itself') - passed += 1 - done() - }) - - // Should follow delete redirects when followAllRedirects true - request.del(server+'/temp', {followAllRedirects:true, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(hits.temp_landing, 'Forward to temporary landing URL') - assert.equal(body, 'temp_landing', 'Got temporary landing content') - passed += 1 - done() - }) - - var reqs_done = 0; - function done() { - reqs_done += 1; - if(reqs_done == 9) { - console.log(passed + ' tests passed.') - s.close() - } - } -}) diff --git a/node_modules/nodetime/node_modules/request/tests/test-s3.js b/node_modules/nodetime/node_modules/request/tests/test-s3.js deleted file mode 100644 index 5f59c4a..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-s3.js +++ /dev/null @@ -1,13 +0,0 @@ -var request = require('../main') - -var r = request.get('https://log.curlybracecast.com.s3.amazonaws.com/', - { aws: - { key: 'AKIAI6KIQRRVMGK3WK5Q' - , secret: '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' - , bucket: 'log.curlybracecast.com' - } - }, function (e, resp, body) { - console.log(r.headers) - console.log(body) - } -) \ No newline at end of file diff --git a/node_modules/nodetime/node_modules/request/tests/test-timeout.js b/node_modules/nodetime/node_modules/request/tests/test-timeout.js deleted file mode 100644 index 673f8ad..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-timeout.js +++ /dev/null @@ -1,87 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , request = require('../main.js') - ; - -var s = server.createServer(); -var expectedBody = "waited"; -var remainingTests = 5; - -s.listen(s.port, function () { - // Request that waits for 200ms - s.on('/timeout', function (req, resp) { - setTimeout(function(){ - resp.writeHead(200, {'content-type':'text/plain'}) - resp.write(expectedBody) - resp.end() - }, 200); - }); - - // Scenario that should timeout - var shouldTimeout = { - url: s.url + "/timeout", - timeout:100 - } - - - request(shouldTimeout, function (err, resp, body) { - assert.equal(err.code, "ETIMEDOUT"); - checkDone(); - }) - - - // Scenario that shouldn't timeout - var shouldntTimeout = { - url: s.url + "/timeout", - timeout:300 - } - - request(shouldntTimeout, function (err, resp, body) { - assert.equal(err, null); - assert.equal(expectedBody, body) - checkDone(); - }) - - // Scenario with no timeout set, so shouldn't timeout - var noTimeout = { - url: s.url + "/timeout" - } - - request(noTimeout, function (err, resp, body) { - assert.equal(err); - assert.equal(expectedBody, body) - checkDone(); - }) - - // Scenario with a negative timeout value, should be treated a zero or the minimum delay - var negativeTimeout = { - url: s.url + "/timeout", - timeout:-1000 - } - - request(negativeTimeout, function (err, resp, body) { - assert.equal(err.code, "ETIMEDOUT"); - checkDone(); - }) - - // Scenario with a float timeout value, should be rounded by setTimeout anyway - var floatTimeout = { - url: s.url + "/timeout", - timeout: 100.76 - } - - request(floatTimeout, function (err, resp, body) { - assert.equal(err.code, "ETIMEDOUT"); - checkDone(); - }) - - function checkDone() { - if(--remainingTests == 0) { - s.close(); - console.log("All tests passed."); - } - } -}) - diff --git a/node_modules/nodetime/node_modules/request/tests/test-toJSON.js b/node_modules/nodetime/node_modules/request/tests/test-toJSON.js deleted file mode 100644 index b7c67ef..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-toJSON.js +++ /dev/null @@ -1,14 +0,0 @@ -var request = require('../main') - , http = require('http') - , assert = require('assert') - ; - -var s = http.createServer(function (req, resp) { - resp.statusCode = 200 - resp.end('asdf') -}).listen(8080, function () { - var r = request('http://localhost:8080', function (e, resp) { - assert.equal(JSON.parse(JSON.stringify(r)).response.statusCode, 200) - s.close() - }) -}) \ No newline at end of file diff --git a/node_modules/nodetime/node_modules/request/tests/test-tunnel.js b/node_modules/nodetime/node_modules/request/tests/test-tunnel.js deleted file mode 100644 index 51e2126..0000000 --- a/node_modules/nodetime/node_modules/request/tests/test-tunnel.js +++ /dev/null @@ -1,63 +0,0 @@ -// test that we can tunnel a https request over an http proxy -// keeping all the CA and whatnot intact. -// -// Note: this requires that squid is installed. -// If the proxy fails to start, we'll just log a warning and assume success. - -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - , fs = require('fs') - , path = require('path') - , caFile = path.resolve(__dirname, 'ssl/npm-ca.crt') - , ca = fs.readFileSync(caFile) - , child_process = require('child_process') - , sqConf = path.resolve(__dirname, 'squid.conf') - , sqArgs = ['-f', sqConf, '-N', '-d', '5'] - , proxy = 'http://localhost:3128' - , hadError = null - -var squid = child_process.spawn('squid', sqArgs); -var ready = false - -squid.stderr.on('data', function (c) { - console.error('SQUIDERR ' + c.toString().trim().split('\n') - .join('\nSQUIDERR ')) - ready = c.toString().match(/ready to serve requests/i) -}) - -squid.stdout.on('data', function (c) { - console.error('SQUIDOUT ' + c.toString().trim().split('\n') - .join('\nSQUIDOUT ')) -}) - -squid.on('exit', function (c) { - console.error('squid: exit '+c) - if (c && !ready) { - console.error('squid must be installed to run this test.') - console.error('skipping this test. please install squid and run again if you need to test tunneling.') - c = null - hadError = null - process.exit(0) - return - } - - if (c) { - hadError = hadError || new Error('Squid exited with '+c) - } - if (hadError) throw hadError -}) - -setTimeout(function F () { - if (!ready) return setTimeout(F, 100) - request({ uri: 'https://registry.npmjs.org/' - , proxy: 'http://localhost:3128' - , strictSSL: true - , ca: ca - , json: true }, function (er, body) { - hadError = er - console.log(er || typeof body) - if (!er) console.log("ok") - squid.kill('SIGKILL') - }) -}, 100) diff --git a/node_modules/nodetime/node_modules/request/tests/unicycle.jpg b/node_modules/nodetime/node_modules/request/tests/unicycle.jpg deleted file mode 100644 index 7cea4dd71dc41cd51c84bfcec6b3e65c15a58507..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19806 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 diff --git a/node_modules/nodetime/node_modules/request/tunnel.js b/node_modules/nodetime/node_modules/request/tunnel.js deleted file mode 100644 index 3f7bbb9..0000000 --- a/node_modules/nodetime/node_modules/request/tunnel.js +++ /dev/null @@ -1,227 +0,0 @@ -'use strict' - -var net = require('net') - , tls = require('tls') - , http = require('http') - , https = require('https') - , events = require('events') - , assert = require('assert') - , util = require('util') - ; - -exports.httpOverHttp = httpOverHttp -exports.httpsOverHttp = httpsOverHttp -exports.httpOverHttps = httpOverHttps -exports.httpsOverHttps = httpsOverHttps - - -function httpOverHttp(options) { - var agent = new TunnelingAgent(options) - agent.request = http.request - return agent -} - -function httpsOverHttp(options) { - var agent = new TunnelingAgent(options) - agent.request = http.request - agent.createSocket = createSecureSocket - return agent -} - -function httpOverHttps(options) { - var agent = new TunnelingAgent(options) - agent.request = https.request - return agent -} - -function httpsOverHttps(options) { - var agent = new TunnelingAgent(options) - agent.request = https.request - agent.createSocket = createSecureSocket - return agent -} - - -function TunnelingAgent(options) { - var self = this - self.options = options || {} - self.proxyOptions = self.options.proxy || {} - self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets - self.requests = [] - self.sockets = [] - - self.on('free', function onFree(socket, host, port) { - for (var i = 0, len = self.requests.length; i < len; ++i) { - var pending = self.requests[i] - if (pending.host === host && pending.port === port) { - // Detect the request to connect same origin server, - // reuse the connection. - self.requests.splice(i, 1) - pending.request.onSocket(socket) - return - } - } - socket.destroy() - self.removeSocket(socket) - }) -} -util.inherits(TunnelingAgent, events.EventEmitter) - -TunnelingAgent.prototype.addRequest = function addRequest(req, host, port) { - var self = this - - if (self.sockets.length >= this.maxSockets) { - // We are over limit so we'll add it to the queue. - self.requests.push({host: host, port: port, request: req}) - return - } - - // If we are under maxSockets create a new one. - self.createSocket({host: host, port: port, request: req}, function(socket) { - socket.on('free', onFree) - socket.on('close', onCloseOrRemove) - socket.on('agentRemove', onCloseOrRemove) - req.onSocket(socket) - - function onFree() { - self.emit('free', socket, host, port) - } - - function onCloseOrRemove(err) { - self.removeSocket() - socket.removeListener('free', onFree) - socket.removeListener('close', onCloseOrRemove) - socket.removeListener('agentRemove', onCloseOrRemove) - } - }) -} - -TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { - var self = this - var placeholder = {} - self.sockets.push(placeholder) - - var connectOptions = mergeOptions({}, self.proxyOptions, - { method: 'CONNECT' - , path: options.host + ':' + options.port - , agent: false - } - ) - if (connectOptions.proxyAuth) { - connectOptions.headers = connectOptions.headers || {} - connectOptions.headers['Proxy-Authorization'] = 'Basic ' + - new Buffer(connectOptions.proxyAuth).toString('base64') - } - - debug('making CONNECT request') - var connectReq = self.request(connectOptions) - connectReq.useChunkedEncodingByDefault = false // for v0.6 - connectReq.once('response', onResponse) // for v0.6 - connectReq.once('upgrade', onUpgrade) // for v0.6 - connectReq.once('connect', onConnect) // for v0.7 or later - connectReq.once('error', onError) - connectReq.end() - - function onResponse(res) { - // Very hacky. This is necessary to avoid http-parser leaks. - res.upgrade = true - } - - function onUpgrade(res, socket, head) { - // Hacky. - process.nextTick(function() { - onConnect(res, socket, head) - }) - } - - function onConnect(res, socket, head) { - connectReq.removeAllListeners() - socket.removeAllListeners() - - if (res.statusCode === 200) { - assert.equal(head.length, 0) - debug('tunneling connection has established') - self.sockets[self.sockets.indexOf(placeholder)] = socket - cb(socket) - } else { - debug('tunneling socket could not be established, statusCode=%d', res.statusCode) - var error = new Error('tunneling socket could not be established, ' + 'statusCode=' + res.statusCode) - error.code = 'ECONNRESET' - options.request.emit('error', error) - self.removeSocket(placeholder) - } - } - - function onError(cause) { - connectReq.removeAllListeners() - - debug('tunneling socket could not be established, cause=%s\n', cause.message, cause.stack) - var error = new Error('tunneling socket could not be established, ' + 'cause=' + cause.message) - error.code = 'ECONNRESET' - options.request.emit('error', error) - self.removeSocket(placeholder) - } -} - -TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { - var pos = this.sockets.indexOf(socket) - if (pos === -1) return - - this.sockets.splice(pos, 1) - - var pending = this.requests.shift() - if (pending) { - // If we have pending requests and a socket gets closed a new one - // needs to be created to take over in the pool for the one that closed. - this.createSocket(pending, function(socket) { - pending.request.onSocket(socket) - }) - } -} - -function createSecureSocket(options, cb) { - var self = this - TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { - // 0 is dummy port for v0.6 - var secureSocket = tls.connect(0, mergeOptions({}, self.options, - { servername: options.host - , socket: socket - } - )) - cb(secureSocket) - }) -} - - -function mergeOptions(target) { - for (var i = 1, len = arguments.length; i < len; ++i) { - var overrides = arguments[i] - if (typeof overrides === 'object') { - var keys = Object.keys(overrides) - for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { - var k = keys[j] - if (overrides[k] !== undefined) { - target[k] = overrides[k] - } - } - } - } - return target -} - - -var debug -if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { - debug = function() { - var args = Array.prototype.slice.call(arguments) - if (typeof args[0] === 'string') { - args[0] = 'TUNNEL: ' + args[0] - } else { - args.unshift('TUNNEL:') - } - console.error.apply(console, args) - } -} else { - debug = function() {} -} -exports.debug = debug // for test diff --git a/node_modules/nodetime/node_modules/request/uuid.js b/node_modules/nodetime/node_modules/request/uuid.js deleted file mode 100644 index fc0588b..0000000 --- a/node_modules/nodetime/node_modules/request/uuid.js +++ /dev/null @@ -1,19 +0,0 @@ -module.exports = function () { - var s = [], itoh = '0123456789ABCDEF' - - // Make array of random hex digits. The UUID only has 32 digits in it, but we - // allocate an extra items to make room for the '-'s we'll be inserting. - for (var i = 0; i <36; i++) s[i] = Math.floor(Math.random()*0x10) - - // Conform to RFC-4122, section 4.4 - s[14] = 4; // Set 4 high bits of time_high field to version - s[19] = (s[19] & 0x3) | 0x8 // Specify 2 high bits of clock sequence - - // Convert to hex chars - for (var i = 0; i <36; i++) s[i] = itoh[s[i]] - - // Insert '-'s - s[8] = s[13] = s[18] = s[23] = '-' - - return s.join('') -} diff --git a/node_modules/nodetime/node_modules/request/vendor/cookie/index.js b/node_modules/nodetime/node_modules/request/vendor/cookie/index.js deleted file mode 100644 index ff44b3e..0000000 --- a/node_modules/nodetime/node_modules/request/vendor/cookie/index.js +++ /dev/null @@ -1,65 +0,0 @@ -/*! - * Tobi - Cookie - * Copyright(c) 2010 LearnBoost - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var url = require('url'); - -/** - * Initialize a new `Cookie` with the given cookie `str` and `req`. - * - * @param {String} str - * @param {IncomingRequest} req - * @api private - */ - -var Cookie = exports = module.exports = function Cookie(str, req) { - this.str = str; - - // Map the key/val pairs - str.split(/ *; */).reduce(function(obj, pair){ - var p = pair.indexOf('='); - var key = p > 0 ? pair.substring(0, p).trim() : pair.trim(); - var lowerCasedKey = key.toLowerCase(); - var value = p > 0 ? pair.substring(p + 1).trim() : true; - - if (!obj.name) { - // First key is the name - obj.name = key; - obj.value = value; - } - else if (lowerCasedKey === 'httponly') { - obj.httpOnly = value; - } - else { - obj[lowerCasedKey] = value; - } - return obj; - }, this); - - // Expires - this.expires = this.expires - ? new Date(this.expires) - : Infinity; - - // Default or trim path - this.path = this.path - ? this.path.trim(): req - ? url.parse(req.url).pathname: '/'; -}; - -/** - * Return the original cookie string. - * - * @return {String} - * @api public - */ - -Cookie.prototype.toString = function(){ - return this.str; -}; diff --git a/node_modules/nodetime/node_modules/request/vendor/cookie/jar.js b/node_modules/nodetime/node_modules/request/vendor/cookie/jar.js deleted file mode 100644 index 34920e0..0000000 --- a/node_modules/nodetime/node_modules/request/vendor/cookie/jar.js +++ /dev/null @@ -1,72 +0,0 @@ -/*! -* Tobi - CookieJar -* Copyright(c) 2010 LearnBoost -* MIT Licensed -*/ - -/** -* Module dependencies. -*/ - -var url = require('url'); - -/** -* Initialize a new `CookieJar`. -* -* @api private -*/ - -var CookieJar = exports = module.exports = function CookieJar() { - this.cookies = []; -}; - -/** -* Add the given `cookie` to the jar. -* -* @param {Cookie} cookie -* @api private -*/ - -CookieJar.prototype.add = function(cookie){ - this.cookies = this.cookies.filter(function(c){ - // Avoid duplication (same path, same name) - return !(c.name == cookie.name && c.path == cookie.path); - }); - this.cookies.push(cookie); -}; - -/** -* Get cookies for the given `req`. -* -* @param {IncomingRequest} req -* @return {Array} -* @api private -*/ - -CookieJar.prototype.get = function(req){ - var path = url.parse(req.url).pathname - , now = new Date - , specificity = {}; - return this.cookies.filter(function(cookie){ - if (0 == path.indexOf(cookie.path) && now < cookie.expires - && cookie.path.length > (specificity[cookie.name] || 0)) - return specificity[cookie.name] = cookie.path.length; - }); -}; - -/** -* Return Cookie string for the given `req`. -* -* @param {IncomingRequest} req -* @return {String} -* @api private -*/ - -CookieJar.prototype.cookieString = function(req){ - var cookies = this.get(req); - if (cookies.length) { - return cookies.map(function(cookie){ - return cookie.name + '=' + cookie.value; - }).join('; '); - } -}; diff --git a/node_modules/nodetime/package.json b/node_modules/nodetime/package.json deleted file mode 100644 index e9e2c8c..0000000 --- a/node_modules/nodetime/package.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "name": "nodetime", - "version": "0.8.10", - "description": "Performance Profiler and Monitor", - "author": { - "name": "Nodetime", - "email": "devops@nodetime.com" - }, - "homepage": "http://nodetime.com", - "keywords": [ - "profiler", - "profiling", - "tracing", - "cpu", - "heap", - "performance", - "instrumentation", - "response time", - "performance", - "bottlenecks", - "monitoring", - "analytics", - "metrics", - "alerts", - "dtrace" - ], - "contributors": [], - "main": "./index.js", - "directories": { - "lib": "./lib" - }, - "repository": { - "type": "git", - "url": "git://github.com/nodetime/nodetime.git" - }, - "dependencies": { - "request": "2.12.0", - "nodetime-native": "0.1.0" - }, - "optionalDependencies": { - "nodetime-native": "0.1.0" - }, - "devDependencies": { - "mocha": "*", - "memwatch": "*", - "async": "*", - "express": "*", - "socket.io": "*", - "redis": "*", - "mongodb": "*", - "mongoose": "*", - "mysql": "*", - "pg": "*", - "memcached": "*", - "memcache": "*", - "cassandra-client": "*", - "cassandra": "*" - }, - "engines": { - "node": ">=0.6.0" - }, - "licenses": [ - { - "url": "http://github.com/nodetime/nodetime/raw/master/LICENSE" - } - ], - "readme": "Nodetime - Performance Profiler and Monitor for Node.js Applications\n===========================================\nNodetime reveals response time and other internals of HTTP requests and underlying HTTP, database, file system and other API calls in your Node.js application. Coupled with related process and OS state information, real-time and historical metrics, monitoring as well as CPU and memory profiling it enables tracing performance problems down to the root cause. Nodetime supports multiple APIs including native HTTP client, file system, cluster and sockets, Socket.io, Redis, MongoDB, MySQL, PostgreSQL, Memcached and Cassandra. HTTP based data stores like CouchDB and Riak are supported via HTTP API.\n\nThis repository contains the source code of Nodetime agent. Agent runs within the application and securely sends profiling data and metrics to Nodetime server, where they are made available via web console at nodetime.com.\n\nFull documentation at [nodetime.com](http://nodetime.com) [Docs section](http://nodetime.com/docs).\n\nFor questions or technical issues please contact our [support team](http://support.nodetime.com).\n\n\n", - "_id": "nodetime@0.8.10", - "_from": "nodetime@0.8.10" -} diff --git a/node_modules/nodetime/publish.sh b/node_modules/nodetime/publish.sh deleted file mode 100755 index 389fac6..0000000 --- a/node_modules/nodetime/publish.sh +++ /dev/null @@ -1,11 +0,0 @@ -TAG=$1 -MSG=$2 - -echo "pushing and publishing $TAG ($MSG)" - -#git add . -#git commit -am "$MSG" -git tag -a "$TAG" -m "$MSG" -git push origin master -git push origin $TAG -npm publish diff --git a/node_modules/timekit/build/config.gypi b/node_modules/timekit/build/config.gypi deleted file mode 100644 index a0a5c0c..0000000 --- a/node_modules/timekit/build/config.gypi +++ /dev/null @@ -1,104 +0,0 @@ -# Do not edit. File was generated by node-gyp's "configure" step -{ - "target_defaults": { - "cflags": [], - "default_configuration": "Release", - "defines": [], - "include_dirs": [], - "libraries": [] - }, - "variables": { - "clang": 0, - "gcc_version": 42, - "host_arch": "x64", - "node_install_npm": "true", - "node_install_waf": "true", - "node_prefix": "out/dist-osx/usr/local", - "node_shared_openssl": "false", - "node_shared_v8": "false", - "node_shared_zlib": "false", - "node_use_dtrace": "false", - "node_use_etw": "false", - "node_use_openssl": "true", - "target_arch": "x64", - "v8_no_strict_aliasing": 1, - "v8_use_snapshot": "false", - "nodedir": "/Users/jfolsom/.node-gyp/0.8.8", - "copy_dev_lib": "true", - "save_dev": "", - "browser": "open", - "viewer": "man", - "rollback": "true", - "usage": "", - "globalignorefile": "/usr/local/etc/npmignore", - "init_author_url": "", - "shell": "/bin/bash", - "parseable": "", - "userignorefile": "/Users/jfolsom/.npmignore", - "cache_max": "null", - "init_author_email": "", - "sign_git_tag": "", - "ignore": "", - "long": "", - "registry": "https://registry.npmjs.org/", - "fetch_retries": "2", - "npat": "", - "message": "%s", - "versions": "", - "globalconfig": "/usr/local/etc/npmrc", - "always_auth": "", - "cache_lock_retries": "10", - "fetch_retry_mintimeout": "10000", - "proprietary_attribs": "true", - "coverage": "", - "json": "", - "pre": "", - "description": "true", - "engine_strict": "", - "https_proxy": "", - "init_module": "/Users/jfolsom/.npm-init.js", - "userconfig": "/Users/jfolsom/.npmrc", - "npaturl": "http://npat.npmjs.org/", - "node_version": "v0.8.8", - "user": "501", - "editor": "vi", - "save": "", - "tag": "latest", - "global": "", - "optional": "true", - "username": "", - "force": "", - "searchopts": "", - "depth": "null", - "rebuild_bundle": "true", - "searchsort": "name", - "unicode": "true", - "yes": "", - "fetch_retry_maxtimeout": "60000", - "ca": "\"-----BEGIN CERTIFICATE-----\\nMIIChzCCAfACCQDauvz/KHp8ejANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMC\\nVVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMQwwCgYDVQQKEwNucG0x\\nIjAgBgNVBAsTGW5wbSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxDjAMBgNVBAMTBW5w\\nbUNBMRcwFQYJKoZIhvcNAQkBFghpQGl6cy5tZTAeFw0xMTA5MDUwMTQ3MTdaFw0y\\nMTA5MDIwMTQ3MTdaMIGHMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNV\\nBAcTB09ha2xhbmQxDDAKBgNVBAoTA25wbTEiMCAGA1UECxMZbnBtIENlcnRpZmlj\\nYXRlIEF1dGhvcml0eTEOMAwGA1UEAxMFbnBtQ0ExFzAVBgkqhkiG9w0BCQEWCGlA\\naXpzLm1lMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLI4tIqPpRW+ACw9GE\\nOgBlJZwK5f8nnKCLK629Pv5yJpQKs3DENExAyOgDcyaF0HD0zk8zTp+ZsLaNdKOz\\nGn2U181KGprGKAXP6DU6ByOJDWmTlY6+Ad1laYT0m64fERSpHw/hjD3D+iX4aMOl\\ny0HdbT5m1ZGh6SJz3ZqxavhHLQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAC4ySDbC\\nl7W1WpLmtLGEQ/yuMLUf6Jy/vr+CRp4h+UzL+IQpCv8FfxsYE7dhf/bmWTEupBkv\\nyNL18lipt2jSvR3v6oAHAReotvdjqhxddpe5Holns6EQd1/xEZ7sB1YhQKJtvUrl\\nZNufy1Jf1r0ldEGeA+0ISck7s+xSh9rQD2Op\\n-----END CERTIFICATE-----\\n\"", - "strict_ssl": "true", - "dev": "", - "fetch_retry_factor": "10", - "group": "20", - "cache_lock_stale": "60000", - "version": "", - "cache_min": "", - "cache": "/Users/jfolsom/.npm", - "searchexclude": "", - "color": "true", - "save_optional": "", - "user_agent": "node/v0.8.8", - "cache_lock_wait": "10000", - "production": "", - "save_bundle": "", - "init_version": "0.0.0", - "umask": "18", - "git": "git", - "init_author_name": "", - "onload_script": "", - "tmp": "/Users/jfolsom/tmp", - "unsafe_perm": "", - "link": "", - "prefix": "/usr/local" - } -} diff --git a/node_modules/timekit/node_modules/bindings/bindings.js b/node_modules/timekit/node_modules/bindings/bindings.js deleted file mode 100644 index 2f04804..0000000 --- a/node_modules/timekit/node_modules/bindings/bindings.js +++ /dev/null @@ -1,155 +0,0 @@ - -/** - * Module dependencies. - */ - -var fs = require('fs') - , path = require('path') - , join = path.join - , dirname = path.dirname - , exists = fs.existsSync || path.existsSync - , defaults = { - arrow: process.env.NODE_BINDINGS_ARROW || ' → ' - , compiled: process.env.NODE_BINDINGS_COMPILED_DIR || 'compiled' - , platform: process.platform - , arch: process.arch - , version: process.versions.node - , bindings: 'bindings.node' - , try: [ - // node-gyp's linked version in the "build" dir - [ 'module_root', 'build', 'bindings' ] - // node-waf and gyp_addon (a.k.a node-gyp) - , [ 'module_root', 'build', 'Debug', 'bindings' ] - , [ 'module_root', 'build', 'Release', 'bindings' ] - // Debug files, for development (legacy behavior, remove for node v0.9) - , [ 'module_root', 'out', 'Debug', 'bindings' ] - , [ 'module_root', 'Debug', 'bindings' ] - // Release files, but manually compiled (legacy behavior, remove for node v0.9) - , [ 'module_root', 'out', 'Release', 'bindings' ] - , [ 'module_root', 'Release', 'bindings' ] - // Legacy from node-waf, node <= 0.4.x - , [ 'module_root', 'build', 'default', 'bindings' ] - // Production "Release" buildtype binary (meh...) - , [ 'module_root', 'compiled', 'version', 'platform', 'arch', 'bindings' ] - ] - } - -/** - * The main `bindings()` function loads the compiled bindings for a given module. - * It uses V8's Error API to determine the parent filename that this function is - * being invoked from, which is then used to find the root directory. - */ - -function bindings (opts) { - - // Argument surgery - if (typeof opts == 'string') { - opts = { bindings: opts } - } else if (!opts) { - opts = {} - } - opts.__proto__ = defaults - - // Get the module root - if (!opts.module_root) { - opts.module_root = exports.getRoot(exports.getFileName()) - } - - // Ensure the given bindings name ends with .node - if (path.extname(opts.bindings) != '.node') { - opts.bindings += '.node' - } - - var tries = [] - , i = 0 - , l = opts.try.length - , n - , b - , err - - for (; i (/Users/nrajlich/ref/lib/ref.js:5:47)\n at Module._compile (module.js:449:26)\n at Object.Module._extensions..js (module.js:467:10)\n at Module.load (module.js:356:32)\n at Function.Module._load (module.js:312:12)\n ...\n```\n\n\nLicense\n-------\n\n(The MIT License)\n\nCopyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", - "_id": "bindings@1.1.0", - "_from": "bindings@*" -} diff --git a/node_modules/timekit/package.json b/node_modules/timekit/package.json deleted file mode 100644 index 8724bf9..0000000 --- a/node_modules/timekit/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "timekit", - "version": "0.1.9", - "description": "Time related C bindings", - "author": { - "name": "Dmitri Melikyan", - "email": "dmitri@rapidlogix.com" - }, - "keywords": [ - "time", - "cpu time", - "gettimeofday", - "getrusage", - "microseconds", - "posix", - "windows" - ], - "contributors": [], - "main": "./index.js", - "dependencies": { - "bindings": "*" - }, - "repository": { - "type": "git", - "url": "git://github.com/dmelikyan/node-timekit.git" - }, - "engines": { - "node": ">=0.6.0" - }, - "licenses": [ - { - "type": "MIT", - "url": "http://github.com/dmelikyan/node-timekit/raw/master/LICENSE" - } - ], - "scripts": { - "install": "node-gyp rebuild" - }, - "gypfile": true, - "readme": "Timekit - Time Related C Bindings\n===\n\n\n## Installation\n\n npm install timekit\n\n\n## API\n\n`var timekit = require('timekit');`\n\n`timekit.time()` - uses gettimeofday and returns current time in microseconds. In case of error returns undefined. On Windows uses GetSystemTimeAsFileTime.\n\n`timekit.cputime()` - uses getrusage and returns cpu time spent on current process (user + system) in microseconds. In case of error returns undefined. On Windows uses GetProcessTimes.\n\n\n## Platforms\n\nPOSIX and Windows\n\n\n## License\n\nCopyright (c) 2012 Dmitri Melikyan\n\nPermission 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:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE 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.\n", - "_id": "timekit@0.1.9", - "_from": "timekit@0.1.9" -} diff --git a/node_modules/v8tools/.npmignore b/node_modules/v8tools/.npmignore deleted file mode 100644 index db470e2..0000000 --- a/node_modules/v8tools/.npmignore +++ /dev/null @@ -1,7 +0,0 @@ -.git* -test/ -.DS_Store -node_modules/ -npm-debug.log -build -.lock-wscript diff --git a/node_modules/v8tools/LICENSE b/node_modules/v8tools/LICENSE deleted file mode 100644 index 3959a05..0000000 --- a/node_modules/v8tools/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2012 Dmitri Melikyan - -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. diff --git a/node_modules/v8tools/README.md b/node_modules/v8tools/README.md deleted file mode 100644 index 31d8d6d..0000000 --- a/node_modules/v8tools/README.md +++ /dev/null @@ -1,37 +0,0 @@ -V8tools - V8 CPU Profiler Binding -=== - - -## Installation - - npm install v8tools - - -## API - -`var v8tools = require('v8tools');` - -`v8tools.afterGC(v8tools.afterGC(function(gcType, gcFlags, usedHeapSize) {})` - calls the callback after garbage collection cycle. - -`v8tools.startV8Profiler()` - starts V8 CPU profiler - -`v8tools.stopV8Profiler(function(parentNodeUid, nodeUid, totalSamplesCount, functionName, scriptResourceName, lineNumber) {})` - stops V8 CPU profiler. Callback function is called on every node while walking profile's top down call tree. - -`heapprof.takeHeapSnapshot(function(parentNodeUid, nodeUid, name, type, selfSize, retainerName, retainerType) {})` - takes heap snapshot. Callback function is called on every node of heap node graph. - - - -## Platforms - -POSIX and Windows - - -## License - -Copyright (c) 2012 Dmitri Melikyan - -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. diff --git a/node_modules/v8tools/binding.gyp b/node_modules/v8tools/binding.gyp deleted file mode 100644 index afd2ab3..0000000 --- a/node_modules/v8tools/binding.gyp +++ /dev/null @@ -1,14 +0,0 @@ -{ - 'targets': [ - { - 'target_name': 'v8tools', - 'sources': [ - 'src/v8tools.cc', - 'src/gc.cc', - 'src/gc.h', - 'src/profiler.cc', - 'src/profiler.h' - ] - } - ] -} diff --git a/node_modules/v8tools/build/Makefile b/node_modules/v8tools/build/Makefile deleted file mode 100644 index 35dd5df..0000000 --- a/node_modules/v8tools/build/Makefile +++ /dev/null @@ -1,359 +0,0 @@ -# We borrow heavily from the kernel build setup, though we are simpler since -# we don't have Kconfig tweaking settings on us. - -# The implicit make rules have it looking for RCS files, among other things. -# We instead explicitly write all the rules we care about. -# It's even quicker (saves ~200ms) to pass -r on the command line. -MAKEFLAGS=-r - -# The source directory tree. -srcdir := .. -abs_srcdir := $(abspath $(srcdir)) - -# The name of the builddir. -builddir_name ?= . - -# The V=1 flag on command line makes us verbosely print command lines. -ifdef V - quiet= -else - quiet=quiet_ -endif - -# Specify BUILDTYPE=Release on the command line for a release build. -BUILDTYPE ?= Release - -# Directory all our build output goes into. -# Note that this must be two directories beneath src/ for unit tests to pass, -# as they reach into the src/ directory for data with relative paths. -builddir ?= $(builddir_name)/$(BUILDTYPE) -abs_builddir := $(abspath $(builddir)) -depsdir := $(builddir)/.deps - -# Object output directory. -obj := $(builddir)/obj -abs_obj := $(abspath $(obj)) - -# We build up a list of every single one of the targets so we can slurp in the -# generated dependency rule Makefiles in one pass. -all_deps := - - - -# C++ apps need to be linked with g++. -# -# Note: flock is used to seralize linking. Linking is a memory-intensive -# process so running parallel links can often lead to thrashing. To disable -# the serialization, override LINK via an envrionment variable as follows: -# -# export LINK=g++ -# -# This will allow make to invoke N linker processes as specified in -jN. -LINK ?= ./gyp-mac-tool flock $(builddir)/linker.lock $(CXX) - -CC.target ?= $(CC) -CFLAGS.target ?= $(CFLAGS) -CXX.target ?= $(CXX) -CXXFLAGS.target ?= $(CXXFLAGS) -LINK.target ?= $(LINK) -LDFLAGS.target ?= $(LDFLAGS) -AR.target ?= $(AR) -ARFLAGS.target ?= crs - -# N.B.: the logic of which commands to run should match the computation done -# in gyp's make.py where ARFLAGS.host etc. is computed. -# TODO(evan): move all cross-compilation logic to gyp-time so we don't need -# to replicate this environment fallback in make as well. -CC.host ?= gcc -CFLAGS.host ?= -CXX.host ?= g++ -CXXFLAGS.host ?= -LINK.host ?= g++ -LDFLAGS.host ?= -AR.host ?= ar -ARFLAGS.host := crs - -# Define a dir function that can handle spaces. -# http://www.gnu.org/software/make/manual/make.html#Syntax-of-Functions -# "leading spaces cannot appear in the text of the first argument as written. -# These characters can be put into the argument value by variable substitution." -empty := -space := $(empty) $(empty) - -# http://stackoverflow.com/questions/1189781/using-make-dir-or-notdir-on-a-path-with-spaces -replace_spaces = $(subst $(space),?,$1) -unreplace_spaces = $(subst ?,$(space),$1) -dirx = $(call unreplace_spaces,$(dir $(call replace_spaces,$1))) - -# Flags to make gcc output dependency info. Note that you need to be -# careful here to use the flags that ccache and distcc can understand. -# We write to a dep file on the side first and then rename at the end -# so we can't end up with a broken dep file. -depfile = $(depsdir)/$(call replace_spaces,$@).d -DEPFLAGS = -MMD -MF $(depfile).raw - -# We have to fixup the deps output in a few ways. -# (1) the file output should mention the proper .o file. -# ccache or distcc lose the path to the target, so we convert a rule of -# the form: -# foobar.o: DEP1 DEP2 -# into -# path/to/foobar.o: DEP1 DEP2 -# (2) we want missing files not to cause us to fail to build. -# We want to rewrite -# foobar.o: DEP1 DEP2 \ -# DEP3 -# to -# DEP1: -# DEP2: -# DEP3: -# so if the files are missing, they're just considered phony rules. -# We have to do some pretty insane escaping to get those backslashes -# and dollar signs past make, the shell, and sed at the same time. -# Doesn't work with spaces, but that's fine: .d files have spaces in -# their names replaced with other characters. -define fixup_dep -# The depfile may not exist if the input file didn't have any #includes. -touch $(depfile).raw -# Fixup path as in (1). -sed -e "s|^$(notdir $@)|$@|" $(depfile).raw >> $(depfile) -# Add extra rules as in (2). -# We remove slashes and replace spaces with new lines; -# remove blank lines; -# delete the first line and append a colon to the remaining lines. -sed -e 's|\\||' -e 'y| |\n|' $(depfile).raw |\ - grep -v '^$$' |\ - sed -e 1d -e 's|$$|:|' \ - >> $(depfile) -rm $(depfile).raw -endef - -# Command definitions: -# - cmd_foo is the actual command to run; -# - quiet_cmd_foo is the brief-output summary of the command. - -quiet_cmd_cc = CC($(TOOLSET)) $@ -cmd_cc = $(CC.$(TOOLSET)) $(GYP_CFLAGS) $(DEPFLAGS) $(CFLAGS.$(TOOLSET)) -c -o $@ $< - -quiet_cmd_cxx = CXX($(TOOLSET)) $@ -cmd_cxx = $(CXX.$(TOOLSET)) $(GYP_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< - -quiet_cmd_objc = CXX($(TOOLSET)) $@ -cmd_objc = $(CC.$(TOOLSET)) $(GYP_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< - -quiet_cmd_objcxx = CXX($(TOOLSET)) $@ -cmd_objcxx = $(CXX.$(TOOLSET)) $(GYP_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< - -# Commands for precompiled header files. -quiet_cmd_pch_c = CXX($(TOOLSET)) $@ -cmd_pch_c = $(CC.$(TOOLSET)) $(GYP_PCH_CFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< -quiet_cmd_pch_cc = CXX($(TOOLSET)) $@ -cmd_pch_cc = $(CC.$(TOOLSET)) $(GYP_PCH_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< -quiet_cmd_pch_m = CXX($(TOOLSET)) $@ -cmd_pch_m = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< -quiet_cmd_pch_mm = CXX($(TOOLSET)) $@ -cmd_pch_mm = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< - -# gyp-mac-tool is written next to the root Makefile by gyp. -# Use $(4) for the command, since $(2) and $(3) are used as flag by do_cmd -# already. -quiet_cmd_mac_tool = MACTOOL $(4) $< -cmd_mac_tool = ./gyp-mac-tool $(4) $< "$@" - -quiet_cmd_mac_package_framework = PACKAGE FRAMEWORK $@ -cmd_mac_package_framework = ./gyp-mac-tool package-framework "$@" $(4) - -quiet_cmd_infoplist = INFOPLIST $@ -cmd_infoplist = $(CC.$(TOOLSET)) -E -P -Wno-trigraphs -x c $(INFOPLIST_DEFINES) "$<" -o "$@" - -quiet_cmd_touch = TOUCH $@ -cmd_touch = touch $@ - -quiet_cmd_copy = COPY $@ -# send stderr to /dev/null to ignore messages when linking directories. -cmd_copy = ln -f "$<" "$@" 2>/dev/null || (rm -rf "$@" && cp -af "$<" "$@") - -quiet_cmd_alink = LIBTOOL-STATIC $@ -cmd_alink = rm -f $@ && ./gyp-mac-tool filter-libtool libtool -static -o $@ $(filter %.o,$^) - -quiet_cmd_link = LINK($(TOOLSET)) $@ -cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) - -# TODO(thakis): Find out and document the difference between shared_library and -# loadable_module on mac. -quiet_cmd_solink = SOLINK($(TOOLSET)) $@ -cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) - -# TODO(thakis): The solink_module rule is likely wrong. Xcode seems to pass -# -bundle -single_module here (for osmesa.so). -quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@ -cmd_solink_module = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS) - - -# Define an escape_quotes function to escape single quotes. -# This allows us to handle quotes properly as long as we always use -# use single quotes and escape_quotes. -escape_quotes = $(subst ','\'',$(1)) -# This comment is here just to include a ' to unconfuse syntax highlighting. -# Define an escape_vars function to escape '$' variable syntax. -# This allows us to read/write command lines with shell variables (e.g. -# $LD_LIBRARY_PATH), without triggering make substitution. -escape_vars = $(subst $$,$$$$,$(1)) -# Helper that expands to a shell command to echo a string exactly as it is in -# make. This uses printf instead of echo because printf's behaviour with respect -# to escape sequences is more portable than echo's across different shells -# (e.g., dash, bash). -exact_echo = printf '%s\n' '$(call escape_quotes,$(1))' - -# Helper to compare the command we're about to run against the command -# we logged the last time we ran the command. Produces an empty -# string (false) when the commands match. -# Tricky point: Make has no string-equality test function. -# The kernel uses the following, but it seems like it would have false -# positives, where one string reordered its arguments. -# arg_check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \ -# $(filter-out $(cmd_$@), $(cmd_$(1)))) -# We instead substitute each for the empty string into the other, and -# say they're equal if both substitutions produce the empty string. -# .d files contain ? instead of spaces, take that into account. -command_changed = $(or $(subst $(cmd_$(1)),,$(cmd_$(call replace_spaces,$@))),\ - $(subst $(cmd_$(call replace_spaces,$@)),,$(cmd_$(1)))) - -# Helper that is non-empty when a prerequisite changes. -# Normally make does this implicitly, but we force rules to always run -# so we can check their command lines. -# $? -- new prerequisites -# $| -- order-only dependencies -prereq_changed = $(filter-out FORCE_DO_CMD,$(filter-out $|,$?)) - -# Helper that executes all postbuilds, and deletes the output file when done -# if any of the postbuilds failed. -define do_postbuilds - @E=0;\ - for p in $(POSTBUILDS); do\ - eval $$p;\ - F=$$?;\ - if [ $$F -ne 0 ]; then\ - E=$$F;\ - fi;\ - done;\ - if [ $$E -ne 0 ]; then\ - rm -rf "$@";\ - exit $$E;\ - fi -endef - -# do_cmd: run a command via the above cmd_foo names, if necessary. -# Should always run for a given target to handle command-line changes. -# Second argument, if non-zero, makes it do asm/C/C++ dependency munging. -# Third argument, if non-zero, makes it do POSTBUILDS processing. -# Note: We intentionally do NOT call dirx for depfile, since it contains ? for -# spaces already and dirx strips the ? characters. -define do_cmd -$(if $(or $(command_changed),$(prereq_changed)), - @$(call exact_echo, $($(quiet)cmd_$(1))) - @mkdir -p "$(call dirx,$@)" "$(dir $(depfile))" - $(if $(findstring flock,$(word 2,$(cmd_$1))), - @$(cmd_$(1)) - @echo " $(quiet_cmd_$(1)): Finished", - @$(cmd_$(1)) - ) - @$(call exact_echo,$(call escape_vars,cmd_$(call replace_spaces,$@) := $(cmd_$(1)))) > $(depfile) - @$(if $(2),$(fixup_dep)) - $(if $(and $(3), $(POSTBUILDS)), - $(call do_postbuilds) - ) -) -endef - -# Declare the "all" target first so it is the default, -# even though we don't have the deps yet. -.PHONY: all -all: - -# make looks for ways to re-generate included makefiles, but in our case, we -# don't have a direct way. Explicitly telling make that it has nothing to do -# for them makes it go faster. -%.d: ; - -# Use FORCE_DO_CMD to force a target to run. Should be coupled with -# do_cmd. -.PHONY: FORCE_DO_CMD -FORCE_DO_CMD: - -TOOLSET := target -# Suffix rules, putting all outputs into $(obj). -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.c FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cpp FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cxx FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.m FORCE_DO_CMD - @$(call do_cmd,objc,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.mm FORCE_DO_CMD - @$(call do_cmd,objcxx,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.S FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(srcdir)/%.s FORCE_DO_CMD - @$(call do_cmd,cc,1) - -# Try building from generated source, too. -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.c FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cpp FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cxx FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.m FORCE_DO_CMD - @$(call do_cmd,objc,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.mm FORCE_DO_CMD - @$(call do_cmd,objcxx,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.S FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.s FORCE_DO_CMD - @$(call do_cmd,cc,1) - -$(obj).$(TOOLSET)/%.o: $(obj)/%.c FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.cpp FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.cxx FORCE_DO_CMD - @$(call do_cmd,cxx,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.m FORCE_DO_CMD - @$(call do_cmd,objc,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.mm FORCE_DO_CMD - @$(call do_cmd,objcxx,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.S FORCE_DO_CMD - @$(call do_cmd,cc,1) -$(obj).$(TOOLSET)/%.o: $(obj)/%.s FORCE_DO_CMD - @$(call do_cmd,cc,1) - - -ifeq ($(strip $(foreach prefix,$(NO_LOAD),\ - $(findstring $(join ^,$(prefix)),\ - $(join ^,v8tools.target.mk)))),) - include v8tools.target.mk -endif - -quiet_cmd_regen_makefile = ACTION Regenerating $@ -cmd_regen_makefile = /Users/jfolsom/.node-gyp/0.8.8/tools/gyp/gyp -fmake --ignore-environment "--toplevel-dir=." -I/Users/jfolsom/repos/ana/node_modules/v8tools/build/config.gypi -I/usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi -I/Users/jfolsom/.node-gyp/0.8.8/common.gypi "--depth=." "-Goutput_dir=." "--generator-output=build" "-Dlibrary=shared_library" "-Dvisibility=default" "-Dnode_root_dir=/Users/jfolsom/.node-gyp/0.8.8" "-Dmodule_root_dir=/Users/jfolsom/repos/ana/node_modules/v8tools" binding.gyp -Makefile: $(srcdir)/../../../../.node-gyp/0.8.8/common.gypi $(srcdir)/build/config.gypi $(srcdir)/binding.gyp $(srcdir)/../../../../../../usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi - $(call do_cmd,regen_makefile) - -# "all" is a concatenation of the "all" targets from all the included -# sub-makefiles. This is just here to clarify. -all: - -# Add in dependency-tracking rules. $(all_deps) is the list of every single -# target in our tree. Only consider the ones with .d (dependency) info: -d_files := $(wildcard $(foreach f,$(all_deps),$(depsdir)/$(f).d)) -ifneq ($(d_files),) - include $(d_files) -endif diff --git a/node_modules/v8tools/build/Release/.deps/Release/obj.target/v8tools/src/gc.o.d b/node_modules/v8tools/build/Release/.deps/Release/obj.target/v8tools/src/gc.o.d deleted file mode 100644 index 76cffa4..0000000 --- a/node_modules/v8tools/build/Release/.deps/Release/obj.target/v8tools/src/gc.o.d +++ /dev/null @@ -1,30 +0,0 @@ -cmd_Release/obj.target/v8tools/src/gc.o := c++ '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-D_DARWIN_USE_64_BIT_INODE=1' -I/Users/jfolsom/.node-gyp/0.8.8/src -I/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include -I/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include -Os -gdwarf-2 -mmacosx-version-min=10.5 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-rtti -fno-exceptions -fno-threadsafe-statics -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/v8tools/src/gc.o.d.raw -c -o Release/obj.target/v8tools/src/gc.o ../src/gc.cc -Release/obj.target/v8tools/src/gc.o: ../src/gc.cc ../src/gc.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/node.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares_version.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/uv-unix.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ngx-queue.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ev.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/eio.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/node_object_wrap.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/ev-emul.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/eio-emul.h -../src/gc.cc: -../src/gc.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h: -/Users/jfolsom/.node-gyp/0.8.8/src/node.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares_version.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/uv-unix.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ngx-queue.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ev.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/eio.h: -/Users/jfolsom/.node-gyp/0.8.8/src/node_object_wrap.h: -/Users/jfolsom/.node-gyp/0.8.8/src/ev-emul.h: -/Users/jfolsom/.node-gyp/0.8.8/src/eio-emul.h: diff --git a/node_modules/v8tools/build/Release/.deps/Release/obj.target/v8tools/src/profiler.o.d b/node_modules/v8tools/build/Release/.deps/Release/obj.target/v8tools/src/profiler.o.d deleted file mode 100644 index f67e9a6..0000000 --- a/node_modules/v8tools/build/Release/.deps/Release/obj.target/v8tools/src/profiler.o.d +++ /dev/null @@ -1,11 +0,0 @@ -cmd_Release/obj.target/v8tools/src/profiler.o := c++ '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-D_DARWIN_USE_64_BIT_INODE=1' -I/Users/jfolsom/.node-gyp/0.8.8/src -I/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include -I/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include -Os -gdwarf-2 -mmacosx-version-min=10.5 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-rtti -fno-exceptions -fno-threadsafe-statics -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/v8tools/src/profiler.o.d.raw -c -o Release/obj.target/v8tools/src/profiler.o ../src/profiler.cc -Release/obj.target/v8tools/src/profiler.o: ../src/profiler.cc \ - /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8-profiler.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h \ - ../src/profiler.h -../src/profiler.cc: -/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8-profiler.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h: -../src/profiler.h: diff --git a/node_modules/v8tools/build/Release/.deps/Release/obj.target/v8tools/src/v8tools.o.d b/node_modules/v8tools/build/Release/.deps/Release/obj.target/v8tools/src/v8tools.o.d deleted file mode 100644 index 3512090..0000000 --- a/node_modules/v8tools/build/Release/.deps/Release/obj.target/v8tools/src/v8tools.o.d +++ /dev/null @@ -1,32 +0,0 @@ -cmd_Release/obj.target/v8tools/src/v8tools.o := c++ '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-D_DARWIN_USE_64_BIT_INODE=1' -I/Users/jfolsom/.node-gyp/0.8.8/src -I/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include -I/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include -Os -gdwarf-2 -mmacosx-version-min=10.5 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-rtti -fno-exceptions -fno-threadsafe-statics -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/v8tools/src/v8tools.o.d.raw -c -o Release/obj.target/v8tools/src/v8tools.o ../src/v8tools.cc -Release/obj.target/v8tools/src/v8tools.o: ../src/v8tools.cc \ - /Users/jfolsom/.node-gyp/0.8.8/src/node.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares_version.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/uv-unix.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ngx-queue.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ev.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/eio.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h \ - /Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/node_object_wrap.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/ev-emul.h \ - /Users/jfolsom/.node-gyp/0.8.8/src/eio-emul.h ../src/gc.h \ - ../src/profiler.h -../src/v8tools.cc: -/Users/jfolsom/.node-gyp/0.8.8/src/node.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/ares_version.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/uv-unix.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ngx-queue.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/ev.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include/uv-private/eio.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8.h: -/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include/v8stdint.h: -/Users/jfolsom/.node-gyp/0.8.8/src/node_object_wrap.h: -/Users/jfolsom/.node-gyp/0.8.8/src/ev-emul.h: -/Users/jfolsom/.node-gyp/0.8.8/src/eio-emul.h: -../src/gc.h: -../src/profiler.h: diff --git a/node_modules/v8tools/build/Release/.deps/Release/v8tools.node.d b/node_modules/v8tools/build/Release/.deps/Release/v8tools.node.d deleted file mode 100644 index c7b7c18..0000000 --- a/node_modules/v8tools/build/Release/.deps/Release/v8tools.node.d +++ /dev/null @@ -1 +0,0 @@ -cmd_Release/v8tools.node := ./gyp-mac-tool flock ./Release/linker.lock c++ -shared -Wl,-search_paths_first -mmacosx-version-min=10.5 -arch x86_64 -L./Release -install_name /usr/local/lib/v8tools.node -o Release/v8tools.node Release/obj.target/v8tools/src/v8tools.o Release/obj.target/v8tools/src/gc.o Release/obj.target/v8tools/src/profiler.o -undefined dynamic_lookup diff --git a/node_modules/v8tools/build/Release/linker.lock b/node_modules/v8tools/build/Release/linker.lock deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/v8tools/build/Release/obj.target/v8tools/src/gc.o b/node_modules/v8tools/build/Release/obj.target/v8tools/src/gc.o deleted file mode 100644 index f807925a73a7e7168a1cacc124ae64d7a4ef0eb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70968 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
      cf9_o%sOb~8 znEc$^LVjAIHhT2h8?GrIXXQ7{vQGDHL%+~>IlKJP-R|^P9n-G|L?HPfe)5T4@2|_> zZ}5kyuUx*O>#DU&SNV77(&6LIa>-33<4z{!c=^V5$%ZVN-M29LWsSJ$z@QrqUB`_4GtEgg zzSBo}CM5R+9GuYJHN~I$E~N0!AS5~sw!kys^unCEUCZJQKvTbX1ItHM*~W7G8=uk4 H$SM2}M^-l5 diff --git a/node_modules/v8tools/build/Release/obj.target/v8tools/src/profiler.o b/node_modules/v8tools/build/Release/obj.target/v8tools/src/profiler.o deleted file mode 100644 index 426e4253dce5f1378b58a4feebbf9659d879dd92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56832 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

      iT~8^NZN15}BpaE4H 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 Hi@*N^Qi(VS diff --git a/node_modules/v8tools/build/Release/obj.target/v8tools/src/v8tools.o b/node_modules/v8tools/build/Release/obj.target/v8tools/src/v8tools.o deleted file mode 100644 index 35120eedf49f92fb2bd753060a11a315c4afde1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40288 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 z z6`a_QG{+Wa71EL5#IsDg4e7DLaxywgV2(iKMk=E^EjeOxNQ(Xl1doxZ)uCJx-X+Tx zeG$;e{=h7ENb14t3uqfLNed&&P6IgLJW^KC$i9aL72PmH`V zUH^zCi2ejLe@1W~FEjJ(J+d6Lk&%b6>U|K+nhCrwhtrlJyEqVd?AE1ot02!dnWbQH2dNDRr5q%a(>Bi<6ikLL0ZyBqye48cqIZLHw zzD(gqAu|wujn@f($JJE$r(i9t@L)aYd=)MsF;a_36La)IJLsai`kX_-U zrMM|8fXG+4%A-09psH{RXQe3W>MMXy74An&W~OQccn2hbaG;jg@w}EDi}_N(X?LPO zU8t?sWHW3tedFpfTfo@JaF zFm42#JrQ>T9_=<0rRyVRqU26kV{)PqojC&|D}r-NL_3zqyQ(=v z;_&_m&Rr3fPC{cYyNLD!cLnkHMD*<5a9#)KOT_%r!zpKI(boZchj)a!Yah<*r2J*?rp6EU@@)RzsYoQ87V1w+ti+zv?N z96;a8LuF0wZSipwm=@0k<3}FGy(~VC1N}klf&cE|*~{W%E$DA0Pf*T6?aFW`*yF0O zhrxCsCTvEJH*R|-Tt}hXo-G}UcZMnj*YcXnaE;XL!L>q^U55+;&h=sU@m=(lQF_U9W7ssL zjd09*Qp?t))<)42M{B}cEkbS}DPI`95;SihIQLpKQjSO1dmx%p3Bvos#(Cs(#U3$G z68&ontv0LbfX8<-xo!904=uw{$Qc0TFIU$qWe^#6Cyb8gik2b*I{0jHt}uudt0F&?OclIQz;aNFJqI+!4T?LVQix z!HDurL9u@wuwM{8(`F~Ni2e@Oss`X^S(Z>uWd=|u5*;s!&H{Bg(X%bIY75r`^%tTK zu+U2Q_(mbVh~Uh(O0Lj+P3&Hx8;hc!C8`Ob*)Lo~rvlnW%pn%0Dh=p4#4O8OLqsnJ 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 diff --git a/node_modules/v8tools/build/binding.Makefile b/node_modules/v8tools/build/binding.Makefile deleted file mode 100644 index 1be93dc..0000000 --- a/node_modules/v8tools/build/binding.Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# This file is generated by gyp; do not edit. - -export builddir_name ?= build/./. -.PHONY: all -all: - $(MAKE) v8tools diff --git a/node_modules/v8tools/build/config.gypi b/node_modules/v8tools/build/config.gypi deleted file mode 100644 index a0a5c0c..0000000 --- a/node_modules/v8tools/build/config.gypi +++ /dev/null @@ -1,104 +0,0 @@ -# Do not edit. File was generated by node-gyp's "configure" step -{ - "target_defaults": { - "cflags": [], - "default_configuration": "Release", - "defines": [], - "include_dirs": [], - "libraries": [] - }, - "variables": { - "clang": 0, - "gcc_version": 42, - "host_arch": "x64", - "node_install_npm": "true", - "node_install_waf": "true", - "node_prefix": "out/dist-osx/usr/local", - "node_shared_openssl": "false", - "node_shared_v8": "false", - "node_shared_zlib": "false", - "node_use_dtrace": "false", - "node_use_etw": "false", - "node_use_openssl": "true", - "target_arch": "x64", - "v8_no_strict_aliasing": 1, - "v8_use_snapshot": "false", - "nodedir": "/Users/jfolsom/.node-gyp/0.8.8", - "copy_dev_lib": "true", - "save_dev": "", - "browser": "open", - "viewer": "man", - "rollback": "true", - "usage": "", - "globalignorefile": "/usr/local/etc/npmignore", - "init_author_url": "", - "shell": "/bin/bash", - "parseable": "", - "userignorefile": "/Users/jfolsom/.npmignore", - "cache_max": "null", - "init_author_email": "", - "sign_git_tag": "", - "ignore": "", - "long": "", - "registry": "https://registry.npmjs.org/", - "fetch_retries": "2", - "npat": "", - "message": "%s", - "versions": "", - "globalconfig": "/usr/local/etc/npmrc", - "always_auth": "", - "cache_lock_retries": "10", - "fetch_retry_mintimeout": "10000", - "proprietary_attribs": "true", - "coverage": "", - "json": "", - "pre": "", - "description": "true", - "engine_strict": "", - "https_proxy": "", - "init_module": "/Users/jfolsom/.npm-init.js", - "userconfig": "/Users/jfolsom/.npmrc", - "npaturl": "http://npat.npmjs.org/", - "node_version": "v0.8.8", - "user": "501", - "editor": "vi", - "save": "", - "tag": "latest", - "global": "", - "optional": "true", - "username": "", - "force": "", - "searchopts": "", - "depth": "null", - "rebuild_bundle": "true", - "searchsort": "name", - "unicode": "true", - "yes": "", - "fetch_retry_maxtimeout": "60000", - "ca": "\"-----BEGIN CERTIFICATE-----\\nMIIChzCCAfACCQDauvz/KHp8ejANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMC\\nVVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMQwwCgYDVQQKEwNucG0x\\nIjAgBgNVBAsTGW5wbSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxDjAMBgNVBAMTBW5w\\nbUNBMRcwFQYJKoZIhvcNAQkBFghpQGl6cy5tZTAeFw0xMTA5MDUwMTQ3MTdaFw0y\\nMTA5MDIwMTQ3MTdaMIGHMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNV\\nBAcTB09ha2xhbmQxDDAKBgNVBAoTA25wbTEiMCAGA1UECxMZbnBtIENlcnRpZmlj\\nYXRlIEF1dGhvcml0eTEOMAwGA1UEAxMFbnBtQ0ExFzAVBgkqhkiG9w0BCQEWCGlA\\naXpzLm1lMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLI4tIqPpRW+ACw9GE\\nOgBlJZwK5f8nnKCLK629Pv5yJpQKs3DENExAyOgDcyaF0HD0zk8zTp+ZsLaNdKOz\\nGn2U181KGprGKAXP6DU6ByOJDWmTlY6+Ad1laYT0m64fERSpHw/hjD3D+iX4aMOl\\ny0HdbT5m1ZGh6SJz3ZqxavhHLQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAC4ySDbC\\nl7W1WpLmtLGEQ/yuMLUf6Jy/vr+CRp4h+UzL+IQpCv8FfxsYE7dhf/bmWTEupBkv\\nyNL18lipt2jSvR3v6oAHAReotvdjqhxddpe5Holns6EQd1/xEZ7sB1YhQKJtvUrl\\nZNufy1Jf1r0ldEGeA+0ISck7s+xSh9rQD2Op\\n-----END CERTIFICATE-----\\n\"", - "strict_ssl": "true", - "dev": "", - "fetch_retry_factor": "10", - "group": "20", - "cache_lock_stale": "60000", - "version": "", - "cache_min": "", - "cache": "/Users/jfolsom/.npm", - "searchexclude": "", - "color": "true", - "save_optional": "", - "user_agent": "node/v0.8.8", - "cache_lock_wait": "10000", - "production": "", - "save_bundle": "", - "init_version": "0.0.0", - "umask": "18", - "git": "git", - "init_author_name": "", - "onload_script": "", - "tmp": "/Users/jfolsom/tmp", - "unsafe_perm": "", - "link": "", - "prefix": "/usr/local" - } -} diff --git a/node_modules/v8tools/build/gyp-mac-tool b/node_modules/v8tools/build/gyp-mac-tool deleted file mode 100755 index 22f8331..0000000 --- a/node_modules/v8tools/build/gyp-mac-tool +++ /dev/null @@ -1,210 +0,0 @@ -#!/usr/bin/env python -# Generated by gyp. Do not edit. -# Copyright (c) 2012 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Utility functions to perform Xcode-style build steps. - -These functions are executed via gyp-mac-tool when using the Makefile generator. -""" - -import fcntl -import os -import plistlib -import re -import shutil -import string -import subprocess -import sys - - -def main(args): - executor = MacTool() - exit_code = executor.Dispatch(args) - if exit_code is not None: - sys.exit(exit_code) - - -class MacTool(object): - """This class performs all the Mac tooling steps. The methods can either be - executed directly, or dispatched from an argument list.""" - - def Dispatch(self, args): - """Dispatches a string command to a method.""" - if len(args) < 1: - raise Exception("Not enough arguments") - - method = "Exec%s" % self._CommandifyName(args[0]) - return getattr(self, method)(*args[1:]) - - def _CommandifyName(self, name_string): - """Transforms a tool name like copy-info-plist to CopyInfoPlist""" - return name_string.title().replace('-', '') - - def ExecCopyBundleResource(self, source, dest): - """Copies a resource file to the bundle/Resources directory, performing any - necessary compilation on each resource.""" - extension = os.path.splitext(source)[1].lower() - if os.path.isdir(source): - # Copy tree. - if os.path.exists(dest): - shutil.rmtree(dest) - shutil.copytree(source, dest) - elif extension == '.xib': - return self._CopyXIBFile(source, dest) - elif extension == '.strings': - self._CopyStringsFile(source, dest) - else: - shutil.copyfile(source, dest) - - def _CopyXIBFile(self, source, dest): - """Compiles a XIB file with ibtool into a binary plist in the bundle.""" - tools_dir = os.environ.get('DEVELOPER_BIN_DIR', '/usr/bin') - args = [os.path.join(tools_dir, 'ibtool'), '--errors', '--warnings', - '--notices', '--output-format', 'human-readable-text', '--compile', - dest, source] - ibtool_section_re = re.compile(r'/\*.*\*/') - ibtool_re = re.compile(r'.*note:.*is clipping its content') - ibtoolout = subprocess.Popen(args, stdout=subprocess.PIPE) - current_section_header = None - for line in ibtoolout.stdout: - if ibtool_section_re.match(line): - current_section_header = line - elif not ibtool_re.match(line): - if current_section_header: - sys.stdout.write(current_section_header) - current_section_header = None - sys.stdout.write(line) - return ibtoolout.returncode - - def _CopyStringsFile(self, source, dest): - """Copies a .strings file using iconv to reconvert the input into UTF-16.""" - input_code = self._DetectInputEncoding(source) or "UTF-8" - fp = open(dest, 'w') - args = ['/usr/bin/iconv', '--from-code', input_code, '--to-code', - 'UTF-16', source] - subprocess.call(args, stdout=fp) - fp.close() - - def _DetectInputEncoding(self, file_name): - """Reads the first few bytes from file_name and tries to guess the text - encoding. Returns None as a guess if it can't detect it.""" - fp = open(file_name, 'rb') - try: - header = fp.read(3) - except e: - fp.close() - return None - fp.close() - if header.startswith("\xFE\xFF"): - return "UTF-16BE" - elif header.startswith("\xFF\xFE"): - return "UTF-16LE" - elif header.startswith("\xEF\xBB\xBF"): - return "UTF-8" - else: - return None - - def ExecCopyInfoPlist(self, source, dest): - """Copies the |source| Info.plist to the destination directory |dest|.""" - # Read the source Info.plist into memory. - fd = open(source, 'r') - lines = fd.read() - fd.close() - - # Go through all the environment variables and replace them as variables in - # the file. - for key in os.environ: - if key.startswith('_'): - continue - evar = '${%s}' % key - lines = string.replace(lines, evar, os.environ[key]) - - # Write out the file with variables replaced. - fd = open(dest, 'w') - fd.write(lines) - fd.close() - - # Now write out PkgInfo file now that the Info.plist file has been - # "compiled". - self._WritePkgInfo(dest) - - def _WritePkgInfo(self, info_plist): - """This writes the PkgInfo file from the data stored in Info.plist.""" - plist = plistlib.readPlist(info_plist) - if not plist: - return - - # Only create PkgInfo for executable types. - package_type = plist['CFBundlePackageType'] - if package_type != 'APPL': - return - - # The format of PkgInfo is eight characters, representing the bundle type - # and bundle signature, each four characters. If that is missing, four - # '?' characters are used instead. - signature_code = plist.get('CFBundleSignature', '????') - if len(signature_code) != 4: # Wrong length resets everything, too. - signature_code = '?' * 4 - - dest = os.path.join(os.path.dirname(info_plist), 'PkgInfo') - fp = open(dest, 'w') - fp.write('%s%s' % (package_type, signature_code)) - fp.close() - - def ExecFlock(self, lockfile, *cmd_list): - """Emulates the most basic behavior of Linux's flock(1).""" - # Rely on exception handling to report errors. - fd = os.open(lockfile, os.O_RDONLY|os.O_NOCTTY|os.O_CREAT, 0o666) - fcntl.flock(fd, fcntl.LOCK_EX) - return subprocess.call(cmd_list) - - def ExecFilterLibtool(self, *cmd_list): - """Calls libtool and filters out 'libtool: file: foo.o has no symbols'.""" - libtool_re = re.compile(r'^libtool: file: .* has no symbols$') - libtoolout = subprocess.Popen(cmd_list, stderr=subprocess.PIPE) - for line in libtoolout.stderr: - if not libtool_re.match(line): - sys.stderr.write(line) - return libtoolout.returncode - - def ExecPackageFramework(self, framework, version): - """Takes a path to Something.framework and the Current version of that and - sets up all the symlinks.""" - # Find the name of the binary based on the part before the ".framework". - binary = os.path.basename(framework).split('.')[0] - - CURRENT = 'Current' - RESOURCES = 'Resources' - VERSIONS = 'Versions' - - if not os.path.exists(os.path.join(framework, VERSIONS, version, binary)): - # Binary-less frameworks don't seem to contain symlinks (see e.g. - # chromium's out/Debug/org.chromium.Chromium.manifest/ bundle). - return - - # Move into the framework directory to set the symlinks correctly. - pwd = os.getcwd() - os.chdir(framework) - - # Set up the Current version. - self._Relink(version, os.path.join(VERSIONS, CURRENT)) - - # Set up the root symlinks. - self._Relink(os.path.join(VERSIONS, CURRENT, binary), binary) - self._Relink(os.path.join(VERSIONS, CURRENT, RESOURCES), RESOURCES) - - # Back to where we were before! - os.chdir(pwd) - - def _Relink(self, dest, link): - """Creates a symlink to |dest| named |link|. If |link| already exists, - it is overwritten.""" - if os.path.lexists(link): - os.remove(link) - os.symlink(dest, link) - - -if __name__ == '__main__': - sys.exit(main(sys.argv[1:])) diff --git a/node_modules/v8tools/build/v8tools.target.mk b/node_modules/v8tools/build/v8tools.target.mk deleted file mode 100644 index 79ef4e1..0000000 --- a/node_modules/v8tools/build/v8tools.target.mk +++ /dev/null @@ -1,135 +0,0 @@ -# This file is generated by gyp; do not edit. - -TOOLSET := target -TARGET := v8tools -DEFS_Debug := '-D_LARGEFILE_SOURCE' \ - '-D_FILE_OFFSET_BITS=64' \ - '-D_DARWIN_USE_64_BIT_INODE=1' \ - '-DDEBUG' \ - '-D_DEBUG' - -# Flags passed to all source files. -CFLAGS_Debug := -Os \ - -gdwarf-2 \ - -mmacosx-version-min=10.5 \ - -arch x86_64 \ - -Wall \ - -Wendif-labels \ - -W \ - -Wno-unused-parameter - -# Flags passed to only C files. -CFLAGS_C_Debug := -fno-strict-aliasing - -# Flags passed to only C++ files. -CFLAGS_CC_Debug := -fno-rtti \ - -fno-exceptions \ - -fno-threadsafe-statics \ - -fno-strict-aliasing - -# Flags passed to only ObjC files. -CFLAGS_OBJC_Debug := - -# Flags passed to only ObjC++ files. -CFLAGS_OBJCC_Debug := - -INCS_Debug := -I/Users/jfolsom/.node-gyp/0.8.8/src \ - -I/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include \ - -I/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include - -DEFS_Release := '-D_LARGEFILE_SOURCE' \ - '-D_FILE_OFFSET_BITS=64' \ - '-D_DARWIN_USE_64_BIT_INODE=1' - -# Flags passed to all source files. -CFLAGS_Release := -Os \ - -gdwarf-2 \ - -mmacosx-version-min=10.5 \ - -arch x86_64 \ - -Wall \ - -Wendif-labels \ - -W \ - -Wno-unused-parameter - -# Flags passed to only C files. -CFLAGS_C_Release := -fno-strict-aliasing - -# Flags passed to only C++ files. -CFLAGS_CC_Release := -fno-rtti \ - -fno-exceptions \ - -fno-threadsafe-statics \ - -fno-strict-aliasing - -# Flags passed to only ObjC files. -CFLAGS_OBJC_Release := - -# Flags passed to only ObjC++ files. -CFLAGS_OBJCC_Release := - -INCS_Release := -I/Users/jfolsom/.node-gyp/0.8.8/src \ - -I/Users/jfolsom/.node-gyp/0.8.8/deps/uv/include \ - -I/Users/jfolsom/.node-gyp/0.8.8/deps/v8/include - -OBJS := $(obj).target/$(TARGET)/src/v8tools.o \ - $(obj).target/$(TARGET)/src/gc.o \ - $(obj).target/$(TARGET)/src/profiler.o - -# Add to the list of files we specially track dependencies for. -all_deps += $(OBJS) - -# CFLAGS et al overrides must be target-local. -# See "Target-specific Variable Values" in the GNU Make manual. -$(OBJS): TOOLSET := $(TOOLSET) -$(OBJS): GYP_CFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) -$(OBJS): GYP_CXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) -$(OBJS): GYP_OBJCFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) $(CFLAGS_OBJC_$(BUILDTYPE)) -$(OBJS): GYP_OBJCXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) $(CFLAGS_OBJCC_$(BUILDTYPE)) - -# Suffix rules, putting all outputs into $(obj). - -$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) - -# Try building from generated source, too. - -$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) - -$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.cc FORCE_DO_CMD - @$(call do_cmd,cxx,1) - -# End of this set of suffix rules -### Rules for final target. -LDFLAGS_Debug := -Wl,-search_paths_first \ - -mmacosx-version-min=10.5 \ - -arch x86_64 \ - -L$(builddir) \ - -install_name /usr/local/lib/v8tools.node - -LDFLAGS_Release := -Wl,-search_paths_first \ - -mmacosx-version-min=10.5 \ - -arch x86_64 \ - -L$(builddir) \ - -install_name /usr/local/lib/v8tools.node - -LIBS := -undefined dynamic_lookup - -$(builddir)/v8tools.node: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE)) -$(builddir)/v8tools.node: LIBS := $(LIBS) -$(builddir)/v8tools.node: TOOLSET := $(TOOLSET) -$(builddir)/v8tools.node: $(OBJS) FORCE_DO_CMD - $(call do_cmd,solink_module) - -all_deps += $(builddir)/v8tools.node -# Add target alias -.PHONY: v8tools -v8tools: $(builddir)/v8tools.node - -# Short alias for building this executable. -.PHONY: v8tools.node -v8tools.node: $(builddir)/v8tools.node - -# Add executable to "all" target. -.PHONY: all -all: $(builddir)/v8tools.node - diff --git a/node_modules/v8tools/index.js b/node_modules/v8tools/index.js deleted file mode 100644 index cb78915..0000000 --- a/node_modules/v8tools/index.js +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2012 Dmitri Melikyan - * - * 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. - */ - -module.exports = require('bindings')('v8tools.node') diff --git a/node_modules/v8tools/node_modules/bindings/README.md b/node_modules/v8tools/node_modules/bindings/README.md deleted file mode 100644 index 585cf51..0000000 --- a/node_modules/v8tools/node_modules/bindings/README.md +++ /dev/null @@ -1,97 +0,0 @@ -node-bindings -============= -### Helper module for loading your native module's .node file - -This is a helper module for authors of Node.js native addon modules. -It is basically the "swiss army knife" of `require()`ing your native module's -`.node` file. - -Throughout the course of Node's native addon history, addons have ended up being -compiled in a variety of different places, depending on which build tool and which -version of node was used. To make matters worse, now the _gyp_ build tool can -produce either a _Release_ or _Debug_ build, each being built into different -locations. - -This module checks _all_ the possible locations that a native addon would be built -at, and returns the first one that loads successfully. - - -Installation ------------- - -Install with `npm`: - -``` bash -$ npm install bindings -``` - -Or add it to the `"dependencies"` section of your _package.json_ file. - - -Example -------- - -`require()`ing the proper bindings file for the current node version, platform -and architecture is as simple as: - -``` js -var bindings = require('bindings')('binding.node') - -// Use your bindings defined in your C files -bindings.your_c_function() -``` - - -Nice Error Output ------------------ - -When the `.node` file could not be loaded, `node-bindings` throws an Error with -a nice error message telling you exactly what was tried. You can also check the -`err.tries` Array property. - -``` -Error: Could not load the bindings file. Tried: - → /Users/nrajlich/ref/build/binding.node - → /Users/nrajlich/ref/build/Debug/binding.node - → /Users/nrajlich/ref/build/Release/binding.node - → /Users/nrajlich/ref/out/Debug/binding.node - → /Users/nrajlich/ref/Debug/binding.node - → /Users/nrajlich/ref/out/Release/binding.node - → /Users/nrajlich/ref/Release/binding.node - → /Users/nrajlich/ref/build/default/binding.node - → /Users/nrajlich/ref/compiled/0.8.2/darwin/x64/binding.node - at bindings (/Users/nrajlich/ref/node_modules/bindings/bindings.js:84:13) - at Object. (/Users/nrajlich/ref/lib/ref.js:5:47) - at Module._compile (module.js:449:26) - at Object.Module._extensions..js (module.js:467:10) - at Module.load (module.js:356:32) - at Function.Module._load (module.js:312:12) - ... -``` - - -License -------- - -(The MIT License) - -Copyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net> - -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. diff --git a/node_modules/v8tools/node_modules/bindings/bindings.js b/node_modules/v8tools/node_modules/bindings/bindings.js deleted file mode 100644 index 2f04804..0000000 --- a/node_modules/v8tools/node_modules/bindings/bindings.js +++ /dev/null @@ -1,155 +0,0 @@ - -/** - * Module dependencies. - */ - -var fs = require('fs') - , path = require('path') - , join = path.join - , dirname = path.dirname - , exists = fs.existsSync || path.existsSync - , defaults = { - arrow: process.env.NODE_BINDINGS_ARROW || ' → ' - , compiled: process.env.NODE_BINDINGS_COMPILED_DIR || 'compiled' - , platform: process.platform - , arch: process.arch - , version: process.versions.node - , bindings: 'bindings.node' - , try: [ - // node-gyp's linked version in the "build" dir - [ 'module_root', 'build', 'bindings' ] - // node-waf and gyp_addon (a.k.a node-gyp) - , [ 'module_root', 'build', 'Debug', 'bindings' ] - , [ 'module_root', 'build', 'Release', 'bindings' ] - // Debug files, for development (legacy behavior, remove for node v0.9) - , [ 'module_root', 'out', 'Debug', 'bindings' ] - , [ 'module_root', 'Debug', 'bindings' ] - // Release files, but manually compiled (legacy behavior, remove for node v0.9) - , [ 'module_root', 'out', 'Release', 'bindings' ] - , [ 'module_root', 'Release', 'bindings' ] - // Legacy from node-waf, node <= 0.4.x - , [ 'module_root', 'build', 'default', 'bindings' ] - // Production "Release" buildtype binary (meh...) - , [ 'module_root', 'compiled', 'version', 'platform', 'arch', 'bindings' ] - ] - } - -/** - * The main `bindings()` function loads the compiled bindings for a given module. - * It uses V8's Error API to determine the parent filename that this function is - * being invoked from, which is then used to find the root directory. - */ - -function bindings (opts) { - - // Argument surgery - if (typeof opts == 'string') { - opts = { bindings: opts } - } else if (!opts) { - opts = {} - } - opts.__proto__ = defaults - - // Get the module root - if (!opts.module_root) { - opts.module_root = exports.getRoot(exports.getFileName()) - } - - // Ensure the given bindings name ends with .node - if (path.extname(opts.bindings) != '.node') { - opts.bindings += '.node' - } - - var tries = [] - , i = 0 - , l = opts.try.length - , n - , b - , err - - for (; i (/Users/nrajlich/ref/lib/ref.js:5:47)\n at Module._compile (module.js:449:26)\n at Object.Module._extensions..js (module.js:467:10)\n at Module.load (module.js:356:32)\n at Function.Module._load (module.js:312:12)\n ...\n```\n\n\nLicense\n-------\n\n(The MIT License)\n\nCopyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", - "_id": "bindings@1.1.0", - "_from": "bindings@*" -} diff --git a/node_modules/v8tools/package.json b/node_modules/v8tools/package.json deleted file mode 100644 index ab1637c..0000000 --- a/node_modules/v8tools/package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "v8tools", - "version": "0.2.1", - "description": "V8 profiler and GC bindings", - "author": { - "name": "Nodetime", - "email": "devops@nodetime.com" - }, - "keywords": [ - "V8 tools", - "V8 profiler", - "profiler", - "CPU profiler", - "heap profiler", - "garbage collection", - "posix", - "windows" - ], - "contributors": [], - "main": "./index.js", - "dependencies": { - "bindings": "*" - }, - "repository": { - "type": "git", - "url": "git://github.com/nodetime/node-v8tools.git" - }, - "engines": { - "node": ">=0.6.0" - }, - "licenses": [ - { - "type": "MIT", - "url": "http://github.com/dmelikyan/node-v8tools/raw/master/LICENSE" - } - ], - "scripts": { - "install": "node-gyp rebuild" - }, - "gypfile": true, - "readme": "V8tools - V8 CPU Profiler Binding\n===\n\n\n## Installation\n\n npm install v8tools\n\n\n## API\n\n`var v8tools = require('v8tools');`\n\n`v8tools.afterGC(v8tools.afterGC(function(gcType, gcFlags, usedHeapSize) {})` - calls the callback after garbage collection cycle.\n\n`v8tools.startV8Profiler()` - starts V8 CPU profiler\n\n`v8tools.stopV8Profiler(function(parentNodeUid, nodeUid, totalSamplesCount, functionName, scriptResourceName, lineNumber) {})` - stops V8 CPU profiler. Callback function is called on every node while walking profile's top down call tree.\n\n`heapprof.takeHeapSnapshot(function(parentNodeUid, nodeUid, name, type, selfSize, retainerName, retainerType) {})` - takes heap snapshot. Callback function is called on every node of heap node graph.\n\n\n\n## Platforms\n\nPOSIX and Windows\n\n\n## License\n\nCopyright (c) 2012 Dmitri Melikyan\n\nPermission 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:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE 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.\n", - "_id": "v8tools@0.2.1", - "_from": "v8tools@0.2.1" -} diff --git a/node_modules/v8tools/src/gc.cc b/node_modules/v8tools/src/gc.cc deleted file mode 100644 index 2ddea7c..0000000 --- a/node_modules/v8tools/src/gc.cc +++ /dev/null @@ -1,102 +0,0 @@ - - -#include "gc.h" - -using namespace v8; - - -Persistent callback; -Persistent callback_context; - - -struct Baton { - uv_work_t request; - GCType gc_type; - GCCallbackFlags gc_callback_flags; - size_t used_heap_size; -}; - - -static void Noop(uv_work_t* request) { -} - - -static void GCEpilogueAsync(uv_work_t* request) { - Baton *baton = static_cast(request->data); - - Handle argv[3]; - - switch(baton->gc_type) { - case kGCTypeAll: - argv[0] = String::New("kGCTypeAll"); - break; - case kGCTypeMarkSweepCompact: - argv[0] = String::New("kGCTypeMarkSweepCompact"); - break; - case kGCTypeScavenge: - argv[0] = String::New("kGCTypeScavenge"); - break; - default: - argv[0] = String::New("Other"); - } - - switch(baton->gc_callback_flags) { - case kGCCallbackFlagCompacted: - argv[1] = String::New("kGCCallbackFlagCompacted"); - break; - case kNoGCCallbackFlags: - argv[1] = String::New("kNoGCCallbackFlags"); - break; - default: - argv[1] = String::New("Other"); - } - - argv[2] = Integer::New(baton->used_heap_size); - - callback->Call(callback_context, 3, argv); - - delete baton; -} - - -static size_t GetUsedHeapSize() { - HeapStatistics stats; - V8::GetHeapStatistics(&stats); - - return stats.used_heap_size(); -} - - -static void GCEpilogue(GCType gc_type, GCCallbackFlags gc_callback_flags) { - Baton *baton = new Baton(); - baton->request.data = baton; - - baton->gc_type = gc_type; - baton->gc_callback_flags = gc_callback_flags; - - baton->used_heap_size = GetUsedHeapSize(); - - uv_queue_work(uv_default_loop(), &baton->request, Noop, GCEpilogueAsync); -} - - -Handle AfterGC(const Arguments& args) { - HandleScope scope; - - - if(args.Length() > 0 && args[0]->IsFunction()) { - Local callbackArg = Local::Cast(args[0]); - callback = Persistent::New(callbackArg); - callback_context = Persistent::New(Context::GetCalling()->Global()); - } - else { - return scope.Close(Undefined()); - } - - - V8::AddGCEpilogueCallback(GCEpilogue); - - return scope.Close(Undefined()); -} - - diff --git a/node_modules/v8tools/src/gc.h b/node_modules/v8tools/src/gc.h deleted file mode 100644 index f7a410d..0000000 --- a/node_modules/v8tools/src/gc.h +++ /dev/null @@ -1,13 +0,0 @@ - - -#ifndef GC_H_ -#define GC_H_ - -#include -#include - -using namespace v8; - -Handle AfterGC(const Arguments& args); - -#endif diff --git a/node_modules/v8tools/src/profiler.cc b/node_modules/v8tools/src/profiler.cc deleted file mode 100644 index f4c4a57..0000000 --- a/node_modules/v8tools/src/profiler.cc +++ /dev/null @@ -1,124 +0,0 @@ - - -#include -#include "profiler.h" - -using namespace v8; - - -static void WalkCpuProfile(int* next_uid, - const int parent_uid, - const CpuProfileNode* node, - Local callback) { - if(!node) return; - - int uid = (*next_uid)++; - - Handle argv[6]; - argv[0] = Integer::New(parent_uid); - argv[1] = Integer::New(uid); - argv[2] = Number::New(node->GetTotalSamplesCount()); - argv[3] = node->GetFunctionName(); - argv[4] = node->GetScriptResourceName(); - argv[5] = Integer::New(node->GetLineNumber()); - - callback->Call(Context::GetCurrent()->Global(), 6, argv); - - int32_t children_count = node->GetChildrenCount(); - for(int i = 0; i < children_count; i++) { - const CpuProfileNode* child_node = node->GetChild(i); - WalkCpuProfile(next_uid, uid, child_node, callback); - } -} - - -Handle StartV8Profiler(const Arguments& args) { - HandleScope scope; - - CpuProfiler::StartProfiling(String::New("v8tools-cpu-profile")); - - return scope.Close(Undefined()); -} - - -Handle StopV8Profiler(const Arguments& args) { - HandleScope scope; - - const CpuProfile* profile = CpuProfiler::StopProfiling(String::New("v8tools-cpu-profile")); - - if(args.Length() > 0 && args[0]->IsFunction()) { - Local callback = Local::Cast(args[0]); - int next_uid = 1; - WalkCpuProfile(&next_uid, 0, profile->GetTopDownRoot(), callback); - } - - const_cast(profile)->Delete(); - - return scope.Close(Undefined()); -} - - - -/* - -node type: - 0 - hidden - 1 - array - 2 - string - 3 - object - 4 - compiled code - 5 - function clojure - 6 - regexp - 7 - heap number - 8 - native object - -edge type: - 0 - context variable - 1 - array element - 2 - property - 3 - internal - 4 - internal (size calculation) - 5 - internal (size calculation) - -*/ - -static void IterateHeapSnapshot(const HeapSnapshot* snapshot, Local callback) { - int32_t nodes_count = snapshot->GetNodesCount(); - for(int i = 0; i < nodes_count; i++) { - const HeapGraphNode* node = snapshot->GetNode(i); - - int32_t children_count = node->GetChildrenCount(); - for(int j = 0; j < children_count; j++) { - const HeapGraphEdge* child_edge = node->GetChild(j); - const HeapGraphNode* child_node = child_edge->GetToNode(); - - Handle argv[7]; - argv[0] = Integer::New(node->GetId()); - argv[1] = Integer::New(child_node->GetId()); - argv[2] = child_node->GetName(); - argv[3] = Integer::New(child_node->GetType()); - argv[4] = Integer::New(child_node->GetSelfSize()); - argv[5] = child_edge->GetName(); - argv[6] = Integer::New(child_edge->GetType()); - - callback->Call(Context::GetCurrent()->Global(), 7, argv); - } - } -} - - -Handle TakeHeapSnapshot(const Arguments& args) { - HandleScope scope; - - const HeapSnapshot* snapshot = HeapProfiler::TakeSnapshot(String::New("v8tools-heap-snapshot")); - if(args.Length() > 0 && args[0]->IsFunction()) { - Local callback = Local::Cast(args[0]); - IterateHeapSnapshot(snapshot, callback); - } - - const_cast(snapshot)->Delete(); - - return scope.Close(Undefined()); -} - - diff --git a/node_modules/v8tools/src/profiler.h b/node_modules/v8tools/src/profiler.h deleted file mode 100644 index 5bf655c..0000000 --- a/node_modules/v8tools/src/profiler.h +++ /dev/null @@ -1,13 +0,0 @@ - -#ifndef PROFILER_H_ -#define PROFILER_H_ - -#include - -using namespace v8; - -Handle StartV8Profiler(const Arguments& args); -Handle StopV8Profiler(const Arguments& args); -Handle TakeHeapSnapshot(const Arguments& args); - -#endif diff --git a/node_modules/v8tools/src/v8tools.cc b/node_modules/v8tools/src/v8tools.cc deleted file mode 100644 index b0d6774..0000000 --- a/node_modules/v8tools/src/v8tools.cc +++ /dev/null @@ -1,21 +0,0 @@ - - -#include -#include -#include -#include "gc.h" -#include "profiler.h" - -using namespace v8; - - -void Init(Handle target) { - target->Set(String::NewSymbol("afterGC"), FunctionTemplate::New(AfterGC)->GetFunction()); - target->Set(String::NewSymbol("startV8Profiler"), FunctionTemplate::New(StartV8Profiler)->GetFunction()); - target->Set(String::NewSymbol("stopV8Profiler"), FunctionTemplate::New(StopV8Profiler)->GetFunction()); - target->Set(String::NewSymbol("takeHeapSnapshot"), FunctionTemplate::New(TakeHeapSnapshot)->GetFunction()); -} - - -NODE_MODULE(v8tools, Init); - diff --git a/node_modules/v8tools/v8tools.cc b/node_modules/v8tools/v8tools.cc deleted file mode 100644 index fba27f4..0000000 --- a/node_modules/v8tools/v8tools.cc +++ /dev/null @@ -1,246 +0,0 @@ - - -/* - * This file is depricated. Kept for old npm versions defaulting to node-waf - */ - -#include -#include -#include -#include -#include -#include -#include - -using namespace v8; - - -/* CPU profiler */ - -void Walk(int* next_uid, const int parent_uid, const CpuProfileNode* node, Local callback) { - if(!node) return; - - int uid = (*next_uid)++; - - Handle argv[6]; - argv[0] = Integer::New(parent_uid); - argv[1] = Integer::New(uid); - argv[2] = Number::New(node->GetTotalSamplesCount()); - argv[3] = node->GetFunctionName(); - argv[4] = node->GetScriptResourceName(); - argv[5] = Integer::New(node->GetLineNumber()); - - callback->Call(Context::GetCurrent()->Global(), 6, argv); - - int32_t childrenCount = node->GetChildrenCount(); - for(int i = 0; i < childrenCount; i++) { - const CpuProfileNode* childNode = node->GetChild(i); - Walk(next_uid, uid, childNode, callback); - } -} - - -Handle StartV8Profiler(const Arguments& args) { - HandleScope scope; - - CpuProfiler::StartProfiling(String::New("v8tools-cpu-profile")); - - return scope.Close(Undefined()); -} - - -Handle StopV8Profiler(const Arguments& args) { - HandleScope scope; - - const CpuProfile* profile = CpuProfiler::StopProfiling(String::New("v8tools-cpu-profile")); - - if(args.Length() > 0 && args[0]->IsFunction()) { - Local callback = Local::Cast(args[0]); - int nextUid = 1; - Walk(&nextUid, 0, profile->GetTopDownRoot(), callback); - } - - const_cast(profile)->Delete(); - - return scope.Close(Undefined()); -} - - - -/* Heap profiler */ - - -/* - -node type: - 0 - hidden - 1 - array - 2 - string - 3 - object - 4 - compiled code - 5 - function clojure - 6 - regexp - 7 - heap number - 8 - native object - -edge type: - 0 - context variable - 1 - array element - 2 - property - 3 - internal - 4 - internal (size calculation) - 5 - internal (size calculation) -*/ - - -static void IterateHeapSnapshot(const HeapSnapshot* snapshot, Local callback) { - int32_t nodes_count = snapshot->GetNodesCount(); - for(int i = 0; i < nodes_count; i++) { - const HeapGraphNode* node = snapshot->GetNode(i); - - int32_t children_count = node->GetChildrenCount(); - for(int j = 0; j < children_count; j++) { - const HeapGraphEdge* child_edge = node->GetChild(j); - const HeapGraphNode* child_node = child_edge->GetToNode(); - - Handle argv[7]; - argv[0] = Integer::New(node->GetId()); - argv[1] = Integer::New(child_node->GetId()); - argv[2] = child_node->GetName(); - argv[3] = Integer::New(child_node->GetType()); - argv[4] = Integer::New(child_node->GetSelfSize()); - argv[5] = child_edge->GetName(); - argv[6] = Integer::New(child_edge->GetType()); - - callback->Call(Context::GetCurrent()->Global(), 7, argv); - } - } -} - - - -Handle TakeHeapSnapshot(const Arguments& args) { - HandleScope scope; - - const HeapSnapshot* snapshot = HeapProfiler::TakeSnapshot(String::New("v8tools-heap-snapshot")); - if(args.Length() > 0 && args[0]->IsFunction()) { - Local callback = Local::Cast(args[0]); - IterateHeapSnapshot(snapshot, callback); - } - - const_cast(snapshot)->Delete(); - - return scope.Close(Undefined()); -} - - - -/* GC listener */ - - -Persistent callback; -Persistent callback_context; - - -struct Baton { - uv_work_t request; - GCType gc_type; - GCCallbackFlags gc_callback_flags; - size_t used_heap_size; -}; - - -static void Noop(uv_work_t* request) { -} - - -static void GCEpilogueAsync(uv_work_t* request) { - Baton *baton = static_cast(request->data); - - Handle argv[3]; - - switch(baton->gc_type) { - case kGCTypeAll: - argv[0] = String::New("kGCTypeAll"); - break; - case kGCTypeMarkSweepCompact: - argv[0] = String::New("kGCTypeMarkSweepCompact"); - break; - case kGCTypeScavenge: - argv[0] = String::New("kGCTypeScavenge"); - break; - default: - argv[0] = String::New("Other"); - } - - switch(baton->gc_callback_flags) { - case kGCCallbackFlagCompacted: - argv[1] = String::New("kGCCallbackFlagCompacted"); - break; - case kNoGCCallbackFlags: - argv[1] = String::New("kNoGCCallbackFlags"); - break; - default: - argv[1] = String::New("Other"); - } - - argv[2] = Integer::New(baton->used_heap_size); - - callback->Call(callback_context, 3, argv); - - delete baton; -} - - -static size_t GetUsedHeapSize() { - HeapStatistics stats; - V8::GetHeapStatistics(&stats); - - return stats.used_heap_size(); -} - - -static void GCEpilogue(GCType gc_type, GCCallbackFlags gc_callback_flags) { - Baton *baton = new Baton(); - baton->request.data = baton; - - baton->gc_type = gc_type; - baton->gc_callback_flags = gc_callback_flags; - - baton->used_heap_size = GetUsedHeapSize(); - - uv_queue_work(uv_default_loop(), &baton->request, Noop, GCEpilogueAsync); -} - - -Handle AfterGC(const Arguments& args) { - HandleScope scope; - - - if(args.Length() > 0 && args[0]->IsFunction()) { - Local callbackArg = Local::Cast(args[0]); - callback = Persistent::New(callbackArg); - callback_context = Persistent::New(Context::GetCalling()->Global()); - } - else { - return scope.Close(Undefined()); - } - - - V8::AddGCEpilogueCallback(GCEpilogue); - - return scope.Close(Undefined()); -} - - - -void Init(Handle target) { - target->Set(String::NewSymbol("afterGC"), FunctionTemplate::New(AfterGC)->GetFunction()); - target->Set(String::NewSymbol("startV8Profiler"), FunctionTemplate::New(StartV8Profiler)->GetFunction()); - target->Set(String::NewSymbol("stopV8Profiler"), FunctionTemplate::New(StopV8Profiler)->GetFunction()); - target->Set(String::NewSymbol("takeHeapSnapshot"), FunctionTemplate::New(TakeHeapSnapshot)->GetFunction()); -} - - -NODE_MODULE(v8tools, Init); - diff --git a/node_modules/v8tools/wscript b/node_modules/v8tools/wscript deleted file mode 100644 index 8648d79..0000000 --- a/node_modules/v8tools/wscript +++ /dev/null @@ -1,16 +0,0 @@ -srcdir = '.' -blddir = 'build' -VERSION = '0.1' - -def set_options(opt): - opt.tool_options('compiler_cxx') - -def configure(conf): - conf.check_tool('compiler_cxx') - conf.check_tool('node_addon') - -def build(bld): - obj = bld.new_task_gen('cxx', 'shlib', 'node_addon') - obj.target = 'v8tools' - obj.source = 'v8tools.cc'; - From 5233c8ba7fd39c4e47994ae9f33af78f4e2407f9 Mon Sep 17 00:00:00 2001 From: Jamie Folsom Date: Mon, 26 Aug 2013 23:00:45 -0400 Subject: [PATCH 15/18] Add support for dashboard context. --- package.json | 1 + web.js | 44 ++++++++++++++++++++++++++++++++++++++------ 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 35dd761..cf2c770 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "express": "3.1.0", "less-middleware": "0.1.6", "mongoose": "3.5.7", + "underscore": "1.4.4", "timekit": "0.1.9", "nodetime": "0.8.10", "v8tools": "0.2.1" diff --git a/web.js b/web.js index 1811d01..763ac47 100644 --- a/web.js +++ b/web.js @@ -3,10 +3,12 @@ var application_root = __dirname, secret = process.env.SECRET, port = process.env.PORT, live_db = process.env.LIVE_DB, + dev_db = process.env.DEV_DB, consumer = process.env.CONSUMER, version = process.env.VERSION, path = require("path"), mongoose = require('mongoose'), + underscore = require('underscore'), lessMiddleware = require('less-middleware'), jwt = require('jwt-simple'), express = require("express"), @@ -40,6 +42,17 @@ var Ranges = new Schema({ endOffset: { type: Number, required: false } }); +// Annotation Ranges +var Shapes = new Schema({ + type: String, + geometry: { + height: String, + width: String, + x: String, + y: String + } +}); + // Annotation Model var Annotation = new Schema({ id: { type: String, required: false }, @@ -50,6 +63,8 @@ var Annotation = new Schema({ username: { type: String, required: false }, text: { type: String, required: false }, quote: { type: String, required: false }, + shapes: [Shapes], + url: { type: String, required: false }, uri: { type: String, required: false }, uuid: { type: String, required: false }, groups: [String], @@ -67,7 +82,7 @@ var Annotation = new Schema({ var AnnotationModel = mongoose.model('Annotation', Annotation); // DB -mongoose.connect(live_db); +mongoose.connect(dev_db); // config app.configure(function () { @@ -96,17 +111,30 @@ app.get('/api', function (req, res) { // Search annotations app.get('/api/search', tokenOK, function (req, res) { - var query = AnnotationModel.find({'uri': req.query.uri }); + var query; + + console.log("req.query.context: " + req.query.context); + + switch (req.query.context) { + case 'document': + query = AnnotationModel.find({'uri': req.query.uri }); + break; + case 'dashboard': + query = AnnotationModel.find({'user': req.query.user }); + break; + } switch (req.query.mode) { case 'user': query.where('user').equals(req.query.user); break; case 'group': - query.where('subgroups').in(req.query.subgroups).$where('this.permissions.read.length < 1'); + query.where('subgroups').in(req.query.subgroups); + // query.$where('this.permissions.read.length < 1'); break; case 'class': - query.where('groups').in(req.query.groups).$where('this.permissions.read.length < 1'); + query.where('groups').in(req.query.groups); + // query.$where('this.permissions.read.length < 1'); break; case 'admin': break; @@ -114,7 +142,7 @@ app.get('/api/search', tokenOK, function (req, res) { //console.log("this: " + this.); - if (req.query.sidebar) { + if (req.query.sidebar || req.query.context == "dashboard") { query.exec(function (err, annotations) { if (!err) { return res.send(annotations); @@ -174,6 +202,8 @@ app.post('/api/annotations', tokenOK, function (req, res) { text: req.body.text, uri: req.body.uri, quote: req.body.quote, + shapes: req.body.shapes, + uri: req.body.url, tags: req.body.tags, groups: req.body.groups, subgroups: req.body.subgroups, @@ -207,6 +237,8 @@ app.put('/api/annotations/:id', tokenOK, function (req, res) { annotation.updated = Date.now(); annotation.text = req.body.text; annotation.uri = req.body.uri; + annotation.url = req.body.url; + annotation.shapes = req.body.shapes; annotation.quote = req.body.quote; annotation.tags = req.body.tags; annotation.groups = req.body.groups; @@ -232,7 +264,7 @@ app.delete('/api/annotations/:id', tokenOK, function (req, res) { return annotation.remove(function (err) { if (!err) { console.log("removed"); - return res.send(''); + return res.send(204, 'Successfully deleted annotation.'); } else { console.log(err); } From 66e59e1f07d4506ab99fa4ffb21159e0eee8ec38 Mon Sep 17 00:00:00 2001 From: Jamie Folsom Date: Tue, 27 Aug 2013 15:02:10 -0400 Subject: [PATCH 16/18] Update NPM modules, Fix db var. --- package.json | 14 +++++++------- web.js | 3 ++- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index cf2c770..beb8339 100644 --- a/package.json +++ b/package.json @@ -3,16 +3,16 @@ "version": "0.1.4", "dependencies": { "jwt-simple": "0.1.0", - "express": "3.1.0", - "less-middleware": "0.1.6", - "mongoose": "3.5.7", - "underscore": "1.4.4", + "express": "3.3.5", + "less-middleware": "0.1.12", + "mongoose": "3.6.18", + "underscore": "1.5.1", "timekit": "0.1.9", "nodetime": "0.8.10", - "v8tools": "0.2.1" + "v8tools": "0.2.2" }, "engines": { - "node": "0.8.19", - "npm": "1.2.10" + "node": "0.10.15", + "npm": "1.3.5" } } diff --git a/web.js b/web.js index 763ac47..77bea6f 100644 --- a/web.js +++ b/web.js @@ -4,6 +4,7 @@ var application_root = __dirname, port = process.env.PORT, live_db = process.env.LIVE_DB, dev_db = process.env.DEV_DB, + db = process.env.DB, consumer = process.env.CONSUMER, version = process.env.VERSION, path = require("path"), @@ -82,7 +83,7 @@ var Annotation = new Schema({ var AnnotationModel = mongoose.model('Annotation', Annotation); // DB -mongoose.connect(dev_db); +mongoose.connect(db); // config app.configure(function () { From b4b874f7087b7cd844080f19baa27db8a4a83ece Mon Sep 17 00:00:00 2001 From: Jamie Folsom Date: Tue, 27 Aug 2013 16:29:04 -0400 Subject: [PATCH 17/18] Filter user annotations by host, to show only those created on this instance of the app. --- web.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/web.js b/web.js index 77bea6f..591f8b6 100644 --- a/web.js +++ b/web.js @@ -113,15 +113,15 @@ app.get('/api', function (req, res) { // Search annotations app.get('/api/search', tokenOK, function (req, res) { var query; - - console.log("req.query.context: " + req.query.context); + var re = new RegExp(req.query.host, 'i'); switch (req.query.context) { case 'document': query = AnnotationModel.find({'uri': req.query.uri }); break; case 'dashboard': - query = AnnotationModel.find({'user': req.query.user }); + query = AnnotationModel.find({'user': req.query.user}); + query.where('uri').regex(re); break; } @@ -140,7 +140,7 @@ app.get('/api/search', tokenOK, function (req, res) { case 'admin': break; } - + //console.log("this: " + this.); if (req.query.sidebar || req.query.context == "dashboard") { From 9c954eb51e543b8b19c624be6bf3ae090f7aa859 Mon Sep 17 00:00:00 2001 From: Jamie Folsom Date: Wed, 4 Sep 2013 17:23:20 -0400 Subject: [PATCH 18/18] Support for annotation page search. --- web.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/web.js b/web.js index 591f8b6..a1fcf29 100644 --- a/web.js +++ b/web.js @@ -120,9 +120,13 @@ app.get('/api/search', tokenOK, function (req, res) { query = AnnotationModel.find({'uri': req.query.uri }); break; case 'dashboard': - query = AnnotationModel.find({'user': req.query.user}); + query = AnnotationModel.find({'user': req.query.user}); query.where('uri').regex(re); - break; + break; + case 'search': // only limit to current host, allow searching on any user, document, etc. + query = AnnotationModel.find(); + query.where('uri').regex(re); + break; } switch (req.query.mode) { @@ -143,7 +147,7 @@ app.get('/api/search', tokenOK, function (req, res) { //console.log("this: " + this.); - if (req.query.sidebar || req.query.context == "dashboard") { + if (req.query.sidebar || req.query.context == "dashboard" || req.query.context == "search" ) { query.exec(function (err, annotations) { if (!err) { return res.send(annotations);

      ' + statusCodes[status] + '. Redirecting to ' + u + '